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

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 (326) hide show
  1. package/dist/CsvBlock-ROJCKJDP.cjs +16 -0
  2. package/dist/{CsvBlock-CVYA3HYS.cjs.map → CsvBlock-ROJCKJDP.cjs.map} +1 -1
  3. package/dist/CsvBlock-UWPMTLE2.js +7 -0
  4. package/dist/{CsvBlock-SM4NKSHA.js.map → CsvBlock-UWPMTLE2.js.map} +1 -1
  5. package/dist/HtmlPreviewBlock-DWFN6EUB.cjs +16 -0
  6. package/dist/{HtmlPreviewBlock-JF454L2L.cjs.map → HtmlPreviewBlock-DWFN6EUB.cjs.map} +1 -1
  7. package/dist/HtmlPreviewBlock-ME5U3XNS.js +7 -0
  8. package/dist/{HtmlPreviewBlock-FAMF4W24.js.map → HtmlPreviewBlock-ME5U3XNS.js.map} +1 -1
  9. package/dist/MermaidBlock-2B6CPD6Y.js +7 -0
  10. package/dist/{MermaidBlock-7V5G4K5A.js.map → MermaidBlock-2B6CPD6Y.js.map} +1 -1
  11. package/dist/MermaidBlock-D2UC5M55.cjs +16 -0
  12. package/dist/{MermaidBlock-FR5SQX4Q.cjs.map → MermaidBlock-D2UC5M55.cjs.map} +1 -1
  13. package/dist/SurveyBlock-4CD4AYMJ.cjs +16 -0
  14. package/dist/{SurveyBlock-MCJVWR7H.cjs.map → SurveyBlock-4CD4AYMJ.cjs.map} +1 -1
  15. package/dist/SurveyBlock-4DO62RBT.js +7 -0
  16. package/dist/{SurveyBlock-6K2POV7S.js.map → SurveyBlock-4DO62RBT.js.map} +1 -1
  17. package/dist/brands/index.cjs +13 -13
  18. package/dist/brands/index.js +4 -4
  19. package/dist/brands/types.cjs +4 -4
  20. package/dist/brands/types.d.cts +9 -0
  21. package/dist/brands/types.d.ts +9 -0
  22. package/dist/brands/types.js +1 -1
  23. package/dist/{chunk-XTHMC76F.cjs → chunk-2G75X6TS.cjs} +4 -4
  24. package/dist/{chunk-XTHMC76F.cjs.map → chunk-2G75X6TS.cjs.map} +1 -1
  25. package/dist/chunk-2IZLKPUW.js +412 -0
  26. package/dist/chunk-2IZLKPUW.js.map +1 -0
  27. package/dist/{chunk-AZP3DDBT.cjs → chunk-2QKBTPUC.cjs} +8 -8
  28. package/dist/{chunk-AZP3DDBT.cjs.map → chunk-2QKBTPUC.cjs.map} +1 -1
  29. package/dist/{chunk-7KWNY3HG.js → chunk-2YCERQWC.js} +8 -8
  30. package/dist/{chunk-7KWNY3HG.js.map → chunk-2YCERQWC.js.map} +1 -1
  31. package/dist/{chunk-VSVGMMNO.js → chunk-3M7TAXNR.js} +3 -3
  32. package/dist/{chunk-VSVGMMNO.js.map → chunk-3M7TAXNR.js.map} +1 -1
  33. package/dist/{chunk-5Z6UPVGC.cjs → chunk-3QEVGSFG.cjs} +5 -5
  34. package/dist/{chunk-5Z6UPVGC.cjs.map → chunk-3QEVGSFG.cjs.map} +1 -1
  35. package/dist/{chunk-PYHFVYVZ.js → chunk-3QGS6CXD.js} +3 -3
  36. package/dist/{chunk-PYHFVYVZ.js.map → chunk-3QGS6CXD.js.map} +1 -1
  37. package/dist/chunk-462XSCP3.cjs +199 -0
  38. package/dist/chunk-462XSCP3.cjs.map +1 -0
  39. package/dist/{chunk-WOYUQ4AT.js → chunk-5GOWFNQ6.js} +9 -3
  40. package/dist/chunk-5GOWFNQ6.js.map +1 -0
  41. package/dist/chunk-5GUOOLPR.cjs +436 -0
  42. package/dist/chunk-5GUOOLPR.cjs.map +1 -0
  43. package/dist/{chunk-WUBMDOTG.js → chunk-5JJ2DAE4.js} +4 -4
  44. package/dist/{chunk-WUBMDOTG.js.map → chunk-5JJ2DAE4.js.map} +1 -1
  45. package/dist/{chunk-RSCA5AZW.cjs → chunk-5MCBWTIF.cjs} +4 -4
  46. package/dist/{chunk-RSCA5AZW.cjs.map → chunk-5MCBWTIF.cjs.map} +1 -1
  47. package/dist/chunk-6EN3IQQI.cjs +332 -0
  48. package/dist/chunk-6EN3IQQI.cjs.map +1 -0
  49. package/dist/{chunk-OAZUDUGX.js → chunk-7IBZA7G6.js} +4 -4
  50. package/dist/{chunk-OAZUDUGX.js.map → chunk-7IBZA7G6.js.map} +1 -1
  51. package/dist/{chunk-AUOTJQGO.cjs → chunk-7ZDPD5ZX.cjs} +4 -4
  52. package/dist/{chunk-AUOTJQGO.cjs.map → chunk-7ZDPD5ZX.cjs.map} +1 -1
  53. package/dist/{chunk-IB54SKWB.cjs → chunk-7ZXAQTV4.cjs} +8 -8
  54. package/dist/{chunk-IB54SKWB.cjs.map → chunk-7ZXAQTV4.cjs.map} +1 -1
  55. package/dist/{chunk-IIFQ6BSJ.js → chunk-ACCAXVOG.js} +6 -6
  56. package/dist/{chunk-IIFQ6BSJ.js.map → chunk-ACCAXVOG.js.map} +1 -1
  57. package/dist/chunk-CR2SDI23.cjs +322 -0
  58. package/dist/chunk-CR2SDI23.cjs.map +1 -0
  59. package/dist/{chunk-OSPTA4UR.js → chunk-DEDN5HAG.js} +3 -3
  60. package/dist/{chunk-OSPTA4UR.js.map → chunk-DEDN5HAG.js.map} +1 -1
  61. package/dist/{chunk-PKD3JLS2.cjs → chunk-E4IBHYJ7.cjs} +9 -9
  62. package/dist/{chunk-PKD3JLS2.cjs.map → chunk-E4IBHYJ7.cjs.map} +1 -1
  63. package/dist/{chunk-E3KC2XLN.cjs → chunk-ELPW32ZI.cjs} +50 -50
  64. package/dist/{chunk-E3KC2XLN.cjs.map → chunk-ELPW32ZI.cjs.map} +1 -1
  65. package/dist/{chunk-QSVQABXD.js → chunk-ENKFJJZX.js} +7 -7
  66. package/dist/{chunk-QSVQABXD.js.map → chunk-ENKFJJZX.js.map} +1 -1
  67. package/dist/{chunk-MUIDWFYJ.js → chunk-FJ7YPVKV.js} +3 -3
  68. package/dist/{chunk-MUIDWFYJ.js.map → chunk-FJ7YPVKV.js.map} +1 -1
  69. package/dist/{chunk-3LHICE4I.cjs → chunk-FXO5ARBB.cjs} +5 -5
  70. package/dist/{chunk-3LHICE4I.cjs.map → chunk-FXO5ARBB.cjs.map} +1 -1
  71. package/dist/{chunk-QKAYRHWP.cjs → chunk-G3JX3UAU.cjs} +12 -12
  72. package/dist/{chunk-QKAYRHWP.cjs.map → chunk-G3JX3UAU.cjs.map} +1 -1
  73. package/dist/{chunk-OMAACCFW.cjs → chunk-GD7EBGC4.cjs} +19 -19
  74. package/dist/{chunk-OMAACCFW.cjs.map → chunk-GD7EBGC4.cjs.map} +1 -1
  75. package/dist/{chunk-KREUYVMZ.js → chunk-GOALNQZ2.js} +13 -4
  76. package/dist/chunk-GOALNQZ2.js.map +1 -0
  77. package/dist/{chunk-CK3KLRNF.js → chunk-H4ZXMQQW.js} +3 -3
  78. package/dist/{chunk-CK3KLRNF.js.map → chunk-H4ZXMQQW.js.map} +1 -1
  79. package/dist/{chunk-AHINB2TP.cjs → chunk-IX6KFB3K.cjs} +9 -9
  80. package/dist/{chunk-AHINB2TP.cjs.map → chunk-IX6KFB3K.cjs.map} +1 -1
  81. package/dist/chunk-IXFC7LK2.cjs +174 -0
  82. package/dist/chunk-IXFC7LK2.cjs.map +1 -0
  83. package/dist/{chunk-VNAREBLV.cjs → chunk-J5CSLNCN.cjs} +3 -3
  84. package/dist/{chunk-VNAREBLV.cjs.map → chunk-J5CSLNCN.cjs.map} +1 -1
  85. package/dist/{chunk-24SEAAOH.js → chunk-JHULS3EC.js} +2 -2
  86. package/dist/{chunk-24SEAAOH.js.map → chunk-JHULS3EC.js.map} +1 -1
  87. package/dist/{chunk-X5YM3KXY.js → chunk-JI244Y7C.js} +177 -3
  88. package/dist/chunk-JI244Y7C.js.map +1 -0
  89. package/dist/{chunk-MM7QKUE3.cjs → chunk-JID7AZTO.cjs} +5 -5
  90. package/dist/{chunk-MM7QKUE3.cjs.map → chunk-JID7AZTO.cjs.map} +1 -1
  91. package/dist/{chunk-ZB54MTMQ.js → chunk-KZFBQ7GY.js} +3 -3
  92. package/dist/{chunk-ZB54MTMQ.js.map → chunk-KZFBQ7GY.js.map} +1 -1
  93. package/dist/{chunk-XBXDUAIM.js → chunk-LL6IWKI3.js} +4 -4
  94. package/dist/{chunk-XBXDUAIM.js.map → chunk-LL6IWKI3.js.map} +1 -1
  95. package/dist/{chunk-ON4JULCA.js → chunk-LMBXJZLG.js} +3 -3
  96. package/dist/{chunk-ON4JULCA.js.map → chunk-LMBXJZLG.js.map} +1 -1
  97. package/dist/chunk-MWVW4APN.cjs +260 -0
  98. package/dist/chunk-MWVW4APN.cjs.map +1 -0
  99. package/dist/{chunk-BZAGP5W6.cjs → chunk-N6IY47YA.cjs} +8 -8
  100. package/dist/{chunk-BZAGP5W6.cjs.map → chunk-N6IY47YA.cjs.map} +1 -1
  101. package/dist/{chunk-OCV33S5Q.cjs → chunk-NFKX6QJP.cjs} +3 -3
  102. package/dist/{chunk-OCV33S5Q.cjs.map → chunk-NFKX6QJP.cjs.map} +1 -1
  103. package/dist/{chunk-J644FU54.cjs → chunk-NGQRS7AW.cjs} +9 -3
  104. package/dist/chunk-NGQRS7AW.cjs.map +1 -0
  105. package/dist/{chunk-QAKASRE6.js → chunk-NJ6MY6V5.js} +4 -4
  106. package/dist/{chunk-QAKASRE6.js.map → chunk-NJ6MY6V5.js.map} +1 -1
  107. package/dist/{chunk-P52GA3GJ.cjs → chunk-NM7O7RY5.cjs} +4 -2
  108. package/dist/chunk-NM7O7RY5.cjs.map +1 -0
  109. package/dist/{chunk-OFUKTVBN.cjs → chunk-OD47TTAW.cjs} +9 -9
  110. package/dist/{chunk-OFUKTVBN.cjs.map → chunk-OD47TTAW.cjs.map} +1 -1
  111. package/dist/{chunk-QKFJDQEK.js → chunk-OE5CKRUC.js} +4 -4
  112. package/dist/{chunk-QKFJDQEK.js.map → chunk-OE5CKRUC.js.map} +1 -1
  113. package/dist/{chunk-MBWF36DJ.js → chunk-P2CA3XGI.js} +3 -3
  114. package/dist/{chunk-MBWF36DJ.js.map → chunk-P2CA3XGI.js.map} +1 -1
  115. package/dist/chunk-POWS35OT.js +152 -0
  116. package/dist/chunk-POWS35OT.js.map +1 -0
  117. package/dist/chunk-PYJDVWXM.js +237 -0
  118. package/dist/chunk-PYJDVWXM.js.map +1 -0
  119. package/dist/{chunk-MTZPVOP6.js → chunk-Q77TE5DZ.js} +4 -2
  120. package/dist/chunk-Q77TE5DZ.js.map +1 -0
  121. package/dist/{chunk-L5W7TJQ5.js → chunk-RJ6NTJHC.js} +4 -4
  122. package/dist/{chunk-L5W7TJQ5.js.map → chunk-RJ6NTJHC.js.map} +1 -1
  123. package/dist/{chunk-C3DUS2VE.cjs → chunk-RS5VA6QU.cjs} +3 -3
  124. package/dist/{chunk-C3DUS2VE.cjs.map → chunk-RS5VA6QU.cjs.map} +1 -1
  125. package/dist/{chunk-IGNWT6RP.js → chunk-S7WCHDBO.js} +4 -4
  126. package/dist/{chunk-IGNWT6RP.js.map → chunk-S7WCHDBO.js.map} +1 -1
  127. package/dist/{chunk-RXPEZXAB.cjs → chunk-SGFYA22I.cjs} +5 -5
  128. package/dist/{chunk-RXPEZXAB.cjs.map → chunk-SGFYA22I.cjs.map} +1 -1
  129. package/dist/chunk-SQJFBZ42.js +297 -0
  130. package/dist/chunk-SQJFBZ42.js.map +1 -0
  131. package/dist/chunk-SUS3WFY3.js +156 -0
  132. package/dist/chunk-SUS3WFY3.js.map +1 -0
  133. package/dist/{chunk-H4AVMUOC.cjs → chunk-TAXD5ADA.cjs} +4 -4
  134. package/dist/{chunk-H4AVMUOC.cjs.map → chunk-TAXD5ADA.cjs.map} +1 -1
  135. package/dist/{chunk-NHN6A3ZO.js → chunk-TMMVIUUN.js} +4 -4
  136. package/dist/{chunk-NHN6A3ZO.js.map → chunk-TMMVIUUN.js.map} +1 -1
  137. package/dist/chunk-TPWKM7JH.js +196 -0
  138. package/dist/chunk-TPWKM7JH.js.map +1 -0
  139. package/dist/chunk-TU63764L.cjs +158 -0
  140. package/dist/chunk-TU63764L.cjs.map +1 -0
  141. package/dist/{chunk-PY7XAG4D.cjs → chunk-U42F3HLE.cjs} +177 -3
  142. package/dist/chunk-U42F3HLE.cjs.map +1 -0
  143. package/dist/{chunk-X5QRRMGB.cjs → chunk-UAMXCMST.cjs} +4 -4
  144. package/dist/{chunk-X5QRRMGB.cjs.map → chunk-UAMXCMST.cjs.map} +1 -1
  145. package/dist/{chunk-QAQOCS2J.js → chunk-UBOVDAD7.js} +3 -3
  146. package/dist/{chunk-QAQOCS2J.js.map → chunk-UBOVDAD7.js.map} +1 -1
  147. package/dist/{chunk-IGSIWNX3.cjs → chunk-UQ3VVR6A.cjs} +4 -4
  148. package/dist/{chunk-IGSIWNX3.cjs.map → chunk-UQ3VVR6A.cjs.map} +1 -1
  149. package/dist/{chunk-6QKMMKRY.cjs → chunk-UV2FVNWT.cjs} +5 -5
  150. package/dist/{chunk-6QKMMKRY.cjs.map → chunk-UV2FVNWT.cjs.map} +1 -1
  151. package/dist/{chunk-EG7XFZ3W.js → chunk-V7D3YGUV.js} +4 -4
  152. package/dist/{chunk-EG7XFZ3W.js.map → chunk-V7D3YGUV.js.map} +1 -1
  153. package/dist/{chunk-Y6DFMDMH.js → chunk-VILW53UZ.js} +3 -3
  154. package/dist/{chunk-Y6DFMDMH.js.map → chunk-VILW53UZ.js.map} +1 -1
  155. package/dist/{chunk-5WOB4UBD.js → chunk-VKELAMAZ.js} +3 -3
  156. package/dist/{chunk-5WOB4UBD.js.map → chunk-VKELAMAZ.js.map} +1 -1
  157. package/dist/{chunk-IINZWUGK.cjs → chunk-VNYW4C4J.cjs} +13 -4
  158. package/dist/chunk-VNYW4C4J.cjs.map +1 -0
  159. package/dist/{chunk-RD3JDFYJ.js → chunk-VOKVG3ER.js} +4 -4
  160. package/dist/{chunk-RD3JDFYJ.js.map → chunk-VOKVG3ER.js.map} +1 -1
  161. package/dist/{chunk-37UZHCLM.cjs → chunk-VPWJCJCX.cjs} +3 -3
  162. package/dist/{chunk-37UZHCLM.cjs.map → chunk-VPWJCJCX.cjs.map} +1 -1
  163. package/dist/{chunk-3RB35GYK.js → chunk-VU6UTJRM.js} +4 -4
  164. package/dist/{chunk-3RB35GYK.js.map → chunk-VU6UTJRM.js.map} +1 -1
  165. package/dist/{chunk-6SAYPXHX.js → chunk-WGPLUCBD.js} +4 -4
  166. package/dist/{chunk-6SAYPXHX.js.map → chunk-WGPLUCBD.js.map} +1 -1
  167. package/dist/{chunk-QO6PRHDX.cjs → chunk-WNAA6CLE.cjs} +2 -2
  168. package/dist/{chunk-QO6PRHDX.cjs.map → chunk-WNAA6CLE.cjs.map} +1 -1
  169. package/dist/{chunk-ZX2XRFE5.js → chunk-WNM7IZJ7.js} +7 -7
  170. package/dist/{chunk-ZX2XRFE5.js.map → chunk-WNM7IZJ7.js.map} +1 -1
  171. package/dist/{chunk-KLJGJJHN.cjs → chunk-WNZAYBVB.cjs} +49 -49
  172. package/dist/{chunk-KLJGJJHN.cjs.map → chunk-WNZAYBVB.cjs.map} +1 -1
  173. package/dist/{chunk-BVMABVC4.cjs → chunk-WWJIW2IH.cjs} +3 -3
  174. package/dist/{chunk-BVMABVC4.cjs.map → chunk-WWJIW2IH.cjs.map} +1 -1
  175. package/dist/{chunk-OYQ7GYAA.cjs → chunk-X4XPNTCZ.cjs} +12 -12
  176. package/dist/{chunk-OYQ7GYAA.cjs.map → chunk-X4XPNTCZ.cjs.map} +1 -1
  177. package/dist/{chunk-IFDC4TXM.cjs → chunk-XEAT7XJG.cjs} +4 -4
  178. package/dist/{chunk-IFDC4TXM.cjs.map → chunk-XEAT7XJG.cjs.map} +1 -1
  179. package/dist/{chunk-S3BCHPXT.cjs → chunk-XI34EGK5.cjs} +9 -9
  180. package/dist/{chunk-S3BCHPXT.cjs.map → chunk-XI34EGK5.cjs.map} +1 -1
  181. package/dist/chunk-Y5HFM7LO.js +310 -0
  182. package/dist/chunk-Y5HFM7LO.js.map +1 -0
  183. package/dist/{chunk-LECJMLNE.js → chunk-YQDA366U.js} +3 -3
  184. package/dist/{chunk-LECJMLNE.js.map → chunk-YQDA366U.js.map} +1 -1
  185. package/dist/{chunk-PHK4XBO5.js → chunk-Z5V7SAZ4.js} +4 -4
  186. package/dist/{chunk-PHK4XBO5.js.map → chunk-Z5V7SAZ4.js.map} +1 -1
  187. package/dist/{chunk-TZX76ZNZ.js → chunk-ZGRCSNPK.js} +5 -5
  188. package/dist/{chunk-TZX76ZNZ.js.map → chunk-ZGRCSNPK.js.map} +1 -1
  189. package/dist/{chunk-SRA2L3SQ.cjs → chunk-ZSGEGISB.cjs} +4 -4
  190. package/dist/{chunk-SRA2L3SQ.cjs.map → chunk-ZSGEGISB.cjs.map} +1 -1
  191. package/dist/components/AlertDialog/index.cjs +6 -6
  192. package/dist/components/AlertDialog/index.js +5 -5
  193. package/dist/components/Autocomplete/index.cjs +3 -3
  194. package/dist/components/Autocomplete/index.js +2 -2
  195. package/dist/components/Button/index.cjs +3 -3
  196. package/dist/components/Button/index.d.cts +3 -0
  197. package/dist/components/Button/index.d.ts +3 -0
  198. package/dist/components/Button/index.js +1 -1
  199. package/dist/components/Collapsible/index.cjs +5 -5
  200. package/dist/components/Collapsible/index.js +2 -2
  201. package/dist/components/CountryCodeDropdown/index.cjs +6 -6
  202. package/dist/components/CountryCodeDropdown/index.js +3 -3
  203. package/dist/components/CustomizableDashboard/index.cjs +11 -11
  204. package/dist/components/CustomizableDashboard/index.js +4 -4
  205. package/dist/components/DateInput/index.cjs +4 -4
  206. package/dist/components/DateInput/index.js +3 -3
  207. package/dist/components/Dropdown/index.cjs +11 -11
  208. package/dist/components/Dropdown/index.js +4 -4
  209. package/dist/components/FloatingWindow/index.cjs +4 -4
  210. package/dist/components/FloatingWindow/index.js +2 -2
  211. package/dist/components/GlossaryTooltip/index.cjs +4 -4
  212. package/dist/components/GlossaryTooltip/index.js +3 -3
  213. package/dist/components/KeyboardShortcutsOverlay/index.cjs +6 -6
  214. package/dist/components/KeyboardShortcutsOverlay/index.js +4 -4
  215. package/dist/components/Markdown/index.cjs +19 -19
  216. package/dist/components/Markdown/index.js +7 -7
  217. package/dist/components/MediaEditor/index.cjs +16 -16
  218. package/dist/components/MediaEditor/index.js +11 -11
  219. package/dist/components/MediaPlayer/index.cjs +6 -6
  220. package/dist/components/MediaPlayer/index.js +3 -3
  221. package/dist/components/MegaMenu/index.cjs +23 -0
  222. package/dist/components/MegaMenu/index.cjs.map +1 -0
  223. package/dist/components/MegaMenu/index.d.cts +106 -0
  224. package/dist/components/MegaMenu/index.d.ts +106 -0
  225. package/dist/components/MegaMenu/index.js +6 -0
  226. package/dist/components/MegaMenu/index.js.map +1 -0
  227. package/dist/components/Modal/index.cjs +11 -11
  228. package/dist/components/Modal/index.js +3 -3
  229. package/dist/components/OrbitRing/index.cjs +14 -0
  230. package/dist/components/OrbitRing/index.cjs.map +1 -0
  231. package/dist/components/OrbitRing/index.d.cts +64 -0
  232. package/dist/components/OrbitRing/index.d.ts +64 -0
  233. package/dist/components/OrbitRing/index.js +5 -0
  234. package/dist/components/OrbitRing/index.js.map +1 -0
  235. package/dist/components/RadialExplorer/index.cjs +18 -0
  236. package/dist/components/RadialExplorer/index.cjs.map +1 -0
  237. package/dist/components/RadialExplorer/index.d.cts +83 -0
  238. package/dist/components/RadialExplorer/index.d.ts +83 -0
  239. package/dist/components/RadialExplorer/index.js +9 -0
  240. package/dist/components/RadialExplorer/index.js.map +1 -0
  241. package/dist/components/RichTextEditor/index.cjs +9 -9
  242. package/dist/components/RichTextEditor/index.js +6 -6
  243. package/dist/components/SectionSpyNav/index.cjs +4 -4
  244. package/dist/components/SectionSpyNav/index.js +3 -3
  245. package/dist/components/Select/index.cjs +5 -5
  246. package/dist/components/Select/index.js +3 -3
  247. package/dist/components/Sheet/index.cjs +11 -11
  248. package/dist/components/Sheet/index.js +2 -2
  249. package/dist/components/SliderCalculator/index.cjs +20 -0
  250. package/dist/components/SliderCalculator/index.cjs.map +1 -0
  251. package/dist/components/SliderCalculator/index.d.cts +100 -0
  252. package/dist/components/SliderCalculator/index.d.ts +100 -0
  253. package/dist/components/SliderCalculator/index.js +7 -0
  254. package/dist/components/SliderCalculator/index.js.map +1 -0
  255. package/dist/components/SourceTip/index.cjs +4 -4
  256. package/dist/components/SourceTip/index.js +3 -3
  257. package/dist/components/SuperChat/index.cjs +12 -12
  258. package/dist/components/SuperChat/index.js +5 -5
  259. package/dist/components/SuperChat/plugins/index.cjs +8 -8
  260. package/dist/components/SuperChat/plugins/index.js +7 -7
  261. package/dist/components/ThemeProvider/index.cjs +9 -9
  262. package/dist/components/ThemeProvider/index.js +3 -3
  263. package/dist/components/Tooltip/index.cjs +3 -3
  264. package/dist/components/Tooltip/index.js +2 -2
  265. package/dist/components/VideoCard/index.cjs +21 -0
  266. package/dist/components/VideoCard/index.cjs.map +1 -0
  267. package/dist/components/VideoCard/index.d.cts +75 -0
  268. package/dist/components/VideoCard/index.d.ts +75 -0
  269. package/dist/components/VideoCard/index.js +8 -0
  270. package/dist/components/VideoCard/index.js.map +1 -0
  271. package/dist/components/YearTimeline/index.cjs +26 -0
  272. package/dist/components/YearTimeline/index.cjs.map +1 -0
  273. package/dist/components/YearTimeline/index.d.cts +82 -0
  274. package/dist/components/YearTimeline/index.d.ts +82 -0
  275. package/dist/components/YearTimeline/index.js +5 -0
  276. package/dist/components/YearTimeline/index.js.map +1 -0
  277. package/dist/datavis.cjs +2 -2
  278. package/dist/datavis.js +1 -1
  279. package/dist/enterprise-health-ITUNXDIW.js +4 -0
  280. package/dist/{enterprise-health-CWLUB77O.js.map → enterprise-health-ITUNXDIW.js.map} +1 -1
  281. package/dist/enterprise-health-UHHPVPU6.cjs +19 -0
  282. package/dist/{enterprise-health-75VYWAVG.cjs.map → enterprise-health-UHHPVPU6.cjs.map} +1 -1
  283. package/dist/esheet.cjs +18 -18
  284. package/dist/esheet.js +15 -15
  285. package/dist/globe.cjs +306 -0
  286. package/dist/globe.cjs.map +1 -0
  287. package/dist/globe.d.cts +99 -0
  288. package/dist/globe.d.ts +99 -0
  289. package/dist/globe.js +279 -0
  290. package/dist/globe.js.map +1 -0
  291. package/dist/hooks/index.cjs +29 -24
  292. package/dist/hooks/index.d.cts +41 -1
  293. package/dist/hooks/index.d.ts +41 -1
  294. package/dist/hooks/index.js +5 -4
  295. package/dist/index.cjs +1100 -968
  296. package/dist/index.cjs.map +1 -1
  297. package/dist/index.d.cts +22 -4
  298. package/dist/index.d.ts +22 -4
  299. package/dist/index.js +176 -99
  300. package/dist/index.js.map +1 -1
  301. package/dist/styles/effects.css +128 -0
  302. package/dist/styles/init.css +15 -0
  303. package/dist/styles.css +1 -1
  304. package/dist/tailwind-preset.cjs +4 -4
  305. package/dist/tailwind-preset.js +1 -1
  306. package/dist/utils/index.cjs +5 -5
  307. package/dist/utils/index.js +1 -1
  308. package/package.json +23 -2
  309. package/dist/CsvBlock-CVYA3HYS.cjs +0 -16
  310. package/dist/CsvBlock-SM4NKSHA.js +0 -7
  311. package/dist/HtmlPreviewBlock-FAMF4W24.js +0 -7
  312. package/dist/HtmlPreviewBlock-JF454L2L.cjs +0 -16
  313. package/dist/MermaidBlock-7V5G4K5A.js +0 -7
  314. package/dist/MermaidBlock-FR5SQX4Q.cjs +0 -16
  315. package/dist/SurveyBlock-6K2POV7S.js +0 -7
  316. package/dist/SurveyBlock-MCJVWR7H.cjs +0 -16
  317. package/dist/chunk-IINZWUGK.cjs.map +0 -1
  318. package/dist/chunk-J644FU54.cjs.map +0 -1
  319. package/dist/chunk-KREUYVMZ.js.map +0 -1
  320. package/dist/chunk-MTZPVOP6.js.map +0 -1
  321. package/dist/chunk-P52GA3GJ.cjs.map +0 -1
  322. package/dist/chunk-PY7XAG4D.cjs.map +0 -1
  323. package/dist/chunk-WOYUQ4AT.js.map +0 -1
  324. package/dist/chunk-X5YM3KXY.js.map +0 -1
  325. package/dist/enterprise-health-75VYWAVG.cjs +0 -19
  326. package/dist/enterprise-health-CWLUB77O.js +0 -4
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/components/GlossaryTooltip/GlossaryTooltip.tsx"],"names":["React","useAnchoredPosition","useEscapeKey","cn","jsxs","jsx","createPortal","X","Diamond","ArrowRight"],"mappings":"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","file":"chunk-H4AVMUOC.cjs","sourcesContent":["'use client';\n\nimport * as React from 'react';\nimport { createPortal } from 'react-dom';\nimport { ArrowRight, Diamond, X } from 'lucide-react';\nimport { cn } from '../../utils/cn';\nimport { useAnchoredPosition } from '../../hooks/useAnchoredPosition';\nimport { useEscapeKey } from '../../hooks/useEscapeKey';\n\n// =============================================================================\n// Types\n// =============================================================================\n\n/** Authoritative source link shown in the card footer. */\nexport interface GlossarySource {\n label: string;\n url: string;\n}\n\n/** Sibling term shown as a lateral \"hop\" chip. */\nexport interface GlossaryRelatedTerm {\n term: string;\n href?: string;\n}\n\nexport interface GlossaryTooltipProps {\n /** Visible, in-flow trigger text (may be a plural or abbreviation match). */\n children: React.ReactNode;\n /** Canonical term name, shown as the card heading. */\n term: string;\n definition: string;\n /** Human-readable category label, shown as a badge in the header. */\n category?: string;\n /** Optional single key fact, shown with a diamond marker. */\n keyFact?: string;\n /** Optional authoritative source link, shown in the footer. */\n source?: GlossarySource;\n /** Optional sibling terms, shown as chips. */\n related?: GlossaryRelatedTerm[];\n /**\n * Full glossary page for the term. When set, the trigger is a real link —\n * desktop clicks navigate while hover previews; touch taps pin the card.\n */\n href?: string;\n /** Truncation limit for the in-card definition (default 190 chars). */\n maxDefinitionLength?: number;\n /** Dashed underline marking the term as hoverable (default true). */\n underline?: boolean;\n className?: string;\n}\n\nconst HIDE_GRACE_MS = 180;\n\n// =============================================================================\n// GlossaryTooltip\n// =============================================================================\n\n/**\n * A rich \"what does this term mean?\" hover card: category badge, canonical\n * term, truncated definition, optional key fact, source link, and related\n * term chips. The provenance sibling is `SourceTip` (\"what backs this\n * claim?\") — the two share the same interaction grammar.\n *\n * Trigger and card are phrasing content (`span`/`a`/`button` only), so it is\n * valid inside `<p>` prose. The card portals to `body` with fixed\n * positioning, flipping and clamping to stay in the viewport. On touch, a\n * tap pins the card instead of navigating; Escape or an outside tap closes.\n *\n * @example\n * ```tsx\n * <GlossaryTooltip\n * term=\"OSHA recordable\"\n * definition=\"A work-related injury or illness that meets OSHA reporting criteria…\"\n * category=\"Compliance\"\n * href=\"/glossary/osha-recordable\"\n * >\n * OSHA recordables\n * </GlossaryTooltip>\n * ```\n */\nexport function GlossaryTooltip({\n children,\n term,\n definition,\n category,\n keyFact,\n source,\n related,\n href,\n maxDefinitionLength = 190,\n underline = true,\n className,\n}: GlossaryTooltipProps) {\n const [open, setOpen] = React.useState(false);\n const [pinned, setPinned] = React.useState(false);\n const timer = React.useRef<ReturnType<typeof setTimeout> | null>(null);\n // True while close() restores focus to the trigger, so the trigger's\n // focus-show doesn't immediately reopen a card the user just dismissed.\n const suppressFocusShow = React.useRef(false);\n\n const { anchorRef, floatingRef, style } = useAnchoredPosition<\n HTMLSpanElement,\n HTMLSpanElement\n >({\n open,\n placement: 'top',\n offset: 10,\n viewportPadding: 8,\n allowFlip: true,\n });\n\n const clearHideTimer = () => {\n if (timer.current) {\n clearTimeout(timer.current);\n timer.current = null;\n }\n };\n\n const show = React.useCallback(() => {\n clearHideTimer();\n setOpen(true);\n }, []);\n\n const scheduleHide = React.useCallback(() => {\n if (pinned) return;\n clearHideTimer();\n timer.current = setTimeout(() => setOpen(false), HIDE_GRACE_MS);\n }, [pinned]);\n\n const close = React.useCallback(() => {\n clearHideTimer();\n setPinned(false);\n setOpen(false);\n // Return focus to the trigger if it was inside the card.\n if (floatingRef.current?.contains(document.activeElement)) {\n suppressFocusShow.current = true;\n (anchorRef.current?.querySelector('a,button') as HTMLElement)?.focus();\n }\n }, [anchorRef, floatingRef]);\n\n React.useEffect(() => () => clearHideTimer(), []);\n\n // A pinned card is a non-modal dialog: move focus into it so its links\n // and close button are reachable by keyboard.\n React.useEffect(() => {\n if (pinned) floatingRef.current?.focus();\n }, [pinned, floatingRef]);\n\n useEscapeKey(close, open);\n\n // Pinned cards close on an outside tap; hover cards close on their own.\n React.useEffect(() => {\n if (!open || !pinned) return;\n const onPointer = (e: Event) => {\n const t = e.target as Node;\n if (anchorRef.current?.contains(t) || floatingRef.current?.contains(t))\n return;\n close();\n };\n document.addEventListener('mousedown', onPointer);\n document.addEventListener('touchstart', onPointer);\n return () => {\n document.removeEventListener('mousedown', onPointer);\n document.removeEventListener('touchstart', onPointer);\n };\n }, [open, pinned, close, anchorRef, floatingRef]);\n\n const togglePin = React.useCallback(() => {\n if (pinned) close();\n else {\n setPinned(true);\n show();\n }\n }, [pinned, close, show]);\n\n // Linked terms: desktop clicks navigate, coarse pointers pin instead.\n // Unlinked (button) terms: any click toggles the pin — hover previews,\n // click holds the card open.\n const onTriggerClick = (e: React.MouseEvent) => {\n const coarse =\n typeof window !== 'undefined' &&\n window.matchMedia('(hover: none)').matches;\n if (href) {\n if (!coarse) return;\n e.preventDefault();\n }\n togglePin();\n };\n\n const onTriggerKeyDown = (e: React.KeyboardEvent) => {\n if (href) return; // links keep native Enter navigation\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n togglePin();\n }\n };\n\n // Focus lives on the dialog container once pinned, so Enter/Space there\n // (not on a link or the close button inside) must also unpin.\n const onDialogKeyDown = (e: React.KeyboardEvent<HTMLSpanElement>) => {\n if (e.target !== e.currentTarget) return;\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n close();\n }\n };\n\n const onTriggerFocus = () => {\n if (suppressFocusShow.current) {\n suppressFocusShow.current = false;\n return;\n }\n show();\n };\n\n const onBlurCapture = (e: React.FocusEvent<HTMLSpanElement>) => {\n const next = e.relatedTarget as Node | null;\n if (\n next &&\n (anchorRef.current?.contains(next) || floatingRef.current?.contains(next))\n )\n return;\n scheduleHide();\n };\n\n const limit = Math.max(1, maxDefinitionLength);\n const short =\n definition.length > limit\n ? `${definition.slice(0, limit - 1).trimEnd()}…`\n : definition;\n\n const triggerClasses = cn(\n 'cursor-help',\n underline &&\n 'decoration-primary-400/70 underline decoration-dashed underline-offset-4',\n className\n );\n\n const triggerProps = {\n onClick: onTriggerClick,\n className: cn(\n triggerClasses,\n href && 'text-primary-800 dark:text-primary-400 font-medium'\n ),\n };\n\n return (\n <span\n ref={anchorRef}\n className=\"relative inline\"\n onMouseEnter={show}\n onMouseLeave={scheduleHide}\n onFocus={onTriggerFocus}\n onBlur={onBlurCapture}\n >\n {href ? (\n <a\n href={href}\n aria-expanded={open}\n aria-haspopup=\"dialog\"\n {...triggerProps}\n >\n {children}\n </a>\n ) : (\n <button\n type=\"button\"\n aria-expanded={open}\n aria-haspopup=\"dialog\"\n aria-label={`${term} — show definition`}\n onKeyDown={onTriggerKeyDown}\n {...triggerProps}\n className={cn(\n 'inline appearance-none border-0 bg-transparent p-0 text-inherit [font:inherit]',\n triggerProps.className\n )}\n >\n {children}\n </button>\n )}\n {open &&\n createPortal(\n /* eslint-disable-next-line jsx-a11y/no-noninteractive-element-interactions -- keyboard dismissal on a focused non-modal dialog container is the WAI-ARIA pattern; links inside keep their own semantics */\n <span\n ref={floatingRef}\n role=\"dialog\"\n aria-label={term}\n tabIndex={-1}\n onMouseEnter={show}\n onMouseLeave={scheduleHide}\n onBlurCapture={onBlurCapture}\n onKeyDown={onDialogKeyDown}\n className=\"focus-visible:ring-ring z-50 block w-80 rounded-lg outline-none focus-visible:ring-2\"\n style={style}\n >\n <span className=\"border-border bg-card block overflow-hidden rounded-lg border text-start font-normal tracking-normal normal-case shadow-xl ring-1 ring-black/5 dark:ring-white/10\">\n <span className=\"from-primary-700 to-primary-600 block bg-gradient-to-br px-3.5 py-2.5\">\n <span className=\"flex items-start justify-between gap-2\">\n <span className=\"block min-w-0\">\n {category && (\n <span className=\"mb-1 inline-flex rounded-full bg-white/15 px-2 py-0.5 text-[10px] font-bold tracking-wide text-white uppercase\">\n {category}\n </span>\n )}\n <span className=\"block text-sm leading-snug font-semibold text-white\">\n {term}\n </span>\n </span>\n {pinned && (\n <button\n type=\"button\"\n onClick={close}\n aria-label=\"Close definition\"\n className=\"shrink-0 rounded p-0.5 text-white/70 hover:bg-white/10 hover:text-white\"\n >\n <X aria-hidden=\"true\" className=\"h-3.5 w-3.5\" />\n </button>\n )}\n </span>\n </span>\n\n <span className=\"block px-3.5 py-2.5\">\n <span className=\"text-muted-foreground block text-[13px] leading-relaxed\">\n {short}\n </span>\n {keyFact && (\n <span className=\"mt-2 flex items-start gap-1.5\">\n <Diamond\n aria-hidden=\"true\"\n className=\"text-primary-500 mt-0.5 h-3 w-3 shrink-0\"\n />\n <span className=\"text-foreground min-w-0 text-xs leading-relaxed font-medium\">\n {keyFact}\n </span>\n </span>\n )}\n </span>\n\n {(source || (related && related.length > 0) || href) && (\n <span className=\"border-border bg-muted/50 block border-t px-3.5 py-2\">\n {related && related.length > 0 && (\n <span className=\"mb-1.5 flex flex-wrap gap-1\">\n {related.map((r) =>\n r.href ? (\n <a\n key={r.term}\n href={r.href}\n className=\"border-border bg-card text-foreground hover:border-primary-400 hover:text-primary-800 dark:hover:text-primary-400 rounded-full border px-2 py-0.5 text-[11px] font-medium\"\n >\n {r.term}\n </a>\n ) : (\n <span\n key={r.term}\n className=\"border-border bg-card text-muted-foreground rounded-full border px-2 py-0.5 text-[11px] font-medium\"\n >\n {r.term}\n </span>\n )\n )}\n </span>\n )}\n <span className=\"flex items-center justify-between gap-2\">\n {source ? (\n <a\n href={source.url}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"text-primary-800 hover:text-primary-700 dark:text-primary-400 dark:hover:text-primary-300 min-w-0 truncate text-[11px] font-semibold\"\n >\n {source.label}\n </a>\n ) : (\n <span />\n )}\n {href && (\n <a\n href={href}\n className=\"text-muted-foreground hover:text-foreground inline-flex shrink-0 items-center gap-0.5 text-[11px] font-medium\"\n >\n Full definition\n <ArrowRight\n aria-hidden=\"true\"\n className=\"h-3 w-3 rtl:-scale-x-100\"\n />\n </a>\n )}\n </span>\n </span>\n )}\n </span>\n </span>,\n document.body\n )}\n </span>\n );\n}\n"]}
1
+ {"version":3,"sources":["../src/components/GlossaryTooltip/GlossaryTooltip.tsx"],"names":["React","useAnchoredPosition","useEscapeKey","cn","jsxs","jsx","createPortal","X","Diamond","ArrowRight"],"mappings":"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","file":"chunk-TAXD5ADA.cjs","sourcesContent":["'use client';\n\nimport * as React from 'react';\nimport { createPortal } from 'react-dom';\nimport { ArrowRight, Diamond, X } from 'lucide-react';\nimport { cn } from '../../utils/cn';\nimport { useAnchoredPosition } from '../../hooks/useAnchoredPosition';\nimport { useEscapeKey } from '../../hooks/useEscapeKey';\n\n// =============================================================================\n// Types\n// =============================================================================\n\n/** Authoritative source link shown in the card footer. */\nexport interface GlossarySource {\n label: string;\n url: string;\n}\n\n/** Sibling term shown as a lateral \"hop\" chip. */\nexport interface GlossaryRelatedTerm {\n term: string;\n href?: string;\n}\n\nexport interface GlossaryTooltipProps {\n /** Visible, in-flow trigger text (may be a plural or abbreviation match). */\n children: React.ReactNode;\n /** Canonical term name, shown as the card heading. */\n term: string;\n definition: string;\n /** Human-readable category label, shown as a badge in the header. */\n category?: string;\n /** Optional single key fact, shown with a diamond marker. */\n keyFact?: string;\n /** Optional authoritative source link, shown in the footer. */\n source?: GlossarySource;\n /** Optional sibling terms, shown as chips. */\n related?: GlossaryRelatedTerm[];\n /**\n * Full glossary page for the term. When set, the trigger is a real link —\n * desktop clicks navigate while hover previews; touch taps pin the card.\n */\n href?: string;\n /** Truncation limit for the in-card definition (default 190 chars). */\n maxDefinitionLength?: number;\n /** Dashed underline marking the term as hoverable (default true). */\n underline?: boolean;\n className?: string;\n}\n\nconst HIDE_GRACE_MS = 180;\n\n// =============================================================================\n// GlossaryTooltip\n// =============================================================================\n\n/**\n * A rich \"what does this term mean?\" hover card: category badge, canonical\n * term, truncated definition, optional key fact, source link, and related\n * term chips. The provenance sibling is `SourceTip` (\"what backs this\n * claim?\") — the two share the same interaction grammar.\n *\n * Trigger and card are phrasing content (`span`/`a`/`button` only), so it is\n * valid inside `<p>` prose. The card portals to `body` with fixed\n * positioning, flipping and clamping to stay in the viewport. On touch, a\n * tap pins the card instead of navigating; Escape or an outside tap closes.\n *\n * @example\n * ```tsx\n * <GlossaryTooltip\n * term=\"OSHA recordable\"\n * definition=\"A work-related injury or illness that meets OSHA reporting criteria…\"\n * category=\"Compliance\"\n * href=\"/glossary/osha-recordable\"\n * >\n * OSHA recordables\n * </GlossaryTooltip>\n * ```\n */\nexport function GlossaryTooltip({\n children,\n term,\n definition,\n category,\n keyFact,\n source,\n related,\n href,\n maxDefinitionLength = 190,\n underline = true,\n className,\n}: GlossaryTooltipProps) {\n const [open, setOpen] = React.useState(false);\n const [pinned, setPinned] = React.useState(false);\n const timer = React.useRef<ReturnType<typeof setTimeout> | null>(null);\n // True while close() restores focus to the trigger, so the trigger's\n // focus-show doesn't immediately reopen a card the user just dismissed.\n const suppressFocusShow = React.useRef(false);\n\n const { anchorRef, floatingRef, style } = useAnchoredPosition<\n HTMLSpanElement,\n HTMLSpanElement\n >({\n open,\n placement: 'top',\n offset: 10,\n viewportPadding: 8,\n allowFlip: true,\n });\n\n const clearHideTimer = () => {\n if (timer.current) {\n clearTimeout(timer.current);\n timer.current = null;\n }\n };\n\n const show = React.useCallback(() => {\n clearHideTimer();\n setOpen(true);\n }, []);\n\n const scheduleHide = React.useCallback(() => {\n if (pinned) return;\n clearHideTimer();\n timer.current = setTimeout(() => setOpen(false), HIDE_GRACE_MS);\n }, [pinned]);\n\n const close = React.useCallback(() => {\n clearHideTimer();\n setPinned(false);\n setOpen(false);\n // Return focus to the trigger if it was inside the card.\n if (floatingRef.current?.contains(document.activeElement)) {\n suppressFocusShow.current = true;\n (anchorRef.current?.querySelector('a,button') as HTMLElement)?.focus();\n }\n }, [anchorRef, floatingRef]);\n\n React.useEffect(() => () => clearHideTimer(), []);\n\n // A pinned card is a non-modal dialog: move focus into it so its links\n // and close button are reachable by keyboard.\n React.useEffect(() => {\n if (pinned) floatingRef.current?.focus();\n }, [pinned, floatingRef]);\n\n useEscapeKey(close, open);\n\n // Pinned cards close on an outside tap; hover cards close on their own.\n React.useEffect(() => {\n if (!open || !pinned) return;\n const onPointer = (e: Event) => {\n const t = e.target as Node;\n if (anchorRef.current?.contains(t) || floatingRef.current?.contains(t))\n return;\n close();\n };\n document.addEventListener('mousedown', onPointer);\n document.addEventListener('touchstart', onPointer);\n return () => {\n document.removeEventListener('mousedown', onPointer);\n document.removeEventListener('touchstart', onPointer);\n };\n }, [open, pinned, close, anchorRef, floatingRef]);\n\n const togglePin = React.useCallback(() => {\n if (pinned) close();\n else {\n setPinned(true);\n show();\n }\n }, [pinned, close, show]);\n\n // Linked terms: desktop clicks navigate, coarse pointers pin instead.\n // Unlinked (button) terms: any click toggles the pin — hover previews,\n // click holds the card open.\n const onTriggerClick = (e: React.MouseEvent) => {\n const coarse =\n typeof window !== 'undefined' &&\n window.matchMedia('(hover: none)').matches;\n if (href) {\n if (!coarse) return;\n e.preventDefault();\n }\n togglePin();\n };\n\n const onTriggerKeyDown = (e: React.KeyboardEvent) => {\n if (href) return; // links keep native Enter navigation\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n togglePin();\n }\n };\n\n // Focus lives on the dialog container once pinned, so Enter/Space there\n // (not on a link or the close button inside) must also unpin.\n const onDialogKeyDown = (e: React.KeyboardEvent<HTMLSpanElement>) => {\n if (e.target !== e.currentTarget) return;\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n close();\n }\n };\n\n const onTriggerFocus = () => {\n if (suppressFocusShow.current) {\n suppressFocusShow.current = false;\n return;\n }\n show();\n };\n\n const onBlurCapture = (e: React.FocusEvent<HTMLSpanElement>) => {\n const next = e.relatedTarget as Node | null;\n if (\n next &&\n (anchorRef.current?.contains(next) || floatingRef.current?.contains(next))\n )\n return;\n scheduleHide();\n };\n\n const limit = Math.max(1, maxDefinitionLength);\n const short =\n definition.length > limit\n ? `${definition.slice(0, limit - 1).trimEnd()}…`\n : definition;\n\n const triggerClasses = cn(\n 'cursor-help',\n underline &&\n 'decoration-primary-400/70 underline decoration-dashed underline-offset-4',\n className\n );\n\n const triggerProps = {\n onClick: onTriggerClick,\n className: cn(\n triggerClasses,\n href && 'text-primary-800 dark:text-primary-400 font-medium'\n ),\n };\n\n return (\n <span\n ref={anchorRef}\n className=\"relative inline\"\n onMouseEnter={show}\n onMouseLeave={scheduleHide}\n onFocus={onTriggerFocus}\n onBlur={onBlurCapture}\n >\n {href ? (\n <a\n href={href}\n aria-expanded={open}\n aria-haspopup=\"dialog\"\n {...triggerProps}\n >\n {children}\n </a>\n ) : (\n <button\n type=\"button\"\n aria-expanded={open}\n aria-haspopup=\"dialog\"\n aria-label={`${term} — show definition`}\n onKeyDown={onTriggerKeyDown}\n {...triggerProps}\n className={cn(\n 'inline appearance-none border-0 bg-transparent p-0 text-inherit [font:inherit]',\n triggerProps.className\n )}\n >\n {children}\n </button>\n )}\n {open &&\n createPortal(\n /* eslint-disable-next-line jsx-a11y/no-noninteractive-element-interactions -- keyboard dismissal on a focused non-modal dialog container is the WAI-ARIA pattern; links inside keep their own semantics */\n <span\n ref={floatingRef}\n role=\"dialog\"\n aria-label={term}\n tabIndex={-1}\n onMouseEnter={show}\n onMouseLeave={scheduleHide}\n onBlurCapture={onBlurCapture}\n onKeyDown={onDialogKeyDown}\n className=\"focus-visible:ring-ring z-50 block w-80 rounded-lg outline-none focus-visible:ring-2\"\n style={style}\n >\n <span className=\"border-border bg-card block overflow-hidden rounded-lg border text-start font-normal tracking-normal normal-case shadow-xl ring-1 ring-black/5 dark:ring-white/10\">\n <span className=\"from-primary-700 to-primary-600 block bg-gradient-to-br px-3.5 py-2.5\">\n <span className=\"flex items-start justify-between gap-2\">\n <span className=\"block min-w-0\">\n {category && (\n <span className=\"mb-1 inline-flex rounded-full bg-white/15 px-2 py-0.5 text-[10px] font-bold tracking-wide text-white uppercase\">\n {category}\n </span>\n )}\n <span className=\"block text-sm leading-snug font-semibold text-white\">\n {term}\n </span>\n </span>\n {pinned && (\n <button\n type=\"button\"\n onClick={close}\n aria-label=\"Close definition\"\n className=\"shrink-0 rounded p-0.5 text-white/70 hover:bg-white/10 hover:text-white\"\n >\n <X aria-hidden=\"true\" className=\"h-3.5 w-3.5\" />\n </button>\n )}\n </span>\n </span>\n\n <span className=\"block px-3.5 py-2.5\">\n <span className=\"text-muted-foreground block text-[13px] leading-relaxed\">\n {short}\n </span>\n {keyFact && (\n <span className=\"mt-2 flex items-start gap-1.5\">\n <Diamond\n aria-hidden=\"true\"\n className=\"text-primary-500 mt-0.5 h-3 w-3 shrink-0\"\n />\n <span className=\"text-foreground min-w-0 text-xs leading-relaxed font-medium\">\n {keyFact}\n </span>\n </span>\n )}\n </span>\n\n {(source || (related && related.length > 0) || href) && (\n <span className=\"border-border bg-muted/50 block border-t px-3.5 py-2\">\n {related && related.length > 0 && (\n <span className=\"mb-1.5 flex flex-wrap gap-1\">\n {related.map((r) =>\n r.href ? (\n <a\n key={r.term}\n href={r.href}\n className=\"border-border bg-card text-foreground hover:border-primary-400 hover:text-primary-800 dark:hover:text-primary-400 rounded-full border px-2 py-0.5 text-[11px] font-medium\"\n >\n {r.term}\n </a>\n ) : (\n <span\n key={r.term}\n className=\"border-border bg-card text-muted-foreground rounded-full border px-2 py-0.5 text-[11px] font-medium\"\n >\n {r.term}\n </span>\n )\n )}\n </span>\n )}\n <span className=\"flex items-center justify-between gap-2\">\n {source ? (\n <a\n href={source.url}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"text-primary-800 hover:text-primary-700 dark:text-primary-400 dark:hover:text-primary-300 min-w-0 truncate text-[11px] font-semibold\"\n >\n {source.label}\n </a>\n ) : (\n <span />\n )}\n {href && (\n <a\n href={href}\n className=\"text-muted-foreground hover:text-foreground inline-flex shrink-0 items-center gap-0.5 text-[11px] font-medium\"\n >\n Full definition\n <ArrowRight\n aria-hidden=\"true\"\n className=\"h-3 w-3 rtl:-scale-x-100\"\n />\n </a>\n )}\n </span>\n </span>\n )}\n </span>\n </span>,\n document.body\n )}\n </span>\n );\n}\n"]}
@@ -1,5 +1,5 @@
1
- import { FenceBlock } from './chunk-CK3KLRNF.js';
2
- import { Button } from './chunk-KREUYVMZ.js';
1
+ import { FenceBlock } from './chunk-H4ZXMQQW.js';
2
+ import { Button } from './chunk-GOALNQZ2.js';
3
3
  import { Download } from 'lucide-react';
4
4
  import { useState, useEffect, useMemo, useCallback } from 'react';
5
5
  import { jsx, jsxs } from 'react/jsx-runtime';
@@ -178,5 +178,5 @@ var CsvBlock = ({ code, id }) => {
178
178
  };
179
179
 
180
180
  export { CsvBlock };
181
- //# sourceMappingURL=chunk-NHN6A3ZO.js.map
182
- //# sourceMappingURL=chunk-NHN6A3ZO.js.map
181
+ //# sourceMappingURL=chunk-TMMVIUUN.js.map
182
+ //# sourceMappingURL=chunk-TMMVIUUN.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/components/Markdown/CsvBlock.tsx"],"names":[],"mappings":"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","file":"chunk-NHN6A3ZO.js","sourcesContent":["/** CSV data rendered as a sortable table. Requires `papaparse`. */\nimport { Download } from 'lucide-react';\nimport React, { useCallback, useEffect, useMemo, useState } from 'react';\n\nimport { Button } from '../Button';\nimport { FenceBlock } from './FenceBlock';\n\ninterface CsvBlockProps {\n code: string;\n id: string;\n}\n\ninterface SortConfig {\n column: string;\n direction: 'asc' | 'desc';\n}\n\ntype CsvRow = Record<string, unknown>;\n// Minimal surface of papaparse we actually use, avoiding overload conflicts.\ninterface PapaApi {\n parse(\n input: string,\n config?: Record<string, unknown>\n ): {\n meta: { fields?: string[] };\n data: CsvRow[];\n errors: Array<{ message: string }>;\n };\n unparse(data: unknown): string;\n}\n\nlet papaPromise: Promise<PapaApi> | null = null;\nfunction loadPapa() {\n if (!papaPromise) {\n papaPromise = import(/* @vite-ignore */ 'papaparse')\n .then((mod: { default?: PapaApi } & Partial<PapaApi>) => {\n const api: PapaApi = (mod.default ?? mod) as PapaApi;\n if (!api?.parse) throw new Error('papaparse export not found');\n return api;\n })\n .catch((err) => {\n papaPromise = null;\n throw err as Error;\n });\n }\n return papaPromise;\n}\n\ninterface ParsedCsv {\n headers: string[];\n rows: CsvRow[];\n error: string | null;\n}\n\nexport const CsvBlock: React.FC<CsvBlockProps> = ({ code, id }) => {\n const [sortConfig, setSortConfig] = useState<SortConfig | null>(null);\n const [papa, setPapa] = useState<PapaApi | null>(null);\n const [loadError, setLoadError] = useState<string | null>(null);\n\n useEffect(() => {\n let cancelled = false;\n loadPapa()\n .then((api) => {\n if (!cancelled) setPapa(api);\n })\n .catch(() => {\n if (!cancelled)\n setLoadError(\n 'CSV preview requires the `papaparse` package. Install it with `npm install papaparse`.'\n );\n });\n return () => {\n cancelled = true;\n };\n }, []);\n\n const parsed = useMemo<ParsedCsv>(() => {\n if (!papa) return { headers: [], rows: [], error: null };\n try {\n const result = papa.parse(code, {\n header: true,\n dynamicTyping: true,\n skipEmptyLines: 'greedy',\n });\n if (result.errors?.length) {\n return {\n headers: result.meta.fields ?? [],\n rows: result.data,\n error: result.errors.map((e) => e.message).join('; '),\n };\n }\n return {\n headers: result.meta.fields ?? [],\n rows: result.data,\n error: null,\n };\n } catch (err) {\n return { headers: [], rows: [], error: (err as Error).message };\n }\n }, [code, papa]);\n\n const sortedRows = useMemo(() => {\n if (!sortConfig || parsed.error) return parsed.rows;\n return [...parsed.rows].sort((a, b) => {\n const aVal = a[sortConfig.column];\n const bVal = b[sortConfig.column];\n if (aVal == null && bVal == null) return 0;\n if (aVal == null) return 1;\n if (bVal == null) return -1;\n const cmp =\n typeof aVal === 'number' && typeof bVal === 'number'\n ? aVal - bVal\n : String(aVal).localeCompare(String(bVal));\n return sortConfig.direction === 'asc' ? cmp : -cmp;\n });\n }, [parsed.rows, sortConfig, parsed.error]);\n\n const handleSort = useCallback((column: string) => {\n setSortConfig((prev) => {\n if (prev?.column === column) {\n return prev.direction === 'asc' ? { column, direction: 'desc' } : null;\n }\n return { column, direction: 'asc' };\n });\n }, []);\n\n const handleExportCsv = useCallback(() => {\n if (!papa) return;\n const csvContent = papa.unparse(sortedRows);\n const blob = new Blob([csvContent], { type: 'text/csv;charset=utf-8;' });\n const url = URL.createObjectURL(blob);\n const link = document.createElement('a');\n link.href = url;\n link.download = `data-${id}.csv`;\n document.body.appendChild(link);\n link.click();\n document.body.removeChild(link);\n setTimeout(() => URL.revokeObjectURL(url), 100);\n }, [sortedRows, id, papa]);\n\n if (loadError) {\n return (\n <FenceBlock code={code} language=\"csv\" error={loadError}>\n <div />\n </FenceBlock>\n );\n }\n\n if (!papa) {\n return (\n <FenceBlock code={code} language=\"csv\" supportsRawView>\n <div className=\"flex items-center justify-center p-6 text-sm text-neutral-500\">\n Loading CSV parser…\n </div>\n </FenceBlock>\n );\n }\n\n if (parsed.error) {\n return (\n <FenceBlock code={code} language=\"csv\" error={parsed.error}>\n <div />\n </FenceBlock>\n );\n }\n\n return (\n <FenceBlock code={code} language=\"csv\" supportsRawView>\n <div className=\"relative\">\n <div className=\"flex items-center justify-between border-b border-neutral-200 px-3 py-1.5 dark:border-neutral-700\">\n <span className=\"text-xs text-neutral-500 dark:text-neutral-400\">\n {sortedRows.length} row{sortedRows.length !== 1 ? 's' : ''} ×{' '}\n {parsed.headers.length} column\n {parsed.headers.length !== 1 ? 's' : ''}\n </span>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={handleExportCsv}\n aria-label=\"Export CSV\"\n className=\"h-7 gap-1 px-2 text-xs\"\n >\n <Download className=\"h-3 w-3\" />\n Export\n </Button>\n </div>\n\n <div className=\"max-h-96 overflow-auto\">\n <table className=\"min-w-full text-sm\">\n <thead className=\"sticky top-0 bg-neutral-100 dark:bg-neutral-800\">\n <tr>\n {parsed.headers.map((header) => {\n const isSorted = sortConfig?.column === header;\n const ariaSort = isSorted\n ? sortConfig.direction === 'asc'\n ? 'ascending'\n : 'descending'\n : 'none';\n return (\n <th\n key={header}\n scope=\"col\"\n aria-sort={ariaSort}\n className=\"px-3 py-2 text-start text-xs font-medium whitespace-nowrap text-neutral-600 dark:text-neutral-400\"\n >\n <button\n type=\"button\"\n onClick={() => handleSort(header)}\n className=\"flex w-full cursor-pointer items-center gap-1 text-start font-medium select-none hover:text-neutral-900 dark:hover:text-neutral-200\"\n >\n {header}\n {isSorted && (\n <span aria-hidden=\"true\">\n {sortConfig.direction === 'asc' ? '↑' : '↓'}\n </span>\n )}\n </button>\n </th>\n );\n })}\n </tr>\n </thead>\n <tbody className=\"divide-y divide-neutral-200 dark:divide-neutral-700\">\n {sortedRows.map((row, i) => (\n <tr\n key={i}\n className=\"hover:bg-neutral-50 dark:hover:bg-neutral-800/50\"\n >\n {parsed.headers.map((header) => (\n <td\n key={header}\n className=\"px-3 py-1.5 whitespace-nowrap text-neutral-700 dark:text-neutral-300\"\n >\n {row[header] != null ? String(row[header]) : ''}\n </td>\n ))}\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n </div>\n </FenceBlock>\n );\n};\n"]}
1
+ {"version":3,"sources":["../src/components/Markdown/CsvBlock.tsx"],"names":[],"mappings":"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","file":"chunk-TMMVIUUN.js","sourcesContent":["/** CSV data rendered as a sortable table. Requires `papaparse`. */\nimport { Download } from 'lucide-react';\nimport React, { useCallback, useEffect, useMemo, useState } from 'react';\n\nimport { Button } from '../Button';\nimport { FenceBlock } from './FenceBlock';\n\ninterface CsvBlockProps {\n code: string;\n id: string;\n}\n\ninterface SortConfig {\n column: string;\n direction: 'asc' | 'desc';\n}\n\ntype CsvRow = Record<string, unknown>;\n// Minimal surface of papaparse we actually use, avoiding overload conflicts.\ninterface PapaApi {\n parse(\n input: string,\n config?: Record<string, unknown>\n ): {\n meta: { fields?: string[] };\n data: CsvRow[];\n errors: Array<{ message: string }>;\n };\n unparse(data: unknown): string;\n}\n\nlet papaPromise: Promise<PapaApi> | null = null;\nfunction loadPapa() {\n if (!papaPromise) {\n papaPromise = import(/* @vite-ignore */ 'papaparse')\n .then((mod: { default?: PapaApi } & Partial<PapaApi>) => {\n const api: PapaApi = (mod.default ?? mod) as PapaApi;\n if (!api?.parse) throw new Error('papaparse export not found');\n return api;\n })\n .catch((err) => {\n papaPromise = null;\n throw err as Error;\n });\n }\n return papaPromise;\n}\n\ninterface ParsedCsv {\n headers: string[];\n rows: CsvRow[];\n error: string | null;\n}\n\nexport const CsvBlock: React.FC<CsvBlockProps> = ({ code, id }) => {\n const [sortConfig, setSortConfig] = useState<SortConfig | null>(null);\n const [papa, setPapa] = useState<PapaApi | null>(null);\n const [loadError, setLoadError] = useState<string | null>(null);\n\n useEffect(() => {\n let cancelled = false;\n loadPapa()\n .then((api) => {\n if (!cancelled) setPapa(api);\n })\n .catch(() => {\n if (!cancelled)\n setLoadError(\n 'CSV preview requires the `papaparse` package. Install it with `npm install papaparse`.'\n );\n });\n return () => {\n cancelled = true;\n };\n }, []);\n\n const parsed = useMemo<ParsedCsv>(() => {\n if (!papa) return { headers: [], rows: [], error: null };\n try {\n const result = papa.parse(code, {\n header: true,\n dynamicTyping: true,\n skipEmptyLines: 'greedy',\n });\n if (result.errors?.length) {\n return {\n headers: result.meta.fields ?? [],\n rows: result.data,\n error: result.errors.map((e) => e.message).join('; '),\n };\n }\n return {\n headers: result.meta.fields ?? [],\n rows: result.data,\n error: null,\n };\n } catch (err) {\n return { headers: [], rows: [], error: (err as Error).message };\n }\n }, [code, papa]);\n\n const sortedRows = useMemo(() => {\n if (!sortConfig || parsed.error) return parsed.rows;\n return [...parsed.rows].sort((a, b) => {\n const aVal = a[sortConfig.column];\n const bVal = b[sortConfig.column];\n if (aVal == null && bVal == null) return 0;\n if (aVal == null) return 1;\n if (bVal == null) return -1;\n const cmp =\n typeof aVal === 'number' && typeof bVal === 'number'\n ? aVal - bVal\n : String(aVal).localeCompare(String(bVal));\n return sortConfig.direction === 'asc' ? cmp : -cmp;\n });\n }, [parsed.rows, sortConfig, parsed.error]);\n\n const handleSort = useCallback((column: string) => {\n setSortConfig((prev) => {\n if (prev?.column === column) {\n return prev.direction === 'asc' ? { column, direction: 'desc' } : null;\n }\n return { column, direction: 'asc' };\n });\n }, []);\n\n const handleExportCsv = useCallback(() => {\n if (!papa) return;\n const csvContent = papa.unparse(sortedRows);\n const blob = new Blob([csvContent], { type: 'text/csv;charset=utf-8;' });\n const url = URL.createObjectURL(blob);\n const link = document.createElement('a');\n link.href = url;\n link.download = `data-${id}.csv`;\n document.body.appendChild(link);\n link.click();\n document.body.removeChild(link);\n setTimeout(() => URL.revokeObjectURL(url), 100);\n }, [sortedRows, id, papa]);\n\n if (loadError) {\n return (\n <FenceBlock code={code} language=\"csv\" error={loadError}>\n <div />\n </FenceBlock>\n );\n }\n\n if (!papa) {\n return (\n <FenceBlock code={code} language=\"csv\" supportsRawView>\n <div className=\"flex items-center justify-center p-6 text-sm text-neutral-500\">\n Loading CSV parser…\n </div>\n </FenceBlock>\n );\n }\n\n if (parsed.error) {\n return (\n <FenceBlock code={code} language=\"csv\" error={parsed.error}>\n <div />\n </FenceBlock>\n );\n }\n\n return (\n <FenceBlock code={code} language=\"csv\" supportsRawView>\n <div className=\"relative\">\n <div className=\"flex items-center justify-between border-b border-neutral-200 px-3 py-1.5 dark:border-neutral-700\">\n <span className=\"text-xs text-neutral-500 dark:text-neutral-400\">\n {sortedRows.length} row{sortedRows.length !== 1 ? 's' : ''} ×{' '}\n {parsed.headers.length} column\n {parsed.headers.length !== 1 ? 's' : ''}\n </span>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={handleExportCsv}\n aria-label=\"Export CSV\"\n className=\"h-7 gap-1 px-2 text-xs\"\n >\n <Download className=\"h-3 w-3\" />\n Export\n </Button>\n </div>\n\n <div className=\"max-h-96 overflow-auto\">\n <table className=\"min-w-full text-sm\">\n <thead className=\"sticky top-0 bg-neutral-100 dark:bg-neutral-800\">\n <tr>\n {parsed.headers.map((header) => {\n const isSorted = sortConfig?.column === header;\n const ariaSort = isSorted\n ? sortConfig.direction === 'asc'\n ? 'ascending'\n : 'descending'\n : 'none';\n return (\n <th\n key={header}\n scope=\"col\"\n aria-sort={ariaSort}\n className=\"px-3 py-2 text-start text-xs font-medium whitespace-nowrap text-neutral-600 dark:text-neutral-400\"\n >\n <button\n type=\"button\"\n onClick={() => handleSort(header)}\n className=\"flex w-full cursor-pointer items-center gap-1 text-start font-medium select-none hover:text-neutral-900 dark:hover:text-neutral-200\"\n >\n {header}\n {isSorted && (\n <span aria-hidden=\"true\">\n {sortConfig.direction === 'asc' ? '↑' : '↓'}\n </span>\n )}\n </button>\n </th>\n );\n })}\n </tr>\n </thead>\n <tbody className=\"divide-y divide-neutral-200 dark:divide-neutral-700\">\n {sortedRows.map((row, i) => (\n <tr\n key={i}\n className=\"hover:bg-neutral-50 dark:hover:bg-neutral-800/50\"\n >\n {parsed.headers.map((header) => (\n <td\n key={header}\n className=\"px-3 py-1.5 whitespace-nowrap text-neutral-700 dark:text-neutral-300\"\n >\n {row[header] != null ? String(row[header]) : ''}\n </td>\n ))}\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n </div>\n </FenceBlock>\n );\n};\n"]}
@@ -0,0 +1,196 @@
1
+ import { useYouTubeHoverPreview } from './chunk-POWS35OT.js';
2
+ import { Badge } from './chunk-BMSG4NBH.js';
3
+ import { cn } from './chunk-TQONQSJO.js';
4
+ import { Play, VolumeX } from 'lucide-react';
5
+ import { jsxs, jsx } from 'react/jsx-runtime';
6
+
7
+ var DISC_SIZE = {
8
+ sm: "h-10 w-10",
9
+ md: "h-14 w-14",
10
+ lg: "h-20 w-20"
11
+ };
12
+ var ICON_SIZE = { sm: "h-4 w-4", md: "h-6 w-6", lg: "h-8 w-8" };
13
+ function PlayButton({
14
+ size = "md",
15
+ ring = "hover",
16
+ className,
17
+ ...props
18
+ }) {
19
+ return /* @__PURE__ */ jsxs(
20
+ "span",
21
+ {
22
+ "data-slot": "play-button",
23
+ "aria-hidden": "true",
24
+ className: cn(
25
+ "relative inline-flex items-center justify-center",
26
+ DISC_SIZE[size],
27
+ className
28
+ ),
29
+ ...props,
30
+ children: [
31
+ ring !== "none" && /* @__PURE__ */ jsx(
32
+ "span",
33
+ {
34
+ className: cn(
35
+ "pointer-events-none absolute -inset-2 rounded-full transition-opacity duration-300",
36
+ "motion-safe:animate-[mie-spin_1.4s_linear_infinite]",
37
+ "[background:conic-gradient(from_0deg,transparent_0deg,var(--mieweb-primary-500)_90deg,var(--mieweb-primary-300)_240deg,var(--mieweb-primary-200)_320deg,transparent_360deg)]",
38
+ "[mask:radial-gradient(farthest-side,transparent_calc(100%-4px),#000_calc(100%-4px))]",
39
+ "[-webkit-mask:radial-gradient(farthest-side,transparent_calc(100%-4px),#000_calc(100%-4px))]",
40
+ "drop-shadow-[0_0_5px_color-mix(in_srgb,var(--mieweb-primary-400)_60%,transparent)]",
41
+ ring === "hover" ? "opacity-0 group-hover:opacity-100 group-focus-visible:opacity-100" : "opacity-100"
42
+ )
43
+ }
44
+ ),
45
+ /* @__PURE__ */ jsx(
46
+ "span",
47
+ {
48
+ className: cn(
49
+ "relative flex items-center justify-center rounded-full bg-white/90 shadow-lg transition-transform group-hover:scale-110",
50
+ DISC_SIZE[size]
51
+ ),
52
+ children: /* @__PURE__ */ jsx(
53
+ Play,
54
+ {
55
+ className: cn("text-primary-600 ml-0.5", ICON_SIZE[size]),
56
+ fill: "currentColor"
57
+ }
58
+ )
59
+ }
60
+ )
61
+ ]
62
+ }
63
+ );
64
+ }
65
+ function VideoCard({
66
+ title,
67
+ href,
68
+ onClick,
69
+ target,
70
+ youtubeId,
71
+ thumbnailUrl,
72
+ thumbnailAlt,
73
+ duration,
74
+ durationPrefix = "Watch",
75
+ preview = true,
76
+ silentLabel = "Silent",
77
+ eyebrow,
78
+ description,
79
+ footer,
80
+ variant = "card",
81
+ headingLevel: Heading = "h3",
82
+ className
83
+ }) {
84
+ const thumb = thumbnailUrl ?? (youtubeId ? `https://i.ytimg.com/vi/${youtubeId}/hqdefault.jpg` : void 0);
85
+ const hover = useYouTubeHoverPreview(youtubeId, { enabled: preview });
86
+ const playing = hover.preview === "playing";
87
+ const pill = duration && (durationPrefix ? `${durationPrefix} \xB7 ${duration}` : duration);
88
+ const media = /* @__PURE__ */ jsxs(
89
+ "div",
90
+ {
91
+ "data-slot": "video-card-media",
92
+ className: "bg-primary-950 relative aspect-video overflow-hidden",
93
+ children: [
94
+ thumb && /* @__PURE__ */ jsx(
95
+ "img",
96
+ {
97
+ src: thumb,
98
+ alt: thumbnailAlt ?? title,
99
+ loading: "lazy",
100
+ decoding: "async",
101
+ className: "absolute inset-0 h-full w-full object-cover transition-transform duration-300 group-hover:scale-105"
102
+ }
103
+ ),
104
+ /* @__PURE__ */ jsx(
105
+ "div",
106
+ {
107
+ ref: hover.hostRef,
108
+ "aria-hidden": "true",
109
+ className: cn(
110
+ "bg-primary-950 pointer-events-none absolute inset-0 overflow-hidden transition-opacity duration-500",
111
+ "[&_iframe]:absolute [&_iframe]:inset-0 [&_iframe]:h-full [&_iframe]:w-full [&_iframe]:border-0",
112
+ playing ? "opacity-100" : "opacity-0"
113
+ )
114
+ }
115
+ ),
116
+ playing && /* @__PURE__ */ jsxs("span", { className: "absolute start-2 top-2 inline-flex items-center gap-1 rounded bg-black/55 px-1.5 py-0.5 text-[11px] font-medium text-white backdrop-blur-sm", children: [
117
+ /* @__PURE__ */ jsx(VolumeX, { className: "h-3 w-3", "aria-hidden": "true" }),
118
+ silentLabel
119
+ ] }),
120
+ /* @__PURE__ */ jsx(
121
+ "div",
122
+ {
123
+ className: cn(
124
+ "bg-primary-950/20 group-hover:bg-primary-950/30 absolute inset-0 flex items-center justify-center transition-all duration-300",
125
+ playing && "opacity-0"
126
+ ),
127
+ children: /* @__PURE__ */ jsx(PlayButton, { size: variant === "plate" ? "lg" : "md" })
128
+ }
129
+ ),
130
+ pill && !playing && /* @__PURE__ */ jsx(
131
+ Badge,
132
+ {
133
+ "data-slot": "video-card-duration",
134
+ size: "sm",
135
+ className: "absolute end-2 bottom-2 bg-black/60 py-1 text-white backdrop-blur-sm dark:bg-black/60 dark:text-white",
136
+ children: pill
137
+ }
138
+ ),
139
+ hover.preview !== "idle" && /* @__PURE__ */ jsx("div", { className: "absolute inset-x-0 bottom-0 h-1 bg-white/20", children: /* @__PURE__ */ jsx(
140
+ "div",
141
+ {
142
+ className: "h-full rounded-e-full bg-[linear-gradient(90deg,var(--mieweb-primary-500),var(--mieweb-primary-300))] transition-[width] duration-200 ease-linear",
143
+ style: { width: `${Math.max(hover.progress * 100, 1.5)}%` }
144
+ }
145
+ ) })
146
+ ]
147
+ }
148
+ );
149
+ const TitleTag = href ? Heading : "span";
150
+ const body = variant === "card" && /* @__PURE__ */ jsxs("div", { "data-slot": "video-card-body", className: "p-4 text-start", children: [
151
+ eyebrow && /* @__PURE__ */ jsx("div", { className: "mb-2 flex items-center gap-2", children: eyebrow }),
152
+ /* @__PURE__ */ jsx(TitleTag, { className: "text-foreground group-hover:text-primary-700 dark:group-hover:text-primary-300 block text-lg font-semibold transition-colors", children: title }),
153
+ description && /* @__PURE__ */ jsx("p", { className: "text-muted-foreground mt-1 line-clamp-2 text-sm", children: description }),
154
+ footer && /* @__PURE__ */ jsx("div", { className: "text-muted-foreground mt-2 text-sm", children: footer })
155
+ ] });
156
+ const shell = cn(
157
+ "group block w-full overflow-hidden no-underline transition-shadow",
158
+ "focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2",
159
+ variant === "card" ? "rounded-xl border border-border bg-card text-card-foreground shadow-md hover:shadow-lg" : "rounded-xl shadow-lg",
160
+ className
161
+ );
162
+ const interaction = {
163
+ onMouseEnter: hover.handleEnter,
164
+ onMouseLeave: hover.stopPreview,
165
+ onFocus: hover.handleEnter,
166
+ onBlur: hover.stopPreview,
167
+ "aria-label": `Watch: ${title}`,
168
+ "data-slot": "video-card",
169
+ "data-preview": hover.preview
170
+ };
171
+ if (href) {
172
+ return /* @__PURE__ */ jsxs(
173
+ "a",
174
+ {
175
+ href,
176
+ target,
177
+ rel: target === "_blank" ? "noopener noreferrer" : void 0,
178
+ onClick,
179
+ className: shell,
180
+ ...interaction,
181
+ children: [
182
+ media,
183
+ body
184
+ ]
185
+ }
186
+ );
187
+ }
188
+ return /* @__PURE__ */ jsxs("button", { type: "button", onClick, className: shell, ...interaction, children: [
189
+ media,
190
+ body
191
+ ] });
192
+ }
193
+
194
+ export { PlayButton, VideoCard };
195
+ //# sourceMappingURL=chunk-TPWKM7JH.js.map
196
+ //# sourceMappingURL=chunk-TPWKM7JH.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/VideoCard/VideoCard.tsx"],"names":[],"mappings":"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","file":"chunk-TPWKM7JH.js","sourcesContent":["'use client';\n\nimport * as React from 'react';\nimport { Play, VolumeX } from 'lucide-react';\nimport { cn } from '../../utils/cn';\nimport { Badge } from '../Badge';\nimport { useYouTubeHoverPreview } from '../../hooks/useYouTubeHoverPreview';\n\n// =============================================================================\n// PlayButton\n// =============================================================================\n\nexport interface PlayButtonProps extends React.HTMLAttributes<HTMLSpanElement> {\n /** Disc diameter. Default `md` (56px). */\n size?: 'sm' | 'md' | 'lg';\n /**\n * Show the spinning brand ring. Default `hover` — the ring appears and spins\n * only while the nearest `.group` ancestor is hovered; `always` keeps it on.\n */\n ring?: 'hover' | 'always' | 'none';\n}\n\nconst DISC_SIZE = {\n sm: 'h-10 w-10',\n md: 'h-14 w-14',\n lg: 'h-20 w-20',\n} as const;\nconst ICON_SIZE = { sm: 'h-4 w-4', md: 'h-6 w-6', lg: 'h-8 w-8' } as const;\n\n/**\n * The branded play affordance: a white disc with a filled brand triangle and a\n * conic-gradient ring that lights up and spins on hover. Decorative — the\n * surrounding card/link carries the accessible label.\n */\nexport function PlayButton({\n size = 'md',\n ring = 'hover',\n className,\n ...props\n}: PlayButtonProps) {\n return (\n <span\n data-slot=\"play-button\"\n aria-hidden=\"true\"\n className={cn(\n 'relative inline-flex items-center justify-center',\n DISC_SIZE[size],\n className\n )}\n {...props}\n >\n {ring !== 'none' && (\n <span\n className={cn(\n 'pointer-events-none absolute -inset-2 rounded-full transition-opacity duration-300',\n 'motion-safe:animate-[mie-spin_1.4s_linear_infinite]',\n '[background:conic-gradient(from_0deg,transparent_0deg,var(--mieweb-primary-500)_90deg,var(--mieweb-primary-300)_240deg,var(--mieweb-primary-200)_320deg,transparent_360deg)]',\n '[mask:radial-gradient(farthest-side,transparent_calc(100%-4px),#000_calc(100%-4px))]',\n '[-webkit-mask:radial-gradient(farthest-side,transparent_calc(100%-4px),#000_calc(100%-4px))]',\n 'drop-shadow-[0_0_5px_color-mix(in_srgb,var(--mieweb-primary-400)_60%,transparent)]',\n ring === 'hover'\n ? 'opacity-0 group-hover:opacity-100 group-focus-visible:opacity-100'\n : 'opacity-100'\n )}\n />\n )}\n <span\n className={cn(\n 'relative flex items-center justify-center rounded-full bg-white/90 shadow-lg transition-transform group-hover:scale-110',\n DISC_SIZE[size]\n )}\n >\n <Play\n // rtl-ignore -- optical centering of the play triangle, which points right in RTL media players too\n className={cn('text-primary-600 ml-0.5', ICON_SIZE[size])}\n fill=\"currentColor\"\n />\n </span>\n </span>\n );\n}\n\n// =============================================================================\n// VideoCard\n// =============================================================================\n\nexport interface VideoCardProps {\n /** Video title — also the accessible name (\"Watch: {title}\"). */\n title: string;\n /** Navigates on click. Omit to render a `<button>` driven by `onClick`. */\n href?: string;\n onClick?: React.MouseEventHandler<HTMLElement>;\n /** Anchor target (e.g. `_blank`). */\n target?: string;\n /** Enables the muted hover preview and the default YouTube thumbnail. */\n youtubeId?: string;\n /** Thumbnail URL. Defaults to the YouTube `hqdefault` when `youtubeId` is set. */\n thumbnailUrl?: string;\n /** Thumbnail alt. Defaults to `title`. */\n thumbnailAlt?: string;\n /** Duration label, e.g. `34 min` or `2:44`. */\n duration?: string;\n /** Word before the duration in the pill. Default `Watch` → \"Watch · 34 min\". Pass `null` for just the duration. */\n durationPrefix?: string | null;\n /** Turn the hover preview off even when `youtubeId` is set. */\n preview?: boolean;\n /** Label shown on the pill while the muted preview plays. Default `Silent`. */\n silentLabel?: string;\n /** Slot above the title in the body — a category `Badge`, for instance. */\n eyebrow?: React.ReactNode;\n description?: string;\n /** Slot below the description — speaker, view count, date. */\n footer?: React.ReactNode;\n /**\n * `card` renders thumbnail + body; `plate` renders only the media plate\n * (for heroes and detail panels where the copy lives elsewhere).\n */\n variant?: 'card' | 'plate';\n /** Heading level for the title in `card` variant. Default `h3`. */\n headingLevel?: 'h2' | 'h3' | 'h4';\n className?: string;\n}\n\n/**\n * A video thumbnail card with the branded `PlayButton`, a \"Watch · 34 min\"\n * duration pill and — when a `youtubeId` is supplied — a muted, looping\n * hover preview with a progress bar, exactly as YouTube's own grid behaves.\n * Ported from the Enterprise Health video library and hero HUD.\n *\n * @example\n * ```tsx\n * <VideoCard\n * title=\"Ozwell AI in the exam room\"\n * href=\"/videos/ozwell-ai/\"\n * youtubeId=\"dQw4w9WgXcQ\"\n * duration=\"2:44\"\n * eyebrow={<Badge variant=\"secondary\" size=\"sm\">Demo</Badge>}\n * description=\"Documentation and surveillance, native to the platform.\"\n * />\n * ```\n */\nexport function VideoCard({\n title,\n href,\n onClick,\n target,\n youtubeId,\n thumbnailUrl,\n thumbnailAlt,\n duration,\n durationPrefix = 'Watch',\n preview = true,\n silentLabel = 'Silent',\n eyebrow,\n description,\n footer,\n variant = 'card',\n headingLevel: Heading = 'h3',\n className,\n}: VideoCardProps) {\n const thumb =\n thumbnailUrl ??\n (youtubeId\n ? `https://i.ytimg.com/vi/${youtubeId}/hqdefault.jpg`\n : undefined);\n\n const hover = useYouTubeHoverPreview(youtubeId, { enabled: preview });\n const playing = hover.preview === 'playing';\n\n const pill =\n duration && (durationPrefix ? `${durationPrefix} · ${duration}` : duration);\n\n const media = (\n <div\n data-slot=\"video-card-media\"\n className=\"bg-primary-950 relative aspect-video overflow-hidden\"\n >\n {thumb && (\n <img\n src={thumb}\n alt={thumbnailAlt ?? title}\n loading=\"lazy\"\n decoding=\"async\"\n className=\"absolute inset-0 h-full w-full object-cover transition-transform duration-300 group-hover:scale-105\"\n />\n )}\n\n {/* Muted preview player — fades in once frames are flowing. pointer-events-none\n so clicks fall through to the card. */}\n <div\n ref={hover.hostRef}\n aria-hidden=\"true\"\n className={cn(\n 'bg-primary-950 pointer-events-none absolute inset-0 overflow-hidden transition-opacity duration-500',\n '[&_iframe]:absolute [&_iframe]:inset-0 [&_iframe]:h-full [&_iframe]:w-full [&_iframe]:border-0',\n playing ? 'opacity-100' : 'opacity-0'\n )}\n />\n\n {playing && (\n <span className=\"absolute start-2 top-2 inline-flex items-center gap-1 rounded bg-black/55 px-1.5 py-0.5 text-[11px] font-medium text-white backdrop-blur-sm\">\n <VolumeX className=\"h-3 w-3\" aria-hidden=\"true\" />\n {silentLabel}\n </span>\n )}\n\n <div\n className={cn(\n 'bg-primary-950/20 group-hover:bg-primary-950/30 absolute inset-0 flex items-center justify-center transition-all duration-300',\n playing && 'opacity-0'\n )}\n >\n <PlayButton size={variant === 'plate' ? 'lg' : 'md'} />\n </div>\n\n {pill && !playing && (\n <Badge\n data-slot=\"video-card-duration\"\n size=\"sm\"\n className=\"absolute end-2 bottom-2 bg-black/60 py-1 text-white backdrop-blur-sm dark:bg-black/60 dark:text-white\"\n >\n {pill}\n </Badge>\n )}\n\n {hover.preview !== 'idle' && (\n <div className=\"absolute inset-x-0 bottom-0 h-1 bg-white/20\">\n <div\n className=\"h-full rounded-e-full bg-[linear-gradient(90deg,var(--mieweb-primary-500),var(--mieweb-primary-300))] transition-[width] duration-200 ease-linear\"\n style={{ width: `${Math.max(hover.progress * 100, 1.5)}%` }}\n />\n </div>\n )}\n </div>\n );\n\n // A real heading is only valid in the link variant — `<button>` accepts\n // phrasing content only, so the button variant gets a styled block span.\n const TitleTag = href ? Heading : 'span';\n\n const body = variant === 'card' && (\n <div data-slot=\"video-card-body\" className=\"p-4 text-start\">\n {eyebrow && <div className=\"mb-2 flex items-center gap-2\">{eyebrow}</div>}\n <TitleTag className=\"text-foreground group-hover:text-primary-700 dark:group-hover:text-primary-300 block text-lg font-semibold transition-colors\">\n {title}\n </TitleTag>\n {description && (\n <p className=\"text-muted-foreground mt-1 line-clamp-2 text-sm\">\n {description}\n </p>\n )}\n {footer && (\n <div className=\"text-muted-foreground mt-2 text-sm\">{footer}</div>\n )}\n </div>\n );\n\n const shell = cn(\n 'group block w-full overflow-hidden no-underline transition-shadow',\n 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2',\n variant === 'card'\n ? 'rounded-xl border border-border bg-card text-card-foreground shadow-md hover:shadow-lg'\n : 'rounded-xl shadow-lg',\n className\n );\n\n const interaction = {\n onMouseEnter: hover.handleEnter,\n onMouseLeave: hover.stopPreview,\n onFocus: hover.handleEnter,\n onBlur: hover.stopPreview,\n 'aria-label': `Watch: ${title}`,\n 'data-slot': 'video-card',\n 'data-preview': hover.preview,\n };\n\n if (href) {\n return (\n <a\n href={href}\n target={target}\n rel={target === '_blank' ? 'noopener noreferrer' : undefined}\n onClick={onClick}\n className={shell}\n {...interaction}\n >\n {media}\n {body}\n </a>\n );\n }\n return (\n <button type=\"button\" onClick={onClick} className={shell} {...interaction}>\n {media}\n {body}\n </button>\n );\n}\n"]}
@@ -0,0 +1,158 @@
1
+ 'use strict';
2
+
3
+ var chunkS5RVSXDV_cjs = require('./chunk-S5RVSXDV.cjs');
4
+ var jsxRuntime = require('react/jsx-runtime');
5
+
6
+ function OrbitRing({
7
+ rings,
8
+ center,
9
+ centerSize = 0.21,
10
+ chipSize = 0.13,
11
+ glow = true,
12
+ size = "min(440px, 86vw)",
13
+ pauseOnHover = true,
14
+ className
15
+ }) {
16
+ return /* @__PURE__ */ jsxRuntime.jsxs(
17
+ "div",
18
+ {
19
+ "data-slot": "orbit-ring",
20
+ style: { width: size },
21
+ className: chunkS5RVSXDV_cjs.cn(
22
+ "group/orbit [container-type:size] relative mx-auto aspect-square",
23
+ className
24
+ ),
25
+ children: [
26
+ glow && /* @__PURE__ */ jsxRuntime.jsx(
27
+ "span",
28
+ {
29
+ "aria-hidden": true,
30
+ className: "pointer-events-none absolute inset-0 rounded-full [background:radial-gradient(closest-side,color-mix(in_srgb,var(--mieweb-accent,var(--mieweb-primary-300))_30%,transparent)_0%,color-mix(in_srgb,var(--mieweb-accent,var(--mieweb-primary-300))_12%,transparent)_42%,transparent_78%)]"
31
+ }
32
+ ),
33
+ rings.map((r, i) => /* @__PURE__ */ jsxRuntime.jsx(
34
+ "span",
35
+ {
36
+ "aria-hidden": true,
37
+ style: {
38
+ width: `${r.radius * 200}cqmin`,
39
+ height: `${r.radius * 200}cqmin`
40
+ },
41
+ className: chunkS5RVSXDV_cjs.cn(
42
+ "border-primary-200 dark:border-primary-800 pointer-events-none absolute top-1/2 left-1/2 -translate-x-1/2 -translate-y-1/2 rounded-full border",
43
+ r.dashed ?? i % 2 === 1 ? "border-dashed opacity-40" : "opacity-50"
44
+ )
45
+ },
46
+ `path-${i}`
47
+ )),
48
+ /* @__PURE__ */ jsxRuntime.jsx(
49
+ "span",
50
+ {
51
+ "aria-hidden": true,
52
+ "data-slot": "orbit-ring-center",
53
+ style: {
54
+ width: `${centerSize * 100}cqmin`,
55
+ height: `${centerSize * 100}cqmin`
56
+ },
57
+ className: chunkS5RVSXDV_cjs.cn(
58
+ "pointer-events-none absolute top-1/2 left-1/2 grid -translate-x-1/2 -translate-y-1/2 place-items-center rounded-full",
59
+ "[background:radial-gradient(circle_at_50%_38%,#fff_0%,color-mix(in_srgb,var(--mieweb-accent,var(--mieweb-primary-200))_14%,#fff)_52%,color-mix(in_srgb,var(--mieweb-accent,var(--mieweb-primary-200))_30%,#fff)_100%)]",
60
+ "shadow-[0_0_0_1px_color-mix(in_srgb,var(--mieweb-accent,var(--mieweb-primary-400))_35%,transparent),0_10px_30px_rgba(0,0,0,0.18),0_0_46px_color-mix(in_srgb,var(--mieweb-accent,var(--mieweb-primary-400))_42%,transparent)]",
61
+ "[&>svg]:text-primary-800 [&>*]:h-[64%] [&>*]:w-[64%] [&>img]:object-contain"
62
+ ),
63
+ children: center
64
+ }
65
+ ),
66
+ rings.map((r, i) => {
67
+ const direction = r.direction ?? (i % 2 === 0 ? "normal" : "reverse");
68
+ const dur = `${r.durationSec ?? (i === 0 ? 88 : 88 + 36 * i)}s`;
69
+ const n = r.satellites.length;
70
+ return /* @__PURE__ */ jsxRuntime.jsx(
71
+ "div",
72
+ {
73
+ "data-slot": "orbit-ring-track",
74
+ style: {
75
+ "--dur": dur,
76
+ animationDirection: direction
77
+ },
78
+ className: chunkS5RVSXDV_cjs.cn(
79
+ "pointer-events-none absolute inset-0",
80
+ "motion-safe:animate-[mie-spin_var(--dur)_linear_infinite]",
81
+ pauseOnHover && "group-focus-within/orbit:[animation-play-state:paused] group-hover/orbit:[animation-play-state:paused]"
82
+ ),
83
+ children: r.satellites.map((s, j) => {
84
+ const a = (360 / n * j + (r.offsetDeg ?? 0)) * (Math.PI / 180);
85
+ const x = (r.radius * 100 * Math.cos(a)).toFixed(2);
86
+ const y = (r.radius * 100 * Math.sin(a)).toFixed(2);
87
+ const shell = {
88
+ "aria-label": s.name,
89
+ "data-slot": "orbit-ring-satellite",
90
+ style: {
91
+ width: `${chipSize * 100}cqmin`,
92
+ height: `${chipSize * 100}cqmin`,
93
+ transform: `translate(-50%, -50%) translate(${x}cqmin, ${y}cqmin)`
94
+ },
95
+ className: (
96
+ // rtl-ignore -- satellites are placed by trig math with a physical translate(); the ring is rotationally symmetric
97
+ "group/sat pointer-events-auto absolute left-1/2 top-1/2 grid place-items-center focus-visible:outline-none"
98
+ )
99
+ };
100
+ const chip = /* @__PURE__ */ jsxRuntime.jsxs(
101
+ "span",
102
+ {
103
+ style: {
104
+ animationDirection: direction === "normal" ? "reverse" : "normal"
105
+ },
106
+ className: chunkS5RVSXDV_cjs.cn(
107
+ "border-border bg-card/90 relative grid h-full w-full place-items-center rounded-full border shadow-md transition-[transform,box-shadow,background] duration-200",
108
+ "motion-safe:animate-[mie-spin_var(--dur)_linear_infinite]",
109
+ pauseOnHover && "group-focus-within/orbit:[animation-play-state:paused] group-hover/orbit:[animation-play-state:paused]",
110
+ "group-hover/sat:bg-card group-hover/sat:scale-[1.12] group-hover/sat:shadow-xl",
111
+ "group-focus-visible/sat:outline-primary-500 group-focus-visible/sat:scale-[1.12] group-focus-visible/sat:outline group-focus-visible/sat:outline-2 group-focus-visible/sat:outline-offset-[3px]",
112
+ "[&>img]:h-[64%] [&>img]:w-[64%] [&>img]:object-contain [&>img]:opacity-90 [&>img]:saturate-[0.9] group-hover/sat:[&>img]:opacity-100 group-hover/sat:[&>img]:saturate-100",
113
+ "[&>svg]:text-primary-800 [&>svg]:h-[46%] [&>svg]:w-[46%]"
114
+ ),
115
+ children: [
116
+ s.children ?? /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-primary-800 text-sm font-bold", children: s.name.slice(0, 2) }),
117
+ /* @__PURE__ */ jsxRuntime.jsx(
118
+ "span",
119
+ {
120
+ className: chunkS5RVSXDV_cjs.cn(
121
+ "border-border bg-card text-foreground pointer-events-none absolute top-[calc(100%+5px)] left-1/2 -translate-x-1/2 rounded-md border px-1.5 py-0.5 text-[11px] font-semibold whitespace-nowrap shadow-md",
122
+ "opacity-0 transition-opacity duration-150 group-hover/sat:opacity-100 group-focus-visible/sat:opacity-100"
123
+ ),
124
+ children: s.name
125
+ }
126
+ )
127
+ ]
128
+ }
129
+ );
130
+ if (s.href) {
131
+ return /* @__PURE__ */ jsxRuntime.jsx("a", { href: s.href, onClick: s.onClick, ...shell, children: chip }, s.id);
132
+ }
133
+ if (s.onClick) {
134
+ return /* @__PURE__ */ jsxRuntime.jsx(
135
+ "button",
136
+ {
137
+ type: "button",
138
+ onClick: s.onClick,
139
+ ...shell,
140
+ children: chip
141
+ },
142
+ s.id
143
+ );
144
+ }
145
+ return /* @__PURE__ */ jsxRuntime.jsx("span", { role: "img", ...shell, children: chip }, s.id);
146
+ })
147
+ },
148
+ `ring-${i}`
149
+ );
150
+ })
151
+ ]
152
+ }
153
+ );
154
+ }
155
+
156
+ exports.OrbitRing = OrbitRing;
157
+ //# sourceMappingURL=chunk-TU63764L.cjs.map
158
+ //# sourceMappingURL=chunk-TU63764L.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/OrbitRing/OrbitRing.tsx"],"names":["jsxs","cn","jsx"],"mappings":";;;;;AA0EO,SAAS,SAAA,CAAU;AAAA,EACxB,KAAA;AAAA,EACA,MAAA;AAAA,EACA,UAAA,GAAa,IAAA;AAAA,EACb,QAAA,GAAW,IAAA;AAAA,EACX,IAAA,GAAO,IAAA;AAAA,EACP,IAAA,GAAO,kBAAA;AAAA,EACP,YAAA,GAAe,IAAA;AAAA,EACf;AACF,CAAA,EAAmB;AACjB,EAAA,uBACEA,eAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,WAAA,EAAU,YAAA;AAAA,MACV,KAAA,EAAO,EAAE,KAAA,EAAO,IAAA,EAAK;AAAA,MACrB,SAAA,EAAWC,oBAAA;AAAA,QACT,kEAAA;AAAA,QACA;AAAA,OACF;AAAA,MAEC,QAAA,EAAA;AAAA,QAAA,IAAA,oBACCC,cAAA;AAAA,UAAC,MAAA;AAAA,UAAA;AAAA,YACC,aAAA,EAAW,IAAA;AAAA,YACX,SAAA,EAAU;AAAA;AAAA,SACZ;AAAA,QAID,KAAA,CAAM,GAAA,CAAI,CAAC,CAAA,EAAG,CAAA,qBACbA,cAAA;AAAA,UAAC,MAAA;AAAA,UAAA;AAAA,YAEC,aAAA,EAAW,IAAA;AAAA,YACX,KAAA,EAAO;AAAA,cACL,KAAA,EAAO,CAAA,EAAG,CAAA,CAAE,MAAA,GAAS,GAAG,CAAA,KAAA,CAAA;AAAA,cACxB,MAAA,EAAQ,CAAA,EAAG,CAAA,CAAE,MAAA,GAAS,GAAG,CAAA,KAAA;AAAA,aAC3B;AAAA,YACA,SAAA,EAAWD,oBAAA;AAAA,cACT,gJAAA;AAAA,cACC,CAAA,CAAE,MAAA,IAAU,CAAA,GAAI,CAAA,KAAM,IACnB,0BAAA,GACA;AAAA;AACN,WAAA;AAAA,UAXK,QAAQ,CAAC,CAAA;AAAA,SAajB,CAAA;AAAA,wBAGDC,cAAA;AAAA,UAAC,MAAA;AAAA,UAAA;AAAA,YACC,aAAA,EAAW,IAAA;AAAA,YACX,WAAA,EAAU,mBAAA;AAAA,YACV,KAAA,EAAO;AAAA,cACL,KAAA,EAAO,CAAA,EAAG,UAAA,GAAa,GAAG,CAAA,KAAA,CAAA;AAAA,cAC1B,MAAA,EAAQ,CAAA,EAAG,UAAA,GAAa,GAAG,CAAA,KAAA;AAAA,aAC7B;AAAA,YACA,SAAA,EAAWD,oBAAA;AAAA,cACT,sHAAA;AAAA,cACA,wNAAA;AAAA,cACA,8NAAA;AAAA,cACA;AAAA,aACF;AAAA,YAEC,QAAA,EAAA;AAAA;AAAA,SACH;AAAA,QAGC,KAAA,CAAM,GAAA,CAAI,CAAC,CAAA,EAAG,CAAA,KAAM;AACnB,UAAA,MAAM,YAAY,CAAA,CAAE,SAAA,KAAc,CAAA,GAAI,CAAA,KAAM,IAAI,QAAA,GAAW,SAAA,CAAA;AAC3D,UAAA,MAAM,GAAA,GAAM,GAAG,CAAA,CAAE,WAAA,KAAgB,MAAM,CAAA,GAAI,EAAA,GAAK,EAAA,GAAK,EAAA,GAAK,CAAA,CAAE,CAAA,CAAA,CAAA;AAC5D,UAAA,MAAM,CAAA,GAAI,EAAE,UAAA,CAAW,MAAA;AACvB,UAAA,uBACEC,cAAA;AAAA,YAAC,KAAA;AAAA,YAAA;AAAA,cAEC,WAAA,EAAU,kBAAA;AAAA,cACV,KAAA,EACE;AAAA,gBACE,OAAA,EAAS,GAAA;AAAA,gBACT,kBAAA,EAAoB;AAAA,eACtB;AAAA,cAEF,SAAA,EAAWD,oBAAA;AAAA,gBACT,sCAAA;AAAA,gBACA,2DAAA;AAAA,gBACA,YAAA,IACE;AAAA,eACJ;AAAA,cAEC,QAAA,EAAA,CAAA,CAAE,UAAA,CAAW,GAAA,CAAI,CAAC,GAAG,CAAA,KAAM;AAC1B,gBAAA,MAAM,CAAA,GAAA,CAAM,MAAM,CAAA,GAAK,CAAA,IAAK,EAAE,SAAA,IAAa,CAAA,CAAA,KAAO,KAAK,EAAA,GAAK,GAAA,CAAA;AAC5D,gBAAA,MAAM,CAAA,GAAA,CAAK,EAAE,MAAA,GAAS,GAAA,GAAM,KAAK,GAAA,CAAI,CAAC,CAAA,EAAG,OAAA,CAAQ,CAAC,CAAA;AAClD,gBAAA,MAAM,CAAA,GAAA,CAAK,EAAE,MAAA,GAAS,GAAA,GAAM,KAAK,GAAA,CAAI,CAAC,CAAA,EAAG,OAAA,CAAQ,CAAC,CAAA;AAClD,gBAAA,MAAM,KAAA,GAAQ;AAAA,kBACZ,cAAc,CAAA,CAAE,IAAA;AAAA,kBAChB,WAAA,EAAa,sBAAA;AAAA,kBACb,KAAA,EAAO;AAAA,oBACL,KAAA,EAAO,CAAA,EAAG,QAAA,GAAW,GAAG,CAAA,KAAA,CAAA;AAAA,oBACxB,MAAA,EAAQ,CAAA,EAAG,QAAA,GAAW,GAAG,CAAA,KAAA,CAAA;AAAA,oBACzB,SAAA,EAAW,CAAA,gCAAA,EAAmC,CAAC,CAAA,OAAA,EAAU,CAAC,CAAA,MAAA;AAAA,mBAC5D;AAAA,kBACA,SAAA;AAAA;AAAA,oBAEE;AAAA;AAAA,iBACJ;AACA,gBAAA,MAAM,IAAA,mBACJD,eAAA;AAAA,kBAAC,MAAA;AAAA,kBAAA;AAAA,oBAEC,KAAA,EAAO;AAAA,sBACL,kBAAA,EACE,SAAA,KAAc,QAAA,GAAW,SAAA,GAAY;AAAA,qBACzC;AAAA,oBACA,SAAA,EAAWC,oBAAA;AAAA,sBACT,iKAAA;AAAA,sBACA,2DAAA;AAAA,sBACA,YAAA,IACE,wGAAA;AAAA,sBACF,gFAAA;AAAA,sBACA,iMAAA;AAAA,sBACA,2KAAA;AAAA,sBACA;AAAA,qBACF;AAAA,oBAEC,QAAA,EAAA;AAAA,sBAAA,CAAA,CAAE,QAAA,oBACDC,cAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,oCAAA,EACb,YAAE,IAAA,CAAK,KAAA,CAAM,CAAA,EAAG,CAAC,CAAA,EACpB,CAAA;AAAA,sCAEFA,cAAA;AAAA,wBAAC,MAAA;AAAA,wBAAA;AAAA,0BACC,SAAA,EAAWD,oBAAA;AAAA,4BACT,yMAAA;AAAA,4BACA;AAAA,2BACF;AAAA,0BAEC,QAAA,EAAA,CAAA,CAAE;AAAA;AAAA;AACL;AAAA;AAAA,iBACF;AAEF,gBAAA,IAAI,EAAE,IAAA,EAAM;AACV,kBAAA,uBACEC,cAAA,CAAC,GAAA,EAAA,EAAa,IAAA,EAAM,CAAA,CAAE,IAAA,EAAM,OAAA,EAAS,CAAA,CAAE,OAAA,EAAU,GAAG,KAAA,EACjD,QAAA,EAAA,IAAA,EAAA,EADK,CAAA,CAAE,EAEV,CAAA;AAAA,gBAEJ;AACA,gBAAA,IAAI,EAAE,OAAA,EAAS;AACb,kBAAA,uBACEA,cAAA;AAAA,oBAAC,QAAA;AAAA,oBAAA;AAAA,sBAEC,IAAA,EAAK,QAAA;AAAA,sBACL,SAAS,CAAA,CAAE,OAAA;AAAA,sBACV,GAAG,KAAA;AAAA,sBAEH,QAAA,EAAA;AAAA,qBAAA;AAAA,oBALI,CAAA,CAAE;AAAA,mBAMT;AAAA,gBAEJ;AACA,gBAAA,uBACEA,cAAA,CAAC,UAAgB,IAAA,EAAK,KAAA,EAAO,GAAG,KAAA,EAC7B,QAAA,EAAA,IAAA,EAAA,EADQ,EAAE,EAEb,CAAA;AAAA,cAEJ,CAAC;AAAA,aAAA;AAAA,YAxFI,QAAQ,CAAC,CAAA;AAAA,WAyFhB;AAAA,QAEJ,CAAC;AAAA;AAAA;AAAA,GACH;AAEJ","file":"chunk-TU63764L.cjs","sourcesContent":["'use client';\n\nimport * as React from 'react';\nimport { cn } from '../../utils/cn';\n\n// =============================================================================\n// Types\n// =============================================================================\n\nexport interface OrbitSatellite {\n id: string;\n /** Accessible name; shown as a hover label. */\n name: string;\n /** Logo/icon content — an `<img>`, a Lucide icon, or a lettermark. */\n children?: React.ReactNode;\n /** Makes the chip a link. */\n href?: string;\n onClick?: () => void;\n}\n\nexport interface OrbitRingDef {\n satellites: OrbitSatellite[];\n /** Orbit radius as a fraction of the stage (0–0.5). */\n radius: number;\n /** One rotation, in seconds. Default 88 (inner) / 124 (outer). */\n durationSec?: number;\n /** Spin direction. Default alternates per ring. */\n direction?: 'normal' | 'reverse';\n /** Starting angle offset in degrees. */\n offsetDeg?: number;\n /** Draw the orbit path as a dashed rather than solid circle. */\n dashed?: boolean;\n}\n\nexport interface OrbitRingProps {\n /** Concentric rings, inner first. */\n rings: OrbitRingDef[];\n /** What sits at the centre — a brand mark, a product tile. */\n center?: React.ReactNode;\n /** Diameter of the centre disc as a fraction of the stage. Default 0.21. */\n centerSize?: number;\n /** Diameter of each satellite chip as a fraction of the stage. Default 0.13. */\n chipSize?: number;\n /** Show the warm radial glow behind the centre. Default true. */\n glow?: boolean;\n /** Stage width. Default `min(440px, 86vw)`. */\n size?: string;\n /** Pause everything while hovered/focused. Default true. */\n pauseOnHover?: boolean;\n className?: string;\n}\n\n// =============================================================================\n// OrbitRing\n// =============================================================================\n\n/**\n * A \"solar system\" of logos: concentric rings of satellite chips orbiting a\n * centre mark at different speeds and directions, chips counter-rotating so\n * they stay upright, the whole system pausing while a visitor explores it.\n * Sizes are container-relative, so it scales with its box. Ported from the\n * Enterprise Health integrations section.\n *\n * @example\n * ```tsx\n * <OrbitRing\n * center={<img src=\"/logo.svg\" alt=\"\" />}\n * rings={[\n * { radius: 0.26, satellites: partners.slice(0, 5).map(p => ({ id: p.slug, name: p.name, href: p.href, children: <img src={p.logo} alt=\"\" /> })) },\n * { radius: 0.4, satellites: partners.slice(5).map(...) , dashed: true },\n * ]}\n * />\n * ```\n */\nexport function OrbitRing({\n rings,\n center,\n centerSize = 0.21,\n chipSize = 0.13,\n glow = true,\n size = 'min(440px, 86vw)',\n pauseOnHover = true,\n className,\n}: OrbitRingProps) {\n return (\n <div\n data-slot=\"orbit-ring\"\n style={{ width: size }}\n className={cn(\n 'group/orbit [container-type:size] relative mx-auto aspect-square',\n className\n )}\n >\n {glow && (\n <span\n aria-hidden\n className=\"pointer-events-none absolute inset-0 rounded-full [background:radial-gradient(closest-side,color-mix(in_srgb,var(--mieweb-accent,var(--mieweb-primary-300))_30%,transparent)_0%,color-mix(in_srgb,var(--mieweb-accent,var(--mieweb-primary-300))_12%,transparent)_42%,transparent_78%)]\"\n />\n )}\n\n {/* orbit paths */}\n {rings.map((r, i) => (\n <span\n key={`path-${i}`}\n aria-hidden\n style={{\n width: `${r.radius * 200}cqmin`,\n height: `${r.radius * 200}cqmin`,\n }}\n className={cn(\n 'border-primary-200 dark:border-primary-800 pointer-events-none absolute top-1/2 left-1/2 -translate-x-1/2 -translate-y-1/2 rounded-full border',\n (r.dashed ?? i % 2 === 1)\n ? 'border-dashed opacity-40'\n : 'opacity-50'\n )}\n />\n ))}\n\n {/* centre */}\n <span\n aria-hidden\n data-slot=\"orbit-ring-center\"\n style={{\n width: `${centerSize * 100}cqmin`,\n height: `${centerSize * 100}cqmin`,\n }}\n className={cn(\n 'pointer-events-none absolute top-1/2 left-1/2 grid -translate-x-1/2 -translate-y-1/2 place-items-center rounded-full',\n '[background:radial-gradient(circle_at_50%_38%,#fff_0%,color-mix(in_srgb,var(--mieweb-accent,var(--mieweb-primary-200))_14%,#fff)_52%,color-mix(in_srgb,var(--mieweb-accent,var(--mieweb-primary-200))_30%,#fff)_100%)]',\n 'shadow-[0_0_0_1px_color-mix(in_srgb,var(--mieweb-accent,var(--mieweb-primary-400))_35%,transparent),0_10px_30px_rgba(0,0,0,0.18),0_0_46px_color-mix(in_srgb,var(--mieweb-accent,var(--mieweb-primary-400))_42%,transparent)]',\n '[&>svg]:text-primary-800 [&>*]:h-[64%] [&>*]:w-[64%] [&>img]:object-contain'\n )}\n >\n {center}\n </span>\n\n {/* rings */}\n {rings.map((r, i) => {\n const direction = r.direction ?? (i % 2 === 0 ? 'normal' : 'reverse');\n const dur = `${r.durationSec ?? (i === 0 ? 88 : 88 + 36 * i)}s`;\n const n = r.satellites.length;\n return (\n <div\n key={`ring-${i}`}\n data-slot=\"orbit-ring-track\"\n style={\n {\n '--dur': dur,\n animationDirection: direction,\n } as React.CSSProperties\n }\n className={cn(\n 'pointer-events-none absolute inset-0',\n 'motion-safe:animate-[mie-spin_var(--dur)_linear_infinite]',\n pauseOnHover &&\n 'group-focus-within/orbit:[animation-play-state:paused] group-hover/orbit:[animation-play-state:paused]'\n )}\n >\n {r.satellites.map((s, j) => {\n const a = ((360 / n) * j + (r.offsetDeg ?? 0)) * (Math.PI / 180);\n const x = (r.radius * 100 * Math.cos(a)).toFixed(2);\n const y = (r.radius * 100 * Math.sin(a)).toFixed(2);\n const shell = {\n 'aria-label': s.name,\n 'data-slot': 'orbit-ring-satellite',\n style: {\n width: `${chipSize * 100}cqmin`,\n height: `${chipSize * 100}cqmin`,\n transform: `translate(-50%, -50%) translate(${x}cqmin, ${y}cqmin)`,\n },\n className:\n // rtl-ignore -- satellites are placed by trig math with a physical translate(); the ring is rotationally symmetric\n 'group/sat pointer-events-auto absolute left-1/2 top-1/2 grid place-items-center focus-visible:outline-none',\n };\n const chip = (\n <span\n // counter-spin keeps the logo upright; direction is the inverse of the ring's\n style={{\n animationDirection:\n direction === 'normal' ? 'reverse' : 'normal',\n }}\n className={cn(\n 'border-border bg-card/90 relative grid h-full w-full place-items-center rounded-full border shadow-md transition-[transform,box-shadow,background] duration-200',\n 'motion-safe:animate-[mie-spin_var(--dur)_linear_infinite]',\n pauseOnHover &&\n 'group-focus-within/orbit:[animation-play-state:paused] group-hover/orbit:[animation-play-state:paused]',\n 'group-hover/sat:bg-card group-hover/sat:scale-[1.12] group-hover/sat:shadow-xl',\n 'group-focus-visible/sat:outline-primary-500 group-focus-visible/sat:scale-[1.12] group-focus-visible/sat:outline group-focus-visible/sat:outline-2 group-focus-visible/sat:outline-offset-[3px]',\n '[&>img]:h-[64%] [&>img]:w-[64%] [&>img]:object-contain [&>img]:opacity-90 [&>img]:saturate-[0.9] group-hover/sat:[&>img]:opacity-100 group-hover/sat:[&>img]:saturate-100',\n '[&>svg]:text-primary-800 [&>svg]:h-[46%] [&>svg]:w-[46%]'\n )}\n >\n {s.children ?? (\n <span className=\"text-primary-800 text-sm font-bold\">\n {s.name.slice(0, 2)}\n </span>\n )}\n <span\n className={cn(\n 'border-border bg-card text-foreground pointer-events-none absolute top-[calc(100%+5px)] left-1/2 -translate-x-1/2 rounded-md border px-1.5 py-0.5 text-[11px] font-semibold whitespace-nowrap shadow-md',\n 'opacity-0 transition-opacity duration-150 group-hover/sat:opacity-100 group-focus-visible/sat:opacity-100'\n )}\n >\n {s.name}\n </span>\n </span>\n );\n if (s.href) {\n return (\n <a key={s.id} href={s.href} onClick={s.onClick} {...shell}>\n {chip}\n </a>\n );\n }\n if (s.onClick) {\n return (\n <button\n key={s.id}\n type=\"button\"\n onClick={s.onClick}\n {...shell}\n >\n {chip}\n </button>\n );\n }\n return (\n <span key={s.id} role=\"img\" {...shell}>\n {chip}\n </span>\n );\n })}\n </div>\n );\n })}\n </div>\n );\n}\n"]}