@fundar/data-chart-telling 1.1.0 → 1.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +32 -0
- package/README.md +6 -6
- package/dist/configuration/config.svelte.d.ts +1 -1
- package/dist/configuration/config.svelte.js +165 -100
- package/dist/configuration/themes/index.d.ts +5 -1428
- package/dist/index.d.ts +23 -14
- package/dist/index.js +20 -11
- package/dist/layout/base/BasePlotLayout.svelte +115 -50
- package/dist/layout/base/BasePlotLayout.svelte.d.ts +1 -38
- package/dist/layout/coordinates/CoordinatesLayout.svelte +42 -40
- package/dist/layout/coordinates/CoordinatesLayout.svelte.d.ts +0 -2
- package/dist/layout/coordinates/ProjectionZoom.svelte +48 -0
- package/dist/layout/coordinates/ProjectionZoom.svelte.d.ts +10 -0
- package/dist/layout/coordinates/ZoomedProjection.d.ts +11 -0
- package/dist/layout/coordinates/ZoomedProjection.js +24 -0
- package/dist/layout/coordinates/camera.svelte.js +11 -8
- package/dist/layout/coordinates/projections/argentina.js +1 -1
- package/dist/layout/coordinates/projections/fit.d.ts +1 -1
- package/dist/layout/coordinates/projections/fit.js +1 -1
- package/dist/layout/coordinates/zoom.svelte.d.ts +4 -5
- package/dist/layout/coordinates/zoom.svelte.js +4 -5
- package/dist/layout/facet/FacetLayout.svelte +1 -1
- package/dist/layout/facet/config.js +1 -1
- package/dist/layout/figure/Figure.svelte +2 -0
- package/dist/layout/geometry/GeometryLayout.svelte +14 -9
- package/dist/layout/geometry/GeometryLayout.svelte.d.ts +0 -3
- package/dist/layout/geometry/MarkerOffset.svelte +28 -0
- package/dist/layout/geometry/MarkerOffset.svelte.d.ts +13 -0
- package/dist/layout/grid/GridCell.svelte +6 -8
- package/dist/layout/legend/ContinuousSection.svelte +44 -9
- package/dist/layout/legend/DiscreteBadgeItem.svelte +2 -2
- package/dist/layout/legend/DiscreteSection.svelte +2 -2
- package/dist/layout/legend/DiscreteSymbolIcon.svelte +1 -1
- package/dist/layout/legend/LegendChannels.js +36 -12
- package/dist/layout/legend/LegendLayout.svelte +9 -1
- package/dist/layout/legend/LegendState.svelte.d.ts +4 -0
- package/dist/layout/legend/LegendState.svelte.js +20 -3
- package/dist/layout/legend/SizeSection.svelte +1 -1
- package/dist/layout/margins/PlotMargins.svelte.d.ts +2 -5
- package/dist/layout/margins/PlotMargins.svelte.js +4 -8
- package/dist/layout/plot/Slice.d.ts +5 -1
- package/dist/layout/plot/Slice.js +14 -4
- package/dist/layout/scales/NiceTicks.d.ts +3 -0
- package/dist/layout/scales/NiceTicks.js +4 -0
- package/dist/layout/scales/ScalesLayout.svelte +72 -7
- package/dist/layout/scales/ScalesLayout.svelte.d.ts +5 -0
- package/dist/layout/scales/SveltePlotScale.d.ts +2 -2
- package/dist/layout/scales/SveltePlotScale.js +13 -6
- package/dist/layout/scales/TickLabels.d.ts +32 -0
- package/dist/layout/scales/TickLabels.js +55 -0
- package/dist/layout/styles/StylesLayout.svelte +2 -2
- package/dist/layout/styles/ValueLabels.d.ts +33 -5
- package/dist/layout/styles/ValueLabels.js +80 -21
- package/dist/layout/timeline/TimelineLayout.svelte +1 -1
- package/dist/layout/tooltip/Tooltip.svelte +4 -4
- package/dist/layout/tooltip/Tooltip.svelte.d.ts +4 -4
- package/dist/layout/tooltip/TooltipState.svelte.js +1 -1
- package/dist/markers/MarkerKinds.d.ts +5 -0
- package/dist/markers/MarkerKinds.js +1 -0
- package/dist/markers/area/AreaMarker.svelte +15 -63
- package/dist/markers/arrow/ArrowMarker.svelte +51 -9
- package/dist/markers/bar/BarMarker.svelte +8 -4
- package/dist/markers/bollinger/BollingerMarker.svelte +33 -18
- package/dist/markers/box/BoxMarker.svelte +40 -9
- package/dist/markers/delta/Delta.js +1 -1
- package/dist/markers/dot/DotMarker.svelte +24 -27
- package/dist/markers/image/ImageMarker.svelte +17 -12
- package/dist/markers/inset/InsetMarker.svelte +2 -2
- package/dist/markers/line/LineMarker.svelte +1 -0
- package/dist/markers/link/LinkMarker.svelte +174 -29
- package/dist/markers/regression/RegressionMarker.svelte +16 -33
- package/dist/markers/rule/RuleMarker.svelte +9 -3
- package/dist/markers/text/Declutter.d.ts +4 -0
- package/dist/markers/text/Declutter.js +26 -11
- package/dist/markers/text/TextMarker.svelte +91 -48
- package/dist/markers/tick/TickMarker.svelte +27 -25
- package/dist/markers/utils/MarkerChannels.d.ts +24 -0
- package/dist/markers/utils/MarkerChannels.js +42 -7
- package/dist/markers/utils/RowOffset.d.ts +23 -0
- package/dist/markers/utils/RowOffset.js +23 -0
- package/dist/markers/utils/RowOffsetMarks.svelte +30 -0
- package/dist/markers/utils/RowOffsetMarks.svelte.d.ts +33 -0
- package/dist/markers/utils/RowStroke.d.ts +31 -0
- package/dist/markers/utils/RowStroke.js +28 -0
- package/dist/markers/violin/ViolinMarker.svelte +75 -0
- package/dist/markers/violin/ViolinMarker.svelte.d.ts +7 -0
- package/dist/markers/violin/ViolinProfiles.d.ts +29 -0
- package/dist/markers/violin/ViolinProfiles.js +55 -0
- package/dist/markers/waffle/WaffleMarker.svelte +17 -37
- package/dist/phases/Pipeline.d.ts +5 -0
- package/dist/phases/Pipeline.js +5 -0
- package/dist/phases/data/DataPhase.js +3 -3
- package/dist/phases/data/PlotAxes.d.ts +10 -0
- package/dist/phases/data/PlotAxes.js +14 -1
- package/dist/phases/facet/FacetPanels.d.ts +1 -0
- package/dist/phases/facet/FacetPanels.js +1 -0
- package/dist/phases/mapping/MappingPhase.js +1 -1
- package/dist/phases/markers/MarkersPhase.js +2 -1
- package/dist/phases/scales/CategoryOrder.d.ts +23 -0
- package/dist/phases/scales/CategoryOrder.js +73 -0
- package/dist/phases/scales/ScalesPhase.js +21 -7
- package/dist/phases/sharedScales/SharedScalesPhase.d.ts +3 -2
- package/dist/phases/sharedScales/SharedScalesPhase.js +5 -2
- package/dist/phases/statistics/Statistics.d.ts +10 -6
- package/dist/phases/statistics/Statistics.js +20 -10
- package/dist/phases/statistics/StatisticsPhase.js +7 -2
- package/dist/phases/statistics/methods/BollingerStatistic.d.ts +1 -1
- package/dist/phases/statistics/methods/BollingerStatistic.js +13 -11
- package/dist/phases/statistics/methods/BoxStatistic.d.ts +1 -1
- package/dist/phases/statistics/methods/BoxStatistic.js +14 -12
- package/dist/phases/statistics/methods/Density2dStatistic.d.ts +1 -1
- package/dist/phases/statistics/methods/Density2dStatistic.js +13 -11
- package/dist/phases/statistics/methods/DensityStatistic.d.ts +1 -1
- package/dist/phases/statistics/methods/DensityStatistic.js +11 -9
- package/dist/phases/statistics/methods/DeviationStatistic.d.ts +8 -0
- package/dist/phases/statistics/methods/DeviationStatistic.js +111 -0
- package/dist/phases/statistics/methods/MovingAverageStatistic.d.ts +1 -1
- package/dist/phases/statistics/methods/MovingAverageStatistic.js +11 -9
- package/dist/phases/statistics/methods/RegressionStatistic.d.ts +1 -1
- package/dist/phases/statistics/methods/RegressionStatistic.js +16 -14
- package/dist/phases/transforms/ProcessedPositions.js +1 -1
- package/dist/phases/transforms/TransformsPhase.js +49 -3
- package/dist/phases/transforms/ValueSelection.d.ts +30 -0
- package/dist/phases/transforms/ValueSelection.js +53 -0
- package/dist/plots/{heatmap → correlation/heatmap}/Plot.svelte +5 -2
- package/dist/plots/{heatmap → correlation/heatmap}/Plot.svelte.d.ts +2 -2
- package/dist/plots/{heatmap → correlation/heatmap}/defaults.d.ts +2 -2
- package/dist/plots/{heatmap → correlation/heatmap}/defaults.js +5 -5
- package/dist/plots/{heatmap → correlation/heatmap}/markers.d.ts +4 -4
- package/dist/plots/{heatmap → correlation/heatmap}/markers.js +3 -3
- package/dist/plots/{scatter → correlation/scatter}/Plot.svelte +5 -2
- package/dist/plots/{scatter → correlation/scatter}/Plot.svelte.d.ts +2 -2
- package/dist/plots/{scatter → correlation/scatter}/defaults.d.ts +2 -2
- package/dist/plots/{scatter → correlation/scatter}/defaults.js +4 -4
- package/dist/plots/{scatter → correlation/scatter}/markers.d.ts +4 -4
- package/dist/plots/{scatter → correlation/scatter}/markers.js +3 -3
- package/dist/plots/{box → distribution/box}/BoxSummaries.d.ts +2 -2
- package/dist/plots/{box → distribution/box}/BoxSummaries.js +6 -6
- package/dist/plots/{box → distribution/box}/Plot.svelte +2 -2
- package/dist/plots/{box → distribution/box}/Plot.svelte.d.ts +2 -2
- package/dist/plots/{box → distribution/box}/defaults.d.ts +2 -2
- package/dist/plots/{box → distribution/box}/defaults.js +1 -1
- package/dist/plots/{box → distribution/box}/markers.d.ts +2 -2
- package/dist/plots/distribution/density/Plot.svelte +45 -0
- package/dist/plots/distribution/density/Plot.svelte.d.ts +26 -0
- package/dist/plots/distribution/density/defaults.d.ts +9 -0
- package/dist/plots/distribution/density/defaults.js +29 -0
- package/dist/plots/distribution/density/markers.d.ts +9 -0
- package/dist/plots/distribution/density/markers.js +42 -0
- package/dist/plots/{histogram → distribution/histogram}/Plot.svelte +2 -2
- package/dist/plots/{histogram → distribution/histogram}/Plot.svelte.d.ts +2 -2
- package/dist/plots/{histogram → distribution/histogram}/defaults.d.ts +2 -2
- package/dist/plots/{histogram → distribution/histogram}/defaults.js +3 -3
- package/dist/plots/{histogram → distribution/histogram}/markers.d.ts +3 -3
- package/dist/plots/{histogram → distribution/histogram}/markers.js +5 -5
- package/dist/plots/{pyramid → distribution/pyramid}/Plot.svelte +5 -2
- package/dist/plots/{pyramid → distribution/pyramid}/Plot.svelte.d.ts +2 -2
- package/dist/plots/{pyramid → distribution/pyramid}/defaults.d.ts +2 -2
- package/dist/plots/{pyramid → distribution/pyramid}/defaults.js +6 -6
- package/dist/plots/{pyramid → distribution/pyramid}/markers.d.ts +4 -4
- package/dist/plots/{pyramid → distribution/pyramid}/markers.js +6 -6
- package/dist/plots/distribution/violin/Plot.svelte +45 -0
- package/dist/plots/distribution/violin/Plot.svelte.d.ts +26 -0
- package/dist/plots/distribution/violin/defaults.d.ts +10 -0
- package/dist/plots/distribution/violin/defaults.js +58 -0
- package/dist/plots/distribution/violin/markers.d.ts +10 -0
- package/dist/plots/distribution/violin/markers.js +71 -0
- package/dist/plots/{area → evolution/area}/Plot.svelte +2 -2
- package/dist/plots/{area → evolution/area}/Plot.svelte.d.ts +2 -2
- package/dist/plots/{area → evolution/area}/defaults.d.ts +2 -2
- package/dist/plots/{area → evolution/area}/defaults.js +2 -0
- package/dist/plots/{area → evolution/area}/markers.d.ts +2 -2
- package/dist/plots/{area → evolution/area}/markers.js +1 -1
- package/dist/plots/{line → evolution/line}/Plot.svelte +2 -2
- package/dist/plots/{line → evolution/line}/Plot.svelte.d.ts +2 -2
- package/dist/plots/{line → evolution/line}/defaults.d.ts +2 -2
- package/dist/plots/{line → evolution/line}/defaults.js +2 -0
- package/dist/plots/{line → evolution/line}/markers.d.ts +11 -8
- package/dist/plots/{line → evolution/line}/markers.js +6 -4
- package/dist/plots/evolution/slope/Plot.svelte +42 -0
- package/dist/plots/evolution/slope/Plot.svelte.d.ts +26 -0
- package/dist/plots/evolution/slope/defaults.d.ts +8 -0
- package/dist/plots/evolution/slope/defaults.js +31 -0
- package/dist/plots/evolution/slope/markers.d.ts +16 -0
- package/dist/plots/evolution/slope/markers.js +79 -0
- package/dist/plots/evolution/sparkline/Plot.svelte +45 -0
- package/dist/plots/evolution/sparkline/Plot.svelte.d.ts +26 -0
- package/dist/plots/evolution/sparkline/defaults.d.ts +7 -0
- package/dist/plots/evolution/sparkline/defaults.js +23 -0
- package/dist/plots/evolution/sparkline/markers.d.ts +7 -0
- package/dist/plots/evolution/sparkline/markers.js +56 -0
- package/dist/plots/{geo → map/geo}/Core.svelte +11 -10
- package/dist/plots/{geo → map/geo}/Core.svelte.d.ts +1 -1
- package/dist/plots/map/geo/GeoFeatures.svelte.d.ts +9 -0
- package/dist/plots/map/geo/GeoFeatures.svelte.js +55 -0
- package/dist/plots/map/geo/GeoGeometry.d.ts +27 -0
- package/dist/plots/map/geo/GeoGeometry.js +142 -0
- package/dist/plots/map/geo/GeoSegments.d.ts +16 -0
- package/dist/plots/map/geo/GeoSegments.js +23 -0
- package/dist/plots/{geo → map/geo}/Plot.svelte +10 -10
- package/dist/plots/{geo → map/geo}/Plot.svelte.d.ts +2 -2
- package/dist/plots/{geo → map/geo}/defaults.d.ts +2 -2
- package/dist/plots/{geo → map/geo}/defaults.js +1 -1
- package/dist/plots/{geo → map/geo}/phases/data.d.ts +1 -1
- package/dist/plots/{geo → map/geo}/phases/data.js +7 -6
- package/dist/plots/{geo → map/geo}/phases/hover.d.ts +1 -1
- package/dist/plots/{geo → map/geo}/phases/hover.js +2 -2
- package/dist/plots/{geo → map/geo}/phases/markers.d.ts +1 -1
- package/dist/plots/{geo → map/geo}/phases/markers.js +6 -10
- package/dist/plots/{geo → map/geo}/phases/scales.d.ts +2 -2
- package/dist/plots/{geo → map/geo}/phases/scales.js +28 -12
- package/dist/plots/{geo → map/geo}/phases/tooltip.d.ts +1 -1
- package/dist/plots/map/geo/phases/tooltip.js +5 -0
- package/dist/plots/{geo → map/geo}/slices.d.ts +2 -2
- package/dist/plots/{geo → map/geo}/slices.js +2 -2
- package/dist/plots/{bar → ranking/bar}/Plot.svelte +2 -2
- package/dist/plots/{bar → ranking/bar}/Plot.svelte.d.ts +2 -2
- package/dist/plots/ranking/bar/defaults.d.ts +16 -0
- package/dist/plots/{bar → ranking/bar}/defaults.js +15 -9
- package/dist/plots/{bar → ranking/bar}/markers.d.ts +8 -8
- package/dist/plots/{bar → ranking/bar}/markers.js +8 -17
- package/dist/plots/ranking/bullet/Plot.svelte +42 -0
- package/dist/plots/ranking/bullet/Plot.svelte.d.ts +26 -0
- package/dist/plots/ranking/bullet/defaults.d.ts +8 -0
- package/dist/plots/ranking/bullet/defaults.js +24 -0
- package/dist/plots/ranking/bullet/markers.d.ts +10 -0
- package/dist/plots/ranking/bullet/markers.js +90 -0
- package/dist/plots/ranking/cleveland/ClevelandConnector.d.ts +48 -0
- package/dist/plots/ranking/cleveland/ClevelandConnector.js +140 -0
- package/dist/plots/ranking/cleveland/ClevelandMarkers.d.ts +33 -0
- package/dist/plots/ranking/cleveland/ClevelandMarkers.js +375 -0
- package/dist/plots/ranking/cleveland/ClevelandRanges.d.ts +31 -0
- package/dist/plots/ranking/cleveland/ClevelandRanges.js +116 -0
- package/dist/plots/ranking/cleveland/Plot.svelte +45 -0
- package/dist/plots/ranking/cleveland/Plot.svelte.d.ts +26 -0
- package/dist/plots/ranking/cleveland/defaults.d.ts +13 -0
- package/dist/plots/ranking/cleveland/defaults.js +66 -0
- package/dist/plots/ranking/dumbbell/Plot.svelte +45 -0
- package/dist/plots/ranking/dumbbell/Plot.svelte.d.ts +26 -0
- package/dist/plots/ranking/dumbbell/defaults.d.ts +9 -0
- package/dist/plots/ranking/dumbbell/defaults.js +19 -0
- package/dist/plots/ranking/forest/Plot.svelte +42 -0
- package/dist/plots/ranking/forest/Plot.svelte.d.ts +26 -0
- package/dist/plots/ranking/forest/defaults.d.ts +11 -0
- package/dist/plots/ranking/forest/defaults.js +20 -0
- package/dist/plots/ranking/lollipop/Plot.svelte +45 -0
- package/dist/plots/ranking/lollipop/Plot.svelte.d.ts +26 -0
- package/dist/plots/ranking/lollipop/defaults.d.ts +9 -0
- package/dist/plots/ranking/lollipop/defaults.js +18 -0
- package/dist/plots/utils/RowNumbers.d.ts +16 -0
- package/dist/plots/utils/RowNumbers.js +24 -0
- package/dist/plots/utils/gaps.js +1 -1
- package/dist/plots/utils/segments.js +1 -1
- package/dist/types/configuration/styling.d.ts +276 -143
- package/dist/types/layout/coordinates.d.ts +5 -4
- package/dist/types/layout/legend.d.ts +21 -5
- package/dist/types/layout/plot.d.ts +44 -1
- package/dist/types/layout/scales.d.ts +39 -7
- package/dist/types/layout/statistics/deviation.d.ts +40 -0
- package/dist/types/layout/statistics/index.d.ts +7 -2
- package/dist/types/layout/styles/base.d.ts +18 -0
- package/dist/types/layout/styles/bullet.d.ts +25 -0
- package/dist/types/layout/styles/connector.d.ts +98 -0
- package/dist/types/layout/styles/curve.d.ts +11 -0
- package/dist/types/layout/styles/frame.d.ts +17 -0
- package/dist/types/layout/styles/gaps.d.ts +12 -0
- package/dist/types/layout/styles/geo.d.ts +55 -0
- package/dist/types/layout/styles/index.d.ts +8 -0
- package/dist/types/layout/styles/index.js +8 -0
- package/dist/types/layout/styles/values.d.ts +47 -0
- package/dist/types/layout/timeline.d.ts +5 -2
- package/dist/types/layout/tooltip.d.ts +6 -2
- package/dist/types/markers/axis/area.d.ts +2 -2
- package/dist/types/markers/axis/arrow.d.ts +3 -0
- package/dist/types/markers/axis/axisBasedMarkersConfig.d.ts +2 -1
- package/dist/types/markers/axis/bar.d.ts +1 -1
- package/dist/types/markers/axis/box.d.ts +5 -0
- package/dist/types/markers/axis/difference.d.ts +2 -2
- package/dist/types/markers/axis/image.d.ts +3 -2
- package/dist/types/markers/axis/line.d.ts +2 -0
- package/dist/types/markers/axis/rule.d.ts +9 -0
- package/dist/types/markers/axis/trail.d.ts +2 -3
- package/dist/types/markers/axis/violin.d.ts +25 -0
- package/dist/types/markers/basic/dot.d.ts +3 -2
- package/dist/types/markers/basic/text.d.ts +13 -3
- package/dist/types/markers/channels/commonMarkerConfig.d.ts +7 -3
- package/dist/types/markers/channels/commonMarkerConfigWithRowOffset.d.ts +13 -0
- package/dist/types/markers/common.d.ts +1 -1
- package/dist/types/markers/common.js +1 -0
- package/dist/types/markers/geo/link.d.ts +5 -1
- package/dist/types/phases/index.d.ts +1 -1
- package/dist/types/phases/scales/phase.d.ts +5 -1
- package/dist/types/phases/state.d.ts +15 -2
- package/dist/types/phases/statistics/source.d.ts +3 -1
- package/dist/types/phases/transforms/phase.d.ts +22 -0
- package/dist/types/plots/{heatmap → correlation/heatmap}/props.d.ts +6 -6
- package/dist/types/plots/{heatmap → correlation/heatmap}/state.d.ts +4 -4
- package/dist/types/plots/{scatter → correlation/scatter}/props.d.ts +6 -6
- package/dist/types/plots/{scatter → correlation/scatter}/state.d.ts +2 -2
- package/dist/types/plots/{box → distribution/box}/props.d.ts +6 -6
- package/dist/types/plots/{box → distribution/box}/state.d.ts +3 -3
- package/dist/types/plots/distribution/density/props.d.ts +23 -0
- package/dist/types/plots/distribution/density/state.d.ts +6 -0
- package/dist/types/plots/{histogram → distribution/histogram}/props.d.ts +7 -7
- package/dist/types/plots/{histogram → distribution/histogram}/state.d.ts +2 -2
- package/dist/types/plots/distribution/histogram/state.js +1 -0
- package/dist/types/plots/{pyramid → distribution/pyramid}/props.d.ts +6 -6
- package/dist/types/plots/distribution/pyramid/props.js +1 -0
- package/dist/types/plots/{pyramid → distribution/pyramid}/state.d.ts +3 -3
- package/dist/types/plots/distribution/pyramid/state.js +1 -0
- package/dist/types/plots/distribution/violin/props.d.ts +23 -0
- package/dist/types/plots/distribution/violin/props.js +1 -0
- package/dist/types/plots/distribution/violin/state.d.ts +6 -0
- package/dist/types/plots/distribution/violin/state.js +1 -0
- package/dist/types/plots/{area → evolution/area}/props.d.ts +6 -6
- package/dist/types/plots/evolution/area/props.js +1 -0
- package/dist/types/plots/{area → evolution/area}/state.d.ts +2 -2
- package/dist/types/plots/evolution/area/state.js +1 -0
- package/dist/types/plots/evolution/line/props.d.ts +10 -0
- package/dist/types/plots/evolution/line/props.js +1 -0
- package/dist/types/plots/{line → evolution/line}/state.d.ts +3 -3
- package/dist/types/plots/evolution/line/state.js +1 -0
- package/dist/types/plots/evolution/slope/props.d.ts +5 -0
- package/dist/types/plots/evolution/slope/props.js +1 -0
- package/dist/types/plots/evolution/slope/state.d.ts +5 -0
- package/dist/types/plots/evolution/slope/state.js +1 -0
- package/dist/types/plots/evolution/sparkline/props.d.ts +5 -0
- package/dist/types/plots/evolution/sparkline/props.js +1 -0
- package/dist/types/plots/evolution/sparkline/state.d.ts +5 -0
- package/dist/types/plots/evolution/sparkline/state.js +1 -0
- package/dist/types/plots/{geo → map/geo}/props.d.ts +8 -8
- package/dist/types/plots/map/geo/props.js +1 -0
- package/dist/types/plots/{geo → map/geo}/state.d.ts +18 -11
- package/dist/types/plots/map/geo/state.js +1 -0
- package/dist/types/plots/props.d.ts +1 -1
- package/dist/types/plots/{bar → ranking/bar}/props.d.ts +6 -6
- package/dist/types/plots/ranking/bar/props.js +1 -0
- package/dist/types/plots/{bar → ranking/bar}/state.d.ts +2 -2
- package/dist/types/plots/ranking/bar/state.js +1 -0
- package/dist/types/plots/ranking/bullet/props.d.ts +22 -0
- package/dist/types/plots/ranking/bullet/props.js +1 -0
- package/dist/types/plots/ranking/bullet/state.d.ts +5 -0
- package/dist/types/plots/ranking/bullet/state.js +1 -0
- package/dist/types/plots/ranking/cleveland/props.d.ts +10 -0
- package/dist/types/plots/ranking/cleveland/props.js +1 -0
- package/dist/types/plots/ranking/cleveland/state.d.ts +49 -0
- package/dist/types/plots/ranking/cleveland/state.js +1 -0
- package/dist/types/plots/ranking/dumbbell/props.d.ts +10 -0
- package/dist/types/plots/ranking/dumbbell/props.js +1 -0
- package/dist/types/plots/ranking/dumbbell/state.d.ts +5 -0
- package/dist/types/plots/ranking/dumbbell/state.js +1 -0
- package/dist/types/plots/ranking/forest/props.d.ts +23 -0
- package/dist/types/plots/ranking/forest/props.js +1 -0
- package/dist/types/plots/ranking/forest/state.d.ts +5 -0
- package/dist/types/plots/ranking/forest/state.js +1 -0
- package/dist/types/plots/ranking/lollipop/props.d.ts +10 -0
- package/dist/types/plots/ranking/lollipop/props.js +1 -0
- package/dist/types/plots/ranking/lollipop/state.d.ts +5 -0
- package/dist/types/plots/ranking/lollipop/state.js +1 -0
- package/dist/types/plots/segments/common.d.ts +4 -1
- package/dist/utils/OpacityScale.d.ts +14 -0
- package/dist/utils/OpacityScale.js +43 -0
- package/dist/utils/{symbol.d.ts → SymbolPath.d.ts} +0 -12
- package/dist/utils/{symbol.js → SymbolPath.js} +0 -24
- package/dist/utils/SymbolScale.d.ts +18 -0
- package/dist/utils/SymbolScale.js +29 -0
- package/dist/utils/color/ColorRamp.d.ts +27 -0
- package/dist/utils/color/ColorRamp.js +120 -0
- package/dist/utils/color/CssColor.d.ts +19 -0
- package/dist/utils/color/CssColor.js +114 -0
- package/dist/utils/color/Palette.d.ts +21 -0
- package/dist/utils/color/Palette.js +52 -0
- package/dist/utils/color/index.d.ts +11 -3
- package/dist/utils/color/index.js +14 -3
- package/dist/utils/grouping.js +1 -1
- package/docs/architecture.md +1 -1
- package/docs/chrome.md +2 -2
- package/docs/composer.md +2 -2
- package/docs/concepts.md +1 -1
- package/docs/development.md +1 -1
- package/docs/facets.md +3 -3
- package/docs/getting-started.md +2 -2
- package/docs/legend.md +13 -11
- package/docs/markers.md +29 -27
- package/docs/plots/correlation/heatmap.md +26 -0
- package/docs/plots/correlation/scatter.md +35 -0
- package/docs/plots/distribution/box.md +28 -0
- package/docs/plots/distribution/density.md +26 -0
- package/docs/plots/distribution/histogram.md +33 -0
- package/docs/plots/distribution/pyramid.md +31 -0
- package/docs/plots/distribution/violin.md +35 -0
- package/docs/plots/evolution/area.md +32 -0
- package/docs/plots/evolution/line.md +93 -0
- package/docs/plots/evolution/slope.md +39 -0
- package/docs/plots/evolution/sparkline.md +34 -0
- package/docs/plots/ranking/bar.md +59 -0
- package/docs/plots/ranking/bullet.md +37 -0
- package/docs/plots/ranking/cleveland.md +54 -0
- package/docs/plots/ranking/dumbbell.md +39 -0
- package/docs/plots/ranking/forest.md +40 -0
- package/docs/plots/ranking/lollipop.md +39 -0
- package/docs/plots.md +22 -280
- package/docs/scales.md +30 -24
- package/docs/styles-and-segments.md +24 -21
- package/docs/theming.md +23 -20
- package/docs/timeline.md +3 -3
- package/docs/tooltip-and-hover.md +10 -10
- package/docs/transforms-and-statistics.md +13 -12
- package/examples/BarValues.svelte +1 -1
- package/examples/Box.svelte +1 -1
- package/examples/Bullet.svelte +17 -0
- package/examples/Chrome.svelte +1 -1
- package/examples/ChromeOrder.svelte +1 -1
- package/examples/Cleveland.svelte +15 -0
- package/examples/Composer.svelte +2 -2
- package/examples/CustomTooltip.svelte +1 -1
- package/examples/Density.svelte +7 -0
- package/examples/Dumbbell.svelte +16 -0
- package/examples/Facets.svelte +1 -1
- package/examples/FacetsCarousel.svelte +1 -1
- package/examples/FacetsRowsCols.svelte +1 -1
- package/examples/FirstPlot.svelte +1 -1
- package/examples/Forest.svelte +17 -0
- package/examples/Gaps.svelte +2 -2
- package/examples/GroupedBars.svelte +1 -1
- package/examples/Heatmap.svelte +3 -3
- package/examples/HeatmapSegments.svelte +8 -8
- package/examples/Histogram.svelte +1 -1
- package/examples/HorizontalBars.svelte +1 -1
- package/examples/LegendSections.svelte +1 -1
- package/examples/LegendToggle.svelte +1 -1
- package/examples/LineByRegion.svelte +1 -1
- package/examples/LineDates.svelte +1 -1
- package/examples/LineStep.svelte +16 -0
- package/examples/LineStepSegment.svelte +18 -0
- package/examples/Lollipop.svelte +17 -0
- package/examples/Markers.svelte +1 -1
- package/examples/MovingAverage.svelte +1 -1
- package/examples/Pyramid.svelte +9 -2
- package/examples/Regression.svelte +2 -2
- package/examples/ResponsiveLine.svelte +1 -1
- package/examples/Scales.svelte +1 -1
- package/examples/Scatter.svelte +2 -2
- package/examples/SegmentHighlight.svelte +1 -1
- package/examples/Segments.svelte +1 -1
- package/examples/SegmentsBySeries.svelte +1 -1
- package/examples/Slope.svelte +17 -0
- package/examples/Sparkline.svelte +14 -0
- package/examples/StackedArea.svelte +1 -1
- package/examples/StackedBars.svelte +1 -1
- package/examples/TimelinePlayer.svelte +1 -1
- package/examples/TimelineRule.svelte +1 -1
- package/examples/Tooltip.svelte +1 -1
- package/examples/ValueLabels.svelte +1 -1
- package/examples/Violin.svelte +14 -0
- package/examples/datasets/argentina-chile-trends.ts +34 -0
- package/examples/datasets/commodity-prices.ts +48 -0
- package/examples/datasets/countries-over-time.ts +368 -0
- package/examples/datasets/daily-temperature.ts +121 -0
- package/examples/datasets/earthquakes.ts +977 -0
- package/examples/datasets/flight-routes.ts +29 -0
- package/examples/datasets/height-density.ts +37 -0
- package/examples/datasets/heights.ts +370 -0
- package/examples/datasets/index.ts +24 -0
- package/examples/datasets/inflation-by-region.ts +44 -0
- package/examples/datasets/inflation-ranges.ts +34 -0
- package/examples/datasets/iris-flower.ts +207 -0
- package/examples/datasets/life-expectancy.ts +95 -0
- package/examples/datasets/napoleons-march.ts +182 -0
- package/examples/datasets/penguins.ts +54 -0
- package/examples/datasets/population-by-age-with-gaps.ts +23 -0
- package/examples/datasets/population-by-age.ts +890 -0
- package/examples/datasets/province-population.ts +521 -0
- package/examples/datasets/stock-prices.ts +63 -0
- package/examples/datasets/weather-stations-over-time.ts +31 -0
- package/examples/datasets/weather-stations.ts +22 -0
- package/examples/datasets/wind-vectors.ts +30 -0
- package/examples/datasets/world-temperature.ts +400 -0
- package/llms-full.txt +22 -11
- package/llms.txt +32 -4
- package/package.json +10 -1
- package/dist/plots/bar/defaults.d.ts +0 -9
- package/dist/plots/geo/features.svelte.d.ts +0 -5
- package/dist/plots/geo/features.svelte.js +0 -44
- package/dist/plots/geo/phases/tooltip.js +0 -5
- package/dist/plots/utils/geoAccessors.d.ts +0 -72
- package/dist/plots/utils/geoAccessors.js +0 -220
- package/dist/plots/utils/geoSegments.d.ts +0 -29
- package/dist/plots/utils/geoSegments.js +0 -37
- package/dist/types/layout/styles.d.ts +0 -122
- package/dist/types/markers/axis/curveName.d.ts +0 -2
- package/dist/types/plots/line/props.d.ts +0 -10
- package/dist/utils/color/contrast.d.ts +0 -9
- package/dist/utils/color/contrast.js +0 -40
- package/dist/utils/color/cssColor.d.ts +0 -4
- package/dist/utils/color/cssColor.js +0 -77
- package/dist/utils/color/ramp.d.ts +0 -17
- package/dist/utils/color/ramp.js +0 -110
- package/dist/utils/opacity.d.ts +0 -9
- package/dist/utils/opacity.js +0 -38
- package/examples/data.ts +0 -324
- /package/dist/plots/{box → distribution/box}/markers.js +0 -0
- /package/dist/types/layout/{styles.js → statistics/deviation.js} +0 -0
- /package/dist/types/{markers/axis/curveName.js → layout/styles/base.js} +0 -0
- /package/dist/types/{plots/area/props.js → layout/styles/bullet.js} +0 -0
- /package/dist/types/{plots/area/state.js → layout/styles/connector.js} +0 -0
- /package/dist/types/{plots/bar/props.js → layout/styles/curve.js} +0 -0
- /package/dist/types/{plots/bar/state.js → layout/styles/frame.js} +0 -0
- /package/dist/types/{plots/box/props.js → layout/styles/gaps.js} +0 -0
- /package/dist/types/{plots/box/state.js → layout/styles/geo.js} +0 -0
- /package/dist/types/{plots/geo/props.js → layout/styles/values.js} +0 -0
- /package/dist/types/{plots/geo/state.js → markers/axis/violin.js} +0 -0
- /package/dist/types/{plots/heatmap/props.js → markers/channels/commonMarkerConfigWithRowOffset.js} +0 -0
- /package/dist/types/plots/{histogram → correlation/heatmap}/props.js +0 -0
- /package/dist/types/plots/{heatmap → correlation/heatmap}/state.js +0 -0
- /package/dist/types/plots/{line → correlation/scatter}/props.js +0 -0
- /package/dist/types/plots/{histogram → correlation/scatter}/state.js +0 -0
- /package/dist/types/plots/{pyramid → distribution/box}/props.js +0 -0
- /package/dist/types/plots/{line → distribution/box}/state.js +0 -0
- /package/dist/types/plots/{scatter → distribution/density}/props.js +0 -0
- /package/dist/types/plots/{pyramid → distribution/density}/state.js +0 -0
- /package/dist/types/plots/{scatter/state.js → distribution/histogram/props.js} +0 -0
- /package/dist/{plots/utils → utils}/accessors.d.ts +0 -0
- /package/dist/{plots/utils → utils}/accessors.js +0 -0
|
@@ -1,44 +0,0 @@
|
|
|
1
|
-
import { isTopology, topologyToGeoJson } from '../utils/topojson';
|
|
2
|
-
/** A GeoPlot's `data` as a feature list: GeoJSON as is, a TopoJSON `Topology` converted under `object`. */
|
|
3
|
-
export function createGeoFeatures(getData, getObject) {
|
|
4
|
-
let topoFeatures = $state(null);
|
|
5
|
-
$effect(() => {
|
|
6
|
-
const data = getData();
|
|
7
|
-
const object = getObject();
|
|
8
|
-
if (!isTopology(data))
|
|
9
|
-
return;
|
|
10
|
-
if (!object) {
|
|
11
|
-
console.warn('GeoPlot: `data` is a TopoJSON Topology but no `object` key was given - nothing will render.');
|
|
12
|
-
topoFeatures = [];
|
|
13
|
-
return;
|
|
14
|
-
}
|
|
15
|
-
let cancelled = false;
|
|
16
|
-
topologyToGeoJson(data, object)
|
|
17
|
-
.then((resolved) => {
|
|
18
|
-
if (!cancelled)
|
|
19
|
-
topoFeatures = resolved;
|
|
20
|
-
})
|
|
21
|
-
.catch((err) => {
|
|
22
|
-
if (!cancelled) {
|
|
23
|
-
console.warn(err instanceof Error ? err.message : String(err));
|
|
24
|
-
topoFeatures = [];
|
|
25
|
-
}
|
|
26
|
-
});
|
|
27
|
-
return () => {
|
|
28
|
-
cancelled = true;
|
|
29
|
-
};
|
|
30
|
-
});
|
|
31
|
-
const features = $derived.by(() => {
|
|
32
|
-
const data = getData();
|
|
33
|
-
if (isTopology(data))
|
|
34
|
-
return topoFeatures ?? [];
|
|
35
|
-
if (Array.isArray(data))
|
|
36
|
-
return data;
|
|
37
|
-
return data.features;
|
|
38
|
-
});
|
|
39
|
-
return {
|
|
40
|
-
get features() {
|
|
41
|
-
return features;
|
|
42
|
-
}
|
|
43
|
-
};
|
|
44
|
-
}
|
|
@@ -1,72 +0,0 @@
|
|
|
1
|
-
import type { GeoFeature } from '../../types/plots/data/geo';
|
|
2
|
-
/**
|
|
3
|
-
* Bounding-box center of a geometry's flattened coordinates - a cheap
|
|
4
|
-
* approximation used for default label placement, not a true
|
|
5
|
-
* geographic/area centroid (no polygon-hole or geodesic-area weighting).
|
|
6
|
-
* For hover-matching specifically, see `geometryPartCentroids` instead -
|
|
7
|
-
* this single combined point can land far from every actual part of a
|
|
8
|
-
* multi-part geometry whose pieces are geographically spread out.
|
|
9
|
-
*/
|
|
10
|
-
export declare function geometryCentroid(geometry: GeoJSON.Geometry): [number, number];
|
|
11
|
-
/**
|
|
12
|
-
* Splits a geometry into its disjoint parts: one `Polygon` per element of a
|
|
13
|
-
* `MultiPolygon`'s `coordinates`, one `LineString` per element of a
|
|
14
|
-
* `MultiLineString`'s, `GeometryCollection` recursed and flattened, and any
|
|
15
|
-
* other geometry type returned unchanged as its own single-element array.
|
|
16
|
-
* The shared building block behind `geometryPartCentroids` (one centroid per
|
|
17
|
-
* part) and `filterGeometryParts` (keep/drop whole parts).
|
|
18
|
-
*/
|
|
19
|
-
export declare function splitGeometryParts(geometry: GeoJSON.Geometry): GeoJSON.Geometry[];
|
|
20
|
-
/**
|
|
21
|
-
* Like `geometryCentroid`, but returns one point per disjoint part instead
|
|
22
|
-
* of a single bounding-box center across all of them. A `MultiPolygon`
|
|
23
|
-
* whose parts are geographically far apart - e.g. Argentina's "Tierra del
|
|
24
|
-
* Fuego, Antártida e Islas del Atlántico Sur" province, whose `MultiPolygon`
|
|
25
|
-
* spans the mainland island, the Antarctic sector, and the South Atlantic
|
|
26
|
-
* islands in one feature - would otherwise get a single hover point
|
|
27
|
-
* stranded somewhere between all of them, matching hovers over *none* of
|
|
28
|
-
* the actually-rendered shapes. Multiple points attributed to the same
|
|
29
|
-
* feature is fine for hover-matching (nearest point wins, whichever part
|
|
30
|
-
* that is); it's only label placement (`geometryCentroid`) that needs a
|
|
31
|
-
* single point.
|
|
32
|
-
*/
|
|
33
|
-
export declare function geometryPartCentroids(geometry: GeoJSON.Geometry): [number, number][];
|
|
34
|
-
/**
|
|
35
|
-
* Keeps or drops each disjoint part of a geometry (see `splitGeometryParts`)
|
|
36
|
-
* based on a per-part predicate, reassembling a geometry of the same type
|
|
37
|
-
* from whatever survives - `null` if nothing does. Used to let a single
|
|
38
|
-
* feature's geometry be split between the main map and an `inset` marker
|
|
39
|
-
* (see `GeoDataProps.excludeParts`/`GeoInsetMarkerConfig.featurePartsFilter`)
|
|
40
|
-
* without preprocessing the source data: e.g. a province whose `MultiPolygon`
|
|
41
|
-
* spans both a mainland part and a far-flung part can have the main map
|
|
42
|
-
* exclude the latter while an inset shows only it.
|
|
43
|
-
*/
|
|
44
|
-
export declare function filterGeometryParts(geometry: GeoJSON.Geometry, keep: (part: {
|
|
45
|
-
centroid: [number, number];
|
|
46
|
-
geometry: GeoJSON.Geometry;
|
|
47
|
-
}) => boolean): GeoJSON.Geometry | null;
|
|
48
|
-
/** Default `featureId`: `feature.id`, else `properties.id`, else `properties.name`. */
|
|
49
|
-
export declare function defaultFeatureId<TProps extends Record<string, unknown>>(f: GeoFeature<TProps>): string;
|
|
50
|
-
/**
|
|
51
|
-
* `[minLon, minLat, maxLon, maxLat]` across every coordinate of a geometry -
|
|
52
|
-
* `null` for one with none (an empty `GeometryCollection`). Used by
|
|
53
|
-
* `Plot.svelte`'s `dataLonLatBounds` to cap how far a tile layer's
|
|
54
|
-
* letterboxed margin reaches (see `clampBoundsToDataPadding` in
|
|
55
|
-
* `$lib/plots/utils/tiles`).
|
|
56
|
-
*/
|
|
57
|
-
export declare function geometryLonLatBounds(geometry: GeoJSON.Geometry): [number, number, number, number] | null;
|
|
58
|
-
/**
|
|
59
|
-
* Densifies a great-circle arc between two lon/lat points into `steps + 1`
|
|
60
|
-
* points via spherical linear interpolation (slerp) - used to draw a `link`
|
|
61
|
-
* marker's geodesic curve through the `Geo` mark (see `Plot.svelte`).
|
|
62
|
-
*
|
|
63
|
-
* Not delegated to svelteplot's own `Link` mark: its 0.14.2 projection
|
|
64
|
-
* integration (`Mark.svelte`'s paired-channel handling) reads a single
|
|
65
|
-
* `row.x`/`row.y` pair regardless of channel suffix, so a mark bound to
|
|
66
|
-
* `x1`/`y1`/`x2`/`y2` (never plain `x`/`y`) resolves every point as invalid
|
|
67
|
-
* whenever the plot has an active `projection` scale - which GeoPlot always
|
|
68
|
-
* does. `Geo` has no such limitation (geo marks are explicitly excluded from
|
|
69
|
-
* that code path), so a manually-interpolated `LineString` feature sidesteps
|
|
70
|
-
* the bug entirely while still producing the same geodesic visual.
|
|
71
|
-
*/
|
|
72
|
-
export declare function greatCircleInterpolate(lon1: number, lat1: number, lon2: number, lat2: number, steps?: number): [number, number][];
|
|
@@ -1,220 +0,0 @@
|
|
|
1
|
-
function flattenCoords(geom, out) {
|
|
2
|
-
switch (geom.type) {
|
|
3
|
-
case 'Point':
|
|
4
|
-
out.push(geom.coordinates);
|
|
5
|
-
break;
|
|
6
|
-
case 'MultiPoint':
|
|
7
|
-
case 'LineString':
|
|
8
|
-
for (const c of geom.coordinates)
|
|
9
|
-
out.push(c);
|
|
10
|
-
break;
|
|
11
|
-
case 'MultiLineString':
|
|
12
|
-
case 'Polygon':
|
|
13
|
-
for (const ring of geom.coordinates) {
|
|
14
|
-
for (const c of ring)
|
|
15
|
-
out.push(c);
|
|
16
|
-
}
|
|
17
|
-
break;
|
|
18
|
-
case 'MultiPolygon':
|
|
19
|
-
for (const poly of geom.coordinates) {
|
|
20
|
-
for (const ring of poly) {
|
|
21
|
-
for (const c of ring)
|
|
22
|
-
out.push(c);
|
|
23
|
-
}
|
|
24
|
-
}
|
|
25
|
-
break;
|
|
26
|
-
case 'GeometryCollection':
|
|
27
|
-
for (const g of geom.geometries)
|
|
28
|
-
flattenCoords(g, out);
|
|
29
|
-
break;
|
|
30
|
-
}
|
|
31
|
-
}
|
|
32
|
-
function boundsCenter(coords) {
|
|
33
|
-
if (coords.length === 0)
|
|
34
|
-
return [0, 0];
|
|
35
|
-
let minX = Infinity;
|
|
36
|
-
let maxX = -Infinity;
|
|
37
|
-
let minY = Infinity;
|
|
38
|
-
let maxY = -Infinity;
|
|
39
|
-
for (const [x, y] of coords) {
|
|
40
|
-
if (x < minX)
|
|
41
|
-
minX = x;
|
|
42
|
-
if (x > maxX)
|
|
43
|
-
maxX = x;
|
|
44
|
-
if (y < minY)
|
|
45
|
-
minY = y;
|
|
46
|
-
if (y > maxY)
|
|
47
|
-
maxY = y;
|
|
48
|
-
}
|
|
49
|
-
return [(minX + maxX) / 2, (minY + maxY) / 2];
|
|
50
|
-
}
|
|
51
|
-
/**
|
|
52
|
-
* Bounding-box center of a geometry's flattened coordinates - a cheap
|
|
53
|
-
* approximation used for default label placement, not a true
|
|
54
|
-
* geographic/area centroid (no polygon-hole or geodesic-area weighting).
|
|
55
|
-
* For hover-matching specifically, see `geometryPartCentroids` instead -
|
|
56
|
-
* this single combined point can land far from every actual part of a
|
|
57
|
-
* multi-part geometry whose pieces are geographically spread out.
|
|
58
|
-
*/
|
|
59
|
-
export function geometryCentroid(geometry) {
|
|
60
|
-
const coords = [];
|
|
61
|
-
flattenCoords(geometry, coords);
|
|
62
|
-
return boundsCenter(coords);
|
|
63
|
-
}
|
|
64
|
-
/**
|
|
65
|
-
* Splits a geometry into its disjoint parts: one `Polygon` per element of a
|
|
66
|
-
* `MultiPolygon`'s `coordinates`, one `LineString` per element of a
|
|
67
|
-
* `MultiLineString`'s, `GeometryCollection` recursed and flattened, and any
|
|
68
|
-
* other geometry type returned unchanged as its own single-element array.
|
|
69
|
-
* The shared building block behind `geometryPartCentroids` (one centroid per
|
|
70
|
-
* part) and `filterGeometryParts` (keep/drop whole parts).
|
|
71
|
-
*/
|
|
72
|
-
export function splitGeometryParts(geometry) {
|
|
73
|
-
switch (geometry.type) {
|
|
74
|
-
case 'MultiPolygon':
|
|
75
|
-
return geometry.coordinates.map((polygon) => ({ type: 'Polygon', coordinates: polygon }));
|
|
76
|
-
case 'MultiLineString':
|
|
77
|
-
return geometry.coordinates.map((line) => ({ type: 'LineString', coordinates: line }));
|
|
78
|
-
case 'GeometryCollection':
|
|
79
|
-
return geometry.geometries.flatMap((g) => splitGeometryParts(g));
|
|
80
|
-
default:
|
|
81
|
-
return [geometry];
|
|
82
|
-
}
|
|
83
|
-
}
|
|
84
|
-
/**
|
|
85
|
-
* Like `geometryCentroid`, but returns one point per disjoint part instead
|
|
86
|
-
* of a single bounding-box center across all of them. A `MultiPolygon`
|
|
87
|
-
* whose parts are geographically far apart - e.g. Argentina's "Tierra del
|
|
88
|
-
* Fuego, Antártida e Islas del Atlántico Sur" province, whose `MultiPolygon`
|
|
89
|
-
* spans the mainland island, the Antarctic sector, and the South Atlantic
|
|
90
|
-
* islands in one feature - would otherwise get a single hover point
|
|
91
|
-
* stranded somewhere between all of them, matching hovers over *none* of
|
|
92
|
-
* the actually-rendered shapes. Multiple points attributed to the same
|
|
93
|
-
* feature is fine for hover-matching (nearest point wins, whichever part
|
|
94
|
-
* that is); it's only label placement (`geometryCentroid`) that needs a
|
|
95
|
-
* single point.
|
|
96
|
-
*/
|
|
97
|
-
export function geometryPartCentroids(geometry) {
|
|
98
|
-
return splitGeometryParts(geometry).map((part) => geometryCentroid(part));
|
|
99
|
-
}
|
|
100
|
-
/**
|
|
101
|
-
* Keeps or drops each disjoint part of a geometry (see `splitGeometryParts`)
|
|
102
|
-
* based on a per-part predicate, reassembling a geometry of the same type
|
|
103
|
-
* from whatever survives - `null` if nothing does. Used to let a single
|
|
104
|
-
* feature's geometry be split between the main map and an `inset` marker
|
|
105
|
-
* (see `GeoDataProps.excludeParts`/`GeoInsetMarkerConfig.featurePartsFilter`)
|
|
106
|
-
* without preprocessing the source data: e.g. a province whose `MultiPolygon`
|
|
107
|
-
* spans both a mainland part and a far-flung part can have the main map
|
|
108
|
-
* exclude the latter while an inset shows only it.
|
|
109
|
-
*/
|
|
110
|
-
export function filterGeometryParts(geometry, keep) {
|
|
111
|
-
const parts = splitGeometryParts(geometry);
|
|
112
|
-
const keptParts = parts.filter((part) => keep({ centroid: geometryCentroid(part), geometry: part }));
|
|
113
|
-
if (keptParts.length === parts.length)
|
|
114
|
-
return geometry;
|
|
115
|
-
if (keptParts.length === 0)
|
|
116
|
-
return null;
|
|
117
|
-
if (parts.length === 1)
|
|
118
|
-
return keptParts[0];
|
|
119
|
-
switch (geometry.type) {
|
|
120
|
-
case 'MultiPolygon':
|
|
121
|
-
return {
|
|
122
|
-
type: 'MultiPolygon',
|
|
123
|
-
coordinates: keptParts.map((part) => part.coordinates)
|
|
124
|
-
};
|
|
125
|
-
case 'MultiLineString':
|
|
126
|
-
return {
|
|
127
|
-
type: 'MultiLineString',
|
|
128
|
-
coordinates: keptParts.map((part) => part.coordinates)
|
|
129
|
-
};
|
|
130
|
-
case 'GeometryCollection':
|
|
131
|
-
return { type: 'GeometryCollection', geometries: keptParts };
|
|
132
|
-
default:
|
|
133
|
-
return geometry;
|
|
134
|
-
}
|
|
135
|
-
}
|
|
136
|
-
/** Default `featureId`: `feature.id`, else `properties.id`, else `properties.name`. */
|
|
137
|
-
export function defaultFeatureId(f) {
|
|
138
|
-
const props = f.properties;
|
|
139
|
-
return String(f.id ?? props?.id ?? props?.name ?? '');
|
|
140
|
-
}
|
|
141
|
-
/**
|
|
142
|
-
* `[minLon, minLat, maxLon, maxLat]` across every coordinate of a geometry -
|
|
143
|
-
* `null` for one with none (an empty `GeometryCollection`). Used by
|
|
144
|
-
* `Plot.svelte`'s `dataLonLatBounds` to cap how far a tile layer's
|
|
145
|
-
* letterboxed margin reaches (see `clampBoundsToDataPadding` in
|
|
146
|
-
* `$lib/plots/utils/tiles`).
|
|
147
|
-
*/
|
|
148
|
-
export function geometryLonLatBounds(geometry) {
|
|
149
|
-
const coords = [];
|
|
150
|
-
flattenCoords(geometry, coords);
|
|
151
|
-
if (coords.length === 0)
|
|
152
|
-
return null;
|
|
153
|
-
let minLon = Infinity;
|
|
154
|
-
let maxLon = -Infinity;
|
|
155
|
-
let minLat = Infinity;
|
|
156
|
-
let maxLat = -Infinity;
|
|
157
|
-
for (const [lon, lat] of coords) {
|
|
158
|
-
if (lon < minLon)
|
|
159
|
-
minLon = lon;
|
|
160
|
-
if (lon > maxLon)
|
|
161
|
-
maxLon = lon;
|
|
162
|
-
if (lat < minLat)
|
|
163
|
-
minLat = lat;
|
|
164
|
-
if (lat > maxLat)
|
|
165
|
-
maxLat = lat;
|
|
166
|
-
}
|
|
167
|
-
return [minLon, minLat, maxLon, maxLat];
|
|
168
|
-
}
|
|
169
|
-
function toRad(deg) {
|
|
170
|
-
return (deg * Math.PI) / 180;
|
|
171
|
-
}
|
|
172
|
-
function toDeg(rad) {
|
|
173
|
-
return (rad * 180) / Math.PI;
|
|
174
|
-
}
|
|
175
|
-
/**
|
|
176
|
-
* Densifies a great-circle arc between two lon/lat points into `steps + 1`
|
|
177
|
-
* points via spherical linear interpolation (slerp) - used to draw a `link`
|
|
178
|
-
* marker's geodesic curve through the `Geo` mark (see `Plot.svelte`).
|
|
179
|
-
*
|
|
180
|
-
* Not delegated to svelteplot's own `Link` mark: its 0.14.2 projection
|
|
181
|
-
* integration (`Mark.svelte`'s paired-channel handling) reads a single
|
|
182
|
-
* `row.x`/`row.y` pair regardless of channel suffix, so a mark bound to
|
|
183
|
-
* `x1`/`y1`/`x2`/`y2` (never plain `x`/`y`) resolves every point as invalid
|
|
184
|
-
* whenever the plot has an active `projection` scale - which GeoPlot always
|
|
185
|
-
* does. `Geo` has no such limitation (geo marks are explicitly excluded from
|
|
186
|
-
* that code path), so a manually-interpolated `LineString` feature sidesteps
|
|
187
|
-
* the bug entirely while still producing the same geodesic visual.
|
|
188
|
-
*/
|
|
189
|
-
export function greatCircleInterpolate(lon1, lat1, lon2, lat2, steps = 64) {
|
|
190
|
-
const phi1 = toRad(lat1);
|
|
191
|
-
const lambda1 = toRad(lon1);
|
|
192
|
-
const phi2 = toRad(lat2);
|
|
193
|
-
const lambda2 = toRad(lon2);
|
|
194
|
-
const sinPhi1 = Math.sin(phi1);
|
|
195
|
-
const cosPhi1 = Math.cos(phi1);
|
|
196
|
-
const sinPhi2 = Math.sin(phi2);
|
|
197
|
-
const cosPhi2 = Math.cos(phi2);
|
|
198
|
-
const d = 2 *
|
|
199
|
-
Math.asin(Math.sqrt(Math.sin((phi2 - phi1) / 2) ** 2 +
|
|
200
|
-
cosPhi1 * cosPhi2 * Math.sin((lambda2 - lambda1) / 2) ** 2));
|
|
201
|
-
if (!Number.isFinite(d) || d === 0) {
|
|
202
|
-
return [
|
|
203
|
-
[lon1, lat1],
|
|
204
|
-
[lon2, lat2]
|
|
205
|
-
];
|
|
206
|
-
}
|
|
207
|
-
const points = [];
|
|
208
|
-
for (let i = 0; i <= steps; i++) {
|
|
209
|
-
const f = i / steps;
|
|
210
|
-
const a = Math.sin((1 - f) * d) / Math.sin(d);
|
|
211
|
-
const b = Math.sin(f * d) / Math.sin(d);
|
|
212
|
-
const x = a * cosPhi1 * Math.cos(lambda1) + b * cosPhi2 * Math.cos(lambda2);
|
|
213
|
-
const y = a * cosPhi1 * Math.sin(lambda1) + b * cosPhi2 * Math.sin(lambda2);
|
|
214
|
-
const z = a * sinPhi1 + b * sinPhi2;
|
|
215
|
-
const phi = Math.atan2(z, Math.sqrt(x * x + y * y));
|
|
216
|
-
const lambda = Math.atan2(y, x);
|
|
217
|
-
points.push([toDeg(lambda), toDeg(phi)]);
|
|
218
|
-
}
|
|
219
|
-
return points;
|
|
220
|
-
}
|
|
@@ -1,29 +0,0 @@
|
|
|
1
|
-
import type { ChannelScalesConfig } from '../../types/layout/scales';
|
|
2
|
-
import type { Segment } from '../../types/plots/segments/config';
|
|
3
|
-
import type { SegmentsConfig } from '../../types/plots/props';
|
|
4
|
-
/**
|
|
5
|
-
* Feature-specific segments listed after 'default' so they override it on
|
|
6
|
-
* merge (see `resolveFeatureStyle`). When the feature has a resolved
|
|
7
|
-
* `grouping` bucket, that bucket's own entries are listed in between -
|
|
8
|
-
* `default` < grouping bucket < feature-specific, most specific last.
|
|
9
|
-
*/
|
|
10
|
-
export declare function resolveSegmentsForFeature<TStyle>(segments: SegmentsConfig<TStyle>, featureId: string, groupingValue?: string): Segment<TStyle>[];
|
|
11
|
-
/**
|
|
12
|
-
* A geo feature is atomic - `Segment.areas` (x/y range restriction) doesn't
|
|
13
|
-
* apply, so every entry under a key is treated as a flat style patch applied
|
|
14
|
-
* in order: `'default'` entries apply first, then the grouping bucket's (if
|
|
15
|
-
* any), then feature-specific entries. This intentionally does NOT reuse
|
|
16
|
-
* `segments.ts`'s `validateSegments` - its "only the first catch-all wins"
|
|
17
|
-
* warning assumes area-based semantics that don't hold here, since every geo
|
|
18
|
-
* segment entry merges rather than being dropped.
|
|
19
|
-
*/
|
|
20
|
-
export declare function resolveFeatureStyle<TStyle extends object>(segments: SegmentsConfig<TStyle>, featureId: string, groupingValue?: string): TStyle;
|
|
21
|
-
/**
|
|
22
|
-
* A feature's own effective `scales` override, if any of its matching
|
|
23
|
-
* segments (`default`, its grouping bucket, or itself) set one - the last
|
|
24
|
-
* (most specific) entry that defines `scales` wins outright, unlike
|
|
25
|
-
* `resolveFeatureStyle`'s field-by-field merge, since a ramp config isn't
|
|
26
|
-
* sensibly mergeable key-by-key (a `domain` from one entry and a `scheme`
|
|
27
|
-
* from another wouldn't be a coherent scale).
|
|
28
|
-
*/
|
|
29
|
-
export declare function resolveFeatureScales<TStyle>(segments: SegmentsConfig<TStyle>, featureId: string, groupingValue?: string): ChannelScalesConfig | undefined;
|
|
@@ -1,37 +0,0 @@
|
|
|
1
|
-
const DEFAULT_KEY = 'default';
|
|
2
|
-
/**
|
|
3
|
-
* Feature-specific segments listed after 'default' so they override it on
|
|
4
|
-
* merge (see `resolveFeatureStyle`). When the feature has a resolved
|
|
5
|
-
* `grouping` bucket, that bucket's own entries are listed in between -
|
|
6
|
-
* `default` < grouping bucket < feature-specific, most specific last.
|
|
7
|
-
*/
|
|
8
|
-
export function resolveSegmentsForFeature(segments, featureId, groupingValue) {
|
|
9
|
-
return [
|
|
10
|
-
...(segments[DEFAULT_KEY] ?? []),
|
|
11
|
-
...(groupingValue ? (segments[groupingValue] ?? []) : []),
|
|
12
|
-
...(segments[featureId] ?? [])
|
|
13
|
-
];
|
|
14
|
-
}
|
|
15
|
-
/**
|
|
16
|
-
* A geo feature is atomic - `Segment.areas` (x/y range restriction) doesn't
|
|
17
|
-
* apply, so every entry under a key is treated as a flat style patch applied
|
|
18
|
-
* in order: `'default'` entries apply first, then the grouping bucket's (if
|
|
19
|
-
* any), then feature-specific entries. This intentionally does NOT reuse
|
|
20
|
-
* `segments.ts`'s `validateSegments` - its "only the first catch-all wins"
|
|
21
|
-
* warning assumes area-based semantics that don't hold here, since every geo
|
|
22
|
-
* segment entry merges rather than being dropped.
|
|
23
|
-
*/
|
|
24
|
-
export function resolveFeatureStyle(segments, featureId, groupingValue) {
|
|
25
|
-
return resolveSegmentsForFeature(segments, featureId, groupingValue).reduce((acc, seg) => ({ ...acc, ...(seg.styles ?? {}) }), {});
|
|
26
|
-
}
|
|
27
|
-
/**
|
|
28
|
-
* A feature's own effective `scales` override, if any of its matching
|
|
29
|
-
* segments (`default`, its grouping bucket, or itself) set one - the last
|
|
30
|
-
* (most specific) entry that defines `scales` wins outright, unlike
|
|
31
|
-
* `resolveFeatureStyle`'s field-by-field merge, since a ramp config isn't
|
|
32
|
-
* sensibly mergeable key-by-key (a `domain` from one entry and a `scheme`
|
|
33
|
-
* from another wouldn't be a coherent scale).
|
|
34
|
-
*/
|
|
35
|
-
export function resolveFeatureScales(segments, featureId, groupingValue) {
|
|
36
|
-
return resolveSegmentsForFeature(segments, featureId, groupingValue).reduce((acc, seg) => seg.scales ?? acc, undefined);
|
|
37
|
-
}
|
|
@@ -1,122 +0,0 @@
|
|
|
1
|
-
import type { ValueAnchor } from '../plots/constants';
|
|
2
|
-
import type { FontStyle, StrokeStyle, AreaStyle } from '../plots/styling';
|
|
3
|
-
import type { GeoFeature } from '../plots/data/geo';
|
|
4
|
-
import type { GapsConfig } from '../plots/gaps';
|
|
5
|
-
/**
|
|
6
|
-
* Controls if and how value labels are rendered on a plot, drawn as a `text`
|
|
7
|
-
* marker over the rows the plot itself draws (after its own `transforms`):
|
|
8
|
-
* one at the end of each series on a line or area plot, one per bar on a bar,
|
|
9
|
-
* pyramid or histogram plot, one per point on a scatter plot and one per cell
|
|
10
|
-
* on a heatmap. The high-level `anchor` sets sensible defaults for placement;
|
|
11
|
-
* `fontStyle` (`dx`, `dy`, `textAnchor`, `lineAnchor`, `lineHeight`, `rotate`,
|
|
12
|
-
* `class`, `textClass`, `fill`, …) overrides those defaults field-by-field when
|
|
13
|
-
* provided - mirrors {@link DeltaConfig}'s `fontStyle`/`strokeStyle` split, so
|
|
14
|
-
* label text and connector-line styling never mix into one flat bag of props.
|
|
15
|
-
*/
|
|
16
|
-
export type ValuesStyle = {
|
|
17
|
-
/** Whether the labels are drawn. Off by default, except on a heatmap. */
|
|
18
|
-
show?: boolean;
|
|
19
|
-
/** Where each label sits on its mark - see {@link ValueAnchor}. */
|
|
20
|
-
anchor?: ValueAnchor;
|
|
21
|
-
/** A label's text, from its row's own value (a histogram bin's count) and its series. */
|
|
22
|
-
format?: (value: number, seriesName: string) => string;
|
|
23
|
-
/** Hovering a label dims every other series, like toggling them off in the legend. */
|
|
24
|
-
hoverIsolate?: boolean;
|
|
25
|
-
fontStyle?: FontStyle;
|
|
26
|
-
/** The connectors a line or area plot routes back from labels that had to move apart. */
|
|
27
|
-
strokeStyle?: StrokeStyle;
|
|
28
|
-
};
|
|
29
|
-
/**
|
|
30
|
-
* Decorative border around the plot's own content box - svelteplot's
|
|
31
|
-
* `Frame` mark, purely cosmetic (drawn from the box geometry, never from
|
|
32
|
-
* data). `true` enables it with svelteplot's own defaults; an object
|
|
33
|
-
* enables it and overrides its look field-by-field. Insets pull the frame
|
|
34
|
-
* in from the content box's own edges, in pixels.
|
|
35
|
-
*/
|
|
36
|
-
export type FrameStyle = AreaStyle & {
|
|
37
|
-
inset?: number;
|
|
38
|
-
insetTop?: number;
|
|
39
|
-
insetRight?: number;
|
|
40
|
-
insetBottom?: number;
|
|
41
|
-
insetLeft?: number;
|
|
42
|
-
};
|
|
43
|
-
/** Author-facing `styles.frame` prop - see {@link FrameStyle}. */
|
|
44
|
-
export type FrameProp = boolean | FrameStyle;
|
|
45
|
-
/**
|
|
46
|
-
* The fields every plot kind's own `styles` shape shares - the common parent
|
|
47
|
-
* of {@link AxisBasedStylesConfig} and {@link GeoStylesConfig}.
|
|
48
|
-
*/
|
|
49
|
-
export type BasePlotStylesConfig = {
|
|
50
|
-
/** Decorative border around the plot's content box - see {@link FrameStyle}. Available on every plot kind. */
|
|
51
|
-
frame?: FrameProp;
|
|
52
|
-
};
|
|
53
|
-
/**
|
|
54
|
-
* Top-level rendering style overrides shared by the non-geo plot kinds.
|
|
55
|
-
* Passed as the `styles` prop. Each plot reads only the fields it cares
|
|
56
|
-
* about.
|
|
57
|
-
*/
|
|
58
|
-
export type AxisBasedStylesConfig = BasePlotStylesConfig & {
|
|
59
|
-
values?: ValuesStyle;
|
|
60
|
-
};
|
|
61
|
-
/**
|
|
62
|
-
* `AxisBasedStylesConfig` extended with `gaps` - the interpolated
|
|
63
|
-
* missing-data bridge fill available to plot kinds with an inherent
|
|
64
|
-
* category/sequence ordering (`LinePlot`, `BarPlot`, `PyramidPlot`).
|
|
65
|
-
* Resolved per series like `segments`, at zone granularity - see
|
|
66
|
-
* {@link GapsConfig}.
|
|
67
|
-
*/
|
|
68
|
-
export type GapsAwarePlotStylesConfig<TSegmentStyle extends object> = AxisBasedStylesConfig & {
|
|
69
|
-
gaps?: GapsConfig<TSegmentStyle>;
|
|
70
|
-
};
|
|
71
|
-
export type GeoTileLayerConfig = {
|
|
72
|
-
/** XYZ tile URL template, e.g. `'https://tile.openstreetmap.org/{z}/{x}/{y}.png'`. */
|
|
73
|
-
url: string;
|
|
74
|
-
attribution?: string;
|
|
75
|
-
opacity?: number;
|
|
76
|
-
minZoom?: number;
|
|
77
|
-
maxZoom?: number;
|
|
78
|
-
/** Tile edge length in pixels. Defaults to `256`. */
|
|
79
|
-
tileSize?: number;
|
|
80
|
-
};
|
|
81
|
-
/**
|
|
82
|
-
* `styles` prop for GeoPlot - the geo analog of `AxisBasedStylesConfig`,
|
|
83
|
-
* sharing only {@link BasePlotStylesConfig}'s common ground with it. Unlike
|
|
84
|
-
* the other plot kinds, GeoPlot's styling needs (base map, choropleth ramp,
|
|
85
|
-
* tile background, click handling) are unlike anything x/y plots need, so
|
|
86
|
-
* this is its own type rather than a reuse of `AxisBasedStylesConfig`.
|
|
87
|
-
*/
|
|
88
|
-
export type GeoStylesConfig<TProps extends Record<string, unknown> = Record<string, unknown>> = BasePlotStylesConfig & {
|
|
89
|
-
/** Base map fill, used when a feature isn't styled by `segments` or the choropleth ramp. */
|
|
90
|
-
fill?: string;
|
|
91
|
-
fillOpacity?: number;
|
|
92
|
-
stroke?: string;
|
|
93
|
-
strokeWidth?: number;
|
|
94
|
-
/** Raster XYZ tile basemap under the vector geometry. Mercator-family projections only. */
|
|
95
|
-
tileLayer?: GeoTileLayerConfig;
|
|
96
|
-
/** Fired when a base-map feature is clicked. */
|
|
97
|
-
onFeatureClick?: (feature: GeoFeature<TProps>, event: Event) => void;
|
|
98
|
-
};
|
|
99
|
-
/**
|
|
100
|
-
* `GeoTileLayerConfig`, plus `features` - never author-facing (the public
|
|
101
|
-
* `styles.tileLayer` shape, {@link GeoTileLayerConfig}, doesn't declare it).
|
|
102
|
-
* `GeoPlot` tacks it onto its own internal copy of `styles` so `StylesLayout`
|
|
103
|
-
* can compute the tile layer's auto-fit bounds without needing raw geometry
|
|
104
|
-
* threaded through as a separate prop.
|
|
105
|
-
*/
|
|
106
|
-
type GeoTileLayerConfigWithFeatures = GeoTileLayerConfig & {
|
|
107
|
-
features?: {
|
|
108
|
-
geometry: GeoJSON.Geometry;
|
|
109
|
-
}[];
|
|
110
|
-
};
|
|
111
|
-
/**
|
|
112
|
-
* The minimal slice of a plot kind's own `styles` prop `StylesLayout` reads -
|
|
113
|
-
* every concrete `styles` type ({@link AxisBasedStylesConfig},
|
|
114
|
-
* {@link GeoStylesConfig}) structurally satisfies this whether or not it
|
|
115
|
-
* declares `tileLayer` at all (a missing optional field type-checks fine).
|
|
116
|
-
*/
|
|
117
|
-
export type StylesLayoutConfig = {
|
|
118
|
-
tileLayer?: GeoTileLayerConfigWithFeatures;
|
|
119
|
-
frame?: FrameProp;
|
|
120
|
-
[key: string]: unknown;
|
|
121
|
-
};
|
|
122
|
-
export {};
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
/** Curve interpolation for an area, difference or trail marker - svelteplot's own `CurveName`. */
|
|
2
|
-
export type MarkerCurveName = 'basis' | 'basis-closed' | 'basis-open' | 'bundle' | 'bump-x' | 'bump-y' | 'cardinal' | 'cardinal-closed' | 'cardinal-open' | 'catmull-rom' | 'catmull-rom-closed' | 'catmull-rom-open' | 'linear' | 'linear-closed' | 'monotone-x' | 'monotone-y' | 'natural' | 'step' | 'step-after' | 'step-before';
|
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
import type { BasePlotProps, PlotCoreProps } from '../props';
|
|
2
|
-
import type { AxisBasedScalesConfig } from '../../layout/scales';
|
|
3
|
-
import type { AxisBasedMarkersConfig } from '../../markers/common';
|
|
4
|
-
import type { SeriesProps, DataProps } from '../data/common';
|
|
5
|
-
import type { GapsAwarePlotStylesConfig } from '../../layout/styles';
|
|
6
|
-
import type { LineSegmentStyle } from '../segments/common';
|
|
7
|
-
/** `LinePlot`'s public props. */
|
|
8
|
-
export type LinePlotProps<TData extends Record<string, unknown>> = BasePlotProps<SeriesProps<TData> | DataProps<TData>, TData, GapsAwarePlotStylesConfig<LineSegmentStyle>, LineSegmentStyle, AxisBasedMarkersConfig, AxisBasedScalesConfig<TData>>;
|
|
9
|
-
/** What `LinePlot`'s core draws from. */
|
|
10
|
-
export type LinePlotCoreProps<TData extends Record<string, unknown>> = PlotCoreProps<SeriesProps<TData> | DataProps<TData>, TData, GapsAwarePlotStylesConfig<LineSegmentStyle>, LineSegmentStyle, AxisBasedMarkersConfig, AxisBasedScalesConfig<TData>>;
|
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
/** WCAG contrast ratio between two colors, from 1 (no contrast) to 21 (black on white). */
|
|
2
|
-
export declare function contrastRatio(colorA: string, colorB: string): number;
|
|
3
|
-
/**
|
|
4
|
-
* The `candidates` entry with the highest WCAG contrast ratio against
|
|
5
|
-
* `background`. Defaults to plain white/black; pass a grayscale or other
|
|
6
|
-
* palette to widen the choice. Falls back to the first candidate when
|
|
7
|
-
* `background` can't be parsed.
|
|
8
|
-
*/
|
|
9
|
-
export declare function contrastTextColor(background: string, candidates?: string[]): string;
|
|
@@ -1,40 +0,0 @@
|
|
|
1
|
-
import { resolveCssColor, parseRgb } from './cssColor';
|
|
2
|
-
function relativeLuminance([r, g, b]) {
|
|
3
|
-
const [rs, gs, bs] = [r, g, b].map((c) => {
|
|
4
|
-
const s = c / 255;
|
|
5
|
-
return s <= 0.03928 ? s / 12.92 : Math.pow((s + 0.055) / 1.055, 2.4);
|
|
6
|
-
});
|
|
7
|
-
return 0.2126 * rs + 0.7152 * gs + 0.0722 * bs;
|
|
8
|
-
}
|
|
9
|
-
/** WCAG contrast ratio between two colors, from 1 (no contrast) to 21 (black on white). */
|
|
10
|
-
export function contrastRatio(colorA, colorB) {
|
|
11
|
-
const a = parseRgb(resolveCssColor(colorA));
|
|
12
|
-
const b = parseRgb(resolveCssColor(colorB));
|
|
13
|
-
if (!a || !b)
|
|
14
|
-
return 1;
|
|
15
|
-
const lA = relativeLuminance(a);
|
|
16
|
-
const lB = relativeLuminance(b);
|
|
17
|
-
const lighter = Math.max(lA, lB);
|
|
18
|
-
const darker = Math.min(lA, lB);
|
|
19
|
-
return (lighter + 0.05) / (darker + 0.05);
|
|
20
|
-
}
|
|
21
|
-
/**
|
|
22
|
-
* The `candidates` entry with the highest WCAG contrast ratio against
|
|
23
|
-
* `background`. Defaults to plain white/black; pass a grayscale or other
|
|
24
|
-
* palette to widen the choice. Falls back to the first candidate when
|
|
25
|
-
* `background` can't be parsed.
|
|
26
|
-
*/
|
|
27
|
-
export function contrastTextColor(background, candidates = ['#ffffff', '#000000']) {
|
|
28
|
-
if (candidates.length === 0)
|
|
29
|
-
return '#000000';
|
|
30
|
-
let best = candidates[0];
|
|
31
|
-
let bestRatio = -Infinity;
|
|
32
|
-
for (const candidate of candidates) {
|
|
33
|
-
const ratio = contrastRatio(background, candidate);
|
|
34
|
-
if (ratio > bestRatio) {
|
|
35
|
-
bestRatio = ratio;
|
|
36
|
-
best = candidate;
|
|
37
|
-
}
|
|
38
|
-
}
|
|
39
|
-
return best;
|
|
40
|
-
}
|
|
@@ -1,4 +0,0 @@
|
|
|
1
|
-
/** Resolves a `var(--x)` reference to its computed value; any other CSS color string passes through unchanged. */
|
|
2
|
-
export declare function resolveCssColor(color: string): string;
|
|
3
|
-
/** 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. */
|
|
4
|
-
export declare function parseRgb(color: string): [number, number, number] | null;
|