@mieweb/ui 0.10.0-dev.4 → 0.10.0-dev.40

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 (811) hide show
  1. package/README.md +4 -4
  2. package/agent/mieweb-ui.instructions.md +90 -1
  3. package/dist/CsvBlock-CFXSDPBI.js +9 -0
  4. package/dist/{CsvBlock-UWPMTLE2.js.map → CsvBlock-CFXSDPBI.js.map} +1 -1
  5. package/dist/CsvBlock-RGO7JXHJ.cjs +18 -0
  6. package/dist/{CsvBlock-ROJCKJDP.cjs.map → CsvBlock-RGO7JXHJ.cjs.map} +1 -1
  7. package/dist/HtmlPreviewBlock-VBYXCXVT.cjs +18 -0
  8. package/dist/{HtmlPreviewBlock-DWFN6EUB.cjs.map → HtmlPreviewBlock-VBYXCXVT.cjs.map} +1 -1
  9. package/dist/HtmlPreviewBlock-Z2GCK325.js +9 -0
  10. package/dist/{HtmlPreviewBlock-ME5U3XNS.js.map → HtmlPreviewBlock-Z2GCK325.js.map} +1 -1
  11. package/dist/MermaidBlock-I2R2BQOX.cjs +18 -0
  12. package/dist/{MermaidBlock-D2UC5M55.cjs.map → MermaidBlock-I2R2BQOX.cjs.map} +1 -1
  13. package/dist/MermaidBlock-XCAK7IA5.js +9 -0
  14. package/dist/{MermaidBlock-2B6CPD6Y.js.map → MermaidBlock-XCAK7IA5.js.map} +1 -1
  15. package/dist/SurveyBlock-KI5JOWCL.js +9 -0
  16. package/dist/{SurveyBlock-4DO62RBT.js.map → SurveyBlock-KI5JOWCL.js.map} +1 -1
  17. package/dist/SurveyBlock-UKSGISRT.cjs +18 -0
  18. package/dist/{SurveyBlock-4CD4AYMJ.cjs.map → SurveyBlock-UKSGISRT.cjs.map} +1 -1
  19. package/dist/ag-grid.d.cts +142 -1
  20. package/dist/ag-grid.d.ts +142 -1
  21. package/dist/brands/bluehive.cjs +3 -3
  22. package/dist/brands/bluehive.css +3 -0
  23. package/dist/brands/bluehive.js +1 -1
  24. package/dist/brands/index.cjs +14 -14
  25. package/dist/brands/index.js +4 -4
  26. package/dist/{chunk-3M7TAXNR.js → chunk-24AFHH4J.js} +3 -3
  27. package/dist/{chunk-3M7TAXNR.js.map → chunk-24AFHH4J.js.map} +1 -1
  28. package/dist/{chunk-JYZW2PZS.cjs → chunk-254QK722.cjs} +7 -7
  29. package/dist/chunk-254QK722.cjs.map +1 -0
  30. package/dist/{chunk-VPIYTQCV.cjs → chunk-2I4IRQQG.cjs} +12 -5
  31. package/dist/chunk-2I4IRQQG.cjs.map +1 -0
  32. package/dist/chunk-2X54ZLT6.js +874 -0
  33. package/dist/chunk-2X54ZLT6.js.map +1 -0
  34. package/dist/{chunk-5MCBWTIF.cjs → chunk-32ZCJOSR.cjs} +4 -4
  35. package/dist/{chunk-5MCBWTIF.cjs.map → chunk-32ZCJOSR.cjs.map} +1 -1
  36. package/dist/chunk-3YBS4WUQ.js +52 -0
  37. package/dist/chunk-3YBS4WUQ.js.map +1 -0
  38. package/dist/{chunk-WNJRS7Y7.cjs → chunk-3ZWCIPFT.cjs} +4 -2
  39. package/dist/chunk-3ZWCIPFT.cjs.map +1 -0
  40. package/dist/chunk-434L5RYF.js +314 -0
  41. package/dist/chunk-434L5RYF.js.map +1 -0
  42. package/dist/{chunk-TPWKM7JH.js → chunk-43K7OQ3E.js} +3 -3
  43. package/dist/{chunk-TPWKM7JH.js.map → chunk-43K7OQ3E.js.map} +1 -1
  44. package/dist/chunk-47P5QLX4.cjs +42 -0
  45. package/dist/chunk-47P5QLX4.cjs.map +1 -0
  46. package/dist/chunk-4IS3QCOQ.cjs +453 -0
  47. package/dist/chunk-4IS3QCOQ.cjs.map +1 -0
  48. package/dist/chunk-4NCDU5IG.cjs +56 -0
  49. package/dist/chunk-4NCDU5IG.cjs.map +1 -0
  50. package/dist/chunk-4ZB7RSMY.cjs +306 -0
  51. package/dist/chunk-4ZB7RSMY.cjs.map +1 -0
  52. package/dist/chunk-522WJIVI.js +99 -0
  53. package/dist/chunk-522WJIVI.js.map +1 -0
  54. package/dist/chunk-56VTM4OX.js +261 -0
  55. package/dist/chunk-56VTM4OX.js.map +1 -0
  56. package/dist/chunk-5HKZR6UG.js +248 -0
  57. package/dist/chunk-5HKZR6UG.js.map +1 -0
  58. package/dist/chunk-6BNZLN4B.cjs +548 -0
  59. package/dist/chunk-6BNZLN4B.cjs.map +1 -0
  60. package/dist/chunk-6N7NMOSV.js +233 -0
  61. package/dist/chunk-6N7NMOSV.js.map +1 -0
  62. package/dist/chunk-6TTCZY3P.cjs +4 -0
  63. package/dist/chunk-6TTCZY3P.cjs.map +1 -0
  64. package/dist/{chunk-YQDA366U.js → chunk-753ENNB6.js} +2 -2
  65. package/dist/{chunk-YQDA366U.js.map → chunk-753ENNB6.js.map} +1 -1
  66. package/dist/{chunk-N6IY47YA.cjs → chunk-7C5W744U.cjs} +8 -8
  67. package/dist/{chunk-N6IY47YA.cjs.map → chunk-7C5W744U.cjs.map} +1 -1
  68. package/dist/chunk-7E46YDOT.cjs +122 -0
  69. package/dist/chunk-7E46YDOT.cjs.map +1 -0
  70. package/dist/chunk-7HUTR6RX.js +178 -0
  71. package/dist/chunk-7HUTR6RX.js.map +1 -0
  72. package/dist/chunk-7IRTD4JT.cjs +61 -0
  73. package/dist/chunk-7IRTD4JT.cjs.map +1 -0
  74. package/dist/{chunk-KZFBQ7GY.js → chunk-7QW6TU4X.js} +3 -3
  75. package/dist/{chunk-KZFBQ7GY.js.map → chunk-7QW6TU4X.js.map} +1 -1
  76. package/dist/{chunk-MWVW4APN.cjs → chunk-7UTBDFFL.cjs} +4 -4
  77. package/dist/{chunk-MWVW4APN.cjs.map → chunk-7UTBDFFL.cjs.map} +1 -1
  78. package/dist/chunk-7WJ6MBF5.cjs +47 -0
  79. package/dist/chunk-7WJ6MBF5.cjs.map +1 -0
  80. package/dist/{chunk-FJ7YPVKV.js → chunk-7X6R3JIA.js} +3 -3
  81. package/dist/{chunk-FJ7YPVKV.js.map → chunk-7X6R3JIA.js.map} +1 -1
  82. package/dist/chunk-A4W5CSK7.cjs +216 -0
  83. package/dist/chunk-A4W5CSK7.cjs.map +1 -0
  84. package/dist/{chunk-2G75X6TS.cjs → chunk-AHHFFXJR.cjs} +3 -3
  85. package/dist/{chunk-2G75X6TS.cjs.map → chunk-AHHFFXJR.cjs.map} +1 -1
  86. package/dist/chunk-AJPFQF3H.cjs +896 -0
  87. package/dist/chunk-AJPFQF3H.cjs.map +1 -0
  88. package/dist/chunk-AMYFRY7K.js +3 -0
  89. package/dist/chunk-AMYFRY7K.js.map +1 -0
  90. package/dist/{chunk-VNYW4C4J.cjs → chunk-ANMX7YDL.cjs} +4 -84
  91. package/dist/chunk-ANMX7YDL.cjs.map +1 -0
  92. package/dist/chunk-ARIJ5OHW.cjs +139 -0
  93. package/dist/chunk-ARIJ5OHW.cjs.map +1 -0
  94. package/dist/{chunk-DVOQ3JNO.js → chunk-B4CKCNWD.js} +16 -8
  95. package/dist/chunk-B4CKCNWD.js.map +1 -0
  96. package/dist/chunk-BJ6ABRSQ.cjs +256 -0
  97. package/dist/chunk-BJ6ABRSQ.cjs.map +1 -0
  98. package/dist/chunk-BM35CACB.js +148 -0
  99. package/dist/chunk-BM35CACB.js.map +1 -0
  100. package/dist/{chunk-G3JX3UAU.cjs → chunk-BWSZ2BHJ.cjs} +6 -6
  101. package/dist/{chunk-G3JX3UAU.cjs.map → chunk-BWSZ2BHJ.cjs.map} +1 -1
  102. package/dist/chunk-BXRQ6HEP.cjs +4 -0
  103. package/dist/chunk-BXRQ6HEP.cjs.map +1 -0
  104. package/dist/{chunk-SGFYA22I.cjs → chunk-C77FAR3F.cjs} +8 -8
  105. package/dist/{chunk-SGFYA22I.cjs.map → chunk-C77FAR3F.cjs.map} +1 -1
  106. package/dist/chunk-CBBKWRLG.js +213 -0
  107. package/dist/chunk-CBBKWRLG.js.map +1 -0
  108. package/dist/{chunk-UAMXCMST.cjs → chunk-CFI3TQMA.cjs} +3 -3
  109. package/dist/{chunk-UAMXCMST.cjs.map → chunk-CFI3TQMA.cjs.map} +1 -1
  110. package/dist/chunk-CLQW724U.cjs +271 -0
  111. package/dist/chunk-CLQW724U.cjs.map +1 -0
  112. package/dist/chunk-CPDNX3LS.cjs +47 -0
  113. package/dist/chunk-CPDNX3LS.cjs.map +1 -0
  114. package/dist/chunk-CVNPNZMX.js +44 -0
  115. package/dist/chunk-CVNPNZMX.js.map +1 -0
  116. package/dist/{chunk-2YCERQWC.js → chunk-CVXESGXJ.js} +10 -9
  117. package/dist/chunk-CVXESGXJ.js.map +1 -0
  118. package/dist/chunk-DGHS5IVD.js +305 -0
  119. package/dist/chunk-DGHS5IVD.js.map +1 -0
  120. package/dist/chunk-DHGCLPFZ.js +91 -0
  121. package/dist/chunk-DHGCLPFZ.js.map +1 -0
  122. package/dist/{chunk-GD7EBGC4.cjs → chunk-DHU3FFC3.cjs} +49 -19
  123. package/dist/chunk-DHU3FFC3.cjs.map +1 -0
  124. package/dist/chunk-DO2YN46R.cjs +201 -0
  125. package/dist/chunk-DO2YN46R.cjs.map +1 -0
  126. package/dist/chunk-DVDT7TX7.js +151 -0
  127. package/dist/chunk-DVDT7TX7.js.map +1 -0
  128. package/dist/chunk-DXEPYK3I.cjs +92 -0
  129. package/dist/chunk-DXEPYK3I.cjs.map +1 -0
  130. package/dist/{chunk-X4XPNTCZ.cjs → chunk-DZ3JTMKM.cjs} +136 -58
  131. package/dist/chunk-DZ3JTMKM.cjs.map +1 -0
  132. package/dist/chunk-EACNRR3C.cjs +4 -0
  133. package/dist/chunk-EACNRR3C.cjs.map +1 -0
  134. package/dist/{chunk-ZGRCSNPK.js → chunk-EEOGIGIA.js} +4 -4
  135. package/dist/{chunk-ZGRCSNPK.js.map → chunk-EEOGIGIA.js.map} +1 -1
  136. package/dist/chunk-EPCUPHEO.js +193 -0
  137. package/dist/chunk-EPCUPHEO.js.map +1 -0
  138. package/dist/{chunk-7ZXAQTV4.cjs → chunk-ERACGSDY.cjs} +8 -8
  139. package/dist/{chunk-7ZXAQTV4.cjs.map → chunk-ERACGSDY.cjs.map} +1 -1
  140. package/dist/{chunk-OD47TTAW.cjs → chunk-F2FOG4EG.cjs} +9 -9
  141. package/dist/{chunk-OD47TTAW.cjs.map → chunk-F2FOG4EG.cjs.map} +1 -1
  142. package/dist/chunk-F3EWRDIT.js +312 -0
  143. package/dist/chunk-F3EWRDIT.js.map +1 -0
  144. package/dist/{chunk-XCP454Q6.js → chunk-F4N67NAF.js} +12 -3
  145. package/dist/chunk-F4N67NAF.js.map +1 -0
  146. package/dist/{chunk-WGPLUCBD.js → chunk-F6W62K4J.js} +4 -4
  147. package/dist/{chunk-WGPLUCBD.js.map → chunk-F6W62K4J.js.map} +1 -1
  148. package/dist/chunk-FBCDYTWM.js +385 -0
  149. package/dist/chunk-FBCDYTWM.js.map +1 -0
  150. package/dist/{chunk-V7D3YGUV.js → chunk-FGLIP6YR.js} +4 -4
  151. package/dist/{chunk-V7D3YGUV.js.map → chunk-FGLIP6YR.js.map} +1 -1
  152. package/dist/{chunk-VU6UTJRM.js → chunk-FIKO4WR6.js} +3 -3
  153. package/dist/{chunk-VU6UTJRM.js.map → chunk-FIKO4WR6.js.map} +1 -1
  154. package/dist/chunk-FSGJXCBG.cjs +318 -0
  155. package/dist/chunk-FSGJXCBG.cjs.map +1 -0
  156. package/dist/chunk-FSWHZY3T.cjs +328 -0
  157. package/dist/chunk-FSWHZY3T.cjs.map +1 -0
  158. package/dist/chunk-FTEZNCRI.js +29 -0
  159. package/dist/chunk-FTEZNCRI.js.map +1 -0
  160. package/dist/{chunk-YVPC65ZJ.cjs → chunk-GF2BE4FB.cjs} +91 -32
  161. package/dist/chunk-GF2BE4FB.cjs.map +1 -0
  162. package/dist/{chunk-JEIW7BSV.cjs → chunk-GKDHMNUA.cjs} +2 -52
  163. package/dist/chunk-GKDHMNUA.cjs.map +1 -0
  164. package/dist/chunk-GM32IDVL.cjs +356 -0
  165. package/dist/chunk-GM32IDVL.cjs.map +1 -0
  166. package/dist/chunk-GVM6DTR5.js +90 -0
  167. package/dist/chunk-GVM6DTR5.js.map +1 -0
  168. package/dist/{chunk-SQHMGT4W.js → chunk-GW4RFJZ5.js} +7 -7
  169. package/dist/chunk-GW4RFJZ5.js.map +1 -0
  170. package/dist/chunk-GY5SP4ST.js +3 -0
  171. package/dist/chunk-GY5SP4ST.js.map +1 -0
  172. package/dist/chunk-H2Y7HZV5.js +3 -0
  173. package/dist/chunk-H2Y7HZV5.js.map +1 -0
  174. package/dist/chunk-H3P7POFC.cjs +337 -0
  175. package/dist/chunk-H3P7POFC.cjs.map +1 -0
  176. package/dist/{chunk-JID7AZTO.cjs → chunk-H3ROMJYI.cjs} +4 -4
  177. package/dist/{chunk-JID7AZTO.cjs.map → chunk-H3ROMJYI.cjs.map} +1 -1
  178. package/dist/{chunk-462XSCP3.cjs → chunk-HCIXGFWR.cjs} +4 -4
  179. package/dist/{chunk-462XSCP3.cjs.map → chunk-HCIXGFWR.cjs.map} +1 -1
  180. package/dist/{chunk-H4ZXMQQW.js → chunk-HDY7YQFX.js} +3 -3
  181. package/dist/{chunk-H4ZXMQQW.js.map → chunk-HDY7YQFX.js.map} +1 -1
  182. package/dist/chunk-HNFFFFYH.cjs +114 -0
  183. package/dist/chunk-HNFFFFYH.cjs.map +1 -0
  184. package/dist/chunk-HNXLLDPN.js +25 -0
  185. package/dist/chunk-HNXLLDPN.js.map +1 -0
  186. package/dist/{chunk-NV2CWBI2.cjs → chunk-IEY3ZJIT.cjs} +12 -3
  187. package/dist/chunk-IEY3ZJIT.cjs.map +1 -0
  188. package/dist/{chunk-3QEVGSFG.cjs → chunk-IGDO62KR.cjs} +5 -5
  189. package/dist/{chunk-3QEVGSFG.cjs.map → chunk-IGDO62KR.cjs.map} +1 -1
  190. package/dist/chunk-IT775BYG.js +179 -0
  191. package/dist/chunk-IT775BYG.js.map +1 -0
  192. package/dist/{chunk-N5O47VGS.cjs → chunk-IVGI353O.cjs} +2 -2
  193. package/dist/{chunk-N5O47VGS.cjs.map → chunk-IVGI353O.cjs.map} +1 -1
  194. package/dist/chunk-IWRBJHO3.cjs +51 -0
  195. package/dist/chunk-IWRBJHO3.cjs.map +1 -0
  196. package/dist/{chunk-VILW53UZ.js → chunk-JMAZ2GKT.js} +3 -3
  197. package/dist/{chunk-VILW53UZ.js.map → chunk-JMAZ2GKT.js.map} +1 -1
  198. package/dist/{chunk-WWJIW2IH.cjs → chunk-JSXIB6EJ.cjs} +4 -4
  199. package/dist/{chunk-WWJIW2IH.cjs.map → chunk-JSXIB6EJ.cjs.map} +1 -1
  200. package/dist/{chunk-KRU6IGV7.js → chunk-JUJGWUAN.js} +28 -6
  201. package/dist/chunk-JUJGWUAN.js.map +1 -0
  202. package/dist/{chunk-FXO5ARBB.cjs → chunk-KDW6BD4O.cjs} +4 -4
  203. package/dist/{chunk-FXO5ARBB.cjs.map → chunk-KDW6BD4O.cjs.map} +1 -1
  204. package/dist/{chunk-Z5V7SAZ4.js → chunk-KFEN2SRZ.js} +3 -3
  205. package/dist/{chunk-Z5V7SAZ4.js.map → chunk-KFEN2SRZ.js.map} +1 -1
  206. package/dist/{chunk-XEAT7XJG.cjs → chunk-KQ6GLYFZ.cjs} +29 -13
  207. package/dist/chunk-KQ6GLYFZ.cjs.map +1 -0
  208. package/dist/chunk-L6K4PRZK.cjs +4 -0
  209. package/dist/chunk-L6K4PRZK.cjs.map +1 -0
  210. package/dist/{chunk-7ZDPD5ZX.cjs → chunk-LC3JL2HB.cjs} +11 -7
  211. package/dist/chunk-LC3JL2HB.cjs.map +1 -0
  212. package/dist/{chunk-P7UMS4E6.cjs → chunk-LC7PVBXH.cjs} +16 -8
  213. package/dist/chunk-LC7PVBXH.cjs.map +1 -0
  214. package/dist/{chunk-Y5HFM7LO.js → chunk-LDBNUJB7.js} +5 -5
  215. package/dist/{chunk-Y5HFM7LO.js.map → chunk-LDBNUJB7.js.map} +1 -1
  216. package/dist/chunk-LRAAJRE7.cjs +2707 -0
  217. package/dist/chunk-LRAAJRE7.cjs.map +1 -0
  218. package/dist/chunk-LUPRGPKP.js +2540 -0
  219. package/dist/chunk-LUPRGPKP.js.map +1 -0
  220. package/dist/chunk-M3VPGJMV.js +283 -0
  221. package/dist/chunk-M3VPGJMV.js.map +1 -0
  222. package/dist/{chunk-VKELAMAZ.js → chunk-N54FYWG6.js} +27 -11
  223. package/dist/chunk-N54FYWG6.js.map +1 -0
  224. package/dist/chunk-N5JDL4VE.js +3 -0
  225. package/dist/chunk-N5JDL4VE.js.map +1 -0
  226. package/dist/{chunk-2QKBTPUC.cjs → chunk-NAH65KPK.cjs} +8 -8
  227. package/dist/{chunk-2QKBTPUC.cjs.map → chunk-NAH65KPK.cjs.map} +1 -1
  228. package/dist/{chunk-PYJDVWXM.js → chunk-NUB5HRKS.js} +3 -3
  229. package/dist/{chunk-PYJDVWXM.js.map → chunk-NUB5HRKS.js.map} +1 -1
  230. package/dist/{chunk-WNZAYBVB.cjs → chunk-O6BJMVGT.cjs} +48 -48
  231. package/dist/{chunk-WNZAYBVB.cjs.map → chunk-O6BJMVGT.cjs.map} +1 -1
  232. package/dist/{chunk-SVSHA7XV.js → chunk-O6XDA3SI.js} +31 -33
  233. package/dist/chunk-O6XDA3SI.js.map +1 -0
  234. package/dist/chunk-OIF34LEN.cjs +425 -0
  235. package/dist/chunk-OIF34LEN.cjs.map +1 -0
  236. package/dist/chunk-OIMXMPH2.cjs +218 -0
  237. package/dist/chunk-OIMXMPH2.cjs.map +1 -0
  238. package/dist/{chunk-J5CSLNCN.cjs → chunk-OODVC2UD.cjs} +2 -2
  239. package/dist/{chunk-J5CSLNCN.cjs.map → chunk-OODVC2UD.cjs.map} +1 -1
  240. package/dist/{chunk-ACCAXVOG.js → chunk-OSTSZDQC.js} +134 -56
  241. package/dist/chunk-OSTSZDQC.js.map +1 -0
  242. package/dist/{chunk-LL6IWKI3.js → chunk-OW3SQJ7P.js} +3 -3
  243. package/dist/{chunk-LL6IWKI3.js.map → chunk-OW3SQJ7P.js.map} +1 -1
  244. package/dist/chunk-P22YCUVM.cjs +4 -0
  245. package/dist/chunk-P22YCUVM.cjs.map +1 -0
  246. package/dist/{chunk-CEQJGUAS.js → chunk-P4E3K3ND.js} +12 -5
  247. package/dist/chunk-P4E3K3ND.js.map +1 -0
  248. package/dist/{chunk-5GUOOLPR.cjs → chunk-P5CMZZRZ.cjs} +5 -5
  249. package/dist/{chunk-5GUOOLPR.cjs.map → chunk-P5CMZZRZ.cjs.map} +1 -1
  250. package/dist/{chunk-TMMVIUUN.js → chunk-P7D7BYFE.js} +4 -4
  251. package/dist/{chunk-TMMVIUUN.js.map → chunk-P7D7BYFE.js.map} +1 -1
  252. package/dist/{chunk-3T7QGLNB.js → chunk-PJEL5ZZV.js} +4 -2
  253. package/dist/chunk-PJEL5ZZV.js.map +1 -0
  254. package/dist/chunk-PYI2IWNX.cjs +281 -0
  255. package/dist/chunk-PYI2IWNX.cjs.map +1 -0
  256. package/dist/chunk-Q3YVLO52.cjs +174 -0
  257. package/dist/chunk-Q3YVLO52.cjs.map +1 -0
  258. package/dist/{chunk-WNM7IZJ7.js → chunk-QJ2L5RU6.js} +7 -7
  259. package/dist/{chunk-WNM7IZJ7.js.map → chunk-QJ2L5RU6.js.map} +1 -1
  260. package/dist/{chunk-X4LBUPJO.cjs → chunk-QX6AAVDE.cjs} +31 -33
  261. package/dist/chunk-QX6AAVDE.cjs.map +1 -0
  262. package/dist/{chunk-UV2FVNWT.cjs → chunk-RIUQP2QS.cjs} +5 -5
  263. package/dist/{chunk-UV2FVNWT.cjs.map → chunk-RIUQP2QS.cjs.map} +1 -1
  264. package/dist/chunk-RLVYWUXG.js +115 -0
  265. package/dist/chunk-RLVYWUXG.js.map +1 -0
  266. package/dist/{chunk-22CYDCXA.js → chunk-RM2HPQIC.js} +105 -14
  267. package/dist/chunk-RM2HPQIC.js.map +1 -0
  268. package/dist/{chunk-DEDN5HAG.js → chunk-RSJGTWLM.js} +3 -3
  269. package/dist/{chunk-DEDN5HAG.js.map → chunk-RSJGTWLM.js.map} +1 -1
  270. package/dist/{chunk-6EN3IQQI.cjs → chunk-RV45J2ZT.cjs} +8 -8
  271. package/dist/{chunk-6EN3IQQI.cjs.map → chunk-RV45J2ZT.cjs.map} +1 -1
  272. package/dist/chunk-RZSSQ7AT.js +333 -0
  273. package/dist/chunk-RZSSQ7AT.js.map +1 -0
  274. package/dist/{chunk-ENKFJJZX.js → chunk-S2JZL4JC.js} +6 -6
  275. package/dist/{chunk-ENKFJJZX.js.map → chunk-S2JZL4JC.js.map} +1 -1
  276. package/dist/{chunk-ELPW32ZI.cjs → chunk-S4XCPDEO.cjs} +60 -59
  277. package/dist/chunk-S4XCPDEO.cjs.map +1 -0
  278. package/dist/{chunk-OE5CKRUC.js → chunk-SACHTD7B.js} +34 -4
  279. package/dist/chunk-SACHTD7B.js.map +1 -0
  280. package/dist/{chunk-U42F3HLE.cjs → chunk-SAGJHL2Z.cjs} +275 -5
  281. package/dist/chunk-SAGJHL2Z.cjs.map +1 -0
  282. package/dist/{chunk-VROIMIHB.cjs → chunk-SHBCUXFS.cjs} +28 -6
  283. package/dist/chunk-SHBCUXFS.cjs.map +1 -0
  284. package/dist/{chunk-RJ6NTJHC.js → chunk-SRMTRD7F.js} +3 -3
  285. package/dist/{chunk-RJ6NTJHC.js.map → chunk-SRMTRD7F.js.map} +1 -1
  286. package/dist/{chunk-IX6KFB3K.cjs → chunk-SW2E7XKY.cjs} +9 -9
  287. package/dist/{chunk-IX6KFB3K.cjs.map → chunk-SW2E7XKY.cjs.map} +1 -1
  288. package/dist/chunk-SZSRGUVO.js +402 -0
  289. package/dist/chunk-SZSRGUVO.js.map +1 -0
  290. package/dist/{chunk-NJ6MY6V5.js → chunk-T5BBZQ66.js} +3 -3
  291. package/dist/{chunk-NJ6MY6V5.js.map → chunk-T5BBZQ66.js.map} +1 -1
  292. package/dist/{chunk-JI244Y7C.js → chunk-T5NOFXOL.js} +275 -5
  293. package/dist/chunk-T5NOFXOL.js.map +1 -0
  294. package/dist/{chunk-2IZLKPUW.js → chunk-THLIL6PY.js} +3 -3
  295. package/dist/{chunk-2IZLKPUW.js.map → chunk-THLIL6PY.js.map} +1 -1
  296. package/dist/{chunk-HZ4MBUC3.js → chunk-TI3TQQ7F.js} +4 -53
  297. package/dist/chunk-TI3TQQ7F.js.map +1 -0
  298. package/dist/chunk-TVU4KB27.cjs +353 -0
  299. package/dist/chunk-TVU4KB27.cjs.map +1 -0
  300. package/dist/{chunk-5JJ2DAE4.js → chunk-TWQSMUE6.js} +7 -3
  301. package/dist/chunk-TWQSMUE6.js.map +1 -0
  302. package/dist/{chunk-TAXD5ADA.cjs → chunk-UEDTZYGI.cjs} +3 -3
  303. package/dist/{chunk-TAXD5ADA.cjs.map → chunk-UEDTZYGI.cjs.map} +1 -1
  304. package/dist/{chunk-3QGS6CXD.js → chunk-UJDWFDKE.js} +3 -3
  305. package/dist/{chunk-3QGS6CXD.js.map → chunk-UJDWFDKE.js.map} +1 -1
  306. package/dist/chunk-UNFDIBKJ.js +258 -0
  307. package/dist/chunk-UNFDIBKJ.js.map +1 -0
  308. package/dist/{chunk-UQ3VVR6A.cjs → chunk-UPWIJC6I.cjs} +3 -3
  309. package/dist/{chunk-UQ3VVR6A.cjs.map → chunk-UPWIJC6I.cjs.map} +1 -1
  310. package/dist/chunk-UTIPENPW.cjs +286 -0
  311. package/dist/chunk-UTIPENPW.cjs.map +1 -0
  312. package/dist/{chunk-S7WCHDBO.js → chunk-VCI2Y7ST.js} +3 -3
  313. package/dist/{chunk-S7WCHDBO.js.map → chunk-VCI2Y7ST.js.map} +1 -1
  314. package/dist/chunk-VEE46VTX.js +166 -0
  315. package/dist/chunk-VEE46VTX.js.map +1 -0
  316. package/dist/chunk-VFFV7EMT.cjs +188 -0
  317. package/dist/chunk-VFFV7EMT.cjs.map +1 -0
  318. package/dist/chunk-VINZZQBD.cjs +323 -0
  319. package/dist/chunk-VINZZQBD.cjs.map +1 -0
  320. package/dist/chunk-VPTASZ2O.cjs +171 -0
  321. package/dist/chunk-VPTASZ2O.cjs.map +1 -0
  322. package/dist/{chunk-P2CA3XGI.js → chunk-VSRO4PAI.js} +23 -5
  323. package/dist/chunk-VSRO4PAI.js.map +1 -0
  324. package/dist/{chunk-L6MDULYB.js → chunk-VU3ZMJBN.js} +2 -2
  325. package/dist/{chunk-L6MDULYB.js.map → chunk-VU3ZMJBN.js.map} +1 -1
  326. package/dist/{chunk-XI34EGK5.cjs → chunk-VV2U36T6.cjs} +9 -9
  327. package/dist/{chunk-XI34EGK5.cjs.map → chunk-VV2U36T6.cjs.map} +1 -1
  328. package/dist/{chunk-VPWJCJCX.cjs → chunk-VXW7D5LR.cjs} +26 -8
  329. package/dist/chunk-VXW7D5LR.cjs.map +1 -0
  330. package/dist/chunk-W3HXHIDO.cjs +2573 -0
  331. package/dist/chunk-W3HXHIDO.cjs.map +1 -0
  332. package/dist/{chunk-GOALNQZ2.js → chunk-WFBUBT54.js} +4 -83
  333. package/dist/chunk-WFBUBT54.js.map +1 -0
  334. package/dist/chunk-WFL4N5PC.js +283 -0
  335. package/dist/chunk-WFL4N5PC.js.map +1 -0
  336. package/dist/chunk-WQHBMZSC.js +295 -0
  337. package/dist/chunk-WQHBMZSC.js.map +1 -0
  338. package/dist/chunk-X3RSNAMX.js +195 -0
  339. package/dist/chunk-X3RSNAMX.js.map +1 -0
  340. package/dist/chunk-X5JOEZVR.js +525 -0
  341. package/dist/chunk-X5JOEZVR.js.map +1 -0
  342. package/dist/chunk-XBAAHOCP.js +3 -0
  343. package/dist/chunk-XBAAHOCP.js.map +1 -0
  344. package/dist/chunk-XDIMTPZU.cjs +202 -0
  345. package/dist/chunk-XDIMTPZU.cjs.map +1 -0
  346. package/dist/chunk-XDU65GLW.js +21 -0
  347. package/dist/chunk-XDU65GLW.js.map +1 -0
  348. package/dist/chunk-XI74P5F2.cjs +424 -0
  349. package/dist/chunk-XI74P5F2.cjs.map +1 -0
  350. package/dist/chunk-XNPDZANN.cjs +238 -0
  351. package/dist/chunk-XNPDZANN.cjs.map +1 -0
  352. package/dist/{chunk-WIAQQNFU.cjs → chunk-XRVMYT5G.cjs} +106 -13
  353. package/dist/chunk-XRVMYT5G.cjs.map +1 -0
  354. package/dist/chunk-XVW5DPPP.js +429 -0
  355. package/dist/chunk-XVW5DPPP.js.map +1 -0
  356. package/dist/chunk-XXA4NZUC.js +3 -0
  357. package/dist/chunk-XXA4NZUC.js.map +1 -0
  358. package/dist/chunk-Y424YL55.js +59 -0
  359. package/dist/chunk-Y424YL55.js.map +1 -0
  360. package/dist/chunk-Y4QNLW7W.js +300 -0
  361. package/dist/chunk-Y4QNLW7W.js.map +1 -0
  362. package/dist/chunk-Y7ZJZLJY.js +2657 -0
  363. package/dist/chunk-Y7ZJZLJY.js.map +1 -0
  364. package/dist/chunk-YGS2TRMP.js +38 -0
  365. package/dist/chunk-YGS2TRMP.js.map +1 -0
  366. package/dist/chunk-YUMOM3KE.js +167 -0
  367. package/dist/chunk-YUMOM3KE.js.map +1 -0
  368. package/dist/chunk-YW2AKBLS.cjs +23 -0
  369. package/dist/chunk-YW2AKBLS.cjs.map +1 -0
  370. package/dist/chunk-ZNUMOJOI.cjs +4 -0
  371. package/dist/chunk-ZNUMOJOI.cjs.map +1 -0
  372. package/dist/chunk-ZSNFL736.cjs +306 -0
  373. package/dist/chunk-ZSNFL736.cjs.map +1 -0
  374. package/dist/components/Accordion/index.cjs +2 -2
  375. package/dist/components/Accordion/index.d.cts +6 -0
  376. package/dist/components/Accordion/index.d.ts +6 -0
  377. package/dist/components/Accordion/index.js +1 -1
  378. package/dist/components/ActionPlan/index.cjs +34 -0
  379. package/dist/components/ActionPlan/index.cjs.map +1 -0
  380. package/dist/components/ActionPlan/index.d.cts +65 -0
  381. package/dist/components/ActionPlan/index.d.ts +65 -0
  382. package/dist/components/ActionPlan/index.js +21 -0
  383. package/dist/components/ActionPlan/index.js.map +1 -0
  384. package/dist/components/ActivityFeed/index.cjs +31 -0
  385. package/dist/components/ActivityFeed/index.cjs.map +1 -0
  386. package/dist/components/ActivityFeed/index.d.cts +99 -0
  387. package/dist/components/ActivityFeed/index.d.ts +99 -0
  388. package/dist/components/ActivityFeed/index.js +18 -0
  389. package/dist/components/ActivityFeed/index.js.map +1 -0
  390. package/dist/components/Alert/index.d.cts +1 -1
  391. package/dist/components/Alert/index.d.ts +1 -1
  392. package/dist/components/AlertDialog/index.cjs +19 -5
  393. package/dist/components/AlertDialog/index.d.cts +94 -16
  394. package/dist/components/AlertDialog/index.d.ts +94 -16
  395. package/dist/components/AlertDialog/index.js +6 -4
  396. package/dist/components/AssociationList/index.cjs +29 -0
  397. package/dist/components/AssociationList/index.cjs.map +1 -0
  398. package/dist/components/AssociationList/index.d.cts +50 -0
  399. package/dist/components/AssociationList/index.d.ts +50 -0
  400. package/dist/components/AssociationList/index.js +16 -0
  401. package/dist/components/AssociationList/index.js.map +1 -0
  402. package/dist/components/AudioRecorder/index.d.cts +2 -2
  403. package/dist/components/AudioRecorder/index.d.ts +2 -2
  404. package/dist/components/Autocomplete/index.d.cts +8 -2
  405. package/dist/components/Autocomplete/index.d.ts +8 -2
  406. package/dist/components/Avatar/index.cjs +9 -7
  407. package/dist/components/Avatar/index.d.cts +46 -15
  408. package/dist/components/Avatar/index.d.ts +46 -15
  409. package/dist/components/Avatar/index.js +3 -1
  410. package/dist/components/AvatarGroup/index.cjs +20 -0
  411. package/dist/components/AvatarGroup/index.cjs.map +1 -0
  412. package/dist/components/AvatarGroup/index.d.cts +57 -0
  413. package/dist/components/AvatarGroup/index.d.ts +57 -0
  414. package/dist/components/AvatarGroup/index.js +7 -0
  415. package/dist/components/AvatarGroup/index.js.map +1 -0
  416. package/dist/components/Badge/index.cjs +3 -3
  417. package/dist/components/Badge/index.d.cts +16 -2
  418. package/dist/components/Badge/index.d.ts +16 -2
  419. package/dist/components/Badge/index.js +1 -1
  420. package/dist/components/BoardView/index.cjs +24 -0
  421. package/dist/components/BoardView/index.cjs.map +1 -0
  422. package/dist/components/BoardView/index.d.cts +41 -0
  423. package/dist/components/BoardView/index.d.ts +41 -0
  424. package/dist/components/BoardView/index.js +7 -0
  425. package/dist/components/BoardView/index.js.map +1 -0
  426. package/dist/components/Button/index.cjs +5 -3
  427. package/dist/components/Button/index.d.cts +2 -1
  428. package/dist/components/Button/index.d.ts +2 -1
  429. package/dist/components/Button/index.js +3 -1
  430. package/dist/components/CalendarHeatmap/index.cjs +18 -0
  431. package/dist/components/CalendarHeatmap/index.cjs.map +1 -0
  432. package/dist/components/CalendarHeatmap/index.d.cts +47 -0
  433. package/dist/components/CalendarHeatmap/index.d.ts +47 -0
  434. package/dist/components/CalendarHeatmap/index.js +5 -0
  435. package/dist/components/CalendarHeatmap/index.js.map +1 -0
  436. package/dist/components/CalendarView/index.cjs +24 -0
  437. package/dist/components/CalendarView/index.cjs.map +1 -0
  438. package/dist/components/CalendarView/index.d.cts +39 -0
  439. package/dist/components/CalendarView/index.d.ts +39 -0
  440. package/dist/components/CalendarView/index.js +11 -0
  441. package/dist/components/CalendarView/index.js.map +1 -0
  442. package/dist/components/Card/index.d.cts +3 -3
  443. package/dist/components/Card/index.d.ts +3 -3
  444. package/dist/components/ClampedText/index.cjs +3 -2
  445. package/dist/components/ClampedText/index.js +2 -1
  446. package/dist/components/CollabStatus/index.cjs +6 -4
  447. package/dist/components/CollabStatus/index.d.cts +11 -0
  448. package/dist/components/CollabStatus/index.d.ts +11 -0
  449. package/dist/components/CollabStatus/index.js +3 -1
  450. package/dist/components/Collapsible/index.cjs +6 -6
  451. package/dist/components/Collapsible/index.d.cts +6 -0
  452. package/dist/components/Collapsible/index.d.ts +6 -0
  453. package/dist/components/Collapsible/index.js +3 -3
  454. package/dist/components/CompletenessMeter/index.cjs +23 -0
  455. package/dist/components/CompletenessMeter/index.cjs.map +1 -0
  456. package/dist/components/CompletenessMeter/index.d.cts +52 -0
  457. package/dist/components/CompletenessMeter/index.d.ts +52 -0
  458. package/dist/components/CompletenessMeter/index.js +6 -0
  459. package/dist/components/CompletenessMeter/index.js.map +1 -0
  460. package/dist/components/CountryCodeDropdown/index.cjs +5 -5
  461. package/dist/components/CountryCodeDropdown/index.js +2 -2
  462. package/dist/components/CustomizableDashboard/index.cjs +12 -10
  463. package/dist/components/CustomizableDashboard/index.js +5 -3
  464. package/dist/components/DateInput/index.d.cts +36 -4
  465. package/dist/components/DateInput/index.d.ts +36 -4
  466. package/dist/components/Dropdown/index.cjs +11 -10
  467. package/dist/components/Dropdown/index.d.cts +2 -1
  468. package/dist/components/Dropdown/index.d.ts +2 -1
  469. package/dist/components/Dropdown/index.js +4 -3
  470. package/dist/components/EmailEditor/index.cjs +67 -0
  471. package/dist/components/EmailEditor/index.cjs.map +1 -0
  472. package/dist/components/EmailEditor/index.d.cts +347 -0
  473. package/dist/components/EmailEditor/index.d.ts +347 -0
  474. package/dist/components/EmailEditor/index.js +26 -0
  475. package/dist/components/EmailEditor/index.js.map +1 -0
  476. package/dist/components/FieldHistory/index.cjs +34 -0
  477. package/dist/components/FieldHistory/index.cjs.map +1 -0
  478. package/dist/components/FieldHistory/index.d.cts +66 -0
  479. package/dist/components/FieldHistory/index.d.ts +66 -0
  480. package/dist/components/FieldHistory/index.js +21 -0
  481. package/dist/components/FieldHistory/index.js.map +1 -0
  482. package/dist/components/FloatingWindow/index.cjs +6 -4
  483. package/dist/components/FloatingWindow/index.js +4 -2
  484. package/dist/components/GanttView/index.cjs +20 -0
  485. package/dist/components/GanttView/index.cjs.map +1 -0
  486. package/dist/components/GanttView/index.d.cts +36 -0
  487. package/dist/components/GanttView/index.d.ts +36 -0
  488. package/dist/components/GanttView/index.js +7 -0
  489. package/dist/components/GanttView/index.js.map +1 -0
  490. package/dist/components/GlossaryTooltip/index.cjs +3 -3
  491. package/dist/components/GlossaryTooltip/index.js +2 -2
  492. package/dist/components/InlineEdit/index.cjs +20 -0
  493. package/dist/components/InlineEdit/index.cjs.map +1 -0
  494. package/dist/components/InlineEdit/index.d.cts +56 -0
  495. package/dist/components/InlineEdit/index.d.ts +56 -0
  496. package/dist/components/InlineEdit/index.js +7 -0
  497. package/dist/components/InlineEdit/index.js.map +1 -0
  498. package/dist/components/KeyboardShortcutsOverlay/index.cjs +5 -5
  499. package/dist/components/KeyboardShortcutsOverlay/index.js +3 -3
  500. package/dist/components/ListView/index.cjs +24 -0
  501. package/dist/components/ListView/index.cjs.map +1 -0
  502. package/dist/components/ListView/index.d.cts +124 -0
  503. package/dist/components/ListView/index.d.ts +124 -0
  504. package/dist/components/ListView/index.js +11 -0
  505. package/dist/components/ListView/index.js.map +1 -0
  506. package/dist/components/LogoUploader/index.cjs +18 -0
  507. package/dist/components/LogoUploader/index.cjs.map +1 -0
  508. package/dist/components/LogoUploader/index.d.cts +49 -0
  509. package/dist/components/LogoUploader/index.d.ts +49 -0
  510. package/dist/components/LogoUploader/index.js +5 -0
  511. package/dist/components/LogoUploader/index.js.map +1 -0
  512. package/dist/components/Markdown/index.cjs +21 -19
  513. package/dist/components/Markdown/index.js +9 -7
  514. package/dist/components/MediaEditor/index.cjs +16 -14
  515. package/dist/components/MediaEditor/index.d.cts +91 -2
  516. package/dist/components/MediaEditor/index.d.ts +91 -2
  517. package/dist/components/MediaEditor/index.js +11 -9
  518. package/dist/components/MediaFeed/index.cjs +29 -0
  519. package/dist/components/MediaFeed/index.cjs.map +1 -0
  520. package/dist/components/MediaFeed/index.d.cts +104 -0
  521. package/dist/components/MediaFeed/index.d.ts +104 -0
  522. package/dist/components/MediaFeed/index.js +20 -0
  523. package/dist/components/MediaFeed/index.js.map +1 -0
  524. package/dist/components/MediaPlayer/index.cjs +8 -6
  525. package/dist/components/MediaPlayer/index.d.cts +19 -1
  526. package/dist/components/MediaPlayer/index.d.ts +19 -1
  527. package/dist/components/MediaPlayer/index.js +5 -3
  528. package/dist/components/MegaMenu/index.cjs +7 -5
  529. package/dist/components/MegaMenu/index.js +4 -2
  530. package/dist/components/Modal/index.cjs +10 -10
  531. package/dist/components/Modal/index.js +2 -2
  532. package/dist/components/Pagination/index.d.cts +1 -1
  533. package/dist/components/Pagination/index.d.ts +1 -1
  534. package/dist/components/PhiMask/index.cjs +18 -0
  535. package/dist/components/PhiMask/index.cjs.map +1 -0
  536. package/dist/components/PhiMask/index.d.cts +45 -0
  537. package/dist/components/PhiMask/index.d.ts +45 -0
  538. package/dist/components/PhiMask/index.js +5 -0
  539. package/dist/components/PhiMask/index.js.map +1 -0
  540. package/dist/components/Progress/index.cjs +6 -6
  541. package/dist/components/Progress/index.d.cts +8 -2
  542. package/dist/components/Progress/index.d.ts +8 -2
  543. package/dist/components/Progress/index.js +1 -1
  544. package/dist/components/PropertyList/index.cjs +25 -0
  545. package/dist/components/PropertyList/index.cjs.map +1 -0
  546. package/dist/components/PropertyList/index.d.cts +87 -0
  547. package/dist/components/PropertyList/index.d.ts +87 -0
  548. package/dist/components/PropertyList/index.js +12 -0
  549. package/dist/components/PropertyList/index.js.map +1 -0
  550. package/dist/components/Q/index.d.cts +2 -2
  551. package/dist/components/Q/index.d.ts +2 -2
  552. package/dist/components/QuickAction/index.d.cts +1 -1
  553. package/dist/components/QuickAction/index.d.ts +1 -1
  554. package/dist/components/RadialExplorer/index.cjs +7 -5
  555. package/dist/components/RadialExplorer/index.js +6 -4
  556. package/dist/components/Rating/index.cjs +28 -0
  557. package/dist/components/Rating/index.cjs.map +1 -0
  558. package/dist/components/Rating/index.d.cts +85 -0
  559. package/dist/components/Rating/index.d.ts +85 -0
  560. package/dist/components/Rating/index.js +7 -0
  561. package/dist/components/Rating/index.js.map +1 -0
  562. package/dist/components/RecordButton/index.d.cts +1 -1
  563. package/dist/components/RecordButton/index.d.ts +1 -1
  564. package/dist/components/RecordHeader/index.cjs +29 -0
  565. package/dist/components/RecordHeader/index.cjs.map +1 -0
  566. package/dist/components/RecordHeader/index.d.cts +96 -0
  567. package/dist/components/RecordHeader/index.d.ts +96 -0
  568. package/dist/components/RecordHeader/index.js +16 -0
  569. package/dist/components/RecordHeader/index.js.map +1 -0
  570. package/dist/components/RecordLayout/index.cjs +21 -0
  571. package/dist/components/RecordLayout/index.cjs.map +1 -0
  572. package/dist/components/RecordLayout/index.d.cts +40 -0
  573. package/dist/components/RecordLayout/index.d.ts +40 -0
  574. package/dist/components/RecordLayout/index.js +8 -0
  575. package/dist/components/RecordLayout/index.js.map +1 -0
  576. package/dist/components/RichTextEditor/index.cjs +11 -8
  577. package/dist/components/RichTextEditor/index.d.cts +12 -2
  578. package/dist/components/RichTextEditor/index.d.ts +12 -2
  579. package/dist/components/RichTextEditor/index.js +8 -5
  580. package/dist/components/ScrollArea/index.d.cts +1 -1
  581. package/dist/components/ScrollArea/index.d.ts +1 -1
  582. package/dist/components/SectionSpyNav/index.cjs +5 -3
  583. package/dist/components/SectionSpyNav/index.js +4 -2
  584. package/dist/components/Select/index.cjs +4 -4
  585. package/dist/components/Select/index.d.cts +2 -2
  586. package/dist/components/Select/index.d.ts +2 -2
  587. package/dist/components/Select/index.js +2 -2
  588. package/dist/components/Skeleton/index.d.cts +1 -1
  589. package/dist/components/Skeleton/index.d.ts +1 -1
  590. package/dist/components/Slider/index.d.cts +2 -2
  591. package/dist/components/Slider/index.d.ts +2 -2
  592. package/dist/components/SliderCalculator/index.cjs +4 -4
  593. package/dist/components/SliderCalculator/index.js +2 -2
  594. package/dist/components/SourceTip/index.cjs +3 -3
  595. package/dist/components/SourceTip/index.js +2 -2
  596. package/dist/components/Spinner/index.d.cts +2 -2
  597. package/dist/components/Spinner/index.d.ts +2 -2
  598. package/dist/components/SuperChat/index.cjs +1300 -713
  599. package/dist/components/SuperChat/index.cjs.map +1 -1
  600. package/dist/components/SuperChat/index.d.cts +126 -8
  601. package/dist/components/SuperChat/index.d.ts +126 -8
  602. package/dist/components/SuperChat/index.js +1404 -817
  603. package/dist/components/SuperChat/index.js.map +1 -1
  604. package/dist/components/SuperChat/plugins/index.cjs +7 -6
  605. package/dist/components/SuperChat/plugins/index.cjs.map +1 -1
  606. package/dist/components/SuperChat/plugins/index.d.cts +2 -3
  607. package/dist/components/SuperChat/plugins/index.d.ts +2 -3
  608. package/dist/components/SuperChat/plugins/index.js +6 -5
  609. package/dist/components/SuperChat/plugins/index.js.map +1 -1
  610. package/dist/components/Tabs/index.cjs +9 -7
  611. package/dist/components/Tabs/index.d.cts +12 -1
  612. package/dist/components/Tabs/index.d.ts +12 -1
  613. package/dist/components/Tabs/index.js +3 -1
  614. package/dist/components/TagEditor/index.cjs +22 -0
  615. package/dist/components/TagEditor/index.cjs.map +1 -0
  616. package/dist/components/TagEditor/index.d.cts +46 -0
  617. package/dist/components/TagEditor/index.d.ts +46 -0
  618. package/dist/components/TagEditor/index.js +9 -0
  619. package/dist/components/TagEditor/index.js.map +1 -0
  620. package/dist/components/Text/index.d.cts +3 -3
  621. package/dist/components/Text/index.d.ts +3 -3
  622. package/dist/components/Textarea/index.d.cts +2 -2
  623. package/dist/components/Textarea/index.d.ts +2 -2
  624. package/dist/components/ThemeProvider/index.cjs +9 -9
  625. package/dist/components/ThemeProvider/index.d.cts +3 -1
  626. package/dist/components/ThemeProvider/index.d.ts +3 -1
  627. package/dist/components/ThemeProvider/index.js +3 -3
  628. package/dist/components/Tooltip/index.cjs +3 -3
  629. package/dist/components/Tooltip/index.js +2 -2
  630. package/dist/components/TranscriptView/index.d.cts +85 -4
  631. package/dist/components/TranscriptView/index.d.ts +85 -4
  632. package/dist/components/UserPicker/index.cjs +24 -0
  633. package/dist/components/UserPicker/index.cjs.map +1 -0
  634. package/dist/components/UserPicker/index.d.cts +60 -0
  635. package/dist/components/UserPicker/index.d.ts +60 -0
  636. package/dist/components/UserPicker/index.js +11 -0
  637. package/dist/components/UserPicker/index.js.map +1 -0
  638. package/dist/components/VideoCard/index.cjs +4 -4
  639. package/dist/components/VideoCard/index.js +2 -2
  640. package/dist/components/ViewSet/index.cjs +25 -0
  641. package/dist/components/ViewSet/index.cjs.map +1 -0
  642. package/dist/components/ViewSet/index.d.cts +201 -0
  643. package/dist/components/ViewSet/index.d.ts +201 -0
  644. package/dist/components/ViewSet/index.js +16 -0
  645. package/dist/components/ViewSet/index.js.map +1 -0
  646. package/dist/components/ViewSwitcher/index.cjs +20 -0
  647. package/dist/components/ViewSwitcher/index.cjs.map +1 -0
  648. package/dist/components/ViewSwitcher/index.d.cts +39 -0
  649. package/dist/components/ViewSwitcher/index.d.ts +39 -0
  650. package/dist/components/ViewSwitcher/index.js +7 -0
  651. package/dist/components/ViewSwitcher/index.js.map +1 -0
  652. package/dist/datavis.cjs +6 -4
  653. package/dist/datavis.cjs.map +1 -1
  654. package/dist/datavis.d.cts +167 -13
  655. package/dist/datavis.d.ts +167 -13
  656. package/dist/datavis.js +4 -2
  657. package/dist/datavis.js.map +1 -1
  658. package/dist/deck.cjs +3360 -0
  659. package/dist/deck.cjs.map +1 -0
  660. package/dist/deck.d.cts +712 -0
  661. package/dist/deck.d.ts +712 -0
  662. package/dist/deck.js +3316 -0
  663. package/dist/deck.js.map +1 -0
  664. package/dist/esheet.cjs +19 -16
  665. package/dist/esheet.cjs.map +1 -1
  666. package/dist/esheet.d.cts +183 -1
  667. package/dist/esheet.d.ts +183 -1
  668. package/dist/esheet.js +16 -13
  669. package/dist/esheet.js.map +1 -1
  670. package/dist/globe.cjs +2 -2
  671. package/dist/globe.js +1 -1
  672. package/dist/hooks/index.cjs +94 -35
  673. package/dist/hooks/index.d.cts +680 -36
  674. package/dist/hooks/index.d.ts +680 -36
  675. package/dist/hooks/index.js +10 -7
  676. package/dist/icons-wBacj6BW.d.cts +142 -0
  677. package/dist/icons-wBacj6BW.d.ts +142 -0
  678. package/dist/index.cjs +2152 -1276
  679. package/dist/index.cjs.map +1 -1
  680. package/dist/index.d.cts +10375 -626
  681. package/dist/index.d.ts +10375 -626
  682. package/dist/index.js +740 -313
  683. package/dist/index.js.map +1 -1
  684. package/dist/kerebron.cjs +58 -19
  685. package/dist/kerebron.cjs.map +1 -1
  686. package/dist/kerebron.css +115 -0
  687. package/dist/kerebron.d.cts +37 -0
  688. package/dist/kerebron.d.ts +37 -0
  689. package/dist/kerebron.js +58 -19
  690. package/dist/kerebron.js.map +1 -1
  691. package/dist/maps.cjs +160 -0
  692. package/dist/maps.cjs.map +1 -0
  693. package/dist/maps.d.cts +42 -0
  694. package/dist/maps.d.ts +42 -0
  695. package/dist/maps.js +138 -0
  696. package/dist/maps.js.map +1 -0
  697. package/dist/motion.cjs +7 -7
  698. package/dist/motion.d.cts +186 -2
  699. package/dist/motion.d.ts +186 -2
  700. package/dist/motion.js +2 -2
  701. package/dist/org-chart.cjs +1302 -0
  702. package/dist/org-chart.cjs.map +1 -0
  703. package/dist/org-chart.d.cts +164 -0
  704. package/dist/org-chart.d.ts +164 -0
  705. package/dist/org-chart.js +1277 -0
  706. package/dist/org-chart.js.map +1 -0
  707. package/dist/q.d.cts +25 -3
  708. package/dist/q.d.ts +25 -3
  709. package/dist/styles/effects.css +133 -0
  710. package/dist/styles/init.css +22 -3
  711. package/dist/styles.css +1 -1
  712. package/dist/tailwind-preset.cjs +4 -4
  713. package/dist/tailwind-preset.js +1 -1
  714. package/dist/templates.cjs +156 -0
  715. package/dist/templates.cjs.map +1 -0
  716. package/dist/templates.d.cts +734 -0
  717. package/dist/templates.d.ts +734 -0
  718. package/dist/templates.js +11 -0
  719. package/dist/templates.js.map +1 -0
  720. package/dist/types-CDeBNZiE.d.cts +92 -0
  721. package/dist/types-CDeBNZiE.d.ts +92 -0
  722. package/dist/types-Cx1FHLq2.d.cts +548 -0
  723. package/dist/types-Cx1FHLq2.d.ts +548 -0
  724. package/dist/types-DsdZvEI1.d.cts +92 -0
  725. package/dist/types-DsdZvEI1.d.ts +92 -0
  726. package/dist/utils/index.cjs +9 -9
  727. package/dist/utils/index.d.cts +13 -2
  728. package/dist/utils/index.d.ts +13 -2
  729. package/dist/utils/index.js +1 -1
  730. package/package.json +82 -13
  731. package/dist/Animated-XmH6k8pZ.d.cts +0 -188
  732. package/dist/Animated-XmH6k8pZ.d.ts +0 -188
  733. package/dist/CsvBlock-ROJCKJDP.cjs +0 -16
  734. package/dist/CsvBlock-UWPMTLE2.js +0 -7
  735. package/dist/HtmlPreviewBlock-DWFN6EUB.cjs +0 -16
  736. package/dist/HtmlPreviewBlock-ME5U3XNS.js +0 -7
  737. package/dist/MedicationEditor-Bp4NLy7y.d.cts +0 -352
  738. package/dist/MedicationEditor-Bp4NLy7y.d.ts +0 -352
  739. package/dist/MermaidBlock-2B6CPD6Y.js +0 -7
  740. package/dist/MermaidBlock-D2UC5M55.cjs +0 -16
  741. package/dist/SurveyBlock-4CD4AYMJ.cjs +0 -16
  742. package/dist/SurveyBlock-4DO62RBT.js +0 -7
  743. package/dist/chunk-22CYDCXA.js.map +0 -1
  744. package/dist/chunk-2YCERQWC.js.map +0 -1
  745. package/dist/chunk-3T7QGLNB.js.map +0 -1
  746. package/dist/chunk-5JJ2DAE4.js.map +0 -1
  747. package/dist/chunk-6HFFWEM3.cjs +0 -22
  748. package/dist/chunk-6HFFWEM3.cjs.map +0 -1
  749. package/dist/chunk-7ZDPD5ZX.cjs.map +0 -1
  750. package/dist/chunk-7ZVTLTJF.js +0 -109
  751. package/dist/chunk-7ZVTLTJF.js.map +0 -1
  752. package/dist/chunk-ACCAXVOG.js.map +0 -1
  753. package/dist/chunk-BMSG4NBH.js +0 -56
  754. package/dist/chunk-BMSG4NBH.js.map +0 -1
  755. package/dist/chunk-CEQJGUAS.js.map +0 -1
  756. package/dist/chunk-DVOQ3JNO.js.map +0 -1
  757. package/dist/chunk-E4IBHYJ7.cjs +0 -80
  758. package/dist/chunk-E4IBHYJ7.cjs.map +0 -1
  759. package/dist/chunk-ELPW32ZI.cjs.map +0 -1
  760. package/dist/chunk-GD7EBGC4.cjs.map +0 -1
  761. package/dist/chunk-GOALNQZ2.js.map +0 -1
  762. package/dist/chunk-HB7C7NB5.js +0 -20
  763. package/dist/chunk-HB7C7NB5.js.map +0 -1
  764. package/dist/chunk-HZ4MBUC3.js.map +0 -1
  765. package/dist/chunk-JEIW7BSV.cjs.map +0 -1
  766. package/dist/chunk-JHULS3EC.js +0 -130
  767. package/dist/chunk-JHULS3EC.js.map +0 -1
  768. package/dist/chunk-JI244Y7C.js.map +0 -1
  769. package/dist/chunk-JYZW2PZS.cjs.map +0 -1
  770. package/dist/chunk-KRU6IGV7.js.map +0 -1
  771. package/dist/chunk-NV2CWBI2.cjs.map +0 -1
  772. package/dist/chunk-OE5CKRUC.js.map +0 -1
  773. package/dist/chunk-P2CA3XGI.js.map +0 -1
  774. package/dist/chunk-P7UMS4E6.cjs.map +0 -1
  775. package/dist/chunk-SQHMGT4W.js.map +0 -1
  776. package/dist/chunk-SVSHA7XV.js.map +0 -1
  777. package/dist/chunk-U42F3HLE.cjs.map +0 -1
  778. package/dist/chunk-VKELAMAZ.js.map +0 -1
  779. package/dist/chunk-VNYW4C4J.cjs.map +0 -1
  780. package/dist/chunk-VOKVG3ER.js +0 -78
  781. package/dist/chunk-VOKVG3ER.js.map +0 -1
  782. package/dist/chunk-VPIYTQCV.cjs.map +0 -1
  783. package/dist/chunk-VPWJCJCX.cjs.map +0 -1
  784. package/dist/chunk-VROIMIHB.cjs.map +0 -1
  785. package/dist/chunk-WIAQQNFU.cjs.map +0 -1
  786. package/dist/chunk-WNAA6CLE.cjs +0 -143
  787. package/dist/chunk-WNAA6CLE.cjs.map +0 -1
  788. package/dist/chunk-WNJRS7Y7.cjs.map +0 -1
  789. package/dist/chunk-X4LBUPJO.cjs.map +0 -1
  790. package/dist/chunk-X4XPNTCZ.cjs.map +0 -1
  791. package/dist/chunk-XCP454Q6.js.map +0 -1
  792. package/dist/chunk-XEAT7XJG.cjs.map +0 -1
  793. package/dist/chunk-YVL3XATO.cjs +0 -79
  794. package/dist/chunk-YVL3XATO.cjs.map +0 -1
  795. package/dist/chunk-YVPC65ZJ.cjs.map +0 -1
  796. package/dist/html-MdxqSzjD.d.cts +0 -13
  797. package/dist/html-MdxqSzjD.d.ts +0 -13
  798. package/dist/orderRows-BUJYgSc7.d.cts +0 -221
  799. package/dist/orderRows-BUJYgSc7.d.ts +0 -221
  800. package/dist/transcript-Cg7uSW-C.d.cts +0 -84
  801. package/dist/transcript-Cg7uSW-C.d.ts +0 -84
  802. package/dist/types-B97JNRNQ.d.cts +0 -251
  803. package/dist/types-CnPEwzlp.d.cts +0 -254
  804. package/dist/types-CnPEwzlp.d.ts +0 -254
  805. package/dist/types-gZXrfLj6.d.ts +0 -251
  806. package/dist/useAnchoredPosition-CKwLSQW8.d.cts +0 -76
  807. package/dist/useAnchoredPosition-CKwLSQW8.d.ts +0 -76
  808. package/dist/useTheme-B9SWu6ui.d.cts +0 -24
  809. package/dist/useTheme-B9SWu6ui.d.ts +0 -24
  810. package/dist/useTranscriptEdits-CGzlemHT.d.cts +0 -182
  811. package/dist/useTranscriptEdits-D32bLs0l.d.ts +0 -182
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/components/SectionSpyNav/SectionSpyNav.tsx"],"names":["ArrowDown","ArrowRight","ArrowUpRight","jsx","React","useScrollSpy","cn","jsxs","buttonVariants"],"mappings":"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","file":"chunk-FXO5ARBB.cjs","sourcesContent":["'use client';\n\nimport * as React from 'react';\nimport { ArrowDown, ArrowRight, ArrowUpRight } from 'lucide-react';\nimport { cn } from '../../utils/cn';\nimport { useScrollSpy } from '../../hooks/useScrollSpy';\nimport { buttonVariants } from '../Button';\n\n// =============================================================================\n// Types\n// =============================================================================\n\n/** One section the nav links to. The id must match a `section[id]` on the page. */\nexport interface SectionSpyItem {\n id: string;\n label: string;\n}\n\n/**\n * Funnel intent for the bar's single contextual CTA — drives its visual\n * weight so the in-page strip never out-shouts a page's primary CTA:\n * `explore` (quiet next step) → `evaluate` (sales-ready ask) → `commit`\n * (high-intent action).\n */\nexport type SectionSpyCtaTier = 'explore' | 'evaluate' | 'commit';\n\nexport interface SectionSpyCta {\n label: string;\n href: string;\n tier?: SectionSpyCtaTier;\n}\n\nexport interface SectionSpyNavProps {\n /** Sections to link to, in page order. */\n items: SectionSpyItem[];\n /** Optional single page-specific next-step CTA at the end of the bar. */\n cta?: SectionSpyCta;\n /** Eyebrow before the links (default \"On this page\"). */\n label?: string;\n /**\n * Visual tone: `surface` sits on the page background; `brand` renders the\n * inverted primary band.\n */\n tone?: 'surface' | 'brand';\n /** IntersectionObserver root margin tuning for the scroll spy. */\n rootMargin?: string;\n /** Called with the section id when a nav link is clicked. */\n onItemClick?: (id: string) => void;\n /** Called when the CTA is clicked (e.g. for analytics). */\n onCtaClick?: (cta: SectionSpyCta) => void;\n className?: string;\n}\n\n// =============================================================================\n// Internals\n// =============================================================================\n\n/** Directional glyph inferred from the destination. */\nfunction CtaArrow({ href }: { href: string }) {\n const Icon = href.startsWith('#')\n ? ArrowDown\n : href.startsWith('/')\n ? ArrowRight\n : ArrowUpRight;\n // rtl:-scale-x-100 mirrors ArrowRight and ArrowUpRight for RTL reading\n // direction; ArrowDown is horizontally symmetric so the flip is a no-op.\n return <Icon aria-hidden=\"true\" className=\"h-3.5 w-3.5 rtl:-scale-x-100\" />;\n}\n\nconst CTA_TIER_VARIANT = {\n explore: 'ghost',\n evaluate: 'outline',\n commit: 'primary',\n} as const;\n\n// =============================================================================\n// SectionSpyNav\n// =============================================================================\n\n/**\n * Sticky horizontal in-page wayfinding: jumps between a page's major\n * sections, highlights the one in view with a sliding underline, and can\n * carry a single page-specific next-step CTA. Pure anchor links, so it\n * still works if the scroll spy never runs.\n *\n * The horizontal complement to `TableOfContents` — use that for a sidebar\n * outline, this for a band under the page header. Section elements need\n * matching `id`s.\n *\n * @example\n * ```tsx\n * <SectionSpyNav\n * items={[\n * { id: 'overview', label: 'Overview' },\n * { id: 'pricing', label: 'Pricing' },\n * ]}\n * cta={{ label: 'Book a demo', href: '/demo', tier: 'evaluate' }}\n * />\n * ```\n */\nexport function SectionSpyNav({\n items,\n cta,\n label = 'On this page',\n tone = 'surface',\n rootMargin = '-22% 0px -68% 0px',\n onItemClick,\n onCtaClick,\n className,\n}: SectionSpyNavProps) {\n const ids = React.useMemo(() => items.map((it) => it.id), [items]);\n const { activeId } = useScrollSpy({ ids, rootMargin });\n const active = activeId ?? items[0]?.id ?? '';\n\n const railRef = React.useRef<HTMLDivElement>(null);\n const markRef = React.useRef<HTMLSpanElement>(null);\n\n // Find the active link by dataset rather than a CSS selector, so ids\n // never need escaping and CSS.escape availability doesn't matter.\n const findActiveLink = React.useCallback((): HTMLAnchorElement | null => {\n const links = railRef.current?.querySelectorAll<HTMLAnchorElement>('a');\n if (!links) return null;\n for (const link of links) {\n if (link.dataset.id === active) return link;\n }\n return null;\n }, [active]);\n\n // Slide the underline beneath the active link. offsetLeft/offsetWidth are\n // physical and measured against the rail, so the marker tracks the link\n // in both directions and while the rail is scrolled horizontally.\n const syncMarker = React.useCallback(() => {\n const link = findActiveLink();\n const mark = markRef.current;\n if (!link || !mark) return;\n mark.style.left = `${link.offsetLeft}px`;\n mark.style.width = `${link.offsetWidth}px`;\n }, [findActiveLink]);\n\n React.useEffect(() => {\n const link = findActiveLink();\n link?.scrollIntoView?.({ inline: 'center', block: 'nearest' });\n syncMarker();\n }, [findActiveLink, syncMarker]);\n\n React.useEffect(() => {\n window.addEventListener('resize', syncMarker);\n return () => window.removeEventListener('resize', syncMarker);\n }, [syncMarker]);\n\n const brand = tone === 'brand';\n\n return (\n <nav\n className={cn(\n 'sticky top-0 z-30 w-full',\n brand\n ? 'bg-primary-900 text-white'\n : 'border-border bg-card/95 border-b backdrop-blur',\n className\n )}\n aria-label={label}\n >\n <div className=\"flex items-center gap-4 px-4 py-0.5\">\n <span\n className={cn(\n 'shrink-0 text-[11px] font-semibold tracking-wide uppercase max-md:hidden',\n brand ? 'text-white/85' : 'text-muted-foreground'\n )}\n aria-hidden=\"true\"\n >\n {label}\n </span>\n <div\n ref={railRef}\n className=\"relative flex min-w-0 flex-1 gap-1 overflow-x-auto [scrollbar-width:none] [&::-webkit-scrollbar]:hidden\"\n >\n {items.map((it) => {\n const isActive = active === it.id;\n return (\n <a\n key={it.id}\n href={`#${it.id}`}\n data-id={it.id}\n onClick={() => onItemClick?.(it.id)}\n className={cn(\n 'shrink-0 rounded px-2.5 py-2 text-sm whitespace-nowrap transition-colors',\n brand\n ? isActive\n ? 'font-semibold text-white'\n : 'text-white/85 hover:text-white'\n : isActive\n ? 'text-foreground font-semibold'\n : 'text-muted-foreground hover:text-foreground'\n )}\n aria-current={isActive ? 'location' : undefined}\n >\n {it.label}\n </a>\n );\n })}\n <span\n ref={markRef}\n className={cn(\n 'absolute bottom-0 h-0.5 rounded-full transition-[left,width] duration-300',\n brand ? 'bg-primary-400' : 'bg-primary-500'\n )}\n aria-hidden=\"true\"\n />\n </div>\n {cta && (\n <a\n href={cta.href}\n onClick={() => onCtaClick?.(cta)}\n className={cn(\n buttonVariants({\n variant: CTA_TIER_VARIANT[cta.tier ?? 'explore'],\n size: 'sm',\n }),\n 'shrink-0',\n brand &&\n (cta.tier ?? 'explore') !== 'commit' &&\n 'text-white hover:bg-white/10 hover:text-white'\n )}\n >\n {cta.label}\n <CtaArrow href={cta.href} />\n </a>\n )}\n </div>\n </nav>\n );\n}\n"]}
1
+ {"version":3,"sources":["../src/components/SectionSpyNav/SectionSpyNav.tsx"],"names":["ArrowDown","ArrowRight","ArrowUpRight","jsx","React","useScrollSpy","cn","jsxs","buttonVariants"],"mappings":"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","file":"chunk-KDW6BD4O.cjs","sourcesContent":["'use client';\n\nimport * as React from 'react';\nimport { ArrowDown, ArrowRight, ArrowUpRight } from 'lucide-react';\nimport { cn } from '../../utils/cn';\nimport { useScrollSpy } from '../../hooks/useScrollSpy';\nimport { buttonVariants } from '../Button';\n\n// =============================================================================\n// Types\n// =============================================================================\n\n/** One section the nav links to. The id must match a `section[id]` on the page. */\nexport interface SectionSpyItem {\n id: string;\n label: string;\n}\n\n/**\n * Funnel intent for the bar's single contextual CTA — drives its visual\n * weight so the in-page strip never out-shouts a page's primary CTA:\n * `explore` (quiet next step) → `evaluate` (sales-ready ask) → `commit`\n * (high-intent action).\n */\nexport type SectionSpyCtaTier = 'explore' | 'evaluate' | 'commit';\n\nexport interface SectionSpyCta {\n label: string;\n href: string;\n tier?: SectionSpyCtaTier;\n}\n\nexport interface SectionSpyNavProps {\n /** Sections to link to, in page order. */\n items: SectionSpyItem[];\n /** Optional single page-specific next-step CTA at the end of the bar. */\n cta?: SectionSpyCta;\n /** Eyebrow before the links (default \"On this page\"). */\n label?: string;\n /**\n * Visual tone: `surface` sits on the page background; `brand` renders the\n * inverted primary band.\n */\n tone?: 'surface' | 'brand';\n /** IntersectionObserver root margin tuning for the scroll spy. */\n rootMargin?: string;\n /** Called with the section id when a nav link is clicked. */\n onItemClick?: (id: string) => void;\n /** Called when the CTA is clicked (e.g. for analytics). */\n onCtaClick?: (cta: SectionSpyCta) => void;\n className?: string;\n}\n\n// =============================================================================\n// Internals\n// =============================================================================\n\n/** Directional glyph inferred from the destination. */\nfunction CtaArrow({ href }: { href: string }) {\n const Icon = href.startsWith('#')\n ? ArrowDown\n : href.startsWith('/')\n ? ArrowRight\n : ArrowUpRight;\n // rtl:-scale-x-100 mirrors ArrowRight and ArrowUpRight for RTL reading\n // direction; ArrowDown is horizontally symmetric so the flip is a no-op.\n return <Icon aria-hidden=\"true\" className=\"h-3.5 w-3.5 rtl:-scale-x-100\" />;\n}\n\nconst CTA_TIER_VARIANT = {\n explore: 'ghost',\n evaluate: 'outline',\n commit: 'primary',\n} as const;\n\n// =============================================================================\n// SectionSpyNav\n// =============================================================================\n\n/**\n * Sticky horizontal in-page wayfinding: jumps between a page's major\n * sections, highlights the one in view with a sliding underline, and can\n * carry a single page-specific next-step CTA. Pure anchor links, so it\n * still works if the scroll spy never runs.\n *\n * The horizontal complement to `TableOfContents` — use that for a sidebar\n * outline, this for a band under the page header. Section elements need\n * matching `id`s.\n *\n * @example\n * ```tsx\n * <SectionSpyNav\n * items={[\n * { id: 'overview', label: 'Overview' },\n * { id: 'pricing', label: 'Pricing' },\n * ]}\n * cta={{ label: 'Book a demo', href: '/demo', tier: 'evaluate' }}\n * />\n * ```\n */\nexport function SectionSpyNav({\n items,\n cta,\n label = 'On this page',\n tone = 'surface',\n rootMargin = '-22% 0px -68% 0px',\n onItemClick,\n onCtaClick,\n className,\n}: SectionSpyNavProps) {\n const ids = React.useMemo(() => items.map((it) => it.id), [items]);\n const { activeId } = useScrollSpy({ ids, rootMargin });\n const active = activeId ?? items[0]?.id ?? '';\n\n const railRef = React.useRef<HTMLDivElement>(null);\n const markRef = React.useRef<HTMLSpanElement>(null);\n\n // Find the active link by dataset rather than a CSS selector, so ids\n // never need escaping and CSS.escape availability doesn't matter.\n const findActiveLink = React.useCallback((): HTMLAnchorElement | null => {\n const links = railRef.current?.querySelectorAll<HTMLAnchorElement>('a');\n if (!links) return null;\n for (const link of links) {\n if (link.dataset.id === active) return link;\n }\n return null;\n }, [active]);\n\n // Slide the underline beneath the active link. offsetLeft/offsetWidth are\n // physical and measured against the rail, so the marker tracks the link\n // in both directions and while the rail is scrolled horizontally.\n const syncMarker = React.useCallback(() => {\n const link = findActiveLink();\n const mark = markRef.current;\n if (!link || !mark) return;\n mark.style.left = `${link.offsetLeft}px`;\n mark.style.width = `${link.offsetWidth}px`;\n }, [findActiveLink]);\n\n React.useEffect(() => {\n const link = findActiveLink();\n link?.scrollIntoView?.({ inline: 'center', block: 'nearest' });\n syncMarker();\n }, [findActiveLink, syncMarker]);\n\n React.useEffect(() => {\n window.addEventListener('resize', syncMarker);\n return () => window.removeEventListener('resize', syncMarker);\n }, [syncMarker]);\n\n const brand = tone === 'brand';\n\n return (\n <nav\n className={cn(\n 'sticky top-0 z-30 w-full',\n brand\n ? 'bg-primary-900 text-white'\n : 'border-border bg-card/95 border-b backdrop-blur',\n className\n )}\n aria-label={label}\n >\n <div className=\"flex items-center gap-4 px-4 py-0.5\">\n <span\n className={cn(\n 'shrink-0 text-[11px] font-semibold tracking-wide uppercase max-md:hidden',\n brand ? 'text-white/85' : 'text-muted-foreground'\n )}\n aria-hidden=\"true\"\n >\n {label}\n </span>\n <div\n ref={railRef}\n className=\"relative flex min-w-0 flex-1 gap-1 overflow-x-auto [scrollbar-width:none] [&::-webkit-scrollbar]:hidden\"\n >\n {items.map((it) => {\n const isActive = active === it.id;\n return (\n <a\n key={it.id}\n href={`#${it.id}`}\n data-id={it.id}\n onClick={() => onItemClick?.(it.id)}\n className={cn(\n 'shrink-0 rounded px-2.5 py-2 text-sm whitespace-nowrap transition-colors',\n brand\n ? isActive\n ? 'font-semibold text-white'\n : 'text-white/85 hover:text-white'\n : isActive\n ? 'text-foreground font-semibold'\n : 'text-muted-foreground hover:text-foreground'\n )}\n aria-current={isActive ? 'location' : undefined}\n >\n {it.label}\n </a>\n );\n })}\n <span\n ref={markRef}\n className={cn(\n 'absolute bottom-0 h-0.5 rounded-full transition-[left,width] duration-300',\n brand ? 'bg-primary-400' : 'bg-primary-500'\n )}\n aria-hidden=\"true\"\n />\n </div>\n {cta && (\n <a\n href={cta.href}\n onClick={() => onCtaClick?.(cta)}\n className={cn(\n buttonVariants({\n variant: CTA_TIER_VARIANT[cta.tier ?? 'explore'],\n size: 'sm',\n }),\n 'shrink-0',\n brand &&\n (cta.tier ?? 'explore') !== 'commit' &&\n 'text-white hover:bg-white/10 hover:text-white'\n )}\n >\n {cta.label}\n <CtaArrow href={cta.href} />\n </a>\n )}\n </div>\n </nav>\n );\n}\n"]}
@@ -1,5 +1,5 @@
1
- import { useAnchoredPosition } from './chunk-WSNMQQ4P.js';
2
1
  import { useEscapeKey } from './chunk-T4ME7QCT.js';
2
+ import { useAnchoredPosition } from './chunk-WSNMQQ4P.js';
3
3
  import { cn } from './chunk-TQONQSJO.js';
4
4
  import * as React from 'react';
5
5
  import { createPortal } from 'react-dom';
@@ -204,5 +204,5 @@ function SourceTip({
204
204
  }
205
205
 
206
206
  export { SourceTip };
207
- //# sourceMappingURL=chunk-Z5V7SAZ4.js.map
208
- //# sourceMappingURL=chunk-Z5V7SAZ4.js.map
207
+ //# sourceMappingURL=chunk-KFEN2SRZ.js.map
208
+ //# sourceMappingURL=chunk-KFEN2SRZ.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/components/SourceTip/SourceTip.tsx"],"names":[],"mappings":"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","file":"chunk-Z5V7SAZ4.js","sourcesContent":["'use client';\n\nimport * as React from 'react';\nimport { createPortal } from 'react-dom';\nimport { cn } from '../../utils/cn';\nimport { useAnchoredPosition } from '../../hooks/useAnchoredPosition';\nimport { useEscapeKey } from '../../hooks/useEscapeKey';\n\n// =============================================================================\n// Types\n// =============================================================================\n\n/** One line of provenance shown in the card. */\nexport interface TipSource {\n /** One-line label — statute name or source title. Truncated on render. */\n label: string;\n /** Source URL. Omit for a provenance line that isn't linkable. */\n url?: string;\n /** Secondary label shown at the end (publisher / host / year). */\n sub?: string;\n}\n\nexport interface SourceTipProps {\n /** The claim this card explains — the card's heading. */\n heading: string;\n /** Free-text provenance, for facts no public URL can verify. */\n note?: string;\n /** Linked (or unlinked) one-line sources. */\n sources?: TipSource[];\n /** Eyebrow above the heading. Defaults to \"Source\". */\n eyebrow?: string;\n /** The visible trigger. */\n children: React.ReactNode;\n className?: string;\n /**\n * Underline the trigger with a dashed rule marking a hoverable claim.\n * Leave off in table cells, which signal hoverability by their own\n * treatment rather than by underlining every cell.\n */\n underline?: boolean;\n}\n\nconst HIDE_GRACE_MS = 180;\n\n// =============================================================================\n// SourceTip\n// =============================================================================\n\n/**\n * A hover card answering \"what backs this claim?\" — an eyebrow + heading,\n * optional free-text provenance, and a list of one-line source links.\n * Suits stat tiles, table cells, and inline facts where a numbered footnote\n * would be overkill.\n *\n * The trigger and card are phrasing content (`span`/`a` only), so it is\n * valid inside `<p>` prose and table cells. The card portals to `body` with\n * fixed positioning, flipping and clamping to stay in the viewport. On\n * touch, a tap pins the card; Escape or an outside tap closes it. A pinned\n * card behaves as a non-modal dialog — focus moves into it so its source\n * links are keyboard-reachable, and returns to the trigger on close.\n *\n * @example\n * ```tsx\n * <SourceTip\n * heading=\"OSHA recordable rate\"\n * sources={[{ label: 'BLS SOII 2023', url: 'https://www.bls.gov/iif/', sub: 'BLS' }]}\n * underline\n * >\n * 2.4 per 100 FTE\n * </SourceTip>\n * ```\n */\nexport function SourceTip({\n heading,\n note,\n sources,\n eyebrow = 'Source',\n children,\n className,\n underline = false,\n}: SourceTipProps) {\n const [open, setOpen] = React.useState(false);\n const [pinned, setPinned] = React.useState(false);\n const timer = React.useRef<ReturnType<typeof setTimeout> | null>(null);\n // True while close() restores focus to the trigger, so the trigger's\n // focus-show doesn't immediately reopen a card the user just dismissed.\n const suppressFocusShow = React.useRef(false);\n\n const { anchorRef, floatingRef, style } = useAnchoredPosition<\n HTMLSpanElement,\n HTMLSpanElement\n >({\n open,\n placement: 'top',\n offset: 10,\n viewportPadding: 8,\n allowFlip: true,\n });\n\n const clearHideTimer = () => {\n if (timer.current) {\n clearTimeout(timer.current);\n timer.current = null;\n }\n };\n\n const show = React.useCallback(() => {\n clearHideTimer();\n setOpen(true);\n }, []);\n\n const scheduleHide = React.useCallback(() => {\n if (pinned) return;\n clearHideTimer();\n timer.current = setTimeout(() => setOpen(false), HIDE_GRACE_MS);\n }, [pinned]);\n\n const close = React.useCallback(() => {\n clearHideTimer();\n setPinned(false);\n setOpen(false);\n // Return focus to the trigger if it was inside the card.\n if (floatingRef.current?.contains(document.activeElement)) {\n suppressFocusShow.current = true;\n anchorRef.current?.focus();\n }\n }, [anchorRef, floatingRef]);\n\n React.useEffect(() => () => clearHideTimer(), []);\n\n // A pinned card is a non-modal dialog: move focus into it so its links\n // are reachable by keyboard.\n React.useEffect(() => {\n if (pinned) floatingRef.current?.focus();\n }, [pinned, floatingRef]);\n\n useEscapeKey(close, open);\n\n // Pinned cards close on an outside tap; hover cards close on their own.\n React.useEffect(() => {\n if (!open || !pinned) return;\n const onPointer = (e: Event) => {\n const t = e.target as Node;\n if (anchorRef.current?.contains(t) || floatingRef.current?.contains(t))\n return;\n close();\n };\n document.addEventListener('mousedown', onPointer);\n document.addEventListener('touchstart', onPointer);\n return () => {\n document.removeEventListener('mousedown', onPointer);\n document.removeEventListener('touchstart', onPointer);\n };\n }, [open, pinned, close, anchorRef, floatingRef]);\n\n // Touch has no hover: tap pins the card instead of falling through.\n const onTriggerClick = () => {\n const coarse =\n typeof window !== 'undefined' &&\n window.matchMedia('(hover: none)').matches;\n if (!coarse) return;\n togglePin();\n };\n\n const togglePin = () => {\n if (pinned) close();\n else {\n setPinned(true);\n show();\n }\n };\n\n const onTriggerKeyDown = (e: React.KeyboardEvent<HTMLSpanElement>) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n togglePin();\n }\n };\n\n // Focus lives on the dialog container once pinned, so Enter/Space there\n // (not on a link inside) must also unpin — the trigger no longer has focus.\n const onDialogKeyDown = (e: React.KeyboardEvent<HTMLSpanElement>) => {\n if (e.target !== e.currentTarget) return;\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n close();\n }\n };\n\n const onTriggerFocus = () => {\n if (suppressFocusShow.current) {\n suppressFocusShow.current = false;\n return;\n }\n show();\n };\n\n const onBlurCapture = (e: React.FocusEvent<HTMLSpanElement>) => {\n const next = e.relatedTarget as Node | null;\n if (\n next &&\n (anchorRef.current?.contains(next) || floatingRef.current?.contains(next))\n )\n return;\n scheduleHide();\n };\n\n const hasSources = Boolean(sources && sources.length > 0);\n\n return (\n <span\n ref={anchorRef}\n className={cn(\n 'cursor-help',\n underline &&\n 'decoration-primary-400/70 underline decoration-dashed underline-offset-4',\n className\n )}\n onMouseEnter={show}\n onMouseLeave={scheduleHide}\n onFocus={onTriggerFocus}\n onBlur={onBlurCapture}\n onClick={onTriggerClick}\n onKeyDown={onTriggerKeyDown}\n tabIndex={0}\n role=\"button\"\n aria-haspopup=\"dialog\"\n aria-expanded={open}\n aria-label={`${heading} — show source`}\n >\n {children}\n {open &&\n createPortal(\n /* eslint-disable-next-line jsx-a11y/no-noninteractive-element-interactions -- keyboard dismissal on a focused non-modal dialog container is the WAI-ARIA pattern; links inside keep their own semantics */\n <span\n ref={floatingRef}\n role=\"dialog\"\n aria-label={heading}\n tabIndex={-1}\n onMouseEnter={show}\n onMouseLeave={scheduleHide}\n onBlurCapture={onBlurCapture}\n onKeyDown={onDialogKeyDown}\n className=\"focus-visible:ring-ring z-50 block w-80 rounded-lg outline-none focus-visible:ring-2\"\n style={style}\n >\n <span className=\"border-border bg-card block overflow-hidden rounded-lg border text-start font-normal tracking-normal normal-case shadow-xl ring-1 ring-black/5 dark:ring-white/10\">\n <span className=\"from-primary-700 to-primary-600 block bg-gradient-to-br px-3.5 py-2.5\">\n <span className=\"text-primary-100/90 block text-[10px] font-bold tracking-wide uppercase\">\n {eyebrow}\n </span>\n <span className=\"mt-0.5 block text-sm leading-snug font-semibold text-white\">\n {heading}\n </span>\n </span>\n\n {(note || hasSources) && (\n <span className=\"block px-3.5 py-2.5\">\n {note && (\n <span className=\"text-muted-foreground block text-[13px] leading-relaxed\">\n {note}\n </span>\n )}\n {hasSources && (\n <span\n className={cn(\n 'block',\n note &&\n 'border-border mt-2.5 border-t border-dashed pt-2.5'\n )}\n >\n <span className=\"text-muted-foreground block text-[10px] font-bold tracking-wide uppercase\">\n {sources!.length === 1\n ? 'Source'\n : `${sources!.length} sources`}\n </span>\n <span className=\"block max-h-52 overflow-y-auto\">\n {sources!.map((s, i) => (\n <span\n key={`${s.label}-${i}`}\n className=\"mt-1.5 flex items-center gap-2\"\n >\n <span\n aria-hidden=\"true\"\n className=\"bg-primary-400 h-1.5 w-1.5 shrink-0 rounded-full\"\n />\n {s.url ? (\n <a\n href={s.url}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"text-primary-600 hover:text-primary-500 dark:text-primary-400 dark:hover:text-primary-300 min-w-0 flex-1 truncate text-xs font-semibold\"\n >\n {s.label}\n </a>\n ) : (\n <span className=\"text-muted-foreground min-w-0 flex-1 truncate text-xs\">\n {s.label}\n </span>\n )}\n {s.sub && (\n <span className=\"text-muted-foreground/70 shrink-0 text-[11px]\">\n {s.sub}\n </span>\n )}\n </span>\n ))}\n </span>\n </span>\n )}\n </span>\n )}\n </span>\n </span>,\n document.body\n )}\n </span>\n );\n}\n"]}
1
+ {"version":3,"sources":["../src/components/SourceTip/SourceTip.tsx"],"names":[],"mappings":"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","file":"chunk-KFEN2SRZ.js","sourcesContent":["'use client';\n\nimport * as React from 'react';\nimport { createPortal } from 'react-dom';\nimport { cn } from '../../utils/cn';\nimport { useAnchoredPosition } from '../../hooks/useAnchoredPosition';\nimport { useEscapeKey } from '../../hooks/useEscapeKey';\n\n// =============================================================================\n// Types\n// =============================================================================\n\n/** One line of provenance shown in the card. */\nexport interface TipSource {\n /** One-line label — statute name or source title. Truncated on render. */\n label: string;\n /** Source URL. Omit for a provenance line that isn't linkable. */\n url?: string;\n /** Secondary label shown at the end (publisher / host / year). */\n sub?: string;\n}\n\nexport interface SourceTipProps {\n /** The claim this card explains — the card's heading. */\n heading: string;\n /** Free-text provenance, for facts no public URL can verify. */\n note?: string;\n /** Linked (or unlinked) one-line sources. */\n sources?: TipSource[];\n /** Eyebrow above the heading. Defaults to \"Source\". */\n eyebrow?: string;\n /** The visible trigger. */\n children: React.ReactNode;\n className?: string;\n /**\n * Underline the trigger with a dashed rule marking a hoverable claim.\n * Leave off in table cells, which signal hoverability by their own\n * treatment rather than by underlining every cell.\n */\n underline?: boolean;\n}\n\nconst HIDE_GRACE_MS = 180;\n\n// =============================================================================\n// SourceTip\n// =============================================================================\n\n/**\n * A hover card answering \"what backs this claim?\" — an eyebrow + heading,\n * optional free-text provenance, and a list of one-line source links.\n * Suits stat tiles, table cells, and inline facts where a numbered footnote\n * would be overkill.\n *\n * The trigger and card are phrasing content (`span`/`a` only), so it is\n * valid inside `<p>` prose and table cells. The card portals to `body` with\n * fixed positioning, flipping and clamping to stay in the viewport. On\n * touch, a tap pins the card; Escape or an outside tap closes it. A pinned\n * card behaves as a non-modal dialog — focus moves into it so its source\n * links are keyboard-reachable, and returns to the trigger on close.\n *\n * @example\n * ```tsx\n * <SourceTip\n * heading=\"OSHA recordable rate\"\n * sources={[{ label: 'BLS SOII 2023', url: 'https://www.bls.gov/iif/', sub: 'BLS' }]}\n * underline\n * >\n * 2.4 per 100 FTE\n * </SourceTip>\n * ```\n */\nexport function SourceTip({\n heading,\n note,\n sources,\n eyebrow = 'Source',\n children,\n className,\n underline = false,\n}: SourceTipProps) {\n const [open, setOpen] = React.useState(false);\n const [pinned, setPinned] = React.useState(false);\n const timer = React.useRef<ReturnType<typeof setTimeout> | null>(null);\n // True while close() restores focus to the trigger, so the trigger's\n // focus-show doesn't immediately reopen a card the user just dismissed.\n const suppressFocusShow = React.useRef(false);\n\n const { anchorRef, floatingRef, style } = useAnchoredPosition<\n HTMLSpanElement,\n HTMLSpanElement\n >({\n open,\n placement: 'top',\n offset: 10,\n viewportPadding: 8,\n allowFlip: true,\n });\n\n const clearHideTimer = () => {\n if (timer.current) {\n clearTimeout(timer.current);\n timer.current = null;\n }\n };\n\n const show = React.useCallback(() => {\n clearHideTimer();\n setOpen(true);\n }, []);\n\n const scheduleHide = React.useCallback(() => {\n if (pinned) return;\n clearHideTimer();\n timer.current = setTimeout(() => setOpen(false), HIDE_GRACE_MS);\n }, [pinned]);\n\n const close = React.useCallback(() => {\n clearHideTimer();\n setPinned(false);\n setOpen(false);\n // Return focus to the trigger if it was inside the card.\n if (floatingRef.current?.contains(document.activeElement)) {\n suppressFocusShow.current = true;\n anchorRef.current?.focus();\n }\n }, [anchorRef, floatingRef]);\n\n React.useEffect(() => () => clearHideTimer(), []);\n\n // A pinned card is a non-modal dialog: move focus into it so its links\n // are reachable by keyboard.\n React.useEffect(() => {\n if (pinned) floatingRef.current?.focus();\n }, [pinned, floatingRef]);\n\n useEscapeKey(close, open);\n\n // Pinned cards close on an outside tap; hover cards close on their own.\n React.useEffect(() => {\n if (!open || !pinned) return;\n const onPointer = (e: Event) => {\n const t = e.target as Node;\n if (anchorRef.current?.contains(t) || floatingRef.current?.contains(t))\n return;\n close();\n };\n document.addEventListener('mousedown', onPointer);\n document.addEventListener('touchstart', onPointer);\n return () => {\n document.removeEventListener('mousedown', onPointer);\n document.removeEventListener('touchstart', onPointer);\n };\n }, [open, pinned, close, anchorRef, floatingRef]);\n\n // Touch has no hover: tap pins the card instead of falling through.\n const onTriggerClick = () => {\n const coarse =\n typeof window !== 'undefined' &&\n window.matchMedia('(hover: none)').matches;\n if (!coarse) return;\n togglePin();\n };\n\n const togglePin = () => {\n if (pinned) close();\n else {\n setPinned(true);\n show();\n }\n };\n\n const onTriggerKeyDown = (e: React.KeyboardEvent<HTMLSpanElement>) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n togglePin();\n }\n };\n\n // Focus lives on the dialog container once pinned, so Enter/Space there\n // (not on a link inside) must also unpin — the trigger no longer has focus.\n const onDialogKeyDown = (e: React.KeyboardEvent<HTMLSpanElement>) => {\n if (e.target !== e.currentTarget) return;\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n close();\n }\n };\n\n const onTriggerFocus = () => {\n if (suppressFocusShow.current) {\n suppressFocusShow.current = false;\n return;\n }\n show();\n };\n\n const onBlurCapture = (e: React.FocusEvent<HTMLSpanElement>) => {\n const next = e.relatedTarget as Node | null;\n if (\n next &&\n (anchorRef.current?.contains(next) || floatingRef.current?.contains(next))\n )\n return;\n scheduleHide();\n };\n\n const hasSources = Boolean(sources && sources.length > 0);\n\n return (\n <span\n ref={anchorRef}\n className={cn(\n 'cursor-help',\n underline &&\n 'decoration-primary-400/70 underline decoration-dashed underline-offset-4',\n className\n )}\n onMouseEnter={show}\n onMouseLeave={scheduleHide}\n onFocus={onTriggerFocus}\n onBlur={onBlurCapture}\n onClick={onTriggerClick}\n onKeyDown={onTriggerKeyDown}\n tabIndex={0}\n role=\"button\"\n aria-haspopup=\"dialog\"\n aria-expanded={open}\n aria-label={`${heading} — show source`}\n >\n {children}\n {open &&\n createPortal(\n /* eslint-disable-next-line jsx-a11y/no-noninteractive-element-interactions -- keyboard dismissal on a focused non-modal dialog container is the WAI-ARIA pattern; links inside keep their own semantics */\n <span\n ref={floatingRef}\n role=\"dialog\"\n aria-label={heading}\n tabIndex={-1}\n onMouseEnter={show}\n onMouseLeave={scheduleHide}\n onBlurCapture={onBlurCapture}\n onKeyDown={onDialogKeyDown}\n className=\"focus-visible:ring-ring z-50 block w-80 rounded-lg outline-none focus-visible:ring-2\"\n style={style}\n >\n <span className=\"border-border bg-card block overflow-hidden rounded-lg border text-start font-normal tracking-normal normal-case shadow-xl ring-1 ring-black/5 dark:ring-white/10\">\n <span className=\"from-primary-700 to-primary-600 block bg-gradient-to-br px-3.5 py-2.5\">\n <span className=\"text-primary-100/90 block text-[10px] font-bold tracking-wide uppercase\">\n {eyebrow}\n </span>\n <span className=\"mt-0.5 block text-sm leading-snug font-semibold text-white\">\n {heading}\n </span>\n </span>\n\n {(note || hasSources) && (\n <span className=\"block px-3.5 py-2.5\">\n {note && (\n <span className=\"text-muted-foreground block text-[13px] leading-relaxed\">\n {note}\n </span>\n )}\n {hasSources && (\n <span\n className={cn(\n 'block',\n note &&\n 'border-border mt-2.5 border-t border-dashed pt-2.5'\n )}\n >\n <span className=\"text-muted-foreground block text-[10px] font-bold tracking-wide uppercase\">\n {sources!.length === 1\n ? 'Source'\n : `${sources!.length} sources`}\n </span>\n <span className=\"block max-h-52 overflow-y-auto\">\n {sources!.map((s, i) => (\n <span\n key={`${s.label}-${i}`}\n className=\"mt-1.5 flex items-center gap-2\"\n >\n <span\n aria-hidden=\"true\"\n className=\"bg-primary-400 h-1.5 w-1.5 shrink-0 rounded-full\"\n />\n {s.url ? (\n <a\n href={s.url}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"text-primary-600 hover:text-primary-500 dark:text-primary-400 dark:hover:text-primary-300 min-w-0 flex-1 truncate text-xs font-semibold\"\n >\n {s.label}\n </a>\n ) : (\n <span className=\"text-muted-foreground min-w-0 flex-1 truncate text-xs\">\n {s.label}\n </span>\n )}\n {s.sub && (\n <span className=\"text-muted-foreground/70 shrink-0 text-[11px]\">\n {s.sub}\n </span>\n )}\n </span>\n ))}\n </span>\n </span>\n )}\n </span>\n )}\n </span>\n </span>,\n document.body\n )}\n </span>\n );\n}\n"]}
@@ -1,7 +1,7 @@
1
1
  'use strict';
2
2
 
3
- var chunkJYZW2PZS_cjs = require('./chunk-JYZW2PZS.cjs');
4
- var chunkVNYW4C4J_cjs = require('./chunk-VNYW4C4J.cjs');
3
+ var chunk254QK722_cjs = require('./chunk-254QK722.cjs');
4
+ var chunkANMX7YDL_cjs = require('./chunk-ANMX7YDL.cjs');
5
5
  var React = require('react');
6
6
  var classVarianceAuthority = require('class-variance-authority');
7
7
  var jsxRuntime = require('react/jsx-runtime');
@@ -50,10 +50,17 @@ var MediaPlayer = React__namespace.forwardRef(
50
50
  src,
51
51
  kind,
52
52
  controls = true,
53
+ muted,
54
+ loop,
55
+ poster,
56
+ preload,
57
+ children,
58
+ labels,
53
59
  variant,
54
60
  onStateChange,
55
61
  onEnded,
56
62
  onError,
63
+ onRetry,
57
64
  onTimeUpdate,
58
65
  className,
59
66
  "aria-label": ariaLabel,
@@ -64,12 +71,14 @@ var MediaPlayer = React__namespace.forwardRef(
64
71
  setError(null);
65
72
  }, [src]);
66
73
  const resolvedKind = kind ?? inferMediaKind(src);
67
- const transport = chunkJYZW2PZS_cjs.useMediaTransport({
74
+ const transport = chunk254QK722_cjs.useMediaTransport({
68
75
  onTimeUpdate,
69
76
  onStateChange,
70
77
  onEnded,
71
78
  onError: (err) => {
72
- setError("Unable to load media. The server may be unavailable.");
79
+ setError(
80
+ labels?.error ?? "Unable to load media. The server may be unavailable."
81
+ );
73
82
  onError?.(err);
74
83
  },
75
84
  endedState: "paused",
@@ -104,10 +113,14 @@ var MediaPlayer = React__namespace.forwardRef(
104
113
  const handleRetry = React__namespace.useCallback(() => {
105
114
  setError(null);
106
115
  mediaElement?.load();
107
- }, [mediaElement]);
116
+ onRetry?.();
117
+ }, [mediaElement, onRetry]);
108
118
  const sharedMediaProps = {
109
119
  src,
110
120
  controls,
121
+ muted,
122
+ loop,
123
+ preload,
111
124
  "aria-label": ariaLabel
112
125
  };
113
126
  if (error) {
@@ -119,13 +132,13 @@ var MediaPlayer = React__namespace.forwardRef(
119
132
  children: [
120
133
  /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-destructive-700 dark:text-destructive-300 m-0 text-sm", children: error }),
121
134
  /* @__PURE__ */ jsxRuntime.jsx(
122
- chunkVNYW4C4J_cjs.Button,
135
+ chunkANMX7YDL_cjs.Button,
123
136
  {
124
137
  variant: "outline",
125
138
  size: "sm",
126
139
  className: "bg-background",
127
140
  onClick: handleRetry,
128
- children: "Retry"
141
+ children: labels?.retry ?? "Retry"
129
142
  }
130
143
  )
131
144
  ]
@@ -133,16 +146,18 @@ var MediaPlayer = React__namespace.forwardRef(
133
146
  ) });
134
147
  }
135
148
  return /* @__PURE__ */ jsxRuntime.jsx("div", { className: mediaPlayerVariants({ variant, className }), children: resolvedKind === "video" ? (
136
- // Generic media surface: caption tracks belong to the consumer's media
137
- // resource and are supplied via children, not this transport component.
149
+ // Tracks belong to the caller's media resource and can be supplied as
150
+ // children. The feed also supports a custom renderer for captions.
138
151
  // eslint-disable-next-line jsx-a11y/media-has-caption
139
152
  /* @__PURE__ */ jsxRuntime.jsx(
140
153
  "video",
141
154
  {
142
155
  ref: setElement,
143
156
  playsInline: true,
157
+ poster,
144
158
  className: "h-auto max-h-full w-auto max-w-full object-contain",
145
- ...sharedMediaProps
159
+ ...sharedMediaProps,
160
+ children
146
161
  }
147
162
  )
148
163
  ) : (
@@ -152,7 +167,8 @@ var MediaPlayer = React__namespace.forwardRef(
152
167
  {
153
168
  ref: setElement,
154
169
  className: "my-4 w-[90%] max-w-lg",
155
- ...sharedMediaProps
170
+ ...sharedMediaProps,
171
+ children
156
172
  }
157
173
  )
158
174
  ) });
@@ -163,5 +179,5 @@ MediaPlayer.displayName = "MediaPlayer";
163
179
  exports.MediaPlayer = MediaPlayer;
164
180
  exports.inferMediaKind = inferMediaKind;
165
181
  exports.mediaPlayerVariants = mediaPlayerVariants;
166
- //# sourceMappingURL=chunk-XEAT7XJG.cjs.map
167
- //# sourceMappingURL=chunk-XEAT7XJG.cjs.map
182
+ //# sourceMappingURL=chunk-KQ6GLYFZ.cjs.map
183
+ //# sourceMappingURL=chunk-KQ6GLYFZ.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/MediaPlayer/MediaPlayer.tsx"],"names":["cva","React","useMediaTransport","jsx","jsxs","Button"],"mappings":"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","file":"chunk-KQ6GLYFZ.cjs","sourcesContent":["import * as React from 'react';\nimport { cva, type VariantProps } from 'class-variance-authority';\n\nimport { Button } from '../Button';\nimport { useMediaTransport } from '../../hooks/useMediaTransport';\n\n// ============================================================================\n// Types & Interfaces\n// ============================================================================\n\nexport type MediaPlayerState =\n | 'idle'\n | 'loading'\n | 'playing'\n | 'paused'\n | 'error';\n\nexport type MediaKind = 'video' | 'audio';\n\n/** Ref handle for controlling {@link MediaPlayer} programmatically. */\nexport interface MediaPlayerRef {\n /** Seek to a specific time in milliseconds. */\n seekToMs: (timeMs: number) => void;\n /** Start playback. */\n play: () => void;\n /** Pause playback. */\n pause: () => void;\n /** Get current playback time in milliseconds. */\n getCurrentTimeMs: () => number;\n /** Get total duration in milliseconds. */\n getDurationMs: () => number;\n /** Whether playback is currently paused. */\n isPaused: () => boolean;\n /** Set playback speed multiplier. */\n setPlaybackRate: (rate: number) => void;\n /**\n * The underlying media element.\n * Escape hatch for host integrations (e.g. thumbnail capture); prefer the\n * typed methods above for playback control.\n */\n mediaElement: HTMLVideoElement | HTMLAudioElement | null;\n}\n\nexport interface MediaPlayerProps extends VariantProps<\n typeof mediaPlayerVariants\n> {\n /** Media source URL. */\n src: string;\n /** Force the media kind; when omitted it is inferred from the src extension. */\n kind?: MediaKind;\n /** Whether to show native controls (default `true`). */\n controls?: boolean;\n /** Begin muted; native controls can still change the volume. */\n muted?: boolean;\n /** Repeat playback when the media ends. */\n loop?: boolean;\n /** Video thumbnail displayed before playback. */\n poster?: string;\n /** Browser preload hint (default browser behavior when omitted). */\n preload?: 'none' | 'metadata' | 'auto';\n /** Caption/subtitle `<track>` elements. The `src` attribute is always set\n * on the media element, so alternative `<source>` children are ignored. */\n children?: React.ReactNode;\n /** Localized load-error and retry text. */\n labels?: { error?: string; retry?: string };\n /** Callback when playback state changes. */\n onStateChange?: (state: MediaPlayerState) => void;\n /** Callback when playback ends. */\n onEnded?: () => void;\n /** Callback when an error occurs. */\n onError?: (error: Error) => void;\n /** Callback after the user requests a fresh media load on the error surface. */\n onRetry?: () => void;\n /** Callback on time updates (milliseconds). */\n onTimeUpdate?: (currentTimeMs: number, durationMs: number) => void;\n /** Additional class name. */\n className?: string;\n /** Accessible label for the media element. */\n 'aria-label'?: string;\n /**\n * Transitional: exposes the raw media element to legacy consumers.\n * Prefer {@link MediaPlayerRef} for playback control.\n */\n mediaElementRef?: React.RefObject<HTMLVideoElement | HTMLAudioElement | null>;\n}\n\n// ============================================================================\n// Variants\n// ============================================================================\n\nconst mediaPlayerVariants = cva(\n 'flex h-full w-full items-center justify-center',\n {\n variants: {\n variant: {\n plain: '',\n card: 'rounded-xl border border-border bg-card text-card-foreground p-2',\n },\n },\n defaultVariants: {\n variant: 'plain',\n },\n }\n);\n\n// ============================================================================\n// Helpers\n// ============================================================================\n\nconst VIDEO_EXTENSIONS = /\\.(mp4|mov|avi|webm|mkv|m4v)$/i;\n\n/** Infer media kind from a URL's file extension; defaults to audio. */\nexport function inferMediaKind(src: string): MediaKind {\n // Strip any query string / fragment before matching. Testing the extension\n // against the full URL required a trailing `.*`, which backtracks\n // polynomially on crafted inputs (ReDoS); splitting first is linear.\n const path = src.split(/[?#]/, 1)[0];\n return VIDEO_EXTENSIONS.test(path) ? 'video' : 'audio';\n}\n\n// ============================================================================\n// Component\n// ============================================================================\n\n/**\n * Media playback surface for audio and video with a shared imperative handle.\n *\n * Renders a native `<video>` or `<audio>` element (kind inferred from the src\n * extension unless forced) with themed error/retry handling. Playback state and\n * controls come from the shared {@link useMediaTransport} hook and are exposed\n * through {@link MediaPlayerRef} (all times in milliseconds) — consumers should\n * not reach into the DOM element directly.\n */\nexport const MediaPlayer = React.forwardRef<MediaPlayerRef, MediaPlayerProps>(\n (\n {\n src,\n kind,\n controls = true,\n muted,\n loop,\n poster,\n preload,\n children,\n labels,\n variant,\n onStateChange,\n onEnded,\n onError,\n onRetry,\n onTimeUpdate,\n className,\n 'aria-label': ariaLabel,\n mediaElementRef,\n },\n ref\n ) => {\n const [error, setError] = React.useState<string | null>(null);\n\n // A failed load must not outlive its src: clearing on change lets a host\n // swap in a corrected URL without being trapped on the error surface\n // (which unmounts the media element, so the new src would never load).\n React.useEffect(() => {\n setError(null);\n }, [src]);\n const resolvedKind = kind ?? inferMediaKind(src);\n\n const transport = useMediaTransport({\n onTimeUpdate,\n onStateChange,\n onEnded,\n onError: (err) => {\n setError(\n labels?.error ??\n 'Unable to load media. The server may be unavailable.'\n );\n onError?.(err);\n },\n endedState: 'paused',\n errorLabel: `media: ${src}`,\n });\n\n const { setMediaElement, mediaElement } = transport;\n\n const setElement = React.useCallback(\n (el: HTMLVideoElement | HTMLAudioElement | null) => {\n setMediaElement(el);\n if (mediaElementRef) {\n (mediaElementRef as React.MutableRefObject<typeof el>).current = el;\n }\n },\n [setMediaElement, mediaElementRef]\n );\n\n React.useImperativeHandle(\n ref,\n (): MediaPlayerRef => ({\n seekToMs: transport.seekToMs,\n play: transport.play,\n pause: transport.pause,\n getCurrentTimeMs: transport.getCurrentTimeMs,\n getDurationMs: transport.getDurationMs,\n isPaused: transport.isPaused,\n setPlaybackRate: transport.setPlaybackRate,\n get mediaElement() {\n return mediaElement;\n },\n }),\n [transport, mediaElement]\n );\n\n const handleRetry = React.useCallback(() => {\n setError(null);\n mediaElement?.load();\n onRetry?.();\n }, [mediaElement, onRetry]);\n\n const sharedMediaProps = {\n src,\n controls,\n muted,\n loop,\n preload,\n 'aria-label': ariaLabel,\n };\n\n if (error) {\n return (\n <div className={mediaPlayerVariants({ variant, className })}>\n <div\n role=\"alert\"\n className=\"border-destructive/30 bg-destructive/10 flex min-h-36 flex-col items-center justify-center gap-3 rounded-lg border p-8 text-center\"\n >\n {/* destructive-700/300 instead of the base token: #dc2626 on the\n destructive/10 tint is 4.14:1 — below WCAG AA (axe: color-contrast). */}\n <p className=\"text-destructive-700 dark:text-destructive-300 m-0 text-sm\">\n {error}\n </p>\n {/* bg-background: the outline button is transparent, and its text on\n the destructive/10 tint sits exactly at the 4.5:1 AA boundary. */}\n <Button\n variant=\"outline\"\n size=\"sm\"\n className=\"bg-background\"\n onClick={handleRetry}\n >\n {labels?.retry ?? 'Retry'}\n </Button>\n </div>\n </div>\n );\n }\n\n return (\n <div className={mediaPlayerVariants({ variant, className })}>\n {resolvedKind === 'video' ? (\n // Tracks belong to the caller's media resource and can be supplied as\n // children. The feed also supports a custom renderer for captions.\n // eslint-disable-next-line jsx-a11y/media-has-caption\n <video\n ref={setElement as React.Ref<HTMLVideoElement>}\n playsInline\n poster={poster}\n className=\"h-auto max-h-full w-auto max-w-full object-contain\"\n {...sharedMediaProps}\n >\n {children}\n </video>\n ) : (\n // eslint-disable-next-line jsx-a11y/media-has-caption\n <audio\n ref={setElement as React.Ref<HTMLAudioElement>}\n className=\"my-4 w-[90%] max-w-lg\"\n {...sharedMediaProps}\n >\n {children}\n </audio>\n )}\n </div>\n );\n }\n);\n\nMediaPlayer.displayName = 'MediaPlayer';\n\nexport { mediaPlayerVariants };\n"]}
@@ -0,0 +1,4 @@
1
+ 'use strict';
2
+
3
+ //# sourceMappingURL=chunk-L6K4PRZK.cjs.map
4
+ //# sourceMappingURL=chunk-L6K4PRZK.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"chunk-L6K4PRZK.cjs"}
@@ -3,7 +3,7 @@
3
3
  var chunkNNEFAUHV_cjs = require('./chunk-NNEFAUHV.cjs');
4
4
  var chunkFHY3K6PL_cjs = require('./chunk-FHY3K6PL.cjs');
5
5
  var chunkSCV7C55E_cjs = require('./chunk-SCV7C55E.cjs');
6
- var chunkNV2CWBI2_cjs = require('./chunk-NV2CWBI2.cjs');
6
+ var chunkIEY3ZJIT_cjs = require('./chunk-IEY3ZJIT.cjs');
7
7
  var chunkS5RVSXDV_cjs = require('./chunk-S5RVSXDV.cjs');
8
8
  var React = require('react');
9
9
  var classVarianceAuthority = require('class-variance-authority');
@@ -51,6 +51,10 @@ var modalContentVariants = classVarianceAuthority.cva(
51
51
  // Full viewport height on mobile, constrained on larger screens
52
52
  "max-h-dvh sm:max-h-[calc(100dvh-2rem)]",
53
53
  "min-h-dvh sm:min-h-0",
54
+ // Full-screen on mobile covers the status bar and home indicator, so
55
+ // clear the safe areas there. Overridable for tests and native shells.
56
+ "pt-[var(--mieweb-safe-area-top,env(safe-area-inset-top))] sm:pt-0",
57
+ "pb-[var(--mieweb-safe-area-bottom,env(safe-area-inset-bottom))] sm:pb-0",
54
58
  // If a <form> is used as a direct child (wrapping ModalBody + ModalFooter),
55
59
  // make it participate in the flex column layout so overflow constraints work.
56
60
  "[&>form]:flex [&>form]:flex-col [&>form]:flex-1 [&>form]:min-h-0",
@@ -89,7 +93,7 @@ function Modal({
89
93
  }) {
90
94
  const generatedId = React__namespace.useId();
91
95
  const modalId = id || generatedId;
92
- const runtime = chunkNV2CWBI2_cjs.useMotionRuntime();
96
+ const runtime = chunkIEY3ZJIT_cjs.useMotionRuntime();
93
97
  const animatesExit = Boolean(runtime?.enabled);
94
98
  const [isExiting, setIsExiting] = React__namespace.useState(false);
95
99
  const [prevOpen, setPrevOpen] = React__namespace.useState(open);
@@ -140,9 +144,9 @@ function Modal({
140
144
  ModalContext.Provider,
141
145
  {
142
146
  value: { onClose: () => onOpenChange(false), modalId },
143
- children: /* @__PURE__ */ jsxRuntime.jsx(chunkNV2CWBI2_cjs.AnimatedPresence, { onExitComplete: () => setIsExiting(false), children: open && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "fixed inset-0 z-50", children: [
147
+ children: /* @__PURE__ */ jsxRuntime.jsx(chunkIEY3ZJIT_cjs.AnimatedPresence, { onExitComplete: () => setIsExiting(false), children: open && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "fixed inset-0 z-50", children: [
144
148
  /* @__PURE__ */ jsxRuntime.jsx(
145
- chunkNV2CWBI2_cjs.Animated,
149
+ chunkIEY3ZJIT_cjs.Animated,
146
150
  {
147
151
  preset: "overlay",
148
152
  mode: "presence",
@@ -158,7 +162,7 @@ function Modal({
158
162
  className: "flex min-h-full items-center justify-center p-0 sm:p-4",
159
163
  onClick: handleOverlayClick,
160
164
  children: /* @__PURE__ */ jsxRuntime.jsx(
161
- chunkNV2CWBI2_cjs.Animated,
165
+ chunkIEY3ZJIT_cjs.Animated,
162
166
  {
163
167
  ref: focusTrapRef,
164
168
  preset: "modalContent",
@@ -323,5 +327,5 @@ exports.ModalHeader = ModalHeader;
323
327
  exports.ModalTitle = ModalTitle;
324
328
  exports.modalContentVariants = modalContentVariants;
325
329
  exports.modalOverlayVariants = modalOverlayVariants;
326
- //# sourceMappingURL=chunk-7ZDPD5ZX.cjs.map
327
- //# sourceMappingURL=chunk-7ZDPD5ZX.cjs.map
330
+ //# sourceMappingURL=chunk-LC3JL2HB.cjs.map
331
+ //# sourceMappingURL=chunk-LC3JL2HB.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/Modal/Modal.tsx"],"names":["cva","React","useMotionRuntime","useFocusTrap","useEscapeKey","isStorybookDocsMode","jsx","AnimatedPresence","jsxs","Animated","cn"],"mappings":"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","file":"chunk-LC3JL2HB.cjs","sourcesContent":["import * as React from 'react';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { cn } from '../../utils/cn';\nimport { isStorybookDocsMode } from '../../utils/environment';\nimport { useFocusTrap } from '../../hooks/useFocusTrap';\nimport { useEscapeKey } from '../../hooks/useEscapeKey';\nimport { Animated, AnimatedPresence, useMotionRuntime } from '../../motion';\n\n/**\n * Modal scroll lock state manager.\n * Uses a singleton pattern with ref-like storage to track open modals\n * and manage body scroll locking across multiple modal instances.\n * Includes reset capability for testing environments.\n */\nconst scrollLockState = {\n count: 0,\n originalOverflow: null as string | null,\n reset() {\n this.count = 0;\n this.originalOverflow = null;\n },\n};\n\n// Export for testing environments\nexport const __resetScrollLockState = () => scrollLockState.reset();\n\nconst modalOverlayVariants = cva(\n ['fixed inset-0', 'bg-black/50 backdrop-blur-sm'],\n {\n variants: {},\n defaultVariants: {},\n }\n);\n\n/**\n * Entry keyframes for the CSS path only.\n *\n * Kept out of the `cva` base so they never run alongside the motion runtime —\n * both drive opacity and transform, and applied together they fight.\n *\n * Entry only: there is no CSS exit. The component unmounts the moment `open`\n * flips to false, so `data-state` is hardcoded `\"open\"` and closed keyframes\n * would be unreachable dead code. That missing exit is the clearest thing the\n * motion opt-in buys back.\n */\nconst MODAL_OVERLAY_FALLBACK_ANIMATION = 'animate-in fade-in-0';\n\nconst MODAL_CONTENT_FALLBACK_ANIMATION =\n 'duration-200 animate-in fade-in-0 zoom-in-95';\n\nconst modalContentVariants = cva(\n [\n 'relative w-full bg-card text-card-foreground',\n 'border border-border shadow-lg',\n // Full-screen on mobile, rounded on larger screens\n 'rounded-none sm:rounded-xl',\n 'flex flex-col',\n // Full viewport height on mobile, constrained on larger screens\n 'max-h-dvh sm:max-h-[calc(100dvh-2rem)]',\n 'min-h-dvh sm:min-h-0',\n // Full-screen on mobile covers the status bar and home indicator, so\n // clear the safe areas there. Overridable for tests and native shells.\n 'pt-[var(--mieweb-safe-area-top,env(safe-area-inset-top))] sm:pt-0',\n 'pb-[var(--mieweb-safe-area-bottom,env(safe-area-inset-bottom))] sm:pb-0',\n // If a <form> is used as a direct child (wrapping ModalBody + ModalFooter),\n // make it participate in the flex column layout so overflow constraints work.\n '[&>form]:flex [&>form]:flex-col [&>form]:flex-1 [&>form]:min-h-0',\n 'focus:outline-none',\n ],\n {\n variants: {\n size: {\n sm: 'sm:max-w-sm',\n md: 'sm:max-w-md',\n lg: 'sm:max-w-lg',\n xl: 'sm:max-w-xl',\n '2xl': 'sm:max-w-2xl',\n '3xl': 'sm:max-w-3xl',\n '4xl': 'sm:max-w-4xl',\n full: 'max-w-[calc(100vw-2rem)]',\n },\n },\n defaultVariants: {\n size: 'md',\n },\n }\n);\n\nexport interface ModalProps extends VariantProps<typeof modalContentVariants> {\n /** Whether the modal is open */\n open: boolean;\n /** Callback when the modal should close */\n onOpenChange: (open: boolean) => void;\n /** Modal content */\n children: React.ReactNode;\n /** Whether to close when clicking the overlay */\n closeOnOverlayClick?: boolean;\n /** Whether to close when pressing Escape */\n closeOnEscape?: boolean;\n /** Additional class name for the modal content */\n className?: string;\n /** ID for the modal, used for accessibility */\n id?: string;\n /** Accessible label for the modal */\n 'aria-label'?: string;\n /** ID of the element that labels the modal */\n 'aria-labelledby'?: string;\n /** ID of the element that describes the modal */\n 'aria-describedby'?: string;\n}\n\n/**\n * An accessible modal/dialog component.\n *\n * @example\n * ```tsx\n * <Modal open={isOpen} onOpenChange={setIsOpen} size=\"lg\">\n * <ModalHeader>\n * <ModalTitle>Confirm Action</ModalTitle>\n * <ModalClose />\n * </ModalHeader>\n * <ModalBody>\n * Are you sure you want to continue?\n * </ModalBody>\n * <ModalFooter>\n * <Button variant=\"secondary\" onClick={() => setIsOpen(false)}>Cancel</Button>\n * <Button onClick={handleConfirm}>Confirm</Button>\n * </ModalFooter>\n * </Modal>\n * ```\n */\nfunction Modal({\n open,\n onOpenChange,\n children,\n size,\n closeOnOverlayClick = true,\n closeOnEscape = true,\n className,\n id,\n 'aria-label': ariaLabel,\n 'aria-labelledby': ariaLabelledBy,\n 'aria-describedby': ariaDescribedBy,\n}: ModalProps) {\n const generatedId = React.useId();\n const modalId = id || generatedId;\n\n /*\n * The dialog outlives `open`.\n *\n * With a motion runtime, `AnimatedPresence` keeps the subtree on screen until\n * its exit animation finishes. Guards keyed on `open` alone would therefore\n * release while a `role=\"dialog\" aria-modal=\"true\"` element is still visible:\n * Tab could reach the page behind it and body scrolling would resume under\n * it. `isGuarded` stays true until presence reports the exit is done.\n *\n * Only tracked when a runtime is actually animating. Without one the subtree\n * unmounts on the same frame, and `onExitComplete` would never fire to clear\n * the flag.\n */\n const runtime = useMotionRuntime();\n const animatesExit = Boolean(runtime?.enabled);\n const [isExiting, setIsExiting] = React.useState(false);\n const [prevOpen, setPrevOpen] = React.useState(open);\n\n // Derived synchronously during render (React's \"adjust state when props\n // change\" pattern), not in an effect. An effect runs after commit, which\n // would leave one committed frame with the dialog still on screen but\n // `isGuarded` false — the focus trap would tear down, restore focus, then\n // re-arm and yank focus into the closing dialog, with the scroll lock\n // flickering alongside. Setting state during render re-renders before\n // commit, so the guards never observe the gap.\n if (prevOpen !== open) {\n setPrevOpen(open);\n if (!open && animatesExit) {\n setIsExiting(true);\n }\n }\n\n // If the runtime disappears or is disabled mid-exit, `onExitComplete` will\n // never fire — the subtree is already gone. Without this reset the guards\n // (and the body scroll lock with them) would be held forever.\n React.useEffect(() => {\n if (!animatesExit && isExiting) {\n setIsExiting(false);\n }\n }, [animatesExit, isExiting]);\n\n const isGuarded = open || isExiting;\n\n // Focus trap. Typed as `HTMLElement` because the content element is supplied\n // by `Animated`, which is element-agnostic.\n const focusTrapRef = useFocusTrap<HTMLElement>(isGuarded);\n\n // Handle escape key\n useEscapeKey(() => {\n if (closeOnEscape && open) {\n onOpenChange(false);\n }\n }, open);\n\n // Handle overlay click\n const handleOverlayClick = React.useCallback(\n (e: React.MouseEvent) => {\n if (closeOnOverlayClick && e.target === e.currentTarget) {\n onOpenChange(false);\n }\n },\n [closeOnOverlayClick, onOpenChange]\n );\n\n // Prevent body scroll while the modal is on screen (handles multiple modals).\n // Keyed on `isGuarded`, not `open`, so scrolling does not resume underneath a\n // dialog that is still animating out.\n // Skip scroll lock in Storybook docs mode where multiple stories render inline\n React.useEffect(() => {\n // Skip scroll lock entirely in Storybook docs mode\n if (!isGuarded || isStorybookDocsMode()) {\n return undefined;\n }\n\n scrollLockState.count++;\n // Only capture and set overflow when first modal opens\n if (scrollLockState.count === 1) {\n scrollLockState.originalOverflow = document.body.style.overflow;\n document.body.style.overflow = 'hidden';\n }\n\n return () => {\n scrollLockState.count--;\n // Only restore overflow when last modal closes\n if (\n scrollLockState.count === 0 &&\n scrollLockState.originalOverflow !== null\n ) {\n document.body.style.overflow = scrollLockState.originalOverflow;\n scrollLockState.originalOverflow = null;\n }\n };\n }, [isGuarded]);\n\n return (\n <ModalContext.Provider\n value={{ onClose: () => onOpenChange(false), modalId }}\n >\n {/*\n The `open` check lives inside `AnimatedPresence` rather than as an early\n `return null` above. On the CSS path this is identical — the tree\n unmounts immediately. With a motion runtime the subtree is held on\n screen until the overlay and content finish their exit animations.\n */}\n <AnimatedPresence onExitComplete={() => setIsExiting(false)}>\n {open && (\n <div key=\"modal-root\" className=\"fixed inset-0 z-50\">\n {/* Overlay backdrop */}\n <Animated\n preset=\"overlay\"\n mode=\"presence\"\n className={cn(modalOverlayVariants())}\n fallbackClassName={MODAL_OVERLAY_FALLBACK_ANIMATION}\n data-state=\"open\"\n aria-hidden=\"true\"\n />\n {/* Scrollable centering container — click outside to close */}\n <div className=\"fixed inset-0 overflow-y-auto\">\n {/* eslint-disable-next-line jsx-a11y/click-events-have-key-events, jsx-a11y/no-static-element-interactions */}\n <div\n className=\"flex min-h-full items-center justify-center p-0 sm:p-4\"\n onClick={handleOverlayClick}\n >\n {/* Content */}\n <Animated\n ref={focusTrapRef}\n preset=\"modalContent\"\n mode=\"presence\"\n role=\"dialog\"\n aria-modal=\"true\"\n aria-label={ariaLabel}\n aria-labelledby={ariaLabelledBy || `${modalId}-title`}\n aria-describedby={ariaDescribedBy}\n id={modalId}\n tabIndex={-1}\n data-state=\"open\"\n data-slot=\"modal\"\n className={cn(modalContentVariants({ size }), className)}\n fallbackClassName={MODAL_CONTENT_FALLBACK_ANIMATION}\n onClick={(e) => e.stopPropagation()}\n >\n {children}\n </Animated>\n </div>\n </div>\n </div>\n )}\n </AnimatedPresence>\n </ModalContext.Provider>\n );\n}\n\nModal.displayName = 'Modal';\n\n// ============================================================================\n// Modal Context\n// ============================================================================\n\ninterface ModalContextValue {\n onClose: () => void;\n modalId: string;\n}\n\nconst ModalContext = React.createContext<ModalContextValue | undefined>(\n undefined\n);\n\nfunction useModalContext() {\n const context = React.useContext(ModalContext);\n if (!context) {\n throw new Error('Modal components must be used within a Modal');\n }\n return context;\n}\n\n// ============================================================================\n// Modal Header\n// ============================================================================\n\nexport type ModalHeaderProps = React.HTMLAttributes<HTMLDivElement>;\n\n/**\n * Header section of a Modal.\n */\nconst ModalHeader = React.forwardRef<HTMLDivElement, ModalHeaderProps>(\n ({ className, ...props }, ref) => (\n <div\n ref={ref}\n data-slot=\"modal-header\"\n className={cn(\n 'flex shrink-0 items-center justify-between',\n 'border-border border-b px-6 py-4',\n className\n )}\n {...props}\n />\n )\n);\n\nModalHeader.displayName = 'ModalHeader';\n\n// ============================================================================\n// Modal Title\n// ============================================================================\n\nexport type ModalTitleProps = React.HTMLAttributes<HTMLHeadingElement>;\n\n/**\n * Title for a Modal.\n */\nconst ModalTitle = React.forwardRef<HTMLHeadingElement, ModalTitleProps>(\n ({ className, children, ...props }, ref) => {\n const { modalId } = useModalContext();\n return (\n <h2\n ref={ref}\n id={`${modalId}-title`}\n data-slot=\"modal-title\"\n className={cn(\n 'text-lg leading-none font-semibold tracking-tight',\n className\n )}\n {...props}\n >\n {children}\n </h2>\n );\n }\n);\n\nModalTitle.displayName = 'ModalTitle';\n\n// ============================================================================\n// Modal Close Button\n// ============================================================================\n\nexport type ModalCloseProps = React.ButtonHTMLAttributes<HTMLButtonElement>;\n\n/**\n * Close button for a Modal.\n */\nconst ModalClose = React.forwardRef<HTMLButtonElement, ModalCloseProps>(\n ({ className, children, onClick, ...props }, ref) => {\n const { onClose } = useModalContext();\n\n const handleClick = React.useCallback(\n (e: React.MouseEvent<HTMLButtonElement>) => {\n onClick?.(e);\n if (!e.defaultPrevented) {\n onClose();\n }\n },\n [onClick, onClose]\n );\n\n return (\n <button\n ref={ref}\n type=\"button\"\n onClick={handleClick}\n data-slot=\"modal-close\"\n className={cn(\n 'inline-flex h-8 w-8 items-center justify-center rounded-lg',\n 'text-muted-foreground hover:text-foreground',\n 'hover:bg-muted transition-colors',\n 'focus-visible:ring-ring focus-visible:ring-2 focus-visible:outline-none',\n className\n )}\n aria-label=\"Close\"\n {...props}\n >\n {children || <CloseIcon />}\n </button>\n );\n }\n);\n\nModalClose.displayName = 'ModalClose';\n\n// ============================================================================\n// Modal Body\n// ============================================================================\n\nexport type ModalBodyProps = React.HTMLAttributes<HTMLDivElement>;\n\n/**\n * Main content area of a Modal.\n */\nconst ModalBody = React.forwardRef<HTMLDivElement, ModalBodyProps>(\n ({ className, ...props }, ref) => (\n <div\n ref={ref}\n data-slot=\"modal-body\"\n className={cn('min-h-0 flex-1 overflow-y-auto px-6 py-4', className)}\n {...props}\n />\n )\n);\n\nModalBody.displayName = 'ModalBody';\n\n// ============================================================================\n// Modal Footer\n// ============================================================================\n\nexport type ModalFooterProps = React.HTMLAttributes<HTMLDivElement>;\n\n/**\n * Footer section of a Modal, typically for action buttons.\n */\nconst ModalFooter = React.forwardRef<HTMLDivElement, ModalFooterProps>(\n ({ className, ...props }, ref) => (\n <div\n ref={ref}\n data-slot=\"modal-footer\"\n className={cn(\n 'flex shrink-0 items-center justify-end gap-3',\n 'border-border border-t px-6 py-4',\n className\n )}\n {...props}\n />\n )\n);\n\nModalFooter.displayName = 'ModalFooter';\n\n// ============================================================================\n// Close Icon\n// ============================================================================\n\nfunction CloseIcon() {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n >\n <path d=\"M18 6 6 18\" />\n <path d=\"m6 6 12 12\" />\n </svg>\n );\n}\n\nexport {\n Modal,\n ModalHeader,\n ModalTitle,\n ModalClose,\n ModalBody,\n ModalFooter,\n modalContentVariants,\n modalOverlayVariants,\n};\n"]}
@@ -1,5 +1,6 @@
1
1
  'use strict';
2
2
 
3
+ var chunk7WJ6MBF5_cjs = require('./chunk-7WJ6MBF5.cjs');
3
4
  var chunkS5RVSXDV_cjs = require('./chunk-S5RVSXDV.cjs');
4
5
  var React = require('react');
5
6
  var classVarianceAuthority = require('class-variance-authority');
@@ -40,6 +41,8 @@ function Tabs({
40
41
  defaultValue,
41
42
  onValueChange,
42
43
  variant = "underline",
44
+ urlParam,
45
+ urlValues,
43
46
  children,
44
47
  className
45
48
  }) {
@@ -47,15 +50,20 @@ function Tabs({
47
50
  defaultValue || ""
48
51
  );
49
52
  const isControlled = controlledValue !== void 0;
50
- const value = isControlled ? controlledValue : uncontrolledValue;
53
+ const syncsUrl = !isControlled && Boolean(urlParam);
54
+ const [urlValue, setUrlValue] = chunk7WJ6MBF5_cjs.useUrlSearchParam(
55
+ syncsUrl ? urlParam : void 0,
56
+ defaultValue || "",
57
+ (v) => urlValues ? urlValues.includes(v) : v !== ""
58
+ );
59
+ const value = isControlled ? controlledValue : syncsUrl ? urlValue : uncontrolledValue;
51
60
  const handleValueChange = React__namespace.useCallback(
52
61
  (newValue) => {
53
- if (!isControlled) {
54
- setUncontrolledValue(newValue);
55
- }
62
+ if (syncsUrl) setUrlValue(newValue);
63
+ else if (!isControlled) setUncontrolledValue(newValue);
56
64
  onValueChange?.(newValue);
57
65
  },
58
- [isControlled, onValueChange]
66
+ [isControlled, syncsUrl, setUrlValue, onValueChange]
59
67
  );
60
68
  return /* @__PURE__ */ jsxRuntime.jsx(
61
69
  TabsContext.Provider,
@@ -162,7 +170,7 @@ var tabsTriggerVariants = classVarianceAuthority.cva(
162
170
  ],
163
171
  pills: [
164
172
  "px-3 py-1.5 rounded-md text-sm",
165
- "text-muted-foreground hover:text-foreground",
173
+ "text-neutral-600 dark:text-neutral-300 hover:text-foreground",
166
174
  "data-[state=active]:bg-background data-[state=active]:text-foreground data-[state=active]:shadow-sm"
167
175
  ],
168
176
  enclosed: [
@@ -244,5 +252,5 @@ exports.TabsList = TabsList;
244
252
  exports.TabsTrigger = TabsTrigger;
245
253
  exports.tabsListVariants = tabsListVariants;
246
254
  exports.tabsTriggerVariants = tabsTriggerVariants;
247
- //# sourceMappingURL=chunk-P7UMS4E6.cjs.map
248
- //# sourceMappingURL=chunk-P7UMS4E6.cjs.map
255
+ //# sourceMappingURL=chunk-LC7PVBXH.cjs.map
256
+ //# sourceMappingURL=chunk-LC7PVBXH.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/Tabs/Tabs.tsx"],"names":["React","useUrlSearchParam","jsx","cn","cva","jsxs"],"mappings":"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","file":"chunk-LC7PVBXH.cjs","sourcesContent":["import * as React from 'react';\nimport { cva } from 'class-variance-authority';\nimport { cn } from '../../utils/cn';\nimport { useUrlSearchParam } from '../../hooks/useUrlTab';\n\n// ============================================================================\n// Tabs Context\n// ============================================================================\n\ninterface TabsContextValue {\n value: string;\n onValueChange: (value: string) => void;\n variant: 'underline' | 'pills' | 'enclosed';\n}\n\nconst TabsContext = React.createContext<TabsContextValue | undefined>(\n undefined\n);\n\nfunction useTabsContext() {\n const context = React.useContext(TabsContext);\n if (!context) {\n throw new Error('Tabs components must be used within a Tabs provider');\n }\n return context;\n}\n\n// ============================================================================\n// Tabs Root\n// ============================================================================\n\nexport interface TabsProps {\n /** The controlled value of the selected tab */\n value?: string;\n /** The default value of the selected tab (uncontrolled) */\n defaultValue?: string;\n /** Callback when the selected tab changes */\n onValueChange?: (value: string) => void;\n /** Visual variant of the tabs */\n variant?: 'underline' | 'pills' | 'enclosed';\n /**\n * Query parameter that mirrors the selected tab (uncontrolled only). Written\n * with `history.replaceState`; omitted from the URL when it equals\n * `defaultValue`.\n */\n urlParam?: string;\n /**\n * Values `urlParam` may select. Anything else in the URL falls back to\n * `defaultValue`; without it, any non-empty value is accepted.\n */\n urlValues?: readonly string[];\n /** Tab content */\n children: React.ReactNode;\n /** Additional class name */\n className?: string;\n}\n\n/**\n * Accessible tabs component with keyboard navigation.\n *\n * @example\n * ```tsx\n * <Tabs defaultValue=\"tab1\">\n * <TabsList>\n * <TabsTrigger value=\"tab1\">Tab 1</TabsTrigger>\n * <TabsTrigger value=\"tab2\">Tab 2</TabsTrigger>\n * </TabsList>\n * <TabsContent value=\"tab1\">Content 1</TabsContent>\n * <TabsContent value=\"tab2\">Content 2</TabsContent>\n * </Tabs>\n * ```\n */\nfunction Tabs({\n value: controlledValue,\n defaultValue,\n onValueChange,\n variant = 'underline',\n urlParam,\n urlValues,\n children,\n className,\n}: TabsProps) {\n const [uncontrolledValue, setUncontrolledValue] = React.useState(\n defaultValue || ''\n );\n\n const isControlled = controlledValue !== undefined;\n const syncsUrl = !isControlled && Boolean(urlParam);\n const [urlValue, setUrlValue] = useUrlSearchParam(\n syncsUrl ? urlParam : undefined,\n defaultValue || '',\n (v) => (urlValues ? urlValues.includes(v) : v !== '')\n );\n const value = isControlled\n ? controlledValue\n : syncsUrl\n ? urlValue\n : uncontrolledValue;\n\n const handleValueChange = React.useCallback(\n (newValue: string) => {\n if (syncsUrl) setUrlValue(newValue);\n else if (!isControlled) setUncontrolledValue(newValue);\n onValueChange?.(newValue);\n },\n [isControlled, syncsUrl, setUrlValue, onValueChange]\n );\n\n return (\n <TabsContext.Provider\n value={{ value, onValueChange: handleValueChange, variant }}\n >\n <div data-slot=\"tabs\" className={cn('w-full', className)}>\n {children}\n </div>\n </TabsContext.Provider>\n );\n}\n\nTabs.displayName = 'Tabs';\n\n// ============================================================================\n// Tabs List\n// ============================================================================\n\nconst tabsListVariants = cva(['flex items-center'], {\n variants: {\n variant: {\n underline: 'border-b border-border gap-0',\n pills: 'gap-1 p-1 rounded-lg bg-muted',\n enclosed: 'gap-0 border-b border-border',\n },\n },\n defaultVariants: {\n variant: 'underline',\n },\n});\n\nexport type TabsListProps = React.HTMLAttributes<HTMLDivElement>;\n\n/**\n * Container for tab triggers.\n */\nconst TabsList = React.forwardRef<HTMLDivElement, TabsListProps>(\n ({ className, ...props }, ref) => {\n const { variant } = useTabsContext();\n const listRef = React.useRef<HTMLDivElement>(null);\n\n // Keyboard navigation\n const handleKeyDown = React.useCallback(\n (e: React.KeyboardEvent<HTMLDivElement>) => {\n const list = listRef.current;\n if (!list) return;\n\n const triggers = Array.from(\n list.querySelectorAll<HTMLButtonElement>(\n '[role=\"tab\"]:not([disabled])'\n )\n );\n const currentIndex = triggers.findIndex(\n (trigger) => trigger === document.activeElement\n );\n\n let nextIndex: number;\n\n switch (e.key) {\n case 'ArrowRight':\n case 'ArrowDown':\n e.preventDefault();\n nextIndex =\n currentIndex === triggers.length - 1 ? 0 : currentIndex + 1;\n triggers[nextIndex]?.focus();\n break;\n case 'ArrowLeft':\n case 'ArrowUp':\n e.preventDefault();\n nextIndex =\n currentIndex === 0 ? triggers.length - 1 : currentIndex - 1;\n triggers[nextIndex]?.focus();\n break;\n case 'Home':\n e.preventDefault();\n triggers[0]?.focus();\n break;\n case 'End':\n e.preventDefault();\n triggers[triggers.length - 1]?.focus();\n break;\n }\n },\n []\n );\n\n return (\n <div\n ref={(node) => {\n // Combine refs\n (listRef as React.MutableRefObject<HTMLDivElement | null>).current =\n node;\n if (typeof ref === 'function') {\n ref(node);\n } else if (ref) {\n ref.current = node;\n }\n }}\n role=\"tablist\"\n data-slot=\"tabs-list\"\n tabIndex={0}\n onKeyDown={handleKeyDown}\n className={cn(tabsListVariants({ variant }), className)}\n {...props}\n />\n );\n }\n);\n\nTabsList.displayName = 'TabsList';\n\n// ============================================================================\n// Tabs Trigger\n// ============================================================================\n\nconst tabsTriggerVariants = cva(\n [\n 'inline-flex items-center justify-center gap-2',\n 'font-medium transition-all duration-200',\n 'whitespace-nowrap',\n 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2',\n 'disabled:pointer-events-none disabled:opacity-50',\n ],\n {\n variants: {\n variant: {\n underline: [\n 'px-4 py-2 -mb-px',\n 'border-b-2 border-transparent',\n 'text-muted-foreground hover:text-foreground',\n 'data-[state=active]:border-primary-700 data-[state=active]:text-primary-800',\n 'dark:data-[state=active]:border-primary-400 dark:data-[state=active]:text-primary-400',\n ],\n pills: [\n 'px-3 py-1.5 rounded-md text-sm',\n 'text-neutral-600 dark:text-neutral-300 hover:text-foreground',\n 'data-[state=active]:bg-background data-[state=active]:text-foreground data-[state=active]:shadow-sm',\n ],\n enclosed: [\n 'px-4 py-2 -mb-px',\n 'border border-transparent rounded-t-lg',\n 'text-muted-foreground hover:text-foreground',\n 'data-[state=active]:border-border data-[state=active]:border-b-background data-[state=active]:bg-background data-[state=active]:text-foreground',\n ],\n },\n },\n defaultVariants: {\n variant: 'underline',\n },\n }\n);\n\nexport interface TabsTriggerProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {\n /** The value that identifies this tab */\n value: string;\n /** Icon to show before the label */\n icon?: React.ReactNode;\n}\n\n/**\n * A tab trigger button.\n */\nconst TabsTrigger = React.forwardRef<HTMLButtonElement, TabsTriggerProps>(\n ({ className, value, icon, children, disabled, ...props }, ref) => {\n const { value: selectedValue, onValueChange, variant } = useTabsContext();\n const isSelected = selectedValue === value;\n\n return (\n <button\n ref={ref}\n type=\"button\"\n role=\"tab\"\n data-slot=\"tabs-trigger\"\n aria-selected={isSelected}\n aria-controls={`tabpanel-${value}`}\n id={`tab-${value}`}\n tabIndex={isSelected ? 0 : -1}\n data-state={isSelected ? 'active' : 'inactive'}\n disabled={disabled}\n onClick={() => onValueChange(value)}\n className={cn(tabsTriggerVariants({ variant }), className)}\n {...props}\n >\n {icon && (\n <span data-slot=\"tabs-trigger-icon\" className=\"shrink-0\">\n {icon}\n </span>\n )}\n {children}\n </button>\n );\n }\n);\n\nTabsTrigger.displayName = 'TabsTrigger';\n\n// ============================================================================\n// Tabs Content\n// ============================================================================\n\nexport interface TabsContentProps extends React.HTMLAttributes<HTMLDivElement> {\n /** The value that identifies this content panel */\n value: string;\n /** Force mount the content (useful for animations) */\n forceMount?: boolean;\n}\n\n/**\n * Content panel for a tab.\n */\nconst TabsContent = React.forwardRef<HTMLDivElement, TabsContentProps>(\n ({ className, value, forceMount = false, children, ...props }, ref) => {\n const { value: selectedValue } = useTabsContext();\n const isSelected = selectedValue === value;\n\n if (!isSelected && !forceMount) {\n return null;\n }\n\n return (\n <div\n ref={ref}\n role=\"tabpanel\"\n data-slot=\"tabs-content\"\n id={`tabpanel-${value}`}\n aria-labelledby={`tab-${value}`}\n tabIndex={0}\n hidden={!isSelected}\n data-state={isSelected ? 'active' : 'inactive'}\n className={cn(\n 'focus-visible:ring-ring mt-4 rounded-lg focus-visible:ring-2 focus-visible:outline-none',\n !isSelected && 'hidden',\n className\n )}\n {...props}\n >\n {children}\n </div>\n );\n }\n);\n\nTabsContent.displayName = 'TabsContent';\n\nexport {\n Tabs,\n TabsList,\n TabsTrigger,\n TabsContent,\n tabsListVariants,\n tabsTriggerVariants,\n};\n"]}
@@ -1,6 +1,6 @@
1
- import { usePrefersReducedMotion } from './chunk-HB7C7NB5.js';
2
- import { Badge } from './chunk-BMSG4NBH.js';
3
- import { buttonVariants } from './chunk-GOALNQZ2.js';
1
+ import { usePrefersReducedMotion } from './chunk-XDU65GLW.js';
2
+ import { Badge } from './chunk-522WJIVI.js';
3
+ import { buttonVariants } from './chunk-GVM6DTR5.js';
4
4
  import { cn } from './chunk-TQONQSJO.js';
5
5
  import * as React from 'react';
6
6
  import { ArrowRight } from 'lucide-react';
@@ -306,5 +306,5 @@ function Detail({
306
306
  }
307
307
 
308
308
  export { RadialExplorer };
309
- //# sourceMappingURL=chunk-Y5HFM7LO.js.map
310
- //# sourceMappingURL=chunk-Y5HFM7LO.js.map
309
+ //# sourceMappingURL=chunk-LDBNUJB7.js.map
310
+ //# sourceMappingURL=chunk-LDBNUJB7.js.map