@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,189 @@
1
+ // Copyright (c) Meta Platforms, Inc. and affiliates.
2
+
3
+ /**
4
+ * @file ChartStreamGL.tsx
5
+ * @output WebGL streaming time-series line — ring buffer, canvas outside SVG
6
+ * @position Child of Chart; uses the chart's xScale/yScale for mapping
7
+ *
8
+ * Y-axis and x-axis domains are controlled by Chart.
9
+ * For streaming, the parent should update xDomain as new data arrives.
10
+ */
11
+
12
+ import {useRef, useEffect, useImperativeHandle, useCallback} from 'react';
13
+ import type {Ref} from 'react';
14
+ import {mergeRefs} from '@astryxdesign/core/utils';
15
+ import {useChart} from './ChartContext';
16
+ import {
17
+ hexToGL,
18
+ getWebGLContext,
19
+ setupGLState,
20
+ sizeCanvas,
21
+ mountCanvasOverSVG,
22
+ createProgram,
23
+ } from './webgl';
24
+
25
+ export interface ChartStreamGLProps {
26
+ /** Ref forwarded to the SVG marker element used to position the canvas. */
27
+ ref?: Ref<SVGGElement>;
28
+ /** Imperative handle ref for streaming data control. */
29
+ handleRef?: Ref<ChartStreamGLHandle>;
30
+ color: string;
31
+ bufferSize?: number;
32
+ lineWidth?: number;
33
+ opacity?: number;
34
+ }
35
+
36
+ export interface ChartStreamGLHandle {
37
+ push(x: number, y: number): void;
38
+ clear(): void;
39
+ }
40
+
41
+ const VERT = `
42
+ attribute vec2 a_position;
43
+ uniform vec2 u_resolution;
44
+ void main() {
45
+ vec2 clip = (a_position / u_resolution) * 2.0 - 1.0;
46
+ gl_Position = vec4(clip.x, -clip.y, 0.0, 1.0);
47
+ }
48
+ `;
49
+
50
+ const FRAG = `
51
+ precision mediump float;
52
+ uniform vec3 u_color;
53
+ uniform float u_opacity;
54
+ void main() {
55
+ float a = u_opacity;
56
+ gl_FragColor = vec4(u_color * a, a);
57
+ }
58
+ `;
59
+
60
+ export function ChartStreamGL({
61
+ ref,
62
+ handleRef,
63
+ color,
64
+ bufferSize = 500,
65
+ lineWidth = 2,
66
+ opacity = 1,
67
+ }: ChartStreamGLProps) {
68
+ const {width, height, xScale, yScale} = useChart();
69
+ const canvasRef = useRef<HTMLCanvasElement | null>(null);
70
+ const glRef = useRef<WebGLRenderingContext | null>(null);
71
+ const programRef = useRef<WebGLProgram | null>(null);
72
+ const bufRef = useRef<WebGLBuffer | null>(null);
73
+ const markerRef = useRef<SVGGElement>(null);
74
+
75
+ const ring = useRef({
76
+ data: new Float32Array(bufferSize * 2),
77
+ head: 0,
78
+ count: 0,
79
+ });
80
+
81
+ // Mount canvas outside SVG
82
+ useEffect(() => {
83
+ const marker = markerRef.current;
84
+ if (!marker) {
85
+ return;
86
+ }
87
+ if (!canvasRef.current) {
88
+ canvasRef.current = document.createElement('canvas');
89
+ }
90
+ return mountCanvasOverSVG(marker, canvasRef.current, width, height);
91
+ }, [width, height]);
92
+
93
+ // Size canvas
94
+ useEffect(() => {
95
+ const canvas = canvasRef.current;
96
+ if (!canvas || width <= 0 || height <= 0) {
97
+ return;
98
+ }
99
+ sizeCanvas(canvas, width, height);
100
+ }, [width, height]);
101
+
102
+ const draw = useCallback(() => {
103
+ const canvas = canvasRef.current;
104
+ if (!canvas) {
105
+ return;
106
+ }
107
+ if (!glRef.current) {
108
+ glRef.current = getWebGLContext(canvas);
109
+ }
110
+ const gl = glRef.current;
111
+ if (!gl) {
112
+ return;
113
+ }
114
+
115
+ if (!programRef.current) {
116
+ programRef.current = createProgram(gl, VERT, FRAG);
117
+ }
118
+ const program = programRef.current;
119
+ if (!program) {
120
+ return;
121
+ }
122
+
123
+ if (!bufRef.current) {
124
+ bufRef.current = gl.createBuffer();
125
+ }
126
+
127
+ const {data: ringData, head, count} = ring.current;
128
+ if (count < 2) {
129
+ return;
130
+ }
131
+
132
+ const linearX = xScale as (v: number) => number;
133
+ const drawBuf = new Float32Array(count * 2);
134
+ for (let i = 0; i < count; i++) {
135
+ const idx = ((head - count + i + bufferSize) % bufferSize) * 2;
136
+ drawBuf[i * 2] = linearX(ringData[idx]);
137
+ drawBuf[i * 2 + 1] = yScale(ringData[idx + 1]);
138
+ }
139
+
140
+ gl.viewport(0, 0, canvas.width, canvas.height);
141
+ setupGLState(gl);
142
+ gl.useProgram(program);
143
+
144
+ gl.bindBuffer(gl.ARRAY_BUFFER, bufRef.current);
145
+ gl.bufferData(gl.ARRAY_BUFFER, drawBuf, gl.DYNAMIC_DRAW);
146
+
147
+ const aPos = gl.getAttribLocation(program, 'a_position');
148
+ gl.enableVertexAttribArray(aPos);
149
+ gl.vertexAttribPointer(aPos, 2, gl.FLOAT, false, 0, 0);
150
+
151
+ const [r, g, b] = hexToGL(color);
152
+ gl.uniform2f(gl.getUniformLocation(program, 'u_resolution'), width, height);
153
+ gl.uniform3f(gl.getUniformLocation(program, 'u_color'), r, g, b);
154
+ gl.uniform1f(gl.getUniformLocation(program, 'u_opacity'), opacity);
155
+
156
+ gl.lineWidth(lineWidth);
157
+ gl.drawArrays(gl.LINE_STRIP, 0, count);
158
+ }, [width, height, color, lineWidth, opacity, bufferSize, xScale, yScale]);
159
+
160
+ useImperativeHandle(
161
+ handleRef,
162
+ () => ({
163
+ push(x: number, y: number) {
164
+ const r = ring.current;
165
+ const idx = r.head * 2;
166
+ r.data[idx] = x;
167
+ r.data[idx + 1] = y;
168
+ r.head = (r.head + 1) % bufferSize;
169
+ r.count = Math.min(r.count + 1, bufferSize);
170
+ draw();
171
+ },
172
+ clear() {
173
+ ring.current.head = 0;
174
+ ring.current.count = 0;
175
+ const gl = glRef.current;
176
+ if (gl) {
177
+ gl.clearColor(0, 0, 0, 0);
178
+ gl.clear(gl.COLOR_BUFFER_BIT);
179
+ }
180
+ },
181
+ }),
182
+ [bufferSize, draw],
183
+ );
184
+
185
+ if (width <= 0 || height <= 0) {
186
+ return null;
187
+ }
188
+ return <g ref={mergeRefs(markerRef, ref)} />;
189
+ }
@@ -0,0 +1,451 @@
1
+ // Copyright (c) Meta Platforms, Inc. and affiliates.
2
+
3
+ /**
4
+ * @file ChartTooltip.tsx
5
+ * @output Hover tooltip with optional crosshair lines, rendered in the top layer
6
+ * @position Child of Chart; reads scales from context
7
+ *
8
+ * Combines tooltip content and crosshair display into one component.
9
+ * Uses the Astryx Layer system (Popover API) so the tooltip renders above
10
+ * all other content — portaled to the chart container div (outside SVG).
11
+ */
12
+
13
+ 'use client';
14
+
15
+ import {useState, useCallback, useRef, type ReactNode} from 'react';
16
+ import {createPortal} from 'react-dom';
17
+ import {useLayer} from '@astryxdesign/core/Layer';
18
+ import {useChart} from './ChartContext';
19
+ import {xPixel} from './utils';
20
+ import type {DataPoint} from './types';
21
+
22
+ /**
23
+ * Crosshair mode:
24
+ * - `'x'` — vertical line only (most common for time series)
25
+ * - `'y'` — horizontal line only
26
+ * - `'xy'` — both axes
27
+ * - `false` — no crosshair lines
28
+ */
29
+ export type ChartCrosshairMode = 'x' | 'y' | 'xy' | false;
30
+
31
+ export interface ChartTooltipProps {
32
+ /**
33
+ * Custom render function for tooltip content.
34
+ * Receives the nearest data point and its index.
35
+ * Return `null` to hide the tooltip card while keeping crosshair visible.
36
+ *
37
+ * @default Renders all keys as "key: value" lines
38
+ */
39
+ render?: (datum: Record<string, unknown>, index: number) => ReactNode;
40
+
41
+ /**
42
+ * Crosshair line display mode.
43
+ * - `'x'` — vertical crosshair line (default)
44
+ * - `'y'` — horizontal crosshair line
45
+ * - `'xy'` — both axes
46
+ * - `false` — no crosshair lines, tooltip only
47
+ *
48
+ * @default 'x'
49
+ */
50
+ crosshair?: ChartCrosshairMode;
51
+
52
+ /**
53
+ * Whether to show axis value labels on the crosshair lines.
54
+ * Only relevant when `crosshair` is not `false`.
55
+ *
56
+ * @default false
57
+ */
58
+ crosshairLabels?: boolean;
59
+
60
+ /**
61
+ * Whether to snap to the nearest data point (true) or follow
62
+ * the pointer freely (false). Snap mode finds the closest datum
63
+ * by x-distance and positions the tooltip at that point.
64
+ *
65
+ * @default true
66
+ */
67
+ snap?: boolean;
68
+
69
+ /**
70
+ * Format function for x-axis crosshair label.
71
+ */
72
+ xFormat?: (value: number | string | null) => string;
73
+
74
+ /**
75
+ * Format function for y-axis crosshair label.
76
+ */
77
+ yFormat?: (value: number) => string;
78
+
79
+ /**
80
+ * Color for crosshair lines.
81
+ * @default 'var(--color-border-emphasized)'
82
+ */
83
+ crosshairColor?: string;
84
+
85
+ /**
86
+ * Whether to show a dot indicator at the snapped data point.
87
+ * @default true
88
+ */
89
+ dot?: boolean;
90
+ }
91
+
92
+ /**
93
+ * Chart tooltip with integrated crosshair.
94
+ *
95
+ * Renders crosshair lines within the SVG and a floating tooltip card
96
+ * in the top layer (via Popover API, portaled outside the SVG).
97
+ *
98
+ * @example
99
+ * ```tsx
100
+ * // Default: vertical crosshair + tooltip card
101
+ * <ChartTooltip />
102
+ *
103
+ * // Both axes, with labels
104
+ * <ChartTooltip crosshair="xy" crosshairLabels />
105
+ *
106
+ * // Tooltip only, no crosshair lines
107
+ * <ChartTooltip crosshair={false} />
108
+ *
109
+ * // Custom render
110
+ * <ChartTooltip render={(d) => <span>{d.month}: ${d.revenue}</span>} />
111
+ * ```
112
+ */
113
+ export function ChartTooltip({
114
+ render,
115
+ crosshair = 'x',
116
+ crosshairLabels = false,
117
+ snap = true,
118
+ xFormat,
119
+ yFormat,
120
+ crosshairColor = 'var(--color-border-emphasized)',
121
+ dot = true,
122
+ }: ChartTooltipProps) {
123
+ const {data, xKey, xScale, yScale, width, height, svgRef, pointerToData} =
124
+ useChart();
125
+
126
+ const [hoverState, setHoverState] = useState<{
127
+ index: number;
128
+ point: DataPoint;
129
+ } | null>(null);
130
+
131
+ // Screen-space coords for the tooltip popover
132
+ const [tooltipCoords, setTooltipCoords] = useState({x: 0, y: 0});
133
+ const layerContainerRef = useRef<HTMLElement | null>(null);
134
+ const active = useRef(false);
135
+
136
+ const layer = useLayer({mode: 'fixed'});
137
+
138
+ // Find nearest data point. Uses Euclidean distance for scatter (linear x)
139
+ // and x-only distance for categorical/time series (band x).
140
+ const findNearest = useCallback(
141
+ (px: number, py: number): {index: number; point: DataPoint} | null => {
142
+ if (data.length === 0) {
143
+ return null;
144
+ }
145
+
146
+ let closestIdx = 0;
147
+ let minDist = Infinity;
148
+
149
+ // Determine y keys (all numeric keys that aren't xKey)
150
+ const yKeys =
151
+ data.length > 0
152
+ ? Object.keys(data[0]).filter(
153
+ k => k !== xKey && typeof data[0][k] === 'number',
154
+ )
155
+ : [];
156
+
157
+ for (let i = 0; i < data.length; i++) {
158
+ const datum = data[i];
159
+ const datumPx = xPixel(datum, xKey, xScale);
160
+ const dx = datumPx - px;
161
+
162
+ // For each y key, compute distance to that point
163
+ let bestDistForDatum = Infinity;
164
+ let _bestYKey = yKeys[0];
165
+
166
+ for (const yk of yKeys) {
167
+ const yv = datum[yk];
168
+ if (typeof yv !== 'number') {
169
+ continue;
170
+ }
171
+ const datumPy = yScale(yv);
172
+ const dy = datumPy - py;
173
+ const dist = dx * dx + dy * dy; // squared euclidean
174
+ if (dist < bestDistForDatum) {
175
+ bestDistForDatum = dist;
176
+ _bestYKey = yk;
177
+ }
178
+ }
179
+
180
+ if (bestDistForDatum < minDist) {
181
+ minDist = bestDistForDatum;
182
+ closestIdx = i;
183
+ }
184
+ }
185
+
186
+ const datum = data[closestIdx];
187
+ const dpx = xPixel(datum, xKey, xScale);
188
+
189
+ // Use the y value of the closest key for this datum
190
+ let bestY = 0;
191
+ let bestPy = height / 2;
192
+ let bestDist = Infinity;
193
+ for (const yk of yKeys) {
194
+ const yv = datum[yk];
195
+ if (typeof yv !== 'number') {
196
+ continue;
197
+ }
198
+ const dpy = yScale(yv);
199
+ const dx = dpx - px;
200
+ const dy = dpy - py;
201
+ const dist = dx * dx + dy * dy;
202
+ if (dist < bestDist) {
203
+ bestDist = dist;
204
+ bestY = yv;
205
+ bestPy = dpy;
206
+ }
207
+ }
208
+
209
+ return {
210
+ index: closestIdx,
211
+ point: {
212
+ x: datum[xKey] as number | string | null,
213
+ y: bestY,
214
+ px: dpx,
215
+ py: bestPy,
216
+ },
217
+ };
218
+ },
219
+ [data, xKey, xScale, yScale, height],
220
+ );
221
+
222
+ const updateTooltip = useCallback(
223
+ (e: React.PointerEvent<SVGRectElement>) => {
224
+ const dataPoint = pointerToData(e);
225
+
226
+ const result = snap
227
+ ? findNearest(dataPoint.px, dataPoint.py)
228
+ : {index: -1, point: dataPoint};
229
+
230
+ if (result) {
231
+ setHoverState(result);
232
+ setTooltipCoords({x: e.clientX + 12, y: e.clientY - 8});
233
+ layer.show();
234
+ }
235
+
236
+ // Resolve portal container on first interaction
237
+ if (!layerContainerRef.current && svgRef.current) {
238
+ layerContainerRef.current = svgRef.current.parentElement;
239
+ }
240
+ },
241
+ [pointerToData, findNearest, snap, layer, svgRef],
242
+ );
243
+
244
+ // Touch: tap to show, drag to scrub
245
+ const handlePointerDown = useCallback(
246
+ (e: React.PointerEvent<SVGRectElement>) => {
247
+ if (e.pointerType !== 'mouse') {
248
+ e.preventDefault(); // blocks text selection on touch
249
+ active.current = true;
250
+ updateTooltip(e);
251
+ }
252
+ },
253
+ [updateTooltip],
254
+ );
255
+
256
+ // Mouse: hover to show. Touch: drag to scrub (only if active).
257
+ const handlePointerMove = useCallback(
258
+ (e: React.PointerEvent<SVGRectElement>) => {
259
+ if (e.pointerType !== 'mouse' && !active.current) {
260
+ return;
261
+ }
262
+ updateTooltip(e);
263
+ },
264
+ [updateTooltip],
265
+ );
266
+
267
+ // Touch: lift to dismiss
268
+ const handlePointerUp = useCallback(() => {
269
+ if (active.current) {
270
+ active.current = false;
271
+ setHoverState(null);
272
+ layer.hide();
273
+ }
274
+ }, [layer]);
275
+
276
+ const handlePointerLeave = useCallback(() => {
277
+ if (!active.current) {
278
+ setHoverState(null);
279
+ layer.hide();
280
+ }
281
+ }, [layer]);
282
+
283
+ const fmtX =
284
+ xFormat ??
285
+ ((v: number | string | null) =>
286
+ v != null ? (typeof v === 'number' ? v.toFixed(1) : String(v)) : '');
287
+ const fmtY = yFormat ?? ((v: number) => v.toFixed(1));
288
+
289
+ const datum = hoverState ? data[hoverState.index] : null;
290
+ const point = hoverState?.point ?? null;
291
+
292
+ const defaultRender = (d: Record<string, unknown>) => (
293
+ <div
294
+ style={{display: 'flex', flexDirection: 'column', gap: 2, fontSize: 12}}>
295
+ {Object.entries(d).map(([k, v]) => (
296
+ <div key={k}>
297
+ <span style={{color: 'var(--color-text-secondary)'}}>{k}:</span>{' '}
298
+ <span style={{fontWeight: 500}}>{String(v)}</span>
299
+ </div>
300
+ ))}
301
+ </div>
302
+ );
303
+
304
+ const showX = crosshair === 'x' || crosshair === 'xy';
305
+ const showY = crosshair === 'y' || crosshair === 'xy';
306
+
307
+ // Portal target: the chart's container div (parent of the SVG)
308
+ const portalTarget =
309
+ layerContainerRef.current ?? svgRef.current?.parentElement;
310
+
311
+ return (
312
+ <>
313
+ <g>
314
+ {/* Event capture rect — pointer events only, no capture/selection */}
315
+ <rect
316
+ x={0}
317
+ y={0}
318
+ width={width}
319
+ height={height}
320
+ fill="transparent"
321
+ style={{touchAction: 'none'}}
322
+ onPointerDown={handlePointerDown}
323
+ onPointerMove={handlePointerMove}
324
+ onPointerUp={handlePointerUp}
325
+ onPointerCancel={handlePointerUp}
326
+ onPointerLeave={handlePointerLeave}
327
+ />
328
+
329
+ {point && (
330
+ <>
331
+ {/* Vertical crosshair line */}
332
+ {showX && (
333
+ <line
334
+ x1={point.px}
335
+ x2={point.px}
336
+ y1={0}
337
+ y2={height}
338
+ stroke={crosshairColor}
339
+ strokeWidth={1}
340
+ strokeDasharray="3 3"
341
+ pointerEvents="none"
342
+ />
343
+ )}
344
+
345
+ {/* Horizontal crosshair line */}
346
+ {showY && (
347
+ <line
348
+ x1={0}
349
+ x2={width}
350
+ y1={point.py}
351
+ y2={point.py}
352
+ stroke={crosshairColor}
353
+ strokeWidth={1}
354
+ strokeDasharray="3 3"
355
+ pointerEvents="none"
356
+ />
357
+ )}
358
+
359
+ {/* Data point indicator dot */}
360
+ {dot && snap && hoverState && hoverState.index >= 0 && (
361
+ <circle
362
+ cx={point.px}
363
+ cy={point.py}
364
+ r={4}
365
+ fill="var(--color-background-surface)"
366
+ stroke={crosshairColor}
367
+ strokeWidth={2}
368
+ pointerEvents="none"
369
+ />
370
+ )}
371
+
372
+ {/* X-axis label */}
373
+ {crosshairLabels && showX && point.x != null && (
374
+ <g
375
+ transform={`translate(${point.px},${height})`}
376
+ pointerEvents="none">
377
+ <rect
378
+ x={-24}
379
+ y={2}
380
+ width={48}
381
+ height={16}
382
+ rx={4}
383
+ fill="var(--color-background-popover)"
384
+ stroke={crosshairColor}
385
+ strokeWidth={0.5}
386
+ />
387
+ <text
388
+ y={14}
389
+ textAnchor="middle"
390
+ fontSize={10}
391
+ fill="var(--color-text-primary)">
392
+ {fmtX(point.x)}
393
+ </text>
394
+ </g>
395
+ )}
396
+
397
+ {/* Y-axis label */}
398
+ {crosshairLabels && showY && (
399
+ <g transform={`translate(0,${point.py})`} pointerEvents="none">
400
+ <rect
401
+ x={-48}
402
+ y={-8}
403
+ width={44}
404
+ height={16}
405
+ rx={4}
406
+ fill="var(--color-background-popover)"
407
+ stroke={crosshairColor}
408
+ strokeWidth={0.5}
409
+ />
410
+ <text
411
+ x={-26}
412
+ dy="0.35em"
413
+ textAnchor="middle"
414
+ fontSize={10}
415
+ fill="var(--color-text-primary)">
416
+ {fmtY(point.y)}
417
+ </text>
418
+ </g>
419
+ )}
420
+ </>
421
+ )}
422
+ </g>
423
+
424
+ {/* Tooltip card — portaled outside SVG into chart container div */}
425
+ {portalTarget &&
426
+ createPortal(
427
+ layer.render(
428
+ datum && hoverState && hoverState.index >= 0 ? (
429
+ <div
430
+ style={{
431
+ background: 'var(--color-background-popover)',
432
+ border: '1px solid var(--color-border)',
433
+ borderRadius: 8,
434
+ padding: '8px 12px',
435
+ boxShadow: 'var(--shadow-med)',
436
+ whiteSpace: 'nowrap',
437
+ width: 'fit-content',
438
+ pointerEvents: 'none',
439
+ }}>
440
+ {render
441
+ ? render(datum, hoverState.index)
442
+ : defaultRender(datum)}
443
+ </div>
444
+ ) : null,
445
+ {x: tooltipCoords.x, y: tooltipCoords.y},
446
+ ),
447
+ portalTarget,
448
+ )}
449
+ </>
450
+ );
451
+ }