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

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 (498) hide show
  1. package/README.md +4 -4
  2. package/agent/mieweb-ui.instructions.md +90 -1
  3. package/dist/CsvBlock-FX5YNGNE.cjs +17 -0
  4. package/dist/{CsvBlock-ROJCKJDP.cjs.map → CsvBlock-FX5YNGNE.cjs.map} +1 -1
  5. package/dist/CsvBlock-VLMG7GUO.js +8 -0
  6. package/dist/{CsvBlock-UWPMTLE2.js.map → CsvBlock-VLMG7GUO.js.map} +1 -1
  7. package/dist/HtmlPreviewBlock-5JE7L3GR.js +8 -0
  8. package/dist/{HtmlPreviewBlock-ME5U3XNS.js.map → HtmlPreviewBlock-5JE7L3GR.js.map} +1 -1
  9. package/dist/HtmlPreviewBlock-UO37JQ3K.cjs +17 -0
  10. package/dist/{HtmlPreviewBlock-DWFN6EUB.cjs.map → HtmlPreviewBlock-UO37JQ3K.cjs.map} +1 -1
  11. package/dist/Input-yN516s5_.d.cts +3 -0
  12. package/dist/Input-yN516s5_.d.ts +3 -0
  13. package/dist/MermaidBlock-3XHFBAMV.js +8 -0
  14. package/dist/{MermaidBlock-2B6CPD6Y.js.map → MermaidBlock-3XHFBAMV.js.map} +1 -1
  15. package/dist/MermaidBlock-RZ75RPZA.cjs +17 -0
  16. package/dist/{MermaidBlock-D2UC5M55.cjs.map → MermaidBlock-RZ75RPZA.cjs.map} +1 -1
  17. package/dist/SurveyBlock-MUVJ3JUI.js +8 -0
  18. package/dist/{SurveyBlock-4DO62RBT.js.map → SurveyBlock-MUVJ3JUI.js.map} +1 -1
  19. package/dist/SurveyBlock-VH47YXZC.cjs +17 -0
  20. package/dist/{SurveyBlock-4CD4AYMJ.cjs.map → SurveyBlock-VH47YXZC.cjs.map} +1 -1
  21. package/dist/ag-grid.d.cts +142 -1
  22. package/dist/ag-grid.d.ts +142 -1
  23. package/dist/brands/bluehive.cjs +3 -3
  24. package/dist/brands/bluehive.css +3 -0
  25. package/dist/brands/bluehive.js +1 -1
  26. package/dist/brands/index.cjs +14 -14
  27. package/dist/brands/index.js +4 -4
  28. package/dist/{chunk-JYZW2PZS.cjs → chunk-254QK722.cjs} +7 -7
  29. package/dist/chunk-254QK722.cjs.map +1 -0
  30. package/dist/{chunk-VKELAMAZ.js → chunk-2JICT4A2.js} +27 -11
  31. package/dist/chunk-2JICT4A2.js.map +1 -0
  32. package/dist/{chunk-VPWJCJCX.cjs → chunk-35Y4ILCU.cjs} +7 -7
  33. package/dist/{chunk-VPWJCJCX.cjs.map → chunk-35Y4ILCU.cjs.map} +1 -1
  34. package/dist/{chunk-G3JX3UAU.cjs → chunk-3KPDQG5O.cjs} +5 -5
  35. package/dist/{chunk-G3JX3UAU.cjs.map → chunk-3KPDQG5O.cjs.map} +1 -1
  36. package/dist/{chunk-Y5HFM7LO.js → chunk-3RXZWHCU.js} +4 -4
  37. package/dist/{chunk-Y5HFM7LO.js.map → chunk-3RXZWHCU.js.map} +1 -1
  38. package/dist/chunk-3YBS4WUQ.js +52 -0
  39. package/dist/chunk-3YBS4WUQ.js.map +1 -0
  40. package/dist/{chunk-WNJRS7Y7.cjs → chunk-3ZWCIPFT.cjs} +4 -2
  41. package/dist/chunk-3ZWCIPFT.cjs.map +1 -0
  42. package/dist/chunk-4HC2IBOX.js +258 -0
  43. package/dist/chunk-4HC2IBOX.js.map +1 -0
  44. package/dist/chunk-4IS3QCOQ.cjs +453 -0
  45. package/dist/chunk-4IS3QCOQ.cjs.map +1 -0
  46. package/dist/chunk-4NCDU5IG.cjs +56 -0
  47. package/dist/chunk-4NCDU5IG.cjs.map +1 -0
  48. package/dist/{chunk-E4IBHYJ7.cjs → chunk-6N6LIAUJ.cjs} +9 -9
  49. package/dist/{chunk-E4IBHYJ7.cjs.map → chunk-6N6LIAUJ.cjs.map} +1 -1
  50. package/dist/{chunk-3M7TAXNR.js → chunk-6ZPTZTKN.js} +3 -3
  51. package/dist/{chunk-3M7TAXNR.js.map → chunk-6ZPTZTKN.js.map} +1 -1
  52. package/dist/{chunk-MWVW4APN.cjs → chunk-7UTBDFFL.cjs} +4 -4
  53. package/dist/{chunk-MWVW4APN.cjs.map → chunk-7UTBDFFL.cjs.map} +1 -1
  54. package/dist/{chunk-FJ7YPVKV.js → chunk-7X6R3JIA.js} +3 -3
  55. package/dist/{chunk-FJ7YPVKV.js.map → chunk-7X6R3JIA.js.map} +1 -1
  56. package/dist/{chunk-GOALNQZ2.js → chunk-7YO7DNUV.js} +4 -83
  57. package/dist/chunk-7YO7DNUV.js.map +1 -0
  58. package/dist/{chunk-P2CA3XGI.js → chunk-7ZV67VZE.js} +4 -4
  59. package/dist/{chunk-P2CA3XGI.js.map → chunk-7ZV67VZE.js.map} +1 -1
  60. package/dist/chunk-ADW7ZYCY.cjs +2707 -0
  61. package/dist/chunk-ADW7ZYCY.cjs.map +1 -0
  62. package/dist/{chunk-2G75X6TS.cjs → chunk-AHHFFXJR.cjs} +3 -3
  63. package/dist/{chunk-2G75X6TS.cjs.map → chunk-AHHFFXJR.cjs.map} +1 -1
  64. package/dist/{chunk-VILW53UZ.js → chunk-BIQ7GSO2.js} +3 -3
  65. package/dist/{chunk-VILW53UZ.js.map → chunk-BIQ7GSO2.js.map} +1 -1
  66. package/dist/chunk-BM35CACB.js +148 -0
  67. package/dist/chunk-BM35CACB.js.map +1 -0
  68. package/dist/chunk-BNH4SXJB.js +874 -0
  69. package/dist/chunk-BNH4SXJB.js.map +1 -0
  70. package/dist/{chunk-XEAT7XJG.cjs → chunk-BUT6MF5K.cjs} +29 -13
  71. package/dist/chunk-BUT6MF5K.cjs.map +1 -0
  72. package/dist/{chunk-UAMXCMST.cjs → chunk-CFI3TQMA.cjs} +3 -3
  73. package/dist/{chunk-UAMXCMST.cjs.map → chunk-CFI3TQMA.cjs.map} +1 -1
  74. package/dist/{chunk-J5CSLNCN.cjs → chunk-COM7RNZU.cjs} +2 -2
  75. package/dist/{chunk-J5CSLNCN.cjs.map → chunk-COM7RNZU.cjs.map} +1 -1
  76. package/dist/{chunk-XI34EGK5.cjs → chunk-CPPUT74P.cjs} +9 -9
  77. package/dist/{chunk-XI34EGK5.cjs.map → chunk-CPPUT74P.cjs.map} +1 -1
  78. package/dist/{chunk-ACCAXVOG.js → chunk-CRS2CQWM.js} +134 -56
  79. package/dist/chunk-CRS2CQWM.js.map +1 -0
  80. package/dist/{chunk-OE5CKRUC.js → chunk-D22GE27K.js} +4 -4
  81. package/dist/{chunk-OE5CKRUC.js.map → chunk-D22GE27K.js.map} +1 -1
  82. package/dist/chunk-DXEPYK3I.cjs +92 -0
  83. package/dist/chunk-DXEPYK3I.cjs.map +1 -0
  84. package/dist/{chunk-ZGRCSNPK.js → chunk-E2PBPQGS.js} +4 -4
  85. package/dist/{chunk-ZGRCSNPK.js.map → chunk-E2PBPQGS.js.map} +1 -1
  86. package/dist/{chunk-5JJ2DAE4.js → chunk-ENMXHZNE.js} +3 -3
  87. package/dist/{chunk-5JJ2DAE4.js.map → chunk-ENMXHZNE.js.map} +1 -1
  88. package/dist/{chunk-XCP454Q6.js → chunk-F4N67NAF.js} +12 -3
  89. package/dist/chunk-F4N67NAF.js.map +1 -0
  90. package/dist/chunk-FBCDYTWM.js +385 -0
  91. package/dist/chunk-FBCDYTWM.js.map +1 -0
  92. package/dist/{chunk-VU6UTJRM.js → chunk-FIKO4WR6.js} +3 -3
  93. package/dist/{chunk-VU6UTJRM.js.map → chunk-FIKO4WR6.js.map} +1 -1
  94. package/dist/{chunk-DEDN5HAG.js → chunk-FZURBQJ2.js} +3 -3
  95. package/dist/{chunk-DEDN5HAG.js.map → chunk-FZURBQJ2.js.map} +1 -1
  96. package/dist/{chunk-JHULS3EC.js → chunk-GBUVIGD5.js} +89 -3
  97. package/dist/chunk-GBUVIGD5.js.map +1 -0
  98. package/dist/chunk-GU5OS7JJ.cjs +281 -0
  99. package/dist/chunk-GU5OS7JJ.cjs.map +1 -0
  100. package/dist/{chunk-V7D3YGUV.js → chunk-GVLNXPJX.js} +4 -4
  101. package/dist/{chunk-V7D3YGUV.js.map → chunk-GVLNXPJX.js.map} +1 -1
  102. package/dist/chunk-GVM6DTR5.js +90 -0
  103. package/dist/chunk-GVM6DTR5.js.map +1 -0
  104. package/dist/{chunk-SQHMGT4W.js → chunk-GW4RFJZ5.js} +7 -7
  105. package/dist/chunk-GW4RFJZ5.js.map +1 -0
  106. package/dist/{chunk-3QEVGSFG.cjs → chunk-GYXUS65N.cjs} +5 -5
  107. package/dist/{chunk-3QEVGSFG.cjs.map → chunk-GYXUS65N.cjs.map} +1 -1
  108. package/dist/{chunk-WGPLUCBD.js → chunk-H2IAMSHK.js} +3 -3
  109. package/dist/{chunk-WGPLUCBD.js.map → chunk-H2IAMSHK.js.map} +1 -1
  110. package/dist/{chunk-JID7AZTO.cjs → chunk-H3ROMJYI.cjs} +4 -4
  111. package/dist/{chunk-JID7AZTO.cjs.map → chunk-H3ROMJYI.cjs.map} +1 -1
  112. package/dist/{chunk-GD7EBGC4.cjs → chunk-HC3NAN55.cjs} +19 -19
  113. package/dist/{chunk-GD7EBGC4.cjs.map → chunk-HC3NAN55.cjs.map} +1 -1
  114. package/dist/{chunk-7ZXAQTV4.cjs → chunk-HIZWOAWY.cjs} +8 -8
  115. package/dist/{chunk-7ZXAQTV4.cjs.map → chunk-HIZWOAWY.cjs.map} +1 -1
  116. package/dist/{chunk-NV2CWBI2.cjs → chunk-IEY3ZJIT.cjs} +12 -3
  117. package/dist/chunk-IEY3ZJIT.cjs.map +1 -0
  118. package/dist/chunk-IT775BYG.js +179 -0
  119. package/dist/chunk-IT775BYG.js.map +1 -0
  120. package/dist/chunk-IYWG72DM.js +166 -0
  121. package/dist/chunk-IYWG72DM.js.map +1 -0
  122. package/dist/{chunk-2YCERQWC.js → chunk-JBIGSP2T.js} +6 -6
  123. package/dist/{chunk-2YCERQWC.js.map → chunk-JBIGSP2T.js.map} +1 -1
  124. package/dist/{chunk-IX6KFB3K.cjs → chunk-JELTRRR5.cjs} +9 -9
  125. package/dist/{chunk-IX6KFB3K.cjs.map → chunk-JELTRRR5.cjs.map} +1 -1
  126. package/dist/{chunk-YQDA366U.js → chunk-JHG3ELS2.js} +2 -2
  127. package/dist/{chunk-YQDA366U.js.map → chunk-JHG3ELS2.js.map} +1 -1
  128. package/dist/{chunk-WWJIW2IH.cjs → chunk-JSXIB6EJ.cjs} +4 -4
  129. package/dist/{chunk-WWJIW2IH.cjs.map → chunk-JSXIB6EJ.cjs.map} +1 -1
  130. package/dist/{chunk-WNM7IZJ7.js → chunk-K34DXMLZ.js} +7 -7
  131. package/dist/{chunk-WNM7IZJ7.js.map → chunk-K34DXMLZ.js.map} +1 -1
  132. package/dist/{chunk-FXO5ARBB.cjs → chunk-KDW6BD4O.cjs} +4 -4
  133. package/dist/{chunk-FXO5ARBB.cjs.map → chunk-KDW6BD4O.cjs.map} +1 -1
  134. package/dist/{chunk-Z5V7SAZ4.js → chunk-KFEN2SRZ.js} +3 -3
  135. package/dist/{chunk-Z5V7SAZ4.js.map → chunk-KFEN2SRZ.js.map} +1 -1
  136. package/dist/{chunk-2QKBTPUC.cjs → chunk-KGKBZN3T.cjs} +8 -8
  137. package/dist/{chunk-2QKBTPUC.cjs.map → chunk-KGKBZN3T.cjs.map} +1 -1
  138. package/dist/{chunk-UV2FVNWT.cjs → chunk-LFPJ3OUM.cjs} +5 -5
  139. package/dist/{chunk-UV2FVNWT.cjs.map → chunk-LFPJ3OUM.cjs.map} +1 -1
  140. package/dist/{chunk-WNAA6CLE.cjs → chunk-LHBWRMNC.cjs} +94 -2
  141. package/dist/chunk-LHBWRMNC.cjs.map +1 -0
  142. package/dist/{chunk-JI244Y7C.js → chunk-MLAWXPRY.js} +190 -5
  143. package/dist/chunk-MLAWXPRY.js.map +1 -0
  144. package/dist/chunk-N7C4OEP7.cjs +356 -0
  145. package/dist/chunk-N7C4OEP7.cjs.map +1 -0
  146. package/dist/{chunk-WNZAYBVB.cjs → chunk-NKV76R65.cjs} +48 -48
  147. package/dist/{chunk-WNZAYBVB.cjs.map → chunk-NKV76R65.cjs.map} +1 -1
  148. package/dist/{chunk-PYJDVWXM.js → chunk-NUB5HRKS.js} +3 -3
  149. package/dist/{chunk-PYJDVWXM.js.map → chunk-NUB5HRKS.js.map} +1 -1
  150. package/dist/{chunk-LL6IWKI3.js → chunk-OW3SQJ7P.js} +3 -3
  151. package/dist/{chunk-LL6IWKI3.js.map → chunk-OW3SQJ7P.js.map} +1 -1
  152. package/dist/{chunk-5GUOOLPR.cjs → chunk-P5CMZZRZ.cjs} +5 -5
  153. package/dist/{chunk-5GUOOLPR.cjs.map → chunk-P5CMZZRZ.cjs.map} +1 -1
  154. package/dist/{chunk-3T7QGLNB.js → chunk-PJEL5ZZV.js} +4 -2
  155. package/dist/chunk-PJEL5ZZV.js.map +1 -0
  156. package/dist/{chunk-H4ZXMQQW.js → chunk-QOVJ6Z6R.js} +3 -3
  157. package/dist/{chunk-H4ZXMQQW.js.map → chunk-QOVJ6Z6R.js.map} +1 -1
  158. package/dist/{chunk-U42F3HLE.cjs → chunk-QURJVPRH.cjs} +190 -5
  159. package/dist/chunk-QURJVPRH.cjs.map +1 -0
  160. package/dist/{chunk-X4XPNTCZ.cjs → chunk-R5Z7AOVU.cjs} +136 -58
  161. package/dist/chunk-R5Z7AOVU.cjs.map +1 -0
  162. package/dist/{chunk-TMMVIUUN.js → chunk-R6KPWIGO.js} +4 -4
  163. package/dist/{chunk-TMMVIUUN.js.map → chunk-R6KPWIGO.js.map} +1 -1
  164. package/dist/{chunk-22CYDCXA.js → chunk-RM2HPQIC.js} +105 -14
  165. package/dist/chunk-RM2HPQIC.js.map +1 -0
  166. package/dist/{chunk-ENKFJJZX.js → chunk-SD7ONW6S.js} +6 -6
  167. package/dist/{chunk-ENKFJJZX.js.map → chunk-SD7ONW6S.js.map} +1 -1
  168. package/dist/{chunk-RJ6NTJHC.js → chunk-SRMTRD7F.js} +3 -3
  169. package/dist/{chunk-RJ6NTJHC.js.map → chunk-SRMTRD7F.js.map} +1 -1
  170. package/dist/chunk-T4JYUICS.js +2657 -0
  171. package/dist/chunk-T4JYUICS.js.map +1 -0
  172. package/dist/{chunk-7ZDPD5ZX.cjs → chunk-T4L7Q5FA.cjs} +7 -7
  173. package/dist/{chunk-7ZDPD5ZX.cjs.map → chunk-T4L7Q5FA.cjs.map} +1 -1
  174. package/dist/{chunk-NJ6MY6V5.js → chunk-T5BBZQ66.js} +3 -3
  175. package/dist/{chunk-NJ6MY6V5.js.map → chunk-T5BBZQ66.js.map} +1 -1
  176. package/dist/{chunk-2IZLKPUW.js → chunk-THLIL6PY.js} +3 -3
  177. package/dist/{chunk-2IZLKPUW.js.map → chunk-THLIL6PY.js.map} +1 -1
  178. package/dist/{chunk-SGFYA22I.cjs → chunk-TJCX4OML.cjs} +8 -8
  179. package/dist/{chunk-SGFYA22I.cjs.map → chunk-TJCX4OML.cjs.map} +1 -1
  180. package/dist/{chunk-N6IY47YA.cjs → chunk-TTSSUOEV.cjs} +8 -8
  181. package/dist/{chunk-N6IY47YA.cjs.map → chunk-TTSSUOEV.cjs.map} +1 -1
  182. package/dist/{chunk-5MCBWTIF.cjs → chunk-TYE5K5WV.cjs} +4 -4
  183. package/dist/{chunk-5MCBWTIF.cjs.map → chunk-TYE5K5WV.cjs.map} +1 -1
  184. package/dist/{chunk-VOKVG3ER.js → chunk-UBSH27C2.js} +4 -4
  185. package/dist/{chunk-VOKVG3ER.js.map → chunk-UBSH27C2.js.map} +1 -1
  186. package/dist/{chunk-TAXD5ADA.cjs → chunk-UEDTZYGI.cjs} +3 -3
  187. package/dist/{chunk-TAXD5ADA.cjs.map → chunk-UEDTZYGI.cjs.map} +1 -1
  188. package/dist/{chunk-UQ3VVR6A.cjs → chunk-UPWIJC6I.cjs} +3 -3
  189. package/dist/{chunk-UQ3VVR6A.cjs.map → chunk-UPWIJC6I.cjs.map} +1 -1
  190. package/dist/{chunk-S7WCHDBO.js → chunk-VCI2Y7ST.js} +3 -3
  191. package/dist/{chunk-S7WCHDBO.js.map → chunk-VCI2Y7ST.js.map} +1 -1
  192. package/dist/chunk-VINZZQBD.cjs +323 -0
  193. package/dist/chunk-VINZZQBD.cjs.map +1 -0
  194. package/dist/{chunk-OD47TTAW.cjs → chunk-VOQJHSXN.cjs} +9 -9
  195. package/dist/{chunk-OD47TTAW.cjs.map → chunk-VOQJHSXN.cjs.map} +1 -1
  196. package/dist/chunk-VPTASZ2O.cjs +171 -0
  197. package/dist/chunk-VPTASZ2O.cjs.map +1 -0
  198. package/dist/chunk-WXFGHDTV.cjs +896 -0
  199. package/dist/chunk-WXFGHDTV.cjs.map +1 -0
  200. package/dist/{chunk-VNYW4C4J.cjs → chunk-X6A27RGO.cjs} +4 -84
  201. package/dist/chunk-X6A27RGO.cjs.map +1 -0
  202. package/dist/chunk-XBTKZCZF.js +333 -0
  203. package/dist/chunk-XBTKZCZF.js.map +1 -0
  204. package/dist/chunk-XDIMTPZU.cjs +202 -0
  205. package/dist/chunk-XDIMTPZU.cjs.map +1 -0
  206. package/dist/chunk-XDU65GLW.js +21 -0
  207. package/dist/chunk-XDU65GLW.js.map +1 -0
  208. package/dist/chunk-XI74P5F2.cjs +424 -0
  209. package/dist/chunk-XI74P5F2.cjs.map +1 -0
  210. package/dist/{chunk-WIAQQNFU.cjs → chunk-XRVMYT5G.cjs} +106 -13
  211. package/dist/chunk-XRVMYT5G.cjs.map +1 -0
  212. package/dist/chunk-XVW5DPPP.js +429 -0
  213. package/dist/chunk-XVW5DPPP.js.map +1 -0
  214. package/dist/chunk-Y4E2WRUR.cjs +188 -0
  215. package/dist/chunk-Y4E2WRUR.cjs.map +1 -0
  216. package/dist/chunk-Y4QNLW7W.js +300 -0
  217. package/dist/chunk-Y4QNLW7W.js.map +1 -0
  218. package/dist/{chunk-6EN3IQQI.cjs → chunk-YRHBSSQ3.cjs} +6 -6
  219. package/dist/{chunk-6EN3IQQI.cjs.map → chunk-YRHBSSQ3.cjs.map} +1 -1
  220. package/dist/{chunk-KZFBQ7GY.js → chunk-YU55JD35.js} +3 -3
  221. package/dist/{chunk-KZFBQ7GY.js.map → chunk-YU55JD35.js.map} +1 -1
  222. package/dist/chunk-YW2AKBLS.cjs +23 -0
  223. package/dist/chunk-YW2AKBLS.cjs.map +1 -0
  224. package/dist/{chunk-ELPW32ZI.cjs → chunk-ZTMYKAVU.cjs} +45 -45
  225. package/dist/{chunk-ELPW32ZI.cjs.map → chunk-ZTMYKAVU.cjs.map} +1 -1
  226. package/dist/{chunk-3QGS6CXD.js → chunk-ZYL4SNOR.js} +3 -3
  227. package/dist/{chunk-3QGS6CXD.js.map → chunk-ZYL4SNOR.js.map} +1 -1
  228. package/dist/components/Alert/index.d.cts +1 -1
  229. package/dist/components/Alert/index.d.ts +1 -1
  230. package/dist/components/AlertDialog/index.cjs +6 -5
  231. package/dist/components/AlertDialog/index.d.cts +28 -3
  232. package/dist/components/AlertDialog/index.d.ts +28 -3
  233. package/dist/components/AlertDialog/index.js +5 -4
  234. package/dist/components/AudioRecorder/index.d.cts +2 -2
  235. package/dist/components/AudioRecorder/index.d.ts +2 -2
  236. package/dist/components/Autocomplete/index.d.cts +8 -2
  237. package/dist/components/Autocomplete/index.d.ts +8 -2
  238. package/dist/components/Avatar/index.d.cts +1 -1
  239. package/dist/components/Avatar/index.d.ts +1 -1
  240. package/dist/components/Badge/index.d.cts +1 -1
  241. package/dist/components/Badge/index.d.ts +1 -1
  242. package/dist/components/BoardView/index.cjs +24 -0
  243. package/dist/components/BoardView/index.cjs.map +1 -0
  244. package/dist/components/BoardView/index.d.cts +41 -0
  245. package/dist/components/BoardView/index.d.ts +41 -0
  246. package/dist/components/BoardView/index.js +7 -0
  247. package/dist/components/BoardView/index.js.map +1 -0
  248. package/dist/components/Button/index.cjs +4 -3
  249. package/dist/components/Button/index.d.cts +2 -1
  250. package/dist/components/Button/index.d.ts +2 -1
  251. package/dist/components/Button/index.js +2 -1
  252. package/dist/components/CalendarView/index.cjs +23 -0
  253. package/dist/components/CalendarView/index.cjs.map +1 -0
  254. package/dist/components/CalendarView/index.d.cts +39 -0
  255. package/dist/components/CalendarView/index.d.ts +39 -0
  256. package/dist/components/CalendarView/index.js +10 -0
  257. package/dist/components/CalendarView/index.js.map +1 -0
  258. package/dist/components/Card/index.d.cts +3 -3
  259. package/dist/components/Card/index.d.ts +3 -3
  260. package/dist/components/Collapsible/index.cjs +6 -6
  261. package/dist/components/Collapsible/index.js +3 -3
  262. package/dist/components/CountryCodeDropdown/index.cjs +5 -5
  263. package/dist/components/CountryCodeDropdown/index.js +2 -2
  264. package/dist/components/CustomizableDashboard/index.cjs +10 -9
  265. package/dist/components/CustomizableDashboard/index.js +3 -2
  266. package/dist/components/Dropdown/index.cjs +10 -10
  267. package/dist/components/Dropdown/index.d.cts +2 -1
  268. package/dist/components/Dropdown/index.d.ts +2 -1
  269. package/dist/components/Dropdown/index.js +3 -3
  270. package/dist/components/FloatingWindow/index.cjs +5 -4
  271. package/dist/components/FloatingWindow/index.js +3 -2
  272. package/dist/components/GanttView/index.cjs +20 -0
  273. package/dist/components/GanttView/index.cjs.map +1 -0
  274. package/dist/components/GanttView/index.d.cts +36 -0
  275. package/dist/components/GanttView/index.d.ts +36 -0
  276. package/dist/components/GanttView/index.js +7 -0
  277. package/dist/components/GanttView/index.js.map +1 -0
  278. package/dist/components/GlossaryTooltip/index.cjs +3 -3
  279. package/dist/components/GlossaryTooltip/index.js +2 -2
  280. package/dist/components/KeyboardShortcutsOverlay/index.cjs +5 -5
  281. package/dist/components/KeyboardShortcutsOverlay/index.js +3 -3
  282. package/dist/components/ListView/index.cjs +23 -0
  283. package/dist/components/ListView/index.cjs.map +1 -0
  284. package/dist/components/ListView/index.d.cts +124 -0
  285. package/dist/components/ListView/index.d.ts +124 -0
  286. package/dist/components/ListView/index.js +10 -0
  287. package/dist/components/ListView/index.js.map +1 -0
  288. package/dist/components/Markdown/index.cjs +20 -19
  289. package/dist/components/Markdown/index.js +8 -7
  290. package/dist/components/MediaEditor/index.cjs +15 -14
  291. package/dist/components/MediaEditor/index.d.cts +91 -2
  292. package/dist/components/MediaEditor/index.d.ts +91 -2
  293. package/dist/components/MediaEditor/index.js +10 -9
  294. package/dist/components/MediaFeed/index.cjs +26 -0
  295. package/dist/components/MediaFeed/index.cjs.map +1 -0
  296. package/dist/components/MediaFeed/index.d.cts +104 -0
  297. package/dist/components/MediaFeed/index.d.ts +104 -0
  298. package/dist/components/MediaFeed/index.js +17 -0
  299. package/dist/components/MediaFeed/index.js.map +1 -0
  300. package/dist/components/MediaPlayer/index.cjs +7 -6
  301. package/dist/components/MediaPlayer/index.d.cts +19 -1
  302. package/dist/components/MediaPlayer/index.d.ts +19 -1
  303. package/dist/components/MediaPlayer/index.js +4 -3
  304. package/dist/components/MegaMenu/index.cjs +6 -5
  305. package/dist/components/MegaMenu/index.js +3 -2
  306. package/dist/components/Modal/index.cjs +10 -10
  307. package/dist/components/Modal/index.js +2 -2
  308. package/dist/components/Pagination/index.d.cts +1 -1
  309. package/dist/components/Pagination/index.d.ts +1 -1
  310. package/dist/components/PhoneInput/index.d.cts +36 -3
  311. package/dist/components/PhoneInput/index.d.ts +36 -3
  312. package/dist/components/Progress/index.d.cts +1 -1
  313. package/dist/components/Progress/index.d.ts +1 -1
  314. package/dist/components/Q/index.d.cts +2 -2
  315. package/dist/components/Q/index.d.ts +2 -2
  316. package/dist/components/QuickAction/index.d.cts +1 -1
  317. package/dist/components/QuickAction/index.d.ts +1 -1
  318. package/dist/components/RadialExplorer/index.cjs +5 -4
  319. package/dist/components/RadialExplorer/index.js +4 -3
  320. package/dist/components/RecordButton/index.d.cts +1 -1
  321. package/dist/components/RecordButton/index.d.ts +1 -1
  322. package/dist/components/RichTextEditor/index.cjs +9 -8
  323. package/dist/components/RichTextEditor/index.d.cts +7 -2
  324. package/dist/components/RichTextEditor/index.d.ts +7 -2
  325. package/dist/components/RichTextEditor/index.js +6 -5
  326. package/dist/components/ScrollArea/index.d.cts +1 -1
  327. package/dist/components/ScrollArea/index.d.ts +1 -1
  328. package/dist/components/SectionSpyNav/index.cjs +4 -3
  329. package/dist/components/SectionSpyNav/index.js +3 -2
  330. package/dist/components/Select/index.cjs +4 -4
  331. package/dist/components/Select/index.d.cts +1 -2
  332. package/dist/components/Select/index.d.ts +1 -2
  333. package/dist/components/Select/index.js +2 -2
  334. package/dist/components/Skeleton/index.d.cts +1 -1
  335. package/dist/components/Skeleton/index.d.ts +1 -1
  336. package/dist/components/Slider/index.d.cts +2 -2
  337. package/dist/components/Slider/index.d.ts +2 -2
  338. package/dist/components/SliderCalculator/index.cjs +4 -4
  339. package/dist/components/SliderCalculator/index.js +2 -2
  340. package/dist/components/SourceTip/index.cjs +3 -3
  341. package/dist/components/SourceTip/index.js +2 -2
  342. package/dist/components/Spinner/index.d.cts +2 -2
  343. package/dist/components/Spinner/index.d.ts +2 -2
  344. package/dist/components/SuperChat/index.cjs +1406 -823
  345. package/dist/components/SuperChat/index.cjs.map +1 -1
  346. package/dist/components/SuperChat/index.d.cts +126 -8
  347. package/dist/components/SuperChat/index.d.ts +126 -8
  348. package/dist/components/SuperChat/index.js +1398 -815
  349. package/dist/components/SuperChat/index.js.map +1 -1
  350. package/dist/components/SuperChat/plugins/index.cjs +6 -6
  351. package/dist/components/SuperChat/plugins/index.d.cts +2 -3
  352. package/dist/components/SuperChat/plugins/index.d.ts +2 -3
  353. package/dist/components/SuperChat/plugins/index.js +5 -5
  354. package/dist/components/Text/index.d.cts +3 -3
  355. package/dist/components/Text/index.d.ts +3 -3
  356. package/dist/components/Textarea/index.d.cts +1 -2
  357. package/dist/components/Textarea/index.d.ts +1 -2
  358. package/dist/components/ThemeProvider/index.cjs +9 -9
  359. package/dist/components/ThemeProvider/index.d.cts +3 -1
  360. package/dist/components/ThemeProvider/index.d.ts +3 -1
  361. package/dist/components/ThemeProvider/index.js +3 -3
  362. package/dist/components/Tooltip/index.cjs +3 -3
  363. package/dist/components/Tooltip/index.js +2 -2
  364. package/dist/components/TranscriptView/index.d.cts +85 -4
  365. package/dist/components/TranscriptView/index.d.ts +85 -4
  366. package/dist/components/ViewSet/index.cjs +24 -0
  367. package/dist/components/ViewSet/index.cjs.map +1 -0
  368. package/dist/components/ViewSet/index.d.cts +200 -0
  369. package/dist/components/ViewSet/index.d.ts +200 -0
  370. package/dist/components/ViewSet/index.js +15 -0
  371. package/dist/components/ViewSet/index.js.map +1 -0
  372. package/dist/components/ViewSwitcher/index.cjs +20 -0
  373. package/dist/components/ViewSwitcher/index.cjs.map +1 -0
  374. package/dist/components/ViewSwitcher/index.d.cts +4 -0
  375. package/dist/components/ViewSwitcher/index.d.ts +4 -0
  376. package/dist/components/ViewSwitcher/index.js +7 -0
  377. package/dist/components/ViewSwitcher/index.js.map +1 -0
  378. package/dist/datavis.cjs +3 -2
  379. package/dist/datavis.cjs.map +1 -1
  380. package/dist/datavis.d.cts +167 -13
  381. package/dist/datavis.d.ts +167 -13
  382. package/dist/datavis.js +2 -1
  383. package/dist/datavis.js.map +1 -1
  384. package/dist/deck.cjs +3360 -0
  385. package/dist/deck.cjs.map +1 -0
  386. package/dist/deck.d.cts +712 -0
  387. package/dist/deck.d.ts +712 -0
  388. package/dist/deck.js +3316 -0
  389. package/dist/deck.js.map +1 -0
  390. package/dist/esheet.cjs +14 -13
  391. package/dist/esheet.cjs.map +1 -1
  392. package/dist/esheet.d.cts +183 -1
  393. package/dist/esheet.d.ts +183 -1
  394. package/dist/esheet.js +11 -10
  395. package/dist/esheet.js.map +1 -1
  396. package/dist/globe.cjs +2 -2
  397. package/dist/globe.js +1 -1
  398. package/dist/hooks/index.cjs +60 -27
  399. package/dist/hooks/index.d.cts +590 -31
  400. package/dist/hooks/index.d.ts +590 -31
  401. package/dist/hooks/index.js +6 -5
  402. package/dist/icons-wBacj6BW.d.cts +142 -0
  403. package/dist/icons-wBacj6BW.d.ts +142 -0
  404. package/dist/index-DoYYWsNc.d.cts +127 -0
  405. package/dist/index-DoYYWsNc.d.ts +127 -0
  406. package/dist/index.cjs +1420 -1048
  407. package/dist/index.cjs.map +1 -1
  408. package/dist/index.d.cts +8796 -482
  409. package/dist/index.d.ts +8796 -482
  410. package/dist/index.js +368 -232
  411. package/dist/index.js.map +1 -1
  412. package/dist/kerebron.cjs +58 -19
  413. package/dist/kerebron.cjs.map +1 -1
  414. package/dist/kerebron.css +115 -0
  415. package/dist/kerebron.d.cts +37 -0
  416. package/dist/kerebron.d.ts +37 -0
  417. package/dist/kerebron.js +58 -19
  418. package/dist/kerebron.js.map +1 -1
  419. package/dist/maps.cjs +160 -0
  420. package/dist/maps.cjs.map +1 -0
  421. package/dist/maps.d.cts +42 -0
  422. package/dist/maps.d.ts +42 -0
  423. package/dist/maps.js +138 -0
  424. package/dist/maps.js.map +1 -0
  425. package/dist/motion.cjs +7 -7
  426. package/dist/motion.d.cts +186 -2
  427. package/dist/motion.d.ts +186 -2
  428. package/dist/motion.js +2 -2
  429. package/dist/q.d.cts +25 -3
  430. package/dist/q.d.ts +25 -3
  431. package/dist/styles/effects.css +133 -0
  432. package/dist/styles/init.css +3 -0
  433. package/dist/styles.css +1 -1
  434. package/dist/tailwind-preset.cjs +4 -4
  435. package/dist/tailwind-preset.js +1 -1
  436. package/dist/templates.cjs +156 -0
  437. package/dist/templates.cjs.map +1 -0
  438. package/dist/templates.d.cts +734 -0
  439. package/dist/templates.d.ts +734 -0
  440. package/dist/templates.js +11 -0
  441. package/dist/templates.js.map +1 -0
  442. package/dist/types-Cx1FHLq2.d.cts +548 -0
  443. package/dist/types-Cx1FHLq2.d.ts +548 -0
  444. package/dist/types-DsdZvEI1.d.cts +92 -0
  445. package/dist/types-DsdZvEI1.d.ts +92 -0
  446. package/dist/utils/index.d.cts +13 -2
  447. package/dist/utils/index.d.ts +13 -2
  448. package/package.json +62 -13
  449. package/dist/Animated-XmH6k8pZ.d.cts +0 -188
  450. package/dist/Animated-XmH6k8pZ.d.ts +0 -188
  451. package/dist/CsvBlock-ROJCKJDP.cjs +0 -16
  452. package/dist/CsvBlock-UWPMTLE2.js +0 -7
  453. package/dist/HtmlPreviewBlock-DWFN6EUB.cjs +0 -16
  454. package/dist/HtmlPreviewBlock-ME5U3XNS.js +0 -7
  455. package/dist/MedicationEditor-Bp4NLy7y.d.cts +0 -352
  456. package/dist/MedicationEditor-Bp4NLy7y.d.ts +0 -352
  457. package/dist/MermaidBlock-2B6CPD6Y.js +0 -7
  458. package/dist/MermaidBlock-D2UC5M55.cjs +0 -16
  459. package/dist/SurveyBlock-4CD4AYMJ.cjs +0 -16
  460. package/dist/SurveyBlock-4DO62RBT.js +0 -7
  461. package/dist/chunk-22CYDCXA.js.map +0 -1
  462. package/dist/chunk-3T7QGLNB.js.map +0 -1
  463. package/dist/chunk-6HFFWEM3.cjs +0 -22
  464. package/dist/chunk-6HFFWEM3.cjs.map +0 -1
  465. package/dist/chunk-ACCAXVOG.js.map +0 -1
  466. package/dist/chunk-GOALNQZ2.js.map +0 -1
  467. package/dist/chunk-HB7C7NB5.js +0 -20
  468. package/dist/chunk-HB7C7NB5.js.map +0 -1
  469. package/dist/chunk-JHULS3EC.js.map +0 -1
  470. package/dist/chunk-JI244Y7C.js.map +0 -1
  471. package/dist/chunk-JYZW2PZS.cjs.map +0 -1
  472. package/dist/chunk-NV2CWBI2.cjs.map +0 -1
  473. package/dist/chunk-SQHMGT4W.js.map +0 -1
  474. package/dist/chunk-U42F3HLE.cjs.map +0 -1
  475. package/dist/chunk-VKELAMAZ.js.map +0 -1
  476. package/dist/chunk-VNYW4C4J.cjs.map +0 -1
  477. package/dist/chunk-WIAQQNFU.cjs.map +0 -1
  478. package/dist/chunk-WNAA6CLE.cjs.map +0 -1
  479. package/dist/chunk-WNJRS7Y7.cjs.map +0 -1
  480. package/dist/chunk-X4XPNTCZ.cjs.map +0 -1
  481. package/dist/chunk-XCP454Q6.js.map +0 -1
  482. package/dist/chunk-XEAT7XJG.cjs.map +0 -1
  483. package/dist/html-MdxqSzjD.d.cts +0 -13
  484. package/dist/html-MdxqSzjD.d.ts +0 -13
  485. package/dist/orderRows-BUJYgSc7.d.cts +0 -221
  486. package/dist/orderRows-BUJYgSc7.d.ts +0 -221
  487. package/dist/transcript-Cg7uSW-C.d.cts +0 -84
  488. package/dist/transcript-Cg7uSW-C.d.ts +0 -84
  489. package/dist/types-B97JNRNQ.d.cts +0 -251
  490. package/dist/types-CnPEwzlp.d.cts +0 -254
  491. package/dist/types-CnPEwzlp.d.ts +0 -254
  492. package/dist/types-gZXrfLj6.d.ts +0 -251
  493. package/dist/useAnchoredPosition-CKwLSQW8.d.cts +0 -76
  494. package/dist/useAnchoredPosition-CKwLSQW8.d.ts +0 -76
  495. package/dist/useTheme-B9SWu6ui.d.cts +0 -24
  496. package/dist/useTheme-B9SWu6ui.d.ts +0 -24
  497. package/dist/useTranscriptEdits-CGzlemHT.d.cts +0 -182
  498. package/dist/useTranscriptEdits-D32bLs0l.d.ts +0 -182
@@ -1,7 +1,7 @@
1
1
  'use strict';
2
2
 
3
3
  var chunkMYAU2ZUC_cjs = require('./chunk-MYAU2ZUC.cjs');
4
- var chunk6HFFWEM3_cjs = require('./chunk-6HFFWEM3.cjs');
4
+ var chunkYW2AKBLS_cjs = require('./chunk-YW2AKBLS.cjs');
5
5
  var chunkS5RVSXDV_cjs = require('./chunk-S5RVSXDV.cjs');
6
6
  var React = require('react');
7
7
  var lucideReact = require('lucide-react');
@@ -57,7 +57,7 @@ function AnimatedNumber({
57
57
  duration = 480,
58
58
  className
59
59
  }) {
60
- const reduced = chunk6HFFWEM3_cjs.usePrefersReducedMotion();
60
+ const reduced = chunkYW2AKBLS_cjs.usePrefersReducedMotion();
61
61
  const [shown, setShown] = React__namespace.useState(value);
62
62
  const shownRef = React__namespace.useRef(value);
63
63
  React__namespace.useEffect(() => {
@@ -256,5 +256,5 @@ function SliderCalculator({
256
256
 
257
257
  exports.AnimatedNumber = AnimatedNumber;
258
258
  exports.SliderCalculator = SliderCalculator;
259
- //# sourceMappingURL=chunk-MWVW4APN.cjs.map
260
- //# sourceMappingURL=chunk-MWVW4APN.cjs.map
259
+ //# sourceMappingURL=chunk-7UTBDFFL.cjs.map
260
+ //# sourceMappingURL=chunk-7UTBDFFL.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/components/SliderCalculator/SliderCalculator.tsx"],"names":["usePrefersReducedMotion","React","jsx","cn","jsxs","Slider","ChevronUp","ChevronDown"],"mappings":"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","file":"chunk-MWVW4APN.cjs","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"]}
1
+ {"version":3,"sources":["../src/components/SliderCalculator/SliderCalculator.tsx"],"names":["usePrefersReducedMotion","React","jsx","cn","jsxs","Slider","ChevronUp","ChevronDown"],"mappings":"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","file":"chunk-7UTBDFFL.cjs","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"]}
@@ -1,4 +1,4 @@
1
- import { usePrefersReducedMotion } from './chunk-HB7C7NB5.js';
1
+ import { usePrefersReducedMotion } from './chunk-XDU65GLW.js';
2
2
  import { cn } from './chunk-TQONQSJO.js';
3
3
  import * as React from 'react';
4
4
  import { createPortal } from 'react-dom';
@@ -304,5 +304,5 @@ function Tooltip({
304
304
  Tooltip.displayName = "Tooltip";
305
305
 
306
306
  export { Tooltip };
307
- //# sourceMappingURL=chunk-FJ7YPVKV.js.map
308
- //# sourceMappingURL=chunk-FJ7YPVKV.js.map
307
+ //# sourceMappingURL=chunk-7X6R3JIA.js.map
308
+ //# sourceMappingURL=chunk-7X6R3JIA.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/components/Tooltip/Tooltip.tsx"],"names":[],"mappings":"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","file":"chunk-FJ7YPVKV.js","sourcesContent":["import * as React from 'react';\nimport { createPortal } from 'react-dom';\nimport { cn } from '../../utils/cn';\nimport { usePrefersReducedMotion } from '../../hooks/usePrefersReducedMotion';\n\nexport type TooltipPlacement = 'top' | 'bottom' | 'left' | 'right';\n\nexport interface TooltipProps {\n /** The content to display in the tooltip */\n content: React.ReactNode;\n /** The element that triggers the tooltip */\n children: React.ReactElement<{\n onFocus?: () => void;\n onBlur?: () => void;\n 'aria-describedby'?: string;\n }>;\n /** Preferred placement of the tooltip relative to the trigger. Will flip if not enough space. */\n placement?: TooltipPlacement;\n /** Delay in ms before showing the tooltip */\n delay?: number;\n /** Whether the tooltip is disabled */\n disabled?: boolean;\n /** Controlled open state */\n open?: boolean;\n /** Callback when open state changes */\n onOpenChange?: (open: boolean) => void;\n /** Additional class name for the tooltip content */\n className?: string;\n /** Maximum width of the tooltip in pixels. Set to 'none' for no limit. Default: 250 */\n maxWidth?: number | 'none';\n /** Offset from the trigger element in pixels. Default: 8 */\n offset?: number;\n}\n\nconst DEFAULT_OFFSET = 8;\nconst VIEWPORT_PADDING = 8;\n\n/**\n * An accessible tooltip component that displays on hover/focus.\n * Features smart positioning that automatically flips to avoid going off-screen.\n *\n * @example\n * ```tsx\n * <Tooltip content=\"This is a tooltip\">\n * <Button>Hover me</Button>\n * </Tooltip>\n * ```\n *\n * @example\n * ```tsx\n * // With multi-line content\n * <Tooltip content=\"This is a longer description that will wrap nicely\" maxWidth={200}>\n * <Button>Info</Button>\n * </Tooltip>\n * ```\n */\nfunction Tooltip({\n content,\n children,\n placement: preferredPlacement = 'top',\n delay = 200,\n disabled = false,\n open: controlledOpen,\n onOpenChange,\n className,\n maxWidth = 250,\n offset = DEFAULT_OFFSET,\n}: TooltipProps) {\n const [uncontrolledOpen, setUncontrolledOpen] = React.useState(false);\n const [position, setPosition] = React.useState<{\n top: number;\n left: number;\n actualPlacement: TooltipPlacement;\n arrowOffset: number;\n } | null>(null);\n const [isDarkMode, setIsDarkMode] = React.useState(false);\n\n const showTimeoutRef = React.useRef<ReturnType<typeof setTimeout> | null>(\n null\n );\n const hideTimeoutRef = React.useRef<ReturnType<typeof setTimeout> | null>(\n null\n );\n const isHoveringRef = React.useRef(false);\n const wrapperRef = React.useRef<HTMLDivElement>(null);\n const tooltipRef = React.useRef<HTMLDivElement>(null);\n const tooltipId = React.useId();\n const prefersReducedMotion = usePrefersReducedMotion();\n\n const isControlled = controlledOpen !== undefined;\n const isOpen = isControlled ? controlledOpen : uncontrolledOpen;\n\n const setOpen = React.useCallback(\n (value: boolean) => {\n if (!isControlled) {\n setUncontrolledOpen(value);\n }\n onOpenChange?.(value);\n },\n [isControlled, onOpenChange]\n );\n\n const clearTimeouts = React.useCallback(() => {\n if (showTimeoutRef.current) {\n clearTimeout(showTimeoutRef.current);\n showTimeoutRef.current = null;\n }\n if (hideTimeoutRef.current) {\n clearTimeout(hideTimeoutRef.current);\n hideTimeoutRef.current = null;\n }\n }, []);\n\n // Calculate optimal position for tooltip\n const calculatePosition = React.useCallback(() => {\n if (!wrapperRef.current || !tooltipRef.current) return;\n\n const triggerRect = wrapperRef.current.getBoundingClientRect();\n const tooltipRect = tooltipRef.current.getBoundingClientRect();\n const viewportWidth = window.innerWidth;\n const viewportHeight = window.innerHeight;\n\n // Helper to check if placement fits\n const fitsPlacement = (p: TooltipPlacement): boolean => {\n switch (p) {\n case 'top':\n return (\n triggerRect.top - tooltipRect.height - offset >= VIEWPORT_PADDING\n );\n case 'bottom':\n return (\n triggerRect.bottom + tooltipRect.height + offset <=\n viewportHeight - VIEWPORT_PADDING\n );\n case 'left':\n return (\n triggerRect.left - tooltipRect.width - offset >= VIEWPORT_PADDING\n );\n case 'right':\n return (\n triggerRect.right + tooltipRect.width + offset <=\n viewportWidth - VIEWPORT_PADDING\n );\n }\n };\n\n // Determine actual placement (flip if preferred doesn't fit)\n let actualPlacement = preferredPlacement;\n if (!fitsPlacement(preferredPlacement)) {\n const opposites: Record<TooltipPlacement, TooltipPlacement> = {\n top: 'bottom',\n bottom: 'top',\n left: 'right',\n right: 'left',\n };\n const opposite = opposites[preferredPlacement];\n if (fitsPlacement(opposite)) {\n actualPlacement = opposite;\n } else {\n // Try perpendicular placements\n const perpendicular: TooltipPlacement[] =\n preferredPlacement === 'top' || preferredPlacement === 'bottom'\n ? ['right', 'left']\n : ['bottom', 'top'];\n for (const p of perpendicular) {\n if (fitsPlacement(p)) {\n actualPlacement = p;\n break;\n }\n }\n }\n }\n\n // Calculate base position\n let top = 0;\n let left = 0;\n const triggerCenterX = triggerRect.left + triggerRect.width / 2;\n const triggerCenterY = triggerRect.top + triggerRect.height / 2;\n\n switch (actualPlacement) {\n case 'top':\n top = triggerRect.top - tooltipRect.height - offset;\n left = triggerCenterX - tooltipRect.width / 2;\n break;\n case 'bottom':\n top = triggerRect.bottom + offset;\n left = triggerCenterX - tooltipRect.width / 2;\n break;\n case 'left':\n top = triggerCenterY - tooltipRect.height / 2;\n left = triggerRect.left - tooltipRect.width - offset;\n break;\n case 'right':\n top = triggerCenterY - tooltipRect.height / 2;\n left = triggerRect.right + offset;\n break;\n }\n\n // Calculate arrow offset for when tooltip is constrained\n let arrowOffset = 0;\n const idealLeft = left;\n\n // Constrain to viewport (horizontal)\n if (left < VIEWPORT_PADDING) {\n left = VIEWPORT_PADDING;\n } else if (left + tooltipRect.width > viewportWidth - VIEWPORT_PADDING) {\n left = viewportWidth - tooltipRect.width - VIEWPORT_PADDING;\n }\n\n // Calculate arrow offset based on how much we shifted\n if (actualPlacement === 'top' || actualPlacement === 'bottom') {\n arrowOffset = idealLeft - left;\n }\n\n // Constrain to viewport (vertical)\n if (top < VIEWPORT_PADDING) {\n top = VIEWPORT_PADDING;\n } else if (top + tooltipRect.height > viewportHeight - VIEWPORT_PADDING) {\n top = viewportHeight - tooltipRect.height - VIEWPORT_PADDING;\n }\n\n setPosition({ top, left, actualPlacement, arrowOffset });\n }, [preferredPlacement, offset]);\n\n // Detect dark mode from document\n React.useEffect(() => {\n if (typeof document === 'undefined') return;\n\n const checkDarkMode = () => {\n setIsDarkMode(document.documentElement.classList.contains('dark'));\n };\n\n checkDarkMode();\n\n // Watch for class changes on document\n const observer = new window.MutationObserver(checkDarkMode);\n observer.observe(document.documentElement, {\n attributes: true,\n attributeFilter: ['class'],\n });\n\n return () => observer.disconnect();\n }, []);\n\n // Recalculate position when open or on scroll/resize\n React.useEffect(() => {\n if (!isOpen) {\n setPosition(null);\n return;\n }\n\n // Initial calculation after render\n const rafId = window.requestAnimationFrame(() => {\n calculatePosition();\n });\n\n // Recalculate on scroll/resize\n const handleUpdate = () => calculatePosition();\n window.addEventListener('scroll', handleUpdate, true);\n window.addEventListener('resize', handleUpdate);\n\n return () => {\n window.cancelAnimationFrame(rafId);\n window.removeEventListener('scroll', handleUpdate, true);\n window.removeEventListener('resize', handleUpdate);\n };\n }, [isOpen, calculatePosition]);\n\n const handleMouseEnter = React.useCallback(() => {\n if (disabled) return;\n isHoveringRef.current = true;\n clearTimeouts();\n showTimeoutRef.current = setTimeout(() => {\n if (isHoveringRef.current) {\n setOpen(true);\n }\n }, delay);\n }, [disabled, delay, setOpen, clearTimeouts]);\n\n const handleMouseLeave = React.useCallback(() => {\n isHoveringRef.current = false;\n clearTimeouts();\n hideTimeoutRef.current = setTimeout(() => {\n if (!isHoveringRef.current) {\n setOpen(false);\n }\n }, 100);\n }, [setOpen, clearTimeouts]);\n\n const handleFocus = React.useCallback(() => {\n if (disabled) return;\n clearTimeouts();\n setOpen(true);\n }, [disabled, setOpen, clearTimeouts]);\n\n const handleBlur = React.useCallback(() => {\n clearTimeouts();\n setOpen(false);\n }, [setOpen, clearTimeouts]);\n\n // Cleanup timeouts on unmount\n React.useEffect(() => {\n return () => {\n clearTimeouts();\n };\n }, [clearTimeouts]);\n\n // Clone the child to add aria attributes and focus handlers\n const trigger = React.cloneElement(children, {\n onFocus: handleFocus,\n onBlur: handleBlur,\n 'aria-describedby': isOpen ? tooltipId : undefined,\n });\n\n // Arrow styles based on actual placement - using inline styles for border triangle\n // Arrow color matches tooltip background (neutral-900 in light mode, neutral-100 in dark mode)\n const getArrowStyle = (isDark: boolean): React.CSSProperties => {\n if (!position) return {};\n const { actualPlacement, arrowOffset } = position;\n\n const baseStyle: React.CSSProperties = {\n position: 'absolute',\n width: 0,\n height: 0,\n borderStyle: 'solid',\n // Must use content-box for CSS border triangle to work (Tailwind sets border-box globally)\n boxSizing: 'content-box',\n };\n\n const arrowSize = 5;\n // Match tooltip background colors: bg-neutral-900 (#171717) / dark:bg-neutral-100 (#f5f5f5)\n const arrowColor = isDark ? '#f5f5f5' : '#171717';\n\n // Use arrowSize for positioning to create slight overlap with tooltip body\n const arrowOffset2 = arrowSize;\n\n switch (actualPlacement) {\n case 'top':\n return {\n ...baseStyle,\n bottom: -arrowOffset2,\n left: `calc(50% + ${arrowOffset}px)`,\n transform: 'translateX(-50%)',\n borderWidth: `${arrowSize}px ${arrowSize}px 0 ${arrowSize}px`,\n borderColor: `${arrowColor} transparent transparent transparent`,\n };\n case 'bottom':\n return {\n ...baseStyle,\n top: -arrowOffset2,\n left: `calc(50% + ${arrowOffset}px)`,\n transform: 'translateX(-50%)',\n borderWidth: `0 ${arrowSize}px ${arrowSize}px ${arrowSize}px`,\n borderColor: `transparent transparent ${arrowColor} transparent`,\n };\n case 'left':\n return {\n ...baseStyle,\n right: -arrowOffset2,\n top: '50%',\n transform: 'translateY(-50%)',\n borderWidth: `${arrowSize}px 0 ${arrowSize}px ${arrowSize}px`,\n borderColor: `transparent transparent transparent ${arrowColor}`,\n };\n case 'right':\n return {\n ...baseStyle,\n left: -arrowOffset2,\n top: '50%',\n transform: 'translateY(-50%)',\n borderWidth: `${arrowSize}px ${arrowSize}px ${arrowSize}px 0`,\n borderColor: `transparent ${arrowColor} transparent transparent`,\n };\n }\n };\n\n return (\n <div\n ref={wrapperRef}\n className=\"relative inline-flex\"\n onMouseEnter={handleMouseEnter}\n onMouseLeave={handleMouseLeave}\n >\n {trigger}\n {isOpen &&\n !disabled &&\n typeof document !== 'undefined' &&\n createPortal(\n <div\n ref={tooltipRef}\n id={tooltipId}\n role=\"tooltip\"\n data-slot=\"tooltip\"\n aria-hidden={!isOpen}\n style={{\n position: 'fixed',\n top: position?.top ?? -9999,\n left: position?.left ?? -9999,\n maxWidth: maxWidth === 'none' ? undefined : maxWidth,\n visibility: position ? 'visible' : 'hidden',\n // Use inline styles to ensure they work in portals (rendered outside React tree)\n backgroundColor: isDarkMode ? '#f5f5f5' : '#171717', // neutral-100 / neutral-900\n color: isDarkMode ? '#171717' : '#ffffff', // neutral-900 / white\n fontFamily:\n 'var(--mieweb-font-sans, ui-sans-serif, system-ui, sans-serif)',\n }}\n className={cn(\n 'pointer-events-none z-[9999] px-3 py-1.5 text-xs',\n 'rounded-md shadow-md',\n 'leading-normal font-semibold',\n !prefersReducedMotion && position && 'animate-fade-in',\n className\n )}\n >\n {content}\n {position && (\n <span style={getArrowStyle(isDarkMode)} aria-hidden=\"true\" />\n )}\n </div>,\n document.body\n )}\n </div>\n );\n}\n\nTooltip.displayName = 'Tooltip';\n\nexport { Tooltip };\n"]}
1
+ {"version":3,"sources":["../src/components/Tooltip/Tooltip.tsx"],"names":[],"mappings":"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","file":"chunk-7X6R3JIA.js","sourcesContent":["import * as React from 'react';\nimport { createPortal } from 'react-dom';\nimport { cn } from '../../utils/cn';\nimport { usePrefersReducedMotion } from '../../hooks/usePrefersReducedMotion';\n\nexport type TooltipPlacement = 'top' | 'bottom' | 'left' | 'right';\n\nexport interface TooltipProps {\n /** The content to display in the tooltip */\n content: React.ReactNode;\n /** The element that triggers the tooltip */\n children: React.ReactElement<{\n onFocus?: () => void;\n onBlur?: () => void;\n 'aria-describedby'?: string;\n }>;\n /** Preferred placement of the tooltip relative to the trigger. Will flip if not enough space. */\n placement?: TooltipPlacement;\n /** Delay in ms before showing the tooltip */\n delay?: number;\n /** Whether the tooltip is disabled */\n disabled?: boolean;\n /** Controlled open state */\n open?: boolean;\n /** Callback when open state changes */\n onOpenChange?: (open: boolean) => void;\n /** Additional class name for the tooltip content */\n className?: string;\n /** Maximum width of the tooltip in pixels. Set to 'none' for no limit. Default: 250 */\n maxWidth?: number | 'none';\n /** Offset from the trigger element in pixels. Default: 8 */\n offset?: number;\n}\n\nconst DEFAULT_OFFSET = 8;\nconst VIEWPORT_PADDING = 8;\n\n/**\n * An accessible tooltip component that displays on hover/focus.\n * Features smart positioning that automatically flips to avoid going off-screen.\n *\n * @example\n * ```tsx\n * <Tooltip content=\"This is a tooltip\">\n * <Button>Hover me</Button>\n * </Tooltip>\n * ```\n *\n * @example\n * ```tsx\n * // With multi-line content\n * <Tooltip content=\"This is a longer description that will wrap nicely\" maxWidth={200}>\n * <Button>Info</Button>\n * </Tooltip>\n * ```\n */\nfunction Tooltip({\n content,\n children,\n placement: preferredPlacement = 'top',\n delay = 200,\n disabled = false,\n open: controlledOpen,\n onOpenChange,\n className,\n maxWidth = 250,\n offset = DEFAULT_OFFSET,\n}: TooltipProps) {\n const [uncontrolledOpen, setUncontrolledOpen] = React.useState(false);\n const [position, setPosition] = React.useState<{\n top: number;\n left: number;\n actualPlacement: TooltipPlacement;\n arrowOffset: number;\n } | null>(null);\n const [isDarkMode, setIsDarkMode] = React.useState(false);\n\n const showTimeoutRef = React.useRef<ReturnType<typeof setTimeout> | null>(\n null\n );\n const hideTimeoutRef = React.useRef<ReturnType<typeof setTimeout> | null>(\n null\n );\n const isHoveringRef = React.useRef(false);\n const wrapperRef = React.useRef<HTMLDivElement>(null);\n const tooltipRef = React.useRef<HTMLDivElement>(null);\n const tooltipId = React.useId();\n const prefersReducedMotion = usePrefersReducedMotion();\n\n const isControlled = controlledOpen !== undefined;\n const isOpen = isControlled ? controlledOpen : uncontrolledOpen;\n\n const setOpen = React.useCallback(\n (value: boolean) => {\n if (!isControlled) {\n setUncontrolledOpen(value);\n }\n onOpenChange?.(value);\n },\n [isControlled, onOpenChange]\n );\n\n const clearTimeouts = React.useCallback(() => {\n if (showTimeoutRef.current) {\n clearTimeout(showTimeoutRef.current);\n showTimeoutRef.current = null;\n }\n if (hideTimeoutRef.current) {\n clearTimeout(hideTimeoutRef.current);\n hideTimeoutRef.current = null;\n }\n }, []);\n\n // Calculate optimal position for tooltip\n const calculatePosition = React.useCallback(() => {\n if (!wrapperRef.current || !tooltipRef.current) return;\n\n const triggerRect = wrapperRef.current.getBoundingClientRect();\n const tooltipRect = tooltipRef.current.getBoundingClientRect();\n const viewportWidth = window.innerWidth;\n const viewportHeight = window.innerHeight;\n\n // Helper to check if placement fits\n const fitsPlacement = (p: TooltipPlacement): boolean => {\n switch (p) {\n case 'top':\n return (\n triggerRect.top - tooltipRect.height - offset >= VIEWPORT_PADDING\n );\n case 'bottom':\n return (\n triggerRect.bottom + tooltipRect.height + offset <=\n viewportHeight - VIEWPORT_PADDING\n );\n case 'left':\n return (\n triggerRect.left - tooltipRect.width - offset >= VIEWPORT_PADDING\n );\n case 'right':\n return (\n triggerRect.right + tooltipRect.width + offset <=\n viewportWidth - VIEWPORT_PADDING\n );\n }\n };\n\n // Determine actual placement (flip if preferred doesn't fit)\n let actualPlacement = preferredPlacement;\n if (!fitsPlacement(preferredPlacement)) {\n const opposites: Record<TooltipPlacement, TooltipPlacement> = {\n top: 'bottom',\n bottom: 'top',\n left: 'right',\n right: 'left',\n };\n const opposite = opposites[preferredPlacement];\n if (fitsPlacement(opposite)) {\n actualPlacement = opposite;\n } else {\n // Try perpendicular placements\n const perpendicular: TooltipPlacement[] =\n preferredPlacement === 'top' || preferredPlacement === 'bottom'\n ? ['right', 'left']\n : ['bottom', 'top'];\n for (const p of perpendicular) {\n if (fitsPlacement(p)) {\n actualPlacement = p;\n break;\n }\n }\n }\n }\n\n // Calculate base position\n let top = 0;\n let left = 0;\n const triggerCenterX = triggerRect.left + triggerRect.width / 2;\n const triggerCenterY = triggerRect.top + triggerRect.height / 2;\n\n switch (actualPlacement) {\n case 'top':\n top = triggerRect.top - tooltipRect.height - offset;\n left = triggerCenterX - tooltipRect.width / 2;\n break;\n case 'bottom':\n top = triggerRect.bottom + offset;\n left = triggerCenterX - tooltipRect.width / 2;\n break;\n case 'left':\n top = triggerCenterY - tooltipRect.height / 2;\n left = triggerRect.left - tooltipRect.width - offset;\n break;\n case 'right':\n top = triggerCenterY - tooltipRect.height / 2;\n left = triggerRect.right + offset;\n break;\n }\n\n // Calculate arrow offset for when tooltip is constrained\n let arrowOffset = 0;\n const idealLeft = left;\n\n // Constrain to viewport (horizontal)\n if (left < VIEWPORT_PADDING) {\n left = VIEWPORT_PADDING;\n } else if (left + tooltipRect.width > viewportWidth - VIEWPORT_PADDING) {\n left = viewportWidth - tooltipRect.width - VIEWPORT_PADDING;\n }\n\n // Calculate arrow offset based on how much we shifted\n if (actualPlacement === 'top' || actualPlacement === 'bottom') {\n arrowOffset = idealLeft - left;\n }\n\n // Constrain to viewport (vertical)\n if (top < VIEWPORT_PADDING) {\n top = VIEWPORT_PADDING;\n } else if (top + tooltipRect.height > viewportHeight - VIEWPORT_PADDING) {\n top = viewportHeight - tooltipRect.height - VIEWPORT_PADDING;\n }\n\n setPosition({ top, left, actualPlacement, arrowOffset });\n }, [preferredPlacement, offset]);\n\n // Detect dark mode from document\n React.useEffect(() => {\n if (typeof document === 'undefined') return;\n\n const checkDarkMode = () => {\n setIsDarkMode(document.documentElement.classList.contains('dark'));\n };\n\n checkDarkMode();\n\n // Watch for class changes on document\n const observer = new window.MutationObserver(checkDarkMode);\n observer.observe(document.documentElement, {\n attributes: true,\n attributeFilter: ['class'],\n });\n\n return () => observer.disconnect();\n }, []);\n\n // Recalculate position when open or on scroll/resize\n React.useEffect(() => {\n if (!isOpen) {\n setPosition(null);\n return;\n }\n\n // Initial calculation after render\n const rafId = window.requestAnimationFrame(() => {\n calculatePosition();\n });\n\n // Recalculate on scroll/resize\n const handleUpdate = () => calculatePosition();\n window.addEventListener('scroll', handleUpdate, true);\n window.addEventListener('resize', handleUpdate);\n\n return () => {\n window.cancelAnimationFrame(rafId);\n window.removeEventListener('scroll', handleUpdate, true);\n window.removeEventListener('resize', handleUpdate);\n };\n }, [isOpen, calculatePosition]);\n\n const handleMouseEnter = React.useCallback(() => {\n if (disabled) return;\n isHoveringRef.current = true;\n clearTimeouts();\n showTimeoutRef.current = setTimeout(() => {\n if (isHoveringRef.current) {\n setOpen(true);\n }\n }, delay);\n }, [disabled, delay, setOpen, clearTimeouts]);\n\n const handleMouseLeave = React.useCallback(() => {\n isHoveringRef.current = false;\n clearTimeouts();\n hideTimeoutRef.current = setTimeout(() => {\n if (!isHoveringRef.current) {\n setOpen(false);\n }\n }, 100);\n }, [setOpen, clearTimeouts]);\n\n const handleFocus = React.useCallback(() => {\n if (disabled) return;\n clearTimeouts();\n setOpen(true);\n }, [disabled, setOpen, clearTimeouts]);\n\n const handleBlur = React.useCallback(() => {\n clearTimeouts();\n setOpen(false);\n }, [setOpen, clearTimeouts]);\n\n // Cleanup timeouts on unmount\n React.useEffect(() => {\n return () => {\n clearTimeouts();\n };\n }, [clearTimeouts]);\n\n // Clone the child to add aria attributes and focus handlers\n const trigger = React.cloneElement(children, {\n onFocus: handleFocus,\n onBlur: handleBlur,\n 'aria-describedby': isOpen ? tooltipId : undefined,\n });\n\n // Arrow styles based on actual placement - using inline styles for border triangle\n // Arrow color matches tooltip background (neutral-900 in light mode, neutral-100 in dark mode)\n const getArrowStyle = (isDark: boolean): React.CSSProperties => {\n if (!position) return {};\n const { actualPlacement, arrowOffset } = position;\n\n const baseStyle: React.CSSProperties = {\n position: 'absolute',\n width: 0,\n height: 0,\n borderStyle: 'solid',\n // Must use content-box for CSS border triangle to work (Tailwind sets border-box globally)\n boxSizing: 'content-box',\n };\n\n const arrowSize = 5;\n // Match tooltip background colors: bg-neutral-900 (#171717) / dark:bg-neutral-100 (#f5f5f5)\n const arrowColor = isDark ? '#f5f5f5' : '#171717';\n\n // Use arrowSize for positioning to create slight overlap with tooltip body\n const arrowOffset2 = arrowSize;\n\n switch (actualPlacement) {\n case 'top':\n return {\n ...baseStyle,\n bottom: -arrowOffset2,\n left: `calc(50% + ${arrowOffset}px)`,\n transform: 'translateX(-50%)',\n borderWidth: `${arrowSize}px ${arrowSize}px 0 ${arrowSize}px`,\n borderColor: `${arrowColor} transparent transparent transparent`,\n };\n case 'bottom':\n return {\n ...baseStyle,\n top: -arrowOffset2,\n left: `calc(50% + ${arrowOffset}px)`,\n transform: 'translateX(-50%)',\n borderWidth: `0 ${arrowSize}px ${arrowSize}px ${arrowSize}px`,\n borderColor: `transparent transparent ${arrowColor} transparent`,\n };\n case 'left':\n return {\n ...baseStyle,\n right: -arrowOffset2,\n top: '50%',\n transform: 'translateY(-50%)',\n borderWidth: `${arrowSize}px 0 ${arrowSize}px ${arrowSize}px`,\n borderColor: `transparent transparent transparent ${arrowColor}`,\n };\n case 'right':\n return {\n ...baseStyle,\n left: -arrowOffset2,\n top: '50%',\n transform: 'translateY(-50%)',\n borderWidth: `${arrowSize}px ${arrowSize}px ${arrowSize}px 0`,\n borderColor: `transparent ${arrowColor} transparent transparent`,\n };\n }\n };\n\n return (\n <div\n ref={wrapperRef}\n className=\"relative inline-flex\"\n onMouseEnter={handleMouseEnter}\n onMouseLeave={handleMouseLeave}\n >\n {trigger}\n {isOpen &&\n !disabled &&\n typeof document !== 'undefined' &&\n createPortal(\n <div\n ref={tooltipRef}\n id={tooltipId}\n role=\"tooltip\"\n data-slot=\"tooltip\"\n aria-hidden={!isOpen}\n style={{\n position: 'fixed',\n top: position?.top ?? -9999,\n left: position?.left ?? -9999,\n maxWidth: maxWidth === 'none' ? undefined : maxWidth,\n visibility: position ? 'visible' : 'hidden',\n // Use inline styles to ensure they work in portals (rendered outside React tree)\n backgroundColor: isDarkMode ? '#f5f5f5' : '#171717', // neutral-100 / neutral-900\n color: isDarkMode ? '#171717' : '#ffffff', // neutral-900 / white\n fontFamily:\n 'var(--mieweb-font-sans, ui-sans-serif, system-ui, sans-serif)',\n }}\n className={cn(\n 'pointer-events-none z-[9999] px-3 py-1.5 text-xs',\n 'rounded-md shadow-md',\n 'leading-normal font-semibold',\n !prefersReducedMotion && position && 'animate-fade-in',\n className\n )}\n >\n {content}\n {position && (\n <span style={getArrowStyle(isDarkMode)} aria-hidden=\"true\" />\n )}\n </div>,\n document.body\n )}\n </div>\n );\n}\n\nTooltip.displayName = 'Tooltip';\n\nexport { Tooltip };\n"]}
@@ -1,6 +1,6 @@
1
+ import { buttonVariants } from './chunk-GVM6DTR5.js';
1
2
  import { cn } from './chunk-TQONQSJO.js';
2
3
  import * as React from 'react';
3
- import { cva } from 'class-variance-authority';
4
4
  import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
5
5
 
6
6
  // src/components/Button/button-critical.ts
@@ -35,85 +35,6 @@ function injectButtonCriticalStyles() {
35
35
  style.textContent = CRITICAL_CSS;
36
36
  document.head.appendChild(style);
37
37
  }
38
- var buttonVariants = cva(
39
- // Base styles
40
- [
41
- "inline-flex items-center justify-center gap-2",
42
- "min-w-0 whitespace-nowrap",
43
- "font-semibold transition-all duration-200",
44
- "focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2",
45
- "disabled:pointer-events-none disabled:opacity-50",
46
- "active:scale-[0.98]"
47
- ],
48
- {
49
- variants: {
50
- variant: {
51
- primary: [
52
- "bg-primary-800 text-white",
53
- "hover:bg-primary-900",
54
- "active:bg-primary-950"
55
- ],
56
- secondary: [
57
- "bg-neutral-200 text-neutral-900",
58
- "hover:bg-neutral-300",
59
- "active:bg-neutral-400",
60
- "dark:bg-neutral-700 dark:text-neutral-100",
61
- "dark:hover:bg-neutral-600",
62
- "dark:active:bg-neutral-500"
63
- ],
64
- ghost: [
65
- "bg-transparent text-neutral-600",
66
- "hover:bg-neutral-100",
67
- "active:bg-neutral-200",
68
- "dark:text-neutral-400",
69
- "dark:hover:bg-neutral-800",
70
- "dark:active:bg-neutral-700"
71
- ],
72
- outline: [
73
- "border-2 border-primary-800 text-primary-800 bg-transparent",
74
- "hover:bg-primary-50 hover:text-primary-900",
75
- "active:bg-primary-100",
76
- "dark:border-primary-400 dark:text-primary-400",
77
- "dark:hover:bg-primary-950",
78
- "dark:active:bg-primary-900"
79
- ],
80
- danger: [
81
- "bg-red-600 text-white",
82
- "hover:bg-red-700",
83
- "active:bg-red-800"
84
- ],
85
- link: [
86
- "text-primary-800 underline-offset-4",
87
- "hover:underline hover:text-primary-900",
88
- "active:text-primary-950",
89
- "dark:text-primary-400"
90
- ]
91
- },
92
- size: {
93
- sm: "h-8 px-3 text-sm rounded-md",
94
- md: "h-10 px-4 text-base rounded-lg",
95
- lg: "h-12 px-6 text-lg rounded-xl",
96
- icon: "h-10 w-10 rounded-lg"
97
- },
98
- fullWidth: {
99
- true: "w-full",
100
- false: ""
101
- },
102
- /** Opt-in hover motion (see src/styles/effects.css). */
103
- effect: {
104
- none: "",
105
- sheen: "mie-fx-sheen hover:-translate-y-0.5",
106
- orbit: "mie-fx-orbit hover:-translate-y-0.5"
107
- }
108
- },
109
- defaultVariants: {
110
- variant: "primary",
111
- size: "md",
112
- fullWidth: false,
113
- effect: "none"
114
- }
115
- }
116
- );
117
38
  var labelClasses = "truncate [&_svg]:inline-block [&_svg]:align-middle";
118
39
  var Button = React.forwardRef(
119
40
  ({
@@ -233,6 +154,6 @@ function LoadingSpinner() {
233
154
  );
234
155
  }
235
156
 
236
- export { Button, buttonVariants };
237
- //# sourceMappingURL=chunk-GOALNQZ2.js.map
238
- //# sourceMappingURL=chunk-GOALNQZ2.js.map
157
+ export { Button };
158
+ //# sourceMappingURL=chunk-7YO7DNUV.js.map
159
+ //# sourceMappingURL=chunk-7YO7DNUV.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/Button/button-critical.ts","../src/components/Button/Button.tsx"],"names":[],"mappings":"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","file":"chunk-7YO7DNUV.js","sourcesContent":["/**\n * Self-healing structural CSS for Button.\n *\n * Button layout relies on Tailwind utilities (`inline-flex`,\n * `whitespace-nowrap`, ...). Consumer apps with a stale safelist copy or a\n * missing `@source` line never generate those classes, so the button falls\n * back to `inline-block` and the icon stacks above the label.\n *\n * Injecting these rules from the component guarantees every consumer gets\n * correct button structure just by upgrading the library — no app-side\n * changes required.\n *\n * Override safety, by consumer setup:\n * - Tailwind 4: utilities live in `@layer utilities`. The structural rules\n * below join that same layer, so conflicts resolve by specificity — and\n * every selector is wrapped in `:where()` (zero specificity), so real\n * utilities (`hidden`, `gap-0`, ...) always win. (A new layer name can't\n * be used: layers declared later outrank `utilities`.)\n * - Tailwind 3 / no Tailwind: consumer CSS is unlayered, and unlayered\n * always beats layered, so the structural rules stay a pure fallback.\n */\n\nconst STYLE_ID = 'mieweb-ui-button-critical';\n\nconst CRITICAL_CSS = [\n '@layer utilities{',\n // Structure: keep icon + label on one line (matches the base utilities\n // inline-flex items-center justify-center gap-2 min-w-0 whitespace-nowrap).\n `:where(button[data-slot='button']){display:inline-flex;flex-wrap:nowrap;align-items:center;justify-content:center;gap:0.5rem;min-width:0;white-space:nowrap;}`,\n // Icons and the loading spinner never shrink (matches shrink-0).\n `:where(button[data-slot='button']) > :where([data-slot='button-icon'],svg){flex-shrink:0;}`,\n // Label truncates instead of wrapping/overflowing (matches truncate).\n `:where(button[data-slot='button']) > :where([data-slot='button-label']){min-width:0;overflow:hidden;text-overflow:ellipsis;}`,\n '}',\n // Icons passed as children land inside the label span; Tailwind preflight\n // makes SVGs display:block, which forces line breaks inside the inline\n // label. Restore inline flow. This rule is deliberately UNLAYERED at\n // specificity (0,2,2): it must beat Tailwind 3's unlayered preflight\n // `svg{display:block}` (0,0,1) — layering it would neuter the fix for\n // exactly the broken-TW3 apps it exists for. It also outranks the\n // (0,1,1) [&_svg]:inline-block utility on the label, but both declare\n // the same values, so they never conflict. Known tradeoff:\n // display utilities on an SVG inside the label slot won't win; consumers\n // should conditionally render icons instead.\n `button[data-slot='button'] [data-slot='button-label'] svg{display:inline-block;vertical-align:middle;}`,\n].join('');\n\n/** Injects the critical Button styles once per document. SSR-safe. */\nexport function injectButtonCriticalStyles(): void {\n if (typeof document === 'undefined') return;\n if (document.getElementById(STYLE_ID)) return;\n const style = document.createElement('style');\n style.id = STYLE_ID;\n style.textContent = CRITICAL_CSS;\n document.head.appendChild(style);\n}\n","import * as React from 'react';\nimport type { VariantProps } from 'class-variance-authority';\nimport { cn } from '../../utils/cn';\nimport { injectButtonCriticalStyles } from './button-critical';\nimport { buttonVariants } from './button-variants';\n\n/**\n * Label wrapper classes. Icons passed as `children` (rather than\n * leftIcon/rightIcon) land inside this span; preflight makes SVGs\n * display:block which would force line breaks inside the inline span,\n * so restore inline flow for them.\n */\nconst labelClasses = 'truncate [&_svg]:inline-block [&_svg]:align-middle';\n\nexport interface ButtonProps\n extends\n React.ButtonHTMLAttributes<HTMLButtonElement>,\n VariantProps<typeof buttonVariants> {\n /** Optional icon element to render before the button text */\n leftIcon?: React.ReactElement | null;\n /** Optional icon element to render after the button text */\n rightIcon?: React.ReactElement | null;\n /** Shows a loading spinner and disables the button */\n isLoading?: boolean;\n /** Accessible label for the loading state */\n loadingText?: string;\n}\n\n/**\n * A versatile button component with multiple variants and sizes.\n *\n * @example\n * ```tsx\n * <Button variant=\"primary\" size=\"md\">Click me</Button>\n * <Button variant=\"danger\" leftIcon={<TrashIcon />}>Delete</Button>\n * <Button variant=\"ghost\" isLoading loadingText=\"Saving...\">Save</Button>\n * <Button effect=\"sheen\">Request a demo</Button>\n * <Button variant=\"outline\" effect=\"orbit\">Watch the film</Button>\n * ```\n */\nconst Button = React.forwardRef<HTMLButtonElement, ButtonProps>(\n (\n {\n className,\n variant,\n size,\n fullWidth,\n effect,\n leftIcon,\n rightIcon,\n isLoading,\n loadingText,\n disabled,\n children,\n title,\n ...props\n },\n ref\n ) => {\n const resolvedSize = size ?? 'md';\n const labelRef = React.useRef<HTMLSpanElement>(null);\n const innerRef = React.useRef<HTMLButtonElement>(null);\n React.useImperativeHandle(ref, () => innerRef.current as HTMLButtonElement);\n\n // Guarantees correct icon/label layout even when the consumer's Tailwind\n // build is missing our utility classes. See button-critical.ts.\n React.useInsertionEffect(() => {\n injectButtonCriticalStyles();\n }, []);\n\n // When the label truncates, expose the full text as a native tooltip.\n // A consumer-provided `title` always takes precedence.\n React.useLayoutEffect(() => {\n const label = labelRef.current;\n const button = innerRef.current;\n if (!label || !button || title !== undefined) return;\n\n const update = () => {\n if (label.scrollWidth > label.clientWidth) {\n button.title = label.textContent ?? '';\n } else {\n button.removeAttribute('title');\n }\n };\n\n update();\n if (typeof globalThis.ResizeObserver === 'undefined') return;\n const observer = new globalThis.ResizeObserver(update);\n observer.observe(label);\n return () => observer.disconnect();\n }, [title, children, isLoading, loadingText]);\n\n return (\n <button\n data-slot=\"button\"\n data-size={resolvedSize}\n data-variant={variant ?? 'primary'}\n className={cn(\n buttonVariants({ variant, size: resolvedSize, fullWidth, effect }),\n className\n )}\n ref={innerRef}\n disabled={disabled || isLoading}\n aria-busy={isLoading}\n title={title}\n {...props}\n >\n {isLoading ? (\n <>\n <LoadingSpinner />\n <span\n ref={labelRef}\n data-slot=\"button-label\"\n className={labelClasses}\n >\n {loadingText || children}\n </span>\n </>\n ) : (\n <>\n {React.isValidElement(leftIcon) && (\n <span data-slot=\"button-icon\" className=\"shrink-0\">\n {leftIcon}\n </span>\n )}\n <span\n ref={labelRef}\n data-slot=\"button-label\"\n className={labelClasses}\n >\n {children}\n </span>\n {React.isValidElement(rightIcon) && (\n <span data-slot=\"button-icon\" className=\"shrink-0\">\n {rightIcon}\n </span>\n )}\n </>\n )}\n </button>\n );\n }\n);\n\nButton.displayName = 'Button';\n\n/**\n * Simple loading spinner for the button\n */\nfunction LoadingSpinner() {\n return (\n <svg\n className=\"h-4 w-4 shrink-0 animate-spin\"\n xmlns=\"http://www.w3.org/2000/svg\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n aria-hidden=\"true\"\n >\n <circle\n className=\"opacity-25\"\n cx=\"12\"\n cy=\"12\"\n r=\"10\"\n stroke=\"currentColor\"\n strokeWidth=\"4\"\n />\n <path\n className=\"opacity-75\"\n fill=\"currentColor\"\n d=\"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z\"\n />\n </svg>\n );\n}\n\nexport { Button, buttonVariants };\n"]}
@@ -1,5 +1,5 @@
1
- import { usePrefersReducedMotion } from './chunk-HB7C7NB5.js';
2
- import { AnimatedPresence, Animated } from './chunk-XCP454Q6.js';
1
+ import { usePrefersReducedMotion } from './chunk-XDU65GLW.js';
2
+ import { AnimatedPresence, Animated } from './chunk-F4N67NAF.js';
3
3
  import { cn } from './chunk-TQONQSJO.js';
4
4
  import * as React from 'react';
5
5
  import { jsx } from 'react/jsx-runtime';
@@ -123,5 +123,5 @@ var CollapsibleContent = React.forwardRef(({ className, forceMount, children, ..
123
123
  CollapsibleContent.displayName = "CollapsibleContent";
124
124
 
125
125
  export { Collapsible, CollapsibleContent, CollapsibleTrigger };
126
- //# sourceMappingURL=chunk-P2CA3XGI.js.map
127
- //# sourceMappingURL=chunk-P2CA3XGI.js.map
126
+ //# sourceMappingURL=chunk-7ZV67VZE.js.map
127
+ //# sourceMappingURL=chunk-7ZV67VZE.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/components/Collapsible/Collapsible.tsx"],"names":[],"mappings":"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","file":"chunk-P2CA3XGI.js","sourcesContent":["import * as React from 'react';\nimport { cn } from '../../utils/cn';\nimport { Animated, AnimatedPresence } from '../../motion';\nimport { usePrefersReducedMotion } from '../../hooks/usePrefersReducedMotion';\n\ninterface CollapsibleContextValue {\n open: boolean;\n toggle: () => void;\n disabled?: boolean;\n contentId: string;\n triggerId: string;\n}\n\nconst CollapsibleContext = React.createContext<CollapsibleContextValue | null>(\n null\n);\n\nfunction useCollapsibleContext(component: string): CollapsibleContextValue {\n const ctx = React.useContext(CollapsibleContext);\n if (!ctx) {\n throw new Error(`${component} must be used within a <Collapsible>`);\n }\n return ctx;\n}\n\nexport interface CollapsibleProps extends React.HTMLAttributes<HTMLDivElement> {\n /** Controlled open state */\n open?: boolean;\n /** Default open state (uncontrolled) */\n defaultOpen?: boolean;\n /** Callback fired when the open state changes */\n onOpenChange?: (open: boolean) => void;\n /** Disables toggling */\n disabled?: boolean;\n}\n\n/**\n * An interactive component that expands and collapses its content.\n *\n * @example\n * ```tsx\n * <Collapsible>\n * <CollapsibleTrigger>Toggle</CollapsibleTrigger>\n * <CollapsibleContent>Hidden content</CollapsibleContent>\n * </Collapsible>\n * ```\n */\nconst Collapsible = React.forwardRef<HTMLDivElement, CollapsibleProps>(\n (\n {\n className,\n open: controlledOpen,\n defaultOpen = false,\n onOpenChange,\n disabled,\n children,\n ...props\n },\n ref\n ) => {\n const [uncontrolledOpen, setUncontrolledOpen] = React.useState(defaultOpen);\n const generatedId = React.useId();\n\n const isControlled = controlledOpen !== undefined;\n const open = isControlled ? controlledOpen : uncontrolledOpen;\n\n const toggle = React.useCallback(() => {\n if (disabled) return;\n const next = !open;\n if (!isControlled) setUncontrolledOpen(next);\n onOpenChange?.(next);\n }, [disabled, open, isControlled, onOpenChange]);\n\n const value = React.useMemo<CollapsibleContextValue>(\n () => ({\n open,\n toggle,\n disabled,\n contentId: `${generatedId}-content`,\n triggerId: `${generatedId}-trigger`,\n }),\n [open, toggle, disabled, generatedId]\n );\n\n return (\n <CollapsibleContext.Provider value={value}>\n <div\n ref={ref}\n data-slot=\"collapsible\"\n data-state={open ? 'open' : 'closed'}\n className={cn(className)}\n {...props}\n >\n {children}\n </div>\n </CollapsibleContext.Provider>\n );\n }\n);\n\nCollapsible.displayName = 'Collapsible';\n\nexport type CollapsibleTriggerProps =\n React.ButtonHTMLAttributes<HTMLButtonElement>;\n\nconst CollapsibleTrigger = React.forwardRef<\n HTMLButtonElement,\n CollapsibleTriggerProps\n>(({ className, onClick, children, ...props }, ref) => {\n const { open, toggle, disabled, contentId, triggerId } =\n useCollapsibleContext('CollapsibleTrigger');\n\n return (\n <button\n ref={ref}\n type=\"button\"\n id={triggerId}\n data-slot=\"collapsible-trigger\"\n aria-expanded={open}\n aria-controls={contentId}\n data-state={open ? 'open' : 'closed'}\n disabled={disabled}\n onClick={(e) => {\n toggle();\n onClick?.(e);\n }}\n className={cn(className)}\n {...props}\n >\n {children}\n </button>\n );\n});\n\nCollapsibleTrigger.displayName = 'CollapsibleTrigger';\n\nexport interface CollapsibleContentProps extends React.HTMLAttributes<HTMLDivElement> {\n /** Keep content mounted when collapsed (hidden via CSS) */\n forceMount?: boolean;\n}\n\nconst CollapsibleContent = React.forwardRef<\n HTMLDivElement,\n CollapsibleContentProps\n>(({ className, forceMount, children, ...props }, ref) => {\n const { open, contentId, triggerId } =\n useCollapsibleContext('CollapsibleContent');\n const prefersReducedMotion = usePrefersReducedMotion();\n\n const sharedProps = {\n id: contentId,\n role: 'region' as const,\n 'aria-labelledby': triggerId,\n 'data-slot': 'collapsible-content',\n 'data-state': open ? ('open' as const) : ('closed' as const),\n };\n\n /*\n * `forceMount` keeps the old instant behaviour, deliberately.\n *\n * It exists so consumers can keep collapsed content in the DOM, and it relies\n * on `hidden` to keep that content out of the tab order and the accessibility\n * tree. `hidden` is `display: none`, which an animated height cannot run\n * through — and dropping it for the duration would leave keyboard users able\n * to tab into content that is visually collapsed. Sequencing `hidden` around\n * the animation is the real fix; until then, not animating is the safe\n * answer, and the default (unmounting) path below covers the common case.\n */\n if (forceMount) {\n return (\n <div\n ref={ref}\n {...sharedProps}\n hidden={!open}\n className={cn(className)}\n {...props}\n >\n {children}\n </div>\n );\n }\n\n return (\n <AnimatedPresence initial={false}>\n {open && (\n <Animated\n key=\"collapsible-content\"\n ref={ref as React.Ref<HTMLElement>}\n preset=\"collapse\"\n mode=\"presence\"\n // `collapse` animates height, which `MotionConfig reducedMotion=\"user\"`\n // does not treat as a transform or layout animation and so leaves\n // running. Honouring the preference is the component's job here.\n enabled={!prefersReducedMotion}\n {...sharedProps}\n // Content must be clipped or it spills past the box while the height\n // is still travelling.\n className={cn('overflow-hidden', className)}\n {...props}\n >\n {children}\n </Animated>\n )}\n </AnimatedPresence>\n );\n});\n\nCollapsibleContent.displayName = 'CollapsibleContent';\n\nexport { Collapsible, CollapsibleTrigger, CollapsibleContent };\n"]}
1
+ {"version":3,"sources":["../src/components/Collapsible/Collapsible.tsx"],"names":[],"mappings":"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","file":"chunk-7ZV67VZE.js","sourcesContent":["import * as React from 'react';\nimport { cn } from '../../utils/cn';\nimport { Animated, AnimatedPresence } from '../../motion';\nimport { usePrefersReducedMotion } from '../../hooks/usePrefersReducedMotion';\n\ninterface CollapsibleContextValue {\n open: boolean;\n toggle: () => void;\n disabled?: boolean;\n contentId: string;\n triggerId: string;\n}\n\nconst CollapsibleContext = React.createContext<CollapsibleContextValue | null>(\n null\n);\n\nfunction useCollapsibleContext(component: string): CollapsibleContextValue {\n const ctx = React.useContext(CollapsibleContext);\n if (!ctx) {\n throw new Error(`${component} must be used within a <Collapsible>`);\n }\n return ctx;\n}\n\nexport interface CollapsibleProps extends React.HTMLAttributes<HTMLDivElement> {\n /** Controlled open state */\n open?: boolean;\n /** Default open state (uncontrolled) */\n defaultOpen?: boolean;\n /** Callback fired when the open state changes */\n onOpenChange?: (open: boolean) => void;\n /** Disables toggling */\n disabled?: boolean;\n}\n\n/**\n * An interactive component that expands and collapses its content.\n *\n * @example\n * ```tsx\n * <Collapsible>\n * <CollapsibleTrigger>Toggle</CollapsibleTrigger>\n * <CollapsibleContent>Hidden content</CollapsibleContent>\n * </Collapsible>\n * ```\n */\nconst Collapsible = React.forwardRef<HTMLDivElement, CollapsibleProps>(\n (\n {\n className,\n open: controlledOpen,\n defaultOpen = false,\n onOpenChange,\n disabled,\n children,\n ...props\n },\n ref\n ) => {\n const [uncontrolledOpen, setUncontrolledOpen] = React.useState(defaultOpen);\n const generatedId = React.useId();\n\n const isControlled = controlledOpen !== undefined;\n const open = isControlled ? controlledOpen : uncontrolledOpen;\n\n const toggle = React.useCallback(() => {\n if (disabled) return;\n const next = !open;\n if (!isControlled) setUncontrolledOpen(next);\n onOpenChange?.(next);\n }, [disabled, open, isControlled, onOpenChange]);\n\n const value = React.useMemo<CollapsibleContextValue>(\n () => ({\n open,\n toggle,\n disabled,\n contentId: `${generatedId}-content`,\n triggerId: `${generatedId}-trigger`,\n }),\n [open, toggle, disabled, generatedId]\n );\n\n return (\n <CollapsibleContext.Provider value={value}>\n <div\n ref={ref}\n data-slot=\"collapsible\"\n data-state={open ? 'open' : 'closed'}\n className={cn(className)}\n {...props}\n >\n {children}\n </div>\n </CollapsibleContext.Provider>\n );\n }\n);\n\nCollapsible.displayName = 'Collapsible';\n\nexport type CollapsibleTriggerProps =\n React.ButtonHTMLAttributes<HTMLButtonElement>;\n\nconst CollapsibleTrigger = React.forwardRef<\n HTMLButtonElement,\n CollapsibleTriggerProps\n>(({ className, onClick, children, ...props }, ref) => {\n const { open, toggle, disabled, contentId, triggerId } =\n useCollapsibleContext('CollapsibleTrigger');\n\n return (\n <button\n ref={ref}\n type=\"button\"\n id={triggerId}\n data-slot=\"collapsible-trigger\"\n aria-expanded={open}\n aria-controls={contentId}\n data-state={open ? 'open' : 'closed'}\n disabled={disabled}\n onClick={(e) => {\n toggle();\n onClick?.(e);\n }}\n className={cn(className)}\n {...props}\n >\n {children}\n </button>\n );\n});\n\nCollapsibleTrigger.displayName = 'CollapsibleTrigger';\n\nexport interface CollapsibleContentProps extends React.HTMLAttributes<HTMLDivElement> {\n /** Keep content mounted when collapsed (hidden via CSS) */\n forceMount?: boolean;\n}\n\nconst CollapsibleContent = React.forwardRef<\n HTMLDivElement,\n CollapsibleContentProps\n>(({ className, forceMount, children, ...props }, ref) => {\n const { open, contentId, triggerId } =\n useCollapsibleContext('CollapsibleContent');\n const prefersReducedMotion = usePrefersReducedMotion();\n\n const sharedProps = {\n id: contentId,\n role: 'region' as const,\n 'aria-labelledby': triggerId,\n 'data-slot': 'collapsible-content',\n 'data-state': open ? ('open' as const) : ('closed' as const),\n };\n\n /*\n * `forceMount` keeps the old instant behaviour, deliberately.\n *\n * It exists so consumers can keep collapsed content in the DOM, and it relies\n * on `hidden` to keep that content out of the tab order and the accessibility\n * tree. `hidden` is `display: none`, which an animated height cannot run\n * through — and dropping it for the duration would leave keyboard users able\n * to tab into content that is visually collapsed. Sequencing `hidden` around\n * the animation is the real fix; until then, not animating is the safe\n * answer, and the default (unmounting) path below covers the common case.\n */\n if (forceMount) {\n return (\n <div\n ref={ref}\n {...sharedProps}\n hidden={!open}\n className={cn(className)}\n {...props}\n >\n {children}\n </div>\n );\n }\n\n return (\n <AnimatedPresence initial={false}>\n {open && (\n <Animated\n key=\"collapsible-content\"\n ref={ref as React.Ref<HTMLElement>}\n preset=\"collapse\"\n mode=\"presence\"\n // `collapse` animates height, which `MotionConfig reducedMotion=\"user\"`\n // does not treat as a transform or layout animation and so leaves\n // running. Honouring the preference is the component's job here.\n enabled={!prefersReducedMotion}\n {...sharedProps}\n // Content must be clipped or it spills past the box while the height\n // is still travelling.\n className={cn('overflow-hidden', className)}\n {...props}\n >\n {children}\n </Animated>\n )}\n </AnimatedPresence>\n );\n});\n\nCollapsibleContent.displayName = 'CollapsibleContent';\n\nexport { Collapsible, CollapsibleTrigger, CollapsibleContent };\n"]}