@tribepad/themis 1.0.0 → 1.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (482) hide show
  1. package/dist/elements/Accordion/index.js +2 -77
  2. package/dist/elements/Accordion/index.js.map +1 -1
  3. package/dist/elements/Accordion/index.mjs +2 -4
  4. package/dist/elements/Accordion/index.mjs.map +1 -1
  5. package/dist/elements/AlertDialog/AlertDialog.d.ts +43 -0
  6. package/dist/elements/AlertDialog/AlertDialog.d.ts.map +1 -0
  7. package/dist/elements/AlertDialog/AlertDialog.styles.d.ts +15 -0
  8. package/dist/elements/AlertDialog/AlertDialog.styles.d.ts.map +1 -0
  9. package/dist/elements/AlertDialog/AlertDialog.types.d.ts +72 -0
  10. package/dist/elements/AlertDialog/AlertDialog.types.d.ts.map +1 -0
  11. package/dist/elements/AlertDialog/index.d.ts +25 -0
  12. package/dist/elements/AlertDialog/index.d.ts.map +1 -0
  13. package/dist/elements/AlertDialog/index.js +3 -0
  14. package/dist/elements/AlertDialog/index.js.map +1 -0
  15. package/dist/elements/AlertDialog/index.mjs +3 -0
  16. package/dist/elements/AlertDialog/index.mjs.map +1 -0
  17. package/dist/elements/Avatar/index.js +2 -53
  18. package/dist/elements/Avatar/index.js.map +1 -1
  19. package/dist/elements/Avatar/index.mjs +2 -4
  20. package/dist/elements/Avatar/index.mjs.map +1 -1
  21. package/dist/elements/Badge/index.js +2 -42
  22. package/dist/elements/Badge/index.js.map +1 -1
  23. package/dist/elements/Badge/index.mjs +2 -5
  24. package/dist/elements/Badge/index.mjs.map +1 -1
  25. package/dist/elements/Breadcrumbs/index.js +2 -53
  26. package/dist/elements/Breadcrumbs/index.js.map +1 -1
  27. package/dist/elements/Breadcrumbs/index.mjs +2 -8
  28. package/dist/elements/Breadcrumbs/index.mjs.map +1 -1
  29. package/dist/elements/Button/Button.d.ts +26 -81
  30. package/dist/elements/Button/Button.d.ts.map +1 -1
  31. package/dist/elements/Button/Button.styles.d.ts +35 -0
  32. package/dist/elements/Button/Button.styles.d.ts.map +1 -0
  33. package/dist/elements/Button/Button.types.d.ts +20 -8
  34. package/dist/elements/Button/Button.types.d.ts.map +1 -1
  35. package/dist/elements/Button/index.js +2 -26
  36. package/dist/elements/Button/index.js.map +1 -1
  37. package/dist/elements/Button/index.mjs +2 -5
  38. package/dist/elements/Button/index.mjs.map +1 -1
  39. package/dist/elements/ButtonGroup/index.js +2 -65
  40. package/dist/elements/ButtonGroup/index.js.map +1 -1
  41. package/dist/elements/ButtonGroup/index.mjs +2 -4
  42. package/dist/elements/ButtonGroup/index.mjs.map +1 -1
  43. package/dist/elements/Card/Card.d.ts.map +1 -1
  44. package/dist/elements/Card/index.js +2 -84
  45. package/dist/elements/Card/index.js.map +1 -1
  46. package/dist/elements/Card/index.mjs +2 -7
  47. package/dist/elements/Card/index.mjs.map +1 -1
  48. package/dist/elements/Carousel/Carousel.d.ts +1 -11
  49. package/dist/elements/Carousel/Carousel.d.ts.map +1 -1
  50. package/dist/elements/Carousel/LazyCarousel.d.ts +1 -1
  51. package/dist/elements/Carousel/LazyCarousel.d.ts.map +1 -1
  52. package/dist/elements/Carousel/index.js +2 -22
  53. package/dist/elements/Carousel/index.js.map +1 -1
  54. package/dist/elements/Carousel/index.mjs +2 -9
  55. package/dist/elements/Carousel/index.mjs.map +1 -1
  56. package/dist/elements/Chart/ChartContext.d.ts.map +1 -1
  57. package/dist/elements/Chart/index.js +2 -46
  58. package/dist/elements/Chart/index.js.map +1 -1
  59. package/dist/elements/Chart/index.mjs +2 -5
  60. package/dist/elements/Chart/index.mjs.map +1 -1
  61. package/dist/elements/Checkbox/index.js +2 -46
  62. package/dist/elements/Checkbox/index.js.map +1 -1
  63. package/dist/elements/Checkbox/index.mjs +2 -5
  64. package/dist/elements/Checkbox/index.mjs.map +1 -1
  65. package/dist/elements/CheckboxGroup/index.js +2 -70
  66. package/dist/elements/CheckboxGroup/index.js.map +1 -1
  67. package/dist/elements/CheckboxGroup/index.mjs +2 -5
  68. package/dist/elements/CheckboxGroup/index.mjs.map +1 -1
  69. package/dist/elements/Combobox/Combobox.d.ts +56 -0
  70. package/dist/elements/Combobox/Combobox.d.ts.map +1 -0
  71. package/dist/elements/Combobox/Combobox.styles.d.ts +29 -0
  72. package/dist/elements/Combobox/Combobox.styles.d.ts.map +1 -0
  73. package/dist/elements/Combobox/Combobox.types.d.ts +67 -0
  74. package/dist/elements/Combobox/Combobox.types.d.ts.map +1 -0
  75. package/dist/elements/Combobox/index.d.ts +20 -0
  76. package/dist/elements/Combobox/index.d.ts.map +1 -0
  77. package/dist/elements/Combobox/index.js +3 -0
  78. package/dist/elements/Combobox/index.js.map +1 -0
  79. package/dist/elements/Combobox/index.mjs +3 -0
  80. package/dist/elements/Combobox/index.mjs.map +1 -0
  81. package/dist/elements/DatePicker/DatePicker.d.ts +1 -1
  82. package/dist/elements/DatePicker/DatePicker.d.ts.map +1 -1
  83. package/dist/elements/DatePicker/index.js +2 -122
  84. package/dist/elements/DatePicker/index.js.map +1 -1
  85. package/dist/elements/DatePicker/index.mjs +2 -5
  86. package/dist/elements/DatePicker/index.mjs.map +1 -1
  87. package/dist/elements/Dropdown/Dropdown.d.ts +7 -15
  88. package/dist/elements/Dropdown/Dropdown.d.ts.map +1 -1
  89. package/dist/elements/Dropdown/Dropdown.styles.d.ts +22 -0
  90. package/dist/elements/Dropdown/Dropdown.styles.d.ts.map +1 -0
  91. package/dist/elements/Dropdown/index.d.ts +1 -0
  92. package/dist/elements/Dropdown/index.d.ts.map +1 -1
  93. package/dist/elements/Dropdown/index.js +2 -40
  94. package/dist/elements/Dropdown/index.js.map +1 -1
  95. package/dist/elements/Dropdown/index.mjs +2 -3
  96. package/dist/elements/Dropdown/index.mjs.map +1 -1
  97. package/dist/elements/FileField/index.js +2 -137
  98. package/dist/elements/FileField/index.js.map +1 -1
  99. package/dist/elements/FileField/index.mjs +2 -8
  100. package/dist/elements/FileField/index.mjs.map +1 -1
  101. package/dist/elements/FormLayout/index.js +2 -16
  102. package/dist/elements/FormLayout/index.js.map +1 -1
  103. package/dist/elements/FormLayout/index.mjs +2 -3
  104. package/dist/elements/FormLayout/index.mjs.map +1 -1
  105. package/dist/elements/Modal/Modal.d.ts +9 -14
  106. package/dist/elements/Modal/Modal.d.ts.map +1 -1
  107. package/dist/elements/Modal/Modal.styles.d.ts +29 -0
  108. package/dist/elements/Modal/Modal.styles.d.ts.map +1 -0
  109. package/dist/elements/Modal/index.d.ts +1 -0
  110. package/dist/elements/Modal/index.d.ts.map +1 -1
  111. package/dist/elements/Modal/index.js +2 -51
  112. package/dist/elements/Modal/index.js.map +1 -1
  113. package/dist/elements/Modal/index.mjs +2 -2
  114. package/dist/elements/Modal/index.mjs.map +1 -1
  115. package/dist/elements/NumberField/index.js +2 -56
  116. package/dist/elements/NumberField/index.js.map +1 -1
  117. package/dist/elements/NumberField/index.mjs +2 -7
  118. package/dist/elements/NumberField/index.mjs.map +1 -1
  119. package/dist/elements/OTPInput/OTPInput.d.ts.map +1 -1
  120. package/dist/elements/OTPInput/index.js +2 -12
  121. package/dist/elements/OTPInput/index.js.map +1 -1
  122. package/dist/elements/OTPInput/index.mjs +2 -3
  123. package/dist/elements/OTPInput/index.mjs.map +1 -1
  124. package/dist/elements/Pagination/Pagination.d.ts +45 -0
  125. package/dist/elements/Pagination/Pagination.d.ts.map +1 -0
  126. package/dist/elements/Pagination/Pagination.styles.d.ts +10 -0
  127. package/dist/elements/Pagination/Pagination.styles.d.ts.map +1 -0
  128. package/dist/elements/Pagination/Pagination.types.d.ts +55 -0
  129. package/dist/elements/Pagination/Pagination.types.d.ts.map +1 -0
  130. package/dist/elements/Pagination/index.d.ts +21 -0
  131. package/dist/elements/Pagination/index.d.ts.map +1 -0
  132. package/dist/elements/Pagination/index.js +3 -0
  133. package/dist/elements/Pagination/index.js.map +1 -0
  134. package/dist/elements/Pagination/index.mjs +3 -0
  135. package/dist/elements/Pagination/index.mjs.map +1 -0
  136. package/dist/elements/Panel/index.js +2 -32
  137. package/dist/elements/Panel/index.js.map +1 -1
  138. package/dist/elements/Panel/index.mjs +2 -3
  139. package/dist/elements/Panel/index.mjs.map +1 -1
  140. package/dist/elements/PasswordField/PasswordField.d.ts +27 -0
  141. package/dist/elements/PasswordField/PasswordField.d.ts.map +1 -0
  142. package/dist/elements/PasswordField/PasswordField.styles.d.ts +32 -0
  143. package/dist/elements/PasswordField/PasswordField.styles.d.ts.map +1 -0
  144. package/dist/elements/PasswordField/PasswordField.types.d.ts +100 -0
  145. package/dist/elements/PasswordField/PasswordField.types.d.ts.map +1 -0
  146. package/dist/elements/PasswordField/index.css +2 -0
  147. package/dist/elements/PasswordField/index.css.map +1 -0
  148. package/dist/elements/PasswordField/index.d.ts +20 -0
  149. package/dist/elements/PasswordField/index.d.ts.map +1 -0
  150. package/dist/elements/PasswordField/index.js +3 -0
  151. package/dist/elements/PasswordField/index.js.map +1 -0
  152. package/dist/elements/PasswordField/index.mjs +3 -0
  153. package/dist/elements/PasswordField/index.mjs.map +1 -0
  154. package/dist/elements/Progress/index.js +2 -29
  155. package/dist/elements/Progress/index.js.map +1 -1
  156. package/dist/elements/Progress/index.mjs +2 -4
  157. package/dist/elements/Progress/index.mjs.map +1 -1
  158. package/dist/elements/RadioGroup/index.js +2 -46
  159. package/dist/elements/RadioGroup/index.js.map +1 -1
  160. package/dist/elements/RadioGroup/index.mjs +2 -5
  161. package/dist/elements/RadioGroup/index.mjs.map +1 -1
  162. package/dist/elements/Resizable/components/ResizableHandle.d.ts +0 -8
  163. package/dist/elements/Resizable/components/ResizableHandle.d.ts.map +1 -1
  164. package/dist/elements/Resizable/components/ResizablePanel.d.ts +0 -8
  165. package/dist/elements/Resizable/components/ResizablePanel.d.ts.map +1 -1
  166. package/dist/elements/Resizable/components/ResizablePanelGroup.d.ts +0 -8
  167. package/dist/elements/Resizable/components/ResizablePanelGroup.d.ts.map +1 -1
  168. package/dist/elements/Resizable/components/ResizablePopover.d.ts +0 -8
  169. package/dist/elements/Resizable/components/ResizablePopover.d.ts.map +1 -1
  170. package/dist/elements/Resizable/index.js +2 -64
  171. package/dist/elements/Resizable/index.js.map +1 -1
  172. package/dist/elements/Resizable/index.mjs +2 -7
  173. package/dist/elements/Resizable/index.mjs.map +1 -1
  174. package/dist/elements/SearchField/SearchField.d.ts +27 -0
  175. package/dist/elements/SearchField/SearchField.d.ts.map +1 -0
  176. package/dist/elements/SearchField/SearchField.styles.d.ts +32 -0
  177. package/dist/elements/SearchField/SearchField.styles.d.ts.map +1 -0
  178. package/dist/elements/SearchField/SearchField.types.d.ts +45 -0
  179. package/dist/elements/SearchField/SearchField.types.d.ts.map +1 -0
  180. package/dist/elements/SearchField/index.css +2 -0
  181. package/dist/elements/SearchField/index.css.map +1 -0
  182. package/dist/elements/SearchField/index.d.ts +21 -0
  183. package/dist/elements/SearchField/index.d.ts.map +1 -0
  184. package/dist/elements/SearchField/index.js +3 -0
  185. package/dist/elements/SearchField/index.js.map +1 -0
  186. package/dist/elements/SearchField/index.mjs +3 -0
  187. package/dist/elements/SearchField/index.mjs.map +1 -0
  188. package/dist/elements/Select/Select.d.ts +19 -48
  189. package/dist/elements/Select/Select.d.ts.map +1 -1
  190. package/dist/elements/Select/Select.styles.d.ts +55 -0
  191. package/dist/elements/Select/Select.styles.d.ts.map +1 -0
  192. package/dist/elements/Select/index.js +2 -32
  193. package/dist/elements/Select/index.js.map +1 -1
  194. package/dist/elements/Select/index.mjs +2 -3
  195. package/dist/elements/Select/index.mjs.map +1 -1
  196. package/dist/elements/Skeleton/index.js +2 -21
  197. package/dist/elements/Skeleton/index.js.map +1 -1
  198. package/dist/elements/Skeleton/index.mjs +2 -4
  199. package/dist/elements/Skeleton/index.mjs.map +1 -1
  200. package/dist/elements/Switch/index.js +2 -48
  201. package/dist/elements/Switch/index.js.map +1 -1
  202. package/dist/elements/Switch/index.mjs +2 -30
  203. package/dist/elements/Switch/index.mjs.map +1 -1
  204. package/dist/elements/Table/Table.d.ts +3 -24
  205. package/dist/elements/Table/Table.d.ts.map +1 -1
  206. package/dist/elements/Table/Table.styles.d.ts +24 -0
  207. package/dist/elements/Table/Table.styles.d.ts.map +1 -0
  208. package/dist/elements/Table/index.js +2 -75
  209. package/dist/elements/Table/index.js.map +1 -1
  210. package/dist/elements/Table/index.mjs +2 -6
  211. package/dist/elements/Table/index.mjs.map +1 -1
  212. package/dist/elements/Tabs/index.js +2 -73
  213. package/dist/elements/Tabs/index.js.map +1 -1
  214. package/dist/elements/Tabs/index.mjs +2 -4
  215. package/dist/elements/Tabs/index.mjs.map +1 -1
  216. package/dist/elements/TextField/TextField.d.ts +6 -42
  217. package/dist/elements/TextField/TextField.d.ts.map +1 -1
  218. package/dist/elements/TextField/TextField.hooks.d.ts +63 -0
  219. package/dist/elements/TextField/TextField.hooks.d.ts.map +1 -0
  220. package/dist/elements/TextField/TextField.icons.d.ts +19 -0
  221. package/dist/elements/TextField/TextField.icons.d.ts.map +1 -0
  222. package/dist/elements/TextField/TextField.styles.d.ts +37 -0
  223. package/dist/elements/TextField/TextField.styles.d.ts.map +1 -0
  224. package/dist/elements/TextField/TextField.types.d.ts +3 -0
  225. package/dist/elements/TextField/TextField.types.d.ts.map +1 -1
  226. package/dist/elements/TextField/index.css +1 -22
  227. package/dist/elements/TextField/index.css.map +1 -1
  228. package/dist/elements/TextField/index.js +2 -259
  229. package/dist/elements/TextField/index.js.map +1 -1
  230. package/dist/elements/TextField/index.mjs +2 -206
  231. package/dist/elements/TextField/index.mjs.map +1 -1
  232. package/dist/elements/TimeField/index.js +2 -44
  233. package/dist/elements/TimeField/index.js.map +1 -1
  234. package/dist/elements/TimeField/index.mjs +2 -3
  235. package/dist/elements/TimeField/index.mjs.map +1 -1
  236. package/dist/elements/Toast/Toast.d.ts +0 -22
  237. package/dist/elements/Toast/Toast.d.ts.map +1 -1
  238. package/dist/elements/Toast/index.js +2 -59
  239. package/dist/elements/Toast/index.js.map +1 -1
  240. package/dist/elements/Toast/index.mjs +2 -6
  241. package/dist/elements/Toast/index.mjs.map +1 -1
  242. package/dist/elements/Tooltip/index.js +2 -58
  243. package/dist/elements/Tooltip/index.js.map +1 -1
  244. package/dist/elements/Tooltip/index.mjs +2 -5
  245. package/dist/elements/Tooltip/index.mjs.map +1 -1
  246. package/dist/elements/index.css +1 -22
  247. package/dist/elements/index.css.map +1 -1
  248. package/dist/elements/index.d.ts +13 -1
  249. package/dist/elements/index.d.ts.map +1 -1
  250. package/dist/elements/index.js +2 -838
  251. package/dist/elements/index.js.map +1 -1
  252. package/dist/elements/index.mjs +2 -41
  253. package/dist/elements/index.mjs.map +1 -1
  254. package/dist/index.css +1 -22
  255. package/dist/index.css.map +1 -1
  256. package/dist/index.js +3 -864
  257. package/dist/index.js.map +1 -1
  258. package/dist/index.mjs +3 -43
  259. package/dist/index.mjs.map +1 -1
  260. package/dist/schemas/index.js +2 -28
  261. package/dist/schemas/index.js.map +1 -1
  262. package/dist/schemas/index.mjs +2 -3
  263. package/dist/schemas/index.mjs.map +1 -1
  264. package/dist/styles/defaults.css +151 -0
  265. package/dist/styles/index.js +1 -152
  266. package/dist/styles/index.js.map +1 -1
  267. package/dist/styles/index.mjs +1 -3
  268. package/dist/styles/index.mjs.map +1 -1
  269. package/dist/utils/index.js +1 -12
  270. package/dist/utils/index.js.map +1 -1
  271. package/dist/utils/index.mjs +1 -3
  272. package/dist/utils/index.mjs.map +1 -1
  273. package/package.json +9 -7
  274. package/src/elements/Accordion/Accordion.stories.tsx +1 -1
  275. package/src/elements/AlertDialog/AlertDialog.stories.tsx +124 -0
  276. package/src/elements/Avatar/Avatar.stories.tsx +1 -1
  277. package/src/elements/Badge/Badge.stories.tsx +1 -1
  278. package/src/elements/Breadcrumbs/Breadcrumbs.stories.tsx +1 -1
  279. package/src/elements/Button/Button.stories.tsx +1 -1
  280. package/src/elements/ButtonGroup/ButtonGroup.stories.tsx +1 -1
  281. package/src/elements/Card/Card.stories.tsx +1 -1
  282. package/src/elements/Carousel/Carousel.stories.tsx +1 -1
  283. package/src/elements/Chart/Chart.stories.tsx +1 -1
  284. package/src/elements/Checkbox/Checkbox.stories.tsx +1 -1
  285. package/src/elements/CheckboxGroup/CheckboxGroup.stories.tsx +1 -1
  286. package/src/elements/Combobox/Combobox.stories.tsx +133 -0
  287. package/src/elements/DatePicker/DatePicker.stories.tsx +1 -1
  288. package/src/elements/Dropdown/Dropdown.stories.tsx +1 -1
  289. package/src/elements/FileField/FileField.stories.tsx +1 -1
  290. package/src/elements/FileField/FileProgress.stories.tsx +1 -1
  291. package/src/elements/FormLayout/FormLayout.stories.tsx +1 -1
  292. package/src/elements/Modal/Modal.stories.tsx +1 -1
  293. package/src/elements/NumberField/NumberField.stories.tsx +1 -1
  294. package/src/elements/OTPInput/OTPInput.stories.tsx +1 -1
  295. package/src/elements/Pagination/Pagination.stories.tsx +203 -0
  296. package/src/elements/Panel/Panel.stories.tsx +1 -1
  297. package/src/elements/PasswordField/PasswordField.stories.tsx +167 -0
  298. package/src/elements/Progress/Progress.stories.tsx +1 -1
  299. package/src/elements/RadioGroup/RadioGroup.stories.tsx +1 -1
  300. package/src/elements/Resizable/Resizable.stories.tsx +1 -1
  301. package/src/elements/SearchField/SearchField.stories.tsx +146 -0
  302. package/src/elements/Select/Select.stories.tsx +1 -1
  303. package/src/elements/Skeleton/Skeleton.stories.tsx +1 -1
  304. package/src/elements/Switch/Switch.stories.tsx +1 -1
  305. package/src/elements/Table/Table.stories.tsx +1 -1
  306. package/src/elements/Tabs/Tabs.stories.tsx +1 -1
  307. package/src/elements/TextField/TextField.stories.tsx +1 -1
  308. package/src/elements/TimeField/TimeField.stories.tsx +1 -1
  309. package/src/elements/Toast/Toast.stories.tsx +1 -1
  310. package/src/elements/Tooltip/Tooltip.stories.tsx +1 -1
  311. package/dist/Carousel-NTZX5TOW.js +0 -16
  312. package/dist/Carousel-NTZX5TOW.js.map +0 -1
  313. package/dist/Carousel-YH3DOQJU.mjs +0 -7
  314. package/dist/Carousel-YH3DOQJU.mjs.map +0 -1
  315. package/dist/chunk-2HIUTHMU.mjs +0 -234
  316. package/dist/chunk-2HIUTHMU.mjs.map +0 -1
  317. package/dist/chunk-34GTFTDO.js +0 -431
  318. package/dist/chunk-34GTFTDO.js.map +0 -1
  319. package/dist/chunk-3H7ASYR7.js +0 -250
  320. package/dist/chunk-3H7ASYR7.js.map +0 -1
  321. package/dist/chunk-3IEN7JOP.js +0 -316
  322. package/dist/chunk-3IEN7JOP.js.map +0 -1
  323. package/dist/chunk-3JHN4GAL.js +0 -326
  324. package/dist/chunk-3JHN4GAL.js.map +0 -1
  325. package/dist/chunk-3MJPASQU.js +0 -232
  326. package/dist/chunk-3MJPASQU.js.map +0 -1
  327. package/dist/chunk-3XD2JUL3.js +0 -572
  328. package/dist/chunk-3XD2JUL3.js.map +0 -1
  329. package/dist/chunk-3YOY2VJ6.js +0 -189
  330. package/dist/chunk-3YOY2VJ6.js.map +0 -1
  331. package/dist/chunk-4DU5JSXB.js +0 -408
  332. package/dist/chunk-4DU5JSXB.js.map +0 -1
  333. package/dist/chunk-4E4E2GSS.js +0 -352
  334. package/dist/chunk-4E4E2GSS.js.map +0 -1
  335. package/dist/chunk-4NHAP4AN.mjs +0 -3
  336. package/dist/chunk-4NHAP4AN.mjs.map +0 -1
  337. package/dist/chunk-4S33J5NY.mjs +0 -415
  338. package/dist/chunk-4S33J5NY.mjs.map +0 -1
  339. package/dist/chunk-5SMGRT3G.mjs +0 -354
  340. package/dist/chunk-5SMGRT3G.mjs.map +0 -1
  341. package/dist/chunk-5SVLJN2C.mjs +0 -22
  342. package/dist/chunk-5SVLJN2C.mjs.map +0 -1
  343. package/dist/chunk-66WTU4EB.mjs +0 -299
  344. package/dist/chunk-66WTU4EB.mjs.map +0 -1
  345. package/dist/chunk-6S25NMOT.mjs +0 -335
  346. package/dist/chunk-6S25NMOT.mjs.map +0 -1
  347. package/dist/chunk-6SP7UB3D.js +0 -4
  348. package/dist/chunk-6SP7UB3D.js.map +0 -1
  349. package/dist/chunk-6TYWWQHM.mjs +0 -565
  350. package/dist/chunk-6TYWWQHM.mjs.map +0 -1
  351. package/dist/chunk-A3YUJA6W.mjs +0 -384
  352. package/dist/chunk-A3YUJA6W.mjs.map +0 -1
  353. package/dist/chunk-A6KEDVUR.js +0 -61
  354. package/dist/chunk-A6KEDVUR.js.map +0 -1
  355. package/dist/chunk-A77RUEWL.js +0 -730
  356. package/dist/chunk-A77RUEWL.js.map +0 -1
  357. package/dist/chunk-AA4IKMPE.mjs +0 -3
  358. package/dist/chunk-AA4IKMPE.mjs.map +0 -1
  359. package/dist/chunk-AKIA6GW6.mjs +0 -163
  360. package/dist/chunk-AKIA6GW6.mjs.map +0 -1
  361. package/dist/chunk-AL6P275L.mjs +0 -435
  362. package/dist/chunk-AL6P275L.mjs.map +0 -1
  363. package/dist/chunk-AZ3RJYTB.js +0 -37
  364. package/dist/chunk-AZ3RJYTB.js.map +0 -1
  365. package/dist/chunk-B5Q4UPL6.js +0 -32
  366. package/dist/chunk-B5Q4UPL6.js.map +0 -1
  367. package/dist/chunk-B6DHPMDP.mjs +0 -335
  368. package/dist/chunk-B6DHPMDP.mjs.map +0 -1
  369. package/dist/chunk-BDXKKMBZ.mjs +0 -184
  370. package/dist/chunk-BDXKKMBZ.mjs.map +0 -1
  371. package/dist/chunk-BL6E2DLZ.mjs +0 -52
  372. package/dist/chunk-BL6E2DLZ.mjs.map +0 -1
  373. package/dist/chunk-CGFDS4XS.mjs +0 -121
  374. package/dist/chunk-CGFDS4XS.mjs.map +0 -1
  375. package/dist/chunk-CJIW5TKI.js +0 -139
  376. package/dist/chunk-CJIW5TKI.js.map +0 -1
  377. package/dist/chunk-CKNISJOQ.js +0 -314
  378. package/dist/chunk-CKNISJOQ.js.map +0 -1
  379. package/dist/chunk-D6CBOECS.mjs +0 -1757
  380. package/dist/chunk-D6CBOECS.mjs.map +0 -1
  381. package/dist/chunk-DDWEVC2S.js +0 -166
  382. package/dist/chunk-DDWEVC2S.js.map +0 -1
  383. package/dist/chunk-DZ556D2F.mjs +0 -176
  384. package/dist/chunk-DZ556D2F.mjs.map +0 -1
  385. package/dist/chunk-E2KQFV3O.mjs +0 -10
  386. package/dist/chunk-E2KQFV3O.mjs.map +0 -1
  387. package/dist/chunk-EMMLADSC.js +0 -126
  388. package/dist/chunk-EMMLADSC.js.map +0 -1
  389. package/dist/chunk-EP4WOI5D.mjs +0 -926
  390. package/dist/chunk-EP4WOI5D.mjs.map +0 -1
  391. package/dist/chunk-FJRXLJC2.mjs +0 -160
  392. package/dist/chunk-FJRXLJC2.mjs.map +0 -1
  393. package/dist/chunk-FKQI434R.js +0 -345
  394. package/dist/chunk-FKQI434R.js.map +0 -1
  395. package/dist/chunk-FPKEAJRZ.mjs +0 -100
  396. package/dist/chunk-FPKEAJRZ.mjs.map +0 -1
  397. package/dist/chunk-FWQYB22U.js +0 -183
  398. package/dist/chunk-FWQYB22U.js.map +0 -1
  399. package/dist/chunk-GD5GHTMA.js +0 -189
  400. package/dist/chunk-GD5GHTMA.js.map +0 -1
  401. package/dist/chunk-GE5XTSDZ.js +0 -447
  402. package/dist/chunk-GE5XTSDZ.js.map +0 -1
  403. package/dist/chunk-GVE47ZAX.mjs +0 -32
  404. package/dist/chunk-GVE47ZAX.mjs.map +0 -1
  405. package/dist/chunk-HK46BT5U.mjs +0 -18
  406. package/dist/chunk-HK46BT5U.mjs.map +0 -1
  407. package/dist/chunk-HQVRMR6N.js +0 -365
  408. package/dist/chunk-HQVRMR6N.js.map +0 -1
  409. package/dist/chunk-HSGBJPJO.mjs +0 -398
  410. package/dist/chunk-HSGBJPJO.mjs.map +0 -1
  411. package/dist/chunk-I3AUTOMZ.mjs +0 -125
  412. package/dist/chunk-I3AUTOMZ.mjs.map +0 -1
  413. package/dist/chunk-IEI5LD5C.mjs +0 -1161
  414. package/dist/chunk-IEI5LD5C.mjs.map +0 -1
  415. package/dist/chunk-IIPTC2X7.mjs +0 -118
  416. package/dist/chunk-IIPTC2X7.mjs.map +0 -1
  417. package/dist/chunk-J7TLHF2Q.js +0 -4
  418. package/dist/chunk-J7TLHF2Q.js.map +0 -1
  419. package/dist/chunk-JJOWXFXQ.mjs +0 -765
  420. package/dist/chunk-JJOWXFXQ.mjs.map +0 -1
  421. package/dist/chunk-JPTSS2OA.mjs +0 -3
  422. package/dist/chunk-JPTSS2OA.mjs.map +0 -1
  423. package/dist/chunk-KFXXRLTP.js +0 -396
  424. package/dist/chunk-KFXXRLTP.js.map +0 -1
  425. package/dist/chunk-KPRRBSG6.mjs +0 -272
  426. package/dist/chunk-KPRRBSG6.mjs.map +0 -1
  427. package/dist/chunk-NFSBGRDB.mjs +0 -57
  428. package/dist/chunk-NFSBGRDB.mjs.map +0 -1
  429. package/dist/chunk-NGJVCFTM.js +0 -219
  430. package/dist/chunk-NGJVCFTM.js.map +0 -1
  431. package/dist/chunk-NSQ6MZJ6.mjs +0 -728
  432. package/dist/chunk-NSQ6MZJ6.mjs.map +0 -1
  433. package/dist/chunk-NYQYHT76.mjs +0 -296
  434. package/dist/chunk-NYQYHT76.mjs.map +0 -1
  435. package/dist/chunk-OLJJGI5B.js +0 -1193
  436. package/dist/chunk-OLJJGI5B.js.map +0 -1
  437. package/dist/chunk-Q3572X2J.js +0 -292
  438. package/dist/chunk-Q3572X2J.js.map +0 -1
  439. package/dist/chunk-QH7N7D4I.mjs +0 -210
  440. package/dist/chunk-QH7N7D4I.mjs.map +0 -1
  441. package/dist/chunk-R7XUIV25.js +0 -466
  442. package/dist/chunk-R7XUIV25.js.map +0 -1
  443. package/dist/chunk-RFFO4KPM.js +0 -135
  444. package/dist/chunk-RFFO4KPM.js.map +0 -1
  445. package/dist/chunk-RFX7QKA7.mjs +0 -180
  446. package/dist/chunk-RFX7QKA7.mjs.map +0 -1
  447. package/dist/chunk-SN5LFAP3.js +0 -940
  448. package/dist/chunk-SN5LFAP3.js.map +0 -1
  449. package/dist/chunk-T4COXKQ3.js +0 -24
  450. package/dist/chunk-T4COXKQ3.js.map +0 -1
  451. package/dist/chunk-TS54QM27.js +0 -125
  452. package/dist/chunk-TS54QM27.js.map +0 -1
  453. package/dist/chunk-UE2S4PCX.mjs +0 -220
  454. package/dist/chunk-UE2S4PCX.mjs.map +0 -1
  455. package/dist/chunk-UTW3QX2A.mjs +0 -282
  456. package/dist/chunk-UTW3QX2A.mjs.map +0 -1
  457. package/dist/chunk-V74LGMAE.js +0 -1767
  458. package/dist/chunk-V74LGMAE.js.map +0 -1
  459. package/dist/chunk-VIREG536.js +0 -12
  460. package/dist/chunk-VIREG536.js.map +0 -1
  461. package/dist/chunk-VY7M7346.js +0 -4
  462. package/dist/chunk-VY7M7346.js.map +0 -1
  463. package/dist/chunk-W3TJOO7H.mjs +0 -319
  464. package/dist/chunk-W3TJOO7H.mjs.map +0 -1
  465. package/dist/chunk-WIUOB36M.js +0 -54
  466. package/dist/chunk-WIUOB36M.js.map +0 -1
  467. package/dist/chunk-WJGLM4CY.js +0 -291
  468. package/dist/chunk-WJGLM4CY.js.map +0 -1
  469. package/dist/chunk-WNURH5OO.mjs +0 -453
  470. package/dist/chunk-WNURH5OO.mjs.map +0 -1
  471. package/dist/chunk-X25TNRSD.mjs +0 -364
  472. package/dist/chunk-X25TNRSD.mjs.map +0 -1
  473. package/dist/chunk-Y3GT7ETK.js +0 -108
  474. package/dist/chunk-Y3GT7ETK.js.map +0 -1
  475. package/dist/chunk-Z4FRNOF6.mjs +0 -115
  476. package/dist/chunk-Z4FRNOF6.mjs.map +0 -1
  477. package/dist/chunk-ZMYLD3BN.js +0 -166
  478. package/dist/chunk-ZMYLD3BN.js.map +0 -1
  479. package/dist/chunk-ZP2KV6EX.js +0 -815
  480. package/dist/chunk-ZP2KV6EX.js.map +0 -1
  481. package/dist/chunk-ZVKXFELU.js +0 -366
  482. package/dist/chunk-ZVKXFELU.js.map +0 -1
@@ -1,1757 +0,0 @@
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