@mieweb/ui 0.7.3 → 0.8.0-dev.1

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 (355) hide show
  1. package/README.md +45 -24
  2. package/agent/README.md +20 -0
  3. package/agent/init-agent.mjs +61 -0
  4. package/agent/mieweb-ui.instructions.md +169 -0
  5. package/dist/ag-grid.cjs +11 -0
  6. package/dist/ag-grid.cjs.map +1 -1
  7. package/dist/ag-grid.d.cts +4 -0
  8. package/dist/ag-grid.d.ts +4 -0
  9. package/dist/ag-grid.js +11 -0
  10. package/dist/ag-grid.js.map +1 -1
  11. package/dist/brands/index.cjs +12 -12
  12. package/dist/brands/index.js +3 -3
  13. package/dist/{chunk-EGWWTIWS.js → chunk-2AB4PQYL.js} +126 -96
  14. package/dist/chunk-2AB4PQYL.js.map +1 -0
  15. package/dist/{chunk-NQ2D2V6O.cjs → chunk-2PEVRI26.cjs} +37 -37
  16. package/dist/{chunk-NQ2D2V6O.cjs.map → chunk-2PEVRI26.cjs.map} +1 -1
  17. package/dist/{chunk-6J7UGYT5.cjs → chunk-2SSAAE3I.cjs} +49 -9
  18. package/dist/chunk-2SSAAE3I.cjs.map +1 -0
  19. package/dist/chunk-3IMM2PM4.js +259 -0
  20. package/dist/chunk-3IMM2PM4.js.map +1 -0
  21. package/dist/{chunk-SYIFEJSF.cjs → chunk-3RADKLLD.cjs} +13 -13
  22. package/dist/{chunk-SYIFEJSF.cjs.map → chunk-3RADKLLD.cjs.map} +1 -1
  23. package/dist/chunk-3SHLOF4V.cjs +128 -0
  24. package/dist/chunk-3SHLOF4V.cjs.map +1 -0
  25. package/dist/chunk-3TXOFAXP.cjs +139 -0
  26. package/dist/chunk-3TXOFAXP.cjs.map +1 -0
  27. package/dist/{chunk-LJDBD2DD.cjs → chunk-5BPUZK2B.cjs} +386 -4
  28. package/dist/chunk-5BPUZK2B.cjs.map +1 -0
  29. package/dist/chunk-5JZIDILK.cjs +164 -0
  30. package/dist/chunk-5JZIDILK.cjs.map +1 -0
  31. package/dist/chunk-5MXO6PEV.cjs +78 -0
  32. package/dist/chunk-5MXO6PEV.cjs.map +1 -0
  33. package/dist/chunk-5QZ73PZC.js +62 -0
  34. package/dist/chunk-5QZ73PZC.js.map +1 -0
  35. package/dist/chunk-6GKX36JX.js +269 -0
  36. package/dist/chunk-6GKX36JX.js.map +1 -0
  37. package/dist/chunk-6NZXWKUE.js +3 -0
  38. package/dist/chunk-6NZXWKUE.js.map +1 -0
  39. package/dist/chunk-6SCQ7FKT.js +115 -0
  40. package/dist/chunk-6SCQ7FKT.js.map +1 -0
  41. package/dist/{chunk-KFLDXJEE.js → chunk-753Z3NXL.js} +46 -15
  42. package/dist/chunk-753Z3NXL.js.map +1 -0
  43. package/dist/{chunk-S3MKIDYG.cjs → chunk-7AECNMYV.cjs} +46 -15
  44. package/dist/chunk-7AECNMYV.cjs.map +1 -0
  45. package/dist/chunk-7IKLGH3Z.cjs +92 -0
  46. package/dist/chunk-7IKLGH3Z.cjs.map +1 -0
  47. package/dist/chunk-7RV6CAP6.cjs +106 -0
  48. package/dist/chunk-7RV6CAP6.cjs.map +1 -0
  49. package/dist/chunk-AHHFFXJR.cjs +230 -0
  50. package/dist/chunk-AHHFFXJR.cjs.map +1 -0
  51. package/dist/{chunk-HIDV32ZX.js → chunk-AHUYW673.js} +168 -9
  52. package/dist/chunk-AHUYW673.js.map +1 -0
  53. package/dist/{chunk-MYFZYUPR.cjs → chunk-AOHJILLU.cjs} +38 -3
  54. package/dist/chunk-AOHJILLU.cjs.map +1 -0
  55. package/dist/{chunk-DLBV42JD.js → chunk-ATOWMVZH.js} +157 -40
  56. package/dist/chunk-ATOWMVZH.js.map +1 -0
  57. package/dist/{chunk-WUNWHOLA.cjs → chunk-BSDBI6H7.cjs} +116 -26
  58. package/dist/chunk-BSDBI6H7.cjs.map +1 -0
  59. package/dist/chunk-CG4ZKJLE.js +84 -0
  60. package/dist/chunk-CG4ZKJLE.js.map +1 -0
  61. package/dist/{chunk-4PIW3Y5M.js → chunk-DJ4JPFWI.js} +3 -3
  62. package/dist/{chunk-4PIW3Y5M.js.map → chunk-DJ4JPFWI.js.map} +1 -1
  63. package/dist/{chunk-Z4PECE5S.js → chunk-DX64KLSN.js} +2 -2
  64. package/dist/{chunk-Z4PECE5S.js.map → chunk-DX64KLSN.js.map} +1 -1
  65. package/dist/{chunk-FDV7EQWH.js → chunk-EK6DYGFG.js} +3 -3
  66. package/dist/{chunk-FDV7EQWH.js.map → chunk-EK6DYGFG.js.map} +1 -1
  67. package/dist/{chunk-QUUBTNMH.js → chunk-EPSB4WTL.js} +45 -15
  68. package/dist/chunk-EPSB4WTL.js.map +1 -0
  69. package/dist/{chunk-KRGKPUJH.js → chunk-F2S6NV5N.js} +8 -8
  70. package/dist/{chunk-KRGKPUJH.js.map → chunk-F2S6NV5N.js.map} +1 -1
  71. package/dist/chunk-F57VRLKP.js +708 -0
  72. package/dist/chunk-F57VRLKP.js.map +1 -0
  73. package/dist/{chunk-26DPQUSB.cjs → chunk-G52YRAJC.cjs} +4 -4
  74. package/dist/{chunk-26DPQUSB.cjs.map → chunk-G52YRAJC.cjs.map} +1 -1
  75. package/dist/{chunk-5IDYOJHO.cjs → chunk-G7EQ3JPX.cjs} +45 -15
  76. package/dist/chunk-G7EQ3JPX.cjs.map +1 -0
  77. package/dist/{chunk-FKLUSYFP.cjs → chunk-GQVL2JKQ.cjs} +4 -4
  78. package/dist/{chunk-FKLUSYFP.cjs.map → chunk-GQVL2JKQ.cjs.map} +1 -1
  79. package/dist/{chunk-3D4ITDLO.js → chunk-GXODR6V4.js} +3 -3
  80. package/dist/{chunk-3D4ITDLO.js.map → chunk-GXODR6V4.js.map} +1 -1
  81. package/dist/{chunk-AFGADE3B.js → chunk-H3YO5GBM.js} +117 -27
  82. package/dist/chunk-H3YO5GBM.js.map +1 -0
  83. package/dist/chunk-HK3AMH3Q.cjs +151 -0
  84. package/dist/chunk-HK3AMH3Q.cjs.map +1 -0
  85. package/dist/chunk-HQ3XPCHG.js +114 -0
  86. package/dist/chunk-HQ3XPCHG.js.map +1 -0
  87. package/dist/chunk-I44YNYI6.cjs +4 -0
  88. package/dist/chunk-I44YNYI6.cjs.map +1 -0
  89. package/dist/chunk-JHZW3Y62.js +142 -0
  90. package/dist/chunk-JHZW3Y62.js.map +1 -0
  91. package/dist/{chunk-FTRGZOVJ.js → chunk-JQQABHDN.js} +3 -3
  92. package/dist/{chunk-FTRGZOVJ.js.map → chunk-JQQABHDN.js.map} +1 -1
  93. package/dist/chunk-JR4QIU54.cjs +291 -0
  94. package/dist/chunk-JR4QIU54.cjs.map +1 -0
  95. package/dist/{chunk-JDHIBJ5K.cjs → chunk-JWTCEWQ4.cjs} +2 -2
  96. package/dist/{chunk-JDHIBJ5K.cjs.map → chunk-JWTCEWQ4.cjs.map} +1 -1
  97. package/dist/{chunk-ZBI52NP2.cjs → chunk-K5GQPTTA.cjs} +158 -41
  98. package/dist/chunk-K5GQPTTA.cjs.map +1 -0
  99. package/dist/chunk-KFEN2SRZ.js +208 -0
  100. package/dist/chunk-KFEN2SRZ.js.map +1 -0
  101. package/dist/chunk-L6MDULYB.js +87 -0
  102. package/dist/chunk-L6MDULYB.js.map +1 -0
  103. package/dist/{chunk-RYQ3S3KO.cjs → chunk-LDCFNWJC.cjs} +5 -5
  104. package/dist/{chunk-RYQ3S3KO.cjs.map → chunk-LDCFNWJC.cjs.map} +1 -1
  105. package/dist/{chunk-LC7YHZXM.js → chunk-LDQ2T27A.js} +5 -5
  106. package/dist/{chunk-LC7YHZXM.js.map → chunk-LDQ2T27A.js.map} +1 -1
  107. package/dist/chunk-N5O47VGS.cjs +109 -0
  108. package/dist/chunk-N5O47VGS.cjs.map +1 -0
  109. package/dist/chunk-NGSDBWKA.cjs +84 -0
  110. package/dist/chunk-NGSDBWKA.cjs.map +1 -0
  111. package/dist/chunk-NMBYU7D7.cjs +31 -0
  112. package/dist/chunk-NMBYU7D7.cjs.map +1 -0
  113. package/dist/{chunk-SPWVKDGC.cjs → chunk-QMKYJ4AT.cjs} +4 -4
  114. package/dist/{chunk-SPWVKDGC.cjs.map → chunk-QMKYJ4AT.cjs.map} +1 -1
  115. package/dist/{chunk-RBS3GHDZ.cjs → chunk-QOJ4V7YX.cjs} +170 -10
  116. package/dist/chunk-QOJ4V7YX.cjs.map +1 -0
  117. package/dist/chunk-RUGHNFQG.js +28 -0
  118. package/dist/chunk-RUGHNFQG.js.map +1 -0
  119. package/dist/{chunk-P6L74SKG.js → chunk-SVZ4MQVQ.js} +48 -8
  120. package/dist/chunk-SVZ4MQVQ.js.map +1 -0
  121. package/dist/{chunk-URHXR5SC.cjs → chunk-TQZPYDUL.cjs} +7 -7
  122. package/dist/{chunk-URHXR5SC.cjs.map → chunk-TQZPYDUL.cjs.map} +1 -1
  123. package/dist/{chunk-MO65V64I.js → chunk-TXRQQMG5.js} +2 -2
  124. package/dist/{chunk-MO65V64I.js.map → chunk-TXRQQMG5.js.map} +1 -1
  125. package/dist/{chunk-EKRT7K2K.js → chunk-UJS3JTVT.js} +3 -3
  126. package/dist/{chunk-EKRT7K2K.js.map → chunk-UJS3JTVT.js.map} +1 -1
  127. package/dist/{chunk-6MMIWE7H.js → chunk-VQ5HJCTP.js} +386 -4
  128. package/dist/chunk-VQ5HJCTP.js.map +1 -0
  129. package/dist/chunk-WBGUYSWY.js +90 -0
  130. package/dist/chunk-WBGUYSWY.js.map +1 -0
  131. package/dist/{chunk-LJBWCUKP.cjs → chunk-WIYQI35R.cjs} +2 -2
  132. package/dist/{chunk-LJBWCUKP.cjs.map → chunk-WIYQI35R.cjs.map} +1 -1
  133. package/dist/chunk-WKSUL2ZN.js +56 -0
  134. package/dist/chunk-WKSUL2ZN.js.map +1 -0
  135. package/dist/{chunk-BOOJDRJO.js → chunk-WSNMQQ4P.js} +38 -3
  136. package/dist/chunk-WSNMQQ4P.js.map +1 -0
  137. package/dist/chunk-X5ZPYYMS.js +105 -0
  138. package/dist/chunk-X5ZPYYMS.js.map +1 -0
  139. package/dist/{chunk-XB54G7WS.cjs → chunk-XJTFZLWH.cjs} +2 -86
  140. package/dist/chunk-XJTFZLWH.cjs.map +1 -0
  141. package/dist/{chunk-GTHNWP4P.js → chunk-XUVEF2RQ.js} +4 -87
  142. package/dist/chunk-XUVEF2RQ.js.map +1 -0
  143. package/dist/chunk-Y6YSJPVC.js +129 -0
  144. package/dist/chunk-Y6YSJPVC.js.map +1 -0
  145. package/dist/{chunk-OAHORW4N.cjs → chunk-YRLCR76L.cjs} +129 -99
  146. package/dist/chunk-YRLCR76L.cjs.map +1 -0
  147. package/dist/chunk-YVIH26FG.cjs +736 -0
  148. package/dist/chunk-YVIH26FG.cjs.map +1 -0
  149. package/dist/chunk-Z5S5JEJD.cjs +286 -0
  150. package/dist/chunk-Z5S5JEJD.cjs.map +1 -0
  151. package/dist/chunk-ZO4L6C2Y.cjs +137 -0
  152. package/dist/chunk-ZO4L6C2Y.cjs.map +1 -0
  153. package/dist/{collabKit-QZL4P5T5.js → collabKit-A643VH2I.js} +7 -3
  154. package/dist/collabKit-A643VH2I.js.map +1 -0
  155. package/dist/{collabKit-UF7E6V3N.cjs → collabKit-Q4A36LDA.cjs} +7 -3
  156. package/dist/collabKit-Q4A36LDA.cjs.map +1 -0
  157. package/dist/components/Accordion/index.cjs +13 -0
  158. package/dist/components/Accordion/index.cjs.map +1 -0
  159. package/dist/components/Accordion/index.d.cts +50 -0
  160. package/dist/components/Accordion/index.d.ts +50 -0
  161. package/dist/components/Accordion/index.js +4 -0
  162. package/dist/components/Accordion/index.js.map +1 -0
  163. package/dist/components/Alert/index.d.cts +1 -1
  164. package/dist/components/Alert/index.d.ts +1 -1
  165. package/dist/components/Autocomplete/index.cjs +5 -4
  166. package/dist/components/Autocomplete/index.d.cts +20 -3
  167. package/dist/components/Autocomplete/index.d.ts +20 -3
  168. package/dist/components/Autocomplete/index.js +4 -3
  169. package/dist/components/Badge/index.d.cts +1 -1
  170. package/dist/components/Badge/index.d.ts +1 -1
  171. package/dist/components/Card/index.d.cts +1 -1
  172. package/dist/components/Card/index.d.ts +1 -1
  173. package/dist/components/Checkbox/index.cjs +5 -4
  174. package/dist/components/Checkbox/index.d.cts +9 -1
  175. package/dist/components/Checkbox/index.d.ts +9 -1
  176. package/dist/components/Checkbox/index.js +2 -1
  177. package/dist/components/ClampedText/index.cjs +13 -0
  178. package/dist/components/ClampedText/index.cjs.map +1 -0
  179. package/dist/components/ClampedText/index.d.cts +33 -0
  180. package/dist/components/ClampedText/index.d.ts +33 -0
  181. package/dist/components/ClampedText/index.js +4 -0
  182. package/dist/components/ClampedText/index.js.map +1 -0
  183. package/dist/components/CopyButton/index.cjs +13 -0
  184. package/dist/components/CopyButton/index.cjs.map +1 -0
  185. package/dist/components/CopyButton/index.d.cts +29 -0
  186. package/dist/components/CopyButton/index.d.ts +29 -0
  187. package/dist/components/CopyButton/index.js +4 -0
  188. package/dist/components/CopyButton/index.js.map +1 -0
  189. package/dist/components/CountryCodeDropdown/index.cjs +5 -5
  190. package/dist/components/CountryCodeDropdown/index.js +2 -2
  191. package/dist/components/CustomizableDashboard/index.cjs +43 -0
  192. package/dist/components/CustomizableDashboard/index.cjs.map +1 -0
  193. package/dist/components/CustomizableDashboard/index.d.cts +195 -0
  194. package/dist/components/CustomizableDashboard/index.d.ts +195 -0
  195. package/dist/components/CustomizableDashboard/index.js +10 -0
  196. package/dist/components/CustomizableDashboard/index.js.map +1 -0
  197. package/dist/components/DateInput/index.cjs +5 -4
  198. package/dist/components/DateInput/index.d.cts +1 -0
  199. package/dist/components/DateInput/index.d.ts +1 -0
  200. package/dist/components/DateInput/index.js +4 -3
  201. package/dist/components/Dropdown/index.cjs +14 -9
  202. package/dist/components/Dropdown/index.d.cts +38 -2
  203. package/dist/components/Dropdown/index.d.ts +38 -2
  204. package/dist/components/Dropdown/index.js +4 -3
  205. package/dist/components/FilterSummaryBar/index.cjs +13 -0
  206. package/dist/components/FilterSummaryBar/index.cjs.map +1 -0
  207. package/dist/components/FilterSummaryBar/index.d.cts +53 -0
  208. package/dist/components/FilterSummaryBar/index.d.ts +53 -0
  209. package/dist/components/FilterSummaryBar/index.js +4 -0
  210. package/dist/components/FilterSummaryBar/index.js.map +1 -0
  211. package/dist/components/FreshnessBadge/index.cjs +25 -0
  212. package/dist/components/FreshnessBadge/index.cjs.map +1 -0
  213. package/dist/components/FreshnessBadge/index.d.cts +49 -0
  214. package/dist/components/FreshnessBadge/index.d.ts +49 -0
  215. package/dist/components/FreshnessBadge/index.js +4 -0
  216. package/dist/components/FreshnessBadge/index.js.map +1 -0
  217. package/dist/components/GlossaryTooltip/index.cjs +15 -0
  218. package/dist/components/GlossaryTooltip/index.cjs.map +1 -0
  219. package/dist/components/GlossaryTooltip/index.d.cts +64 -0
  220. package/dist/components/GlossaryTooltip/index.d.ts +64 -0
  221. package/dist/components/GlossaryTooltip/index.js +6 -0
  222. package/dist/components/GlossaryTooltip/index.js.map +1 -0
  223. package/dist/components/Input/index.cjs +20 -3
  224. package/dist/components/Input/index.d.cts +37 -2
  225. package/dist/components/Input/index.d.ts +37 -2
  226. package/dist/components/Input/index.js +2 -1
  227. package/dist/components/KeyboardShortcutsOverlay/index.cjs +21 -0
  228. package/dist/components/KeyboardShortcutsOverlay/index.cjs.map +1 -0
  229. package/dist/components/KeyboardShortcutsOverlay/index.d.cts +54 -0
  230. package/dist/components/KeyboardShortcutsOverlay/index.d.ts +54 -0
  231. package/dist/components/KeyboardShortcutsOverlay/index.js +8 -0
  232. package/dist/components/KeyboardShortcutsOverlay/index.js.map +1 -0
  233. package/dist/components/Markdown/index.cjs +10 -10
  234. package/dist/components/Markdown/index.js +2 -2
  235. package/dist/components/MediaEditor/index.cjs +11 -10
  236. package/dist/components/MediaEditor/index.js +6 -5
  237. package/dist/components/PhoneInput/index.cjs +5 -4
  238. package/dist/components/PhoneInput/index.js +3 -2
  239. package/dist/components/Progress/index.d.cts +1 -1
  240. package/dist/components/Progress/index.d.ts +1 -1
  241. package/dist/components/Radio/index.cjs +5 -4
  242. package/dist/components/Radio/index.d.cts +9 -1
  243. package/dist/components/Radio/index.d.ts +9 -1
  244. package/dist/components/Radio/index.js +2 -1
  245. package/dist/components/ReadingProgressBar/index.cjs +13 -0
  246. package/dist/components/ReadingProgressBar/index.cjs.map +1 -0
  247. package/dist/components/ReadingProgressBar/index.d.cts +20 -0
  248. package/dist/components/ReadingProgressBar/index.d.ts +20 -0
  249. package/dist/components/ReadingProgressBar/index.js +4 -0
  250. package/dist/components/ReadingProgressBar/index.js.map +1 -0
  251. package/dist/components/RichTextEditor/index.cjs +8 -7
  252. package/dist/components/RichTextEditor/index.js +5 -4
  253. package/dist/components/SectionSpyNav/index.cjs +15 -0
  254. package/dist/components/SectionSpyNav/index.cjs.map +1 -0
  255. package/dist/components/SectionSpyNav/index.d.cts +63 -0
  256. package/dist/components/SectionSpyNav/index.d.ts +63 -0
  257. package/dist/components/SectionSpyNav/index.js +6 -0
  258. package/dist/components/SectionSpyNav/index.js.map +1 -0
  259. package/dist/components/Select/index.cjs +6 -4
  260. package/dist/components/Select/index.d.cts +56 -9
  261. package/dist/components/Select/index.d.ts +56 -9
  262. package/dist/components/Select/index.js +4 -2
  263. package/dist/components/Slider/index.d.cts +2 -2
  264. package/dist/components/Slider/index.d.ts +2 -2
  265. package/dist/components/SourceTip/index.cjs +15 -0
  266. package/dist/components/SourceTip/index.cjs.map +1 -0
  267. package/dist/components/SourceTip/index.d.cts +58 -0
  268. package/dist/components/SourceTip/index.d.ts +58 -0
  269. package/dist/components/SourceTip/index.js +6 -0
  270. package/dist/components/SourceTip/index.js.map +1 -0
  271. package/dist/components/Sparkline/index.cjs +13 -0
  272. package/dist/components/Sparkline/index.cjs.map +1 -0
  273. package/dist/components/Sparkline/index.d.cts +53 -0
  274. package/dist/components/Sparkline/index.d.ts +53 -0
  275. package/dist/components/Sparkline/index.js +4 -0
  276. package/dist/components/Sparkline/index.js.map +1 -0
  277. package/dist/components/Spinner/index.d.cts +1 -1
  278. package/dist/components/Spinner/index.d.ts +1 -1
  279. package/dist/components/SuperChat/index.cjs +252 -93
  280. package/dist/components/SuperChat/index.cjs.map +1 -1
  281. package/dist/components/SuperChat/index.d.cts +13 -5
  282. package/dist/components/SuperChat/index.d.ts +13 -5
  283. package/dist/components/SuperChat/index.js +249 -90
  284. package/dist/components/SuperChat/index.js.map +1 -1
  285. package/dist/components/SuperChat/plugins/index.cjs +6 -26
  286. package/dist/components/SuperChat/plugins/index.cjs.map +1 -1
  287. package/dist/components/SuperChat/plugins/index.d.cts +2 -2
  288. package/dist/components/SuperChat/plugins/index.d.ts +2 -2
  289. package/dist/components/SuperChat/plugins/index.js +4 -24
  290. package/dist/components/SuperChat/plugins/index.js.map +1 -1
  291. package/dist/components/Text/index.d.cts +1 -1
  292. package/dist/components/Text/index.d.ts +1 -1
  293. package/dist/components/Textarea/index.cjs +5 -3
  294. package/dist/components/Textarea/index.d.cts +19 -1
  295. package/dist/components/Textarea/index.d.ts +19 -1
  296. package/dist/components/Textarea/index.js +3 -1
  297. package/dist/datavis.cjs +1 -1
  298. package/dist/datavis.js +1 -1
  299. package/dist/esheet.cjs +12 -11
  300. package/dist/esheet.cjs.map +1 -1
  301. package/dist/esheet.js +9 -8
  302. package/dist/esheet.js.map +1 -1
  303. package/dist/hooks/index.cjs +29 -19
  304. package/dist/hooks/index.d.cts +17 -2
  305. package/dist/hooks/index.d.ts +17 -2
  306. package/dist/hooks/index.js +4 -2
  307. package/dist/index.cjs +2965 -2043
  308. package/dist/index.cjs.map +1 -1
  309. package/dist/index.d.cts +193 -48
  310. package/dist/index.d.ts +193 -48
  311. package/dist/index.js +2135 -1330
  312. package/dist/index.js.map +1 -1
  313. package/dist/kerebron.cjs +200 -68
  314. package/dist/kerebron.cjs.map +1 -1
  315. package/dist/kerebron.css +129 -0
  316. package/dist/kerebron.d.cts +52 -3
  317. package/dist/kerebron.d.ts +52 -3
  318. package/dist/kerebron.js +201 -69
  319. package/dist/kerebron.js.map +1 -1
  320. package/dist/styles.css +1 -1
  321. package/dist/tailwind-preset.cjs +4 -4
  322. package/dist/tailwind-preset.js +1 -1
  323. package/dist/{types-BoTeTPdH.d.ts → types-9vK_YdEb.d.ts} +12 -1
  324. package/dist/{types-DyIB9HYT.d.cts → types-DZDroUW8.d.cts} +12 -1
  325. package/dist/{useAnchoredPosition-C7PNglzD.d.cts → useAnchoredPosition-CKwLSQW8.d.cts} +10 -3
  326. package/dist/{useAnchoredPosition-C7PNglzD.d.ts → useAnchoredPosition-CKwLSQW8.d.ts} +10 -3
  327. package/dist/utils/index.cjs +9 -9
  328. package/dist/utils/index.js +1 -1
  329. package/package.json +13 -4
  330. package/dist/chunk-5IDYOJHO.cjs.map +0 -1
  331. package/dist/chunk-6ECKH4DJ.cjs +0 -147
  332. package/dist/chunk-6ECKH4DJ.cjs.map +0 -1
  333. package/dist/chunk-6J7UGYT5.cjs.map +0 -1
  334. package/dist/chunk-6MMIWE7H.js.map +0 -1
  335. package/dist/chunk-AFGADE3B.js.map +0 -1
  336. package/dist/chunk-BOOJDRJO.js.map +0 -1
  337. package/dist/chunk-DLBV42JD.js.map +0 -1
  338. package/dist/chunk-EGWWTIWS.js.map +0 -1
  339. package/dist/chunk-GTHNWP4P.js.map +0 -1
  340. package/dist/chunk-HIDV32ZX.js.map +0 -1
  341. package/dist/chunk-KFLDXJEE.js.map +0 -1
  342. package/dist/chunk-LJDBD2DD.cjs.map +0 -1
  343. package/dist/chunk-MYFZYUPR.cjs.map +0 -1
  344. package/dist/chunk-OAHORW4N.cjs.map +0 -1
  345. package/dist/chunk-P6L74SKG.js.map +0 -1
  346. package/dist/chunk-QUUBTNMH.js.map +0 -1
  347. package/dist/chunk-RBS3GHDZ.cjs.map +0 -1
  348. package/dist/chunk-S3MKIDYG.cjs.map +0 -1
  349. package/dist/chunk-WUNWHOLA.cjs.map +0 -1
  350. package/dist/chunk-XB54G7WS.cjs.map +0 -1
  351. package/dist/chunk-YXCE2HSK.js +0 -124
  352. package/dist/chunk-YXCE2HSK.js.map +0 -1
  353. package/dist/chunk-ZBI52NP2.cjs.map +0 -1
  354. package/dist/collabKit-QZL4P5T5.js.map +0 -1
  355. package/dist/collabKit-UF7E6V3N.cjs.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/GlossaryTooltip/GlossaryTooltip.tsx"],"names":[],"mappings":";;;;;;;;AAmDA,IAAM,aAAA,GAAgB,GAAA;AA6Bf,SAAS,eAAA,CAAgB;AAAA,EAC9B,QAAA;AAAA,EACA,IAAA;AAAA,EACA,UAAA;AAAA,EACA,QAAA;AAAA,EACA,OAAA;AAAA,EACA,MAAA;AAAA,EACA,OAAA;AAAA,EACA,IAAA;AAAA,EACA,mBAAA,GAAsB,GAAA;AAAA,EACtB,SAAA,GAAY,IAAA;AAAA,EACZ;AACF,CAAA,EAAyB;AACvB,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAU,eAAS,KAAK,CAAA;AAC5C,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAU,eAAS,KAAK,CAAA;AAChD,EAAA,MAAM,KAAA,GAAc,aAA6C,IAAI,CAAA;AAGrE,EAAA,MAAM,iBAAA,GAA0B,aAAO,KAAK,CAAA;AAE5C,EAAA,MAAM,EAAE,SAAA,EAAW,WAAA,EAAa,KAAA,KAAU,mBAAA,CAGxC;AAAA,IACA,IAAA;AAAA,IACA,SAAA,EAAW,KAAA;AAAA,IACX,MAAA,EAAQ,EAAA;AAAA,IACR,eAAA,EAAiB,CAAA;AAAA,IACjB,SAAA,EAAW;AAAA,GACZ,CAAA;AAED,EAAA,MAAM,iBAAiB,MAAM;AAC3B,IAAA,IAAI,MAAM,OAAA,EAAS;AACjB,MAAA,YAAA,CAAa,MAAM,OAAO,CAAA;AAC1B,MAAA,KAAA,CAAM,OAAA,GAAU,IAAA;AAAA,IAClB;AAAA,EACF,CAAA;AAEA,EAAA,MAAM,IAAA,GAAa,kBAAY,MAAM;AACnC,IAAA,cAAA,EAAe;AACf,IAAA,OAAA,CAAQ,IAAI,CAAA;AAAA,EACd,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,YAAA,GAAqB,kBAAY,MAAM;AAC3C,IAAA,IAAI,MAAA,EAAQ;AACZ,IAAA,cAAA,EAAe;AACf,IAAA,KAAA,CAAM,UAAU,UAAA,CAAW,MAAM,OAAA,CAAQ,KAAK,GAAG,aAAa,CAAA;AAAA,EAChE,CAAA,EAAG,CAAC,MAAM,CAAC,CAAA;AAEX,EAAA,MAAM,KAAA,GAAc,kBAAY,MAAM;AACpC,IAAA,cAAA,EAAe;AACf,IAAA,SAAA,CAAU,KAAK,CAAA;AACf,IAAA,OAAA,CAAQ,KAAK,CAAA;AAEb,IAAA,IAAI,WAAA,CAAY,OAAA,EAAS,QAAA,CAAS,QAAA,CAAS,aAAa,CAAA,EAAG;AACzD,MAAA,iBAAA,CAAkB,OAAA,GAAU,IAAA;AAC5B,MAAC,SAAA,CAAU,OAAA,EAAS,aAAA,CAAc,UAAU,GAAmB,KAAA,EAAM;AAAA,IACvE;AAAA,EACF,CAAA,EAAG,CAAC,SAAA,EAAW,WAAW,CAAC,CAAA;AAE3B,EAAM,gBAAU,MAAM,MAAM,cAAA,EAAe,EAAG,EAAE,CAAA;AAIhD,EAAM,gBAAU,MAAM;AACpB,IAAA,IAAI,MAAA,EAAQ,WAAA,CAAY,OAAA,EAAS,KAAA,EAAM;AAAA,EACzC,CAAA,EAAG,CAAC,MAAA,EAAQ,WAAW,CAAC,CAAA;AAExB,EAAA,YAAA,CAAa,OAAO,IAAI,CAAA;AAGxB,EAAM,gBAAU,MAAM;AACpB,IAAA,IAAI,CAAC,IAAA,IAAQ,CAAC,MAAA,EAAQ;AACtB,IAAA,MAAM,SAAA,GAAY,CAAC,CAAA,KAAa;AAC9B,MAAA,MAAM,IAAI,CAAA,CAAE,MAAA;AACZ,MAAA,IAAI,SAAA,CAAU,SAAS,QAAA,CAAS,CAAC,KAAK,WAAA,CAAY,OAAA,EAAS,SAAS,CAAC,CAAA;AACnE,QAAA;AACF,MAAA,KAAA,EAAM;AAAA,IACR,CAAA;AACA,IAAA,QAAA,CAAS,gBAAA,CAAiB,aAAa,SAAS,CAAA;AAChD,IAAA,QAAA,CAAS,gBAAA,CAAiB,cAAc,SAAS,CAAA;AACjD,IAAA,OAAO,MAAM;AACX,MAAA,QAAA,CAAS,mBAAA,CAAoB,aAAa,SAAS,CAAA;AACnD,MAAA,QAAA,CAAS,mBAAA,CAAoB,cAAc,SAAS,CAAA;AAAA,IACtD,CAAA;AAAA,EACF,GAAG,CAAC,IAAA,EAAM,QAAQ,KAAA,EAAO,SAAA,EAAW,WAAW,CAAC,CAAA;AAEhD,EAAA,MAAM,SAAA,GAAkB,kBAAY,MAAM;AACxC,IAAA,IAAI,QAAQ,KAAA,EAAM;AAAA,SACb;AACH,MAAA,SAAA,CAAU,IAAI,CAAA;AACd,MAAA,IAAA,EAAK;AAAA,IACP;AAAA,EACF,CAAA,EAAG,CAAC,MAAA,EAAQ,KAAA,EAAO,IAAI,CAAC,CAAA;AAKxB,EAAA,MAAM,cAAA,GAAiB,CAAC,CAAA,KAAwB;AAC9C,IAAA,MAAM,SACJ,OAAO,MAAA,KAAW,eAClB,MAAA,CAAO,UAAA,CAAW,eAAe,CAAA,CAAE,OAAA;AACrC,IAAA,IAAI,IAAA,EAAM;AACR,MAAA,IAAI,CAAC,MAAA,EAAQ;AACb,MAAA,CAAA,CAAE,cAAA,EAAe;AAAA,IACnB;AACA,IAAA,SAAA,EAAU;AAAA,EACZ,CAAA;AAEA,EAAA,MAAM,gBAAA,GAAmB,CAAC,CAAA,KAA2B;AACnD,IAAA,IAAI,IAAA,EAAM;AACV,IAAA,IAAI,CAAA,CAAE,GAAA,KAAQ,OAAA,IAAW,CAAA,CAAE,QAAQ,GAAA,EAAK;AACtC,MAAA,CAAA,CAAE,cAAA,EAAe;AACjB,MAAA,SAAA,EAAU;AAAA,IACZ;AAAA,EACF,CAAA;AAIA,EAAA,MAAM,eAAA,GAAkB,CAAC,CAAA,KAA4C;AACnE,IAAA,IAAI,CAAA,CAAE,MAAA,KAAW,CAAA,CAAE,aAAA,EAAe;AAClC,IAAA,IAAI,CAAA,CAAE,GAAA,KAAQ,OAAA,IAAW,CAAA,CAAE,QAAQ,GAAA,EAAK;AACtC,MAAA,CAAA,CAAE,cAAA,EAAe;AACjB,MAAA,KAAA,EAAM;AAAA,IACR;AAAA,EACF,CAAA;AAEA,EAAA,MAAM,iBAAiB,MAAM;AAC3B,IAAA,IAAI,kBAAkB,OAAA,EAAS;AAC7B,MAAA,iBAAA,CAAkB,OAAA,GAAU,KAAA;AAC5B,MAAA;AAAA,IACF;AACA,IAAA,IAAA,EAAK;AAAA,EACP,CAAA;AAEA,EAAA,MAAM,aAAA,GAAgB,CAAC,CAAA,KAAyC;AAC9D,IAAA,MAAM,OAAO,CAAA,CAAE,aAAA;AACf,IAAA,IACE,IAAA,KACC,UAAU,OAAA,EAAS,QAAA,CAAS,IAAI,CAAA,IAAK,WAAA,CAAY,OAAA,EAAS,QAAA,CAAS,IAAI,CAAA,CAAA;AAExE,MAAA;AACF,IAAA,YAAA,EAAa;AAAA,EACf,CAAA;AAEA,EAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,mBAAmB,CAAA;AAC7C,EAAA,MAAM,KAAA,GACJ,UAAA,CAAW,MAAA,GAAS,KAAA,GAChB,CAAA,EAAG,UAAA,CAAW,KAAA,CAAM,CAAA,EAAG,KAAA,GAAQ,CAAC,CAAA,CAAE,OAAA,EAAS,CAAA,MAAA,CAAA,GAC3C,UAAA;AAEN,EAAA,MAAM,cAAA,GAAiB,EAAA;AAAA,IACrB,aAAA;AAAA,IACA,SAAA,IACE,0EAAA;AAAA,IACF;AAAA,GACF;AAEA,EAAA,MAAM,YAAA,GAAe;AAAA,IACnB,OAAA,EAAS,cAAA;AAAA,IACT,SAAA,EAAW,EAAA;AAAA,MACT,cAAA;AAAA,MACA,IAAA,IAAQ;AAAA;AACV,GACF;AAEA,EAAA,uBACE,IAAA;AAAA,IAAC,MAAA;AAAA,IAAA;AAAA,MACC,GAAA,EAAK,SAAA;AAAA,MACL,SAAA,EAAU,iBAAA;AAAA,MACV,YAAA,EAAc,IAAA;AAAA,MACd,YAAA,EAAc,YAAA;AAAA,MACd,OAAA,EAAS,cAAA;AAAA,MACT,MAAA,EAAQ,aAAA;AAAA,MAEP,QAAA,EAAA;AAAA,QAAA,IAAA,mBACC,GAAA;AAAA,UAAC,GAAA;AAAA,UAAA;AAAA,YACC,IAAA;AAAA,YACA,eAAA,EAAe,IAAA;AAAA,YACf,eAAA,EAAc,QAAA;AAAA,YACb,GAAG,YAAA;AAAA,YAEH;AAAA;AAAA,SACH,mBAEA,GAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YACC,IAAA,EAAK,QAAA;AAAA,YACL,eAAA,EAAe,IAAA;AAAA,YACf,eAAA,EAAc,QAAA;AAAA,YACd,YAAA,EAAY,GAAG,IAAI,CAAA,uBAAA,CAAA;AAAA,YACnB,SAAA,EAAW,gBAAA;AAAA,YACV,GAAG,YAAA;AAAA,YACJ,SAAA,EAAW,EAAA;AAAA,cACT,gFAAA;AAAA,cACA,YAAA,CAAa;AAAA,aACf;AAAA,YAEC;AAAA;AAAA,SACH;AAAA,QAED,IAAA,IACC,YAAA;AAAA;AAAA,0BAEE,GAAA;AAAA,YAAC,MAAA;AAAA,YAAA;AAAA,cACC,GAAA,EAAK,WAAA;AAAA,cACL,IAAA,EAAK,QAAA;AAAA,cACL,YAAA,EAAY,IAAA;AAAA,cACZ,QAAA,EAAU,EAAA;AAAA,cACV,YAAA,EAAc,IAAA;AAAA,cACd,YAAA,EAAc,YAAA;AAAA,cACd,aAAA;AAAA,cACA,SAAA,EAAW,eAAA;AAAA,cACX,SAAA,EAAU,sFAAA;AAAA,cACV,KAAA;AAAA,cAEA,QAAA,kBAAA,IAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,mKAAA,EACd,QAAA,EAAA;AAAA,gCAAA,GAAA,CAAC,UAAK,SAAA,EAAU,uEAAA,EACd,QAAA,kBAAA,IAAA,CAAC,MAAA,EAAA,EAAK,WAAU,wCAAA,EACd,QAAA,EAAA;AAAA,kCAAA,IAAA,CAAC,MAAA,EAAA,EAAK,WAAU,eAAA,EACb,QAAA,EAAA;AAAA,oBAAA,QAAA,oBACC,GAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,gHAAA,EACb,QAAA,EAAA,QAAA,EACH,CAAA;AAAA,oCAEF,GAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,qDAAA,EACb,QAAA,EAAA,IAAA,EACH;AAAA,mBAAA,EACF,CAAA;AAAA,kBACC,MAAA,oBACC,GAAA;AAAA,oBAAC,QAAA;AAAA,oBAAA;AAAA,sBACC,IAAA,EAAK,QAAA;AAAA,sBACL,OAAA,EAAS,KAAA;AAAA,sBACT,YAAA,EAAW,kBAAA;AAAA,sBACX,SAAA,EAAU,yEAAA;AAAA,sBAEV,QAAA,kBAAA,GAAA,CAAC,CAAA,EAAA,EAAE,aAAA,EAAY,MAAA,EAAO,WAAU,aAAA,EAAc;AAAA;AAAA;AAChD,iBAAA,EAEJ,CAAA,EACF,CAAA;AAAA,gCAEA,IAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,qBAAA,EACd,QAAA,EAAA;AAAA,kCAAA,GAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,yDAAA,EACb,QAAA,EAAA,KAAA,EACH,CAAA;AAAA,kBACC,OAAA,oBACC,IAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,+BAAA,EACd,QAAA,EAAA;AAAA,oCAAA,GAAA;AAAA,sBAAC,OAAA;AAAA,sBAAA;AAAA,wBACC,aAAA,EAAY,MAAA;AAAA,wBACZ,SAAA,EAAU;AAAA;AAAA,qBACZ;AAAA,oCACA,GAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,6DAAA,EACb,QAAA,EAAA,OAAA,EACH;AAAA,mBAAA,EACF;AAAA,iBAAA,EAEJ,CAAA;AAAA,gBAAA,CAEE,MAAA,IAAW,WAAW,OAAA,CAAQ,MAAA,GAAS,KAAM,IAAA,qBAC7C,IAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,sDAAA,EACb,QAAA,EAAA;AAAA,kBAAA,OAAA,IAAW,QAAQ,MAAA,GAAS,CAAA,wBAC1B,MAAA,EAAA,EAAK,SAAA,EAAU,+BACb,QAAA,EAAA,OAAA,CAAQ,GAAA;AAAA,oBAAI,CAAC,CAAA,KACZ,CAAA,CAAE,IAAA,mBACA,GAAA;AAAA,sBAAC,GAAA;AAAA,sBAAA;AAAA,wBAEC,MAAM,CAAA,CAAE,IAAA;AAAA,wBACR,SAAA,EAAU,2KAAA;AAAA,wBAET,QAAA,EAAA,CAAA,CAAE;AAAA,uBAAA;AAAA,sBAJE,CAAA,CAAE;AAAA,qBAKT,mBAEA,GAAA;AAAA,sBAAC,MAAA;AAAA,sBAAA;AAAA,wBAEC,SAAA,EAAU,qGAAA;AAAA,wBAET,QAAA,EAAA,CAAA,CAAE;AAAA,uBAAA;AAAA,sBAHE,CAAA,CAAE;AAAA;AAIT,mBAEJ,EACF,CAAA;AAAA,kCAEF,IAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,yCAAA,EACb,QAAA,EAAA;AAAA,oBAAA,MAAA,mBACC,GAAA;AAAA,sBAAC,GAAA;AAAA,sBAAA;AAAA,wBACC,MAAM,MAAA,CAAO,GAAA;AAAA,wBACb,MAAA,EAAO,QAAA;AAAA,wBACP,GAAA,EAAI,qBAAA;AAAA,wBACJ,SAAA,EAAU,sIAAA;AAAA,wBAET,QAAA,EAAA,MAAA,CAAO;AAAA;AAAA,qBACV,uBAEC,MAAA,EAAA,EAAK,CAAA;AAAA,oBAEP,IAAA,oBACC,IAAA;AAAA,sBAAC,GAAA;AAAA,sBAAA;AAAA,wBACC,IAAA;AAAA,wBACA,SAAA,EAAU,+GAAA;AAAA,wBACX,QAAA,EAAA;AAAA,0BAAA,iBAAA;AAAA,0CAEC,GAAA,CAAC,UAAA,EAAA,EAAW,aAAA,EAAY,MAAA,EAAO,WAAU,SAAA,EAAU;AAAA;AAAA;AAAA;AACrD,mBAAA,EAEJ;AAAA,iBAAA,EACF;AAAA,eAAA,EAEJ;AAAA;AAAA,WACF;AAAA,UACA,QAAA,CAAS;AAAA;AACX;AAAA;AAAA,GACJ;AAEJ","file":"chunk-6GKX36JX.js","sourcesContent":["'use client';\n\nimport * as React from 'react';\nimport { createPortal } from 'react-dom';\nimport { ArrowRight, Diamond, X } from 'lucide-react';\nimport { cn } from '../../utils/cn';\nimport { useAnchoredPosition } from '../../hooks/useAnchoredPosition';\nimport { useEscapeKey } from '../../hooks/useEscapeKey';\n\n// =============================================================================\n// Types\n// =============================================================================\n\n/** Authoritative source link shown in the card footer. */\nexport interface GlossarySource {\n label: string;\n url: string;\n}\n\n/** Sibling term shown as a lateral \"hop\" chip. */\nexport interface GlossaryRelatedTerm {\n term: string;\n href?: string;\n}\n\nexport interface GlossaryTooltipProps {\n /** Visible, in-flow trigger text (may be a plural or abbreviation match). */\n children: React.ReactNode;\n /** Canonical term name, shown as the card heading. */\n term: string;\n definition: string;\n /** Human-readable category label, shown as a badge in the header. */\n category?: string;\n /** Optional single key fact, shown with a diamond marker. */\n keyFact?: string;\n /** Optional authoritative source link, shown in the footer. */\n source?: GlossarySource;\n /** Optional sibling terms, shown as chips. */\n related?: GlossaryRelatedTerm[];\n /**\n * Full glossary page for the term. When set, the trigger is a real link —\n * desktop clicks navigate while hover previews; touch taps pin the card.\n */\n href?: string;\n /** Truncation limit for the in-card definition (default 190 chars). */\n maxDefinitionLength?: number;\n /** Dashed underline marking the term as hoverable (default true). */\n underline?: boolean;\n className?: string;\n}\n\nconst HIDE_GRACE_MS = 180;\n\n// =============================================================================\n// GlossaryTooltip\n// =============================================================================\n\n/**\n * A rich \"what does this term mean?\" hover card: category badge, canonical\n * term, truncated definition, optional key fact, source link, and related\n * term chips. The provenance sibling is `SourceTip` (\"what backs this\n * claim?\") — the two share the same interaction grammar.\n *\n * Trigger and card are phrasing content (`span`/`a`/`button` only), so it is\n * valid inside `<p>` prose. The card portals to `body` with fixed\n * positioning, flipping and clamping to stay in the viewport. On touch, a\n * tap pins the card instead of navigating; Escape or an outside tap closes.\n *\n * @example\n * ```tsx\n * <GlossaryTooltip\n * term=\"OSHA recordable\"\n * definition=\"A work-related injury or illness that meets OSHA reporting criteria…\"\n * category=\"Compliance\"\n * href=\"/glossary/osha-recordable\"\n * >\n * OSHA recordables\n * </GlossaryTooltip>\n * ```\n */\nexport function GlossaryTooltip({\n children,\n term,\n definition,\n category,\n keyFact,\n source,\n related,\n href,\n maxDefinitionLength = 190,\n underline = true,\n className,\n}: GlossaryTooltipProps) {\n const [open, setOpen] = React.useState(false);\n const [pinned, setPinned] = React.useState(false);\n const timer = React.useRef<ReturnType<typeof setTimeout> | null>(null);\n // True while close() restores focus to the trigger, so the trigger's\n // focus-show doesn't immediately reopen a card the user just dismissed.\n const suppressFocusShow = React.useRef(false);\n\n const { anchorRef, floatingRef, style } = useAnchoredPosition<\n HTMLSpanElement,\n HTMLSpanElement\n >({\n open,\n placement: 'top',\n offset: 10,\n viewportPadding: 8,\n allowFlip: true,\n });\n\n const clearHideTimer = () => {\n if (timer.current) {\n clearTimeout(timer.current);\n timer.current = null;\n }\n };\n\n const show = React.useCallback(() => {\n clearHideTimer();\n setOpen(true);\n }, []);\n\n const scheduleHide = React.useCallback(() => {\n if (pinned) return;\n clearHideTimer();\n timer.current = setTimeout(() => setOpen(false), HIDE_GRACE_MS);\n }, [pinned]);\n\n const close = React.useCallback(() => {\n clearHideTimer();\n setPinned(false);\n setOpen(false);\n // Return focus to the trigger if it was inside the card.\n if (floatingRef.current?.contains(document.activeElement)) {\n suppressFocusShow.current = true;\n (anchorRef.current?.querySelector('a,button') as HTMLElement)?.focus();\n }\n }, [anchorRef, floatingRef]);\n\n React.useEffect(() => () => clearHideTimer(), []);\n\n // A pinned card is a non-modal dialog: move focus into it so its links\n // and close button are reachable by keyboard.\n React.useEffect(() => {\n if (pinned) floatingRef.current?.focus();\n }, [pinned, floatingRef]);\n\n useEscapeKey(close, open);\n\n // Pinned cards close on an outside tap; hover cards close on their own.\n React.useEffect(() => {\n if (!open || !pinned) return;\n const onPointer = (e: Event) => {\n const t = e.target as Node;\n if (anchorRef.current?.contains(t) || floatingRef.current?.contains(t))\n return;\n close();\n };\n document.addEventListener('mousedown', onPointer);\n document.addEventListener('touchstart', onPointer);\n return () => {\n document.removeEventListener('mousedown', onPointer);\n document.removeEventListener('touchstart', onPointer);\n };\n }, [open, pinned, close, anchorRef, floatingRef]);\n\n const togglePin = React.useCallback(() => {\n if (pinned) close();\n else {\n setPinned(true);\n show();\n }\n }, [pinned, close, show]);\n\n // Linked terms: desktop clicks navigate, coarse pointers pin instead.\n // Unlinked (button) terms: any click toggles the pin — hover previews,\n // click holds the card open.\n const onTriggerClick = (e: React.MouseEvent) => {\n const coarse =\n typeof window !== 'undefined' &&\n window.matchMedia('(hover: none)').matches;\n if (href) {\n if (!coarse) return;\n e.preventDefault();\n }\n togglePin();\n };\n\n const onTriggerKeyDown = (e: React.KeyboardEvent) => {\n if (href) return; // links keep native Enter navigation\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n togglePin();\n }\n };\n\n // Focus lives on the dialog container once pinned, so Enter/Space there\n // (not on a link or the close button inside) must also unpin.\n const onDialogKeyDown = (e: React.KeyboardEvent<HTMLSpanElement>) => {\n if (e.target !== e.currentTarget) return;\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n close();\n }\n };\n\n const onTriggerFocus = () => {\n if (suppressFocusShow.current) {\n suppressFocusShow.current = false;\n return;\n }\n show();\n };\n\n const onBlurCapture = (e: React.FocusEvent<HTMLSpanElement>) => {\n const next = e.relatedTarget as Node | null;\n if (\n next &&\n (anchorRef.current?.contains(next) || floatingRef.current?.contains(next))\n )\n return;\n scheduleHide();\n };\n\n const limit = Math.max(1, maxDefinitionLength);\n const short =\n definition.length > limit\n ? `${definition.slice(0, limit - 1).trimEnd()}…`\n : definition;\n\n const triggerClasses = cn(\n 'cursor-help',\n underline &&\n 'decoration-primary-400/70 underline decoration-dashed underline-offset-4',\n className\n );\n\n const triggerProps = {\n onClick: onTriggerClick,\n className: cn(\n triggerClasses,\n href && 'text-primary-800 dark:text-primary-400 font-medium'\n ),\n };\n\n return (\n <span\n ref={anchorRef}\n className=\"relative inline\"\n onMouseEnter={show}\n onMouseLeave={scheduleHide}\n onFocus={onTriggerFocus}\n onBlur={onBlurCapture}\n >\n {href ? (\n <a\n href={href}\n aria-expanded={open}\n aria-haspopup=\"dialog\"\n {...triggerProps}\n >\n {children}\n </a>\n ) : (\n <button\n type=\"button\"\n aria-expanded={open}\n aria-haspopup=\"dialog\"\n aria-label={`${term} — show definition`}\n onKeyDown={onTriggerKeyDown}\n {...triggerProps}\n className={cn(\n 'inline appearance-none border-0 bg-transparent p-0 text-inherit [font:inherit]',\n triggerProps.className\n )}\n >\n {children}\n </button>\n )}\n {open &&\n createPortal(\n /* eslint-disable-next-line jsx-a11y/no-noninteractive-element-interactions -- keyboard dismissal on a focused non-modal dialog container is the WAI-ARIA pattern; links inside keep their own semantics */\n <span\n ref={floatingRef}\n role=\"dialog\"\n aria-label={term}\n tabIndex={-1}\n onMouseEnter={show}\n onMouseLeave={scheduleHide}\n onBlurCapture={onBlurCapture}\n onKeyDown={onDialogKeyDown}\n className=\"focus-visible:ring-ring z-50 block w-80 rounded-lg outline-none focus-visible:ring-2\"\n style={style}\n >\n <span className=\"border-border bg-card block overflow-hidden rounded-lg border text-start font-normal tracking-normal normal-case shadow-xl ring-1 ring-black/5 dark:ring-white/10\">\n <span className=\"from-primary-700 to-primary-600 block bg-gradient-to-br px-3.5 py-2.5\">\n <span className=\"flex items-start justify-between gap-2\">\n <span className=\"block min-w-0\">\n {category && (\n <span className=\"mb-1 inline-flex rounded-full bg-white/15 px-2 py-0.5 text-[10px] font-bold tracking-wide text-white uppercase\">\n {category}\n </span>\n )}\n <span className=\"block text-sm leading-snug font-semibold text-white\">\n {term}\n </span>\n </span>\n {pinned && (\n <button\n type=\"button\"\n onClick={close}\n aria-label=\"Close definition\"\n className=\"shrink-0 rounded p-0.5 text-white/70 hover:bg-white/10 hover:text-white\"\n >\n <X aria-hidden=\"true\" className=\"h-3.5 w-3.5\" />\n </button>\n )}\n </span>\n </span>\n\n <span className=\"block px-3.5 py-2.5\">\n <span className=\"text-muted-foreground block text-[13px] leading-relaxed\">\n {short}\n </span>\n {keyFact && (\n <span className=\"mt-2 flex items-start gap-1.5\">\n <Diamond\n aria-hidden=\"true\"\n className=\"text-primary-500 mt-0.5 h-3 w-3 shrink-0\"\n />\n <span className=\"text-foreground min-w-0 text-xs leading-relaxed font-medium\">\n {keyFact}\n </span>\n </span>\n )}\n </span>\n\n {(source || (related && related.length > 0) || href) && (\n <span className=\"border-border bg-muted/50 block border-t px-3.5 py-2\">\n {related && related.length > 0 && (\n <span className=\"mb-1.5 flex flex-wrap gap-1\">\n {related.map((r) =>\n r.href ? (\n <a\n key={r.term}\n href={r.href}\n className=\"border-border bg-card text-foreground hover:border-primary-400 hover:text-primary-800 dark:hover:text-primary-400 rounded-full border px-2 py-0.5 text-[11px] font-medium\"\n >\n {r.term}\n </a>\n ) : (\n <span\n key={r.term}\n className=\"border-border bg-card text-muted-foreground rounded-full border px-2 py-0.5 text-[11px] font-medium\"\n >\n {r.term}\n </span>\n )\n )}\n </span>\n )}\n <span className=\"flex items-center justify-between gap-2\">\n {source ? (\n <a\n href={source.url}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"text-primary-800 hover:text-primary-700 dark:text-primary-400 dark:hover:text-primary-300 min-w-0 truncate text-[11px] font-semibold\"\n >\n {source.label}\n </a>\n ) : (\n <span />\n )}\n {href && (\n <a\n href={href}\n className=\"text-muted-foreground hover:text-foreground inline-flex shrink-0 items-center gap-0.5 text-[11px] font-medium\"\n >\n Full definition\n <ArrowRight aria-hidden=\"true\" className=\"h-3 w-3\" />\n </a>\n )}\n </span>\n </span>\n )}\n </span>\n </span>,\n document.body\n )}\n </span>\n );\n}\n"]}
@@ -0,0 +1,3 @@
1
+
2
+ //# sourceMappingURL=chunk-6NZXWKUE.js.map
3
+ //# sourceMappingURL=chunk-6NZXWKUE.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"chunk-6NZXWKUE.js"}
@@ -0,0 +1,115 @@
1
+ import { cn } from './chunk-TQONQSJO.js';
2
+ import * as React from 'react';
3
+ import { Filter, X } from 'lucide-react';
4
+ import { jsxs, jsx, Fragment } from 'react/jsx-runtime';
5
+
6
+ var FilterSummaryBar = React.forwardRef(function FilterSummaryBar2({
7
+ filteredCount,
8
+ totalCount,
9
+ activeFilterCount,
10
+ hasSearchText = false,
11
+ showWhenIdle = false,
12
+ onClearAll,
13
+ recordLabel = "record",
14
+ recordsLabel = "records",
15
+ filterLabel = "filter",
16
+ filtersLabel = "filters",
17
+ activeLabel = "active",
18
+ searchActiveLabel = "search active",
19
+ allVisibleLabel = "all records visible",
20
+ clearLabel = "Clear all",
21
+ ofLabel = "of",
22
+ plusSearchLabel = "+ search",
23
+ className,
24
+ ...props
25
+ }, ref) {
26
+ const isFiltering = activeFilterCount > 0 || hasSearchText;
27
+ if (!isFiltering && !showWhenIdle) return null;
28
+ return /* @__PURE__ */ jsxs(
29
+ "div",
30
+ {
31
+ ref,
32
+ className: cn(
33
+ "flex items-center gap-3 rounded-lg border px-4 py-2 text-xs transition-colors",
34
+ isFiltering ? "border-primary-300 bg-primary-500/10 dark:border-primary-700" : "border-border bg-muted/60",
35
+ className
36
+ ),
37
+ ...props,
38
+ children: [
39
+ /* @__PURE__ */ jsx(
40
+ Filter,
41
+ {
42
+ "aria-hidden": "true",
43
+ className: cn(
44
+ "h-3 w-3 shrink-0",
45
+ isFiltering ? "text-primary-500" : "text-muted-foreground"
46
+ )
47
+ }
48
+ ),
49
+ /* @__PURE__ */ jsx(
50
+ "span",
51
+ {
52
+ role: "status",
53
+ "aria-live": "polite",
54
+ "aria-atomic": "true",
55
+ className: cn(
56
+ isFiltering ? "text-primary-800 dark:text-primary-200" : "text-muted-foreground"
57
+ ),
58
+ children: isFiltering ? /* @__PURE__ */ jsxs(Fragment, { children: [
59
+ /* @__PURE__ */ jsx("span", { className: "font-semibold", children: filteredCount.toLocaleString() }),
60
+ typeof totalCount === "number" && Number.isFinite(totalCount) ? /* @__PURE__ */ jsxs(Fragment, { children: [
61
+ " ",
62
+ ofLabel,
63
+ " ",
64
+ /* @__PURE__ */ jsx("span", { className: "font-semibold", children: totalCount.toLocaleString() })
65
+ ] }) : null,
66
+ " ",
67
+ filteredCount === 1 ? recordLabel : recordsLabel,
68
+ activeFilterCount > 0 && /* @__PURE__ */ jsxs(Fragment, { children: [
69
+ " ",
70
+ "\u2014",
71
+ " ",
72
+ /* @__PURE__ */ jsxs("span", { className: "font-semibold", children: [
73
+ activeFilterCount.toLocaleString(),
74
+ " ",
75
+ activeFilterCount === 1 ? filterLabel : filtersLabel
76
+ ] }),
77
+ " ",
78
+ activeLabel
79
+ ] }),
80
+ hasSearchText && activeFilterCount === 0 && /* @__PURE__ */ jsxs(Fragment, { children: [
81
+ " \u2014 ",
82
+ searchActiveLabel
83
+ ] }),
84
+ hasSearchText && activeFilterCount > 0 && /* @__PURE__ */ jsxs(Fragment, { children: [
85
+ " ",
86
+ plusSearchLabel
87
+ ] })
88
+ ] }) : allVisibleLabel
89
+ }
90
+ ),
91
+ isFiltering && onClearAll && /* @__PURE__ */ jsxs(
92
+ "button",
93
+ {
94
+ type: "button",
95
+ onClick: onClearAll,
96
+ className: cn(
97
+ "ms-auto flex items-center gap-1.5 rounded-md px-2 py-1 text-xs font-medium transition-colors",
98
+ "text-primary-800 hover:bg-primary-500/15 hover:text-primary-700 dark:text-primary-300 dark:hover:text-primary-200",
99
+ "focus-visible:ring-ring focus-visible:ring-2 focus-visible:ring-offset-2 focus-visible:outline-none"
100
+ ),
101
+ children: [
102
+ /* @__PURE__ */ jsx(X, { "aria-hidden": "true", className: "h-2.5 w-2.5" }),
103
+ clearLabel
104
+ ]
105
+ }
106
+ )
107
+ ]
108
+ }
109
+ );
110
+ });
111
+ FilterSummaryBar.displayName = "FilterSummaryBar";
112
+
113
+ export { FilterSummaryBar };
114
+ //# sourceMappingURL=chunk-6SCQ7FKT.js.map
115
+ //# sourceMappingURL=chunk-6SCQ7FKT.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/FilterSummaryBar/FilterSummaryBar.tsx"],"names":["FilterSummaryBar"],"mappings":"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","file":"chunk-6SCQ7FKT.js","sourcesContent":["'use client';\n\nimport * as React from 'react';\nimport { Filter, X } from 'lucide-react';\nimport { cn } from '../../utils/cn';\n\nexport interface FilterSummaryBarProps extends React.HTMLAttributes<HTMLDivElement> {\n /** Rows currently visible after filtering. */\n filteredCount: number;\n /** Total records before filtering. Omit when unknown; `0` renders as a real total. */\n totalCount?: number;\n /** Number of active filter conditions. */\n activeFilterCount: number;\n /** Whether a search query is also active. */\n hasSearchText?: boolean;\n /**\n * Keep the bar visible even when no filters/search are active. The idle\n * bar shows only `allVisibleLabel` (no counts).\n */\n showWhenIdle?: boolean;\n /** Called when the clear action is clicked. Omit to hide the clear button. */\n onClearAll?: () => void;\n /** Visible strings, overridable for i18n. */\n recordLabel?: string;\n recordsLabel?: string;\n filterLabel?: string;\n filtersLabel?: string;\n activeLabel?: string;\n searchActiveLabel?: string;\n allVisibleLabel?: string;\n clearLabel?: string;\n /** Joiner between filtered and total counts (default \"of\"). */\n ofLabel?: string;\n /** Suffix appended when search narrows on top of filters (default \"+ search\"). */\n plusSearchLabel?: string;\n}\n\n/**\n * The bar that anchors a filtered grid: \"1,204 of 8,911 records — 3\n * filters active · Clear all\". Hidden while idle unless `showWhenIdle`,\n * and tinted with the primary accent whenever filters or search narrow\n * the view. Pair with any data grid or list whose filter state lives in\n * the host.\n *\n * @example\n * ```tsx\n * <FilterSummaryBar\n * filteredCount={rows.length}\n * totalCount={total}\n * activeFilterCount={filters.length}\n * hasSearchText={query.length > 0}\n * onClearAll={resetFilters}\n * />\n * ```\n */\nexport const FilterSummaryBar = React.forwardRef<\n HTMLDivElement,\n FilterSummaryBarProps\n>(function FilterSummaryBar(\n {\n filteredCount,\n totalCount,\n activeFilterCount,\n hasSearchText = false,\n showWhenIdle = false,\n onClearAll,\n recordLabel = 'record',\n recordsLabel = 'records',\n filterLabel = 'filter',\n filtersLabel = 'filters',\n activeLabel = 'active',\n searchActiveLabel = 'search active',\n allVisibleLabel = 'all records visible',\n clearLabel = 'Clear all',\n ofLabel = 'of',\n plusSearchLabel = '+ search',\n className,\n ...props\n },\n ref\n) {\n const isFiltering = activeFilterCount > 0 || hasSearchText;\n if (!isFiltering && !showWhenIdle) return null;\n\n return (\n <div\n ref={ref}\n className={cn(\n 'flex items-center gap-3 rounded-lg border px-4 py-2 text-xs transition-colors',\n isFiltering\n ? 'border-primary-300 bg-primary-500/10 dark:border-primary-700'\n : 'border-border bg-muted/60',\n className\n )}\n {...props}\n >\n <Filter\n aria-hidden=\"true\"\n className={cn(\n 'h-3 w-3 shrink-0',\n isFiltering ? 'text-primary-500' : 'text-muted-foreground'\n )}\n />\n <span\n role=\"status\"\n aria-live=\"polite\"\n aria-atomic=\"true\"\n className={cn(\n isFiltering\n ? 'text-primary-800 dark:text-primary-200'\n : 'text-muted-foreground'\n )}\n >\n {isFiltering ? (\n <>\n <span className=\"font-semibold\">\n {filteredCount.toLocaleString()}\n </span>\n {typeof totalCount === 'number' && Number.isFinite(totalCount) ? (\n <>\n {' '}\n {ofLabel}{' '}\n <span className=\"font-semibold\">\n {totalCount.toLocaleString()}\n </span>\n </>\n ) : null}{' '}\n {filteredCount === 1 ? recordLabel : recordsLabel}\n {activeFilterCount > 0 && (\n <>\n {' '}\n &mdash;{' '}\n <span className=\"font-semibold\">\n {activeFilterCount.toLocaleString()}{' '}\n {activeFilterCount === 1 ? filterLabel : filtersLabel}\n </span>{' '}\n {activeLabel}\n </>\n )}\n {hasSearchText && activeFilterCount === 0 && (\n <> &mdash; {searchActiveLabel}</>\n )}\n {hasSearchText && activeFilterCount > 0 && <> {plusSearchLabel}</>}\n </>\n ) : (\n allVisibleLabel\n )}\n </span>\n {isFiltering && onClearAll && (\n <button\n type=\"button\"\n onClick={onClearAll}\n className={cn(\n 'ms-auto flex items-center gap-1.5 rounded-md px-2 py-1 text-xs font-medium transition-colors',\n 'text-primary-800 hover:bg-primary-500/15 hover:text-primary-700 dark:text-primary-300 dark:hover:text-primary-200',\n 'focus-visible:ring-ring focus-visible:ring-2 focus-visible:ring-offset-2 focus-visible:outline-none'\n )}\n >\n <X aria-hidden=\"true\" className=\"h-2.5 w-2.5\" />\n {clearLabel}\n </button>\n )}\n </div>\n );\n});\n\nFilterSummaryBar.displayName = 'FilterSummaryBar';\n"]}
@@ -1,3 +1,4 @@
1
+ import { floatingGroupLabelVariants, floatingGroupVariants } from './chunk-3IMM2PM4.js';
1
2
  import { cn } from './chunk-TQONQSJO.js';
2
3
  import * as React from 'react';
3
4
  import { cva } from 'class-variance-authority';
@@ -145,6 +146,7 @@ var Checkbox = React.forwardRef(
145
146
  Checkbox.displayName = "Checkbox";
146
147
  function CheckboxGroup({
147
148
  label,
149
+ labelVariant = "stacked",
148
150
  description,
149
151
  error,
150
152
  orientation = "vertical",
@@ -154,6 +156,19 @@ function CheckboxGroup({
154
156
  const groupId = React.useId();
155
157
  const descriptionId = `${groupId}-description`;
156
158
  const errorId = `${groupId}-error`;
159
+ const isFloating = labelVariant === "floating" && !!label;
160
+ const itemsElement = /* @__PURE__ */ jsx(
161
+ "div",
162
+ {
163
+ role: "group",
164
+ "data-slot": "checkbox-group-items",
165
+ className: cn(
166
+ "flex gap-4",
167
+ orientation === "vertical" && "flex-col gap-2"
168
+ ),
169
+ children
170
+ }
171
+ );
157
172
  return /* @__PURE__ */ jsxs(
158
173
  "fieldset",
159
174
  {
@@ -165,31 +180,47 @@ function CheckboxGroup({
165
180
  "legend",
166
181
  {
167
182
  "data-slot": "checkbox-group-legend",
168
- className: "text-foreground mb-1 text-sm font-medium",
183
+ className: cn(
184
+ // Legends are excluded from the fieldset's flex layout; explicit
185
+ // margin matches the stacked Input label's 6px gap.
186
+ "text-foreground mb-1.5 text-sm font-medium",
187
+ isFloating && "sr-only"
188
+ ),
169
189
  children: label
170
190
  }
171
191
  ),
192
+ isFloating ? /* @__PURE__ */ jsxs(
193
+ "div",
194
+ {
195
+ "data-slot": "checkbox-group-field",
196
+ className: floatingGroupVariants({ hasError: !!error }),
197
+ children: [
198
+ /* @__PURE__ */ jsx(
199
+ "span",
200
+ {
201
+ "aria-hidden": "true",
202
+ "data-slot": "checkbox-group-floating-label",
203
+ className: floatingGroupLabelVariants({ hasError: !!error }),
204
+ children: label
205
+ }
206
+ ),
207
+ itemsElement
208
+ ]
209
+ }
210
+ ) : null,
172
211
  description && /* @__PURE__ */ jsx(
173
212
  "p",
174
213
  {
175
214
  id: descriptionId,
176
215
  "data-slot": "checkbox-group-description",
177
- className: "text-muted-foreground mb-3 text-xs",
178
- children: description
179
- }
180
- ),
181
- /* @__PURE__ */ jsx(
182
- "div",
183
- {
184
- role: "group",
185
- "data-slot": "checkbox-group-items",
186
216
  className: cn(
187
- "flex gap-4",
188
- orientation === "vertical" && "flex-col gap-2"
217
+ "text-muted-foreground text-xs",
218
+ isFloating ? "mt-1" : "mb-3"
189
219
  ),
190
- children
220
+ children: description
191
221
  }
192
222
  ),
223
+ !isFloating && itemsElement,
193
224
  error && /* @__PURE__ */ jsx(
194
225
  "p",
195
226
  {
@@ -257,5 +288,5 @@ function MinusIcon({ size, className }) {
257
288
  }
258
289
 
259
290
  export { Checkbox, CheckboxGroup, checkboxVariants };
260
- //# sourceMappingURL=chunk-KFLDXJEE.js.map
261
- //# sourceMappingURL=chunk-KFLDXJEE.js.map
291
+ //# sourceMappingURL=chunk-753Z3NXL.js.map
292
+ //# sourceMappingURL=chunk-753Z3NXL.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/Checkbox/Checkbox.tsx"],"names":[],"mappings":"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","file":"chunk-753Z3NXL.js","sourcesContent":["import * as React from 'react';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { cn } from '../../utils/cn';\nimport {\n floatingGroupVariants,\n floatingGroupLabelVariants,\n} from '../Input/Input';\n\nconst checkboxVariants = cva(\n [\n 'shrink-0 appearance-none',\n 'border-2 border-input rounded',\n 'bg-background',\n 'transition-all duration-150',\n 'cursor-pointer',\n 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2',\n 'disabled:cursor-not-allowed disabled:opacity-50',\n 'checked:bg-primary-800 checked:border-primary-500',\n 'indeterminate:bg-primary-800 indeterminate:border-primary-500',\n ],\n {\n variants: {\n size: {\n sm: 'h-4 w-4',\n md: 'h-5 w-5',\n lg: 'h-6 w-6',\n },\n },\n defaultVariants: {\n size: 'md',\n },\n }\n);\n\nexport interface CheckboxProps\n extends\n Omit<React.InputHTMLAttributes<HTMLInputElement>, 'size' | 'type'>,\n VariantProps<typeof checkboxVariants> {\n /** Label for the checkbox */\n label?: string;\n /** Description text below the label */\n description?: string;\n /** Indeterminate state (neither checked nor unchecked) */\n indeterminate?: boolean;\n /** Error message */\n error?: string;\n /** Position of the label */\n labelPosition?: 'left' | 'right';\n}\n\n/**\n * An accessible checkbox component with support for indeterminate state.\n *\n * @example\n * ```tsx\n * <Checkbox label=\"Accept terms and conditions\" />\n * <Checkbox label=\"Newsletter\" description=\"Receive updates about new features\" />\n * <Checkbox indeterminate label=\"Select all\" />\n * ```\n */\nconst Checkbox = React.forwardRef<HTMLInputElement, CheckboxProps>(\n (\n {\n className,\n size,\n label,\n description,\n indeterminate = false,\n error,\n labelPosition = 'right',\n id,\n disabled,\n ...props\n },\n ref\n ) => {\n const internalRef = React.useRef<HTMLInputElement>(null);\n const generatedId = React.useId();\n const checkboxId = id || generatedId;\n const descriptionId = `${checkboxId}-description`;\n const errorId = `${checkboxId}-error`;\n\n // Handle indeterminate state\n React.useEffect(() => {\n const checkbox = internalRef.current;\n if (checkbox) {\n checkbox.indeterminate = indeterminate;\n }\n }, [indeterminate]);\n\n // Combine refs\n React.useImperativeHandle(ref, () => internalRef.current!);\n\n const checkboxElement = (\n <span\n data-slot=\"checkbox-indicator\"\n className=\"relative inline-flex items-center justify-center\"\n >\n <input\n ref={internalRef}\n data-slot=\"checkbox\"\n id={checkboxId}\n type=\"checkbox\"\n disabled={disabled}\n aria-describedby={\n [description ? descriptionId : null, error ? errorId : null]\n .filter(Boolean)\n .join(' ') || undefined\n }\n aria-invalid={!!error}\n className={cn('peer', checkboxVariants({ size }), className)}\n {...props}\n />\n {/* Custom check icon overlay */}\n <CheckIcon\n size={size}\n className=\"pointer-events-none absolute text-white opacity-0 transition-opacity peer-checked:opacity-100\"\n />\n {/* Custom indeterminate icon overlay */}\n <MinusIcon\n size={size}\n className=\"pointer-events-none absolute text-white opacity-0 transition-opacity peer-indeterminate:opacity-100\"\n />\n </span>\n );\n\n const labelElement = label && (\n <div className=\"flex flex-col\">\n <label\n htmlFor={checkboxId}\n data-slot=\"checkbox-label\"\n className={cn(\n 'text-foreground cursor-pointer text-sm font-medium select-none',\n disabled && 'cursor-not-allowed opacity-50'\n )}\n >\n {label}\n </label>\n {description && (\n <p\n id={descriptionId}\n data-slot=\"checkbox-description\"\n className=\"text-muted-foreground mt-0.5 text-xs\"\n >\n {description}\n </p>\n )}\n </div>\n );\n\n return (\n <div data-slot=\"checkbox-wrapper\" className=\"flex flex-col gap-1\">\n <div\n data-slot=\"checkbox-row\"\n className={cn(\n 'flex gap-2',\n description ? 'items-start' : 'items-center',\n labelPosition === 'left' && 'flex-row-reverse'\n )}\n >\n {checkboxElement}\n {labelElement}\n </div>\n {error && (\n <p\n id={errorId}\n data-slot=\"checkbox-error\"\n className=\"text-destructive-700 dark:text-destructive-400 text-sm\"\n role=\"alert\"\n >\n {error}\n </p>\n )}\n </div>\n );\n }\n);\n\nCheckbox.displayName = 'Checkbox';\n\n// ============================================================================\n// Checkbox Group\n// ============================================================================\n\nexport interface CheckboxGroupProps {\n /** Group label */\n label?: string;\n /**\n * How the group label is rendered.\n * - `stacked` (default): label above the options.\n * - `floating`: renders the group as a bordered field matching floating\n * inputs, with the label fixed in the floated position so mixed forms\n * stay vertically aligned.\n */\n labelVariant?: 'stacked' | 'floating';\n /** Description for the group */\n description?: string;\n /** Error message for the group */\n error?: string;\n /** Orientation of checkboxes */\n orientation?: 'horizontal' | 'vertical';\n /** Children checkboxes */\n children: React.ReactNode;\n /** Additional class name */\n className?: string;\n}\n\n/**\n * A container for grouping related checkboxes.\n *\n * @example\n * ```tsx\n * <CheckboxGroup label=\"Interests\" orientation=\"vertical\">\n * <Checkbox label=\"Sports\" />\n * <Checkbox label=\"Music\" />\n * <Checkbox label=\"Travel\" />\n * </CheckboxGroup>\n * ```\n */\nfunction CheckboxGroup({\n label,\n labelVariant = 'stacked',\n description,\n error,\n orientation = 'vertical',\n children,\n className,\n}: CheckboxGroupProps) {\n const groupId = React.useId();\n const descriptionId = `${groupId}-description`;\n const errorId = `${groupId}-error`;\n\n const isFloating = labelVariant === 'floating' && !!label;\n\n const itemsElement = (\n <div\n role=\"group\"\n data-slot=\"checkbox-group-items\"\n className={cn(\n 'flex gap-4',\n orientation === 'vertical' && 'flex-col gap-2'\n )}\n >\n {children}\n </div>\n );\n\n return (\n <fieldset\n data-slot=\"checkbox-group\"\n className={cn('flex flex-col', className)}\n aria-describedby={\n [description ? descriptionId : null, error ? errorId : null]\n .filter(Boolean)\n .join(' ') || undefined\n }\n >\n {label && (\n <legend\n data-slot=\"checkbox-group-legend\"\n className={cn(\n // Legends are excluded from the fieldset's flex layout; explicit\n // margin matches the stacked Input label's 6px gap.\n 'text-foreground mb-1.5 text-sm font-medium',\n isFloating && 'sr-only'\n )}\n >\n {label}\n </legend>\n )}\n {isFloating ? (\n <div\n data-slot=\"checkbox-group-field\"\n className={floatingGroupVariants({ hasError: !!error })}\n >\n <span\n aria-hidden=\"true\"\n data-slot=\"checkbox-group-floating-label\"\n className={floatingGroupLabelVariants({ hasError: !!error })}\n >\n {label}\n </span>\n {itemsElement}\n </div>\n ) : null}\n {description && (\n <p\n id={descriptionId}\n data-slot=\"checkbox-group-description\"\n className={cn(\n 'text-muted-foreground text-xs',\n isFloating ? 'mt-1' : 'mb-3'\n )}\n >\n {description}\n </p>\n )}\n {!isFloating && itemsElement}\n {error && (\n <p\n id={errorId}\n data-slot=\"checkbox-group-error\"\n className=\"text-destructive mt-2 text-sm\"\n role=\"alert\"\n >\n {error}\n </p>\n )}\n </fieldset>\n );\n}\n\nCheckboxGroup.displayName = 'CheckboxGroup';\n\n// ============================================================================\n// Check Icon\n// ============================================================================\n\ninterface CheckIconProps {\n size?: 'sm' | 'md' | 'lg' | null;\n className?: string;\n}\n\nfunction CheckIcon({ size, className }: CheckIconProps) {\n const sizeMap = {\n sm: 10,\n md: 12,\n lg: 14,\n };\n const iconSize = sizeMap[size || 'md'];\n\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width={iconSize}\n height={iconSize}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"3\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n className={className}\n aria-hidden=\"true\"\n >\n <path d=\"M20 6 9 17l-5-5\" />\n </svg>\n );\n}\n\nfunction MinusIcon({ size, className }: CheckIconProps) {\n const sizeMap = {\n sm: 10,\n md: 12,\n lg: 14,\n };\n const iconSize = sizeMap[size || 'md'];\n\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width={iconSize}\n height={iconSize}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"3\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n className={className}\n aria-hidden=\"true\"\n >\n <path d=\"M5 12h14\" />\n </svg>\n );\n}\n\nexport { Checkbox, CheckboxGroup, checkboxVariants };\n"]}
@@ -1,5 +1,6 @@
1
1
  'use strict';
2
2
 
3
+ var chunkZ5S5JEJD_cjs = require('./chunk-Z5S5JEJD.cjs');
3
4
  var chunkS5RVSXDV_cjs = require('./chunk-S5RVSXDV.cjs');
4
5
  var React = require('react');
5
6
  var classVarianceAuthority = require('class-variance-authority');
@@ -167,6 +168,7 @@ var Checkbox = React__namespace.forwardRef(
167
168
  Checkbox.displayName = "Checkbox";
168
169
  function CheckboxGroup({
169
170
  label,
171
+ labelVariant = "stacked",
170
172
  description,
171
173
  error,
172
174
  orientation = "vertical",
@@ -176,6 +178,19 @@ function CheckboxGroup({
176
178
  const groupId = React__namespace.useId();
177
179
  const descriptionId = `${groupId}-description`;
178
180
  const errorId = `${groupId}-error`;
181
+ const isFloating = labelVariant === "floating" && !!label;
182
+ const itemsElement = /* @__PURE__ */ jsxRuntime.jsx(
183
+ "div",
184
+ {
185
+ role: "group",
186
+ "data-slot": "checkbox-group-items",
187
+ className: chunkS5RVSXDV_cjs.cn(
188
+ "flex gap-4",
189
+ orientation === "vertical" && "flex-col gap-2"
190
+ ),
191
+ children
192
+ }
193
+ );
179
194
  return /* @__PURE__ */ jsxRuntime.jsxs(
180
195
  "fieldset",
181
196
  {
@@ -187,31 +202,47 @@ function CheckboxGroup({
187
202
  "legend",
188
203
  {
189
204
  "data-slot": "checkbox-group-legend",
190
- className: "text-foreground mb-1 text-sm font-medium",
205
+ className: chunkS5RVSXDV_cjs.cn(
206
+ // Legends are excluded from the fieldset's flex layout; explicit
207
+ // margin matches the stacked Input label's 6px gap.
208
+ "text-foreground mb-1.5 text-sm font-medium",
209
+ isFloating && "sr-only"
210
+ ),
191
211
  children: label
192
212
  }
193
213
  ),
214
+ isFloating ? /* @__PURE__ */ jsxRuntime.jsxs(
215
+ "div",
216
+ {
217
+ "data-slot": "checkbox-group-field",
218
+ className: chunkZ5S5JEJD_cjs.floatingGroupVariants({ hasError: !!error }),
219
+ children: [
220
+ /* @__PURE__ */ jsxRuntime.jsx(
221
+ "span",
222
+ {
223
+ "aria-hidden": "true",
224
+ "data-slot": "checkbox-group-floating-label",
225
+ className: chunkZ5S5JEJD_cjs.floatingGroupLabelVariants({ hasError: !!error }),
226
+ children: label
227
+ }
228
+ ),
229
+ itemsElement
230
+ ]
231
+ }
232
+ ) : null,
194
233
  description && /* @__PURE__ */ jsxRuntime.jsx(
195
234
  "p",
196
235
  {
197
236
  id: descriptionId,
198
237
  "data-slot": "checkbox-group-description",
199
- className: "text-muted-foreground mb-3 text-xs",
200
- children: description
201
- }
202
- ),
203
- /* @__PURE__ */ jsxRuntime.jsx(
204
- "div",
205
- {
206
- role: "group",
207
- "data-slot": "checkbox-group-items",
208
238
  className: chunkS5RVSXDV_cjs.cn(
209
- "flex gap-4",
210
- orientation === "vertical" && "flex-col gap-2"
239
+ "text-muted-foreground text-xs",
240
+ isFloating ? "mt-1" : "mb-3"
211
241
  ),
212
- children
242
+ children: description
213
243
  }
214
244
  ),
245
+ !isFloating && itemsElement,
215
246
  error && /* @__PURE__ */ jsxRuntime.jsx(
216
247
  "p",
217
248
  {
@@ -281,5 +312,5 @@ function MinusIcon({ size, className }) {
281
312
  exports.Checkbox = Checkbox;
282
313
  exports.CheckboxGroup = CheckboxGroup;
283
314
  exports.checkboxVariants = checkboxVariants;
284
- //# sourceMappingURL=chunk-S3MKIDYG.cjs.map
285
- //# sourceMappingURL=chunk-S3MKIDYG.cjs.map
315
+ //# sourceMappingURL=chunk-7AECNMYV.cjs.map
316
+ //# sourceMappingURL=chunk-7AECNMYV.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/Checkbox/Checkbox.tsx"],"names":["cva","React","jsxs","jsx","cn","floatingGroupVariants","floatingGroupLabelVariants"],"mappings":"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","file":"chunk-7AECNMYV.cjs","sourcesContent":["import * as React from 'react';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { cn } from '../../utils/cn';\nimport {\n floatingGroupVariants,\n floatingGroupLabelVariants,\n} from '../Input/Input';\n\nconst checkboxVariants = cva(\n [\n 'shrink-0 appearance-none',\n 'border-2 border-input rounded',\n 'bg-background',\n 'transition-all duration-150',\n 'cursor-pointer',\n 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2',\n 'disabled:cursor-not-allowed disabled:opacity-50',\n 'checked:bg-primary-800 checked:border-primary-500',\n 'indeterminate:bg-primary-800 indeterminate:border-primary-500',\n ],\n {\n variants: {\n size: {\n sm: 'h-4 w-4',\n md: 'h-5 w-5',\n lg: 'h-6 w-6',\n },\n },\n defaultVariants: {\n size: 'md',\n },\n }\n);\n\nexport interface CheckboxProps\n extends\n Omit<React.InputHTMLAttributes<HTMLInputElement>, 'size' | 'type'>,\n VariantProps<typeof checkboxVariants> {\n /** Label for the checkbox */\n label?: string;\n /** Description text below the label */\n description?: string;\n /** Indeterminate state (neither checked nor unchecked) */\n indeterminate?: boolean;\n /** Error message */\n error?: string;\n /** Position of the label */\n labelPosition?: 'left' | 'right';\n}\n\n/**\n * An accessible checkbox component with support for indeterminate state.\n *\n * @example\n * ```tsx\n * <Checkbox label=\"Accept terms and conditions\" />\n * <Checkbox label=\"Newsletter\" description=\"Receive updates about new features\" />\n * <Checkbox indeterminate label=\"Select all\" />\n * ```\n */\nconst Checkbox = React.forwardRef<HTMLInputElement, CheckboxProps>(\n (\n {\n className,\n size,\n label,\n description,\n indeterminate = false,\n error,\n labelPosition = 'right',\n id,\n disabled,\n ...props\n },\n ref\n ) => {\n const internalRef = React.useRef<HTMLInputElement>(null);\n const generatedId = React.useId();\n const checkboxId = id || generatedId;\n const descriptionId = `${checkboxId}-description`;\n const errorId = `${checkboxId}-error`;\n\n // Handle indeterminate state\n React.useEffect(() => {\n const checkbox = internalRef.current;\n if (checkbox) {\n checkbox.indeterminate = indeterminate;\n }\n }, [indeterminate]);\n\n // Combine refs\n React.useImperativeHandle(ref, () => internalRef.current!);\n\n const checkboxElement = (\n <span\n data-slot=\"checkbox-indicator\"\n className=\"relative inline-flex items-center justify-center\"\n >\n <input\n ref={internalRef}\n data-slot=\"checkbox\"\n id={checkboxId}\n type=\"checkbox\"\n disabled={disabled}\n aria-describedby={\n [description ? descriptionId : null, error ? errorId : null]\n .filter(Boolean)\n .join(' ') || undefined\n }\n aria-invalid={!!error}\n className={cn('peer', checkboxVariants({ size }), className)}\n {...props}\n />\n {/* Custom check icon overlay */}\n <CheckIcon\n size={size}\n className=\"pointer-events-none absolute text-white opacity-0 transition-opacity peer-checked:opacity-100\"\n />\n {/* Custom indeterminate icon overlay */}\n <MinusIcon\n size={size}\n className=\"pointer-events-none absolute text-white opacity-0 transition-opacity peer-indeterminate:opacity-100\"\n />\n </span>\n );\n\n const labelElement = label && (\n <div className=\"flex flex-col\">\n <label\n htmlFor={checkboxId}\n data-slot=\"checkbox-label\"\n className={cn(\n 'text-foreground cursor-pointer text-sm font-medium select-none',\n disabled && 'cursor-not-allowed opacity-50'\n )}\n >\n {label}\n </label>\n {description && (\n <p\n id={descriptionId}\n data-slot=\"checkbox-description\"\n className=\"text-muted-foreground mt-0.5 text-xs\"\n >\n {description}\n </p>\n )}\n </div>\n );\n\n return (\n <div data-slot=\"checkbox-wrapper\" className=\"flex flex-col gap-1\">\n <div\n data-slot=\"checkbox-row\"\n className={cn(\n 'flex gap-2',\n description ? 'items-start' : 'items-center',\n labelPosition === 'left' && 'flex-row-reverse'\n )}\n >\n {checkboxElement}\n {labelElement}\n </div>\n {error && (\n <p\n id={errorId}\n data-slot=\"checkbox-error\"\n className=\"text-destructive-700 dark:text-destructive-400 text-sm\"\n role=\"alert\"\n >\n {error}\n </p>\n )}\n </div>\n );\n }\n);\n\nCheckbox.displayName = 'Checkbox';\n\n// ============================================================================\n// Checkbox Group\n// ============================================================================\n\nexport interface CheckboxGroupProps {\n /** Group label */\n label?: string;\n /**\n * How the group label is rendered.\n * - `stacked` (default): label above the options.\n * - `floating`: renders the group as a bordered field matching floating\n * inputs, with the label fixed in the floated position so mixed forms\n * stay vertically aligned.\n */\n labelVariant?: 'stacked' | 'floating';\n /** Description for the group */\n description?: string;\n /** Error message for the group */\n error?: string;\n /** Orientation of checkboxes */\n orientation?: 'horizontal' | 'vertical';\n /** Children checkboxes */\n children: React.ReactNode;\n /** Additional class name */\n className?: string;\n}\n\n/**\n * A container for grouping related checkboxes.\n *\n * @example\n * ```tsx\n * <CheckboxGroup label=\"Interests\" orientation=\"vertical\">\n * <Checkbox label=\"Sports\" />\n * <Checkbox label=\"Music\" />\n * <Checkbox label=\"Travel\" />\n * </CheckboxGroup>\n * ```\n */\nfunction CheckboxGroup({\n label,\n labelVariant = 'stacked',\n description,\n error,\n orientation = 'vertical',\n children,\n className,\n}: CheckboxGroupProps) {\n const groupId = React.useId();\n const descriptionId = `${groupId}-description`;\n const errorId = `${groupId}-error`;\n\n const isFloating = labelVariant === 'floating' && !!label;\n\n const itemsElement = (\n <div\n role=\"group\"\n data-slot=\"checkbox-group-items\"\n className={cn(\n 'flex gap-4',\n orientation === 'vertical' && 'flex-col gap-2'\n )}\n >\n {children}\n </div>\n );\n\n return (\n <fieldset\n data-slot=\"checkbox-group\"\n className={cn('flex flex-col', className)}\n aria-describedby={\n [description ? descriptionId : null, error ? errorId : null]\n .filter(Boolean)\n .join(' ') || undefined\n }\n >\n {label && (\n <legend\n data-slot=\"checkbox-group-legend\"\n className={cn(\n // Legends are excluded from the fieldset's flex layout; explicit\n // margin matches the stacked Input label's 6px gap.\n 'text-foreground mb-1.5 text-sm font-medium',\n isFloating && 'sr-only'\n )}\n >\n {label}\n </legend>\n )}\n {isFloating ? (\n <div\n data-slot=\"checkbox-group-field\"\n className={floatingGroupVariants({ hasError: !!error })}\n >\n <span\n aria-hidden=\"true\"\n data-slot=\"checkbox-group-floating-label\"\n className={floatingGroupLabelVariants({ hasError: !!error })}\n >\n {label}\n </span>\n {itemsElement}\n </div>\n ) : null}\n {description && (\n <p\n id={descriptionId}\n data-slot=\"checkbox-group-description\"\n className={cn(\n 'text-muted-foreground text-xs',\n isFloating ? 'mt-1' : 'mb-3'\n )}\n >\n {description}\n </p>\n )}\n {!isFloating && itemsElement}\n {error && (\n <p\n id={errorId}\n data-slot=\"checkbox-group-error\"\n className=\"text-destructive mt-2 text-sm\"\n role=\"alert\"\n >\n {error}\n </p>\n )}\n </fieldset>\n );\n}\n\nCheckboxGroup.displayName = 'CheckboxGroup';\n\n// ============================================================================\n// Check Icon\n// ============================================================================\n\ninterface CheckIconProps {\n size?: 'sm' | 'md' | 'lg' | null;\n className?: string;\n}\n\nfunction CheckIcon({ size, className }: CheckIconProps) {\n const sizeMap = {\n sm: 10,\n md: 12,\n lg: 14,\n };\n const iconSize = sizeMap[size || 'md'];\n\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width={iconSize}\n height={iconSize}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"3\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n className={className}\n aria-hidden=\"true\"\n >\n <path d=\"M20 6 9 17l-5-5\" />\n </svg>\n );\n}\n\nfunction MinusIcon({ size, className }: CheckIconProps) {\n const sizeMap = {\n sm: 10,\n md: 12,\n lg: 14,\n };\n const iconSize = sizeMap[size || 'md'];\n\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width={iconSize}\n height={iconSize}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"3\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n className={className}\n aria-hidden=\"true\"\n >\n <path d=\"M5 12h14\" />\n </svg>\n );\n}\n\nexport { Checkbox, CheckboxGroup, checkboxVariants };\n"]}
@@ -0,0 +1,92 @@
1
+ 'use strict';
2
+
3
+ var react = require('react');
4
+
5
+ // src/hooks/useScrollSpy.ts
6
+ function useScrollSpy({
7
+ selectors,
8
+ ids,
9
+ rootMargin = "0px 0px -60% 0px",
10
+ threshold = 0,
11
+ root,
12
+ enabled = true
13
+ } = {}) {
14
+ const [activeId, setActiveId] = react.useState(null);
15
+ const visibleEntries = react.useRef(
16
+ /* @__PURE__ */ new Map()
17
+ );
18
+ const rootEl = root?.current ?? null;
19
+ react.useEffect(() => {
20
+ if (!enabled) return;
21
+ const container = rootEl ?? document;
22
+ function resolveElements() {
23
+ let els = [];
24
+ if (ids && ids.length > 0) {
25
+ els = ids.map((id) => document.getElementById(id)).filter((el) => el !== null);
26
+ } else if (selectors) {
27
+ els = Array.from(container.querySelectorAll(selectors));
28
+ }
29
+ return els.filter((el) => el.id);
30
+ }
31
+ let intersectionObserver = null;
32
+ let mutationObserver = null;
33
+ function startObserving() {
34
+ const elements = resolveElements();
35
+ if (elements.length === 0) return false;
36
+ intersectionObserver = new IntersectionObserver(
37
+ (entries2) => {
38
+ for (const entry of entries2) {
39
+ if (entry.isIntersecting) {
40
+ visibleEntries.current.set(entry.target.id, entry);
41
+ } else {
42
+ visibleEntries.current.delete(entry.target.id);
43
+ }
44
+ }
45
+ if (visibleEntries.current.size > 0) {
46
+ let topmost = null;
47
+ let topmostTop = Infinity;
48
+ for (const [id, entry] of visibleEntries.current) {
49
+ const top = entry.boundingClientRect.top;
50
+ if (top < topmostTop) {
51
+ topmostTop = top;
52
+ topmost = id;
53
+ }
54
+ }
55
+ if (topmost) {
56
+ setActiveId(topmost);
57
+ }
58
+ }
59
+ },
60
+ {
61
+ root: rootEl,
62
+ rootMargin,
63
+ threshold
64
+ }
65
+ );
66
+ for (const el of elements) {
67
+ intersectionObserver.observe(el);
68
+ }
69
+ mutationObserver?.disconnect();
70
+ mutationObserver = null;
71
+ return true;
72
+ }
73
+ if (!startObserving()) {
74
+ const watchRoot = rootEl ?? document.body;
75
+ mutationObserver = new MutationObserver(() => {
76
+ startObserving();
77
+ });
78
+ mutationObserver.observe(watchRoot, { childList: true, subtree: true });
79
+ }
80
+ const entries = visibleEntries.current;
81
+ return () => {
82
+ mutationObserver?.disconnect();
83
+ intersectionObserver?.disconnect();
84
+ entries.clear();
85
+ };
86
+ }, [selectors, ids, rootMargin, threshold, rootEl, enabled]);
87
+ return { activeId };
88
+ }
89
+
90
+ exports.useScrollSpy = useScrollSpy;
91
+ //# sourceMappingURL=chunk-7IKLGH3Z.cjs.map
92
+ //# sourceMappingURL=chunk-7IKLGH3Z.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/hooks/useScrollSpy.ts"],"names":["useState","useRef","useEffect","entries"],"mappings":"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","file":"chunk-7IKLGH3Z.cjs","sourcesContent":["import { useEffect, useState, useRef, type RefObject } from 'react';\n\n// =============================================================================\n// Types\n// =============================================================================\n\nexport interface UseScrollSpyOptions {\n /** CSS selector for the elements to observe (e.g. 'h2, h3, h4') */\n selectors?: string;\n /** Explicit list of element IDs to observe (alternative to selectors) */\n ids?: string[];\n /** IntersectionObserver root margin (default: '0px 0px -60% 0px') */\n rootMargin?: string;\n /** IntersectionObserver threshold (default: 0) */\n threshold?: number | number[];\n /** Scroll container element ref. Defaults to document viewport. */\n root?: RefObject<HTMLElement | null>;\n /** Whether the hook is active (default: true) */\n enabled?: boolean;\n}\n\nexport interface UseScrollSpyReturn {\n /** The ID of the currently active (in-view) element */\n activeId: string | null;\n}\n\n// =============================================================================\n// Hook\n// =============================================================================\n\n/**\n * Tracks which section is currently in the viewport using IntersectionObserver.\n * Pairs naturally with `TableOfContents` to highlight the active heading.\n *\n * @example\n * ```tsx\n * function DocsPage() {\n * const { activeId } = useScrollSpy({ selectors: 'h2, h3' });\n * return (\n * <aside>\n * <TableOfContents activeId={activeId} />\n * </aside>\n * );\n * }\n * ```\n */\nexport function useScrollSpy({\n selectors,\n ids,\n rootMargin = '0px 0px -60% 0px',\n threshold = 0,\n root,\n enabled = true,\n}: UseScrollSpyOptions = {}): UseScrollSpyReturn {\n const [activeId, setActiveId] = useState<string | null>(null);\n const visibleEntries = useRef<Map<string, IntersectionObserverEntry>>(\n new Map()\n );\n\n // Track root.current so the effect re-runs when the ref attaches\n const rootEl = root?.current ?? null;\n\n useEffect(() => {\n if (!enabled) return;\n\n const container = rootEl ?? document;\n\n // Resolve target elements from the DOM\n function resolveElements(): Element[] {\n let els: Element[] = [];\n if (ids && ids.length > 0) {\n els = ids\n .map((id) => document.getElementById(id))\n .filter((el): el is HTMLElement => el !== null);\n } else if (selectors) {\n els = Array.from(container.querySelectorAll(selectors));\n }\n return els.filter((el) => el.id);\n }\n\n let intersectionObserver: IntersectionObserver | null = null;\n let mutationObserver: MutationObserver | null = null;\n\n function startObserving(): boolean {\n const elements = resolveElements();\n if (elements.length === 0) return false;\n\n intersectionObserver = new IntersectionObserver(\n (entries) => {\n for (const entry of entries) {\n if (entry.isIntersecting) {\n visibleEntries.current.set(entry.target.id, entry);\n } else {\n visibleEntries.current.delete(entry.target.id);\n }\n }\n\n // Pick the topmost visible heading (by DOM order)\n if (visibleEntries.current.size > 0) {\n let topmost: string | null = null;\n let topmostTop = Infinity;\n\n for (const [id, entry] of visibleEntries.current) {\n const top = entry.boundingClientRect.top;\n if (top < topmostTop) {\n topmostTop = top;\n topmost = id;\n }\n }\n\n if (topmost) {\n setActiveId(topmost);\n }\n }\n },\n {\n root: rootEl,\n rootMargin,\n threshold,\n }\n );\n\n for (const el of elements) {\n intersectionObserver.observe(el);\n }\n\n // Elements found — stop watching for new DOM nodes\n mutationObserver?.disconnect();\n mutationObserver = null;\n return true;\n }\n\n // If target elements don't exist yet (e.g. headings mount after ToC),\n // watch for DOM changes and retry until they appear.\n if (!startObserving()) {\n const watchRoot = rootEl ?? document.body;\n mutationObserver = new MutationObserver(() => {\n startObserving();\n });\n mutationObserver.observe(watchRoot, { childList: true, subtree: true });\n }\n\n const entries = visibleEntries.current;\n return () => {\n mutationObserver?.disconnect();\n intersectionObserver?.disconnect();\n entries.clear();\n };\n }, [selectors, ids, rootMargin, threshold, rootEl, enabled]);\n\n return { activeId };\n}\n"]}