@fundar/data-chart-telling 1.1.0 → 1.3.0
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 +45 -0
- package/README.md +8 -7
- package/dist/configuration/config.svelte.d.ts +1 -1
- package/dist/configuration/config.svelte.js +177 -100
- package/dist/configuration/themes/index.d.ts +5 -1428
- package/dist/index.d.ts +23 -14
- package/dist/index.js +20 -11
- package/dist/layout/base/BasePlotLayout.svelte +115 -50
- package/dist/layout/base/BasePlotLayout.svelte.d.ts +1 -38
- package/dist/layout/coordinates/CoordinatesLayout.svelte +42 -40
- package/dist/layout/coordinates/CoordinatesLayout.svelte.d.ts +0 -2
- package/dist/layout/coordinates/ProjectionZoom.svelte +48 -0
- package/dist/layout/coordinates/ProjectionZoom.svelte.d.ts +10 -0
- package/dist/layout/coordinates/ZoomedProjection.d.ts +11 -0
- package/dist/layout/coordinates/ZoomedProjection.js +24 -0
- package/dist/layout/coordinates/camera.svelte.js +11 -8
- package/dist/layout/coordinates/projections/argentina.js +1 -1
- package/dist/layout/coordinates/projections/fit.d.ts +1 -1
- package/dist/layout/coordinates/projections/fit.js +1 -1
- package/dist/layout/coordinates/zoom.svelte.d.ts +4 -5
- package/dist/layout/coordinates/zoom.svelte.js +4 -5
- package/dist/layout/facet/FacetLayout.svelte +1 -1
- package/dist/layout/facet/config.js +1 -1
- package/dist/layout/facet/scope.d.ts +40 -0
- package/dist/layout/facet/scope.js +104 -0
- package/dist/layout/figure/Figure.svelte +2 -0
- package/dist/layout/geometry/GeometryLayout.svelte +14 -9
- package/dist/layout/geometry/GeometryLayout.svelte.d.ts +0 -3
- package/dist/layout/geometry/MarkerOffset.svelte +28 -0
- package/dist/layout/geometry/MarkerOffset.svelte.d.ts +13 -0
- package/dist/layout/grid/GridCell.svelte +6 -8
- package/dist/layout/legend/ContinuousSection.svelte +44 -9
- package/dist/layout/legend/DiscreteBadgeItem.svelte +2 -2
- package/dist/layout/legend/DiscreteSection.svelte +2 -2
- package/dist/layout/legend/DiscreteSymbolIcon.svelte +39 -15
- package/dist/layout/legend/LegendChannels.js +36 -12
- package/dist/layout/legend/LegendLayout.svelte +9 -1
- package/dist/layout/legend/LegendState.svelte.d.ts +4 -0
- package/dist/layout/legend/LegendState.svelte.js +23 -8
- package/dist/layout/legend/SizeSection.svelte +1 -1
- package/dist/layout/margins/PlotMargins.svelte.d.ts +2 -5
- package/dist/layout/margins/PlotMargins.svelte.js +35 -8
- package/dist/layout/plot/Plot.svelte +22 -2
- package/dist/layout/plot/Slice.d.ts +5 -1
- package/dist/layout/plot/Slice.js +14 -4
- package/dist/layout/scales/NiceTicks.d.ts +3 -0
- package/dist/layout/scales/NiceTicks.js +4 -0
- package/dist/layout/scales/ScalesLayout.svelte +93 -7
- package/dist/layout/scales/ScalesLayout.svelte.d.ts +5 -0
- package/dist/layout/scales/SveltePlotScale.d.ts +2 -2
- package/dist/layout/scales/SveltePlotScale.js +13 -6
- package/dist/layout/scales/TickLabels.d.ts +32 -0
- package/dist/layout/scales/TickLabels.js +55 -0
- package/dist/layout/styles/StylesLayout.svelte +2 -2
- package/dist/layout/styles/ValueLabels.d.ts +33 -5
- package/dist/layout/styles/ValueLabels.js +80 -21
- package/dist/layout/timeline/TimelineLayout.svelte +1 -1
- package/dist/layout/tooltip/Tooltip.svelte +4 -4
- package/dist/layout/tooltip/Tooltip.svelte.d.ts +4 -4
- package/dist/layout/tooltip/TooltipState.svelte.js +1 -1
- package/dist/markers/MarkerKinds.d.ts +5 -0
- package/dist/markers/MarkerKinds.js +1 -0
- package/dist/markers/area/AreaMarker.svelte +15 -63
- package/dist/markers/arrow/ArrowMarker.svelte +51 -9
- package/dist/markers/bar/BarMarker.svelte +8 -4
- package/dist/markers/bollinger/BollingerMarker.svelte +33 -18
- package/dist/markers/box/BoxMarker.svelte +40 -9
- package/dist/markers/delta/Delta.d.ts +6 -1
- package/dist/markers/delta/Delta.js +16 -1
- package/dist/markers/delta/DeltaMarker.svelte +9 -87
- package/dist/markers/delta/DeltaPoint.svelte +97 -0
- package/dist/markers/delta/DeltaPoint.svelte.d.ts +29 -0
- package/dist/markers/dot/DotMarker.svelte +24 -27
- package/dist/markers/image/ImageMarker.svelte +17 -12
- package/dist/markers/inset/InsetMarker.svelte +2 -2
- package/dist/markers/line/LineMarker.svelte +1 -0
- package/dist/markers/link/LinkMarker.svelte +174 -29
- package/dist/markers/regression/RegressionMarker.svelte +16 -33
- package/dist/markers/rule/RuleMarker.svelte +14 -5
- package/dist/markers/text/Declutter.d.ts +4 -0
- package/dist/markers/text/Declutter.js +26 -11
- package/dist/markers/text/TextMarker.svelte +91 -48
- package/dist/markers/tick/TickMarker.svelte +27 -25
- package/dist/markers/utils/MarkerChannels.d.ts +24 -0
- package/dist/markers/utils/MarkerChannels.js +42 -7
- package/dist/markers/utils/RowOffset.d.ts +23 -0
- package/dist/markers/utils/RowOffset.js +23 -0
- package/dist/markers/utils/RowOffsetMarks.svelte +30 -0
- package/dist/markers/utils/RowOffsetMarks.svelte.d.ts +33 -0
- package/dist/markers/utils/RowStroke.d.ts +31 -0
- package/dist/markers/utils/RowStroke.js +28 -0
- package/dist/markers/violin/ViolinMarker.svelte +75 -0
- package/dist/markers/violin/ViolinMarker.svelte.d.ts +7 -0
- package/dist/markers/violin/ViolinProfiles.d.ts +29 -0
- package/dist/markers/violin/ViolinProfiles.js +55 -0
- package/dist/markers/waffle/WaffleMarker.svelte +17 -37
- package/dist/phases/Pipeline.d.ts +5 -0
- package/dist/phases/Pipeline.js +5 -0
- package/dist/phases/data/DataPhase.js +3 -3
- package/dist/phases/data/PlotAxes.d.ts +10 -0
- package/dist/phases/data/PlotAxes.js +14 -1
- package/dist/phases/facet/FacetPanels.d.ts +1 -0
- package/dist/phases/facet/FacetPanels.js +1 -0
- package/dist/phases/facet/FacetPhase.d.ts +2 -1
- package/dist/phases/facet/FacetPhase.js +19 -4
- package/dist/phases/mapping/MappingPhase.js +1 -1
- package/dist/phases/markers/MarkersPhase.js +2 -1
- package/dist/phases/scales/CategoryOrder.d.ts +23 -0
- package/dist/phases/scales/CategoryOrder.js +73 -0
- package/dist/phases/scales/ScalesPhase.js +21 -7
- package/dist/phases/sharedScales/SharedScalesPhase.d.ts +3 -2
- package/dist/phases/sharedScales/SharedScalesPhase.js +5 -2
- package/dist/phases/statistics/Statistics.d.ts +10 -6
- package/dist/phases/statistics/Statistics.js +20 -10
- package/dist/phases/statistics/StatisticsPhase.js +16 -3
- package/dist/phases/statistics/methods/BollingerStatistic.d.ts +1 -1
- package/dist/phases/statistics/methods/BollingerStatistic.js +13 -11
- package/dist/phases/statistics/methods/BoxStatistic.d.ts +1 -1
- package/dist/phases/statistics/methods/BoxStatistic.js +14 -12
- package/dist/phases/statistics/methods/Density2dStatistic.d.ts +1 -1
- package/dist/phases/statistics/methods/Density2dStatistic.js +13 -11
- package/dist/phases/statistics/methods/DensityStatistic.d.ts +1 -1
- package/dist/phases/statistics/methods/DensityStatistic.js +11 -9
- package/dist/phases/statistics/methods/DeviationStatistic.d.ts +8 -0
- package/dist/phases/statistics/methods/DeviationStatistic.js +111 -0
- package/dist/phases/statistics/methods/MovingAverageStatistic.d.ts +1 -1
- package/dist/phases/statistics/methods/MovingAverageStatistic.js +11 -9
- package/dist/phases/statistics/methods/RegressionStatistic.d.ts +1 -1
- package/dist/phases/statistics/methods/RegressionStatistic.js +16 -14
- package/dist/phases/transforms/ProcessedPositions.js +1 -1
- package/dist/phases/transforms/TransformsPhase.js +49 -3
- package/dist/phases/transforms/ValueSelection.d.ts +30 -0
- package/dist/phases/transforms/ValueSelection.js +53 -0
- package/dist/plots/{heatmap → correlation/heatmap}/Plot.svelte +5 -2
- package/dist/plots/{heatmap → correlation/heatmap}/Plot.svelte.d.ts +2 -2
- package/dist/plots/{heatmap → correlation/heatmap}/defaults.d.ts +2 -2
- package/dist/plots/{heatmap → correlation/heatmap}/defaults.js +5 -5
- package/dist/plots/{heatmap → correlation/heatmap}/markers.d.ts +4 -4
- package/dist/plots/{heatmap → correlation/heatmap}/markers.js +3 -3
- package/dist/plots/{scatter → correlation/scatter}/Plot.svelte +5 -2
- package/dist/plots/{scatter → correlation/scatter}/Plot.svelte.d.ts +2 -2
- package/dist/plots/{scatter → correlation/scatter}/defaults.d.ts +2 -2
- package/dist/plots/{scatter → correlation/scatter}/defaults.js +4 -4
- package/dist/plots/{scatter → correlation/scatter}/markers.d.ts +4 -4
- package/dist/plots/{scatter → correlation/scatter}/markers.js +3 -3
- package/dist/plots/{box → distribution/box}/BoxSummaries.d.ts +2 -2
- package/dist/plots/{box → distribution/box}/BoxSummaries.js +6 -6
- package/dist/plots/{box → distribution/box}/Plot.svelte +2 -2
- package/dist/plots/{box → distribution/box}/Plot.svelte.d.ts +2 -2
- package/dist/plots/{box → distribution/box}/defaults.d.ts +2 -2
- package/dist/plots/{box → distribution/box}/defaults.js +1 -1
- package/dist/plots/{box → distribution/box}/markers.d.ts +2 -2
- package/dist/plots/distribution/density/Plot.svelte +45 -0
- package/dist/plots/distribution/density/Plot.svelte.d.ts +26 -0
- package/dist/plots/distribution/density/defaults.d.ts +9 -0
- package/dist/plots/distribution/density/defaults.js +29 -0
- package/dist/plots/distribution/density/markers.d.ts +9 -0
- package/dist/plots/distribution/density/markers.js +42 -0
- package/dist/plots/{histogram → distribution/histogram}/Plot.svelte +2 -2
- package/dist/plots/{histogram → distribution/histogram}/Plot.svelte.d.ts +2 -2
- package/dist/plots/{histogram → distribution/histogram}/defaults.d.ts +2 -2
- package/dist/plots/{histogram → distribution/histogram}/defaults.js +3 -3
- package/dist/plots/{histogram → distribution/histogram}/markers.d.ts +3 -3
- package/dist/plots/{histogram → distribution/histogram}/markers.js +5 -5
- package/dist/plots/{pyramid → distribution/pyramid}/Plot.svelte +5 -2
- package/dist/plots/{pyramid → distribution/pyramid}/Plot.svelte.d.ts +2 -2
- package/dist/plots/{pyramid → distribution/pyramid}/defaults.d.ts +2 -2
- package/dist/plots/{pyramid → distribution/pyramid}/defaults.js +6 -6
- package/dist/plots/{pyramid → distribution/pyramid}/markers.d.ts +4 -4
- package/dist/plots/{pyramid → distribution/pyramid}/markers.js +6 -6
- package/dist/plots/distribution/violin/Plot.svelte +45 -0
- package/dist/plots/distribution/violin/Plot.svelte.d.ts +26 -0
- package/dist/plots/distribution/violin/defaults.d.ts +10 -0
- package/dist/plots/distribution/violin/defaults.js +58 -0
- package/dist/plots/distribution/violin/markers.d.ts +10 -0
- package/dist/plots/distribution/violin/markers.js +71 -0
- package/dist/plots/{area → evolution/area}/Plot.svelte +2 -2
- package/dist/plots/{area → evolution/area}/Plot.svelte.d.ts +2 -2
- package/dist/plots/{area → evolution/area}/defaults.d.ts +2 -2
- package/dist/plots/{area → evolution/area}/defaults.js +2 -0
- package/dist/plots/{area → evolution/area}/markers.d.ts +2 -2
- package/dist/plots/{area → evolution/area}/markers.js +1 -1
- package/dist/plots/{line → evolution/line}/Plot.svelte +2 -2
- package/dist/plots/{line → evolution/line}/Plot.svelte.d.ts +2 -2
- package/dist/plots/{line → evolution/line}/defaults.d.ts +2 -2
- package/dist/plots/{line → evolution/line}/defaults.js +2 -0
- package/dist/plots/{line → evolution/line}/markers.d.ts +11 -8
- package/dist/plots/{line → evolution/line}/markers.js +6 -4
- package/dist/plots/evolution/slope/Plot.svelte +42 -0
- package/dist/plots/evolution/slope/Plot.svelte.d.ts +26 -0
- package/dist/plots/evolution/slope/defaults.d.ts +8 -0
- package/dist/plots/evolution/slope/defaults.js +31 -0
- package/dist/plots/evolution/slope/markers.d.ts +16 -0
- package/dist/plots/evolution/slope/markers.js +79 -0
- package/dist/plots/evolution/sparkline/Plot.svelte +45 -0
- package/dist/plots/evolution/sparkline/Plot.svelte.d.ts +26 -0
- package/dist/plots/evolution/sparkline/defaults.d.ts +7 -0
- package/dist/plots/evolution/sparkline/defaults.js +23 -0
- package/dist/plots/evolution/sparkline/markers.d.ts +7 -0
- package/dist/plots/evolution/sparkline/markers.js +56 -0
- package/dist/plots/{geo → map/geo}/Core.svelte +11 -10
- package/dist/plots/{geo → map/geo}/Core.svelte.d.ts +1 -1
- package/dist/plots/map/geo/GeoFeatures.svelte.d.ts +9 -0
- package/dist/plots/map/geo/GeoFeatures.svelte.js +55 -0
- package/dist/plots/map/geo/GeoGeometry.d.ts +27 -0
- package/dist/plots/map/geo/GeoGeometry.js +142 -0
- package/dist/plots/map/geo/GeoSegments.d.ts +16 -0
- package/dist/plots/map/geo/GeoSegments.js +23 -0
- package/dist/plots/{geo → map/geo}/Plot.svelte +10 -10
- package/dist/plots/{geo → map/geo}/Plot.svelte.d.ts +2 -2
- package/dist/plots/{geo → map/geo}/defaults.d.ts +2 -2
- package/dist/plots/{geo → map/geo}/defaults.js +1 -1
- package/dist/plots/{geo → map/geo}/phases/data.d.ts +1 -1
- package/dist/plots/{geo → map/geo}/phases/data.js +7 -6
- package/dist/plots/{geo → map/geo}/phases/hover.d.ts +1 -1
- package/dist/plots/{geo → map/geo}/phases/hover.js +2 -2
- package/dist/plots/{geo → map/geo}/phases/markers.d.ts +1 -1
- package/dist/plots/{geo → map/geo}/phases/markers.js +6 -10
- package/dist/plots/{geo → map/geo}/phases/scales.d.ts +2 -2
- package/dist/plots/{geo → map/geo}/phases/scales.js +28 -12
- package/dist/plots/{geo → map/geo}/phases/tooltip.d.ts +1 -1
- package/dist/plots/map/geo/phases/tooltip.js +5 -0
- package/dist/plots/{geo → map/geo}/slices.d.ts +2 -2
- package/dist/plots/{geo → map/geo}/slices.js +2 -2
- package/dist/plots/{bar → ranking/bar}/Plot.svelte +2 -2
- package/dist/plots/{bar → ranking/bar}/Plot.svelte.d.ts +2 -2
- package/dist/plots/ranking/bar/defaults.d.ts +16 -0
- package/dist/plots/{bar → ranking/bar}/defaults.js +15 -9
- package/dist/plots/{bar → ranking/bar}/markers.d.ts +8 -8
- package/dist/plots/{bar → ranking/bar}/markers.js +8 -17
- package/dist/plots/ranking/bullet/Plot.svelte +42 -0
- package/dist/plots/ranking/bullet/Plot.svelte.d.ts +26 -0
- package/dist/plots/ranking/bullet/defaults.d.ts +8 -0
- package/dist/plots/ranking/bullet/defaults.js +24 -0
- package/dist/plots/ranking/bullet/markers.d.ts +10 -0
- package/dist/plots/ranking/bullet/markers.js +90 -0
- package/dist/plots/ranking/cleveland/ClevelandConnector.d.ts +48 -0
- package/dist/plots/ranking/cleveland/ClevelandConnector.js +140 -0
- package/dist/plots/ranking/cleveland/ClevelandMarkers.d.ts +33 -0
- package/dist/plots/ranking/cleveland/ClevelandMarkers.js +375 -0
- package/dist/plots/ranking/cleveland/ClevelandRanges.d.ts +31 -0
- package/dist/plots/ranking/cleveland/ClevelandRanges.js +116 -0
- package/dist/plots/ranking/cleveland/Plot.svelte +45 -0
- package/dist/plots/ranking/cleveland/Plot.svelte.d.ts +26 -0
- package/dist/plots/ranking/cleveland/defaults.d.ts +13 -0
- package/dist/plots/ranking/cleveland/defaults.js +66 -0
- package/dist/plots/ranking/dumbbell/Plot.svelte +45 -0
- package/dist/plots/ranking/dumbbell/Plot.svelte.d.ts +26 -0
- package/dist/plots/ranking/dumbbell/defaults.d.ts +9 -0
- package/dist/plots/ranking/dumbbell/defaults.js +19 -0
- package/dist/plots/ranking/forest/Plot.svelte +42 -0
- package/dist/plots/ranking/forest/Plot.svelte.d.ts +26 -0
- package/dist/plots/ranking/forest/defaults.d.ts +11 -0
- package/dist/plots/ranking/forest/defaults.js +20 -0
- package/dist/plots/ranking/lollipop/Plot.svelte +45 -0
- package/dist/plots/ranking/lollipop/Plot.svelte.d.ts +26 -0
- package/dist/plots/ranking/lollipop/defaults.d.ts +9 -0
- package/dist/plots/ranking/lollipop/defaults.js +18 -0
- package/dist/plots/utils/RowNumbers.d.ts +16 -0
- package/dist/plots/utils/RowNumbers.js +24 -0
- package/dist/plots/utils/gaps.js +1 -1
- package/dist/plots/utils/segments.d.ts +4 -1
- package/dist/plots/utils/segments.js +20 -7
- package/dist/types/configuration/styling.d.ts +284 -143
- package/dist/types/layout/coordinates.d.ts +5 -4
- package/dist/types/layout/facet.d.ts +18 -0
- package/dist/types/layout/legend.d.ts +23 -5
- package/dist/types/layout/plot.d.ts +46 -1
- package/dist/types/layout/scales.d.ts +39 -7
- package/dist/types/layout/statistics/deviation.d.ts +40 -0
- package/dist/types/layout/statistics/index.d.ts +7 -2
- package/dist/types/layout/styles/base.d.ts +18 -0
- package/dist/types/layout/styles/bullet.d.ts +25 -0
- package/dist/types/layout/styles/connector.d.ts +98 -0
- package/dist/types/layout/styles/curve.d.ts +11 -0
- package/dist/types/layout/styles/frame.d.ts +17 -0
- package/dist/types/layout/styles/gaps.d.ts +12 -0
- package/dist/types/layout/styles/geo.d.ts +55 -0
- package/dist/types/layout/styles/index.d.ts +8 -0
- package/dist/types/layout/styles/index.js +8 -0
- package/dist/types/layout/styles/values.d.ts +47 -0
- package/dist/types/layout/timeline.d.ts +5 -2
- package/dist/types/layout/tooltip.d.ts +6 -2
- package/dist/types/markers/axis/area.d.ts +2 -2
- package/dist/types/markers/axis/arrow.d.ts +3 -0
- package/dist/types/markers/axis/axisBasedMarkersConfig.d.ts +2 -1
- package/dist/types/markers/axis/bar.d.ts +1 -1
- package/dist/types/markers/axis/box.d.ts +5 -0
- package/dist/types/markers/axis/delta.d.ts +15 -2
- package/dist/types/markers/axis/difference.d.ts +2 -2
- package/dist/types/markers/axis/image.d.ts +3 -2
- package/dist/types/markers/axis/line.d.ts +2 -0
- package/dist/types/markers/axis/rule.d.ts +18 -2
- package/dist/types/markers/axis/trail.d.ts +2 -3
- package/dist/types/markers/axis/violin.d.ts +25 -0
- package/dist/types/markers/basic/dot.d.ts +3 -2
- package/dist/types/markers/basic/text.d.ts +13 -3
- package/dist/types/markers/channels/commonMarkerConfig.d.ts +7 -3
- package/dist/types/markers/channels/commonMarkerConfigWithRowOffset.d.ts +13 -0
- package/dist/types/markers/common.d.ts +1 -1
- package/dist/types/markers/common.js +1 -0
- package/dist/types/markers/geo/link.d.ts +5 -1
- package/dist/types/phases/facet/phase.d.ts +4 -0
- package/dist/types/phases/index.d.ts +1 -1
- package/dist/types/phases/scales/phase.d.ts +5 -1
- package/dist/types/phases/state.d.ts +15 -2
- package/dist/types/phases/statistics/source.d.ts +3 -1
- package/dist/types/phases/transforms/phase.d.ts +22 -0
- package/dist/types/plots/{heatmap → correlation/heatmap}/props.d.ts +6 -6
- package/dist/types/plots/{heatmap → correlation/heatmap}/state.d.ts +4 -4
- package/dist/types/plots/{scatter → correlation/scatter}/props.d.ts +6 -6
- package/dist/types/plots/{scatter → correlation/scatter}/state.d.ts +2 -2
- package/dist/types/plots/{box → distribution/box}/props.d.ts +6 -6
- package/dist/types/plots/{box → distribution/box}/state.d.ts +3 -3
- package/dist/types/plots/distribution/density/props.d.ts +23 -0
- package/dist/types/plots/distribution/density/state.d.ts +6 -0
- package/dist/types/plots/{histogram → distribution/histogram}/props.d.ts +7 -7
- package/dist/types/plots/{histogram → distribution/histogram}/state.d.ts +2 -2
- package/dist/types/plots/distribution/histogram/state.js +1 -0
- package/dist/types/plots/{pyramid → distribution/pyramid}/props.d.ts +6 -6
- package/dist/types/plots/distribution/pyramid/props.js +1 -0
- package/dist/types/plots/{pyramid → distribution/pyramid}/state.d.ts +3 -3
- package/dist/types/plots/distribution/pyramid/state.js +1 -0
- package/dist/types/plots/distribution/violin/props.d.ts +23 -0
- package/dist/types/plots/distribution/violin/props.js +1 -0
- package/dist/types/plots/distribution/violin/state.d.ts +6 -0
- package/dist/types/plots/distribution/violin/state.js +1 -0
- package/dist/types/plots/{area → evolution/area}/props.d.ts +6 -6
- package/dist/types/plots/evolution/area/props.js +1 -0
- package/dist/types/plots/{area → evolution/area}/state.d.ts +2 -2
- package/dist/types/plots/evolution/area/state.js +1 -0
- package/dist/types/plots/evolution/line/props.d.ts +10 -0
- package/dist/types/plots/evolution/line/props.js +1 -0
- package/dist/types/plots/{line → evolution/line}/state.d.ts +3 -3
- package/dist/types/plots/evolution/line/state.js +1 -0
- package/dist/types/plots/evolution/slope/props.d.ts +5 -0
- package/dist/types/plots/evolution/slope/props.js +1 -0
- package/dist/types/plots/evolution/slope/state.d.ts +5 -0
- package/dist/types/plots/evolution/slope/state.js +1 -0
- package/dist/types/plots/evolution/sparkline/props.d.ts +5 -0
- package/dist/types/plots/evolution/sparkline/props.js +1 -0
- package/dist/types/plots/evolution/sparkline/state.d.ts +5 -0
- package/dist/types/plots/evolution/sparkline/state.js +1 -0
- package/dist/types/plots/{geo → map/geo}/props.d.ts +8 -8
- package/dist/types/plots/map/geo/props.js +1 -0
- package/dist/types/plots/{geo → map/geo}/state.d.ts +18 -11
- package/dist/types/plots/map/geo/state.js +1 -0
- package/dist/types/plots/props.d.ts +7 -4
- package/dist/types/plots/{bar → ranking/bar}/props.d.ts +6 -6
- package/dist/types/plots/ranking/bar/props.js +1 -0
- package/dist/types/plots/{bar → ranking/bar}/state.d.ts +2 -2
- package/dist/types/plots/ranking/bar/state.js +1 -0
- package/dist/types/plots/ranking/bullet/props.d.ts +22 -0
- package/dist/types/plots/ranking/bullet/props.js +1 -0
- package/dist/types/plots/ranking/bullet/state.d.ts +5 -0
- package/dist/types/plots/ranking/bullet/state.js +1 -0
- package/dist/types/plots/ranking/cleveland/props.d.ts +10 -0
- package/dist/types/plots/ranking/cleveland/props.js +1 -0
- package/dist/types/plots/ranking/cleveland/state.d.ts +49 -0
- package/dist/types/plots/ranking/cleveland/state.js +1 -0
- package/dist/types/plots/ranking/dumbbell/props.d.ts +10 -0
- package/dist/types/plots/ranking/dumbbell/props.js +1 -0
- package/dist/types/plots/ranking/dumbbell/state.d.ts +5 -0
- package/dist/types/plots/ranking/dumbbell/state.js +1 -0
- package/dist/types/plots/ranking/forest/props.d.ts +23 -0
- package/dist/types/plots/ranking/forest/props.js +1 -0
- package/dist/types/plots/ranking/forest/state.d.ts +5 -0
- package/dist/types/plots/ranking/forest/state.js +1 -0
- package/dist/types/plots/ranking/lollipop/props.d.ts +10 -0
- package/dist/types/plots/ranking/lollipop/props.js +1 -0
- package/dist/types/plots/ranking/lollipop/state.d.ts +5 -0
- package/dist/types/plots/ranking/lollipop/state.js +1 -0
- package/dist/types/plots/segments/common.d.ts +4 -1
- package/dist/types/plots/segments/config.d.ts +4 -2
- package/dist/utils/OpacityScale.d.ts +14 -0
- package/dist/utils/OpacityScale.js +43 -0
- package/dist/utils/{symbol.d.ts → SymbolPath.d.ts} +0 -12
- package/dist/utils/{symbol.js → SymbolPath.js} +0 -24
- package/dist/utils/SymbolScale.d.ts +18 -0
- package/dist/utils/SymbolScale.js +29 -0
- package/dist/utils/color/ColorRamp.d.ts +27 -0
- package/dist/utils/color/ColorRamp.js +120 -0
- package/dist/utils/color/CssColor.d.ts +19 -0
- package/dist/utils/color/CssColor.js +114 -0
- package/dist/utils/color/Palette.d.ts +21 -0
- package/dist/utils/color/Palette.js +52 -0
- package/dist/utils/color/index.d.ts +11 -3
- package/dist/utils/color/index.js +14 -3
- package/dist/utils/grouping.js +1 -1
- package/docs/architecture.md +1 -1
- package/docs/chrome.md +2 -2
- package/docs/composer.md +2 -2
- package/docs/concepts.md +1 -1
- package/docs/development.md +1 -1
- package/docs/facets.md +50 -3
- package/docs/getting-started.md +2 -2
- package/docs/legend.md +13 -11
- package/docs/markers.md +57 -27
- package/docs/plots/correlation/heatmap.md +26 -0
- package/docs/plots/correlation/scatter.md +35 -0
- package/docs/plots/distribution/box.md +28 -0
- package/docs/plots/distribution/density.md +26 -0
- package/docs/plots/distribution/histogram.md +33 -0
- package/docs/plots/distribution/pyramid.md +31 -0
- package/docs/plots/distribution/violin.md +35 -0
- package/docs/plots/evolution/area.md +32 -0
- package/docs/plots/evolution/line.md +93 -0
- package/docs/plots/evolution/slope.md +39 -0
- package/docs/plots/evolution/sparkline.md +34 -0
- package/docs/plots/ranking/bar.md +59 -0
- package/docs/plots/ranking/bullet.md +37 -0
- package/docs/plots/ranking/cleveland.md +54 -0
- package/docs/plots/ranking/dumbbell.md +39 -0
- package/docs/plots/ranking/forest.md +40 -0
- package/docs/plots/ranking/lollipop.md +39 -0
- package/docs/plots.md +22 -280
- package/docs/scales.md +30 -24
- package/docs/styles-and-segments.md +25 -21
- package/docs/theming.md +23 -20
- package/docs/timeline.md +3 -3
- package/docs/tooltip-and-hover.md +10 -10
- package/docs/transforms-and-statistics.md +13 -12
- package/examples/BarValues.svelte +1 -1
- package/examples/Box.svelte +1 -1
- package/examples/Bullet.svelte +17 -0
- package/examples/Chrome.svelte +1 -1
- package/examples/ChromeOrder.svelte +1 -1
- package/examples/Cleveland.svelte +15 -0
- package/examples/Composer.svelte +2 -2
- package/examples/CustomTooltip.svelte +1 -1
- package/examples/Density.svelte +7 -0
- package/examples/Dumbbell.svelte +16 -0
- package/examples/Facets.svelte +1 -1
- package/examples/FacetsCarousel.svelte +1 -1
- package/examples/FacetsRowsCols.svelte +1 -1
- package/examples/FacetsScoped.svelte +26 -0
- package/examples/FirstPlot.svelte +1 -1
- package/examples/Forest.svelte +17 -0
- package/examples/Gaps.svelte +2 -2
- package/examples/GroupedBars.svelte +1 -1
- package/examples/Heatmap.svelte +3 -3
- package/examples/HeatmapSegments.svelte +8 -8
- package/examples/Histogram.svelte +1 -1
- package/examples/HorizontalBars.svelte +1 -1
- package/examples/LegendSections.svelte +1 -1
- package/examples/LegendToggle.svelte +1 -1
- package/examples/LineByRegion.svelte +1 -1
- package/examples/LineDates.svelte +1 -1
- package/examples/LineStep.svelte +16 -0
- package/examples/LineStepSegment.svelte +18 -0
- package/examples/Lollipop.svelte +17 -0
- package/examples/Markers.svelte +1 -1
- package/examples/MovingAverage.svelte +1 -1
- package/examples/Pyramid.svelte +9 -2
- package/examples/Regression.svelte +2 -2
- package/examples/ResponsiveLine.svelte +1 -1
- package/examples/Scales.svelte +1 -1
- package/examples/Scatter.svelte +2 -2
- package/examples/SegmentHighlight.svelte +1 -1
- package/examples/Segments.svelte +1 -1
- package/examples/SegmentsBySeries.svelte +1 -1
- package/examples/Slope.svelte +17 -0
- package/examples/Sparkline.svelte +14 -0
- package/examples/StackedArea.svelte +1 -1
- package/examples/StackedBars.svelte +1 -1
- package/examples/TimelinePlayer.svelte +1 -1
- package/examples/TimelineRule.svelte +1 -1
- package/examples/Tooltip.svelte +1 -1
- package/examples/ValueLabels.svelte +1 -1
- package/examples/Violin.svelte +14 -0
- package/examples/datasets/argentina-chile-trends.ts +34 -0
- package/examples/datasets/commodity-prices.ts +48 -0
- package/examples/datasets/countries-over-time.ts +368 -0
- package/examples/datasets/daily-temperature.ts +121 -0
- package/examples/datasets/earthquakes.ts +977 -0
- package/examples/datasets/flight-routes.ts +29 -0
- package/examples/datasets/height-density.ts +37 -0
- package/examples/datasets/heights.ts +370 -0
- package/examples/datasets/index.ts +24 -0
- package/examples/datasets/inflation-by-region.ts +44 -0
- package/examples/datasets/inflation-ranges.ts +34 -0
- package/examples/datasets/iris-flower.ts +207 -0
- package/examples/datasets/life-expectancy.ts +95 -0
- package/examples/datasets/napoleons-march.ts +182 -0
- package/examples/datasets/penguins.ts +54 -0
- package/examples/datasets/population-by-age-with-gaps.ts +23 -0
- package/examples/datasets/population-by-age.ts +890 -0
- package/examples/datasets/province-population.ts +521 -0
- package/examples/datasets/stock-prices.ts +63 -0
- package/examples/datasets/weather-stations-over-time.ts +31 -0
- package/examples/datasets/weather-stations.ts +22 -0
- package/examples/datasets/wind-vectors.ts +30 -0
- package/examples/datasets/world-temperature.ts +400 -0
- package/llms-full.txt +27 -14
- package/llms.txt +33 -4
- package/package.json +10 -1
- package/dist/plots/bar/defaults.d.ts +0 -9
- package/dist/plots/geo/features.svelte.d.ts +0 -5
- package/dist/plots/geo/features.svelte.js +0 -44
- package/dist/plots/geo/phases/tooltip.js +0 -5
- package/dist/plots/utils/geoAccessors.d.ts +0 -72
- package/dist/plots/utils/geoAccessors.js +0 -220
- package/dist/plots/utils/geoSegments.d.ts +0 -29
- package/dist/plots/utils/geoSegments.js +0 -37
- package/dist/types/layout/styles.d.ts +0 -122
- package/dist/types/markers/axis/curveName.d.ts +0 -2
- package/dist/types/plots/line/props.d.ts +0 -10
- package/dist/utils/color/contrast.d.ts +0 -9
- package/dist/utils/color/contrast.js +0 -40
- package/dist/utils/color/cssColor.d.ts +0 -4
- package/dist/utils/color/cssColor.js +0 -77
- package/dist/utils/color/ramp.d.ts +0 -17
- package/dist/utils/color/ramp.js +0 -110
- package/dist/utils/opacity.d.ts +0 -9
- package/dist/utils/opacity.js +0 -38
- package/examples/data.ts +0 -324
- /package/dist/plots/{box → distribution/box}/markers.js +0 -0
- /package/dist/types/layout/{styles.js → statistics/deviation.js} +0 -0
- /package/dist/types/{markers/axis/curveName.js → layout/styles/base.js} +0 -0
- /package/dist/types/{plots/area/props.js → layout/styles/bullet.js} +0 -0
- /package/dist/types/{plots/area/state.js → layout/styles/connector.js} +0 -0
- /package/dist/types/{plots/bar/props.js → layout/styles/curve.js} +0 -0
- /package/dist/types/{plots/bar/state.js → layout/styles/frame.js} +0 -0
- /package/dist/types/{plots/box/props.js → layout/styles/gaps.js} +0 -0
- /package/dist/types/{plots/box/state.js → layout/styles/geo.js} +0 -0
- /package/dist/types/{plots/geo/props.js → layout/styles/values.js} +0 -0
- /package/dist/types/{plots/geo/state.js → markers/axis/violin.js} +0 -0
- /package/dist/types/{plots/heatmap/props.js → markers/channels/commonMarkerConfigWithRowOffset.js} +0 -0
- /package/dist/types/plots/{histogram → correlation/heatmap}/props.js +0 -0
- /package/dist/types/plots/{heatmap → correlation/heatmap}/state.js +0 -0
- /package/dist/types/plots/{line → correlation/scatter}/props.js +0 -0
- /package/dist/types/plots/{histogram → correlation/scatter}/state.js +0 -0
- /package/dist/types/plots/{pyramid → distribution/box}/props.js +0 -0
- /package/dist/types/plots/{line → distribution/box}/state.js +0 -0
- /package/dist/types/plots/{scatter → distribution/density}/props.js +0 -0
- /package/dist/types/plots/{pyramid → distribution/density}/state.js +0 -0
- /package/dist/types/plots/{scatter/state.js → distribution/histogram/props.js} +0 -0
- /package/dist/{plots/utils → utils}/accessors.d.ts +0 -0
- /package/dist/{plots/utils → utils}/accessors.js +0 -0
|
@@ -1,23 +1,43 @@
|
|
|
1
1
|
<script lang="ts">
|
|
2
|
+
import { getConfiguration } from '../../configuration/config.svelte';
|
|
2
3
|
import type { LegendItem } from '../../types/layout/legend';
|
|
3
|
-
import type { LineStyle } from '../../types/plots/constants';
|
|
4
|
-
import { SymbolPath } from '../../utils/
|
|
4
|
+
import type { LineStyle, SymbolType } from '../../types/plots/constants';
|
|
5
|
+
import { SymbolPath } from '../../utils/SymbolPath';
|
|
5
6
|
|
|
6
7
|
/**
|
|
7
8
|
* The series' symbol/line-style icon, shared by both discrete item looks
|
|
8
9
|
* (`DiscreteSwatchItem` and `DiscreteBadgeItem`) so the two stay in sync.
|
|
9
10
|
* `color` is caller-supplied rather than read off `item` - the swatch look
|
|
10
11
|
* fills it with the series color, the badge look with its own label color.
|
|
11
|
-
*
|
|
12
|
+
* The shape is the item's own `symbol`, or the one `legend.icon.marks` gives
|
|
13
|
+
* the way it draws. A shape draws as the plot's dot does, fitted to the icon;
|
|
14
|
+
* `legend.icon.rounded` softens its corners.
|
|
12
15
|
*/
|
|
13
16
|
let { item, color }: { item: LegendItem; color: string } = $props();
|
|
14
17
|
|
|
18
|
+
const cfg = $derived(getConfiguration());
|
|
19
|
+
const icon = $derived(cfg.legend.icon);
|
|
20
|
+
const shape = $derived<SymbolType>(
|
|
21
|
+
item.symbol ?? (item.mark ? icon.marks[item.mark] : undefined) ?? 'square'
|
|
22
|
+
);
|
|
23
|
+
const rounded = $derived(icon.rounded);
|
|
15
24
|
const filled = $derived(item.filled ?? true);
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
25
|
+
// A rounded filled shape grows a same-colored stroke with round joins, so it is drawn smaller by that much.
|
|
26
|
+
const paint = $derived<Record<string, string | number>>(
|
|
27
|
+
!filled
|
|
28
|
+
? {
|
|
29
|
+
fill: 'none',
|
|
30
|
+
stroke: color,
|
|
31
|
+
'stroke-width': 1.5,
|
|
32
|
+
...(rounded ? { 'stroke-linejoin': 'round' } : {}),
|
|
33
|
+
'vector-effect': 'non-scaling-stroke'
|
|
34
|
+
}
|
|
35
|
+
: rounded
|
|
36
|
+
? { fill: color, stroke: color, 'stroke-width': 1.5, 'stroke-linejoin': 'round' }
|
|
37
|
+
: { fill: color }
|
|
20
38
|
);
|
|
39
|
+
const size = $derived(filled ? (rounded ? 6.5 : 8) : 7);
|
|
40
|
+
const offset = $derived(!filled ? 1.5 : rounded ? 1.75 : 1);
|
|
21
41
|
|
|
22
42
|
function dashArray(style?: LineStyle): string | undefined {
|
|
23
43
|
switch (style) {
|
|
@@ -34,13 +54,7 @@
|
|
|
34
54
|
</script>
|
|
35
55
|
|
|
36
56
|
<svg class="dct-discrete__swatch" viewBox="0 0 15 10">
|
|
37
|
-
{#if
|
|
38
|
-
<path
|
|
39
|
-
d={SymbolPath.fitted(item.symbol, filled ? 8 : 7)}
|
|
40
|
-
transform={filled ? 'translate(1,1)' : 'translate(1.5,1.5)'}
|
|
41
|
-
{...paint}
|
|
42
|
-
/>
|
|
43
|
-
{:else if item.symbol === 'line'}
|
|
57
|
+
{#if shape === 'line'}
|
|
44
58
|
<line
|
|
45
59
|
x1="2"
|
|
46
60
|
y1="5"
|
|
@@ -51,8 +65,18 @@
|
|
|
51
65
|
stroke-linecap="round"
|
|
52
66
|
stroke-dasharray={dashArray(item.lineStyle)}
|
|
53
67
|
/>
|
|
54
|
-
{:else}
|
|
68
|
+
{:else if rounded && filled && shape === 'square'}
|
|
69
|
+
<rect x="1" y="1" width="8" height="8" rx="2" fill={color} />
|
|
70
|
+
{:else if rounded && filled && shape === 'triangle'}
|
|
71
|
+
<path
|
|
72
|
+
d="M 6 2 L 9 7.5 A 1.5 1.5 0 0 1 7.8 10 L 2.2 10 A 1.5 1.5 0 0 1 1 7.5 L 4 2 A 1.5 1.5 0 0 1 6 2"
|
|
73
|
+
fill={color}
|
|
74
|
+
transform="translate(0,-1)"
|
|
75
|
+
/>
|
|
76
|
+
{:else if shape === 'square' && filled && !rounded}
|
|
55
77
|
<rect x="1" y="1" width="8" height="8" fill={color} />
|
|
78
|
+
{:else}
|
|
79
|
+
<path d={SymbolPath.fitted(shape, size)} transform="translate({offset},{offset})" {...paint} />
|
|
56
80
|
{/if}
|
|
57
81
|
</svg>
|
|
58
82
|
|
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
import { resolveAccessor } from '../../
|
|
1
|
+
import { resolveAccessor } from '../../utils/accessors';
|
|
2
2
|
import { getConfiguration } from '../../configuration/config.svelte';
|
|
3
3
|
import { ChannelName } from '../../plots/utils/ChannelName';
|
|
4
4
|
import { MarkerKinds } from '../../markers/MarkerKinds';
|
|
5
5
|
import { ContinuousDomain } from '../../utils/ContinuousDomain';
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
8
|
-
import {
|
|
6
|
+
import { ColorRamp } from '../../utils/color';
|
|
7
|
+
import { OpacityScale } from '../../utils/OpacityScale';
|
|
8
|
+
import { SymbolScale } from '../../utils/SymbolScale';
|
|
9
9
|
/**
|
|
10
10
|
* What a plot's value channels - `color`, `opacity`, `r` and `symbol` - draw
|
|
11
11
|
* with, as legend entries: the plot's own (a heatmap's cells, a map's
|
|
@@ -17,6 +17,7 @@ export class LegendChannels {
|
|
|
17
17
|
const taken = new Set((plot.resolvedSeries ?? []).map((s) => s.name));
|
|
18
18
|
return [
|
|
19
19
|
...LegendChannels.#plotColor(plot),
|
|
20
|
+
...LegendChannels.#segmentColors(plot),
|
|
20
21
|
...markers.flatMap((marker) => LegendChannels.#markerColor(marker, taken)),
|
|
21
22
|
...LegendChannels.#plotOpacity(plot),
|
|
22
23
|
...markers.flatMap((marker) => LegendChannels.#markerOpacity(marker, plot)),
|
|
@@ -45,6 +46,15 @@ export class LegendChannels {
|
|
|
45
46
|
static #title(channel, property) {
|
|
46
47
|
return typeof channel === 'string' ? channel : ChannelName.of(channel, property);
|
|
47
48
|
}
|
|
49
|
+
/** The domain svelteplot sizes with: the configured one or the values' own, taken down to 0 unless `zero` is off. */
|
|
50
|
+
static #sizeDomain(scale, values) {
|
|
51
|
+
const [low, high] = scale?.domain ?? [Math.min(...values), Math.max(...values)];
|
|
52
|
+
return scale?.zero === false ? [low, high] : [Math.min(0, low), Math.max(0, high)];
|
|
53
|
+
}
|
|
54
|
+
/** A plot channel's name: its field key, or the name of the function that computes it. */
|
|
55
|
+
static #sourceTitle(source, property) {
|
|
56
|
+
return typeof source === 'string' ? source : ChannelName.of(source, property);
|
|
57
|
+
}
|
|
48
58
|
/** `marker`'s rows read through `channel` (a field or a function), without the missing and non-finite ones. */
|
|
49
59
|
static #values(marker, channel) {
|
|
50
60
|
if (channel === undefined || channel === null || typeof channel === 'number')
|
|
@@ -102,6 +112,11 @@ export class LegendChannels {
|
|
|
102
112
|
LegendChannels.#scaleEntry(typeof source === 'string' ? source : undefined, domain, scale)
|
|
103
113
|
];
|
|
104
114
|
}
|
|
115
|
+
/** One continuous ramp per segment that sets its own, over the values of just its own features. */
|
|
116
|
+
static #segmentColors(plot) {
|
|
117
|
+
const source = plot.channels?.color?.source;
|
|
118
|
+
return (plot.colorRamps ?? []).map(({ name, domain, scale }) => LegendChannels.#scaleEntry(typeof source === 'string' ? `${source} (${name})` : name, domain, scale));
|
|
119
|
+
}
|
|
105
120
|
/**
|
|
106
121
|
* A marker's `color` channel: a continuous scale for numbers; for
|
|
107
122
|
* categories, one item each in the color the marker draws it, unless a
|
|
@@ -118,7 +133,7 @@ export class LegendChannels {
|
|
|
118
133
|
return domain ? [LegendChannels.#scaleEntry(title, domain, scale)] : [];
|
|
119
134
|
}
|
|
120
135
|
const categories = [...new Set(values.map(String))];
|
|
121
|
-
const colorOf =
|
|
136
|
+
const colorOf = ColorRamp.resolve(scale, categories, getConfiguration().palette);
|
|
122
137
|
const mark = MarkerKinds.of(marker.type)?.legendSymbol;
|
|
123
138
|
return categories
|
|
124
139
|
.filter((name) => !taken.has(name))
|
|
@@ -127,7 +142,7 @@ export class LegendChannels {
|
|
|
127
142
|
static #opacityEntry(title, domain, scale, color) {
|
|
128
143
|
if (scale?.range !== undefined && !Array.isArray(scale.range))
|
|
129
144
|
return [];
|
|
130
|
-
const read =
|
|
145
|
+
const read = OpacityScale.resolve(scale, domain, getConfiguration().continuous.opacityRange);
|
|
131
146
|
return [
|
|
132
147
|
{
|
|
133
148
|
type: 'opacity',
|
|
@@ -141,13 +156,20 @@ export class LegendChannels {
|
|
|
141
156
|
}
|
|
142
157
|
];
|
|
143
158
|
}
|
|
144
|
-
/**
|
|
159
|
+
/**
|
|
160
|
+
* The plot's own numeric `opacity` channel, over the `opacityDomain` it hands
|
|
161
|
+
* over, in its series' color - unless a `color` channel colors the marks, and
|
|
162
|
+
* no one color stands for them.
|
|
163
|
+
*/
|
|
145
164
|
static #plotOpacity(plot) {
|
|
146
165
|
if (!plot.opacityDomain)
|
|
147
166
|
return [];
|
|
148
167
|
const source = plot.channels?.opacity?.source;
|
|
149
168
|
const name = plot.resolvedSeries?.[0]?.name;
|
|
150
|
-
const
|
|
169
|
+
const colored = plot.channels?.color?.source !== undefined || !!plot.colorDomain;
|
|
170
|
+
const color = !colored && name !== undefined && name !== 'default'
|
|
171
|
+
? plot.colorForSeries?.(name)
|
|
172
|
+
: undefined;
|
|
151
173
|
return LegendChannels.#opacityEntry(typeof source === 'string' ? source : undefined, plot.opacityDomain, plot.scales?.opacity, color);
|
|
152
174
|
}
|
|
153
175
|
/** A marker's numeric `opacity` channel, in the color the marker draws. */
|
|
@@ -176,13 +198,14 @@ export class LegendChannels {
|
|
|
176
198
|
if (values.length === 0)
|
|
177
199
|
return [];
|
|
178
200
|
const { filled, color, symbol } = LegendChannels.look(sized);
|
|
179
|
-
const source = plot.channels?.r?.source
|
|
201
|
+
const source = LegendChannels.#sourceTitle(plot.channels?.r?.source, 'r') ??
|
|
202
|
+
LegendChannels.#title(sized[0].r, 'r');
|
|
180
203
|
return [
|
|
181
204
|
{
|
|
182
205
|
type: 'size',
|
|
183
206
|
channel: 'r',
|
|
184
207
|
...(typeof source === 'string' ? { title: source } : {}),
|
|
185
|
-
domain: plot.scales?.r
|
|
208
|
+
domain: LegendChannels.#sizeDomain(plot.scales?.r, values),
|
|
186
209
|
range: plot.scales?.r?.range ?? [0, 10],
|
|
187
210
|
...(color ? { color } : {}),
|
|
188
211
|
filled,
|
|
@@ -204,9 +227,10 @@ export class LegendChannels {
|
|
|
204
227
|
shaped.flatMap((marker) => LegendChannels.#values(marker, marker.symbol).map(String))).filter((value, i, all) => all.indexOf(value) === i);
|
|
205
228
|
if (domain.length === 0)
|
|
206
229
|
return [];
|
|
207
|
-
const shapeOf =
|
|
230
|
+
const shapeOf = SymbolScale.resolve(config, domain, getConfiguration().symbols);
|
|
208
231
|
const { filled, color } = LegendChannels.look(shaped);
|
|
209
|
-
const source = plot.channels?.symbol?.source
|
|
232
|
+
const source = LegendChannels.#sourceTitle(plot.channels?.symbol?.source, 'symbol') ??
|
|
233
|
+
LegendChannels.#title(shaped[0].symbol, 'symbol');
|
|
210
234
|
return [
|
|
211
235
|
{
|
|
212
236
|
type: 'symbol',
|
|
@@ -15,10 +15,18 @@
|
|
|
15
15
|
const defaultItemsLayout = $derived<LegendItemsLayout>(
|
|
16
16
|
sections.length === 1 ? { type: 'horizontal' } : { type: 'vertical' }
|
|
17
17
|
);
|
|
18
|
+
|
|
19
|
+
// Sections of different channels can share a title, so a key leads with its channel; a repeat takes its position.
|
|
20
|
+
const keys = $derived.by(() => {
|
|
21
|
+
const bases = sections.map(
|
|
22
|
+
(section) => `${'channel' in section ? section.channel : section.type}:${section.title ?? ''}`
|
|
23
|
+
);
|
|
24
|
+
return bases.map((base, i) => (bases.indexOf(base) === i ? base : `${base}:${i}`));
|
|
25
|
+
});
|
|
18
26
|
</script>
|
|
19
27
|
|
|
20
28
|
<div class="dct-legend">
|
|
21
|
-
{#each sections as section, i (
|
|
29
|
+
{#each sections as section, i (keys[i])}
|
|
22
30
|
<div class="dct-legend__section">
|
|
23
31
|
{#if section.title}
|
|
24
32
|
<div class="dct-legend__title">{section.title}</div>
|
|
@@ -18,6 +18,10 @@ export declare class LegendState {
|
|
|
18
18
|
static current(): LegendState | null;
|
|
19
19
|
/** A new legend, shared with everything below. Call during component init. */
|
|
20
20
|
static provide(): LegendState;
|
|
21
|
+
/** Keeps the plots below out of the enclosing legend: they still follow its toggles, but add nothing to it. Call during component init. */
|
|
22
|
+
static silence(): void;
|
|
23
|
+
/** Whether the plots here are kept out of the enclosing legend (see {@link silence}). Call during component init. */
|
|
24
|
+
static isSilenced(): boolean;
|
|
21
25
|
/** The enclosing figure's legend, or a private one for a legend drawn outside any. Call during component init. */
|
|
22
26
|
static ensure(): LegendState;
|
|
23
27
|
/** Whether `value` lies within `range`; a missing value always does. */
|
|
@@ -5,6 +5,7 @@ import { MarkerKinds } from '../../markers/MarkerKinds';
|
|
|
5
5
|
import { LegendChannels } from './LegendChannels';
|
|
6
6
|
import { LegendText } from './LegendText';
|
|
7
7
|
const LEGEND_KEY = Symbol('dct-legend');
|
|
8
|
+
const QUIET_KEY = Symbol('dct-legend-quiet');
|
|
8
9
|
/**
|
|
9
10
|
* A figure's legend, shared by every plot and legend under it: what the
|
|
10
11
|
* reader turned off - each series' {@link LegendDisabledAction}, and the
|
|
@@ -29,6 +30,14 @@ export class LegendState {
|
|
|
29
30
|
setContext(LEGEND_KEY, legend);
|
|
30
31
|
return legend;
|
|
31
32
|
}
|
|
33
|
+
/** Keeps the plots below out of the enclosing legend: they still follow its toggles, but add nothing to it. Call during component init. */
|
|
34
|
+
static silence() {
|
|
35
|
+
setContext(QUIET_KEY, true);
|
|
36
|
+
}
|
|
37
|
+
/** Whether the plots here are kept out of the enclosing legend (see {@link silence}). Call during component init. */
|
|
38
|
+
static isSilenced() {
|
|
39
|
+
return getContext(QUIET_KEY) ?? false;
|
|
40
|
+
}
|
|
32
41
|
/** The enclosing figure's legend, or a private one for a legend drawn outside any. Call during component init. */
|
|
33
42
|
static ensure() {
|
|
34
43
|
return LegendState.current() ?? new LegendState();
|
|
@@ -149,19 +158,21 @@ export class LegendState {
|
|
|
149
158
|
const { title, domain, range, color, filled, symbol } = entry;
|
|
150
159
|
ramps.push({
|
|
151
160
|
type: 'size',
|
|
161
|
+
channel: 'r',
|
|
152
162
|
title: title && format(title),
|
|
153
163
|
domain,
|
|
154
164
|
range,
|
|
155
165
|
color,
|
|
156
166
|
filled,
|
|
157
167
|
...(symbol ? { symbol } : {}),
|
|
158
|
-
...adjust('
|
|
168
|
+
...adjust('r', title)
|
|
159
169
|
});
|
|
160
170
|
}
|
|
161
171
|
else if (entry.type === 'symbol') {
|
|
162
172
|
const { title, items: shapes, color, filled } = entry;
|
|
163
173
|
ramps.push({
|
|
164
174
|
type: 'symbol',
|
|
175
|
+
channel: 'symbol',
|
|
165
176
|
title: title && format(title),
|
|
166
177
|
items: shapes,
|
|
167
178
|
color,
|
|
@@ -173,6 +184,7 @@ export class LegendState {
|
|
|
173
184
|
const { title, min, max, opacityMin, opacityMax, color } = entry;
|
|
174
185
|
ramps.push({
|
|
175
186
|
type: 'continuous',
|
|
187
|
+
channel: 'opacity',
|
|
176
188
|
title: title && format(title),
|
|
177
189
|
min,
|
|
178
190
|
max,
|
|
@@ -185,6 +197,7 @@ export class LegendState {
|
|
|
185
197
|
const { title, min, max, colorMin, colorMax, scheme, pivot } = entry;
|
|
186
198
|
const section = {
|
|
187
199
|
type: 'continuous',
|
|
200
|
+
channel: 'color',
|
|
188
201
|
title: title && format(title),
|
|
189
202
|
min,
|
|
190
203
|
max,
|
|
@@ -268,11 +281,15 @@ export class LegendState {
|
|
|
268
281
|
*/
|
|
269
282
|
static entriesOf(plot) {
|
|
270
283
|
const color = (name) => name !== undefined && name !== 'default' ? plot.colorForSeries?.(name) : undefined;
|
|
284
|
+
// A marker that is `legend: false` is decoration - a connector - and does not give the series its symbol.
|
|
271
285
|
const mark = plot.markers
|
|
272
|
-
?.
|
|
286
|
+
?.filter((marker) => marker.legend !== false)
|
|
287
|
+
.map((marker) => MarkerKinds.of(marker.type)?.legendSymbol)
|
|
273
288
|
.find((kind) => kind !== undefined);
|
|
274
289
|
const dots = LegendChannels.look((plot.markers ?? []).filter((marker) => marker.type === 'dot' && !marker.legend));
|
|
275
|
-
|
|
290
|
+
// A series with no rows draws nothing, so it has nothing to show.
|
|
291
|
+
const drawn = (plot.resolvedSeries ?? []).filter((s) => !Array.isArray(s.data) || s.data.length > 0);
|
|
292
|
+
const series = drawn.map((s) => ({
|
|
276
293
|
type: 'series',
|
|
277
294
|
name: s.name,
|
|
278
295
|
color: color(s.name),
|
|
@@ -323,11 +340,9 @@ export class LegendState {
|
|
|
323
340
|
...(entry.label ? { label: entry.label } : {}),
|
|
324
341
|
color: entry.color,
|
|
325
342
|
...(entry.filled === false ? { filled: false } : {}),
|
|
326
|
-
...(entry.
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
? { symbol: 'line', lineStyle: entry.lineStyle ?? 'solid' }
|
|
330
|
-
: {})
|
|
343
|
+
...(entry.mark ? { mark: entry.mark } : {}),
|
|
344
|
+
...(entry.symbol ? { symbol: entry.symbol } : {}),
|
|
345
|
+
...(entry.mark === 'line' ? { lineStyle: entry.lineStyle ?? 'solid' } : {})
|
|
331
346
|
};
|
|
332
347
|
}
|
|
333
348
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
<script lang="ts">
|
|
2
2
|
import { ticks } from 'd3-array';
|
|
3
3
|
import type { SizeLegendSection } from '../../types/layout/legend';
|
|
4
|
-
import { SymbolPath } from '../../utils/
|
|
4
|
+
import { SymbolPath } from '../../utils/SymbolPath';
|
|
5
5
|
import { AxisNumberFormat } from './AxisNumberFormat';
|
|
6
6
|
import { getConfiguration } from '../../configuration/config.svelte';
|
|
7
7
|
|
|
@@ -29,6 +29,8 @@ export type PlotMarginsInputs = {
|
|
|
29
29
|
scales: () => Partial<Record<AxisChannelName, Pick<AxisScale, 'tickRotate'>>> | undefined;
|
|
30
30
|
/** The tick labels' font size. */
|
|
31
31
|
tickFontSize: () => number;
|
|
32
|
+
/** How wide the widest tick label of an axis is, where the plot measured it: a rotated axis takes room for that, not for a guessed width. */
|
|
33
|
+
tickWidth?: () => Partial<Record<AxisChannelName, number | undefined>>;
|
|
32
34
|
/** Receives the margins the labels settled on - the plot's bindable `margins`. */
|
|
33
35
|
settle?: (margins: MarginConfig) => void;
|
|
34
36
|
};
|
|
@@ -93,9 +95,4 @@ export declare class PlotMargins {
|
|
|
93
95
|
x: number;
|
|
94
96
|
y: number;
|
|
95
97
|
}, anchor: BoxAnchors): Box;
|
|
96
|
-
/**
|
|
97
|
-
* Changes whenever the labels' margins move after mount, which svelteplot
|
|
98
|
-
* only takes on a remount. The same margins read back from `settle` keep it.
|
|
99
|
-
*/
|
|
100
|
-
readonly remountKey: string;
|
|
101
98
|
}
|
|
@@ -148,8 +148,39 @@ export class PlotMargins {
|
|
|
148
148
|
if (held !== undefined || grown !== undefined)
|
|
149
149
|
out[side] = Math.max(held ?? 0, grown ?? 0);
|
|
150
150
|
}
|
|
151
|
+
for (const [a, b, extent] of [
|
|
152
|
+
['left', 'right', width],
|
|
153
|
+
['top', 'bottom', height]
|
|
154
|
+
]) {
|
|
155
|
+
PlotMargins.#keepContent(out, [a, b], extent, author, estimate);
|
|
156
|
+
}
|
|
151
157
|
return out;
|
|
152
158
|
});
|
|
159
|
+
/** The share of a box's extent its margins always leave to the plot's own area. */
|
|
160
|
+
static #MIN_CONTENT = 0.25;
|
|
161
|
+
/**
|
|
162
|
+
* Cuts the growth of two opposite sides of `out`, in proportion, until they
|
|
163
|
+
* leave the plot's area its minimum share of `extent` - a negative area makes
|
|
164
|
+
* svelteplot draw marks with negative sizes. A side never goes below the
|
|
165
|
+
* estimate, and a side the author fixed is left alone.
|
|
166
|
+
*/
|
|
167
|
+
static #keepContent(out, sides, extent, author, estimate) {
|
|
168
|
+
const fixed = (side) => {
|
|
169
|
+
const own = author?.[side];
|
|
170
|
+
return typeof own === 'number' ? own : estimate[side];
|
|
171
|
+
};
|
|
172
|
+
const used = (side) => out[side] ?? fixed(side);
|
|
173
|
+
const over = used(sides[0]) + used(sides[1]) - extent * (1 - PlotMargins.#MIN_CONTENT);
|
|
174
|
+
const room = sides.map((side) => out[side] === undefined ? 0 : Math.max(0, out[side] - estimate[side]));
|
|
175
|
+
const total = room[0] + room[1];
|
|
176
|
+
if (over <= 0 || total <= 0)
|
|
177
|
+
return;
|
|
178
|
+
const cut = Math.min(over, total);
|
|
179
|
+
sides.forEach((side, i) => {
|
|
180
|
+
if (out[side] !== undefined)
|
|
181
|
+
out[side] -= (cut * room[i]) / total;
|
|
182
|
+
});
|
|
183
|
+
}
|
|
153
184
|
/** The author's margins, with the room labels need. */
|
|
154
185
|
#labels = $derived.by(() => {
|
|
155
186
|
const author = this.#inputs.author();
|
|
@@ -161,18 +192,19 @@ export class PlotMargins {
|
|
|
161
192
|
/**
|
|
162
193
|
* How much more room (or less) each axis' rotated tick labels take across
|
|
163
194
|
* it, on its side. An x label stands as tall as its text, a y label as wide;
|
|
164
|
-
* rotated, it reaches across by its turned box.
|
|
165
|
-
* as wide as its font size.
|
|
195
|
+
* rotated, it reaches across by its turned box.
|
|
166
196
|
*/
|
|
167
197
|
#tickRoom = $derived.by(() => {
|
|
168
198
|
const scales = this.#inputs.scales();
|
|
169
199
|
const height = this.#inputs.tickFontSize();
|
|
170
|
-
const
|
|
200
|
+
const measured = this.#inputs.tickWidth?.();
|
|
171
201
|
const room = {};
|
|
172
202
|
for (const axis of ['x', 'y']) {
|
|
173
203
|
const degrees = scales?.[axis]?.tickRotate;
|
|
174
204
|
if (!degrees)
|
|
175
205
|
continue;
|
|
206
|
+
// A label is taken as twice as wide as its font size, unless the plot measured it.
|
|
207
|
+
const width = measured?.[axis] || 2 * height;
|
|
176
208
|
const rad = (degrees * Math.PI) / 180;
|
|
177
209
|
const [across, along] = axis === 'x' ? [height, width] : [width, height];
|
|
178
210
|
const turned = Math.abs(Math.cos(rad)) * across + Math.abs(Math.sin(rad)) * along;
|
|
@@ -211,9 +243,4 @@ export class PlotMargins {
|
|
|
211
243
|
place(size, point, anchor) {
|
|
212
244
|
return size.placeNear(point, anchor, this.box);
|
|
213
245
|
}
|
|
214
|
-
/**
|
|
215
|
-
* Changes whenever the labels' margins move after mount, which svelteplot
|
|
216
|
-
* only takes on a remount. The same margins read back from `settle` keep it.
|
|
217
|
-
*/
|
|
218
|
-
remountKey = $derived.by(() => JSON.stringify(this.#labels ?? null));
|
|
219
246
|
}
|
|
@@ -18,6 +18,7 @@
|
|
|
18
18
|
import { merge } from '../../utils/merge';
|
|
19
19
|
import { Pipeline } from '../../phases/Pipeline';
|
|
20
20
|
import { Slice } from './Slice';
|
|
21
|
+
import { FacetScope } from '../facet/scope';
|
|
21
22
|
import type { TooltipProp } from '../../types/layout/tooltip';
|
|
22
23
|
import type { MarginConfig, PlotChromeConfig } from '../../types/plots/props';
|
|
23
24
|
import type { PlotCellContext, PlotCellSnippet, PlotCoreBase } from '../../types/layout/plot';
|
|
@@ -153,6 +154,24 @@
|
|
|
153
154
|
return rest;
|
|
154
155
|
}
|
|
155
156
|
|
|
157
|
+
/**
|
|
158
|
+
* The props of the core that draws the slice `ctx`: the kind's `slice`, or the plot's own, with the
|
|
159
|
+
* `markers` and `segments` that name a facet left to the panels they name. The data phases already
|
|
160
|
+
* handed them to their panels; this is for the cores that read them from their own props.
|
|
161
|
+
*/
|
|
162
|
+
function coreProps(ctx: PlotCellContext<TRow, TScales>) {
|
|
163
|
+
const props = (slice ?? buildSliceProps)(ctx) as Record<string, unknown>;
|
|
164
|
+
const { markers, segments } = props as {
|
|
165
|
+
markers?: object[];
|
|
166
|
+
segments?: Record<string, object[]>;
|
|
167
|
+
};
|
|
168
|
+
return {
|
|
169
|
+
...props,
|
|
170
|
+
...(markers ? { markers: FacetScope.scope(markers, ctx.facet) } : {}),
|
|
171
|
+
...(segments ? { segments: FacetScope.scopeSegments(segments, ctx.facet) } : {})
|
|
172
|
+
};
|
|
173
|
+
}
|
|
174
|
+
|
|
156
175
|
function buildSliceProps(ctx: PlotCellContext<TRow, TScales>) {
|
|
157
176
|
return {
|
|
158
177
|
...core,
|
|
@@ -172,9 +191,9 @@
|
|
|
172
191
|
{#if cell}
|
|
173
192
|
{@render cell(ctx)}
|
|
174
193
|
{:else if Core && sliced}
|
|
175
|
-
<Core {...(
|
|
194
|
+
<Core {...coreProps(ctx)} {pipeline} />
|
|
176
195
|
{:else if Core}
|
|
177
|
-
<Core {...withoutMargins((
|
|
196
|
+
<Core {...withoutMargins(coreProps(ctx))} bind:margins {pipeline} />
|
|
178
197
|
{/if}
|
|
179
198
|
{/snippet}
|
|
180
199
|
|
|
@@ -194,6 +213,7 @@
|
|
|
194
213
|
panel: panels
|
|
195
214
|
? FacetPanels.buildPanelState(panels, slicing.panelKey(place) ?? '')
|
|
196
215
|
: undefined,
|
|
216
|
+
facet: place,
|
|
197
217
|
keep: slicing.keep({ time, facet: place })
|
|
198
218
|
})}
|
|
199
219
|
</HoverScope>
|
|
@@ -39,6 +39,10 @@ export declare class Slice<TRow extends Record<string, unknown>> {
|
|
|
39
39
|
* displays its axes.
|
|
40
40
|
*/
|
|
41
41
|
facetScales<TScales extends object>(shared: Record<string, object> | undefined, place: FacetCellContext<TRow>): TScales | undefined;
|
|
42
|
-
/**
|
|
42
|
+
/**
|
|
43
|
+
* The scales a timeline alone keeps every step on - the domains all its rows
|
|
44
|
+
* span - unless it fits each step's own: both under `'free'`, or the one axis
|
|
45
|
+
* `'free-x'`/`'free-y'` names, which leaves the other on its shared domain.
|
|
46
|
+
*/
|
|
43
47
|
timelineScales<TScales extends object>(shared: Record<string, object> | undefined): TScales | undefined;
|
|
44
48
|
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { resolveAccessor } from '../../
|
|
1
|
+
import { resolveAccessor } from '../../utils/accessors';
|
|
2
2
|
import { merge } from '../../utils/merge';
|
|
3
3
|
import { TimelineSteps } from '../timeline/TimelineSteps';
|
|
4
4
|
import { TimelineTime } from '../timeline/TimelineTime';
|
|
@@ -90,11 +90,21 @@ export class Slice {
|
|
|
90
90
|
return undefined;
|
|
91
91
|
return merge(shared?.[key], this.#axes?.(place));
|
|
92
92
|
}
|
|
93
|
-
/**
|
|
93
|
+
/**
|
|
94
|
+
* The scales a timeline alone keeps every step on - the domains all its rows
|
|
95
|
+
* span - unless it fits each step's own: both under `'free'`, or the one axis
|
|
96
|
+
* `'free-x'`/`'free-y'` names, which leaves the other on its shared domain.
|
|
97
|
+
*/
|
|
94
98
|
timelineScales(shared) {
|
|
95
99
|
const { timeline, facet } = this;
|
|
96
|
-
|
|
100
|
+
const mode = timeline?.scales;
|
|
101
|
+
if (!timeline || facet || mode === 'free')
|
|
97
102
|
return undefined;
|
|
98
|
-
|
|
103
|
+
const all = shared?.[''];
|
|
104
|
+
if (!all || (mode !== 'free-x' && mode !== 'free-y'))
|
|
105
|
+
return all;
|
|
106
|
+
const kept = { ...all };
|
|
107
|
+
delete kept[mode === 'free-x' ? 'x' : 'y'];
|
|
108
|
+
return kept;
|
|
99
109
|
}
|
|
100
110
|
}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { AxisChannelName } from '../../types/layout/mapping';
|
|
2
|
+
import type { NiceOption } from '../../types/layout/scales';
|
|
2
3
|
/**
|
|
3
4
|
* "Nice" (1/2/5×10ⁿ) tick steps and the domains they round to, compatible with
|
|
4
5
|
* d3-array's and reimplemented here to avoid depending on internals svelteplot
|
|
@@ -24,6 +25,8 @@ export declare class NiceTicks {
|
|
|
24
25
|
static step(start: number, stop: number, count: number): number;
|
|
25
26
|
/** Multiples of `step` covering `[start, stop]`, inclusive of either endpoint when it lands exactly on one. */
|
|
26
27
|
static inRange(start: number, stop: number, step: number): number[];
|
|
28
|
+
/** The tolerance a scale's `nice` asks for, or `undefined` for the default. */
|
|
29
|
+
static toleranceOf(nice: NiceOption | undefined): number | undefined;
|
|
27
30
|
/** How many ticks fit `span` pixels at one per `spacing`, and at least `min`. */
|
|
28
31
|
static count(span: number, spacing: number, min: number): number;
|
|
29
32
|
/**
|
|
@@ -44,6 +44,10 @@ export class NiceTicks {
|
|
|
44
44
|
out.push(i * step);
|
|
45
45
|
return out;
|
|
46
46
|
}
|
|
47
|
+
/** The tolerance a scale's `nice` asks for, or `undefined` for the default. */
|
|
48
|
+
static toleranceOf(nice) {
|
|
49
|
+
return typeof nice === 'object' ? nice.tolerance : undefined;
|
|
50
|
+
}
|
|
47
51
|
/** How many ticks fit `span` pixels at one per `spacing`, and at least `min`. */
|
|
48
52
|
static count(span, spacing, min) {
|
|
49
53
|
return Math.max(min, Math.round(span / spacing));
|