@astryxdesign/lab 0.0.0-bootstrap.0 → 0.1.2-canary.04e71b2

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 (513) hide show
  1. package/CHANGELOG.md +67 -0
  2. package/LICENSE +21 -0
  3. package/README.md +47 -1
  4. package/dist/Chart/Chart.d.ts +77 -0
  5. package/dist/Chart/Chart.d.ts.map +1 -0
  6. package/dist/Chart/Chart.js +247 -0
  7. package/dist/Chart/ChartArea.d.ts +28 -0
  8. package/dist/Chart/ChartArea.d.ts.map +1 -0
  9. package/dist/Chart/ChartArea.js +71 -0
  10. package/dist/Chart/ChartAxis.d.ts +27 -0
  11. package/dist/Chart/ChartAxis.d.ts.map +1 -0
  12. package/dist/Chart/ChartAxis.js +147 -0
  13. package/dist/Chart/ChartBar.d.ts +19 -0
  14. package/dist/Chart/ChartBar.d.ts.map +1 -0
  15. package/dist/Chart/ChartBar.js +61 -0
  16. package/dist/Chart/ChartBrush.d.ts +59 -0
  17. package/dist/Chart/ChartBrush.d.ts.map +1 -0
  18. package/dist/Chart/ChartBrush.js +197 -0
  19. package/dist/Chart/ChartCandlestick.d.ts +50 -0
  20. package/dist/Chart/ChartCandlestick.d.ts.map +1 -0
  21. package/dist/Chart/ChartCandlestick.js +138 -0
  22. package/dist/Chart/ChartContext.d.ts +5 -0
  23. package/dist/Chart/ChartContext.d.ts.map +1 -0
  24. package/dist/Chart/ChartContext.js +20 -0
  25. package/dist/Chart/ChartDot.d.ts +18 -0
  26. package/dist/Chart/ChartDot.d.ts.map +1 -0
  27. package/dist/Chart/ChartDot.js +43 -0
  28. package/dist/Chart/ChartDotGL.d.ts +16 -0
  29. package/dist/Chart/ChartDotGL.d.ts.map +1 -0
  30. package/dist/Chart/ChartDotGL.js +135 -0
  31. package/dist/Chart/ChartDotGLInteractive.d.ts +41 -0
  32. package/dist/Chart/ChartDotGLInteractive.d.ts.map +1 -0
  33. package/dist/Chart/ChartDotGLInteractive.js +446 -0
  34. package/dist/Chart/ChartErrorBar.d.ts +23 -0
  35. package/dist/Chart/ChartErrorBar.d.ts.map +1 -0
  36. package/dist/Chart/ChartErrorBar.js +68 -0
  37. package/dist/Chart/ChartGrid.d.ts +17 -0
  38. package/dist/Chart/ChartGrid.d.ts.map +1 -0
  39. package/dist/Chart/ChartGrid.js +67 -0
  40. package/dist/Chart/ChartHeatmapGL.d.ts +10 -0
  41. package/dist/Chart/ChartHeatmapGL.d.ts.map +1 -0
  42. package/dist/Chart/ChartHeatmapGL.js +171 -0
  43. package/dist/Chart/ChartLegend.d.ts +60 -0
  44. package/dist/Chart/ChartLegend.d.ts.map +1 -0
  45. package/dist/Chart/ChartLegend.js +161 -0
  46. package/dist/Chart/ChartLine.d.ts +23 -0
  47. package/dist/Chart/ChartLine.d.ts.map +1 -0
  48. package/dist/Chart/ChartLine.js +64 -0
  49. package/dist/Chart/ChartReferenceLine.d.ts +11 -0
  50. package/dist/Chart/ChartReferenceLine.d.ts.map +1 -0
  51. package/dist/Chart/ChartReferenceLine.js +109 -0
  52. package/dist/Chart/ChartSelect.d.ts +9 -0
  53. package/dist/Chart/ChartSelect.d.ts.map +1 -0
  54. package/dist/Chart/ChartSelect.js +90 -0
  55. package/dist/Chart/ChartStreamGL.d.ts +17 -0
  56. package/dist/Chart/ChartStreamGL.d.ts.map +1 -0
  57. package/dist/Chart/ChartStreamGL.js +157 -0
  58. package/dist/Chart/ChartTooltip.d.ts +85 -0
  59. package/dist/Chart/ChartTooltip.d.ts.map +1 -0
  60. package/dist/Chart/ChartTooltip.js +335 -0
  61. package/dist/Chart/ChartZoom.d.ts +23 -0
  62. package/dist/Chart/ChartZoom.d.ts.map +1 -0
  63. package/dist/Chart/ChartZoom.js +314 -0
  64. package/dist/Chart/formatters.d.ts +33 -0
  65. package/dist/Chart/formatters.d.ts.map +1 -0
  66. package/dist/Chart/formatters.js +101 -0
  67. package/dist/Chart/getChartColors.d.ts +56 -0
  68. package/dist/Chart/getChartColors.d.ts.map +1 -0
  69. package/dist/Chart/getChartColors.js +150 -0
  70. package/dist/Chart/index.d.ts +29 -0
  71. package/dist/Chart/index.d.ts.map +1 -0
  72. package/dist/Chart/index.js +29 -0
  73. package/dist/Chart/m4.d.ts +36 -0
  74. package/dist/Chart/m4.d.ts.map +1 -0
  75. package/dist/Chart/m4.js +106 -0
  76. package/dist/Chart/types.d.ts +55 -0
  77. package/dist/Chart/types.d.ts.map +1 -0
  78. package/dist/Chart/types.js +1 -0
  79. package/dist/Chart/useChartColors.d.ts +16 -0
  80. package/dist/Chart/useChartColors.d.ts.map +1 -0
  81. package/dist/Chart/useChartColors.js +30 -0
  82. package/dist/Chart/useChartRange.d.ts +50 -0
  83. package/dist/Chart/useChartRange.d.ts.map +1 -0
  84. package/dist/Chart/useChartRange.js +90 -0
  85. package/dist/Chart/utils.d.ts +15 -0
  86. package/dist/Chart/utils.d.ts.map +1 -0
  87. package/dist/Chart/utils.js +24 -0
  88. package/dist/Chart/webgl.d.ts +62 -0
  89. package/dist/Chart/webgl.d.ts.map +1 -0
  90. package/dist/Chart/webgl.js +169 -0
  91. package/dist/ChartV2/Chart.d.ts +32 -0
  92. package/dist/ChartV2/Chart.d.ts.map +1 -0
  93. package/dist/ChartV2/Chart.js +281 -0
  94. package/dist/ChartV2/ChartAxis.d.ts +36 -0
  95. package/dist/ChartV2/ChartAxis.d.ts.map +1 -0
  96. package/dist/ChartV2/ChartAxis.js +161 -0
  97. package/dist/ChartV2/ChartGrid.d.ts +20 -0
  98. package/dist/ChartV2/ChartGrid.d.ts.map +1 -0
  99. package/dist/ChartV2/ChartGrid.js +76 -0
  100. package/dist/ChartV2/ChartLegend.d.ts +14 -0
  101. package/dist/ChartV2/ChartLegend.d.ts.map +1 -0
  102. package/dist/ChartV2/ChartLegend.js +54 -0
  103. package/dist/ChartV2/ChartSwatch.d.ts +36 -0
  104. package/dist/ChartV2/ChartSwatch.d.ts.map +1 -0
  105. package/dist/ChartV2/ChartSwatch.js +82 -0
  106. package/dist/ChartV2/ChartTooltip.d.ts +46 -0
  107. package/dist/ChartV2/ChartTooltip.d.ts.map +1 -0
  108. package/dist/ChartV2/ChartTooltip.js +267 -0
  109. package/dist/ChartV2/ChartV2Context.d.ts +4 -0
  110. package/dist/ChartV2/ChartV2Context.d.ts.map +1 -0
  111. package/dist/ChartV2/ChartV2Context.js +12 -0
  112. package/dist/ChartV2/index.d.ts +13 -0
  113. package/dist/ChartV2/index.d.ts.map +1 -0
  114. package/dist/ChartV2/index.js +10 -0
  115. package/dist/ChartV2/layout.d.ts +25 -0
  116. package/dist/ChartV2/layout.d.ts.map +1 -0
  117. package/dist/ChartV2/layout.js +195 -0
  118. package/dist/ChartV2/legend.d.ts +18 -0
  119. package/dist/ChartV2/legend.d.ts.map +1 -0
  120. package/dist/ChartV2/legend.js +24 -0
  121. package/dist/ChartV2/marks/area.d.ts +19 -0
  122. package/dist/ChartV2/marks/area.d.ts.map +1 -0
  123. package/dist/ChartV2/marks/area.js +109 -0
  124. package/dist/ChartV2/marks/band.d.ts +9 -0
  125. package/dist/ChartV2/marks/band.d.ts.map +1 -0
  126. package/dist/ChartV2/marks/band.js +59 -0
  127. package/dist/ChartV2/marks/bar.d.ts +17 -0
  128. package/dist/ChartV2/marks/bar.d.ts.map +1 -0
  129. package/dist/ChartV2/marks/bar.js +120 -0
  130. package/dist/ChartV2/marks/candlestick.d.ts +15 -0
  131. package/dist/ChartV2/marks/candlestick.d.ts.map +1 -0
  132. package/dist/ChartV2/marks/candlestick.js +83 -0
  133. package/dist/ChartV2/marks/dot.d.ts +15 -0
  134. package/dist/ChartV2/marks/dot.d.ts.map +1 -0
  135. package/dist/ChartV2/marks/dot.js +65 -0
  136. package/dist/ChartV2/marks/dotGL.d.ts +16 -0
  137. package/dist/ChartV2/marks/dotGL.d.ts.map +1 -0
  138. package/dist/ChartV2/marks/dotGL.js +178 -0
  139. package/dist/ChartV2/marks/dotGLInteractive.d.ts +30 -0
  140. package/dist/ChartV2/marks/dotGLInteractive.d.ts.map +1 -0
  141. package/dist/ChartV2/marks/dotGLInteractive.js +464 -0
  142. package/dist/ChartV2/marks/errorBar.d.ts +27 -0
  143. package/dist/ChartV2/marks/errorBar.d.ts.map +1 -0
  144. package/dist/ChartV2/marks/errorBar.js +87 -0
  145. package/dist/ChartV2/marks/heatmapGL.d.ts +23 -0
  146. package/dist/ChartV2/marks/heatmapGL.d.ts.map +1 -0
  147. package/dist/ChartV2/marks/heatmapGL.js +242 -0
  148. package/dist/ChartV2/marks/index.d.ts +13 -0
  149. package/dist/ChartV2/marks/index.d.ts.map +1 -0
  150. package/dist/ChartV2/marks/index.js +14 -0
  151. package/dist/ChartV2/marks/line.d.ts +18 -0
  152. package/dist/ChartV2/marks/line.d.ts.map +1 -0
  153. package/dist/ChartV2/marks/line.js +76 -0
  154. package/dist/ChartV2/marks/referenceLine.d.ts +35 -0
  155. package/dist/ChartV2/marks/referenceLine.d.ts.map +1 -0
  156. package/dist/ChartV2/marks/referenceLine.js +186 -0
  157. package/dist/ChartV2/marks/streamGL.d.ts +36 -0
  158. package/dist/ChartV2/marks/streamGL.d.ts.map +1 -0
  159. package/dist/ChartV2/marks/streamGL.js +204 -0
  160. package/dist/ChartV2/tooltip.d.ts +38 -0
  161. package/dist/ChartV2/tooltip.d.ts.map +1 -0
  162. package/dist/ChartV2/tooltip.js +54 -0
  163. package/dist/ChartV2/types.d.ts +115 -0
  164. package/dist/ChartV2/types.d.ts.map +1 -0
  165. package/dist/ChartV2/types.js +35 -0
  166. package/dist/ChatReasoning/ChatReasoning.d.ts +51 -0
  167. package/dist/ChatReasoning/ChatReasoning.d.ts.map +1 -0
  168. package/dist/ChatReasoning/ChatReasoning.js +236 -0
  169. package/dist/CircularProgress/CircularProgress.d.ts +101 -0
  170. package/dist/CircularProgress/CircularProgress.d.ts.map +1 -0
  171. package/dist/CircularProgress/CircularProgress.js +263 -0
  172. package/dist/CircularProgress/index.d.ts +6 -0
  173. package/dist/CircularProgress/index.d.ts.map +1 -0
  174. package/dist/CircularProgress/index.js +8 -0
  175. package/dist/CodeBlock/index.d.ts +8 -0
  176. package/dist/CodeBlock/index.d.ts.map +1 -0
  177. package/dist/CodeBlock/index.js +9 -0
  178. package/dist/CodeEditor/CodeEditor.d.ts +46 -0
  179. package/dist/CodeEditor/CodeEditor.d.ts.map +1 -0
  180. package/dist/CodeEditor/CodeEditor.js +396 -0
  181. package/dist/CodeEditor/index.d.ts +6 -0
  182. package/dist/CodeEditor/index.d.ts.map +1 -0
  183. package/dist/CodeEditor/index.js +7 -0
  184. package/dist/Radial/RadialArea.d.ts +25 -0
  185. package/dist/Radial/RadialArea.d.ts.map +1 -0
  186. package/dist/Radial/RadialArea.js +91 -0
  187. package/dist/Radial/RadialAxis.d.ts +14 -0
  188. package/dist/Radial/RadialAxis.d.ts.map +1 -0
  189. package/dist/Radial/RadialAxis.js +55 -0
  190. package/dist/Radial/RadialChart.d.ts +70 -0
  191. package/dist/Radial/RadialChart.d.ts.map +1 -0
  192. package/dist/Radial/RadialChart.js +174 -0
  193. package/dist/Radial/RadialContext.d.ts +5 -0
  194. package/dist/Radial/RadialContext.d.ts.map +1 -0
  195. package/dist/Radial/RadialContext.js +19 -0
  196. package/dist/Radial/RadialGrid.d.ts +14 -0
  197. package/dist/Radial/RadialGrid.d.ts.map +1 -0
  198. package/dist/Radial/RadialGrid.js +70 -0
  199. package/dist/Radial/RadialSlice.d.ts +23 -0
  200. package/dist/Radial/RadialSlice.d.ts.map +1 -0
  201. package/dist/Radial/RadialSlice.js +85 -0
  202. package/dist/Radial/RadialTooltip.d.ts +44 -0
  203. package/dist/Radial/RadialTooltip.d.ts.map +1 -0
  204. package/dist/Radial/RadialTooltip.js +284 -0
  205. package/dist/Radial/index.d.ts +9 -0
  206. package/dist/Radial/index.d.ts.map +1 -0
  207. package/dist/Radial/index.js +9 -0
  208. package/dist/Radial/types.d.ts +39 -0
  209. package/dist/Radial/types.d.ts.map +1 -0
  210. package/dist/Radial/types.js +1 -0
  211. package/dist/SVGIcon/SVGIcon.d.ts +87 -0
  212. package/dist/SVGIcon/SVGIcon.d.ts.map +1 -0
  213. package/dist/SVGIcon/SVGIcon.js +299 -0
  214. package/dist/SVGIcon/icons.d.ts +49 -0
  215. package/dist/SVGIcon/icons.d.ts.map +1 -0
  216. package/dist/SVGIcon/icons.js +326 -0
  217. package/dist/SVGIcon/index.d.ts +15 -0
  218. package/dist/SVGIcon/index.d.ts.map +1 -0
  219. package/dist/SVGIcon/index.js +22 -0
  220. package/dist/SVGIcon/pathTransforms.d.ts +35 -0
  221. package/dist/SVGIcon/pathTransforms.d.ts.map +1 -0
  222. package/dist/SVGIcon/pathTransforms.js +644 -0
  223. package/dist/SVGIcon/tokens.stylex.d.ts +37 -0
  224. package/dist/SVGIcon/tokens.stylex.d.ts.map +1 -0
  225. package/dist/SVGIcon/tokens.stylex.js +40 -0
  226. package/dist/SVGIcon/variations.stylex.d.ts +44 -0
  227. package/dist/SVGIcon/variations.stylex.d.ts.map +1 -0
  228. package/dist/SVGIcon/variations.stylex.js +119 -0
  229. package/dist/SVGIcon/xif-examples.d.ts +22 -0
  230. package/dist/SVGIcon/xif-examples.d.ts.map +1 -0
  231. package/dist/SVGIcon/xif-examples.js +202 -0
  232. package/dist/SVGIcon/xif-types.d.ts +129 -0
  233. package/dist/SVGIcon/xif-types.d.ts.map +1 -0
  234. package/dist/SVGIcon/xif-types.js +1 -0
  235. package/dist/Sankey/SankeyChart.d.ts +72 -0
  236. package/dist/Sankey/SankeyChart.d.ts.map +1 -0
  237. package/dist/Sankey/SankeyChart.js +162 -0
  238. package/dist/Sankey/SankeyContext.d.ts +5 -0
  239. package/dist/Sankey/SankeyContext.d.ts.map +1 -0
  240. package/dist/Sankey/SankeyContext.js +20 -0
  241. package/dist/Sankey/SankeyGrid.d.ts +20 -0
  242. package/dist/Sankey/SankeyGrid.d.ts.map +1 -0
  243. package/dist/Sankey/SankeyGrid.js +53 -0
  244. package/dist/Sankey/SankeyLabel.d.ts +11 -0
  245. package/dist/Sankey/SankeyLabel.d.ts.map +1 -0
  246. package/dist/Sankey/SankeyLabel.js +179 -0
  247. package/dist/Sankey/SankeyLink.d.ts +29 -0
  248. package/dist/Sankey/SankeyLink.d.ts.map +1 -0
  249. package/dist/Sankey/SankeyLink.js +139 -0
  250. package/dist/Sankey/SankeyNode.d.ts +15 -0
  251. package/dist/Sankey/SankeyNode.d.ts.map +1 -0
  252. package/dist/Sankey/SankeyNode.js +56 -0
  253. package/dist/Sankey/index.d.ts +8 -0
  254. package/dist/Sankey/index.d.ts.map +1 -0
  255. package/dist/Sankey/index.js +8 -0
  256. package/dist/Sankey/layout.d.ts +26 -0
  257. package/dist/Sankey/layout.d.ts.map +1 -0
  258. package/dist/Sankey/layout.js +157 -0
  259. package/dist/Sankey/types.d.ts +84 -0
  260. package/dist/Sankey/types.d.ts.map +1 -0
  261. package/dist/Sankey/types.js +1 -0
  262. package/dist/Schedule/CalendarEvent.d.ts +36 -0
  263. package/dist/Schedule/CalendarEvent.d.ts.map +1 -0
  264. package/dist/Schedule/CalendarEvent.js +35 -0
  265. package/dist/Schedule/DayView.d.ts +8 -0
  266. package/dist/Schedule/DayView.d.ts.map +1 -0
  267. package/dist/Schedule/DayView.js +105 -0
  268. package/dist/Schedule/ListView.d.ts +6 -0
  269. package/dist/Schedule/ListView.d.ts.map +1 -0
  270. package/dist/Schedule/ListView.js +171 -0
  271. package/dist/Schedule/MonthlyView.d.ts +6 -0
  272. package/dist/Schedule/MonthlyView.d.ts.map +1 -0
  273. package/dist/Schedule/MonthlyView.js +270 -0
  274. package/dist/Schedule/Schedule.d.ts +22 -0
  275. package/dist/Schedule/Schedule.d.ts.map +1 -0
  276. package/dist/Schedule/Schedule.js +185 -0
  277. package/dist/Schedule/TimeGridView.d.ts +12 -0
  278. package/dist/Schedule/TimeGridView.d.ts.map +1 -0
  279. package/dist/Schedule/TimeGridView.js +364 -0
  280. package/dist/Schedule/WeeklyView.d.ts +9 -0
  281. package/dist/Schedule/WeeklyView.d.ts.map +1 -0
  282. package/dist/Schedule/WeeklyView.js +112 -0
  283. package/dist/Schedule/context.d.ts +20 -0
  284. package/dist/Schedule/context.d.ts.map +1 -0
  285. package/dist/Schedule/context.js +19 -0
  286. package/dist/Schedule/dateMath.d.ts +21 -0
  287. package/dist/Schedule/dateMath.d.ts.map +1 -0
  288. package/dist/Schedule/dateMath.js +63 -0
  289. package/dist/Schedule/index.d.ts +19 -0
  290. package/dist/Schedule/index.d.ts.map +1 -0
  291. package/dist/Schedule/index.js +17 -0
  292. package/dist/Schedule/plugins/PaginationPlugin.d.ts +7 -0
  293. package/dist/Schedule/plugins/PaginationPlugin.d.ts.map +1 -0
  294. package/dist/Schedule/plugins/PaginationPlugin.js +81 -0
  295. package/dist/Schedule/plugins/ViewSelectorPlugin.d.ts +11 -0
  296. package/dist/Schedule/plugins/ViewSelectorPlugin.d.ts.map +1 -0
  297. package/dist/Schedule/plugins/ViewSelectorPlugin.js +78 -0
  298. package/dist/Schedule/plugins/index.d.ts +5 -0
  299. package/dist/Schedule/plugins/index.d.ts.map +1 -0
  300. package/dist/Schedule/plugins/index.js +14 -0
  301. package/dist/Schedule/shared.d.ts +923 -0
  302. package/dist/Schedule/shared.d.ts.map +1 -0
  303. package/dist/Schedule/shared.js +1325 -0
  304. package/dist/Schedule/types.d.ts +51 -0
  305. package/dist/Schedule/types.d.ts.map +1 -0
  306. package/dist/Schedule/types.js +1 -0
  307. package/dist/Schedule/useCurrentTime.d.ts +3 -0
  308. package/dist/Schedule/useCurrentTime.d.ts.map +1 -0
  309. package/dist/Schedule/useCurrentTime.js +43 -0
  310. package/dist/Schedule/zonedDateTime.d.ts +20 -0
  311. package/dist/Schedule/zonedDateTime.d.ts.map +1 -0
  312. package/dist/Schedule/zonedDateTime.js +31 -0
  313. package/dist/Stepper/Step.d.ts +120 -0
  314. package/dist/Stepper/Step.d.ts.map +1 -0
  315. package/dist/Stepper/Step.js +573 -0
  316. package/dist/Stepper/StepStatus.d.ts +24 -0
  317. package/dist/Stepper/StepStatus.d.ts.map +1 -0
  318. package/dist/Stepper/StepStatus.js +1 -0
  319. package/dist/Stepper/Stepper.d.ts +77 -0
  320. package/dist/Stepper/Stepper.d.ts.map +1 -0
  321. package/dist/Stepper/Stepper.js +104 -0
  322. package/dist/Stepper/StepperContext.d.ts +12 -0
  323. package/dist/Stepper/StepperContext.d.ts.map +1 -0
  324. package/dist/Stepper/StepperContext.js +24 -0
  325. package/dist/Stepper/index.d.ts +8 -0
  326. package/dist/Stepper/index.d.ts.map +1 -0
  327. package/dist/Stepper/index.js +7 -0
  328. package/dist/ThreeD/ThreeDAxis.d.ts +6 -0
  329. package/dist/ThreeD/ThreeDAxis.d.ts.map +1 -0
  330. package/dist/ThreeD/ThreeDAxis.js +75 -0
  331. package/dist/ThreeD/ThreeDBar.d.ts +7 -0
  332. package/dist/ThreeD/ThreeDBar.d.ts.map +1 -0
  333. package/dist/ThreeD/ThreeDBar.js +98 -0
  334. package/dist/ThreeD/ThreeDChart.d.ts +24 -0
  335. package/dist/ThreeD/ThreeDChart.d.ts.map +1 -0
  336. package/dist/ThreeD/ThreeDChart.js +202 -0
  337. package/dist/ThreeD/ThreeDContext.d.ts +5 -0
  338. package/dist/ThreeD/ThreeDContext.d.ts.map +1 -0
  339. package/dist/ThreeD/ThreeDContext.js +19 -0
  340. package/dist/ThreeD/ThreeDGrid.d.ts +5 -0
  341. package/dist/ThreeD/ThreeDGrid.d.ts.map +1 -0
  342. package/dist/ThreeD/ThreeDGrid.js +55 -0
  343. package/dist/ThreeD/ThreeDScatter.d.ts +7 -0
  344. package/dist/ThreeD/ThreeDScatter.d.ts.map +1 -0
  345. package/dist/ThreeD/ThreeDScatter.js +57 -0
  346. package/dist/ThreeD/ThreeDScatterGL.d.ts +7 -0
  347. package/dist/ThreeD/ThreeDScatterGL.d.ts.map +1 -0
  348. package/dist/ThreeD/ThreeDScatterGL.js +243 -0
  349. package/dist/ThreeD/ThreeDSurface.d.ts +15 -0
  350. package/dist/ThreeD/ThreeDSurface.d.ts.map +1 -0
  351. package/dist/ThreeD/ThreeDSurface.js +97 -0
  352. package/dist/ThreeD/index.d.ts +10 -0
  353. package/dist/ThreeD/index.d.ts.map +1 -0
  354. package/dist/ThreeD/index.js +10 -0
  355. package/dist/ThreeD/types.d.ts +57 -0
  356. package/dist/ThreeD/types.d.ts.map +1 -0
  357. package/dist/ThreeD/types.js +1 -0
  358. package/dist/index.d.ts +26 -0
  359. package/dist/index.d.ts.map +1 -0
  360. package/dist/index.js +47 -0
  361. package/dist/lab.css +423 -0
  362. package/package.json +69 -4
  363. package/src/Chart/Chart.tsx +312 -0
  364. package/src/Chart/ChartArea.doc.mjs +16 -0
  365. package/src/Chart/ChartArea.tsx +91 -0
  366. package/src/Chart/ChartAxis.tsx +186 -0
  367. package/src/Chart/ChartBar.doc.mjs +16 -0
  368. package/src/Chart/ChartBar.tsx +71 -0
  369. package/src/Chart/ChartBrush.tsx +237 -0
  370. package/src/Chart/ChartCandlestick.doc.mjs +16 -0
  371. package/src/Chart/ChartCandlestick.tsx +186 -0
  372. package/src/Chart/ChartContext.ts +23 -0
  373. package/src/Chart/ChartDot.doc.mjs +16 -0
  374. package/src/Chart/ChartDot.tsx +44 -0
  375. package/src/Chart/ChartDotGL.doc.mjs +16 -0
  376. package/src/Chart/ChartDotGL.tsx +151 -0
  377. package/src/Chart/ChartDotGLInteractive.doc.mjs +16 -0
  378. package/src/Chart/ChartDotGLInteractive.tsx +519 -0
  379. package/src/Chart/ChartErrorBar.tsx +84 -0
  380. package/src/Chart/ChartGrid.tsx +86 -0
  381. package/src/Chart/ChartHeatmapGL.doc.mjs +16 -0
  382. package/src/Chart/ChartHeatmapGL.tsx +219 -0
  383. package/src/Chart/ChartLegend.tsx +181 -0
  384. package/src/Chart/ChartLine.doc.mjs +16 -0
  385. package/src/Chart/ChartLine.tsx +70 -0
  386. package/src/Chart/ChartReferenceLine.tsx +76 -0
  387. package/src/Chart/ChartSelect.tsx +111 -0
  388. package/src/Chart/ChartStreamGL.doc.mjs +16 -0
  389. package/src/Chart/ChartStreamGL.tsx +189 -0
  390. package/src/Chart/ChartTooltip.tsx +451 -0
  391. package/src/Chart/ChartZoom.tsx +400 -0
  392. package/src/Chart/formatters.ts +95 -0
  393. package/src/Chart/getChartColors.ts +249 -0
  394. package/src/Chart/index.ts +90 -0
  395. package/src/Chart/m4.test.ts +66 -0
  396. package/src/Chart/m4.ts +128 -0
  397. package/src/Chart/types.ts +64 -0
  398. package/src/Chart/useChartColors.ts +34 -0
  399. package/src/Chart/useChartRange.test.ts +101 -0
  400. package/src/Chart/useChartRange.ts +146 -0
  401. package/src/Chart/utils.ts +31 -0
  402. package/src/Chart/webgl.ts +192 -0
  403. package/src/ChartV2/Chart.tsx +348 -0
  404. package/src/ChartV2/ChartAxis.tsx +209 -0
  405. package/src/ChartV2/ChartGrid.tsx +99 -0
  406. package/src/ChartV2/ChartLegend.tsx +69 -0
  407. package/src/ChartV2/ChartSwatch.doc.mjs +17 -0
  408. package/src/ChartV2/ChartSwatch.tsx +86 -0
  409. package/src/ChartV2/ChartTooltip.tsx +382 -0
  410. package/src/ChartV2/ChartV2.doc.mjs +16 -0
  411. package/src/ChartV2/ChartV2Context.ts +15 -0
  412. package/src/ChartV2/index.ts +62 -0
  413. package/src/ChartV2/layout.ts +223 -0
  414. package/src/ChartV2/legend.ts +32 -0
  415. package/src/ChartV2/marks/area.tsx +122 -0
  416. package/src/ChartV2/marks/band.tsx +70 -0
  417. package/src/ChartV2/marks/bar.tsx +159 -0
  418. package/src/ChartV2/marks/candlestick.tsx +106 -0
  419. package/src/ChartV2/marks/dot.tsx +64 -0
  420. package/src/ChartV2/marks/dotGL.tsx +202 -0
  421. package/src/ChartV2/marks/dotGLInteractive.tsx +546 -0
  422. package/src/ChartV2/marks/errorBar.tsx +89 -0
  423. package/src/ChartV2/marks/heatmapGL.tsx +299 -0
  424. package/src/ChartV2/marks/index.ts +14 -0
  425. package/src/ChartV2/marks/line.tsx +94 -0
  426. package/src/ChartV2/marks/referenceLine.tsx +224 -0
  427. package/src/ChartV2/marks/streamGL.tsx +251 -0
  428. package/src/ChartV2/tooltip.ts +70 -0
  429. package/src/ChartV2/types.ts +129 -0
  430. package/src/ChatReasoning/ChatReasoning.doc.mjs +16 -0
  431. package/src/ChatReasoning/ChatReasoning.test.tsx +56 -0
  432. package/src/ChatReasoning/ChatReasoning.tsx +322 -0
  433. package/src/CircularProgress/CircularProgress.doc.mjs +174 -0
  434. package/src/CircularProgress/CircularProgress.test.tsx +157 -0
  435. package/src/CircularProgress/CircularProgress.tsx +373 -0
  436. package/src/CircularProgress/index.ts +15 -0
  437. package/src/CodeBlock/index.ts +10 -0
  438. package/src/CodeEditor/CodeEditor.doc.mjs +16 -0
  439. package/src/CodeEditor/CodeEditor.tsx +466 -0
  440. package/src/CodeEditor/index.ts +8 -0
  441. package/src/Radial/RadialArea.tsx +103 -0
  442. package/src/Radial/RadialAxis.tsx +60 -0
  443. package/src/Radial/RadialChart.doc.mjs +16 -0
  444. package/src/Radial/RadialChart.tsx +219 -0
  445. package/src/Radial/RadialContext.ts +22 -0
  446. package/src/Radial/RadialGrid.tsx +81 -0
  447. package/src/Radial/RadialSlice.tsx +130 -0
  448. package/src/Radial/RadialTooltip.tsx +347 -0
  449. package/src/Radial/index.ts +14 -0
  450. package/src/Radial/types.ts +46 -0
  451. package/src/SVGIcon/SVGIcon.doc.mjs +16 -0
  452. package/src/SVGIcon/SVGIcon.tsx +406 -0
  453. package/src/SVGIcon/icons.ts +283 -0
  454. package/src/SVGIcon/index.ts +73 -0
  455. package/src/SVGIcon/pathTransforms.ts +612 -0
  456. package/src/SVGIcon/tokens.stylex.ts +53 -0
  457. package/src/SVGIcon/variations.stylex.ts +122 -0
  458. package/src/SVGIcon/xif-examples.ts +191 -0
  459. package/src/SVGIcon/xif-types.ts +181 -0
  460. package/src/Sankey/SankeyChart.doc.mjs +16 -0
  461. package/src/Sankey/SankeyChart.tsx +220 -0
  462. package/src/Sankey/SankeyContext.ts +23 -0
  463. package/src/Sankey/SankeyGrid.tsx +69 -0
  464. package/src/Sankey/SankeyLabel.tsx +234 -0
  465. package/src/Sankey/SankeyLink.tsx +167 -0
  466. package/src/Sankey/SankeyNode.tsx +66 -0
  467. package/src/Sankey/index.ts +22 -0
  468. package/src/Sankey/layout.ts +219 -0
  469. package/src/Sankey/types.ts +93 -0
  470. package/src/Schedule/CalendarEvent.ts +74 -0
  471. package/src/Schedule/DayView.tsx +112 -0
  472. package/src/Schedule/ListView.tsx +236 -0
  473. package/src/Schedule/MonthlyView.tsx +401 -0
  474. package/src/Schedule/Schedule.doc.mjs +16 -0
  475. package/src/Schedule/Schedule.test.tsx +405 -0
  476. package/src/Schedule/Schedule.tsx +307 -0
  477. package/src/Schedule/TimeGridView.tsx +589 -0
  478. package/src/Schedule/WeeklyView.tsx +130 -0
  479. package/src/Schedule/context.tsx +49 -0
  480. package/src/Schedule/dateMath.ts +112 -0
  481. package/src/Schedule/index.ts +61 -0
  482. package/src/Schedule/plugins/PaginationPlugin.tsx +98 -0
  483. package/src/Schedule/plugins/ViewSelectorPlugin.tsx +128 -0
  484. package/src/Schedule/plugins/index.tsx +20 -0
  485. package/src/Schedule/shared.tsx +1304 -0
  486. package/src/Schedule/types.ts +86 -0
  487. package/src/Schedule/useCurrentTime.ts +50 -0
  488. package/src/Schedule/zonedDateTime.ts +71 -0
  489. package/src/Stepper/Step.doc.mjs +17 -0
  490. package/src/Stepper/Step.tsx +756 -0
  491. package/src/Stepper/StepStatus.ts +26 -0
  492. package/src/Stepper/Stepper.doc.mjs +265 -0
  493. package/src/Stepper/Stepper.test.tsx +281 -0
  494. package/src/Stepper/Stepper.tsx +157 -0
  495. package/src/Stepper/StepperContext.ts +43 -0
  496. package/src/Stepper/index.ts +14 -0
  497. package/src/ThreeD/3DBar.doc.mjs +16 -0
  498. package/src/ThreeD/3DChart.doc.mjs +16 -0
  499. package/src/ThreeD/3DScatter.doc.mjs +16 -0
  500. package/src/ThreeD/3DScatterGL.doc.mjs +16 -0
  501. package/src/ThreeD/3DSurface.doc.mjs +16 -0
  502. package/src/ThreeD/ThreeDAxis.tsx +86 -0
  503. package/src/ThreeD/ThreeDBar.tsx +130 -0
  504. package/src/ThreeD/ThreeDChart.tsx +262 -0
  505. package/src/ThreeD/ThreeDContext.ts +22 -0
  506. package/src/ThreeD/ThreeDGrid.tsx +68 -0
  507. package/src/ThreeD/ThreeDScatter.tsx +63 -0
  508. package/src/ThreeD/ThreeDScatterGL.tsx +270 -0
  509. package/src/ThreeD/ThreeDSurface.tsx +142 -0
  510. package/src/ThreeD/index.ts +11 -0
  511. package/src/ThreeD/projection.test.ts +132 -0
  512. package/src/ThreeD/types.ts +62 -0
  513. package/src/index.ts +250 -0
@@ -0,0 +1,348 @@
1
+ // Copyright (c) Meta Platforms, Inc. and affiliates.
2
+
3
+ /**
4
+ * @file Chart.tsx (v2)
5
+ * @output Root chart — coordinates layout, rendering, and events
6
+ * @position Top-level; delegates everything to series configs and interaction slots
7
+ *
8
+ * The chart root has ZERO knowledge of mark types. It:
9
+ * 1. Runs the layout engine (scales + stacking + grouping)
10
+ * 2. Calls each series' resolve() and render() methods
11
+ * 3. Provides a single event layer for interaction children
12
+ */
13
+
14
+ import {
15
+ type ReactNode,
16
+ useId,
17
+ useMemo,
18
+ useRef,
19
+ useState,
20
+ useCallback,
21
+ useLayoutEffect,
22
+ } from 'react';
23
+ import type {SeriesDef} from './types';
24
+ import type {ChartV2Context, ChartMargin, ChartPointerEvent} from './types';
25
+ import {computeLayout} from './layout';
26
+ import {ChartV2Provider} from './ChartV2Context';
27
+ import {ChartProvider} from '../Chart/ChartContext';
28
+ import {Text} from '@astryxdesign/core';
29
+ import {VStack, HStack} from '@astryxdesign/core';
30
+ import * as stylex from '@stylexjs/stylex';
31
+ import {ChartLegend, type ChartLegendProps} from './ChartLegend';
32
+ import {deriveLegendItems} from './legend';
33
+ import {ChartTooltip, type ChartTooltipProps} from './ChartTooltip';
34
+
35
+ export interface ChartProps {
36
+ data: Record<string, unknown>[];
37
+ xKey: string;
38
+ series: SeriesDef[];
39
+ height?: number;
40
+ margin?: Partial<ChartMargin>;
41
+ grid?: ReactNode;
42
+ axes?: ReactNode;
43
+ legend?: boolean | ChartLegendProps;
44
+ tooltip?: boolean | Omit<ChartTooltipProps, 'series'>;
45
+ interactions?: ReactNode;
46
+ children?: ReactNode;
47
+ title?: string;
48
+ subtitle?: string;
49
+ }
50
+
51
+ const DEFAULT_MARGIN: ChartMargin = {top: 24, right: 24, bottom: 32, left: 48};
52
+
53
+ const styles = stylex.create({
54
+ container: {
55
+ width: '100%',
56
+ },
57
+ title: {
58
+ marginBottom: 16,
59
+ },
60
+ chartArea: {
61
+ flex: 1,
62
+ minWidth: 0,
63
+ overflow: 'hidden',
64
+ },
65
+ });
66
+
67
+ export function Chart({
68
+ data,
69
+ xKey,
70
+ series,
71
+ height = 300,
72
+ margin: marginOverride,
73
+ grid,
74
+ axes,
75
+ legend,
76
+ tooltip,
77
+ interactions,
78
+ children,
79
+ title,
80
+ subtitle,
81
+ }: ChartProps) {
82
+ const chartId = useId();
83
+ const descId = `${chartId}-desc`;
84
+ const containerRef = useRef<HTMLDivElement>(null);
85
+ const svgRef = useRef<SVGSVGElement>(null);
86
+ const [containerWidth, setContainerWidth] = useState(0);
87
+ const pointerHandlers = useRef<Set<(e: ChartPointerEvent) => void>>(
88
+ new Set(),
89
+ );
90
+
91
+ useLayoutEffect(() => {
92
+ if (!containerRef.current) {
93
+ return;
94
+ }
95
+ const observer = new ResizeObserver(entries => {
96
+ const entry = entries[0];
97
+ if (entry) {
98
+ setContainerWidth(entry.contentRect.width);
99
+ }
100
+ });
101
+ observer.observe(containerRef.current);
102
+ return () => observer.disconnect();
103
+ }, []);
104
+
105
+ const margin = useMemo(
106
+ () => ({...DEFAULT_MARGIN, ...marginOverride}),
107
+ [marginOverride],
108
+ );
109
+ const innerWidth = Math.max(0, containerWidth - margin.left - margin.right);
110
+ const innerHeight = Math.max(0, height - margin.top - margin.bottom);
111
+
112
+ // ─── Layout pass ──────────────────────────────────────────────────────
113
+ const layout = useMemo(
114
+ () =>
115
+ computeLayout({
116
+ data,
117
+ xKey,
118
+ series,
119
+ width: innerWidth,
120
+ height: innerHeight,
121
+ }),
122
+ [data, xKey, series, innerWidth, innerHeight],
123
+ );
124
+
125
+ const seriesCtx = useMemo(
126
+ () => ({
127
+ data,
128
+ xKey,
129
+ xScale: layout.xScale,
130
+ yScale: layout.yScale,
131
+ width: innerWidth,
132
+ height: innerHeight,
133
+ }),
134
+ [data, xKey, layout, innerWidth, innerHeight],
135
+ );
136
+
137
+ // ─── Event dispatch ───────────────────────────────────────────────────
138
+ const onPointer = useCallback((handler: (e: ChartPointerEvent) => void) => {
139
+ pointerHandlers.current.add(handler);
140
+ return () => {
141
+ pointerHandlers.current.delete(handler);
142
+ };
143
+ }, []);
144
+
145
+ const dispatch = useCallback((e: ChartPointerEvent) => {
146
+ for (const handler of pointerHandlers.current) {
147
+ handler(e);
148
+ }
149
+ }, []);
150
+
151
+ const handlePointerMove = useCallback(
152
+ (e: React.PointerEvent<SVGRectElement>) => {
153
+ const svg = svgRef.current;
154
+ if (!svg) {
155
+ return;
156
+ }
157
+ const point = svg.createSVGPoint();
158
+ point.x = e.clientX;
159
+ point.y = e.clientY;
160
+ const ctm = e.currentTarget.getScreenCTM()?.inverse();
161
+ if (!ctm) {
162
+ return;
163
+ }
164
+ const cursor = point.matrixTransform(ctm);
165
+
166
+ // Find nearest point by x-distance only (full vertical column is the hover zone)
167
+ let nearest: ChartPointerEvent['nearest'] = null;
168
+ let bestXDist = Infinity;
169
+ for (const [seriesKey, points] of layout.resolved) {
170
+ for (const p of points) {
171
+ const xDist = Math.abs(p.px - cursor.x);
172
+ if (xDist < bestXDist) {
173
+ bestXDist = xDist;
174
+ nearest = {...p, seriesKey};
175
+ }
176
+ }
177
+ }
178
+ dispatch({x: cursor.x, y: cursor.y, nearest, active: e.buttons > 0});
179
+ },
180
+ [layout.resolved, dispatch],
181
+ );
182
+
183
+ const handlePointerLeave = useCallback(() => {
184
+ dispatch({x: -1, y: -1, nearest: null, active: false});
185
+ }, [dispatch]);
186
+
187
+ // ─── Context for interactions + v1 chrome ─────────────────────────────
188
+ const ctx: ChartV2Context = useMemo(
189
+ () => ({
190
+ width: innerWidth,
191
+ height: innerHeight,
192
+ margin,
193
+ data,
194
+ xKey,
195
+ xScale: layout.xScale,
196
+ yScale: layout.yScale,
197
+ resolved: layout.resolved,
198
+ onPointer,
199
+ svgRef,
200
+ }),
201
+ [innerWidth, innerHeight, margin, data, xKey, layout, onPointer],
202
+ );
203
+
204
+ // Bridge v1 context for ChartGrid/Axis compatibility
205
+ const v1Ctx = useMemo(
206
+ () => ({
207
+ width: innerWidth,
208
+ height: innerHeight,
209
+ margin,
210
+ xKey,
211
+ data,
212
+ xScale: layout.xScale,
213
+ yScale: layout.yScale,
214
+ svgRef,
215
+ pointerToData: () => ({
216
+ x: null as string | number | null,
217
+ y: 0,
218
+ px: 0,
219
+ py: 0,
220
+ }),
221
+ pixelToData: (px: number, py: number) => ({
222
+ x: null as string | number | null,
223
+ y: 0,
224
+ px,
225
+ py,
226
+ }),
227
+ }),
228
+ [innerWidth, innerHeight, margin, xKey, data, layout, svgRef],
229
+ );
230
+
231
+ // ─── Legend ────────────────────────────────────────────────────────────
232
+ const legendConfig = legend === true ? {} : legend || null;
233
+
234
+ const legendElement = legendConfig ? (
235
+ <ChartLegend
236
+ items={legendConfig.items ?? deriveLegendItems(series)}
237
+ position={legendConfig.position}
238
+ alignment={legendConfig.alignment}
239
+ />
240
+ ) : null;
241
+
242
+ const legendPosition = legendConfig?.position ?? 'bottom';
243
+ const isLegendHorizontal =
244
+ legendPosition === 'start' || legendPosition === 'end';
245
+
246
+ // ─── Render ───────────────────────────────────────────────────────────
247
+ if (containerWidth === 0) {
248
+ return (
249
+ <div
250
+ ref={containerRef}
251
+ {...stylex.props(styles.container)}
252
+ style={{height}}
253
+ />
254
+ );
255
+ }
256
+
257
+ return (
258
+ <div ref={containerRef} {...stylex.props(styles.container)}>
259
+ {(title || subtitle) && (
260
+ <div {...stylex.props(styles.title)}>
261
+ {title && (
262
+ <Text type="body" weight="semibold" display="block">
263
+ {title}
264
+ </Text>
265
+ )}
266
+ {subtitle && (
267
+ <Text type="supporting" display="block">
268
+ {subtitle}
269
+ </Text>
270
+ )}
271
+ </div>
272
+ )}
273
+ <ChartV2Provider value={ctx}>
274
+ <ChartProvider value={v1Ctx}>
275
+ {legendConfig == null ? (
276
+ renderSvg()
277
+ ) : isLegendHorizontal ? (
278
+ <HStack gap={4}>
279
+ {legendPosition === 'start' && legendElement}
280
+ <div {...stylex.props(styles.chartArea)}>{renderSvg()}</div>
281
+ {legendPosition === 'end' && legendElement}
282
+ </HStack>
283
+ ) : (
284
+ <VStack gap={4}>
285
+ {legendPosition === 'top' && legendElement}
286
+ {renderSvg()}
287
+ {legendPosition === 'bottom' && legendElement}
288
+ </VStack>
289
+ )}
290
+ </ChartProvider>
291
+ </ChartV2Provider>
292
+ </div>
293
+ );
294
+
295
+ function renderSvg() {
296
+ return (
297
+ <svg
298
+ ref={svgRef}
299
+ width="100%"
300
+ height={height}
301
+ aria-label={title ?? undefined}
302
+ aria-describedby={subtitle ? descId : undefined}>
303
+ {title && <title>{title}</title>}
304
+ {subtitle && <desc id={descId}>{subtitle}</desc>}
305
+ <g transform={`translate(${margin.left},${margin.top})`}>
306
+ {/* 1. Grid */}
307
+ {grid}
308
+
309
+ {/* 2. Marks — each series renders itself */}
310
+ {series.map(s => {
311
+ const resolved = layout.resolved.get(s.key);
312
+ if (!resolved) {
313
+ return null;
314
+ }
315
+ return <g key={s.key}>{s.render(resolved, seriesCtx)}</g>;
316
+ })}
317
+
318
+ {/* 3. Axes */}
319
+ {axes}
320
+
321
+ {/* 4. Event capture + interactions */}
322
+ <rect
323
+ x={0}
324
+ y={0}
325
+ width={innerWidth}
326
+ height={innerHeight}
327
+ fill="transparent"
328
+ onPointerMove={handlePointerMove}
329
+ onPointerLeave={handlePointerLeave}
330
+ />
331
+ {interactions}
332
+
333
+ {/* 5. Tooltip — declarative shortcut. For full control, render
334
+ <ChartTooltip> directly via the `children` slot. */}
335
+ {tooltip && (
336
+ <ChartTooltip
337
+ series={series}
338
+ {...(tooltip === true ? {} : tooltip)}
339
+ />
340
+ )}
341
+
342
+ {/* 6. Escape hatch */}
343
+ {children}
344
+ </g>
345
+ </svg>
346
+ );
347
+ }
348
+ }
@@ -0,0 +1,209 @@
1
+ // Copyright (c) Meta Platforms, Inc. and affiliates.
2
+
3
+ /**
4
+ * @file ChartAxis.tsx (v2)
5
+ * @output Renders an axis (top, right, bottom, left) using the chart's scales
6
+ * @position Child of Chart v2; reads scales from chart context
7
+ *
8
+ * The axis edge line and tick marks are independently toggleable so callers
9
+ * can compose: line-only, line + ticks, or line + ticks + grid (paired with
10
+ * `<ChartGrid>`). To stay consistent with most charts, the bottom axis
11
+ * draws its edge line by default and other positions don't.
12
+ *
13
+ * Ticks use CSS transitions for smooth sliding during streaming updates.
14
+ */
15
+
16
+ import {useMemo} from 'react';
17
+ import * as stylex from '@stylexjs/stylex';
18
+ import {colorVars} from '@astryxdesign/core/theme/tokens.stylex';
19
+ import {useChart} from '../Chart/ChartContext';
20
+ import {isBandScale} from '../Chart/utils';
21
+ import type {ScaleLinear, ScaleTime} from 'd3-scale';
22
+
23
+ export interface ChartAxisProps {
24
+ /** Which edge to render the axis on */
25
+ position: 'top' | 'right' | 'bottom' | 'left';
26
+ /** Number of ticks (approximate — d3 decides final count) */
27
+ tickCount?: number;
28
+ /** Maximum number of tick labels to show. Labels are evenly skipped when exceeded. */
29
+ maxTicks?: number;
30
+ /** Custom tick formatter */
31
+ tickFormat?: (value: unknown) => string;
32
+ /** Truncate labels to this many characters (appends "\u2026"). */
33
+ truncate?: number;
34
+ /** Enable smooth transitions for streaming (default: true) */
35
+ animated?: boolean;
36
+ /**
37
+ * Show the axis edge line. Defaults to `true` for `position="bottom"`,
38
+ * `false` otherwise. Forced to `true` when `showTicks` is enabled.
39
+ * Pair with `<ChartGrid vertical />` and pass `showAxisLine` on the
40
+ * corresponding side axis to keep the visual edge grounded.
41
+ */
42
+ showAxisLine?: boolean;
43
+ /** Show perpendicular tick marks at each tick label. Default: `false`. */
44
+ showTicks?: boolean;
45
+ }
46
+
47
+ const styles = stylex.create({
48
+ axisLine: {
49
+ stroke: colorVars['--color-text-primary'],
50
+ strokeWidth: 1,
51
+ },
52
+ tickMark: {
53
+ stroke: colorVars['--color-text-primary'],
54
+ strokeWidth: 1,
55
+ },
56
+ });
57
+
58
+ const TICK_SIZE = 6;
59
+
60
+ /**
61
+ * Chart axis. Always draws tick labels; the axis edge line and tick marks
62
+ * are independently toggleable. Pair with `<ChartGrid>` for grid lines.
63
+ *
64
+ * @example
65
+ * ```
66
+ * <ChartAxis position="bottom" /> // edge line + labels
67
+ * <ChartAxis position="left" /> // labels only (no edge line)
68
+ * <ChartAxis position="left" showAxisLine showTicks />
69
+ * ```
70
+ */
71
+ export function ChartAxis({
72
+ position,
73
+ tickCount = 5,
74
+ maxTicks,
75
+ tickFormat,
76
+ truncate,
77
+ animated = true,
78
+ showAxisLine = position === 'bottom',
79
+ showTicks = false,
80
+ }: ChartAxisProps) {
81
+ // Tick marks need an axis line to anchor against; force it on when ticks
82
+ // are enabled so the two visuals stay coherent.
83
+ const renderAxisLine = showAxisLine || showTicks;
84
+ const {width, height, xScale, yScale} = useChart();
85
+
86
+ const isHorizontal = position === 'top' || position === 'bottom';
87
+ const scale = isHorizontal ? xScale : yScale;
88
+
89
+ const ticks = useMemo(() => {
90
+ let allTicks: {value: unknown; offset: number}[];
91
+ if (isBandScale(scale)) {
92
+ allTicks = scale.domain().map(d => ({
93
+ value: d,
94
+ offset: (scale(d) ?? 0) + scale.bandwidth() / 2,
95
+ }));
96
+ } else {
97
+ const linearScale = scale as
98
+ | ScaleLinear<number, number>
99
+ | ScaleTime<number, number>;
100
+ allTicks = linearScale.ticks(tickCount).map(d => ({
101
+ value: d,
102
+ offset: linearScale(d as number & Date),
103
+ }));
104
+ }
105
+
106
+ // Auto-skip: show every Nth label if maxTicks is exceeded
107
+ if (maxTicks && allTicks.length > maxTicks) {
108
+ const step = Math.ceil(allTicks.length / maxTicks);
109
+ allTicks = allTicks.filter((_, i) => i % step === 0);
110
+ }
111
+
112
+ return allTicks;
113
+ }, [scale, tickCount, maxTicks]);
114
+
115
+ const transform =
116
+ position === 'bottom'
117
+ ? `translate(0,${height})`
118
+ : position === 'right'
119
+ ? `translate(${width},0)`
120
+ : undefined;
121
+
122
+ // For the bottom axis, draw the axis line at y=0 when the domain spans
123
+ // negative values (so the axis line still represents zero, not the chart edge).
124
+ const axisLineY = (() => {
125
+ if (position !== 'bottom') {
126
+ return 0;
127
+ }
128
+ const domain = yScale.domain();
129
+ if (domain[0] < 0 && domain[1] > 0) {
130
+ return yScale(0) - height;
131
+ }
132
+ return 0;
133
+ })();
134
+
135
+ const baseFormat = tickFormat ?? String;
136
+ const format = truncate
137
+ ? (value: unknown) => {
138
+ const str = baseFormat(value);
139
+ return str.length > truncate ? str.slice(0, truncate) + '\u2026' : str;
140
+ }
141
+ : baseFormat;
142
+
143
+ const tickTransition = animated
144
+ ? 'transform 150ms linear, opacity 150ms ease'
145
+ : undefined;
146
+
147
+ return (
148
+ <g transform={transform}>
149
+ {renderAxisLine && (
150
+ <line
151
+ x1={0}
152
+ x2={isHorizontal ? width : 0}
153
+ y1={isHorizontal ? axisLineY : 0}
154
+ y2={isHorizontal ? axisLineY : height}
155
+ {...stylex.props(styles.axisLine)}
156
+ />
157
+ )}
158
+ {ticks.map(({value, offset}) => {
159
+ const label = format(value);
160
+ const isVisible = isHorizontal
161
+ ? offset >= -10 && offset <= width + 10
162
+ : offset >= -10 && offset <= height + 10;
163
+
164
+ if (isHorizontal) {
165
+ const y = position === 'bottom' ? TICK_SIZE : -TICK_SIZE;
166
+ return (
167
+ <g
168
+ key={label}
169
+ style={{
170
+ transform: `translateX(${offset}px)`,
171
+ transition: tickTransition,
172
+ opacity: isVisible ? 1 : 0,
173
+ }}>
174
+ {showTicks && <line y2={y} {...stylex.props(styles.tickMark)} />}
175
+ <text
176
+ y={position === 'bottom' ? TICK_SIZE + 12 : -(TICK_SIZE + 4)}
177
+ textAnchor="middle"
178
+ fill="var(--color-text-secondary)"
179
+ fontSize={12}>
180
+ {label}
181
+ </text>
182
+ </g>
183
+ );
184
+ }
185
+ // Vertical axis
186
+ const x = position === 'left' ? -TICK_SIZE : TICK_SIZE;
187
+ return (
188
+ <g
189
+ key={label}
190
+ style={{
191
+ transform: `translateY(${offset}px)`,
192
+ transition: tickTransition,
193
+ opacity: isVisible ? 1 : 0,
194
+ }}>
195
+ {showTicks && <line x2={x} {...stylex.props(styles.tickMark)} />}
196
+ <text
197
+ x={position === 'left' ? -(TICK_SIZE + 4) : TICK_SIZE + 4}
198
+ dy="0.32em"
199
+ textAnchor={position === 'left' ? 'end' : 'start'}
200
+ fill="var(--color-text-secondary)"
201
+ fontSize={12}>
202
+ {label}
203
+ </text>
204
+ </g>
205
+ );
206
+ })}
207
+ </g>
208
+ );
209
+ }
@@ -0,0 +1,99 @@
1
+ // Copyright (c) Meta Platforms, Inc. and affiliates.
2
+
3
+ /**
4
+ * @file ChartGrid.tsx (v2)
5
+ * @output Grid lines behind chart marks
6
+ * @position Child of Chart v2; reads scales from chart context
7
+ */
8
+
9
+ import {useMemo} from 'react';
10
+ import * as stylex from '@stylexjs/stylex';
11
+ import {colorVars} from '@astryxdesign/core/theme/tokens.stylex';
12
+ import {useChart} from '../Chart/ChartContext';
13
+ import {isBandScale} from '../Chart/utils';
14
+ import type {ScaleLinear, ScaleTime} from 'd3-scale';
15
+
16
+ export interface ChartGridProps {
17
+ /** Show horizontal grid lines. Default: `true`. */
18
+ horizontal?: boolean;
19
+ /** Show vertical grid lines. Default: `false`. */
20
+ vertical?: boolean;
21
+ }
22
+
23
+ const styles = stylex.create({
24
+ gridLine: {
25
+ stroke: colorVars['--color-border-emphasized'],
26
+ strokeWidth: 1,
27
+ },
28
+ });
29
+
30
+ /**
31
+ * Grid lines behind chart marks.
32
+ *
33
+ * Pair with `<ChartAxis>` so users always see an axis line beside the
34
+ * grid — the components are designed to be used together.
35
+ *
36
+ * @example
37
+ * ```
38
+ * <ChartGrid /> // horizontal grid lines (default)
39
+ * <ChartGrid horizontal vertical />
40
+ * ```
41
+ */
42
+ export function ChartGrid({
43
+ horizontal = true,
44
+ vertical = false,
45
+ }: ChartGridProps) {
46
+ const {width, height, xScale, yScale} = useChart();
47
+
48
+ // Skip the y=0 line when emphasizing it via the axis. Without this we'd
49
+ // double-draw on top of the axis line.
50
+ const hLines = useMemo(() => {
51
+ if (!horizontal) {
52
+ return [];
53
+ }
54
+ return yScale
55
+ .ticks(5)
56
+ .filter(tick => tick !== 0)
57
+ .map(tick => yScale(tick));
58
+ }, [horizontal, yScale]);
59
+
60
+ const vLines = useMemo(() => {
61
+ if (!vertical) {
62
+ return [];
63
+ }
64
+ if (isBandScale(xScale)) {
65
+ return xScale
66
+ .domain()
67
+ .map(d => (xScale(d) ?? 0) + xScale.bandwidth() / 2);
68
+ }
69
+ const linear = xScale as
70
+ | ScaleLinear<number, number>
71
+ | ScaleTime<number, number>;
72
+ return linear.ticks(5).map(d => linear(d as number & Date));
73
+ }, [vertical, xScale]);
74
+
75
+ return (
76
+ <g>
77
+ {hLines.map(y => (
78
+ <line
79
+ key={`h-${y}`}
80
+ x1={0}
81
+ x2={width}
82
+ y1={y}
83
+ y2={y}
84
+ {...stylex.props(styles.gridLine)}
85
+ />
86
+ ))}
87
+ {vLines.map(x => (
88
+ <line
89
+ key={`v-${x}`}
90
+ x1={x}
91
+ x2={x}
92
+ y1={0}
93
+ y2={height}
94
+ {...stylex.props(styles.gridLine)}
95
+ />
96
+ ))}
97
+ </g>
98
+ );
99
+ }