@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,220 @@
1
+ // Copyright (c) Meta Platforms, Inc. and affiliates.
2
+
3
+ /**
4
+ * @file SankeyChart.tsx
5
+ * @output Root Sankey container — computes layout and provides context
6
+ * @position Parent component; all Sankey marks are children
7
+ *
8
+ * When columns × minColumnWidth exceeds the container, the chart
9
+ * scrolls horizontally rather than squishing columns together.
10
+ */
11
+
12
+ import {
13
+ type ReactNode,
14
+ useMemo,
15
+ useRef,
16
+ useState,
17
+ useLayoutEffect,
18
+ } from 'react';
19
+ import {SankeyProvider} from './SankeyContext';
20
+ import {computeLayout} from './layout';
21
+ import type {SankeyNodeDatum, SankeyLinkDatum, SankeyColumn} from './types';
22
+
23
+ export interface SankeyChartProps {
24
+ /** Node definitions */
25
+ nodes: SankeyNodeDatum[];
26
+ /** Link definitions */
27
+ links: SankeyLinkDatum[];
28
+ /**
29
+ * Column definitions. Accepts either:
30
+ * - Simple: `string[][]` — arrays of node IDs per column
31
+ * - Rich: `SankeyColumnDef[]` — objects with `ids`, optional `label`
32
+ * - Mixed: any combination
33
+ *
34
+ * If omitted, columns are auto-detected via topological sort.
35
+ */
36
+ columns?: SankeyColumn[];
37
+ /** Chart height in px (default: 320) */
38
+ height?: number;
39
+ /** Node bar width in px (default: 20) */
40
+ nodeWidth?: number;
41
+ /** Vertical gap between sibling nodes (default: 14) */
42
+ nodeGap?: number;
43
+ /**
44
+ * Override all node bar colors with a single CSS color.
45
+ * Both SankeyNode and SankeyLabel read this from context
46
+ * so labels adapt their text color for contrast.
47
+ */
48
+ nodeColor?: string;
49
+ /**
50
+ * Minimum width per column in px (default: 160).
51
+ * When total min width exceeds the container, horizontal scrolling activates.
52
+ */
53
+ minColumnWidth?: number;
54
+ /** Chart contents */
55
+ children: ReactNode;
56
+ }
57
+
58
+ /** Resolve column count from raw column input or auto-detect from graph */
59
+ function resolveColumnCount(
60
+ columns: SankeyColumn[] | undefined,
61
+ nodes: SankeyNodeDatum[],
62
+ links: SankeyLinkDatum[],
63
+ ): number {
64
+ if (columns) {
65
+ return columns.length;
66
+ }
67
+ // Quick topological column count
68
+ const inDegree = new Map<string, number>();
69
+ const outEdges = new Map<string, string[]>();
70
+ nodes.forEach(n => {
71
+ inDegree.set(n.id, 0);
72
+ outEdges.set(n.id, []);
73
+ });
74
+ links.forEach(l => {
75
+ inDegree.set(l.target, (inDegree.get(l.target) || 0) + 1);
76
+ outEdges.get(l.source)?.push(l.target);
77
+ });
78
+ const colMap = new Map<string, number>();
79
+ const queue: string[] = [];
80
+ nodes.forEach(n => {
81
+ if (inDegree.get(n.id) === 0) {
82
+ queue.push(n.id);
83
+ colMap.set(n.id, 0);
84
+ }
85
+ });
86
+ while (queue.length) {
87
+ const id = queue.shift();
88
+ if (id == null) {
89
+ break;
90
+ }
91
+ const col = colMap.get(id) ?? 0;
92
+ for (const tgt of outEdges.get(id) || []) {
93
+ colMap.set(tgt, Math.max(colMap.get(tgt) || 0, col + 1));
94
+ inDegree.set(tgt, (inDegree.get(tgt) || 0) - 1);
95
+ if (inDegree.get(tgt) === 0) {
96
+ queue.push(tgt);
97
+ }
98
+ }
99
+ }
100
+ return Math.max(...Array.from(colMap.values()), 0) + 1;
101
+ }
102
+
103
+ /**
104
+ * Root component for Sankey/flow diagrams.
105
+ *
106
+ * Computes layout from nodes + links, exposes positions via context.
107
+ * Width is responsive but enforces minColumnWidth — scrolls when needed.
108
+ *
109
+ * @example
110
+ * ```tsx
111
+ * <SankeyChart
112
+ * nodes={nodes}
113
+ * links={links}
114
+ * columns={[
115
+ * {ids: ['a', 'b'], label: 'Source'},
116
+ * {ids: ['c', 'd'], label: 'Target'},
117
+ * ]}
118
+ * >
119
+ * <SankeyGrid />
120
+ * <SankeyLink />
121
+ * <SankeyNode />
122
+ * <SankeyLabel />
123
+ * </SankeyChart>
124
+ * ```
125
+ */
126
+ export function SankeyChart({
127
+ nodes,
128
+ links,
129
+ columns,
130
+ height = 320,
131
+ nodeWidth = 20,
132
+ nodeGap = 14,
133
+ nodeColor,
134
+ minColumnWidth = 160,
135
+ children,
136
+ }: SankeyChartProps) {
137
+ const containerRef = useRef<HTMLDivElement>(null);
138
+ const [containerWidth, setContainerWidth] = useState(0);
139
+
140
+ useLayoutEffect(() => {
141
+ const el = containerRef.current;
142
+ if (!el) {
143
+ return;
144
+ }
145
+ const ro = new ResizeObserver(entries => {
146
+ const w = entries[0]?.contentRect.width ?? 0;
147
+ setContainerWidth(w);
148
+ });
149
+ ro.observe(el);
150
+ return () => ro.disconnect();
151
+ }, []);
152
+
153
+ const colCount = useMemo(
154
+ () => resolveColumnCount(columns, nodes, links),
155
+ [columns, nodes, links],
156
+ );
157
+
158
+ const minWidth = colCount * minColumnWidth;
159
+ const chartWidth = Math.max(containerWidth, minWidth);
160
+ const needsScroll = containerWidth > 0 && chartWidth > containerWidth;
161
+
162
+ const layout = useMemo(() => {
163
+ if (containerWidth === 0) {
164
+ return null;
165
+ }
166
+ return computeLayout(nodes, links, {
167
+ width: chartWidth,
168
+ height,
169
+ nodeWidth,
170
+ nodeGap,
171
+ columns,
172
+ });
173
+ }, [
174
+ nodes,
175
+ links,
176
+ chartWidth,
177
+ height,
178
+ nodeWidth,
179
+ nodeGap,
180
+ columns,
181
+ containerWidth,
182
+ ]);
183
+
184
+ const ctx = useMemo(() => {
185
+ if (!layout) {
186
+ return null;
187
+ }
188
+ return {
189
+ nodes: layout.nodes,
190
+ links: layout.links,
191
+ columns: layout.columns,
192
+ width: chartWidth,
193
+ height,
194
+ valueScale: layout.valueScale,
195
+ maxValue: layout.maxValue,
196
+ nodeWidth,
197
+ nodeColor,
198
+ };
199
+ }, [layout, chartWidth, height, nodeWidth, nodeColor]);
200
+
201
+ return (
202
+ <div ref={containerRef} style={{width: '100%'}}>
203
+ {ctx && (
204
+ <div
205
+ style={
206
+ needsScroll ? {overflowX: 'auto', overflowY: 'hidden'} : undefined
207
+ }>
208
+ <svg
209
+ width={chartWidth}
210
+ height={height}
211
+ style={{overflow: 'visible', display: 'block'}}>
212
+ <SankeyProvider value={ctx}>{children}</SankeyProvider>
213
+ </svg>
214
+ </div>
215
+ )}
216
+ </div>
217
+ );
218
+ }
219
+
220
+ SankeyChart.displayName = 'SankeyChart';
@@ -0,0 +1,23 @@
1
+ // Copyright (c) Meta Platforms, Inc. and affiliates.
2
+
3
+ /**
4
+ * @file SankeyContext.ts
5
+ * @output React context for sharing Sankey layout between components
6
+ * @position Consumed by SankeyChart (provider) and all child components (consumers)
7
+ */
8
+
9
+ import {createContext, useContext} from 'react';
10
+ import type {SankeyContext} from './types';
11
+
12
+ const SankeyCtx = createContext<SankeyContext | null>(null);
13
+
14
+ export const SankeyProvider = SankeyCtx.Provider;
15
+
16
+ /** Access the sankey context. Throws if used outside <SankeyChart>. */
17
+ export function useSankey(): SankeyContext {
18
+ const ctx = useContext(SankeyCtx);
19
+ if (!ctx) {
20
+ throw new Error('Sankey components must be used inside <SankeyChart>');
21
+ }
22
+ return ctx;
23
+ }
@@ -0,0 +1,69 @@
1
+ // Copyright (c) Meta Platforms, Inc. and affiliates.
2
+
3
+ /**
4
+ * @file SankeyGrid.tsx
5
+ * @output Dashed vertical lines at each column + optional column headers
6
+ * @position Visual layer — structural guide behind the flow ribbons
7
+ */
8
+
9
+ import {useSankey} from './SankeyContext';
10
+
11
+ export interface SankeyGridProps {
12
+ /** Dash pattern (default: "4 4") */
13
+ dashArray?: string;
14
+ /** Stroke color (default: theme border) */
15
+ color?: string;
16
+ /** Opacity (default: 0.3) */
17
+ opacity?: number;
18
+ /** Show column header labels if defined (default: true) */
19
+ showHeaders?: boolean;
20
+ }
21
+
22
+ /**
23
+ * Vertical grid lines at each column position, with optional column headers.
24
+ *
25
+ * Place before SankeyLink so grid renders behind ribbons.
26
+ */
27
+ export function SankeyGrid({
28
+ dashArray = '4 4',
29
+ color,
30
+ opacity = 0.3,
31
+ showHeaders = true,
32
+ }: SankeyGridProps) {
33
+ const {columns, height, nodeWidth} = useSankey();
34
+
35
+ return (
36
+ <g>
37
+ {columns.map((col, i) => (
38
+ <g key={i}>
39
+ <line
40
+ x1={col.x + nodeWidth / 2}
41
+ x2={col.x + nodeWidth / 2}
42
+ y1={0}
43
+ y2={height}
44
+ stroke={color || 'var(--color-border, #d0d0d8)'}
45
+ strokeOpacity={opacity}
46
+ strokeDasharray={dashArray}
47
+ strokeWidth={1}
48
+ />
49
+ {showHeaders && col.label && (
50
+ <text
51
+ x={col.x + nodeWidth / 2}
52
+ y={height - 2}
53
+ textAnchor="middle"
54
+ style={{
55
+ font: '500 10px/1 system-ui',
56
+ fill: 'var(--color-text-secondary, #6e6e80)',
57
+ textTransform: 'uppercase',
58
+ letterSpacing: '0.04em',
59
+ }}>
60
+ {col.label}
61
+ </text>
62
+ )}
63
+ </g>
64
+ ))}
65
+ </g>
66
+ );
67
+ }
68
+
69
+ SankeyGrid.displayName = 'SankeyGrid';
@@ -0,0 +1,234 @@
1
+ // Copyright (c) Meta Platforms, Inc. and affiliates.
2
+
3
+ /**
4
+ * @file SankeyLabel.tsx
5
+ * @output Renders node labels — rotated on bar or beside it based on fit
6
+ * @position Visual layer — adapts placement for readability at every scale
7
+ *
8
+ * Two strategies based on available space:
9
+ * - Tall nodes: rotated -90° text directly on the bar (no background)
10
+ * - Short nodes: horizontal label beside the bar with surface pill
11
+ *
12
+ * Last-column labels anchor to the left to avoid clipping at the chart edge.
13
+ * Text on bars uses --color-on-dark/--color-on-light from MediaTheme.
14
+ */
15
+
16
+ import {useSankey} from './SankeyContext';
17
+ import type {SankeyNodeLayout} from './types';
18
+
19
+ export interface SankeyLabelProps {
20
+ /** Show percentage below the node (default: true) */
21
+ showPercent?: boolean;
22
+ /** Format function for the value (default: compact notation) */
23
+ formatValue?: (value: number) => string;
24
+ }
25
+
26
+ function defaultFormat(value: number): string {
27
+ if (value >= 10000) {
28
+ return Math.round(value / 1000) + 'k';
29
+ }
30
+ if (value >= 1000) {
31
+ return (value / 1000).toFixed(1) + 'k';
32
+ }
33
+ return value.toLocaleString();
34
+ }
35
+
36
+ /**
37
+ * On-surface text color. When a CSS color override is active, parse its
38
+ * perceived lightness. For oklch tuples, use the L channel directly.
39
+ */
40
+ function onSurfaceColor(
41
+ color: [number, number, number],
42
+ cssOverride?: string,
43
+ ): string {
44
+ if (cssOverride) {
45
+ // Quick heuristic: if the override looks dark, use on-dark
46
+ // Check for common dark patterns (#1, #0, rgb(0-80,...), black, etc.)
47
+ const c = cssOverride.toLowerCase().trim();
48
+ const isDark =
49
+ c === 'black' ||
50
+ /^#[0-3]/.test(c) ||
51
+ /^#.[0-3]/.test(c) ||
52
+ /^rgb\(\s*[0-7]\d?\s*,/.test(c);
53
+ return isDark
54
+ ? 'var(--color-on-dark, #fff)'
55
+ : 'var(--color-on-light, #000)';
56
+ }
57
+ return color[0] < 0.6
58
+ ? 'var(--color-on-dark, #fff)'
59
+ : 'var(--color-on-light, #000)';
60
+ }
61
+
62
+ export function SankeyLabel({
63
+ showPercent = true,
64
+ formatValue = defaultFormat,
65
+ }: SankeyLabelProps) {
66
+ const {nodes, columns, maxValue, height, nodeWidth, nodeColor} = useSankey();
67
+ const lastColumn = columns.length - 1;
68
+
69
+ return (
70
+ <g>
71
+ {nodes.map(node => {
72
+ const pct = (node.value / maxValue) * 100;
73
+ const pctStr = pct >= 10 ? Math.round(pct) + '%' : pct.toFixed(1) + '%';
74
+ const formatted = formatValue(node.value);
75
+ const text = `${node.label} = ${formatted}`;
76
+
77
+ const textWidth = text.length * 6.5;
78
+ const fitsRotated = node.height >= textWidth + 8;
79
+
80
+ if (fitsRotated) {
81
+ return (
82
+ <RotatedLabel
83
+ key={node.id}
84
+ node={node}
85
+ nodeWidth={nodeWidth}
86
+ nodeColor={nodeColor}
87
+ text={text}
88
+ pctStr={pctStr}
89
+ showPercent={showPercent}
90
+ height={height}
91
+ />
92
+ );
93
+ }
94
+
95
+ return (
96
+ <BesideLabel
97
+ key={node.id}
98
+ node={node}
99
+ nodeWidth={nodeWidth}
100
+ text={text}
101
+ pctStr={pctStr}
102
+ showPercent={showPercent}
103
+ height={height}
104
+ isLastColumn={node.column === lastColumn}
105
+ />
106
+ );
107
+ })}
108
+ </g>
109
+ );
110
+ }
111
+
112
+ /** Tall bars: rotated text directly on the bar, no background */
113
+ function RotatedLabel({
114
+ node,
115
+ nodeWidth,
116
+ nodeColor,
117
+ text,
118
+ pctStr,
119
+ showPercent,
120
+ height,
121
+ }: {
122
+ node: SankeyNodeLayout;
123
+ nodeWidth: number;
124
+ nodeColor?: string;
125
+ text: string;
126
+ pctStr: string;
127
+ showPercent: boolean;
128
+ height: number;
129
+ }) {
130
+ const cx = node.x + nodeWidth / 2;
131
+ const cy = node.y + node.height / 2;
132
+
133
+ return (
134
+ <g>
135
+ <g transform={`translate(${cx}, ${cy}) rotate(-90)`}>
136
+ <text
137
+ x={0}
138
+ y={0}
139
+ textAnchor="middle"
140
+ dominantBaseline="central"
141
+ style={{
142
+ font: '600 10px/1 system-ui',
143
+ fill: onSurfaceColor(node.color, nodeColor),
144
+ letterSpacing: '-0.01em',
145
+ }}>
146
+ {text}
147
+ </text>
148
+ </g>
149
+ {showPercent && node.column > 0 && (
150
+ <text
151
+ x={cx}
152
+ y={Math.min(height - 2, node.y + node.height + 12)}
153
+ textAnchor="middle"
154
+ style={{
155
+ font: '500 9px/1 system-ui',
156
+ fill: 'var(--color-text-tertiary, #8e8ea0)',
157
+ }}>
158
+ {pctStr}
159
+ </text>
160
+ )}
161
+ </g>
162
+ );
163
+ }
164
+
165
+ /**
166
+ * Short bars: label beside the node with surface pill.
167
+ * Last column labels go to the left to avoid clipping.
168
+ */
169
+ function BesideLabel({
170
+ node,
171
+ nodeWidth,
172
+ text,
173
+ pctStr,
174
+ showPercent,
175
+ height,
176
+ isLastColumn,
177
+ }: {
178
+ node: SankeyNodeLayout;
179
+ nodeWidth: number;
180
+ text: string;
181
+ pctStr: string;
182
+ showPercent: boolean;
183
+ height: number;
184
+ isLastColumn: boolean;
185
+ }) {
186
+ const cx = node.x + nodeWidth / 2;
187
+ const cy = node.y + node.height / 2;
188
+ const pillW = text.length * 6 + 10;
189
+ const pillH = 16;
190
+
191
+ const labelX = isLastColumn ? node.x - 6 : node.x + nodeWidth + 6;
192
+ const pillX = isLastColumn ? labelX - pillW + 4 : labelX - 4;
193
+ const textAnchor = isLastColumn ? 'end' : 'start';
194
+
195
+ return (
196
+ <g>
197
+ <rect
198
+ x={pillX}
199
+ y={cy - pillH / 2}
200
+ width={pillW}
201
+ height={pillH}
202
+ rx={3}
203
+ fill="var(--color-background-surface, #fff)"
204
+ fillOpacity={0.9}
205
+ />
206
+ <text
207
+ x={labelX}
208
+ y={cy}
209
+ textAnchor={textAnchor}
210
+ dominantBaseline="central"
211
+ style={{
212
+ font: '600 10px/1 system-ui',
213
+ fill: 'var(--color-text-primary, #1c1c1e)',
214
+ letterSpacing: '-0.01em',
215
+ }}>
216
+ {text}
217
+ </text>
218
+ {showPercent && node.column > 0 && (
219
+ <text
220
+ x={cx}
221
+ y={Math.min(height - 2, node.y + node.height + 12)}
222
+ textAnchor="middle"
223
+ style={{
224
+ font: '500 9px/1 system-ui',
225
+ fill: 'var(--color-text-tertiary, #8e8ea0)',
226
+ }}>
227
+ {pctStr}
228
+ </text>
229
+ )}
230
+ </g>
231
+ );
232
+ }
233
+
234
+ SankeyLabel.displayName = 'SankeyLabel';
@@ -0,0 +1,167 @@
1
+ // Copyright (c) Meta Platforms, Inc. and affiliates.
2
+
3
+ /**
4
+ * @file SankeyLink.tsx
5
+ * @output Renders flow ribbons with configurable color modes
6
+ * @position Visual layer — the colorful flowing areas between nodes
7
+ *
8
+ * Color modes: flat CSS string, 'source', 'target', 'gradient',
9
+ * or {gradient: bias} for leaned transitions.
10
+ */
11
+
12
+ import {useSankey} from './SankeyContext';
13
+ import type {SankeyLinkLayout} from './types';
14
+
15
+ /**
16
+ * Link color mode:
17
+ * - `'gradient'` — even transition from source to target color
18
+ * - `'source'` — each link uses its source node's color
19
+ * - `'target'` — each link uses its target node's color
20
+ * - `{gradient: number}` — biased gradient (0–1). 0.2 = source-leaned, 0.8 = target-leaned
21
+ * - `string` — any CSS color for flat uniform fill
22
+ */
23
+ export type SankeyLinkColor =
24
+ | 'gradient'
25
+ | 'source'
26
+ | 'target'
27
+ | {gradient: number}
28
+ | (string & {});
29
+
30
+ export interface SankeyLinkProps {
31
+ /** Link coloring mode (default: 'gradient') */
32
+ color?: SankeyLinkColor;
33
+ /** Opacity of the link fills (default: 0.7) */
34
+ opacity?: number;
35
+ /** Bezier tension — 0 is straight, 1 is maximum curve (default: 0.5) */
36
+ tension?: number;
37
+ }
38
+
39
+ function oklch(c: [number, number, number], alpha: number): string {
40
+ return `oklch(${c[0]} ${c[1]} ${c[2]} / ${alpha})`;
41
+ }
42
+
43
+ type ResolvedMode =
44
+ | {type: 'flat'; value: string}
45
+ | {type: 'source'}
46
+ | {type: 'target'}
47
+ | {type: 'gradient'; bias: number};
48
+
49
+ function resolveColor(color: SankeyLinkColor): ResolvedMode {
50
+ if (typeof color === 'object' && 'gradient' in color) {
51
+ return {type: 'gradient', bias: color.gradient};
52
+ }
53
+ if (color === 'gradient') {
54
+ return {type: 'gradient', bias: 0.5};
55
+ }
56
+ if (color === 'source') {
57
+ return {type: 'source'};
58
+ }
59
+ if (color === 'target') {
60
+ return {type: 'target'};
61
+ }
62
+ return {type: 'flat', value: color};
63
+ }
64
+
65
+ /**
66
+ * Renders all link ribbons in the Sankey chart.
67
+ *
68
+ * Place before SankeyNode so nodes render on top.
69
+ */
70
+ export function SankeyLink({
71
+ color = 'gradient',
72
+ opacity = 0.7,
73
+ tension = 0.5,
74
+ }: SankeyLinkProps) {
75
+ const {links} = useSankey();
76
+ const mode = resolveColor(color);
77
+
78
+ return (
79
+ <g>
80
+ {mode.type === 'gradient' && (
81
+ <defs>
82
+ {links.map((link, i) => (
83
+ <GradientDef
84
+ key={i}
85
+ index={i}
86
+ link={link}
87
+ opacity={opacity}
88
+ bias={mode.bias}
89
+ />
90
+ ))}
91
+ </defs>
92
+ )}
93
+ {links.map((link, i) => {
94
+ const sx = link.source.x + link.source.width;
95
+ const tx = link.target.x;
96
+ const sy = link.sourceY;
97
+ const ty = link.targetY;
98
+ const lh = link.height;
99
+ const dx = (tx - sx) * tension;
100
+
101
+ const d = [
102
+ `M${sx},${sy}`,
103
+ `C${sx + dx},${sy} ${tx - dx},${ty} ${tx},${ty}`,
104
+ `L${tx},${ty + lh}`,
105
+ `C${tx - dx},${ty + lh} ${sx + dx},${sy + lh} ${sx},${sy + lh}`,
106
+ 'Z',
107
+ ].join(' ');
108
+
109
+ let fill: string;
110
+ let pathOpacity: number | undefined;
111
+ if (mode.type === 'flat') {
112
+ fill = mode.value;
113
+ pathOpacity = opacity;
114
+ } else if (mode.type === 'source') {
115
+ fill = oklch(link.source.color, opacity);
116
+ } else if (mode.type === 'target') {
117
+ fill = oklch(link.target.color, opacity);
118
+ } else {
119
+ fill = `url(#astryx-sankey-grad-${i})`;
120
+ }
121
+
122
+ return <path key={i} d={d} fill={fill} opacity={pathOpacity} />;
123
+ })}
124
+ </g>
125
+ );
126
+ }
127
+
128
+ /** Gradient definition with bias-adjusted stops */
129
+ function GradientDef({
130
+ index,
131
+ link,
132
+ opacity,
133
+ bias,
134
+ }: {
135
+ index: number;
136
+ link: SankeyLinkLayout;
137
+ opacity: number;
138
+ bias: number;
139
+ }) {
140
+ const sx = link.source.x + link.source.width;
141
+ const tx = link.target.x;
142
+ const s1 = Math.max(0, bias - 0.15);
143
+ const s2 = Math.min(1, bias + 0.15);
144
+
145
+ return (
146
+ <linearGradient
147
+ id={`astryx-sankey-grad-${index}`}
148
+ x1={sx}
149
+ x2={tx}
150
+ y1={0}
151
+ y2={0}
152
+ gradientUnits="userSpaceOnUse">
153
+ <stop offset="0%" stopColor={oklch(link.source.color, opacity)} />
154
+ <stop
155
+ offset={`${s1 * 100}%`}
156
+ stopColor={oklch(link.source.color, opacity * 0.9)}
157
+ />
158
+ <stop
159
+ offset={`${s2 * 100}%`}
160
+ stopColor={oklch(link.target.color, opacity * 0.9)}
161
+ />
162
+ <stop offset="100%" stopColor={oklch(link.target.color, opacity)} />
163
+ </linearGradient>
164
+ );
165
+ }
166
+
167
+ SankeyLink.displayName = 'SankeyLink';