@mieweb/ui 0.7.1 → 0.7.2-dev.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (464) hide show
  1. package/dist/CsvBlock-OTFG3PYZ.cjs +15 -0
  2. package/dist/{CsvBlock-2A5VEDD3.cjs.map → CsvBlock-OTFG3PYZ.cjs.map} +1 -1
  3. package/dist/CsvBlock-PUSTBQ5B.js +6 -0
  4. package/dist/{CsvBlock-D6PWAJ5X.js.map → CsvBlock-PUSTBQ5B.js.map} +1 -1
  5. package/dist/HtmlPreviewBlock-QHLSIMWJ.cjs +15 -0
  6. package/dist/{HtmlPreviewBlock-SYXCV5RH.cjs.map → HtmlPreviewBlock-QHLSIMWJ.cjs.map} +1 -1
  7. package/dist/HtmlPreviewBlock-YF2YVKKX.js +6 -0
  8. package/dist/{HtmlPreviewBlock-PEHTJ6C3.js.map → HtmlPreviewBlock-YF2YVKKX.js.map} +1 -1
  9. package/dist/MermaidBlock-H3TWNC4D.js +6 -0
  10. package/dist/{MermaidBlock-7NK3AVK2.js.map → MermaidBlock-H3TWNC4D.js.map} +1 -1
  11. package/dist/MermaidBlock-ZLLBO3VY.cjs +15 -0
  12. package/dist/{MermaidBlock-AFXNP5NK.cjs.map → MermaidBlock-ZLLBO3VY.cjs.map} +1 -1
  13. package/dist/SurveyBlock-JLHS3YQD.js +6 -0
  14. package/dist/{SurveyBlock-NNDGXGG4.js.map → SurveyBlock-JLHS3YQD.js.map} +1 -1
  15. package/dist/SurveyBlock-M2ZRTGVJ.cjs +15 -0
  16. package/dist/{SurveyBlock-6KRNKFH5.cjs.map → SurveyBlock-M2ZRTGVJ.cjs.map} +1 -1
  17. package/dist/ag-grid.cjs +13 -13
  18. package/dist/ag-grid.js +2 -2
  19. package/dist/brands/index.cjs +7 -7
  20. package/dist/brands/index.js +2 -2
  21. package/dist/{chunk-4DMZAVB2.js → chunk-23AYDOCH.js} +3 -3
  22. package/dist/{chunk-4DMZAVB2.js.map → chunk-23AYDOCH.js.map} +1 -1
  23. package/dist/{chunk-MAMY5HTT.cjs → chunk-26DPQUSB.cjs} +22 -22
  24. package/dist/{chunk-MAMY5HTT.cjs.map → chunk-26DPQUSB.cjs.map} +1 -1
  25. package/dist/{chunk-TRZXK57D.js → chunk-2DW4PUJD.js} +3 -3
  26. package/dist/{chunk-TRZXK57D.js.map → chunk-2DW4PUJD.js.map} +1 -1
  27. package/dist/{chunk-OX2RIVN7.js → chunk-3D4ITDLO.js} +4 -4
  28. package/dist/{chunk-OX2RIVN7.js.map → chunk-3D4ITDLO.js.map} +1 -1
  29. package/dist/{chunk-PJAQDAMZ.cjs → chunk-3IAA3KCE.cjs} +15 -6
  30. package/dist/chunk-3IAA3KCE.cjs.map +1 -0
  31. package/dist/chunk-3PXOIAF6.js +3 -0
  32. package/dist/{chunk-DHKYGVP7.js.map → chunk-3PXOIAF6.js.map} +1 -1
  33. package/dist/{chunk-Q2EWNXIB.cjs → chunk-3SZQRMHM.cjs} +9 -9
  34. package/dist/{chunk-Q2EWNXIB.cjs.map → chunk-3SZQRMHM.cjs.map} +1 -1
  35. package/dist/{chunk-JLBT76WH.js → chunk-3YSIZ2CK.js} +14 -5
  36. package/dist/chunk-3YSIZ2CK.js.map +1 -0
  37. package/dist/{chunk-NIEIRA5A.cjs → chunk-4AE2L6AO.cjs} +13 -13
  38. package/dist/{chunk-NIEIRA5A.cjs.map → chunk-4AE2L6AO.cjs.map} +1 -1
  39. package/dist/{chunk-KBEKQMVY.cjs → chunk-4CUFXCC5.cjs} +5 -5
  40. package/dist/{chunk-KBEKQMVY.cjs.map → chunk-4CUFXCC5.cjs.map} +1 -1
  41. package/dist/{chunk-PFWHWIXS.cjs → chunk-54OW6ZPL.cjs} +124 -3
  42. package/dist/chunk-54OW6ZPL.cjs.map +1 -0
  43. package/dist/{chunk-XP6HELVG.cjs → chunk-5IDYOJHO.cjs} +13 -13
  44. package/dist/{chunk-XP6HELVG.cjs.map → chunk-5IDYOJHO.cjs.map} +1 -1
  45. package/dist/{chunk-7WMSUXOQ.js → chunk-5J5PEUUA.js} +4 -4
  46. package/dist/{chunk-7WMSUXOQ.js.map → chunk-5J5PEUUA.js.map} +1 -1
  47. package/dist/{chunk-3CJBUAJ4.js → chunk-5U6GETAW.js} +3 -3
  48. package/dist/{chunk-3CJBUAJ4.js.map → chunk-5U6GETAW.js.map} +1 -1
  49. package/dist/{chunk-HEH3QXOQ.js → chunk-5Y5FSR4N.js} +3 -3
  50. package/dist/{chunk-HEH3QXOQ.js.map → chunk-5Y5FSR4N.js.map} +1 -1
  51. package/dist/{chunk-MSRU3XBH.cjs → chunk-6ECKH4DJ.cjs} +7 -7
  52. package/dist/{chunk-MSRU3XBH.cjs.map → chunk-6ECKH4DJ.cjs.map} +1 -1
  53. package/dist/{chunk-MV3MTHWQ.js → chunk-6EWJGRC3.js} +3 -3
  54. package/dist/{chunk-MV3MTHWQ.js.map → chunk-6EWJGRC3.js.map} +1 -1
  55. package/dist/{chunk-AES2BKEW.cjs → chunk-6J7UGYT5.cjs} +10 -10
  56. package/dist/{chunk-AES2BKEW.cjs.map → chunk-6J7UGYT5.cjs.map} +1 -1
  57. package/dist/{chunk-6LFG4JFF.js → chunk-AFGADE3B.js} +3 -3
  58. package/dist/{chunk-6LFG4JFF.js.map → chunk-AFGADE3B.js.map} +1 -1
  59. package/dist/{chunk-UOOH356R.cjs → chunk-AIJAFPGJ.cjs} +5 -5
  60. package/dist/{chunk-UOOH356R.cjs.map → chunk-AIJAFPGJ.cjs.map} +1 -1
  61. package/dist/{chunk-43GBCUSQ.js → chunk-AQ564XO7.js} +6 -6
  62. package/dist/chunk-AQ564XO7.js.map +1 -0
  63. package/dist/{chunk-CYMZ2QS5.js → chunk-BCJFOSZX.js} +2 -2
  64. package/dist/{chunk-CYMZ2QS5.js.map → chunk-BCJFOSZX.js.map} +1 -1
  65. package/dist/{chunk-T3C4RNJ4.js → chunk-BJKAVWED.js} +3 -3
  66. package/dist/{chunk-T3C4RNJ4.js.map → chunk-BJKAVWED.js.map} +1 -1
  67. package/dist/{chunk-MKWGKASO.js → chunk-BMRQ4VME.js} +4 -4
  68. package/dist/{chunk-MKWGKASO.js.map → chunk-BMRQ4VME.js.map} +1 -1
  69. package/dist/{chunk-T42BCIUA.js → chunk-BMSG4NBH.js} +4 -4
  70. package/dist/{chunk-T42BCIUA.js.map → chunk-BMSG4NBH.js.map} +1 -1
  71. package/dist/{chunk-QA6ZDHFP.js → chunk-BOOJDRJO.js} +35 -11
  72. package/dist/chunk-BOOJDRJO.js.map +1 -0
  73. package/dist/{chunk-IYIYL2SQ.js → chunk-CEQJGUAS.js} +3 -3
  74. package/dist/{chunk-IYIYL2SQ.js.map → chunk-CEQJGUAS.js.map} +1 -1
  75. package/dist/{chunk-ZVSW2KS6.js → chunk-D2GID3YK.js} +30 -7
  76. package/dist/chunk-D2GID3YK.js.map +1 -0
  77. package/dist/{chunk-WO5CAOAN.js → chunk-DCBMTFLE.js} +3 -3
  78. package/dist/{chunk-WO5CAOAN.js.map → chunk-DCBMTFLE.js.map} +1 -1
  79. package/dist/{chunk-J7Z7467B.js → chunk-DLBV42JD.js} +4 -4
  80. package/dist/{chunk-J7Z7467B.js.map → chunk-DLBV42JD.js.map} +1 -1
  81. package/dist/{chunk-MUYTGWGE.js → chunk-DVOQ3JNO.js} +3 -3
  82. package/dist/{chunk-MUYTGWGE.js.map → chunk-DVOQ3JNO.js.map} +1 -1
  83. package/dist/{chunk-I2W24RHW.js → chunk-DWCYEPTT.js} +3 -3
  84. package/dist/{chunk-I2W24RHW.js.map → chunk-DWCYEPTT.js.map} +1 -1
  85. package/dist/{chunk-LJ2ZWIX6.js → chunk-DWIF6VXZ.js} +124 -3
  86. package/dist/chunk-DWIF6VXZ.js.map +1 -0
  87. package/dist/{chunk-IHTRKWBG.js → chunk-EGWWTIWS.js} +119 -75
  88. package/dist/chunk-EGWWTIWS.js.map +1 -0
  89. package/dist/{chunk-T3RWXOCM.js → chunk-EHQ77LL5.js} +3 -3
  90. package/dist/{chunk-T3RWXOCM.js.map → chunk-EHQ77LL5.js.map} +1 -1
  91. package/dist/{chunk-UM6NA7HL.js → chunk-EKRT7K2K.js} +4 -4
  92. package/dist/{chunk-UM6NA7HL.js.map → chunk-EKRT7K2K.js.map} +1 -1
  93. package/dist/{chunk-KOCTIB6U.js → chunk-EMMYFHOT.js} +3 -3
  94. package/dist/{chunk-KOCTIB6U.js.map → chunk-EMMYFHOT.js.map} +1 -1
  95. package/dist/{chunk-WGPMTW36.cjs → chunk-EPQPUFS6.cjs} +7 -7
  96. package/dist/{chunk-WGPMTW36.cjs.map → chunk-EPQPUFS6.cjs.map} +1 -1
  97. package/dist/{chunk-J3BU3JBX.js → chunk-FDUA6OGN.js} +3 -3
  98. package/dist/{chunk-J3BU3JBX.js.map → chunk-FDUA6OGN.js.map} +1 -1
  99. package/dist/{chunk-JHYFHEHS.js → chunk-FDV7EQWH.js} +4 -4
  100. package/dist/{chunk-JHYFHEHS.js.map → chunk-FDV7EQWH.js.map} +1 -1
  101. package/dist/{chunk-KQAXXJ4G.cjs → chunk-FF235PKY.cjs} +7 -7
  102. package/dist/{chunk-KQAXXJ4G.cjs.map → chunk-FF235PKY.cjs.map} +1 -1
  103. package/dist/{chunk-FZJBFJJR.js → chunk-FJ7YPVKV.js} +3 -3
  104. package/dist/{chunk-FZJBFJJR.js.map → chunk-FJ7YPVKV.js.map} +1 -1
  105. package/dist/{chunk-5MAGWW5X.cjs → chunk-FKLUSYFP.cjs} +11 -11
  106. package/dist/{chunk-5MAGWW5X.cjs.map → chunk-FKLUSYFP.cjs.map} +1 -1
  107. package/dist/{chunk-BB4WQ4LV.cjs → chunk-FN6VHMLM.cjs} +8 -8
  108. package/dist/{chunk-BB4WQ4LV.cjs.map → chunk-FN6VHMLM.cjs.map} +1 -1
  109. package/dist/{chunk-6AHYYWVB.js → chunk-FPVRQCCL.js} +5 -5
  110. package/dist/{chunk-6AHYYWVB.js.map → chunk-FPVRQCCL.js.map} +1 -1
  111. package/dist/{chunk-FJH7P5WG.js → chunk-FTRGZOVJ.js} +6 -6
  112. package/dist/{chunk-FJH7P5WG.js.map → chunk-FTRGZOVJ.js.map} +1 -1
  113. package/dist/{chunk-ZGSC2CB2.js → chunk-GTHNWP4P.js} +36 -5
  114. package/dist/chunk-GTHNWP4P.js.map +1 -0
  115. package/dist/{chunk-44CK4CT2.cjs → chunk-H7QSGFMZ.cjs} +13 -13
  116. package/dist/{chunk-44CK4CT2.cjs.map → chunk-H7QSGFMZ.cjs.map} +1 -1
  117. package/dist/{chunk-YZT62IMX.js → chunk-HIDV32ZX.js} +5 -5
  118. package/dist/{chunk-YZT62IMX.js.map → chunk-HIDV32ZX.js.map} +1 -1
  119. package/dist/{chunk-BIT27PPD.js → chunk-HS25RPDW.js} +3 -3
  120. package/dist/{chunk-BIT27PPD.js.map → chunk-HS25RPDW.js.map} +1 -1
  121. package/dist/{chunk-BWYYA3LQ.cjs → chunk-I2ECTLON.cjs} +5 -5
  122. package/dist/{chunk-BWYYA3LQ.cjs.map → chunk-I2ECTLON.cjs.map} +1 -1
  123. package/dist/{chunk-DUPR6FEL.js → chunk-I3WGZPI6.js} +4 -4
  124. package/dist/{chunk-DUPR6FEL.js.map → chunk-I3WGZPI6.js.map} +1 -1
  125. package/dist/{chunk-TN33E2VN.cjs → chunk-IJYTASQQ.cjs} +15 -15
  126. package/dist/{chunk-TN33E2VN.cjs.map → chunk-IJYTASQQ.cjs.map} +1 -1
  127. package/dist/{chunk-BT3ZQJGT.cjs → chunk-IUDY6S7I.cjs} +6 -6
  128. package/dist/{chunk-BT3ZQJGT.cjs.map → chunk-IUDY6S7I.cjs.map} +1 -1
  129. package/dist/{chunk-BYUV3IZV.cjs → chunk-JP5SGIXA.cjs} +4 -4
  130. package/dist/{chunk-BYUV3IZV.cjs.map → chunk-JP5SGIXA.cjs.map} +1 -1
  131. package/dist/{chunk-TR2OJKQ4.cjs → chunk-JTSKPDPH.cjs} +8 -8
  132. package/dist/{chunk-TR2OJKQ4.cjs.map → chunk-JTSKPDPH.cjs.map} +1 -1
  133. package/dist/{chunk-V25Z5GR6.cjs → chunk-K4S4FAYX.cjs} +9 -9
  134. package/dist/{chunk-V25Z5GR6.cjs.map → chunk-K4S4FAYX.cjs.map} +1 -1
  135. package/dist/{chunk-XCLQZ4FV.js → chunk-KFLDXJEE.js} +3 -3
  136. package/dist/{chunk-XCLQZ4FV.js.map → chunk-KFLDXJEE.js.map} +1 -1
  137. package/dist/{chunk-6D5F7EDM.js → chunk-KRGKPUJH.js} +18 -17
  138. package/dist/chunk-KRGKPUJH.js.map +1 -0
  139. package/dist/{chunk-MCCO4A23.js → chunk-LC7YHZXM.js} +256 -45
  140. package/dist/chunk-LC7YHZXM.js.map +1 -0
  141. package/dist/{chunk-JCNPVK74.cjs → chunk-LJBWCUKP.cjs} +8 -8
  142. package/dist/{chunk-JCNPVK74.cjs.map → chunk-LJBWCUKP.cjs.map} +1 -1
  143. package/dist/{chunk-4LVPQ44A.js → chunk-LMBXJZLG.js} +9 -5
  144. package/dist/chunk-LMBXJZLG.js.map +1 -0
  145. package/dist/{chunk-ZHBANUBI.cjs → chunk-MJWFNV3L.cjs} +31 -27
  146. package/dist/chunk-MJWFNV3L.cjs.map +1 -0
  147. package/dist/{chunk-ZDEYV373.cjs → chunk-MYFZYUPR.cjs} +35 -11
  148. package/dist/chunk-MYFZYUPR.cjs.map +1 -0
  149. package/dist/{chunk-C2544GKZ.js → chunk-N3Y43KOB.js} +4 -4
  150. package/dist/{chunk-C2544GKZ.js.map → chunk-N3Y43KOB.js.map} +1 -1
  151. package/dist/{chunk-RHYIFIT5.js → chunk-NLBT5O2X.js} +3 -3
  152. package/dist/{chunk-RHYIFIT5.js.map → chunk-NLBT5O2X.js.map} +1 -1
  153. package/dist/{chunk-FCBQP2U4.cjs → chunk-NPKPCYAT.cjs} +142 -16
  154. package/dist/chunk-NPKPCYAT.cjs.map +1 -0
  155. package/dist/{chunk-PWHK7SWN.cjs → chunk-NQ2D2V6O.cjs} +150 -149
  156. package/dist/chunk-NQ2D2V6O.cjs.map +1 -0
  157. package/dist/{chunk-QUUFKGDF.cjs → chunk-OAHORW4N.cjs} +130 -86
  158. package/dist/chunk-OAHORW4N.cjs.map +1 -0
  159. package/dist/{chunk-BX6BTDTR.js → chunk-OQWZYKJM.js} +3 -3
  160. package/dist/{chunk-BX6BTDTR.js.map → chunk-OQWZYKJM.js.map} +1 -1
  161. package/dist/{chunk-JBB25LFB.js → chunk-OTQ72WX3.js} +3 -3
  162. package/dist/{chunk-JBB25LFB.js.map → chunk-OTQ72WX3.js.map} +1 -1
  163. package/dist/{chunk-AFKKJEV5.cjs → chunk-OZOSWBSI.cjs} +4 -4
  164. package/dist/{chunk-AFKKJEV5.cjs.map → chunk-OZOSWBSI.cjs.map} +1 -1
  165. package/dist/{chunk-KJPOFUF5.cjs → chunk-P2VTQ5AR.cjs} +10 -10
  166. package/dist/{chunk-KJPOFUF5.cjs.map → chunk-P2VTQ5AR.cjs.map} +1 -1
  167. package/dist/{chunk-CVC4NWFA.cjs → chunk-P3JEMF6E.cjs} +4 -4
  168. package/dist/{chunk-CVC4NWFA.cjs.map → chunk-P3JEMF6E.cjs.map} +1 -1
  169. package/dist/{chunk-ZAIEQWRA.js → chunk-P6L74SKG.js} +5 -5
  170. package/dist/{chunk-ZAIEQWRA.js.map → chunk-P6L74SKG.js.map} +1 -1
  171. package/dist/{chunk-QASIWBXU.cjs → chunk-P7UMS4E6.cjs} +7 -7
  172. package/dist/{chunk-QASIWBXU.cjs.map → chunk-P7UMS4E6.cjs.map} +1 -1
  173. package/dist/chunk-PAM5UUBL.cjs +740 -0
  174. package/dist/{chunk-UTYUT5YY.cjs.map → chunk-PAM5UUBL.cjs.map} +1 -1
  175. package/dist/{chunk-NVHAQOHH.cjs → chunk-PLMXN23Q.cjs} +10 -10
  176. package/dist/chunk-PLMXN23Q.cjs.map +1 -0
  177. package/dist/{chunk-Y2S6QMKU.js → chunk-PTZB2GKL.js} +3 -3
  178. package/dist/{chunk-Y2S6QMKU.js.map → chunk-PTZB2GKL.js.map} +1 -1
  179. package/dist/{chunk-EZKRAW2X.js → chunk-QUUBTNMH.js} +3 -3
  180. package/dist/{chunk-EZKRAW2X.js.map → chunk-QUUBTNMH.js.map} +1 -1
  181. package/dist/{chunk-5BQE6BEL.js → chunk-QYSUYB3S.js} +13 -9
  182. package/dist/chunk-QYSUYB3S.js.map +1 -0
  183. package/dist/{chunk-MZPF2QGM.cjs → chunk-RBS3GHDZ.cjs} +15 -15
  184. package/dist/{chunk-MZPF2QGM.cjs.map → chunk-RBS3GHDZ.cjs.map} +1 -1
  185. package/dist/{chunk-A2QVQF54.cjs → chunk-RDGRKYQ5.cjs} +31 -8
  186. package/dist/chunk-RDGRKYQ5.cjs.map +1 -0
  187. package/dist/{chunk-KJ5BSGEO.cjs → chunk-RS5VA6QU.cjs} +17 -13
  188. package/dist/chunk-RS5VA6QU.cjs.map +1 -0
  189. package/dist/{chunk-372IIHUA.cjs → chunk-RYQ3S3KO.cjs} +53 -53
  190. package/dist/{chunk-372IIHUA.cjs.map → chunk-RYQ3S3KO.cjs.map} +1 -1
  191. package/dist/{chunk-NQME7MCK.js → chunk-RZJXCI53.js} +191 -204
  192. package/dist/chunk-RZJXCI53.js.map +1 -0
  193. package/dist/{chunk-DFCZPVG4.cjs → chunk-S3MKIDYG.cjs} +8 -8
  194. package/dist/{chunk-DFCZPVG4.cjs.map → chunk-S3MKIDYG.cjs.map} +1 -1
  195. package/dist/chunk-S5RVSXDV.cjs +45 -0
  196. package/dist/chunk-S5RVSXDV.cjs.map +1 -0
  197. package/dist/{chunk-XDFDVF2O.js → chunk-SH6B4MG5.js} +4 -4
  198. package/dist/{chunk-XDFDVF2O.js.map → chunk-SH6B4MG5.js.map} +1 -1
  199. package/dist/chunk-SVSHA7XV.js +487 -0
  200. package/dist/chunk-SVSHA7XV.js.map +1 -0
  201. package/dist/{chunk-7VF6WO7H.cjs → chunk-SYIFEJSF.cjs} +310 -99
  202. package/dist/chunk-SYIFEJSF.cjs.map +1 -0
  203. package/dist/{chunk-KL2S36FM.js → chunk-TNUL4LGG.js} +6 -6
  204. package/dist/{chunk-KL2S36FM.js.map → chunk-TNUL4LGG.js.map} +1 -1
  205. package/dist/chunk-TQONQSJO.js +42 -0
  206. package/dist/chunk-TQONQSJO.js.map +1 -0
  207. package/dist/{chunk-6ZYE6JUK.cjs → chunk-TVLZZI5Q.cjs} +11 -11
  208. package/dist/{chunk-6ZYE6JUK.cjs.map → chunk-TVLZZI5Q.cjs.map} +1 -1
  209. package/dist/{chunk-FQ3UCZUX.cjs → chunk-U3JU6BI5.cjs} +7 -7
  210. package/dist/{chunk-FQ3UCZUX.cjs.map → chunk-U3JU6BI5.cjs.map} +1 -1
  211. package/dist/{chunk-VCO2IZOG.js → chunk-UA7E7PDS.js} +3 -3
  212. package/dist/{chunk-VCO2IZOG.js.map → chunk-UA7E7PDS.js.map} +1 -1
  213. package/dist/{chunk-BLPCYP4D.cjs → chunk-URHXR5SC.cjs} +29 -29
  214. package/dist/{chunk-BLPCYP4D.cjs.map → chunk-URHXR5SC.cjs.map} +1 -1
  215. package/dist/{chunk-OOYEHBYJ.js → chunk-UUI7WXI5.js} +142 -16
  216. package/dist/chunk-UUI7WXI5.js.map +1 -0
  217. package/dist/{chunk-UFYXU7KV.js → chunk-UZ5NGGMI.js} +4 -4
  218. package/dist/{chunk-UFYXU7KV.js.map → chunk-UZ5NGGMI.js.map} +1 -1
  219. package/dist/{chunk-SNEQXSC5.cjs → chunk-VA7QN4DX.cjs} +2 -2
  220. package/dist/{chunk-SNEQXSC5.cjs.map → chunk-VA7QN4DX.cjs.map} +1 -1
  221. package/dist/{chunk-STPK44AU.js → chunk-VNWJTCBQ.js} +3 -3
  222. package/dist/{chunk-STPK44AU.js.map → chunk-VNWJTCBQ.js.map} +1 -1
  223. package/dist/{chunk-ZNZZCB2M.cjs → chunk-VPIYTQCV.cjs} +9 -9
  224. package/dist/{chunk-ZNZZCB2M.cjs.map → chunk-VPIYTQCV.cjs.map} +1 -1
  225. package/dist/{chunk-DLNJLCNO.cjs → chunk-VTKXM7IE.cjs} +4 -4
  226. package/dist/{chunk-DLNJLCNO.cjs.map → chunk-VTKXM7IE.cjs.map} +1 -1
  227. package/dist/{chunk-VPNURIAY.cjs → chunk-VVI32P7L.cjs} +10 -10
  228. package/dist/{chunk-VPNURIAY.cjs.map → chunk-VVI32P7L.cjs.map} +1 -1
  229. package/dist/{chunk-EUUQVDXX.cjs → chunk-W4Q4UEXA.cjs} +14 -14
  230. package/dist/{chunk-EUUQVDXX.cjs.map → chunk-W4Q4UEXA.cjs.map} +1 -1
  231. package/dist/{chunk-U3ABLVYH.cjs → chunk-WUNWHOLA.cjs} +6 -6
  232. package/dist/{chunk-U3ABLVYH.cjs.map → chunk-WUNWHOLA.cjs.map} +1 -1
  233. package/dist/{chunk-RH43XBNV.cjs → chunk-WWJIW2IH.cjs} +4 -4
  234. package/dist/{chunk-RH43XBNV.cjs.map → chunk-WWJIW2IH.cjs.map} +1 -1
  235. package/dist/chunk-X4LBUPJO.cjs +511 -0
  236. package/dist/chunk-X4LBUPJO.cjs.map +1 -0
  237. package/dist/{chunk-4GXECTPS.cjs → chunk-XB54G7WS.cjs} +37 -3
  238. package/dist/chunk-XB54G7WS.cjs.map +1 -0
  239. package/dist/{chunk-IUFDGB5O.js → chunk-XMCIXHGH.js} +3 -3
  240. package/dist/{chunk-IUFDGB5O.js.map → chunk-XMCIXHGH.js.map} +1 -1
  241. package/dist/{chunk-KAKH2UZA.js → chunk-XO3WLK65.js} +3 -3
  242. package/dist/{chunk-KAKH2UZA.js.map → chunk-XO3WLK65.js.map} +1 -1
  243. package/dist/{chunk-IWDQPSJN.cjs → chunk-XS35KPBZ.cjs} +211 -223
  244. package/dist/chunk-XS35KPBZ.cjs.map +1 -0
  245. package/dist/{chunk-DEZ7XSTG.cjs → chunk-XXVUHLQN.cjs} +7 -7
  246. package/dist/{chunk-DEZ7XSTG.cjs.map → chunk-XXVUHLQN.cjs.map} +1 -1
  247. package/dist/{chunk-3GGET5LK.cjs → chunk-YGA35Z2P.cjs} +7 -7
  248. package/dist/{chunk-3GGET5LK.cjs.map → chunk-YGA35Z2P.cjs.map} +1 -1
  249. package/dist/{chunk-CKD554XR.cjs → chunk-YIXTGWT4.cjs} +5 -5
  250. package/dist/{chunk-CKD554XR.cjs.map → chunk-YIXTGWT4.cjs.map} +1 -1
  251. package/dist/{chunk-GOKC4CCZ.cjs → chunk-YMHOF6WA.cjs} +8 -8
  252. package/dist/{chunk-GOKC4CCZ.cjs.map → chunk-YMHOF6WA.cjs.map} +1 -1
  253. package/dist/{chunk-OXYFTCRW.cjs → chunk-YP5T6NZD.cjs} +4 -4
  254. package/dist/{chunk-OXYFTCRW.cjs.map → chunk-YP5T6NZD.cjs.map} +1 -1
  255. package/dist/{chunk-EL2RSQTJ.cjs → chunk-YVL3XATO.cjs} +5 -5
  256. package/dist/{chunk-EL2RSQTJ.cjs.map → chunk-YVL3XATO.cjs.map} +1 -1
  257. package/dist/{chunk-PVUDXJAI.js → chunk-YXCE2HSK.js} +4 -4
  258. package/dist/{chunk-PVUDXJAI.js.map → chunk-YXCE2HSK.js.map} +1 -1
  259. package/dist/{chunk-XL7TTKHP.js → chunk-Z4PECE5S.js} +7 -7
  260. package/dist/{chunk-XL7TTKHP.js.map → chunk-Z4PECE5S.js.map} +1 -1
  261. package/dist/{chunk-ST2RE5UB.cjs → chunk-Z5KFXHDP.cjs} +6 -6
  262. package/dist/{chunk-ST2RE5UB.cjs.map → chunk-Z5KFXHDP.cjs.map} +1 -1
  263. package/dist/{chunk-DAPZPT5N.cjs → chunk-ZBI52NP2.cjs} +13 -13
  264. package/dist/{chunk-DAPZPT5N.cjs.map → chunk-ZBI52NP2.cjs.map} +1 -1
  265. package/dist/{chunk-4Z6ZZKIY.js → chunk-ZIUADGAR.js} +3 -3
  266. package/dist/{chunk-4Z6ZZKIY.js.map → chunk-ZIUADGAR.js.map} +1 -1
  267. package/dist/{chunk-LOTMAKUG.cjs → chunk-ZZJ4ZVYR.cjs} +11 -11
  268. package/dist/{chunk-LOTMAKUG.cjs.map → chunk-ZZJ4ZVYR.cjs.map} +1 -1
  269. package/dist/collabKit-QZL4P5T5.js +48 -0
  270. package/dist/collabKit-QZL4P5T5.js.map +1 -0
  271. package/dist/collabKit-UF7E6V3N.cjs +72 -0
  272. package/dist/collabKit-UF7E6V3N.cjs.map +1 -0
  273. package/dist/components/Alert/index.cjs +6 -6
  274. package/dist/components/Alert/index.js +2 -2
  275. package/dist/components/AlertDialog/index.cjs +5 -5
  276. package/dist/components/AlertDialog/index.js +4 -4
  277. package/dist/components/AudioPlayer/index.cjs +7 -7
  278. package/dist/components/AudioPlayer/index.js +2 -2
  279. package/dist/components/AudioRecorder/index.cjs +7 -7
  280. package/dist/components/AudioRecorder/index.js +2 -2
  281. package/dist/components/Autocomplete/index.cjs +5 -5
  282. package/dist/components/Autocomplete/index.js +4 -4
  283. package/dist/components/Avatar/index.cjs +6 -6
  284. package/dist/components/Avatar/index.js +2 -2
  285. package/dist/components/Badge/index.cjs +4 -4
  286. package/dist/components/Badge/index.js +2 -2
  287. package/dist/components/Breadcrumb/index.cjs +4 -4
  288. package/dist/components/Breadcrumb/index.js +2 -2
  289. package/dist/components/Button/index.cjs +4 -4
  290. package/dist/components/Button/index.js +2 -2
  291. package/dist/components/Card/index.cjs +16 -16
  292. package/dist/components/Card/index.d.cts +8 -3
  293. package/dist/components/Card/index.d.ts +8 -3
  294. package/dist/components/Card/index.js +2 -2
  295. package/dist/components/Checkbox/index.cjs +5 -5
  296. package/dist/components/Checkbox/index.js +2 -2
  297. package/dist/components/CollabStatus/index.cjs +21 -0
  298. package/dist/components/CollabStatus/index.cjs.map +1 -0
  299. package/dist/components/CollabStatus/index.d.cts +222 -0
  300. package/dist/components/CollabStatus/index.d.ts +222 -0
  301. package/dist/components/CollabStatus/index.js +4 -0
  302. package/dist/components/CollabStatus/index.js.map +1 -0
  303. package/dist/components/Collapsible/index.cjs +5 -5
  304. package/dist/components/Collapsible/index.js +2 -2
  305. package/dist/components/CountryCodeDropdown/index.cjs +6 -6
  306. package/dist/components/CountryCodeDropdown/index.js +3 -3
  307. package/dist/components/DateInput/index.cjs +5 -5
  308. package/dist/components/DateInput/index.d.cts +3 -1
  309. package/dist/components/DateInput/index.d.ts +3 -1
  310. package/dist/components/DateInput/index.js +4 -4
  311. package/dist/components/Dropdown/index.cjs +10 -10
  312. package/dist/components/Dropdown/index.d.cts +1 -1
  313. package/dist/components/Dropdown/index.d.ts +1 -1
  314. package/dist/components/Dropdown/index.js +4 -4
  315. package/dist/components/FloatingWindow/index.cjs +5 -5
  316. package/dist/components/FloatingWindow/index.js +3 -3
  317. package/dist/components/Input/index.cjs +4 -4
  318. package/dist/components/Input/index.js +2 -2
  319. package/dist/components/Label/index.cjs +4 -4
  320. package/dist/components/Label/index.js +2 -2
  321. package/dist/components/Markdown/index.cjs +17 -17
  322. package/dist/components/Markdown/index.js +8 -8
  323. package/dist/components/MediaEditor/index.cjs +16 -16
  324. package/dist/components/MediaEditor/index.d.cts +34 -1
  325. package/dist/components/MediaEditor/index.d.ts +34 -1
  326. package/dist/components/MediaEditor/index.js +11 -11
  327. package/dist/components/MediaPlayer/index.cjs +6 -6
  328. package/dist/components/MediaPlayer/index.js +3 -3
  329. package/dist/components/Modal/index.cjs +10 -10
  330. package/dist/components/Modal/index.js +2 -2
  331. package/dist/components/Pagination/index.cjs +5 -5
  332. package/dist/components/Pagination/index.js +2 -2
  333. package/dist/components/PhoneInput/index.cjs +5 -5
  334. package/dist/components/PhoneInput/index.js +3 -3
  335. package/dist/components/Progress/index.cjs +7 -7
  336. package/dist/components/Progress/index.js +2 -2
  337. package/dist/components/QuickAction/index.cjs +7 -7
  338. package/dist/components/QuickAction/index.js +2 -2
  339. package/dist/components/Radio/index.cjs +5 -5
  340. package/dist/components/Radio/index.js +2 -2
  341. package/dist/components/RecordButton/index.cjs +5 -5
  342. package/dist/components/RecordButton/index.js +2 -2
  343. package/dist/components/RichTextEditor/index.cjs +10 -10
  344. package/dist/components/RichTextEditor/index.js +7 -7
  345. package/dist/components/SchedulePicker/index.cjs +11 -11
  346. package/dist/components/SchedulePicker/index.js +2 -2
  347. package/dist/components/ScrollArea/index.cjs +4 -4
  348. package/dist/components/ScrollArea/index.js +2 -2
  349. package/dist/components/Select/index.cjs +5 -5
  350. package/dist/components/Select/index.js +3 -3
  351. package/dist/components/Separator/index.cjs +4 -4
  352. package/dist/components/Separator/index.js +2 -2
  353. package/dist/components/Sheet/index.cjs +11 -11
  354. package/dist/components/Sheet/index.d.cts +1 -1
  355. package/dist/components/Sheet/index.d.ts +1 -1
  356. package/dist/components/Sheet/index.js +2 -2
  357. package/dist/components/Skeleton/index.cjs +7 -7
  358. package/dist/components/Skeleton/index.js +2 -2
  359. package/dist/components/Slider/index.cjs +6 -6
  360. package/dist/components/Slider/index.js +2 -2
  361. package/dist/components/Spinner/index.cjs +6 -6
  362. package/dist/components/Spinner/index.js +2 -2
  363. package/dist/components/SuperChat/index.cjs +46 -46
  364. package/dist/components/SuperChat/index.d.cts +4 -4
  365. package/dist/components/SuperChat/index.d.ts +4 -4
  366. package/dist/components/SuperChat/index.js +9 -9
  367. package/dist/components/SuperChat/plugins/index.cjs +10 -10
  368. package/dist/components/SuperChat/plugins/index.d.cts +3 -3
  369. package/dist/components/SuperChat/plugins/index.d.ts +3 -3
  370. package/dist/components/SuperChat/plugins/index.js +4 -4
  371. package/dist/components/Switch/index.cjs +5 -5
  372. package/dist/components/Switch/index.js +2 -2
  373. package/dist/components/Table/index.cjs +10 -10
  374. package/dist/components/Table/index.js +2 -2
  375. package/dist/components/Tabs/index.cjs +8 -8
  376. package/dist/components/Tabs/index.js +2 -2
  377. package/dist/components/Text/index.cjs +5 -5
  378. package/dist/components/Text/index.d.cts +1 -1
  379. package/dist/components/Text/index.d.ts +1 -1
  380. package/dist/components/Text/index.js +2 -2
  381. package/dist/components/Textarea/index.cjs +4 -4
  382. package/dist/components/Textarea/index.js +2 -2
  383. package/dist/components/ThemeProvider/index.cjs +9 -9
  384. package/dist/components/ThemeProvider/index.js +3 -3
  385. package/dist/components/Toggle/index.cjs +4 -4
  386. package/dist/components/Toggle/index.js +2 -2
  387. package/dist/components/Tooltip/index.cjs +3 -3
  388. package/dist/components/Tooltip/index.js +2 -2
  389. package/dist/datavis.cjs +7 -7
  390. package/dist/datavis.js +3 -3
  391. package/dist/esheet.cjs +18 -18
  392. package/dist/esheet.js +15 -15
  393. package/dist/hooks/index.cjs +34 -22
  394. package/dist/hooks/index.d.cts +31 -3
  395. package/dist/hooks/index.d.ts +31 -3
  396. package/dist/hooks/index.js +3 -3
  397. package/dist/index.cjs +3481 -1875
  398. package/dist/index.cjs.map +1 -1
  399. package/dist/index.d.cts +245 -22
  400. package/dist/index.d.ts +245 -22
  401. package/dist/index.js +976 -124
  402. package/dist/index.js.map +1 -1
  403. package/dist/kerebron.cjs +60 -17
  404. package/dist/kerebron.cjs.map +1 -1
  405. package/dist/kerebron.d.cts +39 -1
  406. package/dist/kerebron.d.ts +39 -1
  407. package/dist/kerebron.js +60 -17
  408. package/dist/kerebron.js.map +1 -1
  409. package/dist/styles.css +1 -1
  410. package/dist/tailwind-preset.cjs +4 -4
  411. package/dist/tailwind-preset.js +1 -1
  412. package/dist/{types-BYnLjEFg.d.ts → types-B2RLmdVd.d.cts} +3 -1
  413. package/dist/{types-BYnLjEFg.d.cts → types-B2RLmdVd.d.ts} +3 -1
  414. package/dist/{types-CyCwYBlr.d.ts → types-BoTeTPdH.d.ts} +1 -1
  415. package/dist/{types-CBh8Zlje.d.cts → types-DyIB9HYT.d.cts} +1 -1
  416. package/dist/{useAnchoredPosition-nXdSFKHf.d.cts → useAnchoredPosition-C7PNglzD.d.cts} +6 -2
  417. package/dist/{useAnchoredPosition-nXdSFKHf.d.ts → useAnchoredPosition-C7PNglzD.d.ts} +6 -2
  418. package/dist/{useTranscriptEdits-Hy0Vm-H8.d.cts → useTranscriptEdits-CGzlemHT.d.cts} +16 -3
  419. package/dist/{useTranscriptEdits-C2BbMU37.d.ts → useTranscriptEdits-D32bLs0l.d.ts} +16 -3
  420. package/dist/utils/index.cjs +15 -11
  421. package/dist/utils/index.d.cts +6 -1
  422. package/dist/utils/index.d.ts +6 -1
  423. package/dist/utils/index.js +2 -2
  424. package/package.json +30 -12
  425. package/dist/CsvBlock-2A5VEDD3.cjs +0 -15
  426. package/dist/CsvBlock-D6PWAJ5X.js +0 -6
  427. package/dist/HtmlPreviewBlock-PEHTJ6C3.js +0 -6
  428. package/dist/HtmlPreviewBlock-SYXCV5RH.cjs +0 -15
  429. package/dist/MermaidBlock-7NK3AVK2.js +0 -6
  430. package/dist/MermaidBlock-AFXNP5NK.cjs +0 -15
  431. package/dist/SurveyBlock-6KRNKFH5.cjs +0 -15
  432. package/dist/SurveyBlock-NNDGXGG4.js +0 -6
  433. package/dist/chunk-43GBCUSQ.js.map +0 -1
  434. package/dist/chunk-4GXECTPS.cjs.map +0 -1
  435. package/dist/chunk-4LVPQ44A.js.map +0 -1
  436. package/dist/chunk-5BQE6BEL.js.map +0 -1
  437. package/dist/chunk-6D5F7EDM.js.map +0 -1
  438. package/dist/chunk-7VF6WO7H.cjs.map +0 -1
  439. package/dist/chunk-A2QVQF54.cjs.map +0 -1
  440. package/dist/chunk-DHKYGVP7.js +0 -3
  441. package/dist/chunk-F3SOEIN2.js +0 -11
  442. package/dist/chunk-F3SOEIN2.js.map +0 -1
  443. package/dist/chunk-FCBQP2U4.cjs.map +0 -1
  444. package/dist/chunk-IHTRKWBG.js.map +0 -1
  445. package/dist/chunk-IWDQPSJN.cjs.map +0 -1
  446. package/dist/chunk-JLBT76WH.js.map +0 -1
  447. package/dist/chunk-KJ5BSGEO.cjs.map +0 -1
  448. package/dist/chunk-LJ2ZWIX6.js.map +0 -1
  449. package/dist/chunk-MCCO4A23.js.map +0 -1
  450. package/dist/chunk-NQME7MCK.js.map +0 -1
  451. package/dist/chunk-NVHAQOHH.cjs.map +0 -1
  452. package/dist/chunk-OOYEHBYJ.js.map +0 -1
  453. package/dist/chunk-OR5DRJCW.cjs +0 -13
  454. package/dist/chunk-OR5DRJCW.cjs.map +0 -1
  455. package/dist/chunk-PFWHWIXS.cjs.map +0 -1
  456. package/dist/chunk-PJAQDAMZ.cjs.map +0 -1
  457. package/dist/chunk-PWHK7SWN.cjs.map +0 -1
  458. package/dist/chunk-QA6ZDHFP.js.map +0 -1
  459. package/dist/chunk-QUUFKGDF.cjs.map +0 -1
  460. package/dist/chunk-UTYUT5YY.cjs +0 -240
  461. package/dist/chunk-ZDEYV373.cjs.map +0 -1
  462. package/dist/chunk-ZGSC2CB2.js.map +0 -1
  463. package/dist/chunk-ZHBANUBI.cjs.map +0 -1
  464. package/dist/chunk-ZVSW2KS6.js.map +0 -1
@@ -1,8 +1,8 @@
1
- import { Separator } from './chunk-BX6BTDTR.js';
2
- import { Dropdown, DropdownSeparator, DropdownLabel, DropdownItem } from './chunk-YZT62IMX.js';
3
- import { Button } from './chunk-ZVSW2KS6.js';
1
+ import { Separator } from './chunk-OQWZYKJM.js';
2
+ import { Dropdown, DropdownSeparator, DropdownLabel, DropdownItem } from './chunk-HIDV32ZX.js';
3
+ import { Button } from './chunk-D2GID3YK.js';
4
4
  import { isHtmlEmpty } from './chunk-ERLPVXOV.js';
5
- import { cn } from './chunk-F3SOEIN2.js';
5
+ import { cn } from './chunk-TQONQSJO.js';
6
6
  import * as React from 'react';
7
7
  import { Bold, Italic, Underline, List, ListOrdered, AlignLeft, AlignCenter, AlignRight, Braces, Replace, MicOff, Mic } from 'lucide-react';
8
8
  import { jsxs, jsx, Fragment } from 'react/jsx-runtime';
@@ -509,5 +509,5 @@ var RichTextEditor = React.forwardRef(
509
509
  RichTextEditor.displayName = "RichTextEditor";
510
510
 
511
511
  export { RichTextEditor, convertAngleBracketsToMustache, processDictation };
512
- //# sourceMappingURL=chunk-FJH7P5WG.js.map
513
- //# sourceMappingURL=chunk-FJH7P5WG.js.map
512
+ //# sourceMappingURL=chunk-FTRGZOVJ.js.map
513
+ //# sourceMappingURL=chunk-FTRGZOVJ.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/components/RichTextEditor/processDictation.ts","../src/components/RichTextEditor/RichTextEditor.tsx"],"names":["Fragment"],"mappings":";;;;;;;;;;AAMO,SAAS,iBAAiB,IAAA,EAAsB;AACrD,EAAA,IAAI,MAAA,GAAS,IAAA;AAGb,EAAA,MAAA,GAAS,MAAA,CAAO,OAAA;AAAA,IACd,+GAAA;AAAA,IACA;AAAA,GACF;AACA,EAAA,MAAA,GAAS,MAAA,CAAO,OAAA;AAAA,IACd,+FAAA;AAAA,IACA;AAAA,GACF;AACA,EAAA,MAAA,GAAS,MAAA,CAAO,OAAA,CAAQ,mBAAA,EAAqB,KAAK,CAAA;AAClD,EAAA,MAAA,GAAS,MAAA,CAAO,OAAA,CAAQ,wBAAA,EAA0B,IAAI,CAAA;AAGtD,EAAA,MAAA,GAAS,MAAA,CAAO,OAAA,CAAQ,mCAAA,EAAqC,UAAU,CAAA;AACvE,EAAA,MAAA,GAAS,MAAA,CAAO,OAAA,CAAQ,cAAA,EAAgB,GAAG,CAAA;AAG3C,EAAA,MAAA,GAAS,MAAA,CAAO,OAAA;AAAA,IACd,+FAAA;AAAA,IACA;AAAA,GACF;AACA,EAAA,MAAA,GAAS,MAAA,CAAO,OAAA;AAAA,IACd,wDAAA;AAAA,IACA;AAAA,GACF;AACA,EAAA,MAAA,GAAS,MAAA,CAAO,OAAA,CAAQ,cAAA,EAAgB,GAAG,CAAA;AAG3C,EAAA,MAAA,GAAS,MAAA,CAAO,OAAA;AAAA,IACd,kDAAA;AAAA,IACA;AAAA,GACF;AACA,EAAA,MAAA,GAAS,MAAA,CAAO,OAAA,CAAQ,0BAAA,EAA4B,SAAS,CAAA;AAC7D,EAAA,MAAA,GAAS,MAAA,CAAO,OAAA,CAAQ,aAAA,EAAe,IAAI,CAAA;AAE3C,EAAA,MAAM,iBAAA,GAA4C;AAAA,IAChD,YAAA,EAAc,GAAA;AAAA,IACd,gBAAA,EAAkB,GAAA;AAAA,IAClB,oBAAA,EAAsB,GAAA;AAAA,IACtB,mBAAA,EAAqB,GAAA;AAAA,IACrB,YAAA,EAAc,GAAA;AAAA,IACd,aAAA,EAAe,GAAA;AAAA,IACf,SAAA,EAAW,GAAA;AAAA,IACX,mBAAA,EAAqB,IAAA;AAAA,IACrB,oBAAA,EAAsB,GAAA;AAAA,IACtB,eAAA,EAAiB,IAAA;AAAA,IACjB,gBAAA,EAAkB,GAAA;AAAA,IAClB,aAAA,EAAe,IAAA;AAAA,IACf,cAAA,EAAgB,GAAA;AAAA,IAChB,QAAA,EAAU,GAAA;AAAA,IACV,aAAA,EAAe,GAAA;AAAA,IACf,WAAA,EAAa,IAAA;AAAA,IACb,UAAA,EAAY,IAAA;AAAA,IACZ,gBAAA,EAAkB,MAAA;AAAA,IAClB,MAAA,EAAQ;AAAA,GACV;AAEA,EAAA,KAAA,MAAW,CAAC,MAAA,EAAQ,WAAW,KAAK,MAAA,CAAO,OAAA,CAAQ,iBAAiB,CAAA,EAAG;AACrE,IAAA,MAAM,KAAA,GAAQ,IAAI,MAAA,CAAO,MAAA,EAAQ,IAAI,CAAA;AACrC,IAAA,MAAA,GAAS,MAAA,CAAO,OAAA,CAAQ,KAAA,EAAO,WAAW,CAAA;AAAA,EAC5C;AAGA,EAAA,MAAA,GAAS,MAAA,CAAO,OAAA;AAAA,IACd,oBAAA;AAAA,IACA,CAAC,QAAQ,KAAA,EAAe,MAAA,KACtB,GAAG,KAAK,CAAA,CAAA,EAAI,MAAA,CAAO,WAAA,EAAa,CAAA;AAAA,GACpC;AAEA,EAAA,OAAO,MAAA;AACT;AAMO,SAAS,+BAA+B,IAAA,EAAsB;AACnE,EAAA,OAAO,IAAA,CACJ,OAAA;AAAA,IACC,0BAAA;AAAA,IACA,CAAC,EAAA,EAAI,KAAA,KAAkB,CAAA,EAAA,EAAK,KAAA,CAAM,MAAM,CAAA,EAAA;AAAA,GAC1C,CACC,OAAA,CAAQ,cAAA,EAAgB,CAAC,EAAA,EAAI,UAAkB,CAAA,EAAA,EAAK,KAAA,CAAM,IAAA,EAAM,CAAA,EAAA,CAAI,CAAA;AACzE;ACeA,SAAS,oBAAA,GAA0D;AACjE,EAAA,MAAM,CAAA,GAAI,MAAA;AACV,EAAA,OAAO,CAAA,CAAE,qBAAqB,CAAA,CAAE,uBAAA;AAClC;AAQA,IAAM,cAAA,GAAuB,KAAA,CAAA,UAAA;AAAA,EAC3B,CACE;AAAA,IACE,KAAA;AAAA,IACA,QAAA;AAAA,IACA,WAAA;AAAA,IACA,SAAA;AAAA,IACA,cAAA;AAAA,IACA,eAAA,GAAkB,IAAA;AAAA,IAClB,gBAAA;AAAA,IACA,QAAA,GAAW,KAAA;AAAA,IACX,YAAA,EAAc;AAAA,KAEhB,GAAA,KACG;AACH,IAAA,MAAM,SAAA,GAAkB,aAAuB,IAAI,CAAA;AACnD,IAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAU,eAAS,KAAK,CAAA;AAC1D,IAAA,MAAM,CAAC,eAAA,EAAiB,kBAAkB,CAAA,GAAU,eAAS,KAAK,CAAA;AAClE,IAAA,MAAM,cAAA,GAAuB,aAAqC,IAAI,CAAA;AACtE,IAAA,MAAM,cAAA,GAAuB,aAAO,KAAK,CAAA;AACzC,IAAA,MAAM,gBAAA,GAAyB,aAAO,KAAK,CAAA;AAE3C,IAAA,MAAM,YAAA,GAAe,OAAA,CAAQ,cAAA,IAAkB,cAAA,CAAe,SAAS,CAAC,CAAA;AACxE,IAAA,MAAM,OAAA,GAAU,YAAY,KAAK,CAAA;AAEjC,IAAM,KAAA,CAAA,mBAAA,CAAoB,GAAA,EAAK,MAAM,SAAA,CAAU,OAAyB,CAAA;AAExE,IAAM,gBAAU,MAAM;AACpB,MAAA,kBAAA,CAAmB,OAAA,CAAQ,oBAAA,EAAsB,CAAC,CAAA;AAAA,IACpD,CAAA,EAAG,EAAE,CAAA;AAEL,IAAM,gBAAU,MAAM;AACpB,MAAA,OAAO,MAAM;AACX,QAAA,IAAI,eAAe,OAAA,EAAS;AAC1B,UAAA,gBAAA,CAAiB,OAAA,GAAU,KAAA;AAC3B,UAAA,cAAA,CAAe,OAAA,GAAU,KAAA;AACzB,UAAA,cAAA,CAAe,QAAQ,IAAA,EAAK;AAAA,QAC9B;AAAA,MACF,CAAA;AAAA,IACF,CAAA,EAAG,EAAE,CAAA;AAEL,IAAM,gBAAU,MAAM;AACpB,MAAA,IAAI,SAAA,CAAU,OAAA,IAAW,SAAA,CAAU,OAAA,CAAQ,cAAc,KAAA,EAAO;AAC9D,QAAA,SAAA,CAAU,QAAQ,SAAA,GAAY,KAAA;AAAA,MAChC;AAAA,IACF,CAAA,EAAG,CAAC,KAAK,CAAC,CAAA;AAEV,IAAA,MAAM,gBAAgB,MAAM;AAC1B,MAAA,IAAI,SAAA,CAAU,OAAA,EAAS,QAAA,CAAS,SAAA,CAAU,QAAQ,SAAS,CAAA;AAAA,IAC7D,CAAA;AAEA,IAAA,MAAM,WAAA,GAAc,CAAC,OAAA,KAAoB;AACvC,MAAA,IAAI,QAAA,EAAU;AACd,MAAA,QAAA,CAAS,WAAA,CAAY,SAAS,KAAK,CAAA;AACnC,MAAA,SAAA,CAAU,SAAS,KAAA,EAAM;AACzB,MAAA,aAAA,EAAc;AAAA,IAChB,CAAA;AAEA,IAAA,MAAM,0BAA0B,MAAM;AACpC,MAAA,IAAI,QAAA,IAAY,CAAC,SAAA,CAAU,OAAA,EAAS;AACpC,MAAA,SAAA,CAAU,QAAQ,SAAA,GAAY,8BAAA;AAAA,QAC5B,UAAU,OAAA,CAAQ;AAAA,OACpB;AACA,MAAA,aAAA,EAAc;AAAA,IAChB,CAAA;AAEA,IAAA,MAAM,cAAA,GAAiB,CAAC,QAAA,KAA+B;AACrD,MAAA,IAAI,QAAA,IAAY,CAAC,SAAA,CAAU,OAAA,EAAS;AACpC,MAAA,SAAA,CAAU,QAAQ,KAAA,EAAM;AACxB,MAAA,MAAM,YAAA,GAAe,QAAA,CAAS,WAAA,IAAe,QAAA,CAAS,KAAA;AAEtD,MAAA,MAAM,SAAA,GAAY,OAAO,YAAA,EAAa;AACtC,MAAA,IAAI,SAAA,IAAa,SAAA,CAAU,UAAA,GAAa,CAAA,EAAG;AACzC,QAAA,MAAM,KAAA,GAAQ,SAAA,CAAU,UAAA,CAAW,CAAC,CAAA;AACpC,QAAA,KAAA,CAAM,cAAA,EAAe;AACrB,QAAA,IAAI,YAAA,CAAa,QAAA,CAAS,IAAI,CAAA,EAAG;AAC/B,UAAA,MAAM,QAAA,GAAW,SAAS,sBAAA,EAAuB;AACjD,UAAA,MAAM,KAAA,GAAQ,YAAA,CAAa,KAAA,CAAM,IAAI,CAAA;AACrC,UAAA,KAAA,CAAM,OAAA,CAAQ,CAAC,IAAA,EAAM,KAAA,KAAU;AAC7B,YAAA,QAAA,CAAS,WAAA,CAAY,QAAA,CAAS,cAAA,CAAe,IAAI,CAAC,CAAA;AAClD,YAAA,IAAI,KAAA,GAAQ,KAAA,CAAM,MAAA,GAAS,CAAA,EAAG;AAC5B,cAAA,QAAA,CAAS,WAAA,CAAY,QAAA,CAAS,aAAA,CAAc,IAAI,CAAC,CAAA;AAAA,YACnD;AAAA,UACF,CAAC,CAAA;AACD,UAAA,KAAA,CAAM,WAAW,QAAQ,CAAA;AACzB,UAAA,KAAA,CAAM,SAAS,KAAK,CAAA;AAAA,QACtB,CAAA,MAAO;AACL,UAAA,MAAM,QAAA,GAAW,QAAA,CAAS,cAAA,CAAe,YAAY,CAAA;AACrD,UAAA,KAAA,CAAM,WAAW,QAAQ,CAAA;AACzB,UAAA,KAAA,CAAM,cAAc,QAAQ,CAAA;AAC5B,UAAA,KAAA,CAAM,YAAY,QAAQ,CAAA;AAAA,QAC5B;AACA,QAAA,SAAA,CAAU,eAAA,EAAgB;AAC1B,QAAA,SAAA,CAAU,SAAS,KAAK,CAAA;AAAA,MAC1B,CAAA,MAAO;AACL,QAAA,SAAA,CAAU,OAAA,CAAQ,SAAA,IAAa,YAAA,CAAa,OAAA,CAAQ,OAAO,MAAM,CAAA;AAAA,MACnE;AACA,MAAA,aAAA,EAAc;AAAA,IAChB,CAAA;AAEA,IAAA,MAAM,WAAA,GAAc,CAAC,OAAA,KAAoB;AACvC,MAAA,IAAI,gBAAA,mBAAmC,OAAO,CAAA;AAAA,WAAA,IACrC,OAAO,OAAA,KAAY,WAAA,EAAa,OAAA,CAAQ,KAAK,OAAO,CAAA;AAAA,IAC/D,CAAA;AAEA,IAAA,MAAM,kBAAkB,YAAY;AAClC,MAAA,MAAM,oBAAoB,oBAAA,EAAqB;AAC/C,MAAA,IAAI,CAAC,iBAAA,EAAmB;AAExB,MAAA,IAAI,WAAA,IAAe,eAAe,OAAA,EAAS;AACzC,QAAA,gBAAA,CAAiB,OAAA,GAAU,KAAA;AAC3B,QAAA,cAAA,CAAe,OAAA,GAAU,KAAA;AACzB,QAAA,cAAA,CAAe,QAAQ,IAAA,EAAK;AAC5B,QAAA,cAAA,CAAe,KAAK,CAAA;AACpB,QAAA;AAAA,MACF;AAEA,MAAA,IAAI;AACF,QAAA,MAAM,MAAA,GAAS,MAAM,SAAA,CAAU,YAAA,CAAa,YAAA,CAAa;AAAA,UACvD,KAAA,EAAO;AAAA,SACR,CAAA;AACD,QAAA,MAAA,CAAO,WAAU,CAAE,OAAA,CAAQ,CAAC,KAAA,KAAU,KAAA,CAAM,MAAM,CAAA;AAAA,MACpD,CAAA,CAAA,MAAQ;AACN,QAAA,WAAA;AAAA,UACE;AAAA,SACF;AACA,QAAA;AAAA,MACF;AAEA,MAAA,MAAM,WAAA,GAAc,IAAI,iBAAA,EAAkB;AAC1C,MAAA,WAAA,CAAY,UAAA,GAAa,IAAA;AACzB,MAAA,WAAA,CAAY,cAAA,GAAiB,IAAA;AAC7B,MAAA,WAAA,CAAY,IAAA,GAAO,OAAA;AACnB,MAAA,WAAA,CAAY,eAAA,GAAkB,CAAA;AAE9B,MAAA,WAAA,CAAY,UAAU,MAAM;AAC1B,QAAA,cAAA,CAAe,IAAI,CAAA;AACnB,QAAA,cAAA,CAAe,OAAA,GAAU,IAAA;AACzB,QAAA,gBAAA,CAAiB,OAAA,GAAU,IAAA;AAAA,MAC7B,CAAA;AAEA,MAAA,WAAA,CAAY,QAAA,GAAW,CAAC,KAAA,KAAU;AAChC,QAAA,IAAI,eAAA,GAAkB,EAAA;AACtB,QAAA,KAAA,IAAS,IAAI,KAAA,CAAM,WAAA,EAAa,IAAI,KAAA,CAAM,OAAA,CAAQ,QAAQ,CAAA,EAAA,EAAK;AAC7D,UAAA,MAAM,MAAA,GAAS,KAAA,CAAM,OAAA,CAAQ,CAAC,CAAA;AAC9B,UAAA,IAAI,MAAA,CAAO,OAAA,EAAS,eAAA,IAAmB,MAAA,CAAO,CAAC,CAAA,CAAE,UAAA;AAAA,QACnD;AAEA,QAAA,IAAI,eAAA,IAAmB,UAAU,OAAA,EAAS;AACxC,UAAA,MAAM,aAAA,GAAgB,iBAAiB,eAAe,CAAA;AACtD,UAAA,SAAA,CAAU,QAAQ,KAAA,EAAM;AACxB,UAAA,MAAM,SAAA,GAAY,OAAO,YAAA,EAAa;AACtC,UAAA,IAAI,SAAA,IAAa,SAAA,CAAU,UAAA,GAAa,CAAA,EAAG;AACzC,YAAA,MAAM,KAAA,GAAQ,SAAA,CAAU,UAAA,CAAW,CAAC,CAAA;AACpC,YAAA,KAAA,CAAM,cAAA,EAAe;AACrB,YAAA,MAAM,QAAA,GAAW,QAAA,CAAS,cAAA,CAAe,aAAA,GAAgB,GAAG,CAAA;AAC5D,YAAA,KAAA,CAAM,WAAW,QAAQ,CAAA;AACzB,YAAA,KAAA,CAAM,cAAc,QAAQ,CAAA;AAC5B,YAAA,KAAA,CAAM,YAAY,QAAQ,CAAA;AAC1B,YAAA,SAAA,CAAU,eAAA,EAAgB;AAC1B,YAAA,SAAA,CAAU,SAAS,KAAK,CAAA;AAAA,UAC1B,CAAA,MAAO;AACL,YAAA,SAAA,CAAU,OAAA,CAAQ,aAAa,aAAA,GAAgB,GAAA;AAAA,UACjD;AACA,UAAA,aAAA,EAAc;AAAA,QAChB;AAAA,MACF,CAAA;AAEA,MAAA,WAAA,CAAY,OAAA,GAAU,CAAC,KAAA,KAAU;AAC/B,QAAA,IAAI,KAAA,CAAM,KAAA,KAAU,WAAA,IAAe,KAAA,CAAM,UAAU,SAAA,EAAW;AAC9D,QAAA,IAAI,KAAA,CAAM,UAAU,aAAA,EAAe;AACjC,UAAA,WAAA;AAAA,YACE;AAAA,WACF;AACA,UAAA,gBAAA,CAAiB,OAAA,GAAU,KAAA;AAC3B,UAAA,cAAA,CAAe,OAAA,GAAU,KAAA;AACzB,UAAA,cAAA,CAAe,KAAK,CAAA;AACpB,UAAA;AAAA,QACF;AACA,QAAA,IAAI,KAAA,CAAM,UAAU,SAAA,EAAW;AAC/B,QAAA,gBAAA,CAAiB,OAAA,GAAU,KAAA;AAC3B,QAAA,cAAA,CAAe,OAAA,GAAU,KAAA;AACzB,QAAA,cAAA,CAAe,KAAK,CAAA;AAAA,MACtB,CAAA;AAEA,MAAA,WAAA,CAAY,QAAQ,MAAM;AACxB,QAAA,IAAI,gBAAA,CAAiB,OAAA,IAAW,cAAA,CAAe,OAAA,EAAS;AACtD,UAAA,UAAA,CAAW,MAAM;AACf,YAAA,IAAI,gBAAA,CAAiB,OAAA,IAAW,cAAA,CAAe,OAAA,EAAS;AACtD,cAAA,IAAI;AACF,gBAAA,WAAA,CAAY,KAAA,EAAM;AAAA,cACpB,CAAA,CAAA,MAAQ;AACN,gBAAA,gBAAA,CAAiB,OAAA,GAAU,KAAA;AAC3B,gBAAA,cAAA,CAAe,OAAA,GAAU,KAAA;AACzB,gBAAA,cAAA,CAAe,KAAK,CAAA;AAAA,cACtB;AAAA,YACF;AAAA,UACF,GAAG,GAAG,CAAA;AAAA,QACR,CAAA,MAAO;AACL,UAAA,cAAA,CAAe,KAAK,CAAA;AAAA,QACtB;AAAA,MACF,CAAA;AAEA,MAAA,cAAA,CAAe,OAAA,GAAU,WAAA;AACzB,MAAA,IAAI;AACF,QAAA,WAAA,CAAY,KAAA,EAAM;AAAA,MACpB,CAAA,CAAA,MAAQ;AACN,QAAA,WAAA,CAAY,uDAAuD,CAAA;AAAA,MACrE;AAAA,IACF,CAAA;AAEA,IAAA,MAAM,eAAA,GAAkB,aAAA;AAExB,IAAA,uBACE,IAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,WAAA,EAAU,kBAAA;AAAA,QACV,SAAA,EAAW,EAAA;AAAA,UACT,6EAAA;AAAA,UACA;AAAA,SACF;AAAA,QAEA,QAAA,EAAA;AAAA,0BAAA,IAAA;AAAA,YAAC,KAAA;AAAA,YAAA;AAAA,cACC,WAAA,EAAU,0BAAA;AAAA,cACV,SAAA,EAAU,4FAAA;AAAA,cAEV,QAAA,EAAA;AAAA,gCAAA,GAAA;AAAA,kBAAC,MAAA;AAAA,kBAAA;AAAA,oBACC,IAAA,EAAK,QAAA;AAAA,oBACL,OAAA,EAAQ,OAAA;AAAA,oBACR,IAAA,EAAK,IAAA;AAAA,oBACL,OAAA,EAAS,MAAM,WAAA,CAAY,MAAM,CAAA;AAAA,oBACjC,QAAA;AAAA,oBACA,SAAA,EAAW,eAAA;AAAA,oBACX,YAAA,EAAW,MAAA;AAAA,oBACX,KAAA,EAAM,MAAA;AAAA,oBAEN,QAAA,kBAAA,GAAA,CAAC,IAAA,EAAA,EAAK,SAAA,EAAU,SAAA,EAAU;AAAA;AAAA,iBAC5B;AAAA,gCACA,GAAA;AAAA,kBAAC,MAAA;AAAA,kBAAA;AAAA,oBACC,IAAA,EAAK,QAAA;AAAA,oBACL,OAAA,EAAQ,OAAA;AAAA,oBACR,IAAA,EAAK,IAAA;AAAA,oBACL,OAAA,EAAS,MAAM,WAAA,CAAY,QAAQ,CAAA;AAAA,oBACnC,QAAA;AAAA,oBACA,SAAA,EAAW,eAAA;AAAA,oBACX,YAAA,EAAW,QAAA;AAAA,oBACX,KAAA,EAAM,QAAA;AAAA,oBAEN,QAAA,kBAAA,GAAA,CAAC,MAAA,EAAA,EAAO,SAAA,EAAU,SAAA,EAAU;AAAA;AAAA,iBAC9B;AAAA,gCACA,GAAA;AAAA,kBAAC,MAAA;AAAA,kBAAA;AAAA,oBACC,IAAA,EAAK,QAAA;AAAA,oBACL,OAAA,EAAQ,OAAA;AAAA,oBACR,IAAA,EAAK,IAAA;AAAA,oBACL,OAAA,EAAS,MAAM,WAAA,CAAY,WAAW,CAAA;AAAA,oBACtC,QAAA;AAAA,oBACA,SAAA,EAAW,eAAA;AAAA,oBACX,YAAA,EAAW,WAAA;AAAA,oBACX,KAAA,EAAM,WAAA;AAAA,oBAEN,QAAA,kBAAA,GAAA,CAAC,SAAA,EAAA,EAAU,SAAA,EAAU,SAAA,EAAU;AAAA;AAAA,iBACjC;AAAA,gCAEA,GAAA,CAAC,SAAA,EAAA,EAAU,WAAA,EAAY,UAAA,EAAW,WAAU,UAAA,EAAW,CAAA;AAAA,gCAEvD,GAAA;AAAA,kBAAC,MAAA;AAAA,kBAAA;AAAA,oBACC,IAAA,EAAK,QAAA;AAAA,oBACL,OAAA,EAAQ,OAAA;AAAA,oBACR,IAAA,EAAK,IAAA;AAAA,oBACL,OAAA,EAAS,MAAM,WAAA,CAAY,qBAAqB,CAAA;AAAA,oBAChD,QAAA;AAAA,oBACA,SAAA,EAAW,eAAA;AAAA,oBACX,YAAA,EAAW,aAAA;AAAA,oBACX,KAAA,EAAM,aAAA;AAAA,oBAEN,QAAA,kBAAA,GAAA,CAAC,IAAA,EAAA,EAAK,SAAA,EAAU,SAAA,EAAU;AAAA;AAAA,iBAC5B;AAAA,gCACA,GAAA;AAAA,kBAAC,MAAA;AAAA,kBAAA;AAAA,oBACC,IAAA,EAAK,QAAA;AAAA,oBACL,OAAA,EAAQ,OAAA;AAAA,oBACR,IAAA,EAAK,IAAA;AAAA,oBACL,OAAA,EAAS,MAAM,WAAA,CAAY,mBAAmB,CAAA;AAAA,oBAC9C,QAAA;AAAA,oBACA,SAAA,EAAW,eAAA;AAAA,oBACX,YAAA,EAAW,eAAA;AAAA,oBACX,KAAA,EAAM,eAAA;AAAA,oBAEN,QAAA,kBAAA,GAAA,CAAC,WAAA,EAAA,EAAY,SAAA,EAAU,SAAA,EAAU;AAAA;AAAA,iBACnC;AAAA,gCAEA,GAAA,CAAC,SAAA,EAAA,EAAU,WAAA,EAAY,UAAA,EAAW,WAAU,UAAA,EAAW,CAAA;AAAA,gCAEvD,GAAA;AAAA,kBAAC,MAAA;AAAA,kBAAA;AAAA,oBACC,IAAA,EAAK,QAAA;AAAA,oBACL,OAAA,EAAQ,OAAA;AAAA,oBACR,IAAA,EAAK,IAAA;AAAA,oBACL,OAAA,EAAS,MAAM,WAAA,CAAY,aAAa,CAAA;AAAA,oBACxC,QAAA;AAAA,oBACA,SAAA,EAAW,eAAA;AAAA,oBACX,YAAA,EAAW,YAAA;AAAA,oBACX,KAAA,EAAM,YAAA;AAAA,oBAEN,QAAA,kBAAA,GAAA,CAAC,SAAA,EAAA,EAAU,SAAA,EAAU,SAAA,EAAU;AAAA;AAAA,iBACjC;AAAA,gCACA,GAAA;AAAA,kBAAC,MAAA;AAAA,kBAAA;AAAA,oBACC,IAAA,EAAK,QAAA;AAAA,oBACL,OAAA,EAAQ,OAAA;AAAA,oBACR,IAAA,EAAK,IAAA;AAAA,oBACL,OAAA,EAAS,MAAM,WAAA,CAAY,eAAe,CAAA;AAAA,oBAC1C,QAAA;AAAA,oBACA,SAAA,EAAW,eAAA;AAAA,oBACX,YAAA,EAAW,cAAA;AAAA,oBACX,KAAA,EAAM,cAAA;AAAA,oBAEN,QAAA,kBAAA,GAAA,CAAC,WAAA,EAAA,EAAY,SAAA,EAAU,SAAA,EAAU;AAAA;AAAA,iBACnC;AAAA,gCACA,GAAA;AAAA,kBAAC,MAAA;AAAA,kBAAA;AAAA,oBACC,IAAA,EAAK,QAAA;AAAA,oBACL,OAAA,EAAQ,OAAA;AAAA,oBACR,IAAA,EAAK,IAAA;AAAA,oBACL,OAAA,EAAS,MAAM,WAAA,CAAY,cAAc,CAAA;AAAA,oBACzC,QAAA;AAAA,oBACA,SAAA,EAAW,eAAA;AAAA,oBACX,YAAA,EAAW,aAAA;AAAA,oBACX,KAAA,EAAM,aAAA;AAAA,oBAEN,QAAA,kBAAA,GAAA,CAAC,UAAA,EAAA,EAAW,SAAA,EAAU,SAAA,EAAU;AAAA;AAAA,iBAClC;AAAA,gBAEC,YAAA,oBACC,IAAA,CAAAA,QAAAA,EAAA,EACE,QAAA,EAAA;AAAA,kCAAA,GAAA,CAAC,SAAA,EAAA,EAAU,WAAA,EAAY,UAAA,EAAW,SAAA,EAAU,UAAA,EAAW,CAAA;AAAA,kCACvD,GAAA;AAAA,oBAAC,QAAA;AAAA,oBAAA;AAAA,sBACC,SAAA,EAAU,cAAA;AAAA,sBACV,KAAA,EAAO,GAAA;AAAA,sBACP,UAAA,EAAU,IAAA;AAAA,sBACV,iBAAA,EAAkB,wBAAA;AAAA,sBAClB,eAAA,EAAgB,2BAAA;AAAA,sBAChB,QAAA;AAAA,sBACA,OAAA,kBACE,IAAA;AAAA,wBAAC,MAAA;AAAA,wBAAA;AAAA,0BACC,IAAA,EAAK,QAAA;AAAA,0BACL,OAAA,EAAQ,OAAA;AAAA,0BACR,IAAA,EAAK,IAAA;AAAA,0BACL,SAAA,EAAU,gBAAA;AAAA,0BACV,QAAA;AAAA,0BACA,KAAA,EAAM,iBAAA;AAAA,0BAEN,QAAA,EAAA;AAAA,4CAAA,GAAA,CAAC,MAAA,EAAA,EAAO,WAAU,SAAA,EAAU,CAAA;AAAA,4CAC5B,GAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,SAAA,EAAU,QAAA,EAAA,WAAA,EAAS;AAAA;AAAA;AAAA,uBACrC;AAAA,sBAGD,yBAAgB,GAAA,CAAI,CAAC,OAAO,UAAA,qBAC3B,IAAA,CAAO,gBAAN,EACE,QAAA,EAAA;AAAA,wBAAA,UAAA,GAAa,CAAA,wBAAM,iBAAA,EAAA,EAAkB,CAAA;AAAA,wCACtC,GAAA,CAAC,aAAA,EAAA,EAAe,QAAA,EAAA,KAAA,CAAM,KAAA,EAAM,CAAA;AAAA,wBAC3B,KAAA,CAAM,SAAA,CAAU,GAAA,CAAI,CAAC,QAAA,qBACpB,GAAA;AAAA,0BAAC,YAAA;AAAA,0BAAA;AAAA,4BAEC,OAAA,EAAS,MAAM,cAAA,CAAe,QAAQ,CAAA;AAAA,4BAErC,QAAA,EAAA,QAAA,CAAS;AAAA,2BAAA;AAAA,0BAHL,QAAA,CAAS;AAAA,yBAKjB;AAAA,uBAAA,EAAA,EAVkB,KAAA,CAAM,KAW3B,CACD;AAAA;AAAA,mBACH;AAAA,kCAEA,GAAA,CAAC,SAAA,EAAA,EAAU,WAAA,EAAY,UAAA,EAAW,WAAU,UAAA,EAAW,CAAA;AAAA,kCACvD,IAAA;AAAA,oBAAC,MAAA;AAAA,oBAAA;AAAA,sBACC,IAAA,EAAK,QAAA;AAAA,sBACL,OAAA,EAAQ,OAAA;AAAA,sBACR,IAAA,EAAK,IAAA;AAAA,sBACL,OAAA,EAAS,uBAAA;AAAA,sBACT,QAAA;AAAA,sBACA,SAAA,EAAU,gBAAA;AAAA,sBACV,KAAA,EAAM,gCAAA;AAAA,sBAEN,QAAA,EAAA;AAAA,wCAAA,GAAA,CAAC,OAAA,EAAA,EAAQ,WAAU,SAAA,EAAU,CAAA;AAAA,wCAC7B,GAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,SAAA,EAAW,QAAA,EAAA,gBAAA,EAAiB;AAAA;AAAA;AAAA;AAC9C,iBAAA,EACF,CAAA;AAAA,gBAGD,eAAA,oBACC,IAAA,CAAAA,QAAAA,EAAA,EACE,QAAA,EAAA;AAAA,kCAAA,GAAA,CAAC,SAAA,EAAA,EAAU,WAAA,EAAY,UAAA,EAAW,SAAA,EAAU,UAAA,EAAW,CAAA;AAAA,kCACvD,IAAA;AAAA,oBAAC,MAAA;AAAA,oBAAA;AAAA,sBACC,IAAA,EAAK,QAAA;AAAA,sBACL,OAAA,EAAS,cAAc,QAAA,GAAW,OAAA;AAAA,sBAClC,IAAA,EAAK,IAAA;AAAA,sBACL,OAAA,EAAS,eAAA;AAAA,sBACT,QAAA,EAAU,YAAY,CAAC,eAAA;AAAA,sBACvB,SAAA,EAAW,EAAA,CAAG,gBAAA,EAAkB,WAAA,IAAe,eAAe,CAAA;AAAA,sBAC9D,KAAA,EACE,CAAC,eAAA,GACG,kDAAA,GACA,cACE,gBAAA,GACA,iBAAA;AAAA,sBAGP,QAAA,EAAA;AAAA,wBAAA,WAAA,mBACC,GAAA,CAAC,UAAO,SAAA,EAAU,SAAA,EAAU,oBAE5B,GAAA,CAAC,GAAA,EAAA,EAAI,WAAU,SAAA,EAAU,CAAA;AAAA,4CAE1B,MAAA,EAAA,EAAK,SAAA,EAAU,SAAA,EACb,QAAA,EAAA,WAAA,GAAc,SAAS,SAAA,EAC1B;AAAA;AAAA;AAAA;AACF,iBAAA,EACF;AAAA;AAAA;AAAA,WAEJ;AAAA,0BAEA,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,iBAAA,EACZ,QAAA,EAAA;AAAA,YAAA,OAAA,IAAW,WAAA,oBACV,GAAA;AAAA,cAAC,KAAA;AAAA,cAAA;AAAA,gBACC,aAAA,EAAY,MAAA;AAAA,gBACZ,SAAA,EAAU,qEAAA;AAAA,gBAET,QAAA,EAAA;AAAA;AAAA,aACH;AAAA,4BAEF,GAAA;AAAA,cAAC,KAAA;AAAA,cAAA;AAAA,gBACC,GAAA,EAAK,SAAA;AAAA,gBACL,IAAA,EAAK,SAAA;AAAA,gBACL,gBAAA,EAAe,MAAA;AAAA,gBACf,cAAY,SAAA,IAAa,WAAA;AAAA,gBACzB,iBAAiB,CAAC,QAAA;AAAA,gBAClB,OAAA,EAAS,aAAA;AAAA,gBACT,SAAA,EAAW,EAAA;AAAA,kBACT,sDAAA;AAAA,kBACA,2BAAA;AAAA,kBACA,QAAA,IACE;AAAA,iBACJ;AAAA,gBACA,8BAAA,EAA8B;AAAA;AAAA;AAChC,WAAA,EACF;AAAA;AAAA;AAAA,KACF;AAAA,EAEJ;AACF;AAEA,cAAA,CAAe,WAAA,GAAc,gBAAA","file":"chunk-FJH7P5WG.js","sourcesContent":["/**\n * Converts spoken punctuation words (e.g. \"period\", \"comma\") into the\n * corresponding characters, using lightweight context heuristics so that words\n * like \"time period\" or \"the colon\" are left intact. Pure and side-effect free\n * so it can be unit tested independently of the editor.\n */\nexport function processDictation(text: string): string {\n let result = text;\n\n // \"period\" as a word vs. as punctuation.\n result = result.replace(\n /\\b(the|a|this|that|each|every|same|time|grace|trial|waiting|probationary|pay|billing|accounting)\\s+period\\b/gi,\n '$1 period'\n );\n result = result.replace(\n /\\bperiod\\s+(of|in|for|from|to|during|between|after|before|when|where|is|was|will|has|had)\\b/gi,\n 'period $1'\n );\n result = result.replace(/\\s+period(\\s*$)/gi, '.$1');\n result = result.replace(/\\s+period\\s+(?=[A-Z])/g, '. ');\n\n // \"comma\"\n result = result.replace(/\\bcomma\\s+(separated|delimited)/gi, 'comma $1');\n result = result.replace(/\\s+comma\\b/gi, ',');\n\n // \"colon\"\n result = result.replace(\n /\\b(the|a|my|your|his|her|their|semicolon|ascending|descending|transverse|sigmoid)\\s+colon\\b/gi,\n '$1 colon'\n );\n result = result.replace(\n /\\bcolon\\s+(cancer|surgery|health|polyp|scope|oscopy)/gi,\n 'colon $1'\n );\n result = result.replace(/\\s+colon\\b/gi, ':');\n\n // \"dash\"\n result = result.replace(\n /\\b(yard|meter|hundred|mad|quick|wild)\\s+dash\\b/gi,\n '$1 dash'\n );\n result = result.replace(/\\bdash\\s+(to|for|of)\\b/gi, 'dash $1');\n result = result.replace(/\\s+dash\\b/gi, ' -');\n\n const simplePunctuation: Record<string, string> = {\n ' full stop': '.',\n ' question mark': '?',\n ' exclamation point': '!',\n ' exclamation mark': '!',\n ' semicolon': ';',\n ' semi colon': ';',\n ' hyphen': '-',\n ' open parenthesis': ' (',\n ' close parenthesis': ')',\n ' open bracket': ' [',\n ' close bracket': ']',\n ' open quote': ' \"',\n ' close quote': '\"',\n ' quote': '\"',\n ' apostrophe': \"'\",\n ' new line': '\\n',\n ' newline': '\\n',\n ' new paragraph': '\\n\\n',\n ' tab': '\\t',\n };\n\n for (const [spoken, punctuation] of Object.entries(simplePunctuation)) {\n const regex = new RegExp(spoken, 'gi');\n result = result.replace(regex, punctuation);\n }\n\n // Capitalize after sentence-ending punctuation.\n result = result.replace(\n /([.!?])\\s+([a-z])/g,\n (_match, punct: string, letter: string) =>\n `${punct} ${letter.toUpperCase()}`\n );\n\n return result;\n}\n\n/**\n * Converts `<<field>>` (and the HTML-encoded `&lt;&lt;field&gt;&gt;`) syntax\n * into mustache `{{field}}` syntax. Pure helper operating on an HTML string.\n */\nexport function convertAngleBracketsToMustache(html: string): string {\n return html\n .replace(\n /&lt;&lt;([^&]*)&gt;&gt;/g,\n (_m, field: string) => `{{${field.trim()}}}`\n )\n .replace(/<<([^>]*)>>/g, (_m, field: string) => `{{${field.trim()}}}`);\n}\n\n/**\n * Returns true when an HTML string has no visible text content.\n * Note: This is a visibility check, not a sanitizer. It strips tags to inspect\n * remaining text — do NOT use this for XSS prevention.\n */\nexport { isHtmlEmpty } from '../../utils/html';\n","import * as React from 'react';\nimport {\n Bold,\n Italic,\n Underline,\n List,\n ListOrdered,\n AlignLeft,\n AlignCenter,\n AlignRight,\n Braces,\n Replace,\n Mic,\n MicOff,\n} from 'lucide-react';\nimport { cn } from '../../utils/cn';\nimport { Button } from '../Button';\nimport { Separator } from '../Separator';\nimport {\n Dropdown,\n DropdownItem,\n DropdownLabel,\n DropdownSeparator,\n} from '../Dropdown';\nimport {\n processDictation,\n convertAngleBracketsToMustache,\n isHtmlEmpty,\n} from './processDictation';\n\nexport interface RichTextVariable {\n /** Human-readable label shown in the variable menu. */\n label: string;\n /** The token displayed for the variable (e.g. `{{employee.name}}`). */\n value: string;\n /** Optional text inserted instead of `value` (e.g. an expanded group). */\n insertValue?: string;\n}\n\nexport interface RichTextVariableGroup {\n /** Group heading shown in the variable menu. */\n label: string;\n /** Variables belonging to the group. */\n variables: RichTextVariable[];\n}\n\nexport interface RichTextEditorProps {\n /** Current HTML value of the editor. */\n value: string;\n /** Called with the updated HTML whenever the content changes. */\n onChange: (value: string) => void;\n /** Placeholder shown when the editor is empty. */\n placeholder?: string;\n /** Additional class for the editor wrapper. */\n className?: string;\n /**\n * Variable groups for the \"Insert variable\" menu. When omitted the variable\n * menu and the `<< >>` → `{{ }}` convert button are hidden.\n */\n variableGroups?: RichTextVariableGroup[];\n /** Enable the speech-to-text dictation button. Defaults to true. */\n enableDictation?: boolean;\n /** Called when dictation cannot start (replaces native alerts). */\n onDictationError?: (message: string) => void;\n /** Disable editing and toolbar actions. */\n disabled?: boolean;\n /** Accessible label for the editable region. */\n 'aria-label'?: string;\n}\n\n// --- Minimal Web Speech API typings (absent from the standard DOM lib) ---\ninterface SpeechRecognitionAlternativeLike {\n transcript: string;\n}\ninterface SpeechRecognitionResultLike {\n isFinal: boolean;\n [index: number]: SpeechRecognitionAlternativeLike;\n}\ninterface SpeechRecognitionResultListLike {\n length: number;\n [index: number]: SpeechRecognitionResultLike;\n}\ninterface SpeechRecognitionEventLike {\n resultIndex: number;\n results: SpeechRecognitionResultListLike;\n}\ninterface SpeechRecognitionErrorEventLike {\n error: string;\n}\ninterface SpeechRecognitionLike {\n continuous: boolean;\n interimResults: boolean;\n lang: string;\n maxAlternatives: number;\n onstart: (() => void) | null;\n onresult: ((event: SpeechRecognitionEventLike) => void) | null;\n onerror: ((event: SpeechRecognitionErrorEventLike) => void) | null;\n onend: (() => void) | null;\n start: () => void;\n stop: () => void;\n}\ntype SpeechRecognitionCtor = new () => SpeechRecognitionLike;\ninterface SpeechWindow {\n SpeechRecognition?: SpeechRecognitionCtor;\n webkitSpeechRecognition?: SpeechRecognitionCtor;\n}\n\nfunction getSpeechRecognition(): SpeechRecognitionCtor | undefined {\n const w = window as unknown as SpeechWindow;\n return w.SpeechRecognition || w.webkitSpeechRecognition;\n}\n\n/**\n * A presentational rich-text editor with formatting, template-variable\n * insertion and optional speech-to-text dictation. Content is supplied and\n * surfaced via `value`/`onChange` so it can be wired to any store. The variable\n * menu is data-agnostic — pass `variableGroups` to populate it.\n */\nconst RichTextEditor = React.forwardRef<HTMLDivElement, RichTextEditorProps>(\n (\n {\n value,\n onChange,\n placeholder,\n className,\n variableGroups,\n enableDictation = true,\n onDictationError,\n disabled = false,\n 'aria-label': ariaLabel,\n },\n ref\n ) => {\n const editorRef = React.useRef<HTMLDivElement>(null);\n const [isListening, setIsListening] = React.useState(false);\n const [speechSupported, setSpeechSupported] = React.useState(false);\n const recognitionRef = React.useRef<SpeechRecognitionLike | null>(null);\n const isListeningRef = React.useRef(false);\n const shouldRestartRef = React.useRef(false);\n\n const hasVariables = Boolean(variableGroups && variableGroups.length > 0);\n const isEmpty = isHtmlEmpty(value);\n\n React.useImperativeHandle(ref, () => editorRef.current as HTMLDivElement);\n\n React.useEffect(() => {\n setSpeechSupported(Boolean(getSpeechRecognition()));\n }, []);\n\n React.useEffect(() => {\n return () => {\n if (recognitionRef.current) {\n shouldRestartRef.current = false;\n isListeningRef.current = false;\n recognitionRef.current.stop();\n }\n };\n }, []);\n\n React.useEffect(() => {\n if (editorRef.current && editorRef.current.innerHTML !== value) {\n editorRef.current.innerHTML = value;\n }\n }, [value]);\n\n const updateContent = () => {\n if (editorRef.current) onChange(editorRef.current.innerHTML);\n };\n\n const execCommand = (command: string) => {\n if (disabled) return;\n document.execCommand(command, false);\n editorRef.current?.focus();\n updateContent();\n };\n\n const handleConvertToMustache = () => {\n if (disabled || !editorRef.current) return;\n editorRef.current.innerHTML = convertAngleBracketsToMustache(\n editorRef.current.innerHTML\n );\n updateContent();\n };\n\n const insertVariable = (variable: RichTextVariable) => {\n if (disabled || !editorRef.current) return;\n editorRef.current.focus();\n const textToInsert = variable.insertValue ?? variable.value;\n\n const selection = window.getSelection();\n if (selection && selection.rangeCount > 0) {\n const range = selection.getRangeAt(0);\n range.deleteContents();\n if (textToInsert.includes('\\n')) {\n const fragment = document.createDocumentFragment();\n const lines = textToInsert.split('\\n');\n lines.forEach((line, index) => {\n fragment.appendChild(document.createTextNode(line));\n if (index < lines.length - 1) {\n fragment.appendChild(document.createElement('br'));\n }\n });\n range.insertNode(fragment);\n range.collapse(false);\n } else {\n const textNode = document.createTextNode(textToInsert);\n range.insertNode(textNode);\n range.setStartAfter(textNode);\n range.setEndAfter(textNode);\n }\n selection.removeAllRanges();\n selection.addRange(range);\n } else {\n editorRef.current.innerHTML += textToInsert.replace(/\\n/g, '<br>');\n }\n updateContent();\n };\n\n const reportError = (message: string) => {\n if (onDictationError) onDictationError(message);\n else if (typeof console !== 'undefined') console.warn(message);\n };\n\n const toggleDictation = async () => {\n const SpeechRecognition = getSpeechRecognition();\n if (!SpeechRecognition) return;\n\n if (isListening && recognitionRef.current) {\n shouldRestartRef.current = false;\n isListeningRef.current = false;\n recognitionRef.current.stop();\n setIsListening(false);\n return;\n }\n\n try {\n const stream = await navigator.mediaDevices.getUserMedia({\n audio: true,\n });\n stream.getTracks().forEach((track) => track.stop());\n } catch {\n reportError(\n 'Microphone access is required for dictation. Please allow microphone access in your browser settings and try again.'\n );\n return;\n }\n\n const recognition = new SpeechRecognition();\n recognition.continuous = true;\n recognition.interimResults = true;\n recognition.lang = 'en-US';\n recognition.maxAlternatives = 1;\n\n recognition.onstart = () => {\n setIsListening(true);\n isListeningRef.current = true;\n shouldRestartRef.current = true;\n };\n\n recognition.onresult = (event) => {\n let finalTranscript = '';\n for (let i = event.resultIndex; i < event.results.length; i++) {\n const result = event.results[i];\n if (result.isFinal) finalTranscript += result[0].transcript;\n }\n\n if (finalTranscript && editorRef.current) {\n const processedText = processDictation(finalTranscript);\n editorRef.current.focus();\n const selection = window.getSelection();\n if (selection && selection.rangeCount > 0) {\n const range = selection.getRangeAt(0);\n range.deleteContents();\n const textNode = document.createTextNode(processedText + ' ');\n range.insertNode(textNode);\n range.setStartAfter(textNode);\n range.setEndAfter(textNode);\n selection.removeAllRanges();\n selection.addRange(range);\n } else {\n editorRef.current.innerHTML += processedText + ' ';\n }\n updateContent();\n }\n };\n\n recognition.onerror = (event) => {\n if (event.error === 'no-speech' || event.error === 'aborted') return;\n if (event.error === 'not-allowed') {\n reportError(\n 'Microphone access was denied. Please allow microphone access in your browser settings and try again.'\n );\n shouldRestartRef.current = false;\n isListeningRef.current = false;\n setIsListening(false);\n return;\n }\n if (event.error === 'network') return;\n shouldRestartRef.current = false;\n isListeningRef.current = false;\n setIsListening(false);\n };\n\n recognition.onend = () => {\n if (shouldRestartRef.current && isListeningRef.current) {\n setTimeout(() => {\n if (shouldRestartRef.current && isListeningRef.current) {\n try {\n recognition.start();\n } catch {\n shouldRestartRef.current = false;\n isListeningRef.current = false;\n setIsListening(false);\n }\n }\n }, 100);\n } else {\n setIsListening(false);\n }\n };\n\n recognitionRef.current = recognition;\n try {\n recognition.start();\n } catch {\n reportError('Failed to start speech recognition. Please try again.');\n }\n };\n\n const iconButtonClass = 'h-8 w-8 p-0';\n\n return (\n <div\n data-slot=\"rich-text-editor\"\n className={cn(\n 'border-border bg-background flex flex-col overflow-hidden rounded-lg border',\n className\n )}\n >\n <div\n data-slot=\"rich-text-editor-toolbar\"\n className=\"border-border bg-muted/30 sticky top-0 z-10 flex flex-wrap items-center gap-1 border-b p-2\"\n >\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n onClick={() => execCommand('bold')}\n disabled={disabled}\n className={iconButtonClass}\n aria-label=\"Bold\"\n title=\"Bold\"\n >\n <Bold className=\"h-4 w-4\" />\n </Button>\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n onClick={() => execCommand('italic')}\n disabled={disabled}\n className={iconButtonClass}\n aria-label=\"Italic\"\n title=\"Italic\"\n >\n <Italic className=\"h-4 w-4\" />\n </Button>\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n onClick={() => execCommand('underline')}\n disabled={disabled}\n className={iconButtonClass}\n aria-label=\"Underline\"\n title=\"Underline\"\n >\n <Underline className=\"h-4 w-4\" />\n </Button>\n\n <Separator orientation=\"vertical\" className=\"mx-1 h-6\" />\n\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n onClick={() => execCommand('insertUnorderedList')}\n disabled={disabled}\n className={iconButtonClass}\n aria-label=\"Bullet list\"\n title=\"Bullet list\"\n >\n <List className=\"h-4 w-4\" />\n </Button>\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n onClick={() => execCommand('insertOrderedList')}\n disabled={disabled}\n className={iconButtonClass}\n aria-label=\"Numbered list\"\n title=\"Numbered list\"\n >\n <ListOrdered className=\"h-4 w-4\" />\n </Button>\n\n <Separator orientation=\"vertical\" className=\"mx-1 h-6\" />\n\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n onClick={() => execCommand('justifyLeft')}\n disabled={disabled}\n className={iconButtonClass}\n aria-label=\"Align left\"\n title=\"Align left\"\n >\n <AlignLeft className=\"h-4 w-4\" />\n </Button>\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n onClick={() => execCommand('justifyCenter')}\n disabled={disabled}\n className={iconButtonClass}\n aria-label=\"Align center\"\n title=\"Align center\"\n >\n <AlignCenter className=\"h-4 w-4\" />\n </Button>\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n onClick={() => execCommand('justifyRight')}\n disabled={disabled}\n className={iconButtonClass}\n aria-label=\"Align right\"\n title=\"Align right\"\n >\n <AlignRight className=\"h-4 w-4\" />\n </Button>\n\n {hasVariables && (\n <>\n <Separator orientation=\"vertical\" className=\"mx-1 h-6\" />\n <Dropdown\n placement=\"bottom-start\"\n width={240}\n searchable\n searchPlaceholder=\"Search variables…\"\n searchAriaLabel=\"Search template variables\"\n disabled={disabled}\n trigger={\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n className=\"h-8 gap-1 px-2\"\n disabled={disabled}\n title=\"Insert variable\"\n >\n <Braces className=\"h-4 w-4\" />\n <span className=\"text-xs\">Variables</span>\n </Button>\n }\n >\n {variableGroups!.map((group, groupIndex) => (\n <React.Fragment key={group.label}>\n {groupIndex > 0 && <DropdownSeparator />}\n <DropdownLabel>{group.label}</DropdownLabel>\n {group.variables.map((variable) => (\n <DropdownItem\n key={variable.value}\n onClick={() => insertVariable(variable)}\n >\n {variable.label}\n </DropdownItem>\n ))}\n </React.Fragment>\n ))}\n </Dropdown>\n\n <Separator orientation=\"vertical\" className=\"mx-1 h-6\" />\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n onClick={handleConvertToMustache}\n disabled={disabled}\n className=\"h-8 gap-1 px-2\"\n title=\"Convert <<field>> to {{field}}\"\n >\n <Replace className=\"h-4 w-4\" />\n <span className=\"text-xs\">{'<< >> to {{ }}'}</span>\n </Button>\n </>\n )}\n\n {enableDictation && (\n <>\n <Separator orientation=\"vertical\" className=\"mx-1 h-6\" />\n <Button\n type=\"button\"\n variant={isListening ? 'danger' : 'ghost'}\n size=\"sm\"\n onClick={toggleDictation}\n disabled={disabled || !speechSupported}\n className={cn('h-8 gap-1 px-2', isListening && 'animate-pulse')}\n title={\n !speechSupported\n ? 'Speech recognition not supported in this browser'\n : isListening\n ? 'Stop dictation'\n : 'Start dictation'\n }\n >\n {isListening ? (\n <MicOff className=\"h-4 w-4\" />\n ) : (\n <Mic className=\"h-4 w-4\" />\n )}\n <span className=\"text-xs\">\n {isListening ? 'Stop' : 'Dictate'}\n </span>\n </Button>\n </>\n )}\n </div>\n\n <div className=\"relative flex-1\">\n {isEmpty && placeholder && (\n <div\n aria-hidden=\"true\"\n className=\"text-muted-foreground pointer-events-none absolute top-0 left-0 p-4\"\n >\n {placeholder}\n </div>\n )}\n <div\n ref={editorRef}\n role=\"textbox\"\n aria-multiline=\"true\"\n aria-label={ariaLabel ?? placeholder}\n contentEditable={!disabled}\n onInput={updateContent}\n className={cn(\n 'min-h-[250px] overflow-y-auto p-4 focus:outline-none',\n 'prose prose-sm max-w-none',\n disabled &&\n 'bg-muted/20 cursor-not-allowed text-neutral-700 dark:text-neutral-300'\n )}\n suppressContentEditableWarning\n />\n </div>\n </div>\n );\n }\n);\n\nRichTextEditor.displayName = 'RichTextEditor';\n\nexport { RichTextEditor };\n"]}
1
+ {"version":3,"sources":["../src/components/RichTextEditor/processDictation.ts","../src/components/RichTextEditor/RichTextEditor.tsx"],"names":["Fragment"],"mappings":"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","file":"chunk-FTRGZOVJ.js","sourcesContent":["/**\n * Converts spoken punctuation words (e.g. \"period\", \"comma\") into the\n * corresponding characters, using lightweight context heuristics so that words\n * like \"time period\" or \"the colon\" are left intact. Pure and side-effect free\n * so it can be unit tested independently of the editor.\n */\nexport function processDictation(text: string): string {\n let result = text;\n\n // \"period\" as a word vs. as punctuation.\n result = result.replace(\n /\\b(the|a|this|that|each|every|same|time|grace|trial|waiting|probationary|pay|billing|accounting)\\s+period\\b/gi,\n '$1 period'\n );\n result = result.replace(\n /\\bperiod\\s+(of|in|for|from|to|during|between|after|before|when|where|is|was|will|has|had)\\b/gi,\n 'period $1'\n );\n result = result.replace(/\\s+period(\\s*$)/gi, '.$1');\n result = result.replace(/\\s+period\\s+(?=[A-Z])/g, '. ');\n\n // \"comma\"\n result = result.replace(/\\bcomma\\s+(separated|delimited)/gi, 'comma $1');\n result = result.replace(/\\s+comma\\b/gi, ',');\n\n // \"colon\"\n result = result.replace(\n /\\b(the|a|my|your|his|her|their|semicolon|ascending|descending|transverse|sigmoid)\\s+colon\\b/gi,\n '$1 colon'\n );\n result = result.replace(\n /\\bcolon\\s+(cancer|surgery|health|polyp|scope|oscopy)/gi,\n 'colon $1'\n );\n result = result.replace(/\\s+colon\\b/gi, ':');\n\n // \"dash\"\n result = result.replace(\n /\\b(yard|meter|hundred|mad|quick|wild)\\s+dash\\b/gi,\n '$1 dash'\n );\n result = result.replace(/\\bdash\\s+(to|for|of)\\b/gi, 'dash $1');\n result = result.replace(/\\s+dash\\b/gi, ' -');\n\n const simplePunctuation: Record<string, string> = {\n ' full stop': '.',\n ' question mark': '?',\n ' exclamation point': '!',\n ' exclamation mark': '!',\n ' semicolon': ';',\n ' semi colon': ';',\n ' hyphen': '-',\n ' open parenthesis': ' (',\n ' close parenthesis': ')',\n ' open bracket': ' [',\n ' close bracket': ']',\n ' open quote': ' \"',\n ' close quote': '\"',\n ' quote': '\"',\n ' apostrophe': \"'\",\n ' new line': '\\n',\n ' newline': '\\n',\n ' new paragraph': '\\n\\n',\n ' tab': '\\t',\n };\n\n for (const [spoken, punctuation] of Object.entries(simplePunctuation)) {\n const regex = new RegExp(spoken, 'gi');\n result = result.replace(regex, punctuation);\n }\n\n // Capitalize after sentence-ending punctuation.\n result = result.replace(\n /([.!?])\\s+([a-z])/g,\n (_match, punct: string, letter: string) =>\n `${punct} ${letter.toUpperCase()}`\n );\n\n return result;\n}\n\n/**\n * Converts `<<field>>` (and the HTML-encoded `&lt;&lt;field&gt;&gt;`) syntax\n * into mustache `{{field}}` syntax. Pure helper operating on an HTML string.\n */\nexport function convertAngleBracketsToMustache(html: string): string {\n return html\n .replace(\n /&lt;&lt;([^&]*)&gt;&gt;/g,\n (_m, field: string) => `{{${field.trim()}}}`\n )\n .replace(/<<([^>]*)>>/g, (_m, field: string) => `{{${field.trim()}}}`);\n}\n\n/**\n * Returns true when an HTML string has no visible text content.\n * Note: This is a visibility check, not a sanitizer. It strips tags to inspect\n * remaining text — do NOT use this for XSS prevention.\n */\nexport { isHtmlEmpty } from '../../utils/html';\n","import * as React from 'react';\nimport {\n Bold,\n Italic,\n Underline,\n List,\n ListOrdered,\n AlignLeft,\n AlignCenter,\n AlignRight,\n Braces,\n Replace,\n Mic,\n MicOff,\n} from 'lucide-react';\nimport { cn } from '../../utils/cn';\nimport { Button } from '../Button';\nimport { Separator } from '../Separator';\nimport {\n Dropdown,\n DropdownItem,\n DropdownLabel,\n DropdownSeparator,\n} from '../Dropdown';\nimport {\n processDictation,\n convertAngleBracketsToMustache,\n isHtmlEmpty,\n} from './processDictation';\n\nexport interface RichTextVariable {\n /** Human-readable label shown in the variable menu. */\n label: string;\n /** The token displayed for the variable (e.g. `{{employee.name}}`). */\n value: string;\n /** Optional text inserted instead of `value` (e.g. an expanded group). */\n insertValue?: string;\n}\n\nexport interface RichTextVariableGroup {\n /** Group heading shown in the variable menu. */\n label: string;\n /** Variables belonging to the group. */\n variables: RichTextVariable[];\n}\n\nexport interface RichTextEditorProps {\n /** Current HTML value of the editor. */\n value: string;\n /** Called with the updated HTML whenever the content changes. */\n onChange: (value: string) => void;\n /** Placeholder shown when the editor is empty. */\n placeholder?: string;\n /** Additional class for the editor wrapper. */\n className?: string;\n /**\n * Variable groups for the \"Insert variable\" menu. When omitted the variable\n * menu and the `<< >>` → `{{ }}` convert button are hidden.\n */\n variableGroups?: RichTextVariableGroup[];\n /** Enable the speech-to-text dictation button. Defaults to true. */\n enableDictation?: boolean;\n /** Called when dictation cannot start (replaces native alerts). */\n onDictationError?: (message: string) => void;\n /** Disable editing and toolbar actions. */\n disabled?: boolean;\n /** Accessible label for the editable region. */\n 'aria-label'?: string;\n}\n\n// --- Minimal Web Speech API typings (absent from the standard DOM lib) ---\ninterface SpeechRecognitionAlternativeLike {\n transcript: string;\n}\ninterface SpeechRecognitionResultLike {\n isFinal: boolean;\n [index: number]: SpeechRecognitionAlternativeLike;\n}\ninterface SpeechRecognitionResultListLike {\n length: number;\n [index: number]: SpeechRecognitionResultLike;\n}\ninterface SpeechRecognitionEventLike {\n resultIndex: number;\n results: SpeechRecognitionResultListLike;\n}\ninterface SpeechRecognitionErrorEventLike {\n error: string;\n}\ninterface SpeechRecognitionLike {\n continuous: boolean;\n interimResults: boolean;\n lang: string;\n maxAlternatives: number;\n onstart: (() => void) | null;\n onresult: ((event: SpeechRecognitionEventLike) => void) | null;\n onerror: ((event: SpeechRecognitionErrorEventLike) => void) | null;\n onend: (() => void) | null;\n start: () => void;\n stop: () => void;\n}\ntype SpeechRecognitionCtor = new () => SpeechRecognitionLike;\ninterface SpeechWindow {\n SpeechRecognition?: SpeechRecognitionCtor;\n webkitSpeechRecognition?: SpeechRecognitionCtor;\n}\n\nfunction getSpeechRecognition(): SpeechRecognitionCtor | undefined {\n const w = window as unknown as SpeechWindow;\n return w.SpeechRecognition || w.webkitSpeechRecognition;\n}\n\n/**\n * A presentational rich-text editor with formatting, template-variable\n * insertion and optional speech-to-text dictation. Content is supplied and\n * surfaced via `value`/`onChange` so it can be wired to any store. The variable\n * menu is data-agnostic — pass `variableGroups` to populate it.\n */\nconst RichTextEditor = React.forwardRef<HTMLDivElement, RichTextEditorProps>(\n (\n {\n value,\n onChange,\n placeholder,\n className,\n variableGroups,\n enableDictation = true,\n onDictationError,\n disabled = false,\n 'aria-label': ariaLabel,\n },\n ref\n ) => {\n const editorRef = React.useRef<HTMLDivElement>(null);\n const [isListening, setIsListening] = React.useState(false);\n const [speechSupported, setSpeechSupported] = React.useState(false);\n const recognitionRef = React.useRef<SpeechRecognitionLike | null>(null);\n const isListeningRef = React.useRef(false);\n const shouldRestartRef = React.useRef(false);\n\n const hasVariables = Boolean(variableGroups && variableGroups.length > 0);\n const isEmpty = isHtmlEmpty(value);\n\n React.useImperativeHandle(ref, () => editorRef.current as HTMLDivElement);\n\n React.useEffect(() => {\n setSpeechSupported(Boolean(getSpeechRecognition()));\n }, []);\n\n React.useEffect(() => {\n return () => {\n if (recognitionRef.current) {\n shouldRestartRef.current = false;\n isListeningRef.current = false;\n recognitionRef.current.stop();\n }\n };\n }, []);\n\n React.useEffect(() => {\n if (editorRef.current && editorRef.current.innerHTML !== value) {\n editorRef.current.innerHTML = value;\n }\n }, [value]);\n\n const updateContent = () => {\n if (editorRef.current) onChange(editorRef.current.innerHTML);\n };\n\n const execCommand = (command: string) => {\n if (disabled) return;\n document.execCommand(command, false);\n editorRef.current?.focus();\n updateContent();\n };\n\n const handleConvertToMustache = () => {\n if (disabled || !editorRef.current) return;\n editorRef.current.innerHTML = convertAngleBracketsToMustache(\n editorRef.current.innerHTML\n );\n updateContent();\n };\n\n const insertVariable = (variable: RichTextVariable) => {\n if (disabled || !editorRef.current) return;\n editorRef.current.focus();\n const textToInsert = variable.insertValue ?? variable.value;\n\n const selection = window.getSelection();\n if (selection && selection.rangeCount > 0) {\n const range = selection.getRangeAt(0);\n range.deleteContents();\n if (textToInsert.includes('\\n')) {\n const fragment = document.createDocumentFragment();\n const lines = textToInsert.split('\\n');\n lines.forEach((line, index) => {\n fragment.appendChild(document.createTextNode(line));\n if (index < lines.length - 1) {\n fragment.appendChild(document.createElement('br'));\n }\n });\n range.insertNode(fragment);\n range.collapse(false);\n } else {\n const textNode = document.createTextNode(textToInsert);\n range.insertNode(textNode);\n range.setStartAfter(textNode);\n range.setEndAfter(textNode);\n }\n selection.removeAllRanges();\n selection.addRange(range);\n } else {\n editorRef.current.innerHTML += textToInsert.replace(/\\n/g, '<br>');\n }\n updateContent();\n };\n\n const reportError = (message: string) => {\n if (onDictationError) onDictationError(message);\n else if (typeof console !== 'undefined') console.warn(message);\n };\n\n const toggleDictation = async () => {\n const SpeechRecognition = getSpeechRecognition();\n if (!SpeechRecognition) return;\n\n if (isListening && recognitionRef.current) {\n shouldRestartRef.current = false;\n isListeningRef.current = false;\n recognitionRef.current.stop();\n setIsListening(false);\n return;\n }\n\n try {\n const stream = await navigator.mediaDevices.getUserMedia({\n audio: true,\n });\n stream.getTracks().forEach((track) => track.stop());\n } catch {\n reportError(\n 'Microphone access is required for dictation. Please allow microphone access in your browser settings and try again.'\n );\n return;\n }\n\n const recognition = new SpeechRecognition();\n recognition.continuous = true;\n recognition.interimResults = true;\n recognition.lang = 'en-US';\n recognition.maxAlternatives = 1;\n\n recognition.onstart = () => {\n setIsListening(true);\n isListeningRef.current = true;\n shouldRestartRef.current = true;\n };\n\n recognition.onresult = (event) => {\n let finalTranscript = '';\n for (let i = event.resultIndex; i < event.results.length; i++) {\n const result = event.results[i];\n if (result.isFinal) finalTranscript += result[0].transcript;\n }\n\n if (finalTranscript && editorRef.current) {\n const processedText = processDictation(finalTranscript);\n editorRef.current.focus();\n const selection = window.getSelection();\n if (selection && selection.rangeCount > 0) {\n const range = selection.getRangeAt(0);\n range.deleteContents();\n const textNode = document.createTextNode(processedText + ' ');\n range.insertNode(textNode);\n range.setStartAfter(textNode);\n range.setEndAfter(textNode);\n selection.removeAllRanges();\n selection.addRange(range);\n } else {\n editorRef.current.innerHTML += processedText + ' ';\n }\n updateContent();\n }\n };\n\n recognition.onerror = (event) => {\n if (event.error === 'no-speech' || event.error === 'aborted') return;\n if (event.error === 'not-allowed') {\n reportError(\n 'Microphone access was denied. Please allow microphone access in your browser settings and try again.'\n );\n shouldRestartRef.current = false;\n isListeningRef.current = false;\n setIsListening(false);\n return;\n }\n if (event.error === 'network') return;\n shouldRestartRef.current = false;\n isListeningRef.current = false;\n setIsListening(false);\n };\n\n recognition.onend = () => {\n if (shouldRestartRef.current && isListeningRef.current) {\n setTimeout(() => {\n if (shouldRestartRef.current && isListeningRef.current) {\n try {\n recognition.start();\n } catch {\n shouldRestartRef.current = false;\n isListeningRef.current = false;\n setIsListening(false);\n }\n }\n }, 100);\n } else {\n setIsListening(false);\n }\n };\n\n recognitionRef.current = recognition;\n try {\n recognition.start();\n } catch {\n reportError('Failed to start speech recognition. Please try again.');\n }\n };\n\n const iconButtonClass = 'h-8 w-8 p-0';\n\n return (\n <div\n data-slot=\"rich-text-editor\"\n className={cn(\n 'border-border bg-background flex flex-col overflow-hidden rounded-lg border',\n className\n )}\n >\n <div\n data-slot=\"rich-text-editor-toolbar\"\n className=\"border-border bg-muted/30 sticky top-0 z-10 flex flex-wrap items-center gap-1 border-b p-2\"\n >\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n onClick={() => execCommand('bold')}\n disabled={disabled}\n className={iconButtonClass}\n aria-label=\"Bold\"\n title=\"Bold\"\n >\n <Bold className=\"h-4 w-4\" />\n </Button>\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n onClick={() => execCommand('italic')}\n disabled={disabled}\n className={iconButtonClass}\n aria-label=\"Italic\"\n title=\"Italic\"\n >\n <Italic className=\"h-4 w-4\" />\n </Button>\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n onClick={() => execCommand('underline')}\n disabled={disabled}\n className={iconButtonClass}\n aria-label=\"Underline\"\n title=\"Underline\"\n >\n <Underline className=\"h-4 w-4\" />\n </Button>\n\n <Separator orientation=\"vertical\" className=\"mx-1 h-6\" />\n\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n onClick={() => execCommand('insertUnorderedList')}\n disabled={disabled}\n className={iconButtonClass}\n aria-label=\"Bullet list\"\n title=\"Bullet list\"\n >\n <List className=\"h-4 w-4\" />\n </Button>\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n onClick={() => execCommand('insertOrderedList')}\n disabled={disabled}\n className={iconButtonClass}\n aria-label=\"Numbered list\"\n title=\"Numbered list\"\n >\n <ListOrdered className=\"h-4 w-4\" />\n </Button>\n\n <Separator orientation=\"vertical\" className=\"mx-1 h-6\" />\n\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n onClick={() => execCommand('justifyLeft')}\n disabled={disabled}\n className={iconButtonClass}\n aria-label=\"Align left\"\n title=\"Align left\"\n >\n <AlignLeft className=\"h-4 w-4\" />\n </Button>\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n onClick={() => execCommand('justifyCenter')}\n disabled={disabled}\n className={iconButtonClass}\n aria-label=\"Align center\"\n title=\"Align center\"\n >\n <AlignCenter className=\"h-4 w-4\" />\n </Button>\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n onClick={() => execCommand('justifyRight')}\n disabled={disabled}\n className={iconButtonClass}\n aria-label=\"Align right\"\n title=\"Align right\"\n >\n <AlignRight className=\"h-4 w-4\" />\n </Button>\n\n {hasVariables && (\n <>\n <Separator orientation=\"vertical\" className=\"mx-1 h-6\" />\n <Dropdown\n placement=\"bottom-start\"\n width={240}\n searchable\n searchPlaceholder=\"Search variables…\"\n searchAriaLabel=\"Search template variables\"\n disabled={disabled}\n trigger={\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n className=\"h-8 gap-1 px-2\"\n disabled={disabled}\n title=\"Insert variable\"\n >\n <Braces className=\"h-4 w-4\" />\n <span className=\"text-xs\">Variables</span>\n </Button>\n }\n >\n {variableGroups!.map((group, groupIndex) => (\n <React.Fragment key={group.label}>\n {groupIndex > 0 && <DropdownSeparator />}\n <DropdownLabel>{group.label}</DropdownLabel>\n {group.variables.map((variable) => (\n <DropdownItem\n key={variable.value}\n onClick={() => insertVariable(variable)}\n >\n {variable.label}\n </DropdownItem>\n ))}\n </React.Fragment>\n ))}\n </Dropdown>\n\n <Separator orientation=\"vertical\" className=\"mx-1 h-6\" />\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n onClick={handleConvertToMustache}\n disabled={disabled}\n className=\"h-8 gap-1 px-2\"\n title=\"Convert <<field>> to {{field}}\"\n >\n <Replace className=\"h-4 w-4\" />\n <span className=\"text-xs\">{'<< >> to {{ }}'}</span>\n </Button>\n </>\n )}\n\n {enableDictation && (\n <>\n <Separator orientation=\"vertical\" className=\"mx-1 h-6\" />\n <Button\n type=\"button\"\n variant={isListening ? 'danger' : 'ghost'}\n size=\"sm\"\n onClick={toggleDictation}\n disabled={disabled || !speechSupported}\n className={cn('h-8 gap-1 px-2', isListening && 'animate-pulse')}\n title={\n !speechSupported\n ? 'Speech recognition not supported in this browser'\n : isListening\n ? 'Stop dictation'\n : 'Start dictation'\n }\n >\n {isListening ? (\n <MicOff className=\"h-4 w-4\" />\n ) : (\n <Mic className=\"h-4 w-4\" />\n )}\n <span className=\"text-xs\">\n {isListening ? 'Stop' : 'Dictate'}\n </span>\n </Button>\n </>\n )}\n </div>\n\n <div className=\"relative flex-1\">\n {isEmpty && placeholder && (\n <div\n aria-hidden=\"true\"\n className=\"text-muted-foreground pointer-events-none absolute top-0 left-0 p-4\"\n >\n {placeholder}\n </div>\n )}\n <div\n ref={editorRef}\n role=\"textbox\"\n aria-multiline=\"true\"\n aria-label={ariaLabel ?? placeholder}\n contentEditable={!disabled}\n onInput={updateContent}\n className={cn(\n 'min-h-[250px] overflow-y-auto p-4 focus:outline-none',\n 'prose prose-sm max-w-none',\n disabled &&\n 'bg-muted/20 cursor-not-allowed text-neutral-700 dark:text-neutral-300'\n )}\n suppressContentEditableWarning\n />\n </div>\n </div>\n );\n }\n);\n\nRichTextEditor.displayName = 'RichTextEditor';\n\nexport { RichTextEditor };\n"]}
@@ -1,6 +1,37 @@
1
- import { useCallback, useEffect, useState, useRef } from 'react';
1
+ import { useState, useEffect, useCallback, useRef } from 'react';
2
2
 
3
- // src/hooks/useKeyboardShortcut.ts
3
+ // src/hooks/useDirection.ts
4
+ var RTL_LOCALES = ["ar", "he", "fa", "ur"];
5
+ function isRtlLocale(locale) {
6
+ const lang = locale.toLowerCase().split(/[-_]/)[0];
7
+ return RTL_LOCALES.includes(lang);
8
+ }
9
+ function resolveDirection(element) {
10
+ if (typeof document === "undefined") return "ltr";
11
+ const target = element ?? document.documentElement;
12
+ return getComputedStyle(target).direction === "rtl" ? "rtl" : "ltr";
13
+ }
14
+ function useDirection(elementRef) {
15
+ const [direction, setDirection] = useState(
16
+ () => resolveDirection(elementRef?.current)
17
+ );
18
+ useEffect(() => {
19
+ const update = () => setDirection(resolveDirection(elementRef?.current));
20
+ update();
21
+ const observer = new MutationObserver(update);
22
+ observer.observe(document.documentElement, {
23
+ attributes: true,
24
+ attributeFilter: ["dir"],
25
+ subtree: true
26
+ });
27
+ return () => observer.disconnect();
28
+ }, [elementRef]);
29
+ const currentElement = elementRef?.current ?? null;
30
+ useEffect(() => {
31
+ setDirection(resolveDirection(currentElement));
32
+ }, [currentElement]);
33
+ return direction;
34
+ }
4
35
  function useKeyboardShortcut(key, callback, options = {}) {
5
36
  const {
6
37
  enabled = true,
@@ -177,6 +208,6 @@ function useScrollSpy({
177
208
  return { activeId };
178
209
  }
179
210
 
180
- export { useCommandK, useIsDesktop, useIsLargeDesktop, useIsMobile, useIsMobileOrTablet, useIsSmallTablet, useIsTablet, useKeyboardShortcut, useMediaQuery, useScrollSpy };
181
- //# sourceMappingURL=chunk-ZGSC2CB2.js.map
182
- //# sourceMappingURL=chunk-ZGSC2CB2.js.map
211
+ export { RTL_LOCALES, isRtlLocale, useCommandK, useDirection, useIsDesktop, useIsLargeDesktop, useIsMobile, useIsMobileOrTablet, useIsSmallTablet, useIsTablet, useKeyboardShortcut, useMediaQuery, useScrollSpy };
212
+ //# sourceMappingURL=chunk-GTHNWP4P.js.map
213
+ //# sourceMappingURL=chunk-GTHNWP4P.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/hooks/useDirection.ts","../src/hooks/useKeyboardShortcut.ts","../src/hooks/useMediaQuery.ts","../src/hooks/useScrollSpy.ts"],"names":["useEffect","useState","entries"],"mappings":"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","file":"chunk-GTHNWP4P.js","sourcesContent":["import { useState, useEffect } from 'react';\nimport type { RefObject } from 'react';\n\nexport type Direction = 'ltr' | 'rtl';\n\n/** Locales whose primary script reads right-to-left. */\nexport const RTL_LOCALES = ['ar', 'he', 'fa', 'ur'] as const;\n\n/**\n * Returns true when the given locale (e.g. `ar`, `ar-SA`, `he_IL`) uses a\n * right-to-left script.\n */\nexport function isRtlLocale(locale: string): boolean {\n const lang = locale.toLowerCase().split(/[-_]/)[0];\n return (RTL_LOCALES as readonly string[]).includes(lang);\n}\n\nfunction resolveDirection(element?: HTMLElement | null): Direction {\n if (typeof document === 'undefined') return 'ltr';\n const target = element ?? document.documentElement;\n return getComputedStyle(target).direction === 'rtl' ? 'rtl' : 'ltr';\n}\n\n/**\n * Hook returning the effective text direction (`ltr` | `rtl`) inherited from\n * the nearest `dir` attribute — zero setup for consumers who set\n * `<html dir=\"rtl\">`.\n *\n * Use for JS-level direction logic that CSS logical properties can't cover:\n * inverting ArrowLeft/ArrowRight keyboard handling, popover/toast placement,\n * drag math, etc.\n *\n * @param elementRef - Optional ref; when provided, direction is resolved from\n * that element (respecting any local `dir` override) instead of `<html>`.\n *\n * @example\n * ```tsx\n * const direction = useDirection();\n * const nextKey = direction === 'rtl' ? 'ArrowLeft' : 'ArrowRight';\n * ```\n */\nexport function useDirection(\n elementRef?: RefObject<HTMLElement | null>\n): Direction {\n const [direction, setDirection] = useState<Direction>(() =>\n resolveDirection(elementRef?.current)\n );\n\n useEffect(() => {\n const update = () => setDirection(resolveDirection(elementRef?.current));\n update();\n // dir changes are rare; observing the whole tree for just this attribute is cheap.\n const observer = new MutationObserver(update);\n observer.observe(document.documentElement, {\n attributes: true,\n attributeFilter: ['dir'],\n subtree: true,\n });\n return () => observer.disconnect();\n }, [elementRef]);\n\n // Re-sync when a re-render points elementRef.current at a different node:\n // the MutationObserver only fires on `dir` attribute mutations, so a swapped\n // ref target with a different inherited direction would otherwise go stale.\n const currentElement = elementRef?.current ?? null;\n useEffect(() => {\n setDirection(resolveDirection(currentElement));\n }, [currentElement]);\n\n return direction;\n}\n","import { useEffect, useCallback } from 'react';\n\n/**\n * Options for keyboard shortcut hook\n */\nexport interface KeyboardShortcutOptions {\n /** Whether the shortcut is currently enabled (default: true) */\n enabled?: boolean;\n /** Modifier keys required (default: none) */\n modifiers?: {\n ctrl?: boolean;\n shift?: boolean;\n alt?: boolean;\n meta?: boolean;\n };\n /** Whether to prevent default browser behavior (default: true) */\n preventDefault?: boolean;\n /** Whether to stop event propagation (default: false) */\n stopPropagation?: boolean;\n /** Element types to ignore when the shortcut is pressed (default: ['INPUT', 'TEXTAREA', 'SELECT']) */\n ignoreInputs?: boolean;\n}\n\n/**\n * Hook that triggers a callback when a specific keyboard shortcut is pressed.\n * Supports modifier keys (Ctrl, Shift, Alt, Meta) and ignores input fields by default.\n *\n * @param key - The key to listen for (e.g., 'k', 'Enter', 'Escape', '/')\n * @param callback - Function to call when the shortcut is pressed\n * @param options - Configuration options\n *\n * @example\n * ```tsx\n * // Cmd/Ctrl+K to open search\n * useKeyboardShortcut('k', openSearch, { modifiers: { meta: true, ctrl: true } });\n *\n * // Forward slash to focus search (ignoring when typing)\n * useKeyboardShortcut('/', focusSearch);\n *\n * // Escape to close modal\n * useKeyboardShortcut('Escape', closeModal);\n * ```\n */\nexport function useKeyboardShortcut(\n key: string,\n callback: (event: KeyboardEvent) => void,\n options: KeyboardShortcutOptions = {}\n): void {\n const {\n enabled = true,\n modifiers = {},\n preventDefault = true,\n stopPropagation = false,\n ignoreInputs = true,\n } = options;\n\n const handleKeyDown = useCallback(\n (event: KeyboardEvent) => {\n // Check if we should ignore input fields\n if (ignoreInputs) {\n const target = event.target as HTMLElement;\n const tagName = target.tagName.toUpperCase();\n if (\n tagName === 'INPUT' ||\n tagName === 'TEXTAREA' ||\n tagName === 'SELECT' ||\n target.isContentEditable\n ) {\n return;\n }\n }\n\n // Check modifiers\n const { ctrl, shift, alt, meta } = modifiers;\n\n // For Cmd+K style shortcuts, allow either meta (Mac) or ctrl (Windows/Linux)\n const metaOrCtrl = meta || ctrl;\n if (metaOrCtrl) {\n if (!(event.metaKey || event.ctrlKey)) return;\n } else {\n // If no meta/ctrl modifier specified, ensure neither is pressed\n if (event.metaKey || event.ctrlKey) return;\n }\n\n if (shift && !event.shiftKey) return;\n if (alt && !event.altKey) return;\n\n // Check key match (case-insensitive for letters)\n const eventKey =\n event.key.length === 1 ? event.key.toLowerCase() : event.key;\n const targetKey = key.length === 1 ? key.toLowerCase() : key;\n if (eventKey !== targetKey) return;\n\n if (preventDefault) {\n event.preventDefault();\n }\n if (stopPropagation) {\n event.stopPropagation();\n }\n\n callback(event);\n },\n [key, callback, modifiers, preventDefault, stopPropagation, ignoreInputs]\n );\n\n useEffect(() => {\n if (!enabled) return;\n\n document.addEventListener('keydown', handleKeyDown);\n return () => document.removeEventListener('keydown', handleKeyDown);\n }, [handleKeyDown, enabled]);\n}\n\n/**\n * Hook for the common Cmd/Ctrl+K shortcut pattern (command palette, search, etc.)\n *\n * @param callback - Function to call when Cmd/Ctrl+K is pressed\n * @param enabled - Whether the shortcut is active (default: true)\n *\n * @example\n * ```tsx\n * useCommandK(() => setIsOpen(true));\n * ```\n */\nexport function useCommandK(callback: () => void, enabled = true): void {\n useKeyboardShortcut('k', callback, {\n enabled,\n modifiers: { meta: true, ctrl: true },\n ignoreInputs: false, // Cmd+K should work even in inputs\n });\n}\n","import { useState, useEffect } from 'react';\n\n/**\n * Hook that tracks whether a media query matches.\n * Uses the native `matchMedia` API for efficient media query tracking.\n *\n * @param query - CSS media query string (e.g., '(min-width: 768px)')\n * @returns Boolean indicating whether the media query matches\n *\n * @example\n * ```tsx\n * function ResponsiveComponent() {\n * const isMobile = useMediaQuery('(max-width: 767px)');\n * const isTablet = useMediaQuery('(min-width: 768px) and (max-width: 1023px)');\n * const isDesktop = useMediaQuery('(min-width: 1024px)');\n *\n * return (\n * <div>\n * {isMobile && <MobileLayout />}\n * {isTablet && <TabletLayout />}\n * {isDesktop && <DesktopLayout />}\n * </div>\n * );\n * }\n * ```\n */\nexport function useMediaQuery(query: string): boolean {\n // Initialize with null to indicate SSR/initial state\n const [matches, setMatches] = useState<boolean>(() => {\n // Check if we're in a browser environment\n if (typeof window === 'undefined') return false;\n return window.matchMedia(query).matches;\n });\n\n useEffect(() => {\n if (typeof window === 'undefined') return;\n\n const mediaQuery = window.matchMedia(query);\n\n // Set initial value\n setMatches(mediaQuery.matches);\n\n // Handler for media query changes\n const handler = (event: MediaQueryListEvent) => {\n setMatches(event.matches);\n };\n\n // Modern browsers use addEventListener\n if (mediaQuery.addEventListener) {\n mediaQuery.addEventListener('change', handler);\n return () => mediaQuery.removeEventListener('change', handler);\n }\n\n // Fallback for older browsers\n mediaQuery.addListener(handler);\n return () => mediaQuery.removeListener(handler);\n }, [query]);\n\n return matches;\n}\n\n/**\n * Preset breakpoint hooks following common responsive design patterns\n */\n\n/** Returns true when viewport is smaller than 640px (mobile) */\nexport function useIsMobile(): boolean {\n return useMediaQuery('(max-width: 639px)');\n}\n\n/** Returns true when viewport is 640px-767px (large mobile / small tablet) */\nexport function useIsSmallTablet(): boolean {\n return useMediaQuery('(min-width: 640px) and (max-width: 767px)');\n}\n\n/** Returns true when viewport is 768px-1023px (tablet) */\nexport function useIsTablet(): boolean {\n return useMediaQuery('(min-width: 768px) and (max-width: 1023px)');\n}\n\n/** Returns true when viewport is 1024px or larger (desktop) */\nexport function useIsDesktop(): boolean {\n return useMediaQuery('(min-width: 1024px)');\n}\n\n/** Returns true when viewport is 1280px or larger (large desktop) */\nexport function useIsLargeDesktop(): boolean {\n return useMediaQuery('(min-width: 1280px)');\n}\n\n/** Returns true when viewport is smaller than 1024px (mobile/tablet) */\nexport function useIsMobileOrTablet(): boolean {\n return useMediaQuery('(max-width: 1023px)');\n}\n","import { useEffect, useState, useRef, type RefObject } from 'react';\n\n// =============================================================================\n// Types\n// =============================================================================\n\nexport interface UseScrollSpyOptions {\n /** CSS selector for the elements to observe (e.g. 'h2, h3, h4') */\n selectors?: string;\n /** Explicit list of element IDs to observe (alternative to selectors) */\n ids?: string[];\n /** IntersectionObserver root margin (default: '0px 0px -60% 0px') */\n rootMargin?: string;\n /** IntersectionObserver threshold (default: 0) */\n threshold?: number | number[];\n /** Scroll container element ref. Defaults to document viewport. */\n root?: RefObject<HTMLElement | null>;\n /** Whether the hook is active (default: true) */\n enabled?: boolean;\n}\n\nexport interface UseScrollSpyReturn {\n /** The ID of the currently active (in-view) element */\n activeId: string | null;\n}\n\n// =============================================================================\n// Hook\n// =============================================================================\n\n/**\n * Tracks which section is currently in the viewport using IntersectionObserver.\n * Pairs naturally with `TableOfContents` to highlight the active heading.\n *\n * @example\n * ```tsx\n * function DocsPage() {\n * const { activeId } = useScrollSpy({ selectors: 'h2, h3' });\n * return (\n * <aside>\n * <TableOfContents activeId={activeId} />\n * </aside>\n * );\n * }\n * ```\n */\nexport function useScrollSpy({\n selectors,\n ids,\n rootMargin = '0px 0px -60% 0px',\n threshold = 0,\n root,\n enabled = true,\n}: UseScrollSpyOptions = {}): UseScrollSpyReturn {\n const [activeId, setActiveId] = useState<string | null>(null);\n const visibleEntries = useRef<Map<string, IntersectionObserverEntry>>(\n new Map()\n );\n\n // Track root.current so the effect re-runs when the ref attaches\n const rootEl = root?.current ?? null;\n\n useEffect(() => {\n if (!enabled) return;\n\n const container = rootEl ?? document;\n\n // Resolve target elements from the DOM\n function resolveElements(): Element[] {\n let els: Element[] = [];\n if (ids && ids.length > 0) {\n els = ids\n .map((id) => document.getElementById(id))\n .filter((el): el is HTMLElement => el !== null);\n } else if (selectors) {\n els = Array.from(container.querySelectorAll(selectors));\n }\n return els.filter((el) => el.id);\n }\n\n let intersectionObserver: IntersectionObserver | null = null;\n let mutationObserver: MutationObserver | null = null;\n\n function startObserving(): boolean {\n const elements = resolveElements();\n if (elements.length === 0) return false;\n\n intersectionObserver = new IntersectionObserver(\n (entries) => {\n for (const entry of entries) {\n if (entry.isIntersecting) {\n visibleEntries.current.set(entry.target.id, entry);\n } else {\n visibleEntries.current.delete(entry.target.id);\n }\n }\n\n // Pick the topmost visible heading (by DOM order)\n if (visibleEntries.current.size > 0) {\n let topmost: string | null = null;\n let topmostTop = Infinity;\n\n for (const [id, entry] of visibleEntries.current) {\n const top = entry.boundingClientRect.top;\n if (top < topmostTop) {\n topmostTop = top;\n topmost = id;\n }\n }\n\n if (topmost) {\n setActiveId(topmost);\n }\n }\n },\n {\n root: rootEl,\n rootMargin,\n threshold,\n }\n );\n\n for (const el of elements) {\n intersectionObserver.observe(el);\n }\n\n // Elements found — stop watching for new DOM nodes\n mutationObserver?.disconnect();\n mutationObserver = null;\n return true;\n }\n\n // If target elements don't exist yet (e.g. headings mount after ToC),\n // watch for DOM changes and retry until they appear.\n if (!startObserving()) {\n const watchRoot = rootEl ?? document.body;\n mutationObserver = new MutationObserver(() => {\n startObserving();\n });\n mutationObserver.observe(watchRoot, { childList: true, subtree: true });\n }\n\n const entries = visibleEntries.current;\n return () => {\n mutationObserver?.disconnect();\n intersectionObserver?.disconnect();\n entries.clear();\n };\n }, [selectors, ids, rootMargin, threshold, rootEl, enabled]);\n\n return { activeId };\n}\n"]}
@@ -1,7 +1,7 @@
1
1
  'use strict';
2
2
 
3
- var chunkA2QVQF54_cjs = require('./chunk-A2QVQF54.cjs');
4
- var chunkOR5DRJCW_cjs = require('./chunk-OR5DRJCW.cjs');
3
+ var chunkRDGRKYQ5_cjs = require('./chunk-RDGRKYQ5.cjs');
4
+ var chunkS5RVSXDV_cjs = require('./chunk-S5RVSXDV.cjs');
5
5
  var React = require('react');
6
6
  var lucideReact = require('lucide-react');
7
7
  var jsxRuntime = require('react/jsx-runtime');
@@ -145,7 +145,7 @@ var FloatingWindow = React__namespace.forwardRef(
145
145
  "aria-modal": draggable ? void 0 : true,
146
146
  "aria-labelledby": typeof title === "string" ? titleId : void 0,
147
147
  "aria-label": typeof title === "string" ? void 0 : ariaLabel,
148
- className: chunkOR5DRJCW_cjs.cn(
148
+ className: chunkS5RVSXDV_cjs.cn(
149
149
  "bg-card text-card-foreground relative flex flex-col overflow-hidden rounded-lg shadow-2xl",
150
150
  draggable && "border-primary-800 fixed border-2",
151
151
  className
@@ -169,7 +169,7 @@ var FloatingWindow = React__namespace.forwardRef(
169
169
  "div",
170
170
  {
171
171
  "aria-hidden": "true",
172
- className: chunkOR5DRJCW_cjs.cn("absolute z-10", handle.className),
172
+ className: chunkS5RVSXDV_cjs.cn("absolute z-10", handle.className),
173
173
  onMouseDown: (e) => handleResizeStart(e, handle.dir)
174
174
  },
175
175
  handle.dir
@@ -195,7 +195,7 @@ var FloatingWindow = React__namespace.forwardRef(
195
195
  "div",
196
196
  {
197
197
  "data-slot": "floating-window-header",
198
- className: chunkOR5DRJCW_cjs.cn(
198
+ className: chunkS5RVSXDV_cjs.cn(
199
199
  "bg-primary-800 text-primary-foreground flex items-center justify-between rounded-t-lg px-4 py-3",
200
200
  draggable && "cursor-move"
201
201
  ),
@@ -211,7 +211,7 @@ var FloatingWindow = React__namespace.forwardRef(
211
211
  ),
212
212
  /* @__PURE__ */ jsxRuntime.jsxs("div", { "data-window-controls": true, className: "flex items-center gap-1", children: [
213
213
  onMinimize && /* @__PURE__ */ jsxRuntime.jsx(
214
- chunkA2QVQF54_cjs.Button,
214
+ chunkRDGRKYQ5_cjs.Button,
215
215
  {
216
216
  type: "button",
217
217
  variant: "ghost",
@@ -224,7 +224,7 @@ var FloatingWindow = React__namespace.forwardRef(
224
224
  }
225
225
  ),
226
226
  onPopOut && /* @__PURE__ */ jsxRuntime.jsx(
227
- chunkA2QVQF54_cjs.Button,
227
+ chunkRDGRKYQ5_cjs.Button,
228
228
  {
229
229
  type: "button",
230
230
  variant: "ghost",
@@ -237,7 +237,7 @@ var FloatingWindow = React__namespace.forwardRef(
237
237
  }
238
238
  ),
239
239
  /* @__PURE__ */ jsxRuntime.jsx(
240
- chunkA2QVQF54_cjs.Button,
240
+ chunkRDGRKYQ5_cjs.Button,
241
241
  {
242
242
  type: "button",
243
243
  variant: "ghost",
@@ -292,13 +292,13 @@ var MinimizedWindow = React__namespace.forwardRef(
292
292
  {
293
293
  ref,
294
294
  "data-slot": "minimized-window",
295
- className: chunkOR5DRJCW_cjs.cn(
295
+ className: chunkS5RVSXDV_cjs.cn(
296
296
  "border-border bg-card flex min-w-[200px] items-center gap-2 rounded-lg border px-3 py-2 shadow-md",
297
297
  className
298
298
  ),
299
299
  children: [
300
300
  /* @__PURE__ */ jsxRuntime.jsxs(
301
- chunkA2QVQF54_cjs.Button,
301
+ chunkRDGRKYQ5_cjs.Button,
302
302
  {
303
303
  type: "button",
304
304
  variant: "ghost",
@@ -312,7 +312,7 @@ var MinimizedWindow = React__namespace.forwardRef(
312
312
  }
313
313
  ),
314
314
  /* @__PURE__ */ jsxRuntime.jsx(
315
- chunkA2QVQF54_cjs.Button,
315
+ chunkRDGRKYQ5_cjs.Button,
316
316
  {
317
317
  type: "button",
318
318
  variant: "ghost",
@@ -332,5 +332,5 @@ MinimizedWindow.displayName = "MinimizedWindow";
332
332
 
333
333
  exports.FloatingWindow = FloatingWindow;
334
334
  exports.MinimizedWindow = MinimizedWindow;
335
- //# sourceMappingURL=chunk-44CK4CT2.cjs.map
336
- //# sourceMappingURL=chunk-44CK4CT2.cjs.map
335
+ //# sourceMappingURL=chunk-H7QSGFMZ.cjs.map
336
+ //# sourceMappingURL=chunk-H7QSGFMZ.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/components/FloatingWindow/FloatingWindow.tsx"],"names":["React","jsxs","cn","jsx","Button","Minus","ExternalLink","X","Square"],"mappings":"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","file":"chunk-44CK4CT2.cjs","sourcesContent":["import * as React from 'react';\nimport { Minus, Square, ExternalLink, X } from 'lucide-react';\nimport { cn } from '../../utils/cn';\nimport { Button } from '../Button';\n\ntype ResizeDirection = 'n' | 's' | 'e' | 'w' | 'ne' | 'nw' | 'se' | 'sw';\n\nexport interface FloatingWindowProps {\n /** Whether the window is rendered. */\n open: boolean;\n /** Whether the window is collapsed to a minimized bar (renders nothing). */\n minimized?: boolean;\n /** Window title shown in the header. */\n title: React.ReactNode;\n /** Window body content. */\n children: React.ReactNode;\n /** Footer content, typically action buttons. */\n footer?: React.ReactNode;\n /** Called when the close control is activated. */\n onClose: () => void;\n /** Called when the minimize control is activated. Hidden when omitted. */\n onMinimize?: () => void;\n /** Called when the pop-out control is activated. Hidden when omitted. */\n onPopOut?: () => void;\n /**\n * When `true` the window floats at a draggable position. When `false`\n * (default) it is centered over a dimmed overlay like a modal.\n */\n draggable?: boolean;\n /** Whether the window can be resized from its edges/corners. Default true. */\n resizable?: boolean;\n /** Initial width in pixels. Default 1024. */\n defaultWidth?: number;\n /** Initial height in pixels. Default 600. */\n defaultHeight?: number;\n /** Minimum width in pixels. Default 600. */\n minWidth?: number;\n /** Minimum height in pixels. Default 400. */\n minHeight?: number;\n /** Class applied to the window container. */\n className?: string;\n /** Accessible label for the dialog when the title is not text. */\n 'aria-label'?: string;\n}\n\nconst RESIZE_HANDLES: { dir: ResizeDirection; className: string }[] = [\n { dir: 'nw', className: 'top-0 left-0 h-2 w-2 cursor-nw-resize' },\n { dir: 'ne', className: 'top-0 right-0 h-2 w-2 cursor-ne-resize' },\n { dir: 'sw', className: 'bottom-0 left-0 h-2 w-2 cursor-sw-resize' },\n { dir: 'n', className: 'top-0 left-2 right-2 h-1 cursor-n-resize' },\n { dir: 's', className: 'bottom-0 left-2 right-2 h-1 cursor-s-resize' },\n { dir: 'w', className: 'left-0 top-2 bottom-2 w-1 cursor-w-resize' },\n { dir: 'e', className: 'right-0 top-2 bottom-2 w-1 cursor-e-resize' },\n];\n\n/**\n * A presentational floating window shell used for pop-out editors (notes,\n * letters, etc.). It can render as a centered modal-style window or as a\n * draggable, freely-positioned window, and supports edge/corner resizing.\n * Open/minimize/close state and footer actions are controlled via props so it\n * can be wired to any store.\n */\nconst FloatingWindow = React.forwardRef<HTMLDivElement, FloatingWindowProps>(\n (\n {\n open,\n minimized = false,\n title,\n children,\n footer,\n onClose,\n onMinimize,\n onPopOut,\n draggable = false,\n resizable = true,\n defaultWidth = 1024,\n defaultHeight = 600,\n minWidth = 600,\n minHeight = 400,\n className,\n 'aria-label': ariaLabel,\n },\n ref\n ) => {\n const [size, setSize] = React.useState({\n width: defaultWidth,\n height: defaultHeight,\n });\n const [position, setPosition] = React.useState({ x: 50, y: 50 });\n\n const dragRef = React.useRef<{ x: number; y: number } | null>(null);\n const resizeRef = React.useRef<{\n dir: ResizeDirection;\n startX: number;\n startY: number;\n startW: number;\n startH: number;\n startPosX: number;\n startPosY: number;\n } | null>(null);\n\n const titleId = React.useId();\n\n const handleResizeStart = (e: React.MouseEvent, dir: ResizeDirection) => {\n e.preventDefault();\n e.stopPropagation();\n resizeRef.current = {\n dir,\n startX: e.clientX,\n startY: e.clientY,\n startW: size.width,\n startH: size.height,\n startPosX: position.x,\n startPosY: position.y,\n };\n };\n\n const handleDragStart = (e: React.MouseEvent) => {\n if (!draggable) return;\n if ((e.target as HTMLElement).closest('[data-window-controls]')) return;\n const rect = (e.currentTarget as HTMLElement)\n .closest('[data-slot=\"floating-window\"]')!\n .getBoundingClientRect();\n dragRef.current = { x: e.clientX - rect.left, y: e.clientY - rect.top };\n };\n\n React.useEffect(() => {\n if (!open || minimized) return;\n\n const handleMouseMove = (e: MouseEvent) => {\n if (dragRef.current) {\n setPosition({\n x: e.clientX - dragRef.current.x,\n y: e.clientY - dragRef.current.y,\n });\n return;\n }\n const r = resizeRef.current;\n if (!r) return;\n const deltaX = e.clientX - r.startX;\n const deltaY = e.clientY - r.startY;\n let newWidth = r.startW;\n let newHeight = r.startH;\n let newX = r.startPosX;\n let newY = r.startPosY;\n\n if (r.dir.includes('e')) {\n newWidth = Math.max(\n minWidth,\n Math.min(window.innerWidth - 40, r.startW + deltaX)\n );\n }\n if (r.dir.includes('w')) {\n newWidth = Math.max(minWidth, r.startW - deltaX);\n if (draggable) newX = r.startPosX + (r.startW - newWidth);\n }\n if (r.dir.includes('s')) {\n newHeight = Math.max(\n minHeight,\n Math.min(window.innerHeight - 40, r.startH + deltaY)\n );\n }\n if (r.dir.includes('n')) {\n newHeight = Math.max(minHeight, r.startH - deltaY);\n if (draggable) newY = r.startPosY + (r.startH - newHeight);\n }\n\n setSize({ width: newWidth, height: newHeight });\n if (draggable && (r.dir.includes('w') || r.dir.includes('n'))) {\n setPosition({ x: newX, y: newY });\n }\n };\n\n const handleMouseUp = () => {\n dragRef.current = null;\n resizeRef.current = null;\n };\n\n document.addEventListener('mousemove', handleMouseMove);\n document.addEventListener('mouseup', handleMouseUp);\n return () => {\n document.removeEventListener('mousemove', handleMouseMove);\n document.removeEventListener('mouseup', handleMouseUp);\n };\n }, [open, minimized, draggable, minWidth, minHeight]);\n\n if (!open || minimized) return null;\n\n const windowEl = (\n <div\n ref={ref}\n data-slot=\"floating-window\"\n role=\"dialog\"\n aria-modal={draggable ? undefined : true}\n aria-labelledby={typeof title === 'string' ? titleId : undefined}\n aria-label={typeof title === 'string' ? undefined : ariaLabel}\n className={cn(\n 'bg-card text-card-foreground relative flex flex-col overflow-hidden rounded-lg shadow-2xl',\n draggable && 'border-primary-800 fixed border-2',\n className\n )}\n style={\n draggable\n ? {\n left: position.x,\n top: position.y,\n width: size.width,\n height: size.height,\n maxWidth: 'calc(100vw - 40px)',\n maxHeight: 'calc(100vh - 40px)',\n zIndex: 50,\n }\n : {\n width: size.width,\n height: size.height,\n maxWidth: 'calc(100vw - 40px)',\n maxHeight: 'calc(100vh - 40px)',\n }\n }\n >\n {resizable &&\n RESIZE_HANDLES.map((handle) => (\n <div\n key={handle.dir}\n aria-hidden=\"true\"\n className={cn('absolute z-10', handle.className)}\n onMouseDown={(e) => handleResizeStart(e, handle.dir)}\n />\n ))}\n {resizable && (\n <div\n aria-hidden=\"true\"\n className=\"hover:bg-muted/50 absolute right-0 bottom-0 z-10 h-4 w-4 cursor-se-resize rounded-tl\"\n onMouseDown={(e) => handleResizeStart(e, 'se')}\n >\n <svg\n className=\"text-muted-foreground/50 h-4 w-4\"\n viewBox=\"0 0 24 24\"\n fill=\"currentColor\"\n >\n <path d=\"M22 22H20V20H22V22ZM22 18H20V16H22V18ZM18 22H16V20H18V22ZM22 14H20V12H22V14ZM18 18H16V16H18V18ZM14 22H12V20H14V22Z\" />\n </svg>\n </div>\n )}\n\n {/* eslint-disable-next-line jsx-a11y/no-static-element-interactions -- header acts as an optional drag handle; the controls inside remain keyboard accessible */}\n <div\n data-slot=\"floating-window-header\"\n className={cn(\n 'bg-primary-800 text-primary-foreground flex items-center justify-between rounded-t-lg px-4 py-3',\n draggable && 'cursor-move'\n )}\n onMouseDown={handleDragStart}\n >\n <h2\n id={typeof title === 'string' ? titleId : undefined}\n className=\"text-lg font-semibold\"\n >\n {title}\n </h2>\n <div data-window-controls className=\"flex items-center gap-1\">\n {onMinimize && (\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n className=\"text-primary-foreground hover:bg-primary-foreground/20 h-8 w-8 p-0\"\n onClick={onMinimize}\n aria-label=\"Minimize\"\n title=\"Minimize\"\n >\n <Minus className=\"h-4 w-4\" />\n </Button>\n )}\n {onPopOut && (\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n className=\"text-primary-foreground hover:bg-primary-foreground/20 h-8 w-8 p-0\"\n onClick={onPopOut}\n aria-label=\"Open in new window\"\n title=\"Open in new window\"\n >\n <ExternalLink className=\"h-4 w-4\" />\n </Button>\n )}\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n className=\"text-primary-foreground hover:bg-primary-foreground/20 h-8 w-8 p-0\"\n onClick={onClose}\n aria-label=\"Close\"\n title=\"Close\"\n >\n <X className=\"h-4 w-4\" />\n </Button>\n </div>\n </div>\n\n {/* eslint-disable jsx-a11y/no-noninteractive-tabindex */}\n <div\n data-slot=\"floating-window-content\"\n role=\"region\"\n className=\"flex-1 overflow-y-auto\"\n tabIndex={0}\n >\n {children}\n </div>\n {/* eslint-enable jsx-a11y/no-noninteractive-tabindex */}\n\n {footer && (\n <div\n data-slot=\"floating-window-footer\"\n className=\"border-border bg-card flex items-center justify-end gap-3 rounded-b-lg border-t px-6 py-4\"\n >\n {footer}\n </div>\n )}\n </div>\n );\n\n if (draggable) return windowEl;\n\n return (\n <div\n data-slot=\"floating-window-overlay\"\n className=\"fixed inset-0 z-50 flex items-center justify-center bg-black/50\"\n >\n {windowEl}\n </div>\n );\n }\n);\n\nFloatingWindow.displayName = 'FloatingWindow';\n\nexport interface MinimizedWindowProps {\n /** Title shown on the minimized bar. */\n title: React.ReactNode;\n /** Called when the bar is activated to restore the window. */\n onRestore: () => void;\n /** Called when the close control is activated. */\n onClose: () => void;\n /** Additional class for the minimized bar. */\n className?: string;\n}\n\n/**\n * A compact bar representing a minimized {@link FloatingWindow}. Render this\n * (typically in a docked tray) while the corresponding window is minimized.\n */\nconst MinimizedWindow = React.forwardRef<HTMLDivElement, MinimizedWindowProps>(\n ({ title, onRestore, onClose, className }, ref) => (\n <div\n ref={ref}\n data-slot=\"minimized-window\"\n className={cn(\n 'border-border bg-card flex min-w-[200px] items-center gap-2 rounded-lg border px-3 py-2 shadow-md',\n className\n )}\n >\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n className=\"h-6 px-2\"\n onClick={onRestore}\n >\n <Square className=\"mr-1 h-3 w-3\" />\n <span className=\"truncate text-sm\">{title}</span>\n </Button>\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n className=\"ml-auto h-6 w-6 p-0\"\n onClick={onClose}\n aria-label=\"Close\"\n title=\"Close\"\n >\n <X className=\"h-3 w-3\" />\n </Button>\n </div>\n )\n);\n\nMinimizedWindow.displayName = 'MinimizedWindow';\n\nexport { FloatingWindow, MinimizedWindow };\n"]}
1
+ {"version":3,"sources":["../src/components/FloatingWindow/FloatingWindow.tsx"],"names":["React","jsxs","cn","jsx","Button","Minus","ExternalLink","X","Square"],"mappings":"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","file":"chunk-H7QSGFMZ.cjs","sourcesContent":["import * as React from 'react';\nimport { Minus, Square, ExternalLink, X } from 'lucide-react';\nimport { cn } from '../../utils/cn';\nimport { Button } from '../Button';\n\ntype ResizeDirection = 'n' | 's' | 'e' | 'w' | 'ne' | 'nw' | 'se' | 'sw';\n\nexport interface FloatingWindowProps {\n /** Whether the window is rendered. */\n open: boolean;\n /** Whether the window is collapsed to a minimized bar (renders nothing). */\n minimized?: boolean;\n /** Window title shown in the header. */\n title: React.ReactNode;\n /** Window body content. */\n children: React.ReactNode;\n /** Footer content, typically action buttons. */\n footer?: React.ReactNode;\n /** Called when the close control is activated. */\n onClose: () => void;\n /** Called when the minimize control is activated. Hidden when omitted. */\n onMinimize?: () => void;\n /** Called when the pop-out control is activated. Hidden when omitted. */\n onPopOut?: () => void;\n /**\n * When `true` the window floats at a draggable position. When `false`\n * (default) it is centered over a dimmed overlay like a modal.\n */\n draggable?: boolean;\n /** Whether the window can be resized from its edges/corners. Default true. */\n resizable?: boolean;\n /** Initial width in pixels. Default 1024. */\n defaultWidth?: number;\n /** Initial height in pixels. Default 600. */\n defaultHeight?: number;\n /** Minimum width in pixels. Default 600. */\n minWidth?: number;\n /** Minimum height in pixels. Default 400. */\n minHeight?: number;\n /** Class applied to the window container. */\n className?: string;\n /** Accessible label for the dialog when the title is not text. */\n 'aria-label'?: string;\n}\n\nconst RESIZE_HANDLES: { dir: ResizeDirection; className: string }[] = [\n { dir: 'nw', className: 'top-0 left-0 h-2 w-2 cursor-nw-resize' },\n { dir: 'ne', className: 'top-0 right-0 h-2 w-2 cursor-ne-resize' },\n { dir: 'sw', className: 'bottom-0 left-0 h-2 w-2 cursor-sw-resize' },\n { dir: 'n', className: 'top-0 left-2 right-2 h-1 cursor-n-resize' },\n { dir: 's', className: 'bottom-0 left-2 right-2 h-1 cursor-s-resize' },\n { dir: 'w', className: 'left-0 top-2 bottom-2 w-1 cursor-w-resize' },\n { dir: 'e', className: 'right-0 top-2 bottom-2 w-1 cursor-e-resize' },\n];\n\n/**\n * A presentational floating window shell used for pop-out editors (notes,\n * letters, etc.). It can render as a centered modal-style window or as a\n * draggable, freely-positioned window, and supports edge/corner resizing.\n * Open/minimize/close state and footer actions are controlled via props so it\n * can be wired to any store.\n */\nconst FloatingWindow = React.forwardRef<HTMLDivElement, FloatingWindowProps>(\n (\n {\n open,\n minimized = false,\n title,\n children,\n footer,\n onClose,\n onMinimize,\n onPopOut,\n draggable = false,\n resizable = true,\n defaultWidth = 1024,\n defaultHeight = 600,\n minWidth = 600,\n minHeight = 400,\n className,\n 'aria-label': ariaLabel,\n },\n ref\n ) => {\n const [size, setSize] = React.useState({\n width: defaultWidth,\n height: defaultHeight,\n });\n const [position, setPosition] = React.useState({ x: 50, y: 50 });\n\n const dragRef = React.useRef<{ x: number; y: number } | null>(null);\n const resizeRef = React.useRef<{\n dir: ResizeDirection;\n startX: number;\n startY: number;\n startW: number;\n startH: number;\n startPosX: number;\n startPosY: number;\n } | null>(null);\n\n const titleId = React.useId();\n\n const handleResizeStart = (e: React.MouseEvent, dir: ResizeDirection) => {\n e.preventDefault();\n e.stopPropagation();\n resizeRef.current = {\n dir,\n startX: e.clientX,\n startY: e.clientY,\n startW: size.width,\n startH: size.height,\n startPosX: position.x,\n startPosY: position.y,\n };\n };\n\n const handleDragStart = (e: React.MouseEvent) => {\n if (!draggable) return;\n if ((e.target as HTMLElement).closest('[data-window-controls]')) return;\n const rect = (e.currentTarget as HTMLElement)\n .closest('[data-slot=\"floating-window\"]')!\n .getBoundingClientRect();\n dragRef.current = { x: e.clientX - rect.left, y: e.clientY - rect.top };\n };\n\n React.useEffect(() => {\n if (!open || minimized) return;\n\n const handleMouseMove = (e: MouseEvent) => {\n if (dragRef.current) {\n setPosition({\n x: e.clientX - dragRef.current.x,\n y: e.clientY - dragRef.current.y,\n });\n return;\n }\n const r = resizeRef.current;\n if (!r) return;\n const deltaX = e.clientX - r.startX;\n const deltaY = e.clientY - r.startY;\n let newWidth = r.startW;\n let newHeight = r.startH;\n let newX = r.startPosX;\n let newY = r.startPosY;\n\n if (r.dir.includes('e')) {\n newWidth = Math.max(\n minWidth,\n Math.min(window.innerWidth - 40, r.startW + deltaX)\n );\n }\n if (r.dir.includes('w')) {\n newWidth = Math.max(minWidth, r.startW - deltaX);\n if (draggable) newX = r.startPosX + (r.startW - newWidth);\n }\n if (r.dir.includes('s')) {\n newHeight = Math.max(\n minHeight,\n Math.min(window.innerHeight - 40, r.startH + deltaY)\n );\n }\n if (r.dir.includes('n')) {\n newHeight = Math.max(minHeight, r.startH - deltaY);\n if (draggable) newY = r.startPosY + (r.startH - newHeight);\n }\n\n setSize({ width: newWidth, height: newHeight });\n if (draggable && (r.dir.includes('w') || r.dir.includes('n'))) {\n setPosition({ x: newX, y: newY });\n }\n };\n\n const handleMouseUp = () => {\n dragRef.current = null;\n resizeRef.current = null;\n };\n\n document.addEventListener('mousemove', handleMouseMove);\n document.addEventListener('mouseup', handleMouseUp);\n return () => {\n document.removeEventListener('mousemove', handleMouseMove);\n document.removeEventListener('mouseup', handleMouseUp);\n };\n }, [open, minimized, draggable, minWidth, minHeight]);\n\n if (!open || minimized) return null;\n\n const windowEl = (\n <div\n ref={ref}\n data-slot=\"floating-window\"\n role=\"dialog\"\n aria-modal={draggable ? undefined : true}\n aria-labelledby={typeof title === 'string' ? titleId : undefined}\n aria-label={typeof title === 'string' ? undefined : ariaLabel}\n className={cn(\n 'bg-card text-card-foreground relative flex flex-col overflow-hidden rounded-lg shadow-2xl',\n draggable && 'border-primary-800 fixed border-2',\n className\n )}\n style={\n draggable\n ? {\n left: position.x,\n top: position.y,\n width: size.width,\n height: size.height,\n maxWidth: 'calc(100vw - 40px)',\n maxHeight: 'calc(100vh - 40px)',\n zIndex: 50,\n }\n : {\n width: size.width,\n height: size.height,\n maxWidth: 'calc(100vw - 40px)',\n maxHeight: 'calc(100vh - 40px)',\n }\n }\n >\n {resizable &&\n RESIZE_HANDLES.map((handle) => (\n <div\n key={handle.dir}\n aria-hidden=\"true\"\n className={cn('absolute z-10', handle.className)}\n onMouseDown={(e) => handleResizeStart(e, handle.dir)}\n />\n ))}\n {resizable && (\n <div\n aria-hidden=\"true\"\n className=\"hover:bg-muted/50 absolute right-0 bottom-0 z-10 h-4 w-4 cursor-se-resize rounded-tl\"\n onMouseDown={(e) => handleResizeStart(e, 'se')}\n >\n <svg\n className=\"text-muted-foreground/50 h-4 w-4\"\n viewBox=\"0 0 24 24\"\n fill=\"currentColor\"\n >\n <path d=\"M22 22H20V20H22V22ZM22 18H20V16H22V18ZM18 22H16V20H18V22ZM22 14H20V12H22V14ZM18 18H16V16H18V18ZM14 22H12V20H14V22Z\" />\n </svg>\n </div>\n )}\n\n {/* eslint-disable-next-line jsx-a11y/no-static-element-interactions -- header acts as an optional drag handle; the controls inside remain keyboard accessible */}\n <div\n data-slot=\"floating-window-header\"\n className={cn(\n 'bg-primary-800 text-primary-foreground flex items-center justify-between rounded-t-lg px-4 py-3',\n draggable && 'cursor-move'\n )}\n onMouseDown={handleDragStart}\n >\n <h2\n id={typeof title === 'string' ? titleId : undefined}\n className=\"text-lg font-semibold\"\n >\n {title}\n </h2>\n <div data-window-controls className=\"flex items-center gap-1\">\n {onMinimize && (\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n className=\"text-primary-foreground hover:bg-primary-foreground/20 h-8 w-8 p-0\"\n onClick={onMinimize}\n aria-label=\"Minimize\"\n title=\"Minimize\"\n >\n <Minus className=\"h-4 w-4\" />\n </Button>\n )}\n {onPopOut && (\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n className=\"text-primary-foreground hover:bg-primary-foreground/20 h-8 w-8 p-0\"\n onClick={onPopOut}\n aria-label=\"Open in new window\"\n title=\"Open in new window\"\n >\n <ExternalLink className=\"h-4 w-4\" />\n </Button>\n )}\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n className=\"text-primary-foreground hover:bg-primary-foreground/20 h-8 w-8 p-0\"\n onClick={onClose}\n aria-label=\"Close\"\n title=\"Close\"\n >\n <X className=\"h-4 w-4\" />\n </Button>\n </div>\n </div>\n\n {/* eslint-disable jsx-a11y/no-noninteractive-tabindex */}\n <div\n data-slot=\"floating-window-content\"\n role=\"region\"\n className=\"flex-1 overflow-y-auto\"\n tabIndex={0}\n >\n {children}\n </div>\n {/* eslint-enable jsx-a11y/no-noninteractive-tabindex */}\n\n {footer && (\n <div\n data-slot=\"floating-window-footer\"\n className=\"border-border bg-card flex items-center justify-end gap-3 rounded-b-lg border-t px-6 py-4\"\n >\n {footer}\n </div>\n )}\n </div>\n );\n\n if (draggable) return windowEl;\n\n return (\n <div\n data-slot=\"floating-window-overlay\"\n className=\"fixed inset-0 z-50 flex items-center justify-center bg-black/50\"\n >\n {windowEl}\n </div>\n );\n }\n);\n\nFloatingWindow.displayName = 'FloatingWindow';\n\nexport interface MinimizedWindowProps {\n /** Title shown on the minimized bar. */\n title: React.ReactNode;\n /** Called when the bar is activated to restore the window. */\n onRestore: () => void;\n /** Called when the close control is activated. */\n onClose: () => void;\n /** Additional class for the minimized bar. */\n className?: string;\n}\n\n/**\n * A compact bar representing a minimized {@link FloatingWindow}. Render this\n * (typically in a docked tray) while the corresponding window is minimized.\n */\nconst MinimizedWindow = React.forwardRef<HTMLDivElement, MinimizedWindowProps>(\n ({ title, onRestore, onClose, className }, ref) => (\n <div\n ref={ref}\n data-slot=\"minimized-window\"\n className={cn(\n 'border-border bg-card flex min-w-[200px] items-center gap-2 rounded-lg border px-3 py-2 shadow-md',\n className\n )}\n >\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n className=\"h-6 px-2\"\n onClick={onRestore}\n >\n <Square className=\"mr-1 h-3 w-3\" />\n <span className=\"truncate text-sm\">{title}</span>\n </Button>\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n className=\"ml-auto h-6 w-6 p-0\"\n onClick={onClose}\n aria-label=\"Close\"\n title=\"Close\"\n >\n <X className=\"h-3 w-3\" />\n </Button>\n </div>\n )\n);\n\nMinimizedWindow.displayName = 'MinimizedWindow';\n\nexport { FloatingWindow, MinimizedWindow };\n"]}
@@ -1,8 +1,8 @@
1
- import { inputVariants } from './chunk-PVUDXJAI.js';
1
+ import { inputVariants } from './chunk-YXCE2HSK.js';
2
2
  import { useEscapeKey } from './chunk-T4ME7QCT.js';
3
3
  import { useClickOutside } from './chunk-62ZOA6PX.js';
4
- import { useAnchoredPosition } from './chunk-QA6ZDHFP.js';
5
- import { cn } from './chunk-F3SOEIN2.js';
4
+ import { useAnchoredPosition } from './chunk-BOOJDRJO.js';
5
+ import { cn } from './chunk-TQONQSJO.js';
6
6
  import * as React from 'react';
7
7
  import { createPortal } from 'react-dom';
8
8
  import { jsxs, jsx, Fragment } from 'react/jsx-runtime';
@@ -607,5 +607,5 @@ function DropdownLabel({
607
607
  DropdownLabel.displayName = "DropdownLabel";
608
608
 
609
609
  export { Dropdown, DropdownContent, DropdownHeader, DropdownItem, DropdownLabel, DropdownSeparator };
610
- //# sourceMappingURL=chunk-YZT62IMX.js.map
611
- //# sourceMappingURL=chunk-YZT62IMX.js.map
610
+ //# sourceMappingURL=chunk-HIDV32ZX.js.map
611
+ //# sourceMappingURL=chunk-HIDV32ZX.js.map