@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
|
@@ -1,28 +1,4 @@
|
|
|
1
1
|
import { maybeSymbol } from 'svelteplot/helpers/symbols.js';
|
|
2
|
-
/**
|
|
3
|
-
* Resolves a {@link SymbolScaleConfig} into a `value => shape` function -
|
|
4
|
-
* always a discrete category lookup, unlike every other channel here (there's
|
|
5
|
-
* no continuous case for a shape). Resolves to a plain shape-name string,
|
|
6
|
-
* which svelteplot recognizes as a literal and renders as-is - safe to hand
|
|
7
|
-
* straight to a per-row accessor, unlike `resolveOpacityScale`'s output.
|
|
8
|
-
* `defaultRange` mirrors `resolveOpacityScale`'s own required (not defaulted)
|
|
9
|
-
* parameter - callers pass the theme's own `cfg.symbols` rather than this
|
|
10
|
-
* module hardcoding a second copy of the default cycle.
|
|
11
|
-
*/
|
|
12
|
-
export function resolveSymbolScale(config, computedDomain, defaultRange) {
|
|
13
|
-
const domain = config?.domain ?? computedDomain ?? [];
|
|
14
|
-
const range = config?.range ?? defaultRange;
|
|
15
|
-
const unknown = config?.unknown ?? 'circle';
|
|
16
|
-
if (typeof range === 'object' && !Array.isArray(range)) {
|
|
17
|
-
return (v) => (v == null ? unknown : (range[String(v)] ?? unknown));
|
|
18
|
-
}
|
|
19
|
-
return (v) => {
|
|
20
|
-
if (v == null || !domain.length)
|
|
21
|
-
return unknown;
|
|
22
|
-
const idx = domain.indexOf(String(v));
|
|
23
|
-
return idx < 0 ? unknown : range[idx % range.length];
|
|
24
|
-
};
|
|
25
|
-
}
|
|
26
2
|
/**
|
|
27
3
|
* A symbol's SVG path, as svelteplot's `dot` mark draws it: the same
|
|
28
4
|
* d3-shape symbol, sized to the area of a circle of the given radius.
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { SymbolScaleConfig } from '../types/layout/scales';
|
|
2
|
+
import type { SymbolType } from '../types/plots/constants';
|
|
3
|
+
/** A value of the symbol channel mapped to a shape. */
|
|
4
|
+
export declare class SymbolScale {
|
|
5
|
+
/**
|
|
6
|
+
* Resolves a {@link SymbolScaleConfig} into a `value => shape` function -
|
|
7
|
+
* always a discrete category lookup, unlike every other channel here (there's
|
|
8
|
+
* no continuous case for a shape). Resolves to a plain shape-name string,
|
|
9
|
+
* which svelteplot recognizes as a literal and renders as-is - safe to hand
|
|
10
|
+
* straight to a per-row accessor, unlike `OpacityScale.resolve`'s output.
|
|
11
|
+
* `defaultRange` mirrors `OpacityScale.resolve`'s own required (not defaulted)
|
|
12
|
+
* parameter - callers pass the theme's own `cfg.symbols` rather than this
|
|
13
|
+
* module hardcoding a second copy of the default cycle.
|
|
14
|
+
*/
|
|
15
|
+
static resolve(config: SymbolScaleConfig | undefined, computedDomain: string[] | undefined, defaultRange: SymbolType[]): (value: unknown) => SymbolType;
|
|
16
|
+
}
|
|
17
|
+
/** The package's public function name, over {@link SymbolScale.resolve}. */
|
|
18
|
+
export declare const resolveSymbolScale: typeof SymbolScale.resolve;
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/** A value of the symbol channel mapped to a shape. */
|
|
2
|
+
export class SymbolScale {
|
|
3
|
+
/**
|
|
4
|
+
* Resolves a {@link SymbolScaleConfig} into a `value => shape` function -
|
|
5
|
+
* always a discrete category lookup, unlike every other channel here (there's
|
|
6
|
+
* no continuous case for a shape). Resolves to a plain shape-name string,
|
|
7
|
+
* which svelteplot recognizes as a literal and renders as-is - safe to hand
|
|
8
|
+
* straight to a per-row accessor, unlike `OpacityScale.resolve`'s output.
|
|
9
|
+
* `defaultRange` mirrors `OpacityScale.resolve`'s own required (not defaulted)
|
|
10
|
+
* parameter - callers pass the theme's own `cfg.symbols` rather than this
|
|
11
|
+
* module hardcoding a second copy of the default cycle.
|
|
12
|
+
*/
|
|
13
|
+
static resolve(config, computedDomain, defaultRange) {
|
|
14
|
+
const domain = config?.domain ?? computedDomain ?? [];
|
|
15
|
+
const range = config?.range ?? defaultRange;
|
|
16
|
+
const unknown = config?.unknown ?? 'circle';
|
|
17
|
+
if (typeof range === 'object' && !Array.isArray(range)) {
|
|
18
|
+
return (v) => (v == null ? unknown : (range[String(v)] ?? unknown));
|
|
19
|
+
}
|
|
20
|
+
return (v) => {
|
|
21
|
+
if (v == null || !domain.length)
|
|
22
|
+
return unknown;
|
|
23
|
+
const idx = domain.indexOf(String(v));
|
|
24
|
+
return idx < 0 ? unknown : range[idx % range.length];
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
/** The package's public function name, over {@link SymbolScale.resolve}. */
|
|
29
|
+
export const resolveSymbolScale = SymbolScale.resolve;
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import type { ColorScaleConfig } from '../../types/layout/scales';
|
|
2
|
+
import type { PlotStylesConfig } from '../../types/configuration/styling';
|
|
3
|
+
/** A value mapped to a color: a continuous ramp between colors, or a color per category. */
|
|
4
|
+
export declare class ColorRamp {
|
|
5
|
+
/** `{turbo: interpolateTurbo, blues: interpolateBlues, ...}`, built from every `interpolate*` d3-scale-chromatic export. */
|
|
6
|
+
static readonly NAMED: Readonly<Record<string, (t: number) => string>>;
|
|
7
|
+
/** Linearly maps `v` from `[min, max]` onto `[0, 1]`, clamped at both ends. */
|
|
8
|
+
static normalize(v: number, min: number, max: number): number;
|
|
9
|
+
/** A simple 2-color continuous ramp over `[min, max]`. */
|
|
10
|
+
static between(min: number, max: number, colorMin: string, colorMax: string): (v: number) => string;
|
|
11
|
+
/**
|
|
12
|
+
* Resolves a {@link ColorScaleConfig} into a `value => color` function - the
|
|
13
|
+
* one shared implementation for every level the config can appear at
|
|
14
|
+
* (`scales.color`, a `segments` entry, a marker's own `scales`).
|
|
15
|
+
* `computedDomain` is the fallback when `config.domain` is unset;
|
|
16
|
+
* `defaultScheme` is used when `config.scheme` is unset - the theme's own
|
|
17
|
+
* 2-color continuous ramp, or a discrete palette for a categorical domain
|
|
18
|
+
* (e.g. per-series identity colors).
|
|
19
|
+
*/
|
|
20
|
+
static resolve(config: ColorScaleConfig | undefined, computedDomain: [number, number] | string[] | undefined, defaultScheme: NonNullable<ColorScaleConfig['scheme']>): (value: unknown) => string;
|
|
21
|
+
/**
|
|
22
|
+
* A numeric value as a color, through the configuration's default continuous ramp
|
|
23
|
+
* (a named `scheme`, else the colors `min` and `max`) unless `own` sets a scheme of its
|
|
24
|
+
* own. The configuration's `schemeRange` only trims the ramp it names.
|
|
25
|
+
*/
|
|
26
|
+
static continuous(cfg: Pick<PlotStylesConfig, 'continuous'>, own: ColorScaleConfig | undefined, domain: [number, number]): (value: unknown) => string;
|
|
27
|
+
}
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
import { interpolateRgb, piecewise } from 'd3-interpolate';
|
|
2
|
+
import * as d3Chromatic from 'd3-scale-chromatic';
|
|
3
|
+
import { CssColor } from './CssColor';
|
|
4
|
+
/** A value mapped to a color: a continuous ramp between colors, or a color per category. */
|
|
5
|
+
export class ColorRamp {
|
|
6
|
+
/** `{turbo: interpolateTurbo, blues: interpolateBlues, ...}`, built from every `interpolate*` d3-scale-chromatic export. */
|
|
7
|
+
static NAMED = Object.fromEntries(Object.entries(d3Chromatic)
|
|
8
|
+
.filter((entry) => entry[0].startsWith('interpolate'))
|
|
9
|
+
.map(([name, fn]) => [name.slice('interpolate'.length).toLowerCase(), fn]));
|
|
10
|
+
/** Linearly maps `v` from `[min, max]` onto `[0, 1]`, clamped at both ends. */
|
|
11
|
+
static normalize(v, min, max) {
|
|
12
|
+
if (v == null)
|
|
13
|
+
return 0;
|
|
14
|
+
const denom = max - min || 1;
|
|
15
|
+
return Math.max(0, Math.min(1, (v - min) / denom));
|
|
16
|
+
}
|
|
17
|
+
/** A simple 2-color continuous ramp over `[min, max]`. */
|
|
18
|
+
static between(min, max, colorMin, colorMax) {
|
|
19
|
+
let interpolator;
|
|
20
|
+
try {
|
|
21
|
+
interpolator = interpolateRgb(CssColor.resolve(colorMin), CssColor.resolve(colorMax));
|
|
22
|
+
}
|
|
23
|
+
catch {
|
|
24
|
+
return () => '#ccc';
|
|
25
|
+
}
|
|
26
|
+
return (v) => {
|
|
27
|
+
if (v == null)
|
|
28
|
+
return '#ccc';
|
|
29
|
+
return interpolator(ColorRamp.normalize(v, min, max));
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Resolves a {@link ColorScaleConfig} into a `value => color` function - the
|
|
34
|
+
* one shared implementation for every level the config can appear at
|
|
35
|
+
* (`scales.color`, a `segments` entry, a marker's own `scales`).
|
|
36
|
+
* `computedDomain` is the fallback when `config.domain` is unset;
|
|
37
|
+
* `defaultScheme` is used when `config.scheme` is unset - the theme's own
|
|
38
|
+
* 2-color continuous ramp, or a discrete palette for a categorical domain
|
|
39
|
+
* (e.g. per-series identity colors).
|
|
40
|
+
*/
|
|
41
|
+
static resolve(config, computedDomain, defaultScheme) {
|
|
42
|
+
const domain = config?.domain ?? computedDomain;
|
|
43
|
+
const scheme = config?.scheme ?? defaultScheme;
|
|
44
|
+
const unknown = config?.unknown ?? '#ccc';
|
|
45
|
+
if (!domain || domain.length === 0)
|
|
46
|
+
return () => unknown;
|
|
47
|
+
// A category → color map always resolves by direct lookup, regardless of domain shape.
|
|
48
|
+
if (typeof scheme === 'object' && !Array.isArray(scheme)) {
|
|
49
|
+
return (v) => (v == null ? unknown : (scheme[String(v)] ?? unknown));
|
|
50
|
+
}
|
|
51
|
+
// A named d3-scale-chromatic ramp (e.g. 'turbo') resolves straight to its own interpolator.
|
|
52
|
+
const namedInterpolator = typeof scheme === 'string' ? ColorRamp.NAMED[scheme.toLowerCase()] : undefined;
|
|
53
|
+
if (typeof scheme === 'string' && !namedInterpolator)
|
|
54
|
+
return () => unknown;
|
|
55
|
+
const [from, to] = config?.schemeRange ?? [0, 1];
|
|
56
|
+
const named = namedInterpolator && ((t) => namedInterpolator(from + t * (to - from)));
|
|
57
|
+
const resolvedScheme = namedInterpolator
|
|
58
|
+
? undefined
|
|
59
|
+
: scheme.map(CssColor.resolve);
|
|
60
|
+
if (resolvedScheme && resolvedScheme.length === 0)
|
|
61
|
+
return () => unknown;
|
|
62
|
+
if (resolvedScheme && resolvedScheme.length === 1) {
|
|
63
|
+
const only = resolvedScheme[0];
|
|
64
|
+
return () => only;
|
|
65
|
+
}
|
|
66
|
+
// Categorical domain (explicit category list): sample the ramp evenly, one stop per category.
|
|
67
|
+
if (typeof domain[0] === 'string') {
|
|
68
|
+
const categories = domain;
|
|
69
|
+
const swatches = resolvedScheme ??
|
|
70
|
+
categories.map((_, i) => named(categories.length > 1 ? i / (categories.length - 1) : 0));
|
|
71
|
+
return (v) => {
|
|
72
|
+
if (v == null)
|
|
73
|
+
return unknown;
|
|
74
|
+
const idx = categories.indexOf(String(v));
|
|
75
|
+
return idx < 0 ? unknown : swatches[idx % swatches.length];
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
// Continuous domain: interpolate smoothly across every scheme stop (or the named ramp directly).
|
|
79
|
+
const [lo, hi] = domain;
|
|
80
|
+
let interpolator;
|
|
81
|
+
if (namedInterpolator) {
|
|
82
|
+
interpolator = named;
|
|
83
|
+
}
|
|
84
|
+
else {
|
|
85
|
+
try {
|
|
86
|
+
interpolator = piecewise(interpolateRgb, resolvedScheme);
|
|
87
|
+
}
|
|
88
|
+
catch {
|
|
89
|
+
return () => unknown;
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
const pivot = config?.pivot;
|
|
93
|
+
const stopCount = resolvedScheme?.length ?? Infinity;
|
|
94
|
+
return (v) => {
|
|
95
|
+
if (v == null)
|
|
96
|
+
return unknown;
|
|
97
|
+
const n = Number(v);
|
|
98
|
+
if (Number.isNaN(n))
|
|
99
|
+
return unknown;
|
|
100
|
+
const t = pivot != null && stopCount >= 3
|
|
101
|
+
? n <= pivot
|
|
102
|
+
? 0.5 * ColorRamp.normalize(n, lo, pivot)
|
|
103
|
+
: 0.5 + 0.5 * ColorRamp.normalize(n, pivot, hi)
|
|
104
|
+
: ColorRamp.normalize(n, lo, hi);
|
|
105
|
+
return interpolator(t);
|
|
106
|
+
};
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* A numeric value as a color, through the configuration's default continuous ramp
|
|
110
|
+
* (a named `scheme`, else the colors `min` and `max`) unless `own` sets a scheme of its
|
|
111
|
+
* own. The configuration's `schemeRange` only trims the ramp it names.
|
|
112
|
+
*/
|
|
113
|
+
static continuous(cfg, own, domain) {
|
|
114
|
+
const { scheme, schemeRange, min, max } = cfg.continuous;
|
|
115
|
+
const config = own?.scheme === undefined && scheme && schemeRange
|
|
116
|
+
? { ...own, schemeRange: own?.schemeRange ?? schemeRange }
|
|
117
|
+
: own;
|
|
118
|
+
return ColorRamp.resolve({ ...config, domain }, domain, scheme ?? [min, max]);
|
|
119
|
+
}
|
|
120
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
type Rgb = [number, number, number];
|
|
2
|
+
/** A CSS color string: read into its red, green and blue, and judged against another by WCAG contrast. */
|
|
3
|
+
export declare class CssColor {
|
|
4
|
+
#private;
|
|
5
|
+
/** Resolves a `var(--x)` reference to its computed value; any other CSS color string passes through unchanged. */
|
|
6
|
+
static resolve(color: string): string;
|
|
7
|
+
/** Parses any CSS color syntax (hex, rgb(), oklch(), named colors, hsl(), ...) into an `[r, g, b]` (0-255) triple, or `null` if it can't be resolved. */
|
|
8
|
+
static parse(color: string): Rgb | null;
|
|
9
|
+
/** WCAG contrast ratio between two colors, from 1 (no contrast) to 21 (black on white). */
|
|
10
|
+
static contrastRatio(colorA: string, colorB: string): number;
|
|
11
|
+
/**
|
|
12
|
+
* The `candidates` entry with the highest WCAG contrast ratio against
|
|
13
|
+
* `background`. Defaults to plain white/black; pass a grayscale or other
|
|
14
|
+
* palette to widen the choice. Falls back to the first candidate when
|
|
15
|
+
* `background` can't be parsed.
|
|
16
|
+
*/
|
|
17
|
+
static contrastText(background: string, candidates?: string[]): string;
|
|
18
|
+
}
|
|
19
|
+
export {};
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
import { isBrowser } from '../../stores/device';
|
|
2
|
+
/** A CSS color string: read into its red, green and blue, and judged against another by WCAG contrast. */
|
|
3
|
+
export class CssColor {
|
|
4
|
+
/** Resolves a `var(--x)` reference to its computed value; any other CSS color string passes through unchanged. */
|
|
5
|
+
static resolve(color) {
|
|
6
|
+
if (!isBrowser)
|
|
7
|
+
return color;
|
|
8
|
+
if (!color.startsWith('var('))
|
|
9
|
+
return color;
|
|
10
|
+
const varName = color.slice(4, -1).trim();
|
|
11
|
+
const value = getComputedStyle(document.documentElement).getPropertyValue(varName).trim();
|
|
12
|
+
return value || color;
|
|
13
|
+
}
|
|
14
|
+
/** Parses any CSS color syntax (hex, rgb(), oklch(), named colors, hsl(), ...) into an `[r, g, b]` (0-255) triple, or `null` if it can't be resolved. */
|
|
15
|
+
static parse(color) {
|
|
16
|
+
const hex = /^#([0-9a-f]{3}|[0-9a-f]{6})$/i.exec(color.trim());
|
|
17
|
+
if (hex) {
|
|
18
|
+
const digits = hex[1].length === 3
|
|
19
|
+
? hex[1]
|
|
20
|
+
.split('')
|
|
21
|
+
.map((c) => c + c)
|
|
22
|
+
.join('')
|
|
23
|
+
: hex[1];
|
|
24
|
+
const num = parseInt(digits, 16);
|
|
25
|
+
return [(num >> 16) & 255, (num >> 8) & 255, num & 255];
|
|
26
|
+
}
|
|
27
|
+
const rgb = /^rgba?\(\s*([\d.]+)\s*,\s*([\d.]+)\s*,\s*([\d.]+)/i.exec(color);
|
|
28
|
+
if (rgb)
|
|
29
|
+
return [Number(rgb[1]), Number(rgb[2]), Number(rgb[3])];
|
|
30
|
+
const oklch = CssColor.#parseOklch(color);
|
|
31
|
+
if (oklch)
|
|
32
|
+
return oklch;
|
|
33
|
+
// Named colors, hsl(), and any other CSS color syntax: resolved to
|
|
34
|
+
// `rgb(...)` via the browser's computed style, then reparsed.
|
|
35
|
+
if (!isBrowser)
|
|
36
|
+
return null;
|
|
37
|
+
const el = document.createElement('div');
|
|
38
|
+
el.style.color = color;
|
|
39
|
+
document.body.appendChild(el);
|
|
40
|
+
const computed = getComputedStyle(el).color;
|
|
41
|
+
document.body.removeChild(el);
|
|
42
|
+
if (!computed || computed === color)
|
|
43
|
+
return null;
|
|
44
|
+
return CssColor.parse(computed);
|
|
45
|
+
}
|
|
46
|
+
/** WCAG contrast ratio between two colors, from 1 (no contrast) to 21 (black on white). */
|
|
47
|
+
static contrastRatio(colorA, colorB) {
|
|
48
|
+
const a = CssColor.parse(CssColor.resolve(colorA));
|
|
49
|
+
const b = CssColor.parse(CssColor.resolve(colorB));
|
|
50
|
+
if (!a || !b)
|
|
51
|
+
return 1;
|
|
52
|
+
const lA = CssColor.#luminance(a);
|
|
53
|
+
const lB = CssColor.#luminance(b);
|
|
54
|
+
return (Math.max(lA, lB) + 0.05) / (Math.min(lA, lB) + 0.05);
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* The `candidates` entry with the highest WCAG contrast ratio against
|
|
58
|
+
* `background`. Defaults to plain white/black; pass a grayscale or other
|
|
59
|
+
* palette to widen the choice. Falls back to the first candidate when
|
|
60
|
+
* `background` can't be parsed.
|
|
61
|
+
*/
|
|
62
|
+
static contrastText(background, candidates = ['#ffffff', '#000000']) {
|
|
63
|
+
if (candidates.length === 0)
|
|
64
|
+
return '#000000';
|
|
65
|
+
let best = candidates[0];
|
|
66
|
+
let bestRatio = -Infinity;
|
|
67
|
+
for (const candidate of candidates) {
|
|
68
|
+
const ratio = CssColor.contrastRatio(background, candidate);
|
|
69
|
+
if (ratio > bestRatio) {
|
|
70
|
+
bestRatio = ratio;
|
|
71
|
+
best = candidate;
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
return best;
|
|
75
|
+
}
|
|
76
|
+
static #luminance([r, g, b]) {
|
|
77
|
+
const [rs, gs, bs] = [r, g, b].map((c) => {
|
|
78
|
+
const s = c / 255;
|
|
79
|
+
return s <= 0.03928 ? s / 12.92 : Math.pow((s + 0.055) / 1.055, 2.4);
|
|
80
|
+
});
|
|
81
|
+
return 0.2126 * rs + 0.7152 * gs + 0.0722 * bs;
|
|
82
|
+
}
|
|
83
|
+
static #linearToSrgb8(c) {
|
|
84
|
+
const s = c <= 0.0031308 ? 12.92 * c : 1.055 * Math.pow(c, 1 / 2.4) - 0.055;
|
|
85
|
+
return Math.max(0, Math.min(1, s)) * 255;
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Parses `oklch(L C H)` directly instead of round-tripping through the
|
|
89
|
+
* browser's computed style: Chromium/Firefox serialize computed oklch()
|
|
90
|
+
* values back as oklch() (not rgb()), so the generic browser-fallback in
|
|
91
|
+
* {@link CssColor.parse} sees an unchanged string on the second pass and its
|
|
92
|
+
* infinite-loop guard mistakes that for a parse failure.
|
|
93
|
+
*/
|
|
94
|
+
static #parseOklch(color) {
|
|
95
|
+
const match = /^oklch\(\s*([\d.]+)(%)?\s+([\d.]+)\s+([\d.]+)/i.exec(color.trim());
|
|
96
|
+
if (!match)
|
|
97
|
+
return null;
|
|
98
|
+
const L = match[2] ? Number(match[1]) / 100 : Number(match[1]);
|
|
99
|
+
const C = Number(match[3]);
|
|
100
|
+
const H = (Number(match[4]) * Math.PI) / 180;
|
|
101
|
+
const a = C * Math.cos(H);
|
|
102
|
+
const b = C * Math.sin(H);
|
|
103
|
+
const l_ = L + 0.3963377774 * a + 0.2158037573 * b;
|
|
104
|
+
const m_ = L - 0.1055613458 * a - 0.0638541728 * b;
|
|
105
|
+
const s_ = L - 0.0894841775 * a - 1.291485548 * b;
|
|
106
|
+
const l = l_ ** 3;
|
|
107
|
+
const m = m_ ** 3;
|
|
108
|
+
const s = s_ ** 3;
|
|
109
|
+
const r = 4.0767416621 * l - 3.3077115913 * m + 0.2309699292 * s;
|
|
110
|
+
const g = -1.2684380046 * l + 2.6097574011 * m - 0.3413193965 * s;
|
|
111
|
+
const bl = -0.0041960863 * l - 0.7034186147 * m + 1.707614701 * s;
|
|
112
|
+
return [CssColor.#linearToSrgb8(r), CssColor.#linearToSrgb8(g), CssColor.#linearToSrgb8(bl)];
|
|
113
|
+
}
|
|
114
|
+
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type { PaletteInput } from '../../types/configuration/styling';
|
|
2
|
+
/** The categorical palette of a configuration, as a list of colors. */
|
|
3
|
+
export declare class Palette {
|
|
4
|
+
/** How many colors a palette named after a continuous ramp takes, unless it says. */
|
|
5
|
+
static readonly COUNT = 8;
|
|
6
|
+
/** The color at `index` of `palette`, cycling when the index runs past its end: the default color for an unstyled series. */
|
|
7
|
+
static at(index: number, palette: string[]): string;
|
|
8
|
+
/**
|
|
9
|
+
* `input` as a list of colors: a list as it is; a name as the d3-scale-chromatic color list of
|
|
10
|
+
* that name (`'dark2'`, `'tableau10'`...) or, for a ramp (`'viridis'`, `'blues'`...), colors spread
|
|
11
|
+
* evenly along it; `{ scheme, count, schemeRange }` the same with its own count and part of the ramp.
|
|
12
|
+
* `undefined` when the name is not one of those.
|
|
13
|
+
*/
|
|
14
|
+
static resolve(input: PaletteInput): string[] | undefined;
|
|
15
|
+
/** `patch` with its `palette` resolved to a list of colors, or left out (with a warning) when it names no scheme. */
|
|
16
|
+
static resolveIn<T extends {
|
|
17
|
+
palette?: PaletteInput;
|
|
18
|
+
} & Record<string, unknown>>(patch: T): Omit<T, 'palette'> & {
|
|
19
|
+
palette?: string[];
|
|
20
|
+
};
|
|
21
|
+
}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import * as d3Chromatic from 'd3-scale-chromatic';
|
|
2
|
+
import { ColorRamp } from './ColorRamp';
|
|
3
|
+
/** `{dark2: [...], tableau10: [...], ...}`, from every flat `scheme*` color list d3-scale-chromatic exports. */
|
|
4
|
+
const DISCRETE_SCHEMES = Object.fromEntries(Object.entries(d3Chromatic)
|
|
5
|
+
.filter((entry) => entry[0].startsWith('scheme') &&
|
|
6
|
+
Array.isArray(entry[1]) &&
|
|
7
|
+
entry[1].every((color) => typeof color === 'string'))
|
|
8
|
+
.map(([name, colors]) => [name.slice('scheme'.length).toLowerCase(), colors]));
|
|
9
|
+
/** The categorical palette of a configuration, as a list of colors. */
|
|
10
|
+
export class Palette {
|
|
11
|
+
/** How many colors a palette named after a continuous ramp takes, unless it says. */
|
|
12
|
+
static COUNT = 8;
|
|
13
|
+
/** The color at `index` of `palette`, cycling when the index runs past its end: the default color for an unstyled series. */
|
|
14
|
+
static at(index, palette) {
|
|
15
|
+
if (palette.length === 0)
|
|
16
|
+
return 'currentColor';
|
|
17
|
+
return palette[index % palette.length];
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* `input` as a list of colors: a list as it is; a name as the d3-scale-chromatic color list of
|
|
21
|
+
* that name (`'dark2'`, `'tableau10'`...) or, for a ramp (`'viridis'`, `'blues'`...), colors spread
|
|
22
|
+
* evenly along it; `{ scheme, count, schemeRange }` the same with its own count and part of the ramp.
|
|
23
|
+
* `undefined` when the name is not one of those.
|
|
24
|
+
*/
|
|
25
|
+
static resolve(input) {
|
|
26
|
+
if (Array.isArray(input))
|
|
27
|
+
return [...input];
|
|
28
|
+
const { scheme, count, schemeRange } = typeof input === 'string' ? { scheme: input } : input;
|
|
29
|
+
const name = scheme.toLowerCase();
|
|
30
|
+
const list = DISCRETE_SCHEMES[name];
|
|
31
|
+
if (list)
|
|
32
|
+
return count === undefined ? [...list] : list.slice(0, count);
|
|
33
|
+
const ramp = ColorRamp.NAMED[name];
|
|
34
|
+
if (!ramp)
|
|
35
|
+
return undefined;
|
|
36
|
+
const [from, to] = schemeRange ?? [0, 1];
|
|
37
|
+
const total = Math.max(1, count ?? Palette.COUNT);
|
|
38
|
+
return Array.from({ length: total }, (_, index) => ramp(from + (total > 1 ? index / (total - 1) : 0.5) * (to - from)));
|
|
39
|
+
}
|
|
40
|
+
/** `patch` with its `palette` resolved to a list of colors, or left out (with a warning) when it names no scheme. */
|
|
41
|
+
static resolveIn(patch) {
|
|
42
|
+
const { palette, ...rest } = patch;
|
|
43
|
+
if (palette === undefined)
|
|
44
|
+
return rest;
|
|
45
|
+
const colors = Palette.resolve(palette);
|
|
46
|
+
if (!colors) {
|
|
47
|
+
console.warn(`setConfiguration: palette ${JSON.stringify(palette)} is not a list of colors or a d3-scale-chromatic scheme name; the palette is left as it was.`);
|
|
48
|
+
return rest;
|
|
49
|
+
}
|
|
50
|
+
return { ...rest, palette: colors };
|
|
51
|
+
}
|
|
52
|
+
}
|
|
@@ -1,3 +1,11 @@
|
|
|
1
|
-
export {
|
|
2
|
-
export {
|
|
3
|
-
export {
|
|
1
|
+
export { CssColor } from './CssColor';
|
|
2
|
+
export { ColorRamp } from './ColorRamp';
|
|
3
|
+
export { Palette } from './Palette';
|
|
4
|
+
import { ColorRamp } from './ColorRamp';
|
|
5
|
+
export declare const resolveCssColor: (color: string) => string;
|
|
6
|
+
export declare const contrastRatio: (colorA: string, colorB: string) => number;
|
|
7
|
+
export declare const contrastTextColor: (background: string, candidates?: string[]) => string;
|
|
8
|
+
export declare const normalize: (v: number, min: number, max: number) => number;
|
|
9
|
+
export declare const makeColorScale: (min: number, max: number, colorMin: string, colorMax: string) => (v: number) => string;
|
|
10
|
+
export declare const resolveColorScale: typeof ColorRamp.resolve;
|
|
11
|
+
export declare const paletteColor: (index: number, palette: string[]) => string;
|
|
@@ -1,3 +1,14 @@
|
|
|
1
|
-
export {
|
|
2
|
-
export {
|
|
3
|
-
export {
|
|
1
|
+
export { CssColor } from './CssColor';
|
|
2
|
+
export { ColorRamp } from './ColorRamp';
|
|
3
|
+
export { Palette } from './Palette';
|
|
4
|
+
import { CssColor } from './CssColor';
|
|
5
|
+
import { ColorRamp } from './ColorRamp';
|
|
6
|
+
import { Palette } from './Palette';
|
|
7
|
+
// The package's public function names, over the classes above.
|
|
8
|
+
export const resolveCssColor = (color) => CssColor.resolve(color);
|
|
9
|
+
export const contrastRatio = (colorA, colorB) => CssColor.contrastRatio(colorA, colorB);
|
|
10
|
+
export const contrastTextColor = (background, candidates) => CssColor.contrastText(background, candidates);
|
|
11
|
+
export const normalize = (v, min, max) => ColorRamp.normalize(v, min, max);
|
|
12
|
+
export const makeColorScale = (min, max, colorMin, colorMax) => ColorRamp.between(min, max, colorMin, colorMax);
|
|
13
|
+
export const resolveColorScale = ColorRamp.resolve;
|
|
14
|
+
export const paletteColor = (index, palette) => Palette.at(index, palette);
|
package/dist/utils/grouping.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { resolveAccessor } from '
|
|
1
|
+
import { resolveAccessor } from './accessors';
|
|
2
2
|
/**
|
|
3
3
|
* Splits rows into ordered groups keyed by the stringified accessor value.
|
|
4
4
|
* Insertion order of first appearance is preserved, which keeps colours stable
|
package/docs/architecture.md
CHANGED
|
@@ -127,7 +127,7 @@ The public readers of that state are `useFigure()` and `usePlot()` ([Reading plo
|
|
|
127
127
|
1. Define its props and state types under `types/plots/<kind>/`.
|
|
128
128
|
2. Write `plots/<kind>/defaults.ts`: a builder returning the options of each phase it customises (`data`, `mapping`, `scales`, `styles`, `markers`, `hover`, `timeline`, ...).
|
|
129
129
|
3. Write `plots/<kind>/Plot.svelte`: split chrome, `timeline`, `facet` and core props and render the shared `Plot` with the builder.
|
|
130
|
-
4. Export it from `src/lib/index.ts`, add stories under `stories/plots/<kind>/`, tests under `tests/unit/plots/<kind>/`, and a
|
|
130
|
+
4. Export it from `src/lib/index.ts`, add stories under `stories/plots/<kind>/`, tests under `tests/unit/plots/<kind>/`, and a page in `docs/plots/` with a row in the [Plots](plots.md) table.
|
|
131
131
|
|
|
132
132
|
## Conventions
|
|
133
133
|
|
package/docs/chrome.md
CHANGED
|
@@ -2,20 +2,30 @@
|
|
|
2
2
|
|
|
3
3
|
The chrome is everything a figure draws around its plot: title, subtitle, legend, timeline player, caption. Every plot and every [composer](composer.md) takes the same chrome props.
|
|
4
4
|
|
|
5
|
+
<!-- example: examples/Chrome.svelte -->
|
|
6
|
+
|
|
5
7
|
```svelte
|
|
8
|
+
<script lang="ts">
|
|
9
|
+
import { LinePlot } from '@fundar/data-chart-telling';
|
|
10
|
+
import { PRICES } from './datasets';
|
|
11
|
+
</script>
|
|
12
|
+
|
|
13
|
+
<!-- A plot carries its own chrome: title, subtitle, legend and caption. -->
|
|
6
14
|
<LinePlot
|
|
7
|
-
{
|
|
8
|
-
{
|
|
9
|
-
title="
|
|
10
|
-
subtitle="
|
|
11
|
-
caption="Source:
|
|
12
|
-
data={
|
|
15
|
+
width={720}
|
|
16
|
+
height={440}
|
|
17
|
+
title="Commodity prices"
|
|
18
|
+
subtitle="Price index, January 2021 = 100"
|
|
19
|
+
caption="Source: IMF, Primary Commodity Prices"
|
|
20
|
+
data={PRICES}
|
|
13
21
|
x="date"
|
|
14
22
|
y="index"
|
|
15
|
-
color="
|
|
23
|
+
color="commodity"
|
|
16
24
|
/>
|
|
17
25
|
```
|
|
18
26
|
|
|
27
|
+
<!-- /example -->
|
|
28
|
+
|
|
19
29
|

|
|
20
30
|
|
|
21
31
|
| Prop | Type | Meaning |
|
|
@@ -55,10 +65,31 @@ A `header` takes the place of `title` and `subtitle`, and a `footer` the place o
|
|
|
55
65
|
- `'divider'` draws a line between the two blocks around it, and only when both are drawn. Several dividers may appear.
|
|
56
66
|
- A row puts two or three blocks side by side: `'(plot, timeline)'`, `'(legend, plot)'`. The `plot` takes the width the others leave; a row without `plot` shares its width among the blocks.
|
|
57
67
|
|
|
68
|
+
<!-- example: examples/ChromeOrder.svelte -->
|
|
69
|
+
|
|
58
70
|
```svelte
|
|
59
|
-
<
|
|
71
|
+
<script lang="ts">
|
|
72
|
+
import { LinePlot } from '@fundar/data-chart-telling';
|
|
73
|
+
import { PRICES } from './datasets';
|
|
74
|
+
</script>
|
|
75
|
+
|
|
76
|
+
<!-- `order` places the chrome blocks; `divider` draws a rule between them. -->
|
|
77
|
+
<LinePlot
|
|
78
|
+
width={720}
|
|
79
|
+
height={460}
|
|
80
|
+
title="Commodity prices"
|
|
81
|
+
subtitle="Price index"
|
|
82
|
+
caption="Source: IMF, Primary Commodity Prices"
|
|
83
|
+
data={PRICES}
|
|
84
|
+
x="date"
|
|
85
|
+
y="index"
|
|
86
|
+
color="commodity"
|
|
87
|
+
order={['title', 'subtitle', 'divider', 'legend', 'plot', 'divider', 'caption']}
|
|
88
|
+
/>
|
|
60
89
|
```
|
|
61
90
|
|
|
91
|
+
<!-- /example -->
|
|
92
|
+
|
|
62
93
|

|
|
63
94
|
|
|
64
95
|
The default order, from the configuration's `chrome.order`: `header`, `title`, `subtitle`, `divider`, `legend`, `plot`, `timeline`, `footer`, `caption`. It can be changed globally with `setConfiguration({ chrome: { order: [...] } })`.
|
package/docs/composer.md
CHANGED
|
@@ -2,20 +2,36 @@
|
|
|
2
2
|
|
|
3
3
|
`PlotComposer` puts several plots in one figure. It is a figure like any plot: it takes the same [chrome](chrome.md) (`title`, `subtitle`, `caption`, `legend`, `order`) and a `width` and `height`, and lays its children out on a grid.
|
|
4
4
|
|
|
5
|
+
<!-- example: examples/Composer.svelte -->
|
|
6
|
+
|
|
5
7
|
```svelte
|
|
8
|
+
<script lang="ts">
|
|
9
|
+
import { PlotComposer, LinePlot, BarPlot, ScatterPlot } from '@fundar/data-chart-telling';
|
|
10
|
+
import { REGION_VALUES, PROVINCE_VALUES, COUNTRIES_AT_2007 } from './datasets';
|
|
11
|
+
</script>
|
|
12
|
+
|
|
13
|
+
<!-- Several plots in one figure, placed on named areas of a grid. -->
|
|
6
14
|
<PlotComposer
|
|
7
15
|
width={900}
|
|
8
16
|
height={560}
|
|
9
17
|
title="Three views, one figure"
|
|
18
|
+
legend={false}
|
|
10
19
|
tags="A"
|
|
11
20
|
layout={{ areas: ['a a b', 'a a c'] }}
|
|
12
21
|
>
|
|
13
|
-
<LinePlot area="a" data={
|
|
14
|
-
<BarPlot
|
|
15
|
-
|
|
22
|
+
<LinePlot area="a" data={REGION_VALUES} x="date" y="value" color="region" tooltip />
|
|
23
|
+
<BarPlot
|
|
24
|
+
area="b"
|
|
25
|
+
data={PROVINCE_VALUES.filter((row) => row.sex === 'female').slice(0, 3)}
|
|
26
|
+
x="province"
|
|
27
|
+
y="value"
|
|
28
|
+
/>
|
|
29
|
+
<ScatterPlot area="c" data={COUNTRIES_AT_2007} x="gdp" y="life" />
|
|
16
30
|
</PlotComposer>
|
|
17
31
|
```
|
|
18
32
|
|
|
33
|
+
<!-- /example -->
|
|
34
|
+
|
|
19
35
|

|
|
20
36
|
|
|
21
37
|
Plots drawn straight inside the composer take a cell of the grid and draw at the cell's size - they need no `width` or `height`.
|
package/docs/concepts.md
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
## Plots and figures
|
|
4
4
|
|
|
5
|
-
A **plot** is one graph: axes and marks. Every plot is a component named after what it draws
|
|
5
|
+
A **plot** is one graph: axes and marks. Every plot is a component named after what it draws, such as `LinePlot` or `BarPlot` (see [Plots](plots.md) for all of them).
|
|
6
6
|
|
|
7
7
|
A plot is drawn inside a **figure**: the box that holds the plot together with its [chrome](chrome.md) (title, subtitle, legend, timeline, caption). Every plot component is a figure, so a plot with a `title` and a `legend` is still one component. A [`PlotComposer`](composer.md) is a figure that holds several plots.
|
|
8
8
|
|