@fusedashlabs/widgets 0.2.0 → 0.3.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/CHANGELOG.md +72 -17
- package/README.md +24 -26
- package/dist/components/area-chart/element/ui9000-area-chart.d.ts +1 -1
- package/dist/components/area-grouped-bar-chart/element/ui9000-area-grouped-bar-chart.d.ts +1 -1
- package/dist/components/area-grouped-bar-chart/lib/normalize.js +3 -3
- package/dist/components/area-grouped-bar-chart/lib/normalize.js.map +1 -1
- package/dist/components/bar-chart/element/ui9000-bar-chart.d.ts +1 -1
- package/dist/components/bias-variance-tradeoff-chart/element/styles.d.ts +7 -0
- package/dist/components/bias-variance-tradeoff-chart/element/styles.d.ts.map +1 -0
- package/dist/components/bias-variance-tradeoff-chart/element/styles.js +13 -0
- package/dist/components/bias-variance-tradeoff-chart/element/styles.js.map +1 -0
- package/dist/components/bias-variance-tradeoff-chart/element/ui9000-bias-variance-tradeoff-chart.d.ts +27 -0
- package/dist/components/bias-variance-tradeoff-chart/element/ui9000-bias-variance-tradeoff-chart.d.ts.map +1 -0
- package/dist/components/bias-variance-tradeoff-chart/element/ui9000-bias-variance-tradeoff-chart.js +173 -0
- package/dist/components/bias-variance-tradeoff-chart/element/ui9000-bias-variance-tradeoff-chart.js.map +1 -0
- package/dist/components/bias-variance-tradeoff-chart/index.d.ts +5 -0
- package/dist/components/bias-variance-tradeoff-chart/index.d.ts.map +1 -0
- package/dist/components/bias-variance-tradeoff-chart/index.js +19 -0
- package/dist/components/bias-variance-tradeoff-chart/index.js.map +1 -0
- package/dist/components/bias-variance-tradeoff-chart/lib/domain.d.ts +8 -0
- package/dist/components/bias-variance-tradeoff-chart/lib/domain.d.ts.map +1 -0
- package/dist/components/bias-variance-tradeoff-chart/lib/domain.js +37 -0
- package/dist/components/bias-variance-tradeoff-chart/lib/domain.js.map +1 -0
- package/dist/components/bias-variance-tradeoff-chart/lib/format.d.ts +3 -0
- package/dist/components/bias-variance-tradeoff-chart/lib/format.d.ts.map +1 -0
- package/dist/components/bias-variance-tradeoff-chart/lib/format.js +9 -0
- package/dist/components/bias-variance-tradeoff-chart/lib/format.js.map +1 -0
- package/dist/components/bias-variance-tradeoff-chart/lib/index.d.ts +5 -0
- package/dist/components/bias-variance-tradeoff-chart/lib/index.d.ts.map +1 -0
- package/dist/components/bias-variance-tradeoff-chart/lib/normalize.d.ts +4 -0
- package/dist/components/bias-variance-tradeoff-chart/lib/normalize.d.ts.map +1 -0
- package/dist/components/bias-variance-tradeoff-chart/lib/normalize.js +135 -0
- package/dist/components/bias-variance-tradeoff-chart/lib/normalize.js.map +1 -0
- package/dist/components/bias-variance-tradeoff-chart/lib/types.d.ts +47 -0
- package/dist/components/bias-variance-tradeoff-chart/lib/types.d.ts.map +1 -0
- package/dist/components/bias-variance-tradeoff-chart/metadata.json.d.ts +41 -0
- package/dist/components/bias-variance-tradeoff-chart/metadata.json.js +42 -0
- package/dist/components/bias-variance-tradeoff-chart/metadata.json.js.map +1 -0
- package/dist/components/bias-variance-tradeoff-chart/render/draw.d.ts +31 -0
- package/dist/components/bias-variance-tradeoff-chart/render/draw.d.ts.map +1 -0
- package/dist/components/bias-variance-tradeoff-chart/render/draw.js +203 -0
- package/dist/components/bias-variance-tradeoff-chart/render/draw.js.map +1 -0
- package/dist/components/bias-variance-tradeoff-chart/render/index.d.ts +2 -0
- package/dist/components/bias-variance-tradeoff-chart/render/index.d.ts.map +1 -0
- package/dist/components/box-plot-chart/element/ui9000-box-plot-chart.d.ts +1 -1
- package/dist/components/bubble-chart/element/ui9000-bubble-chart.d.ts +1 -1
- package/dist/components/chart-renderer/lib/registry.d.ts.map +1 -1
- package/dist/components/chart-renderer/lib/registry.js +12 -0
- package/dist/components/chart-renderer/lib/registry.js.map +1 -1
- package/dist/components/donut-chart/element/ui9000-donut-chart.d.ts +1 -1
- package/dist/components/donut-group-chart/element/ui9000-donut-group-chart.d.ts +1 -1
- package/dist/components/gini-impurity-entropy-chart/element/styles.d.ts +2 -0
- package/dist/components/gini-impurity-entropy-chart/element/styles.d.ts.map +1 -0
- package/dist/components/gini-impurity-entropy-chart/element/styles.js +72 -0
- package/dist/components/gini-impurity-entropy-chart/element/styles.js.map +1 -0
- package/dist/components/gini-impurity-entropy-chart/element/ui9000-gini-impurity-entropy-chart.d.ts +36 -0
- package/dist/components/gini-impurity-entropy-chart/element/ui9000-gini-impurity-entropy-chart.d.ts.map +1 -0
- package/dist/components/gini-impurity-entropy-chart/element/ui9000-gini-impurity-entropy-chart.js +186 -0
- package/dist/components/gini-impurity-entropy-chart/element/ui9000-gini-impurity-entropy-chart.js.map +1 -0
- package/dist/components/gini-impurity-entropy-chart/index.d.ts +5 -0
- package/dist/components/gini-impurity-entropy-chart/index.d.ts.map +1 -0
- package/dist/components/gini-impurity-entropy-chart/index.js +32 -0
- package/dist/components/gini-impurity-entropy-chart/index.js.map +1 -0
- package/dist/components/gini-impurity-entropy-chart/lib/domain.d.ts +9 -0
- package/dist/components/gini-impurity-entropy-chart/lib/domain.d.ts.map +1 -0
- package/dist/components/gini-impurity-entropy-chart/lib/domain.js +32 -0
- package/dist/components/gini-impurity-entropy-chart/lib/domain.js.map +1 -0
- package/dist/components/gini-impurity-entropy-chart/lib/format.d.ts +10 -0
- package/dist/components/gini-impurity-entropy-chart/lib/format.d.ts.map +1 -0
- package/dist/components/gini-impurity-entropy-chart/lib/format.js +22 -0
- package/dist/components/gini-impurity-entropy-chart/lib/format.js.map +1 -0
- package/dist/components/gini-impurity-entropy-chart/lib/index.d.ts +7 -0
- package/dist/components/gini-impurity-entropy-chart/lib/index.d.ts.map +1 -0
- package/dist/components/gini-impurity-entropy-chart/lib/normalize.d.ts +7 -0
- package/dist/components/gini-impurity-entropy-chart/lib/normalize.d.ts.map +1 -0
- package/dist/components/gini-impurity-entropy-chart/lib/normalize.js +117 -0
- package/dist/components/gini-impurity-entropy-chart/lib/normalize.js.map +1 -0
- package/dist/components/gini-impurity-entropy-chart/lib/overlays.d.ts +19 -0
- package/dist/components/gini-impurity-entropy-chart/lib/overlays.d.ts.map +1 -0
- package/dist/components/gini-impurity-entropy-chart/lib/overlays.js +63 -0
- package/dist/components/gini-impurity-entropy-chart/lib/overlays.js.map +1 -0
- package/dist/components/gini-impurity-entropy-chart/lib/series.d.ts +12 -0
- package/dist/components/gini-impurity-entropy-chart/lib/series.d.ts.map +1 -0
- package/dist/components/gini-impurity-entropy-chart/lib/series.js +45 -0
- package/dist/components/gini-impurity-entropy-chart/lib/series.js.map +1 -0
- package/dist/components/gini-impurity-entropy-chart/lib/types.d.ts +83 -0
- package/dist/components/gini-impurity-entropy-chart/lib/types.d.ts.map +1 -0
- package/dist/components/gini-impurity-entropy-chart/lib/types.js +19 -0
- package/dist/components/gini-impurity-entropy-chart/lib/types.js.map +1 -0
- package/dist/components/gini-impurity-entropy-chart/metadata.json.d.ts +115 -0
- package/dist/components/gini-impurity-entropy-chart/metadata.json.js +42 -0
- package/dist/components/gini-impurity-entropy-chart/metadata.json.js.map +1 -0
- package/dist/components/gini-impurity-entropy-chart/render/draw.d.ts +40 -0
- package/dist/components/gini-impurity-entropy-chart/render/draw.d.ts.map +1 -0
- package/dist/components/gini-impurity-entropy-chart/render/draw.js +160 -0
- package/dist/components/gini-impurity-entropy-chart/render/draw.js.map +1 -0
- package/dist/components/gini-impurity-entropy-chart/render/index.d.ts +2 -0
- package/dist/components/gini-impurity-entropy-chart/render/index.d.ts.map +1 -0
- package/dist/components/histogram-chart/element/ui9000-histogram-chart.d.ts +1 -1
- package/dist/components/kpi-widget/element/ui9000-kpi-widget.d.ts +1 -1
- package/dist/components/kpi-widget/element/ui9000-kpi-widget.js +1 -1
- package/dist/components/line-chart/element/ui9000-line-chart.d.ts +1 -1
- package/dist/components/lollipop/element/ui9000-lollipop.d.ts +1 -1
- package/dist/components/network-graph/element/styles.d.ts +2 -0
- package/dist/components/network-graph/element/styles.d.ts.map +1 -0
- package/dist/components/network-graph/element/styles.js +152 -0
- package/dist/components/network-graph/element/styles.js.map +1 -0
- package/dist/components/network-graph/element/ui9000-network-graph.d.ts +43 -0
- package/dist/components/network-graph/element/ui9000-network-graph.d.ts.map +1 -0
- package/dist/components/network-graph/element/ui9000-network-graph.js +230 -0
- package/dist/components/network-graph/element/ui9000-network-graph.js.map +1 -0
- package/dist/components/network-graph/index.d.ts +5 -0
- package/dist/components/network-graph/index.d.ts.map +1 -0
- package/dist/components/network-graph/index.js +37 -0
- package/dist/components/network-graph/index.js.map +1 -0
- package/dist/components/network-graph/lib/domain.d.ts +96 -0
- package/dist/components/network-graph/lib/domain.d.ts.map +1 -0
- package/dist/components/network-graph/lib/domain.js +211 -0
- package/dist/components/network-graph/lib/domain.js.map +1 -0
- package/dist/components/network-graph/lib/format.d.ts +7 -0
- package/dist/components/network-graph/lib/format.d.ts.map +1 -0
- package/dist/components/network-graph/lib/format.js +29 -0
- package/dist/components/network-graph/lib/format.js.map +1 -0
- package/dist/components/network-graph/lib/index.d.ts +5 -0
- package/dist/components/network-graph/lib/index.d.ts.map +1 -0
- package/dist/components/network-graph/lib/normalize.d.ts +10 -0
- package/dist/components/network-graph/lib/normalize.d.ts.map +1 -0
- package/dist/components/network-graph/lib/normalize.js +140 -0
- package/dist/components/network-graph/lib/normalize.js.map +1 -0
- package/dist/components/network-graph/lib/types.d.ts +56 -0
- package/dist/components/network-graph/lib/types.d.ts.map +1 -0
- package/dist/components/network-graph/metadata.json.d.ts +91 -0
- package/dist/components/network-graph/metadata.json.js +42 -0
- package/dist/components/network-graph/metadata.json.js.map +1 -0
- package/dist/components/network-graph/render/draw.d.ts +46 -0
- package/dist/components/network-graph/render/draw.d.ts.map +1 -0
- package/dist/components/network-graph/render/draw.js +468 -0
- package/dist/components/network-graph/render/draw.js.map +1 -0
- package/dist/components/network-graph/render/index.d.ts +2 -0
- package/dist/components/network-graph/render/index.d.ts.map +1 -0
- package/dist/components/parallel-coordinates-chart/element/styles.d.ts +2 -0
- package/dist/components/parallel-coordinates-chart/element/styles.d.ts.map +1 -0
- package/dist/components/parallel-coordinates-chart/element/styles.js +71 -0
- package/dist/components/parallel-coordinates-chart/element/styles.js.map +1 -0
- package/dist/components/parallel-coordinates-chart/element/ui9000-parallel-coordinates-chart.d.ts +33 -0
- package/dist/components/parallel-coordinates-chart/element/ui9000-parallel-coordinates-chart.d.ts.map +1 -0
- package/dist/components/parallel-coordinates-chart/element/ui9000-parallel-coordinates-chart.js +182 -0
- package/dist/components/parallel-coordinates-chart/element/ui9000-parallel-coordinates-chart.js.map +1 -0
- package/dist/components/parallel-coordinates-chart/index.d.ts +5 -0
- package/dist/components/parallel-coordinates-chart/index.d.ts.map +1 -0
- package/dist/components/parallel-coordinates-chart/index.js +23 -0
- package/dist/components/parallel-coordinates-chart/index.js.map +1 -0
- package/dist/components/parallel-coordinates-chart/lib/domain.d.ts +14 -0
- package/dist/components/parallel-coordinates-chart/lib/domain.d.ts.map +1 -0
- package/dist/components/parallel-coordinates-chart/lib/domain.js +28 -0
- package/dist/components/parallel-coordinates-chart/lib/domain.js.map +1 -0
- package/dist/components/parallel-coordinates-chart/lib/format.d.ts +12 -0
- package/dist/components/parallel-coordinates-chart/lib/format.d.ts.map +1 -0
- package/dist/components/parallel-coordinates-chart/lib/format.js +18 -0
- package/dist/components/parallel-coordinates-chart/lib/format.js.map +1 -0
- package/dist/components/parallel-coordinates-chart/lib/index.d.ts +5 -0
- package/dist/components/parallel-coordinates-chart/lib/index.d.ts.map +1 -0
- package/dist/components/parallel-coordinates-chart/lib/normalize.d.ts +23 -0
- package/dist/components/parallel-coordinates-chart/lib/normalize.d.ts.map +1 -0
- package/dist/components/parallel-coordinates-chart/lib/normalize.js +156 -0
- package/dist/components/parallel-coordinates-chart/lib/normalize.js.map +1 -0
- package/dist/components/parallel-coordinates-chart/lib/types.d.ts +48 -0
- package/dist/components/parallel-coordinates-chart/lib/types.d.ts.map +1 -0
- package/dist/components/parallel-coordinates-chart/metadata.json.d.ts +103 -0
- package/dist/components/parallel-coordinates-chart/metadata.json.js +45 -0
- package/dist/components/parallel-coordinates-chart/metadata.json.js.map +1 -0
- package/dist/components/parallel-coordinates-chart/render/draw.d.ts +30 -0
- package/dist/components/parallel-coordinates-chart/render/draw.d.ts.map +1 -0
- package/dist/components/parallel-coordinates-chart/render/draw.js +160 -0
- package/dist/components/parallel-coordinates-chart/render/draw.js.map +1 -0
- package/dist/components/parallel-coordinates-chart/render/index.d.ts +2 -0
- package/dist/components/parallel-coordinates-chart/render/index.d.ts.map +1 -0
- package/dist/components/pie-chart/element/ui9000-pie-chart.d.ts +1 -1
- package/dist/components/polar-area-chart/element/styles.d.ts +2 -0
- package/dist/components/polar-area-chart/element/styles.d.ts.map +1 -0
- package/dist/components/polar-area-chart/element/ui9000-polar-area-chart.d.ts +29 -0
- package/dist/components/polar-area-chart/element/ui9000-polar-area-chart.d.ts.map +1 -0
- package/dist/components/polar-area-chart/element/ui9000-polar-area-chart.js +167 -0
- package/dist/components/polar-area-chart/element/ui9000-polar-area-chart.js.map +1 -0
- package/dist/components/polar-area-chart/index.d.ts +5 -0
- package/dist/components/polar-area-chart/index.d.ts.map +1 -0
- package/dist/components/polar-area-chart/index.js +18 -0
- package/dist/components/polar-area-chart/index.js.map +1 -0
- package/dist/components/polar-area-chart/lib/domain.d.ts +25 -0
- package/dist/components/polar-area-chart/lib/domain.d.ts.map +1 -0
- package/dist/components/polar-area-chart/lib/domain.js +47 -0
- package/dist/components/polar-area-chart/lib/domain.js.map +1 -0
- package/dist/components/polar-area-chart/lib/index.d.ts +4 -0
- package/dist/components/polar-area-chart/lib/index.d.ts.map +1 -0
- package/dist/components/polar-area-chart/lib/normalize.d.ts +4 -0
- package/dist/components/polar-area-chart/lib/normalize.d.ts.map +1 -0
- package/dist/components/polar-area-chart/lib/normalize.js +117 -0
- package/dist/components/polar-area-chart/lib/normalize.js.map +1 -0
- package/dist/components/polar-area-chart/lib/types.d.ts +43 -0
- package/dist/components/polar-area-chart/lib/types.d.ts.map +1 -0
- package/dist/components/polar-area-chart/metadata.json.d.ts +79 -0
- package/dist/components/polar-area-chart/metadata.json.js +42 -0
- package/dist/components/polar-area-chart/metadata.json.js.map +1 -0
- package/dist/components/polar-area-chart/render/draw.d.ts +25 -0
- package/dist/components/polar-area-chart/render/draw.d.ts.map +1 -0
- package/dist/components/polar-area-chart/render/draw.js +127 -0
- package/dist/components/polar-area-chart/render/draw.js.map +1 -0
- package/dist/components/polar-area-chart/render/index.d.ts +2 -0
- package/dist/components/polar-area-chart/render/index.d.ts.map +1 -0
- package/dist/components/punchcard-chart/element/ui9000-punchcard-chart.d.ts +1 -1
- package/dist/components/radar-chart/element/ui9000-radar-chart.d.ts +1 -1
- package/dist/components/radial-bar-chart/element/styles.d.ts +2 -0
- package/dist/components/radial-bar-chart/element/styles.d.ts.map +1 -0
- package/dist/components/radial-bar-chart/element/styles.js +53 -0
- package/dist/components/radial-bar-chart/element/styles.js.map +1 -0
- package/dist/components/radial-bar-chart/element/ui9000-radial-bar-chart.d.ts +35 -0
- package/dist/components/radial-bar-chart/element/ui9000-radial-bar-chart.d.ts.map +1 -0
- package/dist/components/radial-bar-chart/element/ui9000-radial-bar-chart.js +174 -0
- package/dist/components/radial-bar-chart/element/ui9000-radial-bar-chart.js.map +1 -0
- package/dist/components/radial-bar-chart/index.d.ts +5 -0
- package/dist/components/radial-bar-chart/index.d.ts.map +1 -0
- package/dist/components/radial-bar-chart/index.js +21 -0
- package/dist/components/radial-bar-chart/index.js.map +1 -0
- package/dist/components/radial-bar-chart/lib/domain.d.ts +47 -0
- package/dist/components/radial-bar-chart/lib/domain.d.ts.map +1 -0
- package/dist/components/radial-bar-chart/lib/domain.js +50 -0
- package/dist/components/radial-bar-chart/lib/domain.js.map +1 -0
- package/dist/components/radial-bar-chart/lib/format.d.ts +6 -0
- package/dist/components/radial-bar-chart/lib/format.d.ts.map +1 -0
- package/dist/components/radial-bar-chart/lib/format.js +12 -0
- package/dist/components/radial-bar-chart/lib/format.js.map +1 -0
- package/dist/components/radial-bar-chart/lib/index.d.ts +5 -0
- package/dist/components/radial-bar-chart/lib/index.d.ts.map +1 -0
- package/dist/components/radial-bar-chart/lib/normalize.d.ts +4 -0
- package/dist/components/radial-bar-chart/lib/normalize.d.ts.map +1 -0
- package/dist/components/radial-bar-chart/lib/normalize.js +92 -0
- package/dist/components/radial-bar-chart/lib/normalize.js.map +1 -0
- package/dist/components/radial-bar-chart/lib/types.d.ts +34 -0
- package/dist/components/radial-bar-chart/lib/types.d.ts.map +1 -0
- package/dist/components/radial-bar-chart/metadata.json.d.ts +62 -0
- package/dist/components/radial-bar-chart/metadata.json.js +42 -0
- package/dist/components/radial-bar-chart/metadata.json.js.map +1 -0
- package/dist/components/radial-bar-chart/render/draw.d.ts +29 -0
- package/dist/components/radial-bar-chart/render/draw.d.ts.map +1 -0
- package/dist/components/radial-bar-chart/render/draw.js +92 -0
- package/dist/components/radial-bar-chart/render/draw.js.map +1 -0
- package/dist/components/radial-bar-chart/render/index.d.ts +2 -0
- package/dist/components/radial-bar-chart/render/index.d.ts.map +1 -0
- package/dist/components/sankey-chart/element/ui9000-sankey-chart.d.ts +1 -1
- package/dist/components/sankey-chart/element/ui9000-sankey-chart.js +2 -1
- package/dist/components/sankey-chart/element/ui9000-sankey-chart.js.map +1 -1
- package/dist/components/sankey-chart/index.js +4 -2
- package/dist/components/sankey-chart/index.js.map +1 -1
- package/dist/components/sankey-chart/lib/domain.d.ts +2 -2
- package/dist/components/sankey-chart/lib/domain.d.ts.map +1 -1
- package/dist/components/sankey-chart/lib/domain.js +1 -13
- package/dist/components/sankey-chart/lib/domain.js.map +1 -1
- package/dist/components/sankey-chart/lib/format.d.ts +1 -2
- package/dist/components/sankey-chart/lib/format.d.ts.map +1 -1
- package/dist/components/sankey-chart/lib/format.js +3 -7
- package/dist/components/sankey-chart/lib/format.js.map +1 -1
- package/dist/components/scatter-plot-chart/element/ui9000-scatter-plot.d.ts +1 -1
- package/dist/components/scatter-sparkline-chart/element/ui9000-scatter-sparkline-chart.d.ts +1 -1
- package/dist/components/spark-area-chart/element/ui9000-spark-area-chart.d.ts +1 -1
- package/dist/components/spark-line-chart/element/ui9000-spark-line-chart.d.ts +1 -1
- package/dist/components/step-line-chart/element/ui9000-step-line-chart.d.ts +1 -1
- package/dist/components/violin-chart/element/ui9000-violin-chart.d.ts +1 -1
- package/dist/components/waterfall-chart/element/ui9000-waterfall-chart.d.ts +1 -1
- package/dist/element/ui9000-chart-base.d.ts +2 -2
- package/dist/index.d.ts +14 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +110 -13
- package/dist/index.js.map +1 -1
- package/dist/lazy/bias-variance-tradeoff-chart.d.ts +4 -0
- package/dist/lazy/bias-variance-tradeoff-chart.d.ts.map +1 -0
- package/dist/lazy/bias-variance-tradeoff-chart.js +5 -0
- package/dist/lazy/bias-variance-tradeoff-chart.js.map +1 -0
- package/dist/lazy/gini-impurity-entropy-chart.d.ts +4 -0
- package/dist/lazy/gini-impurity-entropy-chart.d.ts.map +1 -0
- package/dist/lazy/gini-impurity-entropy-chart.js +5 -0
- package/dist/lazy/gini-impurity-entropy-chart.js.map +1 -0
- package/dist/lazy/index.d.ts +7 -1
- package/dist/lazy/index.d.ts.map +1 -1
- package/dist/lazy/index.js +48 -0
- package/dist/lazy/index.js.map +1 -1
- package/dist/lazy/network-graph.d.ts +4 -0
- package/dist/lazy/network-graph.d.ts.map +1 -0
- package/dist/lazy/network-graph.js +5 -0
- package/dist/lazy/network-graph.js.map +1 -0
- package/dist/lazy/parallel-coordinates-chart.d.ts +4 -0
- package/dist/lazy/parallel-coordinates-chart.d.ts.map +1 -0
- package/dist/lazy/parallel-coordinates-chart.js +5 -0
- package/dist/lazy/parallel-coordinates-chart.js.map +1 -0
- package/dist/lazy/polar-area-chart.d.ts +4 -0
- package/dist/lazy/polar-area-chart.d.ts.map +1 -0
- package/dist/lazy/polar-area-chart.js +5 -0
- package/dist/lazy/polar-area-chart.js.map +1 -0
- package/dist/lazy/radial-bar-chart.d.ts +4 -0
- package/dist/lazy/radial-bar-chart.d.ts.map +1 -0
- package/dist/lazy/radial-bar-chart.js +5 -0
- package/dist/lazy/radial-bar-chart.js.map +1 -0
- package/dist/utils/breakpoints.d.ts +7 -0
- package/dist/utils/breakpoints.d.ts.map +1 -0
- package/dist/utils/breakpoints.js +17 -0
- package/dist/utils/breakpoints.js.map +1 -0
- package/dist/utils/chart-helpers.d.ts +21 -0
- package/dist/utils/chart-helpers.d.ts.map +1 -1
- package/dist/utils/chart-helpers.js +54 -0
- package/dist/utils/chart-helpers.js.map +1 -1
- package/dist/utils/format-text.d.ts +17 -0
- package/dist/utils/format-text.d.ts.map +1 -0
- package/dist/utils/format-text.js +26 -0
- package/dist/utils/format-text.js.map +1 -0
- package/dist/utils/fusedash-visual.d.ts +143 -0
- package/dist/utils/fusedash-visual.d.ts.map +1 -1
- package/dist/utils/fusedash-visual.js +114 -1
- package/dist/utils/fusedash-visual.js.map +1 -1
- package/package.json +56 -4
- package/dist/node_modules/.pnpm/lit-html@3.3.3/node_modules/lit-html/directive.js +0 -28
- package/dist/node_modules/.pnpm/lit-html@3.3.3/node_modules/lit-html/directive.js.map +0 -1
- package/dist/node_modules/.pnpm/lit-html@3.3.3/node_modules/lit-html/directives/style-map.js +0 -37
- package/dist/node_modules/.pnpm/lit-html@3.3.3/node_modules/lit-html/directives/style-map.js.map +0 -1
- package/dist/node_modules/.pnpm/lit-html@3.3.3/node_modules/lit-html/lit-html.js +0 -231
- package/dist/node_modules/.pnpm/lit-html@3.3.3/node_modules/lit-html/lit-html.js.map +0 -1
|
@@ -0,0 +1,468 @@
|
|
|
1
|
+
import { drag } from "d3-drag";
|
|
2
|
+
import { forceCenter, forceX, forceY, forceSimulation, forceLink, forceManyBody, forceCollide } from "d3-force";
|
|
3
|
+
import { select } from "d3-selection";
|
|
4
|
+
import { zoom, zoomIdentity } from "d3-zoom";
|
|
5
|
+
import { nodeRadius, NODE_COLORS, LINK_COLORS, LINK_WIDTH, LINK_LABEL_COLORS, shadowRadius, NODE_BORDER_WIDTH, nodeColor, LABEL_ALWAYS_ABOVE, networkForces, NODE_LABEL_COLORS, scaleLinkWidthByMax, INITIAL_NODE_RADIUS_RATIO } from "../lib/domain.js";
|
|
6
|
+
import { formatLinkValue, formatNodeValue } from "../lib/format.js";
|
|
7
|
+
const LABEL_PADDING_TOP = 14;
|
|
8
|
+
const LABEL_PADDING_BOTTOM = 4;
|
|
9
|
+
const LABEL_PADDING_GAP = 5;
|
|
10
|
+
const LABEL_TITLE_SIZE = 12;
|
|
11
|
+
const LABEL_TITLE_LINE = 16;
|
|
12
|
+
const LABEL_VALUE_SIZE = 10;
|
|
13
|
+
const LABEL_VALUE_LINE = 14;
|
|
14
|
+
const LINK_LABEL_SIZE = 8;
|
|
15
|
+
const LINK_LABEL_PAD_X = 2;
|
|
16
|
+
const LINK_LABEL_PAD_Y = 1;
|
|
17
|
+
const LINK_LABEL_OFFSET = 10;
|
|
18
|
+
const DRAG_AREA_PAD = 10;
|
|
19
|
+
const DRAG_SLOP = 5;
|
|
20
|
+
const ZOOM_EXTENT = [0.3, 4];
|
|
21
|
+
const PRESETTLE_TICKS = 250;
|
|
22
|
+
const FIT_PADDING = 32;
|
|
23
|
+
const FIT_SCALE_EXTENT = [0.4, 1.25];
|
|
24
|
+
const GOLDEN_ANGLE = Math.PI * (3 - Math.sqrt(5));
|
|
25
|
+
const GRAPHS = /* @__PURE__ */ new WeakMap();
|
|
26
|
+
let instanceCount = 0;
|
|
27
|
+
function clamp(value, min, max) {
|
|
28
|
+
return Math.max(min, Math.min(max, value));
|
|
29
|
+
}
|
|
30
|
+
function endpointId(end) {
|
|
31
|
+
return typeof end === "string" ? end : end.id;
|
|
32
|
+
}
|
|
33
|
+
function measure(el) {
|
|
34
|
+
if (!el || typeof el.getBBox !== "function") return null;
|
|
35
|
+
try {
|
|
36
|
+
return el.getBBox();
|
|
37
|
+
} catch {
|
|
38
|
+
return null;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
function rimPoint(x, y, towardX, towardY, radius) {
|
|
42
|
+
const dx = towardX - x;
|
|
43
|
+
const dy = towardY - y;
|
|
44
|
+
const distance = Math.sqrt(dx * dx + dy * dy);
|
|
45
|
+
if (distance === 0) return { x, y };
|
|
46
|
+
return { x: x + dx / distance * radius, y: y + dy / distance * radius };
|
|
47
|
+
}
|
|
48
|
+
function stopNetworkGraph(container) {
|
|
49
|
+
const state = GRAPHS.get(container);
|
|
50
|
+
if (!state) return;
|
|
51
|
+
state.controller = null;
|
|
52
|
+
if (!state.simulation) return;
|
|
53
|
+
for (const node of state.simulation.nodes()) {
|
|
54
|
+
if (typeof node.x === "number" && typeof node.y === "number") {
|
|
55
|
+
state.positions.set(node.id, { x: node.x, y: node.y });
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
state.simulation.stop();
|
|
59
|
+
state.simulation = null;
|
|
60
|
+
}
|
|
61
|
+
function updateNetworkGraphVisibility(container, visibleIds) {
|
|
62
|
+
var _a;
|
|
63
|
+
const controller = (_a = GRAPHS.get(container)) == null ? void 0 : _a.controller;
|
|
64
|
+
if (!controller) return false;
|
|
65
|
+
controller.setVisibleIds(visibleIds);
|
|
66
|
+
return true;
|
|
67
|
+
}
|
|
68
|
+
function resizeNetworkGraph(container, width, height) {
|
|
69
|
+
var _a;
|
|
70
|
+
const controller = (_a = GRAPHS.get(container)) == null ? void 0 : _a.controller;
|
|
71
|
+
if (!controller || width <= 0 || height <= 0) return false;
|
|
72
|
+
controller.resize(width, height);
|
|
73
|
+
return true;
|
|
74
|
+
}
|
|
75
|
+
function renderNetworkGraph(container, options) {
|
|
76
|
+
var _a;
|
|
77
|
+
const { model, theme, onSelect } = options;
|
|
78
|
+
let visibleIds = options.visibleIds;
|
|
79
|
+
let width = options.width;
|
|
80
|
+
let height = options.height;
|
|
81
|
+
stopNetworkGraph(container);
|
|
82
|
+
container.replaceChildren();
|
|
83
|
+
if (!model.nodes.length || width <= 0 || height <= 0) return null;
|
|
84
|
+
const positions = ((_a = GRAPHS.get(container)) == null ? void 0 : _a.positions) ?? /* @__PURE__ */ new Map();
|
|
85
|
+
const instance = ++instanceCount;
|
|
86
|
+
const blurId = `ui9000-ng-blur-${instance}`;
|
|
87
|
+
const shadowId = `ui9000-ng-shadow-${instance}`;
|
|
88
|
+
const radiusById = new Map(
|
|
89
|
+
model.nodes.map((node) => [node.id, nodeRadius(node, model.breakpoints)])
|
|
90
|
+
);
|
|
91
|
+
const maxNodeRadius = Math.max(...radiusById.values());
|
|
92
|
+
const simNodes = model.nodes.map((node, index) => {
|
|
93
|
+
const seed = positions.get(node.id) ?? seedPosition(index, model.nodes.length, width, height);
|
|
94
|
+
return { ...node, x: seed.x, y: seed.y };
|
|
95
|
+
});
|
|
96
|
+
const nodeById = new Map(simNodes.map((node) => [node.id, node]));
|
|
97
|
+
const simLinks = model.links.map((link) => ({ ...link }));
|
|
98
|
+
const isNodeVisible = (id) => !visibleIds || visibleIds.has(id);
|
|
99
|
+
const isLinkVisible = (link) => isNodeVisible(endpointId(link.source)) && isNodeVisible(endpointId(link.target));
|
|
100
|
+
const neighbours = /* @__PURE__ */ new Map();
|
|
101
|
+
for (const link of simLinks) {
|
|
102
|
+
const source = endpointId(link.source);
|
|
103
|
+
const target = endpointId(link.target);
|
|
104
|
+
if (!neighbours.has(source)) neighbours.set(source, /* @__PURE__ */ new Set());
|
|
105
|
+
if (!neighbours.has(target)) neighbours.set(target, /* @__PURE__ */ new Set());
|
|
106
|
+
neighbours.get(source).add(target);
|
|
107
|
+
neighbours.get(target).add(source);
|
|
108
|
+
}
|
|
109
|
+
let activeNodeId = options.activeNodeId ?? null;
|
|
110
|
+
let hoveredNodeId = null;
|
|
111
|
+
const svg = select(container).append("svg").attr("width", "100%").attr("height", "100%").attr("viewBox", `0 0 ${width} ${height}`).attr("preserveAspectRatio", "xMidYMid meet").style("display", "block").style("font-family", theme.fontFamily);
|
|
112
|
+
appendDefs(svg, blurId, shadowId);
|
|
113
|
+
const root = svg.append("g").attr("class", "graph-root");
|
|
114
|
+
const linkLayer = root.append("g").attr("class", "link-layer");
|
|
115
|
+
const linkLabelLayer = root.append("g").attr("class", "link-label-layer");
|
|
116
|
+
const nodeLayer = root.append("g").attr("class", "node-layer");
|
|
117
|
+
const links = buildLinks(linkLayer, linkLabelLayer, simLinks);
|
|
118
|
+
const nodes = buildNodes({
|
|
119
|
+
layer: nodeLayer,
|
|
120
|
+
simNodes,
|
|
121
|
+
model,
|
|
122
|
+
radiusById,
|
|
123
|
+
blurId,
|
|
124
|
+
shadowId
|
|
125
|
+
});
|
|
126
|
+
const labelExtent = /* @__PURE__ */ new Map();
|
|
127
|
+
for (const part of nodes) {
|
|
128
|
+
if (!part.alwaysLabelled || !part.labelBg) continue;
|
|
129
|
+
const right = Number(part.labelBg.getAttribute("width")) || 0;
|
|
130
|
+
const half = (Number(part.labelBg.getAttribute("height")) || 0) / 2;
|
|
131
|
+
if (right || half) labelExtent.set(part.datum.id, { right, half });
|
|
132
|
+
}
|
|
133
|
+
const forces = networkForces(width, height, maxNodeRadius);
|
|
134
|
+
const centerForce = forceCenter(width / 2, height / 2).strength(0.1);
|
|
135
|
+
const xForce = forceX(width / 2).strength(0.05);
|
|
136
|
+
const yForce = forceY(height / 2).strength(0.05);
|
|
137
|
+
const simulation = forceSimulation(simNodes).stop().force(
|
|
138
|
+
"link",
|
|
139
|
+
forceLink(simLinks).id((d) => d.id).distance(forces.linkDistance).strength(0.5)
|
|
140
|
+
).force("charge", forceManyBody().strength(forces.charge)).force("center", centerForce).force("collision", forceCollide().radius(forces.collide)).force("x", xForce).force("y", yForce);
|
|
141
|
+
GRAPHS.set(container, { simulation, positions, controller: null });
|
|
142
|
+
const isConnected = (id) => {
|
|
143
|
+
var _a2;
|
|
144
|
+
return !!activeNodeId && activeNodeId !== id && !!((_a2 = neighbours.get(activeNodeId)) == null ? void 0 : _a2.has(id));
|
|
145
|
+
};
|
|
146
|
+
const isLinkActive = (link) => !!activeNodeId && (endpointId(link.source) === activeNodeId || endpointId(link.target) === activeNodeId);
|
|
147
|
+
function updateFrame() {
|
|
148
|
+
for (const node of simNodes) {
|
|
149
|
+
const radius = radiusById.get(node.id) ?? 0;
|
|
150
|
+
node.x = clamp(node.x ?? width / 2, radius, width - radius);
|
|
151
|
+
node.y = clamp(node.y ?? height / 2, radius, height - radius);
|
|
152
|
+
}
|
|
153
|
+
for (const part of links) {
|
|
154
|
+
const source = nodeById.get(endpointId(part.datum.source));
|
|
155
|
+
const target = nodeById.get(endpointId(part.datum.target));
|
|
156
|
+
if (!source || !target) continue;
|
|
157
|
+
const sx = source.x ?? 0;
|
|
158
|
+
const sy = source.y ?? 0;
|
|
159
|
+
const tx = target.x ?? 0;
|
|
160
|
+
const ty = target.y ?? 0;
|
|
161
|
+
const from = rimPoint(sx, sy, tx, ty, radiusById.get(source.id) ?? 0);
|
|
162
|
+
const to = rimPoint(tx, ty, sx, sy, radiusById.get(target.id) ?? 0);
|
|
163
|
+
part.line.setAttribute("x1", String(from.x));
|
|
164
|
+
part.line.setAttribute("y1", String(from.y));
|
|
165
|
+
part.line.setAttribute("x2", String(to.x));
|
|
166
|
+
part.line.setAttribute("y2", String(to.y));
|
|
167
|
+
if (!part.label) continue;
|
|
168
|
+
const show = part.visible && isLinkActive(part.datum);
|
|
169
|
+
part.label.style.opacity = show ? "1" : "0";
|
|
170
|
+
if (!show) continue;
|
|
171
|
+
const angle = Math.atan2(to.y - from.y, to.x - from.x) * 180 / Math.PI;
|
|
172
|
+
const upright = angle > 90 || angle < -90 ? angle + 180 : angle;
|
|
173
|
+
const perpendicular = (angle - 90) * Math.PI / 180;
|
|
174
|
+
const cx = (from.x + to.x) / 2 + Math.cos(perpendicular) * LINK_LABEL_OFFSET;
|
|
175
|
+
const cy = (from.y + to.y) / 2 + Math.sin(perpendicular) * LINK_LABEL_OFFSET;
|
|
176
|
+
part.label.setAttribute("transform", `translate(${cx}, ${cy}) rotate(${upright})`);
|
|
177
|
+
}
|
|
178
|
+
for (const part of nodes) {
|
|
179
|
+
part.group.setAttribute(
|
|
180
|
+
"transform",
|
|
181
|
+
`translate(${part.datum.x ?? 0}, ${part.datum.y ?? 0})`
|
|
182
|
+
);
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
function applyState() {
|
|
186
|
+
var _a2, _b, _c;
|
|
187
|
+
for (const part of nodes) {
|
|
188
|
+
const id = part.datum.id;
|
|
189
|
+
const active = activeNodeId === id;
|
|
190
|
+
const hovered = hoveredNodeId === id;
|
|
191
|
+
const connected = isConnected(id);
|
|
192
|
+
part.background.setAttribute(
|
|
193
|
+
"fill",
|
|
194
|
+
active && !part.hasImage ? NODE_COLORS.activeFill : nodeColor(part.datum)
|
|
195
|
+
);
|
|
196
|
+
if (!part.label) continue;
|
|
197
|
+
const show = part.alwaysLabelled || active || hovered || connected;
|
|
198
|
+
part.label.style.opacity = show ? "1" : "0";
|
|
199
|
+
if (part.labelBg) {
|
|
200
|
+
part.labelBg.setAttribute(
|
|
201
|
+
"fill",
|
|
202
|
+
active ? NODE_LABEL_COLORS.backgroundActive : hovered ? NODE_LABEL_COLORS.backgroundHover : NODE_LABEL_COLORS.background
|
|
203
|
+
);
|
|
204
|
+
}
|
|
205
|
+
const textFill = active ? NODE_LABEL_COLORS.textActive : NODE_LABEL_COLORS.text;
|
|
206
|
+
(_a2 = part.labelTitle) == null ? void 0 : _a2.setAttribute("fill", textFill);
|
|
207
|
+
(_b = part.labelTitle) == null ? void 0 : _b.setAttribute("font-weight", active || connected ? "600" : "400");
|
|
208
|
+
(_c = part.labelValue) == null ? void 0 : _c.setAttribute("fill", textFill);
|
|
209
|
+
}
|
|
210
|
+
for (const part of links) {
|
|
211
|
+
part.line.setAttribute(
|
|
212
|
+
"stroke-width",
|
|
213
|
+
String(
|
|
214
|
+
isLinkActive(part.datum) ? scaleLinkWidthByMax(part.datum.value, model.maxLinkValue) : LINK_WIDTH
|
|
215
|
+
)
|
|
216
|
+
);
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
function setActive(id) {
|
|
220
|
+
activeNodeId = id;
|
|
221
|
+
applyState();
|
|
222
|
+
updateFrame();
|
|
223
|
+
onSelect == null ? void 0 : onSelect(id);
|
|
224
|
+
}
|
|
225
|
+
function applyVisibility() {
|
|
226
|
+
for (const part of nodes) {
|
|
227
|
+
const visible = isNodeVisible(part.datum.id);
|
|
228
|
+
part.group.style.opacity = visible ? "1" : "0";
|
|
229
|
+
part.group.style.pointerEvents = visible ? "all" : "none";
|
|
230
|
+
if (part.grab) part.grab.style.pointerEvents = visible ? "all" : "none";
|
|
231
|
+
}
|
|
232
|
+
for (const part of links) {
|
|
233
|
+
part.visible = isLinkVisible(part.datum);
|
|
234
|
+
part.line.style.opacity = part.visible ? "1" : "0";
|
|
235
|
+
}
|
|
236
|
+
if (hoveredNodeId && !isNodeVisible(hoveredNodeId)) hoveredNodeId = null;
|
|
237
|
+
if (activeNodeId && !isNodeVisible(activeNodeId)) setActive(null);
|
|
238
|
+
else {
|
|
239
|
+
applyState();
|
|
240
|
+
updateFrame();
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
function applyFit() {
|
|
244
|
+
const fitted = fitTransform(
|
|
245
|
+
simNodes.filter((node) => isNodeVisible(node.id)),
|
|
246
|
+
radiusById,
|
|
247
|
+
width,
|
|
248
|
+
height,
|
|
249
|
+
labelExtent
|
|
250
|
+
);
|
|
251
|
+
if (!fitted) return;
|
|
252
|
+
if (zoomBehaviour) svg.call(zoomBehaviour.transform, fitted);
|
|
253
|
+
else root.attr("transform", fitted.toString());
|
|
254
|
+
}
|
|
255
|
+
function resize(nextWidth, nextHeight) {
|
|
256
|
+
width = nextWidth;
|
|
257
|
+
height = nextHeight;
|
|
258
|
+
svg.attr("viewBox", `0 0 ${width} ${height}`);
|
|
259
|
+
centerForce.x(width / 2).y(height / 2);
|
|
260
|
+
xForce.x(width / 2);
|
|
261
|
+
yForce.y(height / 2);
|
|
262
|
+
updateFrame();
|
|
263
|
+
applyFit();
|
|
264
|
+
}
|
|
265
|
+
attachNodeInteractions({
|
|
266
|
+
nodes,
|
|
267
|
+
simulation,
|
|
268
|
+
getBounds: () => ({ width, height }),
|
|
269
|
+
radiusById,
|
|
270
|
+
onHover: (id) => {
|
|
271
|
+
hoveredNodeId = id;
|
|
272
|
+
applyState();
|
|
273
|
+
},
|
|
274
|
+
onClick: (id) => setActive(activeNodeId === id ? null : id)
|
|
275
|
+
});
|
|
276
|
+
let zoomBehaviour = null;
|
|
277
|
+
if (options.enableZoom !== false) {
|
|
278
|
+
zoomBehaviour = zoom().scaleExtent(ZOOM_EXTENT).filter((event) => {
|
|
279
|
+
var _a2, _b;
|
|
280
|
+
if (event.type === "wheel") return !!(event.ctrlKey || event.metaKey);
|
|
281
|
+
if (event.button != null && event.button !== 0) return false;
|
|
282
|
+
return !((_b = (_a2 = event.target) == null ? void 0 : _a2.closest) == null ? void 0 : _b.call(_a2, "g.node"));
|
|
283
|
+
}).on("zoom", (event) => {
|
|
284
|
+
root.attr("transform", event.transform.toString());
|
|
285
|
+
});
|
|
286
|
+
svg.call(zoomBehaviour);
|
|
287
|
+
}
|
|
288
|
+
simulation.tick(PRESETTLE_TICKS);
|
|
289
|
+
applyVisibility();
|
|
290
|
+
applyFit();
|
|
291
|
+
simulation.on("tick", updateFrame);
|
|
292
|
+
const controller = {
|
|
293
|
+
setVisibleIds(next) {
|
|
294
|
+
visibleIds = next;
|
|
295
|
+
applyVisibility();
|
|
296
|
+
},
|
|
297
|
+
resize
|
|
298
|
+
};
|
|
299
|
+
GRAPHS.set(container, { simulation, positions, controller });
|
|
300
|
+
return controller;
|
|
301
|
+
}
|
|
302
|
+
function fitTransform(nodes, radiusById, width, height, labelExtent) {
|
|
303
|
+
let minX = Infinity;
|
|
304
|
+
let minY = Infinity;
|
|
305
|
+
let maxX = -Infinity;
|
|
306
|
+
let maxY = -Infinity;
|
|
307
|
+
for (const node of nodes) {
|
|
308
|
+
if (typeof node.x !== "number" || typeof node.y !== "number") continue;
|
|
309
|
+
const radius = radiusById.get(node.id) ?? 0;
|
|
310
|
+
const label = labelExtent.get(node.id);
|
|
311
|
+
const vertical = Math.max(radius, (label == null ? void 0 : label.half) ?? 0);
|
|
312
|
+
minX = Math.min(minX, node.x - radius);
|
|
313
|
+
minY = Math.min(minY, node.y - vertical);
|
|
314
|
+
maxX = Math.max(maxX, node.x + radius + ((label == null ? void 0 : label.right) ?? 0));
|
|
315
|
+
maxY = Math.max(maxY, node.y + vertical);
|
|
316
|
+
}
|
|
317
|
+
if (!Number.isFinite(minX)) return null;
|
|
318
|
+
const spanX = Math.max(maxX - minX, 1);
|
|
319
|
+
const spanY = Math.max(maxY - minY, 1);
|
|
320
|
+
const scale = clamp(
|
|
321
|
+
Math.min((width - FIT_PADDING * 2) / spanX, (height - FIT_PADDING * 2) / spanY),
|
|
322
|
+
FIT_SCALE_EXTENT[0],
|
|
323
|
+
FIT_SCALE_EXTENT[1]
|
|
324
|
+
);
|
|
325
|
+
return zoomIdentity.translate(width / 2 - (minX + maxX) / 2 * scale, height / 2 - (minY + maxY) / 2 * scale).scale(scale);
|
|
326
|
+
}
|
|
327
|
+
function seedPosition(index, count, width, height) {
|
|
328
|
+
const maxRadius = Math.min(width, height) * INITIAL_NODE_RADIUS_RATIO;
|
|
329
|
+
const radius = maxRadius * Math.sqrt(count <= 1 ? 0 : index / (count - 1));
|
|
330
|
+
const angle = index * GOLDEN_ANGLE;
|
|
331
|
+
return {
|
|
332
|
+
x: width / 2 + Math.cos(angle) * radius,
|
|
333
|
+
y: height / 2 + Math.sin(angle) * radius
|
|
334
|
+
};
|
|
335
|
+
}
|
|
336
|
+
function appendDefs(svg, blurId, shadowId) {
|
|
337
|
+
const defs = svg.append("defs");
|
|
338
|
+
defs.append("filter").attr("id", blurId).attr("x", "-50%").attr("y", "-50%").attr("width", "200%").attr("height", "200%").append("feGaussianBlur").attr("stdDeviation", 12);
|
|
339
|
+
const radial = defs.append("radialGradient").attr("id", shadowId);
|
|
340
|
+
radial.append("stop").attr("offset", "0%").attr("stop-color", NODE_COLORS.shadowInner).attr("stop-opacity", 1);
|
|
341
|
+
radial.append("stop").attr("offset", "100%").attr("stop-color", NODE_COLORS.shadowOuter).attr("stop-opacity", 0.12);
|
|
342
|
+
}
|
|
343
|
+
function buildLinks(linkLayer, labelLayer, simLinks) {
|
|
344
|
+
return simLinks.map((datum) => {
|
|
345
|
+
const line = linkLayer.append("line").attr("class", "link-line").attr("stroke", LINK_COLORS[datum.type]).attr("stroke-width", LINK_WIDTH).attr("stroke-linecap", "round").style("opacity", 1).style("pointer-events", "none").node();
|
|
346
|
+
let label = null;
|
|
347
|
+
{
|
|
348
|
+
const group = labelLayer.append("g").attr("class", "link-label").style("opacity", 0).style("pointer-events", "none");
|
|
349
|
+
const background = group.append("rect").attr("class", "link-label-background").attr("rx", 5).attr("ry", 5).attr("fill", LINK_LABEL_COLORS.background);
|
|
350
|
+
const text = group.append("text").attr("class", "link-label-text").text(formatLinkValue(datum.value)).attr("font-size", LINK_LABEL_SIZE).attr("fill", LINK_LABEL_COLORS.text).attr("dominant-baseline", "middle").attr("text-anchor", "middle");
|
|
351
|
+
const box = measure(text.node());
|
|
352
|
+
if (box) {
|
|
353
|
+
background.attr("x", box.x - LINK_LABEL_PAD_X).attr("y", box.y - LINK_LABEL_PAD_Y).attr("width", box.width + LINK_LABEL_PAD_X * 2).attr("height", box.height + LINK_LABEL_PAD_Y * 2);
|
|
354
|
+
}
|
|
355
|
+
label = group.node();
|
|
356
|
+
}
|
|
357
|
+
return { datum, line, label, visible: true };
|
|
358
|
+
});
|
|
359
|
+
}
|
|
360
|
+
function buildNodes(params) {
|
|
361
|
+
const { layer, simNodes, model, radiusById, blurId, shadowId } = params;
|
|
362
|
+
return simNodes.map((datum) => {
|
|
363
|
+
const radius = radiusById.get(datum.id) ?? 0;
|
|
364
|
+
const shadow = shadowRadius(datum, model.breakpoints);
|
|
365
|
+
const hasImage = !!datum.img;
|
|
366
|
+
const group = layer.append("g").datum(datum).attr("class", "node").style("cursor", "grab").style("opacity", 1).style("pointer-events", "all");
|
|
367
|
+
const label = appendNodeLabel(group, datum, radius);
|
|
368
|
+
group.append("circle").attr("class", "node-shadow-blue").attr("r", shadow).attr("fill", NODE_COLORS.glow).attr("opacity", 0.15).attr("filter", `url(#${blurId})`).style("pointer-events", "none");
|
|
369
|
+
const grab = group.append("circle").attr("class", "node-drag-area").attr("r", radius + NODE_BORDER_WIDTH + DRAG_AREA_PAD).attr("fill", "transparent").style("cursor", "grab").style("pointer-events", "all").node();
|
|
370
|
+
group.append("circle").attr("class", "node-shadow-dark").attr("r", shadow).attr("fill", `url(#${shadowId})`).attr("opacity", 0.1).attr("filter", `url(#${blurId})`).style("pointer-events", "none");
|
|
371
|
+
const background = group.append("circle").attr("class", "node-background").attr("r", radius).attr("fill", nodeColor(datum)).style("opacity", hasImage ? 0 : 1).style("pointer-events", "none").node();
|
|
372
|
+
group.append("circle").attr("class", "node-border-white").attr("r", radius).attr("fill", "none").attr("stroke", NODE_COLORS.innerBorder).attr("stroke-width", NODE_BORDER_WIDTH).style("pointer-events", "none");
|
|
373
|
+
if (hasImage) {
|
|
374
|
+
group.append("image").attr("class", "node-image").attr("href", datum.img).attr("width", radius * 2).attr("height", radius * 2).attr("x", -radius).attr("y", -radius).attr("clip-path", `circle(${radius}px at ${radius}px ${radius}px)`).attr("preserveAspectRatio", "xMidYMid slice").style("pointer-events", "none");
|
|
375
|
+
}
|
|
376
|
+
group.append("circle").attr("class", "node-border-purple").attr("r", radius + NODE_BORDER_WIDTH).attr("fill", "none").attr("stroke", NODE_COLORS.outerBorder).attr("stroke-width", NODE_BORDER_WIDTH).style("pointer-events", "none");
|
|
377
|
+
return {
|
|
378
|
+
datum,
|
|
379
|
+
group: group.node(),
|
|
380
|
+
background,
|
|
381
|
+
grab,
|
|
382
|
+
label: label.group,
|
|
383
|
+
labelBg: label.background,
|
|
384
|
+
labelTitle: label.title,
|
|
385
|
+
labelValue: label.value,
|
|
386
|
+
radius,
|
|
387
|
+
hasImage,
|
|
388
|
+
alwaysLabelled: radius > LABEL_ALWAYS_ABOVE
|
|
389
|
+
};
|
|
390
|
+
});
|
|
391
|
+
}
|
|
392
|
+
function appendNodeLabel(group, datum, radius) {
|
|
393
|
+
const valueText = formatNodeValue(datum.value);
|
|
394
|
+
if (!datum.label && !valueText) {
|
|
395
|
+
return { group: null, background: null, title: null, value: null };
|
|
396
|
+
}
|
|
397
|
+
const labelGroup = group.append("g").attr("class", "node-label").attr("transform", "translate(1, 0)").style("opacity", 0).style("pointer-events", "none");
|
|
398
|
+
const background = labelGroup.append("rect").attr("class", "node-label-background").attr("rx", 4).attr("ry", 4).attr("fill", NODE_LABEL_COLORS.background);
|
|
399
|
+
const title = labelGroup.append("text").attr("class", "node-label-title").text(datum.label).attr("font-size", LABEL_TITLE_SIZE).attr("font-weight", "400").attr("fill", NODE_LABEL_COLORS.text).attr("text-anchor", "middle").attr("dominant-baseline", "hanging");
|
|
400
|
+
const value = labelGroup.append("text").attr("class", "node-label-value").text(valueText).attr("font-size", LABEL_VALUE_SIZE).attr("fill", NODE_LABEL_COLORS.text).attr("text-anchor", "middle").attr("dominant-baseline", "hanging");
|
|
401
|
+
const paddingX = radius + LABEL_PADDING_GAP;
|
|
402
|
+
const titleBox = measure(title.node());
|
|
403
|
+
const valueBox = measure(value.node());
|
|
404
|
+
const contentWidth = Math.max((titleBox == null ? void 0 : titleBox.width) ?? 0, (valueBox == null ? void 0 : valueBox.width) ?? 0);
|
|
405
|
+
const boxWidth = paddingX * 2 + contentWidth;
|
|
406
|
+
const boxHeight = LABEL_PADDING_TOP + LABEL_TITLE_LINE + LABEL_VALUE_LINE + LABEL_PADDING_BOTTOM;
|
|
407
|
+
const centerX = paddingX + contentWidth / 2;
|
|
408
|
+
background.attr("x", 0).attr("y", -boxHeight / 2).attr("width", boxWidth).attr("height", boxHeight);
|
|
409
|
+
title.attr("x", centerX).attr("y", -boxHeight / 2 + LABEL_PADDING_TOP);
|
|
410
|
+
value.attr("x", centerX).attr("y", -boxHeight / 2 + LABEL_PADDING_TOP + LABEL_TITLE_LINE);
|
|
411
|
+
return {
|
|
412
|
+
group: labelGroup.node(),
|
|
413
|
+
background: background.node(),
|
|
414
|
+
title: title.node(),
|
|
415
|
+
value: value.node()
|
|
416
|
+
};
|
|
417
|
+
}
|
|
418
|
+
function attachNodeInteractions(params) {
|
|
419
|
+
const { nodes, simulation, getBounds, radiusById, onHover, onClick } = params;
|
|
420
|
+
let moved = false;
|
|
421
|
+
let start = null;
|
|
422
|
+
const behaviour = drag().filter((event) => event.button === 0).on("start", (event, d) => {
|
|
423
|
+
event.sourceEvent.stopPropagation();
|
|
424
|
+
start = { x: event.sourceEvent.clientX, y: event.sourceEvent.clientY };
|
|
425
|
+
moved = false;
|
|
426
|
+
if (!event.active) simulation.alphaTarget(0.3).restart();
|
|
427
|
+
const { width, height } = getBounds();
|
|
428
|
+
d.fx = d.x ?? width / 2;
|
|
429
|
+
d.fy = d.y ?? height / 2;
|
|
430
|
+
}).on("drag", (event, d) => {
|
|
431
|
+
if (start) {
|
|
432
|
+
const dx = event.sourceEvent.clientX - start.x;
|
|
433
|
+
const dy = event.sourceEvent.clientY - start.y;
|
|
434
|
+
if (Math.sqrt(dx * dx + dy * dy) > DRAG_SLOP) moved = true;
|
|
435
|
+
}
|
|
436
|
+
const { width, height } = getBounds();
|
|
437
|
+
const radius = radiusById.get(d.id) ?? 0;
|
|
438
|
+
d.fx = clamp((d.fx ?? d.x ?? 0) + event.dx, radius, width - radius);
|
|
439
|
+
d.fy = clamp((d.fy ?? d.y ?? 0) + event.dy, radius, height - radius);
|
|
440
|
+
}).on("end", (event, d) => {
|
|
441
|
+
if (!event.active) simulation.alphaTarget(0);
|
|
442
|
+
d.fx = null;
|
|
443
|
+
d.fy = null;
|
|
444
|
+
start = null;
|
|
445
|
+
});
|
|
446
|
+
for (const part of nodes) {
|
|
447
|
+
const group = select(part.group);
|
|
448
|
+
group.call(behaviour);
|
|
449
|
+
const grab = group.select(".node-drag-area");
|
|
450
|
+
grab.on("click", (event) => {
|
|
451
|
+
event.stopPropagation();
|
|
452
|
+
if (moved) {
|
|
453
|
+
moved = false;
|
|
454
|
+
return;
|
|
455
|
+
}
|
|
456
|
+
onClick(part.datum.id);
|
|
457
|
+
});
|
|
458
|
+
grab.on("mouseenter", () => onHover(part.datum.id));
|
|
459
|
+
grab.on("mouseleave", () => onHover(null));
|
|
460
|
+
}
|
|
461
|
+
}
|
|
462
|
+
export {
|
|
463
|
+
renderNetworkGraph,
|
|
464
|
+
resizeNetworkGraph,
|
|
465
|
+
stopNetworkGraph,
|
|
466
|
+
updateNetworkGraphVisibility
|
|
467
|
+
};
|
|
468
|
+
//# sourceMappingURL=draw.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"draw.js","sources":["../../../../src/components/network-graph/render/draw.ts"],"sourcesContent":["import { drag, type D3DragEvent } from 'd3-drag';\nimport {\n forceCenter,\n forceCollide,\n forceLink,\n forceManyBody,\n forceSimulation,\n forceX,\n forceY,\n type Simulation,\n type SimulationLinkDatum,\n type SimulationNodeDatum,\n} from 'd3-force';\nimport { select, type Selection } from 'd3-selection';\nimport { zoom, zoomIdentity, type ZoomBehavior, type ZoomTransform } from 'd3-zoom';\n\nimport type { WidgetTheme } from '../../../types/index.js';\nimport {\n INITIAL_NODE_RADIUS_RATIO,\n LABEL_ALWAYS_ABOVE,\n LINK_COLORS,\n LINK_LABEL_COLORS,\n LINK_WIDTH,\n NODE_BORDER_WIDTH,\n NODE_COLORS,\n NODE_LABEL_COLORS,\n formatLinkValue,\n formatNodeValue,\n networkForces,\n nodeColor,\n nodeRadius,\n scaleLinkWidthByMax,\n shadowRadius,\n type NetworkGraphModel,\n type NetworkLink,\n type NetworkNode,\n} from '../lib/index.js';\n\n/** Node label box (client `createNodeLabel`). */\nconst LABEL_PADDING_TOP = 14;\nconst LABEL_PADDING_BOTTOM = 4;\nconst LABEL_PADDING_GAP = 5;\nconst LABEL_TITLE_SIZE = 12;\nconst LABEL_TITLE_LINE = 16;\nconst LABEL_VALUE_SIZE = 10;\nconst LABEL_VALUE_LINE = 14;\n/** Link pill (client `createLinkLabelBackground`). */\nconst LINK_LABEL_SIZE = 8;\nconst LINK_LABEL_PAD_X = 2;\nconst LINK_LABEL_PAD_Y = 1;\nconst LINK_LABEL_OFFSET = 10;\n/** Invisible grab ring around each node (client `.node-drag-area`). */\nconst DRAG_AREA_PAD = 10;\n/** Pointer travel that turns a click into a drag (client). */\nconst DRAG_SLOP = 5;\nconst ZOOM_EXTENT: [number, number] = [0.3, 4];\n/**\n * The client animates the layout in from the canvas centre. A chat card is read\n * at a glance, so the simulation is stepped to rest before the first paint and\n * then left idle — dragging a node restarts it, exactly as in the client.\n */\nconst PRESETTLE_TICKS = 250;\n/** Padding kept around the graph when it is fitted to the container. */\nconst FIT_PADDING = 32;\n/** Fitting may enlarge a sparse graph, but never past readable label sizes. */\nconst FIT_SCALE_EXTENT: [number, number] = [0.4, 1.25];\n/** Even seed ring so the first frame is reproducible across renders. */\nconst GOLDEN_ANGLE = Math.PI * (3 - Math.sqrt(5));\n\ntype SimNode = NetworkNode & SimulationNodeDatum;\ntype SimLink = Omit<NetworkLink, 'source' | 'target'> &\n SimulationLinkDatum<SimNode> & { source: string | SimNode; target: string | SimNode };\n\nexport interface RenderNetworkGraphOptions {\n model: NetworkGraphModel;\n /** `null` shows every node; otherwise only these ids stay visible. */\n visibleIds: Set<string> | null;\n width: number;\n height: number;\n theme: WidgetTheme;\n /** Selection carried across a redraw (legend filtering keeps it). */\n activeNodeId?: string | null;\n /** Fired when a node is clicked; `null` when the same node is clicked again. */\n onSelect?: (id: string | null) => void;\n /** Drag-to-pan plus ctrl/cmd + wheel zoom. */\n enableZoom?: boolean;\n}\n\ninterface NodeParts {\n datum: SimNode;\n group: SVGGElement;\n background: SVGCircleElement;\n /** Invisible ring that carries the pointer handlers. */\n grab: SVGCircleElement | null;\n label: SVGGElement | null;\n labelBg: SVGRectElement | null;\n labelTitle: SVGTextElement | null;\n labelValue: SVGTextElement | null;\n radius: number;\n hasImage: boolean;\n alwaysLabelled: boolean;\n}\n\n/** How far a node's always-on label reaches past the circle itself. */\ninterface LabelExtent {\n right: number;\n half: number;\n}\n\ninterface LinkParts {\n datum: SimLink;\n line: SVGLineElement;\n label: SVGGElement | null;\n visible: boolean;\n}\n\n/**\n * Live handle on a mounted graph. The element keeps this so the legend filter\n * and container resizes can update the plot in place instead of rebuilding it.\n */\nexport interface NetworkGraphController {\n /** Legend filter — toggles node/link visibility, the layout is untouched. */\n setVisibleIds(visibleIds: Set<string> | null): void;\n /** Container resize — re-frames the settled layout, runs no new force ticks. */\n resize(width: number, height: number): void;\n}\n\ninterface GraphState {\n simulation: Simulation<SimNode, SimLink> | null;\n positions: Map<string, { x: number; y: number }>;\n controller: NetworkGraphController | null;\n}\n\nconst GRAPHS = new WeakMap<HTMLElement, GraphState>();\n\nlet instanceCount = 0;\n\nfunction clamp(value: number, min: number, max: number): number {\n return Math.max(min, Math.min(max, value));\n}\n\nfunction endpointId(end: string | SimNode): string {\n return typeof end === 'string' ? end : end.id;\n}\n\n/** `getBBox` is unavailable outside a real layout engine (jsdom, detached DOM). */\nfunction measure(el: SVGGraphicsElement | null): DOMRect | null {\n if (!el || typeof el.getBBox !== 'function') return null;\n try {\n return el.getBBox();\n } catch {\n return null;\n }\n}\n\n/**\n * Client `getLinkPoint` — pull an endpoint out to the rim of its node so the\n * stroke starts where the circle ends.\n */\nfunction rimPoint(\n x: number,\n y: number,\n towardX: number,\n towardY: number,\n radius: number,\n): { x: number; y: number } {\n const dx = towardX - x;\n const dy = towardY - y;\n const distance = Math.sqrt(dx * dx + dy * dy);\n if (distance === 0) return { x, y };\n return { x: x + (dx / distance) * radius, y: y + (dy / distance) * radius };\n}\n\n/** Stop the simulation attached to `container`, keeping its layout for the next draw. */\nexport function stopNetworkGraph(container: HTMLElement): void {\n const state = GRAPHS.get(container);\n if (!state) return;\n state.controller = null;\n if (!state.simulation) return;\n for (const node of state.simulation.nodes()) {\n if (typeof node.x === 'number' && typeof node.y === 'number') {\n state.positions.set(node.id, { x: node.x, y: node.y });\n }\n }\n state.simulation.stop();\n state.simulation = null;\n}\n\n/**\n * Legend filter. Returns `false` when no graph is mounted so the caller can fall\n * back to a full render; on success nothing is rebuilt and the camera holds.\n */\nexport function updateNetworkGraphVisibility(\n container: HTMLElement,\n visibleIds: Set<string> | null,\n): boolean {\n const controller = GRAPHS.get(container)?.controller;\n if (!controller) return false;\n controller.setVisibleIds(visibleIds);\n return true;\n}\n\n/**\n * Container resize. Returns `false` when no graph is mounted; otherwise the\n * settled layout is re-framed without re-running the force simulation.\n */\nexport function resizeNetworkGraph(\n container: HTMLElement,\n width: number,\n height: number,\n): boolean {\n const controller = GRAPHS.get(container)?.controller;\n if (!controller || width <= 0 || height <= 0) return false;\n controller.resize(width, height);\n return true;\n}\n\n/**\n * FuseDash NetworkGraph — a d3-force layout of image/colour nodes joined by\n * value-weighted links. The client lays out on a fixed 2000x1375 canvas and\n * zooms into it; chat gives the chart its container instead, so the simulation\n * runs in container coordinates with the spatial forces scaled to match.\n */\nexport function renderNetworkGraph(\n container: HTMLElement,\n options: RenderNetworkGraphOptions,\n): NetworkGraphController | null {\n const { model, theme, onSelect } = options;\n // Mutated in place by the controller — a filter or a resize must not rebuild.\n let visibleIds = options.visibleIds;\n let width = options.width;\n let height = options.height;\n\n stopNetworkGraph(container);\n container.replaceChildren();\n if (!model.nodes.length || width <= 0 || height <= 0) return null;\n\n const positions = GRAPHS.get(container)?.positions ?? new Map();\n const instance = ++instanceCount;\n const blurId = `ui9000-ng-blur-${instance}`;\n const shadowId = `ui9000-ng-shadow-${instance}`;\n\n const radiusById = new Map(\n model.nodes.map((node) => [node.id, nodeRadius(node, model.breakpoints)]),\n );\n const maxNodeRadius = Math.max(...radiusById.values());\n\n const simNodes: SimNode[] = model.nodes.map((node, index) => {\n const seed = positions.get(node.id) ?? seedPosition(index, model.nodes.length, width, height);\n return { ...node, x: seed.x, y: seed.y };\n });\n const nodeById = new Map(simNodes.map((node) => [node.id, node]));\n const simLinks: SimLink[] = model.links.map((link) => ({ ...link }));\n\n const isNodeVisible = (id: string): boolean => !visibleIds || visibleIds.has(id);\n const isLinkVisible = (link: SimLink): boolean =>\n isNodeVisible(endpointId(link.source)) && isNodeVisible(endpointId(link.target));\n\n const neighbours = new Map<string, Set<string>>();\n for (const link of simLinks) {\n const source = endpointId(link.source);\n const target = endpointId(link.target);\n if (!neighbours.has(source)) neighbours.set(source, new Set());\n if (!neighbours.has(target)) neighbours.set(target, new Set());\n neighbours.get(source)!.add(target);\n neighbours.get(target)!.add(source);\n }\n\n let activeNodeId = options.activeNodeId ?? null;\n let hoveredNodeId: string | null = null;\n\n const svg = select(container)\n .append('svg')\n .attr('width', '100%')\n .attr('height', '100%')\n .attr('viewBox', `0 0 ${width} ${height}`)\n .attr('preserveAspectRatio', 'xMidYMid meet')\n .style('display', 'block')\n .style('font-family', theme.fontFamily);\n\n appendDefs(svg, blurId, shadowId);\n\n const root = svg.append('g').attr('class', 'graph-root');\n const linkLayer = root.append('g').attr('class', 'link-layer');\n const linkLabelLayer = root.append('g').attr('class', 'link-label-layer');\n const nodeLayer = root.append('g').attr('class', 'node-layer');\n\n const links = buildLinks(linkLayer, linkLabelLayer, simLinks);\n const nodes = buildNodes({\n layer: nodeLayer,\n simNodes,\n model,\n radiusById,\n blurId,\n shadowId,\n });\n\n // Labels hang off the right of their node and are taller than a small circle,\n // so the camera has to allow for them or a narrow frame clips them.\n const labelExtent = new Map<string, LabelExtent>();\n for (const part of nodes) {\n if (!part.alwaysLabelled || !part.labelBg) continue;\n const right = Number(part.labelBg.getAttribute('width')) || 0;\n const half = (Number(part.labelBg.getAttribute('height')) || 0) / 2;\n if (right || half) labelExtent.set(part.datum.id, { right, half });\n }\n\n const forces = networkForces(width, height, maxNodeRadius);\n // Centring forces are kept by reference: a resize retargets them instead of\n // rebuilding the simulation.\n const centerForce = forceCenter<SimNode>(width / 2, height / 2).strength(0.1);\n const xForce = forceX<SimNode>(width / 2).strength(0.05);\n const yForce = forceY<SimNode>(height / 2).strength(0.05);\n // Every link stays in the force, filtered-out ones included, so toggling the\n // legend never disturbs the layout (client parity).\n const simulation = forceSimulation<SimNode>(simNodes)\n .stop()\n .force(\n 'link',\n forceLink<SimNode, SimLink>(simLinks)\n .id((d) => d.id)\n .distance(forces.linkDistance)\n .strength(0.5),\n )\n .force('charge', forceManyBody<SimNode>().strength(forces.charge))\n .force('center', centerForce)\n .force('collision', forceCollide<SimNode>().radius(forces.collide))\n .force('x', xForce)\n .force('y', yForce);\n\n GRAPHS.set(container, { simulation, positions, controller: null });\n\n const isConnected = (id: string): boolean =>\n !!activeNodeId && activeNodeId !== id && !!neighbours.get(activeNodeId)?.has(id);\n\n const isLinkActive = (link: SimLink): boolean =>\n !!activeNodeId &&\n (endpointId(link.source) === activeNodeId || endpointId(link.target) === activeNodeId);\n\n /** Geometry — runs on every simulation tick. */\n function updateFrame(): void {\n for (const node of simNodes) {\n const radius = radiusById.get(node.id) ?? 0;\n node.x = clamp(node.x ?? width / 2, radius, width - radius);\n node.y = clamp(node.y ?? height / 2, radius, height - radius);\n }\n\n for (const part of links) {\n const source = nodeById.get(endpointId(part.datum.source));\n const target = nodeById.get(endpointId(part.datum.target));\n if (!source || !target) continue;\n\n const sx = source.x ?? 0;\n const sy = source.y ?? 0;\n const tx = target.x ?? 0;\n const ty = target.y ?? 0;\n const from = rimPoint(sx, sy, tx, ty, radiusById.get(source.id) ?? 0);\n const to = rimPoint(tx, ty, sx, sy, radiusById.get(target.id) ?? 0);\n\n part.line.setAttribute('x1', String(from.x));\n part.line.setAttribute('y1', String(from.y));\n part.line.setAttribute('x2', String(to.x));\n part.line.setAttribute('y2', String(to.y));\n\n if (!part.label) continue;\n const show = part.visible && isLinkActive(part.datum);\n part.label.style.opacity = show ? '1' : '0';\n if (!show) continue;\n\n const angle = (Math.atan2(to.y - from.y, to.x - from.x) * 180) / Math.PI;\n const upright = angle > 90 || angle < -90 ? angle + 180 : angle;\n const perpendicular = ((angle - 90) * Math.PI) / 180;\n const cx = (from.x + to.x) / 2 + Math.cos(perpendicular) * LINK_LABEL_OFFSET;\n const cy = (from.y + to.y) / 2 + Math.sin(perpendicular) * LINK_LABEL_OFFSET;\n part.label.setAttribute('transform', `translate(${cx}, ${cy}) rotate(${upright})`);\n }\n\n for (const part of nodes) {\n part.group.setAttribute(\n 'transform',\n `translate(${part.datum.x ?? 0}, ${part.datum.y ?? 0})`,\n );\n }\n }\n\n /** Selection / hover styling — runs only when the interaction state changes. */\n function applyState(): void {\n for (const part of nodes) {\n const id = part.datum.id;\n const active = activeNodeId === id;\n const hovered = hoveredNodeId === id;\n const connected = isConnected(id);\n\n part.background.setAttribute(\n 'fill',\n active && !part.hasImage ? NODE_COLORS.activeFill : nodeColor(part.datum),\n );\n\n if (!part.label) continue;\n const show = part.alwaysLabelled || active || hovered || connected;\n part.label.style.opacity = show ? '1' : '0';\n\n if (part.labelBg) {\n part.labelBg.setAttribute(\n 'fill',\n active\n ? NODE_LABEL_COLORS.backgroundActive\n : hovered\n ? NODE_LABEL_COLORS.backgroundHover\n : NODE_LABEL_COLORS.background,\n );\n }\n const textFill = active ? NODE_LABEL_COLORS.textActive : NODE_LABEL_COLORS.text;\n part.labelTitle?.setAttribute('fill', textFill);\n part.labelTitle?.setAttribute('font-weight', active || connected ? '600' : '400');\n part.labelValue?.setAttribute('fill', textFill);\n }\n\n for (const part of links) {\n part.line.setAttribute(\n 'stroke-width',\n String(\n isLinkActive(part.datum)\n ? scaleLinkWidthByMax(part.datum.value, model.maxLinkValue)\n : LINK_WIDTH,\n ),\n );\n }\n }\n\n function setActive(id: string | null): void {\n activeNodeId = id;\n applyState();\n updateFrame();\n onSelect?.(id);\n }\n\n /**\n * Legend filter — opacity and hit-testing only. The simulation keeps every\n * node and link, so nothing moves and the camera stays where the user left it.\n */\n function applyVisibility(): void {\n for (const part of nodes) {\n const visible = isNodeVisible(part.datum.id);\n part.group.style.opacity = visible ? '1' : '0';\n part.group.style.pointerEvents = visible ? 'all' : 'none';\n if (part.grab) part.grab.style.pointerEvents = visible ? 'all' : 'none';\n }\n for (const part of links) {\n part.visible = isLinkVisible(part.datum);\n part.line.style.opacity = part.visible ? '1' : '0';\n }\n // A node filtered out of view must not stay selected or hovered.\n if (hoveredNodeId && !isNodeVisible(hoveredNodeId)) hoveredNodeId = null;\n if (activeNodeId && !isNodeVisible(activeNodeId)) setActive(null);\n else {\n applyState();\n updateFrame();\n }\n }\n\n /** Centre the visible nodes in the current frame. */\n function applyFit(): void {\n const fitted = fitTransform(\n simNodes.filter((node) => isNodeVisible(node.id)),\n radiusById,\n width,\n height,\n labelExtent,\n );\n if (!fitted) return;\n if (zoomBehaviour) svg.call(zoomBehaviour.transform, fitted);\n else root.attr('transform', fitted.toString());\n }\n\n /**\n * Container resize. The settled layout is still good, so only the viewBox, the\n * clamp bounds, the centring force targets and the camera move — re-running\n * PRESETTLE_TICKS here would reshuffle the graph under the reader.\n */\n function resize(nextWidth: number, nextHeight: number): void {\n width = nextWidth;\n height = nextHeight;\n svg.attr('viewBox', `0 0 ${width} ${height}`);\n centerForce.x(width / 2).y(height / 2);\n xForce.x(width / 2);\n yForce.y(height / 2);\n updateFrame();\n applyFit();\n }\n\n attachNodeInteractions({\n nodes,\n simulation,\n getBounds: () => ({ width, height }),\n radiusById,\n onHover: (id) => {\n hoveredNodeId = id;\n applyState();\n },\n onClick: (id) => setActive(activeNodeId === id ? null : id),\n });\n\n let zoomBehaviour: ZoomBehavior<SVGSVGElement, unknown> | null = null;\n\n if (options.enableZoom !== false) {\n zoomBehaviour = zoom<SVGSVGElement, unknown>()\n .scaleExtent(ZOOM_EXTENT)\n .filter((event: Event & { ctrlKey?: boolean; metaKey?: boolean; button?: number }) => {\n // Chat scrolls the transcript — plain wheel must pass through.\n if (event.type === 'wheel') return !!(event.ctrlKey || event.metaKey);\n if (event.button != null && event.button !== 0) return false;\n return !(event.target as Element | null)?.closest?.('g.node');\n })\n .on('zoom', (event: { transform: ZoomTransform }) => {\n root.attr('transform', event.transform.toString());\n });\n svg.call(zoomBehaviour);\n }\n\n // The only place the layout is settled: first mount and data changes.\n simulation.tick(PRESETTLE_TICKS);\n applyVisibility();\n applyFit();\n simulation.on('tick', updateFrame);\n\n const controller: NetworkGraphController = {\n setVisibleIds(next) {\n visibleIds = next;\n applyVisibility();\n },\n resize,\n };\n GRAPHS.set(container, { simulation, positions, controller });\n return controller;\n}\n\n/**\n * Centre the settled layout in the container. The client zooms into a fixed\n * canvas; here the canvas *is* the container, so a graph that condenses into a\n * corner is nudged back into view. Filtered-out nodes stay in the simulation to\n * hold the layout steady, so only the visible ones frame the camera.\n */\nfunction fitTransform(\n nodes: SimNode[],\n radiusById: Map<string, number>,\n width: number,\n height: number,\n labelExtent: Map<string, LabelExtent>,\n): ZoomTransform | null {\n let minX = Infinity;\n let minY = Infinity;\n let maxX = -Infinity;\n let maxY = -Infinity;\n\n for (const node of nodes) {\n if (typeof node.x !== 'number' || typeof node.y !== 'number') continue;\n const radius = radiusById.get(node.id) ?? 0;\n const label = labelExtent.get(node.id);\n const vertical = Math.max(radius, label?.half ?? 0);\n minX = Math.min(minX, node.x - radius);\n minY = Math.min(minY, node.y - vertical);\n maxX = Math.max(maxX, node.x + radius + (label?.right ?? 0));\n maxY = Math.max(maxY, node.y + vertical);\n }\n if (!Number.isFinite(minX)) return null;\n\n const spanX = Math.max(maxX - minX, 1);\n const spanY = Math.max(maxY - minY, 1);\n const scale = clamp(\n Math.min((width - FIT_PADDING * 2) / spanX, (height - FIT_PADDING * 2) / spanY),\n FIT_SCALE_EXTENT[0],\n FIT_SCALE_EXTENT[1],\n );\n\n return zoomIdentity\n .translate(width / 2 - ((minX + maxX) / 2) * scale, height / 2 - ((minY + maxY) / 2) * scale)\n .scale(scale);\n}\n\nfunction seedPosition(\n index: number,\n count: number,\n width: number,\n height: number,\n): { x: number; y: number } {\n const maxRadius = Math.min(width, height) * INITIAL_NODE_RADIUS_RATIO;\n const radius = maxRadius * Math.sqrt(count <= 1 ? 0 : index / (count - 1));\n const angle = index * GOLDEN_ANGLE;\n return {\n x: width / 2 + Math.cos(angle) * radius,\n y: height / 2 + Math.sin(angle) * radius,\n };\n}\n\nfunction appendDefs(\n svg: Selection<SVGSVGElement, unknown, null, undefined>,\n blurId: string,\n shadowId: string,\n): void {\n const defs = svg.append('defs');\n defs\n .append('filter')\n .attr('id', blurId)\n .attr('x', '-50%')\n .attr('y', '-50%')\n .attr('width', '200%')\n .attr('height', '200%')\n .append('feGaussianBlur')\n .attr('stdDeviation', 12);\n\n const radial = defs.append('radialGradient').attr('id', shadowId);\n radial\n .append('stop')\n .attr('offset', '0%')\n .attr('stop-color', NODE_COLORS.shadowInner)\n .attr('stop-opacity', 1);\n radial\n .append('stop')\n .attr('offset', '100%')\n .attr('stop-color', NODE_COLORS.shadowOuter)\n .attr('stop-opacity', 0.12);\n}\n\n/** Every link is built once; the legend filter only toggles what is painted. */\nfunction buildLinks(\n linkLayer: Selection<SVGGElement, unknown, null, undefined>,\n labelLayer: Selection<SVGGElement, unknown, null, undefined>,\n simLinks: SimLink[],\n): LinkParts[] {\n return simLinks.map((datum) => {\n const line = linkLayer\n .append('line')\n .attr('class', 'link-line')\n .attr('stroke', LINK_COLORS[datum.type])\n .attr('stroke-width', LINK_WIDTH)\n .attr('stroke-linecap', 'round')\n .style('opacity', 1)\n .style('pointer-events', 'none')\n .node() as SVGLineElement;\n\n let label: SVGGElement | null = null;\n {\n const group = labelLayer\n .append('g')\n .attr('class', 'link-label')\n .style('opacity', 0)\n .style('pointer-events', 'none');\n\n const background = group\n .append('rect')\n .attr('class', 'link-label-background')\n .attr('rx', 5)\n .attr('ry', 5)\n .attr('fill', LINK_LABEL_COLORS.background);\n\n const text = group\n .append('text')\n .attr('class', 'link-label-text')\n .text(formatLinkValue(datum.value))\n .attr('font-size', LINK_LABEL_SIZE)\n .attr('fill', LINK_LABEL_COLORS.text)\n .attr('dominant-baseline', 'middle')\n .attr('text-anchor', 'middle');\n\n const box = measure(text.node());\n if (box) {\n background\n .attr('x', box.x - LINK_LABEL_PAD_X)\n .attr('y', box.y - LINK_LABEL_PAD_Y)\n .attr('width', box.width + LINK_LABEL_PAD_X * 2)\n .attr('height', box.height + LINK_LABEL_PAD_Y * 2);\n }\n label = group.node();\n }\n\n return { datum, line, label, visible: true };\n });\n}\n\nfunction buildNodes(params: {\n layer: Selection<SVGGElement, unknown, null, undefined>;\n simNodes: SimNode[];\n model: NetworkGraphModel;\n radiusById: Map<string, number>;\n blurId: string;\n shadowId: string;\n}): NodeParts[] {\n const { layer, simNodes, model, radiusById, blurId, shadowId } = params;\n\n return simNodes.map((datum) => {\n const radius = radiusById.get(datum.id) ?? 0;\n const shadow = shadowRadius(datum, model.breakpoints);\n const hasImage = !!datum.img;\n\n const group = layer\n .append('g')\n .datum(datum)\n .attr('class', 'node')\n .style('cursor', 'grab')\n .style('opacity', 1)\n .style('pointer-events', 'all');\n\n // Client stacking order: label behind the bloom, chrome on top of it.\n const label = appendNodeLabel(group, datum, radius);\n\n group\n .append('circle')\n .attr('class', 'node-shadow-blue')\n .attr('r', shadow)\n .attr('fill', NODE_COLORS.glow)\n .attr('opacity', 0.15)\n .attr('filter', `url(#${blurId})`)\n .style('pointer-events', 'none');\n\n const grab = group\n .append('circle')\n .attr('class', 'node-drag-area')\n .attr('r', radius + NODE_BORDER_WIDTH + DRAG_AREA_PAD)\n .attr('fill', 'transparent')\n .style('cursor', 'grab')\n .style('pointer-events', 'all')\n .node() as SVGCircleElement;\n\n group\n .append('circle')\n .attr('class', 'node-shadow-dark')\n .attr('r', shadow)\n .attr('fill', `url(#${shadowId})`)\n .attr('opacity', 0.1)\n .attr('filter', `url(#${blurId})`)\n .style('pointer-events', 'none');\n\n const background = group\n .append('circle')\n .attr('class', 'node-background')\n .attr('r', radius)\n .attr('fill', nodeColor(datum))\n .style('opacity', hasImage ? 0 : 1)\n .style('pointer-events', 'none')\n .node() as SVGCircleElement;\n\n group\n .append('circle')\n .attr('class', 'node-border-white')\n .attr('r', radius)\n .attr('fill', 'none')\n .attr('stroke', NODE_COLORS.innerBorder)\n .attr('stroke-width', NODE_BORDER_WIDTH)\n .style('pointer-events', 'none');\n\n if (hasImage) {\n group\n .append('image')\n .attr('class', 'node-image')\n .attr('href', datum.img as string)\n .attr('width', radius * 2)\n .attr('height', radius * 2)\n .attr('x', -radius)\n .attr('y', -radius)\n .attr('clip-path', `circle(${radius}px at ${radius}px ${radius}px)`)\n .attr('preserveAspectRatio', 'xMidYMid slice')\n .style('pointer-events', 'none');\n }\n\n group\n .append('circle')\n .attr('class', 'node-border-purple')\n .attr('r', radius + NODE_BORDER_WIDTH)\n .attr('fill', 'none')\n .attr('stroke', NODE_COLORS.outerBorder)\n .attr('stroke-width', NODE_BORDER_WIDTH)\n .style('pointer-events', 'none');\n\n return {\n datum,\n group: group.node() as SVGGElement,\n background,\n grab,\n label: label.group,\n labelBg: label.background,\n labelTitle: label.title,\n labelValue: label.value,\n radius,\n hasImage,\n alwaysLabelled: radius > LABEL_ALWAYS_ABOVE,\n };\n });\n}\n\nfunction appendNodeLabel(\n group: Selection<SVGGElement, SimNode, null, undefined>,\n datum: SimNode,\n radius: number,\n): {\n group: SVGGElement | null;\n background: SVGRectElement | null;\n title: SVGTextElement | null;\n value: SVGTextElement | null;\n} {\n const valueText = formatNodeValue(datum.value);\n if (!datum.label && !valueText) {\n return { group: null, background: null, title: null, value: null };\n }\n\n const labelGroup = group\n .append('g')\n .attr('class', 'node-label')\n .attr('transform', 'translate(1, 0)')\n .style('opacity', 0)\n .style('pointer-events', 'none');\n\n const background = labelGroup\n .append('rect')\n .attr('class', 'node-label-background')\n .attr('rx', 4)\n .attr('ry', 4)\n .attr('fill', NODE_LABEL_COLORS.background);\n\n const title = labelGroup\n .append('text')\n .attr('class', 'node-label-title')\n .text(datum.label)\n .attr('font-size', LABEL_TITLE_SIZE)\n .attr('font-weight', '400')\n .attr('fill', NODE_LABEL_COLORS.text)\n .attr('text-anchor', 'middle')\n .attr('dominant-baseline', 'hanging');\n\n const value = labelGroup\n .append('text')\n .attr('class', 'node-label-value')\n .text(valueText)\n .attr('font-size', LABEL_VALUE_SIZE)\n .attr('fill', NODE_LABEL_COLORS.text)\n .attr('text-anchor', 'middle')\n .attr('dominant-baseline', 'hanging');\n\n const paddingX = radius + LABEL_PADDING_GAP;\n const titleBox = measure(title.node());\n const valueBox = measure(value.node());\n const contentWidth = Math.max(titleBox?.width ?? 0, valueBox?.width ?? 0);\n const boxWidth = paddingX * 2 + contentWidth;\n const boxHeight =\n LABEL_PADDING_TOP + LABEL_TITLE_LINE + LABEL_VALUE_LINE + LABEL_PADDING_BOTTOM;\n const centerX = paddingX + contentWidth / 2;\n\n background\n .attr('x', 0)\n .attr('y', -boxHeight / 2)\n .attr('width', boxWidth)\n .attr('height', boxHeight);\n title.attr('x', centerX).attr('y', -boxHeight / 2 + LABEL_PADDING_TOP);\n value\n .attr('x', centerX)\n .attr('y', -boxHeight / 2 + LABEL_PADDING_TOP + LABEL_TITLE_LINE);\n\n return {\n group: labelGroup.node(),\n background: background.node(),\n title: title.node(),\n value: value.node(),\n };\n}\n\nfunction attachNodeInteractions(params: {\n nodes: NodeParts[];\n simulation: Simulation<SimNode, SimLink>;\n /** Read per event — the frame changes on resize without a rebuild. */\n getBounds: () => { width: number; height: number };\n radiusById: Map<string, number>;\n onHover: (id: string | null) => void;\n onClick: (id: string) => void;\n}): void {\n const { nodes, simulation, getBounds, radiusById, onHover, onClick } = params;\n let moved = false;\n let start: { x: number; y: number } | null = null;\n\n const behaviour = drag<SVGGElement, SimNode>()\n .filter((event: MouseEvent) => event.button === 0)\n .on('start', (event: D3DragEvent<SVGGElement, SimNode, unknown>, d) => {\n event.sourceEvent.stopPropagation();\n start = { x: event.sourceEvent.clientX, y: event.sourceEvent.clientY };\n moved = false;\n if (!event.active) simulation.alphaTarget(0.3).restart();\n const { width, height } = getBounds();\n d.fx = d.x ?? width / 2;\n d.fy = d.y ?? height / 2;\n })\n .on('drag', (event: D3DragEvent<SVGGElement, SimNode, unknown>, d) => {\n if (start) {\n const dx = event.sourceEvent.clientX - start.x;\n const dy = event.sourceEvent.clientY - start.y;\n if (Math.sqrt(dx * dx + dy * dy) > DRAG_SLOP) moved = true;\n }\n const { width, height } = getBounds();\n const radius = radiusById.get(d.id) ?? 0;\n d.fx = clamp((d.fx ?? d.x ?? 0) + event.dx, radius, width - radius);\n d.fy = clamp((d.fy ?? d.y ?? 0) + event.dy, radius, height - radius);\n })\n .on('end', (event: D3DragEvent<SVGGElement, SimNode, unknown>, d) => {\n if (!event.active) simulation.alphaTarget(0);\n d.fx = null;\n d.fy = null;\n start = null;\n });\n\n for (const part of nodes) {\n const group = select<SVGGElement, SimNode>(part.group);\n group.call(behaviour);\n\n const grab = group.select<SVGCircleElement>('.node-drag-area');\n grab.on('click', (event: MouseEvent) => {\n event.stopPropagation();\n if (moved) {\n moved = false;\n return;\n }\n onClick(part.datum.id);\n });\n grab.on('mouseenter', () => onHover(part.datum.id));\n grab.on('mouseleave', () => onHover(null));\n }\n}\n"],"names":["_a"],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/components/network-graph/render/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,kBAAkB,EAClB,kBAAkB,EAClB,gBAAgB,EAChB,4BAA4B,EAC5B,KAAK,sBAAsB,EAC3B,KAAK,yBAAyB,GAC/B,MAAM,WAAW,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"styles.d.ts","sourceRoot":"","sources":["../../../../src/components/parallel-coordinates-chart/element/styles.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,yBAAyB,yBAiErC,CAAC"}
|