@fundar/data-chart-telling 1.0.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 +53 -0
- package/README.md +58 -19
- package/dist/configuration/config.svelte.d.ts +1 -1
- package/dist/configuration/config.svelte.js +172 -95
- package/dist/configuration/themes/index.d.ts +5 -1304
- package/dist/index.d.ts +24 -14
- package/dist/index.js +20 -10
- package/dist/layout/base/BasePlotLayout.svelte +129 -51
- 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/hover/HoverSettings.d.ts +20 -6
- package/dist/layout/hover/HoverSettings.js +29 -4
- 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 +9 -0
- package/dist/layout/legend/LegendState.svelte.js +24 -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/Plot.svelte +6 -3
- package/dist/layout/plot/PublicPlotContext.d.ts +5 -4
- package/dist/layout/plot/PublicPlotContext.js +7 -3
- package/dist/layout/plot/Slice.d.ts +5 -1
- package/dist/layout/plot/Slice.js +18 -6
- package/dist/layout/scales/EdgeTicks.d.ts +39 -0
- package/dist/layout/scales/EdgeTicks.js +82 -0
- package/dist/layout/scales/NiceTicks.d.ts +43 -0
- package/dist/layout/scales/NiceTicks.js +76 -0
- package/dist/layout/scales/ScalesLayout.svelte +133 -34
- package/dist/layout/scales/ScalesLayout.svelte.d.ts +10 -0
- package/dist/layout/scales/SveltePlotScale.d.ts +15 -0
- package/dist/layout/scales/SveltePlotScale.js +86 -0
- 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 +83 -23
- package/dist/layout/timeline/Timeline.svelte +5 -2
- package/dist/layout/timeline/Timeline.svelte.d.ts +2 -0
- package/dist/layout/timeline/TimelineLayout.svelte +39 -13
- package/dist/layout/timeline/TimelineLayout.svelte.d.ts +7 -5
- package/dist/layout/timeline/TimelineRule.svelte +1 -0
- package/dist/layout/timeline/TimelineState.svelte.d.ts +13 -5
- package/dist/layout/timeline/TimelineState.svelte.js +42 -8
- package/dist/layout/timeline/TimelineTime.d.ts +18 -0
- package/dist/layout/timeline/TimelineTime.js +117 -0
- package/dist/layout/tooltip/Tooltip.svelte +10 -7
- package/dist/layout/tooltip/Tooltip.svelte.d.ts +6 -4
- package/dist/layout/tooltip/TooltipState.svelte.d.ts +8 -2
- package/dist/layout/tooltip/TooltipState.svelte.js +23 -4
- 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/delta/DeltaMarker.svelte +9 -7
- 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 +8 -2
- package/dist/phases/data/DataPhase.d.ts +5 -11
- package/dist/phases/data/DataPhase.js +14 -11
- package/dist/phases/data/PlotAxes.d.ts +10 -0
- package/dist/phases/data/PlotAxes.js +14 -1
- package/dist/phases/facet/FacetPanels.d.ts +55 -0
- package/dist/phases/facet/FacetPanels.js +96 -0
- package/dist/phases/facet/FacetPhase.d.ts +1 -42
- package/dist/phases/facet/FacetPhase.js +1 -87
- package/dist/phases/hover/HoverPhase.d.ts +6 -43
- package/dist/phases/hover/HoverPhase.js +19 -54
- package/dist/phases/mapping/MappingPhase.d.ts +1 -1
- package/dist/phases/mapping/MappingPhase.js +3 -5
- 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.d.ts +1 -3
- package/dist/phases/scales/ScalesPhase.js +37 -27
- package/dist/phases/sharedScales/SharedScalesPhase.d.ts +6 -2
- package/dist/phases/sharedScales/SharedScalesPhase.js +14 -8
- package/dist/phases/statistics/Statistics.d.ts +10 -6
- package/dist/phases/statistics/Statistics.js +20 -10
- package/dist/phases/statistics/StatisticsPhase.js +10 -6
- 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/tooltip/TooltipPhase.d.ts +4 -2
- package/dist/phases/tooltip/TooltipPhase.js +10 -3
- package/dist/phases/transforms/ProcessedPositions.d.ts +30 -0
- package/dist/phases/transforms/ProcessedPositions.js +74 -0
- package/dist/phases/transforms/TransformsPhase.d.ts +5 -42
- package/dist/phases/transforms/TransformsPhase.js +67 -58
- 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 +4 -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 +6 -5
- package/dist/plots/{scatter → correlation/scatter}/markers.d.ts +4 -4
- package/dist/plots/{scatter → correlation/scatter}/markers.js +5 -4
- package/dist/plots/distribution/box/BoxSummaries.d.ts +19 -0
- package/dist/plots/distribution/box/BoxSummaries.js +101 -0
- package/dist/plots/distribution/box/Plot.svelte +42 -0
- package/dist/plots/distribution/box/Plot.svelte.d.ts +26 -0
- package/dist/plots/distribution/box/defaults.d.ts +12 -0
- package/dist/plots/distribution/box/defaults.js +34 -0
- package/dist/plots/distribution/box/markers.d.ts +12 -0
- package/dist/plots/distribution/box/markers.js +34 -0
- 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 +4 -4
- package/dist/plots/{histogram → distribution/histogram}/markers.d.ts +3 -3
- package/dist/plots/{histogram → distribution/histogram}/markers.js +7 -7
- 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 +7 -6
- package/dist/plots/{pyramid → distribution/pyramid}/markers.d.ts +4 -4
- package/dist/plots/{pyramid → distribution/pyramid}/markers.js +8 -11
- 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 +2 -3
- 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 +7 -6
- 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 +5 -5
- package/dist/plots/{geo → map/geo}/phases/markers.d.ts +1 -1
- package/dist/plots/{geo → map/geo}/phases/markers.js +8 -13
- 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 +7 -4
- 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 +17 -15
- package/dist/plots/{bar → ranking/bar}/markers.d.ts +8 -8
- package/dist/plots/{bar → ranking/bar}/markers.js +11 -19
- 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 +287 -132
- package/dist/types/layout/composer.d.ts +5 -2
- 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 +51 -3
- 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 +19 -7
- 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/hover/phase.d.ts +6 -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 +20 -4
- package/dist/types/phases/statistics/phase.d.ts +3 -1
- package/dist/types/phases/statistics/source.d.ts +3 -1
- package/dist/types/phases/transforms/phase.d.ts +32 -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/distribution/box/props.d.ts +10 -0
- package/dist/types/plots/distribution/box/state.d.ts +23 -0
- 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/distribution/density/state.js +1 -0
- package/dist/types/plots/{histogram → distribution/histogram}/props.d.ts +7 -7
- package/dist/types/plots/distribution/histogram/props.js +1 -0
- 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 +3 -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 +39 -8
- package/docs/composer.md +19 -3
- package/docs/concepts.md +1 -1
- package/docs/development.md +14 -5
- package/docs/facets.md +62 -8
- package/docs/getting-started.md +8 -9
- package/docs/legend.md +73 -24
- package/docs/markers.md +45 -32
- 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 -154
- package/docs/scales.md +50 -27
- package/docs/state.md +1 -1
- package/docs/styles-and-segments.md +96 -39
- package/docs/theming.md +33 -19
- package/docs/timeline.md +62 -28
- package/docs/tooltip-and-hover.md +72 -24
- package/docs/transforms-and-statistics.md +56 -25
- package/examples/BarValues.svelte +2 -2
- package/examples/Box.svelte +7 -0
- package/examples/Bullet.svelte +17 -0
- package/examples/Chrome.svelte +17 -0
- package/examples/ChromeOrder.svelte +18 -0
- package/examples/Cleveland.svelte +15 -0
- package/examples/Composer.svelte +23 -0
- package/examples/CustomTooltip.svelte +21 -14
- package/examples/Density.svelte +7 -0
- package/examples/Dumbbell.svelte +16 -0
- package/examples/Facets.svelte +3 -3
- package/examples/FacetsCarousel.svelte +14 -0
- package/examples/FacetsRowsCols.svelte +23 -0
- package/examples/FirstPlot.svelte +7 -0
- package/examples/Forest.svelte +17 -0
- package/examples/Gaps.svelte +21 -0
- package/examples/GroupedBars.svelte +15 -0
- package/examples/Heatmap.svelte +7 -0
- package/examples/HeatmapSegments.svelte +26 -0
- package/examples/Histogram.svelte +14 -0
- package/examples/HorizontalBars.svelte +15 -0
- package/examples/LegendSections.svelte +27 -0
- package/examples/LegendToggle.svelte +3 -3
- package/examples/LineByRegion.svelte +18 -0
- package/examples/LineDates.svelte +15 -0
- package/examples/LineStep.svelte +16 -0
- package/examples/LineStepSegment.svelte +18 -0
- package/examples/Lollipop.svelte +17 -0
- package/examples/Markers.svelte +27 -0
- package/examples/MovingAverage.svelte +15 -0
- package/examples/Pyramid.svelte +14 -0
- package/examples/Regression.svelte +14 -0
- package/examples/ResponsiveLine.svelte +7 -7
- package/examples/Scales.svelte +26 -0
- package/examples/Scatter.svelte +16 -0
- package/examples/SegmentHighlight.svelte +22 -0
- package/examples/Segments.svelte +11 -3
- package/examples/SegmentsBySeries.svelte +25 -0
- package/examples/Slope.svelte +17 -0
- package/examples/Sparkline.svelte +14 -0
- package/examples/StackedArea.svelte +16 -0
- package/examples/StackedBars.svelte +15 -0
- package/examples/TimelinePlayer.svelte +8 -7
- package/examples/TimelineRule.svelte +19 -0
- package/examples/Tooltip.svelte +3 -3
- package/examples/ValueLabels.svelte +21 -0
- 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 +51 -12
- package/llms.txt +60 -4
- package/package.json +12 -2
- package/dist/layout/scales/buildScale.d.ts +0 -8
- package/dist/layout/scales/buildScale.js +0 -67
- package/dist/layout/scales/niceDomain.d.ts +0 -23
- package/dist/layout/scales/niceDomain.js +0 -59
- 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 -12
- /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/geo/props.js → layout/styles/gaps.js} +0 -0
- /package/dist/types/{plots/geo/state.js → layout/styles/geo.js} +0 -0
- /package/dist/types/{plots/heatmap/props.js → layout/styles/values.js} +0 -0
- /package/dist/types/{plots/heatmap/state.js → markers/axis/violin.js} +0 -0
- /package/dist/types/{plots/histogram/props.js → markers/channels/commonMarkerConfigWithRowOffset.js} +0 -0
- /package/dist/types/plots/{line → correlation/heatmap}/props.js +0 -0
- /package/dist/types/plots/{histogram → correlation/heatmap}/state.js +0 -0
- /package/dist/types/plots/{pyramid → correlation/scatter}/props.js +0 -0
- /package/dist/types/plots/{line → correlation/scatter}/state.js +0 -0
- /package/dist/types/plots/{scatter → distribution/box}/props.js +0 -0
- /package/dist/types/plots/{pyramid → distribution/box}/state.js +0 -0
- /package/dist/types/plots/{scatter/state.js → distribution/density/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,11 +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
|
|
4
|
-
export { default as
|
|
5
|
-
export { default as
|
|
6
|
-
export { default as
|
|
7
|
-
export { default as
|
|
8
|
-
export { default as
|
|
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';
|
|
9
19
|
export { default as PlotComposer } from './layout/composer/PlotComposer.svelte';
|
|
10
20
|
export { default as GridCell } from './layout/grid/GridCell.svelte';
|
|
11
21
|
export { default as Plot } from './layout/plot/Plot.svelte';
|
|
@@ -20,20 +30,20 @@ export type { ThemeName } from './configuration/themes';
|
|
|
20
30
|
export { groupBy, buildSeries } from './utils/grouping';
|
|
21
31
|
export { makeColorScale, resolveColorScale, normalize, resolveCssColor, paletteColor, contrastTextColor, contrastRatio } from './utils/color';
|
|
22
32
|
export { Margins } from './layout/margins/Margins';
|
|
23
|
-
export { resolveOpacityScale } from './utils/
|
|
24
|
-
export { resolveSymbolScale } from './utils/
|
|
33
|
+
export { resolveOpacityScale } from './utils/OpacityScale';
|
|
34
|
+
export { resolveSymbolScale } from './utils/SymbolScale';
|
|
25
35
|
export { Statistics } from './phases/statistics/Statistics';
|
|
26
36
|
export type { AxisValue, ChannelValue, ChannelName, AxisChannelName, IndependentChannelName, SizeChannelName, ChannelAccessors } from './types/layout/mapping';
|
|
27
37
|
export type { AxisScale, AxisBasedScalesConfig, ChannelScalesConfig } from './types/layout/scales';
|
|
28
38
|
export type { Accessor, Series, SeriesProps, DataProps } from './types/plots/data/common';
|
|
29
39
|
export type { BasePlotProps, PlotCoreProps, PlotChromeProps, FigureBoxProps, SegmentsConfig, ScalesConfig, MarginConfig, TooltipConfig, HoverConfig } from './types/plots/props';
|
|
30
|
-
export type { AxisBasedStylesConfig, GapsAwarePlotStylesConfig, GeoStylesConfig, GeoTileLayerConfig } from './types/layout/styles';
|
|
40
|
+
export type { AxisBasedStylesConfig, ConnectorBasedStylesConfig, BulletStylesConfig, GapsAwarePlotStylesConfig, CurveAwarePlotStylesConfig, GeoStylesConfig, GeoTileLayerConfig } from './types/layout/styles';
|
|
31
41
|
export type { GapsConfig } from './types/plots/gaps';
|
|
32
42
|
export type { LineSegmentStyle, BarSegmentStyle, CellSegmentStyle, GeoSegmentStyle, ScatterSegmentStyle } from './types/plots/segments/common';
|
|
33
43
|
export type { Range, Area, Segment } from './types/plots/segments/config';
|
|
34
44
|
export type { SymbolType } from './types/plots/constants';
|
|
35
45
|
export type { FontStyle, StrokeStyle, DotStyle, AreaStyle } from './types/plots/styling';
|
|
36
|
-
export type { AxisBasedMarkersConfig, BrushSelection
|
|
46
|
+
export type { AxisBasedMarkersConfig, BrushSelection } from './types/markers/common';
|
|
37
47
|
export type { StatisticConfig } from './types/layout/statistics';
|
|
38
48
|
export type * from './types/transforms';
|
|
39
49
|
export type { GeoFeature, GeoJsonInput, GeoDataProps, Topology } from './types/plots/data/geo';
|
|
@@ -41,10 +51,10 @@ export type { GeoCustomProjection, GeoCustomProjectionFactory, GeoScalesConfig,
|
|
|
41
51
|
export type { GeoCameraConfig } from './types/plots/camera';
|
|
42
52
|
export type { GeoMarkersConfig } from './types/markers/geo';
|
|
43
53
|
export type { SharedAxisValues } from './types/phases';
|
|
44
|
-
export type {
|
|
54
|
+
export type { TimelineConfig, TimelineType, TimelineCallbacks, PlayerConfig, PlayerControl } from './types/layout/timeline';
|
|
45
55
|
export type { ComposerLayout, ComposerTags, ComposerTimelineConfig, ComposerHoverConfig } from './types/layout/composer';
|
|
46
56
|
export type { GridPlacement, GridInset, GridCellContext, GridCellSnippet } from './types/layout/grid';
|
|
47
57
|
export type { Responsive, FacetConfig, FacetCellContext, FacetIndicatorContext, FacetIndicatorSnippet, FacetNavDirection, FacetNavContext, FacetNavSnippet } from './types/layout/facet';
|
|
48
58
|
export type { LegendSection, DiscreteLegendSection, ContinuousLegendSection, LegendItem, LegendNavDirection, LegendNavContext, LegendNavSnippet, LegendEntry, LegendMark, LegendRange } from './types/layout/legend';
|
|
49
59
|
export type { HoverStrategy, HoverPoint, HoverDisplayPoint } from './types/layout/hover';
|
|
50
|
-
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,14 +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
|
|
7
|
-
export { default as
|
|
8
|
-
export { default as
|
|
9
|
-
export { default as
|
|
10
|
-
export { default as
|
|
11
|
-
export { default as
|
|
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';
|
|
12
22
|
// ── Composition ─────────────────────────────────────────────────────────────
|
|
13
23
|
// Separate plots combined into one figure, with chrome of its own.
|
|
14
24
|
export { default as PlotComposer } from './layout/composer/PlotComposer.svelte';
|
|
@@ -26,6 +36,6 @@ export { SYSTEM_FONT } from './configuration/fonts';
|
|
|
26
36
|
export { groupBy, buildSeries } from './utils/grouping';
|
|
27
37
|
export { makeColorScale, resolveColorScale, normalize, resolveCssColor, paletteColor, contrastTextColor, contrastRatio } from './utils/color';
|
|
28
38
|
export { Margins } from './layout/margins/Margins';
|
|
29
|
-
export { resolveOpacityScale } from './utils/
|
|
30
|
-
export { resolveSymbolScale } from './utils/
|
|
39
|
+
export { resolveOpacityScale } from './utils/OpacityScale';
|
|
40
|
+
export { resolveSymbolScale } from './utils/SymbolScale';
|
|
31
41
|
export { Statistics } from './phases/statistics/Statistics';
|
|
@@ -1,55 +1,19 @@
|
|
|
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';
|
|
11
|
+
import { SvelteMap } from 'svelte/reactivity';
|
|
49
12
|
import type { ComponentProps, Snippet } from 'svelte';
|
|
50
13
|
import { Plot, Pointer, setPlotDefaults } from 'svelteplot';
|
|
51
14
|
import { getConfiguration } from '../../configuration/config.svelte';
|
|
52
|
-
import {
|
|
15
|
+
import { SveltePlotScale } from '../scales/SveltePlotScale';
|
|
16
|
+
import { TickLabels } from '../scales/TickLabels';
|
|
53
17
|
import ScalesLayout from '../scales/ScalesLayout.svelte';
|
|
54
18
|
import GeometryLayout from '../geometry/GeometryLayout.svelte';
|
|
55
19
|
import CoordinatesLayout from '../coordinates/CoordinatesLayout.svelte';
|
|
@@ -58,7 +22,6 @@
|
|
|
58
22
|
import { PlotHover } from '../hover/PlotHover.svelte';
|
|
59
23
|
import { PlotContext } from '../plot/PlotContext';
|
|
60
24
|
import { TimelineState } from '../timeline/TimelineState.svelte';
|
|
61
|
-
import type { PlotAxes } from '../../phases/data/PlotAxes';
|
|
62
25
|
import type { AxisBasedScalesConfig } from '../../types/layout/scales';
|
|
63
26
|
import type { AxisValue } from '../../types/layout/mapping';
|
|
64
27
|
import type { CoordinatesConfig, GeoScalesConfig } from '../../types/layout/coordinates';
|
|
@@ -141,7 +104,9 @@
|
|
|
141
104
|
// What this plot draws, on its figure's legend - its series, their colors and marks.
|
|
142
105
|
const legend = LegendState.current();
|
|
143
106
|
const legendSource = Symbol('plot');
|
|
107
|
+
const silenced = LegendState.isSilenced();
|
|
144
108
|
$effect(() => {
|
|
109
|
+
if (silenced) return;
|
|
145
110
|
const entries = LegendState.entriesOf(state as never);
|
|
146
111
|
untrack(() => legend?.register(legendSource, entries));
|
|
147
112
|
});
|
|
@@ -161,16 +126,91 @@
|
|
|
161
126
|
numberFormat: { useGrouping: 'min2', compactDisplay: untrack(() => cfg.axis.compactDisplay) }
|
|
162
127
|
});
|
|
163
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
|
+
|
|
164
203
|
// Created once: this plot's margins, grown to fit the labels its markers report.
|
|
165
204
|
const plotMargins = new PlotMargins({
|
|
166
205
|
theme: () => cfg.margins,
|
|
167
206
|
author: () => margins,
|
|
168
|
-
estimate: () =>
|
|
207
|
+
estimate: () => marginEstimate,
|
|
169
208
|
reserve: () => state.valueLabels?.reach ?? [],
|
|
170
209
|
size: () => ({ width, height }),
|
|
171
210
|
resetKey: () => state.resolvedSeries,
|
|
172
|
-
scales: () =>
|
|
211
|
+
scales: () => layoutScales,
|
|
173
212
|
tickFontSize: () => cfg.axis.fontSize,
|
|
213
|
+
tickWidth: () => ({ x: tickLayout?.x?.width }),
|
|
174
214
|
settle: (settled) => (margins = settled)
|
|
175
215
|
});
|
|
176
216
|
const numericMargins = $derived(plotMargins.numeric);
|
|
@@ -187,9 +227,37 @@
|
|
|
187
227
|
size: () => ({ width, height })
|
|
188
228
|
});
|
|
189
229
|
|
|
190
|
-
|
|
191
|
-
const
|
|
192
|
-
|
|
230
|
+
/** The domains `ScalesLayout` widens an axis to, for an edge tick's `'extend'` (see `EdgeTicks`). */
|
|
231
|
+
const edgeDomains = new SvelteMap<'x' | 'y', [number, number]>();
|
|
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
|
+
|
|
246
|
+
// `SveltePlotScale.build` already left only svelteplot's own scale options.
|
|
247
|
+
const resolvedX = $derived.by(() => {
|
|
248
|
+
const built = SveltePlotScale.build(layoutScales?.x, data, getX);
|
|
249
|
+
const domain = edgeDomains.get('x');
|
|
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'];
|
|
253
|
+
});
|
|
254
|
+
const resolvedY = $derived.by(() => {
|
|
255
|
+
const built = SveltePlotScale.build(scales?.y, data, getY);
|
|
256
|
+
const domain = edgeDomains.get('y');
|
|
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'];
|
|
260
|
+
});
|
|
193
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`. */
|
|
194
262
|
const resolvedR = $derived(scales?.r as SveltePlotProps['r']);
|
|
195
263
|
/** Threaded straight into svelteplot's own `length` scale option - see `LengthScaleConfig`'s own doc comment. `GeoPlot`-only in practice (see `scales`'s own doc comment), same mechanism as `r`. */
|
|
@@ -248,18 +316,27 @@
|
|
|
248
316
|
locale={cfg.axis.locale}
|
|
249
317
|
{data}
|
|
250
318
|
{containerEl}
|
|
251
|
-
remountKey={plotMargins.remountKey}
|
|
252
319
|
>
|
|
253
320
|
<StylesLayout styles={state.styles} {width} {height} {numericMargins} />
|
|
254
321
|
<!-- Axes for every kind but GeoPlot. -->
|
|
255
322
|
{#if scales !== undefined && coordinates === undefined}
|
|
256
|
-
<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
|
+
/>
|
|
257
335
|
{/if}
|
|
258
336
|
<GeometryLayout
|
|
259
337
|
markers={resolvedMarkers}
|
|
260
338
|
seriesData={seriesData ?? []}
|
|
261
339
|
scopedGroups={scopedGroups ?? []}
|
|
262
|
-
channelScales={scales}
|
|
263
340
|
{ctrl}
|
|
264
341
|
{width}
|
|
265
342
|
{height}
|
|
@@ -295,8 +372,9 @@
|
|
|
295
372
|
visible={ctrl.showTooltip && ctrl.tooltipPosition != null}
|
|
296
373
|
x={ctrl.tooltipPosition?.x ?? 0}
|
|
297
374
|
y={ctrl.tooltipPosition?.y ?? 0}
|
|
298
|
-
rows={ctrl.matchedRows.map((p) => p.row)}
|
|
375
|
+
rows={ctrl.matchedRows.map((p) => ({ ...p.row, seriesColor: p.color }))}
|
|
299
376
|
format={hover.tooltip.format}
|
|
377
|
+
sort={hover.tooltip.sort}
|
|
300
378
|
content={hover.tooltip.content}
|
|
301
379
|
anchorX={hover.tooltip.anchorX}
|
|
302
380
|
anchorY={hover.tooltip.anchorY}
|
|
@@ -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
|
+
}
|