@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,237 @@
|
|
|
1
|
+
// Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* @file ChartBrush.tsx
|
|
5
|
+
* @output Drag-to-select region. Supports x-only or 2D (xy) brush modes.
|
|
6
|
+
* @position Child of Chart; reads scales from context
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
import React, {useState, useCallback, useRef} from 'react';
|
|
10
|
+
import {useChart} from './ChartContext';
|
|
11
|
+
import {isBandScale} from './utils';
|
|
12
|
+
import type {ScaleLinear} from 'd3-scale';
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* Brush direction mode:
|
|
16
|
+
* - `'x'` — horizontal range selection (default)
|
|
17
|
+
* - `'xy'` — 2D rectangular selection
|
|
18
|
+
*/
|
|
19
|
+
export type BrushMode = 'x' | 'xy';
|
|
20
|
+
|
|
21
|
+
export interface BrushRange {
|
|
22
|
+
x: [number, number];
|
|
23
|
+
y?: [number, number];
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
export interface ChartBrushProps {
|
|
27
|
+
/**
|
|
28
|
+
* Brush direction mode.
|
|
29
|
+
* - `'x'` — horizontal selection (default, good for time ranges)
|
|
30
|
+
* - `'xy'` — rectangular 2D selection (good for scatter plots)
|
|
31
|
+
*
|
|
32
|
+
* @default 'x'
|
|
33
|
+
*/
|
|
34
|
+
mode?: BrushMode;
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* Called when the user finishes a brush gesture.
|
|
38
|
+
* Receives the selected range in data coordinates and the matching data points.
|
|
39
|
+
*/
|
|
40
|
+
onBrush?: (range: BrushRange, data: Record<string, unknown>[]) => void;
|
|
41
|
+
|
|
42
|
+
/**
|
|
43
|
+
* Called when the brush is cleared (click without drag).
|
|
44
|
+
*/
|
|
45
|
+
onClear?: () => void;
|
|
46
|
+
|
|
47
|
+
/**
|
|
48
|
+
* Brush overlay color.
|
|
49
|
+
* @default 'var(--color-accent)'
|
|
50
|
+
*/
|
|
51
|
+
color?: string;
|
|
52
|
+
|
|
53
|
+
/**
|
|
54
|
+
* Brush overlay opacity.
|
|
55
|
+
* @default 0.15
|
|
56
|
+
*/
|
|
57
|
+
opacity?: number;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
function localCoords(e: React.PointerEvent<SVGRectElement>): {
|
|
61
|
+
x: number;
|
|
62
|
+
y: number;
|
|
63
|
+
} {
|
|
64
|
+
const svg = e.currentTarget.ownerSVGElement;
|
|
65
|
+
if (!svg) {
|
|
66
|
+
return {x: 0, y: 0};
|
|
67
|
+
}
|
|
68
|
+
const pt = svg.createSVGPoint();
|
|
69
|
+
pt.x = e.clientX;
|
|
70
|
+
pt.y = e.clientY;
|
|
71
|
+
const local = pt.matrixTransform(e.currentTarget.getScreenCTM()?.inverse());
|
|
72
|
+
return {x: local.x, y: local.y};
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
/**
|
|
76
|
+
* Brush interaction for range selection.
|
|
77
|
+
*
|
|
78
|
+
* @example
|
|
79
|
+
* ```tsx
|
|
80
|
+
* // X-only (default)
|
|
81
|
+
* <ChartBrush onBrush={({x}) => setZoom(x)} />
|
|
82
|
+
*
|
|
83
|
+
* // 2D rectangular
|
|
84
|
+
* <ChartBrush mode="xy" onBrush={({x, y}, points) => setSelected(points)} />
|
|
85
|
+
* ```
|
|
86
|
+
*/
|
|
87
|
+
export function ChartBrush({
|
|
88
|
+
mode = 'x',
|
|
89
|
+
onBrush,
|
|
90
|
+
onClear,
|
|
91
|
+
color = 'var(--color-accent)',
|
|
92
|
+
opacity = 0.15,
|
|
93
|
+
}: ChartBrushProps) {
|
|
94
|
+
const {width, height, data, xKey, xScale, yScale} = useChart();
|
|
95
|
+
const [brush, setBrush] = useState<{
|
|
96
|
+
x0: number;
|
|
97
|
+
y0: number;
|
|
98
|
+
x1: number;
|
|
99
|
+
y1: number;
|
|
100
|
+
} | null>(null);
|
|
101
|
+
const dragging = useRef(false);
|
|
102
|
+
const startRef = useRef({x: 0, y: 0});
|
|
103
|
+
|
|
104
|
+
const onPointerDown = useCallback((e: React.PointerEvent<SVGRectElement>) => {
|
|
105
|
+
(e.target as Element).setPointerCapture(e.pointerId);
|
|
106
|
+
dragging.current = true;
|
|
107
|
+
const {x, y} = localCoords(e);
|
|
108
|
+
startRef.current = {x, y};
|
|
109
|
+
setBrush({x0: x, y0: y, x1: x, y1: y});
|
|
110
|
+
}, []);
|
|
111
|
+
|
|
112
|
+
const onPointerMove = useCallback(
|
|
113
|
+
(e: React.PointerEvent<SVGRectElement>) => {
|
|
114
|
+
if (!dragging.current) {
|
|
115
|
+
return;
|
|
116
|
+
}
|
|
117
|
+
const {x, y} = localCoords(e);
|
|
118
|
+
const {x: sx, y: sy} = startRef.current;
|
|
119
|
+
|
|
120
|
+
if (mode === 'x') {
|
|
121
|
+
setBrush({
|
|
122
|
+
x0: Math.min(sx, x),
|
|
123
|
+
y0: 0,
|
|
124
|
+
x1: Math.max(sx, x),
|
|
125
|
+
y1: height,
|
|
126
|
+
});
|
|
127
|
+
} else {
|
|
128
|
+
setBrush({
|
|
129
|
+
x0: Math.min(sx, x),
|
|
130
|
+
y0: Math.min(sy, y),
|
|
131
|
+
x1: Math.max(sx, x),
|
|
132
|
+
y1: Math.max(sy, y),
|
|
133
|
+
});
|
|
134
|
+
}
|
|
135
|
+
},
|
|
136
|
+
[mode, height],
|
|
137
|
+
);
|
|
138
|
+
|
|
139
|
+
const onPointerUp = useCallback(() => {
|
|
140
|
+
dragging.current = false;
|
|
141
|
+
if (!brush) {
|
|
142
|
+
return;
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
const dx = Math.abs(brush.x1 - brush.x0);
|
|
146
|
+
const dy = Math.abs(brush.y1 - brush.y0);
|
|
147
|
+
|
|
148
|
+
// Too small — treat as click (clear)
|
|
149
|
+
if (dx < 3 && (mode === 'x' || dy < 3)) {
|
|
150
|
+
setBrush(null);
|
|
151
|
+
onClear?.();
|
|
152
|
+
return;
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
if (isBandScale(xScale)) {
|
|
156
|
+
// Band scale — can't invert meaningfully for range
|
|
157
|
+
setBrush(null);
|
|
158
|
+
return;
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
const linear = xScale as ScaleLinear<number, number>;
|
|
162
|
+
const xMin = linear.invert(brush.x0);
|
|
163
|
+
const xMax = linear.invert(brush.x1);
|
|
164
|
+
|
|
165
|
+
const range: BrushRange = {x: [xMin, xMax]};
|
|
166
|
+
|
|
167
|
+
let selected: Record<string, unknown>[];
|
|
168
|
+
|
|
169
|
+
if (mode === 'xy') {
|
|
170
|
+
const yMin = yScale.invert(brush.y1); // y is inverted (top=0)
|
|
171
|
+
const yMax = yScale.invert(brush.y0);
|
|
172
|
+
range.y = [yMin, yMax];
|
|
173
|
+
|
|
174
|
+
selected = data.filter(d => {
|
|
175
|
+
const xv = d[xKey];
|
|
176
|
+
if (typeof xv !== 'number' || xv < xMin || xv > xMax) {
|
|
177
|
+
return false;
|
|
178
|
+
}
|
|
179
|
+
// Check all numeric values against y range
|
|
180
|
+
return Object.entries(d).some(
|
|
181
|
+
([k, v]) =>
|
|
182
|
+
k !== xKey && typeof v === 'number' && v >= yMin && v <= yMax,
|
|
183
|
+
);
|
|
184
|
+
});
|
|
185
|
+
} else {
|
|
186
|
+
selected = data.filter(d => {
|
|
187
|
+
const v = d[xKey];
|
|
188
|
+
return typeof v === 'number' && v >= xMin && v <= xMax;
|
|
189
|
+
});
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
onBrush?.(range, selected);
|
|
193
|
+
}, [brush, mode, xScale, yScale, data, xKey, onBrush, onClear]);
|
|
194
|
+
|
|
195
|
+
const rectX = brush ? brush.x0 : 0;
|
|
196
|
+
const rectY = brush ? brush.y0 : 0;
|
|
197
|
+
const rectW = brush ? brush.x1 - brush.x0 : 0;
|
|
198
|
+
const rectH = brush ? brush.y1 - brush.y0 : 0;
|
|
199
|
+
|
|
200
|
+
const brushRectStyle: React.CSSProperties = {
|
|
201
|
+
cursor: 'crosshair',
|
|
202
|
+
touchAction: 'none',
|
|
203
|
+
userSelect: 'none',
|
|
204
|
+
};
|
|
205
|
+
|
|
206
|
+
return (
|
|
207
|
+
<g>
|
|
208
|
+
<rect
|
|
209
|
+
x={0}
|
|
210
|
+
y={0}
|
|
211
|
+
width={width}
|
|
212
|
+
height={height}
|
|
213
|
+
fill="transparent"
|
|
214
|
+
style={brushRectStyle}
|
|
215
|
+
onPointerDown={onPointerDown}
|
|
216
|
+
onPointerMove={onPointerMove}
|
|
217
|
+
onPointerUp={onPointerUp}
|
|
218
|
+
onPointerCancel={onPointerUp}
|
|
219
|
+
/>
|
|
220
|
+
{brush && (rectW > 1 || rectH > 1) && (
|
|
221
|
+
<rect
|
|
222
|
+
x={rectX}
|
|
223
|
+
y={rectY}
|
|
224
|
+
width={rectW}
|
|
225
|
+
height={rectH}
|
|
226
|
+
fill={color}
|
|
227
|
+
fillOpacity={opacity}
|
|
228
|
+
stroke={color}
|
|
229
|
+
strokeWidth={1}
|
|
230
|
+
strokeOpacity={0.4}
|
|
231
|
+
rx={mode === 'xy' ? 2 : 0}
|
|
232
|
+
pointerEvents="none"
|
|
233
|
+
/>
|
|
234
|
+
)}
|
|
235
|
+
</g>
|
|
236
|
+
);
|
|
237
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
// Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
2
|
+
|
|
3
|
+
/** @type {import('../../core/src/docs-types').ComponentDoc} */
|
|
4
|
+
|
|
5
|
+
export const docs = {
|
|
6
|
+
name: 'ChartCandlestick',
|
|
7
|
+
displayName: 'Chart Candlestick',
|
|
8
|
+
group: 'Chart',
|
|
9
|
+
category: 'Data Visualization',
|
|
10
|
+
|
|
11
|
+
usage: {
|
|
12
|
+
description: '',
|
|
13
|
+
},
|
|
14
|
+
|
|
15
|
+
props: [],
|
|
16
|
+
};
|
|
@@ -0,0 +1,186 @@
|
|
|
1
|
+
// Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* @file ChartCandlestick.tsx
|
|
5
|
+
* @output Renders candlestick/box-whisker marks for OHLC or statistical data
|
|
6
|
+
* @position Child of Chart; reads scales from context
|
|
7
|
+
*
|
|
8
|
+
* Two variants:
|
|
9
|
+
* - `'default'` — filled body with whiskers (traditional candlestick/box plot)
|
|
10
|
+
* - `'bar'` — OHLC bar — vertical line with open/close ticks
|
|
11
|
+
*/
|
|
12
|
+
|
|
13
|
+
import {useChart} from './ChartContext';
|
|
14
|
+
import {isBandScale} from './utils';
|
|
15
|
+
|
|
16
|
+
export interface ChartCandlestickProps {
|
|
17
|
+
/** Data key for the high/max value (top of whisker) */
|
|
18
|
+
high: string;
|
|
19
|
+
/** Data key for the low/min value (bottom of whisker) */
|
|
20
|
+
low: string;
|
|
21
|
+
/** Data key for the open/Q1 value (bottom of body) */
|
|
22
|
+
open: string;
|
|
23
|
+
/** Data key for the close/Q3 value (top of body) */
|
|
24
|
+
close: string;
|
|
25
|
+
/**
|
|
26
|
+
* Visual variant:
|
|
27
|
+
* - `'default'` — filled body with whiskers
|
|
28
|
+
* - `'bar'` — OHLC bar — vertical range line, left tick at open, right tick at close
|
|
29
|
+
*/
|
|
30
|
+
variant?: 'default' | 'bar';
|
|
31
|
+
/** Color when close >= open (bullish / positive) */
|
|
32
|
+
upColor?: string;
|
|
33
|
+
/** Color when close < open (bearish / negative) */
|
|
34
|
+
downColor?: string;
|
|
35
|
+
/** Fixed color — overrides up/down logic. Use for box plots. */
|
|
36
|
+
color?: string;
|
|
37
|
+
/** Body width as fraction of band width (default: 0.6) */
|
|
38
|
+
bodyWidth?: number;
|
|
39
|
+
/** Stroke width for whiskers and bar lines */
|
|
40
|
+
strokeWidth?: number;
|
|
41
|
+
/** Corner radius on body (default variant only) */
|
|
42
|
+
radius?: number;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
/**
|
|
46
|
+
* Candlestick / box-whisker marks.
|
|
47
|
+
*
|
|
48
|
+
* @example
|
|
49
|
+
* ```
|
|
50
|
+
* // Financial OHLC
|
|
51
|
+
* <ChartCandlestick
|
|
52
|
+
* high="high" low="low" open="open" close="close"
|
|
53
|
+
* upColor={useChartColors().semantic.positive}
|
|
54
|
+
* downColor={useChartColors().semantic.negative}
|
|
55
|
+
* />
|
|
56
|
+
*
|
|
57
|
+
* // OHLC bar
|
|
58
|
+
* <ChartCandlestick
|
|
59
|
+
* variant="bar"
|
|
60
|
+
* high="max" low="min" open="q1" close="median"
|
|
61
|
+
* color={useChartColors().categorical(1)[0]}
|
|
62
|
+
* />
|
|
63
|
+
* ```
|
|
64
|
+
*/
|
|
65
|
+
export function ChartCandlestick({
|
|
66
|
+
high,
|
|
67
|
+
low,
|
|
68
|
+
open,
|
|
69
|
+
close,
|
|
70
|
+
variant = 'default',
|
|
71
|
+
upColor,
|
|
72
|
+
downColor,
|
|
73
|
+
color,
|
|
74
|
+
bodyWidth = 0.6,
|
|
75
|
+
strokeWidth = 1.5,
|
|
76
|
+
radius = 2,
|
|
77
|
+
}: ChartCandlestickProps) {
|
|
78
|
+
const {data, xKey, xScale, yScale} = useChart();
|
|
79
|
+
|
|
80
|
+
if (!isBandScale(xScale)) {
|
|
81
|
+
return null;
|
|
82
|
+
}
|
|
83
|
+
const bw = xScale.bandwidth();
|
|
84
|
+
|
|
85
|
+
return (
|
|
86
|
+
<g>
|
|
87
|
+
{data.map((d, i) => {
|
|
88
|
+
const xVal = xScale(String(d[xKey]));
|
|
89
|
+
if (xVal == null) {
|
|
90
|
+
return null;
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
const hVal = typeof d[high] === 'number' ? (d[high] as number) : 0;
|
|
94
|
+
const lVal = typeof d[low] === 'number' ? (d[low] as number) : 0;
|
|
95
|
+
const oVal = typeof d[open] === 'number' ? (d[open] as number) : 0;
|
|
96
|
+
const cVal = typeof d[close] === 'number' ? (d[close] as number) : 0;
|
|
97
|
+
|
|
98
|
+
const isUp = cVal >= oVal;
|
|
99
|
+
const fill =
|
|
100
|
+
color ??
|
|
101
|
+
(isUp
|
|
102
|
+
? (upColor ?? 'var(--color-data-categorical-green)')
|
|
103
|
+
: (downColor ?? 'var(--color-data-categorical-red)'));
|
|
104
|
+
const centerX = xVal + bw / 2;
|
|
105
|
+
|
|
106
|
+
const yHigh = yScale(hVal);
|
|
107
|
+
const yLow = yScale(lVal);
|
|
108
|
+
const yOpen = yScale(oVal);
|
|
109
|
+
const yClose = yScale(cVal);
|
|
110
|
+
const bodyTop = Math.min(yOpen, yClose);
|
|
111
|
+
const bodyBot = Math.max(yOpen, yClose);
|
|
112
|
+
|
|
113
|
+
if (variant === 'bar') {
|
|
114
|
+
// OHLC bar: vertical line (high→low), left tick at open, right tick at close
|
|
115
|
+
const tickLen = bw * bodyWidth * 0.4;
|
|
116
|
+
return (
|
|
117
|
+
<g key={i}>
|
|
118
|
+
{/* Vertical range line: high to low */}
|
|
119
|
+
<line
|
|
120
|
+
x1={centerX}
|
|
121
|
+
x2={centerX}
|
|
122
|
+
y1={yHigh}
|
|
123
|
+
y2={yLow}
|
|
124
|
+
stroke={fill}
|
|
125
|
+
strokeWidth={strokeWidth}
|
|
126
|
+
/>
|
|
127
|
+
{/* Open tick — extends left */}
|
|
128
|
+
<line
|
|
129
|
+
x1={centerX - tickLen}
|
|
130
|
+
x2={centerX}
|
|
131
|
+
y1={yOpen}
|
|
132
|
+
y2={yOpen}
|
|
133
|
+
stroke={fill}
|
|
134
|
+
strokeWidth={strokeWidth}
|
|
135
|
+
/>
|
|
136
|
+
{/* Close tick — extends right */}
|
|
137
|
+
<line
|
|
138
|
+
x1={centerX}
|
|
139
|
+
x2={centerX + tickLen}
|
|
140
|
+
y1={yClose}
|
|
141
|
+
y2={yClose}
|
|
142
|
+
stroke={fill}
|
|
143
|
+
strokeWidth={strokeWidth}
|
|
144
|
+
/>
|
|
145
|
+
</g>
|
|
146
|
+
);
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
// Default variant: filled body with whiskers
|
|
150
|
+
const bodyW = bw * bodyWidth;
|
|
151
|
+
const bodyX = centerX - bodyW / 2;
|
|
152
|
+
const bodyH = Math.max(1, bodyBot - bodyTop);
|
|
153
|
+
|
|
154
|
+
return (
|
|
155
|
+
<g key={i}>
|
|
156
|
+
<line
|
|
157
|
+
x1={centerX}
|
|
158
|
+
x2={centerX}
|
|
159
|
+
y1={yHigh}
|
|
160
|
+
y2={bodyTop}
|
|
161
|
+
stroke={fill}
|
|
162
|
+
strokeWidth={strokeWidth}
|
|
163
|
+
/>
|
|
164
|
+
<line
|
|
165
|
+
x1={centerX}
|
|
166
|
+
x2={centerX}
|
|
167
|
+
y1={bodyBot}
|
|
168
|
+
y2={yLow}
|
|
169
|
+
stroke={fill}
|
|
170
|
+
strokeWidth={strokeWidth}
|
|
171
|
+
/>
|
|
172
|
+
<rect
|
|
173
|
+
x={bodyX}
|
|
174
|
+
y={bodyTop}
|
|
175
|
+
width={bodyW}
|
|
176
|
+
height={bodyH}
|
|
177
|
+
fill={fill}
|
|
178
|
+
rx={radius}
|
|
179
|
+
ry={radius}
|
|
180
|
+
/>
|
|
181
|
+
</g>
|
|
182
|
+
);
|
|
183
|
+
})}
|
|
184
|
+
</g>
|
|
185
|
+
);
|
|
186
|
+
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
// Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* @file ChartContext.ts
|
|
5
|
+
* @output React context for sharing scales and dimensions between chart components
|
|
6
|
+
* @position Consumed by Chart (provider) and all child components (consumers)
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
import {createContext, useContext} from 'react';
|
|
10
|
+
import type {ChartContext} from './types';
|
|
11
|
+
|
|
12
|
+
const ChartCtx = createContext<ChartContext | null>(null);
|
|
13
|
+
|
|
14
|
+
export const ChartProvider = ChartCtx.Provider;
|
|
15
|
+
|
|
16
|
+
/** Access the chart context. Throws if used outside <Chart>. */
|
|
17
|
+
export function useChart(): ChartContext {
|
|
18
|
+
const ctx = useContext(ChartCtx);
|
|
19
|
+
if (!ctx) {
|
|
20
|
+
throw new Error('Chart components must be used inside <Chart>');
|
|
21
|
+
}
|
|
22
|
+
return ctx;
|
|
23
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
// Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
2
|
+
|
|
3
|
+
/** @type {import('../../core/src/docs-types').ComponentDoc} */
|
|
4
|
+
|
|
5
|
+
export const docs = {
|
|
6
|
+
name: 'ChartDot',
|
|
7
|
+
displayName: 'Chart Dot',
|
|
8
|
+
group: 'Chart',
|
|
9
|
+
category: 'Data Visualization',
|
|
10
|
+
|
|
11
|
+
usage: {
|
|
12
|
+
description: '',
|
|
13
|
+
},
|
|
14
|
+
|
|
15
|
+
props: [],
|
|
16
|
+
};
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
// Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* @file ChartDot.tsx
|
|
5
|
+
* @output Renders scatter dots for a data key
|
|
6
|
+
* @position Child of Chart; reads scales from context
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
import {useChart} from './ChartContext';
|
|
10
|
+
import {xPixel} from './utils';
|
|
11
|
+
|
|
12
|
+
export interface ChartDotProps {
|
|
13
|
+
/** Which data key for the y values */
|
|
14
|
+
dataKey: string;
|
|
15
|
+
/** Dot fill color */
|
|
16
|
+
color: string;
|
|
17
|
+
/** Dot radius */
|
|
18
|
+
radius?: number;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* Scatter dot marks.
|
|
23
|
+
*
|
|
24
|
+
* @example
|
|
25
|
+
* ```
|
|
26
|
+
* <ChartDot dataKey="outliers" color={useChartColors().categorical(3)[2]} />
|
|
27
|
+
* ```
|
|
28
|
+
*/
|
|
29
|
+
export function ChartDot({dataKey, color, radius = 4}: ChartDotProps) {
|
|
30
|
+
const {data, xKey, xScale, yScale} = useChart();
|
|
31
|
+
|
|
32
|
+
return (
|
|
33
|
+
<g>
|
|
34
|
+
{data.map((d, i) => {
|
|
35
|
+
const x = xPixel(d, xKey, xScale);
|
|
36
|
+
const yVal =
|
|
37
|
+
typeof d[dataKey] === 'number' ? (d[dataKey] as number) : 0;
|
|
38
|
+
return (
|
|
39
|
+
<circle key={i} cx={x} cy={yScale(yVal)} r={radius} fill={color} />
|
|
40
|
+
);
|
|
41
|
+
})}
|
|
42
|
+
</g>
|
|
43
|
+
);
|
|
44
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
// Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
2
|
+
|
|
3
|
+
/** @type {import('../../core/src/docs-types').ComponentDoc} */
|
|
4
|
+
|
|
5
|
+
export const docs = {
|
|
6
|
+
name: 'ChartDotGL',
|
|
7
|
+
displayName: 'Chart Dot GL',
|
|
8
|
+
group: 'Chart',
|
|
9
|
+
category: 'Data Visualization',
|
|
10
|
+
|
|
11
|
+
usage: {
|
|
12
|
+
description: '',
|
|
13
|
+
},
|
|
14
|
+
|
|
15
|
+
props: [],
|
|
16
|
+
};
|
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
// Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* @file ChartDotGL.tsx
|
|
5
|
+
* @output WebGL scatter — single draw call, canvas mounted outside SVG for sharp DPR
|
|
6
|
+
* @position Child of Chart; reads scales from context
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
import {useRef, useEffect, useCallback} from 'react';
|
|
10
|
+
import {useChart} from './ChartContext';
|
|
11
|
+
import {xPixel} from './utils';
|
|
12
|
+
import {
|
|
13
|
+
hexToGL,
|
|
14
|
+
getWebGLContext,
|
|
15
|
+
setupGLState,
|
|
16
|
+
sizeCanvas,
|
|
17
|
+
mountCanvasOverSVG,
|
|
18
|
+
createProgram,
|
|
19
|
+
POINT_SIZE_COMPENSATION,
|
|
20
|
+
} from './webgl';
|
|
21
|
+
|
|
22
|
+
export interface ChartDotGLProps {
|
|
23
|
+
dataKey: string;
|
|
24
|
+
color: string;
|
|
25
|
+
size?: number;
|
|
26
|
+
opacity?: number;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
const VERT = `
|
|
30
|
+
attribute vec2 a_position;
|
|
31
|
+
uniform vec2 u_resolution;
|
|
32
|
+
uniform float u_size;
|
|
33
|
+
varying float v_alpha;
|
|
34
|
+
void main() {
|
|
35
|
+
vec2 clip = (a_position / u_resolution) * 2.0 - 1.0;
|
|
36
|
+
gl_Position = vec4(clip.x, -clip.y, 0.0, 1.0);
|
|
37
|
+
gl_PointSize = u_size * ${POINT_SIZE_COMPENSATION.toFixed(6)};
|
|
38
|
+
v_alpha = 1.0;
|
|
39
|
+
}
|
|
40
|
+
`;
|
|
41
|
+
|
|
42
|
+
const FRAG = `
|
|
43
|
+
precision mediump float;
|
|
44
|
+
uniform vec3 u_color;
|
|
45
|
+
uniform float u_opacity;
|
|
46
|
+
varying float v_alpha;
|
|
47
|
+
void main() {
|
|
48
|
+
float v_alpha_final = u_opacity;
|
|
49
|
+
vec2 coord = gl_PointCoord - vec2(0.5);
|
|
50
|
+
float dist = length(coord);
|
|
51
|
+
if (dist > 0.5) discard;
|
|
52
|
+
float edge = 1.0 - smoothstep(0.48, 0.5, dist);
|
|
53
|
+
float a = v_alpha_final * edge;
|
|
54
|
+
gl_FragColor = vec4(u_color * a, a);
|
|
55
|
+
}
|
|
56
|
+
`;
|
|
57
|
+
|
|
58
|
+
/**
|
|
59
|
+
* WebGL scatter plot. Canvas mounted outside SVG for sharp Retina rendering.
|
|
60
|
+
*
|
|
61
|
+
* @example
|
|
62
|
+
* ```
|
|
63
|
+
* <ChartDotGL dataKey="value" color={colors.categorical(1)[0]} />
|
|
64
|
+
* ```
|
|
65
|
+
*/
|
|
66
|
+
export function ChartDotGL({
|
|
67
|
+
dataKey,
|
|
68
|
+
color,
|
|
69
|
+
size = 6,
|
|
70
|
+
opacity = 0.8,
|
|
71
|
+
}: ChartDotGLProps) {
|
|
72
|
+
const {data, xKey, xScale, yScale, width, height} = useChart();
|
|
73
|
+
const canvasRef = useRef<HTMLCanvasElement | null>(null);
|
|
74
|
+
const glRef = useRef<WebGLRenderingContext | null>(null);
|
|
75
|
+
const programRef = useRef<WebGLProgram | null>(null);
|
|
76
|
+
const markerRef = useRef<SVGGElement>(null);
|
|
77
|
+
|
|
78
|
+
const getPositions = useCallback((): Float32Array => {
|
|
79
|
+
const positions: number[] = [];
|
|
80
|
+
for (const d of data) {
|
|
81
|
+
const x = xPixel(d, xKey, xScale);
|
|
82
|
+
const yVal = typeof d[dataKey] === 'number' ? (d[dataKey] as number) : 0;
|
|
83
|
+
positions.push(x, yScale(yVal));
|
|
84
|
+
}
|
|
85
|
+
return new Float32Array(positions);
|
|
86
|
+
}, [data, xKey, dataKey, xScale, yScale]);
|
|
87
|
+
|
|
88
|
+
// Mount canvas outside SVG
|
|
89
|
+
useEffect(() => {
|
|
90
|
+
const marker = markerRef.current;
|
|
91
|
+
if (!marker) {
|
|
92
|
+
return;
|
|
93
|
+
}
|
|
94
|
+
if (!canvasRef.current) {
|
|
95
|
+
canvasRef.current = document.createElement('canvas');
|
|
96
|
+
}
|
|
97
|
+
return mountCanvasOverSVG(marker, canvasRef.current, width, height);
|
|
98
|
+
}, [width, height]);
|
|
99
|
+
|
|
100
|
+
// Draw
|
|
101
|
+
useEffect(() => {
|
|
102
|
+
const canvas = canvasRef.current;
|
|
103
|
+
if (!canvas || width <= 0 || height <= 0) {
|
|
104
|
+
return;
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
const dpr = sizeCanvas(canvas, width, height);
|
|
108
|
+
|
|
109
|
+
if (!glRef.current) {
|
|
110
|
+
glRef.current = getWebGLContext(canvas);
|
|
111
|
+
}
|
|
112
|
+
const gl = glRef.current;
|
|
113
|
+
if (!gl) {
|
|
114
|
+
return;
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
if (!programRef.current) {
|
|
118
|
+
programRef.current = createProgram(gl, VERT, FRAG);
|
|
119
|
+
}
|
|
120
|
+
const program = programRef.current;
|
|
121
|
+
if (!program) {
|
|
122
|
+
return;
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
gl.viewport(0, 0, canvas.width, canvas.height);
|
|
126
|
+
setupGLState(gl);
|
|
127
|
+
gl.useProgram(program);
|
|
128
|
+
|
|
129
|
+
const positions = getPositions();
|
|
130
|
+
const posBuffer = gl.createBuffer();
|
|
131
|
+
gl.bindBuffer(gl.ARRAY_BUFFER, posBuffer);
|
|
132
|
+
gl.bufferData(gl.ARRAY_BUFFER, positions, gl.STATIC_DRAW);
|
|
133
|
+
const aPos = gl.getAttribLocation(program, 'a_position');
|
|
134
|
+
gl.enableVertexAttribArray(aPos);
|
|
135
|
+
gl.vertexAttribPointer(aPos, 2, gl.FLOAT, false, 0, 0);
|
|
136
|
+
|
|
137
|
+
const [r, g, b] = hexToGL(color);
|
|
138
|
+
gl.uniform2f(gl.getUniformLocation(program, 'u_resolution'), width, height);
|
|
139
|
+
gl.uniform3f(gl.getUniformLocation(program, 'u_color'), r, g, b);
|
|
140
|
+
gl.uniform1f(gl.getUniformLocation(program, 'u_size'), size * dpr);
|
|
141
|
+
gl.uniform1f(gl.getUniformLocation(program, 'u_opacity'), opacity);
|
|
142
|
+
|
|
143
|
+
gl.drawArrays(gl.POINTS, 0, positions.length / 2);
|
|
144
|
+
gl.deleteBuffer(posBuffer);
|
|
145
|
+
}, [width, height, color, size, opacity, getPositions]);
|
|
146
|
+
|
|
147
|
+
if (width <= 0 || height <= 0) {
|
|
148
|
+
return null;
|
|
149
|
+
}
|
|
150
|
+
return <g ref={markerRef} />;
|
|
151
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
// Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
2
|
+
|
|
3
|
+
/** @type {import('../../core/src/docs-types').ComponentDoc} */
|
|
4
|
+
|
|
5
|
+
export const docs = {
|
|
6
|
+
name: 'ChartDotGLInteractive',
|
|
7
|
+
displayName: 'Chart Dot GL Interactive',
|
|
8
|
+
group: 'Chart',
|
|
9
|
+
category: 'Data Visualization',
|
|
10
|
+
|
|
11
|
+
usage: {
|
|
12
|
+
description: '',
|
|
13
|
+
},
|
|
14
|
+
|
|
15
|
+
props: [],
|
|
16
|
+
};
|