@fusedashlabs/widgets 0.3.1 → 0.4.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 +37 -0
- package/README.md +1 -1
- package/dist/components/chart-renderer/element/ui9000-chart-renderer.d.ts +2 -0
- package/dist/components/chart-renderer/element/ui9000-chart-renderer.d.ts.map +1 -1
- package/dist/components/chart-renderer/element/ui9000-chart-renderer.js +23 -2
- package/dist/components/chart-renderer/element/ui9000-chart-renderer.js.map +1 -1
- package/dist/components/chart-renderer/lib/registry.d.ts.map +1 -1
- package/dist/components/chart-renderer/lib/registry.js +20 -5
- package/dist/components/chart-renderer/lib/registry.js.map +1 -1
- package/dist/components/chart-renderer/lib/types.d.ts +5 -0
- package/dist/components/chart-renderer/lib/types.d.ts.map +1 -1
- package/dist/components/donut-chart/element/ui9000-donut-chart.js +1 -1
- package/dist/components/donut-chart/element/ui9000-donut-chart.js.map +1 -1
- package/dist/components/kpi-widget/element/styles.d.ts.map +1 -1
- package/dist/components/kpi-widget/element/styles.js +268 -5
- package/dist/components/kpi-widget/element/styles.js.map +1 -1
- package/dist/components/kpi-widget/element/ui9000-kpi-widget.d.ts +10 -1
- package/dist/components/kpi-widget/element/ui9000-kpi-widget.d.ts.map +1 -1
- package/dist/components/kpi-widget/element/ui9000-kpi-widget.js +154 -27
- package/dist/components/kpi-widget/element/ui9000-kpi-widget.js.map +1 -1
- package/dist/components/kpi-widget/index.d.ts +1 -1
- package/dist/components/kpi-widget/index.d.ts.map +1 -1
- package/dist/components/kpi-widget/index.js +7 -4
- package/dist/components/kpi-widget/lib/extract.d.ts +5 -1
- package/dist/components/kpi-widget/lib/extract.d.ts.map +1 -1
- package/dist/components/kpi-widget/lib/extract.js +110 -34
- package/dist/components/kpi-widget/lib/extract.js.map +1 -1
- package/dist/components/kpi-widget/lib/format.d.ts +5 -0
- package/dist/components/kpi-widget/lib/format.d.ts.map +1 -1
- package/dist/components/kpi-widget/lib/format.js +10 -1
- package/dist/components/kpi-widget/lib/format.js.map +1 -1
- package/dist/components/kpi-widget/lib/grid.d.ts +5 -0
- package/dist/components/kpi-widget/lib/grid.d.ts.map +1 -1
- package/dist/components/kpi-widget/lib/grid.js +18 -0
- package/dist/components/kpi-widget/lib/grid.js.map +1 -1
- package/dist/components/kpi-widget/lib/index.d.ts +5 -5
- package/dist/components/kpi-widget/lib/index.d.ts.map +1 -1
- package/dist/components/kpi-widget/lib/normalize.d.ts +2 -0
- package/dist/components/kpi-widget/lib/normalize.d.ts.map +1 -1
- package/dist/components/kpi-widget/lib/normalize.js +73 -12
- package/dist/components/kpi-widget/lib/normalize.js.map +1 -1
- package/dist/components/kpi-widget/lib/types.d.ts +41 -0
- package/dist/components/kpi-widget/lib/types.d.ts.map +1 -1
- package/dist/components/kpi-widget/metadata.json.d.ts +1 -1
- package/dist/components/kpi-widget/metadata.json.js +1 -1
- package/dist/components/lollipop/element/styles.d.ts.map +1 -1
- package/dist/components/lollipop/element/styles.js +19 -1
- package/dist/components/lollipop/element/styles.js.map +1 -1
- package/dist/components/lollipop/element/ui9000-lollipop.d.ts +6 -1
- package/dist/components/lollipop/element/ui9000-lollipop.d.ts.map +1 -1
- package/dist/components/lollipop/element/ui9000-lollipop.js +68 -7
- package/dist/components/lollipop/element/ui9000-lollipop.js.map +1 -1
- package/dist/components/lollipop/index.d.ts +1 -1
- package/dist/components/lollipop/index.d.ts.map +1 -1
- package/dist/components/lollipop/index.js +2 -0
- package/dist/components/lollipop/index.js.map +1 -1
- package/dist/components/lollipop/lib/domain.d.ts +16 -1
- package/dist/components/lollipop/lib/domain.d.ts.map +1 -1
- package/dist/components/lollipop/lib/domain.js +56 -1
- package/dist/components/lollipop/lib/domain.js.map +1 -1
- package/dist/components/lollipop/lib/index.d.ts +3 -2
- package/dist/components/lollipop/lib/index.d.ts.map +1 -1
- package/dist/components/lollipop/lib/layout.d.ts +16 -0
- package/dist/components/lollipop/lib/layout.d.ts.map +1 -0
- package/dist/components/lollipop/lib/layout.js +16 -0
- package/dist/components/lollipop/lib/layout.js.map +1 -0
- package/dist/components/lollipop/lib/types.d.ts +5 -0
- package/dist/components/lollipop/lib/types.d.ts.map +1 -1
- package/dist/components/lollipop/metadata.json.d.ts +10 -0
- package/dist/components/lollipop/metadata.json.js +4 -1
- package/dist/components/lollipop/metadata.json.js.map +1 -1
- package/dist/components/lollipop/render/draw.d.ts +8 -1
- package/dist/components/lollipop/render/draw.d.ts.map +1 -1
- package/dist/components/lollipop/render/draw.js +155 -84
- package/dist/components/lollipop/render/draw.js.map +1 -1
- package/dist/components/map-chart/element/styles.d.ts +2 -0
- package/dist/components/map-chart/element/styles.d.ts.map +1 -0
- package/dist/components/map-chart/element/styles.js +372 -0
- package/dist/components/map-chart/element/styles.js.map +1 -0
- package/dist/components/map-chart/element/ui9000-map-chart.d.ts +54 -0
- package/dist/components/map-chart/element/ui9000-map-chart.d.ts.map +1 -0
- package/dist/components/map-chart/element/ui9000-map-chart.js +539 -0
- package/dist/components/map-chart/element/ui9000-map-chart.js.map +1 -0
- package/dist/components/map-chart/index.d.ts +5 -0
- package/dist/components/map-chart/index.d.ts.map +1 -0
- package/dist/components/map-chart/index.js +29 -0
- package/dist/components/map-chart/index.js.map +1 -0
- package/dist/components/map-chart/lib/constants.d.ts +34 -0
- package/dist/components/map-chart/lib/constants.d.ts.map +1 -0
- package/dist/components/map-chart/lib/constants.js +122 -0
- package/dist/components/map-chart/lib/constants.js.map +1 -0
- package/dist/components/map-chart/lib/domain.d.ts +12 -0
- package/dist/components/map-chart/lib/domain.d.ts.map +1 -0
- package/dist/components/map-chart/lib/domain.js +105 -0
- package/dist/components/map-chart/lib/domain.js.map +1 -0
- package/dist/components/map-chart/lib/format.d.ts +8 -0
- package/dist/components/map-chart/lib/format.d.ts.map +1 -0
- package/dist/components/map-chart/lib/format.js +45 -0
- package/dist/components/map-chart/lib/format.js.map +1 -0
- package/dist/components/map-chart/lib/geo-index.d.ts +7 -0
- package/dist/components/map-chart/lib/geo-index.d.ts.map +1 -0
- package/dist/components/map-chart/lib/geo-index.js +200 -0
- package/dist/components/map-chart/lib/geo-index.js.map +1 -0
- package/dist/components/map-chart/lib/geojson.d.ts +5 -0
- package/dist/components/map-chart/lib/geojson.d.ts.map +1 -0
- package/dist/components/map-chart/lib/geojson.js +47 -0
- package/dist/components/map-chart/lib/geojson.js.map +1 -0
- package/dist/components/map-chart/lib/index.d.ts +13 -0
- package/dist/components/map-chart/lib/index.d.ts.map +1 -0
- package/dist/components/map-chart/lib/join.d.ts +7 -0
- package/dist/components/map-chart/lib/join.d.ts.map +1 -0
- package/dist/components/map-chart/lib/join.js +156 -0
- package/dist/components/map-chart/lib/join.js.map +1 -0
- package/dist/components/map-chart/lib/legend.d.ts +45 -0
- package/dist/components/map-chart/lib/legend.d.ts.map +1 -0
- package/dist/components/map-chart/lib/legend.js +108 -0
- package/dist/components/map-chart/lib/legend.js.map +1 -0
- package/dist/components/map-chart/lib/normalize.d.ts +3 -0
- package/dist/components/map-chart/lib/normalize.d.ts.map +1 -0
- package/dist/components/map-chart/lib/normalize.js +177 -0
- package/dist/components/map-chart/lib/normalize.js.map +1 -0
- package/dist/components/map-chart/lib/pmtiles.d.ts +41 -0
- package/dist/components/map-chart/lib/pmtiles.d.ts.map +1 -0
- package/dist/components/map-chart/lib/pmtiles.js +112 -0
- package/dist/components/map-chart/lib/pmtiles.js.map +1 -0
- package/dist/components/map-chart/lib/types.d.ts +128 -0
- package/dist/components/map-chart/lib/types.d.ts.map +1 -0
- package/dist/components/map-chart/metadata.json.d.ts +83 -0
- package/dist/components/map-chart/metadata.json.js +42 -0
- package/dist/components/map-chart/metadata.json.js.map +1 -0
- package/dist/components/map-chart/render/draw.d.ts +24 -0
- package/dist/components/map-chart/render/draw.d.ts.map +1 -0
- package/dist/components/map-chart/render/draw.js +456 -0
- package/dist/components/map-chart/render/draw.js.map +1 -0
- package/dist/components/map-chart/render/index.d.ts +2 -0
- package/dist/components/map-chart/render/index.d.ts.map +1 -0
- package/dist/components/matrix-chart/element/styles.d.ts +2 -0
- package/dist/components/matrix-chart/element/styles.d.ts.map +1 -0
- package/dist/components/matrix-chart/element/styles.js +97 -0
- package/dist/components/matrix-chart/element/styles.js.map +1 -0
- package/dist/components/matrix-chart/element/ui9000-matrix-chart.d.ts +39 -0
- package/dist/components/matrix-chart/element/ui9000-matrix-chart.d.ts.map +1 -0
- package/dist/components/matrix-chart/element/ui9000-matrix-chart.js +238 -0
- package/dist/components/matrix-chart/element/ui9000-matrix-chart.js.map +1 -0
- package/dist/components/matrix-chart/index.d.ts +5 -0
- package/dist/components/matrix-chart/index.d.ts.map +1 -0
- package/dist/components/matrix-chart/index.js +20 -0
- package/dist/components/matrix-chart/lib/domain.d.ts +7 -0
- package/dist/components/matrix-chart/lib/domain.d.ts.map +1 -0
- package/dist/components/matrix-chart/lib/domain.js +58 -0
- package/dist/components/matrix-chart/lib/domain.js.map +1 -0
- package/dist/components/matrix-chart/lib/format.d.ts +5 -0
- package/dist/components/matrix-chart/lib/format.d.ts.map +1 -0
- package/dist/components/matrix-chart/lib/format.js +16 -0
- package/dist/components/matrix-chart/lib/format.js.map +1 -0
- package/dist/components/matrix-chart/lib/index.d.ts +5 -0
- package/dist/components/matrix-chart/lib/index.d.ts.map +1 -0
- package/dist/components/matrix-chart/lib/normalize.d.ts +5 -0
- package/dist/components/matrix-chart/lib/normalize.d.ts.map +1 -0
- package/dist/components/matrix-chart/lib/normalize.js +165 -0
- package/dist/components/matrix-chart/lib/normalize.js.map +1 -0
- package/dist/components/matrix-chart/lib/types.d.ts +33 -0
- package/dist/components/matrix-chart/lib/types.d.ts.map +1 -0
- package/dist/components/matrix-chart/metadata.json.d.ts +110 -0
- package/dist/components/matrix-chart/metadata.json.js +42 -0
- package/dist/components/matrix-chart/metadata.json.js.map +1 -0
- package/dist/components/matrix-chart/render/draw.d.ts +63 -0
- package/dist/components/matrix-chart/render/draw.d.ts.map +1 -0
- package/dist/components/matrix-chart/render/draw.js +225 -0
- package/dist/components/matrix-chart/render/draw.js.map +1 -0
- package/dist/components/matrix-chart/render/index.d.ts +2 -0
- package/dist/components/matrix-chart/render/index.d.ts.map +1 -0
- package/dist/components/network-graph/element/styles.d.ts.map +1 -1
- package/dist/components/network-graph/element/styles.js +177 -57
- package/dist/components/network-graph/element/styles.js.map +1 -1
- package/dist/components/network-graph/element/ui9000-network-graph.d.ts +4 -0
- package/dist/components/network-graph/element/ui9000-network-graph.d.ts.map +1 -1
- package/dist/components/network-graph/element/ui9000-network-graph.js +116 -39
- package/dist/components/network-graph/element/ui9000-network-graph.js.map +1 -1
- package/dist/components/network-graph/lib/domain.d.ts +2 -2
- package/dist/components/network-graph/lib/domain.js.map +1 -1
- package/dist/components/network-graph/lib/index.d.ts +1 -0
- package/dist/components/network-graph/lib/index.d.ts.map +1 -1
- package/dist/components/network-graph/lib/legend.d.ts +15 -0
- package/dist/components/network-graph/lib/legend.d.ts.map +1 -0
- package/dist/components/network-graph/lib/legend.js +35 -0
- package/dist/components/network-graph/lib/legend.js.map +1 -0
- package/dist/components/network-graph/render/draw.d.ts +4 -1
- package/dist/components/network-graph/render/draw.d.ts.map +1 -1
- package/dist/components/network-graph/render/draw.js +34 -9
- package/dist/components/network-graph/render/draw.js.map +1 -1
- package/dist/components/partial-dependence-chart/element/styles.d.ts +2 -0
- package/dist/components/partial-dependence-chart/element/styles.d.ts.map +1 -0
- package/dist/components/partial-dependence-chart/element/styles.js +48 -0
- package/dist/components/partial-dependence-chart/element/styles.js.map +1 -0
- package/dist/components/partial-dependence-chart/element/ui9000-partial-dependence-chart.d.ts +30 -0
- package/dist/components/partial-dependence-chart/element/ui9000-partial-dependence-chart.d.ts.map +1 -0
- package/dist/components/partial-dependence-chart/element/ui9000-partial-dependence-chart.js +163 -0
- package/dist/components/partial-dependence-chart/element/ui9000-partial-dependence-chart.js.map +1 -0
- package/dist/components/partial-dependence-chart/index.d.ts +5 -0
- package/dist/components/partial-dependence-chart/index.d.ts.map +1 -0
- package/dist/components/partial-dependence-chart/index.js +18 -0
- package/dist/components/partial-dependence-chart/index.js.map +1 -0
- package/dist/components/partial-dependence-chart/lib/domain.d.ts +6 -0
- package/dist/components/partial-dependence-chart/lib/domain.d.ts.map +1 -0
- package/dist/components/partial-dependence-chart/lib/domain.js +16 -0
- package/dist/components/partial-dependence-chart/lib/domain.js.map +1 -0
- package/dist/components/partial-dependence-chart/lib/index.d.ts +5 -0
- package/dist/components/partial-dependence-chart/lib/index.d.ts.map +1 -0
- package/dist/components/partial-dependence-chart/lib/normalize.d.ts +4 -0
- package/dist/components/partial-dependence-chart/lib/normalize.d.ts.map +1 -0
- package/dist/components/partial-dependence-chart/lib/normalize.js +167 -0
- package/dist/components/partial-dependence-chart/lib/normalize.js.map +1 -0
- package/dist/components/partial-dependence-chart/lib/series.d.ts +15 -0
- package/dist/components/partial-dependence-chart/lib/series.d.ts.map +1 -0
- package/dist/components/partial-dependence-chart/lib/series.js +63 -0
- package/dist/components/partial-dependence-chart/lib/series.js.map +1 -0
- package/dist/components/partial-dependence-chart/lib/types.d.ts +50 -0
- package/dist/components/partial-dependence-chart/lib/types.d.ts.map +1 -0
- package/dist/components/partial-dependence-chart/metadata.json.d.ts +80 -0
- package/dist/components/partial-dependence-chart/metadata.json.js +42 -0
- package/dist/components/partial-dependence-chart/metadata.json.js.map +1 -0
- package/dist/components/partial-dependence-chart/render/draw.d.ts +34 -0
- package/dist/components/partial-dependence-chart/render/draw.d.ts.map +1 -0
- package/dist/components/partial-dependence-chart/render/draw.js +95 -0
- package/dist/components/partial-dependence-chart/render/draw.js.map +1 -0
- package/dist/components/partial-dependence-chart/render/index.d.ts +2 -0
- package/dist/components/partial-dependence-chart/render/index.d.ts.map +1 -0
- package/dist/components/pie-chart/element/styles.d.ts.map +1 -1
- package/dist/components/pie-chart/element/styles.js +34 -1
- package/dist/components/pie-chart/element/styles.js.map +1 -1
- package/dist/components/pie-chart/element/ui9000-pie-chart.d.ts +0 -2
- package/dist/components/pie-chart/element/ui9000-pie-chart.d.ts.map +1 -1
- package/dist/components/pie-chart/element/ui9000-pie-chart.js +2 -8
- package/dist/components/pie-chart/element/ui9000-pie-chart.js.map +1 -1
- package/dist/components/pie-chart/metadata.json.d.ts +1 -7
- package/dist/components/pie-chart/metadata.json.js +2 -2
- package/dist/components/polar-area-chart/element/styles.d.ts +1 -1
- package/dist/components/polar-area-chart/element/styles.d.ts.map +1 -1
- package/dist/components/{donut-group-chart → polar-area-chart}/element/styles.js +9 -27
- package/dist/components/polar-area-chart/element/styles.js.map +1 -0
- package/dist/components/polar-area-chart/element/ui9000-polar-area-chart.d.ts.map +1 -1
- package/dist/components/polar-area-chart/element/ui9000-polar-area-chart.js +4 -3
- package/dist/components/polar-area-chart/element/ui9000-polar-area-chart.js.map +1 -1
- package/dist/components/polar-area-chart/index.d.ts +1 -1
- package/dist/components/polar-area-chart/index.d.ts.map +1 -1
- package/dist/components/polar-area-chart/index.js +2 -1
- package/dist/components/polar-area-chart/lib/domain.d.ts +8 -0
- package/dist/components/polar-area-chart/lib/domain.d.ts.map +1 -1
- package/dist/components/polar-area-chart/lib/domain.js +20 -0
- package/dist/components/polar-area-chart/lib/domain.js.map +1 -1
- package/dist/components/polar-area-chart/lib/index.d.ts +1 -1
- package/dist/components/polar-area-chart/lib/index.d.ts.map +1 -1
- package/dist/components/polar-area-chart/lib/normalize.d.ts.map +1 -1
- package/dist/components/polar-area-chart/lib/normalize.js +72 -6
- package/dist/components/polar-area-chart/lib/normalize.js.map +1 -1
- package/dist/components/polar-area-chart/lib/types.d.ts +6 -1
- package/dist/components/polar-area-chart/lib/types.d.ts.map +1 -1
- package/dist/components/polar-area-chart/metadata.json.d.ts +1 -1
- package/dist/components/polar-area-chart/metadata.json.js +1 -1
- package/dist/components/polar-area-chart/render/draw.d.ts.map +1 -1
- package/dist/components/polar-area-chart/render/draw.js +2 -2
- package/dist/components/polar-area-chart/render/draw.js.map +1 -1
- package/dist/components/punchcard-chart/metadata.json.d.ts +1 -1
- package/dist/components/punchcard-chart/metadata.json.js +1 -1
- package/dist/components/sankey-chart/element/styles.d.ts.map +1 -1
- package/dist/components/sankey-chart/element/styles.js +7 -27
- package/dist/components/sankey-chart/element/styles.js.map +1 -1
- package/dist/components/sankey-chart/element/ui9000-sankey-chart.d.ts +5 -5
- package/dist/components/sankey-chart/element/ui9000-sankey-chart.d.ts.map +1 -1
- package/dist/components/sankey-chart/element/ui9000-sankey-chart.js +37 -35
- package/dist/components/sankey-chart/element/ui9000-sankey-chart.js.map +1 -1
- package/dist/components/treemap-chart/element/styles.d.ts +2 -0
- package/dist/components/treemap-chart/element/styles.d.ts.map +1 -0
- package/dist/components/treemap-chart/element/styles.js +141 -0
- package/dist/components/treemap-chart/element/styles.js.map +1 -0
- package/dist/components/treemap-chart/element/ui9000-treemap-chart.d.ts +35 -0
- package/dist/components/treemap-chart/element/ui9000-treemap-chart.d.ts.map +1 -0
- package/dist/components/treemap-chart/element/ui9000-treemap-chart.js +177 -0
- package/dist/components/treemap-chart/element/ui9000-treemap-chart.js.map +1 -0
- package/dist/components/treemap-chart/index.d.ts +5 -0
- package/dist/components/treemap-chart/index.d.ts.map +1 -0
- package/dist/components/treemap-chart/index.js +22 -0
- package/dist/components/treemap-chart/index.js.map +1 -0
- package/dist/components/treemap-chart/lib/color.d.ts +25 -0
- package/dist/components/treemap-chart/lib/color.d.ts.map +1 -0
- package/dist/components/treemap-chart/lib/color.js +67 -0
- package/dist/components/treemap-chart/lib/color.js.map +1 -0
- package/dist/components/treemap-chart/lib/format.d.ts +7 -0
- package/dist/components/treemap-chart/lib/format.d.ts.map +1 -0
- package/dist/components/treemap-chart/lib/format.js +9 -0
- package/dist/components/treemap-chart/lib/format.js.map +1 -0
- package/dist/components/treemap-chart/lib/index.d.ts +6 -0
- package/dist/components/treemap-chart/lib/index.d.ts.map +1 -0
- package/dist/components/treemap-chart/lib/layout.d.ts +18 -0
- package/dist/components/treemap-chart/lib/layout.d.ts.map +1 -0
- package/dist/components/treemap-chart/lib/layout.js +31 -0
- package/dist/components/treemap-chart/lib/layout.js.map +1 -0
- package/dist/components/treemap-chart/lib/normalize.d.ts +4 -0
- package/dist/components/treemap-chart/lib/normalize.d.ts.map +1 -0
- package/dist/components/treemap-chart/lib/normalize.js +182 -0
- package/dist/components/treemap-chart/lib/normalize.js.map +1 -0
- package/dist/components/treemap-chart/lib/types.d.ts +63 -0
- package/dist/components/treemap-chart/lib/types.d.ts.map +1 -0
- package/dist/components/treemap-chart/metadata.json.d.ts +126 -0
- package/dist/components/treemap-chart/metadata.json.js +45 -0
- package/dist/components/treemap-chart/render/draw.d.ts +24 -0
- package/dist/components/treemap-chart/render/draw.d.ts.map +1 -0
- package/dist/components/treemap-chart/render/draw.js +124 -0
- package/dist/components/treemap-chart/render/draw.js.map +1 -0
- package/dist/components/treemap-chart/render/index.d.ts +2 -0
- package/dist/components/treemap-chart/render/index.d.ts.map +1 -0
- package/dist/element/chart-legend-render.d.ts +5 -0
- package/dist/element/chart-legend-render.d.ts.map +1 -1
- package/dist/element/chart-legend-render.js +19 -1
- package/dist/element/chart-legend-render.js.map +1 -1
- package/dist/element/chart-shell-styles.d.ts.map +1 -1
- package/dist/element/chart-shell-styles.js +35 -0
- package/dist/element/chart-shell-styles.js.map +1 -1
- package/dist/index.d.ts +11 -5
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +91 -42
- package/dist/index.js.map +1 -1
- package/dist/lazy/index.d.ts +5 -2
- package/dist/lazy/index.d.ts.map +1 -1
- package/dist/lazy/index.js +32 -8
- package/dist/lazy/index.js.map +1 -1
- package/dist/lazy/map-chart.d.ts +4 -0
- package/dist/lazy/map-chart.d.ts.map +1 -0
- package/dist/lazy/map-chart.js +5 -0
- package/dist/lazy/map-chart.js.map +1 -0
- package/dist/lazy/matrix-chart.d.ts +4 -0
- package/dist/lazy/matrix-chart.d.ts.map +1 -0
- package/dist/lazy/matrix-chart.js +5 -0
- package/dist/lazy/matrix-chart.js.map +1 -0
- package/dist/lazy/partial-dependence-chart.d.ts +4 -0
- package/dist/lazy/partial-dependence-chart.d.ts.map +1 -0
- package/dist/lazy/partial-dependence-chart.js +5 -0
- package/dist/lazy/partial-dependence-chart.js.map +1 -0
- package/dist/lazy/treemap-chart.d.ts +4 -0
- package/dist/lazy/treemap-chart.d.ts.map +1 -0
- package/dist/lazy/treemap-chart.js +5 -0
- package/dist/lazy/treemap-chart.js.map +1 -0
- package/dist/utils/axis-units.d.ts +15 -0
- package/dist/utils/axis-units.d.ts.map +1 -0
- package/dist/utils/axis-units.js +27 -0
- package/dist/utils/axis-units.js.map +1 -0
- package/dist/utils/chart-helpers.d.ts +6 -6
- package/dist/utils/chart-helpers.d.ts.map +1 -1
- package/dist/utils/chart-helpers.js +31 -15
- package/dist/utils/chart-helpers.js.map +1 -1
- package/dist/utils/format-text.d.ts +5 -0
- package/dist/utils/format-text.d.ts.map +1 -1
- package/dist/utils/format-text.js +7 -0
- package/dist/utils/format-text.js.map +1 -1
- package/dist/utils/fuse-palette.d.ts +12 -0
- package/dist/utils/fuse-palette.d.ts.map +1 -1
- package/dist/utils/fuse-palette.js +23 -1
- package/dist/utils/fuse-palette.js.map +1 -1
- package/dist/utils/fuse-widget.d.ts +13 -4
- package/dist/utils/fuse-widget.d.ts.map +1 -1
- package/dist/utils/fuse-widget.js.map +1 -1
- package/dist/utils/fusedash-visual.d.ts +77 -52
- package/dist/utils/fusedash-visual.d.ts.map +1 -1
- package/dist/utils/fusedash-visual.js +55 -29
- package/dist/utils/fusedash-visual.js.map +1 -1
- package/package.json +48 -12
- package/dist/components/donut-group-chart/element/styles.d.ts +0 -2
- package/dist/components/donut-group-chart/element/styles.d.ts.map +0 -1
- package/dist/components/donut-group-chart/element/styles.js.map +0 -1
- package/dist/components/donut-group-chart/element/ui9000-donut-group-chart.d.ts +0 -34
- package/dist/components/donut-group-chart/element/ui9000-donut-group-chart.d.ts.map +0 -1
- package/dist/components/donut-group-chart/element/ui9000-donut-group-chart.js +0 -169
- package/dist/components/donut-group-chart/element/ui9000-donut-group-chart.js.map +0 -1
- package/dist/components/donut-group-chart/index.d.ts +0 -5
- package/dist/components/donut-group-chart/index.d.ts.map +0 -1
- package/dist/components/donut-group-chart/index.js +0 -23
- package/dist/components/donut-group-chart/lib/domain.d.ts +0 -39
- package/dist/components/donut-group-chart/lib/domain.d.ts.map +0 -1
- package/dist/components/donut-group-chart/lib/domain.js +0 -51
- package/dist/components/donut-group-chart/lib/domain.js.map +0 -1
- package/dist/components/donut-group-chart/lib/format.d.ts +0 -7
- package/dist/components/donut-group-chart/lib/format.d.ts.map +0 -1
- package/dist/components/donut-group-chart/lib/format.js +0 -21
- package/dist/components/donut-group-chart/lib/format.js.map +0 -1
- package/dist/components/donut-group-chart/lib/index.d.ts +0 -5
- package/dist/components/donut-group-chart/lib/index.d.ts.map +0 -1
- package/dist/components/donut-group-chart/lib/normalize.d.ts +0 -14
- package/dist/components/donut-group-chart/lib/normalize.d.ts.map +0 -1
- package/dist/components/donut-group-chart/lib/normalize.js +0 -98
- package/dist/components/donut-group-chart/lib/normalize.js.map +0 -1
- package/dist/components/donut-group-chart/lib/types.d.ts +0 -49
- package/dist/components/donut-group-chart/lib/types.d.ts.map +0 -1
- package/dist/components/donut-group-chart/metadata.json.d.ts +0 -113
- package/dist/components/donut-group-chart/metadata.json.js +0 -45
- package/dist/components/donut-group-chart/render/draw.d.ts +0 -44
- package/dist/components/donut-group-chart/render/draw.d.ts.map +0 -1
- package/dist/components/donut-group-chart/render/draw.js +0 -194
- package/dist/components/donut-group-chart/render/draw.js.map +0 -1
- package/dist/components/donut-group-chart/render/index.d.ts +0 -2
- package/dist/components/donut-group-chart/render/index.d.ts.map +0 -1
- package/dist/components/donut-group-chart/tests/fixtures.d.ts +0 -33
- package/dist/components/donut-group-chart/tests/fixtures.d.ts.map +0 -1
- package/dist/lazy/donut-group-chart.d.ts +0 -4
- package/dist/lazy/donut-group-chart.d.ts.map +0 -1
- package/dist/lazy/donut-group-chart.js +0 -5
- package/dist/lazy/donut-group-chart.js.map +0 -1
- /package/dist/components/{donut-group-chart → matrix-chart}/index.js.map +0 -0
- /package/dist/components/{donut-group-chart → treemap-chart}/metadata.json.js.map +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fuse-palette.js","sources":["../../src/utils/fuse-palette.ts"],"sourcesContent":["/**\n * FuseDash palette resolution — mirrors\n * `client/.../getQualitativePalette` + `getCurrentColor` + SequentialColors1.\n */\n\nexport type FuseFormattingEntry = { key?: string; color?: string | number };\n\nexport const QUALITATIVE_2: string[] = ['#473DD9', '#36C4A5'];\n\nexport const QUALITATIVE_4: string[] = [\n '#473DD9',\n '#36C4A5',\n '#FF8C47',\n '#56546D',\n];\n\n/** Qualitative12Colors.default */\nexport const QUALITATIVE_12: string[] = [\n '#473DD9',\n '#938CFF',\n '#36C4A5',\n '#ADF4E5',\n '#BDBCC8',\n '#56546D',\n '#FF8C47',\n '#FFCEB0',\n '#FF4781',\n '#FFB0C9',\n '#47B0FF',\n '#B0DDFF',\n];\n\n/** SequentialColors1.default — punchcard magnitude bands */\nexport const SEQUENTIAL_1: string[] = [\n '#D6D3FF',\n '#B5B0FF',\n '#938CFF',\n '#7369FF',\n '#5448FF',\n '#473DD9',\n '#3C33B5',\n];\n\n/** FuseDash punchcard discrete radii per color band */\nexport const PUNCHCARD_RADII = [5, 10, 14, 17, 20, 24, 26] as const;\n\n/** Client PunchcardChart bubble + frame tokens */\nexport const PUNCHCARD_MAX_BUBBLE_RADIUS = 30;\nexport const PUNCHCARD_MIN_BUBBLE_RADIUS = 8;\nexport const PUNCHCARD_MIN_LABEL_RADIUS = 16;\nexport const PUNCHCARD_BOTTOM_MARGIN = 21;\nexport const PUNCHCARD_LABEL_GUTTER_PAD = 10;\n\n/** Tight left gutter from longest Y category (years ≈ 40px, not fixed 80). */\nexport function punchcardLeftGutter(\n categories: string[],\n fontSize = 11,\n): number {\n const longest = categories.reduce(\n (max, c) => Math.max(max, String(c).length),\n 0,\n );\n const chars = Math.max(longest, 3);\n return Math.ceil(chars * fontSize * 0.6) + PUNCHCARD_LABEL_GUTTER_PAD + 8;\n}\n\n/** @deprecated Use punchcardLeftGutter() */\nexport const PUNCHCARD_LEFT_MARGIN = 80;\n\n/** Max bubble radius that fits the plot without clipping (FuseDash range inset). */\nexport function punchcardLayoutMaxRadius(\n plotWidth: number,\n plotHeight: number,\n xCount: number,\n yCount: number,\n): number {\n if (xCount <= 0 || yCount <= 0) return PUNCHCARD_MAX_BUBBLE_RADIUS;\n const byX = plotWidth / xCount / 2;\n const byY = plotHeight / yCount / 2;\n return Math.min(PUNCHCARD_MAX_BUBBLE_RADIUS, byX, byY);\n}\n\n/**\n * Client rule: formatting.length ≤2 → Q2, 3–4 → Q4, >4 → Q12.\n * Falls back to seriesCount when formatting is empty.\n */\nexport function pickQualitativePalette(\n formattingCount: number,\n seriesCount = 1,\n): string[] {\n const n = formattingCount > 0 ? formattingCount : seriesCount;\n if (n > 4) return QUALITATIVE_12;\n if (n > 2) return QUALITATIVE_4;\n return QUALITATIVE_2;\n}\n\n/**\n * Resolve hex for a formatting key (group / category / \"default\").\n * Color indices are 1-based strings matching palette `key`.\n */\nexport function resolveFormattingColor(\n formatting: FuseFormattingEntry[] | null | undefined,\n key: string,\n seriesCount = 1,\n): string {\n const colors = formatting?.length\n ? formatting\n : [{ key: 'default', color: '1' }];\n const palette = pickQualitativePalette(colors.length, seriesCount);\n const entry = colors.find((item) => String(item.key) === String(key));\n const raw = entry?.color ?? colors[0]?.color ?? 1;\n const colorIndex = Number(raw);\n const idx = Number.isFinite(colorIndex) ? colorIndex : 1;\n // Client: find by key string first, else cycle (colorIndex - 1) % length\n const direct = palette[idx - 1];\n if (direct) return direct;\n return palette[(((idx - 1) % palette.length) + palette.length) % palette.length];\n}\n\n/** Apply qualitative colors onto a list of series/group ids. */\nexport function colorMapForKeys(\n keys: string[],\n formatting?: FuseFormattingEntry[] | null,\n): Map<string, string> {\n const map = new Map<string, string>();\n for (const key of keys) {\n map.set(key, resolveFormattingColor(formatting, key, keys.length));\n }\n return map;\n}\n\nexport type PunchcardColorRange = {\n color: string;\n radius: number;\n start: number;\n end: number;\n};\n\n/** Mirrors client `generateBreakPoints` (quantile ladder, default 7). */\nexport function generateBreakPoints(\n values: number[],\n numBreaks = 7,\n): number[] {\n const sorted = values\n .map((v) => (typeof v === 'number' ? v : Number(v)))\n .filter((v) => Number.isFinite(v))\n .slice()\n .sort((a, b) => a - b);\n if (!sorted.length || numBreaks < 2) return [];\n\n const breakPoints: number[] = [];\n for (let i = 0; i < numBreaks; i++) {\n const quantilePosition = (i / (numBreaks - 1)) * (sorted.length - 1);\n const lowerIndex = Math.max(0, Math.floor(quantilePosition));\n const upperIndex = Math.min(sorted.length - 1, Math.ceil(quantilePosition));\n const weight = quantilePosition - lowerIndex;\n breakPoints.push(\n sorted[lowerIndex] * (1 - weight) + sorted[upperIndex] * weight,\n );\n }\n return breakPoints;\n}\n\n/** Mirrors client `generateColorRanges` for punchcard bubbles. */\nexport function generatePunchcardColorRanges(\n values: number[],\n variations: string[] = SEQUENTIAL_1,\n): PunchcardColorRange[] {\n if (!variations.length || !values.length) return [];\n\n const sortedValues = [...new Set(values.map(Math.abs))].sort((a, b) => a - b);\n const steps = generateBreakPoints(sortedValues);\n if (!steps.length) return [];\n\n return steps.map((_step, i) => ({\n color: variations[i] ?? variations[variations.length - 1] ?? '#473DD9',\n radius: PUNCHCARD_RADII[i] ?? PUNCHCARD_RADII[PUNCHCARD_RADII.length - 1],\n start:\n -Math.ceil(\n i === steps.length - 1\n ? sortedValues[sortedValues.length - 1]\n : steps[i + 1],\n ) - 1,\n end:\n Math.ceil(\n i === steps.length - 1\n ? sortedValues[sortedValues.length - 1]\n : steps[i + 1],\n ) + 1,\n }));\n}\n\nexport function punchcardColorForValue(\n value: number,\n ranges: PunchcardColorRange[],\n): string {\n if (!ranges.length) return SEQUENTIAL_1[0];\n if (!value) return ranges[0].color;\n const range = ranges.find((r) => value >= r.start && value <= r.end);\n return range?.color ?? ranges[0].color;\n}\n\nexport function punchcardRadiusForValue(\n value: number,\n ranges: PunchcardColorRange[],\n): number {\n if (!ranges.length) return 5;\n const abs = Math.abs(value);\n const range = ranges.find((r) => abs >= r.start && abs <= r.end);\n return range?.radius ?? 5;\n}\n\n/** Mirrors client BubbleChart `generateColorRanges` — transparent bands, radius-only. */\nexport function generateBubbleColorRanges(\n values: number[],\n ranges?: number[] | null,\n): PunchcardColorRange[] {\n if (!values.length) return [];\n\n const absValues = [...new Set(values.map(Math.abs))].sort((a, b) => a - b);\n const absCount = absValues.length;\n const steps = ranges?.length ? ranges : generateBreakPoints(absValues);\n if (!steps.length) return [];\n\n return steps.map((step, i) => ({\n color: 'transparent',\n radius: PUNCHCARD_RADII[i] ?? PUNCHCARD_RADII[PUNCHCARD_RADII.length - 1],\n start: step,\n end:\n i === steps.length - 1\n ? absCount > 0\n ? absValues[absCount - 1]\n : 0\n : steps[i + 1],\n }));\n}\n\n/** Alias — bubble radii use the same abs(y) band lookup as punchcard. */\nexport const bubbleRadiusForValue = punchcardRadiusForValue;\n\n/** Scale discrete band radii when plot is shorter than FuseDash default height. */\nexport function punchcardScaledRadius(\n value: number,\n ranges: PunchcardColorRange[],\n layoutMaxR: number,\n): number {\n const raw = punchcardRadiusForValue(value, ranges);\n const bandMax = Math.max(...ranges.map((r) => r.radius), PUNCHCARD_MIN_BUBBLE_RADIUS);\n const scale = layoutMaxR / Math.max(bandMax, PUNCHCARD_MIN_BUBBLE_RADIUS);\n return Math.max(\n PUNCHCARD_MIN_BUBBLE_RADIUS,\n Math.min(layoutMaxR, raw * Math.min(1, scale)),\n );\n}\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"fuse-palette.js","sources":["../../src/utils/fuse-palette.ts"],"sourcesContent":["/**\n * FuseDash palette resolution — mirrors\n * `client/.../getQualitativePalette` + `getCurrentColor` + SequentialColors1.\n */\n\nexport type FuseFormattingEntry = { key?: string; color?: string | number };\n\nexport const QUALITATIVE_2: string[] = ['#473DD9', '#36C4A5'];\n\nexport const QUALITATIVE_4: string[] = [\n '#473DD9',\n '#36C4A5',\n '#FF8C47',\n '#56546D',\n];\n\n/** Qualitative12Colors.default */\nexport const QUALITATIVE_12: string[] = [\n '#473DD9',\n '#938CFF',\n '#36C4A5',\n '#ADF4E5',\n '#BDBCC8',\n '#56546D',\n '#FF8C47',\n '#FFCEB0',\n '#FF4781',\n '#FFB0C9',\n '#47B0FF',\n '#B0DDFF',\n];\n\n/** SequentialColors1.default — punchcard magnitude bands */\nexport const SEQUENTIAL_1: string[] = [\n '#D6D3FF',\n '#B5B0FF',\n '#938CFF',\n '#7369FF',\n '#5448FF',\n '#473DD9',\n '#3C33B5',\n];\n\n/** FuseDash punchcard discrete radii per color band */\nexport const PUNCHCARD_RADII = [5, 10, 14, 17, 20, 24, 26] as const;\n\n/** Client PunchcardChart bubble + frame tokens */\nexport const PUNCHCARD_MAX_BUBBLE_RADIUS = 30;\nexport const PUNCHCARD_MIN_BUBBLE_RADIUS = 8;\nexport const PUNCHCARD_MIN_LABEL_RADIUS = 16;\nexport const PUNCHCARD_BOTTOM_MARGIN = 21;\nexport const PUNCHCARD_LABEL_GUTTER_PAD = 10;\n\n/** Tight left gutter from longest Y category (years ≈ 40px, not fixed 80). */\nexport function punchcardLeftGutter(\n categories: string[],\n fontSize = 11,\n): number {\n const longest = categories.reduce(\n (max, c) => Math.max(max, String(c).length),\n 0,\n );\n const chars = Math.max(longest, 3);\n return Math.ceil(chars * fontSize * 0.6) + PUNCHCARD_LABEL_GUTTER_PAD + 8;\n}\n\n/** @deprecated Use punchcardLeftGutter() */\nexport const PUNCHCARD_LEFT_MARGIN = 80;\n\n/** Max bubble radius that fits the plot without clipping (FuseDash range inset). */\nexport function punchcardLayoutMaxRadius(\n plotWidth: number,\n plotHeight: number,\n xCount: number,\n yCount: number,\n): number {\n if (xCount <= 0 || yCount <= 0) return PUNCHCARD_MAX_BUBBLE_RADIUS;\n const byX = plotWidth / xCount / 2;\n const byY = plotHeight / yCount / 2;\n return Math.min(PUNCHCARD_MAX_BUBBLE_RADIUS, byX, byY);\n}\n\n/**\n * Client rule: formatting.length ≤2 → Q2, 3–4 → Q4, >4 → Q12.\n * Falls back to seriesCount when formatting is empty.\n */\nexport function pickQualitativePalette(\n formattingCount: number,\n seriesCount = 1,\n): string[] {\n const n = formattingCount > 0 ? formattingCount : seriesCount;\n if (n > 4) return QUALITATIVE_12;\n if (n > 2) return QUALITATIVE_4;\n return QUALITATIVE_2;\n}\n\n/**\n * Resolve hex for a formatting key (group / category / \"default\").\n * Color indices are 1-based strings matching palette `key`.\n */\nexport function resolveFormattingColor(\n formatting: FuseFormattingEntry[] | null | undefined,\n key: string,\n seriesCount = 1,\n): string {\n const colors = formatting?.length\n ? formatting\n : [{ key: 'default', color: '1' }];\n const palette = pickQualitativePalette(colors.length, seriesCount);\n const entry = colors.find((item) => String(item.key) === String(key));\n const raw = entry?.color ?? colors[0]?.color ?? 1;\n const colorIndex = Number(raw);\n const idx = Number.isFinite(colorIndex) ? colorIndex : 1;\n // Client: find by key string first, else cycle (colorIndex - 1) % length\n const direct = palette[idx - 1];\n if (direct) return direct;\n return palette[(((idx - 1) % palette.length) + palette.length) % palette.length];\n}\n\n/** Apply qualitative colors onto a list of series/group ids. */\nexport function colorMapForKeys(\n keys: string[],\n formatting?: FuseFormattingEntry[] | null,\n): Map<string, string> {\n const map = new Map<string, string>();\n for (const key of keys) {\n map.set(key, resolveFormattingColor(formatting, key, keys.length));\n }\n return map;\n}\n\nexport type PunchcardColorRange = {\n color: string;\n radius: number;\n start: number;\n end: number;\n};\n\n/** Mirrors client `generateBreakPoints` (quantile ladder, default 7). */\nexport function generateBreakPoints(\n values: number[],\n numBreaks = 7,\n): number[] {\n const sorted = values\n .map((v) => (typeof v === 'number' ? v : Number(v)))\n .filter((v) => Number.isFinite(v))\n .slice()\n .sort((a, b) => a - b);\n if (!sorted.length || numBreaks < 2) return [];\n\n const breakPoints: number[] = [];\n for (let i = 0; i < numBreaks; i++) {\n const quantilePosition = (i / (numBreaks - 1)) * (sorted.length - 1);\n const lowerIndex = Math.max(0, Math.floor(quantilePosition));\n const upperIndex = Math.min(sorted.length - 1, Math.ceil(quantilePosition));\n const weight = quantilePosition - lowerIndex;\n breakPoints.push(\n sorted[lowerIndex] * (1 - weight) + sorted[upperIndex] * weight,\n );\n }\n return breakPoints;\n}\n\n/** Mirrors client `generateColorRanges` for punchcard bubbles. */\nexport function generatePunchcardColorRanges(\n values: number[],\n variations: string[] = SEQUENTIAL_1,\n): PunchcardColorRange[] {\n if (!variations.length || !values.length) return [];\n\n const sortedValues = [...new Set(values.map(Math.abs))].sort((a, b) => a - b);\n const steps = generateBreakPoints(sortedValues);\n if (!steps.length) return [];\n\n return steps.map((_step, i) => ({\n color: variations[i] ?? variations[variations.length - 1] ?? '#473DD9',\n radius: PUNCHCARD_RADII[i] ?? PUNCHCARD_RADII[PUNCHCARD_RADII.length - 1],\n start:\n -Math.ceil(\n i === steps.length - 1\n ? sortedValues[sortedValues.length - 1]\n : steps[i + 1],\n ) - 1,\n end:\n Math.ceil(\n i === steps.length - 1\n ? sortedValues[sortedValues.length - 1]\n : steps[i + 1],\n ) + 1,\n }));\n}\n\nexport function punchcardColorForValue(\n value: number,\n ranges: PunchcardColorRange[],\n): string {\n if (!ranges.length) return SEQUENTIAL_1[0];\n if (!value) return ranges[0].color;\n const range = ranges.find((r) => value >= r.start && value <= r.end);\n return range?.color ?? ranges[0].color;\n}\n\nexport function punchcardRadiusForValue(\n value: number,\n ranges: PunchcardColorRange[],\n): number {\n if (!ranges.length) return 5;\n const abs = Math.abs(value);\n const range = ranges.find((r) => abs >= r.start && abs <= r.end);\n return range?.radius ?? 5;\n}\n\n/** Mirrors client BubbleChart `generateColorRanges` — transparent bands, radius-only. */\nexport function generateBubbleColorRanges(\n values: number[],\n ranges?: number[] | null,\n): PunchcardColorRange[] {\n if (!values.length) return [];\n\n const absValues = [...new Set(values.map(Math.abs))].sort((a, b) => a - b);\n const absCount = absValues.length;\n const steps = ranges?.length ? ranges : generateBreakPoints(absValues);\n if (!steps.length) return [];\n\n return steps.map((step, i) => ({\n color: 'transparent',\n radius: PUNCHCARD_RADII[i] ?? PUNCHCARD_RADII[PUNCHCARD_RADII.length - 1],\n start: step,\n end:\n i === steps.length - 1\n ? absCount > 0\n ? absValues[absCount - 1]\n : 0\n : steps[i + 1],\n }));\n}\n\n/** Alias — bubble radii use the same abs(y) band lookup as punchcard. */\nexport const bubbleRadiusForValue = punchcardRadiusForValue;\n\n/** Scale discrete band radii when plot is shorter than FuseDash default height. */\nexport function punchcardScaledRadius(\n value: number,\n ranges: PunchcardColorRange[],\n layoutMaxR: number,\n): number {\n const raw = punchcardRadiusForValue(value, ranges);\n const bandMax = Math.max(...ranges.map((r) => r.radius), PUNCHCARD_MIN_BUBBLE_RADIUS);\n const scale = layoutMaxR / Math.max(bandMax, PUNCHCARD_MIN_BUBBLE_RADIUS);\n return Math.max(\n PUNCHCARD_MIN_BUBBLE_RADIUS,\n Math.min(layoutMaxR, raw * Math.min(1, scale)),\n );\n}\n\nexport type SequentialColorRange = {\n color: string;\n start: number;\n end: number;\n};\n\n/**\n * Mirrors client `generateColorRanges` (MatrixChart / palette legend):\n * a quantile ladder over the distinct values, one band per palette color.\n */\nexport function generateSequentialColorRanges(\n values: number[],\n variations: string[] = SEQUENTIAL_1,\n ranges?: number[] | null,\n): SequentialColorRange[] {\n if (!variations.length || !values.length) return [];\n\n const sortedValues = [...new Set(values)].sort((a, b) => a - b);\n const steps = ranges?.length ? ranges : generateBreakPoints(sortedValues);\n const count = Math.min(steps.length, variations.length);\n\n const out: SequentialColorRange[] = [];\n for (let i = 0; i < count; i += 1) {\n out.push({\n color: variations[i],\n start: Number(steps[i]),\n end:\n i === count - 1\n ? sortedValues[sortedValues.length - 1]\n : Number(steps[i + 1]),\n });\n }\n return out;\n}\n\n/** Client `getColor`: first band containing the value, else the lowest band. */\nexport function sequentialColorForValue(\n value: number,\n ranges: SequentialColorRange[],\n): string | null {\n if (!ranges.length) return null;\n const range = ranges.find((r) => value >= r.start && value <= r.end);\n return range?.color ?? ranges[0].color;\n}\n"],"names":[],"mappings":"AAOO,MAAM,gBAA0B,CAAC,WAAW,SAAS;AAErD,MAAM,gBAA0B;AAAA,EACrC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAGO,MAAM,iBAA2B;AAAA,EACtC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAGO,MAAM,eAAyB;AAAA,EACpC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAGO,MAAM,kBAAkB,CAAC,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,EAAE;AAGlD,MAAM,8BAA8B;AACpC,MAAM,8BAA8B;AACpC,MAAM,6BAA6B;AACnC,MAAM,0BAA0B;AAChC,MAAM,6BAA6B;AAGnC,SAAS,oBACd,YACA,WAAW,IACH;AACR,QAAM,UAAU,WAAW;AAAA,IACzB,CAAC,KAAK,MAAM,KAAK,IAAI,KAAK,OAAO,CAAC,EAAE,MAAM;AAAA,IAC1C;AAAA,EAAA;AAEF,QAAM,QAAQ,KAAK,IAAI,SAAS,CAAC;AACjC,SAAO,KAAK,KAAK,QAAQ,WAAW,GAAG,IAAI,6BAA6B;AAC1E;AAMO,SAAS,yBACd,WACA,YACA,QACA,QACQ;AACR,MAAI,UAAU,KAAK,UAAU,EAAG,QAAO;AACvC,QAAM,MAAM,YAAY,SAAS;AACjC,QAAM,MAAM,aAAa,SAAS;AAClC,SAAO,KAAK,IAAI,6BAA6B,KAAK,GAAG;AACvD;AAMO,SAAS,uBACd,iBACA,cAAc,GACJ;AACV,QAAM,IAAI,kBAAkB,IAAI,kBAAkB;AAClD,MAAI,IAAI,EAAG,QAAO;AAClB,MAAI,IAAI,EAAG,QAAO;AAClB,SAAO;AACT;AAMO,SAAS,uBACd,YACA,KACA,cAAc,GACN;AAjGH;AAkGL,QAAM,UAAS,yCAAY,UACvB,aACA,CAAC,EAAE,KAAK,WAAW,OAAO,KAAK;AACnC,QAAM,UAAU,uBAAuB,OAAO,QAAQ,WAAW;AACjE,QAAM,QAAQ,OAAO,KAAK,CAAC,SAAS,OAAO,KAAK,GAAG,MAAM,OAAO,GAAG,CAAC;AACpE,QAAM,OAAM,+BAAO,YAAS,YAAO,CAAC,MAAR,mBAAW,UAAS;AAChD,QAAM,aAAa,OAAO,GAAG;AAC7B,QAAM,MAAM,OAAO,SAAS,UAAU,IAAI,aAAa;AAEvD,QAAM,SAAS,QAAQ,MAAM,CAAC;AAC9B,MAAI,OAAQ,QAAO;AACnB,SAAO,UAAW,MAAM,KAAK,QAAQ,SAAU,QAAQ,UAAU,QAAQ,MAAM;AACjF;AAsBO,SAAS,oBACd,QACA,YAAY,GACF;AACV,QAAM,SAAS,OACZ,IAAI,CAAC,MAAO,OAAO,MAAM,WAAW,IAAI,OAAO,CAAC,CAAE,EAClD,OAAO,CAAC,MAAM,OAAO,SAAS,CAAC,CAAC,EAChC,QACA,KAAK,CAAC,GAAG,MAAM,IAAI,CAAC;AACvB,MAAI,CAAC,OAAO,UAAU,YAAY,UAAU,CAAA;AAE5C,QAAM,cAAwB,CAAA;AAC9B,WAAS,IAAI,GAAG,IAAI,WAAW,KAAK;AAClC,UAAM,mBAAoB,KAAK,YAAY,MAAO,OAAO,SAAS;AAClE,UAAM,aAAa,KAAK,IAAI,GAAG,KAAK,MAAM,gBAAgB,CAAC;AAC3D,UAAM,aAAa,KAAK,IAAI,OAAO,SAAS,GAAG,KAAK,KAAK,gBAAgB,CAAC;AAC1E,UAAM,SAAS,mBAAmB;AAClC,gBAAY;AAAA,MACV,OAAO,UAAU,KAAK,IAAI,UAAU,OAAO,UAAU,IAAI;AAAA,IAAA;AAAA,EAE7D;AACA,SAAO;AACT;AAGO,SAAS,6BACd,QACA,aAAuB,cACA;AACvB,MAAI,CAAC,WAAW,UAAU,CAAC,OAAO,eAAe,CAAA;AAEjD,QAAM,eAAe,CAAC,GAAG,IAAI,IAAI,OAAO,IAAI,KAAK,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,GAAG,MAAM,IAAI,CAAC;AAC5E,QAAM,QAAQ,oBAAoB,YAAY;AAC9C,MAAI,CAAC,MAAM,OAAQ,QAAO,CAAA;AAE1B,SAAO,MAAM,IAAI,CAAC,OAAO,OAAO;AAAA,IAC9B,OAAO,WAAW,CAAC,KAAK,WAAW,WAAW,SAAS,CAAC,KAAK;AAAA,IAC7D,QAAQ,gBAAgB,CAAC,KAAK,gBAAgB,gBAAgB,SAAS,CAAC;AAAA,IACxE,OACE,CAAC,KAAK;AAAA,MACJ,MAAM,MAAM,SAAS,IACjB,aAAa,aAAa,SAAS,CAAC,IACpC,MAAM,IAAI,CAAC;AAAA,IAAA,IACb;AAAA,IACN,KACE,KAAK;AAAA,MACH,MAAM,MAAM,SAAS,IACjB,aAAa,aAAa,SAAS,CAAC,IACpC,MAAM,IAAI,CAAC;AAAA,IAAA,IACb;AAAA,EAAA,EACN;AACJ;AAEO,SAAS,uBACd,OACA,QACQ;AACR,MAAI,CAAC,OAAO,OAAQ,QAAO,aAAa,CAAC;AACzC,MAAI,CAAC,MAAO,QAAO,OAAO,CAAC,EAAE;AAC7B,QAAM,QAAQ,OAAO,KAAK,CAAC,MAAM,SAAS,EAAE,SAAS,SAAS,EAAE,GAAG;AACnE,UAAO,+BAAO,UAAS,OAAO,CAAC,EAAE;AACnC;AAEO,SAAS,wBACd,OACA,QACQ;AACR,MAAI,CAAC,OAAO,OAAQ,QAAO;AAC3B,QAAM,MAAM,KAAK,IAAI,KAAK;AAC1B,QAAM,QAAQ,OAAO,KAAK,CAAC,MAAM,OAAO,EAAE,SAAS,OAAO,EAAE,GAAG;AAC/D,UAAO,+BAAO,WAAU;AAC1B;AAGO,SAAS,0BACd,QACA,QACuB;AACvB,MAAI,CAAC,OAAO,OAAQ,QAAO,CAAA;AAE3B,QAAM,YAAY,CAAC,GAAG,IAAI,IAAI,OAAO,IAAI,KAAK,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,GAAG,MAAM,IAAI,CAAC;AACzE,QAAM,WAAW,UAAU;AAC3B,QAAM,SAAQ,iCAAQ,UAAS,SAAS,oBAAoB,SAAS;AACrE,MAAI,CAAC,MAAM,OAAQ,QAAO,CAAA;AAE1B,SAAO,MAAM,IAAI,CAAC,MAAM,OAAO;AAAA,IAC7B,OAAO;AAAA,IACP,QAAQ,gBAAgB,CAAC,KAAK,gBAAgB,gBAAgB,SAAS,CAAC;AAAA,IACxE,OAAO;AAAA,IACP,KACE,MAAM,MAAM,SAAS,IACjB,WAAW,IACT,UAAU,WAAW,CAAC,IACtB,IACF,MAAM,IAAI,CAAC;AAAA,EAAA,EACjB;AACJ;AAGO,MAAM,uBAAuB;AAG7B,SAAS,sBACd,OACA,QACA,YACQ;AACR,QAAM,MAAM,wBAAwB,OAAO,MAAM;AACjD,QAAM,UAAU,KAAK,IAAI,GAAG,OAAO,IAAI,CAAC,MAAM,EAAE,MAAM,GAAG,2BAA2B;AACpF,QAAM,QAAQ,aAAa,KAAK,IAAI,SAAS,2BAA2B;AACxE,SAAO,KAAK;AAAA,IACV;AAAA,IACA,KAAK,IAAI,YAAY,MAAM,KAAK,IAAI,GAAG,KAAK,CAAC;AAAA,EAAA;AAEjD;AAYO,SAAS,8BACd,QACA,aAAuB,cACvB,QACwB;AACxB,MAAI,CAAC,WAAW,UAAU,CAAC,OAAO,eAAe,CAAA;AAEjD,QAAM,eAAe,CAAC,GAAG,IAAI,IAAI,MAAM,CAAC,EAAE,KAAK,CAAC,GAAG,MAAM,IAAI,CAAC;AAC9D,QAAM,QAAkC,oBAAoB,YAAY;AACxE,QAAM,QAAQ,KAAK,IAAI,MAAM,QAAQ,WAAW,MAAM;AAEtD,QAAM,MAA8B,CAAA;AACpC,WAAS,IAAI,GAAG,IAAI,OAAO,KAAK,GAAG;AACjC,QAAI,KAAK;AAAA,MACP,OAAO,WAAW,CAAC;AAAA,MACnB,OAAO,OAAO,MAAM,CAAC,CAAC;AAAA,MACtB,KACE,MAAM,QAAQ,IACV,aAAa,aAAa,SAAS,CAAC,IACpC,OAAO,MAAM,IAAI,CAAC,CAAC;AAAA,IAAA,CAC1B;AAAA,EACH;AACA,SAAO;AACT;AAGO,SAAS,wBACd,OACA,QACe;AACf,MAAI,CAAC,OAAO,OAAQ,QAAO;AAC3B,QAAM,QAAQ,OAAO,KAAK,CAAC,MAAM,SAAS,EAAE,SAAS,SAAS,EAAE,GAAG;AACnE,UAAO,+BAAO,UAAS,OAAO,CAAC,EAAE;AACnC;"}
|
|
@@ -1,10 +1,17 @@
|
|
|
1
|
+
import { AxisDetail } from './axis-units.js';
|
|
1
2
|
import { FuseFormattingEntry } from './fuse-palette.js';
|
|
3
|
+
import { FuseAxisDetail } from './format-text.js';
|
|
4
|
+
export type { FuseAxisDetail };
|
|
2
5
|
export type FuseWidgetLike = {
|
|
3
6
|
chartType?: string;
|
|
4
7
|
stacked?: boolean;
|
|
5
8
|
xAxe?: string | string[] | null;
|
|
6
9
|
yAxe?: string | string[] | null;
|
|
7
10
|
groupBy?: string | string[] | null;
|
|
11
|
+
/** Treemap nests this second dimension inside each `groupBy` card */
|
|
12
|
+
subgroup?: string | null;
|
|
13
|
+
/** Treemap / KPI measured column — takes precedence over `yAxe` */
|
|
14
|
+
metric?: string | string[] | null;
|
|
8
15
|
uniqueValues?: Record<string, string[]> | null;
|
|
9
16
|
orientation?: string | null;
|
|
10
17
|
formatting?: FuseFormattingEntry[] | null;
|
|
@@ -12,10 +19,12 @@ export type FuseWidgetLike = {
|
|
|
12
19
|
key?: string;
|
|
13
20
|
shape?: string;
|
|
14
21
|
}> | null;
|
|
15
|
-
axisDetails?: Record<string,
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
22
|
+
axisDetails?: Record<string, AxisDetail> | null;
|
|
23
|
+
/** Widget palette overrides — `range` pins the treemap color break points */
|
|
24
|
+
palette?: {
|
|
25
|
+
paletteId?: string;
|
|
26
|
+
range?: number[];
|
|
27
|
+
} | null;
|
|
19
28
|
data?: unknown;
|
|
20
29
|
};
|
|
21
30
|
export declare function firstField(value: string | string[] | null | undefined): string | undefined;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fuse-widget.d.ts","sourceRoot":"","sources":["../../src/utils/fuse-widget.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"fuse-widget.d.ts","sourceRoot":"","sources":["../../src/utils/fuse-widget.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AAC7D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAEvD,YAAY,EAAE,cAAc,EAAE,CAAC;AAE/B,MAAM,MAAM,cAAc,GAAG;IAC3B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,IAAI,CAAC;IAChC,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,IAAI,CAAC;IAChC,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,IAAI,CAAC;IACnC,qEAAqE;IACrE,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,mEAAmE;IACnE,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,IAAI,CAAC;IAClC,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,GAAG,IAAI,CAAC;IAC/C,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,UAAU,CAAC,EAAE,mBAAmB,EAAE,GAAG,IAAI,CAAC;IAC1C,OAAO,CAAC,EAAE,KAAK,CAAC;QAAE,GAAG,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,GAAG,IAAI,CAAC;IACzD,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,GAAG,IAAI,CAAC;IAChD,6EAA6E;IAC7E,OAAO,CAAC,EAAE;QAAE,SAAS,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,EAAE,CAAA;KAAE,GAAG,IAAI,CAAC;IAC1D,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB,CAAC;AAEF,wBAAgB,UAAU,CACxB,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,IAAI,GAAG,SAAS,GAC1C,MAAM,GAAG,SAAS,CAOpB;AAED,2EAA2E;AAC3E,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,cAAc,CAI3E;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,cAAc,GAAG,MAAM,GAAG,SAAS,CAK5E;AAED,wBAAgB,MAAM,CAAC,MAAM,EAAE,cAAc,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAKxE;AAED,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE,CAI7D;AAED;;;GAGG;AACH,wBAAgB,wBAAwB,CACtC,QAAQ,EAAE,QAAQ,CAAC,MAAM,CAAC,EAC1B,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,GAAG,IAAI,GAAG,SAAS,EACzD,QAAQ,EAAE,MAAM,GAAG,SAAS,GAC3B,MAAM,EAAE,CAsBV;AAED,4DAA4D;AAC5D,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,cAAc,GACrB,MAAM,EAAE,GAAG,SAAS,CAItB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fuse-widget.js","sources":["../../src/utils/fuse-widget.ts"],"sourcesContent":["/**\n * Shared helpers for FuseDash WidgetItem-shaped payloads from\n * `client/apps/charts/src/app/constants/default*.ts`.\n */\n\nimport type { FuseFormattingEntry } from './fuse-palette.js';\n\nexport type FuseWidgetLike = {\n chartType?: string;\n stacked?: boolean;\n xAxe?: string | string[] | null;\n yAxe?: string | string[] | null;\n groupBy?: string | string[] | null;\n uniqueValues?: Record<string, string[]> | null;\n orientation?: string | null;\n formatting?: FuseFormattingEntry[] | null;\n markers?: Array<{ key?: string; shape?: string }> | null;\n axisDetails?: Record<string, {
|
|
1
|
+
{"version":3,"file":"fuse-widget.js","sources":["../../src/utils/fuse-widget.ts"],"sourcesContent":["/**\n * Shared helpers for FuseDash WidgetItem-shaped payloads from\n * `client/apps/charts/src/app/constants/default*.ts`.\n */\n\nimport type { AxisDetail } from './axis-units.js';\nimport type { FuseFormattingEntry } from './fuse-palette.js';\nimport type { FuseAxisDetail } from './format-text.js';\n\nexport type { FuseAxisDetail };\n\nexport type FuseWidgetLike = {\n chartType?: string;\n stacked?: boolean;\n xAxe?: string | string[] | null;\n yAxe?: string | string[] | null;\n groupBy?: string | string[] | null;\n /** Treemap nests this second dimension inside each `groupBy` card */\n subgroup?: string | null;\n /** Treemap / KPI measured column — takes precedence over `yAxe` */\n metric?: string | string[] | null;\n uniqueValues?: Record<string, string[]> | null;\n orientation?: string | null;\n formatting?: FuseFormattingEntry[] | null;\n markers?: Array<{ key?: string; shape?: string }> | null;\n axisDetails?: Record<string, AxisDetail> | null;\n /** Widget palette overrides — `range` pins the treemap color break points */\n palette?: { paletteId?: string; range?: number[] } | null;\n data?: unknown;\n};\n\nexport function firstField(\n value: string | string[] | null | undefined,\n): string | undefined {\n if (Array.isArray(value)) {\n const v = value[0];\n return v != null && String(v) !== '' ? String(v) : undefined;\n }\n if (value == null || value === '') return undefined;\n return String(value);\n}\n\n/** True when payload looks like a FuseDash widget (`data` rows + axes). */\nexport function isFuseWidgetPayload(input: unknown): input is FuseWidgetLike {\n if (!input || typeof input !== 'object' || Array.isArray(input)) return false;\n const o = input as FuseWidgetLike;\n return Array.isArray(o.data);\n}\n\n/**\n * Categorical key for punchcard Y / grouping — mirrors client PunchcardChart:\n * `groupBy?.[0] ?? Object.keys(uniqueValues)[0]`.\n */\nexport function resolveGroupByKey(widget: FuseWidgetLike): string | undefined {\n const fromGroup = firstField(widget.groupBy ?? undefined);\n if (fromGroup) return fromGroup;\n const keys = widget.uniqueValues ? Object.keys(widget.uniqueValues) : [];\n return keys[0];\n}\n\nexport function rowsOf(widget: FuseWidgetLike): Record<string, unknown>[] {\n if (!Array.isArray(widget.data)) return [];\n return widget.data.filter(\n (r): r is Record<string, unknown> => !!r && typeof r === 'object' && !Array.isArray(r),\n );\n}\n\nexport function filterTruthyValues(values: string[]): string[] {\n return values.filter(\n (v) => v != null && v !== '' && v !== 'null' && v !== 'undefined',\n );\n}\n\n/**\n * Order categorical keys by FuseDash `uniqueValues[fieldKey]`, keeping any\n * extra data keys at the end in first-seen order.\n */\nexport function resolveUniqueValuesOrder(\n dataKeys: Iterable<string>,\n uniqueValues: Record<string, string[]> | null | undefined,\n fieldKey: string | undefined,\n): string[] {\n const dataSet = new Set(dataKeys);\n const fromUv =\n fieldKey && uniqueValues?.[fieldKey]?.length\n ? filterTruthyValues(uniqueValues[fieldKey].map(String))\n : null;\n if (fromUv?.length) {\n const ordered = fromUv.filter((k) => dataSet.has(k));\n for (const k of dataSet) {\n if (!ordered.includes(k)) ordered.push(k);\n }\n return ordered;\n }\n const seen = new Set<string>();\n const out: string[] = [];\n for (const k of dataKeys) {\n if (!seen.has(k)) {\n seen.add(k);\n out.push(k);\n }\n }\n return out;\n}\n\n/** Categorical x-axis order from a FuseDash widget mock. */\nexport function xDomainHintFromWidget(\n widget: FuseWidgetLike,\n): string[] | undefined {\n const xKey = firstField(widget.xAxe ?? undefined);\n if (!xKey || !widget.uniqueValues?.[xKey]?.length) return undefined;\n return filterTruthyValues(widget.uniqueValues[xKey].map(String));\n}\n"],"names":[],"mappings":"AA+BO,SAAS,WACd,OACoB;AACpB,MAAI,MAAM,QAAQ,KAAK,GAAG;AACxB,UAAM,IAAI,MAAM,CAAC;AACjB,WAAO,KAAK,QAAQ,OAAO,CAAC,MAAM,KAAK,OAAO,CAAC,IAAI;AAAA,EACrD;AACA,MAAI,SAAS,QAAQ,UAAU,GAAI,QAAO;AAC1C,SAAO,OAAO,KAAK;AACrB;AAGO,SAAS,oBAAoB,OAAyC;AAC3E,MAAI,CAAC,SAAS,OAAO,UAAU,YAAY,MAAM,QAAQ,KAAK,EAAG,QAAO;AACxE,QAAM,IAAI;AACV,SAAO,MAAM,QAAQ,EAAE,IAAI;AAC7B;AAMO,SAAS,kBAAkB,QAA4C;AAC5E,QAAM,YAAY,WAAW,OAAO,WAAW,MAAS;AACxD,MAAI,UAAW,QAAO;AACtB,QAAM,OAAO,OAAO,eAAe,OAAO,KAAK,OAAO,YAAY,IAAI,CAAA;AACtE,SAAO,KAAK,CAAC;AACf;AAEO,SAAS,OAAO,QAAmD;AACxE,MAAI,CAAC,MAAM,QAAQ,OAAO,IAAI,UAAU,CAAA;AACxC,SAAO,OAAO,KAAK;AAAA,IACjB,CAAC,MAAoC,CAAC,CAAC,KAAK,OAAO,MAAM,YAAY,CAAC,MAAM,QAAQ,CAAC;AAAA,EAAA;AAEzF;AAEO,SAAS,mBAAmB,QAA4B;AAC7D,SAAO,OAAO;AAAA,IACZ,CAAC,MAAM,KAAK,QAAQ,MAAM,MAAM,MAAM,UAAU,MAAM;AAAA,EAAA;AAE1D;AAMO,SAAS,yBACd,UACA,cACA,UACU;AAlDL;AAmDL,QAAM,UAAU,IAAI,IAAI,QAAQ;AAChC,QAAM,SACJ,cAAY,kDAAe,cAAf,mBAA0B,UAClC,mBAAmB,aAAa,QAAQ,EAAE,IAAI,MAAM,CAAC,IACrD;AACN,MAAI,iCAAQ,QAAQ;AAClB,UAAM,UAAU,OAAO,OAAO,CAAC,MAAM,QAAQ,IAAI,CAAC,CAAC;AACnD,eAAW,KAAK,SAAS;AACvB,UAAI,CAAC,QAAQ,SAAS,CAAC,EAAG,SAAQ,KAAK,CAAC;AAAA,IAC1C;AACA,WAAO;AAAA,EACT;AACA,QAAM,2BAAW,IAAA;AACjB,QAAM,MAAgB,CAAA;AACtB,aAAW,KAAK,UAAU;AACxB,QAAI,CAAC,KAAK,IAAI,CAAC,GAAG;AAChB,WAAK,IAAI,CAAC;AACV,UAAI,KAAK,CAAC;AAAA,IACZ;AAAA,EACF;AACA,SAAO;AACT;AAGO,SAAS,sBACd,QACsB;AA7EjB;AA8EL,QAAM,OAAO,WAAW,OAAO,QAAQ,MAAS;AAChD,MAAI,CAAC,QAAQ,GAAC,kBAAO,iBAAP,mBAAsB,UAAtB,mBAA6B,QAAQ,QAAO;AAC1D,SAAO,mBAAmB,OAAO,aAAa,IAAI,EAAE,IAAI,MAAM,CAAC;AACjE;"}
|
|
@@ -49,6 +49,33 @@ export declare const FD: {
|
|
|
49
49
|
readonly bottom: 21;
|
|
50
50
|
readonly left: 80;
|
|
51
51
|
};
|
|
52
|
+
/** Client MatrixChart DEFAULT_MARGIN */
|
|
53
|
+
readonly matrixMargin: {
|
|
54
|
+
readonly top: 20;
|
|
55
|
+
readonly right: 0;
|
|
56
|
+
readonly bottom: 30;
|
|
57
|
+
readonly left: 80;
|
|
58
|
+
};
|
|
59
|
+
/** MatrixChart cell gutter + corner (client `rectPadding`) */
|
|
60
|
+
readonly matrixCellPadding: 3;
|
|
61
|
+
readonly matrixCellRadius: 2;
|
|
62
|
+
/** Rows never shrink below this — the plot scrolls instead */
|
|
63
|
+
readonly matrixMinCellHeight: 16;
|
|
64
|
+
/** Top header: font + tick + label spacing reserve (client `topAxisHeight`) */
|
|
65
|
+
readonly matrixTopTickLength: 8;
|
|
66
|
+
readonly matrixTopLabelsSpacing: 12;
|
|
67
|
+
/** Above this many rows the top axis is pinned and the rows scroll */
|
|
68
|
+
readonly matrixSeparateAxisRowLimit: 7;
|
|
69
|
+
/** Negative cells are flat grey; zero / missing cells get the hatch pattern */
|
|
70
|
+
readonly matrixNegativeFill: "#DADAE1";
|
|
71
|
+
readonly matrixNoDataLight: "#f0f1f2";
|
|
72
|
+
readonly matrixNoDataDark: "#33373d";
|
|
73
|
+
readonly matrixNoDataStripeLight: "#ffffff";
|
|
74
|
+
readonly matrixNoDataStripeDark: "#000000";
|
|
75
|
+
/** Client AxisLeft `TickLabel length={9}` */
|
|
76
|
+
readonly matrixYLabelMaxChars: 9;
|
|
77
|
+
/** Client `MAX_LABEL_LENGTH` for the top header labels */
|
|
78
|
+
readonly matrixTopLabelMaxChars: 25;
|
|
52
79
|
readonly stepLineMargin: {
|
|
53
80
|
readonly top: 10;
|
|
54
81
|
readonly right: 1;
|
|
@@ -184,20 +211,6 @@ export declare const FD: {
|
|
|
184
211
|
readonly barLabelGutter: 28;
|
|
185
212
|
readonly barLabelGutterMin: 56;
|
|
186
213
|
readonly barLabelGutterMax: 180;
|
|
187
|
-
/** DonutGroupChart — a row of gauges, each with a KPI block in the hole */
|
|
188
|
-
readonly donutMargin: {
|
|
189
|
-
readonly top: 10;
|
|
190
|
-
readonly right: 8;
|
|
191
|
-
readonly bottom: 10;
|
|
192
|
-
readonly left: 8;
|
|
193
|
-
};
|
|
194
|
-
/** FuseDash uses a flat 16px band; it is capped at half the radius here */
|
|
195
|
-
readonly donutThickness: 16;
|
|
196
|
-
readonly donutMinThickness: 4;
|
|
197
|
-
readonly donutCellPadding: 6;
|
|
198
|
-
readonly donutMinCellWidth: 140;
|
|
199
|
-
/** Gauges assume a 0–100 scale when the row carries no `maximalValue` */
|
|
200
|
-
readonly donutDefaultMax: 100;
|
|
201
214
|
/** Resting / dimmed / hovered arc opacity (FuseDash settles on 0.8) */
|
|
202
215
|
readonly donutArcOpacity: 0.8;
|
|
203
216
|
readonly donutArcOpacityDimmed: 0.2;
|
|
@@ -331,48 +344,60 @@ export declare const FD: {
|
|
|
331
344
|
readonly domainLimitLabelFill: "#141c2ce6";
|
|
332
345
|
readonly domainLimitLabelText: "#ffffff";
|
|
333
346
|
readonly domainLimitLabelSize: 10;
|
|
347
|
+
/** PartialDependenceChart — client DEFAULT_MARGIN */
|
|
348
|
+
readonly pdpMargin: {
|
|
349
|
+
readonly top: 16;
|
|
350
|
+
readonly right: 24;
|
|
351
|
+
readonly bottom: 28;
|
|
352
|
+
readonly left: 44;
|
|
353
|
+
};
|
|
354
|
+
/** ICE band: many faint curves under one dashed average line */
|
|
355
|
+
readonly pdpIceOpacity: 0.18;
|
|
356
|
+
readonly pdpIceStrokeWidth: 1.25;
|
|
357
|
+
readonly pdpAverageStrokeWidth: 2.5;
|
|
358
|
+
readonly pdpAverageDash: "4,4";
|
|
334
359
|
readonly donutSliceStroke: "#ffffff";
|
|
335
360
|
readonly donutSliceStrokeDark: "#1a1b1f";
|
|
336
361
|
readonly donutSliceStrokeWidth: 2;
|
|
337
|
-
/**
|
|
338
|
-
readonly
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
/** KPI block in the hole: 30/12/12px, sized down with the ring */
|
|
344
|
-
readonly donutValueSize: 30;
|
|
345
|
-
readonly donutValueWeight: 600;
|
|
346
|
-
readonly donutBadgeSize: 12;
|
|
347
|
-
readonly donutLabelSize: 12;
|
|
348
|
-
readonly donutStatusColors: {
|
|
349
|
-
readonly positive: {
|
|
350
|
-
readonly background: "#E6F6EF";
|
|
351
|
-
readonly text: "#067647";
|
|
352
|
-
};
|
|
353
|
-
readonly negative: {
|
|
354
|
-
readonly background: "#FEE4E2";
|
|
355
|
-
readonly text: "#B42318";
|
|
356
|
-
};
|
|
357
|
-
readonly neutral: {
|
|
358
|
-
readonly background: "#F2F4F7";
|
|
359
|
-
readonly text: "#475467";
|
|
360
|
-
};
|
|
361
|
-
};
|
|
362
|
-
readonly donutStatusColorsDark: {
|
|
363
|
-
readonly positive: {
|
|
364
|
-
readonly background: "#0C2C21";
|
|
365
|
-
readonly text: "#4ED8A6";
|
|
366
|
-
};
|
|
367
|
-
readonly negative: {
|
|
368
|
-
readonly background: "#3B1513";
|
|
369
|
-
readonly text: "#F5817A";
|
|
370
|
-
};
|
|
371
|
-
readonly neutral: {
|
|
372
|
-
readonly background: "#2C2D33";
|
|
373
|
-
readonly text: "#C3C7CE";
|
|
374
|
-
};
|
|
362
|
+
/** Treemap — d3 `treemapBinary` tiles, no axes so the plot fills the body */
|
|
363
|
+
readonly treemapMargin: {
|
|
364
|
+
readonly top: 0;
|
|
365
|
+
readonly right: 0;
|
|
366
|
+
readonly bottom: 0;
|
|
367
|
+
readonly left: 0;
|
|
375
368
|
};
|
|
369
|
+
readonly treemapPaddingInner: 2;
|
|
370
|
+
readonly treemapTileRadius: 6;
|
|
371
|
+
/** Tile fill fades from the band color to 80% alpha at the bottom edge */
|
|
372
|
+
readonly treemapGradientBottomOpacity: 0.8;
|
|
373
|
+
/** White scanlines every 5px, fading out toward the bottom of the tile */
|
|
374
|
+
readonly treemapStripeColor: "#FFFFFF";
|
|
375
|
+
readonly treemapStripeSpacing: 5;
|
|
376
|
+
readonly treemapStripeOpacity: 0.14;
|
|
377
|
+
readonly treemapStripeFalloff: 0.8;
|
|
378
|
+
/** Client `hasLightColor` label colors */
|
|
379
|
+
readonly treemapLabelOnLight: "#0B101A";
|
|
380
|
+
readonly treemapLabelOnDark: "#FFFFFF";
|
|
381
|
+
readonly treemapLabelPadding: 4;
|
|
382
|
+
readonly treemapLabelSize: 14;
|
|
383
|
+
readonly treemapValueSize: 12;
|
|
384
|
+
/** A tile only gets a name below this, and a value below `MinValueHeight` */
|
|
385
|
+
readonly treemapMinLabelWidth: 40;
|
|
386
|
+
readonly treemapMinLabelHeight: 20;
|
|
387
|
+
readonly treemapMinValueHeight: 30;
|
|
388
|
+
/** Grouped mode: one card per group in the client's grid-template-areas */
|
|
389
|
+
readonly treemapCardGap: 8;
|
|
390
|
+
readonly treemapCardRadius: 8;
|
|
391
|
+
readonly treemapCardPadding: 8;
|
|
392
|
+
readonly treemapGroupsMarginTop: 10;
|
|
393
|
+
/** Rows in the >5 group fallback list, which scrolls instead of squeezing */
|
|
394
|
+
readonly treemapCardMinHeight: 140;
|
|
395
|
+
/** Sibling tiles fade while one is hovered (chat-only affordance) */
|
|
396
|
+
readonly treemapDimOpacity: 0.4;
|
|
397
|
+
/** `getTreemapRangeColors`: 7 shades from +55% white to -35% black */
|
|
398
|
+
readonly treemapRangeSteps: 7;
|
|
399
|
+
readonly treemapRangeMinShift: 0.55;
|
|
400
|
+
readonly treemapRangeMaxShift: -0.35;
|
|
376
401
|
/** Sankey: layout extent inset, node gap, and the two node-rule colors */
|
|
377
402
|
readonly sankeyPadding: 4.5;
|
|
378
403
|
readonly sankeyNodePadding: 14;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fusedash-visual.d.ts","sourceRoot":"","sources":["../../src/utils/fusedash-visual.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAE9C,4EAA4E;AAE5E,eAAO,MAAM,EAAE;;;;;;;;IAQb;;;OAGG;;;;;;;;;;;;;;IAiBH,+CAA+C;;;;;;;;;;;;;;;;;IAY/C,2CAA2C
|
|
1
|
+
{"version":3,"file":"fusedash-visual.d.ts","sourceRoot":"","sources":["../../src/utils/fusedash-visual.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAE9C,4EAA4E;AAE5E,eAAO,MAAM,EAAE;;;;;;;;IAQb;;;OAGG;;;;;;;;;;;;;;IAiBH,+CAA+C;;;;;;;;;;;;;;;;;IAY/C,2CAA2C;;;;;;;IAE3C,wCAAwC;;;;;;;IAExC,8DAA8D;;;IAG9D,8DAA8D;;IAE9D,+EAA+E;;;IAG/E,sEAAsE;;IAEtE,+EAA+E;;;;;;IAM/E,6CAA6C;;IAE7C,0DAA0D;;;;;;;;IAG1D,mDAAmD;;;;;;;;;;;;;;;;;;;;;;;IAQnD,2CAA2C;;;;;;;IAE3C,8EAA8E;;;;;;;;;;;IAM9E,sEAAsE;;;;;;IAMtE,gDAAgD;;;;;;;IAEhD,kDAAkD;;;;;;;IAElD,yCAAyC;;;;;IAKzC,2DAA2D;;;;;;IAM3D,6DAA6D;;IAE7D,gEAAgE;;IAEhE,8BAA8B;;;IAG9B,qCAAqC;;;IAGrC,yCAAyC;;IAEzC,0CAA0C;;;IAG1C,yEAAyE;;;;;;;;IAGzE,mEAAmE;;;IAGnE,4EAA4E;;;;IAI5E,gFAAgF;;;;IAIhF,gEAAgE;;IAEhE,2EAA2E;;;;IAI3E,oDAAoD;;;IAGpD,gDAAgD;;IAEhD,0DAA0D;;;;IAI1D,kEAAkE;;;IAGlE,iFAAiF;;;;;IAKjF,uEAAuE;;;IAGvE,kFAAkF;;;;;;;;IAGlF,+DAA+D;;;;;;;IAE/D,6DAA6D;;;;IAI7D,+EAA+E;;;IAG/E,0DAA0D;;;;IAI1D,wEAAwE;;;;;IAKxE,sEAAsE;;IAEtE,0DAA0D;;;IAG1D,0EAA0E;;;;;;;IAO1E,iFAAiF;;;;;;;IAEjF,kFAAkF;;;;IAIlF,4EAA4E;;;;IAI5E,mCAAmC;;;IAGnC,oEAAoE;;;;;;IAMpE,mDAAmD;;IAEnD,8DAA8D;;IAE9D,4CAA4C;;;;;;;IAE5C,kDAAkD;;;;;;;IAElD,6DAA6D;;;;;;IAM7D,yEAAyE;;;;;;;;;;;IAMzE,kFAAkF;;;;;;;;;;;;;;IASlF,gFAAgF;;IAEhF,oDAAoD;;;;IAIpD,+DAA+D;;;;;;;;IAQ/D,qDAAqD;;;;;;;IAErD,gEAAgE;;;;;;;;IAQhE,6EAA6E;;;;;;;;;IAI7E,0EAA0E;;IAE1E,0EAA0E;;;;;IAK1E,0CAA0C;;;;;;IAM1C,6EAA6E;;;;IAI7E,2EAA2E;;;;;IAK3E,6EAA6E;;IAE7E,qEAAqE;;IAErE,sEAAsE;;;;IAItE,0EAA0E;;;;;;;IAO1E,wDAAwD;;;;IAIxD,8DAA8D;;;;;;;;;;;;;IAG9D,gFAAgF;;IAEhF,wEAAwE;;IAExE,kEAAkE;;;;;IAKlE,iDAAiD;;;;;IAKjD,4EAA4E;;;;;IAK5E,uDAAuD;;;;;;;IAEvD,uEAAuE;;IAEvE,6CAA6C;;;;IAI7C,iDAAiD;;;;;IAKjD,qEAAqE;;CAE7D,CAAC;AAEX,gEAAgE;AAChE,eAAO,MAAM,aAAa,wFAQhB,CAAC;AAEX,MAAM,MAAM,WAAW,GACnB,OAAO,GACP,QAAQ,GACR,QAAQ,GACR,SAAS,GACT,UAAU,GACV,UAAU,CAAC;AAEf,2EAA2E;AAC3E,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAiBhE;AAED,0DAA0D;AAC1D,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,MAAM,CAcpE;AAED,mDAAmD;AACnD,wBAAgB,0BAA0B,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAe3E;AAED,wCAAwC;AACxC,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,SAAI,GAAG,MAAM,CAOvE;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,CAGpE;AAED,4DAA4D;AAC5D,wBAAgB,gBAAgB,CAC9B,KAAK,EAAE,WAAW,EAClB,KAAK,EAAE,MAAM,EACb,SAAS,GAAE,OAAO,GAAG,MAAgB,GACpC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAMlC;AAED,wBAAgB,gBAAgB,CAC9B,GAAG,EAAE,SAAS,CAAC,aAAa,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,CAAC,EACvD,EAAE,SAAgB,GACjB,MAAM,CAiBR;AAED,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAKxD;AAED,0DAA0D;AAC1D,wBAAgB,gBAAgB,CAE9B,MAAM,EAAE,SAAS,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,EACrC,IAAI,EAAE;IACJ,KAAK,EAAE,WAAW,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,EAAE,EAAE,MAAM,CAAC;IACX,EAAE,EAAE,MAAM,CAAC;IACX,CAAC,CAAC,EAAE,MAAM,CAAC;IACX,SAAS,CAAC,EAAE,OAAO,GAAG,MAAM,CAAC;IAC7B,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB,GACA,IAAI,CAkEN;AAED;;GAEG;AACH,wBAAgB,4BAA4B,CAE1C,MAAM,EAAE,SAAS,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,EACrC,IAAI,EAAE;IAAE,KAAK,EAAE,WAAW,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,MAAM,CAAA;CAAE,GAClE,IAAI,CA6DN"}
|
|
@@ -40,6 +40,28 @@ const FD = {
|
|
|
40
40
|
radarTickLabelFill: "#f1f4f7",
|
|
41
41
|
/** Client PunchcardChart DEFAULT_MARGIN */
|
|
42
42
|
punchcardMargin: { top: 0, right: 0, bottom: 21, left: 80 },
|
|
43
|
+
/** Client MatrixChart DEFAULT_MARGIN */
|
|
44
|
+
matrixMargin: { top: 20, right: 0, bottom: 30, left: 80 },
|
|
45
|
+
/** MatrixChart cell gutter + corner (client `rectPadding`) */
|
|
46
|
+
matrixCellPadding: 3,
|
|
47
|
+
matrixCellRadius: 2,
|
|
48
|
+
/** Rows never shrink below this — the plot scrolls instead */
|
|
49
|
+
matrixMinCellHeight: 16,
|
|
50
|
+
/** Top header: font + tick + label spacing reserve (client `topAxisHeight`) */
|
|
51
|
+
matrixTopTickLength: 8,
|
|
52
|
+
matrixTopLabelsSpacing: 12,
|
|
53
|
+
/** Above this many rows the top axis is pinned and the rows scroll */
|
|
54
|
+
matrixSeparateAxisRowLimit: 7,
|
|
55
|
+
/** Negative cells are flat grey; zero / missing cells get the hatch pattern */
|
|
56
|
+
matrixNegativeFill: "#DADAE1",
|
|
57
|
+
matrixNoDataLight: "#f0f1f2",
|
|
58
|
+
matrixNoDataDark: "#33373d",
|
|
59
|
+
matrixNoDataStripeLight: "#ffffff",
|
|
60
|
+
matrixNoDataStripeDark: "#000000",
|
|
61
|
+
/** Client AxisLeft `TickLabel length={9}` */
|
|
62
|
+
matrixYLabelMaxChars: 9,
|
|
63
|
+
/** Client `MAX_LABEL_LENGTH` for the top header labels */
|
|
64
|
+
matrixTopLabelMaxChars: 25,
|
|
43
65
|
stepLineMargin: { top: 10, right: 1, bottom: 21, left: 40 },
|
|
44
66
|
/** SparkLineChart — same frame as StepLineChart */
|
|
45
67
|
sparkLineMargin: { top: 10, right: 1, bottom: 21, left: 40 },
|
|
@@ -120,15 +142,6 @@ const FD = {
|
|
|
120
142
|
/** Hovered category column: animated dot pattern + solid guide */
|
|
121
143
|
barHoverDotFill: "#CFD2D6",
|
|
122
144
|
barHoverGuideWidth: 2,
|
|
123
|
-
/** DonutGroupChart — a row of gauges, each with a KPI block in the hole */
|
|
124
|
-
donutMargin: { top: 10, right: 8, bottom: 10, left: 8 },
|
|
125
|
-
/** FuseDash uses a flat 16px band; it is capped at half the radius here */
|
|
126
|
-
donutThickness: 16,
|
|
127
|
-
donutMinThickness: 4,
|
|
128
|
-
donutCellPadding: 6,
|
|
129
|
-
donutMinCellWidth: 140,
|
|
130
|
-
/** Gauges assume a 0–100 scale when the row carries no `maximalValue` */
|
|
131
|
-
donutDefaultMax: 100,
|
|
132
145
|
/** Resting / dimmed / hovered arc opacity (FuseDash settles on 0.8) */
|
|
133
146
|
donutArcOpacity: 0.8,
|
|
134
147
|
donutArcOpacityDimmed: 0.2,
|
|
@@ -227,29 +240,42 @@ const FD = {
|
|
|
227
240
|
domainLimitLabelFill: "#141c2ce6",
|
|
228
241
|
domainLimitLabelText: "#ffffff",
|
|
229
242
|
domainLimitLabelSize: 10,
|
|
243
|
+
/** PartialDependenceChart — client DEFAULT_MARGIN */
|
|
244
|
+
pdpMargin: { top: 16, right: 24, bottom: 28, left: 44 },
|
|
245
|
+
/** ICE band: many faint curves under one dashed average line */
|
|
246
|
+
pdpIceOpacity: 0.18,
|
|
247
|
+
pdpIceStrokeWidth: 1.25,
|
|
248
|
+
pdpAverageStrokeWidth: 2.5,
|
|
249
|
+
pdpAverageDash: "4,4",
|
|
230
250
|
donutSliceStroke: "#ffffff",
|
|
231
251
|
donutSliceStrokeDark: "#1a1b1f",
|
|
232
252
|
donutSliceStrokeWidth: 2,
|
|
233
|
-
/**
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
/**
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
+
/** Treemap — d3 `treemapBinary` tiles, no axes so the plot fills the body */
|
|
254
|
+
treemapMargin: { top: 0, right: 0, bottom: 0, left: 0 },
|
|
255
|
+
treemapPaddingInner: 2,
|
|
256
|
+
treemapTileRadius: 6,
|
|
257
|
+
/** Tile fill fades from the band color to 80% alpha at the bottom edge */
|
|
258
|
+
treemapGradientBottomOpacity: 0.8,
|
|
259
|
+
/** White scanlines every 5px, fading out toward the bottom of the tile */
|
|
260
|
+
treemapStripeColor: "#FFFFFF",
|
|
261
|
+
treemapStripeSpacing: 5,
|
|
262
|
+
treemapStripeOpacity: 0.14,
|
|
263
|
+
treemapStripeFalloff: 0.8,
|
|
264
|
+
/** Client `hasLightColor` label colors */
|
|
265
|
+
treemapLabelOnLight: "#0B101A",
|
|
266
|
+
treemapLabelOnDark: "#FFFFFF",
|
|
267
|
+
/** A tile only gets a name below this, and a value below `MinValueHeight` */
|
|
268
|
+
treemapMinLabelWidth: 40,
|
|
269
|
+
treemapMinLabelHeight: 20,
|
|
270
|
+
treemapMinValueHeight: 30,
|
|
271
|
+
/** Rows in the >5 group fallback list, which scrolls instead of squeezing */
|
|
272
|
+
treemapCardMinHeight: 140,
|
|
273
|
+
/** Sibling tiles fade while one is hovered (chat-only affordance) */
|
|
274
|
+
treemapDimOpacity: 0.4,
|
|
275
|
+
/** `getTreemapRangeColors`: 7 shades from +55% white to -35% black */
|
|
276
|
+
treemapRangeSteps: 7,
|
|
277
|
+
treemapRangeMinShift: 0.55,
|
|
278
|
+
treemapRangeMaxShift: -0.35,
|
|
253
279
|
/** Sankey: layout extent inset, node gap, and the two node-rule colors */
|
|
254
280
|
sankeyPadding: 4.5,
|
|
255
281
|
sankeyNodePadding: 14,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fusedash-visual.js","sources":["../../src/utils/fusedash-visual.ts"],"sourcesContent":["import type { Selection } from 'd3-selection';\n\n/** FuseDash Widgets visual tokens — keep charts looking 1:1 with client. */\n\nexport const FD = {\n gridStroke: '#afb3bb',\n gridDash: '1 2',\n axisLabelFill: '#6c7584',\n axisLabelSize: 11,\n axisStroke: '#afb3bb',\n hoverGuideLight: '#6c7584',\n hoverGuideDark: '#ffffff',\n /**\n * Qualitative12Colors.default — used when series count unknown.\n * Prefer `resolveFormattingColor` / `pickQualitativePalette` for FuseDash widgets.\n */\n series: [\n '#473DD9',\n '#938CFF',\n '#36C4A5',\n '#ADF4E5',\n '#BDBCC8',\n '#56546D',\n '#FF8C47',\n '#FFCEB0',\n '#FF4781',\n '#FFB0C9',\n '#47B0FF',\n '#B0DDFF',\n ],\n lineMargin: { top: 10, right: 1, bottom: 21, left: 40 },\n lollipopMargin: { top: 10, right: 3, bottom: 21, left: 40 },\n /** FuseDash RadarChart (useNewDesign) frame */\n radarMargin: { top: 25, right: 5, bottom: 25, left: 5 },\n radarScaleSteps: 5,\n radarDomainPadFactor: 1.1,\n radarMarkerSize: 50,\n radarMarkerHoverSize: 70,\n radarSpokeDash: '2,2',\n radarCapRadius: 3,\n radarLabelOffset: 12,\n radarGradientEdgeOpacity: 0.3,\n radarStrokeWidth: 2,\n radarTickLabelFill: '#f1f4f7',\n /** Client PunchcardChart DEFAULT_MARGIN */\n punchcardMargin: { top: 0, right: 0, bottom: 21, left: 80 },\n stepLineMargin: { top: 10, right: 1, bottom: 21, left: 40 },\n /** SparkLineChart — same frame as StepLineChart */\n sparkLineMargin: { top: 10, right: 1, bottom: 21, left: 40 },\n sparkLineStrokeWidth: 1.5,\n sparkDomainPadFactor: 1.2,\n sparkGuideDash: '5,2',\n sparkHoverDotRadius: 4,\n boxPlotMargin: { top: 10, right: 1, bottom: 21, left: 40 },\n histogramMargin: { top: 10, right: 1, bottom: 21, left: 40 },\n /** Client VerticalWaterfallChart margin */\n waterfallVerticalMargin: { top: 10, right: 0, bottom: 21, left: 40 },\n /** Client HorizontalWaterfallChart base margin (left is sized from labels) */\n waterfallHorizontalMargin: { top: 10, right: 1, bottom: 21, left: 40 },\n waterfallBarThickness: 16,\n waterfallBarRadius: 2,\n waterfallArrow: 5,\n waterfallDomainPadFactor: 1.2,\n /** Client hard-coded fills (formatting keys are ignored for paint) */\n waterfallPositive: '#938CFF',\n waterfallNegative: '#FF8C47',\n waterfallTotal: '#BDBCC8',\n waterfallHoverDim: 0.2,\n waterfallMinBand: 32,\n /** Client VerticalViolinChart DEFAULT_MARGIN */\n violinVerticalMargin: { top: 10, right: 16, bottom: 28, left: 44 },\n /** Client HorizontalViolinChart DEFAULT_MARGIN */\n violinHorizontalMargin: { top: 10, right: 24, bottom: 28, left: 44 },\n /** Client Horizontal/Vertical BoxPlot */\n boxPlotDomainPadFactor: 1.1,\n boxPlotBorderRadius: 2,\n lineStrokeWidth: 2,\n lineStrokeAlphaPct: 80,\n /** FuseDash AreaChart linearGradient stops (new design) */\n areaGradientTopOpacity: 0.6,\n areaGradientBottomOpacity: 0.1,\n lollipopStemWidth: 3,\n lollipopStemAlphaPct: 50,\n markerRadius: 4,\n /** StepLineChart: plain stroke, no alpha / glow / markers */\n stepStrokeWidth: 1.5,\n /** StepLineChart y-domain is padded by 1.2x before `.nice()` */\n stepDomainPadFactor: 1.2,\n /** KS-plot \"Ideal\" overlay */\n stepIdealColor: '#2ecc71',\n stepIdealWidth: 3,\n /** ROC \"Random guessing\" diagonal */\n stepGuessWidth: 2,\n stepGuessDash: '5,5',\n /** Max-deviation marker (KS distance) */\n stepDeviationFill: '#2c2d33',\n /** Tooltip crosshair on the step chart */\n stepGuideDash: '5,2',\n stepHoverDotRadius: 4,\n /** Barchart — shared frame + bar geometry (all six FuseDash variants) */\n barMargin: { top: 10, right: 1, bottom: 21, left: 40 },\n barCornerRadius: 4,\n /** Bar fill is a gradient from the series color to a faded stop */\n barFadeOpacity: 0.6,\n barFadeOpacityHovered: 0.7,\n /** Vertical single-series: bandwidth * 0.4, capped, with a visible floor */\n barBandFraction: 0.4,\n barMaxWidth: 40,\n barMinHeight: 6,\n /** Vertical grouped: floor(clamp(plotWidth / categories / series)) + 1px gap */\n barGroupMinWidth: 4,\n barGroupMaxWidth: 24,\n barGroupGap: 1,\n /** Vertical stacked: bandwidth * 0.85, same clamp as grouped */\n barStackedBandFraction: 0.85,\n /** Horizontal: fixed row thickness, gutter, and a floor for tiny values */\n barRowThickness: 24,\n barRowSpacing: 16,\n barMinWidth: 6,\n /** Y (vertical) / X (horizontal) domain headroom */\n barDomainPadFactor: 1.2,\n barHorizontalPadFactor: 1.1,\n /** Stacked totals get a flat 10% pad instead */\n barStackedPadFraction: 0.1,\n /** Cumulative overlay line (FuseDash `cumulativeLine`) */\n barCumulativeColor: '#6d6df7',\n barCumulativeWidth: 2,\n barCumulativeDotRadius: 3,\n /** Hovered category column: animated dot pattern + solid guide */\n barHoverDotFill: '#CFD2D6',\n barHoverGuideWidth: 2,\n /** Client `calculatedLeftMargin` (unused in chat — shared LEFT_GUTTER_MARGIN) */\n barLabelCharWidth: 5,\n barLabelGutter: 28,\n barLabelGutterMin: 56,\n barLabelGutterMax: 180,\n /** DonutGroupChart — a row of gauges, each with a KPI block in the hole */\n donutMargin: { top: 10, right: 8, bottom: 10, left: 8 },\n /** FuseDash uses a flat 16px band; it is capped at half the radius here */\n donutThickness: 16,\n donutMinThickness: 4,\n donutCellPadding: 6,\n donutMinCellWidth: 140,\n /** Gauges assume a 0–100 scale when the row carries no `maximalValue` */\n donutDefaultMax: 100,\n /** Resting / dimmed / hovered arc opacity (FuseDash settles on 0.8) */\n donutArcOpacity: 0.8,\n donutArcOpacityDimmed: 0.2,\n /** PieChart — FuseDash uses zero margin; pie is a square inscribed in the body */\n pieMargin: { top: 0, right: 0, bottom: 0, left: 0 },\n pieMinArcLengthPx: 5,\n /** PolarAreaChart — FuseDash margin around the centred disc */\n polarAreaMargin: { top: 25, right: 5, bottom: 25, left: 5 },\n /** Concentric grid rings; opacity ramps 0.2 → 1.0 outward */\n polarRadialSteps: 5,\n polarGridStroke: '#939ba7',\n polarGridStepOpacity: 0.2,\n /** Dashed spoke from the centre to each category boundary, with a round cap */\n polarSpokeDash: '2,2',\n polarSpokeCapRadius: 3,\n /** Category labels sit just outside the outermost ring */\n polarCategoryLabelFill: '#5f6877',\n polarCategoryLabelSize: 12,\n polarCategoryLabelOffset: 12,\n /** Side room reserved for those labels, measured off the longest one */\n polarLabelCharWidth: 0.55,\n polarLabelGutterMin: 40,\n polarLabelGutterMax: 120,\n polarLabelGutterMaxFraction: 0.28,\n /** Below this radius the label ring collides with itself — drop it */\n polarMinLabelRadius: 40,\n /** Sectors: 0.8 at rest, siblings drop to 0.2 on hover */\n polarSectorOpacity: 0.8,\n polarSectorOpacityDimmed: 0.2,\n /** Radial tick pills are hidden when the disc is too short to fit them */\n polarTickPillRowHeight: 21,\n polarTickPillPadX: 7,\n polarTickPillPadY: 3,\n polarTickPillRadius: 4,\n polarTickPill: '#ffffff',\n polarTickPillDark: '#1a1b1f',\n /** RadialBarChart — client margin; the plot is a circle inscribed in the body */\n radialBarMargin: { top: 25, right: 5, bottom: 25, left: 5 },\n /** Hole is 20% of the outer radius; rings sweep 270° clockwise from 12 o'clock */\n radialBarInnerRadiusRatio: 0.2,\n radialBarSweepDeg: 270,\n radialBarTicks: 5,\n /** Ring thickness clamp around `((outer - inner - rings) / rings) * 0.5` */\n radialBarMinArcWidth: 4,\n radialBarMaxArcWidth: 24,\n radialBarArcCornerRadius: 1,\n /** Resting / dimmed arc opacity */\n radialBarArcOpacity: 0.8,\n radialBarArcOpacityDimmed: 0.2,\n /** Client draws the rings and the radial axes in one darker grey */\n radialBarGridStroke: '#939ba7',\n radialBarTickDash: '4,4',\n radialBarLabelFill: '#5f6877',\n radialBarTickLabelSize: 12,\n radialBarRingLabelSize: 11,\n /** Value labels sit 12px outside the outer ring */\n radialBarTickLabelOffset: 12,\n /** Ring labels are cut at `(outer - inner) / 8` characters */\n radialBarLabelCharWidth: 8,\n /** ScatterPlot — FuseDash DEFAULT_MARGIN */\n scatterMargin: { top: 10, right: 5, bottom: 21, left: 40 },\n /** AreaGroupedBarChart — client DEFAULT_MARGIN */\n areaGroupedBarMargin: { top: 10, right: 5, bottom: 21, left: 40 },\n /** Area fill under the line (client stopOpacity 0.35 → 0) */\n areaGroupedBarGradientTopOpacity: 0.35,\n areaGroupedBarGradientBottomOpacity: 0,\n areaGroupedBarMarkerRadius: 3,\n areaGroupedBarDimOpacity: 0.3,\n areaGroupedBarBarOpacity: 0.85,\n /** BubbleChart — BASE_MARGIN + MAX_BUBBLE_RADIUS/2 inset on top/right */\n bubbleBaseMargin: { top: 10, right: 1, bottom: 21, left: 40 },\n bubbleMaxRadius: 30,\n bubbleNegativeFill: '#DADAE1',\n scatterMarkerSize: 40,\n scatterReferenceLine: '#56546D',\n /** BiasVarianceTradeoffChart — the client widget carries its own frame/palette */\n biasVarianceMargin: { top: 24, right: 24, bottom: 36, left: 48 },\n biasVarianceSeries: ['#6366f1', '#22c55e', '#f59e0b', '#06b6d4', '#ef4444'],\n biasVarianceGridStroke: '#d1d5db',\n biasVarianceGridDash: '2,4',\n biasVarianceAxisStroke: '#9ca3af',\n biasVarianceLabelFill: '#6b7280',\n biasVarianceLineWidth: 2,\n biasVarianceLineOpacity: 0.95,\n /** Sibling curves fade while one is hovered (FuseDash line-hover convention) */\n biasVarianceLineOpacityDimmed: 0.2,\n /** Y domain is `[0, max * 1.1]` before `.nice()` */\n biasVarianceDomainPadFactor: 1.1,\n biasVarianceXTicks: 8,\n biasVarianceYTicks: 6,\n /** Shared `DomainsLimits` overlay (reference lines / bands) */\n domainLimitColor: '#6C8CF5',\n domainLimitFillOpacity: 0.12,\n domainLimitDash: '4,4',\n domainLimitArrow: 8,\n domainLimitLabelFill: '#141c2ce6',\n domainLimitLabelText: '#ffffff',\n domainLimitLabelSize: 10,\n donutSliceStroke: '#ffffff',\n donutSliceStrokeDark: '#1a1b1f',\n donutSliceStrokeWidth: 2,\n /** Unfilled part of a gauge — the neutral background FuseDash falls back to */\n donutTrackFill: '#EAECF0',\n donutTrackFillDark: '#2C2D33',\n /** Divider between donuts (FuseDash `border-left: neutralBorderWeakest`) */\n donutDivider: '#E4E6EA',\n donutDividerDark: '#2C2D33',\n /** KPI block in the hole: 30/12/12px, sized down with the ring */\n donutValueSize: 30,\n donutValueWeight: 600,\n donutBadgeSize: 12,\n donutLabelSize: 12,\n donutStatusColors: {\n positive: { background: '#E6F6EF', text: '#067647' },\n negative: { background: '#FEE4E2', text: '#B42318' },\n neutral: { background: '#F2F4F7', text: '#475467' },\n },\n donutStatusColorsDark: {\n positive: { background: '#0C2C21', text: '#4ED8A6' },\n negative: { background: '#3B1513', text: '#F5817A' },\n neutral: { background: '#2C2D33', text: '#C3C7CE' },\n },\n /** Sankey: layout extent inset, node gap, and the two node-rule colors */\n sankeyPadding: 4.5,\n sankeyNodePadding: 14,\n sankeyNodeWidth: 70,\n sankeyNodeWidthSmall: 65,\n sankeyNodeRule: '#D3DBE3',\n sankeyNodeRuleActive: '#939BA7',\n /** Ribbons sit at 50% alpha until hovered or focused */\n sankeyLinkAlphaPct: 50,\n sankeyLinkInset: 3,\n sankeyDimOpacity: 0.5,\n /** ParallelCoordinates — client Horizontal/Vertical frames */\n parallelMargin: { top: 10, right: 1, bottom: 8, left: 1 },\n parallelVerticalMargin: { top: 10, right: 1, bottom: 1, left: 1 },\n /** Horizontal: one 72px band per dimension, so the plot scrolls past ~5 axes */\n parallelAxisSpacing: 72,\n /** Vertical: gutter kept free under the axes for the bottom tick row */\n parallelColorScaleHeight: 44,\n /** Right gutter reserved for the colour ramp + its tick labels */\n parallelLegendOffsetRight: 20,\n parallelLegendWidth: 10,\n parallelLegendTickLabelWidth: 44,\n parallelLegendRadius: 6,\n /** Resting / dimmed / hovered polyline stroke */\n parallelLineWidth: 1,\n parallelLineWidthHovered: 5,\n parallelLineOpacity: 0.4,\n parallelLineOpacityDimmed: 0.05,\n /** Client draws these axes a shade darker than the shared FD axis tokens */\n parallelAxisStroke: '#939ba7',\n parallelAxisLabelFill: '#5f6877',\n parallelTitleSize: 11,\n parallelTitleSizeActive: 13,\n /** GiniImpurityEntropyChart — client DEFAULT_MARGIN */\n giniMargin: { top: 20, right: 24, bottom: 28, left: 44 },\n /** Curves are drawn as smooth Catmull-Rom splines with this tension */\n giniCurveAlpha: 0.5,\n /** p-hat guide + confidence-interval band */\n giniOverlayColor: '#4c6ef5',\n giniOverlayBandOpacity: 0.08,\n giniOverlayDash: '5,5',\n /** Split annotation markers on the Gini curve */\n giniSplitMarkerFill: '#12b886',\n giniSplitMarkerStroke: '#ffffff',\n giniSplitMarkerRadius: 4,\n giniSplitLabelOffset: 8,\n /** Hovering one curve fades the others so the read is unambiguous */\n giniCurveDimOpacity: 0.2,\n} as const;\n\n/** SequentialColors1 for the `default` styleId — low → high. */\nexport const FD_SEQUENTIAL = [\n '#D6D3FF',\n '#B5B0FF',\n '#938CFF',\n '#7369FF',\n '#5448FF',\n '#473DD9',\n '#3C33B5',\n] as const;\n\nexport type MarkerShape =\n | 'donut'\n | 'circle'\n | 'square'\n | 'rhombus'\n | 'triangle'\n | 'disabled';\n\n/** Mirrors client `lightenColor` — blend hex toward white (amount 0–1). */\nexport function lightenColor(hex: string, amount: number): string {\n let clean = hex.replace('#', '');\n if (clean.length === 3) {\n clean = clean\n .split('')\n .map((c) => c + c)\n .join('');\n }\n if (!/^[0-9A-Fa-f]{6}$/.test(clean)) return hex;\n const t = Math.max(0, Math.min(1, amount));\n const r = parseInt(clean.slice(0, 2), 16);\n const g = parseInt(clean.slice(2, 4), 16);\n const b = parseInt(clean.slice(4, 6), 16);\n const lr = Math.round(r + (255 - r) * t);\n const lg = Math.round(g + (255 - g) * t);\n const lb = Math.round(b + (255 - b) * t);\n return `#${lr.toString(16).padStart(2, '0')}${lg.toString(16).padStart(2, '0')}${lb.toString(16).padStart(2, '0')}`;\n}\n\n/** Mirrors client `hexToHexWithAlpha` (opacity 0–100). */\nexport function hexWithAlpha(hex: string, opacityPct: number): string {\n let clean = hex.replace('#', '').toUpperCase();\n if (clean.length === 3) {\n clean = clean\n .split('')\n .map((c) => c + c)\n .join('');\n }\n if (!/^[0-9A-F]{6}$/.test(clean)) return hex;\n const alpha = Math.round((Math.max(0, Math.min(100, opacityPct)) / 100) * 255)\n .toString(16)\n .padStart(2, '0')\n .toUpperCase();\n return `#${clean}${alpha}`;\n}\n\n/** Mirrors client `calculateScaleLinearDomain`. */\nexport function calculateScaleLinearDomain(data: number[]): [number, number] {\n if (!data.length) return [0, 1];\n let min = Infinity;\n let max = -Infinity;\n for (const v of data) {\n if (!Number.isFinite(v)) continue;\n if (v < min) min = v;\n if (v > max) max = v;\n }\n if (!Number.isFinite(min) || !Number.isFinite(max)) return [0, 1];\n if (min < 0 && max > 0) {\n const absMax = Math.max(Math.abs(min), Math.abs(max));\n return [-absMax, absMax];\n }\n return [Math.min(0, min), Math.max(0, max)];\n}\n\n/** Mirrors client Y-tick formatting. */\nexport function formatCompactNumber(value: number, decimals = 2): string {\n const abs = Math.abs(value);\n if (abs >= 1_000_000_000) return `${(value / 1_000_000_000).toFixed(1)}B`;\n if (abs >= 1_000_000) return `${(value / 1_000_000).toFixed(1)}M`;\n if (abs >= 1_000) return `${(value / 1_000).toFixed(1)}K`;\n if (Number.isInteger(value) && abs < 1000) return String(value);\n return value.toFixed(decimals);\n}\n\nexport function seriesColor(index: number, override?: string): string {\n if (override) return override;\n return FD.series[index % FD.series.length];\n}\n\n/** Line markers: donut = hollow ring (FuseDash default). */\nexport function markerAppearance(\n shape: MarkerShape,\n color: string,\n themeMode: 'light' | 'dark' = 'light',\n): { fill: string; stroke: string } {\n const outline = themeMode === 'dark' ? '#000' : '#fff';\n if (shape === 'donut' || shape === 'disabled') {\n return { fill: outline, stroke: color };\n }\n return { fill: color, stroke: outline };\n}\n\nexport function appendGlowFilter(\n svg: Selection<SVGSVGElement, unknown, null, undefined>,\n id = 'ui9000-glow',\n): string {\n let defs = svg.select<SVGDefsElement>('defs');\n if (defs.empty()) defs = svg.append('defs');\n if (defs.select(`#${id}`).empty()) {\n const filter = defs\n .append('filter')\n .attr('id', id)\n .attr('x', '-50%')\n .attr('y', '-50%')\n .attr('width', '200%')\n .attr('height', '200%');\n filter.append('feGaussianBlur').attr('stdDeviation', 3).attr('result', 'coloredBlur');\n const merge = filter.append('feMerge');\n merge.append('feMergeNode').attr('in', 'coloredBlur');\n merge.append('feMergeNode').attr('in', 'SourceGraphic');\n }\n return `url(#${id})`;\n}\n\nexport function calculateNumTicks(height: number): number {\n if (height < 120) return 3;\n if (height < 220) return 4;\n if (height < 360) return 5;\n return 6;\n}\n\n/** Append FuseDash-style line/area marker at (cx, cy). */\nexport function appendLineMarker(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n parent: Selection<any, any, any, any>,\n opts: {\n shape: MarkerShape;\n color: string;\n cx: number;\n cy: number;\n r?: number;\n themeMode?: 'light' | 'dark';\n hovered?: boolean;\n },\n): void {\n const {\n shape,\n color,\n cx,\n cy,\n r = FD.markerRadius,\n themeMode = 'light',\n hovered = false,\n } = opts;\n if (shape === 'disabled') return;\n\n const { fill, stroke } = markerAppearance(shape, color, themeMode);\n const strokeWidth = hovered ? 3 : 1;\n\n if (shape === 'square') {\n const size = 7;\n parent\n .append('rect')\n .attr('x', cx - size / 2)\n .attr('y', cy - size / 2)\n .attr('width', size)\n .attr('height', size)\n .attr('fill', fill)\n .attr('stroke', stroke)\n .attr('stroke-width', strokeWidth);\n return;\n }\n\n if (shape === 'rhombus') {\n const size = 9;\n parent\n .append('rect')\n .attr('x', cx - size / 2)\n .attr('y', cy - size / 2)\n .attr('width', size)\n .attr('height', size)\n .attr('fill', fill)\n .attr('stroke', stroke)\n .attr('stroke-width', strokeWidth)\n .attr('transform', `rotate(45, ${cx}, ${cy})`);\n return;\n }\n\n if (shape === 'triangle') {\n const s = 4;\n parent\n .append('polygon')\n .attr(\n 'points',\n `${cx},${cy - s} ${cx - s},${cy + s} ${cx + s},${cy + s}`,\n )\n .attr('fill', fill)\n .attr('stroke', stroke)\n .attr('stroke-width', strokeWidth);\n return;\n }\n\n parent\n .append('circle')\n .attr('cx', cx)\n .attr('cy', cy)\n .attr('r', r)\n .attr('fill', fill)\n .attr('stroke', stroke)\n .attr('stroke-width', strokeWidth);\n}\n\n/**\n * Lollipop head — FuseDash Vertical markers (default = rhombus diamond path).\n */\nexport function appendLollipopMarkerVertical(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n parent: Selection<any, any, any, any>,\n opts: { shape: MarkerShape; color: string; cx: number; cy: number },\n): void {\n const { shape, color, cx, cy } = opts;\n if (shape === 'disabled') return;\n\n if (shape === 'donut') {\n parent\n .append('path')\n .attr(\n 'd',\n `M ${cx}, ${cy - 5} a 5,5 0 1,0 0,10 a 5,5 0 1,0 0,-10 M ${cx}, ${cy - 2} a 2,2 0 1,1 0,4 a 2,2 0 1,1 0,-4`,\n )\n .attr('fill', color)\n .attr('stroke', '#fff')\n .attr('stroke-width', 1);\n parent.append('circle').attr('cx', cx).attr('cy', cy).attr('r', 2).attr('fill', '#fff');\n return;\n }\n\n if (shape === 'circle') {\n parent\n .append('path')\n .attr('d', `M ${cx}, ${cy - 5} a 5,5 0 1,0 0,10 a 5,5 0 1,0 0,-10`)\n .attr('fill', color)\n .attr('stroke', '#fff')\n .attr('stroke-width', 1);\n return;\n }\n\n if (shape === 'square') {\n parent\n .append('path')\n .attr(\n 'd',\n `M${cx - 5}, ${cy + 5} L${cx + 5}, ${cy + 5} L${cx + 5}, ${cy - 5} L${cx - 5}, ${cy - 5} Z`,\n )\n .attr('fill', color)\n .attr('stroke', '#fff')\n .attr('stroke-width', 1);\n return;\n }\n\n if (shape === 'triangle') {\n parent\n .append('path')\n .attr('d', `M${cx}, ${cy - 5} L${cx - 5}, ${cy + 5} L${cx + 5}, ${cy + 5} Z`)\n .attr('fill', color)\n .attr('stroke', '#fff')\n .attr('stroke-width', 1);\n return;\n }\n\n // default / rhombus\n parent\n .append('path')\n .attr(\n 'd',\n `M${cx}, ${cy + 5} L${cx + 5}, ${cy} L${cx}, ${cy - 5} L${cx - 5}, ${cy}Z`,\n )\n .attr('fill', color)\n .attr('stroke', '#fff')\n .attr('stroke-width', 1);\n}\n"],"names":[],"mappings":"AAIO,MAAM,KAAK;AAAA,EAChB,YAAY;AAAA,EACZ,UAAU;AAAA,EACV,eAAe;AAAA,EACf,eAAe;AAAA,EACf,YAAY;AAAA,EACZ,iBAAiB;AAAA,EACjB,gBAAgB;AAAA;AAAA;AAAA;AAAA;AAAA,EAKhB,QAAQ;AAAA,IACN;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EAAA;AAAA,EAEF,YAAY,EAAE,KAAK,IAAI,OAAO,GAAG,QAAQ,IAAI,MAAM,GAAA;AAAA,EACnD,gBAAgB,EAAE,KAAK,IAAI,OAAO,GAAG,QAAQ,IAAI,MAAM,GAAA;AAAA;AAAA,EAEvD,aAAa,EAAE,KAAK,IAAI,OAAO,GAAG,QAAQ,IAAI,MAAM,EAAA;AAAA,EACpD,iBAAiB;AAAA,EACjB,sBAAsB;AAAA,EACtB,iBAAiB;AAAA,EACjB,sBAAsB;AAAA,EACtB,gBAAgB;AAAA,EAChB,gBAAgB;AAAA,EAChB,kBAAkB;AAAA,EAClB,0BAA0B;AAAA,EAC1B,kBAAkB;AAAA,EAClB,oBAAoB;AAAA;AAAA,EAEpB,iBAAiB,EAAE,KAAK,GAAG,OAAO,GAAG,QAAQ,IAAI,MAAM,GAAA;AAAA,EACvD,gBAAgB,EAAE,KAAK,IAAI,OAAO,GAAG,QAAQ,IAAI,MAAM,GAAA;AAAA;AAAA,EAEvD,iBAAiB,EAAE,KAAK,IAAI,OAAO,GAAG,QAAQ,IAAI,MAAM,GAAA;AAAA,EACxD,sBAAsB;AAAA,EACtB,sBAAsB;AAAA,EACtB,gBAAgB;AAAA,EAChB,qBAAqB;AAAA,EACrB,eAAe,EAAE,KAAK,IAAI,OAAO,GAAG,QAAQ,IAAI,MAAM,GAAA;AAAA,EACtD,iBAAiB,EAAE,KAAK,IAAI,OAAO,GAAG,QAAQ,IAAI,MAAM,GAAA;AAAA;AAAA,EAExD,yBAAyB,EAAE,KAAK,IAAI,OAAO,GAAG,QAAQ,IAAI,MAAM,GAAA;AAAA;AAAA,EAEhE,2BAA2B,EAAE,KAAK,IAAI,OAAO,GAAG,QAAQ,IAAI,MAAM,GAAA;AAAA,EAClE,uBAAuB;AAAA,EACvB,oBAAoB;AAAA,EACpB,gBAAgB;AAAA,EAChB,0BAA0B;AAAA;AAAA,EAE1B,mBAAmB;AAAA,EACnB,mBAAmB;AAAA,EACnB,gBAAgB;AAAA,EAChB,mBAAmB;AAAA;AAAA,EAGnB,sBAAsB,EAAE,KAAK,IAAI,OAAO,IAAI,QAAQ,IAAI,MAAM,GAAA;AAAA;AAAA,EAE9D,wBAAwB,EAAE,KAAK,IAAI,OAAO,IAAI,QAAQ,IAAI,MAAM,GAAA;AAAA,EAIhE,iBAAiB;AAAA,EACjB,oBAAoB;AAAA;AAAA,EAEpB,wBAAwB;AAAA,EACxB,2BAA2B;AAAA,EAC3B,mBAAmB;AAAA,EACnB,sBAAsB;AAAA,EACtB,cAAc;AAAA;AAAA,EAEd,iBAAiB;AAAA;AAAA,EAEjB,qBAAqB;AAAA;AAAA,EAErB,gBAAgB;AAAA,EAChB,gBAAgB;AAAA;AAAA,EAEhB,gBAAgB;AAAA,EAChB,eAAe;AAAA;AAAA,EAEf,mBAAmB;AAAA;AAAA,EAEnB,eAAe;AAAA,EACf,oBAAoB;AAAA;AAAA,EAEpB,WAAW,EAAE,KAAK,IAAI,OAAO,GAAG,QAAQ,IAAI,MAAM,GAAA;AAAA,EAClD,iBAAiB;AAAA;AAAA,EAEjB,gBAAgB;AAAA;AAAA,EAGhB,iBAAiB;AAAA,EACjB,aAAa;AAAA,EACb,cAAc;AAAA;AAAA,EAEd,kBAAkB;AAAA,EAClB,kBAAkB;AAAA,EAClB,aAAa;AAAA;AAAA,EAEb,wBAAwB;AAAA;AAAA,EAExB,iBAAiB;AAAA,EACjB,eAAe;AAAA,EACf,aAAa;AAAA;AAAA,EAEb,oBAAoB;AAAA,EACpB,wBAAwB;AAAA;AAAA,EAExB,uBAAuB;AAAA;AAAA,EAEvB,oBAAoB;AAAA,EACpB,oBAAoB;AAAA,EACpB,wBAAwB;AAAA;AAAA,EAExB,iBAAiB;AAAA,EACjB,oBAAoB;AAAA;AAAA,EAOpB,aAAa,EAAE,KAAK,IAAI,OAAO,GAAG,QAAQ,IAAI,MAAM,EAAA;AAAA;AAAA,EAEpD,gBAAgB;AAAA,EAChB,mBAAmB;AAAA,EACnB,kBAAkB;AAAA,EAClB,mBAAmB;AAAA;AAAA,EAEnB,iBAAiB;AAAA;AAAA,EAEjB,iBAAiB;AAAA,EACjB,uBAAuB;AAAA;AAAA,EAEvB,WAAW,EAAE,KAAK,GAAG,OAAO,GAAG,QAAQ,GAAG,MAAM,EAAA;AAAA,EAChD,mBAAmB;AAAA;AAAA,EAEnB,iBAAiB,EAAE,KAAK,IAAI,OAAO,GAAG,QAAQ,IAAI,MAAM,EAAA;AAAA;AAAA,EAExD,kBAAkB;AAAA,EAClB,iBAAiB;AAAA,EACjB,sBAAsB;AAAA;AAAA,EAEtB,gBAAgB;AAAA,EAChB,qBAAqB;AAAA;AAAA,EAErB,wBAAwB;AAAA,EACxB,wBAAwB;AAAA,EACxB,0BAA0B;AAAA;AAAA,EAE1B,qBAAqB;AAAA,EACrB,qBAAqB;AAAA,EACrB,qBAAqB;AAAA,EACrB,6BAA6B;AAAA;AAAA,EAE7B,qBAAqB;AAAA;AAAA,EAErB,oBAAoB;AAAA,EACpB,0BAA0B;AAAA;AAAA,EAE1B,wBAAwB;AAAA,EACxB,mBAAmB;AAAA,EACnB,mBAAmB;AAAA,EACnB,qBAAqB;AAAA,EACrB,eAAe;AAAA,EACf,mBAAmB;AAAA;AAAA,EAEnB,iBAAiB,EAAE,KAAK,IAAI,OAAO,GAAG,QAAQ,IAAI,MAAM,EAAA;AAAA;AAAA,EAExD,2BAA2B;AAAA,EAC3B,mBAAmB;AAAA,EACnB,gBAAgB;AAAA;AAAA,EAEhB,sBAAsB;AAAA,EACtB,sBAAsB;AAAA,EACtB,0BAA0B;AAAA;AAAA,EAE1B,qBAAqB;AAAA,EACrB,2BAA2B;AAAA;AAAA,EAE3B,qBAAqB;AAAA,EACrB,mBAAmB;AAAA,EACnB,oBAAoB;AAAA,EACpB,wBAAwB;AAAA,EACxB,wBAAwB;AAAA;AAAA,EAExB,0BAA0B;AAAA;AAAA,EAE1B,yBAAyB;AAAA;AAAA,EAEzB,eAAe,EAAE,KAAK,IAAI,OAAO,GAAG,QAAQ,IAAI,MAAM,GAAA;AAAA;AAAA,EAEtD,sBAAsB,EAAE,KAAK,IAAI,OAAO,GAAG,QAAQ,IAAI,MAAM,GAAA;AAAA;AAAA,EAE7D,kCAAkC;AAAA,EAClC,qCAAqC;AAAA,EACrC,4BAA4B;AAAA,EAC5B,0BAA0B;AAAA,EAC1B,0BAA0B;AAAA;AAAA,EAE1B,kBAAkB,EAAE,KAAK,IAAI,OAAO,GAAG,QAAQ,IAAI,MAAM,GAAA;AAAA,EACzD,iBAAiB;AAAA,EACjB,oBAAoB;AAAA,EACpB,mBAAmB;AAAA,EACnB,sBAAsB;AAAA;AAAA,EAEtB,oBAAoB,EAAE,KAAK,IAAI,OAAO,IAAI,QAAQ,IAAI,MAAM,GAAA;AAAA,EAC5D,oBAAoB,CAAC,WAAW,WAAW,WAAW,WAAW,SAAS;AAAA,EAC1E,wBAAwB;AAAA,EACxB,sBAAsB;AAAA,EACtB,wBAAwB;AAAA,EACxB,uBAAuB;AAAA,EACvB,uBAAuB;AAAA,EACvB,yBAAyB;AAAA;AAAA,EAEzB,+BAA+B;AAAA;AAAA,EAE/B,6BAA6B;AAAA,EAC7B,oBAAoB;AAAA,EACpB,oBAAoB;AAAA;AAAA,EAEpB,kBAAkB;AAAA,EAClB,wBAAwB;AAAA,EACxB,iBAAiB;AAAA,EACjB,kBAAkB;AAAA,EAClB,sBAAsB;AAAA,EACtB,sBAAsB;AAAA,EACtB,sBAAsB;AAAA,EACtB,kBAAkB;AAAA,EAClB,sBAAsB;AAAA,EACtB,uBAAuB;AAAA;AAAA,EAEvB,gBAAgB;AAAA,EAChB,oBAAoB;AAAA;AAAA,EAEpB,cAAc;AAAA,EACd,kBAAkB;AAAA;AAAA,EAElB,gBAAgB;AAAA,EAChB,kBAAkB;AAAA,EAElB,gBAAgB;AAAA,EAChB,mBAAmB;AAAA,IACjB,UAAU,EAAE,YAAY,WAAW,MAAM,UAAA;AAAA,IACzC,UAAU,EAAE,YAAY,WAAW,MAAM,UAAA;AAAA,IACzC,SAAS,EAAE,YAAY,WAAW,MAAM,UAAA;AAAA,EAAU;AAAA,EAEpD,uBAAuB;AAAA,IACrB,UAAU,EAAE,YAAY,WAAW,MAAM,UAAA;AAAA,IACzC,UAAU,EAAE,YAAY,WAAW,MAAM,UAAA;AAAA,IACzC,SAAS,EAAE,YAAY,WAAW,MAAM,UAAA;AAAA,EAAU;AAAA;AAAA,EAGpD,eAAe;AAAA,EACf,mBAAmB;AAAA,EACnB,iBAAiB;AAAA,EACjB,sBAAsB;AAAA,EACtB,gBAAgB;AAAA,EAChB,sBAAsB;AAAA;AAAA,EAEtB,oBAAoB;AAAA,EACpB,iBAAiB;AAAA,EACjB,kBAAkB;AAAA;AAAA,EAElB,gBAAgB,EAAE,KAAK,IAAI,OAAO,GAAG,QAAQ,GAAG,MAAM,EAAA;AAAA,EACtD,wBAAwB,EAAE,KAAK,IAAI,OAAO,GAAG,QAAQ,GAAG,MAAM,EAAA;AAAA;AAAA,EAE9D,qBAAqB;AAAA;AAAA,EAErB,0BAA0B;AAAA;AAAA,EAE1B,2BAA2B;AAAA,EAC3B,qBAAqB;AAAA,EACrB,8BAA8B;AAAA,EAC9B,sBAAsB;AAAA;AAAA,EAEtB,mBAAmB;AAAA,EACnB,0BAA0B;AAAA,EAC1B,qBAAqB;AAAA,EACrB,2BAA2B;AAAA;AAAA,EAE3B,oBAAoB;AAAA,EACpB,uBAAuB;AAAA,EACvB,mBAAmB;AAAA,EACnB,yBAAyB;AAAA;AAAA,EAEzB,YAAY,EAAE,KAAK,IAAI,OAAO,IAAI,QAAQ,IAAI,MAAM,GAAA;AAAA;AAAA,EAEpD,gBAAgB;AAAA;AAAA,EAEhB,kBAAkB;AAAA,EAClB,wBAAwB;AAAA,EACxB,iBAAiB;AAAA;AAAA,EAEjB,qBAAqB;AAAA,EACrB,uBAAuB;AAAA,EACvB,uBAAuB;AAAA,EACvB,sBAAsB;AAAA;AAAA,EAEtB,qBAAqB;AACvB;AAGO,MAAM,gBAAgB;AAAA,EAC3B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAWO,SAAS,aAAa,KAAa,QAAwB;AAChE,MAAI,QAAQ,IAAI,QAAQ,KAAK,EAAE;AAC/B,MAAI,MAAM,WAAW,GAAG;AACtB,YAAQ,MACL,MAAM,EAAE,EACR,IAAI,CAAC,MAAM,IAAI,CAAC,EAChB,KAAK,EAAE;AAAA,EACZ;AACA,MAAI,CAAC,mBAAmB,KAAK,KAAK,EAAG,QAAO;AAC5C,QAAM,IAAI,KAAK,IAAI,GAAG,KAAK,IAAI,GAAG,MAAM,CAAC;AACzC,QAAM,IAAI,SAAS,MAAM,MAAM,GAAG,CAAC,GAAG,EAAE;AACxC,QAAM,IAAI,SAAS,MAAM,MAAM,GAAG,CAAC,GAAG,EAAE;AACxC,QAAM,IAAI,SAAS,MAAM,MAAM,GAAG,CAAC,GAAG,EAAE;AACxC,QAAM,KAAK,KAAK,MAAM,KAAK,MAAM,KAAK,CAAC;AACvC,QAAM,KAAK,KAAK,MAAM,KAAK,MAAM,KAAK,CAAC;AACvC,QAAM,KAAK,KAAK,MAAM,KAAK,MAAM,KAAK,CAAC;AACvC,SAAO,IAAI,GAAG,SAAS,EAAE,EAAE,SAAS,GAAG,GAAG,CAAC,GAAG,GAAG,SAAS,EAAE,EAAE,SAAS,GAAG,GAAG,CAAC,GAAG,GAAG,SAAS,EAAE,EAAE,SAAS,GAAG,GAAG,CAAC;AACnH;AAGO,SAAS,aAAa,KAAa,YAA4B;AACpE,MAAI,QAAQ,IAAI,QAAQ,KAAK,EAAE,EAAE,YAAA;AACjC,MAAI,MAAM,WAAW,GAAG;AACtB,YAAQ,MACL,MAAM,EAAE,EACR,IAAI,CAAC,MAAM,IAAI,CAAC,EAChB,KAAK,EAAE;AAAA,EACZ;AACA,MAAI,CAAC,gBAAgB,KAAK,KAAK,EAAG,QAAO;AACzC,QAAM,QAAQ,KAAK,MAAO,KAAK,IAAI,GAAG,KAAK,IAAI,KAAK,UAAU,CAAC,IAAI,MAAO,GAAG,EAC1E,SAAS,EAAE,EACX,SAAS,GAAG,GAAG,EACf,YAAA;AACH,SAAO,IAAI,KAAK,GAAG,KAAK;AAC1B;AAGO,SAAS,2BAA2B,MAAkC;AAC3E,MAAI,CAAC,KAAK,OAAQ,QAAO,CAAC,GAAG,CAAC;AAC9B,MAAI,MAAM;AACV,MAAI,MAAM;AACV,aAAW,KAAK,MAAM;AACpB,QAAI,CAAC,OAAO,SAAS,CAAC,EAAG;AACzB,QAAI,IAAI,IAAK,OAAM;AACnB,QAAI,IAAI,IAAK,OAAM;AAAA,EACrB;AACA,MAAI,CAAC,OAAO,SAAS,GAAG,KAAK,CAAC,OAAO,SAAS,GAAG,EAAG,QAAO,CAAC,GAAG,CAAC;AAChE,MAAI,MAAM,KAAK,MAAM,GAAG;AACtB,UAAM,SAAS,KAAK,IAAI,KAAK,IAAI,GAAG,GAAG,KAAK,IAAI,GAAG,CAAC;AACpD,WAAO,CAAC,CAAC,QAAQ,MAAM;AAAA,EACzB;AACA,SAAO,CAAC,KAAK,IAAI,GAAG,GAAG,GAAG,KAAK,IAAI,GAAG,GAAG,CAAC;AAC5C;AAGO,SAAS,oBAAoB,OAAe,WAAW,GAAW;AACvE,QAAM,MAAM,KAAK,IAAI,KAAK;AAC1B,MAAI,OAAO,IAAe,QAAO,IAAI,QAAQ,KAAe,QAAQ,CAAC,CAAC;AACtE,MAAI,OAAO,IAAW,QAAO,IAAI,QAAQ,KAAW,QAAQ,CAAC,CAAC;AAC9D,MAAI,OAAO,IAAO,QAAO,IAAI,QAAQ,KAAO,QAAQ,CAAC,CAAC;AACtD,MAAI,OAAO,UAAU,KAAK,KAAK,MAAM,IAAM,QAAO,OAAO,KAAK;AAC9D,SAAO,MAAM,QAAQ,QAAQ;AAC/B;AAEO,SAAS,YAAY,OAAe,UAA2B;AAEpE,SAAO,GAAG,OAAO,QAAQ,GAAG,OAAO,MAAM;AAC3C;AAGO,SAAS,iBACd,OACA,OACA,YAA8B,SACI;AAClC,QAAM,UAAU,cAAc,SAAS,SAAS;AAChD,MAAI,UAAU,WAAW,UAAU,YAAY;AAC7C,WAAO,EAAE,MAAM,SAAS,QAAQ,MAAA;AAAA,EAClC;AACA,SAAO,EAAE,MAAM,OAAO,QAAQ,QAAA;AAChC;AAEO,SAAS,iBACd,KACA,KAAK,eACG;AACR,MAAI,OAAO,IAAI,OAAuB,MAAM;AAC5C,MAAI,KAAK,MAAA,EAAS,QAAO,IAAI,OAAO,MAAM;AAC1C,MAAI,KAAK,OAAO,IAAI,EAAE,EAAE,EAAE,SAAS;AACjC,UAAM,SAAS,KACZ,OAAO,QAAQ,EACf,KAAK,MAAM,EAAE,EACb,KAAK,KAAK,MAAM,EAChB,KAAK,KAAK,MAAM,EAChB,KAAK,SAAS,MAAM,EACpB,KAAK,UAAU,MAAM;AACxB,WAAO,OAAO,gBAAgB,EAAE,KAAK,gBAAgB,CAAC,EAAE,KAAK,UAAU,aAAa;AACpF,UAAM,QAAQ,OAAO,OAAO,SAAS;AACrC,UAAM,OAAO,aAAa,EAAE,KAAK,MAAM,aAAa;AACpD,UAAM,OAAO,aAAa,EAAE,KAAK,MAAM,eAAe;AAAA,EACxD;AACA,SAAO,QAAQ,EAAE;AACnB;AAEO,SAAS,kBAAkB,QAAwB;AACxD,MAAI,SAAS,IAAK,QAAO;AACzB,MAAI,SAAS,IAAK,QAAO;AACzB,MAAI,SAAS,IAAK,QAAO;AACzB,SAAO;AACT;AAGO,SAAS,iBAEd,QACA,MASM;AACN,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,IAAI,GAAG;AAAA,IACP,YAAY;AAAA,IACZ,UAAU;AAAA,EAAA,IACR;AACJ,MAAI,UAAU,WAAY;AAE1B,QAAM,EAAE,MAAM,OAAA,IAAW,iBAAiB,OAAO,OAAO,SAAS;AACjE,QAAM,cAAc,UAAU,IAAI;AAElC,MAAI,UAAU,UAAU;AACtB,UAAM,OAAO;AACb,WACG,OAAO,MAAM,EACb,KAAK,KAAK,KAAK,OAAO,CAAC,EACvB,KAAK,KAAK,KAAK,OAAO,CAAC,EACvB,KAAK,SAAS,IAAI,EAClB,KAAK,UAAU,IAAI,EACnB,KAAK,QAAQ,IAAI,EACjB,KAAK,UAAU,MAAM,EACrB,KAAK,gBAAgB,WAAW;AACnC;AAAA,EACF;AAEA,MAAI,UAAU,WAAW;AACvB,UAAM,OAAO;AACb,WACG,OAAO,MAAM,EACb,KAAK,KAAK,KAAK,OAAO,CAAC,EACvB,KAAK,KAAK,KAAK,OAAO,CAAC,EACvB,KAAK,SAAS,IAAI,EAClB,KAAK,UAAU,IAAI,EACnB,KAAK,QAAQ,IAAI,EACjB,KAAK,UAAU,MAAM,EACrB,KAAK,gBAAgB,WAAW,EAChC,KAAK,aAAa,cAAc,EAAE,KAAK,EAAE,GAAG;AAC/C;AAAA,EACF;AAEA,MAAI,UAAU,YAAY;AACxB,UAAM,IAAI;AACV,WACG,OAAO,SAAS,EAChB;AAAA,MACC;AAAA,MACA,GAAG,EAAE,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC;AAAA,IAAA,EAExD,KAAK,QAAQ,IAAI,EACjB,KAAK,UAAU,MAAM,EACrB,KAAK,gBAAgB,WAAW;AACnC;AAAA,EACF;AAEA,SACG,OAAO,QAAQ,EACf,KAAK,MAAM,EAAE,EACb,KAAK,MAAM,EAAE,EACb,KAAK,KAAK,CAAC,EACX,KAAK,QAAQ,IAAI,EACjB,KAAK,UAAU,MAAM,EACrB,KAAK,gBAAgB,WAAW;AACrC;AAKO,SAAS,6BAEd,QACA,MACM;AACN,QAAM,EAAE,OAAO,OAAO,IAAI,OAAO;AACjC,MAAI,UAAU,WAAY;AAE1B,MAAI,UAAU,SAAS;AACrB,WACG,OAAO,MAAM,EACb;AAAA,MACC;AAAA,MACA,KAAK,EAAE,KAAK,KAAK,CAAC,yCAAyC,EAAE,KAAK,KAAK,CAAC;AAAA,IAAA,EAEzE,KAAK,QAAQ,KAAK,EAClB,KAAK,UAAU,MAAM,EACrB,KAAK,gBAAgB,CAAC;AACzB,WAAO,OAAO,QAAQ,EAAE,KAAK,MAAM,EAAE,EAAE,KAAK,MAAM,EAAE,EAAE,KAAK,KAAK,CAAC,EAAE,KAAK,QAAQ,MAAM;AACtF;AAAA,EACF;AAEA,MAAI,UAAU,UAAU;AACtB,WACG,OAAO,MAAM,EACb,KAAK,KAAK,KAAK,EAAE,KAAK,KAAK,CAAC,qCAAqC,EACjE,KAAK,QAAQ,KAAK,EAClB,KAAK,UAAU,MAAM,EACrB,KAAK,gBAAgB,CAAC;AACzB;AAAA,EACF;AAEA,MAAI,UAAU,UAAU;AACtB,WACG,OAAO,MAAM,EACb;AAAA,MACC;AAAA,MACA,IAAI,KAAK,CAAC,KAAK,KAAK,CAAC,KAAK,KAAK,CAAC,KAAK,KAAK,CAAC,KAAK,KAAK,CAAC,KAAK,KAAK,CAAC,KAAK,KAAK,CAAC,KAAK,KAAK,CAAC;AAAA,IAAA,EAExF,KAAK,QAAQ,KAAK,EAClB,KAAK,UAAU,MAAM,EACrB,KAAK,gBAAgB,CAAC;AACzB;AAAA,EACF;AAEA,MAAI,UAAU,YAAY;AACxB,WACG,OAAO,MAAM,EACb,KAAK,KAAK,IAAI,EAAE,KAAK,KAAK,CAAC,KAAK,KAAK,CAAC,KAAK,KAAK,CAAC,KAAK,KAAK,CAAC,KAAK,KAAK,CAAC,IAAI,EAC3E,KAAK,QAAQ,KAAK,EAClB,KAAK,UAAU,MAAM,EACrB,KAAK,gBAAgB,CAAC;AACzB;AAAA,EACF;AAGA,SACG,OAAO,MAAM,EACb;AAAA,IACC;AAAA,IACA,IAAI,EAAE,KAAK,KAAK,CAAC,KAAK,KAAK,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,KAAK,CAAC,KAAK,KAAK,CAAC,KAAK,EAAE;AAAA,EAAA,EAExE,KAAK,QAAQ,KAAK,EAClB,KAAK,UAAU,MAAM,EACrB,KAAK,gBAAgB,CAAC;AAC3B;"}
|
|
1
|
+
{"version":3,"file":"fusedash-visual.js","sources":["../../src/utils/fusedash-visual.ts"],"sourcesContent":["import type { Selection } from 'd3-selection';\n\n/** FuseDash Widgets visual tokens — keep charts looking 1:1 with client. */\n\nexport const FD = {\n gridStroke: '#afb3bb',\n gridDash: '1 2',\n axisLabelFill: '#6c7584',\n axisLabelSize: 11,\n axisStroke: '#afb3bb',\n hoverGuideLight: '#6c7584',\n hoverGuideDark: '#ffffff',\n /**\n * Qualitative12Colors.default — used when series count unknown.\n * Prefer `resolveFormattingColor` / `pickQualitativePalette` for FuseDash widgets.\n */\n series: [\n '#473DD9',\n '#938CFF',\n '#36C4A5',\n '#ADF4E5',\n '#BDBCC8',\n '#56546D',\n '#FF8C47',\n '#FFCEB0',\n '#FF4781',\n '#FFB0C9',\n '#47B0FF',\n '#B0DDFF',\n ],\n lineMargin: { top: 10, right: 1, bottom: 21, left: 40 },\n lollipopMargin: { top: 10, right: 3, bottom: 21, left: 40 },\n /** FuseDash RadarChart (useNewDesign) frame */\n radarMargin: { top: 25, right: 5, bottom: 25, left: 5 },\n radarScaleSteps: 5,\n radarDomainPadFactor: 1.1,\n radarMarkerSize: 50,\n radarMarkerHoverSize: 70,\n radarSpokeDash: '2,2',\n radarCapRadius: 3,\n radarLabelOffset: 12,\n radarGradientEdgeOpacity: 0.3,\n radarStrokeWidth: 2,\n radarTickLabelFill: '#f1f4f7',\n /** Client PunchcardChart DEFAULT_MARGIN */\n punchcardMargin: { top: 0, right: 0, bottom: 21, left: 80 },\n /** Client MatrixChart DEFAULT_MARGIN */\n matrixMargin: { top: 20, right: 0, bottom: 30, left: 80 },\n /** MatrixChart cell gutter + corner (client `rectPadding`) */\n matrixCellPadding: 3,\n matrixCellRadius: 2,\n /** Rows never shrink below this — the plot scrolls instead */\n matrixMinCellHeight: 16,\n /** Top header: font + tick + label spacing reserve (client `topAxisHeight`) */\n matrixTopTickLength: 8,\n matrixTopLabelsSpacing: 12,\n /** Above this many rows the top axis is pinned and the rows scroll */\n matrixSeparateAxisRowLimit: 7,\n /** Negative cells are flat grey; zero / missing cells get the hatch pattern */\n matrixNegativeFill: '#DADAE1',\n matrixNoDataLight: '#f0f1f2',\n matrixNoDataDark: '#33373d',\n matrixNoDataStripeLight: '#ffffff',\n matrixNoDataStripeDark: '#000000',\n /** Client AxisLeft `TickLabel length={9}` */\n matrixYLabelMaxChars: 9,\n /** Client `MAX_LABEL_LENGTH` for the top header labels */\n matrixTopLabelMaxChars: 25,\n stepLineMargin: { top: 10, right: 1, bottom: 21, left: 40 },\n /** SparkLineChart — same frame as StepLineChart */\n sparkLineMargin: { top: 10, right: 1, bottom: 21, left: 40 },\n sparkLineStrokeWidth: 1.5,\n sparkDomainPadFactor: 1.2,\n sparkGuideDash: '5,2',\n sparkHoverDotRadius: 4,\n boxPlotMargin: { top: 10, right: 1, bottom: 21, left: 40 },\n histogramMargin: { top: 10, right: 1, bottom: 21, left: 40 },\n /** Client VerticalWaterfallChart margin */\n waterfallVerticalMargin: { top: 10, right: 0, bottom: 21, left: 40 },\n /** Client HorizontalWaterfallChart base margin (left is sized from labels) */\n waterfallHorizontalMargin: { top: 10, right: 1, bottom: 21, left: 40 },\n waterfallBarThickness: 16,\n waterfallBarRadius: 2,\n waterfallArrow: 5,\n waterfallDomainPadFactor: 1.2,\n /** Client hard-coded fills (formatting keys are ignored for paint) */\n waterfallPositive: '#938CFF',\n waterfallNegative: '#FF8C47',\n waterfallTotal: '#BDBCC8',\n waterfallHoverDim: 0.2,\n waterfallMinBand: 32,\n /** Client VerticalViolinChart DEFAULT_MARGIN */\n violinVerticalMargin: { top: 10, right: 16, bottom: 28, left: 44 },\n /** Client HorizontalViolinChart DEFAULT_MARGIN */\n violinHorizontalMargin: { top: 10, right: 24, bottom: 28, left: 44 },\n /** Client Horizontal/Vertical BoxPlot */\n boxPlotDomainPadFactor: 1.1,\n boxPlotBorderRadius: 2,\n lineStrokeWidth: 2,\n lineStrokeAlphaPct: 80,\n /** FuseDash AreaChart linearGradient stops (new design) */\n areaGradientTopOpacity: 0.6,\n areaGradientBottomOpacity: 0.1,\n lollipopStemWidth: 3,\n lollipopStemAlphaPct: 50,\n markerRadius: 4,\n /** StepLineChart: plain stroke, no alpha / glow / markers */\n stepStrokeWidth: 1.5,\n /** StepLineChart y-domain is padded by 1.2x before `.nice()` */\n stepDomainPadFactor: 1.2,\n /** KS-plot \"Ideal\" overlay */\n stepIdealColor: '#2ecc71',\n stepIdealWidth: 3,\n /** ROC \"Random guessing\" diagonal */\n stepGuessWidth: 2,\n stepGuessDash: '5,5',\n /** Max-deviation marker (KS distance) */\n stepDeviationFill: '#2c2d33',\n /** Tooltip crosshair on the step chart */\n stepGuideDash: '5,2',\n stepHoverDotRadius: 4,\n /** Barchart — shared frame + bar geometry (all six FuseDash variants) */\n barMargin: { top: 10, right: 1, bottom: 21, left: 40 },\n barCornerRadius: 4,\n /** Bar fill is a gradient from the series color to a faded stop */\n barFadeOpacity: 0.6,\n barFadeOpacityHovered: 0.7,\n /** Vertical single-series: bandwidth * 0.4, capped, with a visible floor */\n barBandFraction: 0.4,\n barMaxWidth: 40,\n barMinHeight: 6,\n /** Vertical grouped: floor(clamp(plotWidth / categories / series)) + 1px gap */\n barGroupMinWidth: 4,\n barGroupMaxWidth: 24,\n barGroupGap: 1,\n /** Vertical stacked: bandwidth * 0.85, same clamp as grouped */\n barStackedBandFraction: 0.85,\n /** Horizontal: fixed row thickness, gutter, and a floor for tiny values */\n barRowThickness: 24,\n barRowSpacing: 16,\n barMinWidth: 6,\n /** Y (vertical) / X (horizontal) domain headroom */\n barDomainPadFactor: 1.2,\n barHorizontalPadFactor: 1.1,\n /** Stacked totals get a flat 10% pad instead */\n barStackedPadFraction: 0.1,\n /** Cumulative overlay line (FuseDash `cumulativeLine`) */\n barCumulativeColor: '#6d6df7',\n barCumulativeWidth: 2,\n barCumulativeDotRadius: 3,\n /** Hovered category column: animated dot pattern + solid guide */\n barHoverDotFill: '#CFD2D6',\n barHoverGuideWidth: 2,\n /** Client `calculatedLeftMargin` (unused in chat — shared LEFT_GUTTER_MARGIN) */\n barLabelCharWidth: 5,\n barLabelGutter: 28,\n barLabelGutterMin: 56,\n barLabelGutterMax: 180,\n /** Resting / dimmed / hovered arc opacity (FuseDash settles on 0.8) */\n donutArcOpacity: 0.8,\n donutArcOpacityDimmed: 0.2,\n /** PieChart — FuseDash uses zero margin; pie is a square inscribed in the body */\n pieMargin: { top: 0, right: 0, bottom: 0, left: 0 },\n pieMinArcLengthPx: 5,\n /** PolarAreaChart — FuseDash margin around the centred disc */\n polarAreaMargin: { top: 25, right: 5, bottom: 25, left: 5 },\n /** Concentric grid rings; opacity ramps 0.2 → 1.0 outward */\n polarRadialSteps: 5,\n polarGridStroke: '#939ba7',\n polarGridStepOpacity: 0.2,\n /** Dashed spoke from the centre to each category boundary, with a round cap */\n polarSpokeDash: '2,2',\n polarSpokeCapRadius: 3,\n /** Category labels sit just outside the outermost ring */\n polarCategoryLabelFill: '#5f6877',\n polarCategoryLabelSize: 12,\n polarCategoryLabelOffset: 12,\n /** Side room reserved for those labels, measured off the longest one */\n polarLabelCharWidth: 0.55,\n polarLabelGutterMin: 40,\n polarLabelGutterMax: 120,\n polarLabelGutterMaxFraction: 0.28,\n /** Below this radius the label ring collides with itself — drop it */\n polarMinLabelRadius: 40,\n /** Sectors: 0.8 at rest, siblings drop to 0.2 on hover */\n polarSectorOpacity: 0.8,\n polarSectorOpacityDimmed: 0.2,\n /** Radial tick pills are hidden when the disc is too short to fit them */\n polarTickPillRowHeight: 21,\n polarTickPillPadX: 7,\n polarTickPillPadY: 3,\n polarTickPillRadius: 4,\n polarTickPill: '#ffffff',\n polarTickPillDark: '#1a1b1f',\n /** RadialBarChart — client margin; the plot is a circle inscribed in the body */\n radialBarMargin: { top: 25, right: 5, bottom: 25, left: 5 },\n /** Hole is 20% of the outer radius; rings sweep 270° clockwise from 12 o'clock */\n radialBarInnerRadiusRatio: 0.2,\n radialBarSweepDeg: 270,\n radialBarTicks: 5,\n /** Ring thickness clamp around `((outer - inner - rings) / rings) * 0.5` */\n radialBarMinArcWidth: 4,\n radialBarMaxArcWidth: 24,\n radialBarArcCornerRadius: 1,\n /** Resting / dimmed arc opacity */\n radialBarArcOpacity: 0.8,\n radialBarArcOpacityDimmed: 0.2,\n /** Client draws the rings and the radial axes in one darker grey */\n radialBarGridStroke: '#939ba7',\n radialBarTickDash: '4,4',\n radialBarLabelFill: '#5f6877',\n radialBarTickLabelSize: 12,\n radialBarRingLabelSize: 11,\n /** Value labels sit 12px outside the outer ring */\n radialBarTickLabelOffset: 12,\n /** Ring labels are cut at `(outer - inner) / 8` characters */\n radialBarLabelCharWidth: 8,\n /** ScatterPlot — FuseDash DEFAULT_MARGIN */\n scatterMargin: { top: 10, right: 5, bottom: 21, left: 40 },\n /** AreaGroupedBarChart — client DEFAULT_MARGIN */\n areaGroupedBarMargin: { top: 10, right: 5, bottom: 21, left: 40 },\n /** Area fill under the line (client stopOpacity 0.35 → 0) */\n areaGroupedBarGradientTopOpacity: 0.35,\n areaGroupedBarGradientBottomOpacity: 0,\n areaGroupedBarMarkerRadius: 3,\n areaGroupedBarDimOpacity: 0.3,\n areaGroupedBarBarOpacity: 0.85,\n /** BubbleChart — BASE_MARGIN + MAX_BUBBLE_RADIUS/2 inset on top/right */\n bubbleBaseMargin: { top: 10, right: 1, bottom: 21, left: 40 },\n bubbleMaxRadius: 30,\n bubbleNegativeFill: '#DADAE1',\n scatterMarkerSize: 40,\n scatterReferenceLine: '#56546D',\n /** BiasVarianceTradeoffChart — the client widget carries its own frame/palette */\n biasVarianceMargin: { top: 24, right: 24, bottom: 36, left: 48 },\n biasVarianceSeries: ['#6366f1', '#22c55e', '#f59e0b', '#06b6d4', '#ef4444'],\n biasVarianceGridStroke: '#d1d5db',\n biasVarianceGridDash: '2,4',\n biasVarianceAxisStroke: '#9ca3af',\n biasVarianceLabelFill: '#6b7280',\n biasVarianceLineWidth: 2,\n biasVarianceLineOpacity: 0.95,\n /** Sibling curves fade while one is hovered (FuseDash line-hover convention) */\n biasVarianceLineOpacityDimmed: 0.2,\n /** Y domain is `[0, max * 1.1]` before `.nice()` */\n biasVarianceDomainPadFactor: 1.1,\n biasVarianceXTicks: 8,\n biasVarianceYTicks: 6,\n /** Shared `DomainsLimits` overlay (reference lines / bands) */\n domainLimitColor: '#6C8CF5',\n domainLimitFillOpacity: 0.12,\n domainLimitDash: '4,4',\n domainLimitArrow: 8,\n domainLimitLabelFill: '#141c2ce6',\n domainLimitLabelText: '#ffffff',\n domainLimitLabelSize: 10,\n /** PartialDependenceChart — client DEFAULT_MARGIN */\n pdpMargin: { top: 16, right: 24, bottom: 28, left: 44 },\n /** ICE band: many faint curves under one dashed average line */\n pdpIceOpacity: 0.18,\n pdpIceStrokeWidth: 1.25,\n pdpAverageStrokeWidth: 2.5,\n pdpAverageDash: '4,4',\n donutSliceStroke: '#ffffff',\n donutSliceStrokeDark: '#1a1b1f',\n donutSliceStrokeWidth: 2,\n /** Treemap — d3 `treemapBinary` tiles, no axes so the plot fills the body */\n treemapMargin: { top: 0, right: 0, bottom: 0, left: 0 },\n treemapPaddingInner: 2,\n treemapTileRadius: 6,\n /** Tile fill fades from the band color to 80% alpha at the bottom edge */\n treemapGradientBottomOpacity: 0.8,\n /** White scanlines every 5px, fading out toward the bottom of the tile */\n treemapStripeColor: '#FFFFFF',\n treemapStripeSpacing: 5,\n treemapStripeOpacity: 0.14,\n treemapStripeFalloff: 0.8,\n /** Client `hasLightColor` label colors */\n treemapLabelOnLight: '#0B101A',\n treemapLabelOnDark: '#FFFFFF',\n treemapLabelPadding: 4,\n treemapLabelSize: 14,\n treemapValueSize: 12,\n /** A tile only gets a name below this, and a value below `MinValueHeight` */\n treemapMinLabelWidth: 40,\n treemapMinLabelHeight: 20,\n treemapMinValueHeight: 30,\n /** Grouped mode: one card per group in the client's grid-template-areas */\n treemapCardGap: 8,\n treemapCardRadius: 8,\n treemapCardPadding: 8,\n treemapGroupsMarginTop: 10,\n /** Rows in the >5 group fallback list, which scrolls instead of squeezing */\n treemapCardMinHeight: 140,\n /** Sibling tiles fade while one is hovered (chat-only affordance) */\n treemapDimOpacity: 0.4,\n /** `getTreemapRangeColors`: 7 shades from +55% white to -35% black */\n treemapRangeSteps: 7,\n treemapRangeMinShift: 0.55,\n treemapRangeMaxShift: -0.35,\n /** Sankey: layout extent inset, node gap, and the two node-rule colors */\n sankeyPadding: 4.5,\n sankeyNodePadding: 14,\n sankeyNodeWidth: 70,\n sankeyNodeWidthSmall: 65,\n sankeyNodeRule: '#D3DBE3',\n sankeyNodeRuleActive: '#939BA7',\n /** Ribbons sit at 50% alpha until hovered or focused */\n sankeyLinkAlphaPct: 50,\n sankeyLinkInset: 3,\n sankeyDimOpacity: 0.5,\n /** ParallelCoordinates — client Horizontal/Vertical frames */\n parallelMargin: { top: 10, right: 1, bottom: 8, left: 1 },\n parallelVerticalMargin: { top: 10, right: 1, bottom: 1, left: 1 },\n /** Horizontal: one 72px band per dimension, so the plot scrolls past ~5 axes */\n parallelAxisSpacing: 72,\n /** Vertical: gutter kept free under the axes for the bottom tick row */\n parallelColorScaleHeight: 44,\n /** Right gutter reserved for the colour ramp + its tick labels */\n parallelLegendOffsetRight: 20,\n parallelLegendWidth: 10,\n parallelLegendTickLabelWidth: 44,\n parallelLegendRadius: 6,\n /** Resting / dimmed / hovered polyline stroke */\n parallelLineWidth: 1,\n parallelLineWidthHovered: 5,\n parallelLineOpacity: 0.4,\n parallelLineOpacityDimmed: 0.05,\n /** Client draws these axes a shade darker than the shared FD axis tokens */\n parallelAxisStroke: '#939ba7',\n parallelAxisLabelFill: '#5f6877',\n parallelTitleSize: 11,\n parallelTitleSizeActive: 13,\n /** GiniImpurityEntropyChart — client DEFAULT_MARGIN */\n giniMargin: { top: 20, right: 24, bottom: 28, left: 44 },\n /** Curves are drawn as smooth Catmull-Rom splines with this tension */\n giniCurveAlpha: 0.5,\n /** p-hat guide + confidence-interval band */\n giniOverlayColor: '#4c6ef5',\n giniOverlayBandOpacity: 0.08,\n giniOverlayDash: '5,5',\n /** Split annotation markers on the Gini curve */\n giniSplitMarkerFill: '#12b886',\n giniSplitMarkerStroke: '#ffffff',\n giniSplitMarkerRadius: 4,\n giniSplitLabelOffset: 8,\n /** Hovering one curve fades the others so the read is unambiguous */\n giniCurveDimOpacity: 0.2,\n} as const;\n\n/** SequentialColors1 for the `default` styleId — low → high. */\nexport const FD_SEQUENTIAL = [\n '#D6D3FF',\n '#B5B0FF',\n '#938CFF',\n '#7369FF',\n '#5448FF',\n '#473DD9',\n '#3C33B5',\n] as const;\n\nexport type MarkerShape =\n | 'donut'\n | 'circle'\n | 'square'\n | 'rhombus'\n | 'triangle'\n | 'disabled';\n\n/** Mirrors client `lightenColor` — blend hex toward white (amount 0–1). */\nexport function lightenColor(hex: string, amount: number): string {\n let clean = hex.replace('#', '');\n if (clean.length === 3) {\n clean = clean\n .split('')\n .map((c) => c + c)\n .join('');\n }\n if (!/^[0-9A-Fa-f]{6}$/.test(clean)) return hex;\n const t = Math.max(0, Math.min(1, amount));\n const r = parseInt(clean.slice(0, 2), 16);\n const g = parseInt(clean.slice(2, 4), 16);\n const b = parseInt(clean.slice(4, 6), 16);\n const lr = Math.round(r + (255 - r) * t);\n const lg = Math.round(g + (255 - g) * t);\n const lb = Math.round(b + (255 - b) * t);\n return `#${lr.toString(16).padStart(2, '0')}${lg.toString(16).padStart(2, '0')}${lb.toString(16).padStart(2, '0')}`;\n}\n\n/** Mirrors client `hexToHexWithAlpha` (opacity 0–100). */\nexport function hexWithAlpha(hex: string, opacityPct: number): string {\n let clean = hex.replace('#', '').toUpperCase();\n if (clean.length === 3) {\n clean = clean\n .split('')\n .map((c) => c + c)\n .join('');\n }\n if (!/^[0-9A-F]{6}$/.test(clean)) return hex;\n const alpha = Math.round((Math.max(0, Math.min(100, opacityPct)) / 100) * 255)\n .toString(16)\n .padStart(2, '0')\n .toUpperCase();\n return `#${clean}${alpha}`;\n}\n\n/** Mirrors client `calculateScaleLinearDomain`. */\nexport function calculateScaleLinearDomain(data: number[]): [number, number] {\n if (!data.length) return [0, 1];\n let min = Infinity;\n let max = -Infinity;\n for (const v of data) {\n if (!Number.isFinite(v)) continue;\n if (v < min) min = v;\n if (v > max) max = v;\n }\n if (!Number.isFinite(min) || !Number.isFinite(max)) return [0, 1];\n if (min < 0 && max > 0) {\n const absMax = Math.max(Math.abs(min), Math.abs(max));\n return [-absMax, absMax];\n }\n return [Math.min(0, min), Math.max(0, max)];\n}\n\n/** Mirrors client Y-tick formatting. */\nexport function formatCompactNumber(value: number, decimals = 2): string {\n const abs = Math.abs(value);\n if (abs >= 1_000_000_000) return `${(value / 1_000_000_000).toFixed(1)}B`;\n if (abs >= 1_000_000) return `${(value / 1_000_000).toFixed(1)}M`;\n if (abs >= 1_000) return `${(value / 1_000).toFixed(1)}K`;\n if (Number.isInteger(value) && abs < 1000) return String(value);\n return value.toFixed(decimals);\n}\n\nexport function seriesColor(index: number, override?: string): string {\n if (override) return override;\n return FD.series[index % FD.series.length];\n}\n\n/** Line markers: donut = hollow ring (FuseDash default). */\nexport function markerAppearance(\n shape: MarkerShape,\n color: string,\n themeMode: 'light' | 'dark' = 'light',\n): { fill: string; stroke: string } {\n const outline = themeMode === 'dark' ? '#000' : '#fff';\n if (shape === 'donut' || shape === 'disabled') {\n return { fill: outline, stroke: color };\n }\n return { fill: color, stroke: outline };\n}\n\nexport function appendGlowFilter(\n svg: Selection<SVGSVGElement, unknown, null, undefined>,\n id = 'ui9000-glow',\n): string {\n let defs = svg.select<SVGDefsElement>('defs');\n if (defs.empty()) defs = svg.append('defs');\n if (defs.select(`#${id}`).empty()) {\n const filter = defs\n .append('filter')\n .attr('id', id)\n .attr('x', '-50%')\n .attr('y', '-50%')\n .attr('width', '200%')\n .attr('height', '200%');\n filter.append('feGaussianBlur').attr('stdDeviation', 3).attr('result', 'coloredBlur');\n const merge = filter.append('feMerge');\n merge.append('feMergeNode').attr('in', 'coloredBlur');\n merge.append('feMergeNode').attr('in', 'SourceGraphic');\n }\n return `url(#${id})`;\n}\n\nexport function calculateNumTicks(height: number): number {\n if (height < 120) return 3;\n if (height < 220) return 4;\n if (height < 360) return 5;\n return 6;\n}\n\n/** Append FuseDash-style line/area marker at (cx, cy). */\nexport function appendLineMarker(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n parent: Selection<any, any, any, any>,\n opts: {\n shape: MarkerShape;\n color: string;\n cx: number;\n cy: number;\n r?: number;\n themeMode?: 'light' | 'dark';\n hovered?: boolean;\n },\n): void {\n const {\n shape,\n color,\n cx,\n cy,\n r = FD.markerRadius,\n themeMode = 'light',\n hovered = false,\n } = opts;\n if (shape === 'disabled') return;\n\n const { fill, stroke } = markerAppearance(shape, color, themeMode);\n const strokeWidth = hovered ? 3 : 1;\n\n if (shape === 'square') {\n const size = 7;\n parent\n .append('rect')\n .attr('x', cx - size / 2)\n .attr('y', cy - size / 2)\n .attr('width', size)\n .attr('height', size)\n .attr('fill', fill)\n .attr('stroke', stroke)\n .attr('stroke-width', strokeWidth);\n return;\n }\n\n if (shape === 'rhombus') {\n const size = 9;\n parent\n .append('rect')\n .attr('x', cx - size / 2)\n .attr('y', cy - size / 2)\n .attr('width', size)\n .attr('height', size)\n .attr('fill', fill)\n .attr('stroke', stroke)\n .attr('stroke-width', strokeWidth)\n .attr('transform', `rotate(45, ${cx}, ${cy})`);\n return;\n }\n\n if (shape === 'triangle') {\n const s = 4;\n parent\n .append('polygon')\n .attr(\n 'points',\n `${cx},${cy - s} ${cx - s},${cy + s} ${cx + s},${cy + s}`,\n )\n .attr('fill', fill)\n .attr('stroke', stroke)\n .attr('stroke-width', strokeWidth);\n return;\n }\n\n parent\n .append('circle')\n .attr('cx', cx)\n .attr('cy', cy)\n .attr('r', r)\n .attr('fill', fill)\n .attr('stroke', stroke)\n .attr('stroke-width', strokeWidth);\n}\n\n/**\n * Lollipop head — FuseDash Vertical markers (default = rhombus diamond path).\n */\nexport function appendLollipopMarkerVertical(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n parent: Selection<any, any, any, any>,\n opts: { shape: MarkerShape; color: string; cx: number; cy: number },\n): void {\n const { shape, color, cx, cy } = opts;\n if (shape === 'disabled') return;\n\n if (shape === 'donut') {\n parent\n .append('path')\n .attr(\n 'd',\n `M ${cx}, ${cy - 5} a 5,5 0 1,0 0,10 a 5,5 0 1,0 0,-10 M ${cx}, ${cy - 2} a 2,2 0 1,1 0,4 a 2,2 0 1,1 0,-4`,\n )\n .attr('fill', color)\n .attr('stroke', '#fff')\n .attr('stroke-width', 1);\n parent.append('circle').attr('cx', cx).attr('cy', cy).attr('r', 2).attr('fill', '#fff');\n return;\n }\n\n if (shape === 'circle') {\n parent\n .append('path')\n .attr('d', `M ${cx}, ${cy - 5} a 5,5 0 1,0 0,10 a 5,5 0 1,0 0,-10`)\n .attr('fill', color)\n .attr('stroke', '#fff')\n .attr('stroke-width', 1);\n return;\n }\n\n if (shape === 'square') {\n parent\n .append('path')\n .attr(\n 'd',\n `M${cx - 5}, ${cy + 5} L${cx + 5}, ${cy + 5} L${cx + 5}, ${cy - 5} L${cx - 5}, ${cy - 5} Z`,\n )\n .attr('fill', color)\n .attr('stroke', '#fff')\n .attr('stroke-width', 1);\n return;\n }\n\n if (shape === 'triangle') {\n parent\n .append('path')\n .attr('d', `M${cx}, ${cy - 5} L${cx - 5}, ${cy + 5} L${cx + 5}, ${cy + 5} Z`)\n .attr('fill', color)\n .attr('stroke', '#fff')\n .attr('stroke-width', 1);\n return;\n }\n\n // default / rhombus\n parent\n .append('path')\n .attr(\n 'd',\n `M${cx}, ${cy + 5} L${cx + 5}, ${cy} L${cx}, ${cy - 5} L${cx - 5}, ${cy}Z`,\n )\n .attr('fill', color)\n .attr('stroke', '#fff')\n .attr('stroke-width', 1);\n}\n"],"names":[],"mappings":"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"}
|