@langchain/macaw-components 1.0.0-beta.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 (566) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +27 -0
  3. package/dist/_chunks/ErrorState-CmPX01HV.js +13361 -0
  4. package/dist/_chunks/ErrorState-CmPX01HV.js.map +1 -0
  5. package/dist/_chunks/LoadingIndicator-DgtU9aqD.js +80 -0
  6. package/dist/_chunks/LoadingIndicator-DgtU9aqD.js.map +1 -0
  7. package/dist/base.css +305 -0
  8. package/dist/catalog.json +1675 -0
  9. package/dist/components/Avatar/Avatar.d.ts +28 -0
  10. package/dist/components/Avatar/Avatar.js +47 -0
  11. package/dist/components/Avatar/Avatar.js.map +1 -0
  12. package/dist/components/Avatar/index.d.ts +2 -0
  13. package/dist/components/Avatar/index.js +2 -0
  14. package/dist/components/Badge/Badge.d.ts +25 -0
  15. package/dist/components/Badge/Badge.js +82 -0
  16. package/dist/components/Badge/Badge.js.map +1 -0
  17. package/dist/components/Badge/index.d.ts +2 -0
  18. package/dist/components/Badge/index.js +2 -0
  19. package/dist/components/Banner/Banner.d.ts +15 -0
  20. package/dist/components/Banner/Banner.js +102 -0
  21. package/dist/components/Banner/Banner.js.map +1 -0
  22. package/dist/components/Banner/index.d.ts +2 -0
  23. package/dist/components/Banner/index.js +2 -0
  24. package/dist/components/BarChart/AnimatedBar.d.ts +20 -0
  25. package/dist/components/BarChart/AnimatedBar.js +65 -0
  26. package/dist/components/BarChart/AnimatedBar.js.map +1 -0
  27. package/dist/components/BarChart/BarChart.d.ts +25 -0
  28. package/dist/components/BarChart/BarChart.js +248 -0
  29. package/dist/components/BarChart/BarChart.js.map +1 -0
  30. package/dist/components/BarChart/BarChart.types.d.ts +239 -0
  31. package/dist/components/BarChart/BarChart.types.js +0 -0
  32. package/dist/components/BarChart/BarChart.utils.d.ts +51 -0
  33. package/dist/components/BarChart/BarChart.utils.js +215 -0
  34. package/dist/components/BarChart/BarChart.utils.js.map +1 -0
  35. package/dist/components/BarChart/BarChartAxes.d.ts +22 -0
  36. package/dist/components/BarChart/BarChartAxes.js +144 -0
  37. package/dist/components/BarChart/BarChartAxes.js.map +1 -0
  38. package/dist/components/BarChart/BarChartGuides.d.ts +22 -0
  39. package/dist/components/BarChart/BarChartGuides.js +83 -0
  40. package/dist/components/BarChart/BarChartGuides.js.map +1 -0
  41. package/dist/components/BarChart/BarChartPlot.d.ts +40 -0
  42. package/dist/components/BarChart/BarChartPlot.js +262 -0
  43. package/dist/components/BarChart/BarChartPlot.js.map +1 -0
  44. package/dist/components/BarChart/constants.d.ts +21 -0
  45. package/dist/components/BarChart/constants.js +26 -0
  46. package/dist/components/BarChart/constants.js.map +1 -0
  47. package/dist/components/BarChart/index.d.ts +3 -0
  48. package/dist/components/BarChart/index.js +3 -0
  49. package/dist/components/Button/Button.d.ts +36 -0
  50. package/dist/components/Button/Button.js +99 -0
  51. package/dist/components/Button/Button.js.map +1 -0
  52. package/dist/components/Button/constants.d.ts +26 -0
  53. package/dist/components/Button/constants.js +31 -0
  54. package/dist/components/Button/constants.js.map +1 -0
  55. package/dist/components/Button/index.d.ts +2 -0
  56. package/dist/components/Button/index.js +2 -0
  57. package/dist/components/ButtonGroup/ButtonGroup.d.ts +30 -0
  58. package/dist/components/ButtonGroup/ButtonGroup.js +26 -0
  59. package/dist/components/ButtonGroup/ButtonGroup.js.map +1 -0
  60. package/dist/components/ButtonGroup/index.d.ts +2 -0
  61. package/dist/components/ButtonGroup/index.js +2 -0
  62. package/dist/components/Card/Card.d.ts +10 -0
  63. package/dist/components/Card/Card.js +23 -0
  64. package/dist/components/Card/Card.js.map +1 -0
  65. package/dist/components/Card/index.d.ts +2 -0
  66. package/dist/components/Card/index.js +2 -0
  67. package/dist/components/ChartCard/ChartCard.d.ts +53 -0
  68. package/dist/components/ChartCard/ChartCard.js +172 -0
  69. package/dist/components/ChartCard/ChartCard.js.map +1 -0
  70. package/dist/components/ChartCard/ChartCardSkeleton.d.ts +7 -0
  71. package/dist/components/ChartCard/ChartCardSkeleton.js +61 -0
  72. package/dist/components/ChartCard/ChartCardSkeleton.js.map +1 -0
  73. package/dist/components/ChartCard/index.d.ts +4 -0
  74. package/dist/components/ChartCard/index.js +3 -0
  75. package/dist/components/ChartLegend/ChartLegend.d.ts +19 -0
  76. package/dist/components/ChartLegend/ChartLegend.js +195 -0
  77. package/dist/components/ChartLegend/ChartLegend.js.map +1 -0
  78. package/dist/components/ChartLegend/ChartLegendItemRenderer.d.ts +14 -0
  79. package/dist/components/ChartLegend/ChartLegendItemRenderer.js +90 -0
  80. package/dist/components/ChartLegend/ChartLegendItemRenderer.js.map +1 -0
  81. package/dist/components/ChartLegend/index.d.ts +3 -0
  82. package/dist/components/ChartLegend/index.js +3 -0
  83. package/dist/components/ChartLegend/useChartLegendActiveItem.d.ts +7 -0
  84. package/dist/components/ChartLegend/useChartLegendActiveItem.js +35 -0
  85. package/dist/components/ChartLegend/useChartLegendActiveItem.js.map +1 -0
  86. package/dist/components/ChartLegend/utils.d.ts +20 -0
  87. package/dist/components/ChartLegend/utils.js +33 -0
  88. package/dist/components/ChartLegend/utils.js.map +1 -0
  89. package/dist/components/ChartTooltip/ChartTooltip.d.ts +23 -0
  90. package/dist/components/ChartTooltip/ChartTooltip.js +83 -0
  91. package/dist/components/ChartTooltip/ChartTooltip.js.map +1 -0
  92. package/dist/components/ChartTooltip/index.d.ts +2 -0
  93. package/dist/components/ChartTooltip/index.js +2 -0
  94. package/dist/components/Checkbox/Checkbox.d.ts +58 -0
  95. package/dist/components/Checkbox/Checkbox.js +50 -0
  96. package/dist/components/Checkbox/Checkbox.js.map +1 -0
  97. package/dist/components/Checkbox/constants.d.ts +28 -0
  98. package/dist/components/Checkbox/constants.js +57 -0
  99. package/dist/components/Checkbox/constants.js.map +1 -0
  100. package/dist/components/Checkbox/getCheckedState.d.ts +6 -0
  101. package/dist/components/Checkbox/getCheckedState.js +14 -0
  102. package/dist/components/Checkbox/getCheckedState.js.map +1 -0
  103. package/dist/components/Checkbox/index.d.ts +3 -0
  104. package/dist/components/Checkbox/index.js +3 -0
  105. package/dist/components/CircularProgress/CircularProgress.d.ts +54 -0
  106. package/dist/components/CircularProgress/CircularProgress.js +85 -0
  107. package/dist/components/CircularProgress/CircularProgress.js.map +1 -0
  108. package/dist/components/CircularProgress/index.d.ts +2 -0
  109. package/dist/components/CircularProgress/index.js +2 -0
  110. package/dist/components/Code/Code.utils.d.ts +24 -0
  111. package/dist/components/Code/Code.utils.js +160 -0
  112. package/dist/components/Code/Code.utils.js.map +1 -0
  113. package/dist/components/Code/CodeLite.d.ts +19 -0
  114. package/dist/components/Code/CodeLite.js +146 -0
  115. package/dist/components/Code/CodeLite.js.map +1 -0
  116. package/dist/components/Code/CodeLite.utils.d.ts +24 -0
  117. package/dist/components/Code/CodeLite.utils.js +273 -0
  118. package/dist/components/Code/CodeLite.utils.js.map +1 -0
  119. package/dist/components/Code/ImageReplacerExtension.d.ts +9 -0
  120. package/dist/components/Code/ImageReplacerExtension.js +227 -0
  121. package/dist/components/Code/ImageReplacerExtension.js.map +1 -0
  122. package/dist/components/Code/JsonHighlighterExtension.d.ts +4 -0
  123. package/dist/components/Code/JsonHighlighterExtension.js +172 -0
  124. package/dist/components/Code/JsonHighlighterExtension.js.map +1 -0
  125. package/dist/components/Code/constants.d.ts +6 -0
  126. package/dist/components/Code/constants.js +11 -0
  127. package/dist/components/Code/constants.js.map +1 -0
  128. package/dist/components/Code/index.d.ts +30 -0
  129. package/dist/components/Code/index.js +140 -0
  130. package/dist/components/Code/index.js.map +1 -0
  131. package/dist/components/Code/languages/json.d.ts +1 -0
  132. package/dist/components/Code/languages/json.js +7 -0
  133. package/dist/components/Code/languages/json.js.map +1 -0
  134. package/dist/components/Code/languages/languages.d.ts +7 -0
  135. package/dist/components/Code/languages/languages.js +12 -0
  136. package/dist/components/Code/languages/languages.js.map +1 -0
  137. package/dist/components/Code/languages/python.d.ts +1 -0
  138. package/dist/components/Code/languages/python.js +7 -0
  139. package/dist/components/Code/languages/python.js.map +1 -0
  140. package/dist/components/Code/languages/shell.d.ts +7 -0
  141. package/dist/components/Code/languages/shell.js +241 -0
  142. package/dist/components/Code/languages/shell.js.map +1 -0
  143. package/dist/components/Code/languages/typescript.d.ts +1 -0
  144. package/dist/components/Code/languages/typescript.js +7 -0
  145. package/dist/components/Code/languages/typescript.js.map +1 -0
  146. package/dist/components/Code/languages/yaml.d.ts +2 -0
  147. package/dist/components/Code/languages/yaml.js +44 -0
  148. package/dist/components/Code/languages/yaml.js.map +1 -0
  149. package/dist/components/Code/types.d.ts +8 -0
  150. package/dist/components/Code/types.js +0 -0
  151. package/dist/components/Code/utils.d.ts +4 -0
  152. package/dist/components/Code/utils.js +27 -0
  153. package/dist/components/Code/utils.js.map +1 -0
  154. package/dist/components/Command/Command.d.ts +78 -0
  155. package/dist/components/Command/Command.js +78 -0
  156. package/dist/components/Command/Command.js.map +1 -0
  157. package/dist/components/Command/CommandMenu.d.ts +65 -0
  158. package/dist/components/Command/CommandMenu.js +101 -0
  159. package/dist/components/Command/CommandMenu.js.map +1 -0
  160. package/dist/components/Command/index.d.ts +4 -0
  161. package/dist/components/Command/index.js +3 -0
  162. package/dist/components/ContextMenu/ContextMenu.d.ts +9 -0
  163. package/dist/components/ContextMenu/ContextMenu.js +43 -0
  164. package/dist/components/ContextMenu/ContextMenu.js.map +1 -0
  165. package/dist/components/ContextMenu/index.d.ts +1 -0
  166. package/dist/components/ContextMenu/index.js +2 -0
  167. package/dist/components/CopyButton/CopyButton.d.ts +24 -0
  168. package/dist/components/CopyButton/CopyButton.js +121 -0
  169. package/dist/components/CopyButton/CopyButton.js.map +1 -0
  170. package/dist/components/CopyButton/copyToClipboard.d.ts +1 -0
  171. package/dist/components/CopyButton/copyToClipboard.js +29 -0
  172. package/dist/components/CopyButton/copyToClipboard.js.map +1 -0
  173. package/dist/components/CopyButton/index.d.ts +4 -0
  174. package/dist/components/CopyButton/index.js +4 -0
  175. package/dist/components/CopyButton/useCopy.d.ts +10 -0
  176. package/dist/components/CopyButton/useCopy.js +46 -0
  177. package/dist/components/CopyButton/useCopy.js.map +1 -0
  178. package/dist/components/Dialog/index.d.ts +49 -0
  179. package/dist/components/Dialog/index.js +130 -0
  180. package/dist/components/Dialog/index.js.map +1 -0
  181. package/dist/components/Divider/Divider.d.ts +9 -0
  182. package/dist/components/Divider/Divider.js +27 -0
  183. package/dist/components/Divider/Divider.js.map +1 -0
  184. package/dist/components/Divider/index.d.ts +2 -0
  185. package/dist/components/Divider/index.js +2 -0
  186. package/dist/components/DonutChart/DonutChart.d.ts +101 -0
  187. package/dist/components/DonutChart/DonutChart.js +197 -0
  188. package/dist/components/DonutChart/DonutChart.js.map +1 -0
  189. package/dist/components/DonutChart/DonutChart.utils.d.ts +38 -0
  190. package/dist/components/DonutChart/DonutChart.utils.js +93 -0
  191. package/dist/components/DonutChart/DonutChart.utils.js.map +1 -0
  192. package/dist/components/DonutChart/constants.d.ts +7 -0
  193. package/dist/components/DonutChart/constants.js +12 -0
  194. package/dist/components/DonutChart/constants.js.map +1 -0
  195. package/dist/components/DonutChart/index.d.ts +4 -0
  196. package/dist/components/DonutChart/index.js +4 -0
  197. package/dist/components/DropdownMenu/DropdownMenu.d.ts +24 -0
  198. package/dist/components/DropdownMenu/DropdownMenu.js +149 -0
  199. package/dist/components/DropdownMenu/DropdownMenu.js.map +1 -0
  200. package/dist/components/DropdownMenu/index.d.ts +1 -0
  201. package/dist/components/DropdownMenu/index.js +2 -0
  202. package/dist/components/EmptyState/EmptyState.d.ts +26 -0
  203. package/dist/components/EmptyState/EmptyState.js +85 -0
  204. package/dist/components/EmptyState/EmptyState.js.map +1 -0
  205. package/dist/components/EmptyState/index.d.ts +2 -0
  206. package/dist/components/EmptyState/index.js +2 -0
  207. package/dist/components/ErrorBoundary.d.ts +35 -0
  208. package/dist/components/ErrorBoundary.js +41 -0
  209. package/dist/components/ErrorBoundary.js.map +1 -0
  210. package/dist/components/ErrorMessage/ErrorMessage.d.ts +17 -0
  211. package/dist/components/ErrorMessage/ErrorMessage.js +146 -0
  212. package/dist/components/ErrorMessage/ErrorMessage.js.map +1 -0
  213. package/dist/components/ErrorMessage/index.d.ts +2 -0
  214. package/dist/components/ErrorMessage/index.js +2 -0
  215. package/dist/components/ErrorState/ErrorState.d.ts +23 -0
  216. package/dist/components/ErrorState/ErrorState.js +2 -0
  217. package/dist/components/ErrorState/index.d.ts +2 -0
  218. package/dist/components/ErrorState/index.js +2 -0
  219. package/dist/components/GroupedTabs/GroupedTabs.d.ts +31 -0
  220. package/dist/components/GroupedTabs/GroupedTabs.js +92 -0
  221. package/dist/components/GroupedTabs/GroupedTabs.js.map +1 -0
  222. package/dist/components/GroupedTabs/index.d.ts +2 -0
  223. package/dist/components/GroupedTabs/index.js +2 -0
  224. package/dist/components/HoverCard.d.ts +4 -0
  225. package/dist/components/HoverCard.js +34 -0
  226. package/dist/components/HoverCard.js.map +1 -0
  227. package/dist/components/Icon/Icon.d.ts +25 -0
  228. package/dist/components/Icon/Icon.js +57 -0
  229. package/dist/components/Icon/Icon.js.map +1 -0
  230. package/dist/components/Icon/index.d.ts +2 -0
  231. package/dist/components/Icon/index.js +2 -0
  232. package/dist/components/IconButton/IconButton.d.ts +35 -0
  233. package/dist/components/IconButton/IconButton.js +73 -0
  234. package/dist/components/IconButton/IconButton.js.map +1 -0
  235. package/dist/components/IconButton/index.d.ts +2 -0
  236. package/dist/components/IconButton/index.js +2 -0
  237. package/dist/components/Input/Input.d.ts +72 -0
  238. package/dist/components/Input/Input.js +221 -0
  239. package/dist/components/Input/Input.js.map +1 -0
  240. package/dist/components/Input/index.d.ts +2 -0
  241. package/dist/components/Input/index.js +2 -0
  242. package/dist/components/Input/inputStyles.d.ts +28 -0
  243. package/dist/components/Input/inputStyles.js +45 -0
  244. package/dist/components/Input/inputStyles.js.map +1 -0
  245. package/dist/components/Kbd/Kbd.d.ts +15 -0
  246. package/dist/components/Kbd/Kbd.js +30 -0
  247. package/dist/components/Kbd/Kbd.js.map +1 -0
  248. package/dist/components/Kbd/index.d.ts +2 -0
  249. package/dist/components/Kbd/index.js +2 -0
  250. package/dist/components/LineChart/LineChart.d.ts +8 -0
  251. package/dist/components/LineChart/LineChart.js +194 -0
  252. package/dist/components/LineChart/LineChart.js.map +1 -0
  253. package/dist/components/LineChart/LineChart.types.d.ts +138 -0
  254. package/dist/components/LineChart/LineChart.types.js +0 -0
  255. package/dist/components/LineChart/LineChart.utils.d.ts +29 -0
  256. package/dist/components/LineChart/LineChart.utils.js +123 -0
  257. package/dist/components/LineChart/LineChart.utils.js.map +1 -0
  258. package/dist/components/LineChart/LineChartPlot.d.ts +43 -0
  259. package/dist/components/LineChart/LineChartPlot.js +306 -0
  260. package/dist/components/LineChart/LineChartPlot.js.map +1 -0
  261. package/dist/components/LineChart/constants.d.ts +3 -0
  262. package/dist/components/LineChart/constants.js +8 -0
  263. package/dist/components/LineChart/constants.js.map +1 -0
  264. package/dist/components/LineChart/index.d.ts +2 -0
  265. package/dist/components/LineChart/index.js +2 -0
  266. package/dist/components/LinearProgress/LinearProgress.d.ts +16 -0
  267. package/dist/components/LinearProgress/LinearProgress.js +42 -0
  268. package/dist/components/LinearProgress/LinearProgress.js.map +1 -0
  269. package/dist/components/LinearProgress/index.d.ts +2 -0
  270. package/dist/components/LinearProgress/index.js +2 -0
  271. package/dist/components/Link/Link.d.ts +30 -0
  272. package/dist/components/Link/Link.js +51 -0
  273. package/dist/components/Link/Link.js.map +1 -0
  274. package/dist/components/Link/index.d.ts +2 -0
  275. package/dist/components/Link/index.js +2 -0
  276. package/dist/components/Logo/index.d.ts +17 -0
  277. package/dist/components/Logo/index.js +705 -0
  278. package/dist/components/Logo/index.js.map +1 -0
  279. package/dist/components/MetricChart/MetricChart.d.ts +9 -0
  280. package/dist/components/MetricChart/MetricChart.js +42 -0
  281. package/dist/components/MetricChart/MetricChart.js.map +1 -0
  282. package/dist/components/MetricChart/formatters.d.ts +18 -0
  283. package/dist/components/MetricChart/formatters.js +34 -0
  284. package/dist/components/MetricChart/formatters.js.map +1 -0
  285. package/dist/components/MetricChart/index.d.ts +4 -0
  286. package/dist/components/MetricChart/index.js +3 -0
  287. package/dist/components/Pane/Pane.d.ts +29 -0
  288. package/dist/components/Pane/Pane.js +171 -0
  289. package/dist/components/Pane/Pane.js.map +1 -0
  290. package/dist/components/Pane/Pane.utils.d.ts +10 -0
  291. package/dist/components/Pane/Pane.utils.js +7 -0
  292. package/dist/components/Pane/Pane.utils.js.map +1 -0
  293. package/dist/components/Pane/index.d.ts +3 -0
  294. package/dist/components/Pane/index.js +3 -0
  295. package/dist/components/PlainTextEditor/hooks/useResizeTextEditor.d.ts +9 -0
  296. package/dist/components/PlainTextEditor/hooks/useResizeTextEditor.js +76 -0
  297. package/dist/components/PlainTextEditor/hooks/useResizeTextEditor.js.map +1 -0
  298. package/dist/components/PlainTextEditor/index.d.ts +18 -0
  299. package/dist/components/PlainTextEditor/index.js +71 -0
  300. package/dist/components/PlainTextEditor/index.js.map +1 -0
  301. package/dist/components/Popover/Popover.d.ts +13 -0
  302. package/dist/components/Popover/Popover.js +48 -0
  303. package/dist/components/Popover/Popover.js.map +1 -0
  304. package/dist/components/Popover/constants.d.ts +1 -0
  305. package/dist/components/Popover/constants.js +6 -0
  306. package/dist/components/Popover/constants.js.map +1 -0
  307. package/dist/components/Popover/index.d.ts +1 -0
  308. package/dist/components/Popover/index.js +2 -0
  309. package/dist/components/PortalSlot.d.ts +11 -0
  310. package/dist/components/PortalSlot.js +41 -0
  311. package/dist/components/PortalSlot.js.map +1 -0
  312. package/dist/components/ProgressBar/ProgressBar.d.ts +38 -0
  313. package/dist/components/ProgressBar/ProgressBar.js +82 -0
  314. package/dist/components/ProgressBar/ProgressBar.js.map +1 -0
  315. package/dist/components/ProgressBar/index.d.ts +2 -0
  316. package/dist/components/ProgressBar/index.js +2 -0
  317. package/dist/components/RadioButton/RadioButton.d.ts +62 -0
  318. package/dist/components/RadioButton/RadioButton.js +38 -0
  319. package/dist/components/RadioButton/RadioButton.js.map +1 -0
  320. package/dist/components/RadioButton/constants.d.ts +30 -0
  321. package/dist/components/RadioButton/constants.js +55 -0
  322. package/dist/components/RadioButton/constants.js.map +1 -0
  323. package/dist/components/RadioButton/index.d.ts +2 -0
  324. package/dist/components/RadioButton/index.js +2 -0
  325. package/dist/components/RadioCard/RadioCard.d.ts +26 -0
  326. package/dist/components/RadioCard/RadioCard.js +43 -0
  327. package/dist/components/RadioCard/RadioCard.js.map +1 -0
  328. package/dist/components/RadioCard/index.d.ts +2 -0
  329. package/dist/components/RadioCard/index.js +2 -0
  330. package/dist/components/RadioGroup/RadioGroup.d.ts +5 -0
  331. package/dist/components/RadioGroup/RadioGroup.js +17 -0
  332. package/dist/components/RadioGroup/RadioGroup.js.map +1 -0
  333. package/dist/components/RadioGroup/RadioGroupItem.d.ts +5 -0
  334. package/dist/components/RadioGroup/RadioGroupItem.js +22 -0
  335. package/dist/components/RadioGroup/RadioGroupItem.js.map +1 -0
  336. package/dist/components/RadioGroup/index.d.ts +4 -0
  337. package/dist/components/RadioGroup/index.js +3 -0
  338. package/dist/components/Select/Select.d.ts +84 -0
  339. package/dist/components/Select/Select.js +120 -0
  340. package/dist/components/Select/Select.js.map +1 -0
  341. package/dist/components/Select/SelectPrimitive.d.ts +17 -0
  342. package/dist/components/Select/SelectPrimitive.js +126 -0
  343. package/dist/components/Select/SelectPrimitive.js.map +1 -0
  344. package/dist/components/Select/index.d.ts +4 -0
  345. package/dist/components/Select/index.js +3 -0
  346. package/dist/components/Skeleton/Skeleton.d.ts +13 -0
  347. package/dist/components/Skeleton/Skeleton.js +25 -0
  348. package/dist/components/Skeleton/Skeleton.js.map +1 -0
  349. package/dist/components/Skeleton/index.d.ts +1 -0
  350. package/dist/components/Skeleton/index.js +2 -0
  351. package/dist/components/Slider/Slider.d.ts +33 -0
  352. package/dist/components/Slider/Slider.js +64 -0
  353. package/dist/components/Slider/Slider.js.map +1 -0
  354. package/dist/components/Slider/index.d.ts +2 -0
  355. package/dist/components/Slider/index.js +2 -0
  356. package/dist/components/SparkLineChart/SparkLineChart.d.ts +14 -0
  357. package/dist/components/SparkLineChart/SparkLineChart.js +112 -0
  358. package/dist/components/SparkLineChart/SparkLineChart.js.map +1 -0
  359. package/dist/components/SparkLineChart/index.d.ts +2 -0
  360. package/dist/components/SparkLineChart/index.js +2 -0
  361. package/dist/components/Spinner/Spinner.d.ts +12 -0
  362. package/dist/components/Spinner/Spinner.js +33 -0
  363. package/dist/components/Spinner/Spinner.js.map +1 -0
  364. package/dist/components/Spinner/index.d.ts +1 -0
  365. package/dist/components/Spinner/index.js +2 -0
  366. package/dist/components/SplitViewPane/SplitViewPane.d.ts +41 -0
  367. package/dist/components/SplitViewPane/SplitViewPane.js +314 -0
  368. package/dist/components/SplitViewPane/SplitViewPane.js.map +1 -0
  369. package/dist/components/SplitViewPane/SplitViewPaneHeader.d.ts +22 -0
  370. package/dist/components/SplitViewPane/SplitViewPaneHeader.js +105 -0
  371. package/dist/components/SplitViewPane/SplitViewPaneHeader.js.map +1 -0
  372. package/dist/components/SplitViewPane/index.d.ts +2 -0
  373. package/dist/components/SplitViewPane/index.js +3 -0
  374. package/dist/components/SplitViewPane/openPaneRegistry.d.ts +2 -0
  375. package/dist/components/SplitViewPane/openPaneRegistry.js +49 -0
  376. package/dist/components/SplitViewPane/openPaneRegistry.js.map +1 -0
  377. package/dist/components/Switch/Switch.d.ts +35 -0
  378. package/dist/components/Switch/Switch.js +65 -0
  379. package/dist/components/Switch/Switch.js.map +1 -0
  380. package/dist/components/Switch/index.d.ts +2 -0
  381. package/dist/components/Switch/index.js +2 -0
  382. package/dist/components/Tabs/index.d.ts +27 -0
  383. package/dist/components/Tabs/index.js +45 -0
  384. package/dist/components/Tabs/index.js.map +1 -0
  385. package/dist/components/Text/Text.d.ts +13 -0
  386. package/dist/components/Text/Text.js +58 -0
  387. package/dist/components/Text/Text.js.map +1 -0
  388. package/dist/components/Text/index.d.ts +2 -0
  389. package/dist/components/Text/index.js +2 -0
  390. package/dist/components/TextVirtualizer.d.ts +8 -0
  391. package/dist/components/TextVirtualizer.js +53 -0
  392. package/dist/components/TextVirtualizer.js.map +1 -0
  393. package/dist/components/TextWithLinks.d.ts +6 -0
  394. package/dist/components/TextWithLinks.js +61 -0
  395. package/dist/components/TextWithLinks.js.map +1 -0
  396. package/dist/components/Textarea/Textarea.d.ts +47 -0
  397. package/dist/components/Textarea/Textarea.js +150 -0
  398. package/dist/components/Textarea/Textarea.js.map +1 -0
  399. package/dist/components/Textarea/index.d.ts +2 -0
  400. package/dist/components/Textarea/index.js +2 -0
  401. package/dist/components/ThinkingState/LoadingIndicator.d.ts +19 -0
  402. package/dist/components/ThinkingState/LoadingIndicator.js +2 -0
  403. package/dist/components/ThinkingState/NOTICE +25 -0
  404. package/dist/components/ThinkingState/ThinkingState.d.ts +21 -0
  405. package/dist/components/ThinkingState/ThinkingState.js +42 -0
  406. package/dist/components/ThinkingState/ThinkingState.js.map +1 -0
  407. package/dist/components/ThinkingState/ThinkingStateTimer.d.ts +9 -0
  408. package/dist/components/ThinkingState/ThinkingStateTimer.js +43 -0
  409. package/dist/components/ThinkingState/ThinkingStateTimer.js.map +1 -0
  410. package/dist/components/ThinkingState/index.d.ts +4 -0
  411. package/dist/components/ThinkingState/index.js +3 -0
  412. package/dist/components/Toast/ToastContext.d.ts +5 -0
  413. package/dist/components/Toast/ToastContext.js +9 -0
  414. package/dist/components/Toast/ToastContext.js.map +1 -0
  415. package/dist/components/Toast/index.d.ts +13 -0
  416. package/dist/components/Toast/index.js +166 -0
  417. package/dist/components/Toast/index.js.map +1 -0
  418. package/dist/components/Toast/useToast.d.ts +3 -0
  419. package/dist/components/Toast/useToast.js +11 -0
  420. package/dist/components/Toast/useToast.js.map +1 -0
  421. package/dist/components/Tooltip/Tooltip.d.ts +19 -0
  422. package/dist/components/Tooltip/Tooltip.js +57 -0
  423. package/dist/components/Tooltip/Tooltip.js.map +1 -0
  424. package/dist/components/Tooltip/index.d.ts +3 -0
  425. package/dist/components/Tooltip/index.js +3 -0
  426. package/dist/components/TopList/TopList.d.ts +3 -0
  427. package/dist/components/TopList/TopList.js +186 -0
  428. package/dist/components/TopList/TopList.js.map +1 -0
  429. package/dist/components/TopList/TopList.types.d.ts +34 -0
  430. package/dist/components/TopList/TopList.types.js +0 -0
  431. package/dist/components/TopList/TopList.utils.d.ts +3 -0
  432. package/dist/components/TopList/TopList.utils.js +16 -0
  433. package/dist/components/TopList/TopList.utils.js.map +1 -0
  434. package/dist/components/TopList/index.d.ts +2 -0
  435. package/dist/components/TopList/index.js +2 -0
  436. package/dist/components/Typeahead/Typeahead.d.ts +5 -0
  437. package/dist/components/Typeahead/Typeahead.js +305 -0
  438. package/dist/components/Typeahead/Typeahead.js.map +1 -0
  439. package/dist/components/Typeahead/Typeahead.types.d.ts +99 -0
  440. package/dist/components/Typeahead/Typeahead.types.js +0 -0
  441. package/dist/components/Typeahead/Typeahead.utils.d.ts +25 -0
  442. package/dist/components/Typeahead/Typeahead.utils.js +73 -0
  443. package/dist/components/Typeahead/Typeahead.utils.js.map +1 -0
  444. package/dist/components/Typeahead/TypeaheadParts.d.ts +25 -0
  445. package/dist/components/Typeahead/TypeaheadParts.js +109 -0
  446. package/dist/components/Typeahead/TypeaheadParts.js.map +1 -0
  447. package/dist/components/Typeahead/TypeaheadView.d.ts +81 -0
  448. package/dist/components/Typeahead/TypeaheadView.js +228 -0
  449. package/dist/components/Typeahead/TypeaheadView.js.map +1 -0
  450. package/dist/components/Typeahead/index.d.ts +2 -0
  451. package/dist/components/Typeahead/index.js +2 -0
  452. package/dist/components/Typeahead/useTypeaheadDomSync.d.ts +15 -0
  453. package/dist/components/Typeahead/useTypeaheadDomSync.js +43 -0
  454. package/dist/components/Typeahead/useTypeaheadDomSync.js.map +1 -0
  455. package/dist/components/Typeahead/useTypeaheadUncontrolledInput.d.ts +11 -0
  456. package/dist/components/Typeahead/useTypeaheadUncontrolledInput.js +32 -0
  457. package/dist/components/Typeahead/useTypeaheadUncontrolledInput.js.map +1 -0
  458. package/dist/components/UnsavedChangesDialog.d.ts +14 -0
  459. package/dist/components/UnsavedChangesDialog.js +67 -0
  460. package/dist/components/UnsavedChangesDialog.js.map +1 -0
  461. package/dist/components/index.d.ts +58 -0
  462. package/dist/components/index.js +35 -0
  463. package/dist/components.css +102 -0
  464. package/dist/contexts/ErrorReporterContext.d.ts +6 -0
  465. package/dist/contexts/ErrorReporterContext.js +7 -0
  466. package/dist/contexts/ErrorReporterContext.js.map +1 -0
  467. package/dist/hooks/AppThemeProvider.d.ts +8 -0
  468. package/dist/hooks/AppThemeProvider.js +52 -0
  469. package/dist/hooks/AppThemeProvider.js.map +1 -0
  470. package/dist/hooks/useColorScheme.d.ts +20 -0
  471. package/dist/hooks/useColorScheme.js +50 -0
  472. package/dist/hooks/useColorScheme.js.map +1 -0
  473. package/dist/icons/LongTailPhosphorIcons.d.ts +51 -0
  474. package/dist/icons/LongTailPhosphorIcons.js +102 -0
  475. package/dist/icons/LongTailPhosphorIcons.js.map +1 -0
  476. package/dist/icons/PaddedPhosphorIcons.d.ts +17 -0
  477. package/dist/icons/PaddedPhosphorIcons.js +55 -0
  478. package/dist/icons/PaddedPhosphorIcons.js.map +1 -0
  479. package/dist/icons/WeightedPhosphorIcons.d.ts +45 -0
  480. package/dist/icons/WeightedPhosphorIcons.js +96 -0
  481. package/dist/icons/WeightedPhosphorIcons.js.map +1 -0
  482. package/dist/icons/index.d.ts +2 -0
  483. package/dist/icons/index.js +4 -0
  484. package/dist/index.d.ts +1 -0
  485. package/dist/index.js +36 -0
  486. package/dist/styles.css +10 -0
  487. package/dist/utilities.css +2 -0
  488. package/dist/utils/VirtuosoCustomScrollParentContext/index.d.ts +7 -0
  489. package/dist/utils/VirtuosoCustomScrollParentContext/index.js +15 -0
  490. package/dist/utils/VirtuosoCustomScrollParentContext/index.js.map +1 -0
  491. package/dist/utils/VirtuosoCustomScrollParentContext/useScrollParent.d.ts +4 -0
  492. package/dist/utils/VirtuosoCustomScrollParentContext/useScrollParent.js +10 -0
  493. package/dist/utils/VirtuosoCustomScrollParentContext/useScrollParent.js.map +1 -0
  494. package/dist/utils/ZIndexContext.d.ts +5 -0
  495. package/dist/utils/ZIndexContext.js +13 -0
  496. package/dist/utils/ZIndexContext.js.map +1 -0
  497. package/dist/utils/animation.d.ts +37 -0
  498. package/dist/utils/animation.js +42 -0
  499. package/dist/utils/animation.js.map +1 -0
  500. package/dist/utils/chartAxisLayout.d.ts +6 -0
  501. package/dist/utils/chartAxisLayout.js +8 -0
  502. package/dist/utils/chartAxisLayout.js.map +1 -0
  503. package/dist/utils/chartColors.d.ts +38 -0
  504. package/dist/utils/chartColors.js +78 -0
  505. package/dist/utils/chartColors.js.map +1 -0
  506. package/dist/utils/chartConstants.d.ts +10 -0
  507. package/dist/utils/chartConstants.js +15 -0
  508. package/dist/utils/chartConstants.js.map +1 -0
  509. package/dist/utils/chartValues.d.ts +2 -0
  510. package/dist/utils/chartValues.js +36 -0
  511. package/dist/utils/chartValues.js.map +1 -0
  512. package/dist/utils/clamp.d.ts +2 -0
  513. package/dist/utils/clamp.js +7 -0
  514. package/dist/utils/clamp.js.map +1 -0
  515. package/dist/utils/cn.d.ts +2 -0
  516. package/dist/utils/cn.js +191 -0
  517. package/dist/utils/cn.js.map +1 -0
  518. package/dist/utils/componentSizes.d.ts +104 -0
  519. package/dist/utils/componentSizes.js +104 -0
  520. package/dist/utils/componentSizes.js.map +1 -0
  521. package/dist/utils/controlIconSizes.d.ts +10 -0
  522. package/dist/utils/controlIconSizes.js +32 -0
  523. package/dist/utils/controlIconSizes.js.map +1 -0
  524. package/dist/utils/csp-nonce.d.ts +11 -0
  525. package/dist/utils/csp-nonce.js +17 -0
  526. package/dist/utils/csp-nonce.js.map +1 -0
  527. package/dist/utils/get-closest-scroll-parent.d.ts +1 -0
  528. package/dist/utils/get-closest-scroll-parent.js +16 -0
  529. package/dist/utils/get-closest-scroll-parent.js.map +1 -0
  530. package/dist/utils/get-color-by-string.d.ts +1 -0
  531. package/dist/utils/get-color-by-string.js +10 -0
  532. package/dist/utils/get-color-by-string.js.map +1 -0
  533. package/dist/utils/getYAxisLeftMargin.d.ts +10 -0
  534. package/dist/utils/getYAxisLeftMargin.js +20 -0
  535. package/dist/utils/getYAxisLeftMargin.js.map +1 -0
  536. package/dist/utils/icon-types.d.ts +8 -0
  537. package/dist/utils/icon-types.js +0 -0
  538. package/dist/utils/lazy-codemirror-loader.d.ts +70 -0
  539. package/dist/utils/lazy-codemirror-loader.js +79 -0
  540. package/dist/utils/lazy-codemirror-loader.js.map +1 -0
  541. package/dist/utils/merge-refs.d.ts +2 -0
  542. package/dist/utils/merge-refs.js +13 -0
  543. package/dist/utils/merge-refs.js.map +1 -0
  544. package/dist/utils/parseTextLinks.d.ts +7 -0
  545. package/dist/utils/parseTextLinks.js +46 -0
  546. package/dist/utils/parseTextLinks.js.map +1 -0
  547. package/dist/utils/prettify-error-payload.d.ts +7 -0
  548. package/dist/utils/prettify-error-payload.js +188 -0
  549. package/dist/utils/prettify-error-payload.js.map +1 -0
  550. package/dist/utils/spacing.d.ts +30 -0
  551. package/dist/utils/spacing.js +34 -0
  552. package/dist/utils/spacing.js.map +1 -0
  553. package/dist/utils/useCodeMirror.d.ts +7 -0
  554. package/dist/utils/useCodeMirror.js +28 -0
  555. package/dist/utils/useCodeMirror.js.map +1 -0
  556. package/dist/utils/useZIndex.d.ts +52 -0
  557. package/dist/utils/useZIndex.js +62 -0
  558. package/dist/utils/useZIndex.js.map +1 -0
  559. package/dist/utils/zIndices.d.ts +42 -0
  560. package/dist/utils/zIndices.js +46 -0
  561. package/dist/utils/zIndices.js.map +1 -0
  562. package/docs/DESIGN.md +134 -0
  563. package/docs/STYLES.md +568 -0
  564. package/package.json +619 -0
  565. package/tailwind.preset.cjs +738 -0
  566. package/tailwind.preset.d.cts +5 -0
@@ -0,0 +1,195 @@
1
+ import { cn } from "../../utils/cn.js";
2
+ import { Tooltip } from "../Tooltip/Tooltip.js";
3
+ import { Badge } from "../Badge/Badge.js";
4
+ import { SPACE_SCALE_PX } from "../../utils/spacing.js";
5
+ import { Button } from "../Button/Button.js";
6
+ import { Popover, PopoverAnchor, PopoverContent, PopoverTrigger } from "../Popover/Popover.js";
7
+ import { getChartLegendListColumns, getChartLegendListGridTemplate, widthsMatch } from "./utils.js";
8
+ import { ChartLegendItemRenderer } from "./ChartLegendItemRenderer.js";
9
+ import { useChartLegendActiveItem } from "./useChartLegendActiveItem.js";
10
+ import { useCallback, useEffect, useLayoutEffect, useMemo, useRef, useState } from "react";
11
+ import { jsx, jsxs } from "react/jsx-runtime";
12
+ //#region packages/components/src/components/ChartLegend/ChartLegend.tsx
13
+ var LEGEND_GAP_PX = SPACE_SCALE_PX[1];
14
+ var VIEW_HIDDEN_TOOLTIP = "Click to view hidden legends";
15
+ var ChartLegendList = ({ items, onItemClick, onItemActiveChange, className, role = "group", "aria-label": ariaLabel = "Chart legend", style, ...props }) => {
16
+ const listColumns = getChartLegendListColumns(items, onItemClick != null);
17
+ const gridTemplateColumns = getChartLegendListGridTemplate(listColumns);
18
+ return /* @__PURE__ */ jsx("div", {
19
+ role,
20
+ "aria-label": ariaLabel,
21
+ className: cn("grid w-full min-w-0", className),
22
+ style: {
23
+ ...style,
24
+ gridTemplateColumns
25
+ },
26
+ ...props,
27
+ children: items.map((item) => /* @__PURE__ */ jsx(ChartLegendItemRenderer, {
28
+ item,
29
+ layout: "list",
30
+ listColumns,
31
+ onActiveChange: onItemActiveChange,
32
+ onClick: onItemClick == null ? void 0 : () => {
33
+ onItemClick(item);
34
+ }
35
+ }, item.id))
36
+ });
37
+ };
38
+ var ChartLegendInline = ({ items, onItemClick, onItemActiveChange, className, role = "group", "aria-label": ariaLabel = "Chart legend", ...props }) => {
39
+ const [popoverOpen, setPopoverOpen] = useState(false);
40
+ const [containerWidth, setContainerWidth] = useState(null);
41
+ const [itemWidths, setItemWidths] = useState({});
42
+ const [badgeWidths, setBadgeWidths] = useState({});
43
+ const containerRef = useRef(null);
44
+ const measurementItemRefs = useRef({});
45
+ const measurementBadgeRefs = useRef({});
46
+ const isInteractive = onItemClick != null || onItemActiveChange != null;
47
+ const itemIds = useMemo(() => items.map((item) => item.id), [items]);
48
+ const setMeasurementItemRef = useCallback((id, node) => {
49
+ measurementItemRefs.current[id] = node;
50
+ }, []);
51
+ const setMeasurementBadgeRef = useCallback((count, node) => {
52
+ measurementBadgeRefs.current[String(count)] = node;
53
+ }, []);
54
+ useLayoutEffect(() => {
55
+ const nextItemWidths = {};
56
+ const nextBadgeWidths = {};
57
+ items.forEach((item, index) => {
58
+ const itemWidth = measurementItemRefs.current[item.id]?.offsetWidth;
59
+ if (itemWidth != null) nextItemWidths[item.id] = Math.ceil(itemWidth);
60
+ const hiddenCount = index + 1;
61
+ const badgeWidth = measurementBadgeRefs.current[String(hiddenCount)]?.offsetWidth;
62
+ if (badgeWidth != null) nextBadgeWidths[String(hiddenCount)] = Math.ceil(badgeWidth);
63
+ });
64
+ setItemWidths((current) => widthsMatch(current, nextItemWidths) ? current : nextItemWidths);
65
+ setBadgeWidths((current) => widthsMatch(current, nextBadgeWidths) ? current : nextBadgeWidths);
66
+ }, [isInteractive, items]);
67
+ useLayoutEffect(() => {
68
+ const container = containerRef.current;
69
+ if (container == null) return;
70
+ const updateWidth = (width) => {
71
+ const nextWidth = Math.ceil(width);
72
+ setContainerWidth((current) => current === nextWidth ? current : nextWidth);
73
+ };
74
+ updateWidth(container.clientWidth);
75
+ const observer = new ResizeObserver(([entry]) => {
76
+ updateWidth(entry?.contentRect.width ?? container.clientWidth);
77
+ });
78
+ observer.observe(container);
79
+ return () => observer.disconnect();
80
+ }, []);
81
+ const visibleCount = useMemo(() => {
82
+ if (!(containerWidth != null && itemIds.every((id) => itemWidths[id] != null) && items.every((_, index) => badgeWidths[String(index + 1)] != null)) || containerWidth == null) return items.length;
83
+ if (itemIds.reduce((total, id) => total + (itemWidths[id] ?? 0), Math.max(items.length - 1, 0) * LEGEND_GAP_PX) <= containerWidth) return items.length;
84
+ for (let count = items.length - 1; count >= 0; count -= 1) {
85
+ const hiddenCount = items.length - count;
86
+ if (itemIds.slice(0, count).reduce((total, id) => total + (itemWidths[id] ?? 0), 0) + count * LEGEND_GAP_PX + (badgeWidths[String(hiddenCount)] ?? 0) <= containerWidth) return count;
87
+ }
88
+ return 0;
89
+ }, [
90
+ badgeWidths,
91
+ containerWidth,
92
+ itemIds,
93
+ itemWidths,
94
+ items
95
+ ]);
96
+ const hiddenCount = Math.max(items.length - visibleCount, 0);
97
+ const hasOverflow = hiddenCount > 0;
98
+ const visibleItems = items.slice(0, visibleCount);
99
+ const hiddenItems = items.slice(visibleCount);
100
+ useEffect(() => {
101
+ if (!hasOverflow) setPopoverOpen(false);
102
+ }, [hasOverflow]);
103
+ const renderItem = (item) => /* @__PURE__ */ jsx(ChartLegendItemRenderer, {
104
+ item,
105
+ onActiveChange: onItemActiveChange,
106
+ onClick: onItemClick == null ? void 0 : () => {
107
+ onItemClick(item);
108
+ }
109
+ }, item.id);
110
+ return /* @__PURE__ */ jsxs(Popover, {
111
+ open: popoverOpen,
112
+ onOpenChange: setPopoverOpen,
113
+ children: [/* @__PURE__ */ jsx(PopoverAnchor, {
114
+ asChild: true,
115
+ children: /* @__PURE__ */ jsxs("div", {
116
+ ref: containerRef,
117
+ role,
118
+ "aria-label": ariaLabel,
119
+ className: cn("relative flex w-full min-w-0 items-center gap-space-1 overflow-clip rounded-xs", className),
120
+ ...props,
121
+ children: [
122
+ visibleItems.map(renderItem),
123
+ hasOverflow && /* @__PURE__ */ jsx(Tooltip, {
124
+ title: VIEW_HIDDEN_TOOLTIP,
125
+ children: /* @__PURE__ */ jsx(PopoverTrigger, {
126
+ asChild: true,
127
+ children: /* @__PURE__ */ jsx(Button, {
128
+ type: "button",
129
+ size: "xs",
130
+ color: "secondary",
131
+ variant: "plain",
132
+ className: "focus-visible:ring-focus relative rounded-xs border-transparent bg-transparent p-0 shadow-none focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-offset-1",
133
+ "aria-label": `View ${hiddenCount} hidden chart ${hiddenCount === 1 ? "legend" : "legends"}`,
134
+ children: /* @__PURE__ */ jsx(Badge, {
135
+ size: "xxs",
136
+ rounded: "xs",
137
+ children: `+${hiddenCount}`
138
+ })
139
+ })
140
+ })
141
+ }),
142
+ /* @__PURE__ */ jsxs("div", {
143
+ "aria-hidden": "true",
144
+ className: "pointer-events-none invisible absolute left-0 top-0 flex w-max items-center gap-space-1",
145
+ children: [items.map((item) => /* @__PURE__ */ jsx("div", {
146
+ ref: (node) => setMeasurementItemRef(item.id, node),
147
+ className: "shrink-0",
148
+ children: /* @__PURE__ */ jsx(ChartLegendItemRenderer, {
149
+ item,
150
+ onClick: onItemClick == null ? void 0 : () => void 0,
151
+ tabIndex: -1
152
+ })
153
+ }, item.id)), items.map((_, index) => {
154
+ const count = index + 1;
155
+ return /* @__PURE__ */ jsx("div", {
156
+ ref: (node) => setMeasurementBadgeRef(count, node),
157
+ className: "shrink-0",
158
+ children: /* @__PURE__ */ jsx(Badge, {
159
+ size: "xxs",
160
+ rounded: "xs",
161
+ children: `+${count}`
162
+ })
163
+ }, count);
164
+ })]
165
+ })
166
+ ]
167
+ })
168
+ }), hasOverflow && /* @__PURE__ */ jsx(PopoverContent, {
169
+ align: "end",
170
+ className: "w-max min-w-48 max-w-[min(24rem,calc(100vw-2rem))] overflow-hidden border border-subtle p-0",
171
+ "aria-label": "Hidden chart legends",
172
+ onInteractOutside: (event) => {
173
+ if (event.target instanceof Node && containerRef.current?.contains(event.target)) event.preventDefault();
174
+ },
175
+ children: /* @__PURE__ */ jsx("div", {
176
+ className: "scroll-mask-t scroll-mask-b flex max-h-[min(300px,70vh)] flex-col gap-space-1 overflow-y-auto overflow-x-hidden p-space-1",
177
+ children: hiddenItems.map(renderItem)
178
+ })
179
+ })]
180
+ });
181
+ };
182
+ var ChartLegend = ({ layout = "inline", items, onItemActiveChange, ...props }) => {
183
+ const handleItemActiveChange = useChartLegendActiveItem(items, onItemActiveChange);
184
+ const activeChangeHandler = onItemActiveChange == null ? void 0 : handleItemActiveChange;
185
+ const legendProps = {
186
+ ...props,
187
+ items,
188
+ onItemActiveChange: activeChangeHandler
189
+ };
190
+ return layout === "list" ? /* @__PURE__ */ jsx(ChartLegendList, { ...legendProps }) : /* @__PURE__ */ jsx(ChartLegendInline, { ...legendProps });
191
+ };
192
+ //#endregion
193
+ export { ChartLegend };
194
+
195
+ //# sourceMappingURL=ChartLegend.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ChartLegend.js","names":[],"sources":["../../../src/components/ChartLegend/ChartLegend.tsx"],"sourcesContent":["import {\n type HTMLAttributes,\n type ReactNode,\n useCallback,\n useEffect,\n useLayoutEffect,\n useMemo,\n useRef,\n useState,\n} from 'react';\n\nimport { cn } from '../../utils/cn';\nimport { SPACE_SCALE_PX } from '../../utils/spacing';\nimport { Badge } from '../Badge';\nimport { Button } from '../Button';\nimport {\n Popover,\n PopoverAnchor,\n PopoverContent,\n PopoverTrigger,\n} from '../Popover';\nimport { Tooltip } from '../Tooltip';\nimport { ChartLegendItemRenderer } from './ChartLegendItemRenderer';\nimport {\n type ChartLegendItemActiveChangeHandler,\n useChartLegendActiveItem,\n} from './useChartLegendActiveItem';\nimport {\n getChartLegendListColumns,\n getChartLegendListGridTemplate,\n widthsMatch,\n} from './utils';\n\nconst LEGEND_GAP_PX = SPACE_SCALE_PX[1];\nconst VIEW_HIDDEN_TOOLTIP = 'Click to view hidden legends';\n\nexport type ChartLegendItem = {\n id: string;\n label: ReactNode;\n value?: ReactNode;\n secondaryValue?: ReactNode;\n 'aria-label'?: string;\n markerColor?: string;\n marker?: ReactNode;\n selected?: boolean;\n};\n\nexport type ChartLegendProps = Omit<\n HTMLAttributes<HTMLDivElement>,\n 'children'\n> & {\n items: readonly ChartLegendItem[];\n layout?: 'inline' | 'list';\n onItemClick?: (item: ChartLegendItem) => void;\n /** Reports the legend item under the pointer or keyboard focus. */\n onItemActiveChange?: (item: ChartLegendItem | null) => void;\n};\n\ntype ChartLegendBaseProps = Omit<\n ChartLegendProps,\n 'layout' | 'onItemActiveChange'\n> & {\n onItemActiveChange?: ChartLegendItemActiveChangeHandler<ChartLegendItem>;\n};\n\nconst ChartLegendList = ({\n items,\n onItemClick,\n onItemActiveChange,\n className,\n role = 'group',\n 'aria-label': ariaLabel = 'Chart legend',\n style,\n ...props\n}: ChartLegendBaseProps) => {\n const listColumns = getChartLegendListColumns(items, onItemClick != null);\n const gridTemplateColumns = getChartLegendListGridTemplate(listColumns);\n\n return (\n <div\n role={role}\n aria-label={ariaLabel}\n className={cn('grid w-full min-w-0', className)}\n style={{ ...style, gridTemplateColumns }}\n {...props}\n >\n {items.map((item) => (\n <ChartLegendItemRenderer\n key={item.id}\n item={item}\n layout=\"list\"\n listColumns={listColumns}\n onActiveChange={onItemActiveChange}\n onClick={\n onItemClick == null\n ? undefined\n : () => {\n onItemClick(item);\n }\n }\n />\n ))}\n </div>\n );\n};\n\nconst ChartLegendInline = ({\n items,\n onItemClick,\n onItemActiveChange,\n className,\n role = 'group',\n 'aria-label': ariaLabel = 'Chart legend',\n ...props\n}: ChartLegendBaseProps) => {\n const [popoverOpen, setPopoverOpen] = useState(false);\n const [containerWidth, setContainerWidth] = useState<number | null>(null);\n const [itemWidths, setItemWidths] = useState<Record<string, number>>({});\n const [badgeWidths, setBadgeWidths] = useState<Record<string, number>>({});\n const containerRef = useRef<HTMLDivElement>(null);\n const measurementItemRefs = useRef<Record<string, HTMLDivElement | null>>({});\n const measurementBadgeRefs = useRef<Record<string, HTMLDivElement | null>>(\n {}\n );\n const isInteractive = onItemClick != null || onItemActiveChange != null;\n\n const itemIds = useMemo(() => items.map((item) => item.id), [items]);\n\n const setMeasurementItemRef = useCallback(\n (id: string, node: HTMLDivElement | null) => {\n measurementItemRefs.current[id] = node;\n },\n []\n );\n\n const setMeasurementBadgeRef = useCallback(\n (count: number, node: HTMLDivElement | null) => {\n measurementBadgeRefs.current[String(count)] = node;\n },\n []\n );\n\n useLayoutEffect(() => {\n const nextItemWidths: Record<string, number> = {};\n const nextBadgeWidths: Record<string, number> = {};\n\n items.forEach((item, index) => {\n const itemWidth = measurementItemRefs.current[item.id]?.offsetWidth;\n if (itemWidth != null) {\n nextItemWidths[item.id] = Math.ceil(itemWidth);\n }\n\n const hiddenCount = index + 1;\n const badgeWidth =\n measurementBadgeRefs.current[String(hiddenCount)]?.offsetWidth;\n if (badgeWidth != null) {\n nextBadgeWidths[String(hiddenCount)] = Math.ceil(badgeWidth);\n }\n });\n\n setItemWidths((current) =>\n widthsMatch(current, nextItemWidths) ? current : nextItemWidths\n );\n setBadgeWidths((current) =>\n widthsMatch(current, nextBadgeWidths) ? current : nextBadgeWidths\n );\n }, [isInteractive, items]);\n\n useLayoutEffect(() => {\n const container = containerRef.current;\n\n if (container == null) {\n return;\n }\n\n const updateWidth = (width: number) => {\n const nextWidth = Math.ceil(width);\n setContainerWidth((current) =>\n current === nextWidth ? current : nextWidth\n );\n };\n\n updateWidth(container.clientWidth);\n\n const observer = new ResizeObserver(([entry]) => {\n updateWidth(entry?.contentRect.width ?? container.clientWidth);\n });\n\n observer.observe(container);\n return () => observer.disconnect();\n }, []);\n\n const visibleCount = useMemo(() => {\n const hasMeasurements =\n containerWidth != null &&\n itemIds.every((id) => itemWidths[id] != null) &&\n items.every((_, index) => badgeWidths[String(index + 1)] != null);\n\n if (!hasMeasurements || containerWidth == null) {\n return items.length;\n }\n\n const allItemsWidth = itemIds.reduce(\n (total, id) => total + (itemWidths[id] ?? 0),\n Math.max(items.length - 1, 0) * LEGEND_GAP_PX\n );\n\n if (allItemsWidth <= containerWidth) {\n return items.length;\n }\n\n for (let count = items.length - 1; count >= 0; count -= 1) {\n const hiddenCount = items.length - count;\n const visibleItemsWidth = itemIds\n .slice(0, count)\n .reduce((total, id) => total + (itemWidths[id] ?? 0), 0);\n const gapsWidth = count * LEGEND_GAP_PX;\n const totalWidth =\n visibleItemsWidth + gapsWidth + (badgeWidths[String(hiddenCount)] ?? 0);\n\n if (totalWidth <= containerWidth) {\n return count;\n }\n }\n\n return 0;\n }, [badgeWidths, containerWidth, itemIds, itemWidths, items]);\n\n const hiddenCount = Math.max(items.length - visibleCount, 0);\n const hasOverflow = hiddenCount > 0;\n const visibleItems = items.slice(0, visibleCount);\n const hiddenItems = items.slice(visibleCount);\n\n useEffect(() => {\n if (!hasOverflow) {\n setPopoverOpen(false);\n }\n }, [hasOverflow]);\n\n const renderItem = (item: ChartLegendItem) => (\n <ChartLegendItemRenderer\n key={item.id}\n item={item}\n onActiveChange={onItemActiveChange}\n onClick={\n onItemClick == null\n ? undefined\n : () => {\n onItemClick(item);\n }\n }\n />\n );\n\n return (\n <Popover open={popoverOpen} onOpenChange={setPopoverOpen}>\n <PopoverAnchor asChild>\n <div\n ref={containerRef}\n role={role}\n aria-label={ariaLabel}\n className={cn(\n 'relative flex w-full min-w-0 items-center gap-space-1 overflow-clip rounded-xs',\n className\n )}\n {...props}\n >\n {visibleItems.map(renderItem)}\n\n {hasOverflow && (\n <Tooltip title={VIEW_HIDDEN_TOOLTIP}>\n <PopoverTrigger asChild>\n <Button\n type=\"button\"\n size=\"xs\"\n color=\"secondary\"\n variant=\"plain\"\n className=\"focus-visible:ring-focus relative rounded-xs border-transparent bg-transparent p-0 shadow-none focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-offset-1\"\n aria-label={`View ${hiddenCount} hidden chart ${\n hiddenCount === 1 ? 'legend' : 'legends'\n }`}\n >\n <Badge size=\"xxs\" rounded=\"xs\">\n {`+${hiddenCount}`}\n </Badge>\n </Button>\n </PopoverTrigger>\n </Tooltip>\n )}\n\n <div\n aria-hidden=\"true\"\n className=\"pointer-events-none invisible absolute left-0 top-0 flex w-max items-center gap-space-1\"\n >\n {items.map((item) => (\n <div\n key={item.id}\n ref={(node) => setMeasurementItemRef(item.id, node)}\n className=\"shrink-0\"\n >\n <ChartLegendItemRenderer\n item={item}\n onClick={onItemClick == null ? undefined : () => undefined}\n tabIndex={-1}\n />\n </div>\n ))}\n {items.map((_, index) => {\n const count = index + 1;\n return (\n <div\n key={count}\n ref={(node) => setMeasurementBadgeRef(count, node)}\n className=\"shrink-0\"\n >\n <Badge size=\"xxs\" rounded=\"xs\">\n {`+${count}`}\n </Badge>\n </div>\n );\n })}\n </div>\n </div>\n </PopoverAnchor>\n\n {hasOverflow && (\n <PopoverContent\n align=\"end\"\n className=\"w-max min-w-48 max-w-[min(24rem,calc(100vw-2rem))] overflow-hidden border border-subtle p-0\"\n aria-label=\"Hidden chart legends\"\n onInteractOutside={(event) => {\n if (\n event.target instanceof Node &&\n containerRef.current?.contains(event.target)\n ) {\n event.preventDefault();\n }\n }}\n >\n <div className=\"scroll-mask-t scroll-mask-b flex max-h-[min(300px,70vh)] flex-col gap-space-1 overflow-y-auto overflow-x-hidden p-space-1\">\n {hiddenItems.map(renderItem)}\n </div>\n </PopoverContent>\n )}\n </Popover>\n );\n};\n\nexport const ChartLegend = ({\n layout = 'inline',\n items,\n onItemActiveChange,\n ...props\n}: ChartLegendProps) => {\n const handleItemActiveChange = useChartLegendActiveItem(\n items,\n onItemActiveChange\n );\n const activeChangeHandler =\n onItemActiveChange == null ? undefined : handleItemActiveChange;\n const legendProps = {\n ...props,\n items,\n onItemActiveChange: activeChangeHandler,\n };\n\n return layout === 'list' ? (\n <ChartLegendList {...legendProps} />\n ) : (\n <ChartLegendInline {...legendProps} />\n );\n};\n"],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ import type { ChartLegendItem } from './ChartLegend.js';
2
+ import type { ChartLegendItemActiveChangeHandler } from './useChartLegendActiveItem.js';
3
+ import { type ChartLegendListColumns } from './utils.js';
4
+ type ChartLegendItemRendererProps = {
5
+ item: ChartLegendItem;
6
+ onClick?: () => void;
7
+ onActiveChange?: ChartLegendItemActiveChangeHandler<ChartLegendItem>;
8
+ className?: string;
9
+ tabIndex?: number;
10
+ layout?: 'inline' | 'list';
11
+ listColumns?: ChartLegendListColumns;
12
+ };
13
+ export declare const ChartLegendItemRenderer: ({ item, onClick, onActiveChange, className, tabIndex, layout, listColumns, }: ChartLegendItemRendererProps) => import("react").JSX.Element;
14
+ export {};
@@ -0,0 +1,90 @@
1
+ import { cn } from "../../utils/cn.js";
2
+ import { Text } from "../Text/Text.js";
3
+ import { Icon } from "../Icon/Icon.js";
4
+ import { Button } from "../Button/Button.js";
5
+ import { getChartLegendAriaLabel } from "./utils.js";
6
+ import { useEffect, useEffectEvent, useId } from "react";
7
+ import { Fragment as Fragment$1, jsx, jsxs } from "react/jsx-runtime";
8
+ import { FunnelIcon } from "@phosphor-icons/react/dist/ssr/Funnel";
9
+ //#region packages/components/src/components/ChartLegend/ChartLegendItemRenderer.tsx
10
+ var ChartLegendItemRenderer = ({ item, onClick, onActiveChange, className, tabIndex, layout = "inline", listColumns }) => {
11
+ const labelId = useId();
12
+ const clearActivity = useEffectEvent(() => {
13
+ onActiveChange?.(item, "pointer", false);
14
+ onActiveChange?.(item, "focus", false);
15
+ });
16
+ useEffect(() => () => clearActivity(), []);
17
+ const isList = layout === "list";
18
+ const defaultAriaLabel = getChartLegendAriaLabel(item.label, isList ? item.value : void 0, isList ? item.secondaryValue : void 0);
19
+ const ariaLabel = item["aria-label"] ?? defaultAriaLabel;
20
+ const marker = item.marker ?? (item.markerColor != null ? /* @__PURE__ */ jsx("div", {
21
+ "aria-hidden": true,
22
+ className: "size-2 shrink-0 rounded-full",
23
+ style: { backgroundColor: item.markerColor }
24
+ }) : null);
25
+ const action = onClick != null || item.selected ? /* @__PURE__ */ jsx(Icon, {
26
+ "aria-hidden": "true",
27
+ icon: FunnelIcon,
28
+ weight: item.selected ? "fill" : void 0,
29
+ size: "xs",
30
+ className: cn("size-3 shrink-0 text-icon-tertiary transition-opacity duration-fast", item.selected ? "opacity-100" : "opacity-0 group-hover:opacity-100 group-focus-visible:opacity-100")
31
+ }) : null;
32
+ const content = /* @__PURE__ */ jsxs(Fragment$1, { children: [
33
+ isList && listColumns?.marker ? marker ?? /* @__PURE__ */ jsx("div", { "aria-hidden": true }) : marker,
34
+ /* @__PURE__ */ jsx(Text, {
35
+ id: labelId,
36
+ as: "span",
37
+ variant: "xs",
38
+ className: cn("min-w-0 flex-1 text-left", isList ? "whitespace-normal break-words" : "truncate"),
39
+ children: item.label
40
+ }),
41
+ isList && listColumns?.value && (item.value != null ? /* @__PURE__ */ jsx(Text, {
42
+ as: "span",
43
+ variant: "xs",
44
+ className: "shrink-0 text-right tabular-nums",
45
+ children: item.value
46
+ }) : /* @__PURE__ */ jsx("div", { "aria-hidden": true })),
47
+ isList && listColumns?.secondaryValue && (item.secondaryValue != null ? /* @__PURE__ */ jsx(Text, {
48
+ as: "span",
49
+ variant: "xs",
50
+ color: "tertiary",
51
+ className: "shrink-0 text-right tabular-nums",
52
+ children: item.secondaryValue
53
+ }) : /* @__PURE__ */ jsx("div", { "aria-hidden": true })),
54
+ isList && listColumns?.action ? action ?? /* @__PURE__ */ jsx("div", { "aria-hidden": true }) : action
55
+ ] });
56
+ const styles = cn("group relative min-w-0 items-center rounded-xs py-space-1 text-primary transition-colors duration-fast", isList ? "col-span-full grid w-full grid-cols-subgrid gap-space-2 px-space-2" : "flex max-w-full shrink-0 gap-space-1 px-space-1", item.selected ? "bg-surface-level-3 hover:bg-surface-level-3" : (onClick != null || onActiveChange != null) && "hover:bg-surface-level-1-hover focus-visible:bg-surface-level-1-hover", className);
57
+ if (onClick == null) return /* @__PURE__ */ jsx("div", {
58
+ className: cn(styles, onActiveChange != null && "focus-visible:ring-focus focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-inset"),
59
+ role: onActiveChange == null ? void 0 : "group",
60
+ "aria-label": onActiveChange == null ? void 0 : ariaLabel,
61
+ "aria-labelledby": onActiveChange != null && ariaLabel == null ? labelId : void 0,
62
+ tabIndex: onActiveChange == null ? tabIndex : tabIndex ?? 0,
63
+ onPointerEnter: () => onActiveChange?.(item, "pointer", true),
64
+ onPointerLeave: () => onActiveChange?.(item, "pointer", false),
65
+ onFocus: () => onActiveChange?.(item, "focus", true),
66
+ onBlur: () => onActiveChange?.(item, "focus", false),
67
+ children: content
68
+ });
69
+ return /* @__PURE__ */ jsx(Button, {
70
+ type: "button",
71
+ size: "xs",
72
+ color: "secondary",
73
+ variant: "plain",
74
+ className: cn(styles, "focus-visible:ring-focus border-transparent shadow-none focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-inset", isList && "justify-start", !item.selected && "bg-transparent"),
75
+ "aria-label": ariaLabel,
76
+ "aria-labelledby": ariaLabel == null ? labelId : void 0,
77
+ "aria-pressed": item.selected ?? false,
78
+ tabIndex,
79
+ onPointerEnter: () => onActiveChange?.(item, "pointer", true),
80
+ onPointerLeave: () => onActiveChange?.(item, "pointer", false),
81
+ onFocus: () => onActiveChange?.(item, "focus", true),
82
+ onBlur: () => onActiveChange?.(item, "focus", false),
83
+ onClick,
84
+ children: content
85
+ });
86
+ };
87
+ //#endregion
88
+ export { ChartLegendItemRenderer };
89
+
90
+ //# sourceMappingURL=ChartLegendItemRenderer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ChartLegendItemRenderer.js","names":[],"sources":["../../../src/components/ChartLegend/ChartLegendItemRenderer.tsx"],"sourcesContent":["import { useEffect, useEffectEvent, useId } from 'react';\n\nimport { FunnelIcon } from '@phosphor-icons/react/dist/ssr/Funnel';\n\nimport { cn } from '../../utils/cn';\nimport { Button } from '../Button';\nimport { Icon } from '../Icon';\nimport { Text } from '../Text';\nimport type { ChartLegendItem } from './ChartLegend';\nimport type { ChartLegendItemActiveChangeHandler } from './useChartLegendActiveItem';\nimport { getChartLegendAriaLabel, type ChartLegendListColumns } from './utils';\n\ntype ChartLegendItemRendererProps = {\n item: ChartLegendItem;\n onClick?: () => void;\n onActiveChange?: ChartLegendItemActiveChangeHandler<ChartLegendItem>;\n className?: string;\n tabIndex?: number;\n layout?: 'inline' | 'list';\n listColumns?: ChartLegendListColumns;\n};\n\nexport const ChartLegendItemRenderer = ({\n item,\n onClick,\n onActiveChange,\n className,\n tabIndex,\n layout = 'inline',\n listColumns,\n}: ChartLegendItemRendererProps) => {\n const labelId = useId();\n const clearActivity = useEffectEvent(() => {\n onActiveChange?.(item, 'pointer', false);\n onActiveChange?.(item, 'focus', false);\n });\n // Removing a focused or hovered row does not fire blur or pointerleave.\n useEffect(() => () => clearActivity(), []);\n\n const isList = layout === 'list';\n const defaultAriaLabel = getChartLegendAriaLabel(\n item.label,\n isList ? item.value : undefined,\n isList ? item.secondaryValue : undefined\n );\n const ariaLabel = item['aria-label'] ?? defaultAriaLabel;\n const marker =\n item.marker ??\n (item.markerColor != null ? (\n <div\n aria-hidden\n className=\"size-2 shrink-0 rounded-full\"\n style={{ backgroundColor: item.markerColor }}\n />\n ) : null);\n const action =\n onClick != null || item.selected ? (\n <Icon\n aria-hidden=\"true\"\n icon={FunnelIcon}\n weight={item.selected ? 'fill' : undefined}\n size=\"xs\"\n className={cn(\n 'size-3 shrink-0 text-icon-tertiary transition-opacity duration-fast',\n item.selected\n ? 'opacity-100'\n : 'opacity-0 group-hover:opacity-100 group-focus-visible:opacity-100'\n )}\n />\n ) : null;\n const content = (\n <>\n {isList && listColumns?.marker ? (marker ?? <div aria-hidden />) : marker}\n <Text\n id={labelId}\n as=\"span\"\n variant=\"xs\"\n className={cn(\n 'min-w-0 flex-1 text-left',\n isList ? 'whitespace-normal break-words' : 'truncate'\n )}\n >\n {item.label}\n </Text>\n {isList &&\n listColumns?.value &&\n (item.value != null ? (\n <Text\n as=\"span\"\n variant=\"xs\"\n className=\"shrink-0 text-right tabular-nums\"\n >\n {item.value}\n </Text>\n ) : (\n <div aria-hidden />\n ))}\n {isList &&\n listColumns?.secondaryValue &&\n (item.secondaryValue != null ? (\n <Text\n as=\"span\"\n variant=\"xs\"\n color=\"tertiary\"\n className=\"shrink-0 text-right tabular-nums\"\n >\n {item.secondaryValue}\n </Text>\n ) : (\n <div aria-hidden />\n ))}\n {isList && listColumns?.action ? (action ?? <div aria-hidden />) : action}\n </>\n );\n\n const styles = cn(\n 'group relative min-w-0 items-center rounded-xs py-space-1 text-primary transition-colors duration-fast',\n isList\n ? 'col-span-full grid w-full grid-cols-subgrid gap-space-2 px-space-2'\n : 'flex max-w-full shrink-0 gap-space-1 px-space-1',\n item.selected\n ? 'bg-surface-level-3 hover:bg-surface-level-3'\n : (onClick != null || onActiveChange != null) &&\n 'hover:bg-surface-level-1-hover focus-visible:bg-surface-level-1-hover',\n className\n );\n\n if (onClick == null) {\n return (\n <div\n className={cn(\n styles,\n onActiveChange != null &&\n 'focus-visible:ring-focus focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-inset'\n )}\n role={onActiveChange == null ? undefined : 'group'}\n aria-label={onActiveChange == null ? undefined : ariaLabel}\n aria-labelledby={\n onActiveChange != null && ariaLabel == null ? labelId : undefined\n }\n tabIndex={onActiveChange == null ? tabIndex : (tabIndex ?? 0)}\n onPointerEnter={() => onActiveChange?.(item, 'pointer', true)}\n onPointerLeave={() => onActiveChange?.(item, 'pointer', false)}\n onFocus={() => onActiveChange?.(item, 'focus', true)}\n onBlur={() => onActiveChange?.(item, 'focus', false)}\n >\n {content}\n </div>\n );\n }\n\n return (\n <Button\n type=\"button\"\n size=\"xs\"\n color=\"secondary\"\n variant=\"plain\"\n className={cn(\n styles,\n 'focus-visible:ring-focus border-transparent shadow-none focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-inset',\n isList && 'justify-start',\n !item.selected && 'bg-transparent'\n )}\n aria-label={ariaLabel}\n aria-labelledby={ariaLabel == null ? labelId : undefined}\n aria-pressed={item.selected ?? false}\n tabIndex={tabIndex}\n onPointerEnter={() => onActiveChange?.(item, 'pointer', true)}\n onPointerLeave={() => onActiveChange?.(item, 'pointer', false)}\n onFocus={() => onActiveChange?.(item, 'focus', true)}\n onBlur={() => onActiveChange?.(item, 'focus', false)}\n onClick={onClick}\n >\n {content}\n </Button>\n );\n};\n"],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export { ChartLegend } from './ChartLegend.js';
2
+ export type { ChartLegendItem, ChartLegendProps } from './ChartLegend.js';
3
+ export { getAccessibleText } from './utils.js';
@@ -0,0 +1,3 @@
1
+ import { getAccessibleText } from "./utils.js";
2
+ import { ChartLegend } from "./ChartLegend.js";
3
+ export { ChartLegend, getAccessibleText };
@@ -0,0 +1,7 @@
1
+ export type ChartLegendActiveSource = 'pointer' | 'focus';
2
+ export type ChartLegendItemActiveChangeHandler<T extends {
3
+ id: string;
4
+ }> = (item: T, source: ChartLegendActiveSource, active: boolean) => void;
5
+ export declare const useChartLegendActiveItem: <T extends {
6
+ id: string;
7
+ }>(items: readonly T[], onActiveItemChange?: (item: T | null) => void, disabled?: boolean) => ChartLegendItemActiveChangeHandler<T>;
@@ -0,0 +1,35 @@
1
+ import { useCallback, useEffect, useRef } from "react";
2
+ //#region packages/components/src/components/ChartLegend/useChartLegendActiveItem.ts
3
+ var useChartLegendActiveItem = (items, onActiveItemChange, disabled = false) => {
4
+ const pointerItemRef = useRef(null);
5
+ const focusItemRef = useRef(null);
6
+ const reportedItemIdRef = useRef(null);
7
+ const onActiveItemChangeRef = useRef(onActiveItemChange);
8
+ useEffect(() => {
9
+ onActiveItemChangeRef.current = onActiveItemChange;
10
+ }, [onActiveItemChange]);
11
+ const reportActiveItem = useCallback((item, source, active) => {
12
+ const activeItemRef = source === "pointer" ? pointerItemRef : focusItemRef;
13
+ if (active) activeItemRef.current = item;
14
+ else if (activeItemRef.current?.id === item.id) activeItemRef.current = null;
15
+ const activeItem = disabled ? null : pointerItemRef.current ?? focusItemRef.current;
16
+ const activeItemId = activeItem?.id ?? null;
17
+ if (reportedItemIdRef.current === activeItemId) return;
18
+ reportedItemIdRef.current = activeItemId;
19
+ onActiveItemChange?.(activeItem);
20
+ }, [disabled, onActiveItemChange]);
21
+ const clearActiveItem = useCallback(() => {
22
+ const hadActiveItem = reportedItemIdRef.current != null;
23
+ pointerItemRef.current = null;
24
+ focusItemRef.current = null;
25
+ reportedItemIdRef.current = null;
26
+ if (hadActiveItem) onActiveItemChangeRef.current?.(null);
27
+ }, []);
28
+ const itemIdsKey = disabled ? "" : JSON.stringify(items.map((item) => item.id).sort());
29
+ useEffect(() => () => clearActiveItem(), [itemIdsKey, clearActiveItem]);
30
+ return reportActiveItem;
31
+ };
32
+ //#endregion
33
+ export { useChartLegendActiveItem };
34
+
35
+ //# sourceMappingURL=useChartLegendActiveItem.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useChartLegendActiveItem.js","names":[],"sources":["../../../src/components/ChartLegend/useChartLegendActiveItem.ts"],"sourcesContent":["import { useCallback, useEffect, useRef } from 'react';\n\nexport type ChartLegendActiveSource = 'pointer' | 'focus';\n\nexport type ChartLegendItemActiveChangeHandler<T extends { id: string }> = (\n item: T,\n source: ChartLegendActiveSource,\n active: boolean\n) => void;\n\nexport const useChartLegendActiveItem = <T extends { id: string }>(\n items: readonly T[],\n onActiveItemChange?: (item: T | null) => void,\n disabled = false\n) => {\n const pointerItemRef = useRef<T | null>(null);\n const focusItemRef = useRef<T | null>(null);\n const reportedItemIdRef = useRef<string | null>(null);\n // Keep cleanup subscribed to the latest handler without requiring React 19.2.\n const onActiveItemChangeRef = useRef(onActiveItemChange);\n useEffect(() => {\n onActiveItemChangeRef.current = onActiveItemChange;\n }, [onActiveItemChange]);\n\n const reportActiveItem = useCallback<ChartLegendItemActiveChangeHandler<T>>(\n (item, source, active) => {\n const activeItemRef =\n source === 'pointer' ? pointerItemRef : focusItemRef;\n\n if (active) activeItemRef.current = item;\n else if (activeItemRef.current?.id === item.id)\n activeItemRef.current = null;\n\n const activeItem = disabled\n ? null\n : (pointerItemRef.current ?? focusItemRef.current);\n const activeItemId = activeItem?.id ?? null;\n if (reportedItemIdRef.current === activeItemId) return;\n\n reportedItemIdRef.current = activeItemId;\n onActiveItemChange?.(activeItem);\n },\n [disabled, onActiveItemChange]\n );\n\n const clearActiveItem = useCallback(() => {\n const hadActiveItem = reportedItemIdRef.current != null;\n pointerItemRef.current = null;\n focusItemRef.current = null;\n reportedItemIdRef.current = null;\n if (hadActiveItem) onActiveItemChangeRef.current?.(null);\n }, []);\n const itemIdsKey = disabled\n ? ''\n : JSON.stringify(items.map((item) => item.id).sort());\n\n useEffect(() => () => clearActiveItem(), [itemIdsKey, clearActiveItem]);\n\n return reportActiveItem;\n};\n"],"mappings":";;AAUA,IAAa,4BACX,OACA,oBACA,WAAW,UACR;CACH,MAAM,iBAAiB,OAAiB,IAAI;CAC5C,MAAM,eAAe,OAAiB,IAAI;CAC1C,MAAM,oBAAoB,OAAsB,IAAI;CAEpD,MAAM,wBAAwB,OAAO,kBAAkB;CACvD,gBAAgB;EACd,sBAAsB,UAAU;CAClC,GAAG,CAAC,kBAAkB,CAAC;CAEvB,MAAM,mBAAmB,aACtB,MAAM,QAAQ,WAAW;EACxB,MAAM,gBACJ,WAAW,YAAY,iBAAiB;EAE1C,IAAI,QAAQ,cAAc,UAAU;OAC/B,IAAI,cAAc,SAAS,OAAO,KAAK,IAC1C,cAAc,UAAU;EAE1B,MAAM,aAAa,WACf,OACC,eAAe,WAAW,aAAa;EAC5C,MAAM,eAAe,YAAY,MAAM;EACvC,IAAI,kBAAkB,YAAY,cAAc;EAEhD,kBAAkB,UAAU;EAC5B,qBAAqB,UAAU;CACjC,GACA,CAAC,UAAU,kBAAkB,CAC/B;CAEA,MAAM,kBAAkB,kBAAkB;EACxC,MAAM,gBAAgB,kBAAkB,WAAW;EACnD,eAAe,UAAU;EACzB,aAAa,UAAU;EACvB,kBAAkB,UAAU;EAC5B,IAAI,eAAe,sBAAsB,UAAU,IAAI;CACzD,GAAG,CAAC,CAAC;CACL,MAAM,aAAa,WACf,KACA,KAAK,UAAU,MAAM,KAAK,SAAS,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC;CAEtD,sBAAsB,gBAAgB,GAAG,CAAC,YAAY,eAAe,CAAC;CAEtE,OAAO;AACT"}
@@ -0,0 +1,20 @@
1
+ import type { ReactNode } from 'react';
2
+ type ChartLegendListItem = {
3
+ marker?: ReactNode;
4
+ markerColor?: string;
5
+ value?: ReactNode;
6
+ secondaryValue?: ReactNode;
7
+ selected?: boolean;
8
+ };
9
+ export type ChartLegendListColumns = {
10
+ marker: boolean;
11
+ value: boolean;
12
+ secondaryValue: boolean;
13
+ action: boolean;
14
+ };
15
+ export declare const getAccessibleText: (value: ReactNode) => string | undefined;
16
+ export declare const getChartLegendAriaLabel: (label: ReactNode, value?: ReactNode, secondaryValue?: ReactNode) => string | undefined;
17
+ export declare const getChartLegendListColumns: (items: readonly ChartLegendListItem[], hasItemClick: boolean) => ChartLegendListColumns;
18
+ export declare const getChartLegendListGridTemplate: (columns: ChartLegendListColumns) => string;
19
+ export declare const widthsMatch: (current: Record<string, number>, next: Record<string, number>) => boolean;
20
+ export {};
@@ -0,0 +1,33 @@
1
+ //#region packages/components/src/components/ChartLegend/utils.ts
2
+ var getAccessibleText = (value) => typeof value === "string" || typeof value === "number" || typeof value === "bigint" ? String(value) : void 0;
3
+ var getChartLegendAriaLabel = (label, value, secondaryValue) => {
4
+ const labelText = getAccessibleText(label);
5
+ if (labelText == null) return void 0;
6
+ return [
7
+ labelText,
8
+ getAccessibleText(value),
9
+ getAccessibleText(secondaryValue)
10
+ ].filter((item) => item != null).join(", ");
11
+ };
12
+ var getChartLegendListColumns = (items, hasItemClick) => ({
13
+ marker: items.some((item) => item.marker != null || item.markerColor != null),
14
+ value: items.some((item) => item.value != null),
15
+ secondaryValue: items.some((item) => item.secondaryValue != null),
16
+ action: hasItemClick || items.some((item) => item.selected)
17
+ });
18
+ var getChartLegendListGridTemplate = (columns) => [
19
+ ...columns.marker ? ["auto"] : [],
20
+ "minmax(0, 1fr)",
21
+ ...columns.value ? ["auto"] : [],
22
+ ...columns.secondaryValue ? ["auto"] : [],
23
+ ...columns.action ? ["auto"] : []
24
+ ].join(" ");
25
+ var widthsMatch = (current, next) => {
26
+ const currentKeys = Object.keys(current);
27
+ const nextKeys = Object.keys(next);
28
+ return currentKeys.length === nextKeys.length && nextKeys.every((key) => current[key] === next[key]);
29
+ };
30
+ //#endregion
31
+ export { getAccessibleText, getChartLegendAriaLabel, getChartLegendListColumns, getChartLegendListGridTemplate, widthsMatch };
32
+
33
+ //# sourceMappingURL=utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.js","names":[],"sources":["../../../src/components/ChartLegend/utils.ts"],"sourcesContent":["import type { ReactNode } from 'react';\n\ntype ChartLegendListItem = {\n marker?: ReactNode;\n markerColor?: string;\n value?: ReactNode;\n secondaryValue?: ReactNode;\n selected?: boolean;\n};\n\nexport type ChartLegendListColumns = {\n marker: boolean;\n value: boolean;\n secondaryValue: boolean;\n action: boolean;\n};\n\nexport const getAccessibleText = (value: ReactNode) =>\n typeof value === 'string' ||\n typeof value === 'number' ||\n typeof value === 'bigint'\n ? String(value)\n : undefined;\n\nexport const getChartLegendAriaLabel = (\n label: ReactNode,\n value?: ReactNode,\n secondaryValue?: ReactNode\n) => {\n const labelText = getAccessibleText(label);\n if (labelText == null) return undefined;\n\n return [\n labelText,\n getAccessibleText(value),\n getAccessibleText(secondaryValue),\n ]\n .filter((item) => item != null)\n .join(', ');\n};\n\nexport const getChartLegendListColumns = (\n items: readonly ChartLegendListItem[],\n hasItemClick: boolean\n): ChartLegendListColumns => ({\n marker: items.some((item) => item.marker != null || item.markerColor != null),\n value: items.some((item) => item.value != null),\n secondaryValue: items.some((item) => item.secondaryValue != null),\n action: hasItemClick || items.some((item) => item.selected),\n});\n\nexport const getChartLegendListGridTemplate = (\n columns: ChartLegendListColumns\n) =>\n [\n ...(columns.marker ? ['auto'] : []),\n 'minmax(0, 1fr)',\n ...(columns.value ? ['auto'] : []),\n ...(columns.secondaryValue ? ['auto'] : []),\n ...(columns.action ? ['auto'] : []),\n ].join(' ');\n\nexport const widthsMatch = (\n current: Record<string, number>,\n next: Record<string, number>\n) => {\n const currentKeys = Object.keys(current);\n const nextKeys = Object.keys(next);\n\n return (\n currentKeys.length === nextKeys.length &&\n nextKeys.every((key) => current[key] === next[key])\n );\n};\n"],"mappings":";AAiBA,IAAa,qBAAqB,UAChC,OAAO,UAAU,YACjB,OAAO,UAAU,YACjB,OAAO,UAAU,WACb,OAAO,KAAK,IACZ,KAAA;AAEN,IAAa,2BACX,OACA,OACA,mBACG;CACH,MAAM,YAAY,kBAAkB,KAAK;CACzC,IAAI,aAAa,MAAM,OAAO,KAAA;CAE9B,OAAO;EACL;EACA,kBAAkB,KAAK;EACvB,kBAAkB,cAAc;CAClC,CAAC,CACE,QAAQ,SAAS,QAAQ,IAAI,CAAC,CAC9B,KAAK,IAAI;AACd;AAEA,IAAa,6BACX,OACA,kBAC4B;CAC5B,QAAQ,MAAM,MAAM,SAAS,KAAK,UAAU,QAAQ,KAAK,eAAe,IAAI;CAC5E,OAAO,MAAM,MAAM,SAAS,KAAK,SAAS,IAAI;CAC9C,gBAAgB,MAAM,MAAM,SAAS,KAAK,kBAAkB,IAAI;CAChE,QAAQ,gBAAgB,MAAM,MAAM,SAAS,KAAK,QAAQ;AAC5D;AAEA,IAAa,kCACX,YAEA;CACE,GAAI,QAAQ,SAAS,CAAC,MAAM,IAAI,CAAC;CACjC;CACA,GAAI,QAAQ,QAAQ,CAAC,MAAM,IAAI,CAAC;CAChC,GAAI,QAAQ,iBAAiB,CAAC,MAAM,IAAI,CAAC;CACzC,GAAI,QAAQ,SAAS,CAAC,MAAM,IAAI,CAAC;AACnC,CAAC,CAAC,KAAK,GAAG;AAEZ,IAAa,eACX,SACA,SACG;CACH,MAAM,cAAc,OAAO,KAAK,OAAO;CACvC,MAAM,WAAW,OAAO,KAAK,IAAI;CAEjC,OACE,YAAY,WAAW,SAAS,UAChC,SAAS,OAAO,QAAQ,QAAQ,SAAS,KAAK,IAAI;AAEtD"}
@@ -0,0 +1,23 @@
1
+ import { type HTMLAttributes, type ReactNode } from 'react';
2
+ export type ChartTooltipProps = HTMLAttributes<HTMLDivElement>;
3
+ export declare const ChartTooltip: import("react").ForwardRefExoticComponent<ChartTooltipProps & import("react").RefAttributes<HTMLDivElement>>;
4
+ export interface ChartTooltipHeaderProps extends Omit<HTMLAttributes<HTMLDivElement>, 'title'> {
5
+ title: ReactNode;
6
+ value?: ReactNode;
7
+ leading?: ReactNode;
8
+ }
9
+ export declare function ChartTooltipHeader({ title, value, leading, className, ...props }: ChartTooltipHeaderProps): import("react").JSX.Element;
10
+ export type ChartTooltipBodyProps = HTMLAttributes<HTMLDivElement>;
11
+ export declare function ChartTooltipBody({ className, children, ...props }: ChartTooltipBodyProps): import("react").JSX.Element;
12
+ export interface ChartTooltipRowProps extends Omit<HTMLAttributes<HTMLDivElement>, 'children'> {
13
+ label: ReactNode;
14
+ value?: ReactNode;
15
+ secondaryValue?: ReactNode;
16
+ markerColor?: string;
17
+ marker?: ReactNode;
18
+ /** Highlights the row matching the currently hovered or focused chart mark. Defaults to false. */
19
+ highlighted?: boolean;
20
+ variant?: 'default' | 'total';
21
+ action?: ReactNode;
22
+ }
23
+ export declare function ChartTooltipRow({ label, value, secondaryValue, markerColor, marker, highlighted, variant, action, className, ...props }: ChartTooltipRowProps): import("react").JSX.Element;
@@ -0,0 +1,83 @@
1
+ import { cn } from "../../utils/cn.js";
2
+ import { Text } from "../Text/Text.js";
3
+ import { forwardRef } from "react";
4
+ import { Fragment as Fragment$1, jsx, jsxs } from "react/jsx-runtime";
5
+ //#region packages/components/src/components/ChartTooltip/ChartTooltip.tsx
6
+ var ChartTooltip = forwardRef(({ className, children, ...props }, ref) => /* @__PURE__ */ jsx("div", {
7
+ ref,
8
+ role: "tooltip",
9
+ className: cn("flex w-max max-w-[24rem] flex-col rounded-md border border-subtle bg-elevated p-space-1 text-primary shadow-md", className),
10
+ ...props,
11
+ children
12
+ }));
13
+ ChartTooltip.displayName = "ChartTooltip";
14
+ function ChartTooltipHeader({ title, value, leading, className, ...props }) {
15
+ return /* @__PURE__ */ jsx("div", {
16
+ className,
17
+ ...props,
18
+ children: /* @__PURE__ */ jsxs("div", {
19
+ className: "flex min-w-0 items-center gap-space-6 px-space-2 py-space-1",
20
+ children: [/* @__PURE__ */ jsxs("div", {
21
+ className: "flex min-w-0 flex-1 items-center gap-space-2",
22
+ children: [leading, /* @__PURE__ */ jsx(Text, {
23
+ variant: "xs",
24
+ weight: "medium",
25
+ className: "min-w-0 flex-1 truncate",
26
+ children: title
27
+ })]
28
+ }), value != null && /* @__PURE__ */ jsx(Text, {
29
+ variant: "xs",
30
+ weight: "semibold",
31
+ className: "shrink-0 tabular-nums",
32
+ children: value
33
+ })]
34
+ })
35
+ });
36
+ }
37
+ function ChartTooltipBody({ className, children, ...props }) {
38
+ return /* @__PURE__ */ jsx("div", {
39
+ className: cn("scroll-mask-t scroll-mask-b flex max-h-[min(300px,70vh)] flex-col overflow-y-auto overflow-x-hidden", className),
40
+ ...props,
41
+ children
42
+ });
43
+ }
44
+ function ChartTooltipRow({ label, value, secondaryValue, markerColor, marker, highlighted = false, variant = "default", action, className, ...props }) {
45
+ const isTotal = variant === "total";
46
+ return /* @__PURE__ */ jsxs(Fragment$1, { children: [isTotal && /* @__PURE__ */ jsx("div", {
47
+ "aria-hidden": true,
48
+ className: "mx-space-2 my-space-1 border-t border-subtle"
49
+ }), /* @__PURE__ */ jsxs("div", {
50
+ className: cn("flex min-w-0 items-center gap-space-2 rounded-xs px-space-2 py-space-1", highlighted && "bg-surface-level-2", className),
51
+ ...props,
52
+ children: [
53
+ marker ?? (markerColor != null && /* @__PURE__ */ jsx("div", {
54
+ "aria-hidden": true,
55
+ className: "size-2 shrink-0 rounded-full",
56
+ style: { backgroundColor: markerColor }
57
+ })),
58
+ /* @__PURE__ */ jsx(Text, {
59
+ variant: "xs",
60
+ weight: isTotal ? "semibold" : "normal",
61
+ className: "min-w-0 flex-1 whitespace-normal break-words",
62
+ children: label
63
+ }),
64
+ value != null && /* @__PURE__ */ jsx(Text, {
65
+ variant: "xs",
66
+ weight: isTotal ? "semibold" : "normal",
67
+ className: "shrink-0 text-right tabular-nums",
68
+ children: value
69
+ }),
70
+ secondaryValue != null && /* @__PURE__ */ jsx(Text, {
71
+ variant: "xs",
72
+ color: "tertiary",
73
+ className: "shrink-0 text-right tabular-nums",
74
+ children: secondaryValue
75
+ }),
76
+ action
77
+ ]
78
+ })] });
79
+ }
80
+ //#endregion
81
+ export { ChartTooltip, ChartTooltipBody, ChartTooltipHeader, ChartTooltipRow };
82
+
83
+ //# sourceMappingURL=ChartTooltip.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ChartTooltip.js","names":[],"sources":["../../../src/components/ChartTooltip/ChartTooltip.tsx"],"sourcesContent":["import { forwardRef, type HTMLAttributes, type ReactNode } from 'react';\n\nimport { cn } from '../../utils/cn';\nimport { Text } from '../Text';\n\nexport type ChartTooltipProps = HTMLAttributes<HTMLDivElement>;\n\nexport const ChartTooltip = forwardRef<HTMLDivElement, ChartTooltipProps>(\n ({ className, children, ...props }, ref) => (\n <div\n ref={ref}\n role=\"tooltip\"\n className={cn(\n 'flex w-max max-w-[24rem] flex-col rounded-md border border-subtle bg-elevated p-space-1 text-primary shadow-md',\n className\n )}\n {...props}\n >\n {children}\n </div>\n )\n);\n\nChartTooltip.displayName = 'ChartTooltip';\n\nexport interface ChartTooltipHeaderProps extends Omit<\n HTMLAttributes<HTMLDivElement>,\n 'title'\n> {\n title: ReactNode;\n value?: ReactNode;\n leading?: ReactNode;\n}\n\nexport function ChartTooltipHeader({\n title,\n value,\n leading,\n className,\n ...props\n}: ChartTooltipHeaderProps) {\n return (\n <div className={className} {...props}>\n <div className=\"flex min-w-0 items-center gap-space-6 px-space-2 py-space-1\">\n <div className=\"flex min-w-0 flex-1 items-center gap-space-2\">\n {leading}\n <Text\n variant=\"xs\"\n weight=\"medium\"\n className=\"min-w-0 flex-1 truncate\"\n >\n {title}\n </Text>\n </div>\n {value != null && (\n <Text\n variant=\"xs\"\n weight=\"semibold\"\n className=\"shrink-0 tabular-nums\"\n >\n {value}\n </Text>\n )}\n </div>\n </div>\n );\n}\n\nexport type ChartTooltipBodyProps = HTMLAttributes<HTMLDivElement>;\n\nexport function ChartTooltipBody({\n className,\n children,\n ...props\n}: ChartTooltipBodyProps) {\n return (\n <div\n className={cn(\n 'scroll-mask-t scroll-mask-b flex max-h-[min(300px,70vh)] flex-col overflow-y-auto overflow-x-hidden',\n className\n )}\n {...props}\n >\n {children}\n </div>\n );\n}\n\nexport interface ChartTooltipRowProps extends Omit<\n HTMLAttributes<HTMLDivElement>,\n 'children'\n> {\n label: ReactNode;\n value?: ReactNode;\n secondaryValue?: ReactNode;\n markerColor?: string;\n marker?: ReactNode;\n /** Highlights the row matching the currently hovered or focused chart mark. Defaults to false. */\n highlighted?: boolean;\n variant?: 'default' | 'total';\n action?: ReactNode;\n}\n\nexport function ChartTooltipRow({\n label,\n value,\n secondaryValue,\n markerColor,\n marker,\n highlighted = false,\n variant = 'default',\n action,\n className,\n ...props\n}: ChartTooltipRowProps) {\n const isTotal = variant === 'total';\n\n return (\n <>\n {isTotal && (\n <div\n aria-hidden\n className=\"mx-space-2 my-space-1 border-t border-subtle\"\n />\n )}\n <div\n className={cn(\n 'flex min-w-0 items-center gap-space-2 rounded-xs px-space-2 py-space-1',\n highlighted && 'bg-surface-level-2',\n className\n )}\n {...props}\n >\n {marker ??\n (markerColor != null && (\n <div\n aria-hidden\n className=\"size-2 shrink-0 rounded-full\"\n style={{ backgroundColor: markerColor }}\n />\n ))}\n <Text\n variant=\"xs\"\n weight={isTotal ? 'semibold' : 'normal'}\n className=\"min-w-0 flex-1 whitespace-normal break-words\"\n >\n {label}\n </Text>\n {value != null && (\n <Text\n variant=\"xs\"\n weight={isTotal ? 'semibold' : 'normal'}\n className=\"shrink-0 text-right tabular-nums\"\n >\n {value}\n </Text>\n )}\n {secondaryValue != null && (\n <Text\n variant=\"xs\"\n color=\"tertiary\"\n className=\"shrink-0 text-right tabular-nums\"\n >\n {secondaryValue}\n </Text>\n )}\n {action}\n </div>\n </>\n );\n}\n"],"mappings":";;;;;AAOA,IAAa,eAAe,YACzB,EAAE,WAAW,UAAU,GAAG,SAAS,QAClC,oBAAC,OAAD;CACO;CACL,MAAK;CACL,WAAW,GACT,kHACA,SACF;CACA,GAAI;CAEH;AACE,CAAA,CAET;AAEA,aAAa,cAAc;AAW3B,SAAgB,mBAAmB,EACjC,OACA,OACA,SACA,WACA,GAAG,SACuB;CAC1B,OACE,oBAAC,OAAD;EAAgB;EAAW,GAAI;EAC7B,UAAA,qBAAC,OAAD;GAAK,WAAU;GAAf,UAAA,CACE,qBAAC,OAAD;IAAK,WAAU;IAAf,UAAA,CACG,SACD,oBAAC,MAAD;KACE,SAAQ;KACR,QAAO;KACP,WAAU;KAET,UAAA;IACG,CAAA,CACH;GACJ,CAAA,GAAA,SAAS,QACR,oBAAC,MAAD;IACE,SAAQ;IACR,QAAO;IACP,WAAU;IAET,UAAA;GACG,CAAA,CAEL;;CACF,CAAA;AAET;AAIA,SAAgB,iBAAiB,EAC/B,WACA,UACA,GAAG,SACqB;CACxB,OACE,oBAAC,OAAD;EACE,WAAW,GACT,uGACA,SACF;EACA,GAAI;EAEH;CACE,CAAA;AAET;AAiBA,SAAgB,gBAAgB,EAC9B,OACA,OACA,gBACA,aACA,QACA,cAAc,OACd,UAAU,WACV,QACA,WACA,GAAG,SACoB;CACvB,MAAM,UAAU,YAAY;CAE5B,OACE,qBAAA,YAAA,EAAA,UAAA,CACG,WACC,oBAAC,OAAD;EACE,eAAA;EACA,WAAU;CACX,CAAA,GAEH,qBAAC,OAAD;EACE,WAAW,GACT,0EACA,eAAe,sBACf,SACF;EACA,GAAI;EANN,UAAA;GAQG,WACE,eAAe,QACd,oBAAC,OAAD;IACE,eAAA;IACA,WAAU;IACV,OAAO,EAAE,iBAAiB,YAAY;GACvC,CAAA;GAEL,oBAAC,MAAD;IACE,SAAQ;IACR,QAAQ,UAAU,aAAa;IAC/B,WAAU;IAET,UAAA;GACG,CAAA;GACL,SAAS,QACR,oBAAC,MAAD;IACE,SAAQ;IACR,QAAQ,UAAU,aAAa;IAC/B,WAAU;IAET,UAAA;GACG,CAAA;GAEP,kBAAkB,QACjB,oBAAC,MAAD;IACE,SAAQ;IACR,OAAM;IACN,WAAU;IAET,UAAA;GACG,CAAA;GAEP;EACE;CACL,CAAA,CAAA,EAAA,CAAA;AAEN"}
@@ -0,0 +1,2 @@
1
+ export { ChartTooltip, ChartTooltipBody, ChartTooltipHeader, ChartTooltipRow, } from './ChartTooltip.js';
2
+ export type { ChartTooltipBodyProps, ChartTooltipHeaderProps, ChartTooltipProps, ChartTooltipRowProps, } from './ChartTooltip.js';
@@ -0,0 +1,2 @@
1
+ import { ChartTooltip, ChartTooltipBody, ChartTooltipHeader, ChartTooltipRow } from "./ChartTooltip.js";
2
+ export { ChartTooltip, ChartTooltipBody, ChartTooltipHeader, ChartTooltipRow };