@tribepad/themis 1.0.0

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 (654) hide show
  1. package/CHANGELOG.md +17 -0
  2. package/LICENSE +21 -0
  3. package/README.md +114 -0
  4. package/dist/Carousel-NTZX5TOW.js +16 -0
  5. package/dist/Carousel-NTZX5TOW.js.map +1 -0
  6. package/dist/Carousel-YH3DOQJU.mjs +7 -0
  7. package/dist/Carousel-YH3DOQJU.mjs.map +1 -0
  8. package/dist/chunk-2HIUTHMU.mjs +234 -0
  9. package/dist/chunk-2HIUTHMU.mjs.map +1 -0
  10. package/dist/chunk-34GTFTDO.js +431 -0
  11. package/dist/chunk-34GTFTDO.js.map +1 -0
  12. package/dist/chunk-3H7ASYR7.js +250 -0
  13. package/dist/chunk-3H7ASYR7.js.map +1 -0
  14. package/dist/chunk-3IEN7JOP.js +316 -0
  15. package/dist/chunk-3IEN7JOP.js.map +1 -0
  16. package/dist/chunk-3JHN4GAL.js +326 -0
  17. package/dist/chunk-3JHN4GAL.js.map +1 -0
  18. package/dist/chunk-3MJPASQU.js +232 -0
  19. package/dist/chunk-3MJPASQU.js.map +1 -0
  20. package/dist/chunk-3XD2JUL3.js +572 -0
  21. package/dist/chunk-3XD2JUL3.js.map +1 -0
  22. package/dist/chunk-3YOY2VJ6.js +189 -0
  23. package/dist/chunk-3YOY2VJ6.js.map +1 -0
  24. package/dist/chunk-4DU5JSXB.js +408 -0
  25. package/dist/chunk-4DU5JSXB.js.map +1 -0
  26. package/dist/chunk-4E4E2GSS.js +352 -0
  27. package/dist/chunk-4E4E2GSS.js.map +1 -0
  28. package/dist/chunk-4NHAP4AN.mjs +3 -0
  29. package/dist/chunk-4NHAP4AN.mjs.map +1 -0
  30. package/dist/chunk-4S33J5NY.mjs +415 -0
  31. package/dist/chunk-4S33J5NY.mjs.map +1 -0
  32. package/dist/chunk-5SMGRT3G.mjs +354 -0
  33. package/dist/chunk-5SMGRT3G.mjs.map +1 -0
  34. package/dist/chunk-5SVLJN2C.mjs +22 -0
  35. package/dist/chunk-5SVLJN2C.mjs.map +1 -0
  36. package/dist/chunk-66WTU4EB.mjs +299 -0
  37. package/dist/chunk-66WTU4EB.mjs.map +1 -0
  38. package/dist/chunk-6S25NMOT.mjs +335 -0
  39. package/dist/chunk-6S25NMOT.mjs.map +1 -0
  40. package/dist/chunk-6SP7UB3D.js +4 -0
  41. package/dist/chunk-6SP7UB3D.js.map +1 -0
  42. package/dist/chunk-6TYWWQHM.mjs +565 -0
  43. package/dist/chunk-6TYWWQHM.mjs.map +1 -0
  44. package/dist/chunk-A3YUJA6W.mjs +384 -0
  45. package/dist/chunk-A3YUJA6W.mjs.map +1 -0
  46. package/dist/chunk-A6KEDVUR.js +61 -0
  47. package/dist/chunk-A6KEDVUR.js.map +1 -0
  48. package/dist/chunk-A77RUEWL.js +730 -0
  49. package/dist/chunk-A77RUEWL.js.map +1 -0
  50. package/dist/chunk-AA4IKMPE.mjs +3 -0
  51. package/dist/chunk-AA4IKMPE.mjs.map +1 -0
  52. package/dist/chunk-AKIA6GW6.mjs +163 -0
  53. package/dist/chunk-AKIA6GW6.mjs.map +1 -0
  54. package/dist/chunk-AL6P275L.mjs +435 -0
  55. package/dist/chunk-AL6P275L.mjs.map +1 -0
  56. package/dist/chunk-AZ3RJYTB.js +37 -0
  57. package/dist/chunk-AZ3RJYTB.js.map +1 -0
  58. package/dist/chunk-B5Q4UPL6.js +32 -0
  59. package/dist/chunk-B5Q4UPL6.js.map +1 -0
  60. package/dist/chunk-B6DHPMDP.mjs +335 -0
  61. package/dist/chunk-B6DHPMDP.mjs.map +1 -0
  62. package/dist/chunk-BDXKKMBZ.mjs +184 -0
  63. package/dist/chunk-BDXKKMBZ.mjs.map +1 -0
  64. package/dist/chunk-BL6E2DLZ.mjs +52 -0
  65. package/dist/chunk-BL6E2DLZ.mjs.map +1 -0
  66. package/dist/chunk-CGFDS4XS.mjs +121 -0
  67. package/dist/chunk-CGFDS4XS.mjs.map +1 -0
  68. package/dist/chunk-CJIW5TKI.js +139 -0
  69. package/dist/chunk-CJIW5TKI.js.map +1 -0
  70. package/dist/chunk-CKNISJOQ.js +314 -0
  71. package/dist/chunk-CKNISJOQ.js.map +1 -0
  72. package/dist/chunk-D6CBOECS.mjs +1757 -0
  73. package/dist/chunk-D6CBOECS.mjs.map +1 -0
  74. package/dist/chunk-DDWEVC2S.js +166 -0
  75. package/dist/chunk-DDWEVC2S.js.map +1 -0
  76. package/dist/chunk-DZ556D2F.mjs +176 -0
  77. package/dist/chunk-DZ556D2F.mjs.map +1 -0
  78. package/dist/chunk-E2KQFV3O.mjs +10 -0
  79. package/dist/chunk-E2KQFV3O.mjs.map +1 -0
  80. package/dist/chunk-EMMLADSC.js +126 -0
  81. package/dist/chunk-EMMLADSC.js.map +1 -0
  82. package/dist/chunk-EP4WOI5D.mjs +926 -0
  83. package/dist/chunk-EP4WOI5D.mjs.map +1 -0
  84. package/dist/chunk-FJRXLJC2.mjs +160 -0
  85. package/dist/chunk-FJRXLJC2.mjs.map +1 -0
  86. package/dist/chunk-FKQI434R.js +345 -0
  87. package/dist/chunk-FKQI434R.js.map +1 -0
  88. package/dist/chunk-FPKEAJRZ.mjs +100 -0
  89. package/dist/chunk-FPKEAJRZ.mjs.map +1 -0
  90. package/dist/chunk-FWQYB22U.js +183 -0
  91. package/dist/chunk-FWQYB22U.js.map +1 -0
  92. package/dist/chunk-GD5GHTMA.js +189 -0
  93. package/dist/chunk-GD5GHTMA.js.map +1 -0
  94. package/dist/chunk-GE5XTSDZ.js +447 -0
  95. package/dist/chunk-GE5XTSDZ.js.map +1 -0
  96. package/dist/chunk-GVE47ZAX.mjs +32 -0
  97. package/dist/chunk-GVE47ZAX.mjs.map +1 -0
  98. package/dist/chunk-HK46BT5U.mjs +18 -0
  99. package/dist/chunk-HK46BT5U.mjs.map +1 -0
  100. package/dist/chunk-HQVRMR6N.js +365 -0
  101. package/dist/chunk-HQVRMR6N.js.map +1 -0
  102. package/dist/chunk-HSGBJPJO.mjs +398 -0
  103. package/dist/chunk-HSGBJPJO.mjs.map +1 -0
  104. package/dist/chunk-I3AUTOMZ.mjs +125 -0
  105. package/dist/chunk-I3AUTOMZ.mjs.map +1 -0
  106. package/dist/chunk-IEI5LD5C.mjs +1161 -0
  107. package/dist/chunk-IEI5LD5C.mjs.map +1 -0
  108. package/dist/chunk-IIPTC2X7.mjs +118 -0
  109. package/dist/chunk-IIPTC2X7.mjs.map +1 -0
  110. package/dist/chunk-J7TLHF2Q.js +4 -0
  111. package/dist/chunk-J7TLHF2Q.js.map +1 -0
  112. package/dist/chunk-JJOWXFXQ.mjs +765 -0
  113. package/dist/chunk-JJOWXFXQ.mjs.map +1 -0
  114. package/dist/chunk-JPTSS2OA.mjs +3 -0
  115. package/dist/chunk-JPTSS2OA.mjs.map +1 -0
  116. package/dist/chunk-KFXXRLTP.js +396 -0
  117. package/dist/chunk-KFXXRLTP.js.map +1 -0
  118. package/dist/chunk-KPRRBSG6.mjs +272 -0
  119. package/dist/chunk-KPRRBSG6.mjs.map +1 -0
  120. package/dist/chunk-NFSBGRDB.mjs +57 -0
  121. package/dist/chunk-NFSBGRDB.mjs.map +1 -0
  122. package/dist/chunk-NGJVCFTM.js +219 -0
  123. package/dist/chunk-NGJVCFTM.js.map +1 -0
  124. package/dist/chunk-NSQ6MZJ6.mjs +728 -0
  125. package/dist/chunk-NSQ6MZJ6.mjs.map +1 -0
  126. package/dist/chunk-NYQYHT76.mjs +296 -0
  127. package/dist/chunk-NYQYHT76.mjs.map +1 -0
  128. package/dist/chunk-OLJJGI5B.js +1193 -0
  129. package/dist/chunk-OLJJGI5B.js.map +1 -0
  130. package/dist/chunk-Q3572X2J.js +292 -0
  131. package/dist/chunk-Q3572X2J.js.map +1 -0
  132. package/dist/chunk-QH7N7D4I.mjs +210 -0
  133. package/dist/chunk-QH7N7D4I.mjs.map +1 -0
  134. package/dist/chunk-R7XUIV25.js +466 -0
  135. package/dist/chunk-R7XUIV25.js.map +1 -0
  136. package/dist/chunk-RFFO4KPM.js +135 -0
  137. package/dist/chunk-RFFO4KPM.js.map +1 -0
  138. package/dist/chunk-RFX7QKA7.mjs +180 -0
  139. package/dist/chunk-RFX7QKA7.mjs.map +1 -0
  140. package/dist/chunk-SN5LFAP3.js +940 -0
  141. package/dist/chunk-SN5LFAP3.js.map +1 -0
  142. package/dist/chunk-T4COXKQ3.js +24 -0
  143. package/dist/chunk-T4COXKQ3.js.map +1 -0
  144. package/dist/chunk-TS54QM27.js +125 -0
  145. package/dist/chunk-TS54QM27.js.map +1 -0
  146. package/dist/chunk-UE2S4PCX.mjs +220 -0
  147. package/dist/chunk-UE2S4PCX.mjs.map +1 -0
  148. package/dist/chunk-UTW3QX2A.mjs +282 -0
  149. package/dist/chunk-UTW3QX2A.mjs.map +1 -0
  150. package/dist/chunk-V74LGMAE.js +1767 -0
  151. package/dist/chunk-V74LGMAE.js.map +1 -0
  152. package/dist/chunk-VIREG536.js +12 -0
  153. package/dist/chunk-VIREG536.js.map +1 -0
  154. package/dist/chunk-VY7M7346.js +4 -0
  155. package/dist/chunk-VY7M7346.js.map +1 -0
  156. package/dist/chunk-W3TJOO7H.mjs +319 -0
  157. package/dist/chunk-W3TJOO7H.mjs.map +1 -0
  158. package/dist/chunk-WIUOB36M.js +54 -0
  159. package/dist/chunk-WIUOB36M.js.map +1 -0
  160. package/dist/chunk-WJGLM4CY.js +291 -0
  161. package/dist/chunk-WJGLM4CY.js.map +1 -0
  162. package/dist/chunk-WNURH5OO.mjs +453 -0
  163. package/dist/chunk-WNURH5OO.mjs.map +1 -0
  164. package/dist/chunk-X25TNRSD.mjs +364 -0
  165. package/dist/chunk-X25TNRSD.mjs.map +1 -0
  166. package/dist/chunk-Y3GT7ETK.js +108 -0
  167. package/dist/chunk-Y3GT7ETK.js.map +1 -0
  168. package/dist/chunk-Z4FRNOF6.mjs +115 -0
  169. package/dist/chunk-Z4FRNOF6.mjs.map +1 -0
  170. package/dist/chunk-ZMYLD3BN.js +166 -0
  171. package/dist/chunk-ZMYLD3BN.js.map +1 -0
  172. package/dist/chunk-ZP2KV6EX.js +815 -0
  173. package/dist/chunk-ZP2KV6EX.js.map +1 -0
  174. package/dist/chunk-ZVKXFELU.js +366 -0
  175. package/dist/chunk-ZVKXFELU.js.map +1 -0
  176. package/dist/elements/Accordion/Accordion.d.ts +139 -0
  177. package/dist/elements/Accordion/Accordion.d.ts.map +1 -0
  178. package/dist/elements/Accordion/Accordion.types.d.ts +143 -0
  179. package/dist/elements/Accordion/Accordion.types.d.ts.map +1 -0
  180. package/dist/elements/Accordion/index.d.ts +13 -0
  181. package/dist/elements/Accordion/index.d.ts.map +1 -0
  182. package/dist/elements/Accordion/index.js +78 -0
  183. package/dist/elements/Accordion/index.js.map +1 -0
  184. package/dist/elements/Accordion/index.mjs +5 -0
  185. package/dist/elements/Accordion/index.mjs.map +1 -0
  186. package/dist/elements/Avatar/Avatar.d.ts +51 -0
  187. package/dist/elements/Avatar/Avatar.d.ts.map +1 -0
  188. package/dist/elements/Avatar/Avatar.types.d.ts +145 -0
  189. package/dist/elements/Avatar/Avatar.types.d.ts.map +1 -0
  190. package/dist/elements/Avatar/AvatarGroup.d.ts +32 -0
  191. package/dist/elements/Avatar/AvatarGroup.d.ts.map +1 -0
  192. package/dist/elements/Avatar/index.d.ts +11 -0
  193. package/dist/elements/Avatar/index.d.ts.map +1 -0
  194. package/dist/elements/Avatar/index.js +54 -0
  195. package/dist/elements/Avatar/index.js.map +1 -0
  196. package/dist/elements/Avatar/index.mjs +5 -0
  197. package/dist/elements/Avatar/index.mjs.map +1 -0
  198. package/dist/elements/Badge/Badge.d.ts +39 -0
  199. package/dist/elements/Badge/Badge.d.ts.map +1 -0
  200. package/dist/elements/Badge/Badge.types.d.ts +76 -0
  201. package/dist/elements/Badge/Badge.types.d.ts.map +1 -0
  202. package/dist/elements/Badge/index.d.ts +18 -0
  203. package/dist/elements/Badge/index.d.ts.map +1 -0
  204. package/dist/elements/Badge/index.js +43 -0
  205. package/dist/elements/Badge/index.js.map +1 -0
  206. package/dist/elements/Badge/index.mjs +6 -0
  207. package/dist/elements/Badge/index.mjs.map +1 -0
  208. package/dist/elements/Breadcrumbs/Breadcrumbs.d.ts +91 -0
  209. package/dist/elements/Breadcrumbs/Breadcrumbs.d.ts.map +1 -0
  210. package/dist/elements/Breadcrumbs/Breadcrumbs.types.d.ts +114 -0
  211. package/dist/elements/Breadcrumbs/Breadcrumbs.types.d.ts.map +1 -0
  212. package/dist/elements/Breadcrumbs/index.d.ts +14 -0
  213. package/dist/elements/Breadcrumbs/index.d.ts.map +1 -0
  214. package/dist/elements/Breadcrumbs/index.js +54 -0
  215. package/dist/elements/Breadcrumbs/index.js.map +1 -0
  216. package/dist/elements/Breadcrumbs/index.mjs +9 -0
  217. package/dist/elements/Breadcrumbs/index.mjs.map +1 -0
  218. package/dist/elements/Button/Button.d.ts +92 -0
  219. package/dist/elements/Button/Button.d.ts.map +1 -0
  220. package/dist/elements/Button/Button.types.d.ts +54 -0
  221. package/dist/elements/Button/Button.types.d.ts.map +1 -0
  222. package/dist/elements/Button/index.d.ts +18 -0
  223. package/dist/elements/Button/index.d.ts.map +1 -0
  224. package/dist/elements/Button/index.js +27 -0
  225. package/dist/elements/Button/index.js.map +1 -0
  226. package/dist/elements/Button/index.mjs +6 -0
  227. package/dist/elements/Button/index.mjs.map +1 -0
  228. package/dist/elements/ButtonGroup/ButtonGroup.d.ts +53 -0
  229. package/dist/elements/ButtonGroup/ButtonGroup.d.ts.map +1 -0
  230. package/dist/elements/ButtonGroup/ButtonGroup.types.d.ts +98 -0
  231. package/dist/elements/ButtonGroup/ButtonGroup.types.d.ts.map +1 -0
  232. package/dist/elements/ButtonGroup/ButtonGroup.utils.d.ts +60 -0
  233. package/dist/elements/ButtonGroup/ButtonGroup.utils.d.ts.map +1 -0
  234. package/dist/elements/ButtonGroup/ButtonGroup.variants.d.ts +39 -0
  235. package/dist/elements/ButtonGroup/ButtonGroup.variants.d.ts.map +1 -0
  236. package/dist/elements/ButtonGroup/ButtonGroupContext.d.ts +42 -0
  237. package/dist/elements/ButtonGroup/ButtonGroupContext.d.ts.map +1 -0
  238. package/dist/elements/ButtonGroup/index.d.ts +35 -0
  239. package/dist/elements/ButtonGroup/index.d.ts.map +1 -0
  240. package/dist/elements/ButtonGroup/index.js +66 -0
  241. package/dist/elements/ButtonGroup/index.js.map +1 -0
  242. package/dist/elements/ButtonGroup/index.mjs +5 -0
  243. package/dist/elements/ButtonGroup/index.mjs.map +1 -0
  244. package/dist/elements/Card/Card.d.ts +104 -0
  245. package/dist/elements/Card/Card.d.ts.map +1 -0
  246. package/dist/elements/Card/Card.types.d.ts +227 -0
  247. package/dist/elements/Card/Card.types.d.ts.map +1 -0
  248. package/dist/elements/Card/index.d.ts +38 -0
  249. package/dist/elements/Card/index.d.ts.map +1 -0
  250. package/dist/elements/Card/index.js +85 -0
  251. package/dist/elements/Card/index.js.map +1 -0
  252. package/dist/elements/Card/index.mjs +8 -0
  253. package/dist/elements/Card/index.mjs.map +1 -0
  254. package/dist/elements/Carousel/Carousel.d.ts +13 -0
  255. package/dist/elements/Carousel/Carousel.d.ts.map +1 -0
  256. package/dist/elements/Carousel/Carousel.types.d.ts +65 -0
  257. package/dist/elements/Carousel/Carousel.types.d.ts.map +1 -0
  258. package/dist/elements/Carousel/LazyCarousel.d.ts +46 -0
  259. package/dist/elements/Carousel/LazyCarousel.d.ts.map +1 -0
  260. package/dist/elements/Carousel/index.d.ts +5 -0
  261. package/dist/elements/Carousel/index.d.ts.map +1 -0
  262. package/dist/elements/Carousel/index.js +23 -0
  263. package/dist/elements/Carousel/index.js.map +1 -0
  264. package/dist/elements/Carousel/index.mjs +10 -0
  265. package/dist/elements/Carousel/index.mjs.map +1 -0
  266. package/dist/elements/Chart/Chart.d.ts +44 -0
  267. package/dist/elements/Chart/Chart.d.ts.map +1 -0
  268. package/dist/elements/Chart/Chart.types.d.ts +254 -0
  269. package/dist/elements/Chart/Chart.types.d.ts.map +1 -0
  270. package/dist/elements/Chart/ChartAnnouncer.d.ts +24 -0
  271. package/dist/elements/Chart/ChartAnnouncer.d.ts.map +1 -0
  272. package/dist/elements/Chart/ChartAxis.d.ts +42 -0
  273. package/dist/elements/Chart/ChartAxis.d.ts.map +1 -0
  274. package/dist/elements/Chart/ChartBarSeries.d.ts +54 -0
  275. package/dist/elements/Chart/ChartBarSeries.d.ts.map +1 -0
  276. package/dist/elements/Chart/ChartContext.d.ts +46 -0
  277. package/dist/elements/Chart/ChartContext.d.ts.map +1 -0
  278. package/dist/elements/Chart/ChartDataPoint.d.ts +56 -0
  279. package/dist/elements/Chart/ChartDataPoint.d.ts.map +1 -0
  280. package/dist/elements/Chart/ChartDataTable.d.ts +35 -0
  281. package/dist/elements/Chart/ChartDataTable.d.ts.map +1 -0
  282. package/dist/elements/Chart/ChartGrid.d.ts +32 -0
  283. package/dist/elements/Chart/ChartGrid.d.ts.map +1 -0
  284. package/dist/elements/Chart/ChartLegend.d.ts +32 -0
  285. package/dist/elements/Chart/ChartLegend.d.ts.map +1 -0
  286. package/dist/elements/Chart/ChartLineSeries.d.ts +52 -0
  287. package/dist/elements/Chart/ChartLineSeries.d.ts.map +1 -0
  288. package/dist/elements/Chart/ChartSVG.d.ts +62 -0
  289. package/dist/elements/Chart/ChartSVG.d.ts.map +1 -0
  290. package/dist/elements/Chart/ChartTooltip.d.ts +45 -0
  291. package/dist/elements/Chart/ChartTooltip.d.ts.map +1 -0
  292. package/dist/elements/Chart/chart.constants.d.ts +108 -0
  293. package/dist/elements/Chart/chart.constants.d.ts.map +1 -0
  294. package/dist/elements/Chart/chart.variants.d.ts +45 -0
  295. package/dist/elements/Chart/chart.variants.d.ts.map +1 -0
  296. package/dist/elements/Chart/index.d.ts +12 -0
  297. package/dist/elements/Chart/index.d.ts.map +1 -0
  298. package/dist/elements/Chart/index.js +47 -0
  299. package/dist/elements/Chart/index.js.map +1 -0
  300. package/dist/elements/Chart/index.mjs +6 -0
  301. package/dist/elements/Chart/index.mjs.map +1 -0
  302. package/dist/elements/Chart/useChartDimensions.d.ts +18 -0
  303. package/dist/elements/Chart/useChartDimensions.d.ts.map +1 -0
  304. package/dist/elements/Chart/useChartKeyboard.d.ts +42 -0
  305. package/dist/elements/Chart/useChartKeyboard.d.ts.map +1 -0
  306. package/dist/elements/Chart/useRovingTabIndex.d.ts +46 -0
  307. package/dist/elements/Chart/useRovingTabIndex.d.ts.map +1 -0
  308. package/dist/elements/Checkbox/Checkbox.d.ts +94 -0
  309. package/dist/elements/Checkbox/Checkbox.d.ts.map +1 -0
  310. package/dist/elements/Checkbox/Checkbox.types.d.ts +82 -0
  311. package/dist/elements/Checkbox/Checkbox.types.d.ts.map +1 -0
  312. package/dist/elements/Checkbox/index.d.ts +7 -0
  313. package/dist/elements/Checkbox/index.d.ts.map +1 -0
  314. package/dist/elements/Checkbox/index.js +47 -0
  315. package/dist/elements/Checkbox/index.js.map +1 -0
  316. package/dist/elements/Checkbox/index.mjs +6 -0
  317. package/dist/elements/Checkbox/index.mjs.map +1 -0
  318. package/dist/elements/CheckboxGroup/CheckboxGroup.d.ts +130 -0
  319. package/dist/elements/CheckboxGroup/CheckboxGroup.d.ts.map +1 -0
  320. package/dist/elements/CheckboxGroup/CheckboxGroup.types.d.ts +142 -0
  321. package/dist/elements/CheckboxGroup/CheckboxGroup.types.d.ts.map +1 -0
  322. package/dist/elements/CheckboxGroup/index.d.ts +10 -0
  323. package/dist/elements/CheckboxGroup/index.d.ts.map +1 -0
  324. package/dist/elements/CheckboxGroup/index.js +71 -0
  325. package/dist/elements/CheckboxGroup/index.js.map +1 -0
  326. package/dist/elements/CheckboxGroup/index.mjs +6 -0
  327. package/dist/elements/CheckboxGroup/index.mjs.map +1 -0
  328. package/dist/elements/DatePicker/Calendar.d.ts +16 -0
  329. package/dist/elements/DatePicker/Calendar.d.ts.map +1 -0
  330. package/dist/elements/DatePicker/DateField.d.ts +13 -0
  331. package/dist/elements/DatePicker/DateField.d.ts.map +1 -0
  332. package/dist/elements/DatePicker/DatePicker.d.ts +16 -0
  333. package/dist/elements/DatePicker/DatePicker.d.ts.map +1 -0
  334. package/dist/elements/DatePicker/DatePicker.types.d.ts +390 -0
  335. package/dist/elements/DatePicker/DatePicker.types.d.ts.map +1 -0
  336. package/dist/elements/DatePicker/DatePicker.variants.d.ts +42 -0
  337. package/dist/elements/DatePicker/DatePicker.variants.d.ts.map +1 -0
  338. package/dist/elements/DatePicker/DateRangePicker.d.ts +13 -0
  339. package/dist/elements/DatePicker/DateRangePicker.d.ts.map +1 -0
  340. package/dist/elements/DatePicker/index.d.ts +14 -0
  341. package/dist/elements/DatePicker/index.d.ts.map +1 -0
  342. package/dist/elements/DatePicker/index.js +123 -0
  343. package/dist/elements/DatePicker/index.js.map +1 -0
  344. package/dist/elements/DatePicker/index.mjs +6 -0
  345. package/dist/elements/DatePicker/index.mjs.map +1 -0
  346. package/dist/elements/Dropdown/Dropdown.d.ts +197 -0
  347. package/dist/elements/Dropdown/Dropdown.d.ts.map +1 -0
  348. package/dist/elements/Dropdown/Dropdown.types.d.ts +175 -0
  349. package/dist/elements/Dropdown/Dropdown.types.d.ts.map +1 -0
  350. package/dist/elements/Dropdown/index.d.ts +12 -0
  351. package/dist/elements/Dropdown/index.d.ts.map +1 -0
  352. package/dist/elements/Dropdown/index.js +41 -0
  353. package/dist/elements/Dropdown/index.js.map +1 -0
  354. package/dist/elements/Dropdown/index.mjs +4 -0
  355. package/dist/elements/Dropdown/index.mjs.map +1 -0
  356. package/dist/elements/FileField/FileField.d.ts +46 -0
  357. package/dist/elements/FileField/FileField.d.ts.map +1 -0
  358. package/dist/elements/FileField/FileField.types.d.ts +99 -0
  359. package/dist/elements/FileField/FileField.types.d.ts.map +1 -0
  360. package/dist/elements/FileField/FileField.variants.d.ts +49 -0
  361. package/dist/elements/FileField/FileField.variants.d.ts.map +1 -0
  362. package/dist/elements/FileField/FilePreview.d.ts +27 -0
  363. package/dist/elements/FileField/FilePreview.d.ts.map +1 -0
  364. package/dist/elements/FileField/FileProgress.d.ts +35 -0
  365. package/dist/elements/FileField/FileProgress.d.ts.map +1 -0
  366. package/dist/elements/FileField/FileProgress.variants.d.ts +55 -0
  367. package/dist/elements/FileField/FileProgress.variants.d.ts.map +1 -0
  368. package/dist/elements/FileField/index.d.ts +41 -0
  369. package/dist/elements/FileField/index.d.ts.map +1 -0
  370. package/dist/elements/FileField/index.js +138 -0
  371. package/dist/elements/FileField/index.js.map +1 -0
  372. package/dist/elements/FileField/index.mjs +9 -0
  373. package/dist/elements/FileField/index.mjs.map +1 -0
  374. package/dist/elements/FileField/useFilePreview.d.ts +46 -0
  375. package/dist/elements/FileField/useFilePreview.d.ts.map +1 -0
  376. package/dist/elements/FileField/utils.d.ts +134 -0
  377. package/dist/elements/FileField/utils.d.ts.map +1 -0
  378. package/dist/elements/FormLayout/FormLayout.d.ts +51 -0
  379. package/dist/elements/FormLayout/FormLayout.d.ts.map +1 -0
  380. package/dist/elements/FormLayout/FormLayout.types.d.ts +66 -0
  381. package/dist/elements/FormLayout/FormLayout.types.d.ts.map +1 -0
  382. package/dist/elements/FormLayout/index.d.ts +3 -0
  383. package/dist/elements/FormLayout/index.d.ts.map +1 -0
  384. package/dist/elements/FormLayout/index.js +17 -0
  385. package/dist/elements/FormLayout/index.js.map +1 -0
  386. package/dist/elements/FormLayout/index.mjs +4 -0
  387. package/dist/elements/FormLayout/index.mjs.map +1 -0
  388. package/dist/elements/Modal/Modal.d.ts +168 -0
  389. package/dist/elements/Modal/Modal.d.ts.map +1 -0
  390. package/dist/elements/Modal/Modal.types.d.ts +265 -0
  391. package/dist/elements/Modal/Modal.types.d.ts.map +1 -0
  392. package/dist/elements/Modal/index.d.ts +14 -0
  393. package/dist/elements/Modal/index.d.ts.map +1 -0
  394. package/dist/elements/Modal/index.js +52 -0
  395. package/dist/elements/Modal/index.js.map +1 -0
  396. package/dist/elements/Modal/index.mjs +3 -0
  397. package/dist/elements/Modal/index.mjs.map +1 -0
  398. package/dist/elements/NumberField/NumberField.d.ts +43 -0
  399. package/dist/elements/NumberField/NumberField.d.ts.map +1 -0
  400. package/dist/elements/NumberField/NumberField.types.d.ts +112 -0
  401. package/dist/elements/NumberField/NumberField.types.d.ts.map +1 -0
  402. package/dist/elements/NumberField/NumberField.variants.d.ts +82 -0
  403. package/dist/elements/NumberField/NumberField.variants.d.ts.map +1 -0
  404. package/dist/elements/NumberField/index.d.ts +25 -0
  405. package/dist/elements/NumberField/index.d.ts.map +1 -0
  406. package/dist/elements/NumberField/index.js +57 -0
  407. package/dist/elements/NumberField/index.js.map +1 -0
  408. package/dist/elements/NumberField/index.mjs +8 -0
  409. package/dist/elements/NumberField/index.mjs.map +1 -0
  410. package/dist/elements/OTPInput/OTPInput.d.ts +105 -0
  411. package/dist/elements/OTPInput/OTPInput.d.ts.map +1 -0
  412. package/dist/elements/OTPInput/OTPInput.styles.d.ts +83 -0
  413. package/dist/elements/OTPInput/OTPInput.styles.d.ts.map +1 -0
  414. package/dist/elements/OTPInput/OTPInput.types.d.ts +189 -0
  415. package/dist/elements/OTPInput/OTPInput.types.d.ts.map +1 -0
  416. package/dist/elements/OTPInput/components/OTPDigit.d.ts +51 -0
  417. package/dist/elements/OTPInput/components/OTPDigit.d.ts.map +1 -0
  418. package/dist/elements/OTPInput/hooks/useOTPInput.d.ts +36 -0
  419. package/dist/elements/OTPInput/hooks/useOTPInput.d.ts.map +1 -0
  420. package/dist/elements/OTPInput/hooks/useOTPKeyboard.d.ts +59 -0
  421. package/dist/elements/OTPInput/hooks/useOTPKeyboard.d.ts.map +1 -0
  422. package/dist/elements/OTPInput/index.d.ts +27 -0
  423. package/dist/elements/OTPInput/index.d.ts.map +1 -0
  424. package/dist/elements/OTPInput/index.js +13 -0
  425. package/dist/elements/OTPInput/index.js.map +1 -0
  426. package/dist/elements/OTPInput/index.mjs +4 -0
  427. package/dist/elements/OTPInput/index.mjs.map +1 -0
  428. package/dist/elements/Panel/Panel.d.ts +111 -0
  429. package/dist/elements/Panel/Panel.d.ts.map +1 -0
  430. package/dist/elements/Panel/Panel.types.d.ts +243 -0
  431. package/dist/elements/Panel/Panel.types.d.ts.map +1 -0
  432. package/dist/elements/Panel/index.d.ts +4 -0
  433. package/dist/elements/Panel/index.d.ts.map +1 -0
  434. package/dist/elements/Panel/index.js +33 -0
  435. package/dist/elements/Panel/index.js.map +1 -0
  436. package/dist/elements/Panel/index.mjs +4 -0
  437. package/dist/elements/Panel/index.mjs.map +1 -0
  438. package/dist/elements/Progress/Progress.d.ts +44 -0
  439. package/dist/elements/Progress/Progress.d.ts.map +1 -0
  440. package/dist/elements/Progress/Progress.types.d.ts +64 -0
  441. package/dist/elements/Progress/Progress.types.d.ts.map +1 -0
  442. package/dist/elements/Progress/index.d.ts +11 -0
  443. package/dist/elements/Progress/index.d.ts.map +1 -0
  444. package/dist/elements/Progress/index.js +30 -0
  445. package/dist/elements/Progress/index.js.map +1 -0
  446. package/dist/elements/Progress/index.mjs +5 -0
  447. package/dist/elements/Progress/index.mjs.map +1 -0
  448. package/dist/elements/RadioGroup/RadioGroup.d.ts +110 -0
  449. package/dist/elements/RadioGroup/RadioGroup.d.ts.map +1 -0
  450. package/dist/elements/RadioGroup/RadioGroup.types.d.ts +143 -0
  451. package/dist/elements/RadioGroup/RadioGroup.types.d.ts.map +1 -0
  452. package/dist/elements/RadioGroup/index.d.ts +10 -0
  453. package/dist/elements/RadioGroup/index.d.ts.map +1 -0
  454. package/dist/elements/RadioGroup/index.js +47 -0
  455. package/dist/elements/RadioGroup/index.js.map +1 -0
  456. package/dist/elements/RadioGroup/index.mjs +6 -0
  457. package/dist/elements/RadioGroup/index.mjs.map +1 -0
  458. package/dist/elements/Resizable/Resizable.types.d.ts +188 -0
  459. package/dist/elements/Resizable/Resizable.types.d.ts.map +1 -0
  460. package/dist/elements/Resizable/components/ResizableHandle.d.ts +28 -0
  461. package/dist/elements/Resizable/components/ResizableHandle.d.ts.map +1 -0
  462. package/dist/elements/Resizable/components/ResizablePanel.d.ts +24 -0
  463. package/dist/elements/Resizable/components/ResizablePanel.d.ts.map +1 -0
  464. package/dist/elements/Resizable/components/ResizablePanelGroup.d.ts +26 -0
  465. package/dist/elements/Resizable/components/ResizablePanelGroup.d.ts.map +1 -0
  466. package/dist/elements/Resizable/components/ResizablePopover.d.ts +45 -0
  467. package/dist/elements/Resizable/components/ResizablePopover.d.ts.map +1 -0
  468. package/dist/elements/Resizable/hooks/useResizable.d.ts +50 -0
  469. package/dist/elements/Resizable/hooks/useResizable.d.ts.map +1 -0
  470. package/dist/elements/Resizable/hooks/useResizableContext.d.ts +36 -0
  471. package/dist/elements/Resizable/hooks/useResizableContext.d.ts.map +1 -0
  472. package/dist/elements/Resizable/index.d.ts +37 -0
  473. package/dist/elements/Resizable/index.d.ts.map +1 -0
  474. package/dist/elements/Resizable/index.js +65 -0
  475. package/dist/elements/Resizable/index.js.map +1 -0
  476. package/dist/elements/Resizable/index.mjs +8 -0
  477. package/dist/elements/Resizable/index.mjs.map +1 -0
  478. package/dist/elements/Select/Select.d.ts +184 -0
  479. package/dist/elements/Select/Select.d.ts.map +1 -0
  480. package/dist/elements/Select/Select.types.d.ts +166 -0
  481. package/dist/elements/Select/Select.types.d.ts.map +1 -0
  482. package/dist/elements/Select/index.d.ts +35 -0
  483. package/dist/elements/Select/index.d.ts.map +1 -0
  484. package/dist/elements/Select/index.js +33 -0
  485. package/dist/elements/Select/index.js.map +1 -0
  486. package/dist/elements/Select/index.mjs +4 -0
  487. package/dist/elements/Select/index.mjs.map +1 -0
  488. package/dist/elements/Skeleton/Skeleton.d.ts +31 -0
  489. package/dist/elements/Skeleton/Skeleton.d.ts.map +1 -0
  490. package/dist/elements/Skeleton/Skeleton.types.d.ts +36 -0
  491. package/dist/elements/Skeleton/Skeleton.types.d.ts.map +1 -0
  492. package/dist/elements/Skeleton/index.d.ts +11 -0
  493. package/dist/elements/Skeleton/index.d.ts.map +1 -0
  494. package/dist/elements/Skeleton/index.js +22 -0
  495. package/dist/elements/Skeleton/index.js.map +1 -0
  496. package/dist/elements/Skeleton/index.mjs +5 -0
  497. package/dist/elements/Skeleton/index.mjs.map +1 -0
  498. package/dist/elements/Switch/Switch.d.ts +39 -0
  499. package/dist/elements/Switch/Switch.d.ts.map +1 -0
  500. package/dist/elements/Switch/Switch.types.d.ts +53 -0
  501. package/dist/elements/Switch/Switch.types.d.ts.map +1 -0
  502. package/dist/elements/Switch/index.d.ts +8 -0
  503. package/dist/elements/Switch/index.d.ts.map +1 -0
  504. package/dist/elements/Switch/index.js +49 -0
  505. package/dist/elements/Switch/index.js.map +1 -0
  506. package/dist/elements/Switch/index.mjs +31 -0
  507. package/dist/elements/Switch/index.mjs.map +1 -0
  508. package/dist/elements/Table/Table.d.ts +123 -0
  509. package/dist/elements/Table/Table.d.ts.map +1 -0
  510. package/dist/elements/Table/Table.types.d.ts +356 -0
  511. package/dist/elements/Table/Table.types.d.ts.map +1 -0
  512. package/dist/elements/Table/index.d.ts +5 -0
  513. package/dist/elements/Table/index.d.ts.map +1 -0
  514. package/dist/elements/Table/index.js +76 -0
  515. package/dist/elements/Table/index.js.map +1 -0
  516. package/dist/elements/Table/index.mjs +7 -0
  517. package/dist/elements/Table/index.mjs.map +1 -0
  518. package/dist/elements/Tabs/Tabs.d.ts +129 -0
  519. package/dist/elements/Tabs/Tabs.d.ts.map +1 -0
  520. package/dist/elements/Tabs/Tabs.types.d.ts +179 -0
  521. package/dist/elements/Tabs/Tabs.types.d.ts.map +1 -0
  522. package/dist/elements/Tabs/index.d.ts +12 -0
  523. package/dist/elements/Tabs/index.d.ts.map +1 -0
  524. package/dist/elements/Tabs/index.js +74 -0
  525. package/dist/elements/Tabs/index.js.map +1 -0
  526. package/dist/elements/Tabs/index.mjs +5 -0
  527. package/dist/elements/Tabs/index.mjs.map +1 -0
  528. package/dist/elements/TextField/TextField.d.ts +155 -0
  529. package/dist/elements/TextField/TextField.d.ts.map +1 -0
  530. package/dist/elements/TextField/TextField.types.d.ts +258 -0
  531. package/dist/elements/TextField/TextField.types.d.ts.map +1 -0
  532. package/dist/elements/TextField/index.css +23 -0
  533. package/dist/elements/TextField/index.css.map +1 -0
  534. package/dist/elements/TextField/index.d.ts +13 -0
  535. package/dist/elements/TextField/index.d.ts.map +1 -0
  536. package/dist/elements/TextField/index.js +260 -0
  537. package/dist/elements/TextField/index.js.map +1 -0
  538. package/dist/elements/TextField/index.mjs +207 -0
  539. package/dist/elements/TextField/index.mjs.map +1 -0
  540. package/dist/elements/TimeField/TimeField.d.ts +34 -0
  541. package/dist/elements/TimeField/TimeField.d.ts.map +1 -0
  542. package/dist/elements/TimeField/TimeField.types.d.ts +151 -0
  543. package/dist/elements/TimeField/TimeField.types.d.ts.map +1 -0
  544. package/dist/elements/TimeField/index.d.ts +24 -0
  545. package/dist/elements/TimeField/index.d.ts.map +1 -0
  546. package/dist/elements/TimeField/index.js +45 -0
  547. package/dist/elements/TimeField/index.js.map +1 -0
  548. package/dist/elements/TimeField/index.mjs +4 -0
  549. package/dist/elements/TimeField/index.mjs.map +1 -0
  550. package/dist/elements/Toast/Toast.d.ts +105 -0
  551. package/dist/elements/Toast/Toast.d.ts.map +1 -0
  552. package/dist/elements/Toast/Toast.types.d.ts +209 -0
  553. package/dist/elements/Toast/Toast.types.d.ts.map +1 -0
  554. package/dist/elements/Toast/ToastProvider.d.ts +37 -0
  555. package/dist/elements/Toast/ToastProvider.d.ts.map +1 -0
  556. package/dist/elements/Toast/Toaster.d.ts +18 -0
  557. package/dist/elements/Toast/Toaster.d.ts.map +1 -0
  558. package/dist/elements/Toast/index.d.ts +27 -0
  559. package/dist/elements/Toast/index.d.ts.map +1 -0
  560. package/dist/elements/Toast/index.js +60 -0
  561. package/dist/elements/Toast/index.js.map +1 -0
  562. package/dist/elements/Toast/index.mjs +7 -0
  563. package/dist/elements/Toast/index.mjs.map +1 -0
  564. package/dist/elements/Tooltip/Tooltip.d.ts +108 -0
  565. package/dist/elements/Tooltip/Tooltip.d.ts.map +1 -0
  566. package/dist/elements/Tooltip/Tooltip.types.d.ts +135 -0
  567. package/dist/elements/Tooltip/Tooltip.types.d.ts.map +1 -0
  568. package/dist/elements/Tooltip/index.d.ts +11 -0
  569. package/dist/elements/Tooltip/index.d.ts.map +1 -0
  570. package/dist/elements/Tooltip/index.js +59 -0
  571. package/dist/elements/Tooltip/index.js.map +1 -0
  572. package/dist/elements/Tooltip/index.mjs +6 -0
  573. package/dist/elements/Tooltip/index.mjs.map +1 -0
  574. package/dist/elements/index.css +23 -0
  575. package/dist/elements/index.css.map +1 -0
  576. package/dist/elements/index.d.ts +42 -0
  577. package/dist/elements/index.d.ts.map +1 -0
  578. package/dist/elements/index.js +839 -0
  579. package/dist/elements/index.js.map +1 -0
  580. package/dist/elements/index.mjs +42 -0
  581. package/dist/elements/index.mjs.map +1 -0
  582. package/dist/index.css +23 -0
  583. package/dist/index.css.map +1 -0
  584. package/dist/index.d.ts +4 -0
  585. package/dist/index.d.ts.map +1 -0
  586. package/dist/index.js +865 -0
  587. package/dist/index.js.map +1 -0
  588. package/dist/index.mjs +44 -0
  589. package/dist/index.mjs.map +1 -0
  590. package/dist/schemas/BaseComponentProps.d.ts +25 -0
  591. package/dist/schemas/BaseComponentProps.d.ts.map +1 -0
  592. package/dist/schemas/RegistryItem.d.ts +55 -0
  593. package/dist/schemas/RegistryItem.d.ts.map +1 -0
  594. package/dist/schemas/index.d.ts +3 -0
  595. package/dist/schemas/index.d.ts.map +1 -0
  596. package/dist/schemas/index.js +29 -0
  597. package/dist/schemas/index.js.map +1 -0
  598. package/dist/schemas/index.mjs +4 -0
  599. package/dist/schemas/index.mjs.map +1 -0
  600. package/dist/styles/defaults.css +174 -0
  601. package/dist/styles/index.d.ts +7 -0
  602. package/dist/styles/index.d.ts.map +1 -0
  603. package/dist/styles/index.js +153 -0
  604. package/dist/styles/index.js.map +1 -0
  605. package/dist/styles/index.mjs +4 -0
  606. package/dist/styles/index.mjs.map +1 -0
  607. package/dist/styles/interaction-states.d.ts +96 -0
  608. package/dist/styles/interaction-states.d.ts.map +1 -0
  609. package/dist/styles/shared-variants.d.ts +120 -0
  610. package/dist/styles/shared-variants.d.ts.map +1 -0
  611. package/dist/styles/tokens.css +89 -0
  612. package/dist/utils/cn.d.ts +13 -0
  613. package/dist/utils/cn.d.ts.map +1 -0
  614. package/dist/utils/index.d.ts +2 -0
  615. package/dist/utils/index.d.ts.map +1 -0
  616. package/dist/utils/index.js +13 -0
  617. package/dist/utils/index.js.map +1 -0
  618. package/dist/utils/index.mjs +4 -0
  619. package/dist/utils/index.mjs.map +1 -0
  620. package/package.json +228 -0
  621. package/src/elements/Accordion/Accordion.stories.tsx +793 -0
  622. package/src/elements/Avatar/Avatar.stories.tsx +408 -0
  623. package/src/elements/Badge/Badge.stories.tsx +509 -0
  624. package/src/elements/Breadcrumbs/Breadcrumbs.stories.tsx +623 -0
  625. package/src/elements/Button/Button.stories.tsx +670 -0
  626. package/src/elements/ButtonGroup/ButtonGroup.stories.tsx +658 -0
  627. package/src/elements/Card/Card.stories.tsx +570 -0
  628. package/src/elements/Carousel/Carousel.stories.tsx +597 -0
  629. package/src/elements/Chart/Chart.stories.tsx +616 -0
  630. package/src/elements/Checkbox/Checkbox.stories.tsx +514 -0
  631. package/src/elements/CheckboxGroup/CheckboxGroup.stories.tsx +1514 -0
  632. package/src/elements/DatePicker/DatePicker.stories.tsx +341 -0
  633. package/src/elements/Dropdown/Dropdown.stories.tsx +397 -0
  634. package/src/elements/FileField/FileField.stories.tsx +1021 -0
  635. package/src/elements/FileField/FileProgress.stories.tsx +359 -0
  636. package/src/elements/FormLayout/FormLayout.stories.tsx +637 -0
  637. package/src/elements/Modal/Modal.stories.tsx +640 -0
  638. package/src/elements/NumberField/NumberField.stories.tsx +678 -0
  639. package/src/elements/OTPInput/OTPInput.stories.tsx +404 -0
  640. package/src/elements/Panel/Panel.stories.tsx +769 -0
  641. package/src/elements/Progress/Progress.stories.tsx +668 -0
  642. package/src/elements/RadioGroup/RadioGroup.stories.tsx +1153 -0
  643. package/src/elements/Resizable/Resizable.stories.tsx +374 -0
  644. package/src/elements/Select/Select.stories.tsx +362 -0
  645. package/src/elements/Skeleton/Skeleton.stories.tsx +284 -0
  646. package/src/elements/Switch/Switch.stories.tsx +441 -0
  647. package/src/elements/Table/Table.stories.tsx +790 -0
  648. package/src/elements/Tabs/Tabs.stories.tsx +661 -0
  649. package/src/elements/TextField/TextField.stories.tsx +1878 -0
  650. package/src/elements/TimeField/TimeField.stories.tsx +671 -0
  651. package/src/elements/Toast/Toast.stories.tsx +971 -0
  652. package/src/elements/Tooltip/Tooltip.stories.tsx +748 -0
  653. package/tailwind.config.js +10 -0
  654. package/tailwind.config.v3.js +10 -0
@@ -0,0 +1,1757 @@
1
+ import { tooltipContentVariants } from './chunk-DZ556D2F.mjs';
2
+ import { cn } from './chunk-E2KQFV3O.mjs';
3
+ import { BaseComponentPropsSchema } from './chunk-5SVLJN2C.mjs';
4
+ import { createContext, forwardRef, useRef, useId, memo, useState, useMemo, useCallback, useEffect, useContext } from 'react';
5
+ import { cva } from 'class-variance-authority';
6
+ import { jsxs, jsx, Fragment } from 'react/jsx-runtime';
7
+ import { VisuallyHidden, useFocusRing } from 'react-aria';
8
+ import { z } from 'zod';
9
+
10
+ var chartVariants = cva(
11
+ // Base classes
12
+ "relative w-full overflow-hidden rounded-lg border",
13
+ {
14
+ variants: {
15
+ variant: {
16
+ default: "border-[var(--border)] bg-[var(--content-background)]",
17
+ muted: "border-[var(--accent-background)] bg-[var(--accent-background)]/50"
18
+ }
19
+ },
20
+ defaultVariants: {
21
+ variant: "default"
22
+ }
23
+ }
24
+ );
25
+ var dataPointVariants = cva(
26
+ // Base classes
27
+ "cursor-pointer focus-visible:outline-none",
28
+ {
29
+ variants: {
30
+ type: {
31
+ bar: "",
32
+ // Fill color set dynamically per series
33
+ line: "stroke-2"
34
+ // Stroke color set dynamically per series
35
+ },
36
+ state: {
37
+ default: "",
38
+ focused: "",
39
+ // Focus ring provides visual feedback, no scale needed for data points
40
+ selected: "opacity-80"
41
+ }
42
+ },
43
+ defaultVariants: {
44
+ type: "bar",
45
+ state: "default"
46
+ }
47
+ }
48
+ );
49
+ cva(
50
+ // Base classes
51
+ "pointer-events-none",
52
+ {
53
+ variants: {
54
+ visible: {
55
+ true: "opacity-100",
56
+ false: "opacity-0"
57
+ }
58
+ },
59
+ defaultVariants: {
60
+ visible: false
61
+ }
62
+ }
63
+ );
64
+ var legendVariants = cva(
65
+ // Base classes - horizontal flex layout below chart
66
+ "flex flex-wrap items-center justify-center gap-4 px-4 py-2",
67
+ {
68
+ variants: {
69
+ visible: {
70
+ true: "",
71
+ false: "hidden"
72
+ }
73
+ },
74
+ defaultVariants: {
75
+ visible: true
76
+ }
77
+ }
78
+ );
79
+
80
+ // src/elements/Chart/chart.constants.ts
81
+ var CHART_ASPECT_RATIO = 9 / 16;
82
+ var CHART_PADDING = {
83
+ top: 20,
84
+ // Space for title overflow
85
+ right: 20,
86
+ // Space for y-axis label
87
+ bottom: 60,
88
+ // Space for x-axis labels + legend
89
+ left: 60
90
+ // Space for y-axis labels
91
+ };
92
+ var MIN_CHART_WIDTH = 300;
93
+ var MIN_CHART_HEIGHT = 169;
94
+ var BAR_GROUP_PADDING = 0.2;
95
+ var BAR_PADDING = 0.1;
96
+ var MIN_BAR_WIDTH = 20;
97
+ var BAR_RADIUS = 4;
98
+ var LINE_STROKE_WIDTH = 2;
99
+ var POINT_RADIUS = 6;
100
+ var LINE_PATTERNS = {
101
+ solid: "none",
102
+ dashed: "8 4",
103
+ // 8px dash, 4px gap
104
+ dotted: "2 4"
105
+ // 2px dot, 4px gap
106
+ };
107
+ var GRID_COLOR = "var(--border)";
108
+ var GRID_STROKE_WIDTH = 1;
109
+ var GRID_STROKE_OPACITY = 0.7;
110
+ var AXIS_COLOR = "var(--border)";
111
+ var AXIS_STROKE_WIDTH = 1;
112
+ var AXIS_TICK_SIZE = 6;
113
+ var AXIS_LABEL_FONT_SIZE = 12;
114
+ var MIN_TOUCH_TARGET = 44;
115
+ var FOCUS_RING_OFFSET = 4;
116
+ var FOCUS_RING_WIDTH = 2;
117
+ var DEFAULT_SERIES_COLORS = [
118
+ "var(--chart-1, hsl(221 83% 53%))",
119
+ // Series 0 - Blue
120
+ "var(--chart-2, hsl(142 71% 45%))",
121
+ // Series 1 - Green
122
+ "var(--chart-3, hsl(38 92% 50%))",
123
+ // Series 2 - Orange
124
+ "var(--chart-4, hsl(262 83% 58%))",
125
+ // Series 3 - Purple
126
+ "var(--chart-5, hsl(0 84% 60%))"
127
+ // Series 4 - Red
128
+ ];
129
+ function niceNum(range, round) {
130
+ const exponent = Math.floor(Math.log10(range));
131
+ const fraction = range / Math.pow(10, exponent);
132
+ let niceFraction;
133
+ if (round) {
134
+ if (fraction < 1.5) niceFraction = 1;
135
+ else if (fraction < 3) niceFraction = 2;
136
+ else if (fraction < 7) niceFraction = 5;
137
+ else niceFraction = 10;
138
+ } else {
139
+ if (fraction <= 1) niceFraction = 1;
140
+ else if (fraction <= 2) niceFraction = 2;
141
+ else if (fraction <= 5) niceFraction = 5;
142
+ else niceFraction = 10;
143
+ }
144
+ return niceFraction * Math.pow(10, exponent);
145
+ }
146
+ function calculateYAxisTicks(minValue, maxValue, tickCount = 5) {
147
+ if (minValue === maxValue) {
148
+ if (minValue === 0) {
149
+ return [0, 25, 50, 75, 100];
150
+ }
151
+ minValue = minValue * 0.9;
152
+ maxValue = maxValue * 1.1;
153
+ }
154
+ const range = niceNum(maxValue - minValue, false);
155
+ const tickSpacing = niceNum(range / (tickCount - 1), true);
156
+ const niceMin = Math.floor(minValue / tickSpacing) * tickSpacing;
157
+ const niceMax = Math.ceil(maxValue / tickSpacing) * tickSpacing;
158
+ const ticks = [];
159
+ for (let tick = niceMin; tick <= niceMax; tick += tickSpacing) {
160
+ ticks.push(tick);
161
+ }
162
+ return ticks;
163
+ }
164
+ function calculateBarLayout(plotWidth, labelCount, seriesCount, plotX = 0) {
165
+ const groupWidth = plotWidth / labelCount;
166
+ const availableWidth = groupWidth * (1 - BAR_GROUP_PADDING);
167
+ const barWidth = Math.max(
168
+ MIN_BAR_WIDTH,
169
+ availableWidth / seriesCount * (1 - BAR_PADDING)
170
+ );
171
+ const getBarX = (labelIdx, seriesIdx) => {
172
+ const groupCenter = plotX + groupWidth * labelIdx + groupWidth / 2;
173
+ const totalBarsWidth = seriesCount * barWidth + (seriesCount - 1) * (BAR_PADDING * barWidth);
174
+ const barsStart = groupCenter - totalBarsWidth / 2;
175
+ return barsStart + seriesIdx * (barWidth + BAR_PADDING * barWidth);
176
+ };
177
+ return { barWidth, groupWidth, getBarX };
178
+ }
179
+
180
+ // src/elements/Chart/useChartDimensions.ts
181
+ function useChartDimensions(containerRef) {
182
+ const [dimensions, setDimensions] = useState({
183
+ width: MIN_CHART_WIDTH,
184
+ height: MIN_CHART_HEIGHT,
185
+ padding: CHART_PADDING,
186
+ plotArea: {
187
+ x: CHART_PADDING.left,
188
+ y: CHART_PADDING.top,
189
+ width: MIN_CHART_WIDTH - CHART_PADDING.left - CHART_PADDING.right,
190
+ height: MIN_CHART_HEIGHT - CHART_PADDING.top - CHART_PADDING.bottom
191
+ }
192
+ });
193
+ useEffect(() => {
194
+ const container = containerRef.current;
195
+ if (!container) return;
196
+ const updateDimensions = (width) => {
197
+ const constrainedWidth = Math.max(width, MIN_CHART_WIDTH);
198
+ const height = Math.max(
199
+ constrainedWidth * CHART_ASPECT_RATIO,
200
+ MIN_CHART_HEIGHT
201
+ );
202
+ const plotArea = {
203
+ x: CHART_PADDING.left,
204
+ y: CHART_PADDING.top,
205
+ width: constrainedWidth - CHART_PADDING.left - CHART_PADDING.right,
206
+ height: height - CHART_PADDING.top - CHART_PADDING.bottom
207
+ };
208
+ setDimensions({
209
+ width: constrainedWidth,
210
+ height,
211
+ padding: CHART_PADDING,
212
+ plotArea
213
+ });
214
+ };
215
+ const observer = new ResizeObserver((entries) => {
216
+ const entry = entries[0];
217
+ if (!entry) return;
218
+ updateDimensions(entry.contentRect.width);
219
+ });
220
+ updateDimensions(container.getBoundingClientRect().width);
221
+ observer.observe(container);
222
+ return () => {
223
+ observer.disconnect();
224
+ };
225
+ }, [containerRef]);
226
+ return dimensions;
227
+ }
228
+ function useRovingTabIndex2D(options) {
229
+ const {
230
+ rows,
231
+ cols,
232
+ initialRow = 0,
233
+ initialCol = 0,
234
+ wrap = false,
235
+ onFocusChange
236
+ } = options;
237
+ const [focusedRow, setFocusedRow] = useState(initialRow);
238
+ const [focusedCol, setFocusedCol] = useState(initialCol);
239
+ const getColCount = useCallback(
240
+ (row) => {
241
+ return typeof cols === "function" ? cols(row) : cols;
242
+ },
243
+ [cols]
244
+ );
245
+ const notifyFocusChange = useCallback(
246
+ (row, col) => {
247
+ onFocusChange?.(row, col);
248
+ },
249
+ [onFocusChange]
250
+ );
251
+ const moveRight = useCallback(() => {
252
+ setFocusedCol((currentCol) => {
253
+ const maxCol = getColCount(focusedRow) - 1;
254
+ let newCol = currentCol + 1;
255
+ if (newCol > maxCol) {
256
+ newCol = wrap ? 0 : maxCol;
257
+ }
258
+ if (newCol !== currentCol) {
259
+ notifyFocusChange(focusedRow, newCol);
260
+ }
261
+ return newCol;
262
+ });
263
+ }, [focusedRow, getColCount, wrap, notifyFocusChange]);
264
+ const moveLeft = useCallback(() => {
265
+ setFocusedCol((currentCol) => {
266
+ let newCol = currentCol - 1;
267
+ const maxCol = getColCount(focusedRow) - 1;
268
+ if (newCol < 0) {
269
+ newCol = wrap ? maxCol : 0;
270
+ }
271
+ if (newCol !== currentCol) {
272
+ notifyFocusChange(focusedRow, newCol);
273
+ }
274
+ return newCol;
275
+ });
276
+ }, [focusedRow, getColCount, wrap, notifyFocusChange]);
277
+ const moveDown = useCallback(() => {
278
+ setFocusedRow((currentRow) => {
279
+ let newRow = currentRow + 1;
280
+ if (newRow >= rows) {
281
+ newRow = wrap ? 0 : rows - 1;
282
+ }
283
+ if (newRow !== currentRow) {
284
+ const newMaxCol = getColCount(newRow) - 1;
285
+ setFocusedCol((col) => {
286
+ const constrainedCol = Math.min(col, newMaxCol);
287
+ notifyFocusChange(newRow, constrainedCol);
288
+ return constrainedCol;
289
+ });
290
+ }
291
+ return newRow;
292
+ });
293
+ }, [rows, getColCount, wrap, notifyFocusChange]);
294
+ const moveUp = useCallback(() => {
295
+ setFocusedRow((currentRow) => {
296
+ let newRow = currentRow - 1;
297
+ if (newRow < 0) {
298
+ newRow = wrap ? rows - 1 : 0;
299
+ }
300
+ if (newRow !== currentRow) {
301
+ const newMaxCol = getColCount(newRow) - 1;
302
+ setFocusedCol((col) => {
303
+ const constrainedCol = Math.min(col, newMaxCol);
304
+ notifyFocusChange(newRow, constrainedCol);
305
+ return constrainedCol;
306
+ });
307
+ }
308
+ return newRow;
309
+ });
310
+ }, [rows, getColCount, wrap, notifyFocusChange]);
311
+ const moveToStart = useCallback(() => {
312
+ setFocusedCol(0);
313
+ notifyFocusChange(focusedRow, 0);
314
+ }, [focusedRow, notifyFocusChange]);
315
+ const moveToEnd = useCallback(() => {
316
+ const maxCol = getColCount(focusedRow) - 1;
317
+ setFocusedCol(maxCol);
318
+ notifyFocusChange(focusedRow, maxCol);
319
+ }, [focusedRow, getColCount, notifyFocusChange]);
320
+ const setFocus = useCallback(
321
+ (row, col) => {
322
+ const constrainedRow = Math.max(0, Math.min(row, rows - 1));
323
+ const maxCol = getColCount(constrainedRow) - 1;
324
+ const constrainedCol = Math.max(0, Math.min(col, maxCol));
325
+ setFocusedRow(constrainedRow);
326
+ setFocusedCol(constrainedCol);
327
+ notifyFocusChange(constrainedRow, constrainedCol);
328
+ },
329
+ [rows, getColCount, notifyFocusChange]
330
+ );
331
+ const getTabIndex = useCallback(
332
+ (row, col) => {
333
+ return row === focusedRow && col === focusedCol ? 0 : -1;
334
+ },
335
+ [focusedRow, focusedCol]
336
+ );
337
+ return useMemo(
338
+ () => ({
339
+ focusedRow,
340
+ focusedCol,
341
+ moveRight,
342
+ moveLeft,
343
+ moveDown,
344
+ moveUp,
345
+ moveToStart,
346
+ moveToEnd,
347
+ setFocus,
348
+ getTabIndex
349
+ }),
350
+ [
351
+ focusedRow,
352
+ focusedCol,
353
+ moveRight,
354
+ moveLeft,
355
+ moveDown,
356
+ moveUp,
357
+ moveToStart,
358
+ moveToEnd,
359
+ setFocus,
360
+ getTabIndex
361
+ ]
362
+ );
363
+ }
364
+ var ChartContext = createContext(null);
365
+ function useChartContext() {
366
+ const context = useContext(ChartContext);
367
+ if (!context) {
368
+ throw new Error("useChartContext must be used within a ChartProvider");
369
+ }
370
+ return context;
371
+ }
372
+ function getAllLabels(data) {
373
+ const labelSet = /* @__PURE__ */ new Set();
374
+ data.forEach((series) => {
375
+ series.data.forEach((point) => {
376
+ labelSet.add(point.label);
377
+ });
378
+ });
379
+ return Array.from(labelSet);
380
+ }
381
+ function calculateScales(data, dimensions, startAtZero) {
382
+ const allLabels = getAllLabels(data);
383
+ const { plotArea } = dimensions;
384
+ let dataMin = Infinity;
385
+ let dataMax = -Infinity;
386
+ data.forEach((series) => {
387
+ series.data.forEach((point) => {
388
+ dataMin = Math.min(dataMin, point.value);
389
+ dataMax = Math.max(dataMax, point.value);
390
+ });
391
+ });
392
+ if (!isFinite(dataMin) || !isFinite(dataMax)) {
393
+ dataMin = 0;
394
+ dataMax = 100;
395
+ }
396
+ const yMin = startAtZero ? Math.min(0, dataMin) : dataMin;
397
+ const yTicks = calculateYAxisTicks(yMin, dataMax);
398
+ const yMax = yTicks[yTicks.length - 1] || dataMax;
399
+ const adjustedYMin = yTicks[0] || yMin;
400
+ const xScale = (labelIndex) => {
401
+ if (allLabels.length <= 1) return plotArea.x + plotArea.width / 2;
402
+ const step = plotArea.width / allLabels.length;
403
+ return plotArea.x + step * labelIndex + step / 2;
404
+ };
405
+ const yRange = yMax - adjustedYMin || 1;
406
+ const yScale = (value) => {
407
+ const normalized = (value - adjustedYMin) / yRange;
408
+ return plotArea.y + plotArea.height * (1 - normalized);
409
+ };
410
+ return {
411
+ allLabels,
412
+ xScale,
413
+ yScale,
414
+ yMin: adjustedYMin,
415
+ yMax,
416
+ yTicks
417
+ };
418
+ }
419
+ function ChartProvider({
420
+ children,
421
+ containerRef,
422
+ data,
423
+ type,
424
+ title,
425
+ description,
426
+ xAxisLabel,
427
+ yAxisLabel,
428
+ showTooltip,
429
+ showGrid,
430
+ showLegend,
431
+ announceTrends,
432
+ trendUpFormat,
433
+ trendDownFormat,
434
+ startAtZero,
435
+ reducedMotion = true,
436
+ onPointFocus: onPointFocusProp,
437
+ onPointSelect: onPointSelectProp
438
+ }) {
439
+ const [selectedPoint, setSelectedPoint] = useState(null);
440
+ const [announcement, setAnnouncement] = useState("");
441
+ const [isTooltipVisible, setIsTooltipVisible] = useState(false);
442
+ const [tooltipPoint, setTooltipPoint] = useState(null);
443
+ const [currentTrend, setCurrentTrend] = useState(null);
444
+ const [currentTrendDirection, setCurrentTrendDirection] = useState(null);
445
+ const dimensions = useChartDimensions(containerRef);
446
+ const scales = useMemo(
447
+ () => calculateScales(data, dimensions, startAtZero),
448
+ [data, dimensions, startAtZero]
449
+ );
450
+ void useMemo(
451
+ () => Math.max(...data.map((s) => s.data.length)),
452
+ [data]
453
+ );
454
+ const formatTrendText = useCallback(
455
+ (percent, isUp) => {
456
+ const format = isUp ? trendUpFormat : trendDownFormat;
457
+ return format.replace("{percent}", String(percent));
458
+ },
459
+ [trendUpFormat, trendDownFormat]
460
+ );
461
+ const getTrendInfo = (seriesIndex, pointIndex) => {
462
+ if (!announceTrends || pointIndex <= 0) return null;
463
+ const series = data[seriesIndex];
464
+ if (!series) return null;
465
+ const currentPoint = series.data[pointIndex];
466
+ const previousPoint = series.data[pointIndex - 1];
467
+ if (!currentPoint || !previousPoint || previousPoint.value === 0) {
468
+ return null;
469
+ }
470
+ const change = (currentPoint.value - previousPoint.value) / Math.abs(previousPoint.value) * 100;
471
+ const isUp = change >= 0;
472
+ const percent = Math.abs(Math.round(change));
473
+ return {
474
+ text: formatTrendText(percent, isUp),
475
+ direction: isUp ? "up" : "down"
476
+ };
477
+ };
478
+ const roving = useRovingTabIndex2D({
479
+ rows: data.length,
480
+ cols: (row) => data[row]?.data.length || 0,
481
+ onFocusChange: (seriesIndex, pointIndex) => {
482
+ const series = data[seriesIndex];
483
+ const point = series?.data[pointIndex];
484
+ if (!series || !point) return;
485
+ const trendInfo = getTrendInfo(seriesIndex, pointIndex);
486
+ setCurrentTrend(trendInfo?.text ?? null);
487
+ setCurrentTrendDirection(trendInfo?.direction ?? null);
488
+ const position = `${pointIndex + 1} of ${series.data.length}`;
489
+ const seriesInfo = data.length > 1 ? `${series.name}: ` : "";
490
+ const formattedValue = formatValue(point.value);
491
+ const announcementTrend = trendInfo ? `, ${trendInfo.text}` : "";
492
+ setAnnouncement(
493
+ `${seriesInfo}${point.label}, ${formattedValue}${announcementTrend}. ${position}.`
494
+ );
495
+ if (showTooltip) {
496
+ setIsTooltipVisible(true);
497
+ setTooltipPoint({ series: seriesIndex, point: pointIndex });
498
+ }
499
+ onPointFocusProp?.(point, seriesIndex, pointIndex);
500
+ }
501
+ });
502
+ const formatValue = useCallback((value2) => {
503
+ const locale = typeof navigator !== "undefined" ? navigator.language : "en-US";
504
+ return new Intl.NumberFormat(locale).format(value2);
505
+ }, []);
506
+ const calculateTrendForPoint = useCallback(
507
+ (seriesIndex, pointIndex) => {
508
+ if (!announceTrends) return null;
509
+ if (pointIndex <= 0) return null;
510
+ const series = data[seriesIndex];
511
+ if (!series) return null;
512
+ const currentPoint = series.data[pointIndex];
513
+ const previousPoint = series.data[pointIndex - 1];
514
+ if (!currentPoint || !previousPoint || previousPoint.value === 0) {
515
+ return null;
516
+ }
517
+ const change = (currentPoint.value - previousPoint.value) / Math.abs(previousPoint.value) * 100;
518
+ const isUp = change >= 0;
519
+ const percent = Math.abs(Math.round(change));
520
+ return {
521
+ text: formatTrendText(percent, isUp),
522
+ direction: isUp ? "up" : "down"
523
+ };
524
+ },
525
+ [data, announceTrends, formatTrendText]
526
+ );
527
+ const getSeriesColor = useCallback((seriesIndex) => {
528
+ return DEFAULT_SERIES_COLORS[seriesIndex % DEFAULT_SERIES_COLORS.length] ?? "var(--chart-1)";
529
+ }, []);
530
+ const getPointCoordinates = useCallback(
531
+ (seriesIndex, pointIndex) => {
532
+ const series = data[seriesIndex];
533
+ const point = series?.data[pointIndex];
534
+ if (!series || !point) return null;
535
+ const labelIndex = scales.allLabels.indexOf(point.label);
536
+ if (labelIndex === -1) return null;
537
+ return {
538
+ x: scales.xScale(labelIndex),
539
+ y: scales.yScale(point.value)
540
+ };
541
+ },
542
+ [data, scales]
543
+ );
544
+ const setFocus = useCallback(
545
+ (series, point) => {
546
+ roving.setFocus(series, point);
547
+ },
548
+ [roving]
549
+ );
550
+ const selectPoint = useCallback(
551
+ (series, point) => {
552
+ setSelectedPoint({ series, point });
553
+ const seriesData = data[series];
554
+ const pointData = seriesData?.data[point];
555
+ if (seriesData && pointData) {
556
+ onPointSelectProp?.(pointData, series, point);
557
+ }
558
+ },
559
+ [data, onPointSelectProp]
560
+ );
561
+ const clearSelection = useCallback(() => {
562
+ setSelectedPoint(null);
563
+ }, []);
564
+ const announce = useCallback((message) => {
565
+ setAnnouncement(message);
566
+ }, []);
567
+ const showTooltipAt = useCallback(
568
+ (series, point) => {
569
+ if (showTooltip) {
570
+ setIsTooltipVisible(true);
571
+ setTooltipPoint({ series, point });
572
+ const trendResult = calculateTrendForPoint(series, point);
573
+ setCurrentTrend(trendResult?.text ?? null);
574
+ setCurrentTrendDirection(trendResult?.direction ?? null);
575
+ }
576
+ },
577
+ [showTooltip, calculateTrendForPoint]
578
+ );
579
+ const hideTooltip = useCallback(() => {
580
+ setIsTooltipVisible(false);
581
+ setTooltipPoint(null);
582
+ }, []);
583
+ const value = useMemo(
584
+ () => ({
585
+ // State
586
+ focusedSeries: roving.focusedRow,
587
+ focusedPoint: roving.focusedCol,
588
+ selectedPoint,
589
+ announcement,
590
+ isTooltipVisible,
591
+ tooltipPoint,
592
+ currentTrend,
593
+ currentTrendDirection,
594
+ // Computed
595
+ dimensions,
596
+ scales,
597
+ // Props passthrough
598
+ data,
599
+ type,
600
+ title,
601
+ description,
602
+ xAxisLabel,
603
+ yAxisLabel,
604
+ showTooltip,
605
+ showGrid,
606
+ showLegend,
607
+ announceTrends,
608
+ trendUpFormat,
609
+ trendDownFormat,
610
+ startAtZero,
611
+ reducedMotion,
612
+ // Actions
613
+ setFocus,
614
+ selectPoint,
615
+ clearSelection,
616
+ announce,
617
+ showTooltipAt,
618
+ hideTooltip,
619
+ // Helpers
620
+ getTabIndex: roving.getTabIndex,
621
+ formatValue,
622
+ getSeriesColor,
623
+ getPointCoordinates
624
+ }),
625
+ [
626
+ roving.focusedRow,
627
+ roving.focusedCol,
628
+ roving.getTabIndex,
629
+ selectedPoint,
630
+ announcement,
631
+ isTooltipVisible,
632
+ tooltipPoint,
633
+ currentTrend,
634
+ currentTrendDirection,
635
+ dimensions,
636
+ scales,
637
+ data,
638
+ type,
639
+ title,
640
+ description,
641
+ xAxisLabel,
642
+ yAxisLabel,
643
+ showTooltip,
644
+ showGrid,
645
+ showLegend,
646
+ announceTrends,
647
+ trendUpFormat,
648
+ trendDownFormat,
649
+ startAtZero,
650
+ reducedMotion,
651
+ setFocus,
652
+ selectPoint,
653
+ clearSelection,
654
+ announce,
655
+ showTooltipAt,
656
+ hideTooltip,
657
+ formatValue,
658
+ getSeriesColor,
659
+ getPointCoordinates
660
+ ]
661
+ );
662
+ return /* @__PURE__ */ jsx(ChartContext.Provider, { value, children });
663
+ }
664
+ function ChartGrid({
665
+ yTicks,
666
+ yScale,
667
+ plotX,
668
+ plotWidth,
669
+ visible
670
+ }) {
671
+ if (!visible) {
672
+ return null;
673
+ }
674
+ return /* @__PURE__ */ jsx("g", { className: "chart-grid", "aria-hidden": "true", "data-testid": "chart-grid", children: yTicks.map((tick) => {
675
+ const y = yScale(tick);
676
+ return /* @__PURE__ */ jsx(
677
+ "line",
678
+ {
679
+ x1: plotX,
680
+ y1: y,
681
+ x2: plotX + plotWidth,
682
+ y2: y,
683
+ stroke: GRID_COLOR,
684
+ strokeWidth: GRID_STROKE_WIDTH,
685
+ strokeOpacity: GRID_STROKE_OPACITY
686
+ },
687
+ tick
688
+ );
689
+ }) });
690
+ }
691
+ ChartGrid.displayName = "ChartGrid";
692
+ function ChartAxis({
693
+ allLabels,
694
+ yTicks,
695
+ xScale,
696
+ yScale,
697
+ plotArea,
698
+ xAxisLabel,
699
+ yAxisLabel,
700
+ formatValue
701
+ }) {
702
+ const { x: plotX, y: plotY, width: plotWidth, height: plotHeight } = plotArea;
703
+ return /* @__PURE__ */ jsxs("g", { className: "chart-axis", "aria-hidden": "true", "data-testid": "chart-axis", children: [
704
+ /* @__PURE__ */ jsx(
705
+ "line",
706
+ {
707
+ x1: plotX,
708
+ y1: plotY + plotHeight,
709
+ x2: plotX + plotWidth,
710
+ y2: plotY + plotHeight,
711
+ stroke: AXIS_COLOR,
712
+ strokeWidth: AXIS_STROKE_WIDTH
713
+ }
714
+ ),
715
+ /* @__PURE__ */ jsx(
716
+ "line",
717
+ {
718
+ x1: plotX,
719
+ y1: plotY,
720
+ x2: plotX,
721
+ y2: plotY + plotHeight,
722
+ stroke: AXIS_COLOR,
723
+ strokeWidth: AXIS_STROKE_WIDTH
724
+ }
725
+ ),
726
+ allLabels.map((label, index) => {
727
+ const x = xScale(index);
728
+ const y = plotY + plotHeight;
729
+ return /* @__PURE__ */ jsxs("g", { children: [
730
+ /* @__PURE__ */ jsx(
731
+ "line",
732
+ {
733
+ x1: x,
734
+ y1: y,
735
+ x2: x,
736
+ y2: y + AXIS_TICK_SIZE,
737
+ stroke: AXIS_COLOR,
738
+ strokeWidth: AXIS_STROKE_WIDTH
739
+ }
740
+ ),
741
+ /* @__PURE__ */ jsx(
742
+ "text",
743
+ {
744
+ x,
745
+ y: y + AXIS_TICK_SIZE + AXIS_LABEL_FONT_SIZE,
746
+ textAnchor: "middle",
747
+ fontSize: AXIS_LABEL_FONT_SIZE,
748
+ fill: "currentColor",
749
+ className: "text-[var(--content-foreground)]",
750
+ children: label
751
+ }
752
+ )
753
+ ] }, label);
754
+ }),
755
+ yTicks.map((tick) => {
756
+ const x = plotX;
757
+ const y = yScale(tick);
758
+ return /* @__PURE__ */ jsxs("g", { children: [
759
+ /* @__PURE__ */ jsx(
760
+ "line",
761
+ {
762
+ x1: x - AXIS_TICK_SIZE,
763
+ y1: y,
764
+ x2: x,
765
+ y2: y,
766
+ stroke: AXIS_COLOR,
767
+ strokeWidth: AXIS_STROKE_WIDTH
768
+ }
769
+ ),
770
+ /* @__PURE__ */ jsx(
771
+ "text",
772
+ {
773
+ x: x - AXIS_TICK_SIZE - 4,
774
+ y,
775
+ textAnchor: "end",
776
+ dominantBaseline: "middle",
777
+ fontSize: AXIS_LABEL_FONT_SIZE,
778
+ fill: "currentColor",
779
+ className: "text-[var(--content-foreground)]",
780
+ children: formatValue(tick)
781
+ }
782
+ )
783
+ ] }, tick);
784
+ }),
785
+ /* @__PURE__ */ jsx(
786
+ "text",
787
+ {
788
+ x: plotX + plotWidth / 2,
789
+ y: plotY + plotHeight + 45,
790
+ textAnchor: "middle",
791
+ fontSize: AXIS_LABEL_FONT_SIZE,
792
+ fill: "currentColor",
793
+ className: "text-[var(--content-foreground)] font-medium",
794
+ children: xAxisLabel
795
+ }
796
+ ),
797
+ /* @__PURE__ */ jsx(
798
+ "text",
799
+ {
800
+ x: 15,
801
+ y: plotY + plotHeight / 2,
802
+ textAnchor: "middle",
803
+ fontSize: AXIS_LABEL_FONT_SIZE,
804
+ fill: "currentColor",
805
+ className: "text-[var(--content-foreground)] font-medium",
806
+ transform: `rotate(-90, 15, ${plotY + plotHeight / 2})`,
807
+ children: yAxisLabel
808
+ }
809
+ )
810
+ ] });
811
+ }
812
+ ChartAxis.displayName = "ChartAxis";
813
+ function ChartDataPoint({
814
+ type,
815
+ x,
816
+ y,
817
+ width = POINT_RADIUS * 2,
818
+ height = POINT_RADIUS * 2,
819
+ color,
820
+ seriesIndex,
821
+ pointIndex,
822
+ tabIndex,
823
+ label,
824
+ isSelected = false,
825
+ onFocus,
826
+ onBlur,
827
+ onHover,
828
+ onHoverEnd,
829
+ onKeyDown
830
+ }) {
831
+ const ref = useRef(null);
832
+ const { isFocusVisible, focusProps } = useFocusRing();
833
+ useEffect(() => {
834
+ if (tabIndex === 0 && ref.current) {
835
+ const activeElement = document.activeElement;
836
+ const isChartFocused = activeElement?.closest('[role="graphics-document"]') !== null;
837
+ if (isChartFocused) {
838
+ ref.current.focus();
839
+ }
840
+ }
841
+ }, [tabIndex]);
842
+ const hitAreaSize = Math.max(MIN_TOUCH_TARGET, width, height);
843
+ const hitX = type === "bar" ? x - (hitAreaSize - width) / 2 : x - hitAreaSize / 2;
844
+ const hitY = type === "bar" ? y - (hitAreaSize - height) / 2 : y - hitAreaSize / 2;
845
+ const handleFocus = (event) => {
846
+ focusProps.onFocus?.(event);
847
+ onFocus?.(seriesIndex, pointIndex);
848
+ };
849
+ const handleBlur = (event) => {
850
+ focusProps.onBlur?.(event);
851
+ onBlur?.();
852
+ };
853
+ const handleMouseEnter = (_event) => {
854
+ onHover?.(seriesIndex, pointIndex);
855
+ };
856
+ const handleMouseLeave = (_event) => {
857
+ onHoverEnd?.();
858
+ };
859
+ const state = isSelected ? "selected" : isFocusVisible ? "focused" : "default";
860
+ return /* @__PURE__ */ jsxs(
861
+ "g",
862
+ {
863
+ ref,
864
+ role: "listitem",
865
+ tabIndex,
866
+ "aria-label": label,
867
+ className: dataPointVariants({ type, state }),
868
+ onFocus: handleFocus,
869
+ onBlur: handleBlur,
870
+ onMouseEnter: handleMouseEnter,
871
+ onMouseLeave: handleMouseLeave,
872
+ onKeyDown,
873
+ "data-testid": `chart-point-${seriesIndex}-${pointIndex}`,
874
+ children: [
875
+ /* @__PURE__ */ jsx(
876
+ "rect",
877
+ {
878
+ x: hitX,
879
+ y: hitY,
880
+ width: hitAreaSize,
881
+ height: hitAreaSize,
882
+ fill: "transparent",
883
+ className: "cursor-pointer"
884
+ }
885
+ ),
886
+ type === "bar" ? /* @__PURE__ */ jsx(
887
+ "rect",
888
+ {
889
+ x,
890
+ y,
891
+ width,
892
+ height,
893
+ rx: BAR_RADIUS,
894
+ ry: BAR_RADIUS,
895
+ fill: color,
896
+ className: "chart-bar"
897
+ }
898
+ ) : /* @__PURE__ */ jsx(
899
+ "circle",
900
+ {
901
+ cx: x,
902
+ cy: y,
903
+ r: POINT_RADIUS,
904
+ fill: color,
905
+ className: "chart-point"
906
+ }
907
+ ),
908
+ isFocusVisible && (type === "bar" ? /* @__PURE__ */ jsx(
909
+ "rect",
910
+ {
911
+ x: x - FOCUS_RING_OFFSET,
912
+ y: y - FOCUS_RING_OFFSET,
913
+ width: width + FOCUS_RING_OFFSET * 2,
914
+ height: height + FOCUS_RING_OFFSET * 2,
915
+ rx: BAR_RADIUS + FOCUS_RING_OFFSET,
916
+ ry: BAR_RADIUS + FOCUS_RING_OFFSET,
917
+ fill: "none",
918
+ stroke: "var(--ring)",
919
+ strokeWidth: FOCUS_RING_WIDTH,
920
+ className: "chart-focus-ring"
921
+ }
922
+ ) : /* @__PURE__ */ jsx(
923
+ "circle",
924
+ {
925
+ cx: x,
926
+ cy: y,
927
+ r: POINT_RADIUS + FOCUS_RING_OFFSET,
928
+ fill: "none",
929
+ stroke: "var(--ring)",
930
+ strokeWidth: FOCUS_RING_WIDTH,
931
+ className: "chart-focus-ring"
932
+ }
933
+ ))
934
+ ]
935
+ }
936
+ );
937
+ }
938
+ ChartDataPoint.displayName = "ChartDataPoint";
939
+ function ChartBarSeries({
940
+ series,
941
+ seriesIndex,
942
+ totalSeries,
943
+ dimensions,
944
+ scales,
945
+ color,
946
+ getTabIndex,
947
+ selectedPoint,
948
+ onPointFocus,
949
+ onPointBlur,
950
+ onPointHover,
951
+ onPointHoverEnd,
952
+ onKeyDown,
953
+ formatValue
954
+ }) {
955
+ const { plotArea } = dimensions;
956
+ const { allLabels, xScale: _xScale, yScale, yMin } = scales;
957
+ const { barWidth, getBarX } = calculateBarLayout(
958
+ plotArea.width,
959
+ allLabels.length,
960
+ totalSeries,
961
+ plotArea.x
962
+ );
963
+ const baselineY = yScale(Math.max(0, yMin));
964
+ return /* @__PURE__ */ jsx(
965
+ "g",
966
+ {
967
+ className: "chart-bar-series",
968
+ role: "list",
969
+ "aria-label": `${series.name} series`,
970
+ "data-testid": `chart-series-${seriesIndex}`,
971
+ children: series.data.map((point, pointIndex) => {
972
+ const labelIndex = allLabels.indexOf(point.label);
973
+ if (labelIndex === -1) return null;
974
+ const barX = getBarX(labelIndex, seriesIndex);
975
+ const barY = yScale(point.value);
976
+ const barHeight = Math.abs(baselineY - barY);
977
+ const finalBarY = point.value >= 0 ? barY : baselineY;
978
+ const isSelected = selectedPoint?.series === seriesIndex && selectedPoint?.point === pointIndex;
979
+ const accessibleLabel = `${series.name}: ${point.label}, ${formatValue(point.value)}`;
980
+ return /* @__PURE__ */ jsx(
981
+ ChartDataPoint,
982
+ {
983
+ type: "bar",
984
+ x: barX,
985
+ y: finalBarY,
986
+ width: barWidth,
987
+ height: barHeight,
988
+ color,
989
+ seriesIndex,
990
+ pointIndex,
991
+ tabIndex: getTabIndex(seriesIndex, pointIndex),
992
+ label: accessibleLabel,
993
+ isSelected,
994
+ onFocus: onPointFocus,
995
+ onBlur: onPointBlur,
996
+ onHover: onPointHover,
997
+ onHoverEnd: onPointHoverEnd,
998
+ onKeyDown
999
+ },
1000
+ `${point.label}-${pointIndex}`
1001
+ );
1002
+ })
1003
+ }
1004
+ );
1005
+ }
1006
+ ChartBarSeries.displayName = "ChartBarSeries";
1007
+ function ChartLineSeries({
1008
+ series,
1009
+ seriesIndex,
1010
+ scales,
1011
+ color,
1012
+ pattern,
1013
+ getTabIndex,
1014
+ selectedPoint,
1015
+ onPointFocus,
1016
+ onPointBlur,
1017
+ onPointHover,
1018
+ onPointHoverEnd,
1019
+ onKeyDown,
1020
+ formatValue
1021
+ }) {
1022
+ const { allLabels, xScale, yScale } = scales;
1023
+ const points = useMemo(() => {
1024
+ return series.data.map((point, pointIndex) => {
1025
+ const labelIndex = allLabels.indexOf(point.label);
1026
+ if (labelIndex === -1) return null;
1027
+ return {
1028
+ x: xScale(labelIndex),
1029
+ y: yScale(point.value),
1030
+ point,
1031
+ pointIndex,
1032
+ labelIndex
1033
+ };
1034
+ }).filter((p) => p !== null).sort((a, b) => a.labelIndex - b.labelIndex);
1035
+ }, [series.data, allLabels, xScale, yScale]);
1036
+ const pathD = useMemo(() => {
1037
+ if (points.length === 0) return "";
1038
+ return points.map((p, i) => `${i === 0 ? "M" : "L"} ${p.x} ${p.y}`).join(" ");
1039
+ }, [points]);
1040
+ const strokeDasharray = LINE_PATTERNS[pattern] === "none" ? void 0 : LINE_PATTERNS[pattern];
1041
+ return /* @__PURE__ */ jsxs(
1042
+ "g",
1043
+ {
1044
+ className: "chart-line-series",
1045
+ role: "list",
1046
+ "aria-label": `${series.name} series`,
1047
+ "data-testid": `chart-series-${seriesIndex}`,
1048
+ children: [
1049
+ /* @__PURE__ */ jsx(
1050
+ "path",
1051
+ {
1052
+ d: pathD,
1053
+ fill: "none",
1054
+ stroke: color,
1055
+ strokeWidth: LINE_STROKE_WIDTH,
1056
+ strokeDasharray,
1057
+ strokeLinecap: "round",
1058
+ strokeLinejoin: "round",
1059
+ className: "chart-line",
1060
+ "aria-hidden": "true"
1061
+ }
1062
+ ),
1063
+ points.map(({ x, y, point, pointIndex }) => {
1064
+ const isSelected = selectedPoint?.series === seriesIndex && selectedPoint?.point === pointIndex;
1065
+ const accessibleLabel = `${series.name}: ${point.label}, ${formatValue(point.value)}`;
1066
+ return /* @__PURE__ */ jsx(
1067
+ ChartDataPoint,
1068
+ {
1069
+ type: "line",
1070
+ x,
1071
+ y,
1072
+ color,
1073
+ seriesIndex,
1074
+ pointIndex,
1075
+ tabIndex: getTabIndex(seriesIndex, pointIndex),
1076
+ label: accessibleLabel,
1077
+ isSelected,
1078
+ onFocus: onPointFocus,
1079
+ onBlur: onPointBlur,
1080
+ onHover: onPointHover,
1081
+ onHoverEnd: onPointHoverEnd,
1082
+ onKeyDown
1083
+ },
1084
+ `${point.label}-${pointIndex}`
1085
+ );
1086
+ })
1087
+ ]
1088
+ }
1089
+ );
1090
+ }
1091
+ ChartLineSeries.displayName = "ChartLineSeries";
1092
+ function ChartSVG({
1093
+ type,
1094
+ data,
1095
+ dimensions,
1096
+ scales,
1097
+ titleId,
1098
+ descId,
1099
+ showGrid,
1100
+ xAxisLabel,
1101
+ yAxisLabel,
1102
+ getSeriesColor,
1103
+ getTabIndex,
1104
+ selectedPoint,
1105
+ formatValue,
1106
+ onKeyDown,
1107
+ onPointFocus,
1108
+ onPointBlur,
1109
+ onPointHover,
1110
+ onPointHoverEnd
1111
+ }) {
1112
+ const { width, height, plotArea } = dimensions;
1113
+ const { allLabels, xScale, yScale, yTicks } = scales;
1114
+ return /* @__PURE__ */ jsxs(
1115
+ "svg",
1116
+ {
1117
+ role: "graphics-document",
1118
+ "aria-roledescription": `${type} chart`,
1119
+ "aria-labelledby": titleId,
1120
+ "aria-describedby": descId,
1121
+ viewBox: `0 0 ${width} ${height}`,
1122
+ className: "h-full w-full",
1123
+ style: { maxHeight: height },
1124
+ "data-testid": "chart-svg",
1125
+ children: [
1126
+ /* @__PURE__ */ jsx(
1127
+ ChartGrid,
1128
+ {
1129
+ yTicks,
1130
+ yScale,
1131
+ plotX: plotArea.x,
1132
+ plotWidth: plotArea.width,
1133
+ visible: showGrid
1134
+ }
1135
+ ),
1136
+ /* @__PURE__ */ jsx(
1137
+ ChartAxis,
1138
+ {
1139
+ allLabels,
1140
+ yTicks,
1141
+ xScale,
1142
+ yScale,
1143
+ plotArea,
1144
+ xAxisLabel,
1145
+ yAxisLabel,
1146
+ formatValue
1147
+ }
1148
+ ),
1149
+ data.map((series, seriesIndex) => {
1150
+ const color = series.color || getSeriesColor(seriesIndex);
1151
+ const pattern = series.pattern || "solid";
1152
+ if (type === "bar") {
1153
+ return /* @__PURE__ */ jsx(
1154
+ ChartBarSeries,
1155
+ {
1156
+ series,
1157
+ seriesIndex,
1158
+ totalSeries: data.length,
1159
+ dimensions,
1160
+ scales,
1161
+ color,
1162
+ getTabIndex,
1163
+ selectedPoint,
1164
+ onPointFocus,
1165
+ onPointBlur,
1166
+ onPointHover,
1167
+ onPointHoverEnd,
1168
+ onKeyDown,
1169
+ formatValue
1170
+ },
1171
+ series.name
1172
+ );
1173
+ }
1174
+ return /* @__PURE__ */ jsx(
1175
+ ChartLineSeries,
1176
+ {
1177
+ series,
1178
+ seriesIndex,
1179
+ scales,
1180
+ color,
1181
+ pattern,
1182
+ getTabIndex,
1183
+ selectedPoint,
1184
+ onPointFocus,
1185
+ onPointBlur,
1186
+ onPointHover,
1187
+ onPointHoverEnd,
1188
+ onKeyDown,
1189
+ formatValue
1190
+ },
1191
+ series.name
1192
+ );
1193
+ })
1194
+ ]
1195
+ }
1196
+ );
1197
+ }
1198
+ ChartSVG.displayName = "ChartSVG";
1199
+ var TOOLTIP_GAP = 8;
1200
+ function ChartTooltip({
1201
+ visible,
1202
+ x,
1203
+ y,
1204
+ seriesName,
1205
+ label,
1206
+ value,
1207
+ chartWidth,
1208
+ chartHeight,
1209
+ trend,
1210
+ trendDirection
1211
+ }) {
1212
+ const tooltipRef = useRef(null);
1213
+ const [position, setPosition] = useState({ left: 0, top: 0 });
1214
+ const [side, setSide] = useState("top");
1215
+ useEffect(() => {
1216
+ if (!visible || !tooltipRef.current) return;
1217
+ const tooltip = tooltipRef.current;
1218
+ const tooltipRect = tooltip.getBoundingClientRect();
1219
+ const tooltipWidth = tooltipRect.width || 120;
1220
+ const tooltipHeight = tooltipRect.height || 50;
1221
+ let left = x - tooltipWidth / 2;
1222
+ let top = y - tooltipHeight - TOOLTIP_GAP;
1223
+ let newSide = "top";
1224
+ if (top < 0) {
1225
+ top = y + TOOLTIP_GAP + 16;
1226
+ newSide = "bottom";
1227
+ }
1228
+ if (left < 0) {
1229
+ left = 0;
1230
+ }
1231
+ if (left + tooltipWidth > chartWidth) {
1232
+ left = chartWidth - tooltipWidth;
1233
+ }
1234
+ setPosition({ left, top });
1235
+ setSide(newSide);
1236
+ }, [visible, x, y, chartWidth]);
1237
+ if (!visible) {
1238
+ return null;
1239
+ }
1240
+ return /* @__PURE__ */ jsxs(
1241
+ "div",
1242
+ {
1243
+ ref: tooltipRef,
1244
+ "aria-hidden": "true",
1245
+ className: tooltipContentVariants({ side }),
1246
+ style: {
1247
+ position: "absolute",
1248
+ left: position.left,
1249
+ top: position.top,
1250
+ pointerEvents: "none"
1251
+ },
1252
+ "data-testid": "chart-tooltip",
1253
+ children: [
1254
+ /* @__PURE__ */ jsx("div", { className: "font-medium", children: seriesName }),
1255
+ /* @__PURE__ */ jsxs("div", { className: "opacity-80", children: [
1256
+ label,
1257
+ ": ",
1258
+ /* @__PURE__ */ jsx("span", { className: "font-semibold", children: value })
1259
+ ] }),
1260
+ trend && /* @__PURE__ */ jsxs("div", { className: "text-xs opacity-70 mt-1 flex items-center gap-1", children: [
1261
+ trendDirection === "up" ? /* @__PURE__ */ jsx(
1262
+ "svg",
1263
+ {
1264
+ "aria-hidden": "true",
1265
+ className: "h-3 w-3 text-green-500",
1266
+ viewBox: "0 0 20 20",
1267
+ fill: "currentColor",
1268
+ children: /* @__PURE__ */ jsx(
1269
+ "path",
1270
+ {
1271
+ fillRule: "evenodd",
1272
+ d: "M10 17a.75.75 0 01-.75-.75V5.612L5.29 9.77a.75.75 0 01-1.08-1.04l5.25-5.5a.75.75 0 011.08 0l5.25 5.5a.75.75 0 11-1.08 1.04l-3.96-4.158V16.25A.75.75 0 0110 17z",
1273
+ clipRule: "evenodd"
1274
+ }
1275
+ )
1276
+ }
1277
+ ) : trendDirection === "down" ? /* @__PURE__ */ jsx(
1278
+ "svg",
1279
+ {
1280
+ "aria-hidden": "true",
1281
+ className: "h-3 w-3 text-red-500",
1282
+ viewBox: "0 0 20 20",
1283
+ fill: "currentColor",
1284
+ children: /* @__PURE__ */ jsx(
1285
+ "path",
1286
+ {
1287
+ fillRule: "evenodd",
1288
+ d: "M10 3a.75.75 0 01.75.75v10.638l3.96-4.158a.75.75 0 111.08 1.04l-5.25 5.5a.75.75 0 01-1.08 0l-5.25-5.5a.75.75 0 111.08-1.04l3.96 4.158V3.75A.75.75 0 0110 3z",
1289
+ clipRule: "evenodd"
1290
+ }
1291
+ )
1292
+ }
1293
+ ) : null,
1294
+ /* @__PURE__ */ jsx("span", { children: trend })
1295
+ ] })
1296
+ ]
1297
+ }
1298
+ );
1299
+ }
1300
+ ChartTooltip.displayName = "ChartTooltip";
1301
+ function ChartLegend({
1302
+ data,
1303
+ visible,
1304
+ type,
1305
+ getSeriesColor
1306
+ }) {
1307
+ if (!visible) {
1308
+ return null;
1309
+ }
1310
+ return /* @__PURE__ */ jsx(
1311
+ "div",
1312
+ {
1313
+ className: legendVariants({ visible }),
1314
+ role: "list",
1315
+ "aria-label": "Chart legend",
1316
+ "data-testid": "chart-legend",
1317
+ children: data.map((series, index) => {
1318
+ const color = series.color || getSeriesColor(index);
1319
+ const pattern = series.pattern || "solid";
1320
+ return /* @__PURE__ */ jsxs(
1321
+ "div",
1322
+ {
1323
+ role: "listitem",
1324
+ className: "flex items-center gap-2",
1325
+ children: [
1326
+ type === "bar" ? /* @__PURE__ */ jsx(
1327
+ "div",
1328
+ {
1329
+ className: "h-3 w-3 rounded-sm",
1330
+ style: { backgroundColor: color },
1331
+ "data-testid": `legend-color-${index}`,
1332
+ "aria-hidden": "true"
1333
+ }
1334
+ ) : /* @__PURE__ */ jsx(
1335
+ "svg",
1336
+ {
1337
+ width: "24",
1338
+ height: "12",
1339
+ "aria-hidden": "true",
1340
+ "data-testid": `legend-color-${index}`,
1341
+ children: /* @__PURE__ */ jsx(
1342
+ "line",
1343
+ {
1344
+ x1: "0",
1345
+ y1: "6",
1346
+ x2: "24",
1347
+ y2: "6",
1348
+ stroke: color,
1349
+ strokeWidth: "2",
1350
+ strokeDasharray: LINE_PATTERNS[pattern] === "none" ? void 0 : LINE_PATTERNS[pattern]
1351
+ }
1352
+ )
1353
+ }
1354
+ ),
1355
+ /* @__PURE__ */ jsx("span", { className: "text-sm text-[var(--content-foreground)]", children: series.name })
1356
+ ]
1357
+ },
1358
+ series.name
1359
+ );
1360
+ })
1361
+ }
1362
+ );
1363
+ }
1364
+ ChartLegend.displayName = "ChartLegend";
1365
+ function ChartAnnouncer({
1366
+ announcement
1367
+ }) {
1368
+ return /* @__PURE__ */ jsx(VisuallyHidden, { children: /* @__PURE__ */ jsx(
1369
+ "div",
1370
+ {
1371
+ role: "status",
1372
+ "aria-live": "polite",
1373
+ "aria-atomic": "true",
1374
+ "data-testid": "chart-announcer",
1375
+ children: announcement
1376
+ }
1377
+ ) });
1378
+ }
1379
+ ChartAnnouncer.displayName = "ChartAnnouncer";
1380
+ function ChartDataTable({
1381
+ data,
1382
+ title,
1383
+ xAxisLabel,
1384
+ yAxisLabel,
1385
+ formatValue,
1386
+ allLabels
1387
+ }) {
1388
+ const isSingleSeries = data.length === 1;
1389
+ return /* @__PURE__ */ jsx(VisuallyHidden, { children: /* @__PURE__ */ jsxs("table", { "data-testid": "chart-data-table", children: [
1390
+ /* @__PURE__ */ jsxs("caption", { children: [
1391
+ title,
1392
+ " data table"
1393
+ ] }),
1394
+ /* @__PURE__ */ jsx("thead", { children: /* @__PURE__ */ jsxs("tr", { children: [
1395
+ /* @__PURE__ */ jsx("th", { scope: "col", children: xAxisLabel }),
1396
+ isSingleSeries ? /* @__PURE__ */ jsx("th", { scope: "col", children: yAxisLabel }) : data.map((series) => /* @__PURE__ */ jsxs("th", { scope: "col", children: [
1397
+ series.name,
1398
+ " (",
1399
+ yAxisLabel,
1400
+ ")"
1401
+ ] }, series.name))
1402
+ ] }) }),
1403
+ /* @__PURE__ */ jsx("tbody", { children: allLabels.map((label) => /* @__PURE__ */ jsxs("tr", { children: [
1404
+ /* @__PURE__ */ jsx("th", { scope: "row", children: label }),
1405
+ data.map((series) => {
1406
+ const point = series.data.find((p) => p.label === label);
1407
+ return /* @__PURE__ */ jsx("td", { children: point ? formatValue(point.value) : "\u2014" }, series.name);
1408
+ })
1409
+ ] }, label)) })
1410
+ ] }) });
1411
+ }
1412
+ ChartDataTable.displayName = "ChartDataTable";
1413
+ function useChartKeyboard(options) {
1414
+ const { roving, onSelect, onClear, disabled = false } = options;
1415
+ const onKeyDown = useCallback(
1416
+ (event) => {
1417
+ if (disabled) return;
1418
+ switch (event.key) {
1419
+ case "ArrowRight":
1420
+ event.preventDefault();
1421
+ roving.moveRight();
1422
+ break;
1423
+ case "ArrowLeft":
1424
+ event.preventDefault();
1425
+ roving.moveLeft();
1426
+ break;
1427
+ case "ArrowDown":
1428
+ event.preventDefault();
1429
+ roving.moveDown();
1430
+ break;
1431
+ case "ArrowUp":
1432
+ event.preventDefault();
1433
+ roving.moveUp();
1434
+ break;
1435
+ case "Home":
1436
+ event.preventDefault();
1437
+ roving.moveToStart();
1438
+ break;
1439
+ case "End":
1440
+ event.preventDefault();
1441
+ roving.moveToEnd();
1442
+ break;
1443
+ case "Enter":
1444
+ case " ":
1445
+ event.preventDefault();
1446
+ onSelect?.();
1447
+ break;
1448
+ case "Escape":
1449
+ event.preventDefault();
1450
+ onClear?.();
1451
+ break;
1452
+ }
1453
+ },
1454
+ [roving, onSelect, onClear, disabled]
1455
+ );
1456
+ return { onKeyDown };
1457
+ }
1458
+ function ChartInner({ chartId }) {
1459
+ const ctx = useChartContext();
1460
+ const {
1461
+ data,
1462
+ type,
1463
+ title,
1464
+ xAxisLabel,
1465
+ yAxisLabel,
1466
+ showTooltip,
1467
+ showGrid,
1468
+ showLegend,
1469
+ dimensions,
1470
+ scales,
1471
+ announcement,
1472
+ isTooltipVisible,
1473
+ tooltipPoint,
1474
+ currentTrend,
1475
+ currentTrendDirection,
1476
+ selectedPoint,
1477
+ getTabIndex,
1478
+ formatValue,
1479
+ getSeriesColor,
1480
+ getPointCoordinates,
1481
+ setFocus,
1482
+ selectPoint,
1483
+ clearSelection,
1484
+ showTooltipAt,
1485
+ hideTooltip
1486
+ } = ctx;
1487
+ const titleId = `${chartId}-title`;
1488
+ const descId = `${chartId}-desc`;
1489
+ const roving = useRovingTabIndex2D({
1490
+ rows: data.length,
1491
+ cols: (row) => data[row]?.data.length || 0,
1492
+ onFocusChange: (seriesIndex, pointIndex) => {
1493
+ setFocus(seriesIndex, pointIndex);
1494
+ }
1495
+ });
1496
+ const { onKeyDown } = useChartKeyboard({
1497
+ roving,
1498
+ onSelect: () => {
1499
+ selectPoint(roving.focusedRow, roving.focusedCol);
1500
+ },
1501
+ onClear: () => {
1502
+ clearSelection();
1503
+ }
1504
+ });
1505
+ const handlePointFocus = useCallback(
1506
+ (seriesIndex, pointIndex) => {
1507
+ roving.setFocus(seriesIndex, pointIndex);
1508
+ showTooltipAt(seriesIndex, pointIndex);
1509
+ },
1510
+ [roving, showTooltipAt]
1511
+ );
1512
+ const handlePointBlur = useCallback(() => {
1513
+ }, []);
1514
+ const handlePointHover = useCallback(
1515
+ (seriesIndex, pointIndex) => {
1516
+ showTooltipAt(seriesIndex, pointIndex);
1517
+ },
1518
+ [showTooltipAt]
1519
+ );
1520
+ const handlePointHoverEnd = useCallback(() => {
1521
+ hideTooltip();
1522
+ }, [hideTooltip]);
1523
+ const tooltipPosition = useMemo(() => {
1524
+ if (!tooltipPoint) return { x: 0, y: 0 };
1525
+ const coords = getPointCoordinates(tooltipPoint.series, tooltipPoint.point);
1526
+ return coords || { x: 0, y: 0 };
1527
+ }, [tooltipPoint, getPointCoordinates]);
1528
+ const tooltipSeries = useMemo(
1529
+ () => tooltipPoint ? data[tooltipPoint.series] : null,
1530
+ [tooltipPoint, data]
1531
+ );
1532
+ const tooltipPointData = useMemo(
1533
+ () => tooltipPoint ? tooltipSeries?.data[tooltipPoint.point] : null,
1534
+ [tooltipPoint, tooltipSeries]
1535
+ );
1536
+ const shouldShowLegend = useMemo(
1537
+ () => showLegend ?? data.length > 1,
1538
+ [showLegend, data.length]
1539
+ );
1540
+ return /* @__PURE__ */ jsxs(Fragment, { children: [
1541
+ /* @__PURE__ */ jsx(ChartAnnouncer, { announcement }),
1542
+ /* @__PURE__ */ jsxs("div", { className: "relative", children: [
1543
+ /* @__PURE__ */ jsx("div", { className: "relative z-0", children: /* @__PURE__ */ jsx(
1544
+ ChartSVG,
1545
+ {
1546
+ type,
1547
+ data,
1548
+ dimensions,
1549
+ scales,
1550
+ titleId,
1551
+ descId,
1552
+ showGrid,
1553
+ xAxisLabel,
1554
+ yAxisLabel,
1555
+ getSeriesColor,
1556
+ getTabIndex,
1557
+ selectedPoint,
1558
+ formatValue,
1559
+ onKeyDown,
1560
+ onPointFocus: handlePointFocus,
1561
+ onPointBlur: handlePointBlur,
1562
+ onPointHover: handlePointHover,
1563
+ onPointHoverEnd: handlePointHoverEnd
1564
+ }
1565
+ ) }),
1566
+ showTooltip && tooltipPointData && tooltipSeries && /* @__PURE__ */ jsx(
1567
+ ChartTooltip,
1568
+ {
1569
+ visible: isTooltipVisible,
1570
+ x: tooltipPosition.x,
1571
+ y: tooltipPosition.y,
1572
+ seriesName: tooltipSeries.name,
1573
+ label: tooltipPointData.label,
1574
+ value: formatValue(tooltipPointData.value),
1575
+ chartWidth: dimensions.width,
1576
+ chartHeight: dimensions.height,
1577
+ trend: currentTrend,
1578
+ trendDirection: currentTrendDirection
1579
+ }
1580
+ )
1581
+ ] }),
1582
+ /* @__PURE__ */ jsx(
1583
+ ChartLegend,
1584
+ {
1585
+ data,
1586
+ visible: shouldShowLegend,
1587
+ type,
1588
+ getSeriesColor
1589
+ }
1590
+ ),
1591
+ /* @__PURE__ */ jsx(
1592
+ ChartDataTable,
1593
+ {
1594
+ data,
1595
+ title,
1596
+ xAxisLabel,
1597
+ yAxisLabel,
1598
+ formatValue,
1599
+ allLabels: scales.allLabels
1600
+ }
1601
+ )
1602
+ ] });
1603
+ }
1604
+ var ChartComponent = forwardRef(
1605
+ ({
1606
+ data,
1607
+ type,
1608
+ title,
1609
+ description,
1610
+ xAxisLabel,
1611
+ yAxisLabel,
1612
+ variant = "default",
1613
+ className,
1614
+ showTooltip = true,
1615
+ showGrid = true,
1616
+ showLegend,
1617
+ announceTrends = false,
1618
+ trendUpFormat = "up {percent}% from previous",
1619
+ trendDownFormat = "down {percent}% from previous",
1620
+ startAtZero = true,
1621
+ reducedMotion,
1622
+ onPointFocus,
1623
+ onPointSelect,
1624
+ id,
1625
+ "aria-label": ariaLabel,
1626
+ "aria-labelledby": ariaLabelledby,
1627
+ "aria-describedby": ariaDescribedby,
1628
+ "data-testid": dataTestId,
1629
+ ...rest
1630
+ }, ref) => {
1631
+ const containerRef = useRef(null);
1632
+ const generatedId = useId();
1633
+ const chartId = id || `chart-${generatedId}`;
1634
+ const titleId = `${chartId}-title`;
1635
+ const descId = `${chartId}-desc`;
1636
+ const shouldShowLegend = showLegend ?? data.length > 1;
1637
+ return /* @__PURE__ */ jsxs(
1638
+ "figure",
1639
+ {
1640
+ ref: (node) => {
1641
+ if (typeof ref === "function") {
1642
+ ref(node);
1643
+ } else if (ref) {
1644
+ ref.current = node;
1645
+ }
1646
+ containerRef.current = node;
1647
+ },
1648
+ id: chartId,
1649
+ role: "figure",
1650
+ "aria-label": ariaLabel,
1651
+ "aria-labelledby": ariaLabelledby || titleId,
1652
+ "aria-describedby": ariaDescribedby || descId,
1653
+ "data-testid": dataTestId,
1654
+ className: cn(chartVariants({ variant }), "p-4", className),
1655
+ ...rest,
1656
+ children: [
1657
+ /* @__PURE__ */ jsxs("figcaption", { className: "sr-only", children: [
1658
+ /* @__PURE__ */ jsx("span", { id: titleId, children: title }),
1659
+ /* @__PURE__ */ jsx("span", { id: descId, children: description })
1660
+ ] }),
1661
+ /* @__PURE__ */ jsx(
1662
+ ChartProvider,
1663
+ {
1664
+ containerRef,
1665
+ data,
1666
+ type,
1667
+ title,
1668
+ description,
1669
+ xAxisLabel,
1670
+ yAxisLabel,
1671
+ showTooltip,
1672
+ showGrid,
1673
+ showLegend: shouldShowLegend,
1674
+ announceTrends,
1675
+ trendUpFormat,
1676
+ trendDownFormat,
1677
+ startAtZero,
1678
+ reducedMotion,
1679
+ onPointFocus,
1680
+ onPointSelect,
1681
+ children: /* @__PURE__ */ jsx(ChartInner, { chartId })
1682
+ }
1683
+ )
1684
+ ]
1685
+ }
1686
+ );
1687
+ }
1688
+ );
1689
+ ChartComponent.displayName = "Chart";
1690
+ var Chart = memo(ChartComponent);
1691
+ Chart.displayName = "Chart";
1692
+ var DataPointSchema = z.object({
1693
+ /** X-axis label (e.g., "January", "Q1 2024") */
1694
+ label: z.string().min(1, "Label is required"),
1695
+ /** Y-axis value */
1696
+ value: z.number(),
1697
+ /** Extended description for screen readers */
1698
+ description: z.string().optional()
1699
+ });
1700
+ var LinePatternSchema = z.enum(["solid", "dashed", "dotted"]);
1701
+ var DataSeriesSchema = z.object({
1702
+ /** Series name for legend and announcements */
1703
+ name: z.string().min(1, "Series name is required"),
1704
+ /** CSS color (defaults to --chart-1 through --chart-5) */
1705
+ color: z.string().optional(),
1706
+ /** Line pattern for accessibility (defaults to solid) */
1707
+ pattern: LinePatternSchema.optional().default("solid"),
1708
+ /** Data points in this series */
1709
+ data: z.array(DataPointSchema).min(1, "At least one data point required")
1710
+ });
1711
+ var ChartTypeSchema = z.enum(["bar", "line"]);
1712
+ var ChartVariantSchema = z.enum(["default", "muted"]);
1713
+ var ChartPropsSchema = BaseComponentPropsSchema.extend({
1714
+ // Required props
1715
+ /** Chart data - maximum 5 series (Decision 11) */
1716
+ data: z.array(DataSeriesSchema).min(1, "At least one data series required").max(5, "Maximum 5 series allowed"),
1717
+ /** Chart type: bar or line */
1718
+ type: ChartTypeSchema,
1719
+ /** Chart title (displayed and used for accessibility) */
1720
+ title: z.string().min(1, "Title is required"),
1721
+ /** Chart description (displayed and used for accessibility) */
1722
+ description: z.string().min(1, "Description is required"),
1723
+ /** X-axis label */
1724
+ xAxisLabel: z.string().min(1, "X-axis label is required"),
1725
+ /** Y-axis label */
1726
+ yAxisLabel: z.string().min(1, "Y-axis label is required"),
1727
+ // Optional - Styling
1728
+ /** Visual variant */
1729
+ variant: ChartVariantSchema.optional().default("default"),
1730
+ // Optional - Features
1731
+ /** Show tooltip on focus/hover (default: true) */
1732
+ showTooltip: z.boolean().optional().default(true),
1733
+ /** Show grid lines (default: true) */
1734
+ showGrid: z.boolean().optional().default(true),
1735
+ /** Show legend (auto: shown when >1 series) */
1736
+ showLegend: z.boolean().optional(),
1737
+ /** Announce trend percentages (default: false) */
1738
+ announceTrends: z.boolean().optional().default(false),
1739
+ /** ICU format string for upward trend (use {percent} placeholder) */
1740
+ trendUpFormat: z.string().optional().default("up {percent}% from previous"),
1741
+ /** ICU format string for downward trend (use {percent} placeholder) */
1742
+ trendDownFormat: z.string().optional().default("down {percent}% from previous"),
1743
+ /** Y-axis starts at zero (default: true) - Decision 6 */
1744
+ startAtZero: z.boolean().optional().default(true),
1745
+ // Optional - Accessibility
1746
+ /** Override reduced motion preference */
1747
+ reducedMotion: z.boolean().optional(),
1748
+ // Optional - Events (use z.unknown() since Zod can't validate function types at runtime)
1749
+ /** Called when a data point receives focus */
1750
+ onPointFocus: z.unknown().optional(),
1751
+ /** Called when a data point is selected (Enter/Space) */
1752
+ onPointSelect: z.unknown().optional()
1753
+ });
1754
+
1755
+ export { Chart, ChartPropsSchema, ChartTypeSchema, ChartVariantSchema, DataPointSchema, DataSeriesSchema, LinePatternSchema, chartVariants, dataPointVariants };
1756
+ //# sourceMappingURL=chunk-D6CBOECS.mjs.map
1757
+ //# sourceMappingURL=chunk-D6CBOECS.mjs.map