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

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 (336) hide show
  1. package/dist/CsvBlock-ROJCKJDP.cjs +16 -0
  2. package/dist/{CsvBlock-CVYA3HYS.cjs.map → CsvBlock-ROJCKJDP.cjs.map} +1 -1
  3. package/dist/CsvBlock-UWPMTLE2.js +7 -0
  4. package/dist/{CsvBlock-SM4NKSHA.js.map → CsvBlock-UWPMTLE2.js.map} +1 -1
  5. package/dist/HtmlPreviewBlock-DWFN6EUB.cjs +16 -0
  6. package/dist/{HtmlPreviewBlock-JF454L2L.cjs.map → HtmlPreviewBlock-DWFN6EUB.cjs.map} +1 -1
  7. package/dist/HtmlPreviewBlock-ME5U3XNS.js +7 -0
  8. package/dist/{HtmlPreviewBlock-FAMF4W24.js.map → HtmlPreviewBlock-ME5U3XNS.js.map} +1 -1
  9. package/dist/MermaidBlock-2B6CPD6Y.js +7 -0
  10. package/dist/{MermaidBlock-7V5G4K5A.js.map → MermaidBlock-2B6CPD6Y.js.map} +1 -1
  11. package/dist/MermaidBlock-D2UC5M55.cjs +16 -0
  12. package/dist/{MermaidBlock-FR5SQX4Q.cjs.map → MermaidBlock-D2UC5M55.cjs.map} +1 -1
  13. package/dist/SurveyBlock-4CD4AYMJ.cjs +16 -0
  14. package/dist/{SurveyBlock-MCJVWR7H.cjs.map → SurveyBlock-4CD4AYMJ.cjs.map} +1 -1
  15. package/dist/SurveyBlock-4DO62RBT.js +7 -0
  16. package/dist/{SurveyBlock-6K2POV7S.js.map → SurveyBlock-4DO62RBT.js.map} +1 -1
  17. package/dist/brands/index.cjs +13 -13
  18. package/dist/brands/index.js +4 -4
  19. package/dist/brands/types.cjs +4 -4
  20. package/dist/brands/types.d.cts +9 -0
  21. package/dist/brands/types.d.ts +9 -0
  22. package/dist/brands/types.js +1 -1
  23. package/dist/{chunk-XTHMC76F.cjs → chunk-2G75X6TS.cjs} +4 -4
  24. package/dist/{chunk-XTHMC76F.cjs.map → chunk-2G75X6TS.cjs.map} +1 -1
  25. package/dist/chunk-2IZLKPUW.js +412 -0
  26. package/dist/chunk-2IZLKPUW.js.map +1 -0
  27. package/dist/{chunk-AZP3DDBT.cjs → chunk-2QKBTPUC.cjs} +8 -8
  28. package/dist/{chunk-AZP3DDBT.cjs.map → chunk-2QKBTPUC.cjs.map} +1 -1
  29. package/dist/{chunk-7KWNY3HG.js → chunk-2YCERQWC.js} +8 -8
  30. package/dist/{chunk-7KWNY3HG.js.map → chunk-2YCERQWC.js.map} +1 -1
  31. package/dist/{chunk-VSVGMMNO.js → chunk-3M7TAXNR.js} +3 -3
  32. package/dist/{chunk-VSVGMMNO.js.map → chunk-3M7TAXNR.js.map} +1 -1
  33. package/dist/{chunk-5Z6UPVGC.cjs → chunk-3QEVGSFG.cjs} +5 -5
  34. package/dist/{chunk-5Z6UPVGC.cjs.map → chunk-3QEVGSFG.cjs.map} +1 -1
  35. package/dist/{chunk-PYHFVYVZ.js → chunk-3QGS6CXD.js} +3 -3
  36. package/dist/{chunk-PYHFVYVZ.js.map → chunk-3QGS6CXD.js.map} +1 -1
  37. package/dist/chunk-462XSCP3.cjs +199 -0
  38. package/dist/chunk-462XSCP3.cjs.map +1 -0
  39. package/dist/{chunk-WOYUQ4AT.js → chunk-5GOWFNQ6.js} +9 -3
  40. package/dist/chunk-5GOWFNQ6.js.map +1 -0
  41. package/dist/chunk-5GUOOLPR.cjs +436 -0
  42. package/dist/chunk-5GUOOLPR.cjs.map +1 -0
  43. package/dist/{chunk-WUBMDOTG.js → chunk-5JJ2DAE4.js} +4 -4
  44. package/dist/{chunk-WUBMDOTG.js.map → chunk-5JJ2DAE4.js.map} +1 -1
  45. package/dist/{chunk-RSCA5AZW.cjs → chunk-5MCBWTIF.cjs} +4 -4
  46. package/dist/{chunk-RSCA5AZW.cjs.map → chunk-5MCBWTIF.cjs.map} +1 -1
  47. package/dist/chunk-6EN3IQQI.cjs +332 -0
  48. package/dist/chunk-6EN3IQQI.cjs.map +1 -0
  49. package/dist/chunk-74ENCTIK.js +162 -0
  50. package/dist/chunk-74ENCTIK.js.map +1 -0
  51. package/dist/{chunk-OAZUDUGX.js → chunk-7IBZA7G6.js} +4 -4
  52. package/dist/{chunk-OAZUDUGX.js.map → chunk-7IBZA7G6.js.map} +1 -1
  53. package/dist/{chunk-AUOTJQGO.cjs → chunk-7ZDPD5ZX.cjs} +4 -4
  54. package/dist/{chunk-AUOTJQGO.cjs.map → chunk-7ZDPD5ZX.cjs.map} +1 -1
  55. package/dist/{chunk-IB54SKWB.cjs → chunk-7ZXAQTV4.cjs} +8 -8
  56. package/dist/{chunk-IB54SKWB.cjs.map → chunk-7ZXAQTV4.cjs.map} +1 -1
  57. package/dist/{chunk-IIFQ6BSJ.js → chunk-ACCAXVOG.js} +6 -6
  58. package/dist/{chunk-IIFQ6BSJ.js.map → chunk-ACCAXVOG.js.map} +1 -1
  59. package/dist/chunk-CR2SDI23.cjs +322 -0
  60. package/dist/chunk-CR2SDI23.cjs.map +1 -0
  61. package/dist/{chunk-OSPTA4UR.js → chunk-DEDN5HAG.js} +3 -3
  62. package/dist/{chunk-OSPTA4UR.js.map → chunk-DEDN5HAG.js.map} +1 -1
  63. package/dist/{chunk-PKD3JLS2.cjs → chunk-E4IBHYJ7.cjs} +9 -9
  64. package/dist/{chunk-PKD3JLS2.cjs.map → chunk-E4IBHYJ7.cjs.map} +1 -1
  65. package/dist/{chunk-E3KC2XLN.cjs → chunk-ELPW32ZI.cjs} +50 -50
  66. package/dist/{chunk-E3KC2XLN.cjs.map → chunk-ELPW32ZI.cjs.map} +1 -1
  67. package/dist/{chunk-QSVQABXD.js → chunk-ENKFJJZX.js} +7 -7
  68. package/dist/{chunk-QSVQABXD.js.map → chunk-ENKFJJZX.js.map} +1 -1
  69. package/dist/{chunk-MUIDWFYJ.js → chunk-FJ7YPVKV.js} +3 -3
  70. package/dist/{chunk-MUIDWFYJ.js.map → chunk-FJ7YPVKV.js.map} +1 -1
  71. package/dist/{chunk-3LHICE4I.cjs → chunk-FXO5ARBB.cjs} +5 -5
  72. package/dist/{chunk-3LHICE4I.cjs.map → chunk-FXO5ARBB.cjs.map} +1 -1
  73. package/dist/{chunk-QKAYRHWP.cjs → chunk-G3JX3UAU.cjs} +12 -12
  74. package/dist/{chunk-QKAYRHWP.cjs.map → chunk-G3JX3UAU.cjs.map} +1 -1
  75. package/dist/{chunk-OMAACCFW.cjs → chunk-GD7EBGC4.cjs} +19 -19
  76. package/dist/{chunk-OMAACCFW.cjs.map → chunk-GD7EBGC4.cjs.map} +1 -1
  77. package/dist/{chunk-KREUYVMZ.js → chunk-GOALNQZ2.js} +13 -4
  78. package/dist/chunk-GOALNQZ2.js.map +1 -0
  79. package/dist/{chunk-CK3KLRNF.js → chunk-H4ZXMQQW.js} +3 -3
  80. package/dist/{chunk-CK3KLRNF.js.map → chunk-H4ZXMQQW.js.map} +1 -1
  81. package/dist/{chunk-AHINB2TP.cjs → chunk-IX6KFB3K.cjs} +9 -9
  82. package/dist/{chunk-AHINB2TP.cjs.map → chunk-IX6KFB3K.cjs.map} +1 -1
  83. package/dist/chunk-IXFC7LK2.cjs +174 -0
  84. package/dist/chunk-IXFC7LK2.cjs.map +1 -0
  85. package/dist/{chunk-VNAREBLV.cjs → chunk-J5CSLNCN.cjs} +3 -3
  86. package/dist/{chunk-VNAREBLV.cjs.map → chunk-J5CSLNCN.cjs.map} +1 -1
  87. package/dist/{chunk-24SEAAOH.js → chunk-JHULS3EC.js} +2 -2
  88. package/dist/{chunk-24SEAAOH.js.map → chunk-JHULS3EC.js.map} +1 -1
  89. package/dist/{chunk-X5YM3KXY.js → chunk-JI244Y7C.js} +177 -3
  90. package/dist/chunk-JI244Y7C.js.map +1 -0
  91. package/dist/{chunk-MM7QKUE3.cjs → chunk-JID7AZTO.cjs} +5 -5
  92. package/dist/{chunk-MM7QKUE3.cjs.map → chunk-JID7AZTO.cjs.map} +1 -1
  93. package/dist/{chunk-ZB54MTMQ.js → chunk-KZFBQ7GY.js} +3 -3
  94. package/dist/{chunk-ZB54MTMQ.js.map → chunk-KZFBQ7GY.js.map} +1 -1
  95. package/dist/{chunk-XBXDUAIM.js → chunk-LL6IWKI3.js} +4 -4
  96. package/dist/{chunk-XBXDUAIM.js.map → chunk-LL6IWKI3.js.map} +1 -1
  97. package/dist/{chunk-ON4JULCA.js → chunk-LMBXJZLG.js} +3 -3
  98. package/dist/{chunk-ON4JULCA.js.map → chunk-LMBXJZLG.js.map} +1 -1
  99. package/dist/chunk-MWVW4APN.cjs +260 -0
  100. package/dist/chunk-MWVW4APN.cjs.map +1 -0
  101. package/dist/{chunk-BZAGP5W6.cjs → chunk-N6IY47YA.cjs} +8 -8
  102. package/dist/{chunk-BZAGP5W6.cjs.map → chunk-N6IY47YA.cjs.map} +1 -1
  103. package/dist/{chunk-OCV33S5Q.cjs → chunk-NFKX6QJP.cjs} +3 -3
  104. package/dist/{chunk-OCV33S5Q.cjs.map → chunk-NFKX6QJP.cjs.map} +1 -1
  105. package/dist/{chunk-J644FU54.cjs → chunk-NGQRS7AW.cjs} +9 -3
  106. package/dist/chunk-NGQRS7AW.cjs.map +1 -0
  107. package/dist/{chunk-QAKASRE6.js → chunk-NJ6MY6V5.js} +4 -4
  108. package/dist/{chunk-QAKASRE6.js.map → chunk-NJ6MY6V5.js.map} +1 -1
  109. package/dist/{chunk-P52GA3GJ.cjs → chunk-NM7O7RY5.cjs} +4 -2
  110. package/dist/chunk-NM7O7RY5.cjs.map +1 -0
  111. package/dist/{chunk-OFUKTVBN.cjs → chunk-OD47TTAW.cjs} +9 -9
  112. package/dist/{chunk-OFUKTVBN.cjs.map → chunk-OD47TTAW.cjs.map} +1 -1
  113. package/dist/{chunk-QKFJDQEK.js → chunk-OE5CKRUC.js} +4 -4
  114. package/dist/{chunk-QKFJDQEK.js.map → chunk-OE5CKRUC.js.map} +1 -1
  115. package/dist/chunk-OGNADPM4.cjs +170 -0
  116. package/dist/chunk-OGNADPM4.cjs.map +1 -0
  117. package/dist/{chunk-MBWF36DJ.js → chunk-P2CA3XGI.js} +3 -3
  118. package/dist/{chunk-MBWF36DJ.js.map → chunk-P2CA3XGI.js.map} +1 -1
  119. package/dist/chunk-POWS35OT.js +152 -0
  120. package/dist/chunk-POWS35OT.js.map +1 -0
  121. package/dist/chunk-PYJDVWXM.js +237 -0
  122. package/dist/chunk-PYJDVWXM.js.map +1 -0
  123. package/dist/{chunk-MTZPVOP6.js → chunk-Q77TE5DZ.js} +4 -2
  124. package/dist/chunk-Q77TE5DZ.js.map +1 -0
  125. package/dist/{chunk-L5W7TJQ5.js → chunk-RJ6NTJHC.js} +4 -4
  126. package/dist/{chunk-L5W7TJQ5.js.map → chunk-RJ6NTJHC.js.map} +1 -1
  127. package/dist/{chunk-C3DUS2VE.cjs → chunk-RS5VA6QU.cjs} +3 -3
  128. package/dist/{chunk-C3DUS2VE.cjs.map → chunk-RS5VA6QU.cjs.map} +1 -1
  129. package/dist/{chunk-IGNWT6RP.js → chunk-S7WCHDBO.js} +4 -4
  130. package/dist/{chunk-IGNWT6RP.js.map → chunk-S7WCHDBO.js.map} +1 -1
  131. package/dist/{chunk-RXPEZXAB.cjs → chunk-SGFYA22I.cjs} +5 -5
  132. package/dist/{chunk-RXPEZXAB.cjs.map → chunk-SGFYA22I.cjs.map} +1 -1
  133. package/dist/chunk-SQJFBZ42.js +297 -0
  134. package/dist/chunk-SQJFBZ42.js.map +1 -0
  135. package/dist/chunk-SUS3WFY3.js +156 -0
  136. package/dist/chunk-SUS3WFY3.js.map +1 -0
  137. package/dist/{chunk-H4AVMUOC.cjs → chunk-TAXD5ADA.cjs} +4 -4
  138. package/dist/{chunk-H4AVMUOC.cjs.map → chunk-TAXD5ADA.cjs.map} +1 -1
  139. package/dist/{chunk-NHN6A3ZO.js → chunk-TMMVIUUN.js} +4 -4
  140. package/dist/{chunk-NHN6A3ZO.js.map → chunk-TMMVIUUN.js.map} +1 -1
  141. package/dist/chunk-TPWKM7JH.js +196 -0
  142. package/dist/chunk-TPWKM7JH.js.map +1 -0
  143. package/dist/chunk-TU63764L.cjs +158 -0
  144. package/dist/chunk-TU63764L.cjs.map +1 -0
  145. package/dist/{chunk-PY7XAG4D.cjs → chunk-U42F3HLE.cjs} +177 -3
  146. package/dist/chunk-U42F3HLE.cjs.map +1 -0
  147. package/dist/{chunk-X5QRRMGB.cjs → chunk-UAMXCMST.cjs} +4 -4
  148. package/dist/{chunk-X5QRRMGB.cjs.map → chunk-UAMXCMST.cjs.map} +1 -1
  149. package/dist/{chunk-QAQOCS2J.js → chunk-UBOVDAD7.js} +3 -3
  150. package/dist/{chunk-QAQOCS2J.js.map → chunk-UBOVDAD7.js.map} +1 -1
  151. package/dist/{chunk-IGSIWNX3.cjs → chunk-UQ3VVR6A.cjs} +4 -4
  152. package/dist/{chunk-IGSIWNX3.cjs.map → chunk-UQ3VVR6A.cjs.map} +1 -1
  153. package/dist/{chunk-6QKMMKRY.cjs → chunk-UV2FVNWT.cjs} +5 -5
  154. package/dist/{chunk-6QKMMKRY.cjs.map → chunk-UV2FVNWT.cjs.map} +1 -1
  155. package/dist/{chunk-EG7XFZ3W.js → chunk-V7D3YGUV.js} +4 -4
  156. package/dist/{chunk-EG7XFZ3W.js.map → chunk-V7D3YGUV.js.map} +1 -1
  157. package/dist/{chunk-Y6DFMDMH.js → chunk-VILW53UZ.js} +3 -3
  158. package/dist/{chunk-Y6DFMDMH.js.map → chunk-VILW53UZ.js.map} +1 -1
  159. package/dist/{chunk-5WOB4UBD.js → chunk-VKELAMAZ.js} +3 -3
  160. package/dist/{chunk-5WOB4UBD.js.map → chunk-VKELAMAZ.js.map} +1 -1
  161. package/dist/{chunk-IINZWUGK.cjs → chunk-VNYW4C4J.cjs} +13 -4
  162. package/dist/chunk-VNYW4C4J.cjs.map +1 -0
  163. package/dist/{chunk-RD3JDFYJ.js → chunk-VOKVG3ER.js} +4 -4
  164. package/dist/{chunk-RD3JDFYJ.js.map → chunk-VOKVG3ER.js.map} +1 -1
  165. package/dist/{chunk-37UZHCLM.cjs → chunk-VPWJCJCX.cjs} +3 -3
  166. package/dist/{chunk-37UZHCLM.cjs.map → chunk-VPWJCJCX.cjs.map} +1 -1
  167. package/dist/{chunk-3RB35GYK.js → chunk-VU6UTJRM.js} +4 -4
  168. package/dist/{chunk-3RB35GYK.js.map → chunk-VU6UTJRM.js.map} +1 -1
  169. package/dist/{chunk-6SAYPXHX.js → chunk-WGPLUCBD.js} +4 -4
  170. package/dist/{chunk-6SAYPXHX.js.map → chunk-WGPLUCBD.js.map} +1 -1
  171. package/dist/{chunk-QO6PRHDX.cjs → chunk-WNAA6CLE.cjs} +2 -2
  172. package/dist/{chunk-QO6PRHDX.cjs.map → chunk-WNAA6CLE.cjs.map} +1 -1
  173. package/dist/{chunk-ZX2XRFE5.js → chunk-WNM7IZJ7.js} +7 -7
  174. package/dist/{chunk-ZX2XRFE5.js.map → chunk-WNM7IZJ7.js.map} +1 -1
  175. package/dist/{chunk-KLJGJJHN.cjs → chunk-WNZAYBVB.cjs} +49 -49
  176. package/dist/{chunk-KLJGJJHN.cjs.map → chunk-WNZAYBVB.cjs.map} +1 -1
  177. package/dist/{chunk-BVMABVC4.cjs → chunk-WWJIW2IH.cjs} +3 -3
  178. package/dist/{chunk-BVMABVC4.cjs.map → chunk-WWJIW2IH.cjs.map} +1 -1
  179. package/dist/{chunk-OYQ7GYAA.cjs → chunk-X4XPNTCZ.cjs} +12 -12
  180. package/dist/{chunk-OYQ7GYAA.cjs.map → chunk-X4XPNTCZ.cjs.map} +1 -1
  181. package/dist/{chunk-IFDC4TXM.cjs → chunk-XEAT7XJG.cjs} +4 -4
  182. package/dist/{chunk-IFDC4TXM.cjs.map → chunk-XEAT7XJG.cjs.map} +1 -1
  183. package/dist/{chunk-S3BCHPXT.cjs → chunk-XI34EGK5.cjs} +9 -9
  184. package/dist/{chunk-S3BCHPXT.cjs.map → chunk-XI34EGK5.cjs.map} +1 -1
  185. package/dist/chunk-Y5HFM7LO.js +310 -0
  186. package/dist/chunk-Y5HFM7LO.js.map +1 -0
  187. package/dist/{chunk-LECJMLNE.js → chunk-YQDA366U.js} +3 -3
  188. package/dist/{chunk-LECJMLNE.js.map → chunk-YQDA366U.js.map} +1 -1
  189. package/dist/{chunk-PHK4XBO5.js → chunk-Z5V7SAZ4.js} +4 -4
  190. package/dist/{chunk-PHK4XBO5.js.map → chunk-Z5V7SAZ4.js.map} +1 -1
  191. package/dist/{chunk-TZX76ZNZ.js → chunk-ZGRCSNPK.js} +5 -5
  192. package/dist/{chunk-TZX76ZNZ.js.map → chunk-ZGRCSNPK.js.map} +1 -1
  193. package/dist/{chunk-SRA2L3SQ.cjs → chunk-ZSGEGISB.cjs} +4 -4
  194. package/dist/{chunk-SRA2L3SQ.cjs.map → chunk-ZSGEGISB.cjs.map} +1 -1
  195. package/dist/components/AlertDialog/index.cjs +6 -6
  196. package/dist/components/AlertDialog/index.js +5 -5
  197. package/dist/components/Autocomplete/index.cjs +3 -3
  198. package/dist/components/Autocomplete/index.js +2 -2
  199. package/dist/components/Button/index.cjs +3 -3
  200. package/dist/components/Button/index.d.cts +3 -0
  201. package/dist/components/Button/index.d.ts +3 -0
  202. package/dist/components/Button/index.js +1 -1
  203. package/dist/components/Collapsible/index.cjs +5 -5
  204. package/dist/components/Collapsible/index.js +2 -2
  205. package/dist/components/CountryCodeDropdown/index.cjs +6 -6
  206. package/dist/components/CountryCodeDropdown/index.js +3 -3
  207. package/dist/components/CustomizableDashboard/index.cjs +11 -11
  208. package/dist/components/CustomizableDashboard/index.js +4 -4
  209. package/dist/components/DateInput/index.cjs +4 -4
  210. package/dist/components/DateInput/index.js +3 -3
  211. package/dist/components/Dropdown/index.cjs +11 -11
  212. package/dist/components/Dropdown/index.js +4 -4
  213. package/dist/components/FloatingWindow/index.cjs +4 -4
  214. package/dist/components/FloatingWindow/index.js +2 -2
  215. package/dist/components/GlossaryTooltip/index.cjs +4 -4
  216. package/dist/components/GlossaryTooltip/index.js +3 -3
  217. package/dist/components/KeyboardShortcutsOverlay/index.cjs +6 -6
  218. package/dist/components/KeyboardShortcutsOverlay/index.js +4 -4
  219. package/dist/components/Markdown/index.cjs +19 -19
  220. package/dist/components/Markdown/index.js +7 -7
  221. package/dist/components/MediaEditor/index.cjs +16 -16
  222. package/dist/components/MediaEditor/index.js +11 -11
  223. package/dist/components/MediaPlayer/index.cjs +6 -6
  224. package/dist/components/MediaPlayer/index.js +3 -3
  225. package/dist/components/MegaMenu/index.cjs +23 -0
  226. package/dist/components/MegaMenu/index.cjs.map +1 -0
  227. package/dist/components/MegaMenu/index.d.cts +106 -0
  228. package/dist/components/MegaMenu/index.d.ts +106 -0
  229. package/dist/components/MegaMenu/index.js +6 -0
  230. package/dist/components/MegaMenu/index.js.map +1 -0
  231. package/dist/components/Modal/index.cjs +11 -11
  232. package/dist/components/Modal/index.js +3 -3
  233. package/dist/components/OrbitRing/index.cjs +14 -0
  234. package/dist/components/OrbitRing/index.cjs.map +1 -0
  235. package/dist/components/OrbitRing/index.d.cts +64 -0
  236. package/dist/components/OrbitRing/index.d.ts +64 -0
  237. package/dist/components/OrbitRing/index.js +5 -0
  238. package/dist/components/OrbitRing/index.js.map +1 -0
  239. package/dist/components/RadialExplorer/index.cjs +18 -0
  240. package/dist/components/RadialExplorer/index.cjs.map +1 -0
  241. package/dist/components/RadialExplorer/index.d.cts +83 -0
  242. package/dist/components/RadialExplorer/index.d.ts +83 -0
  243. package/dist/components/RadialExplorer/index.js +9 -0
  244. package/dist/components/RadialExplorer/index.js.map +1 -0
  245. package/dist/components/RichTextEditor/index.cjs +9 -9
  246. package/dist/components/RichTextEditor/index.js +6 -6
  247. package/dist/components/SectionSpyNav/index.cjs +4 -4
  248. package/dist/components/SectionSpyNav/index.js +3 -3
  249. package/dist/components/Select/index.cjs +5 -5
  250. package/dist/components/Select/index.js +3 -3
  251. package/dist/components/Sheet/index.cjs +11 -11
  252. package/dist/components/Sheet/index.js +2 -2
  253. package/dist/components/SliderCalculator/index.cjs +20 -0
  254. package/dist/components/SliderCalculator/index.cjs.map +1 -0
  255. package/dist/components/SliderCalculator/index.d.cts +100 -0
  256. package/dist/components/SliderCalculator/index.d.ts +100 -0
  257. package/dist/components/SliderCalculator/index.js +7 -0
  258. package/dist/components/SliderCalculator/index.js.map +1 -0
  259. package/dist/components/SourceTip/index.cjs +4 -4
  260. package/dist/components/SourceTip/index.js +3 -3
  261. package/dist/components/SuperChat/index.cjs +12 -12
  262. package/dist/components/SuperChat/index.js +5 -5
  263. package/dist/components/SuperChat/plugins/index.cjs +8 -8
  264. package/dist/components/SuperChat/plugins/index.js +7 -7
  265. package/dist/components/ThemeProvider/index.cjs +9 -9
  266. package/dist/components/ThemeProvider/index.js +3 -3
  267. package/dist/components/Tooltip/index.cjs +3 -3
  268. package/dist/components/Tooltip/index.js +2 -2
  269. package/dist/components/VideoCard/index.cjs +21 -0
  270. package/dist/components/VideoCard/index.cjs.map +1 -0
  271. package/dist/components/VideoCard/index.d.cts +75 -0
  272. package/dist/components/VideoCard/index.d.ts +75 -0
  273. package/dist/components/VideoCard/index.js +8 -0
  274. package/dist/components/VideoCard/index.js.map +1 -0
  275. package/dist/components/YearTimeline/index.cjs +26 -0
  276. package/dist/components/YearTimeline/index.cjs.map +1 -0
  277. package/dist/components/YearTimeline/index.d.cts +82 -0
  278. package/dist/components/YearTimeline/index.d.ts +82 -0
  279. package/dist/components/YearTimeline/index.js +5 -0
  280. package/dist/components/YearTimeline/index.js.map +1 -0
  281. package/dist/datavis.cjs +2 -2
  282. package/dist/datavis.js +1 -1
  283. package/dist/enterprise-health-ITUNXDIW.js +4 -0
  284. package/dist/{enterprise-health-CWLUB77O.js.map → enterprise-health-ITUNXDIW.js.map} +1 -1
  285. package/dist/enterprise-health-UHHPVPU6.cjs +19 -0
  286. package/dist/{enterprise-health-75VYWAVG.cjs.map → enterprise-health-UHHPVPU6.cjs.map} +1 -1
  287. package/dist/esheet.cjs +18 -18
  288. package/dist/esheet.js +15 -15
  289. package/dist/globe.cjs +306 -0
  290. package/dist/globe.cjs.map +1 -0
  291. package/dist/globe.d.cts +99 -0
  292. package/dist/globe.d.ts +99 -0
  293. package/dist/globe.js +279 -0
  294. package/dist/globe.js.map +1 -0
  295. package/dist/hooks/index.cjs +29 -24
  296. package/dist/hooks/index.d.cts +41 -1
  297. package/dist/hooks/index.d.ts +41 -1
  298. package/dist/hooks/index.js +5 -4
  299. package/dist/index.cjs +1160 -1108
  300. package/dist/index.cjs.map +1 -1
  301. package/dist/index.d.cts +69 -24
  302. package/dist/index.d.ts +69 -24
  303. package/dist/index.js +265 -285
  304. package/dist/index.js.map +1 -1
  305. package/dist/{speaker-verify-5GTWAN5Y.cjs → speaker-verify-4NEJAK6C.cjs} +57 -90
  306. package/dist/speaker-verify-4NEJAK6C.cjs.map +1 -0
  307. package/dist/{speaker-verify-R67P433H.js → speaker-verify-AWSKI6DI.js} +57 -90
  308. package/dist/speaker-verify-AWSKI6DI.js.map +1 -0
  309. package/dist/styles/effects.css +128 -0
  310. package/dist/styles/init.css +15 -0
  311. package/dist/styles.css +1 -1
  312. package/dist/tailwind-preset.cjs +4 -4
  313. package/dist/tailwind-preset.js +1 -1
  314. package/dist/utils/index.cjs +5 -5
  315. package/dist/utils/index.js +1 -1
  316. package/package.json +23 -2
  317. package/dist/CsvBlock-CVYA3HYS.cjs +0 -16
  318. package/dist/CsvBlock-SM4NKSHA.js +0 -7
  319. package/dist/HtmlPreviewBlock-FAMF4W24.js +0 -7
  320. package/dist/HtmlPreviewBlock-JF454L2L.cjs +0 -16
  321. package/dist/MermaidBlock-7V5G4K5A.js +0 -7
  322. package/dist/MermaidBlock-FR5SQX4Q.cjs +0 -16
  323. package/dist/SurveyBlock-6K2POV7S.js +0 -7
  324. package/dist/SurveyBlock-MCJVWR7H.cjs +0 -16
  325. package/dist/chunk-IINZWUGK.cjs.map +0 -1
  326. package/dist/chunk-J644FU54.cjs.map +0 -1
  327. package/dist/chunk-KREUYVMZ.js.map +0 -1
  328. package/dist/chunk-MTZPVOP6.js.map +0 -1
  329. package/dist/chunk-P52GA3GJ.cjs.map +0 -1
  330. package/dist/chunk-PY7XAG4D.cjs.map +0 -1
  331. package/dist/chunk-WOYUQ4AT.js.map +0 -1
  332. package/dist/chunk-X5YM3KXY.js.map +0 -1
  333. package/dist/enterprise-health-75VYWAVG.cjs +0 -19
  334. package/dist/enterprise-health-CWLUB77O.js +0 -4
  335. package/dist/speaker-verify-5GTWAN5Y.cjs.map +0 -1
  336. package/dist/speaker-verify-R67P433H.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/hooks/useYouTubeHoverPreview.ts"],"names":[],"mappings":"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","file":"chunk-POWS35OT.js","sourcesContent":["'use client';\n\nimport * as React from 'react';\n\n// =============================================================================\n// YouTube IFrame API (lazy, shared)\n// =============================================================================\n// Loaded only the first time a visitor dwells on a card, then reused. A minimal\n// hand-written shape instead of @types/youtube keeps the dependency graph flat.\n\ninterface YTPreviewPlayer {\n playVideo(): void;\n mute(): void;\n getCurrentTime(): number;\n getDuration(): number;\n seekTo(seconds: number, allowSeekAhead: boolean): void;\n destroy(): void;\n}\n\ninterface YTPlayerEvent {\n target: YTPreviewPlayer;\n data?: number;\n}\n\ninterface YTNamespace {\n Player: new (\n el: HTMLElement,\n opts: Record<string, unknown>\n ) => YTPreviewPlayer;\n}\n\ntype YTWindow = Window & {\n YT?: YTNamespace;\n onYouTubeIframeAPIReady?: () => void;\n};\n\nlet ytApiPromise: Promise<void> | null = null;\n\nconst YT_API_TIMEOUT_MS = 10_000;\n\nfunction loadYouTubeIframeApi(): Promise<void> {\n if (typeof window === 'undefined') return Promise.resolve();\n const w = window as YTWindow;\n if (w.YT?.Player) return Promise.resolve();\n if (ytApiPromise) return ytApiPromise;\n ytApiPromise = new Promise<void>((resolve, reject) => {\n const prev = w.onYouTubeIframeAPIReady;\n let timer: number | undefined;\n const settle = (err?: Error) => {\n if (timer !== undefined) window.clearTimeout(timer);\n timer = undefined;\n if (err) {\n // Clear the shared promise so a later hover can retry a transient\n // failure (CSP, ad blocker, flaky network).\n ytApiPromise = null;\n reject(err);\n } else {\n resolve();\n }\n };\n w.onYouTubeIframeAPIReady = () => {\n prev?.();\n settle();\n };\n const tag = document.createElement('script');\n tag.src = 'https://www.youtube.com/iframe_api';\n tag.async = true;\n tag.onerror = () =>\n settle(new Error('Failed to load the YouTube iframe API'));\n timer = window.setTimeout(\n () => settle(new Error('Timed out loading the YouTube iframe API')),\n YT_API_TIMEOUT_MS\n );\n document.head.appendChild(tag);\n });\n return ytApiPromise;\n}\n\n// =============================================================================\n// Hook\n// =============================================================================\n\nexport type HoverPreviewState = 'idle' | 'loading' | 'playing';\n\nexport interface UseYouTubeHoverPreviewOptions {\n /** Hover dwell before the player mounts. Default 600ms. */\n dwellMs?: number;\n /** Player host. Default `https://www.youtube-nocookie.com`. */\n host?: string;\n /** Disable entirely (e.g. when the card has no YouTube id). */\n enabled?: boolean;\n}\n\nexport interface UseYouTubeHoverPreviewReturn {\n /** Lifecycle phase of the muted preview. */\n preview: HoverPreviewState;\n /** Normalised playback position (0–1) for a timeline bar. */\n progress: number;\n /** Attach to the element the muted iframe should fill. */\n hostRef: React.RefObject<HTMLDivElement | null>;\n /** Wire to the hover target's `onMouseEnter` / `onFocus`. */\n handleEnter: () => void;\n /** Wire to the hover target's `onMouseLeave` / `onBlur` (and any manual reset). */\n stopPreview: () => void;\n}\n\n/**\n * Drives a muted, looping YouTube hover preview for a single `youtubeId` — the\n * \"silent autoplay on dwell\" pattern from YouTube's own grid. After a short\n * hover dwell a muted player is mounted lazily inside `hostRef`; `progress`\n * tracks playback for a timeline bar; everything tears down on leave so only\n * one preview is ever live. Honours `prefers-reduced-motion` and skips\n * pointer-less (touch) inputs.\n *\n * @example\n * ```tsx\n * const { preview, progress, hostRef, handleEnter, stopPreview } =\n * useYouTubeHoverPreview('dQw4w9WgXcQ');\n * <a onMouseEnter={handleEnter} onMouseLeave={stopPreview}>\n * <div ref={hostRef} className={preview === 'playing' ? 'opacity-100' : 'opacity-0'} />\n * </a>\n * ```\n */\nexport function useYouTubeHoverPreview(\n youtubeId: string | undefined,\n {\n dwellMs = 600,\n host = 'https://www.youtube-nocookie.com',\n enabled = true,\n }: UseYouTubeHoverPreviewOptions = {}\n): UseYouTubeHoverPreviewReturn {\n const [preview, setPreview] = React.useState<HoverPreviewState>('idle');\n const [progress, setProgress] = React.useState(0);\n\n const hostRef = React.useRef<HTMLDivElement | null>(null);\n const playerRef = React.useRef<YTPreviewPlayer | null>(null);\n const hoveringRef = React.useRef(false);\n const enterTimerRef = React.useRef<number | null>(null);\n const pollRef = React.useRef<number | null>(null);\n\n const stopPreview = React.useCallback(() => {\n hoveringRef.current = false;\n if (enterTimerRef.current !== null) {\n window.clearTimeout(enterTimerRef.current);\n enterTimerRef.current = null;\n }\n if (pollRef.current !== null) {\n window.clearInterval(pollRef.current);\n pollRef.current = null;\n }\n if (playerRef.current) {\n try {\n playerRef.current.destroy();\n } catch {\n /* player already torn down */\n }\n playerRef.current = null;\n }\n if (hostRef.current) hostRef.current.innerHTML = '';\n setPreview('idle');\n setProgress(0);\n }, []);\n\n const beginPlayer = React.useCallback(() => {\n const el = hostRef.current;\n const YT = (window as YTWindow).YT;\n if (\n !el ||\n !YT?.Player ||\n playerRef.current ||\n !hoveringRef.current ||\n !youtubeId\n )\n return;\n\n const target = document.createElement('div');\n el.appendChild(target);\n\n const startPolling = () => {\n if (pollRef.current !== null) return;\n pollRef.current = window.setInterval(() => {\n const p = playerRef.current;\n if (!p) return;\n const d = p.getDuration();\n if (d > 0) setProgress(Math.min(p.getCurrentTime() / d, 1));\n }, 200);\n };\n\n playerRef.current = new YT.Player(target, {\n videoId: youtubeId,\n host,\n width: '100%',\n height: '100%',\n playerVars: {\n autoplay: 1,\n mute: 1,\n controls: 0,\n playsinline: 1,\n modestbranding: 1,\n rel: 0,\n disablekb: 1,\n fs: 0,\n iv_load_policy: 3,\n start: 0,\n },\n events: {\n onReady: (e: YTPlayerEvent) => {\n if (!hoveringRef.current) {\n stopPreview();\n return;\n }\n e.target.mute();\n e.target.playVideo();\n },\n onStateChange: (e: YTPlayerEvent) => {\n if (e.data === 1) {\n // PLAYING — reveal only once frames are actually flowing\n setPreview('playing');\n startPolling();\n } else if (e.data === 0 && playerRef.current) {\n // ENDED — loop like YouTube's own previews\n playerRef.current.seekTo(0, true);\n playerRef.current.playVideo();\n }\n },\n onError: () => stopPreview(),\n },\n });\n\n // the visitor may have left during async player construction\n if (!hoveringRef.current) stopPreview();\n }, [youtubeId, host, stopPreview]);\n\n const handleEnter = React.useCallback(() => {\n if (\n !enabled ||\n !youtubeId ||\n typeof window === 'undefined' ||\n !window.matchMedia('(hover: hover)').matches ||\n window.matchMedia('(prefers-reduced-motion: reduce)').matches\n ) {\n return;\n }\n hoveringRef.current = true;\n if (enterTimerRef.current !== null || playerRef.current) return;\n enterTimerRef.current = window.setTimeout(() => {\n enterTimerRef.current = null;\n if (!hoveringRef.current) return;\n setPreview('loading');\n void loadYouTubeIframeApi()\n .then(() => {\n // If the visitor left while the API loaded, mouseleave/blur/unmount\n // already ran stopPreview — calling it again here could set state\n // after unmount when the script finally arrives.\n if (hoveringRef.current) beginPlayer();\n })\n .catch(() => {\n // API blocked or timed out — return the card to its idle poster\n // instead of leaving it stuck in `loading`.\n stopPreview();\n });\n }, dwellMs);\n }, [enabled, youtubeId, dwellMs, beginPlayer, stopPreview]);\n\n React.useEffect(() => stopPreview, [stopPreview]);\n\n return { preview, progress, hostRef, handleEnter, stopPreview };\n}\n"]}
@@ -0,0 +1,237 @@
1
+ import { Slider } from './chunk-2BPIVWAK.js';
2
+ import { usePrefersReducedMotion } from './chunk-HB7C7NB5.js';
3
+ import { cn } from './chunk-TQONQSJO.js';
4
+ import * as React from 'react';
5
+ import { ChevronUp, ChevronDown } from 'lucide-react';
6
+ import { jsx, jsxs } from 'react/jsx-runtime';
7
+
8
+ function makeFormatter(format, locale, currency) {
9
+ if (typeof format === "function") return format;
10
+ switch (format) {
11
+ case "currency":
12
+ return (v) => v.toLocaleString(locale, {
13
+ style: "currency",
14
+ currency,
15
+ maximumFractionDigits: 0
16
+ });
17
+ case "compactCurrency":
18
+ return (v) => v.toLocaleString(locale, {
19
+ style: "currency",
20
+ currency,
21
+ notation: "compact",
22
+ maximumFractionDigits: v >= 1e6 ? 2 : 0
23
+ });
24
+ case "percent":
25
+ return (v) => `${v.toLocaleString(locale)}%`;
26
+ case "hours":
27
+ return (v) => `${v.toLocaleString(locale)} hr`;
28
+ default:
29
+ return (v) => v.toLocaleString(locale);
30
+ }
31
+ }
32
+ function AnimatedNumber({
33
+ value,
34
+ format = (v) => v.toLocaleString(),
35
+ duration = 480,
36
+ className
37
+ }) {
38
+ const reduced = usePrefersReducedMotion();
39
+ const [shown, setShown] = React.useState(value);
40
+ const shownRef = React.useRef(value);
41
+ React.useEffect(() => {
42
+ if (reduced || typeof window === "undefined") {
43
+ shownRef.current = value;
44
+ setShown(value);
45
+ return;
46
+ }
47
+ const from = shownRef.current;
48
+ const start = performance.now();
49
+ let raf = 0;
50
+ const tick = (t) => {
51
+ const p = Math.min(1, (t - start) / duration);
52
+ const eased = 1 - Math.pow(1 - p, 3);
53
+ const v = from + (value - from) * eased;
54
+ shownRef.current = v;
55
+ setShown(v);
56
+ if (p < 1) raf = requestAnimationFrame(tick);
57
+ };
58
+ raf = requestAnimationFrame(tick);
59
+ return () => cancelAnimationFrame(raf);
60
+ }, [value, duration, reduced]);
61
+ return /* @__PURE__ */ jsx("span", { className: cn("tabular-nums", className), "data-slot": "animated-number", children: format(shown) });
62
+ }
63
+ function SliderCalculator({
64
+ inputs,
65
+ compute,
66
+ eyebrow,
67
+ heading,
68
+ description,
69
+ headingLevel: Heading = "h2",
70
+ resultLabel = "Estimated annual value",
71
+ resultFormat = "compactCurrency",
72
+ breakdownFormat = "currency",
73
+ actions,
74
+ footnote,
75
+ mathLabels,
76
+ currency = "USD",
77
+ locale = "en-US",
78
+ onChange,
79
+ className
80
+ }) {
81
+ const [values, setValues] = React.useState(
82
+ () => Object.fromEntries(inputs.map((i) => [i.id, i.defaultValue]))
83
+ );
84
+ const [showMath, setShowMath] = React.useState(false);
85
+ const id = React.useId();
86
+ const result = React.useMemo(() => compute(values), [compute, values]);
87
+ const skipInitialNotify = React.useRef(true);
88
+ const notifyRef = React.useRef({ onChange, result });
89
+ notifyRef.current = { onChange, result };
90
+ React.useEffect(() => {
91
+ if (skipInitialNotify.current) {
92
+ skipInitialNotify.current = false;
93
+ return;
94
+ }
95
+ notifyRef.current.onChange?.(values, notifyRef.current.result);
96
+ }, [values]);
97
+ const fmtResult = React.useMemo(
98
+ () => makeFormatter(resultFormat, locale, currency),
99
+ [resultFormat, locale, currency]
100
+ );
101
+ const fmtBreakdown = makeFormatter(breakdownFormat, locale, currency);
102
+ const [announced, setAnnounced] = React.useState("");
103
+ const skipInitialAnnounce = React.useRef(true);
104
+ React.useEffect(() => {
105
+ if (skipInitialAnnounce.current) {
106
+ skipInitialAnnounce.current = false;
107
+ return;
108
+ }
109
+ const t = window.setTimeout(
110
+ () => setAnnounced(fmtResult(result.total)),
111
+ 600
112
+ );
113
+ return () => window.clearTimeout(t);
114
+ }, [result.total, fmtResult]);
115
+ const labels = {
116
+ show: "Show the math",
117
+ hide: "Hide the math",
118
+ ...mathLabels
119
+ };
120
+ const set = (key, v) => {
121
+ setValues((prev) => ({ ...prev, [key]: v }));
122
+ };
123
+ return /* @__PURE__ */ jsxs(
124
+ "div",
125
+ {
126
+ "data-slot": "slider-calculator",
127
+ className: cn(
128
+ "border-border bg-card text-card-foreground grid overflow-hidden rounded-2xl border shadow-md",
129
+ "lg:grid-cols-[1.1fr_1fr]",
130
+ className
131
+ ),
132
+ children: [
133
+ /* @__PURE__ */ jsxs("div", { className: "p-6 sm:p-8", children: [
134
+ eyebrow && /* @__PURE__ */ jsx("p", { className: "text-primary-800 dark:text-primary-300 mb-2 text-[11px] font-bold tracking-[0.14em] uppercase", children: eyebrow }),
135
+ heading && /* @__PURE__ */ jsx(Heading, { className: "text-foreground text-2xl leading-tight font-semibold sm:text-3xl", children: heading }),
136
+ description && /* @__PURE__ */ jsx("p", { className: "text-muted-foreground mt-3 text-sm", children: description }),
137
+ /* @__PURE__ */ jsx("div", { className: cn("space-y-5", (heading || description) && "mt-7"), children: inputs.map((input) => /* @__PURE__ */ jsx(
138
+ Slider,
139
+ {
140
+ id: `${id}-${input.id}`,
141
+ label: input.label,
142
+ description: input.description,
143
+ min: input.min,
144
+ max: input.max,
145
+ step: input.step,
146
+ value: values[input.id],
147
+ onValueChange: (v) => set(input.id, v),
148
+ showValue: true,
149
+ formatValue: makeFormatter(input.format, locale, currency)
150
+ },
151
+ input.id
152
+ )) })
153
+ ] }),
154
+ /* @__PURE__ */ jsxs(
155
+ "div",
156
+ {
157
+ "data-slot": "slider-calculator-result",
158
+ className: "bg-primary-950 flex flex-col gap-6 p-6 text-white [background:radial-gradient(120%_120%_at_100%_0%,var(--mieweb-primary-800),var(--mieweb-primary-950)_70%)] sm:p-8",
159
+ children: [
160
+ /* @__PURE__ */ jsx("span", { "aria-live": "polite", className: "sr-only", children: announced ? `${resultLabel}: ${announced}` : "" }),
161
+ /* @__PURE__ */ jsxs("div", { children: [
162
+ /* @__PURE__ */ jsx("p", { className: "text-[11px] font-bold tracking-[0.14em] text-white/70 uppercase", children: resultLabel }),
163
+ /* @__PURE__ */ jsx("p", { className: "mt-2 text-5xl leading-none font-semibold tracking-tight sm:text-6xl", children: /* @__PURE__ */ jsx(AnimatedNumber, { value: result.total, format: fmtResult }) }),
164
+ result.summary && /* @__PURE__ */ jsx("p", { className: "mt-3 text-sm text-white/80", children: result.summary })
165
+ ] }),
166
+ result.breakdown && result.breakdown.length > 0 && /* @__PURE__ */ jsx("div", { className: "space-y-3", children: result.breakdown.map((b) => {
167
+ const pct = result.total > 0 ? Math.max(2, Math.min(100, b.value / result.total * 100)) : 0;
168
+ return /* @__PURE__ */ jsxs("div", { children: [
169
+ /* @__PURE__ */ jsxs("div", { className: "mb-1 flex items-baseline justify-between gap-3 text-sm", children: [
170
+ /* @__PURE__ */ jsx("span", { className: "text-white/80", children: b.label }),
171
+ /* @__PURE__ */ jsx("b", { className: "tabular-nums", children: /* @__PURE__ */ jsx(
172
+ AnimatedNumber,
173
+ {
174
+ value: Math.max(b.value, 0),
175
+ format: fmtBreakdown
176
+ }
177
+ ) })
178
+ ] }),
179
+ /* @__PURE__ */ jsx("div", { className: "h-1.5 overflow-hidden rounded-full bg-white/15", children: /* @__PURE__ */ jsx(
180
+ "span",
181
+ {
182
+ className: "block h-full rounded-full transition-[width] duration-500 ease-out [background:linear-gradient(90deg,var(--mieweb-accent,var(--mieweb-primary-300)),var(--mieweb-primary-300))]",
183
+ style: { width: `${pct}%` }
184
+ }
185
+ ) })
186
+ ] }, b.label);
187
+ }) }),
188
+ (result.math?.length || result.assumptions?.length) && /* @__PURE__ */ jsxs("div", { children: [
189
+ /* @__PURE__ */ jsxs(
190
+ "button",
191
+ {
192
+ type: "button",
193
+ onClick: () => setShowMath((v) => !v),
194
+ "aria-expanded": showMath,
195
+ "aria-controls": `${id}-math`,
196
+ className: "inline-flex items-center gap-1 text-sm font-semibold text-white/80 underline-offset-4 hover:text-white hover:underline",
197
+ children: [
198
+ showMath ? labels.hide : labels.show,
199
+ showMath ? /* @__PURE__ */ jsx(ChevronUp, { size: 14, "aria-hidden": true }) : /* @__PURE__ */ jsx(ChevronDown, { size: 14, "aria-hidden": true })
200
+ ]
201
+ }
202
+ ),
203
+ showMath && /* @__PURE__ */ jsxs(
204
+ "div",
205
+ {
206
+ id: `${id}-math`,
207
+ className: "mt-3 rounded-xl border border-white/15 bg-white/5 p-4 text-sm",
208
+ children: [
209
+ result.math?.map((row) => /* @__PURE__ */ jsxs(
210
+ "div",
211
+ {
212
+ className: "flex justify-between gap-4 border-b border-white/10 py-1.5 last:border-0",
213
+ children: [
214
+ /* @__PURE__ */ jsx("span", { className: "text-white/75", children: row.label }),
215
+ /* @__PURE__ */ jsx("b", { className: "tabular-nums", children: row.value })
216
+ ]
217
+ },
218
+ row.label
219
+ )),
220
+ result.assumptions && result.assumptions.length > 0 && /* @__PURE__ */ jsx("ul", { className: "mt-3 list-disc space-y-1 ps-5 text-xs text-white/70", children: result.assumptions.map((a) => /* @__PURE__ */ jsx("li", { children: a }, a)) })
221
+ ]
222
+ }
223
+ )
224
+ ] }),
225
+ actions && /* @__PURE__ */ jsx("div", { className: "mt-auto flex flex-wrap gap-3", children: actions }),
226
+ footnote && /* @__PURE__ */ jsx("p", { className: "text-xs text-white/60", children: footnote })
227
+ ]
228
+ }
229
+ )
230
+ ]
231
+ }
232
+ );
233
+ }
234
+
235
+ export { AnimatedNumber, SliderCalculator };
236
+ //# sourceMappingURL=chunk-PYJDVWXM.js.map
237
+ //# sourceMappingURL=chunk-PYJDVWXM.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/SliderCalculator/SliderCalculator.tsx"],"names":[],"mappings":"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","file":"chunk-PYJDVWXM.js","sourcesContent":["'use client';\n\nimport * as React from 'react';\nimport { ChevronDown, ChevronUp } from 'lucide-react';\nimport { cn } from '../../utils/cn';\nimport { Slider } from '../Slider';\nimport { usePrefersReducedMotion } from '../../hooks/usePrefersReducedMotion';\n\n// =============================================================================\n// Types\n// =============================================================================\n\nexport type CalculatorFormat =\n | 'number'\n | 'currency'\n | 'compactCurrency'\n | 'percent'\n | 'hours'\n | ((value: number) => string);\n\nexport interface CalculatorInput {\n /** Key in the values object passed to `compute`. */\n id: string;\n label: string;\n min: number;\n max: number;\n step?: number;\n /** Starting value. */\n defaultValue: number;\n /** How the current value renders next to the label. Default `number`. */\n format?: CalculatorFormat;\n description?: string;\n}\n\nexport interface CalculatorBreakdown {\n label: string;\n value: number;\n}\n\nexport interface CalculatorMathRow {\n label: string;\n value: string;\n}\n\nexport interface CalculatorResult {\n /** The headline number. */\n total: number;\n /** One-line context under the headline, e.g. \"42% of today's spend · 1,200 hours returned\". */\n summary?: string;\n /** Horizontal bars showing what makes up `total`. */\n breakdown?: CalculatorBreakdown[];\n /** Rows revealed by \"Show the math\". */\n math?: CalculatorMathRow[];\n /** Free-text assumptions listed under the math. */\n assumptions?: string[];\n}\n\nexport interface SliderCalculatorProps {\n inputs: CalculatorInput[];\n /** Pure function from current values to a result. Runs on every change. */\n compute: (values: Record<string, number>) => CalculatorResult;\n /** Copy for the controls column. */\n eyebrow?: string;\n heading?: string;\n description?: string;\n headingLevel?: 'h2' | 'h3';\n /** Label above the headline number. Default \"Estimated annual value\". */\n resultLabel?: string;\n /** Format for the headline. Default `compactCurrency`. */\n resultFormat?: CalculatorFormat;\n /** Format for breakdown values. Default `currency`. */\n breakdownFormat?: CalculatorFormat;\n /** Actions under the result (Buttons, links). */\n actions?: React.ReactNode;\n /** Small print under the actions. */\n footnote?: string;\n /** Labels for the math toggle. */\n mathLabels?: { show?: string; hide?: string };\n /** Currency for the built-in formatters. Default `USD`. */\n currency?: string;\n locale?: string;\n /** Fires with the latest values and result on every change. */\n onChange?: (values: Record<string, number>, result: CalculatorResult) => void;\n className?: string;\n}\n\n// =============================================================================\n// Formatting\n// =============================================================================\n\nfunction makeFormatter(\n format: CalculatorFormat | undefined,\n locale: string,\n currency: string\n): (v: number) => string {\n if (typeof format === 'function') return format;\n switch (format) {\n case 'currency':\n return (v) =>\n v.toLocaleString(locale, {\n style: 'currency',\n currency,\n maximumFractionDigits: 0,\n });\n case 'compactCurrency':\n return (v) =>\n v.toLocaleString(locale, {\n style: 'currency',\n currency,\n notation: 'compact',\n maximumFractionDigits: v >= 1_000_000 ? 2 : 0,\n });\n case 'percent':\n return (v) => `${v.toLocaleString(locale)}%`;\n case 'hours':\n return (v) => `${v.toLocaleString(locale)} hr`;\n default:\n return (v) => v.toLocaleString(locale);\n }\n}\n\n// =============================================================================\n// AnimatedNumber\n// =============================================================================\n\nexport interface AnimatedNumberProps {\n value: number;\n format?: (v: number) => string;\n /** Tween length in ms. Default 480. */\n duration?: number;\n className?: string;\n}\n\n/** Tweens between numeric values with an ease-out; snaps under reduced motion. */\nexport function AnimatedNumber({\n value,\n format = (v) => v.toLocaleString(),\n duration = 480,\n className,\n}: AnimatedNumberProps) {\n const reduced = usePrefersReducedMotion();\n const [shown, setShown] = React.useState(value);\n const shownRef = React.useRef(value);\n\n React.useEffect(() => {\n if (reduced || typeof window === 'undefined') {\n shownRef.current = value;\n setShown(value);\n return;\n }\n const from = shownRef.current;\n const start = performance.now();\n let raf = 0;\n const tick = (t: number) => {\n const p = Math.min(1, (t - start) / duration);\n const eased = 1 - Math.pow(1 - p, 3);\n const v = from + (value - from) * eased;\n shownRef.current = v;\n setShown(v);\n if (p < 1) raf = requestAnimationFrame(tick);\n };\n raf = requestAnimationFrame(tick);\n return () => cancelAnimationFrame(raf);\n }, [value, duration, reduced]);\n\n return (\n <span className={cn('tabular-nums', className)} data-slot=\"animated-number\">\n {format(shown)}\n </span>\n );\n}\n\n// =============================================================================\n// SliderCalculator\n// =============================================================================\n\n/**\n * A two-column interactive calculator: labelled sliders on the left, a live\n * result panel on the right with an animated headline number, a one-line\n * summary, proportional breakdown bars, a \"Show the math\" disclosure and an\n * actions slot. Bring your own `compute` — the component owns only the\n * interaction. Ported from the Enterprise Health ROI calculator.\n *\n * @example\n * ```tsx\n * <SliderCalculator\n * heading=\"What is consolidation worth?\"\n * inputs={[\n * { id: 'people', label: 'People covered', min: 500, max: 60000, step: 500, defaultValue: 8000 },\n * { id: 'cost', label: 'Cost per exam', min: 20, max: 400, step: 5, defaultValue: 120, format: 'currency' },\n * ]}\n * compute={({ people, cost }) => ({ total: people * cost * 0.18 })}\n * actions={<Button effect=\"sheen\">Request a demo</Button>}\n * />\n * ```\n */\nexport function SliderCalculator({\n inputs,\n compute,\n eyebrow,\n heading,\n description,\n headingLevel: Heading = 'h2',\n resultLabel = 'Estimated annual value',\n resultFormat = 'compactCurrency',\n breakdownFormat = 'currency',\n actions,\n footnote,\n mathLabels,\n currency = 'USD',\n locale = 'en-US',\n onChange,\n className,\n}: SliderCalculatorProps) {\n const [values, setValues] = React.useState<Record<string, number>>(() =>\n Object.fromEntries(inputs.map((i) => [i.id, i.defaultValue]))\n );\n const [showMath, setShowMath] = React.useState(false);\n const id = React.useId();\n\n const result = React.useMemo(() => compute(values), [compute, values]);\n\n // Notify from an effect keyed on `values` only. `result` and `onChange` are\n // read through a ref: an inline `compute` or `onChange` prop gets a new\n // identity on every parent render, and depending on either would re-fire the\n // notification (and potentially loop) without any actual slider change.\n const skipInitialNotify = React.useRef(true);\n const notifyRef = React.useRef({ onChange, result });\n notifyRef.current = { onChange, result };\n React.useEffect(() => {\n if (skipInitialNotify.current) {\n skipInitialNotify.current = false;\n return;\n }\n notifyRef.current.onChange?.(values, notifyRef.current.result);\n }, [values]);\n\n const fmtResult = React.useMemo(\n () => makeFormatter(resultFormat, locale, currency),\n [resultFormat, locale, currency]\n );\n const fmtBreakdown = makeFormatter(breakdownFormat, locale, currency);\n\n // Announce only the settled total. The result container previously carried\n // aria-live while `AnimatedNumber` updated every animation frame, so screen\n // readers could queue or repeat intermediate values during a drag.\n const [announced, setAnnounced] = React.useState('');\n const skipInitialAnnounce = React.useRef(true);\n React.useEffect(() => {\n if (skipInitialAnnounce.current) {\n skipInitialAnnounce.current = false;\n return;\n }\n const t = window.setTimeout(\n () => setAnnounced(fmtResult(result.total)),\n 600\n );\n return () => window.clearTimeout(t);\n }, [result.total, fmtResult]);\n\n const labels = {\n show: 'Show the math',\n hide: 'Hide the math',\n ...mathLabels,\n };\n\n const set = (key: string, v: number) => {\n setValues((prev) => ({ ...prev, [key]: v }));\n };\n\n return (\n <div\n data-slot=\"slider-calculator\"\n className={cn(\n 'border-border bg-card text-card-foreground grid overflow-hidden rounded-2xl border shadow-md',\n 'lg:grid-cols-[1.1fr_1fr]',\n className\n )}\n >\n {/* Controls */}\n <div className=\"p-6 sm:p-8\">\n {eyebrow && (\n <p className=\"text-primary-800 dark:text-primary-300 mb-2 text-[11px] font-bold tracking-[0.14em] uppercase\">\n {eyebrow}\n </p>\n )}\n {heading && (\n <Heading className=\"text-foreground text-2xl leading-tight font-semibold sm:text-3xl\">\n {heading}\n </Heading>\n )}\n {description && (\n <p className=\"text-muted-foreground mt-3 text-sm\">{description}</p>\n )}\n\n <div className={cn('space-y-5', (heading || description) && 'mt-7')}>\n {inputs.map((input) => (\n <Slider\n key={input.id}\n id={`${id}-${input.id}`}\n label={input.label}\n description={input.description}\n min={input.min}\n max={input.max}\n step={input.step}\n value={values[input.id]}\n onValueChange={(v) => set(input.id, v)}\n showValue\n formatValue={makeFormatter(input.format, locale, currency)}\n />\n ))}\n </div>\n </div>\n\n {/* Result */}\n <div\n data-slot=\"slider-calculator-result\"\n className=\"bg-primary-950 flex flex-col gap-6 p-6 text-white [background:radial-gradient(120%_120%_at_100%_0%,var(--mieweb-primary-800),var(--mieweb-primary-950)_70%)] sm:p-8\"\n >\n <span aria-live=\"polite\" className=\"sr-only\">\n {announced ? `${resultLabel}: ${announced}` : ''}\n </span>\n <div>\n <p className=\"text-[11px] font-bold tracking-[0.14em] text-white/70 uppercase\">\n {resultLabel}\n </p>\n <p className=\"mt-2 text-5xl leading-none font-semibold tracking-tight sm:text-6xl\">\n <AnimatedNumber value={result.total} format={fmtResult} />\n </p>\n {result.summary && (\n <p className=\"mt-3 text-sm text-white/80\">{result.summary}</p>\n )}\n </div>\n\n {result.breakdown && result.breakdown.length > 0 && (\n <div className=\"space-y-3\">\n {result.breakdown.map((b) => {\n const pct =\n result.total > 0\n ? Math.max(2, Math.min(100, (b.value / result.total) * 100))\n : 0;\n return (\n <div key={b.label}>\n <div className=\"mb-1 flex items-baseline justify-between gap-3 text-sm\">\n <span className=\"text-white/80\">{b.label}</span>\n <b className=\"tabular-nums\">\n <AnimatedNumber\n value={Math.max(b.value, 0)}\n format={fmtBreakdown}\n />\n </b>\n </div>\n <div className=\"h-1.5 overflow-hidden rounded-full bg-white/15\">\n <span\n className=\"block h-full rounded-full transition-[width] duration-500 ease-out [background:linear-gradient(90deg,var(--mieweb-accent,var(--mieweb-primary-300)),var(--mieweb-primary-300))]\"\n style={{ width: `${pct}%` }}\n />\n </div>\n </div>\n );\n })}\n </div>\n )}\n\n {(result.math?.length || result.assumptions?.length) && (\n <div>\n <button\n type=\"button\"\n onClick={() => setShowMath((v) => !v)}\n aria-expanded={showMath}\n aria-controls={`${id}-math`}\n className=\"inline-flex items-center gap-1 text-sm font-semibold text-white/80 underline-offset-4 hover:text-white hover:underline\"\n >\n {showMath ? labels.hide : labels.show}\n {showMath ? (\n <ChevronUp size={14} aria-hidden />\n ) : (\n <ChevronDown size={14} aria-hidden />\n )}\n </button>\n {showMath && (\n <div\n id={`${id}-math`}\n className=\"mt-3 rounded-xl border border-white/15 bg-white/5 p-4 text-sm\"\n >\n {result.math?.map((row) => (\n <div\n key={row.label}\n className=\"flex justify-between gap-4 border-b border-white/10 py-1.5 last:border-0\"\n >\n <span className=\"text-white/75\">{row.label}</span>\n <b className=\"tabular-nums\">{row.value}</b>\n </div>\n ))}\n {result.assumptions && result.assumptions.length > 0 && (\n <ul className=\"mt-3 list-disc space-y-1 ps-5 text-xs text-white/70\">\n {result.assumptions.map((a) => (\n <li key={a}>{a}</li>\n ))}\n </ul>\n )}\n </div>\n )}\n </div>\n )}\n\n {actions && (\n <div className=\"mt-auto flex flex-wrap gap-3\">{actions}</div>\n )}\n {footnote && <p className=\"text-xs text-white/60\">{footnote}</p>}\n </div>\n </div>\n );\n}\n"]}
@@ -20,6 +20,8 @@ var enterpriseHealthBrand = {
20
20
  900: "#42193d",
21
21
  950: "#280e25"
22
22
  },
23
+ // Gold accent from the logo — mirrors --mieweb-accent* in enterprise-health.css
24
+ accent: { DEFAULT: "#f8b700", light: "#ffc933", dark: "#d49d00" },
23
25
  // Light mode semantic colors
24
26
  // Based on actual Enterprise Health website styles
25
27
  light: {
@@ -95,5 +97,5 @@ var enterpriseHealthBrand = {
95
97
  };
96
98
 
97
99
  export { enterpriseHealthBrand };
98
- //# sourceMappingURL=chunk-MTZPVOP6.js.map
99
- //# sourceMappingURL=chunk-MTZPVOP6.js.map
100
+ //# sourceMappingURL=chunk-Q77TE5DZ.js.map
101
+ //# sourceMappingURL=chunk-Q77TE5DZ.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/brands/enterprise-health.ts"],"names":[],"mappings":";AAwBO,IAAM,qBAAA,GAAqC;AAAA,EAChD,IAAA,EAAM,mBAAA;AAAA,EACN,WAAA,EAAa,mBAAA;AAAA,EACb,WAAA,EAAa,oDAAA;AAAA,EAEb,MAAA,EAAQ;AAAA;AAAA;AAAA,IAGN,OAAA,EAAS;AAAA,MACP,EAAA,EAAI,SAAA;AAAA,MACJ,GAAA,EAAK,SAAA;AAAA,MACL,GAAA,EAAK,SAAA;AAAA,MACL,GAAA,EAAK,SAAA;AAAA,MACL,GAAA,EAAK,SAAA;AAAA,MACL,GAAA,EAAK,SAAA;AAAA,MACL,GAAA,EAAK,SAAA;AAAA;AAAA,MACL,GAAA,EAAK,SAAA;AAAA,MACL,GAAA,EAAK,SAAA;AAAA,MACL,GAAA,EAAK,SAAA;AAAA,MACL,GAAA,EAAK;AAAA,KACP;AAAA;AAAA,IAGA,QAAQ,EAAE,OAAA,EAAS,WAAW,KAAA,EAAO,SAAA,EAAW,MAAM,SAAA,EAAU;AAAA;AAAA;AAAA,IAIhE,KAAA,EAAO;AAAA,MACL,UAAA,EAAY,SAAA;AAAA,MACZ,UAAA,EAAY,SAAA;AAAA;AAAA,MACZ,IAAA,EAAM,SAAA;AAAA,MACN,cAAA,EAAgB,SAAA;AAAA,MAChB,KAAA,EAAO,SAAA;AAAA;AAAA,MACP,eAAA,EAAiB,SAAA;AAAA;AAAA,MACjB,MAAA,EAAQ,SAAA;AAAA;AAAA,MACR,KAAA,EAAO,SAAA;AAAA,MACP,IAAA,EAAM,SAAA;AAAA,MACN,WAAA,EAAa,SAAA;AAAA,MACb,qBAAA,EAAuB,SAAA;AAAA,MACvB,OAAA,EAAS,SAAA;AAAA,MACT,iBAAA,EAAmB,SAAA;AAAA,MACnB,OAAA,EAAS,SAAA;AAAA;AAAA,MACT,iBAAA,EAAmB;AAAA,KACrB;AAAA;AAAA,IAGA,IAAA,EAAM;AAAA,MACJ,UAAA,EAAY,SAAA;AAAA,MACZ,UAAA,EAAY,SAAA;AAAA,MACZ,IAAA,EAAM,SAAA;AAAA,MACN,cAAA,EAAgB,SAAA;AAAA,MAChB,KAAA,EAAO,SAAA;AAAA,MACP,eAAA,EAAiB,SAAA;AAAA,MACjB,MAAA,EAAQ,SAAA;AAAA,MACR,KAAA,EAAO,SAAA;AAAA,MACP,IAAA,EAAM,SAAA;AAAA;AAAA,MACN,WAAA,EAAa,SAAA;AAAA,MACb,qBAAA,EAAuB,SAAA;AAAA,MACvB,OAAA,EAAS,SAAA;AAAA,MACT,iBAAA,EAAmB,SAAA;AAAA,MACnB,OAAA,EAAS,SAAA;AAAA,MACT,iBAAA,EAAmB;AAAA;AACrB,GACF;AAAA,EAEA,UAAA,EAAY;AAAA,IACV,UAAA,EAAY;AAAA;AAAA,MAEV,IAAA,EAAM,CAAC,MAAA,EAAQ,eAAA,EAAiB,aAAa,YAAY,CAAA;AAAA,MACzD,IAAA,EAAM,CAAC,cAAA,EAAgB,gBAAA,EAAkB,SAAS,WAAW;AAAA;AAC/D,GACF;AAAA;AAAA,EAGA,YAAA,EAAc;AAAA,IACZ,IAAA,EAAM,GAAA;AAAA,IACN,EAAA,EAAI,UAAA;AAAA;AAAA,IACJ,EAAA,EAAI,UAAA;AAAA;AAAA,IACJ,EAAA,EAAI,SAAA;AAAA;AAAA,IACJ,EAAA,EAAI,MAAA;AAAA;AAAA,IACJ,KAAA,EAAO,QAAA;AAAA;AAAA,IACP,IAAA,EAAM;AAAA,GACR;AAAA;AAAA,EAGA,SAAA,EAAW;AAAA,IACT,IAAA,EAAM,2EAAA;AAAA,IACN,QAAA,EAAU,qCAAA;AAAA,IACV,KAAA,EACE;AAAA;AAEN","file":"chunk-Q77TE5DZ.js","sourcesContent":["/**\n * Enterprise Health Brand Configuration\n *\n * The official brand theme for Enterprise Health.\n * Extracted from enterprisehealth.com on January 2026.\n *\n * Brand Colors:\n * - Primary: #6E2B68 (Burgundy/Purple) - Used for accents, links, icons\n * - Secondary: #00497A (Deep Teal Blue) - Used in gradients\n * - Accent: #F8B700 (Gold/Yellow) - Logo sun color\n * - Gradient: linear-gradient(111.02deg, #00497A, #6E2B68)\n *\n * Typography: Jost (Google Font)\n * Card Radius: 24px (very rounded)\n * Button Radius: 10px\n * Input Radius: 12px\n */\n\nimport type { BrandConfig } from './types';\n\n/**\n * Enterprise Health brand configuration.\n * This defines all the design tokens used in Enterprise Health applications.\n */\nexport const enterpriseHealthBrand: BrandConfig = {\n name: 'enterprise-health',\n displayName: 'Enterprise Health',\n description: 'Employee health and occupational medicine platform',\n\n colors: {\n // Primary color scale - Enterprise Health Burgundy/Purple (#6E2B68)\n // Derived from rgb(110, 43, 104) found on their website\n primary: {\n 50: '#fdf5fc',\n 100: '#faeaf8',\n 200: '#f5d4f0',\n 300: '#edb3e4',\n 400: '#e086d2',\n 500: '#c95ab8',\n 600: '#6e2b68', // Main brand color\n 700: '#5e2559',\n 800: '#4e1f4a',\n 900: '#42193d',\n 950: '#280e25',\n },\n\n // Gold accent from the logo — mirrors --mieweb-accent* in enterprise-health.css\n accent: { DEFAULT: '#f8b700', light: '#ffc933', dark: '#d49d00' },\n\n // Light mode semantic colors\n // Based on actual Enterprise Health website styles\n light: {\n background: '#ffffff',\n foreground: '#222326', // rgb(34, 35, 38) - their main text color\n card: '#ffffff',\n cardForeground: '#222326',\n muted: '#f8f9fb', // rgb(248, 249, 251) - their section backgrounds\n mutedForeground: '#6a6d77', // rgb(106, 109, 119) - their secondary text\n border: '#e3e6ec', // rgb(227, 230, 236) - their border color\n input: '#e3e6ec',\n ring: '#6e2b68',\n destructive: '#dc2626',\n destructiveForeground: '#ffffff',\n success: '#22c55e',\n successForeground: '#ffffff',\n warning: '#f8b700', // Gold/yellow accent from logo\n warningForeground: '#222326',\n },\n\n // Dark mode semantic colors\n dark: {\n background: '#1a1a1d',\n foreground: '#fafafa',\n card: '#27272a',\n cardForeground: '#fafafa',\n muted: '#3f3f46',\n mutedForeground: '#a1a1aa',\n border: '#3f3f46',\n input: '#3f3f46',\n ring: '#c95ab8', // Lighter primary for dark mode\n destructive: '#dc2626',\n destructiveForeground: '#fafafa',\n success: '#16a34a',\n successForeground: '#fafafa',\n warning: '#f8b700',\n warningForeground: '#222326',\n },\n },\n\n typography: {\n fontFamily: {\n // Jost is the font used on enterprisehealth.com\n sans: ['Jost', 'ui-sans-serif', 'system-ui', 'sans-serif'],\n mono: ['ui-monospace', 'SFMono-Regular', 'Menlo', 'monospace'],\n },\n },\n\n // Enterprise Health uses larger, more rounded corners\n borderRadius: {\n none: '0',\n sm: '0.375rem', // 6px - used for small badges\n md: '0.625rem', // 10px - used for buttons\n lg: '0.75rem', // 12px - used for inputs\n xl: '1rem', // 16px\n '2xl': '1.5rem', // 24px - used for cards\n full: '9999px',\n },\n\n // Enterprise Health card shadows are subtle and layered\n boxShadow: {\n card: '0 16px 32px 0 rgba(34, 35, 38, 0.05), 0 8px 16px 0 rgba(34, 35, 38, 0.05)',\n dropdown: '0 8px 16px 0 rgba(34, 35, 38, 0.08)',\n modal:\n '0 24px 48px 0 rgba(34, 35, 38, 0.12), 0 12px 24px 0 rgba(34, 35, 38, 0.08)',\n },\n};\n\nexport { enterpriseHealthBrand as default };\n"]}
@@ -1,6 +1,6 @@
1
- import { cn } from './chunk-TQONQSJO.js';
2
- import { useEscapeKey } from './chunk-T4ME7QCT.js';
3
1
  import { useAnchoredPosition } from './chunk-WSNMQQ4P.js';
2
+ import { useEscapeKey } from './chunk-T4ME7QCT.js';
3
+ import { cn } from './chunk-TQONQSJO.js';
4
4
  import * as React from 'react';
5
5
  import { createPortal } from 'react-dom';
6
6
  import { X, Diamond, ArrowRight } from 'lucide-react';
@@ -271,5 +271,5 @@ function GlossaryTooltip({
271
271
  }
272
272
 
273
273
  export { GlossaryTooltip };
274
- //# sourceMappingURL=chunk-L5W7TJQ5.js.map
275
- //# sourceMappingURL=chunk-L5W7TJQ5.js.map
274
+ //# sourceMappingURL=chunk-RJ6NTJHC.js.map
275
+ //# sourceMappingURL=chunk-RJ6NTJHC.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/components/GlossaryTooltip/GlossaryTooltip.tsx"],"names":[],"mappings":"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","file":"chunk-L5W7TJQ5.js","sourcesContent":["'use client';\n\nimport * as React from 'react';\nimport { createPortal } from 'react-dom';\nimport { ArrowRight, Diamond, X } from 'lucide-react';\nimport { cn } from '../../utils/cn';\nimport { useAnchoredPosition } from '../../hooks/useAnchoredPosition';\nimport { useEscapeKey } from '../../hooks/useEscapeKey';\n\n// =============================================================================\n// Types\n// =============================================================================\n\n/** Authoritative source link shown in the card footer. */\nexport interface GlossarySource {\n label: string;\n url: string;\n}\n\n/** Sibling term shown as a lateral \"hop\" chip. */\nexport interface GlossaryRelatedTerm {\n term: string;\n href?: string;\n}\n\nexport interface GlossaryTooltipProps {\n /** Visible, in-flow trigger text (may be a plural or abbreviation match). */\n children: React.ReactNode;\n /** Canonical term name, shown as the card heading. */\n term: string;\n definition: string;\n /** Human-readable category label, shown as a badge in the header. */\n category?: string;\n /** Optional single key fact, shown with a diamond marker. */\n keyFact?: string;\n /** Optional authoritative source link, shown in the footer. */\n source?: GlossarySource;\n /** Optional sibling terms, shown as chips. */\n related?: GlossaryRelatedTerm[];\n /**\n * Full glossary page for the term. When set, the trigger is a real link —\n * desktop clicks navigate while hover previews; touch taps pin the card.\n */\n href?: string;\n /** Truncation limit for the in-card definition (default 190 chars). */\n maxDefinitionLength?: number;\n /** Dashed underline marking the term as hoverable (default true). */\n underline?: boolean;\n className?: string;\n}\n\nconst HIDE_GRACE_MS = 180;\n\n// =============================================================================\n// GlossaryTooltip\n// =============================================================================\n\n/**\n * A rich \"what does this term mean?\" hover card: category badge, canonical\n * term, truncated definition, optional key fact, source link, and related\n * term chips. The provenance sibling is `SourceTip` (\"what backs this\n * claim?\") — the two share the same interaction grammar.\n *\n * Trigger and card are phrasing content (`span`/`a`/`button` only), so it is\n * valid inside `<p>` prose. The card portals to `body` with fixed\n * positioning, flipping and clamping to stay in the viewport. On touch, a\n * tap pins the card instead of navigating; Escape or an outside tap closes.\n *\n * @example\n * ```tsx\n * <GlossaryTooltip\n * term=\"OSHA recordable\"\n * definition=\"A work-related injury or illness that meets OSHA reporting criteria…\"\n * category=\"Compliance\"\n * href=\"/glossary/osha-recordable\"\n * >\n * OSHA recordables\n * </GlossaryTooltip>\n * ```\n */\nexport function GlossaryTooltip({\n children,\n term,\n definition,\n category,\n keyFact,\n source,\n related,\n href,\n maxDefinitionLength = 190,\n underline = true,\n className,\n}: GlossaryTooltipProps) {\n const [open, setOpen] = React.useState(false);\n const [pinned, setPinned] = React.useState(false);\n const timer = React.useRef<ReturnType<typeof setTimeout> | null>(null);\n // True while close() restores focus to the trigger, so the trigger's\n // focus-show doesn't immediately reopen a card the user just dismissed.\n const suppressFocusShow = React.useRef(false);\n\n const { anchorRef, floatingRef, style } = useAnchoredPosition<\n HTMLSpanElement,\n HTMLSpanElement\n >({\n open,\n placement: 'top',\n offset: 10,\n viewportPadding: 8,\n allowFlip: true,\n });\n\n const clearHideTimer = () => {\n if (timer.current) {\n clearTimeout(timer.current);\n timer.current = null;\n }\n };\n\n const show = React.useCallback(() => {\n clearHideTimer();\n setOpen(true);\n }, []);\n\n const scheduleHide = React.useCallback(() => {\n if (pinned) return;\n clearHideTimer();\n timer.current = setTimeout(() => setOpen(false), HIDE_GRACE_MS);\n }, [pinned]);\n\n const close = React.useCallback(() => {\n clearHideTimer();\n setPinned(false);\n setOpen(false);\n // Return focus to the trigger if it was inside the card.\n if (floatingRef.current?.contains(document.activeElement)) {\n suppressFocusShow.current = true;\n (anchorRef.current?.querySelector('a,button') as HTMLElement)?.focus();\n }\n }, [anchorRef, floatingRef]);\n\n React.useEffect(() => () => clearHideTimer(), []);\n\n // A pinned card is a non-modal dialog: move focus into it so its links\n // and close button are reachable by keyboard.\n React.useEffect(() => {\n if (pinned) floatingRef.current?.focus();\n }, [pinned, floatingRef]);\n\n useEscapeKey(close, open);\n\n // Pinned cards close on an outside tap; hover cards close on their own.\n React.useEffect(() => {\n if (!open || !pinned) return;\n const onPointer = (e: Event) => {\n const t = e.target as Node;\n if (anchorRef.current?.contains(t) || floatingRef.current?.contains(t))\n return;\n close();\n };\n document.addEventListener('mousedown', onPointer);\n document.addEventListener('touchstart', onPointer);\n return () => {\n document.removeEventListener('mousedown', onPointer);\n document.removeEventListener('touchstart', onPointer);\n };\n }, [open, pinned, close, anchorRef, floatingRef]);\n\n const togglePin = React.useCallback(() => {\n if (pinned) close();\n else {\n setPinned(true);\n show();\n }\n }, [pinned, close, show]);\n\n // Linked terms: desktop clicks navigate, coarse pointers pin instead.\n // Unlinked (button) terms: any click toggles the pin — hover previews,\n // click holds the card open.\n const onTriggerClick = (e: React.MouseEvent) => {\n const coarse =\n typeof window !== 'undefined' &&\n window.matchMedia('(hover: none)').matches;\n if (href) {\n if (!coarse) return;\n e.preventDefault();\n }\n togglePin();\n };\n\n const onTriggerKeyDown = (e: React.KeyboardEvent) => {\n if (href) return; // links keep native Enter navigation\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n togglePin();\n }\n };\n\n // Focus lives on the dialog container once pinned, so Enter/Space there\n // (not on a link or the close button inside) must also unpin.\n const onDialogKeyDown = (e: React.KeyboardEvent<HTMLSpanElement>) => {\n if (e.target !== e.currentTarget) return;\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n close();\n }\n };\n\n const onTriggerFocus = () => {\n if (suppressFocusShow.current) {\n suppressFocusShow.current = false;\n return;\n }\n show();\n };\n\n const onBlurCapture = (e: React.FocusEvent<HTMLSpanElement>) => {\n const next = e.relatedTarget as Node | null;\n if (\n next &&\n (anchorRef.current?.contains(next) || floatingRef.current?.contains(next))\n )\n return;\n scheduleHide();\n };\n\n const limit = Math.max(1, maxDefinitionLength);\n const short =\n definition.length > limit\n ? `${definition.slice(0, limit - 1).trimEnd()}…`\n : definition;\n\n const triggerClasses = cn(\n 'cursor-help',\n underline &&\n 'decoration-primary-400/70 underline decoration-dashed underline-offset-4',\n className\n );\n\n const triggerProps = {\n onClick: onTriggerClick,\n className: cn(\n triggerClasses,\n href && 'text-primary-800 dark:text-primary-400 font-medium'\n ),\n };\n\n return (\n <span\n ref={anchorRef}\n className=\"relative inline\"\n onMouseEnter={show}\n onMouseLeave={scheduleHide}\n onFocus={onTriggerFocus}\n onBlur={onBlurCapture}\n >\n {href ? (\n <a\n href={href}\n aria-expanded={open}\n aria-haspopup=\"dialog\"\n {...triggerProps}\n >\n {children}\n </a>\n ) : (\n <button\n type=\"button\"\n aria-expanded={open}\n aria-haspopup=\"dialog\"\n aria-label={`${term} — show definition`}\n onKeyDown={onTriggerKeyDown}\n {...triggerProps}\n className={cn(\n 'inline appearance-none border-0 bg-transparent p-0 text-inherit [font:inherit]',\n triggerProps.className\n )}\n >\n {children}\n </button>\n )}\n {open &&\n createPortal(\n /* eslint-disable-next-line jsx-a11y/no-noninteractive-element-interactions -- keyboard dismissal on a focused non-modal dialog container is the WAI-ARIA pattern; links inside keep their own semantics */\n <span\n ref={floatingRef}\n role=\"dialog\"\n aria-label={term}\n tabIndex={-1}\n onMouseEnter={show}\n onMouseLeave={scheduleHide}\n onBlurCapture={onBlurCapture}\n onKeyDown={onDialogKeyDown}\n className=\"focus-visible:ring-ring z-50 block w-80 rounded-lg outline-none focus-visible:ring-2\"\n style={style}\n >\n <span className=\"border-border bg-card block overflow-hidden rounded-lg border text-start font-normal tracking-normal normal-case shadow-xl ring-1 ring-black/5 dark:ring-white/10\">\n <span className=\"from-primary-700 to-primary-600 block bg-gradient-to-br px-3.5 py-2.5\">\n <span className=\"flex items-start justify-between gap-2\">\n <span className=\"block min-w-0\">\n {category && (\n <span className=\"mb-1 inline-flex rounded-full bg-white/15 px-2 py-0.5 text-[10px] font-bold tracking-wide text-white uppercase\">\n {category}\n </span>\n )}\n <span className=\"block text-sm leading-snug font-semibold text-white\">\n {term}\n </span>\n </span>\n {pinned && (\n <button\n type=\"button\"\n onClick={close}\n aria-label=\"Close definition\"\n className=\"shrink-0 rounded p-0.5 text-white/70 hover:bg-white/10 hover:text-white\"\n >\n <X aria-hidden=\"true\" className=\"h-3.5 w-3.5\" />\n </button>\n )}\n </span>\n </span>\n\n <span className=\"block px-3.5 py-2.5\">\n <span className=\"text-muted-foreground block text-[13px] leading-relaxed\">\n {short}\n </span>\n {keyFact && (\n <span className=\"mt-2 flex items-start gap-1.5\">\n <Diamond\n aria-hidden=\"true\"\n className=\"text-primary-500 mt-0.5 h-3 w-3 shrink-0\"\n />\n <span className=\"text-foreground min-w-0 text-xs leading-relaxed font-medium\">\n {keyFact}\n </span>\n </span>\n )}\n </span>\n\n {(source || (related && related.length > 0) || href) && (\n <span className=\"border-border bg-muted/50 block border-t px-3.5 py-2\">\n {related && related.length > 0 && (\n <span className=\"mb-1.5 flex flex-wrap gap-1\">\n {related.map((r) =>\n r.href ? (\n <a\n key={r.term}\n href={r.href}\n className=\"border-border bg-card text-foreground hover:border-primary-400 hover:text-primary-800 dark:hover:text-primary-400 rounded-full border px-2 py-0.5 text-[11px] font-medium\"\n >\n {r.term}\n </a>\n ) : (\n <span\n key={r.term}\n className=\"border-border bg-card text-muted-foreground rounded-full border px-2 py-0.5 text-[11px] font-medium\"\n >\n {r.term}\n </span>\n )\n )}\n </span>\n )}\n <span className=\"flex items-center justify-between gap-2\">\n {source ? (\n <a\n href={source.url}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"text-primary-800 hover:text-primary-700 dark:text-primary-400 dark:hover:text-primary-300 min-w-0 truncate text-[11px] font-semibold\"\n >\n {source.label}\n </a>\n ) : (\n <span />\n )}\n {href && (\n <a\n href={href}\n className=\"text-muted-foreground hover:text-foreground inline-flex shrink-0 items-center gap-0.5 text-[11px] font-medium\"\n >\n Full definition\n <ArrowRight\n aria-hidden=\"true\"\n className=\"h-3 w-3 rtl:-scale-x-100\"\n />\n </a>\n )}\n </span>\n </span>\n )}\n </span>\n </span>,\n document.body\n )}\n </span>\n );\n}\n"]}
1
+ {"version":3,"sources":["../src/components/GlossaryTooltip/GlossaryTooltip.tsx"],"names":[],"mappings":"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","file":"chunk-RJ6NTJHC.js","sourcesContent":["'use client';\n\nimport * as React from 'react';\nimport { createPortal } from 'react-dom';\nimport { ArrowRight, Diamond, X } from 'lucide-react';\nimport { cn } from '../../utils/cn';\nimport { useAnchoredPosition } from '../../hooks/useAnchoredPosition';\nimport { useEscapeKey } from '../../hooks/useEscapeKey';\n\n// =============================================================================\n// Types\n// =============================================================================\n\n/** Authoritative source link shown in the card footer. */\nexport interface GlossarySource {\n label: string;\n url: string;\n}\n\n/** Sibling term shown as a lateral \"hop\" chip. */\nexport interface GlossaryRelatedTerm {\n term: string;\n href?: string;\n}\n\nexport interface GlossaryTooltipProps {\n /** Visible, in-flow trigger text (may be a plural or abbreviation match). */\n children: React.ReactNode;\n /** Canonical term name, shown as the card heading. */\n term: string;\n definition: string;\n /** Human-readable category label, shown as a badge in the header. */\n category?: string;\n /** Optional single key fact, shown with a diamond marker. */\n keyFact?: string;\n /** Optional authoritative source link, shown in the footer. */\n source?: GlossarySource;\n /** Optional sibling terms, shown as chips. */\n related?: GlossaryRelatedTerm[];\n /**\n * Full glossary page for the term. When set, the trigger is a real link —\n * desktop clicks navigate while hover previews; touch taps pin the card.\n */\n href?: string;\n /** Truncation limit for the in-card definition (default 190 chars). */\n maxDefinitionLength?: number;\n /** Dashed underline marking the term as hoverable (default true). */\n underline?: boolean;\n className?: string;\n}\n\nconst HIDE_GRACE_MS = 180;\n\n// =============================================================================\n// GlossaryTooltip\n// =============================================================================\n\n/**\n * A rich \"what does this term mean?\" hover card: category badge, canonical\n * term, truncated definition, optional key fact, source link, and related\n * term chips. The provenance sibling is `SourceTip` (\"what backs this\n * claim?\") — the two share the same interaction grammar.\n *\n * Trigger and card are phrasing content (`span`/`a`/`button` only), so it is\n * valid inside `<p>` prose. The card portals to `body` with fixed\n * positioning, flipping and clamping to stay in the viewport. On touch, a\n * tap pins the card instead of navigating; Escape or an outside tap closes.\n *\n * @example\n * ```tsx\n * <GlossaryTooltip\n * term=\"OSHA recordable\"\n * definition=\"A work-related injury or illness that meets OSHA reporting criteria…\"\n * category=\"Compliance\"\n * href=\"/glossary/osha-recordable\"\n * >\n * OSHA recordables\n * </GlossaryTooltip>\n * ```\n */\nexport function GlossaryTooltip({\n children,\n term,\n definition,\n category,\n keyFact,\n source,\n related,\n href,\n maxDefinitionLength = 190,\n underline = true,\n className,\n}: GlossaryTooltipProps) {\n const [open, setOpen] = React.useState(false);\n const [pinned, setPinned] = React.useState(false);\n const timer = React.useRef<ReturnType<typeof setTimeout> | null>(null);\n // True while close() restores focus to the trigger, so the trigger's\n // focus-show doesn't immediately reopen a card the user just dismissed.\n const suppressFocusShow = React.useRef(false);\n\n const { anchorRef, floatingRef, style } = useAnchoredPosition<\n HTMLSpanElement,\n HTMLSpanElement\n >({\n open,\n placement: 'top',\n offset: 10,\n viewportPadding: 8,\n allowFlip: true,\n });\n\n const clearHideTimer = () => {\n if (timer.current) {\n clearTimeout(timer.current);\n timer.current = null;\n }\n };\n\n const show = React.useCallback(() => {\n clearHideTimer();\n setOpen(true);\n }, []);\n\n const scheduleHide = React.useCallback(() => {\n if (pinned) return;\n clearHideTimer();\n timer.current = setTimeout(() => setOpen(false), HIDE_GRACE_MS);\n }, [pinned]);\n\n const close = React.useCallback(() => {\n clearHideTimer();\n setPinned(false);\n setOpen(false);\n // Return focus to the trigger if it was inside the card.\n if (floatingRef.current?.contains(document.activeElement)) {\n suppressFocusShow.current = true;\n (anchorRef.current?.querySelector('a,button') as HTMLElement)?.focus();\n }\n }, [anchorRef, floatingRef]);\n\n React.useEffect(() => () => clearHideTimer(), []);\n\n // A pinned card is a non-modal dialog: move focus into it so its links\n // and close button are reachable by keyboard.\n React.useEffect(() => {\n if (pinned) floatingRef.current?.focus();\n }, [pinned, floatingRef]);\n\n useEscapeKey(close, open);\n\n // Pinned cards close on an outside tap; hover cards close on their own.\n React.useEffect(() => {\n if (!open || !pinned) return;\n const onPointer = (e: Event) => {\n const t = e.target as Node;\n if (anchorRef.current?.contains(t) || floatingRef.current?.contains(t))\n return;\n close();\n };\n document.addEventListener('mousedown', onPointer);\n document.addEventListener('touchstart', onPointer);\n return () => {\n document.removeEventListener('mousedown', onPointer);\n document.removeEventListener('touchstart', onPointer);\n };\n }, [open, pinned, close, anchorRef, floatingRef]);\n\n const togglePin = React.useCallback(() => {\n if (pinned) close();\n else {\n setPinned(true);\n show();\n }\n }, [pinned, close, show]);\n\n // Linked terms: desktop clicks navigate, coarse pointers pin instead.\n // Unlinked (button) terms: any click toggles the pin — hover previews,\n // click holds the card open.\n const onTriggerClick = (e: React.MouseEvent) => {\n const coarse =\n typeof window !== 'undefined' &&\n window.matchMedia('(hover: none)').matches;\n if (href) {\n if (!coarse) return;\n e.preventDefault();\n }\n togglePin();\n };\n\n const onTriggerKeyDown = (e: React.KeyboardEvent) => {\n if (href) return; // links keep native Enter navigation\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n togglePin();\n }\n };\n\n // Focus lives on the dialog container once pinned, so Enter/Space there\n // (not on a link or the close button inside) must also unpin.\n const onDialogKeyDown = (e: React.KeyboardEvent<HTMLSpanElement>) => {\n if (e.target !== e.currentTarget) return;\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n close();\n }\n };\n\n const onTriggerFocus = () => {\n if (suppressFocusShow.current) {\n suppressFocusShow.current = false;\n return;\n }\n show();\n };\n\n const onBlurCapture = (e: React.FocusEvent<HTMLSpanElement>) => {\n const next = e.relatedTarget as Node | null;\n if (\n next &&\n (anchorRef.current?.contains(next) || floatingRef.current?.contains(next))\n )\n return;\n scheduleHide();\n };\n\n const limit = Math.max(1, maxDefinitionLength);\n const short =\n definition.length > limit\n ? `${definition.slice(0, limit - 1).trimEnd()}…`\n : definition;\n\n const triggerClasses = cn(\n 'cursor-help',\n underline &&\n 'decoration-primary-400/70 underline decoration-dashed underline-offset-4',\n className\n );\n\n const triggerProps = {\n onClick: onTriggerClick,\n className: cn(\n triggerClasses,\n href && 'text-primary-800 dark:text-primary-400 font-medium'\n ),\n };\n\n return (\n <span\n ref={anchorRef}\n className=\"relative inline\"\n onMouseEnter={show}\n onMouseLeave={scheduleHide}\n onFocus={onTriggerFocus}\n onBlur={onBlurCapture}\n >\n {href ? (\n <a\n href={href}\n aria-expanded={open}\n aria-haspopup=\"dialog\"\n {...triggerProps}\n >\n {children}\n </a>\n ) : (\n <button\n type=\"button\"\n aria-expanded={open}\n aria-haspopup=\"dialog\"\n aria-label={`${term} — show definition`}\n onKeyDown={onTriggerKeyDown}\n {...triggerProps}\n className={cn(\n 'inline appearance-none border-0 bg-transparent p-0 text-inherit [font:inherit]',\n triggerProps.className\n )}\n >\n {children}\n </button>\n )}\n {open &&\n createPortal(\n /* eslint-disable-next-line jsx-a11y/no-noninteractive-element-interactions -- keyboard dismissal on a focused non-modal dialog container is the WAI-ARIA pattern; links inside keep their own semantics */\n <span\n ref={floatingRef}\n role=\"dialog\"\n aria-label={term}\n tabIndex={-1}\n onMouseEnter={show}\n onMouseLeave={scheduleHide}\n onBlurCapture={onBlurCapture}\n onKeyDown={onDialogKeyDown}\n className=\"focus-visible:ring-ring z-50 block w-80 rounded-lg outline-none focus-visible:ring-2\"\n style={style}\n >\n <span className=\"border-border bg-card block overflow-hidden rounded-lg border text-start font-normal tracking-normal normal-case shadow-xl ring-1 ring-black/5 dark:ring-white/10\">\n <span className=\"from-primary-700 to-primary-600 block bg-gradient-to-br px-3.5 py-2.5\">\n <span className=\"flex items-start justify-between gap-2\">\n <span className=\"block min-w-0\">\n {category && (\n <span className=\"mb-1 inline-flex rounded-full bg-white/15 px-2 py-0.5 text-[10px] font-bold tracking-wide text-white uppercase\">\n {category}\n </span>\n )}\n <span className=\"block text-sm leading-snug font-semibold text-white\">\n {term}\n </span>\n </span>\n {pinned && (\n <button\n type=\"button\"\n onClick={close}\n aria-label=\"Close definition\"\n className=\"shrink-0 rounded p-0.5 text-white/70 hover:bg-white/10 hover:text-white\"\n >\n <X aria-hidden=\"true\" className=\"h-3.5 w-3.5\" />\n </button>\n )}\n </span>\n </span>\n\n <span className=\"block px-3.5 py-2.5\">\n <span className=\"text-muted-foreground block text-[13px] leading-relaxed\">\n {short}\n </span>\n {keyFact && (\n <span className=\"mt-2 flex items-start gap-1.5\">\n <Diamond\n aria-hidden=\"true\"\n className=\"text-primary-500 mt-0.5 h-3 w-3 shrink-0\"\n />\n <span className=\"text-foreground min-w-0 text-xs leading-relaxed font-medium\">\n {keyFact}\n </span>\n </span>\n )}\n </span>\n\n {(source || (related && related.length > 0) || href) && (\n <span className=\"border-border bg-muted/50 block border-t px-3.5 py-2\">\n {related && related.length > 0 && (\n <span className=\"mb-1.5 flex flex-wrap gap-1\">\n {related.map((r) =>\n r.href ? (\n <a\n key={r.term}\n href={r.href}\n className=\"border-border bg-card text-foreground hover:border-primary-400 hover:text-primary-800 dark:hover:text-primary-400 rounded-full border px-2 py-0.5 text-[11px] font-medium\"\n >\n {r.term}\n </a>\n ) : (\n <span\n key={r.term}\n className=\"border-border bg-card text-muted-foreground rounded-full border px-2 py-0.5 text-[11px] font-medium\"\n >\n {r.term}\n </span>\n )\n )}\n </span>\n )}\n <span className=\"flex items-center justify-between gap-2\">\n {source ? (\n <a\n href={source.url}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"text-primary-800 hover:text-primary-700 dark:text-primary-400 dark:hover:text-primary-300 min-w-0 truncate text-[11px] font-semibold\"\n >\n {source.label}\n </a>\n ) : (\n <span />\n )}\n {href && (\n <a\n href={href}\n className=\"text-muted-foreground hover:text-foreground inline-flex shrink-0 items-center gap-0.5 text-[11px] font-medium\"\n >\n Full definition\n <ArrowRight\n aria-hidden=\"true\"\n className=\"h-3 w-3 rtl:-scale-x-100\"\n />\n </a>\n )}\n </span>\n </span>\n )}\n </span>\n </span>,\n document.body\n )}\n </span>\n );\n}\n"]}
@@ -1,8 +1,8 @@
1
1
  'use strict';
2
2
 
3
- var chunkS5RVSXDV_cjs = require('./chunk-S5RVSXDV.cjs');
4
3
  var chunkNNEFAUHV_cjs = require('./chunk-NNEFAUHV.cjs');
5
4
  var chunkFHY3K6PL_cjs = require('./chunk-FHY3K6PL.cjs');
5
+ var chunkS5RVSXDV_cjs = require('./chunk-S5RVSXDV.cjs');
6
6
  var React = require('react');
7
7
  var classVarianceAuthority = require('class-variance-authority');
8
8
  var jsxRuntime = require('react/jsx-runtime');
@@ -258,5 +258,5 @@ exports.SheetHeader = SheetHeader;
258
258
  exports.SheetTitle = SheetTitle;
259
259
  exports.sheetContentVariants = sheetContentVariants;
260
260
  exports.sheetOverlayVariants = sheetOverlayVariants;
261
- //# sourceMappingURL=chunk-C3DUS2VE.cjs.map
262
- //# sourceMappingURL=chunk-C3DUS2VE.cjs.map
261
+ //# sourceMappingURL=chunk-RS5VA6QU.cjs.map
262
+ //# sourceMappingURL=chunk-RS5VA6QU.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/components/Sheet/Sheet.tsx"],"names":["cva","React","useFocusTrap","useEscapeKey","jsx","jsxs","cn"],"mappings":"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","file":"chunk-C3DUS2VE.cjs","sourcesContent":["import * as React from 'react';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { cn } from '../../utils/cn';\nimport { useFocusTrap } from '../../hooks/useFocusTrap';\nimport { useEscapeKey } from '../../hooks/useEscapeKey';\n\nconst sheetOverlayVariants = cva([\n 'fixed inset-0 z-50',\n 'bg-black/50 backdrop-blur-sm',\n 'data-[state=open]:animate-in data-[state=open]:fade-in-0',\n 'data-[state=closed]:animate-out data-[state=closed]:fade-out-0',\n]);\n\nconst sheetContentVariants = cva(\n [\n 'fixed z-50 flex flex-col gap-4',\n 'bg-card text-card-foreground shadow-lg',\n 'border-border',\n 'focus:outline-none',\n 'transition ease-in-out duration-200',\n ],\n {\n variants: {\n // `left`/`right` are direction-aware aliases for `start`/`end` and\n // mirror in RTL documents.\n side: {\n top: 'inset-x-0 top-0 border-b max-h-dvh',\n bottom: 'inset-x-0 bottom-0 border-t max-h-dvh',\n left: 'inset-y-0 start-0 h-full border-e w-3/4 sm:max-w-sm',\n right: 'inset-y-0 end-0 h-full border-s w-3/4 sm:max-w-sm',\n start: 'inset-y-0 start-0 h-full border-e w-3/4 sm:max-w-sm',\n end: 'inset-y-0 end-0 h-full border-s w-3/4 sm:max-w-sm',\n },\n },\n defaultVariants: {\n side: 'right',\n },\n }\n);\n\nexport interface SheetProps extends VariantProps<typeof sheetContentVariants> {\n /** Whether the sheet is open */\n open: boolean;\n /** Callback when the sheet should close */\n onOpenChange: (open: boolean) => void;\n /** Sheet content */\n children: React.ReactNode;\n /** Close when clicking the overlay (default true) */\n closeOnOverlayClick?: boolean;\n /** Close when pressing Escape (default true) */\n closeOnEscape?: boolean;\n /** Additional class name for the sheet content */\n className?: string;\n /** ID for the sheet, used for accessibility */\n id?: string;\n /** Accessible label for the sheet */\n 'aria-label'?: string;\n /** ID of the element that labels the sheet */\n 'aria-labelledby'?: string;\n /** ID of the element that describes the sheet */\n 'aria-describedby'?: string;\n}\n\n/**\n * A panel that slides in from an edge of the screen.\n *\n * @example\n * ```tsx\n * <Sheet open={open} onOpenChange={setOpen} side=\"right\">\n * <SheetHeader>\n * <SheetTitle>Filters</SheetTitle>\n * </SheetHeader>\n * <SheetBody>...</SheetBody>\n * </Sheet>\n * ```\n */\nfunction Sheet({\n open,\n onOpenChange,\n children,\n side,\n closeOnOverlayClick = true,\n closeOnEscape = true,\n className,\n id,\n 'aria-label': ariaLabel,\n 'aria-labelledby': ariaLabelledBy,\n 'aria-describedby': ariaDescribedBy,\n}: SheetProps) {\n const generatedId = React.useId();\n const sheetId = id || generatedId;\n\n const focusTrapRef = useFocusTrap<HTMLDivElement>(open);\n\n useEscapeKey(() => {\n if (closeOnEscape && open) onOpenChange(false);\n }, open);\n\n const handleOverlayClick = React.useCallback(\n (e: React.MouseEvent) => {\n if (closeOnOverlayClick && e.target === e.currentTarget) {\n onOpenChange(false);\n }\n },\n [closeOnOverlayClick, onOpenChange]\n );\n\n if (!open) return null;\n\n return (\n <SheetContext.Provider\n value={{ onClose: () => onOpenChange(false), sheetId }}\n >\n <div className=\"fixed inset-0 z-50\">\n <div\n className={cn(sheetOverlayVariants())}\n data-state=\"open\"\n aria-hidden=\"true\"\n onClick={handleOverlayClick}\n />\n <div\n ref={focusTrapRef}\n role=\"dialog\"\n aria-modal=\"true\"\n aria-label={ariaLabel}\n aria-labelledby={ariaLabelledBy || `${sheetId}-title`}\n aria-describedby={ariaDescribedBy}\n id={sheetId}\n tabIndex={-1}\n data-state=\"open\"\n data-slot=\"sheet\"\n className={cn(sheetContentVariants({ side }), className)}\n >\n {children}\n </div>\n </div>\n </SheetContext.Provider>\n );\n}\n\nSheet.displayName = 'Sheet';\n\ninterface SheetContextValue {\n onClose: () => void;\n sheetId: string;\n}\n\nconst SheetContext = React.createContext<SheetContextValue | undefined>(\n undefined\n);\n\nfunction useSheetContext() {\n const context = React.useContext(SheetContext);\n if (!context) {\n throw new Error('Sheet components must be used within a Sheet');\n }\n return context;\n}\n\nexport type SheetHeaderProps = React.HTMLAttributes<HTMLDivElement>;\n\nconst SheetHeader = React.forwardRef<HTMLDivElement, SheetHeaderProps>(\n ({ className, ...props }, ref) => (\n <div\n ref={ref}\n data-slot=\"sheet-header\"\n className={cn(\n 'flex shrink-0 items-center justify-between',\n 'border-border border-b px-6 py-4',\n className\n )}\n {...props}\n />\n )\n);\n\nSheetHeader.displayName = 'SheetHeader';\n\nexport type SheetTitleProps = React.HTMLAttributes<HTMLHeadingElement>;\n\nconst SheetTitle = React.forwardRef<HTMLHeadingElement, SheetTitleProps>(\n ({ className, children, ...props }, ref) => {\n const { sheetId } = useSheetContext();\n return (\n <h2\n ref={ref}\n id={`${sheetId}-title`}\n data-slot=\"sheet-title\"\n className={cn(\n 'text-lg leading-none font-semibold tracking-tight',\n className\n )}\n {...props}\n >\n {children}\n </h2>\n );\n }\n);\n\nSheetTitle.displayName = 'SheetTitle';\n\nexport type SheetDescriptionProps = React.HTMLAttributes<HTMLParagraphElement>;\n\nconst SheetDescription = React.forwardRef<\n HTMLParagraphElement,\n SheetDescriptionProps\n>(({ className, ...props }, ref) => (\n <p\n ref={ref}\n data-slot=\"sheet-description\"\n className={cn('text-muted-foreground text-sm', className)}\n {...props}\n />\n));\n\nSheetDescription.displayName = 'SheetDescription';\n\nexport type SheetBodyProps = React.HTMLAttributes<HTMLDivElement>;\n\nconst SheetBody = React.forwardRef<HTMLDivElement, SheetBodyProps>(\n ({ className, ...props }, ref) => (\n <div\n ref={ref}\n data-slot=\"sheet-body\"\n className={cn('flex-1 overflow-y-auto px-6 py-4', className)}\n {...props}\n />\n )\n);\n\nSheetBody.displayName = 'SheetBody';\n\nexport type SheetFooterProps = React.HTMLAttributes<HTMLDivElement>;\n\nconst SheetFooter = React.forwardRef<HTMLDivElement, SheetFooterProps>(\n ({ className, ...props }, ref) => (\n <div\n ref={ref}\n data-slot=\"sheet-footer\"\n className={cn(\n 'flex shrink-0 flex-col-reverse gap-2 sm:flex-row sm:justify-end',\n 'border-border border-t px-6 py-4',\n className\n )}\n {...props}\n />\n )\n);\n\nSheetFooter.displayName = 'SheetFooter';\n\nexport type SheetCloseProps = React.ButtonHTMLAttributes<HTMLButtonElement>;\n\nconst SheetClose = React.forwardRef<HTMLButtonElement, SheetCloseProps>(\n ({ className, children, onClick, ...props }, ref) => {\n const { onClose } = useSheetContext();\n return (\n <button\n ref={ref}\n type=\"button\"\n data-slot=\"sheet-close\"\n aria-label=\"Close\"\n onClick={(e) => {\n onClose();\n onClick?.(e);\n }}\n className={cn(\n 'text-muted-foreground hover:text-foreground rounded-md',\n 'focus-visible:ring-ring focus-visible:ring-2 focus-visible:outline-none',\n 'transition-colors',\n className\n )}\n {...props}\n >\n {children ?? (\n <svg\n width=\"20\"\n height=\"20\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n >\n <path d=\"M18 6 6 18M6 6l12 12\" />\n </svg>\n )}\n </button>\n );\n }\n);\n\nSheetClose.displayName = 'SheetClose';\n\nexport {\n Sheet,\n SheetHeader,\n SheetTitle,\n SheetDescription,\n SheetBody,\n SheetFooter,\n SheetClose,\n sheetContentVariants,\n sheetOverlayVariants,\n};\n"]}
1
+ {"version":3,"sources":["../src/components/Sheet/Sheet.tsx"],"names":["cva","React","useFocusTrap","useEscapeKey","jsx","jsxs","cn"],"mappings":"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","file":"chunk-RS5VA6QU.cjs","sourcesContent":["import * as React from 'react';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { cn } from '../../utils/cn';\nimport { useFocusTrap } from '../../hooks/useFocusTrap';\nimport { useEscapeKey } from '../../hooks/useEscapeKey';\n\nconst sheetOverlayVariants = cva([\n 'fixed inset-0 z-50',\n 'bg-black/50 backdrop-blur-sm',\n 'data-[state=open]:animate-in data-[state=open]:fade-in-0',\n 'data-[state=closed]:animate-out data-[state=closed]:fade-out-0',\n]);\n\nconst sheetContentVariants = cva(\n [\n 'fixed z-50 flex flex-col gap-4',\n 'bg-card text-card-foreground shadow-lg',\n 'border-border',\n 'focus:outline-none',\n 'transition ease-in-out duration-200',\n ],\n {\n variants: {\n // `left`/`right` are direction-aware aliases for `start`/`end` and\n // mirror in RTL documents.\n side: {\n top: 'inset-x-0 top-0 border-b max-h-dvh',\n bottom: 'inset-x-0 bottom-0 border-t max-h-dvh',\n left: 'inset-y-0 start-0 h-full border-e w-3/4 sm:max-w-sm',\n right: 'inset-y-0 end-0 h-full border-s w-3/4 sm:max-w-sm',\n start: 'inset-y-0 start-0 h-full border-e w-3/4 sm:max-w-sm',\n end: 'inset-y-0 end-0 h-full border-s w-3/4 sm:max-w-sm',\n },\n },\n defaultVariants: {\n side: 'right',\n },\n }\n);\n\nexport interface SheetProps extends VariantProps<typeof sheetContentVariants> {\n /** Whether the sheet is open */\n open: boolean;\n /** Callback when the sheet should close */\n onOpenChange: (open: boolean) => void;\n /** Sheet content */\n children: React.ReactNode;\n /** Close when clicking the overlay (default true) */\n closeOnOverlayClick?: boolean;\n /** Close when pressing Escape (default true) */\n closeOnEscape?: boolean;\n /** Additional class name for the sheet content */\n className?: string;\n /** ID for the sheet, used for accessibility */\n id?: string;\n /** Accessible label for the sheet */\n 'aria-label'?: string;\n /** ID of the element that labels the sheet */\n 'aria-labelledby'?: string;\n /** ID of the element that describes the sheet */\n 'aria-describedby'?: string;\n}\n\n/**\n * A panel that slides in from an edge of the screen.\n *\n * @example\n * ```tsx\n * <Sheet open={open} onOpenChange={setOpen} side=\"right\">\n * <SheetHeader>\n * <SheetTitle>Filters</SheetTitle>\n * </SheetHeader>\n * <SheetBody>...</SheetBody>\n * </Sheet>\n * ```\n */\nfunction Sheet({\n open,\n onOpenChange,\n children,\n side,\n closeOnOverlayClick = true,\n closeOnEscape = true,\n className,\n id,\n 'aria-label': ariaLabel,\n 'aria-labelledby': ariaLabelledBy,\n 'aria-describedby': ariaDescribedBy,\n}: SheetProps) {\n const generatedId = React.useId();\n const sheetId = id || generatedId;\n\n const focusTrapRef = useFocusTrap<HTMLDivElement>(open);\n\n useEscapeKey(() => {\n if (closeOnEscape && open) onOpenChange(false);\n }, open);\n\n const handleOverlayClick = React.useCallback(\n (e: React.MouseEvent) => {\n if (closeOnOverlayClick && e.target === e.currentTarget) {\n onOpenChange(false);\n }\n },\n [closeOnOverlayClick, onOpenChange]\n );\n\n if (!open) return null;\n\n return (\n <SheetContext.Provider\n value={{ onClose: () => onOpenChange(false), sheetId }}\n >\n <div className=\"fixed inset-0 z-50\">\n <div\n className={cn(sheetOverlayVariants())}\n data-state=\"open\"\n aria-hidden=\"true\"\n onClick={handleOverlayClick}\n />\n <div\n ref={focusTrapRef}\n role=\"dialog\"\n aria-modal=\"true\"\n aria-label={ariaLabel}\n aria-labelledby={ariaLabelledBy || `${sheetId}-title`}\n aria-describedby={ariaDescribedBy}\n id={sheetId}\n tabIndex={-1}\n data-state=\"open\"\n data-slot=\"sheet\"\n className={cn(sheetContentVariants({ side }), className)}\n >\n {children}\n </div>\n </div>\n </SheetContext.Provider>\n );\n}\n\nSheet.displayName = 'Sheet';\n\ninterface SheetContextValue {\n onClose: () => void;\n sheetId: string;\n}\n\nconst SheetContext = React.createContext<SheetContextValue | undefined>(\n undefined\n);\n\nfunction useSheetContext() {\n const context = React.useContext(SheetContext);\n if (!context) {\n throw new Error('Sheet components must be used within a Sheet');\n }\n return context;\n}\n\nexport type SheetHeaderProps = React.HTMLAttributes<HTMLDivElement>;\n\nconst SheetHeader = React.forwardRef<HTMLDivElement, SheetHeaderProps>(\n ({ className, ...props }, ref) => (\n <div\n ref={ref}\n data-slot=\"sheet-header\"\n className={cn(\n 'flex shrink-0 items-center justify-between',\n 'border-border border-b px-6 py-4',\n className\n )}\n {...props}\n />\n )\n);\n\nSheetHeader.displayName = 'SheetHeader';\n\nexport type SheetTitleProps = React.HTMLAttributes<HTMLHeadingElement>;\n\nconst SheetTitle = React.forwardRef<HTMLHeadingElement, SheetTitleProps>(\n ({ className, children, ...props }, ref) => {\n const { sheetId } = useSheetContext();\n return (\n <h2\n ref={ref}\n id={`${sheetId}-title`}\n data-slot=\"sheet-title\"\n className={cn(\n 'text-lg leading-none font-semibold tracking-tight',\n className\n )}\n {...props}\n >\n {children}\n </h2>\n );\n }\n);\n\nSheetTitle.displayName = 'SheetTitle';\n\nexport type SheetDescriptionProps = React.HTMLAttributes<HTMLParagraphElement>;\n\nconst SheetDescription = React.forwardRef<\n HTMLParagraphElement,\n SheetDescriptionProps\n>(({ className, ...props }, ref) => (\n <p\n ref={ref}\n data-slot=\"sheet-description\"\n className={cn('text-muted-foreground text-sm', className)}\n {...props}\n />\n));\n\nSheetDescription.displayName = 'SheetDescription';\n\nexport type SheetBodyProps = React.HTMLAttributes<HTMLDivElement>;\n\nconst SheetBody = React.forwardRef<HTMLDivElement, SheetBodyProps>(\n ({ className, ...props }, ref) => (\n <div\n ref={ref}\n data-slot=\"sheet-body\"\n className={cn('flex-1 overflow-y-auto px-6 py-4', className)}\n {...props}\n />\n )\n);\n\nSheetBody.displayName = 'SheetBody';\n\nexport type SheetFooterProps = React.HTMLAttributes<HTMLDivElement>;\n\nconst SheetFooter = React.forwardRef<HTMLDivElement, SheetFooterProps>(\n ({ className, ...props }, ref) => (\n <div\n ref={ref}\n data-slot=\"sheet-footer\"\n className={cn(\n 'flex shrink-0 flex-col-reverse gap-2 sm:flex-row sm:justify-end',\n 'border-border border-t px-6 py-4',\n className\n )}\n {...props}\n />\n )\n);\n\nSheetFooter.displayName = 'SheetFooter';\n\nexport type SheetCloseProps = React.ButtonHTMLAttributes<HTMLButtonElement>;\n\nconst SheetClose = React.forwardRef<HTMLButtonElement, SheetCloseProps>(\n ({ className, children, onClick, ...props }, ref) => {\n const { onClose } = useSheetContext();\n return (\n <button\n ref={ref}\n type=\"button\"\n data-slot=\"sheet-close\"\n aria-label=\"Close\"\n onClick={(e) => {\n onClose();\n onClick?.(e);\n }}\n className={cn(\n 'text-muted-foreground hover:text-foreground rounded-md',\n 'focus-visible:ring-ring focus-visible:ring-2 focus-visible:outline-none',\n 'transition-colors',\n className\n )}\n {...props}\n >\n {children ?? (\n <svg\n width=\"20\"\n height=\"20\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n >\n <path d=\"M18 6 6 18M6 6l12 12\" />\n </svg>\n )}\n </button>\n );\n }\n);\n\nSheetClose.displayName = 'SheetClose';\n\nexport {\n Sheet,\n SheetHeader,\n SheetTitle,\n SheetDescription,\n SheetBody,\n SheetFooter,\n SheetClose,\n sheetContentVariants,\n sheetOverlayVariants,\n};\n"]}
@@ -1,8 +1,8 @@
1
1
  import { RequiredMark } from './chunk-3IMM2PM4.js';
2
- import { cn } from './chunk-TQONQSJO.js';
3
- import { useEscapeKey } from './chunk-T4ME7QCT.js';
4
2
  import { useClickOutside } from './chunk-62ZOA6PX.js';
5
3
  import { useAnchoredPosition } from './chunk-WSNMQQ4P.js';
4
+ import { useEscapeKey } from './chunk-T4ME7QCT.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 { cva } from 'class-variance-authority';
@@ -663,5 +663,5 @@ function CheckIcon({ className }) {
663
663
  }
664
664
 
665
665
  export { Select, selectTriggerVariants };
666
- //# sourceMappingURL=chunk-IGNWT6RP.js.map
667
- //# sourceMappingURL=chunk-IGNWT6RP.js.map
666
+ //# sourceMappingURL=chunk-S7WCHDBO.js.map
667
+ //# sourceMappingURL=chunk-S7WCHDBO.js.map