@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,106 @@
1
+ 'use strict';
2
+
3
+ var chunkS5RVSXDV_cjs = require('./chunk-S5RVSXDV.cjs');
4
+ var React = require('react');
5
+ var jsxRuntime = require('react/jsx-runtime');
6
+
7
+ function _interopNamespace(e) {
8
+ if (e && e.__esModule) return e;
9
+ var n = Object.create(null);
10
+ if (e) {
11
+ Object.keys(e).forEach(function (k) {
12
+ if (k !== 'default') {
13
+ var d = Object.getOwnPropertyDescriptor(e, k);
14
+ Object.defineProperty(n, k, d.get ? d : {
15
+ enumerable: true,
16
+ get: function () { return e[k]; }
17
+ });
18
+ }
19
+ });
20
+ }
21
+ n.default = e;
22
+ return Object.freeze(n);
23
+ }
24
+
25
+ var React__namespace = /*#__PURE__*/_interopNamespace(React);
26
+
27
+ var Sparkline = React__namespace.forwardRef(
28
+ function Sparkline2({
29
+ data,
30
+ selectedKey,
31
+ onSelect,
32
+ label,
33
+ ariaLabel,
34
+ height = 32,
35
+ formatValue,
36
+ className,
37
+ ...props
38
+ }, ref) {
39
+ const max = React__namespace.useMemo(
40
+ () => Math.max(1, ...data.map((d) => d.value)),
41
+ [data]
42
+ );
43
+ const interactive = Boolean(onSelect);
44
+ return /* @__PURE__ */ jsxRuntime.jsxs(
45
+ "div",
46
+ {
47
+ ref,
48
+ className: chunkS5RVSXDV_cjs.cn("flex items-end gap-3", className),
49
+ ...props,
50
+ children: [
51
+ label && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-muted-foreground w-16 shrink-0 pb-0.5 text-[10px] leading-tight font-medium tracking-wider uppercase", children: label }),
52
+ /* @__PURE__ */ jsxRuntime.jsx(
53
+ "div",
54
+ {
55
+ className: "flex flex-1 items-end gap-[2px]",
56
+ style: { height },
57
+ role: "group",
58
+ "aria-label": ariaLabel ?? label ?? "Activity over time",
59
+ children: data.map((point) => {
60
+ const heightPct = point.value === 0 ? 6 : Math.max(12, Math.round(point.value / max * 100));
61
+ const isSelected = selectedKey === point.key;
62
+ const display = point.label ?? point.key;
63
+ const valueText = formatValue ? formatValue(point) : String(point.value);
64
+ const title = `${display} \u2014 ${valueText}`;
65
+ const barClasses = chunkS5RVSXDV_cjs.cn(
66
+ "min-w-[3px] flex-1 rounded-sm transition-colors",
67
+ isSelected ? "bg-primary-500 hover:bg-primary-500/90" : point.value > 0 ? "bg-primary-500/40 hover:bg-primary-500/70" : "bg-muted hover:bg-muted-foreground/20"
68
+ );
69
+ return interactive ? /* @__PURE__ */ jsxRuntime.jsx(
70
+ "button",
71
+ {
72
+ type: "button",
73
+ onClick: () => onSelect?.(isSelected ? null : point.key),
74
+ "aria-pressed": isSelected,
75
+ title,
76
+ "aria-label": title,
77
+ className: chunkS5RVSXDV_cjs.cn(
78
+ barClasses,
79
+ "focus-visible:ring-ring cursor-pointer focus-visible:ring-2 focus-visible:ring-offset-1 focus-visible:outline-none"
80
+ ),
81
+ style: { height: `${heightPct}%` }
82
+ },
83
+ point.key
84
+ ) : /* @__PURE__ */ jsxRuntime.jsx(
85
+ "span",
86
+ {
87
+ role: "img",
88
+ title,
89
+ "aria-label": title,
90
+ className: barClasses,
91
+ style: { height: `${heightPct}%` }
92
+ },
93
+ point.key
94
+ );
95
+ })
96
+ }
97
+ )
98
+ ]
99
+ }
100
+ );
101
+ }
102
+ );
103
+
104
+ exports.Sparkline = Sparkline;
105
+ //# sourceMappingURL=chunk-7RV6CAP6.cjs.map
106
+ //# sourceMappingURL=chunk-7RV6CAP6.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/Sparkline/Sparkline.tsx"],"names":["React","Sparkline","jsxs","cn","jsx"],"mappings":"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","file":"chunk-7RV6CAP6.cjs","sourcesContent":["'use client';\n\nimport * as React from 'react';\nimport { cn } from '../../utils/cn';\n\n// =============================================================================\n// Types\n// =============================================================================\n\nexport interface SparklinePoint {\n /** Stable key for selection (e.g. a day key like \"2026-08-22\"). */\n key: string;\n /** Human label for tooltips and accessible names (defaults to key). */\n label?: string;\n value: number;\n}\n\nexport interface SparklineProps extends Omit<\n React.HTMLAttributes<HTMLDivElement>,\n 'onSelect'\n> {\n /** Pre-bucketed points in display order (e.g. one per day). */\n data: SparklinePoint[];\n /** Selected point key — that bar is highlighted. */\n selectedKey?: string | null;\n /**\n * Makes bars clickable; clicking the selected bar reports `null`\n * (deselect). Omit for a read-only sparkline.\n */\n onSelect?: (key: string | null) => void;\n /** Track label rendered before the bars (e.g. \"All activity\"). */\n label?: string;\n /**\n * Accessible name for the bar group. Defaults to the visible `label`\n * (so multiple tracks stay distinguishable), else \"Activity over time\".\n */\n ariaLabel?: string;\n /** Bar track height in px (default 32). */\n height?: number;\n /** Formats the value for tooltips/accessible names (default `String`). */\n formatValue?: (point: SparklinePoint) => string;\n}\n\n// =============================================================================\n// Sparkline\n// =============================================================================\n\n/**\n * A compact bar sparkline for activity-over-time strips — timelines,\n * table rows, dashboard headers. Bars scale to the series maximum;\n * zero-value bars render as a low baseline stub. With `onSelect`, bars\n * become toggle buttons for filtering the view to one bucket.\n *\n * Data arrives pre-bucketed (the host owns date math), keeping the\n * component pure. For full charting, reach for DataVis instead.\n *\n * @example\n * ```tsx\n * <Sparkline\n * label=\"All activity\"\n * data={days.map((d) => ({ key: d.iso, label: d.pretty, value: d.count }))}\n * selectedKey={day}\n * onSelect={setDay}\n * />\n * ```\n */\nexport const Sparkline = React.forwardRef<HTMLDivElement, SparklineProps>(\n function Sparkline(\n {\n data,\n selectedKey,\n onSelect,\n label,\n ariaLabel,\n height = 32,\n formatValue,\n className,\n ...props\n },\n ref\n ) {\n const max = React.useMemo(\n () => Math.max(1, ...data.map((d) => d.value)),\n [data]\n );\n\n const interactive = Boolean(onSelect);\n\n return (\n <div\n ref={ref}\n className={cn('flex items-end gap-3', className)}\n {...props}\n >\n {label && (\n <span className=\"text-muted-foreground w-16 shrink-0 pb-0.5 text-[10px] leading-tight font-medium tracking-wider uppercase\">\n {label}\n </span>\n )}\n <div\n className=\"flex flex-1 items-end gap-[2px]\"\n style={{ height }}\n role=\"group\"\n aria-label={ariaLabel ?? label ?? 'Activity over time'}\n >\n {data.map((point) => {\n const heightPct =\n point.value === 0\n ? 6\n : Math.max(12, Math.round((point.value / max) * 100));\n const isSelected = selectedKey === point.key;\n const display = point.label ?? point.key;\n const valueText = formatValue\n ? formatValue(point)\n : String(point.value);\n const title = `${display} — ${valueText}`;\n\n const barClasses = cn(\n 'min-w-[3px] flex-1 rounded-sm transition-colors',\n isSelected\n ? 'bg-primary-500 hover:bg-primary-500/90'\n : point.value > 0\n ? 'bg-primary-500/40 hover:bg-primary-500/70'\n : 'bg-muted hover:bg-muted-foreground/20'\n );\n\n return interactive ? (\n <button\n key={point.key}\n type=\"button\"\n onClick={() => onSelect?.(isSelected ? null : point.key)}\n aria-pressed={isSelected}\n title={title}\n aria-label={title}\n className={cn(\n barClasses,\n 'focus-visible:ring-ring cursor-pointer focus-visible:ring-2 focus-visible:ring-offset-1 focus-visible:outline-none'\n )}\n style={{ height: `${heightPct}%` }}\n />\n ) : (\n <span\n key={point.key}\n role=\"img\"\n title={title}\n aria-label={title}\n className={barClasses}\n style={{ height: `${heightPct}%` }}\n />\n );\n })}\n </div>\n </div>\n );\n }\n);\n"]}
@@ -0,0 +1,230 @@
1
+ 'use strict';
2
+
3
+ var chunkFHY3K6PL_cjs = require('./chunk-FHY3K6PL.cjs');
4
+ var chunkAOHJILLU_cjs = require('./chunk-AOHJILLU.cjs');
5
+ var chunkS5RVSXDV_cjs = require('./chunk-S5RVSXDV.cjs');
6
+ var React = require('react');
7
+ var reactDom = require('react-dom');
8
+ var jsxRuntime = require('react/jsx-runtime');
9
+
10
+ function _interopNamespace(e) {
11
+ if (e && e.__esModule) return e;
12
+ var n = Object.create(null);
13
+ if (e) {
14
+ Object.keys(e).forEach(function (k) {
15
+ if (k !== 'default') {
16
+ var d = Object.getOwnPropertyDescriptor(e, k);
17
+ Object.defineProperty(n, k, d.get ? d : {
18
+ enumerable: true,
19
+ get: function () { return e[k]; }
20
+ });
21
+ }
22
+ });
23
+ }
24
+ n.default = e;
25
+ return Object.freeze(n);
26
+ }
27
+
28
+ var React__namespace = /*#__PURE__*/_interopNamespace(React);
29
+
30
+ var HIDE_GRACE_MS = 180;
31
+ function SourceTip({
32
+ heading,
33
+ note,
34
+ sources,
35
+ eyebrow = "Source",
36
+ children,
37
+ className,
38
+ underline = false
39
+ }) {
40
+ const [open, setOpen] = React__namespace.useState(false);
41
+ const [pinned, setPinned] = React__namespace.useState(false);
42
+ const timer = React__namespace.useRef(null);
43
+ const suppressFocusShow = React__namespace.useRef(false);
44
+ const { anchorRef, floatingRef, style } = chunkAOHJILLU_cjs.useAnchoredPosition({
45
+ open,
46
+ placement: "top",
47
+ offset: 10,
48
+ viewportPadding: 8,
49
+ allowFlip: true
50
+ });
51
+ const clearHideTimer = () => {
52
+ if (timer.current) {
53
+ clearTimeout(timer.current);
54
+ timer.current = null;
55
+ }
56
+ };
57
+ const show = React__namespace.useCallback(() => {
58
+ clearHideTimer();
59
+ setOpen(true);
60
+ }, []);
61
+ const scheduleHide = React__namespace.useCallback(() => {
62
+ if (pinned) return;
63
+ clearHideTimer();
64
+ timer.current = setTimeout(() => setOpen(false), HIDE_GRACE_MS);
65
+ }, [pinned]);
66
+ const close = React__namespace.useCallback(() => {
67
+ clearHideTimer();
68
+ setPinned(false);
69
+ setOpen(false);
70
+ if (floatingRef.current?.contains(document.activeElement)) {
71
+ suppressFocusShow.current = true;
72
+ anchorRef.current?.focus();
73
+ }
74
+ }, [anchorRef, floatingRef]);
75
+ React__namespace.useEffect(() => () => clearHideTimer(), []);
76
+ React__namespace.useEffect(() => {
77
+ if (pinned) floatingRef.current?.focus();
78
+ }, [pinned, floatingRef]);
79
+ chunkFHY3K6PL_cjs.useEscapeKey(close, open);
80
+ React__namespace.useEffect(() => {
81
+ if (!open || !pinned) return;
82
+ const onPointer = (e) => {
83
+ const t = e.target;
84
+ if (anchorRef.current?.contains(t) || floatingRef.current?.contains(t))
85
+ return;
86
+ close();
87
+ };
88
+ document.addEventListener("mousedown", onPointer);
89
+ document.addEventListener("touchstart", onPointer);
90
+ return () => {
91
+ document.removeEventListener("mousedown", onPointer);
92
+ document.removeEventListener("touchstart", onPointer);
93
+ };
94
+ }, [open, pinned, close, anchorRef, floatingRef]);
95
+ const onTriggerClick = () => {
96
+ const coarse = typeof window !== "undefined" && window.matchMedia("(hover: none)").matches;
97
+ if (!coarse) return;
98
+ togglePin();
99
+ };
100
+ const togglePin = () => {
101
+ if (pinned) close();
102
+ else {
103
+ setPinned(true);
104
+ show();
105
+ }
106
+ };
107
+ const onTriggerKeyDown = (e) => {
108
+ if (e.key === "Enter" || e.key === " ") {
109
+ e.preventDefault();
110
+ togglePin();
111
+ }
112
+ };
113
+ const onDialogKeyDown = (e) => {
114
+ if (e.target !== e.currentTarget) return;
115
+ if (e.key === "Enter" || e.key === " ") {
116
+ e.preventDefault();
117
+ close();
118
+ }
119
+ };
120
+ const onTriggerFocus = () => {
121
+ if (suppressFocusShow.current) {
122
+ suppressFocusShow.current = false;
123
+ return;
124
+ }
125
+ show();
126
+ };
127
+ const onBlurCapture = (e) => {
128
+ const next = e.relatedTarget;
129
+ if (next && (anchorRef.current?.contains(next) || floatingRef.current?.contains(next)))
130
+ return;
131
+ scheduleHide();
132
+ };
133
+ const hasSources = Boolean(sources && sources.length > 0);
134
+ return /* @__PURE__ */ jsxRuntime.jsxs(
135
+ "span",
136
+ {
137
+ ref: anchorRef,
138
+ className: chunkS5RVSXDV_cjs.cn(
139
+ "cursor-help",
140
+ underline && "decoration-primary-400/70 underline decoration-dashed underline-offset-4",
141
+ className
142
+ ),
143
+ onMouseEnter: show,
144
+ onMouseLeave: scheduleHide,
145
+ onFocus: onTriggerFocus,
146
+ onBlur: onBlurCapture,
147
+ onClick: onTriggerClick,
148
+ onKeyDown: onTriggerKeyDown,
149
+ tabIndex: 0,
150
+ role: "button",
151
+ "aria-haspopup": "dialog",
152
+ "aria-expanded": open,
153
+ "aria-label": `${heading} \u2014 show source`,
154
+ children: [
155
+ children,
156
+ open && reactDom.createPortal(
157
+ /* 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 */
158
+ /* @__PURE__ */ jsxRuntime.jsx(
159
+ "span",
160
+ {
161
+ ref: floatingRef,
162
+ role: "dialog",
163
+ "aria-label": heading,
164
+ tabIndex: -1,
165
+ onMouseEnter: show,
166
+ onMouseLeave: scheduleHide,
167
+ onBlurCapture,
168
+ onKeyDown: onDialogKeyDown,
169
+ className: "focus-visible:ring-ring z-50 block w-80 rounded-lg outline-none focus-visible:ring-2",
170
+ style,
171
+ children: /* @__PURE__ */ jsxRuntime.jsxs("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", children: [
172
+ /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "from-primary-700 to-primary-600 block bg-gradient-to-br px-3.5 py-2.5", children: [
173
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-primary-100/90 block text-[10px] font-bold tracking-wide uppercase", children: eyebrow }),
174
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "mt-0.5 block text-sm leading-snug font-semibold text-white", children: heading })
175
+ ] }),
176
+ (note || hasSources) && /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "block px-3.5 py-2.5", children: [
177
+ note && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-muted-foreground block text-[13px] leading-relaxed", children: note }),
178
+ hasSources && /* @__PURE__ */ jsxRuntime.jsxs(
179
+ "span",
180
+ {
181
+ className: chunkS5RVSXDV_cjs.cn(
182
+ "block",
183
+ note && "border-border mt-2.5 border-t border-dashed pt-2.5"
184
+ ),
185
+ children: [
186
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-muted-foreground block text-[10px] font-bold tracking-wide uppercase", children: sources.length === 1 ? "Source" : `${sources.length} sources` }),
187
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "block max-h-52 overflow-y-auto", children: sources.map((s, i) => /* @__PURE__ */ jsxRuntime.jsxs(
188
+ "span",
189
+ {
190
+ className: "mt-1.5 flex items-center gap-2",
191
+ children: [
192
+ /* @__PURE__ */ jsxRuntime.jsx(
193
+ "span",
194
+ {
195
+ "aria-hidden": "true",
196
+ className: "bg-primary-400 h-1.5 w-1.5 shrink-0 rounded-full"
197
+ }
198
+ ),
199
+ s.url ? /* @__PURE__ */ jsxRuntime.jsx(
200
+ "a",
201
+ {
202
+ href: s.url,
203
+ target: "_blank",
204
+ rel: "noopener noreferrer",
205
+ className: "text-primary-600 hover:text-primary-500 dark:text-primary-400 dark:hover:text-primary-300 min-w-0 flex-1 truncate text-xs font-semibold",
206
+ children: s.label
207
+ }
208
+ ) : /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-muted-foreground min-w-0 flex-1 truncate text-xs", children: s.label }),
209
+ s.sub && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-muted-foreground/70 shrink-0 text-[11px]", children: s.sub })
210
+ ]
211
+ },
212
+ `${s.label}-${i}`
213
+ )) })
214
+ ]
215
+ }
216
+ )
217
+ ] })
218
+ ] })
219
+ }
220
+ ),
221
+ document.body
222
+ )
223
+ ]
224
+ }
225
+ );
226
+ }
227
+
228
+ exports.SourceTip = SourceTip;
229
+ //# sourceMappingURL=chunk-AHHFFXJR.cjs.map
230
+ //# sourceMappingURL=chunk-AHHFFXJR.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/SourceTip/SourceTip.tsx"],"names":["React","useAnchoredPosition","useEscapeKey","jsxs","cn","createPortal","jsx"],"mappings":"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","file":"chunk-AHHFFXJR.cjs","sourcesContent":["'use client';\n\nimport * as React from 'react';\nimport { createPortal } from 'react-dom';\nimport { cn } from '../../utils/cn';\nimport { useAnchoredPosition } from '../../hooks/useAnchoredPosition';\nimport { useEscapeKey } from '../../hooks/useEscapeKey';\n\n// =============================================================================\n// Types\n// =============================================================================\n\n/** One line of provenance shown in the card. */\nexport interface TipSource {\n /** One-line label — statute name or source title. Truncated on render. */\n label: string;\n /** Source URL. Omit for a provenance line that isn't linkable. */\n url?: string;\n /** Secondary label shown at the end (publisher / host / year). */\n sub?: string;\n}\n\nexport interface SourceTipProps {\n /** The claim this card explains — the card's heading. */\n heading: string;\n /** Free-text provenance, for facts no public URL can verify. */\n note?: string;\n /** Linked (or unlinked) one-line sources. */\n sources?: TipSource[];\n /** Eyebrow above the heading. Defaults to \"Source\". */\n eyebrow?: string;\n /** The visible trigger. */\n children: React.ReactNode;\n className?: string;\n /**\n * Underline the trigger with a dashed rule marking a hoverable claim.\n * Leave off in table cells, which signal hoverability by their own\n * treatment rather than by underlining every cell.\n */\n underline?: boolean;\n}\n\nconst HIDE_GRACE_MS = 180;\n\n// =============================================================================\n// SourceTip\n// =============================================================================\n\n/**\n * A hover card answering \"what backs this claim?\" — an eyebrow + heading,\n * optional free-text provenance, and a list of one-line source links.\n * Suits stat tiles, table cells, and inline facts where a numbered footnote\n * would be overkill.\n *\n * The trigger and card are phrasing content (`span`/`a` only), so it is\n * valid inside `<p>` prose and table cells. The card portals to `body` with\n * fixed positioning, flipping and clamping to stay in the viewport. On\n * touch, a tap pins the card; Escape or an outside tap closes it. A pinned\n * card behaves as a non-modal dialog — focus moves into it so its source\n * links are keyboard-reachable, and returns to the trigger on close.\n *\n * @example\n * ```tsx\n * <SourceTip\n * heading=\"OSHA recordable rate\"\n * sources={[{ label: 'BLS SOII 2023', url: 'https://www.bls.gov/iif/', sub: 'BLS' }]}\n * underline\n * >\n * 2.4 per 100 FTE\n * </SourceTip>\n * ```\n */\nexport function SourceTip({\n heading,\n note,\n sources,\n eyebrow = 'Source',\n children,\n className,\n underline = false,\n}: SourceTipProps) {\n const [open, setOpen] = React.useState(false);\n const [pinned, setPinned] = React.useState(false);\n const timer = React.useRef<ReturnType<typeof setTimeout> | null>(null);\n // True while close() restores focus to the trigger, so the trigger's\n // focus-show doesn't immediately reopen a card the user just dismissed.\n const suppressFocusShow = React.useRef(false);\n\n const { anchorRef, floatingRef, style } = useAnchoredPosition<\n HTMLSpanElement,\n HTMLSpanElement\n >({\n open,\n placement: 'top',\n offset: 10,\n viewportPadding: 8,\n allowFlip: true,\n });\n\n const clearHideTimer = () => {\n if (timer.current) {\n clearTimeout(timer.current);\n timer.current = null;\n }\n };\n\n const show = React.useCallback(() => {\n clearHideTimer();\n setOpen(true);\n }, []);\n\n const scheduleHide = React.useCallback(() => {\n if (pinned) return;\n clearHideTimer();\n timer.current = setTimeout(() => setOpen(false), HIDE_GRACE_MS);\n }, [pinned]);\n\n const close = React.useCallback(() => {\n clearHideTimer();\n setPinned(false);\n setOpen(false);\n // Return focus to the trigger if it was inside the card.\n if (floatingRef.current?.contains(document.activeElement)) {\n suppressFocusShow.current = true;\n anchorRef.current?.focus();\n }\n }, [anchorRef, floatingRef]);\n\n React.useEffect(() => () => clearHideTimer(), []);\n\n // A pinned card is a non-modal dialog: move focus into it so its links\n // are reachable by keyboard.\n React.useEffect(() => {\n if (pinned) floatingRef.current?.focus();\n }, [pinned, floatingRef]);\n\n useEscapeKey(close, open);\n\n // Pinned cards close on an outside tap; hover cards close on their own.\n React.useEffect(() => {\n if (!open || !pinned) return;\n const onPointer = (e: Event) => {\n const t = e.target as Node;\n if (anchorRef.current?.contains(t) || floatingRef.current?.contains(t))\n return;\n close();\n };\n document.addEventListener('mousedown', onPointer);\n document.addEventListener('touchstart', onPointer);\n return () => {\n document.removeEventListener('mousedown', onPointer);\n document.removeEventListener('touchstart', onPointer);\n };\n }, [open, pinned, close, anchorRef, floatingRef]);\n\n // Touch has no hover: tap pins the card instead of falling through.\n const onTriggerClick = () => {\n const coarse =\n typeof window !== 'undefined' &&\n window.matchMedia('(hover: none)').matches;\n if (!coarse) return;\n togglePin();\n };\n\n const togglePin = () => {\n if (pinned) close();\n else {\n setPinned(true);\n show();\n }\n };\n\n const onTriggerKeyDown = (e: React.KeyboardEvent<HTMLSpanElement>) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n togglePin();\n }\n };\n\n // Focus lives on the dialog container once pinned, so Enter/Space there\n // (not on a link inside) must also unpin — the trigger no longer has focus.\n const onDialogKeyDown = (e: React.KeyboardEvent<HTMLSpanElement>) => {\n if (e.target !== e.currentTarget) return;\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n close();\n }\n };\n\n const onTriggerFocus = () => {\n if (suppressFocusShow.current) {\n suppressFocusShow.current = false;\n return;\n }\n show();\n };\n\n const onBlurCapture = (e: React.FocusEvent<HTMLSpanElement>) => {\n const next = e.relatedTarget as Node | null;\n if (\n next &&\n (anchorRef.current?.contains(next) || floatingRef.current?.contains(next))\n )\n return;\n scheduleHide();\n };\n\n const hasSources = Boolean(sources && sources.length > 0);\n\n return (\n <span\n ref={anchorRef}\n className={cn(\n 'cursor-help',\n underline &&\n 'decoration-primary-400/70 underline decoration-dashed underline-offset-4',\n className\n )}\n onMouseEnter={show}\n onMouseLeave={scheduleHide}\n onFocus={onTriggerFocus}\n onBlur={onBlurCapture}\n onClick={onTriggerClick}\n onKeyDown={onTriggerKeyDown}\n tabIndex={0}\n role=\"button\"\n aria-haspopup=\"dialog\"\n aria-expanded={open}\n aria-label={`${heading} — show source`}\n >\n {children}\n {open &&\n createPortal(\n /* eslint-disable-next-line jsx-a11y/no-noninteractive-element-interactions -- keyboard dismissal on a focused non-modal dialog container is the WAI-ARIA pattern; links inside keep their own semantics */\n <span\n ref={floatingRef}\n role=\"dialog\"\n aria-label={heading}\n tabIndex={-1}\n onMouseEnter={show}\n onMouseLeave={scheduleHide}\n onBlurCapture={onBlurCapture}\n onKeyDown={onDialogKeyDown}\n className=\"focus-visible:ring-ring z-50 block w-80 rounded-lg outline-none focus-visible:ring-2\"\n style={style}\n >\n <span className=\"border-border bg-card block overflow-hidden rounded-lg border text-start font-normal tracking-normal normal-case shadow-xl ring-1 ring-black/5 dark:ring-white/10\">\n <span className=\"from-primary-700 to-primary-600 block bg-gradient-to-br px-3.5 py-2.5\">\n <span className=\"text-primary-100/90 block text-[10px] font-bold tracking-wide uppercase\">\n {eyebrow}\n </span>\n <span className=\"mt-0.5 block text-sm leading-snug font-semibold text-white\">\n {heading}\n </span>\n </span>\n\n {(note || hasSources) && (\n <span className=\"block px-3.5 py-2.5\">\n {note && (\n <span className=\"text-muted-foreground block text-[13px] leading-relaxed\">\n {note}\n </span>\n )}\n {hasSources && (\n <span\n className={cn(\n 'block',\n note &&\n 'border-border mt-2.5 border-t border-dashed pt-2.5'\n )}\n >\n <span className=\"text-muted-foreground block text-[10px] font-bold tracking-wide uppercase\">\n {sources!.length === 1\n ? 'Source'\n : `${sources!.length} sources`}\n </span>\n <span className=\"block max-h-52 overflow-y-auto\">\n {sources!.map((s, i) => (\n <span\n key={`${s.label}-${i}`}\n className=\"mt-1.5 flex items-center gap-2\"\n >\n <span\n aria-hidden=\"true\"\n className=\"bg-primary-400 h-1.5 w-1.5 shrink-0 rounded-full\"\n />\n {s.url ? (\n <a\n href={s.url}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"text-primary-600 hover:text-primary-500 dark:text-primary-400 dark:hover:text-primary-300 min-w-0 flex-1 truncate text-xs font-semibold\"\n >\n {s.label}\n </a>\n ) : (\n <span className=\"text-muted-foreground min-w-0 flex-1 truncate text-xs\">\n {s.label}\n </span>\n )}\n {s.sub && (\n <span className=\"text-muted-foreground/70 shrink-0 text-[11px]\">\n {s.sub}\n </span>\n )}\n </span>\n ))}\n </span>\n </span>\n )}\n </span>\n )}\n </span>\n </span>,\n document.body\n )}\n </span>\n );\n}\n"]}
@@ -1,10 +1,11 @@
1
- import { inputVariants } from './chunk-YXCE2HSK.js';
1
+ import { inputVariants } from './chunk-3IMM2PM4.js';
2
2
  import { useEscapeKey } from './chunk-T4ME7QCT.js';
3
3
  import { useClickOutside } from './chunk-62ZOA6PX.js';
4
- import { useAnchoredPosition } from './chunk-BOOJDRJO.js';
4
+ import { useAnchoredPosition } from './chunk-WSNMQQ4P.js';
5
5
  import { cn } from './chunk-TQONQSJO.js';
6
6
  import * as React from 'react';
7
7
  import { createPortal } from 'react-dom';
8
+ import { ChevronRight } from 'lucide-react';
8
9
  import { jsxs, jsx, Fragment } from 'react/jsx-runtime';
9
10
 
10
11
  var placementOffset = 8;
@@ -116,6 +117,20 @@ function filterDropdownChildren(children, query) {
116
117
  ].filter(Boolean).join(" ").toLowerCase();
117
118
  return searchText.includes(normalizedQuery) ? child : null;
118
119
  }
120
+ if (isDropdownElement(child, DropdownSubmenu)) {
121
+ const searchText = [
122
+ getNodeText(child.props.label),
123
+ child.props.searchText
124
+ ].filter(Boolean).join(" ").toLowerCase();
125
+ if (searchText.includes(normalizedQuery)) {
126
+ return child;
127
+ }
128
+ const submenuChildren = filterDropdownChildren(
129
+ child.props.children,
130
+ normalizedQuery
131
+ );
132
+ return hasVisibleDropdownContent(submenuChildren) ? React.cloneElement(child, void 0, submenuChildren) : null;
133
+ }
119
134
  if (isDropdownElement(child, DropdownContent)) {
120
135
  const contentChildren = filterDropdownChildren(
121
136
  child.props.children,
@@ -180,6 +195,7 @@ function Dropdown({
180
195
  const [uncontrolledOpen, setUncontrolledOpen] = React.useState(false);
181
196
  const [uncontrolledSelectedValues, setUncontrolledSelectedValues] = React.useState(defaultSelectedValues);
182
197
  const [searchQuery, setSearchQuery] = React.useState("");
198
+ const [extraOutsideRefs, setExtraOutsideRefs] = React.useState([]);
183
199
  const containerRef = React.useRef(null);
184
200
  const searchInputRef = React.useRef(null);
185
201
  const menuId = React.useId();
@@ -224,13 +240,21 @@ function Dropdown({
224
240
  },
225
241
  [multiSelect, selectedValues, setSelectedValues]
226
242
  );
243
+ const registerOutsideRef = React.useCallback(
244
+ (ref) => {
245
+ setExtraOutsideRefs((prev) => [...prev, ref]);
246
+ return () => setExtraOutsideRefs((prev) => prev.filter((r) => r !== ref));
247
+ },
248
+ []
249
+ );
227
250
  const dropdownContext = React.useMemo(
228
251
  () => ({
229
252
  multiSelect,
230
253
  selectedValues,
231
- toggleSelectedValue
254
+ toggleSelectedValue,
255
+ registerOutsideRef
232
256
  }),
233
- [multiSelect, selectedValues, toggleSelectedValue]
257
+ [multiSelect, selectedValues, toggleSelectedValue, registerOutsideRef]
234
258
  );
235
259
  useEscapeKey(handleClose, isOpen);
236
260
  const { anchorRef, floatingRef, style } = useAnchoredPosition({
@@ -240,8 +264,8 @@ function Dropdown({
240
264
  matchMinWidth: width === "trigger"
241
265
  });
242
266
  const outsideRefs = React.useMemo(
243
- () => [containerRef, floatingRef],
244
- [floatingRef]
267
+ () => [containerRef, floatingRef, ...extraOutsideRefs],
268
+ [floatingRef, extraOutsideRefs]
245
269
  );
246
270
  useClickOutside(outsideRefs, handleClose, isOpen);
247
271
  React.useEffect(() => {
@@ -574,6 +598,141 @@ var DropdownItem = React.forwardRef(
574
598
  }
575
599
  );
576
600
  DropdownItem.displayName = "DropdownItem";
601
+ var submenuCloseDelay = 150;
602
+ function DropdownSubmenu({
603
+ label,
604
+ icon,
605
+ disabled = false,
606
+ className,
607
+ children
608
+ }) {
609
+ const [open, setOpen] = React.useState(false);
610
+ const menuId = React.useId();
611
+ const dropdownContext = React.useContext(DropdownContext);
612
+ const closeTimer = React.useRef(
613
+ void 0
614
+ );
615
+ const { anchorRef, floatingRef, style } = useAnchoredPosition({ open, placement: "right-start", offset: 4 });
616
+ const registerOutsideRef = dropdownContext?.registerOutsideRef;
617
+ React.useLayoutEffect(() => {
618
+ if (!open || !registerOutsideRef) return;
619
+ return registerOutsideRef(floatingRef);
620
+ }, [open, registerOutsideRef, floatingRef]);
621
+ React.useEffect(() => () => clearTimeout(closeTimer.current), []);
622
+ const cancelClose = () => clearTimeout(closeTimer.current);
623
+ const openNow = () => {
624
+ if (disabled) return;
625
+ cancelClose();
626
+ setOpen(true);
627
+ };
628
+ const scheduleClose = () => {
629
+ cancelClose();
630
+ closeTimer.current = setTimeout(() => setOpen(false), submenuCloseDelay);
631
+ };
632
+ const closeAndRefocus = () => {
633
+ cancelClose();
634
+ setOpen(false);
635
+ anchorRef.current?.focus();
636
+ };
637
+ const focusFirstItem = () => {
638
+ requestAnimationFrame(() => {
639
+ floatingRef.current?.querySelector('[data-slot="dropdown-item"]')?.focus();
640
+ });
641
+ };
642
+ return /* @__PURE__ */ jsxs(Fragment, { children: [
643
+ /* @__PURE__ */ jsxs(
644
+ "button",
645
+ {
646
+ ref: anchorRef,
647
+ type: "button",
648
+ role: "menuitem",
649
+ disabled,
650
+ "aria-haspopup": "menu",
651
+ "aria-expanded": open,
652
+ "aria-controls": open ? menuId : void 0,
653
+ "data-slot": "dropdown-submenu-trigger",
654
+ className: cn(
655
+ "flex w-full items-center gap-3 rounded-lg px-3 py-2 text-start text-sm",
656
+ "transition-colors duration-150",
657
+ "focus:outline-none",
658
+ "text-neutral-700 dark:text-neutral-300",
659
+ "hover:bg-neutral-100 dark:hover:bg-neutral-700",
660
+ "focus:bg-neutral-100 dark:focus:bg-neutral-700",
661
+ open && "bg-neutral-100 dark:bg-neutral-700",
662
+ className
663
+ ),
664
+ onPointerEnter: (event) => {
665
+ if (event.pointerType === "mouse") openNow();
666
+ },
667
+ onPointerLeave: (event) => {
668
+ if (event.pointerType === "mouse") scheduleClose();
669
+ },
670
+ onClick: (event) => {
671
+ openNow();
672
+ if (event.detail === 0) focusFirstItem();
673
+ },
674
+ onKeyDown: (event) => {
675
+ if (event.key === "ArrowRight") {
676
+ event.preventDefault();
677
+ openNow();
678
+ focusFirstItem();
679
+ } else if (open && (event.key === "ArrowLeft" || event.key === "Escape")) {
680
+ event.preventDefault();
681
+ event.stopPropagation();
682
+ closeAndRefocus();
683
+ }
684
+ },
685
+ children: [
686
+ icon && /* @__PURE__ */ jsx("span", { className: "h-4 w-4 shrink-0", "data-slot": "dropdown-item-icon", children: icon }),
687
+ /* @__PURE__ */ jsx("span", { className: "flex-1 font-medium", "data-slot": "dropdown-item-label", children: label }),
688
+ /* @__PURE__ */ jsx(
689
+ ChevronRight,
690
+ {
691
+ size: 16,
692
+ "aria-hidden": "true",
693
+ className: "shrink-0 text-neutral-400"
694
+ }
695
+ )
696
+ ]
697
+ }
698
+ ),
699
+ open && createPortal(
700
+ /* @__PURE__ */ jsx(
701
+ "div",
702
+ {
703
+ ref: floatingRef,
704
+ style,
705
+ id: menuId,
706
+ role: "menu",
707
+ tabIndex: -1,
708
+ "data-slot": "dropdown-submenu",
709
+ className: cn(
710
+ // min() keeps the preferred width from beating the hook's
711
+ // maxWidth viewport clamp on very narrow screens.
712
+ "flex min-w-[min(10rem,calc(100vw-1rem))] flex-col overflow-hidden",
713
+ "rounded-xl border border-neutral-200 bg-white shadow-lg",
714
+ "dark:border-neutral-700 dark:bg-neutral-800",
715
+ "animate-in fade-in zoom-in-95 duration-100"
716
+ ),
717
+ onPointerEnter: cancelClose,
718
+ onPointerLeave: (event) => {
719
+ if (event.pointerType === "mouse") scheduleClose();
720
+ },
721
+ onKeyDown: (event) => {
722
+ if (event.key === "ArrowLeft" || event.key === "Escape") {
723
+ event.preventDefault();
724
+ event.stopPropagation();
725
+ closeAndRefocus();
726
+ }
727
+ },
728
+ children: /* @__PURE__ */ jsx("div", { className: "min-h-0 overflow-y-auto", children })
729
+ }
730
+ ),
731
+ document.body
732
+ )
733
+ ] });
734
+ }
735
+ DropdownSubmenu.displayName = "DropdownSubmenu";
577
736
  function DropdownSeparator({ className }) {
578
737
  return /* @__PURE__ */ jsx(
579
738
  "hr",
@@ -606,6 +765,6 @@ function DropdownLabel({
606
765
  }
607
766
  DropdownLabel.displayName = "DropdownLabel";
608
767
 
609
- export { Dropdown, DropdownContent, DropdownHeader, DropdownItem, DropdownLabel, DropdownSeparator };
610
- //# sourceMappingURL=chunk-HIDV32ZX.js.map
611
- //# sourceMappingURL=chunk-HIDV32ZX.js.map
768
+ export { Dropdown, DropdownContent, DropdownHeader, DropdownItem, DropdownLabel, DropdownSeparator, DropdownSubmenu };
769
+ //# sourceMappingURL=chunk-AHUYW673.js.map
770
+ //# sourceMappingURL=chunk-AHUYW673.js.map