@mieweb/ui 0.10.0-dev.1 → 0.10.0-dev.11

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 (423) hide show
  1. package/agent/mieweb-ui.instructions.md +13 -1
  2. package/dist/CsvBlock-ROJCKJDP.cjs +16 -0
  3. package/dist/{CsvBlock-CVYA3HYS.cjs.map → CsvBlock-ROJCKJDP.cjs.map} +1 -1
  4. package/dist/CsvBlock-UWPMTLE2.js +7 -0
  5. package/dist/{CsvBlock-SM4NKSHA.js.map → CsvBlock-UWPMTLE2.js.map} +1 -1
  6. package/dist/HtmlPreviewBlock-DWFN6EUB.cjs +16 -0
  7. package/dist/{HtmlPreviewBlock-JF454L2L.cjs.map → HtmlPreviewBlock-DWFN6EUB.cjs.map} +1 -1
  8. package/dist/HtmlPreviewBlock-ME5U3XNS.js +7 -0
  9. package/dist/{HtmlPreviewBlock-FAMF4W24.js.map → HtmlPreviewBlock-ME5U3XNS.js.map} +1 -1
  10. package/dist/MermaidBlock-2B6CPD6Y.js +7 -0
  11. package/dist/{MermaidBlock-7V5G4K5A.js.map → MermaidBlock-2B6CPD6Y.js.map} +1 -1
  12. package/dist/MermaidBlock-D2UC5M55.cjs +16 -0
  13. package/dist/{MermaidBlock-FR5SQX4Q.cjs.map → MermaidBlock-D2UC5M55.cjs.map} +1 -1
  14. package/dist/SurveyBlock-4CD4AYMJ.cjs +16 -0
  15. package/dist/{SurveyBlock-MCJVWR7H.cjs.map → SurveyBlock-4CD4AYMJ.cjs.map} +1 -1
  16. package/dist/SurveyBlock-4DO62RBT.js +7 -0
  17. package/dist/{SurveyBlock-6K2POV7S.js.map → SurveyBlock-4DO62RBT.js.map} +1 -1
  18. package/dist/brands/index.cjs +20 -20
  19. package/dist/brands/index.js +4 -4
  20. package/dist/brands/types.cjs +4 -4
  21. package/dist/brands/types.d.cts +9 -0
  22. package/dist/brands/types.d.ts +9 -0
  23. package/dist/brands/types.js +1 -1
  24. package/dist/{chunk-XTHMC76F.cjs → chunk-2G75X6TS.cjs} +4 -4
  25. package/dist/{chunk-XTHMC76F.cjs.map → chunk-2G75X6TS.cjs.map} +1 -1
  26. package/dist/chunk-2IZLKPUW.js +412 -0
  27. package/dist/chunk-2IZLKPUW.js.map +1 -0
  28. package/dist/{chunk-VSVGMMNO.js → chunk-3M7TAXNR.js} +3 -3
  29. package/dist/{chunk-VSVGMMNO.js.map → chunk-3M7TAXNR.js.map} +1 -1
  30. package/dist/{chunk-5Z6UPVGC.cjs → chunk-3QEVGSFG.cjs} +5 -5
  31. package/dist/{chunk-5Z6UPVGC.cjs.map → chunk-3QEVGSFG.cjs.map} +1 -1
  32. package/dist/{chunk-PYHFVYVZ.js → chunk-3QGS6CXD.js} +3 -3
  33. package/dist/{chunk-PYHFVYVZ.js.map → chunk-3QGS6CXD.js.map} +1 -1
  34. package/dist/chunk-3YBS4WUQ.js +52 -0
  35. package/dist/chunk-3YBS4WUQ.js.map +1 -0
  36. package/dist/chunk-462XSCP3.cjs +199 -0
  37. package/dist/chunk-462XSCP3.cjs.map +1 -0
  38. package/dist/{chunk-X5YM3KXY.js → chunk-4A3W4TQF.js} +201 -4
  39. package/dist/chunk-4A3W4TQF.js.map +1 -0
  40. package/dist/chunk-4IS3QCOQ.cjs +453 -0
  41. package/dist/chunk-4IS3QCOQ.cjs.map +1 -0
  42. package/dist/chunk-4NCDU5IG.cjs +56 -0
  43. package/dist/chunk-4NCDU5IG.cjs.map +1 -0
  44. package/dist/{chunk-WOYUQ4AT.js → chunk-5GOWFNQ6.js} +9 -3
  45. package/dist/chunk-5GOWFNQ6.js.map +1 -0
  46. package/dist/chunk-5GUOOLPR.cjs +436 -0
  47. package/dist/chunk-5GUOOLPR.cjs.map +1 -0
  48. package/dist/{chunk-WUBMDOTG.js → chunk-5JJ2DAE4.js} +4 -4
  49. package/dist/{chunk-WUBMDOTG.js.map → chunk-5JJ2DAE4.js.map} +1 -1
  50. package/dist/{chunk-RSCA5AZW.cjs → chunk-5MCBWTIF.cjs} +4 -4
  51. package/dist/{chunk-RSCA5AZW.cjs.map → chunk-5MCBWTIF.cjs.map} +1 -1
  52. package/dist/chunk-6EN3IQQI.cjs +332 -0
  53. package/dist/chunk-6EN3IQQI.cjs.map +1 -0
  54. package/dist/chunk-74ENCTIK.js +162 -0
  55. package/dist/chunk-74ENCTIK.js.map +1 -0
  56. package/dist/chunk-76TBQDED.js +166 -0
  57. package/dist/chunk-76TBQDED.js.map +1 -0
  58. package/dist/{chunk-OAZUDUGX.js → chunk-7IBZA7G6.js} +4 -4
  59. package/dist/{chunk-OAZUDUGX.js.map → chunk-7IBZA7G6.js.map} +1 -1
  60. package/dist/{chunk-AUOTJQGO.cjs → chunk-7ZDPD5ZX.cjs} +4 -4
  61. package/dist/{chunk-AUOTJQGO.cjs.map → chunk-7ZDPD5ZX.cjs.map} +1 -1
  62. package/dist/{chunk-IB54SKWB.cjs → chunk-7ZXAQTV4.cjs} +8 -8
  63. package/dist/{chunk-IB54SKWB.cjs.map → chunk-7ZXAQTV4.cjs.map} +1 -1
  64. package/dist/{chunk-IIFQ6BSJ.js → chunk-ACCAXVOG.js} +6 -6
  65. package/dist/{chunk-IIFQ6BSJ.js.map → chunk-ACCAXVOG.js.map} +1 -1
  66. package/dist/{chunk-QO6PRHDX.cjs → chunk-AR7AKDM2.cjs} +2 -2
  67. package/dist/{chunk-QO6PRHDX.cjs.map → chunk-AR7AKDM2.cjs.map} +1 -1
  68. package/dist/{chunk-PY7XAG4D.cjs → chunk-ASSDGS4F.cjs} +201 -4
  69. package/dist/chunk-ASSDGS4F.cjs.map +1 -0
  70. package/dist/{chunk-24SEAAOH.js → chunk-AWJBOND5.js} +2 -2
  71. package/dist/{chunk-24SEAAOH.js.map → chunk-AWJBOND5.js.map} +1 -1
  72. package/dist/chunk-BM35CACB.js +148 -0
  73. package/dist/chunk-BM35CACB.js.map +1 -0
  74. package/dist/chunk-CR2SDI23.cjs +322 -0
  75. package/dist/chunk-CR2SDI23.cjs.map +1 -0
  76. package/dist/{chunk-OSPTA4UR.js → chunk-DEDN5HAG.js} +3 -3
  77. package/dist/{chunk-OSPTA4UR.js.map → chunk-DEDN5HAG.js.map} +1 -1
  78. package/dist/chunk-DZ5HFLRC.js +258 -0
  79. package/dist/chunk-DZ5HFLRC.js.map +1 -0
  80. package/dist/{chunk-PKD3JLS2.cjs → chunk-E4IBHYJ7.cjs} +9 -9
  81. package/dist/{chunk-PKD3JLS2.cjs.map → chunk-E4IBHYJ7.cjs.map} +1 -1
  82. package/dist/{chunk-QSVQABXD.js → chunk-ENKFJJZX.js} +7 -7
  83. package/dist/{chunk-QSVQABXD.js.map → chunk-ENKFJJZX.js.map} +1 -1
  84. package/dist/{chunk-MUIDWFYJ.js → chunk-FJ7YPVKV.js} +3 -3
  85. package/dist/{chunk-MUIDWFYJ.js.map → chunk-FJ7YPVKV.js.map} +1 -1
  86. package/dist/{chunk-3LHICE4I.cjs → chunk-FXO5ARBB.cjs} +5 -5
  87. package/dist/{chunk-3LHICE4I.cjs.map → chunk-FXO5ARBB.cjs.map} +1 -1
  88. package/dist/{chunk-QKAYRHWP.cjs → chunk-G3JX3UAU.cjs} +12 -12
  89. package/dist/{chunk-QKAYRHWP.cjs.map → chunk-G3JX3UAU.cjs.map} +1 -1
  90. package/dist/chunk-G4D6CLBT.js +333 -0
  91. package/dist/chunk-G4D6CLBT.js.map +1 -0
  92. package/dist/{chunk-OMAACCFW.cjs → chunk-GD7EBGC4.cjs} +19 -19
  93. package/dist/{chunk-OMAACCFW.cjs.map → chunk-GD7EBGC4.cjs.map} +1 -1
  94. package/dist/{chunk-KREUYVMZ.js → chunk-GOALNQZ2.js} +13 -4
  95. package/dist/chunk-GOALNQZ2.js.map +1 -0
  96. package/dist/{chunk-CK3KLRNF.js → chunk-H4ZXMQQW.js} +3 -3
  97. package/dist/{chunk-CK3KLRNF.js.map → chunk-H4ZXMQQW.js.map} +1 -1
  98. package/dist/chunk-IT775BYG.js +179 -0
  99. package/dist/chunk-IT775BYG.js.map +1 -0
  100. package/dist/{chunk-AHINB2TP.cjs → chunk-IX6KFB3K.cjs} +9 -9
  101. package/dist/{chunk-AHINB2TP.cjs.map → chunk-IX6KFB3K.cjs.map} +1 -1
  102. package/dist/chunk-IXFC7LK2.cjs +174 -0
  103. package/dist/chunk-IXFC7LK2.cjs.map +1 -0
  104. package/dist/{chunk-VNAREBLV.cjs → chunk-J5CSLNCN.cjs} +3 -3
  105. package/dist/{chunk-VNAREBLV.cjs.map → chunk-J5CSLNCN.cjs.map} +1 -1
  106. package/dist/{chunk-MM7QKUE3.cjs → chunk-JID7AZTO.cjs} +5 -5
  107. package/dist/{chunk-MM7QKUE3.cjs.map → chunk-JID7AZTO.cjs.map} +1 -1
  108. package/dist/{chunk-E3KC2XLN.cjs → chunk-KQUI4BGS.cjs} +51 -51
  109. package/dist/{chunk-E3KC2XLN.cjs.map → chunk-KQUI4BGS.cjs.map} +1 -1
  110. package/dist/{chunk-ZB54MTMQ.js → chunk-KZFBQ7GY.js} +3 -3
  111. package/dist/{chunk-ZB54MTMQ.js.map → chunk-KZFBQ7GY.js.map} +1 -1
  112. package/dist/{chunk-XBXDUAIM.js → chunk-LL6IWKI3.js} +4 -4
  113. package/dist/{chunk-XBXDUAIM.js.map → chunk-LL6IWKI3.js.map} +1 -1
  114. package/dist/{chunk-ON4JULCA.js → chunk-LMBXJZLG.js} +3 -3
  115. package/dist/{chunk-ON4JULCA.js.map → chunk-LMBXJZLG.js.map} +1 -1
  116. package/dist/{chunk-ZX2XRFE5.js → chunk-MNILXWVY.js} +7 -7
  117. package/dist/{chunk-ZX2XRFE5.js.map → chunk-MNILXWVY.js.map} +1 -1
  118. package/dist/chunk-MWVW4APN.cjs +260 -0
  119. package/dist/chunk-MWVW4APN.cjs.map +1 -0
  120. package/dist/{chunk-WIAQQNFU.cjs → chunk-MYHV2ND3.cjs} +37 -3
  121. package/dist/chunk-MYHV2ND3.cjs.map +1 -0
  122. package/dist/{chunk-BZAGP5W6.cjs → chunk-N6IY47YA.cjs} +8 -8
  123. package/dist/{chunk-BZAGP5W6.cjs.map → chunk-N6IY47YA.cjs.map} +1 -1
  124. package/dist/{chunk-OCV33S5Q.cjs → chunk-NFKX6QJP.cjs} +3 -3
  125. package/dist/{chunk-OCV33S5Q.cjs.map → chunk-NFKX6QJP.cjs.map} +1 -1
  126. package/dist/{chunk-J644FU54.cjs → chunk-NGQRS7AW.cjs} +9 -3
  127. package/dist/chunk-NGQRS7AW.cjs.map +1 -0
  128. package/dist/{chunk-QAKASRE6.js → chunk-NJ6MY6V5.js} +4 -4
  129. package/dist/{chunk-QAKASRE6.js.map → chunk-NJ6MY6V5.js.map} +1 -1
  130. package/dist/{chunk-P52GA3GJ.cjs → chunk-NM7O7RY5.cjs} +4 -2
  131. package/dist/chunk-NM7O7RY5.cjs.map +1 -0
  132. package/dist/chunk-OCSCBB52.cjs +188 -0
  133. package/dist/chunk-OCSCBB52.cjs.map +1 -0
  134. package/dist/{chunk-OFUKTVBN.cjs → chunk-OD47TTAW.cjs} +9 -9
  135. package/dist/{chunk-OFUKTVBN.cjs.map → chunk-OD47TTAW.cjs.map} +1 -1
  136. package/dist/{chunk-QKFJDQEK.js → chunk-OE5CKRUC.js} +4 -4
  137. package/dist/{chunk-QKFJDQEK.js.map → chunk-OE5CKRUC.js.map} +1 -1
  138. package/dist/chunk-OGNADPM4.cjs +170 -0
  139. package/dist/chunk-OGNADPM4.cjs.map +1 -0
  140. package/dist/{chunk-MBWF36DJ.js → chunk-P2CA3XGI.js} +3 -3
  141. package/dist/{chunk-MBWF36DJ.js.map → chunk-P2CA3XGI.js.map} +1 -1
  142. package/dist/chunk-POWS35OT.js +152 -0
  143. package/dist/chunk-POWS35OT.js.map +1 -0
  144. package/dist/chunk-PYJDVWXM.js +237 -0
  145. package/dist/chunk-PYJDVWXM.js.map +1 -0
  146. package/dist/{chunk-MTZPVOP6.js → chunk-Q77TE5DZ.js} +4 -2
  147. package/dist/chunk-Q77TE5DZ.js.map +1 -0
  148. package/dist/{chunk-L5W7TJQ5.js → chunk-RJ6NTJHC.js} +4 -4
  149. package/dist/{chunk-L5W7TJQ5.js.map → chunk-RJ6NTJHC.js.map} +1 -1
  150. package/dist/{chunk-C3DUS2VE.cjs → chunk-RS5VA6QU.cjs} +3 -3
  151. package/dist/{chunk-C3DUS2VE.cjs.map → chunk-RS5VA6QU.cjs.map} +1 -1
  152. package/dist/{chunk-IGNWT6RP.js → chunk-S7WCHDBO.js} +4 -4
  153. package/dist/{chunk-IGNWT6RP.js.map → chunk-S7WCHDBO.js.map} +1 -1
  154. package/dist/{chunk-RXPEZXAB.cjs → chunk-SGFYA22I.cjs} +5 -5
  155. package/dist/{chunk-RXPEZXAB.cjs.map → chunk-SGFYA22I.cjs.map} +1 -1
  156. package/dist/chunk-SQJFBZ42.js +297 -0
  157. package/dist/chunk-SQJFBZ42.js.map +1 -0
  158. package/dist/chunk-SUS3WFY3.js +156 -0
  159. package/dist/chunk-SUS3WFY3.js.map +1 -0
  160. package/dist/{chunk-H4AVMUOC.cjs → chunk-TAXD5ADA.cjs} +4 -4
  161. package/dist/{chunk-H4AVMUOC.cjs.map → chunk-TAXD5ADA.cjs.map} +1 -1
  162. package/dist/{chunk-NHN6A3ZO.js → chunk-TMMVIUUN.js} +4 -4
  163. package/dist/{chunk-NHN6A3ZO.js.map → chunk-TMMVIUUN.js.map} +1 -1
  164. package/dist/chunk-TPWKM7JH.js +196 -0
  165. package/dist/chunk-TPWKM7JH.js.map +1 -0
  166. package/dist/chunk-TU63764L.cjs +158 -0
  167. package/dist/chunk-TU63764L.cjs.map +1 -0
  168. package/dist/{chunk-7KWNY3HG.js → chunk-TVTIGV7Q.js} +9 -9
  169. package/dist/{chunk-7KWNY3HG.js.map → chunk-TVTIGV7Q.js.map} +1 -1
  170. package/dist/{chunk-22CYDCXA.js → chunk-TZJQB4P2.js} +37 -4
  171. package/dist/chunk-TZJQB4P2.js.map +1 -0
  172. package/dist/{chunk-X5QRRMGB.cjs → chunk-UAMXCMST.cjs} +4 -4
  173. package/dist/{chunk-X5QRRMGB.cjs.map → chunk-UAMXCMST.cjs.map} +1 -1
  174. package/dist/{chunk-QAQOCS2J.js → chunk-UBOVDAD7.js} +3 -3
  175. package/dist/{chunk-QAQOCS2J.js.map → chunk-UBOVDAD7.js.map} +1 -1
  176. package/dist/{chunk-IGSIWNX3.cjs → chunk-UQ3VVR6A.cjs} +4 -4
  177. package/dist/{chunk-IGSIWNX3.cjs.map → chunk-UQ3VVR6A.cjs.map} +1 -1
  178. package/dist/chunk-URAQIF67.cjs +356 -0
  179. package/dist/chunk-URAQIF67.cjs.map +1 -0
  180. package/dist/{chunk-6QKMMKRY.cjs → chunk-UV2FVNWT.cjs} +5 -5
  181. package/dist/{chunk-6QKMMKRY.cjs.map → chunk-UV2FVNWT.cjs.map} +1 -1
  182. package/dist/{chunk-EG7XFZ3W.js → chunk-V7D3YGUV.js} +4 -4
  183. package/dist/{chunk-EG7XFZ3W.js.map → chunk-V7D3YGUV.js.map} +1 -1
  184. package/dist/{chunk-Y6DFMDMH.js → chunk-VILW53UZ.js} +3 -3
  185. package/dist/{chunk-Y6DFMDMH.js.map → chunk-VILW53UZ.js.map} +1 -1
  186. package/dist/chunk-VINZZQBD.cjs +323 -0
  187. package/dist/chunk-VINZZQBD.cjs.map +1 -0
  188. package/dist/{chunk-5WOB4UBD.js → chunk-VKELAMAZ.js} +3 -3
  189. package/dist/{chunk-5WOB4UBD.js.map → chunk-VKELAMAZ.js.map} +1 -1
  190. package/dist/{chunk-IINZWUGK.cjs → chunk-VNYW4C4J.cjs} +13 -4
  191. package/dist/chunk-VNYW4C4J.cjs.map +1 -0
  192. package/dist/{chunk-RD3JDFYJ.js → chunk-VOKVG3ER.js} +4 -4
  193. package/dist/{chunk-RD3JDFYJ.js.map → chunk-VOKVG3ER.js.map} +1 -1
  194. package/dist/chunk-VPTASZ2O.cjs +171 -0
  195. package/dist/chunk-VPTASZ2O.cjs.map +1 -0
  196. package/dist/{chunk-37UZHCLM.cjs → chunk-VPWJCJCX.cjs} +3 -3
  197. package/dist/{chunk-37UZHCLM.cjs.map → chunk-VPWJCJCX.cjs.map} +1 -1
  198. package/dist/{chunk-3RB35GYK.js → chunk-VU6UTJRM.js} +4 -4
  199. package/dist/{chunk-3RB35GYK.js.map → chunk-VU6UTJRM.js.map} +1 -1
  200. package/dist/{chunk-6SAYPXHX.js → chunk-WGPLUCBD.js} +4 -4
  201. package/dist/{chunk-6SAYPXHX.js.map → chunk-WGPLUCBD.js.map} +1 -1
  202. package/dist/{chunk-KLJGJJHN.cjs → chunk-WNZAYBVB.cjs} +49 -49
  203. package/dist/{chunk-KLJGJJHN.cjs.map → chunk-WNZAYBVB.cjs.map} +1 -1
  204. package/dist/{chunk-BVMABVC4.cjs → chunk-WWJIW2IH.cjs} +3 -3
  205. package/dist/{chunk-BVMABVC4.cjs.map → chunk-WWJIW2IH.cjs.map} +1 -1
  206. package/dist/{chunk-OYQ7GYAA.cjs → chunk-X4XPNTCZ.cjs} +12 -12
  207. package/dist/{chunk-OYQ7GYAA.cjs.map → chunk-X4XPNTCZ.cjs.map} +1 -1
  208. package/dist/chunk-XDIMTPZU.cjs +202 -0
  209. package/dist/chunk-XDIMTPZU.cjs.map +1 -0
  210. package/dist/{chunk-IFDC4TXM.cjs → chunk-XEAT7XJG.cjs} +4 -4
  211. package/dist/{chunk-IFDC4TXM.cjs.map → chunk-XEAT7XJG.cjs.map} +1 -1
  212. package/dist/{chunk-S3BCHPXT.cjs → chunk-XI34EGK5.cjs} +9 -9
  213. package/dist/{chunk-S3BCHPXT.cjs.map → chunk-XI34EGK5.cjs.map} +1 -1
  214. package/dist/chunk-XVW5DPPP.js +429 -0
  215. package/dist/chunk-XVW5DPPP.js.map +1 -0
  216. package/dist/chunk-XZNN3S3S.cjs +281 -0
  217. package/dist/chunk-XZNN3S3S.cjs.map +1 -0
  218. package/dist/chunk-Y4QNLW7W.js +300 -0
  219. package/dist/chunk-Y4QNLW7W.js.map +1 -0
  220. package/dist/chunk-Y5HFM7LO.js +310 -0
  221. package/dist/chunk-Y5HFM7LO.js.map +1 -0
  222. package/dist/{chunk-LECJMLNE.js → chunk-YQDA366U.js} +3 -3
  223. package/dist/{chunk-LECJMLNE.js.map → chunk-YQDA366U.js.map} +1 -1
  224. package/dist/{chunk-PHK4XBO5.js → chunk-Z5V7SAZ4.js} +4 -4
  225. package/dist/{chunk-PHK4XBO5.js.map → chunk-Z5V7SAZ4.js.map} +1 -1
  226. package/dist/{chunk-TZX76ZNZ.js → chunk-ZGRCSNPK.js} +5 -5
  227. package/dist/{chunk-TZX76ZNZ.js.map → chunk-ZGRCSNPK.js.map} +1 -1
  228. package/dist/{chunk-AZP3DDBT.cjs → chunk-ZPSJ2UV6.cjs} +8 -8
  229. package/dist/{chunk-AZP3DDBT.cjs.map → chunk-ZPSJ2UV6.cjs.map} +1 -1
  230. package/dist/{chunk-SRA2L3SQ.cjs → chunk-ZSGEGISB.cjs} +4 -4
  231. package/dist/{chunk-SRA2L3SQ.cjs.map → chunk-ZSGEGISB.cjs.map} +1 -1
  232. package/dist/components/AlertDialog/index.cjs +6 -6
  233. package/dist/components/AlertDialog/index.js +5 -5
  234. package/dist/components/Autocomplete/index.cjs +3 -3
  235. package/dist/components/Autocomplete/index.js +2 -2
  236. package/dist/components/BoardView/index.cjs +24 -0
  237. package/dist/components/BoardView/index.cjs.map +1 -0
  238. package/dist/components/BoardView/index.d.cts +42 -0
  239. package/dist/components/BoardView/index.d.ts +42 -0
  240. package/dist/components/BoardView/index.js +7 -0
  241. package/dist/components/BoardView/index.js.map +1 -0
  242. package/dist/components/Button/index.cjs +3 -3
  243. package/dist/components/Button/index.d.cts +3 -0
  244. package/dist/components/Button/index.d.ts +3 -0
  245. package/dist/components/Button/index.js +1 -1
  246. package/dist/components/CalendarView/index.cjs +22 -0
  247. package/dist/components/CalendarView/index.cjs.map +1 -0
  248. package/dist/components/CalendarView/index.d.cts +40 -0
  249. package/dist/components/CalendarView/index.d.ts +40 -0
  250. package/dist/components/CalendarView/index.js +9 -0
  251. package/dist/components/CalendarView/index.js.map +1 -0
  252. package/dist/components/Collapsible/index.cjs +5 -5
  253. package/dist/components/Collapsible/index.js +2 -2
  254. package/dist/components/CountryCodeDropdown/index.cjs +6 -6
  255. package/dist/components/CountryCodeDropdown/index.js +3 -3
  256. package/dist/components/CustomizableDashboard/index.cjs +11 -11
  257. package/dist/components/CustomizableDashboard/index.js +4 -4
  258. package/dist/components/DateInput/index.cjs +4 -4
  259. package/dist/components/DateInput/index.js +3 -3
  260. package/dist/components/Dropdown/index.cjs +11 -11
  261. package/dist/components/Dropdown/index.js +4 -4
  262. package/dist/components/FloatingWindow/index.cjs +4 -4
  263. package/dist/components/FloatingWindow/index.js +2 -2
  264. package/dist/components/GanttView/index.cjs +20 -0
  265. package/dist/components/GanttView/index.cjs.map +1 -0
  266. package/dist/components/GanttView/index.d.cts +37 -0
  267. package/dist/components/GanttView/index.d.ts +37 -0
  268. package/dist/components/GanttView/index.js +7 -0
  269. package/dist/components/GanttView/index.js.map +1 -0
  270. package/dist/components/GlossaryTooltip/index.cjs +4 -4
  271. package/dist/components/GlossaryTooltip/index.js +3 -3
  272. package/dist/components/KeyboardShortcutsOverlay/index.cjs +6 -6
  273. package/dist/components/KeyboardShortcutsOverlay/index.js +4 -4
  274. package/dist/components/ListView/index.cjs +22 -0
  275. package/dist/components/ListView/index.cjs.map +1 -0
  276. package/dist/components/ListView/index.d.cts +37 -0
  277. package/dist/components/ListView/index.d.ts +37 -0
  278. package/dist/components/ListView/index.js +9 -0
  279. package/dist/components/ListView/index.js.map +1 -0
  280. package/dist/components/Markdown/index.cjs +19 -19
  281. package/dist/components/Markdown/index.js +7 -7
  282. package/dist/components/MediaEditor/index.cjs +16 -16
  283. package/dist/components/MediaEditor/index.js +11 -11
  284. package/dist/components/MediaPlayer/index.cjs +6 -6
  285. package/dist/components/MediaPlayer/index.js +3 -3
  286. package/dist/components/MegaMenu/index.cjs +23 -0
  287. package/dist/components/MegaMenu/index.cjs.map +1 -0
  288. package/dist/components/MegaMenu/index.d.cts +106 -0
  289. package/dist/components/MegaMenu/index.d.ts +106 -0
  290. package/dist/components/MegaMenu/index.js +6 -0
  291. package/dist/components/MegaMenu/index.js.map +1 -0
  292. package/dist/components/Modal/index.cjs +11 -11
  293. package/dist/components/Modal/index.js +3 -3
  294. package/dist/components/OrbitRing/index.cjs +14 -0
  295. package/dist/components/OrbitRing/index.cjs.map +1 -0
  296. package/dist/components/OrbitRing/index.d.cts +64 -0
  297. package/dist/components/OrbitRing/index.d.ts +64 -0
  298. package/dist/components/OrbitRing/index.js +5 -0
  299. package/dist/components/OrbitRing/index.js.map +1 -0
  300. package/dist/components/QuickAction/index.d.cts +1 -1
  301. package/dist/components/QuickAction/index.d.ts +1 -1
  302. package/dist/components/RadialExplorer/index.cjs +18 -0
  303. package/dist/components/RadialExplorer/index.cjs.map +1 -0
  304. package/dist/components/RadialExplorer/index.d.cts +83 -0
  305. package/dist/components/RadialExplorer/index.d.ts +83 -0
  306. package/dist/components/RadialExplorer/index.js +9 -0
  307. package/dist/components/RadialExplorer/index.js.map +1 -0
  308. package/dist/components/RichTextEditor/index.cjs +9 -9
  309. package/dist/components/RichTextEditor/index.js +6 -6
  310. package/dist/components/SectionSpyNav/index.cjs +4 -4
  311. package/dist/components/SectionSpyNav/index.js +3 -3
  312. package/dist/components/Select/index.cjs +5 -5
  313. package/dist/components/Select/index.js +3 -3
  314. package/dist/components/Sheet/index.cjs +11 -11
  315. package/dist/components/Sheet/index.js +2 -2
  316. package/dist/components/SliderCalculator/index.cjs +20 -0
  317. package/dist/components/SliderCalculator/index.cjs.map +1 -0
  318. package/dist/components/SliderCalculator/index.d.cts +100 -0
  319. package/dist/components/SliderCalculator/index.d.ts +100 -0
  320. package/dist/components/SliderCalculator/index.js +7 -0
  321. package/dist/components/SliderCalculator/index.js.map +1 -0
  322. package/dist/components/SourceTip/index.cjs +4 -4
  323. package/dist/components/SourceTip/index.js +3 -3
  324. package/dist/components/SuperChat/index.cjs +454 -279
  325. package/dist/components/SuperChat/index.cjs.map +1 -1
  326. package/dist/components/SuperChat/index.js +444 -269
  327. package/dist/components/SuperChat/index.js.map +1 -1
  328. package/dist/components/SuperChat/plugins/index.cjs +8 -8
  329. package/dist/components/SuperChat/plugins/index.js +7 -7
  330. package/dist/components/ThemeProvider/index.cjs +9 -9
  331. package/dist/components/ThemeProvider/index.js +3 -3
  332. package/dist/components/Tooltip/index.cjs +3 -3
  333. package/dist/components/Tooltip/index.js +2 -2
  334. package/dist/components/VideoCard/index.cjs +21 -0
  335. package/dist/components/VideoCard/index.cjs.map +1 -0
  336. package/dist/components/VideoCard/index.d.cts +75 -0
  337. package/dist/components/VideoCard/index.d.ts +75 -0
  338. package/dist/components/VideoCard/index.js +8 -0
  339. package/dist/components/VideoCard/index.js.map +1 -0
  340. package/dist/components/ViewSet/index.cjs +23 -0
  341. package/dist/components/ViewSet/index.cjs.map +1 -0
  342. package/dist/components/ViewSet/index.d.cts +89 -0
  343. package/dist/components/ViewSet/index.d.ts +89 -0
  344. package/dist/components/ViewSet/index.js +14 -0
  345. package/dist/components/ViewSet/index.js.map +1 -0
  346. package/dist/components/ViewSwitcher/index.cjs +20 -0
  347. package/dist/components/ViewSwitcher/index.cjs.map +1 -0
  348. package/dist/components/ViewSwitcher/index.d.cts +40 -0
  349. package/dist/components/ViewSwitcher/index.d.ts +40 -0
  350. package/dist/components/ViewSwitcher/index.js +7 -0
  351. package/dist/components/ViewSwitcher/index.js.map +1 -0
  352. package/dist/components/YearTimeline/index.cjs +26 -0
  353. package/dist/components/YearTimeline/index.cjs.map +1 -0
  354. package/dist/components/YearTimeline/index.d.cts +82 -0
  355. package/dist/components/YearTimeline/index.d.ts +82 -0
  356. package/dist/components/YearTimeline/index.js +5 -0
  357. package/dist/components/YearTimeline/index.js.map +1 -0
  358. package/dist/datavis.cjs +2 -2
  359. package/dist/datavis.js +1 -1
  360. package/dist/enterprise-health-ITUNXDIW.js +4 -0
  361. package/dist/{enterprise-health-CWLUB77O.js.map → enterprise-health-ITUNXDIW.js.map} +1 -1
  362. package/dist/enterprise-health-UHHPVPU6.cjs +19 -0
  363. package/dist/{enterprise-health-75VYWAVG.cjs.map → enterprise-health-UHHPVPU6.cjs.map} +1 -1
  364. package/dist/esheet.cjs +18 -18
  365. package/dist/esheet.js +15 -15
  366. package/dist/globe.cjs +306 -0
  367. package/dist/globe.cjs.map +1 -0
  368. package/dist/globe.d.cts +99 -0
  369. package/dist/globe.d.ts +99 -0
  370. package/dist/globe.js +279 -0
  371. package/dist/globe.js.map +1 -0
  372. package/dist/hooks/index.cjs +38 -24
  373. package/dist/hooks/index.d.cts +141 -1
  374. package/dist/hooks/index.d.ts +141 -1
  375. package/dist/hooks/index.js +6 -4
  376. package/dist/index.cjs +1510 -1205
  377. package/dist/index.cjs.map +1 -1
  378. package/dist/index.d.cts +97 -25
  379. package/dist/index.d.ts +97 -25
  380. package/dist/index.js +546 -379
  381. package/dist/index.js.map +1 -1
  382. package/dist/kerebron.cjs +58 -19
  383. package/dist/kerebron.cjs.map +1 -1
  384. package/dist/kerebron.d.cts +37 -0
  385. package/dist/kerebron.d.ts +37 -0
  386. package/dist/kerebron.js +58 -19
  387. package/dist/kerebron.js.map +1 -1
  388. package/dist/{speaker-verify-5GTWAN5Y.cjs → speaker-verify-4NEJAK6C.cjs} +57 -90
  389. package/dist/speaker-verify-4NEJAK6C.cjs.map +1 -0
  390. package/dist/{speaker-verify-R67P433H.js → speaker-verify-AWSKI6DI.js} +57 -90
  391. package/dist/speaker-verify-AWSKI6DI.js.map +1 -0
  392. package/dist/styles/effects.css +128 -0
  393. package/dist/styles/init.css +15 -0
  394. package/dist/styles.css +1 -1
  395. package/dist/tailwind-preset.cjs +4 -4
  396. package/dist/tailwind-preset.js +1 -1
  397. package/dist/types-CbWXIKbe.d.cts +119 -0
  398. package/dist/types-CbWXIKbe.d.ts +119 -0
  399. package/dist/utils/index.cjs +5 -5
  400. package/dist/utils/index.js +1 -1
  401. package/package.json +28 -2
  402. package/dist/CsvBlock-CVYA3HYS.cjs +0 -16
  403. package/dist/CsvBlock-SM4NKSHA.js +0 -7
  404. package/dist/HtmlPreviewBlock-FAMF4W24.js +0 -7
  405. package/dist/HtmlPreviewBlock-JF454L2L.cjs +0 -16
  406. package/dist/MermaidBlock-7V5G4K5A.js +0 -7
  407. package/dist/MermaidBlock-FR5SQX4Q.cjs +0 -16
  408. package/dist/SurveyBlock-6K2POV7S.js +0 -7
  409. package/dist/SurveyBlock-MCJVWR7H.cjs +0 -16
  410. package/dist/chunk-22CYDCXA.js.map +0 -1
  411. package/dist/chunk-IINZWUGK.cjs.map +0 -1
  412. package/dist/chunk-J644FU54.cjs.map +0 -1
  413. package/dist/chunk-KREUYVMZ.js.map +0 -1
  414. package/dist/chunk-MTZPVOP6.js.map +0 -1
  415. package/dist/chunk-P52GA3GJ.cjs.map +0 -1
  416. package/dist/chunk-PY7XAG4D.cjs.map +0 -1
  417. package/dist/chunk-WIAQQNFU.cjs.map +0 -1
  418. package/dist/chunk-WOYUQ4AT.js.map +0 -1
  419. package/dist/chunk-X5YM3KXY.js.map +0 -1
  420. package/dist/enterprise-health-75VYWAVG.cjs +0 -19
  421. package/dist/enterprise-health-CWLUB77O.js +0 -4
  422. package/dist/speaker-verify-5GTWAN5Y.cjs.map +0 -1
  423. package/dist/speaker-verify-R67P433H.js.map +0 -1
@@ -1,7 +1,7 @@
1
1
  import { Separator } from './chunk-OQWZYKJM.js';
2
- import { Dropdown, DropdownSeparator, DropdownLabel, DropdownItem } from './chunk-TZX76ZNZ.js';
2
+ import { Dropdown, DropdownSeparator, DropdownLabel, DropdownItem } from './chunk-ZGRCSNPK.js';
3
3
  import { isHtmlEmpty } from './chunk-ERLPVXOV.js';
4
- import { Button } from './chunk-KREUYVMZ.js';
4
+ import { Button } from './chunk-GOALNQZ2.js';
5
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';
@@ -509,5 +509,5 @@ var RichTextEditor = React.forwardRef(
509
509
  RichTextEditor.displayName = "RichTextEditor";
510
510
 
511
511
  export { RichTextEditor, convertAngleBracketsToMustache, processDictation };
512
- //# sourceMappingURL=chunk-QKFJDQEK.js.map
513
- //# sourceMappingURL=chunk-QKFJDQEK.js.map
512
+ //# sourceMappingURL=chunk-OE5CKRUC.js.map
513
+ //# sourceMappingURL=chunk-OE5CKRUC.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/components/RichTextEditor/processDictation.ts","../src/components/RichTextEditor/RichTextEditor.tsx"],"names":["Fragment"],"mappings":"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","file":"chunk-QKFJDQEK.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 start-0 top-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-OE5CKRUC.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 start-0 top-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"]}
@@ -0,0 +1,170 @@
1
+ 'use strict';
2
+
3
+ // src/components/AI/voiceprintStore.ts
4
+ var DB_NAME = "ozwell-voice";
5
+ var STORE = "voiceprints";
6
+ var DB_VERSION = 1;
7
+ function voiceprintStorageKey(key, namespace) {
8
+ if (namespace === void 0) return key;
9
+ const ns = namespace.trim();
10
+ if (ns.length === 0)
11
+ throw new Error("Voiceprint namespace must not be empty");
12
+ return `${key}:${encodeURIComponent(ns)}`;
13
+ }
14
+ function openDb() {
15
+ return new Promise((resolve, reject) => {
16
+ const req = indexedDB.open(DB_NAME, DB_VERSION);
17
+ req.onupgradeneeded = () => {
18
+ if (!req.result.objectStoreNames.contains(STORE))
19
+ req.result.createObjectStore(STORE);
20
+ };
21
+ req.onsuccess = () => resolve(req.result);
22
+ req.onerror = () => reject(req.error);
23
+ req.onblocked = () => reject(
24
+ new Error("IndexedDB open blocked (another tab holds an upgrade lock)")
25
+ );
26
+ });
27
+ }
28
+ function idbGet(key) {
29
+ return openDb().then(
30
+ (db) => new Promise((resolve, reject) => {
31
+ const req = db.transaction(STORE, "readonly").objectStore(STORE).get(key);
32
+ req.onsuccess = () => {
33
+ resolve(req.result);
34
+ db.close();
35
+ };
36
+ req.onerror = () => {
37
+ reject(req.error);
38
+ db.close();
39
+ };
40
+ })
41
+ );
42
+ }
43
+ function idbSet(key, value) {
44
+ return openDb().then(
45
+ (db) => new Promise((resolve, reject) => {
46
+ const tx = db.transaction(STORE, "readwrite");
47
+ tx.objectStore(STORE).put(value, key);
48
+ tx.oncomplete = () => {
49
+ resolve();
50
+ db.close();
51
+ };
52
+ tx.onerror = () => {
53
+ reject(tx.error);
54
+ db.close();
55
+ };
56
+ tx.onabort = () => {
57
+ reject(tx.error);
58
+ db.close();
59
+ };
60
+ })
61
+ );
62
+ }
63
+ function idbDel(key) {
64
+ return openDb().then(
65
+ (db) => new Promise((resolve, reject) => {
66
+ const tx = db.transaction(STORE, "readwrite");
67
+ tx.objectStore(STORE).delete(key);
68
+ tx.oncomplete = () => {
69
+ resolve();
70
+ db.close();
71
+ };
72
+ tx.onerror = () => {
73
+ reject(tx.error);
74
+ db.close();
75
+ };
76
+ tx.onabort = () => {
77
+ reject(tx.error);
78
+ db.close();
79
+ };
80
+ })
81
+ );
82
+ }
83
+ async function getVoiceprints(key, migrateLegacy) {
84
+ try {
85
+ const existing = await idbGet(key);
86
+ if (existing !== void 0) return existing;
87
+ if (migrateLegacy) {
88
+ let raw = null;
89
+ try {
90
+ raw = localStorage.getItem(key);
91
+ } catch {
92
+ }
93
+ if (raw != null) {
94
+ let migrated;
95
+ try {
96
+ migrated = migrateLegacy(raw);
97
+ } catch {
98
+ try {
99
+ localStorage.removeItem(key);
100
+ } catch {
101
+ }
102
+ return void 0;
103
+ }
104
+ try {
105
+ await idbSet(key, migrated);
106
+ } catch {
107
+ }
108
+ try {
109
+ localStorage.removeItem(key);
110
+ } catch {
111
+ }
112
+ return migrated;
113
+ }
114
+ }
115
+ return void 0;
116
+ } catch {
117
+ return void 0;
118
+ }
119
+ }
120
+ async function setVoiceprints(key, value) {
121
+ try {
122
+ await idbSet(key, value);
123
+ } catch {
124
+ }
125
+ }
126
+ async function clearVoiceprints(key) {
127
+ try {
128
+ await idbDel(key);
129
+ } catch {
130
+ }
131
+ try {
132
+ localStorage.removeItem(key);
133
+ } catch {
134
+ }
135
+ }
136
+ var WHAT_KEY = "ozwellWhatPrints";
137
+ function parseLegacyWhat(raw) {
138
+ let o;
139
+ try {
140
+ o = JSON.parse(raw || "{}") || {};
141
+ } catch {
142
+ return {};
143
+ }
144
+ const out = /* @__PURE__ */ Object.create(null);
145
+ for (const k of Object.keys(o))
146
+ out[k] = (o[k] || []).map((a) => Float32Array.from(a));
147
+ return out;
148
+ }
149
+ function loadWhatPrints(namespace) {
150
+ return getVoiceprints(
151
+ voiceprintStorageKey(WHAT_KEY, namespace),
152
+ namespace === void 0 ? parseLegacyWhat : void 0
153
+ ).then((v) => v ?? {});
154
+ }
155
+ function saveWhatPrints(map, namespace) {
156
+ return setVoiceprints(voiceprintStorageKey(WHAT_KEY, namespace), map);
157
+ }
158
+ function clearWhatPrints(namespace) {
159
+ return clearVoiceprints(voiceprintStorageKey(WHAT_KEY, namespace));
160
+ }
161
+
162
+ exports.clearVoiceprints = clearVoiceprints;
163
+ exports.clearWhatPrints = clearWhatPrints;
164
+ exports.getVoiceprints = getVoiceprints;
165
+ exports.loadWhatPrints = loadWhatPrints;
166
+ exports.saveWhatPrints = saveWhatPrints;
167
+ exports.setVoiceprints = setVoiceprints;
168
+ exports.voiceprintStorageKey = voiceprintStorageKey;
169
+ //# sourceMappingURL=chunk-OGNADPM4.cjs.map
170
+ //# sourceMappingURL=chunk-OGNADPM4.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/AI/voiceprintStore.ts"],"names":[],"mappings":"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","file":"chunk-OGNADPM4.cjs","sourcesContent":["/**\n * IndexedDB store for on-device voiceprints (enrollment vectors), replacing localStorage for this data.\n *\n * Why IndexedDB and not localStorage: it's asynchronous (off the main thread), stores `Float32Array`\n * natively via structured clone (no JSON-stringifying embeddings into bloated number arrays), and isn't\n * capped at ~5 MB. Why not OPFS: these are small *structured records* keyed by id, not large files —\n * IndexedDB is the right tool; OPFS is for the big model files.\n *\n * One object store, keyed by a string id; values are any structured-cloneable object, so `Float32Array`s\n * survive the round-trip intact. On first read of a key it migrates a legacy localStorage value (if a\n * parser is supplied) and then clears it.\n */\n\nconst DB_NAME = 'ozwell-voice';\nconst STORE = 'voiceprints';\nconst DB_VERSION = 1;\n\nexport function voiceprintStorageKey(key: string, namespace?: string): string {\n if (namespace === undefined) return key;\n // Trim before encoding so accidental whitespace (\"user-a \" vs \"user-a\") can't silently split a\n // user's voiceprints across distinct stores.\n const ns = namespace.trim();\n if (ns.length === 0)\n throw new Error('Voiceprint namespace must not be empty');\n return `${key}:${encodeURIComponent(ns)}`;\n}\n\nfunction openDb(): Promise<IDBDatabase> {\n return new Promise((resolve, reject) => {\n const req = indexedDB.open(DB_NAME, DB_VERSION);\n req.onupgradeneeded = () => {\n if (!req.result.objectStoreNames.contains(STORE))\n req.result.createObjectStore(STORE);\n };\n req.onsuccess = () => resolve(req.result);\n req.onerror = () => reject(req.error);\n // If another tab holds an open connection during a version upgrade, the open stays \"blocked\" and\n // would otherwise hang forever — surface it instead so callers hit their catch/fallback paths.\n req.onblocked = () =>\n reject(\n new Error('IndexedDB open blocked (another tab holds an upgrade lock)')\n );\n });\n}\n\nfunction idbGet<T>(key: string): Promise<T | undefined> {\n return openDb().then(\n (db) =>\n new Promise<T | undefined>((resolve, reject) => {\n const req = db\n .transaction(STORE, 'readonly')\n .objectStore(STORE)\n .get(key);\n req.onsuccess = () => {\n resolve(req.result as T | undefined);\n db.close();\n };\n req.onerror = () => {\n reject(req.error);\n db.close();\n };\n })\n );\n}\n\nfunction idbSet(key: string, value: unknown): Promise<void> {\n return openDb().then(\n (db) =>\n new Promise<void>((resolve, reject) => {\n const tx = db.transaction(STORE, 'readwrite');\n tx.objectStore(STORE).put(value, key);\n tx.oncomplete = () => {\n resolve();\n db.close();\n };\n tx.onerror = () => {\n reject(tx.error);\n db.close();\n };\n tx.onabort = () => {\n reject(tx.error);\n db.close();\n }; // else an aborted tx leaves the promise pending\n })\n );\n}\n\nfunction idbDel(key: string): Promise<void> {\n return openDb().then(\n (db) =>\n new Promise<void>((resolve, reject) => {\n const tx = db.transaction(STORE, 'readwrite');\n tx.objectStore(STORE).delete(key);\n tx.oncomplete = () => {\n resolve();\n db.close();\n };\n tx.onerror = () => {\n reject(tx.error);\n db.close();\n };\n tx.onabort = () => {\n reject(tx.error);\n db.close();\n }; // else an aborted tx leaves the promise pending\n })\n );\n}\n\n/**\n * Read a voiceprint record. If IndexedDB has nothing for `key` but localStorage does, migrate it via\n * `migrateLegacy` (parse the old JSON string → the new shape), persist it to IndexedDB, and clear the\n * localStorage copy. Returns `undefined` if neither has it. Never throws (best-effort storage).\n */\nexport async function getVoiceprints<T>(\n key: string,\n migrateLegacy?: (raw: string) => T\n): Promise<T | undefined> {\n try {\n const existing = await idbGet<T>(key);\n if (existing !== undefined) return existing;\n if (migrateLegacy) {\n let raw: string | null = null;\n try {\n raw = localStorage.getItem(key);\n } catch {\n /* ignore */\n }\n if (raw != null) {\n let migrated: T;\n try {\n migrated = migrateLegacy(raw);\n } catch {\n // Corrupt legacy value — drop it so we don't retry the failing migration on every load.\n try {\n localStorage.removeItem(key);\n } catch {\n /* ignore */\n }\n return undefined;\n }\n try {\n await idbSet(key, migrated);\n } catch {\n /* persist is best-effort; still return the migrated value */\n }\n try {\n localStorage.removeItem(key);\n } catch {\n /* ignore */\n }\n return migrated;\n }\n }\n return undefined;\n } catch {\n return undefined;\n }\n}\n\n/** Persist a voiceprint record (Float32Arrays stored natively). Best-effort — resolves even on failure. */\nexport async function setVoiceprints(\n key: string,\n value: unknown\n): Promise<void> {\n try {\n await idbSet(key, value);\n } catch {\n /* best-effort */\n }\n}\n\n/** Remove a voiceprint record (and any stale localStorage copy). */\nexport async function clearVoiceprints(key: string): Promise<void> {\n try {\n await idbDel(key);\n } catch {\n /* ignore */\n }\n try {\n localStorage.removeItem(key);\n } catch {\n /* ignore */\n }\n}\n\n// --- WHAT phrase-prints: per-phrase wake-embedding templates (the WHAT gate). Previously each story kept\n// its own copy of these load/save helpers against localStorage; centralized here on IndexedDB. ---\nconst WHAT_KEY = 'ozwellWhatPrints';\n\n// Legacy localStorage format: JSON `{ phrase: number[][] }`. New IndexedDB format stores Float32Array[]\n// natively, so migration just rehydrates the number arrays once.\nfunction parseLegacyWhat(raw: string): Record<string, Float32Array[]> {\n let o: Record<string, number[][]>;\n try {\n o = (JSON.parse(raw || '{}') || {}) as Record<string, number[][]>;\n } catch {\n return {};\n }\n // Null-prototype output + Object.keys so a legacy `__proto__` key can't pollute Object.prototype.\n const out: Record<string, Float32Array[]> = Object.create(null);\n for (const k of Object.keys(o))\n out[k] = (o[k] || []).map((a) => Float32Array.from(a));\n return out;\n}\n\nexport function loadWhatPrints(\n namespace?: string\n): Promise<Record<string, Float32Array[]>> {\n return getVoiceprints<Record<string, Float32Array[]>>(\n voiceprintStorageKey(WHAT_KEY, namespace),\n namespace === undefined ? parseLegacyWhat : undefined\n ).then((v) => v ?? {});\n}\n\nexport function saveWhatPrints(\n map: Record<string, Float32Array[]>,\n namespace?: string\n): Promise<void> {\n return setVoiceprints(voiceprintStorageKey(WHAT_KEY, namespace), map);\n}\n\nexport function clearWhatPrints(namespace?: string): Promise<void> {\n return clearVoiceprints(voiceprintStorageKey(WHAT_KEY, namespace));\n}\n"]}
@@ -1,6 +1,6 @@
1
+ import { usePrefersReducedMotion } from './chunk-HB7C7NB5.js';
1
2
  import { AnimatedPresence, Animated } from './chunk-XCP454Q6.js';
2
3
  import { cn } from './chunk-TQONQSJO.js';
3
- import { usePrefersReducedMotion } from './chunk-HB7C7NB5.js';
4
4
  import * as React from 'react';
5
5
  import { jsx } from 'react/jsx-runtime';
6
6
 
@@ -123,5 +123,5 @@ var CollapsibleContent = React.forwardRef(({ className, forceMount, children, ..
123
123
  CollapsibleContent.displayName = "CollapsibleContent";
124
124
 
125
125
  export { Collapsible, CollapsibleContent, CollapsibleTrigger };
126
- //# sourceMappingURL=chunk-MBWF36DJ.js.map
127
- //# sourceMappingURL=chunk-MBWF36DJ.js.map
126
+ //# sourceMappingURL=chunk-P2CA3XGI.js.map
127
+ //# sourceMappingURL=chunk-P2CA3XGI.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/components/Collapsible/Collapsible.tsx"],"names":[],"mappings":"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","file":"chunk-MBWF36DJ.js","sourcesContent":["import * as React from 'react';\nimport { cn } from '../../utils/cn';\nimport { Animated, AnimatedPresence } from '../../motion';\nimport { usePrefersReducedMotion } from '../../hooks/usePrefersReducedMotion';\n\ninterface CollapsibleContextValue {\n open: boolean;\n toggle: () => void;\n disabled?: boolean;\n contentId: string;\n triggerId: string;\n}\n\nconst CollapsibleContext = React.createContext<CollapsibleContextValue | null>(\n null\n);\n\nfunction useCollapsibleContext(component: string): CollapsibleContextValue {\n const ctx = React.useContext(CollapsibleContext);\n if (!ctx) {\n throw new Error(`${component} must be used within a <Collapsible>`);\n }\n return ctx;\n}\n\nexport interface CollapsibleProps extends React.HTMLAttributes<HTMLDivElement> {\n /** Controlled open state */\n open?: boolean;\n /** Default open state (uncontrolled) */\n defaultOpen?: boolean;\n /** Callback fired when the open state changes */\n onOpenChange?: (open: boolean) => void;\n /** Disables toggling */\n disabled?: boolean;\n}\n\n/**\n * An interactive component that expands and collapses its content.\n *\n * @example\n * ```tsx\n * <Collapsible>\n * <CollapsibleTrigger>Toggle</CollapsibleTrigger>\n * <CollapsibleContent>Hidden content</CollapsibleContent>\n * </Collapsible>\n * ```\n */\nconst Collapsible = React.forwardRef<HTMLDivElement, CollapsibleProps>(\n (\n {\n className,\n open: controlledOpen,\n defaultOpen = false,\n onOpenChange,\n disabled,\n children,\n ...props\n },\n ref\n ) => {\n const [uncontrolledOpen, setUncontrolledOpen] = React.useState(defaultOpen);\n const generatedId = React.useId();\n\n const isControlled = controlledOpen !== undefined;\n const open = isControlled ? controlledOpen : uncontrolledOpen;\n\n const toggle = React.useCallback(() => {\n if (disabled) return;\n const next = !open;\n if (!isControlled) setUncontrolledOpen(next);\n onOpenChange?.(next);\n }, [disabled, open, isControlled, onOpenChange]);\n\n const value = React.useMemo<CollapsibleContextValue>(\n () => ({\n open,\n toggle,\n disabled,\n contentId: `${generatedId}-content`,\n triggerId: `${generatedId}-trigger`,\n }),\n [open, toggle, disabled, generatedId]\n );\n\n return (\n <CollapsibleContext.Provider value={value}>\n <div\n ref={ref}\n data-slot=\"collapsible\"\n data-state={open ? 'open' : 'closed'}\n className={cn(className)}\n {...props}\n >\n {children}\n </div>\n </CollapsibleContext.Provider>\n );\n }\n);\n\nCollapsible.displayName = 'Collapsible';\n\nexport type CollapsibleTriggerProps =\n React.ButtonHTMLAttributes<HTMLButtonElement>;\n\nconst CollapsibleTrigger = React.forwardRef<\n HTMLButtonElement,\n CollapsibleTriggerProps\n>(({ className, onClick, children, ...props }, ref) => {\n const { open, toggle, disabled, contentId, triggerId } =\n useCollapsibleContext('CollapsibleTrigger');\n\n return (\n <button\n ref={ref}\n type=\"button\"\n id={triggerId}\n data-slot=\"collapsible-trigger\"\n aria-expanded={open}\n aria-controls={contentId}\n data-state={open ? 'open' : 'closed'}\n disabled={disabled}\n onClick={(e) => {\n toggle();\n onClick?.(e);\n }}\n className={cn(className)}\n {...props}\n >\n {children}\n </button>\n );\n});\n\nCollapsibleTrigger.displayName = 'CollapsibleTrigger';\n\nexport interface CollapsibleContentProps extends React.HTMLAttributes<HTMLDivElement> {\n /** Keep content mounted when collapsed (hidden via CSS) */\n forceMount?: boolean;\n}\n\nconst CollapsibleContent = React.forwardRef<\n HTMLDivElement,\n CollapsibleContentProps\n>(({ className, forceMount, children, ...props }, ref) => {\n const { open, contentId, triggerId } =\n useCollapsibleContext('CollapsibleContent');\n const prefersReducedMotion = usePrefersReducedMotion();\n\n const sharedProps = {\n id: contentId,\n role: 'region' as const,\n 'aria-labelledby': triggerId,\n 'data-slot': 'collapsible-content',\n 'data-state': open ? ('open' as const) : ('closed' as const),\n };\n\n /*\n * `forceMount` keeps the old instant behaviour, deliberately.\n *\n * It exists so consumers can keep collapsed content in the DOM, and it relies\n * on `hidden` to keep that content out of the tab order and the accessibility\n * tree. `hidden` is `display: none`, which an animated height cannot run\n * through — and dropping it for the duration would leave keyboard users able\n * to tab into content that is visually collapsed. Sequencing `hidden` around\n * the animation is the real fix; until then, not animating is the safe\n * answer, and the default (unmounting) path below covers the common case.\n */\n if (forceMount) {\n return (\n <div\n ref={ref}\n {...sharedProps}\n hidden={!open}\n className={cn(className)}\n {...props}\n >\n {children}\n </div>\n );\n }\n\n return (\n <AnimatedPresence initial={false}>\n {open && (\n <Animated\n key=\"collapsible-content\"\n ref={ref as React.Ref<HTMLElement>}\n preset=\"collapse\"\n mode=\"presence\"\n // `collapse` animates height, which `MotionConfig reducedMotion=\"user\"`\n // does not treat as a transform or layout animation and so leaves\n // running. Honouring the preference is the component's job here.\n enabled={!prefersReducedMotion}\n {...sharedProps}\n // Content must be clipped or it spills past the box while the height\n // is still travelling.\n className={cn('overflow-hidden', className)}\n {...props}\n >\n {children}\n </Animated>\n )}\n </AnimatedPresence>\n );\n});\n\nCollapsibleContent.displayName = 'CollapsibleContent';\n\nexport { Collapsible, CollapsibleTrigger, CollapsibleContent };\n"]}
1
+ {"version":3,"sources":["../src/components/Collapsible/Collapsible.tsx"],"names":[],"mappings":"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","file":"chunk-P2CA3XGI.js","sourcesContent":["import * as React from 'react';\nimport { cn } from '../../utils/cn';\nimport { Animated, AnimatedPresence } from '../../motion';\nimport { usePrefersReducedMotion } from '../../hooks/usePrefersReducedMotion';\n\ninterface CollapsibleContextValue {\n open: boolean;\n toggle: () => void;\n disabled?: boolean;\n contentId: string;\n triggerId: string;\n}\n\nconst CollapsibleContext = React.createContext<CollapsibleContextValue | null>(\n null\n);\n\nfunction useCollapsibleContext(component: string): CollapsibleContextValue {\n const ctx = React.useContext(CollapsibleContext);\n if (!ctx) {\n throw new Error(`${component} must be used within a <Collapsible>`);\n }\n return ctx;\n}\n\nexport interface CollapsibleProps extends React.HTMLAttributes<HTMLDivElement> {\n /** Controlled open state */\n open?: boolean;\n /** Default open state (uncontrolled) */\n defaultOpen?: boolean;\n /** Callback fired when the open state changes */\n onOpenChange?: (open: boolean) => void;\n /** Disables toggling */\n disabled?: boolean;\n}\n\n/**\n * An interactive component that expands and collapses its content.\n *\n * @example\n * ```tsx\n * <Collapsible>\n * <CollapsibleTrigger>Toggle</CollapsibleTrigger>\n * <CollapsibleContent>Hidden content</CollapsibleContent>\n * </Collapsible>\n * ```\n */\nconst Collapsible = React.forwardRef<HTMLDivElement, CollapsibleProps>(\n (\n {\n className,\n open: controlledOpen,\n defaultOpen = false,\n onOpenChange,\n disabled,\n children,\n ...props\n },\n ref\n ) => {\n const [uncontrolledOpen, setUncontrolledOpen] = React.useState(defaultOpen);\n const generatedId = React.useId();\n\n const isControlled = controlledOpen !== undefined;\n const open = isControlled ? controlledOpen : uncontrolledOpen;\n\n const toggle = React.useCallback(() => {\n if (disabled) return;\n const next = !open;\n if (!isControlled) setUncontrolledOpen(next);\n onOpenChange?.(next);\n }, [disabled, open, isControlled, onOpenChange]);\n\n const value = React.useMemo<CollapsibleContextValue>(\n () => ({\n open,\n toggle,\n disabled,\n contentId: `${generatedId}-content`,\n triggerId: `${generatedId}-trigger`,\n }),\n [open, toggle, disabled, generatedId]\n );\n\n return (\n <CollapsibleContext.Provider value={value}>\n <div\n ref={ref}\n data-slot=\"collapsible\"\n data-state={open ? 'open' : 'closed'}\n className={cn(className)}\n {...props}\n >\n {children}\n </div>\n </CollapsibleContext.Provider>\n );\n }\n);\n\nCollapsible.displayName = 'Collapsible';\n\nexport type CollapsibleTriggerProps =\n React.ButtonHTMLAttributes<HTMLButtonElement>;\n\nconst CollapsibleTrigger = React.forwardRef<\n HTMLButtonElement,\n CollapsibleTriggerProps\n>(({ className, onClick, children, ...props }, ref) => {\n const { open, toggle, disabled, contentId, triggerId } =\n useCollapsibleContext('CollapsibleTrigger');\n\n return (\n <button\n ref={ref}\n type=\"button\"\n id={triggerId}\n data-slot=\"collapsible-trigger\"\n aria-expanded={open}\n aria-controls={contentId}\n data-state={open ? 'open' : 'closed'}\n disabled={disabled}\n onClick={(e) => {\n toggle();\n onClick?.(e);\n }}\n className={cn(className)}\n {...props}\n >\n {children}\n </button>\n );\n});\n\nCollapsibleTrigger.displayName = 'CollapsibleTrigger';\n\nexport interface CollapsibleContentProps extends React.HTMLAttributes<HTMLDivElement> {\n /** Keep content mounted when collapsed (hidden via CSS) */\n forceMount?: boolean;\n}\n\nconst CollapsibleContent = React.forwardRef<\n HTMLDivElement,\n CollapsibleContentProps\n>(({ className, forceMount, children, ...props }, ref) => {\n const { open, contentId, triggerId } =\n useCollapsibleContext('CollapsibleContent');\n const prefersReducedMotion = usePrefersReducedMotion();\n\n const sharedProps = {\n id: contentId,\n role: 'region' as const,\n 'aria-labelledby': triggerId,\n 'data-slot': 'collapsible-content',\n 'data-state': open ? ('open' as const) : ('closed' as const),\n };\n\n /*\n * `forceMount` keeps the old instant behaviour, deliberately.\n *\n * It exists so consumers can keep collapsed content in the DOM, and it relies\n * on `hidden` to keep that content out of the tab order and the accessibility\n * tree. `hidden` is `display: none`, which an animated height cannot run\n * through — and dropping it for the duration would leave keyboard users able\n * to tab into content that is visually collapsed. Sequencing `hidden` around\n * the animation is the real fix; until then, not animating is the safe\n * answer, and the default (unmounting) path below covers the common case.\n */\n if (forceMount) {\n return (\n <div\n ref={ref}\n {...sharedProps}\n hidden={!open}\n className={cn(className)}\n {...props}\n >\n {children}\n </div>\n );\n }\n\n return (\n <AnimatedPresence initial={false}>\n {open && (\n <Animated\n key=\"collapsible-content\"\n ref={ref as React.Ref<HTMLElement>}\n preset=\"collapse\"\n mode=\"presence\"\n // `collapse` animates height, which `MotionConfig reducedMotion=\"user\"`\n // does not treat as a transform or layout animation and so leaves\n // running. Honouring the preference is the component's job here.\n enabled={!prefersReducedMotion}\n {...sharedProps}\n // Content must be clipped or it spills past the box while the height\n // is still travelling.\n className={cn('overflow-hidden', className)}\n {...props}\n >\n {children}\n </Animated>\n )}\n </AnimatedPresence>\n );\n});\n\nCollapsibleContent.displayName = 'CollapsibleContent';\n\nexport { Collapsible, CollapsibleTrigger, CollapsibleContent };\n"]}
@@ -0,0 +1,152 @@
1
+ import * as React from 'react';
2
+
3
+ // src/hooks/useYouTubeHoverPreview.ts
4
+ var ytApiPromise = null;
5
+ var YT_API_TIMEOUT_MS = 1e4;
6
+ function loadYouTubeIframeApi() {
7
+ if (typeof window === "undefined") return Promise.resolve();
8
+ const w = window;
9
+ if (w.YT?.Player) return Promise.resolve();
10
+ if (ytApiPromise) return ytApiPromise;
11
+ ytApiPromise = new Promise((resolve, reject) => {
12
+ const prev = w.onYouTubeIframeAPIReady;
13
+ let timer;
14
+ const settle = (err) => {
15
+ if (timer !== void 0) window.clearTimeout(timer);
16
+ timer = void 0;
17
+ if (err) {
18
+ ytApiPromise = null;
19
+ reject(err);
20
+ } else {
21
+ resolve();
22
+ }
23
+ };
24
+ w.onYouTubeIframeAPIReady = () => {
25
+ prev?.();
26
+ settle();
27
+ };
28
+ const tag = document.createElement("script");
29
+ tag.src = "https://www.youtube.com/iframe_api";
30
+ tag.async = true;
31
+ tag.onerror = () => settle(new Error("Failed to load the YouTube iframe API"));
32
+ timer = window.setTimeout(
33
+ () => settle(new Error("Timed out loading the YouTube iframe API")),
34
+ YT_API_TIMEOUT_MS
35
+ );
36
+ document.head.appendChild(tag);
37
+ });
38
+ return ytApiPromise;
39
+ }
40
+ function useYouTubeHoverPreview(youtubeId, {
41
+ dwellMs = 600,
42
+ host = "https://www.youtube-nocookie.com",
43
+ enabled = true
44
+ } = {}) {
45
+ const [preview, setPreview] = React.useState("idle");
46
+ const [progress, setProgress] = React.useState(0);
47
+ const hostRef = React.useRef(null);
48
+ const playerRef = React.useRef(null);
49
+ const hoveringRef = React.useRef(false);
50
+ const enterTimerRef = React.useRef(null);
51
+ const pollRef = React.useRef(null);
52
+ const stopPreview = React.useCallback(() => {
53
+ hoveringRef.current = false;
54
+ if (enterTimerRef.current !== null) {
55
+ window.clearTimeout(enterTimerRef.current);
56
+ enterTimerRef.current = null;
57
+ }
58
+ if (pollRef.current !== null) {
59
+ window.clearInterval(pollRef.current);
60
+ pollRef.current = null;
61
+ }
62
+ if (playerRef.current) {
63
+ try {
64
+ playerRef.current.destroy();
65
+ } catch {
66
+ }
67
+ playerRef.current = null;
68
+ }
69
+ if (hostRef.current) hostRef.current.innerHTML = "";
70
+ setPreview("idle");
71
+ setProgress(0);
72
+ }, []);
73
+ const beginPlayer = React.useCallback(() => {
74
+ const el = hostRef.current;
75
+ const YT = window.YT;
76
+ if (!el || !YT?.Player || playerRef.current || !hoveringRef.current || !youtubeId)
77
+ return;
78
+ const target = document.createElement("div");
79
+ el.appendChild(target);
80
+ const startPolling = () => {
81
+ if (pollRef.current !== null) return;
82
+ pollRef.current = window.setInterval(() => {
83
+ const p = playerRef.current;
84
+ if (!p) return;
85
+ const d = p.getDuration();
86
+ if (d > 0) setProgress(Math.min(p.getCurrentTime() / d, 1));
87
+ }, 200);
88
+ };
89
+ playerRef.current = new YT.Player(target, {
90
+ videoId: youtubeId,
91
+ host,
92
+ width: "100%",
93
+ height: "100%",
94
+ playerVars: {
95
+ autoplay: 1,
96
+ mute: 1,
97
+ controls: 0,
98
+ playsinline: 1,
99
+ modestbranding: 1,
100
+ rel: 0,
101
+ disablekb: 1,
102
+ fs: 0,
103
+ iv_load_policy: 3,
104
+ start: 0
105
+ },
106
+ events: {
107
+ onReady: (e) => {
108
+ if (!hoveringRef.current) {
109
+ stopPreview();
110
+ return;
111
+ }
112
+ e.target.mute();
113
+ e.target.playVideo();
114
+ },
115
+ onStateChange: (e) => {
116
+ if (e.data === 1) {
117
+ setPreview("playing");
118
+ startPolling();
119
+ } else if (e.data === 0 && playerRef.current) {
120
+ playerRef.current.seekTo(0, true);
121
+ playerRef.current.playVideo();
122
+ }
123
+ },
124
+ onError: () => stopPreview()
125
+ }
126
+ });
127
+ if (!hoveringRef.current) stopPreview();
128
+ }, [youtubeId, host, stopPreview]);
129
+ const handleEnter = React.useCallback(() => {
130
+ if (!enabled || !youtubeId || typeof window === "undefined" || !window.matchMedia("(hover: hover)").matches || window.matchMedia("(prefers-reduced-motion: reduce)").matches) {
131
+ return;
132
+ }
133
+ hoveringRef.current = true;
134
+ if (enterTimerRef.current !== null || playerRef.current) return;
135
+ enterTimerRef.current = window.setTimeout(() => {
136
+ enterTimerRef.current = null;
137
+ if (!hoveringRef.current) return;
138
+ setPreview("loading");
139
+ void loadYouTubeIframeApi().then(() => {
140
+ if (hoveringRef.current) beginPlayer();
141
+ }).catch(() => {
142
+ stopPreview();
143
+ });
144
+ }, dwellMs);
145
+ }, [enabled, youtubeId, dwellMs, beginPlayer, stopPreview]);
146
+ React.useEffect(() => stopPreview, [stopPreview]);
147
+ return { preview, progress, hostRef, handleEnter, stopPreview };
148
+ }
149
+
150
+ export { useYouTubeHoverPreview };
151
+ //# sourceMappingURL=chunk-POWS35OT.js.map
152
+ //# sourceMappingURL=chunk-POWS35OT.js.map