@fundar/data-chart-telling 1.1.0 → 1.2.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 +32 -0
- package/README.md +6 -6
- package/dist/configuration/config.svelte.d.ts +1 -1
- package/dist/configuration/config.svelte.js +165 -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/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 +1 -1
- 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 +20 -3
- 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 +4 -8
- 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 +72 -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.js +1 -1
- 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 +9 -3
- 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/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 +7 -2
- 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.js +1 -1
- package/dist/types/configuration/styling.d.ts +276 -143
- package/dist/types/layout/coordinates.d.ts +5 -4
- package/dist/types/layout/legend.d.ts +21 -5
- package/dist/types/layout/plot.d.ts +44 -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/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 +9 -0
- 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/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 +1 -1
- 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/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 +3 -3
- package/docs/getting-started.md +2 -2
- package/docs/legend.md +13 -11
- package/docs/markers.md +29 -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 +24 -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/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 +22 -11
- package/llms.txt +32 -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
package/dist/index.d.ts
CHANGED
|
@@ -1,12 +1,21 @@
|
|
|
1
|
-
export { default as AreaPlot } from './plots/area/Plot.svelte';
|
|
2
|
-
export { default as BarPlot } from './plots/bar/Plot.svelte';
|
|
3
|
-
export { default as BoxPlot } from './plots/box/Plot.svelte';
|
|
4
|
-
export { default as
|
|
5
|
-
export { default as
|
|
6
|
-
export { default as
|
|
7
|
-
export { default as
|
|
8
|
-
export { default as
|
|
9
|
-
export { default as GeoPlot } from './plots/geo/Plot.svelte';
|
|
1
|
+
export { default as AreaPlot } from './plots/evolution/area/Plot.svelte';
|
|
2
|
+
export { default as BarPlot } from './plots/ranking/bar/Plot.svelte';
|
|
3
|
+
export { default as BoxPlot } from './plots/distribution/box/Plot.svelte';
|
|
4
|
+
export { default as BulletPlot } from './plots/ranking/bullet/Plot.svelte';
|
|
5
|
+
export { default as ClevelandPlot } from './plots/ranking/cleveland/Plot.svelte';
|
|
6
|
+
export { default as DensityPlot } from './plots/distribution/density/Plot.svelte';
|
|
7
|
+
export { default as DumbbellPlot } from './plots/ranking/dumbbell/Plot.svelte';
|
|
8
|
+
export { default as ForestPlot } from './plots/ranking/forest/Plot.svelte';
|
|
9
|
+
export { default as GeoPlot } from './plots/map/geo/Plot.svelte';
|
|
10
|
+
export { default as HeatmapPlot } from './plots/correlation/heatmap/Plot.svelte';
|
|
11
|
+
export { default as HistogramPlot } from './plots/distribution/histogram/Plot.svelte';
|
|
12
|
+
export { default as LinePlot } from './plots/evolution/line/Plot.svelte';
|
|
13
|
+
export { default as LollipopPlot } from './plots/ranking/lollipop/Plot.svelte';
|
|
14
|
+
export { default as PyramidPlot } from './plots/distribution/pyramid/Plot.svelte';
|
|
15
|
+
export { default as ScatterPlot } from './plots/correlation/scatter/Plot.svelte';
|
|
16
|
+
export { default as SlopePlot } from './plots/evolution/slope/Plot.svelte';
|
|
17
|
+
export { default as SparklinePlot } from './plots/evolution/sparkline/Plot.svelte';
|
|
18
|
+
export { default as ViolinPlot } from './plots/distribution/violin/Plot.svelte';
|
|
10
19
|
export { default as PlotComposer } from './layout/composer/PlotComposer.svelte';
|
|
11
20
|
export { default as GridCell } from './layout/grid/GridCell.svelte';
|
|
12
21
|
export { default as Plot } from './layout/plot/Plot.svelte';
|
|
@@ -21,20 +30,20 @@ export type { ThemeName } from './configuration/themes';
|
|
|
21
30
|
export { groupBy, buildSeries } from './utils/grouping';
|
|
22
31
|
export { makeColorScale, resolveColorScale, normalize, resolveCssColor, paletteColor, contrastTextColor, contrastRatio } from './utils/color';
|
|
23
32
|
export { Margins } from './layout/margins/Margins';
|
|
24
|
-
export { resolveOpacityScale } from './utils/
|
|
25
|
-
export { resolveSymbolScale } from './utils/
|
|
33
|
+
export { resolveOpacityScale } from './utils/OpacityScale';
|
|
34
|
+
export { resolveSymbolScale } from './utils/SymbolScale';
|
|
26
35
|
export { Statistics } from './phases/statistics/Statistics';
|
|
27
36
|
export type { AxisValue, ChannelValue, ChannelName, AxisChannelName, IndependentChannelName, SizeChannelName, ChannelAccessors } from './types/layout/mapping';
|
|
28
37
|
export type { AxisScale, AxisBasedScalesConfig, ChannelScalesConfig } from './types/layout/scales';
|
|
29
38
|
export type { Accessor, Series, SeriesProps, DataProps } from './types/plots/data/common';
|
|
30
39
|
export type { BasePlotProps, PlotCoreProps, PlotChromeProps, FigureBoxProps, SegmentsConfig, ScalesConfig, MarginConfig, TooltipConfig, HoverConfig } from './types/plots/props';
|
|
31
|
-
export type { AxisBasedStylesConfig, GapsAwarePlotStylesConfig, GeoStylesConfig, GeoTileLayerConfig } from './types/layout/styles';
|
|
40
|
+
export type { AxisBasedStylesConfig, ConnectorBasedStylesConfig, BulletStylesConfig, GapsAwarePlotStylesConfig, CurveAwarePlotStylesConfig, GeoStylesConfig, GeoTileLayerConfig } from './types/layout/styles';
|
|
32
41
|
export type { GapsConfig } from './types/plots/gaps';
|
|
33
42
|
export type { LineSegmentStyle, BarSegmentStyle, CellSegmentStyle, GeoSegmentStyle, ScatterSegmentStyle } from './types/plots/segments/common';
|
|
34
43
|
export type { Range, Area, Segment } from './types/plots/segments/config';
|
|
35
44
|
export type { SymbolType } from './types/plots/constants';
|
|
36
45
|
export type { FontStyle, StrokeStyle, DotStyle, AreaStyle } from './types/plots/styling';
|
|
37
|
-
export type { AxisBasedMarkersConfig, BrushSelection
|
|
46
|
+
export type { AxisBasedMarkersConfig, BrushSelection } from './types/markers/common';
|
|
38
47
|
export type { StatisticConfig } from './types/layout/statistics';
|
|
39
48
|
export type * from './types/transforms';
|
|
40
49
|
export type { GeoFeature, GeoJsonInput, GeoDataProps, Topology } from './types/plots/data/geo';
|
|
@@ -48,4 +57,4 @@ export type { GridPlacement, GridInset, GridCellContext, GridCellSnippet } from
|
|
|
48
57
|
export type { Responsive, FacetConfig, FacetCellContext, FacetIndicatorContext, FacetIndicatorSnippet, FacetNavDirection, FacetNavContext, FacetNavSnippet } from './types/layout/facet';
|
|
49
58
|
export type { LegendSection, DiscreteLegendSection, ContinuousLegendSection, LegendItem, LegendNavDirection, LegendNavContext, LegendNavSnippet, LegendEntry, LegendMark, LegendRange } from './types/layout/legend';
|
|
50
59
|
export type { HoverStrategy, HoverPoint, HoverDisplayPoint } from './types/layout/hover';
|
|
51
|
-
export type { PlotStylesConfig, PlotStylesConfigInput, DividerLineStyle, TextStyle } from './types/configuration/styling';
|
|
60
|
+
export type { PlotStylesConfig, PlotStylesConfigInput, PaletteInput, DividerLineStyle, TextStyle } from './types/configuration/styling';
|
package/dist/index.js
CHANGED
|
@@ -1,15 +1,24 @@
|
|
|
1
1
|
// ── Plots ───────────────────────────────────────────────────────────────────
|
|
2
2
|
// One mark family each, with optional chrome (title, legend, caption),
|
|
3
3
|
// timeline and facets around it.
|
|
4
|
-
export { default as AreaPlot } from './plots/area/Plot.svelte';
|
|
5
|
-
export { default as BarPlot } from './plots/bar/Plot.svelte';
|
|
6
|
-
export { default as BoxPlot } from './plots/box/Plot.svelte';
|
|
7
|
-
export { default as
|
|
8
|
-
export { default as
|
|
9
|
-
export { default as
|
|
10
|
-
export { default as
|
|
11
|
-
export { default as
|
|
12
|
-
export { default as GeoPlot } from './plots/geo/Plot.svelte';
|
|
4
|
+
export { default as AreaPlot } from './plots/evolution/area/Plot.svelte';
|
|
5
|
+
export { default as BarPlot } from './plots/ranking/bar/Plot.svelte';
|
|
6
|
+
export { default as BoxPlot } from './plots/distribution/box/Plot.svelte';
|
|
7
|
+
export { default as BulletPlot } from './plots/ranking/bullet/Plot.svelte';
|
|
8
|
+
export { default as ClevelandPlot } from './plots/ranking/cleveland/Plot.svelte';
|
|
9
|
+
export { default as DensityPlot } from './plots/distribution/density/Plot.svelte';
|
|
10
|
+
export { default as DumbbellPlot } from './plots/ranking/dumbbell/Plot.svelte';
|
|
11
|
+
export { default as ForestPlot } from './plots/ranking/forest/Plot.svelte';
|
|
12
|
+
export { default as GeoPlot } from './plots/map/geo/Plot.svelte';
|
|
13
|
+
export { default as HeatmapPlot } from './plots/correlation/heatmap/Plot.svelte';
|
|
14
|
+
export { default as HistogramPlot } from './plots/distribution/histogram/Plot.svelte';
|
|
15
|
+
export { default as LinePlot } from './plots/evolution/line/Plot.svelte';
|
|
16
|
+
export { default as LollipopPlot } from './plots/ranking/lollipop/Plot.svelte';
|
|
17
|
+
export { default as PyramidPlot } from './plots/distribution/pyramid/Plot.svelte';
|
|
18
|
+
export { default as ScatterPlot } from './plots/correlation/scatter/Plot.svelte';
|
|
19
|
+
export { default as SlopePlot } from './plots/evolution/slope/Plot.svelte';
|
|
20
|
+
export { default as SparklinePlot } from './plots/evolution/sparkline/Plot.svelte';
|
|
21
|
+
export { default as ViolinPlot } from './plots/distribution/violin/Plot.svelte';
|
|
13
22
|
// ── Composition ─────────────────────────────────────────────────────────────
|
|
14
23
|
// Separate plots combined into one figure, with chrome of its own.
|
|
15
24
|
export { default as PlotComposer } from './layout/composer/PlotComposer.svelte';
|
|
@@ -27,6 +36,6 @@ export { SYSTEM_FONT } from './configuration/fonts';
|
|
|
27
36
|
export { groupBy, buildSeries } from './utils/grouping';
|
|
28
37
|
export { makeColorScale, resolveColorScale, normalize, resolveCssColor, paletteColor, contrastTextColor, contrastRatio } from './utils/color';
|
|
29
38
|
export { Margins } from './layout/margins/Margins';
|
|
30
|
-
export { resolveOpacityScale } from './utils/
|
|
31
|
-
export { resolveSymbolScale } from './utils/
|
|
39
|
+
export { resolveOpacityScale } from './utils/OpacityScale';
|
|
40
|
+
export { resolveSymbolScale } from './utils/SymbolScale';
|
|
32
41
|
export { Statistics } from './phases/statistics/Statistics';
|
|
@@ -1,48 +1,10 @@
|
|
|
1
|
-
<script module lang="ts">
|
|
2
|
-
import type { Margins as MarginsType } from '../margins/Margins';
|
|
3
|
-
import type { EdgeBox } from '../../types/layout/box';
|
|
4
|
-
import type { StylesLayoutConfig } from '../../types/layout/styles';
|
|
5
|
-
import type { HoverPosition } from '../../types/phases';
|
|
6
|
-
import type { HoverConfig as PlotHoverConfig } from '../../types/plots/props';
|
|
7
|
-
|
|
8
|
-
/**
|
|
9
|
-
* What `BasePlotLayout` draws from: the end of a plot's pipeline. An axis
|
|
10
|
-
* kind's state is one as is; GeoPlot builds its own.
|
|
11
|
-
*/
|
|
12
|
-
export type PlotLayoutState = {
|
|
13
|
-
/** What the pointer can match, and how the hover reads. */
|
|
14
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
15
|
-
hover?: PlotHoverConfig<any>;
|
|
16
|
-
/** Where each row sits, for hover matching and the plot's scales. */
|
|
17
|
-
hoverPosition?: HoverPosition;
|
|
18
|
-
/** The rows the plot draws and hovers over. */
|
|
19
|
-
hoverRows?: unknown[];
|
|
20
|
-
/** The plot's x/y/r/length scales, and the scales a marker without its own inherits. */
|
|
21
|
-
scales?: object;
|
|
22
|
-
/** What the plot's position channels are and which way it runs, for what draws inside it. */
|
|
23
|
-
axes?: PlotAxes;
|
|
24
|
-
/** Every marker the pipeline resolved. */
|
|
25
|
-
markers?: object[];
|
|
26
|
-
/** All resolved series - axis kinds only. */
|
|
27
|
-
resolvedSeries?: object[];
|
|
28
|
-
/** Each series' color, by name - axis kinds only. */
|
|
29
|
-
colorForSeries?: (name: string) => string;
|
|
30
|
-
/** Per-series marker groups - axis kinds only. */
|
|
31
|
-
scopedGroups?: object[];
|
|
32
|
-
/** The plot's `styles`: its frame and, on a map, its tile layer. */
|
|
33
|
-
styles?: StylesLayoutConfig;
|
|
34
|
-
/** What an `'auto'` margin side reads as. Defaults to {@link Margins.AXIS_ESTIMATE}. */
|
|
35
|
-
marginEstimate?: MarginsType;
|
|
36
|
-
/** The plot's value labels, whose `reach` is the room the margins start from. */
|
|
37
|
-
valueLabels?: { reach: EdgeBox[] };
|
|
38
|
-
};
|
|
39
|
-
</script>
|
|
40
|
-
|
|
41
1
|
<script
|
|
42
2
|
lang="ts"
|
|
43
3
|
generics="TData extends Record<string, unknown>, TSeries extends Record<string, unknown> = TData"
|
|
44
4
|
>
|
|
45
5
|
import { Margins } from '../margins/Margins';
|
|
6
|
+
import type { AxisScale } from '../../types/layout/scales';
|
|
7
|
+
import type { PlotLayoutState } from '../../types/layout/plot';
|
|
46
8
|
import { PlotMargins } from '../margins/PlotMargins.svelte';
|
|
47
9
|
import { LegendState } from '../legend/LegendState.svelte';
|
|
48
10
|
import { onDestroy, untrack } from 'svelte';
|
|
@@ -51,6 +13,7 @@
|
|
|
51
13
|
import { Plot, Pointer, setPlotDefaults } from 'svelteplot';
|
|
52
14
|
import { getConfiguration } from '../../configuration/config.svelte';
|
|
53
15
|
import { SveltePlotScale } from '../scales/SveltePlotScale';
|
|
16
|
+
import { TickLabels } from '../scales/TickLabels';
|
|
54
17
|
import ScalesLayout from '../scales/ScalesLayout.svelte';
|
|
55
18
|
import GeometryLayout from '../geometry/GeometryLayout.svelte';
|
|
56
19
|
import CoordinatesLayout from '../coordinates/CoordinatesLayout.svelte';
|
|
@@ -59,7 +22,6 @@
|
|
|
59
22
|
import { PlotHover } from '../hover/PlotHover.svelte';
|
|
60
23
|
import { PlotContext } from '../plot/PlotContext';
|
|
61
24
|
import { TimelineState } from '../timeline/TimelineState.svelte';
|
|
62
|
-
import type { PlotAxes } from '../../phases/data/PlotAxes';
|
|
63
25
|
import type { AxisBasedScalesConfig } from '../../types/layout/scales';
|
|
64
26
|
import type { AxisValue } from '../../types/layout/mapping';
|
|
65
27
|
import type { CoordinatesConfig, GeoScalesConfig } from '../../types/layout/coordinates';
|
|
@@ -142,7 +104,9 @@
|
|
|
142
104
|
// What this plot draws, on its figure's legend - its series, their colors and marks.
|
|
143
105
|
const legend = LegendState.current();
|
|
144
106
|
const legendSource = Symbol('plot');
|
|
107
|
+
const silenced = LegendState.isSilenced();
|
|
145
108
|
$effect(() => {
|
|
109
|
+
if (silenced) return;
|
|
146
110
|
const entries = LegendState.entriesOf(state as never);
|
|
147
111
|
untrack(() => legend?.register(legendSource, entries));
|
|
148
112
|
});
|
|
@@ -162,16 +126,91 @@
|
|
|
162
126
|
numberFormat: { useGrouping: 'min2', compactDisplay: untrack(() => cfg.axis.compactDisplay) }
|
|
163
127
|
});
|
|
164
128
|
|
|
129
|
+
/** What an `'auto'` side reads as: the plot's own estimate, less the room of an axis that is not drawn. */
|
|
130
|
+
const marginEstimate = $derived.by(() => {
|
|
131
|
+
const estimate = state.marginEstimate ?? Margins.AXIS_ESTIMATE;
|
|
132
|
+
const bare = { x: scales?.x?.axisDisplay === 'none', y: scales?.y?.axisDisplay === 'none' };
|
|
133
|
+
return estimate.map((value, side) =>
|
|
134
|
+
(bare.x && side === 'bottom') || (bare.y && side === 'left') ? Math.min(value, 8) : value
|
|
135
|
+
);
|
|
136
|
+
});
|
|
137
|
+
|
|
138
|
+
/**
|
|
139
|
+
* How the labels of the plot's category axes (bands, or text laid out as points) are laid out when they would not fit
|
|
140
|
+
* side by side, unless the author set a `tickRotate` of their own or turned
|
|
141
|
+
* `axis.autoRotate` off: the x labels turn (45 degrees, else 90), and either
|
|
142
|
+
* axis leaves some out when even that is not enough. Judged against the plot's
|
|
143
|
+
* width and height less the margins an `'auto'` side is estimated at, so it holds
|
|
144
|
+
* whatever the margins settle on.
|
|
145
|
+
*/
|
|
146
|
+
const tickLayout = $derived.by(() => {
|
|
147
|
+
// A kind's band axes, and any axis of text categories a line or scatter lays out as points.
|
|
148
|
+
const bands = (['x', 'y'] as const).filter(
|
|
149
|
+
(axis) => state.axes?.bands.includes(axis) || state.axes?.isDiscrete(axis)
|
|
150
|
+
);
|
|
151
|
+
if (!cfg.axis.autoRotate || bands.length === 0) return undefined;
|
|
152
|
+
const estimate = marginEstimate;
|
|
153
|
+
const categories = (axis: 'x' | 'y') => {
|
|
154
|
+
const given = scales?.[axis]?.domain;
|
|
155
|
+
if (given) return given.map(String);
|
|
156
|
+
const get = axis === 'x' ? getX : getY;
|
|
157
|
+
return [...new Set(data.map((row) => String(get(row))))].sort();
|
|
158
|
+
};
|
|
159
|
+
const out: {
|
|
160
|
+
x?: ReturnType<typeof TickLabels.layout>;
|
|
161
|
+
y?: { every: number; values: string[] };
|
|
162
|
+
} = {};
|
|
163
|
+
if (bands.includes('x') && scales?.x?.tickRotate === undefined) {
|
|
164
|
+
out.x = TickLabels.layout(
|
|
165
|
+
categories('x'),
|
|
166
|
+
width - estimate.left - estimate.right,
|
|
167
|
+
scales?.x?.paddingInner ?? 0.1,
|
|
168
|
+
cfg.axis.fontSize,
|
|
169
|
+
cfg
|
|
170
|
+
);
|
|
171
|
+
}
|
|
172
|
+
if (bands.includes('y') && scales?.y?.ticks == null) {
|
|
173
|
+
const values = categories('y');
|
|
174
|
+
const every = TickLabels.rows(
|
|
175
|
+
values.length,
|
|
176
|
+
height - estimate.top - estimate.bottom,
|
|
177
|
+
cfg.axis.fontSize
|
|
178
|
+
);
|
|
179
|
+
if (every > 1) out.y = { every, values };
|
|
180
|
+
}
|
|
181
|
+
return out;
|
|
182
|
+
});
|
|
183
|
+
/** `scales` with the rotation the tick layout chose for the x labels. */
|
|
184
|
+
const layoutScales = $derived.by(() => {
|
|
185
|
+
const rotate = tickLayout?.x?.rotate;
|
|
186
|
+
if (!rotate || scales === undefined) return scales;
|
|
187
|
+
return { ...scales, x: { ...scales.x, tickRotate: rotate } };
|
|
188
|
+
});
|
|
189
|
+
/** The category labels a crowded axis still writes: one in every few. */
|
|
190
|
+
const tickValues = $derived.by(() => {
|
|
191
|
+
const out: Partial<Record<'x' | 'y', string[]>> = {};
|
|
192
|
+
const x = tickLayout?.x;
|
|
193
|
+
if (x && x.every > 1) {
|
|
194
|
+
const values =
|
|
195
|
+
scales?.x?.domain?.map(String) ?? [...new Set(data.map((row) => String(getX(row))))].sort();
|
|
196
|
+
out.x = values.filter((_, index) => index % x.every === 0);
|
|
197
|
+
}
|
|
198
|
+
const y = tickLayout?.y;
|
|
199
|
+
if (y) out.y = y.values.filter((_, index) => index % y.every === 0);
|
|
200
|
+
return out;
|
|
201
|
+
});
|
|
202
|
+
|
|
165
203
|
// Created once: this plot's margins, grown to fit the labels its markers report.
|
|
166
204
|
const plotMargins = new PlotMargins({
|
|
167
205
|
theme: () => cfg.margins,
|
|
168
206
|
author: () => margins,
|
|
169
|
-
estimate: () =>
|
|
207
|
+
estimate: () => marginEstimate,
|
|
170
208
|
reserve: () => state.valueLabels?.reach ?? [],
|
|
171
209
|
size: () => ({ width, height }),
|
|
172
210
|
resetKey: () => state.resolvedSeries,
|
|
173
|
-
scales: () =>
|
|
211
|
+
scales: () => layoutScales,
|
|
174
212
|
tickFontSize: () => cfg.axis.fontSize,
|
|
213
|
+
tickWidth: () => ({ x: tickLayout?.x?.width }),
|
|
175
214
|
settle: (settled) => (margins = settled)
|
|
176
215
|
});
|
|
177
216
|
const numericMargins = $derived(plotMargins.numeric);
|
|
@@ -191,16 +230,33 @@
|
|
|
191
230
|
/** The domains `ScalesLayout` widens an axis to, for an edge tick's `'extend'` (see `EdgeTicks`). */
|
|
192
231
|
const edgeDomains = new SvelteMap<'x' | 'y', [number, number]>();
|
|
193
232
|
|
|
233
|
+
/** The title svelteplot would infer from rows, for a slice with none (it infers nothing then). */
|
|
234
|
+
function titleOfEmpty(axis: 'x' | 'y', scale: AxisScale<TData> | undefined): string | undefined {
|
|
235
|
+
const field = state.channels?.[axis]?.source;
|
|
236
|
+
if (data.length > 0 || typeof field !== 'string' || scale?.label !== undefined)
|
|
237
|
+
return undefined;
|
|
238
|
+
if (scale?.type === 'time' || scale?.type === 'utc') return undefined;
|
|
239
|
+
// `ScalesLayout` draws a vertical title.
|
|
240
|
+
if (scale?.labelOrientation === 'vertical') return undefined;
|
|
241
|
+
if (axis === 'y') return `${scale?.reverse ? '↓' : '↑'} ${field}`;
|
|
242
|
+
if (state.axes?.isDiscrete('x')) return field;
|
|
243
|
+
return scale?.reverse ? `← ${field}` : `${field} →`;
|
|
244
|
+
}
|
|
245
|
+
|
|
194
246
|
// `SveltePlotScale.build` already left only svelteplot's own scale options.
|
|
195
247
|
const resolvedX = $derived.by(() => {
|
|
196
|
-
const built = SveltePlotScale.build(
|
|
248
|
+
const built = SveltePlotScale.build(layoutScales?.x, data, getX);
|
|
197
249
|
const domain = edgeDomains.get('x');
|
|
198
|
-
|
|
250
|
+
const label = titleOfEmpty('x', layoutScales?.x);
|
|
251
|
+
const out = domain ? { ...built, domain, nice: false } : built;
|
|
252
|
+
return (label ? { ...out, label } : out) as SveltePlotProps['x'];
|
|
199
253
|
});
|
|
200
254
|
const resolvedY = $derived.by(() => {
|
|
201
255
|
const built = SveltePlotScale.build(scales?.y, data, getY);
|
|
202
256
|
const domain = edgeDomains.get('y');
|
|
203
|
-
|
|
257
|
+
const label = titleOfEmpty('y', scales?.y);
|
|
258
|
+
const out = domain ? { ...built, domain, nice: false } : built;
|
|
259
|
+
return (label ? { ...out, label } : out) as SveltePlotProps['y'];
|
|
204
260
|
});
|
|
205
261
|
/** Threaded straight into svelteplot's own `r` scale option - see `RScaleConfig`'s own doc comment for why this isn't independently resolved like `color`. */
|
|
206
262
|
const resolvedR = $derived(scales?.r as SveltePlotProps['r']);
|
|
@@ -260,18 +316,27 @@
|
|
|
260
316
|
locale={cfg.axis.locale}
|
|
261
317
|
{data}
|
|
262
318
|
{containerEl}
|
|
263
|
-
remountKey={plotMargins.remountKey}
|
|
264
319
|
>
|
|
265
320
|
<StylesLayout styles={state.styles} {width} {height} {numericMargins} />
|
|
266
321
|
<!-- Axes for every kind but GeoPlot. -->
|
|
267
322
|
{#if scales !== undefined && coordinates === undefined}
|
|
268
|
-
<ScalesLayout
|
|
323
|
+
<ScalesLayout
|
|
324
|
+
{data}
|
|
325
|
+
{getX}
|
|
326
|
+
{getY}
|
|
327
|
+
{width}
|
|
328
|
+
{height}
|
|
329
|
+
{numericMargins}
|
|
330
|
+
scales={layoutScales}
|
|
331
|
+
{edgeDomains}
|
|
332
|
+
{tickValues}
|
|
333
|
+
{state}
|
|
334
|
+
/>
|
|
269
335
|
{/if}
|
|
270
336
|
<GeometryLayout
|
|
271
337
|
markers={resolvedMarkers}
|
|
272
338
|
seriesData={seriesData ?? []}
|
|
273
339
|
scopedGroups={scopedGroups ?? []}
|
|
274
|
-
channelScales={scales}
|
|
275
340
|
{ctrl}
|
|
276
341
|
{width}
|
|
277
342
|
{height}
|
|
@@ -307,7 +372,7 @@
|
|
|
307
372
|
visible={ctrl.showTooltip && ctrl.tooltipPosition != null}
|
|
308
373
|
x={ctrl.tooltipPosition?.x ?? 0}
|
|
309
374
|
y={ctrl.tooltipPosition?.y ?? 0}
|
|
310
|
-
rows={ctrl.matchedRows.map((p) => p.row)}
|
|
375
|
+
rows={ctrl.matchedRows.map((p) => ({ ...p.row, seriesColor: p.color }))}
|
|
311
376
|
format={hover.tooltip.format}
|
|
312
377
|
sort={hover.tooltip.sort}
|
|
313
378
|
content={hover.tooltip.content}
|
|
@@ -1,42 +1,5 @@
|
|
|
1
|
-
import type {
|
|
2
|
-
import type { EdgeBox } from '../../types/layout/box';
|
|
3
|
-
import type { StylesLayoutConfig } from '../../types/layout/styles';
|
|
4
|
-
import type { HoverPosition } from '../../types/phases';
|
|
5
|
-
import type { HoverConfig as PlotHoverConfig } from '../../types/plots/props';
|
|
6
|
-
/**
|
|
7
|
-
* What `BasePlotLayout` draws from: the end of a plot's pipeline. An axis
|
|
8
|
-
* kind's state is one as is; GeoPlot builds its own.
|
|
9
|
-
*/
|
|
10
|
-
export type PlotLayoutState = {
|
|
11
|
-
/** What the pointer can match, and how the hover reads. */
|
|
12
|
-
hover?: PlotHoverConfig<any>;
|
|
13
|
-
/** Where each row sits, for hover matching and the plot's scales. */
|
|
14
|
-
hoverPosition?: HoverPosition;
|
|
15
|
-
/** The rows the plot draws and hovers over. */
|
|
16
|
-
hoverRows?: unknown[];
|
|
17
|
-
/** The plot's x/y/r/length scales, and the scales a marker without its own inherits. */
|
|
18
|
-
scales?: object;
|
|
19
|
-
/** What the plot's position channels are and which way it runs, for what draws inside it. */
|
|
20
|
-
axes?: PlotAxes;
|
|
21
|
-
/** Every marker the pipeline resolved. */
|
|
22
|
-
markers?: object[];
|
|
23
|
-
/** All resolved series - axis kinds only. */
|
|
24
|
-
resolvedSeries?: object[];
|
|
25
|
-
/** Each series' color, by name - axis kinds only. */
|
|
26
|
-
colorForSeries?: (name: string) => string;
|
|
27
|
-
/** Per-series marker groups - axis kinds only. */
|
|
28
|
-
scopedGroups?: object[];
|
|
29
|
-
/** The plot's `styles`: its frame and, on a map, its tile layer. */
|
|
30
|
-
styles?: StylesLayoutConfig;
|
|
31
|
-
/** What an `'auto'` margin side reads as. Defaults to {@link Margins.AXIS_ESTIMATE}. */
|
|
32
|
-
marginEstimate?: MarginsType;
|
|
33
|
-
/** The plot's value labels, whose `reach` is the room the margins start from. */
|
|
34
|
-
valueLabels?: {
|
|
35
|
-
reach: EdgeBox[];
|
|
36
|
-
};
|
|
37
|
-
};
|
|
1
|
+
import type { PlotLayoutState } from '../../types/layout/plot';
|
|
38
2
|
import type { Snippet } from 'svelte';
|
|
39
|
-
import type { PlotAxes } from '../../phases/data/PlotAxes';
|
|
40
3
|
import type { CoordinatesConfig } from '../../types/layout/coordinates';
|
|
41
4
|
import type { HoverPoint } from '../../types/layout/hover';
|
|
42
5
|
import type { MarginConfig } from '../../types/plots/props';
|
|
@@ -11,6 +11,7 @@
|
|
|
11
11
|
createCameraRotateTween
|
|
12
12
|
} from './camera.svelte';
|
|
13
13
|
import CameraFit from './CameraFit.svelte';
|
|
14
|
+
import ProjectionZoom from './ProjectionZoom.svelte';
|
|
14
15
|
import type { CoordinatesConfig } from '../../types/layout/coordinates';
|
|
15
16
|
|
|
16
17
|
type SveltePlotProps = ComponentProps<typeof Plot>;
|
|
@@ -19,8 +20,8 @@
|
|
|
19
20
|
* Resolves the active coordinate system (a `d3-geo` projection) and owns
|
|
20
21
|
* `<Plot>` itself, since `projection` must be known before it mounts.
|
|
21
22
|
* Also owns pan/zoom/rotate gesture state and the declarative `camera`,
|
|
22
|
-
*
|
|
23
|
-
* on `orthographic`,
|
|
23
|
+
* applied to the projection's output by `ProjectionZoom` (and, for
|
|
24
|
+
* `camera`/`rotate` on `orthographic`, to the projection's own `rotate`). A no-op for
|
|
24
25
|
* every plot kind but `GeoPlot`.
|
|
25
26
|
*/
|
|
26
27
|
let {
|
|
@@ -35,7 +36,6 @@
|
|
|
35
36
|
locale = undefined,
|
|
36
37
|
data,
|
|
37
38
|
containerEl,
|
|
38
|
-
remountKey = undefined,
|
|
39
39
|
children
|
|
40
40
|
}: {
|
|
41
41
|
width: number;
|
|
@@ -53,8 +53,6 @@
|
|
|
53
53
|
/** Fed to `resolveProjection`'s `domain: 'data'` sentinel and to `coordinates.camera`'s `{features}` target resolution. */
|
|
54
54
|
data: TData[];
|
|
55
55
|
containerEl?: HTMLDivElement;
|
|
56
|
-
/** See `BasePlotLayout`'s own `remountKey` doc comment - forwarded verbatim to key svelteplot's `<Plot>` itself. */
|
|
57
|
-
remountKey?: string | number;
|
|
58
56
|
children: Snippet;
|
|
59
57
|
} = $props();
|
|
60
58
|
|
|
@@ -131,13 +129,17 @@
|
|
|
131
129
|
);
|
|
132
130
|
const rotateOverrideActive = $derived(cameraOrthoRotate != null || rotateEnabled);
|
|
133
131
|
|
|
132
|
+
/** Moving the view past the plot's box needs what is outside it drawn too: the frame clip would cut it at the unmoved box, so the plot's own clip does it instead. */
|
|
133
|
+
const movesView = $derived(zoomEnabled || panEnabled || cameraActive);
|
|
134
|
+
|
|
134
135
|
const finalProjection = $derived.by(() => {
|
|
135
|
-
if (!rotateOverrideActive) return resolvedProjection;
|
|
136
|
+
if (!rotateOverrideActive && !movesView) return resolvedProjection;
|
|
136
137
|
return {
|
|
137
138
|
...(typeof resolvedProjection === 'string'
|
|
138
139
|
? { type: resolvedProjection }
|
|
139
140
|
: resolvedProjection),
|
|
140
|
-
rotate: activeRotate
|
|
141
|
+
...(rotateOverrideActive ? { rotate: activeRotate } : {}),
|
|
142
|
+
...(movesView ? { clip: false } : {})
|
|
141
143
|
};
|
|
142
144
|
});
|
|
143
145
|
|
|
@@ -149,41 +151,41 @@
|
|
|
149
151
|
transition: () => cameraConfig?.transition
|
|
150
152
|
});
|
|
151
153
|
const cameraTransform = $derived(cameraTransformTween.current ?? { x: 0, y: 0, k: 1 });
|
|
154
|
+
const clipId = `geo-frame-clip-${Math.random().toString(36).slice(2, 9)}`;
|
|
152
155
|
</script>
|
|
153
156
|
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
{/key}
|
|
157
|
+
<Plot
|
|
158
|
+
{width}
|
|
159
|
+
{height}
|
|
160
|
+
{margin}
|
|
161
|
+
{x}
|
|
162
|
+
{y}
|
|
163
|
+
{r}
|
|
164
|
+
{length}
|
|
165
|
+
{locale}
|
|
166
|
+
projection={finalProjection as SveltePlotProps['projection']}
|
|
167
|
+
>
|
|
168
|
+
{#if cameraActive && resolvedCameraTarget}
|
|
169
|
+
<CameraFit
|
|
170
|
+
target={resolvedCameraTarget}
|
|
171
|
+
anchor={cameraConfig?.anchor}
|
|
172
|
+
padding={cameraConfig?.padding}
|
|
173
|
+
zoom={cameraConfig?.zoom}
|
|
174
|
+
{width}
|
|
175
|
+
{height}
|
|
176
|
+
onFit={(fit) => (cameraFit = fit)}
|
|
177
|
+
/>
|
|
178
|
+
{/if}
|
|
179
|
+
<!-- What a zoom or a camera pushes past the plot's box is cut there, so it never covers the legend or the chrome around it. -->
|
|
180
|
+
<defs>
|
|
181
|
+
<clipPath id={clipId}><rect x="0" y="0" {width} {height} /></clipPath>
|
|
182
|
+
</defs>
|
|
183
|
+
<g clip-path="url(#{clipId})">
|
|
184
|
+
<ProjectionZoom inner={geoZoom.transform} outer={cameraTransform}>
|
|
185
|
+
{@render children()}
|
|
186
|
+
</ProjectionZoom>
|
|
187
|
+
</g>
|
|
188
|
+
</Plot>
|
|
187
189
|
|
|
188
190
|
<style>
|
|
189
191
|
:global(figure.svelteplot svg) {
|
|
@@ -17,8 +17,6 @@ declare function $$render<TData extends Record<string, unknown>>(): {
|
|
|
17
17
|
/** Fed to `resolveProjection`'s `domain: 'data'` sentinel and to `coordinates.camera`'s `{features}` target resolution. */
|
|
18
18
|
data: TData[];
|
|
19
19
|
containerEl?: HTMLDivElement;
|
|
20
|
-
/** See `BasePlotLayout`'s own `remountKey` doc comment - forwarded verbatim to key svelteplot's `<Plot>` itself. */
|
|
21
|
-
remountKey?: string | number;
|
|
22
20
|
children: Snippet;
|
|
23
21
|
};
|
|
24
22
|
exports: {};
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import { getContext, setContext, type Snippet } from 'svelte';
|
|
3
|
+
import { ZoomedProjection } from './ZoomedProjection';
|
|
4
|
+
import type { GeoZoomTransform } from './zoom.svelte';
|
|
5
|
+
import type { StreamingProjection } from '../../plots/utils/tiles';
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* Draws everything inside it through the plot's projection moved by `inner`
|
|
9
|
+
* then `outer`, instead of scaling the drawn SVG: a zoom moves and spreads the
|
|
10
|
+
* positions, while dots, text and strokes keep their size. Works by handing
|
|
11
|
+
* the marks below a view of svelteplot's plot state whose `scales.projection`
|
|
12
|
+
* is the moved one.
|
|
13
|
+
*/
|
|
14
|
+
let {
|
|
15
|
+
inner,
|
|
16
|
+
outer,
|
|
17
|
+
children
|
|
18
|
+
}: { inner: GeoZoomTransform; outer: GeoZoomTransform; children: Snippet } = $props();
|
|
19
|
+
|
|
20
|
+
type Scales = { projection?: StreamingProjection & { aspectRatio?: number } } | undefined;
|
|
21
|
+
type PlotState = { scales: Scales; publicState: object };
|
|
22
|
+
type PlotContext = { getPlotState: () => PlotState } & Record<string, unknown>;
|
|
23
|
+
|
|
24
|
+
const context = getContext<PlotContext>('svelteplot');
|
|
25
|
+
const state = context.getPlotState();
|
|
26
|
+
|
|
27
|
+
const scales = $derived.by((): Scales => {
|
|
28
|
+
const own = state.scales;
|
|
29
|
+
return own?.projection
|
|
30
|
+
? { ...own, projection: ZoomedProjection.of(own.projection, inner, outer) }
|
|
31
|
+
: own;
|
|
32
|
+
});
|
|
33
|
+
|
|
34
|
+
const publicState = new Proxy(state.publicState, {
|
|
35
|
+
get: (target, key) => (key === 'scales' ? scales : Reflect.get(target, key, target))
|
|
36
|
+
});
|
|
37
|
+
const movedState = new Proxy(state, {
|
|
38
|
+
get: (target, key) => {
|
|
39
|
+
if (key === 'scales') return scales;
|
|
40
|
+
if (key === 'publicState') return publicState;
|
|
41
|
+
return Reflect.get(target, key, target);
|
|
42
|
+
}
|
|
43
|
+
});
|
|
44
|
+
|
|
45
|
+
setContext('svelteplot', { ...context, getPlotState: () => movedState });
|
|
46
|
+
</script>
|
|
47
|
+
|
|
48
|
+
{@render children()}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { type Snippet } from 'svelte';
|
|
2
|
+
import type { GeoZoomTransform } from './zoom.svelte';
|
|
3
|
+
type $$ComponentProps = {
|
|
4
|
+
inner: GeoZoomTransform;
|
|
5
|
+
outer: GeoZoomTransform;
|
|
6
|
+
children: Snippet;
|
|
7
|
+
};
|
|
8
|
+
declare const ProjectionZoom: import("svelte").Component<$$ComponentProps, {}, "">;
|
|
9
|
+
type ProjectionZoom = ReturnType<typeof ProjectionZoom>;
|
|
10
|
+
export default ProjectionZoom;
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { GeoZoomTransform } from './zoom.svelte';
|
|
2
|
+
import type { StreamingProjection } from '../../plots/utils/tiles';
|
|
3
|
+
/** A fitted projection with a pan and scale applied to where it puts things, so positions move and zoom while what is drawn at them keeps its size. */
|
|
4
|
+
export declare class ZoomedProjection {
|
|
5
|
+
/** `projection`, then `outer` over `inner` (each a pan and scale) as one move in pixels. */
|
|
6
|
+
static of(projection: StreamingProjection & {
|
|
7
|
+
aspectRatio?: number;
|
|
8
|
+
}, inner: GeoZoomTransform, outer: GeoZoomTransform): StreamingProjection & {
|
|
9
|
+
aspectRatio?: number;
|
|
10
|
+
};
|
|
11
|
+
}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { geoTransform } from 'd3-geo';
|
|
2
|
+
/** A fitted projection with a pan and scale applied to where it puts things, so positions move and zoom while what is drawn at them keeps its size. */
|
|
3
|
+
export class ZoomedProjection {
|
|
4
|
+
/** `projection`, then `outer` over `inner` (each a pan and scale) as one move in pixels. */
|
|
5
|
+
static of(projection, inner, outer) {
|
|
6
|
+
const k = inner.k * outer.k;
|
|
7
|
+
const x = outer.k * inner.x + outer.x;
|
|
8
|
+
const y = outer.k * inner.y + outer.y;
|
|
9
|
+
if (k === 1 && x === 0 && y === 0)
|
|
10
|
+
return projection;
|
|
11
|
+
const move = geoTransform({
|
|
12
|
+
point(px, py) {
|
|
13
|
+
this.stream.point(px * k + x, py * k + y);
|
|
14
|
+
}
|
|
15
|
+
});
|
|
16
|
+
return {
|
|
17
|
+
aspectRatio: projection.aspectRatio,
|
|
18
|
+
invert: projection.invert
|
|
19
|
+
? ([px, py]) => projection.invert([(px - x) / k, (py - y) / k])
|
|
20
|
+
: undefined,
|
|
21
|
+
stream: (sink) => projection.stream(move.stream(sink))
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
}
|