@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.
- package/CHANGELOG.md +67 -0
- package/LICENSE +21 -0
- package/README.md +47 -1
- package/dist/Chart/Chart.d.ts +77 -0
- package/dist/Chart/Chart.d.ts.map +1 -0
- package/dist/Chart/Chart.js +247 -0
- package/dist/Chart/ChartArea.d.ts +28 -0
- package/dist/Chart/ChartArea.d.ts.map +1 -0
- package/dist/Chart/ChartArea.js +71 -0
- package/dist/Chart/ChartAxis.d.ts +27 -0
- package/dist/Chart/ChartAxis.d.ts.map +1 -0
- package/dist/Chart/ChartAxis.js +147 -0
- package/dist/Chart/ChartBar.d.ts +19 -0
- package/dist/Chart/ChartBar.d.ts.map +1 -0
- package/dist/Chart/ChartBar.js +61 -0
- package/dist/Chart/ChartBrush.d.ts +59 -0
- package/dist/Chart/ChartBrush.d.ts.map +1 -0
- package/dist/Chart/ChartBrush.js +197 -0
- package/dist/Chart/ChartCandlestick.d.ts +50 -0
- package/dist/Chart/ChartCandlestick.d.ts.map +1 -0
- package/dist/Chart/ChartCandlestick.js +138 -0
- package/dist/Chart/ChartContext.d.ts +5 -0
- package/dist/Chart/ChartContext.d.ts.map +1 -0
- package/dist/Chart/ChartContext.js +20 -0
- package/dist/Chart/ChartDot.d.ts +18 -0
- package/dist/Chart/ChartDot.d.ts.map +1 -0
- package/dist/Chart/ChartDot.js +43 -0
- package/dist/Chart/ChartDotGL.d.ts +16 -0
- package/dist/Chart/ChartDotGL.d.ts.map +1 -0
- package/dist/Chart/ChartDotGL.js +135 -0
- package/dist/Chart/ChartDotGLInteractive.d.ts +41 -0
- package/dist/Chart/ChartDotGLInteractive.d.ts.map +1 -0
- package/dist/Chart/ChartDotGLInteractive.js +446 -0
- package/dist/Chart/ChartErrorBar.d.ts +23 -0
- package/dist/Chart/ChartErrorBar.d.ts.map +1 -0
- package/dist/Chart/ChartErrorBar.js +68 -0
- package/dist/Chart/ChartGrid.d.ts +17 -0
- package/dist/Chart/ChartGrid.d.ts.map +1 -0
- package/dist/Chart/ChartGrid.js +67 -0
- package/dist/Chart/ChartHeatmapGL.d.ts +10 -0
- package/dist/Chart/ChartHeatmapGL.d.ts.map +1 -0
- package/dist/Chart/ChartHeatmapGL.js +171 -0
- package/dist/Chart/ChartLegend.d.ts +60 -0
- package/dist/Chart/ChartLegend.d.ts.map +1 -0
- package/dist/Chart/ChartLegend.js +161 -0
- package/dist/Chart/ChartLine.d.ts +23 -0
- package/dist/Chart/ChartLine.d.ts.map +1 -0
- package/dist/Chart/ChartLine.js +64 -0
- package/dist/Chart/ChartReferenceLine.d.ts +11 -0
- package/dist/Chart/ChartReferenceLine.d.ts.map +1 -0
- package/dist/Chart/ChartReferenceLine.js +109 -0
- package/dist/Chart/ChartSelect.d.ts +9 -0
- package/dist/Chart/ChartSelect.d.ts.map +1 -0
- package/dist/Chart/ChartSelect.js +90 -0
- package/dist/Chart/ChartStreamGL.d.ts +17 -0
- package/dist/Chart/ChartStreamGL.d.ts.map +1 -0
- package/dist/Chart/ChartStreamGL.js +157 -0
- package/dist/Chart/ChartTooltip.d.ts +85 -0
- package/dist/Chart/ChartTooltip.d.ts.map +1 -0
- package/dist/Chart/ChartTooltip.js +335 -0
- package/dist/Chart/ChartZoom.d.ts +23 -0
- package/dist/Chart/ChartZoom.d.ts.map +1 -0
- package/dist/Chart/ChartZoom.js +314 -0
- package/dist/Chart/formatters.d.ts +33 -0
- package/dist/Chart/formatters.d.ts.map +1 -0
- package/dist/Chart/formatters.js +101 -0
- package/dist/Chart/getChartColors.d.ts +56 -0
- package/dist/Chart/getChartColors.d.ts.map +1 -0
- package/dist/Chart/getChartColors.js +150 -0
- package/dist/Chart/index.d.ts +29 -0
- package/dist/Chart/index.d.ts.map +1 -0
- package/dist/Chart/index.js +29 -0
- package/dist/Chart/m4.d.ts +36 -0
- package/dist/Chart/m4.d.ts.map +1 -0
- package/dist/Chart/m4.js +106 -0
- package/dist/Chart/types.d.ts +55 -0
- package/dist/Chart/types.d.ts.map +1 -0
- package/dist/Chart/types.js +1 -0
- package/dist/Chart/useChartColors.d.ts +16 -0
- package/dist/Chart/useChartColors.d.ts.map +1 -0
- package/dist/Chart/useChartColors.js +30 -0
- package/dist/Chart/useChartRange.d.ts +50 -0
- package/dist/Chart/useChartRange.d.ts.map +1 -0
- package/dist/Chart/useChartRange.js +90 -0
- package/dist/Chart/utils.d.ts +15 -0
- package/dist/Chart/utils.d.ts.map +1 -0
- package/dist/Chart/utils.js +24 -0
- package/dist/Chart/webgl.d.ts +62 -0
- package/dist/Chart/webgl.d.ts.map +1 -0
- package/dist/Chart/webgl.js +169 -0
- package/dist/ChartV2/Chart.d.ts +32 -0
- package/dist/ChartV2/Chart.d.ts.map +1 -0
- package/dist/ChartV2/Chart.js +281 -0
- package/dist/ChartV2/ChartAxis.d.ts +36 -0
- package/dist/ChartV2/ChartAxis.d.ts.map +1 -0
- package/dist/ChartV2/ChartAxis.js +161 -0
- package/dist/ChartV2/ChartGrid.d.ts +20 -0
- package/dist/ChartV2/ChartGrid.d.ts.map +1 -0
- package/dist/ChartV2/ChartGrid.js +76 -0
- package/dist/ChartV2/ChartLegend.d.ts +14 -0
- package/dist/ChartV2/ChartLegend.d.ts.map +1 -0
- package/dist/ChartV2/ChartLegend.js +54 -0
- package/dist/ChartV2/ChartSwatch.d.ts +36 -0
- package/dist/ChartV2/ChartSwatch.d.ts.map +1 -0
- package/dist/ChartV2/ChartSwatch.js +82 -0
- package/dist/ChartV2/ChartTooltip.d.ts +46 -0
- package/dist/ChartV2/ChartTooltip.d.ts.map +1 -0
- package/dist/ChartV2/ChartTooltip.js +267 -0
- package/dist/ChartV2/ChartV2Context.d.ts +4 -0
- package/dist/ChartV2/ChartV2Context.d.ts.map +1 -0
- package/dist/ChartV2/ChartV2Context.js +12 -0
- package/dist/ChartV2/index.d.ts +13 -0
- package/dist/ChartV2/index.d.ts.map +1 -0
- package/dist/ChartV2/index.js +10 -0
- package/dist/ChartV2/layout.d.ts +25 -0
- package/dist/ChartV2/layout.d.ts.map +1 -0
- package/dist/ChartV2/layout.js +195 -0
- package/dist/ChartV2/legend.d.ts +18 -0
- package/dist/ChartV2/legend.d.ts.map +1 -0
- package/dist/ChartV2/legend.js +24 -0
- package/dist/ChartV2/marks/area.d.ts +19 -0
- package/dist/ChartV2/marks/area.d.ts.map +1 -0
- package/dist/ChartV2/marks/area.js +109 -0
- package/dist/ChartV2/marks/band.d.ts +9 -0
- package/dist/ChartV2/marks/band.d.ts.map +1 -0
- package/dist/ChartV2/marks/band.js +59 -0
- package/dist/ChartV2/marks/bar.d.ts +17 -0
- package/dist/ChartV2/marks/bar.d.ts.map +1 -0
- package/dist/ChartV2/marks/bar.js +120 -0
- package/dist/ChartV2/marks/candlestick.d.ts +15 -0
- package/dist/ChartV2/marks/candlestick.d.ts.map +1 -0
- package/dist/ChartV2/marks/candlestick.js +83 -0
- package/dist/ChartV2/marks/dot.d.ts +15 -0
- package/dist/ChartV2/marks/dot.d.ts.map +1 -0
- package/dist/ChartV2/marks/dot.js +65 -0
- package/dist/ChartV2/marks/dotGL.d.ts +16 -0
- package/dist/ChartV2/marks/dotGL.d.ts.map +1 -0
- package/dist/ChartV2/marks/dotGL.js +178 -0
- package/dist/ChartV2/marks/dotGLInteractive.d.ts +30 -0
- package/dist/ChartV2/marks/dotGLInteractive.d.ts.map +1 -0
- package/dist/ChartV2/marks/dotGLInteractive.js +464 -0
- package/dist/ChartV2/marks/errorBar.d.ts +27 -0
- package/dist/ChartV2/marks/errorBar.d.ts.map +1 -0
- package/dist/ChartV2/marks/errorBar.js +87 -0
- package/dist/ChartV2/marks/heatmapGL.d.ts +23 -0
- package/dist/ChartV2/marks/heatmapGL.d.ts.map +1 -0
- package/dist/ChartV2/marks/heatmapGL.js +242 -0
- package/dist/ChartV2/marks/index.d.ts +13 -0
- package/dist/ChartV2/marks/index.d.ts.map +1 -0
- package/dist/ChartV2/marks/index.js +14 -0
- package/dist/ChartV2/marks/line.d.ts +18 -0
- package/dist/ChartV2/marks/line.d.ts.map +1 -0
- package/dist/ChartV2/marks/line.js +76 -0
- package/dist/ChartV2/marks/referenceLine.d.ts +35 -0
- package/dist/ChartV2/marks/referenceLine.d.ts.map +1 -0
- package/dist/ChartV2/marks/referenceLine.js +186 -0
- package/dist/ChartV2/marks/streamGL.d.ts +36 -0
- package/dist/ChartV2/marks/streamGL.d.ts.map +1 -0
- package/dist/ChartV2/marks/streamGL.js +204 -0
- package/dist/ChartV2/tooltip.d.ts +38 -0
- package/dist/ChartV2/tooltip.d.ts.map +1 -0
- package/dist/ChartV2/tooltip.js +54 -0
- package/dist/ChartV2/types.d.ts +115 -0
- package/dist/ChartV2/types.d.ts.map +1 -0
- package/dist/ChartV2/types.js +35 -0
- package/dist/ChatReasoning/ChatReasoning.d.ts +51 -0
- package/dist/ChatReasoning/ChatReasoning.d.ts.map +1 -0
- package/dist/ChatReasoning/ChatReasoning.js +236 -0
- package/dist/CircularProgress/CircularProgress.d.ts +101 -0
- package/dist/CircularProgress/CircularProgress.d.ts.map +1 -0
- package/dist/CircularProgress/CircularProgress.js +263 -0
- package/dist/CircularProgress/index.d.ts +6 -0
- package/dist/CircularProgress/index.d.ts.map +1 -0
- package/dist/CircularProgress/index.js +8 -0
- package/dist/CodeBlock/index.d.ts +8 -0
- package/dist/CodeBlock/index.d.ts.map +1 -0
- package/dist/CodeBlock/index.js +9 -0
- package/dist/CodeEditor/CodeEditor.d.ts +46 -0
- package/dist/CodeEditor/CodeEditor.d.ts.map +1 -0
- package/dist/CodeEditor/CodeEditor.js +396 -0
- package/dist/CodeEditor/index.d.ts +6 -0
- package/dist/CodeEditor/index.d.ts.map +1 -0
- package/dist/CodeEditor/index.js +7 -0
- package/dist/Radial/RadialArea.d.ts +25 -0
- package/dist/Radial/RadialArea.d.ts.map +1 -0
- package/dist/Radial/RadialArea.js +91 -0
- package/dist/Radial/RadialAxis.d.ts +14 -0
- package/dist/Radial/RadialAxis.d.ts.map +1 -0
- package/dist/Radial/RadialAxis.js +55 -0
- package/dist/Radial/RadialChart.d.ts +70 -0
- package/dist/Radial/RadialChart.d.ts.map +1 -0
- package/dist/Radial/RadialChart.js +174 -0
- package/dist/Radial/RadialContext.d.ts +5 -0
- package/dist/Radial/RadialContext.d.ts.map +1 -0
- package/dist/Radial/RadialContext.js +19 -0
- package/dist/Radial/RadialGrid.d.ts +14 -0
- package/dist/Radial/RadialGrid.d.ts.map +1 -0
- package/dist/Radial/RadialGrid.js +70 -0
- package/dist/Radial/RadialSlice.d.ts +23 -0
- package/dist/Radial/RadialSlice.d.ts.map +1 -0
- package/dist/Radial/RadialSlice.js +85 -0
- package/dist/Radial/RadialTooltip.d.ts +44 -0
- package/dist/Radial/RadialTooltip.d.ts.map +1 -0
- package/dist/Radial/RadialTooltip.js +284 -0
- package/dist/Radial/index.d.ts +9 -0
- package/dist/Radial/index.d.ts.map +1 -0
- package/dist/Radial/index.js +9 -0
- package/dist/Radial/types.d.ts +39 -0
- package/dist/Radial/types.d.ts.map +1 -0
- package/dist/Radial/types.js +1 -0
- package/dist/SVGIcon/SVGIcon.d.ts +87 -0
- package/dist/SVGIcon/SVGIcon.d.ts.map +1 -0
- package/dist/SVGIcon/SVGIcon.js +299 -0
- package/dist/SVGIcon/icons.d.ts +49 -0
- package/dist/SVGIcon/icons.d.ts.map +1 -0
- package/dist/SVGIcon/icons.js +326 -0
- package/dist/SVGIcon/index.d.ts +15 -0
- package/dist/SVGIcon/index.d.ts.map +1 -0
- package/dist/SVGIcon/index.js +22 -0
- package/dist/SVGIcon/pathTransforms.d.ts +35 -0
- package/dist/SVGIcon/pathTransforms.d.ts.map +1 -0
- package/dist/SVGIcon/pathTransforms.js +644 -0
- package/dist/SVGIcon/tokens.stylex.d.ts +37 -0
- package/dist/SVGIcon/tokens.stylex.d.ts.map +1 -0
- package/dist/SVGIcon/tokens.stylex.js +40 -0
- package/dist/SVGIcon/variations.stylex.d.ts +44 -0
- package/dist/SVGIcon/variations.stylex.d.ts.map +1 -0
- package/dist/SVGIcon/variations.stylex.js +119 -0
- package/dist/SVGIcon/xif-examples.d.ts +22 -0
- package/dist/SVGIcon/xif-examples.d.ts.map +1 -0
- package/dist/SVGIcon/xif-examples.js +202 -0
- package/dist/SVGIcon/xif-types.d.ts +129 -0
- package/dist/SVGIcon/xif-types.d.ts.map +1 -0
- package/dist/SVGIcon/xif-types.js +1 -0
- package/dist/Sankey/SankeyChart.d.ts +72 -0
- package/dist/Sankey/SankeyChart.d.ts.map +1 -0
- package/dist/Sankey/SankeyChart.js +162 -0
- package/dist/Sankey/SankeyContext.d.ts +5 -0
- package/dist/Sankey/SankeyContext.d.ts.map +1 -0
- package/dist/Sankey/SankeyContext.js +20 -0
- package/dist/Sankey/SankeyGrid.d.ts +20 -0
- package/dist/Sankey/SankeyGrid.d.ts.map +1 -0
- package/dist/Sankey/SankeyGrid.js +53 -0
- package/dist/Sankey/SankeyLabel.d.ts +11 -0
- package/dist/Sankey/SankeyLabel.d.ts.map +1 -0
- package/dist/Sankey/SankeyLabel.js +179 -0
- package/dist/Sankey/SankeyLink.d.ts +29 -0
- package/dist/Sankey/SankeyLink.d.ts.map +1 -0
- package/dist/Sankey/SankeyLink.js +139 -0
- package/dist/Sankey/SankeyNode.d.ts +15 -0
- package/dist/Sankey/SankeyNode.d.ts.map +1 -0
- package/dist/Sankey/SankeyNode.js +56 -0
- package/dist/Sankey/index.d.ts +8 -0
- package/dist/Sankey/index.d.ts.map +1 -0
- package/dist/Sankey/index.js +8 -0
- package/dist/Sankey/layout.d.ts +26 -0
- package/dist/Sankey/layout.d.ts.map +1 -0
- package/dist/Sankey/layout.js +157 -0
- package/dist/Sankey/types.d.ts +84 -0
- package/dist/Sankey/types.d.ts.map +1 -0
- package/dist/Sankey/types.js +1 -0
- package/dist/Schedule/CalendarEvent.d.ts +36 -0
- package/dist/Schedule/CalendarEvent.d.ts.map +1 -0
- package/dist/Schedule/CalendarEvent.js +35 -0
- package/dist/Schedule/DayView.d.ts +8 -0
- package/dist/Schedule/DayView.d.ts.map +1 -0
- package/dist/Schedule/DayView.js +105 -0
- package/dist/Schedule/ListView.d.ts +6 -0
- package/dist/Schedule/ListView.d.ts.map +1 -0
- package/dist/Schedule/ListView.js +171 -0
- package/dist/Schedule/MonthlyView.d.ts +6 -0
- package/dist/Schedule/MonthlyView.d.ts.map +1 -0
- package/dist/Schedule/MonthlyView.js +270 -0
- package/dist/Schedule/Schedule.d.ts +22 -0
- package/dist/Schedule/Schedule.d.ts.map +1 -0
- package/dist/Schedule/Schedule.js +185 -0
- package/dist/Schedule/TimeGridView.d.ts +12 -0
- package/dist/Schedule/TimeGridView.d.ts.map +1 -0
- package/dist/Schedule/TimeGridView.js +364 -0
- package/dist/Schedule/WeeklyView.d.ts +9 -0
- package/dist/Schedule/WeeklyView.d.ts.map +1 -0
- package/dist/Schedule/WeeklyView.js +112 -0
- package/dist/Schedule/context.d.ts +20 -0
- package/dist/Schedule/context.d.ts.map +1 -0
- package/dist/Schedule/context.js +19 -0
- package/dist/Schedule/dateMath.d.ts +21 -0
- package/dist/Schedule/dateMath.d.ts.map +1 -0
- package/dist/Schedule/dateMath.js +63 -0
- package/dist/Schedule/index.d.ts +19 -0
- package/dist/Schedule/index.d.ts.map +1 -0
- package/dist/Schedule/index.js +17 -0
- package/dist/Schedule/plugins/PaginationPlugin.d.ts +7 -0
- package/dist/Schedule/plugins/PaginationPlugin.d.ts.map +1 -0
- package/dist/Schedule/plugins/PaginationPlugin.js +81 -0
- package/dist/Schedule/plugins/ViewSelectorPlugin.d.ts +11 -0
- package/dist/Schedule/plugins/ViewSelectorPlugin.d.ts.map +1 -0
- package/dist/Schedule/plugins/ViewSelectorPlugin.js +78 -0
- package/dist/Schedule/plugins/index.d.ts +5 -0
- package/dist/Schedule/plugins/index.d.ts.map +1 -0
- package/dist/Schedule/plugins/index.js +14 -0
- package/dist/Schedule/shared.d.ts +923 -0
- package/dist/Schedule/shared.d.ts.map +1 -0
- package/dist/Schedule/shared.js +1325 -0
- package/dist/Schedule/types.d.ts +51 -0
- package/dist/Schedule/types.d.ts.map +1 -0
- package/dist/Schedule/types.js +1 -0
- package/dist/Schedule/useCurrentTime.d.ts +3 -0
- package/dist/Schedule/useCurrentTime.d.ts.map +1 -0
- package/dist/Schedule/useCurrentTime.js +43 -0
- package/dist/Schedule/zonedDateTime.d.ts +20 -0
- package/dist/Schedule/zonedDateTime.d.ts.map +1 -0
- package/dist/Schedule/zonedDateTime.js +31 -0
- package/dist/Stepper/Step.d.ts +120 -0
- package/dist/Stepper/Step.d.ts.map +1 -0
- package/dist/Stepper/Step.js +573 -0
- package/dist/Stepper/StepStatus.d.ts +24 -0
- package/dist/Stepper/StepStatus.d.ts.map +1 -0
- package/dist/Stepper/StepStatus.js +1 -0
- package/dist/Stepper/Stepper.d.ts +77 -0
- package/dist/Stepper/Stepper.d.ts.map +1 -0
- package/dist/Stepper/Stepper.js +104 -0
- package/dist/Stepper/StepperContext.d.ts +12 -0
- package/dist/Stepper/StepperContext.d.ts.map +1 -0
- package/dist/Stepper/StepperContext.js +24 -0
- package/dist/Stepper/index.d.ts +8 -0
- package/dist/Stepper/index.d.ts.map +1 -0
- package/dist/Stepper/index.js +7 -0
- package/dist/ThreeD/ThreeDAxis.d.ts +6 -0
- package/dist/ThreeD/ThreeDAxis.d.ts.map +1 -0
- package/dist/ThreeD/ThreeDAxis.js +75 -0
- package/dist/ThreeD/ThreeDBar.d.ts +7 -0
- package/dist/ThreeD/ThreeDBar.d.ts.map +1 -0
- package/dist/ThreeD/ThreeDBar.js +98 -0
- package/dist/ThreeD/ThreeDChart.d.ts +24 -0
- package/dist/ThreeD/ThreeDChart.d.ts.map +1 -0
- package/dist/ThreeD/ThreeDChart.js +202 -0
- package/dist/ThreeD/ThreeDContext.d.ts +5 -0
- package/dist/ThreeD/ThreeDContext.d.ts.map +1 -0
- package/dist/ThreeD/ThreeDContext.js +19 -0
- package/dist/ThreeD/ThreeDGrid.d.ts +5 -0
- package/dist/ThreeD/ThreeDGrid.d.ts.map +1 -0
- package/dist/ThreeD/ThreeDGrid.js +55 -0
- package/dist/ThreeD/ThreeDScatter.d.ts +7 -0
- package/dist/ThreeD/ThreeDScatter.d.ts.map +1 -0
- package/dist/ThreeD/ThreeDScatter.js +57 -0
- package/dist/ThreeD/ThreeDScatterGL.d.ts +7 -0
- package/dist/ThreeD/ThreeDScatterGL.d.ts.map +1 -0
- package/dist/ThreeD/ThreeDScatterGL.js +243 -0
- package/dist/ThreeD/ThreeDSurface.d.ts +15 -0
- package/dist/ThreeD/ThreeDSurface.d.ts.map +1 -0
- package/dist/ThreeD/ThreeDSurface.js +97 -0
- package/dist/ThreeD/index.d.ts +10 -0
- package/dist/ThreeD/index.d.ts.map +1 -0
- package/dist/ThreeD/index.js +10 -0
- package/dist/ThreeD/types.d.ts +57 -0
- package/dist/ThreeD/types.d.ts.map +1 -0
- package/dist/ThreeD/types.js +1 -0
- package/dist/index.d.ts +26 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +47 -0
- package/dist/lab.css +423 -0
- package/package.json +69 -4
- package/src/Chart/Chart.tsx +312 -0
- package/src/Chart/ChartArea.doc.mjs +16 -0
- package/src/Chart/ChartArea.tsx +91 -0
- package/src/Chart/ChartAxis.tsx +186 -0
- package/src/Chart/ChartBar.doc.mjs +16 -0
- package/src/Chart/ChartBar.tsx +71 -0
- package/src/Chart/ChartBrush.tsx +237 -0
- package/src/Chart/ChartCandlestick.doc.mjs +16 -0
- package/src/Chart/ChartCandlestick.tsx +186 -0
- package/src/Chart/ChartContext.ts +23 -0
- package/src/Chart/ChartDot.doc.mjs +16 -0
- package/src/Chart/ChartDot.tsx +44 -0
- package/src/Chart/ChartDotGL.doc.mjs +16 -0
- package/src/Chart/ChartDotGL.tsx +151 -0
- package/src/Chart/ChartDotGLInteractive.doc.mjs +16 -0
- package/src/Chart/ChartDotGLInteractive.tsx +519 -0
- package/src/Chart/ChartErrorBar.tsx +84 -0
- package/src/Chart/ChartGrid.tsx +86 -0
- package/src/Chart/ChartHeatmapGL.doc.mjs +16 -0
- package/src/Chart/ChartHeatmapGL.tsx +219 -0
- package/src/Chart/ChartLegend.tsx +181 -0
- package/src/Chart/ChartLine.doc.mjs +16 -0
- package/src/Chart/ChartLine.tsx +70 -0
- package/src/Chart/ChartReferenceLine.tsx +76 -0
- package/src/Chart/ChartSelect.tsx +111 -0
- package/src/Chart/ChartStreamGL.doc.mjs +16 -0
- package/src/Chart/ChartStreamGL.tsx +189 -0
- package/src/Chart/ChartTooltip.tsx +451 -0
- package/src/Chart/ChartZoom.tsx +400 -0
- package/src/Chart/formatters.ts +95 -0
- package/src/Chart/getChartColors.ts +249 -0
- package/src/Chart/index.ts +90 -0
- package/src/Chart/m4.test.ts +66 -0
- package/src/Chart/m4.ts +128 -0
- package/src/Chart/types.ts +64 -0
- package/src/Chart/useChartColors.ts +34 -0
- package/src/Chart/useChartRange.test.ts +101 -0
- package/src/Chart/useChartRange.ts +146 -0
- package/src/Chart/utils.ts +31 -0
- package/src/Chart/webgl.ts +192 -0
- package/src/ChartV2/Chart.tsx +348 -0
- package/src/ChartV2/ChartAxis.tsx +209 -0
- package/src/ChartV2/ChartGrid.tsx +99 -0
- package/src/ChartV2/ChartLegend.tsx +69 -0
- package/src/ChartV2/ChartSwatch.doc.mjs +17 -0
- package/src/ChartV2/ChartSwatch.tsx +86 -0
- package/src/ChartV2/ChartTooltip.tsx +382 -0
- package/src/ChartV2/ChartV2.doc.mjs +16 -0
- package/src/ChartV2/ChartV2Context.ts +15 -0
- package/src/ChartV2/index.ts +62 -0
- package/src/ChartV2/layout.ts +223 -0
- package/src/ChartV2/legend.ts +32 -0
- package/src/ChartV2/marks/area.tsx +122 -0
- package/src/ChartV2/marks/band.tsx +70 -0
- package/src/ChartV2/marks/bar.tsx +159 -0
- package/src/ChartV2/marks/candlestick.tsx +106 -0
- package/src/ChartV2/marks/dot.tsx +64 -0
- package/src/ChartV2/marks/dotGL.tsx +202 -0
- package/src/ChartV2/marks/dotGLInteractive.tsx +546 -0
- package/src/ChartV2/marks/errorBar.tsx +89 -0
- package/src/ChartV2/marks/heatmapGL.tsx +299 -0
- package/src/ChartV2/marks/index.ts +14 -0
- package/src/ChartV2/marks/line.tsx +94 -0
- package/src/ChartV2/marks/referenceLine.tsx +224 -0
- package/src/ChartV2/marks/streamGL.tsx +251 -0
- package/src/ChartV2/tooltip.ts +70 -0
- package/src/ChartV2/types.ts +129 -0
- package/src/ChatReasoning/ChatReasoning.doc.mjs +16 -0
- package/src/ChatReasoning/ChatReasoning.test.tsx +56 -0
- package/src/ChatReasoning/ChatReasoning.tsx +322 -0
- package/src/CircularProgress/CircularProgress.doc.mjs +174 -0
- package/src/CircularProgress/CircularProgress.test.tsx +157 -0
- package/src/CircularProgress/CircularProgress.tsx +373 -0
- package/src/CircularProgress/index.ts +15 -0
- package/src/CodeBlock/index.ts +10 -0
- package/src/CodeEditor/CodeEditor.doc.mjs +16 -0
- package/src/CodeEditor/CodeEditor.tsx +466 -0
- package/src/CodeEditor/index.ts +8 -0
- package/src/Radial/RadialArea.tsx +103 -0
- package/src/Radial/RadialAxis.tsx +60 -0
- package/src/Radial/RadialChart.doc.mjs +16 -0
- package/src/Radial/RadialChart.tsx +219 -0
- package/src/Radial/RadialContext.ts +22 -0
- package/src/Radial/RadialGrid.tsx +81 -0
- package/src/Radial/RadialSlice.tsx +130 -0
- package/src/Radial/RadialTooltip.tsx +347 -0
- package/src/Radial/index.ts +14 -0
- package/src/Radial/types.ts +46 -0
- package/src/SVGIcon/SVGIcon.doc.mjs +16 -0
- package/src/SVGIcon/SVGIcon.tsx +406 -0
- package/src/SVGIcon/icons.ts +283 -0
- package/src/SVGIcon/index.ts +73 -0
- package/src/SVGIcon/pathTransforms.ts +612 -0
- package/src/SVGIcon/tokens.stylex.ts +53 -0
- package/src/SVGIcon/variations.stylex.ts +122 -0
- package/src/SVGIcon/xif-examples.ts +191 -0
- package/src/SVGIcon/xif-types.ts +181 -0
- package/src/Sankey/SankeyChart.doc.mjs +16 -0
- package/src/Sankey/SankeyChart.tsx +220 -0
- package/src/Sankey/SankeyContext.ts +23 -0
- package/src/Sankey/SankeyGrid.tsx +69 -0
- package/src/Sankey/SankeyLabel.tsx +234 -0
- package/src/Sankey/SankeyLink.tsx +167 -0
- package/src/Sankey/SankeyNode.tsx +66 -0
- package/src/Sankey/index.ts +22 -0
- package/src/Sankey/layout.ts +219 -0
- package/src/Sankey/types.ts +93 -0
- package/src/Schedule/CalendarEvent.ts +74 -0
- package/src/Schedule/DayView.tsx +112 -0
- package/src/Schedule/ListView.tsx +236 -0
- package/src/Schedule/MonthlyView.tsx +401 -0
- package/src/Schedule/Schedule.doc.mjs +16 -0
- package/src/Schedule/Schedule.test.tsx +405 -0
- package/src/Schedule/Schedule.tsx +307 -0
- package/src/Schedule/TimeGridView.tsx +589 -0
- package/src/Schedule/WeeklyView.tsx +130 -0
- package/src/Schedule/context.tsx +49 -0
- package/src/Schedule/dateMath.ts +112 -0
- package/src/Schedule/index.ts +61 -0
- package/src/Schedule/plugins/PaginationPlugin.tsx +98 -0
- package/src/Schedule/plugins/ViewSelectorPlugin.tsx +128 -0
- package/src/Schedule/plugins/index.tsx +20 -0
- package/src/Schedule/shared.tsx +1304 -0
- package/src/Schedule/types.ts +86 -0
- package/src/Schedule/useCurrentTime.ts +50 -0
- package/src/Schedule/zonedDateTime.ts +71 -0
- package/src/Stepper/Step.doc.mjs +17 -0
- package/src/Stepper/Step.tsx +756 -0
- package/src/Stepper/StepStatus.ts +26 -0
- package/src/Stepper/Stepper.doc.mjs +265 -0
- package/src/Stepper/Stepper.test.tsx +281 -0
- package/src/Stepper/Stepper.tsx +157 -0
- package/src/Stepper/StepperContext.ts +43 -0
- package/src/Stepper/index.ts +14 -0
- package/src/ThreeD/3DBar.doc.mjs +16 -0
- package/src/ThreeD/3DChart.doc.mjs +16 -0
- package/src/ThreeD/3DScatter.doc.mjs +16 -0
- package/src/ThreeD/3DScatterGL.doc.mjs +16 -0
- package/src/ThreeD/3DSurface.doc.mjs +16 -0
- package/src/ThreeD/ThreeDAxis.tsx +86 -0
- package/src/ThreeD/ThreeDBar.tsx +130 -0
- package/src/ThreeD/ThreeDChart.tsx +262 -0
- package/src/ThreeD/ThreeDContext.ts +22 -0
- package/src/ThreeD/ThreeDGrid.tsx +68 -0
- package/src/ThreeD/ThreeDScatter.tsx +63 -0
- package/src/ThreeD/ThreeDScatterGL.tsx +270 -0
- package/src/ThreeD/ThreeDSurface.tsx +142 -0
- package/src/ThreeD/index.ts +11 -0
- package/src/ThreeD/projection.test.ts +132 -0
- package/src/ThreeD/types.ts +62 -0
- 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';
|