@fundar/data-chart-telling 0.0.64 → 1.1.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 +38 -0
- package/LICENSE +21 -0
- package/README.md +112 -553
- package/dist/configuration/config.svelte.d.ts +5 -5
- package/dist/configuration/config.svelte.js +142 -46
- package/dist/configuration/fonts.d.ts +6 -0
- package/dist/configuration/fonts.js +6 -0
- package/dist/configuration/themes/compact.d.ts +2 -2
- package/dist/configuration/themes/compact.js +1 -1
- package/dist/configuration/themes/dark.d.ts +2 -2
- package/dist/configuration/themes/dark.js +5 -4
- package/dist/configuration/themes/default.d.ts +8 -3
- package/dist/configuration/themes/default.js +8 -2
- package/dist/configuration/themes/editorial.d.ts +2 -2
- package/dist/configuration/themes/editorial.js +2 -2
- package/dist/configuration/themes/index.d.ts +545 -80
- package/dist/configuration/themes/index.js +6 -5
- package/dist/index.d.ts +35 -48
- package/dist/index.js +20 -35
- package/dist/layout/base/BasePlotLayout.svelte +325 -0
- package/dist/layout/base/BasePlotLayout.svelte.d.ts +111 -0
- package/dist/layout/composer/PlotComposer.svelte +94 -0
- package/dist/layout/composer/PlotComposer.svelte.d.ts +13 -0
- package/dist/layout/coordinates/CameraFit.svelte +4 -4
- package/dist/layout/coordinates/CoordinatesLayout.svelte +11 -3
- package/dist/layout/coordinates/CoordinatesLayout.svelte.d.ts +6 -2
- package/dist/layout/coordinates/camera.svelte.d.ts +1 -1
- package/dist/layout/coordinates/camera.svelte.js +6 -6
- package/dist/layout/coordinates/projections/argentina.js +3 -3
- package/dist/layout/coordinates/projections/fit.js +1 -1
- package/dist/layout/coordinates/resolveCameraTarget.d.ts +1 -1
- package/dist/layout/coordinates/resolveProjection.d.ts +1 -1
- package/dist/layout/coordinates/resolveProjection.js +2 -2
- package/dist/layout/coordinates/rotate.svelte.d.ts +3 -3
- package/dist/layout/coordinates/rotate.svelte.js +8 -8
- package/dist/layout/coordinates/zoom.svelte.d.ts +1 -1
- package/dist/layout/facet/FacetIndicator.svelte +23 -23
- package/dist/layout/facet/FacetLayout.svelte +435 -398
- package/dist/layout/facet/FacetLayout.svelte.d.ts +9 -3
- package/dist/layout/facet/axes.d.ts +16 -0
- package/dist/layout/facet/axes.js +25 -0
- package/dist/layout/facet/config.d.ts +32 -0
- package/dist/layout/facet/config.js +82 -0
- package/dist/layout/figure/Figure.svelte +177 -0
- package/dist/layout/figure/Figure.svelte.d.ts +14 -0
- package/dist/layout/figure/FigureChrome.svelte +341 -0
- package/dist/layout/figure/FigureChrome.svelte.d.ts +21 -0
- package/dist/layout/geometry/FrameClip.svelte +45 -0
- package/dist/layout/geometry/FrameClip.svelte.d.ts +8 -0
- package/dist/layout/geometry/FrameClipping.d.ts +24 -0
- package/dist/layout/geometry/FrameClipping.js +40 -0
- package/dist/layout/geometry/GeometryLayout.svelte +287 -224
- package/dist/layout/geometry/GeometryLayout.svelte.d.ts +10 -10
- package/dist/layout/grid/Grid.svelte +194 -0
- package/dist/layout/grid/Grid.svelte.d.ts +26 -0
- package/dist/layout/grid/GridAlignment.svelte.d.ts +31 -0
- package/dist/layout/grid/GridAlignment.svelte.js +56 -0
- package/dist/layout/grid/GridCell.svelte +141 -0
- package/dist/layout/grid/GridCell.svelte.d.ts +17 -0
- package/dist/layout/grid/GridCellsRegistry.svelte.d.ts +52 -0
- package/dist/layout/grid/GridCellsRegistry.svelte.js +70 -0
- package/dist/layout/grid/GridPlan.d.ts +49 -0
- package/dist/layout/grid/GridPlan.js +167 -0
- package/dist/layout/grid/Tags.d.ts +8 -0
- package/dist/layout/grid/Tags.js +39 -0
- package/dist/layout/hover/HoverScope.svelte +11 -0
- package/dist/layout/hover/HoverScope.svelte.d.ts +8 -0
- package/dist/layout/hover/HoverSettings.d.ts +34 -0
- package/dist/layout/hover/HoverSettings.js +52 -0
- package/dist/layout/hover/HoverState.svelte.d.ts +47 -0
- package/dist/layout/hover/HoverState.svelte.js +99 -0
- package/dist/layout/hover/PlotHover.svelte.d.ts +63 -0
- package/dist/layout/hover/PlotHover.svelte.js +133 -0
- package/dist/layout/interaction/PlotInteraction.svelte.d.ts +38 -0
- package/dist/layout/interaction/PlotInteraction.svelte.js +56 -0
- package/dist/layout/legend/AxisNumberFormat.d.ts +12 -0
- package/dist/layout/legend/AxisNumberFormat.js +25 -0
- package/dist/layout/legend/ContinuousSection.svelte +363 -351
- package/dist/layout/legend/DisabledStyle.d.ts +19 -0
- package/dist/layout/legend/DisabledStyle.js +57 -0
- package/dist/layout/legend/DiscreteBadgeItem.svelte +6 -3
- package/dist/layout/legend/DiscreteSection.svelte +32 -32
- package/dist/layout/legend/DiscreteSwatchItem.svelte +4 -1
- package/dist/layout/legend/DiscreteSymbolIcon.svelte +14 -9
- package/dist/layout/legend/LegendChannels.d.ts +21 -0
- package/dist/layout/legend/LegendChannels.js +221 -0
- package/dist/layout/legend/LegendLayout.svelte +49 -43
- package/dist/layout/legend/LegendState.svelte.d.ts +84 -0
- package/dist/layout/legend/LegendState.svelte.js +333 -0
- package/dist/layout/legend/LegendText.d.ts +12 -0
- package/dist/layout/legend/LegendText.js +22 -0
- package/dist/layout/legend/SizeSection.svelte +84 -0
- package/dist/layout/legend/SizeSection.svelte.d.ts +7 -0
- package/dist/layout/legend/SymbolSection.svelte +31 -0
- package/dist/layout/legend/SymbolSection.svelte.d.ts +8 -0
- package/dist/layout/margins/Box.d.ts +84 -0
- package/dist/layout/margins/Box.js +138 -0
- package/dist/layout/margins/Margins.d.ts +37 -0
- package/dist/layout/margins/Margins.js +71 -0
- package/dist/layout/margins/PlotMargins.svelte.d.ts +101 -0
- package/dist/layout/margins/PlotMargins.svelte.js +219 -0
- package/dist/layout/plot/Core.svelte +61 -0
- package/dist/layout/plot/Core.svelte.d.ts +41 -0
- package/dist/layout/plot/PanelRun.svelte +28 -0
- package/dist/{charts/heatmap/Chart.svelte.d.ts → layout/plot/PanelRun.svelte.d.ts} +11 -7
- package/dist/layout/plot/Plot.svelte +287 -0
- package/dist/layout/plot/Plot.svelte.d.ts +49 -0
- package/dist/layout/plot/PlotContext.d.ts +41 -0
- package/dist/layout/plot/PlotContext.js +46 -0
- package/dist/layout/plot/PublicPlotContext.d.ts +131 -0
- package/dist/layout/plot/PublicPlotContext.js +240 -0
- package/dist/layout/plot/Slice.d.ts +44 -0
- package/dist/layout/plot/Slice.js +100 -0
- package/dist/layout/plot/usePlot.d.ts +9 -0
- package/dist/layout/plot/usePlot.js +13 -0
- package/dist/layout/scales/EdgeTicks.d.ts +39 -0
- package/dist/layout/scales/EdgeTicks.js +82 -0
- package/dist/layout/scales/NiceTicks.d.ts +40 -0
- package/dist/layout/scales/NiceTicks.js +72 -0
- package/dist/layout/scales/ScalesLayout.svelte +275 -206
- package/dist/layout/scales/ScalesLayout.svelte.d.ts +7 -1
- package/dist/layout/scales/SveltePlotScale.d.ts +15 -0
- package/dist/layout/scales/SveltePlotScale.js +79 -0
- package/dist/layout/styles/StylesLayout.svelte +65 -65
- package/dist/layout/styles/TileLayer.svelte +78 -76
- package/dist/layout/styles/TileLayer.svelte.d.ts +1 -1
- package/dist/layout/styles/ValueLabels.d.ts +97 -0
- package/dist/layout/styles/ValueLabels.js +238 -0
- package/dist/layout/timeline/Timeline.svelte +83 -74
- package/dist/layout/timeline/Timeline.svelte.d.ts +2 -0
- package/dist/layout/timeline/TimelineFrame.svelte +86 -0
- package/dist/layout/timeline/TimelineFrame.svelte.d.ts +16 -0
- package/dist/layout/timeline/TimelineLayout.svelte +140 -169
- package/dist/layout/timeline/TimelineLayout.svelte.d.ts +7 -3
- package/dist/layout/timeline/TimelinePlayer.svelte +195 -0
- package/dist/layout/timeline/TimelinePlayer.svelte.d.ts +7 -0
- package/dist/layout/timeline/TimelineRule.svelte +51 -0
- package/dist/layout/timeline/TimelineRule.svelte.d.ts +7 -0
- package/dist/layout/timeline/TimelineState.svelte.d.ts +90 -0
- package/dist/layout/timeline/TimelineState.svelte.js +260 -0
- package/dist/layout/timeline/TimelineSteps.d.ts +24 -0
- package/dist/layout/timeline/TimelineSteps.js +48 -0
- package/dist/layout/timeline/TimelineTime.d.ts +18 -0
- package/dist/layout/timeline/TimelineTime.js +117 -0
- package/dist/layout/tooltip/Tooltip.svelte +85 -85
- package/dist/layout/tooltip/Tooltip.svelte.d.ts +45 -24
- package/dist/layout/tooltip/TooltipState.svelte.d.ts +67 -0
- package/dist/layout/tooltip/TooltipState.svelte.js +126 -0
- package/dist/markers/MarkerKinds.d.ts +173 -0
- package/dist/markers/MarkerKinds.js +51 -0
- package/dist/markers/area/AreaMarker.svelte +110 -0
- package/dist/markers/area/AreaMarker.svelte.d.ts +7 -0
- package/dist/markers/arrow/ArrowMarker.svelte +28 -0
- package/dist/markers/arrow/ArrowMarker.svelte.d.ts +7 -0
- package/dist/markers/{BarMarker.svelte → bar/BarMarker.svelte} +54 -52
- package/dist/markers/{BarMarker.svelte.d.ts → bar/BarMarker.svelte.d.ts} +1 -1
- package/dist/markers/bollinger/BollingerMarker.svelte +44 -0
- package/dist/markers/bollinger/BollingerMarker.svelte.d.ts +7 -0
- package/dist/markers/box/BoxMarker.svelte +143 -0
- package/dist/markers/box/BoxMarker.svelte.d.ts +7 -0
- package/dist/markers/brush/BrushMarker.svelte +32 -0
- package/dist/markers/brush/BrushMarker.svelte.d.ts +7 -0
- package/dist/markers/cell/CellMarker.svelte +27 -0
- package/dist/markers/{CellMarker.svelte.d.ts → cell/CellMarker.svelte.d.ts} +1 -1
- package/dist/markers/contour/ContourClipMarker.svelte +83 -0
- package/dist/markers/{ContourClipMarker.svelte.d.ts → contour/ContourClipMarker.svelte.d.ts} +1 -1
- package/dist/markers/contour/ContourMarker.svelte +28 -0
- package/dist/markers/{ContourMarker.svelte.d.ts → contour/ContourMarker.svelte.d.ts} +1 -1
- package/dist/markers/delaunay/DelaunayLinkMarker.svelte +26 -0
- package/dist/markers/delaunay/DelaunayLinkMarker.svelte.d.ts +7 -0
- package/dist/markers/delaunay/DelaunayMeshMarker.svelte +26 -0
- package/dist/markers/delaunay/DelaunayMeshMarker.svelte.d.ts +7 -0
- package/dist/markers/delta/Delta.d.ts +21 -0
- package/dist/markers/delta/Delta.js +60 -0
- package/dist/markers/delta/DeltaMarker.svelte +96 -0
- package/dist/markers/{DeltaMarker.svelte.d.ts → delta/DeltaMarker.svelte.d.ts} +2 -2
- package/dist/markers/density/DensityMarker.svelte +63 -0
- package/dist/markers/density/DensityMarker.svelte.d.ts +7 -0
- package/dist/markers/difference/DifferenceMarker.svelte +30 -0
- package/dist/markers/difference/DifferenceMarker.svelte.d.ts +7 -0
- package/dist/markers/dot/DotMarker.svelte +102 -0
- package/dist/markers/{DotMarker.svelte.d.ts → dot/DotMarker.svelte.d.ts} +5 -17
- package/dist/markers/geo/GeoFeaturesMarker.svelte +39 -0
- package/dist/markers/{GeoFeaturesMarker.svelte.d.ts → geo/GeoFeaturesMarker.svelte.d.ts} +1 -1
- package/dist/markers/geo/GeoHoverMarker.svelte +28 -0
- package/dist/markers/{GeoHoverMarker.svelte.d.ts → geo/GeoHoverMarker.svelte.d.ts} +2 -2
- package/dist/markers/geo/GraticuleMarker.svelte +18 -0
- package/dist/markers/{GraticuleMarker.svelte.d.ts → geo/GraticuleMarker.svelte.d.ts} +1 -1
- package/dist/markers/geo/SphereMarker.svelte +15 -0
- package/dist/markers/{SphereMarker.svelte.d.ts → geo/SphereMarker.svelte.d.ts} +1 -1
- package/dist/markers/hover/HoverMarker.svelte +252 -0
- package/dist/markers/{HoverMarker.svelte.d.ts → hover/HoverMarker.svelte.d.ts} +10 -10
- package/dist/markers/hull/HullMarker.svelte +25 -0
- package/dist/markers/hull/HullMarker.svelte.d.ts +7 -0
- package/dist/markers/image/ImageMarker.svelte +22 -0
- package/dist/markers/image/ImageMarker.svelte.d.ts +7 -0
- package/dist/markers/inset/InsetMarker.svelte +184 -150
- package/dist/markers/inset/InsetMarker.svelte.d.ts +4 -4
- package/dist/markers/inset/insetLayout.d.ts +1 -1
- package/dist/markers/inset/insetLayout.js +6 -2
- package/dist/markers/inset/insetProjection.d.ts +1 -1
- package/dist/markers/inset/insetProjection.js +3 -3
- package/dist/markers/line/LineMarker.svelte +30 -0
- package/dist/markers/{LineMarker.svelte.d.ts → line/LineMarker.svelte.d.ts} +1 -1
- package/dist/markers/link/LinkMarker.svelte +47 -0
- package/dist/markers/{LinkMarker.svelte.d.ts → link/LinkMarker.svelte.d.ts} +1 -1
- package/dist/markers/raster/RasterMarker.svelte +31 -0
- package/dist/markers/raster/RasterMarker.svelte.d.ts +7 -0
- package/dist/markers/rect/RectMarker.svelte +62 -0
- package/dist/markers/rect/RectMarker.svelte.d.ts +7 -0
- package/dist/markers/regression/RegressionMarker.svelte +60 -0
- package/dist/markers/regression/RegressionMarker.svelte.d.ts +7 -0
- package/dist/markers/rule/RuleMarker.svelte +47 -0
- package/dist/markers/{RuleMarker.svelte.d.ts → rule/RuleMarker.svelte.d.ts} +2 -5
- package/dist/markers/text/Declutter.d.ts +35 -0
- package/dist/markers/text/Declutter.js +157 -0
- package/dist/markers/text/TextMarker.svelte +244 -0
- package/dist/markers/{TextMarker.svelte.d.ts → text/TextMarker.svelte.d.ts} +5 -9
- package/dist/markers/tick/TickMarker.svelte +44 -0
- package/dist/markers/tick/TickMarker.svelte.d.ts +7 -0
- package/dist/markers/trail/TrailMarker.svelte +27 -0
- package/dist/markers/trail/TrailMarker.svelte.d.ts +7 -0
- package/dist/markers/utils/BandNudge.d.ts +22 -0
- package/dist/markers/utils/BandNudge.js +23 -0
- package/dist/markers/utils/MarkerChannels.d.ts +49 -0
- package/dist/markers/utils/MarkerChannels.js +97 -0
- package/dist/markers/vector/VectorMarker.svelte +29 -0
- package/dist/markers/{VectorMarker.svelte.d.ts → vector/VectorMarker.svelte.d.ts} +1 -1
- package/dist/markers/voronoi/VoronoiMarker.svelte +26 -0
- package/dist/markers/voronoi/VoronoiMarker.svelte.d.ts +7 -0
- package/dist/markers/voronoi/VoronoiMeshMarker.svelte +26 -0
- package/dist/markers/voronoi/VoronoiMeshMarker.svelte.d.ts +7 -0
- package/dist/markers/waffle/WaffleMarker.svelte +56 -0
- package/dist/markers/waffle/WaffleMarker.svelte.d.ts +7 -0
- package/dist/phases/Pipeline.d.ts +108 -0
- package/dist/phases/Pipeline.js +227 -0
- package/dist/phases/data/DataPhase.d.ts +19 -0
- package/dist/phases/data/DataPhase.js +85 -0
- package/dist/phases/data/PlotAxes.d.ts +75 -0
- package/dist/phases/data/PlotAxes.js +151 -0
- package/dist/phases/facet/FacetPanels.d.ts +54 -0
- package/dist/phases/facet/FacetPanels.js +95 -0
- package/dist/phases/facet/FacetPhase.d.ts +11 -0
- package/dist/phases/facet/FacetPhase.js +28 -0
- package/dist/phases/hover/HoverPhase.d.ts +36 -0
- package/dist/phases/hover/HoverPhase.js +109 -0
- package/dist/phases/mapping/MappingPhase.d.ts +17 -0
- package/dist/phases/mapping/MappingPhase.js +40 -0
- package/dist/phases/markers/MarkersPhase.d.ts +14 -0
- package/dist/phases/markers/MarkersPhase.js +27 -0
- package/dist/phases/scales/MarkerAxisValues.d.ts +12 -0
- package/dist/phases/scales/MarkerAxisValues.js +34 -0
- package/dist/phases/scales/ScalesPhase.d.ts +29 -0
- package/dist/phases/scales/ScalesPhase.js +153 -0
- package/dist/phases/sharedScales/SharedScalesPhase.d.ts +58 -0
- package/dist/phases/sharedScales/SharedScalesPhase.js +171 -0
- package/dist/phases/statistics/AuthorMarkers.d.ts +43 -0
- package/dist/phases/statistics/AuthorMarkers.js +69 -0
- package/dist/phases/statistics/MarkerGrouping.d.ts +48 -0
- package/dist/phases/statistics/MarkerGrouping.js +113 -0
- package/dist/phases/statistics/Statistics.d.ts +53 -0
- package/dist/phases/statistics/Statistics.js +156 -0
- package/dist/phases/statistics/StatisticsPhase.d.ts +18 -0
- package/dist/phases/statistics/StatisticsPhase.js +67 -0
- package/dist/phases/statistics/methods/BollingerStatistic.d.ts +9 -0
- package/dist/phases/statistics/methods/BollingerStatistic.js +18 -0
- package/dist/phases/statistics/methods/BoxStatistic.d.ts +9 -0
- package/dist/phases/statistics/methods/BoxStatistic.js +18 -0
- package/dist/phases/statistics/methods/Density2dStatistic.d.ts +9 -0
- package/dist/phases/statistics/methods/Density2dStatistic.js +18 -0
- package/dist/phases/statistics/methods/DensityStatistic.d.ts +12 -0
- package/dist/phases/statistics/methods/DensityStatistic.js +29 -0
- package/dist/phases/statistics/methods/MovingAverageStatistic.d.ts +12 -0
- package/dist/phases/statistics/methods/MovingAverageStatistic.js +30 -0
- package/dist/phases/statistics/methods/RegressionStatistic.d.ts +9 -0
- package/dist/phases/statistics/methods/RegressionStatistic.js +21 -0
- package/dist/phases/styles/StylesPhase.d.ts +13 -0
- package/dist/phases/styles/StylesPhase.js +17 -0
- package/dist/phases/tooltip/TooltipPhase.d.ts +14 -0
- package/dist/phases/tooltip/TooltipPhase.js +17 -0
- package/dist/phases/transforms/ProcessedPositions.d.ts +30 -0
- package/dist/phases/transforms/ProcessedPositions.js +74 -0
- package/dist/phases/transforms/Transforms.d.ts +42 -0
- package/dist/phases/transforms/Transforms.js +130 -0
- package/dist/phases/transforms/TransformsPhase.d.ts +27 -0
- package/dist/phases/transforms/TransformsPhase.js +205 -0
- package/dist/phases/transforms/methods/AnchorBar.d.ts +13 -0
- package/dist/phases/transforms/methods/AnchorBar.js +21 -0
- package/dist/phases/transforms/methods/BinTransform.d.ts +7 -0
- package/dist/phases/transforms/methods/BinTransform.js +48 -0
- package/dist/phases/transforms/methods/DensityTransform.d.ts +6 -0
- package/dist/phases/transforms/methods/DensityTransform.js +13 -0
- package/dist/phases/transforms/methods/GroupTransform.d.ts +8 -0
- package/dist/phases/transforms/methods/GroupTransform.js +39 -0
- package/dist/phases/transforms/methods/NormalizeTransform.d.ts +10 -0
- package/dist/phases/transforms/methods/NormalizeTransform.js +30 -0
- package/dist/phases/transforms/methods/OrderTransform.d.ts +16 -0
- package/dist/phases/transforms/methods/OrderTransform.js +43 -0
- package/dist/phases/transforms/methods/PerGroup.d.ts +11 -0
- package/dist/phases/transforms/methods/PerGroup.js +39 -0
- package/dist/phases/transforms/methods/PositionTransform.d.ts +15 -0
- package/dist/phases/transforms/methods/PositionTransform.js +74 -0
- package/dist/phases/transforms/methods/StackTransform.d.ts +8 -0
- package/dist/phases/transforms/methods/StackTransform.js +29 -0
- package/dist/phases/transforms/methods/WindowTransform.d.ts +8 -0
- package/dist/phases/transforms/methods/WindowTransform.js +23 -0
- package/dist/plots/area/Plot.svelte +42 -0
- package/dist/plots/{heatmap/ValueLabels.svelte.d.ts → area/Plot.svelte.d.ts} +8 -16
- package/dist/plots/area/defaults.d.ts +4 -0
- package/dist/plots/area/defaults.js +21 -0
- package/dist/plots/area/markers.d.ts +14 -0
- package/dist/plots/area/markers.js +39 -0
- package/dist/plots/bar/Plot.svelte +33 -438
- package/dist/plots/bar/Plot.svelte.d.ts +5 -8
- package/dist/plots/bar/defaults.d.ts +9 -0
- package/dist/plots/bar/defaults.js +88 -0
- package/dist/plots/bar/markers.d.ts +45 -0
- package/dist/plots/bar/markers.js +233 -0
- package/dist/plots/box/BoxSummaries.d.ts +19 -0
- package/dist/plots/box/BoxSummaries.js +101 -0
- package/dist/plots/box/Plot.svelte +42 -0
- package/dist/plots/box/Plot.svelte.d.ts +26 -0
- package/dist/plots/box/defaults.d.ts +12 -0
- package/dist/plots/box/defaults.js +34 -0
- package/dist/plots/box/markers.d.ts +12 -0
- package/dist/plots/box/markers.js +34 -0
- package/dist/plots/geo/Core.svelte +151 -0
- package/dist/plots/geo/Core.svelte.d.ts +25 -0
- package/dist/plots/geo/Plot.svelte +103 -324
- package/dist/plots/geo/Plot.svelte.d.ts +5 -9
- package/dist/plots/geo/defaults.d.ts +4 -0
- package/dist/plots/geo/defaults.js +16 -0
- package/dist/plots/geo/features.svelte.d.ts +5 -0
- package/dist/plots/geo/features.svelte.js +44 -0
- package/dist/plots/geo/phases/data.d.ts +6 -0
- package/dist/plots/geo/phases/data.js +26 -0
- package/dist/plots/geo/phases/hover.d.ts +9 -0
- package/dist/plots/geo/phases/hover.js +45 -0
- package/dist/plots/geo/phases/markers.d.ts +9 -0
- package/dist/plots/geo/phases/markers.js +75 -0
- package/dist/plots/geo/phases/scales.d.ts +10 -0
- package/dist/plots/geo/phases/scales.js +85 -0
- package/dist/plots/geo/phases/tooltip.d.ts +3 -0
- package/dist/plots/geo/phases/tooltip.js +5 -0
- package/dist/plots/geo/slices.d.ts +18 -0
- package/dist/plots/geo/slices.js +59 -0
- package/dist/plots/heatmap/Plot.svelte +55 -249
- package/dist/plots/heatmap/Plot.svelte.d.ts +5 -8
- package/dist/plots/heatmap/defaults.d.ts +11 -0
- package/dist/plots/heatmap/defaults.js +91 -0
- package/dist/plots/heatmap/markers.d.ts +17 -0
- package/dist/plots/heatmap/markers.js +142 -0
- package/dist/plots/histogram/Plot.svelte +45 -0
- package/dist/plots/histogram/Plot.svelte.d.ts +26 -0
- package/dist/plots/histogram/defaults.d.ts +9 -0
- package/dist/plots/histogram/defaults.js +87 -0
- package/dist/plots/histogram/markers.d.ts +18 -0
- package/dist/plots/histogram/markers.js +89 -0
- package/dist/plots/line/Plot.svelte +37 -268
- package/dist/plots/line/Plot.svelte.d.ts +3 -7
- package/dist/plots/line/defaults.d.ts +4 -0
- package/dist/plots/line/defaults.js +29 -0
- package/dist/plots/line/markers.d.ts +49 -0
- package/dist/plots/line/markers.js +199 -0
- package/dist/plots/pyramid/Plot.svelte +34 -362
- package/dist/plots/pyramid/Plot.svelte.d.ts +5 -8
- package/dist/plots/pyramid/defaults.d.ts +13 -0
- package/dist/plots/pyramid/defaults.js +87 -0
- package/dist/plots/pyramid/markers.d.ts +21 -0
- package/dist/plots/pyramid/markers.js +156 -0
- package/dist/plots/scatter/Plot.svelte +34 -288
- package/dist/plots/scatter/Plot.svelte.d.ts +5 -8
- package/dist/plots/scatter/defaults.d.ts +4 -0
- package/dist/plots/scatter/defaults.js +80 -0
- package/dist/plots/scatter/markers.d.ts +19 -0
- package/dist/plots/scatter/markers.js +129 -0
- package/dist/plots/utils/ChannelName.d.ts +9 -0
- package/dist/plots/utils/ChannelName.js +14 -0
- package/dist/plots/utils/accessors.d.ts +1 -1
- package/dist/plots/utils/accessors.js +4 -2
- package/dist/plots/utils/gaps.d.ts +14 -19
- package/dist/plots/utils/gaps.js +38 -18
- package/dist/plots/utils/geoAccessors.d.ts +8 -8
- package/dist/plots/utils/geoAccessors.js +16 -12
- package/dist/plots/utils/geoSegments.d.ts +24 -9
- package/dist/plots/utils/geoSegments.js +31 -11
- package/dist/plots/utils/segments.d.ts +5 -16
- package/dist/plots/utils/segments.js +40 -52
- package/dist/plots/utils/tiles.d.ts +9 -9
- package/dist/plots/utils/tiles.js +35 -25
- package/dist/plots/utils/topojson.d.ts +1 -1
- package/dist/plots/utils/topojson.js +3 -3
- package/dist/stores/device.js +2 -4
- package/dist/types/configuration/styling.d.ts +174 -27
- package/dist/types/layout/box.d.ts +24 -0
- package/dist/types/layout/composer.d.ts +39 -0
- package/dist/types/layout/coordinates.d.ts +14 -14
- package/dist/types/layout/facet.d.ts +44 -22
- package/dist/types/layout/figure.d.ts +7 -0
- package/dist/types/layout/geometry.d.ts +6 -2
- package/dist/types/layout/grid.d.ts +66 -0
- package/dist/types/layout/hover.d.ts +48 -0
- package/dist/types/layout/legend.d.ts +256 -55
- package/dist/types/layout/mapping.d.ts +68 -0
- package/dist/types/layout/plot.d.ts +41 -0
- package/dist/types/layout/scales.d.ts +108 -24
- package/dist/types/layout/scales.js +19 -1
- package/dist/types/layout/statistics/bollinger.d.ts +18 -0
- package/dist/types/layout/statistics/box.d.ts +8 -0
- package/dist/types/layout/statistics/box.js +1 -0
- package/dist/types/layout/statistics/density.d.ts +27 -0
- package/dist/types/layout/statistics/density.js +1 -0
- package/dist/types/layout/statistics/index.d.ts +46 -0
- package/dist/types/layout/statistics/index.js +1 -0
- package/dist/types/layout/statistics/movingAverage.d.ts +12 -0
- package/dist/types/layout/statistics/movingAverage.js +1 -0
- package/dist/types/layout/statistics/regression.d.ts +20 -0
- package/dist/types/layout/statistics/regression.js +1 -0
- package/dist/types/layout/styles.d.ts +24 -35
- package/dist/types/layout/timeline.d.ts +62 -6
- package/dist/types/layout/tooltip.d.ts +7 -85
- package/dist/types/markers/all.d.ts +3 -4
- package/dist/types/markers/axis/area.d.ts +12 -0
- package/dist/types/markers/axis/area.js +1 -0
- package/dist/types/markers/axis/arrow.d.ts +15 -0
- package/dist/types/markers/axis/arrow.js +1 -0
- package/dist/types/markers/axis/axisBasedMarkersConfig.d.ts +29 -0
- package/dist/types/markers/axis/axisBasedMarkersConfig.js +1 -0
- package/dist/types/markers/axis/bar.d.ts +18 -0
- package/dist/types/markers/axis/bar.js +1 -0
- package/dist/types/markers/axis/bollinger.d.ts +6 -0
- package/dist/types/markers/axis/bollinger.js +1 -0
- package/dist/types/markers/axis/box.d.ts +14 -0
- package/dist/types/markers/axis/box.js +1 -0
- package/dist/types/markers/axis/brush.d.ts +28 -0
- package/dist/types/markers/axis/brush.js +1 -0
- package/dist/types/markers/axis/cell.d.ts +9 -0
- package/dist/types/markers/axis/cell.js +1 -0
- package/dist/types/markers/axis/component.d.ts +9 -0
- package/dist/types/markers/axis/component.js +1 -0
- package/dist/types/markers/axis/curveName.d.ts +2 -0
- package/dist/types/markers/axis/curveName.js +1 -0
- package/dist/types/markers/axis/delaunayLink.d.ts +7 -0
- package/dist/types/markers/axis/delaunayLink.js +1 -0
- package/dist/types/markers/axis/delaunayMesh.d.ts +7 -0
- package/dist/types/markers/axis/delaunayMesh.js +1 -0
- package/dist/types/markers/axis/delta.d.ts +27 -0
- package/dist/types/markers/axis/delta.js +1 -0
- package/dist/types/markers/axis/density.d.ts +12 -0
- package/dist/types/markers/axis/density.js +1 -0
- package/dist/types/markers/axis/difference.d.ts +12 -0
- package/dist/types/markers/axis/difference.js +1 -0
- package/dist/types/markers/axis/hover.d.ts +21 -0
- package/dist/types/markers/axis/hover.js +1 -0
- package/dist/types/markers/axis/hull.d.ts +7 -0
- package/dist/types/markers/axis/hull.js +1 -0
- package/dist/types/markers/axis/image.d.ts +12 -0
- package/dist/types/markers/axis/image.js +1 -0
- package/dist/types/markers/axis/line.d.ts +7 -0
- package/dist/types/markers/axis/line.js +1 -0
- package/dist/types/markers/axis/raster.d.ts +18 -0
- package/dist/types/markers/axis/raster.js +1 -0
- package/dist/types/markers/axis/rect.d.ts +15 -0
- package/dist/types/markers/axis/rect.js +1 -0
- package/dist/types/markers/axis/regression.d.ts +6 -0
- package/dist/types/markers/axis/regression.js +1 -0
- package/dist/types/markers/axis/rule.d.ts +15 -0
- package/dist/types/markers/axis/rule.js +1 -0
- package/dist/types/markers/axis/tick.d.ts +8 -0
- package/dist/types/markers/axis/tick.js +1 -0
- package/dist/types/markers/axis/trail.d.ts +14 -0
- package/dist/types/markers/axis/trail.js +1 -0
- package/dist/types/markers/axis/voronoi.d.ts +7 -0
- package/dist/types/markers/axis/voronoi.js +1 -0
- package/dist/types/markers/axis/voronoiMesh.d.ts +7 -0
- package/dist/types/markers/axis/voronoiMesh.js +1 -0
- package/dist/types/markers/axis/waffle.d.ts +13 -0
- package/dist/types/markers/axis/waffle.js +1 -0
- package/dist/types/markers/basic/basicMarkersConfig.d.ts +4 -0
- package/dist/types/markers/basic/basicMarkersConfig.js +1 -0
- package/dist/types/markers/basic/dot.d.ts +9 -0
- package/dist/types/markers/basic/dot.js +1 -0
- package/dist/types/markers/basic/text.d.ts +60 -0
- package/dist/types/markers/basic/text.js +1 -0
- package/dist/types/markers/basic.d.ts +4 -0
- package/dist/types/markers/basic.js +1 -0
- package/dist/types/markers/channels/commonMarkerConfig.d.ts +26 -0
- package/dist/types/markers/channels/commonMarkerConfig.js +1 -0
- package/dist/types/markers/channels/commonMarkerConfigWithArea.d.ts +6 -0
- package/dist/types/markers/channels/commonMarkerConfigWithArea.js +1 -0
- package/dist/types/markers/channels/commonMarkerConfigWithColor.d.ts +5 -0
- package/dist/types/markers/channels/commonMarkerConfigWithColor.js +1 -0
- package/dist/types/markers/channels/commonMarkerConfigWithInterval.d.ts +9 -0
- package/dist/types/markers/channels/commonMarkerConfigWithInterval.js +1 -0
- package/dist/types/markers/channels/commonMarkerConfigWithRadius.d.ts +5 -0
- package/dist/types/markers/channels/commonMarkerConfigWithRadius.js +1 -0
- package/dist/types/markers/channels/commonMarkerConfigWithSymbol.d.ts +5 -0
- package/dist/types/markers/channels/commonMarkerConfigWithSymbol.js +1 -0
- package/dist/types/markers/channels/commonMarkerConfigWithWeight.d.ts +5 -0
- package/dist/types/markers/channels/commonMarkerConfigWithWeight.js +1 -0
- package/dist/types/markers/common.d.ts +30 -103
- package/dist/types/markers/common.js +29 -1
- package/dist/types/markers/geo/contour.d.ts +27 -0
- package/dist/types/markers/geo/contour.js +1 -0
- package/dist/types/markers/geo/features.d.ts +12 -0
- package/dist/types/markers/geo/features.js +1 -0
- package/dist/types/markers/geo/geoComponent.d.ts +7 -0
- package/dist/types/markers/geo/geoComponent.js +1 -0
- package/dist/types/markers/geo/geoHover.d.ts +6 -0
- package/dist/types/markers/geo/geoHover.js +1 -0
- package/dist/types/markers/geo/geoMarkersConfig.d.ts +11 -0
- package/dist/types/markers/geo/geoMarkersConfig.js +1 -0
- package/dist/types/markers/geo/graticule.d.ts +11 -0
- package/dist/types/markers/geo/graticule.js +1 -0
- package/dist/types/markers/geo/inset.d.ts +50 -0
- package/dist/types/markers/geo/inset.js +1 -0
- package/dist/types/markers/geo/link.d.ts +13 -0
- package/dist/types/markers/geo/link.js +1 -0
- package/dist/types/markers/geo/sphere.d.ts +11 -0
- package/dist/types/markers/geo/sphere.js +1 -0
- package/dist/types/markers/geo/vector.d.ts +17 -0
- package/dist/types/markers/geo/vector.js +1 -0
- package/dist/types/markers/geo.d.ts +10 -212
- package/dist/types/markers/geo.js +10 -1
- package/dist/types/markers/traits.d.ts +22 -0
- package/dist/types/markers/traits.js +1 -0
- package/dist/types/misc/easing.js +1 -0
- package/dist/types/misc/viewport.js +1 -0
- package/dist/types/phases/data/axes.d.ts +18 -0
- package/dist/types/phases/data/axes.js +1 -0
- package/dist/types/phases/data/phase.d.ts +26 -0
- package/dist/types/phases/data/phase.js +2 -0
- package/dist/types/phases/facet/phase.d.ts +18 -0
- package/dist/types/phases/facet/phase.js +1 -0
- package/dist/types/phases/hover/phase.d.ts +40 -0
- package/dist/types/phases/hover/phase.js +1 -0
- package/dist/types/phases/index.d.ts +14 -0
- package/dist/types/phases/index.js +1 -0
- package/dist/types/phases/kind.d.ts +59 -0
- package/dist/types/phases/kind.js +1 -0
- package/dist/types/phases/mapping/phase.d.ts +5 -0
- package/dist/types/phases/mapping/phase.js +1 -0
- package/dist/types/phases/markers/phase.d.ts +13 -0
- package/dist/types/phases/markers/phase.js +1 -0
- package/dist/types/phases/pipeline.d.ts +10 -0
- package/dist/types/phases/pipeline.js +1 -0
- package/dist/types/phases/scales/phase.d.ts +26 -0
- package/dist/types/phases/scales/phase.js +1 -0
- package/dist/types/phases/sharedScales/phase.d.ts +12 -0
- package/dist/types/phases/sharedScales/phase.js +1 -0
- package/dist/types/phases/stage.d.ts +12 -0
- package/dist/types/phases/stage.js +1 -0
- package/dist/types/phases/state.d.ts +76 -0
- package/dist/types/phases/state.js +1 -0
- package/dist/types/phases/statistics/phase.d.ts +43 -0
- package/dist/types/phases/statistics/phase.js +1 -0
- package/dist/types/phases/statistics/source.d.ts +20 -0
- package/dist/types/phases/statistics/source.js +7 -0
- package/dist/types/phases/styles/phase.d.ts +24 -0
- package/dist/types/phases/styles/phase.js +1 -0
- package/dist/types/phases/transforms/adapter.d.ts +27 -0
- package/dist/types/phases/transforms/adapter.js +1 -0
- package/dist/types/phases/transforms/phase.d.ts +50 -0
- package/dist/types/phases/transforms/phase.js +1 -0
- package/dist/types/plots/area/props.d.ts +10 -0
- package/dist/types/plots/area/props.js +1 -0
- package/dist/types/plots/area/state.d.ts +6 -0
- package/dist/types/plots/area/state.js +1 -0
- package/dist/types/plots/bar/props.d.ts +10 -0
- package/dist/types/plots/bar/props.js +1 -0
- package/dist/types/plots/bar/state.d.ts +6 -0
- package/dist/types/plots/bar/state.js +1 -0
- package/dist/types/plots/box/props.d.ts +10 -0
- package/dist/types/plots/box/props.js +1 -0
- package/dist/types/plots/box/state.d.ts +23 -0
- package/dist/types/plots/box/state.js +1 -0
- package/dist/types/plots/camera.d.ts +7 -17
- package/dist/types/plots/constants.d.ts +16 -8
- package/dist/types/plots/data/common.d.ts +25 -17
- package/dist/types/plots/data/geo.d.ts +26 -12
- package/dist/types/plots/gaps.d.ts +19 -38
- package/dist/types/plots/geo/props.d.ts +23 -0
- package/dist/types/plots/geo/props.js +1 -0
- package/dist/types/plots/geo/state.d.ts +82 -0
- package/dist/types/plots/geo/state.js +1 -0
- package/dist/types/plots/heatmap/props.d.ts +10 -0
- package/dist/types/plots/heatmap/props.js +1 -0
- package/dist/types/plots/heatmap/state.d.ts +28 -0
- package/dist/types/plots/heatmap/state.js +1 -0
- package/dist/types/plots/histogram/props.d.ts +18 -0
- package/dist/types/plots/histogram/props.js +1 -0
- package/dist/types/plots/histogram/state.d.ts +6 -0
- package/dist/types/plots/histogram/state.js +1 -0
- package/dist/types/plots/line/props.d.ts +10 -0
- package/dist/types/plots/line/props.js +1 -0
- package/dist/types/plots/line/state.d.ts +9 -0
- package/dist/types/plots/line/state.js +1 -0
- package/dist/types/plots/props.d.ts +145 -35
- package/dist/types/plots/pyramid/props.d.ts +10 -0
- package/dist/types/plots/pyramid/props.js +1 -0
- package/dist/types/plots/pyramid/state.d.ts +16 -0
- package/dist/types/plots/pyramid/state.js +1 -0
- package/dist/types/plots/scatter/props.d.ts +10 -0
- package/dist/types/plots/scatter/props.js +1 -0
- package/dist/types/plots/scatter/state.d.ts +6 -0
- package/dist/types/plots/scatter/state.js +1 -0
- package/dist/types/plots/segments/common.d.ts +1 -1
- package/dist/types/plots/segments/config.d.ts +12 -6
- package/dist/types/plots/styling.d.ts +5 -5
- package/dist/types/transforms/bin.d.ts +84 -0
- package/dist/types/transforms/bin.js +28 -0
- package/dist/types/transforms/bollinger.d.ts +21 -0
- package/dist/types/transforms/bollinger.js +1 -0
- package/dist/types/transforms/common.d.ts +29 -0
- package/dist/types/transforms/common.js +16 -0
- package/dist/types/transforms/density.d.ts +45 -0
- package/dist/types/transforms/density.js +10 -0
- package/dist/types/transforms/filter.d.ts +12 -0
- package/dist/types/transforms/filter.js +14 -0
- package/dist/types/transforms/group.d.ts +70 -0
- package/dist/types/transforms/group.js +8 -0
- package/dist/types/transforms/index.d.ts +36 -0
- package/dist/types/transforms/index.js +1 -0
- package/dist/types/transforms/interval.d.ts +21 -0
- package/dist/types/transforms/interval.js +14 -0
- package/dist/types/transforms/jitter.d.ts +34 -0
- package/dist/types/transforms/jitter.js +1 -0
- package/dist/types/transforms/map.d.ts +24 -0
- package/dist/types/transforms/map.js +1 -0
- package/dist/types/transforms/normalize.d.ts +36 -0
- package/dist/types/transforms/normalize.js +1 -0
- package/dist/types/transforms/select.d.ts +15 -0
- package/dist/types/transforms/select.js +1 -0
- package/dist/types/transforms/shift.d.ts +20 -0
- package/dist/types/transforms/shift.js +1 -0
- package/dist/types/transforms/sort.d.ts +31 -0
- package/dist/types/transforms/sort.js +14 -0
- package/dist/types/transforms/stack.d.ts +64 -0
- package/dist/types/transforms/stack.js +12 -0
- package/dist/types/transforms/window.d.ts +29 -0
- package/dist/types/transforms/window.js +1 -0
- package/dist/utils/ContinuousDomain.d.ts +12 -0
- package/dist/utils/ContinuousDomain.js +19 -0
- package/dist/utils/Interpolation.d.ts +26 -0
- package/dist/utils/Interpolation.js +65 -0
- package/dist/utils/{color.d.ts → color/contrast.d.ts} +0 -5
- package/dist/utils/color/contrast.js +40 -0
- package/dist/utils/color/cssColor.d.ts +4 -0
- package/dist/utils/color/cssColor.js +77 -0
- package/dist/utils/color/index.d.ts +3 -0
- package/dist/utils/color/index.js +3 -0
- package/dist/utils/color/ramp.d.ts +17 -0
- package/dist/utils/color/ramp.js +110 -0
- package/dist/utils/grouping.d.ts +9 -5
- package/dist/utils/grouping.js +19 -10
- package/dist/utils/merge.d.ts +7 -0
- package/dist/utils/merge.js +17 -0
- package/dist/utils/opacity.d.ts +9 -0
- package/dist/utils/opacity.js +38 -0
- package/dist/utils/symbol.d.ts +31 -0
- package/dist/utils/symbol.js +92 -0
- package/docs/architecture.md +137 -0
- package/docs/chrome.md +99 -0
- package/docs/composer.md +69 -0
- package/docs/concepts.md +99 -0
- package/docs/development.md +103 -0
- package/docs/facets.md +123 -0
- package/docs/geo.md +151 -0
- package/docs/getting-started.md +78 -0
- package/docs/legend.md +153 -0
- package/docs/markers.md +117 -0
- package/docs/plots.md +284 -0
- package/docs/scales.md +95 -0
- package/docs/state.md +71 -0
- package/docs/styles-and-segments.md +269 -0
- package/docs/theming.md +226 -0
- package/docs/timeline.md +128 -0
- package/docs/tooltip-and-hover.md +128 -0
- package/docs/transforms-and-statistics.md +118 -0
- package/examples/BarValues.svelte +14 -0
- package/examples/Box.svelte +7 -0
- package/examples/Chrome.svelte +17 -0
- package/examples/ChromeOrder.svelte +18 -0
- package/examples/Composer.svelte +23 -0
- package/examples/CustomTooltip.svelte +44 -0
- package/examples/Facets.svelte +15 -0
- package/examples/FacetsCarousel.svelte +14 -0
- package/examples/FacetsRowsCols.svelte +23 -0
- package/examples/FirstPlot.svelte +7 -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/LegendReader.svelte +8 -0
- package/examples/LegendSections.svelte +27 -0
- package/examples/LegendToggle.svelte +25 -0
- package/examples/LineByRegion.svelte +18 -0
- package/examples/LineDates.svelte +15 -0
- package/examples/Markers.svelte +27 -0
- package/examples/MovingAverage.svelte +15 -0
- package/examples/Pyramid.svelte +7 -0
- package/examples/Regression.svelte +14 -0
- package/examples/ResponsiveLine.svelte +37 -0
- package/examples/Scales.svelte +26 -0
- package/examples/Scatter.svelte +16 -0
- package/examples/SegmentHighlight.svelte +22 -0
- package/examples/Segments.svelte +25 -0
- package/examples/SegmentsBySeries.svelte +25 -0
- package/examples/StackedArea.svelte +16 -0
- package/examples/StackedBars.svelte +15 -0
- package/examples/TimelinePlayer.svelte +21 -0
- package/examples/TimelineRule.svelte +19 -0
- package/examples/Tooltip.svelte +19 -0
- package/examples/TooltipCard.svelte +86 -0
- package/examples/ValueLabels.svelte +21 -0
- package/examples/data.ts +324 -0
- package/llms-full.txt +142 -0
- package/llms.txt +77 -0
- package/package.json +42 -5
- package/dist/charts/BaseChart.svelte +0 -149
- package/dist/charts/BaseChart.svelte.d.ts +0 -47
- package/dist/charts/bar/Chart.svelte +0 -110
- package/dist/charts/bar/Chart.svelte.d.ts +0 -26
- package/dist/charts/container/ChartContainer.svelte +0 -137
- package/dist/charts/container/ChartContainer.svelte.d.ts +0 -16
- package/dist/charts/heatmap/Chart.svelte +0 -114
- package/dist/charts/line/Chart.svelte +0 -112
- package/dist/charts/line/Chart.svelte.d.ts +0 -26
- package/dist/charts/pyramid/Chart.svelte +0 -134
- package/dist/charts/pyramid/Chart.svelte.d.ts +0 -30
- package/dist/charts/scatter/Chart.svelte +0 -95
- package/dist/charts/scatter/Chart.svelte.d.ts +0 -28
- package/dist/layout/coordinates/margins.d.ts +0 -16
- package/dist/layout/coordinates/margins.js +0 -11
- package/dist/layout/legend/interaction.svelte.d.ts +0 -15
- package/dist/layout/legend/interaction.svelte.js +0 -32
- package/dist/layout/plot/BasePlotLayout.svelte +0 -332
- package/dist/layout/plot/BasePlotLayout.svelte.d.ts +0 -122
- package/dist/layout/plot/margins.d.ts +0 -18
- package/dist/layout/plot/margins.js +0 -15
- package/dist/layout/plot/measureText.d.ts +0 -4
- package/dist/layout/plot/measureText.js +0 -19
- package/dist/layout/scales/buildScale.d.ts +0 -25
- package/dist/layout/scales/buildScale.js +0 -90
- package/dist/layout/scales/niceDomain.d.ts +0 -23
- package/dist/layout/scales/niceDomain.js +0 -59
- package/dist/layout/tooltip/TooltipLayout.svelte +0 -51
- package/dist/layout/tooltip/TooltipLayout.svelte.d.ts +0 -45
- package/dist/layout/tooltip/controller.svelte.d.ts +0 -61
- package/dist/layout/tooltip/controller.svelte.js +0 -173
- package/dist/layout/tooltip/hover.svelte.d.ts +0 -7
- package/dist/layout/tooltip/hover.svelte.js +0 -28
- package/dist/layout/tooltip/resolveTooltipPlacement.d.ts +0 -24
- package/dist/layout/tooltip/resolveTooltipPlacement.js +0 -49
- package/dist/layout/tooltip/utils.d.ts +0 -49
- package/dist/layout/tooltip/utils.js +0 -82
- package/dist/markers/CellMarker.svelte +0 -21
- package/dist/markers/ContourClipMarker.svelte +0 -77
- package/dist/markers/ContourMarker.svelte +0 -28
- package/dist/markers/DeltaMarker.svelte +0 -109
- package/dist/markers/DotMarker.svelte +0 -70
- package/dist/markers/GeoFeaturesMarker.svelte +0 -19
- package/dist/markers/GeoHoverMarker.svelte +0 -25
- package/dist/markers/GraticuleMarker.svelte +0 -18
- package/dist/markers/HoverMarker.svelte +0 -212
- package/dist/markers/LineMarker.svelte +0 -19
- package/dist/markers/LinkMarker.svelte +0 -42
- package/dist/markers/PeakMarker.svelte +0 -80
- package/dist/markers/PeakMarker.svelte.d.ts +0 -13
- package/dist/markers/RuleMarker.svelte +0 -24
- package/dist/markers/SphereMarker.svelte +0 -15
- package/dist/markers/TextMarker.svelte +0 -62
- package/dist/markers/VectorMarker.svelte +0 -20
- package/dist/plots/bar/ValueLabels.svelte +0 -149
- package/dist/plots/bar/ValueLabels.svelte.d.ts +0 -58
- package/dist/plots/bar/buildBarMarkers.d.ts +0 -27
- package/dist/plots/bar/buildBarMarkers.js +0 -151
- package/dist/plots/bar/hoverPoints.d.ts +0 -15
- package/dist/plots/bar/hoverPoints.js +0 -37
- package/dist/plots/bar/layout.svelte.d.ts +0 -42
- package/dist/plots/bar/layout.svelte.js +0 -182
- package/dist/plots/geo/buildGeoMarkers.d.ts +0 -33
- package/dist/plots/geo/buildGeoMarkers.js +0 -47
- package/dist/plots/heatmap/ValueLabels.svelte +0 -56
- package/dist/plots/heatmap/buildCellMarkers.d.ts +0 -21
- package/dist/plots/heatmap/buildCellMarkers.js +0 -25
- package/dist/plots/line/ValueLabels.svelte +0 -269
- package/dist/plots/line/ValueLabels.svelte.d.ts +0 -52
- package/dist/plots/line/buildGapMarkers.d.ts +0 -28
- package/dist/plots/line/buildGapMarkers.js +0 -74
- package/dist/plots/line/buildLineMarkers.d.ts +0 -16
- package/dist/plots/line/buildLineMarkers.js +0 -56
- package/dist/plots/line/valueLabelMargin.d.ts +0 -19
- package/dist/plots/line/valueLabelMargin.js +0 -65
- package/dist/plots/pyramid/ValueLabels.svelte +0 -139
- package/dist/plots/pyramid/ValueLabels.svelte.d.ts +0 -56
- package/dist/plots/pyramid/buildPyramidBarMarkers.d.ts +0 -26
- package/dist/plots/pyramid/buildPyramidBarMarkers.js +0 -72
- package/dist/plots/scatter/ValueLabels.svelte +0 -163
- package/dist/plots/scatter/ValueLabels.svelte.d.ts +0 -52
- package/dist/plots/scatter/buildScatterMarkers.d.ts +0 -12
- package/dist/plots/scatter/buildScatterMarkers.js +0 -36
- package/dist/plots/scatter/resolveRadiusPaddedDomain.d.ts +0 -10
- package/dist/plots/scatter/resolveRadiusPaddedDomain.js +0 -23
- package/dist/plots/utils/categoricalAxisMargin.d.ts +0 -14
- package/dist/plots/utils/categoricalAxisMargin.js +0 -20
- package/dist/plots/utils/declutter.d.ts +0 -120
- package/dist/plots/utils/declutter.js +0 -240
- package/dist/plots/utils/labelOverflow.svelte.d.ts +0 -107
- package/dist/plots/utils/labelOverflow.svelte.js +0 -257
- package/dist/plots/utils/legendDisabled.d.ts +0 -27
- package/dist/plots/utils/legendDisabled.js +0 -68
- package/dist/plots/utils/valueLabelMargin.d.ts +0 -67
- package/dist/plots/utils/valueLabelMargin.js +0 -60
- package/dist/types/charts/common.d.ts +0 -22
- package/dist/types/charts/props.d.ts +0 -50
- package/dist/types/markers/base.d.ts +0 -45
- package/dist/types/markers/line.d.ts +0 -34
- package/dist/types/markers/props.d.ts +0 -11
- package/dist/types/plots/data/scatter.d.ts +0 -13
- package/dist/utils/color.js +0 -141
- package/dist/utils/delta.d.ts +0 -12
- package/dist/utils/delta.js +0 -69
- package/dist/utils/edgeAwareAnchor.d.ts +0 -34
- package/dist/utils/edgeAwareAnchor.js +0 -60
- package/dist/utils/interpolate.d.ts +0 -31
- package/dist/utils/interpolate.js +0 -71
- /package/dist/types/{charts/common.js → layout/box.js} +0 -0
- /package/dist/types/{charts/interpolate.js → layout/composer.js} +0 -0
- /package/dist/types/{charts/props.js → layout/figure.js} +0 -0
- /package/dist/types/{markers/base.js → layout/grid.js} +0 -0
- /package/dist/types/{markers/line.js → layout/hover.js} +0 -0
- /package/dist/types/{markers/props.js → layout/mapping.js} +0 -0
- /package/dist/types/{plots/data/scatter.js → layout/plot.js} +0 -0
- /package/dist/types/{viewport.js → layout/statistics/bollinger.js} +0 -0
- /package/dist/types/{charts/interpolate.d.ts → misc/easing.d.ts} +0 -0
- /package/dist/types/{viewport.d.ts → misc/viewport.d.ts} +0 -0
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `patch` deep-merged over `base`: plain objects merge key by key, anything
|
|
3
|
+
* else (arrays included) in `patch` replaces, and an `undefined` in `patch`
|
|
4
|
+
* leaves `base` as it is. Either side may be absent - the other is returned.
|
|
5
|
+
*/
|
|
6
|
+
export declare function merge<T extends object>(base: T, patch: object | undefined): T;
|
|
7
|
+
export declare function merge<T extends object>(base: T | undefined, patch: T | undefined): T | undefined;
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
function isPlainObject(value) {
|
|
2
|
+
return typeof value === 'object' && value !== null && !Array.isArray(value);
|
|
3
|
+
}
|
|
4
|
+
export function merge(base, patch) {
|
|
5
|
+
if (!base)
|
|
6
|
+
return patch;
|
|
7
|
+
if (!patch)
|
|
8
|
+
return base;
|
|
9
|
+
const out = { ...base };
|
|
10
|
+
for (const [key, value] of Object.entries(patch)) {
|
|
11
|
+
if (value === undefined)
|
|
12
|
+
continue;
|
|
13
|
+
const prev = out[key];
|
|
14
|
+
out[key] = isPlainObject(prev) && isPlainObject(value) ? merge(prev, value) : value;
|
|
15
|
+
}
|
|
16
|
+
return out;
|
|
17
|
+
}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { OpacityScaleConfig } from '../types/layout/scales';
|
|
2
|
+
/**
|
|
3
|
+
* Resolves an {@link OpacityScaleConfig} into a `value => opacity` function -
|
|
4
|
+
* mirrors `resolveColorScale`'s shape, but the output is always a number in
|
|
5
|
+
* roughly `[0,1]` instead of a CSS color string. Callers must apply the
|
|
6
|
+
* result as a literal constant per mark instance (never a per-row function
|
|
7
|
+
* handed straight to svelteplot) - see the type's own doc comment for why.
|
|
8
|
+
*/
|
|
9
|
+
export declare function resolveOpacityScale(config: OpacityScaleConfig | undefined, computedDomain: [number, number] | string[] | undefined, defaultRange: [number, number]): (value: unknown) => number;
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { normalize } from './color';
|
|
2
|
+
/**
|
|
3
|
+
* Resolves an {@link OpacityScaleConfig} into a `value => opacity` function -
|
|
4
|
+
* mirrors `resolveColorScale`'s shape, but the output is always a number in
|
|
5
|
+
* roughly `[0,1]` instead of a CSS color string. Callers must apply the
|
|
6
|
+
* result as a literal constant per mark instance (never a per-row function
|
|
7
|
+
* handed straight to svelteplot) - see the type's own doc comment for why.
|
|
8
|
+
*/
|
|
9
|
+
export function resolveOpacityScale(config, computedDomain, defaultRange) {
|
|
10
|
+
const domain = config?.domain ?? computedDomain;
|
|
11
|
+
const range = config?.range ?? defaultRange;
|
|
12
|
+
const unknown = config?.unknown ?? 1;
|
|
13
|
+
if (!domain || domain.length === 0)
|
|
14
|
+
return () => unknown;
|
|
15
|
+
if (typeof range === 'object' && !Array.isArray(range)) {
|
|
16
|
+
return (v) => (v == null ? unknown : (range[String(v)] ?? unknown));
|
|
17
|
+
}
|
|
18
|
+
if (typeof domain[0] === 'string') {
|
|
19
|
+
const categories = domain;
|
|
20
|
+
const [lo, hi] = range;
|
|
21
|
+
return (v) => {
|
|
22
|
+
if (v == null)
|
|
23
|
+
return unknown;
|
|
24
|
+
const idx = categories.indexOf(String(v));
|
|
25
|
+
if (idx < 0)
|
|
26
|
+
return unknown;
|
|
27
|
+
return categories.length > 1 ? lo + ((hi - lo) * idx) / (categories.length - 1) : lo;
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
const [dLo, dHi] = domain;
|
|
31
|
+
const [rLo, rHi] = range;
|
|
32
|
+
return (v) => {
|
|
33
|
+
if (v == null)
|
|
34
|
+
return unknown;
|
|
35
|
+
const t = normalize(Number(v), dLo, dHi);
|
|
36
|
+
return rLo + (rHi - rLo) * t;
|
|
37
|
+
};
|
|
38
|
+
}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import type { SymbolScaleConfig } from '../types/layout/scales';
|
|
2
|
+
import type { SymbolType } from '../types/plots/constants';
|
|
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 `resolveOpacityScale`'s output.
|
|
9
|
+
* `defaultRange` mirrors `resolveOpacityScale`'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
|
+
export declare function resolveSymbolScale(config: SymbolScaleConfig | undefined, computedDomain: string[] | undefined, defaultRange: SymbolType[]): (value: unknown) => SymbolType;
|
|
14
|
+
/**
|
|
15
|
+
* A symbol's SVG path, as svelteplot's `dot` mark draws it: the same
|
|
16
|
+
* d3-shape symbol, sized to the area of a circle of the given radius.
|
|
17
|
+
*/
|
|
18
|
+
export declare class SymbolPath {
|
|
19
|
+
#private;
|
|
20
|
+
private constructor();
|
|
21
|
+
/** The path of `symbol` at `radius`, centred on the origin. */
|
|
22
|
+
static of(symbol: SymbolType, radius: number): string;
|
|
23
|
+
/** The path of `symbol`, scaled to fit and centred in a `size`-wide square from the origin. */
|
|
24
|
+
static fitted(symbol: SymbolType, size: number): string;
|
|
25
|
+
moveTo(x: number, y: number): void;
|
|
26
|
+
lineTo(x: number, y: number): void;
|
|
27
|
+
closePath(): void;
|
|
28
|
+
rect(x: number, y: number, w: number, h: number): void;
|
|
29
|
+
/** Only the full circle d3-shape's `circle` draws, from its rightmost point. */
|
|
30
|
+
arc(x: number, y: number, r: number): void;
|
|
31
|
+
}
|
|
@@ -0,0 +1,92 @@
|
|
|
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
|
+
/**
|
|
27
|
+
* A symbol's SVG path, as svelteplot's `dot` mark draws it: the same
|
|
28
|
+
* d3-shape symbol, sized to the area of a circle of the given radius.
|
|
29
|
+
*/
|
|
30
|
+
export class SymbolPath {
|
|
31
|
+
#d = '';
|
|
32
|
+
#bounds = { x0: Infinity, y0: Infinity, x1: -Infinity, y1: -Infinity };
|
|
33
|
+
#k;
|
|
34
|
+
#dx;
|
|
35
|
+
#dy;
|
|
36
|
+
constructor(k = 1, dx = 0, dy = 0) {
|
|
37
|
+
this.#k = k;
|
|
38
|
+
this.#dx = dx;
|
|
39
|
+
this.#dy = dy;
|
|
40
|
+
}
|
|
41
|
+
/** The path of `symbol` at `radius`, centred on the origin. */
|
|
42
|
+
static of(symbol, radius) {
|
|
43
|
+
return SymbolPath.#draw(symbol, radius, new SymbolPath()).#d;
|
|
44
|
+
}
|
|
45
|
+
/** The path of `symbol`, scaled to fit and centred in a `size`-wide square from the origin. */
|
|
46
|
+
static fitted(symbol, size) {
|
|
47
|
+
const { x0, y0, x1, y1 } = SymbolPath.#draw(symbol, 1, new SymbolPath()).#bounds;
|
|
48
|
+
const k = size / Math.max(x1 - x0, y1 - y0);
|
|
49
|
+
const fit = new SymbolPath(k, size / 2 - (k * (x0 + x1)) / 2, size / 2 - (k * (y0 + y1)) / 2);
|
|
50
|
+
return SymbolPath.#draw(symbol, 1, fit).#d;
|
|
51
|
+
}
|
|
52
|
+
static #draw(symbol, radius, path) {
|
|
53
|
+
maybeSymbol(symbol === 'line' ? 'circle' : symbol).draw(path, radius ** 2 * Math.PI);
|
|
54
|
+
return path;
|
|
55
|
+
}
|
|
56
|
+
moveTo(x, y) {
|
|
57
|
+
this.#d += `M${this.#point(x, y)}`;
|
|
58
|
+
}
|
|
59
|
+
lineTo(x, y) {
|
|
60
|
+
this.#d += `L${this.#point(x, y)}`;
|
|
61
|
+
}
|
|
62
|
+
closePath() {
|
|
63
|
+
this.#d += 'Z';
|
|
64
|
+
}
|
|
65
|
+
rect(x, y, w, h) {
|
|
66
|
+
this.moveTo(x, y);
|
|
67
|
+
this.lineTo(x + w, y);
|
|
68
|
+
this.lineTo(x + w, y + h);
|
|
69
|
+
this.lineTo(x, y + h);
|
|
70
|
+
this.closePath();
|
|
71
|
+
}
|
|
72
|
+
/** Only the full circle d3-shape's `circle` draws, from its rightmost point. */
|
|
73
|
+
arc(x, y, r) {
|
|
74
|
+
this.#point(x, y - r);
|
|
75
|
+
this.#point(x, y + r);
|
|
76
|
+
const kr = this.#k * r;
|
|
77
|
+
const left = this.#point(x - r, y);
|
|
78
|
+
const right = this.#point(x + r, y);
|
|
79
|
+
this.#d += `A${kr},${kr},0,1,1,${left}A${kr},${kr},0,1,1,${right}`;
|
|
80
|
+
}
|
|
81
|
+
/** `x`,`y` in the output's coordinates, widening the drawn bounds. */
|
|
82
|
+
#point(x, y) {
|
|
83
|
+
const b = this.#bounds;
|
|
84
|
+
[b.x0, b.y0, b.x1, b.y1] = [
|
|
85
|
+
Math.min(b.x0, x),
|
|
86
|
+
Math.min(b.y0, y),
|
|
87
|
+
Math.max(b.x1, x),
|
|
88
|
+
Math.max(b.y1, y)
|
|
89
|
+
];
|
|
90
|
+
return `${this.#k * x + this.#dx},${this.#k * y + this.#dy}`;
|
|
91
|
+
}
|
|
92
|
+
}
|
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
# Architecture
|
|
2
|
+
|
|
3
|
+
For contributors. A figure is built from a few layers, each knowing only the one below it. A public **plot** (`BarPlot`, `LinePlot`, ...) hands its kind's **defaults** to the generic **`Plot`**; `Plot` frames everything in a **`Figure`** (box, stores and chrome) and slices the data by **timeline** and **facet**. A **`PlotComposer`** reuses the same `Figure` and the same **`Grid`** that facets lay out on, so both share one implementation of the frame (title, legend, caption, theme variables, shared hover and legend toggles), of the grid (pixel tracks, labels, margin alignment) and of the cells.
|
|
4
|
+
|
|
5
|
+
## Source layout
|
|
6
|
+
|
|
7
|
+
| Folder (`src/lib/`) | Holds |
|
|
8
|
+
| ------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
|
|
9
|
+
| `plots/<kind>/` | `Plot.svelte` (public component), `defaults.ts` (the kind's options for the shared phases), `markers.ts` (the kind's marks) |
|
|
10
|
+
| `phases/` | One class per pipeline phase, and `Pipeline` |
|
|
11
|
+
| `layout/` | `plot` (generic `Plot`, `Core`, `PanelRun`, public context), `figure`, `grid`, `facet`, `timeline`, `composer`, `legend`, `hover`, `tooltip`, `margins`, `coordinates`, `scales`, `styles`, `base` (`BasePlotLayout`, the svelteplot plot) |
|
|
12
|
+
| `markers/` | One component per marker type |
|
|
13
|
+
| `configuration/` | The global config store, defaults and themes |
|
|
14
|
+
| `types/` | Every type another file imports |
|
|
15
|
+
| `utils/` | Color, grouping, merge, interpolation and other helpers |
|
|
16
|
+
|
|
17
|
+
## How a plot is built
|
|
18
|
+
|
|
19
|
+
Solid arrows are "renders"; the dotted line is "builds".
|
|
20
|
+
|
|
21
|
+
```mermaid
|
|
22
|
+
%%{init: {"themeVariables": {"lineColor": "#8a8f98"}}}%%
|
|
23
|
+
flowchart TD
|
|
24
|
+
Kind["<b>Plot.svelte</b><br/>BarPlot, LinePlot, ..."]
|
|
25
|
+
Defaults["<b>defaults.ts</b><br/>phase options, markers, hover, timeline"]
|
|
26
|
+
Plot["<b>Plot</b><br/>builds the Pipeline, one core per slice"]
|
|
27
|
+
Figure["<b>Figure</b><br/>box or grid cell, hover store, legend toggles"]
|
|
28
|
+
Chrome["<b>FigureChrome</b><br/>title, legend, caption"]
|
|
29
|
+
Timeline["<b>TimelineLayout</b>"]
|
|
30
|
+
PanelRun["<b>PanelRun</b><br/>data phases once, every panel"]
|
|
31
|
+
Facet["<b>FacetLayout</b>"]
|
|
32
|
+
Core["<b>Core</b><br/>its panel phases, or every phase"]
|
|
33
|
+
Base["<b>BasePlotLayout</b><br/>svelteplot Plot, axes, markers"]
|
|
34
|
+
|
|
35
|
+
Kind -->|core props + defaults| Plot
|
|
36
|
+
Kind -.- Defaults
|
|
37
|
+
Plot --> Figure
|
|
38
|
+
Figure -->|with chrome| Chrome
|
|
39
|
+
Figure -->|with a timeline| Timeline
|
|
40
|
+
Figure -->|without one| Facet
|
|
41
|
+
Timeline -->|with a facet| PanelRun --> Facet
|
|
42
|
+
Timeline --> Facet
|
|
43
|
+
Facet -->|one per slice| Core
|
|
44
|
+
Core --> Base
|
|
45
|
+
|
|
46
|
+
classDef public stroke-width:3px
|
|
47
|
+
class Kind,Plot public
|
|
48
|
+
linkStyle default stroke:#8a8f98,stroke-width:2px
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
1. A kind's `Plot.svelte` splits its props into chrome (`title`, `legend`, ...), `timeline`, `facet` and the core props, and renders the shared `Plot` with its `defaults` builder.
|
|
52
|
+
2. `Plot` builds the kind's **`Pipeline`** once and renders a `Figure` whose body is the `TimelineLayout`, wrapping the `FacetLayout`, wrapping one `Core` per slice. Without a timeline or a facet, the one cell is the whole plot. Each facet's cell gets its scales (shared or free, per `facet.scales`) and whether its axes draw (per `facet.axes` and its edges in the grid).
|
|
53
|
+
3. `FacetLayout` turns the rows into facets - one per `by` value, flowed into `columns`, or one per `rows` x `cols` combination - and places them on a `Grid`, one `GridCell` each. Every plot reports the margins it settled on; once all have, each column and row pins its widest ones, so the plot areas line up.
|
|
54
|
+
4. `Core` runs the pipeline over its props and hands the result to `BasePlotLayout`, which draws the svelteplot plot, the axes and the markers.
|
|
55
|
+
|
|
56
|
+
## The pipeline
|
|
57
|
+
|
|
58
|
+
A `Pipeline` is an ordered list of **phase stages**, each a class in `phases/`. A kind's `defaults.ts` supplies the options each stage needs (its marks, its value labels, its hover strategy, its timeline behaviour); `Pipeline.ofAxisKind` assembles the shared stages around them. A kind that is not axis-based (the map) builds a pipeline of its own.
|
|
59
|
+
|
|
60
|
+
| Phase | Runs | Does |
|
|
61
|
+
| ------------------ | ------------- | --------------------------------------------------------------- |
|
|
62
|
+
| `facet` | once per plot | Splits rows into panels |
|
|
63
|
+
| `data` | once per plot | Builds series from `data` or `series`, infers axes (`PlotAxes`) |
|
|
64
|
+
| `mapping` | once per plot | Resolves channel accessors |
|
|
65
|
+
| `transforms` | once per plot | Runs the plot's `transforms` over all series |
|
|
66
|
+
| `statistics` | once per plot | Derives markers from `statistics` |
|
|
67
|
+
| `sharedScales` | once per plot | Domains the panels share |
|
|
68
|
+
| `scales` | per panel | Final scales, in the panel's box |
|
|
69
|
+
| `styles` | per panel | `styles`, value labels, segments |
|
|
70
|
+
| `markers` | per panel | Composes the kind's marks, author markers and value labels |
|
|
71
|
+
| `tooltip`, `hover` | per panel | Tooltip text, hover points and strategy |
|
|
72
|
+
|
|
73
|
+
The first six are the **data phases** (`Pipeline.DATA_PHASES`). With a facet, `Plot` runs them once over every row (`PanelRun`, reused for a timeline step or a legend that omits a series), and each panel's `Core` runs only the rest. Without a facet, one `Core` runs every phase. Stages declared out of order still run in phase order, with a warning.
|
|
74
|
+
|
|
75
|
+
## Facets and the composer share one grid
|
|
76
|
+
|
|
77
|
+
The dotted arrow is "reads from": each plot reports its margins to its cell and reads back the pinned ones.
|
|
78
|
+
|
|
79
|
+
```mermaid
|
|
80
|
+
%%{init: {"themeVariables": {"lineColor": "#8a8f98"}}}%%
|
|
81
|
+
flowchart TD
|
|
82
|
+
Facet["<b>FacetLayout</b><br/>by or rows x cols"]
|
|
83
|
+
Composer["<b>PlotComposer</b><br/>layout, tags, align"]
|
|
84
|
+
Figure["<b>Figure</b><br/>its box, or a cell of the grid above"]
|
|
85
|
+
TimelineFrame["<b>TimelineFrame</b><br/>timeline gutter"]
|
|
86
|
+
Grid["<b>Grid</b><br/>pixel tracks, labels, margin alignment"]
|
|
87
|
+
Cell["<b>GridCell</b><br/>slot or inset, label above its box"]
|
|
88
|
+
Core["<b>Core</b> of each facet"]
|
|
89
|
+
Any["any plot, or a nested PlotComposer"]
|
|
90
|
+
Base["<b>BasePlotLayout</b>"]
|
|
91
|
+
|
|
92
|
+
Facet -->|grid and paginated modes| Grid
|
|
93
|
+
Composer --> Figure --> Grid
|
|
94
|
+
Figure -->|with a timeline| TimelineFrame --> Grid
|
|
95
|
+
Composer -->|children| Any
|
|
96
|
+
Any -->|its own Figure takes| Cell
|
|
97
|
+
Grid -->|places| Cell
|
|
98
|
+
Cell -->|facet| Core
|
|
99
|
+
Core --> Base
|
|
100
|
+
Base -.->|reports margins, reads pinned ones| Cell
|
|
101
|
+
|
|
102
|
+
classDef public stroke-width:3px
|
|
103
|
+
class Composer public
|
|
104
|
+
linkStyle default stroke:#8a8f98,stroke-width:2px
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
`PlotComposer` renders a `Figure` around a `Grid` (inside a `TimelineFrame` when it has a `timeline`), laid out by `layout` (`columns` or named `areas`, `widths`/`heights` weights, `gap`). Every plot drawn straight in it - or another `PlotComposer` - takes a cell through its own `Figure`: its `area`, an `inset` over it, or the next free one, with the composer's tag above it, drawn at the cell's size. Anything that is not a plot goes in a `GridCell`, which marks what it draws as placed so a plot inside takes no other cell. `layout.align` turns on the margin alignment facets use; it assumes the panels' plots draw no chrome of their own, since the grid only sees each plot's own margins.
|
|
108
|
+
|
|
109
|
+
## Context
|
|
110
|
+
|
|
111
|
+
Dependencies between layers go through Svelte context, so a layer never imports the one that provides what it reads:
|
|
112
|
+
|
|
113
|
+
| Context | Provided by | Read by |
|
|
114
|
+
| --------------- | ------------------------------------------------------------------- | --------------------------------------------------------------------- |
|
|
115
|
+
| Hover store | `Figure` (the outermost; nested figures share it) | every core's tooltip and hover sync |
|
|
116
|
+
| Legend toggles | `Figure` (a figure with its own `legend` scopes them) | legends and every core below |
|
|
117
|
+
| Timeline | `Figure` | the plot's timeline layout, the player bar, `useFigure().timeline` |
|
|
118
|
+
| Shared timeline | `PlotComposer` with a `timeline` | `Plot`, which then draws no control of its own |
|
|
119
|
+
| Hover scope | `GridCell` in a composer's grid, and `HoverScope` around each facet | hover sync, to tell panels and facets apart |
|
|
120
|
+
| Grid | `Grid` | `GridCell` (registers, gets its box and tag), `Figure` (takes a cell) |
|
|
121
|
+
| Cell alignment | `GridCell` | `BasePlotLayout` (pinned margins), `MarginReporter` |
|
|
122
|
+
|
|
123
|
+
The public readers of that state are `useFigure()` and `usePlot()` ([Reading plot state](state.md)).
|
|
124
|
+
|
|
125
|
+
## Adding a plot kind
|
|
126
|
+
|
|
127
|
+
1. Define its props and state types under `types/plots/<kind>/`.
|
|
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
|
+
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 section in [Plots](plots.md).
|
|
131
|
+
|
|
132
|
+
## Conventions
|
|
133
|
+
|
|
134
|
+
- A type that another file imports lives under `src/lib/types`, not in its implementation file.
|
|
135
|
+
- Logic that belongs together is a class (`Margins`, `PlotAxes`, `ValueLabels`, `LegendState`), preferred over loose functions.
|
|
136
|
+
- The configuration is data only (it is cloned on write); behaviour is passed through plot props.
|
|
137
|
+
- Names of constructors and derivations use `build*`.
|
package/docs/chrome.md
ADDED
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
# Chrome
|
|
2
|
+
|
|
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
|
+
|
|
5
|
+
<!-- example: examples/Chrome.svelte -->
|
|
6
|
+
|
|
7
|
+
```svelte
|
|
8
|
+
<script lang="ts">
|
|
9
|
+
import { LinePlot } from '@fundar/data-chart-telling';
|
|
10
|
+
import { PRICES } from './data';
|
|
11
|
+
</script>
|
|
12
|
+
|
|
13
|
+
<!-- A plot carries its own chrome: title, subtitle, legend and caption. -->
|
|
14
|
+
<LinePlot
|
|
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}
|
|
21
|
+
x="date"
|
|
22
|
+
y="index"
|
|
23
|
+
color="commodity"
|
|
24
|
+
/>
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
<!-- /example -->
|
|
28
|
+
|
|
29
|
+

|
|
30
|
+
|
|
31
|
+
| Prop | Type | Meaning |
|
|
32
|
+
| ---------- | ----------------------- | ------------------------------------------------ |
|
|
33
|
+
| `title` | `string` | Heading |
|
|
34
|
+
| `subtitle` | `string` | Line under the title |
|
|
35
|
+
| `caption` | `string` | Note under the plot |
|
|
36
|
+
| `header` | `Snippet` | Replaces `title` and `subtitle` with your markup |
|
|
37
|
+
| `footer` | `Snippet` | Replaces `caption` with your markup |
|
|
38
|
+
| `legend` | see [Legend](legend.md) | The legend |
|
|
39
|
+
| `order` | `PlotChromeEntry[]` | Which blocks draw, top to bottom |
|
|
40
|
+
|
|
41
|
+
`header` and `footer` are snippets declared inside the component:
|
|
42
|
+
|
|
43
|
+
```svelte
|
|
44
|
+
<LinePlot ...>
|
|
45
|
+
{#snippet header()}
|
|
46
|
+
<div style="display: flex; justify-content: space-between">
|
|
47
|
+
<h3>My plot</h3>
|
|
48
|
+
<img src="/logo.svg" alt="Logo" />
|
|
49
|
+
</div>
|
|
50
|
+
{/snippet}
|
|
51
|
+
|
|
52
|
+
{#snippet footer()}
|
|
53
|
+
<small>Source: <a href="...">Dataset</a></small>
|
|
54
|
+
{/snippet}
|
|
55
|
+
</LinePlot>
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
A `header` takes the place of `title` and `subtitle`, and a `footer` the place of `caption`; a component sets one or the other of each pair. Components inside the snippets can read the figure with [`useFigure()`](state.md).
|
|
59
|
+
|
|
60
|
+
## Order
|
|
61
|
+
|
|
62
|
+
`order` lists the blocks from top to bottom. The blocks are `'header'`, `'title'`, `'subtitle'`, `'legend'`, `'plot'`, `'timeline'` (a player bar, or a horizontal rule), `'caption'`, `'footer'` and `'divider'`.
|
|
63
|
+
|
|
64
|
+
- A block left out is not drawn - except `'plot'`, which then goes last.
|
|
65
|
+
- `'divider'` draws a line between the two blocks around it, and only when both are drawn. Several dividers may appear.
|
|
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.
|
|
67
|
+
|
|
68
|
+
<!-- example: examples/ChromeOrder.svelte -->
|
|
69
|
+
|
|
70
|
+
```svelte
|
|
71
|
+
<script lang="ts">
|
|
72
|
+
import { LinePlot } from '@fundar/data-chart-telling';
|
|
73
|
+
import { PRICES } from './data';
|
|
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
|
+
/>
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
<!-- /example -->
|
|
92
|
+
|
|
93
|
+

|
|
94
|
+
|
|
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: [...] } })`.
|
|
96
|
+
|
|
97
|
+
## Look
|
|
98
|
+
|
|
99
|
+
Fonts, sizes, colors and spacing of each block come from the [configuration](theming.md): `title`, `subtitle`, `caption`, `legend`, `divider`, `spacing` and `chrome.rowGap`.
|
package/docs/composer.md
ADDED
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
# Composer
|
|
2
|
+
|
|
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
|
+
|
|
5
|
+
<!-- example: examples/Composer.svelte -->
|
|
6
|
+
|
|
7
|
+
```svelte
|
|
8
|
+
<script lang="ts">
|
|
9
|
+
import { PlotComposer, LinePlot, BarPlot, ScatterPlot } from '@fundar/data-chart-telling';
|
|
10
|
+
import { REGION_VALUES, PROVINCE_VALUES, COUNTRIES } from './data';
|
|
11
|
+
</script>
|
|
12
|
+
|
|
13
|
+
<!-- Several plots in one figure, placed on named areas of a grid. -->
|
|
14
|
+
<PlotComposer
|
|
15
|
+
width={900}
|
|
16
|
+
height={560}
|
|
17
|
+
title="Three views, one figure"
|
|
18
|
+
legend={false}
|
|
19
|
+
tags="A"
|
|
20
|
+
layout={{ areas: ['a a b', 'a a c'] }}
|
|
21
|
+
>
|
|
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} x="gdp" y="life" />
|
|
30
|
+
</PlotComposer>
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
<!-- /example -->
|
|
34
|
+
|
|
35
|
+

|
|
36
|
+
|
|
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`.
|
|
38
|
+
|
|
39
|
+
## Layout
|
|
40
|
+
|
|
41
|
+
`layout` arranges the cells:
|
|
42
|
+
|
|
43
|
+
| Field | Meaning |
|
|
44
|
+
| ------------------- | --------------------------------------------------------------------------------------------------------------------- |
|
|
45
|
+
| `columns` | Flow children into this many columns |
|
|
46
|
+
| `areas` | Named cells: one string per row, names separated by spaces, `.` for an empty cell (`['a a b', 'a a c']`) |
|
|
47
|
+
| `widths`, `heights` | Relative track sizes |
|
|
48
|
+
| `gap` | Pixels between cells (default 12) |
|
|
49
|
+
| `align` | Line up every panel's plot area with its row and column, as facets do. Assumes the panels draw no chrome of their own |
|
|
50
|
+
|
|
51
|
+
## Placing a child
|
|
52
|
+
|
|
53
|
+
- `area="a"` puts a plot in a named cell of `areas`.
|
|
54
|
+
- `inset={{ left, bottom, right, top }}` floats a plot over its area, as fractions of it (from the left and bottom edges) - a small map over a larger chart, say.
|
|
55
|
+
- With neither, a plot takes the next free cell.
|
|
56
|
+
- Anything that is not a plot goes in a `GridCell`, which takes the same placement (`area`, or `row`/`col` with `rowSpan`/`colSpan`, or `inset`) and a `label`: `<GridCell area="b">{#snippet children({ width, height })}...{/snippet}</GridCell>`.
|
|
57
|
+
- A `PlotComposer` can be nested in a cell.
|
|
58
|
+
|
|
59
|
+
## Tags
|
|
60
|
+
|
|
61
|
+
`tags` stamps a label above each panel: `'A'` (A, B, C...), `'a'`, `'1'`, `'I'`, `'i'`, or an explicit list of strings.
|
|
62
|
+
|
|
63
|
+
## Shared hover, legend and timeline
|
|
64
|
+
|
|
65
|
+
- `hover={{ strategy, sync }}` sets how hover finds related points and whether one panel's hover shows in the others.
|
|
66
|
+
- The legend toggles are shared: a composer with a `legend` of its own scopes the toggles to it, and turning a series off dims it in every plot.
|
|
67
|
+
- `timeline={{ values, type, player, progress, ... }}` gives every panel one timeline. Plots inside with their own `timeline` follow its `progress`, and the figure draws no per-plot timeline control. The options are those of a [timeline](timeline.md), with `values` required.
|
|
68
|
+
|
|
69
|
+
Everything inside can read the figure with [`useFigure()`](state.md).
|
package/docs/concepts.md
ADDED
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
# Concepts
|
|
2
|
+
|
|
3
|
+
## Plots and figures
|
|
4
|
+
|
|
5
|
+
A **plot** is one graph: axes and marks. Every plot is a component named after what it draws - `LinePlot`, `AreaPlot`, `BarPlot`, `HistogramPlot`, `BoxPlot`, `HeatmapPlot`, `PyramidPlot`, `ScatterPlot`, `GeoPlot` (see [Plots](plots.md)).
|
|
6
|
+
|
|
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
|
+
|
|
9
|
+
## Rows and series
|
|
10
|
+
|
|
11
|
+
A plot draws from one of two data shapes, which are mutually exclusive.
|
|
12
|
+
|
|
13
|
+
**Flat rows** - `data` plus the field for each channel. The plot groups the rows into series itself:
|
|
14
|
+
|
|
15
|
+
```svelte
|
|
16
|
+
<LinePlot data={rows} x="year" y="value" color="region" {width} {height} />
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
**Pre-built series** - `series`, an array where each series carries its own name, accessors and rows:
|
|
20
|
+
|
|
21
|
+
```svelte
|
|
22
|
+
<LinePlot
|
|
23
|
+
series={[
|
|
24
|
+
{ name: 'North', x: 'year', y: 'value', data: northRows },
|
|
25
|
+
{ name: 'South', x: 'year', y: 'value', data: southRows }
|
|
26
|
+
]}
|
|
27
|
+
{width}
|
|
28
|
+
{height}
|
|
29
|
+
/>
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
A series' `name` is what the legend, the value labels and the tooltip show.
|
|
33
|
+
|
|
34
|
+
## Channels
|
|
35
|
+
|
|
36
|
+
A **channel** maps a field of each row to a visual property. Each channel takes a field name (`'region'`) or an accessor function (`(d) => d.region`).
|
|
37
|
+
|
|
38
|
+
| Channel | Maps a row to | Configure with |
|
|
39
|
+
| ---------- | ----------------------------------------------------------- | ---------------------- |
|
|
40
|
+
| `x`, `y` | Position on the horizontal and vertical axis | `scales.x`, `scales.y` |
|
|
41
|
+
| `color` | A color: categorical (one per value) or continuous (a ramp) | `scales.color` |
|
|
42
|
+
| `grouping` | Which series the row belongs to | `scales.grouping` |
|
|
43
|
+
| `opacity` | A fill or stroke opacity | `scales.opacity` |
|
|
44
|
+
| `symbol` | A marker shape (categorical) | `scales.symbol` |
|
|
45
|
+
| `r` | A dot radius, scaled so that area follows the value | `scales.r` |
|
|
46
|
+
| `length` | A vector or spike length | `scales.length` |
|
|
47
|
+
|
|
48
|
+
`grouping` splits `data` into series. When it is unset, `color` groups too, so one accessor both separates and colors the series - the usual case. Pass both to group by one field and color by another:
|
|
49
|
+
|
|
50
|
+
```svelte
|
|
51
|
+
<ScatterPlot data={rows} x="gdp" y="life" grouping="country" color="temperature" {width} {height} />
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
`r` and `length` also accept a literal number, which is then a fixed pixel size and bypasses the scale.
|
|
55
|
+
|
|
56
|
+
Details for each channel scale are in [Scales](scales.md).
|
|
57
|
+
|
|
58
|
+
## Props every plot shares
|
|
59
|
+
|
|
60
|
+
| Prop | Purpose | Docs |
|
|
61
|
+
| ----------------------------------------------------------------- | ------------------------------------------------------------ | --------------------------------------------------------- |
|
|
62
|
+
| `width`, `height` | Pixel size of the figure (not needed inside a composer cell) | [Getting started](getting-started.md) |
|
|
63
|
+
| `data` / `series` | The rows | above |
|
|
64
|
+
| `x`, `y`, `color`, `grouping`, `opacity`, `symbol`, `r`, `length` | Channels | above |
|
|
65
|
+
| `scales` | Axis and channel scales | [Scales](scales.md) |
|
|
66
|
+
| `styles` | Value labels, frame, gap filling | [Styles and segments](styles-and-segments.md) |
|
|
67
|
+
| `segments` | Style ranges of the data | [Styles and segments](styles-and-segments.md) |
|
|
68
|
+
| `markers` | Extra marks | [Markers](markers.md) |
|
|
69
|
+
| `transforms`, `statistics` | Derive rows before drawing | [Transforms and statistics](transforms-and-statistics.md) |
|
|
70
|
+
| `margins` | Space around the plot area | below |
|
|
71
|
+
| `tooltip` | Floating tooltip | [Tooltip and hover](tooltip-and-hover.md) |
|
|
72
|
+
| `legend` | The legend | [Legend](legend.md) |
|
|
73
|
+
| `timeline` | Step through the data by a field | [Timeline](timeline.md) |
|
|
74
|
+
| `facet` | Small multiples | [Facets](facets.md) |
|
|
75
|
+
| `title`, `subtitle`, `caption`, `header`, `footer`, `order` | Chrome | [Chrome](chrome.md) |
|
|
76
|
+
|
|
77
|
+
`GeoPlot` takes the same chrome, `tooltip`, `legend`, `styles`, `segments` and `markers`, with GeoJSON in `data` instead of rows and `coordinates` in place of axes (see [Maps](geo.md)).
|
|
78
|
+
|
|
79
|
+
### Margins
|
|
80
|
+
|
|
81
|
+
`margins` takes `{ top, right, bottom, left }`. Each side is a number (pixels) or `'auto'`, which fits the side to what is drawn there - tick labels, axis titles, value labels. All sides are `'auto'` by default. `margins` is bindable: `bind:margins` reports the margins the plot settled on.
|
|
82
|
+
|
|
83
|
+
## What is off until asked for
|
|
84
|
+
|
|
85
|
+
A plot draws its marks, axes and automatic legend by default. These are switched on by a prop:
|
|
86
|
+
|
|
87
|
+
| Feature | Switch |
|
|
88
|
+
| ------------------------------- | --------------------------------------------------------- |
|
|
89
|
+
| Tooltip | `tooltip` (`true` or an options object) |
|
|
90
|
+
| In-plot hover highlight | a `{ type: 'hover' }` marker |
|
|
91
|
+
| Value labels | `styles={{ values: { show: true } }}` |
|
|
92
|
+
| Toggling series from the legend | `legend={{ series: { interactive: { enabled: true } } }}` |
|
|
93
|
+
| A frame around the plot area | `styles={{ frame: true }}` |
|
|
94
|
+
| Timeline | `timeline={{ accessor: 'year' }}` |
|
|
95
|
+
| Facets | `facet={{ by: 'region' }}` |
|
|
96
|
+
|
|
97
|
+
## Reading the rest of the docs
|
|
98
|
+
|
|
99
|
+
Every config object is typed, and each field carries a JSDoc comment. The types exported from the package root (`AxisBasedScalesConfig`, `AxisBasedMarkersConfig`, `LegendSection`, ...) are the exact shapes, and using `satisfies` on a config object gives completion while keeping the literal type.
|