semiotic 2.0.2 → 3.0.0-beta.1
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/CLAUDE.md +530 -0
- package/README.md +190 -37
- package/ai/cli.js +48 -0
- package/ai/dist/ai/componentRegistry.js +45 -0
- package/ai/dist/ai/mcp-server.js +99 -0
- package/ai/dist/ai/renderHOCToSVG.js +77 -0
- package/ai/dist/src/components/Annotation.js +358 -0
- package/ai/dist/src/components/AnnotationLayer/AnnotationLayer.js +369 -0
- package/ai/dist/src/components/Axis/Axis.js +373 -0
- package/ai/dist/src/components/Axis/axisTitle.js +14 -0
- package/ai/dist/src/components/Axis/index.js +7 -0
- package/ai/dist/src/components/Axis/summaryGraphic.js +37 -0
- package/ai/dist/src/components/Brush.js +84 -0
- package/ai/dist/src/components/DividedLine.js +65 -0
- package/ai/dist/src/components/FacetController.js +259 -0
- package/ai/dist/src/components/Frame.js +139 -0
- package/ai/dist/src/components/InteractionLayer.js +328 -0
- package/ai/dist/src/components/Legend.js +140 -0
- package/ai/dist/src/components/MiniMap.js +75 -0
- package/ai/dist/src/components/MinimapXYFrame.js +99 -0
- package/ai/dist/src/components/NetworkFrame.js +335 -0
- package/ai/dist/src/components/OrdinalFrame.js +437 -0
- package/ai/dist/src/components/ResponsiveFrame.js +68 -0
- package/ai/dist/src/components/ResponsiveMinimapXYFrame.js +11 -0
- package/ai/dist/src/components/ResponsiveNetworkFrame.js +11 -0
- package/ai/dist/src/components/ResponsiveOrdinalFrame.js +11 -0
- package/ai/dist/src/components/ResponsiveXYFrame.js +10 -0
- package/ai/dist/src/components/SparkFrame.js +113 -0
- package/ai/dist/src/components/SparkNetworkFrame.js +11 -0
- package/ai/dist/src/components/SparkOrdinalFrame.js +11 -0
- package/ai/dist/src/components/SparkXYFrame.js +11 -0
- package/ai/dist/src/components/Tooltip/Tooltip.js +304 -0
- package/ai/dist/src/components/TooltipPositioner/index.js +132 -0
- package/ai/dist/src/components/VisualizationLayer.js +395 -0
- package/ai/dist/src/components/XYFrame.js +524 -0
- package/ai/dist/src/components/annotationLayerBehavior/annotationHandling.js +73 -0
- package/ai/dist/src/components/annotationLayerBehavior/d3labeler.js +254 -0
- package/ai/dist/src/components/annotationRules/baseRules.js +150 -0
- package/ai/dist/src/components/annotationRules/networkframeRules.js +198 -0
- package/ai/dist/src/components/annotationRules/orframeRules.js +695 -0
- package/ai/dist/src/components/annotationRules/xyframeRules.js +299 -0
- package/ai/dist/src/components/batchWork.js +35 -0
- package/ai/dist/src/components/charts/index.js +96 -0
- package/ai/dist/src/components/charts/network/ChordDiagram.js +245 -0
- package/ai/dist/src/components/charts/network/CirclePack.js +177 -0
- package/ai/dist/src/components/charts/network/ForceDirectedGraph.js +248 -0
- package/ai/dist/src/components/charts/network/SankeyDiagram.js +305 -0
- package/ai/dist/src/components/charts/network/TreeDiagram.js +268 -0
- package/ai/dist/src/components/charts/network/Treemap.js +177 -0
- package/ai/dist/src/components/charts/ordinal/BarChart.js +191 -0
- package/ai/dist/src/components/charts/ordinal/BoxPlot.js +235 -0
- package/ai/dist/src/components/charts/ordinal/DonutChart.js +178 -0
- package/ai/dist/src/components/charts/ordinal/DotPlot.js +194 -0
- package/ai/dist/src/components/charts/ordinal/GroupedBarChart.js +194 -0
- package/ai/dist/src/components/charts/ordinal/PieChart.js +155 -0
- package/ai/dist/src/components/charts/ordinal/StackedBarChart.js +213 -0
- package/ai/dist/src/components/charts/ordinal/SwarmPlot.js +219 -0
- package/ai/dist/src/components/charts/realtime/RealtimeBarChart.js +91 -0
- package/ai/dist/src/components/charts/realtime/RealtimeLineChart.js +73 -0
- package/ai/dist/src/components/charts/realtime/RealtimeSwarmChart.js +85 -0
- package/ai/dist/src/components/charts/realtime/RealtimeWaterfallChart.js +86 -0
- package/ai/dist/src/components/charts/shared/ChartError.js +72 -0
- package/ai/dist/src/components/charts/shared/colorUtils.js +138 -0
- package/ai/dist/src/components/charts/shared/formatUtils.js +176 -0
- package/ai/dist/src/components/charts/shared/hooks.js +49 -0
- package/ai/dist/src/components/charts/shared/legendUtils.js +57 -0
- package/ai/dist/src/components/charts/shared/types.js +2 -0
- package/ai/dist/src/components/charts/shared/validateChartData.js +82 -0
- package/ai/dist/src/components/charts/shared/validateProps.js +640 -0
- package/ai/dist/src/components/charts/xy/AreaChart.js +220 -0
- package/ai/dist/src/components/charts/xy/BubbleChart.js +222 -0
- package/ai/dist/src/components/charts/xy/Heatmap.js +230 -0
- package/ai/dist/src/components/charts/xy/LineChart.js +302 -0
- package/ai/dist/src/components/charts/xy/Scatterplot.js +136 -0
- package/ai/dist/src/components/charts/xy/StackedAreaChart.js +220 -0
- package/ai/dist/src/components/constants/coordinateNames.js +11 -0
- package/ai/dist/src/components/constants/frame_props.js +251 -0
- package/ai/dist/src/components/constants/jsx.js +71 -0
- package/ai/dist/src/components/data/dataFunctions.js +473 -0
- package/ai/dist/src/components/data/multiAccessorUtils.js +14 -0
- package/ai/dist/src/components/data/networkPipelineCache.js +43 -0
- package/ai/dist/src/components/data/ordinalPipelineCache.js +53 -0
- package/ai/dist/src/components/data/unflowedFunctions.js +5 -0
- package/ai/dist/src/components/data/xyPipelineCache.js +49 -0
- package/ai/dist/src/components/generic_utilities/functions.js +5 -0
- package/ai/dist/src/components/index.js +145 -0
- package/ai/dist/src/components/interactionLayerBehavior/InteractionCanvas.js +128 -0
- package/ai/dist/src/components/processing/InteractionItems.js +223 -0
- package/ai/dist/src/components/processing/hierarchyUtils.js +104 -0
- package/ai/dist/src/components/processing/layouts/chordLayout.js +58 -0
- package/ai/dist/src/components/processing/layouts/forceLayout.js +142 -0
- package/ai/dist/src/components/processing/layouts/hierarchyLayout.js +31 -0
- package/ai/dist/src/components/processing/layouts/index.js +32 -0
- package/ai/dist/src/components/processing/layouts/sankeyLayout.js +96 -0
- package/ai/dist/src/components/processing/layouts/simpleLayouts.js +34 -0
- package/ai/dist/src/components/processing/layouts/types.js +2 -0
- package/ai/dist/src/components/processing/network.js +771 -0
- package/ai/dist/src/components/processing/networkDefaults.js +39 -0
- package/ai/dist/src/components/processing/networkLayoutHelpers.js +98 -0
- package/ai/dist/src/components/processing/ordinal.js +889 -0
- package/ai/dist/src/components/processing/ordinalConstants.js +23 -0
- package/ai/dist/src/components/processing/ordinalOverlays.js +88 -0
- package/ai/dist/src/components/processing/ordinalRenderPipeline.js +196 -0
- package/ai/dist/src/components/processing/xyDrawing.js +484 -0
- package/ai/dist/src/components/realtime/BinAccumulator.js +36 -0
- package/ai/dist/src/components/realtime/IncrementalExtent.js +55 -0
- package/ai/dist/src/components/realtime/RealtimeFrame.js +710 -0
- package/ai/dist/src/components/realtime/RingBuffer.js +104 -0
- package/ai/dist/src/components/realtime/renderers/barRenderer.js +133 -0
- package/ai/dist/src/components/realtime/renderers/candlestickRenderer.js +7 -0
- package/ai/dist/src/components/realtime/renderers/lineRenderer.js +164 -0
- package/ai/dist/src/components/realtime/renderers/swarmRenderer.js +91 -0
- package/ai/dist/src/components/realtime/renderers/types.js +2 -0
- package/ai/dist/src/components/realtime/renderers/waterfallRenderer.js +163 -0
- package/ai/dist/src/components/realtime/types.js +2 -0
- package/ai/dist/src/components/semiotic-ai.js +66 -0
- package/ai/dist/src/components/semiotic-network.js +30 -0
- package/ai/dist/src/components/semiotic-ordinal.js +28 -0
- package/ai/dist/src/components/semiotic-realtime.js +37 -0
- package/ai/dist/src/components/semiotic-server.js +8 -0
- package/ai/dist/src/components/semiotic-xy.js +41 -0
- package/ai/dist/src/components/semiotic.js +101 -0
- package/ai/dist/src/components/server/renderToStaticSVG.js +392 -0
- package/ai/dist/src/components/store/TooltipStore.js +13 -0
- package/ai/dist/src/components/store/createStore.js +77 -0
- package/ai/dist/src/components/svg/SvgHelper.js +308 -0
- package/ai/dist/src/components/svg/areaDrawing.js +312 -0
- package/ai/dist/src/components/svg/boxplotRenderer.js +441 -0
- package/ai/dist/src/components/svg/bucketizedRenderer.js +677 -0
- package/ai/dist/src/components/svg/ckbinsRenderer.js +92 -0
- package/ai/dist/src/components/svg/ckmeans.js +238 -0
- package/ai/dist/src/components/svg/contourLayout.js +73 -0
- package/ai/dist/src/components/svg/contourRenderer.js +53 -0
- package/ai/dist/src/components/svg/edgeGenerators.js +181 -0
- package/ai/dist/src/components/svg/frameFunctions.js +579 -0
- package/ai/dist/src/components/svg/graphAlgorithms.js +138 -0
- package/ai/dist/src/components/svg/hexbinLayout.js +163 -0
- package/ai/dist/src/components/svg/lineDrawing.js +427 -0
- package/ai/dist/src/components/svg/networkDrawing.js +207 -0
- package/ai/dist/src/components/svg/nodeGenerators.js +131 -0
- package/ai/dist/src/components/svg/pieceDrawing.js +110 -0
- package/ai/dist/src/components/svg/pieceLayouts.js +588 -0
- package/ai/dist/src/components/svg/sankeyLinks.js +143 -0
- package/ai/dist/src/components/svg/summaryAxis.js +48 -0
- package/ai/dist/src/components/svg/summaryLayouts.js +202 -0
- package/ai/dist/src/components/svg/swarmLayout.js +128 -0
- package/ai/dist/src/components/types/annotationTypes.js +2 -0
- package/ai/dist/src/components/types/canvasTypes.js +2 -0
- package/ai/dist/src/components/types/generalTypes.js +2 -0
- package/ai/dist/src/components/types/interactionTypes.js +2 -0
- package/ai/dist/src/components/types/legendTypes.js +2 -0
- package/ai/dist/src/components/types/networkTypes.js +2 -0
- package/ai/dist/src/components/types/ordinalTypes.js +2 -0
- package/ai/dist/src/components/types/xyTypes.js +2 -0
- package/ai/dist/src/components/useBoundingRect.js +24 -0
- package/ai/dist/src/components/useDerivedStateFromProps.js +25 -0
- package/ai/dist/src/components/useLegacyUnmountCallback.js +21 -0
- package/ai/dist/src/components/visualizationLayerBehavior/axis.js +249 -0
- package/ai/dist/src/components/visualizationLayerBehavior/general.js +435 -0
- package/ai/dist/src/setupTests.js +4 -0
- package/ai/examples.md +394 -0
- package/ai/schema.json +1178 -0
- package/ai/system-prompt.md +38 -0
- package/dist/Annotation.d.ts +3 -0
- package/dist/AnnotationLayer/AnnotationLayer.d.ts +25 -0
- package/dist/Axis/Axis.d.ts +7 -0
- package/dist/Axis/axisTitle.d.ts +10 -0
- package/dist/Axis/index.d.ts +2 -0
- package/dist/Axis/summaryGraphic.d.ts +17 -0
- package/dist/Brush.d.ts +12 -0
- package/dist/DividedLine.d.ts +16 -0
- package/dist/FacetController.d.ts +12 -0
- package/dist/Frame.d.ts +2 -0
- package/dist/InteractionLayer.d.ts +3 -0
- package/dist/Legend.d.ts +3 -0
- package/dist/MiniMap.d.ts +14 -0
- package/dist/MinimapXYFrame.d.ts +10 -0
- package/dist/NetworkFrame.d.ts +8 -0
- package/dist/OrdinalFrame.d.ts +8 -0
- package/dist/ResponsiveFrame.d.ts +22 -0
- package/dist/ResponsiveMinimapXYFrame.d.ts +3 -0
- package/dist/ResponsiveNetworkFrame.d.ts +3 -0
- package/dist/ResponsiveOrdinalFrame.d.ts +3 -0
- package/dist/ResponsiveXYFrame.d.ts +3 -0
- package/dist/SparkFrame.d.ts +14 -0
- package/dist/SparkNetworkFrame.d.ts +5 -0
- package/dist/SparkOrdinalFrame.d.ts +5 -0
- package/dist/SparkXYFrame.d.ts +5 -0
- package/dist/Tooltip/Tooltip.d.ts +141 -0
- package/dist/TooltipPositioner/index.d.ts +7 -0
- package/dist/VisualizationLayer.d.ts +33 -0
- package/dist/XYFrame.d.ts +8 -0
- package/dist/annotationLayerBehavior/annotationHandling.d.ts +19 -0
- package/dist/annotationLayerBehavior/d3labeler.d.ts +9 -0
- package/dist/annotationRules/baseRules.d.ts +25 -0
- package/dist/annotationRules/networkframeRules.d.ts +48 -0
- package/dist/annotationRules/orframeRules.d.ts +103 -0
- package/dist/annotationRules/xyframeRules.d.ts +117 -0
- package/dist/batchWork.d.ts +6 -0
- package/dist/charts/index.d.ts +62 -0
- package/dist/charts/network/ChordDiagram.d.ts +181 -0
- package/dist/charts/network/CirclePack.d.ts +103 -0
- package/dist/charts/network/ForceDirectedGraph.d.ts +192 -0
- package/dist/charts/network/SankeyDiagram.d.ts +195 -0
- package/dist/charts/network/TreeDiagram.d.ts +200 -0
- package/dist/charts/network/Treemap.d.ts +98 -0
- package/dist/charts/ordinal/BarChart.d.ts +119 -0
- package/dist/charts/ordinal/BoxPlot.d.ts +125 -0
- package/dist/charts/ordinal/DonutChart.d.ts +95 -0
- package/dist/charts/ordinal/DotPlot.d.ts +128 -0
- package/dist/charts/ordinal/GroupedBarChart.d.ts +113 -0
- package/dist/charts/ordinal/PieChart.d.ts +83 -0
- package/dist/charts/ordinal/StackedBarChart.d.ts +119 -0
- package/dist/charts/ordinal/SwarmPlot.d.ts +137 -0
- package/dist/charts/realtime/RealtimeBarChart.d.ts +102 -0
- package/dist/charts/realtime/RealtimeLineChart.d.ts +78 -0
- package/dist/charts/realtime/RealtimeSwarmChart.d.ts +88 -0
- package/dist/charts/realtime/RealtimeWaterfallChart.d.ts +85 -0
- package/dist/charts/shared/ChartError.d.ts +19 -0
- package/dist/charts/shared/colorUtils.d.ts +62 -0
- package/dist/charts/shared/formatUtils.d.ts +82 -0
- package/dist/charts/shared/hooks.d.ts +20 -0
- package/dist/charts/shared/legendUtils.d.ts +32 -0
- package/dist/charts/shared/types.d.ts +58 -0
- package/dist/charts/shared/validateChartData.d.ts +41 -0
- package/dist/charts/shared/validateProps.d.ts +18 -0
- package/dist/charts/xy/AreaChart.d.ts +127 -0
- package/dist/charts/xy/BubbleChart.d.ts +157 -0
- package/dist/charts/xy/Heatmap.d.ts +153 -0
- package/dist/charts/xy/LineChart.d.ts +193 -0
- package/dist/charts/xy/Scatterplot.d.ts +50 -0
- package/dist/charts/xy/StackedAreaChart.d.ts +131 -0
- package/dist/constants/coordinateNames.d.ts +8 -0
- package/dist/constants/frame_props.d.ts +13 -0
- package/dist/constants/jsx.d.ts +19 -0
- package/dist/data/dataFunctions.d.ts +45 -0
- package/dist/data/multiAccessorUtils.d.ts +1 -0
- package/dist/data/networkPipelineCache.d.ts +27 -0
- package/dist/data/ordinalPipelineCache.d.ts +33 -0
- package/dist/data/unflowedFunctions.d.ts +1 -0
- package/dist/data/xyPipelineCache.d.ts +35 -0
- package/dist/generic_utilities/functions.d.ts +1 -0
- package/dist/index.d.ts +133 -0
- package/dist/interactionLayerBehavior/InteractionCanvas.d.ts +20 -0
- package/dist/network.js +8520 -0
- package/dist/network.js.map +1 -0
- package/dist/network.min.js +1 -0
- package/dist/network.module.js +8484 -0
- package/dist/network.module.js.map +1 -0
- package/dist/network.module.min.js +1 -0
- package/dist/ordinal.js +9276 -0
- package/dist/ordinal.js.map +1 -0
- package/dist/ordinal.min.js +1 -0
- package/dist/ordinal.module.js +9242 -0
- package/dist/ordinal.module.js.map +1 -0
- package/dist/ordinal.module.min.js +1 -0
- package/dist/processing/InteractionItems.d.ts +13 -0
- package/dist/processing/hierarchyUtils.d.ts +16 -0
- package/dist/processing/layouts/chordLayout.d.ts +2 -0
- package/dist/processing/layouts/forceLayout.d.ts +3 -0
- package/dist/processing/layouts/hierarchyLayout.d.ts +10 -0
- package/dist/processing/layouts/index.d.ts +8 -0
- package/dist/processing/layouts/sankeyLayout.d.ts +8 -0
- package/dist/processing/layouts/simpleLayouts.d.ts +7 -0
- package/dist/processing/layouts/types.d.ts +17 -0
- package/dist/processing/network.d.ts +111 -0
- package/dist/processing/networkDefaults.d.ts +36 -0
- package/dist/processing/networkLayoutHelpers.d.ts +54 -0
- package/dist/processing/ordinal.d.ts +102 -0
- package/dist/processing/ordinalConstants.d.ts +33 -0
- package/dist/processing/ordinalOverlays.d.ts +33 -0
- package/dist/processing/ordinalRenderPipeline.d.ts +148 -0
- package/dist/processing/xyDrawing.d.ts +140 -0
- package/dist/realtime/BinAccumulator.d.ts +8 -0
- package/dist/realtime/IncrementalExtent.d.ts +13 -0
- package/dist/realtime/RealtimeFrame.d.ts +4 -0
- package/dist/realtime/RingBuffer.d.ts +19 -0
- package/dist/realtime/renderers/barRenderer.d.ts +2 -0
- package/dist/realtime/renderers/candlestickRenderer.d.ts +2 -0
- package/dist/realtime/renderers/lineRenderer.d.ts +2 -0
- package/dist/realtime/renderers/swarmRenderer.d.ts +2 -0
- package/dist/realtime/renderers/types.d.ts +9 -0
- package/dist/realtime/renderers/waterfallRenderer.d.ts +3 -0
- package/dist/realtime/types.d.ts +113 -0
- package/dist/realtime.js +1598 -0
- package/dist/realtime.js.map +1 -0
- package/dist/realtime.min.js +1 -0
- package/dist/realtime.module.js +1566 -0
- package/dist/realtime.module.js.map +1 -0
- package/dist/realtime.module.min.js +1 -0
- package/dist/semiotic-ai.d.ts +28 -0
- package/dist/semiotic-ai.js +18722 -0
- package/dist/semiotic-ai.js.map +1 -0
- package/dist/semiotic-ai.min.js +1 -0
- package/dist/semiotic-ai.module.js +18668 -0
- package/dist/semiotic-ai.module.js.map +1 -0
- package/dist/semiotic-ai.module.min.js +1 -0
- package/dist/semiotic-network.d.ts +19 -0
- package/dist/semiotic-ordinal.d.ts +18 -0
- package/dist/semiotic-realtime.d.ts +23 -0
- package/dist/semiotic-server.d.ts +1 -0
- package/dist/semiotic-xy.d.ts +24 -0
- package/dist/semiotic.d.ts +51 -0
- package/dist/semiotic.js +18723 -12996
- package/dist/semiotic.js.map +1 -0
- package/dist/semiotic.min.js +1 -0
- package/dist/semiotic.module.js +18666 -12965
- package/dist/semiotic.module.js.map +1 -0
- package/dist/semiotic.module.min.js +1 -0
- package/dist/server/renderToStaticSVG.d.ts +9 -0
- package/dist/server.js +8360 -0
- package/dist/server.js.map +1 -0
- package/dist/server.min.js +1 -0
- package/dist/server.module.js +8331 -0
- package/dist/server.module.js.map +1 -0
- package/dist/server.module.min.js +1 -0
- package/dist/store/TooltipStore.d.ts +2 -0
- package/dist/store/createStore.d.ts +1 -0
- package/dist/svg/SvgHelper.d.ts +33 -0
- package/dist/svg/areaDrawing.d.ts +21 -0
- package/dist/svg/boxplotRenderer.d.ts +15 -0
- package/dist/svg/bucketizedRenderer.d.ts +16 -0
- package/dist/svg/ckbinsRenderer.d.ts +20 -0
- package/dist/svg/ckmeans.d.ts +69 -0
- package/dist/svg/contourLayout.d.ts +6 -0
- package/dist/svg/contourRenderer.d.ts +12 -0
- package/dist/svg/edgeGenerators.d.ts +51 -0
- package/dist/svg/frameFunctions.d.ts +108 -0
- package/dist/svg/graphAlgorithms.d.ts +14 -0
- package/dist/svg/hexbinLayout.d.ts +7 -0
- package/dist/svg/lineDrawing.d.ts +99 -0
- package/dist/svg/networkDrawing.d.ts +16 -0
- package/dist/svg/nodeGenerators.d.ts +58 -0
- package/dist/svg/pieceDrawing.d.ts +12 -0
- package/dist/svg/pieceLayouts.d.ts +53 -0
- package/dist/svg/sankeyLinks.d.ts +3 -0
- package/dist/svg/summaryAxis.d.ts +6 -0
- package/dist/svg/summaryLayouts.d.ts +53 -0
- package/dist/svg/swarmLayout.d.ts +13 -0
- package/dist/types/annotationTypes.d.ts +135 -0
- package/dist/types/canvasTypes.d.ts +9 -0
- package/dist/types/generalTypes.d.ts +238 -0
- package/dist/types/interactionTypes.d.ts +72 -0
- package/dist/types/legendTypes.d.ts +20 -0
- package/dist/types/networkTypes.d.ts +175 -0
- package/dist/types/ordinalTypes.d.ts +112 -0
- package/dist/types/xyTypes.d.ts +115 -0
- package/dist/useBoundingRect.d.ts +2 -0
- package/dist/useDerivedStateFromProps.d.ts +1 -0
- package/dist/useLegacyUnmountCallback.d.ts +2 -0
- package/dist/visualizationLayerBehavior/axis.d.ts +36 -0
- package/dist/visualizationLayerBehavior/general.d.ts +80 -0
- package/dist/xy.js +7944 -0
- package/dist/xy.js.map +1 -0
- package/dist/xy.min.js +1 -0
- package/dist/xy.module.js +7903 -0
- package/dist/xy.module.js.map +1 -0
- package/dist/xy.module.min.js +1 -0
- package/package.json +116 -65
|
@@ -0,0 +1,305 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
"use strict";
|
|
3
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
4
|
+
if (k2 === undefined) k2 = k;
|
|
5
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
6
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
7
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
8
|
+
}
|
|
9
|
+
Object.defineProperty(o, k2, desc);
|
|
10
|
+
}) : (function(o, m, k, k2) {
|
|
11
|
+
if (k2 === undefined) k2 = k;
|
|
12
|
+
o[k2] = m[k];
|
|
13
|
+
}));
|
|
14
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
15
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
16
|
+
}) : function(o, v) {
|
|
17
|
+
o["default"] = v;
|
|
18
|
+
});
|
|
19
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
20
|
+
var ownKeys = function(o) {
|
|
21
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
22
|
+
var ar = [];
|
|
23
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
24
|
+
return ar;
|
|
25
|
+
};
|
|
26
|
+
return ownKeys(o);
|
|
27
|
+
};
|
|
28
|
+
return function (mod) {
|
|
29
|
+
if (mod && mod.__esModule) return mod;
|
|
30
|
+
var result = {};
|
|
31
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
32
|
+
__setModuleDefault(result, mod);
|
|
33
|
+
return result;
|
|
34
|
+
};
|
|
35
|
+
})();
|
|
36
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
37
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
38
|
+
};
|
|
39
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
40
|
+
exports.SankeyDiagram = SankeyDiagram;
|
|
41
|
+
const React = __importStar(require("react"));
|
|
42
|
+
const react_1 = require("react");
|
|
43
|
+
const NetworkFrame_1 = __importDefault(require("../../NetworkFrame"));
|
|
44
|
+
const colorUtils_1 = require("../shared/colorUtils");
|
|
45
|
+
const Tooltip_1 = require("../../Tooltip/Tooltip");
|
|
46
|
+
const hooks_1 = require("../shared/hooks");
|
|
47
|
+
const ChartError_1 = __importDefault(require("../shared/ChartError"));
|
|
48
|
+
const validateChartData_1 = require("../shared/validateChartData");
|
|
49
|
+
const sankeyLayout_1 = require("../../processing/layouts/sankeyLayout");
|
|
50
|
+
/**
|
|
51
|
+
* SankeyDiagram - Visualize flow and magnitude of movement between nodes
|
|
52
|
+
*
|
|
53
|
+
* A simplified wrapper around NetworkFrame for creating Sankey diagrams.
|
|
54
|
+
* Perfect for showing material, energy, cost, or any other quantity
|
|
55
|
+
* flowing through a system.
|
|
56
|
+
*
|
|
57
|
+
* @example
|
|
58
|
+
* ```tsx
|
|
59
|
+
* // Simple Sankey diagram
|
|
60
|
+
* <SankeyDiagram
|
|
61
|
+
* edges={[
|
|
62
|
+
* {source: 'A', target: 'B', value: 100},
|
|
63
|
+
* {source: 'A', target: 'C', value: 50},
|
|
64
|
+
* {source: 'B', target: 'D', value: 80}
|
|
65
|
+
* ]}
|
|
66
|
+
* />
|
|
67
|
+
* ```
|
|
68
|
+
*
|
|
69
|
+
* @example
|
|
70
|
+
* ```tsx
|
|
71
|
+
* // With custom styling and orientation
|
|
72
|
+
* <SankeyDiagram
|
|
73
|
+
* edges={edges}
|
|
74
|
+
* nodes={nodes}
|
|
75
|
+
* colorBy="category"
|
|
76
|
+
* edgeColorBy="gradient"
|
|
77
|
+
* orientation="vertical"
|
|
78
|
+
* nodeAlign="center"
|
|
79
|
+
* />
|
|
80
|
+
* ```
|
|
81
|
+
*
|
|
82
|
+
* @example
|
|
83
|
+
* ```tsx
|
|
84
|
+
* // With sorting and padding
|
|
85
|
+
* <SankeyDiagram
|
|
86
|
+
* edges={edges}
|
|
87
|
+
* nodeWidth={20}
|
|
88
|
+
* nodePaddingRatio={0.1}
|
|
89
|
+
* edgeSort={(a, b) => b.value - a.value}
|
|
90
|
+
* />
|
|
91
|
+
* ```
|
|
92
|
+
*
|
|
93
|
+
* @remarks
|
|
94
|
+
* This component wraps {@link NetworkFrame} with sensible defaults for Sankey diagrams.
|
|
95
|
+
* Sankey diagrams are used for directed acyclic graphs (DAGs).
|
|
96
|
+
*
|
|
97
|
+
* **Data Requirements:**
|
|
98
|
+
* - Edges must have source, target, and value properties
|
|
99
|
+
* - Graph should be acyclic (no cycles)
|
|
100
|
+
* - If cycles are detected, consider using a force-directed layout instead
|
|
101
|
+
*
|
|
102
|
+
* **Breadcrumb to advanced usage:**
|
|
103
|
+
* - Use the `frameProps` prop to pass any NetworkFrame prop
|
|
104
|
+
* - See NetworkFrame documentation: https://semiotic.nteract.io/guides/network-frame
|
|
105
|
+
* - All NetworkFrame props are available via `frameProps`
|
|
106
|
+
* - For circular Sankey diagrams, use the `customSankey` prop via frameProps
|
|
107
|
+
*
|
|
108
|
+
* @param props - SankeyDiagram configuration
|
|
109
|
+
* @returns Rendered Sankey diagram
|
|
110
|
+
*/
|
|
111
|
+
function SankeyDiagram(props) {
|
|
112
|
+
const { nodes, edges, width = 800, height = 600, margin = { top: 50, bottom: 50, left: 50, right: 50 }, className, title, sourceAccessor = "source", targetAccessor = "target", valueAccessor = "value", nodeIdAccessor = "id", colorBy, colorScheme = "category10", edgeColorBy = "source", orientation = "horizontal", nodeAlign = "justify", nodePaddingRatio = 0.05, nodeWidth = 15, nodeLabel, showLabels = true, enableHover = true, edgeOpacity = 0.5, edgeSort, tooltip, frameProps = {} } = props;
|
|
113
|
+
// Safe data defaults (hooks must always run)
|
|
114
|
+
const safeEdges = edges || [];
|
|
115
|
+
// Infer nodes from edges if not provided
|
|
116
|
+
const inferredNodes = (0, react_1.useMemo)(() => {
|
|
117
|
+
if (nodes && nodes.length > 0)
|
|
118
|
+
return nodes;
|
|
119
|
+
const nodeSet = new Set();
|
|
120
|
+
safeEdges.forEach((edge) => {
|
|
121
|
+
const sourceId = typeof sourceAccessor === "function"
|
|
122
|
+
? sourceAccessor(edge)
|
|
123
|
+
: edge[sourceAccessor];
|
|
124
|
+
const targetId = typeof targetAccessor === "function"
|
|
125
|
+
? targetAccessor(edge)
|
|
126
|
+
: edge[targetAccessor];
|
|
127
|
+
nodeSet.add(sourceId);
|
|
128
|
+
nodeSet.add(targetId);
|
|
129
|
+
});
|
|
130
|
+
return Array.from(nodeSet).map((id) => ({ id }));
|
|
131
|
+
}, [nodes, safeEdges, sourceAccessor, targetAccessor]);
|
|
132
|
+
// Create color scale if colorBy is specified
|
|
133
|
+
const colorScale = (0, hooks_1.useColorScale)(inferredNodes, colorBy, colorScheme);
|
|
134
|
+
// Node style function
|
|
135
|
+
const nodeStyle = (0, react_1.useMemo)(() => {
|
|
136
|
+
return (d) => {
|
|
137
|
+
const baseStyle = {
|
|
138
|
+
stroke: "black",
|
|
139
|
+
strokeWidth: 1
|
|
140
|
+
};
|
|
141
|
+
// Apply color
|
|
142
|
+
if (colorBy) {
|
|
143
|
+
baseStyle.fill = (0, colorUtils_1.getColor)(d, colorBy, colorScale);
|
|
144
|
+
}
|
|
145
|
+
else {
|
|
146
|
+
// Default color
|
|
147
|
+
baseStyle.fill = "#4d430c";
|
|
148
|
+
}
|
|
149
|
+
return baseStyle;
|
|
150
|
+
};
|
|
151
|
+
}, [colorBy, colorScale]);
|
|
152
|
+
// Edge style function
|
|
153
|
+
const edgeStyle = (0, react_1.useMemo)(() => {
|
|
154
|
+
return (d) => {
|
|
155
|
+
const baseStyle = {
|
|
156
|
+
stroke: "black",
|
|
157
|
+
strokeWidth: 0.5,
|
|
158
|
+
fillOpacity: edgeOpacity,
|
|
159
|
+
strokeOpacity: 0.3
|
|
160
|
+
};
|
|
161
|
+
// Apply color based on edge coloring strategy
|
|
162
|
+
if (typeof edgeColorBy === "function") {
|
|
163
|
+
baseStyle.fill = edgeColorBy(d);
|
|
164
|
+
}
|
|
165
|
+
else if (edgeColorBy === "source") {
|
|
166
|
+
if (colorBy && d.source) {
|
|
167
|
+
baseStyle.fill = (0, colorUtils_1.getColor)(d.source, colorBy, colorScale);
|
|
168
|
+
}
|
|
169
|
+
else if (d.source) {
|
|
170
|
+
baseStyle.fill = nodeStyle(d.source).fill;
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
else if (edgeColorBy === "target") {
|
|
174
|
+
if (colorBy && d.target) {
|
|
175
|
+
baseStyle.fill = (0, colorUtils_1.getColor)(d.target, colorBy, colorScale);
|
|
176
|
+
}
|
|
177
|
+
else if (d.target) {
|
|
178
|
+
baseStyle.fill = nodeStyle(d.target).fill;
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
else if (edgeColorBy === "gradient") {
|
|
182
|
+
// For gradient, use a semi-transparent gray
|
|
183
|
+
// (actual gradients would require SVG gradient definitions)
|
|
184
|
+
baseStyle.fill = "#999";
|
|
185
|
+
baseStyle.fillOpacity = edgeOpacity * 0.7;
|
|
186
|
+
}
|
|
187
|
+
return baseStyle;
|
|
188
|
+
};
|
|
189
|
+
}, [edgeColorBy, colorBy, colorScale, nodeStyle, edgeOpacity]);
|
|
190
|
+
// Node label function
|
|
191
|
+
const nodeLabelFn = (0, react_1.useMemo)(() => {
|
|
192
|
+
if (!showLabels)
|
|
193
|
+
return undefined;
|
|
194
|
+
const accessor = nodeLabel || nodeIdAccessor;
|
|
195
|
+
return (d) => {
|
|
196
|
+
if (typeof accessor === "function")
|
|
197
|
+
return accessor(d);
|
|
198
|
+
return d[accessor];
|
|
199
|
+
};
|
|
200
|
+
}, [showLabels, nodeLabel, nodeIdAccessor]);
|
|
201
|
+
// Build network type configuration
|
|
202
|
+
const networkType = (0, react_1.useMemo)(() => {
|
|
203
|
+
const config = {
|
|
204
|
+
type: "sankey",
|
|
205
|
+
orient: nodeAlign,
|
|
206
|
+
direction: orientation === "horizontal" ? undefined : "down",
|
|
207
|
+
nodePaddingRatio,
|
|
208
|
+
nodeWidth
|
|
209
|
+
};
|
|
210
|
+
if (edgeSort) {
|
|
211
|
+
config.edgeSort = edgeSort;
|
|
212
|
+
}
|
|
213
|
+
return config;
|
|
214
|
+
}, [nodeAlign, orientation, nodePaddingRatio, nodeWidth, edgeSort]);
|
|
215
|
+
// Tooltip content renderer for Sankey nodes and edges
|
|
216
|
+
const renderTooltip = (0, react_1.useMemo)(() => {
|
|
217
|
+
return (d) => {
|
|
218
|
+
const isEdge = !!d.edge || (d.source && d.target && !d.degree && d.degree !== 0);
|
|
219
|
+
if (isEdge) {
|
|
220
|
+
const sourceId = d.source?.id ?? d.edge?.source?.id ?? "?";
|
|
221
|
+
const targetId = d.target?.id ?? d.edge?.target?.id ?? "?";
|
|
222
|
+
const val = d.value ?? d.weight;
|
|
223
|
+
return (React.createElement("div", { className: "semiotic-tooltip", style: Tooltip_1.defaultTooltipStyle },
|
|
224
|
+
React.createElement("div", { style: { fontWeight: "bold" } },
|
|
225
|
+
sourceId,
|
|
226
|
+
" \u2192 ",
|
|
227
|
+
targetId),
|
|
228
|
+
val != null && (React.createElement("div", { style: { marginTop: 4 } },
|
|
229
|
+
"Value: ",
|
|
230
|
+
typeof val === "number" ? val.toLocaleString() : String(val)))));
|
|
231
|
+
}
|
|
232
|
+
// Node tooltip
|
|
233
|
+
const accessor = nodeIdAccessor;
|
|
234
|
+
const nodeId = typeof accessor === "function"
|
|
235
|
+
? accessor(d)
|
|
236
|
+
: d[accessor] ?? d.id;
|
|
237
|
+
const val = d.value;
|
|
238
|
+
return (React.createElement("div", { className: "semiotic-tooltip", style: Tooltip_1.defaultTooltipStyle },
|
|
239
|
+
React.createElement("div", { style: { fontWeight: "bold" } }, String(nodeId)),
|
|
240
|
+
val != null && (React.createElement("div", { style: { marginTop: 4 } },
|
|
241
|
+
"Total: ",
|
|
242
|
+
typeof val === "number" ? val.toLocaleString() : String(val))),
|
|
243
|
+
d.degree != null && (React.createElement("div", { style: { marginTop: 2 } },
|
|
244
|
+
"Degree: ",
|
|
245
|
+
d.degree,
|
|
246
|
+
d.inDegree != null ? ` (${d.inDegree} in, ${d.outDegree} out)` : ""))));
|
|
247
|
+
};
|
|
248
|
+
}, [nodeIdAccessor]);
|
|
249
|
+
// Use htmlAnnotationRules to handle frame-hover annotations directly.
|
|
250
|
+
// This is checked before tooltipContent in the annotation pipeline,
|
|
251
|
+
// ensuring the custom Sankey tooltip always renders.
|
|
252
|
+
const tooltipFn = typeof tooltip === "function" ? tooltip : renderTooltip;
|
|
253
|
+
const htmlAnnotationRules = (0, react_1.useMemo)(() => {
|
|
254
|
+
return ({ d, i, adjustedSize }) => {
|
|
255
|
+
if (d.type !== "frame-hover")
|
|
256
|
+
return null;
|
|
257
|
+
const flipped = adjustedSize && d.x > adjustedSize[0] / 2;
|
|
258
|
+
const tooltipStyle = {
|
|
259
|
+
position: "absolute",
|
|
260
|
+
top: `${d.y}px`
|
|
261
|
+
};
|
|
262
|
+
if (flipped) {
|
|
263
|
+
tooltipStyle.right = `${adjustedSize[0] - d.x}px`;
|
|
264
|
+
}
|
|
265
|
+
else {
|
|
266
|
+
tooltipStyle.left = `${d.x}px`;
|
|
267
|
+
}
|
|
268
|
+
return (React.createElement("div", { key: `network-annotation-label-${i}`, className: `annotation annotation-network-label ${d.className || ""}`, style: tooltipStyle }, tooltipFn(d)));
|
|
269
|
+
};
|
|
270
|
+
}, [tooltipFn]);
|
|
271
|
+
// Validate data (after all hooks)
|
|
272
|
+
const error = (0, validateChartData_1.validateNetworkData)({
|
|
273
|
+
componentName: "SankeyDiagram",
|
|
274
|
+
edges,
|
|
275
|
+
edgesRequired: true,
|
|
276
|
+
});
|
|
277
|
+
if (error)
|
|
278
|
+
return React.createElement(ChartError_1.default, { componentName: "SankeyDiagram", message: error, width: width, height: height });
|
|
279
|
+
// Build NetworkFrame props
|
|
280
|
+
const networkFrameProps = {
|
|
281
|
+
size: [width, height],
|
|
282
|
+
nodes: inferredNodes,
|
|
283
|
+
edges: safeEdges,
|
|
284
|
+
nodeStyle,
|
|
285
|
+
edgeStyle,
|
|
286
|
+
nodeIDAccessor: nodeIdAccessor,
|
|
287
|
+
sourceAccessor,
|
|
288
|
+
targetAccessor,
|
|
289
|
+
edgeWidthAccessor: valueAccessor,
|
|
290
|
+
networkType,
|
|
291
|
+
hoverAnnotation: enableHover,
|
|
292
|
+
margin,
|
|
293
|
+
nodeSizeAccessor: () => 5, // Small size for hover target
|
|
294
|
+
...(nodeLabelFn && { nodeLabels: nodeLabelFn }),
|
|
295
|
+
...(className && { className }),
|
|
296
|
+
...(title && { title }),
|
|
297
|
+
// Use htmlAnnotationRules for direct tooltip rendering (checked before tooltipContent)
|
|
298
|
+
htmlAnnotationRules,
|
|
299
|
+
// Allow frameProps to override defaults
|
|
300
|
+
transition: true,
|
|
301
|
+
...frameProps,
|
|
302
|
+
_layoutMap: { sankey: sankeyLayout_1.sankeyLayout, flowchart: sankeyLayout_1.sankeyLayout }
|
|
303
|
+
};
|
|
304
|
+
return React.createElement(NetworkFrame_1.default, { ...networkFrameProps });
|
|
305
|
+
}
|
|
@@ -0,0 +1,268 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
"use strict";
|
|
3
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
4
|
+
if (k2 === undefined) k2 = k;
|
|
5
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
6
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
7
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
8
|
+
}
|
|
9
|
+
Object.defineProperty(o, k2, desc);
|
|
10
|
+
}) : (function(o, m, k, k2) {
|
|
11
|
+
if (k2 === undefined) k2 = k;
|
|
12
|
+
o[k2] = m[k];
|
|
13
|
+
}));
|
|
14
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
15
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
16
|
+
}) : function(o, v) {
|
|
17
|
+
o["default"] = v;
|
|
18
|
+
});
|
|
19
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
20
|
+
var ownKeys = function(o) {
|
|
21
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
22
|
+
var ar = [];
|
|
23
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
24
|
+
return ar;
|
|
25
|
+
};
|
|
26
|
+
return ownKeys(o);
|
|
27
|
+
};
|
|
28
|
+
return function (mod) {
|
|
29
|
+
if (mod && mod.__esModule) return mod;
|
|
30
|
+
var result = {};
|
|
31
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
32
|
+
__setModuleDefault(result, mod);
|
|
33
|
+
return result;
|
|
34
|
+
};
|
|
35
|
+
})();
|
|
36
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
37
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
38
|
+
};
|
|
39
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
40
|
+
exports.TreeDiagram = TreeDiagram;
|
|
41
|
+
const React = __importStar(require("react"));
|
|
42
|
+
const react_1 = require("react");
|
|
43
|
+
const NetworkFrame_1 = __importDefault(require("../../NetworkFrame"));
|
|
44
|
+
const colorUtils_1 = require("../shared/colorUtils");
|
|
45
|
+
const Tooltip_1 = require("../../Tooltip/Tooltip");
|
|
46
|
+
const hooks_1 = require("../shared/hooks");
|
|
47
|
+
const ChartError_1 = __importDefault(require("../shared/ChartError"));
|
|
48
|
+
const validateChartData_1 = require("../shared/validateChartData");
|
|
49
|
+
const hierarchyLayout_1 = require("../../processing/layouts/hierarchyLayout");
|
|
50
|
+
/**
|
|
51
|
+
* TreeDiagram - Visualize hierarchical data structures
|
|
52
|
+
*
|
|
53
|
+
* A simplified wrapper around NetworkFrame for creating tree diagrams.
|
|
54
|
+
* Perfect for organizational charts, file systems, taxonomies, and
|
|
55
|
+
* any hierarchical data.
|
|
56
|
+
*
|
|
57
|
+
* @example
|
|
58
|
+
* ```tsx
|
|
59
|
+
* // Simple tree
|
|
60
|
+
* <TreeDiagram
|
|
61
|
+
* data={{
|
|
62
|
+
* name: 'Root',
|
|
63
|
+
* children: [
|
|
64
|
+
* {name: 'A', children: [{name: 'A1'}, {name: 'A2'}]},
|
|
65
|
+
* {name: 'B'}
|
|
66
|
+
* ]
|
|
67
|
+
* }}
|
|
68
|
+
* />
|
|
69
|
+
* ```
|
|
70
|
+
*
|
|
71
|
+
* @example
|
|
72
|
+
* ```tsx
|
|
73
|
+
* // Horizontal cluster (dendrogram)
|
|
74
|
+
* <TreeDiagram
|
|
75
|
+
* data={hierarchicalData}
|
|
76
|
+
* layout="cluster"
|
|
77
|
+
* orientation="horizontal"
|
|
78
|
+
* colorByDepth={true}
|
|
79
|
+
* />
|
|
80
|
+
* ```
|
|
81
|
+
*
|
|
82
|
+
* @example
|
|
83
|
+
* ```tsx
|
|
84
|
+
* // Radial tree
|
|
85
|
+
* <TreeDiagram
|
|
86
|
+
* data={hierarchicalData}
|
|
87
|
+
* layout="tree"
|
|
88
|
+
* orientation="radial"
|
|
89
|
+
* colorBy="category"
|
|
90
|
+
* nodeSize={8}
|
|
91
|
+
* />
|
|
92
|
+
* ```
|
|
93
|
+
*
|
|
94
|
+
* @example
|
|
95
|
+
* ```tsx
|
|
96
|
+
* // Treemap with sizing
|
|
97
|
+
* <TreeDiagram
|
|
98
|
+
* data={hierarchicalData}
|
|
99
|
+
* layout="treemap"
|
|
100
|
+
* valueAccessor="size"
|
|
101
|
+
* colorBy="type"
|
|
102
|
+
* />
|
|
103
|
+
* ```
|
|
104
|
+
*
|
|
105
|
+
* @example
|
|
106
|
+
* ```tsx
|
|
107
|
+
* // Circle pack
|
|
108
|
+
* <TreeDiagram
|
|
109
|
+
* data={hierarchicalData}
|
|
110
|
+
* layout="circlepack"
|
|
111
|
+
* valueAccessor="value"
|
|
112
|
+
* colorByDepth={true}
|
|
113
|
+
* />
|
|
114
|
+
* ```
|
|
115
|
+
*
|
|
116
|
+
* @remarks
|
|
117
|
+
* This component wraps {@link NetworkFrame} with sensible defaults for tree diagrams.
|
|
118
|
+
* Different layouts are suited for different use cases:
|
|
119
|
+
* - **tree/cluster**: Good for organizational structures, phylogenetic trees
|
|
120
|
+
* - **treemap**: Good for showing proportional sizes (disk usage, budget allocation)
|
|
121
|
+
* - **partition**: Good for hierarchical proportions (icicle or sunburst charts)
|
|
122
|
+
* - **circlepack**: Good for nested hierarchies with size encoding
|
|
123
|
+
*
|
|
124
|
+
* **Data Requirements:**
|
|
125
|
+
* - Data must be hierarchical JSON with a children property (or custom accessor)
|
|
126
|
+
* - For treemap/circlepack, nodes should have a value property for sizing
|
|
127
|
+
*
|
|
128
|
+
* **Breadcrumb to advanced usage:**
|
|
129
|
+
* - Use the `frameProps` prop to pass any NetworkFrame prop
|
|
130
|
+
* - See NetworkFrame documentation: https://semiotic.nteract.io/guides/network-frame
|
|
131
|
+
* - All NetworkFrame props are available via `frameProps`
|
|
132
|
+
*
|
|
133
|
+
* @param props - TreeDiagram configuration
|
|
134
|
+
* @returns Rendered tree diagram
|
|
135
|
+
*/
|
|
136
|
+
function TreeDiagram(props) {
|
|
137
|
+
const { data, width = 600, height = 600, margin = { top: 50, bottom: 50, left: 50, right: 50 }, className, title, layout = "tree", orientation = "vertical", childrenAccessor = "children", valueAccessor = "value", nodeIdAccessor = "name", colorBy, colorScheme = "category10", colorByDepth = false, edgeStyle = "curve", nodeLabel, showLabels = true, nodeSize = 5, enableHover = true, tooltip, frameProps = {} } = props;
|
|
138
|
+
// Flatten hierarchy to get all nodes for color scale
|
|
139
|
+
const allNodes = (0, react_1.useMemo)(() => {
|
|
140
|
+
if (!data)
|
|
141
|
+
return [];
|
|
142
|
+
const nodes = [];
|
|
143
|
+
const traverse = (node) => {
|
|
144
|
+
nodes.push(node);
|
|
145
|
+
const children = typeof childrenAccessor === "function"
|
|
146
|
+
? childrenAccessor(node)
|
|
147
|
+
: node[childrenAccessor];
|
|
148
|
+
if (children && Array.isArray(children)) {
|
|
149
|
+
children.forEach(traverse);
|
|
150
|
+
}
|
|
151
|
+
};
|
|
152
|
+
traverse(data);
|
|
153
|
+
return nodes;
|
|
154
|
+
}, [data, childrenAccessor]);
|
|
155
|
+
// Create color scale if colorBy is specified
|
|
156
|
+
const colorScale = (0, react_1.useMemo)(() => {
|
|
157
|
+
if (colorByDepth) {
|
|
158
|
+
// Color by depth level
|
|
159
|
+
return (0, colorUtils_1.createColorScale)(allNodes.map((_, idx) => ({ depth: idx % 5 })), "depth", colorScheme);
|
|
160
|
+
}
|
|
161
|
+
if (!colorBy || typeof colorBy === "function") {
|
|
162
|
+
return undefined;
|
|
163
|
+
}
|
|
164
|
+
const scheme = Array.isArray(colorScheme) ? colorScheme : colorScheme;
|
|
165
|
+
return (0, colorUtils_1.createColorScale)(allNodes, colorBy, scheme);
|
|
166
|
+
}, [allNodes, colorBy, colorByDepth, colorScheme]);
|
|
167
|
+
// Node style function
|
|
168
|
+
const nodeStyleFn = (0, react_1.useMemo)(() => {
|
|
169
|
+
return (d) => {
|
|
170
|
+
const baseStyle = {
|
|
171
|
+
stroke: "black",
|
|
172
|
+
strokeWidth: 1
|
|
173
|
+
};
|
|
174
|
+
// Apply color
|
|
175
|
+
if (colorByDepth) {
|
|
176
|
+
baseStyle.fill = (0, colorUtils_1.getColor)({ depth: d.depth || 0 }, "depth", colorScale);
|
|
177
|
+
}
|
|
178
|
+
else if (colorBy) {
|
|
179
|
+
baseStyle.fill = (0, colorUtils_1.getColor)(d, colorBy, colorScale);
|
|
180
|
+
}
|
|
181
|
+
else {
|
|
182
|
+
// Default color
|
|
183
|
+
baseStyle.fill = hooks_1.DEFAULT_COLOR;
|
|
184
|
+
}
|
|
185
|
+
return baseStyle;
|
|
186
|
+
};
|
|
187
|
+
}, [colorBy, colorByDepth, colorScale]);
|
|
188
|
+
// Edge style function
|
|
189
|
+
const edgeStyleFn = (0, react_1.useMemo)(() => {
|
|
190
|
+
return () => ({
|
|
191
|
+
stroke: "#999",
|
|
192
|
+
strokeWidth: 1,
|
|
193
|
+
fill: "none"
|
|
194
|
+
});
|
|
195
|
+
}, []);
|
|
196
|
+
// Build network type configuration
|
|
197
|
+
const networkType = (0, react_1.useMemo)(() => {
|
|
198
|
+
const config = {
|
|
199
|
+
type: layout
|
|
200
|
+
};
|
|
201
|
+
// Set projection for tree/cluster layouts
|
|
202
|
+
if (layout === "tree" || layout === "cluster") {
|
|
203
|
+
config.projection = orientation;
|
|
204
|
+
}
|
|
205
|
+
// For partition layout, radial creates sunburst
|
|
206
|
+
if (layout === "partition" && orientation === "radial") {
|
|
207
|
+
config.projection = "radial";
|
|
208
|
+
}
|
|
209
|
+
return config;
|
|
210
|
+
}, [layout, orientation]);
|
|
211
|
+
// Hierarchy configuration
|
|
212
|
+
const hierarchyChildren = (0, react_1.useMemo)(() => {
|
|
213
|
+
if (typeof childrenAccessor === "function") {
|
|
214
|
+
return childrenAccessor;
|
|
215
|
+
}
|
|
216
|
+
return (d) => d[childrenAccessor];
|
|
217
|
+
}, [childrenAccessor]);
|
|
218
|
+
const hierarchySum = (0, react_1.useMemo)(() => {
|
|
219
|
+
// For layouts that need sizing (treemap, circlepack, partition)
|
|
220
|
+
if (layout === "treemap" ||
|
|
221
|
+
layout === "circlepack" ||
|
|
222
|
+
layout === "partition") {
|
|
223
|
+
if (typeof valueAccessor === "function") {
|
|
224
|
+
return valueAccessor;
|
|
225
|
+
}
|
|
226
|
+
return (d) => d[valueAccessor] || 1;
|
|
227
|
+
}
|
|
228
|
+
return undefined;
|
|
229
|
+
}, [layout, valueAccessor]);
|
|
230
|
+
// Validate data (after all hooks)
|
|
231
|
+
const error = (0, validateChartData_1.validateObjectData)({
|
|
232
|
+
componentName: "TreeDiagram",
|
|
233
|
+
data,
|
|
234
|
+
});
|
|
235
|
+
if (error)
|
|
236
|
+
return React.createElement(ChartError_1.default, { componentName: "TreeDiagram", message: error, width: width, height: height });
|
|
237
|
+
if (layout === "treemap") {
|
|
238
|
+
console.info("TreeDiagram: Consider using the standalone <Treemap> component for treemap visualizations.");
|
|
239
|
+
}
|
|
240
|
+
else if (layout === "circlepack") {
|
|
241
|
+
console.info("TreeDiagram: Consider using the standalone <CirclePack> component for circle packing visualizations.");
|
|
242
|
+
}
|
|
243
|
+
// Build NetworkFrame props
|
|
244
|
+
const networkFrameProps = {
|
|
245
|
+
size: [width, height],
|
|
246
|
+
edges: data, // For hierarchical data, pass to edges
|
|
247
|
+
nodeStyle: nodeStyleFn,
|
|
248
|
+
edgeStyle: edgeStyleFn,
|
|
249
|
+
nodeIDAccessor: nodeIdAccessor,
|
|
250
|
+
networkType,
|
|
251
|
+
hoverAnnotation: enableHover,
|
|
252
|
+
margin,
|
|
253
|
+
nodeSizeAccessor: () => nodeSize,
|
|
254
|
+
...(hierarchyChildren && {
|
|
255
|
+
hierarchyChildren: hierarchyChildren
|
|
256
|
+
}),
|
|
257
|
+
...(hierarchySum && { hierarchySum: hierarchySum }),
|
|
258
|
+
...(className && { className }),
|
|
259
|
+
...(title && { title }),
|
|
260
|
+
// Add tooltip support
|
|
261
|
+
...(tooltip && { tooltipContent: (0, Tooltip_1.normalizeTooltip)(tooltip) }),
|
|
262
|
+
// Allow frameProps to override defaults
|
|
263
|
+
transition: true,
|
|
264
|
+
...frameProps,
|
|
265
|
+
_layoutMap: hierarchyLayout_1.hierarchyLayouts
|
|
266
|
+
};
|
|
267
|
+
return React.createElement(NetworkFrame_1.default, { ...networkFrameProps });
|
|
268
|
+
}
|