diff --git a/.changeset/annotation-stacked-point.md b/.changeset/annotation-stacked-point.md new file mode 100644 index 0000000000..44cfb936c9 --- /dev/null +++ b/.changeset/annotation-stacked-point.md @@ -0,0 +1,5 @@ +--- +'layerchart': minor +--- + +feat(AnnotationPoint|AnnotationLine|AnnotationRange): Support `seriesKey` prop to associate an annotation with a series, positioning points and lines on its stacked segment diff --git a/.changeset/bar-style-accessors.md b/.changeset/bar-style-accessors.md new file mode 100644 index 0000000000..0fd48737ad --- /dev/null +++ b/.changeset/bar-style-accessors.md @@ -0,0 +1,5 @@ +--- +'layerchart': minor +--- + +feat(Bar|Bars): Accept a per-row accessor for `fillOpacity`, `strokeWidth`, and `opacity`, matching `Rect` and `Circle` diff --git a/.changeset/brush-component.md b/.changeset/brush-component.md new file mode 100644 index 0000000000..9eea1f2de1 --- /dev/null +++ b/.changeset/brush-component.md @@ -0,0 +1,5 @@ +--- +'layerchart': minor +--- + +feat: New Brush component to manually position, useful for multiple / independent brushes (ex. parallel coordinates). Also includes new `brushable` attachment and `brushGesture` handler for even more granular control of `BrushState` diff --git a/.changeset/brush-context-dblclick-clear.md b/.changeset/brush-context-dblclick-clear.md new file mode 100644 index 0000000000..20daa5d560 --- /dev/null +++ b/.changeset/brush-context-dblclick-clear.md @@ -0,0 +1,5 @@ +--- +'layerchart': patch +--- + +fix(BrushContext): Fix clearing on double-clicking the selection (root select-all was immediately undoing) diff --git a/.changeset/chart-group.md b/.changeset/chart-group.md new file mode 100644 index 0000000000..4c14121ffd --- /dev/null +++ b/.changeset/chart-group.md @@ -0,0 +1,5 @@ +--- +'layerchart': minor +--- + +feat(ChartGroup): Add `` and `ChartGroupState` to synchronize the tooltip/highlight, brush selection, zoom domain, and series highlight/visibility across charts diff --git a/.changeset/chart-id.md b/.changeset/chart-id.md new file mode 100644 index 0000000000..c905b65af5 --- /dev/null +++ b/.changeset/chart-id.md @@ -0,0 +1,5 @@ +--- +'layerchart': minor +--- + +feat(Chart): Add `id` prop, applied to the root element and identifying the chart within a `ChartGroup` diff --git a/.changeset/cscale-series-colors.md b/.changeset/cscale-series-colors.md new file mode 100644 index 0000000000..29a60e4c13 --- /dev/null +++ b/.changeset/cscale-series-colors.md @@ -0,0 +1,5 @@ +--- +'layerchart': minor +--- + +feat(Chart): Default the color scale to the colors declared on `series`, so marks match their legend swatch diff --git a/.changeset/facets.md b/.changeset/facets.md new file mode 100644 index 0000000000..166c339645 --- /dev/null +++ b/.changeset/facets.md @@ -0,0 +1,5 @@ +--- +'layerchart': minor +--- + +feat(Chart): Add `fx` / `fy` faceting, drawing the chart once per distinct value into a grid of panels that share the position scales diff --git a/.changeset/legend-c-scale.md b/.changeset/legend-c-scale.md new file mode 100644 index 0000000000..54e356c6bc --- /dev/null +++ b/.changeset/legend-c-scale.md @@ -0,0 +1,5 @@ +--- +'layerchart': minor +--- + +feat(Legend): Support ordinal `c` scale similar to `series` including highlight and filter capability. An ordinal scale now draws labelled swatches rather than a color ramp — pass `variant="ramp"` for the old appearance diff --git a/.changeset/pie-chart-grid.md b/.changeset/pie-chart-grid.md new file mode 100644 index 0000000000..a2fea92280 --- /dev/null +++ b/.changeset/pie-chart-grid.md @@ -0,0 +1,5 @@ +--- +'layerchart': patch +--- + +fix(PieChart): Stop drawing a cartesian grid behind the arcs when using `series` diff --git a/.changeset/rect-ref-pointerdown.md b/.changeset/rect-ref-pointerdown.md new file mode 100644 index 0000000000..fe2799c0db --- /dev/null +++ b/.changeset/rect-ref-pointerdown.md @@ -0,0 +1,5 @@ +--- +'layerchart': minor +--- + +feat(Rect): Support `ref` in html layers and forward `pointerdown` in canvas layers diff --git a/.changeset/series-layout-auto.md b/.changeset/series-layout-auto.md new file mode 100644 index 0000000000..4460b42661 --- /dev/null +++ b/.changeset/series-layout-auto.md @@ -0,0 +1,5 @@ +--- +'layerchart': minor +--- + +feat(Chart): Add `seriesLayout="auto"` (default) with automatic stacking when applicable (ex. Area, Bars). Can still pass explicit `seriesLayout` (ex. `overlap`, `group`, `stack`) when needed diff --git a/.changeset/spline-area-class-prop.md b/.changeset/spline-area-class-prop.md new file mode 100644 index 0000000000..fda7ff4b79 --- /dev/null +++ b/.changeset/spline-area-class-prop.md @@ -0,0 +1,5 @@ +--- +'layerchart': minor +--- + +feat(Spline|Area): Resolve `stroke`, `fill`, `opacity`, and `class` per line/area (and segment). A string naming a data property now resolves through the chart's color scale, like other primitives (ex. `Circle`) diff --git a/.changeset/spline-area-z.md b/.changeset/spline-area-z.md new file mode 100644 index 0000000000..58cf011870 --- /dev/null +++ b/.changeset/spline-area-z.md @@ -0,0 +1,5 @@ +--- +'layerchart': minor +--- + +feat(Spline|Area): Add `z` accessor to draw one line/area per distinct value, defaulting to `stroke` / `fill` / `c` diff --git a/.changeset/spline-stack.md b/.changeset/spline-stack.md new file mode 100644 index 0000000000..e6f39e47ea --- /dev/null +++ b/.changeset/spline-stack.md @@ -0,0 +1,5 @@ +--- +'layerchart': minor +--- + +feat(Spline): Support `seriesKey` prop to follow that series' stacked top diff --git a/.changeset/stack-groups.md b/.changeset/stack-groups.md new file mode 100644 index 0000000000..659aa23609 --- /dev/null +++ b/.changeset/stack-groups.md @@ -0,0 +1,5 @@ +--- +'layerchart': patch +--- + +fix(Chart): Stack each `x1` sub-band separately, so grouped-and-stacked bars no longer share one running total diff --git a/.changeset/tooltip-show-value.md b/.changeset/tooltip-show-value.md new file mode 100644 index 0000000000..a787d594dc --- /dev/null +++ b/.changeset/tooltip-show-value.md @@ -0,0 +1,5 @@ +--- +'layerchart': minor +--- + +feat(Tooltip): Add `tooltip.show({ point, value, data })` to control tooltip programmatically (buttons, keyboard events, etc.) diff --git a/.changeset/transform-initial-domain.md b/.changeset/transform-initial-domain.md new file mode 100644 index 0000000000..adee338137 --- /dev/null +++ b/.changeset/transform-initial-domain.md @@ -0,0 +1,5 @@ +--- +'layerchart': minor +--- + +feat(Chart): Add `transform.initialDomain` to open a chart zoomed to a range diff --git a/.changeset/zoom-to-brush.md b/.changeset/zoom-to-brush.md new file mode 100644 index 0000000000..d48a2478a4 --- /dev/null +++ b/.changeset/zoom-to-brush.md @@ -0,0 +1,5 @@ +--- +'layerchart': patch +--- + +fix(Chart): Apply `zoomToBrush()` when called before the chart mounts or when the scale clamps to `scaleExtent` diff --git a/.github/workflows/update-bundle-baseline.yml b/.github/workflows/update-bundle-baseline.yml index bc3df7b4fa..b1ea475e4a 100644 --- a/.github/workflows/update-bundle-baseline.yml +++ b/.github/workflows/update-bundle-baseline.yml @@ -3,7 +3,7 @@ name: Update Bundle Baseline on: push: branches: - - next + - main paths: - packages/layerchart/** - bundle-analyzer/** diff --git a/.github/workflows/update-visual-baseline.yml b/.github/workflows/update-visual-baseline.yml new file mode 100644 index 0000000000..5ff8dcdc16 --- /dev/null +++ b/.github/workflows/update-visual-baseline.yml @@ -0,0 +1,80 @@ +name: Update Visual Baseline + +# Fingerprints depend on the rendering environment, so the baseline PRs compare against has to be +# recorded on a runner rather than a contributor's machine. Runs on demand, and after any push to +# main that could change what the examples draw. +on: + workflow_dispatch: + push: + branches: + - main + paths: + - packages/layerchart/** + - docs/src/examples/** + - docs/scripts/visual-snapshot.mjs + +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + +jobs: + update-baseline: + name: Update Visual Baseline + runs-on: ubuntu-latest + + permissions: + contents: write + pull-requests: write + + steps: + - uses: actions/checkout@v4 + with: + token: ${{ secrets.GITHUB_TOKEN }} + - uses: pnpm/action-setup@v4 + - uses: actions/setup-node@v4 + with: + node-version: 24 + cache: pnpm + + - name: Install dependencies + run: pnpm install --frozen-lockfile + + - name: Install Chromium + run: pnpm --filter docs exec playwright install --with-deps chromium + + - name: Build packages + run: pnpm build:packages + + - name: Start the docs server + run: | + pnpm --filter docs exec vite dev --port 3002 > /tmp/server.log 2>&1 & + for i in $(seq 1 60); do + curl -sf -o /dev/null http://localhost:3002/ && exit 0 + sleep 2 + done + echo "docs server did not start"; cat /tmp/server.log; exit 1 + + # Two passes so examples that are still nondeterministic are recorded as such and skipped + # by later comparisons rather than reported as regressions + - name: Capture baseline + working-directory: docs + run: node scripts/visual-snapshot.mjs capture snapshots/baseline.json --repeat 2 + + - name: Create or update visual baseline PR + uses: peter-evans/create-pull-request@v7 + with: + token: ${{ secrets.GITHUB_TOKEN }} + branch: chore/update-visual-baseline + title: 'chore: update visual regression baseline' + body: | + ## Visual Baseline Update + + Re-recorded `docs/snapshots/baseline.json` from `main` on a runner, so PR comparisons + have something to diff against in the same rendering environment. + + ### How to review + + The diff lists one line per example. Lines that changed mean the example draws + something different than the last baseline — check those were intended. + commit-message: 'chore: update visual regression baseline' + add-paths: docs/snapshots/baseline.json diff --git a/.github/workflows/visual-regression.yml b/.github/workflows/visual-regression.yml new file mode 100644 index 0000000000..a862cfbbbe --- /dev/null +++ b/.github/workflows/visual-regression.yml @@ -0,0 +1,113 @@ +name: Visual Regression + +on: + pull_request: + paths: + - packages/layerchart/** + - docs/src/examples/** + - docs/scripts/visual-snapshot.mjs + types: [opened, synchronize, reopened] + +concurrency: + group: ${{ github.workflow }}-${{ github.event.number }} + cancel-in-progress: true + +jobs: + visual-regression: + name: Example Rendering + runs-on: ubuntu-latest + + permissions: + contents: read + + steps: + - uses: actions/checkout@v4 + with: + fetch-depth: 0 + - uses: pnpm/action-setup@v4 + - uses: actions/setup-node@v4 + with: + node-version: 24 + cache: pnpm + + - name: Install dependencies + run: pnpm install --frozen-lockfile + + - name: Install Chromium + run: pnpm --filter docs exec playwright install --with-deps chromium + + - name: Build packages + run: pnpm build:packages + + # Fingerprints depend on the rendering environment, so the baseline has to have been + # recorded on a runner too — see update-visual-baseline.yml + - name: Read the baseline from the target branch + id: baseline + run: | + mkdir -p /tmp/visual + if git show origin/${{ github.base_ref }}:docs/snapshots/baseline.json > /tmp/visual/baseline.json 2>/dev/null; then + echo "found=true" >> "$GITHUB_OUTPUT" + else + echo "found=false" >> "$GITHUB_OUTPUT" + echo "No baseline on ${{ github.base_ref }} — run the Update Visual Baseline workflow." >> "$GITHUB_STEP_SUMMARY" + fi + + - name: Start the docs server + if: steps.baseline.outputs.found == 'true' + run: | + pnpm --filter docs exec vite dev --port 3002 > /tmp/visual/server.log 2>&1 & + for i in $(seq 1 60); do + curl -sf -o /dev/null http://localhost:3002/ && exit 0 + sleep 2 + done + echo "docs server did not start"; cat /tmp/visual/server.log; exit 1 + + - name: Capture this branch + if: steps.baseline.outputs.found == 'true' + working-directory: docs + run: node scripts/visual-snapshot.mjs capture /tmp/visual/current.json --repeat 1 + + # No before/after images: rendering the base revision would mean building it too. The + # example names plus the element counts are enough to know what to open locally. + - name: Compare + if: steps.baseline.outputs.found == 'true' + id: compare + working-directory: docs + run: | + set +e + node scripts/visual-snapshot.mjs compare /tmp/visual/baseline.json /tmp/visual/current.json | tee /tmp/visual/report.txt + echo "exit=$?" >> "$GITHUB_OUTPUT" + set -e + + - name: Summarize + if: steps.baseline.outputs.found == 'true' + run: | + { + echo "## Visual regression" + echo + echo "Examples whose rendered geometry differs from \`${{ github.base_ref }}\`." + echo "Open any of them locally with \`pnpm dev\` and compare, or run:" + echo + echo '```sh' + echo 'pnpm --filter docs exec node scripts/visual-snapshot.mjs diff --head http://localhost:3002' + echo '```' + echo + echo '```' + cat /tmp/visual/report.txt + echo '```' + } >> "$GITHUB_STEP_SUMMARY" + + - name: Upload snapshots + if: always() && steps.baseline.outputs.found == 'true' + uses: actions/upload-artifact@v4 + with: + name: visual-snapshots + path: /tmp/visual/*.json + retention-days: 7 + + - name: Fail if anything changed + if: steps.baseline.outputs.found == 'true' && steps.compare.outputs.exit != '0' + run: | + echo "Rendered output changed — review the job summary." + echo "If the changes are intended, run the Update Visual Baseline workflow after merging." + exit 1 diff --git a/bundle-analyzer/bundle-analyzer.ts b/bundle-analyzer/bundle-analyzer.ts index ef7f074d4d..f9f0adf9e2 100644 --- a/bundle-analyzer/bundle-analyzer.ts +++ b/bundle-analyzer/bundle-analyzer.ts @@ -302,6 +302,8 @@ const refs = [ "svelte/motion", "svelte/transition", "svelte/compiler", + "svelte/events", + "svelte/reactivity", ], output: { minifyInternalExports: true, diff --git a/bundle-analyzer/bundle-reports/latest.json b/bundle-analyzer/bundle-reports/latest.json index 0d339b026c..bb6afbb185 100644 --- a/bundle-analyzer/bundle-reports/latest.json +++ b/bundle-analyzer/bundle-reports/latest.json @@ -1,12 +1,12 @@ { - "timestamp": "2026-07-01T21:36:45.780Z", + "timestamp": "2026-08-16T02:14:45.580Z", "results": [ { "scenario": "core", "description": "`ChartCore` — bare-bones chart without `ChartChildren`", "group": "Core", - "size": 204123, - "gzipSize": 53355, + "size": 343867, + "gzipSize": 83967, "imports": [ "ChartCore" ] @@ -15,8 +15,8 @@ "scenario": "core-svg", "description": "`ChartCore` + `Svg` from `layerchart/svg`", "group": "Core", - "size": 204132, - "gzipSize": 53305, + "size": 348850, + "gzipSize": 85405, "imports": [ "ChartCore", "Svg" @@ -26,8 +26,8 @@ "scenario": "core-canvas", "description": "`ChartCore` + `Canvas` from `layerchart/canvas`", "group": "Core", - "size": 224611, - "gzipSize": 59345, + "size": 361804, + "gzipSize": 89222, "imports": [ "ChartCore", "Canvas" @@ -37,8 +37,8 @@ "scenario": "core-html", "description": "`ChartCore` + `Html` from `layerchart/html`", "group": "Core", - "size": 206050, - "gzipSize": 53769, + "size": 350983, + "gzipSize": 85913, "imports": [ "ChartCore", "Html" @@ -48,8 +48,8 @@ "scenario": "core-geo", "description": "`ChartCore`-based geo map (`GeoProjection` + `GeoPath`)", "group": "Core", - "size": 218709, - "gzipSize": 57217, + "size": 335622, + "gzipSize": 81662, "imports": [ "ChartCore", "Svg", @@ -61,8 +61,8 @@ "scenario": "core-line", "description": "`ChartCore` + manual `Spline` line (no Axis/Grid)", "group": "Core", - "size": 225334, - "gzipSize": 58666, + "size": 344217, + "gzipSize": 83577, "imports": [ "ChartCore", "Svg", @@ -73,8 +73,8 @@ "scenario": "core-scatter", "description": "`ChartCore` + manual `Points` scatter (no Axis/Grid)", "group": "Core", - "size": 222503, - "gzipSize": 57511, + "size": 350477, + "gzipSize": 85449, "imports": [ "ChartCore", "Svg", @@ -85,8 +85,8 @@ "scenario": "base", "description": "`Chart` — full charting frame without rendering layer", "group": "Base (agnostic)", - "size": 364846, - "gzipSize": 85357, + "size": 381448, + "gzipSize": 89774, "imports": [ "Chart" ] @@ -95,8 +95,8 @@ "scenario": "base-svg-agnostic", "description": "`Chart` + `Svg` from `layerchart` (agnostic dispatcher)", "group": "Base (agnostic)", - "size": 364850, - "gzipSize": 85357, + "size": 381452, + "gzipSize": 89776, "imports": [ "Chart", "Svg" @@ -106,8 +106,8 @@ "scenario": "base-canvas-agnostic", "description": "`Chart` + `Canvas` from `layerchart` (agnostic dispatcher)", "group": "Base (agnostic)", - "size": 364850, - "gzipSize": 85352, + "size": 381452, + "gzipSize": 89785, "imports": [ "Chart", "Canvas" @@ -117,8 +117,8 @@ "scenario": "base-html-agnostic", "description": "`Chart` + `Html` from `layerchart` (agnostic dispatcher)", "group": "Base (agnostic)", - "size": 364850, - "gzipSize": 85349, + "size": 381452, + "gzipSize": 89787, "imports": [ "Chart", "Html" @@ -128,8 +128,8 @@ "scenario": "base-svg", "description": "`Chart` + `Svg` from `layerchart/svg`", "group": "Base (layer-specific)", - "size": 342880, - "gzipSize": 80628, + "size": 360934, + "gzipSize": 85297, "imports": [ "Chart", "Svg" @@ -139,8 +139,8 @@ "scenario": "base-canvas", "description": "`Chart` + `Canvas` from `layerchart/canvas`", "group": "Base (layer-specific)", - "size": 349105, - "gzipSize": 82142, + "size": 372082, + "gzipSize": 88704, "imports": [ "Chart", "Canvas" @@ -150,8 +150,8 @@ "scenario": "base-html", "description": "`Chart` + `Html` from `layerchart/html`", "group": "Base (layer-specific)", - "size": 344804, - "gzipSize": 81089, + "size": 363070, + "gzipSize": 85845, "imports": [ "Chart", "Html" @@ -161,8 +161,8 @@ "scenario": "line-chart", "description": "Basic line chart with axes and grid", "group": "Cartesian charts", - "size": 365360, - "gzipSize": 85393, + "size": 381962, + "gzipSize": 89824, "imports": [ "Chart", "Svg", @@ -175,8 +175,8 @@ "scenario": "line-chart-svg", "description": "Line chart composed from `layerchart/svg`", "group": "Cartesian charts", - "size": 342904, - "gzipSize": 80625, + "size": 360958, + "gzipSize": 85315, "imports": [ "Chart", "Layer", @@ -189,8 +189,8 @@ "scenario": "line-chart-canvas", "description": "Line chart composed from `layerchart/canvas`", "group": "Cartesian charts", - "size": 349129, - "gzipSize": 82150, + "size": 372106, + "gzipSize": 88716, "imports": [ "Chart", "Layer", @@ -203,8 +203,8 @@ "scenario": "line-chart-html", "description": "Line chart composed from `layerchart/html`", "group": "Cartesian charts", - "size": 344828, - "gzipSize": 81096, + "size": 363094, + "gzipSize": 85857, "imports": [ "Chart", "Layer", @@ -217,8 +217,8 @@ "scenario": "line-chart-interactive", "description": "Line chart with tooltip and highlight", "group": "Cartesian charts", - "size": 380224, - "gzipSize": 88742, + "size": 396759, + "gzipSize": 93371, "imports": [ "Chart", "Svg", @@ -233,8 +233,8 @@ "scenario": "LineChart", "description": "High-level `LineChart` component", "group": "Cartesian charts", - "size": 389461, - "gzipSize": 91239, + "size": 407905, + "gzipSize": 96204, "imports": [ "LineChart" ] @@ -243,8 +243,8 @@ "scenario": "LineChart-svg", "description": "High-level `LineChart` from `layerchart/svg`", "group": "Cartesian charts", - "size": 350061, - "gzipSize": 82327, + "size": 367608, + "gzipSize": 86917, "imports": [ "LineChart" ] @@ -253,8 +253,8 @@ "scenario": "LineChart-canvas", "description": "High-level `LineChart` from `layerchart/canvas`", "group": "Cartesian charts", - "size": 356270, - "gzipSize": 83869, + "size": 378741, + "gzipSize": 90264, "imports": [ "LineChart" ] @@ -263,8 +263,8 @@ "scenario": "area-chart", "description": "Area chart with axes", "group": "Cartesian charts", - "size": 378883, - "gzipSize": 88410, + "size": 398877, + "gzipSize": 93292, "imports": [ "Chart", "Svg", @@ -277,8 +277,8 @@ "scenario": "AreaChart", "description": "High-level `AreaChart` component", "group": "Cartesian charts", - "size": 383271, - "gzipSize": 89417, + "size": 403267, + "gzipSize": 94281, "imports": [ "AreaChart" ] @@ -287,8 +287,8 @@ "scenario": "AreaChart-svg", "description": "High-level `AreaChart` from `layerchart/svg`", "group": "Cartesian charts", - "size": 360485, - "gzipSize": 84503, + "size": 381951, + "gzipSize": 89763, "imports": [ "AreaChart" ] @@ -297,8 +297,8 @@ "scenario": "AreaChart-canvas", "description": "High-level `AreaChart` from `layerchart/canvas`", "group": "Cartesian charts", - "size": 366697, - "gzipSize": 86040, + "size": 393079, + "gzipSize": 93023, "imports": [ "AreaChart" ] @@ -307,8 +307,8 @@ "scenario": "bar-chart", "description": "Bar chart with axes", "group": "Cartesian charts", - "size": 369549, - "gzipSize": 86197, + "size": 386165, + "gzipSize": 90601, "imports": [ "Chart", "Svg", @@ -321,8 +321,8 @@ "scenario": "BarChart", "description": "High-level `BarChart` component", "group": "Cartesian charts", - "size": 375548, - "gzipSize": 87418, + "size": 392167, + "gzipSize": 91890, "imports": [ "BarChart" ] @@ -331,8 +331,8 @@ "scenario": "BarChart-svg", "description": "High-level `BarChart` from `layerchart/svg`", "group": "Cartesian charts", - "size": 352452, - "gzipSize": 82531, + "size": 370534, + "gzipSize": 87332, "imports": [ "BarChart" ] @@ -341,8 +341,8 @@ "scenario": "BarChart-canvas", "description": "High-level `BarChart` from `layerchart/canvas`", "group": "Cartesian charts", - "size": 358657, - "gzipSize": 84078, + "size": 381664, + "gzipSize": 90650, "imports": [ "BarChart" ] @@ -351,8 +351,8 @@ "scenario": "scatter-chart", "description": "Scatter plot with points", "group": "Cartesian charts", - "size": 365961, - "gzipSize": 85621, + "size": 382563, + "gzipSize": 90039, "imports": [ "Chart", "Svg", @@ -366,8 +366,8 @@ "scenario": "ScatterChart", "description": "High-level `ScatterChart` component", "group": "Cartesian charts", - "size": 369497, - "gzipSize": 86327, + "size": 386098, + "gzipSize": 90739, "imports": [ "ScatterChart" ] @@ -376,8 +376,8 @@ "scenario": "ScatterChart-svg", "description": "High-level `ScatterChart` from `layerchart/svg`", "group": "Cartesian charts", - "size": 346635, - "gzipSize": 81387, + "size": 364694, + "gzipSize": 86108, "imports": [ "ScatterChart" ] @@ -386,8 +386,8 @@ "scenario": "ScatterChart-canvas", "description": "High-level `ScatterChart` from `layerchart/canvas`", "group": "Cartesian charts", - "size": 352842, - "gzipSize": 82898, + "size": 375828, + "gzipSize": 89484, "imports": [ "ScatterChart" ] @@ -396,8 +396,8 @@ "scenario": "pie-chart", "description": "Pie/donut chart with arcs", "group": "Cartesian charts", - "size": 377436, - "gzipSize": 87902, + "size": 394054, + "gzipSize": 92338, "imports": [ "Chart", "Svg", @@ -410,8 +410,8 @@ "scenario": "PieChart", "description": "High-level `PieChart` component", "group": "Cartesian charts", - "size": 404970, - "gzipSize": 93958, + "size": 421521, + "gzipSize": 98458, "imports": [ "PieChart" ] @@ -420,8 +420,8 @@ "scenario": "PieChart-svg", "description": "High-level `PieChart` from `layerchart/svg`", "group": "Cartesian charts", - "size": 380949, - "gzipSize": 88725, + "size": 400651, + "gzipSize": 94258, "imports": [ "PieChart" ] @@ -430,8 +430,8 @@ "scenario": "PieChart-canvas", "description": "High-level `PieChart` from `layerchart/canvas`", "group": "Cartesian charts", - "size": 387157, - "gzipSize": 90336, + "size": 410091, + "gzipSize": 97064, "imports": [ "PieChart" ] @@ -440,8 +440,8 @@ "scenario": "ArcChart", "description": "High-level `ArcChart` component", "group": "Cartesian charts", - "size": 398066, - "gzipSize": 92761, + "size": 414619, + "gzipSize": 97325, "imports": [ "ArcChart" ] @@ -450,8 +450,8 @@ "scenario": "ArcChart-svg", "description": "High-level `ArcChart` from `layerchart/svg`", "group": "Cartesian charts", - "size": 374628, - "gzipSize": 87655, + "size": 394338, + "gzipSize": 92988, "imports": [ "ArcChart" ] @@ -460,8 +460,8 @@ "scenario": "ArcChart-canvas", "description": "High-level `ArcChart` from `layerchart/canvas`", "group": "Cartesian charts", - "size": 380841, - "gzipSize": 89242, + "size": 403779, + "gzipSize": 95752, "imports": [ "ArcChart" ] @@ -470,8 +470,8 @@ "scenario": "geo", "description": "Geographic map with paths", "group": "Geo", - "size": 382279, - "gzipSize": 89329, + "size": 403656, + "gzipSize": 95267, "imports": [ "Chart", "Svg", @@ -484,8 +484,8 @@ "scenario": "geo-tiles", "description": "Geographic map with tile layer", "group": "Geo", - "size": 387508, - "gzipSize": 91002, + "size": 408892, + "gzipSize": 96967, "imports": [ "Chart", "Svg", @@ -499,8 +499,8 @@ "scenario": "geo-full", "description": "Full geo setup with all geo components", "group": "Geo", - "size": 441200, - "gzipSize": 105115, + "size": 462605, + "gzipSize": 110979, "imports": [ "Chart", "Svg", @@ -522,8 +522,8 @@ "scenario": "hierarchy-tree", "description": "Tree layout with links", "group": "Hierarchy", - "size": 407669, - "gzipSize": 95745, + "size": 392484, + "gzipSize": 92767, "imports": [ "Chart", "Svg", @@ -537,8 +537,8 @@ "scenario": "hierarchy-treemap", "description": "Treemap layout", "group": "Hierarchy", - "size": 386692, - "gzipSize": 90722, + "size": 389012, + "gzipSize": 91891, "imports": [ "Chart", "Svg", @@ -552,8 +552,8 @@ "scenario": "hierarchy-pack", "description": "Circle packing layout", "group": "Hierarchy", - "size": 386411, - "gzipSize": 90822, + "size": 388681, + "gzipSize": 91891, "imports": [ "Chart", "Svg", @@ -566,8 +566,8 @@ "scenario": "dodge", "description": "Dodge non-overlapping packing (deterministic alternative to ForceSimulation)", "group": "Hierarchy", - "size": 383990, - "gzipSize": 89998, + "size": 386347, + "gzipSize": 91214, "imports": [ "Chart", "Svg", @@ -579,8 +579,8 @@ "scenario": "force", "description": "Force-directed graph layout", "group": "Graph / network", - "size": 410132, - "gzipSize": 96608, + "size": 394948, + "gzipSize": 93608, "imports": [ "Chart", "Svg", @@ -594,8 +594,8 @@ "scenario": "dagre", "description": "Dagre directed graph layout", "group": "Graph / network", - "size": 467642, - "gzipSize": 112142, + "size": 452581, + "gzipSize": 109163, "imports": [ "Chart", "Svg", @@ -609,8 +609,8 @@ "scenario": "sankey", "description": "Sankey flow diagram", "group": "Graph / network", - "size": 409852, - "gzipSize": 95976, + "size": 394754, + "gzipSize": 93027, "imports": [ "Chart", "Svg", @@ -624,8 +624,8 @@ "scenario": "chord", "description": "Chord diagram", "group": "Graph / network", - "size": 374808, - "gzipSize": 87574, + "size": 391369, + "gzipSize": 92032, "imports": [ "Chart", "Svg", @@ -637,8 +637,8 @@ "scenario": "Circle", "description": "Standalone Circle (agnostic) — baseline", "group": "Components", - "size": 73424, - "gzipSize": 18517, + "size": 73761, + "gzipSize": 18630, "imports": [ "Circle" ] @@ -647,8 +647,8 @@ "scenario": "Circle.svg", "description": "Standalone Circle from `layerchart/svg`", "group": "Components", - "size": 57202, - "gzipSize": 13951, + "size": 57543, + "gzipSize": 14045, "imports": [ "Circle" ] @@ -657,8 +657,8 @@ "scenario": "Circle.canvas", "description": "Standalone Circle from `layerchart/canvas`", "group": "Components", - "size": 68273, - "gzipSize": 17426, + "size": 68614, + "gzipSize": 17474, "imports": [ "Circle" ] @@ -667,8 +667,8 @@ "scenario": "Circle.html", "description": "Standalone Circle from `layerchart/html`", "group": "Components", - "size": 57877, - "gzipSize": 14095, + "size": 58218, + "gzipSize": 14184, "imports": [ "Circle" ] @@ -677,8 +677,8 @@ "scenario": "Text", "description": "Standalone Text (agnostic) — baseline", "group": "Components", - "size": 124564, - "gzipSize": 30904, + "size": 125796, + "gzipSize": 31306, "imports": [ "Text" ] @@ -687,8 +687,8 @@ "scenario": "Text.svg", "description": "Standalone Text from `layerchart/svg`", "group": "Components", - "size": 65127, - "gzipSize": 16718, + "size": 66379, + "gzipSize": 17130, "imports": [ "Text" ] @@ -697,8 +697,8 @@ "scenario": "Text.canvas", "description": "Standalone Text from `layerchart/canvas`", "group": "Components", - "size": 113869, - "gzipSize": 28620, + "size": 115120, + "gzipSize": 28951, "imports": [ "Text" ] @@ -707,8 +707,8 @@ "scenario": "Text.html", "description": "Standalone Text from `layerchart/html`", "group": "Components", - "size": 62940, - "gzipSize": 16207, + "size": 64198, + "gzipSize": 16597, "imports": [ "Text" ] @@ -717,8 +717,8 @@ "scenario": "Rect", "description": "Standalone Rect (agnostic) — baseline", "group": "Components", - "size": 80068, - "gzipSize": 19801, + "size": 80709, + "gzipSize": 19915, "imports": [ "Rect" ] @@ -727,8 +727,8 @@ "scenario": "Rect.svg", "description": "Standalone Rect from `layerchart/svg`", "group": "Components", - "size": 63651, - "gzipSize": 15268, + "size": 64296, + "gzipSize": 15377, "imports": [ "Rect" ] @@ -737,8 +737,8 @@ "scenario": "Rect.canvas", "description": "Standalone Rect from `layerchart/canvas`", "group": "Components", - "size": 73040, - "gzipSize": 18400, + "size": 73685, + "gzipSize": 18499, "imports": [ "Rect" ] @@ -747,8 +747,8 @@ "scenario": "Rect.html", "description": "Standalone Rect from `layerchart/html`", "group": "Components", - "size": 62427, - "gzipSize": 15120, + "size": 63072, + "gzipSize": 15220, "imports": [ "Rect" ] @@ -757,8 +757,8 @@ "scenario": "Line", "description": "Standalone Line (agnostic) — baseline", "group": "Components", - "size": 79948, - "gzipSize": 20038, + "size": 80528, + "gzipSize": 20213, "imports": [ "Line" ] @@ -767,8 +767,8 @@ "scenario": "Line.svg", "description": "Standalone Line from `layerchart/svg`", "group": "Components", - "size": 63048, - "gzipSize": 15208, + "size": 63632, + "gzipSize": 15314, "imports": [ "Line" ] @@ -777,8 +777,8 @@ "scenario": "Line.canvas", "description": "Standalone Line from `layerchart/canvas`", "group": "Components", - "size": 68623, - "gzipSize": 17476, + "size": 69208, + "gzipSize": 17571, "imports": [ "Line" ] @@ -787,8 +787,8 @@ "scenario": "Line.html", "description": "Standalone Line from `layerchart/html`", "group": "Components", - "size": 58891, - "gzipSize": 14375, + "size": 59480, + "gzipSize": 14491, "imports": [ "Line" ] @@ -797,8 +797,8 @@ "scenario": "Path", "description": "Standalone Path (agnostic) — baseline", "group": "Components", - "size": 90244, - "gzipSize": 22873, + "size": 90600, + "gzipSize": 22987, "imports": [ "Path" ] @@ -807,8 +807,8 @@ "scenario": "Path.svg", "description": "Standalone Path from `layerchart/svg`", "group": "Components", - "size": 76889, - "gzipSize": 19146, + "size": 77245, + "gzipSize": 19177, "imports": [ "Path" ] @@ -817,8 +817,8 @@ "scenario": "Path.canvas", "description": "Standalone Path from `layerchart/canvas`", "group": "Components", - "size": 69729, - "gzipSize": 18364, + "size": 69803, + "gzipSize": 18300, "imports": [ "Path" ] @@ -827,8 +827,8 @@ "scenario": "ClipPath", "description": "Standalone ClipPath (agnostic) — baseline", "group": "Components", - "size": 7297, - "gzipSize": 2134, + "size": 7367, + "gzipSize": 2162, "imports": [ "ClipPath" ] @@ -837,8 +837,8 @@ "scenario": "ClipPath.svg", "description": "Standalone ClipPath from `layerchart/svg`", "group": "Components", - "size": 4089, - "gzipSize": 1534, + "size": 4159, + "gzipSize": 1562, "imports": [ "ClipPath" ] @@ -847,8 +847,8 @@ "scenario": "ClipPath.canvas", "description": "Standalone ClipPath from `layerchart/canvas`", "group": "Components", - "size": 3095, - "gzipSize": 1260, + "size": 3165, + "gzipSize": 1289, "imports": [ "ClipPath" ] @@ -857,8 +857,8 @@ "scenario": "ClipPath.html", "description": "Standalone ClipPath from `layerchart/html`", "group": "Components", - "size": 3402, - "gzipSize": 1346, + "size": 3472, + "gzipSize": 1374, "imports": [ "ClipPath" ] @@ -867,8 +867,8 @@ "scenario": "RadialGradient", "description": "Standalone RadialGradient (agnostic) — baseline", "group": "Components", - "size": 59743, - "gzipSize": 15418, + "size": 59813, + "gzipSize": 15447, "imports": [ "RadialGradient" ] @@ -887,8 +887,8 @@ "scenario": "RadialGradient.canvas", "description": "Standalone RadialGradient from `layerchart/canvas`", "group": "Components", - "size": 56613, - "gzipSize": 14628, + "size": 56683, + "gzipSize": 14641, "imports": [ "RadialGradient" ] @@ -897,8 +897,8 @@ "scenario": "LinearGradient", "description": "Standalone LinearGradient (agnostic) — baseline", "group": "Components", - "size": 61132, - "gzipSize": 15726, + "size": 61202, + "gzipSize": 15757, "imports": [ "LinearGradient" ] @@ -917,8 +917,8 @@ "scenario": "LinearGradient.canvas", "description": "Standalone LinearGradient from `layerchart/canvas`", "group": "Components", - "size": 56881, - "gzipSize": 14696, + "size": 56951, + "gzipSize": 14710, "imports": [ "LinearGradient" ] @@ -937,8 +937,8 @@ "scenario": "Group", "description": "Standalone Group (agnostic) — baseline", "group": "Components", - "size": 15634, - "gzipSize": 4088, + "size": 15989, + "gzipSize": 4205, "imports": [ "Group" ] @@ -947,8 +947,8 @@ "scenario": "Group.svg", "description": "Standalone Group from `layerchart/svg`", "group": "Components", - "size": 11698, - "gzipSize": 3577, + "size": 12055, + "gzipSize": 3695, "imports": [ "Group" ] @@ -957,8 +957,8 @@ "scenario": "Group.canvas", "description": "Standalone Group from `layerchart/canvas`", "group": "Components", - "size": 10451, - "gzipSize": 3192, + "size": 10802, + "gzipSize": 3308, "imports": [ "Group" ] @@ -967,8 +967,8 @@ "scenario": "Group.html", "description": "Standalone Group from `layerchart/html`", "group": "Components", - "size": 11825, - "gzipSize": 3603, + "size": 12184, + "gzipSize": 3723, "imports": [ "Group" ] @@ -977,8 +977,8 @@ "scenario": "Pattern", "description": "Standalone Pattern (agnostic) — baseline", "group": "Components", - "size": 63907, - "gzipSize": 16304, + "size": 63977, + "gzipSize": 16338, "imports": [ "Pattern" ] @@ -997,8 +997,8 @@ "scenario": "Pattern.canvas", "description": "Standalone Pattern from `layerchart/canvas`", "group": "Components", - "size": 57957, - "gzipSize": 14889, + "size": 58027, + "gzipSize": 14910, "imports": [ "Pattern" ] @@ -1017,8 +1017,8 @@ "scenario": "Ellipse", "description": "Standalone Ellipse (agnostic) — baseline", "group": "Components", - "size": 73234, - "gzipSize": 18384, + "size": 73805, + "gzipSize": 18494, "imports": [ "Ellipse" ] @@ -1027,8 +1027,8 @@ "scenario": "Ellipse.svg", "description": "Standalone Ellipse from `layerchart/svg`", "group": "Components", - "size": 57087, - "gzipSize": 13791, + "size": 57662, + "gzipSize": 13927, "imports": [ "Ellipse" ] @@ -1037,8 +1037,8 @@ "scenario": "Ellipse.canvas", "description": "Standalone Ellipse from `layerchart/canvas`", "group": "Components", - "size": 68104, - "gzipSize": 17281, + "size": 68679, + "gzipSize": 17372, "imports": [ "Ellipse" ] @@ -1047,8 +1047,8 @@ "scenario": "Ellipse.html", "description": "Standalone Ellipse from `layerchart/html`", "group": "Components", - "size": 57305, - "gzipSize": 13817, + "size": 57880, + "gzipSize": 13957, "imports": [ "Ellipse" ] @@ -1057,8 +1057,8 @@ "scenario": "Polygon", "description": "Standalone Polygon (agnostic) — baseline", "group": "Components", - "size": 81495, - "gzipSize": 21302, + "size": 81832, + "gzipSize": 21402, "imports": [ "Polygon" ] @@ -1067,8 +1067,8 @@ "scenario": "Polygon.svg", "description": "Standalone Polygon from `layerchart/svg`", "group": "Components", - "size": 67962, - "gzipSize": 17335, + "size": 68303, + "gzipSize": 17391, "imports": [ "Polygon" ] @@ -1077,8 +1077,8 @@ "scenario": "Polygon.canvas", "description": "Standalone Polygon from `layerchart/canvas`", "group": "Components", - "size": 79043, - "gzipSize": 20802, + "size": 79384, + "gzipSize": 20788, "imports": [ "Polygon" ] @@ -1087,8 +1087,8 @@ "scenario": "Image", "description": "Standalone Image (agnostic) — baseline", "group": "Components", - "size": 64205, - "gzipSize": 15543, + "size": 64659, + "gzipSize": 15651, "imports": [ "Image" ] @@ -1097,8 +1097,8 @@ "scenario": "Image.svg", "description": "Standalone Image from `layerchart/svg`", "group": "Components", - "size": 58350, - "gzipSize": 14365, + "size": 58808, + "gzipSize": 14466, "imports": [ "Image" ] @@ -1107,8 +1107,8 @@ "scenario": "Image.canvas", "description": "Standalone Image from `layerchart/canvas`", "group": "Components", - "size": 13101, - "gzipSize": 3843, + "size": 13548, + "gzipSize": 3951, "imports": [ "Image" ] @@ -1117,8 +1117,8 @@ "scenario": "Image.html", "description": "Standalone Image from `layerchart/html`", "group": "Components", - "size": 57335, - "gzipSize": 14025, + "size": 57793, + "gzipSize": 14122, "imports": [ "Image" ] @@ -1127,8 +1127,8 @@ "scenario": "Axis", "description": "Standalone Axis (agnostic) — baseline", "group": "Components", - "size": 203252, - "gzipSize": 45508, + "size": 206599, + "gzipSize": 46842, "imports": [ "Axis" ] @@ -1137,8 +1137,8 @@ "scenario": "Axis.svg", "description": "Standalone Axis from `layerchart/svg`", "group": "Components", - "size": 173457, - "gzipSize": 39141, + "size": 176808, + "gzipSize": 40270, "imports": [ "Axis" ] @@ -1147,8 +1147,8 @@ "scenario": "Axis.canvas", "description": "Standalone Axis from `layerchart/canvas`", "group": "Components", - "size": 171647, - "gzipSize": 39226, + "size": 175000, + "gzipSize": 40170, "imports": [ "Axis" ] @@ -1157,8 +1157,8 @@ "scenario": "Axis.html", "description": "Standalone Axis from `layerchart/html`", "group": "Components", - "size": 167998, - "gzipSize": 38022, + "size": 171347, + "gzipSize": 38965, "imports": [ "Axis" ] @@ -1167,8 +1167,8 @@ "scenario": "Rule", "description": "Standalone Rule (agnostic) — baseline", "group": "Components", - "size": 108044, - "gzipSize": 25072, + "size": 108746, + "gzipSize": 25413, "imports": [ "Rule" ] @@ -1177,8 +1177,8 @@ "scenario": "Rule.svg", "description": "Standalone Rule from `layerchart/svg`", "group": "Components", - "size": 82976, - "gzipSize": 18928, + "size": 83684, + "gzipSize": 19107, "imports": [ "Rule" ] @@ -1187,8 +1187,8 @@ "scenario": "Rule.canvas", "description": "Standalone Rule from `layerchart/canvas`", "group": "Components", - "size": 87165, - "gzipSize": 20604, + "size": 87878, + "gzipSize": 20824, "imports": [ "Rule" ] @@ -1197,8 +1197,8 @@ "scenario": "Rule.html", "description": "Standalone Rule from `layerchart/html`", "group": "Components", - "size": 79626, - "gzipSize": 18304, + "size": 80341, + "gzipSize": 18463, "imports": [ "Rule" ] @@ -1207,8 +1207,8 @@ "scenario": "Grid", "description": "Standalone Grid (agnostic) — baseline", "group": "Components", - "size": 53548, - "gzipSize": 9668, + "size": 53886, + "gzipSize": 9782, "imports": [ "Grid" ] @@ -1217,8 +1217,8 @@ "scenario": "Grid.svg", "description": "Standalone Grid from `layerchart/svg`", "group": "Components", - "size": 104124, - "gzipSize": 23019, + "size": 105023, + "gzipSize": 23330, "imports": [ "Grid" ] @@ -1227,8 +1227,8 @@ "scenario": "Grid.canvas", "description": "Standalone Grid from `layerchart/canvas`", "group": "Components", - "size": 39830, - "gzipSize": 7109, + "size": 40168, + "gzipSize": 7218, "imports": [ "Grid" ] @@ -1237,8 +1237,8 @@ "scenario": "Grid.html", "description": "Standalone Grid from `layerchart/html`", "group": "Components", - "size": 100751, - "gzipSize": 22407, + "size": 42180, + "gzipSize": 7913, "imports": [ "Grid" ] @@ -1247,8 +1247,8 @@ "scenario": "Highlight", "description": "Standalone Highlight (agnostic) — baseline", "group": "Components", - "size": 46091, - "gzipSize": 8745, + "size": 46738, + "gzipSize": 8942, "imports": [ "Highlight" ] @@ -1257,8 +1257,8 @@ "scenario": "Highlight.svg", "description": "Standalone Highlight from `layerchart/svg`", "group": "Components", - "size": 35792, - "gzipSize": 6882, + "size": 36439, + "gzipSize": 7064, "imports": [ "Highlight" ] @@ -1267,8 +1267,8 @@ "scenario": "Highlight.canvas", "description": "Standalone Highlight from `layerchart/canvas`", "group": "Components", - "size": 33148, - "gzipSize": 6318, + "size": 33795, + "gzipSize": 6490, "imports": [ "Highlight" ] @@ -1277,8 +1277,8 @@ "scenario": "Highlight.html", "description": "Standalone Highlight from `layerchart/html`", "group": "Components", - "size": 34949, - "gzipSize": 6914, + "size": 35591, + "gzipSize": 7073, "imports": [ "Highlight" ] @@ -1287,8 +1287,8 @@ "scenario": "RectClipPath", "description": "Standalone RectClipPath (agnostic) — baseline", "group": "Components", - "size": 11518, - "gzipSize": 3092, + "size": 11588, + "gzipSize": 3118, "imports": [ "RectClipPath" ] @@ -1297,8 +1297,8 @@ "scenario": "RectClipPath.svg", "description": "Standalone RectClipPath from `layerchart/svg`", "group": "Components", - "size": 7910, - "gzipSize": 2476, + "size": 7980, + "gzipSize": 2497, "imports": [ "RectClipPath" ] @@ -1307,8 +1307,8 @@ "scenario": "RectClipPath.canvas", "description": "Standalone RectClipPath from `layerchart/canvas`", "group": "Components", - "size": 6912, - "gzipSize": 2215, + "size": 6982, + "gzipSize": 2234, "imports": [ "RectClipPath" ] @@ -1317,8 +1317,8 @@ "scenario": "RectClipPath.html", "description": "Standalone RectClipPath from `layerchart/html`", "group": "Components", - "size": 7219, - "gzipSize": 2291, + "size": 7289, + "gzipSize": 2316, "imports": [ "RectClipPath" ] @@ -1327,8 +1327,8 @@ "scenario": "ChartClipPath", "description": "Standalone ChartClipPath (agnostic) — baseline", "group": "Components", - "size": 56942, - "gzipSize": 13430, + "size": 57012, + "gzipSize": 13441, "imports": [ "ChartClipPath" ] @@ -1337,8 +1337,8 @@ "scenario": "ChartClipPath.svg", "description": "Standalone ChartClipPath from `layerchart/svg`", "group": "Components", - "size": 52939, - "gzipSize": 12785, + "size": 53013, + "gzipSize": 12811, "imports": [ "ChartClipPath" ] @@ -1347,8 +1347,8 @@ "scenario": "ChartClipPath.canvas", "description": "Standalone ChartClipPath from `layerchart/canvas`", "group": "Components", - "size": 51930, - "gzipSize": 12540, + "size": 52008, + "gzipSize": 12548, "imports": [ "ChartClipPath" ] @@ -1357,8 +1357,8 @@ "scenario": "ChartClipPath.html", "description": "Standalone ChartClipPath from `layerchart/html`", "group": "Components", - "size": 52243, - "gzipSize": 12590, + "size": 52317, + "gzipSize": 12621, "imports": [ "ChartClipPath" ] @@ -1367,8 +1367,8 @@ "scenario": "Arc", "description": "Standalone Arc (agnostic) — baseline", "group": "Components", - "size": 139729, - "gzipSize": 37544, + "size": 140236, + "gzipSize": 37657, "imports": [ "Arc" ] @@ -1377,8 +1377,8 @@ "scenario": "Arc.svg", "description": "Standalone Arc from `layerchart/svg`", "group": "Components", - "size": 126334, - "gzipSize": 33595, + "size": 126845, + "gzipSize": 33845, "imports": [ "Arc" ] @@ -1387,8 +1387,8 @@ "scenario": "Arc.canvas", "description": "Standalone Arc from `layerchart/canvas`", "group": "Components", - "size": 119185, - "gzipSize": 33014, + "size": 119414, + "gzipSize": 32988, "imports": [ "Arc" ] @@ -1397,8 +1397,8 @@ "scenario": "Spline", "description": "Standalone Spline (agnostic) — baseline", "group": "Components", - "size": 113031, - "gzipSize": 28828, + "size": 116821, + "gzipSize": 29803, "imports": [ "Spline" ] @@ -1407,8 +1407,8 @@ "scenario": "Spline.svg", "description": "Standalone Spline from `layerchart/svg`", "group": "Components", - "size": 99636, - "gzipSize": 25118, + "size": 103430, + "gzipSize": 25989, "imports": [ "Spline" ] @@ -1417,8 +1417,8 @@ "scenario": "Spline.canvas", "description": "Standalone Spline from `layerchart/canvas`", "group": "Components", - "size": 93673, - "gzipSize": 24493, + "size": 97503, + "gzipSize": 25460, "imports": [ "Spline" ] @@ -1427,8 +1427,8 @@ "scenario": "Area", "description": "Standalone Area (agnostic) — baseline", "group": "Components", - "size": 124228, - "gzipSize": 30716, + "size": 131921, + "gzipSize": 32194, "imports": [ "Area" ] @@ -1437,8 +1437,8 @@ "scenario": "Area.svg", "description": "Standalone Area from `layerchart/svg`", "group": "Components", - "size": 110589, - "gzipSize": 26944, + "size": 118289, + "gzipSize": 28283, "imports": [ "Area" ] @@ -1447,8 +1447,8 @@ "scenario": "Area.canvas", "description": "Standalone Area from `layerchart/canvas`", "group": "Components", - "size": 104628, - "gzipSize": 26344, + "size": 112364, + "gzipSize": 27881, "imports": [ "Area" ] @@ -1457,8 +1457,8 @@ "scenario": "Pie", "description": "Standalone Pie (agnostic) — baseline", "group": "Components", - "size": 145133, - "gzipSize": 38617, + "size": 145619, + "gzipSize": 38715, "imports": [ "Pie" ] @@ -1467,8 +1467,8 @@ "scenario": "Pie.svg", "description": "Standalone Pie from `layerchart/svg`", "group": "Components", - "size": 131551, - "gzipSize": 34623, + "size": 132041, + "gzipSize": 34891, "imports": [ "Pie" ] @@ -1477,8 +1477,8 @@ "scenario": "Pie.canvas", "description": "Standalone Pie from `layerchart/canvas`", "group": "Components", - "size": 124402, - "gzipSize": 34049, + "size": 124932, + "gzipSize": 34170, "imports": [ "Pie" ] @@ -1487,8 +1487,8 @@ "scenario": "ArcLabel", "description": "Standalone ArcLabel (agnostic) — baseline", "group": "Components", - "size": 155018, - "gzipSize": 38039, + "size": 156425, + "gzipSize": 38796, "imports": [ "ArcLabel" ] @@ -1497,8 +1497,8 @@ "scenario": "ArcLabel.svg", "description": "Standalone ArcLabel from `layerchart/svg`", "group": "Components", - "size": 141484, - "gzipSize": 34455, + "size": 142891, + "gzipSize": 34830, "imports": [ "ArcLabel" ] @@ -1507,8 +1507,8 @@ "scenario": "ArcLabel.canvas", "description": "Standalone ArcLabel from `layerchart/canvas`", "group": "Components", - "size": 130981, - "gzipSize": 33191, + "size": 132315, + "gzipSize": 33494, "imports": [ "ArcLabel" ] @@ -1517,8 +1517,8 @@ "scenario": "Bar", "description": "Standalone Bar (agnostic) — baseline", "group": "Components", - "size": 172201, - "gzipSize": 43512, + "size": 173218, + "gzipSize": 43769, "imports": [ "Bar" ] @@ -1527,8 +1527,8 @@ "scenario": "Bar.svg", "description": "Standalone Bar from `layerchart/svg`", "group": "Components", - "size": 153782, - "gzipSize": 39202, + "size": 154800, + "gzipSize": 39097, "imports": [ "Bar" ] @@ -1537,8 +1537,8 @@ "scenario": "Bar.canvas", "description": "Standalone Bar from `layerchart/canvas`", "group": "Components", - "size": 147656, - "gzipSize": 38779, + "size": 148581, + "gzipSize": 38895, "imports": [ "Bar" ] @@ -1547,8 +1547,8 @@ "scenario": "Bars", "description": "Standalone Bars (agnostic) — baseline", "group": "Components", - "size": 176313, - "gzipSize": 44190, + "size": 177343, + "gzipSize": 44469, "imports": [ "Bars" ] @@ -1557,8 +1557,8 @@ "scenario": "Bars.svg", "description": "Standalone Bars from `layerchart/svg`", "group": "Components", - "size": 157413, - "gzipSize": 39845, + "size": 158447, + "gzipSize": 39795, "imports": [ "Bars" ] @@ -1567,8 +1567,8 @@ "scenario": "Bars.canvas", "description": "Standalone Bars from `layerchart/canvas`", "group": "Components", - "size": 155190, - "gzipSize": 40078, + "size": 156228, + "gzipSize": 40263, "imports": [ "Bars" ] @@ -1577,8 +1577,8 @@ "scenario": "Points", "description": "Standalone Points (agnostic) — baseline", "group": "Components", - "size": 79666, - "gzipSize": 19805, + "size": 80410, + "gzipSize": 20015, "imports": [ "Points" ] @@ -1587,8 +1587,8 @@ "scenario": "Points.svg", "description": "Standalone Points from `layerchart/svg`", "group": "Components", - "size": 63066, - "gzipSize": 15328, + "size": 63818, + "gzipSize": 15473, "imports": [ "Points" ] @@ -1597,8 +1597,8 @@ "scenario": "Points.canvas", "description": "Standalone Points from `layerchart/canvas`", "group": "Components", - "size": 74137, - "gzipSize": 18797, + "size": 0, + "gzipSize": 0, "imports": [ "Points" ] @@ -1607,8 +1607,8 @@ "scenario": "Points.html", "description": "Standalone Points from `layerchart/html`", "group": "Components", - "size": 63741, - "gzipSize": 15416, + "size": 0, + "gzipSize": 0, "imports": [ "Points" ] @@ -1617,8 +1617,8 @@ "scenario": "Labels", "description": "Standalone Labels (agnostic) — baseline", "group": "Components", - "size": 161466, - "gzipSize": 37555, + "size": 0, + "gzipSize": 0, "imports": [ "Labels" ] @@ -1627,8 +1627,8 @@ "scenario": "Labels.svg", "description": "Standalone Labels from `layerchart/svg`", "group": "Components", - "size": 137069, - "gzipSize": 32433, + "size": 0, + "gzipSize": 0, "imports": [ "Labels" ] @@ -1637,8 +1637,8 @@ "scenario": "Labels.canvas", "description": "Standalone Labels from `layerchart/canvas`", "group": "Components", - "size": 140831, - "gzipSize": 33797, + "size": 0, + "gzipSize": 0, "imports": [ "Labels" ] @@ -1647,8 +1647,8 @@ "scenario": "Labels.html", "description": "Standalone Labels from `layerchart/html`", "group": "Components", - "size": 135700, - "gzipSize": 32058, + "size": 174913, + "gzipSize": 43746, "imports": [ "Labels" ] @@ -1657,8 +1657,8 @@ "scenario": "Frame", "description": "Standalone Frame (agnostic) — baseline", "group": "Components", - "size": 81930, - "gzipSize": 20178, + "size": 82571, + "gzipSize": 20290, "imports": [ "Frame" ] @@ -1667,8 +1667,8 @@ "scenario": "Frame.svg", "description": "Standalone Frame from `layerchart/svg`", "group": "Components", - "size": 65269, - "gzipSize": 15632, + "size": 65914, + "gzipSize": 15788, "imports": [ "Frame" ] @@ -1677,8 +1677,8 @@ "scenario": "Frame.canvas", "description": "Standalone Frame from `layerchart/canvas`", "group": "Components", - "size": 74660, - "gzipSize": 18809, + "size": 75305, + "gzipSize": 18962, "imports": [ "Frame" ] @@ -1687,8 +1687,8 @@ "scenario": "Frame.html", "description": "Standalone Frame from `layerchart/html`", "group": "Components", - "size": 64047, - "gzipSize": 15513, + "size": 64692, + "gzipSize": 15666, "imports": [ "Frame" ] @@ -1697,8 +1697,8 @@ "scenario": "Cell", "description": "Standalone Cell (agnostic) — baseline", "group": "Components", - "size": 101943, - "gzipSize": 22912, + "size": 102693, + "gzipSize": 23172, "imports": [ "Cell" ] @@ -1707,8 +1707,8 @@ "scenario": "Cell.svg", "description": "Standalone Cell from `layerchart/svg`", "group": "Components", - "size": 77492, - "gzipSize": 17760, + "size": 78244, + "gzipSize": 18395, "imports": [ "Cell" ] @@ -1717,8 +1717,8 @@ "scenario": "Cell.canvas", "description": "Standalone Cell from `layerchart/canvas`", "group": "Components", - "size": 85491, - "gzipSize": 20358, + "size": 86242, + "gzipSize": 20993, "imports": [ "Cell" ] @@ -1727,8 +1727,8 @@ "scenario": "Cell.html", "description": "Standalone Cell from `layerchart/html`", "group": "Components", - "size": 77073, - "gzipSize": 17567, + "size": 77826, + "gzipSize": 18208, "imports": [ "Cell" ] @@ -1737,8 +1737,8 @@ "scenario": "Threshold", "description": "Standalone Threshold (agnostic) — baseline", "group": "Components", - "size": 130833, - "gzipSize": 31956, + "size": 138529, + "gzipSize": 33575, "imports": [ "Threshold" ] @@ -1747,8 +1747,8 @@ "scenario": "Threshold.svg", "description": "Standalone Threshold from `layerchart/svg`", "group": "Components", - "size": 115771, - "gzipSize": 27916, + "size": 123467, + "gzipSize": 29577, "imports": [ "Threshold" ] @@ -1757,8 +1757,8 @@ "scenario": "Threshold.canvas", "description": "Standalone Threshold from `layerchart/canvas`", "group": "Components", - "size": 108850, - "gzipSize": 27212, + "size": 116582, + "gzipSize": 28664, "imports": [ "Threshold" ] @@ -1767,8 +1767,8 @@ "scenario": "AnnotationLine", "description": "Standalone AnnotationLine (agnostic) — baseline", "group": "Components", - "size": 146575, - "gzipSize": 35187, + "size": 148050, + "gzipSize": 35540, "imports": [ "AnnotationLine" ] @@ -1777,8 +1777,8 @@ "scenario": "AnnotationLine.svg", "description": "Standalone AnnotationLine from `layerchart/svg`", "group": "Components", - "size": 125124, - "gzipSize": 30071, + "size": 126610, + "gzipSize": 30513, "imports": [ "AnnotationLine" ] @@ -1787,8 +1787,8 @@ "scenario": "AnnotationLine.canvas", "description": "Standalone AnnotationLine from `layerchart/canvas`", "group": "Components", - "size": 124680, - "gzipSize": 30651, + "size": 126175, + "gzipSize": 31053, "imports": [ "AnnotationLine" ] @@ -1797,8 +1797,8 @@ "scenario": "AnnotationPoint", "description": "Standalone AnnotationPoint (agnostic) — baseline", "group": "Components", - "size": 192181, - "gzipSize": 46180, + "size": 194996, + "gzipSize": 47572, "imports": [ "AnnotationPoint" ] @@ -1807,8 +1807,8 @@ "scenario": "AnnotationPoint.svg", "description": "Standalone AnnotationPoint from `layerchart/svg`", "group": "Components", - "size": 169816, - "gzipSize": 40892, + "size": 172465, + "gzipSize": 42572, "imports": [ "AnnotationPoint" ] @@ -1817,8 +1817,8 @@ "scenario": "AnnotationPoint.canvas", "description": "Standalone AnnotationPoint from `layerchart/canvas`", "group": "Components", - "size": 159179, - "gzipSize": 39484, + "size": 161753, + "gzipSize": 40483, "imports": [ "AnnotationPoint" ] @@ -1827,8 +1827,8 @@ "scenario": "Trail", "description": "Standalone Trail (agnostic) — baseline", "group": "Components", - "size": 99866, - "gzipSize": 25616, + "size": 100218, + "gzipSize": 25754, "imports": [ "Trail" ] @@ -1837,8 +1837,8 @@ "scenario": "Trail.svg", "description": "Standalone Trail from `layerchart/svg`", "group": "Components", - "size": 86471, - "gzipSize": 21862, + "size": 86823, + "gzipSize": 22178, "imports": [ "Trail" ] @@ -1847,8 +1847,8 @@ "scenario": "Trail.canvas", "description": "Standalone Trail from `layerchart/canvas`", "group": "Components", - "size": 80767, - "gzipSize": 21450, + "size": 81159, + "gzipSize": 21631, "imports": [ "Trail" ] @@ -1857,8 +1857,8 @@ "scenario": "Vector", "description": "Standalone Vector (agnostic) — baseline", "group": "Components", - "size": 99354, - "gzipSize": 25061, + "size": 99783, + "gzipSize": 25335, "imports": [ "Vector" ] @@ -1867,8 +1867,8 @@ "scenario": "Vector.svg", "description": "Standalone Vector from `layerchart/svg`", "group": "Components", - "size": 85959, - "gzipSize": 21310, + "size": 86388, + "gzipSize": 21656, "imports": [ "Vector" ] @@ -1877,8 +1877,8 @@ "scenario": "Vector.canvas", "description": "Standalone Vector from `layerchart/canvas`", "group": "Components", - "size": 81644, - "gzipSize": 21383, + "size": 81791, + "gzipSize": 21450, "imports": [ "Vector" ] @@ -1887,8 +1887,8 @@ "scenario": "Link", "description": "Standalone Link (agnostic) — baseline", "group": "Components", - "size": 113510, - "gzipSize": 28615, + "size": 113871, + "gzipSize": 28823, "imports": [ "Link" ] @@ -1897,8 +1897,8 @@ "scenario": "Link.svg", "description": "Standalone Link from `layerchart/svg`", "group": "Components", - "size": 99967, - "gzipSize": 24837, + "size": 100328, + "gzipSize": 25133, "imports": [ "Link" ] @@ -1907,8 +1907,8 @@ "scenario": "Link.canvas", "description": "Standalone Link from `layerchart/canvas`", "group": "Components", - "size": 93767, - "gzipSize": 24298, + "size": 94163, + "gzipSize": 24505, "imports": [ "Link" ] @@ -1917,8 +1917,8 @@ "scenario": "AnnotationRange", "description": "Standalone AnnotationRange (agnostic) — baseline", "group": "Components", - "size": 160841, - "gzipSize": 37794, + "size": 162371, + "gzipSize": 38155, "imports": [ "AnnotationRange" ] @@ -1927,8 +1927,8 @@ "scenario": "AnnotationRange.svg", "description": "Standalone AnnotationRange from `layerchart/svg`", "group": "Components", - "size": 134159, - "gzipSize": 31860, + "size": 135701, + "gzipSize": 32275, "imports": [ "AnnotationRange" ] @@ -1937,8 +1937,8 @@ "scenario": "AnnotationRange.canvas", "description": "Standalone AnnotationRange from `layerchart/canvas`", "group": "Components", - "size": 134433, - "gzipSize": 32593, + "size": 135982, + "gzipSize": 33022, "imports": [ "AnnotationRange" ] @@ -1947,8 +1947,8 @@ "scenario": "Hull", "description": "Standalone Hull (agnostic) — baseline", "group": "Components", - "size": 185456, - "gzipSize": 49046, + "size": 189270, + "gzipSize": 50135, "imports": [ "Hull" ] @@ -1957,8 +1957,8 @@ "scenario": "Hull.svg", "description": "Standalone Hull from `layerchart/svg`", "group": "Components", - "size": 184623, - "gzipSize": 49243, + "size": 188437, + "gzipSize": 50353, "imports": [ "Hull" ] @@ -1967,8 +1967,8 @@ "scenario": "Hull.canvas", "description": "Standalone Hull from `layerchart/canvas`", "group": "Components", - "size": 184623, - "gzipSize": 48926, + "size": 188437, + "gzipSize": 50126, "imports": [ "Hull" ] @@ -1977,8 +1977,8 @@ "scenario": "Density", "description": "Standalone Density (agnostic) — baseline", "group": "Components", - "size": 137744, - "gzipSize": 37548, + "size": 138253, + "gzipSize": 37870, "imports": [ "Density" ] @@ -1987,8 +1987,8 @@ "scenario": "Density.svg", "description": "Standalone Density from `layerchart/svg`", "group": "Components", - "size": 124297, - "gzipSize": 33725, + "size": 124806, + "gzipSize": 34091, "imports": [ "Density" ] @@ -1997,8 +1997,8 @@ "scenario": "Density.canvas", "description": "Standalone Density from `layerchart/canvas`", "group": "Components", - "size": 123894, - "gzipSize": 34605, + "size": 124402, + "gzipSize": 34857, "imports": [ "Density" ] @@ -2007,8 +2007,8 @@ "scenario": "Calendar", "description": "Standalone Calendar (agnostic) — baseline", "group": "Components", - "size": 178679, - "gzipSize": 42140, + "size": 180318, + "gzipSize": 42778, "imports": [ "Calendar" ] @@ -2017,8 +2017,8 @@ "scenario": "Calendar.svg", "description": "Standalone Calendar from `layerchart/svg`", "group": "Components", - "size": 165200, - "gzipSize": 40078, + "size": 166842, + "gzipSize": 40952, "imports": [ "Calendar" ] @@ -2027,8 +2027,8 @@ "scenario": "Calendar.canvas", "description": "Standalone Calendar from `layerchart/canvas`", "group": "Components", - "size": 161300, - "gzipSize": 38837, + "size": 162952, + "gzipSize": 40008, "imports": [ "Calendar" ] @@ -2037,8 +2037,8 @@ "scenario": "CircleClipPath", "description": "Standalone CircleClipPath (agnostic) — baseline", "group": "Components", - "size": 8635, - "gzipSize": 2353, + "size": 8705, + "gzipSize": 2381, "imports": [ "CircleClipPath" ] @@ -2047,8 +2047,8 @@ "scenario": "CircleClipPath.svg", "description": "Standalone CircleClipPath from `layerchart/svg`", "group": "Components", - "size": 5041, - "gzipSize": 1751, + "size": 5111, + "gzipSize": 1780, "imports": [ "CircleClipPath" ] @@ -2057,8 +2057,8 @@ "scenario": "CircleClipPath.canvas", "description": "Standalone CircleClipPath from `layerchart/canvas`", "group": "Components", - "size": 4047, - "gzipSize": 1465, + "size": 4117, + "gzipSize": 1493, "imports": [ "CircleClipPath" ] @@ -2067,8 +2067,8 @@ "scenario": "CircleClipPath.html", "description": "Standalone CircleClipPath from `layerchart/html`", "group": "Components", - "size": 4354, - "gzipSize": 1552, + "size": 4424, + "gzipSize": 1580, "imports": [ "CircleClipPath" ] @@ -2077,8 +2077,8 @@ "scenario": "Voronoi", "description": "Standalone Voronoi (agnostic) — baseline", "group": "Components", - "size": 181759, - "gzipSize": 47774, + "size": 184599, + "gzipSize": 48616, "imports": [ "Voronoi" ] @@ -2087,8 +2087,8 @@ "scenario": "Voronoi.svg", "description": "Standalone Voronoi from `layerchart/svg`", "group": "Components", - "size": 179690, - "gzipSize": 47640, + "size": 182530, + "gzipSize": 48645, "imports": [ "Voronoi" ] @@ -2097,8 +2097,8 @@ "scenario": "Voronoi.canvas", "description": "Standalone Voronoi from `layerchart/canvas`", "group": "Components", - "size": 178688, - "gzipSize": 47136, + "size": 181528, + "gzipSize": 48291, "imports": [ "Voronoi" ] @@ -2107,8 +2107,8 @@ "scenario": "Contour", "description": "Standalone Contour (agnostic) — baseline", "group": "Components", - "size": 169389, - "gzipSize": 46230, + "size": 169895, + "gzipSize": 46551, "imports": [ "Contour" ] @@ -2117,8 +2117,8 @@ "scenario": "Contour.svg", "description": "Standalone Contour from `layerchart/svg`", "group": "Components", - "size": 155946, - "gzipSize": 42399, + "size": 156452, + "gzipSize": 42781, "imports": [ "Contour" ] @@ -2127,8 +2127,8 @@ "scenario": "Contour.canvas", "description": "Standalone Contour from `layerchart/canvas`", "group": "Components", - "size": 155547, - "gzipSize": 43305, + "size": 156052, + "gzipSize": 43507, "imports": [ "Contour" ] @@ -2137,8 +2137,8 @@ "scenario": "Month", "description": "Standalone Month (agnostic) — baseline", "group": "Components", - "size": 158806, - "gzipSize": 36994, + "size": 160442, + "gzipSize": 37588, "imports": [ "Month" ] @@ -2147,8 +2147,8 @@ "scenario": "Month.svg", "description": "Standalone Month from `layerchart/svg`", "group": "Components", - "size": 134726, - "gzipSize": 31922, + "size": 136365, + "gzipSize": 32993, "imports": [ "Month" ] @@ -2157,8 +2157,8 @@ "scenario": "Month.canvas", "description": "Standalone Month from `layerchart/canvas`", "group": "Components", - "size": 136831, - "gzipSize": 33013, + "size": 138477, + "gzipSize": 34013, "imports": [ "Month" ] @@ -2167,8 +2167,8 @@ "scenario": "Raster", "description": "Standalone Raster (agnostic) — baseline", "group": "Components", - "size": 126502, - "gzipSize": 34165, + "size": 127104, + "gzipSize": 34292, "imports": [ "Raster" ] @@ -2177,8 +2177,8 @@ "scenario": "Raster.svg", "description": "Standalone Raster from `layerchart/svg`", "group": "Components", - "size": 120405, - "gzipSize": 33146, + "size": 121007, + "gzipSize": 33304, "imports": [ "Raster" ] @@ -2187,8 +2187,8 @@ "scenario": "Raster.canvas", "description": "Standalone Raster from `layerchart/canvas`", "group": "Components", - "size": 118686, - "gzipSize": 32603, + "size": 119292, + "gzipSize": 32765, "imports": [ "Raster" ] @@ -2197,8 +2197,8 @@ "scenario": "Raster.html", "description": "Standalone Raster from `layerchart/html`", "group": "Components", - "size": 119393, - "gzipSize": 32829, + "size": 119995, + "gzipSize": 33004, "imports": [ "Raster" ] @@ -2207,8 +2207,8 @@ "scenario": "Violin", "description": "Standalone Violin (agnostic) — baseline", "group": "Components", - "size": 138223, - "gzipSize": 32128, + "size": 139216, + "gzipSize": 32583, "imports": [ "Violin" ] @@ -2217,8 +2217,8 @@ "scenario": "Violin.svg", "description": "Standalone Violin from `layerchart/svg`", "group": "Components", - "size": 120914, - "gzipSize": 27841, + "size": 121907, + "gzipSize": 28623, "imports": [ "Violin" ] @@ -2227,8 +2227,8 @@ "scenario": "Violin.canvas", "description": "Standalone Violin from `layerchart/canvas`", "group": "Components", - "size": 116171, - "gzipSize": 27928, + "size": 117167, + "gzipSize": 28617, "imports": [ "Violin" ] @@ -2237,8 +2237,8 @@ "scenario": "BoxPlot", "description": "Standalone BoxPlot (agnostic) — baseline", "group": "Components", - "size": 126684, - "gzipSize": 26494, + "size": 127683, + "gzipSize": 26807, "imports": [ "BoxPlot" ] @@ -2247,8 +2247,8 @@ "scenario": "BoxPlot.svg", "description": "Standalone BoxPlot from `layerchart/svg`", "group": "Components", - "size": 108188, - "gzipSize": 22122, + "size": 109191, + "gzipSize": 22827, "imports": [ "BoxPlot" ] @@ -2257,8 +2257,8 @@ "scenario": "BoxPlot.canvas", "description": "Standalone BoxPlot from `layerchart/canvas`", "group": "Components", - "size": 110538, - "gzipSize": 23227, + "size": 111542, + "gzipSize": 23952, "imports": [ "BoxPlot" ] @@ -2267,8 +2267,8 @@ "scenario": "GeoPath", "description": "Standalone GeoPath (agnostic) — baseline", "group": "Components", - "size": 104867, - "gzipSize": 27059, + "size": 105223, + "gzipSize": 27160, "imports": [ "GeoPath" ] @@ -2277,8 +2277,8 @@ "scenario": "GeoPath.svg", "description": "Standalone GeoPath from `layerchart/svg`", "group": "Components", - "size": 91468, - "gzipSize": 23238, + "size": 91824, + "gzipSize": 23519, "imports": [ "GeoPath" ] @@ -2287,8 +2287,8 @@ "scenario": "GeoPath.canvas", "description": "Standalone GeoPath from `layerchart/canvas`", "group": "Components", - "size": 84389, - "gzipSize": 22350, + "size": 84459, + "gzipSize": 22429, "imports": [ "GeoPath" ] @@ -2297,8 +2297,8 @@ "scenario": "GeoSpline", "description": "Standalone GeoSpline (agnostic) — baseline", "group": "Components", - "size": 122726, - "gzipSize": 32666, + "size": 123082, + "gzipSize": 32783, "imports": [ "GeoSpline" ] @@ -2307,8 +2307,8 @@ "scenario": "GeoSpline.svg", "description": "Standalone GeoSpline from `layerchart/svg`", "group": "Components", - "size": 109323, - "gzipSize": 28858, + "size": 109679, + "gzipSize": 29143, "imports": [ "GeoSpline" ] @@ -2317,8 +2317,8 @@ "scenario": "GeoSpline.canvas", "description": "Standalone GeoSpline from `layerchart/canvas`", "group": "Components", - "size": 102266, - "gzipSize": 28055, + "size": 102336, + "gzipSize": 28134, "imports": [ "GeoSpline" ] @@ -2327,8 +2327,8 @@ "scenario": "GeoPoint", "description": "Standalone GeoPoint (agnostic) — baseline", "group": "Components", - "size": 81070, - "gzipSize": 19963, + "size": 81506, + "gzipSize": 20121, "imports": [ "GeoPoint" ] @@ -2337,8 +2337,8 @@ "scenario": "GeoPoint.svg", "description": "Standalone GeoPoint from `layerchart/svg`", "group": "Components", - "size": 66491, - "gzipSize": 15764, + "size": 66927, + "gzipSize": 16255, "imports": [ "GeoPoint" ] @@ -2347,8 +2347,8 @@ "scenario": "GeoPoint.canvas", "description": "Standalone GeoPoint from `layerchart/canvas`", "group": "Components", - "size": 76320, - "gzipSize": 18897, + "size": 76756, + "gzipSize": 19401, "imports": [ "GeoPoint" ] @@ -2357,8 +2357,8 @@ "scenario": "GeoCircle", "description": "Standalone GeoCircle (agnostic) — baseline", "group": "Components", - "size": 108973, - "gzipSize": 28293, + "size": 109329, + "gzipSize": 28393, "imports": [ "GeoCircle" ] @@ -2367,8 +2367,8 @@ "scenario": "GeoCircle.svg", "description": "Standalone GeoCircle from `layerchart/svg`", "group": "Components", - "size": 95379, - "gzipSize": 24397, + "size": 95735, + "gzipSize": 24675, "imports": [ "GeoCircle" ] @@ -2377,8 +2377,8 @@ "scenario": "GeoCircle.canvas", "description": "Standalone GeoCircle from `layerchart/canvas`", "group": "Components", - "size": 88297, - "gzipSize": 23456, + "size": 88367, + "gzipSize": 23544, "imports": [ "GeoCircle" ] @@ -2387,8 +2387,8 @@ "scenario": "GeoTile", "description": "Standalone GeoTile (agnostic) — baseline", "group": "Components", - "size": 135836, - "gzipSize": 33649, + "size": 137165, + "gzipSize": 34162, "imports": [ "GeoTile" ] @@ -2397,8 +2397,8 @@ "scenario": "GeoTile.svg", "description": "Standalone GeoTile from `layerchart/svg`", "group": "Components", - "size": 122791, - "gzipSize": 29945, + "size": 124120, + "gzipSize": 30991, "imports": [ "GeoTile" ] @@ -2407,8 +2407,8 @@ "scenario": "GeoTile.canvas", "description": "Standalone GeoTile from `layerchart/canvas`", "group": "Components", - "size": 126700, - "gzipSize": 31558, + "size": 128040, + "gzipSize": 32488, "imports": [ "GeoTile" ] @@ -2417,8 +2417,8 @@ "scenario": "TileImage", "description": "Standalone TileImage (agnostic) — baseline", "group": "Components", - "size": 123903, - "gzipSize": 31056, + "size": 125135, + "gzipSize": 31426, "imports": [ "TileImage" ] @@ -2427,8 +2427,8 @@ "scenario": "TileImage.svg", "description": "Standalone TileImage from `layerchart/svg`", "group": "Components", - "size": 111928, - "gzipSize": 27635, + "size": 113163, + "gzipSize": 28045, "imports": [ "TileImage" ] @@ -2437,8 +2437,8 @@ "scenario": "TileImage.canvas", "description": "Standalone TileImage from `layerchart/canvas`", "group": "Components", - "size": 117071, - "gzipSize": 29541, + "size": 118318, + "gzipSize": 29950, "imports": [ "TileImage" ] @@ -2447,8 +2447,8 @@ "scenario": "Graticule", "description": "Standalone Graticule (agnostic) — baseline", "group": "Components", - "size": 110177, - "gzipSize": 28296, + "size": 110533, + "gzipSize": 28407, "imports": [ "Graticule" ] @@ -2457,8 +2457,8 @@ "scenario": "Graticule.svg", "description": "Standalone Graticule from `layerchart/svg`", "group": "Components", - "size": 96531, - "gzipSize": 24431, + "size": 96887, + "gzipSize": 24722, "imports": [ "Graticule" ] @@ -2467,8 +2467,8 @@ "scenario": "Graticule.canvas", "description": "Standalone Graticule from `layerchart/canvas`", "group": "Components", - "size": 96113, - "gzipSize": 25198, + "size": 96468, + "gzipSize": 25477, "imports": [ "Graticule" ] @@ -2477,8 +2477,8 @@ "scenario": "GeoClipPath", "description": "Standalone GeoClipPath (agnostic) — baseline", "group": "Components", - "size": 15079, - "gzipSize": 4430, + "size": 15149, + "gzipSize": 4458, "imports": [ "GeoClipPath" ] @@ -2487,8 +2487,8 @@ "scenario": "GeoClipPath.svg", "description": "Standalone GeoClipPath from `layerchart/svg`", "group": "Components", - "size": 13223, - "gzipSize": 4109, + "size": 13289, + "gzipSize": 4131, "imports": [ "GeoClipPath" ] @@ -2497,8 +2497,8 @@ "scenario": "GeoClipPath.canvas", "description": "Standalone GeoClipPath from `layerchart/canvas`", "group": "Components", - "size": 12191, - "gzipSize": 3825, + "size": 12261, + "gzipSize": 3846, "imports": [ "GeoClipPath" ] @@ -2507,8 +2507,8 @@ "scenario": "GeoEdgeFade", "description": "Standalone GeoEdgeFade (agnostic) — baseline", "group": "Components", - "size": 87877, - "gzipSize": 24109, + "size": 88232, + "gzipSize": 24224, "imports": [ "GeoEdgeFade" ] @@ -2517,8 +2517,8 @@ "scenario": "GeoEdgeFade.svg", "description": "Standalone GeoEdgeFade from `layerchart/svg`", "group": "Components", - "size": 86314, - "gzipSize": 23617, + "size": 86673, + "gzipSize": 23873, "imports": [ "GeoEdgeFade" ] @@ -2527,8 +2527,8 @@ "scenario": "GeoEdgeFade.canvas", "description": "Standalone GeoEdgeFade from `layerchart/canvas`", "group": "Components", - "size": 85068, - "gzipSize": 23379, + "size": 85431, + "gzipSize": 23563, "imports": [ "GeoEdgeFade" ] @@ -2537,8 +2537,8 @@ "scenario": "Blur", "description": "Standalone Blur (agnostic) — baseline", "group": "Components", - "size": 3288, - "gzipSize": 1325, + "size": 3358, + "gzipSize": 1352, "imports": [ "Blur" ] @@ -2547,8 +2547,8 @@ "scenario": "Blur.svg", "description": "Standalone Blur from `layerchart/svg`", "group": "Components", - "size": 3288, - "gzipSize": 1325, + "size": 3358, + "gzipSize": 1350, "imports": [ "Blur" ] @@ -2557,8 +2557,8 @@ "scenario": "Blur.canvas", "description": "Standalone Blur from `layerchart/canvas`", "group": "Components", - "size": 3288, - "gzipSize": 1325, + "size": 3358, + "gzipSize": 1350, "imports": [ "Blur" ] @@ -2567,8 +2567,8 @@ "scenario": "Blur.html", "description": "Standalone Blur from `layerchart/html`", "group": "Components", - "size": 3288, - "gzipSize": 1325, + "size": 3358, + "gzipSize": 1350, "imports": [ "Blur" ] @@ -2577,8 +2577,8 @@ "scenario": "Ribbon", "description": "Standalone Ribbon (agnostic) — baseline", "group": "Components", - "size": 97853, - "gzipSize": 25059, + "size": 98209, + "gzipSize": 25166, "imports": [ "Ribbon" ] @@ -2587,8 +2587,8 @@ "scenario": "Ribbon.svg", "description": "Standalone Ribbon from `layerchart/svg`", "group": "Components", - "size": 84454, - "gzipSize": 21205, + "size": 84810, + "gzipSize": 21512, "imports": [ "Ribbon" ] @@ -2597,8 +2597,8 @@ "scenario": "Ribbon.canvas", "description": "Standalone Ribbon from `layerchart/canvas`", "group": "Components", - "size": 77290, - "gzipSize": 20429, + "size": 77364, + "gzipSize": 20505, "imports": [ "Ribbon" ] @@ -2607,8 +2607,8 @@ "scenario": "Dodge", "description": "Standalone Dodge — baseline", "group": "Components", - "size": 5725, - "gzipSize": 2220, + "size": 5795, + "gzipSize": 2248, "imports": [ "Dodge" ] @@ -2627,8 +2627,8 @@ "scenario": "Pack", "description": "Standalone Pack — baseline", "group": "Components", - "size": 7532, - "gzipSize": 2829, + "size": 7602, + "gzipSize": 2859, "imports": [ "Pack" ] @@ -2637,8 +2637,8 @@ "scenario": "Tree", "description": "Standalone Tree — baseline", "group": "Components", - "size": 8145, - "gzipSize": 2927, + "size": 8215, + "gzipSize": 2952, "imports": [ "Tree" ] @@ -2647,8 +2647,8 @@ "scenario": "Treemap", "description": "Standalone Treemap — baseline", "group": "Components", - "size": 7713, - "gzipSize": 2711, + "size": 7783, + "gzipSize": 2740, "imports": [ "Treemap" ] @@ -2657,8 +2657,8 @@ "scenario": "Partition", "description": "Standalone Partition — baseline", "group": "Components", - "size": 3027, - "gzipSize": 1324, + "size": 3097, + "gzipSize": 1351, "imports": [ "Partition" ] @@ -2667,8 +2667,8 @@ "scenario": "Chord", "description": "Standalone Chord — baseline", "group": "Components", - "size": 5846, - "gzipSize": 1871, + "size": 5916, + "gzipSize": 1895, "imports": [ "Chord" ] @@ -2677,8 +2677,8 @@ "scenario": "Dagre", "description": "Standalone Dagre — baseline", "group": "Components", - "size": 67850, - "gzipSize": 19078, + "size": 67920, + "gzipSize": 19105, "imports": [ "Dagre" ] @@ -2687,8 +2687,8 @@ "scenario": "Sankey", "description": "Standalone Sankey — baseline", "group": "Components", - "size": 10262, - "gzipSize": 3124, + "size": 10332, + "gzipSize": 3152, "imports": [ "Sankey" ] @@ -2697,8 +2697,8 @@ "scenario": "GeoLegend", "description": "Standalone GeoLegend — baseline", "group": "Components", - "size": 93291, - "gzipSize": 23176, + "size": 94069, + "gzipSize": 23454, "imports": [ "GeoLegend" ] @@ -2707,8 +2707,8 @@ "scenario": "GeoProjection", "description": "Standalone GeoProjection — baseline", "group": "Components", - "size": 4513, - "gzipSize": 1442, + "size": 4683, + "gzipSize": 1500, "imports": [ "GeoProjection" ] @@ -2717,8 +2717,8 @@ "scenario": "GeoRaster", "description": "Standalone GeoRaster — baseline", "group": "Components", - "size": 13861, - "gzipSize": 4482, + "size": 13931, + "gzipSize": 4510, "imports": [ "GeoRaster" ] @@ -2737,8 +2737,8 @@ "scenario": "Tooltip", "description": "Standalone Tooltip — baseline", "group": "Components", - "size": 134018, - "gzipSize": 32508, + "size": 187020, + "gzipSize": 47601, "imports": [ "Tooltip" ] @@ -2747,8 +2747,8 @@ "scenario": "BrushContext", "description": "Standalone BrushContext — baseline", "group": "Components", - "size": 66428, - "gzipSize": 15849, + "size": 67327, + "gzipSize": 16143, "imports": [ "BrushContext" ] @@ -2757,8 +2757,8 @@ "scenario": "TransformContext", "description": "Standalone TransformContext — baseline", "group": "Components", - "size": 19779, - "gzipSize": 5303, + "size": 23953, + "gzipSize": 6130, "imports": [ "TransformContext" ] @@ -2777,8 +2777,8 @@ "scenario": "Layer", "description": "Standalone Layer — baseline", "group": "Components", - "size": 130645, - "gzipSize": 33735, + "size": 73083, + "gzipSize": 19367, "imports": [ "Layer" ] @@ -2787,8 +2787,8 @@ "scenario": "Legend", "description": "Standalone Legend — baseline", "group": "Components", - "size": 127975, - "gzipSize": 33774, + "size": 128727, + "gzipSize": 34071, "imports": [ "Legend" ] @@ -2797,8 +2797,8 @@ "scenario": "CircleLegend", "description": "Standalone CircleLegend — baseline", "group": "Components", - "size": 89794, - "gzipSize": 21927, + "size": 90577, + "gzipSize": 22186, "imports": [ "CircleLegend" ] @@ -2817,8 +2817,8 @@ "scenario": "Bounds", "description": "Standalone Bounds — baseline", "group": "Components", - "size": 31258, - "gzipSize": 10302, + "size": 31328, + "gzipSize": 10328, "imports": [ "Bounds" ] @@ -2827,8 +2827,8 @@ "scenario": "Point", "description": "Standalone Point — baseline", "group": "Components", - "size": 1642, - "gzipSize": 762, + "size": 1712, + "gzipSize": 790, "imports": [ "Point" ] @@ -2837,8 +2837,8 @@ "scenario": "WebGL", "description": "Standalone WebGL — baseline", "group": "Components", - "size": 3297, - "gzipSize": 1439, + "size": 3367, + "gzipSize": 1461, "imports": [ "WebGL" ] @@ -2847,8 +2847,8 @@ "scenario": "all", "description": "Everything from layerchart (worst case)", "group": "Worst case", - "size": 1038051, - "gzipSize": 243953, + "size": 1069369, + "gzipSize": 252128, "imports": [ "*" ] diff --git a/docs/generated/releases/layerchart-2.1.0.md b/docs/generated/releases/layerchart-2.1.0.md new file mode 100644 index 0000000000..b2f0ecba4b --- /dev/null +++ b/docs/generated/releases/layerchart-2.1.0.md @@ -0,0 +1,24 @@ +--- +title: "layerchart@2.1.0" +tag: "layerchart@2.1.0" +date: "2026-08-06T15:07:11Z" +url: "https://github.com/techniq/layerchart/releases/tag/layerchart%402.1.0" +draft: false +prerelease: false +author: "github-actions[bot]" +--- +### Minor Changes + +- feat(Labels): Add `layout="voronoi"` to place each label towards Voronoi cell's centroid, `occlude` to drop overlapping labels and `links` to move labels to centroid with a leader line back to the point. ([#892](https://github.com/techniq/layerchart/pull/892)) + +- feat(Points|Labels): Project through the chart's geo projection when present, so `` (and ``) render on maps. ([#892](https://github.com/techniq/layerchart/pull/892)) + +- feat(Voronoi): Add `children` snippet exposing per-cell geometry (`point`, `polygon`, `centroid`, `area`) for custom rendering (e.g. labels). ([#892](https://github.com/techniq/layerchart/pull/892)) + +- feat(AnnotationPoint): Support explicit `labelX`/`labelY` positioning, a `fontSize` prop, a `labelGap` for callout spacing, and a `labelPlacement="smart"` option that auto-orients the label and terminates its callout at the label edge. ([#892](https://github.com/techniq/layerchart/pull/892)) + +- feat(GeoState): Support `clipExtent: true` to clip the projection to the chart dimensions (`[[0, 0], [width, height]]`), e.g. to trim the `Sphere` overflow under `geoMercator`. ([#892](https://github.com/techniq/layerchart/pull/892)) + +### Patch Changes + +- fix(Text|Labels): Anchor `verticalAnchor` by cap-height so text sits a consistent distance from marks and aligns across the Svg, Canvas, and Html layers. `placement="smart"` labels now clear the point marker on all sides. ([#893](https://github.com/techniq/layerchart/pull/893)) \ No newline at end of file diff --git a/docs/generated/releases/layerchart-2.1.1.md b/docs/generated/releases/layerchart-2.1.1.md new file mode 100644 index 0000000000..14561994c2 --- /dev/null +++ b/docs/generated/releases/layerchart-2.1.1.md @@ -0,0 +1,18 @@ +--- +title: "layerchart@2.1.1" +tag: "layerchart@2.1.1" +date: "2026-08-11T03:50:14Z" +url: "https://github.com/techniq/layerchart/releases/tag/layerchart%402.1.1" +draft: false +prerelease: false +author: "github-actions[bot]" +--- +### Patch Changes + +- fix(Spline): Only tween path data when `motion` is set (~20x less memory growth while streaming, issue #585) ([#896](https://github.com/techniq/layerchart/pull/896)) + +- perf(Chart): Remove quadratic domain recalculation on mount for series-based charts ([#896](https://github.com/techniq/layerchart/pull/896)) + +- perf: Memoize props in component state classes (~3x faster `` mount in benchmarks) ([#896](https://github.com/techniq/layerchart/pull/896)) + +- perf(Chart): Resolve stacked value domain in a single pass ([#896](https://github.com/techniq/layerchart/pull/896)) \ No newline at end of file diff --git a/docs/generated/releases/layerchart-2.2.0.md b/docs/generated/releases/layerchart-2.2.0.md new file mode 100644 index 0000000000..0eb775bc25 --- /dev/null +++ b/docs/generated/releases/layerchart-2.2.0.md @@ -0,0 +1,16 @@ +--- +title: "layerchart@2.2.0" +tag: "layerchart@2.2.0" +date: "2026-08-12T02:54:28Z" +url: "https://github.com/techniq/layerchart/releases/tag/layerchart%402.2.0" +draft: false +prerelease: false +author: "github-actions[bot]" +--- +### Minor Changes + +- feat(TransformContext): Add two-finger pinch-to-zoom (and pan) support on touch devices, along with a new `pinch` option to disable it ([#898](https://github.com/techniq/layerchart/pull/898)) + +### Patch Changes + +- fix(Axis): Support UTC scales (`xScale={scaleUtc()}`) by filtering and formatting ticks on the same boundaries as the scale ([#899](https://github.com/techniq/layerchart/pull/899)) \ No newline at end of file diff --git a/docs/package.json b/docs/package.json index 3bd5550586..33815507be 100644 --- a/docs/package.json +++ b/docs/package.json @@ -15,6 +15,8 @@ "lint": "prettier --check . && eslint .", "test:unit": "vitest", "test": "pnpm test:unit -- --run", + "test:visual": "node scripts/visual-snapshot.mjs capture snapshots/current.json --repeat 1 && node scripts/visual-snapshot.mjs compare snapshots/baseline.json snapshots/current.json", + "test:visual:update": "node scripts/visual-snapshot.mjs capture snapshots/baseline.json --repeat 3", "generate:api": "layerstack-docs generate-api ../packages/layerchart/src/lib/components generated/api", "generate:screenshots": "layerstack-docs generate-screenshots src/examples/components static/screenshots", "generate:catalog": "layerstack-docs generate-catalog ../packages/layerchart/src/lib/components src/examples/components src/examples/catalog", diff --git a/docs/scripts/README.md b/docs/scripts/README.md new file mode 100644 index 0000000000..6339fdbba9 --- /dev/null +++ b/docs/scripts/README.md @@ -0,0 +1,63 @@ +# Visual regression tracking + +`visual-snapshot.mjs` captures what every docs example actually draws and compares it against a +committed baseline. + +It stores a **geometry fingerprint** rather than a screenshot — the drawing attributes of each +mark (`d`, `x`/`y`/`width`/`height`, `cx`/`cy`/`r`, fill, stroke, transform), rounded and hashed, +plus a pixel hash for canvas layers and the text of HTML layers. That keeps the baseline to one +readable JSON file instead of ~1000 images, and avoids the anti-aliasing noise that makes pixel +baselines flap between machines. + +## Running it + +Start the docs dev server, then: + +```sh +pnpm dev # in one terminal + +pnpm test:visual:update # record a baseline (snapshots/baseline.json) +pnpm test:visual # capture again and report what changed +``` + +`test:visual` exits non-zero when anything changed, so it can gate a build. + +To see _what_ changed rather than just which examples: + +```sh +node scripts/visual-snapshot.mjs diff BarChart/stack-series --base --head +``` + +To review changes visually, point `--shots` at an output directory. Pass `--base-url` as well — +"before" images need the old code actually running (see below) — and open the `index.html` it +writes for a side-by-side of every changed example: + +```sh +node scripts/visual-snapshot.mjs compare snapshots/baseline.json snapshots/current.json \ + --shots /tmp/visual-report --base-url http://localhost:3011 --head-url http://localhost:3002 +``` + +Useful flags: `--filter BarChart` scopes a run to matching examples, `--concurrency` (default 8) +trades CPU for wall clock, `--repeat 2` captures twice to detect unstable examples. + +## Serving an old revision for comparison + +```sh +git worktree add /tmp/lc-base +cd /tmp/lc-base && pnpm install --frozen-lockfile && pnpm --filter layerchart package +cd docs && pnpm exec vite dev --port 3011 +``` + +The docs import `layerchart` from `dist`, so the package has to be built in that worktree, and +generated files (`static/stackblitz-files.json`, `generated/`) copied in or regenerated. + +## Determinism + +Many examples build their data from `Math.random()` and the clock, so both are stubbed with a +seeded generator before any page script runs. What that cannot reach is measured rather than +assumed: `--repeat` captures each example twice and flags the ones that still disagree, and +`compare` skips those instead of reporting them as regressions. Animated examples +(`ForceSimulation/*`, `GeoPath/interpolating-projections`) land in that bucket. + +Fingerprints depend on the rendering environment — a baseline recorded on macOS will not match one +captured on CI's Linux. Record and compare in the same place. diff --git a/docs/scripts/visual-snapshot.mjs b/docs/scripts/visual-snapshot.mjs new file mode 100644 index 0000000000..4ce200e215 --- /dev/null +++ b/docs/scripts/visual-snapshot.mjs @@ -0,0 +1,444 @@ +/** + * Reproducible visual-regression tracking for the docs examples. + * + * Captures a *geometry fingerprint* of every example rather than a screenshot: the drawing + * attributes of each rendered mark, rounded and hashed. Fingerprints are ~200x smaller than + * PNGs, diff to a readable list of "which examples changed", and skip the anti-aliasing noise + * that makes pixel baselines flap between machines. + * + * node scripts/visual-snapshot.mjs capture snapshots/main.json + * node scripts/visual-snapshot.mjs capture snapshots/head.json --filter BarChart + * node scripts/visual-snapshot.mjs compare snapshots/main.json snapshots/head.json + * + * Examples that draw from `Math.random()` or the clock would otherwise differ on every run, so + * both are stubbed before any page script runs. Whatever remains unstable is measured rather + * than assumed: `--repeat 2` captures each example twice and marks the ones that still disagree, + * and `compare` ignores those instead of reporting them as regressions. + */ +import { chromium } from 'playwright'; +import { createHash } from 'node:crypto'; +import { mkdirSync, readdirSync, readFileSync, writeFileSync } from 'node:fs'; +import { dirname, join } from 'node:path'; + +const CATALOG_DIR = 'src/examples/catalog'; +const DEFAULT_URL = 'http://localhost:3002'; + +// Fixed so a chart built from `new Date()` lands on the same dates every run +const FROZEN_NOW = Date.UTC(2026, 0, 15, 12, 0, 0); + +/** Replaces the two sources of per-run drift before the app's own scripts run. */ +function determinismScript(seed) { + return `(() => { + let s = ${seed} >>> 0; + Math.random = () => { + s = (s + 0x6d2b79f5) >>> 0; + let t = s; + t = Math.imul(t ^ (t >>> 15), t | 1); + t ^= t + Math.imul(t ^ (t >>> 7), t | 61); + return ((t ^ (t >>> 14)) >>> 0) / 4294967296; + }; + const RealDate = Date; + const now = ${FROZEN_NOW}; + class FrozenDate extends RealDate { + constructor(...args) { + super(...(args.length ? args : [now])); + } + static now() { + return now; + } + } + Object.defineProperty(globalThis, 'Date', { value: FrozenDate, writable: true }); + performance.now = () => 0; + })()`; +} + +/** + * Runs in the page. Collects what was actually drawn — SVG geometry, canvas pixels, and the + * text of HTML layers (legends, tooltips) — into one string per example. + */ +function extractFingerprint() { + const round = (v) => { + const n = Number.parseFloat(v); + return Number.isFinite(n) ? Math.round(n * 10) / 10 : v; + }; + const GEOMETRY = { + path: ['d'], + rect: ['x', 'y', 'width', 'height', 'rx'], + circle: ['cx', 'cy', 'r'], + ellipse: ['cx', 'cy', 'rx', 'ry'], + line: ['x1', 'y1', 'x2', 'y2'], + polygon: ['points'], + polyline: ['points'], + text: ['x', 'y'], + image: ['x', 'y', 'width', 'height'], + use: ['x', 'y'] + }; + const PAINT = ['fill', 'stroke', 'stroke-width', 'opacity', 'fill-opacity', 'stroke-opacity']; + + /** + * Whether an element draws nothing at all. A zero-height bar, a one-point path or an empty + * label is in the DOM but not on the screen, so moving one is not a visual change — and letting + * them count buries real differences in noise. Read from attributes rather than computed style, + * which would cost a layout read per element across ~1000 elements per example. + */ + const drawsNothing = (el, tag) => { + const num = (name) => Number.parseFloat(el.getAttribute(name) ?? 'NaN'); + if (el.getAttribute('opacity') === '0' || el.getAttribute('display') === 'none') return true; + switch (tag) { + case 'rect': + case 'image': + return num('width') === 0 || num('height') === 0; + case 'circle': + return num('r') === 0; + case 'ellipse': + return num('rx') === 0 || num('ry') === 0; + case 'line': + return num('x1') === num('x2') && num('y1') === num('y2'); + case 'text': + return !el.textContent?.trim(); + case 'path': { + const d = el.getAttribute('d') ?? ''; + // One draw command is a single point — nothing joins it to anything + return !d || (d.match(/[MLHVCSQTA]/gi) ?? []).length <= 1; + } + case 'polygon': + case 'polyline': + return (el.getAttribute('points') ?? '').trim().split(/\s+/).length <= 1; + default: + return false; + } + }; + + const parts = []; + for (const svg of document.querySelectorAll('svg')) { + for (const el of svg.querySelectorAll(Object.keys(GEOMETRY).join(','))) { + const tag = el.tagName.toLowerCase(); + if (drawsNothing(el, tag)) continue; + const attrs = GEOMETRY[tag] + .map((a) => { + const v = el.getAttribute(a); + // `d`/`points` hold many numbers; round each so subpixel drift does not register + return v == null ? '' : String(v).replace(/-?\d+\.?\d*/g, (n) => round(n)); + }) + .join(','); + const paint = PAINT.map((a) => el.getAttribute(a) ?? '').join(','); + const transform = el.getAttribute('transform') ?? ''; + const text = tag === 'text' ? el.textContent?.trim() : ''; + parts.push(`${tag}|${attrs}|${paint}|${transform}|${text}`); + } + } + + // Canvas layers draw nothing inspectable, so hash the pixels instead + for (const canvas of document.querySelectorAll('canvas')) { + try { + parts.push(`canvas|${canvas.width}x${canvas.height}|${canvas.toDataURL().length}`); + } catch { + parts.push('canvas|unreadable'); + } + } + + // HTML layers (legends, labels) carry meaning the SVG does not + for (const el of document.querySelectorAll('.lc-legend, .lc-labels, .lc-tooltip')) { + parts.push(`html|${el.className}|${el.textContent?.trim().slice(0, 200)}`); + } + + return { body: parts.join('\n'), elements: parts.length }; +} + +function listExamples(filter) { + const examples = []; + for (const file of readdirSync(CATALOG_DIR).filter((f) => f.endsWith('.json'))) { + const catalog = JSON.parse(readFileSync(join(CATALOG_DIR, file), 'utf8')); + const component = catalog.component?.name ?? file.replace(/\.json$/, ''); + for (const example of catalog.examples ?? []) { + if (filter && !`${component}/${example.name}`.toLowerCase().includes(filter.toLowerCase())) { + continue; + } + examples.push({ component, example: example.name }); + } + } + return examples.sort((a, b) => `${a.component}/${a.example}`.localeCompare(`${b.component}/${b.example}`)); // prettier-ignore +} + +async function captureOne(page, baseUrl, item, attempt = 0) { + const { component, example } = item; + const url = `${baseUrl}/docs/screenshot/${component}/${example}`; + try { + await page.goto(url, { waitUntil: 'networkidle', timeout: 30000 }); + // Marks tween in; wait for the drawing to stop changing rather than guessing a delay + let previous = null; + for (let i = 0; i < (attempt ? 40 : 12); i++) { + const current = await page.evaluate(extractFingerprint); + if (previous && current.body === previous.body && current.elements > 0) { + return { hash: sha1(current.body), elements: current.elements }; + } + previous = current; + await page.waitForTimeout(150); + } + if (previous?.elements) { + return { hash: sha1(previous.body), elements: previous.elements, settled: false }; + } + // An example fetching its data can outlast the settle window; give it one slower go + if (attempt === 0) return captureOne(page, baseUrl, item, 1); + return { error: 'nothing drawn' }; + } catch (e) { + // A dev server under load aborts navigations — that says nothing about the chart + if (attempt < 2) { + await page.waitForTimeout(500 * (attempt + 1)); + return captureOne(page, baseUrl, item, attempt + 1); + } + return { + error: String(e.message ?? e) + .split('\n')[0] + .slice(0, 120) + }; + } +} + +const sha1 = (s) => createHash('sha1').update(s).digest('hex').slice(0, 16); + +async function capture(outPath, { url, filter, concurrency, repeat, seed }) { + const examples = listExamples(filter); + if (!examples.length) throw new Error(`no examples matched ${filter}`); + console.log(`capturing ${examples.length} examples from ${url} (concurrency ${concurrency}, ${repeat} pass${repeat > 1 ? 'es' : ''})`); // prettier-ignore + + const browser = await chromium.launch(); + const results = new Map(); + const started = Date.now(); + + for (let pass = 0; pass < repeat; pass++) { + const queue = [...examples]; + let done = 0; + await Promise.all( + Array.from({ length: concurrency }, async () => { + const context = await browser.newContext({ + viewport: { width: 800, height: 500 }, + reducedMotion: 'reduce', + colorScheme: 'light' + }); + await context.addInitScript(determinismScript(seed)); + const page = await context.newPage(); + for (let item = queue.shift(); item; item = queue.shift()) { + const key = `${item.component}/${item.example}`; + const result = await captureOne(page, url, item); + const existing = results.get(key); + if (pass === 0) { + results.set(key, result); + } else if (existing && existing.hash !== result.hash) { + results.set(key, { ...existing, unstable: true }); + } + if (++done % 100 === 0) console.log(` pass ${pass + 1}: ${done}/${examples.length}`); + } + await context.close(); + }) + ); + } + await browser.close(); + + const entries = Object.fromEntries([...results].sort(([a], [b]) => a.localeCompare(b))); + const unstable = Object.values(entries).filter((r) => r.unstable).length; + const failed = Object.values(entries).filter((r) => r.error).length; + mkdirSync(dirname(outPath), { recursive: true }); + writeFileSync(outPath, JSON.stringify({ seed, examples: entries }, null, 2) + '\n'); + + const seconds = Math.round((Date.now() - started) / 1000); + console.log(`\nwrote ${outPath} — ${Object.keys(entries).length} examples in ${seconds}s`); + if (unstable) console.log(` ${unstable} unstable (excluded from comparison)`); + if (failed) console.log(` ${failed} failed to render`); +} + +/** Screenshot one example from a running server. */ +async function shoot(page, url, key, outPath) { + const [component, example] = key.split('/'); + await page.goto(`${url}/docs/screenshot/${component}/${example}`, { + waitUntil: 'networkidle', + timeout: 60000 + }); + await page.waitForTimeout(1200); + await page.screenshot({ path: outPath }); +} + +/** + * Renders before/after images for the examples that changed, plus an `index.html` putting each + * pair side by side. "Before" needs the baseline code actually running, so it is only produced + * when `--base-url` is given. + */ +async function report(keys, { dir, baseUrl, headUrl, seed }) { + mkdirSync(dir, { recursive: true }); + const browser = await chromium.launch(); + const context = await browser.newContext({ + viewport: { width: 800, height: 500 }, + deviceScaleFactor: 2, + colorScheme: 'light', + reducedMotion: 'reduce' + }); + await context.addInitScript(determinismScript(seed)); + const page = await context.newPage(); + + const rows = []; + for (const key of keys) { + const slug = key.replace(/[^a-z0-9]+/gi, '-'); + const after = `${slug}.after.png`; + const before = `${slug}.before.png`; + try { + await shoot(page, headUrl, key, join(dir, after)); + if (baseUrl) await shoot(page, baseUrl, key, join(dir, before)); + } catch (e) { + console.log(` could not screenshot ${key}: ${String(e.message ?? e).split('\n')[0]}`); + continue; + } + rows.push({ key, before: baseUrl ? before : null, after }); + console.log(` ${key}`); + } + + const body = rows + .map( + (r) => `

${r.key}

+
+ ${r.before ? `
before
` : ''} +
after
+
` + ) + .join('\n'); + + writeFileSync( + join(dir, 'index.html'), + ` + +Visual differences (${rows.length}) + +

Visual differences (${rows.length})

+${body} +` + ); + await browser.close(); + console.log(`\nreport: ${join(dir, 'index.html')}`); +} + +function compare(baselinePath, currentPath) { + const baseline = JSON.parse(readFileSync(baselinePath, 'utf8')).examples; + const current = JSON.parse(readFileSync(currentPath, 'utf8')).examples; + + const changed = []; + const added = []; + const removed = []; + const skipped = []; + const broke = []; + const incomparable = []; + + for (const [key, now] of Object.entries(current)) { + const before = baseline[key]; + if (!before) { + added.push(key); + } else if (before.error && !now.error) { + // Could be an example that did not exist yet, or one the baseline failed to capture. + // Either way there is nothing to compare against — do not report it as a change. + incomparable.push(`${key} — baseline: ${before.error}`); + } else if (before.unstable || now.unstable) { + skipped.push(key); + } else if (!before.error && now.error) { + broke.push(`${key} — ${now.error}`); + } else if (before.hash !== now.hash) { + changed.push(`${key} ${before.elements ?? '?'} → ${now.elements ?? '?'} elements`); + } + } + for (const key of Object.keys(baseline)) if (!current[key]) removed.push(key); + + const section = (title, items) => { + if (!items.length) return; + console.log(`\n${title} (${items.length})`); + for (const i of items) console.log(` ${i}`); + }; + section('BROKEN — rendered before, errors now', broke); + section('CHANGED', changed); + section('NOT COMPARED — no baseline', incomparable); + section('ADDED', added); + section('REMOVED', removed); + console.log( + `\n${changed.length} changed, ${broke.length} broken, ${added.length} added, ${removed.length} removed, ${incomparable.length} without a baseline, ${skipped.length} skipped as unstable` + ); + return { keys: [...changed, ...broke].map((line) => line.split(/\s+/)[0]), differences: broke.length + changed.length }; // prettier-ignore +} + +/** Re-render one example against two servers and print the drawing attributes that differ. */ +async function diffOne(key, { base, head, seed }) { + const [component, example] = key.split('/'); + const browser = await chromium.launch(); + const bodies = {}; + for (const [label, url] of [ + ['base', base], + ['head', head] + ]) { + const context = await browser.newContext({ + viewport: { width: 800, height: 500 }, + reducedMotion: 'reduce', + colorScheme: 'light' + }); + await context.addInitScript(determinismScript(seed)); + const page = await context.newPage(); + await page.goto(`${url}/docs/screenshot/${component}/${example}`, { waitUntil: 'networkidle' }); + let previous = null; + for (let i = 0; i < 12; i++) { + const current = await page.evaluate(extractFingerprint); + if (previous && current.body === previous.body) break; + previous = current; + await page.waitForTimeout(150); + } + bodies[label] = (previous?.body ?? '').split('\n'); + await context.close(); + } + await browser.close(); + + const [a, b] = [bodies.base, bodies.head]; + const onlyBase = a.filter((l) => !b.includes(l)); + const onlyHead = b.filter((l) => !a.includes(l)); + console.log(`${key}: ${a.length} → ${b.length} elements, ${onlyBase.length} removed / ${onlyHead.length} added\n`); // prettier-ignore + for (const l of onlyBase.slice(0, 20)) console.log(` - ${l.slice(0, 200)}`); + for (const l of onlyHead.slice(0, 20)) console.log(` + ${l.slice(0, 200)}`); +} + +const [command, ...rest] = process.argv.slice(2); +const flag = (name, fallback) => { + const i = rest.indexOf(`--${name}`); + return i === -1 ? fallback : rest[i + 1]; +}; +const positional = rest.filter((a, i) => !a.startsWith('--') && !rest[i - 1]?.startsWith('--')); + +if (command === 'capture') { + await capture(positional[0] ?? 'snapshots/current.json', { + url: flag('url', DEFAULT_URL), + filter: flag('filter', ''), + concurrency: Number(flag('concurrency', 8)), + repeat: Number(flag('repeat', 2)), + seed: Number(flag('seed', 20260815)) + }); +} else if (command === 'diff') { + await diffOne(positional[0], { + base: flag('base', 'http://localhost:3011'), + head: flag('head', DEFAULT_URL), + seed: Number(flag('seed', 20260815)) + }); +} else if (command === 'compare') { + const { keys, differences } = compare(positional[0], positional[1]); + const dir = flag('shots', ''); + if (dir && keys.length) { + console.log(`\nrendering ${keys.length} changed example${keys.length === 1 ? '' : 's'}`); + await report(keys, { + dir, + baseUrl: flag('base-url', ''), + headUrl: flag('head-url', flag('url', DEFAULT_URL)), + seed: Number(flag('seed', 20260815)) + }); + } + process.exitCode = differences ? 1 : 0; +} else { + console.log('usage: visual-snapshot.mjs capture [--url --filter --concurrency --repeat]\n visual-snapshot.mjs compare \n visual-snapshot.mjs diff [--base --head ]\n\ncompare flags:\n --shots write before/after PNGs and an index.html for the changed examples\n --base-url a server running the baseline code, needed for the before images'); // prettier-ignore + process.exitCode = 2; +} diff --git a/docs/snapshots/baseline.json b/docs/snapshots/baseline.json new file mode 100644 index 0000000000..a6edfec848 --- /dev/null +++ b/docs/snapshots/baseline.json @@ -0,0 +1,3757 @@ +{ + "seed": 20260815, + "examples": { + "AnnotationLine/bar-chart": { + "hash": "fa8363b1d3e4db84", + "elements": 86 + }, + "AnnotationLine/horizontal": { + "hash": "b205c3aa708ab7ef", + "elements": 53 + }, + "AnnotationLine/horizontal-placement": { + "hash": "807f5123da411024", + "elements": 53 + }, + "AnnotationLine/horizontal-with-range": { + "hash": "5f3021a0a34480fe", + "elements": 55 + }, + "AnnotationLine/playground": { + "hash": "7fcc10f91105b4c3", + "elements": 55 + }, + "AnnotationLine/sloped": { + "hash": "e76fef7a6ec4f822", + "elements": 53 + }, + "AnnotationLine/vertical": { + "hash": "c2d1f137b8907774", + "elements": 53 + }, + "AnnotationLine/vertical-placement": { + "hash": "0ea8a586d38d2347", + "elements": 53 + }, + "AnnotationLine/vertical-with-rotation": { + "hash": "05c37c07ea35e9b5", + "elements": 56 + }, + "AnnotationPoint/band-scale-on-axis": { + "hash": "92f7e1e44924e83f", + "elements": 86 + }, + "AnnotationPoint/band-scale-on-value": { + "hash": "179fa4e2232611d9", + "elements": 86 + }, + "AnnotationPoint/line-to-point": { + "hash": "4efd355c1f73283d", + "elements": 80 + }, + "AnnotationPoint/link-callouts": { + "hash": "fef1b37ab4cc9927", + "elements": 62 + }, + "AnnotationPoint/on-axis-with-tooltip": { + "hash": "8fcb56baebd03fe5", + "elements": 65 + }, + "AnnotationPoint/on-series-with-line-and-tooltip": { + "hash": "d06915e850e0e5a5", + "elements": 70 + }, + "AnnotationPoint/on-series-with-tooltip": { + "hash": "3bf80425b6223a92", + "elements": 65 + }, + "AnnotationPoint/playground": { + "hash": "758ba5c2d706ae7f", + "elements": 186 + }, + "AnnotationPoint/series-annotation": { + "hash": "881f4d912c0bbad0", + "elements": 53 + }, + "AnnotationPoint/us-cities": { + "hash": "484f54ceba5d9375", + "elements": 31 + }, + "AnnotationPoint/world-landmarks": { + "hash": "80d96b124b78500f", + "elements": 211 + }, + "AnnotationRange/bar-chart-(multiple)": { + "hash": "d988ebc2b53c1c84", + "elements": 85 + }, + "AnnotationRange/bar-chart-(single)": { + "hash": "f38ff9e29f8ac7c8", + "elements": 85 + }, + "AnnotationRange/bar-chart-(value)": { + "hash": "fe28babda4965ec8", + "elements": 85 + }, + "AnnotationRange/hide-tooltip": { + "hash": "89d531fedb50d77a", + "elements": 52 + }, + "AnnotationRange/horizontal-with-fill-multiple": { + "hash": "c12dd0584fbcb139", + "elements": 53 + }, + "AnnotationRange/horizontal-with-pattern-lower-bound": { + "hash": "26108578669ddd86", + "elements": 52 + }, + "AnnotationRange/horizontal-with-pattern-range": { + "hash": "9c6934b745894749", + "elements": 52 + }, + "AnnotationRange/horizontal-with-pattern-upper-bound": { + "hash": "d154caaeaa6a4774", + "elements": 52 + }, + "AnnotationRange/label-placement": { + "hash": "7d918eae41ee6ad1", + "elements": 54 + }, + "AnnotationRange/vertical-with-gradient-range": { + "hash": "0d46c99b4ee70317", + "elements": 51 + }, + "AnnotationRange/vertical-with-pattern-lower-bound": { + "hash": "a838da03d276d8b1", + "elements": 52 + }, + "AnnotationRange/vertical-with-pattern-range": { + "hash": "2b694623254f03e1", + "elements": 52 + }, + "AnnotationRange/vertical-with-pattern-upper-bound": { + "hash": "fde0847c3084e833", + "elements": 52 + }, + "Arc/clock": { + "hash": "9b7b83d75ddc894c", + "elements": 96 + }, + "Arc/color-wheel": { + "hash": "2ecf3d142c22ef88", + "elements": 78 + }, + "Arc/concentric": { + "hash": "2bdbe6f76ad457e8", + "elements": 12 + }, + "Arc/draggable-arc": { + "hash": "922f2fcb50b4e18a", + "elements": 10 + }, + "Arc/gauge": { + "hash": "46127827ff955385", + "elements": 29 + }, + "Arc/gauge-gradient": { + "hash": "42805438ce9d9095", + "elements": 179 + }, + "Arc/label-direction": { + "hash": "93b0776deb052205", + "elements": 151 + }, + "Arc/partial-arc": { + "hash": "0da0e025b72f00b1", + "elements": 10 + }, + "Arc/playground": { + "hash": "fc37a47a5f9ebe67", + "elements": 6 + }, + "Arc/segmented-arc": { + "hash": "f9dbb6dab6eb4b8b", + "elements": 68 + }, + "Arc/segmented-arc-clip-mask": { + "hash": "5ad1bf269aabc3dc", + "elements": 70 + }, + "Arc/speedometer": { + "hash": "e99051cefbb9c666", + "elements": 69 + }, + "Arc/tween-value-on-mount": { + "hash": "fc37a47a5f9ebe67", + "elements": 6 + }, + "ArcChart/basic": { + "hash": "fc10031ec7d1b14d", + "elements": 10 + }, + "ArcChart/color": { + "hash": "4c9062ca1d2f20b7", + "elements": 10 + }, + "ArcChart/gradient-with-text": { + "hash": "40fbebb9511f9bdb", + "elements": 12 + }, + "ArcChart/radius-fixed": { + "hash": "798319e0a763c08b", + "elements": 10 + }, + "ArcChart/radius-offset": { + "hash": "798319e0a763c08b", + "elements": 10 + }, + "ArcChart/radius-percent": { + "hash": "69e74f7d3c750358", + "elements": 10 + }, + "ArcChart/series": { + "hash": "b4a5764c92c1999d", + "elements": 16 + }, + "ArcChart/series-arc": { + "hash": "7dd2c9bbc596546b", + "elements": 16 + }, + "ArcChart/series-individual": { + "hash": "691b4053f7702a5e", + "elements": 14 + }, + "ArcChart/series-labels": { + "hash": "96dac94e24fff7f6", + "elements": 27 + }, + "ArcChart/series-motion-spring": { + "hash": "fc37a47a5f9ebe67", + "elements": 6 + }, + "ArcChart/series-motion-tween": { + "hash": "fc37a47a5f9ebe67", + "elements": 6 + }, + "ArcChart/series-start-180": { + "hash": "3b4684bf3645df3a", + "elements": 16 + }, + "ArcChart/series-start-90": { + "hash": "1aa9985caed2c469", + "elements": 16 + }, + "ArcChart/series-track-color": { + "hash": "f2579107b7e2271f", + "elements": 16 + }, + "ArcChart/track-size": { + "hash": "798319e0a763c08b", + "elements": 10 + }, + "Area/basic": { + "hash": "db65b0d78f417e76", + "elements": 79 + }, + "Area/clip-tween-on-mount": { + "hash": "f6f783891cfc1e33", + "elements": 77 + }, + "Area/clipped-area-on-tooltip": { + "hash": "b9c20660d7d07dd8", + "elements": 26 + }, + "Area/explicit-axis-ticks-min-max": { + "hash": "462d0c3a8b3eb281", + "elements": 40 + }, + "Area/gradient": { + "hash": "36f552cf2736afc2", + "elements": 79 + }, + "Area/gradient-separate-stroke": { + "hash": "bd1745db32986d56", + "elements": 79 + }, + "Area/highlight-color-based-on-value-using-color-scale": { + "hash": "c08330f8422fba88", + "elements": 91 + }, + "Area/highlight-color-based-on-value-using-tooltip-slot-prop": { + "hash": "c08330f8422fba88", + "elements": 91 + }, + "Area/multiple-series": { + "hash": "2437aa6a0ac04678", + "elements": 92 + }, + "Area/multiple-series-highlight-on-hover": { + "hash": "b703efca687db401", + "elements": 92 + }, + "Area/multiple-series-using-overrides": { + "hash": "5b717d4e6ade2cd5", + "elements": 83 + }, + "Area/multiple-series-with-labels": { + "hash": "f9af4b5e322314ed", + "elements": 263 + }, + "Area/oscilloscope-ridgeline": { + "hash": "3bd2ac429c7d8944", + "elements": 32 + }, + "Area/playground": { + "hash": "e26dad21edb43d28", + "elements": 60 + }, + "Area/ridgeline": { + "hash": "6b952c29f6afd072", + "elements": 65 + }, + "Area/ridgeline-kde": { + "hash": "355c41c1255dd8d6", + "elements": 108 + }, + "Area/stack": { + "hash": "5f7cee2a0bfcdc02", + "elements": 83 + }, + "Area/stack-with-gradient": { + "hash": "45306f165db4b244", + "elements": 83 + }, + "Area/threshold-with-lineargradient": { + "hash": "a1520170d95ebcf8", + "elements": 87 + }, + "Area/threshold-with-lineargradient-over-under": { + "hash": "c70dc38c329663f5", + "elements": 87 + }, + "Area/threshold-with-rectclippath": { + "hash": "962bb54200da5d59", + "elements": 91 + }, + "Area/threshold-with-rectclippath-over-under": { + "hash": "8335d257a59c6f6f", + "elements": 91 + }, + "Area/tween-on-mount": { + "hash": "f6f783891cfc1e33", + "elements": 77 + }, + "Area/with-labels": { + "hash": "b5b96558969e02f0", + "elements": 139 + }, + "Area/with-tooltip-and-highlight": { + "hash": "db65b0d78f417e76", + "elements": 79 + }, + "AreaChart/all-zero": { + "hash": "9db52cec47624750", + "elements": 83 + }, + "AreaChart/band-scale": { + "hash": "0c962c96993f80fe", + "elements": 59 + }, + "AreaChart/basic": { + "hash": "baef40c226ba375c", + "elements": 80 + }, + "AreaChart/brush": { + "hash": "fa3dc4f7908117cb", + "elements": 51 + }, + "AreaChart/brush-sync": { + "hash": "0544171ab05a8602", + "elements": 126 + }, + "AreaChart/curve": { + "hash": "3863f650a89deeb6", + "elements": 80 + }, + "AreaChart/custom": { + "hash": "2dd359fa624e2246", + "elements": 79 + }, + "AreaChart/custom-tooltip": { + "hash": "baef40c226ba375c", + "elements": 80 + }, + "AreaChart/default-series-label": { + "hash": "baef40c226ba375c", + "elements": 80 + }, + "AreaChart/funnel": { + "hash": "647fa1d8e7f8d4eb", + "elements": 24 + }, + "AreaChart/gradient": { + "hash": "a6fb5acfd7c08515", + "elements": 80 + }, + "AreaChart/labels": { + "hash": "cdabaff7be62f2af", + "elements": 140 + }, + "AreaChart/line-annotation": { + "hash": "6571f34fc1b1b17e", + "elements": 54 + }, + "AreaChart/markers": { + "hash": "baef40c226ba375c", + "elements": 80 + }, + "AreaChart/motion-tween": { + "hash": "fc37a47a5f9ebe67", + "elements": 6 + }, + "AreaChart/null-gaps": { + "hash": "09712848ad15e59e", + "elements": 103 + }, + "AreaChart/point-annotations": { + "hash": "8c14c5bd4b69bf91", + "elements": 66 + }, + "AreaChart/point-scale": { + "hash": "dfd46012a1e37968", + "elements": 55 + }, + "AreaChart/points": { + "hash": "6abf688271a508cf", + "elements": 110 + }, + "AreaChart/radial": { + "hash": "d3bebd74ee7c0c01", + "elements": 68 + }, + "AreaChart/range-annotation": { + "hash": "2e3eaaf13b9effc4", + "elements": 55 + }, + "AreaChart/series": { + "hash": "68ef6ec31ae4332e", + "elements": 84 + }, + "AreaChart/series-individual-tooltip": { + "hash": "a8854d43d98a8760", + "elements": 84 + }, + "AreaChart/series-point-annotations": { + "hash": "c27caf90f5b9192f", + "elements": 93 + }, + "AreaChart/series-point-click": { + "hash": "68ef6ec31ae4332e", + "elements": 84 + }, + "AreaChart/series-separate-data": { + "hash": "68ef6ec31ae4332e", + "elements": 84 + }, + "AreaChart/series-stack": { + "hash": "970fe1565653c8ca", + "elements": 84 + }, + "AreaChart/series-stack-diverging": { + "hash": "7ffba06d50eb125e", + "elements": 85 + }, + "AreaChart/series-stack-expand": { + "hash": "029622ef84141be4", + "elements": 84 + }, + "AreaChart/series-stack-gradient": { + "hash": "57d27fb7efba4a82", + "elements": 84 + }, + "AreaChart/series-stack-legend": { + "hash": "7e55274110fd766f", + "elements": 84 + }, + "AreaChart/series-stack-legend-labels": { + "hash": "7e55274110fd766f", + "elements": 84 + }, + "AreaChart/series-stack-legend-placement": { + "hash": "970fe1565653c8ca", + "elements": 84 + }, + "AreaChart/series-stack-separate-data": { + "hash": "970fe1565653c8ca", + "elements": 84 + }, + "AreaChart/series-tooltip-click": { + "hash": "baef40c226ba375c", + "elements": 80 + }, + "AreaChart/single-axis-x": { + "hash": "59eafdb89dfd98a7", + "elements": 62 + }, + "AreaChart/single-axis-y": { + "hash": "a10b5a857ac52e8f", + "elements": 35 + }, + "AreaChart/sparkline": { + "hash": "213845626cac7f56", + "elements": 10 + }, + "AreaChart/threshold": { + "hash": "b0a3a4298f6431b8", + "elements": 84 + }, + "AreaChart/threshold-gradient": { + "hash": "5f33bc791f96e500", + "elements": 84 + }, + "AreaChart/tooltip-external": { + "hash": "cd09c9f4a050076b", + "elements": 64 + }, + "AreaChart/tooltip-fixed-with-hide-delay": { + "hash": "68ef6ec31ae4332e", + "elements": 84 + }, + "AreaChart/tooltip-locking": { + "hash": "68ef6ec31ae4332e", + "elements": 84 + }, + "Axis/arrow-markers": { + "hash": "d0f7c89b0585e1ef", + "elements": 78 + }, + "Axis/axis-label-placement-left-right": { + "hash": "7f4585d5385cca93", + "elements": 132 + }, + "Axis/axis-label-placement-top-bottom": { + "hash": "ea0e0fd304103000", + "elements": 222 + }, + "Axis/barchart-tickspacing": { + "hash": "1a72a5263372fdd5", + "elements": 163 + }, + "Axis/barchart-xinterval-xinset": { + "hash": "ca819efecc6dd3a9", + "elements": 102 + }, + "Axis/explicit-ticks": { + "hash": "5b0b11a3c0ed5cc5", + "elements": 16 + }, + "Axis/extent-ticks-only": { + "hash": "af2e26812b0fea14", + "elements": 20 + }, + "Axis/grid": { + "hash": "fffcbe75cf6688cd", + "elements": 74 + }, + "Axis/grid-dashed": { + "hash": "7a090eafd33fae03", + "elements": 63 + }, + "Axis/hide-zero-filter": { + "hash": "b4b10e413c4219c9", + "elements": 37 + }, + "Axis/hide-zero-format": { + "hash": "1947d2ba9ee745b9", + "elements": 38 + }, + "Axis/inject-ticks": { + "hash": "3e032c20e6e50452", + "elements": 43 + }, + "Axis/integer-only-filter": { + "hash": "44bb638d671f2c7c", + "elements": 16 + }, + "Axis/integer-only-format": { + "hash": "c5e9eec9c6d8119a", + "elements": 16 + }, + "Axis/labels-next-hash": { + "hash": "1921db69622b906b", + "elements": 37 + }, + "Axis/linechart-tickspacing": { + "hash": "22285fce556e4c69", + "elements": 46 + }, + "Axis/log-scale": { + "hash": "19dbc686cae91b89", + "elements": 44 + }, + "Axis/multiline-tick-labels": { + "hash": "3dc6f8d120cf05a0", + "elements": 31 + }, + "Axis/multiple-axis-grid-and-rules": { + "hash": "73c4e485b8dbac34", + "elements": 76 + }, + "Axis/multiple-axis-grid-and-rules-separate-grid": { + "hash": "4b327678b4a21d89", + "elements": 76 + }, + "Axis/multiple-axis-grid-with-single-rule": { + "hash": "768a9cf9e927b40a", + "elements": 75 + }, + "Axis/multiple-axis-same-placement-bottom": { + "hash": "ed690224ab528d52", + "elements": 35 + }, + "Axis/multiple-axis-same-placement-right": { + "hash": "e1031db2b95b1bc1", + "elements": 63 + }, + "Axis/override-axis-ticks-scale": { + "hash": "3d68f66236d0c055", + "elements": 49 + }, + "Axis/placement-bottom-left": { + "hash": "3959b77d55263f43", + "elements": 57 + }, + "Axis/placement-bottom-left-rule": { + "hash": "fc3651070e74e94b", + "elements": 59 + }, + "Axis/placement-top-right": { + "hash": "bc632219b14004b1", + "elements": 57 + }, + "Axis/placement-top-right-rule": { + "hash": "22fd4e54c6f5b413", + "elements": 59 + }, + "Axis/radial-grid": { + "hash": "8d2219f755b0f774", + "elements": 54 + }, + "Axis/radial-rule": { + "hash": "d8ff12b58b15a30f", + "elements": 44 + }, + "Axis/remove-tick-marks": { + "hash": "75bc7d77377fe7d2", + "elements": 29 + }, + "Axis/rotate-labels": { + "hash": "cbb90aa2c9ed23b1", + "elements": 40 + }, + "Axis/tick-count": { + "hash": "14bf8a1d2c9deec0", + "elements": 70 + }, + "Axis/tick-label-styling": { + "hash": "a827eabc13f18283", + "elements": 40 + }, + "Axis/tick-spacing": { + "hash": "24f76faadf812ecf", + "elements": 22 + }, + "Axis/time-scale-auto": { + "hash": "a1a6ae600e984246", + "elements": 591 + }, + "Axis/time-scale-auto-format-filtering": { + "hash": "0210054fd38d1694", + "elements": 555 + }, + "Axis/time-scale-auto-multiline": { + "hash": "a2d9db84854cee0d", + "elements": 1176 + }, + "Axis/time-scale-brush": { + "hash": "3744760f2e3821da", + "elements": 97 + }, + "Axis/time-scale-brush-multiline": { + "hash": "9a3a9031634d027a", + "elements": 97 + }, + "Axis/time-scale-explicit": { + "hash": "220ad024ba662250", + "elements": 723 + }, + "Axis/time-scale-explicit-multiline": { + "hash": "5a2443cf8d1cb082", + "elements": 723 + }, + "BarChart/axis-labels-inside-bars": { + "hash": "b2b7ea66bd8bf92f", + "elements": 79 + }, + "BarChart/axis-labels-inside-bars-using-labels": { + "hash": "9fbdf39b04677027", + "elements": 79 + }, + "BarChart/both-axis-grid": { + "hash": "9043d98a8065bcd6", + "elements": 93 + }, + "BarChart/both-axis-grid-align-between": { + "hash": "84ac5d07c404bf60", + "elements": 94 + }, + "BarChart/brush": { + "hash": "826a95c7594d14f6", + "elements": 272 + }, + "BarChart/brush-band": { + "hash": "6893e27f67e72f09", + "elements": 283 + }, + "BarChart/brush-pan-zoom": { + "hash": "826a95c7594d14f6", + "elements": 272 + }, + "BarChart/brush-pan-zoom-band": { + "hash": "6893e27f67e72f09", + "elements": 283 + }, + "BarChart/color-bars-class": { + "hash": "327c131be9549b94", + "elements": 83 + }, + "BarChart/color-per-value": { + "hash": "7c0bf0265e78c7e7", + "elements": 61 + }, + "BarChart/color-threshold": { + "hash": "d89732643a5d69bc", + "elements": 87 + }, + "BarChart/color-using-scale": { + "hash": "51c705de2cfa4457", + "elements": 83 + }, + "BarChart/company-race": { + "hash": "29d9ea39d84173d9", + "elements": 160 + }, + "BarChart/custom-chart": { + "hash": "4f4c6dddce6e4642", + "elements": 82 + }, + "BarChart/custom-tooltip": { + "hash": "327c131be9549b94", + "elements": 83 + }, + "BarChart/duration": { + "hash": "4ce114af01fbe992", + "elements": 95 + }, + "BarChart/duration-bars": { + "hash": "59a2a048cdb6e088", + "elements": 100 + }, + "BarChart/duration-bars-color": { + "hash": "ce106ed2014b76fe", + "elements": 100 + }, + "BarChart/duration-bars-dense": { + "hash": "f1aa77aeeb3dcb1f", + "elements": 164 + }, + "BarChart/duration-bars-dense-lanes": { + "hash": "ba068fc6d07f47ea", + "elements": 164 + }, + "BarChart/duration-bars-lanes": { + "hash": "f79c5b204e78a6a9", + "elements": 68 + }, + "BarChart/duration-civilization-timeline": { + "hash": "877099364b73e6f3", + "elements": 295 + }, + "BarChart/duration-civilization-timeline-dense": { + "hash": "60a3cee8a6d365c2", + "elements": 162 + }, + "BarChart/duration-labels": { + "hash": "f703dce49ed0a6e3", + "elements": 131 + }, + "BarChart/duration-points": { + "hash": "c3357f43dfac00a4", + "elements": 120 + }, + "BarChart/duration-points-color": { + "hash": "ff5beef26469b0a3", + "elements": 120 + }, + "BarChart/dynamic-height": { + "hash": "a04b614c555a369a", + "elements": 65 + }, + "BarChart/gradient": { + "hash": "75fda16f29307ce3", + "elements": 83 + }, + "BarChart/group-series": { + "hash": "a1e76f3ef9be40ac", + "elements": 73 + }, + "BarChart/group-series-bar-click": { + "hash": "ff1457b0888bb269", + "elements": 69 + }, + "BarChart/group-series-horizontal": { + "hash": "d634a27ab9bc3f16", + "elements": 77 + }, + "BarChart/group-series-labels": { + "hash": "df39af61fc2263f0", + "elements": 105 + }, + "BarChart/group-series-series-long-data": { + "hash": "4d590ae69ff81507", + "elements": 85 + }, + "BarChart/highlight-below-marks": { + "hash": "327c131be9549b94", + "elements": 83 + }, + "BarChart/histogram-date-time-count": { + "hash": "502cea0f94ffe2fb", + "elements": 79 + }, + "BarChart/histogram-date-time-interval": { + "hash": "c32099990609074b", + "elements": 79 + }, + "BarChart/histogram-horizontal": { + "hash": "ddcb87599a905323", + "elements": 100 + }, + "BarChart/histogram-random-distribution": { + "hash": "1dd0d40f3b76adf1", + "elements": 77 + }, + "BarChart/histogram-vertical": { + "hash": "8ca233ce26c646f1", + "elements": 79 + }, + "BarChart/horizontal": { + "hash": "640149962973a631", + "elements": 103 + }, + "BarChart/labels": { + "hash": "c7bb34523ad006af", + "elements": 103 + }, + "BarChart/labels-inside-placement": { + "hash": "1a6c85067e12b907", + "elements": 103 + }, + "BarChart/labels-placement": { + "hash": "457aee4b61e79996", + "elements": 103 + }, + "BarChart/language-race": { + "hash": "e2820ea393ad2cf7", + "elements": 143 + }, + "BarChart/legend-custom-labels": { + "hash": "7eefe6565a39b174", + "elements": 61 + }, + "BarChart/legend-group-series": { + "hash": "7eefe6565a39b174", + "elements": 61 + }, + "BarChart/legend-placement": { + "hash": "7eefe6565a39b174", + "elements": 61 + }, + "BarChart/legend-stack-series": { + "hash": "7364c687ccb37c52", + "elements": 61 + }, + "BarChart/line-annotation": { + "hash": "1e10bfc8b048e96b", + "elements": 86 + }, + "BarChart/motion-tween": { + "hash": "fc37a47a5f9ebe67", + "elements": 6 + }, + "BarChart/oscilloscope-frequency": { + "hash": "10cb50d0293c7741", + "elements": 121 + }, + "BarChart/override-axis-ticks-with-custom-scale": { + "hash": "5b544ac5434f2424", + "elements": 275 + }, + "BarChart/pan-zoom": { + "hash": "826a95c7594d14f6", + "elements": 272 + }, + "BarChart/pan-zoom-band": { + "hash": "5dc647cd635f2367", + "elements": 208 + }, + "BarChart/pan-zoom-domain-extent": { + "hash": "826a95c7594d14f6", + "elements": 272 + }, + "BarChart/pan-zoom-scale-extent": { + "hash": "9c7e76bc807bd7f2", + "elements": 272 + }, + "BarChart/point-annotation": { + "hash": "f866cd6610734303", + "elements": 86 + }, + "BarChart/radial-horizontal": { + "hash": "27a8f4c6ebda204b", + "elements": 103 + }, + "BarChart/radial-horizontal-color-per-value": { + "hash": "f90054d4c0f78cce", + "elements": 78 + }, + "BarChart/radial-horizontal-duration": { + "hash": "0a8ab132757cd3d1", + "elements": 89 + }, + "BarChart/radial-horizontal-grid-between": { + "hash": "f2e375ae2a861851", + "elements": 79 + }, + "BarChart/radial-vertical": { + "hash": "598fcd2a9866a812", + "elements": 85 + }, + "BarChart/radial-vertical-arcpadding": { + "hash": "a2fcd4455e840690", + "elements": 87 + }, + "BarChart/radial-vertical-yrange": { + "hash": "abf02b9f80c41d61", + "elements": 87 + }, + "BarChart/radial-weather": { + "hash": "39ae73b35e52d7d2", + "elements": 768 + }, + "BarChart/range-annotation-multiple": { + "hash": "02b281f9042f96f3", + "elements": 85 + }, + "BarChart/range-annotation-single": { + "hash": "f9d876eee8e1498a", + "elements": 85 + }, + "BarChart/range-annotation-value": { + "hash": "b87801a9790c87fc", + "elements": 88 + }, + "BarChart/remove-rounding": { + "hash": "4c25ed7f74787454", + "elements": 83 + }, + "BarChart/scale-override": { + "hash": "57ecd382b729b37d", + "elements": 102 + }, + "BarChart/series": { + "hash": "12745c1884c1bb93", + "elements": 93 + }, + "BarChart/series-data": { + "hash": "bb49674207e2fd54", + "elements": 103 + }, + "BarChart/series-diverging": { + "hash": "eddad6c3d819072e", + "elements": 89 + }, + "BarChart/series-horizontal": { + "hash": "23bedd62406dd87a", + "elements": 113 + }, + "BarChart/series-horizontal-diverging": { + "hash": "d50dfefe34912b95", + "elements": 229 + }, + "BarChart/series-horizontal-diverging-as-percent": { + "hash": "e3dc82f30e90e83e", + "elements": 224 + }, + "BarChart/series-horizontal-diverging-label-gap": { + "hash": "6dac03e7e3bdbc6c", + "elements": 188 + }, + "BarChart/series-horizontal-diverging-split-scale": { + "hash": "85f9f979aa539604", + "elements": 170 + }, + "BarChart/series-horizontal-labels": { + "hash": "c9c629547e4e3870", + "elements": 69 + }, + "BarChart/series-stack-separate-data": { + "hash": "b5b6132b6c05818f", + "elements": 85 + }, + "BarChart/single-axis-x": { + "hash": "a7a68a878acb24d6", + "elements": 65 + }, + "BarChart/single-axis-y": { + "hash": "8e08428f7f62355b", + "elements": 53 + }, + "BarChart/single-dimension": { + "hash": "875e64b1ad823d0c", + "elements": 179 + }, + "BarChart/single-stack-with-indicator": { + "hash": "d154bb423a1e2379", + "elements": 48 + }, + "BarChart/sparkbar": { + "hash": "1396a0d0dbe40c6f", + "elements": 68 + }, + "BarChart/sparkbar-fixed-position-tooltip": { + "hash": "1396a0d0dbe40c6f", + "elements": 68 + }, + "BarChart/sparkbar-negative-data": { + "hash": "b3f5e8f5606dfa34", + "elements": 68 + }, + "BarChart/sparkbar-within-a-paragraph": { + "hash": "1396a0d0dbe40c6f", + "elements": 68 + }, + "BarChart/sparkbar-within-a-paragraph-with-tooltip-and-highlight": { + "hash": "1396a0d0dbe40c6f", + "elements": 68 + }, + "BarChart/stack-series": { + "hash": "409623fceaae34e1", + "elements": 73 + }, + "BarChart/stack-series-diverging": { + "hash": "7de6d3a5e5911fe9", + "elements": 62 + }, + "BarChart/stack-series-expand": { + "hash": "e807d586dea71330", + "elements": 65 + }, + "BarChart/stack-series-horizontal": { + "hash": "b9f42ba6de2b05d8", + "elements": 77 + }, + "BarChart/stack-series-padded": { + "hash": "e581eccd42833ed0", + "elements": 73 + }, + "BarChart/time-scale-interval": { + "hash": "83f8a72912960de8", + "elements": 90 + }, + "BarChart/time-scale-interval-horizontal": { + "hash": "a5b7e3da1716b8f1", + "elements": 88 + }, + "BarChart/time-scale-interval-with-inset": { + "hash": "8b919fd95d49a0ee", + "elements": 83 + }, + "BarChart/tooltip-click": { + "hash": "327c131be9549b94", + "elements": 83 + }, + "BarChart/vertical-default": { + "hash": "327c131be9549b94", + "elements": 83 + }, + "BarChart/vertical-fixed-width": { + "hash": "d40650447bb2f6c6", + "elements": 83 + }, + "BarChart/waterfall": { + "hash": "325711b5eac093ef", + "elements": 73 + }, + "Bars/horizontal-average-annotation-rule": { + "hash": "3e3e35abc788cce7", + "elements": 95 + }, + "Bars/horizontal-basic": { + "hash": "a3e4272acf3d32ce", + "elements": 92 + }, + "Bars/horizontal-calculated-value-domain-negative": { + "hash": "641fe01bd8ad69cc", + "elements": 92 + }, + "Bars/horizontal-calculated-value-domain-positive": { + "hash": "b06f3dcdffaeaf3e", + "elements": 92 + }, + "Bars/horizontal-candlestick-bars": { + "hash": "92f358c992409092", + "elements": 321 + }, + "Bars/horizontal-click-handler": { + "hash": "196c90fac49ee049", + "elements": 102 + }, + "Bars/horizontal-customize-individual-styles": { + "hash": "a3e4272acf3d32ce", + "elements": 92 + }, + "Bars/horizontal-gradient": { + "hash": "c44a4004b1de9edd", + "elements": 92 + }, + "Bars/horizontal-grouped": { + "hash": "402b3f2c3d7d0e67", + "elements": 88 + }, + "Bars/horizontal-grouped-and-stacked": { + "hash": "3600f088eda424b3", + "elements": 104 + }, + "Bars/horizontal-grouped-stacked-or-both-transition": { + "hash": "7f9c0896bba63a4c", + "elements": 72 + }, + "Bars/horizontal-highlight-individual-bar": { + "hash": "27c479079d946683", + "elements": 95 + }, + "Bars/horizontal-highlight-individual-bar-line": { + "hash": "b7b0deecf4f97f8d", + "elements": 93 + }, + "Bars/horizontal-inside-labels": { + "hash": "4f53f4781f72eafb", + "elements": 101 + }, + "Bars/horizontal-limit-ticks-count": { + "hash": "b1e2a76e186b434e", + "elements": 74 + }, + "Bars/horizontal-limit-ticks-second-scale": { + "hash": "891e29d6e80c7369", + "elements": 77 + }, + "Bars/horizontal-multiple-diverging": { + "hash": "c6326e077dec2734", + "elements": 112 + }, + "Bars/horizontal-multiple-overlapping": { + "hash": "4a572d073a95f533", + "elements": 112 + }, + "Bars/horizontal-outside-labels-default": { + "hash": "74cd2fab164acef4", + "elements": 109 + }, + "Bars/horizontal-rounded-right-only": { + "hash": "774ed98cadd0e514", + "elements": 92 + }, + "Bars/horizontal-stacked": { + "hash": "50dc48830be80a39", + "elements": 88 + }, + "Bars/horizontal-stacked-percent": { + "hash": "af084118ad9531e9", + "elements": 96 + }, + "Bars/horizontal-stagger-tween-on-mount": { + "hash": "d5e933903c312867", + "elements": 82 + }, + "Bars/horizontal-time-scale-with-inset": { + "hash": "4dada0c70096eb8c", + "elements": 77 + }, + "Bars/horizontal-time-scale-with-interval": { + "hash": "44e199bd52a89fb7", + "elements": 77 + }, + "Bars/horizontal-time-scale-with-missing-data": { + "hash": "2a9fcc60ad0e10e3", + "elements": 70 + }, + "Bars/horizontal-tooltip-and-bar-highlight": { + "hash": "196c90fac49ee049", + "elements": 102 + }, + "Bars/horizontal-tooltip-and-click-handlers-for-individual-stack-grouped-bar": { + "hash": "05d550dea4ffe040", + "elements": 56 + }, + "Bars/horizontal-tooltip-and-clipped-highlight": { + "hash": "196c90fac49ee049", + "elements": 102 + }, + "Bars/horizontal-tooltip-and-highlight": { + "hash": "196c90fac49ee049", + "elements": 102 + }, + "Bars/horizontal-tween-on-mount": { + "hash": "d5e933903c312867", + "elements": 82 + }, + "Bars/horizontal-with-grid-on-top": { + "hash": "ea336c0fad114e77", + "elements": 92 + }, + "Bars/horizontal-with-grid-on-top-mix-blend": { + "hash": "ea336c0fad114e77", + "elements": 92 + }, + "Bars/vertical-average-annotation-rule": { + "hash": "c36043a6e919cbd7", + "elements": 115 + }, + "Bars/vertical-basic": { + "hash": "b2a89d9bb075faac", + "elements": 112 + }, + "Bars/vertical-calculated-value-domain-negative": { + "hash": "51735235ae60bc4c", + "elements": 111 + }, + "Bars/vertical-calculated-value-domain-positive": { + "hash": "f39d34ad04960318", + "elements": 111 + }, + "Bars/vertical-click-handler": { + "hash": "a675905683397eff", + "elements": 132 + }, + "Bars/vertical-customize-individual-styles": { + "hash": "b2a89d9bb075faac", + "elements": 112 + }, + "Bars/vertical-fixed-width": { + "hash": "fa27b6f0069fdd63", + "elements": 112 + }, + "Bars/vertical-gradient": { + "hash": "dd6c02ea4efad4fe", + "elements": 112 + }, + "Bars/vertical-grouped": { + "hash": "91346a44a7dd0fab", + "elements": 72 + }, + "Bars/vertical-grouped-and-stacked": { + "hash": "05a86bc3cd0045c2", + "elements": 80 + }, + "Bars/vertical-grouped-stacked-or-both-transition": { + "hash": "7df32de5855f0083", + "elements": 56 + }, + "Bars/vertical-highlight-individual-bar": { + "hash": "23516000f490ff96", + "elements": 115 + }, + "Bars/vertical-highlight-individual-bar-line": { + "hash": "8402cccf345fa51f", + "elements": 113 + }, + "Bars/vertical-inside-labels": { + "hash": "173be0e6fbd25659", + "elements": 161 + }, + "Bars/vertical-limit-ticks-count": { + "hash": "976bac28007921e6", + "elements": 64 + }, + "Bars/vertical-limit-ticks-second-scale": { + "hash": "10a5eabfac6eee42", + "elements": 61 + }, + "Bars/vertical-multiple-diverging": { + "hash": "e10cff8690cf25bc", + "elements": 128 + }, + "Bars/vertical-multiple-diverging-rounded-specific": { + "hash": "5062243f50a8b6ab", + "elements": 178 + }, + "Bars/vertical-multiple-overlapping": { + "hash": "3a73e4b297c68391", + "elements": 128 + }, + "Bars/vertical-outside-labels-default": { + "hash": "0afd808aca6507d5", + "elements": 149 + }, + "Bars/vertical-rounded-top-only": { + "hash": "d3c3f1d155be4e66", + "elements": 112 + }, + "Bars/vertical-stacked": { + "hash": "ca21464e13ce8774", + "elements": 72 + }, + "Bars/vertical-stacked-percent": { + "hash": "7653a96e19213c87", + "elements": 76 + }, + "Bars/vertical-stagger-tween-on-mount": { + "hash": "a33462c26c984779", + "elements": 92 + }, + "Bars/vertical-stagger-tween-on-mount-rounded-edge": { + "hash": "a33462c26c984779", + "elements": 92 + }, + "Bars/vertical-time-scale-with-inset": { + "hash": "e2737313a8d3271a", + "elements": 82 + }, + "Bars/vertical-time-scale-with-interval": { + "hash": "231749c24d467aa1", + "elements": 82 + }, + "Bars/vertical-time-scale-with-interval-months": { + "hash": "231749c24d467aa1", + "elements": 82 + }, + "Bars/vertical-time-scale-with-missing-data": { + "hash": "7044068ae32aa5a1", + "elements": 77 + }, + "Bars/vertical-tooltip-and-bar-highlight": { + "hash": "a675905683397eff", + "elements": 132 + }, + "Bars/vertical-tooltip-and-click-handlers-for-individual-stack-grouped-bar": { + "hash": "8e5b14ef704638f3", + "elements": 40 + }, + "Bars/vertical-tooltip-and-clipped-highlight": { + "hash": "e11c941327952e63", + "elements": 132 + }, + "Bars/vertical-tooltip-and-highlight": { + "hash": "a675905683397eff", + "elements": 132 + }, + "Bars/vertical-tween-on-mount": { + "hash": "a33462c26c984779", + "elements": 92 + }, + "Bars/vertical-tween-on-mount-rounded-edge": { + "hash": "a33462c26c984779", + "elements": 92 + }, + "Bars/vertical-with-grid-on-top": { + "hash": "42089de91cf0fcfd", + "elements": 108 + }, + "Bars/vertical-with-grid-on-top-mix-blend": { + "hash": "42089de91cf0fcfd", + "elements": 108 + }, + "BoxPlot/basic": { + "hash": "bd560991c673e257", + "elements": 70 + }, + "BoxPlot/horizontal": { + "hash": "8da6f3a04d4ccdec", + "elements": 90 + }, + "BoxPlot/pre-computed": { + "hash": "f6c95b1c0d106427", + "elements": 60 + }, + "BoxPlot/styled": { + "hash": "9a653a2654d6a1db", + "elements": 70 + }, + "BoxPlot/with-tooltip": { + "hash": "c84fd0d344a08c04", + "elements": 74 + }, + "BoxPlot/with-violin": { + "hash": "f80d004181e9716f", + "elements": 96 + }, + "BrushContext/basic": { + "hash": "190d7c5465efd27e", + "elements": 8 + }, + "BrushContext/constant-labels": { + "hash": "7e2b4a11fce41631", + "elements": 8 + }, + "BrushContext/flame-chart": { + "hash": "5ebc011c8ccd8c8a", + "elements": 133 + }, + "BrushContext/handle-arrows": { + "hash": "190d7c5465efd27e", + "elements": 8 + }, + "BrushContext/handle-labels": { + "hash": "190d7c5465efd27e", + "elements": 8 + }, + "BrushContext/integrated-brush-(both-axis-area)": { + "hash": "16a1157575d37e44", + "elements": 50 + }, + "BrushContext/integrated-brush-(x-axis)": { + "hash": "1d04c8915a20260c", + "elements": 54 + }, + "BrushContext/integrated-brush-(y-axis)": { + "hash": "16a1157575d37e44", + "elements": 50 + }, + "BrushContext/max-window": { + "hash": "cbf0fd16c0a8cd76", + "elements": 59 + }, + "BrushContext/min-max-extent": { + "hash": "f64a3f00f91fa9df", + "elements": 53 + }, + "BrushContext/minimap": { + "hash": "d7c3f68c53635622", + "elements": 463 + }, + "BrushContext/programmatic-control": { + "hash": "cdf00cd3201847c7", + "elements": 53 + }, + "BrushContext/selection": { + "hash": "1fc033b722d9f26e", + "elements": 262 + }, + "BrushContext/separate-chart-(clip-data-y-axis)": { + "hash": "a915075902afd8c4", + "elements": 52 + }, + "BrushContext/separate-chart-(clip-data)": { + "hash": "9578330f6d2ed053", + "elements": 56 + }, + "BrushContext/separate-chart-(filter-data)": { + "hash": "b405f4d08c786112", + "elements": 55 + }, + "BrushContext/simple-styling": { + "hash": "190d7c5465efd27e", + "elements": 8 + }, + "BrushContext/snap-to-month": { + "hash": "f64a3f00f91fa9df", + "elements": 53 + }, + "BrushContext/striped-background": { + "hash": "190d7c5465efd27e", + "elements": 8 + }, + "BrushContext/synced-brushes": { + "hash": "34c54b93377b303f", + "elements": 118 + }, + "BrushContext/tooltip-interop": { + "hash": "1d04c8915a20260c", + "elements": 54 + }, + "Calendar/90-days": { + "hash": "1e5f6804eb94c732", + "elements": 105 + }, + "Calendar/basic": { + "hash": "69fcaf67597b628a", + "elements": 407 + }, + "Calendar/fixed-cell-size": { + "hash": "62cf2a530e45d809", + "elements": 407 + }, + "Calendar/html-with-padding": { + "hash": "fc37a47a5f9ebe67", + "elements": 6 + }, + "Calendar/last-month": { + "hash": "47176e983cde04f6", + "elements": 40 + }, + "Calendar/multiple-years": { + "hash": "5c72037ebb3a0d43", + "elements": 1215 + }, + "Calendar/responsive-cell-size-default": { + "hash": "69fcaf67597b628a", + "elements": 407 + }, + "Calendar/rounded-cells": { + "hash": "02ba85486bb13c96", + "elements": 395 + }, + "Cell/basic": { + "hash": "e7c7090c79b59773", + "elements": 63 + }, + "Cell/circle": { + "hash": "76ce2ef225342907", + "elements": 63 + }, + "Cell/color-scale": { + "hash": "3f97b71823747713", + "elements": 95 + }, + "Cell/punchcard": { + "hash": "3d2d7e95a28b5c4b", + "elements": 126 + }, + "Cell/rounded-insets": { + "hash": "dfcccba98fd0f9b5", + "elements": 71 + }, + "Chart/compound-common-scale-with-extra-marks": { + "hash": "b458cb753231d553", + "elements": 185 + }, + "Chart/compound-dual-axis-with-single-chart-using-remapped-scale": { + "hash": "56abdcf5554c571f", + "elements": 78 + }, + "Chart/compound-dual-axis-with-stacked-charts": { + "hash": "bcb08a891e69761d", + "elements": 78 + }, + "Chart/compound-separate-scales-with-stacked-charts-and-overridden-marks": { + "hash": "97cf67c923d40579", + "elements": 453 + }, + "Chart/compound-separate-scales-with-stacked-charts-with-inverted-range-top-down": { + "hash": "b0f1c63f610282c9", + "elements": 1027 + }, + "Chart/data-chart-multi": { + "hash": "b48fe8783c1733c8", + "elements": 48 + }, + "Chart/data-chart-single": { + "hash": "66a338fcf19933e4", + "elements": 47 + }, + "Chart/data-mark-data": { + "hash": "56b776c1a8bab9ce", + "elements": 60 + }, + "Chart/data-primitive-data": { + "hash": "84bb3b600f12ac69", + "elements": 70 + }, + "Chart/data-series-chart-data": { + "hash": "b48fe8783c1733c8", + "elements": 48 + }, + "Chart/data-series-separate-data": { + "hash": "b48fe8783c1733c8", + "elements": 48 + }, + "Chart/facet-brush": { + "hash": "7a1b730d31657dd6", + "elements": 411 + }, + "Chart/facet-brush-band": { + "hash": "0b5831d230a7a06c", + "elements": 171 + }, + "Chart/facet-brush-overview": { + "hash": "551973f248015629", + "elements": 83 + }, + "Chart/facet-brush-summary": { + "hash": "9c55d31d3b55851f", + "elements": 477 + }, + "Chart/facet-brush-zoom": { + "hash": "6b07ee1ad5c967d6", + "elements": 411 + }, + "Chord/basic": { + "hash": "ee40e9acf24bd0f6", + "elements": 36 + }, + "Chord/directed": { + "hash": "1fb9ec97531b3c4b", + "elements": 46 + }, + "Chord/gradient": { + "hash": "fd9565c1e3ca73a7", + "elements": 36 + }, + "Chord/hover": { + "hash": "ba9ef2380dd93d2c", + "elements": 36 + }, + "Chord/ticks": { + "hash": "4be7c9651600c7a6", + "elements": 264 + }, + "Circle/color-via-ordinal-scale": { + "hash": "955cdc4bd0e5d8b2", + "elements": 58 + }, + "Circle/color-via-threshold-scale": { + "hash": "a322b7a093ff8380", + "elements": 57 + }, + "Circle/data-mode": { + "hash": "a2bc8fe8f2c880d0", + "elements": 58 + }, + "Circle/styling-using-attributes": { + "hash": "ac432ebb15bb1dc4", + "elements": 63 + }, + "Circle/styling-using-classes": { + "hash": "fd2f332d21134002", + "elements": 63 + }, + "Circle/styling-using-css-variables": { + "hash": "4e3763337578e98c", + "elements": 63 + }, + "CircleLegend/basic": { + "hash": "c4014e0b159de9ca", + "elements": 19 + }, + "CircleLegend/label-placement": { + "hash": "db0745eebf751c9e", + "elements": 41 + }, + "CircleLegend/scale-types": { + "hash": "f7ddbf0a0b6bb341", + "elements": 58 + }, + "ClipPath/basic": { + "hash": "5d87baf04b8f1690", + "elements": 10 + }, + "ClipPath/clip-snippet": { + "hash": "3763d1ea4fca3f64", + "elements": 12 + }, + "ClipPath/inverted": { + "hash": "4344157e132f8f88", + "elements": 10 + }, + "ClipPath/use-id": { + "hash": "549592ae3fafdc66", + "elements": 11 + }, + "ColorRamp/basic": { + "hash": "48957735ebee49fb", + "elements": 47 + }, + "ColorRamp/pixelated": { + "hash": "512db5867cbbaaf6", + "elements": 50 + }, + "ColorRamp/schemes": { + "hash": "970cb74499262146", + "elements": 224 + }, + "Contour/sampled": { + "hash": "5b80195a1ec25c7b", + "elements": 86 + }, + "Contour/sampled-interactive": { + "hash": "5b80195a1ec25c7b", + "elements": 86 + }, + "Contour/volcano-filled": { + "hash": "90ea71aeea4ac121", + "elements": 77 + }, + "Contour/volcano-filled-interactive": { + "hash": "90ea71aeea4ac121", + "elements": 77 + }, + "Contour/volcano-lines": { + "hash": "df2243825e1f57a7", + "elements": 77 + }, + "Dagre/basic": { + "hash": "cb4e63dfc118b12f", + "elements": 78 + }, + "Dagre/playground": { + "hash": "cb4e63dfc118b12f", + "elements": 78 + }, + "Dagre/software-user-flow": { + "hash": "41596e9d12a44862", + "elements": 70 + }, + "Dagre/tcp-state-diagram": { + "hash": "1fab39181c5de47c", + "elements": 121 + }, + "Density/bandwidth": { + "hash": "17a7838c5feced44", + "elements": 188 + }, + "Density/basic": { + "hash": "d648379e86c7a098", + "elements": 179 + }, + "Density/stroke-only": { + "hash": "34a1e7d495fd62bc", + "elements": 179 + }, + "Density/thresholds": { + "hash": "d648379e86c7a098", + "elements": 179 + }, + "Density/walmart": { + "hash": "637108979f634cee", + "elements": 3284 + }, + "Density/weighted": { + "hash": "fb630bf75b0db543", + "elements": 403 + }, + "Dodge/anchor": { + "hash": "ef86485215c8fc7b", + "elements": 735 + }, + "Dodge/bank-failures": { + "hash": "674c51be8798876a", + "elements": 4056 + }, + "Dodge/beeswarm": { + "hash": "3671a5fb041ec865", + "elements": 141 + }, + "Dodge/duration-bars-dense-lanes": { + "hash": "b5549b86c421eb01", + "elements": 114 + }, + "Dodge/grouped-horizontal": { + "hash": "0b00f19d9a1b866b", + "elements": 386 + }, + "Dodge/grouped-vertical": { + "hash": "006bcc107f7bd926", + "elements": 381 + }, + "Dodge/image-beeswarm": { + "hash": "1336f5318b1c373d", + "elements": 140 + }, + "Dodge/penguins": { + "hash": "72f90c307ae452f4", + "elements": 388 + }, + "Dodge/tech-layoffs": { + "hash": "bd7faef23a0409ed", + "elements": 2923 + }, + "Dodge/text-beeswarm": { + "hash": "d6d37f317c37e438", + "elements": 544 + }, + "Dodge/timeline": { + "hash": "3a4f17f5839662f4", + "elements": 212 + }, + "Dodge/timeline-bidirectional": { + "hash": "5152052af610ca72", + "elements": 173 + }, + "Dodge/variable-radius": { + "hash": "cabb4d11d17fe990", + "elements": 302 + }, + "Ellipse/color-via-ordinal-scale": { + "hash": "4506043f3af1635b", + "elements": 58 + }, + "Ellipse/color-via-threshold-scale": { + "hash": "9f0c2b2a98d6bd91", + "elements": 57 + }, + "Ellipse/data-mode": { + "hash": "2a7d874d3fe2f0ad", + "elements": 58 + }, + "Ellipse/styling-using-attributes": { + "hash": "923321be04871b0d", + "elements": 63 + }, + "Ellipse/styling-using-classes": { + "hash": "83c6716fc61e0306", + "elements": 63 + }, + "Ellipse/styling-using-css-variables": { + "hash": "1ba4d4958d751aea", + "elements": 63 + }, + "ForceSimulation/beeswarm": { + "hash": "154ddf2b897d9512", + "elements": 151 + }, + "ForceSimulation/collision-detection": { + "hash": "57f1107348962634", + "elements": 205, + "settled": false, + "unstable": true + }, + "ForceSimulation/disjoint-graph": { + "hash": "0101bacb72fd1d28", + "elements": 617, + "settled": false, + "unstable": true + }, + "ForceSimulation/games-industry-layoffs": { + "hash": "22aeb53108be81ad", + "elements": 500, + "settled": false, + "unstable": true + }, + "ForceSimulation/graph-drag": { + "hash": "db67ca404c239a3f", + "elements": 37 + }, + "ForceSimulation/graph-playground": { + "hash": "946a4707aba5f84b", + "elements": 344, + "settled": false, + "unstable": true + }, + "ForceSimulation/group": { + "hash": "03b00fb7548748a0", + "elements": 39 + }, + "ForceSimulation/lattice": { + "hash": "888b6d95553c4158", + "elements": 1166, + "settled": false + }, + "ForceSimulation/layoffs-by-industry": { + "hash": "835e7c46eea41471", + "elements": 1733, + "settled": false + }, + "ForceSimulation/text": { + "hash": "59d26049685f0f89", + "elements": 291, + "settled": false, + "unstable": true + }, + "ForceSimulation/tree": { + "hash": "01ed460e9eae8cfa", + "elements": 509, + "settled": false, + "unstable": true + }, + "Frame/basic": { + "hash": "2b06813faef653c0", + "elements": 60 + }, + "Frame/border": { + "hash": "2b06813faef653c0", + "elements": 60 + }, + "Frame/full": { + "hash": "3aa64ed6fc01c220", + "elements": 60 + }, + "Frame/gradient": { + "hash": "73a726c551fc26a8", + "elements": 58 + }, + "GeoCircle/earthquake-globe": { + "hash": "a5cf162a75140d8b", + "elements": 71 + }, + "GeoCircle/playground": { + "hash": "c173658e91d8f7d0", + "elements": 186 + }, + "GeoClipPath/basic": { + "hash": "5f164f9aa2a23ac4", + "elements": 60 + }, + "GeoLegend/basic": { + "hash": "900e05ba082f1336", + "elements": 24 + }, + "GeoLegend/canvas-mode": { + "hash": "e0cd40363493feda", + "elements": 23 + }, + "GeoLegend/stacked-units": { + "hash": "81510fc9576c4c73", + "elements": 19 + }, + "GeoLegend/tick-format": { + "hash": "2c84505d65912778", + "elements": 13 + }, + "GeoLegend/ticks": { + "hash": "10b6977a6d74063c", + "elements": 10 + }, + "GeoLegend/variants": { + "hash": "8fc6bb9635e4080c", + "elements": 22 + }, + "GeoPath/animated-globe": { + "hash": "635eac3db0ec7fa9", + "elements": 166 + }, + "GeoPath/bubble-map": { + "hash": "ade3238d50facb47", + "elements": 6336 + }, + "GeoPath/choropleth": { + "hash": "f10e2926e3e07217", + "elements": 3178 + }, + "GeoPath/eclipses-globe": { + "hash": "afade2a87ff4a0cc", + "elements": 79 + }, + "GeoPath/interpolating-projections": { + "hash": "424a9728eb12bb2d", + "elements": 9, + "settled": false, + "unstable": true + }, + "GeoPath/paint-brush-selection": { + "hash": "fd317b53fb83d686", + "elements": 3169 + }, + "GeoPath/sketchy-globe": { + "hash": "5448c1c0088e3829", + "elements": 9 + }, + "GeoPath/spike-map": { + "hash": "e795f3e34daada43", + "elements": 6301 + }, + "GeoPath/submarine-cables-globe": { + "hash": "d5e19fad65821195", + "elements": 1165 + }, + "GeoPath/timezones": { + "hash": "ed88ab1b548eca0f", + "elements": 361 + }, + "GeoPath/tooltip": { + "hash": "868a9a46eb0a39ca", + "elements": 58 + }, + "GeoPath/transform-canvas": { + "hash": "f3aedf213a23145c", + "elements": 66 + }, + "GeoPath/transform-canvas-scale-extent": { + "hash": "fe70b30e7921b82a", + "elements": 67 + }, + "GeoPath/transform-globe-constrain": { + "hash": "d78718141e73895b", + "elements": 164 + }, + "GeoPath/transform-globe-inertia": { + "hash": "d78718141e73895b", + "elements": 164 + }, + "GeoPath/transform-projection": { + "hash": "c6b7bfc70cb8bc76", + "elements": 66 + }, + "GeoPath/transform-world-canvas": { + "hash": "0253ef7307a69c62", + "elements": 195 + }, + "GeoPath/transform-world-projection": { + "hash": "044af9ff129c1961", + "elements": 195 + }, + "GeoPath/translucent-globe": { + "hash": "c4c2193bf0d102c2", + "elements": 198 + }, + "GeoPath/us-country-map": { + "hash": "4a2611b6b83a6efe", + "elements": 57 + }, + "GeoPath/us-state": { + "hash": "9bb85fe2484768e1", + "elements": 7 + }, + "GeoPath/us-state-with-counties": { + "hash": "6186d8705f139ed0", + "elements": 62 + }, + "GeoPath/us-state-with-surrounding-states": { + "hash": "c1b027b5fc64cbbe", + "elements": 3201 + }, + "GeoPoint/icons": { + "hash": "fc938b49b78d46a0", + "elements": 307 + }, + "GeoPoint/us-airports": { + "hash": "8dc75d0307f94eb7", + "elements": 3433 + }, + "GeoPoint/us-state-capitals": { + "hash": "b0cce3b394886764", + "elements": 207 + }, + "GeoPoint/world-airports": { + "hash": "afa71fe3ed593d83", + "elements": 3163 + }, + "GeoPoint/world-capitals": { + "hash": "2c4bc15cc32f7f81", + "elements": 348 + }, + "GeoProjection/geojson-preview": { + "hash": "fc37a47a5f9ebe67", + "elements": 6 + }, + "GeoProjection/projection-playground": { + "hash": "18b0ace660e233f1", + "elements": 164 + }, + "GeoProjection/satellite": { + "hash": "50ded725e8cf70fc", + "elements": 9 + }, + "GeoProjection/shapefile-preview": { + "hash": "15c7e459f1abdfd2", + "elements": 7 + }, + "GeoProjection/topojson-preview": { + "hash": "fc37a47a5f9ebe67", + "elements": 6 + }, + "GeoProjection/true-size": { + "hash": "f806b913e61e3a6e", + "elements": 184 + }, + "GeoProjection/true-size-globe": { + "hash": "91ee905e9bdb3ac3", + "elements": 671 + }, + "GeoRaster/globe": { + "hash": "62389cdd3d4d76f3", + "elements": 166 + }, + "GeoRaster/planets": { + "hash": "1a75c527f8a4fb03", + "elements": 10 + }, + "GeoRaster/projections": { + "hash": "0b7907912facc9bf", + "elements": 187 + }, + "GeoRaster/textures": { + "hash": "7439cddb6117196b", + "elements": 10 + }, + "GeoRaster/tiles-globe": { + "hash": "3842daf168db0627", + "elements": 166 + }, + "GeoSpline/draggable-globe": { + "hash": "6922f066972b458b", + "elements": 1124 + }, + "GeoSpline/world-map": { + "hash": "b073aa1d5698ef4f", + "elements": 249 + }, + "GeoTile/basic": { + "hash": "fb4eb3b7d180b356", + "elements": 79 + }, + "GeoTile/clipped": { + "hash": "1ceae7a19f7d90ba", + "elements": 80 + }, + "GeoTile/zoomable": { + "hash": "6a75a1d92e6981d0", + "elements": 89 + }, + "GeoTile/zoomable-seamless-layers": { + "hash": "0a54d824bc112276", + "elements": 101 + }, + "GeoTile/zoomable-with-padding": { + "hash": "684df0a5c334331f", + "elements": 97 + }, + "Graticule/basic": { + "hash": "96379a52c65b2f72", + "elements": 8 + }, + "Grid/band-scale-between": { + "hash": "daf5967caa5252f6", + "elements": 28 + }, + "Grid/band-scale-default": { + "hash": "ea2fc13be0c8f1ad", + "elements": 27 + }, + "Grid/basic": { + "hash": "1c048ab1e93d2ed2", + "elements": 23 + }, + "Grid/dashed-lines": { + "hash": "c8a4c78ae6d03378", + "elements": 12 + }, + "Grid/explicit-ticks": { + "hash": "09a60f3870a16b3a", + "elements": 21 + }, + "Grid/inject-tick-value": { + "hash": "c522e1eac2f41edb", + "elements": 55 + }, + "Grid/integer-only": { + "hash": "5a612e244548adee", + "elements": 19 + }, + "Grid/padding": { + "hash": "8056d3ddd85c82f6", + "elements": 23 + }, + "Grid/radial": { + "hash": "a5224d6b04dd586f", + "elements": 21 + }, + "Grid/radial-linear": { + "hash": "d1459b88f1a7a6a4", + "elements": 22 + }, + "Grid/tick-count": { + "hash": "842ee329ef5d01ad", + "elements": 61 + }, + "Grid/tick-count-null": { + "hash": "84fc67321f4a0268", + "elements": 31 + }, + "Grid/x-only": { + "hash": "8a09871636357f37", + "elements": 17 + }, + "Grid/y-only": { + "hash": "c8a4c78ae6d03378", + "elements": 12 + }, + "Group/basic": { + "hash": "edce7f008934cfc6", + "elements": 63 + }, + "Group/data-mode": { + "hash": "18091f927606da3c", + "elements": 71 + }, + "Hull/geo": { + "hash": "a8397b388d3f44e2", + "elements": 158 + }, + "Hull/scatter": { + "hash": "1eedc2f597090ef7", + "elements": 94 + }, + "Image/college-football-map": { + "hash": "d77b3865e1ae1b75", + "elements": 469 + }, + "Image/country-flags": { + "hash": "b12360bccd3b008a", + "elements": 77 + }, + "Image/pixel-mode": { + "hash": "35fa9058085d8605", + "elements": 8 + }, + "Image/planets": { + "hash": "4e197e563f158b6a", + "elements": 52 + }, + "Image/sports-logos": { + "hash": "091830f1cc5922e7", + "elements": 70 + }, + "Image/us-presidents": { + "hash": "e366bd773d96f6ec", + "elements": 159 + }, + "Labels/voronoi": { + "hash": "5dd8afd0b27ae9c5", + "elements": 408 + }, + "Labels/voronoi-geo": { + "hash": "15a53863ba4686c5", + "elements": 649 + }, + "Layer/all-3-layers": { + "hash": "181e826378ed0dcf", + "elements": 10 + }, + "Legend/chart-integration": { + "hash": "de999f1e0716acfc", + "elements": 9 + }, + "Legend/chart-placement": { + "hash": "fc37a47a5f9ebe67", + "elements": 6 + }, + "Legend/children-override": { + "hash": "fc37a47a5f9ebe67", + "elements": 6 + }, + "Legend/click-handler": { + "hash": "fc37a47a5f9ebe67", + "elements": 6 + }, + "Legend/diverging": { + "hash": "3c3e941a35f81263", + "elements": 17 + }, + "Legend/diverging-sqrt": { + "hash": "f5411676104e6b7d", + "elements": 17 + }, + "Legend/ordinal": { + "hash": "269ba6e432670ecb", + "elements": 15 + }, + "Legend/quantile": { + "hash": "de8e625f5e373631", + "elements": 25 + }, + "Legend/quantize": { + "hash": "e179a702b42c788b", + "elements": 25 + }, + "Legend/responsive-swatches": { + "hash": "fc37a47a5f9ebe67", + "elements": 6 + }, + "Legend/sequential": { + "hash": "4f797b9ac3296666", + "elements": 19 + }, + "Legend/sequential-log": { + "hash": "fba657275159b338", + "elements": 45 + }, + "Legend/sequential-quantile": { + "hash": "91b81ce614eea545", + "elements": 7 + }, + "Legend/sequential-sqrt": { + "hash": "cb3524c207de3e08", + "elements": 19 + }, + "Legend/sqrt": { + "hash": "3b08e7e7d1761722", + "elements": 17 + }, + "Legend/square-swatch": { + "hash": "fc37a47a5f9ebe67", + "elements": 6 + }, + "Legend/styling": { + "hash": "d45ca31ea8b22477", + "elements": 29 + }, + "Legend/threshold": { + "hash": "d53e059953c43e46", + "elements": 25 + }, + "Legend/vertical-orientation": { + "hash": "fc37a47a5f9ebe67", + "elements": 6 + }, + "Line/color-via-ordinal-scale": { + "hash": "c26f2ad2840c8873", + "elements": 69 + }, + "Line/color-via-threshold-scale": { + "hash": "29652ef10601524a", + "elements": 65 + }, + "Line/data-mode": { + "hash": "58c2313ee1c3e83d", + "elements": 69 + }, + "Line/styling-using-attributes": { + "hash": "f99aa5a1761b4aed", + "elements": 64 + }, + "Line/styling-using-classes": { + "hash": "86002c87fd92b175", + "elements": 64 + }, + "Line/styling-using-css-variables": { + "hash": "de9a32eeb38d4ff1", + "elements": 64 + }, + "LinearGradient/direction-with-custom-colors": { + "hash": "c7a7efe26ad7ac70", + "elements": 9 + }, + "LinearGradient/explicit-offsets": { + "hash": "c7a7efe26ad7ac70", + "elements": 9 + }, + "LinearGradient/tailwind-colors": { + "hash": "7366f59e937606f7", + "elements": 15 + }, + "LinearGradient/units": { + "hash": "cf88e3052e8eb9df", + "elements": 18 + }, + "LineChart/axis-labels-inside": { + "hash": "2818d002634b8a57", + "elements": 80 + }, + "LineChart/basic": { + "hash": "96f79bae4abdabc3", + "elements": 79 + }, + "LineChart/brush": { + "hash": "aca889f20cce4da3", + "elements": 50 + }, + "LineChart/brush-pan-zoom": { + "hash": "aca889f20cce4da3", + "elements": 50 + }, + "LineChart/bump-state-population-ranks": { + "hash": "7d7a9d3c66e07ecd", + "elements": 1499 + }, + "LineChart/curve": { + "hash": "cff1c3d63648bbb5", + "elements": 79 + }, + "LineChart/custom": { + "hash": "a93121bb205944bb", + "elements": 78 + }, + "LineChart/custom-tooltip": { + "hash": "96f79bae4abdabc3", + "elements": 79 + }, + "LineChart/default-series-label": { + "hash": "96f79bae4abdabc3", + "elements": 79 + }, + "LineChart/draw": { + "hash": "fc37a47a5f9ebe67", + "elements": 6 + }, + "LineChart/dynamic-data": { + "hash": "d92a524315a535c5", + "elements": 63 + }, + "LineChart/gradient-encoding": { + "hash": "b9681b16a9f24750", + "elements": 76 + }, + "LineChart/gradient-threshold": { + "hash": "2f13d6643f83676e", + "elements": 65 + }, + "LineChart/labels": { + "hash": "66295d557631da9d", + "elements": 139 + }, + "LineChart/labels-with-points": { + "hash": "a9966a93fa1dcf42", + "elements": 175 + }, + "LineChart/labels-within-points": { + "hash": "c9442aee51f382a0", + "elements": 175 + }, + "LineChart/large-radial-series": { + "hash": "878671844d0ca676", + "elements": 148 + }, + "LineChart/large-series": { + "hash": "79acd6d2472bd2fa", + "elements": 153 + }, + "LineChart/legend": { + "hash": "b9d995967e6d43e5", + "elements": 81 + }, + "LineChart/line-annotation": { + "hash": "82db833b29162cde", + "elements": 53 + }, + "LineChart/motion-tween": { + "hash": "fc37a47a5f9ebe67", + "elements": 6 + }, + "LineChart/null-dashed-gaps": { + "hash": "e8b01315aa0b5624", + "elements": 79 + }, + "LineChart/null-gaps": { + "hash": "5396e83495de5597", + "elements": 102 + }, + "LineChart/oscilloscope-time": { + "hash": "3b24564833f65c4c", + "elements": 27 + }, + "LineChart/override-color": { + "hash": "a1c14663aa73b779", + "elements": 79 + }, + "LineChart/pan-zoom": { + "hash": "aca889f20cce4da3", + "elements": 50 + }, + "LineChart/pan-zoom-custom-constrain": { + "hash": "80d73564b0340202", + "elements": 76 + }, + "LineChart/pan-zoom-domain-extent": { + "hash": "1db14bdc6ce8bf0f", + "elements": 70 + }, + "LineChart/pan-zoom-dynamic-data": { + "hash": "dfb8b6abb31903ab", + "elements": 45 + }, + "LineChart/pan-zoom-with-overview": { + "hash": "d30eb188653a75cf", + "elements": 52 + }, + "LineChart/perf-dimension-arrays": { + "hash": "9812520156cc0b56", + "elements": 66 + }, + "LineChart/perf-dimension-arrays-processed": { + "hash": "9812520156cc0b56", + "elements": 66 + }, + "LineChart/perf-series-arrays": { + "hash": "9812520156cc0b56", + "elements": 66 + }, + "LineChart/perf-streaming": { + "hash": "fc37a47a5f9ebe67", + "elements": 6 + }, + "LineChart/perf-wide-data": { + "hash": "1141859accf2a113", + "elements": 78 + }, + "LineChart/perf-wide-data-processed": { + "hash": "16a30f87e6fba3a3", + "elements": 63 + }, + "LineChart/persist-brush-zoom": { + "hash": "d30eb188653a75cf", + "elements": 52 + }, + "LineChart/persist-series": { + "hash": "b9d995967e6d43e5", + "elements": 81 + }, + "LineChart/point-annotations": { + "hash": "da6215a148f56295", + "elements": 65 + }, + "LineChart/points": { + "hash": "a7adf2bc30a232bc", + "elements": 115 + }, + "LineChart/radar": { + "hash": "981e73137ee0b5b6", + "elements": 42 + }, + "LineChart/radar-rounded": { + "hash": "1ee2369f96c06639", + "elements": 46 + }, + "LineChart/radar-series": { + "hash": "137eb1881b3f89bb", + "elements": 58 + }, + "LineChart/range-annotation": { + "hash": "e9535d8992d58216", + "elements": 54 + }, + "LineChart/series": { + "hash": "de426b26334e9ee1", + "elements": 81 + }, + "LineChart/series-brush": { + "hash": "de426b26334e9ee1", + "elements": 81 + }, + "LineChart/series-custom-highlight-point": { + "hash": "de426b26334e9ee1", + "elements": 81 + }, + "LineChart/series-individual-tooltip": { + "hash": "b9d995967e6d43e5", + "elements": 81 + }, + "LineChart/series-labels-hover": { + "hash": "6d1bda627509e3c1", + "elements": 81 + }, + "LineChart/series-point-annotations": { + "hash": "cb7fa1099a70f5a7", + "elements": 90 + }, + "LineChart/series-point-click": { + "hash": "de426b26334e9ee1", + "elements": 81 + }, + "LineChart/series-programmatic-control": { + "hash": "d22f4e847da43d61", + "elements": 80 + }, + "LineChart/series-separate-data": { + "hash": "727dc32dc05b3ddc", + "elements": 81 + }, + "LineChart/series-separate-data-diff-length": { + "hash": "3c83533c8a3ffae6", + "elements": 81 + }, + "LineChart/series-vertical": { + "hash": "87747c3a7ce942a0", + "elements": 86 + }, + "LineChart/series-with-nulls": { + "hash": "58685ffbfc9adede", + "elements": 84 + }, + "LineChart/single-axis-x": { + "hash": "1c7e6c252579ce85", + "elements": 61 + }, + "LineChart/single-axis-y": { + "hash": "a22c63b4462702ca", + "elements": 34 + }, + "LineChart/smart-labels-with-points": { + "hash": "e9a16b27949880d8", + "elements": 175 + }, + "LineChart/sparkline": { + "hash": "57a481bb332f9744", + "elements": 9 + }, + "LineChart/sparkline-fixed-position-tooltip": { + "hash": "1abc7c0ee3dc36f0", + "elements": 9 + }, + "LineChart/sparkline-within-a-paragraph": { + "hash": "57a481bb332f9744", + "elements": 9 + }, + "LineChart/sparkline-within-a-paragraph-with-tooltip-and-highlight": { + "hash": "57a481bb332f9744", + "elements": 9 + }, + "LineChart/sparkline-zero-axis": { + "hash": "e254705972e9a2fc", + "elements": 9 + }, + "LineChart/svelte-milestones": { + "hash": "d7191093d8884310", + "elements": 230 + }, + "LineChart/threshold": { + "hash": "1c3f2835d8e088ac", + "elements": 113 + }, + "LineChart/tooltip-click": { + "hash": "96f79bae4abdabc3", + "elements": 79 + }, + "LineChart/vertical": { + "hash": "a76cf13e42cdb9aa", + "elements": 84 + }, + "Link/bended-arrows": { + "hash": "4335933748ab10cc", + "elements": 531 + }, + "Link/curves": { + "hash": "0a940172d6b75b44", + "elements": 66 + }, + "Link/playground": { + "hash": "3d7f5a55db2154ed", + "elements": 9 + }, + "Link/types": { + "hash": "f26e74d5f41d3e5c", + "elements": 42 + }, + "Marker/line": { + "hash": "dbcf10bdb995b7b4", + "elements": 30 + }, + "Marker/orientation": { + "hash": "fc37a47a5f9ebe67", + "elements": 6 + }, + "Marker/spline": { + "hash": "487cbb6533ac37dd", + "elements": 30 + }, + "Marker/spline-w-thicker-stroke": { + "hash": "76cdf13116e0bde1", + "elements": 24 + }, + "Marker/styling": { + "hash": "31ccee522659348d", + "elements": 10 + }, + "Month/90-days": { + "hash": "deb2fdadb115dc52", + "elements": 284 + }, + "Month/basic": { + "hash": "dc78c024b78799ac", + "elements": 1125 + }, + "Month/custom-cell-size": { + "hash": "4267b7ac61cd1d92", + "elements": 1125 + }, + "Month/multiple-years": { + "hash": "f2db7fe5761c49fe", + "elements": 3368 + }, + "Month/without-day-numbers": { + "hash": "e329ff32d152cf31", + "elements": 23 + }, + "Month/without-month-labels": { + "hash": "4f37f3bb692491f0", + "elements": 21 + }, + "MotionPath/repeat-indefinitely": { + "hash": "26459658f89e010e", + "elements": 58 + }, + "MotionPath/rotate-object-with-path": { + "hash": "26459658f89e010e", + "elements": 58 + }, + "MotionPath/sync-with-draw": { + "hash": "26459658f89e010e", + "elements": 58 + }, + "Pack/basic": { + "hash": "2a0fdd1e2577a4fa", + "elements": 278 + }, + "Partition/filterable": { + "hash": "fd233d2a71c557ae", + "elements": 1147 + }, + "Partition/flame-graph": { + "hash": "7322bb8dca25e8da", + "elements": 138 + }, + "Partition/horizontal": { + "hash": "58a64a1d14cdcfaf", + "elements": 1015 + }, + "Partition/sunburst": { + "hash": "69d14c2a2d01ab7a", + "elements": 465 + }, + "Partition/vertical": { + "hash": "0113b90ec49b4bd2", + "elements": 1519 + }, + "Path/basic": { + "hash": "bb2e336843b49d46", + "elements": 7 + }, + "Pattern/circles": { + "hash": "ee39a1106333b140", + "elements": 20 + }, + "Pattern/circles-custom-pattern-svg-only": { + "hash": "19d99cfbdb8afe56", + "elements": 26 + }, + "Pattern/lineargradient-as-pattern": { + "hash": "3af19b7bfb1adb8d", + "elements": 16 + }, + "Pattern/lines": { + "hash": "0e2bdb627e8fd48e", + "elements": 20 + }, + "Pattern/lines-custom-pattern-svg-only": { + "hash": "5f3bc2024367a0bd", + "elements": 20 + }, + "Pattern/rects": { + "hash": "a711d60ce3aaf1a5", + "elements": 19 + }, + "Pattern/with-fill-color": { + "hash": "82fa4416429c5624", + "elements": 27 + }, + "Pattern/with-lineargradient": { + "hash": "a763d44471d6e321", + "elements": 27 + }, + "Pie/basic": { + "hash": "76c8dd9336c1bd62", + "elements": 10 + }, + "Pie/default-slot-render-each-arc": { + "hash": "ad8bda6c8d302954", + "elements": 10 + }, + "Pie/disable-sorting": { + "hash": "a964f4183571ec66", + "elements": 10 + }, + "Pie/inner-radius-negative": { + "hash": "80ac1955b150c749", + "elements": 10 + }, + "Pie/inner-radius-positive": { + "hash": "f504b9d9579507f2", + "elements": 10 + }, + "Pie/inner-radius-zero-one": { + "hash": "f504b9d9579507f2", + "elements": 10 + }, + "Pie/labels": { + "hash": "a8b93f805a1bff93", + "elements": 18 + }, + "Pie/labels-centroid": { + "hash": "a8b93f805a1bff93", + "elements": 18 + }, + "Pie/labels-centroid-multiple": { + "hash": "5107aecb6cfa8b5a", + "elements": 26 + }, + "Pie/labels-outer": { + "hash": "5c270c864ab1835e", + "elements": 27 + }, + "Pie/labels-outer-radial": { + "hash": "d46c79bbef34b9bf", + "elements": 18 + }, + "Pie/labels-outer-with-padding": { + "hash": "c4191632a980fb3d", + "elements": 27 + }, + "Pie/multiple-data-prop": { + "hash": "13924c938e16d236", + "elements": 14 + }, + "Pie/offset": { + "hash": "c9a8c675bb0d1265", + "elements": 10 + }, + "Pie/outer-radius": { + "hash": "3f0bff024903d6a7", + "elements": 10 + }, + "Pie/pad-angle": { + "hash": "5750f053126757e6", + "elements": 10 + }, + "Pie/pad-angle-with-inner-radius": { + "hash": "2524b26dd893db02", + "elements": 10 + }, + "Pie/partial-range-chart-xrange": { + "hash": "61444a1ec88a76cf", + "elements": 10 + }, + "Pie/partial-range-range-prop": { + "hash": "61444a1ec88a76cf", + "elements": 10 + }, + "Pie/placement": { + "hash": "30924ccadaf1371d", + "elements": 10 + }, + "Pie/placement-center": { + "hash": "30924ccadaf1371d", + "elements": 10 + }, + "Pie/placement-left": { + "hash": "30924ccadaf1371d", + "elements": 10 + }, + "Pie/placement-right": { + "hash": "30924ccadaf1371d", + "elements": 10 + }, + "Pie/tooltip": { + "hash": "30924ccadaf1371d", + "elements": 10 + }, + "Pie/tooltip-with-arcs-slot": { + "hash": "28590daba1a67cf1", + "elements": 18 + }, + "Pie/tweened": { + "hash": "fc37a47a5f9ebe67", + "elements": 6 + }, + "PieChart/arc": { + "hash": "854e8716064480f3", + "elements": 12 + }, + "PieChart/arc-props": { + "hash": "e7f63834a9de1616", + "elements": 12 + }, + "PieChart/basic": { + "hash": "e7f63834a9de1616", + "elements": 12 + }, + "PieChart/colors-data-prop": { + "hash": "e7f63834a9de1616", + "elements": 12 + }, + "PieChart/colors-interpolator": { + "hash": "de2ec48f3c9b2830", + "elements": 12 + }, + "PieChart/colors-scheme": { + "hash": "c0a852f624bce4e5", + "elements": 12 + }, + "PieChart/colors-variables": { + "hash": "e7f63834a9de1616", + "elements": 12 + }, + "PieChart/donut": { + "hash": "c3b691a753a1bb3c", + "elements": 12 + }, + "PieChart/donut-with-text": { + "hash": "ae2affe9124af1f5", + "elements": 16 + }, + "PieChart/labels": { + "hash": "af9a0f302c56b846", + "elements": 24 + }, + "PieChart/labels-callout": { + "hash": "ec8d63f01242a5a2", + "elements": 24 + }, + "PieChart/legend": { + "hash": "1d2ec3b6e53e8504", + "elements": 12 + }, + "PieChart/legend-custom-label": { + "hash": "1d2ec3b6e53e8504", + "elements": 12 + }, + "PieChart/legend-placement": { + "hash": "1d2ec3b6e53e8504", + "elements": 12 + }, + "PieChart/legend-responsive": { + "hash": "1d2ec3b6e53e8504", + "elements": 12 + }, + "PieChart/legend-with-padding": { + "hash": "fbba3c64bbc11fc3", + "elements": 12 + }, + "PieChart/motion-spring": { + "hash": "fc37a47a5f9ebe67", + "elements": 6 + }, + "PieChart/motion-tween": { + "hash": "fc37a47a5f9ebe67", + "elements": 6 + }, + "PieChart/offset-slice": { + "hash": "b734fb7bddd4dd35", + "elements": 12 + }, + "PieChart/placement-custom": { + "hash": "e7f63834a9de1616", + "elements": 12 + }, + "PieChart/placement-left": { + "hash": "e7f63834a9de1616", + "elements": 12 + }, + "PieChart/placement-right": { + "hash": "e7f63834a9de1616", + "elements": 12 + }, + "PieChart/radius-fixed": { + "hash": "28df561bb847a7ce", + "elements": 12 + }, + "PieChart/radius-offset": { + "hash": "7e97c6f46a75f883", + "elements": 12 + }, + "PieChart/radius-percent": { + "hash": "b7bdee8678674d30", + "elements": 12 + }, + "PieChart/segments": { + "hash": "b45344556288a02d", + "elements": 70 + }, + "PieChart/series": { + "hash": "0929ecaaa540f5d6", + "elements": 30 + }, + "PieChart/series-click": { + "hash": "0929ecaaa540f5d6", + "elements": 30 + }, + "PieChart/series-props": { + "hash": "a67723a6d9d08217", + "elements": 22 + }, + "PieChart/tooltip-click": { + "hash": "e7f63834a9de1616", + "elements": 12 + }, + "Point/basic": { + "hash": "f99f3fd46a00a441", + "elements": 61 + }, + "Points/basic": { + "hash": "28645dc5d23ab896", + "elements": 72 + }, + "Points/color-via-class": { + "hash": "28645dc5d23ab896", + "elements": 72 + }, + "Points/color-via-fill": { + "hash": "5cab96f5d0b88f6f", + "elements": 72 + }, + "Points/color-via-ordinal-scale": { + "hash": "5f00dce2e662a7a2", + "elements": 73 + }, + "Points/color-via-threshold-scale": { + "hash": "32e93ce69ffeb133", + "elements": 74 + }, + "Points/with-labels": { + "hash": "639167a447a0ac31", + "elements": 92 + }, + "Points/with-tooltip-and-highlight": { + "hash": "28645dc5d23ab896", + "elements": 72 + }, + "Polygon/10-point-star": { + "hash": "b2db026758efa9d7", + "elements": 7 + }, + "Polygon/12-point-star": { + "hash": "e2791e0cf58420ee", + "elements": 7 + }, + "Polygon/14-point-star": { + "hash": "2512588f22d14854", + "elements": 7 + }, + "Polygon/16-point-star": { + "hash": "d997fc73b3285da9", + "elements": 7 + }, + "Polygon/18-point-star": { + "hash": "d1c1129ca5d96b2e", + "elements": 7 + }, + "Polygon/20-point-star": { + "hash": "399b473a900b6891", + "elements": 7 + }, + "Polygon/6-point-star": { + "hash": "d4be0f65039d8742", + "elements": 7 + }, + "Polygon/8-point-star": { + "hash": "0a45eee29ec2ea3d", + "elements": 7 + }, + "Polygon/arrow": { + "hash": "12600a58d7b9449a", + "elements": 7 + }, + "Polygon/color-via-ordinal-scale": { + "hash": "37b734c9166c946a", + "elements": 59 + }, + "Polygon/color-via-threshold-scale": { + "hash": "31d4a1946771322d", + "elements": 64 + }, + "Polygon/cross": { + "hash": "8236dff99369b503", + "elements": 7 + }, + "Polygon/data-mode": { + "hash": "6a3defc047c19147", + "elements": 59 + }, + "Polygon/diamond": { + "hash": "efc1c3c3e50702af", + "elements": 7 + }, + "Polygon/hexagon": { + "hash": "c34868d6c0f517ca", + "elements": 7 + }, + "Polygon/octagon": { + "hash": "c9ddfee7dbddef12", + "elements": 7 + }, + "Polygon/parallelogram": { + "hash": "5ce910292c24553b", + "elements": 7 + }, + "Polygon/pentagon": { + "hash": "45bae76c76355a8a", + "elements": 7 + }, + "Polygon/playground": { + "hash": "8cffe1e4cf67809d", + "elements": 7 + }, + "Polygon/rectangle": { + "hash": "ff47ed557e3f3c4f", + "elements": 7 + }, + "Polygon/rhombus": { + "hash": "72f3ed135974d9c2", + "elements": 7 + }, + "Polygon/square": { + "hash": "7fa979afec6f9f83", + "elements": 7 + }, + "Polygon/trapezoid": { + "hash": "16cc0eecd8b841a3", + "elements": 7 + }, + "Polygon/triangle": { + "hash": "3773d5a85e56e60d", + "elements": 7 + }, + "RadialGradient/focal-location-and-radius-with-custom-colors": { + "hash": "5acb1659a56da5ab", + "elements": 9 + }, + "RadialGradient/spreadmethod": { + "hash": "5acb1659a56da5ab", + "elements": 9 + }, + "RadialGradient/tailwind-colors": { + "hash": "40f70664f19ca0f2", + "elements": 15 + }, + "RadialGradient/units": { + "hash": "8a058c817e02530d", + "elements": 18 + }, + "Raster/mandelbrot": { + "hash": "28da9f169f6005d9", + "elements": 63 + }, + "Raster/math-functions": { + "hash": "3af3fd720bf9c970", + "elements": 86 + }, + "Raster/sampled": { + "hash": "73b3492f589802c2", + "elements": 67 + }, + "Raster/us-water-vapor": { + "hash": "2bb4c04ce1c6062d", + "elements": 55 + }, + "Raster/volcano": { + "hash": "2672056adb8046f7", + "elements": 57 + }, + "Raster/with-contour-overlay": { + "hash": "7cfa9ef84168b086", + "elements": 78 + }, + "Rect/color-via-ordinal-scale": { + "hash": "8feb90e23339a15b", + "elements": 60 + }, + "Rect/color-via-threshold-scale": { + "hash": "f67c1bae191ef002", + "elements": 62 + }, + "Rect/data-mode-edge": { + "hash": "67ca7c4b40f04332", + "elements": 60 + }, + "Rect/playground": { + "hash": "1f9407d16f8ae170", + "elements": 60 + }, + "Rect/styling-using-attributes": { + "hash": "0fe0acd17430dd76", + "elements": 62 + }, + "Rect/styling-using-classes": { + "hash": "bdf4cc733099c792", + "elements": 62 + }, + "Rect/styling-using-css-variables": { + "hash": "8a2d2c83feb35d8f", + "elements": 62 + }, + "Rule/annotation-x": { + "hash": "3d61b4dd3ae67a9a", + "elements": 60 + }, + "Rule/annotation-y": { + "hash": "4278adf3230b2b0c", + "elements": 60 + }, + "Rule/baseline-top-right": { + "hash": "280db1e70ccadd07", + "elements": 59 + }, + "Rule/baseline-x-negative": { + "hash": "c15849961d0a96fd", + "elements": 64 + }, + "Rule/baseline-x-y": { + "hash": "7af60168e8325507", + "elements": 59 + }, + "Rule/baseline-y-negative": { + "hash": "26dd9aab8489873d", + "elements": 61 + }, + "Rule/candlestick": { + "hash": "051d0b7b5901e996", + "elements": 324 + }, + "Rule/candlestick-open-close-line-color": { + "hash": "051d0b7b5901e996", + "elements": 324 + }, + "Rule/candlestick-with-brushing": { + "hash": "ae20ecf5ac238063", + "elements": 454 + }, + "Rule/data-x-band": { + "hash": "7134d47aaa508df7", + "elements": 132 + }, + "Rule/data-x-date": { + "hash": "f04e5ea1a7a7acbd", + "elements": 75 + }, + "Rule/data-x-range": { + "hash": "614722ea8dd665d4", + "elements": 71 + }, + "Rule/data-y-range": { + "hash": "b93b07ee65bf5024", + "elements": 75 + }, + "Rule/lollipop": { + "hash": "3e095297c3d2e61c", + "elements": 192 + }, + "Sankey/complex": { + "hash": "29833cb5a090b325", + "elements": 218 + }, + "Sankey/hierarchy": { + "hash": "5ad3c5255853651f", + "elements": 1013 + }, + "Sankey/node-select": { + "hash": "cf08c55bb36e5958", + "elements": 211 + }, + "Sankey/simple": { + "hash": "6efed1c7c8b5da11", + "elements": 55 + }, + "Sankey/tooltip": { + "hash": "6505a683c8b6a794", + "elements": 211 + }, + "ScatterChart/basic": { + "hash": "b2835cd1d674a3fe", + "elements": 189 + }, + "ScatterChart/brush": { + "hash": "b2835cd1d674a3fe", + "elements": 189 + }, + "ScatterChart/custom": { + "hash": "7cfb6b25e657ed69", + "elements": 196 + }, + "ScatterChart/custom-tooltip": { + "hash": "b2835cd1d674a3fe", + "elements": 189 + }, + "ScatterChart/date-series-color-scale": { + "hash": "d863917ca21920f9", + "elements": 127 + }, + "ScatterChart/domain-baseline": { + "hash": "44e0bb1d5808b90a", + "elements": 163 + }, + "ScatterChart/domain-nice": { + "hash": "f05182c3b6d77869", + "elements": 197 + }, + "ScatterChart/domain-padding": { + "hash": "dbe098a645e1b640", + "elements": 172 + }, + "ScatterChart/labels": { + "hash": "4972d1261ac883f7", + "elements": 389 + }, + "ScatterChart/line-annotation": { + "hash": "5eb11b8e4afd5310", + "elements": 192 + }, + "ScatterChart/point-annotations": { + "hash": "df22a31a57dabbf6", + "elements": 195 + }, + "ScatterChart/punchcard": { + "hash": "adefcb490f772d13", + "elements": 187 + }, + "ScatterChart/radius-scale": { + "hash": "6754c6ed52a01cf6", + "elements": 197 + }, + "ScatterChart/range-annotation-both": { + "hash": "e83b53b986193545", + "elements": 193 + }, + "ScatterChart/range-annotation-horizontal": { + "hash": "67624f6799527f20", + "elements": 193 + }, + "ScatterChart/range-annotation-vertical": { + "hash": "abce447debaaaac4", + "elements": 193 + }, + "ScatterChart/series": { + "hash": "2ea3a16ebd3884f7", + "elements": 405 + }, + "ScatterChart/series-custom-labels": { + "hash": "993b8055cb8c29e1", + "elements": 405 + }, + "ScatterChart/series-legend": { + "hash": "993b8055cb8c29e1", + "elements": 405 + }, + "ScatterChart/series-tween": { + "hash": "993b8055cb8c29e1", + "elements": 405 + }, + "ScatterChart/series-with-radius": { + "hash": "c5e7f711f1d4e9d2", + "elements": 405 + }, + "ScatterChart/single-axis-x": { + "hash": "3ff8937c9a726dc4", + "elements": 151 + }, + "ScatterChart/single-axis-y": { + "hash": "2263350f7553418c", + "elements": 153 + }, + "ScatterChart/single-dimension": { + "hash": "3d6c9cbc6b03390e", + "elements": 108 + }, + "ScatterChart/tooltip-click": { + "hash": "b2835cd1d674a3fe", + "elements": 189 + }, + "ScatterChart/zoomable-bubble": { + "hash": "55b4b5a37b46e710", + "elements": 236 + }, + "Spline/basic": { + "hash": "9fef33d0cdd7352d", + "elements": 78 + }, + "Spline/basic-start-and-end-snippets": { + "hash": "23c1276b2c44694d", + "elements": 58 + }, + "Spline/draw": { + "hash": "23c1276b2c44694d", + "elements": 58 + }, + "Spline/end-slot-with-draw-with-value": { + "hash": "3dde27014eea476f", + "elements": 58 + }, + "Spline/end-snippet-with-draw": { + "hash": "23c1276b2c44694d", + "elements": 58 + }, + "Spline/geo-routes": { + "hash": "20b4b39abe61a729", + "elements": 186 + }, + "Spline/gradient-encoding": { + "hash": "b0a72d5a2eaea02d", + "elements": 76 + }, + "Spline/gradient-threshold": { + "hash": "d8636d52c181592e", + "elements": 65 + }, + "Spline/label-using-start-end-snippets": { + "hash": "3f908f6ba90bedbe", + "elements": 62 + }, + "Spline/markers-arrows": { + "hash": "23c1276b2c44694d", + "elements": 58 + }, + "Spline/math-formula": { + "hash": "9f78fc1fae24e728", + "elements": 68 + }, + "Spline/multiple-series": { + "hash": "bc7f96f34da80c73", + "elements": 80 + }, + "Spline/multiple-series-highlight-on-hover": { + "hash": "bc7f96f34da80c73", + "elements": 80 + }, + "Spline/multiple-series-using-overrides": { + "hash": "97c8ea8e341d86c1", + "elements": 57 + }, + "Spline/multiple-series-with-labels": { + "hash": "7298ed6b9e03a657", + "elements": 260 + }, + "Spline/playground": { + "hash": "23c1276b2c44694d", + "elements": 58 + }, + "Spline/radial-line-with-areas": { + "hash": "665031eb54d9ce28", + "elements": 58 + }, + "Spline/radial-multi-year-lines": { + "hash": "e540aab072c2277b", + "elements": 146 + }, + "Spline/radial-radar": { + "hash": "6d81be056314100d", + "elements": 34 + }, + "Spline/stroke-grouping": { + "hash": "7a07ae5ea168a12b", + "elements": 53 + }, + "Spline/tween-on-mount": { + "hash": "f6f783891cfc1e33", + "elements": 77 + }, + "Spline/tweened": { + "hash": "23c1276b2c44694d", + "elements": 58 + }, + "Spline/vertical": { + "hash": "4eaed5dc38cf8c41", + "elements": 87 + }, + "Spline/with-labels": { + "hash": "1da1fa58c5284962", + "elements": 138 + }, + "Spline/with-tooltip-and-highlight": { + "hash": "9fef33d0cdd7352d", + "elements": 78 + }, + "Text/color-via-ordinal-scale": { + "hash": "473acd933931769b", + "elements": 71 + }, + "Text/color-via-threshold-scale": { + "hash": "107a0cd1048bfb61", + "elements": 76 + }, + "Text/data-mode": { + "hash": "d373c1315f5fb872", + "elements": 71 + }, + "Text/playground": { + "hash": "01e04175491cf439", + "elements": 12 + }, + "Text/segments": { + "hash": "dd1d06d079a6065c", + "elements": 10 + }, + "Text/truncate-axis-labels": { + "hash": "230b84fd3c158f1a", + "elements": 70 + }, + "Text/word-wrap-axis-labels": { + "hash": "90efc8572ba05a15", + "elements": 74 + }, + "Text/word-wrap-with-explicit-newline": { + "hash": "c9a294d5f892eabd", + "elements": 8 + }, + "Threshold/basic": { + "hash": "4adc41da1a9cf15e", + "elements": 84 + }, + "Threshold/with-labels": { + "hash": "faa8af7e06c3b7c3", + "elements": 144 + }, + "Threshold/with-tooltip-and-highlight": { + "hash": "4adc41da1a9cf15e", + "elements": 84 + }, + "Tooltip/anchor-location": { + "hash": "b08cb8cf1f24dffc", + "elements": 79 + }, + "Tooltip/area": { + "hash": "b08cb8cf1f24dffc", + "elements": 79 + }, + "Tooltip/basic": { + "hash": "b08cb8cf1f24dffc", + "elements": 79 + }, + "Tooltip/color-swatch": { + "hash": "b08cb8cf1f24dffc", + "elements": 79 + }, + "Tooltip/color-swatch-using-theme": { + "hash": "b08cb8cf1f24dffc", + "elements": 79 + }, + "Tooltip/custom-content": { + "hash": "b08cb8cf1f24dffc", + "elements": 79 + }, + "Tooltip/data-snapping": { + "hash": "b08cb8cf1f24dffc", + "elements": 79 + }, + "Tooltip/default-mouse-position-with-offset": { + "hash": "b08cb8cf1f24dffc", + "elements": 79 + }, + "Tooltip/disable-motion": { + "hash": "b08cb8cf1f24dffc", + "elements": 79 + }, + "Tooltip/duration": { + "hash": "8c88524a866b0fcc", + "elements": 114 + }, + "Tooltip/externally-access-tooltip-data": { + "hash": "b08cb8cf1f24dffc", + "elements": 79 + }, + "Tooltip/invert-variant": { + "hash": "b08cb8cf1f24dffc", + "elements": 79 + }, + "Tooltip/multiple-overlapping-bars": { + "hash": "fee4bd1d610e8628", + "elements": 167 + }, + "Tooltip/multiple-overlapping-durations": { + "hash": "d370e7c67bdfeb48", + "elements": 163 + }, + "Tooltip/multiple-tooltips-with-fixed-single-axis": { + "hash": "b08cb8cf1f24dffc", + "elements": 79 + }, + "Tooltip/multiple-tooltips-with-fixed-single-axis-scaleband": { + "hash": "d3ef166b9a60e0dc", + "elements": 137 + }, + "Tooltip/portal-overflow": { + "hash": "2575d210bc33157b", + "elements": 67 + }, + "Tooltip/scatter-plot": { + "hash": "d9a9d945445cf999", + "elements": 176 + }, + "Tooltip/simple-bars": { + "hash": "e6f0af87954cb04f", + "elements": 137 + }, + "Tooltip/single-date-time": { + "hash": "949b0abe903e7b6c", + "elements": 81 + }, + "Tooltip/stacked-area": { + "hash": "3cf21cf5476e8014", + "elements": 83 + }, + "Trail/basic": { + "hash": "e96103d46a8cb160", + "elements": 78 + }, + "Trail/curves": { + "hash": "4186888510aeb41b", + "elements": 30 + }, + "Trail/playground": { + "hash": "a419f41dfac418d0", + "elements": 46 + }, + "Trail/tdf-stage": { + "hash": "b09cb65f2d2e9c9e", + "elements": 77 + }, + "TransformContext/pan-zoom-axes": { + "hash": "786f15ebcc1d45ae", + "elements": 83 + }, + "TransformContext/pan-zoom-html-image": { + "hash": "17eaba663f60054a", + "elements": 16 + }, + "TransformContext/pan-zoom-svg-image": { + "hash": "6d8dfd5a644c143f", + "elements": 17 + }, + "TransformContext/planet-distances": { + "hash": "a6fb2727b66e61e6", + "elements": 84 + }, + "TransformContext/playground": { + "hash": "65a7f05b90080efb", + "elements": 516 + }, + "TransformContext/scroll-activation-key": { + "hash": "6d8dfd5a644c143f", + "elements": 17 + }, + "Tree/basic": { + "hash": "c1431254bd5c2d81", + "elements": 41 + }, + "Tree/html-nodes": { + "hash": "6b9ba41ebaee1134", + "elements": 25 + }, + "Tree/playground": { + "hash": "2428f515dfe45e99", + "elements": 58 + }, + "Treemap/basic": { + "hash": "c5dce8a4a3772f17", + "elements": 39 + }, + "Treemap/complex": { + "hash": "8c3f836cce1ec010", + "elements": 1453 + }, + "Treemap/nested-filter": { + "hash": "7ab0aecaed4b7c2b", + "elements": 1700 + }, + "Treemap/nested-zoom": { + "hash": "ac3a18287600ce78", + "elements": 1454 + }, + "Treemap/playground": { + "hash": "044f34f803614ab5", + "elements": 142 + }, + "Treemap/stacked-zoom": { + "hash": "3e36411b7048d6d5", + "elements": 309 + }, + "Vector/anchor": { + "hash": "6da4b98c54cad87f", + "elements": 65 + }, + "Vector/basic": { + "hash": "177b6ca7c1a7f8ce", + "elements": 30 + }, + "Vector/data-mode": { + "hash": "2dd3ce84ea45f1a5", + "elements": 60 + }, + "Vector/election-wind-map": { + "hash": "be3642f2880e1967", + "elements": 3119 + }, + "Vector/shapes": { + "hash": "595d5f32a1791a14", + "elements": 14 + }, + "Vector/wind-map": { + "hash": "6cd060e139ed984a", + "elements": 4854 + }, + "Violin/bandwidth": { + "hash": "bc7f8c92f6156193", + "elements": 56 + }, + "Violin/basic": { + "hash": "2ad932db56cfb51a", + "elements": 48 + }, + "Violin/horizontal": { + "hash": "7c7d0ad6e6b9db55", + "elements": 76 + }, + "Violin/with-box-median": { + "hash": "1f61c34a614786fe", + "elements": 56 + }, + "Voronoi/radius": { + "hash": "697d8f8ccd9b07d2", + "elements": 310 + }, + "Waffle/auto-multiple": { + "hash": "e6bcaf3ad6504a60", + "elements": 47 + }, + "Waffle/band-padding": { + "hash": "9a51a413da0ecf84", + "elements": 57 + }, + "Waffle/basic": { + "hash": "1bff43541fa173e4", + "elements": 57 + }, + "Waffle/circular-cells": { + "hash": "2eed3dff273c5e4e", + "elements": 124 + }, + "Waffle/custom-symbol": { + "hash": "95b084ca9305473e", + "elements": 90 + }, + "Waffle/horizontal": { + "hash": "f891b5863155c3d5", + "elements": 61 + }, + "Waffle/months": { + "hash": "9c75a2cceb720c21", + "elements": 85 + }, + "Waffle/olympians-by-birth-year": { + "hash": "0f7d0766d2d512c9", + "elements": 88 + }, + "Waffle/olympians-by-sex": { + "hash": "93289a2913bf50d8", + "elements": 44 + }, + "Waffle/olympians-weight-by-sex": { + "hash": "c2185ba5be13916c", + "elements": 150 + }, + "Waffle/penguins": { + "hash": "76dda2f9891b7a63", + "elements": 65 + }, + "Waffle/stacked": { + "hash": "a5ddca7f92946275", + "elements": 113 + }, + "Waffle/survey": { + "hash": "631e6e2efd599558", + "elements": 42 + }, + "Waffle/unit-multiple": { + "hash": "2d4a5e646a10099c", + "elements": 57 + } + } +} diff --git a/docs/src/content/components/Area.md b/docs/src/content/components/Area.md index 84c1435729..7e0b583c4f 100644 --- a/docs/src/content/components/Area.md +++ b/docs/src/content/components/Area.md @@ -13,6 +13,24 @@ See also: [AreaChart](/docs/components/AreaChart) for simplified examples :example{ name="basic" showCode } +### Multiple areas (`z`) + +Set `z` to draw a separate area per distinct value, all from one mark — the same channel [`Spline`](/docs/components/Spline#multiple-lines-z) uses. A `fill` (or `stroke`) that names a data property implies it, so this draws one area per fruit, colored through the chart's [`c` scale](/docs/guides/scales): + +```svelte + + + +``` + +`line` draws a line per area too, inheriting the area's color unless you override it. + +This replaces grouping the data yourself and rendering an `Area` per group — every mark registers with the chart and rebuilds its domains, so a mark per area costs O(areas × rows) at mount. + +:example{ name="multiple-series-with-labels" showCode } + +`fill`, `stroke`, `opacity`, and `class` also accept a function, resolved per area. + ### Playground :example{ name="playground" } diff --git a/docs/src/content/components/BarChart.md b/docs/src/content/components/BarChart.md index 37f9872fe3..068f6d3bd8 100644 --- a/docs/src/content/components/BarChart.md +++ b/docs/src/content/components/BarChart.md @@ -13,8 +13,69 @@ related: [Chart, Bars] See also: [Axis](/docs/components/Axis) for examples of using time scale axes with bar charts ::: +## Grouped and stacked + +`series` names a column per series, and `seriesLayout` decides how they share the band. Two or more of them stack unless told otherwise — the default stacks about zero, so negative values run downward rather than continuing the total. + +```svelte + +``` + +`seriesLayout="group"` gives each series its own slot within the band, so they're compared side by side: + +:example{ name="group-series" } + +`seriesLayout="stack"` gives them one running total instead, so the band's full height is their sum — what happens by default without a `seriesLayout`, except that it stacks every value in the same direction: + +:example{ name="stack-series" } + +A sub-band does both: `x1` (or `y1` when horizontal) puts each group in its own slot within the band, and the series stack within each group rather than sharing one running total. + +```svelte + [0, xScale.bandwidth()]} + series={[{ key: 'apples' }, { key: 'bananas' }, ...]} + seriesLayout="stack" +/> +``` + +:example{ name="group-stack-series" } + +`orientation="horizontal"` swaps the axes, with `y1` as the sub-band and the series stacking to the right: + +:example{ name="group-stack-series-horizontal" } + +Each row carries its band value, its group, and a column per stacked series — so one row per `year` × `basket` here. + +### Grouping long data + +Without `series` to stack, `x1` groups on its own — one bar per `x1` value within each band, from rows that already carry their category. Nothing has to be pivoted into a column per series first, the tooltip lists the band's rows, and `legend` reads the categories off the `c` scale — hovering an item fades the rest, clicking one filters to it: + +```svelte + +``` + +:example{ name="group-long-data" } + +Or stack it — `c` names the layers, so nothing has to be declared: + +```svelte + +``` + +:example{ name="stack-long-data" } + ## Fixed width Use `width` or `height` on bars to override the scale-derived size with a fixed pixel value. The bar is centered within its band. -:example{ name="vertical-fixed-width" showCode } +:example{ name="vertical-fixed-width" } diff --git a/docs/src/content/components/Brush.md b/docs/src/content/components/Brush.md new file mode 100644 index 0000000000..1a4f6e9e62 --- /dev/null +++ b/docs/src/content/components/Brush.md @@ -0,0 +1,122 @@ +--- +description: Marking component rendering a draggable selection over part of a chart, with its own state — so a chart can carry several independent brushes. +category: interactions +layers: [svg, canvas, html] +related: [BrushContext, Chart, Spline] +--- + +## Usage + +Drag to select, drag the middle to move the selection, and drag an edge to resize it. + +To clear it, click anywhere in the brushable region, or double-click the selection itself — worth knowing when the selection covers most of its region, as it does for a brush in a narrow band. + +:example{name="basic" showCode} + +## Brush vs. BrushContext + +There are two brushes, and they answer different questions. Both drive a `BrushState`, and both drag through the same [`brushable`](#brushable) gesture — what differs is what they own. + +| | [`BrushContext`](/docs/components/BrushContext) | `Brush` | +| ------------ | --------------------------------------------------------------------- | ----------------------------------- | +| Selections | One, spanning the plot area | One each, and a chart can hold many | +| Setup | The chart's `brush` prop, or the component | A mark, placed in a layer | +| Renders | An overlay of `div`s above the chart | `Rect`s in whichever layer it's in | +| Region | The plot area | Wherever you place it | +| Facets | Drawn in every panel, keyed to the panel a drag starts in | Unaware — one region, one selection | +| Integrations | `transform` zooming, tooltip interop | None — you read the state yourself | +| Styling | `range` / `handle` props, a `children` snippet, `.lc-brush-*` classes | `classes` for each part | + +**Start with the chart's `brush` prop.** It covers the common case — one selection over the plot, optionally zooming the chart — and it's the one wired into `transform` and tooltips. Because it renders as an overlay rather than inside a layer, it also works the same over svg and canvas charts. + +**Reach for `Brush` when one selection isn't enough**, or when the brushable region is smaller than the plot: a strip over each axis in [parallel coordinates](/docs/components/Spline#brushable-parallel-coordinates), a lane along the bottom of a chart. It's a mark, so it draws in the layer it's placed in and takes only the drags that start inside its own region — which is what lets several coexist. + +They aren't interchangeable: `Brush` has no facet handling, no `transform` or tooltip interop, and doesn't render the `.lc-brush-range` / `.lc-brush-handle` structure that `BrushContext`'s styling examples build on. + +For the gesture with no markup at all — on an element you render yourself — use the [`brushable`](#brushable) attachment underneath both. + +## Selection + +`bind:state` reads back the `BrushState` the component owns: + +```svelte + + + + +{#if brush?.active} + {brush.x[0]} – {brush.x[1]} +{/if} +``` + +`x` and `y` hold the selected domain values, and `active` is `false` until there's a selection. `contains(d)` tests a datum (or a point, `{ x, y }`) against it — the way to filter or style marks: + +```svelte + +``` + +Pass your own instance as `state={...}` instead when you need it to outlive the component. Either way, the same state can be driven from your code — `move()`, `selectAll()`, and `reset()` all update the drawn selection. + +:example{name="programmatic" } + +`onChange` fires as the selection changes, with `phase` distinguishing `'start'`, `'brush'`, and `'end'` — use `'end'` to defer expensive work until the drag finishes. + +## Axis + +`axis` sets which axis the selection spans, and which handles it carries: `'x'` (the default), `'y'`, or `'both'`. + +:example{name="vertical" } + +`axis="both"` selects a rectangle, with handles on all four edges. + +:example{name="two-dimensional" } + +## Region + +The brushable region defaults to the plot area. `x`, `y`, `width`, and `height` place it somewhere smaller — which is also what lets a chart carry several brushes, since each takes the drags that start within its own region. + +:example{name="region" } + +Parallel coordinates puts this to work: a `Brush` per dimension, each a narrow strip over its own axis, with the selections intersected to filter the lines. + +:example{ component="Spline" name="parallel-coordinates-brush" } + +## Layers + +`Brush` renders through [`Rect`](/docs/components/Rect), so it draws in whichever layer it's placed in — svg, canvas, or html. Every example above can be switched between them with the toggle at the top of the page. + +A canvas layer draws its marks rather than creating an element for each, so the brush hit-tests the pointer instead of attaching listeners. The gesture is identical; what's lost is the per-part cursors (`crosshair`, `move`, the resize arrows), which are CSS on real elements — canvas keeps the layer's own cursor throughout. + +The brush doesn't have to share a layer with the marks. Here it sits in an html layer of its own, above an svg one: + +:example{name="html" } + +## Styling + +`classes` targets each part — `root` (the brushable region), `selection`, and `handle`: + +```svelte + +``` + +`handleSize` (default `8`) sets how wide the resize handles are, in pixels. They straddle each edge of the selection, and are transparent by default — give them a `fill` to show them. + +## `brushable` + +The gesture on its own, as an [attachment](https://svelte.dev/docs/svelte/@attach) — for when you want the behaviour without any markup from LayerChart: + +```svelte + + + +``` + +The element's box is the brushable region, and where a drag starts decides what it does — an edge resizes, the middle moves, anywhere else starts a new selection. Options: `state`, `axis`, `mode` (force one behaviour, for an element that _is_ one part of the brush), `bounds`, `origin`, `edgeSize`, `clearThreshold`, and `onChange`. + +`brushGesture` is the same gesture as a `pointerdown` handler, for canvas layers and anywhere else without an element to attach to. diff --git a/docs/src/content/components/BrushContext.md b/docs/src/content/components/BrushContext.md index 728ad7ddb0..9ae8b09d23 100644 --- a/docs/src/content/components/BrushContext.md +++ b/docs/src/content/components/BrushContext.md @@ -2,11 +2,17 @@ description: Interaction component providing an interactive brush context allowing selection, adjustment, and resetting of x/y domains with draggable handles and event callbacks. category: interactions layers: [svg, canvas] -related: [] +related: [Brush] --- ## Usage +One selection, spanning the plot area, wired into the chart — `transform` zooming, tooltip interop, and a selection drawn in every facet panel. Set it up with the chart's `brush` prop, or this component directly. + +::tip +For several selections in one chart, or a brushable region smaller than the plot, see [Brush](/docs/components/Brush) — a mark you place yourself. Both drag through the same gesture; [Brush vs. BrushContext](/docs/components/Brush#brush-vs-brushcontext) compares them. +:: + ### Basic :example{name="basic"} diff --git a/docs/src/content/components/Chart.md b/docs/src/content/components/Chart.md index af288cfd1a..54014430db 100644 --- a/docs/src/content/components/Chart.md +++ b/docs/src/content/components/Chart.md @@ -15,6 +15,25 @@ order: 1 Features: Adds support for x and y baselines (always show 0, etc) :: +## Mixed marks + +Marks compose: each reads the chart's scales but decides for itself what to draw. Here the `Bars` stack among themselves while the `Spline` draws a target from its own values, and the scale covers both — so the line stays on the chart even where it runs above the tallest stack. + +```svelte +{#each context.series.visibleSeries as s (s.key)} + +{/each} + +``` + +:example{ name="mixed-marks-with-stack" } + +A `Spline` given a `seriesKey` instead follows that series' stacked top, which is how a line is drawn along the edge of a stacked `Area`. + +The same chart from long data needs no `series` at all — `c` names the layers, so one `Bars` stacks them: + +:example{ name="mixed-marks-with-stack-long-data" } + ## Text selection Charts are treated as interactive widgets: `user-select: none` is applied to the root container (`.lc-root-container`) so dragging to brush, pan, or zoom never selects axis labels or surrounding page text. Since `user-select` inherits, this covers the whole chart. @@ -29,3 +48,59 @@ To re-enable selection where you need it, set the `--lc-user-select` custom prop ``` An individual selectable region can also just set `user-select: text` on itself (e.g. Tailwind's `select-text`), which overrides the inherited value. + +### Facet (fx) + +:example{ name="facet-x" } + +### Facet (fy) + +:example{ name="facet-y" } + +### Facet grid (fx + fy) + +:example{ name="facet-grid" } + +### Faceted lines + +:example{ name="facet-lines" } + +### Facet with composed children + +:example{ name="facet-composed" } + +### Two-dimensional faceting + +:example{ name="facet-two-dimensional" } + +### Non-faceted marks + +:example{ name="facet-non-faceted-marks" } + +### Facet wrap + +:example{ name="facet-wrap" } + +### Annotated facets + +:example{ name="facet-annotation" } + +### Panel colours + +:example{ name="facet-color" } + +### Panel spacing + +:example{ name="facet-spacing" } + +### Facet tooltips + +:example{ name="facet-tooltip" } + +### Facet brushing + +:example{ name="facet-brush" } + +### Facet brush-to-zoom + +:example{ name="facet-brush-zoom" } diff --git a/docs/src/content/components/ChartGroup.md b/docs/src/content/components/ChartGroup.md new file mode 100644 index 0000000000..c208e5dc8a --- /dev/null +++ b/docs/src/content/components/ChartGroup.md @@ -0,0 +1,51 @@ +--- +description: Synchronize state between multiple charts, such as showing the tooltip and highlight on every chart when hovering any one of them. +category: interactions +related: [Chart, Tooltip, Highlight] +--- + +## Usage + +### Basic + +:example{name="basic"} + +### Faceted member + +:example{name="faceted-group"} + +### Highlight without tooltips + +Set `pointer={{ tooltip: false }}` so the other charts show the highlight without their own tooltip. + +:example{name="highlight-only"} + +### Synced legend + +Series highlight and visibility are shared — hovering a legend item fades that series on every chart, and clicking one hides it everywhere. Series are matched by key, so a chart is only affected by keys it has. + +:example{name="synced-legend"} + +### Programmatic control + +`ChartGroupState` is plain reactive state, so buttons and keyboard handlers can drive every chart in the group without touching a chart. + +:example{name="programmatic-control"} + +### Synced brushes + +Brush selections are shared — dragging on one chart selects the same domain range on the others. Here each detail chart also takes its domain from the shared selection. + +:example{name="synced-brushes"} + +### Synced zoom + +Brush-to-zoom on one chart zooms every chart in the group. + +:example{name="synced-zoom"} + +### Minimap + +An overview whose brush zooms the _other_ charts without zooming itself, via `publish: ['domain']`. Both charts are brushable and the most recent one wins. + +:example{name="minimap"} diff --git a/docs/src/content/components/LineChart.md b/docs/src/content/components/LineChart.md index c1c737bd29..a8c0027c57 100644 --- a/docs/src/content/components/LineChart.md +++ b/docs/src/content/components/LineChart.md @@ -8,3 +8,13 @@ related: [Chart, Spline] ## Usage :example{ name="basic" showCode } + +### Long data + +`c` names the categories the rows already carry, so one line is drawn per category and colored from the `c` scale — no `series`, and nothing pivoted into a column per fruit first. See the [Data guide](/docs/guides/data#long-format) for how the split is resolved. + +```svelte + +``` + +:example{ name="long-data" } diff --git a/docs/src/content/components/Spline.md b/docs/src/content/components/Spline.md index 672750f230..231d2e53b2 100644 --- a/docs/src/content/components/Spline.md +++ b/docs/src/content/components/Spline.md @@ -13,9 +13,45 @@ See also: [LineChart](/docs/components/LineChart) for simplified examples :example{ name="basic" showCode } +### Multiple lines (`z`) + +Set `z` to draw a separate line per distinct value, all from one mark — one line per series, without a mark each. + +```svelte + + + +``` + +Most of the time you don't set it at all: a `stroke` (or `fill`) that names a data property implies it, so the line above draws one line per fruit. `z` resolves in order — this mark's `z`, the Chart's `z`, then whatever `stroke` / `fill` names. + +This replaces grouping the data yourself and rendering a `Spline` per group. Prefer it: every mark registers with the chart and rebuilds its domains, so a mark per line costs O(lines × rows) at mount — with a few hundred lines that's the difference between ~1.9s and under 100ms. + +`z` keeps its scale, so the same field can group the lines _and_ encode them: + +```svelte + + context.zScale(d.year)} /> + +``` + +Set it explicitly when the grouping isn't the color — [parallel coordinates](#parallel-coordinates) groups by row (`z="index"`) while coloring by species. + +### Colors + +`stroke` and `fill` accept a CSS color, or the name of a data property — which resolves through the chart's [`c` scale](/docs/guides/scales), like every other mark. With `z`, the color resolves per line. + +```svelte + +``` + ### Per-segment styling -Pass a function to `stroke`, `fill`, or `opacity` to style each segment independently. Consecutive data points with the same resolved value are grouped into separate path segments. +Pass a function to `stroke`, `fill`, `opacity`, or `class` to style each segment independently. Consecutive data points with the same resolved value are grouped into separate path segments. This composes with `z` — each line is split into its own segments, so a function is the way to style a grouped `Spline` per line: + +```svelte + (d.year === 2024 ? 'stroke-primary' : 'stroke-surface-content')} /> +``` :example{ name="stroke-grouping" showCode } @@ -25,6 +61,38 @@ When inside a `GeoProjection` context, Spline automatically renders as a project :example{ name="geo-routes" showCode } +### Parallel coordinates + +One line per row across an axis per dimension, from a single `Spline` grouped by `z`. Each dimension keeps its own domain — `Axis` takes a `scale` override, so the ticks read in real units — while positions are normalized to a shared `0–1` domain so every dimension can share the chart's `y` scale. `Group` places each axis at its point on the categorical `x` scale. + +:example{ name="parallel-coordinates" showCode } + +### Brushable parallel coordinates + +A chart's `brush` prop owns one selection over the whole plot area. For several — one per axis here — place a [`Brush`](/docs/components/Brush) over each, a narrow strip of its own. Each owns its selection and takes only the drags that start inside its region: drag to select, drag the middle to move, drag an edge to resize, click to clear. + +```svelte + +``` + +`contains()` then filters the lines — a row is kept when every brushed dimension contains it, so brushing several intersects them. + +:example{ name="parallel-coordinates-brush" showCode } + +### Mixed dimension types + +A dimension doesn't have to be numeric. Give each one the scale its own data calls for — a point scale over the distinct values of a categorical column, a linear scale over the extent of a quantitative one — and they still share the chart's `y`, since each normalizes to `0–1`. + +Here `species` is an axis in its own right as well as the color, so brushing it narrows to those species and intersects with the numeric dimensions like any other. + +:example{name="parallel-coordinates-mixed" showCode} + +### Faceted parallel coordinates + +A line crosses every dimension, so the dimensions can't be panels — but `fy` gives one plot per group, sharing the dimension scales so the panels stay comparable. The per-dimension axes repeat in each panel with `facetAll`, while the dimension names, being an axis over the shared `x`, draw above the top panel only. + +:example{ name="parallel-coordinates-faceted" showCode } + ### Playground :example{ name="playground" } diff --git a/docs/src/content/guides/brush.md b/docs/src/content/guides/brush.md index 05ba6e0f86..efeacf9f40 100644 --- a/docs/src/content/guides/brush.md +++ b/docs/src/content/guides/brush.md @@ -254,21 +254,23 @@ An overview chart below the main chart can act as a navigation scrollbar. The ov ## Quick reference -| Use case | Configuration | Example | -| ----------------------- | -------------------------------------------------------- | ----------------------------------------------------------------------------- | -| Visual brush | `brush` | [basic](/docs/components/BrushContext/basic) | -| Brush-to-zoom | `brush={{ onBrushEnd: (e) => { ... e.brush.reset() } }}` | [integrated-brush]() | -| Simplified chart zoom | `brush` on LineChart/AreaChart/etc. | [brush](/docs/components/LineChart/brush) | -| Brush on categories | `brush` on BarChart with band scale | [brush-band](/docs/components/BarChart/brush-band) | -| Minimap (focus+context) | `brush={{ x: xDomain, onChange: ... }}` | [minimap](/docs/components/BrushContext/minimap) | -| Synced multi-chart | Shared `xDomain` state with `x` and `onChange` | [sync-brushes](/docs/components/BrushContext/synced-brushes) | -| Programmatic control | `context.brush.move()`, `.reset()`, `.selectAll()` | [programmatic-control](/docs/components/BrushContext/programmatic-control) | -| Brush + pan/zoom | `brush` + `transform={{ mode: 'domain' }}` | [brush-pan-zoom](/docs/components/LineChart/brush-pan-zoom) | -| Brush + pan/zoom (band) | `brush` + `transform` on band scale | [brush-pan-zoom-band](/docs/components/BarChart/brush-pan-zoom-band) | -| Overview + pan/zoom | `brush.x` synced to main chart's `context.xDomain` | [pan-zoom-with-overview](/docs/components/LineChart/pan-zoom-with-overview) | -| Point selection | `brush={{ axis: 'both', onChange: ... }}` | [selection](/docs/components/BrushContext/selection) | -| Custom styling | `brush={{ classes: { range: '...', handle: '...' } }}` | [simple-styling](/docs/components/BrushContext/simple-styling) | -| Disable click-to-reset | `brush={{ clickToReset: false }}` | | +| Use case | Configuration | Example | +| ------------------------- | -------------------------------------------------------- | ----------------------------------------------------------------------------- | +| Visual brush | `brush` | [basic](/docs/components/BrushContext/basic) | +| Brush-to-zoom | `brush={{ onBrushEnd: (e) => { ... e.brush.reset() } }}` | [integrated-brush]() | +| Simplified chart zoom | `brush` on LineChart/AreaChart/etc. | [brush](/docs/components/LineChart/brush) | +| Brush on categories | `brush` on BarChart with band scale | [brush-band](/docs/components/BarChart/brush-band) | +| Minimap (focus+context) | `brush={{ x: xDomain, onChange: ... }}` | [minimap](/docs/components/BrushContext/minimap) | +| Synced multi-chart | Shared `xDomain` state with `x` and `onChange` | [sync-brushes](/docs/components/BrushContext/synced-brushes) | +| Programmatic control | `context.brush.move()`, `.reset()`, `.selectAll()` | [programmatic-control](/docs/components/BrushContext/programmatic-control) | +| Brush + pan/zoom | `brush` + `transform={{ mode: 'domain' }}` | [brush-pan-zoom](/docs/components/LineChart/brush-pan-zoom) | +| Brush + pan/zoom (band) | `brush` + `transform` on band scale | [brush-pan-zoom-band](/docs/components/BarChart/brush-pan-zoom-band) | +| Overview + pan/zoom | `brush.x` synced to main chart's `context.xDomain` | [pan-zoom-with-overview](/docs/components/LineChart/pan-zoom-with-overview) | +| Point selection | `brush={{ axis: 'both', onChange: ... }}` | [selection](/docs/components/BrushContext/selection) | +| Selecting across facets | `context.brush.contains()` with `fx` / `fy` | [facet-brush](/docs/components/Chart/facet-brush) | +| Selection on other scales | `group.brush.contains()` in a `ChartGroup` | [facet-brush-summary](/docs/components/Chart/facet-brush-summary) | +| Custom styling | `brush={{ classes: { range: '...', handle: '...' } }}` | [simple-styling](/docs/components/BrushContext/simple-styling) | +| Disable click-to-reset | `brush={{ clickToReset: false }}` | | ## API reference diff --git a/docs/src/content/guides/chart-group.md b/docs/src/content/guides/chart-group.md new file mode 100644 index 0000000000..0d318bcac1 --- /dev/null +++ b/docs/src/content/guides/chart-group.md @@ -0,0 +1,369 @@ +--- +title: Chart Group (Syncing) +category: state +--- + +A `ChartGroup` synchronizes state between two or more charts. Hovering one chart shows the tooltip and highlight on all of them, each resolved against its own data and scales. + +## Quick start + +Wrap the charts in ``: + +```svelte + + + + + +``` + +:example{ component="ChartGroup" name="basic" } + +The charts don't need matching data. Each one looks up the **nearest data point to the shared domain value** in its own data, then positions the highlight with its own scales — so panels with different lengths, sampling rates, value ranges, sizes, or padding all stay in step. + +## Group or facets? + +Both put several plots on the screen, but they answer different questions. + +| | [Facets](/docs/guides/facets) | `ChartGroup` | +| --------------- | ------------------------------------------------ | ------------------------------------------ | +| Charts | one ``, divided into panels | one `` per plot | +| Data | one dataset, partitioned by `fx` / `fy` | each chart brings its own | +| Position scales | **shared** — that's the point | independent, unless you share the `domain` | +| Marks | the same marks in every panel | whatever each chart needs | +| Cost | one chart's worth of scales, tooltip, and layout | N charts | + +The question to ask is whether the panels measure **the same thing**: + +- **Same measure, split by a category** — sales by region, temperature by year. Facet it. Shared scales make the panels comparable, which is the whole point of small multiples, and a category can't drift out of sync with the others. +- **Different measures that share an axis** — requests, latency, and errors over the same dates. Group them. Each chart keeps its own y scale (they're different units) while the pointer, brush, and zoom stay in step. +- **Different chart types entirely** — a line beside a bar beside a map. Only a group can do this. + +They compose: a faceted chart is a single group member, with one id, so a group of them syncs as any other chart does. + +:example{ component="ChartGroup" name="faceted-group" } + +Hovering a panel moves the crosshair on the chart below, and vice versa. This example also sets [`facetAll`](/docs/guides/facets#one-tooltip-per-panel), so every panel marks and labels the hovered date with its own value; without it the highlight stays in the panel being hovered. + +## What's shared + +A group holds one piece of state per concern, each mirroring the chart state it syncs. All four are shared by default; pass `false` to any of them to opt out. + +| State | Shares | Disable with | +| --------------------- | ---------------------------------------------- | ------------------------------ | +| [`pointer`](#pointer) | the hovered data point — tooltip and highlight | `` | +| [`series`](#series) | legend highlight and visibility | `` | +| [`brush`](#brush) | the brush selection | `` | +| [`domain`](#domain) | the visible domain, so zoom follows | `` | + +## Group state + +`` is sugar over a `ChartGroupState` object. Create one yourself and pass it as `group` when the charts aren't siblings, or when you want to read the shared state: + +```svelte + + + + + +

Hovering: {group.pointer.data?.date}

+``` + +Because it's plain reactive state, anything can take part — not just charts. A table row, a value readout, or a video scrubber can drive every chart in the group by writing to it: + +```svelte + + +``` + +This is also how you make a synced dashboard keyboard-accessible: screen reader and keyboard users +never trigger the hover tooltip, but they can step the shared pointer along the timeline and have +every chart follow. + +:example{ component="ChartGroup" name="programmatic-control" } + +::note +Create the state inside a component (or ``), not at module scope. A module-level instance is shared across requests on the server and across every user of that module on the client. +:: + +| Member | Description | +| --------- | ----------------------------------------------------------- | +| `options` | The options the group was created with | +| `id` | Identity of the group, used as `source` for external writes | + +### Identifying charts + +Every shared state records a `source` — the `id` of the chart that put it there. That's what lets a chart ignore the echo of its own update, and what you compare against to tell which chart is driving. + +Charts get an opaque symbol by default; pass `id` to `Chart` (or any simplified chart) to supply your own, which also lands on the root element: + +```svelte + +``` + +```svelte +{#if group.pointer.source === 'requests'} + +{/if} +``` + +Inside a chart, `context.tooltip.source` names whatever drove the tooltip — the chart's own `id` when it came from its own pointer, otherwise the id of the chart or group that drove it: + +```svelte +{#if context.tooltip.source === context.id} + +{/if} +``` + +## Pointer + +The headline behaviour: hovering one chart shows the tooltip and highlight on all of them, each resolving the shared position against its own data and scales. + +### Matching + +`match` controls how a shared position resolves to a data point on each chart. + +| Value | Behavior | Use when | +| ------------------------ | --------------------------------------------- | ----------------------------------------------- | +| `'value'` (default) | Nearest data point to the shared domain value | Charts share a domain (ex. the same time range) | +| `'index'` | Data point at the same index | Data arrays are aligned and equal length | +| `'percent'` | Same relative position within the plot area | Domains are unrelated but comparable in shape | +| `(pointer, ctx) => data` | Resolve it yourself | Joining on an id, snapping to an interval, etc. | + +```svelte + +``` + +`'value'` is the default because it degrades gracefully — charts with different lengths still line up. `'index'` is exact and cheap but silently mismatches when the arrays differ. + +Use `axis` to share on `'y'` or `'both'` instead of the default `'x'`: + +```svelte + +``` + +### Highlight without tooltips + +By default every chart shows its own tooltip. For a busy dashboard, `tooltip: false` shows the highlight on the other charts but leaves the tooltip to the one being hovered: + +```svelte + +``` + +To vary the highlight itself — say, a point on the chart being hovered and just a line on the rest — give each chart an `id` and compare it against `group.pointer.source`: + +```svelte + + {#snippet children({ group })} + {#each panels as panel (panel.key)} + + {/each} + {/snippet} + +``` + +:example{ component="ChartGroup" name="highlight-only" } + +| Member | Description | +| --------------------------------- | ---------------------------------------------------------------------------------- | +| `pointer` | Current shared position — `x`, `y`, `data`, `index`, `percent`, `active`, `source` | +| `setPointer({ x, y, data, ... })` | Publish a position to the group | +| `clearPointer()` | Clear the shared position | + +## Series + +Charts in a group share their [series](/docs/guides/series) highlight and visibility, so a legend drives every chart at once — hovering an item fades that series everywhere, and clicking one hides it everywhere: + +```svelte + + + + +``` + +:example{ component="ChartGroup" name="synced-legend" } + +Series are matched **by key**, so the charts don't need the same ones. A chart is only affected by keys it actually has, and only ever speaks for its own — a panel showing an unrelated metric neither hides anything nor unhides what another chart hid. + +Disable either channel on its own: + +```svelte + +``` + +| Member | Description | +| ------------------- | ------------------------------------------------------------------------------------------ | +| `series` | Current shared state — `highlightKey`, `highlightSource`, `hiddenKeys`, `visibilitySource` | +| `setHighlight(key)` | Highlight a series across the group | +| `clearHighlight()` | Clear the shared highlight | +| `setHidden(keys)` | Hide series across the group — pass the full set of hidden keys | +| `clearHidden()` | Show every series again | + +`group.series` mirrors a chart's own `context.series`. Unlike the other slices it carries two independent channels, and so records a source for each: a chart owning the highlight stays its owner while another toggles visibility. + +::note +Hidden keys survive a chart unmounting. They describe series rather than the chart that hid them, and other charts may still be showing the same ones hidden. +:: + +## Brush + +Charts in a group share their [brush](/docs/guides/brush) selection — dragging on one selects the same domain range on the others. A chart without a brush can follow along by reading `group.brush`, which is all an overview/detail pair needs: + +```svelte + + {#snippet children({ group })} + {@const selection = group.brush.active ? group.brush : null} + + + + + + + {/snippet} + +``` + +:example{ component="ChartGroup" name="synced-brushes" } + +Use `axis` to share `'y'` / `'both'` instead of the default `'x'`: + +```svelte + +``` + +A chart that shares no axis with the selection reads it as a _membership test_ instead of as a range. `group.brush.contains({ x, y })` takes domain values — the publisher's, not the reader's — so a summary drawn on entirely different scales can still say which rows the selection holds: + +```svelte + + {#snippet children({ group })} + {@const selected = data.filter((d) => group.brush.contains({ x: d.date, y: d.value }))} + {/snippet} + +``` + +An axis with no selection is unconstrained, so an inactive brush contains everything — a summary starts at full strength rather than empty. It's the counterpart of [`context.brush.contains()`](/docs/guides/brush), for a chart that reads a selection it doesn't own. + +::note +Categorical (band/point) values compare lexicographically here, which is rarely what you want — `Apr` sorts before `Jan`. Compare positions in the domain instead. +:: + +:example{ component="Chart" name="facet-brush-summary" } + +| Member | Description | +| -------------------- | ------------------------------------------------------------ | +| `brush` | Current shared selection — `x`, `y`, `active`, `source` | +| `brush.contains()` | Whether a point in the publisher's domain values is selected | +| `setBrush({ x, y })` | Publish a selection to the group | +| `clearBrush()` | Clear the shared selection | + +## Domain + +Brush-to-zoom (`zoomOnBrush`, the default on simplified charts) consumes the selection into the chart's domain and resets it — so there is no lasting selection to share. What gets shared instead is the resulting **domain**, which zooms every chart in the group: + +```svelte + + + + +``` + +:example{ component="ChartGroup" name="synced-zoom" } + +| Member | Description | +| --------------------- | ---------------------------------------------------- | +| `domain` | Current shared domain — `x`, `y`, `active`, `source` | +| `setDomain({ x, y })` | Publish a visible domain to the group | +| `clearDomain()` | Reset charts to their natural extent | + +### Precedence + +When several things want to set a chart's domain, highest first: + +1. the chart's **own** brush zoom — direct interaction on that chart +2. an explicit `xDomain` / `yDomain` **prop** — a sibling must not override what the app controls +3. the **group's** shared domain + +A domain arriving from the group releases a zoom the chart performed earlier, so the most recent interaction wins rather than the first one pinning the chart forever. + +::note +Charts using `transform={{ mode: 'domain' }}` publish their zoom but don't currently apply a shared one — the transform narrows the domain itself, so the two would fight. +:: + +### Zooming the others without zooming yourself + +An overview chart shouldn't zoom — it has to keep showing the full extent. Naming `'domain'` in its `publish` makes its brush set the group's domain instead of sharing a selection: + +```svelte +{@const viewport = group.brush.active ? group.brush : group.domain} + + +``` + +Controlling the overview's brush is what keeps its rectangle showing the current viewport. Read `group.brush` while a selection is in progress so the rectangle tracks a drag on another chart live, and fall back to `group.domain` once it commits. Use `[null, null]` rather than `undefined` for "no selection" — `undefined` means _uncontrolled_, so the rectangle would stay behind when the domain is cleared. + +This has to be asked for by name. The default is to share everything, and under that default every plain brush would zoom the whole group — which is not what making a selection means. + +:example{ component="ChartGroup" name="minimap" } + +### Coordinated views + +A chart that zooms by [`transform`](/docs/guides/transform) shares the domain it lands on, the same as one zoomed by its brush — so an overview and a pan/zoom detail view coordinate through the group without either referencing the other. + +```svelte + + {#snippet children({ group })} + {@const viewport = group.brush.active ? group.brush : group.domain} + + + + + {/snippet} + +``` + +The domain is applied _through_ the transform on a chart that has one, rather than alongside it — a domain set next to a transform would narrow what the transform then scales again, and clearing it would drop the chart back to wherever its transform sat. + +What the overview publishes and subscribes to is worth reading twice: it sets the domain but doesn't take one, since an overview has to keep showing the full extent. + +:example{ component="ChartGroup" name="coordinated-views" } + +## Publishing and subscribing + +Everything above is shared in both directions. Each chart can opt out of either one with `groupOptions` — an overview chart that drives others without being driven by them: + +```svelte + + +``` + +Both default to `true`. Passing an array limits it to specific state — `'pointer'`, `'series'`, `'brush'`, `'domain'`: + +```svelte + +``` + +Naming one also opts into behaviour the default doesn't include — see [zooming the others without zooming yourself](#zooming-the-others-without-zooming-yourself). + +## API reference + +- [ChartGroup](/docs/components/ChartGroup) — component API and examples diff --git a/docs/src/content/guides/data.md b/docs/src/content/guides/data.md index 11be714bf6..0014940f81 100644 --- a/docs/src/content/guides/data.md +++ b/docs/src/content/guides/data.md @@ -33,6 +33,14 @@ LayerChart supports passing data at multiple levels, giving you flexibility from ``` +**Long format (grouped by a channel)** — One row per observation, with the category in a column. [details →](#long-format) + +```svelte + + + +``` + **Series (unified data)** — Multiple series from the same data array (wide format) with legend/tooltip. [details →](#unified-data-with-per-series-values) ```svelte @@ -79,6 +87,20 @@ The `x` and `y` props on `` define how values are extracted from your dat When omitted, the chart infers accessors from the marks that register inside it. +An array is also how you express an **interval** — `y={['start', 'end']}` is a pair of positions rather than a magnitude, so there's nothing to accumulate and `seriesLayout="auto"` leaves it as drawn. A duration bar or a waterfall stays where you put it. + +### Faceting and sub-bands + +Two more channels partition rather than position: `fx` / `fy` repeat the whole chart per distinct value (see the [Facets guide](/docs/guides/facets)), and `x1` / `y1` divide a band into sub-bands. Both take the same string or function accessors as `x` / `y`. + +### Non-flat data + +`data` doesn't have to be a flat array — it can be a hierarchy, a Sankey graph, or an array of series from `d3-shape`'s `stack()`. The scales need something flat to read, so pass one via `flatData`: + +```svelte + d.data.date} y={[0, 1]}> +``` + ### Mark-level position props (DataProp) Position props on primitive marks (`cx`, `cy`, `r` on Circle; `x`, `y`, `width`, `height` on Rect; etc.) accept a `DataProp`: @@ -154,6 +176,79 @@ Color props (`fill`, `stroke`) can also reference a data property that is mapped ``` +## Long format + +Long ("tidy") data carries the category in a column rather than a column per category — one row per observation: + +```js +const data = [ + { year: 2019, fruit: 'apples', value: 3840 }, + { year: 2019, fruit: 'bananas', value: 1920 }, + { year: 2018, fruit: 'apples', value: 1600 } + // … +]; +``` + +Naming that column as the `c` channel is enough to draw it. There's no `series` to declare, and nothing to pivot into a column per fruit first: + +```svelte + +``` + +:example{ component="LineChart" name="long-data" } + +### How the split is resolved + +`Spline` and `Area` group their rows into one path per distinct value, resolving what to group by in this order — the first that's set wins: + +| Source | Example | Notes | +| ----------------- | --------------------------- | ------------------------------------------- | +| The mark's `z` | `` | Most specific | +| The chart's `z` | `` | Applies to every mark inside | +| `stroke` / `fill` | `` | Names a data property, colored via `cScale` | +| The chart's `c` | `` | Only when it names a column (see below) | + +`c` only splits when it **names a column**. `c="fruit"` says that column holds the category; a computed accessor like `c={(d) => (d.value < 0 ? 'under' : 'over')}` is a color per row, and grouping on it would cut one series into a path per color, joining points that aren't next to each other. A continuous `c` (`c="value"` with a sequential scale) is a color ramp for the same reason — measurements aren't category names. Neither does a mark handed its own rows via `data` split — whoever grouped them already decided. + +Use `z` when the split and the color aren't the same thing. Here each line is one flower, colored by its species: + +```svelte + +``` + +### Legend + +With no `series` to name, the legend's items are the `c` categories. Hovering one fades the rest, and clicking one filters to it — the chart's domains recalculate from what's left, and the hidden categories keep their color: + +:example{ component="BarChart" name="group-long-data" } + +### Overlap, group, and stack + +`seriesLayout` behaves differently for long data, because the rows — not the series — carry the categories: + +| Layout | Long data | +| --------- | ----------------------------------------------------------------------------------------- | +| `auto` | Default for `BarChart` / `AreaChart`. Stacks by `c`, since `c` names layers to stack | +| `overlap` | Each mark drawn from the axis, compared against the others rather than summed | +| `group` | Pair with `x1` (or `y1`) to divide each band — `x1` names the sub-band, `group` splits it | +| `stack` | `c` names the layers, bottom-first in `cDomain` order | + +Bars need both `x1` and `seriesLayout="group"`: `x1` names the sub-band, and the group layout is what gives that sub-band a scale to sit on. With `x1` alone the bars share the full band and overlap. + +```svelte + +``` + +Stacking needs neither — the same `c` that colors the bars is what stacks them, and `auto` reaches for it without being asked: + +```svelte + +``` + +:example{ component="BarChart" name="stack-long-data" } + +`stackExpand` and `stackDiverging` work the same way, and the [Series guide](/docs/guides/series#layouts) covers stacking the wide format. + ## Series For multi-series charts with full tooltip, legend, and stacking support, use the `series` prop. See the [Series guide](/docs/guides/series) for complete documentation. diff --git a/docs/src/content/guides/facets.md b/docs/src/content/guides/facets.md new file mode 100644 index 0000000000..b8d4f466d9 --- /dev/null +++ b/docs/src/content/guides/facets.md @@ -0,0 +1,396 @@ +--- +title: Facets (Small multiples) +category: state +--- + +Faceting partitions the data into a grid of panels, one per distinct value, and draws the same chart in each. The **position scales stay shared across every panel**, which is what makes them comparable — the point of small multiples over a row of separate charts. + +Facet when the panels measure the **same thing** split by a category. When they measure _different_ things that share an axis — requests, latency, and errors over the same dates — reach for [`ChartGroup`](/docs/guides/chart-group#group-or-facets) instead. The two compose: a faceted chart can be a group member. + +## Quick start + +Set `fx` to split the data into a column per value: + +```svelte + + {#snippet marks()} + + {/snippet} + +``` + +:example{ component="Chart" name="facet-x" } + +Each panel draws only its own rows, but the `x` and `y` scales are computed from **all** of them, so a position means the same thing in every panel. + +`fy` splits into rows instead: + +:example{ component="Chart" name="facet-y" } + +## Two-dimensional faceting + +Set both to cross them into a grid. Panel headers appear across the top for `fx` and down the right for `fy`: + +```svelte + +``` + +:example{ component="Chart" name="facet-two-dimensional" } + +A crossed grid is usually sparse — not every combination has rows — and those panels simply come out empty while the scales stay shared. + +## Panel order + +Panels follow the order the values appear in the data. Pass `fxDomain` / `fyDomain` to fix it — including which panels exist at all: + +```svelte + +``` + +## Spacing + +`facet.padding` is the gap between panels, as a fraction of a panel's size — so it scales with the chart rather than being a fixed pixel gutter. It defaults to `0.1`: + +```svelte + +``` + +Set `paddingX` / `paddingY` to space the columns and rows differently, and `0` to butt the panels together: + +```svelte + +``` + +:example{ component="Chart" name="facet-spacing" } + +The gap is _between_ panels only — the grid spans the full plot area, so space around it is the chart's own `padding`. + +## Axes and labels + +A faceted chart carries two kinds of axis, and they behave differently. + +### Data axes + +The ones measuring `x` and `y` belong to the panels. They place themselves on the grid's **outer edge** — a `left` axis on the leftmost column, a `bottom` axis on the last row — so interior panels don't redraw the same ticks. On a 3 × 3 grid that's three of each, not nine. + +Set `facetAll` on an `Axis` to draw one in every panel instead — all nine: + +```svelte + +``` + +### Panel headers + +The labels naming each column and row are a different thing. `fx` and `fy` are scales, so the headers are **axes over those scales** — one across the top and one down the right, for the whole grid. There is one of each however many panels there are, so `facetAll` doesn't apply to them. + +Configure them with `Axis` props, or remove them: + +```svelte + d.toUpperCase() } }}> + +``` + +## Non-faceted marks + +A mark reads its panel's rows from context. Pass `data` explicitly to opt out, and it draws the full dataset in every panel — useful as a backdrop to compare each panel against the whole: + +```svelte +{#snippet marks()} + + + + + +{/snippet} +``` + +:example{ component="Chart" name="facet-non-faceted-marks" } + +## Colouring by panel + +`fx` / `fy` are ordinary data properties, so a mark colours by one the same way it colours by anything else — `fill` (or `stroke`) naming the property, resolved through the chart's `c` scale: + +```svelte + + {#snippet marks()} + + {/snippet} + +``` + +:example{ component="Chart" name="facet-color" } + +The `c` domain is built from the whole dataset, so the colours are stable regardless of which rows land in which panel. A legend is usually redundant here — the panel headers already name each colour. + +To style the panel _itself_ rather than its rows — a tinted background, a rule, anything not per-row — take the panel from the layer and read `fx` / `fy` off it: + +```svelte +{#snippet children({ context })} + + {#snippet children({ facet })} + + {/snippet} + +{/snippet} +``` + +## Grouped bars + +A band scale inside each panel makes a grouped bar chart, with the panel doing the grouping rather than an offset within a band — a column per group, a bar per value inside it: + +```svelte + +``` + +:example{ component="Chart" name="facet-bars" } + +Hovering a panel gives one bar by default. `tooltipContext={{ mode: 'facet' }}` gives the group instead — see [bands inside panels](#bands-inside-panels). + +`seriesLayout="group"` on a [`BarChart`](/docs/components/BarChart) does the same job from wide data, one column per key. Facet instead when the data is long, when the groups want their own labels, or when the inner bars are a scale of their own rather than a fixed set of series. + +## Annotating one panel + +The `marks` snippet (and the rest rendered inside the layer) is handed the panel it's drawing, so a mark can appear in a single panel — a note that belongs to one group rather than all of them: + +```svelte +{#snippet aboveMarks({ context, facet })} + {#if facet.fy === 'Adelie'} + + {/if} +{/snippet} +``` + +:example{ component="Chart" name="facet-annotation" } + +Stacked series stack within their own panel too, so a category appearing in several panels keeps a separate total in each. + +## Wrapping into a grid + +A one-dimensional facet can be wrapped into a grid by making `fx` the column and `fy` the row — the index of the value divided by the number of columns: + +```svelte + + + +``` + +:example{ component="Chart" name="facet-wrap" } + +The `fx` / `fy` headers are grid positions rather than names, so they're turned off and each panel labels itself from the panel it's given. + +## Tooltips + +The pointer resolves the panel it's over, then finds the row within _that_ panel — so equal values in neighbouring panels stay distinct, in every mode (`bisect-*`, `quadtree*`, `bounds` / `band`, `voronoi`). + +`Highlight` stays in that panel too — crosshair, point, and area all mark the row being shown. (Its `lines` draw one crosshair by default, on `x`; a scatter usually wants `axis="both"`, which `ScatterChart` sets for you.) + +:example{ component="Chart" name="facet-tooltip" } + +### Bands inside panels + +A band scale inside a panel can be read two ways, and `mode` says which. + +`band`, what the bar charts default to, resolves to a bar — a full-height target over its column, so the pointer doesn't have to find a short bar. `facet` widens that to the panel around it: the highlight marks the whole panel and the tooltip lists its rows. The panel groups the way `x1` / `y1` do inside a band, with the scale inside it as the sub-band. + +```svelte + + + + + +``` + +A few bars to a panel is what `facet` is for — [grouped bars](#grouped-bars) read as groups when hovering a party gives both its years at once: + +:example{ component="Chart" name="facet-bars" } + +A dozen bars to a panel is what it isn't: + +:example{ component="Chart" name="facet-brush-band" } + +Configured `series` rule the grouping out even in `facet` mode — each row then carries the whole set rather than one sub-band's share of it, so a band already _is_ a row, and one target over the panel would resolve every hover in it to the panel's first row. + +### Naming the panel + +A band value alone names a row in every panel — three panels each have a `Torgersen` — so the tooltip puts the panel in front of it: `Adelie · Torgersen`. + +Where the panel _is_ what the pointer resolves to, that name is the header on its own. Either way `facet.tooltip` is what says it: + +```svelte + + d.industry }}> + + + +``` + +Panel headers are `facet.axis`'s to draw, separately — a wrapped grid usually turns those off and labels its panels itself, and this is the same question asked of the tooltip. + +::note +`quadtree` and `voronoi` tooltips head their list with the series rather than a value, so there's nowhere for the panel to go — `ScatterChart` and hand-composed point charts are unaffected by this option. +:: + +### One tooltip per panel + +`facetAll` on the highlight and the tooltip marks and labels the hovered _position_ in every panel, each resolving its own value there: + +```svelte + +``` + +:example{ component="ChartGroup" name="faceted-group" } + +Panels with nothing at that position draw no point and no tooltip — the crosshair still marks the position, since that's a place rather than a row. A hand-composed chart sets it on the tooltip directly: ``. + +The two are independent, so a grid with many panels can take the crosshair everywhere while keeping a single tooltip — `highlight={{ facetAll: true }}` without the tooltip half, as [facet wrap](#wrapping-into-a-grid) does. + +To build the rows yourself — a single tooltip listing every panel, say — `panelDatum(context, panel, row)` gives a panel's row at the same position, or `undefined` when it has none. It's the facet counterpart of `findDatumByValue`, which is how a [`ChartGroup`](/docs/guides/chart-group) member resolves another chart's pointer. + +::note +A faceted chart resolves tooltips against the rows the panels were partitioned from — the chart's `data`. Marks given their own `data` aren't part of that partition, so their points are not found by the pointer. +:: + +## Brushing + +A brush gesture belongs to the panel it starts in, so the range it produces is read from that panel's coordinates. What it produces is a range of the _shared_ scales, though — so the selection applies to every panel, and is drawn in each of them. + +That shared range is what makes a faceted brush worth having: it lets the panels answer one question together. `contains()` asks whether a point falls inside the selection, and a gesture drawn over one panel picks out the matching rows in all of them: + +```svelte +{@const isSelected = context.brush.contains({ x: d.flipper_length_mm, y: d.body_mass_g })} +``` + +:example{ component="Chart" name="facet-brush" } + +It takes domain values rather than the row itself, so each point is asked about with the same accessors the chart was given. An axis with no selection is unconstrained — an inactive brush contains everything, so nothing is singled out until a gesture is made. + +### Zooming to the selection + +`zoomOnBrush` applies the selection instead of leaving it to be read: the range becomes the panels' new domain, and the brush clears. + +That leaves the rows outside the new domain positioned outside their panel, where they'd otherwise be drawn over the neighbouring one. `Chart`'s default layout clips its marks while brushing, and `ChartClipPath` sizes itself to the panel, so this is handled for you. + +A hand-composed chart clips what it chooses to — wrap the marks that should stay inside the panel, leaving axes and grids out of it: + +```svelte + + + + + + +``` + +:example{ component="Chart" name="facet-brush-zoom" } + +::note +Zooming with `transform` isn't facet-aware yet — a pan or pinch moves the whole plot rather than the panel under the pointer. Brushing with `zoomOnBrush` is the way to zoom a faceted chart today. +:: + +### Summarising the selection + +A [`ChartGroup`](/docs/guides/chart-group) carries the same test to a chart drawn on other scales. The group publishes the selection in the _publisher's_ domain values, so a summary asks about its rows with the faceted chart's accessors rather than with its own: + +```svelte +{@const selected = data.filter((d) => + group.brush.contains({ x: d.flipper_length_mm, y: d.body_mass_g }) +)} +``` + +:example{ component="Chart" name="facet-brush-summary" } + +### Categories + +Brushing a band scale snaps to whole categories, and the run it selects is the same run in every panel. + +Which categories those are is a question about _positions_: `brush.x` holds the first and last of them, and the ones between are the ones the domain puts between — not the ones that sort between, which is what `contains()` would compare. + +```ts +const [first, last] = brush.x.map((month) => months.indexOf(month)); +const selected = months.slice(Math.min(first, last), Math.max(first, last) + 1); +``` + +:example{ component="Chart" name="facet-brush-band" } + +### Driving the panels from elsewhere + +The brush needn't live in a panel at all. An overview beside the facets can own it, with the panels narrowing to what it selects: + +:example{ component="Chart" name="facet-brush-overview" } + +::note +Narrow the panels by filtering the rows rather than by `xDomain` alone. A domain narrower than the data leaves the rows outside it positioned outside their panel, drawn over the neighbouring one — the panel clip that prevents this is on while a chart is brushing or transforming, and a chart driven from elsewhere is doing neither. +:: + +## Composed charts + +Faceting is applied by the layer, not by the default layout, so a hand-composed chart facets too — with no `` of your own: + +```svelte + + + + + + + + +``` + +:example{ component="Chart" name="facet-composed" } + +This works for ``, ``, and `` / `` / `` used directly. + +## Reading the current panel + +A layer renders its children once per panel and hands each the panel it's drawing into — which is how `Axis` decides whether it's on an outer edge: + +```svelte + + {#snippet children({ facet })} + {#if facet.left} + + {/if} + {/snippet} + +``` + +Without `fx` / `fy` there's a single panel covering the whole plot area, so `facet` is always there to read. + +The layout itself lives on the chart state as `context.facet`: + +| Member | Description | +| --------------------------------- | ----------------------------------------------- | +| `context.facet.enabled` | Whether `fx` / `fy` partition the chart | +| `context.facet.panels` | Every panel, with offsets, rows, and edge flags | +| `context.facet.xScale` / `yScale` | Band scales laying the panels out | +| `context.facet.width` / `height` | One panel's dimensions | + +`context.width` / `height` are that same panel box — `context.box` stays the whole plot area. + +A panel itself carries: + +| Member | Description | +| ----------------------------------- | -------------------------------------------------------- | +| `fx` / `fy` | This panel's values, or `undefined` on an unfaceted axis | +| `column` / `row` | Index within the `fx` / `fy` domain | +| `x` / `y` | Offset from the plot area's origin | +| `width` / `height` | The panel's size | +| `data` | The rows belonging to this panel | +| `empty` | Whether the panel has no rows | +| `left` / `right` / `top` / `bottom` | Whether the panel is on that outer edge | +| `has(row)` | Whether a row belongs to this panel, by `fx` / `fy` | diff --git a/docs/src/content/guides/series.md b/docs/src/content/guides/series.md index 6d36b7413d..829178ced2 100644 --- a/docs/src/content/guides/series.md +++ b/docs/src/content/guides/series.md @@ -94,20 +94,35 @@ Separate data arrays can even have different lengths: The `seriesLayout` prop controls how multiple series are arranged: -| Layout | Effect | -| ------------------ | ---------------------------------------------------- | -| `'overlap'` | Series overlap (default). Later series render on top | -| `'stack'` | Series are stacked vertically | -| `'stackExpand'` | Stacked and normalized to 100% | -| `'stackDiverging'` | Positive values stack up, negative values stack down | -| `'group'` | Side-by-side within each band (bar charts only) | +| Layout | Effect | +| ------------------ | --------------------------------------------------------------------------- | +| `'auto'` | Stack when there are layers to stack (default for `BarChart` / `AreaChart`) | +| `'overlap'` | Series overlap. Later series render on top | +| `'stack'` | Series are stacked vertically | +| `'stackExpand'` | Stacked and normalized to 100% | +| `'stackDiverging'` | Positive values stack up, negative values stack down | +| `'group'` | Side-by-side within each band (bar charts only) | -### Overlap (default) +### Auto (default) -Series render on top of each other. Useful for comparing trends: +Charts default to `'auto'`, which stacks when something names layers to stack — two or more `series`, or an ordinal `c` — and overlaps otherwise. + +Three things are left alone, because none of them is a set of layers: + +- A value that resolves to an interval. `[start, end]` is a pair of positions rather than a magnitude, whether it comes from the accessor (`x={['start', 'end']}`) or from the data, so duration bars and waterfalls keep their shape. +- A mark handed its own `data`. Whoever handed the rows over has already grouped them. +- Lines and points. A `Spline` is read against a shared baseline and a scatter's series are positions to compare, so neither joins a stack it wasn't explicitly asked to join. + +It stacks at zero rather than end to end, so negative values run the other way and a population pyramid keeps its two sides. `LineChart` is unaffected — lines are read against a shared baseline, so stacking them would change what they say. + +### Overlap + +Series render on top of each other, each drawn from the axis rather than from the one below it. Useful for comparing series against each other rather than reading them as a total: :example{ component="BarChart" name="series" } +:example{ component="AreaChart" name="series-overlap" } + ### Stack Series are stacked, with each series starting where the previous one ended: @@ -176,6 +191,8 @@ You can also read the highlight state in custom mark snippets: :example{ component="LineChart" name="series-labels-hover" } +Highlighting and visibility are shared between charts in a [chart group](/docs/guides/chart-group#series), so one legend can drive a whole dashboard. + ## Programmatic control Access the series state via `bind:context` to build your own series toggle UI, set initial visibility, or control series from external components. See the [persist-series example](/docs/components/LineChart/persist-series) for an example using localStorage to persist series selection. @@ -241,6 +258,7 @@ You can also access series state inside a Chart's `children` snippet without `bi | `visibleSeries` | `SeriesData[]` | Only visible (non-filtered) series | | `selectedKeys` | `SelectionState` | Selection state managing which series are visible | | `highlightKey` | `string \| null` | Currently highlighted series key | +| `highlightSource` | `string \| symbol \| null` | What set the highlight — `null` for this chart's own | | `isStacked` | `boolean` | Whether a stacking layout is active | | `stackLayout` | `StackLayout` | Current layout mode | | `isDefaultSeries` | `boolean` | True when no series prop was provided | @@ -250,12 +268,13 @@ You can also access series state inside a Chart's `children` snippet without `bi ### Methods -| Method | Description | -| ----------------------------------------- | ------------------------------------------------------------------------- | -| `isVisible(seriesKey)` | Whether a series is visible (all visible when none are selected) | -| `isHighlighted(seriesKey, defaultValue?)` | Whether a series is highlighted. Default `false` when no highlight active | -| `getStackValue(seriesKey, d)` | Get stack `[y0, y1]` values for a data point | -| `getStackAccessors(seriesKey)` | Create `{ y0, y1, value }` accessor functions for stacked layouts | +| Method | Description | +| ----------------------------------------- | ------------------------------------------------------------------------------------------ | +| `isVisible(seriesKey)` | Whether a series is visible (all visible when none are selected) | +| `isHighlighted(seriesKey, defaultValue?)` | Whether a series is highlighted. Default `false` when no highlight active | +| `setHighlight(seriesKey, source?)` | Highlight a series, recording what drove it (see [chart groups](/docs/guides/chart-group)) | +| `getStackValue(seriesKey, d)` | Get stack `[y0, y1]` values for a data point | +| `getStackAccessors(seriesKey)` | Create `{ y0, y1, value }` accessor functions for stacked layouts | ## Per-series component props diff --git a/docs/src/content/guides/state.md b/docs/src/content/guides/state.md index d16a3a9bf8..0c9f22fa21 100644 --- a/docs/src/content/guides/state.md +++ b/docs/src/content/guides/state.md @@ -102,6 +102,12 @@ Interactive drag-to-select regions for filtering, zooming, or syncing charts. Su `context.brush` — `x`, `y`, `active`, `reset()`, `selectAll()`, `move()` +### [Chart Group (Syncing)](/docs/guides/chart-group) + +Synchronize state between multiple charts — hovering one shows the tooltip and highlight on all of them, each resolved against its own data and scales. + +`context.tooltip.source` — which chart (if any) drove the current tooltip + ### [Geo (Maps & Projections)](/docs/guides/geo) Geographic rendering with d3 projections, auto-fitting, and a suite of geo components (`GeoPath`, `GeoPoint`, `GeoTile`, `GeoCircle`, `GeoSpline`). diff --git a/docs/src/content/guides/tooltip.md b/docs/src/content/guides/tooltip.md index 31d1186587..2ad35d6891 100644 --- a/docs/src/content/guides/tooltip.md +++ b/docs/src/content/guides/tooltip.md @@ -45,6 +45,7 @@ The `mode` prop on `tooltipContext` controls how the nearest data point is found | `bisect-x` | Binary search along x-axis (requires sorted data) | Time series, line/area charts | | `bisect-y` | Binary search along y-axis (requires sorted data) | Horizontal charts | | `band` | Full-bandwidth hit targets using transparent paths | Bar charts, categorical axes | +| `facet` | The `fx` / `fy` panel as the band, listing its rows | A few bars grouped into each panel | | `bisect-band` | Bisect + band combined | Bar charts with sorted time axis | | `bounds` | Hit detection based on data element bounds | Duration bars, overlapping ranges | | `voronoi` | Geometric partitioning via Voronoi diagram | Scatter plots, irregular point layouts | @@ -56,7 +57,7 @@ The `mode` prop on `tooltipContext` controls how the nearest data point is found ### Choosing a mode - **Line / area charts** — use `bisect-x` or `quadtree-x`. Both find the closest point along the x-axis. `bisect-x` is simpler; `quadtree-x` works with unsorted data. -- **Bar charts** — use `band` or `bisect-band`. These create full-width hit targets so the user doesn't need to hover precisely on the bar. +- **Bar charts** — use `band` or `bisect-band`. These create full-width hit targets so the user doesn't need to hover precisely on the bar. `facet` widens that target again to the whole [panel](/docs/guides/facets), for bars grouped by faceting rather than by an offset within a band. - **Scatter plots** — use `voronoi` or `quadtree`. Both find the nearest point in 2D space. `quadtree` is faster for large datasets. - **Geographic / radial charts** — use `manual` and trigger from `onpointerenter` / `onpointerleave` on your shapes. diff --git a/docs/src/content/guides/transform.md b/docs/src/content/guides/transform.md index d4775af0f3..28df60b6c9 100644 --- a/docs/src/content/guides/transform.md +++ b/docs/src/content/guides/transform.md @@ -193,6 +193,23 @@ Bind the main chart's `context` to read its `xDomain`, then pass it as the overv :example{ component="LineChart" name="pan-zoom-with-overview" } +### Opening zoomed + +`initialDomain` starts the chart at a range rather than the full extent — restoring one saved between reloads, say: + +```svelte + +``` + +Prefer it to calling `zoomToBrush()` once the chart has mounted. Transform support is loaded lazily, so a zoom applied afterwards can only land once the chart has already painted — the full domain would show first. `initialDomain` is part of the first render. + +:example{ component="LineChart" name="persist-brush-zoom" } + ## Programmatic control Access the transform state via the chart context to control zoom/pan from code: @@ -496,10 +513,8 @@ The `TransformContextControls` component provides a UI overlay with zoom/pan but ```svelte - {#snippet children()} - - - {/snippet} + + ``` diff --git a/docs/src/examples/catalog/Area.json b/docs/src/examples/catalog/Area.json index 982652e584..edcc3d50e7 100644 --- a/docs/src/examples/catalog/Area.json +++ b/docs/src/examples/catalog/Area.json @@ -215,37 +215,37 @@ }, { "component": "Layer", - "lineNumber": 28, + "lineNumber": 29, "line": "" }, { "component": "Axis", - "lineNumber": 29, + "lineNumber": 30, "line": "" }, { "component": "Rule", - "lineNumber": 31, + "lineNumber": 32, "line": "" }, { "component": "RectClipPath", - "lineNumber": 32, + "lineNumber": 33, "line": "" }, { "component": "Area", - "lineNumber": 33, + "lineNumber": 34, "line": " 0} line={{ class: 'stroke-2 stroke-success' }} class=\"fill-success/20\" />" }, { "component": "Highlight", - "lineNumber": 43, + "lineNumber": 44, "line": "" }, { "component": "Tooltip", - "lineNumber": 46, + "lineNumber": 47, "line": "" } ] @@ -445,37 +445,37 @@ "components": [ { "component": "Chart", - "lineNumber": 27, + "lineNumber": 25, "line": "" }, { "component": "Axis", - "lineNumber": 42, + "lineNumber": 40, "line": "" }, { "component": "Area", - "lineNumber": 46, - "line": "" + "lineNumber": 42, + "line": "" }, { "component": "Labels", - "lineNumber": 48, + "lineNumber": 43, "line": "" }, { "component": "Highlight", - "lineNumber": 49, + "lineNumber": 44, "line": "" }, { "component": "Tooltip", - "lineNumber": 52, + "lineNumber": 47, "line": "" } ] @@ -981,14 +981,14 @@ "example": "highlight-color-based-on-value-using-color-scale", "component": "Area", "path": "/docs/components/Area/highlight-color-based-on-value-using-color-scale", - "lineNumber": 33, + "lineNumber": 34, "line": " 0} line={{ class: 'stroke-2 stroke-success' }} class=\"fill-success/20\" />" }, { "example": "highlight-color-based-on-value-using-color-scale", "component": "Area", "path": "/docs/components/Area/highlight-color-based-on-value-using-color-scale", - "lineNumber": 41, + "lineNumber": 42, "line": " 0} line={{ class: 'stroke-2 stroke-danger' }} class=\"fill-danger/20\" />" }, { @@ -1044,8 +1044,8 @@ "example": "multiple-series-with-labels", "component": "Area", "path": "/docs/components/Area/multiple-series-with-labels", - "lineNumber": 46, - "line": "" + "lineNumber": 42, + "line": "" }, { "example": "oscilloscope-ridgeline", @@ -1184,7 +1184,7 @@ "example": "series-stack-gradient", "component": "AreaChart", "path": "/docs/components/AreaChart/series-stack-gradient", - "lineNumber": 43, + "lineNumber": 42, "line": "" }, { @@ -1208,6 +1208,41 @@ "lineNumber": 36, "line": "" + }, + { + "example": "html", + "component": "Brush", + "path": "/docs/components/Brush/html", + "lineNumber": 43, + "line": "" + }, + { + "example": "programmatic", + "component": "Brush", + "path": "/docs/components/Brush/programmatic", + "lineNumber": 51, + "line": "" + }, + { + "example": "region", + "component": "Brush", + "path": "/docs/components/Brush/region", + "lineNumber": 46, + "line": "" + }, + { + "example": "vertical", + "component": "Brush", + "path": "/docs/components/Brush/vertical", + "lineNumber": 43, + "line": "" + }, { "example": "basic", "component": "BrushContext", @@ -1324,14 +1359,14 @@ "example": "separate-chart-(filter-data)", "component": "BrushContext", "path": "/docs/components/BrushContext/separate-chart-(filter-data)", - "lineNumber": 39, + "lineNumber": 36, "line": "" }, { @@ -1383,6 +1418,41 @@ "lineNumber": 29, "line": "" }, + { + "example": "facet-brush-overview", + "component": "Chart", + "path": "/docs/components/Chart/facet-brush-overview", + "lineNumber": 76, + "line": "" + }, + { + "example": "facet-wrap", + "component": "Chart", + "path": "/docs/components/Chart/facet-wrap", + "lineNumber": 68, + "line": "" + }, + { + "example": "synced-brushes", + "component": "ChartGroup", + "path": "/docs/components/ChartGroup/synced-brushes", + "lineNumber": 69, + "line": "" + }, + { + "example": "synced-brushes", + "component": "ChartGroup", + "path": "/docs/components/ChartGroup/synced-brushes", + "lineNumber": 78, + "line": "" }, { @@ -1552,5 +1622,5 @@ "line": "" } ] @@ -842,6 +854,13 @@ "lineNumber": 29, "line": "" + }, { "example": "basic", "component": "Threshold", @@ -1004,5 +1030,5 @@ "line": "" + }, + { + "component": "Layer", + "lineNumber": 19, + "line": "" + }, + { + "component": "Axis", + "lineNumber": 20, + "line": "" + } + ] } ], "usage": [ @@ -993,14 +1015,14 @@ "example": "highlight-color-based-on-value-using-color-scale", "component": "Area", "path": "/docs/components/Area/highlight-color-based-on-value-using-color-scale", - "lineNumber": 29, + "lineNumber": 30, "line": "" }, { "example": "highlight-color-based-on-value-using-color-scale", "component": "Area", "path": "/docs/components/Area/highlight-color-based-on-value-using-color-scale", - "lineNumber": 30, + "lineNumber": 31, "line": "" }, { @@ -1063,14 +1085,14 @@ "example": "multiple-series-with-labels", "component": "Area", "path": "/docs/components/Area/multiple-series-with-labels", - "lineNumber": 42, + "lineNumber": 40, "line": "" }, { "example": "multiple-series-with-labels", "component": "Area", "path": "/docs/components/Area/multiple-series-with-labels", - "lineNumber": 43, + "lineNumber": 41, "line": "" }, { @@ -1724,6 +1746,20 @@ "lineNumber": 115, "line": "" + }, + { + "example": "utc-scale", + "component": "Axis", + "path": "/docs/components/Axis/utc-scale", + "lineNumber": 33, + "line": "" + }, { "example": "company-race", "component": "BarChart", @@ -2823,6 +2859,90 @@ "lineNumber": 63, "line": "" }, + { + "example": "basic", + "component": "Brush", + "path": "/docs/components/Brush/basic", + "lineNumber": 41, + "line": "" + }, + { + "example": "basic", + "component": "Brush", + "path": "/docs/components/Brush/basic", + "lineNumber": 42, + "line": "" + }, + { + "example": "html", + "component": "Brush", + "path": "/docs/components/Brush/html", + "lineNumber": 41, + "line": "" + }, + { + "example": "html", + "component": "Brush", + "path": "/docs/components/Brush/html", + "lineNumber": 42, + "line": "" + }, + { + "example": "programmatic", + "component": "Brush", + "path": "/docs/components/Brush/programmatic", + "lineNumber": 49, + "line": "" + }, + { + "example": "programmatic", + "component": "Brush", + "path": "/docs/components/Brush/programmatic", + "lineNumber": 50, + "line": "" + }, + { + "example": "region", + "component": "Brush", + "path": "/docs/components/Brush/region", + "lineNumber": 44, + "line": "" + }, + { + "example": "region", + "component": "Brush", + "path": "/docs/components/Brush/region", + "lineNumber": 45, + "line": "" + }, + { + "example": "two-dimensional", + "component": "Brush", + "path": "/docs/components/Brush/two-dimensional", + "lineNumber": 40, + "line": "" + }, + { + "example": "two-dimensional", + "component": "Brush", + "path": "/docs/components/Brush/two-dimensional", + "lineNumber": 41, + "line": "" + }, + { + "example": "vertical", + "component": "Brush", + "path": "/docs/components/Brush/vertical", + "lineNumber": 41, + "line": "" + }, + { + "example": "vertical", + "component": "Brush", + "path": "/docs/components/Brush/vertical", + "lineNumber": 42, + "line": "" + }, { "example": "flame-chart", "component": "BrushContext", @@ -2939,14 +3059,14 @@ "example": "selection", "component": "BrushContext", "path": "/docs/components/BrushContext/selection", - "lineNumber": 40, + "lineNumber": 24, "line": "" }, { "example": "selection", "component": "BrushContext", "path": "/docs/components/BrushContext/selection", - "lineNumber": 41, + "lineNumber": 25, "line": "" }, { @@ -2981,14 +3101,14 @@ "example": "separate-chart-(filter-data)", "component": "BrushContext", "path": "/docs/components/BrushContext/separate-chart-(filter-data)", - "lineNumber": 35, + "lineNumber": 32, "line": "" }, { "example": "separate-chart-(filter-data)", "component": "BrushContext", "path": "/docs/components/BrushContext/separate-chart-(filter-data)", - "lineNumber": 36, + "lineNumber": 33, "line": "" }, { @@ -3149,16 +3269,100 @@ "example": "compound-separate-scales-with-stacked-charts-with-inverted-range-top-down", "component": "Chart", "path": "/docs/components/Chart/compound-separate-scales-with-stacked-charts-with-inverted-range-top-down", - "lineNumber": 69, + "lineNumber": 68, "line": "" }, { "example": "compound-separate-scales-with-stacked-charts-with-inverted-range-top-down", "component": "Chart", "path": "/docs/components/Chart/compound-separate-scales-with-stacked-charts-with-inverted-range-top-down", - "lineNumber": 71, + "lineNumber": 70, "line": "" + }, + { + "example": "facet-composed", + "component": "Chart", + "path": "/docs/components/Chart/facet-composed", + "lineNumber": 28, + "line": "" + }, + { + "example": "facet-tooltip", + "component": "Chart", + "path": "/docs/components/Chart/facet-tooltip", + "lineNumber": 29, + "line": "" + }, + { + "example": "facet-tooltip", + "component": "Chart", + "path": "/docs/components/Chart/facet-tooltip", + "lineNumber": 30, + "line": "" + }, + { + "example": "mixed-marks-with-stack", + "component": "Chart", + "path": "/docs/components/Chart/mixed-marks-with-stack", + "lineNumber": 38, + "line": "" + }, + { + "example": "mixed-marks-with-stack", + "component": "Chart", + "path": "/docs/components/Chart/mixed-marks-with-stack", + "lineNumber": 39, + "line": "" + }, + { + "example": "mixed-marks-with-stack-long-data", + "component": "Chart", + "path": "/docs/components/Chart/mixed-marks-with-stack-long-data", + "lineNumber": 58, + "line": "" + }, + { + "example": "mixed-marks-with-stack-long-data", + "component": "Chart", + "path": "/docs/components/Chart/mixed-marks-with-stack-long-data", + "lineNumber": 59, + "line": "" + }, + { + "example": "minimap", + "component": "ChartGroup", + "path": "/docs/components/ChartGroup/minimap", + "lineNumber": 46, + "line": "" + }, + { + "example": "minimap", + "component": "ChartGroup", + "path": "/docs/components/ChartGroup/minimap", + "lineNumber": 47, + "line": "" + }, + { + "example": "synced-brushes", + "component": "ChartGroup", + "path": "/docs/components/ChartGroup/synced-brushes", + "lineNumber": 60, + "line": "" + }, + { + "example": "synced-brushes", + "component": "ChartGroup", + "path": "/docs/components/ChartGroup/synced-brushes", + "lineNumber": 61, + "line": "" + }, { "example": "color-via-ordinal-scale", "component": "Circle", @@ -4563,16 +4767,58 @@ "example": "multiple-series-with-labels", "component": "Spline", "path": "/docs/components/Spline/multiple-series-with-labels", - "lineNumber": 41, + "lineNumber": 38, "line": "" }, { "example": "multiple-series-with-labels", "component": "Spline", "path": "/docs/components/Spline/multiple-series-with-labels", - "lineNumber": 42, + "lineNumber": 39, "line": "" }, + { + "example": "parallel-coordinates", + "component": "Spline", + "path": "/docs/components/Spline/parallel-coordinates", + "lineNumber": 63, + "line": " dimensions[d as keyof typeof dimensions]} tickLength={0} />" + }, + { + "example": "parallel-coordinates-faceted", + "component": "Spline", + "path": "/docs/components/Spline/parallel-coordinates-faceted", + "lineNumber": 67, + "line": " dimensions[d as keyof typeof dimensions]} tickLength={0} />" + }, + { + "example": "parallel-coordinates-mixed", + "component": "Spline", + "path": "/docs/components/Spline/parallel-coordinates-mixed", + "lineNumber": 94, + "line": "" }, { "example": "radial-multi-year-lines", "component": "Spline", "path": "/docs/components/Spline/radial-multi-year-lines", - "lineNumber": 46, + "lineNumber": 41, "line": "" }, + { + "example": "stroke-grouping-with-legend", + "component": "Spline", + "path": "/docs/components/Spline/stroke-grouping-with-legend", + "lineNumber": 37, + "line": "" + }, + { + "example": "stroke-grouping-with-legend", + "component": "Spline", + "path": "/docs/components/Spline/stroke-grouping-with-legend", + "lineNumber": 38, + "line": "" + }, { "example": "tween-on-mount", "component": "Spline", @@ -5218,5 +5478,5 @@ "line": "" }, + { + "example": "group-long-data", + "component": "BarChart", + "path": "/docs/components/BarChart/group-long-data", + "lineNumber": 13, + "line": "" }, + { + "example": "mixed-marks-with-stack", + "component": "Chart", + "path": "/docs/components/Chart/mixed-marks-with-stack", + "lineNumber": 42, + "line": "" + }, + { + "example": "mixed-marks-with-stack-long-data", + "component": "Chart", + "path": "/docs/components/Chart/mixed-marks-with-stack-long-data", + "lineNumber": 61, + "line": "" + }, { "example": "candlestick-with-brushing", "component": "Rule", @@ -2829,5 +2843,5 @@ "line": "" } ], - "updatedAt": "2026-07-22T16:53:01.231Z" + "updatedAt": "2026-08-19T19:59:25.469Z" } \ No newline at end of file diff --git a/docs/src/examples/catalog/BarsStackTestHarness.json b/docs/src/examples/catalog/BarsStackTestHarness.json new file mode 100644 index 0000000000..aafe3a034b --- /dev/null +++ b/docs/src/examples/catalog/BarsStackTestHarness.json @@ -0,0 +1,6 @@ +{ + "component": "BarsStackTestHarness", + "examples": [], + "usage": [], + "updatedAt": "2026-08-19T15:41:27.014Z" +} \ No newline at end of file diff --git a/docs/src/examples/catalog/Brush.json b/docs/src/examples/catalog/Brush.json new file mode 100644 index 0000000000..67e252d394 --- /dev/null +++ b/docs/src/examples/catalog/Brush.json @@ -0,0 +1,275 @@ +{ + "component": "Brush", + "examples": [ + { + "name": "basic", + "title": "basic", + "path": "/docs/components/Brush/basic", + "components": [ + { + "component": "Chart", + "lineNumber": 32, + "line": "" + }, + { + "component": "Axis", + "lineNumber": 41, + "line": "" + }, + { + "component": "Area", + "lineNumber": 43, + "line": "" + }, + { + "component": "Brush", + "lineNumber": 44, + "line": "" + } + ] + }, + { + "name": "html", + "title": "html", + "path": "/docs/components/Brush/html", + "components": [ + { + "component": "Chart", + "lineNumber": 32, + "line": "" + }, + { + "component": "Axis", + "lineNumber": 41, + "line": "" + }, + { + "component": "Area", + "lineNumber": 43, + "line": "" + }, + { + "component": "Brush", + "lineNumber": 48, + "line": "" + } + ] + }, + { + "name": "programmatic", + "title": "programmatic", + "path": "/docs/components/Brush/programmatic", + "components": [ + { + "component": "Chart", + "lineNumber": 40, + "line": "" + }, + { + "component": "Axis", + "lineNumber": 49, + "line": "" + }, + { + "component": "Area", + "lineNumber": 51, + "line": "" + }, + { + "component": "Brush", + "lineNumber": 52, + "line": "" + } + ] + }, + { + "name": "region", + "title": "region", + "path": "/docs/components/Brush/region", + "components": [ + { + "component": "Chart", + "lineNumber": 34, + "line": "" + }, + { + "component": "Axis", + "lineNumber": 44, + "line": "" + }, + { + "component": "Area", + "lineNumber": 46, + "line": "" + }, + { + "component": "Brush", + "lineNumber": 53, + "line": "" + }, + { + "component": "Axis", + "lineNumber": 40, + "line": "" + }, + { + "component": "Points", + "lineNumber": 43, + "line": "" + }, + { + "component": "Circle", + "lineNumber": 48, + "line": "" + } + ] + }, + { + "name": "vertical", + "title": "vertical", + "path": "/docs/components/Brush/vertical", + "components": [ + { + "component": "Chart", + "lineNumber": 32, + "line": "" + }, + { + "component": "Axis", + "lineNumber": 41, + "line": "" + }, + { + "component": "Area", + "lineNumber": 43, + "line": "" + }, + { + "component": "Brush", + "lineNumber": 44, + "line": "" + } + ] + } + ], + "usage": [ + { + "example": "basic", + "component": "Brush", + "path": "/docs/components/Brush/basic", + "lineNumber": 44, + "line": "" + }, + { + "example": "html", + "component": "Brush", + "path": "/docs/components/Brush/html", + "lineNumber": 48, + "line": "" + }, + { + "example": "programmatic", + "component": "Brush", + "path": "/docs/components/Brush/programmatic", + "lineNumber": 52, + "line": "" + }, + { + "example": "region", + "component": "Brush", + "path": "/docs/components/Brush/region", + "lineNumber": 53, + "line": "" + }, + { + "example": "vertical", + "component": "Brush", + "path": "/docs/components/Brush/vertical", + "lineNumber": 44, + "line": "" + }, + { + "example": "parallel-coordinates-brush", + "component": "Spline", + "path": "/docs/components/Spline/parallel-coordinates-brush", + "lineNumber": 33, + "line": "// One selection per dimension, each owned by its `` below and read back here" + }, + { + "example": "parallel-coordinates-brush", + "component": "Spline", + "path": "/docs/components/Spline/parallel-coordinates-brush", + "lineNumber": 93, + "line": "` below and read back here" + }, + { + "example": "parallel-coordinates-mixed", + "component": "Spline", + "path": "/docs/components/Spline/parallel-coordinates-mixed", + "lineNumber": 101, + "line": "" }, { "component": "Axis", - "lineNumber": 40, + "lineNumber": 24, "line": "" }, { "component": "Points", - "lineNumber": 43, + "lineNumber": 27, "line": "" }, { "component": "Circle", - "lineNumber": 52, + "lineNumber": 32, "line": "" }, { "component": "Axis", - "lineNumber": 35, + "lineNumber": 32, "line": "" }, { "component": "LinearGradient", - "lineNumber": 37, + "lineNumber": 34, "line": "" }, { "component": "Area", - "lineNumber": 39, + "lineNumber": 36, "line": "" }, { "component": "Tooltip", - "lineNumber": 84, + "lineNumber": 83, "line": "" } ] @@ -226,7 +226,7 @@ }, { "component": "Spline", - "lineNumber": 24, + "lineNumber": 25, "line": "" } ] @@ -247,6 +247,511 @@ "line": "" } ] + }, + { + "name": "facet-annotation", + "title": "facet annotation", + "path": "/docs/components/Chart/facet-annotation", + "components": [ + { + "component": "BarChart", + "lineNumber": 24, + "line": "" + }, + { + "component": "Text", + "lineNumber": 41, + "line": "" + }, + { + "component": "Circle", + "lineNumber": 44, + "line": "" + }, + { + "component": "LineChart", + "lineNumber": 51, + "line": "" + }, + { + "component": "Area", + "lineNumber": 76, + "line": "" + } + ] + }, + { + "name": "facet-brush-summary", + "title": "facet brush summary", + "path": "/docs/components/Chart/facet-brush-summary", + "components": [ + { + "component": "ChartGroup", + "lineNumber": 34, + "line": "" + }, + { + "component": "Chart", + "lineNumber": 44, + "line": "" + }, + { + "component": "Circle", + "lineNumber": 65, + "line": "" + } + ] + }, + { + "name": "facet-composed", + "title": "facet composed", + "path": "/docs/components/Chart/facet-composed", + "components": [ + { + "component": "Chart", + "lineNumber": 13, + "line": "" + }, + { + "component": "FacetAxis", + "lineNumber": 25, + "line": "" + }, + { + "component": "Grid", + "lineNumber": 26, + "line": "" + }, + { + "component": "Axis", + "lineNumber": 27, + "line": "" + }, + { + "component": "Rule", + "lineNumber": 29, + "line": "" + }, + { + "component": "Circle", + "lineNumber": 30, + "line": "" + } + ] + }, + { + "name": "facet-non-faceted-marks", + "title": "facet non faceted marks", + "path": "/docs/components/Chart/facet-non-faceted-marks", + "components": [ + { + "component": "Chart", + "lineNumber": 13, + "line": "" + }, + { + "component": "Circle", + "lineNumber": 29, + "line": "" + }, + { + "component": "FacetAxis", + "lineNumber": 27, + "line": "" + }, + { + "component": "Grid", + "lineNumber": 28, + "line": "" + }, + { + "component": "Axis", + "lineNumber": 29, + "line": "" + }, + { + "component": "Circle", + "lineNumber": 31, + "line": "" + }, + { + "component": "Highlight", + "lineNumber": 32, + "line": "" + }, + { + "component": "Tooltip", + "lineNumber": 35, + "line": "" + } + ] + }, + { + "name": "facet-two-dimensional", + "title": "facet two dimensional", + "path": "/docs/components/Chart/facet-two-dimensional", + "components": [ + { + "component": "Chart", + "lineNumber": 15, + "line": "" + }, + { + "component": "Circle", + "lineNumber": 30, + "line": "" + }, + { + "component": "Area", + "lineNumber": 68, + "line": "" + }, + { + "component": "Axis", + "lineNumber": 38, + "line": "" + }, + { + "component": "Bars", + "lineNumber": 42, + "line": "" + }, + { + "component": "Spline", + "lineNumber": 46, + "line": "" + }, + { + "component": "Legend", + "lineNumber": 55, + "line": "" + }, + { + "component": "Tooltip", + "lineNumber": 57, + "line": "" + } + ] + }, + { + "name": "mixed-marks-with-stack-long-data", + "title": "mixed marks with stack long data", + "path": "/docs/components/Chart/mixed-marks-with-stack-long-data", + "components": [ + { + "component": "Chart", + "lineNumber": 44, + "line": "" + }, + { + "component": "Axis", + "lineNumber": 58, + "line": "" + }, + { + "component": "Bars", + "lineNumber": 61, + "line": "" + }, + { + "component": "Spline", + "lineNumber": 64, + "line": "" + }, + { + "component": "Legend", + "lineNumber": 74, + "line": "" + }, + { + "component": "Tooltip", + "lineNumber": 76, + "line": "" + } + ] } ], "usage": [ @@ -436,7 +941,7 @@ "example": "multiple-series-with-labels", "component": "Area", "path": "/docs/components/Area/multiple-series-with-labels", - "lineNumber": 27, + "lineNumber": 25, "line": "" + }, + { + "example": "utc-scale", + "component": "Axis", + "path": "/docs/components/Axis/utc-scale", + "lineNumber": 31, + "line": "" + }, { "example": "company-race", "component": "BarChart", @@ -1405,6 +1924,48 @@ "lineNumber": 50, "line": "" }, { "example": "simple-styling", @@ -1755,6 +2316,160 @@ "lineNumber": 23, "line": "" + }, { "example": "basic", "component": "Chord", @@ -2914,7 +3629,7 @@ "example": "persist-brush-zoom", "component": "LineChart", "path": "/docs/components/LineChart/persist-brush-zoom", - "lineNumber": 63, + "lineNumber": 64, "line": "" }, + { + "example": "stroke-grouping-with-legend", + "component": "Spline", + "path": "/docs/components/Spline/stroke-grouping-with-legend", + "lineNumber": 26, + "line": "" }, + { + "example": "minimap", + "component": "ChartGroup", + "path": "/docs/components/ChartGroup/minimap", + "lineNumber": 48, + "line": "" + }, + { + "example": "synced-brushes", + "component": "ChartGroup", + "path": "/docs/components/ChartGroup/synced-brushes", + "lineNumber": 63, + "line": "" + }, { "example": "weighted", "component": "Density", @@ -143,5 +157,5 @@ "line": "" } ], - "updatedAt": "2026-07-22T16:53:01.664Z" + "updatedAt": "2026-08-20T17:01:01.371Z" } \ No newline at end of file diff --git a/docs/src/examples/catalog/ChartGroup.json b/docs/src/examples/catalog/ChartGroup.json new file mode 100644 index 0000000000..96f8f4b8ab --- /dev/null +++ b/docs/src/examples/catalog/ChartGroup.json @@ -0,0 +1,306 @@ +{ + "component": "ChartGroup", + "examples": [ + { + "name": "basic", + "title": "basic", + "path": "/docs/components/ChartGroup/basic", + "components": [ + { + "component": "ChartGroup", + "lineNumber": 26, + "line": "" + }, + { + "component": "LineChart", + "lineNumber": 31, + "line": "" + }, + { + "component": "LineChart", + "lineNumber": 21, + "line": "" + }, + { + "component": "Area", + "lineNumber": 47, + "line": "" + } + ] + }, + { + "name": "faceted-group", + "title": "faceted group", + "path": "/docs/components/ChartGroup/faceted-group", + "components": [ + { + "component": "ChartGroup", + "lineNumber": 42, + "line": "" + }, + { + "component": "LineChart", + "lineNumber": 46, + "line": "" + } + ] + }, + { + "name": "highlight-only", + "title": "highlight only", + "path": "/docs/components/ChartGroup/highlight-only", + "components": [ + { + "component": "ChartGroup", + "lineNumber": 29, + "line": "" + }, + { + "component": "LineChart", + "lineNumber": 36, + "line": "" + }, + { + "component": "Chart", + "lineNumber": 36, + "line": "" + }, + { + "component": "Axis", + "lineNumber": 46, + "line": "" + }, + { + "component": "ChartClipPath", + "lineNumber": 48, + "line": "" + }, + { + "component": "Points", + "lineNumber": 49, + "line": "" + }, + { + "component": "Circle", + "lineNumber": 70, + "line": "" + }, + { + "component": "Chart", + "lineNumber": 50, + "line": "" + }, + { + "component": "Axis", + "lineNumber": 60, + "line": "" + }, + { + "component": "Rule", + "lineNumber": 62, + "line": "" + }, + { + "component": "ChartClipPath", + "lineNumber": 63, + "line": "" + }, + { + "component": "LinearGradient", + "lineNumber": 64, + "line": "" + } + ] + }, + { + "name": "synced-legend", + "title": "synced legend", + "path": "/docs/components/ChartGroup/synced-legend", + "components": [ + { + "component": "ChartGroup", + "lineNumber": 23, + "line": "" + }, + { + "component": "LineChart", + "lineNumber": 25, + "line": "" + }, + { + "component": "AreaChart", + "lineNumber": 26, + "line": "" + } + ] + }, + { + "name": "synced-zoom", + "title": "synced zoom", + "path": "/docs/components/ChartGroup/synced-zoom", + "components": [ + { + "component": "ChartGroup", + "lineNumber": 27, + "line": "" + }, + { + "component": "LineChart", + "lineNumber": 32, + "line": "" + }, + { + "example": "facet-brush-summary", + "component": "Chart", + "path": "/docs/components/Chart/facet-brush-summary", + "lineNumber": 34, + "line": "" + }, + { + "example": "basic", + "component": "ChartGroup", + "path": "/docs/components/ChartGroup/basic", + "lineNumber": 26, + "line": "" + }, + { + "example": "coordinated-views", + "component": "ChartGroup", + "path": "/docs/components/ChartGroup/coordinated-views", + "lineNumber": 16, + "line": "" + }, + { + "example": "faceted-group", + "component": "ChartGroup", + "path": "/docs/components/ChartGroup/faceted-group", + "lineNumber": 42, + "line": "" + }, + { + "example": "highlight-only", + "component": "ChartGroup", + "path": "/docs/components/ChartGroup/highlight-only", + "lineNumber": 29, + "line": "" + }, + { + "example": "minimap", + "component": "ChartGroup", + "path": "/docs/components/ChartGroup/minimap", + "lineNumber": 24, + "line": "" + }, + { + "example": "synced-brushes", + "component": "ChartGroup", + "path": "/docs/components/ChartGroup/synced-brushes", + "lineNumber": 44, + "line": "" + }, + { + "example": "synced-legend", + "component": "ChartGroup", + "path": "/docs/components/ChartGroup/synced-legend", + "lineNumber": 23, + "line": "" + }, + { + "example": "synced-zoom", + "component": "ChartGroup", + "path": "/docs/components/ChartGroup/synced-zoom", + "lineNumber": 27, + "line": "" + } + ], + "updatedAt": "2026-08-20T17:01:01.416Z" +} \ No newline at end of file diff --git a/docs/src/examples/catalog/ChartGroupTestHarness.json b/docs/src/examples/catalog/ChartGroupTestHarness.json new file mode 100644 index 0000000000..ed0039579b --- /dev/null +++ b/docs/src/examples/catalog/ChartGroupTestHarness.json @@ -0,0 +1,6 @@ +{ + "component": "ChartGroupTestHarness", + "examples": [], + "usage": [], + "updatedAt": "2026-08-14T18:32:52.574Z" +} \ No newline at end of file diff --git a/docs/src/examples/catalog/ChartWithMarkSeries.json b/docs/src/examples/catalog/ChartWithMarkSeries.json new file mode 100644 index 0000000000..5531c73e04 --- /dev/null +++ b/docs/src/examples/catalog/ChartWithMarkSeries.json @@ -0,0 +1,6 @@ +{ + "component": "ChartWithMarkSeries", + "examples": [], + "usage": [], + "updatedAt": "2026-08-19T20:49:33.235Z" +} \ No newline at end of file diff --git a/docs/src/examples/catalog/Circle.json b/docs/src/examples/catalog/Circle.json index 9f3f311597..91d849478f 100644 --- a/docs/src/examples/catalog/Circle.json +++ b/docs/src/examples/catalog/Circle.json @@ -268,18 +268,25 @@ "lineNumber": 39, "line": "" }, + { + "example": "facet-brush", + "component": "Chart", + "path": "/docs/components/Chart/facet-brush", + "lineNumber": 44, + "line": "" + }, + { + "example": "facet-composed", + "component": "Chart", + "path": "/docs/components/Chart/facet-composed", + "lineNumber": 30, + "line": "" + }, + { + "example": "facet-two-dimensional", + "component": "Chart", + "path": "/docs/components/Chart/facet-two-dimensional", + "lineNumber": 30, + "line": "" } ], - "updatedAt": "2026-08-06T13:53:32.076Z" + "updatedAt": "2026-08-20T12:48:38.692Z" } \ No newline at end of file diff --git a/docs/src/examples/catalog/Dodge.json b/docs/src/examples/catalog/Dodge.json index 0fff25681c..24b56daa9c 100644 --- a/docs/src/examples/catalog/Dodge.json +++ b/docs/src/examples/catalog/Dodge.json @@ -126,17 +126,17 @@ }, { "component": "Dodge", - "lineNumber": 37, + "lineNumber": 38, "line": "" } ] @@ -153,17 +153,17 @@ }, { "component": "Dodge", - "lineNumber": 36, + "lineNumber": 37, "line": "" } ] @@ -411,14 +411,14 @@ "example": "grouped-horizontal", "component": "Dodge", "path": "/docs/components/Dodge/grouped-horizontal", - "lineNumber": 37, + "lineNumber": 38, "line": "" } ], - "updatedAt": "2026-05-05T17:35:59.733Z" + "updatedAt": "2026-08-19T19:59:26.098Z" } \ No newline at end of file diff --git a/docs/src/examples/catalog/Ellipse.json b/docs/src/examples/catalog/Ellipse.json index 75ef2f551f..886b91d533 100644 --- a/docs/src/examples/catalog/Ellipse.json +++ b/docs/src/examples/catalog/Ellipse.json @@ -279,9 +279,9 @@ "example": "custom-symbol", "component": "Waffle", "path": "/docs/components/Waffle/custom-symbol", - "lineNumber": 53, + "lineNumber": 52, "line": "" + }, + { + "example": "facet-tooltip", + "component": "Chart", + "path": "/docs/components/Chart/facet-tooltip", + "lineNumber": 27, + "line": "" + } + ], + "updatedAt": "2026-08-20T12:48:38.992Z" +} \ No newline at end of file diff --git a/docs/src/examples/catalog/FacetPanel.json b/docs/src/examples/catalog/FacetPanel.json new file mode 100644 index 0000000000..c588d3fc49 --- /dev/null +++ b/docs/src/examples/catalog/FacetPanel.json @@ -0,0 +1,6 @@ +{ + "component": "FacetPanel", + "examples": [], + "usage": [], + "updatedAt": "2026-08-16T02:36:12.574Z" +} \ No newline at end of file diff --git a/docs/src/examples/catalog/Frame.json b/docs/src/examples/catalog/Frame.json index b928b73abe..5c2b6b94e6 100644 --- a/docs/src/examples/catalog/Frame.json +++ b/docs/src/examples/catalog/Frame.json @@ -116,6 +116,34 @@ } ], "usage": [ + { + "example": "facet-annotation", + "component": "Chart", + "path": "/docs/components/Chart/facet-annotation", + "lineNumber": 39, + "line": "" + }, + { + "example": "facet-non-faceted-marks", + "component": "Chart", + "path": "/docs/components/Chart/facet-non-faceted-marks", + "lineNumber": 27, + "line": "" + }, + { + "example": "facet-two-dimensional", + "component": "Chart", + "path": "/docs/components/Chart/facet-two-dimensional", + "lineNumber": 29, + "line": "" + }, + { + "example": "facet-wrap", + "component": "Chart", + "path": "/docs/components/Chart/facet-wrap", + "lineNumber": 67, + "line": "" + }, { "example": "basic", "component": "ClipPath", @@ -173,5 +201,5 @@ "line": "" } ], - "updatedAt": "2026-04-16T17:46:59.073Z" + "updatedAt": "2026-08-19T14:28:18.858Z" } \ No newline at end of file diff --git a/docs/src/examples/catalog/GeoPath.json b/docs/src/examples/catalog/GeoPath.json index eb002cd215..6c9b571510 100644 --- a/docs/src/examples/catalog/GeoPath.json +++ b/docs/src/examples/catalog/GeoPath.json @@ -459,17 +459,17 @@ }, { "component": "Layer", - "lineNumber": 38, + "lineNumber": 37, "line": "" }, { "component": "GeoPath", - "lineNumber": 39, + "lineNumber": 38, "line": "" }, { "component": "Graticule", - "lineNumber": 40, + "lineNumber": 39, "line": "" } ] @@ -486,17 +486,17 @@ }, { "component": "Layer", - "lineNumber": 52, + "lineNumber": 51, "line": "" }, { "component": "GeoPath", - "lineNumber": 53, + "lineNumber": 52, "line": "" }, { "component": "Graticule", - "lineNumber": 54, + "lineNumber": 53, "line": "" } ] @@ -1114,28 +1114,28 @@ "example": "transform-globe-constrain", "component": "GeoPath", "path": "/docs/components/GeoPath/transform-globe-constrain", - "lineNumber": 39, + "lineNumber": 38, "line": "" }, { "example": "transform-globe-constrain", "component": "GeoPath", "path": "/docs/components/GeoPath/transform-globe-constrain", - "lineNumber": 42, + "lineNumber": 41, "line": "" }, { "example": "transform-globe-inertia", "component": "GeoPath", "path": "/docs/components/GeoPath/transform-globe-inertia", - "lineNumber": 53, + "lineNumber": 52, "line": "" }, { "example": "transform-globe-inertia", "component": "GeoPath", "path": "/docs/components/GeoPath/transform-globe-inertia", - "lineNumber": 56, + "lineNumber": 55, "line": "" }, { @@ -1608,5 +1608,5 @@ "line": "" }, { "example": "transform-globe-inertia", "component": "GeoPath", "path": "/docs/components/GeoPath/transform-globe-inertia", - "lineNumber": 54, + "lineNumber": 53, "line": "" }, { @@ -239,5 +239,5 @@ "line": "" } ], - "updatedAt": "2026-08-06T14:44:37.980Z" + "updatedAt": "2026-08-20T07:29:18.736Z" } \ No newline at end of file diff --git a/docs/src/examples/catalog/Grid.json b/docs/src/examples/catalog/Grid.json index 47be460907..a5216c403f 100644 --- a/docs/src/examples/catalog/Grid.json +++ b/docs/src/examples/catalog/Grid.json @@ -360,6 +360,20 @@ "lineNumber": 30, "line": "" }, + { + "example": "facet-composed", + "component": "Chart", + "path": "/docs/components/Chart/facet-composed", + "lineNumber": 26, + "line": "" + }, + { + "example": "facet-tooltip", + "component": "Chart", + "path": "/docs/components/Chart/facet-tooltip", + "lineNumber": 28, + "line": "" + }, { "example": "band-scale-between", "component": "Grid", @@ -459,5 +473,5 @@ "line": "" } ], - "updatedAt": "2026-04-17T14:32:26.956Z" + "updatedAt": "2026-08-20T12:48:39.521Z" } \ No newline at end of file diff --git a/docs/src/examples/catalog/Group.json b/docs/src/examples/catalog/Group.json index 533385b407..8487372ad6 100644 --- a/docs/src/examples/catalog/Group.json +++ b/docs/src/examples/catalog/Group.json @@ -336,6 +336,34 @@ "lineNumber": 34, "line": "" }, + { + "example": "parallel-coordinates", + "component": "Spline", + "path": "/docs/components/Spline/parallel-coordinates", + "lineNumber": 62, + "line": "" + }, + { + "example": "parallel-coordinates-brush", + "component": "Spline", + "path": "/docs/components/Spline/parallel-coordinates-brush", + "lineNumber": 79, + "line": "" + }, + { + "example": "parallel-coordinates-faceted", + "component": "Spline", + "path": "/docs/components/Spline/parallel-coordinates-faceted", + "lineNumber": 65, + "line": "" + }, + { + "example": "parallel-coordinates-mixed", + "component": "Spline", + "path": "/docs/components/Spline/parallel-coordinates-mixed", + "lineNumber": 93, + "line": "" + }, { "example": "basic", "component": "Tree", @@ -347,7 +375,7 @@ "example": "html-nodes", "component": "Tree", "path": "/docs/components/Tree/html-nodes", - "lineNumber": 96, + "lineNumber": 95, "line": "" }, { @@ -69,7 +69,7 @@ "example": "multiple-series-with-labels", "component": "Area", "path": "/docs/components/Area/multiple-series-with-labels", - "lineNumber": 49, + "lineNumber": 44, "line": "" }, { @@ -366,6 +366,27 @@ "lineNumber": 56, "line": "" }, + { + "example": "facet-tooltip", + "component": "Chart", + "path": "/docs/components/Chart/facet-tooltip", + "lineNumber": 32, + "line": "" + }, + { + "example": "mixed-marks-with-stack", + "component": "Chart", + "path": "/docs/components/Chart/mixed-marks-with-stack", + "lineNumber": 52, + "line": "" + }, + { + "example": "mixed-marks-with-stack-long-data", + "component": "Chart", + "path": "/docs/components/Chart/mixed-marks-with-stack-long-data", + "lineNumber": 71, + "line": "" + }, { "example": "custom", "component": "LineChart", @@ -489,7 +510,7 @@ "example": "multiple-series-with-labels", "component": "Spline", "path": "/docs/components/Spline/multiple-series-with-labels", - "lineNumber": 48, + "lineNumber": 42, "line": "" }, { @@ -661,5 +682,5 @@ "line": "" } ], - "updatedAt": "2026-04-30T15:36:25.764Z" + "updatedAt": "2026-08-20T12:48:39.570Z" } \ No newline at end of file diff --git a/docs/src/examples/catalog/Labels.json b/docs/src/examples/catalog/Labels.json index cda6804df5..aa9c678221 100644 --- a/docs/src/examples/catalog/Labels.json +++ b/docs/src/examples/catalog/Labels.json @@ -71,7 +71,7 @@ "example": "multiple-series-with-labels", "component": "Area", "path": "/docs/components/Area/multiple-series-with-labels", - "lineNumber": 48, + "lineNumber": 43, "line": "" }, { @@ -155,7 +155,7 @@ "example": "multiple-series-with-labels", "component": "Spline", "path": "/docs/components/Spline/multiple-series-with-labels", - "lineNumber": 47, + "lineNumber": 41, "line": "" }, { @@ -166,5 +166,5 @@ "line": "" } ], - "updatedAt": "2026-08-06T13:53:34.276Z" + "updatedAt": "2026-08-20T07:29:18.899Z" } \ No newline at end of file diff --git a/docs/src/examples/catalog/Layer.json b/docs/src/examples/catalog/Layer.json index 4a98a66bfb..558ace37db 100644 --- a/docs/src/examples/catalog/Layer.json +++ b/docs/src/examples/catalog/Layer.json @@ -216,7 +216,7 @@ "example": "highlight-color-based-on-value-using-color-scale", "component": "Area", "path": "/docs/components/Area/highlight-color-based-on-value-using-color-scale", - "lineNumber": 28, + "lineNumber": 29, "line": "" }, { @@ -251,7 +251,7 @@ "example": "multiple-series-with-labels", "component": "Area", "path": "/docs/components/Area/multiple-series-with-labels", - "lineNumber": 41, + "lineNumber": 39, "line": "" }, { @@ -646,6 +646,20 @@ "lineNumber": 114, "line": "" }, + { + "example": "utc-scale", + "component": "Axis", + "path": "/docs/components/Axis/utc-scale", + "lineNumber": 19, + "line": "" + }, + { + "example": "utc-scale", + "component": "Axis", + "path": "/docs/components/Axis/utc-scale", + "lineNumber": 32, + "line": "" + }, { "example": "company-race", "component": "BarChart", @@ -1199,6 +1213,55 @@ "lineNumber": 61, "line": "" }, + { + "example": "basic", + "component": "Brush", + "path": "/docs/components/Brush/basic", + "lineNumber": 40, + "line": "" + }, + { + "example": "html", + "component": "Brush", + "path": "/docs/components/Brush/html", + "lineNumber": 40, + "line": "" + }, + { + "example": "html", + "component": "Brush", + "path": "/docs/components/Brush/html", + "lineNumber": 47, + "line": "" + }, + { + "example": "programmatic", + "component": "Brush", + "path": "/docs/components/Brush/programmatic", + "lineNumber": 48, + "line": "" + }, + { + "example": "region", + "component": "Brush", + "path": "/docs/components/Brush/region", + "lineNumber": 43, + "line": "" + }, + { + "example": "two-dimensional", + "component": "Brush", + "path": "/docs/components/Brush/two-dimensional", + "lineNumber": 39, + "line": "" + }, + { + "example": "vertical", + "component": "Brush", + "path": "/docs/components/Brush/vertical", + "lineNumber": 40, + "line": "" + }, { "example": "basic", "component": "BrushContext", @@ -1294,7 +1357,7 @@ "example": "minimap", "component": "BrushContext", "path": "/docs/components/BrushContext/minimap", - "lineNumber": 82, + "lineNumber": 83, "line": "" }, { @@ -1308,7 +1371,7 @@ "example": "selection", "component": "BrushContext", "path": "/docs/components/BrushContext/selection", - "lineNumber": 39, + "lineNumber": 23, "line": "" }, { @@ -1343,14 +1406,14 @@ "example": "separate-chart-(filter-data)", "component": "BrushContext", "path": "/docs/components/BrushContext/separate-chart-(filter-data)", - "lineNumber": 34, + "lineNumber": 31, "line": "" }, { "example": "separate-chart-(filter-data)", "component": "BrushContext", "path": "/docs/components/BrushContext/separate-chart-(filter-data)", - "lineNumber": 64, + "lineNumber": 50, "line": "" }, { @@ -1507,6 +1570,62 @@ "lineNumber": 46, "line": "" }, + { + "example": "facet-brush-overview", + "component": "Chart", + "path": "/docs/components/Chart/facet-brush-overview", + "lineNumber": 75, + "line": "" + }, + { + "example": "mixed-marks-with-stack", + "component": "Chart", + "path": "/docs/components/Chart/mixed-marks-with-stack", + "lineNumber": 37, + "line": "" + }, + { + "example": "mixed-marks-with-stack-long-data", + "component": "Chart", + "path": "/docs/components/Chart/mixed-marks-with-stack-long-data", + "lineNumber": 57, + "line": "" + }, + { + "example": "coordinated-views", + "component": "ChartGroup", + "path": "/docs/components/ChartGroup/coordinated-views", + "lineNumber": 46, + "line": "" + }, + { + "example": "minimap", + "component": "ChartGroup", + "path": "/docs/components/ChartGroup/minimap", + "lineNumber": 45, + "line": "" + }, + { + "example": "minimap", + "component": "ChartGroup", + "path": "/docs/components/ChartGroup/minimap", + "lineNumber": 64, + "line": "" + }, + { + "example": "synced-brushes", + "component": "ChartGroup", + "path": "/docs/components/ChartGroup/synced-brushes", + "lineNumber": 59, + "line": "" + }, + { + "example": "synced-brushes", + "component": "ChartGroup", + "path": "/docs/components/ChartGroup/synced-brushes", + "lineNumber": 77, + "line": "" + }, { "example": "basic", "component": "Chord", @@ -2085,14 +2204,14 @@ "example": "transform-globe-constrain", "component": "GeoPath", "path": "/docs/components/GeoPath/transform-globe-constrain", - "lineNumber": 38, + "lineNumber": 37, "line": "" }, { "example": "transform-globe-inertia", "component": "GeoPath", "path": "/docs/components/GeoPath/transform-globe-inertia", - "lineNumber": 52, + "lineNumber": 51, "line": "" }, { @@ -2764,7 +2883,7 @@ "example": "persist-brush-zoom", "component": "LineChart", "path": "/docs/components/LineChart/persist-brush-zoom", - "lineNumber": 84, + "lineNumber": 85, "line": "" }, { @@ -3786,7 +3905,7 @@ "example": "multiple-series-with-labels", "component": "Spline", "path": "/docs/components/Spline/multiple-series-with-labels", - "lineNumber": 40, + "lineNumber": 37, "line": "" }, { @@ -3807,7 +3926,7 @@ "example": "radial-multi-year-lines", "component": "Spline", "path": "/docs/components/Spline/radial-multi-year-lines", - "lineNumber": 30, + "lineNumber": 29, "line": "" }, { @@ -3824,6 +3943,13 @@ "lineNumber": 18, "line": "" }, + { + "example": "stroke-grouping-with-legend", + "component": "Spline", + "path": "/docs/components/Spline/stroke-grouping-with-legend", + "lineNumber": 36, + "line": "" + }, { "example": "tween-on-mount", "component": "Spline", @@ -4129,14 +4255,14 @@ "example": "html-nodes", "component": "Tree", "path": "/docs/components/Tree/html-nodes", - "lineNumber": 77, + "lineNumber": 76, "line": "" }, { "example": "html-nodes", "component": "Tree", "path": "/docs/components/Tree/html-nodes", - "lineNumber": 92, + "lineNumber": 91, "line": "" }, { @@ -4273,5 +4399,5 @@ "line": "" } ], - "updatedAt": "2026-08-06T14:50:46.981Z" + "updatedAt": "2026-08-20T17:01:02.069Z" } \ No newline at end of file diff --git a/docs/src/examples/catalog/Legend.json b/docs/src/examples/catalog/Legend.json index 0d6e2a7205..4a9a5d14a4 100644 --- a/docs/src/examples/catalog/Legend.json +++ b/docs/src/examples/catalog/Legend.json @@ -241,6 +241,20 @@ } ], "usage": [ + { + "example": "mixed-marks-with-stack", + "component": "Chart", + "path": "/docs/components/Chart/mixed-marks-with-stack", + "lineNumber": 55, + "line": "" + }, + { + "example": "mixed-marks-with-stack-long-data", + "component": "Chart", + "path": "/docs/components/Chart/mixed-marks-with-stack-long-data", + "lineNumber": 74, + "line": "" + }, { "example": "bubble-map", "component": "GeoPath", @@ -385,7 +399,7 @@ "example": "ordinal", "component": "Legend", "path": "/docs/components/Legend/ordinal", - "lineNumber": 16, + "lineNumber": 17, "line": "" + }, + { + "example": "stroke-grouping-with-legend", + "component": "Spline", + "path": "/docs/components/Spline/stroke-grouping-with-legend", + "lineNumber": 42, + "line": "" + }, { "example": "custom-symbol", "component": "Waffle", "path": "/docs/components/Waffle/custom-symbol", - "lineNumber": 40, + "lineNumber": 39, "line": "" }, { "example": "olympians-weight-by-sex", "component": "Waffle", "path": "/docs/components/Waffle/olympians-weight-by-sex", - "lineNumber": 42, + "lineNumber": 41, "line": "" }, { "example": "penguins", "component": "Waffle", "path": "/docs/components/Waffle/penguins", - "lineNumber": 41, + "lineNumber": 40, "line": "" } ], - "updatedAt": "2026-05-08T16:24:15.193Z" + "updatedAt": "2026-08-20T07:29:18.939Z" } \ No newline at end of file diff --git a/docs/src/examples/catalog/LineChart.json b/docs/src/examples/catalog/LineChart.json index df7841d0dd..69780cb792 100644 --- a/docs/src/examples/catalog/LineChart.json +++ b/docs/src/examples/catalog/LineChart.json @@ -331,6 +331,18 @@ } ] }, + { + "name": "long-data", + "title": "long data", + "path": "/docs/components/LineChart/long-data", + "components": [ + { + "component": "LineChart", + "lineNumber": 16, + "line": "" }, { "component": "Area", - "lineNumber": 85, + "lineNumber": 86, "line": "" } ] @@ -1209,6 +1221,69 @@ "lineNumber": 18, "line": "" + }, + { + "example": "highlight-only", + "component": "ChartGroup", + "path": "/docs/components/ChartGroup/highlight-only", + "lineNumber": 36, + "line": "" + }, + { + "example": "synced-zoom", + "component": "ChartGroup", + "path": "/docs/components/ChartGroup/synced-zoom", + "lineNumber": 32, + "line": "" }, { @@ -307,6 +307,13 @@ "lineNumber": 47, "line": "" }, + { + "example": "synced-brushes", + "component": "ChartGroup", + "path": "/docs/components/ChartGroup/synced-brushes", + "lineNumber": 64, + "line": "" } ], - "updatedAt": "2026-04-30T15:36:26.473Z" + "updatedAt": "2026-08-20T17:01:02.179Z" } \ No newline at end of file diff --git a/docs/src/examples/catalog/Link.json b/docs/src/examples/catalog/Link.json index 5fdda6608b..5423b5ccc3 100644 --- a/docs/src/examples/catalog/Link.json +++ b/docs/src/examples/catalog/Link.json @@ -246,7 +246,7 @@ "example": "html-nodes", "component": "Tree", "path": "/docs/components/Tree/html-nodes", - "lineNumber": 79, + "lineNumber": 78, "line": "" }, + { + "example": "legend-programmatic-control", + "component": "PieChart", + "path": "/docs/components/PieChart/legend-programmatic-control", + "lineNumber": 47, + "line": "" }, + { + "example": "two-dimensional", + "component": "Brush", + "path": "/docs/components/Brush/two-dimensional", + "lineNumber": 43, + "line": "" + }, { "example": "minimap", "component": "BrushContext", @@ -249,14 +256,42 @@ "example": "minimap", "component": "BrushContext", "path": "/docs/components/BrushContext/minimap", - "lineNumber": 83, + "lineNumber": 84, "line": "" }, { "example": "selection", "component": "BrushContext", "path": "/docs/components/BrushContext/selection", - "lineNumber": 43, + "lineNumber": 27, + "line": "" + }, + { + "example": "facet-brush", + "component": "Chart", + "path": "/docs/components/Chart/facet-brush", + "lineNumber": 36, + "line": "" + }, + { + "example": "facet-brush-summary", + "component": "Chart", + "path": "/docs/components/Chart/facet-brush-summary", + "lineNumber": 57, + "line": "" + }, + { + "example": "minimap", + "component": "ChartGroup", + "path": "/docs/components/ChartGroup/minimap", + "lineNumber": 49, + "line": "" + }, + { + "example": "minimap", + "component": "ChartGroup", + "path": "/docs/components/ChartGroup/minimap", + "lineNumber": 65, "line": "" }, { @@ -442,5 +477,5 @@ "line": "" } ], - "updatedAt": "2026-08-06T13:53:35.277Z" + "updatedAt": "2026-08-20T11:19:20.743Z" } \ No newline at end of file diff --git a/docs/src/examples/catalog/Rect.json b/docs/src/examples/catalog/Rect.json index 009452fddc..859412f77b 100644 --- a/docs/src/examples/catalog/Rect.json +++ b/docs/src/examples/catalog/Rect.json @@ -1052,5 +1052,5 @@ "line": "" }, { "example": "highlight-color-based-on-value-using-color-scale", "component": "Area", "path": "/docs/components/Area/highlight-color-based-on-value-using-color-scale", - "lineNumber": 35, + "lineNumber": 36, "line": "" } ], - "updatedAt": "2026-07-22T16:53:03.501Z" + "updatedAt": "2026-08-19T19:59:27.055Z" } \ No newline at end of file diff --git a/docs/src/examples/catalog/Rule.json b/docs/src/examples/catalog/Rule.json index 5128daab39..eab7615198 100644 --- a/docs/src/examples/catalog/Rule.json +++ b/docs/src/examples/catalog/Rule.json @@ -435,7 +435,7 @@ "example": "highlight-color-based-on-value-using-color-scale", "component": "Area", "path": "/docs/components/Area/highlight-color-based-on-value-using-color-scale", - "lineNumber": 31, + "lineNumber": 32, "line": "" }, { @@ -564,6 +564,20 @@ "lineNumber": 67, "line": "" }, + { + "example": "facet-composed", + "component": "Chart", + "path": "/docs/components/Chart/facet-composed", + "lineNumber": 29, + "line": "" + }, + { + "example": "synced-brushes", + "component": "ChartGroup", + "path": "/docs/components/ChartGroup/synced-brushes", + "lineNumber": 62, + "line": "" + }, { "example": "annotation-x", "component": "Rule", @@ -698,5 +712,5 @@ "line": "" } ], - "updatedAt": "2026-04-30T15:36:27.982Z" + "updatedAt": "2026-08-20T17:01:02.542Z" } \ No newline at end of file diff --git a/docs/src/examples/catalog/Spline.json b/docs/src/examples/catalog/Spline.json index d65fe6ba90..dcb1888bfa 100644 --- a/docs/src/examples/catalog/Spline.json +++ b/docs/src/examples/catalog/Spline.json @@ -486,41 +486,174 @@ "components": [ { "component": "Chart", - "lineNumber": 26, + "lineNumber": 24, "line": "" }, { "component": "Axis", - "lineNumber": 41, + "lineNumber": 38, "line": "" }, { "component": "Spline", - "lineNumber": 45, - "line": "" + "lineNumber": 40, + "line": "" }, { "component": "Labels", - "lineNumber": 47, + "lineNumber": 41, "line": "" }, { "component": "Highlight", - "lineNumber": 48, + "lineNumber": 42, "line": "" }, { "component": "Tooltip", - "lineNumber": 50, + "lineNumber": 44, "line": "" } ] }, + { + "name": "parallel-coordinates", + "title": "parallel coordinates", + "path": "/docs/components/Spline/parallel-coordinates", + "components": [ + { + "component": "Chart", + "lineNumber": 44, + "line": "" + }, + { + "component": "Group", + "lineNumber": 62, + "line": "" + }, + { + "component": "Axis", + "lineNumber": 63, + "line": "` below and read back here" + }, + { + "component": "Chart", + "lineNumber": 66, + "line": "" + }, + { + "component": "Axis", + "lineNumber": 80, + "line": " dimensions[d as keyof typeof dimensions]} tickLength={0} />" + }, + { + "component": "Group", + "lineNumber": 65, + "line": "" + }, + { + "component": "Spline", + "lineNumber": 80, + "line": "" + } + ] + }, + { + "name": "parallel-coordinates-mixed", + "title": "parallel coordinates mixed", + "path": "/docs/components/Spline/parallel-coordinates-mixed", + "components": [ + { + "component": "Brush", + "lineNumber": 44, + "line": "// One selection per dimension, each owned by its `` below and read back here" + }, + { + "component": "Chart", + "lineNumber": 74, + "line": " dimensions[d as keyof typeof dimensions]} tickLength={0} />" + }, + { + "component": "Group", + "lineNumber": 93, + "line": "" + }, + { + "component": "Spline", + "lineNumber": 114, + "line": "" }, { "component": "Spline", - "lineNumber": 32, + "lineNumber": 30, "line": "" } ] @@ -671,6 +804,38 @@ } ] }, + { + "name": "stroke-grouping-with-legend", + "title": "stroke grouping with legend", + "path": "/docs/components/Spline/stroke-grouping-with-legend", + "components": [ + { + "component": "Chart", + "lineNumber": 26, + "line": "" + }, + { + "component": "Axis", + "lineNumber": 37, + "line": "" + }, + { + "component": "Spline", + "lineNumber": 39, + "line": "" + }, + { + "component": "Legend", + "lineNumber": 42, + "line": "" + } + ] + }, { "name": "tween-on-mount", "title": "tween on mount", @@ -949,14 +1114,14 @@ "example": "data-series-chart-data", "component": "Chart", "path": "/docs/components/Chart/data-series-chart-data", - "lineNumber": 24, + "lineNumber": 25, "line": "" }, { "example": "data-series-chart-data", "component": "Chart", "path": "/docs/components/Chart/data-series-chart-data", - "lineNumber": 25, + "lineNumber": 26, "line": "" }, { @@ -973,6 +1138,27 @@ "lineNumber": 34, "line": "" }, + { + "example": "facet-lines", + "component": "Chart", + "path": "/docs/components/Chart/facet-lines", + "lineNumber": 26, + "line": "" + }, + { + "example": "mixed-marks-with-stack", + "component": "Chart", + "path": "/docs/components/Chart/mixed-marks-with-stack", + "lineNumber": 46, + "line": "" + "lineNumber": 40, + "line": "" + }, + { + "example": "parallel-coordinates", + "component": "Spline", + "path": "/docs/components/Spline/parallel-coordinates", + "lineNumber": 81, + "line": "" + }, + { + "example": "parallel-coordinates-mixed", + "component": "Spline", + "path": "/docs/components/Spline/parallel-coordinates-mixed", + "lineNumber": 114, + "line": " yearColor(d.date.getFullYear())} class=\"stroke-2\" />" }, + { + "example": "stroke-grouping-with-legend", + "component": "Spline", + "path": "/docs/components/Spline/stroke-grouping-with-legend", + "lineNumber": 39, + "line": "" + }, { "example": "tween-on-mount", "component": "Spline", @@ -1401,5 +1622,5 @@ "line": "" } ], - "updatedAt": "2026-04-30T15:36:28.237Z" + "updatedAt": "2026-08-20T07:29:19.579Z" } \ No newline at end of file diff --git a/docs/src/examples/catalog/Svg.json b/docs/src/examples/catalog/Svg.json index 9b7963a668..ef1dbd4356 100644 --- a/docs/src/examples/catalog/Svg.json +++ b/docs/src/examples/catalog/Svg.json @@ -2,6 +2,20 @@ "component": "Svg", "examples": [], "usage": [ + { + "example": "facet-composed", + "component": "Chart", + "path": "/docs/components/Chart/facet-composed", + "lineNumber": 23, + "line": "" + }, + { + "example": "facet-tooltip", + "component": "Chart", + "path": "/docs/components/Chart/facet-tooltip", + "lineNumber": 25, + "line": "" + }, { "example": "basic", "component": "ColorRamp", @@ -34,9 +48,9 @@ "example": "custom-symbol", "component": "Waffle", "path": "/docs/components/Waffle/custom-symbol", - "lineNumber": 48, + "lineNumber": 47, "line": "" } ], - "updatedAt": "2026-05-08T16:24:15.913Z" + "updatedAt": "2026-08-20T12:48:40.472Z" } \ No newline at end of file diff --git a/docs/src/examples/catalog/Text.json b/docs/src/examples/catalog/Text.json index 39580bc4bc..a8a5f209ac 100644 --- a/docs/src/examples/catalog/Text.json +++ b/docs/src/examples/catalog/Text.json @@ -556,6 +556,20 @@ "lineNumber": 40, "line": "" }, { "example": "highlight-color-based-on-value-using-color-scale", "component": "Area", "path": "/docs/components/Area/highlight-color-based-on-value-using-color-scale", - "lineNumber": 48, + "lineNumber": 49, "line": "" }, { "example": "highlight-color-based-on-value-using-color-scale", "component": "Area", "path": "/docs/components/Area/highlight-color-based-on-value-using-color-scale", - "lineNumber": 49, + "lineNumber": 50, "line": "" }, { "example": "highlight-color-based-on-value-using-color-scale", "component": "Area", "path": "/docs/components/Area/highlight-color-based-on-value-using-color-scale", - "lineNumber": 50, + "lineNumber": 51, "line": "" }, { @@ -1088,28 +1100,28 @@ "example": "multiple-series-with-labels", "component": "Area", "path": "/docs/components/Area/multiple-series-with-labels", - "lineNumber": 52, + "lineNumber": 47, "line": "" }, { "example": "multiple-series-with-labels", "component": "Area", "path": "/docs/components/Area/multiple-series-with-labels", - "lineNumber": 54, + "lineNumber": 49, "line": "" }, { "example": "multiple-series-with-labels", "component": "Area", "path": "/docs/components/Area/multiple-series-with-labels", - "lineNumber": 55, + "lineNumber": 50, "line": "" }, { "example": "multiple-series-with-labels", "component": "Area", "path": "/docs/components/Area/multiple-series-with-labels", - "lineNumber": 56, + "lineNumber": 51, "line": "" }, { @@ -1124,7 +1136,7 @@ "component": "Area", "path": "/docs/components/Area/stack", "lineNumber": 76, - "line": "" + "line": "" }, { "example": "stack", @@ -3881,49 +3893,203 @@ "example": "compound-separate-scales-with-stacked-charts-with-inverted-range-top-down", "component": "Chart", "path": "/docs/components/Chart/compound-separate-scales-with-stacked-charts-with-inverted-range-top-down", - "lineNumber": 84, + "lineNumber": 83, "line": "" }, { "example": "compound-separate-scales-with-stacked-charts-with-inverted-range-top-down", "component": "Chart", "path": "/docs/components/Chart/compound-separate-scales-with-stacked-charts-with-inverted-range-top-down", - "lineNumber": 86, + "lineNumber": 85, "line": "" }, { "example": "compound-separate-scales-with-stacked-charts-with-inverted-range-top-down", "component": "Chart", "path": "/docs/components/Chart/compound-separate-scales-with-stacked-charts-with-inverted-range-top-down", - "lineNumber": 87, + "lineNumber": 86, "line": "" }, { "example": "compound-separate-scales-with-stacked-charts-with-inverted-range-top-down", "component": "Chart", "path": "/docs/components/Chart/compound-separate-scales-with-stacked-charts-with-inverted-range-top-down", - "lineNumber": 88, + "lineNumber": 87, "line": "" }, { "example": "compound-separate-scales-with-stacked-charts-with-inverted-range-top-down", "component": "Chart", "path": "/docs/components/Chart/compound-separate-scales-with-stacked-charts-with-inverted-range-top-down", - "lineNumber": 89, + "lineNumber": 88, "line": "" }, { "example": "compound-separate-scales-with-stacked-charts-with-inverted-range-top-down", "component": "Chart", "path": "/docs/components/Chart/compound-separate-scales-with-stacked-charts-with-inverted-range-top-down", - "lineNumber": 95, + "lineNumber": 94, + "line": "" + }, + { + "example": "facet-tooltip", + "component": "Chart", + "path": "/docs/components/Chart/facet-tooltip", + "lineNumber": 37, + "line": "{data.species} · {data.island}" + }, + { + "example": "facet-tooltip", + "component": "Chart", + "path": "/docs/components/Chart/facet-tooltip", + "lineNumber": 38, + "line": "" + }, + { + "example": "facet-tooltip", + "component": "Chart", + "path": "/docs/components/Chart/facet-tooltip", + "lineNumber": 39, + "line": "" + }, + { + "example": "facet-tooltip", + "component": "Chart", + "path": "/docs/components/Chart/facet-tooltip", + "lineNumber": 40, + "line": "" + }, + { + "example": "mixed-marks-with-stack", + "component": "Chart", + "path": "/docs/components/Chart/mixed-marks-with-stack", + "lineNumber": 57, + "line": "" + }, + { + "example": "mixed-marks-with-stack", + "component": "Chart", + "path": "/docs/components/Chart/mixed-marks-with-stack", + "lineNumber": 59, + "line": "{data.month}" + }, + { + "example": "mixed-marks-with-stack", + "component": "Chart", + "path": "/docs/components/Chart/mixed-marks-with-stack", + "lineNumber": 60, + "line": "" + }, + { + "example": "mixed-marks-with-stack", + "component": "Chart", + "path": "/docs/components/Chart/mixed-marks-with-stack", + "lineNumber": 62, + "line": "" + }, + { + "example": "mixed-marks-with-stack", + "component": "Chart", + "path": "/docs/components/Chart/mixed-marks-with-stack", + "lineNumber": 73, + "line": "" + }, + { + "example": "mixed-marks-with-stack-long-data", + "component": "Chart", + "path": "/docs/components/Chart/mixed-marks-with-stack-long-data", + "lineNumber": 76, + "line": "" + }, + { + "example": "mixed-marks-with-stack-long-data", + "component": "Chart", + "path": "/docs/components/Chart/mixed-marks-with-stack-long-data", + "lineNumber": 79, + "line": "{hovered.month}" + }, + { + "example": "mixed-marks-with-stack-long-data", + "component": "Chart", + "path": "/docs/components/Chart/mixed-marks-with-stack-long-data", + "lineNumber": 80, + "line": "" + }, + { + "example": "mixed-marks-with-stack-long-data", + "component": "Chart", + "path": "/docs/components/Chart/mixed-marks-with-stack-long-data", + "lineNumber": 82, + "line": "" + }, + { + "example": "mixed-marks-with-stack-long-data", + "component": "Chart", + "path": "/docs/components/Chart/mixed-marks-with-stack-long-data", + "lineNumber": 93, + "line": "" + }, + { + "example": "faceted-group", + "component": "ChartGroup", + "path": "/docs/components/ChartGroup/faceted-group", + "lineNumber": 60, + "line": "" + }, + { + "example": "faceted-group", + "component": "ChartGroup", + "path": "/docs/components/ChartGroup/faceted-group", + "lineNumber": 61, "line": "" }, { "example": "grouped-horizontal", "component": "Dodge", "path": "/docs/components/Dodge/grouped-horizontal", - "lineNumber": 69, + "lineNumber": 70, "line": "{data.species}" }, { "example": "grouped-horizontal", "component": "Dodge", "path": "/docs/components/Dodge/grouped-horizontal", - "lineNumber": 70, + "lineNumber": 71, "line": "" }, { "example": "grouped-horizontal", "component": "Dodge", "path": "/docs/components/Dodge/grouped-horizontal", - "lineNumber": 71, + "lineNumber": 72, "line": "" }, { "example": "grouped-horizontal", "component": "Dodge", "path": "/docs/components/Dodge/grouped-horizontal", - "lineNumber": 72, + "lineNumber": 73, "line": "" }, { "example": "grouped-horizontal", "component": "Dodge", "path": "/docs/components/Dodge/grouped-horizontal", - "lineNumber": 73, + "lineNumber": 74, "line": "" }, { "example": "grouped-vertical", "component": "Dodge", "path": "/docs/components/Dodge/grouped-vertical", - "lineNumber": 66, + "lineNumber": 67, "line": "" }, { "example": "grouped-vertical", "component": "Dodge", "path": "/docs/components/Dodge/grouped-vertical", - "lineNumber": 68, + "lineNumber": 69, "line": "{data.species}" }, { "example": "grouped-vertical", "component": "Dodge", "path": "/docs/components/Dodge/grouped-vertical", - "lineNumber": 69, + "lineNumber": 70, "line": "" }, { "example": "grouped-vertical", "component": "Dodge", "path": "/docs/components/Dodge/grouped-vertical", - "lineNumber": 70, + "lineNumber": 71, "line": "" }, { "example": "grouped-vertical", "component": "Dodge", "path": "/docs/components/Dodge/grouped-vertical", - "lineNumber": 71, + "lineNumber": 72, "line": "" }, { "example": "grouped-vertical", "component": "Dodge", "path": "/docs/components/Dodge/grouped-vertical", - "lineNumber": 72, + "lineNumber": 73, "line": "" }, { @@ -6555,28 +6721,28 @@ "example": "multiple-series-with-labels", "component": "Spline", "path": "/docs/components/Spline/multiple-series-with-labels", - "lineNumber": 50, + "lineNumber": 44, "line": "" }, { "example": "multiple-series-with-labels", "component": "Spline", "path": "/docs/components/Spline/multiple-series-with-labels", - "lineNumber": 52, + "lineNumber": 46, "line": "" }, { "example": "multiple-series-with-labels", "component": "Spline", "path": "/docs/components/Spline/multiple-series-with-labels", - "lineNumber": 53, + "lineNumber": 47, "line": "" }, { "example": "multiple-series-with-labels", "component": "Spline", "path": "/docs/components/Spline/multiple-series-with-labels", - "lineNumber": 54, + "lineNumber": 48, "line": "" }, { @@ -7556,42 +7722,42 @@ "example": "custom-symbol", "component": "Waffle", "path": "/docs/components/Waffle/custom-symbol", - "lineNumber": 64, + "lineNumber": 63, "line": "" }, { "example": "custom-symbol", "component": "Waffle", "path": "/docs/components/Waffle/custom-symbol", - "lineNumber": 66, + "lineNumber": 65, "line": "{data.island}" }, { "example": "custom-symbol", "component": "Waffle", "path": "/docs/components/Waffle/custom-symbol", - "lineNumber": 67, + "lineNumber": 66, "line": "" }, { "example": "custom-symbol", "component": "Waffle", "path": "/docs/components/Waffle/custom-symbol", - "lineNumber": 69, + "lineNumber": 68, "line": "" }, { "example": "custom-symbol", "component": "Waffle", "path": "/docs/components/Waffle/custom-symbol", - "lineNumber": 78, + "lineNumber": 77, "line": "" }, { "example": "olympians-weight-by-sex", "component": "Waffle", "path": "/docs/components/Waffle/olympians-weight-by-sex", - "lineNumber": 54, + "lineNumber": 53, "line": "{data.weight}–{data.weight + 9} kg" }, { "example": "olympians-weight-by-sex", "component": "Waffle", "path": "/docs/components/Waffle/olympians-weight-by-sex", - "lineNumber": 55, + "lineNumber": 54, "line": "" }, { "example": "olympians-weight-by-sex", "component": "Waffle", "path": "/docs/components/Waffle/olympians-weight-by-sex", - "lineNumber": 57, + "lineNumber": 56, "line": "" }, { "example": "olympians-weight-by-sex", "component": "Waffle", "path": "/docs/components/Waffle/olympians-weight-by-sex", - "lineNumber": 66, + "lineNumber": 65, "line": "" }, { "example": "penguins", "component": "Waffle", "path": "/docs/components/Waffle/penguins", - "lineNumber": 53, + "lineNumber": 52, "line": "{data.island}" }, { "example": "penguins", "component": "Waffle", "path": "/docs/components/Waffle/penguins", - "lineNumber": 54, + "lineNumber": 53, "line": "" }, { "example": "penguins", "component": "Waffle", "path": "/docs/components/Waffle/penguins", - "lineNumber": 56, + "lineNumber": 55, "line": "" }, { "example": "penguins", "component": "Waffle", "path": "/docs/components/Waffle/penguins", - "lineNumber": 65, + "lineNumber": 64, "line": "" }, { "example": "stacked", "component": "Waffle", "path": "/docs/components/Waffle/stacked", - "lineNumber": 46, + "lineNumber": 45, "line": "{data.period}" }, { "example": "stacked", "component": "Waffle", "path": "/docs/components/Waffle/stacked", - "lineNumber": 47, + "lineNumber": 46, "line": "" }, { "example": "stacked", "component": "Waffle", "path": "/docs/components/Waffle/stacked", - "lineNumber": 49, + "lineNumber": 48, "line": "" }, { "example": "stacked", "component": "Waffle", "path": "/docs/components/Waffle/stacked", - "lineNumber": 58, + "lineNumber": 57, "line": "" } ], - "updatedAt": "2026-08-06T14:44:39.384Z" + "updatedAt": "2026-08-20T17:01:02.716Z" } \ No newline at end of file diff --git a/docs/src/examples/catalog/TooltipTestHarness.json b/docs/src/examples/catalog/TooltipTestHarness.json new file mode 100644 index 0000000000..f575451410 --- /dev/null +++ b/docs/src/examples/catalog/TooltipTestHarness.json @@ -0,0 +1,6 @@ +{ + "component": "TooltipTestHarness", + "examples": [], + "usage": [], + "updatedAt": "2026-08-14T18:32:54.428Z" +} \ No newline at end of file diff --git a/docs/src/examples/catalog/Tree.json b/docs/src/examples/catalog/Tree.json index 28117dc4d8..f93b5c9f29 100644 --- a/docs/src/examples/catalog/Tree.json +++ b/docs/src/examples/catalog/Tree.json @@ -55,22 +55,22 @@ }, { "component": "Tree", - "lineNumber": 71, + "lineNumber": 70, "line": "" }, { "component": "Link", - "lineNumber": 79, + "lineNumber": 78, "line": "" }, { "component": "Waffle", - "lineNumber": 45, + "lineNumber": 44, "line": "" }, { "component": "Svg", - "lineNumber": 48, + "lineNumber": 47, "line": "" }, { "component": "Path", - "lineNumber": 49, + "lineNumber": 48, "line": "" } ] @@ -226,17 +226,17 @@ }, { "component": "Legend", - "lineNumber": 42, + "lineNumber": 41, "line": "" }, { "component": "Waffle", - "lineNumber": 47, + "lineNumber": 46, "line": "" }, { "component": "Tooltip", - "lineNumber": 52, + "lineNumber": 51, "line": "" } ] @@ -253,17 +253,17 @@ }, { "component": "Legend", - "lineNumber": 41, + "lineNumber": 40, "line": "" }, { "component": "Waffle", - "lineNumber": 46, + "lineNumber": 45, "line": "" }, { "component": "Tooltip", - "lineNumber": 51, + "lineNumber": 50, "line": "" } ] @@ -280,12 +280,12 @@ }, { "component": "Waffle", - "lineNumber": 39, + "lineNumber": 38, "line": "" }, { "component": "Tooltip", - "lineNumber": 44, + "lineNumber": 43, "line": "" } ] @@ -373,7 +373,7 @@ "example": "custom-symbol", "component": "Waffle", "path": "/docs/components/Waffle/custom-symbol", - "lineNumber": 45, + "lineNumber": 44, "line": "" }, { @@ -408,21 +408,21 @@ "example": "olympians-weight-by-sex", "component": "Waffle", "path": "/docs/components/Waffle/olympians-weight-by-sex", - "lineNumber": 47, + "lineNumber": 46, "line": "" }, { "example": "penguins", "component": "Waffle", "path": "/docs/components/Waffle/penguins", - "lineNumber": 46, + "lineNumber": 45, "line": "" }, { "example": "stacked", "component": "Waffle", "path": "/docs/components/Waffle/stacked", - "lineNumber": 39, + "lineNumber": 38, "line": "" }, { @@ -447,5 +447,5 @@ "line": "" } ], - "updatedAt": "2026-05-08T16:24:16.409Z" + "updatedAt": "2026-08-19T19:59:27.525Z" } \ No newline at end of file diff --git a/docs/src/examples/components/Area/highlight-color-based-on-value-using-color-scale.svelte b/docs/src/examples/components/Area/highlight-color-based-on-value-using-color-scale.svelte index b1e4a2c153..f68a16323a 100644 --- a/docs/src/examples/components/Area/highlight-color-based-on-value-using-color-scale.svelte +++ b/docs/src/examples/components/Area/highlight-color-based-on-value-using-color-scale.svelte @@ -17,11 +17,12 @@ x="date" y="value" yNice - padding={20} - tooltipContext={{ mode: 'quadtree-x' }} c={(d) => (d.value < 0 ? 'under' : 'over')} cDomain={['over', 'under']} cRange={['var(--color-success)', 'var(--color-danger)']} + seriesLayout="overlap" + tooltipContext={{ mode: 'quadtree-x' }} + padding={20} height={300} > {#snippet children({ context })} diff --git a/docs/src/examples/components/Area/multiple-series-with-labels.svelte b/docs/src/examples/components/Area/multiple-series-with-labels.svelte index 2a9bcffecd..e67095e779 100644 --- a/docs/src/examples/components/Area/multiple-series-with-labels.svelte +++ b/docs/src/examples/components/Area/multiple-series-with-labels.svelte @@ -1,5 +1,4 @@ diff --git a/docs/src/examples/components/Area/stack.svelte b/docs/src/examples/components/Area/stack.svelte index 229e824171..0ebafeefd5 100644 --- a/docs/src/examples/components/Area/stack.svelte +++ b/docs/src/examples/components/Area/stack.svelte @@ -73,7 +73,7 @@ {#snippet children({ data })} - + {#each keys as key} diff --git a/docs/src/examples/components/AreaChart/series-overlap.svelte b/docs/src/examples/components/AreaChart/series-overlap.svelte new file mode 100644 index 0000000000..e8cb559490 --- /dev/null +++ b/docs/src/examples/components/AreaChart/series-overlap.svelte @@ -0,0 +1,26 @@ + + + diff --git a/docs/src/examples/components/AreaChart/series-stack-diverging.svelte b/docs/src/examples/components/AreaChart/series-stack-diverging.svelte index 5b17da91d8..aee87cde49 100644 --- a/docs/src/examples/components/AreaChart/series-stack-diverging.svelte +++ b/docs/src/examples/components/AreaChart/series-stack-diverging.svelte @@ -26,7 +26,6 @@ color: 'var(--color-oranges)' } ]} - seriesLayout="stackDiverging" padding={defaultChartPadding({ right: 10 })} height={300} /> diff --git a/docs/src/examples/components/AreaChart/series-stack-gradient.svelte b/docs/src/examples/components/AreaChart/series-stack-gradient.svelte index f3cf82f1bb..929af60455 100644 --- a/docs/src/examples/components/AreaChart/series-stack-gradient.svelte +++ b/docs/src/examples/components/AreaChart/series-stack-gradient.svelte @@ -26,7 +26,6 @@ color: 'var(--color-oranges)' } ]} - seriesLayout="stack" padding={defaultChartPadding({ right: 10 })} height={300} > diff --git a/docs/src/examples/components/AreaChart/series-stack-legend-labels.svelte b/docs/src/examples/components/AreaChart/series-stack-legend-labels.svelte index b05162fa4c..41fa768f07 100644 --- a/docs/src/examples/components/AreaChart/series-stack-legend-labels.svelte +++ b/docs/src/examples/components/AreaChart/series-stack-legend-labels.svelte @@ -29,7 +29,6 @@ } ]} legend - seriesLayout="stack" padding={defaultChartPadding({ legend: true, right: 10 })} height={300} /> diff --git a/docs/src/examples/components/AreaChart/series-stack-legend-placement.svelte b/docs/src/examples/components/AreaChart/series-stack-legend-placement.svelte index 65ba4c8182..5c0a0cbcb4 100644 --- a/docs/src/examples/components/AreaChart/series-stack-legend-placement.svelte +++ b/docs/src/examples/components/AreaChart/series-stack-legend-placement.svelte @@ -26,7 +26,6 @@ color: 'var(--color-oranges)' } ]} - seriesLayout="stack" legend={{ placement: 'top-right' }} padding={defaultChartPadding({ right: 10 })} height={300} diff --git a/docs/src/examples/components/AreaChart/series-stack-legend.svelte b/docs/src/examples/components/AreaChart/series-stack-legend.svelte index cef5fca759..ee2f501c89 100644 --- a/docs/src/examples/components/AreaChart/series-stack-legend.svelte +++ b/docs/src/examples/components/AreaChart/series-stack-legend.svelte @@ -26,7 +26,6 @@ color: 'var(--color-oranges)' } ]} - seriesLayout="stack" legend padding={defaultChartPadding({ legend: true, right: 10 })} height={300} diff --git a/docs/src/examples/components/AreaChart/series-stack-separate-data.svelte b/docs/src/examples/components/AreaChart/series-stack-separate-data.svelte index 1b544f9bdb..12f8675e95 100644 --- a/docs/src/examples/components/AreaChart/series-stack-separate-data.svelte +++ b/docs/src/examples/components/AreaChart/series-stack-separate-data.svelte @@ -37,7 +37,6 @@ color: 'var(--color-oranges)' } ]} - seriesLayout="stack" padding={defaultChartPadding({ right: 10 })} height={300} /> diff --git a/docs/src/examples/components/AreaChart/series-stack.svelte b/docs/src/examples/components/AreaChart/series-stack.svelte index 3b4c975bd1..f915e4a57a 100644 --- a/docs/src/examples/components/AreaChart/series-stack.svelte +++ b/docs/src/examples/components/AreaChart/series-stack.svelte @@ -26,7 +26,6 @@ color: 'var(--color-oranges)' } ]} - seriesLayout="stack" padding={defaultChartPadding({ right: 10 })} height={300} /> diff --git a/docs/src/examples/components/BarChart/group-long-data.svelte b/docs/src/examples/components/BarChart/group-long-data.svelte new file mode 100644 index 0000000000..b4b1e3e4f5 --- /dev/null +++ b/docs/src/examples/components/BarChart/group-long-data.svelte @@ -0,0 +1,35 @@ + + + + diff --git a/docs/src/examples/components/BarChart/group-series-bar-click.svelte b/docs/src/examples/components/BarChart/group-series-bar-click.svelte index c9db2b316b..66eb361a94 100644 --- a/docs/src/examples/components/BarChart/group-series-bar-click.svelte +++ b/docs/src/examples/components/BarChart/group-series-bar-click.svelte @@ -27,7 +27,6 @@ } ]} seriesLayout="group" - padding={defaultChartPadding({ left: 24 })} props={{ xAxis: { format: 'none' }, yAxis: { format: 'metric' }, @@ -40,5 +39,6 @@ console.log(e, detail); alert(JSON.stringify(detail)); }} + padding={defaultChartPadding({ left: 24 })} height={300} /> diff --git a/docs/src/examples/components/BarChart/group-stack-series-horizontal.svelte b/docs/src/examples/components/BarChart/group-stack-series-horizontal.svelte new file mode 100644 index 0000000000..1b1ca07e2a --- /dev/null +++ b/docs/src/examples/components/BarChart/group-stack-series-horizontal.svelte @@ -0,0 +1,43 @@ + + + [0, yScale.bandwidth?.() ?? 0]} + series={[ + { key: 'apples', color: 'var(--color-apples)' }, + { key: 'bananas', color: 'var(--color-bananas)' }, + { key: 'cherries', color: 'var(--color-cherries)' }, + { key: 'grapes', color: 'var(--color-grapes)' } + ]} + legend + props={{ + xAxis: { format: 'metric' }, + yAxis: { format: 'none' }, + tooltip: { header: { format: 'none' } } + }} + padding={defaultChartPadding({ legend: true, left: 30 })} + height={300} +/> diff --git a/docs/src/examples/components/BarChart/group-stack-series.svelte b/docs/src/examples/components/BarChart/group-stack-series.svelte new file mode 100644 index 0000000000..2f3b5f748b --- /dev/null +++ b/docs/src/examples/components/BarChart/group-stack-series.svelte @@ -0,0 +1,44 @@ + + + + [0, xScale.bandwidth?.() ?? 0]} + series={[ + { key: 'apples', color: 'var(--color-apples)' }, + { key: 'bananas', color: 'var(--color-bananas)' }, + { key: 'cherries', color: 'var(--color-cherries)' }, + { key: 'grapes', color: 'var(--color-grapes)' } + ]} + legend + props={{ + yAxis: { format: 'metric' }, + tooltip: { header: { format: 'none' } } + }} + height={300} +/> diff --git a/docs/src/examples/components/BarChart/legend-stack-series.svelte b/docs/src/examples/components/BarChart/legend-stack-series.svelte index 820f705494..2a0bd691cf 100644 --- a/docs/src/examples/components/BarChart/legend-stack-series.svelte +++ b/docs/src/examples/components/BarChart/legend-stack-series.svelte @@ -24,7 +24,6 @@ color: 'var(--color-grapes)' } ]} - seriesLayout="stack" props={{ xAxis: { format: 'none' }, yAxis: { format: 'metric' }, diff --git a/docs/src/examples/components/BarChart/series-data.svelte b/docs/src/examples/components/BarChart/series-data.svelte index 085ad1039c..aee843f51c 100644 --- a/docs/src/examples/components/BarChart/series-data.svelte +++ b/docs/src/examples/components/BarChart/series-data.svelte @@ -32,5 +32,6 @@ props: { insets: { x: 8 } } } ]} + seriesLayout="overlap" height={300} /> diff --git a/docs/src/examples/components/BarChart/series-horizontal-labels.svelte b/docs/src/examples/components/BarChart/series-horizontal-labels.svelte index 55b84f3b72..b08b2ef752 100644 --- a/docs/src/examples/components/BarChart/series-horizontal-labels.svelte +++ b/docs/src/examples/components/BarChart/series-horizontal-labels.svelte @@ -20,6 +20,7 @@ { key: 'baseline', color: 'var(--color-surface-content)', props: { fillOpacity: 0.2 } }, { key: 'value', color: 'var(--color-primary)', props: { insets: { y: 4 } } } ]} + seriesLayout="overlap" labels={{ seriesKey: 'value', placement: 'inside', fill: 'white' }} padding={defaultChartPadding({ left: 30, right: 25 })} height={200} diff --git a/docs/src/examples/components/BarChart/series-horizontal.svelte b/docs/src/examples/components/BarChart/series-horizontal.svelte index 62b53fca37..dfe3c45b31 100644 --- a/docs/src/examples/components/BarChart/series-horizontal.svelte +++ b/docs/src/examples/components/BarChart/series-horizontal.svelte @@ -20,6 +20,7 @@ { key: 'baseline', color: 'var(--color-surface-content)', props: { fillOpacity: 0.2 } }, { key: 'value', color: 'var(--color-primary)', props: { insets: { y: 4 } } } ]} + seriesLayout="overlap" padding={defaultChartPadding({ left: 30, right: 25 })} height={400} /> diff --git a/docs/src/examples/components/BarChart/series-stack-separate-data.svelte b/docs/src/examples/components/BarChart/series-stack-separate-data.svelte index 8e0bc65c90..bb2eb1449b 100644 --- a/docs/src/examples/components/BarChart/series-stack-separate-data.svelte +++ b/docs/src/examples/components/BarChart/series-stack-separate-data.svelte @@ -34,7 +34,6 @@ color: 'var(--color-grapes)' } ]} - seriesLayout="stack" props={{ xAxis: { format: 'none' }, yAxis: { format: 'metric' }, diff --git a/docs/src/examples/components/BarChart/series.svelte b/docs/src/examples/components/BarChart/series.svelte index 9387863846..7f76732ce4 100644 --- a/docs/src/examples/components/BarChart/series.svelte +++ b/docs/src/examples/components/BarChart/series.svelte @@ -23,5 +23,6 @@ props: { insets: { x: 8 } } } ]} + seriesLayout="overlap" height={300} /> diff --git a/docs/src/examples/components/BarChart/stack-long-data.svelte b/docs/src/examples/components/BarChart/stack-long-data.svelte new file mode 100644 index 0000000000..4fa3f51e79 --- /dev/null +++ b/docs/src/examples/components/BarChart/stack-long-data.svelte @@ -0,0 +1,29 @@ + + + diff --git a/docs/src/examples/components/BarChart/stack-series-horizontal.svelte b/docs/src/examples/components/BarChart/stack-series-horizontal.svelte index 799ebe3468..5e4b7c7526 100644 --- a/docs/src/examples/components/BarChart/stack-series-horizontal.svelte +++ b/docs/src/examples/components/BarChart/stack-series-horizontal.svelte @@ -25,7 +25,6 @@ color: 'var(--color-grapes)' } ]} - seriesLayout="stack" props={{ xAxis: { format: 'metric' }, yAxis: { format: 'none' }, diff --git a/docs/src/examples/components/BarChart/stack-series-padded.svelte b/docs/src/examples/components/BarChart/stack-series-padded.svelte index a6fd77872d..b2dc534f57 100644 --- a/docs/src/examples/components/BarChart/stack-series-padded.svelte +++ b/docs/src/examples/components/BarChart/stack-series-padded.svelte @@ -24,7 +24,6 @@ color: 'var(--color-grapes)' } ]} - seriesLayout="stack" props={{ xAxis: { format: 'none' }, yAxis: { format: 'metric' }, diff --git a/docs/src/examples/components/BarChart/stack-series.svelte b/docs/src/examples/components/BarChart/stack-series.svelte index eec4bc3603..28bd6d3d7f 100644 --- a/docs/src/examples/components/BarChart/stack-series.svelte +++ b/docs/src/examples/components/BarChart/stack-series.svelte @@ -24,7 +24,6 @@ color: 'var(--color-grapes)' } ]} - seriesLayout="stack" props={{ xAxis: { format: 'none' }, yAxis: { format: 'metric' }, diff --git a/docs/src/examples/components/BarChart/waterfall.svelte b/docs/src/examples/components/BarChart/waterfall.svelte index 9a6a31fd86..87d46b8b03 100644 --- a/docs/src/examples/components/BarChart/waterfall.svelte +++ b/docs/src/examples/components/BarChart/waterfall.svelte @@ -110,6 +110,7 @@ + import { getAppleStock } from '$lib/data.remote'; + const data = await getAppleStock(); + + + + +
+ {#if range} + {format(range[0], PeriodType.Day)} – {format(range[1], PeriodType.Day)} + {:else} + Drag to select a range + {/if} +
+ + + + + + + + + diff --git a/docs/src/examples/components/Brush/html.svelte b/docs/src/examples/components/Brush/html.svelte new file mode 100644 index 0000000000..c7454b8cc8 --- /dev/null +++ b/docs/src/examples/components/Brush/html.svelte @@ -0,0 +1,50 @@ + + + + +
+ {#if range} + {format(range[0], PeriodType.Day)} – {format(range[1], PeriodType.Day)} + {:else} + Drag to select a range + {/if} +
+ + + + + + + + + + + + + diff --git a/docs/src/examples/components/Brush/programmatic.svelte b/docs/src/examples/components/Brush/programmatic.svelte new file mode 100644 index 0000000000..8c40b05576 --- /dev/null +++ b/docs/src/examples/components/Brush/programmatic.svelte @@ -0,0 +1,54 @@ + + + + + + + + + + + + + + + + + + + diff --git a/docs/src/examples/components/Brush/region.svelte b/docs/src/examples/components/Brush/region.svelte new file mode 100644 index 0000000000..12500f1913 --- /dev/null +++ b/docs/src/examples/components/Brush/region.svelte @@ -0,0 +1,61 @@ + + + + +
+ {#if range} + {format(range[0], PeriodType.Day)} – {format(range[1], PeriodType.Day)} + {:else} + Drag along the lane below the chart + {/if} +
+ + + {#snippet children({ context })} + + + + + + + + + {/snippet} + diff --git a/docs/src/examples/components/Brush/two-dimensional.svelte b/docs/src/examples/components/Brush/two-dimensional.svelte new file mode 100644 index 0000000000..73ddfb386d --- /dev/null +++ b/docs/src/examples/components/Brush/two-dimensional.svelte @@ -0,0 +1,63 @@ + + +
+ {#if brush?.active} + {data.filter((d) => brush!.contains(d)).length} of {data.length} points selected + {:else} + Drag to select points + {/if} +
+ + + + + + + + {#snippet children({ points })} + {#each points as point} + {@const isSelected = brush?.contains(point.data) ?? false} + + + {/each} + {/snippet} + + + + + diff --git a/docs/src/examples/components/Brush/vertical.svelte b/docs/src/examples/components/Brush/vertical.svelte new file mode 100644 index 0000000000..4de86e2244 --- /dev/null +++ b/docs/src/examples/components/Brush/vertical.svelte @@ -0,0 +1,46 @@ + + + + +
+ {#if range} + {format(range[0], 'decimal')} – {format(range[1], 'decimal')} + {:else} + Drag to select a value range + {/if} +
+ + + + + + + + + diff --git a/docs/src/examples/components/BrushContext/minimap.svelte b/docs/src/examples/components/BrushContext/minimap.svelte index 016a6a4ba0..d5c0211b3e 100644 --- a/docs/src/examples/components/BrushContext/minimap.svelte +++ b/docs/src/examples/components/BrushContext/minimap.svelte @@ -79,31 +79,29 @@ } }} > - - - {#snippet children({ points })} - {#each points as point} - {@const isSelected = - (xDomain?.[0] == null || xDomain?.[0] <= point.data.x) && - (xDomain?.[1] == null || point.data.x <= xDomain?.[1]) && - (yDomain?.[0] == null || yDomain?.[0] <= point.data.y) && - (yDomain?.[1] == null || point.data.y <= yDomain?.[1])} + {#snippet children({ context })} + + + {#snippet children({ points })} + {#each points as point} + {@const isSelected = context.brush.contains(point.data)} - - {/each} - {/snippet} - - + + {/each} + {/snippet} + + + {/snippet}
diff --git a/docs/src/examples/components/BrushContext/selection.svelte b/docs/src/examples/components/BrushContext/selection.svelte index b820f7508d..3ad7523592 100644 --- a/docs/src/examples/components/BrushContext/selection.svelte +++ b/docs/src/examples/components/BrushContext/selection.svelte @@ -1,23 +1,12 @@ { - xDomain = e.brush.x; - yDomain = e.brush.y; - } - }} + brush={{ axis: 'both' }} height={400} > - - - + {#snippet children({ context })} + + + - - {#snippet children({ points })} - {#each points as point} - {@const isSelected = - (xDomain?.[0] == null || xDomain?.[0] <= point.data.x) && - (xDomain?.[1] == null || point.data.x <= xDomain?.[1]) && - (yDomain?.[0] == null || yDomain?.[0] <= point.data.y) && - (yDomain?.[1] == null || point.data.y <= yDomain?.[1])} + + {#snippet children({ points })} + {#each points as point} + {@const isSelected = context.brush.contains(point.data)} - - {/each} - {/snippet} - - + + {/each} + {/snippet} + + + {/snippet} diff --git a/docs/src/examples/components/BrushContext/separate-chart-(filter-data).svelte b/docs/src/examples/components/BrushContext/separate-chart-(filter-data).svelte index 2b5ef3d8e7..5cac66c110 100644 --- a/docs/src/examples/components/BrushContext/separate-chart-(filter-data).svelte +++ b/docs/src/examples/components/BrushContext/separate-chart-(filter-data).svelte @@ -11,20 +11,17 @@ Layer, LinearGradient, defaultChartPadding, - type DomainType + type ChartState } from 'layerchart'; export { data }; - let xDomain = $state([null, null]); + // The lower chart owns the brush; filter the upper chart's data by its selection + let brushChart = $state(); - (xDomain?.[0] == null || d.date >= xDomain?.[0]) && - (xDomain?.[1] == null || d.date <= xDomain?.[1]) - )} + data={data.filter((d: any) => brushChart?.brush.contains({ x: d.date }) ?? true)} x="date" y="value" yDomain={[0, null]} @@ -49,18 +46,7 @@ - { - xDomain = e.brush.x; - } - }} - height={40} -> + diff --git a/docs/src/examples/components/Chart/compound-separate-scales-with-stacked-charts-with-inverted-range-top-down.svelte b/docs/src/examples/components/Chart/compound-separate-scales-with-stacked-charts-with-inverted-range-top-down.svelte index 761b8de15f..f3c5ef135e 100644 --- a/docs/src/examples/components/Chart/compound-separate-scales-with-stacked-charts-with-inverted-range-top-down.svelte +++ b/docs/src/examples/components/Chart/compound-separate-scales-with-stacked-charts-with-inverted-range-top-down.svelte @@ -61,7 +61,6 @@ } } ]} - seriesLayout="stack" padding={defaultChartPadding({ top: 20, bottom: 30, right: 32, left: 32 })} height={300} > diff --git a/docs/src/examples/components/Chart/data-series-chart-data.svelte b/docs/src/examples/components/Chart/data-series-chart-data.svelte index fd59402498..79c0f7e620 100644 --- a/docs/src/examples/components/Chart/data-series-chart-data.svelte +++ b/docs/src/examples/components/Chart/data-series-chart-data.svelte @@ -18,6 +18,7 @@ { key: 'apples', color: 'var(--color-apples)' }, { key: 'oranges', color: 'var(--color-oranges)' } ]} + legend height={300} > {#snippet marks()} diff --git a/docs/src/examples/components/Chart/facet-annotation.svelte b/docs/src/examples/components/Chart/facet-annotation.svelte new file mode 100644 index 0000000000..8768c1daa3 --- /dev/null +++ b/docs/src/examples/components/Chart/facet-annotation.svelte @@ -0,0 +1,53 @@ + + + + + + {#snippet aboveMarks({ context, facet })} + + {#if facet.fy === 'Adelie'} + + {/if} + {/snippet} + diff --git a/docs/src/examples/components/Chart/facet-bars.svelte b/docs/src/examples/components/Chart/facet-bars.svelte new file mode 100644 index 0000000000..03a206d385 --- /dev/null +++ b/docs/src/examples/components/Chart/facet-bars.svelte @@ -0,0 +1,66 @@ + + + + `${d.party}-${d.year}`} + {cDomain} + {cRange} + grid + tooltipContext={{ mode: 'facet' }} + facet={{ + axis: { + placement: 'bottom', + tickLabelProps: { dy: 24, class: 'text-xs font-semibold fill-surface-content' } + } + }} + props={{ + xAxis: { format: 'none' }, + yAxis: { format: 'percentRound' }, + tooltip: { + header: { format: 'none' }, + item: { format: { type: 'percent', options: { fractionDigits: 1 } } }, + // Two election years don't add up to anything + hideTotal: true + } + }} + padding={{ left: 44, bottom: 40, top: 8, right: 8 }} + height={300} +/> diff --git a/docs/src/examples/components/Chart/facet-brush-band.svelte b/docs/src/examples/components/Chart/facet-brush-band.svelte new file mode 100644 index 0000000000..cd69c61abc --- /dev/null +++ b/docs/src/examples/components/Chart/facet-brush-band.svelte @@ -0,0 +1,59 @@ + + + + (selection = selectedMonths(e.brush)) + }} + props={{ + bars: { + opacity: (d: { month: string }) => + selection == null || selection.includes(d.month) ? 1 : 0.25, + motion: 'spring' + }, + xAxis: { tickSpacing: 30, tickLabelProps: { class: 'text-[10px]' } } + }} + padding={{ left: 40, bottom: 32, top: 24, right: 8 }} + height={280} +/> diff --git a/docs/src/examples/components/Chart/facet-brush-overview.svelte b/docs/src/examples/components/Chart/facet-brush-overview.svelte new file mode 100644 index 0000000000..e2387f83ad --- /dev/null +++ b/docs/src/examples/components/Chart/facet-brush-overview.svelte @@ -0,0 +1,82 @@ + + + + + {#snippet children({ group })} + {@const window = group.brush.active ? (group.brush.x as [Date, Date]) : undefined} + {@const visible = data.filter((d) => group.brush.contains({ x: d.date }))} + +
+ + +
+
All regions — drag to narrow the panels
+ + + + + +
+
+ {/snippet} +
diff --git a/docs/src/examples/components/Chart/facet-brush-summary.svelte b/docs/src/examples/components/Chart/facet-brush-summary.svelte new file mode 100644 index 0000000000..3289bd8719 --- /dev/null +++ b/docs/src/examples/components/Chart/facet-brush-summary.svelte @@ -0,0 +1,106 @@ + + + + + + + {#snippet children({ group })} + {@const counts = bins.map((b) => ({ + mass: kg(b.x0), + total: b.length, + selected: b.filter((d) => group.brush.contains({ x: d.flipper_length_mm, y: d.body_mass_g })) + .length + }))} + +
+ + {#snippet marks({ context })} + + {#snippet children({ points })} + {#each points as point (point.data)} + {@const isSelected = context.brush.contains({ + x: point.data.flipper_length_mm, + y: point.data.body_mass_g + })} + + + {/each} + {/snippet} + + {/snippet} + + +
+
Body mass (kg)
+ +
+
+ {/snippet} +
diff --git a/docs/src/examples/components/Chart/facet-brush-zoom.svelte b/docs/src/examples/components/Chart/facet-brush-zoom.svelte new file mode 100644 index 0000000000..6ba33d96ae --- /dev/null +++ b/docs/src/examples/components/Chart/facet-brush-zoom.svelte @@ -0,0 +1,41 @@ + + + + + + + {#snippet marks()} + + {/snippet} + diff --git a/docs/src/examples/components/Chart/facet-brush.svelte b/docs/src/examples/components/Chart/facet-brush.svelte new file mode 100644 index 0000000000..62ec2f45de --- /dev/null +++ b/docs/src/examples/components/Chart/facet-brush.svelte @@ -0,0 +1,57 @@ + + + + + + + {#snippet marks({ context })} + + {#snippet children({ points })} + {#each points as point (point.data)} + {@const isSelected = context.brush.contains({ + x: point.data.flipper_length_mm, + y: point.data.body_mass_g + })} + + + {/each} + {/snippet} + + {/snippet} + diff --git a/docs/src/examples/components/Chart/facet-color.svelte b/docs/src/examples/components/Chart/facet-color.svelte new file mode 100644 index 0000000000..f7f8e475e8 --- /dev/null +++ b/docs/src/examples/components/Chart/facet-color.svelte @@ -0,0 +1,29 @@ + + + + + + {#snippet marks()} + + {/snippet} + diff --git a/docs/src/examples/components/Chart/facet-composed.svelte b/docs/src/examples/components/Chart/facet-composed.svelte new file mode 100644 index 0000000000..f2e05b5cb5 --- /dev/null +++ b/docs/src/examples/components/Chart/facet-composed.svelte @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + + diff --git a/docs/src/examples/components/Chart/facet-grid.svelte b/docs/src/examples/components/Chart/facet-grid.svelte new file mode 100644 index 0000000000..d5d9be88cf --- /dev/null +++ b/docs/src/examples/components/Chart/facet-grid.svelte @@ -0,0 +1,33 @@ + + + + + + {#snippet marks()} + + {/snippet} + diff --git a/docs/src/examples/components/Chart/facet-lines.svelte b/docs/src/examples/components/Chart/facet-lines.svelte new file mode 100644 index 0000000000..fbe9bca5e6 --- /dev/null +++ b/docs/src/examples/components/Chart/facet-lines.svelte @@ -0,0 +1,28 @@ + + + + {#snippet marks()} + + {/snippet} + diff --git a/docs/src/examples/components/Chart/facet-non-faceted-marks.svelte b/docs/src/examples/components/Chart/facet-non-faceted-marks.svelte new file mode 100644 index 0000000000..e17786b96b --- /dev/null +++ b/docs/src/examples/components/Chart/facet-non-faceted-marks.svelte @@ -0,0 +1,46 @@ + + + + + + {#snippet marks()} + + + + + + {/snippet} + diff --git a/docs/src/examples/components/Chart/facet-spacing.svelte b/docs/src/examples/components/Chart/facet-spacing.svelte new file mode 100644 index 0000000000..ab4876128e --- /dev/null +++ b/docs/src/examples/components/Chart/facet-spacing.svelte @@ -0,0 +1,43 @@ + + + + +
+ + +
+ + + {#snippet marks()} + + {/snippet} + diff --git a/docs/src/examples/components/Chart/facet-tooltip.svelte b/docs/src/examples/components/Chart/facet-tooltip.svelte new file mode 100644 index 0000000000..4a7f96d6ba --- /dev/null +++ b/docs/src/examples/components/Chart/facet-tooltip.svelte @@ -0,0 +1,44 @@ + + + + + + + + + + + + + + + + + {#snippet children({ data })} + {data.species} · {data.island} + + + + + {/snippet} + + diff --git a/docs/src/examples/components/Chart/facet-two-dimensional.svelte b/docs/src/examples/components/Chart/facet-two-dimensional.svelte new file mode 100644 index 0000000000..59c4271041 --- /dev/null +++ b/docs/src/examples/components/Chart/facet-two-dimensional.svelte @@ -0,0 +1,38 @@ + + + + + + {#snippet marks()} + + + {/snippet} + diff --git a/docs/src/examples/components/Chart/facet-wrap.svelte b/docs/src/examples/components/Chart/facet-wrap.svelte new file mode 100644 index 0000000000..a164d44407 --- /dev/null +++ b/docs/src/examples/components/Chart/facet-wrap.svelte @@ -0,0 +1,88 @@ + + + + + d.industry }} + axis={false} + series={[{ key: 'share', label: 'share of peak', color: 'var(--color-primary)' }]} + tooltipContext={{ mode: 'bisect-x' }} + highlight={{ lines: true, points: { r: 3, strokeWidth: 4 }, facetAll: true }} + props={{ tooltip: { item: { format: 'percentRound' } } }} + padding={{ top: 4, right: 4, bottom: 4, left: 4 }} + height={320} +> + {#snippet marks({ facet })} + + + + + + {/snippet} + diff --git a/docs/src/examples/components/Chart/facet-x.svelte b/docs/src/examples/components/Chart/facet-x.svelte new file mode 100644 index 0000000000..5a4d549ef7 --- /dev/null +++ b/docs/src/examples/components/Chart/facet-x.svelte @@ -0,0 +1,32 @@ + + + + + + {#snippet marks()} + + {/snippet} + diff --git a/docs/src/examples/components/Chart/facet-y.svelte b/docs/src/examples/components/Chart/facet-y.svelte new file mode 100644 index 0000000000..e11af8d18c --- /dev/null +++ b/docs/src/examples/components/Chart/facet-y.svelte @@ -0,0 +1,32 @@ + + + + + + {#snippet marks()} + + {/snippet} + diff --git a/docs/src/examples/components/Chart/mixed-marks-with-stack-long-data.svelte b/docs/src/examples/components/Chart/mixed-marks-with-stack-long-data.svelte new file mode 100644 index 0000000000..bea55d0671 --- /dev/null +++ b/docs/src/examples/components/Chart/mixed-marks-with-stack-long-data.svelte @@ -0,0 +1,109 @@ + + + + + {#snippet children({ context })} + + + + + + + + + + + + + + + + {#snippet children({ data: hovered })} + {@const rows = data.filter((d) => d.month === hovered.month)} + {hovered.month} + + {#each rows as row (row.fruit)} + + {/each} + + + + d.value)} + format="integer" + valueAlign="right" + /> + t.month === hovered.month)?.target} + format="integer" + valueAlign="right" + /> + + {/snippet} + + {/snippet} + diff --git a/docs/src/examples/components/Chart/mixed-marks-with-stack.svelte b/docs/src/examples/components/Chart/mixed-marks-with-stack.svelte new file mode 100644 index 0000000000..9f659f8b71 --- /dev/null +++ b/docs/src/examples/components/Chart/mixed-marks-with-stack.svelte @@ -0,0 +1,84 @@ + + + + + {#snippet children({ context })} + + + + + {#each context.series.visibleSeries as s (s.key)} + + {/each} + + + + + + + + + + + {#snippet children({ data })} + {data.month} + + {#each context.series.visibleSeries as s (s.key)} + + {/each} + + + + data[s.key])} + format="integer" + valueAlign="right" + /> + + + {/snippet} + + {/snippet} + diff --git a/docs/src/examples/components/ChartGroup/basic.svelte b/docs/src/examples/components/ChartGroup/basic.svelte new file mode 100644 index 0000000000..5518b88715 --- /dev/null +++ b/docs/src/examples/components/ChartGroup/basic.svelte @@ -0,0 +1,42 @@ + + + +
+ {#each panels as panel (panel.label)} +
+
{panel.label}
+ +
+ {/each} +
+
diff --git a/docs/src/examples/components/ChartGroup/coordinated-views.svelte b/docs/src/examples/components/ChartGroup/coordinated-views.svelte new file mode 100644 index 0000000000..4fb87f654c --- /dev/null +++ b/docs/src/examples/components/ChartGroup/coordinated-views.svelte @@ -0,0 +1,51 @@ + + + + + + + {#snippet children({ group })} + + {@const viewport = group.brush.active ? group.brush : group.domain} + + + + + + + + + {/snippet} + diff --git a/docs/src/examples/components/ChartGroup/faceted-group.svelte b/docs/src/examples/components/ChartGroup/faceted-group.svelte new file mode 100644 index 0000000000..951552ced8 --- /dev/null +++ b/docs/src/examples/components/ChartGroup/faceted-group.svelte @@ -0,0 +1,79 @@ + + + + +
+
+
By region
+ + {#snippet tooltip({ context })} + + {#snippet children({ data })} + + + + {/snippet} + + {/snippet} + +
+ +
+
Total
+ +
+
+
diff --git a/docs/src/examples/components/ChartGroup/highlight-only.svelte b/docs/src/examples/components/ChartGroup/highlight-only.svelte new file mode 100644 index 0000000000..7ac21e8f92 --- /dev/null +++ b/docs/src/examples/components/ChartGroup/highlight-only.svelte @@ -0,0 +1,50 @@ + + + + {#snippet children({ group })} +
+ {#each panels as panel (panel.key)} + {@const isChartActive = group.pointer.source === panel.key} +
+
{panel.label}
+ +
+ {/each} +
+ {/snippet} +
diff --git a/docs/src/examples/components/ChartGroup/minimap.svelte b/docs/src/examples/components/ChartGroup/minimap.svelte new file mode 100644 index 0000000000..f52484578a --- /dev/null +++ b/docs/src/examples/components/ChartGroup/minimap.svelte @@ -0,0 +1,90 @@ + + + + + {#snippet children({ group })} + + {@const viewport = group.brush.active ? group.brush : group.domain} + {@const viewportX = (viewport.x ?? [null, null]) as any} + {@const viewportY = (viewport.y ?? [null, null]) as any} + +
+ + + + + + + + + + +
+ + {#snippet children({ context })} + + + {#snippet children({ points })} + {#each points as point} + {@const isSelected = context.brush.contains(point.data)} + + + {/each} + {/snippet} + + + {/snippet} + +
+
+ {/snippet} +
diff --git a/docs/src/examples/components/ChartGroup/programmatic-control.svelte b/docs/src/examples/components/ChartGroup/programmatic-control.svelte new file mode 100644 index 0000000000..42fc6ad461 --- /dev/null +++ b/docs/src/examples/components/ChartGroup/programmatic-control.svelte @@ -0,0 +1,98 @@ + + + + +
+
+ + + + + +
+ +
{statusText}
+ + {#each panels as panel (panel.key)} +
+
{panel.label}
+ +
+ {/each} +
diff --git a/docs/src/examples/components/ChartGroup/synced-brushes.svelte b/docs/src/examples/components/ChartGroup/synced-brushes.svelte new file mode 100644 index 0000000000..41eb81d6ad --- /dev/null +++ b/docs/src/examples/components/ChartGroup/synced-brushes.svelte @@ -0,0 +1,88 @@ + + + + + {#snippet children({ group })} + {@const selection = group.brush.active ? (group.brush.x as any) : undefined} +
+ {#each seriesData as data, i (i)} +
+ + + + + + + + {#snippet children({ gradient })} + + {/snippet} + + + + + + + + + + +
+ {/each} +
+ {/snippet} +
diff --git a/docs/src/examples/components/ChartGroup/synced-legend.svelte b/docs/src/examples/components/ChartGroup/synced-legend.svelte new file mode 100644 index 0000000000..7757956307 --- /dev/null +++ b/docs/src/examples/components/ChartGroup/synced-legend.svelte @@ -0,0 +1,28 @@ + + + +
+ + +
+
diff --git a/docs/src/examples/components/ChartGroup/synced-zoom.svelte b/docs/src/examples/components/ChartGroup/synced-zoom.svelte new file mode 100644 index 0000000000..62979e502e --- /dev/null +++ b/docs/src/examples/components/ChartGroup/synced-zoom.svelte @@ -0,0 +1,45 @@ + + + + +
+ {#each panels as panel (panel.key)} +
+
{panel.label}
+ +
+ {/each} +
+
diff --git a/docs/src/examples/components/Dodge/grouped-horizontal.svelte b/docs/src/examples/components/Dodge/grouped-horizontal.svelte index fc9f8051d2..2995c33247 100644 --- a/docs/src/examples/components/Dodge/grouped-horizontal.svelte +++ b/docs/src/examples/components/Dodge/grouped-horizontal.svelte @@ -15,14 +15,15 @@ bandPadding={0.2} x="body_mass_g" xNice + valueAxis="x" series={[ { key: 'female', label: 'Female', color: 'var(--color-warning)' }, { key: 'male', label: 'Male', color: 'var(--color-info)' } ]} + seriesLayout="overlap" + legend={{ placement: 'top', variant: 'swatches' }} padding={{ top: 12, bottom: 32, left: 80, right: 12 }} height={400} - valueAxis="x" - legend={{ placement: 'top', variant: 'swatches' }} > {#snippet marks({ context })} {@const bandwidth = context.yScale.bandwidth?.() ?? 0} diff --git a/docs/src/examples/components/Dodge/grouped-vertical.svelte b/docs/src/examples/components/Dodge/grouped-vertical.svelte index c8b46af283..96cb659644 100644 --- a/docs/src/examples/components/Dodge/grouped-vertical.svelte +++ b/docs/src/examples/components/Dodge/grouped-vertical.svelte @@ -19,6 +19,7 @@ { key: 'female', label: 'Female', color: 'var(--color-warning)' }, { key: 'male', label: 'Male', color: 'var(--color-info)' } ]} + seriesLayout="overlap" padding={{ top: 12, bottom: 24, left: 40, right: 12 }} height={400} legend={{ placement: 'top', variant: 'swatches' }} diff --git a/docs/src/examples/components/GeoPath/transform-globe-constrain.svelte b/docs/src/examples/components/GeoPath/transform-globe-constrain.svelte index 2d9d7a33f1..aeead18777 100644 --- a/docs/src/examples/components/GeoPath/transform-globe-constrain.svelte +++ b/docs/src/examples/components/GeoPath/transform-globe-constrain.svelte @@ -34,13 +34,11 @@ padding={{ top: 5, bottom: 5, left: 5, right: 5 }} height={400} > - {#snippet children()} - - - - {#each countries.features as feature} - - {/each} - - {/snippet} + + + + {#each countries.features as feature} + + {/each} +
diff --git a/docs/src/examples/components/GeoPath/transform-globe-inertia.svelte b/docs/src/examples/components/GeoPath/transform-globe-inertia.svelte index f0cd8637a0..ba1ba7dbbe 100644 --- a/docs/src/examples/components/GeoPath/transform-globe-inertia.svelte +++ b/docs/src/examples/components/GeoPath/transform-globe-inertia.svelte @@ -48,13 +48,11 @@ padding={{ top: 5, bottom: 5, left: 5, right: 5 }} height={400} > - {#snippet children()} - - - - {#each countries.features as feature} - - {/each} - - {/snippet} + + + + {#each countries.features as feature} + + {/each} +
diff --git a/docs/src/examples/components/Legend/ordinal.svelte b/docs/src/examples/components/Legend/ordinal.svelte index aba9704fdb..f4acdec6b1 100644 --- a/docs/src/examples/components/Legend/ordinal.svelte +++ b/docs/src/examples/components/Legend/ordinal.svelte @@ -11,6 +11,7 @@ schemeSpectral[10] )} title="Age (years)" + variant="ramp" tickLength={0} /> + import { LineChart } from 'layerchart'; + import { scalePoint } from 'd3-scale'; + import { sort } from '@layerstack/utils'; + import { longData } from '$lib/utils/data.js'; + + // A point scale takes the domain in data order, so the years have to arrive in it + const data = sort(longData, 'year'); + export { data }; + + + + diff --git a/docs/src/examples/components/LineChart/persist-brush-zoom.svelte b/docs/src/examples/components/LineChart/persist-brush-zoom.svelte index 555f41896a..2b0d07cd60 100644 --- a/docs/src/examples/components/LineChart/persist-brush-zoom.svelte +++ b/docs/src/examples/components/LineChart/persist-brush-zoom.svelte @@ -4,35 +4,35 @@ + +
+ {#each slices as s (s.key)} + {@const isVisible = context?.series.isVisible(s.key) ?? true} + + + {/each} + + + + +
+ + s.color)} + height={300} +/> diff --git a/docs/src/examples/components/Spline/multiple-series-with-labels.svelte b/docs/src/examples/components/Spline/multiple-series-with-labels.svelte index be6bf80774..9b34ae651b 100644 --- a/docs/src/examples/components/Spline/multiple-series-with-labels.svelte +++ b/docs/src/examples/components/Spline/multiple-series-with-labels.svelte @@ -1,5 +1,4 @@ + + + + +
+ {selectedIds.size} of {rows.length} penguins + {#if active.length} + · brushed on {active.map((k) => dimensions[k]).join(', ')} + {/if} +
+ + scales.get(d.dimension)?.(d.value)} + yDomain={[0, 1]} + z="id" + padding={{ left: 48, right: 48, top: 32, bottom: 8 }} + height={400} +> + {#snippet axis({ context })} + {#each keys as key (key)} + + + + + + + {/each} + {/snippet} + + {#snippet marks()} + + + selectedIds.has(d.id) ? 'var(--color-primary)' : 'var(--color-surface-content)'} + strokeWidth={1} + opacity={(d) => (selectedIds.has(d.id) ? 0.4 : 0.03)} + /> + {/snippet} + diff --git a/docs/src/examples/components/Spline/parallel-coordinates-faceted.svelte b/docs/src/examples/components/Spline/parallel-coordinates-faceted.svelte new file mode 100644 index 0000000000..43c8fe0681 --- /dev/null +++ b/docs/src/examples/components/Spline/parallel-coordinates-faceted.svelte @@ -0,0 +1,82 @@ + + + + + + scales.get(d.dimension)?.(d.value)} + yDomain={[0, 1]} + z="id" + fy="species" + {series} + padding={{ left: 48, right: 76, top: 32, bottom: 8 }} + height={560} +> + {#snippet axis({ context })} + + dimensions[d as keyof typeof dimensions]} tickLength={0} /> + + {#each keys as key (key)} + + + + + {/each} + {/snippet} + + {#snippet marks()} + + + {/snippet} + diff --git a/docs/src/examples/components/Spline/parallel-coordinates-mixed.svelte b/docs/src/examples/components/Spline/parallel-coordinates-mixed.svelte new file mode 100644 index 0000000000..f2dde96216 --- /dev/null +++ b/docs/src/examples/components/Spline/parallel-coordinates-mixed.svelte @@ -0,0 +1,121 @@ + + + + + +
+ {selectedIds.size} of {rows.length} flowers + {#if active.length} + · brushed on {active.map((k) => dimensions[k]).join(', ')} + {/if} +
+ + scales.get(d.dimension)?.(d.value)} + yDomain={[0, 1]} + z="id" + c="group" + cDomain={species} + cRange={['var(--color-info)', 'var(--color-success)', 'var(--color-warning)']} + padding={{ left: 48, right: 72, top: 32, bottom: 8 }} + height={400} +> + {#snippet axis({ context })} + + dimensions[d as keyof typeof dimensions]} tickLength={0} /> + + {#each keys as key (key)} + + + + + + {/each} + {/snippet} + + {#snippet marks({ context })} + + + selectedIds.has(d.id) ? context.cScale?.(d.group) : 'var(--color-surface-content)'} + strokeWidth={1} + opacity={(d) => (selectedIds.has(d.id) ? 0.5 : 0.03)} + /> + {/snippet} + diff --git a/docs/src/examples/components/Spline/parallel-coordinates.svelte b/docs/src/examples/components/Spline/parallel-coordinates.svelte new file mode 100644 index 0000000000..241cd8a7ab --- /dev/null +++ b/docs/src/examples/components/Spline/parallel-coordinates.svelte @@ -0,0 +1,88 @@ + + + + + scales.get(d.dimension)?.(d.value)} + yDomain={[0, 1]} + z="id" + {series} + padding={{ left: 48, right: 48, top: 48, bottom: 8 }} + height={400} +> + {#snippet legend()} + + {/snippet} + + {#snippet axis({ context })} + {#each keys as key (key)} + + + + + {/each} + {/snippet} + + {#snippet marks({ context })} + + context.series.isVisible(d.species))} + stroke="species" + strokeWidth={1} + opacity={(d) => (context.series.isHighlighted(d.species, true) ? 0.4 : 0.05)} + /> + {/snippet} + diff --git a/docs/src/examples/components/Spline/radial-multi-year-lines.svelte b/docs/src/examples/components/Spline/radial-multi-year-lines.svelte index 0c661d48ff..8d50c308e8 100644 --- a/docs/src/examples/components/Spline/radial-multi-year-lines.svelte +++ b/docs/src/examples/components/Spline/radial-multi-year-lines.svelte @@ -5,9 +5,7 @@ + + + + + + + + + + + diff --git a/docs/src/examples/components/Tooltip/programmatic-control.svelte b/docs/src/examples/components/Tooltip/programmatic-control.svelte new file mode 100644 index 0000000000..0ec86d5fa9 --- /dev/null +++ b/docs/src/examples/components/Tooltip/programmatic-control.svelte @@ -0,0 +1,78 @@ + + + + +
+
+ + + + + +
+ +
{statusText}
+ + +
diff --git a/docs/src/examples/components/Tree/html-nodes.svelte b/docs/src/examples/components/Tree/html-nodes.svelte index 300885fab1..1264068a3c 100644 --- a/docs/src/examples/components/Tree/html-nodes.svelte +++ b/docs/src/examples/components/Tree/html-nodes.svelte @@ -57,68 +57,66 @@ - {#snippet children()} - + - - {#snippet children({ nodes, links })} - - {#each links as link (getNodeKey(link.source) + '_' + getNodeKey(link.target))} - - {/each} - + + {#snippet children({ nodes, links })} + + {#each links as link (getNodeKey(link.source) + '_' + getNodeKey(link.target))} + + {/each} + - - {#each nodes as node} - {@const x = (config.orientation === 'horizontal' ? node.y : node.x) - nodeWidth / 2} - {@const y = (config.orientation === 'horizontal' ? node.x : node.y) - nodeHeight / 2} - { - if (expandedNodeNames.includes(node.data.name)) { - expandedNodeNames = expandedNodeNames.filter((name) => name !== node.data.name); - } else { - expandedNodeNames = [...expandedNodeNames, node.data.name]; - } - selected = node; - }} - > - {node.data.name} - - {/each} - - {/snippet} - - {/snippet} + + {#each nodes as node} + {@const x = (config.orientation === 'horizontal' ? node.y : node.x) - nodeWidth / 2} + {@const y = (config.orientation === 'horizontal' ? node.x : node.y) - nodeHeight / 2} + { + if (expandedNodeNames.includes(node.data.name)) { + expandedNodeNames = expandedNodeNames.filter((name) => name !== node.data.name); + } else { + expandedNodeNames = [...expandedNodeNames, node.data.name]; + } + selected = node; + }} + > + {node.data.name} + + {/each} + + {/snippet} + diff --git a/docs/src/examples/components/Waffle/custom-symbol.svelte b/docs/src/examples/components/Waffle/custom-symbol.svelte index 9f37dd5c19..83cbb9721b 100644 --- a/docs/src/examples/components/Waffle/custom-symbol.svelte +++ b/docs/src/examples/components/Waffle/custom-symbol.svelte @@ -30,7 +30,6 @@ { key: 'Chinstrap', color: 'var(--color-warning)' }, { key: 'Gentoo', color: 'var(--color-success)' } ]} - seriesLayout="stack" padding={{ left: 36, bottom: 24, top: 32, right: 8 }} tooltipContext={{ mode: 'band' }} height={400} diff --git a/docs/src/examples/components/Waffle/olympians-weight-by-sex.svelte b/docs/src/examples/components/Waffle/olympians-weight-by-sex.svelte index fba63e272b..8bccf22c70 100644 --- a/docs/src/examples/components/Waffle/olympians-weight-by-sex.svelte +++ b/docs/src/examples/components/Waffle/olympians-weight-by-sex.svelte @@ -31,7 +31,6 @@ { key: 'female', color: 'var(--color-warning)' }, { key: 'male', color: 'var(--color-info)' } ]} - seriesLayout="stack" padding={{ left: 36, bottom: 24, top: 8, right: 8 }} tooltipContext={{ mode: 'band' }} height={400} diff --git a/docs/src/examples/components/Waffle/penguins.svelte b/docs/src/examples/components/Waffle/penguins.svelte index 4e89cdf184..62600575f1 100644 --- a/docs/src/examples/components/Waffle/penguins.svelte +++ b/docs/src/examples/components/Waffle/penguins.svelte @@ -30,7 +30,6 @@ { key: 'Chinstrap', color: 'var(--color-warning)' }, { key: 'Gentoo', color: 'var(--color-success)' } ]} - seriesLayout="stack" padding={{ left: 36, bottom: 24, top: 32, right: 8 }} tooltipContext={{ mode: 'band' }} height={400} diff --git a/docs/src/examples/components/Waffle/stacked.svelte b/docs/src/examples/components/Waffle/stacked.svelte index ab6dccb120..ac73d02b70 100644 --- a/docs/src/examples/components/Waffle/stacked.svelte +++ b/docs/src/examples/components/Waffle/stacked.svelte @@ -26,7 +26,6 @@ { key: 'cherries', color: 'var(--color-cherries)' }, { key: 'grapes', color: 'var(--color-grapes)' } ]} - seriesLayout="stack" padding={{ left: 36, bottom: 40, top: 8, right: 8 }} tooltipContext={{ mode: 'band' }} height={400} diff --git a/docs/src/lib/data.remote.ts b/docs/src/lib/data.remote.ts index aef6a1b83a..3a90f6b5b6 100644 --- a/docs/src/lib/data.remote.ts +++ b/docs/src/lib/data.remote.ts @@ -7,6 +7,7 @@ import { prerender, getRequestEvent, query } from '$app/server'; import { z } from 'zod'; import type { PenguinsData } from '$static/data/examples/penguins.js'; +import type { IrisData } from '$static/data/examples/iris.js'; import type { AppleStockData } from '$static/data/examples/date/apple-stock.js'; import type { USSenatorsData } from '$static/data/examples/us-senators'; import type { CivilizationTimeline } from '$static/data/examples/date/civilization-timeline.js'; @@ -119,6 +120,14 @@ export const getPenguins = prerender(async () => { return data; }); +export const getIris = prerender(async () => { + const { fetch } = getRequestEvent(); + const data = (await fetch('/data/examples/iris.csv').then(async (r) => + csvParse(await r.text(), autoType) + )) as IrisData; + return data; +}); + export const getFlare = prerender(async () => { const { fetch } = getRequestEvent(); const data = await fetch('/data/examples/hierarchy/flare.json').then((r) => r.json()); diff --git a/docs/src/routes/docs/+layout.svelte b/docs/src/routes/docs/+layout.svelte index 070a17b265..1d24dce9f7 100644 --- a/docs/src/routes/docs/+layout.svelte +++ b/docs/src/routes/docs/+layout.svelte @@ -33,6 +33,27 @@ // let pageContent = $derived(page.data.content.docs[page.params.slug] ?? {}); let showDrawer = $state(false); let showSidebar = $state(true); + + const GITHUB_BLOB_URL = 'https://github.com/techniq/layerchart/blob/main/docs'; + + /** Source markdown of the current page, if it has one (`null` for pages such as `/docs/releases`) */ + let editUrl = $derived.by(() => { + if (page.data.meta?.hideEditLink) return null; + + // Content collection pages (`/docs/{components,guides,utils}/...` sourced from `src/content`) + const collection = page.url.pathname.split('/')[2]; + const filePath = page.data.metadata?._meta?.filePath; + if (filePath && ['components', 'guides', 'utils'].includes(collection)) { + return `${GITHUB_BLOB_URL}/src/content/${collection}/${filePath}`; + } + + // Standalone markdown pages colocated with their route (e.g. `/docs/getting-started`) + if (page.data.markdownPath) { + return `${GITHUB_BLOB_URL}${page.data.markdownPath}`; + } + + return null; + });
@@ -200,10 +221,10 @@ {@render children()} - {#if !page.data.meta?.hideEditLink} + {#if editUrl}
diff --git a/docs/src/routes/docs/+layout.ts b/docs/src/routes/docs/+layout.ts index caee890525..534f750047 100644 --- a/docs/src/routes/docs/+layout.ts +++ b/docs/src/routes/docs/+layout.ts @@ -2,6 +2,8 @@ import { loadExamplesFromMarkdown } from '$lib/content.js'; export const load = async ({ url }) => { let examples = {}; + // Source file (relative to `/docs`) of standalone markdown pages, used for the "Edit this page" link + let markdownPath: string | null = null; // Only load examples for standalone markdown pages (not component/example routes) // Component/example routes handle their own example loading via their layout @@ -36,6 +38,7 @@ export const load = async ({ url }) => { 'components', pathname // for resolving relative paths ); + markdownPath = mdPath; break; } catch (e) { console.warn(`Failed to load markdown at ${mdPath}:`, e); @@ -45,6 +48,7 @@ export const load = async ({ url }) => { } return { - examples + examples, + markdownPath }; }; diff --git a/docs/src/routes/docs/getting-started/+page.md b/docs/src/routes/docs/getting-started/+page.md index 55cbaaf2a5..7417d97144 100644 --- a/docs/src/routes/docs/getting-started/+page.md +++ b/docs/src/routes/docs/getting-started/+page.md @@ -207,54 +207,54 @@ Starter [project repos](https://github.com/techniq/layerchart/tree/main/examples [shadcn-svelte](https://www.shadcn-svelte.com/) - v1: - :button{label="Source" href="https://github.com/techniq/layerchart/tree/docs-v2/examples/shadcn-svelte-1" size="sm" icon="lucide:github"} - :button{label="Open in StackBlitz" href="https://stackblitz.com/github/techniq/layerchart/tree/docs-v2/examples/shadcn-svelte-1" size="sm" icon="simple-icons:stackblitz"} + :button{label="Source" href="https://github.com/techniq/layerchart/tree/main/examples/shadcn-svelte-1" size="sm" icon="lucide:github"} + :button{label="Open in StackBlitz" href="https://stackblitz.com/github/techniq/layerchart/tree/main/examples/shadcn-svelte-1" size="sm" icon="simple-icons:stackblitz"} :: ::tab{label="Skeleton" icon="custom-brands:skeleton"} [Skeleton](https://www.skeleton.dev/) - v3: - :button{label="Source" href="https://github.com/techniq/layerchart/tree/docs-v2/examples/skeleton-3" size="sm" icon="lucide:github"} - :button{label="Open in StackBlitz" href="https://stackblitz.com/github/techniq/layerchart/tree/docs-v2/examples/skeleton-3" size="sm" icon="simple-icons:stackblitz"} + :button{label="Source" href="https://github.com/techniq/layerchart/tree/main/examples/skeleton-3" size="sm" icon="lucide:github"} + :button{label="Open in StackBlitz" href="https://stackblitz.com/github/techniq/layerchart/tree/main/examples/skeleton-3" size="sm" icon="simple-icons:stackblitz"} - v4: - :button{label="Source" href="https://github.com/techniq/layerchart/tree/docs-v2/examples/skeleton-4" size="sm" icon="lucide:github"} - :button{label="Open in StackBlitz" href="https://stackblitz.com/github/techniq/layerchart/tree/docs-v2/examples/skeleton-4" size="sm" icon="simple-icons:stackblitz"} + :button{label="Source" href="https://github.com/techniq/layerchart/tree/main/examples/skeleton-4" size="sm" icon="lucide:github"} + :button{label="Open in StackBlitz" href="https://stackblitz.com/github/techniq/layerchart/tree/main/examples/skeleton-4" size="sm" icon="simple-icons:stackblitz"} - v5: - :button{label="Source" href="https://github.com/techniq/layerchart/tree/docs-v2/examples/skeleton-5" size="sm" icon="lucide:github"} - :button{label="Open in StackBlitz" href="https://stackblitz.com/github/techniq/layerchart/tree/docs-v2/examples/skeleton-5" size="sm" icon="simple-icons:stackblitz"} + :button{label="Source" href="https://github.com/techniq/layerchart/tree/main/examples/skeleton-5" size="sm" icon="lucide:github"} + :button{label="Open in StackBlitz" href="https://stackblitz.com/github/techniq/layerchart/tree/main/examples/skeleton-5" size="sm" icon="simple-icons:stackblitz"} :: ::tab{label="Svelte UX" icon="custom-brands:svelteux"} [Svelte UX](https://svelte-ux.techniq.dev/) - v2: - :button{label="Source" href="https://github.com/techniq/layerchart/tree/docs-v2/examples/svelte-ux-2" size="sm" icon="lucide:github"} - :button{label="Open in StackBlitz" href="https://stackblitz.com/github/techniq/layerchart/tree/docs-v2/examples/svelte-ux-2" size="sm" icon="simple-icons:stackblitz"} + :button{label="Source" href="https://github.com/techniq/layerchart/tree/main/examples/svelte-ux-2" size="sm" icon="lucide:github"} + :button{label="Open in StackBlitz" href="https://stackblitz.com/github/techniq/layerchart/tree/main/examples/svelte-ux-2" size="sm" icon="simple-icons:stackblitz"} :: ::tab{label="daisyUI" icon="custom-brands:daisyUI"} [daisyUI](https://daisyui.com/) - v5: - :button{label="Source" href="https://github.com/techniq/layerchart/tree/docs-v2/examples/daisyui-5" size="sm" icon="lucide:github"} - :button{label="Open in StackBlitz" href="https://stackblitz.com/github/techniq/layerchart/tree/docs-v2/examples/daisyui-5" size="sm" icon="simple-icons:stackblitz"} + :button{label="Source" href="https://github.com/techniq/layerchart/tree/main/examples/daisyui-5" size="sm" icon="lucide:github"} + :button{label="Open in StackBlitz" href="https://stackblitz.com/github/techniq/layerchart/tree/main/examples/daisyui-5" size="sm" icon="simple-icons:stackblitz"} :: ::tab{label="UnoCSS" icon="logos:unocss"} [UnoCSS](https://unocss.dev/) - - :button{label="Source" href="https://github.com/techniq/layerchart/tree/docs-v2/examples/unocss" size="sm" icon="lucide:github"} - :button{label="Open in StackBlitz" href="https://stackblitz.com/github/techniq/layerchart/tree/docs-v2/examples/unocss-1" size="sm" icon="simple-icons:stackblitz"} + :button{label="Source" href="https://github.com/techniq/layerchart/tree/main/examples/unocss" size="sm" icon="lucide:github"} + :button{label="Open in StackBlitz" href="https://stackblitz.com/github/techniq/layerchart/tree/main/examples/unocss-1" size="sm" icon="simple-icons:stackblitz"} :: ::tab{label="Vanilla CSS" icon="vscode-icons:file-type-css"} Vanilla CSS - - :button{label="Source" href="https://github.com/techniq/layerchart/tree/docs-v2/examples/standalone" size="sm" icon="lucide:github"} - :button{label="Open in StackBlitz" href="https://stackblitz.com/github/techniq/layerchart/tree/docs-v2/examples/standalone" size="sm" icon="simple-icons:stackblitz"} + :button{label="Source" href="https://github.com/techniq/layerchart/tree/main/examples/standalone" size="sm" icon="lucide:github"} + :button{label="Open in StackBlitz" href="https://stackblitz.com/github/techniq/layerchart/tree/main/examples/standalone" size="sm" icon="simple-icons:stackblitz"} :: ::: diff --git a/docs/static/data/examples/iris.csv b/docs/static/data/examples/iris.csv new file mode 100644 index 0000000000..ba0ebd24cd --- /dev/null +++ b/docs/static/data/examples/iris.csv @@ -0,0 +1,151 @@ +sepal_length,sepal_width,petal_length,petal_width,species +5.1,3.5,1.4,0.2,setosa +4.9,3.0,1.4,0.2,setosa +4.7,3.2,1.3,0.2,setosa +4.6,3.1,1.5,0.2,setosa +5.0,3.6,1.4,0.2,setosa +5.4,3.9,1.7,0.4,setosa +4.6,3.4,1.4,0.3,setosa +5.0,3.4,1.5,0.2,setosa +4.4,2.9,1.4,0.2,setosa +4.9,3.1,1.5,0.1,setosa +5.4,3.7,1.5,0.2,setosa +4.8,3.4,1.6,0.2,setosa +4.8,3.0,1.4,0.1,setosa +4.3,3.0,1.1,0.1,setosa +5.8,4.0,1.2,0.2,setosa +5.7,4.4,1.5,0.4,setosa +5.4,3.9,1.3,0.4,setosa +5.1,3.5,1.4,0.3,setosa +5.7,3.8,1.7,0.3,setosa +5.1,3.8,1.5,0.3,setosa +5.4,3.4,1.7,0.2,setosa +5.1,3.7,1.5,0.4,setosa +4.6,3.6,1.0,0.2,setosa +5.1,3.3,1.7,0.5,setosa +4.8,3.4,1.9,0.2,setosa +5.0,3.0,1.6,0.2,setosa +5.0,3.4,1.6,0.4,setosa +5.2,3.5,1.5,0.2,setosa +5.2,3.4,1.4,0.2,setosa +4.7,3.2,1.6,0.2,setosa +4.8,3.1,1.6,0.2,setosa +5.4,3.4,1.5,0.4,setosa +5.2,4.1,1.5,0.1,setosa +5.5,4.2,1.4,0.2,setosa +4.9,3.1,1.5,0.1,setosa +5.0,3.2,1.2,0.2,setosa +5.5,3.5,1.3,0.2,setosa +4.9,3.1,1.5,0.1,setosa +4.4,3.0,1.3,0.2,setosa +5.1,3.4,1.5,0.2,setosa +5.0,3.5,1.3,0.3,setosa +4.5,2.3,1.3,0.3,setosa +4.4,3.2,1.3,0.2,setosa +5.0,3.5,1.6,0.6,setosa +5.1,3.8,1.9,0.4,setosa +4.8,3.0,1.4,0.3,setosa +5.1,3.8,1.6,0.2,setosa +4.6,3.2,1.4,0.2,setosa +5.3,3.7,1.5,0.2,setosa +5.0,3.3,1.4,0.2,setosa +7.0,3.2,4.7,1.4,versicolor +6.4,3.2,4.5,1.5,versicolor +6.9,3.1,4.9,1.5,versicolor +5.5,2.3,4.0,1.3,versicolor +6.5,2.8,4.6,1.5,versicolor +5.7,2.8,4.5,1.3,versicolor +6.3,3.3,4.7,1.6,versicolor +4.9,2.4,3.3,1.0,versicolor +6.6,2.9,4.6,1.3,versicolor +5.2,2.7,3.9,1.4,versicolor +5.0,2.0,3.5,1.0,versicolor +5.9,3.0,4.2,1.5,versicolor +6.0,2.2,4.0,1.0,versicolor +6.1,2.9,4.7,1.4,versicolor +5.6,2.9,3.6,1.3,versicolor +6.7,3.1,4.4,1.4,versicolor +5.6,3.0,4.5,1.5,versicolor +5.8,2.7,4.1,1.0,versicolor +6.2,2.2,4.5,1.5,versicolor +5.6,2.5,3.9,1.1,versicolor +5.9,3.2,4.8,1.8,versicolor +6.1,2.8,4.0,1.3,versicolor +6.3,2.5,4.9,1.5,versicolor +6.1,2.8,4.7,1.2,versicolor +6.4,2.9,4.3,1.3,versicolor +6.6,3.0,4.4,1.4,versicolor +6.8,2.8,4.8,1.4,versicolor +6.7,3.0,5.0,1.7,versicolor +6.0,2.9,4.5,1.5,versicolor +5.7,2.6,3.5,1.0,versicolor +5.5,2.4,3.8,1.1,versicolor +5.5,2.4,3.7,1.0,versicolor +5.8,2.7,3.9,1.2,versicolor +6.0,2.7,5.1,1.6,versicolor +5.4,3.0,4.5,1.5,versicolor +6.0,3.4,4.5,1.6,versicolor +6.7,3.1,4.7,1.5,versicolor +6.3,2.3,4.4,1.3,versicolor +5.6,3.0,4.1,1.3,versicolor +5.5,2.5,4.0,1.3,versicolor +5.5,2.6,4.4,1.2,versicolor +6.1,3.0,4.6,1.4,versicolor +5.8,2.6,4.0,1.2,versicolor +5.0,2.3,3.3,1.0,versicolor +5.6,2.7,4.2,1.3,versicolor +5.7,3.0,4.2,1.2,versicolor +5.7,2.9,4.2,1.3,versicolor +6.2,2.9,4.3,1.3,versicolor +5.1,2.5,3.0,1.1,versicolor +5.7,2.8,4.1,1.3,versicolor +6.3,3.3,6.0,2.5,virginica +5.8,2.7,5.1,1.9,virginica +7.1,3.0,5.9,2.1,virginica +6.3,2.9,5.6,1.8,virginica +6.5,3.0,5.8,2.2,virginica +7.6,3.0,6.6,2.1,virginica +4.9,2.5,4.5,1.7,virginica +7.3,2.9,6.3,1.8,virginica +6.7,2.5,5.8,1.8,virginica +7.2,3.6,6.1,2.5,virginica +6.5,3.2,5.1,2.0,virginica +6.4,2.7,5.3,1.9,virginica +6.8,3.0,5.5,2.1,virginica +5.7,2.5,5.0,2.0,virginica +5.8,2.8,5.1,2.4,virginica +6.4,3.2,5.3,2.3,virginica +6.5,3.0,5.5,1.8,virginica +7.7,3.8,6.7,2.2,virginica +7.7,2.6,6.9,2.3,virginica +6.0,2.2,5.0,1.5,virginica +6.9,3.2,5.7,2.3,virginica +5.6,2.8,4.9,2.0,virginica +7.7,2.8,6.7,2.0,virginica +6.3,2.7,4.9,1.8,virginica +6.7,3.3,5.7,2.1,virginica +7.2,3.2,6.0,1.8,virginica +6.2,2.8,4.8,1.8,virginica +6.1,3.0,4.9,1.8,virginica +6.4,2.8,5.6,2.1,virginica +7.2,3.0,5.8,1.6,virginica +7.4,2.8,6.1,1.9,virginica +7.9,3.8,6.4,2.0,virginica +6.4,2.8,5.6,2.2,virginica +6.3,2.8,5.1,1.5,virginica +6.1,2.6,5.6,1.4,virginica +7.7,3.0,6.1,2.3,virginica +6.3,3.4,5.6,2.4,virginica +6.4,3.1,5.5,1.8,virginica +6.0,3.0,4.8,1.8,virginica +6.9,3.1,5.4,2.1,virginica +6.7,3.1,5.6,2.4,virginica +6.9,3.1,5.1,2.3,virginica +5.8,2.7,5.1,1.9,virginica +6.8,3.2,5.9,2.3,virginica +6.7,3.3,5.7,2.5,virginica +6.7,3.0,5.2,2.3,virginica +6.3,2.5,5.0,1.9,virginica +6.5,3.0,5.2,2.0,virginica +6.2,3.4,5.4,2.3,virginica +5.9,3.0,5.1,1.8,virginica diff --git a/docs/static/data/examples/iris.d.ts b/docs/static/data/examples/iris.d.ts new file mode 100644 index 0000000000..01f693fc87 --- /dev/null +++ b/docs/static/data/examples/iris.d.ts @@ -0,0 +1,7 @@ +export type IrisData = { + sepal_length: number; + sepal_width: number; + petal_length: number; + petal_width: number; + species: 'setosa' | 'versicolor' | 'virginica'; +}[]; diff --git a/docs/static/remote-sources.json b/docs/static/remote-sources.json index 93ceaf9d98..77c69fd5b0 100644 --- a/docs/static/remote-sources.json +++ b/docs/static/remote-sources.json @@ -1,5 +1,5 @@ { - "data.remote.ts": "import { celsiusToFahrenheit } from 'layerchart';\nimport { parse, sortFunc } from '@layerstack/utils';\nimport { ascending, flatGroup, max, mean, min } from 'd3-array';\nimport { csvParse, csvParseRows, autoType } from 'd3-dsv';\n\nimport { prerender, getRequestEvent, query } from '$app/server';\nimport { z } from 'zod';\n\nimport type { PenguinsData } from '$static/data/examples/penguins.js';\nimport type { AppleStockData } from '$static/data/examples/date/apple-stock.js';\nimport type { USSenatorsData } from '$static/data/examples/us-senators';\nimport type { CivilizationTimeline } from '$static/data/examples/date/civilization-timeline.js';\nimport type { HydroData } from '$static/data/examples/date/hydro.js';\nimport type { AppleTickerData } from '$static/data/examples/date/apple-ticker.js';\nimport type { NewPassengerCars } from '$static/data/examples/new-passenger-cars.js';\n\nexport const getGroupData = prerender(async () => {\n\tconst { fetch } = getRequestEvent();\n\tconst data = (await fetch('/data/examples/group-data.json').then((r) => r.json())) as {\n\t\tx: number;\n\t\ty: number;\n\t\tgroup: string;\n\t}[];\n\treturn data;\n});\n\nexport const getAppleStock = prerender(async () => {\n\tconst { fetch } = getRequestEvent();\n\tconst data = await fetch('/data/examples/date/apple-stock.json').then(async (r) =>\n\t\tparse(await r.text())\n\t);\n\treturn data;\n});\n\nexport const getAppleStockRange = query(\n\tz.object({\n\t\tstart: z.string().optional(),\n\t\tend: z.string().optional(),\n\t\tmaxPoints: z.number().optional().default(300)\n\t}),\n\tasync ({ start, end, maxPoints }) => {\n\t\tconst { fetch } = getRequestEvent();\n\t\tlet data = await fetch('/data/examples/date/apple-stock.json').then(async (r) =>\n\t\t\tparse(await r.text())\n\t\t);\n\n\t\tif (start || end) {\n\t\t\tconst startDate = start ? new Date(start) : undefined;\n\t\t\tconst endDate = end ? new Date(end) : undefined;\n\t\t\tdata = data.filter(\n\t\t\t\t(d) => (!startDate || d.date >= startDate) && (!endDate || d.date <= endDate)\n\t\t\t);\n\t\t}\n\n\t\tif (data.length > maxPoints) {\n\t\t\tconst step = (data.length - 1) / (maxPoints - 1);\n\t\t\tdata = Array.from({ length: maxPoints }, (_, i) => data![Math.round(i * step)]);\n\t\t}\n\n\t\treturn data;\n\t}\n);\n\nexport const getDailyTemperature = prerender(async () => {\n\tconst { fetch } = getRequestEvent();\n\tconst data = await fetch('/data/examples/date/daily-temperature.json').then(async (r) =>\n\t\tparse<{ date: Date; value: number }[]>(await r.text())\n\t);\n\treturn data;\n});\n\nexport const getDailyTemperatures = prerender(async () => {\n\tconst { fetch } = getRequestEvent();\n\tconst data = await fetch('/data/examples/dailyTemperatures.csv').then(async (r) => {\n\t\treturn csvParse<{ dayOfYear: number; year: number; value: number | 'NA' }>(\n\t\t\tawait r.text(),\n\t\t\t// @ts-expect-error - autoType\n\t\t\tautoType\n\t\t)\n\t\t\t.filter((d) => d.value !== 'NA' && d.dayOfYear <= 365 /* Ignore 366th day */)\n\t\t\t.map((d) => {\n\t\t\t\tconst origDate = new Date(d.year, 0, d.dayOfYear);\n\t\t\t\treturn {\n\t\t\t\t\t...d,\n\t\t\t\t\tdate: new Date(Date.UTC(2000, origDate.getUTCMonth(), origDate.getUTCDate())),\n\t\t\t\t\tvalue: d.value !== 'NA' ? celsiusToFahrenheit(d.value) : 'NA'\n\t\t\t\t};\n\t\t\t});\n\t});\n\treturn data;\n});\n\nexport const getSfoTemperatures = prerender(async () => {\n\tconst { fetch } = getRequestEvent();\n\tconst data = await fetch('/data/examples/sfoTemperatures.csv').then(async (r) => {\n\t\treturn flatGroup(\n\t\t\t// @ts-expect-error - autoType\n\t\t\tcsvParse<{ date: Date; tavg: number; tmax: number; tmin: number }>(await r.text(), autoType),\n\t\t\t(d) => new Date(Date.UTC(2000, d.date.getUTCMonth(), d.date.getUTCDate())) // group by day of year\n\t\t)\n\t\t\t.sort(([a], [b]) => ascending(a, b)) // sort chronologically\n\t\t\t.map(([date, v]) => ({\n\t\t\t\tdate,\n\t\t\t\tavg: mean(v, (d) => d.tavg || NaN),\n\t\t\t\tmin: mean(v, (d) => d.tmin || NaN),\n\t\t\t\tmax: mean(v, (d) => d.tmax || NaN),\n\t\t\t\tminmin: min(v, (d) => d.tmin || NaN),\n\t\t\t\tmaxmax: max(v, (d) => d.tmax || NaN)\n\t\t\t}));\n\t});\n\treturn data;\n});\n\nexport const getPenguins = prerender(async () => {\n\tconst { fetch } = getRequestEvent();\n\tconst data = (await fetch('/data/examples/penguins.csv').then(async (r) =>\n\t\tcsvParse(await r.text(), autoType)\n\t)) as PenguinsData;\n\treturn data;\n});\n\nexport const getFlare = prerender(async () => {\n\tconst { fetch } = getRequestEvent();\n\tconst data = await fetch('/data/examples/hierarchy/flare.json').then((r) => r.json());\n\treturn data;\n});\n\nexport const getSimpleTree = prerender(async () => {\n\tconst { fetch } = getRequestEvent();\n\tconst data = await fetch('/data/examples/hierarchy/simple-tree.json').then((r) => r.json());\n\treturn data;\n});\n\nexport const getFlameGraph = prerender(async () => {\n\tconst { fetch } = getRequestEvent();\n\t// \"folded\"/\"collapsed\" stacks — the de-facto profiler interchange format. Parsed into a\n\t// hierarchy in the example via `parseFoldedStacks()`.\n\tconst data = await fetch('/data/examples/hierarchy/flame-graph.folded.txt').then((r) => r.text());\n\treturn data;\n});\n\nexport type TraceSpan = { name: string; start: number; duration: number; children?: TraceSpan[] };\n\nexport const getRequestTrace = prerender(async () => {\n\tconst { fetch } = getRequestEvent();\n\t// A traced (not sampled) profile — nested spans with real start/duration times, including\n\t// idle gaps. Rendered as a time-based flame chart.\n\tconst data = (await fetch('/data/examples/hierarchy/request-trace.json').then((r) =>\n\t\tr.json()\n\t)) as TraceSpan;\n\treturn data;\n});\n\nexport type MetroData = {\n\tMetro: string;\n\tPOP_1980: number;\n\tLPOP_1980: number;\n\tR90_10_1980: number;\n\tPOP_2015: number;\n\tLPOP_2015: number;\n\tR90_10_2015: number;\n\tnyt_display: string;\n\tstate_display: string;\n\thighlight: number;\n};\n\nexport const getMetros = prerender(async () => {\n\tconst { fetch } = getRequestEvent();\n\tconst data = csvParse(\n\t\tawait (await fetch('/data/examples/metros.csv')).text(),\n\t\tautoType\n\t) as unknown as MetroData[];\n\treturn data;\n});\n\nexport const getUsSenators = prerender(async () => {\n\tconst { fetch } = getRequestEvent();\n\tconst data = (await fetch('/data/examples/us-senators.csv').then(async (r) =>\n\t\tcsvParse(await r.text(), autoType)\n\t)) as USSenatorsData;\n\treturn data;\n});\n\nexport type UsPresident = {\n\tname: string;\n\tinaugurationDate: Date;\n\tportraitUrl: string;\n\tveryFavorable: number;\n\tveryUnfavorable: number;\n};\n\nexport const getUsPresidents = prerender(async () => {\n\tconst { fetch } = getRequestEvent();\n\tconst data = await fetch('/data/examples/us-presidents.csv').then(async (r) => {\n\t\tconst rows = csvParse(await r.text(), autoType) as Array>;\n\t\treturn rows.map(\n\t\t\t(d) =>\n\t\t\t\t({\n\t\t\t\t\tname: d['Name'],\n\t\t\t\t\tinaugurationDate: d['First Inauguration Date'],\n\t\t\t\t\tportraitUrl: d['Portrait URL'],\n\t\t\t\t\tveryFavorable: d['Very Favorable %'],\n\t\t\t\t\tveryUnfavorable: d['Very Unfavorable %']\n\t\t\t\t}) satisfies UsPresident\n\t\t);\n\t});\n\treturn data;\n});\n\nexport const getAlphabet = prerender(async () => {\n\tconst { fetch } = getRequestEvent();\n\tconst data = (await fetch('/data/examples/alphabet.csv').then(async (r) =>\n\t\tcsvParse(await r.text(), autoType)\n\t)) as { letter: string; frequency: number }[];\n\treturn data;\n});\n\nexport const getOlympians = prerender(async () => {\n\tconst { fetch } = getRequestEvent();\n\tconst data = (await fetch('/data/examples/olympians.json').then((r) => r.json())) as {\n\t\tname: string;\n\t\tnationality: string;\n\t\tsex: 'male' | 'female';\n\t\tdate_of_birth: string;\n\t\tweight: number;\n\t\theight: number;\n\t\tsport: string;\n\t\tgold: number;\n\t\tsilver: number;\n\t\tbronze: number;\n\t}[];\n\treturn data;\n});\n\nexport const getUsEvents = prerender(async () => {\n\tconst { fetch } = getRequestEvent();\n\tconst data = await fetch('/data/examples/date/us-events.csv').then(async (r) => {\n\t\treturn csvParse(await r.text(), autoType).map((d: any) => {\n\t\t\treturn {\n\t\t\t\tstartDate: new Date(d.startYear, 0, 1),\n\t\t\t\tendDate: new Date(d.endYear, 11, 31),\n\t\t\t\tevent: d.event\n\t\t\t};\n\t\t});\n\t});\n\treturn data;\n});\n\nexport const getCivilizationEvents = prerender(async () => {\n\tconst { fetch } = getRequestEvent();\n\tconst data = await fetch('/data/examples/date/civilization-timeline.csv').then(async (r) => {\n\t\treturn csvParse(\n\t\t\tawait r.text(),\n\t\t\t// @ts-expect-error - shh\n\t\t\tautoType\n\t\t).sort(sortFunc('start'));\n\t});\n\n\treturn data;\n});\n\nexport type SvelteCount = {\n\tdate: Date;\n\tn: number;\n\tcumsum: number;\n\tcategory: 'svelte' | 'sveltekit';\n};\n\nexport const getSvelteCounts = prerender(async () => {\n\tconst { fetch } = getRequestEvent();\n\tconst data = await fetch('/data/examples/date/svelte-counts.csv').then(async (r) =>\n\t\t// @ts-expect-error - autoType\n\t\tcsvParse(await r.text(), autoType)\n\t);\n\treturn data;\n});\n\nexport type SvelteMilestone = {\n\tdate: Date;\n\tcategory: 'svelte' | 'sveltekit' | 'ecosystem';\n\tlabel: string;\n\t/** Pixel x-offset of the label from the dot (calibrated for an 860px-wide chart). */\n\tdx: number;\n\t/** Pixel y-offset of the label from the dot (calibrated for an 860px-wide chart). */\n\tdy: number;\n};\n\nexport const getSvelteMilestones = prerender(async () => {\n\tconst { fetch } = getRequestEvent();\n\tconst data = await fetch('/data/examples/date/svelte-milestones.csv').then(async (r) =>\n\t\t// @ts-expect-error - autoType\n\t\tcsvParse(await r.text(), autoType)\n\t);\n\treturn data;\n});\n\nexport const getAppleTicker = prerender(async () => {\n\tconst { fetch } = getRequestEvent();\n\tconst data = await fetch('/data/examples/date/apple-ticker.json').then(async (r) =>\n\t\tparse(await r.text())\n\t);\n\treturn data;\n});\n\nexport const getCars = prerender(async () => {\n\tconst { fetch } = getRequestEvent();\n\tconst data = await fetch('/data/examples/cars.csv').then(async (r) =>\n\t\t// @ts-expect-error - shh\n\t\tcsvParse(await r.text(), autoType)\n\t);\n\treturn data;\n});\n\nexport const getNewPassengerCars = prerender(async () => {\n\tconst { fetch } = getRequestEvent();\n\tconst data = await fetch('/data/examples/new-passenger-cars.csv').then(async (r) =>\n\t\t// @ts-expect-error - shh\n\t\tcsvParse(await r.text(), autoType)\n\t);\n\treturn data;\n});\n\nexport const getHydro = prerender(async () => {\n\tconst { fetch } = getRequestEvent();\n\tconst data = (await fetch('/data/examples/date/hydro.json').then(async (r) =>\n\t\tparse(await r.text())\n\t)) as HydroData;\n\treturn data;\n});\n\nexport type Country2020 = {\n\tname: string;\n\tcode: string;\n\tcode2: string;\n\tlifeExpectancy: number;\n\tgdpPerCapita: number;\n\tpopulation: number;\n\tcontinent: string;\n};\n\nexport const getCountries2020 = prerender(async () => {\n\tconst { fetch } = getRequestEvent();\n\tconst text = await fetch('/data/examples/countries_2020.csv').then((r) => r.text());\n\tconst rows = csvParse(text, autoType) as Array>;\n\treturn rows.map(\n\t\t(d): Country2020 => ({\n\t\t\tname: d.Entity,\n\t\t\tcode: d.Code,\n\t\t\tcode2: d.Code2,\n\t\t\tlifeExpectancy: d['Life expectancy'],\n\t\t\tgdpPerCapita: d['GDP per capita'],\n\t\t\tpopulation: d.Population,\n\t\t\tcontinent: d.Continent\n\t\t})\n\t);\n});\n\nexport type BankFailure = {\n\tname: string;\n\tfailDate: Date;\n\tassets: number; // in $thousands (FDIC reporting unit)\n\tdeposits: number;\n\tcity: string;\n\tstate: string;\n\tcost: number | null;\n\ttype: string;\n};\n\nexport const getBankFailures = prerender(async () => {\n\tconst { fetch } = getRequestEvent();\n\tconst text = await fetch('/data/examples/bank-failures.csv').then((r) => r.text());\n\tconst rows = csvParse(text) as Array>;\n\treturn rows\n\t\t.map((d): BankFailure => {\n\t\t\tconst [m, day, y] = d.FAILDATE.split('/').map((s) => Number(s));\n\t\t\treturn {\n\t\t\t\tname: d.NAME,\n\t\t\t\tfailDate: new Date(Date.UTC(y, m - 1, day)),\n\t\t\t\tassets: Number(d.QBFASSET) || 0,\n\t\t\t\tdeposits: Number(d.QBFDEP) || 0,\n\t\t\t\tcity: d.CITY,\n\t\t\t\tstate: d.PSTALP,\n\t\t\t\tcost: d.COST ? Number(d.COST) : null,\n\t\t\t\ttype: d.RESTYPE\n\t\t\t};\n\t\t})\n\t\t.filter((d) => Number.isFinite(d.failDate.getTime()) && d.assets > 0);\n});\n\nexport type Layoff = {\n\tcompany: string;\n\tlocation: string;\n\ttotalLaidOff: number | null;\n\tdate: Date;\n\tpercentageLaidOff: number | null;\n\tindustry: string;\n\tstage: string;\n\tfundsRaised: number | null;\n\tcountry: string;\n};\n\nexport const getLayoffs = prerender(async () => {\n\tconst { fetch } = getRequestEvent();\n\tconst text = await fetch('/data/examples/layoffs.csv').then((r) => r.text());\n\tconst rows = csvParse(text) as Array>;\n\treturn rows\n\t\t.map((d): Layoff | null => {\n\t\t\tif (!d.date) return null;\n\t\t\tconst [m, day, y] = d.date.split('/').map((s) => Number(s));\n\t\t\tif (!y) return null;\n\t\t\treturn {\n\t\t\t\tcompany: d.company,\n\t\t\t\tlocation: d.location,\n\t\t\t\ttotalLaidOff: d.total_laid_off ? Number(d.total_laid_off) : null,\n\t\t\t\tdate: new Date(Date.UTC(y, m - 1, day)),\n\t\t\t\tpercentageLaidOff: d.percentage_laid_off ? Number(d.percentage_laid_off) : null,\n\t\t\t\tindustry: d.industry,\n\t\t\t\tstage: d.stage,\n\t\t\t\tfundsRaised: d.funds_raised ? Number(d.funds_raised) : null,\n\t\t\t\tcountry: d.country\n\t\t\t};\n\t\t})\n\t\t.filter((d): d is Layoff => d !== null);\n});\n\nexport type GamesLayoff = {\n\tstudio: string;\n\tdate: Date;\n\theadcount: number | null;\n\tparent: string;\n\ttype: string;\n\tstudioLocation: string;\n\tparentLocation: string;\n};\n\nexport const getGamesLayoffs = prerender(async () => {\n\tconst { fetch } = getRequestEvent();\n\tconst text = await fetch('/data/examples/games-layoffs.csv').then((r) => r.text());\n\tconst rows = csvParse(text) as Array>;\n\treturn rows\n\t\t.map((d): GamesLayoff | null => {\n\t\t\tif (!d.Date) return null;\n\t\t\treturn {\n\t\t\t\tstudio: d.Studio,\n\t\t\t\tdate: new Date(d.Date),\n\t\t\t\theadcount: d.Headcount ? Number(d.Headcount) : null,\n\t\t\t\tparent: d.Parent,\n\t\t\t\ttype: d.Type,\n\t\t\t\tstudioLocation: d['Studio Location'],\n\t\t\t\tparentLocation: d['Parent Location']\n\t\t\t};\n\t\t})\n\t\t.filter((d): d is GamesLayoff => d !== null && Number.isFinite(d.date.getTime()));\n});\n\nexport const getForceGroupDots = prerender(async () => {\n\tconst { fetch } = getRequestEvent();\n\tconst data = (await fetch('/data/examples/force-group-dots.json').then((r) => r.json())) as {\n\t\tcategory: string;\n\t\tvalue: number;\n\t}[];\n\treturn data;\n});\n\nexport const getWideData = prerender(async () => {\n\tconst { fetch } = getRequestEvent();\n\tconst data = (await fetch('/data/examples/bench/wide_data/data.json').then((r) => r.json())) as {\n\t\tepoch: number;\n\t\tidl: number;\n\t\trecv: number;\n\t\tsend: number;\n\t\twrit: number;\n\t\tused: number;\n\t\tfree: number;\n\t}[];\n\treturn data;\n});\n\nexport const getDimensionArrays = prerender(async () => {\n\tconst { fetch } = getRequestEvent();\n\tconst data = (await fetch('/data/examples/bench/dimension_arrays/data.json').then((r) =>\n\t\tr.json()\n\t)) as {\n\t\tdate: number[];\n\t\tcpu: number[];\n\t\tram: number[];\n\t\ttcp: number[];\n\t};\n\treturn data;\n});\n\nexport const getSeriesArrays = prerender(async () => {\n\tconst { fetch } = getRequestEvent();\n\tconst data = (await fetch('/data/examples/bench/series_arrays/data.json').then((r) =>\n\t\tr.json()\n\t)) as {\n\t\tcpu: {\n\t\t\tx: Date;\n\t\t\ty: number;\n\t\t}[];\n\t\tram: {\n\t\t\tx: Date;\n\t\t\ty: number;\n\t\t}[];\n\t\ttcp: {\n\t\t\tx: Date;\n\t\t\ty: number;\n\t\t}[];\n\t};\n\treturn data;\n});\n\nexport type VolcanoData = {\n\twidth: number;\n\theight: number;\n\tvalues: number[];\n};\n\nexport const getVolcano = prerender(async () => {\n\tconst { fetch } = getRequestEvent();\n\tconst data = (await fetch('/data/examples/volcano.json').then((r) => r.json())) as VolcanoData;\n\treturn data;\n});\n\nexport type WaterVaporData = {\n\twidth: number;\n\theight: number;\n\tvalues: number[];\n};\n\nexport const getWaterVapor = prerender(async () => {\n\tconst { fetch } = getRequestEvent();\n\tconst rows = csvParseRows(\n\t\tawait fetch('/data/examples/geo/water-vapor.csv').then((r) => r.text())\n\t);\n\treturn {\n\t\twidth: rows[0]?.length ?? 0,\n\t\theight: rows.length,\n\t\tvalues: rows.flat().map((value) => (value === '99999.0' ? NaN : +value))\n\t} satisfies WaterVaporData;\n});\n\nexport type FaithfulData = { eruptions: number; waiting: number };\n\nexport const getFaithful = prerender(async () => {\n\tconst { fetch } = getRequestEvent();\n\tconst data = (await fetch('/data/examples/faithful.json').then((r) =>\n\t\tr.json()\n\t)) as FaithfulData[];\n\treturn data;\n});\n\nexport type CategoryBrand = {\n\tdate: Date;\n\tname: string;\n\tcategory: string;\n\tvalue: number;\n};\n\nexport const getCategoryBrands = prerender(async () => {\n\tconst { fetch } = getRequestEvent();\n\tconst data = (await fetch('/data/examples/category-brands.csv').then(async (r) =>\n\t\tcsvParse(await r.text(), autoType)\n\t)) as unknown as CategoryBrand[];\n\n\t// Ensure dates are Date objects\n\tfor (const d of data) {\n\t\td.date = new Date(d.date as unknown as string);\n\t}\n\n\treturn data;\n});\n\nexport type ProgrammingLanguage = {\n\tdate: Date;\n\tname: string;\n\tvalue: number;\n};\n\nexport const getProgrammingLanguages = prerender(async () => {\n\tconst { fetch } = getRequestEvent();\n\tconst data = (await fetch('/data/examples/programming-languages.csv').then(async (r) =>\n\t\tcsvParse(await r.text(), autoType)\n\t)) as unknown as ProgrammingLanguage[];\n\n\tfor (const d of data) {\n\t\td.date = new Date(d.date as unknown as string);\n\t}\n\n\treturn data;\n});\n\nexport type TdfStageData = { long: number; lat: number; elev: number }[];\n\nexport const getTdfStage = prerender(async () => {\n\tconst { fetch } = getRequestEvent();\n\tconst data = (await fetch('/data/examples/geo/tdf-stage.json').then((r) =>\n\t\tr.json()\n\t)) as TdfStageData;\n\treturn data;\n});\n", + "data.remote.ts": "import { celsiusToFahrenheit } from 'layerchart';\nimport { parse, sortFunc } from '@layerstack/utils';\nimport { ascending, flatGroup, max, mean, min } from 'd3-array';\nimport { csvParse, csvParseRows, autoType } from 'd3-dsv';\n\nimport { prerender, getRequestEvent, query } from '$app/server';\nimport { z } from 'zod';\n\nimport type { PenguinsData } from '$static/data/examples/penguins.js';\nimport type { IrisData } from '$static/data/examples/iris.js';\nimport type { AppleStockData } from '$static/data/examples/date/apple-stock.js';\nimport type { USSenatorsData } from '$static/data/examples/us-senators';\nimport type { CivilizationTimeline } from '$static/data/examples/date/civilization-timeline.js';\nimport type { HydroData } from '$static/data/examples/date/hydro.js';\nimport type { AppleTickerData } from '$static/data/examples/date/apple-ticker.js';\nimport type { NewPassengerCars } from '$static/data/examples/new-passenger-cars.js';\n\nexport const getGroupData = prerender(async () => {\n\tconst { fetch } = getRequestEvent();\n\tconst data = (await fetch('/data/examples/group-data.json').then((r) => r.json())) as {\n\t\tx: number;\n\t\ty: number;\n\t\tgroup: string;\n\t}[];\n\treturn data;\n});\n\nexport const getAppleStock = prerender(async () => {\n\tconst { fetch } = getRequestEvent();\n\tconst data = await fetch('/data/examples/date/apple-stock.json').then(async (r) =>\n\t\tparse(await r.text())\n\t);\n\treturn data;\n});\n\nexport const getAppleStockRange = query(\n\tz.object({\n\t\tstart: z.string().optional(),\n\t\tend: z.string().optional(),\n\t\tmaxPoints: z.number().optional().default(300)\n\t}),\n\tasync ({ start, end, maxPoints }) => {\n\t\tconst { fetch } = getRequestEvent();\n\t\tlet data = await fetch('/data/examples/date/apple-stock.json').then(async (r) =>\n\t\t\tparse(await r.text())\n\t\t);\n\n\t\tif (start || end) {\n\t\t\tconst startDate = start ? new Date(start) : undefined;\n\t\t\tconst endDate = end ? new Date(end) : undefined;\n\t\t\tdata = data.filter(\n\t\t\t\t(d) => (!startDate || d.date >= startDate) && (!endDate || d.date <= endDate)\n\t\t\t);\n\t\t}\n\n\t\tif (data.length > maxPoints) {\n\t\t\tconst step = (data.length - 1) / (maxPoints - 1);\n\t\t\tdata = Array.from({ length: maxPoints }, (_, i) => data![Math.round(i * step)]);\n\t\t}\n\n\t\treturn data;\n\t}\n);\n\nexport const getDailyTemperature = prerender(async () => {\n\tconst { fetch } = getRequestEvent();\n\tconst data = await fetch('/data/examples/date/daily-temperature.json').then(async (r) =>\n\t\tparse<{ date: Date; value: number }[]>(await r.text())\n\t);\n\treturn data;\n});\n\nexport const getDailyTemperatures = prerender(async () => {\n\tconst { fetch } = getRequestEvent();\n\tconst data = await fetch('/data/examples/dailyTemperatures.csv').then(async (r) => {\n\t\treturn csvParse<{ dayOfYear: number; year: number; value: number | 'NA' }>(\n\t\t\tawait r.text(),\n\t\t\t// @ts-expect-error - autoType\n\t\t\tautoType\n\t\t)\n\t\t\t.filter((d) => d.value !== 'NA' && d.dayOfYear <= 365 /* Ignore 366th day */)\n\t\t\t.map((d) => {\n\t\t\t\tconst origDate = new Date(d.year, 0, d.dayOfYear);\n\t\t\t\treturn {\n\t\t\t\t\t...d,\n\t\t\t\t\tdate: new Date(Date.UTC(2000, origDate.getUTCMonth(), origDate.getUTCDate())),\n\t\t\t\t\tvalue: d.value !== 'NA' ? celsiusToFahrenheit(d.value) : 'NA'\n\t\t\t\t};\n\t\t\t});\n\t});\n\treturn data;\n});\n\nexport const getSfoTemperatures = prerender(async () => {\n\tconst { fetch } = getRequestEvent();\n\tconst data = await fetch('/data/examples/sfoTemperatures.csv').then(async (r) => {\n\t\treturn flatGroup(\n\t\t\t// @ts-expect-error - autoType\n\t\t\tcsvParse<{ date: Date; tavg: number; tmax: number; tmin: number }>(await r.text(), autoType),\n\t\t\t(d) => new Date(Date.UTC(2000, d.date.getUTCMonth(), d.date.getUTCDate())) // group by day of year\n\t\t)\n\t\t\t.sort(([a], [b]) => ascending(a, b)) // sort chronologically\n\t\t\t.map(([date, v]) => ({\n\t\t\t\tdate,\n\t\t\t\tavg: mean(v, (d) => d.tavg || NaN),\n\t\t\t\tmin: mean(v, (d) => d.tmin || NaN),\n\t\t\t\tmax: mean(v, (d) => d.tmax || NaN),\n\t\t\t\tminmin: min(v, (d) => d.tmin || NaN),\n\t\t\t\tmaxmax: max(v, (d) => d.tmax || NaN)\n\t\t\t}));\n\t});\n\treturn data;\n});\n\nexport const getPenguins = prerender(async () => {\n\tconst { fetch } = getRequestEvent();\n\tconst data = (await fetch('/data/examples/penguins.csv').then(async (r) =>\n\t\tcsvParse(await r.text(), autoType)\n\t)) as PenguinsData;\n\treturn data;\n});\n\nexport const getIris = prerender(async () => {\n\tconst { fetch } = getRequestEvent();\n\tconst data = (await fetch('/data/examples/iris.csv').then(async (r) =>\n\t\tcsvParse(await r.text(), autoType)\n\t)) as IrisData;\n\treturn data;\n});\n\nexport const getFlare = prerender(async () => {\n\tconst { fetch } = getRequestEvent();\n\tconst data = await fetch('/data/examples/hierarchy/flare.json').then((r) => r.json());\n\treturn data;\n});\n\nexport const getSimpleTree = prerender(async () => {\n\tconst { fetch } = getRequestEvent();\n\tconst data = await fetch('/data/examples/hierarchy/simple-tree.json').then((r) => r.json());\n\treturn data;\n});\n\nexport const getFlameGraph = prerender(async () => {\n\tconst { fetch } = getRequestEvent();\n\t// \"folded\"/\"collapsed\" stacks — the de-facto profiler interchange format. Parsed into a\n\t// hierarchy in the example via `parseFoldedStacks()`.\n\tconst data = await fetch('/data/examples/hierarchy/flame-graph.folded.txt').then((r) => r.text());\n\treturn data;\n});\n\nexport type TraceSpan = { name: string; start: number; duration: number; children?: TraceSpan[] };\n\nexport const getRequestTrace = prerender(async () => {\n\tconst { fetch } = getRequestEvent();\n\t// A traced (not sampled) profile — nested spans with real start/duration times, including\n\t// idle gaps. Rendered as a time-based flame chart.\n\tconst data = (await fetch('/data/examples/hierarchy/request-trace.json').then((r) =>\n\t\tr.json()\n\t)) as TraceSpan;\n\treturn data;\n});\n\nexport type MetroData = {\n\tMetro: string;\n\tPOP_1980: number;\n\tLPOP_1980: number;\n\tR90_10_1980: number;\n\tPOP_2015: number;\n\tLPOP_2015: number;\n\tR90_10_2015: number;\n\tnyt_display: string;\n\tstate_display: string;\n\thighlight: number;\n};\n\nexport const getMetros = prerender(async () => {\n\tconst { fetch } = getRequestEvent();\n\tconst data = csvParse(\n\t\tawait (await fetch('/data/examples/metros.csv')).text(),\n\t\tautoType\n\t) as unknown as MetroData[];\n\treturn data;\n});\n\nexport const getUsSenators = prerender(async () => {\n\tconst { fetch } = getRequestEvent();\n\tconst data = (await fetch('/data/examples/us-senators.csv').then(async (r) =>\n\t\tcsvParse(await r.text(), autoType)\n\t)) as USSenatorsData;\n\treturn data;\n});\n\nexport type UsPresident = {\n\tname: string;\n\tinaugurationDate: Date;\n\tportraitUrl: string;\n\tveryFavorable: number;\n\tveryUnfavorable: number;\n};\n\nexport const getUsPresidents = prerender(async () => {\n\tconst { fetch } = getRequestEvent();\n\tconst data = await fetch('/data/examples/us-presidents.csv').then(async (r) => {\n\t\tconst rows = csvParse(await r.text(), autoType) as Array>;\n\t\treturn rows.map(\n\t\t\t(d) =>\n\t\t\t\t({\n\t\t\t\t\tname: d['Name'],\n\t\t\t\t\tinaugurationDate: d['First Inauguration Date'],\n\t\t\t\t\tportraitUrl: d['Portrait URL'],\n\t\t\t\t\tveryFavorable: d['Very Favorable %'],\n\t\t\t\t\tveryUnfavorable: d['Very Unfavorable %']\n\t\t\t\t}) satisfies UsPresident\n\t\t);\n\t});\n\treturn data;\n});\n\nexport const getAlphabet = prerender(async () => {\n\tconst { fetch } = getRequestEvent();\n\tconst data = (await fetch('/data/examples/alphabet.csv').then(async (r) =>\n\t\tcsvParse(await r.text(), autoType)\n\t)) as { letter: string; frequency: number }[];\n\treturn data;\n});\n\nexport const getOlympians = prerender(async () => {\n\tconst { fetch } = getRequestEvent();\n\tconst data = (await fetch('/data/examples/olympians.json').then((r) => r.json())) as {\n\t\tname: string;\n\t\tnationality: string;\n\t\tsex: 'male' | 'female';\n\t\tdate_of_birth: string;\n\t\tweight: number;\n\t\theight: number;\n\t\tsport: string;\n\t\tgold: number;\n\t\tsilver: number;\n\t\tbronze: number;\n\t}[];\n\treturn data;\n});\n\nexport const getUsEvents = prerender(async () => {\n\tconst { fetch } = getRequestEvent();\n\tconst data = await fetch('/data/examples/date/us-events.csv').then(async (r) => {\n\t\treturn csvParse(await r.text(), autoType).map((d: any) => {\n\t\t\treturn {\n\t\t\t\tstartDate: new Date(d.startYear, 0, 1),\n\t\t\t\tendDate: new Date(d.endYear, 11, 31),\n\t\t\t\tevent: d.event\n\t\t\t};\n\t\t});\n\t});\n\treturn data;\n});\n\nexport const getCivilizationEvents = prerender(async () => {\n\tconst { fetch } = getRequestEvent();\n\tconst data = await fetch('/data/examples/date/civilization-timeline.csv').then(async (r) => {\n\t\treturn csvParse(\n\t\t\tawait r.text(),\n\t\t\t// @ts-expect-error - shh\n\t\t\tautoType\n\t\t).sort(sortFunc('start'));\n\t});\n\n\treturn data;\n});\n\nexport type SvelteCount = {\n\tdate: Date;\n\tn: number;\n\tcumsum: number;\n\tcategory: 'svelte' | 'sveltekit';\n};\n\nexport const getSvelteCounts = prerender(async () => {\n\tconst { fetch } = getRequestEvent();\n\tconst data = await fetch('/data/examples/date/svelte-counts.csv').then(async (r) =>\n\t\t// @ts-expect-error - autoType\n\t\tcsvParse(await r.text(), autoType)\n\t);\n\treturn data;\n});\n\nexport type SvelteMilestone = {\n\tdate: Date;\n\tcategory: 'svelte' | 'sveltekit' | 'ecosystem';\n\tlabel: string;\n\t/** Pixel x-offset of the label from the dot (calibrated for an 860px-wide chart). */\n\tdx: number;\n\t/** Pixel y-offset of the label from the dot (calibrated for an 860px-wide chart). */\n\tdy: number;\n};\n\nexport const getSvelteMilestones = prerender(async () => {\n\tconst { fetch } = getRequestEvent();\n\tconst data = await fetch('/data/examples/date/svelte-milestones.csv').then(async (r) =>\n\t\t// @ts-expect-error - autoType\n\t\tcsvParse(await r.text(), autoType)\n\t);\n\treturn data;\n});\n\nexport const getAppleTicker = prerender(async () => {\n\tconst { fetch } = getRequestEvent();\n\tconst data = await fetch('/data/examples/date/apple-ticker.json').then(async (r) =>\n\t\tparse(await r.text())\n\t);\n\treturn data;\n});\n\nexport const getCars = prerender(async () => {\n\tconst { fetch } = getRequestEvent();\n\tconst data = await fetch('/data/examples/cars.csv').then(async (r) =>\n\t\t// @ts-expect-error - shh\n\t\tcsvParse(await r.text(), autoType)\n\t);\n\treturn data;\n});\n\nexport const getNewPassengerCars = prerender(async () => {\n\tconst { fetch } = getRequestEvent();\n\tconst data = await fetch('/data/examples/new-passenger-cars.csv').then(async (r) =>\n\t\t// @ts-expect-error - shh\n\t\tcsvParse(await r.text(), autoType)\n\t);\n\treturn data;\n});\n\nexport const getHydro = prerender(async () => {\n\tconst { fetch } = getRequestEvent();\n\tconst data = (await fetch('/data/examples/date/hydro.json').then(async (r) =>\n\t\tparse(await r.text())\n\t)) as HydroData;\n\treturn data;\n});\n\nexport type Country2020 = {\n\tname: string;\n\tcode: string;\n\tcode2: string;\n\tlifeExpectancy: number;\n\tgdpPerCapita: number;\n\tpopulation: number;\n\tcontinent: string;\n};\n\nexport const getCountries2020 = prerender(async () => {\n\tconst { fetch } = getRequestEvent();\n\tconst text = await fetch('/data/examples/countries_2020.csv').then((r) => r.text());\n\tconst rows = csvParse(text, autoType) as Array>;\n\treturn rows.map(\n\t\t(d): Country2020 => ({\n\t\t\tname: d.Entity,\n\t\t\tcode: d.Code,\n\t\t\tcode2: d.Code2,\n\t\t\tlifeExpectancy: d['Life expectancy'],\n\t\t\tgdpPerCapita: d['GDP per capita'],\n\t\t\tpopulation: d.Population,\n\t\t\tcontinent: d.Continent\n\t\t})\n\t);\n});\n\nexport type BankFailure = {\n\tname: string;\n\tfailDate: Date;\n\tassets: number; // in $thousands (FDIC reporting unit)\n\tdeposits: number;\n\tcity: string;\n\tstate: string;\n\tcost: number | null;\n\ttype: string;\n};\n\nexport const getBankFailures = prerender(async () => {\n\tconst { fetch } = getRequestEvent();\n\tconst text = await fetch('/data/examples/bank-failures.csv').then((r) => r.text());\n\tconst rows = csvParse(text) as Array>;\n\treturn rows\n\t\t.map((d): BankFailure => {\n\t\t\tconst [m, day, y] = d.FAILDATE.split('/').map((s) => Number(s));\n\t\t\treturn {\n\t\t\t\tname: d.NAME,\n\t\t\t\tfailDate: new Date(Date.UTC(y, m - 1, day)),\n\t\t\t\tassets: Number(d.QBFASSET) || 0,\n\t\t\t\tdeposits: Number(d.QBFDEP) || 0,\n\t\t\t\tcity: d.CITY,\n\t\t\t\tstate: d.PSTALP,\n\t\t\t\tcost: d.COST ? Number(d.COST) : null,\n\t\t\t\ttype: d.RESTYPE\n\t\t\t};\n\t\t})\n\t\t.filter((d) => Number.isFinite(d.failDate.getTime()) && d.assets > 0);\n});\n\nexport type Layoff = {\n\tcompany: string;\n\tlocation: string;\n\ttotalLaidOff: number | null;\n\tdate: Date;\n\tpercentageLaidOff: number | null;\n\tindustry: string;\n\tstage: string;\n\tfundsRaised: number | null;\n\tcountry: string;\n};\n\nexport const getLayoffs = prerender(async () => {\n\tconst { fetch } = getRequestEvent();\n\tconst text = await fetch('/data/examples/layoffs.csv').then((r) => r.text());\n\tconst rows = csvParse(text) as Array>;\n\treturn rows\n\t\t.map((d): Layoff | null => {\n\t\t\tif (!d.date) return null;\n\t\t\tconst [m, day, y] = d.date.split('/').map((s) => Number(s));\n\t\t\tif (!y) return null;\n\t\t\treturn {\n\t\t\t\tcompany: d.company,\n\t\t\t\tlocation: d.location,\n\t\t\t\ttotalLaidOff: d.total_laid_off ? Number(d.total_laid_off) : null,\n\t\t\t\tdate: new Date(Date.UTC(y, m - 1, day)),\n\t\t\t\tpercentageLaidOff: d.percentage_laid_off ? Number(d.percentage_laid_off) : null,\n\t\t\t\tindustry: d.industry,\n\t\t\t\tstage: d.stage,\n\t\t\t\tfundsRaised: d.funds_raised ? Number(d.funds_raised) : null,\n\t\t\t\tcountry: d.country\n\t\t\t};\n\t\t})\n\t\t.filter((d): d is Layoff => d !== null);\n});\n\nexport type GamesLayoff = {\n\tstudio: string;\n\tdate: Date;\n\theadcount: number | null;\n\tparent: string;\n\ttype: string;\n\tstudioLocation: string;\n\tparentLocation: string;\n};\n\nexport const getGamesLayoffs = prerender(async () => {\n\tconst { fetch } = getRequestEvent();\n\tconst text = await fetch('/data/examples/games-layoffs.csv').then((r) => r.text());\n\tconst rows = csvParse(text) as Array>;\n\treturn rows\n\t\t.map((d): GamesLayoff | null => {\n\t\t\tif (!d.Date) return null;\n\t\t\treturn {\n\t\t\t\tstudio: d.Studio,\n\t\t\t\tdate: new Date(d.Date),\n\t\t\t\theadcount: d.Headcount ? Number(d.Headcount) : null,\n\t\t\t\tparent: d.Parent,\n\t\t\t\ttype: d.Type,\n\t\t\t\tstudioLocation: d['Studio Location'],\n\t\t\t\tparentLocation: d['Parent Location']\n\t\t\t};\n\t\t})\n\t\t.filter((d): d is GamesLayoff => d !== null && Number.isFinite(d.date.getTime()));\n});\n\nexport const getForceGroupDots = prerender(async () => {\n\tconst { fetch } = getRequestEvent();\n\tconst data = (await fetch('/data/examples/force-group-dots.json').then((r) => r.json())) as {\n\t\tcategory: string;\n\t\tvalue: number;\n\t}[];\n\treturn data;\n});\n\nexport const getWideData = prerender(async () => {\n\tconst { fetch } = getRequestEvent();\n\tconst data = (await fetch('/data/examples/bench/wide_data/data.json').then((r) => r.json())) as {\n\t\tepoch: number;\n\t\tidl: number;\n\t\trecv: number;\n\t\tsend: number;\n\t\twrit: number;\n\t\tused: number;\n\t\tfree: number;\n\t}[];\n\treturn data;\n});\n\nexport const getDimensionArrays = prerender(async () => {\n\tconst { fetch } = getRequestEvent();\n\tconst data = (await fetch('/data/examples/bench/dimension_arrays/data.json').then((r) =>\n\t\tr.json()\n\t)) as {\n\t\tdate: number[];\n\t\tcpu: number[];\n\t\tram: number[];\n\t\ttcp: number[];\n\t};\n\treturn data;\n});\n\nexport const getSeriesArrays = prerender(async () => {\n\tconst { fetch } = getRequestEvent();\n\tconst data = (await fetch('/data/examples/bench/series_arrays/data.json').then((r) =>\n\t\tr.json()\n\t)) as {\n\t\tcpu: {\n\t\t\tx: Date;\n\t\t\ty: number;\n\t\t}[];\n\t\tram: {\n\t\t\tx: Date;\n\t\t\ty: number;\n\t\t}[];\n\t\ttcp: {\n\t\t\tx: Date;\n\t\t\ty: number;\n\t\t}[];\n\t};\n\treturn data;\n});\n\nexport type VolcanoData = {\n\twidth: number;\n\theight: number;\n\tvalues: number[];\n};\n\nexport const getVolcano = prerender(async () => {\n\tconst { fetch } = getRequestEvent();\n\tconst data = (await fetch('/data/examples/volcano.json').then((r) => r.json())) as VolcanoData;\n\treturn data;\n});\n\nexport type WaterVaporData = {\n\twidth: number;\n\theight: number;\n\tvalues: number[];\n};\n\nexport const getWaterVapor = prerender(async () => {\n\tconst { fetch } = getRequestEvent();\n\tconst rows = csvParseRows(\n\t\tawait fetch('/data/examples/geo/water-vapor.csv').then((r) => r.text())\n\t);\n\treturn {\n\t\twidth: rows[0]?.length ?? 0,\n\t\theight: rows.length,\n\t\tvalues: rows.flat().map((value) => (value === '99999.0' ? NaN : +value))\n\t} satisfies WaterVaporData;\n});\n\nexport type FaithfulData = { eruptions: number; waiting: number };\n\nexport const getFaithful = prerender(async () => {\n\tconst { fetch } = getRequestEvent();\n\tconst data = (await fetch('/data/examples/faithful.json').then((r) =>\n\t\tr.json()\n\t)) as FaithfulData[];\n\treturn data;\n});\n\nexport type CategoryBrand = {\n\tdate: Date;\n\tname: string;\n\tcategory: string;\n\tvalue: number;\n};\n\nexport const getCategoryBrands = prerender(async () => {\n\tconst { fetch } = getRequestEvent();\n\tconst data = (await fetch('/data/examples/category-brands.csv').then(async (r) =>\n\t\tcsvParse(await r.text(), autoType)\n\t)) as unknown as CategoryBrand[];\n\n\t// Ensure dates are Date objects\n\tfor (const d of data) {\n\t\td.date = new Date(d.date as unknown as string);\n\t}\n\n\treturn data;\n});\n\nexport type ProgrammingLanguage = {\n\tdate: Date;\n\tname: string;\n\tvalue: number;\n};\n\nexport const getProgrammingLanguages = prerender(async () => {\n\tconst { fetch } = getRequestEvent();\n\tconst data = (await fetch('/data/examples/programming-languages.csv').then(async (r) =>\n\t\tcsvParse(await r.text(), autoType)\n\t)) as unknown as ProgrammingLanguage[];\n\n\tfor (const d of data) {\n\t\td.date = new Date(d.date as unknown as string);\n\t}\n\n\treturn data;\n});\n\nexport type TdfStageData = { long: number; lat: number; elev: number }[];\n\nexport const getTdfStage = prerender(async () => {\n\tconst { fetch } = getRequestEvent();\n\tconst data = (await fetch('/data/examples/geo/tdf-stage.json').then((r) =>\n\t\tr.json()\n\t)) as TdfStageData;\n\treturn data;\n});\n", "geo.remote.ts": "import { prerender, getRequestEvent } from '$app/server';\n\nimport type { GeometryCollection, Topology } from 'topojson-specification';\nimport { geoCentroid } from 'd3-geo';\nimport { csvParse, autoType } from 'd3-dsv';\nimport { parse } from '@layerstack/utils';\n\nimport type { USStateCapitalsData } from '$static/data/examples/geo/us-state-capitals.js';\nimport type { WorldLinksData } from '$static/data/examples/geo/world-links.js';\n\nexport const getUsStatesTopology = prerender(async () => {\n\tconst { fetch } = getRequestEvent();\n\tconst data = (await fetch('https://cdn.jsdelivr.net/npm/us-atlas@3/states-10m.json').then((r) =>\n\t\tr.json()\n\t)) as Topology<{\n\t\tstates: GeometryCollection<{ name: string }>;\n\t}>;\n\treturn data;\n});\n\nexport const getUsCountiesTopology = prerender(async () => {\n\tconst { fetch } = getRequestEvent();\n\tconst data = (await fetch('https://cdn.jsdelivr.net/npm/us-atlas@3/counties-10m.json').then((r) =>\n\t\tr.json()\n\t)) as Topology<{\n\t\tstates: GeometryCollection<{ name: string }>;\n\t\tcounties: GeometryCollection<{ name: string }>;\n\t}>;\n\treturn data;\n});\n\nexport const getUsCountiesAlbersTopology = prerender(async () => {\n\tconst { fetch } = getRequestEvent();\n\tconst data = (await fetch(\n\t\t'https://cdn.jsdelivr.net/npm/us-atlas@3/counties-albers-10m.json'\n\t).then((r) => r.json())) as Topology<{\n\t\tstates: GeometryCollection<{ name: string }>;\n\t\tcounties: GeometryCollection<{ name: string }>;\n\t}>;\n\treturn data;\n});\n\nexport const getCountriesTopology = prerender(async () => {\n\tconst { fetch } = getRequestEvent();\n\tconst geojson = (await fetch(\n\t\t'https://cdn.jsdelivr.net/npm/world-atlas@2/countries-110m.json'\n\t).then((r) => r.json())) as Topology<{\n\t\tcountries: GeometryCollection<{ name: string }>;\n\t\tland: GeometryCollection;\n\t}>;\n\treturn geojson;\n});\n\nexport const getCountriesDetailTopology = prerender(async () => {\n\tconst { fetch } = getRequestEvent();\n\tconst geojson = (await fetch(\n\t\t'https://cdn.jsdelivr.net/npm/world-atlas@2/countries-50m.json'\n\t).then((r) => r.json())) as Topology<{\n\t\tcountries: GeometryCollection<{ name: string }>;\n\t\tland: GeometryCollection;\n\t}>;\n\treturn geojson;\n});\n\nexport const getEclipses = prerender(async () => {\n\tconst { fetch } = getRequestEvent();\n\tconst data = (await fetch('/data/examples/geo/eclipses.json').then(async (r) =>\n\t\tparse(await r.text())\n\t)) as Topology<{\n\t\teclipses: GeometryCollection<{ ID: string; Date: Date }>;\n\t}>;\n\treturn data;\n});\n\nexport const getSubmarineCables = prerender(async () => {\n\tconst { fetch } = getRequestEvent();\n\tconst data = await fetch('/data/examples/geo/submarine-cables.json').then((r) => r.json());\n\treturn data;\n});\n\nexport const getSubmarineCablesLandingPoints = prerender(async () => {\n\tconst { fetch } = getRequestEvent();\n\tconst data = await fetch('/data/examples/geo/submarine-cables-landing-points.json').then((r) =>\n\t\tr.json()\n\t);\n\treturn data;\n});\n\nexport const getTectonicPlates = prerender(async () => {\n\tconst { fetch } = getRequestEvent();\n\tconst data = await fetch(\n\t\t'https://raw.githubusercontent.com/fraxen/tectonicplates/master/GeoJSON/PB2002_boundaries.json'\n\t).then((r) => r.json());\n\treturn data;\n});\n\nexport const getEarthquakes = prerender(async () => {\n\tconst { fetch } = getRequestEvent();\n\tconst data = await fetch(\n\t\t'https://earthquake.usgs.gov/earthquakes/feed/v1.0/summary/2.5_week.geojson'\n\t)\n\t\t.then((r) => r.json())\n\t\t.then((d: GeoJSON.FeatureCollection) =>\n\t\t\td.features.map((f) => {\n\t\t\t\tconst c = geoCentroid(f);\n\t\t\t\treturn {\n\t\t\t\t\tplace: f.properties.place,\n\t\t\t\t\tmagnitude: f.properties.mag,\n\t\t\t\t\tlongitude: c[0],\n\t\t\t\t\tlatitude: c[1]\n\t\t\t\t};\n\t\t\t})\n\t\t);\n\treturn data;\n});\n\nexport const getTimezones = prerender(async () => {\n\tconst { fetch } = getRequestEvent();\n\tconst data = (await fetch('/data/examples/geo/timezones.json').then((r) =>\n\t\tr.json()\n\t)) as Topology<{\n\t\ttimezones: GeometryCollection<{\n\t\t\tobjectid: number;\n\t\t\tscalerank: number;\n\t\t\tfeaturecla: string;\n\t\t\tname: string;\n\t\t\tmap_color6: number;\n\t\t\tmap_color8: number;\n\t\t\tnote: any;\n\t\t\tzone: number;\n\t\t\tutc_format: string;\n\t\t\ttime_zone: string;\n\t\t\tiso_8601: string;\n\t\t\tplaces: string;\n\t\t\tdst_places: any;\n\t\t\ttz_name1st: any;\n\t\t\ttz_namesum: number;\n\t\t}>;\n\t}>;\n\treturn data;\n});\n\nexport const getUsCapitals = prerender(async () => {\n\tconst { fetch } = getRequestEvent();\n\tconst data = (await fetch('/data/examples/geo/us-state-capitals.csv').then(async (r) =>\n\t\tcsvParse(await r.text(), autoType)\n\t)) as USStateCapitalsData;\n\treturn data;\n});\n\nexport const getUsAirports = prerender(async () => {\n\tconst { fetch } = getRequestEvent();\n\tconst data = (await fetch('/data/examples/geo/us-airports.csv').then(async (r) =>\n\t\tcsvParse(await r.text(), autoType)\n\t)) as { name: string; latitude: number; longitude: number }[];\n\treturn data;\n});\n\nexport const getWalmarts = prerender(async () => {\n\tconst { fetch } = getRequestEvent();\n\tconst raw = (await fetch('/data/examples/geo/walmarts.csv').then(async (r) =>\n\t\tcsvParse(await r.text(), autoType)\n\t)) as { long: number; lat: number; opendate: Date; city: string; state: string; type: string }[];\n\tconst data = raw.map((d) => ({\n\t\tlongitude: d.long,\n\t\tlatitude: d.lat,\n\t\tdate: d.opendate,\n\t\tcity: d.city,\n\t\tstate: d.state,\n\t\ttype: d.type\n\t}));\n\treturn data;\n});\n\nexport const getUsCountyPopulation = prerender(async () => {\n\tconst { fetch } = getRequestEvent();\n\tconst data = (await fetch('/data/examples/geo/us-county-population-2020.json').then((r) =>\n\t\tr.json()\n\t)) as Array<{\n\t\tstate: string;\n\t\tcounty: string;\n\t\tDP05_0001E: string;\n\t\tDP05_0019E: string;\n\t\tDP05_0019PE: string;\n\t}>;\n\treturn data;\n});\n\nexport const getUsPresidentialElection2020 = prerender(async () => {\n\tconst { fetch } = getRequestEvent();\n\tconst data = (await fetch('/data/examples/geo/us-presidential-election-2020.csv').then(\n\t\tasync (r) => csvParse(await r.text(), autoType)\n\t)) as Array<{\n\t\tstate_name: string;\n\t\tcounty_fips: number;\n\t\tcounty_name: string;\n\t\tvotes_gop: number;\n\t\tvotes_dem: number;\n\t\ttotal_votes: number;\n\t\tdiff: number;\n\t\tper_gop: number;\n\t\tper_dem: number;\n\t\tper_point_diff: number;\n\t}>;\n\treturn data;\n});\n\nexport const getWind = prerender(async () => {\n\tconst { fetch } = getRequestEvent();\n\tconst data = (await fetch('/data/examples/geo/wind.csv').then(async (r) =>\n\t\tcsvParse(await r.text(), autoType)\n\t)) as Array<{\n\t\tlongitude: number;\n\t\tlatitude: number;\n\t\tu: number;\n\t\tv: number;\n\t}>;\n\treturn data;\n});\n\nexport const getWorldCapitals = prerender(async () => {\n\tconst { fetch } = getRequestEvent();\n\tconst data = (await fetch('/data/examples/geo/world-capitals.json').then(async (r) =>\n\t\tr.json()\n\t)) as { label: string; latitude: number; longitude: number }[];\n\treturn data;\n});\n\nexport const getWorldAirports = prerender(async () => {\n\tconst { fetch } = getRequestEvent();\n\tconst data = (await fetch('/data/examples/geo/world-airports.csv').then(async (r) =>\n\t\tcsvParse(await r.text(), autoType)\n\t)) as { name: string; latitude: number; longitude: number }[];\n\treturn data;\n});\n\nexport const getD1FootballTeams = prerender(async () => {\n\tconst { fetch } = getRequestEvent();\n\tconst data = (await fetch('/data/examples/geo/d1-football-teams.csv').then(async (r) =>\n\t\tcsvParse(await r.text(), autoType)\n\t)) as {\n\t\tteam: string;\n\t\tcollege: string;\n\t\tconference: string;\n\t\tcity: string;\n\t\tstate: string;\n\t\tlatitude: number;\n\t\tlongitude: number;\n\t\tespn_id: number;\n\t}[];\n\treturn data;\n});\n\nexport const getBeagleVoyage = prerender(async () => {\n\tconst { fetch } = getRequestEvent();\n\tconst data = (await fetch('/data/examples/geo/beagle-voyage.csv').then(async (r) =>\n\t\tcsvParse(await r.text(), autoType)\n\t)) as { longitude: number; latitude: number }[];\n\treturn data;\n});\n\nexport const getWorldLinks = prerender(async () => {\n\tconst { fetch } = getRequestEvent();\n\tconst data = (await fetch('/data/examples/geo/world-links.json').then((r) =>\n\t\tr.json()\n\t)) as WorldLinksData;\n\treturn data;\n});\n", "graph.remote.ts": "import { prerender, getRequestEvent, query } from '$app/server';\nimport { range } from 'd3-array';\nimport { randomInteger } from '@layerstack/utils';\nimport { unique } from '@layerstack/utils/array';\nimport { z } from 'zod';\n\nconst alpha = [...Array(26)].map((val, i) => String.fromCharCode(i + 65));\n\nexport const getGraph = query(z.string(), async (name) => {\n\tswitch (name) {\n\t\tcase 'basic': {\n\t\t\treturn getBasicGraph();\n\t\t}\n\t\tcase 'simple': {\n\t\t\treturn getSimpleGraph();\n\t\t}\n\t\tcase 'medium': {\n\t\t\treturn getMediumDag();\n\t\t}\n\t\tcase 'large': {\n\t\t\treturn getLargeDag();\n\t\t}\n\t\tcase 'complex': {\n\t\t\treturn getComplexGraph();\n\t\t}\n\t\tcase 'miserables': {\n\t\t\treturn getMiserablesGraph();\n\t\t}\n\t\tcase 'tcp-state': {\n\t\t\treturn getTcpStateGraph();\n\t\t}\n\t\tcase 'software-user-flow': {\n\t\t\treturn getSoftwareUserFlowGraph();\n\t\t}\n\t\tcase 'cluster': {\n\t\t\treturn getClusterGraph();\n\t\t}\n\t\tcase 'dag-medium': {\n\t\t\treturn getMediumDag();\n\t\t}\n\t\tcase 'dag-large': {\n\t\t\treturn getLargeDag();\n\t\t}\n\t\tcase 'disjoint-graph': {\n\t\t\treturn getDisjointGraph();\n\t\t}\n\t\tcase 'simple-generated': {\n\t\t\treturn getSimpleGeneratedGraph();\n\t\t}\n\t\tcase 'complex-generated': {\n\t\t\treturn getComplexGeneratedGraph();\n\t\t}\n\t\tdefault: {\n\t\t\tthrow new Error(`Unknown graph: ${name}`);\n\t\t}\n\t}\n});\n\nexport const getBasicGraph = prerender(async () => {\n\tconst { fetch } = getRequestEvent();\n\tconst data = (await fetch('/data/examples/graph/basic.json').then((r) => r.json())) as {\n\t\tnodes: { id: string }[];\n\t\tlinks: { source: string; target: string }[];\n\t};\n\treturn data;\n});\n\nexport const getSimpleGraph = prerender(async () => {\n\tconst { fetch } = getRequestEvent();\n\tconst data = (await fetch('/data/examples/graph/simple.json').then((r) => r.json())) as {\n\t\tnodes: { id: string }[];\n\t\tlinks: { source: string; target: string }[];\n\t};\n\treturn data;\n});\n\nexport const getComplexGraph = prerender(async () => {\n\tconst { fetch } = getRequestEvent();\n\tconst data = (await fetch('/data/examples/graph/complex.json').then((r) => r.json())) as {\n\t\tnodes: { id: string }[];\n\t\tlinks: { source: string; target: string }[];\n\t};\n\treturn data;\n});\n\nexport const getMiserablesGraph = prerender(async () => {\n\tconst { fetch } = getRequestEvent();\n\tconst data = (await fetch('/data/examples/graph/miserables.json').then((r) => r.json())) as {\n\t\tnodes: { id: string; group: number }[];\n\t\tlinks: { source: string; target: string; value: number }[];\n\t};\n\treturn data;\n});\n\nexport const getTcpStateGraph = prerender(async () => {\n\tconst { fetch } = getRequestEvent();\n\tconst data = (await fetch('/data/examples/graph/tcp-state.json').then((r) => r.json())) as {\n\t\tnodes: { id: string }[];\n\t\tlinks: { source: string; target: string; label: string }[];\n\t};\n\treturn data;\n});\n\nexport const getSoftwareUserFlowGraph = prerender(async () => {\n\tconst { fetch } = getRequestEvent();\n\tconst data = (await fetch('/data/examples/graph/software-user-flow.json').then((r) =>\n\t\tr.json()\n\t)) as {\n\t\tnodes: { id: string }[];\n\t\tlinks: { source: string; target: string; label: string }[];\n\t};\n\treturn data;\n});\n\nexport const getClusterGraph = prerender(async () => {\n\tconst { fetch } = getRequestEvent();\n\tconst data = (await fetch('/data/examples/graph/cluster.json').then((r) => r.json())) as {\n\t\tnodes: { id: string; parent?: string }[];\n\t\tlinks: { source: string; target: string }[];\n\t};\n\treturn data;\n});\n\nexport const getMediumDag = prerender(async () => {\n\tconst { fetch } = getRequestEvent();\n\tconst data = (await fetch('/data/examples/graph/dag-medium.json').then((r) => r.json())) as {\n\t\tnodes: { id: string; name: string }[];\n\t\tlinks: { source: string; target: string }[];\n\t};\n\treturn data;\n});\n\nexport const getLargeDag = prerender(async () => {\n\tconst { fetch } = getRequestEvent();\n\tconst data = (await fetch('/data/examples/graph/dag-large.json').then((r) => r.json())) as {\n\t\tnodes: { id: string; name: string }[];\n\t\tlinks: { source: string; target: string }[];\n\t};\n\treturn data;\n});\n\nexport const getDisjointGraph = prerender(async () => {\n\tconst { fetch } = getRequestEvent();\n\tconst data = (await fetch('/data/examples/graph/disjoint-graph.json').then((r) => r.json())) as {\n\t\tnodes: { id: string; group: number }[];\n\t\tlinks: { source: string; target: string; value: number }[];\n\t};\n\treturn data;\n});\n\nexport const getSimpleGeneratedGraph = prerender(async () => {\n\tconst data = {\n\t\tnodes: alpha.map((a) => ({\n\t\t\tid: a\n\t\t})),\n\t\tlinks: alpha.flatMap((a, i) => {\n\t\t\tif (i === 25) {\n\t\t\t\treturn [];\n\t\t\t} else {\n\t\t\t\tconst randomDownstreamId = randomInteger(i + 1, 25);\n\t\t\t\tconst edge = { source: a, target: alpha[randomDownstreamId] };\n\t\t\t\treturn [edge];\n\t\t\t}\n\t\t})\n\t};\n\treturn data;\n});\n\nexport const getComplexGeneratedGraph = prerender(async () => {\n\tfunction getRandomDownstreamIds(index: number) {\n\t\treturn unique(range(randomInteger(1, 3)).map(() => randomInteger(index + 1, 25)));\n\t}\n\n\tconst data = {\n\t\tnodes: alpha.map((a) => ({\n\t\t\tid: a\n\t\t})),\n\t\tlinks: alpha.flatMap((a, i) => {\n\t\t\tif (i === 25) {\n\t\t\t\treturn [];\n\t\t\t} else {\n\t\t\t\treturn getRandomDownstreamIds(i).map((id) => {\n\t\t\t\t\treturn { source: a, target: alpha[id] };\n\t\t\t\t});\n\t\t\t}\n\t\t})\n\t};\n\treturn data;\n});\n\nexport const getGreenhouseGraph = prerender(async () => {\n\tconst { fetch } = getRequestEvent();\n\tconst data = (await fetch('/data/examples/graph/greenhouse.json').then((r) => r.json())) as {\n\t\tnodes: { id: string }[];\n\t\tlinks: { source: string; target: string }[];\n\t};\n\treturn data;\n});\n" } \ No newline at end of file diff --git a/docs/static/screenshots/AnnotationLine/bar-chart-dark-240w.webp b/docs/static/screenshots/AnnotationLine/bar-chart-dark-240w.webp index c8d6b49e36..2264f1e4a9 100644 Binary files a/docs/static/screenshots/AnnotationLine/bar-chart-dark-240w.webp and b/docs/static/screenshots/AnnotationLine/bar-chart-dark-240w.webp differ diff --git a/docs/static/screenshots/AnnotationLine/bar-chart-dark-400w.webp b/docs/static/screenshots/AnnotationLine/bar-chart-dark-400w.webp index 01446c97a8..8b7e750c30 100644 Binary files a/docs/static/screenshots/AnnotationLine/bar-chart-dark-400w.webp and b/docs/static/screenshots/AnnotationLine/bar-chart-dark-400w.webp differ diff --git a/docs/static/screenshots/AnnotationLine/bar-chart-dark-800w.webp b/docs/static/screenshots/AnnotationLine/bar-chart-dark-800w.webp index cd17d0180c..d535f2be72 100644 Binary files a/docs/static/screenshots/AnnotationLine/bar-chart-dark-800w.webp and b/docs/static/screenshots/AnnotationLine/bar-chart-dark-800w.webp differ diff --git a/docs/static/screenshots/AnnotationLine/bar-chart-light-240w.webp b/docs/static/screenshots/AnnotationLine/bar-chart-light-240w.webp index 76d5f508a5..7d69bbbee0 100644 Binary files a/docs/static/screenshots/AnnotationLine/bar-chart-light-240w.webp and b/docs/static/screenshots/AnnotationLine/bar-chart-light-240w.webp differ diff --git a/docs/static/screenshots/AnnotationLine/bar-chart-light-400w.webp b/docs/static/screenshots/AnnotationLine/bar-chart-light-400w.webp index 528ff408f8..800460fe9d 100644 Binary files a/docs/static/screenshots/AnnotationLine/bar-chart-light-400w.webp and b/docs/static/screenshots/AnnotationLine/bar-chart-light-400w.webp differ diff --git a/docs/static/screenshots/AnnotationLine/bar-chart-light-800w.webp b/docs/static/screenshots/AnnotationLine/bar-chart-light-800w.webp index 029d6b09f2..4a654642eb 100644 Binary files a/docs/static/screenshots/AnnotationLine/bar-chart-light-800w.webp and b/docs/static/screenshots/AnnotationLine/bar-chart-light-800w.webp differ diff --git a/docs/static/screenshots/AnnotationLine/horizontal-dark-240w.webp b/docs/static/screenshots/AnnotationLine/horizontal-dark-240w.webp index 53b2919888..d71db1ccf9 100644 Binary files a/docs/static/screenshots/AnnotationLine/horizontal-dark-240w.webp and b/docs/static/screenshots/AnnotationLine/horizontal-dark-240w.webp differ diff --git a/docs/static/screenshots/AnnotationLine/horizontal-dark-400w.webp b/docs/static/screenshots/AnnotationLine/horizontal-dark-400w.webp index d27e38cead..cad7c96a3d 100644 Binary files a/docs/static/screenshots/AnnotationLine/horizontal-dark-400w.webp and b/docs/static/screenshots/AnnotationLine/horizontal-dark-400w.webp differ diff --git a/docs/static/screenshots/AnnotationLine/horizontal-dark-800w.webp b/docs/static/screenshots/AnnotationLine/horizontal-dark-800w.webp index 89d95c585f..af8b9b1876 100644 Binary files a/docs/static/screenshots/AnnotationLine/horizontal-dark-800w.webp and b/docs/static/screenshots/AnnotationLine/horizontal-dark-800w.webp differ diff --git a/docs/static/screenshots/AnnotationLine/horizontal-light-800w.webp b/docs/static/screenshots/AnnotationLine/horizontal-light-800w.webp index c2a633003d..67fbfd7f9e 100644 Binary files a/docs/static/screenshots/AnnotationLine/horizontal-light-800w.webp and b/docs/static/screenshots/AnnotationLine/horizontal-light-800w.webp differ diff --git a/docs/static/screenshots/AnnotationLine/horizontal-placement-dark-240w.webp b/docs/static/screenshots/AnnotationLine/horizontal-placement-dark-240w.webp index 4d357f901c..e515ddb489 100644 Binary files a/docs/static/screenshots/AnnotationLine/horizontal-placement-dark-240w.webp and b/docs/static/screenshots/AnnotationLine/horizontal-placement-dark-240w.webp differ diff --git a/docs/static/screenshots/AnnotationLine/horizontal-placement-dark-400w.webp b/docs/static/screenshots/AnnotationLine/horizontal-placement-dark-400w.webp index 52f4144c9c..936189710b 100644 Binary files a/docs/static/screenshots/AnnotationLine/horizontal-placement-dark-400w.webp and b/docs/static/screenshots/AnnotationLine/horizontal-placement-dark-400w.webp differ diff --git a/docs/static/screenshots/AnnotationLine/horizontal-placement-dark-800w.webp b/docs/static/screenshots/AnnotationLine/horizontal-placement-dark-800w.webp index 3ee7ff2402..83a91a76db 100644 Binary files a/docs/static/screenshots/AnnotationLine/horizontal-placement-dark-800w.webp and b/docs/static/screenshots/AnnotationLine/horizontal-placement-dark-800w.webp differ diff --git a/docs/static/screenshots/AnnotationLine/horizontal-placement-light-800w.webp b/docs/static/screenshots/AnnotationLine/horizontal-placement-light-800w.webp index adb5a23998..3dd79b5399 100644 Binary files a/docs/static/screenshots/AnnotationLine/horizontal-placement-light-800w.webp and b/docs/static/screenshots/AnnotationLine/horizontal-placement-light-800w.webp differ diff --git a/docs/static/screenshots/AnnotationLine/horizontal-with-range-dark-240w.webp b/docs/static/screenshots/AnnotationLine/horizontal-with-range-dark-240w.webp index 1859dba5e8..d2dd2e5ede 100644 Binary files a/docs/static/screenshots/AnnotationLine/horizontal-with-range-dark-240w.webp and b/docs/static/screenshots/AnnotationLine/horizontal-with-range-dark-240w.webp differ diff --git a/docs/static/screenshots/AnnotationLine/horizontal-with-range-dark-400w.webp b/docs/static/screenshots/AnnotationLine/horizontal-with-range-dark-400w.webp index 9817ff5ab6..cc75081e23 100644 Binary files a/docs/static/screenshots/AnnotationLine/horizontal-with-range-dark-400w.webp and b/docs/static/screenshots/AnnotationLine/horizontal-with-range-dark-400w.webp differ diff --git a/docs/static/screenshots/AnnotationLine/horizontal-with-range-dark-800w.webp b/docs/static/screenshots/AnnotationLine/horizontal-with-range-dark-800w.webp index 0b67746491..e81ce91194 100644 Binary files a/docs/static/screenshots/AnnotationLine/horizontal-with-range-dark-800w.webp and b/docs/static/screenshots/AnnotationLine/horizontal-with-range-dark-800w.webp differ diff --git a/docs/static/screenshots/AnnotationLine/horizontal-with-range-light-400w.webp b/docs/static/screenshots/AnnotationLine/horizontal-with-range-light-400w.webp index aadbcfa679..b6c7ed8911 100644 Binary files a/docs/static/screenshots/AnnotationLine/horizontal-with-range-light-400w.webp and b/docs/static/screenshots/AnnotationLine/horizontal-with-range-light-400w.webp differ diff --git a/docs/static/screenshots/AnnotationLine/horizontal-with-range-light-800w.webp b/docs/static/screenshots/AnnotationLine/horizontal-with-range-light-800w.webp index c36531477b..e83829dcb8 100644 Binary files a/docs/static/screenshots/AnnotationLine/horizontal-with-range-light-800w.webp and b/docs/static/screenshots/AnnotationLine/horizontal-with-range-light-800w.webp differ diff --git a/docs/static/screenshots/AnnotationLine/playground-dark-240w.webp b/docs/static/screenshots/AnnotationLine/playground-dark-240w.webp index f401634ec7..55c96b0b80 100644 Binary files a/docs/static/screenshots/AnnotationLine/playground-dark-240w.webp and b/docs/static/screenshots/AnnotationLine/playground-dark-240w.webp differ diff --git a/docs/static/screenshots/AnnotationLine/playground-dark-400w.webp b/docs/static/screenshots/AnnotationLine/playground-dark-400w.webp index bc07b7515f..e138923f2c 100644 Binary files a/docs/static/screenshots/AnnotationLine/playground-dark-400w.webp and b/docs/static/screenshots/AnnotationLine/playground-dark-400w.webp differ diff --git a/docs/static/screenshots/AnnotationLine/playground-dark-800w.webp b/docs/static/screenshots/AnnotationLine/playground-dark-800w.webp index 9280557265..e88e0db468 100644 Binary files a/docs/static/screenshots/AnnotationLine/playground-dark-800w.webp and b/docs/static/screenshots/AnnotationLine/playground-dark-800w.webp differ diff --git a/docs/static/screenshots/AnnotationLine/playground-light-240w.webp b/docs/static/screenshots/AnnotationLine/playground-light-240w.webp index b140dc3735..824e407bd7 100644 Binary files a/docs/static/screenshots/AnnotationLine/playground-light-240w.webp and b/docs/static/screenshots/AnnotationLine/playground-light-240w.webp differ diff --git a/docs/static/screenshots/AnnotationLine/playground-light-400w.webp b/docs/static/screenshots/AnnotationLine/playground-light-400w.webp index 596c3deef6..1b7fc7df1d 100644 Binary files a/docs/static/screenshots/AnnotationLine/playground-light-400w.webp and b/docs/static/screenshots/AnnotationLine/playground-light-400w.webp differ diff --git a/docs/static/screenshots/AnnotationLine/playground-light-800w.webp b/docs/static/screenshots/AnnotationLine/playground-light-800w.webp index e28beb9781..95ce1b112c 100644 Binary files a/docs/static/screenshots/AnnotationLine/playground-light-800w.webp and b/docs/static/screenshots/AnnotationLine/playground-light-800w.webp differ diff --git a/docs/static/screenshots/AnnotationLine/sloped-dark-240w.webp b/docs/static/screenshots/AnnotationLine/sloped-dark-240w.webp index bad3feba0a..3b122079ae 100644 Binary files a/docs/static/screenshots/AnnotationLine/sloped-dark-240w.webp and b/docs/static/screenshots/AnnotationLine/sloped-dark-240w.webp differ diff --git a/docs/static/screenshots/AnnotationLine/sloped-dark-400w.webp b/docs/static/screenshots/AnnotationLine/sloped-dark-400w.webp index 4211e0f1f4..81035a00f8 100644 Binary files a/docs/static/screenshots/AnnotationLine/sloped-dark-400w.webp and b/docs/static/screenshots/AnnotationLine/sloped-dark-400w.webp differ diff --git a/docs/static/screenshots/AnnotationLine/sloped-dark-800w.webp b/docs/static/screenshots/AnnotationLine/sloped-dark-800w.webp index 24f18d8fe1..db4082bdb7 100644 Binary files a/docs/static/screenshots/AnnotationLine/sloped-dark-800w.webp and b/docs/static/screenshots/AnnotationLine/sloped-dark-800w.webp differ diff --git a/docs/static/screenshots/AnnotationLine/sloped-light-800w.webp b/docs/static/screenshots/AnnotationLine/sloped-light-800w.webp index 0fe8124dfa..fd5f1c4103 100644 Binary files a/docs/static/screenshots/AnnotationLine/sloped-light-800w.webp and b/docs/static/screenshots/AnnotationLine/sloped-light-800w.webp differ diff --git a/docs/static/screenshots/AnnotationLine/vertical-dark-400w.webp b/docs/static/screenshots/AnnotationLine/vertical-dark-400w.webp index 70f87d20cb..2c0b45e796 100644 Binary files a/docs/static/screenshots/AnnotationLine/vertical-dark-400w.webp and b/docs/static/screenshots/AnnotationLine/vertical-dark-400w.webp differ diff --git a/docs/static/screenshots/AnnotationLine/vertical-dark-800w.webp b/docs/static/screenshots/AnnotationLine/vertical-dark-800w.webp index 578cee6213..2af730f8c3 100644 Binary files a/docs/static/screenshots/AnnotationLine/vertical-dark-800w.webp and b/docs/static/screenshots/AnnotationLine/vertical-dark-800w.webp differ diff --git a/docs/static/screenshots/AnnotationLine/vertical-light-400w.webp b/docs/static/screenshots/AnnotationLine/vertical-light-400w.webp index 4837eba059..7fde1106df 100644 Binary files a/docs/static/screenshots/AnnotationLine/vertical-light-400w.webp and b/docs/static/screenshots/AnnotationLine/vertical-light-400w.webp differ diff --git a/docs/static/screenshots/AnnotationLine/vertical-placement-dark-400w.webp b/docs/static/screenshots/AnnotationLine/vertical-placement-dark-400w.webp index 5667937da7..f53c2aa152 100644 Binary files a/docs/static/screenshots/AnnotationLine/vertical-placement-dark-400w.webp and b/docs/static/screenshots/AnnotationLine/vertical-placement-dark-400w.webp differ diff --git a/docs/static/screenshots/AnnotationLine/vertical-placement-dark-800w.webp b/docs/static/screenshots/AnnotationLine/vertical-placement-dark-800w.webp index 8edf69a310..e5b3608d20 100644 Binary files a/docs/static/screenshots/AnnotationLine/vertical-placement-dark-800w.webp and b/docs/static/screenshots/AnnotationLine/vertical-placement-dark-800w.webp differ diff --git a/docs/static/screenshots/AnnotationLine/vertical-placement-light-400w.webp b/docs/static/screenshots/AnnotationLine/vertical-placement-light-400w.webp index 97c8638af6..bb292655a5 100644 Binary files a/docs/static/screenshots/AnnotationLine/vertical-placement-light-400w.webp and b/docs/static/screenshots/AnnotationLine/vertical-placement-light-400w.webp differ diff --git a/docs/static/screenshots/AnnotationLine/vertical-placement-light-800w.webp b/docs/static/screenshots/AnnotationLine/vertical-placement-light-800w.webp index a514ccdcf0..dae62c216b 100644 Binary files a/docs/static/screenshots/AnnotationLine/vertical-placement-light-800w.webp and b/docs/static/screenshots/AnnotationLine/vertical-placement-light-800w.webp differ diff --git a/docs/static/screenshots/AnnotationLine/vertical-with-rotation-dark-400w.webp b/docs/static/screenshots/AnnotationLine/vertical-with-rotation-dark-400w.webp index 9679d13595..282ff5876c 100644 Binary files a/docs/static/screenshots/AnnotationLine/vertical-with-rotation-dark-400w.webp and b/docs/static/screenshots/AnnotationLine/vertical-with-rotation-dark-400w.webp differ diff --git a/docs/static/screenshots/AnnotationLine/vertical-with-rotation-dark-800w.webp b/docs/static/screenshots/AnnotationLine/vertical-with-rotation-dark-800w.webp index 0c280fc954..e0a45592df 100644 Binary files a/docs/static/screenshots/AnnotationLine/vertical-with-rotation-dark-800w.webp and b/docs/static/screenshots/AnnotationLine/vertical-with-rotation-dark-800w.webp differ diff --git a/docs/static/screenshots/AnnotationLine/vertical-with-rotation-light-400w.webp b/docs/static/screenshots/AnnotationLine/vertical-with-rotation-light-400w.webp index 419395f519..25fb59c2ef 100644 Binary files a/docs/static/screenshots/AnnotationLine/vertical-with-rotation-light-400w.webp and b/docs/static/screenshots/AnnotationLine/vertical-with-rotation-light-400w.webp differ diff --git a/docs/static/screenshots/AnnotationPoint/band-scale-on-axis-dark-240w.webp b/docs/static/screenshots/AnnotationPoint/band-scale-on-axis-dark-240w.webp index 32677f9b85..f1d395e578 100644 Binary files a/docs/static/screenshots/AnnotationPoint/band-scale-on-axis-dark-240w.webp and b/docs/static/screenshots/AnnotationPoint/band-scale-on-axis-dark-240w.webp differ diff --git a/docs/static/screenshots/AnnotationPoint/band-scale-on-axis-dark-400w.webp b/docs/static/screenshots/AnnotationPoint/band-scale-on-axis-dark-400w.webp index 98a416f341..c9d1c9ec28 100644 Binary files a/docs/static/screenshots/AnnotationPoint/band-scale-on-axis-dark-400w.webp and b/docs/static/screenshots/AnnotationPoint/band-scale-on-axis-dark-400w.webp differ diff --git a/docs/static/screenshots/AnnotationPoint/band-scale-on-axis-dark-800w.webp b/docs/static/screenshots/AnnotationPoint/band-scale-on-axis-dark-800w.webp index f263427c4c..016f77a2a5 100644 Binary files a/docs/static/screenshots/AnnotationPoint/band-scale-on-axis-dark-800w.webp and b/docs/static/screenshots/AnnotationPoint/band-scale-on-axis-dark-800w.webp differ diff --git a/docs/static/screenshots/AnnotationPoint/band-scale-on-axis-light-240w.webp b/docs/static/screenshots/AnnotationPoint/band-scale-on-axis-light-240w.webp index 3f99ae5d89..35172ff27c 100644 Binary files a/docs/static/screenshots/AnnotationPoint/band-scale-on-axis-light-240w.webp and b/docs/static/screenshots/AnnotationPoint/band-scale-on-axis-light-240w.webp differ diff --git a/docs/static/screenshots/AnnotationPoint/band-scale-on-axis-light-400w.webp b/docs/static/screenshots/AnnotationPoint/band-scale-on-axis-light-400w.webp index ec47d7979b..096b3bd242 100644 Binary files a/docs/static/screenshots/AnnotationPoint/band-scale-on-axis-light-400w.webp and b/docs/static/screenshots/AnnotationPoint/band-scale-on-axis-light-400w.webp differ diff --git a/docs/static/screenshots/AnnotationPoint/band-scale-on-axis-light-800w.webp b/docs/static/screenshots/AnnotationPoint/band-scale-on-axis-light-800w.webp index 16bc34adb5..11fd502e92 100644 Binary files a/docs/static/screenshots/AnnotationPoint/band-scale-on-axis-light-800w.webp and b/docs/static/screenshots/AnnotationPoint/band-scale-on-axis-light-800w.webp differ diff --git a/docs/static/screenshots/AnnotationPoint/band-scale-on-value-dark-240w.webp b/docs/static/screenshots/AnnotationPoint/band-scale-on-value-dark-240w.webp index 04a5d6c5d9..ddda52d4f6 100644 Binary files a/docs/static/screenshots/AnnotationPoint/band-scale-on-value-dark-240w.webp and b/docs/static/screenshots/AnnotationPoint/band-scale-on-value-dark-240w.webp differ diff --git a/docs/static/screenshots/AnnotationPoint/band-scale-on-value-dark-400w.webp b/docs/static/screenshots/AnnotationPoint/band-scale-on-value-dark-400w.webp index 4d4f6d6252..38b3011bd8 100644 Binary files a/docs/static/screenshots/AnnotationPoint/band-scale-on-value-dark-400w.webp and b/docs/static/screenshots/AnnotationPoint/band-scale-on-value-dark-400w.webp differ diff --git a/docs/static/screenshots/AnnotationPoint/band-scale-on-value-dark-800w.webp b/docs/static/screenshots/AnnotationPoint/band-scale-on-value-dark-800w.webp index 72c612e1b6..2d8b14ae55 100644 Binary files a/docs/static/screenshots/AnnotationPoint/band-scale-on-value-dark-800w.webp and b/docs/static/screenshots/AnnotationPoint/band-scale-on-value-dark-800w.webp differ diff --git a/docs/static/screenshots/AnnotationPoint/band-scale-on-value-light-240w.webp b/docs/static/screenshots/AnnotationPoint/band-scale-on-value-light-240w.webp index 8edceccf54..e1ae57a9af 100644 Binary files a/docs/static/screenshots/AnnotationPoint/band-scale-on-value-light-240w.webp and b/docs/static/screenshots/AnnotationPoint/band-scale-on-value-light-240w.webp differ diff --git a/docs/static/screenshots/AnnotationPoint/band-scale-on-value-light-400w.webp b/docs/static/screenshots/AnnotationPoint/band-scale-on-value-light-400w.webp index 3c9cf1bc41..40980adcbb 100644 Binary files a/docs/static/screenshots/AnnotationPoint/band-scale-on-value-light-400w.webp and b/docs/static/screenshots/AnnotationPoint/band-scale-on-value-light-400w.webp differ diff --git a/docs/static/screenshots/AnnotationPoint/band-scale-on-value-light-800w.webp b/docs/static/screenshots/AnnotationPoint/band-scale-on-value-light-800w.webp index 73ca9be8c1..ea1b58db55 100644 Binary files a/docs/static/screenshots/AnnotationPoint/band-scale-on-value-light-800w.webp and b/docs/static/screenshots/AnnotationPoint/band-scale-on-value-light-800w.webp differ diff --git a/docs/static/screenshots/AnnotationPoint/line-to-point-dark-240w.webp b/docs/static/screenshots/AnnotationPoint/line-to-point-dark-240w.webp index 8aa5171392..8ef364db08 100644 Binary files a/docs/static/screenshots/AnnotationPoint/line-to-point-dark-240w.webp and b/docs/static/screenshots/AnnotationPoint/line-to-point-dark-240w.webp differ diff --git a/docs/static/screenshots/AnnotationPoint/line-to-point-dark-400w.webp b/docs/static/screenshots/AnnotationPoint/line-to-point-dark-400w.webp index 167faeac6a..d244c6b6f3 100644 Binary files a/docs/static/screenshots/AnnotationPoint/line-to-point-dark-400w.webp and b/docs/static/screenshots/AnnotationPoint/line-to-point-dark-400w.webp differ diff --git a/docs/static/screenshots/AnnotationPoint/line-to-point-dark-800w.webp b/docs/static/screenshots/AnnotationPoint/line-to-point-dark-800w.webp index f945f17287..44116547a8 100644 Binary files a/docs/static/screenshots/AnnotationPoint/line-to-point-dark-800w.webp and b/docs/static/screenshots/AnnotationPoint/line-to-point-dark-800w.webp differ diff --git a/docs/static/screenshots/AnnotationPoint/line-to-point-light-240w.webp b/docs/static/screenshots/AnnotationPoint/line-to-point-light-240w.webp index 6576bcf7a1..8720bab0f4 100644 Binary files a/docs/static/screenshots/AnnotationPoint/line-to-point-light-240w.webp and b/docs/static/screenshots/AnnotationPoint/line-to-point-light-240w.webp differ diff --git a/docs/static/screenshots/AnnotationPoint/line-to-point-light-400w.webp b/docs/static/screenshots/AnnotationPoint/line-to-point-light-400w.webp index a8b9ff5c9c..f4b486466e 100644 Binary files a/docs/static/screenshots/AnnotationPoint/line-to-point-light-400w.webp and b/docs/static/screenshots/AnnotationPoint/line-to-point-light-400w.webp differ diff --git a/docs/static/screenshots/AnnotationPoint/line-to-point-light-800w.webp b/docs/static/screenshots/AnnotationPoint/line-to-point-light-800w.webp index 1f5c4aafe5..3b0b142682 100644 Binary files a/docs/static/screenshots/AnnotationPoint/line-to-point-light-800w.webp and b/docs/static/screenshots/AnnotationPoint/line-to-point-light-800w.webp differ diff --git a/docs/static/screenshots/AnnotationPoint/link-callouts-dark-240w.webp b/docs/static/screenshots/AnnotationPoint/link-callouts-dark-240w.webp index 29b0b6bc43..e55e2a15d0 100644 Binary files a/docs/static/screenshots/AnnotationPoint/link-callouts-dark-240w.webp and b/docs/static/screenshots/AnnotationPoint/link-callouts-dark-240w.webp differ diff --git a/docs/static/screenshots/AnnotationPoint/link-callouts-dark-400w.webp b/docs/static/screenshots/AnnotationPoint/link-callouts-dark-400w.webp index c90a9ef4f0..5d33bd9d9a 100644 Binary files a/docs/static/screenshots/AnnotationPoint/link-callouts-dark-400w.webp and b/docs/static/screenshots/AnnotationPoint/link-callouts-dark-400w.webp differ diff --git a/docs/static/screenshots/AnnotationPoint/link-callouts-dark-800w.webp b/docs/static/screenshots/AnnotationPoint/link-callouts-dark-800w.webp index 91e81fb5a2..968d8d545c 100644 Binary files a/docs/static/screenshots/AnnotationPoint/link-callouts-dark-800w.webp and b/docs/static/screenshots/AnnotationPoint/link-callouts-dark-800w.webp differ diff --git a/docs/static/screenshots/AnnotationPoint/link-callouts-light-400w.webp b/docs/static/screenshots/AnnotationPoint/link-callouts-light-400w.webp index 5470529ba8..cde56dce80 100644 Binary files a/docs/static/screenshots/AnnotationPoint/link-callouts-light-400w.webp and b/docs/static/screenshots/AnnotationPoint/link-callouts-light-400w.webp differ diff --git a/docs/static/screenshots/AnnotationPoint/link-callouts-light-800w.webp b/docs/static/screenshots/AnnotationPoint/link-callouts-light-800w.webp index 253c9cd3a1..27ef6d993e 100644 Binary files a/docs/static/screenshots/AnnotationPoint/link-callouts-light-800w.webp and b/docs/static/screenshots/AnnotationPoint/link-callouts-light-800w.webp differ diff --git a/docs/static/screenshots/AnnotationPoint/on-axis-with-tooltip-dark-240w.webp b/docs/static/screenshots/AnnotationPoint/on-axis-with-tooltip-dark-240w.webp index 82d4180df9..f46a76129b 100644 Binary files a/docs/static/screenshots/AnnotationPoint/on-axis-with-tooltip-dark-240w.webp and b/docs/static/screenshots/AnnotationPoint/on-axis-with-tooltip-dark-240w.webp differ diff --git a/docs/static/screenshots/AnnotationPoint/on-axis-with-tooltip-dark-400w.webp b/docs/static/screenshots/AnnotationPoint/on-axis-with-tooltip-dark-400w.webp index dcdf9352ee..55afb2e7c2 100644 Binary files a/docs/static/screenshots/AnnotationPoint/on-axis-with-tooltip-dark-400w.webp and b/docs/static/screenshots/AnnotationPoint/on-axis-with-tooltip-dark-400w.webp differ diff --git a/docs/static/screenshots/AnnotationPoint/on-axis-with-tooltip-dark-800w.webp b/docs/static/screenshots/AnnotationPoint/on-axis-with-tooltip-dark-800w.webp index 04fb7b1706..9605cd4517 100644 Binary files a/docs/static/screenshots/AnnotationPoint/on-axis-with-tooltip-dark-800w.webp and b/docs/static/screenshots/AnnotationPoint/on-axis-with-tooltip-dark-800w.webp differ diff --git a/docs/static/screenshots/AnnotationPoint/on-axis-with-tooltip-light-240w.webp b/docs/static/screenshots/AnnotationPoint/on-axis-with-tooltip-light-240w.webp index 107fcf7303..c05d230944 100644 Binary files a/docs/static/screenshots/AnnotationPoint/on-axis-with-tooltip-light-240w.webp and b/docs/static/screenshots/AnnotationPoint/on-axis-with-tooltip-light-240w.webp differ diff --git a/docs/static/screenshots/AnnotationPoint/on-axis-with-tooltip-light-400w.webp b/docs/static/screenshots/AnnotationPoint/on-axis-with-tooltip-light-400w.webp index 035d017c0b..9605915c2f 100644 Binary files a/docs/static/screenshots/AnnotationPoint/on-axis-with-tooltip-light-400w.webp and b/docs/static/screenshots/AnnotationPoint/on-axis-with-tooltip-light-400w.webp differ diff --git a/docs/static/screenshots/AnnotationPoint/on-axis-with-tooltip-light-800w.webp b/docs/static/screenshots/AnnotationPoint/on-axis-with-tooltip-light-800w.webp index 02bba84ce7..34dfab15ff 100644 Binary files a/docs/static/screenshots/AnnotationPoint/on-axis-with-tooltip-light-800w.webp and b/docs/static/screenshots/AnnotationPoint/on-axis-with-tooltip-light-800w.webp differ diff --git a/docs/static/screenshots/AnnotationPoint/on-series-with-line-and-tooltip-dark-240w.webp b/docs/static/screenshots/AnnotationPoint/on-series-with-line-and-tooltip-dark-240w.webp index e619d424a7..6b587e1a1a 100644 Binary files a/docs/static/screenshots/AnnotationPoint/on-series-with-line-and-tooltip-dark-240w.webp and b/docs/static/screenshots/AnnotationPoint/on-series-with-line-and-tooltip-dark-240w.webp differ diff --git a/docs/static/screenshots/AnnotationPoint/on-series-with-line-and-tooltip-dark-400w.webp b/docs/static/screenshots/AnnotationPoint/on-series-with-line-and-tooltip-dark-400w.webp index 6ba4106eb6..dfb00ae770 100644 Binary files a/docs/static/screenshots/AnnotationPoint/on-series-with-line-and-tooltip-dark-400w.webp and b/docs/static/screenshots/AnnotationPoint/on-series-with-line-and-tooltip-dark-400w.webp differ diff --git a/docs/static/screenshots/AnnotationPoint/on-series-with-line-and-tooltip-dark-800w.webp b/docs/static/screenshots/AnnotationPoint/on-series-with-line-and-tooltip-dark-800w.webp index ef7d6863f8..e98e75a2c7 100644 Binary files a/docs/static/screenshots/AnnotationPoint/on-series-with-line-and-tooltip-dark-800w.webp and b/docs/static/screenshots/AnnotationPoint/on-series-with-line-and-tooltip-dark-800w.webp differ diff --git a/docs/static/screenshots/AnnotationPoint/on-series-with-line-and-tooltip-light-240w.webp b/docs/static/screenshots/AnnotationPoint/on-series-with-line-and-tooltip-light-240w.webp index 1183c8a255..b854a85f50 100644 Binary files a/docs/static/screenshots/AnnotationPoint/on-series-with-line-and-tooltip-light-240w.webp and b/docs/static/screenshots/AnnotationPoint/on-series-with-line-and-tooltip-light-240w.webp differ diff --git a/docs/static/screenshots/AnnotationPoint/on-series-with-line-and-tooltip-light-400w.webp b/docs/static/screenshots/AnnotationPoint/on-series-with-line-and-tooltip-light-400w.webp index 3e3b35111c..0031f10d29 100644 Binary files a/docs/static/screenshots/AnnotationPoint/on-series-with-line-and-tooltip-light-400w.webp and b/docs/static/screenshots/AnnotationPoint/on-series-with-line-and-tooltip-light-400w.webp differ diff --git a/docs/static/screenshots/AnnotationPoint/on-series-with-line-and-tooltip-light-800w.webp b/docs/static/screenshots/AnnotationPoint/on-series-with-line-and-tooltip-light-800w.webp index 657aa72d89..4631d9f524 100644 Binary files a/docs/static/screenshots/AnnotationPoint/on-series-with-line-and-tooltip-light-800w.webp and b/docs/static/screenshots/AnnotationPoint/on-series-with-line-and-tooltip-light-800w.webp differ diff --git a/docs/static/screenshots/AnnotationPoint/on-series-with-tooltip-dark-240w.webp b/docs/static/screenshots/AnnotationPoint/on-series-with-tooltip-dark-240w.webp index dcdf8b691a..edd4283487 100644 Binary files a/docs/static/screenshots/AnnotationPoint/on-series-with-tooltip-dark-240w.webp and b/docs/static/screenshots/AnnotationPoint/on-series-with-tooltip-dark-240w.webp differ diff --git a/docs/static/screenshots/AnnotationPoint/on-series-with-tooltip-dark-400w.webp b/docs/static/screenshots/AnnotationPoint/on-series-with-tooltip-dark-400w.webp index 25c8e874d4..5448defdd3 100644 Binary files a/docs/static/screenshots/AnnotationPoint/on-series-with-tooltip-dark-400w.webp and b/docs/static/screenshots/AnnotationPoint/on-series-with-tooltip-dark-400w.webp differ diff --git a/docs/static/screenshots/AnnotationPoint/on-series-with-tooltip-dark-800w.webp b/docs/static/screenshots/AnnotationPoint/on-series-with-tooltip-dark-800w.webp index 0cc828353b..c0ca720145 100644 Binary files a/docs/static/screenshots/AnnotationPoint/on-series-with-tooltip-dark-800w.webp and b/docs/static/screenshots/AnnotationPoint/on-series-with-tooltip-dark-800w.webp differ diff --git a/docs/static/screenshots/AnnotationPoint/on-series-with-tooltip-light-240w.webp b/docs/static/screenshots/AnnotationPoint/on-series-with-tooltip-light-240w.webp index a52eeeb9e7..440cbdc3df 100644 Binary files a/docs/static/screenshots/AnnotationPoint/on-series-with-tooltip-light-240w.webp and b/docs/static/screenshots/AnnotationPoint/on-series-with-tooltip-light-240w.webp differ diff --git a/docs/static/screenshots/AnnotationPoint/on-series-with-tooltip-light-400w.webp b/docs/static/screenshots/AnnotationPoint/on-series-with-tooltip-light-400w.webp index 4509c86009..2699f82dbc 100644 Binary files a/docs/static/screenshots/AnnotationPoint/on-series-with-tooltip-light-400w.webp and b/docs/static/screenshots/AnnotationPoint/on-series-with-tooltip-light-400w.webp differ diff --git a/docs/static/screenshots/AnnotationPoint/on-series-with-tooltip-light-800w.webp b/docs/static/screenshots/AnnotationPoint/on-series-with-tooltip-light-800w.webp index 3580bc9e0d..db5b0de7e1 100644 Binary files a/docs/static/screenshots/AnnotationPoint/on-series-with-tooltip-light-800w.webp and b/docs/static/screenshots/AnnotationPoint/on-series-with-tooltip-light-800w.webp differ diff --git a/docs/static/screenshots/AnnotationPoint/playground-dark-400w.webp b/docs/static/screenshots/AnnotationPoint/playground-dark-400w.webp index 741c8f94ad..a5e8391c4d 100644 Binary files a/docs/static/screenshots/AnnotationPoint/playground-dark-400w.webp and b/docs/static/screenshots/AnnotationPoint/playground-dark-400w.webp differ diff --git a/docs/static/screenshots/AnnotationPoint/playground-dark-800w.webp b/docs/static/screenshots/AnnotationPoint/playground-dark-800w.webp index a63a5db4d1..d07819b987 100644 Binary files a/docs/static/screenshots/AnnotationPoint/playground-dark-800w.webp and b/docs/static/screenshots/AnnotationPoint/playground-dark-800w.webp differ diff --git a/docs/static/screenshots/AnnotationPoint/playground-light-800w.webp b/docs/static/screenshots/AnnotationPoint/playground-light-800w.webp index 37c25304b3..f6e4a709fc 100644 Binary files a/docs/static/screenshots/AnnotationPoint/playground-light-800w.webp and b/docs/static/screenshots/AnnotationPoint/playground-light-800w.webp differ diff --git a/docs/static/screenshots/AnnotationPoint/series-annotation-dark-240w.webp b/docs/static/screenshots/AnnotationPoint/series-annotation-dark-240w.webp index 2ed7c52ba8..c6e0e5e3be 100644 Binary files a/docs/static/screenshots/AnnotationPoint/series-annotation-dark-240w.webp and b/docs/static/screenshots/AnnotationPoint/series-annotation-dark-240w.webp differ diff --git a/docs/static/screenshots/AnnotationPoint/series-annotation-dark-400w.webp b/docs/static/screenshots/AnnotationPoint/series-annotation-dark-400w.webp index 68f91502e7..180cfd8778 100644 Binary files a/docs/static/screenshots/AnnotationPoint/series-annotation-dark-400w.webp and b/docs/static/screenshots/AnnotationPoint/series-annotation-dark-400w.webp differ diff --git a/docs/static/screenshots/AnnotationPoint/series-annotation-dark-800w.webp b/docs/static/screenshots/AnnotationPoint/series-annotation-dark-800w.webp index 39e1f7c01b..349b09018e 100644 Binary files a/docs/static/screenshots/AnnotationPoint/series-annotation-dark-800w.webp and b/docs/static/screenshots/AnnotationPoint/series-annotation-dark-800w.webp differ diff --git a/docs/static/screenshots/AnnotationPoint/series-annotation-light-240w.webp b/docs/static/screenshots/AnnotationPoint/series-annotation-light-240w.webp index f581ffd406..edccb49764 100644 Binary files a/docs/static/screenshots/AnnotationPoint/series-annotation-light-240w.webp and b/docs/static/screenshots/AnnotationPoint/series-annotation-light-240w.webp differ diff --git a/docs/static/screenshots/AnnotationPoint/series-annotation-light-400w.webp b/docs/static/screenshots/AnnotationPoint/series-annotation-light-400w.webp index 77a2975cb2..1de56c25e0 100644 Binary files a/docs/static/screenshots/AnnotationPoint/series-annotation-light-400w.webp and b/docs/static/screenshots/AnnotationPoint/series-annotation-light-400w.webp differ diff --git a/docs/static/screenshots/AnnotationPoint/series-annotation-light-800w.webp b/docs/static/screenshots/AnnotationPoint/series-annotation-light-800w.webp index c795fb3235..a9471f3fb0 100644 Binary files a/docs/static/screenshots/AnnotationPoint/series-annotation-light-800w.webp and b/docs/static/screenshots/AnnotationPoint/series-annotation-light-800w.webp differ diff --git a/docs/static/screenshots/AnnotationPoint/us-cities-dark-400w.webp b/docs/static/screenshots/AnnotationPoint/us-cities-dark-400w.webp index d54fa013c1..af3f1ced8b 100644 Binary files a/docs/static/screenshots/AnnotationPoint/us-cities-dark-400w.webp and b/docs/static/screenshots/AnnotationPoint/us-cities-dark-400w.webp differ diff --git a/docs/static/screenshots/AnnotationPoint/us-cities-dark-800w.webp b/docs/static/screenshots/AnnotationPoint/us-cities-dark-800w.webp index 4df9a35b1b..6a4c57354b 100644 Binary files a/docs/static/screenshots/AnnotationPoint/us-cities-dark-800w.webp and b/docs/static/screenshots/AnnotationPoint/us-cities-dark-800w.webp differ diff --git a/docs/static/screenshots/AnnotationPoint/us-cities-light-800w.webp b/docs/static/screenshots/AnnotationPoint/us-cities-light-800w.webp index 7c9c225bd1..67ad23bf78 100644 Binary files a/docs/static/screenshots/AnnotationPoint/us-cities-light-800w.webp and b/docs/static/screenshots/AnnotationPoint/us-cities-light-800w.webp differ diff --git a/docs/static/screenshots/AnnotationPoint/world-landmarks-dark-240w.webp b/docs/static/screenshots/AnnotationPoint/world-landmarks-dark-240w.webp index 513e5fceba..311649339c 100644 Binary files a/docs/static/screenshots/AnnotationPoint/world-landmarks-dark-240w.webp and b/docs/static/screenshots/AnnotationPoint/world-landmarks-dark-240w.webp differ diff --git a/docs/static/screenshots/AnnotationPoint/world-landmarks-dark-400w.webp b/docs/static/screenshots/AnnotationPoint/world-landmarks-dark-400w.webp index 1c69dd81ed..c03153cc79 100644 Binary files a/docs/static/screenshots/AnnotationPoint/world-landmarks-dark-400w.webp and b/docs/static/screenshots/AnnotationPoint/world-landmarks-dark-400w.webp differ diff --git a/docs/static/screenshots/AnnotationPoint/world-landmarks-dark-800w.webp b/docs/static/screenshots/AnnotationPoint/world-landmarks-dark-800w.webp index f54a507b7a..2f61aabaef 100644 Binary files a/docs/static/screenshots/AnnotationPoint/world-landmarks-dark-800w.webp and b/docs/static/screenshots/AnnotationPoint/world-landmarks-dark-800w.webp differ diff --git a/docs/static/screenshots/AnnotationPoint/world-landmarks-light-240w.webp b/docs/static/screenshots/AnnotationPoint/world-landmarks-light-240w.webp index bb28fb27c6..02b8ac2098 100644 Binary files a/docs/static/screenshots/AnnotationPoint/world-landmarks-light-240w.webp and b/docs/static/screenshots/AnnotationPoint/world-landmarks-light-240w.webp differ diff --git a/docs/static/screenshots/AnnotationPoint/world-landmarks-light-800w.webp b/docs/static/screenshots/AnnotationPoint/world-landmarks-light-800w.webp index 310822a437..0ed37da6a4 100644 Binary files a/docs/static/screenshots/AnnotationPoint/world-landmarks-light-800w.webp and b/docs/static/screenshots/AnnotationPoint/world-landmarks-light-800w.webp differ diff --git a/docs/static/screenshots/AnnotationRange/bar-chart-(multiple)-dark-240w.webp b/docs/static/screenshots/AnnotationRange/bar-chart-(multiple)-dark-240w.webp index f945878062..7535c047d9 100644 Binary files a/docs/static/screenshots/AnnotationRange/bar-chart-(multiple)-dark-240w.webp and b/docs/static/screenshots/AnnotationRange/bar-chart-(multiple)-dark-240w.webp differ diff --git a/docs/static/screenshots/AnnotationRange/bar-chart-(multiple)-dark-400w.webp b/docs/static/screenshots/AnnotationRange/bar-chart-(multiple)-dark-400w.webp index 747211303e..559419103d 100644 Binary files a/docs/static/screenshots/AnnotationRange/bar-chart-(multiple)-dark-400w.webp and b/docs/static/screenshots/AnnotationRange/bar-chart-(multiple)-dark-400w.webp differ diff --git a/docs/static/screenshots/AnnotationRange/bar-chart-(multiple)-dark-800w.webp b/docs/static/screenshots/AnnotationRange/bar-chart-(multiple)-dark-800w.webp index bd7a0feaed..b2c1fb5def 100644 Binary files a/docs/static/screenshots/AnnotationRange/bar-chart-(multiple)-dark-800w.webp and b/docs/static/screenshots/AnnotationRange/bar-chart-(multiple)-dark-800w.webp differ diff --git a/docs/static/screenshots/AnnotationRange/bar-chart-(multiple)-light-240w.webp b/docs/static/screenshots/AnnotationRange/bar-chart-(multiple)-light-240w.webp index b88fbe2add..18334689a2 100644 Binary files a/docs/static/screenshots/AnnotationRange/bar-chart-(multiple)-light-240w.webp and b/docs/static/screenshots/AnnotationRange/bar-chart-(multiple)-light-240w.webp differ diff --git a/docs/static/screenshots/AnnotationRange/bar-chart-(multiple)-light-400w.webp b/docs/static/screenshots/AnnotationRange/bar-chart-(multiple)-light-400w.webp index 3f8a930499..e1da7d391f 100644 Binary files a/docs/static/screenshots/AnnotationRange/bar-chart-(multiple)-light-400w.webp and b/docs/static/screenshots/AnnotationRange/bar-chart-(multiple)-light-400w.webp differ diff --git a/docs/static/screenshots/AnnotationRange/bar-chart-(multiple)-light-800w.webp b/docs/static/screenshots/AnnotationRange/bar-chart-(multiple)-light-800w.webp index 9ab5d45af3..52e74e11cb 100644 Binary files a/docs/static/screenshots/AnnotationRange/bar-chart-(multiple)-light-800w.webp and b/docs/static/screenshots/AnnotationRange/bar-chart-(multiple)-light-800w.webp differ diff --git a/docs/static/screenshots/AnnotationRange/bar-chart-(single)-dark-240w.webp b/docs/static/screenshots/AnnotationRange/bar-chart-(single)-dark-240w.webp index bb403c6082..f54aae937d 100644 Binary files a/docs/static/screenshots/AnnotationRange/bar-chart-(single)-dark-240w.webp and b/docs/static/screenshots/AnnotationRange/bar-chart-(single)-dark-240w.webp differ diff --git a/docs/static/screenshots/AnnotationRange/bar-chart-(single)-dark-400w.webp b/docs/static/screenshots/AnnotationRange/bar-chart-(single)-dark-400w.webp index 1e689ce25d..a7d13343f9 100644 Binary files a/docs/static/screenshots/AnnotationRange/bar-chart-(single)-dark-400w.webp and b/docs/static/screenshots/AnnotationRange/bar-chart-(single)-dark-400w.webp differ diff --git a/docs/static/screenshots/AnnotationRange/bar-chart-(single)-dark-800w.webp b/docs/static/screenshots/AnnotationRange/bar-chart-(single)-dark-800w.webp index 4b34937ed0..e7e96c64dc 100644 Binary files a/docs/static/screenshots/AnnotationRange/bar-chart-(single)-dark-800w.webp and b/docs/static/screenshots/AnnotationRange/bar-chart-(single)-dark-800w.webp differ diff --git a/docs/static/screenshots/AnnotationRange/bar-chart-(single)-light-240w.webp b/docs/static/screenshots/AnnotationRange/bar-chart-(single)-light-240w.webp index 2bd387f61f..e56741131a 100644 Binary files a/docs/static/screenshots/AnnotationRange/bar-chart-(single)-light-240w.webp and b/docs/static/screenshots/AnnotationRange/bar-chart-(single)-light-240w.webp differ diff --git a/docs/static/screenshots/AnnotationRange/bar-chart-(single)-light-400w.webp b/docs/static/screenshots/AnnotationRange/bar-chart-(single)-light-400w.webp index 84029fdfb1..f32855baf7 100644 Binary files a/docs/static/screenshots/AnnotationRange/bar-chart-(single)-light-400w.webp and b/docs/static/screenshots/AnnotationRange/bar-chart-(single)-light-400w.webp differ diff --git a/docs/static/screenshots/AnnotationRange/bar-chart-(single)-light-800w.webp b/docs/static/screenshots/AnnotationRange/bar-chart-(single)-light-800w.webp index 2e7a7d54a9..0105efa165 100644 Binary files a/docs/static/screenshots/AnnotationRange/bar-chart-(single)-light-800w.webp and b/docs/static/screenshots/AnnotationRange/bar-chart-(single)-light-800w.webp differ diff --git a/docs/static/screenshots/AnnotationRange/bar-chart-(value)-dark-240w.webp b/docs/static/screenshots/AnnotationRange/bar-chart-(value)-dark-240w.webp index 6af1d94968..a332eb6a53 100644 Binary files a/docs/static/screenshots/AnnotationRange/bar-chart-(value)-dark-240w.webp and b/docs/static/screenshots/AnnotationRange/bar-chart-(value)-dark-240w.webp differ diff --git a/docs/static/screenshots/AnnotationRange/bar-chart-(value)-dark-400w.webp b/docs/static/screenshots/AnnotationRange/bar-chart-(value)-dark-400w.webp index 8b91d2662d..3ddf429876 100644 Binary files a/docs/static/screenshots/AnnotationRange/bar-chart-(value)-dark-400w.webp and b/docs/static/screenshots/AnnotationRange/bar-chart-(value)-dark-400w.webp differ diff --git a/docs/static/screenshots/AnnotationRange/bar-chart-(value)-dark-800w.webp b/docs/static/screenshots/AnnotationRange/bar-chart-(value)-dark-800w.webp index cfe9039a1e..3abc246188 100644 Binary files a/docs/static/screenshots/AnnotationRange/bar-chart-(value)-dark-800w.webp and b/docs/static/screenshots/AnnotationRange/bar-chart-(value)-dark-800w.webp differ diff --git a/docs/static/screenshots/AnnotationRange/bar-chart-(value)-light-240w.webp b/docs/static/screenshots/AnnotationRange/bar-chart-(value)-light-240w.webp index ab0644e86a..9f3e3b7846 100644 Binary files a/docs/static/screenshots/AnnotationRange/bar-chart-(value)-light-240w.webp and b/docs/static/screenshots/AnnotationRange/bar-chart-(value)-light-240w.webp differ diff --git a/docs/static/screenshots/AnnotationRange/bar-chart-(value)-light-400w.webp b/docs/static/screenshots/AnnotationRange/bar-chart-(value)-light-400w.webp index a921d8c366..9a3906c03c 100644 Binary files a/docs/static/screenshots/AnnotationRange/bar-chart-(value)-light-400w.webp and b/docs/static/screenshots/AnnotationRange/bar-chart-(value)-light-400w.webp differ diff --git a/docs/static/screenshots/AnnotationRange/bar-chart-(value)-light-800w.webp b/docs/static/screenshots/AnnotationRange/bar-chart-(value)-light-800w.webp index 9c9709f1c0..cd7eb3ef98 100644 Binary files a/docs/static/screenshots/AnnotationRange/bar-chart-(value)-light-800w.webp and b/docs/static/screenshots/AnnotationRange/bar-chart-(value)-light-800w.webp differ diff --git a/docs/static/screenshots/AnnotationRange/hide-tooltip-dark-800w.webp b/docs/static/screenshots/AnnotationRange/hide-tooltip-dark-800w.webp index c0f1532791..019c199c26 100644 Binary files a/docs/static/screenshots/AnnotationRange/hide-tooltip-dark-800w.webp and b/docs/static/screenshots/AnnotationRange/hide-tooltip-dark-800w.webp differ diff --git a/docs/static/screenshots/AnnotationRange/hide-tooltip-light-400w.webp b/docs/static/screenshots/AnnotationRange/hide-tooltip-light-400w.webp index 1bf26ff1d0..f6974dac17 100644 Binary files a/docs/static/screenshots/AnnotationRange/hide-tooltip-light-400w.webp and b/docs/static/screenshots/AnnotationRange/hide-tooltip-light-400w.webp differ diff --git a/docs/static/screenshots/AnnotationRange/horizontal-with-fill-multiple-dark-800w.webp b/docs/static/screenshots/AnnotationRange/horizontal-with-fill-multiple-dark-800w.webp index d11a2d2077..961dc8a0b1 100644 Binary files a/docs/static/screenshots/AnnotationRange/horizontal-with-fill-multiple-dark-800w.webp and b/docs/static/screenshots/AnnotationRange/horizontal-with-fill-multiple-dark-800w.webp differ diff --git a/docs/static/screenshots/AnnotationRange/horizontal-with-pattern-lower-bound-dark-800w.webp b/docs/static/screenshots/AnnotationRange/horizontal-with-pattern-lower-bound-dark-800w.webp index 2e5009118e..124a526e03 100644 Binary files a/docs/static/screenshots/AnnotationRange/horizontal-with-pattern-lower-bound-dark-800w.webp and b/docs/static/screenshots/AnnotationRange/horizontal-with-pattern-lower-bound-dark-800w.webp differ diff --git a/docs/static/screenshots/AnnotationRange/horizontal-with-pattern-lower-bound-light-400w.webp b/docs/static/screenshots/AnnotationRange/horizontal-with-pattern-lower-bound-light-400w.webp index 1ed90bdf59..f26b0c41da 100644 Binary files a/docs/static/screenshots/AnnotationRange/horizontal-with-pattern-lower-bound-light-400w.webp and b/docs/static/screenshots/AnnotationRange/horizontal-with-pattern-lower-bound-light-400w.webp differ diff --git a/docs/static/screenshots/AnnotationRange/horizontal-with-pattern-lower-bound-light-800w.webp b/docs/static/screenshots/AnnotationRange/horizontal-with-pattern-lower-bound-light-800w.webp index f37cf274e2..4fd3803be5 100644 Binary files a/docs/static/screenshots/AnnotationRange/horizontal-with-pattern-lower-bound-light-800w.webp and b/docs/static/screenshots/AnnotationRange/horizontal-with-pattern-lower-bound-light-800w.webp differ diff --git a/docs/static/screenshots/AnnotationRange/horizontal-with-pattern-range-dark-800w.webp b/docs/static/screenshots/AnnotationRange/horizontal-with-pattern-range-dark-800w.webp index dbe9be5d31..47e14478b9 100644 Binary files a/docs/static/screenshots/AnnotationRange/horizontal-with-pattern-range-dark-800w.webp and b/docs/static/screenshots/AnnotationRange/horizontal-with-pattern-range-dark-800w.webp differ diff --git a/docs/static/screenshots/AnnotationRange/horizontal-with-pattern-upper-bound-dark-800w.webp b/docs/static/screenshots/AnnotationRange/horizontal-with-pattern-upper-bound-dark-800w.webp index af12663803..ea50cd7a02 100644 Binary files a/docs/static/screenshots/AnnotationRange/horizontal-with-pattern-upper-bound-dark-800w.webp and b/docs/static/screenshots/AnnotationRange/horizontal-with-pattern-upper-bound-dark-800w.webp differ diff --git a/docs/static/screenshots/AnnotationRange/horizontal-with-pattern-upper-bound-light-400w.webp b/docs/static/screenshots/AnnotationRange/horizontal-with-pattern-upper-bound-light-400w.webp index eb9107793c..771e302ac6 100644 Binary files a/docs/static/screenshots/AnnotationRange/horizontal-with-pattern-upper-bound-light-400w.webp and b/docs/static/screenshots/AnnotationRange/horizontal-with-pattern-upper-bound-light-400w.webp differ diff --git a/docs/static/screenshots/AnnotationRange/label-placement-dark-800w.webp b/docs/static/screenshots/AnnotationRange/label-placement-dark-800w.webp index 96dfabb578..81c6116e11 100644 Binary files a/docs/static/screenshots/AnnotationRange/label-placement-dark-800w.webp and b/docs/static/screenshots/AnnotationRange/label-placement-dark-800w.webp differ diff --git a/docs/static/screenshots/AnnotationRange/vertical-with-gradient-range-dark-800w.webp b/docs/static/screenshots/AnnotationRange/vertical-with-gradient-range-dark-800w.webp index 70eca2a906..b08f757c5f 100644 Binary files a/docs/static/screenshots/AnnotationRange/vertical-with-gradient-range-dark-800w.webp and b/docs/static/screenshots/AnnotationRange/vertical-with-gradient-range-dark-800w.webp differ diff --git a/docs/static/screenshots/AnnotationRange/vertical-with-pattern-lower-bound-dark-800w.webp b/docs/static/screenshots/AnnotationRange/vertical-with-pattern-lower-bound-dark-800w.webp index 765b1ec519..24bef8b8ed 100644 Binary files a/docs/static/screenshots/AnnotationRange/vertical-with-pattern-lower-bound-dark-800w.webp and b/docs/static/screenshots/AnnotationRange/vertical-with-pattern-lower-bound-dark-800w.webp differ diff --git a/docs/static/screenshots/AnnotationRange/vertical-with-pattern-lower-bound-light-400w.webp b/docs/static/screenshots/AnnotationRange/vertical-with-pattern-lower-bound-light-400w.webp index c4d33cdfaa..98ee1f7d31 100644 Binary files a/docs/static/screenshots/AnnotationRange/vertical-with-pattern-lower-bound-light-400w.webp and b/docs/static/screenshots/AnnotationRange/vertical-with-pattern-lower-bound-light-400w.webp differ diff --git a/docs/static/screenshots/AnnotationRange/vertical-with-pattern-range-dark-800w.webp b/docs/static/screenshots/AnnotationRange/vertical-with-pattern-range-dark-800w.webp index e248478c94..01c170e950 100644 Binary files a/docs/static/screenshots/AnnotationRange/vertical-with-pattern-range-dark-800w.webp and b/docs/static/screenshots/AnnotationRange/vertical-with-pattern-range-dark-800w.webp differ diff --git a/docs/static/screenshots/AnnotationRange/vertical-with-pattern-upper-bound-dark-800w.webp b/docs/static/screenshots/AnnotationRange/vertical-with-pattern-upper-bound-dark-800w.webp index 50a197aa95..98e5d976c0 100644 Binary files a/docs/static/screenshots/AnnotationRange/vertical-with-pattern-upper-bound-dark-800w.webp and b/docs/static/screenshots/AnnotationRange/vertical-with-pattern-upper-bound-dark-800w.webp differ diff --git a/docs/static/screenshots/AnnotationRange/vertical-with-pattern-upper-bound-light-400w.webp b/docs/static/screenshots/AnnotationRange/vertical-with-pattern-upper-bound-light-400w.webp index b519881108..7835fc5952 100644 Binary files a/docs/static/screenshots/AnnotationRange/vertical-with-pattern-upper-bound-light-400w.webp and b/docs/static/screenshots/AnnotationRange/vertical-with-pattern-upper-bound-light-400w.webp differ diff --git a/docs/static/screenshots/Arc/clock-dark-240w.webp b/docs/static/screenshots/Arc/clock-dark-240w.webp index 87ad298b39..b9d071c583 100644 Binary files a/docs/static/screenshots/Arc/clock-dark-240w.webp and b/docs/static/screenshots/Arc/clock-dark-240w.webp differ diff --git a/docs/static/screenshots/Arc/clock-dark-400w.webp b/docs/static/screenshots/Arc/clock-dark-400w.webp index b3f461ffb1..c003d14b5e 100644 Binary files a/docs/static/screenshots/Arc/clock-dark-400w.webp and b/docs/static/screenshots/Arc/clock-dark-400w.webp differ diff --git a/docs/static/screenshots/Arc/clock-dark-800w.webp b/docs/static/screenshots/Arc/clock-dark-800w.webp index 6b5b545c34..ba6d91aab8 100644 Binary files a/docs/static/screenshots/Arc/clock-dark-800w.webp and b/docs/static/screenshots/Arc/clock-dark-800w.webp differ diff --git a/docs/static/screenshots/Arc/clock-light-240w.webp b/docs/static/screenshots/Arc/clock-light-240w.webp index e75b7604cf..7435494e74 100644 Binary files a/docs/static/screenshots/Arc/clock-light-240w.webp and b/docs/static/screenshots/Arc/clock-light-240w.webp differ diff --git a/docs/static/screenshots/Arc/clock-light-400w.webp b/docs/static/screenshots/Arc/clock-light-400w.webp index 59fc2d3ac0..ebf7f83ff6 100644 Binary files a/docs/static/screenshots/Arc/clock-light-400w.webp and b/docs/static/screenshots/Arc/clock-light-400w.webp differ diff --git a/docs/static/screenshots/Arc/clock-light-800w.webp b/docs/static/screenshots/Arc/clock-light-800w.webp index 1753e3c34e..ac8693d165 100644 Binary files a/docs/static/screenshots/Arc/clock-light-800w.webp and b/docs/static/screenshots/Arc/clock-light-800w.webp differ diff --git a/docs/static/screenshots/Arc/draggable-arc-dark-240w.webp b/docs/static/screenshots/Arc/draggable-arc-dark-240w.webp index 09a81e7c3a..7bedea6ad7 100644 Binary files a/docs/static/screenshots/Arc/draggable-arc-dark-240w.webp and b/docs/static/screenshots/Arc/draggable-arc-dark-240w.webp differ diff --git a/docs/static/screenshots/Arc/draggable-arc-dark-400w.webp b/docs/static/screenshots/Arc/draggable-arc-dark-400w.webp index 4a1a746e9d..5483edb32a 100644 Binary files a/docs/static/screenshots/Arc/draggable-arc-dark-400w.webp and b/docs/static/screenshots/Arc/draggable-arc-dark-400w.webp differ diff --git a/docs/static/screenshots/Arc/draggable-arc-dark-800w.webp b/docs/static/screenshots/Arc/draggable-arc-dark-800w.webp index f5d1c76f93..e116cdfdca 100644 Binary files a/docs/static/screenshots/Arc/draggable-arc-dark-800w.webp and b/docs/static/screenshots/Arc/draggable-arc-dark-800w.webp differ diff --git a/docs/static/screenshots/Arc/draggable-arc-light-400w.webp b/docs/static/screenshots/Arc/draggable-arc-light-400w.webp index b9eb91100c..38a5f593db 100644 Binary files a/docs/static/screenshots/Arc/draggable-arc-light-400w.webp and b/docs/static/screenshots/Arc/draggable-arc-light-400w.webp differ diff --git a/docs/static/screenshots/Arc/draggable-arc-light-800w.webp b/docs/static/screenshots/Arc/draggable-arc-light-800w.webp index 8165474ae1..b4f7248fdf 100644 Binary files a/docs/static/screenshots/Arc/draggable-arc-light-800w.webp and b/docs/static/screenshots/Arc/draggable-arc-light-800w.webp differ diff --git a/docs/static/screenshots/Arc/gauge-dark-240w.webp b/docs/static/screenshots/Arc/gauge-dark-240w.webp index bb76d72266..5e337f06c1 100644 Binary files a/docs/static/screenshots/Arc/gauge-dark-240w.webp and b/docs/static/screenshots/Arc/gauge-dark-240w.webp differ diff --git a/docs/static/screenshots/Arc/gauge-dark-400w.webp b/docs/static/screenshots/Arc/gauge-dark-400w.webp index 9b995b5b83..20ff5166ac 100644 Binary files a/docs/static/screenshots/Arc/gauge-dark-400w.webp and b/docs/static/screenshots/Arc/gauge-dark-400w.webp differ diff --git a/docs/static/screenshots/Arc/gauge-dark-800w.webp b/docs/static/screenshots/Arc/gauge-dark-800w.webp index db03241831..23c923529b 100644 Binary files a/docs/static/screenshots/Arc/gauge-dark-800w.webp and b/docs/static/screenshots/Arc/gauge-dark-800w.webp differ diff --git a/docs/static/screenshots/Arc/gauge-gradient-dark-240w.webp b/docs/static/screenshots/Arc/gauge-gradient-dark-240w.webp index 8787610101..64ccd827cb 100644 Binary files a/docs/static/screenshots/Arc/gauge-gradient-dark-240w.webp and b/docs/static/screenshots/Arc/gauge-gradient-dark-240w.webp differ diff --git a/docs/static/screenshots/Arc/gauge-gradient-dark-400w.webp b/docs/static/screenshots/Arc/gauge-gradient-dark-400w.webp index 643ed89249..c6deff9f0d 100644 Binary files a/docs/static/screenshots/Arc/gauge-gradient-dark-400w.webp and b/docs/static/screenshots/Arc/gauge-gradient-dark-400w.webp differ diff --git a/docs/static/screenshots/Arc/gauge-gradient-dark-800w.webp b/docs/static/screenshots/Arc/gauge-gradient-dark-800w.webp index cb217fafc3..4930c36601 100644 Binary files a/docs/static/screenshots/Arc/gauge-gradient-dark-800w.webp and b/docs/static/screenshots/Arc/gauge-gradient-dark-800w.webp differ diff --git a/docs/static/screenshots/Arc/gauge-gradient-light-240w.webp b/docs/static/screenshots/Arc/gauge-gradient-light-240w.webp index d849a0d7d0..d031ddb05c 100644 Binary files a/docs/static/screenshots/Arc/gauge-gradient-light-240w.webp and b/docs/static/screenshots/Arc/gauge-gradient-light-240w.webp differ diff --git a/docs/static/screenshots/Arc/gauge-gradient-light-400w.webp b/docs/static/screenshots/Arc/gauge-gradient-light-400w.webp index 05e2e2a99a..ac99fbc2f7 100644 Binary files a/docs/static/screenshots/Arc/gauge-gradient-light-400w.webp and b/docs/static/screenshots/Arc/gauge-gradient-light-400w.webp differ diff --git a/docs/static/screenshots/Arc/gauge-gradient-light-800w.webp b/docs/static/screenshots/Arc/gauge-gradient-light-800w.webp index 85a2dcd595..c3c896c05f 100644 Binary files a/docs/static/screenshots/Arc/gauge-gradient-light-800w.webp and b/docs/static/screenshots/Arc/gauge-gradient-light-800w.webp differ diff --git a/docs/static/screenshots/Arc/gauge-light-240w.webp b/docs/static/screenshots/Arc/gauge-light-240w.webp index f235b9f95b..1783d3553d 100644 Binary files a/docs/static/screenshots/Arc/gauge-light-240w.webp and b/docs/static/screenshots/Arc/gauge-light-240w.webp differ diff --git a/docs/static/screenshots/Arc/gauge-light-400w.webp b/docs/static/screenshots/Arc/gauge-light-400w.webp index 43c0661adf..0b3461ea6f 100644 Binary files a/docs/static/screenshots/Arc/gauge-light-400w.webp and b/docs/static/screenshots/Arc/gauge-light-400w.webp differ diff --git a/docs/static/screenshots/Arc/gauge-light-800w.webp b/docs/static/screenshots/Arc/gauge-light-800w.webp index 044493137d..9dee57655c 100644 Binary files a/docs/static/screenshots/Arc/gauge-light-800w.webp and b/docs/static/screenshots/Arc/gauge-light-800w.webp differ diff --git a/docs/static/screenshots/Arc/label-direction-dark-240w.webp b/docs/static/screenshots/Arc/label-direction-dark-240w.webp index 6eb490c0cf..b8ad760ad1 100644 Binary files a/docs/static/screenshots/Arc/label-direction-dark-240w.webp and b/docs/static/screenshots/Arc/label-direction-dark-240w.webp differ diff --git a/docs/static/screenshots/Arc/label-direction-dark-400w.webp b/docs/static/screenshots/Arc/label-direction-dark-400w.webp index dbaad86315..90c41322be 100644 Binary files a/docs/static/screenshots/Arc/label-direction-dark-400w.webp and b/docs/static/screenshots/Arc/label-direction-dark-400w.webp differ diff --git a/docs/static/screenshots/Arc/label-direction-dark-800w.webp b/docs/static/screenshots/Arc/label-direction-dark-800w.webp index 23d6f7aa83..ff94f49da8 100644 Binary files a/docs/static/screenshots/Arc/label-direction-dark-800w.webp and b/docs/static/screenshots/Arc/label-direction-dark-800w.webp differ diff --git a/docs/static/screenshots/Arc/label-direction-light-240w.webp b/docs/static/screenshots/Arc/label-direction-light-240w.webp index 328d69d490..c306e16b98 100644 Binary files a/docs/static/screenshots/Arc/label-direction-light-240w.webp and b/docs/static/screenshots/Arc/label-direction-light-240w.webp differ diff --git a/docs/static/screenshots/Arc/label-direction-light-400w.webp b/docs/static/screenshots/Arc/label-direction-light-400w.webp index a8914ea06b..5a90a85938 100644 Binary files a/docs/static/screenshots/Arc/label-direction-light-400w.webp and b/docs/static/screenshots/Arc/label-direction-light-400w.webp differ diff --git a/docs/static/screenshots/Arc/label-direction-light-800w.webp b/docs/static/screenshots/Arc/label-direction-light-800w.webp index 4d47a16e98..c4c97f7fa5 100644 Binary files a/docs/static/screenshots/Arc/label-direction-light-800w.webp and b/docs/static/screenshots/Arc/label-direction-light-800w.webp differ diff --git a/docs/static/screenshots/Arc/partial-arc-dark-240w.webp b/docs/static/screenshots/Arc/partial-arc-dark-240w.webp index 340035414f..634633924f 100644 Binary files a/docs/static/screenshots/Arc/partial-arc-dark-240w.webp and b/docs/static/screenshots/Arc/partial-arc-dark-240w.webp differ diff --git a/docs/static/screenshots/Arc/partial-arc-dark-400w.webp b/docs/static/screenshots/Arc/partial-arc-dark-400w.webp index 107d09634a..dee88e31a4 100644 Binary files a/docs/static/screenshots/Arc/partial-arc-dark-400w.webp and b/docs/static/screenshots/Arc/partial-arc-dark-400w.webp differ diff --git a/docs/static/screenshots/Arc/partial-arc-dark-800w.webp b/docs/static/screenshots/Arc/partial-arc-dark-800w.webp index 789110cc67..c16d794d6f 100644 Binary files a/docs/static/screenshots/Arc/partial-arc-dark-800w.webp and b/docs/static/screenshots/Arc/partial-arc-dark-800w.webp differ diff --git a/docs/static/screenshots/Arc/partial-arc-light-240w.webp b/docs/static/screenshots/Arc/partial-arc-light-240w.webp index 570e2e7369..7792581085 100644 Binary files a/docs/static/screenshots/Arc/partial-arc-light-240w.webp and b/docs/static/screenshots/Arc/partial-arc-light-240w.webp differ diff --git a/docs/static/screenshots/Arc/partial-arc-light-400w.webp b/docs/static/screenshots/Arc/partial-arc-light-400w.webp index 7a3565a4d0..30a32df138 100644 Binary files a/docs/static/screenshots/Arc/partial-arc-light-400w.webp and b/docs/static/screenshots/Arc/partial-arc-light-400w.webp differ diff --git a/docs/static/screenshots/Arc/partial-arc-light-800w.webp b/docs/static/screenshots/Arc/partial-arc-light-800w.webp index 7f232bc17d..8e3f40fa0a 100644 Binary files a/docs/static/screenshots/Arc/partial-arc-light-800w.webp and b/docs/static/screenshots/Arc/partial-arc-light-800w.webp differ diff --git a/docs/static/screenshots/Arc/playground-dark-240w.webp b/docs/static/screenshots/Arc/playground-dark-240w.webp index d361c8758c..b174fafe8b 100644 Binary files a/docs/static/screenshots/Arc/playground-dark-240w.webp and b/docs/static/screenshots/Arc/playground-dark-240w.webp differ diff --git a/docs/static/screenshots/Arc/playground-dark-400w.webp b/docs/static/screenshots/Arc/playground-dark-400w.webp index 56bd59ff2c..46a03db1aa 100644 Binary files a/docs/static/screenshots/Arc/playground-dark-400w.webp and b/docs/static/screenshots/Arc/playground-dark-400w.webp differ diff --git a/docs/static/screenshots/Arc/playground-dark-800w.webp b/docs/static/screenshots/Arc/playground-dark-800w.webp index 47cfb824d4..4d9621b67a 100644 Binary files a/docs/static/screenshots/Arc/playground-dark-800w.webp and b/docs/static/screenshots/Arc/playground-dark-800w.webp differ diff --git a/docs/static/screenshots/Arc/playground-light-400w.webp b/docs/static/screenshots/Arc/playground-light-400w.webp index a2d1f919cf..34848f43d3 100644 Binary files a/docs/static/screenshots/Arc/playground-light-400w.webp and b/docs/static/screenshots/Arc/playground-light-400w.webp differ diff --git a/docs/static/screenshots/Arc/playground-light-800w.webp b/docs/static/screenshots/Arc/playground-light-800w.webp index ef0d4988c7..3abe67c5ee 100644 Binary files a/docs/static/screenshots/Arc/playground-light-800w.webp and b/docs/static/screenshots/Arc/playground-light-800w.webp differ diff --git a/docs/static/screenshots/Arc/segmented-arc-clip-mask-dark-240w.webp b/docs/static/screenshots/Arc/segmented-arc-clip-mask-dark-240w.webp index 8756689241..246291f1c6 100644 Binary files a/docs/static/screenshots/Arc/segmented-arc-clip-mask-dark-240w.webp and b/docs/static/screenshots/Arc/segmented-arc-clip-mask-dark-240w.webp differ diff --git a/docs/static/screenshots/Arc/segmented-arc-clip-mask-dark-400w.webp b/docs/static/screenshots/Arc/segmented-arc-clip-mask-dark-400w.webp index d2eb3f1227..16eba40551 100644 Binary files a/docs/static/screenshots/Arc/segmented-arc-clip-mask-dark-400w.webp and b/docs/static/screenshots/Arc/segmented-arc-clip-mask-dark-400w.webp differ diff --git a/docs/static/screenshots/Arc/segmented-arc-clip-mask-dark-800w.webp b/docs/static/screenshots/Arc/segmented-arc-clip-mask-dark-800w.webp index 6c904b38b4..9ea23e0322 100644 Binary files a/docs/static/screenshots/Arc/segmented-arc-clip-mask-dark-800w.webp and b/docs/static/screenshots/Arc/segmented-arc-clip-mask-dark-800w.webp differ diff --git a/docs/static/screenshots/Arc/segmented-arc-clip-mask-light-240w.webp b/docs/static/screenshots/Arc/segmented-arc-clip-mask-light-240w.webp index 734bcd0103..49cd89eb05 100644 Binary files a/docs/static/screenshots/Arc/segmented-arc-clip-mask-light-240w.webp and b/docs/static/screenshots/Arc/segmented-arc-clip-mask-light-240w.webp differ diff --git a/docs/static/screenshots/Arc/segmented-arc-clip-mask-light-400w.webp b/docs/static/screenshots/Arc/segmented-arc-clip-mask-light-400w.webp index 6ab96bf06b..f085988e93 100644 Binary files a/docs/static/screenshots/Arc/segmented-arc-clip-mask-light-400w.webp and b/docs/static/screenshots/Arc/segmented-arc-clip-mask-light-400w.webp differ diff --git a/docs/static/screenshots/Arc/segmented-arc-clip-mask-light-800w.webp b/docs/static/screenshots/Arc/segmented-arc-clip-mask-light-800w.webp index 644e4b0b27..87a4d13653 100644 Binary files a/docs/static/screenshots/Arc/segmented-arc-clip-mask-light-800w.webp and b/docs/static/screenshots/Arc/segmented-arc-clip-mask-light-800w.webp differ diff --git a/docs/static/screenshots/Arc/segmented-arc-dark-800w.webp b/docs/static/screenshots/Arc/segmented-arc-dark-800w.webp index f0a11c1c31..f3302ff37a 100644 Binary files a/docs/static/screenshots/Arc/segmented-arc-dark-800w.webp and b/docs/static/screenshots/Arc/segmented-arc-dark-800w.webp differ diff --git a/docs/static/screenshots/Arc/segmented-arc-light-240w.webp b/docs/static/screenshots/Arc/segmented-arc-light-240w.webp index 81195f2253..d117386361 100644 Binary files a/docs/static/screenshots/Arc/segmented-arc-light-240w.webp and b/docs/static/screenshots/Arc/segmented-arc-light-240w.webp differ diff --git a/docs/static/screenshots/Arc/segmented-arc-light-800w.webp b/docs/static/screenshots/Arc/segmented-arc-light-800w.webp index c8be21760b..391c385917 100644 Binary files a/docs/static/screenshots/Arc/segmented-arc-light-800w.webp and b/docs/static/screenshots/Arc/segmented-arc-light-800w.webp differ diff --git a/docs/static/screenshots/Arc/speedometer-dark-400w.webp b/docs/static/screenshots/Arc/speedometer-dark-400w.webp index a8c56cfe0f..52b2c4f68d 100644 Binary files a/docs/static/screenshots/Arc/speedometer-dark-400w.webp and b/docs/static/screenshots/Arc/speedometer-dark-400w.webp differ diff --git a/docs/static/screenshots/Arc/speedometer-dark-800w.webp b/docs/static/screenshots/Arc/speedometer-dark-800w.webp index 3284924bf4..6c9e35cca4 100644 Binary files a/docs/static/screenshots/Arc/speedometer-dark-800w.webp and b/docs/static/screenshots/Arc/speedometer-dark-800w.webp differ diff --git a/docs/static/screenshots/Arc/speedometer-light-800w.webp b/docs/static/screenshots/Arc/speedometer-light-800w.webp index ec4e9808c5..ba3c04c976 100644 Binary files a/docs/static/screenshots/Arc/speedometer-light-800w.webp and b/docs/static/screenshots/Arc/speedometer-light-800w.webp differ diff --git a/docs/static/screenshots/ArcChart/gradient-with-text-dark-400w.webp b/docs/static/screenshots/ArcChart/gradient-with-text-dark-400w.webp index 5115ed3c84..0d83c73010 100644 Binary files a/docs/static/screenshots/ArcChart/gradient-with-text-dark-400w.webp and b/docs/static/screenshots/ArcChart/gradient-with-text-dark-400w.webp differ diff --git a/docs/static/screenshots/ArcChart/gradient-with-text-dark-800w.webp b/docs/static/screenshots/ArcChart/gradient-with-text-dark-800w.webp index 57d06b9300..e5cccbf5ee 100644 Binary files a/docs/static/screenshots/ArcChart/gradient-with-text-dark-800w.webp and b/docs/static/screenshots/ArcChart/gradient-with-text-dark-800w.webp differ diff --git a/docs/static/screenshots/ArcChart/gradient-with-text-light-400w.webp b/docs/static/screenshots/ArcChart/gradient-with-text-light-400w.webp index 0cdbac5121..23983c5d25 100644 Binary files a/docs/static/screenshots/ArcChart/gradient-with-text-light-400w.webp and b/docs/static/screenshots/ArcChart/gradient-with-text-light-400w.webp differ diff --git a/docs/static/screenshots/ArcChart/gradient-with-text-light-800w.webp b/docs/static/screenshots/ArcChart/gradient-with-text-light-800w.webp index 6213f19f4e..06e8292b83 100644 Binary files a/docs/static/screenshots/ArcChart/gradient-with-text-light-800w.webp and b/docs/static/screenshots/ArcChart/gradient-with-text-light-800w.webp differ diff --git a/docs/static/screenshots/ArcChart/series-labels-dark-800w.webp b/docs/static/screenshots/ArcChart/series-labels-dark-800w.webp index baf5d65e78..ac475f0413 100644 Binary files a/docs/static/screenshots/ArcChart/series-labels-dark-800w.webp and b/docs/static/screenshots/ArcChart/series-labels-dark-800w.webp differ diff --git a/docs/static/screenshots/ArcChart/series-labels-light-800w.webp b/docs/static/screenshots/ArcChart/series-labels-light-800w.webp index baf5d65e78..ac475f0413 100644 Binary files a/docs/static/screenshots/ArcChart/series-labels-light-800w.webp and b/docs/static/screenshots/ArcChart/series-labels-light-800w.webp differ diff --git a/docs/static/screenshots/Area/basic-dark-240w.webp b/docs/static/screenshots/Area/basic-dark-240w.webp index f6ca9a5d0a..4fd3c5ebbe 100644 Binary files a/docs/static/screenshots/Area/basic-dark-240w.webp and b/docs/static/screenshots/Area/basic-dark-240w.webp differ diff --git a/docs/static/screenshots/Area/basic-dark-400w.webp b/docs/static/screenshots/Area/basic-dark-400w.webp index be67f72cc3..8a36ce61f6 100644 Binary files a/docs/static/screenshots/Area/basic-dark-400w.webp and b/docs/static/screenshots/Area/basic-dark-400w.webp differ diff --git a/docs/static/screenshots/Area/basic-dark-800w.webp b/docs/static/screenshots/Area/basic-dark-800w.webp index 43ed5c3bfa..e8ad146d08 100644 Binary files a/docs/static/screenshots/Area/basic-dark-800w.webp and b/docs/static/screenshots/Area/basic-dark-800w.webp differ diff --git a/docs/static/screenshots/Area/basic-light-240w.webp b/docs/static/screenshots/Area/basic-light-240w.webp index a550258087..e70015f368 100644 Binary files a/docs/static/screenshots/Area/basic-light-240w.webp and b/docs/static/screenshots/Area/basic-light-240w.webp differ diff --git a/docs/static/screenshots/Area/basic-light-400w.webp b/docs/static/screenshots/Area/basic-light-400w.webp index 9281cd98b9..f8348d1c03 100644 Binary files a/docs/static/screenshots/Area/basic-light-400w.webp and b/docs/static/screenshots/Area/basic-light-400w.webp differ diff --git a/docs/static/screenshots/Area/basic-light-800w.webp b/docs/static/screenshots/Area/basic-light-800w.webp index 7a4a72e466..d2c10734be 100644 Binary files a/docs/static/screenshots/Area/basic-light-800w.webp and b/docs/static/screenshots/Area/basic-light-800w.webp differ diff --git a/docs/static/screenshots/Area/clip-tween-on-mount-dark-240w.webp b/docs/static/screenshots/Area/clip-tween-on-mount-dark-240w.webp index 6c63e2ed61..63f12a3d2f 100644 Binary files a/docs/static/screenshots/Area/clip-tween-on-mount-dark-240w.webp and b/docs/static/screenshots/Area/clip-tween-on-mount-dark-240w.webp differ diff --git a/docs/static/screenshots/Area/clip-tween-on-mount-dark-400w.webp b/docs/static/screenshots/Area/clip-tween-on-mount-dark-400w.webp index 8b9d7bbabb..bb0457cc52 100644 Binary files a/docs/static/screenshots/Area/clip-tween-on-mount-dark-400w.webp and b/docs/static/screenshots/Area/clip-tween-on-mount-dark-400w.webp differ diff --git a/docs/static/screenshots/Area/clip-tween-on-mount-dark-800w.webp b/docs/static/screenshots/Area/clip-tween-on-mount-dark-800w.webp index 75880485e4..dd18646269 100644 Binary files a/docs/static/screenshots/Area/clip-tween-on-mount-dark-800w.webp and b/docs/static/screenshots/Area/clip-tween-on-mount-dark-800w.webp differ diff --git a/docs/static/screenshots/Area/clip-tween-on-mount-light-240w.webp b/docs/static/screenshots/Area/clip-tween-on-mount-light-240w.webp index 1971e8b8e6..304cca7f68 100644 Binary files a/docs/static/screenshots/Area/clip-tween-on-mount-light-240w.webp and b/docs/static/screenshots/Area/clip-tween-on-mount-light-240w.webp differ diff --git a/docs/static/screenshots/Area/clip-tween-on-mount-light-400w.webp b/docs/static/screenshots/Area/clip-tween-on-mount-light-400w.webp index 1115351f4d..5f1a7759a7 100644 Binary files a/docs/static/screenshots/Area/clip-tween-on-mount-light-400w.webp and b/docs/static/screenshots/Area/clip-tween-on-mount-light-400w.webp differ diff --git a/docs/static/screenshots/Area/clip-tween-on-mount-light-800w.webp b/docs/static/screenshots/Area/clip-tween-on-mount-light-800w.webp index 8b83d58457..7459c734c7 100644 Binary files a/docs/static/screenshots/Area/clip-tween-on-mount-light-800w.webp and b/docs/static/screenshots/Area/clip-tween-on-mount-light-800w.webp differ diff --git a/docs/static/screenshots/Area/explicit-axis-ticks-min-max-dark-240w.webp b/docs/static/screenshots/Area/explicit-axis-ticks-min-max-dark-240w.webp index 88c2af2d84..2e3eb95684 100644 Binary files a/docs/static/screenshots/Area/explicit-axis-ticks-min-max-dark-240w.webp and b/docs/static/screenshots/Area/explicit-axis-ticks-min-max-dark-240w.webp differ diff --git a/docs/static/screenshots/Area/explicit-axis-ticks-min-max-dark-400w.webp b/docs/static/screenshots/Area/explicit-axis-ticks-min-max-dark-400w.webp index 9489954ab2..4eb77c0b1d 100644 Binary files a/docs/static/screenshots/Area/explicit-axis-ticks-min-max-dark-400w.webp and b/docs/static/screenshots/Area/explicit-axis-ticks-min-max-dark-400w.webp differ diff --git a/docs/static/screenshots/Area/explicit-axis-ticks-min-max-dark-800w.webp b/docs/static/screenshots/Area/explicit-axis-ticks-min-max-dark-800w.webp index 02b789fb11..b0ba47cbeb 100644 Binary files a/docs/static/screenshots/Area/explicit-axis-ticks-min-max-dark-800w.webp and b/docs/static/screenshots/Area/explicit-axis-ticks-min-max-dark-800w.webp differ diff --git a/docs/static/screenshots/Area/explicit-axis-ticks-min-max-light-240w.webp b/docs/static/screenshots/Area/explicit-axis-ticks-min-max-light-240w.webp index 5be9c14317..220ab4da5f 100644 Binary files a/docs/static/screenshots/Area/explicit-axis-ticks-min-max-light-240w.webp and b/docs/static/screenshots/Area/explicit-axis-ticks-min-max-light-240w.webp differ diff --git a/docs/static/screenshots/Area/explicit-axis-ticks-min-max-light-400w.webp b/docs/static/screenshots/Area/explicit-axis-ticks-min-max-light-400w.webp index 7c2c557cdd..bafe65bfd0 100644 Binary files a/docs/static/screenshots/Area/explicit-axis-ticks-min-max-light-400w.webp and b/docs/static/screenshots/Area/explicit-axis-ticks-min-max-light-400w.webp differ diff --git a/docs/static/screenshots/Area/explicit-axis-ticks-min-max-light-800w.webp b/docs/static/screenshots/Area/explicit-axis-ticks-min-max-light-800w.webp index c41c56452a..462d1ab4a7 100644 Binary files a/docs/static/screenshots/Area/explicit-axis-ticks-min-max-light-800w.webp and b/docs/static/screenshots/Area/explicit-axis-ticks-min-max-light-800w.webp differ diff --git a/docs/static/screenshots/Area/gradient-dark-240w.webp b/docs/static/screenshots/Area/gradient-dark-240w.webp index 125fd19a99..f58be9c15a 100644 Binary files a/docs/static/screenshots/Area/gradient-dark-240w.webp and b/docs/static/screenshots/Area/gradient-dark-240w.webp differ diff --git a/docs/static/screenshots/Area/gradient-dark-400w.webp b/docs/static/screenshots/Area/gradient-dark-400w.webp index 69db0784e3..2647946a85 100644 Binary files a/docs/static/screenshots/Area/gradient-dark-400w.webp and b/docs/static/screenshots/Area/gradient-dark-400w.webp differ diff --git a/docs/static/screenshots/Area/gradient-dark-800w.webp b/docs/static/screenshots/Area/gradient-dark-800w.webp index 29a792e518..b12b83de1c 100644 Binary files a/docs/static/screenshots/Area/gradient-dark-800w.webp and b/docs/static/screenshots/Area/gradient-dark-800w.webp differ diff --git a/docs/static/screenshots/Area/gradient-light-240w.webp b/docs/static/screenshots/Area/gradient-light-240w.webp index a0ddc67a09..f594c6476c 100644 Binary files a/docs/static/screenshots/Area/gradient-light-240w.webp and b/docs/static/screenshots/Area/gradient-light-240w.webp differ diff --git a/docs/static/screenshots/Area/gradient-light-400w.webp b/docs/static/screenshots/Area/gradient-light-400w.webp index eb6ce4fb40..e14a45c56d 100644 Binary files a/docs/static/screenshots/Area/gradient-light-400w.webp and b/docs/static/screenshots/Area/gradient-light-400w.webp differ diff --git a/docs/static/screenshots/Area/gradient-light-800w.webp b/docs/static/screenshots/Area/gradient-light-800w.webp index 53eec8d62a..eca79cb164 100644 Binary files a/docs/static/screenshots/Area/gradient-light-800w.webp and b/docs/static/screenshots/Area/gradient-light-800w.webp differ diff --git a/docs/static/screenshots/Area/gradient-separate-stroke-dark-240w.webp b/docs/static/screenshots/Area/gradient-separate-stroke-dark-240w.webp index f1bbaa3504..fb75bb0bcd 100644 Binary files a/docs/static/screenshots/Area/gradient-separate-stroke-dark-240w.webp and b/docs/static/screenshots/Area/gradient-separate-stroke-dark-240w.webp differ diff --git a/docs/static/screenshots/Area/gradient-separate-stroke-dark-400w.webp b/docs/static/screenshots/Area/gradient-separate-stroke-dark-400w.webp index a16581942f..d899987ee0 100644 Binary files a/docs/static/screenshots/Area/gradient-separate-stroke-dark-400w.webp and b/docs/static/screenshots/Area/gradient-separate-stroke-dark-400w.webp differ diff --git a/docs/static/screenshots/Area/gradient-separate-stroke-dark-800w.webp b/docs/static/screenshots/Area/gradient-separate-stroke-dark-800w.webp index 669919cdd3..140518bbb0 100644 Binary files a/docs/static/screenshots/Area/gradient-separate-stroke-dark-800w.webp and b/docs/static/screenshots/Area/gradient-separate-stroke-dark-800w.webp differ diff --git a/docs/static/screenshots/Area/gradient-separate-stroke-light-240w.webp b/docs/static/screenshots/Area/gradient-separate-stroke-light-240w.webp index ce9aa7c700..0a4937ea72 100644 Binary files a/docs/static/screenshots/Area/gradient-separate-stroke-light-240w.webp and b/docs/static/screenshots/Area/gradient-separate-stroke-light-240w.webp differ diff --git a/docs/static/screenshots/Area/gradient-separate-stroke-light-400w.webp b/docs/static/screenshots/Area/gradient-separate-stroke-light-400w.webp index f7c52b5be2..38ae9fafb3 100644 Binary files a/docs/static/screenshots/Area/gradient-separate-stroke-light-400w.webp and b/docs/static/screenshots/Area/gradient-separate-stroke-light-400w.webp differ diff --git a/docs/static/screenshots/Area/gradient-separate-stroke-light-800w.webp b/docs/static/screenshots/Area/gradient-separate-stroke-light-800w.webp index edfb9ca9d7..1ba18bc4da 100644 Binary files a/docs/static/screenshots/Area/gradient-separate-stroke-light-800w.webp and b/docs/static/screenshots/Area/gradient-separate-stroke-light-800w.webp differ diff --git a/docs/static/screenshots/Area/highlight-color-based-on-value-using-color-scale-dark-240w.webp b/docs/static/screenshots/Area/highlight-color-based-on-value-using-color-scale-dark-240w.webp index e58e12ea04..1354cc0899 100644 Binary files a/docs/static/screenshots/Area/highlight-color-based-on-value-using-color-scale-dark-240w.webp and b/docs/static/screenshots/Area/highlight-color-based-on-value-using-color-scale-dark-240w.webp differ diff --git a/docs/static/screenshots/Area/highlight-color-based-on-value-using-color-scale-dark-400w.webp b/docs/static/screenshots/Area/highlight-color-based-on-value-using-color-scale-dark-400w.webp index aa1b0a1b10..0c4ecd572c 100644 Binary files a/docs/static/screenshots/Area/highlight-color-based-on-value-using-color-scale-dark-400w.webp and b/docs/static/screenshots/Area/highlight-color-based-on-value-using-color-scale-dark-400w.webp differ diff --git a/docs/static/screenshots/Area/highlight-color-based-on-value-using-color-scale-dark-800w.webp b/docs/static/screenshots/Area/highlight-color-based-on-value-using-color-scale-dark-800w.webp index b42398f7bd..1eb7b6fce2 100644 Binary files a/docs/static/screenshots/Area/highlight-color-based-on-value-using-color-scale-dark-800w.webp and b/docs/static/screenshots/Area/highlight-color-based-on-value-using-color-scale-dark-800w.webp differ diff --git a/docs/static/screenshots/Area/highlight-color-based-on-value-using-color-scale-light-240w.webp b/docs/static/screenshots/Area/highlight-color-based-on-value-using-color-scale-light-240w.webp index bbc14c5d2d..f7d4237ae5 100644 Binary files a/docs/static/screenshots/Area/highlight-color-based-on-value-using-color-scale-light-240w.webp and b/docs/static/screenshots/Area/highlight-color-based-on-value-using-color-scale-light-240w.webp differ diff --git a/docs/static/screenshots/Area/highlight-color-based-on-value-using-color-scale-light-400w.webp b/docs/static/screenshots/Area/highlight-color-based-on-value-using-color-scale-light-400w.webp index 3d72999e4d..4efa8c456f 100644 Binary files a/docs/static/screenshots/Area/highlight-color-based-on-value-using-color-scale-light-400w.webp and b/docs/static/screenshots/Area/highlight-color-based-on-value-using-color-scale-light-400w.webp differ diff --git a/docs/static/screenshots/Area/highlight-color-based-on-value-using-color-scale-light-800w.webp b/docs/static/screenshots/Area/highlight-color-based-on-value-using-color-scale-light-800w.webp index c62d348e85..0fcd81fd02 100644 Binary files a/docs/static/screenshots/Area/highlight-color-based-on-value-using-color-scale-light-800w.webp and b/docs/static/screenshots/Area/highlight-color-based-on-value-using-color-scale-light-800w.webp differ diff --git a/docs/static/screenshots/Area/highlight-color-based-on-value-using-tooltip-slot-prop-dark-240w.webp b/docs/static/screenshots/Area/highlight-color-based-on-value-using-tooltip-slot-prop-dark-240w.webp index 80189a8c67..f8973f4f18 100644 Binary files a/docs/static/screenshots/Area/highlight-color-based-on-value-using-tooltip-slot-prop-dark-240w.webp and b/docs/static/screenshots/Area/highlight-color-based-on-value-using-tooltip-slot-prop-dark-240w.webp differ diff --git a/docs/static/screenshots/Area/highlight-color-based-on-value-using-tooltip-slot-prop-dark-400w.webp b/docs/static/screenshots/Area/highlight-color-based-on-value-using-tooltip-slot-prop-dark-400w.webp index a2ed2a6328..f53b2ab7ec 100644 Binary files a/docs/static/screenshots/Area/highlight-color-based-on-value-using-tooltip-slot-prop-dark-400w.webp and b/docs/static/screenshots/Area/highlight-color-based-on-value-using-tooltip-slot-prop-dark-400w.webp differ diff --git a/docs/static/screenshots/Area/highlight-color-based-on-value-using-tooltip-slot-prop-dark-800w.webp b/docs/static/screenshots/Area/highlight-color-based-on-value-using-tooltip-slot-prop-dark-800w.webp index 63e12a40b7..141a7d3090 100644 Binary files a/docs/static/screenshots/Area/highlight-color-based-on-value-using-tooltip-slot-prop-dark-800w.webp and b/docs/static/screenshots/Area/highlight-color-based-on-value-using-tooltip-slot-prop-dark-800w.webp differ diff --git a/docs/static/screenshots/Area/highlight-color-based-on-value-using-tooltip-slot-prop-light-240w.webp b/docs/static/screenshots/Area/highlight-color-based-on-value-using-tooltip-slot-prop-light-240w.webp index 789521a5a4..927e5e6c3f 100644 Binary files a/docs/static/screenshots/Area/highlight-color-based-on-value-using-tooltip-slot-prop-light-240w.webp and b/docs/static/screenshots/Area/highlight-color-based-on-value-using-tooltip-slot-prop-light-240w.webp differ diff --git a/docs/static/screenshots/Area/highlight-color-based-on-value-using-tooltip-slot-prop-light-400w.webp b/docs/static/screenshots/Area/highlight-color-based-on-value-using-tooltip-slot-prop-light-400w.webp index 78de72b19d..7d70042bba 100644 Binary files a/docs/static/screenshots/Area/highlight-color-based-on-value-using-tooltip-slot-prop-light-400w.webp and b/docs/static/screenshots/Area/highlight-color-based-on-value-using-tooltip-slot-prop-light-400w.webp differ diff --git a/docs/static/screenshots/Area/highlight-color-based-on-value-using-tooltip-slot-prop-light-800w.webp b/docs/static/screenshots/Area/highlight-color-based-on-value-using-tooltip-slot-prop-light-800w.webp index 7f313700a2..efcc4b7a5a 100644 Binary files a/docs/static/screenshots/Area/highlight-color-based-on-value-using-tooltip-slot-prop-light-800w.webp and b/docs/static/screenshots/Area/highlight-color-based-on-value-using-tooltip-slot-prop-light-800w.webp differ diff --git a/docs/static/screenshots/Area/multiple-series-dark-240w.webp b/docs/static/screenshots/Area/multiple-series-dark-240w.webp index bc6435e200..8e74ea84be 100644 Binary files a/docs/static/screenshots/Area/multiple-series-dark-240w.webp and b/docs/static/screenshots/Area/multiple-series-dark-240w.webp differ diff --git a/docs/static/screenshots/Area/multiple-series-dark-400w.webp b/docs/static/screenshots/Area/multiple-series-dark-400w.webp index a2e15211c7..6691df3c26 100644 Binary files a/docs/static/screenshots/Area/multiple-series-dark-400w.webp and b/docs/static/screenshots/Area/multiple-series-dark-400w.webp differ diff --git a/docs/static/screenshots/Area/multiple-series-dark-800w.webp b/docs/static/screenshots/Area/multiple-series-dark-800w.webp index 8c6dec27f8..9fdace4c7b 100644 Binary files a/docs/static/screenshots/Area/multiple-series-dark-800w.webp and b/docs/static/screenshots/Area/multiple-series-dark-800w.webp differ diff --git a/docs/static/screenshots/Area/multiple-series-highlight-on-hover-dark-240w.webp b/docs/static/screenshots/Area/multiple-series-highlight-on-hover-dark-240w.webp index 5faf14f7db..48816015be 100644 Binary files a/docs/static/screenshots/Area/multiple-series-highlight-on-hover-dark-240w.webp and b/docs/static/screenshots/Area/multiple-series-highlight-on-hover-dark-240w.webp differ diff --git a/docs/static/screenshots/Area/multiple-series-highlight-on-hover-dark-400w.webp b/docs/static/screenshots/Area/multiple-series-highlight-on-hover-dark-400w.webp index 79146b0cf5..43f06a1745 100644 Binary files a/docs/static/screenshots/Area/multiple-series-highlight-on-hover-dark-400w.webp and b/docs/static/screenshots/Area/multiple-series-highlight-on-hover-dark-400w.webp differ diff --git a/docs/static/screenshots/Area/multiple-series-highlight-on-hover-dark-800w.webp b/docs/static/screenshots/Area/multiple-series-highlight-on-hover-dark-800w.webp index 8f9875c5af..d0240cb6c6 100644 Binary files a/docs/static/screenshots/Area/multiple-series-highlight-on-hover-dark-800w.webp and b/docs/static/screenshots/Area/multiple-series-highlight-on-hover-dark-800w.webp differ diff --git a/docs/static/screenshots/Area/multiple-series-highlight-on-hover-light-240w.webp b/docs/static/screenshots/Area/multiple-series-highlight-on-hover-light-240w.webp index a6a107305e..1677ea3db8 100644 Binary files a/docs/static/screenshots/Area/multiple-series-highlight-on-hover-light-240w.webp and b/docs/static/screenshots/Area/multiple-series-highlight-on-hover-light-240w.webp differ diff --git a/docs/static/screenshots/Area/multiple-series-highlight-on-hover-light-400w.webp b/docs/static/screenshots/Area/multiple-series-highlight-on-hover-light-400w.webp index 71d343606e..48c527ec71 100644 Binary files a/docs/static/screenshots/Area/multiple-series-highlight-on-hover-light-400w.webp and b/docs/static/screenshots/Area/multiple-series-highlight-on-hover-light-400w.webp differ diff --git a/docs/static/screenshots/Area/multiple-series-highlight-on-hover-light-800w.webp b/docs/static/screenshots/Area/multiple-series-highlight-on-hover-light-800w.webp index cc8c3993f6..30f8ee6c63 100644 Binary files a/docs/static/screenshots/Area/multiple-series-highlight-on-hover-light-800w.webp and b/docs/static/screenshots/Area/multiple-series-highlight-on-hover-light-800w.webp differ diff --git a/docs/static/screenshots/Area/multiple-series-light-240w.webp b/docs/static/screenshots/Area/multiple-series-light-240w.webp index 56927a8ff1..5592e1cb0d 100644 Binary files a/docs/static/screenshots/Area/multiple-series-light-240w.webp and b/docs/static/screenshots/Area/multiple-series-light-240w.webp differ diff --git a/docs/static/screenshots/Area/multiple-series-light-400w.webp b/docs/static/screenshots/Area/multiple-series-light-400w.webp index a301c32c71..9d262dc89d 100644 Binary files a/docs/static/screenshots/Area/multiple-series-light-400w.webp and b/docs/static/screenshots/Area/multiple-series-light-400w.webp differ diff --git a/docs/static/screenshots/Area/multiple-series-light-800w.webp b/docs/static/screenshots/Area/multiple-series-light-800w.webp index e9e6be8299..60ed97ccfa 100644 Binary files a/docs/static/screenshots/Area/multiple-series-light-800w.webp and b/docs/static/screenshots/Area/multiple-series-light-800w.webp differ diff --git a/docs/static/screenshots/Area/multiple-series-using-overrides-dark-240w.webp b/docs/static/screenshots/Area/multiple-series-using-overrides-dark-240w.webp index d72c2d29b6..87b7b641fb 100644 Binary files a/docs/static/screenshots/Area/multiple-series-using-overrides-dark-240w.webp and b/docs/static/screenshots/Area/multiple-series-using-overrides-dark-240w.webp differ diff --git a/docs/static/screenshots/Area/multiple-series-using-overrides-dark-400w.webp b/docs/static/screenshots/Area/multiple-series-using-overrides-dark-400w.webp index 9230e2082f..7eb981db90 100644 Binary files a/docs/static/screenshots/Area/multiple-series-using-overrides-dark-400w.webp and b/docs/static/screenshots/Area/multiple-series-using-overrides-dark-400w.webp differ diff --git a/docs/static/screenshots/Area/multiple-series-using-overrides-dark-800w.webp b/docs/static/screenshots/Area/multiple-series-using-overrides-dark-800w.webp index 3aef56e016..44362be25f 100644 Binary files a/docs/static/screenshots/Area/multiple-series-using-overrides-dark-800w.webp and b/docs/static/screenshots/Area/multiple-series-using-overrides-dark-800w.webp differ diff --git a/docs/static/screenshots/Area/multiple-series-using-overrides-light-240w.webp b/docs/static/screenshots/Area/multiple-series-using-overrides-light-240w.webp index 1b7335f49e..c98f5936db 100644 Binary files a/docs/static/screenshots/Area/multiple-series-using-overrides-light-240w.webp and b/docs/static/screenshots/Area/multiple-series-using-overrides-light-240w.webp differ diff --git a/docs/static/screenshots/Area/multiple-series-using-overrides-light-400w.webp b/docs/static/screenshots/Area/multiple-series-using-overrides-light-400w.webp index e7f2ce4812..467d5b198c 100644 Binary files a/docs/static/screenshots/Area/multiple-series-using-overrides-light-400w.webp and b/docs/static/screenshots/Area/multiple-series-using-overrides-light-400w.webp differ diff --git a/docs/static/screenshots/Area/multiple-series-using-overrides-light-800w.webp b/docs/static/screenshots/Area/multiple-series-using-overrides-light-800w.webp index 9405a211b3..5051ecfa92 100644 Binary files a/docs/static/screenshots/Area/multiple-series-using-overrides-light-800w.webp and b/docs/static/screenshots/Area/multiple-series-using-overrides-light-800w.webp differ diff --git a/docs/static/screenshots/Area/multiple-series-with-labels-dark-240w.webp b/docs/static/screenshots/Area/multiple-series-with-labels-dark-240w.webp index bae2323565..02bd7e9e21 100644 Binary files a/docs/static/screenshots/Area/multiple-series-with-labels-dark-240w.webp and b/docs/static/screenshots/Area/multiple-series-with-labels-dark-240w.webp differ diff --git a/docs/static/screenshots/Area/multiple-series-with-labels-dark-400w.webp b/docs/static/screenshots/Area/multiple-series-with-labels-dark-400w.webp index 8c399c97a9..1d64738f64 100644 Binary files a/docs/static/screenshots/Area/multiple-series-with-labels-dark-400w.webp and b/docs/static/screenshots/Area/multiple-series-with-labels-dark-400w.webp differ diff --git a/docs/static/screenshots/Area/multiple-series-with-labels-dark-800w.webp b/docs/static/screenshots/Area/multiple-series-with-labels-dark-800w.webp index dfb82b22e0..539867cfc0 100644 Binary files a/docs/static/screenshots/Area/multiple-series-with-labels-dark-800w.webp and b/docs/static/screenshots/Area/multiple-series-with-labels-dark-800w.webp differ diff --git a/docs/static/screenshots/Area/multiple-series-with-labels-light-240w.webp b/docs/static/screenshots/Area/multiple-series-with-labels-light-240w.webp index e7202c6bb1..d0ccc8e8b7 100644 Binary files a/docs/static/screenshots/Area/multiple-series-with-labels-light-240w.webp and b/docs/static/screenshots/Area/multiple-series-with-labels-light-240w.webp differ diff --git a/docs/static/screenshots/Area/multiple-series-with-labels-light-400w.webp b/docs/static/screenshots/Area/multiple-series-with-labels-light-400w.webp index b33bb4f738..af749d62b5 100644 Binary files a/docs/static/screenshots/Area/multiple-series-with-labels-light-400w.webp and b/docs/static/screenshots/Area/multiple-series-with-labels-light-400w.webp differ diff --git a/docs/static/screenshots/Area/multiple-series-with-labels-light-800w.webp b/docs/static/screenshots/Area/multiple-series-with-labels-light-800w.webp index 590147e868..3f227bfb0b 100644 Binary files a/docs/static/screenshots/Area/multiple-series-with-labels-light-800w.webp and b/docs/static/screenshots/Area/multiple-series-with-labels-light-800w.webp differ diff --git a/docs/static/screenshots/Area/oscilloscope-ridgeline-dark-240w.webp b/docs/static/screenshots/Area/oscilloscope-ridgeline-dark-240w.webp index 13081334d9..26754643b4 100644 Binary files a/docs/static/screenshots/Area/oscilloscope-ridgeline-dark-240w.webp and b/docs/static/screenshots/Area/oscilloscope-ridgeline-dark-240w.webp differ diff --git a/docs/static/screenshots/Area/oscilloscope-ridgeline-dark-400w.webp b/docs/static/screenshots/Area/oscilloscope-ridgeline-dark-400w.webp index c1731d71f6..628e0d55dd 100644 Binary files a/docs/static/screenshots/Area/oscilloscope-ridgeline-dark-400w.webp and b/docs/static/screenshots/Area/oscilloscope-ridgeline-dark-400w.webp differ diff --git a/docs/static/screenshots/Area/oscilloscope-ridgeline-dark-800w.webp b/docs/static/screenshots/Area/oscilloscope-ridgeline-dark-800w.webp index 193eb4f07c..51a4457a3e 100644 Binary files a/docs/static/screenshots/Area/oscilloscope-ridgeline-dark-800w.webp and b/docs/static/screenshots/Area/oscilloscope-ridgeline-dark-800w.webp differ diff --git a/docs/static/screenshots/Area/oscilloscope-ridgeline-light-240w.webp b/docs/static/screenshots/Area/oscilloscope-ridgeline-light-240w.webp index 90d8785476..a68648e0f8 100644 Binary files a/docs/static/screenshots/Area/oscilloscope-ridgeline-light-240w.webp and b/docs/static/screenshots/Area/oscilloscope-ridgeline-light-240w.webp differ diff --git a/docs/static/screenshots/Area/oscilloscope-ridgeline-light-400w.webp b/docs/static/screenshots/Area/oscilloscope-ridgeline-light-400w.webp index b0550f22e6..14f8c38eee 100644 Binary files a/docs/static/screenshots/Area/oscilloscope-ridgeline-light-400w.webp and b/docs/static/screenshots/Area/oscilloscope-ridgeline-light-400w.webp differ diff --git a/docs/static/screenshots/Area/oscilloscope-ridgeline-light-800w.webp b/docs/static/screenshots/Area/oscilloscope-ridgeline-light-800w.webp index 7def10afaa..0bd521f932 100644 Binary files a/docs/static/screenshots/Area/oscilloscope-ridgeline-light-800w.webp and b/docs/static/screenshots/Area/oscilloscope-ridgeline-light-800w.webp differ diff --git a/docs/static/screenshots/Area/playground-light-800w.webp b/docs/static/screenshots/Area/playground-light-800w.webp index c9da91e69b..5ef246b841 100644 Binary files a/docs/static/screenshots/Area/playground-light-800w.webp and b/docs/static/screenshots/Area/playground-light-800w.webp differ diff --git a/docs/static/screenshots/Area/ridgeline-dark-240w.webp b/docs/static/screenshots/Area/ridgeline-dark-240w.webp index b60a7a3b6e..ff1c32795b 100644 Binary files a/docs/static/screenshots/Area/ridgeline-dark-240w.webp and b/docs/static/screenshots/Area/ridgeline-dark-240w.webp differ diff --git a/docs/static/screenshots/Area/ridgeline-dark-400w.webp b/docs/static/screenshots/Area/ridgeline-dark-400w.webp index 79095a0b7f..f10224af13 100644 Binary files a/docs/static/screenshots/Area/ridgeline-dark-400w.webp and b/docs/static/screenshots/Area/ridgeline-dark-400w.webp differ diff --git a/docs/static/screenshots/Area/ridgeline-dark-800w.webp b/docs/static/screenshots/Area/ridgeline-dark-800w.webp index e28f4bb97f..d2a1e23ba8 100644 Binary files a/docs/static/screenshots/Area/ridgeline-dark-800w.webp and b/docs/static/screenshots/Area/ridgeline-dark-800w.webp differ diff --git a/docs/static/screenshots/Area/ridgeline-kde-dark-240w.webp b/docs/static/screenshots/Area/ridgeline-kde-dark-240w.webp index 954385b7fa..1d5de67727 100644 Binary files a/docs/static/screenshots/Area/ridgeline-kde-dark-240w.webp and b/docs/static/screenshots/Area/ridgeline-kde-dark-240w.webp differ diff --git a/docs/static/screenshots/Area/ridgeline-kde-dark-400w.webp b/docs/static/screenshots/Area/ridgeline-kde-dark-400w.webp index 969ae5c024..92a8e58976 100644 Binary files a/docs/static/screenshots/Area/ridgeline-kde-dark-400w.webp and b/docs/static/screenshots/Area/ridgeline-kde-dark-400w.webp differ diff --git a/docs/static/screenshots/Area/ridgeline-kde-dark-800w.webp b/docs/static/screenshots/Area/ridgeline-kde-dark-800w.webp index 147f0c4905..5d6bf3ab13 100644 Binary files a/docs/static/screenshots/Area/ridgeline-kde-dark-800w.webp and b/docs/static/screenshots/Area/ridgeline-kde-dark-800w.webp differ diff --git a/docs/static/screenshots/Area/ridgeline-kde-light-240w.webp b/docs/static/screenshots/Area/ridgeline-kde-light-240w.webp index bb4d65467f..5147b20242 100644 Binary files a/docs/static/screenshots/Area/ridgeline-kde-light-240w.webp and b/docs/static/screenshots/Area/ridgeline-kde-light-240w.webp differ diff --git a/docs/static/screenshots/Area/ridgeline-kde-light-400w.webp b/docs/static/screenshots/Area/ridgeline-kde-light-400w.webp index 9c77a396e5..49411cb714 100644 Binary files a/docs/static/screenshots/Area/ridgeline-kde-light-400w.webp and b/docs/static/screenshots/Area/ridgeline-kde-light-400w.webp differ diff --git a/docs/static/screenshots/Area/ridgeline-kde-light-800w.webp b/docs/static/screenshots/Area/ridgeline-kde-light-800w.webp index 2f4a6b27ad..1724f75262 100644 Binary files a/docs/static/screenshots/Area/ridgeline-kde-light-800w.webp and b/docs/static/screenshots/Area/ridgeline-kde-light-800w.webp differ diff --git a/docs/static/screenshots/Area/ridgeline-light-240w.webp b/docs/static/screenshots/Area/ridgeline-light-240w.webp index b9c5b545de..4cc2e3c476 100644 Binary files a/docs/static/screenshots/Area/ridgeline-light-240w.webp and b/docs/static/screenshots/Area/ridgeline-light-240w.webp differ diff --git a/docs/static/screenshots/Area/ridgeline-light-400w.webp b/docs/static/screenshots/Area/ridgeline-light-400w.webp index 5d8fe85120..4df23cfd94 100644 Binary files a/docs/static/screenshots/Area/ridgeline-light-400w.webp and b/docs/static/screenshots/Area/ridgeline-light-400w.webp differ diff --git a/docs/static/screenshots/Area/ridgeline-light-800w.webp b/docs/static/screenshots/Area/ridgeline-light-800w.webp index f6c4b3ed6b..791dfea765 100644 Binary files a/docs/static/screenshots/Area/ridgeline-light-800w.webp and b/docs/static/screenshots/Area/ridgeline-light-800w.webp differ diff --git a/docs/static/screenshots/Area/stack-dark-240w.webp b/docs/static/screenshots/Area/stack-dark-240w.webp index 909ecf7c99..6d07963e75 100644 Binary files a/docs/static/screenshots/Area/stack-dark-240w.webp and b/docs/static/screenshots/Area/stack-dark-240w.webp differ diff --git a/docs/static/screenshots/Area/stack-dark-400w.webp b/docs/static/screenshots/Area/stack-dark-400w.webp index 6120d7f831..26a8967c80 100644 Binary files a/docs/static/screenshots/Area/stack-dark-400w.webp and b/docs/static/screenshots/Area/stack-dark-400w.webp differ diff --git a/docs/static/screenshots/Area/stack-dark-800w.webp b/docs/static/screenshots/Area/stack-dark-800w.webp index 2701f470c5..3ed6e3562a 100644 Binary files a/docs/static/screenshots/Area/stack-dark-800w.webp and b/docs/static/screenshots/Area/stack-dark-800w.webp differ diff --git a/docs/static/screenshots/Area/stack-light-240w.webp b/docs/static/screenshots/Area/stack-light-240w.webp index 3dfab5ae7c..15ec7600b7 100644 Binary files a/docs/static/screenshots/Area/stack-light-240w.webp and b/docs/static/screenshots/Area/stack-light-240w.webp differ diff --git a/docs/static/screenshots/Area/stack-light-400w.webp b/docs/static/screenshots/Area/stack-light-400w.webp index a6f8671e9e..103269b959 100644 Binary files a/docs/static/screenshots/Area/stack-light-400w.webp and b/docs/static/screenshots/Area/stack-light-400w.webp differ diff --git a/docs/static/screenshots/Area/stack-light-800w.webp b/docs/static/screenshots/Area/stack-light-800w.webp index 7beb2ba230..5a1fbcdb2d 100644 Binary files a/docs/static/screenshots/Area/stack-light-800w.webp and b/docs/static/screenshots/Area/stack-light-800w.webp differ diff --git a/docs/static/screenshots/Area/stack-with-gradient-dark-240w.webp b/docs/static/screenshots/Area/stack-with-gradient-dark-240w.webp index e97092c75e..1f2ce7df58 100644 Binary files a/docs/static/screenshots/Area/stack-with-gradient-dark-240w.webp and b/docs/static/screenshots/Area/stack-with-gradient-dark-240w.webp differ diff --git a/docs/static/screenshots/Area/stack-with-gradient-dark-400w.webp b/docs/static/screenshots/Area/stack-with-gradient-dark-400w.webp index 3fb7cca773..b99dd33721 100644 Binary files a/docs/static/screenshots/Area/stack-with-gradient-dark-400w.webp and b/docs/static/screenshots/Area/stack-with-gradient-dark-400w.webp differ diff --git a/docs/static/screenshots/Area/stack-with-gradient-dark-800w.webp b/docs/static/screenshots/Area/stack-with-gradient-dark-800w.webp index 3eb96fa2bf..e7b4e2be8c 100644 Binary files a/docs/static/screenshots/Area/stack-with-gradient-dark-800w.webp and b/docs/static/screenshots/Area/stack-with-gradient-dark-800w.webp differ diff --git a/docs/static/screenshots/Area/stack-with-gradient-light-240w.webp b/docs/static/screenshots/Area/stack-with-gradient-light-240w.webp index 12c8210e4a..9a3b63d327 100644 Binary files a/docs/static/screenshots/Area/stack-with-gradient-light-240w.webp and b/docs/static/screenshots/Area/stack-with-gradient-light-240w.webp differ diff --git a/docs/static/screenshots/Area/stack-with-gradient-light-400w.webp b/docs/static/screenshots/Area/stack-with-gradient-light-400w.webp index 6bab3ec50d..4612d137ab 100644 Binary files a/docs/static/screenshots/Area/stack-with-gradient-light-400w.webp and b/docs/static/screenshots/Area/stack-with-gradient-light-400w.webp differ diff --git a/docs/static/screenshots/Area/stack-with-gradient-light-800w.webp b/docs/static/screenshots/Area/stack-with-gradient-light-800w.webp index 082e6e11f7..2bc65dd230 100644 Binary files a/docs/static/screenshots/Area/stack-with-gradient-light-800w.webp and b/docs/static/screenshots/Area/stack-with-gradient-light-800w.webp differ diff --git a/docs/static/screenshots/Area/threshold-with-lineargradient-dark-240w.webp b/docs/static/screenshots/Area/threshold-with-lineargradient-dark-240w.webp index 07c19da12f..87465ed09f 100644 Binary files a/docs/static/screenshots/Area/threshold-with-lineargradient-dark-240w.webp and b/docs/static/screenshots/Area/threshold-with-lineargradient-dark-240w.webp differ diff --git a/docs/static/screenshots/Area/threshold-with-lineargradient-dark-400w.webp b/docs/static/screenshots/Area/threshold-with-lineargradient-dark-400w.webp index e44739f4cb..ced527b43b 100644 Binary files a/docs/static/screenshots/Area/threshold-with-lineargradient-dark-400w.webp and b/docs/static/screenshots/Area/threshold-with-lineargradient-dark-400w.webp differ diff --git a/docs/static/screenshots/Area/threshold-with-lineargradient-dark-800w.webp b/docs/static/screenshots/Area/threshold-with-lineargradient-dark-800w.webp index a5f560f2f7..33d8b0f47c 100644 Binary files a/docs/static/screenshots/Area/threshold-with-lineargradient-dark-800w.webp and b/docs/static/screenshots/Area/threshold-with-lineargradient-dark-800w.webp differ diff --git a/docs/static/screenshots/Area/threshold-with-lineargradient-light-240w.webp b/docs/static/screenshots/Area/threshold-with-lineargradient-light-240w.webp index 54951c3ea2..473d6b12ab 100644 Binary files a/docs/static/screenshots/Area/threshold-with-lineargradient-light-240w.webp and b/docs/static/screenshots/Area/threshold-with-lineargradient-light-240w.webp differ diff --git a/docs/static/screenshots/Area/threshold-with-lineargradient-light-400w.webp b/docs/static/screenshots/Area/threshold-with-lineargradient-light-400w.webp index a2681ba8a6..9029e4e859 100644 Binary files a/docs/static/screenshots/Area/threshold-with-lineargradient-light-400w.webp and b/docs/static/screenshots/Area/threshold-with-lineargradient-light-400w.webp differ diff --git a/docs/static/screenshots/Area/threshold-with-lineargradient-light-800w.webp b/docs/static/screenshots/Area/threshold-with-lineargradient-light-800w.webp index 0a4f3aafb4..0dfe107cfe 100644 Binary files a/docs/static/screenshots/Area/threshold-with-lineargradient-light-800w.webp and b/docs/static/screenshots/Area/threshold-with-lineargradient-light-800w.webp differ diff --git a/docs/static/screenshots/Area/threshold-with-lineargradient-over-under-dark-240w.webp b/docs/static/screenshots/Area/threshold-with-lineargradient-over-under-dark-240w.webp index 1b49e36d66..b9141e0285 100644 Binary files a/docs/static/screenshots/Area/threshold-with-lineargradient-over-under-dark-240w.webp and b/docs/static/screenshots/Area/threshold-with-lineargradient-over-under-dark-240w.webp differ diff --git a/docs/static/screenshots/Area/threshold-with-lineargradient-over-under-dark-400w.webp b/docs/static/screenshots/Area/threshold-with-lineargradient-over-under-dark-400w.webp index c35d3342aa..bdc2c4522d 100644 Binary files a/docs/static/screenshots/Area/threshold-with-lineargradient-over-under-dark-400w.webp and b/docs/static/screenshots/Area/threshold-with-lineargradient-over-under-dark-400w.webp differ diff --git a/docs/static/screenshots/Area/threshold-with-lineargradient-over-under-dark-800w.webp b/docs/static/screenshots/Area/threshold-with-lineargradient-over-under-dark-800w.webp index e958a14bdb..dcb26015ef 100644 Binary files a/docs/static/screenshots/Area/threshold-with-lineargradient-over-under-dark-800w.webp and b/docs/static/screenshots/Area/threshold-with-lineargradient-over-under-dark-800w.webp differ diff --git a/docs/static/screenshots/Area/threshold-with-lineargradient-over-under-light-240w.webp b/docs/static/screenshots/Area/threshold-with-lineargradient-over-under-light-240w.webp index 6f01c432de..37ed8b9907 100644 Binary files a/docs/static/screenshots/Area/threshold-with-lineargradient-over-under-light-240w.webp and b/docs/static/screenshots/Area/threshold-with-lineargradient-over-under-light-240w.webp differ diff --git a/docs/static/screenshots/Area/threshold-with-lineargradient-over-under-light-400w.webp b/docs/static/screenshots/Area/threshold-with-lineargradient-over-under-light-400w.webp index 932b82456d..3ec40d8504 100644 Binary files a/docs/static/screenshots/Area/threshold-with-lineargradient-over-under-light-400w.webp and b/docs/static/screenshots/Area/threshold-with-lineargradient-over-under-light-400w.webp differ diff --git a/docs/static/screenshots/Area/threshold-with-lineargradient-over-under-light-800w.webp b/docs/static/screenshots/Area/threshold-with-lineargradient-over-under-light-800w.webp index 965bef735d..36ac7728bb 100644 Binary files a/docs/static/screenshots/Area/threshold-with-lineargradient-over-under-light-800w.webp and b/docs/static/screenshots/Area/threshold-with-lineargradient-over-under-light-800w.webp differ diff --git a/docs/static/screenshots/Area/threshold-with-rectclippath-dark-240w.webp b/docs/static/screenshots/Area/threshold-with-rectclippath-dark-240w.webp index c284e05ed5..56e53d1e93 100644 Binary files a/docs/static/screenshots/Area/threshold-with-rectclippath-dark-240w.webp and b/docs/static/screenshots/Area/threshold-with-rectclippath-dark-240w.webp differ diff --git a/docs/static/screenshots/Area/threshold-with-rectclippath-dark-400w.webp b/docs/static/screenshots/Area/threshold-with-rectclippath-dark-400w.webp index f16d0e3bbd..2c51a5f0e5 100644 Binary files a/docs/static/screenshots/Area/threshold-with-rectclippath-dark-400w.webp and b/docs/static/screenshots/Area/threshold-with-rectclippath-dark-400w.webp differ diff --git a/docs/static/screenshots/Area/threshold-with-rectclippath-dark-800w.webp b/docs/static/screenshots/Area/threshold-with-rectclippath-dark-800w.webp index 56df0903b8..f3584e0201 100644 Binary files a/docs/static/screenshots/Area/threshold-with-rectclippath-dark-800w.webp and b/docs/static/screenshots/Area/threshold-with-rectclippath-dark-800w.webp differ diff --git a/docs/static/screenshots/Area/threshold-with-rectclippath-light-240w.webp b/docs/static/screenshots/Area/threshold-with-rectclippath-light-240w.webp index 6c3acf35b9..e75f20017a 100644 Binary files a/docs/static/screenshots/Area/threshold-with-rectclippath-light-240w.webp and b/docs/static/screenshots/Area/threshold-with-rectclippath-light-240w.webp differ diff --git a/docs/static/screenshots/Area/threshold-with-rectclippath-light-400w.webp b/docs/static/screenshots/Area/threshold-with-rectclippath-light-400w.webp index 8231a9b87e..ca1475a04d 100644 Binary files a/docs/static/screenshots/Area/threshold-with-rectclippath-light-400w.webp and b/docs/static/screenshots/Area/threshold-with-rectclippath-light-400w.webp differ diff --git a/docs/static/screenshots/Area/threshold-with-rectclippath-light-800w.webp b/docs/static/screenshots/Area/threshold-with-rectclippath-light-800w.webp index 4fb4b83b67..28bbbbcabb 100644 Binary files a/docs/static/screenshots/Area/threshold-with-rectclippath-light-800w.webp and b/docs/static/screenshots/Area/threshold-with-rectclippath-light-800w.webp differ diff --git a/docs/static/screenshots/Area/threshold-with-rectclippath-over-under-dark-240w.webp b/docs/static/screenshots/Area/threshold-with-rectclippath-over-under-dark-240w.webp index 26f9437bb1..f3713d3f04 100644 Binary files a/docs/static/screenshots/Area/threshold-with-rectclippath-over-under-dark-240w.webp and b/docs/static/screenshots/Area/threshold-with-rectclippath-over-under-dark-240w.webp differ diff --git a/docs/static/screenshots/Area/threshold-with-rectclippath-over-under-dark-400w.webp b/docs/static/screenshots/Area/threshold-with-rectclippath-over-under-dark-400w.webp index 469e57532c..478da8a4e0 100644 Binary files a/docs/static/screenshots/Area/threshold-with-rectclippath-over-under-dark-400w.webp and b/docs/static/screenshots/Area/threshold-with-rectclippath-over-under-dark-400w.webp differ diff --git a/docs/static/screenshots/Area/threshold-with-rectclippath-over-under-dark-800w.webp b/docs/static/screenshots/Area/threshold-with-rectclippath-over-under-dark-800w.webp index 9a0e5efa8f..1e91eb039a 100644 Binary files a/docs/static/screenshots/Area/threshold-with-rectclippath-over-under-dark-800w.webp and b/docs/static/screenshots/Area/threshold-with-rectclippath-over-under-dark-800w.webp differ diff --git a/docs/static/screenshots/Area/threshold-with-rectclippath-over-under-light-240w.webp b/docs/static/screenshots/Area/threshold-with-rectclippath-over-under-light-240w.webp index cd7dcd0016..cda633f4c0 100644 Binary files a/docs/static/screenshots/Area/threshold-with-rectclippath-over-under-light-240w.webp and b/docs/static/screenshots/Area/threshold-with-rectclippath-over-under-light-240w.webp differ diff --git a/docs/static/screenshots/Area/threshold-with-rectclippath-over-under-light-400w.webp b/docs/static/screenshots/Area/threshold-with-rectclippath-over-under-light-400w.webp index 72abf47f9e..9fcad3bb16 100644 Binary files a/docs/static/screenshots/Area/threshold-with-rectclippath-over-under-light-400w.webp and b/docs/static/screenshots/Area/threshold-with-rectclippath-over-under-light-400w.webp differ diff --git a/docs/static/screenshots/Area/threshold-with-rectclippath-over-under-light-800w.webp b/docs/static/screenshots/Area/threshold-with-rectclippath-over-under-light-800w.webp index b456dabf7c..38b920f988 100644 Binary files a/docs/static/screenshots/Area/threshold-with-rectclippath-over-under-light-800w.webp and b/docs/static/screenshots/Area/threshold-with-rectclippath-over-under-light-800w.webp differ diff --git a/docs/static/screenshots/Area/tween-on-mount-dark-240w.webp b/docs/static/screenshots/Area/tween-on-mount-dark-240w.webp index 3e4f63778e..ca056715b6 100644 Binary files a/docs/static/screenshots/Area/tween-on-mount-dark-240w.webp and b/docs/static/screenshots/Area/tween-on-mount-dark-240w.webp differ diff --git a/docs/static/screenshots/Area/tween-on-mount-dark-400w.webp b/docs/static/screenshots/Area/tween-on-mount-dark-400w.webp index c5213b0db1..55865e54dd 100644 Binary files a/docs/static/screenshots/Area/tween-on-mount-dark-400w.webp and b/docs/static/screenshots/Area/tween-on-mount-dark-400w.webp differ diff --git a/docs/static/screenshots/Area/tween-on-mount-dark-800w.webp b/docs/static/screenshots/Area/tween-on-mount-dark-800w.webp index d8f2e61a64..2ad9326381 100644 Binary files a/docs/static/screenshots/Area/tween-on-mount-dark-800w.webp and b/docs/static/screenshots/Area/tween-on-mount-dark-800w.webp differ diff --git a/docs/static/screenshots/Area/tween-on-mount-light-240w.webp b/docs/static/screenshots/Area/tween-on-mount-light-240w.webp index 56c5de8a64..623ac36e2f 100644 Binary files a/docs/static/screenshots/Area/tween-on-mount-light-240w.webp and b/docs/static/screenshots/Area/tween-on-mount-light-240w.webp differ diff --git a/docs/static/screenshots/Area/tween-on-mount-light-400w.webp b/docs/static/screenshots/Area/tween-on-mount-light-400w.webp index fddc8f1586..8c9ad20e8c 100644 Binary files a/docs/static/screenshots/Area/tween-on-mount-light-400w.webp and b/docs/static/screenshots/Area/tween-on-mount-light-400w.webp differ diff --git a/docs/static/screenshots/Area/tween-on-mount-light-800w.webp b/docs/static/screenshots/Area/tween-on-mount-light-800w.webp index 230b3cc96d..9b8630bd33 100644 Binary files a/docs/static/screenshots/Area/tween-on-mount-light-800w.webp and b/docs/static/screenshots/Area/tween-on-mount-light-800w.webp differ diff --git a/docs/static/screenshots/Area/with-labels-dark-240w.webp b/docs/static/screenshots/Area/with-labels-dark-240w.webp index 65fd7ef4dc..87c21d9392 100644 Binary files a/docs/static/screenshots/Area/with-labels-dark-240w.webp and b/docs/static/screenshots/Area/with-labels-dark-240w.webp differ diff --git a/docs/static/screenshots/Area/with-labels-dark-400w.webp b/docs/static/screenshots/Area/with-labels-dark-400w.webp index b135963a95..9b27fc1f8e 100644 Binary files a/docs/static/screenshots/Area/with-labels-dark-400w.webp and b/docs/static/screenshots/Area/with-labels-dark-400w.webp differ diff --git a/docs/static/screenshots/Area/with-labels-dark-800w.webp b/docs/static/screenshots/Area/with-labels-dark-800w.webp index 11c5243cbf..d4f39b589e 100644 Binary files a/docs/static/screenshots/Area/with-labels-dark-800w.webp and b/docs/static/screenshots/Area/with-labels-dark-800w.webp differ diff --git a/docs/static/screenshots/Area/with-labels-light-240w.webp b/docs/static/screenshots/Area/with-labels-light-240w.webp index df10b2e8b8..0e5bdf2cbc 100644 Binary files a/docs/static/screenshots/Area/with-labels-light-240w.webp and b/docs/static/screenshots/Area/with-labels-light-240w.webp differ diff --git a/docs/static/screenshots/Area/with-labels-light-400w.webp b/docs/static/screenshots/Area/with-labels-light-400w.webp index e9e691273f..0d2b5fae0f 100644 Binary files a/docs/static/screenshots/Area/with-labels-light-400w.webp and b/docs/static/screenshots/Area/with-labels-light-400w.webp differ diff --git a/docs/static/screenshots/Area/with-labels-light-800w.webp b/docs/static/screenshots/Area/with-labels-light-800w.webp index ff7e82fab1..5fc257ad6a 100644 Binary files a/docs/static/screenshots/Area/with-labels-light-800w.webp and b/docs/static/screenshots/Area/with-labels-light-800w.webp differ diff --git a/docs/static/screenshots/Area/with-tooltip-and-highlight-dark-240w.webp b/docs/static/screenshots/Area/with-tooltip-and-highlight-dark-240w.webp index c15515c269..c5334d87da 100644 Binary files a/docs/static/screenshots/Area/with-tooltip-and-highlight-dark-240w.webp and b/docs/static/screenshots/Area/with-tooltip-and-highlight-dark-240w.webp differ diff --git a/docs/static/screenshots/Area/with-tooltip-and-highlight-dark-400w.webp b/docs/static/screenshots/Area/with-tooltip-and-highlight-dark-400w.webp index 61b7fe1a90..6dac30c97c 100644 Binary files a/docs/static/screenshots/Area/with-tooltip-and-highlight-dark-400w.webp and b/docs/static/screenshots/Area/with-tooltip-and-highlight-dark-400w.webp differ diff --git a/docs/static/screenshots/Area/with-tooltip-and-highlight-dark-800w.webp b/docs/static/screenshots/Area/with-tooltip-and-highlight-dark-800w.webp index 1d3fd4abc1..9ce436cb46 100644 Binary files a/docs/static/screenshots/Area/with-tooltip-and-highlight-dark-800w.webp and b/docs/static/screenshots/Area/with-tooltip-and-highlight-dark-800w.webp differ diff --git a/docs/static/screenshots/Area/with-tooltip-and-highlight-light-240w.webp b/docs/static/screenshots/Area/with-tooltip-and-highlight-light-240w.webp index c5094d7731..4578ae9e9f 100644 Binary files a/docs/static/screenshots/Area/with-tooltip-and-highlight-light-240w.webp and b/docs/static/screenshots/Area/with-tooltip-and-highlight-light-240w.webp differ diff --git a/docs/static/screenshots/Area/with-tooltip-and-highlight-light-400w.webp b/docs/static/screenshots/Area/with-tooltip-and-highlight-light-400w.webp index 0c6569d407..7bb493406a 100644 Binary files a/docs/static/screenshots/Area/with-tooltip-and-highlight-light-400w.webp and b/docs/static/screenshots/Area/with-tooltip-and-highlight-light-400w.webp differ diff --git a/docs/static/screenshots/Area/with-tooltip-and-highlight-light-800w.webp b/docs/static/screenshots/Area/with-tooltip-and-highlight-light-800w.webp index 3d51c55374..aa7fcf360e 100644 Binary files a/docs/static/screenshots/Area/with-tooltip-and-highlight-light-800w.webp and b/docs/static/screenshots/Area/with-tooltip-and-highlight-light-800w.webp differ diff --git a/docs/static/screenshots/AreaChart/all-zero-dark-400w.webp b/docs/static/screenshots/AreaChart/all-zero-dark-400w.webp index 99f4cbb399..bc35e1194a 100644 Binary files a/docs/static/screenshots/AreaChart/all-zero-dark-400w.webp and b/docs/static/screenshots/AreaChart/all-zero-dark-400w.webp differ diff --git a/docs/static/screenshots/AreaChart/all-zero-dark-800w.webp b/docs/static/screenshots/AreaChart/all-zero-dark-800w.webp index e1ae26b7b8..d57232ed0b 100644 Binary files a/docs/static/screenshots/AreaChart/all-zero-dark-800w.webp and b/docs/static/screenshots/AreaChart/all-zero-dark-800w.webp differ diff --git a/docs/static/screenshots/AreaChart/all-zero-light-240w.webp b/docs/static/screenshots/AreaChart/all-zero-light-240w.webp index b7a4f56acb..eb4ff6d53b 100644 Binary files a/docs/static/screenshots/AreaChart/all-zero-light-240w.webp and b/docs/static/screenshots/AreaChart/all-zero-light-240w.webp differ diff --git a/docs/static/screenshots/AreaChart/all-zero-light-400w.webp b/docs/static/screenshots/AreaChart/all-zero-light-400w.webp index 956f6d09ff..2f6b09dea9 100644 Binary files a/docs/static/screenshots/AreaChart/all-zero-light-400w.webp and b/docs/static/screenshots/AreaChart/all-zero-light-400w.webp differ diff --git a/docs/static/screenshots/AreaChart/all-zero-light-800w.webp b/docs/static/screenshots/AreaChart/all-zero-light-800w.webp index 57ec4323f6..a0007062a6 100644 Binary files a/docs/static/screenshots/AreaChart/all-zero-light-800w.webp and b/docs/static/screenshots/AreaChart/all-zero-light-800w.webp differ diff --git a/docs/static/screenshots/AreaChart/band-scale-light-800w.webp b/docs/static/screenshots/AreaChart/band-scale-light-800w.webp index 4fe9c0357e..c84f78fabf 100644 Binary files a/docs/static/screenshots/AreaChart/band-scale-light-800w.webp and b/docs/static/screenshots/AreaChart/band-scale-light-800w.webp differ diff --git a/docs/static/screenshots/AreaChart/basic-dark-240w.webp b/docs/static/screenshots/AreaChart/basic-dark-240w.webp index b57218d821..f9a2ce9d09 100644 Binary files a/docs/static/screenshots/AreaChart/basic-dark-240w.webp and b/docs/static/screenshots/AreaChart/basic-dark-240w.webp differ diff --git a/docs/static/screenshots/AreaChart/basic-dark-400w.webp b/docs/static/screenshots/AreaChart/basic-dark-400w.webp index a722e26a38..03f90d9d2d 100644 Binary files a/docs/static/screenshots/AreaChart/basic-dark-400w.webp and b/docs/static/screenshots/AreaChart/basic-dark-400w.webp differ diff --git a/docs/static/screenshots/AreaChart/basic-dark-800w.webp b/docs/static/screenshots/AreaChart/basic-dark-800w.webp index 27b982978a..9ae0925e2b 100644 Binary files a/docs/static/screenshots/AreaChart/basic-dark-800w.webp and b/docs/static/screenshots/AreaChart/basic-dark-800w.webp differ diff --git a/docs/static/screenshots/AreaChart/basic-light-240w.webp b/docs/static/screenshots/AreaChart/basic-light-240w.webp index 63222f34a9..c707fc8152 100644 Binary files a/docs/static/screenshots/AreaChart/basic-light-240w.webp and b/docs/static/screenshots/AreaChart/basic-light-240w.webp differ diff --git a/docs/static/screenshots/AreaChart/basic-light-400w.webp b/docs/static/screenshots/AreaChart/basic-light-400w.webp index 11bd1410e1..d7a625dbfa 100644 Binary files a/docs/static/screenshots/AreaChart/basic-light-400w.webp and b/docs/static/screenshots/AreaChart/basic-light-400w.webp differ diff --git a/docs/static/screenshots/AreaChart/basic-light-800w.webp b/docs/static/screenshots/AreaChart/basic-light-800w.webp index adec4111d6..c20fad2d2c 100644 Binary files a/docs/static/screenshots/AreaChart/basic-light-800w.webp and b/docs/static/screenshots/AreaChart/basic-light-800w.webp differ diff --git a/docs/static/screenshots/AreaChart/brush-dark-240w.webp b/docs/static/screenshots/AreaChart/brush-dark-240w.webp index b208450e49..aa75a23f7b 100644 Binary files a/docs/static/screenshots/AreaChart/brush-dark-240w.webp and b/docs/static/screenshots/AreaChart/brush-dark-240w.webp differ diff --git a/docs/static/screenshots/AreaChart/brush-dark-800w.webp b/docs/static/screenshots/AreaChart/brush-dark-800w.webp index 81a1e0580f..ecfec6992a 100644 Binary files a/docs/static/screenshots/AreaChart/brush-dark-800w.webp and b/docs/static/screenshots/AreaChart/brush-dark-800w.webp differ diff --git a/docs/static/screenshots/AreaChart/brush-light-800w.webp b/docs/static/screenshots/AreaChart/brush-light-800w.webp index f2f19a2e38..3572ee1f14 100644 Binary files a/docs/static/screenshots/AreaChart/brush-light-800w.webp and b/docs/static/screenshots/AreaChart/brush-light-800w.webp differ diff --git a/docs/static/screenshots/AreaChart/brush-sync-dark-240w.webp b/docs/static/screenshots/AreaChart/brush-sync-dark-240w.webp index 4384fa5876..01059722ad 100644 Binary files a/docs/static/screenshots/AreaChart/brush-sync-dark-240w.webp and b/docs/static/screenshots/AreaChart/brush-sync-dark-240w.webp differ diff --git a/docs/static/screenshots/AreaChart/brush-sync-dark-400w.webp b/docs/static/screenshots/AreaChart/brush-sync-dark-400w.webp index a5d901b50f..efb6eb8d89 100644 Binary files a/docs/static/screenshots/AreaChart/brush-sync-dark-400w.webp and b/docs/static/screenshots/AreaChart/brush-sync-dark-400w.webp differ diff --git a/docs/static/screenshots/AreaChart/brush-sync-dark-800w.webp b/docs/static/screenshots/AreaChart/brush-sync-dark-800w.webp index a3fe3f17c1..e80a16b578 100644 Binary files a/docs/static/screenshots/AreaChart/brush-sync-dark-800w.webp and b/docs/static/screenshots/AreaChart/brush-sync-dark-800w.webp differ diff --git a/docs/static/screenshots/AreaChart/brush-sync-light-240w.webp b/docs/static/screenshots/AreaChart/brush-sync-light-240w.webp index 3f2a6bd7ef..cca88dd0a0 100644 Binary files a/docs/static/screenshots/AreaChart/brush-sync-light-240w.webp and b/docs/static/screenshots/AreaChart/brush-sync-light-240w.webp differ diff --git a/docs/static/screenshots/AreaChart/brush-sync-light-400w.webp b/docs/static/screenshots/AreaChart/brush-sync-light-400w.webp index fbbc76fc72..8dfd7a08ac 100644 Binary files a/docs/static/screenshots/AreaChart/brush-sync-light-400w.webp and b/docs/static/screenshots/AreaChart/brush-sync-light-400w.webp differ diff --git a/docs/static/screenshots/AreaChart/brush-sync-light-800w.webp b/docs/static/screenshots/AreaChart/brush-sync-light-800w.webp index d7af42fb15..d52f2b8973 100644 Binary files a/docs/static/screenshots/AreaChart/brush-sync-light-800w.webp and b/docs/static/screenshots/AreaChart/brush-sync-light-800w.webp differ diff --git a/docs/static/screenshots/AreaChart/curve-dark-240w.webp b/docs/static/screenshots/AreaChart/curve-dark-240w.webp index 859d1d6975..9ef827dfc3 100644 Binary files a/docs/static/screenshots/AreaChart/curve-dark-240w.webp and b/docs/static/screenshots/AreaChart/curve-dark-240w.webp differ diff --git a/docs/static/screenshots/AreaChart/curve-dark-400w.webp b/docs/static/screenshots/AreaChart/curve-dark-400w.webp index ff26dd110d..366231030e 100644 Binary files a/docs/static/screenshots/AreaChart/curve-dark-400w.webp and b/docs/static/screenshots/AreaChart/curve-dark-400w.webp differ diff --git a/docs/static/screenshots/AreaChart/curve-dark-800w.webp b/docs/static/screenshots/AreaChart/curve-dark-800w.webp index f711f5a9de..95f2f6265e 100644 Binary files a/docs/static/screenshots/AreaChart/curve-dark-800w.webp and b/docs/static/screenshots/AreaChart/curve-dark-800w.webp differ diff --git a/docs/static/screenshots/AreaChart/curve-light-240w.webp b/docs/static/screenshots/AreaChart/curve-light-240w.webp index 30bf66c072..612a8bf0d6 100644 Binary files a/docs/static/screenshots/AreaChart/curve-light-240w.webp and b/docs/static/screenshots/AreaChart/curve-light-240w.webp differ diff --git a/docs/static/screenshots/AreaChart/curve-light-400w.webp b/docs/static/screenshots/AreaChart/curve-light-400w.webp index cdff58db9f..03c039f76e 100644 Binary files a/docs/static/screenshots/AreaChart/curve-light-400w.webp and b/docs/static/screenshots/AreaChart/curve-light-400w.webp differ diff --git a/docs/static/screenshots/AreaChart/curve-light-800w.webp b/docs/static/screenshots/AreaChart/curve-light-800w.webp index b16ee8ae48..b5c72a2606 100644 Binary files a/docs/static/screenshots/AreaChart/curve-light-800w.webp and b/docs/static/screenshots/AreaChart/curve-light-800w.webp differ diff --git a/docs/static/screenshots/AreaChart/custom-dark-240w.webp b/docs/static/screenshots/AreaChart/custom-dark-240w.webp index c58170af61..0b8c373250 100644 Binary files a/docs/static/screenshots/AreaChart/custom-dark-240w.webp and b/docs/static/screenshots/AreaChart/custom-dark-240w.webp differ diff --git a/docs/static/screenshots/AreaChart/custom-dark-400w.webp b/docs/static/screenshots/AreaChart/custom-dark-400w.webp index 14d50df561..7d148d8401 100644 Binary files a/docs/static/screenshots/AreaChart/custom-dark-400w.webp and b/docs/static/screenshots/AreaChart/custom-dark-400w.webp differ diff --git a/docs/static/screenshots/AreaChart/custom-dark-800w.webp b/docs/static/screenshots/AreaChart/custom-dark-800w.webp index eb1ae2e860..fee97532c6 100644 Binary files a/docs/static/screenshots/AreaChart/custom-dark-800w.webp and b/docs/static/screenshots/AreaChart/custom-dark-800w.webp differ diff --git a/docs/static/screenshots/AreaChart/custom-light-240w.webp b/docs/static/screenshots/AreaChart/custom-light-240w.webp index c2ec6d0aa7..d7c37638a0 100644 Binary files a/docs/static/screenshots/AreaChart/custom-light-240w.webp and b/docs/static/screenshots/AreaChart/custom-light-240w.webp differ diff --git a/docs/static/screenshots/AreaChart/custom-light-400w.webp b/docs/static/screenshots/AreaChart/custom-light-400w.webp index 5461faf32b..308c94d56e 100644 Binary files a/docs/static/screenshots/AreaChart/custom-light-400w.webp and b/docs/static/screenshots/AreaChart/custom-light-400w.webp differ diff --git a/docs/static/screenshots/AreaChart/custom-light-800w.webp b/docs/static/screenshots/AreaChart/custom-light-800w.webp index daa04a8959..238576a225 100644 Binary files a/docs/static/screenshots/AreaChart/custom-light-800w.webp and b/docs/static/screenshots/AreaChart/custom-light-800w.webp differ diff --git a/docs/static/screenshots/AreaChart/custom-tooltip-dark-240w.webp b/docs/static/screenshots/AreaChart/custom-tooltip-dark-240w.webp index 6af7e9b380..379f832292 100644 Binary files a/docs/static/screenshots/AreaChart/custom-tooltip-dark-240w.webp and b/docs/static/screenshots/AreaChart/custom-tooltip-dark-240w.webp differ diff --git a/docs/static/screenshots/AreaChart/custom-tooltip-dark-400w.webp b/docs/static/screenshots/AreaChart/custom-tooltip-dark-400w.webp index 3aa689ef2f..f7a09f91e2 100644 Binary files a/docs/static/screenshots/AreaChart/custom-tooltip-dark-400w.webp and b/docs/static/screenshots/AreaChart/custom-tooltip-dark-400w.webp differ diff --git a/docs/static/screenshots/AreaChart/custom-tooltip-dark-800w.webp b/docs/static/screenshots/AreaChart/custom-tooltip-dark-800w.webp index 74ec1020b3..346e0de8b2 100644 Binary files a/docs/static/screenshots/AreaChart/custom-tooltip-dark-800w.webp and b/docs/static/screenshots/AreaChart/custom-tooltip-dark-800w.webp differ diff --git a/docs/static/screenshots/AreaChart/custom-tooltip-light-240w.webp b/docs/static/screenshots/AreaChart/custom-tooltip-light-240w.webp index 6178bc2cbd..6ca84b7bdf 100644 Binary files a/docs/static/screenshots/AreaChart/custom-tooltip-light-240w.webp and b/docs/static/screenshots/AreaChart/custom-tooltip-light-240w.webp differ diff --git a/docs/static/screenshots/AreaChart/custom-tooltip-light-400w.webp b/docs/static/screenshots/AreaChart/custom-tooltip-light-400w.webp index c32ae09adc..4feb533d0e 100644 Binary files a/docs/static/screenshots/AreaChart/custom-tooltip-light-400w.webp and b/docs/static/screenshots/AreaChart/custom-tooltip-light-400w.webp differ diff --git a/docs/static/screenshots/AreaChart/custom-tooltip-light-800w.webp b/docs/static/screenshots/AreaChart/custom-tooltip-light-800w.webp index a831205859..509a92131a 100644 Binary files a/docs/static/screenshots/AreaChart/custom-tooltip-light-800w.webp and b/docs/static/screenshots/AreaChart/custom-tooltip-light-800w.webp differ diff --git a/docs/static/screenshots/AreaChart/default-series-label-dark-240w.webp b/docs/static/screenshots/AreaChart/default-series-label-dark-240w.webp index 4da0688622..d210198fe4 100644 Binary files a/docs/static/screenshots/AreaChart/default-series-label-dark-240w.webp and b/docs/static/screenshots/AreaChart/default-series-label-dark-240w.webp differ diff --git a/docs/static/screenshots/AreaChart/default-series-label-dark-400w.webp b/docs/static/screenshots/AreaChart/default-series-label-dark-400w.webp index 7496014a62..5c47067586 100644 Binary files a/docs/static/screenshots/AreaChart/default-series-label-dark-400w.webp and b/docs/static/screenshots/AreaChart/default-series-label-dark-400w.webp differ diff --git a/docs/static/screenshots/AreaChart/default-series-label-dark-800w.webp b/docs/static/screenshots/AreaChart/default-series-label-dark-800w.webp index 3fa4ca2f9b..669e793077 100644 Binary files a/docs/static/screenshots/AreaChart/default-series-label-dark-800w.webp and b/docs/static/screenshots/AreaChart/default-series-label-dark-800w.webp differ diff --git a/docs/static/screenshots/AreaChart/default-series-label-light-240w.webp b/docs/static/screenshots/AreaChart/default-series-label-light-240w.webp index dc8886728c..ee9bcfc86c 100644 Binary files a/docs/static/screenshots/AreaChart/default-series-label-light-240w.webp and b/docs/static/screenshots/AreaChart/default-series-label-light-240w.webp differ diff --git a/docs/static/screenshots/AreaChart/default-series-label-light-400w.webp b/docs/static/screenshots/AreaChart/default-series-label-light-400w.webp index 2155ae0687..3110cdb83a 100644 Binary files a/docs/static/screenshots/AreaChart/default-series-label-light-400w.webp and b/docs/static/screenshots/AreaChart/default-series-label-light-400w.webp differ diff --git a/docs/static/screenshots/AreaChart/default-series-label-light-800w.webp b/docs/static/screenshots/AreaChart/default-series-label-light-800w.webp index 0c78ecfdc0..28f5e51589 100644 Binary files a/docs/static/screenshots/AreaChart/default-series-label-light-800w.webp and b/docs/static/screenshots/AreaChart/default-series-label-light-800w.webp differ diff --git a/docs/static/screenshots/AreaChart/funnel-dark-240w.webp b/docs/static/screenshots/AreaChart/funnel-dark-240w.webp index 831fb7a982..6df8a24c17 100644 Binary files a/docs/static/screenshots/AreaChart/funnel-dark-240w.webp and b/docs/static/screenshots/AreaChart/funnel-dark-240w.webp differ diff --git a/docs/static/screenshots/AreaChart/funnel-dark-400w.webp b/docs/static/screenshots/AreaChart/funnel-dark-400w.webp index a58ef3e644..f23c7d0a60 100644 Binary files a/docs/static/screenshots/AreaChart/funnel-dark-400w.webp and b/docs/static/screenshots/AreaChart/funnel-dark-400w.webp differ diff --git a/docs/static/screenshots/AreaChart/funnel-dark-800w.webp b/docs/static/screenshots/AreaChart/funnel-dark-800w.webp index 6220a387b8..1339523ade 100644 Binary files a/docs/static/screenshots/AreaChart/funnel-dark-800w.webp and b/docs/static/screenshots/AreaChart/funnel-dark-800w.webp differ diff --git a/docs/static/screenshots/AreaChart/funnel-light-240w.webp b/docs/static/screenshots/AreaChart/funnel-light-240w.webp index 8cc1c6faa4..2c035b823f 100644 Binary files a/docs/static/screenshots/AreaChart/funnel-light-240w.webp and b/docs/static/screenshots/AreaChart/funnel-light-240w.webp differ diff --git a/docs/static/screenshots/AreaChart/funnel-light-400w.webp b/docs/static/screenshots/AreaChart/funnel-light-400w.webp index 80956d119f..878832d2f2 100644 Binary files a/docs/static/screenshots/AreaChart/funnel-light-400w.webp and b/docs/static/screenshots/AreaChart/funnel-light-400w.webp differ diff --git a/docs/static/screenshots/AreaChart/funnel-light-800w.webp b/docs/static/screenshots/AreaChart/funnel-light-800w.webp index 6401c44c01..7b1b3cc51e 100644 Binary files a/docs/static/screenshots/AreaChart/funnel-light-800w.webp and b/docs/static/screenshots/AreaChart/funnel-light-800w.webp differ diff --git a/docs/static/screenshots/AreaChart/gradient-dark-240w.webp b/docs/static/screenshots/AreaChart/gradient-dark-240w.webp index 7c613b3496..0b4add964e 100644 Binary files a/docs/static/screenshots/AreaChart/gradient-dark-240w.webp and b/docs/static/screenshots/AreaChart/gradient-dark-240w.webp differ diff --git a/docs/static/screenshots/AreaChart/gradient-dark-400w.webp b/docs/static/screenshots/AreaChart/gradient-dark-400w.webp index 82c6d86cb3..1a59430424 100644 Binary files a/docs/static/screenshots/AreaChart/gradient-dark-400w.webp and b/docs/static/screenshots/AreaChart/gradient-dark-400w.webp differ diff --git a/docs/static/screenshots/AreaChart/gradient-dark-800w.webp b/docs/static/screenshots/AreaChart/gradient-dark-800w.webp index 118f775a67..da0f3f67c1 100644 Binary files a/docs/static/screenshots/AreaChart/gradient-dark-800w.webp and b/docs/static/screenshots/AreaChart/gradient-dark-800w.webp differ diff --git a/docs/static/screenshots/AreaChart/gradient-light-240w.webp b/docs/static/screenshots/AreaChart/gradient-light-240w.webp index 295aef06ca..cec8012971 100644 Binary files a/docs/static/screenshots/AreaChart/gradient-light-240w.webp and b/docs/static/screenshots/AreaChart/gradient-light-240w.webp differ diff --git a/docs/static/screenshots/AreaChart/gradient-light-400w.webp b/docs/static/screenshots/AreaChart/gradient-light-400w.webp index 42dae2d1e0..7d8f6e831f 100644 Binary files a/docs/static/screenshots/AreaChart/gradient-light-400w.webp and b/docs/static/screenshots/AreaChart/gradient-light-400w.webp differ diff --git a/docs/static/screenshots/AreaChart/gradient-light-800w.webp b/docs/static/screenshots/AreaChart/gradient-light-800w.webp index 9285dd88f7..73f93d394b 100644 Binary files a/docs/static/screenshots/AreaChart/gradient-light-800w.webp and b/docs/static/screenshots/AreaChart/gradient-light-800w.webp differ diff --git a/docs/static/screenshots/AreaChart/labels-dark-240w.webp b/docs/static/screenshots/AreaChart/labels-dark-240w.webp index 388199b959..5d3348a7e5 100644 Binary files a/docs/static/screenshots/AreaChart/labels-dark-240w.webp and b/docs/static/screenshots/AreaChart/labels-dark-240w.webp differ diff --git a/docs/static/screenshots/AreaChart/labels-dark-400w.webp b/docs/static/screenshots/AreaChart/labels-dark-400w.webp index f5b6bd90c9..6cf55213ce 100644 Binary files a/docs/static/screenshots/AreaChart/labels-dark-400w.webp and b/docs/static/screenshots/AreaChart/labels-dark-400w.webp differ diff --git a/docs/static/screenshots/AreaChart/labels-dark-800w.webp b/docs/static/screenshots/AreaChart/labels-dark-800w.webp index f468ccded6..20145d4b73 100644 Binary files a/docs/static/screenshots/AreaChart/labels-dark-800w.webp and b/docs/static/screenshots/AreaChart/labels-dark-800w.webp differ diff --git a/docs/static/screenshots/AreaChart/labels-light-240w.webp b/docs/static/screenshots/AreaChart/labels-light-240w.webp index 5678547343..87984df493 100644 Binary files a/docs/static/screenshots/AreaChart/labels-light-240w.webp and b/docs/static/screenshots/AreaChart/labels-light-240w.webp differ diff --git a/docs/static/screenshots/AreaChart/labels-light-400w.webp b/docs/static/screenshots/AreaChart/labels-light-400w.webp index 2ae83f8a83..91a48e12bc 100644 Binary files a/docs/static/screenshots/AreaChart/labels-light-400w.webp and b/docs/static/screenshots/AreaChart/labels-light-400w.webp differ diff --git a/docs/static/screenshots/AreaChart/labels-light-800w.webp b/docs/static/screenshots/AreaChart/labels-light-800w.webp index f40971f32e..93d42b6ac8 100644 Binary files a/docs/static/screenshots/AreaChart/labels-light-800w.webp and b/docs/static/screenshots/AreaChart/labels-light-800w.webp differ diff --git a/docs/static/screenshots/AreaChart/line-annotation-dark-240w.webp b/docs/static/screenshots/AreaChart/line-annotation-dark-240w.webp index d4365ba44c..9eb6850010 100644 Binary files a/docs/static/screenshots/AreaChart/line-annotation-dark-240w.webp and b/docs/static/screenshots/AreaChart/line-annotation-dark-240w.webp differ diff --git a/docs/static/screenshots/AreaChart/line-annotation-dark-800w.webp b/docs/static/screenshots/AreaChart/line-annotation-dark-800w.webp index 65052e4801..f808e96090 100644 Binary files a/docs/static/screenshots/AreaChart/line-annotation-dark-800w.webp and b/docs/static/screenshots/AreaChart/line-annotation-dark-800w.webp differ diff --git a/docs/static/screenshots/AreaChart/line-annotation-light-400w.webp b/docs/static/screenshots/AreaChart/line-annotation-light-400w.webp index af05ad2a45..27516f4472 100644 Binary files a/docs/static/screenshots/AreaChart/line-annotation-light-400w.webp and b/docs/static/screenshots/AreaChart/line-annotation-light-400w.webp differ diff --git a/docs/static/screenshots/AreaChart/markers-dark-240w.webp b/docs/static/screenshots/AreaChart/markers-dark-240w.webp index 6ecb51b322..72d7c64736 100644 Binary files a/docs/static/screenshots/AreaChart/markers-dark-240w.webp and b/docs/static/screenshots/AreaChart/markers-dark-240w.webp differ diff --git a/docs/static/screenshots/AreaChart/markers-dark-400w.webp b/docs/static/screenshots/AreaChart/markers-dark-400w.webp index 36aa65ed4e..6341076104 100644 Binary files a/docs/static/screenshots/AreaChart/markers-dark-400w.webp and b/docs/static/screenshots/AreaChart/markers-dark-400w.webp differ diff --git a/docs/static/screenshots/AreaChart/markers-dark-800w.webp b/docs/static/screenshots/AreaChart/markers-dark-800w.webp index 7ab7b149af..be81b8ca38 100644 Binary files a/docs/static/screenshots/AreaChart/markers-dark-800w.webp and b/docs/static/screenshots/AreaChart/markers-dark-800w.webp differ diff --git a/docs/static/screenshots/AreaChart/markers-light-240w.webp b/docs/static/screenshots/AreaChart/markers-light-240w.webp index d19eca4272..a0ed8ac18c 100644 Binary files a/docs/static/screenshots/AreaChart/markers-light-240w.webp and b/docs/static/screenshots/AreaChart/markers-light-240w.webp differ diff --git a/docs/static/screenshots/AreaChart/markers-light-400w.webp b/docs/static/screenshots/AreaChart/markers-light-400w.webp index 5679c71a80..6d0a73cd43 100644 Binary files a/docs/static/screenshots/AreaChart/markers-light-400w.webp and b/docs/static/screenshots/AreaChart/markers-light-400w.webp differ diff --git a/docs/static/screenshots/AreaChart/markers-light-800w.webp b/docs/static/screenshots/AreaChart/markers-light-800w.webp index e71e0db29d..53c06b6a51 100644 Binary files a/docs/static/screenshots/AreaChart/markers-light-800w.webp and b/docs/static/screenshots/AreaChart/markers-light-800w.webp differ diff --git a/docs/static/screenshots/AreaChart/motion-tween-dark-240w.webp b/docs/static/screenshots/AreaChart/motion-tween-dark-240w.webp index 33e7cf4bac..ddd551bf87 100644 Binary files a/docs/static/screenshots/AreaChart/motion-tween-dark-240w.webp and b/docs/static/screenshots/AreaChart/motion-tween-dark-240w.webp differ diff --git a/docs/static/screenshots/AreaChart/motion-tween-dark-400w.webp b/docs/static/screenshots/AreaChart/motion-tween-dark-400w.webp index a78be4bd75..03b748565c 100644 Binary files a/docs/static/screenshots/AreaChart/motion-tween-dark-400w.webp and b/docs/static/screenshots/AreaChart/motion-tween-dark-400w.webp differ diff --git a/docs/static/screenshots/AreaChart/motion-tween-dark-800w.webp b/docs/static/screenshots/AreaChart/motion-tween-dark-800w.webp index 108e7edeb7..0880f6ed30 100644 Binary files a/docs/static/screenshots/AreaChart/motion-tween-dark-800w.webp and b/docs/static/screenshots/AreaChart/motion-tween-dark-800w.webp differ diff --git a/docs/static/screenshots/AreaChart/motion-tween-light-240w.webp b/docs/static/screenshots/AreaChart/motion-tween-light-240w.webp index 0f9e3cfcd7..0026d49743 100644 Binary files a/docs/static/screenshots/AreaChart/motion-tween-light-240w.webp and b/docs/static/screenshots/AreaChart/motion-tween-light-240w.webp differ diff --git a/docs/static/screenshots/AreaChart/motion-tween-light-400w.webp b/docs/static/screenshots/AreaChart/motion-tween-light-400w.webp index 86c5b91f05..d654ac865d 100644 Binary files a/docs/static/screenshots/AreaChart/motion-tween-light-400w.webp and b/docs/static/screenshots/AreaChart/motion-tween-light-400w.webp differ diff --git a/docs/static/screenshots/AreaChart/motion-tween-light-800w.webp b/docs/static/screenshots/AreaChart/motion-tween-light-800w.webp index b7ed2c8f2d..5670f72aae 100644 Binary files a/docs/static/screenshots/AreaChart/motion-tween-light-800w.webp and b/docs/static/screenshots/AreaChart/motion-tween-light-800w.webp differ diff --git a/docs/static/screenshots/AreaChart/null-gaps-dark-240w.webp b/docs/static/screenshots/AreaChart/null-gaps-dark-240w.webp index 19691a93df..99c8a89104 100644 Binary files a/docs/static/screenshots/AreaChart/null-gaps-dark-240w.webp and b/docs/static/screenshots/AreaChart/null-gaps-dark-240w.webp differ diff --git a/docs/static/screenshots/AreaChart/null-gaps-dark-400w.webp b/docs/static/screenshots/AreaChart/null-gaps-dark-400w.webp index 52a00ed474..ea750ad148 100644 Binary files a/docs/static/screenshots/AreaChart/null-gaps-dark-400w.webp and b/docs/static/screenshots/AreaChart/null-gaps-dark-400w.webp differ diff --git a/docs/static/screenshots/AreaChart/null-gaps-dark-800w.webp b/docs/static/screenshots/AreaChart/null-gaps-dark-800w.webp index fc01419b04..b82fbe6a1a 100644 Binary files a/docs/static/screenshots/AreaChart/null-gaps-dark-800w.webp and b/docs/static/screenshots/AreaChart/null-gaps-dark-800w.webp differ diff --git a/docs/static/screenshots/AreaChart/null-gaps-light-240w.webp b/docs/static/screenshots/AreaChart/null-gaps-light-240w.webp index ad23b9a6d1..fcf5b94e98 100644 Binary files a/docs/static/screenshots/AreaChart/null-gaps-light-240w.webp and b/docs/static/screenshots/AreaChart/null-gaps-light-240w.webp differ diff --git a/docs/static/screenshots/AreaChart/null-gaps-light-400w.webp b/docs/static/screenshots/AreaChart/null-gaps-light-400w.webp index 1ea28e9701..8d5caca7d0 100644 Binary files a/docs/static/screenshots/AreaChart/null-gaps-light-400w.webp and b/docs/static/screenshots/AreaChart/null-gaps-light-400w.webp differ diff --git a/docs/static/screenshots/AreaChart/null-gaps-light-800w.webp b/docs/static/screenshots/AreaChart/null-gaps-light-800w.webp index f7a4183d7e..22720ea83b 100644 Binary files a/docs/static/screenshots/AreaChart/null-gaps-light-800w.webp and b/docs/static/screenshots/AreaChart/null-gaps-light-800w.webp differ diff --git a/docs/static/screenshots/AreaChart/point-annotations-dark-240w.webp b/docs/static/screenshots/AreaChart/point-annotations-dark-240w.webp index 94218f2515..30a7ec0337 100644 Binary files a/docs/static/screenshots/AreaChart/point-annotations-dark-240w.webp and b/docs/static/screenshots/AreaChart/point-annotations-dark-240w.webp differ diff --git a/docs/static/screenshots/AreaChart/point-annotations-dark-400w.webp b/docs/static/screenshots/AreaChart/point-annotations-dark-400w.webp index 809101c15a..06e6d60dac 100644 Binary files a/docs/static/screenshots/AreaChart/point-annotations-dark-400w.webp and b/docs/static/screenshots/AreaChart/point-annotations-dark-400w.webp differ diff --git a/docs/static/screenshots/AreaChart/point-annotations-dark-800w.webp b/docs/static/screenshots/AreaChart/point-annotations-dark-800w.webp index 7cf580a4d3..cdffe0d7fb 100644 Binary files a/docs/static/screenshots/AreaChart/point-annotations-dark-800w.webp and b/docs/static/screenshots/AreaChart/point-annotations-dark-800w.webp differ diff --git a/docs/static/screenshots/AreaChart/point-annotations-light-240w.webp b/docs/static/screenshots/AreaChart/point-annotations-light-240w.webp index f87fb98b56..c521c5cfc5 100644 Binary files a/docs/static/screenshots/AreaChart/point-annotations-light-240w.webp and b/docs/static/screenshots/AreaChart/point-annotations-light-240w.webp differ diff --git a/docs/static/screenshots/AreaChart/point-annotations-light-400w.webp b/docs/static/screenshots/AreaChart/point-annotations-light-400w.webp index 73d8494fb7..60dcfe61c3 100644 Binary files a/docs/static/screenshots/AreaChart/point-annotations-light-400w.webp and b/docs/static/screenshots/AreaChart/point-annotations-light-400w.webp differ diff --git a/docs/static/screenshots/AreaChart/point-annotations-light-800w.webp b/docs/static/screenshots/AreaChart/point-annotations-light-800w.webp index e6dbd80c88..3d329a9dbd 100644 Binary files a/docs/static/screenshots/AreaChart/point-annotations-light-800w.webp and b/docs/static/screenshots/AreaChart/point-annotations-light-800w.webp differ diff --git a/docs/static/screenshots/AreaChart/points-dark-240w.webp b/docs/static/screenshots/AreaChart/points-dark-240w.webp index c020ba0633..2289ac7481 100644 Binary files a/docs/static/screenshots/AreaChart/points-dark-240w.webp and b/docs/static/screenshots/AreaChart/points-dark-240w.webp differ diff --git a/docs/static/screenshots/AreaChart/points-dark-400w.webp b/docs/static/screenshots/AreaChart/points-dark-400w.webp index 9dde3592d0..de2aa03ac5 100644 Binary files a/docs/static/screenshots/AreaChart/points-dark-400w.webp and b/docs/static/screenshots/AreaChart/points-dark-400w.webp differ diff --git a/docs/static/screenshots/AreaChart/points-dark-800w.webp b/docs/static/screenshots/AreaChart/points-dark-800w.webp index f1309166bd..ffd475b0d9 100644 Binary files a/docs/static/screenshots/AreaChart/points-dark-800w.webp and b/docs/static/screenshots/AreaChart/points-dark-800w.webp differ diff --git a/docs/static/screenshots/AreaChart/points-light-240w.webp b/docs/static/screenshots/AreaChart/points-light-240w.webp index c035dafd16..bd18ee37f9 100644 Binary files a/docs/static/screenshots/AreaChart/points-light-240w.webp and b/docs/static/screenshots/AreaChart/points-light-240w.webp differ diff --git a/docs/static/screenshots/AreaChart/points-light-400w.webp b/docs/static/screenshots/AreaChart/points-light-400w.webp index f56a1cb74f..1e9b69bff7 100644 Binary files a/docs/static/screenshots/AreaChart/points-light-400w.webp and b/docs/static/screenshots/AreaChart/points-light-400w.webp differ diff --git a/docs/static/screenshots/AreaChart/points-light-800w.webp b/docs/static/screenshots/AreaChart/points-light-800w.webp index f58b359794..ccb9c5e7bc 100644 Binary files a/docs/static/screenshots/AreaChart/points-light-800w.webp and b/docs/static/screenshots/AreaChart/points-light-800w.webp differ diff --git a/docs/static/screenshots/AreaChart/radial-dark-240w.webp b/docs/static/screenshots/AreaChart/radial-dark-240w.webp index 47dd996fec..014ed26195 100644 Binary files a/docs/static/screenshots/AreaChart/radial-dark-240w.webp and b/docs/static/screenshots/AreaChart/radial-dark-240w.webp differ diff --git a/docs/static/screenshots/AreaChart/radial-dark-400w.webp b/docs/static/screenshots/AreaChart/radial-dark-400w.webp index ad5f7beefa..16890e6f2c 100644 Binary files a/docs/static/screenshots/AreaChart/radial-dark-400w.webp and b/docs/static/screenshots/AreaChart/radial-dark-400w.webp differ diff --git a/docs/static/screenshots/AreaChart/radial-dark-800w.webp b/docs/static/screenshots/AreaChart/radial-dark-800w.webp index bf981243df..205a1013b1 100644 Binary files a/docs/static/screenshots/AreaChart/radial-dark-800w.webp and b/docs/static/screenshots/AreaChart/radial-dark-800w.webp differ diff --git a/docs/static/screenshots/AreaChart/radial-light-240w.webp b/docs/static/screenshots/AreaChart/radial-light-240w.webp index 35980f1ccb..a34bdaaf80 100644 Binary files a/docs/static/screenshots/AreaChart/radial-light-240w.webp and b/docs/static/screenshots/AreaChart/radial-light-240w.webp differ diff --git a/docs/static/screenshots/AreaChart/radial-light-400w.webp b/docs/static/screenshots/AreaChart/radial-light-400w.webp index 4351f44166..f58b306ae5 100644 Binary files a/docs/static/screenshots/AreaChart/radial-light-400w.webp and b/docs/static/screenshots/AreaChart/radial-light-400w.webp differ diff --git a/docs/static/screenshots/AreaChart/radial-light-800w.webp b/docs/static/screenshots/AreaChart/radial-light-800w.webp index 61b0e2d1d5..89c135ae27 100644 Binary files a/docs/static/screenshots/AreaChart/radial-light-800w.webp and b/docs/static/screenshots/AreaChart/radial-light-800w.webp differ diff --git a/docs/static/screenshots/AreaChart/range-annotation-dark-240w.webp b/docs/static/screenshots/AreaChart/range-annotation-dark-240w.webp index 3bb590522e..e248440c93 100644 Binary files a/docs/static/screenshots/AreaChart/range-annotation-dark-240w.webp and b/docs/static/screenshots/AreaChart/range-annotation-dark-240w.webp differ diff --git a/docs/static/screenshots/AreaChart/range-annotation-dark-800w.webp b/docs/static/screenshots/AreaChart/range-annotation-dark-800w.webp index 76958772d1..fc8d275d60 100644 Binary files a/docs/static/screenshots/AreaChart/range-annotation-dark-800w.webp and b/docs/static/screenshots/AreaChart/range-annotation-dark-800w.webp differ diff --git a/docs/static/screenshots/AreaChart/series-dark-240w.webp b/docs/static/screenshots/AreaChart/series-dark-240w.webp index f4a61dc539..9630bf4e54 100644 Binary files a/docs/static/screenshots/AreaChart/series-dark-240w.webp and b/docs/static/screenshots/AreaChart/series-dark-240w.webp differ diff --git a/docs/static/screenshots/AreaChart/series-dark-400w.webp b/docs/static/screenshots/AreaChart/series-dark-400w.webp index 77d9ef0052..e590a913a6 100644 Binary files a/docs/static/screenshots/AreaChart/series-dark-400w.webp and b/docs/static/screenshots/AreaChart/series-dark-400w.webp differ diff --git a/docs/static/screenshots/AreaChart/series-dark-800w.webp b/docs/static/screenshots/AreaChart/series-dark-800w.webp index 74b83dc01d..62eb56b615 100644 Binary files a/docs/static/screenshots/AreaChart/series-dark-800w.webp and b/docs/static/screenshots/AreaChart/series-dark-800w.webp differ diff --git a/docs/static/screenshots/AreaChart/series-individual-tooltip-dark-240w.webp b/docs/static/screenshots/AreaChart/series-individual-tooltip-dark-240w.webp index 1a21370dca..e9ec7eef65 100644 Binary files a/docs/static/screenshots/AreaChart/series-individual-tooltip-dark-240w.webp and b/docs/static/screenshots/AreaChart/series-individual-tooltip-dark-240w.webp differ diff --git a/docs/static/screenshots/AreaChart/series-individual-tooltip-dark-400w.webp b/docs/static/screenshots/AreaChart/series-individual-tooltip-dark-400w.webp index 75de1d7c7e..446cb918e4 100644 Binary files a/docs/static/screenshots/AreaChart/series-individual-tooltip-dark-400w.webp and b/docs/static/screenshots/AreaChart/series-individual-tooltip-dark-400w.webp differ diff --git a/docs/static/screenshots/AreaChart/series-individual-tooltip-dark-800w.webp b/docs/static/screenshots/AreaChart/series-individual-tooltip-dark-800w.webp index 1650fc67a7..5d5c9baee2 100644 Binary files a/docs/static/screenshots/AreaChart/series-individual-tooltip-dark-800w.webp and b/docs/static/screenshots/AreaChart/series-individual-tooltip-dark-800w.webp differ diff --git a/docs/static/screenshots/AreaChart/series-individual-tooltip-light-240w.webp b/docs/static/screenshots/AreaChart/series-individual-tooltip-light-240w.webp index 7567804bdc..c31f424b1e 100644 Binary files a/docs/static/screenshots/AreaChart/series-individual-tooltip-light-240w.webp and b/docs/static/screenshots/AreaChart/series-individual-tooltip-light-240w.webp differ diff --git a/docs/static/screenshots/AreaChart/series-individual-tooltip-light-400w.webp b/docs/static/screenshots/AreaChart/series-individual-tooltip-light-400w.webp index cc6bba50c4..ed5c749d9b 100644 Binary files a/docs/static/screenshots/AreaChart/series-individual-tooltip-light-400w.webp and b/docs/static/screenshots/AreaChart/series-individual-tooltip-light-400w.webp differ diff --git a/docs/static/screenshots/AreaChart/series-individual-tooltip-light-800w.webp b/docs/static/screenshots/AreaChart/series-individual-tooltip-light-800w.webp index eeb3e3ed11..f786a4c0a1 100644 Binary files a/docs/static/screenshots/AreaChart/series-individual-tooltip-light-800w.webp and b/docs/static/screenshots/AreaChart/series-individual-tooltip-light-800w.webp differ diff --git a/docs/static/screenshots/AreaChart/series-light-240w.webp b/docs/static/screenshots/AreaChart/series-light-240w.webp index 16a377a9e2..2dcfb32c8f 100644 Binary files a/docs/static/screenshots/AreaChart/series-light-240w.webp and b/docs/static/screenshots/AreaChart/series-light-240w.webp differ diff --git a/docs/static/screenshots/AreaChart/series-light-400w.webp b/docs/static/screenshots/AreaChart/series-light-400w.webp index 5d03fd8285..732bbe8daa 100644 Binary files a/docs/static/screenshots/AreaChart/series-light-400w.webp and b/docs/static/screenshots/AreaChart/series-light-400w.webp differ diff --git a/docs/static/screenshots/AreaChart/series-light-800w.webp b/docs/static/screenshots/AreaChart/series-light-800w.webp index 589b4724ac..cfb44e51b3 100644 Binary files a/docs/static/screenshots/AreaChart/series-light-800w.webp and b/docs/static/screenshots/AreaChart/series-light-800w.webp differ diff --git a/docs/static/screenshots/AreaChart/series-overlap-dark-240w.webp b/docs/static/screenshots/AreaChart/series-overlap-dark-240w.webp new file mode 100644 index 0000000000..59294d62a4 Binary files /dev/null and b/docs/static/screenshots/AreaChart/series-overlap-dark-240w.webp differ diff --git a/docs/static/screenshots/AreaChart/series-overlap-dark-400w.webp b/docs/static/screenshots/AreaChart/series-overlap-dark-400w.webp new file mode 100644 index 0000000000..169a09a198 Binary files /dev/null and b/docs/static/screenshots/AreaChart/series-overlap-dark-400w.webp differ diff --git a/docs/static/screenshots/AreaChart/series-overlap-dark-800w.webp b/docs/static/screenshots/AreaChart/series-overlap-dark-800w.webp new file mode 100644 index 0000000000..c42138e29e Binary files /dev/null and b/docs/static/screenshots/AreaChart/series-overlap-dark-800w.webp differ diff --git a/docs/static/screenshots/AreaChart/series-overlap-light-240w.webp b/docs/static/screenshots/AreaChart/series-overlap-light-240w.webp new file mode 100644 index 0000000000..c7045f64e2 Binary files /dev/null and b/docs/static/screenshots/AreaChart/series-overlap-light-240w.webp differ diff --git a/docs/static/screenshots/AreaChart/series-overlap-light-400w.webp b/docs/static/screenshots/AreaChart/series-overlap-light-400w.webp new file mode 100644 index 0000000000..0a602310fe Binary files /dev/null and b/docs/static/screenshots/AreaChart/series-overlap-light-400w.webp differ diff --git a/docs/static/screenshots/AreaChart/series-overlap-light-800w.webp b/docs/static/screenshots/AreaChart/series-overlap-light-800w.webp new file mode 100644 index 0000000000..bea9f9838a Binary files /dev/null and b/docs/static/screenshots/AreaChart/series-overlap-light-800w.webp differ diff --git a/docs/static/screenshots/AreaChart/series-point-annotations-dark-240w.webp b/docs/static/screenshots/AreaChart/series-point-annotations-dark-240w.webp index 26f193920e..fd8f586b20 100644 Binary files a/docs/static/screenshots/AreaChart/series-point-annotations-dark-240w.webp and b/docs/static/screenshots/AreaChart/series-point-annotations-dark-240w.webp differ diff --git a/docs/static/screenshots/AreaChart/series-point-annotations-dark-400w.webp b/docs/static/screenshots/AreaChart/series-point-annotations-dark-400w.webp index 63c8d6bda8..d72529343e 100644 Binary files a/docs/static/screenshots/AreaChart/series-point-annotations-dark-400w.webp and b/docs/static/screenshots/AreaChart/series-point-annotations-dark-400w.webp differ diff --git a/docs/static/screenshots/AreaChart/series-point-annotations-dark-800w.webp b/docs/static/screenshots/AreaChart/series-point-annotations-dark-800w.webp index d15c9e1c55..92cd5ade5c 100644 Binary files a/docs/static/screenshots/AreaChart/series-point-annotations-dark-800w.webp and b/docs/static/screenshots/AreaChart/series-point-annotations-dark-800w.webp differ diff --git a/docs/static/screenshots/AreaChart/series-point-annotations-light-240w.webp b/docs/static/screenshots/AreaChart/series-point-annotations-light-240w.webp index 1906c0c9ee..960b295cdb 100644 Binary files a/docs/static/screenshots/AreaChart/series-point-annotations-light-240w.webp and b/docs/static/screenshots/AreaChart/series-point-annotations-light-240w.webp differ diff --git a/docs/static/screenshots/AreaChart/series-point-annotations-light-400w.webp b/docs/static/screenshots/AreaChart/series-point-annotations-light-400w.webp index 6e496655fc..2e5e2881e4 100644 Binary files a/docs/static/screenshots/AreaChart/series-point-annotations-light-400w.webp and b/docs/static/screenshots/AreaChart/series-point-annotations-light-400w.webp differ diff --git a/docs/static/screenshots/AreaChart/series-point-annotations-light-800w.webp b/docs/static/screenshots/AreaChart/series-point-annotations-light-800w.webp index 3abbda6e3f..e104f951bf 100644 Binary files a/docs/static/screenshots/AreaChart/series-point-annotations-light-800w.webp and b/docs/static/screenshots/AreaChart/series-point-annotations-light-800w.webp differ diff --git a/docs/static/screenshots/AreaChart/series-point-click-dark-240w.webp b/docs/static/screenshots/AreaChart/series-point-click-dark-240w.webp index 4bac8b5f64..186d1dcef8 100644 Binary files a/docs/static/screenshots/AreaChart/series-point-click-dark-240w.webp and b/docs/static/screenshots/AreaChart/series-point-click-dark-240w.webp differ diff --git a/docs/static/screenshots/AreaChart/series-point-click-dark-400w.webp b/docs/static/screenshots/AreaChart/series-point-click-dark-400w.webp index 65f71bad9b..1d5832245f 100644 Binary files a/docs/static/screenshots/AreaChart/series-point-click-dark-400w.webp and b/docs/static/screenshots/AreaChart/series-point-click-dark-400w.webp differ diff --git a/docs/static/screenshots/AreaChart/series-point-click-dark-800w.webp b/docs/static/screenshots/AreaChart/series-point-click-dark-800w.webp index 16990b0e53..28db0a7a64 100644 Binary files a/docs/static/screenshots/AreaChart/series-point-click-dark-800w.webp and b/docs/static/screenshots/AreaChart/series-point-click-dark-800w.webp differ diff --git a/docs/static/screenshots/AreaChart/series-point-click-light-240w.webp b/docs/static/screenshots/AreaChart/series-point-click-light-240w.webp index b4b729cc79..0acb612e24 100644 Binary files a/docs/static/screenshots/AreaChart/series-point-click-light-240w.webp and b/docs/static/screenshots/AreaChart/series-point-click-light-240w.webp differ diff --git a/docs/static/screenshots/AreaChart/series-point-click-light-400w.webp b/docs/static/screenshots/AreaChart/series-point-click-light-400w.webp index 2f8a7244b6..f00046c568 100644 Binary files a/docs/static/screenshots/AreaChart/series-point-click-light-400w.webp and b/docs/static/screenshots/AreaChart/series-point-click-light-400w.webp differ diff --git a/docs/static/screenshots/AreaChart/series-point-click-light-800w.webp b/docs/static/screenshots/AreaChart/series-point-click-light-800w.webp index f41f44eefa..8b12a36532 100644 Binary files a/docs/static/screenshots/AreaChart/series-point-click-light-800w.webp and b/docs/static/screenshots/AreaChart/series-point-click-light-800w.webp differ diff --git a/docs/static/screenshots/AreaChart/series-separate-data-dark-240w.webp b/docs/static/screenshots/AreaChart/series-separate-data-dark-240w.webp index 8568b7d92a..03f5384577 100644 Binary files a/docs/static/screenshots/AreaChart/series-separate-data-dark-240w.webp and b/docs/static/screenshots/AreaChart/series-separate-data-dark-240w.webp differ diff --git a/docs/static/screenshots/AreaChart/series-separate-data-dark-400w.webp b/docs/static/screenshots/AreaChart/series-separate-data-dark-400w.webp index a0d1ea838d..5424b3cea8 100644 Binary files a/docs/static/screenshots/AreaChart/series-separate-data-dark-400w.webp and b/docs/static/screenshots/AreaChart/series-separate-data-dark-400w.webp differ diff --git a/docs/static/screenshots/AreaChart/series-separate-data-dark-800w.webp b/docs/static/screenshots/AreaChart/series-separate-data-dark-800w.webp index 68483e8b67..3a499067db 100644 Binary files a/docs/static/screenshots/AreaChart/series-separate-data-dark-800w.webp and b/docs/static/screenshots/AreaChart/series-separate-data-dark-800w.webp differ diff --git a/docs/static/screenshots/AreaChart/series-separate-data-light-240w.webp b/docs/static/screenshots/AreaChart/series-separate-data-light-240w.webp index 7e4133f49d..e070e62ee7 100644 Binary files a/docs/static/screenshots/AreaChart/series-separate-data-light-240w.webp and b/docs/static/screenshots/AreaChart/series-separate-data-light-240w.webp differ diff --git a/docs/static/screenshots/AreaChart/series-separate-data-light-400w.webp b/docs/static/screenshots/AreaChart/series-separate-data-light-400w.webp index e34b36d13a..860850c9d9 100644 Binary files a/docs/static/screenshots/AreaChart/series-separate-data-light-400w.webp and b/docs/static/screenshots/AreaChart/series-separate-data-light-400w.webp differ diff --git a/docs/static/screenshots/AreaChart/series-separate-data-light-800w.webp b/docs/static/screenshots/AreaChart/series-separate-data-light-800w.webp index 35e5ae513b..240898fc8e 100644 Binary files a/docs/static/screenshots/AreaChart/series-separate-data-light-800w.webp and b/docs/static/screenshots/AreaChart/series-separate-data-light-800w.webp differ diff --git a/docs/static/screenshots/AreaChart/series-stack-dark-240w.webp b/docs/static/screenshots/AreaChart/series-stack-dark-240w.webp index f4a392fed7..512d317750 100644 Binary files a/docs/static/screenshots/AreaChart/series-stack-dark-240w.webp and b/docs/static/screenshots/AreaChart/series-stack-dark-240w.webp differ diff --git a/docs/static/screenshots/AreaChart/series-stack-dark-400w.webp b/docs/static/screenshots/AreaChart/series-stack-dark-400w.webp index b25ccd47a4..8b5c180338 100644 Binary files a/docs/static/screenshots/AreaChart/series-stack-dark-400w.webp and b/docs/static/screenshots/AreaChart/series-stack-dark-400w.webp differ diff --git a/docs/static/screenshots/AreaChart/series-stack-dark-800w.webp b/docs/static/screenshots/AreaChart/series-stack-dark-800w.webp index 98da45d240..5f3e5a0bb9 100644 Binary files a/docs/static/screenshots/AreaChart/series-stack-dark-800w.webp and b/docs/static/screenshots/AreaChart/series-stack-dark-800w.webp differ diff --git a/docs/static/screenshots/AreaChart/series-stack-diverging-dark-240w.webp b/docs/static/screenshots/AreaChart/series-stack-diverging-dark-240w.webp index e1398c6da2..a7927a46dc 100644 Binary files a/docs/static/screenshots/AreaChart/series-stack-diverging-dark-240w.webp and b/docs/static/screenshots/AreaChart/series-stack-diverging-dark-240w.webp differ diff --git a/docs/static/screenshots/AreaChart/series-stack-diverging-dark-400w.webp b/docs/static/screenshots/AreaChart/series-stack-diverging-dark-400w.webp index 7f3e8f1b30..98e36adb42 100644 Binary files a/docs/static/screenshots/AreaChart/series-stack-diverging-dark-400w.webp and b/docs/static/screenshots/AreaChart/series-stack-diverging-dark-400w.webp differ diff --git a/docs/static/screenshots/AreaChart/series-stack-diverging-dark-800w.webp b/docs/static/screenshots/AreaChart/series-stack-diverging-dark-800w.webp index 19a87014c3..ce842a25c7 100644 Binary files a/docs/static/screenshots/AreaChart/series-stack-diverging-dark-800w.webp and b/docs/static/screenshots/AreaChart/series-stack-diverging-dark-800w.webp differ diff --git a/docs/static/screenshots/AreaChart/series-stack-diverging-light-240w.webp b/docs/static/screenshots/AreaChart/series-stack-diverging-light-240w.webp index fbb3155258..9ad7bb87a8 100644 Binary files a/docs/static/screenshots/AreaChart/series-stack-diverging-light-240w.webp and b/docs/static/screenshots/AreaChart/series-stack-diverging-light-240w.webp differ diff --git a/docs/static/screenshots/AreaChart/series-stack-diverging-light-400w.webp b/docs/static/screenshots/AreaChart/series-stack-diverging-light-400w.webp index b46844dd56..f7b1e56e5a 100644 Binary files a/docs/static/screenshots/AreaChart/series-stack-diverging-light-400w.webp and b/docs/static/screenshots/AreaChart/series-stack-diverging-light-400w.webp differ diff --git a/docs/static/screenshots/AreaChart/series-stack-diverging-light-800w.webp b/docs/static/screenshots/AreaChart/series-stack-diverging-light-800w.webp index 1bafd2760b..bf29aee1a6 100644 Binary files a/docs/static/screenshots/AreaChart/series-stack-diverging-light-800w.webp and b/docs/static/screenshots/AreaChart/series-stack-diverging-light-800w.webp differ diff --git a/docs/static/screenshots/AreaChart/series-stack-expand-dark-240w.webp b/docs/static/screenshots/AreaChart/series-stack-expand-dark-240w.webp index 5b68eb347c..b9f26be801 100644 Binary files a/docs/static/screenshots/AreaChart/series-stack-expand-dark-240w.webp and b/docs/static/screenshots/AreaChart/series-stack-expand-dark-240w.webp differ diff --git a/docs/static/screenshots/AreaChart/series-stack-expand-dark-400w.webp b/docs/static/screenshots/AreaChart/series-stack-expand-dark-400w.webp index 7e42c38fc0..99fdcc66b7 100644 Binary files a/docs/static/screenshots/AreaChart/series-stack-expand-dark-400w.webp and b/docs/static/screenshots/AreaChart/series-stack-expand-dark-400w.webp differ diff --git a/docs/static/screenshots/AreaChart/series-stack-expand-dark-800w.webp b/docs/static/screenshots/AreaChart/series-stack-expand-dark-800w.webp index e28d946e46..76175acbe3 100644 Binary files a/docs/static/screenshots/AreaChart/series-stack-expand-dark-800w.webp and b/docs/static/screenshots/AreaChart/series-stack-expand-dark-800w.webp differ diff --git a/docs/static/screenshots/AreaChart/series-stack-expand-light-240w.webp b/docs/static/screenshots/AreaChart/series-stack-expand-light-240w.webp index 7af2e232a3..e90d177ab8 100644 Binary files a/docs/static/screenshots/AreaChart/series-stack-expand-light-240w.webp and b/docs/static/screenshots/AreaChart/series-stack-expand-light-240w.webp differ diff --git a/docs/static/screenshots/AreaChart/series-stack-expand-light-400w.webp b/docs/static/screenshots/AreaChart/series-stack-expand-light-400w.webp index d407c95114..1c73b4b5a9 100644 Binary files a/docs/static/screenshots/AreaChart/series-stack-expand-light-400w.webp and b/docs/static/screenshots/AreaChart/series-stack-expand-light-400w.webp differ diff --git a/docs/static/screenshots/AreaChart/series-stack-expand-light-800w.webp b/docs/static/screenshots/AreaChart/series-stack-expand-light-800w.webp index 797eebf0cc..cda72f4cff 100644 Binary files a/docs/static/screenshots/AreaChart/series-stack-expand-light-800w.webp and b/docs/static/screenshots/AreaChart/series-stack-expand-light-800w.webp differ diff --git a/docs/static/screenshots/AreaChart/series-stack-gradient-dark-240w.webp b/docs/static/screenshots/AreaChart/series-stack-gradient-dark-240w.webp index efe0f58415..68ab7d18a8 100644 Binary files a/docs/static/screenshots/AreaChart/series-stack-gradient-dark-240w.webp and b/docs/static/screenshots/AreaChart/series-stack-gradient-dark-240w.webp differ diff --git a/docs/static/screenshots/AreaChart/series-stack-gradient-dark-400w.webp b/docs/static/screenshots/AreaChart/series-stack-gradient-dark-400w.webp index b0b87d716f..e4f3b1b361 100644 Binary files a/docs/static/screenshots/AreaChart/series-stack-gradient-dark-400w.webp and b/docs/static/screenshots/AreaChart/series-stack-gradient-dark-400w.webp differ diff --git a/docs/static/screenshots/AreaChart/series-stack-gradient-dark-800w.webp b/docs/static/screenshots/AreaChart/series-stack-gradient-dark-800w.webp index af64be41a8..e2bdf7ebbf 100644 Binary files a/docs/static/screenshots/AreaChart/series-stack-gradient-dark-800w.webp and b/docs/static/screenshots/AreaChart/series-stack-gradient-dark-800w.webp differ diff --git a/docs/static/screenshots/AreaChart/series-stack-gradient-light-240w.webp b/docs/static/screenshots/AreaChart/series-stack-gradient-light-240w.webp index 9dece2c506..5555c6134e 100644 Binary files a/docs/static/screenshots/AreaChart/series-stack-gradient-light-240w.webp and b/docs/static/screenshots/AreaChart/series-stack-gradient-light-240w.webp differ diff --git a/docs/static/screenshots/AreaChart/series-stack-gradient-light-400w.webp b/docs/static/screenshots/AreaChart/series-stack-gradient-light-400w.webp index 5e083bdb00..b8489453cf 100644 Binary files a/docs/static/screenshots/AreaChart/series-stack-gradient-light-400w.webp and b/docs/static/screenshots/AreaChart/series-stack-gradient-light-400w.webp differ diff --git a/docs/static/screenshots/AreaChart/series-stack-gradient-light-800w.webp b/docs/static/screenshots/AreaChart/series-stack-gradient-light-800w.webp index 17b4bf8b30..b1a488ba85 100644 Binary files a/docs/static/screenshots/AreaChart/series-stack-gradient-light-800w.webp and b/docs/static/screenshots/AreaChart/series-stack-gradient-light-800w.webp differ diff --git a/docs/static/screenshots/AreaChart/series-stack-legend-dark-240w.webp b/docs/static/screenshots/AreaChart/series-stack-legend-dark-240w.webp index 0cc90299b7..00f9ff0df7 100644 Binary files a/docs/static/screenshots/AreaChart/series-stack-legend-dark-240w.webp and b/docs/static/screenshots/AreaChart/series-stack-legend-dark-240w.webp differ diff --git a/docs/static/screenshots/AreaChart/series-stack-legend-dark-400w.webp b/docs/static/screenshots/AreaChart/series-stack-legend-dark-400w.webp index bed2e2feb1..e78a35ea07 100644 Binary files a/docs/static/screenshots/AreaChart/series-stack-legend-dark-400w.webp and b/docs/static/screenshots/AreaChart/series-stack-legend-dark-400w.webp differ diff --git a/docs/static/screenshots/AreaChart/series-stack-legend-dark-800w.webp b/docs/static/screenshots/AreaChart/series-stack-legend-dark-800w.webp index 27cb85473c..543b17f345 100644 Binary files a/docs/static/screenshots/AreaChart/series-stack-legend-dark-800w.webp and b/docs/static/screenshots/AreaChart/series-stack-legend-dark-800w.webp differ diff --git a/docs/static/screenshots/AreaChart/series-stack-legend-labels-dark-240w.webp b/docs/static/screenshots/AreaChart/series-stack-legend-labels-dark-240w.webp index e8d5bbd785..45a4723574 100644 Binary files a/docs/static/screenshots/AreaChart/series-stack-legend-labels-dark-240w.webp and b/docs/static/screenshots/AreaChart/series-stack-legend-labels-dark-240w.webp differ diff --git a/docs/static/screenshots/AreaChart/series-stack-legend-labels-dark-400w.webp b/docs/static/screenshots/AreaChart/series-stack-legend-labels-dark-400w.webp index 98424e0e61..b9d25606e5 100644 Binary files a/docs/static/screenshots/AreaChart/series-stack-legend-labels-dark-400w.webp and b/docs/static/screenshots/AreaChart/series-stack-legend-labels-dark-400w.webp differ diff --git a/docs/static/screenshots/AreaChart/series-stack-legend-labels-dark-800w.webp b/docs/static/screenshots/AreaChart/series-stack-legend-labels-dark-800w.webp index ff6a754ae3..fd6085e1c5 100644 Binary files a/docs/static/screenshots/AreaChart/series-stack-legend-labels-dark-800w.webp and b/docs/static/screenshots/AreaChart/series-stack-legend-labels-dark-800w.webp differ diff --git a/docs/static/screenshots/AreaChart/series-stack-legend-labels-light-240w.webp b/docs/static/screenshots/AreaChart/series-stack-legend-labels-light-240w.webp index 5f817bef40..78f8ed0393 100644 Binary files a/docs/static/screenshots/AreaChart/series-stack-legend-labels-light-240w.webp and b/docs/static/screenshots/AreaChart/series-stack-legend-labels-light-240w.webp differ diff --git a/docs/static/screenshots/AreaChart/series-stack-legend-labels-light-400w.webp b/docs/static/screenshots/AreaChart/series-stack-legend-labels-light-400w.webp index 7b2dc2b590..90729148ff 100644 Binary files a/docs/static/screenshots/AreaChart/series-stack-legend-labels-light-400w.webp and b/docs/static/screenshots/AreaChart/series-stack-legend-labels-light-400w.webp differ diff --git a/docs/static/screenshots/AreaChart/series-stack-legend-labels-light-800w.webp b/docs/static/screenshots/AreaChart/series-stack-legend-labels-light-800w.webp index 836ee4b1cc..f1ff921ff0 100644 Binary files a/docs/static/screenshots/AreaChart/series-stack-legend-labels-light-800w.webp and b/docs/static/screenshots/AreaChart/series-stack-legend-labels-light-800w.webp differ diff --git a/docs/static/screenshots/AreaChart/series-stack-legend-light-240w.webp b/docs/static/screenshots/AreaChart/series-stack-legend-light-240w.webp index b6cdc14eae..a08ae98725 100644 Binary files a/docs/static/screenshots/AreaChart/series-stack-legend-light-240w.webp and b/docs/static/screenshots/AreaChart/series-stack-legend-light-240w.webp differ diff --git a/docs/static/screenshots/AreaChart/series-stack-legend-light-400w.webp b/docs/static/screenshots/AreaChart/series-stack-legend-light-400w.webp index 5b65e38d2b..961088d985 100644 Binary files a/docs/static/screenshots/AreaChart/series-stack-legend-light-400w.webp and b/docs/static/screenshots/AreaChart/series-stack-legend-light-400w.webp differ diff --git a/docs/static/screenshots/AreaChart/series-stack-legend-light-800w.webp b/docs/static/screenshots/AreaChart/series-stack-legend-light-800w.webp index 0f991a42e9..f7e02b82b3 100644 Binary files a/docs/static/screenshots/AreaChart/series-stack-legend-light-800w.webp and b/docs/static/screenshots/AreaChart/series-stack-legend-light-800w.webp differ diff --git a/docs/static/screenshots/AreaChart/series-stack-legend-placement-dark-240w.webp b/docs/static/screenshots/AreaChart/series-stack-legend-placement-dark-240w.webp index 898fc55acf..7ac95085af 100644 Binary files a/docs/static/screenshots/AreaChart/series-stack-legend-placement-dark-240w.webp and b/docs/static/screenshots/AreaChart/series-stack-legend-placement-dark-240w.webp differ diff --git a/docs/static/screenshots/AreaChart/series-stack-legend-placement-dark-400w.webp b/docs/static/screenshots/AreaChart/series-stack-legend-placement-dark-400w.webp index 9eadb32eb3..9c01a81a23 100644 Binary files a/docs/static/screenshots/AreaChart/series-stack-legend-placement-dark-400w.webp and b/docs/static/screenshots/AreaChart/series-stack-legend-placement-dark-400w.webp differ diff --git a/docs/static/screenshots/AreaChart/series-stack-legend-placement-dark-800w.webp b/docs/static/screenshots/AreaChart/series-stack-legend-placement-dark-800w.webp index 048504006b..21eef8dd2d 100644 Binary files a/docs/static/screenshots/AreaChart/series-stack-legend-placement-dark-800w.webp and b/docs/static/screenshots/AreaChart/series-stack-legend-placement-dark-800w.webp differ diff --git a/docs/static/screenshots/AreaChart/series-stack-legend-placement-light-240w.webp b/docs/static/screenshots/AreaChart/series-stack-legend-placement-light-240w.webp index 6744944aaa..3f13fde5a4 100644 Binary files a/docs/static/screenshots/AreaChart/series-stack-legend-placement-light-240w.webp and b/docs/static/screenshots/AreaChart/series-stack-legend-placement-light-240w.webp differ diff --git a/docs/static/screenshots/AreaChart/series-stack-legend-placement-light-400w.webp b/docs/static/screenshots/AreaChart/series-stack-legend-placement-light-400w.webp index 33bc45171e..701962c4de 100644 Binary files a/docs/static/screenshots/AreaChart/series-stack-legend-placement-light-400w.webp and b/docs/static/screenshots/AreaChart/series-stack-legend-placement-light-400w.webp differ diff --git a/docs/static/screenshots/AreaChart/series-stack-legend-placement-light-800w.webp b/docs/static/screenshots/AreaChart/series-stack-legend-placement-light-800w.webp index 7fbf2af867..b3fe633135 100644 Binary files a/docs/static/screenshots/AreaChart/series-stack-legend-placement-light-800w.webp and b/docs/static/screenshots/AreaChart/series-stack-legend-placement-light-800w.webp differ diff --git a/docs/static/screenshots/AreaChart/series-stack-light-240w.webp b/docs/static/screenshots/AreaChart/series-stack-light-240w.webp index 3116edb250..9a53c1d611 100644 Binary files a/docs/static/screenshots/AreaChart/series-stack-light-240w.webp and b/docs/static/screenshots/AreaChart/series-stack-light-240w.webp differ diff --git a/docs/static/screenshots/AreaChart/series-stack-light-400w.webp b/docs/static/screenshots/AreaChart/series-stack-light-400w.webp index 3acb0727b3..5ddf98b9a5 100644 Binary files a/docs/static/screenshots/AreaChart/series-stack-light-400w.webp and b/docs/static/screenshots/AreaChart/series-stack-light-400w.webp differ diff --git a/docs/static/screenshots/AreaChart/series-stack-light-800w.webp b/docs/static/screenshots/AreaChart/series-stack-light-800w.webp index 1b97d7e5ce..a50d2f3691 100644 Binary files a/docs/static/screenshots/AreaChart/series-stack-light-800w.webp and b/docs/static/screenshots/AreaChart/series-stack-light-800w.webp differ diff --git a/docs/static/screenshots/AreaChart/series-stack-separate-data-dark-240w.webp b/docs/static/screenshots/AreaChart/series-stack-separate-data-dark-240w.webp index 7fae5235b6..5187ee91fa 100644 Binary files a/docs/static/screenshots/AreaChart/series-stack-separate-data-dark-240w.webp and b/docs/static/screenshots/AreaChart/series-stack-separate-data-dark-240w.webp differ diff --git a/docs/static/screenshots/AreaChart/series-stack-separate-data-dark-400w.webp b/docs/static/screenshots/AreaChart/series-stack-separate-data-dark-400w.webp index 6976995a2d..69b9a1d667 100644 Binary files a/docs/static/screenshots/AreaChart/series-stack-separate-data-dark-400w.webp and b/docs/static/screenshots/AreaChart/series-stack-separate-data-dark-400w.webp differ diff --git a/docs/static/screenshots/AreaChart/series-stack-separate-data-dark-800w.webp b/docs/static/screenshots/AreaChart/series-stack-separate-data-dark-800w.webp index 2485869f1e..4e523ecd96 100644 Binary files a/docs/static/screenshots/AreaChart/series-stack-separate-data-dark-800w.webp and b/docs/static/screenshots/AreaChart/series-stack-separate-data-dark-800w.webp differ diff --git a/docs/static/screenshots/AreaChart/series-stack-separate-data-light-240w.webp b/docs/static/screenshots/AreaChart/series-stack-separate-data-light-240w.webp index 72493d0cfa..6de85bee4b 100644 Binary files a/docs/static/screenshots/AreaChart/series-stack-separate-data-light-240w.webp and b/docs/static/screenshots/AreaChart/series-stack-separate-data-light-240w.webp differ diff --git a/docs/static/screenshots/AreaChart/series-stack-separate-data-light-400w.webp b/docs/static/screenshots/AreaChart/series-stack-separate-data-light-400w.webp index 37682fe946..2687870a59 100644 Binary files a/docs/static/screenshots/AreaChart/series-stack-separate-data-light-400w.webp and b/docs/static/screenshots/AreaChart/series-stack-separate-data-light-400w.webp differ diff --git a/docs/static/screenshots/AreaChart/series-stack-separate-data-light-800w.webp b/docs/static/screenshots/AreaChart/series-stack-separate-data-light-800w.webp index 3fedeafe2a..cd7481365f 100644 Binary files a/docs/static/screenshots/AreaChart/series-stack-separate-data-light-800w.webp and b/docs/static/screenshots/AreaChart/series-stack-separate-data-light-800w.webp differ diff --git a/docs/static/screenshots/AreaChart/series-tooltip-click-dark-240w.webp b/docs/static/screenshots/AreaChart/series-tooltip-click-dark-240w.webp index 2181bace99..dba2587027 100644 Binary files a/docs/static/screenshots/AreaChart/series-tooltip-click-dark-240w.webp and b/docs/static/screenshots/AreaChart/series-tooltip-click-dark-240w.webp differ diff --git a/docs/static/screenshots/AreaChart/series-tooltip-click-dark-400w.webp b/docs/static/screenshots/AreaChart/series-tooltip-click-dark-400w.webp index 35e990bcf5..f9b3102094 100644 Binary files a/docs/static/screenshots/AreaChart/series-tooltip-click-dark-400w.webp and b/docs/static/screenshots/AreaChart/series-tooltip-click-dark-400w.webp differ diff --git a/docs/static/screenshots/AreaChart/series-tooltip-click-dark-800w.webp b/docs/static/screenshots/AreaChart/series-tooltip-click-dark-800w.webp index d7d0a7ba46..1a248c97ba 100644 Binary files a/docs/static/screenshots/AreaChart/series-tooltip-click-dark-800w.webp and b/docs/static/screenshots/AreaChart/series-tooltip-click-dark-800w.webp differ diff --git a/docs/static/screenshots/AreaChart/series-tooltip-click-light-240w.webp b/docs/static/screenshots/AreaChart/series-tooltip-click-light-240w.webp index 72270924cc..89c5a84178 100644 Binary files a/docs/static/screenshots/AreaChart/series-tooltip-click-light-240w.webp and b/docs/static/screenshots/AreaChart/series-tooltip-click-light-240w.webp differ diff --git a/docs/static/screenshots/AreaChart/series-tooltip-click-light-400w.webp b/docs/static/screenshots/AreaChart/series-tooltip-click-light-400w.webp index 3e3cf28752..4de4dbe785 100644 Binary files a/docs/static/screenshots/AreaChart/series-tooltip-click-light-400w.webp and b/docs/static/screenshots/AreaChart/series-tooltip-click-light-400w.webp differ diff --git a/docs/static/screenshots/AreaChart/series-tooltip-click-light-800w.webp b/docs/static/screenshots/AreaChart/series-tooltip-click-light-800w.webp index aa512fd37d..045722f3c8 100644 Binary files a/docs/static/screenshots/AreaChart/series-tooltip-click-light-800w.webp and b/docs/static/screenshots/AreaChart/series-tooltip-click-light-800w.webp differ diff --git a/docs/static/screenshots/AreaChart/single-axis-x-dark-240w.webp b/docs/static/screenshots/AreaChart/single-axis-x-dark-240w.webp index bd756e4560..a37345f7be 100644 Binary files a/docs/static/screenshots/AreaChart/single-axis-x-dark-240w.webp and b/docs/static/screenshots/AreaChart/single-axis-x-dark-240w.webp differ diff --git a/docs/static/screenshots/AreaChart/single-axis-x-dark-400w.webp b/docs/static/screenshots/AreaChart/single-axis-x-dark-400w.webp index 4ba2f4d951..425e21af5b 100644 Binary files a/docs/static/screenshots/AreaChart/single-axis-x-dark-400w.webp and b/docs/static/screenshots/AreaChart/single-axis-x-dark-400w.webp differ diff --git a/docs/static/screenshots/AreaChart/single-axis-x-dark-800w.webp b/docs/static/screenshots/AreaChart/single-axis-x-dark-800w.webp index 34e6e9c7c7..37874d7670 100644 Binary files a/docs/static/screenshots/AreaChart/single-axis-x-dark-800w.webp and b/docs/static/screenshots/AreaChart/single-axis-x-dark-800w.webp differ diff --git a/docs/static/screenshots/AreaChart/single-axis-x-light-240w.webp b/docs/static/screenshots/AreaChart/single-axis-x-light-240w.webp index d8902e9c21..27ad6bf6ee 100644 Binary files a/docs/static/screenshots/AreaChart/single-axis-x-light-240w.webp and b/docs/static/screenshots/AreaChart/single-axis-x-light-240w.webp differ diff --git a/docs/static/screenshots/AreaChart/single-axis-x-light-400w.webp b/docs/static/screenshots/AreaChart/single-axis-x-light-400w.webp index 58e565539a..63136fd4d3 100644 Binary files a/docs/static/screenshots/AreaChart/single-axis-x-light-400w.webp and b/docs/static/screenshots/AreaChart/single-axis-x-light-400w.webp differ diff --git a/docs/static/screenshots/AreaChart/single-axis-x-light-800w.webp b/docs/static/screenshots/AreaChart/single-axis-x-light-800w.webp index 9dbd2fd904..b1fe9e99cf 100644 Binary files a/docs/static/screenshots/AreaChart/single-axis-x-light-800w.webp and b/docs/static/screenshots/AreaChart/single-axis-x-light-800w.webp differ diff --git a/docs/static/screenshots/AreaChart/single-axis-y-dark-240w.webp b/docs/static/screenshots/AreaChart/single-axis-y-dark-240w.webp index 652e26d7d3..e8a3940838 100644 Binary files a/docs/static/screenshots/AreaChart/single-axis-y-dark-240w.webp and b/docs/static/screenshots/AreaChart/single-axis-y-dark-240w.webp differ diff --git a/docs/static/screenshots/AreaChart/single-axis-y-dark-400w.webp b/docs/static/screenshots/AreaChart/single-axis-y-dark-400w.webp index 1fa2b8d651..47ddc8e32c 100644 Binary files a/docs/static/screenshots/AreaChart/single-axis-y-dark-400w.webp and b/docs/static/screenshots/AreaChart/single-axis-y-dark-400w.webp differ diff --git a/docs/static/screenshots/AreaChart/single-axis-y-dark-800w.webp b/docs/static/screenshots/AreaChart/single-axis-y-dark-800w.webp index a300ac751a..8e6cd3c4b0 100644 Binary files a/docs/static/screenshots/AreaChart/single-axis-y-dark-800w.webp and b/docs/static/screenshots/AreaChart/single-axis-y-dark-800w.webp differ diff --git a/docs/static/screenshots/AreaChart/single-axis-y-light-240w.webp b/docs/static/screenshots/AreaChart/single-axis-y-light-240w.webp index 0e6451b8ba..72a44dba39 100644 Binary files a/docs/static/screenshots/AreaChart/single-axis-y-light-240w.webp and b/docs/static/screenshots/AreaChart/single-axis-y-light-240w.webp differ diff --git a/docs/static/screenshots/AreaChart/single-axis-y-light-400w.webp b/docs/static/screenshots/AreaChart/single-axis-y-light-400w.webp index 817a75ddba..94a2ea4154 100644 Binary files a/docs/static/screenshots/AreaChart/single-axis-y-light-400w.webp and b/docs/static/screenshots/AreaChart/single-axis-y-light-400w.webp differ diff --git a/docs/static/screenshots/AreaChart/single-axis-y-light-800w.webp b/docs/static/screenshots/AreaChart/single-axis-y-light-800w.webp index 23dd1433a5..4bbf9fcb55 100644 Binary files a/docs/static/screenshots/AreaChart/single-axis-y-light-800w.webp and b/docs/static/screenshots/AreaChart/single-axis-y-light-800w.webp differ diff --git a/docs/static/screenshots/AreaChart/sparkline-dark-240w.webp b/docs/static/screenshots/AreaChart/sparkline-dark-240w.webp index 228e420349..98baa9d27c 100644 Binary files a/docs/static/screenshots/AreaChart/sparkline-dark-240w.webp and b/docs/static/screenshots/AreaChart/sparkline-dark-240w.webp differ diff --git a/docs/static/screenshots/AreaChart/sparkline-dark-400w.webp b/docs/static/screenshots/AreaChart/sparkline-dark-400w.webp index 228e420349..98baa9d27c 100644 Binary files a/docs/static/screenshots/AreaChart/sparkline-dark-400w.webp and b/docs/static/screenshots/AreaChart/sparkline-dark-400w.webp differ diff --git a/docs/static/screenshots/AreaChart/sparkline-dark-800w.webp b/docs/static/screenshots/AreaChart/sparkline-dark-800w.webp index 228e420349..98baa9d27c 100644 Binary files a/docs/static/screenshots/AreaChart/sparkline-dark-800w.webp and b/docs/static/screenshots/AreaChart/sparkline-dark-800w.webp differ diff --git a/docs/static/screenshots/AreaChart/sparkline-light-240w.webp b/docs/static/screenshots/AreaChart/sparkline-light-240w.webp index f40361b892..665474604f 100644 Binary files a/docs/static/screenshots/AreaChart/sparkline-light-240w.webp and b/docs/static/screenshots/AreaChart/sparkline-light-240w.webp differ diff --git a/docs/static/screenshots/AreaChart/sparkline-light-400w.webp b/docs/static/screenshots/AreaChart/sparkline-light-400w.webp index f40361b892..665474604f 100644 Binary files a/docs/static/screenshots/AreaChart/sparkline-light-400w.webp and b/docs/static/screenshots/AreaChart/sparkline-light-400w.webp differ diff --git a/docs/static/screenshots/AreaChart/sparkline-light-800w.webp b/docs/static/screenshots/AreaChart/sparkline-light-800w.webp index f40361b892..665474604f 100644 Binary files a/docs/static/screenshots/AreaChart/sparkline-light-800w.webp and b/docs/static/screenshots/AreaChart/sparkline-light-800w.webp differ diff --git a/docs/static/screenshots/AreaChart/threshold-dark-240w.webp b/docs/static/screenshots/AreaChart/threshold-dark-240w.webp index 0f0df613d7..44bd497c5c 100644 Binary files a/docs/static/screenshots/AreaChart/threshold-dark-240w.webp and b/docs/static/screenshots/AreaChart/threshold-dark-240w.webp differ diff --git a/docs/static/screenshots/AreaChart/threshold-dark-400w.webp b/docs/static/screenshots/AreaChart/threshold-dark-400w.webp index 2e0b11adb0..c8ba9ee3e8 100644 Binary files a/docs/static/screenshots/AreaChart/threshold-dark-400w.webp and b/docs/static/screenshots/AreaChart/threshold-dark-400w.webp differ diff --git a/docs/static/screenshots/AreaChart/threshold-dark-800w.webp b/docs/static/screenshots/AreaChart/threshold-dark-800w.webp index 83e335a729..bc7eca060a 100644 Binary files a/docs/static/screenshots/AreaChart/threshold-dark-800w.webp and b/docs/static/screenshots/AreaChart/threshold-dark-800w.webp differ diff --git a/docs/static/screenshots/AreaChart/threshold-gradient-dark-240w.webp b/docs/static/screenshots/AreaChart/threshold-gradient-dark-240w.webp index 799475c90c..7f3ae04095 100644 Binary files a/docs/static/screenshots/AreaChart/threshold-gradient-dark-240w.webp and b/docs/static/screenshots/AreaChart/threshold-gradient-dark-240w.webp differ diff --git a/docs/static/screenshots/AreaChart/threshold-gradient-dark-400w.webp b/docs/static/screenshots/AreaChart/threshold-gradient-dark-400w.webp index 89c8964acb..213b3a6132 100644 Binary files a/docs/static/screenshots/AreaChart/threshold-gradient-dark-400w.webp and b/docs/static/screenshots/AreaChart/threshold-gradient-dark-400w.webp differ diff --git a/docs/static/screenshots/AreaChart/threshold-gradient-dark-800w.webp b/docs/static/screenshots/AreaChart/threshold-gradient-dark-800w.webp index 9b747d3f13..90eb5265b1 100644 Binary files a/docs/static/screenshots/AreaChart/threshold-gradient-dark-800w.webp and b/docs/static/screenshots/AreaChart/threshold-gradient-dark-800w.webp differ diff --git a/docs/static/screenshots/AreaChart/threshold-gradient-light-240w.webp b/docs/static/screenshots/AreaChart/threshold-gradient-light-240w.webp index 3fc67e972e..aa6b603561 100644 Binary files a/docs/static/screenshots/AreaChart/threshold-gradient-light-240w.webp and b/docs/static/screenshots/AreaChart/threshold-gradient-light-240w.webp differ diff --git a/docs/static/screenshots/AreaChart/threshold-gradient-light-400w.webp b/docs/static/screenshots/AreaChart/threshold-gradient-light-400w.webp index 4d4f96704c..c383573267 100644 Binary files a/docs/static/screenshots/AreaChart/threshold-gradient-light-400w.webp and b/docs/static/screenshots/AreaChart/threshold-gradient-light-400w.webp differ diff --git a/docs/static/screenshots/AreaChart/threshold-gradient-light-800w.webp b/docs/static/screenshots/AreaChart/threshold-gradient-light-800w.webp index c3992b19e8..94679de998 100644 Binary files a/docs/static/screenshots/AreaChart/threshold-gradient-light-800w.webp and b/docs/static/screenshots/AreaChart/threshold-gradient-light-800w.webp differ diff --git a/docs/static/screenshots/AreaChart/threshold-light-240w.webp b/docs/static/screenshots/AreaChart/threshold-light-240w.webp index cc26dbd691..2f8890d8fe 100644 Binary files a/docs/static/screenshots/AreaChart/threshold-light-240w.webp and b/docs/static/screenshots/AreaChart/threshold-light-240w.webp differ diff --git a/docs/static/screenshots/AreaChart/threshold-light-400w.webp b/docs/static/screenshots/AreaChart/threshold-light-400w.webp index a5ed151e51..fe728e76e4 100644 Binary files a/docs/static/screenshots/AreaChart/threshold-light-400w.webp and b/docs/static/screenshots/AreaChart/threshold-light-400w.webp differ diff --git a/docs/static/screenshots/AreaChart/threshold-light-800w.webp b/docs/static/screenshots/AreaChart/threshold-light-800w.webp index a7eb81bd37..ef1e6a2514 100644 Binary files a/docs/static/screenshots/AreaChart/threshold-light-800w.webp and b/docs/static/screenshots/AreaChart/threshold-light-800w.webp differ diff --git a/docs/static/screenshots/AreaChart/tooltip-external-dark-240w.webp b/docs/static/screenshots/AreaChart/tooltip-external-dark-240w.webp index 079400be35..7482fa7b0f 100644 Binary files a/docs/static/screenshots/AreaChart/tooltip-external-dark-240w.webp and b/docs/static/screenshots/AreaChart/tooltip-external-dark-240w.webp differ diff --git a/docs/static/screenshots/AreaChart/tooltip-external-dark-400w.webp b/docs/static/screenshots/AreaChart/tooltip-external-dark-400w.webp index 38c8d9d049..ed2199570b 100644 Binary files a/docs/static/screenshots/AreaChart/tooltip-external-dark-400w.webp and b/docs/static/screenshots/AreaChart/tooltip-external-dark-400w.webp differ diff --git a/docs/static/screenshots/AreaChart/tooltip-external-dark-800w.webp b/docs/static/screenshots/AreaChart/tooltip-external-dark-800w.webp index 54d9819f7c..4dceb0fd23 100644 Binary files a/docs/static/screenshots/AreaChart/tooltip-external-dark-800w.webp and b/docs/static/screenshots/AreaChart/tooltip-external-dark-800w.webp differ diff --git a/docs/static/screenshots/AreaChart/tooltip-external-light-240w.webp b/docs/static/screenshots/AreaChart/tooltip-external-light-240w.webp index 0e36ed7c2b..bb33811e32 100644 Binary files a/docs/static/screenshots/AreaChart/tooltip-external-light-240w.webp and b/docs/static/screenshots/AreaChart/tooltip-external-light-240w.webp differ diff --git a/docs/static/screenshots/AreaChart/tooltip-external-light-400w.webp b/docs/static/screenshots/AreaChart/tooltip-external-light-400w.webp index 85529420bc..0e5ac4cb48 100644 Binary files a/docs/static/screenshots/AreaChart/tooltip-external-light-400w.webp and b/docs/static/screenshots/AreaChart/tooltip-external-light-400w.webp differ diff --git a/docs/static/screenshots/AreaChart/tooltip-external-light-800w.webp b/docs/static/screenshots/AreaChart/tooltip-external-light-800w.webp index 6fbfb6748f..0c5d39f55d 100644 Binary files a/docs/static/screenshots/AreaChart/tooltip-external-light-800w.webp and b/docs/static/screenshots/AreaChart/tooltip-external-light-800w.webp differ diff --git a/docs/static/screenshots/AreaChart/tooltip-fixed-with-hide-delay-dark-240w.webp b/docs/static/screenshots/AreaChart/tooltip-fixed-with-hide-delay-dark-240w.webp index 6f948cdbad..8bb4e78510 100644 Binary files a/docs/static/screenshots/AreaChart/tooltip-fixed-with-hide-delay-dark-240w.webp and b/docs/static/screenshots/AreaChart/tooltip-fixed-with-hide-delay-dark-240w.webp differ diff --git a/docs/static/screenshots/AreaChart/tooltip-fixed-with-hide-delay-dark-400w.webp b/docs/static/screenshots/AreaChart/tooltip-fixed-with-hide-delay-dark-400w.webp index b03a8fb20f..1f1ba8c41a 100644 Binary files a/docs/static/screenshots/AreaChart/tooltip-fixed-with-hide-delay-dark-400w.webp and b/docs/static/screenshots/AreaChart/tooltip-fixed-with-hide-delay-dark-400w.webp differ diff --git a/docs/static/screenshots/AreaChart/tooltip-fixed-with-hide-delay-dark-800w.webp b/docs/static/screenshots/AreaChart/tooltip-fixed-with-hide-delay-dark-800w.webp index 657b5fb99b..639030b09a 100644 Binary files a/docs/static/screenshots/AreaChart/tooltip-fixed-with-hide-delay-dark-800w.webp and b/docs/static/screenshots/AreaChart/tooltip-fixed-with-hide-delay-dark-800w.webp differ diff --git a/docs/static/screenshots/AreaChart/tooltip-fixed-with-hide-delay-light-240w.webp b/docs/static/screenshots/AreaChart/tooltip-fixed-with-hide-delay-light-240w.webp index b0978477fb..c674006657 100644 Binary files a/docs/static/screenshots/AreaChart/tooltip-fixed-with-hide-delay-light-240w.webp and b/docs/static/screenshots/AreaChart/tooltip-fixed-with-hide-delay-light-240w.webp differ diff --git a/docs/static/screenshots/AreaChart/tooltip-fixed-with-hide-delay-light-400w.webp b/docs/static/screenshots/AreaChart/tooltip-fixed-with-hide-delay-light-400w.webp index eac73d59d5..a1eaa4b633 100644 Binary files a/docs/static/screenshots/AreaChart/tooltip-fixed-with-hide-delay-light-400w.webp and b/docs/static/screenshots/AreaChart/tooltip-fixed-with-hide-delay-light-400w.webp differ diff --git a/docs/static/screenshots/AreaChart/tooltip-fixed-with-hide-delay-light-800w.webp b/docs/static/screenshots/AreaChart/tooltip-fixed-with-hide-delay-light-800w.webp index fc77501c16..a0a1dedac6 100644 Binary files a/docs/static/screenshots/AreaChart/tooltip-fixed-with-hide-delay-light-800w.webp and b/docs/static/screenshots/AreaChart/tooltip-fixed-with-hide-delay-light-800w.webp differ diff --git a/docs/static/screenshots/AreaChart/tooltip-locking-dark-240w.webp b/docs/static/screenshots/AreaChart/tooltip-locking-dark-240w.webp index f87995c535..1ff842379b 100644 Binary files a/docs/static/screenshots/AreaChart/tooltip-locking-dark-240w.webp and b/docs/static/screenshots/AreaChart/tooltip-locking-dark-240w.webp differ diff --git a/docs/static/screenshots/AreaChart/tooltip-locking-dark-400w.webp b/docs/static/screenshots/AreaChart/tooltip-locking-dark-400w.webp index bd998e28f3..de9731206a 100644 Binary files a/docs/static/screenshots/AreaChart/tooltip-locking-dark-400w.webp and b/docs/static/screenshots/AreaChart/tooltip-locking-dark-400w.webp differ diff --git a/docs/static/screenshots/AreaChart/tooltip-locking-dark-800w.webp b/docs/static/screenshots/AreaChart/tooltip-locking-dark-800w.webp index 10f16cfe71..a5df40d143 100644 Binary files a/docs/static/screenshots/AreaChart/tooltip-locking-dark-800w.webp and b/docs/static/screenshots/AreaChart/tooltip-locking-dark-800w.webp differ diff --git a/docs/static/screenshots/AreaChart/tooltip-locking-light-240w.webp b/docs/static/screenshots/AreaChart/tooltip-locking-light-240w.webp index 923693494a..fc08256d32 100644 Binary files a/docs/static/screenshots/AreaChart/tooltip-locking-light-240w.webp and b/docs/static/screenshots/AreaChart/tooltip-locking-light-240w.webp differ diff --git a/docs/static/screenshots/AreaChart/tooltip-locking-light-400w.webp b/docs/static/screenshots/AreaChart/tooltip-locking-light-400w.webp index eb797b9857..ee079826ef 100644 Binary files a/docs/static/screenshots/AreaChart/tooltip-locking-light-400w.webp and b/docs/static/screenshots/AreaChart/tooltip-locking-light-400w.webp differ diff --git a/docs/static/screenshots/AreaChart/tooltip-locking-light-800w.webp b/docs/static/screenshots/AreaChart/tooltip-locking-light-800w.webp index 427dc3a878..ff2ec5956d 100644 Binary files a/docs/static/screenshots/AreaChart/tooltip-locking-light-800w.webp and b/docs/static/screenshots/AreaChart/tooltip-locking-light-800w.webp differ diff --git a/docs/static/screenshots/Axis/arrow-markers-dark-240w.webp b/docs/static/screenshots/Axis/arrow-markers-dark-240w.webp index 4b4b7cc633..993c33963c 100644 Binary files a/docs/static/screenshots/Axis/arrow-markers-dark-240w.webp and b/docs/static/screenshots/Axis/arrow-markers-dark-240w.webp differ diff --git a/docs/static/screenshots/Axis/arrow-markers-dark-400w.webp b/docs/static/screenshots/Axis/arrow-markers-dark-400w.webp index e2e5f3cbc7..9793ef537e 100644 Binary files a/docs/static/screenshots/Axis/arrow-markers-dark-400w.webp and b/docs/static/screenshots/Axis/arrow-markers-dark-400w.webp differ diff --git a/docs/static/screenshots/Axis/arrow-markers-dark-800w.webp b/docs/static/screenshots/Axis/arrow-markers-dark-800w.webp index 7a2573e2c1..06300ced20 100644 Binary files a/docs/static/screenshots/Axis/arrow-markers-dark-800w.webp and b/docs/static/screenshots/Axis/arrow-markers-dark-800w.webp differ diff --git a/docs/static/screenshots/Axis/arrow-markers-light-240w.webp b/docs/static/screenshots/Axis/arrow-markers-light-240w.webp index 9a8f39bfd8..3c4e253a81 100644 Binary files a/docs/static/screenshots/Axis/arrow-markers-light-240w.webp and b/docs/static/screenshots/Axis/arrow-markers-light-240w.webp differ diff --git a/docs/static/screenshots/Axis/arrow-markers-light-400w.webp b/docs/static/screenshots/Axis/arrow-markers-light-400w.webp index a2ae43a153..502b4f062c 100644 Binary files a/docs/static/screenshots/Axis/arrow-markers-light-400w.webp and b/docs/static/screenshots/Axis/arrow-markers-light-400w.webp differ diff --git a/docs/static/screenshots/Axis/arrow-markers-light-800w.webp b/docs/static/screenshots/Axis/arrow-markers-light-800w.webp index d413a70053..5678ed072e 100644 Binary files a/docs/static/screenshots/Axis/arrow-markers-light-800w.webp and b/docs/static/screenshots/Axis/arrow-markers-light-800w.webp differ diff --git a/docs/static/screenshots/Axis/axis-label-placement-top-bottom-dark-240w.webp b/docs/static/screenshots/Axis/axis-label-placement-top-bottom-dark-240w.webp index ff7ffc4d14..8772b44b32 100644 Binary files a/docs/static/screenshots/Axis/axis-label-placement-top-bottom-dark-240w.webp and b/docs/static/screenshots/Axis/axis-label-placement-top-bottom-dark-240w.webp differ diff --git a/docs/static/screenshots/Axis/axis-label-placement-top-bottom-dark-400w.webp b/docs/static/screenshots/Axis/axis-label-placement-top-bottom-dark-400w.webp index a1d4784795..693ba160cc 100644 Binary files a/docs/static/screenshots/Axis/axis-label-placement-top-bottom-dark-400w.webp and b/docs/static/screenshots/Axis/axis-label-placement-top-bottom-dark-400w.webp differ diff --git a/docs/static/screenshots/Axis/axis-label-placement-top-bottom-dark-800w.webp b/docs/static/screenshots/Axis/axis-label-placement-top-bottom-dark-800w.webp index 91b5441193..5792e0e188 100644 Binary files a/docs/static/screenshots/Axis/axis-label-placement-top-bottom-dark-800w.webp and b/docs/static/screenshots/Axis/axis-label-placement-top-bottom-dark-800w.webp differ diff --git a/docs/static/screenshots/Axis/axis-label-placement-top-bottom-light-240w.webp b/docs/static/screenshots/Axis/axis-label-placement-top-bottom-light-240w.webp index fe4509e61c..9533bb4f08 100644 Binary files a/docs/static/screenshots/Axis/axis-label-placement-top-bottom-light-240w.webp and b/docs/static/screenshots/Axis/axis-label-placement-top-bottom-light-240w.webp differ diff --git a/docs/static/screenshots/Axis/axis-label-placement-top-bottom-light-400w.webp b/docs/static/screenshots/Axis/axis-label-placement-top-bottom-light-400w.webp index 970c8b444b..af072a3504 100644 Binary files a/docs/static/screenshots/Axis/axis-label-placement-top-bottom-light-400w.webp and b/docs/static/screenshots/Axis/axis-label-placement-top-bottom-light-400w.webp differ diff --git a/docs/static/screenshots/Axis/axis-label-placement-top-bottom-light-800w.webp b/docs/static/screenshots/Axis/axis-label-placement-top-bottom-light-800w.webp index 8e36f8a23f..4412b395fe 100644 Binary files a/docs/static/screenshots/Axis/axis-label-placement-top-bottom-light-800w.webp and b/docs/static/screenshots/Axis/axis-label-placement-top-bottom-light-800w.webp differ diff --git a/docs/static/screenshots/Axis/barchart-tickspacing-dark-240w.webp b/docs/static/screenshots/Axis/barchart-tickspacing-dark-240w.webp index 03c0bb7436..fc6cfd388e 100644 Binary files a/docs/static/screenshots/Axis/barchart-tickspacing-dark-240w.webp and b/docs/static/screenshots/Axis/barchart-tickspacing-dark-240w.webp differ diff --git a/docs/static/screenshots/Axis/barchart-tickspacing-dark-400w.webp b/docs/static/screenshots/Axis/barchart-tickspacing-dark-400w.webp index 4d7479edf2..eb82c78c64 100644 Binary files a/docs/static/screenshots/Axis/barchart-tickspacing-dark-400w.webp and b/docs/static/screenshots/Axis/barchart-tickspacing-dark-400w.webp differ diff --git a/docs/static/screenshots/Axis/barchart-tickspacing-dark-800w.webp b/docs/static/screenshots/Axis/barchart-tickspacing-dark-800w.webp index ece8cf5c00..6f50d208f7 100644 Binary files a/docs/static/screenshots/Axis/barchart-tickspacing-dark-800w.webp and b/docs/static/screenshots/Axis/barchart-tickspacing-dark-800w.webp differ diff --git a/docs/static/screenshots/Axis/barchart-tickspacing-light-240w.webp b/docs/static/screenshots/Axis/barchart-tickspacing-light-240w.webp index efd80f1f94..700d078c43 100644 Binary files a/docs/static/screenshots/Axis/barchart-tickspacing-light-240w.webp and b/docs/static/screenshots/Axis/barchart-tickspacing-light-240w.webp differ diff --git a/docs/static/screenshots/Axis/barchart-tickspacing-light-400w.webp b/docs/static/screenshots/Axis/barchart-tickspacing-light-400w.webp index 3afab97f80..e1095a7858 100644 Binary files a/docs/static/screenshots/Axis/barchart-tickspacing-light-400w.webp and b/docs/static/screenshots/Axis/barchart-tickspacing-light-400w.webp differ diff --git a/docs/static/screenshots/Axis/barchart-tickspacing-light-800w.webp b/docs/static/screenshots/Axis/barchart-tickspacing-light-800w.webp index d91129ff52..2739682e4f 100644 Binary files a/docs/static/screenshots/Axis/barchart-tickspacing-light-800w.webp and b/docs/static/screenshots/Axis/barchart-tickspacing-light-800w.webp differ diff --git a/docs/static/screenshots/Axis/barchart-xinterval-xinset-dark-240w.webp b/docs/static/screenshots/Axis/barchart-xinterval-xinset-dark-240w.webp index 62ac98fd19..47414f0614 100644 Binary files a/docs/static/screenshots/Axis/barchart-xinterval-xinset-dark-240w.webp and b/docs/static/screenshots/Axis/barchart-xinterval-xinset-dark-240w.webp differ diff --git a/docs/static/screenshots/Axis/barchart-xinterval-xinset-dark-400w.webp b/docs/static/screenshots/Axis/barchart-xinterval-xinset-dark-400w.webp index 8700ca3933..16dbb3ebe5 100644 Binary files a/docs/static/screenshots/Axis/barchart-xinterval-xinset-dark-400w.webp and b/docs/static/screenshots/Axis/barchart-xinterval-xinset-dark-400w.webp differ diff --git a/docs/static/screenshots/Axis/barchart-xinterval-xinset-dark-800w.webp b/docs/static/screenshots/Axis/barchart-xinterval-xinset-dark-800w.webp index aa71a60859..910bea65cf 100644 Binary files a/docs/static/screenshots/Axis/barchart-xinterval-xinset-dark-800w.webp and b/docs/static/screenshots/Axis/barchart-xinterval-xinset-dark-800w.webp differ diff --git a/docs/static/screenshots/Axis/barchart-xinterval-xinset-light-240w.webp b/docs/static/screenshots/Axis/barchart-xinterval-xinset-light-240w.webp index 04f8bc6589..c6ba76d0b2 100644 Binary files a/docs/static/screenshots/Axis/barchart-xinterval-xinset-light-240w.webp and b/docs/static/screenshots/Axis/barchart-xinterval-xinset-light-240w.webp differ diff --git a/docs/static/screenshots/Axis/barchart-xinterval-xinset-light-400w.webp b/docs/static/screenshots/Axis/barchart-xinterval-xinset-light-400w.webp index 6a28c7a9d5..6c27d1b6f1 100644 Binary files a/docs/static/screenshots/Axis/barchart-xinterval-xinset-light-400w.webp and b/docs/static/screenshots/Axis/barchart-xinterval-xinset-light-400w.webp differ diff --git a/docs/static/screenshots/Axis/barchart-xinterval-xinset-light-800w.webp b/docs/static/screenshots/Axis/barchart-xinterval-xinset-light-800w.webp index 9b0f85bfbf..f4b4ae648d 100644 Binary files a/docs/static/screenshots/Axis/barchart-xinterval-xinset-light-800w.webp and b/docs/static/screenshots/Axis/barchart-xinterval-xinset-light-800w.webp differ diff --git a/docs/static/screenshots/Axis/extent-ticks-only-dark-240w.webp b/docs/static/screenshots/Axis/extent-ticks-only-dark-240w.webp index 2b6bcd112a..b5beebe91b 100644 Binary files a/docs/static/screenshots/Axis/extent-ticks-only-dark-240w.webp and b/docs/static/screenshots/Axis/extent-ticks-only-dark-240w.webp differ diff --git a/docs/static/screenshots/Axis/extent-ticks-only-dark-400w.webp b/docs/static/screenshots/Axis/extent-ticks-only-dark-400w.webp index 3677645b59..1bc38fb369 100644 Binary files a/docs/static/screenshots/Axis/extent-ticks-only-dark-400w.webp and b/docs/static/screenshots/Axis/extent-ticks-only-dark-400w.webp differ diff --git a/docs/static/screenshots/Axis/extent-ticks-only-dark-800w.webp b/docs/static/screenshots/Axis/extent-ticks-only-dark-800w.webp index e98a76e853..9a687d2258 100644 Binary files a/docs/static/screenshots/Axis/extent-ticks-only-dark-800w.webp and b/docs/static/screenshots/Axis/extent-ticks-only-dark-800w.webp differ diff --git a/docs/static/screenshots/Axis/extent-ticks-only-light-240w.webp b/docs/static/screenshots/Axis/extent-ticks-only-light-240w.webp index 2df24da116..ebd768e2c9 100644 Binary files a/docs/static/screenshots/Axis/extent-ticks-only-light-240w.webp and b/docs/static/screenshots/Axis/extent-ticks-only-light-240w.webp differ diff --git a/docs/static/screenshots/Axis/extent-ticks-only-light-400w.webp b/docs/static/screenshots/Axis/extent-ticks-only-light-400w.webp index 552e63fc64..4dd38d96be 100644 Binary files a/docs/static/screenshots/Axis/extent-ticks-only-light-400w.webp and b/docs/static/screenshots/Axis/extent-ticks-only-light-400w.webp differ diff --git a/docs/static/screenshots/Axis/extent-ticks-only-light-800w.webp b/docs/static/screenshots/Axis/extent-ticks-only-light-800w.webp index 50a6bdd443..f35331ceb3 100644 Binary files a/docs/static/screenshots/Axis/extent-ticks-only-light-800w.webp and b/docs/static/screenshots/Axis/extent-ticks-only-light-800w.webp differ diff --git a/docs/static/screenshots/Axis/grid-dark-240w.webp b/docs/static/screenshots/Axis/grid-dark-240w.webp index 50b521ad47..739fe7f66a 100644 Binary files a/docs/static/screenshots/Axis/grid-dark-240w.webp and b/docs/static/screenshots/Axis/grid-dark-240w.webp differ diff --git a/docs/static/screenshots/Axis/grid-dark-400w.webp b/docs/static/screenshots/Axis/grid-dark-400w.webp index 2ce31f4755..5edfc4a98f 100644 Binary files a/docs/static/screenshots/Axis/grid-dark-400w.webp and b/docs/static/screenshots/Axis/grid-dark-400w.webp differ diff --git a/docs/static/screenshots/Axis/grid-dark-800w.webp b/docs/static/screenshots/Axis/grid-dark-800w.webp index 14eb83a1e7..bcd9736409 100644 Binary files a/docs/static/screenshots/Axis/grid-dark-800w.webp and b/docs/static/screenshots/Axis/grid-dark-800w.webp differ diff --git a/docs/static/screenshots/Axis/grid-dashed-dark-240w.webp b/docs/static/screenshots/Axis/grid-dashed-dark-240w.webp index 00a99fb74c..a0e8351069 100644 Binary files a/docs/static/screenshots/Axis/grid-dashed-dark-240w.webp and b/docs/static/screenshots/Axis/grid-dashed-dark-240w.webp differ diff --git a/docs/static/screenshots/Axis/grid-dashed-dark-400w.webp b/docs/static/screenshots/Axis/grid-dashed-dark-400w.webp index 2ddd35c54e..62f35e6d3f 100644 Binary files a/docs/static/screenshots/Axis/grid-dashed-dark-400w.webp and b/docs/static/screenshots/Axis/grid-dashed-dark-400w.webp differ diff --git a/docs/static/screenshots/Axis/grid-dashed-dark-800w.webp b/docs/static/screenshots/Axis/grid-dashed-dark-800w.webp index 39363562fe..d6abaa7359 100644 Binary files a/docs/static/screenshots/Axis/grid-dashed-dark-800w.webp and b/docs/static/screenshots/Axis/grid-dashed-dark-800w.webp differ diff --git a/docs/static/screenshots/Axis/grid-dashed-light-240w.webp b/docs/static/screenshots/Axis/grid-dashed-light-240w.webp index c4ddeadb8a..966ea115db 100644 Binary files a/docs/static/screenshots/Axis/grid-dashed-light-240w.webp and b/docs/static/screenshots/Axis/grid-dashed-light-240w.webp differ diff --git a/docs/static/screenshots/Axis/grid-dashed-light-400w.webp b/docs/static/screenshots/Axis/grid-dashed-light-400w.webp index a9bb93d970..51a27a361a 100644 Binary files a/docs/static/screenshots/Axis/grid-dashed-light-400w.webp and b/docs/static/screenshots/Axis/grid-dashed-light-400w.webp differ diff --git a/docs/static/screenshots/Axis/grid-dashed-light-800w.webp b/docs/static/screenshots/Axis/grid-dashed-light-800w.webp index 3510c5aadf..e70b0f7c6f 100644 Binary files a/docs/static/screenshots/Axis/grid-dashed-light-800w.webp and b/docs/static/screenshots/Axis/grid-dashed-light-800w.webp differ diff --git a/docs/static/screenshots/Axis/grid-light-240w.webp b/docs/static/screenshots/Axis/grid-light-240w.webp index fa34610351..50815e33f9 100644 Binary files a/docs/static/screenshots/Axis/grid-light-240w.webp and b/docs/static/screenshots/Axis/grid-light-240w.webp differ diff --git a/docs/static/screenshots/Axis/grid-light-400w.webp b/docs/static/screenshots/Axis/grid-light-400w.webp index 403ff207f7..d68997e264 100644 Binary files a/docs/static/screenshots/Axis/grid-light-400w.webp and b/docs/static/screenshots/Axis/grid-light-400w.webp differ diff --git a/docs/static/screenshots/Axis/grid-light-800w.webp b/docs/static/screenshots/Axis/grid-light-800w.webp index 5ac418e4e4..bae533a87d 100644 Binary files a/docs/static/screenshots/Axis/grid-light-800w.webp and b/docs/static/screenshots/Axis/grid-light-800w.webp differ diff --git a/docs/static/screenshots/Axis/hide-zero-filter-light-240w.webp b/docs/static/screenshots/Axis/hide-zero-filter-light-240w.webp index ba68ac2f54..15c83a2a87 100644 Binary files a/docs/static/screenshots/Axis/hide-zero-filter-light-240w.webp and b/docs/static/screenshots/Axis/hide-zero-filter-light-240w.webp differ diff --git a/docs/static/screenshots/Axis/hide-zero-filter-light-400w.webp b/docs/static/screenshots/Axis/hide-zero-filter-light-400w.webp index 2ae4ed3d3f..7c456a115f 100644 Binary files a/docs/static/screenshots/Axis/hide-zero-filter-light-400w.webp and b/docs/static/screenshots/Axis/hide-zero-filter-light-400w.webp differ diff --git a/docs/static/screenshots/Axis/hide-zero-format-light-240w.webp b/docs/static/screenshots/Axis/hide-zero-format-light-240w.webp index 21a36ddaf6..f691b88443 100644 Binary files a/docs/static/screenshots/Axis/hide-zero-format-light-240w.webp and b/docs/static/screenshots/Axis/hide-zero-format-light-240w.webp differ diff --git a/docs/static/screenshots/Axis/hide-zero-format-light-400w.webp b/docs/static/screenshots/Axis/hide-zero-format-light-400w.webp index 4b80cc4aa7..880cafa1c2 100644 Binary files a/docs/static/screenshots/Axis/hide-zero-format-light-400w.webp and b/docs/static/screenshots/Axis/hide-zero-format-light-400w.webp differ diff --git a/docs/static/screenshots/Axis/inject-ticks-dark-400w.webp b/docs/static/screenshots/Axis/inject-ticks-dark-400w.webp index 9c5b1f5fd1..eac629365c 100644 Binary files a/docs/static/screenshots/Axis/inject-ticks-dark-400w.webp and b/docs/static/screenshots/Axis/inject-ticks-dark-400w.webp differ diff --git a/docs/static/screenshots/Axis/inject-ticks-dark-800w.webp b/docs/static/screenshots/Axis/inject-ticks-dark-800w.webp index a200ad646a..561e861343 100644 Binary files a/docs/static/screenshots/Axis/inject-ticks-dark-800w.webp and b/docs/static/screenshots/Axis/inject-ticks-dark-800w.webp differ diff --git a/docs/static/screenshots/Axis/inject-ticks-light-400w.webp b/docs/static/screenshots/Axis/inject-ticks-light-400w.webp index 3998f8763c..93ad8347ba 100644 Binary files a/docs/static/screenshots/Axis/inject-ticks-light-400w.webp and b/docs/static/screenshots/Axis/inject-ticks-light-400w.webp differ diff --git a/docs/static/screenshots/Axis/inject-ticks-light-800w.webp b/docs/static/screenshots/Axis/inject-ticks-light-800w.webp index 05f459c6c8..676dbebd34 100644 Binary files a/docs/static/screenshots/Axis/inject-ticks-light-800w.webp and b/docs/static/screenshots/Axis/inject-ticks-light-800w.webp differ diff --git a/docs/static/screenshots/Axis/labels-next-hash-dark-240w.webp b/docs/static/screenshots/Axis/labels-next-hash-dark-240w.webp index 751ea2384f..ef73ea53a9 100644 Binary files a/docs/static/screenshots/Axis/labels-next-hash-dark-240w.webp and b/docs/static/screenshots/Axis/labels-next-hash-dark-240w.webp differ diff --git a/docs/static/screenshots/Axis/labels-next-hash-dark-400w.webp b/docs/static/screenshots/Axis/labels-next-hash-dark-400w.webp index 76dfe3a7e5..7d8f782e79 100644 Binary files a/docs/static/screenshots/Axis/labels-next-hash-dark-400w.webp and b/docs/static/screenshots/Axis/labels-next-hash-dark-400w.webp differ diff --git a/docs/static/screenshots/Axis/labels-next-hash-dark-800w.webp b/docs/static/screenshots/Axis/labels-next-hash-dark-800w.webp index c4c6bd6a9c..cc42a604d9 100644 Binary files a/docs/static/screenshots/Axis/labels-next-hash-dark-800w.webp and b/docs/static/screenshots/Axis/labels-next-hash-dark-800w.webp differ diff --git a/docs/static/screenshots/Axis/labels-next-hash-light-240w.webp b/docs/static/screenshots/Axis/labels-next-hash-light-240w.webp index 3c96311c38..0370953301 100644 Binary files a/docs/static/screenshots/Axis/labels-next-hash-light-240w.webp and b/docs/static/screenshots/Axis/labels-next-hash-light-240w.webp differ diff --git a/docs/static/screenshots/Axis/labels-next-hash-light-400w.webp b/docs/static/screenshots/Axis/labels-next-hash-light-400w.webp index 69be5ca114..35104704b9 100644 Binary files a/docs/static/screenshots/Axis/labels-next-hash-light-400w.webp and b/docs/static/screenshots/Axis/labels-next-hash-light-400w.webp differ diff --git a/docs/static/screenshots/Axis/labels-next-hash-light-800w.webp b/docs/static/screenshots/Axis/labels-next-hash-light-800w.webp index f43ff4e18d..5dd0b3f2b4 100644 Binary files a/docs/static/screenshots/Axis/labels-next-hash-light-800w.webp and b/docs/static/screenshots/Axis/labels-next-hash-light-800w.webp differ diff --git a/docs/static/screenshots/Axis/linechart-tickspacing-dark-240w.webp b/docs/static/screenshots/Axis/linechart-tickspacing-dark-240w.webp index 996f81ee82..e56101840b 100644 Binary files a/docs/static/screenshots/Axis/linechart-tickspacing-dark-240w.webp and b/docs/static/screenshots/Axis/linechart-tickspacing-dark-240w.webp differ diff --git a/docs/static/screenshots/Axis/linechart-tickspacing-dark-400w.webp b/docs/static/screenshots/Axis/linechart-tickspacing-dark-400w.webp index 4fcad25439..3c1e7dec49 100644 Binary files a/docs/static/screenshots/Axis/linechart-tickspacing-dark-400w.webp and b/docs/static/screenshots/Axis/linechart-tickspacing-dark-400w.webp differ diff --git a/docs/static/screenshots/Axis/linechart-tickspacing-dark-800w.webp b/docs/static/screenshots/Axis/linechart-tickspacing-dark-800w.webp index 0179064f55..8fcdcda2a2 100644 Binary files a/docs/static/screenshots/Axis/linechart-tickspacing-dark-800w.webp and b/docs/static/screenshots/Axis/linechart-tickspacing-dark-800w.webp differ diff --git a/docs/static/screenshots/Axis/linechart-tickspacing-light-240w.webp b/docs/static/screenshots/Axis/linechart-tickspacing-light-240w.webp index 8d487d80aa..14e791c85e 100644 Binary files a/docs/static/screenshots/Axis/linechart-tickspacing-light-240w.webp and b/docs/static/screenshots/Axis/linechart-tickspacing-light-240w.webp differ diff --git a/docs/static/screenshots/Axis/linechart-tickspacing-light-400w.webp b/docs/static/screenshots/Axis/linechart-tickspacing-light-400w.webp index 433b6007d9..73732c91f4 100644 Binary files a/docs/static/screenshots/Axis/linechart-tickspacing-light-400w.webp and b/docs/static/screenshots/Axis/linechart-tickspacing-light-400w.webp differ diff --git a/docs/static/screenshots/Axis/linechart-tickspacing-light-800w.webp b/docs/static/screenshots/Axis/linechart-tickspacing-light-800w.webp index 95ed98e5a9..9607193098 100644 Binary files a/docs/static/screenshots/Axis/linechart-tickspacing-light-800w.webp and b/docs/static/screenshots/Axis/linechart-tickspacing-light-800w.webp differ diff --git a/docs/static/screenshots/Axis/log-scale-dark-400w.webp b/docs/static/screenshots/Axis/log-scale-dark-400w.webp index 290c9f2b3f..0ca91bb0c5 100644 Binary files a/docs/static/screenshots/Axis/log-scale-dark-400w.webp and b/docs/static/screenshots/Axis/log-scale-dark-400w.webp differ diff --git a/docs/static/screenshots/Axis/log-scale-dark-800w.webp b/docs/static/screenshots/Axis/log-scale-dark-800w.webp index ba65462e41..dfc6cce106 100644 Binary files a/docs/static/screenshots/Axis/log-scale-dark-800w.webp and b/docs/static/screenshots/Axis/log-scale-dark-800w.webp differ diff --git a/docs/static/screenshots/Axis/multiline-tick-labels-dark-240w.webp b/docs/static/screenshots/Axis/multiline-tick-labels-dark-240w.webp index c7d84dd473..4e5a5bfa51 100644 Binary files a/docs/static/screenshots/Axis/multiline-tick-labels-dark-240w.webp and b/docs/static/screenshots/Axis/multiline-tick-labels-dark-240w.webp differ diff --git a/docs/static/screenshots/Axis/multiline-tick-labels-dark-400w.webp b/docs/static/screenshots/Axis/multiline-tick-labels-dark-400w.webp index a78298eef6..3c69385bcf 100644 Binary files a/docs/static/screenshots/Axis/multiline-tick-labels-dark-400w.webp and b/docs/static/screenshots/Axis/multiline-tick-labels-dark-400w.webp differ diff --git a/docs/static/screenshots/Axis/multiline-tick-labels-dark-800w.webp b/docs/static/screenshots/Axis/multiline-tick-labels-dark-800w.webp index ad19f13206..126c9cecf8 100644 Binary files a/docs/static/screenshots/Axis/multiline-tick-labels-dark-800w.webp and b/docs/static/screenshots/Axis/multiline-tick-labels-dark-800w.webp differ diff --git a/docs/static/screenshots/Axis/multiline-tick-labels-light-240w.webp b/docs/static/screenshots/Axis/multiline-tick-labels-light-240w.webp index 16cffa92a4..6b4a5aeedb 100644 Binary files a/docs/static/screenshots/Axis/multiline-tick-labels-light-240w.webp and b/docs/static/screenshots/Axis/multiline-tick-labels-light-240w.webp differ diff --git a/docs/static/screenshots/Axis/multiline-tick-labels-light-400w.webp b/docs/static/screenshots/Axis/multiline-tick-labels-light-400w.webp index 95710ded31..09fd6a9a2d 100644 Binary files a/docs/static/screenshots/Axis/multiline-tick-labels-light-400w.webp and b/docs/static/screenshots/Axis/multiline-tick-labels-light-400w.webp differ diff --git a/docs/static/screenshots/Axis/multiline-tick-labels-light-800w.webp b/docs/static/screenshots/Axis/multiline-tick-labels-light-800w.webp index 95a4c0fd47..4ea997a5ec 100644 Binary files a/docs/static/screenshots/Axis/multiline-tick-labels-light-800w.webp and b/docs/static/screenshots/Axis/multiline-tick-labels-light-800w.webp differ diff --git a/docs/static/screenshots/Axis/multiple-axis-grid-and-rules-dark-240w.webp b/docs/static/screenshots/Axis/multiple-axis-grid-and-rules-dark-240w.webp index e2c038c118..1b8d185b46 100644 Binary files a/docs/static/screenshots/Axis/multiple-axis-grid-and-rules-dark-240w.webp and b/docs/static/screenshots/Axis/multiple-axis-grid-and-rules-dark-240w.webp differ diff --git a/docs/static/screenshots/Axis/multiple-axis-grid-and-rules-dark-400w.webp b/docs/static/screenshots/Axis/multiple-axis-grid-and-rules-dark-400w.webp index b66bfc5c09..4c8536a787 100644 Binary files a/docs/static/screenshots/Axis/multiple-axis-grid-and-rules-dark-400w.webp and b/docs/static/screenshots/Axis/multiple-axis-grid-and-rules-dark-400w.webp differ diff --git a/docs/static/screenshots/Axis/multiple-axis-grid-and-rules-dark-800w.webp b/docs/static/screenshots/Axis/multiple-axis-grid-and-rules-dark-800w.webp index 6c20db70fb..9d085a99c6 100644 Binary files a/docs/static/screenshots/Axis/multiple-axis-grid-and-rules-dark-800w.webp and b/docs/static/screenshots/Axis/multiple-axis-grid-and-rules-dark-800w.webp differ diff --git a/docs/static/screenshots/Axis/multiple-axis-grid-and-rules-light-240w.webp b/docs/static/screenshots/Axis/multiple-axis-grid-and-rules-light-240w.webp index 7336de611f..90b354b2cd 100644 Binary files a/docs/static/screenshots/Axis/multiple-axis-grid-and-rules-light-240w.webp and b/docs/static/screenshots/Axis/multiple-axis-grid-and-rules-light-240w.webp differ diff --git a/docs/static/screenshots/Axis/multiple-axis-grid-and-rules-light-400w.webp b/docs/static/screenshots/Axis/multiple-axis-grid-and-rules-light-400w.webp index e66a9348a0..e0d90f856a 100644 Binary files a/docs/static/screenshots/Axis/multiple-axis-grid-and-rules-light-400w.webp and b/docs/static/screenshots/Axis/multiple-axis-grid-and-rules-light-400w.webp differ diff --git a/docs/static/screenshots/Axis/multiple-axis-grid-and-rules-light-800w.webp b/docs/static/screenshots/Axis/multiple-axis-grid-and-rules-light-800w.webp index c7657aa3a8..73ac98e966 100644 Binary files a/docs/static/screenshots/Axis/multiple-axis-grid-and-rules-light-800w.webp and b/docs/static/screenshots/Axis/multiple-axis-grid-and-rules-light-800w.webp differ diff --git a/docs/static/screenshots/Axis/multiple-axis-grid-and-rules-separate-grid-dark-240w.webp b/docs/static/screenshots/Axis/multiple-axis-grid-and-rules-separate-grid-dark-240w.webp index b1de7aefda..d20ec4a7f2 100644 Binary files a/docs/static/screenshots/Axis/multiple-axis-grid-and-rules-separate-grid-dark-240w.webp and b/docs/static/screenshots/Axis/multiple-axis-grid-and-rules-separate-grid-dark-240w.webp differ diff --git a/docs/static/screenshots/Axis/multiple-axis-grid-and-rules-separate-grid-dark-400w.webp b/docs/static/screenshots/Axis/multiple-axis-grid-and-rules-separate-grid-dark-400w.webp index 63f40d3dd4..7f9e1e250f 100644 Binary files a/docs/static/screenshots/Axis/multiple-axis-grid-and-rules-separate-grid-dark-400w.webp and b/docs/static/screenshots/Axis/multiple-axis-grid-and-rules-separate-grid-dark-400w.webp differ diff --git a/docs/static/screenshots/Axis/multiple-axis-grid-and-rules-separate-grid-dark-800w.webp b/docs/static/screenshots/Axis/multiple-axis-grid-and-rules-separate-grid-dark-800w.webp index c02ac1491a..bb9ae007b6 100644 Binary files a/docs/static/screenshots/Axis/multiple-axis-grid-and-rules-separate-grid-dark-800w.webp and b/docs/static/screenshots/Axis/multiple-axis-grid-and-rules-separate-grid-dark-800w.webp differ diff --git a/docs/static/screenshots/Axis/multiple-axis-grid-and-rules-separate-grid-light-240w.webp b/docs/static/screenshots/Axis/multiple-axis-grid-and-rules-separate-grid-light-240w.webp index e6f6e0a0ce..bdd9761bf2 100644 Binary files a/docs/static/screenshots/Axis/multiple-axis-grid-and-rules-separate-grid-light-240w.webp and b/docs/static/screenshots/Axis/multiple-axis-grid-and-rules-separate-grid-light-240w.webp differ diff --git a/docs/static/screenshots/Axis/multiple-axis-grid-and-rules-separate-grid-light-400w.webp b/docs/static/screenshots/Axis/multiple-axis-grid-and-rules-separate-grid-light-400w.webp index 4ac22cd98a..09fafd4b1f 100644 Binary files a/docs/static/screenshots/Axis/multiple-axis-grid-and-rules-separate-grid-light-400w.webp and b/docs/static/screenshots/Axis/multiple-axis-grid-and-rules-separate-grid-light-400w.webp differ diff --git a/docs/static/screenshots/Axis/multiple-axis-grid-and-rules-separate-grid-light-800w.webp b/docs/static/screenshots/Axis/multiple-axis-grid-and-rules-separate-grid-light-800w.webp index 9698e89930..41002395b7 100644 Binary files a/docs/static/screenshots/Axis/multiple-axis-grid-and-rules-separate-grid-light-800w.webp and b/docs/static/screenshots/Axis/multiple-axis-grid-and-rules-separate-grid-light-800w.webp differ diff --git a/docs/static/screenshots/Axis/multiple-axis-grid-with-single-rule-dark-240w.webp b/docs/static/screenshots/Axis/multiple-axis-grid-with-single-rule-dark-240w.webp index f1b7e02b8b..65a46e9d11 100644 Binary files a/docs/static/screenshots/Axis/multiple-axis-grid-with-single-rule-dark-240w.webp and b/docs/static/screenshots/Axis/multiple-axis-grid-with-single-rule-dark-240w.webp differ diff --git a/docs/static/screenshots/Axis/multiple-axis-grid-with-single-rule-dark-400w.webp b/docs/static/screenshots/Axis/multiple-axis-grid-with-single-rule-dark-400w.webp index ad50b9a766..661157859a 100644 Binary files a/docs/static/screenshots/Axis/multiple-axis-grid-with-single-rule-dark-400w.webp and b/docs/static/screenshots/Axis/multiple-axis-grid-with-single-rule-dark-400w.webp differ diff --git a/docs/static/screenshots/Axis/multiple-axis-grid-with-single-rule-dark-800w.webp b/docs/static/screenshots/Axis/multiple-axis-grid-with-single-rule-dark-800w.webp index fcf2eabb1c..7b491eb5bc 100644 Binary files a/docs/static/screenshots/Axis/multiple-axis-grid-with-single-rule-dark-800w.webp and b/docs/static/screenshots/Axis/multiple-axis-grid-with-single-rule-dark-800w.webp differ diff --git a/docs/static/screenshots/Axis/multiple-axis-grid-with-single-rule-light-240w.webp b/docs/static/screenshots/Axis/multiple-axis-grid-with-single-rule-light-240w.webp index 55dbc28759..6348e2f86e 100644 Binary files a/docs/static/screenshots/Axis/multiple-axis-grid-with-single-rule-light-240w.webp and b/docs/static/screenshots/Axis/multiple-axis-grid-with-single-rule-light-240w.webp differ diff --git a/docs/static/screenshots/Axis/multiple-axis-grid-with-single-rule-light-400w.webp b/docs/static/screenshots/Axis/multiple-axis-grid-with-single-rule-light-400w.webp index f0ef3f13fc..697e1def92 100644 Binary files a/docs/static/screenshots/Axis/multiple-axis-grid-with-single-rule-light-400w.webp and b/docs/static/screenshots/Axis/multiple-axis-grid-with-single-rule-light-400w.webp differ diff --git a/docs/static/screenshots/Axis/multiple-axis-grid-with-single-rule-light-800w.webp b/docs/static/screenshots/Axis/multiple-axis-grid-with-single-rule-light-800w.webp index 590ad70669..c0c9aab21d 100644 Binary files a/docs/static/screenshots/Axis/multiple-axis-grid-with-single-rule-light-800w.webp and b/docs/static/screenshots/Axis/multiple-axis-grid-with-single-rule-light-800w.webp differ diff --git a/docs/static/screenshots/Axis/multiple-axis-same-placement-bottom-dark-240w.webp b/docs/static/screenshots/Axis/multiple-axis-same-placement-bottom-dark-240w.webp index c7bef4a927..fd8ab5ca54 100644 Binary files a/docs/static/screenshots/Axis/multiple-axis-same-placement-bottom-dark-240w.webp and b/docs/static/screenshots/Axis/multiple-axis-same-placement-bottom-dark-240w.webp differ diff --git a/docs/static/screenshots/Axis/multiple-axis-same-placement-bottom-dark-400w.webp b/docs/static/screenshots/Axis/multiple-axis-same-placement-bottom-dark-400w.webp index e60e4adffd..6d20e100cb 100644 Binary files a/docs/static/screenshots/Axis/multiple-axis-same-placement-bottom-dark-400w.webp and b/docs/static/screenshots/Axis/multiple-axis-same-placement-bottom-dark-400w.webp differ diff --git a/docs/static/screenshots/Axis/multiple-axis-same-placement-bottom-dark-800w.webp b/docs/static/screenshots/Axis/multiple-axis-same-placement-bottom-dark-800w.webp index 5403a7688a..58ba30faac 100644 Binary files a/docs/static/screenshots/Axis/multiple-axis-same-placement-bottom-dark-800w.webp and b/docs/static/screenshots/Axis/multiple-axis-same-placement-bottom-dark-800w.webp differ diff --git a/docs/static/screenshots/Axis/multiple-axis-same-placement-bottom-light-240w.webp b/docs/static/screenshots/Axis/multiple-axis-same-placement-bottom-light-240w.webp index 374aadfe3c..e2f6788bd9 100644 Binary files a/docs/static/screenshots/Axis/multiple-axis-same-placement-bottom-light-240w.webp and b/docs/static/screenshots/Axis/multiple-axis-same-placement-bottom-light-240w.webp differ diff --git a/docs/static/screenshots/Axis/multiple-axis-same-placement-bottom-light-400w.webp b/docs/static/screenshots/Axis/multiple-axis-same-placement-bottom-light-400w.webp index 463e9a3439..d388f1bd40 100644 Binary files a/docs/static/screenshots/Axis/multiple-axis-same-placement-bottom-light-400w.webp and b/docs/static/screenshots/Axis/multiple-axis-same-placement-bottom-light-400w.webp differ diff --git a/docs/static/screenshots/Axis/multiple-axis-same-placement-bottom-light-800w.webp b/docs/static/screenshots/Axis/multiple-axis-same-placement-bottom-light-800w.webp index 410839a038..33450ec644 100644 Binary files a/docs/static/screenshots/Axis/multiple-axis-same-placement-bottom-light-800w.webp and b/docs/static/screenshots/Axis/multiple-axis-same-placement-bottom-light-800w.webp differ diff --git a/docs/static/screenshots/Axis/multiple-axis-same-placement-right-dark-400w.webp b/docs/static/screenshots/Axis/multiple-axis-same-placement-right-dark-400w.webp index 0d47f79599..4f857afac7 100644 Binary files a/docs/static/screenshots/Axis/multiple-axis-same-placement-right-dark-400w.webp and b/docs/static/screenshots/Axis/multiple-axis-same-placement-right-dark-400w.webp differ diff --git a/docs/static/screenshots/Axis/multiple-axis-same-placement-right-dark-800w.webp b/docs/static/screenshots/Axis/multiple-axis-same-placement-right-dark-800w.webp index 2dc7fe0fc8..50fc536f94 100644 Binary files a/docs/static/screenshots/Axis/multiple-axis-same-placement-right-dark-800w.webp and b/docs/static/screenshots/Axis/multiple-axis-same-placement-right-dark-800w.webp differ diff --git a/docs/static/screenshots/Axis/multiple-axis-same-placement-right-light-240w.webp b/docs/static/screenshots/Axis/multiple-axis-same-placement-right-light-240w.webp index 1eb2389a3c..2c556c2068 100644 Binary files a/docs/static/screenshots/Axis/multiple-axis-same-placement-right-light-240w.webp and b/docs/static/screenshots/Axis/multiple-axis-same-placement-right-light-240w.webp differ diff --git a/docs/static/screenshots/Axis/multiple-axis-same-placement-right-light-800w.webp b/docs/static/screenshots/Axis/multiple-axis-same-placement-right-light-800w.webp index dea112e77c..10355dc98b 100644 Binary files a/docs/static/screenshots/Axis/multiple-axis-same-placement-right-light-800w.webp and b/docs/static/screenshots/Axis/multiple-axis-same-placement-right-light-800w.webp differ diff --git a/docs/static/screenshots/Axis/override-axis-ticks-scale-dark-240w.webp b/docs/static/screenshots/Axis/override-axis-ticks-scale-dark-240w.webp index d54e0ef7cb..84248480a1 100644 Binary files a/docs/static/screenshots/Axis/override-axis-ticks-scale-dark-240w.webp and b/docs/static/screenshots/Axis/override-axis-ticks-scale-dark-240w.webp differ diff --git a/docs/static/screenshots/Axis/override-axis-ticks-scale-dark-400w.webp b/docs/static/screenshots/Axis/override-axis-ticks-scale-dark-400w.webp index 4ef220023a..d891464a5b 100644 Binary files a/docs/static/screenshots/Axis/override-axis-ticks-scale-dark-400w.webp and b/docs/static/screenshots/Axis/override-axis-ticks-scale-dark-400w.webp differ diff --git a/docs/static/screenshots/Axis/override-axis-ticks-scale-dark-800w.webp b/docs/static/screenshots/Axis/override-axis-ticks-scale-dark-800w.webp index 7d2e3ef41b..4609a09ba3 100644 Binary files a/docs/static/screenshots/Axis/override-axis-ticks-scale-dark-800w.webp and b/docs/static/screenshots/Axis/override-axis-ticks-scale-dark-800w.webp differ diff --git a/docs/static/screenshots/Axis/override-axis-ticks-scale-light-240w.webp b/docs/static/screenshots/Axis/override-axis-ticks-scale-light-240w.webp index 4b39d4fa16..ee4eeff367 100644 Binary files a/docs/static/screenshots/Axis/override-axis-ticks-scale-light-240w.webp and b/docs/static/screenshots/Axis/override-axis-ticks-scale-light-240w.webp differ diff --git a/docs/static/screenshots/Axis/override-axis-ticks-scale-light-400w.webp b/docs/static/screenshots/Axis/override-axis-ticks-scale-light-400w.webp index 1774fd1d16..ddbe8b61da 100644 Binary files a/docs/static/screenshots/Axis/override-axis-ticks-scale-light-400w.webp and b/docs/static/screenshots/Axis/override-axis-ticks-scale-light-400w.webp differ diff --git a/docs/static/screenshots/Axis/override-axis-ticks-scale-light-800w.webp b/docs/static/screenshots/Axis/override-axis-ticks-scale-light-800w.webp index b71e5d4ed8..b3d4b00911 100644 Binary files a/docs/static/screenshots/Axis/override-axis-ticks-scale-light-800w.webp and b/docs/static/screenshots/Axis/override-axis-ticks-scale-light-800w.webp differ diff --git a/docs/static/screenshots/Axis/placement-bottom-left-dark-240w.webp b/docs/static/screenshots/Axis/placement-bottom-left-dark-240w.webp index 4a1f1f6c08..de5a918b2e 100644 Binary files a/docs/static/screenshots/Axis/placement-bottom-left-dark-240w.webp and b/docs/static/screenshots/Axis/placement-bottom-left-dark-240w.webp differ diff --git a/docs/static/screenshots/Axis/placement-bottom-left-dark-400w.webp b/docs/static/screenshots/Axis/placement-bottom-left-dark-400w.webp index 8e0f9511b4..5e3ad03312 100644 Binary files a/docs/static/screenshots/Axis/placement-bottom-left-dark-400w.webp and b/docs/static/screenshots/Axis/placement-bottom-left-dark-400w.webp differ diff --git a/docs/static/screenshots/Axis/placement-bottom-left-dark-800w.webp b/docs/static/screenshots/Axis/placement-bottom-left-dark-800w.webp index 6c0edf328f..e8c46498a4 100644 Binary files a/docs/static/screenshots/Axis/placement-bottom-left-dark-800w.webp and b/docs/static/screenshots/Axis/placement-bottom-left-dark-800w.webp differ diff --git a/docs/static/screenshots/Axis/placement-bottom-left-light-240w.webp b/docs/static/screenshots/Axis/placement-bottom-left-light-240w.webp index 9da13707e1..d7d3ff320c 100644 Binary files a/docs/static/screenshots/Axis/placement-bottom-left-light-240w.webp and b/docs/static/screenshots/Axis/placement-bottom-left-light-240w.webp differ diff --git a/docs/static/screenshots/Axis/placement-bottom-left-light-400w.webp b/docs/static/screenshots/Axis/placement-bottom-left-light-400w.webp index 1312a6200b..64deda5642 100644 Binary files a/docs/static/screenshots/Axis/placement-bottom-left-light-400w.webp and b/docs/static/screenshots/Axis/placement-bottom-left-light-400w.webp differ diff --git a/docs/static/screenshots/Axis/placement-bottom-left-light-800w.webp b/docs/static/screenshots/Axis/placement-bottom-left-light-800w.webp index 8a1a4f05a2..26cc1b6e76 100644 Binary files a/docs/static/screenshots/Axis/placement-bottom-left-light-800w.webp and b/docs/static/screenshots/Axis/placement-bottom-left-light-800w.webp differ diff --git a/docs/static/screenshots/Axis/placement-bottom-left-rule-dark-240w.webp b/docs/static/screenshots/Axis/placement-bottom-left-rule-dark-240w.webp index fbe215052e..830730be53 100644 Binary files a/docs/static/screenshots/Axis/placement-bottom-left-rule-dark-240w.webp and b/docs/static/screenshots/Axis/placement-bottom-left-rule-dark-240w.webp differ diff --git a/docs/static/screenshots/Axis/placement-bottom-left-rule-dark-400w.webp b/docs/static/screenshots/Axis/placement-bottom-left-rule-dark-400w.webp index 8bcef2e70f..5329f5a05b 100644 Binary files a/docs/static/screenshots/Axis/placement-bottom-left-rule-dark-400w.webp and b/docs/static/screenshots/Axis/placement-bottom-left-rule-dark-400w.webp differ diff --git a/docs/static/screenshots/Axis/placement-bottom-left-rule-dark-800w.webp b/docs/static/screenshots/Axis/placement-bottom-left-rule-dark-800w.webp index 2425f6df9e..6441276c20 100644 Binary files a/docs/static/screenshots/Axis/placement-bottom-left-rule-dark-800w.webp and b/docs/static/screenshots/Axis/placement-bottom-left-rule-dark-800w.webp differ diff --git a/docs/static/screenshots/Axis/placement-bottom-left-rule-light-240w.webp b/docs/static/screenshots/Axis/placement-bottom-left-rule-light-240w.webp index bafdaf28ef..e1cb8db24d 100644 Binary files a/docs/static/screenshots/Axis/placement-bottom-left-rule-light-240w.webp and b/docs/static/screenshots/Axis/placement-bottom-left-rule-light-240w.webp differ diff --git a/docs/static/screenshots/Axis/placement-bottom-left-rule-light-400w.webp b/docs/static/screenshots/Axis/placement-bottom-left-rule-light-400w.webp index 810aff0c6d..ac4954797c 100644 Binary files a/docs/static/screenshots/Axis/placement-bottom-left-rule-light-400w.webp and b/docs/static/screenshots/Axis/placement-bottom-left-rule-light-400w.webp differ diff --git a/docs/static/screenshots/Axis/placement-bottom-left-rule-light-800w.webp b/docs/static/screenshots/Axis/placement-bottom-left-rule-light-800w.webp index 0fd38398fc..7f59da820c 100644 Binary files a/docs/static/screenshots/Axis/placement-bottom-left-rule-light-800w.webp and b/docs/static/screenshots/Axis/placement-bottom-left-rule-light-800w.webp differ diff --git a/docs/static/screenshots/Axis/placement-top-right-dark-240w.webp b/docs/static/screenshots/Axis/placement-top-right-dark-240w.webp index 086d705d29..f9a085e851 100644 Binary files a/docs/static/screenshots/Axis/placement-top-right-dark-240w.webp and b/docs/static/screenshots/Axis/placement-top-right-dark-240w.webp differ diff --git a/docs/static/screenshots/Axis/placement-top-right-dark-400w.webp b/docs/static/screenshots/Axis/placement-top-right-dark-400w.webp index 04bf643c2c..ea12dc3590 100644 Binary files a/docs/static/screenshots/Axis/placement-top-right-dark-400w.webp and b/docs/static/screenshots/Axis/placement-top-right-dark-400w.webp differ diff --git a/docs/static/screenshots/Axis/placement-top-right-dark-800w.webp b/docs/static/screenshots/Axis/placement-top-right-dark-800w.webp index 84321cc665..11c8842145 100644 Binary files a/docs/static/screenshots/Axis/placement-top-right-dark-800w.webp and b/docs/static/screenshots/Axis/placement-top-right-dark-800w.webp differ diff --git a/docs/static/screenshots/Axis/placement-top-right-light-240w.webp b/docs/static/screenshots/Axis/placement-top-right-light-240w.webp index 1c7c911223..d128aa91eb 100644 Binary files a/docs/static/screenshots/Axis/placement-top-right-light-240w.webp and b/docs/static/screenshots/Axis/placement-top-right-light-240w.webp differ diff --git a/docs/static/screenshots/Axis/placement-top-right-light-400w.webp b/docs/static/screenshots/Axis/placement-top-right-light-400w.webp index 66f55e16dd..bcc7b4d3a9 100644 Binary files a/docs/static/screenshots/Axis/placement-top-right-light-400w.webp and b/docs/static/screenshots/Axis/placement-top-right-light-400w.webp differ diff --git a/docs/static/screenshots/Axis/placement-top-right-light-800w.webp b/docs/static/screenshots/Axis/placement-top-right-light-800w.webp index 497bd9e2e0..ead392d1d3 100644 Binary files a/docs/static/screenshots/Axis/placement-top-right-light-800w.webp and b/docs/static/screenshots/Axis/placement-top-right-light-800w.webp differ diff --git a/docs/static/screenshots/Axis/placement-top-right-rule-dark-240w.webp b/docs/static/screenshots/Axis/placement-top-right-rule-dark-240w.webp index 6bf0553607..4c291a7c6f 100644 Binary files a/docs/static/screenshots/Axis/placement-top-right-rule-dark-240w.webp and b/docs/static/screenshots/Axis/placement-top-right-rule-dark-240w.webp differ diff --git a/docs/static/screenshots/Axis/placement-top-right-rule-dark-400w.webp b/docs/static/screenshots/Axis/placement-top-right-rule-dark-400w.webp index f0007c7a9e..b1c0e59197 100644 Binary files a/docs/static/screenshots/Axis/placement-top-right-rule-dark-400w.webp and b/docs/static/screenshots/Axis/placement-top-right-rule-dark-400w.webp differ diff --git a/docs/static/screenshots/Axis/placement-top-right-rule-dark-800w.webp b/docs/static/screenshots/Axis/placement-top-right-rule-dark-800w.webp index 57ce1956e1..4bf0be6c5e 100644 Binary files a/docs/static/screenshots/Axis/placement-top-right-rule-dark-800w.webp and b/docs/static/screenshots/Axis/placement-top-right-rule-dark-800w.webp differ diff --git a/docs/static/screenshots/Axis/placement-top-right-rule-light-240w.webp b/docs/static/screenshots/Axis/placement-top-right-rule-light-240w.webp index 3c715c1cb5..99e1e00633 100644 Binary files a/docs/static/screenshots/Axis/placement-top-right-rule-light-240w.webp and b/docs/static/screenshots/Axis/placement-top-right-rule-light-240w.webp differ diff --git a/docs/static/screenshots/Axis/placement-top-right-rule-light-400w.webp b/docs/static/screenshots/Axis/placement-top-right-rule-light-400w.webp index 4fd3469e17..ec317a1ebf 100644 Binary files a/docs/static/screenshots/Axis/placement-top-right-rule-light-400w.webp and b/docs/static/screenshots/Axis/placement-top-right-rule-light-400w.webp differ diff --git a/docs/static/screenshots/Axis/placement-top-right-rule-light-800w.webp b/docs/static/screenshots/Axis/placement-top-right-rule-light-800w.webp index 8b60f85e11..8355cfe3f7 100644 Binary files a/docs/static/screenshots/Axis/placement-top-right-rule-light-800w.webp and b/docs/static/screenshots/Axis/placement-top-right-rule-light-800w.webp differ diff --git a/docs/static/screenshots/Axis/radial-grid-dark-240w.webp b/docs/static/screenshots/Axis/radial-grid-dark-240w.webp index 6b050a7210..e4a546b3da 100644 Binary files a/docs/static/screenshots/Axis/radial-grid-dark-240w.webp and b/docs/static/screenshots/Axis/radial-grid-dark-240w.webp differ diff --git a/docs/static/screenshots/Axis/radial-grid-dark-400w.webp b/docs/static/screenshots/Axis/radial-grid-dark-400w.webp index 107d7105dd..dd5a5d7553 100644 Binary files a/docs/static/screenshots/Axis/radial-grid-dark-400w.webp and b/docs/static/screenshots/Axis/radial-grid-dark-400w.webp differ diff --git a/docs/static/screenshots/Axis/radial-grid-dark-800w.webp b/docs/static/screenshots/Axis/radial-grid-dark-800w.webp index f6b0900f85..282ad35cc0 100644 Binary files a/docs/static/screenshots/Axis/radial-grid-dark-800w.webp and b/docs/static/screenshots/Axis/radial-grid-dark-800w.webp differ diff --git a/docs/static/screenshots/Axis/radial-grid-light-240w.webp b/docs/static/screenshots/Axis/radial-grid-light-240w.webp index bc41ba3a1a..0d54e2b58d 100644 Binary files a/docs/static/screenshots/Axis/radial-grid-light-240w.webp and b/docs/static/screenshots/Axis/radial-grid-light-240w.webp differ diff --git a/docs/static/screenshots/Axis/radial-grid-light-400w.webp b/docs/static/screenshots/Axis/radial-grid-light-400w.webp index 978e6cfe0f..7119be3764 100644 Binary files a/docs/static/screenshots/Axis/radial-grid-light-400w.webp and b/docs/static/screenshots/Axis/radial-grid-light-400w.webp differ diff --git a/docs/static/screenshots/Axis/radial-grid-light-800w.webp b/docs/static/screenshots/Axis/radial-grid-light-800w.webp index e2025dcbd7..0d4fd10300 100644 Binary files a/docs/static/screenshots/Axis/radial-grid-light-800w.webp and b/docs/static/screenshots/Axis/radial-grid-light-800w.webp differ diff --git a/docs/static/screenshots/Axis/radial-rule-dark-240w.webp b/docs/static/screenshots/Axis/radial-rule-dark-240w.webp index 80abfe2396..8a48054e30 100644 Binary files a/docs/static/screenshots/Axis/radial-rule-dark-240w.webp and b/docs/static/screenshots/Axis/radial-rule-dark-240w.webp differ diff --git a/docs/static/screenshots/Axis/radial-rule-dark-400w.webp b/docs/static/screenshots/Axis/radial-rule-dark-400w.webp index dc2c754af0..a7198f4ac3 100644 Binary files a/docs/static/screenshots/Axis/radial-rule-dark-400w.webp and b/docs/static/screenshots/Axis/radial-rule-dark-400w.webp differ diff --git a/docs/static/screenshots/Axis/radial-rule-dark-800w.webp b/docs/static/screenshots/Axis/radial-rule-dark-800w.webp index 051ae96bd6..d07fe003aa 100644 Binary files a/docs/static/screenshots/Axis/radial-rule-dark-800w.webp and b/docs/static/screenshots/Axis/radial-rule-dark-800w.webp differ diff --git a/docs/static/screenshots/Axis/radial-rule-light-240w.webp b/docs/static/screenshots/Axis/radial-rule-light-240w.webp index 9a89235a95..e5c51aa7e3 100644 Binary files a/docs/static/screenshots/Axis/radial-rule-light-240w.webp and b/docs/static/screenshots/Axis/radial-rule-light-240w.webp differ diff --git a/docs/static/screenshots/Axis/radial-rule-light-400w.webp b/docs/static/screenshots/Axis/radial-rule-light-400w.webp index b8c993afb5..5c8ae30159 100644 Binary files a/docs/static/screenshots/Axis/radial-rule-light-400w.webp and b/docs/static/screenshots/Axis/radial-rule-light-400w.webp differ diff --git a/docs/static/screenshots/Axis/radial-rule-light-800w.webp b/docs/static/screenshots/Axis/radial-rule-light-800w.webp index b79842bcdc..6c89572cd9 100644 Binary files a/docs/static/screenshots/Axis/radial-rule-light-800w.webp and b/docs/static/screenshots/Axis/radial-rule-light-800w.webp differ diff --git a/docs/static/screenshots/Axis/remove-tick-marks-dark-240w.webp b/docs/static/screenshots/Axis/remove-tick-marks-dark-240w.webp index eb4363d131..2a48de0ec0 100644 Binary files a/docs/static/screenshots/Axis/remove-tick-marks-dark-240w.webp and b/docs/static/screenshots/Axis/remove-tick-marks-dark-240w.webp differ diff --git a/docs/static/screenshots/Axis/remove-tick-marks-dark-400w.webp b/docs/static/screenshots/Axis/remove-tick-marks-dark-400w.webp index be3f1a2ed5..86daccef21 100644 Binary files a/docs/static/screenshots/Axis/remove-tick-marks-dark-400w.webp and b/docs/static/screenshots/Axis/remove-tick-marks-dark-400w.webp differ diff --git a/docs/static/screenshots/Axis/remove-tick-marks-dark-800w.webp b/docs/static/screenshots/Axis/remove-tick-marks-dark-800w.webp index 69bc051d18..2cb605858c 100644 Binary files a/docs/static/screenshots/Axis/remove-tick-marks-dark-800w.webp and b/docs/static/screenshots/Axis/remove-tick-marks-dark-800w.webp differ diff --git a/docs/static/screenshots/Axis/remove-tick-marks-light-240w.webp b/docs/static/screenshots/Axis/remove-tick-marks-light-240w.webp index 983c459e46..65991cfa46 100644 Binary files a/docs/static/screenshots/Axis/remove-tick-marks-light-240w.webp and b/docs/static/screenshots/Axis/remove-tick-marks-light-240w.webp differ diff --git a/docs/static/screenshots/Axis/remove-tick-marks-light-400w.webp b/docs/static/screenshots/Axis/remove-tick-marks-light-400w.webp index bf365ff07d..5c293e4013 100644 Binary files a/docs/static/screenshots/Axis/remove-tick-marks-light-400w.webp and b/docs/static/screenshots/Axis/remove-tick-marks-light-400w.webp differ diff --git a/docs/static/screenshots/Axis/remove-tick-marks-light-800w.webp b/docs/static/screenshots/Axis/remove-tick-marks-light-800w.webp index e25917065d..1c34b9403e 100644 Binary files a/docs/static/screenshots/Axis/remove-tick-marks-light-800w.webp and b/docs/static/screenshots/Axis/remove-tick-marks-light-800w.webp differ diff --git a/docs/static/screenshots/Axis/rotate-labels-dark-240w.webp b/docs/static/screenshots/Axis/rotate-labels-dark-240w.webp index 8aed9a42fc..e03c88fbde 100644 Binary files a/docs/static/screenshots/Axis/rotate-labels-dark-240w.webp and b/docs/static/screenshots/Axis/rotate-labels-dark-240w.webp differ diff --git a/docs/static/screenshots/Axis/rotate-labels-dark-400w.webp b/docs/static/screenshots/Axis/rotate-labels-dark-400w.webp index dd1bcc74b2..5f25e29b43 100644 Binary files a/docs/static/screenshots/Axis/rotate-labels-dark-400w.webp and b/docs/static/screenshots/Axis/rotate-labels-dark-400w.webp differ diff --git a/docs/static/screenshots/Axis/rotate-labels-dark-800w.webp b/docs/static/screenshots/Axis/rotate-labels-dark-800w.webp index 9b3e29d7d0..6903e3796e 100644 Binary files a/docs/static/screenshots/Axis/rotate-labels-dark-800w.webp and b/docs/static/screenshots/Axis/rotate-labels-dark-800w.webp differ diff --git a/docs/static/screenshots/Axis/rotate-labels-light-240w.webp b/docs/static/screenshots/Axis/rotate-labels-light-240w.webp index 7795a3b8df..3be45d1308 100644 Binary files a/docs/static/screenshots/Axis/rotate-labels-light-240w.webp and b/docs/static/screenshots/Axis/rotate-labels-light-240w.webp differ diff --git a/docs/static/screenshots/Axis/rotate-labels-light-400w.webp b/docs/static/screenshots/Axis/rotate-labels-light-400w.webp index c791c30b95..2f14c0a7f4 100644 Binary files a/docs/static/screenshots/Axis/rotate-labels-light-400w.webp and b/docs/static/screenshots/Axis/rotate-labels-light-400w.webp differ diff --git a/docs/static/screenshots/Axis/rotate-labels-light-800w.webp b/docs/static/screenshots/Axis/rotate-labels-light-800w.webp index 6187b73647..2d4355ce8c 100644 Binary files a/docs/static/screenshots/Axis/rotate-labels-light-800w.webp and b/docs/static/screenshots/Axis/rotate-labels-light-800w.webp differ diff --git a/docs/static/screenshots/Axis/tick-count-dark-400w.webp b/docs/static/screenshots/Axis/tick-count-dark-400w.webp index d0abedbc1b..e235589d6e 100644 Binary files a/docs/static/screenshots/Axis/tick-count-dark-400w.webp and b/docs/static/screenshots/Axis/tick-count-dark-400w.webp differ diff --git a/docs/static/screenshots/Axis/tick-count-light-800w.webp b/docs/static/screenshots/Axis/tick-count-light-800w.webp index 7dc1050518..f0e4b1da17 100644 Binary files a/docs/static/screenshots/Axis/tick-count-light-800w.webp and b/docs/static/screenshots/Axis/tick-count-light-800w.webp differ diff --git a/docs/static/screenshots/Axis/tick-label-styling-dark-240w.webp b/docs/static/screenshots/Axis/tick-label-styling-dark-240w.webp index 6b2c4242bb..7c186cf3d7 100644 Binary files a/docs/static/screenshots/Axis/tick-label-styling-dark-240w.webp and b/docs/static/screenshots/Axis/tick-label-styling-dark-240w.webp differ diff --git a/docs/static/screenshots/Axis/tick-label-styling-dark-400w.webp b/docs/static/screenshots/Axis/tick-label-styling-dark-400w.webp index f8be64ce62..ee53e1bc27 100644 Binary files a/docs/static/screenshots/Axis/tick-label-styling-dark-400w.webp and b/docs/static/screenshots/Axis/tick-label-styling-dark-400w.webp differ diff --git a/docs/static/screenshots/Axis/tick-label-styling-dark-800w.webp b/docs/static/screenshots/Axis/tick-label-styling-dark-800w.webp index eea310fcf7..b9c852995b 100644 Binary files a/docs/static/screenshots/Axis/tick-label-styling-dark-800w.webp and b/docs/static/screenshots/Axis/tick-label-styling-dark-800w.webp differ diff --git a/docs/static/screenshots/Axis/tick-label-styling-light-240w.webp b/docs/static/screenshots/Axis/tick-label-styling-light-240w.webp index a87c79d118..52fba0b366 100644 Binary files a/docs/static/screenshots/Axis/tick-label-styling-light-240w.webp and b/docs/static/screenshots/Axis/tick-label-styling-light-240w.webp differ diff --git a/docs/static/screenshots/Axis/tick-label-styling-light-400w.webp b/docs/static/screenshots/Axis/tick-label-styling-light-400w.webp index 112984c460..1c20661707 100644 Binary files a/docs/static/screenshots/Axis/tick-label-styling-light-400w.webp and b/docs/static/screenshots/Axis/tick-label-styling-light-400w.webp differ diff --git a/docs/static/screenshots/Axis/tick-label-styling-light-800w.webp b/docs/static/screenshots/Axis/tick-label-styling-light-800w.webp index 37b2e3060c..91e2e054a5 100644 Binary files a/docs/static/screenshots/Axis/tick-label-styling-light-800w.webp and b/docs/static/screenshots/Axis/tick-label-styling-light-800w.webp differ diff --git a/docs/static/screenshots/Axis/time-scale-auto-dark-240w.webp b/docs/static/screenshots/Axis/time-scale-auto-dark-240w.webp index b97e62f022..a28b931bf4 100644 Binary files a/docs/static/screenshots/Axis/time-scale-auto-dark-240w.webp and b/docs/static/screenshots/Axis/time-scale-auto-dark-240w.webp differ diff --git a/docs/static/screenshots/Axis/time-scale-auto-dark-400w.webp b/docs/static/screenshots/Axis/time-scale-auto-dark-400w.webp index 1ed876ce55..1ab7da3c55 100644 Binary files a/docs/static/screenshots/Axis/time-scale-auto-dark-400w.webp and b/docs/static/screenshots/Axis/time-scale-auto-dark-400w.webp differ diff --git a/docs/static/screenshots/Axis/time-scale-auto-dark-800w.webp b/docs/static/screenshots/Axis/time-scale-auto-dark-800w.webp index 349a551429..df48d2deaa 100644 Binary files a/docs/static/screenshots/Axis/time-scale-auto-dark-800w.webp and b/docs/static/screenshots/Axis/time-scale-auto-dark-800w.webp differ diff --git a/docs/static/screenshots/Axis/time-scale-auto-format-filtering-dark-240w.webp b/docs/static/screenshots/Axis/time-scale-auto-format-filtering-dark-240w.webp index 6fac7fe6ad..0e4b06511a 100644 Binary files a/docs/static/screenshots/Axis/time-scale-auto-format-filtering-dark-240w.webp and b/docs/static/screenshots/Axis/time-scale-auto-format-filtering-dark-240w.webp differ diff --git a/docs/static/screenshots/Axis/time-scale-auto-format-filtering-dark-400w.webp b/docs/static/screenshots/Axis/time-scale-auto-format-filtering-dark-400w.webp index 6146a89b72..f127ff6019 100644 Binary files a/docs/static/screenshots/Axis/time-scale-auto-format-filtering-dark-400w.webp and b/docs/static/screenshots/Axis/time-scale-auto-format-filtering-dark-400w.webp differ diff --git a/docs/static/screenshots/Axis/time-scale-auto-format-filtering-dark-800w.webp b/docs/static/screenshots/Axis/time-scale-auto-format-filtering-dark-800w.webp index 54b2f74b03..dd9e9f650b 100644 Binary files a/docs/static/screenshots/Axis/time-scale-auto-format-filtering-dark-800w.webp and b/docs/static/screenshots/Axis/time-scale-auto-format-filtering-dark-800w.webp differ diff --git a/docs/static/screenshots/Axis/time-scale-auto-format-filtering-light-240w.webp b/docs/static/screenshots/Axis/time-scale-auto-format-filtering-light-240w.webp index 76ce03466d..a831f77e34 100644 Binary files a/docs/static/screenshots/Axis/time-scale-auto-format-filtering-light-240w.webp and b/docs/static/screenshots/Axis/time-scale-auto-format-filtering-light-240w.webp differ diff --git a/docs/static/screenshots/Axis/time-scale-auto-format-filtering-light-400w.webp b/docs/static/screenshots/Axis/time-scale-auto-format-filtering-light-400w.webp index 59bc1040fd..115ff5c69e 100644 Binary files a/docs/static/screenshots/Axis/time-scale-auto-format-filtering-light-400w.webp and b/docs/static/screenshots/Axis/time-scale-auto-format-filtering-light-400w.webp differ diff --git a/docs/static/screenshots/Axis/time-scale-auto-format-filtering-light-800w.webp b/docs/static/screenshots/Axis/time-scale-auto-format-filtering-light-800w.webp index d2729d0f29..166594a6cb 100644 Binary files a/docs/static/screenshots/Axis/time-scale-auto-format-filtering-light-800w.webp and b/docs/static/screenshots/Axis/time-scale-auto-format-filtering-light-800w.webp differ diff --git a/docs/static/screenshots/Axis/time-scale-auto-light-240w.webp b/docs/static/screenshots/Axis/time-scale-auto-light-240w.webp index 74a8d7134e..68aa694cf7 100644 Binary files a/docs/static/screenshots/Axis/time-scale-auto-light-240w.webp and b/docs/static/screenshots/Axis/time-scale-auto-light-240w.webp differ diff --git a/docs/static/screenshots/Axis/time-scale-auto-light-400w.webp b/docs/static/screenshots/Axis/time-scale-auto-light-400w.webp index 41718c808f..316818ad0a 100644 Binary files a/docs/static/screenshots/Axis/time-scale-auto-light-400w.webp and b/docs/static/screenshots/Axis/time-scale-auto-light-400w.webp differ diff --git a/docs/static/screenshots/Axis/time-scale-auto-light-800w.webp b/docs/static/screenshots/Axis/time-scale-auto-light-800w.webp index 636763acf1..547d4d3312 100644 Binary files a/docs/static/screenshots/Axis/time-scale-auto-light-800w.webp and b/docs/static/screenshots/Axis/time-scale-auto-light-800w.webp differ diff --git a/docs/static/screenshots/Axis/time-scale-auto-multiline-dark-240w.webp b/docs/static/screenshots/Axis/time-scale-auto-multiline-dark-240w.webp index e218f45721..6df278ae88 100644 Binary files a/docs/static/screenshots/Axis/time-scale-auto-multiline-dark-240w.webp and b/docs/static/screenshots/Axis/time-scale-auto-multiline-dark-240w.webp differ diff --git a/docs/static/screenshots/Axis/time-scale-auto-multiline-dark-400w.webp b/docs/static/screenshots/Axis/time-scale-auto-multiline-dark-400w.webp index d19458e04f..6d96302b21 100644 Binary files a/docs/static/screenshots/Axis/time-scale-auto-multiline-dark-400w.webp and b/docs/static/screenshots/Axis/time-scale-auto-multiline-dark-400w.webp differ diff --git a/docs/static/screenshots/Axis/time-scale-auto-multiline-dark-800w.webp b/docs/static/screenshots/Axis/time-scale-auto-multiline-dark-800w.webp index 5fd22938b4..dc89a6f2a1 100644 Binary files a/docs/static/screenshots/Axis/time-scale-auto-multiline-dark-800w.webp and b/docs/static/screenshots/Axis/time-scale-auto-multiline-dark-800w.webp differ diff --git a/docs/static/screenshots/Axis/time-scale-auto-multiline-light-240w.webp b/docs/static/screenshots/Axis/time-scale-auto-multiline-light-240w.webp index c9f255b473..d2152dfd39 100644 Binary files a/docs/static/screenshots/Axis/time-scale-auto-multiline-light-240w.webp and b/docs/static/screenshots/Axis/time-scale-auto-multiline-light-240w.webp differ diff --git a/docs/static/screenshots/Axis/time-scale-auto-multiline-light-400w.webp b/docs/static/screenshots/Axis/time-scale-auto-multiline-light-400w.webp index 0fe6184b95..f8fd577428 100644 Binary files a/docs/static/screenshots/Axis/time-scale-auto-multiline-light-400w.webp and b/docs/static/screenshots/Axis/time-scale-auto-multiline-light-400w.webp differ diff --git a/docs/static/screenshots/Axis/time-scale-auto-multiline-light-800w.webp b/docs/static/screenshots/Axis/time-scale-auto-multiline-light-800w.webp index 49206cc4c7..30acc49d28 100644 Binary files a/docs/static/screenshots/Axis/time-scale-auto-multiline-light-800w.webp and b/docs/static/screenshots/Axis/time-scale-auto-multiline-light-800w.webp differ diff --git a/docs/static/screenshots/Axis/time-scale-brush-dark-240w.webp b/docs/static/screenshots/Axis/time-scale-brush-dark-240w.webp index c3e79bdc52..173ee73338 100644 Binary files a/docs/static/screenshots/Axis/time-scale-brush-dark-240w.webp and b/docs/static/screenshots/Axis/time-scale-brush-dark-240w.webp differ diff --git a/docs/static/screenshots/Axis/time-scale-brush-dark-400w.webp b/docs/static/screenshots/Axis/time-scale-brush-dark-400w.webp index 79345a21a7..8f1373fa90 100644 Binary files a/docs/static/screenshots/Axis/time-scale-brush-dark-400w.webp and b/docs/static/screenshots/Axis/time-scale-brush-dark-400w.webp differ diff --git a/docs/static/screenshots/Axis/time-scale-brush-dark-800w.webp b/docs/static/screenshots/Axis/time-scale-brush-dark-800w.webp index 7402609040..f933ee4e2a 100644 Binary files a/docs/static/screenshots/Axis/time-scale-brush-dark-800w.webp and b/docs/static/screenshots/Axis/time-scale-brush-dark-800w.webp differ diff --git a/docs/static/screenshots/Axis/time-scale-brush-light-240w.webp b/docs/static/screenshots/Axis/time-scale-brush-light-240w.webp index 31c3269cb3..6a46b1e30f 100644 Binary files a/docs/static/screenshots/Axis/time-scale-brush-light-240w.webp and b/docs/static/screenshots/Axis/time-scale-brush-light-240w.webp differ diff --git a/docs/static/screenshots/Axis/time-scale-brush-light-400w.webp b/docs/static/screenshots/Axis/time-scale-brush-light-400w.webp index 0065383369..923127a66a 100644 Binary files a/docs/static/screenshots/Axis/time-scale-brush-light-400w.webp and b/docs/static/screenshots/Axis/time-scale-brush-light-400w.webp differ diff --git a/docs/static/screenshots/Axis/time-scale-brush-light-800w.webp b/docs/static/screenshots/Axis/time-scale-brush-light-800w.webp index a2e93d6e9d..e9350ff2b8 100644 Binary files a/docs/static/screenshots/Axis/time-scale-brush-light-800w.webp and b/docs/static/screenshots/Axis/time-scale-brush-light-800w.webp differ diff --git a/docs/static/screenshots/Axis/time-scale-brush-multiline-dark-240w.webp b/docs/static/screenshots/Axis/time-scale-brush-multiline-dark-240w.webp index 7e6f22e7d1..6252e44b46 100644 Binary files a/docs/static/screenshots/Axis/time-scale-brush-multiline-dark-240w.webp and b/docs/static/screenshots/Axis/time-scale-brush-multiline-dark-240w.webp differ diff --git a/docs/static/screenshots/Axis/time-scale-brush-multiline-dark-400w.webp b/docs/static/screenshots/Axis/time-scale-brush-multiline-dark-400w.webp index fc1fa14e71..c056c0f0ad 100644 Binary files a/docs/static/screenshots/Axis/time-scale-brush-multiline-dark-400w.webp and b/docs/static/screenshots/Axis/time-scale-brush-multiline-dark-400w.webp differ diff --git a/docs/static/screenshots/Axis/time-scale-brush-multiline-dark-800w.webp b/docs/static/screenshots/Axis/time-scale-brush-multiline-dark-800w.webp index e00edd08e4..2168768c4c 100644 Binary files a/docs/static/screenshots/Axis/time-scale-brush-multiline-dark-800w.webp and b/docs/static/screenshots/Axis/time-scale-brush-multiline-dark-800w.webp differ diff --git a/docs/static/screenshots/Axis/time-scale-brush-multiline-light-240w.webp b/docs/static/screenshots/Axis/time-scale-brush-multiline-light-240w.webp index 0ec6082926..58fadad491 100644 Binary files a/docs/static/screenshots/Axis/time-scale-brush-multiline-light-240w.webp and b/docs/static/screenshots/Axis/time-scale-brush-multiline-light-240w.webp differ diff --git a/docs/static/screenshots/Axis/time-scale-brush-multiline-light-400w.webp b/docs/static/screenshots/Axis/time-scale-brush-multiline-light-400w.webp index 1a6010dd1f..05e7dda4a8 100644 Binary files a/docs/static/screenshots/Axis/time-scale-brush-multiline-light-400w.webp and b/docs/static/screenshots/Axis/time-scale-brush-multiline-light-400w.webp differ diff --git a/docs/static/screenshots/Axis/time-scale-brush-multiline-light-800w.webp b/docs/static/screenshots/Axis/time-scale-brush-multiline-light-800w.webp index a0d4176a38..3346021d0e 100644 Binary files a/docs/static/screenshots/Axis/time-scale-brush-multiline-light-800w.webp and b/docs/static/screenshots/Axis/time-scale-brush-multiline-light-800w.webp differ diff --git a/docs/static/screenshots/Axis/time-scale-explicit-dark-240w.webp b/docs/static/screenshots/Axis/time-scale-explicit-dark-240w.webp index e9718340a8..a9a0c122e8 100644 Binary files a/docs/static/screenshots/Axis/time-scale-explicit-dark-240w.webp and b/docs/static/screenshots/Axis/time-scale-explicit-dark-240w.webp differ diff --git a/docs/static/screenshots/Axis/time-scale-explicit-dark-400w.webp b/docs/static/screenshots/Axis/time-scale-explicit-dark-400w.webp index 7fb10cb06f..18cad6394e 100644 Binary files a/docs/static/screenshots/Axis/time-scale-explicit-dark-400w.webp and b/docs/static/screenshots/Axis/time-scale-explicit-dark-400w.webp differ diff --git a/docs/static/screenshots/Axis/time-scale-explicit-dark-800w.webp b/docs/static/screenshots/Axis/time-scale-explicit-dark-800w.webp index ab7d629bef..3c4a6b6922 100644 Binary files a/docs/static/screenshots/Axis/time-scale-explicit-dark-800w.webp and b/docs/static/screenshots/Axis/time-scale-explicit-dark-800w.webp differ diff --git a/docs/static/screenshots/Axis/time-scale-explicit-light-240w.webp b/docs/static/screenshots/Axis/time-scale-explicit-light-240w.webp index d601decb4f..5d6bb18ec3 100644 Binary files a/docs/static/screenshots/Axis/time-scale-explicit-light-240w.webp and b/docs/static/screenshots/Axis/time-scale-explicit-light-240w.webp differ diff --git a/docs/static/screenshots/Axis/time-scale-explicit-light-400w.webp b/docs/static/screenshots/Axis/time-scale-explicit-light-400w.webp index 9c70c05f89..4b8d5daf9b 100644 Binary files a/docs/static/screenshots/Axis/time-scale-explicit-light-400w.webp and b/docs/static/screenshots/Axis/time-scale-explicit-light-400w.webp differ diff --git a/docs/static/screenshots/Axis/time-scale-explicit-light-800w.webp b/docs/static/screenshots/Axis/time-scale-explicit-light-800w.webp index dc40bb35d8..d870674300 100644 Binary files a/docs/static/screenshots/Axis/time-scale-explicit-light-800w.webp and b/docs/static/screenshots/Axis/time-scale-explicit-light-800w.webp differ diff --git a/docs/static/screenshots/Axis/time-scale-explicit-multiline-dark-240w.webp b/docs/static/screenshots/Axis/time-scale-explicit-multiline-dark-240w.webp index 3c5e4d4ded..47f51e590e 100644 Binary files a/docs/static/screenshots/Axis/time-scale-explicit-multiline-dark-240w.webp and b/docs/static/screenshots/Axis/time-scale-explicit-multiline-dark-240w.webp differ diff --git a/docs/static/screenshots/Axis/time-scale-explicit-multiline-dark-400w.webp b/docs/static/screenshots/Axis/time-scale-explicit-multiline-dark-400w.webp index 13e2a89c67..1a7d352597 100644 Binary files a/docs/static/screenshots/Axis/time-scale-explicit-multiline-dark-400w.webp and b/docs/static/screenshots/Axis/time-scale-explicit-multiline-dark-400w.webp differ diff --git a/docs/static/screenshots/Axis/time-scale-explicit-multiline-dark-800w.webp b/docs/static/screenshots/Axis/time-scale-explicit-multiline-dark-800w.webp index 65efa8cadd..19277a3b4f 100644 Binary files a/docs/static/screenshots/Axis/time-scale-explicit-multiline-dark-800w.webp and b/docs/static/screenshots/Axis/time-scale-explicit-multiline-dark-800w.webp differ diff --git a/docs/static/screenshots/Axis/time-scale-explicit-multiline-light-240w.webp b/docs/static/screenshots/Axis/time-scale-explicit-multiline-light-240w.webp index eabcc6006f..a718dbf325 100644 Binary files a/docs/static/screenshots/Axis/time-scale-explicit-multiline-light-240w.webp and b/docs/static/screenshots/Axis/time-scale-explicit-multiline-light-240w.webp differ diff --git a/docs/static/screenshots/Axis/time-scale-explicit-multiline-light-400w.webp b/docs/static/screenshots/Axis/time-scale-explicit-multiline-light-400w.webp index 1ccb6c1b93..ed5b20d9da 100644 Binary files a/docs/static/screenshots/Axis/time-scale-explicit-multiline-light-400w.webp and b/docs/static/screenshots/Axis/time-scale-explicit-multiline-light-400w.webp differ diff --git a/docs/static/screenshots/Axis/time-scale-explicit-multiline-light-800w.webp b/docs/static/screenshots/Axis/time-scale-explicit-multiline-light-800w.webp index c9a940ea17..a8edb7f533 100644 Binary files a/docs/static/screenshots/Axis/time-scale-explicit-multiline-light-800w.webp and b/docs/static/screenshots/Axis/time-scale-explicit-multiline-light-800w.webp differ diff --git a/docs/static/screenshots/Axis/utc-scale-dark-240w.webp b/docs/static/screenshots/Axis/utc-scale-dark-240w.webp new file mode 100644 index 0000000000..c6b6947784 Binary files /dev/null and b/docs/static/screenshots/Axis/utc-scale-dark-240w.webp differ diff --git a/docs/static/screenshots/Axis/utc-scale-dark-400w.webp b/docs/static/screenshots/Axis/utc-scale-dark-400w.webp new file mode 100644 index 0000000000..e71159f2da Binary files /dev/null and b/docs/static/screenshots/Axis/utc-scale-dark-400w.webp differ diff --git a/docs/static/screenshots/Axis/utc-scale-dark-800w.webp b/docs/static/screenshots/Axis/utc-scale-dark-800w.webp new file mode 100644 index 0000000000..cf10791627 Binary files /dev/null and b/docs/static/screenshots/Axis/utc-scale-dark-800w.webp differ diff --git a/docs/static/screenshots/Axis/utc-scale-light-240w.webp b/docs/static/screenshots/Axis/utc-scale-light-240w.webp new file mode 100644 index 0000000000..a8d31438f6 Binary files /dev/null and b/docs/static/screenshots/Axis/utc-scale-light-240w.webp differ diff --git a/docs/static/screenshots/Axis/utc-scale-light-400w.webp b/docs/static/screenshots/Axis/utc-scale-light-400w.webp new file mode 100644 index 0000000000..64106ce650 Binary files /dev/null and b/docs/static/screenshots/Axis/utc-scale-light-400w.webp differ diff --git a/docs/static/screenshots/Axis/utc-scale-light-800w.webp b/docs/static/screenshots/Axis/utc-scale-light-800w.webp new file mode 100644 index 0000000000..bd1802d61d Binary files /dev/null and b/docs/static/screenshots/Axis/utc-scale-light-800w.webp differ diff --git a/docs/static/screenshots/BarChart/axis-labels-inside-bars-dark-240w.webp b/docs/static/screenshots/BarChart/axis-labels-inside-bars-dark-240w.webp index 2d0ba89a9c..075814d168 100644 Binary files a/docs/static/screenshots/BarChart/axis-labels-inside-bars-dark-240w.webp and b/docs/static/screenshots/BarChart/axis-labels-inside-bars-dark-240w.webp differ diff --git a/docs/static/screenshots/BarChart/axis-labels-inside-bars-dark-400w.webp b/docs/static/screenshots/BarChart/axis-labels-inside-bars-dark-400w.webp index 656c80b315..9410ffe407 100644 Binary files a/docs/static/screenshots/BarChart/axis-labels-inside-bars-dark-400w.webp and b/docs/static/screenshots/BarChart/axis-labels-inside-bars-dark-400w.webp differ diff --git a/docs/static/screenshots/BarChart/axis-labels-inside-bars-dark-800w.webp b/docs/static/screenshots/BarChart/axis-labels-inside-bars-dark-800w.webp index 55fee55264..04f32d62aa 100644 Binary files a/docs/static/screenshots/BarChart/axis-labels-inside-bars-dark-800w.webp and b/docs/static/screenshots/BarChart/axis-labels-inside-bars-dark-800w.webp differ diff --git a/docs/static/screenshots/BarChart/axis-labels-inside-bars-light-240w.webp b/docs/static/screenshots/BarChart/axis-labels-inside-bars-light-240w.webp index 2d32931f12..e1259ac2c3 100644 Binary files a/docs/static/screenshots/BarChart/axis-labels-inside-bars-light-240w.webp and b/docs/static/screenshots/BarChart/axis-labels-inside-bars-light-240w.webp differ diff --git a/docs/static/screenshots/BarChart/axis-labels-inside-bars-light-400w.webp b/docs/static/screenshots/BarChart/axis-labels-inside-bars-light-400w.webp index cb74bba56f..f0a9112c72 100644 Binary files a/docs/static/screenshots/BarChart/axis-labels-inside-bars-light-400w.webp and b/docs/static/screenshots/BarChart/axis-labels-inside-bars-light-400w.webp differ diff --git a/docs/static/screenshots/BarChart/axis-labels-inside-bars-light-800w.webp b/docs/static/screenshots/BarChart/axis-labels-inside-bars-light-800w.webp index a89d209600..ab1a13953a 100644 Binary files a/docs/static/screenshots/BarChart/axis-labels-inside-bars-light-800w.webp and b/docs/static/screenshots/BarChart/axis-labels-inside-bars-light-800w.webp differ diff --git a/docs/static/screenshots/BarChart/axis-labels-inside-bars-using-labels-dark-240w.webp b/docs/static/screenshots/BarChart/axis-labels-inside-bars-using-labels-dark-240w.webp index 3f4a588e56..365ff70386 100644 Binary files a/docs/static/screenshots/BarChart/axis-labels-inside-bars-using-labels-dark-240w.webp and b/docs/static/screenshots/BarChart/axis-labels-inside-bars-using-labels-dark-240w.webp differ diff --git a/docs/static/screenshots/BarChart/axis-labels-inside-bars-using-labels-dark-400w.webp b/docs/static/screenshots/BarChart/axis-labels-inside-bars-using-labels-dark-400w.webp index 3214c7ffa4..2aa3d5b7d2 100644 Binary files a/docs/static/screenshots/BarChart/axis-labels-inside-bars-using-labels-dark-400w.webp and b/docs/static/screenshots/BarChart/axis-labels-inside-bars-using-labels-dark-400w.webp differ diff --git a/docs/static/screenshots/BarChart/axis-labels-inside-bars-using-labels-dark-800w.webp b/docs/static/screenshots/BarChart/axis-labels-inside-bars-using-labels-dark-800w.webp index b3a097fe1c..2e8de9c78f 100644 Binary files a/docs/static/screenshots/BarChart/axis-labels-inside-bars-using-labels-dark-800w.webp and b/docs/static/screenshots/BarChart/axis-labels-inside-bars-using-labels-dark-800w.webp differ diff --git a/docs/static/screenshots/BarChart/axis-labels-inside-bars-using-labels-light-240w.webp b/docs/static/screenshots/BarChart/axis-labels-inside-bars-using-labels-light-240w.webp index 321bffa8a4..0be838e4cb 100644 Binary files a/docs/static/screenshots/BarChart/axis-labels-inside-bars-using-labels-light-240w.webp and b/docs/static/screenshots/BarChart/axis-labels-inside-bars-using-labels-light-240w.webp differ diff --git a/docs/static/screenshots/BarChart/axis-labels-inside-bars-using-labels-light-400w.webp b/docs/static/screenshots/BarChart/axis-labels-inside-bars-using-labels-light-400w.webp index a6216d7794..861168569f 100644 Binary files a/docs/static/screenshots/BarChart/axis-labels-inside-bars-using-labels-light-400w.webp and b/docs/static/screenshots/BarChart/axis-labels-inside-bars-using-labels-light-400w.webp differ diff --git a/docs/static/screenshots/BarChart/axis-labels-inside-bars-using-labels-light-800w.webp b/docs/static/screenshots/BarChart/axis-labels-inside-bars-using-labels-light-800w.webp index 594b8ed2e0..0a34ea0a4e 100644 Binary files a/docs/static/screenshots/BarChart/axis-labels-inside-bars-using-labels-light-800w.webp and b/docs/static/screenshots/BarChart/axis-labels-inside-bars-using-labels-light-800w.webp differ diff --git a/docs/static/screenshots/BarChart/both-axis-grid-align-between-dark-240w.webp b/docs/static/screenshots/BarChart/both-axis-grid-align-between-dark-240w.webp index bffbf747a9..c00eeabc7a 100644 Binary files a/docs/static/screenshots/BarChart/both-axis-grid-align-between-dark-240w.webp and b/docs/static/screenshots/BarChart/both-axis-grid-align-between-dark-240w.webp differ diff --git a/docs/static/screenshots/BarChart/both-axis-grid-align-between-dark-400w.webp b/docs/static/screenshots/BarChart/both-axis-grid-align-between-dark-400w.webp index a4953d8692..cb9c693bc3 100644 Binary files a/docs/static/screenshots/BarChart/both-axis-grid-align-between-dark-400w.webp and b/docs/static/screenshots/BarChart/both-axis-grid-align-between-dark-400w.webp differ diff --git a/docs/static/screenshots/BarChart/both-axis-grid-align-between-dark-800w.webp b/docs/static/screenshots/BarChart/both-axis-grid-align-between-dark-800w.webp index cceac703f5..a9dfd7c0d6 100644 Binary files a/docs/static/screenshots/BarChart/both-axis-grid-align-between-dark-800w.webp and b/docs/static/screenshots/BarChart/both-axis-grid-align-between-dark-800w.webp differ diff --git a/docs/static/screenshots/BarChart/both-axis-grid-align-between-light-240w.webp b/docs/static/screenshots/BarChart/both-axis-grid-align-between-light-240w.webp index 5adf44338e..4c9c908005 100644 Binary files a/docs/static/screenshots/BarChart/both-axis-grid-align-between-light-240w.webp and b/docs/static/screenshots/BarChart/both-axis-grid-align-between-light-240w.webp differ diff --git a/docs/static/screenshots/BarChart/both-axis-grid-align-between-light-400w.webp b/docs/static/screenshots/BarChart/both-axis-grid-align-between-light-400w.webp index ff88897a9a..ea0f7c95a0 100644 Binary files a/docs/static/screenshots/BarChart/both-axis-grid-align-between-light-400w.webp and b/docs/static/screenshots/BarChart/both-axis-grid-align-between-light-400w.webp differ diff --git a/docs/static/screenshots/BarChart/both-axis-grid-align-between-light-800w.webp b/docs/static/screenshots/BarChart/both-axis-grid-align-between-light-800w.webp index 15ec7656fe..3d52d8be2f 100644 Binary files a/docs/static/screenshots/BarChart/both-axis-grid-align-between-light-800w.webp and b/docs/static/screenshots/BarChart/both-axis-grid-align-between-light-800w.webp differ diff --git a/docs/static/screenshots/BarChart/both-axis-grid-dark-240w.webp b/docs/static/screenshots/BarChart/both-axis-grid-dark-240w.webp index bc1a55aaec..a2b48d3846 100644 Binary files a/docs/static/screenshots/BarChart/both-axis-grid-dark-240w.webp and b/docs/static/screenshots/BarChart/both-axis-grid-dark-240w.webp differ diff --git a/docs/static/screenshots/BarChart/both-axis-grid-dark-400w.webp b/docs/static/screenshots/BarChart/both-axis-grid-dark-400w.webp index 500e8d11fd..7f0c03a5a3 100644 Binary files a/docs/static/screenshots/BarChart/both-axis-grid-dark-400w.webp and b/docs/static/screenshots/BarChart/both-axis-grid-dark-400w.webp differ diff --git a/docs/static/screenshots/BarChart/both-axis-grid-dark-800w.webp b/docs/static/screenshots/BarChart/both-axis-grid-dark-800w.webp index d91009b95b..c68cf68645 100644 Binary files a/docs/static/screenshots/BarChart/both-axis-grid-dark-800w.webp and b/docs/static/screenshots/BarChart/both-axis-grid-dark-800w.webp differ diff --git a/docs/static/screenshots/BarChart/both-axis-grid-light-240w.webp b/docs/static/screenshots/BarChart/both-axis-grid-light-240w.webp index 4618437df1..87482ca8a0 100644 Binary files a/docs/static/screenshots/BarChart/both-axis-grid-light-240w.webp and b/docs/static/screenshots/BarChart/both-axis-grid-light-240w.webp differ diff --git a/docs/static/screenshots/BarChart/both-axis-grid-light-400w.webp b/docs/static/screenshots/BarChart/both-axis-grid-light-400w.webp index 2a64e28079..4b887b18c2 100644 Binary files a/docs/static/screenshots/BarChart/both-axis-grid-light-400w.webp and b/docs/static/screenshots/BarChart/both-axis-grid-light-400w.webp differ diff --git a/docs/static/screenshots/BarChart/both-axis-grid-light-800w.webp b/docs/static/screenshots/BarChart/both-axis-grid-light-800w.webp index 3253c451a1..03d353c0a3 100644 Binary files a/docs/static/screenshots/BarChart/both-axis-grid-light-800w.webp and b/docs/static/screenshots/BarChart/both-axis-grid-light-800w.webp differ diff --git a/docs/static/screenshots/BarChart/brush-band-dark-240w.webp b/docs/static/screenshots/BarChart/brush-band-dark-240w.webp index 19455a33df..a85f975b56 100644 Binary files a/docs/static/screenshots/BarChart/brush-band-dark-240w.webp and b/docs/static/screenshots/BarChart/brush-band-dark-240w.webp differ diff --git a/docs/static/screenshots/BarChart/brush-band-dark-400w.webp b/docs/static/screenshots/BarChart/brush-band-dark-400w.webp index 8bafe18d9f..7c56e9c649 100644 Binary files a/docs/static/screenshots/BarChart/brush-band-dark-400w.webp and b/docs/static/screenshots/BarChart/brush-band-dark-400w.webp differ diff --git a/docs/static/screenshots/BarChart/brush-band-dark-800w.webp b/docs/static/screenshots/BarChart/brush-band-dark-800w.webp index 7898d62586..ba9457b4f3 100644 Binary files a/docs/static/screenshots/BarChart/brush-band-dark-800w.webp and b/docs/static/screenshots/BarChart/brush-band-dark-800w.webp differ diff --git a/docs/static/screenshots/BarChart/brush-band-light-240w.webp b/docs/static/screenshots/BarChart/brush-band-light-240w.webp index d27b2aa565..8323d7180d 100644 Binary files a/docs/static/screenshots/BarChart/brush-band-light-240w.webp and b/docs/static/screenshots/BarChart/brush-band-light-240w.webp differ diff --git a/docs/static/screenshots/BarChart/brush-band-light-400w.webp b/docs/static/screenshots/BarChart/brush-band-light-400w.webp index db376a45b0..0a81c3b96a 100644 Binary files a/docs/static/screenshots/BarChart/brush-band-light-400w.webp and b/docs/static/screenshots/BarChart/brush-band-light-400w.webp differ diff --git a/docs/static/screenshots/BarChart/brush-band-light-800w.webp b/docs/static/screenshots/BarChart/brush-band-light-800w.webp index a25ce19f45..f7e8117c1e 100644 Binary files a/docs/static/screenshots/BarChart/brush-band-light-800w.webp and b/docs/static/screenshots/BarChart/brush-band-light-800w.webp differ diff --git a/docs/static/screenshots/BarChart/brush-dark-240w.webp b/docs/static/screenshots/BarChart/brush-dark-240w.webp index 4bc6135407..ed142d6dc9 100644 Binary files a/docs/static/screenshots/BarChart/brush-dark-240w.webp and b/docs/static/screenshots/BarChart/brush-dark-240w.webp differ diff --git a/docs/static/screenshots/BarChart/brush-dark-400w.webp b/docs/static/screenshots/BarChart/brush-dark-400w.webp index bc3a965e84..4e7696bd5f 100644 Binary files a/docs/static/screenshots/BarChart/brush-dark-400w.webp and b/docs/static/screenshots/BarChart/brush-dark-400w.webp differ diff --git a/docs/static/screenshots/BarChart/brush-dark-800w.webp b/docs/static/screenshots/BarChart/brush-dark-800w.webp index 6096b62093..82a07fd209 100644 Binary files a/docs/static/screenshots/BarChart/brush-dark-800w.webp and b/docs/static/screenshots/BarChart/brush-dark-800w.webp differ diff --git a/docs/static/screenshots/BarChart/brush-light-240w.webp b/docs/static/screenshots/BarChart/brush-light-240w.webp index 95dbdaf6d0..71459c296e 100644 Binary files a/docs/static/screenshots/BarChart/brush-light-240w.webp and b/docs/static/screenshots/BarChart/brush-light-240w.webp differ diff --git a/docs/static/screenshots/BarChart/brush-light-400w.webp b/docs/static/screenshots/BarChart/brush-light-400w.webp index 7617fe46c8..05739d9bd4 100644 Binary files a/docs/static/screenshots/BarChart/brush-light-400w.webp and b/docs/static/screenshots/BarChart/brush-light-400w.webp differ diff --git a/docs/static/screenshots/BarChart/brush-light-800w.webp b/docs/static/screenshots/BarChart/brush-light-800w.webp index 6c6c04377a..c68eb7d86f 100644 Binary files a/docs/static/screenshots/BarChart/brush-light-800w.webp and b/docs/static/screenshots/BarChart/brush-light-800w.webp differ diff --git a/docs/static/screenshots/BarChart/brush-pan-zoom-band-dark-240w.webp b/docs/static/screenshots/BarChart/brush-pan-zoom-band-dark-240w.webp index 1a76cc5253..10bae416fc 100644 Binary files a/docs/static/screenshots/BarChart/brush-pan-zoom-band-dark-240w.webp and b/docs/static/screenshots/BarChart/brush-pan-zoom-band-dark-240w.webp differ diff --git a/docs/static/screenshots/BarChart/brush-pan-zoom-band-dark-400w.webp b/docs/static/screenshots/BarChart/brush-pan-zoom-band-dark-400w.webp index 9a1a5e4cd3..52402b37ce 100644 Binary files a/docs/static/screenshots/BarChart/brush-pan-zoom-band-dark-400w.webp and b/docs/static/screenshots/BarChart/brush-pan-zoom-band-dark-400w.webp differ diff --git a/docs/static/screenshots/BarChart/brush-pan-zoom-band-dark-800w.webp b/docs/static/screenshots/BarChart/brush-pan-zoom-band-dark-800w.webp index 06666d98dd..9bffc94e99 100644 Binary files a/docs/static/screenshots/BarChart/brush-pan-zoom-band-dark-800w.webp and b/docs/static/screenshots/BarChart/brush-pan-zoom-band-dark-800w.webp differ diff --git a/docs/static/screenshots/BarChart/brush-pan-zoom-band-light-240w.webp b/docs/static/screenshots/BarChart/brush-pan-zoom-band-light-240w.webp index affc3da529..ef840718bb 100644 Binary files a/docs/static/screenshots/BarChart/brush-pan-zoom-band-light-240w.webp and b/docs/static/screenshots/BarChart/brush-pan-zoom-band-light-240w.webp differ diff --git a/docs/static/screenshots/BarChart/brush-pan-zoom-band-light-400w.webp b/docs/static/screenshots/BarChart/brush-pan-zoom-band-light-400w.webp index 810a5bfcfe..29bf18fb82 100644 Binary files a/docs/static/screenshots/BarChart/brush-pan-zoom-band-light-400w.webp and b/docs/static/screenshots/BarChart/brush-pan-zoom-band-light-400w.webp differ diff --git a/docs/static/screenshots/BarChart/brush-pan-zoom-band-light-800w.webp b/docs/static/screenshots/BarChart/brush-pan-zoom-band-light-800w.webp index a8ca13e080..82672c04ad 100644 Binary files a/docs/static/screenshots/BarChart/brush-pan-zoom-band-light-800w.webp and b/docs/static/screenshots/BarChart/brush-pan-zoom-band-light-800w.webp differ diff --git a/docs/static/screenshots/BarChart/brush-pan-zoom-dark-240w.webp b/docs/static/screenshots/BarChart/brush-pan-zoom-dark-240w.webp index 710fd4c330..269dc11766 100644 Binary files a/docs/static/screenshots/BarChart/brush-pan-zoom-dark-240w.webp and b/docs/static/screenshots/BarChart/brush-pan-zoom-dark-240w.webp differ diff --git a/docs/static/screenshots/BarChart/brush-pan-zoom-dark-400w.webp b/docs/static/screenshots/BarChart/brush-pan-zoom-dark-400w.webp index 6b320770d9..d34975b052 100644 Binary files a/docs/static/screenshots/BarChart/brush-pan-zoom-dark-400w.webp and b/docs/static/screenshots/BarChart/brush-pan-zoom-dark-400w.webp differ diff --git a/docs/static/screenshots/BarChart/brush-pan-zoom-dark-800w.webp b/docs/static/screenshots/BarChart/brush-pan-zoom-dark-800w.webp index a194710f31..4d47b123c0 100644 Binary files a/docs/static/screenshots/BarChart/brush-pan-zoom-dark-800w.webp and b/docs/static/screenshots/BarChart/brush-pan-zoom-dark-800w.webp differ diff --git a/docs/static/screenshots/BarChart/brush-pan-zoom-light-240w.webp b/docs/static/screenshots/BarChart/brush-pan-zoom-light-240w.webp index 0c8728fb77..77cf1eb367 100644 Binary files a/docs/static/screenshots/BarChart/brush-pan-zoom-light-240w.webp and b/docs/static/screenshots/BarChart/brush-pan-zoom-light-240w.webp differ diff --git a/docs/static/screenshots/BarChart/brush-pan-zoom-light-400w.webp b/docs/static/screenshots/BarChart/brush-pan-zoom-light-400w.webp index 03184943b7..edd40a0733 100644 Binary files a/docs/static/screenshots/BarChart/brush-pan-zoom-light-400w.webp and b/docs/static/screenshots/BarChart/brush-pan-zoom-light-400w.webp differ diff --git a/docs/static/screenshots/BarChart/brush-pan-zoom-light-800w.webp b/docs/static/screenshots/BarChart/brush-pan-zoom-light-800w.webp index a5685b15e9..983d508e55 100644 Binary files a/docs/static/screenshots/BarChart/brush-pan-zoom-light-800w.webp and b/docs/static/screenshots/BarChart/brush-pan-zoom-light-800w.webp differ diff --git a/docs/static/screenshots/BarChart/color-bars-class-dark-240w.webp b/docs/static/screenshots/BarChart/color-bars-class-dark-240w.webp index 846b8fc7cb..c10729d1ae 100644 Binary files a/docs/static/screenshots/BarChart/color-bars-class-dark-240w.webp and b/docs/static/screenshots/BarChart/color-bars-class-dark-240w.webp differ diff --git a/docs/static/screenshots/BarChart/color-bars-class-dark-400w.webp b/docs/static/screenshots/BarChart/color-bars-class-dark-400w.webp index cd614e2a43..c24ab2f47d 100644 Binary files a/docs/static/screenshots/BarChart/color-bars-class-dark-400w.webp and b/docs/static/screenshots/BarChart/color-bars-class-dark-400w.webp differ diff --git a/docs/static/screenshots/BarChart/color-bars-class-dark-800w.webp b/docs/static/screenshots/BarChart/color-bars-class-dark-800w.webp index 79bb451d7d..ef9f1fec54 100644 Binary files a/docs/static/screenshots/BarChart/color-bars-class-dark-800w.webp and b/docs/static/screenshots/BarChart/color-bars-class-dark-800w.webp differ diff --git a/docs/static/screenshots/BarChart/color-bars-class-light-240w.webp b/docs/static/screenshots/BarChart/color-bars-class-light-240w.webp index e12d3c4160..6d5f3296eb 100644 Binary files a/docs/static/screenshots/BarChart/color-bars-class-light-240w.webp and b/docs/static/screenshots/BarChart/color-bars-class-light-240w.webp differ diff --git a/docs/static/screenshots/BarChart/color-bars-class-light-400w.webp b/docs/static/screenshots/BarChart/color-bars-class-light-400w.webp index 8db4fb536d..c0564a6611 100644 Binary files a/docs/static/screenshots/BarChart/color-bars-class-light-400w.webp and b/docs/static/screenshots/BarChart/color-bars-class-light-400w.webp differ diff --git a/docs/static/screenshots/BarChart/color-bars-class-light-800w.webp b/docs/static/screenshots/BarChart/color-bars-class-light-800w.webp index 16683d3c3e..fa38061157 100644 Binary files a/docs/static/screenshots/BarChart/color-bars-class-light-800w.webp and b/docs/static/screenshots/BarChart/color-bars-class-light-800w.webp differ diff --git a/docs/static/screenshots/BarChart/color-per-value-dark-240w.webp b/docs/static/screenshots/BarChart/color-per-value-dark-240w.webp index 8ff3435ac0..85c678aeee 100644 Binary files a/docs/static/screenshots/BarChart/color-per-value-dark-240w.webp and b/docs/static/screenshots/BarChart/color-per-value-dark-240w.webp differ diff --git a/docs/static/screenshots/BarChart/color-per-value-dark-400w.webp b/docs/static/screenshots/BarChart/color-per-value-dark-400w.webp index 95499d0737..3da0214866 100644 Binary files a/docs/static/screenshots/BarChart/color-per-value-dark-400w.webp and b/docs/static/screenshots/BarChart/color-per-value-dark-400w.webp differ diff --git a/docs/static/screenshots/BarChart/color-per-value-dark-800w.webp b/docs/static/screenshots/BarChart/color-per-value-dark-800w.webp index 8c61fd8429..fd51414a2e 100644 Binary files a/docs/static/screenshots/BarChart/color-per-value-dark-800w.webp and b/docs/static/screenshots/BarChart/color-per-value-dark-800w.webp differ diff --git a/docs/static/screenshots/BarChart/color-per-value-light-400w.webp b/docs/static/screenshots/BarChart/color-per-value-light-400w.webp index 287af1776f..ad84cfd132 100644 Binary files a/docs/static/screenshots/BarChart/color-per-value-light-400w.webp and b/docs/static/screenshots/BarChart/color-per-value-light-400w.webp differ diff --git a/docs/static/screenshots/BarChart/color-per-value-light-800w.webp b/docs/static/screenshots/BarChart/color-per-value-light-800w.webp index e216402429..0200630b75 100644 Binary files a/docs/static/screenshots/BarChart/color-per-value-light-800w.webp and b/docs/static/screenshots/BarChart/color-per-value-light-800w.webp differ diff --git a/docs/static/screenshots/BarChart/color-threshold-dark-240w.webp b/docs/static/screenshots/BarChart/color-threshold-dark-240w.webp index 181727055e..5c08c72e2a 100644 Binary files a/docs/static/screenshots/BarChart/color-threshold-dark-240w.webp and b/docs/static/screenshots/BarChart/color-threshold-dark-240w.webp differ diff --git a/docs/static/screenshots/BarChart/color-threshold-dark-400w.webp b/docs/static/screenshots/BarChart/color-threshold-dark-400w.webp index d6914c91fa..2032a00d80 100644 Binary files a/docs/static/screenshots/BarChart/color-threshold-dark-400w.webp and b/docs/static/screenshots/BarChart/color-threshold-dark-400w.webp differ diff --git a/docs/static/screenshots/BarChart/color-threshold-dark-800w.webp b/docs/static/screenshots/BarChart/color-threshold-dark-800w.webp index 29729e61e4..117f4fd552 100644 Binary files a/docs/static/screenshots/BarChart/color-threshold-dark-800w.webp and b/docs/static/screenshots/BarChart/color-threshold-dark-800w.webp differ diff --git a/docs/static/screenshots/BarChart/color-threshold-light-240w.webp b/docs/static/screenshots/BarChart/color-threshold-light-240w.webp index 7746db3f48..c4e534eebf 100644 Binary files a/docs/static/screenshots/BarChart/color-threshold-light-240w.webp and b/docs/static/screenshots/BarChart/color-threshold-light-240w.webp differ diff --git a/docs/static/screenshots/BarChart/color-threshold-light-400w.webp b/docs/static/screenshots/BarChart/color-threshold-light-400w.webp index 10a3906a59..2cf81844ab 100644 Binary files a/docs/static/screenshots/BarChart/color-threshold-light-400w.webp and b/docs/static/screenshots/BarChart/color-threshold-light-400w.webp differ diff --git a/docs/static/screenshots/BarChart/color-threshold-light-800w.webp b/docs/static/screenshots/BarChart/color-threshold-light-800w.webp index af500c96b4..6d326e8546 100644 Binary files a/docs/static/screenshots/BarChart/color-threshold-light-800w.webp and b/docs/static/screenshots/BarChart/color-threshold-light-800w.webp differ diff --git a/docs/static/screenshots/BarChart/color-using-scale-dark-240w.webp b/docs/static/screenshots/BarChart/color-using-scale-dark-240w.webp index a4b683a683..862cffef42 100644 Binary files a/docs/static/screenshots/BarChart/color-using-scale-dark-240w.webp and b/docs/static/screenshots/BarChart/color-using-scale-dark-240w.webp differ diff --git a/docs/static/screenshots/BarChart/color-using-scale-dark-400w.webp b/docs/static/screenshots/BarChart/color-using-scale-dark-400w.webp index cc9b5e4f83..4e40eaa413 100644 Binary files a/docs/static/screenshots/BarChart/color-using-scale-dark-400w.webp and b/docs/static/screenshots/BarChart/color-using-scale-dark-400w.webp differ diff --git a/docs/static/screenshots/BarChart/color-using-scale-dark-800w.webp b/docs/static/screenshots/BarChart/color-using-scale-dark-800w.webp index 571263a6d5..09ceadd8e5 100644 Binary files a/docs/static/screenshots/BarChart/color-using-scale-dark-800w.webp and b/docs/static/screenshots/BarChart/color-using-scale-dark-800w.webp differ diff --git a/docs/static/screenshots/BarChart/color-using-scale-light-240w.webp b/docs/static/screenshots/BarChart/color-using-scale-light-240w.webp index 9d5cbab2f3..2f414a8ff7 100644 Binary files a/docs/static/screenshots/BarChart/color-using-scale-light-240w.webp and b/docs/static/screenshots/BarChart/color-using-scale-light-240w.webp differ diff --git a/docs/static/screenshots/BarChart/color-using-scale-light-400w.webp b/docs/static/screenshots/BarChart/color-using-scale-light-400w.webp index 4b2e032fdb..ae801613c8 100644 Binary files a/docs/static/screenshots/BarChart/color-using-scale-light-400w.webp and b/docs/static/screenshots/BarChart/color-using-scale-light-400w.webp differ diff --git a/docs/static/screenshots/BarChart/color-using-scale-light-800w.webp b/docs/static/screenshots/BarChart/color-using-scale-light-800w.webp index 3bf3152dd6..f9ce464bff 100644 Binary files a/docs/static/screenshots/BarChart/color-using-scale-light-800w.webp and b/docs/static/screenshots/BarChart/color-using-scale-light-800w.webp differ diff --git a/docs/static/screenshots/BarChart/company-race-dark-400w.webp b/docs/static/screenshots/BarChart/company-race-dark-400w.webp index 7de27418c8..24e10ca144 100644 Binary files a/docs/static/screenshots/BarChart/company-race-dark-400w.webp and b/docs/static/screenshots/BarChart/company-race-dark-400w.webp differ diff --git a/docs/static/screenshots/BarChart/company-race-dark-800w.webp b/docs/static/screenshots/BarChart/company-race-dark-800w.webp index 3aac884e6b..d2adba9aa4 100644 Binary files a/docs/static/screenshots/BarChart/company-race-dark-800w.webp and b/docs/static/screenshots/BarChart/company-race-dark-800w.webp differ diff --git a/docs/static/screenshots/BarChart/company-race-light-400w.webp b/docs/static/screenshots/BarChart/company-race-light-400w.webp index 19a1e5b781..f9e395e243 100644 Binary files a/docs/static/screenshots/BarChart/company-race-light-400w.webp and b/docs/static/screenshots/BarChart/company-race-light-400w.webp differ diff --git a/docs/static/screenshots/BarChart/company-race-light-800w.webp b/docs/static/screenshots/BarChart/company-race-light-800w.webp index 44daef770a..6d00d9d904 100644 Binary files a/docs/static/screenshots/BarChart/company-race-light-800w.webp and b/docs/static/screenshots/BarChart/company-race-light-800w.webp differ diff --git a/docs/static/screenshots/BarChart/custom-chart-dark-240w.webp b/docs/static/screenshots/BarChart/custom-chart-dark-240w.webp index bab9cc0b0c..2a64348e65 100644 Binary files a/docs/static/screenshots/BarChart/custom-chart-dark-240w.webp and b/docs/static/screenshots/BarChart/custom-chart-dark-240w.webp differ diff --git a/docs/static/screenshots/BarChart/custom-chart-dark-400w.webp b/docs/static/screenshots/BarChart/custom-chart-dark-400w.webp index 2dd13f570b..c222f73064 100644 Binary files a/docs/static/screenshots/BarChart/custom-chart-dark-400w.webp and b/docs/static/screenshots/BarChart/custom-chart-dark-400w.webp differ diff --git a/docs/static/screenshots/BarChart/custom-chart-dark-800w.webp b/docs/static/screenshots/BarChart/custom-chart-dark-800w.webp index bd495b273a..e2cf0aa550 100644 Binary files a/docs/static/screenshots/BarChart/custom-chart-dark-800w.webp and b/docs/static/screenshots/BarChart/custom-chart-dark-800w.webp differ diff --git a/docs/static/screenshots/BarChart/custom-chart-light-240w.webp b/docs/static/screenshots/BarChart/custom-chart-light-240w.webp index 51cf5d4561..b0c385fd3d 100644 Binary files a/docs/static/screenshots/BarChart/custom-chart-light-240w.webp and b/docs/static/screenshots/BarChart/custom-chart-light-240w.webp differ diff --git a/docs/static/screenshots/BarChart/custom-chart-light-400w.webp b/docs/static/screenshots/BarChart/custom-chart-light-400w.webp index 3ac4f2c9a8..deae84b02b 100644 Binary files a/docs/static/screenshots/BarChart/custom-chart-light-400w.webp and b/docs/static/screenshots/BarChart/custom-chart-light-400w.webp differ diff --git a/docs/static/screenshots/BarChart/custom-chart-light-800w.webp b/docs/static/screenshots/BarChart/custom-chart-light-800w.webp index d9905710e4..48315283cc 100644 Binary files a/docs/static/screenshots/BarChart/custom-chart-light-800w.webp and b/docs/static/screenshots/BarChart/custom-chart-light-800w.webp differ diff --git a/docs/static/screenshots/BarChart/custom-tooltip-dark-240w.webp b/docs/static/screenshots/BarChart/custom-tooltip-dark-240w.webp index 722997d2d2..6c24ff5858 100644 Binary files a/docs/static/screenshots/BarChart/custom-tooltip-dark-240w.webp and b/docs/static/screenshots/BarChart/custom-tooltip-dark-240w.webp differ diff --git a/docs/static/screenshots/BarChart/custom-tooltip-dark-400w.webp b/docs/static/screenshots/BarChart/custom-tooltip-dark-400w.webp index 1958b864f0..01fc6b10b0 100644 Binary files a/docs/static/screenshots/BarChart/custom-tooltip-dark-400w.webp and b/docs/static/screenshots/BarChart/custom-tooltip-dark-400w.webp differ diff --git a/docs/static/screenshots/BarChart/custom-tooltip-dark-800w.webp b/docs/static/screenshots/BarChart/custom-tooltip-dark-800w.webp index 0f20f9a3a6..6601f0e36a 100644 Binary files a/docs/static/screenshots/BarChart/custom-tooltip-dark-800w.webp and b/docs/static/screenshots/BarChart/custom-tooltip-dark-800w.webp differ diff --git a/docs/static/screenshots/BarChart/custom-tooltip-light-240w.webp b/docs/static/screenshots/BarChart/custom-tooltip-light-240w.webp index ed8f770f0f..b50b7232a1 100644 Binary files a/docs/static/screenshots/BarChart/custom-tooltip-light-240w.webp and b/docs/static/screenshots/BarChart/custom-tooltip-light-240w.webp differ diff --git a/docs/static/screenshots/BarChart/custom-tooltip-light-400w.webp b/docs/static/screenshots/BarChart/custom-tooltip-light-400w.webp index ceafc0d9fd..a3fc4bd064 100644 Binary files a/docs/static/screenshots/BarChart/custom-tooltip-light-400w.webp and b/docs/static/screenshots/BarChart/custom-tooltip-light-400w.webp differ diff --git a/docs/static/screenshots/BarChart/custom-tooltip-light-800w.webp b/docs/static/screenshots/BarChart/custom-tooltip-light-800w.webp index a57e87026b..d2d114f1e0 100644 Binary files a/docs/static/screenshots/BarChart/custom-tooltip-light-800w.webp and b/docs/static/screenshots/BarChart/custom-tooltip-light-800w.webp differ diff --git a/docs/static/screenshots/BarChart/duration-bars-color-dark-240w.webp b/docs/static/screenshots/BarChart/duration-bars-color-dark-240w.webp index fa07094c88..5d49bc465d 100644 Binary files a/docs/static/screenshots/BarChart/duration-bars-color-dark-240w.webp and b/docs/static/screenshots/BarChart/duration-bars-color-dark-240w.webp differ diff --git a/docs/static/screenshots/BarChart/duration-bars-color-dark-400w.webp b/docs/static/screenshots/BarChart/duration-bars-color-dark-400w.webp index f33279949e..7c6e0aa32d 100644 Binary files a/docs/static/screenshots/BarChart/duration-bars-color-dark-400w.webp and b/docs/static/screenshots/BarChart/duration-bars-color-dark-400w.webp differ diff --git a/docs/static/screenshots/BarChart/duration-bars-color-dark-800w.webp b/docs/static/screenshots/BarChart/duration-bars-color-dark-800w.webp index fb436929c8..5cde125752 100644 Binary files a/docs/static/screenshots/BarChart/duration-bars-color-dark-800w.webp and b/docs/static/screenshots/BarChart/duration-bars-color-dark-800w.webp differ diff --git a/docs/static/screenshots/BarChart/duration-bars-color-light-240w.webp b/docs/static/screenshots/BarChart/duration-bars-color-light-240w.webp index afacc8056c..63d1d53692 100644 Binary files a/docs/static/screenshots/BarChart/duration-bars-color-light-240w.webp and b/docs/static/screenshots/BarChart/duration-bars-color-light-240w.webp differ diff --git a/docs/static/screenshots/BarChart/duration-bars-color-light-400w.webp b/docs/static/screenshots/BarChart/duration-bars-color-light-400w.webp index 103e6b7569..40427e2980 100644 Binary files a/docs/static/screenshots/BarChart/duration-bars-color-light-400w.webp and b/docs/static/screenshots/BarChart/duration-bars-color-light-400w.webp differ diff --git a/docs/static/screenshots/BarChart/duration-bars-color-light-800w.webp b/docs/static/screenshots/BarChart/duration-bars-color-light-800w.webp index 702629dd40..99c5460c5f 100644 Binary files a/docs/static/screenshots/BarChart/duration-bars-color-light-800w.webp and b/docs/static/screenshots/BarChart/duration-bars-color-light-800w.webp differ diff --git a/docs/static/screenshots/BarChart/duration-bars-dark-240w.webp b/docs/static/screenshots/BarChart/duration-bars-dark-240w.webp index 18a2b35c0e..afd8ea67db 100644 Binary files a/docs/static/screenshots/BarChart/duration-bars-dark-240w.webp and b/docs/static/screenshots/BarChart/duration-bars-dark-240w.webp differ diff --git a/docs/static/screenshots/BarChart/duration-bars-dark-400w.webp b/docs/static/screenshots/BarChart/duration-bars-dark-400w.webp index 006137c14b..cdafb379fe 100644 Binary files a/docs/static/screenshots/BarChart/duration-bars-dark-400w.webp and b/docs/static/screenshots/BarChart/duration-bars-dark-400w.webp differ diff --git a/docs/static/screenshots/BarChart/duration-bars-dark-800w.webp b/docs/static/screenshots/BarChart/duration-bars-dark-800w.webp index 2201860620..bef81a5c2b 100644 Binary files a/docs/static/screenshots/BarChart/duration-bars-dark-800w.webp and b/docs/static/screenshots/BarChart/duration-bars-dark-800w.webp differ diff --git a/docs/static/screenshots/BarChart/duration-bars-dense-dark-400w.webp b/docs/static/screenshots/BarChart/duration-bars-dense-dark-400w.webp index ff538c4dd9..4c634c4f04 100644 Binary files a/docs/static/screenshots/BarChart/duration-bars-dense-dark-400w.webp and b/docs/static/screenshots/BarChart/duration-bars-dense-dark-400w.webp differ diff --git a/docs/static/screenshots/BarChart/duration-bars-dense-dark-800w.webp b/docs/static/screenshots/BarChart/duration-bars-dense-dark-800w.webp index 636e910c4c..e787433999 100644 Binary files a/docs/static/screenshots/BarChart/duration-bars-dense-dark-800w.webp and b/docs/static/screenshots/BarChart/duration-bars-dense-dark-800w.webp differ diff --git a/docs/static/screenshots/BarChart/duration-bars-dense-lanes-dark-800w.webp b/docs/static/screenshots/BarChart/duration-bars-dense-lanes-dark-800w.webp index 420cb8c158..e5c81cc4a3 100644 Binary files a/docs/static/screenshots/BarChart/duration-bars-dense-lanes-dark-800w.webp and b/docs/static/screenshots/BarChart/duration-bars-dense-lanes-dark-800w.webp differ diff --git a/docs/static/screenshots/BarChart/duration-bars-dense-lanes-light-240w.webp b/docs/static/screenshots/BarChart/duration-bars-dense-lanes-light-240w.webp index 629cba9f7c..9cade26268 100644 Binary files a/docs/static/screenshots/BarChart/duration-bars-dense-lanes-light-240w.webp and b/docs/static/screenshots/BarChart/duration-bars-dense-lanes-light-240w.webp differ diff --git a/docs/static/screenshots/BarChart/duration-bars-dense-lanes-light-800w.webp b/docs/static/screenshots/BarChart/duration-bars-dense-lanes-light-800w.webp index dcb512dd9d..9e8e62e7ff 100644 Binary files a/docs/static/screenshots/BarChart/duration-bars-dense-lanes-light-800w.webp and b/docs/static/screenshots/BarChart/duration-bars-dense-lanes-light-800w.webp differ diff --git a/docs/static/screenshots/BarChart/duration-bars-dense-light-240w.webp b/docs/static/screenshots/BarChart/duration-bars-dense-light-240w.webp index 78aa72c6bd..bf17991c79 100644 Binary files a/docs/static/screenshots/BarChart/duration-bars-dense-light-240w.webp and b/docs/static/screenshots/BarChart/duration-bars-dense-light-240w.webp differ diff --git a/docs/static/screenshots/BarChart/duration-bars-dense-light-400w.webp b/docs/static/screenshots/BarChart/duration-bars-dense-light-400w.webp index cb51e2a1a0..7cf682ed7f 100644 Binary files a/docs/static/screenshots/BarChart/duration-bars-dense-light-400w.webp and b/docs/static/screenshots/BarChart/duration-bars-dense-light-400w.webp differ diff --git a/docs/static/screenshots/BarChart/duration-bars-dense-light-800w.webp b/docs/static/screenshots/BarChart/duration-bars-dense-light-800w.webp index 68d040bcef..96785ea441 100644 Binary files a/docs/static/screenshots/BarChart/duration-bars-dense-light-800w.webp and b/docs/static/screenshots/BarChart/duration-bars-dense-light-800w.webp differ diff --git a/docs/static/screenshots/BarChart/duration-bars-lanes-dark-240w.webp b/docs/static/screenshots/BarChart/duration-bars-lanes-dark-240w.webp index 61f80eaade..1eaa68c62f 100644 Binary files a/docs/static/screenshots/BarChart/duration-bars-lanes-dark-240w.webp and b/docs/static/screenshots/BarChart/duration-bars-lanes-dark-240w.webp differ diff --git a/docs/static/screenshots/BarChart/duration-bars-lanes-dark-400w.webp b/docs/static/screenshots/BarChart/duration-bars-lanes-dark-400w.webp index 1e4fa6dba5..e84eeb5665 100644 Binary files a/docs/static/screenshots/BarChart/duration-bars-lanes-dark-400w.webp and b/docs/static/screenshots/BarChart/duration-bars-lanes-dark-400w.webp differ diff --git a/docs/static/screenshots/BarChart/duration-bars-lanes-dark-800w.webp b/docs/static/screenshots/BarChart/duration-bars-lanes-dark-800w.webp index b9f8b3f0ad..24312f4ff7 100644 Binary files a/docs/static/screenshots/BarChart/duration-bars-lanes-dark-800w.webp and b/docs/static/screenshots/BarChart/duration-bars-lanes-dark-800w.webp differ diff --git a/docs/static/screenshots/BarChart/duration-bars-lanes-light-240w.webp b/docs/static/screenshots/BarChart/duration-bars-lanes-light-240w.webp index 02d4d2dd34..0a2e4690ba 100644 Binary files a/docs/static/screenshots/BarChart/duration-bars-lanes-light-240w.webp and b/docs/static/screenshots/BarChart/duration-bars-lanes-light-240w.webp differ diff --git a/docs/static/screenshots/BarChart/duration-bars-lanes-light-400w.webp b/docs/static/screenshots/BarChart/duration-bars-lanes-light-400w.webp index c1ae52386d..3f193853a8 100644 Binary files a/docs/static/screenshots/BarChart/duration-bars-lanes-light-400w.webp and b/docs/static/screenshots/BarChart/duration-bars-lanes-light-400w.webp differ diff --git a/docs/static/screenshots/BarChart/duration-bars-lanes-light-800w.webp b/docs/static/screenshots/BarChart/duration-bars-lanes-light-800w.webp index 923c61fbd0..24cfdc5455 100644 Binary files a/docs/static/screenshots/BarChart/duration-bars-lanes-light-800w.webp and b/docs/static/screenshots/BarChart/duration-bars-lanes-light-800w.webp differ diff --git a/docs/static/screenshots/BarChart/duration-bars-light-240w.webp b/docs/static/screenshots/BarChart/duration-bars-light-240w.webp index 434a1df1f2..3a70b1f71a 100644 Binary files a/docs/static/screenshots/BarChart/duration-bars-light-240w.webp and b/docs/static/screenshots/BarChart/duration-bars-light-240w.webp differ diff --git a/docs/static/screenshots/BarChart/duration-bars-light-400w.webp b/docs/static/screenshots/BarChart/duration-bars-light-400w.webp index 289bfa74c2..0d36daf93c 100644 Binary files a/docs/static/screenshots/BarChart/duration-bars-light-400w.webp and b/docs/static/screenshots/BarChart/duration-bars-light-400w.webp differ diff --git a/docs/static/screenshots/BarChart/duration-bars-light-800w.webp b/docs/static/screenshots/BarChart/duration-bars-light-800w.webp index fedf39e28d..3335e7cf09 100644 Binary files a/docs/static/screenshots/BarChart/duration-bars-light-800w.webp and b/docs/static/screenshots/BarChart/duration-bars-light-800w.webp differ diff --git a/docs/static/screenshots/BarChart/duration-civilization-timeline-dark-240w.webp b/docs/static/screenshots/BarChart/duration-civilization-timeline-dark-240w.webp index 458692dae2..aeb75bb124 100644 Binary files a/docs/static/screenshots/BarChart/duration-civilization-timeline-dark-240w.webp and b/docs/static/screenshots/BarChart/duration-civilization-timeline-dark-240w.webp differ diff --git a/docs/static/screenshots/BarChart/duration-civilization-timeline-dark-400w.webp b/docs/static/screenshots/BarChart/duration-civilization-timeline-dark-400w.webp index 21ba5cb513..473a81943a 100644 Binary files a/docs/static/screenshots/BarChart/duration-civilization-timeline-dark-400w.webp and b/docs/static/screenshots/BarChart/duration-civilization-timeline-dark-400w.webp differ diff --git a/docs/static/screenshots/BarChart/duration-civilization-timeline-dark-800w.webp b/docs/static/screenshots/BarChart/duration-civilization-timeline-dark-800w.webp index f0ce81c985..2cdefb99f7 100644 Binary files a/docs/static/screenshots/BarChart/duration-civilization-timeline-dark-800w.webp and b/docs/static/screenshots/BarChart/duration-civilization-timeline-dark-800w.webp differ diff --git a/docs/static/screenshots/BarChart/duration-civilization-timeline-dense-light-800w.webp b/docs/static/screenshots/BarChart/duration-civilization-timeline-dense-light-800w.webp index d3a204ae87..e39a8f0f14 100644 Binary files a/docs/static/screenshots/BarChart/duration-civilization-timeline-dense-light-800w.webp and b/docs/static/screenshots/BarChart/duration-civilization-timeline-dense-light-800w.webp differ diff --git a/docs/static/screenshots/BarChart/duration-civilization-timeline-light-240w.webp b/docs/static/screenshots/BarChart/duration-civilization-timeline-light-240w.webp index 325ee31961..ae25304c08 100644 Binary files a/docs/static/screenshots/BarChart/duration-civilization-timeline-light-240w.webp and b/docs/static/screenshots/BarChart/duration-civilization-timeline-light-240w.webp differ diff --git a/docs/static/screenshots/BarChart/duration-civilization-timeline-light-400w.webp b/docs/static/screenshots/BarChart/duration-civilization-timeline-light-400w.webp index 9dce636db4..45bfd712bb 100644 Binary files a/docs/static/screenshots/BarChart/duration-civilization-timeline-light-400w.webp and b/docs/static/screenshots/BarChart/duration-civilization-timeline-light-400w.webp differ diff --git a/docs/static/screenshots/BarChart/duration-civilization-timeline-light-800w.webp b/docs/static/screenshots/BarChart/duration-civilization-timeline-light-800w.webp index d39f50acfd..f01020317a 100644 Binary files a/docs/static/screenshots/BarChart/duration-civilization-timeline-light-800w.webp and b/docs/static/screenshots/BarChart/duration-civilization-timeline-light-800w.webp differ diff --git a/docs/static/screenshots/BarChart/duration-dark-400w.webp b/docs/static/screenshots/BarChart/duration-dark-400w.webp index fa8c5d46ae..8d4feec67d 100644 Binary files a/docs/static/screenshots/BarChart/duration-dark-400w.webp and b/docs/static/screenshots/BarChart/duration-dark-400w.webp differ diff --git a/docs/static/screenshots/BarChart/duration-dark-800w.webp b/docs/static/screenshots/BarChart/duration-dark-800w.webp index eff7ee0f58..5a84cd21ea 100644 Binary files a/docs/static/screenshots/BarChart/duration-dark-800w.webp and b/docs/static/screenshots/BarChart/duration-dark-800w.webp differ diff --git a/docs/static/screenshots/BarChart/duration-labels-dark-240w.webp b/docs/static/screenshots/BarChart/duration-labels-dark-240w.webp index 405987b07b..95ce1f0729 100644 Binary files a/docs/static/screenshots/BarChart/duration-labels-dark-240w.webp and b/docs/static/screenshots/BarChart/duration-labels-dark-240w.webp differ diff --git a/docs/static/screenshots/BarChart/duration-labels-dark-400w.webp b/docs/static/screenshots/BarChart/duration-labels-dark-400w.webp index b4100819dc..8ae7ce3b02 100644 Binary files a/docs/static/screenshots/BarChart/duration-labels-dark-400w.webp and b/docs/static/screenshots/BarChart/duration-labels-dark-400w.webp differ diff --git a/docs/static/screenshots/BarChart/duration-labels-dark-800w.webp b/docs/static/screenshots/BarChart/duration-labels-dark-800w.webp index 3f0c4f9c2d..470f2228bf 100644 Binary files a/docs/static/screenshots/BarChart/duration-labels-dark-800w.webp and b/docs/static/screenshots/BarChart/duration-labels-dark-800w.webp differ diff --git a/docs/static/screenshots/BarChart/duration-labels-light-240w.webp b/docs/static/screenshots/BarChart/duration-labels-light-240w.webp index db32fed387..5303c30f9a 100644 Binary files a/docs/static/screenshots/BarChart/duration-labels-light-240w.webp and b/docs/static/screenshots/BarChart/duration-labels-light-240w.webp differ diff --git a/docs/static/screenshots/BarChart/duration-labels-light-400w.webp b/docs/static/screenshots/BarChart/duration-labels-light-400w.webp index fd55da630c..c80b6af187 100644 Binary files a/docs/static/screenshots/BarChart/duration-labels-light-400w.webp and b/docs/static/screenshots/BarChart/duration-labels-light-400w.webp differ diff --git a/docs/static/screenshots/BarChart/duration-labels-light-800w.webp b/docs/static/screenshots/BarChart/duration-labels-light-800w.webp index 571eade8b9..7712920a05 100644 Binary files a/docs/static/screenshots/BarChart/duration-labels-light-800w.webp and b/docs/static/screenshots/BarChart/duration-labels-light-800w.webp differ diff --git a/docs/static/screenshots/BarChart/duration-light-240w.webp b/docs/static/screenshots/BarChart/duration-light-240w.webp index c034cd58b9..972bf34ccd 100644 Binary files a/docs/static/screenshots/BarChart/duration-light-240w.webp and b/docs/static/screenshots/BarChart/duration-light-240w.webp differ diff --git a/docs/static/screenshots/BarChart/duration-light-400w.webp b/docs/static/screenshots/BarChart/duration-light-400w.webp index a2a74d1786..ede6bf01f5 100644 Binary files a/docs/static/screenshots/BarChart/duration-light-400w.webp and b/docs/static/screenshots/BarChart/duration-light-400w.webp differ diff --git a/docs/static/screenshots/BarChart/duration-light-800w.webp b/docs/static/screenshots/BarChart/duration-light-800w.webp index 3001442877..113485f68a 100644 Binary files a/docs/static/screenshots/BarChart/duration-light-800w.webp and b/docs/static/screenshots/BarChart/duration-light-800w.webp differ diff --git a/docs/static/screenshots/BarChart/duration-points-color-dark-240w.webp b/docs/static/screenshots/BarChart/duration-points-color-dark-240w.webp index f626947f78..ea8976802d 100644 Binary files a/docs/static/screenshots/BarChart/duration-points-color-dark-240w.webp and b/docs/static/screenshots/BarChart/duration-points-color-dark-240w.webp differ diff --git a/docs/static/screenshots/BarChart/duration-points-color-dark-400w.webp b/docs/static/screenshots/BarChart/duration-points-color-dark-400w.webp index c79b9063ee..393a9515be 100644 Binary files a/docs/static/screenshots/BarChart/duration-points-color-dark-400w.webp and b/docs/static/screenshots/BarChart/duration-points-color-dark-400w.webp differ diff --git a/docs/static/screenshots/BarChart/duration-points-color-dark-800w.webp b/docs/static/screenshots/BarChart/duration-points-color-dark-800w.webp index f9e5a92095..2eef86b1c0 100644 Binary files a/docs/static/screenshots/BarChart/duration-points-color-dark-800w.webp and b/docs/static/screenshots/BarChart/duration-points-color-dark-800w.webp differ diff --git a/docs/static/screenshots/BarChart/duration-points-color-light-240w.webp b/docs/static/screenshots/BarChart/duration-points-color-light-240w.webp index 75502bf810..1dbc79afb9 100644 Binary files a/docs/static/screenshots/BarChart/duration-points-color-light-240w.webp and b/docs/static/screenshots/BarChart/duration-points-color-light-240w.webp differ diff --git a/docs/static/screenshots/BarChart/duration-points-color-light-400w.webp b/docs/static/screenshots/BarChart/duration-points-color-light-400w.webp index b71f0255b0..c2d1ed8d4c 100644 Binary files a/docs/static/screenshots/BarChart/duration-points-color-light-400w.webp and b/docs/static/screenshots/BarChart/duration-points-color-light-400w.webp differ diff --git a/docs/static/screenshots/BarChart/duration-points-color-light-800w.webp b/docs/static/screenshots/BarChart/duration-points-color-light-800w.webp index 32615da291..4d39add2f1 100644 Binary files a/docs/static/screenshots/BarChart/duration-points-color-light-800w.webp and b/docs/static/screenshots/BarChart/duration-points-color-light-800w.webp differ diff --git a/docs/static/screenshots/BarChart/duration-points-dark-240w.webp b/docs/static/screenshots/BarChart/duration-points-dark-240w.webp index af508c655e..bf1bdfc629 100644 Binary files a/docs/static/screenshots/BarChart/duration-points-dark-240w.webp and b/docs/static/screenshots/BarChart/duration-points-dark-240w.webp differ diff --git a/docs/static/screenshots/BarChart/duration-points-dark-400w.webp b/docs/static/screenshots/BarChart/duration-points-dark-400w.webp index f1e90aedab..c8209af1e8 100644 Binary files a/docs/static/screenshots/BarChart/duration-points-dark-400w.webp and b/docs/static/screenshots/BarChart/duration-points-dark-400w.webp differ diff --git a/docs/static/screenshots/BarChart/duration-points-dark-800w.webp b/docs/static/screenshots/BarChart/duration-points-dark-800w.webp index 9f482a1b8b..a53a9dff3b 100644 Binary files a/docs/static/screenshots/BarChart/duration-points-dark-800w.webp and b/docs/static/screenshots/BarChart/duration-points-dark-800w.webp differ diff --git a/docs/static/screenshots/BarChart/duration-points-light-240w.webp b/docs/static/screenshots/BarChart/duration-points-light-240w.webp index 30d4cdc331..6759ff94b5 100644 Binary files a/docs/static/screenshots/BarChart/duration-points-light-240w.webp and b/docs/static/screenshots/BarChart/duration-points-light-240w.webp differ diff --git a/docs/static/screenshots/BarChart/duration-points-light-400w.webp b/docs/static/screenshots/BarChart/duration-points-light-400w.webp index 5115423d37..f1bf4ac322 100644 Binary files a/docs/static/screenshots/BarChart/duration-points-light-400w.webp and b/docs/static/screenshots/BarChart/duration-points-light-400w.webp differ diff --git a/docs/static/screenshots/BarChart/duration-points-light-800w.webp b/docs/static/screenshots/BarChart/duration-points-light-800w.webp index 96a09c86df..8e26e17164 100644 Binary files a/docs/static/screenshots/BarChart/duration-points-light-800w.webp and b/docs/static/screenshots/BarChart/duration-points-light-800w.webp differ diff --git a/docs/static/screenshots/BarChart/dynamic-height-dark-240w.webp b/docs/static/screenshots/BarChart/dynamic-height-dark-240w.webp index 165be4fb4f..2a7d3f69c5 100644 Binary files a/docs/static/screenshots/BarChart/dynamic-height-dark-240w.webp and b/docs/static/screenshots/BarChart/dynamic-height-dark-240w.webp differ diff --git a/docs/static/screenshots/BarChart/dynamic-height-dark-400w.webp b/docs/static/screenshots/BarChart/dynamic-height-dark-400w.webp index 45035b4a6e..ecbe04983b 100644 Binary files a/docs/static/screenshots/BarChart/dynamic-height-dark-400w.webp and b/docs/static/screenshots/BarChart/dynamic-height-dark-400w.webp differ diff --git a/docs/static/screenshots/BarChart/dynamic-height-dark-800w.webp b/docs/static/screenshots/BarChart/dynamic-height-dark-800w.webp index b6d0470bf7..0c65dd6ef8 100644 Binary files a/docs/static/screenshots/BarChart/dynamic-height-dark-800w.webp and b/docs/static/screenshots/BarChart/dynamic-height-dark-800w.webp differ diff --git a/docs/static/screenshots/BarChart/dynamic-height-light-400w.webp b/docs/static/screenshots/BarChart/dynamic-height-light-400w.webp index ffe1c89330..8d963a7a2c 100644 Binary files a/docs/static/screenshots/BarChart/dynamic-height-light-400w.webp and b/docs/static/screenshots/BarChart/dynamic-height-light-400w.webp differ diff --git a/docs/static/screenshots/BarChart/gradient-dark-240w.webp b/docs/static/screenshots/BarChart/gradient-dark-240w.webp index 0dd73079e9..82d9a0bcef 100644 Binary files a/docs/static/screenshots/BarChart/gradient-dark-240w.webp and b/docs/static/screenshots/BarChart/gradient-dark-240w.webp differ diff --git a/docs/static/screenshots/BarChart/gradient-dark-400w.webp b/docs/static/screenshots/BarChart/gradient-dark-400w.webp index 844aff9735..1740056766 100644 Binary files a/docs/static/screenshots/BarChart/gradient-dark-400w.webp and b/docs/static/screenshots/BarChart/gradient-dark-400w.webp differ diff --git a/docs/static/screenshots/BarChart/gradient-dark-800w.webp b/docs/static/screenshots/BarChart/gradient-dark-800w.webp index 564a1419b2..4a73f9a344 100644 Binary files a/docs/static/screenshots/BarChart/gradient-dark-800w.webp and b/docs/static/screenshots/BarChart/gradient-dark-800w.webp differ diff --git a/docs/static/screenshots/BarChart/gradient-light-240w.webp b/docs/static/screenshots/BarChart/gradient-light-240w.webp index ec96276634..796639cb2e 100644 Binary files a/docs/static/screenshots/BarChart/gradient-light-240w.webp and b/docs/static/screenshots/BarChart/gradient-light-240w.webp differ diff --git a/docs/static/screenshots/BarChart/gradient-light-400w.webp b/docs/static/screenshots/BarChart/gradient-light-400w.webp index 1beb8fff7b..815f694265 100644 Binary files a/docs/static/screenshots/BarChart/gradient-light-400w.webp and b/docs/static/screenshots/BarChart/gradient-light-400w.webp differ diff --git a/docs/static/screenshots/BarChart/gradient-light-800w.webp b/docs/static/screenshots/BarChart/gradient-light-800w.webp index e4d065a5c0..1d1cbd7107 100644 Binary files a/docs/static/screenshots/BarChart/gradient-light-800w.webp and b/docs/static/screenshots/BarChart/gradient-light-800w.webp differ diff --git a/docs/static/screenshots/BarChart/group-long-data-dark-240w.webp b/docs/static/screenshots/BarChart/group-long-data-dark-240w.webp new file mode 100644 index 0000000000..51e3fe1976 Binary files /dev/null and b/docs/static/screenshots/BarChart/group-long-data-dark-240w.webp differ diff --git a/docs/static/screenshots/BarChart/group-long-data-dark-400w.webp b/docs/static/screenshots/BarChart/group-long-data-dark-400w.webp new file mode 100644 index 0000000000..d1901648c2 Binary files /dev/null and b/docs/static/screenshots/BarChart/group-long-data-dark-400w.webp differ diff --git a/docs/static/screenshots/BarChart/group-long-data-dark-800w.webp b/docs/static/screenshots/BarChart/group-long-data-dark-800w.webp new file mode 100644 index 0000000000..0129a45491 Binary files /dev/null and b/docs/static/screenshots/BarChart/group-long-data-dark-800w.webp differ diff --git a/docs/static/screenshots/BarChart/group-long-data-light-240w.webp b/docs/static/screenshots/BarChart/group-long-data-light-240w.webp new file mode 100644 index 0000000000..6152629aad Binary files /dev/null and b/docs/static/screenshots/BarChart/group-long-data-light-240w.webp differ diff --git a/docs/static/screenshots/BarChart/group-long-data-light-400w.webp b/docs/static/screenshots/BarChart/group-long-data-light-400w.webp new file mode 100644 index 0000000000..40f49a6409 Binary files /dev/null and b/docs/static/screenshots/BarChart/group-long-data-light-400w.webp differ diff --git a/docs/static/screenshots/BarChart/group-long-data-light-800w.webp b/docs/static/screenshots/BarChart/group-long-data-light-800w.webp new file mode 100644 index 0000000000..2535ed6aec Binary files /dev/null and b/docs/static/screenshots/BarChart/group-long-data-light-800w.webp differ diff --git a/docs/static/screenshots/BarChart/group-series-bar-click-dark-400w.webp b/docs/static/screenshots/BarChart/group-series-bar-click-dark-400w.webp index 32ea4ecaac..516d8c1a43 100644 Binary files a/docs/static/screenshots/BarChart/group-series-bar-click-dark-400w.webp and b/docs/static/screenshots/BarChart/group-series-bar-click-dark-400w.webp differ diff --git a/docs/static/screenshots/BarChart/group-series-bar-click-dark-800w.webp b/docs/static/screenshots/BarChart/group-series-bar-click-dark-800w.webp index 3931007119..551a965a0c 100644 Binary files a/docs/static/screenshots/BarChart/group-series-bar-click-dark-800w.webp and b/docs/static/screenshots/BarChart/group-series-bar-click-dark-800w.webp differ diff --git a/docs/static/screenshots/BarChart/group-series-bar-click-light-400w.webp b/docs/static/screenshots/BarChart/group-series-bar-click-light-400w.webp index 436a82718f..9d377ea436 100644 Binary files a/docs/static/screenshots/BarChart/group-series-bar-click-light-400w.webp and b/docs/static/screenshots/BarChart/group-series-bar-click-light-400w.webp differ diff --git a/docs/static/screenshots/BarChart/group-series-dark-400w.webp b/docs/static/screenshots/BarChart/group-series-dark-400w.webp index 32ea4ecaac..516d8c1a43 100644 Binary files a/docs/static/screenshots/BarChart/group-series-dark-400w.webp and b/docs/static/screenshots/BarChart/group-series-dark-400w.webp differ diff --git a/docs/static/screenshots/BarChart/group-series-dark-800w.webp b/docs/static/screenshots/BarChart/group-series-dark-800w.webp index 3931007119..551a965a0c 100644 Binary files a/docs/static/screenshots/BarChart/group-series-dark-800w.webp and b/docs/static/screenshots/BarChart/group-series-dark-800w.webp differ diff --git a/docs/static/screenshots/BarChart/group-series-horizontal-light-240w.webp b/docs/static/screenshots/BarChart/group-series-horizontal-light-240w.webp index 71e4cf010a..1295cbb493 100644 Binary files a/docs/static/screenshots/BarChart/group-series-horizontal-light-240w.webp and b/docs/static/screenshots/BarChart/group-series-horizontal-light-240w.webp differ diff --git a/docs/static/screenshots/BarChart/group-series-labels-dark-240w.webp b/docs/static/screenshots/BarChart/group-series-labels-dark-240w.webp index 722da48a68..f698c215bf 100644 Binary files a/docs/static/screenshots/BarChart/group-series-labels-dark-240w.webp and b/docs/static/screenshots/BarChart/group-series-labels-dark-240w.webp differ diff --git a/docs/static/screenshots/BarChart/group-series-labels-dark-400w.webp b/docs/static/screenshots/BarChart/group-series-labels-dark-400w.webp index 336027fa83..921f1c3e00 100644 Binary files a/docs/static/screenshots/BarChart/group-series-labels-dark-400w.webp and b/docs/static/screenshots/BarChart/group-series-labels-dark-400w.webp differ diff --git a/docs/static/screenshots/BarChart/group-series-labels-dark-800w.webp b/docs/static/screenshots/BarChart/group-series-labels-dark-800w.webp index e0f102699b..b153a0e99f 100644 Binary files a/docs/static/screenshots/BarChart/group-series-labels-dark-800w.webp and b/docs/static/screenshots/BarChart/group-series-labels-dark-800w.webp differ diff --git a/docs/static/screenshots/BarChart/group-series-labels-light-240w.webp b/docs/static/screenshots/BarChart/group-series-labels-light-240w.webp index fad0266c1b..9ae24046d8 100644 Binary files a/docs/static/screenshots/BarChart/group-series-labels-light-240w.webp and b/docs/static/screenshots/BarChart/group-series-labels-light-240w.webp differ diff --git a/docs/static/screenshots/BarChart/group-series-labels-light-400w.webp b/docs/static/screenshots/BarChart/group-series-labels-light-400w.webp index fd894ae98c..16527d3216 100644 Binary files a/docs/static/screenshots/BarChart/group-series-labels-light-400w.webp and b/docs/static/screenshots/BarChart/group-series-labels-light-400w.webp differ diff --git a/docs/static/screenshots/BarChart/group-series-labels-light-800w.webp b/docs/static/screenshots/BarChart/group-series-labels-light-800w.webp index a485d6ff59..860ae20f23 100644 Binary files a/docs/static/screenshots/BarChart/group-series-labels-light-800w.webp and b/docs/static/screenshots/BarChart/group-series-labels-light-800w.webp differ diff --git a/docs/static/screenshots/BarChart/group-series-light-400w.webp b/docs/static/screenshots/BarChart/group-series-light-400w.webp index 436a82718f..9d377ea436 100644 Binary files a/docs/static/screenshots/BarChart/group-series-light-400w.webp and b/docs/static/screenshots/BarChart/group-series-light-400w.webp differ diff --git a/docs/static/screenshots/BarChart/group-series-series-long-data-dark-400w.webp b/docs/static/screenshots/BarChart/group-series-series-long-data-dark-400w.webp index 32ea4ecaac..516d8c1a43 100644 Binary files a/docs/static/screenshots/BarChart/group-series-series-long-data-dark-400w.webp and b/docs/static/screenshots/BarChart/group-series-series-long-data-dark-400w.webp differ diff --git a/docs/static/screenshots/BarChart/group-series-series-long-data-dark-800w.webp b/docs/static/screenshots/BarChart/group-series-series-long-data-dark-800w.webp index 3931007119..551a965a0c 100644 Binary files a/docs/static/screenshots/BarChart/group-series-series-long-data-dark-800w.webp and b/docs/static/screenshots/BarChart/group-series-series-long-data-dark-800w.webp differ diff --git a/docs/static/screenshots/BarChart/group-series-series-long-data-light-400w.webp b/docs/static/screenshots/BarChart/group-series-series-long-data-light-400w.webp index 436a82718f..9d377ea436 100644 Binary files a/docs/static/screenshots/BarChart/group-series-series-long-data-light-400w.webp and b/docs/static/screenshots/BarChart/group-series-series-long-data-light-400w.webp differ diff --git a/docs/static/screenshots/BarChart/group-stack-series-dark-240w.webp b/docs/static/screenshots/BarChart/group-stack-series-dark-240w.webp new file mode 100644 index 0000000000..7dc1c20350 Binary files /dev/null and b/docs/static/screenshots/BarChart/group-stack-series-dark-240w.webp differ diff --git a/docs/static/screenshots/BarChart/group-stack-series-dark-400w.webp b/docs/static/screenshots/BarChart/group-stack-series-dark-400w.webp new file mode 100644 index 0000000000..9242dee5b2 Binary files /dev/null and b/docs/static/screenshots/BarChart/group-stack-series-dark-400w.webp differ diff --git a/docs/static/screenshots/BarChart/group-stack-series-dark-800w.webp b/docs/static/screenshots/BarChart/group-stack-series-dark-800w.webp new file mode 100644 index 0000000000..4838387206 Binary files /dev/null and b/docs/static/screenshots/BarChart/group-stack-series-dark-800w.webp differ diff --git a/docs/static/screenshots/BarChart/group-stack-series-horizontal-dark-240w.webp b/docs/static/screenshots/BarChart/group-stack-series-horizontal-dark-240w.webp new file mode 100644 index 0000000000..468e279d32 Binary files /dev/null and b/docs/static/screenshots/BarChart/group-stack-series-horizontal-dark-240w.webp differ diff --git a/docs/static/screenshots/BarChart/group-stack-series-horizontal-dark-400w.webp b/docs/static/screenshots/BarChart/group-stack-series-horizontal-dark-400w.webp new file mode 100644 index 0000000000..78b595cc3c Binary files /dev/null and b/docs/static/screenshots/BarChart/group-stack-series-horizontal-dark-400w.webp differ diff --git a/docs/static/screenshots/BarChart/group-stack-series-horizontal-dark-800w.webp b/docs/static/screenshots/BarChart/group-stack-series-horizontal-dark-800w.webp new file mode 100644 index 0000000000..200157b58f Binary files /dev/null and b/docs/static/screenshots/BarChart/group-stack-series-horizontal-dark-800w.webp differ diff --git a/docs/static/screenshots/BarChart/group-stack-series-horizontal-light-240w.webp b/docs/static/screenshots/BarChart/group-stack-series-horizontal-light-240w.webp new file mode 100644 index 0000000000..1793134d61 Binary files /dev/null and b/docs/static/screenshots/BarChart/group-stack-series-horizontal-light-240w.webp differ diff --git a/docs/static/screenshots/BarChart/group-stack-series-horizontal-light-400w.webp b/docs/static/screenshots/BarChart/group-stack-series-horizontal-light-400w.webp new file mode 100644 index 0000000000..b3c191f89b Binary files /dev/null and b/docs/static/screenshots/BarChart/group-stack-series-horizontal-light-400w.webp differ diff --git a/docs/static/screenshots/BarChart/group-stack-series-horizontal-light-800w.webp b/docs/static/screenshots/BarChart/group-stack-series-horizontal-light-800w.webp new file mode 100644 index 0000000000..bff044df32 Binary files /dev/null and b/docs/static/screenshots/BarChart/group-stack-series-horizontal-light-800w.webp differ diff --git a/docs/static/screenshots/BarChart/group-stack-series-light-240w.webp b/docs/static/screenshots/BarChart/group-stack-series-light-240w.webp new file mode 100644 index 0000000000..d3ead9135f Binary files /dev/null and b/docs/static/screenshots/BarChart/group-stack-series-light-240w.webp differ diff --git a/docs/static/screenshots/BarChart/group-stack-series-light-400w.webp b/docs/static/screenshots/BarChart/group-stack-series-light-400w.webp new file mode 100644 index 0000000000..bcff5a26a9 Binary files /dev/null and b/docs/static/screenshots/BarChart/group-stack-series-light-400w.webp differ diff --git a/docs/static/screenshots/BarChart/group-stack-series-light-800w.webp b/docs/static/screenshots/BarChart/group-stack-series-light-800w.webp new file mode 100644 index 0000000000..f9e626cbad Binary files /dev/null and b/docs/static/screenshots/BarChart/group-stack-series-light-800w.webp differ diff --git a/docs/static/screenshots/BarChart/highlight-below-marks-dark-240w.webp b/docs/static/screenshots/BarChart/highlight-below-marks-dark-240w.webp index 4aad321f57..109efdc394 100644 Binary files a/docs/static/screenshots/BarChart/highlight-below-marks-dark-240w.webp and b/docs/static/screenshots/BarChart/highlight-below-marks-dark-240w.webp differ diff --git a/docs/static/screenshots/BarChart/highlight-below-marks-dark-400w.webp b/docs/static/screenshots/BarChart/highlight-below-marks-dark-400w.webp index 885fca7f9e..76304bc44e 100644 Binary files a/docs/static/screenshots/BarChart/highlight-below-marks-dark-400w.webp and b/docs/static/screenshots/BarChart/highlight-below-marks-dark-400w.webp differ diff --git a/docs/static/screenshots/BarChart/highlight-below-marks-dark-800w.webp b/docs/static/screenshots/BarChart/highlight-below-marks-dark-800w.webp index 9b72c599dd..7e2d6a7f43 100644 Binary files a/docs/static/screenshots/BarChart/highlight-below-marks-dark-800w.webp and b/docs/static/screenshots/BarChart/highlight-below-marks-dark-800w.webp differ diff --git a/docs/static/screenshots/BarChart/highlight-below-marks-light-240w.webp b/docs/static/screenshots/BarChart/highlight-below-marks-light-240w.webp index 5b9d3613c3..42ffd0346b 100644 Binary files a/docs/static/screenshots/BarChart/highlight-below-marks-light-240w.webp and b/docs/static/screenshots/BarChart/highlight-below-marks-light-240w.webp differ diff --git a/docs/static/screenshots/BarChart/highlight-below-marks-light-400w.webp b/docs/static/screenshots/BarChart/highlight-below-marks-light-400w.webp index 453e26a72b..5fa525806a 100644 Binary files a/docs/static/screenshots/BarChart/highlight-below-marks-light-400w.webp and b/docs/static/screenshots/BarChart/highlight-below-marks-light-400w.webp differ diff --git a/docs/static/screenshots/BarChart/highlight-below-marks-light-800w.webp b/docs/static/screenshots/BarChart/highlight-below-marks-light-800w.webp index a45f727015..eb6b584006 100644 Binary files a/docs/static/screenshots/BarChart/highlight-below-marks-light-800w.webp and b/docs/static/screenshots/BarChart/highlight-below-marks-light-800w.webp differ diff --git a/docs/static/screenshots/BarChart/histogram-date-time-count-dark-240w.webp b/docs/static/screenshots/BarChart/histogram-date-time-count-dark-240w.webp index 13a6f88420..fd9a65889f 100644 Binary files a/docs/static/screenshots/BarChart/histogram-date-time-count-dark-240w.webp and b/docs/static/screenshots/BarChart/histogram-date-time-count-dark-240w.webp differ diff --git a/docs/static/screenshots/BarChart/histogram-date-time-count-dark-400w.webp b/docs/static/screenshots/BarChart/histogram-date-time-count-dark-400w.webp index b84bbbdc06..b5c9806218 100644 Binary files a/docs/static/screenshots/BarChart/histogram-date-time-count-dark-400w.webp and b/docs/static/screenshots/BarChart/histogram-date-time-count-dark-400w.webp differ diff --git a/docs/static/screenshots/BarChart/histogram-date-time-count-dark-800w.webp b/docs/static/screenshots/BarChart/histogram-date-time-count-dark-800w.webp index 98a64c06ba..3fba53d59e 100644 Binary files a/docs/static/screenshots/BarChart/histogram-date-time-count-dark-800w.webp and b/docs/static/screenshots/BarChart/histogram-date-time-count-dark-800w.webp differ diff --git a/docs/static/screenshots/BarChart/histogram-date-time-count-light-240w.webp b/docs/static/screenshots/BarChart/histogram-date-time-count-light-240w.webp index 32eac6dac1..654368b2c5 100644 Binary files a/docs/static/screenshots/BarChart/histogram-date-time-count-light-240w.webp and b/docs/static/screenshots/BarChart/histogram-date-time-count-light-240w.webp differ diff --git a/docs/static/screenshots/BarChart/histogram-date-time-count-light-400w.webp b/docs/static/screenshots/BarChart/histogram-date-time-count-light-400w.webp index 32b817f5e2..d8774eda3d 100644 Binary files a/docs/static/screenshots/BarChart/histogram-date-time-count-light-400w.webp and b/docs/static/screenshots/BarChart/histogram-date-time-count-light-400w.webp differ diff --git a/docs/static/screenshots/BarChart/histogram-date-time-count-light-800w.webp b/docs/static/screenshots/BarChart/histogram-date-time-count-light-800w.webp index 8a360835d4..5921527045 100644 Binary files a/docs/static/screenshots/BarChart/histogram-date-time-count-light-800w.webp and b/docs/static/screenshots/BarChart/histogram-date-time-count-light-800w.webp differ diff --git a/docs/static/screenshots/BarChart/histogram-date-time-interval-dark-240w.webp b/docs/static/screenshots/BarChart/histogram-date-time-interval-dark-240w.webp index 25c65e8132..d68c5726be 100644 Binary files a/docs/static/screenshots/BarChart/histogram-date-time-interval-dark-240w.webp and b/docs/static/screenshots/BarChart/histogram-date-time-interval-dark-240w.webp differ diff --git a/docs/static/screenshots/BarChart/histogram-date-time-interval-dark-400w.webp b/docs/static/screenshots/BarChart/histogram-date-time-interval-dark-400w.webp index 0d11ef79e3..45cea2bbeb 100644 Binary files a/docs/static/screenshots/BarChart/histogram-date-time-interval-dark-400w.webp and b/docs/static/screenshots/BarChart/histogram-date-time-interval-dark-400w.webp differ diff --git a/docs/static/screenshots/BarChart/histogram-date-time-interval-dark-800w.webp b/docs/static/screenshots/BarChart/histogram-date-time-interval-dark-800w.webp index a92ca87584..fab76d1864 100644 Binary files a/docs/static/screenshots/BarChart/histogram-date-time-interval-dark-800w.webp and b/docs/static/screenshots/BarChart/histogram-date-time-interval-dark-800w.webp differ diff --git a/docs/static/screenshots/BarChart/histogram-date-time-interval-light-240w.webp b/docs/static/screenshots/BarChart/histogram-date-time-interval-light-240w.webp index 9685f10929..19c1277e42 100644 Binary files a/docs/static/screenshots/BarChart/histogram-date-time-interval-light-240w.webp and b/docs/static/screenshots/BarChart/histogram-date-time-interval-light-240w.webp differ diff --git a/docs/static/screenshots/BarChart/histogram-date-time-interval-light-400w.webp b/docs/static/screenshots/BarChart/histogram-date-time-interval-light-400w.webp index 48106b2c98..a97c8a921f 100644 Binary files a/docs/static/screenshots/BarChart/histogram-date-time-interval-light-400w.webp and b/docs/static/screenshots/BarChart/histogram-date-time-interval-light-400w.webp differ diff --git a/docs/static/screenshots/BarChart/histogram-date-time-interval-light-800w.webp b/docs/static/screenshots/BarChart/histogram-date-time-interval-light-800w.webp index 5870b9a830..57a28cd3dc 100644 Binary files a/docs/static/screenshots/BarChart/histogram-date-time-interval-light-800w.webp and b/docs/static/screenshots/BarChart/histogram-date-time-interval-light-800w.webp differ diff --git a/docs/static/screenshots/BarChart/histogram-random-distribution-dark-240w.webp b/docs/static/screenshots/BarChart/histogram-random-distribution-dark-240w.webp index a2677dc5fc..5038a8d390 100644 Binary files a/docs/static/screenshots/BarChart/histogram-random-distribution-dark-240w.webp and b/docs/static/screenshots/BarChart/histogram-random-distribution-dark-240w.webp differ diff --git a/docs/static/screenshots/BarChart/histogram-random-distribution-dark-400w.webp b/docs/static/screenshots/BarChart/histogram-random-distribution-dark-400w.webp index 1a9c930013..13556b116b 100644 Binary files a/docs/static/screenshots/BarChart/histogram-random-distribution-dark-400w.webp and b/docs/static/screenshots/BarChart/histogram-random-distribution-dark-400w.webp differ diff --git a/docs/static/screenshots/BarChart/histogram-random-distribution-dark-800w.webp b/docs/static/screenshots/BarChart/histogram-random-distribution-dark-800w.webp index 1f7ca5a703..e9df7888a2 100644 Binary files a/docs/static/screenshots/BarChart/histogram-random-distribution-dark-800w.webp and b/docs/static/screenshots/BarChart/histogram-random-distribution-dark-800w.webp differ diff --git a/docs/static/screenshots/BarChart/histogram-random-distribution-light-240w.webp b/docs/static/screenshots/BarChart/histogram-random-distribution-light-240w.webp index 811230c167..2a5aa0a118 100644 Binary files a/docs/static/screenshots/BarChart/histogram-random-distribution-light-240w.webp and b/docs/static/screenshots/BarChart/histogram-random-distribution-light-240w.webp differ diff --git a/docs/static/screenshots/BarChart/histogram-random-distribution-light-400w.webp b/docs/static/screenshots/BarChart/histogram-random-distribution-light-400w.webp index 88fb13890b..57b2bcf516 100644 Binary files a/docs/static/screenshots/BarChart/histogram-random-distribution-light-400w.webp and b/docs/static/screenshots/BarChart/histogram-random-distribution-light-400w.webp differ diff --git a/docs/static/screenshots/BarChart/histogram-random-distribution-light-800w.webp b/docs/static/screenshots/BarChart/histogram-random-distribution-light-800w.webp index 16257a6e80..a0d11f6651 100644 Binary files a/docs/static/screenshots/BarChart/histogram-random-distribution-light-800w.webp and b/docs/static/screenshots/BarChart/histogram-random-distribution-light-800w.webp differ diff --git a/docs/static/screenshots/BarChart/horizontal-dark-240w.webp b/docs/static/screenshots/BarChart/horizontal-dark-240w.webp index fca72e171d..61bd9c7e00 100644 Binary files a/docs/static/screenshots/BarChart/horizontal-dark-240w.webp and b/docs/static/screenshots/BarChart/horizontal-dark-240w.webp differ diff --git a/docs/static/screenshots/BarChart/horizontal-dark-400w.webp b/docs/static/screenshots/BarChart/horizontal-dark-400w.webp index 426ea355df..e380e82c86 100644 Binary files a/docs/static/screenshots/BarChart/horizontal-dark-400w.webp and b/docs/static/screenshots/BarChart/horizontal-dark-400w.webp differ diff --git a/docs/static/screenshots/BarChart/horizontal-dark-800w.webp b/docs/static/screenshots/BarChart/horizontal-dark-800w.webp index 391ffb37db..4872fbe747 100644 Binary files a/docs/static/screenshots/BarChart/horizontal-dark-800w.webp and b/docs/static/screenshots/BarChart/horizontal-dark-800w.webp differ diff --git a/docs/static/screenshots/BarChart/horizontal-light-240w.webp b/docs/static/screenshots/BarChart/horizontal-light-240w.webp index b05694ac1f..0058817cd4 100644 Binary files a/docs/static/screenshots/BarChart/horizontal-light-240w.webp and b/docs/static/screenshots/BarChart/horizontal-light-240w.webp differ diff --git a/docs/static/screenshots/BarChart/horizontal-light-400w.webp b/docs/static/screenshots/BarChart/horizontal-light-400w.webp index 412132a444..554c8e2385 100644 Binary files a/docs/static/screenshots/BarChart/horizontal-light-400w.webp and b/docs/static/screenshots/BarChart/horizontal-light-400w.webp differ diff --git a/docs/static/screenshots/BarChart/horizontal-light-800w.webp b/docs/static/screenshots/BarChart/horizontal-light-800w.webp index 238802b2ee..bb812f4222 100644 Binary files a/docs/static/screenshots/BarChart/horizontal-light-800w.webp and b/docs/static/screenshots/BarChart/horizontal-light-800w.webp differ diff --git a/docs/static/screenshots/BarChart/labels-dark-240w.webp b/docs/static/screenshots/BarChart/labels-dark-240w.webp index f4a0a78203..7bdf678a3d 100644 Binary files a/docs/static/screenshots/BarChart/labels-dark-240w.webp and b/docs/static/screenshots/BarChart/labels-dark-240w.webp differ diff --git a/docs/static/screenshots/BarChart/labels-dark-400w.webp b/docs/static/screenshots/BarChart/labels-dark-400w.webp index 31ea4bd87b..6ffcf2ba26 100644 Binary files a/docs/static/screenshots/BarChart/labels-dark-400w.webp and b/docs/static/screenshots/BarChart/labels-dark-400w.webp differ diff --git a/docs/static/screenshots/BarChart/labels-dark-800w.webp b/docs/static/screenshots/BarChart/labels-dark-800w.webp index 92602486ab..842ee14241 100644 Binary files a/docs/static/screenshots/BarChart/labels-dark-800w.webp and b/docs/static/screenshots/BarChart/labels-dark-800w.webp differ diff --git a/docs/static/screenshots/BarChart/labels-inside-placement-dark-240w.webp b/docs/static/screenshots/BarChart/labels-inside-placement-dark-240w.webp index f4ff8e1d82..a2021d7d43 100644 Binary files a/docs/static/screenshots/BarChart/labels-inside-placement-dark-240w.webp and b/docs/static/screenshots/BarChart/labels-inside-placement-dark-240w.webp differ diff --git a/docs/static/screenshots/BarChart/labels-inside-placement-dark-400w.webp b/docs/static/screenshots/BarChart/labels-inside-placement-dark-400w.webp index 2dad7555d5..3c5ea7a9c2 100644 Binary files a/docs/static/screenshots/BarChart/labels-inside-placement-dark-400w.webp and b/docs/static/screenshots/BarChart/labels-inside-placement-dark-400w.webp differ diff --git a/docs/static/screenshots/BarChart/labels-inside-placement-dark-800w.webp b/docs/static/screenshots/BarChart/labels-inside-placement-dark-800w.webp index ae8af2ac26..6dd28c9cca 100644 Binary files a/docs/static/screenshots/BarChart/labels-inside-placement-dark-800w.webp and b/docs/static/screenshots/BarChart/labels-inside-placement-dark-800w.webp differ diff --git a/docs/static/screenshots/BarChart/labels-inside-placement-light-240w.webp b/docs/static/screenshots/BarChart/labels-inside-placement-light-240w.webp index 2ea92e8bc5..8cbb118134 100644 Binary files a/docs/static/screenshots/BarChart/labels-inside-placement-light-240w.webp and b/docs/static/screenshots/BarChart/labels-inside-placement-light-240w.webp differ diff --git a/docs/static/screenshots/BarChart/labels-inside-placement-light-400w.webp b/docs/static/screenshots/BarChart/labels-inside-placement-light-400w.webp index f90b3eb4ee..5051eac999 100644 Binary files a/docs/static/screenshots/BarChart/labels-inside-placement-light-400w.webp and b/docs/static/screenshots/BarChart/labels-inside-placement-light-400w.webp differ diff --git a/docs/static/screenshots/BarChart/labels-inside-placement-light-800w.webp b/docs/static/screenshots/BarChart/labels-inside-placement-light-800w.webp index 8dd411f4ae..2775a852e8 100644 Binary files a/docs/static/screenshots/BarChart/labels-inside-placement-light-800w.webp and b/docs/static/screenshots/BarChart/labels-inside-placement-light-800w.webp differ diff --git a/docs/static/screenshots/BarChart/labels-light-240w.webp b/docs/static/screenshots/BarChart/labels-light-240w.webp index f7fc08c331..0831a5d486 100644 Binary files a/docs/static/screenshots/BarChart/labels-light-240w.webp and b/docs/static/screenshots/BarChart/labels-light-240w.webp differ diff --git a/docs/static/screenshots/BarChart/labels-light-400w.webp b/docs/static/screenshots/BarChart/labels-light-400w.webp index d425a8aa4c..34b95eff43 100644 Binary files a/docs/static/screenshots/BarChart/labels-light-400w.webp and b/docs/static/screenshots/BarChart/labels-light-400w.webp differ diff --git a/docs/static/screenshots/BarChart/labels-light-800w.webp b/docs/static/screenshots/BarChart/labels-light-800w.webp index 4623ced6eb..d3351e6469 100644 Binary files a/docs/static/screenshots/BarChart/labels-light-800w.webp and b/docs/static/screenshots/BarChart/labels-light-800w.webp differ diff --git a/docs/static/screenshots/BarChart/labels-placement-dark-240w.webp b/docs/static/screenshots/BarChart/labels-placement-dark-240w.webp index 83260f17c5..79c37e3a62 100644 Binary files a/docs/static/screenshots/BarChart/labels-placement-dark-240w.webp and b/docs/static/screenshots/BarChart/labels-placement-dark-240w.webp differ diff --git a/docs/static/screenshots/BarChart/labels-placement-dark-400w.webp b/docs/static/screenshots/BarChart/labels-placement-dark-400w.webp index 41fda87a31..aa860c6c9a 100644 Binary files a/docs/static/screenshots/BarChart/labels-placement-dark-400w.webp and b/docs/static/screenshots/BarChart/labels-placement-dark-400w.webp differ diff --git a/docs/static/screenshots/BarChart/labels-placement-dark-800w.webp b/docs/static/screenshots/BarChart/labels-placement-dark-800w.webp index ddd2b76a99..65a1fcf68b 100644 Binary files a/docs/static/screenshots/BarChart/labels-placement-dark-800w.webp and b/docs/static/screenshots/BarChart/labels-placement-dark-800w.webp differ diff --git a/docs/static/screenshots/BarChart/labels-placement-light-240w.webp b/docs/static/screenshots/BarChart/labels-placement-light-240w.webp index 1538c34c97..208923d38c 100644 Binary files a/docs/static/screenshots/BarChart/labels-placement-light-240w.webp and b/docs/static/screenshots/BarChart/labels-placement-light-240w.webp differ diff --git a/docs/static/screenshots/BarChart/labels-placement-light-400w.webp b/docs/static/screenshots/BarChart/labels-placement-light-400w.webp index 036144d001..c829bfde23 100644 Binary files a/docs/static/screenshots/BarChart/labels-placement-light-400w.webp and b/docs/static/screenshots/BarChart/labels-placement-light-400w.webp differ diff --git a/docs/static/screenshots/BarChart/labels-placement-light-800w.webp b/docs/static/screenshots/BarChart/labels-placement-light-800w.webp index 517544015c..105d27c090 100644 Binary files a/docs/static/screenshots/BarChart/labels-placement-light-800w.webp and b/docs/static/screenshots/BarChart/labels-placement-light-800w.webp differ diff --git a/docs/static/screenshots/BarChart/language-race-dark-400w.webp b/docs/static/screenshots/BarChart/language-race-dark-400w.webp index 59d82b6492..006e017ea1 100644 Binary files a/docs/static/screenshots/BarChart/language-race-dark-400w.webp and b/docs/static/screenshots/BarChart/language-race-dark-400w.webp differ diff --git a/docs/static/screenshots/BarChart/language-race-dark-800w.webp b/docs/static/screenshots/BarChart/language-race-dark-800w.webp index cb57dda852..259069bee3 100644 Binary files a/docs/static/screenshots/BarChart/language-race-dark-800w.webp and b/docs/static/screenshots/BarChart/language-race-dark-800w.webp differ diff --git a/docs/static/screenshots/BarChart/language-race-light-400w.webp b/docs/static/screenshots/BarChart/language-race-light-400w.webp index 1276ee9946..4884ab625c 100644 Binary files a/docs/static/screenshots/BarChart/language-race-light-400w.webp and b/docs/static/screenshots/BarChart/language-race-light-400w.webp differ diff --git a/docs/static/screenshots/BarChart/language-race-light-800w.webp b/docs/static/screenshots/BarChart/language-race-light-800w.webp index 0e2d2ca72f..8c1aeeb313 100644 Binary files a/docs/static/screenshots/BarChart/language-race-light-800w.webp and b/docs/static/screenshots/BarChart/language-race-light-800w.webp differ diff --git a/docs/static/screenshots/BarChart/legend-custom-labels-dark-240w.webp b/docs/static/screenshots/BarChart/legend-custom-labels-dark-240w.webp index 650b8ce098..ed90a513b5 100644 Binary files a/docs/static/screenshots/BarChart/legend-custom-labels-dark-240w.webp and b/docs/static/screenshots/BarChart/legend-custom-labels-dark-240w.webp differ diff --git a/docs/static/screenshots/BarChart/legend-custom-labels-dark-400w.webp b/docs/static/screenshots/BarChart/legend-custom-labels-dark-400w.webp index 94866da4fa..e7b25b0ace 100644 Binary files a/docs/static/screenshots/BarChart/legend-custom-labels-dark-400w.webp and b/docs/static/screenshots/BarChart/legend-custom-labels-dark-400w.webp differ diff --git a/docs/static/screenshots/BarChart/legend-custom-labels-dark-800w.webp b/docs/static/screenshots/BarChart/legend-custom-labels-dark-800w.webp index 3b9a538952..884e20fece 100644 Binary files a/docs/static/screenshots/BarChart/legend-custom-labels-dark-800w.webp and b/docs/static/screenshots/BarChart/legend-custom-labels-dark-800w.webp differ diff --git a/docs/static/screenshots/BarChart/legend-custom-labels-light-240w.webp b/docs/static/screenshots/BarChart/legend-custom-labels-light-240w.webp index e4eacb0bf9..ec56047253 100644 Binary files a/docs/static/screenshots/BarChart/legend-custom-labels-light-240w.webp and b/docs/static/screenshots/BarChart/legend-custom-labels-light-240w.webp differ diff --git a/docs/static/screenshots/BarChart/legend-custom-labels-light-400w.webp b/docs/static/screenshots/BarChart/legend-custom-labels-light-400w.webp index b002a8c253..7f134ebf3a 100644 Binary files a/docs/static/screenshots/BarChart/legend-custom-labels-light-400w.webp and b/docs/static/screenshots/BarChart/legend-custom-labels-light-400w.webp differ diff --git a/docs/static/screenshots/BarChart/legend-custom-labels-light-800w.webp b/docs/static/screenshots/BarChart/legend-custom-labels-light-800w.webp index 587b8b0ee5..7722eaa32f 100644 Binary files a/docs/static/screenshots/BarChart/legend-custom-labels-light-800w.webp and b/docs/static/screenshots/BarChart/legend-custom-labels-light-800w.webp differ diff --git a/docs/static/screenshots/BarChart/legend-group-series-dark-240w.webp b/docs/static/screenshots/BarChart/legend-group-series-dark-240w.webp index 09023d53a5..51e3fe1976 100644 Binary files a/docs/static/screenshots/BarChart/legend-group-series-dark-240w.webp and b/docs/static/screenshots/BarChart/legend-group-series-dark-240w.webp differ diff --git a/docs/static/screenshots/BarChart/legend-group-series-dark-400w.webp b/docs/static/screenshots/BarChart/legend-group-series-dark-400w.webp index 0e890f4e97..d1901648c2 100644 Binary files a/docs/static/screenshots/BarChart/legend-group-series-dark-400w.webp and b/docs/static/screenshots/BarChart/legend-group-series-dark-400w.webp differ diff --git a/docs/static/screenshots/BarChart/legend-group-series-dark-800w.webp b/docs/static/screenshots/BarChart/legend-group-series-dark-800w.webp index ce4b795473..0129a45491 100644 Binary files a/docs/static/screenshots/BarChart/legend-group-series-dark-800w.webp and b/docs/static/screenshots/BarChart/legend-group-series-dark-800w.webp differ diff --git a/docs/static/screenshots/BarChart/legend-group-series-light-400w.webp b/docs/static/screenshots/BarChart/legend-group-series-light-400w.webp index 9dfa85aa93..40f49a6409 100644 Binary files a/docs/static/screenshots/BarChart/legend-group-series-light-400w.webp and b/docs/static/screenshots/BarChart/legend-group-series-light-400w.webp differ diff --git a/docs/static/screenshots/BarChart/legend-group-series-light-800w.webp b/docs/static/screenshots/BarChart/legend-group-series-light-800w.webp index c06d359e24..2535ed6aec 100644 Binary files a/docs/static/screenshots/BarChart/legend-group-series-light-800w.webp and b/docs/static/screenshots/BarChart/legend-group-series-light-800w.webp differ diff --git a/docs/static/screenshots/BarChart/legend-placement-dark-400w.webp b/docs/static/screenshots/BarChart/legend-placement-dark-400w.webp index cf89b5e7f2..b19aeb3ff9 100644 Binary files a/docs/static/screenshots/BarChart/legend-placement-dark-400w.webp and b/docs/static/screenshots/BarChart/legend-placement-dark-400w.webp differ diff --git a/docs/static/screenshots/BarChart/legend-placement-dark-800w.webp b/docs/static/screenshots/BarChart/legend-placement-dark-800w.webp index 55915b15c8..1b4f02bbd9 100644 Binary files a/docs/static/screenshots/BarChart/legend-placement-dark-800w.webp and b/docs/static/screenshots/BarChart/legend-placement-dark-800w.webp differ diff --git a/docs/static/screenshots/BarChart/legend-placement-light-800w.webp b/docs/static/screenshots/BarChart/legend-placement-light-800w.webp index 5af9c360b3..cbfa2f11ea 100644 Binary files a/docs/static/screenshots/BarChart/legend-placement-light-800w.webp and b/docs/static/screenshots/BarChart/legend-placement-light-800w.webp differ diff --git a/docs/static/screenshots/BarChart/legend-stack-series-dark-240w.webp b/docs/static/screenshots/BarChart/legend-stack-series-dark-240w.webp index d489949676..f218557e96 100644 Binary files a/docs/static/screenshots/BarChart/legend-stack-series-dark-240w.webp and b/docs/static/screenshots/BarChart/legend-stack-series-dark-240w.webp differ diff --git a/docs/static/screenshots/BarChart/legend-stack-series-dark-400w.webp b/docs/static/screenshots/BarChart/legend-stack-series-dark-400w.webp index 71f9dcee5c..11e493a23e 100644 Binary files a/docs/static/screenshots/BarChart/legend-stack-series-dark-400w.webp and b/docs/static/screenshots/BarChart/legend-stack-series-dark-400w.webp differ diff --git a/docs/static/screenshots/BarChart/legend-stack-series-dark-800w.webp b/docs/static/screenshots/BarChart/legend-stack-series-dark-800w.webp index d4151a076f..9746668858 100644 Binary files a/docs/static/screenshots/BarChart/legend-stack-series-dark-800w.webp and b/docs/static/screenshots/BarChart/legend-stack-series-dark-800w.webp differ diff --git a/docs/static/screenshots/BarChart/legend-stack-series-light-400w.webp b/docs/static/screenshots/BarChart/legend-stack-series-light-400w.webp index 04ff2b446a..3310264720 100644 Binary files a/docs/static/screenshots/BarChart/legend-stack-series-light-400w.webp and b/docs/static/screenshots/BarChart/legend-stack-series-light-400w.webp differ diff --git a/docs/static/screenshots/BarChart/legend-stack-series-light-800w.webp b/docs/static/screenshots/BarChart/legend-stack-series-light-800w.webp index 8b2e86fd76..2c23b70c4a 100644 Binary files a/docs/static/screenshots/BarChart/legend-stack-series-light-800w.webp and b/docs/static/screenshots/BarChart/legend-stack-series-light-800w.webp differ diff --git a/docs/static/screenshots/BarChart/line-annotation-dark-240w.webp b/docs/static/screenshots/BarChart/line-annotation-dark-240w.webp index a746de1e9d..ecfe59266b 100644 Binary files a/docs/static/screenshots/BarChart/line-annotation-dark-240w.webp and b/docs/static/screenshots/BarChart/line-annotation-dark-240w.webp differ diff --git a/docs/static/screenshots/BarChart/line-annotation-dark-400w.webp b/docs/static/screenshots/BarChart/line-annotation-dark-400w.webp index f65be9de24..6ab075f32e 100644 Binary files a/docs/static/screenshots/BarChart/line-annotation-dark-400w.webp and b/docs/static/screenshots/BarChart/line-annotation-dark-400w.webp differ diff --git a/docs/static/screenshots/BarChart/line-annotation-dark-800w.webp b/docs/static/screenshots/BarChart/line-annotation-dark-800w.webp index 03ccd080c2..a47999fb2e 100644 Binary files a/docs/static/screenshots/BarChart/line-annotation-dark-800w.webp and b/docs/static/screenshots/BarChart/line-annotation-dark-800w.webp differ diff --git a/docs/static/screenshots/BarChart/line-annotation-light-240w.webp b/docs/static/screenshots/BarChart/line-annotation-light-240w.webp index a1ca8e925b..eb77fad9bb 100644 Binary files a/docs/static/screenshots/BarChart/line-annotation-light-240w.webp and b/docs/static/screenshots/BarChart/line-annotation-light-240w.webp differ diff --git a/docs/static/screenshots/BarChart/line-annotation-light-400w.webp b/docs/static/screenshots/BarChart/line-annotation-light-400w.webp index c29550c862..4f79e30153 100644 Binary files a/docs/static/screenshots/BarChart/line-annotation-light-400w.webp and b/docs/static/screenshots/BarChart/line-annotation-light-400w.webp differ diff --git a/docs/static/screenshots/BarChart/line-annotation-light-800w.webp b/docs/static/screenshots/BarChart/line-annotation-light-800w.webp index 5170dadca8..fcae0d6c05 100644 Binary files a/docs/static/screenshots/BarChart/line-annotation-light-800w.webp and b/docs/static/screenshots/BarChart/line-annotation-light-800w.webp differ diff --git a/docs/static/screenshots/BarChart/motion-tween-dark-240w.webp b/docs/static/screenshots/BarChart/motion-tween-dark-240w.webp index e0db8eb521..b720a12da1 100644 Binary files a/docs/static/screenshots/BarChart/motion-tween-dark-240w.webp and b/docs/static/screenshots/BarChart/motion-tween-dark-240w.webp differ diff --git a/docs/static/screenshots/BarChart/motion-tween-dark-400w.webp b/docs/static/screenshots/BarChart/motion-tween-dark-400w.webp index c368ffcc50..9487952872 100644 Binary files a/docs/static/screenshots/BarChart/motion-tween-dark-400w.webp and b/docs/static/screenshots/BarChart/motion-tween-dark-400w.webp differ diff --git a/docs/static/screenshots/BarChart/motion-tween-dark-800w.webp b/docs/static/screenshots/BarChart/motion-tween-dark-800w.webp index 7b3fb71cd5..276347c513 100644 Binary files a/docs/static/screenshots/BarChart/motion-tween-dark-800w.webp and b/docs/static/screenshots/BarChart/motion-tween-dark-800w.webp differ diff --git a/docs/static/screenshots/BarChart/motion-tween-light-240w.webp b/docs/static/screenshots/BarChart/motion-tween-light-240w.webp index 6b694a687c..30c8434d91 100644 Binary files a/docs/static/screenshots/BarChart/motion-tween-light-240w.webp and b/docs/static/screenshots/BarChart/motion-tween-light-240w.webp differ diff --git a/docs/static/screenshots/BarChart/motion-tween-light-400w.webp b/docs/static/screenshots/BarChart/motion-tween-light-400w.webp index 213516dc75..a6e25c2738 100644 Binary files a/docs/static/screenshots/BarChart/motion-tween-light-400w.webp and b/docs/static/screenshots/BarChart/motion-tween-light-400w.webp differ diff --git a/docs/static/screenshots/BarChart/motion-tween-light-800w.webp b/docs/static/screenshots/BarChart/motion-tween-light-800w.webp index 02e4bf25f1..baf1dcccae 100644 Binary files a/docs/static/screenshots/BarChart/motion-tween-light-800w.webp and b/docs/static/screenshots/BarChart/motion-tween-light-800w.webp differ diff --git a/docs/static/screenshots/BarChart/oscilloscope-frequency-dark-240w.webp b/docs/static/screenshots/BarChart/oscilloscope-frequency-dark-240w.webp index 81888e99e0..505d4ab02c 100644 Binary files a/docs/static/screenshots/BarChart/oscilloscope-frequency-dark-240w.webp and b/docs/static/screenshots/BarChart/oscilloscope-frequency-dark-240w.webp differ diff --git a/docs/static/screenshots/BarChart/oscilloscope-frequency-dark-400w.webp b/docs/static/screenshots/BarChart/oscilloscope-frequency-dark-400w.webp index 9d3893a045..d8ba586e46 100644 Binary files a/docs/static/screenshots/BarChart/oscilloscope-frequency-dark-400w.webp and b/docs/static/screenshots/BarChart/oscilloscope-frequency-dark-400w.webp differ diff --git a/docs/static/screenshots/BarChart/oscilloscope-frequency-dark-800w.webp b/docs/static/screenshots/BarChart/oscilloscope-frequency-dark-800w.webp index 00101bca00..e5ce502b30 100644 Binary files a/docs/static/screenshots/BarChart/oscilloscope-frequency-dark-800w.webp and b/docs/static/screenshots/BarChart/oscilloscope-frequency-dark-800w.webp differ diff --git a/docs/static/screenshots/BarChart/oscilloscope-frequency-light-240w.webp b/docs/static/screenshots/BarChart/oscilloscope-frequency-light-240w.webp index ae3c805d04..fc94824a5e 100644 Binary files a/docs/static/screenshots/BarChart/oscilloscope-frequency-light-240w.webp and b/docs/static/screenshots/BarChart/oscilloscope-frequency-light-240w.webp differ diff --git a/docs/static/screenshots/BarChart/oscilloscope-frequency-light-400w.webp b/docs/static/screenshots/BarChart/oscilloscope-frequency-light-400w.webp index 79a78922a9..d613c4816c 100644 Binary files a/docs/static/screenshots/BarChart/oscilloscope-frequency-light-400w.webp and b/docs/static/screenshots/BarChart/oscilloscope-frequency-light-400w.webp differ diff --git a/docs/static/screenshots/BarChart/oscilloscope-frequency-light-800w.webp b/docs/static/screenshots/BarChart/oscilloscope-frequency-light-800w.webp index 6830d27aed..6ac3651c70 100644 Binary files a/docs/static/screenshots/BarChart/oscilloscope-frequency-light-800w.webp and b/docs/static/screenshots/BarChart/oscilloscope-frequency-light-800w.webp differ diff --git a/docs/static/screenshots/BarChart/override-axis-ticks-with-custom-scale-dark-240w.webp b/docs/static/screenshots/BarChart/override-axis-ticks-with-custom-scale-dark-240w.webp index 698eb01f94..b116173aef 100644 Binary files a/docs/static/screenshots/BarChart/override-axis-ticks-with-custom-scale-dark-240w.webp and b/docs/static/screenshots/BarChart/override-axis-ticks-with-custom-scale-dark-240w.webp differ diff --git a/docs/static/screenshots/BarChart/override-axis-ticks-with-custom-scale-dark-400w.webp b/docs/static/screenshots/BarChart/override-axis-ticks-with-custom-scale-dark-400w.webp index cd4747b155..18853b5ea4 100644 Binary files a/docs/static/screenshots/BarChart/override-axis-ticks-with-custom-scale-dark-400w.webp and b/docs/static/screenshots/BarChart/override-axis-ticks-with-custom-scale-dark-400w.webp differ diff --git a/docs/static/screenshots/BarChart/override-axis-ticks-with-custom-scale-dark-800w.webp b/docs/static/screenshots/BarChart/override-axis-ticks-with-custom-scale-dark-800w.webp index 219f78ac9f..69fa28723a 100644 Binary files a/docs/static/screenshots/BarChart/override-axis-ticks-with-custom-scale-dark-800w.webp and b/docs/static/screenshots/BarChart/override-axis-ticks-with-custom-scale-dark-800w.webp differ diff --git a/docs/static/screenshots/BarChart/override-axis-ticks-with-custom-scale-light-240w.webp b/docs/static/screenshots/BarChart/override-axis-ticks-with-custom-scale-light-240w.webp index 05891fbbc4..68e7540821 100644 Binary files a/docs/static/screenshots/BarChart/override-axis-ticks-with-custom-scale-light-240w.webp and b/docs/static/screenshots/BarChart/override-axis-ticks-with-custom-scale-light-240w.webp differ diff --git a/docs/static/screenshots/BarChart/override-axis-ticks-with-custom-scale-light-400w.webp b/docs/static/screenshots/BarChart/override-axis-ticks-with-custom-scale-light-400w.webp index 02cecaf888..0454ed3c59 100644 Binary files a/docs/static/screenshots/BarChart/override-axis-ticks-with-custom-scale-light-400w.webp and b/docs/static/screenshots/BarChart/override-axis-ticks-with-custom-scale-light-400w.webp differ diff --git a/docs/static/screenshots/BarChart/override-axis-ticks-with-custom-scale-light-800w.webp b/docs/static/screenshots/BarChart/override-axis-ticks-with-custom-scale-light-800w.webp index ba71331825..9d5b2f240d 100644 Binary files a/docs/static/screenshots/BarChart/override-axis-ticks-with-custom-scale-light-800w.webp and b/docs/static/screenshots/BarChart/override-axis-ticks-with-custom-scale-light-800w.webp differ diff --git a/docs/static/screenshots/BarChart/pan-zoom-band-dark-240w.webp b/docs/static/screenshots/BarChart/pan-zoom-band-dark-240w.webp index ee4592eee2..a0ce7fc43f 100644 Binary files a/docs/static/screenshots/BarChart/pan-zoom-band-dark-240w.webp and b/docs/static/screenshots/BarChart/pan-zoom-band-dark-240w.webp differ diff --git a/docs/static/screenshots/BarChart/pan-zoom-band-dark-400w.webp b/docs/static/screenshots/BarChart/pan-zoom-band-dark-400w.webp index 1d831680b2..7a7edeaf15 100644 Binary files a/docs/static/screenshots/BarChart/pan-zoom-band-dark-400w.webp and b/docs/static/screenshots/BarChart/pan-zoom-band-dark-400w.webp differ diff --git a/docs/static/screenshots/BarChart/pan-zoom-band-dark-800w.webp b/docs/static/screenshots/BarChart/pan-zoom-band-dark-800w.webp index 38c8708d5d..a4313a1a67 100644 Binary files a/docs/static/screenshots/BarChart/pan-zoom-band-dark-800w.webp and b/docs/static/screenshots/BarChart/pan-zoom-band-dark-800w.webp differ diff --git a/docs/static/screenshots/BarChart/pan-zoom-band-light-240w.webp b/docs/static/screenshots/BarChart/pan-zoom-band-light-240w.webp index 64d81e28f1..586ccadc0b 100644 Binary files a/docs/static/screenshots/BarChart/pan-zoom-band-light-240w.webp and b/docs/static/screenshots/BarChart/pan-zoom-band-light-240w.webp differ diff --git a/docs/static/screenshots/BarChart/pan-zoom-band-light-400w.webp b/docs/static/screenshots/BarChart/pan-zoom-band-light-400w.webp index 8001218702..9cb8a7736d 100644 Binary files a/docs/static/screenshots/BarChart/pan-zoom-band-light-400w.webp and b/docs/static/screenshots/BarChart/pan-zoom-band-light-400w.webp differ diff --git a/docs/static/screenshots/BarChart/pan-zoom-band-light-800w.webp b/docs/static/screenshots/BarChart/pan-zoom-band-light-800w.webp index d1e76c8472..4ea5896003 100644 Binary files a/docs/static/screenshots/BarChart/pan-zoom-band-light-800w.webp and b/docs/static/screenshots/BarChart/pan-zoom-band-light-800w.webp differ diff --git a/docs/static/screenshots/BarChart/pan-zoom-dark-240w.webp b/docs/static/screenshots/BarChart/pan-zoom-dark-240w.webp index 1d6706f774..1573bcbbd7 100644 Binary files a/docs/static/screenshots/BarChart/pan-zoom-dark-240w.webp and b/docs/static/screenshots/BarChart/pan-zoom-dark-240w.webp differ diff --git a/docs/static/screenshots/BarChart/pan-zoom-dark-400w.webp b/docs/static/screenshots/BarChart/pan-zoom-dark-400w.webp index cc47d9aa41..73ee1cbd33 100644 Binary files a/docs/static/screenshots/BarChart/pan-zoom-dark-400w.webp and b/docs/static/screenshots/BarChart/pan-zoom-dark-400w.webp differ diff --git a/docs/static/screenshots/BarChart/pan-zoom-dark-800w.webp b/docs/static/screenshots/BarChart/pan-zoom-dark-800w.webp index c63b7604a1..7b621198f3 100644 Binary files a/docs/static/screenshots/BarChart/pan-zoom-dark-800w.webp and b/docs/static/screenshots/BarChart/pan-zoom-dark-800w.webp differ diff --git a/docs/static/screenshots/BarChart/pan-zoom-domain-extent-dark-240w.webp b/docs/static/screenshots/BarChart/pan-zoom-domain-extent-dark-240w.webp index 6c6780b371..f1c2fcec4d 100644 Binary files a/docs/static/screenshots/BarChart/pan-zoom-domain-extent-dark-240w.webp and b/docs/static/screenshots/BarChart/pan-zoom-domain-extent-dark-240w.webp differ diff --git a/docs/static/screenshots/BarChart/pan-zoom-domain-extent-dark-400w.webp b/docs/static/screenshots/BarChart/pan-zoom-domain-extent-dark-400w.webp index c7d2acd987..aac8ec38c8 100644 Binary files a/docs/static/screenshots/BarChart/pan-zoom-domain-extent-dark-400w.webp and b/docs/static/screenshots/BarChart/pan-zoom-domain-extent-dark-400w.webp differ diff --git a/docs/static/screenshots/BarChart/pan-zoom-domain-extent-dark-800w.webp b/docs/static/screenshots/BarChart/pan-zoom-domain-extent-dark-800w.webp index 9c454eb442..602f9d9aac 100644 Binary files a/docs/static/screenshots/BarChart/pan-zoom-domain-extent-dark-800w.webp and b/docs/static/screenshots/BarChart/pan-zoom-domain-extent-dark-800w.webp differ diff --git a/docs/static/screenshots/BarChart/pan-zoom-domain-extent-light-240w.webp b/docs/static/screenshots/BarChart/pan-zoom-domain-extent-light-240w.webp index 24c0b13ebe..d6c0b25436 100644 Binary files a/docs/static/screenshots/BarChart/pan-zoom-domain-extent-light-240w.webp and b/docs/static/screenshots/BarChart/pan-zoom-domain-extent-light-240w.webp differ diff --git a/docs/static/screenshots/BarChart/pan-zoom-domain-extent-light-400w.webp b/docs/static/screenshots/BarChart/pan-zoom-domain-extent-light-400w.webp index de890fb708..814fe233f0 100644 Binary files a/docs/static/screenshots/BarChart/pan-zoom-domain-extent-light-400w.webp and b/docs/static/screenshots/BarChart/pan-zoom-domain-extent-light-400w.webp differ diff --git a/docs/static/screenshots/BarChart/pan-zoom-domain-extent-light-800w.webp b/docs/static/screenshots/BarChart/pan-zoom-domain-extent-light-800w.webp index cbffb41486..e14f558d4d 100644 Binary files a/docs/static/screenshots/BarChart/pan-zoom-domain-extent-light-800w.webp and b/docs/static/screenshots/BarChart/pan-zoom-domain-extent-light-800w.webp differ diff --git a/docs/static/screenshots/BarChart/pan-zoom-light-240w.webp b/docs/static/screenshots/BarChart/pan-zoom-light-240w.webp index ef8352000c..972c9079b5 100644 Binary files a/docs/static/screenshots/BarChart/pan-zoom-light-240w.webp and b/docs/static/screenshots/BarChart/pan-zoom-light-240w.webp differ diff --git a/docs/static/screenshots/BarChart/pan-zoom-light-400w.webp b/docs/static/screenshots/BarChart/pan-zoom-light-400w.webp index d7c8c2c3e4..0eb162e8a2 100644 Binary files a/docs/static/screenshots/BarChart/pan-zoom-light-400w.webp and b/docs/static/screenshots/BarChart/pan-zoom-light-400w.webp differ diff --git a/docs/static/screenshots/BarChart/pan-zoom-light-800w.webp b/docs/static/screenshots/BarChart/pan-zoom-light-800w.webp index 36d879c02a..150acc8d47 100644 Binary files a/docs/static/screenshots/BarChart/pan-zoom-light-800w.webp and b/docs/static/screenshots/BarChart/pan-zoom-light-800w.webp differ diff --git a/docs/static/screenshots/BarChart/pan-zoom-scale-extent-dark-240w.webp b/docs/static/screenshots/BarChart/pan-zoom-scale-extent-dark-240w.webp index 76c9c4fed7..6b0bf15fe5 100644 Binary files a/docs/static/screenshots/BarChart/pan-zoom-scale-extent-dark-240w.webp and b/docs/static/screenshots/BarChart/pan-zoom-scale-extent-dark-240w.webp differ diff --git a/docs/static/screenshots/BarChart/pan-zoom-scale-extent-dark-400w.webp b/docs/static/screenshots/BarChart/pan-zoom-scale-extent-dark-400w.webp index 4b8294e82a..5766d3eab4 100644 Binary files a/docs/static/screenshots/BarChart/pan-zoom-scale-extent-dark-400w.webp and b/docs/static/screenshots/BarChart/pan-zoom-scale-extent-dark-400w.webp differ diff --git a/docs/static/screenshots/BarChart/pan-zoom-scale-extent-dark-800w.webp b/docs/static/screenshots/BarChart/pan-zoom-scale-extent-dark-800w.webp index e27fdabb68..3246c049bb 100644 Binary files a/docs/static/screenshots/BarChart/pan-zoom-scale-extent-dark-800w.webp and b/docs/static/screenshots/BarChart/pan-zoom-scale-extent-dark-800w.webp differ diff --git a/docs/static/screenshots/BarChart/pan-zoom-scale-extent-light-240w.webp b/docs/static/screenshots/BarChart/pan-zoom-scale-extent-light-240w.webp index 4319bb8189..6987e382b3 100644 Binary files a/docs/static/screenshots/BarChart/pan-zoom-scale-extent-light-240w.webp and b/docs/static/screenshots/BarChart/pan-zoom-scale-extent-light-240w.webp differ diff --git a/docs/static/screenshots/BarChart/pan-zoom-scale-extent-light-400w.webp b/docs/static/screenshots/BarChart/pan-zoom-scale-extent-light-400w.webp index e388b400ee..acce11187b 100644 Binary files a/docs/static/screenshots/BarChart/pan-zoom-scale-extent-light-400w.webp and b/docs/static/screenshots/BarChart/pan-zoom-scale-extent-light-400w.webp differ diff --git a/docs/static/screenshots/BarChart/pan-zoom-scale-extent-light-800w.webp b/docs/static/screenshots/BarChart/pan-zoom-scale-extent-light-800w.webp index 947fecc3a1..10c9108be6 100644 Binary files a/docs/static/screenshots/BarChart/pan-zoom-scale-extent-light-800w.webp and b/docs/static/screenshots/BarChart/pan-zoom-scale-extent-light-800w.webp differ diff --git a/docs/static/screenshots/BarChart/point-annotation-dark-240w.webp b/docs/static/screenshots/BarChart/point-annotation-dark-240w.webp index 2ab814abbb..7343d4d551 100644 Binary files a/docs/static/screenshots/BarChart/point-annotation-dark-240w.webp and b/docs/static/screenshots/BarChart/point-annotation-dark-240w.webp differ diff --git a/docs/static/screenshots/BarChart/point-annotation-dark-400w.webp b/docs/static/screenshots/BarChart/point-annotation-dark-400w.webp index 7852d598fe..63000901b4 100644 Binary files a/docs/static/screenshots/BarChart/point-annotation-dark-400w.webp and b/docs/static/screenshots/BarChart/point-annotation-dark-400w.webp differ diff --git a/docs/static/screenshots/BarChart/point-annotation-dark-800w.webp b/docs/static/screenshots/BarChart/point-annotation-dark-800w.webp index 93c606de44..3ac4c00137 100644 Binary files a/docs/static/screenshots/BarChart/point-annotation-dark-800w.webp and b/docs/static/screenshots/BarChart/point-annotation-dark-800w.webp differ diff --git a/docs/static/screenshots/BarChart/point-annotation-light-240w.webp b/docs/static/screenshots/BarChart/point-annotation-light-240w.webp index 5d86737f1a..2cf8718c49 100644 Binary files a/docs/static/screenshots/BarChart/point-annotation-light-240w.webp and b/docs/static/screenshots/BarChart/point-annotation-light-240w.webp differ diff --git a/docs/static/screenshots/BarChart/point-annotation-light-400w.webp b/docs/static/screenshots/BarChart/point-annotation-light-400w.webp index 6c07bba54e..2e3183eaaf 100644 Binary files a/docs/static/screenshots/BarChart/point-annotation-light-400w.webp and b/docs/static/screenshots/BarChart/point-annotation-light-400w.webp differ diff --git a/docs/static/screenshots/BarChart/point-annotation-light-800w.webp b/docs/static/screenshots/BarChart/point-annotation-light-800w.webp index 37810276e2..b8ba4f362c 100644 Binary files a/docs/static/screenshots/BarChart/point-annotation-light-800w.webp and b/docs/static/screenshots/BarChart/point-annotation-light-800w.webp differ diff --git a/docs/static/screenshots/BarChart/radial-horizontal-color-per-value-dark-400w.webp b/docs/static/screenshots/BarChart/radial-horizontal-color-per-value-dark-400w.webp index 9ad13c00c8..b8639cccd5 100644 Binary files a/docs/static/screenshots/BarChart/radial-horizontal-color-per-value-dark-400w.webp and b/docs/static/screenshots/BarChart/radial-horizontal-color-per-value-dark-400w.webp differ diff --git a/docs/static/screenshots/BarChart/radial-horizontal-color-per-value-light-800w.webp b/docs/static/screenshots/BarChart/radial-horizontal-color-per-value-light-800w.webp index 4775b34309..ddcfde099b 100644 Binary files a/docs/static/screenshots/BarChart/radial-horizontal-color-per-value-light-800w.webp and b/docs/static/screenshots/BarChart/radial-horizontal-color-per-value-light-800w.webp differ diff --git a/docs/static/screenshots/BarChart/radial-horizontal-dark-240w.webp b/docs/static/screenshots/BarChart/radial-horizontal-dark-240w.webp index ccb1b95ffe..0639802abf 100644 Binary files a/docs/static/screenshots/BarChart/radial-horizontal-dark-240w.webp and b/docs/static/screenshots/BarChart/radial-horizontal-dark-240w.webp differ diff --git a/docs/static/screenshots/BarChart/radial-horizontal-dark-400w.webp b/docs/static/screenshots/BarChart/radial-horizontal-dark-400w.webp index e61e440174..6594933257 100644 Binary files a/docs/static/screenshots/BarChart/radial-horizontal-dark-400w.webp and b/docs/static/screenshots/BarChart/radial-horizontal-dark-400w.webp differ diff --git a/docs/static/screenshots/BarChart/radial-horizontal-dark-800w.webp b/docs/static/screenshots/BarChart/radial-horizontal-dark-800w.webp index a78240e118..90a620e8b8 100644 Binary files a/docs/static/screenshots/BarChart/radial-horizontal-dark-800w.webp and b/docs/static/screenshots/BarChart/radial-horizontal-dark-800w.webp differ diff --git a/docs/static/screenshots/BarChart/radial-horizontal-duration-dark-400w.webp b/docs/static/screenshots/BarChart/radial-horizontal-duration-dark-400w.webp index c9a875894b..afc7c528e5 100644 Binary files a/docs/static/screenshots/BarChart/radial-horizontal-duration-dark-400w.webp and b/docs/static/screenshots/BarChart/radial-horizontal-duration-dark-400w.webp differ diff --git a/docs/static/screenshots/BarChart/radial-horizontal-duration-dark-800w.webp b/docs/static/screenshots/BarChart/radial-horizontal-duration-dark-800w.webp index b427637ee6..a469db9415 100644 Binary files a/docs/static/screenshots/BarChart/radial-horizontal-duration-dark-800w.webp and b/docs/static/screenshots/BarChart/radial-horizontal-duration-dark-800w.webp differ diff --git a/docs/static/screenshots/BarChart/radial-horizontal-duration-light-800w.webp b/docs/static/screenshots/BarChart/radial-horizontal-duration-light-800w.webp index 9469b42044..0b97185877 100644 Binary files a/docs/static/screenshots/BarChart/radial-horizontal-duration-light-800w.webp and b/docs/static/screenshots/BarChart/radial-horizontal-duration-light-800w.webp differ diff --git a/docs/static/screenshots/BarChart/radial-horizontal-grid-between-dark-240w.webp b/docs/static/screenshots/BarChart/radial-horizontal-grid-between-dark-240w.webp index b76dea9e53..c2c113f958 100644 Binary files a/docs/static/screenshots/BarChart/radial-horizontal-grid-between-dark-240w.webp and b/docs/static/screenshots/BarChart/radial-horizontal-grid-between-dark-240w.webp differ diff --git a/docs/static/screenshots/BarChart/radial-horizontal-grid-between-dark-400w.webp b/docs/static/screenshots/BarChart/radial-horizontal-grid-between-dark-400w.webp index 5ccb346baa..6e01776952 100644 Binary files a/docs/static/screenshots/BarChart/radial-horizontal-grid-between-dark-400w.webp and b/docs/static/screenshots/BarChart/radial-horizontal-grid-between-dark-400w.webp differ diff --git a/docs/static/screenshots/BarChart/radial-horizontal-grid-between-light-400w.webp b/docs/static/screenshots/BarChart/radial-horizontal-grid-between-light-400w.webp index 6274bb98eb..e635306f1e 100644 Binary files a/docs/static/screenshots/BarChart/radial-horizontal-grid-between-light-400w.webp and b/docs/static/screenshots/BarChart/radial-horizontal-grid-between-light-400w.webp differ diff --git a/docs/static/screenshots/BarChart/radial-horizontal-grid-between-light-800w.webp b/docs/static/screenshots/BarChart/radial-horizontal-grid-between-light-800w.webp index e1d1d55f80..1c9e5b160e 100644 Binary files a/docs/static/screenshots/BarChart/radial-horizontal-grid-between-light-800w.webp and b/docs/static/screenshots/BarChart/radial-horizontal-grid-between-light-800w.webp differ diff --git a/docs/static/screenshots/BarChart/radial-horizontal-light-240w.webp b/docs/static/screenshots/BarChart/radial-horizontal-light-240w.webp index e9120c878e..a865e4a16a 100644 Binary files a/docs/static/screenshots/BarChart/radial-horizontal-light-240w.webp and b/docs/static/screenshots/BarChart/radial-horizontal-light-240w.webp differ diff --git a/docs/static/screenshots/BarChart/radial-horizontal-light-400w.webp b/docs/static/screenshots/BarChart/radial-horizontal-light-400w.webp index 4c60c5b13b..761e444854 100644 Binary files a/docs/static/screenshots/BarChart/radial-horizontal-light-400w.webp and b/docs/static/screenshots/BarChart/radial-horizontal-light-400w.webp differ diff --git a/docs/static/screenshots/BarChart/radial-horizontal-light-800w.webp b/docs/static/screenshots/BarChart/radial-horizontal-light-800w.webp index dda8201dcd..8392e93853 100644 Binary files a/docs/static/screenshots/BarChart/radial-horizontal-light-800w.webp and b/docs/static/screenshots/BarChart/radial-horizontal-light-800w.webp differ diff --git a/docs/static/screenshots/BarChart/radial-vertical-arcpadding-dark-240w.webp b/docs/static/screenshots/BarChart/radial-vertical-arcpadding-dark-240w.webp index 4c0f400f3a..91527b199d 100644 Binary files a/docs/static/screenshots/BarChart/radial-vertical-arcpadding-dark-240w.webp and b/docs/static/screenshots/BarChart/radial-vertical-arcpadding-dark-240w.webp differ diff --git a/docs/static/screenshots/BarChart/radial-vertical-arcpadding-dark-400w.webp b/docs/static/screenshots/BarChart/radial-vertical-arcpadding-dark-400w.webp index 87867838d3..dc2ba2cafd 100644 Binary files a/docs/static/screenshots/BarChart/radial-vertical-arcpadding-dark-400w.webp and b/docs/static/screenshots/BarChart/radial-vertical-arcpadding-dark-400w.webp differ diff --git a/docs/static/screenshots/BarChart/radial-vertical-arcpadding-dark-800w.webp b/docs/static/screenshots/BarChart/radial-vertical-arcpadding-dark-800w.webp index a8e11cc692..d9dedfee77 100644 Binary files a/docs/static/screenshots/BarChart/radial-vertical-arcpadding-dark-800w.webp and b/docs/static/screenshots/BarChart/radial-vertical-arcpadding-dark-800w.webp differ diff --git a/docs/static/screenshots/BarChart/radial-vertical-arcpadding-light-240w.webp b/docs/static/screenshots/BarChart/radial-vertical-arcpadding-light-240w.webp index 7e7e3bf28b..bea60fe3ef 100644 Binary files a/docs/static/screenshots/BarChart/radial-vertical-arcpadding-light-240w.webp and b/docs/static/screenshots/BarChart/radial-vertical-arcpadding-light-240w.webp differ diff --git a/docs/static/screenshots/BarChart/radial-vertical-arcpadding-light-400w.webp b/docs/static/screenshots/BarChart/radial-vertical-arcpadding-light-400w.webp index 2f85b4b8d6..b1dce90055 100644 Binary files a/docs/static/screenshots/BarChart/radial-vertical-arcpadding-light-400w.webp and b/docs/static/screenshots/BarChart/radial-vertical-arcpadding-light-400w.webp differ diff --git a/docs/static/screenshots/BarChart/radial-vertical-arcpadding-light-800w.webp b/docs/static/screenshots/BarChart/radial-vertical-arcpadding-light-800w.webp index c2823ecd83..0713e9e006 100644 Binary files a/docs/static/screenshots/BarChart/radial-vertical-arcpadding-light-800w.webp and b/docs/static/screenshots/BarChart/radial-vertical-arcpadding-light-800w.webp differ diff --git a/docs/static/screenshots/BarChart/radial-vertical-dark-240w.webp b/docs/static/screenshots/BarChart/radial-vertical-dark-240w.webp index cd249762d3..a6b26c93bb 100644 Binary files a/docs/static/screenshots/BarChart/radial-vertical-dark-240w.webp and b/docs/static/screenshots/BarChart/radial-vertical-dark-240w.webp differ diff --git a/docs/static/screenshots/BarChart/radial-vertical-dark-400w.webp b/docs/static/screenshots/BarChart/radial-vertical-dark-400w.webp index de4ab641db..894a08ebb1 100644 Binary files a/docs/static/screenshots/BarChart/radial-vertical-dark-400w.webp and b/docs/static/screenshots/BarChart/radial-vertical-dark-400w.webp differ diff --git a/docs/static/screenshots/BarChart/radial-vertical-dark-800w.webp b/docs/static/screenshots/BarChart/radial-vertical-dark-800w.webp index 0378557145..affa657428 100644 Binary files a/docs/static/screenshots/BarChart/radial-vertical-dark-800w.webp and b/docs/static/screenshots/BarChart/radial-vertical-dark-800w.webp differ diff --git a/docs/static/screenshots/BarChart/radial-vertical-light-240w.webp b/docs/static/screenshots/BarChart/radial-vertical-light-240w.webp index 5096c9f16a..51f050fb9d 100644 Binary files a/docs/static/screenshots/BarChart/radial-vertical-light-240w.webp and b/docs/static/screenshots/BarChart/radial-vertical-light-240w.webp differ diff --git a/docs/static/screenshots/BarChart/radial-vertical-light-400w.webp b/docs/static/screenshots/BarChart/radial-vertical-light-400w.webp index 5b81109840..0bb2842142 100644 Binary files a/docs/static/screenshots/BarChart/radial-vertical-light-400w.webp and b/docs/static/screenshots/BarChart/radial-vertical-light-400w.webp differ diff --git a/docs/static/screenshots/BarChart/radial-vertical-light-800w.webp b/docs/static/screenshots/BarChart/radial-vertical-light-800w.webp index 687b8866e5..7ce3e035f6 100644 Binary files a/docs/static/screenshots/BarChart/radial-vertical-light-800w.webp and b/docs/static/screenshots/BarChart/radial-vertical-light-800w.webp differ diff --git a/docs/static/screenshots/BarChart/radial-vertical-yrange-dark-240w.webp b/docs/static/screenshots/BarChart/radial-vertical-yrange-dark-240w.webp index 7d7e57ccc8..bc2dbeaeb5 100644 Binary files a/docs/static/screenshots/BarChart/radial-vertical-yrange-dark-240w.webp and b/docs/static/screenshots/BarChart/radial-vertical-yrange-dark-240w.webp differ diff --git a/docs/static/screenshots/BarChart/radial-vertical-yrange-dark-400w.webp b/docs/static/screenshots/BarChart/radial-vertical-yrange-dark-400w.webp index 8f86935227..343f9e8c3e 100644 Binary files a/docs/static/screenshots/BarChart/radial-vertical-yrange-dark-400w.webp and b/docs/static/screenshots/BarChart/radial-vertical-yrange-dark-400w.webp differ diff --git a/docs/static/screenshots/BarChart/radial-vertical-yrange-dark-800w.webp b/docs/static/screenshots/BarChart/radial-vertical-yrange-dark-800w.webp index 08a423ce37..072b5c8692 100644 Binary files a/docs/static/screenshots/BarChart/radial-vertical-yrange-dark-800w.webp and b/docs/static/screenshots/BarChart/radial-vertical-yrange-dark-800w.webp differ diff --git a/docs/static/screenshots/BarChart/radial-vertical-yrange-light-240w.webp b/docs/static/screenshots/BarChart/radial-vertical-yrange-light-240w.webp index 23f765bc43..e8bbc98992 100644 Binary files a/docs/static/screenshots/BarChart/radial-vertical-yrange-light-240w.webp and b/docs/static/screenshots/BarChart/radial-vertical-yrange-light-240w.webp differ diff --git a/docs/static/screenshots/BarChart/radial-vertical-yrange-light-400w.webp b/docs/static/screenshots/BarChart/radial-vertical-yrange-light-400w.webp index e3a74036ae..52b816db78 100644 Binary files a/docs/static/screenshots/BarChart/radial-vertical-yrange-light-400w.webp and b/docs/static/screenshots/BarChart/radial-vertical-yrange-light-400w.webp differ diff --git a/docs/static/screenshots/BarChart/radial-vertical-yrange-light-800w.webp b/docs/static/screenshots/BarChart/radial-vertical-yrange-light-800w.webp index f8e1452b30..fd0c04c96d 100644 Binary files a/docs/static/screenshots/BarChart/radial-vertical-yrange-light-800w.webp and b/docs/static/screenshots/BarChart/radial-vertical-yrange-light-800w.webp differ diff --git a/docs/static/screenshots/BarChart/radial-weather-dark-240w.webp b/docs/static/screenshots/BarChart/radial-weather-dark-240w.webp index 3be9df0b96..c72d4f21d0 100644 Binary files a/docs/static/screenshots/BarChart/radial-weather-dark-240w.webp and b/docs/static/screenshots/BarChart/radial-weather-dark-240w.webp differ diff --git a/docs/static/screenshots/BarChart/radial-weather-dark-400w.webp b/docs/static/screenshots/BarChart/radial-weather-dark-400w.webp index ecc4be2aa3..50e6bd2478 100644 Binary files a/docs/static/screenshots/BarChart/radial-weather-dark-400w.webp and b/docs/static/screenshots/BarChart/radial-weather-dark-400w.webp differ diff --git a/docs/static/screenshots/BarChart/radial-weather-dark-800w.webp b/docs/static/screenshots/BarChart/radial-weather-dark-800w.webp index 4164502ef9..20b030b615 100644 Binary files a/docs/static/screenshots/BarChart/radial-weather-dark-800w.webp and b/docs/static/screenshots/BarChart/radial-weather-dark-800w.webp differ diff --git a/docs/static/screenshots/BarChart/radial-weather-light-240w.webp b/docs/static/screenshots/BarChart/radial-weather-light-240w.webp index 6147abd507..8544a72a47 100644 Binary files a/docs/static/screenshots/BarChart/radial-weather-light-240w.webp and b/docs/static/screenshots/BarChart/radial-weather-light-240w.webp differ diff --git a/docs/static/screenshots/BarChart/radial-weather-light-400w.webp b/docs/static/screenshots/BarChart/radial-weather-light-400w.webp index b7049e0d5e..3f75b51e88 100644 Binary files a/docs/static/screenshots/BarChart/radial-weather-light-400w.webp and b/docs/static/screenshots/BarChart/radial-weather-light-400w.webp differ diff --git a/docs/static/screenshots/BarChart/radial-weather-light-800w.webp b/docs/static/screenshots/BarChart/radial-weather-light-800w.webp index 340d42f688..95ab090781 100644 Binary files a/docs/static/screenshots/BarChart/radial-weather-light-800w.webp and b/docs/static/screenshots/BarChart/radial-weather-light-800w.webp differ diff --git a/docs/static/screenshots/BarChart/range-annotation-multiple-dark-240w.webp b/docs/static/screenshots/BarChart/range-annotation-multiple-dark-240w.webp index 8c979516b4..9a3ed5ea84 100644 Binary files a/docs/static/screenshots/BarChart/range-annotation-multiple-dark-240w.webp and b/docs/static/screenshots/BarChart/range-annotation-multiple-dark-240w.webp differ diff --git a/docs/static/screenshots/BarChart/range-annotation-multiple-dark-400w.webp b/docs/static/screenshots/BarChart/range-annotation-multiple-dark-400w.webp index 25a24973e9..04e71b5a92 100644 Binary files a/docs/static/screenshots/BarChart/range-annotation-multiple-dark-400w.webp and b/docs/static/screenshots/BarChart/range-annotation-multiple-dark-400w.webp differ diff --git a/docs/static/screenshots/BarChart/range-annotation-multiple-dark-800w.webp b/docs/static/screenshots/BarChart/range-annotation-multiple-dark-800w.webp index 705c16e016..9f3ec257a7 100644 Binary files a/docs/static/screenshots/BarChart/range-annotation-multiple-dark-800w.webp and b/docs/static/screenshots/BarChart/range-annotation-multiple-dark-800w.webp differ diff --git a/docs/static/screenshots/BarChart/range-annotation-multiple-light-240w.webp b/docs/static/screenshots/BarChart/range-annotation-multiple-light-240w.webp index b31a85f40b..ce84b3f4ce 100644 Binary files a/docs/static/screenshots/BarChart/range-annotation-multiple-light-240w.webp and b/docs/static/screenshots/BarChart/range-annotation-multiple-light-240w.webp differ diff --git a/docs/static/screenshots/BarChart/range-annotation-multiple-light-400w.webp b/docs/static/screenshots/BarChart/range-annotation-multiple-light-400w.webp index 5352c345ec..f8adffbebe 100644 Binary files a/docs/static/screenshots/BarChart/range-annotation-multiple-light-400w.webp and b/docs/static/screenshots/BarChart/range-annotation-multiple-light-400w.webp differ diff --git a/docs/static/screenshots/BarChart/range-annotation-multiple-light-800w.webp b/docs/static/screenshots/BarChart/range-annotation-multiple-light-800w.webp index 171052ff62..d324938f0b 100644 Binary files a/docs/static/screenshots/BarChart/range-annotation-multiple-light-800w.webp and b/docs/static/screenshots/BarChart/range-annotation-multiple-light-800w.webp differ diff --git a/docs/static/screenshots/BarChart/range-annotation-single-dark-240w.webp b/docs/static/screenshots/BarChart/range-annotation-single-dark-240w.webp index 35c96c003f..8da573cce7 100644 Binary files a/docs/static/screenshots/BarChart/range-annotation-single-dark-240w.webp and b/docs/static/screenshots/BarChart/range-annotation-single-dark-240w.webp differ diff --git a/docs/static/screenshots/BarChart/range-annotation-single-dark-400w.webp b/docs/static/screenshots/BarChart/range-annotation-single-dark-400w.webp index 92b31edd38..b12e4a8044 100644 Binary files a/docs/static/screenshots/BarChart/range-annotation-single-dark-400w.webp and b/docs/static/screenshots/BarChart/range-annotation-single-dark-400w.webp differ diff --git a/docs/static/screenshots/BarChart/range-annotation-single-dark-800w.webp b/docs/static/screenshots/BarChart/range-annotation-single-dark-800w.webp index be75613a63..54aadeda32 100644 Binary files a/docs/static/screenshots/BarChart/range-annotation-single-dark-800w.webp and b/docs/static/screenshots/BarChart/range-annotation-single-dark-800w.webp differ diff --git a/docs/static/screenshots/BarChart/range-annotation-single-light-240w.webp b/docs/static/screenshots/BarChart/range-annotation-single-light-240w.webp index 79fd034cc5..c4855c7ad6 100644 Binary files a/docs/static/screenshots/BarChart/range-annotation-single-light-240w.webp and b/docs/static/screenshots/BarChart/range-annotation-single-light-240w.webp differ diff --git a/docs/static/screenshots/BarChart/range-annotation-single-light-400w.webp b/docs/static/screenshots/BarChart/range-annotation-single-light-400w.webp index 27e58b6824..40bf328d06 100644 Binary files a/docs/static/screenshots/BarChart/range-annotation-single-light-400w.webp and b/docs/static/screenshots/BarChart/range-annotation-single-light-400w.webp differ diff --git a/docs/static/screenshots/BarChart/range-annotation-single-light-800w.webp b/docs/static/screenshots/BarChart/range-annotation-single-light-800w.webp index 46f828866d..cc5a309087 100644 Binary files a/docs/static/screenshots/BarChart/range-annotation-single-light-800w.webp and b/docs/static/screenshots/BarChart/range-annotation-single-light-800w.webp differ diff --git a/docs/static/screenshots/BarChart/range-annotation-value-dark-240w.webp b/docs/static/screenshots/BarChart/range-annotation-value-dark-240w.webp index ae9f0c7405..abeb98a96a 100644 Binary files a/docs/static/screenshots/BarChart/range-annotation-value-dark-240w.webp and b/docs/static/screenshots/BarChart/range-annotation-value-dark-240w.webp differ diff --git a/docs/static/screenshots/BarChart/range-annotation-value-dark-400w.webp b/docs/static/screenshots/BarChart/range-annotation-value-dark-400w.webp index 2ea1de68fd..abfeca07fd 100644 Binary files a/docs/static/screenshots/BarChart/range-annotation-value-dark-400w.webp and b/docs/static/screenshots/BarChart/range-annotation-value-dark-400w.webp differ diff --git a/docs/static/screenshots/BarChart/range-annotation-value-dark-800w.webp b/docs/static/screenshots/BarChart/range-annotation-value-dark-800w.webp index c4cdccbf0f..146beb5dd0 100644 Binary files a/docs/static/screenshots/BarChart/range-annotation-value-dark-800w.webp and b/docs/static/screenshots/BarChart/range-annotation-value-dark-800w.webp differ diff --git a/docs/static/screenshots/BarChart/range-annotation-value-light-240w.webp b/docs/static/screenshots/BarChart/range-annotation-value-light-240w.webp index 74547fddb0..36c4b3a212 100644 Binary files a/docs/static/screenshots/BarChart/range-annotation-value-light-240w.webp and b/docs/static/screenshots/BarChart/range-annotation-value-light-240w.webp differ diff --git a/docs/static/screenshots/BarChart/range-annotation-value-light-400w.webp b/docs/static/screenshots/BarChart/range-annotation-value-light-400w.webp index 65dcd4bbf9..30edab0b85 100644 Binary files a/docs/static/screenshots/BarChart/range-annotation-value-light-400w.webp and b/docs/static/screenshots/BarChart/range-annotation-value-light-400w.webp differ diff --git a/docs/static/screenshots/BarChart/range-annotation-value-light-800w.webp b/docs/static/screenshots/BarChart/range-annotation-value-light-800w.webp index c58ab10051..2dfd347911 100644 Binary files a/docs/static/screenshots/BarChart/range-annotation-value-light-800w.webp and b/docs/static/screenshots/BarChart/range-annotation-value-light-800w.webp differ diff --git a/docs/static/screenshots/BarChart/remove-rounding-dark-240w.webp b/docs/static/screenshots/BarChart/remove-rounding-dark-240w.webp index 747113d4a3..1d10278886 100644 Binary files a/docs/static/screenshots/BarChart/remove-rounding-dark-240w.webp and b/docs/static/screenshots/BarChart/remove-rounding-dark-240w.webp differ diff --git a/docs/static/screenshots/BarChart/remove-rounding-dark-400w.webp b/docs/static/screenshots/BarChart/remove-rounding-dark-400w.webp index 1927d14680..4e0920fd36 100644 Binary files a/docs/static/screenshots/BarChart/remove-rounding-dark-400w.webp and b/docs/static/screenshots/BarChart/remove-rounding-dark-400w.webp differ diff --git a/docs/static/screenshots/BarChart/remove-rounding-dark-800w.webp b/docs/static/screenshots/BarChart/remove-rounding-dark-800w.webp index d8504dab31..9faf3448b8 100644 Binary files a/docs/static/screenshots/BarChart/remove-rounding-dark-800w.webp and b/docs/static/screenshots/BarChart/remove-rounding-dark-800w.webp differ diff --git a/docs/static/screenshots/BarChart/remove-rounding-light-240w.webp b/docs/static/screenshots/BarChart/remove-rounding-light-240w.webp index 513ec130ca..464a57f805 100644 Binary files a/docs/static/screenshots/BarChart/remove-rounding-light-240w.webp and b/docs/static/screenshots/BarChart/remove-rounding-light-240w.webp differ diff --git a/docs/static/screenshots/BarChart/remove-rounding-light-400w.webp b/docs/static/screenshots/BarChart/remove-rounding-light-400w.webp index 605c8cc433..b8a9eedff7 100644 Binary files a/docs/static/screenshots/BarChart/remove-rounding-light-400w.webp and b/docs/static/screenshots/BarChart/remove-rounding-light-400w.webp differ diff --git a/docs/static/screenshots/BarChart/remove-rounding-light-800w.webp b/docs/static/screenshots/BarChart/remove-rounding-light-800w.webp index 7a52d43eeb..e8f3c858ef 100644 Binary files a/docs/static/screenshots/BarChart/remove-rounding-light-800w.webp and b/docs/static/screenshots/BarChart/remove-rounding-light-800w.webp differ diff --git a/docs/static/screenshots/BarChart/scale-override-dark-240w.webp b/docs/static/screenshots/BarChart/scale-override-dark-240w.webp index 56f1501207..af78ba06d1 100644 Binary files a/docs/static/screenshots/BarChart/scale-override-dark-240w.webp and b/docs/static/screenshots/BarChart/scale-override-dark-240w.webp differ diff --git a/docs/static/screenshots/BarChart/scale-override-dark-400w.webp b/docs/static/screenshots/BarChart/scale-override-dark-400w.webp index 3d2f99366d..98c1399c75 100644 Binary files a/docs/static/screenshots/BarChart/scale-override-dark-400w.webp and b/docs/static/screenshots/BarChart/scale-override-dark-400w.webp differ diff --git a/docs/static/screenshots/BarChart/scale-override-dark-800w.webp b/docs/static/screenshots/BarChart/scale-override-dark-800w.webp index 5b0368282d..411b30f5cd 100644 Binary files a/docs/static/screenshots/BarChart/scale-override-dark-800w.webp and b/docs/static/screenshots/BarChart/scale-override-dark-800w.webp differ diff --git a/docs/static/screenshots/BarChart/scale-override-light-240w.webp b/docs/static/screenshots/BarChart/scale-override-light-240w.webp index 17eac4ea00..9bd99fa15a 100644 Binary files a/docs/static/screenshots/BarChart/scale-override-light-240w.webp and b/docs/static/screenshots/BarChart/scale-override-light-240w.webp differ diff --git a/docs/static/screenshots/BarChart/scale-override-light-400w.webp b/docs/static/screenshots/BarChart/scale-override-light-400w.webp index cc2ca69425..a9623b7740 100644 Binary files a/docs/static/screenshots/BarChart/scale-override-light-400w.webp and b/docs/static/screenshots/BarChart/scale-override-light-400w.webp differ diff --git a/docs/static/screenshots/BarChart/scale-override-light-800w.webp b/docs/static/screenshots/BarChart/scale-override-light-800w.webp index de004cd6a6..6933398846 100644 Binary files a/docs/static/screenshots/BarChart/scale-override-light-800w.webp and b/docs/static/screenshots/BarChart/scale-override-light-800w.webp differ diff --git a/docs/static/screenshots/BarChart/series-dark-240w.webp b/docs/static/screenshots/BarChart/series-dark-240w.webp index 61ee323263..bb9c6dc67c 100644 Binary files a/docs/static/screenshots/BarChart/series-dark-240w.webp and b/docs/static/screenshots/BarChart/series-dark-240w.webp differ diff --git a/docs/static/screenshots/BarChart/series-dark-400w.webp b/docs/static/screenshots/BarChart/series-dark-400w.webp index 6f50e083da..b40551a9e7 100644 Binary files a/docs/static/screenshots/BarChart/series-dark-400w.webp and b/docs/static/screenshots/BarChart/series-dark-400w.webp differ diff --git a/docs/static/screenshots/BarChart/series-dark-800w.webp b/docs/static/screenshots/BarChart/series-dark-800w.webp index 2a24a27721..365420e52f 100644 Binary files a/docs/static/screenshots/BarChart/series-dark-800w.webp and b/docs/static/screenshots/BarChart/series-dark-800w.webp differ diff --git a/docs/static/screenshots/BarChart/series-data-dark-240w.webp b/docs/static/screenshots/BarChart/series-data-dark-240w.webp index b0cc75740e..d07e853338 100644 Binary files a/docs/static/screenshots/BarChart/series-data-dark-240w.webp and b/docs/static/screenshots/BarChart/series-data-dark-240w.webp differ diff --git a/docs/static/screenshots/BarChart/series-data-dark-400w.webp b/docs/static/screenshots/BarChart/series-data-dark-400w.webp index e354572562..a77d4d5d8f 100644 Binary files a/docs/static/screenshots/BarChart/series-data-dark-400w.webp and b/docs/static/screenshots/BarChart/series-data-dark-400w.webp differ diff --git a/docs/static/screenshots/BarChart/series-data-dark-800w.webp b/docs/static/screenshots/BarChart/series-data-dark-800w.webp index 7bb87ae993..423086a985 100644 Binary files a/docs/static/screenshots/BarChart/series-data-dark-800w.webp and b/docs/static/screenshots/BarChart/series-data-dark-800w.webp differ diff --git a/docs/static/screenshots/BarChart/series-data-light-240w.webp b/docs/static/screenshots/BarChart/series-data-light-240w.webp index 30cd5c9f4c..6ffac33ea2 100644 Binary files a/docs/static/screenshots/BarChart/series-data-light-240w.webp and b/docs/static/screenshots/BarChart/series-data-light-240w.webp differ diff --git a/docs/static/screenshots/BarChart/series-data-light-400w.webp b/docs/static/screenshots/BarChart/series-data-light-400w.webp index ef264a0dab..e778ab2dde 100644 Binary files a/docs/static/screenshots/BarChart/series-data-light-400w.webp and b/docs/static/screenshots/BarChart/series-data-light-400w.webp differ diff --git a/docs/static/screenshots/BarChart/series-data-light-800w.webp b/docs/static/screenshots/BarChart/series-data-light-800w.webp index 3aaa6efd08..4c902f65bb 100644 Binary files a/docs/static/screenshots/BarChart/series-data-light-800w.webp and b/docs/static/screenshots/BarChart/series-data-light-800w.webp differ diff --git a/docs/static/screenshots/BarChart/series-diverging-dark-240w.webp b/docs/static/screenshots/BarChart/series-diverging-dark-240w.webp index 8ca69b3198..d9ed05ad3b 100644 Binary files a/docs/static/screenshots/BarChart/series-diverging-dark-240w.webp and b/docs/static/screenshots/BarChart/series-diverging-dark-240w.webp differ diff --git a/docs/static/screenshots/BarChart/series-diverging-dark-400w.webp b/docs/static/screenshots/BarChart/series-diverging-dark-400w.webp index 5c7e640ea4..e3bb1ec4a0 100644 Binary files a/docs/static/screenshots/BarChart/series-diverging-dark-400w.webp and b/docs/static/screenshots/BarChart/series-diverging-dark-400w.webp differ diff --git a/docs/static/screenshots/BarChart/series-diverging-dark-800w.webp b/docs/static/screenshots/BarChart/series-diverging-dark-800w.webp index 75e7b6381f..6b192d0414 100644 Binary files a/docs/static/screenshots/BarChart/series-diverging-dark-800w.webp and b/docs/static/screenshots/BarChart/series-diverging-dark-800w.webp differ diff --git a/docs/static/screenshots/BarChart/series-diverging-light-240w.webp b/docs/static/screenshots/BarChart/series-diverging-light-240w.webp index 37794c4285..2d2a70726d 100644 Binary files a/docs/static/screenshots/BarChart/series-diverging-light-240w.webp and b/docs/static/screenshots/BarChart/series-diverging-light-240w.webp differ diff --git a/docs/static/screenshots/BarChart/series-diverging-light-400w.webp b/docs/static/screenshots/BarChart/series-diverging-light-400w.webp index c97f18b91c..6e59e7de66 100644 Binary files a/docs/static/screenshots/BarChart/series-diverging-light-400w.webp and b/docs/static/screenshots/BarChart/series-diverging-light-400w.webp differ diff --git a/docs/static/screenshots/BarChart/series-diverging-light-800w.webp b/docs/static/screenshots/BarChart/series-diverging-light-800w.webp index 13dda502cb..d90c46d9c9 100644 Binary files a/docs/static/screenshots/BarChart/series-diverging-light-800w.webp and b/docs/static/screenshots/BarChart/series-diverging-light-800w.webp differ diff --git a/docs/static/screenshots/BarChart/series-horizontal-dark-240w.webp b/docs/static/screenshots/BarChart/series-horizontal-dark-240w.webp index 761118eba4..b10fc3babc 100644 Binary files a/docs/static/screenshots/BarChart/series-horizontal-dark-240w.webp and b/docs/static/screenshots/BarChart/series-horizontal-dark-240w.webp differ diff --git a/docs/static/screenshots/BarChart/series-horizontal-dark-400w.webp b/docs/static/screenshots/BarChart/series-horizontal-dark-400w.webp index 1d9f234414..39fd25ed50 100644 Binary files a/docs/static/screenshots/BarChart/series-horizontal-dark-400w.webp and b/docs/static/screenshots/BarChart/series-horizontal-dark-400w.webp differ diff --git a/docs/static/screenshots/BarChart/series-horizontal-dark-800w.webp b/docs/static/screenshots/BarChart/series-horizontal-dark-800w.webp index 7bbebef8fd..a09a6244f6 100644 Binary files a/docs/static/screenshots/BarChart/series-horizontal-dark-800w.webp and b/docs/static/screenshots/BarChart/series-horizontal-dark-800w.webp differ diff --git a/docs/static/screenshots/BarChart/series-horizontal-diverging-as-percent-dark-240w.webp b/docs/static/screenshots/BarChart/series-horizontal-diverging-as-percent-dark-240w.webp index 7813f16cc1..42bb26865d 100644 Binary files a/docs/static/screenshots/BarChart/series-horizontal-diverging-as-percent-dark-240w.webp and b/docs/static/screenshots/BarChart/series-horizontal-diverging-as-percent-dark-240w.webp differ diff --git a/docs/static/screenshots/BarChart/series-horizontal-diverging-as-percent-dark-400w.webp b/docs/static/screenshots/BarChart/series-horizontal-diverging-as-percent-dark-400w.webp index dc1e4d3a40..3c985a9a6d 100644 Binary files a/docs/static/screenshots/BarChart/series-horizontal-diverging-as-percent-dark-400w.webp and b/docs/static/screenshots/BarChart/series-horizontal-diverging-as-percent-dark-400w.webp differ diff --git a/docs/static/screenshots/BarChart/series-horizontal-diverging-as-percent-dark-800w.webp b/docs/static/screenshots/BarChart/series-horizontal-diverging-as-percent-dark-800w.webp index 0c47760b26..040f1bd75c 100644 Binary files a/docs/static/screenshots/BarChart/series-horizontal-diverging-as-percent-dark-800w.webp and b/docs/static/screenshots/BarChart/series-horizontal-diverging-as-percent-dark-800w.webp differ diff --git a/docs/static/screenshots/BarChart/series-horizontal-diverging-as-percent-light-240w.webp b/docs/static/screenshots/BarChart/series-horizontal-diverging-as-percent-light-240w.webp index 79de698f31..903fedae6b 100644 Binary files a/docs/static/screenshots/BarChart/series-horizontal-diverging-as-percent-light-240w.webp and b/docs/static/screenshots/BarChart/series-horizontal-diverging-as-percent-light-240w.webp differ diff --git a/docs/static/screenshots/BarChart/series-horizontal-diverging-as-percent-light-400w.webp b/docs/static/screenshots/BarChart/series-horizontal-diverging-as-percent-light-400w.webp index e4869d6994..01295da789 100644 Binary files a/docs/static/screenshots/BarChart/series-horizontal-diverging-as-percent-light-400w.webp and b/docs/static/screenshots/BarChart/series-horizontal-diverging-as-percent-light-400w.webp differ diff --git a/docs/static/screenshots/BarChart/series-horizontal-diverging-as-percent-light-800w.webp b/docs/static/screenshots/BarChart/series-horizontal-diverging-as-percent-light-800w.webp index 6bb584a4e3..4a12085dcc 100644 Binary files a/docs/static/screenshots/BarChart/series-horizontal-diverging-as-percent-light-800w.webp and b/docs/static/screenshots/BarChart/series-horizontal-diverging-as-percent-light-800w.webp differ diff --git a/docs/static/screenshots/BarChart/series-horizontal-diverging-dark-240w.webp b/docs/static/screenshots/BarChart/series-horizontal-diverging-dark-240w.webp index 11731deea2..2b7e56365e 100644 Binary files a/docs/static/screenshots/BarChart/series-horizontal-diverging-dark-240w.webp and b/docs/static/screenshots/BarChart/series-horizontal-diverging-dark-240w.webp differ diff --git a/docs/static/screenshots/BarChart/series-horizontal-diverging-dark-400w.webp b/docs/static/screenshots/BarChart/series-horizontal-diverging-dark-400w.webp index 064247239e..952406c9f0 100644 Binary files a/docs/static/screenshots/BarChart/series-horizontal-diverging-dark-400w.webp and b/docs/static/screenshots/BarChart/series-horizontal-diverging-dark-400w.webp differ diff --git a/docs/static/screenshots/BarChart/series-horizontal-diverging-dark-800w.webp b/docs/static/screenshots/BarChart/series-horizontal-diverging-dark-800w.webp index 04bc951d8f..7c2bb7e7bc 100644 Binary files a/docs/static/screenshots/BarChart/series-horizontal-diverging-dark-800w.webp and b/docs/static/screenshots/BarChart/series-horizontal-diverging-dark-800w.webp differ diff --git a/docs/static/screenshots/BarChart/series-horizontal-diverging-label-gap-dark-240w.webp b/docs/static/screenshots/BarChart/series-horizontal-diverging-label-gap-dark-240w.webp index 387743579b..7056cd2fba 100644 Binary files a/docs/static/screenshots/BarChart/series-horizontal-diverging-label-gap-dark-240w.webp and b/docs/static/screenshots/BarChart/series-horizontal-diverging-label-gap-dark-240w.webp differ diff --git a/docs/static/screenshots/BarChart/series-horizontal-diverging-label-gap-dark-400w.webp b/docs/static/screenshots/BarChart/series-horizontal-diverging-label-gap-dark-400w.webp index a8ebc0ad91..52b6c960f1 100644 Binary files a/docs/static/screenshots/BarChart/series-horizontal-diverging-label-gap-dark-400w.webp and b/docs/static/screenshots/BarChart/series-horizontal-diverging-label-gap-dark-400w.webp differ diff --git a/docs/static/screenshots/BarChart/series-horizontal-diverging-label-gap-dark-800w.webp b/docs/static/screenshots/BarChart/series-horizontal-diverging-label-gap-dark-800w.webp index ef929da1cf..585b648729 100644 Binary files a/docs/static/screenshots/BarChart/series-horizontal-diverging-label-gap-dark-800w.webp and b/docs/static/screenshots/BarChart/series-horizontal-diverging-label-gap-dark-800w.webp differ diff --git a/docs/static/screenshots/BarChart/series-horizontal-diverging-label-gap-light-240w.webp b/docs/static/screenshots/BarChart/series-horizontal-diverging-label-gap-light-240w.webp index 8368d01859..1bb2760886 100644 Binary files a/docs/static/screenshots/BarChart/series-horizontal-diverging-label-gap-light-240w.webp and b/docs/static/screenshots/BarChart/series-horizontal-diverging-label-gap-light-240w.webp differ diff --git a/docs/static/screenshots/BarChart/series-horizontal-diverging-label-gap-light-400w.webp b/docs/static/screenshots/BarChart/series-horizontal-diverging-label-gap-light-400w.webp index efe5e4287e..3dcdcd26a5 100644 Binary files a/docs/static/screenshots/BarChart/series-horizontal-diverging-label-gap-light-400w.webp and b/docs/static/screenshots/BarChart/series-horizontal-diverging-label-gap-light-400w.webp differ diff --git a/docs/static/screenshots/BarChart/series-horizontal-diverging-label-gap-light-800w.webp b/docs/static/screenshots/BarChart/series-horizontal-diverging-label-gap-light-800w.webp index 90d7385ece..b00bed398d 100644 Binary files a/docs/static/screenshots/BarChart/series-horizontal-diverging-label-gap-light-800w.webp and b/docs/static/screenshots/BarChart/series-horizontal-diverging-label-gap-light-800w.webp differ diff --git a/docs/static/screenshots/BarChart/series-horizontal-diverging-light-240w.webp b/docs/static/screenshots/BarChart/series-horizontal-diverging-light-240w.webp index 6d9d0b2aa7..8f25f745e2 100644 Binary files a/docs/static/screenshots/BarChart/series-horizontal-diverging-light-240w.webp and b/docs/static/screenshots/BarChart/series-horizontal-diverging-light-240w.webp differ diff --git a/docs/static/screenshots/BarChart/series-horizontal-diverging-light-400w.webp b/docs/static/screenshots/BarChart/series-horizontal-diverging-light-400w.webp index c63831b6dd..2b90880d49 100644 Binary files a/docs/static/screenshots/BarChart/series-horizontal-diverging-light-400w.webp and b/docs/static/screenshots/BarChart/series-horizontal-diverging-light-400w.webp differ diff --git a/docs/static/screenshots/BarChart/series-horizontal-diverging-light-800w.webp b/docs/static/screenshots/BarChart/series-horizontal-diverging-light-800w.webp index 4b8d0ba901..2b8e7da51f 100644 Binary files a/docs/static/screenshots/BarChart/series-horizontal-diverging-light-800w.webp and b/docs/static/screenshots/BarChart/series-horizontal-diverging-light-800w.webp differ diff --git a/docs/static/screenshots/BarChart/series-horizontal-diverging-split-scale-dark-240w.webp b/docs/static/screenshots/BarChart/series-horizontal-diverging-split-scale-dark-240w.webp index d8c9da1c45..4f28f1e816 100644 Binary files a/docs/static/screenshots/BarChart/series-horizontal-diverging-split-scale-dark-240w.webp and b/docs/static/screenshots/BarChart/series-horizontal-diverging-split-scale-dark-240w.webp differ diff --git a/docs/static/screenshots/BarChart/series-horizontal-diverging-split-scale-dark-400w.webp b/docs/static/screenshots/BarChart/series-horizontal-diverging-split-scale-dark-400w.webp index ffdeda7ac6..f080cc9cb8 100644 Binary files a/docs/static/screenshots/BarChart/series-horizontal-diverging-split-scale-dark-400w.webp and b/docs/static/screenshots/BarChart/series-horizontal-diverging-split-scale-dark-400w.webp differ diff --git a/docs/static/screenshots/BarChart/series-horizontal-diverging-split-scale-dark-800w.webp b/docs/static/screenshots/BarChart/series-horizontal-diverging-split-scale-dark-800w.webp index 75c85f6119..5b0fca6838 100644 Binary files a/docs/static/screenshots/BarChart/series-horizontal-diverging-split-scale-dark-800w.webp and b/docs/static/screenshots/BarChart/series-horizontal-diverging-split-scale-dark-800w.webp differ diff --git a/docs/static/screenshots/BarChart/series-horizontal-diverging-split-scale-light-240w.webp b/docs/static/screenshots/BarChart/series-horizontal-diverging-split-scale-light-240w.webp index 1e211a806c..c78d828bbf 100644 Binary files a/docs/static/screenshots/BarChart/series-horizontal-diverging-split-scale-light-240w.webp and b/docs/static/screenshots/BarChart/series-horizontal-diverging-split-scale-light-240w.webp differ diff --git a/docs/static/screenshots/BarChart/series-horizontal-diverging-split-scale-light-400w.webp b/docs/static/screenshots/BarChart/series-horizontal-diverging-split-scale-light-400w.webp index a3655f7128..a749621e99 100644 Binary files a/docs/static/screenshots/BarChart/series-horizontal-diverging-split-scale-light-400w.webp and b/docs/static/screenshots/BarChart/series-horizontal-diverging-split-scale-light-400w.webp differ diff --git a/docs/static/screenshots/BarChart/series-horizontal-diverging-split-scale-light-800w.webp b/docs/static/screenshots/BarChart/series-horizontal-diverging-split-scale-light-800w.webp index a81f8fd15d..d1f1580ed0 100644 Binary files a/docs/static/screenshots/BarChart/series-horizontal-diverging-split-scale-light-800w.webp and b/docs/static/screenshots/BarChart/series-horizontal-diverging-split-scale-light-800w.webp differ diff --git a/docs/static/screenshots/BarChart/series-horizontal-labels-dark-240w.webp b/docs/static/screenshots/BarChart/series-horizontal-labels-dark-240w.webp index 9e3d02312d..d74846820b 100644 Binary files a/docs/static/screenshots/BarChart/series-horizontal-labels-dark-240w.webp and b/docs/static/screenshots/BarChart/series-horizontal-labels-dark-240w.webp differ diff --git a/docs/static/screenshots/BarChart/series-horizontal-labels-dark-400w.webp b/docs/static/screenshots/BarChart/series-horizontal-labels-dark-400w.webp index 7ce7d6b746..83797863ee 100644 Binary files a/docs/static/screenshots/BarChart/series-horizontal-labels-dark-400w.webp and b/docs/static/screenshots/BarChart/series-horizontal-labels-dark-400w.webp differ diff --git a/docs/static/screenshots/BarChart/series-horizontal-labels-dark-800w.webp b/docs/static/screenshots/BarChart/series-horizontal-labels-dark-800w.webp index bba8ee5ac1..c52b6045e7 100644 Binary files a/docs/static/screenshots/BarChart/series-horizontal-labels-dark-800w.webp and b/docs/static/screenshots/BarChart/series-horizontal-labels-dark-800w.webp differ diff --git a/docs/static/screenshots/BarChart/series-horizontal-labels-light-240w.webp b/docs/static/screenshots/BarChart/series-horizontal-labels-light-240w.webp index fbf15b162e..91698816c9 100644 Binary files a/docs/static/screenshots/BarChart/series-horizontal-labels-light-240w.webp and b/docs/static/screenshots/BarChart/series-horizontal-labels-light-240w.webp differ diff --git a/docs/static/screenshots/BarChart/series-horizontal-labels-light-400w.webp b/docs/static/screenshots/BarChart/series-horizontal-labels-light-400w.webp index a40a7bc83b..baa0526d12 100644 Binary files a/docs/static/screenshots/BarChart/series-horizontal-labels-light-400w.webp and b/docs/static/screenshots/BarChart/series-horizontal-labels-light-400w.webp differ diff --git a/docs/static/screenshots/BarChart/series-horizontal-labels-light-800w.webp b/docs/static/screenshots/BarChart/series-horizontal-labels-light-800w.webp index 0ae090ea80..288afb3b32 100644 Binary files a/docs/static/screenshots/BarChart/series-horizontal-labels-light-800w.webp and b/docs/static/screenshots/BarChart/series-horizontal-labels-light-800w.webp differ diff --git a/docs/static/screenshots/BarChart/series-horizontal-light-240w.webp b/docs/static/screenshots/BarChart/series-horizontal-light-240w.webp index fdb0c57dc7..20b9b00af3 100644 Binary files a/docs/static/screenshots/BarChart/series-horizontal-light-240w.webp and b/docs/static/screenshots/BarChart/series-horizontal-light-240w.webp differ diff --git a/docs/static/screenshots/BarChart/series-horizontal-light-400w.webp b/docs/static/screenshots/BarChart/series-horizontal-light-400w.webp index 0717fcb76f..0e7f8ea683 100644 Binary files a/docs/static/screenshots/BarChart/series-horizontal-light-400w.webp and b/docs/static/screenshots/BarChart/series-horizontal-light-400w.webp differ diff --git a/docs/static/screenshots/BarChart/series-horizontal-light-800w.webp b/docs/static/screenshots/BarChart/series-horizontal-light-800w.webp index d36db4c253..c4d1a23168 100644 Binary files a/docs/static/screenshots/BarChart/series-horizontal-light-800w.webp and b/docs/static/screenshots/BarChart/series-horizontal-light-800w.webp differ diff --git a/docs/static/screenshots/BarChart/series-light-240w.webp b/docs/static/screenshots/BarChart/series-light-240w.webp index d92b321c3a..4e5bb4bad9 100644 Binary files a/docs/static/screenshots/BarChart/series-light-240w.webp and b/docs/static/screenshots/BarChart/series-light-240w.webp differ diff --git a/docs/static/screenshots/BarChart/series-light-400w.webp b/docs/static/screenshots/BarChart/series-light-400w.webp index 7a0a998854..0c211a2e1f 100644 Binary files a/docs/static/screenshots/BarChart/series-light-400w.webp and b/docs/static/screenshots/BarChart/series-light-400w.webp differ diff --git a/docs/static/screenshots/BarChart/series-light-800w.webp b/docs/static/screenshots/BarChart/series-light-800w.webp index fe0d82a226..ebd1e4bbd1 100644 Binary files a/docs/static/screenshots/BarChart/series-light-800w.webp and b/docs/static/screenshots/BarChart/series-light-800w.webp differ diff --git a/docs/static/screenshots/BarChart/series-stack-separate-data-dark-240w.webp b/docs/static/screenshots/BarChart/series-stack-separate-data-dark-240w.webp index 972da1f820..e42b5ab954 100644 Binary files a/docs/static/screenshots/BarChart/series-stack-separate-data-dark-240w.webp and b/docs/static/screenshots/BarChart/series-stack-separate-data-dark-240w.webp differ diff --git a/docs/static/screenshots/BarChart/series-stack-separate-data-dark-800w.webp b/docs/static/screenshots/BarChart/series-stack-separate-data-dark-800w.webp index 4e2cc057d7..d4b523d9e6 100644 Binary files a/docs/static/screenshots/BarChart/series-stack-separate-data-dark-800w.webp and b/docs/static/screenshots/BarChart/series-stack-separate-data-dark-800w.webp differ diff --git a/docs/static/screenshots/BarChart/series-stack-separate-data-light-400w.webp b/docs/static/screenshots/BarChart/series-stack-separate-data-light-400w.webp index d392144247..b442fae5b5 100644 Binary files a/docs/static/screenshots/BarChart/series-stack-separate-data-light-400w.webp and b/docs/static/screenshots/BarChart/series-stack-separate-data-light-400w.webp differ diff --git a/docs/static/screenshots/BarChart/series-stack-separate-data-light-800w.webp b/docs/static/screenshots/BarChart/series-stack-separate-data-light-800w.webp index 1032fa9ca1..8d02b2d8b5 100644 Binary files a/docs/static/screenshots/BarChart/series-stack-separate-data-light-800w.webp and b/docs/static/screenshots/BarChart/series-stack-separate-data-light-800w.webp differ diff --git a/docs/static/screenshots/BarChart/single-axis-x-dark-240w.webp b/docs/static/screenshots/BarChart/single-axis-x-dark-240w.webp index 1f9ed54875..2154ff3676 100644 Binary files a/docs/static/screenshots/BarChart/single-axis-x-dark-240w.webp and b/docs/static/screenshots/BarChart/single-axis-x-dark-240w.webp differ diff --git a/docs/static/screenshots/BarChart/single-axis-x-dark-400w.webp b/docs/static/screenshots/BarChart/single-axis-x-dark-400w.webp index ccb32b8ac7..6479f1f1a4 100644 Binary files a/docs/static/screenshots/BarChart/single-axis-x-dark-400w.webp and b/docs/static/screenshots/BarChart/single-axis-x-dark-400w.webp differ diff --git a/docs/static/screenshots/BarChart/single-axis-x-dark-800w.webp b/docs/static/screenshots/BarChart/single-axis-x-dark-800w.webp index 53917fb9d2..1f107bd4d4 100644 Binary files a/docs/static/screenshots/BarChart/single-axis-x-dark-800w.webp and b/docs/static/screenshots/BarChart/single-axis-x-dark-800w.webp differ diff --git a/docs/static/screenshots/BarChart/single-axis-x-light-240w.webp b/docs/static/screenshots/BarChart/single-axis-x-light-240w.webp index da0ca5a700..fe4135174c 100644 Binary files a/docs/static/screenshots/BarChart/single-axis-x-light-240w.webp and b/docs/static/screenshots/BarChart/single-axis-x-light-240w.webp differ diff --git a/docs/static/screenshots/BarChart/single-axis-x-light-400w.webp b/docs/static/screenshots/BarChart/single-axis-x-light-400w.webp index f169d94137..56556132e2 100644 Binary files a/docs/static/screenshots/BarChart/single-axis-x-light-400w.webp and b/docs/static/screenshots/BarChart/single-axis-x-light-400w.webp differ diff --git a/docs/static/screenshots/BarChart/single-axis-x-light-800w.webp b/docs/static/screenshots/BarChart/single-axis-x-light-800w.webp index 485973d138..f73779a35e 100644 Binary files a/docs/static/screenshots/BarChart/single-axis-x-light-800w.webp and b/docs/static/screenshots/BarChart/single-axis-x-light-800w.webp differ diff --git a/docs/static/screenshots/BarChart/single-axis-y-dark-240w.webp b/docs/static/screenshots/BarChart/single-axis-y-dark-240w.webp index 668994fe0a..86d488307c 100644 Binary files a/docs/static/screenshots/BarChart/single-axis-y-dark-240w.webp and b/docs/static/screenshots/BarChart/single-axis-y-dark-240w.webp differ diff --git a/docs/static/screenshots/BarChart/single-axis-y-dark-400w.webp b/docs/static/screenshots/BarChart/single-axis-y-dark-400w.webp index 90694f4bfa..1627a772d2 100644 Binary files a/docs/static/screenshots/BarChart/single-axis-y-dark-400w.webp and b/docs/static/screenshots/BarChart/single-axis-y-dark-400w.webp differ diff --git a/docs/static/screenshots/BarChart/single-axis-y-dark-800w.webp b/docs/static/screenshots/BarChart/single-axis-y-dark-800w.webp index 26ed258a1e..2e76fb0224 100644 Binary files a/docs/static/screenshots/BarChart/single-axis-y-dark-800w.webp and b/docs/static/screenshots/BarChart/single-axis-y-dark-800w.webp differ diff --git a/docs/static/screenshots/BarChart/single-axis-y-light-240w.webp b/docs/static/screenshots/BarChart/single-axis-y-light-240w.webp index de02f1ddac..5b621d29d9 100644 Binary files a/docs/static/screenshots/BarChart/single-axis-y-light-240w.webp and b/docs/static/screenshots/BarChart/single-axis-y-light-240w.webp differ diff --git a/docs/static/screenshots/BarChart/single-axis-y-light-400w.webp b/docs/static/screenshots/BarChart/single-axis-y-light-400w.webp index 9b35d14850..b594906310 100644 Binary files a/docs/static/screenshots/BarChart/single-axis-y-light-400w.webp and b/docs/static/screenshots/BarChart/single-axis-y-light-400w.webp differ diff --git a/docs/static/screenshots/BarChart/single-axis-y-light-800w.webp b/docs/static/screenshots/BarChart/single-axis-y-light-800w.webp index b061dbc94b..7cee3c53b1 100644 Binary files a/docs/static/screenshots/BarChart/single-axis-y-light-800w.webp and b/docs/static/screenshots/BarChart/single-axis-y-light-800w.webp differ diff --git a/docs/static/screenshots/BarChart/single-dimension-dark-240w.webp b/docs/static/screenshots/BarChart/single-dimension-dark-240w.webp index b0da31dd4a..f82bb1f2a0 100644 Binary files a/docs/static/screenshots/BarChart/single-dimension-dark-240w.webp and b/docs/static/screenshots/BarChart/single-dimension-dark-240w.webp differ diff --git a/docs/static/screenshots/BarChart/single-dimension-dark-400w.webp b/docs/static/screenshots/BarChart/single-dimension-dark-400w.webp index c90110788d..37bde63659 100644 Binary files a/docs/static/screenshots/BarChart/single-dimension-dark-400w.webp and b/docs/static/screenshots/BarChart/single-dimension-dark-400w.webp differ diff --git a/docs/static/screenshots/BarChart/single-dimension-dark-800w.webp b/docs/static/screenshots/BarChart/single-dimension-dark-800w.webp index 189c51d199..ae74d300e1 100644 Binary files a/docs/static/screenshots/BarChart/single-dimension-dark-800w.webp and b/docs/static/screenshots/BarChart/single-dimension-dark-800w.webp differ diff --git a/docs/static/screenshots/BarChart/single-dimension-light-240w.webp b/docs/static/screenshots/BarChart/single-dimension-light-240w.webp index 3ee1d7a874..64197d7aa6 100644 Binary files a/docs/static/screenshots/BarChart/single-dimension-light-240w.webp and b/docs/static/screenshots/BarChart/single-dimension-light-240w.webp differ diff --git a/docs/static/screenshots/BarChart/single-dimension-light-400w.webp b/docs/static/screenshots/BarChart/single-dimension-light-400w.webp index ed59378900..3e8e0691d3 100644 Binary files a/docs/static/screenshots/BarChart/single-dimension-light-400w.webp and b/docs/static/screenshots/BarChart/single-dimension-light-400w.webp differ diff --git a/docs/static/screenshots/BarChart/single-dimension-light-800w.webp b/docs/static/screenshots/BarChart/single-dimension-light-800w.webp index 59dfa380c6..5b9be007a7 100644 Binary files a/docs/static/screenshots/BarChart/single-dimension-light-800w.webp and b/docs/static/screenshots/BarChart/single-dimension-light-800w.webp differ diff --git a/docs/static/screenshots/BarChart/sparkbar-dark-240w.webp b/docs/static/screenshots/BarChart/sparkbar-dark-240w.webp index 1819209e3a..94e14f1721 100644 Binary files a/docs/static/screenshots/BarChart/sparkbar-dark-240w.webp and b/docs/static/screenshots/BarChart/sparkbar-dark-240w.webp differ diff --git a/docs/static/screenshots/BarChart/sparkbar-dark-400w.webp b/docs/static/screenshots/BarChart/sparkbar-dark-400w.webp index 1819209e3a..94e14f1721 100644 Binary files a/docs/static/screenshots/BarChart/sparkbar-dark-400w.webp and b/docs/static/screenshots/BarChart/sparkbar-dark-400w.webp differ diff --git a/docs/static/screenshots/BarChart/sparkbar-dark-800w.webp b/docs/static/screenshots/BarChart/sparkbar-dark-800w.webp index 1819209e3a..94e14f1721 100644 Binary files a/docs/static/screenshots/BarChart/sparkbar-dark-800w.webp and b/docs/static/screenshots/BarChart/sparkbar-dark-800w.webp differ diff --git a/docs/static/screenshots/BarChart/sparkbar-fixed-position-tooltip-dark-240w.webp b/docs/static/screenshots/BarChart/sparkbar-fixed-position-tooltip-dark-240w.webp index 58a25b4160..bc5c54e9d3 100644 Binary files a/docs/static/screenshots/BarChart/sparkbar-fixed-position-tooltip-dark-240w.webp and b/docs/static/screenshots/BarChart/sparkbar-fixed-position-tooltip-dark-240w.webp differ diff --git a/docs/static/screenshots/BarChart/sparkbar-fixed-position-tooltip-dark-400w.webp b/docs/static/screenshots/BarChart/sparkbar-fixed-position-tooltip-dark-400w.webp index 58a25b4160..bc5c54e9d3 100644 Binary files a/docs/static/screenshots/BarChart/sparkbar-fixed-position-tooltip-dark-400w.webp and b/docs/static/screenshots/BarChart/sparkbar-fixed-position-tooltip-dark-400w.webp differ diff --git a/docs/static/screenshots/BarChart/sparkbar-fixed-position-tooltip-dark-800w.webp b/docs/static/screenshots/BarChart/sparkbar-fixed-position-tooltip-dark-800w.webp index 58a25b4160..bc5c54e9d3 100644 Binary files a/docs/static/screenshots/BarChart/sparkbar-fixed-position-tooltip-dark-800w.webp and b/docs/static/screenshots/BarChart/sparkbar-fixed-position-tooltip-dark-800w.webp differ diff --git a/docs/static/screenshots/BarChart/sparkbar-fixed-position-tooltip-light-240w.webp b/docs/static/screenshots/BarChart/sparkbar-fixed-position-tooltip-light-240w.webp index 0655bb4c10..e6036f6635 100644 Binary files a/docs/static/screenshots/BarChart/sparkbar-fixed-position-tooltip-light-240w.webp and b/docs/static/screenshots/BarChart/sparkbar-fixed-position-tooltip-light-240w.webp differ diff --git a/docs/static/screenshots/BarChart/sparkbar-fixed-position-tooltip-light-400w.webp b/docs/static/screenshots/BarChart/sparkbar-fixed-position-tooltip-light-400w.webp index 0655bb4c10..e6036f6635 100644 Binary files a/docs/static/screenshots/BarChart/sparkbar-fixed-position-tooltip-light-400w.webp and b/docs/static/screenshots/BarChart/sparkbar-fixed-position-tooltip-light-400w.webp differ diff --git a/docs/static/screenshots/BarChart/sparkbar-fixed-position-tooltip-light-800w.webp b/docs/static/screenshots/BarChart/sparkbar-fixed-position-tooltip-light-800w.webp index 0655bb4c10..e6036f6635 100644 Binary files a/docs/static/screenshots/BarChart/sparkbar-fixed-position-tooltip-light-800w.webp and b/docs/static/screenshots/BarChart/sparkbar-fixed-position-tooltip-light-800w.webp differ diff --git a/docs/static/screenshots/BarChart/sparkbar-light-240w.webp b/docs/static/screenshots/BarChart/sparkbar-light-240w.webp index 8953ac425e..8994815726 100644 Binary files a/docs/static/screenshots/BarChart/sparkbar-light-240w.webp and b/docs/static/screenshots/BarChart/sparkbar-light-240w.webp differ diff --git a/docs/static/screenshots/BarChart/sparkbar-light-400w.webp b/docs/static/screenshots/BarChart/sparkbar-light-400w.webp index 8953ac425e..8994815726 100644 Binary files a/docs/static/screenshots/BarChart/sparkbar-light-400w.webp and b/docs/static/screenshots/BarChart/sparkbar-light-400w.webp differ diff --git a/docs/static/screenshots/BarChart/sparkbar-light-800w.webp b/docs/static/screenshots/BarChart/sparkbar-light-800w.webp index 8953ac425e..8994815726 100644 Binary files a/docs/static/screenshots/BarChart/sparkbar-light-800w.webp and b/docs/static/screenshots/BarChart/sparkbar-light-800w.webp differ diff --git a/docs/static/screenshots/BarChart/sparkbar-negative-data-dark-240w.webp b/docs/static/screenshots/BarChart/sparkbar-negative-data-dark-240w.webp index d878ec0202..d954946e66 100644 Binary files a/docs/static/screenshots/BarChart/sparkbar-negative-data-dark-240w.webp and b/docs/static/screenshots/BarChart/sparkbar-negative-data-dark-240w.webp differ diff --git a/docs/static/screenshots/BarChart/sparkbar-negative-data-dark-400w.webp b/docs/static/screenshots/BarChart/sparkbar-negative-data-dark-400w.webp index d878ec0202..d954946e66 100644 Binary files a/docs/static/screenshots/BarChart/sparkbar-negative-data-dark-400w.webp and b/docs/static/screenshots/BarChart/sparkbar-negative-data-dark-400w.webp differ diff --git a/docs/static/screenshots/BarChart/sparkbar-negative-data-dark-800w.webp b/docs/static/screenshots/BarChart/sparkbar-negative-data-dark-800w.webp index d878ec0202..d954946e66 100644 Binary files a/docs/static/screenshots/BarChart/sparkbar-negative-data-dark-800w.webp and b/docs/static/screenshots/BarChart/sparkbar-negative-data-dark-800w.webp differ diff --git a/docs/static/screenshots/BarChart/sparkbar-negative-data-light-240w.webp b/docs/static/screenshots/BarChart/sparkbar-negative-data-light-240w.webp index 03495be659..9de80f910f 100644 Binary files a/docs/static/screenshots/BarChart/sparkbar-negative-data-light-240w.webp and b/docs/static/screenshots/BarChart/sparkbar-negative-data-light-240w.webp differ diff --git a/docs/static/screenshots/BarChart/sparkbar-negative-data-light-400w.webp b/docs/static/screenshots/BarChart/sparkbar-negative-data-light-400w.webp index 03495be659..9de80f910f 100644 Binary files a/docs/static/screenshots/BarChart/sparkbar-negative-data-light-400w.webp and b/docs/static/screenshots/BarChart/sparkbar-negative-data-light-400w.webp differ diff --git a/docs/static/screenshots/BarChart/sparkbar-negative-data-light-800w.webp b/docs/static/screenshots/BarChart/sparkbar-negative-data-light-800w.webp index 03495be659..9de80f910f 100644 Binary files a/docs/static/screenshots/BarChart/sparkbar-negative-data-light-800w.webp and b/docs/static/screenshots/BarChart/sparkbar-negative-data-light-800w.webp differ diff --git a/docs/static/screenshots/BarChart/sparkbar-within-a-paragraph-dark-240w.webp b/docs/static/screenshots/BarChart/sparkbar-within-a-paragraph-dark-240w.webp index 69764fd35d..4ec3d6e4f3 100644 Binary files a/docs/static/screenshots/BarChart/sparkbar-within-a-paragraph-dark-240w.webp and b/docs/static/screenshots/BarChart/sparkbar-within-a-paragraph-dark-240w.webp differ diff --git a/docs/static/screenshots/BarChart/sparkbar-within-a-paragraph-dark-400w.webp b/docs/static/screenshots/BarChart/sparkbar-within-a-paragraph-dark-400w.webp index 69764fd35d..4ec3d6e4f3 100644 Binary files a/docs/static/screenshots/BarChart/sparkbar-within-a-paragraph-dark-400w.webp and b/docs/static/screenshots/BarChart/sparkbar-within-a-paragraph-dark-400w.webp differ diff --git a/docs/static/screenshots/BarChart/sparkbar-within-a-paragraph-dark-800w.webp b/docs/static/screenshots/BarChart/sparkbar-within-a-paragraph-dark-800w.webp index 69764fd35d..4ec3d6e4f3 100644 Binary files a/docs/static/screenshots/BarChart/sparkbar-within-a-paragraph-dark-800w.webp and b/docs/static/screenshots/BarChart/sparkbar-within-a-paragraph-dark-800w.webp differ diff --git a/docs/static/screenshots/BarChart/sparkbar-within-a-paragraph-light-240w.webp b/docs/static/screenshots/BarChart/sparkbar-within-a-paragraph-light-240w.webp index 9f7ebac07d..245aafc6ef 100644 Binary files a/docs/static/screenshots/BarChart/sparkbar-within-a-paragraph-light-240w.webp and b/docs/static/screenshots/BarChart/sparkbar-within-a-paragraph-light-240w.webp differ diff --git a/docs/static/screenshots/BarChart/sparkbar-within-a-paragraph-light-400w.webp b/docs/static/screenshots/BarChart/sparkbar-within-a-paragraph-light-400w.webp index 9f7ebac07d..245aafc6ef 100644 Binary files a/docs/static/screenshots/BarChart/sparkbar-within-a-paragraph-light-400w.webp and b/docs/static/screenshots/BarChart/sparkbar-within-a-paragraph-light-400w.webp differ diff --git a/docs/static/screenshots/BarChart/sparkbar-within-a-paragraph-light-800w.webp b/docs/static/screenshots/BarChart/sparkbar-within-a-paragraph-light-800w.webp index 9f7ebac07d..245aafc6ef 100644 Binary files a/docs/static/screenshots/BarChart/sparkbar-within-a-paragraph-light-800w.webp and b/docs/static/screenshots/BarChart/sparkbar-within-a-paragraph-light-800w.webp differ diff --git a/docs/static/screenshots/BarChart/sparkbar-within-a-paragraph-with-tooltip-and-highlight-dark-240w.webp b/docs/static/screenshots/BarChart/sparkbar-within-a-paragraph-with-tooltip-and-highlight-dark-240w.webp index 4d274e940f..9a5effd4cc 100644 Binary files a/docs/static/screenshots/BarChart/sparkbar-within-a-paragraph-with-tooltip-and-highlight-dark-240w.webp and b/docs/static/screenshots/BarChart/sparkbar-within-a-paragraph-with-tooltip-and-highlight-dark-240w.webp differ diff --git a/docs/static/screenshots/BarChart/sparkbar-within-a-paragraph-with-tooltip-and-highlight-dark-400w.webp b/docs/static/screenshots/BarChart/sparkbar-within-a-paragraph-with-tooltip-and-highlight-dark-400w.webp index 4d274e940f..9a5effd4cc 100644 Binary files a/docs/static/screenshots/BarChart/sparkbar-within-a-paragraph-with-tooltip-and-highlight-dark-400w.webp and b/docs/static/screenshots/BarChart/sparkbar-within-a-paragraph-with-tooltip-and-highlight-dark-400w.webp differ diff --git a/docs/static/screenshots/BarChart/sparkbar-within-a-paragraph-with-tooltip-and-highlight-dark-800w.webp b/docs/static/screenshots/BarChart/sparkbar-within-a-paragraph-with-tooltip-and-highlight-dark-800w.webp index 4d274e940f..9a5effd4cc 100644 Binary files a/docs/static/screenshots/BarChart/sparkbar-within-a-paragraph-with-tooltip-and-highlight-dark-800w.webp and b/docs/static/screenshots/BarChart/sparkbar-within-a-paragraph-with-tooltip-and-highlight-dark-800w.webp differ diff --git a/docs/static/screenshots/BarChart/sparkbar-within-a-paragraph-with-tooltip-and-highlight-light-240w.webp b/docs/static/screenshots/BarChart/sparkbar-within-a-paragraph-with-tooltip-and-highlight-light-240w.webp index b44f4e7ce2..cac9b51485 100644 Binary files a/docs/static/screenshots/BarChart/sparkbar-within-a-paragraph-with-tooltip-and-highlight-light-240w.webp and b/docs/static/screenshots/BarChart/sparkbar-within-a-paragraph-with-tooltip-and-highlight-light-240w.webp differ diff --git a/docs/static/screenshots/BarChart/sparkbar-within-a-paragraph-with-tooltip-and-highlight-light-400w.webp b/docs/static/screenshots/BarChart/sparkbar-within-a-paragraph-with-tooltip-and-highlight-light-400w.webp index b44f4e7ce2..cac9b51485 100644 Binary files a/docs/static/screenshots/BarChart/sparkbar-within-a-paragraph-with-tooltip-and-highlight-light-400w.webp and b/docs/static/screenshots/BarChart/sparkbar-within-a-paragraph-with-tooltip-and-highlight-light-400w.webp differ diff --git a/docs/static/screenshots/BarChart/sparkbar-within-a-paragraph-with-tooltip-and-highlight-light-800w.webp b/docs/static/screenshots/BarChart/sparkbar-within-a-paragraph-with-tooltip-and-highlight-light-800w.webp index b44f4e7ce2..cac9b51485 100644 Binary files a/docs/static/screenshots/BarChart/sparkbar-within-a-paragraph-with-tooltip-and-highlight-light-800w.webp and b/docs/static/screenshots/BarChart/sparkbar-within-a-paragraph-with-tooltip-and-highlight-light-800w.webp differ diff --git a/docs/static/screenshots/BarChart/stack-long-data-dark-240w.webp b/docs/static/screenshots/BarChart/stack-long-data-dark-240w.webp new file mode 100644 index 0000000000..f218557e96 Binary files /dev/null and b/docs/static/screenshots/BarChart/stack-long-data-dark-240w.webp differ diff --git a/docs/static/screenshots/BarChart/stack-long-data-dark-400w.webp b/docs/static/screenshots/BarChart/stack-long-data-dark-400w.webp new file mode 100644 index 0000000000..11e493a23e Binary files /dev/null and b/docs/static/screenshots/BarChart/stack-long-data-dark-400w.webp differ diff --git a/docs/static/screenshots/BarChart/stack-long-data-dark-800w.webp b/docs/static/screenshots/BarChart/stack-long-data-dark-800w.webp new file mode 100644 index 0000000000..9746668858 Binary files /dev/null and b/docs/static/screenshots/BarChart/stack-long-data-dark-800w.webp differ diff --git a/docs/static/screenshots/BarChart/stack-long-data-light-240w.webp b/docs/static/screenshots/BarChart/stack-long-data-light-240w.webp new file mode 100644 index 0000000000..a40e4f5155 Binary files /dev/null and b/docs/static/screenshots/BarChart/stack-long-data-light-240w.webp differ diff --git a/docs/static/screenshots/BarChart/stack-long-data-light-400w.webp b/docs/static/screenshots/BarChart/stack-long-data-light-400w.webp new file mode 100644 index 0000000000..3310264720 Binary files /dev/null and b/docs/static/screenshots/BarChart/stack-long-data-light-400w.webp differ diff --git a/docs/static/screenshots/BarChart/stack-long-data-light-800w.webp b/docs/static/screenshots/BarChart/stack-long-data-light-800w.webp new file mode 100644 index 0000000000..2c23b70c4a Binary files /dev/null and b/docs/static/screenshots/BarChart/stack-long-data-light-800w.webp differ diff --git a/docs/static/screenshots/BarChart/stack-series-dark-240w.webp b/docs/static/screenshots/BarChart/stack-series-dark-240w.webp index 972da1f820..e42b5ab954 100644 Binary files a/docs/static/screenshots/BarChart/stack-series-dark-240w.webp and b/docs/static/screenshots/BarChart/stack-series-dark-240w.webp differ diff --git a/docs/static/screenshots/BarChart/stack-series-dark-800w.webp b/docs/static/screenshots/BarChart/stack-series-dark-800w.webp index 4e2cc057d7..d4b523d9e6 100644 Binary files a/docs/static/screenshots/BarChart/stack-series-dark-800w.webp and b/docs/static/screenshots/BarChart/stack-series-dark-800w.webp differ diff --git a/docs/static/screenshots/BarChart/stack-series-diverging-dark-800w.webp b/docs/static/screenshots/BarChart/stack-series-diverging-dark-800w.webp index 3f11db22d4..0884749ea0 100644 Binary files a/docs/static/screenshots/BarChart/stack-series-diverging-dark-800w.webp and b/docs/static/screenshots/BarChart/stack-series-diverging-dark-800w.webp differ diff --git a/docs/static/screenshots/BarChart/stack-series-diverging-light-800w.webp b/docs/static/screenshots/BarChart/stack-series-diverging-light-800w.webp index d3d10165b8..bf516b7639 100644 Binary files a/docs/static/screenshots/BarChart/stack-series-diverging-light-800w.webp and b/docs/static/screenshots/BarChart/stack-series-diverging-light-800w.webp differ diff --git a/docs/static/screenshots/BarChart/stack-series-expand-dark-800w.webp b/docs/static/screenshots/BarChart/stack-series-expand-dark-800w.webp index 82522fbb8b..02ed259e0b 100644 Binary files a/docs/static/screenshots/BarChart/stack-series-expand-dark-800w.webp and b/docs/static/screenshots/BarChart/stack-series-expand-dark-800w.webp differ diff --git a/docs/static/screenshots/BarChart/stack-series-horizontal-dark-240w.webp b/docs/static/screenshots/BarChart/stack-series-horizontal-dark-240w.webp index 225a48df55..5a8859c4ad 100644 Binary files a/docs/static/screenshots/BarChart/stack-series-horizontal-dark-240w.webp and b/docs/static/screenshots/BarChart/stack-series-horizontal-dark-240w.webp differ diff --git a/docs/static/screenshots/BarChart/stack-series-horizontal-dark-400w.webp b/docs/static/screenshots/BarChart/stack-series-horizontal-dark-400w.webp index 8dd7254add..b428e57933 100644 Binary files a/docs/static/screenshots/BarChart/stack-series-horizontal-dark-400w.webp and b/docs/static/screenshots/BarChart/stack-series-horizontal-dark-400w.webp differ diff --git a/docs/static/screenshots/BarChart/stack-series-horizontal-dark-800w.webp b/docs/static/screenshots/BarChart/stack-series-horizontal-dark-800w.webp index 7913b65821..6b7d6c38aa 100644 Binary files a/docs/static/screenshots/BarChart/stack-series-horizontal-dark-800w.webp and b/docs/static/screenshots/BarChart/stack-series-horizontal-dark-800w.webp differ diff --git a/docs/static/screenshots/BarChart/stack-series-horizontal-light-400w.webp b/docs/static/screenshots/BarChart/stack-series-horizontal-light-400w.webp index 2701da0caf..1ef31e538b 100644 Binary files a/docs/static/screenshots/BarChart/stack-series-horizontal-light-400w.webp and b/docs/static/screenshots/BarChart/stack-series-horizontal-light-400w.webp differ diff --git a/docs/static/screenshots/BarChart/stack-series-horizontal-light-800w.webp b/docs/static/screenshots/BarChart/stack-series-horizontal-light-800w.webp index fa612c54a4..c524fbc0a3 100644 Binary files a/docs/static/screenshots/BarChart/stack-series-horizontal-light-800w.webp and b/docs/static/screenshots/BarChart/stack-series-horizontal-light-800w.webp differ diff --git a/docs/static/screenshots/BarChart/stack-series-light-400w.webp b/docs/static/screenshots/BarChart/stack-series-light-400w.webp index d392144247..b442fae5b5 100644 Binary files a/docs/static/screenshots/BarChart/stack-series-light-400w.webp and b/docs/static/screenshots/BarChart/stack-series-light-400w.webp differ diff --git a/docs/static/screenshots/BarChart/stack-series-light-800w.webp b/docs/static/screenshots/BarChart/stack-series-light-800w.webp index 1032fa9ca1..8d02b2d8b5 100644 Binary files a/docs/static/screenshots/BarChart/stack-series-light-800w.webp and b/docs/static/screenshots/BarChart/stack-series-light-800w.webp differ diff --git a/docs/static/screenshots/BarChart/stack-series-padded-dark-240w.webp b/docs/static/screenshots/BarChart/stack-series-padded-dark-240w.webp index 81869ea264..94200c9296 100644 Binary files a/docs/static/screenshots/BarChart/stack-series-padded-dark-240w.webp and b/docs/static/screenshots/BarChart/stack-series-padded-dark-240w.webp differ diff --git a/docs/static/screenshots/BarChart/stack-series-padded-dark-800w.webp b/docs/static/screenshots/BarChart/stack-series-padded-dark-800w.webp index 46780f59e8..e738499c4b 100644 Binary files a/docs/static/screenshots/BarChart/stack-series-padded-dark-800w.webp and b/docs/static/screenshots/BarChart/stack-series-padded-dark-800w.webp differ diff --git a/docs/static/screenshots/BarChart/stack-series-padded-light-400w.webp b/docs/static/screenshots/BarChart/stack-series-padded-light-400w.webp index 4934713519..58368858fc 100644 Binary files a/docs/static/screenshots/BarChart/stack-series-padded-light-400w.webp and b/docs/static/screenshots/BarChart/stack-series-padded-light-400w.webp differ diff --git a/docs/static/screenshots/BarChart/stack-series-padded-light-800w.webp b/docs/static/screenshots/BarChart/stack-series-padded-light-800w.webp index 682d430cc2..a1a1422749 100644 Binary files a/docs/static/screenshots/BarChart/stack-series-padded-light-800w.webp and b/docs/static/screenshots/BarChart/stack-series-padded-light-800w.webp differ diff --git a/docs/static/screenshots/BarChart/time-scale-interval-dark-240w.webp b/docs/static/screenshots/BarChart/time-scale-interval-dark-240w.webp index 9f42f69d91..4ed9dc3183 100644 Binary files a/docs/static/screenshots/BarChart/time-scale-interval-dark-240w.webp and b/docs/static/screenshots/BarChart/time-scale-interval-dark-240w.webp differ diff --git a/docs/static/screenshots/BarChart/time-scale-interval-dark-400w.webp b/docs/static/screenshots/BarChart/time-scale-interval-dark-400w.webp index 9b9f122492..0d36bbdfbd 100644 Binary files a/docs/static/screenshots/BarChart/time-scale-interval-dark-400w.webp and b/docs/static/screenshots/BarChart/time-scale-interval-dark-400w.webp differ diff --git a/docs/static/screenshots/BarChart/time-scale-interval-dark-800w.webp b/docs/static/screenshots/BarChart/time-scale-interval-dark-800w.webp index 859ad080b1..8791a44507 100644 Binary files a/docs/static/screenshots/BarChart/time-scale-interval-dark-800w.webp and b/docs/static/screenshots/BarChart/time-scale-interval-dark-800w.webp differ diff --git a/docs/static/screenshots/BarChart/time-scale-interval-horizontal-dark-240w.webp b/docs/static/screenshots/BarChart/time-scale-interval-horizontal-dark-240w.webp index c305233a9c..4bbe955794 100644 Binary files a/docs/static/screenshots/BarChart/time-scale-interval-horizontal-dark-240w.webp and b/docs/static/screenshots/BarChart/time-scale-interval-horizontal-dark-240w.webp differ diff --git a/docs/static/screenshots/BarChart/time-scale-interval-horizontal-dark-400w.webp b/docs/static/screenshots/BarChart/time-scale-interval-horizontal-dark-400w.webp index 10a669fb02..3877580875 100644 Binary files a/docs/static/screenshots/BarChart/time-scale-interval-horizontal-dark-400w.webp and b/docs/static/screenshots/BarChart/time-scale-interval-horizontal-dark-400w.webp differ diff --git a/docs/static/screenshots/BarChart/time-scale-interval-horizontal-dark-800w.webp b/docs/static/screenshots/BarChart/time-scale-interval-horizontal-dark-800w.webp index bcac46099e..3849c13711 100644 Binary files a/docs/static/screenshots/BarChart/time-scale-interval-horizontal-dark-800w.webp and b/docs/static/screenshots/BarChart/time-scale-interval-horizontal-dark-800w.webp differ diff --git a/docs/static/screenshots/BarChart/time-scale-interval-horizontal-light-240w.webp b/docs/static/screenshots/BarChart/time-scale-interval-horizontal-light-240w.webp index f2e7339355..6e7aad8e8c 100644 Binary files a/docs/static/screenshots/BarChart/time-scale-interval-horizontal-light-240w.webp and b/docs/static/screenshots/BarChart/time-scale-interval-horizontal-light-240w.webp differ diff --git a/docs/static/screenshots/BarChart/time-scale-interval-horizontal-light-400w.webp b/docs/static/screenshots/BarChart/time-scale-interval-horizontal-light-400w.webp index c90d89a1c4..1c9e9a90f0 100644 Binary files a/docs/static/screenshots/BarChart/time-scale-interval-horizontal-light-400w.webp and b/docs/static/screenshots/BarChart/time-scale-interval-horizontal-light-400w.webp differ diff --git a/docs/static/screenshots/BarChart/time-scale-interval-horizontal-light-800w.webp b/docs/static/screenshots/BarChart/time-scale-interval-horizontal-light-800w.webp index 5eb1b06fef..7931482794 100644 Binary files a/docs/static/screenshots/BarChart/time-scale-interval-horizontal-light-800w.webp and b/docs/static/screenshots/BarChart/time-scale-interval-horizontal-light-800w.webp differ diff --git a/docs/static/screenshots/BarChart/time-scale-interval-light-240w.webp b/docs/static/screenshots/BarChart/time-scale-interval-light-240w.webp index cb3b6c962a..cb6d18cc78 100644 Binary files a/docs/static/screenshots/BarChart/time-scale-interval-light-240w.webp and b/docs/static/screenshots/BarChart/time-scale-interval-light-240w.webp differ diff --git a/docs/static/screenshots/BarChart/time-scale-interval-light-400w.webp b/docs/static/screenshots/BarChart/time-scale-interval-light-400w.webp index a2b7c9d109..010e9f44c4 100644 Binary files a/docs/static/screenshots/BarChart/time-scale-interval-light-400w.webp and b/docs/static/screenshots/BarChart/time-scale-interval-light-400w.webp differ diff --git a/docs/static/screenshots/BarChart/time-scale-interval-light-800w.webp b/docs/static/screenshots/BarChart/time-scale-interval-light-800w.webp index 7922550c95..3442275332 100644 Binary files a/docs/static/screenshots/BarChart/time-scale-interval-light-800w.webp and b/docs/static/screenshots/BarChart/time-scale-interval-light-800w.webp differ diff --git a/docs/static/screenshots/BarChart/time-scale-interval-with-inset-dark-240w.webp b/docs/static/screenshots/BarChart/time-scale-interval-with-inset-dark-240w.webp index a77f7e359b..cbf5cfcff7 100644 Binary files a/docs/static/screenshots/BarChart/time-scale-interval-with-inset-dark-240w.webp and b/docs/static/screenshots/BarChart/time-scale-interval-with-inset-dark-240w.webp differ diff --git a/docs/static/screenshots/BarChart/time-scale-interval-with-inset-dark-400w.webp b/docs/static/screenshots/BarChart/time-scale-interval-with-inset-dark-400w.webp index a392cfa052..d3c3259e8e 100644 Binary files a/docs/static/screenshots/BarChart/time-scale-interval-with-inset-dark-400w.webp and b/docs/static/screenshots/BarChart/time-scale-interval-with-inset-dark-400w.webp differ diff --git a/docs/static/screenshots/BarChart/time-scale-interval-with-inset-dark-800w.webp b/docs/static/screenshots/BarChart/time-scale-interval-with-inset-dark-800w.webp index 50e6e5ff41..cbcbe080da 100644 Binary files a/docs/static/screenshots/BarChart/time-scale-interval-with-inset-dark-800w.webp and b/docs/static/screenshots/BarChart/time-scale-interval-with-inset-dark-800w.webp differ diff --git a/docs/static/screenshots/BarChart/time-scale-interval-with-inset-light-240w.webp b/docs/static/screenshots/BarChart/time-scale-interval-with-inset-light-240w.webp index dc9f01fb12..7df5e8f534 100644 Binary files a/docs/static/screenshots/BarChart/time-scale-interval-with-inset-light-240w.webp and b/docs/static/screenshots/BarChart/time-scale-interval-with-inset-light-240w.webp differ diff --git a/docs/static/screenshots/BarChart/time-scale-interval-with-inset-light-400w.webp b/docs/static/screenshots/BarChart/time-scale-interval-with-inset-light-400w.webp index 82106fe27f..825b069d90 100644 Binary files a/docs/static/screenshots/BarChart/time-scale-interval-with-inset-light-400w.webp and b/docs/static/screenshots/BarChart/time-scale-interval-with-inset-light-400w.webp differ diff --git a/docs/static/screenshots/BarChart/time-scale-interval-with-inset-light-800w.webp b/docs/static/screenshots/BarChart/time-scale-interval-with-inset-light-800w.webp index 39e0210b75..04bc57626a 100644 Binary files a/docs/static/screenshots/BarChart/time-scale-interval-with-inset-light-800w.webp and b/docs/static/screenshots/BarChart/time-scale-interval-with-inset-light-800w.webp differ diff --git a/docs/static/screenshots/BarChart/tooltip-click-dark-240w.webp b/docs/static/screenshots/BarChart/tooltip-click-dark-240w.webp index a3a78af51e..ed5c054272 100644 Binary files a/docs/static/screenshots/BarChart/tooltip-click-dark-240w.webp and b/docs/static/screenshots/BarChart/tooltip-click-dark-240w.webp differ diff --git a/docs/static/screenshots/BarChart/tooltip-click-dark-400w.webp b/docs/static/screenshots/BarChart/tooltip-click-dark-400w.webp index e55aa887c7..5a955a3940 100644 Binary files a/docs/static/screenshots/BarChart/tooltip-click-dark-400w.webp and b/docs/static/screenshots/BarChart/tooltip-click-dark-400w.webp differ diff --git a/docs/static/screenshots/BarChart/tooltip-click-dark-800w.webp b/docs/static/screenshots/BarChart/tooltip-click-dark-800w.webp index fde613384b..faa0ce22ed 100644 Binary files a/docs/static/screenshots/BarChart/tooltip-click-dark-800w.webp and b/docs/static/screenshots/BarChart/tooltip-click-dark-800w.webp differ diff --git a/docs/static/screenshots/BarChart/tooltip-click-light-240w.webp b/docs/static/screenshots/BarChart/tooltip-click-light-240w.webp index e37e63a8db..5e8f89e40b 100644 Binary files a/docs/static/screenshots/BarChart/tooltip-click-light-240w.webp and b/docs/static/screenshots/BarChart/tooltip-click-light-240w.webp differ diff --git a/docs/static/screenshots/BarChart/tooltip-click-light-400w.webp b/docs/static/screenshots/BarChart/tooltip-click-light-400w.webp index ca0acd2fb1..bc4c83414f 100644 Binary files a/docs/static/screenshots/BarChart/tooltip-click-light-400w.webp and b/docs/static/screenshots/BarChart/tooltip-click-light-400w.webp differ diff --git a/docs/static/screenshots/BarChart/tooltip-click-light-800w.webp b/docs/static/screenshots/BarChart/tooltip-click-light-800w.webp index 6cd7615205..68303cc2e3 100644 Binary files a/docs/static/screenshots/BarChart/tooltip-click-light-800w.webp and b/docs/static/screenshots/BarChart/tooltip-click-light-800w.webp differ diff --git a/docs/static/screenshots/BarChart/vertical-default-dark-240w.webp b/docs/static/screenshots/BarChart/vertical-default-dark-240w.webp index 23a4b5a902..0871e9f3be 100644 Binary files a/docs/static/screenshots/BarChart/vertical-default-dark-240w.webp and b/docs/static/screenshots/BarChart/vertical-default-dark-240w.webp differ diff --git a/docs/static/screenshots/BarChart/vertical-default-dark-400w.webp b/docs/static/screenshots/BarChart/vertical-default-dark-400w.webp index 34c8a95523..bbdac70b66 100644 Binary files a/docs/static/screenshots/BarChart/vertical-default-dark-400w.webp and b/docs/static/screenshots/BarChart/vertical-default-dark-400w.webp differ diff --git a/docs/static/screenshots/BarChart/vertical-default-dark-800w.webp b/docs/static/screenshots/BarChart/vertical-default-dark-800w.webp index d0f8372f54..370d3ac6fa 100644 Binary files a/docs/static/screenshots/BarChart/vertical-default-dark-800w.webp and b/docs/static/screenshots/BarChart/vertical-default-dark-800w.webp differ diff --git a/docs/static/screenshots/BarChart/vertical-default-light-240w.webp b/docs/static/screenshots/BarChart/vertical-default-light-240w.webp index 147b79ac96..df760fb694 100644 Binary files a/docs/static/screenshots/BarChart/vertical-default-light-240w.webp and b/docs/static/screenshots/BarChart/vertical-default-light-240w.webp differ diff --git a/docs/static/screenshots/BarChart/vertical-default-light-400w.webp b/docs/static/screenshots/BarChart/vertical-default-light-400w.webp index 6cb5970604..b3c235474d 100644 Binary files a/docs/static/screenshots/BarChart/vertical-default-light-400w.webp and b/docs/static/screenshots/BarChart/vertical-default-light-400w.webp differ diff --git a/docs/static/screenshots/BarChart/vertical-default-light-800w.webp b/docs/static/screenshots/BarChart/vertical-default-light-800w.webp index b7dcbfc4bc..4b568ca872 100644 Binary files a/docs/static/screenshots/BarChart/vertical-default-light-800w.webp and b/docs/static/screenshots/BarChart/vertical-default-light-800w.webp differ diff --git a/docs/static/screenshots/BarChart/vertical-fixed-width-dark-240w.webp b/docs/static/screenshots/BarChart/vertical-fixed-width-dark-240w.webp index e0023fb988..31087ba5f7 100644 Binary files a/docs/static/screenshots/BarChart/vertical-fixed-width-dark-240w.webp and b/docs/static/screenshots/BarChart/vertical-fixed-width-dark-240w.webp differ diff --git a/docs/static/screenshots/BarChart/vertical-fixed-width-dark-400w.webp b/docs/static/screenshots/BarChart/vertical-fixed-width-dark-400w.webp index cc1d52ed65..00a1bdc8b9 100644 Binary files a/docs/static/screenshots/BarChart/vertical-fixed-width-dark-400w.webp and b/docs/static/screenshots/BarChart/vertical-fixed-width-dark-400w.webp differ diff --git a/docs/static/screenshots/BarChart/vertical-fixed-width-dark-800w.webp b/docs/static/screenshots/BarChart/vertical-fixed-width-dark-800w.webp index 728b6ace3b..9d86811097 100644 Binary files a/docs/static/screenshots/BarChart/vertical-fixed-width-dark-800w.webp and b/docs/static/screenshots/BarChart/vertical-fixed-width-dark-800w.webp differ diff --git a/docs/static/screenshots/BarChart/vertical-fixed-width-light-240w.webp b/docs/static/screenshots/BarChart/vertical-fixed-width-light-240w.webp index 64270dea19..d8d5ade315 100644 Binary files a/docs/static/screenshots/BarChart/vertical-fixed-width-light-240w.webp and b/docs/static/screenshots/BarChart/vertical-fixed-width-light-240w.webp differ diff --git a/docs/static/screenshots/BarChart/vertical-fixed-width-light-400w.webp b/docs/static/screenshots/BarChart/vertical-fixed-width-light-400w.webp index ba2a94ac2c..908b84586b 100644 Binary files a/docs/static/screenshots/BarChart/vertical-fixed-width-light-400w.webp and b/docs/static/screenshots/BarChart/vertical-fixed-width-light-400w.webp differ diff --git a/docs/static/screenshots/BarChart/vertical-fixed-width-light-800w.webp b/docs/static/screenshots/BarChart/vertical-fixed-width-light-800w.webp index 3b5b089e6a..89dcd28124 100644 Binary files a/docs/static/screenshots/BarChart/vertical-fixed-width-light-800w.webp and b/docs/static/screenshots/BarChart/vertical-fixed-width-light-800w.webp differ diff --git a/docs/static/screenshots/BarChart/waterfall-dark-240w.webp b/docs/static/screenshots/BarChart/waterfall-dark-240w.webp index 817d7a4b79..c4d786fac2 100644 Binary files a/docs/static/screenshots/BarChart/waterfall-dark-240w.webp and b/docs/static/screenshots/BarChart/waterfall-dark-240w.webp differ diff --git a/docs/static/screenshots/BarChart/waterfall-dark-400w.webp b/docs/static/screenshots/BarChart/waterfall-dark-400w.webp index 7e1cb3e668..2db8389cb9 100644 Binary files a/docs/static/screenshots/BarChart/waterfall-dark-400w.webp and b/docs/static/screenshots/BarChart/waterfall-dark-400w.webp differ diff --git a/docs/static/screenshots/BarChart/waterfall-dark-800w.webp b/docs/static/screenshots/BarChart/waterfall-dark-800w.webp index bfc5dca138..0c1566020e 100644 Binary files a/docs/static/screenshots/BarChart/waterfall-dark-800w.webp and b/docs/static/screenshots/BarChart/waterfall-dark-800w.webp differ diff --git a/docs/static/screenshots/BarChart/waterfall-light-240w.webp b/docs/static/screenshots/BarChart/waterfall-light-240w.webp index 3590a97d94..1364cd29fe 100644 Binary files a/docs/static/screenshots/BarChart/waterfall-light-240w.webp and b/docs/static/screenshots/BarChart/waterfall-light-240w.webp differ diff --git a/docs/static/screenshots/BarChart/waterfall-light-400w.webp b/docs/static/screenshots/BarChart/waterfall-light-400w.webp index cca5829143..45c5fdf083 100644 Binary files a/docs/static/screenshots/BarChart/waterfall-light-400w.webp and b/docs/static/screenshots/BarChart/waterfall-light-400w.webp differ diff --git a/docs/static/screenshots/BarChart/waterfall-light-800w.webp b/docs/static/screenshots/BarChart/waterfall-light-800w.webp index 036e279457..11af5293c4 100644 Binary files a/docs/static/screenshots/BarChart/waterfall-light-800w.webp and b/docs/static/screenshots/BarChart/waterfall-light-800w.webp differ diff --git a/docs/static/screenshots/Bars/horizontal-average-annotation-rule-dark-240w.webp b/docs/static/screenshots/Bars/horizontal-average-annotation-rule-dark-240w.webp index d6fc3fc720..19b0f5bf41 100644 Binary files a/docs/static/screenshots/Bars/horizontal-average-annotation-rule-dark-240w.webp and b/docs/static/screenshots/Bars/horizontal-average-annotation-rule-dark-240w.webp differ diff --git a/docs/static/screenshots/Bars/horizontal-average-annotation-rule-dark-400w.webp b/docs/static/screenshots/Bars/horizontal-average-annotation-rule-dark-400w.webp index 42ac1dd4dd..34fa0a1009 100644 Binary files a/docs/static/screenshots/Bars/horizontal-average-annotation-rule-dark-400w.webp and b/docs/static/screenshots/Bars/horizontal-average-annotation-rule-dark-400w.webp differ diff --git a/docs/static/screenshots/Bars/horizontal-average-annotation-rule-dark-800w.webp b/docs/static/screenshots/Bars/horizontal-average-annotation-rule-dark-800w.webp index 0cb65f7e9d..214f7876f7 100644 Binary files a/docs/static/screenshots/Bars/horizontal-average-annotation-rule-dark-800w.webp and b/docs/static/screenshots/Bars/horizontal-average-annotation-rule-dark-800w.webp differ diff --git a/docs/static/screenshots/Bars/horizontal-average-annotation-rule-light-240w.webp b/docs/static/screenshots/Bars/horizontal-average-annotation-rule-light-240w.webp index 80d02a013f..84e51cb790 100644 Binary files a/docs/static/screenshots/Bars/horizontal-average-annotation-rule-light-240w.webp and b/docs/static/screenshots/Bars/horizontal-average-annotation-rule-light-240w.webp differ diff --git a/docs/static/screenshots/Bars/horizontal-average-annotation-rule-light-400w.webp b/docs/static/screenshots/Bars/horizontal-average-annotation-rule-light-400w.webp index 2d283daf48..6637aeb655 100644 Binary files a/docs/static/screenshots/Bars/horizontal-average-annotation-rule-light-400w.webp and b/docs/static/screenshots/Bars/horizontal-average-annotation-rule-light-400w.webp differ diff --git a/docs/static/screenshots/Bars/horizontal-average-annotation-rule-light-800w.webp b/docs/static/screenshots/Bars/horizontal-average-annotation-rule-light-800w.webp index 519c916af2..39a32a158f 100644 Binary files a/docs/static/screenshots/Bars/horizontal-average-annotation-rule-light-800w.webp and b/docs/static/screenshots/Bars/horizontal-average-annotation-rule-light-800w.webp differ diff --git a/docs/static/screenshots/Bars/horizontal-basic-dark-240w.webp b/docs/static/screenshots/Bars/horizontal-basic-dark-240w.webp index 11a591d88d..3c925b3483 100644 Binary files a/docs/static/screenshots/Bars/horizontal-basic-dark-240w.webp and b/docs/static/screenshots/Bars/horizontal-basic-dark-240w.webp differ diff --git a/docs/static/screenshots/Bars/horizontal-basic-dark-400w.webp b/docs/static/screenshots/Bars/horizontal-basic-dark-400w.webp index 8a3c9bdffb..06936e4cde 100644 Binary files a/docs/static/screenshots/Bars/horizontal-basic-dark-400w.webp and b/docs/static/screenshots/Bars/horizontal-basic-dark-400w.webp differ diff --git a/docs/static/screenshots/Bars/horizontal-basic-dark-800w.webp b/docs/static/screenshots/Bars/horizontal-basic-dark-800w.webp index 9379f17dc2..09b19b53c1 100644 Binary files a/docs/static/screenshots/Bars/horizontal-basic-dark-800w.webp and b/docs/static/screenshots/Bars/horizontal-basic-dark-800w.webp differ diff --git a/docs/static/screenshots/Bars/horizontal-basic-light-240w.webp b/docs/static/screenshots/Bars/horizontal-basic-light-240w.webp index 8742d8acbb..a6ec3f15e4 100644 Binary files a/docs/static/screenshots/Bars/horizontal-basic-light-240w.webp and b/docs/static/screenshots/Bars/horizontal-basic-light-240w.webp differ diff --git a/docs/static/screenshots/Bars/horizontal-basic-light-400w.webp b/docs/static/screenshots/Bars/horizontal-basic-light-400w.webp index fedbd2c0f2..2bdbb53e20 100644 Binary files a/docs/static/screenshots/Bars/horizontal-basic-light-400w.webp and b/docs/static/screenshots/Bars/horizontal-basic-light-400w.webp differ diff --git a/docs/static/screenshots/Bars/horizontal-basic-light-800w.webp b/docs/static/screenshots/Bars/horizontal-basic-light-800w.webp index 62fd4e41fe..53d6ffecd3 100644 Binary files a/docs/static/screenshots/Bars/horizontal-basic-light-800w.webp and b/docs/static/screenshots/Bars/horizontal-basic-light-800w.webp differ diff --git a/docs/static/screenshots/Bars/horizontal-calculated-value-domain-negative-dark-240w.webp b/docs/static/screenshots/Bars/horizontal-calculated-value-domain-negative-dark-240w.webp index 36799213d7..128c47006d 100644 Binary files a/docs/static/screenshots/Bars/horizontal-calculated-value-domain-negative-dark-240w.webp and b/docs/static/screenshots/Bars/horizontal-calculated-value-domain-negative-dark-240w.webp differ diff --git a/docs/static/screenshots/Bars/horizontal-calculated-value-domain-negative-dark-400w.webp b/docs/static/screenshots/Bars/horizontal-calculated-value-domain-negative-dark-400w.webp index da6904a1a7..911d39333c 100644 Binary files a/docs/static/screenshots/Bars/horizontal-calculated-value-domain-negative-dark-400w.webp and b/docs/static/screenshots/Bars/horizontal-calculated-value-domain-negative-dark-400w.webp differ diff --git a/docs/static/screenshots/Bars/horizontal-calculated-value-domain-negative-dark-800w.webp b/docs/static/screenshots/Bars/horizontal-calculated-value-domain-negative-dark-800w.webp index 15755063b0..04418fa75c 100644 Binary files a/docs/static/screenshots/Bars/horizontal-calculated-value-domain-negative-dark-800w.webp and b/docs/static/screenshots/Bars/horizontal-calculated-value-domain-negative-dark-800w.webp differ diff --git a/docs/static/screenshots/Bars/horizontal-calculated-value-domain-negative-light-240w.webp b/docs/static/screenshots/Bars/horizontal-calculated-value-domain-negative-light-240w.webp index fec5964c12..fed2378981 100644 Binary files a/docs/static/screenshots/Bars/horizontal-calculated-value-domain-negative-light-240w.webp and b/docs/static/screenshots/Bars/horizontal-calculated-value-domain-negative-light-240w.webp differ diff --git a/docs/static/screenshots/Bars/horizontal-calculated-value-domain-negative-light-400w.webp b/docs/static/screenshots/Bars/horizontal-calculated-value-domain-negative-light-400w.webp index 5fafac6300..f3d73766b9 100644 Binary files a/docs/static/screenshots/Bars/horizontal-calculated-value-domain-negative-light-400w.webp and b/docs/static/screenshots/Bars/horizontal-calculated-value-domain-negative-light-400w.webp differ diff --git a/docs/static/screenshots/Bars/horizontal-calculated-value-domain-negative-light-800w.webp b/docs/static/screenshots/Bars/horizontal-calculated-value-domain-negative-light-800w.webp index 677058c487..2f2a09c42b 100644 Binary files a/docs/static/screenshots/Bars/horizontal-calculated-value-domain-negative-light-800w.webp and b/docs/static/screenshots/Bars/horizontal-calculated-value-domain-negative-light-800w.webp differ diff --git a/docs/static/screenshots/Bars/horizontal-calculated-value-domain-positive-dark-240w.webp b/docs/static/screenshots/Bars/horizontal-calculated-value-domain-positive-dark-240w.webp index ac3248abcb..842a5db55f 100644 Binary files a/docs/static/screenshots/Bars/horizontal-calculated-value-domain-positive-dark-240w.webp and b/docs/static/screenshots/Bars/horizontal-calculated-value-domain-positive-dark-240w.webp differ diff --git a/docs/static/screenshots/Bars/horizontal-calculated-value-domain-positive-dark-400w.webp b/docs/static/screenshots/Bars/horizontal-calculated-value-domain-positive-dark-400w.webp index 8a59095afa..6602fba25f 100644 Binary files a/docs/static/screenshots/Bars/horizontal-calculated-value-domain-positive-dark-400w.webp and b/docs/static/screenshots/Bars/horizontal-calculated-value-domain-positive-dark-400w.webp differ diff --git a/docs/static/screenshots/Bars/horizontal-calculated-value-domain-positive-dark-800w.webp b/docs/static/screenshots/Bars/horizontal-calculated-value-domain-positive-dark-800w.webp index 85bfa0fbeb..597dca9643 100644 Binary files a/docs/static/screenshots/Bars/horizontal-calculated-value-domain-positive-dark-800w.webp and b/docs/static/screenshots/Bars/horizontal-calculated-value-domain-positive-dark-800w.webp differ diff --git a/docs/static/screenshots/Bars/horizontal-calculated-value-domain-positive-light-240w.webp b/docs/static/screenshots/Bars/horizontal-calculated-value-domain-positive-light-240w.webp index 17f4f5fa5a..60370d75a2 100644 Binary files a/docs/static/screenshots/Bars/horizontal-calculated-value-domain-positive-light-240w.webp and b/docs/static/screenshots/Bars/horizontal-calculated-value-domain-positive-light-240w.webp differ diff --git a/docs/static/screenshots/Bars/horizontal-calculated-value-domain-positive-light-400w.webp b/docs/static/screenshots/Bars/horizontal-calculated-value-domain-positive-light-400w.webp index 8095778343..90f1197591 100644 Binary files a/docs/static/screenshots/Bars/horizontal-calculated-value-domain-positive-light-400w.webp and b/docs/static/screenshots/Bars/horizontal-calculated-value-domain-positive-light-400w.webp differ diff --git a/docs/static/screenshots/Bars/horizontal-calculated-value-domain-positive-light-800w.webp b/docs/static/screenshots/Bars/horizontal-calculated-value-domain-positive-light-800w.webp index 90c243ee67..44396da8b8 100644 Binary files a/docs/static/screenshots/Bars/horizontal-calculated-value-domain-positive-light-800w.webp and b/docs/static/screenshots/Bars/horizontal-calculated-value-domain-positive-light-800w.webp differ diff --git a/docs/static/screenshots/Bars/horizontal-candlestick-bars-dark-400w.webp b/docs/static/screenshots/Bars/horizontal-candlestick-bars-dark-400w.webp index 50030d22a6..dc3c508425 100644 Binary files a/docs/static/screenshots/Bars/horizontal-candlestick-bars-dark-400w.webp and b/docs/static/screenshots/Bars/horizontal-candlestick-bars-dark-400w.webp differ diff --git a/docs/static/screenshots/Bars/horizontal-click-handler-dark-240w.webp b/docs/static/screenshots/Bars/horizontal-click-handler-dark-240w.webp index 254b773dcc..fba429397c 100644 Binary files a/docs/static/screenshots/Bars/horizontal-click-handler-dark-240w.webp and b/docs/static/screenshots/Bars/horizontal-click-handler-dark-240w.webp differ diff --git a/docs/static/screenshots/Bars/horizontal-click-handler-dark-400w.webp b/docs/static/screenshots/Bars/horizontal-click-handler-dark-400w.webp index 1b806c2c4a..c2c0bc1f98 100644 Binary files a/docs/static/screenshots/Bars/horizontal-click-handler-dark-400w.webp and b/docs/static/screenshots/Bars/horizontal-click-handler-dark-400w.webp differ diff --git a/docs/static/screenshots/Bars/horizontal-click-handler-dark-800w.webp b/docs/static/screenshots/Bars/horizontal-click-handler-dark-800w.webp index 7b5a29660d..2514aaefd8 100644 Binary files a/docs/static/screenshots/Bars/horizontal-click-handler-dark-800w.webp and b/docs/static/screenshots/Bars/horizontal-click-handler-dark-800w.webp differ diff --git a/docs/static/screenshots/Bars/horizontal-click-handler-light-240w.webp b/docs/static/screenshots/Bars/horizontal-click-handler-light-240w.webp index fd1e6f2345..30510add99 100644 Binary files a/docs/static/screenshots/Bars/horizontal-click-handler-light-240w.webp and b/docs/static/screenshots/Bars/horizontal-click-handler-light-240w.webp differ diff --git a/docs/static/screenshots/Bars/horizontal-click-handler-light-400w.webp b/docs/static/screenshots/Bars/horizontal-click-handler-light-400w.webp index a7f916cbd8..55bf7f7b52 100644 Binary files a/docs/static/screenshots/Bars/horizontal-click-handler-light-400w.webp and b/docs/static/screenshots/Bars/horizontal-click-handler-light-400w.webp differ diff --git a/docs/static/screenshots/Bars/horizontal-click-handler-light-800w.webp b/docs/static/screenshots/Bars/horizontal-click-handler-light-800w.webp index 0eb55d6750..29dab57bc6 100644 Binary files a/docs/static/screenshots/Bars/horizontal-click-handler-light-800w.webp and b/docs/static/screenshots/Bars/horizontal-click-handler-light-800w.webp differ diff --git a/docs/static/screenshots/Bars/horizontal-customize-individual-styles-dark-240w.webp b/docs/static/screenshots/Bars/horizontal-customize-individual-styles-dark-240w.webp index c8926f3cfd..3b97a131e9 100644 Binary files a/docs/static/screenshots/Bars/horizontal-customize-individual-styles-dark-240w.webp and b/docs/static/screenshots/Bars/horizontal-customize-individual-styles-dark-240w.webp differ diff --git a/docs/static/screenshots/Bars/horizontal-customize-individual-styles-dark-400w.webp b/docs/static/screenshots/Bars/horizontal-customize-individual-styles-dark-400w.webp index f883a020c1..517379238d 100644 Binary files a/docs/static/screenshots/Bars/horizontal-customize-individual-styles-dark-400w.webp and b/docs/static/screenshots/Bars/horizontal-customize-individual-styles-dark-400w.webp differ diff --git a/docs/static/screenshots/Bars/horizontal-customize-individual-styles-dark-800w.webp b/docs/static/screenshots/Bars/horizontal-customize-individual-styles-dark-800w.webp index a6e2d5a91c..5aba6a18a7 100644 Binary files a/docs/static/screenshots/Bars/horizontal-customize-individual-styles-dark-800w.webp and b/docs/static/screenshots/Bars/horizontal-customize-individual-styles-dark-800w.webp differ diff --git a/docs/static/screenshots/Bars/horizontal-customize-individual-styles-light-240w.webp b/docs/static/screenshots/Bars/horizontal-customize-individual-styles-light-240w.webp index 3d4b93dab6..839dab2b32 100644 Binary files a/docs/static/screenshots/Bars/horizontal-customize-individual-styles-light-240w.webp and b/docs/static/screenshots/Bars/horizontal-customize-individual-styles-light-240w.webp differ diff --git a/docs/static/screenshots/Bars/horizontal-customize-individual-styles-light-400w.webp b/docs/static/screenshots/Bars/horizontal-customize-individual-styles-light-400w.webp index c5208ab663..9fd2550796 100644 Binary files a/docs/static/screenshots/Bars/horizontal-customize-individual-styles-light-400w.webp and b/docs/static/screenshots/Bars/horizontal-customize-individual-styles-light-400w.webp differ diff --git a/docs/static/screenshots/Bars/horizontal-customize-individual-styles-light-800w.webp b/docs/static/screenshots/Bars/horizontal-customize-individual-styles-light-800w.webp index 5eb98cfe0c..83574db0ce 100644 Binary files a/docs/static/screenshots/Bars/horizontal-customize-individual-styles-light-800w.webp and b/docs/static/screenshots/Bars/horizontal-customize-individual-styles-light-800w.webp differ diff --git a/docs/static/screenshots/Bars/horizontal-gradient-dark-240w.webp b/docs/static/screenshots/Bars/horizontal-gradient-dark-240w.webp index cdb78c526b..a08e63af82 100644 Binary files a/docs/static/screenshots/Bars/horizontal-gradient-dark-240w.webp and b/docs/static/screenshots/Bars/horizontal-gradient-dark-240w.webp differ diff --git a/docs/static/screenshots/Bars/horizontal-gradient-dark-400w.webp b/docs/static/screenshots/Bars/horizontal-gradient-dark-400w.webp index e3f156091c..51a5b09aec 100644 Binary files a/docs/static/screenshots/Bars/horizontal-gradient-dark-400w.webp and b/docs/static/screenshots/Bars/horizontal-gradient-dark-400w.webp differ diff --git a/docs/static/screenshots/Bars/horizontal-gradient-dark-800w.webp b/docs/static/screenshots/Bars/horizontal-gradient-dark-800w.webp index d09ce8363d..245e92652f 100644 Binary files a/docs/static/screenshots/Bars/horizontal-gradient-dark-800w.webp and b/docs/static/screenshots/Bars/horizontal-gradient-dark-800w.webp differ diff --git a/docs/static/screenshots/Bars/horizontal-gradient-light-240w.webp b/docs/static/screenshots/Bars/horizontal-gradient-light-240w.webp index b519327f55..03dfc5851f 100644 Binary files a/docs/static/screenshots/Bars/horizontal-gradient-light-240w.webp and b/docs/static/screenshots/Bars/horizontal-gradient-light-240w.webp differ diff --git a/docs/static/screenshots/Bars/horizontal-gradient-light-400w.webp b/docs/static/screenshots/Bars/horizontal-gradient-light-400w.webp index e433fa41ef..6068ffc3d2 100644 Binary files a/docs/static/screenshots/Bars/horizontal-gradient-light-400w.webp and b/docs/static/screenshots/Bars/horizontal-gradient-light-400w.webp differ diff --git a/docs/static/screenshots/Bars/horizontal-gradient-light-800w.webp b/docs/static/screenshots/Bars/horizontal-gradient-light-800w.webp index 27a7a8bbf3..c66ad54f30 100644 Binary files a/docs/static/screenshots/Bars/horizontal-gradient-light-800w.webp and b/docs/static/screenshots/Bars/horizontal-gradient-light-800w.webp differ diff --git a/docs/static/screenshots/Bars/horizontal-grouped-and-stacked-dark-240w.webp b/docs/static/screenshots/Bars/horizontal-grouped-and-stacked-dark-240w.webp index c04e7d0ea5..4bfa45b6b5 100644 Binary files a/docs/static/screenshots/Bars/horizontal-grouped-and-stacked-dark-240w.webp and b/docs/static/screenshots/Bars/horizontal-grouped-and-stacked-dark-240w.webp differ diff --git a/docs/static/screenshots/Bars/horizontal-grouped-and-stacked-dark-800w.webp b/docs/static/screenshots/Bars/horizontal-grouped-and-stacked-dark-800w.webp index 6a1b329b61..a942e8cdb0 100644 Binary files a/docs/static/screenshots/Bars/horizontal-grouped-and-stacked-dark-800w.webp and b/docs/static/screenshots/Bars/horizontal-grouped-and-stacked-dark-800w.webp differ diff --git a/docs/static/screenshots/Bars/horizontal-highlight-individual-bar-dark-240w.webp b/docs/static/screenshots/Bars/horizontal-highlight-individual-bar-dark-240w.webp index 4495d764b7..4ebbad29ec 100644 Binary files a/docs/static/screenshots/Bars/horizontal-highlight-individual-bar-dark-240w.webp and b/docs/static/screenshots/Bars/horizontal-highlight-individual-bar-dark-240w.webp differ diff --git a/docs/static/screenshots/Bars/horizontal-highlight-individual-bar-dark-400w.webp b/docs/static/screenshots/Bars/horizontal-highlight-individual-bar-dark-400w.webp index 71a7823af0..f5b108d6de 100644 Binary files a/docs/static/screenshots/Bars/horizontal-highlight-individual-bar-dark-400w.webp and b/docs/static/screenshots/Bars/horizontal-highlight-individual-bar-dark-400w.webp differ diff --git a/docs/static/screenshots/Bars/horizontal-highlight-individual-bar-dark-800w.webp b/docs/static/screenshots/Bars/horizontal-highlight-individual-bar-dark-800w.webp index 701e30b66f..8571e4ae3f 100644 Binary files a/docs/static/screenshots/Bars/horizontal-highlight-individual-bar-dark-800w.webp and b/docs/static/screenshots/Bars/horizontal-highlight-individual-bar-dark-800w.webp differ diff --git a/docs/static/screenshots/Bars/horizontal-highlight-individual-bar-light-240w.webp b/docs/static/screenshots/Bars/horizontal-highlight-individual-bar-light-240w.webp index 1c092c87fe..dcc682c00a 100644 Binary files a/docs/static/screenshots/Bars/horizontal-highlight-individual-bar-light-240w.webp and b/docs/static/screenshots/Bars/horizontal-highlight-individual-bar-light-240w.webp differ diff --git a/docs/static/screenshots/Bars/horizontal-highlight-individual-bar-light-400w.webp b/docs/static/screenshots/Bars/horizontal-highlight-individual-bar-light-400w.webp index 441a0713f8..db80fc45f5 100644 Binary files a/docs/static/screenshots/Bars/horizontal-highlight-individual-bar-light-400w.webp and b/docs/static/screenshots/Bars/horizontal-highlight-individual-bar-light-400w.webp differ diff --git a/docs/static/screenshots/Bars/horizontal-highlight-individual-bar-light-800w.webp b/docs/static/screenshots/Bars/horizontal-highlight-individual-bar-light-800w.webp index 752af9db86..0e708c8ce2 100644 Binary files a/docs/static/screenshots/Bars/horizontal-highlight-individual-bar-light-800w.webp and b/docs/static/screenshots/Bars/horizontal-highlight-individual-bar-light-800w.webp differ diff --git a/docs/static/screenshots/Bars/horizontal-highlight-individual-bar-line-dark-240w.webp b/docs/static/screenshots/Bars/horizontal-highlight-individual-bar-line-dark-240w.webp index 4877790abe..d1c1a62d2a 100644 Binary files a/docs/static/screenshots/Bars/horizontal-highlight-individual-bar-line-dark-240w.webp and b/docs/static/screenshots/Bars/horizontal-highlight-individual-bar-line-dark-240w.webp differ diff --git a/docs/static/screenshots/Bars/horizontal-highlight-individual-bar-line-dark-400w.webp b/docs/static/screenshots/Bars/horizontal-highlight-individual-bar-line-dark-400w.webp index fb625b182b..2ce6c95628 100644 Binary files a/docs/static/screenshots/Bars/horizontal-highlight-individual-bar-line-dark-400w.webp and b/docs/static/screenshots/Bars/horizontal-highlight-individual-bar-line-dark-400w.webp differ diff --git a/docs/static/screenshots/Bars/horizontal-highlight-individual-bar-line-dark-800w.webp b/docs/static/screenshots/Bars/horizontal-highlight-individual-bar-line-dark-800w.webp index 15d0e533c2..3713e176e5 100644 Binary files a/docs/static/screenshots/Bars/horizontal-highlight-individual-bar-line-dark-800w.webp and b/docs/static/screenshots/Bars/horizontal-highlight-individual-bar-line-dark-800w.webp differ diff --git a/docs/static/screenshots/Bars/horizontal-highlight-individual-bar-line-light-240w.webp b/docs/static/screenshots/Bars/horizontal-highlight-individual-bar-line-light-240w.webp index ed33f38025..57ae40446e 100644 Binary files a/docs/static/screenshots/Bars/horizontal-highlight-individual-bar-line-light-240w.webp and b/docs/static/screenshots/Bars/horizontal-highlight-individual-bar-line-light-240w.webp differ diff --git a/docs/static/screenshots/Bars/horizontal-highlight-individual-bar-line-light-400w.webp b/docs/static/screenshots/Bars/horizontal-highlight-individual-bar-line-light-400w.webp index 65c087a4d4..63136e8d5f 100644 Binary files a/docs/static/screenshots/Bars/horizontal-highlight-individual-bar-line-light-400w.webp and b/docs/static/screenshots/Bars/horizontal-highlight-individual-bar-line-light-400w.webp differ diff --git a/docs/static/screenshots/Bars/horizontal-highlight-individual-bar-line-light-800w.webp b/docs/static/screenshots/Bars/horizontal-highlight-individual-bar-line-light-800w.webp index b9fe2902e5..ad6e0ccda3 100644 Binary files a/docs/static/screenshots/Bars/horizontal-highlight-individual-bar-line-light-800w.webp and b/docs/static/screenshots/Bars/horizontal-highlight-individual-bar-line-light-800w.webp differ diff --git a/docs/static/screenshots/Bars/horizontal-inside-labels-dark-240w.webp b/docs/static/screenshots/Bars/horizontal-inside-labels-dark-240w.webp index 2c5725732e..e3c79b601a 100644 Binary files a/docs/static/screenshots/Bars/horizontal-inside-labels-dark-240w.webp and b/docs/static/screenshots/Bars/horizontal-inside-labels-dark-240w.webp differ diff --git a/docs/static/screenshots/Bars/horizontal-inside-labels-dark-400w.webp b/docs/static/screenshots/Bars/horizontal-inside-labels-dark-400w.webp index 19965494e5..c04d92f246 100644 Binary files a/docs/static/screenshots/Bars/horizontal-inside-labels-dark-400w.webp and b/docs/static/screenshots/Bars/horizontal-inside-labels-dark-400w.webp differ diff --git a/docs/static/screenshots/Bars/horizontal-inside-labels-dark-800w.webp b/docs/static/screenshots/Bars/horizontal-inside-labels-dark-800w.webp index e14e723074..2dafcc3847 100644 Binary files a/docs/static/screenshots/Bars/horizontal-inside-labels-dark-800w.webp and b/docs/static/screenshots/Bars/horizontal-inside-labels-dark-800w.webp differ diff --git a/docs/static/screenshots/Bars/horizontal-inside-labels-light-240w.webp b/docs/static/screenshots/Bars/horizontal-inside-labels-light-240w.webp index b1398fc39c..7adbd0ca7b 100644 Binary files a/docs/static/screenshots/Bars/horizontal-inside-labels-light-240w.webp and b/docs/static/screenshots/Bars/horizontal-inside-labels-light-240w.webp differ diff --git a/docs/static/screenshots/Bars/horizontal-inside-labels-light-400w.webp b/docs/static/screenshots/Bars/horizontal-inside-labels-light-400w.webp index 741e7808fe..5f54313fa7 100644 Binary files a/docs/static/screenshots/Bars/horizontal-inside-labels-light-400w.webp and b/docs/static/screenshots/Bars/horizontal-inside-labels-light-400w.webp differ diff --git a/docs/static/screenshots/Bars/horizontal-inside-labels-light-800w.webp b/docs/static/screenshots/Bars/horizontal-inside-labels-light-800w.webp index aad67eb31f..121e846d17 100644 Binary files a/docs/static/screenshots/Bars/horizontal-inside-labels-light-800w.webp and b/docs/static/screenshots/Bars/horizontal-inside-labels-light-800w.webp differ diff --git a/docs/static/screenshots/Bars/horizontal-limit-ticks-count-dark-240w.webp b/docs/static/screenshots/Bars/horizontal-limit-ticks-count-dark-240w.webp index 5416c78867..8f92ce84bf 100644 Binary files a/docs/static/screenshots/Bars/horizontal-limit-ticks-count-dark-240w.webp and b/docs/static/screenshots/Bars/horizontal-limit-ticks-count-dark-240w.webp differ diff --git a/docs/static/screenshots/Bars/horizontal-limit-ticks-count-dark-400w.webp b/docs/static/screenshots/Bars/horizontal-limit-ticks-count-dark-400w.webp index d05290bab6..4cec25c494 100644 Binary files a/docs/static/screenshots/Bars/horizontal-limit-ticks-count-dark-400w.webp and b/docs/static/screenshots/Bars/horizontal-limit-ticks-count-dark-400w.webp differ diff --git a/docs/static/screenshots/Bars/horizontal-limit-ticks-count-dark-800w.webp b/docs/static/screenshots/Bars/horizontal-limit-ticks-count-dark-800w.webp index 5e231a5a2c..9788dca89f 100644 Binary files a/docs/static/screenshots/Bars/horizontal-limit-ticks-count-dark-800w.webp and b/docs/static/screenshots/Bars/horizontal-limit-ticks-count-dark-800w.webp differ diff --git a/docs/static/screenshots/Bars/horizontal-limit-ticks-count-light-240w.webp b/docs/static/screenshots/Bars/horizontal-limit-ticks-count-light-240w.webp index 76f9622397..22721542f1 100644 Binary files a/docs/static/screenshots/Bars/horizontal-limit-ticks-count-light-240w.webp and b/docs/static/screenshots/Bars/horizontal-limit-ticks-count-light-240w.webp differ diff --git a/docs/static/screenshots/Bars/horizontal-limit-ticks-count-light-400w.webp b/docs/static/screenshots/Bars/horizontal-limit-ticks-count-light-400w.webp index f88c5436d6..458839f83b 100644 Binary files a/docs/static/screenshots/Bars/horizontal-limit-ticks-count-light-400w.webp and b/docs/static/screenshots/Bars/horizontal-limit-ticks-count-light-400w.webp differ diff --git a/docs/static/screenshots/Bars/horizontal-limit-ticks-count-light-800w.webp b/docs/static/screenshots/Bars/horizontal-limit-ticks-count-light-800w.webp index 093e6c6109..0f4762f673 100644 Binary files a/docs/static/screenshots/Bars/horizontal-limit-ticks-count-light-800w.webp and b/docs/static/screenshots/Bars/horizontal-limit-ticks-count-light-800w.webp differ diff --git a/docs/static/screenshots/Bars/horizontal-limit-ticks-second-scale-dark-240w.webp b/docs/static/screenshots/Bars/horizontal-limit-ticks-second-scale-dark-240w.webp index 585d54508f..d65e1f5996 100644 Binary files a/docs/static/screenshots/Bars/horizontal-limit-ticks-second-scale-dark-240w.webp and b/docs/static/screenshots/Bars/horizontal-limit-ticks-second-scale-dark-240w.webp differ diff --git a/docs/static/screenshots/Bars/horizontal-limit-ticks-second-scale-dark-400w.webp b/docs/static/screenshots/Bars/horizontal-limit-ticks-second-scale-dark-400w.webp index f5cee1accd..acd6ba50c7 100644 Binary files a/docs/static/screenshots/Bars/horizontal-limit-ticks-second-scale-dark-400w.webp and b/docs/static/screenshots/Bars/horizontal-limit-ticks-second-scale-dark-400w.webp differ diff --git a/docs/static/screenshots/Bars/horizontal-limit-ticks-second-scale-dark-800w.webp b/docs/static/screenshots/Bars/horizontal-limit-ticks-second-scale-dark-800w.webp index 2feaa7dfe7..5df66c51a0 100644 Binary files a/docs/static/screenshots/Bars/horizontal-limit-ticks-second-scale-dark-800w.webp and b/docs/static/screenshots/Bars/horizontal-limit-ticks-second-scale-dark-800w.webp differ diff --git a/docs/static/screenshots/Bars/horizontal-limit-ticks-second-scale-light-240w.webp b/docs/static/screenshots/Bars/horizontal-limit-ticks-second-scale-light-240w.webp index c75932d307..f86be6f41f 100644 Binary files a/docs/static/screenshots/Bars/horizontal-limit-ticks-second-scale-light-240w.webp and b/docs/static/screenshots/Bars/horizontal-limit-ticks-second-scale-light-240w.webp differ diff --git a/docs/static/screenshots/Bars/horizontal-limit-ticks-second-scale-light-400w.webp b/docs/static/screenshots/Bars/horizontal-limit-ticks-second-scale-light-400w.webp index 704604c7e3..a4c855cb22 100644 Binary files a/docs/static/screenshots/Bars/horizontal-limit-ticks-second-scale-light-400w.webp and b/docs/static/screenshots/Bars/horizontal-limit-ticks-second-scale-light-400w.webp differ diff --git a/docs/static/screenshots/Bars/horizontal-limit-ticks-second-scale-light-800w.webp b/docs/static/screenshots/Bars/horizontal-limit-ticks-second-scale-light-800w.webp index 63253f02e0..f63c2026a1 100644 Binary files a/docs/static/screenshots/Bars/horizontal-limit-ticks-second-scale-light-800w.webp and b/docs/static/screenshots/Bars/horizontal-limit-ticks-second-scale-light-800w.webp differ diff --git a/docs/static/screenshots/Bars/horizontal-multiple-diverging-dark-240w.webp b/docs/static/screenshots/Bars/horizontal-multiple-diverging-dark-240w.webp index 5b1b6a3c5b..63b536263b 100644 Binary files a/docs/static/screenshots/Bars/horizontal-multiple-diverging-dark-240w.webp and b/docs/static/screenshots/Bars/horizontal-multiple-diverging-dark-240w.webp differ diff --git a/docs/static/screenshots/Bars/horizontal-multiple-diverging-dark-400w.webp b/docs/static/screenshots/Bars/horizontal-multiple-diverging-dark-400w.webp index 1b6247e13d..cdb7edb4f9 100644 Binary files a/docs/static/screenshots/Bars/horizontal-multiple-diverging-dark-400w.webp and b/docs/static/screenshots/Bars/horizontal-multiple-diverging-dark-400w.webp differ diff --git a/docs/static/screenshots/Bars/horizontal-multiple-diverging-dark-800w.webp b/docs/static/screenshots/Bars/horizontal-multiple-diverging-dark-800w.webp index 45f4dbf9f2..2060faf4a6 100644 Binary files a/docs/static/screenshots/Bars/horizontal-multiple-diverging-dark-800w.webp and b/docs/static/screenshots/Bars/horizontal-multiple-diverging-dark-800w.webp differ diff --git a/docs/static/screenshots/Bars/horizontal-multiple-diverging-light-240w.webp b/docs/static/screenshots/Bars/horizontal-multiple-diverging-light-240w.webp index 632660b3c2..2da575e7c7 100644 Binary files a/docs/static/screenshots/Bars/horizontal-multiple-diverging-light-240w.webp and b/docs/static/screenshots/Bars/horizontal-multiple-diverging-light-240w.webp differ diff --git a/docs/static/screenshots/Bars/horizontal-multiple-diverging-light-400w.webp b/docs/static/screenshots/Bars/horizontal-multiple-diverging-light-400w.webp index 8f9aeed8d7..4a4c319750 100644 Binary files a/docs/static/screenshots/Bars/horizontal-multiple-diverging-light-400w.webp and b/docs/static/screenshots/Bars/horizontal-multiple-diverging-light-400w.webp differ diff --git a/docs/static/screenshots/Bars/horizontal-multiple-diverging-light-800w.webp b/docs/static/screenshots/Bars/horizontal-multiple-diverging-light-800w.webp index 508b9f95d7..00996e2bd8 100644 Binary files a/docs/static/screenshots/Bars/horizontal-multiple-diverging-light-800w.webp and b/docs/static/screenshots/Bars/horizontal-multiple-diverging-light-800w.webp differ diff --git a/docs/static/screenshots/Bars/horizontal-multiple-overlapping-dark-240w.webp b/docs/static/screenshots/Bars/horizontal-multiple-overlapping-dark-240w.webp index 79cd86d5da..44b91f3444 100644 Binary files a/docs/static/screenshots/Bars/horizontal-multiple-overlapping-dark-240w.webp and b/docs/static/screenshots/Bars/horizontal-multiple-overlapping-dark-240w.webp differ diff --git a/docs/static/screenshots/Bars/horizontal-multiple-overlapping-dark-400w.webp b/docs/static/screenshots/Bars/horizontal-multiple-overlapping-dark-400w.webp index d796554fcf..8f3415148f 100644 Binary files a/docs/static/screenshots/Bars/horizontal-multiple-overlapping-dark-400w.webp and b/docs/static/screenshots/Bars/horizontal-multiple-overlapping-dark-400w.webp differ diff --git a/docs/static/screenshots/Bars/horizontal-multiple-overlapping-dark-800w.webp b/docs/static/screenshots/Bars/horizontal-multiple-overlapping-dark-800w.webp index 017557f758..ef9e2f23c5 100644 Binary files a/docs/static/screenshots/Bars/horizontal-multiple-overlapping-dark-800w.webp and b/docs/static/screenshots/Bars/horizontal-multiple-overlapping-dark-800w.webp differ diff --git a/docs/static/screenshots/Bars/horizontal-multiple-overlapping-light-240w.webp b/docs/static/screenshots/Bars/horizontal-multiple-overlapping-light-240w.webp index f0fa44af26..aebd387ea0 100644 Binary files a/docs/static/screenshots/Bars/horizontal-multiple-overlapping-light-240w.webp and b/docs/static/screenshots/Bars/horizontal-multiple-overlapping-light-240w.webp differ diff --git a/docs/static/screenshots/Bars/horizontal-multiple-overlapping-light-400w.webp b/docs/static/screenshots/Bars/horizontal-multiple-overlapping-light-400w.webp index 61c7f03f57..eb279883c6 100644 Binary files a/docs/static/screenshots/Bars/horizontal-multiple-overlapping-light-400w.webp and b/docs/static/screenshots/Bars/horizontal-multiple-overlapping-light-400w.webp differ diff --git a/docs/static/screenshots/Bars/horizontal-multiple-overlapping-light-800w.webp b/docs/static/screenshots/Bars/horizontal-multiple-overlapping-light-800w.webp index 0647fc85ce..5a4198d0c0 100644 Binary files a/docs/static/screenshots/Bars/horizontal-multiple-overlapping-light-800w.webp and b/docs/static/screenshots/Bars/horizontal-multiple-overlapping-light-800w.webp differ diff --git a/docs/static/screenshots/Bars/horizontal-outside-labels-default-dark-240w.webp b/docs/static/screenshots/Bars/horizontal-outside-labels-default-dark-240w.webp index 925b027c82..8312188792 100644 Binary files a/docs/static/screenshots/Bars/horizontal-outside-labels-default-dark-240w.webp and b/docs/static/screenshots/Bars/horizontal-outside-labels-default-dark-240w.webp differ diff --git a/docs/static/screenshots/Bars/horizontal-outside-labels-default-dark-400w.webp b/docs/static/screenshots/Bars/horizontal-outside-labels-default-dark-400w.webp index 167ac7ae92..f82c0e6fbc 100644 Binary files a/docs/static/screenshots/Bars/horizontal-outside-labels-default-dark-400w.webp and b/docs/static/screenshots/Bars/horizontal-outside-labels-default-dark-400w.webp differ diff --git a/docs/static/screenshots/Bars/horizontal-outside-labels-default-dark-800w.webp b/docs/static/screenshots/Bars/horizontal-outside-labels-default-dark-800w.webp index b435d5c9ee..5929234356 100644 Binary files a/docs/static/screenshots/Bars/horizontal-outside-labels-default-dark-800w.webp and b/docs/static/screenshots/Bars/horizontal-outside-labels-default-dark-800w.webp differ diff --git a/docs/static/screenshots/Bars/horizontal-outside-labels-default-light-240w.webp b/docs/static/screenshots/Bars/horizontal-outside-labels-default-light-240w.webp index 93f49a2c9a..a12428b9f9 100644 Binary files a/docs/static/screenshots/Bars/horizontal-outside-labels-default-light-240w.webp and b/docs/static/screenshots/Bars/horizontal-outside-labels-default-light-240w.webp differ diff --git a/docs/static/screenshots/Bars/horizontal-outside-labels-default-light-400w.webp b/docs/static/screenshots/Bars/horizontal-outside-labels-default-light-400w.webp index 4cb02c0a73..b98d7bc07b 100644 Binary files a/docs/static/screenshots/Bars/horizontal-outside-labels-default-light-400w.webp and b/docs/static/screenshots/Bars/horizontal-outside-labels-default-light-400w.webp differ diff --git a/docs/static/screenshots/Bars/horizontal-outside-labels-default-light-800w.webp b/docs/static/screenshots/Bars/horizontal-outside-labels-default-light-800w.webp index c36dbdad0c..e2f272b324 100644 Binary files a/docs/static/screenshots/Bars/horizontal-outside-labels-default-light-800w.webp and b/docs/static/screenshots/Bars/horizontal-outside-labels-default-light-800w.webp differ diff --git a/docs/static/screenshots/Bars/horizontal-rounded-right-only-dark-240w.webp b/docs/static/screenshots/Bars/horizontal-rounded-right-only-dark-240w.webp index 4498832bbb..b1029a2999 100644 Binary files a/docs/static/screenshots/Bars/horizontal-rounded-right-only-dark-240w.webp and b/docs/static/screenshots/Bars/horizontal-rounded-right-only-dark-240w.webp differ diff --git a/docs/static/screenshots/Bars/horizontal-rounded-right-only-dark-400w.webp b/docs/static/screenshots/Bars/horizontal-rounded-right-only-dark-400w.webp index e96517cb52..228adc30dd 100644 Binary files a/docs/static/screenshots/Bars/horizontal-rounded-right-only-dark-400w.webp and b/docs/static/screenshots/Bars/horizontal-rounded-right-only-dark-400w.webp differ diff --git a/docs/static/screenshots/Bars/horizontal-rounded-right-only-dark-800w.webp b/docs/static/screenshots/Bars/horizontal-rounded-right-only-dark-800w.webp index 9f3637058f..9681259a9f 100644 Binary files a/docs/static/screenshots/Bars/horizontal-rounded-right-only-dark-800w.webp and b/docs/static/screenshots/Bars/horizontal-rounded-right-only-dark-800w.webp differ diff --git a/docs/static/screenshots/Bars/horizontal-rounded-right-only-light-240w.webp b/docs/static/screenshots/Bars/horizontal-rounded-right-only-light-240w.webp index d9a653ddd3..ed8e19e596 100644 Binary files a/docs/static/screenshots/Bars/horizontal-rounded-right-only-light-240w.webp and b/docs/static/screenshots/Bars/horizontal-rounded-right-only-light-240w.webp differ diff --git a/docs/static/screenshots/Bars/horizontal-rounded-right-only-light-400w.webp b/docs/static/screenshots/Bars/horizontal-rounded-right-only-light-400w.webp index 5ea92aaad9..b7f2562f9e 100644 Binary files a/docs/static/screenshots/Bars/horizontal-rounded-right-only-light-400w.webp and b/docs/static/screenshots/Bars/horizontal-rounded-right-only-light-400w.webp differ diff --git a/docs/static/screenshots/Bars/horizontal-rounded-right-only-light-800w.webp b/docs/static/screenshots/Bars/horizontal-rounded-right-only-light-800w.webp index 45e56e6aad..4ae64a9525 100644 Binary files a/docs/static/screenshots/Bars/horizontal-rounded-right-only-light-800w.webp and b/docs/static/screenshots/Bars/horizontal-rounded-right-only-light-800w.webp differ diff --git a/docs/static/screenshots/Bars/horizontal-stacked-percent-dark-240w.webp b/docs/static/screenshots/Bars/horizontal-stacked-percent-dark-240w.webp index 9e310a545d..685ed27860 100644 Binary files a/docs/static/screenshots/Bars/horizontal-stacked-percent-dark-240w.webp and b/docs/static/screenshots/Bars/horizontal-stacked-percent-dark-240w.webp differ diff --git a/docs/static/screenshots/Bars/horizontal-stacked-percent-dark-400w.webp b/docs/static/screenshots/Bars/horizontal-stacked-percent-dark-400w.webp index 75a4af4492..f8d31b82e6 100644 Binary files a/docs/static/screenshots/Bars/horizontal-stacked-percent-dark-400w.webp and b/docs/static/screenshots/Bars/horizontal-stacked-percent-dark-400w.webp differ diff --git a/docs/static/screenshots/Bars/horizontal-stacked-percent-dark-800w.webp b/docs/static/screenshots/Bars/horizontal-stacked-percent-dark-800w.webp index e3760c3993..70e8125229 100644 Binary files a/docs/static/screenshots/Bars/horizontal-stacked-percent-dark-800w.webp and b/docs/static/screenshots/Bars/horizontal-stacked-percent-dark-800w.webp differ diff --git a/docs/static/screenshots/Bars/horizontal-stagger-tween-on-mount-dark-240w.webp b/docs/static/screenshots/Bars/horizontal-stagger-tween-on-mount-dark-240w.webp index 4aeb14a34e..131fdd7149 100644 Binary files a/docs/static/screenshots/Bars/horizontal-stagger-tween-on-mount-dark-240w.webp and b/docs/static/screenshots/Bars/horizontal-stagger-tween-on-mount-dark-240w.webp differ diff --git a/docs/static/screenshots/Bars/horizontal-stagger-tween-on-mount-dark-400w.webp b/docs/static/screenshots/Bars/horizontal-stagger-tween-on-mount-dark-400w.webp index a9d5d147a8..87f1152ab4 100644 Binary files a/docs/static/screenshots/Bars/horizontal-stagger-tween-on-mount-dark-400w.webp and b/docs/static/screenshots/Bars/horizontal-stagger-tween-on-mount-dark-400w.webp differ diff --git a/docs/static/screenshots/Bars/horizontal-stagger-tween-on-mount-dark-800w.webp b/docs/static/screenshots/Bars/horizontal-stagger-tween-on-mount-dark-800w.webp index 37e37fbd05..9602f97106 100644 Binary files a/docs/static/screenshots/Bars/horizontal-stagger-tween-on-mount-dark-800w.webp and b/docs/static/screenshots/Bars/horizontal-stagger-tween-on-mount-dark-800w.webp differ diff --git a/docs/static/screenshots/Bars/horizontal-stagger-tween-on-mount-light-240w.webp b/docs/static/screenshots/Bars/horizontal-stagger-tween-on-mount-light-240w.webp index ae14b468a2..b3036eb157 100644 Binary files a/docs/static/screenshots/Bars/horizontal-stagger-tween-on-mount-light-240w.webp and b/docs/static/screenshots/Bars/horizontal-stagger-tween-on-mount-light-240w.webp differ diff --git a/docs/static/screenshots/Bars/horizontal-stagger-tween-on-mount-light-400w.webp b/docs/static/screenshots/Bars/horizontal-stagger-tween-on-mount-light-400w.webp index fed1440c4a..02a1e9b5a4 100644 Binary files a/docs/static/screenshots/Bars/horizontal-stagger-tween-on-mount-light-400w.webp and b/docs/static/screenshots/Bars/horizontal-stagger-tween-on-mount-light-400w.webp differ diff --git a/docs/static/screenshots/Bars/horizontal-stagger-tween-on-mount-light-800w.webp b/docs/static/screenshots/Bars/horizontal-stagger-tween-on-mount-light-800w.webp index 596e363b9a..e46a1711ca 100644 Binary files a/docs/static/screenshots/Bars/horizontal-stagger-tween-on-mount-light-800w.webp and b/docs/static/screenshots/Bars/horizontal-stagger-tween-on-mount-light-800w.webp differ diff --git a/docs/static/screenshots/Bars/horizontal-time-scale-with-inset-dark-240w.webp b/docs/static/screenshots/Bars/horizontal-time-scale-with-inset-dark-240w.webp index bcc000935d..da7b8596e3 100644 Binary files a/docs/static/screenshots/Bars/horizontal-time-scale-with-inset-dark-240w.webp and b/docs/static/screenshots/Bars/horizontal-time-scale-with-inset-dark-240w.webp differ diff --git a/docs/static/screenshots/Bars/horizontal-time-scale-with-inset-dark-400w.webp b/docs/static/screenshots/Bars/horizontal-time-scale-with-inset-dark-400w.webp index 233c6d4b7e..0a92afb122 100644 Binary files a/docs/static/screenshots/Bars/horizontal-time-scale-with-inset-dark-400w.webp and b/docs/static/screenshots/Bars/horizontal-time-scale-with-inset-dark-400w.webp differ diff --git a/docs/static/screenshots/Bars/horizontal-time-scale-with-inset-dark-800w.webp b/docs/static/screenshots/Bars/horizontal-time-scale-with-inset-dark-800w.webp index d8470b70df..2118bc8635 100644 Binary files a/docs/static/screenshots/Bars/horizontal-time-scale-with-inset-dark-800w.webp and b/docs/static/screenshots/Bars/horizontal-time-scale-with-inset-dark-800w.webp differ diff --git a/docs/static/screenshots/Bars/horizontal-time-scale-with-inset-light-240w.webp b/docs/static/screenshots/Bars/horizontal-time-scale-with-inset-light-240w.webp index 3c98d69bff..5dad06a6b6 100644 Binary files a/docs/static/screenshots/Bars/horizontal-time-scale-with-inset-light-240w.webp and b/docs/static/screenshots/Bars/horizontal-time-scale-with-inset-light-240w.webp differ diff --git a/docs/static/screenshots/Bars/horizontal-time-scale-with-inset-light-400w.webp b/docs/static/screenshots/Bars/horizontal-time-scale-with-inset-light-400w.webp index 65d4a9c2db..341cb0eee0 100644 Binary files a/docs/static/screenshots/Bars/horizontal-time-scale-with-inset-light-400w.webp and b/docs/static/screenshots/Bars/horizontal-time-scale-with-inset-light-400w.webp differ diff --git a/docs/static/screenshots/Bars/horizontal-time-scale-with-inset-light-800w.webp b/docs/static/screenshots/Bars/horizontal-time-scale-with-inset-light-800w.webp index 4b6277d0f6..eb46f20824 100644 Binary files a/docs/static/screenshots/Bars/horizontal-time-scale-with-inset-light-800w.webp and b/docs/static/screenshots/Bars/horizontal-time-scale-with-inset-light-800w.webp differ diff --git a/docs/static/screenshots/Bars/horizontal-time-scale-with-interval-dark-240w.webp b/docs/static/screenshots/Bars/horizontal-time-scale-with-interval-dark-240w.webp index d9da1a2ec7..95ea43cd1a 100644 Binary files a/docs/static/screenshots/Bars/horizontal-time-scale-with-interval-dark-240w.webp and b/docs/static/screenshots/Bars/horizontal-time-scale-with-interval-dark-240w.webp differ diff --git a/docs/static/screenshots/Bars/horizontal-time-scale-with-interval-dark-400w.webp b/docs/static/screenshots/Bars/horizontal-time-scale-with-interval-dark-400w.webp index 2d940979ce..08a7113bf5 100644 Binary files a/docs/static/screenshots/Bars/horizontal-time-scale-with-interval-dark-400w.webp and b/docs/static/screenshots/Bars/horizontal-time-scale-with-interval-dark-400w.webp differ diff --git a/docs/static/screenshots/Bars/horizontal-time-scale-with-interval-dark-800w.webp b/docs/static/screenshots/Bars/horizontal-time-scale-with-interval-dark-800w.webp index d1c1452bb7..9410a8bfa9 100644 Binary files a/docs/static/screenshots/Bars/horizontal-time-scale-with-interval-dark-800w.webp and b/docs/static/screenshots/Bars/horizontal-time-scale-with-interval-dark-800w.webp differ diff --git a/docs/static/screenshots/Bars/horizontal-time-scale-with-interval-light-240w.webp b/docs/static/screenshots/Bars/horizontal-time-scale-with-interval-light-240w.webp index 230dff8145..6b764014e1 100644 Binary files a/docs/static/screenshots/Bars/horizontal-time-scale-with-interval-light-240w.webp and b/docs/static/screenshots/Bars/horizontal-time-scale-with-interval-light-240w.webp differ diff --git a/docs/static/screenshots/Bars/horizontal-time-scale-with-interval-light-400w.webp b/docs/static/screenshots/Bars/horizontal-time-scale-with-interval-light-400w.webp index 2630b93c1a..73c7b52b33 100644 Binary files a/docs/static/screenshots/Bars/horizontal-time-scale-with-interval-light-400w.webp and b/docs/static/screenshots/Bars/horizontal-time-scale-with-interval-light-400w.webp differ diff --git a/docs/static/screenshots/Bars/horizontal-time-scale-with-interval-light-800w.webp b/docs/static/screenshots/Bars/horizontal-time-scale-with-interval-light-800w.webp index d38f73ba8b..d42609411b 100644 Binary files a/docs/static/screenshots/Bars/horizontal-time-scale-with-interval-light-800w.webp and b/docs/static/screenshots/Bars/horizontal-time-scale-with-interval-light-800w.webp differ diff --git a/docs/static/screenshots/Bars/horizontal-time-scale-with-missing-data-dark-240w.webp b/docs/static/screenshots/Bars/horizontal-time-scale-with-missing-data-dark-240w.webp index 75d60abf1c..44d2f0a7ec 100644 Binary files a/docs/static/screenshots/Bars/horizontal-time-scale-with-missing-data-dark-240w.webp and b/docs/static/screenshots/Bars/horizontal-time-scale-with-missing-data-dark-240w.webp differ diff --git a/docs/static/screenshots/Bars/horizontal-time-scale-with-missing-data-dark-400w.webp b/docs/static/screenshots/Bars/horizontal-time-scale-with-missing-data-dark-400w.webp index 742580fdd5..f943fa5ee8 100644 Binary files a/docs/static/screenshots/Bars/horizontal-time-scale-with-missing-data-dark-400w.webp and b/docs/static/screenshots/Bars/horizontal-time-scale-with-missing-data-dark-400w.webp differ diff --git a/docs/static/screenshots/Bars/horizontal-time-scale-with-missing-data-dark-800w.webp b/docs/static/screenshots/Bars/horizontal-time-scale-with-missing-data-dark-800w.webp index e62ae58e43..0d489a7dd6 100644 Binary files a/docs/static/screenshots/Bars/horizontal-time-scale-with-missing-data-dark-800w.webp and b/docs/static/screenshots/Bars/horizontal-time-scale-with-missing-data-dark-800w.webp differ diff --git a/docs/static/screenshots/Bars/horizontal-time-scale-with-missing-data-light-240w.webp b/docs/static/screenshots/Bars/horizontal-time-scale-with-missing-data-light-240w.webp index 44430c8ad9..a3131e9776 100644 Binary files a/docs/static/screenshots/Bars/horizontal-time-scale-with-missing-data-light-240w.webp and b/docs/static/screenshots/Bars/horizontal-time-scale-with-missing-data-light-240w.webp differ diff --git a/docs/static/screenshots/Bars/horizontal-time-scale-with-missing-data-light-400w.webp b/docs/static/screenshots/Bars/horizontal-time-scale-with-missing-data-light-400w.webp index f0932bc86d..91ac62e821 100644 Binary files a/docs/static/screenshots/Bars/horizontal-time-scale-with-missing-data-light-400w.webp and b/docs/static/screenshots/Bars/horizontal-time-scale-with-missing-data-light-400w.webp differ diff --git a/docs/static/screenshots/Bars/horizontal-time-scale-with-missing-data-light-800w.webp b/docs/static/screenshots/Bars/horizontal-time-scale-with-missing-data-light-800w.webp index 3ae3e56917..add29ee78f 100644 Binary files a/docs/static/screenshots/Bars/horizontal-time-scale-with-missing-data-light-800w.webp and b/docs/static/screenshots/Bars/horizontal-time-scale-with-missing-data-light-800w.webp differ diff --git a/docs/static/screenshots/Bars/horizontal-tooltip-and-bar-highlight-dark-240w.webp b/docs/static/screenshots/Bars/horizontal-tooltip-and-bar-highlight-dark-240w.webp index c7148ee4c7..8a78725f0c 100644 Binary files a/docs/static/screenshots/Bars/horizontal-tooltip-and-bar-highlight-dark-240w.webp and b/docs/static/screenshots/Bars/horizontal-tooltip-and-bar-highlight-dark-240w.webp differ diff --git a/docs/static/screenshots/Bars/horizontal-tooltip-and-bar-highlight-dark-400w.webp b/docs/static/screenshots/Bars/horizontal-tooltip-and-bar-highlight-dark-400w.webp index 537439bc40..a95eea31d2 100644 Binary files a/docs/static/screenshots/Bars/horizontal-tooltip-and-bar-highlight-dark-400w.webp and b/docs/static/screenshots/Bars/horizontal-tooltip-and-bar-highlight-dark-400w.webp differ diff --git a/docs/static/screenshots/Bars/horizontal-tooltip-and-bar-highlight-dark-800w.webp b/docs/static/screenshots/Bars/horizontal-tooltip-and-bar-highlight-dark-800w.webp index 5e8df83c8a..ca1b3e89e7 100644 Binary files a/docs/static/screenshots/Bars/horizontal-tooltip-and-bar-highlight-dark-800w.webp and b/docs/static/screenshots/Bars/horizontal-tooltip-and-bar-highlight-dark-800w.webp differ diff --git a/docs/static/screenshots/Bars/horizontal-tooltip-and-bar-highlight-light-240w.webp b/docs/static/screenshots/Bars/horizontal-tooltip-and-bar-highlight-light-240w.webp index 01813dd0e3..6f7f60fbcc 100644 Binary files a/docs/static/screenshots/Bars/horizontal-tooltip-and-bar-highlight-light-240w.webp and b/docs/static/screenshots/Bars/horizontal-tooltip-and-bar-highlight-light-240w.webp differ diff --git a/docs/static/screenshots/Bars/horizontal-tooltip-and-bar-highlight-light-400w.webp b/docs/static/screenshots/Bars/horizontal-tooltip-and-bar-highlight-light-400w.webp index b49d63091a..e8686ef9f9 100644 Binary files a/docs/static/screenshots/Bars/horizontal-tooltip-and-bar-highlight-light-400w.webp and b/docs/static/screenshots/Bars/horizontal-tooltip-and-bar-highlight-light-400w.webp differ diff --git a/docs/static/screenshots/Bars/horizontal-tooltip-and-bar-highlight-light-800w.webp b/docs/static/screenshots/Bars/horizontal-tooltip-and-bar-highlight-light-800w.webp index 7fcf03c8a4..d595623937 100644 Binary files a/docs/static/screenshots/Bars/horizontal-tooltip-and-bar-highlight-light-800w.webp and b/docs/static/screenshots/Bars/horizontal-tooltip-and-bar-highlight-light-800w.webp differ diff --git a/docs/static/screenshots/Bars/horizontal-tooltip-and-clipped-highlight-dark-240w.webp b/docs/static/screenshots/Bars/horizontal-tooltip-and-clipped-highlight-dark-240w.webp index 2fa3714a0d..c45fd254d2 100644 Binary files a/docs/static/screenshots/Bars/horizontal-tooltip-and-clipped-highlight-dark-240w.webp and b/docs/static/screenshots/Bars/horizontal-tooltip-and-clipped-highlight-dark-240w.webp differ diff --git a/docs/static/screenshots/Bars/horizontal-tooltip-and-clipped-highlight-dark-400w.webp b/docs/static/screenshots/Bars/horizontal-tooltip-and-clipped-highlight-dark-400w.webp index 346c8a2308..55ab14c196 100644 Binary files a/docs/static/screenshots/Bars/horizontal-tooltip-and-clipped-highlight-dark-400w.webp and b/docs/static/screenshots/Bars/horizontal-tooltip-and-clipped-highlight-dark-400w.webp differ diff --git a/docs/static/screenshots/Bars/horizontal-tooltip-and-clipped-highlight-dark-800w.webp b/docs/static/screenshots/Bars/horizontal-tooltip-and-clipped-highlight-dark-800w.webp index 54fbc7b161..04873365ae 100644 Binary files a/docs/static/screenshots/Bars/horizontal-tooltip-and-clipped-highlight-dark-800w.webp and b/docs/static/screenshots/Bars/horizontal-tooltip-and-clipped-highlight-dark-800w.webp differ diff --git a/docs/static/screenshots/Bars/horizontal-tooltip-and-clipped-highlight-light-240w.webp b/docs/static/screenshots/Bars/horizontal-tooltip-and-clipped-highlight-light-240w.webp index d7c63e96c3..94cc39a05f 100644 Binary files a/docs/static/screenshots/Bars/horizontal-tooltip-and-clipped-highlight-light-240w.webp and b/docs/static/screenshots/Bars/horizontal-tooltip-and-clipped-highlight-light-240w.webp differ diff --git a/docs/static/screenshots/Bars/horizontal-tooltip-and-clipped-highlight-light-400w.webp b/docs/static/screenshots/Bars/horizontal-tooltip-and-clipped-highlight-light-400w.webp index d2a6c35a4b..aa8de4ba53 100644 Binary files a/docs/static/screenshots/Bars/horizontal-tooltip-and-clipped-highlight-light-400w.webp and b/docs/static/screenshots/Bars/horizontal-tooltip-and-clipped-highlight-light-400w.webp differ diff --git a/docs/static/screenshots/Bars/horizontal-tooltip-and-clipped-highlight-light-800w.webp b/docs/static/screenshots/Bars/horizontal-tooltip-and-clipped-highlight-light-800w.webp index 1fd9c10eda..360b184028 100644 Binary files a/docs/static/screenshots/Bars/horizontal-tooltip-and-clipped-highlight-light-800w.webp and b/docs/static/screenshots/Bars/horizontal-tooltip-and-clipped-highlight-light-800w.webp differ diff --git a/docs/static/screenshots/Bars/horizontal-tooltip-and-highlight-dark-240w.webp b/docs/static/screenshots/Bars/horizontal-tooltip-and-highlight-dark-240w.webp index 2891787855..0693bcaf33 100644 Binary files a/docs/static/screenshots/Bars/horizontal-tooltip-and-highlight-dark-240w.webp and b/docs/static/screenshots/Bars/horizontal-tooltip-and-highlight-dark-240w.webp differ diff --git a/docs/static/screenshots/Bars/horizontal-tooltip-and-highlight-dark-400w.webp b/docs/static/screenshots/Bars/horizontal-tooltip-and-highlight-dark-400w.webp index 1cf5a5f649..207f087250 100644 Binary files a/docs/static/screenshots/Bars/horizontal-tooltip-and-highlight-dark-400w.webp and b/docs/static/screenshots/Bars/horizontal-tooltip-and-highlight-dark-400w.webp differ diff --git a/docs/static/screenshots/Bars/horizontal-tooltip-and-highlight-dark-800w.webp b/docs/static/screenshots/Bars/horizontal-tooltip-and-highlight-dark-800w.webp index e9cc2cd87c..0e3d8ba645 100644 Binary files a/docs/static/screenshots/Bars/horizontal-tooltip-and-highlight-dark-800w.webp and b/docs/static/screenshots/Bars/horizontal-tooltip-and-highlight-dark-800w.webp differ diff --git a/docs/static/screenshots/Bars/horizontal-tooltip-and-highlight-light-240w.webp b/docs/static/screenshots/Bars/horizontal-tooltip-and-highlight-light-240w.webp index fbd9aee323..b4ba9ef67f 100644 Binary files a/docs/static/screenshots/Bars/horizontal-tooltip-and-highlight-light-240w.webp and b/docs/static/screenshots/Bars/horizontal-tooltip-and-highlight-light-240w.webp differ diff --git a/docs/static/screenshots/Bars/horizontal-tooltip-and-highlight-light-400w.webp b/docs/static/screenshots/Bars/horizontal-tooltip-and-highlight-light-400w.webp index bfb9c641a5..f2a9d3f3c7 100644 Binary files a/docs/static/screenshots/Bars/horizontal-tooltip-and-highlight-light-400w.webp and b/docs/static/screenshots/Bars/horizontal-tooltip-and-highlight-light-400w.webp differ diff --git a/docs/static/screenshots/Bars/horizontal-tooltip-and-highlight-light-800w.webp b/docs/static/screenshots/Bars/horizontal-tooltip-and-highlight-light-800w.webp index f5525b8375..d961d4ca13 100644 Binary files a/docs/static/screenshots/Bars/horizontal-tooltip-and-highlight-light-800w.webp and b/docs/static/screenshots/Bars/horizontal-tooltip-and-highlight-light-800w.webp differ diff --git a/docs/static/screenshots/Bars/horizontal-tween-on-mount-dark-240w.webp b/docs/static/screenshots/Bars/horizontal-tween-on-mount-dark-240w.webp index b5042f1db4..f6bb2aecdd 100644 Binary files a/docs/static/screenshots/Bars/horizontal-tween-on-mount-dark-240w.webp and b/docs/static/screenshots/Bars/horizontal-tween-on-mount-dark-240w.webp differ diff --git a/docs/static/screenshots/Bars/horizontal-tween-on-mount-dark-400w.webp b/docs/static/screenshots/Bars/horizontal-tween-on-mount-dark-400w.webp index 9955d746ae..6c2c452c4b 100644 Binary files a/docs/static/screenshots/Bars/horizontal-tween-on-mount-dark-400w.webp and b/docs/static/screenshots/Bars/horizontal-tween-on-mount-dark-400w.webp differ diff --git a/docs/static/screenshots/Bars/horizontal-tween-on-mount-dark-800w.webp b/docs/static/screenshots/Bars/horizontal-tween-on-mount-dark-800w.webp index ea435597bc..7971afd05a 100644 Binary files a/docs/static/screenshots/Bars/horizontal-tween-on-mount-dark-800w.webp and b/docs/static/screenshots/Bars/horizontal-tween-on-mount-dark-800w.webp differ diff --git a/docs/static/screenshots/Bars/horizontal-tween-on-mount-light-240w.webp b/docs/static/screenshots/Bars/horizontal-tween-on-mount-light-240w.webp index cccc166887..2e62f8e80b 100644 Binary files a/docs/static/screenshots/Bars/horizontal-tween-on-mount-light-240w.webp and b/docs/static/screenshots/Bars/horizontal-tween-on-mount-light-240w.webp differ diff --git a/docs/static/screenshots/Bars/horizontal-tween-on-mount-light-400w.webp b/docs/static/screenshots/Bars/horizontal-tween-on-mount-light-400w.webp index 676c40babe..c47f0441d3 100644 Binary files a/docs/static/screenshots/Bars/horizontal-tween-on-mount-light-400w.webp and b/docs/static/screenshots/Bars/horizontal-tween-on-mount-light-400w.webp differ diff --git a/docs/static/screenshots/Bars/horizontal-tween-on-mount-light-800w.webp b/docs/static/screenshots/Bars/horizontal-tween-on-mount-light-800w.webp index 66fc94a0c7..65267e24ed 100644 Binary files a/docs/static/screenshots/Bars/horizontal-tween-on-mount-light-800w.webp and b/docs/static/screenshots/Bars/horizontal-tween-on-mount-light-800w.webp differ diff --git a/docs/static/screenshots/Bars/horizontal-with-grid-on-top-dark-240w.webp b/docs/static/screenshots/Bars/horizontal-with-grid-on-top-dark-240w.webp index 70767139c3..e0db5c4e6b 100644 Binary files a/docs/static/screenshots/Bars/horizontal-with-grid-on-top-dark-240w.webp and b/docs/static/screenshots/Bars/horizontal-with-grid-on-top-dark-240w.webp differ diff --git a/docs/static/screenshots/Bars/horizontal-with-grid-on-top-dark-400w.webp b/docs/static/screenshots/Bars/horizontal-with-grid-on-top-dark-400w.webp index e5ff72b266..bae5caa05c 100644 Binary files a/docs/static/screenshots/Bars/horizontal-with-grid-on-top-dark-400w.webp and b/docs/static/screenshots/Bars/horizontal-with-grid-on-top-dark-400w.webp differ diff --git a/docs/static/screenshots/Bars/horizontal-with-grid-on-top-dark-800w.webp b/docs/static/screenshots/Bars/horizontal-with-grid-on-top-dark-800w.webp index dec8411b3c..293f32f9b7 100644 Binary files a/docs/static/screenshots/Bars/horizontal-with-grid-on-top-dark-800w.webp and b/docs/static/screenshots/Bars/horizontal-with-grid-on-top-dark-800w.webp differ diff --git a/docs/static/screenshots/Bars/horizontal-with-grid-on-top-light-240w.webp b/docs/static/screenshots/Bars/horizontal-with-grid-on-top-light-240w.webp index 79c6b6741d..c811162641 100644 Binary files a/docs/static/screenshots/Bars/horizontal-with-grid-on-top-light-240w.webp and b/docs/static/screenshots/Bars/horizontal-with-grid-on-top-light-240w.webp differ diff --git a/docs/static/screenshots/Bars/horizontal-with-grid-on-top-light-400w.webp b/docs/static/screenshots/Bars/horizontal-with-grid-on-top-light-400w.webp index ef4ade9134..6adcb56017 100644 Binary files a/docs/static/screenshots/Bars/horizontal-with-grid-on-top-light-400w.webp and b/docs/static/screenshots/Bars/horizontal-with-grid-on-top-light-400w.webp differ diff --git a/docs/static/screenshots/Bars/horizontal-with-grid-on-top-light-800w.webp b/docs/static/screenshots/Bars/horizontal-with-grid-on-top-light-800w.webp index 519d37ea9d..1e6505b7ed 100644 Binary files a/docs/static/screenshots/Bars/horizontal-with-grid-on-top-light-800w.webp and b/docs/static/screenshots/Bars/horizontal-with-grid-on-top-light-800w.webp differ diff --git a/docs/static/screenshots/Bars/horizontal-with-grid-on-top-mix-blend-dark-240w.webp b/docs/static/screenshots/Bars/horizontal-with-grid-on-top-mix-blend-dark-240w.webp index 4c7ca09c44..a3a36e4ba0 100644 Binary files a/docs/static/screenshots/Bars/horizontal-with-grid-on-top-mix-blend-dark-240w.webp and b/docs/static/screenshots/Bars/horizontal-with-grid-on-top-mix-blend-dark-240w.webp differ diff --git a/docs/static/screenshots/Bars/horizontal-with-grid-on-top-mix-blend-dark-400w.webp b/docs/static/screenshots/Bars/horizontal-with-grid-on-top-mix-blend-dark-400w.webp index dc302c9f82..bcb89c6131 100644 Binary files a/docs/static/screenshots/Bars/horizontal-with-grid-on-top-mix-blend-dark-400w.webp and b/docs/static/screenshots/Bars/horizontal-with-grid-on-top-mix-blend-dark-400w.webp differ diff --git a/docs/static/screenshots/Bars/horizontal-with-grid-on-top-mix-blend-dark-800w.webp b/docs/static/screenshots/Bars/horizontal-with-grid-on-top-mix-blend-dark-800w.webp index 7bfc3f83c2..4a7eeebb46 100644 Binary files a/docs/static/screenshots/Bars/horizontal-with-grid-on-top-mix-blend-dark-800w.webp and b/docs/static/screenshots/Bars/horizontal-with-grid-on-top-mix-blend-dark-800w.webp differ diff --git a/docs/static/screenshots/Bars/horizontal-with-grid-on-top-mix-blend-light-240w.webp b/docs/static/screenshots/Bars/horizontal-with-grid-on-top-mix-blend-light-240w.webp index 7e82f16e29..e06ba804d8 100644 Binary files a/docs/static/screenshots/Bars/horizontal-with-grid-on-top-mix-blend-light-240w.webp and b/docs/static/screenshots/Bars/horizontal-with-grid-on-top-mix-blend-light-240w.webp differ diff --git a/docs/static/screenshots/Bars/horizontal-with-grid-on-top-mix-blend-light-400w.webp b/docs/static/screenshots/Bars/horizontal-with-grid-on-top-mix-blend-light-400w.webp index 290f8053dd..e676c4c45c 100644 Binary files a/docs/static/screenshots/Bars/horizontal-with-grid-on-top-mix-blend-light-400w.webp and b/docs/static/screenshots/Bars/horizontal-with-grid-on-top-mix-blend-light-400w.webp differ diff --git a/docs/static/screenshots/Bars/horizontal-with-grid-on-top-mix-blend-light-800w.webp b/docs/static/screenshots/Bars/horizontal-with-grid-on-top-mix-blend-light-800w.webp index 4273a63b83..596e376871 100644 Binary files a/docs/static/screenshots/Bars/horizontal-with-grid-on-top-mix-blend-light-800w.webp and b/docs/static/screenshots/Bars/horizontal-with-grid-on-top-mix-blend-light-800w.webp differ diff --git a/docs/static/screenshots/Bars/vertical-average-annotation-rule-dark-240w.webp b/docs/static/screenshots/Bars/vertical-average-annotation-rule-dark-240w.webp index f44c111e2a..1321de0182 100644 Binary files a/docs/static/screenshots/Bars/vertical-average-annotation-rule-dark-240w.webp and b/docs/static/screenshots/Bars/vertical-average-annotation-rule-dark-240w.webp differ diff --git a/docs/static/screenshots/Bars/vertical-average-annotation-rule-dark-400w.webp b/docs/static/screenshots/Bars/vertical-average-annotation-rule-dark-400w.webp index 2ec8e8b5e9..2a55178b96 100644 Binary files a/docs/static/screenshots/Bars/vertical-average-annotation-rule-dark-400w.webp and b/docs/static/screenshots/Bars/vertical-average-annotation-rule-dark-400w.webp differ diff --git a/docs/static/screenshots/Bars/vertical-average-annotation-rule-dark-800w.webp b/docs/static/screenshots/Bars/vertical-average-annotation-rule-dark-800w.webp index a54892c546..49d0d0304c 100644 Binary files a/docs/static/screenshots/Bars/vertical-average-annotation-rule-dark-800w.webp and b/docs/static/screenshots/Bars/vertical-average-annotation-rule-dark-800w.webp differ diff --git a/docs/static/screenshots/Bars/vertical-average-annotation-rule-light-240w.webp b/docs/static/screenshots/Bars/vertical-average-annotation-rule-light-240w.webp index 25b6abe0a4..a7218ba693 100644 Binary files a/docs/static/screenshots/Bars/vertical-average-annotation-rule-light-240w.webp and b/docs/static/screenshots/Bars/vertical-average-annotation-rule-light-240w.webp differ diff --git a/docs/static/screenshots/Bars/vertical-average-annotation-rule-light-400w.webp b/docs/static/screenshots/Bars/vertical-average-annotation-rule-light-400w.webp index 66cb3d8fa9..af6fc3ef83 100644 Binary files a/docs/static/screenshots/Bars/vertical-average-annotation-rule-light-400w.webp and b/docs/static/screenshots/Bars/vertical-average-annotation-rule-light-400w.webp differ diff --git a/docs/static/screenshots/Bars/vertical-average-annotation-rule-light-800w.webp b/docs/static/screenshots/Bars/vertical-average-annotation-rule-light-800w.webp index de6f828f81..9c5633614d 100644 Binary files a/docs/static/screenshots/Bars/vertical-average-annotation-rule-light-800w.webp and b/docs/static/screenshots/Bars/vertical-average-annotation-rule-light-800w.webp differ diff --git a/docs/static/screenshots/Bars/vertical-basic-dark-240w.webp b/docs/static/screenshots/Bars/vertical-basic-dark-240w.webp index 2b2b634f99..778ef01276 100644 Binary files a/docs/static/screenshots/Bars/vertical-basic-dark-240w.webp and b/docs/static/screenshots/Bars/vertical-basic-dark-240w.webp differ diff --git a/docs/static/screenshots/Bars/vertical-basic-dark-400w.webp b/docs/static/screenshots/Bars/vertical-basic-dark-400w.webp index 9feb9fbd20..24ee275a11 100644 Binary files a/docs/static/screenshots/Bars/vertical-basic-dark-400w.webp and b/docs/static/screenshots/Bars/vertical-basic-dark-400w.webp differ diff --git a/docs/static/screenshots/Bars/vertical-basic-dark-800w.webp b/docs/static/screenshots/Bars/vertical-basic-dark-800w.webp index ffdd2b036a..ae87283cdd 100644 Binary files a/docs/static/screenshots/Bars/vertical-basic-dark-800w.webp and b/docs/static/screenshots/Bars/vertical-basic-dark-800w.webp differ diff --git a/docs/static/screenshots/Bars/vertical-basic-light-240w.webp b/docs/static/screenshots/Bars/vertical-basic-light-240w.webp index f60ef4ac2b..c1256a9773 100644 Binary files a/docs/static/screenshots/Bars/vertical-basic-light-240w.webp and b/docs/static/screenshots/Bars/vertical-basic-light-240w.webp differ diff --git a/docs/static/screenshots/Bars/vertical-basic-light-400w.webp b/docs/static/screenshots/Bars/vertical-basic-light-400w.webp index 9f92865f4f..002f593cfb 100644 Binary files a/docs/static/screenshots/Bars/vertical-basic-light-400w.webp and b/docs/static/screenshots/Bars/vertical-basic-light-400w.webp differ diff --git a/docs/static/screenshots/Bars/vertical-basic-light-800w.webp b/docs/static/screenshots/Bars/vertical-basic-light-800w.webp index dbcbbb5c5b..9d8fca9d66 100644 Binary files a/docs/static/screenshots/Bars/vertical-basic-light-800w.webp and b/docs/static/screenshots/Bars/vertical-basic-light-800w.webp differ diff --git a/docs/static/screenshots/Bars/vertical-calculated-value-domain-negative-dark-240w.webp b/docs/static/screenshots/Bars/vertical-calculated-value-domain-negative-dark-240w.webp index 61f9712a9d..36015a21ba 100644 Binary files a/docs/static/screenshots/Bars/vertical-calculated-value-domain-negative-dark-240w.webp and b/docs/static/screenshots/Bars/vertical-calculated-value-domain-negative-dark-240w.webp differ diff --git a/docs/static/screenshots/Bars/vertical-calculated-value-domain-negative-dark-400w.webp b/docs/static/screenshots/Bars/vertical-calculated-value-domain-negative-dark-400w.webp index 0e7164ca0e..4f766b75d6 100644 Binary files a/docs/static/screenshots/Bars/vertical-calculated-value-domain-negative-dark-400w.webp and b/docs/static/screenshots/Bars/vertical-calculated-value-domain-negative-dark-400w.webp differ diff --git a/docs/static/screenshots/Bars/vertical-calculated-value-domain-negative-dark-800w.webp b/docs/static/screenshots/Bars/vertical-calculated-value-domain-negative-dark-800w.webp index 8171348ef5..458e344fdc 100644 Binary files a/docs/static/screenshots/Bars/vertical-calculated-value-domain-negative-dark-800w.webp and b/docs/static/screenshots/Bars/vertical-calculated-value-domain-negative-dark-800w.webp differ diff --git a/docs/static/screenshots/Bars/vertical-calculated-value-domain-negative-light-240w.webp b/docs/static/screenshots/Bars/vertical-calculated-value-domain-negative-light-240w.webp index 536f31f5cd..7ce525f465 100644 Binary files a/docs/static/screenshots/Bars/vertical-calculated-value-domain-negative-light-240w.webp and b/docs/static/screenshots/Bars/vertical-calculated-value-domain-negative-light-240w.webp differ diff --git a/docs/static/screenshots/Bars/vertical-calculated-value-domain-negative-light-400w.webp b/docs/static/screenshots/Bars/vertical-calculated-value-domain-negative-light-400w.webp index e1192ec24e..b71025377d 100644 Binary files a/docs/static/screenshots/Bars/vertical-calculated-value-domain-negative-light-400w.webp and b/docs/static/screenshots/Bars/vertical-calculated-value-domain-negative-light-400w.webp differ diff --git a/docs/static/screenshots/Bars/vertical-calculated-value-domain-negative-light-800w.webp b/docs/static/screenshots/Bars/vertical-calculated-value-domain-negative-light-800w.webp index f7758cef7f..e82d65a7a1 100644 Binary files a/docs/static/screenshots/Bars/vertical-calculated-value-domain-negative-light-800w.webp and b/docs/static/screenshots/Bars/vertical-calculated-value-domain-negative-light-800w.webp differ diff --git a/docs/static/screenshots/Bars/vertical-calculated-value-domain-positive-dark-240w.webp b/docs/static/screenshots/Bars/vertical-calculated-value-domain-positive-dark-240w.webp index b890b859f5..64f2a9558e 100644 Binary files a/docs/static/screenshots/Bars/vertical-calculated-value-domain-positive-dark-240w.webp and b/docs/static/screenshots/Bars/vertical-calculated-value-domain-positive-dark-240w.webp differ diff --git a/docs/static/screenshots/Bars/vertical-calculated-value-domain-positive-dark-400w.webp b/docs/static/screenshots/Bars/vertical-calculated-value-domain-positive-dark-400w.webp index 62433ccf19..b5d4633d0a 100644 Binary files a/docs/static/screenshots/Bars/vertical-calculated-value-domain-positive-dark-400w.webp and b/docs/static/screenshots/Bars/vertical-calculated-value-domain-positive-dark-400w.webp differ diff --git a/docs/static/screenshots/Bars/vertical-calculated-value-domain-positive-dark-800w.webp b/docs/static/screenshots/Bars/vertical-calculated-value-domain-positive-dark-800w.webp index cdbaaca270..939377f013 100644 Binary files a/docs/static/screenshots/Bars/vertical-calculated-value-domain-positive-dark-800w.webp and b/docs/static/screenshots/Bars/vertical-calculated-value-domain-positive-dark-800w.webp differ diff --git a/docs/static/screenshots/Bars/vertical-calculated-value-domain-positive-light-240w.webp b/docs/static/screenshots/Bars/vertical-calculated-value-domain-positive-light-240w.webp index f693a7788b..efad6ad33a 100644 Binary files a/docs/static/screenshots/Bars/vertical-calculated-value-domain-positive-light-240w.webp and b/docs/static/screenshots/Bars/vertical-calculated-value-domain-positive-light-240w.webp differ diff --git a/docs/static/screenshots/Bars/vertical-calculated-value-domain-positive-light-400w.webp b/docs/static/screenshots/Bars/vertical-calculated-value-domain-positive-light-400w.webp index b277d67b16..9d7bb1c961 100644 Binary files a/docs/static/screenshots/Bars/vertical-calculated-value-domain-positive-light-400w.webp and b/docs/static/screenshots/Bars/vertical-calculated-value-domain-positive-light-400w.webp differ diff --git a/docs/static/screenshots/Bars/vertical-calculated-value-domain-positive-light-800w.webp b/docs/static/screenshots/Bars/vertical-calculated-value-domain-positive-light-800w.webp index 93e3dd7d7f..a4b09c6f4f 100644 Binary files a/docs/static/screenshots/Bars/vertical-calculated-value-domain-positive-light-800w.webp and b/docs/static/screenshots/Bars/vertical-calculated-value-domain-positive-light-800w.webp differ diff --git a/docs/static/screenshots/Bars/vertical-click-handler-dark-240w.webp b/docs/static/screenshots/Bars/vertical-click-handler-dark-240w.webp index 3a9cd40884..e96268c59a 100644 Binary files a/docs/static/screenshots/Bars/vertical-click-handler-dark-240w.webp and b/docs/static/screenshots/Bars/vertical-click-handler-dark-240w.webp differ diff --git a/docs/static/screenshots/Bars/vertical-click-handler-dark-400w.webp b/docs/static/screenshots/Bars/vertical-click-handler-dark-400w.webp index 1aa714f988..5dfa66d85f 100644 Binary files a/docs/static/screenshots/Bars/vertical-click-handler-dark-400w.webp and b/docs/static/screenshots/Bars/vertical-click-handler-dark-400w.webp differ diff --git a/docs/static/screenshots/Bars/vertical-click-handler-dark-800w.webp b/docs/static/screenshots/Bars/vertical-click-handler-dark-800w.webp index 6f14a8d9cb..c742bddba4 100644 Binary files a/docs/static/screenshots/Bars/vertical-click-handler-dark-800w.webp and b/docs/static/screenshots/Bars/vertical-click-handler-dark-800w.webp differ diff --git a/docs/static/screenshots/Bars/vertical-click-handler-light-240w.webp b/docs/static/screenshots/Bars/vertical-click-handler-light-240w.webp index 003c530f3c..943f65b985 100644 Binary files a/docs/static/screenshots/Bars/vertical-click-handler-light-240w.webp and b/docs/static/screenshots/Bars/vertical-click-handler-light-240w.webp differ diff --git a/docs/static/screenshots/Bars/vertical-click-handler-light-400w.webp b/docs/static/screenshots/Bars/vertical-click-handler-light-400w.webp index 20cf197f1b..92bce48925 100644 Binary files a/docs/static/screenshots/Bars/vertical-click-handler-light-400w.webp and b/docs/static/screenshots/Bars/vertical-click-handler-light-400w.webp differ diff --git a/docs/static/screenshots/Bars/vertical-click-handler-light-800w.webp b/docs/static/screenshots/Bars/vertical-click-handler-light-800w.webp index 8836e57760..9e75887ee9 100644 Binary files a/docs/static/screenshots/Bars/vertical-click-handler-light-800w.webp and b/docs/static/screenshots/Bars/vertical-click-handler-light-800w.webp differ diff --git a/docs/static/screenshots/Bars/vertical-customize-individual-styles-dark-240w.webp b/docs/static/screenshots/Bars/vertical-customize-individual-styles-dark-240w.webp index 0c9ffc7cd8..77ed834d51 100644 Binary files a/docs/static/screenshots/Bars/vertical-customize-individual-styles-dark-240w.webp and b/docs/static/screenshots/Bars/vertical-customize-individual-styles-dark-240w.webp differ diff --git a/docs/static/screenshots/Bars/vertical-customize-individual-styles-dark-400w.webp b/docs/static/screenshots/Bars/vertical-customize-individual-styles-dark-400w.webp index 00da76fae0..9f74acc872 100644 Binary files a/docs/static/screenshots/Bars/vertical-customize-individual-styles-dark-400w.webp and b/docs/static/screenshots/Bars/vertical-customize-individual-styles-dark-400w.webp differ diff --git a/docs/static/screenshots/Bars/vertical-customize-individual-styles-dark-800w.webp b/docs/static/screenshots/Bars/vertical-customize-individual-styles-dark-800w.webp index 626b2f7b9f..22e93efcd1 100644 Binary files a/docs/static/screenshots/Bars/vertical-customize-individual-styles-dark-800w.webp and b/docs/static/screenshots/Bars/vertical-customize-individual-styles-dark-800w.webp differ diff --git a/docs/static/screenshots/Bars/vertical-customize-individual-styles-light-240w.webp b/docs/static/screenshots/Bars/vertical-customize-individual-styles-light-240w.webp index 0cd545a3b0..c67e8751e3 100644 Binary files a/docs/static/screenshots/Bars/vertical-customize-individual-styles-light-240w.webp and b/docs/static/screenshots/Bars/vertical-customize-individual-styles-light-240w.webp differ diff --git a/docs/static/screenshots/Bars/vertical-customize-individual-styles-light-400w.webp b/docs/static/screenshots/Bars/vertical-customize-individual-styles-light-400w.webp index 6d4fb118cd..e1793a9d08 100644 Binary files a/docs/static/screenshots/Bars/vertical-customize-individual-styles-light-400w.webp and b/docs/static/screenshots/Bars/vertical-customize-individual-styles-light-400w.webp differ diff --git a/docs/static/screenshots/Bars/vertical-customize-individual-styles-light-800w.webp b/docs/static/screenshots/Bars/vertical-customize-individual-styles-light-800w.webp index c30c18ca39..271fe27cab 100644 Binary files a/docs/static/screenshots/Bars/vertical-customize-individual-styles-light-800w.webp and b/docs/static/screenshots/Bars/vertical-customize-individual-styles-light-800w.webp differ diff --git a/docs/static/screenshots/Bars/vertical-fixed-width-dark-240w.webp b/docs/static/screenshots/Bars/vertical-fixed-width-dark-240w.webp index 3f9b3f592c..b9db4da32a 100644 Binary files a/docs/static/screenshots/Bars/vertical-fixed-width-dark-240w.webp and b/docs/static/screenshots/Bars/vertical-fixed-width-dark-240w.webp differ diff --git a/docs/static/screenshots/Bars/vertical-fixed-width-dark-400w.webp b/docs/static/screenshots/Bars/vertical-fixed-width-dark-400w.webp index df050338ab..d1f7dcc886 100644 Binary files a/docs/static/screenshots/Bars/vertical-fixed-width-dark-400w.webp and b/docs/static/screenshots/Bars/vertical-fixed-width-dark-400w.webp differ diff --git a/docs/static/screenshots/Bars/vertical-fixed-width-dark-800w.webp b/docs/static/screenshots/Bars/vertical-fixed-width-dark-800w.webp index 9f9f01775b..e537158a27 100644 Binary files a/docs/static/screenshots/Bars/vertical-fixed-width-dark-800w.webp and b/docs/static/screenshots/Bars/vertical-fixed-width-dark-800w.webp differ diff --git a/docs/static/screenshots/Bars/vertical-fixed-width-light-240w.webp b/docs/static/screenshots/Bars/vertical-fixed-width-light-240w.webp index 85ebc9b5cb..1a8d5ecb08 100644 Binary files a/docs/static/screenshots/Bars/vertical-fixed-width-light-240w.webp and b/docs/static/screenshots/Bars/vertical-fixed-width-light-240w.webp differ diff --git a/docs/static/screenshots/Bars/vertical-fixed-width-light-400w.webp b/docs/static/screenshots/Bars/vertical-fixed-width-light-400w.webp index b7f6e6b131..0ec7d67815 100644 Binary files a/docs/static/screenshots/Bars/vertical-fixed-width-light-400w.webp and b/docs/static/screenshots/Bars/vertical-fixed-width-light-400w.webp differ diff --git a/docs/static/screenshots/Bars/vertical-fixed-width-light-800w.webp b/docs/static/screenshots/Bars/vertical-fixed-width-light-800w.webp index d5a66905c9..cbf1526f70 100644 Binary files a/docs/static/screenshots/Bars/vertical-fixed-width-light-800w.webp and b/docs/static/screenshots/Bars/vertical-fixed-width-light-800w.webp differ diff --git a/docs/static/screenshots/Bars/vertical-gradient-dark-240w.webp b/docs/static/screenshots/Bars/vertical-gradient-dark-240w.webp index 9f2264dce9..e7a9e8e0a2 100644 Binary files a/docs/static/screenshots/Bars/vertical-gradient-dark-240w.webp and b/docs/static/screenshots/Bars/vertical-gradient-dark-240w.webp differ diff --git a/docs/static/screenshots/Bars/vertical-gradient-dark-400w.webp b/docs/static/screenshots/Bars/vertical-gradient-dark-400w.webp index 7de04f2cb7..c325670131 100644 Binary files a/docs/static/screenshots/Bars/vertical-gradient-dark-400w.webp and b/docs/static/screenshots/Bars/vertical-gradient-dark-400w.webp differ diff --git a/docs/static/screenshots/Bars/vertical-gradient-dark-800w.webp b/docs/static/screenshots/Bars/vertical-gradient-dark-800w.webp index 6d70d5f131..a25e031a01 100644 Binary files a/docs/static/screenshots/Bars/vertical-gradient-dark-800w.webp and b/docs/static/screenshots/Bars/vertical-gradient-dark-800w.webp differ diff --git a/docs/static/screenshots/Bars/vertical-gradient-light-240w.webp b/docs/static/screenshots/Bars/vertical-gradient-light-240w.webp index 6470512f5d..795959409c 100644 Binary files a/docs/static/screenshots/Bars/vertical-gradient-light-240w.webp and b/docs/static/screenshots/Bars/vertical-gradient-light-240w.webp differ diff --git a/docs/static/screenshots/Bars/vertical-gradient-light-400w.webp b/docs/static/screenshots/Bars/vertical-gradient-light-400w.webp index 6f75ec2f26..1dc33485b2 100644 Binary files a/docs/static/screenshots/Bars/vertical-gradient-light-400w.webp and b/docs/static/screenshots/Bars/vertical-gradient-light-400w.webp differ diff --git a/docs/static/screenshots/Bars/vertical-gradient-light-800w.webp b/docs/static/screenshots/Bars/vertical-gradient-light-800w.webp index 69449700f1..5ccdcf2339 100644 Binary files a/docs/static/screenshots/Bars/vertical-gradient-light-800w.webp and b/docs/static/screenshots/Bars/vertical-gradient-light-800w.webp differ diff --git a/docs/static/screenshots/Bars/vertical-grouped-stacked-or-both-transition-dark-240w.webp b/docs/static/screenshots/Bars/vertical-grouped-stacked-or-both-transition-dark-240w.webp index 1e413196d7..40e8c60ed1 100644 Binary files a/docs/static/screenshots/Bars/vertical-grouped-stacked-or-both-transition-dark-240w.webp and b/docs/static/screenshots/Bars/vertical-grouped-stacked-or-both-transition-dark-240w.webp differ diff --git a/docs/static/screenshots/Bars/vertical-grouped-stacked-or-both-transition-dark-400w.webp b/docs/static/screenshots/Bars/vertical-grouped-stacked-or-both-transition-dark-400w.webp index 35b5e2d81b..9c6f9269ed 100644 Binary files a/docs/static/screenshots/Bars/vertical-grouped-stacked-or-both-transition-dark-400w.webp and b/docs/static/screenshots/Bars/vertical-grouped-stacked-or-both-transition-dark-400w.webp differ diff --git a/docs/static/screenshots/Bars/vertical-grouped-stacked-or-both-transition-dark-800w.webp b/docs/static/screenshots/Bars/vertical-grouped-stacked-or-both-transition-dark-800w.webp index fc026dbb87..396d7d3541 100644 Binary files a/docs/static/screenshots/Bars/vertical-grouped-stacked-or-both-transition-dark-800w.webp and b/docs/static/screenshots/Bars/vertical-grouped-stacked-or-both-transition-dark-800w.webp differ diff --git a/docs/static/screenshots/Bars/vertical-grouped-stacked-or-both-transition-light-240w.webp b/docs/static/screenshots/Bars/vertical-grouped-stacked-or-both-transition-light-240w.webp index 250bf3d599..825edb3991 100644 Binary files a/docs/static/screenshots/Bars/vertical-grouped-stacked-or-both-transition-light-240w.webp and b/docs/static/screenshots/Bars/vertical-grouped-stacked-or-both-transition-light-240w.webp differ diff --git a/docs/static/screenshots/Bars/vertical-grouped-stacked-or-both-transition-light-400w.webp b/docs/static/screenshots/Bars/vertical-grouped-stacked-or-both-transition-light-400w.webp index 9cd1bc9eb7..454557ebdc 100644 Binary files a/docs/static/screenshots/Bars/vertical-grouped-stacked-or-both-transition-light-400w.webp and b/docs/static/screenshots/Bars/vertical-grouped-stacked-or-both-transition-light-400w.webp differ diff --git a/docs/static/screenshots/Bars/vertical-grouped-stacked-or-both-transition-light-800w.webp b/docs/static/screenshots/Bars/vertical-grouped-stacked-or-both-transition-light-800w.webp index c60b665173..4e4ac5e981 100644 Binary files a/docs/static/screenshots/Bars/vertical-grouped-stacked-or-both-transition-light-800w.webp and b/docs/static/screenshots/Bars/vertical-grouped-stacked-or-both-transition-light-800w.webp differ diff --git a/docs/static/screenshots/Bars/vertical-highlight-individual-bar-dark-240w.webp b/docs/static/screenshots/Bars/vertical-highlight-individual-bar-dark-240w.webp index e80744a1ea..7c3b0874f2 100644 Binary files a/docs/static/screenshots/Bars/vertical-highlight-individual-bar-dark-240w.webp and b/docs/static/screenshots/Bars/vertical-highlight-individual-bar-dark-240w.webp differ diff --git a/docs/static/screenshots/Bars/vertical-highlight-individual-bar-dark-400w.webp b/docs/static/screenshots/Bars/vertical-highlight-individual-bar-dark-400w.webp index 943b0777df..a7d46e6e90 100644 Binary files a/docs/static/screenshots/Bars/vertical-highlight-individual-bar-dark-400w.webp and b/docs/static/screenshots/Bars/vertical-highlight-individual-bar-dark-400w.webp differ diff --git a/docs/static/screenshots/Bars/vertical-highlight-individual-bar-dark-800w.webp b/docs/static/screenshots/Bars/vertical-highlight-individual-bar-dark-800w.webp index 9cbfb30a7d..0ebb933aa5 100644 Binary files a/docs/static/screenshots/Bars/vertical-highlight-individual-bar-dark-800w.webp and b/docs/static/screenshots/Bars/vertical-highlight-individual-bar-dark-800w.webp differ diff --git a/docs/static/screenshots/Bars/vertical-highlight-individual-bar-light-240w.webp b/docs/static/screenshots/Bars/vertical-highlight-individual-bar-light-240w.webp index f567fd90b0..414151a065 100644 Binary files a/docs/static/screenshots/Bars/vertical-highlight-individual-bar-light-240w.webp and b/docs/static/screenshots/Bars/vertical-highlight-individual-bar-light-240w.webp differ diff --git a/docs/static/screenshots/Bars/vertical-highlight-individual-bar-light-400w.webp b/docs/static/screenshots/Bars/vertical-highlight-individual-bar-light-400w.webp index 5ba648d143..f25bc7cca1 100644 Binary files a/docs/static/screenshots/Bars/vertical-highlight-individual-bar-light-400w.webp and b/docs/static/screenshots/Bars/vertical-highlight-individual-bar-light-400w.webp differ diff --git a/docs/static/screenshots/Bars/vertical-highlight-individual-bar-light-800w.webp b/docs/static/screenshots/Bars/vertical-highlight-individual-bar-light-800w.webp index d18950f3f8..9ba949d90e 100644 Binary files a/docs/static/screenshots/Bars/vertical-highlight-individual-bar-light-800w.webp and b/docs/static/screenshots/Bars/vertical-highlight-individual-bar-light-800w.webp differ diff --git a/docs/static/screenshots/Bars/vertical-highlight-individual-bar-line-dark-240w.webp b/docs/static/screenshots/Bars/vertical-highlight-individual-bar-line-dark-240w.webp index c2584fafa5..d587c6b897 100644 Binary files a/docs/static/screenshots/Bars/vertical-highlight-individual-bar-line-dark-240w.webp and b/docs/static/screenshots/Bars/vertical-highlight-individual-bar-line-dark-240w.webp differ diff --git a/docs/static/screenshots/Bars/vertical-highlight-individual-bar-line-dark-400w.webp b/docs/static/screenshots/Bars/vertical-highlight-individual-bar-line-dark-400w.webp index f6b9fb484f..25c905f3f9 100644 Binary files a/docs/static/screenshots/Bars/vertical-highlight-individual-bar-line-dark-400w.webp and b/docs/static/screenshots/Bars/vertical-highlight-individual-bar-line-dark-400w.webp differ diff --git a/docs/static/screenshots/Bars/vertical-highlight-individual-bar-line-dark-800w.webp b/docs/static/screenshots/Bars/vertical-highlight-individual-bar-line-dark-800w.webp index 62df50380b..422128fe81 100644 Binary files a/docs/static/screenshots/Bars/vertical-highlight-individual-bar-line-dark-800w.webp and b/docs/static/screenshots/Bars/vertical-highlight-individual-bar-line-dark-800w.webp differ diff --git a/docs/static/screenshots/Bars/vertical-highlight-individual-bar-line-light-240w.webp b/docs/static/screenshots/Bars/vertical-highlight-individual-bar-line-light-240w.webp index e62e680792..47870a4d8c 100644 Binary files a/docs/static/screenshots/Bars/vertical-highlight-individual-bar-line-light-240w.webp and b/docs/static/screenshots/Bars/vertical-highlight-individual-bar-line-light-240w.webp differ diff --git a/docs/static/screenshots/Bars/vertical-highlight-individual-bar-line-light-400w.webp b/docs/static/screenshots/Bars/vertical-highlight-individual-bar-line-light-400w.webp index aa485c1848..396c3111ca 100644 Binary files a/docs/static/screenshots/Bars/vertical-highlight-individual-bar-line-light-400w.webp and b/docs/static/screenshots/Bars/vertical-highlight-individual-bar-line-light-400w.webp differ diff --git a/docs/static/screenshots/Bars/vertical-highlight-individual-bar-line-light-800w.webp b/docs/static/screenshots/Bars/vertical-highlight-individual-bar-line-light-800w.webp index 81282ba4c1..73a6b9fa25 100644 Binary files a/docs/static/screenshots/Bars/vertical-highlight-individual-bar-line-light-800w.webp and b/docs/static/screenshots/Bars/vertical-highlight-individual-bar-line-light-800w.webp differ diff --git a/docs/static/screenshots/Bars/vertical-inside-labels-dark-240w.webp b/docs/static/screenshots/Bars/vertical-inside-labels-dark-240w.webp index ebce8d785d..560e347b37 100644 Binary files a/docs/static/screenshots/Bars/vertical-inside-labels-dark-240w.webp and b/docs/static/screenshots/Bars/vertical-inside-labels-dark-240w.webp differ diff --git a/docs/static/screenshots/Bars/vertical-inside-labels-dark-400w.webp b/docs/static/screenshots/Bars/vertical-inside-labels-dark-400w.webp index e8c6b25ddf..136ce783b0 100644 Binary files a/docs/static/screenshots/Bars/vertical-inside-labels-dark-400w.webp and b/docs/static/screenshots/Bars/vertical-inside-labels-dark-400w.webp differ diff --git a/docs/static/screenshots/Bars/vertical-inside-labels-dark-800w.webp b/docs/static/screenshots/Bars/vertical-inside-labels-dark-800w.webp index ecbc83c495..1708098d2a 100644 Binary files a/docs/static/screenshots/Bars/vertical-inside-labels-dark-800w.webp and b/docs/static/screenshots/Bars/vertical-inside-labels-dark-800w.webp differ diff --git a/docs/static/screenshots/Bars/vertical-inside-labels-light-240w.webp b/docs/static/screenshots/Bars/vertical-inside-labels-light-240w.webp index b37c02fe72..41e161c92c 100644 Binary files a/docs/static/screenshots/Bars/vertical-inside-labels-light-240w.webp and b/docs/static/screenshots/Bars/vertical-inside-labels-light-240w.webp differ diff --git a/docs/static/screenshots/Bars/vertical-inside-labels-light-400w.webp b/docs/static/screenshots/Bars/vertical-inside-labels-light-400w.webp index ff358ad90c..4bb68ed737 100644 Binary files a/docs/static/screenshots/Bars/vertical-inside-labels-light-400w.webp and b/docs/static/screenshots/Bars/vertical-inside-labels-light-400w.webp differ diff --git a/docs/static/screenshots/Bars/vertical-inside-labels-light-800w.webp b/docs/static/screenshots/Bars/vertical-inside-labels-light-800w.webp index da26100b6c..a6ac7aecd3 100644 Binary files a/docs/static/screenshots/Bars/vertical-inside-labels-light-800w.webp and b/docs/static/screenshots/Bars/vertical-inside-labels-light-800w.webp differ diff --git a/docs/static/screenshots/Bars/vertical-limit-ticks-count-dark-240w.webp b/docs/static/screenshots/Bars/vertical-limit-ticks-count-dark-240w.webp index 552e9e74be..66d47c9493 100644 Binary files a/docs/static/screenshots/Bars/vertical-limit-ticks-count-dark-240w.webp and b/docs/static/screenshots/Bars/vertical-limit-ticks-count-dark-240w.webp differ diff --git a/docs/static/screenshots/Bars/vertical-limit-ticks-count-dark-400w.webp b/docs/static/screenshots/Bars/vertical-limit-ticks-count-dark-400w.webp index 2216520a20..95a85e3c49 100644 Binary files a/docs/static/screenshots/Bars/vertical-limit-ticks-count-dark-400w.webp and b/docs/static/screenshots/Bars/vertical-limit-ticks-count-dark-400w.webp differ diff --git a/docs/static/screenshots/Bars/vertical-limit-ticks-count-dark-800w.webp b/docs/static/screenshots/Bars/vertical-limit-ticks-count-dark-800w.webp index c03eac8b29..1b6a9fc04e 100644 Binary files a/docs/static/screenshots/Bars/vertical-limit-ticks-count-dark-800w.webp and b/docs/static/screenshots/Bars/vertical-limit-ticks-count-dark-800w.webp differ diff --git a/docs/static/screenshots/Bars/vertical-limit-ticks-count-light-240w.webp b/docs/static/screenshots/Bars/vertical-limit-ticks-count-light-240w.webp index f4e93cfdc0..1a1f18c5a4 100644 Binary files a/docs/static/screenshots/Bars/vertical-limit-ticks-count-light-240w.webp and b/docs/static/screenshots/Bars/vertical-limit-ticks-count-light-240w.webp differ diff --git a/docs/static/screenshots/Bars/vertical-limit-ticks-count-light-400w.webp b/docs/static/screenshots/Bars/vertical-limit-ticks-count-light-400w.webp index 780ec4607c..15f0ed59d1 100644 Binary files a/docs/static/screenshots/Bars/vertical-limit-ticks-count-light-400w.webp and b/docs/static/screenshots/Bars/vertical-limit-ticks-count-light-400w.webp differ diff --git a/docs/static/screenshots/Bars/vertical-limit-ticks-count-light-800w.webp b/docs/static/screenshots/Bars/vertical-limit-ticks-count-light-800w.webp index f418b8a26e..c3d97d8cc1 100644 Binary files a/docs/static/screenshots/Bars/vertical-limit-ticks-count-light-800w.webp and b/docs/static/screenshots/Bars/vertical-limit-ticks-count-light-800w.webp differ diff --git a/docs/static/screenshots/Bars/vertical-limit-ticks-second-scale-dark-240w.webp b/docs/static/screenshots/Bars/vertical-limit-ticks-second-scale-dark-240w.webp index 618a1a7aed..86f222763e 100644 Binary files a/docs/static/screenshots/Bars/vertical-limit-ticks-second-scale-dark-240w.webp and b/docs/static/screenshots/Bars/vertical-limit-ticks-second-scale-dark-240w.webp differ diff --git a/docs/static/screenshots/Bars/vertical-limit-ticks-second-scale-dark-400w.webp b/docs/static/screenshots/Bars/vertical-limit-ticks-second-scale-dark-400w.webp index 6cc18d10bd..0e976028d0 100644 Binary files a/docs/static/screenshots/Bars/vertical-limit-ticks-second-scale-dark-400w.webp and b/docs/static/screenshots/Bars/vertical-limit-ticks-second-scale-dark-400w.webp differ diff --git a/docs/static/screenshots/Bars/vertical-limit-ticks-second-scale-dark-800w.webp b/docs/static/screenshots/Bars/vertical-limit-ticks-second-scale-dark-800w.webp index 7bd5e408fe..f428155dd2 100644 Binary files a/docs/static/screenshots/Bars/vertical-limit-ticks-second-scale-dark-800w.webp and b/docs/static/screenshots/Bars/vertical-limit-ticks-second-scale-dark-800w.webp differ diff --git a/docs/static/screenshots/Bars/vertical-limit-ticks-second-scale-light-240w.webp b/docs/static/screenshots/Bars/vertical-limit-ticks-second-scale-light-240w.webp index 74f0d746c3..fb2314f68b 100644 Binary files a/docs/static/screenshots/Bars/vertical-limit-ticks-second-scale-light-240w.webp and b/docs/static/screenshots/Bars/vertical-limit-ticks-second-scale-light-240w.webp differ diff --git a/docs/static/screenshots/Bars/vertical-limit-ticks-second-scale-light-400w.webp b/docs/static/screenshots/Bars/vertical-limit-ticks-second-scale-light-400w.webp index 92470cc68e..bead4a060a 100644 Binary files a/docs/static/screenshots/Bars/vertical-limit-ticks-second-scale-light-400w.webp and b/docs/static/screenshots/Bars/vertical-limit-ticks-second-scale-light-400w.webp differ diff --git a/docs/static/screenshots/Bars/vertical-limit-ticks-second-scale-light-800w.webp b/docs/static/screenshots/Bars/vertical-limit-ticks-second-scale-light-800w.webp index efb7ae8fd9..7d5e28fa14 100644 Binary files a/docs/static/screenshots/Bars/vertical-limit-ticks-second-scale-light-800w.webp and b/docs/static/screenshots/Bars/vertical-limit-ticks-second-scale-light-800w.webp differ diff --git a/docs/static/screenshots/Bars/vertical-multiple-diverging-dark-240w.webp b/docs/static/screenshots/Bars/vertical-multiple-diverging-dark-240w.webp index a4e81ca547..522593905e 100644 Binary files a/docs/static/screenshots/Bars/vertical-multiple-diverging-dark-240w.webp and b/docs/static/screenshots/Bars/vertical-multiple-diverging-dark-240w.webp differ diff --git a/docs/static/screenshots/Bars/vertical-multiple-diverging-dark-400w.webp b/docs/static/screenshots/Bars/vertical-multiple-diverging-dark-400w.webp index 77e1710947..3d648b0d94 100644 Binary files a/docs/static/screenshots/Bars/vertical-multiple-diverging-dark-400w.webp and b/docs/static/screenshots/Bars/vertical-multiple-diverging-dark-400w.webp differ diff --git a/docs/static/screenshots/Bars/vertical-multiple-diverging-dark-800w.webp b/docs/static/screenshots/Bars/vertical-multiple-diverging-dark-800w.webp index 1ca8edc6ae..5f55e27319 100644 Binary files a/docs/static/screenshots/Bars/vertical-multiple-diverging-dark-800w.webp and b/docs/static/screenshots/Bars/vertical-multiple-diverging-dark-800w.webp differ diff --git a/docs/static/screenshots/Bars/vertical-multiple-diverging-light-240w.webp b/docs/static/screenshots/Bars/vertical-multiple-diverging-light-240w.webp index d31c0b6686..1e67e8b88e 100644 Binary files a/docs/static/screenshots/Bars/vertical-multiple-diverging-light-240w.webp and b/docs/static/screenshots/Bars/vertical-multiple-diverging-light-240w.webp differ diff --git a/docs/static/screenshots/Bars/vertical-multiple-diverging-light-400w.webp b/docs/static/screenshots/Bars/vertical-multiple-diverging-light-400w.webp index 61f2ac200f..0d7fd3c07c 100644 Binary files a/docs/static/screenshots/Bars/vertical-multiple-diverging-light-400w.webp and b/docs/static/screenshots/Bars/vertical-multiple-diverging-light-400w.webp differ diff --git a/docs/static/screenshots/Bars/vertical-multiple-diverging-light-800w.webp b/docs/static/screenshots/Bars/vertical-multiple-diverging-light-800w.webp index 756d125089..57160bb370 100644 Binary files a/docs/static/screenshots/Bars/vertical-multiple-diverging-light-800w.webp and b/docs/static/screenshots/Bars/vertical-multiple-diverging-light-800w.webp differ diff --git a/docs/static/screenshots/Bars/vertical-multiple-diverging-rounded-specific-dark-240w.webp b/docs/static/screenshots/Bars/vertical-multiple-diverging-rounded-specific-dark-240w.webp index 00dd912952..f8625955e9 100644 Binary files a/docs/static/screenshots/Bars/vertical-multiple-diverging-rounded-specific-dark-240w.webp and b/docs/static/screenshots/Bars/vertical-multiple-diverging-rounded-specific-dark-240w.webp differ diff --git a/docs/static/screenshots/Bars/vertical-multiple-diverging-rounded-specific-dark-400w.webp b/docs/static/screenshots/Bars/vertical-multiple-diverging-rounded-specific-dark-400w.webp index a3165bce8a..ee5f496a4d 100644 Binary files a/docs/static/screenshots/Bars/vertical-multiple-diverging-rounded-specific-dark-400w.webp and b/docs/static/screenshots/Bars/vertical-multiple-diverging-rounded-specific-dark-400w.webp differ diff --git a/docs/static/screenshots/Bars/vertical-multiple-diverging-rounded-specific-dark-800w.webp b/docs/static/screenshots/Bars/vertical-multiple-diverging-rounded-specific-dark-800w.webp index 0905b3dd50..43b0fca3e7 100644 Binary files a/docs/static/screenshots/Bars/vertical-multiple-diverging-rounded-specific-dark-800w.webp and b/docs/static/screenshots/Bars/vertical-multiple-diverging-rounded-specific-dark-800w.webp differ diff --git a/docs/static/screenshots/Bars/vertical-multiple-diverging-rounded-specific-light-240w.webp b/docs/static/screenshots/Bars/vertical-multiple-diverging-rounded-specific-light-240w.webp index 79835f2785..844fb9333f 100644 Binary files a/docs/static/screenshots/Bars/vertical-multiple-diverging-rounded-specific-light-240w.webp and b/docs/static/screenshots/Bars/vertical-multiple-diverging-rounded-specific-light-240w.webp differ diff --git a/docs/static/screenshots/Bars/vertical-multiple-diverging-rounded-specific-light-400w.webp b/docs/static/screenshots/Bars/vertical-multiple-diverging-rounded-specific-light-400w.webp index 4ebb0b860a..71a80f011d 100644 Binary files a/docs/static/screenshots/Bars/vertical-multiple-diverging-rounded-specific-light-400w.webp and b/docs/static/screenshots/Bars/vertical-multiple-diverging-rounded-specific-light-400w.webp differ diff --git a/docs/static/screenshots/Bars/vertical-multiple-diverging-rounded-specific-light-800w.webp b/docs/static/screenshots/Bars/vertical-multiple-diverging-rounded-specific-light-800w.webp index 96781c9dbe..74d879341f 100644 Binary files a/docs/static/screenshots/Bars/vertical-multiple-diverging-rounded-specific-light-800w.webp and b/docs/static/screenshots/Bars/vertical-multiple-diverging-rounded-specific-light-800w.webp differ diff --git a/docs/static/screenshots/Bars/vertical-multiple-overlapping-dark-240w.webp b/docs/static/screenshots/Bars/vertical-multiple-overlapping-dark-240w.webp index c849909436..a72f2a0971 100644 Binary files a/docs/static/screenshots/Bars/vertical-multiple-overlapping-dark-240w.webp and b/docs/static/screenshots/Bars/vertical-multiple-overlapping-dark-240w.webp differ diff --git a/docs/static/screenshots/Bars/vertical-multiple-overlapping-dark-400w.webp b/docs/static/screenshots/Bars/vertical-multiple-overlapping-dark-400w.webp index 301cc4f6c4..61484edd15 100644 Binary files a/docs/static/screenshots/Bars/vertical-multiple-overlapping-dark-400w.webp and b/docs/static/screenshots/Bars/vertical-multiple-overlapping-dark-400w.webp differ diff --git a/docs/static/screenshots/Bars/vertical-multiple-overlapping-dark-800w.webp b/docs/static/screenshots/Bars/vertical-multiple-overlapping-dark-800w.webp index 8ea657052e..e29c16da84 100644 Binary files a/docs/static/screenshots/Bars/vertical-multiple-overlapping-dark-800w.webp and b/docs/static/screenshots/Bars/vertical-multiple-overlapping-dark-800w.webp differ diff --git a/docs/static/screenshots/Bars/vertical-multiple-overlapping-light-240w.webp b/docs/static/screenshots/Bars/vertical-multiple-overlapping-light-240w.webp index ceb833c279..e4d6dc59ae 100644 Binary files a/docs/static/screenshots/Bars/vertical-multiple-overlapping-light-240w.webp and b/docs/static/screenshots/Bars/vertical-multiple-overlapping-light-240w.webp differ diff --git a/docs/static/screenshots/Bars/vertical-multiple-overlapping-light-400w.webp b/docs/static/screenshots/Bars/vertical-multiple-overlapping-light-400w.webp index 487bef62ca..677787a651 100644 Binary files a/docs/static/screenshots/Bars/vertical-multiple-overlapping-light-400w.webp and b/docs/static/screenshots/Bars/vertical-multiple-overlapping-light-400w.webp differ diff --git a/docs/static/screenshots/Bars/vertical-multiple-overlapping-light-800w.webp b/docs/static/screenshots/Bars/vertical-multiple-overlapping-light-800w.webp index dbe5159034..db7ef4648b 100644 Binary files a/docs/static/screenshots/Bars/vertical-multiple-overlapping-light-800w.webp and b/docs/static/screenshots/Bars/vertical-multiple-overlapping-light-800w.webp differ diff --git a/docs/static/screenshots/Bars/vertical-outside-labels-default-dark-240w.webp b/docs/static/screenshots/Bars/vertical-outside-labels-default-dark-240w.webp index b5e00a3536..8852c39da0 100644 Binary files a/docs/static/screenshots/Bars/vertical-outside-labels-default-dark-240w.webp and b/docs/static/screenshots/Bars/vertical-outside-labels-default-dark-240w.webp differ diff --git a/docs/static/screenshots/Bars/vertical-outside-labels-default-dark-400w.webp b/docs/static/screenshots/Bars/vertical-outside-labels-default-dark-400w.webp index e0e1c894e0..5ad915234f 100644 Binary files a/docs/static/screenshots/Bars/vertical-outside-labels-default-dark-400w.webp and b/docs/static/screenshots/Bars/vertical-outside-labels-default-dark-400w.webp differ diff --git a/docs/static/screenshots/Bars/vertical-outside-labels-default-dark-800w.webp b/docs/static/screenshots/Bars/vertical-outside-labels-default-dark-800w.webp index 01e0191f3e..97fef618f0 100644 Binary files a/docs/static/screenshots/Bars/vertical-outside-labels-default-dark-800w.webp and b/docs/static/screenshots/Bars/vertical-outside-labels-default-dark-800w.webp differ diff --git a/docs/static/screenshots/Bars/vertical-outside-labels-default-light-240w.webp b/docs/static/screenshots/Bars/vertical-outside-labels-default-light-240w.webp index 829cae434a..86167c0a19 100644 Binary files a/docs/static/screenshots/Bars/vertical-outside-labels-default-light-240w.webp and b/docs/static/screenshots/Bars/vertical-outside-labels-default-light-240w.webp differ diff --git a/docs/static/screenshots/Bars/vertical-outside-labels-default-light-400w.webp b/docs/static/screenshots/Bars/vertical-outside-labels-default-light-400w.webp index 2da126a74e..c7f8ba8369 100644 Binary files a/docs/static/screenshots/Bars/vertical-outside-labels-default-light-400w.webp and b/docs/static/screenshots/Bars/vertical-outside-labels-default-light-400w.webp differ diff --git a/docs/static/screenshots/Bars/vertical-outside-labels-default-light-800w.webp b/docs/static/screenshots/Bars/vertical-outside-labels-default-light-800w.webp index fd3345a3d0..6b0148f84e 100644 Binary files a/docs/static/screenshots/Bars/vertical-outside-labels-default-light-800w.webp and b/docs/static/screenshots/Bars/vertical-outside-labels-default-light-800w.webp differ diff --git a/docs/static/screenshots/Bars/vertical-rounded-top-only-dark-240w.webp b/docs/static/screenshots/Bars/vertical-rounded-top-only-dark-240w.webp index ecde5907fc..33e47efb47 100644 Binary files a/docs/static/screenshots/Bars/vertical-rounded-top-only-dark-240w.webp and b/docs/static/screenshots/Bars/vertical-rounded-top-only-dark-240w.webp differ diff --git a/docs/static/screenshots/Bars/vertical-rounded-top-only-dark-400w.webp b/docs/static/screenshots/Bars/vertical-rounded-top-only-dark-400w.webp index f527cb58be..3ac1196a2e 100644 Binary files a/docs/static/screenshots/Bars/vertical-rounded-top-only-dark-400w.webp and b/docs/static/screenshots/Bars/vertical-rounded-top-only-dark-400w.webp differ diff --git a/docs/static/screenshots/Bars/vertical-rounded-top-only-dark-800w.webp b/docs/static/screenshots/Bars/vertical-rounded-top-only-dark-800w.webp index 1c66df1a4a..b29e433bd7 100644 Binary files a/docs/static/screenshots/Bars/vertical-rounded-top-only-dark-800w.webp and b/docs/static/screenshots/Bars/vertical-rounded-top-only-dark-800w.webp differ diff --git a/docs/static/screenshots/Bars/vertical-rounded-top-only-light-240w.webp b/docs/static/screenshots/Bars/vertical-rounded-top-only-light-240w.webp index 21cf71568e..8686c1c3f4 100644 Binary files a/docs/static/screenshots/Bars/vertical-rounded-top-only-light-240w.webp and b/docs/static/screenshots/Bars/vertical-rounded-top-only-light-240w.webp differ diff --git a/docs/static/screenshots/Bars/vertical-rounded-top-only-light-400w.webp b/docs/static/screenshots/Bars/vertical-rounded-top-only-light-400w.webp index a7350f7610..aabc26364c 100644 Binary files a/docs/static/screenshots/Bars/vertical-rounded-top-only-light-400w.webp and b/docs/static/screenshots/Bars/vertical-rounded-top-only-light-400w.webp differ diff --git a/docs/static/screenshots/Bars/vertical-rounded-top-only-light-800w.webp b/docs/static/screenshots/Bars/vertical-rounded-top-only-light-800w.webp index 604caf7763..a5b09655cc 100644 Binary files a/docs/static/screenshots/Bars/vertical-rounded-top-only-light-800w.webp and b/docs/static/screenshots/Bars/vertical-rounded-top-only-light-800w.webp differ diff --git a/docs/static/screenshots/Bars/vertical-stacked-percent-dark-400w.webp b/docs/static/screenshots/Bars/vertical-stacked-percent-dark-400w.webp index 18809e2b97..065736ee34 100644 Binary files a/docs/static/screenshots/Bars/vertical-stacked-percent-dark-400w.webp and b/docs/static/screenshots/Bars/vertical-stacked-percent-dark-400w.webp differ diff --git a/docs/static/screenshots/Bars/vertical-stacked-percent-dark-800w.webp b/docs/static/screenshots/Bars/vertical-stacked-percent-dark-800w.webp index 8c90ce0f6b..3f979424c4 100644 Binary files a/docs/static/screenshots/Bars/vertical-stacked-percent-dark-800w.webp and b/docs/static/screenshots/Bars/vertical-stacked-percent-dark-800w.webp differ diff --git a/docs/static/screenshots/Bars/vertical-stagger-tween-on-mount-dark-240w.webp b/docs/static/screenshots/Bars/vertical-stagger-tween-on-mount-dark-240w.webp index 00a878432f..fc5fa46a68 100644 Binary files a/docs/static/screenshots/Bars/vertical-stagger-tween-on-mount-dark-240w.webp and b/docs/static/screenshots/Bars/vertical-stagger-tween-on-mount-dark-240w.webp differ diff --git a/docs/static/screenshots/Bars/vertical-stagger-tween-on-mount-dark-400w.webp b/docs/static/screenshots/Bars/vertical-stagger-tween-on-mount-dark-400w.webp index aa2f53ff5d..3b9f7e3d2a 100644 Binary files a/docs/static/screenshots/Bars/vertical-stagger-tween-on-mount-dark-400w.webp and b/docs/static/screenshots/Bars/vertical-stagger-tween-on-mount-dark-400w.webp differ diff --git a/docs/static/screenshots/Bars/vertical-stagger-tween-on-mount-dark-800w.webp b/docs/static/screenshots/Bars/vertical-stagger-tween-on-mount-dark-800w.webp index a9364679dd..a5e509415e 100644 Binary files a/docs/static/screenshots/Bars/vertical-stagger-tween-on-mount-dark-800w.webp and b/docs/static/screenshots/Bars/vertical-stagger-tween-on-mount-dark-800w.webp differ diff --git a/docs/static/screenshots/Bars/vertical-stagger-tween-on-mount-light-240w.webp b/docs/static/screenshots/Bars/vertical-stagger-tween-on-mount-light-240w.webp index 26da63f34a..df6db043f5 100644 Binary files a/docs/static/screenshots/Bars/vertical-stagger-tween-on-mount-light-240w.webp and b/docs/static/screenshots/Bars/vertical-stagger-tween-on-mount-light-240w.webp differ diff --git a/docs/static/screenshots/Bars/vertical-stagger-tween-on-mount-light-400w.webp b/docs/static/screenshots/Bars/vertical-stagger-tween-on-mount-light-400w.webp index aa505980e8..ab0b6b125a 100644 Binary files a/docs/static/screenshots/Bars/vertical-stagger-tween-on-mount-light-400w.webp and b/docs/static/screenshots/Bars/vertical-stagger-tween-on-mount-light-400w.webp differ diff --git a/docs/static/screenshots/Bars/vertical-stagger-tween-on-mount-light-800w.webp b/docs/static/screenshots/Bars/vertical-stagger-tween-on-mount-light-800w.webp index 2662b9fcf2..41c48cbb90 100644 Binary files a/docs/static/screenshots/Bars/vertical-stagger-tween-on-mount-light-800w.webp and b/docs/static/screenshots/Bars/vertical-stagger-tween-on-mount-light-800w.webp differ diff --git a/docs/static/screenshots/Bars/vertical-stagger-tween-on-mount-rounded-edge-dark-240w.webp b/docs/static/screenshots/Bars/vertical-stagger-tween-on-mount-rounded-edge-dark-240w.webp index 732d988ec9..98459b60d0 100644 Binary files a/docs/static/screenshots/Bars/vertical-stagger-tween-on-mount-rounded-edge-dark-240w.webp and b/docs/static/screenshots/Bars/vertical-stagger-tween-on-mount-rounded-edge-dark-240w.webp differ diff --git a/docs/static/screenshots/Bars/vertical-stagger-tween-on-mount-rounded-edge-dark-400w.webp b/docs/static/screenshots/Bars/vertical-stagger-tween-on-mount-rounded-edge-dark-400w.webp index 85d6184dc9..99bc8bc9dd 100644 Binary files a/docs/static/screenshots/Bars/vertical-stagger-tween-on-mount-rounded-edge-dark-400w.webp and b/docs/static/screenshots/Bars/vertical-stagger-tween-on-mount-rounded-edge-dark-400w.webp differ diff --git a/docs/static/screenshots/Bars/vertical-stagger-tween-on-mount-rounded-edge-dark-800w.webp b/docs/static/screenshots/Bars/vertical-stagger-tween-on-mount-rounded-edge-dark-800w.webp index a0987e13ae..975d43a9e5 100644 Binary files a/docs/static/screenshots/Bars/vertical-stagger-tween-on-mount-rounded-edge-dark-800w.webp and b/docs/static/screenshots/Bars/vertical-stagger-tween-on-mount-rounded-edge-dark-800w.webp differ diff --git a/docs/static/screenshots/Bars/vertical-stagger-tween-on-mount-rounded-edge-light-240w.webp b/docs/static/screenshots/Bars/vertical-stagger-tween-on-mount-rounded-edge-light-240w.webp index ec9429c7d5..3242dabc9a 100644 Binary files a/docs/static/screenshots/Bars/vertical-stagger-tween-on-mount-rounded-edge-light-240w.webp and b/docs/static/screenshots/Bars/vertical-stagger-tween-on-mount-rounded-edge-light-240w.webp differ diff --git a/docs/static/screenshots/Bars/vertical-stagger-tween-on-mount-rounded-edge-light-400w.webp b/docs/static/screenshots/Bars/vertical-stagger-tween-on-mount-rounded-edge-light-400w.webp index 3dba858c25..4e37248cfa 100644 Binary files a/docs/static/screenshots/Bars/vertical-stagger-tween-on-mount-rounded-edge-light-400w.webp and b/docs/static/screenshots/Bars/vertical-stagger-tween-on-mount-rounded-edge-light-400w.webp differ diff --git a/docs/static/screenshots/Bars/vertical-stagger-tween-on-mount-rounded-edge-light-800w.webp b/docs/static/screenshots/Bars/vertical-stagger-tween-on-mount-rounded-edge-light-800w.webp index d6acfba68c..9896729f35 100644 Binary files a/docs/static/screenshots/Bars/vertical-stagger-tween-on-mount-rounded-edge-light-800w.webp and b/docs/static/screenshots/Bars/vertical-stagger-tween-on-mount-rounded-edge-light-800w.webp differ diff --git a/docs/static/screenshots/Bars/vertical-time-scale-with-inset-dark-240w.webp b/docs/static/screenshots/Bars/vertical-time-scale-with-inset-dark-240w.webp index 2348ba5a2c..83d5418506 100644 Binary files a/docs/static/screenshots/Bars/vertical-time-scale-with-inset-dark-240w.webp and b/docs/static/screenshots/Bars/vertical-time-scale-with-inset-dark-240w.webp differ diff --git a/docs/static/screenshots/Bars/vertical-time-scale-with-inset-dark-400w.webp b/docs/static/screenshots/Bars/vertical-time-scale-with-inset-dark-400w.webp index f327c67c94..5d73ec38fc 100644 Binary files a/docs/static/screenshots/Bars/vertical-time-scale-with-inset-dark-400w.webp and b/docs/static/screenshots/Bars/vertical-time-scale-with-inset-dark-400w.webp differ diff --git a/docs/static/screenshots/Bars/vertical-time-scale-with-inset-dark-800w.webp b/docs/static/screenshots/Bars/vertical-time-scale-with-inset-dark-800w.webp index 26e183c64e..12eb538b0b 100644 Binary files a/docs/static/screenshots/Bars/vertical-time-scale-with-inset-dark-800w.webp and b/docs/static/screenshots/Bars/vertical-time-scale-with-inset-dark-800w.webp differ diff --git a/docs/static/screenshots/Bars/vertical-time-scale-with-inset-light-240w.webp b/docs/static/screenshots/Bars/vertical-time-scale-with-inset-light-240w.webp index 1194dbd0dd..b65fe8063c 100644 Binary files a/docs/static/screenshots/Bars/vertical-time-scale-with-inset-light-240w.webp and b/docs/static/screenshots/Bars/vertical-time-scale-with-inset-light-240w.webp differ diff --git a/docs/static/screenshots/Bars/vertical-time-scale-with-inset-light-400w.webp b/docs/static/screenshots/Bars/vertical-time-scale-with-inset-light-400w.webp index fd075d1e75..4caff2ecf1 100644 Binary files a/docs/static/screenshots/Bars/vertical-time-scale-with-inset-light-400w.webp and b/docs/static/screenshots/Bars/vertical-time-scale-with-inset-light-400w.webp differ diff --git a/docs/static/screenshots/Bars/vertical-time-scale-with-inset-light-800w.webp b/docs/static/screenshots/Bars/vertical-time-scale-with-inset-light-800w.webp index eda56b7dfe..289bb18fbb 100644 Binary files a/docs/static/screenshots/Bars/vertical-time-scale-with-inset-light-800w.webp and b/docs/static/screenshots/Bars/vertical-time-scale-with-inset-light-800w.webp differ diff --git a/docs/static/screenshots/Bars/vertical-time-scale-with-interval-dark-240w.webp b/docs/static/screenshots/Bars/vertical-time-scale-with-interval-dark-240w.webp index e56d7c46ac..4ae33ca1ab 100644 Binary files a/docs/static/screenshots/Bars/vertical-time-scale-with-interval-dark-240w.webp and b/docs/static/screenshots/Bars/vertical-time-scale-with-interval-dark-240w.webp differ diff --git a/docs/static/screenshots/Bars/vertical-time-scale-with-interval-dark-400w.webp b/docs/static/screenshots/Bars/vertical-time-scale-with-interval-dark-400w.webp index deba5f699e..7bfb046e7b 100644 Binary files a/docs/static/screenshots/Bars/vertical-time-scale-with-interval-dark-400w.webp and b/docs/static/screenshots/Bars/vertical-time-scale-with-interval-dark-400w.webp differ diff --git a/docs/static/screenshots/Bars/vertical-time-scale-with-interval-dark-800w.webp b/docs/static/screenshots/Bars/vertical-time-scale-with-interval-dark-800w.webp index 60f2c557f7..0825cb2298 100644 Binary files a/docs/static/screenshots/Bars/vertical-time-scale-with-interval-dark-800w.webp and b/docs/static/screenshots/Bars/vertical-time-scale-with-interval-dark-800w.webp differ diff --git a/docs/static/screenshots/Bars/vertical-time-scale-with-interval-light-240w.webp b/docs/static/screenshots/Bars/vertical-time-scale-with-interval-light-240w.webp index 8edae242fa..f28b963f47 100644 Binary files a/docs/static/screenshots/Bars/vertical-time-scale-with-interval-light-240w.webp and b/docs/static/screenshots/Bars/vertical-time-scale-with-interval-light-240w.webp differ diff --git a/docs/static/screenshots/Bars/vertical-time-scale-with-interval-light-400w.webp b/docs/static/screenshots/Bars/vertical-time-scale-with-interval-light-400w.webp index 1b1e229481..f2708cb33f 100644 Binary files a/docs/static/screenshots/Bars/vertical-time-scale-with-interval-light-400w.webp and b/docs/static/screenshots/Bars/vertical-time-scale-with-interval-light-400w.webp differ diff --git a/docs/static/screenshots/Bars/vertical-time-scale-with-interval-light-800w.webp b/docs/static/screenshots/Bars/vertical-time-scale-with-interval-light-800w.webp index b62f3bc305..acfe932399 100644 Binary files a/docs/static/screenshots/Bars/vertical-time-scale-with-interval-light-800w.webp and b/docs/static/screenshots/Bars/vertical-time-scale-with-interval-light-800w.webp differ diff --git a/docs/static/screenshots/Bars/vertical-time-scale-with-interval-months-dark-240w.webp b/docs/static/screenshots/Bars/vertical-time-scale-with-interval-months-dark-240w.webp index 0e23691e72..bbbebfd5eb 100644 Binary files a/docs/static/screenshots/Bars/vertical-time-scale-with-interval-months-dark-240w.webp and b/docs/static/screenshots/Bars/vertical-time-scale-with-interval-months-dark-240w.webp differ diff --git a/docs/static/screenshots/Bars/vertical-time-scale-with-interval-months-dark-400w.webp b/docs/static/screenshots/Bars/vertical-time-scale-with-interval-months-dark-400w.webp index e8f7545a8b..93223d6ca4 100644 Binary files a/docs/static/screenshots/Bars/vertical-time-scale-with-interval-months-dark-400w.webp and b/docs/static/screenshots/Bars/vertical-time-scale-with-interval-months-dark-400w.webp differ diff --git a/docs/static/screenshots/Bars/vertical-time-scale-with-interval-months-dark-800w.webp b/docs/static/screenshots/Bars/vertical-time-scale-with-interval-months-dark-800w.webp index 9113ee3a22..3242418c3d 100644 Binary files a/docs/static/screenshots/Bars/vertical-time-scale-with-interval-months-dark-800w.webp and b/docs/static/screenshots/Bars/vertical-time-scale-with-interval-months-dark-800w.webp differ diff --git a/docs/static/screenshots/Bars/vertical-time-scale-with-interval-months-light-240w.webp b/docs/static/screenshots/Bars/vertical-time-scale-with-interval-months-light-240w.webp index a912ab611f..ea614207d9 100644 Binary files a/docs/static/screenshots/Bars/vertical-time-scale-with-interval-months-light-240w.webp and b/docs/static/screenshots/Bars/vertical-time-scale-with-interval-months-light-240w.webp differ diff --git a/docs/static/screenshots/Bars/vertical-time-scale-with-interval-months-light-400w.webp b/docs/static/screenshots/Bars/vertical-time-scale-with-interval-months-light-400w.webp index c0021922bd..8b6b670495 100644 Binary files a/docs/static/screenshots/Bars/vertical-time-scale-with-interval-months-light-400w.webp and b/docs/static/screenshots/Bars/vertical-time-scale-with-interval-months-light-400w.webp differ diff --git a/docs/static/screenshots/Bars/vertical-time-scale-with-interval-months-light-800w.webp b/docs/static/screenshots/Bars/vertical-time-scale-with-interval-months-light-800w.webp index 270efee5e2..f4fc861d48 100644 Binary files a/docs/static/screenshots/Bars/vertical-time-scale-with-interval-months-light-800w.webp and b/docs/static/screenshots/Bars/vertical-time-scale-with-interval-months-light-800w.webp differ diff --git a/docs/static/screenshots/Bars/vertical-time-scale-with-missing-data-dark-240w.webp b/docs/static/screenshots/Bars/vertical-time-scale-with-missing-data-dark-240w.webp index 7f2fe07080..297d552b2f 100644 Binary files a/docs/static/screenshots/Bars/vertical-time-scale-with-missing-data-dark-240w.webp and b/docs/static/screenshots/Bars/vertical-time-scale-with-missing-data-dark-240w.webp differ diff --git a/docs/static/screenshots/Bars/vertical-time-scale-with-missing-data-dark-400w.webp b/docs/static/screenshots/Bars/vertical-time-scale-with-missing-data-dark-400w.webp index d3bf3dbec4..5729bc92ba 100644 Binary files a/docs/static/screenshots/Bars/vertical-time-scale-with-missing-data-dark-400w.webp and b/docs/static/screenshots/Bars/vertical-time-scale-with-missing-data-dark-400w.webp differ diff --git a/docs/static/screenshots/Bars/vertical-time-scale-with-missing-data-dark-800w.webp b/docs/static/screenshots/Bars/vertical-time-scale-with-missing-data-dark-800w.webp index fed842bde0..79ca222e77 100644 Binary files a/docs/static/screenshots/Bars/vertical-time-scale-with-missing-data-dark-800w.webp and b/docs/static/screenshots/Bars/vertical-time-scale-with-missing-data-dark-800w.webp differ diff --git a/docs/static/screenshots/Bars/vertical-time-scale-with-missing-data-light-240w.webp b/docs/static/screenshots/Bars/vertical-time-scale-with-missing-data-light-240w.webp index cdd054a255..4e36efd2ed 100644 Binary files a/docs/static/screenshots/Bars/vertical-time-scale-with-missing-data-light-240w.webp and b/docs/static/screenshots/Bars/vertical-time-scale-with-missing-data-light-240w.webp differ diff --git a/docs/static/screenshots/Bars/vertical-time-scale-with-missing-data-light-400w.webp b/docs/static/screenshots/Bars/vertical-time-scale-with-missing-data-light-400w.webp index 0090b18d3d..e62b85b795 100644 Binary files a/docs/static/screenshots/Bars/vertical-time-scale-with-missing-data-light-400w.webp and b/docs/static/screenshots/Bars/vertical-time-scale-with-missing-data-light-400w.webp differ diff --git a/docs/static/screenshots/Bars/vertical-time-scale-with-missing-data-light-800w.webp b/docs/static/screenshots/Bars/vertical-time-scale-with-missing-data-light-800w.webp index 5747619c22..0def5f86ba 100644 Binary files a/docs/static/screenshots/Bars/vertical-time-scale-with-missing-data-light-800w.webp and b/docs/static/screenshots/Bars/vertical-time-scale-with-missing-data-light-800w.webp differ diff --git a/docs/static/screenshots/Bars/vertical-tooltip-and-bar-highlight-dark-240w.webp b/docs/static/screenshots/Bars/vertical-tooltip-and-bar-highlight-dark-240w.webp index 05316236bc..4637661c41 100644 Binary files a/docs/static/screenshots/Bars/vertical-tooltip-and-bar-highlight-dark-240w.webp and b/docs/static/screenshots/Bars/vertical-tooltip-and-bar-highlight-dark-240w.webp differ diff --git a/docs/static/screenshots/Bars/vertical-tooltip-and-bar-highlight-dark-400w.webp b/docs/static/screenshots/Bars/vertical-tooltip-and-bar-highlight-dark-400w.webp index bb8a4505c8..1b15e27fa2 100644 Binary files a/docs/static/screenshots/Bars/vertical-tooltip-and-bar-highlight-dark-400w.webp and b/docs/static/screenshots/Bars/vertical-tooltip-and-bar-highlight-dark-400w.webp differ diff --git a/docs/static/screenshots/Bars/vertical-tooltip-and-bar-highlight-dark-800w.webp b/docs/static/screenshots/Bars/vertical-tooltip-and-bar-highlight-dark-800w.webp index 8a587eab47..f2287075d6 100644 Binary files a/docs/static/screenshots/Bars/vertical-tooltip-and-bar-highlight-dark-800w.webp and b/docs/static/screenshots/Bars/vertical-tooltip-and-bar-highlight-dark-800w.webp differ diff --git a/docs/static/screenshots/Bars/vertical-tooltip-and-bar-highlight-light-240w.webp b/docs/static/screenshots/Bars/vertical-tooltip-and-bar-highlight-light-240w.webp index 6a7e5ebed9..9375870982 100644 Binary files a/docs/static/screenshots/Bars/vertical-tooltip-and-bar-highlight-light-240w.webp and b/docs/static/screenshots/Bars/vertical-tooltip-and-bar-highlight-light-240w.webp differ diff --git a/docs/static/screenshots/Bars/vertical-tooltip-and-bar-highlight-light-400w.webp b/docs/static/screenshots/Bars/vertical-tooltip-and-bar-highlight-light-400w.webp index fc346f936b..b2b7aadc93 100644 Binary files a/docs/static/screenshots/Bars/vertical-tooltip-and-bar-highlight-light-400w.webp and b/docs/static/screenshots/Bars/vertical-tooltip-and-bar-highlight-light-400w.webp differ diff --git a/docs/static/screenshots/Bars/vertical-tooltip-and-bar-highlight-light-800w.webp b/docs/static/screenshots/Bars/vertical-tooltip-and-bar-highlight-light-800w.webp index 485d9ca914..af427f33c2 100644 Binary files a/docs/static/screenshots/Bars/vertical-tooltip-and-bar-highlight-light-800w.webp and b/docs/static/screenshots/Bars/vertical-tooltip-and-bar-highlight-light-800w.webp differ diff --git a/docs/static/screenshots/Bars/vertical-tooltip-and-click-handlers-for-individual-stack-grouped-bar-dark-240w.webp b/docs/static/screenshots/Bars/vertical-tooltip-and-click-handlers-for-individual-stack-grouped-bar-dark-240w.webp index 2a161092e8..a3e98e46b9 100644 Binary files a/docs/static/screenshots/Bars/vertical-tooltip-and-click-handlers-for-individual-stack-grouped-bar-dark-240w.webp and b/docs/static/screenshots/Bars/vertical-tooltip-and-click-handlers-for-individual-stack-grouped-bar-dark-240w.webp differ diff --git a/docs/static/screenshots/Bars/vertical-tooltip-and-click-handlers-for-individual-stack-grouped-bar-dark-400w.webp b/docs/static/screenshots/Bars/vertical-tooltip-and-click-handlers-for-individual-stack-grouped-bar-dark-400w.webp index 0d3d7e0496..3e28519673 100644 Binary files a/docs/static/screenshots/Bars/vertical-tooltip-and-click-handlers-for-individual-stack-grouped-bar-dark-400w.webp and b/docs/static/screenshots/Bars/vertical-tooltip-and-click-handlers-for-individual-stack-grouped-bar-dark-400w.webp differ diff --git a/docs/static/screenshots/Bars/vertical-tooltip-and-click-handlers-for-individual-stack-grouped-bar-dark-800w.webp b/docs/static/screenshots/Bars/vertical-tooltip-and-click-handlers-for-individual-stack-grouped-bar-dark-800w.webp index f5e7872721..227324afbc 100644 Binary files a/docs/static/screenshots/Bars/vertical-tooltip-and-click-handlers-for-individual-stack-grouped-bar-dark-800w.webp and b/docs/static/screenshots/Bars/vertical-tooltip-and-click-handlers-for-individual-stack-grouped-bar-dark-800w.webp differ diff --git a/docs/static/screenshots/Bars/vertical-tooltip-and-click-handlers-for-individual-stack-grouped-bar-light-240w.webp b/docs/static/screenshots/Bars/vertical-tooltip-and-click-handlers-for-individual-stack-grouped-bar-light-240w.webp index 8d39f1a7d6..588e20dc85 100644 Binary files a/docs/static/screenshots/Bars/vertical-tooltip-and-click-handlers-for-individual-stack-grouped-bar-light-240w.webp and b/docs/static/screenshots/Bars/vertical-tooltip-and-click-handlers-for-individual-stack-grouped-bar-light-240w.webp differ diff --git a/docs/static/screenshots/Bars/vertical-tooltip-and-click-handlers-for-individual-stack-grouped-bar-light-400w.webp b/docs/static/screenshots/Bars/vertical-tooltip-and-click-handlers-for-individual-stack-grouped-bar-light-400w.webp index 95e68cd3b1..7f918e028f 100644 Binary files a/docs/static/screenshots/Bars/vertical-tooltip-and-click-handlers-for-individual-stack-grouped-bar-light-400w.webp and b/docs/static/screenshots/Bars/vertical-tooltip-and-click-handlers-for-individual-stack-grouped-bar-light-400w.webp differ diff --git a/docs/static/screenshots/Bars/vertical-tooltip-and-click-handlers-for-individual-stack-grouped-bar-light-800w.webp b/docs/static/screenshots/Bars/vertical-tooltip-and-click-handlers-for-individual-stack-grouped-bar-light-800w.webp index b813912d27..4d2d752d2f 100644 Binary files a/docs/static/screenshots/Bars/vertical-tooltip-and-click-handlers-for-individual-stack-grouped-bar-light-800w.webp and b/docs/static/screenshots/Bars/vertical-tooltip-and-click-handlers-for-individual-stack-grouped-bar-light-800w.webp differ diff --git a/docs/static/screenshots/Bars/vertical-tooltip-and-clipped-highlight-dark-240w.webp b/docs/static/screenshots/Bars/vertical-tooltip-and-clipped-highlight-dark-240w.webp index 39f05d5ed9..de5948b1e2 100644 Binary files a/docs/static/screenshots/Bars/vertical-tooltip-and-clipped-highlight-dark-240w.webp and b/docs/static/screenshots/Bars/vertical-tooltip-and-clipped-highlight-dark-240w.webp differ diff --git a/docs/static/screenshots/Bars/vertical-tooltip-and-clipped-highlight-dark-400w.webp b/docs/static/screenshots/Bars/vertical-tooltip-and-clipped-highlight-dark-400w.webp index 35e7318d10..ba759e8f1e 100644 Binary files a/docs/static/screenshots/Bars/vertical-tooltip-and-clipped-highlight-dark-400w.webp and b/docs/static/screenshots/Bars/vertical-tooltip-and-clipped-highlight-dark-400w.webp differ diff --git a/docs/static/screenshots/Bars/vertical-tooltip-and-clipped-highlight-dark-800w.webp b/docs/static/screenshots/Bars/vertical-tooltip-and-clipped-highlight-dark-800w.webp index d00f47e69f..1e9a5d6164 100644 Binary files a/docs/static/screenshots/Bars/vertical-tooltip-and-clipped-highlight-dark-800w.webp and b/docs/static/screenshots/Bars/vertical-tooltip-and-clipped-highlight-dark-800w.webp differ diff --git a/docs/static/screenshots/Bars/vertical-tooltip-and-clipped-highlight-light-240w.webp b/docs/static/screenshots/Bars/vertical-tooltip-and-clipped-highlight-light-240w.webp index 4d0893ed6d..1676f64f47 100644 Binary files a/docs/static/screenshots/Bars/vertical-tooltip-and-clipped-highlight-light-240w.webp and b/docs/static/screenshots/Bars/vertical-tooltip-and-clipped-highlight-light-240w.webp differ diff --git a/docs/static/screenshots/Bars/vertical-tooltip-and-clipped-highlight-light-400w.webp b/docs/static/screenshots/Bars/vertical-tooltip-and-clipped-highlight-light-400w.webp index 4597abfb03..ae5ad4653b 100644 Binary files a/docs/static/screenshots/Bars/vertical-tooltip-and-clipped-highlight-light-400w.webp and b/docs/static/screenshots/Bars/vertical-tooltip-and-clipped-highlight-light-400w.webp differ diff --git a/docs/static/screenshots/Bars/vertical-tooltip-and-clipped-highlight-light-800w.webp b/docs/static/screenshots/Bars/vertical-tooltip-and-clipped-highlight-light-800w.webp index 5cc75afab5..ff2d6b26fc 100644 Binary files a/docs/static/screenshots/Bars/vertical-tooltip-and-clipped-highlight-light-800w.webp and b/docs/static/screenshots/Bars/vertical-tooltip-and-clipped-highlight-light-800w.webp differ diff --git a/docs/static/screenshots/Bars/vertical-tooltip-and-highlight-dark-240w.webp b/docs/static/screenshots/Bars/vertical-tooltip-and-highlight-dark-240w.webp index 29ae36da37..fd56ff2b16 100644 Binary files a/docs/static/screenshots/Bars/vertical-tooltip-and-highlight-dark-240w.webp and b/docs/static/screenshots/Bars/vertical-tooltip-and-highlight-dark-240w.webp differ diff --git a/docs/static/screenshots/Bars/vertical-tooltip-and-highlight-dark-400w.webp b/docs/static/screenshots/Bars/vertical-tooltip-and-highlight-dark-400w.webp index bc82cf5548..33805bb049 100644 Binary files a/docs/static/screenshots/Bars/vertical-tooltip-and-highlight-dark-400w.webp and b/docs/static/screenshots/Bars/vertical-tooltip-and-highlight-dark-400w.webp differ diff --git a/docs/static/screenshots/Bars/vertical-tooltip-and-highlight-dark-800w.webp b/docs/static/screenshots/Bars/vertical-tooltip-and-highlight-dark-800w.webp index 77013799f3..d0860e814d 100644 Binary files a/docs/static/screenshots/Bars/vertical-tooltip-and-highlight-dark-800w.webp and b/docs/static/screenshots/Bars/vertical-tooltip-and-highlight-dark-800w.webp differ diff --git a/docs/static/screenshots/Bars/vertical-tooltip-and-highlight-light-240w.webp b/docs/static/screenshots/Bars/vertical-tooltip-and-highlight-light-240w.webp index 4344392365..bc5119cc4d 100644 Binary files a/docs/static/screenshots/Bars/vertical-tooltip-and-highlight-light-240w.webp and b/docs/static/screenshots/Bars/vertical-tooltip-and-highlight-light-240w.webp differ diff --git a/docs/static/screenshots/Bars/vertical-tooltip-and-highlight-light-400w.webp b/docs/static/screenshots/Bars/vertical-tooltip-and-highlight-light-400w.webp index 1ecf6fe8ac..bf3da46fde 100644 Binary files a/docs/static/screenshots/Bars/vertical-tooltip-and-highlight-light-400w.webp and b/docs/static/screenshots/Bars/vertical-tooltip-and-highlight-light-400w.webp differ diff --git a/docs/static/screenshots/Bars/vertical-tooltip-and-highlight-light-800w.webp b/docs/static/screenshots/Bars/vertical-tooltip-and-highlight-light-800w.webp index 841a30a69c..21721467ba 100644 Binary files a/docs/static/screenshots/Bars/vertical-tooltip-and-highlight-light-800w.webp and b/docs/static/screenshots/Bars/vertical-tooltip-and-highlight-light-800w.webp differ diff --git a/docs/static/screenshots/Bars/vertical-tween-on-mount-dark-240w.webp b/docs/static/screenshots/Bars/vertical-tween-on-mount-dark-240w.webp index 8d1373679e..69731f531f 100644 Binary files a/docs/static/screenshots/Bars/vertical-tween-on-mount-dark-240w.webp and b/docs/static/screenshots/Bars/vertical-tween-on-mount-dark-240w.webp differ diff --git a/docs/static/screenshots/Bars/vertical-tween-on-mount-dark-400w.webp b/docs/static/screenshots/Bars/vertical-tween-on-mount-dark-400w.webp index 882165da97..9a541a4cfa 100644 Binary files a/docs/static/screenshots/Bars/vertical-tween-on-mount-dark-400w.webp and b/docs/static/screenshots/Bars/vertical-tween-on-mount-dark-400w.webp differ diff --git a/docs/static/screenshots/Bars/vertical-tween-on-mount-dark-800w.webp b/docs/static/screenshots/Bars/vertical-tween-on-mount-dark-800w.webp index b16ca11bde..7fa035aa98 100644 Binary files a/docs/static/screenshots/Bars/vertical-tween-on-mount-dark-800w.webp and b/docs/static/screenshots/Bars/vertical-tween-on-mount-dark-800w.webp differ diff --git a/docs/static/screenshots/Bars/vertical-tween-on-mount-light-240w.webp b/docs/static/screenshots/Bars/vertical-tween-on-mount-light-240w.webp index 7e5f9367cb..2a7831d66c 100644 Binary files a/docs/static/screenshots/Bars/vertical-tween-on-mount-light-240w.webp and b/docs/static/screenshots/Bars/vertical-tween-on-mount-light-240w.webp differ diff --git a/docs/static/screenshots/Bars/vertical-tween-on-mount-light-400w.webp b/docs/static/screenshots/Bars/vertical-tween-on-mount-light-400w.webp index 030cc8bf00..fac3da6a6b 100644 Binary files a/docs/static/screenshots/Bars/vertical-tween-on-mount-light-400w.webp and b/docs/static/screenshots/Bars/vertical-tween-on-mount-light-400w.webp differ diff --git a/docs/static/screenshots/Bars/vertical-tween-on-mount-light-800w.webp b/docs/static/screenshots/Bars/vertical-tween-on-mount-light-800w.webp index dc683511b4..4e7add8139 100644 Binary files a/docs/static/screenshots/Bars/vertical-tween-on-mount-light-800w.webp and b/docs/static/screenshots/Bars/vertical-tween-on-mount-light-800w.webp differ diff --git a/docs/static/screenshots/Bars/vertical-tween-on-mount-rounded-edge-dark-240w.webp b/docs/static/screenshots/Bars/vertical-tween-on-mount-rounded-edge-dark-240w.webp index 7c83bcce24..69be9e71ec 100644 Binary files a/docs/static/screenshots/Bars/vertical-tween-on-mount-rounded-edge-dark-240w.webp and b/docs/static/screenshots/Bars/vertical-tween-on-mount-rounded-edge-dark-240w.webp differ diff --git a/docs/static/screenshots/Bars/vertical-tween-on-mount-rounded-edge-dark-400w.webp b/docs/static/screenshots/Bars/vertical-tween-on-mount-rounded-edge-dark-400w.webp index 1154aa2504..ec0fa337bc 100644 Binary files a/docs/static/screenshots/Bars/vertical-tween-on-mount-rounded-edge-dark-400w.webp and b/docs/static/screenshots/Bars/vertical-tween-on-mount-rounded-edge-dark-400w.webp differ diff --git a/docs/static/screenshots/Bars/vertical-tween-on-mount-rounded-edge-dark-800w.webp b/docs/static/screenshots/Bars/vertical-tween-on-mount-rounded-edge-dark-800w.webp index 8a01c5f506..4f1d77baaa 100644 Binary files a/docs/static/screenshots/Bars/vertical-tween-on-mount-rounded-edge-dark-800w.webp and b/docs/static/screenshots/Bars/vertical-tween-on-mount-rounded-edge-dark-800w.webp differ diff --git a/docs/static/screenshots/Bars/vertical-tween-on-mount-rounded-edge-light-240w.webp b/docs/static/screenshots/Bars/vertical-tween-on-mount-rounded-edge-light-240w.webp index 53e1aa551b..a75343dfd9 100644 Binary files a/docs/static/screenshots/Bars/vertical-tween-on-mount-rounded-edge-light-240w.webp and b/docs/static/screenshots/Bars/vertical-tween-on-mount-rounded-edge-light-240w.webp differ diff --git a/docs/static/screenshots/Bars/vertical-tween-on-mount-rounded-edge-light-400w.webp b/docs/static/screenshots/Bars/vertical-tween-on-mount-rounded-edge-light-400w.webp index 73722e06a4..dcd55e797a 100644 Binary files a/docs/static/screenshots/Bars/vertical-tween-on-mount-rounded-edge-light-400w.webp and b/docs/static/screenshots/Bars/vertical-tween-on-mount-rounded-edge-light-400w.webp differ diff --git a/docs/static/screenshots/Bars/vertical-tween-on-mount-rounded-edge-light-800w.webp b/docs/static/screenshots/Bars/vertical-tween-on-mount-rounded-edge-light-800w.webp index e1acf504e5..26877e6c53 100644 Binary files a/docs/static/screenshots/Bars/vertical-tween-on-mount-rounded-edge-light-800w.webp and b/docs/static/screenshots/Bars/vertical-tween-on-mount-rounded-edge-light-800w.webp differ diff --git a/docs/static/screenshots/Bars/vertical-with-grid-on-top-dark-240w.webp b/docs/static/screenshots/Bars/vertical-with-grid-on-top-dark-240w.webp index 6a8427dc31..373eb550c5 100644 Binary files a/docs/static/screenshots/Bars/vertical-with-grid-on-top-dark-240w.webp and b/docs/static/screenshots/Bars/vertical-with-grid-on-top-dark-240w.webp differ diff --git a/docs/static/screenshots/Bars/vertical-with-grid-on-top-dark-400w.webp b/docs/static/screenshots/Bars/vertical-with-grid-on-top-dark-400w.webp index d46ae6a965..ae69100999 100644 Binary files a/docs/static/screenshots/Bars/vertical-with-grid-on-top-dark-400w.webp and b/docs/static/screenshots/Bars/vertical-with-grid-on-top-dark-400w.webp differ diff --git a/docs/static/screenshots/Bars/vertical-with-grid-on-top-dark-800w.webp b/docs/static/screenshots/Bars/vertical-with-grid-on-top-dark-800w.webp index 53aea34dbe..652710b34a 100644 Binary files a/docs/static/screenshots/Bars/vertical-with-grid-on-top-dark-800w.webp and b/docs/static/screenshots/Bars/vertical-with-grid-on-top-dark-800w.webp differ diff --git a/docs/static/screenshots/Bars/vertical-with-grid-on-top-light-240w.webp b/docs/static/screenshots/Bars/vertical-with-grid-on-top-light-240w.webp index 81e418c065..f34d5ef9ee 100644 Binary files a/docs/static/screenshots/Bars/vertical-with-grid-on-top-light-240w.webp and b/docs/static/screenshots/Bars/vertical-with-grid-on-top-light-240w.webp differ diff --git a/docs/static/screenshots/Bars/vertical-with-grid-on-top-light-400w.webp b/docs/static/screenshots/Bars/vertical-with-grid-on-top-light-400w.webp index f3bf091d26..ac758612ab 100644 Binary files a/docs/static/screenshots/Bars/vertical-with-grid-on-top-light-400w.webp and b/docs/static/screenshots/Bars/vertical-with-grid-on-top-light-400w.webp differ diff --git a/docs/static/screenshots/Bars/vertical-with-grid-on-top-light-800w.webp b/docs/static/screenshots/Bars/vertical-with-grid-on-top-light-800w.webp index 3c2cafb673..8ee8a53d1c 100644 Binary files a/docs/static/screenshots/Bars/vertical-with-grid-on-top-light-800w.webp and b/docs/static/screenshots/Bars/vertical-with-grid-on-top-light-800w.webp differ diff --git a/docs/static/screenshots/Bars/vertical-with-grid-on-top-mix-blend-dark-240w.webp b/docs/static/screenshots/Bars/vertical-with-grid-on-top-mix-blend-dark-240w.webp index cfcd2d2be7..32549576fa 100644 Binary files a/docs/static/screenshots/Bars/vertical-with-grid-on-top-mix-blend-dark-240w.webp and b/docs/static/screenshots/Bars/vertical-with-grid-on-top-mix-blend-dark-240w.webp differ diff --git a/docs/static/screenshots/Bars/vertical-with-grid-on-top-mix-blend-dark-400w.webp b/docs/static/screenshots/Bars/vertical-with-grid-on-top-mix-blend-dark-400w.webp index 548fae9233..73ae80c2ee 100644 Binary files a/docs/static/screenshots/Bars/vertical-with-grid-on-top-mix-blend-dark-400w.webp and b/docs/static/screenshots/Bars/vertical-with-grid-on-top-mix-blend-dark-400w.webp differ diff --git a/docs/static/screenshots/Bars/vertical-with-grid-on-top-mix-blend-dark-800w.webp b/docs/static/screenshots/Bars/vertical-with-grid-on-top-mix-blend-dark-800w.webp index 5d06219422..744217b3ba 100644 Binary files a/docs/static/screenshots/Bars/vertical-with-grid-on-top-mix-blend-dark-800w.webp and b/docs/static/screenshots/Bars/vertical-with-grid-on-top-mix-blend-dark-800w.webp differ diff --git a/docs/static/screenshots/Bars/vertical-with-grid-on-top-mix-blend-light-240w.webp b/docs/static/screenshots/Bars/vertical-with-grid-on-top-mix-blend-light-240w.webp index b5d37c5542..1d501ea428 100644 Binary files a/docs/static/screenshots/Bars/vertical-with-grid-on-top-mix-blend-light-240w.webp and b/docs/static/screenshots/Bars/vertical-with-grid-on-top-mix-blend-light-240w.webp differ diff --git a/docs/static/screenshots/Bars/vertical-with-grid-on-top-mix-blend-light-400w.webp b/docs/static/screenshots/Bars/vertical-with-grid-on-top-mix-blend-light-400w.webp index 2479e583fb..1f193f4071 100644 Binary files a/docs/static/screenshots/Bars/vertical-with-grid-on-top-mix-blend-light-400w.webp and b/docs/static/screenshots/Bars/vertical-with-grid-on-top-mix-blend-light-400w.webp differ diff --git a/docs/static/screenshots/Bars/vertical-with-grid-on-top-mix-blend-light-800w.webp b/docs/static/screenshots/Bars/vertical-with-grid-on-top-mix-blend-light-800w.webp index 590d88dfbe..4b91e281a6 100644 Binary files a/docs/static/screenshots/Bars/vertical-with-grid-on-top-mix-blend-light-800w.webp and b/docs/static/screenshots/Bars/vertical-with-grid-on-top-mix-blend-light-800w.webp differ diff --git a/docs/static/screenshots/BoxPlot/with-violin-dark-240w.webp b/docs/static/screenshots/BoxPlot/with-violin-dark-240w.webp index 602ecb1f8e..65ed1a68bd 100644 Binary files a/docs/static/screenshots/BoxPlot/with-violin-dark-240w.webp and b/docs/static/screenshots/BoxPlot/with-violin-dark-240w.webp differ diff --git a/docs/static/screenshots/BoxPlot/with-violin-dark-400w.webp b/docs/static/screenshots/BoxPlot/with-violin-dark-400w.webp index af1df1babb..b0867681d6 100644 Binary files a/docs/static/screenshots/BoxPlot/with-violin-dark-400w.webp and b/docs/static/screenshots/BoxPlot/with-violin-dark-400w.webp differ diff --git a/docs/static/screenshots/BoxPlot/with-violin-dark-800w.webp b/docs/static/screenshots/BoxPlot/with-violin-dark-800w.webp index e87bd45fa1..21025c93e5 100644 Binary files a/docs/static/screenshots/BoxPlot/with-violin-dark-800w.webp and b/docs/static/screenshots/BoxPlot/with-violin-dark-800w.webp differ diff --git a/docs/static/screenshots/BoxPlot/with-violin-light-240w.webp b/docs/static/screenshots/BoxPlot/with-violin-light-240w.webp index f84e77c272..83a9cf6b6e 100644 Binary files a/docs/static/screenshots/BoxPlot/with-violin-light-240w.webp and b/docs/static/screenshots/BoxPlot/with-violin-light-240w.webp differ diff --git a/docs/static/screenshots/BoxPlot/with-violin-light-400w.webp b/docs/static/screenshots/BoxPlot/with-violin-light-400w.webp index 6cb0dcb656..802f7e2721 100644 Binary files a/docs/static/screenshots/BoxPlot/with-violin-light-400w.webp and b/docs/static/screenshots/BoxPlot/with-violin-light-400w.webp differ diff --git a/docs/static/screenshots/BoxPlot/with-violin-light-800w.webp b/docs/static/screenshots/BoxPlot/with-violin-light-800w.webp index ce6b79a09d..7861bda431 100644 Binary files a/docs/static/screenshots/BoxPlot/with-violin-light-800w.webp and b/docs/static/screenshots/BoxPlot/with-violin-light-800w.webp differ diff --git a/docs/static/screenshots/Brush/basic-dark-240w.webp b/docs/static/screenshots/Brush/basic-dark-240w.webp new file mode 100644 index 0000000000..2aad60dc0b Binary files /dev/null and b/docs/static/screenshots/Brush/basic-dark-240w.webp differ diff --git a/docs/static/screenshots/Brush/basic-dark-400w.webp b/docs/static/screenshots/Brush/basic-dark-400w.webp new file mode 100644 index 0000000000..8c694ce416 Binary files /dev/null and b/docs/static/screenshots/Brush/basic-dark-400w.webp differ diff --git a/docs/static/screenshots/Brush/basic-dark-800w.webp b/docs/static/screenshots/Brush/basic-dark-800w.webp new file mode 100644 index 0000000000..314767d41e Binary files /dev/null and b/docs/static/screenshots/Brush/basic-dark-800w.webp differ diff --git a/docs/static/screenshots/Brush/basic-light-240w.webp b/docs/static/screenshots/Brush/basic-light-240w.webp new file mode 100644 index 0000000000..9805e5fe37 Binary files /dev/null and b/docs/static/screenshots/Brush/basic-light-240w.webp differ diff --git a/docs/static/screenshots/Brush/basic-light-400w.webp b/docs/static/screenshots/Brush/basic-light-400w.webp new file mode 100644 index 0000000000..d5e188a383 Binary files /dev/null and b/docs/static/screenshots/Brush/basic-light-400w.webp differ diff --git a/docs/static/screenshots/Brush/basic-light-800w.webp b/docs/static/screenshots/Brush/basic-light-800w.webp new file mode 100644 index 0000000000..7110ea2df5 Binary files /dev/null and b/docs/static/screenshots/Brush/basic-light-800w.webp differ diff --git a/docs/static/screenshots/Brush/html-dark-240w.webp b/docs/static/screenshots/Brush/html-dark-240w.webp new file mode 100644 index 0000000000..2aad60dc0b Binary files /dev/null and b/docs/static/screenshots/Brush/html-dark-240w.webp differ diff --git a/docs/static/screenshots/Brush/html-dark-400w.webp b/docs/static/screenshots/Brush/html-dark-400w.webp new file mode 100644 index 0000000000..8c694ce416 Binary files /dev/null and b/docs/static/screenshots/Brush/html-dark-400w.webp differ diff --git a/docs/static/screenshots/Brush/html-dark-800w.webp b/docs/static/screenshots/Brush/html-dark-800w.webp new file mode 100644 index 0000000000..314767d41e Binary files /dev/null and b/docs/static/screenshots/Brush/html-dark-800w.webp differ diff --git a/docs/static/screenshots/Brush/html-light-240w.webp b/docs/static/screenshots/Brush/html-light-240w.webp new file mode 100644 index 0000000000..9805e5fe37 Binary files /dev/null and b/docs/static/screenshots/Brush/html-light-240w.webp differ diff --git a/docs/static/screenshots/Brush/html-light-400w.webp b/docs/static/screenshots/Brush/html-light-400w.webp new file mode 100644 index 0000000000..d5e188a383 Binary files /dev/null and b/docs/static/screenshots/Brush/html-light-400w.webp differ diff --git a/docs/static/screenshots/Brush/html-light-800w.webp b/docs/static/screenshots/Brush/html-light-800w.webp new file mode 100644 index 0000000000..7110ea2df5 Binary files /dev/null and b/docs/static/screenshots/Brush/html-light-800w.webp differ diff --git a/docs/static/screenshots/Brush/programmatic-dark-240w.webp b/docs/static/screenshots/Brush/programmatic-dark-240w.webp new file mode 100644 index 0000000000..e3cd6221d9 Binary files /dev/null and b/docs/static/screenshots/Brush/programmatic-dark-240w.webp differ diff --git a/docs/static/screenshots/Brush/programmatic-dark-400w.webp b/docs/static/screenshots/Brush/programmatic-dark-400w.webp new file mode 100644 index 0000000000..a100815d67 Binary files /dev/null and b/docs/static/screenshots/Brush/programmatic-dark-400w.webp differ diff --git a/docs/static/screenshots/Brush/programmatic-dark-800w.webp b/docs/static/screenshots/Brush/programmatic-dark-800w.webp new file mode 100644 index 0000000000..aebe2726d8 Binary files /dev/null and b/docs/static/screenshots/Brush/programmatic-dark-800w.webp differ diff --git a/docs/static/screenshots/Brush/programmatic-light-240w.webp b/docs/static/screenshots/Brush/programmatic-light-240w.webp new file mode 100644 index 0000000000..6fe6954657 Binary files /dev/null and b/docs/static/screenshots/Brush/programmatic-light-240w.webp differ diff --git a/docs/static/screenshots/Brush/programmatic-light-400w.webp b/docs/static/screenshots/Brush/programmatic-light-400w.webp new file mode 100644 index 0000000000..dfde4604a4 Binary files /dev/null and b/docs/static/screenshots/Brush/programmatic-light-400w.webp differ diff --git a/docs/static/screenshots/Brush/programmatic-light-800w.webp b/docs/static/screenshots/Brush/programmatic-light-800w.webp new file mode 100644 index 0000000000..37cc74722f Binary files /dev/null and b/docs/static/screenshots/Brush/programmatic-light-800w.webp differ diff --git a/docs/static/screenshots/Brush/region-dark-240w.webp b/docs/static/screenshots/Brush/region-dark-240w.webp new file mode 100644 index 0000000000..d5e36e5aa2 Binary files /dev/null and b/docs/static/screenshots/Brush/region-dark-240w.webp differ diff --git a/docs/static/screenshots/Brush/region-dark-400w.webp b/docs/static/screenshots/Brush/region-dark-400w.webp new file mode 100644 index 0000000000..cdd14165bd Binary files /dev/null and b/docs/static/screenshots/Brush/region-dark-400w.webp differ diff --git a/docs/static/screenshots/Brush/region-dark-800w.webp b/docs/static/screenshots/Brush/region-dark-800w.webp new file mode 100644 index 0000000000..fae4b890b8 Binary files /dev/null and b/docs/static/screenshots/Brush/region-dark-800w.webp differ diff --git a/docs/static/screenshots/Brush/region-light-240w.webp b/docs/static/screenshots/Brush/region-light-240w.webp new file mode 100644 index 0000000000..7f1290cad0 Binary files /dev/null and b/docs/static/screenshots/Brush/region-light-240w.webp differ diff --git a/docs/static/screenshots/Brush/region-light-400w.webp b/docs/static/screenshots/Brush/region-light-400w.webp new file mode 100644 index 0000000000..72ee3bbb70 Binary files /dev/null and b/docs/static/screenshots/Brush/region-light-400w.webp differ diff --git a/docs/static/screenshots/Brush/region-light-800w.webp b/docs/static/screenshots/Brush/region-light-800w.webp new file mode 100644 index 0000000000..98e1812215 Binary files /dev/null and b/docs/static/screenshots/Brush/region-light-800w.webp differ diff --git a/docs/static/screenshots/Brush/two-dimensional-dark-240w.webp b/docs/static/screenshots/Brush/two-dimensional-dark-240w.webp new file mode 100644 index 0000000000..c70b0ecef2 Binary files /dev/null and b/docs/static/screenshots/Brush/two-dimensional-dark-240w.webp differ diff --git a/docs/static/screenshots/Brush/two-dimensional-dark-400w.webp b/docs/static/screenshots/Brush/two-dimensional-dark-400w.webp new file mode 100644 index 0000000000..e64ca55107 Binary files /dev/null and b/docs/static/screenshots/Brush/two-dimensional-dark-400w.webp differ diff --git a/docs/static/screenshots/Brush/two-dimensional-dark-800w.webp b/docs/static/screenshots/Brush/two-dimensional-dark-800w.webp new file mode 100644 index 0000000000..4d2c94048d Binary files /dev/null and b/docs/static/screenshots/Brush/two-dimensional-dark-800w.webp differ diff --git a/docs/static/screenshots/Brush/two-dimensional-light-240w.webp b/docs/static/screenshots/Brush/two-dimensional-light-240w.webp new file mode 100644 index 0000000000..7494af7e48 Binary files /dev/null and b/docs/static/screenshots/Brush/two-dimensional-light-240w.webp differ diff --git a/docs/static/screenshots/Brush/two-dimensional-light-400w.webp b/docs/static/screenshots/Brush/two-dimensional-light-400w.webp new file mode 100644 index 0000000000..d2869f1614 Binary files /dev/null and b/docs/static/screenshots/Brush/two-dimensional-light-400w.webp differ diff --git a/docs/static/screenshots/Brush/two-dimensional-light-800w.webp b/docs/static/screenshots/Brush/two-dimensional-light-800w.webp new file mode 100644 index 0000000000..06d6972745 Binary files /dev/null and b/docs/static/screenshots/Brush/two-dimensional-light-800w.webp differ diff --git a/docs/static/screenshots/Brush/vertical-dark-240w.webp b/docs/static/screenshots/Brush/vertical-dark-240w.webp new file mode 100644 index 0000000000..2aad60dc0b Binary files /dev/null and b/docs/static/screenshots/Brush/vertical-dark-240w.webp differ diff --git a/docs/static/screenshots/Brush/vertical-dark-400w.webp b/docs/static/screenshots/Brush/vertical-dark-400w.webp new file mode 100644 index 0000000000..8c694ce416 Binary files /dev/null and b/docs/static/screenshots/Brush/vertical-dark-400w.webp differ diff --git a/docs/static/screenshots/Brush/vertical-dark-800w.webp b/docs/static/screenshots/Brush/vertical-dark-800w.webp new file mode 100644 index 0000000000..314767d41e Binary files /dev/null and b/docs/static/screenshots/Brush/vertical-dark-800w.webp differ diff --git a/docs/static/screenshots/Brush/vertical-light-240w.webp b/docs/static/screenshots/Brush/vertical-light-240w.webp new file mode 100644 index 0000000000..9805e5fe37 Binary files /dev/null and b/docs/static/screenshots/Brush/vertical-light-240w.webp differ diff --git a/docs/static/screenshots/Brush/vertical-light-400w.webp b/docs/static/screenshots/Brush/vertical-light-400w.webp new file mode 100644 index 0000000000..d5e188a383 Binary files /dev/null and b/docs/static/screenshots/Brush/vertical-light-400w.webp differ diff --git a/docs/static/screenshots/Brush/vertical-light-800w.webp b/docs/static/screenshots/Brush/vertical-light-800w.webp new file mode 100644 index 0000000000..7110ea2df5 Binary files /dev/null and b/docs/static/screenshots/Brush/vertical-light-800w.webp differ diff --git a/docs/static/screenshots/BrushContext/flame-chart-dark-240w.webp b/docs/static/screenshots/BrushContext/flame-chart-dark-240w.webp index a26ee964b6..7453e1ab42 100644 Binary files a/docs/static/screenshots/BrushContext/flame-chart-dark-240w.webp and b/docs/static/screenshots/BrushContext/flame-chart-dark-240w.webp differ diff --git a/docs/static/screenshots/BrushContext/flame-chart-dark-400w.webp b/docs/static/screenshots/BrushContext/flame-chart-dark-400w.webp index 9f6001fcbc..4d59fe2c0f 100644 Binary files a/docs/static/screenshots/BrushContext/flame-chart-dark-400w.webp and b/docs/static/screenshots/BrushContext/flame-chart-dark-400w.webp differ diff --git a/docs/static/screenshots/BrushContext/flame-chart-dark-800w.webp b/docs/static/screenshots/BrushContext/flame-chart-dark-800w.webp index bbe8ea124f..022ca8fe7e 100644 Binary files a/docs/static/screenshots/BrushContext/flame-chart-dark-800w.webp and b/docs/static/screenshots/BrushContext/flame-chart-dark-800w.webp differ diff --git a/docs/static/screenshots/BrushContext/flame-chart-light-240w.webp b/docs/static/screenshots/BrushContext/flame-chart-light-240w.webp index 062936dd7e..8490fa2fd2 100644 Binary files a/docs/static/screenshots/BrushContext/flame-chart-light-240w.webp and b/docs/static/screenshots/BrushContext/flame-chart-light-240w.webp differ diff --git a/docs/static/screenshots/BrushContext/flame-chart-light-400w.webp b/docs/static/screenshots/BrushContext/flame-chart-light-400w.webp index b2e88b4c0f..eefea32d6e 100644 Binary files a/docs/static/screenshots/BrushContext/flame-chart-light-400w.webp and b/docs/static/screenshots/BrushContext/flame-chart-light-400w.webp differ diff --git a/docs/static/screenshots/BrushContext/flame-chart-light-800w.webp b/docs/static/screenshots/BrushContext/flame-chart-light-800w.webp index c132845327..f672903ef2 100644 Binary files a/docs/static/screenshots/BrushContext/flame-chart-light-800w.webp and b/docs/static/screenshots/BrushContext/flame-chart-light-800w.webp differ diff --git a/docs/static/screenshots/BrushContext/integrated-brush-(both-axis-area)-dark-240w.webp b/docs/static/screenshots/BrushContext/integrated-brush-(both-axis-area)-dark-240w.webp index 9854214cc4..9713530a1d 100644 Binary files a/docs/static/screenshots/BrushContext/integrated-brush-(both-axis-area)-dark-240w.webp and b/docs/static/screenshots/BrushContext/integrated-brush-(both-axis-area)-dark-240w.webp differ diff --git a/docs/static/screenshots/BrushContext/integrated-brush-(both-axis-area)-dark-400w.webp b/docs/static/screenshots/BrushContext/integrated-brush-(both-axis-area)-dark-400w.webp index 3d2e03cfdf..35d140d972 100644 Binary files a/docs/static/screenshots/BrushContext/integrated-brush-(both-axis-area)-dark-400w.webp and b/docs/static/screenshots/BrushContext/integrated-brush-(both-axis-area)-dark-400w.webp differ diff --git a/docs/static/screenshots/BrushContext/integrated-brush-(both-axis-area)-dark-800w.webp b/docs/static/screenshots/BrushContext/integrated-brush-(both-axis-area)-dark-800w.webp index c98f7ca8e0..fc97c820c4 100644 Binary files a/docs/static/screenshots/BrushContext/integrated-brush-(both-axis-area)-dark-800w.webp and b/docs/static/screenshots/BrushContext/integrated-brush-(both-axis-area)-dark-800w.webp differ diff --git a/docs/static/screenshots/BrushContext/integrated-brush-(x-axis)-dark-240w.webp b/docs/static/screenshots/BrushContext/integrated-brush-(x-axis)-dark-240w.webp index 4c98a0cfff..36e3897d28 100644 Binary files a/docs/static/screenshots/BrushContext/integrated-brush-(x-axis)-dark-240w.webp and b/docs/static/screenshots/BrushContext/integrated-brush-(x-axis)-dark-240w.webp differ diff --git a/docs/static/screenshots/BrushContext/integrated-brush-(x-axis)-dark-800w.webp b/docs/static/screenshots/BrushContext/integrated-brush-(x-axis)-dark-800w.webp index 116f583c15..1e50e0d5e8 100644 Binary files a/docs/static/screenshots/BrushContext/integrated-brush-(x-axis)-dark-800w.webp and b/docs/static/screenshots/BrushContext/integrated-brush-(x-axis)-dark-800w.webp differ diff --git a/docs/static/screenshots/BrushContext/integrated-brush-(y-axis)-dark-240w.webp b/docs/static/screenshots/BrushContext/integrated-brush-(y-axis)-dark-240w.webp index 9854214cc4..9713530a1d 100644 Binary files a/docs/static/screenshots/BrushContext/integrated-brush-(y-axis)-dark-240w.webp and b/docs/static/screenshots/BrushContext/integrated-brush-(y-axis)-dark-240w.webp differ diff --git a/docs/static/screenshots/BrushContext/integrated-brush-(y-axis)-dark-400w.webp b/docs/static/screenshots/BrushContext/integrated-brush-(y-axis)-dark-400w.webp index 3d2e03cfdf..35d140d972 100644 Binary files a/docs/static/screenshots/BrushContext/integrated-brush-(y-axis)-dark-400w.webp and b/docs/static/screenshots/BrushContext/integrated-brush-(y-axis)-dark-400w.webp differ diff --git a/docs/static/screenshots/BrushContext/integrated-brush-(y-axis)-dark-800w.webp b/docs/static/screenshots/BrushContext/integrated-brush-(y-axis)-dark-800w.webp index c98f7ca8e0..fc97c820c4 100644 Binary files a/docs/static/screenshots/BrushContext/integrated-brush-(y-axis)-dark-800w.webp and b/docs/static/screenshots/BrushContext/integrated-brush-(y-axis)-dark-800w.webp differ diff --git a/docs/static/screenshots/BrushContext/max-window-dark-400w.webp b/docs/static/screenshots/BrushContext/max-window-dark-400w.webp index e57d3e393c..24c1a0bab8 100644 Binary files a/docs/static/screenshots/BrushContext/max-window-dark-400w.webp and b/docs/static/screenshots/BrushContext/max-window-dark-400w.webp differ diff --git a/docs/static/screenshots/BrushContext/max-window-dark-800w.webp b/docs/static/screenshots/BrushContext/max-window-dark-800w.webp index f052535f44..c322b105b3 100644 Binary files a/docs/static/screenshots/BrushContext/max-window-dark-800w.webp and b/docs/static/screenshots/BrushContext/max-window-dark-800w.webp differ diff --git a/docs/static/screenshots/BrushContext/max-window-light-800w.webp b/docs/static/screenshots/BrushContext/max-window-light-800w.webp index 440efb43ce..a982213267 100644 Binary files a/docs/static/screenshots/BrushContext/max-window-light-800w.webp and b/docs/static/screenshots/BrushContext/max-window-light-800w.webp differ diff --git a/docs/static/screenshots/BrushContext/min-max-extent-dark-240w.webp b/docs/static/screenshots/BrushContext/min-max-extent-dark-240w.webp index 483271debb..a1dca2d300 100644 Binary files a/docs/static/screenshots/BrushContext/min-max-extent-dark-240w.webp and b/docs/static/screenshots/BrushContext/min-max-extent-dark-240w.webp differ diff --git a/docs/static/screenshots/BrushContext/min-max-extent-dark-800w.webp b/docs/static/screenshots/BrushContext/min-max-extent-dark-800w.webp index 2e1589ac5a..a74f938f36 100644 Binary files a/docs/static/screenshots/BrushContext/min-max-extent-dark-800w.webp and b/docs/static/screenshots/BrushContext/min-max-extent-dark-800w.webp differ diff --git a/docs/static/screenshots/BrushContext/min-max-extent-light-400w.webp b/docs/static/screenshots/BrushContext/min-max-extent-light-400w.webp index 4fff954de5..c8629c53a7 100644 Binary files a/docs/static/screenshots/BrushContext/min-max-extent-light-400w.webp and b/docs/static/screenshots/BrushContext/min-max-extent-light-400w.webp differ diff --git a/docs/static/screenshots/BrushContext/minimap-dark-240w.webp b/docs/static/screenshots/BrushContext/minimap-dark-240w.webp index 42d41ea2fd..1000c3e52f 100644 Binary files a/docs/static/screenshots/BrushContext/minimap-dark-240w.webp and b/docs/static/screenshots/BrushContext/minimap-dark-240w.webp differ diff --git a/docs/static/screenshots/BrushContext/minimap-dark-400w.webp b/docs/static/screenshots/BrushContext/minimap-dark-400w.webp index 71d7919e01..37c0b90f0e 100644 Binary files a/docs/static/screenshots/BrushContext/minimap-dark-400w.webp and b/docs/static/screenshots/BrushContext/minimap-dark-400w.webp differ diff --git a/docs/static/screenshots/BrushContext/minimap-dark-800w.webp b/docs/static/screenshots/BrushContext/minimap-dark-800w.webp index 1efceac86e..0671351e73 100644 Binary files a/docs/static/screenshots/BrushContext/minimap-dark-800w.webp and b/docs/static/screenshots/BrushContext/minimap-dark-800w.webp differ diff --git a/docs/static/screenshots/BrushContext/minimap-light-240w.webp b/docs/static/screenshots/BrushContext/minimap-light-240w.webp index 5ae135a505..38cfd331c0 100644 Binary files a/docs/static/screenshots/BrushContext/minimap-light-240w.webp and b/docs/static/screenshots/BrushContext/minimap-light-240w.webp differ diff --git a/docs/static/screenshots/BrushContext/minimap-light-400w.webp b/docs/static/screenshots/BrushContext/minimap-light-400w.webp index bb7dfc6c80..44c88464ed 100644 Binary files a/docs/static/screenshots/BrushContext/minimap-light-400w.webp and b/docs/static/screenshots/BrushContext/minimap-light-400w.webp differ diff --git a/docs/static/screenshots/BrushContext/minimap-light-800w.webp b/docs/static/screenshots/BrushContext/minimap-light-800w.webp index 09755611b7..1177a28ada 100644 Binary files a/docs/static/screenshots/BrushContext/minimap-light-800w.webp and b/docs/static/screenshots/BrushContext/minimap-light-800w.webp differ diff --git a/docs/static/screenshots/BrushContext/programmatic-control-dark-240w.webp b/docs/static/screenshots/BrushContext/programmatic-control-dark-240w.webp index 4d4f29401d..e3cd6221d9 100644 Binary files a/docs/static/screenshots/BrushContext/programmatic-control-dark-240w.webp and b/docs/static/screenshots/BrushContext/programmatic-control-dark-240w.webp differ diff --git a/docs/static/screenshots/BrushContext/programmatic-control-dark-800w.webp b/docs/static/screenshots/BrushContext/programmatic-control-dark-800w.webp index 4355055c47..aebe2726d8 100644 Binary files a/docs/static/screenshots/BrushContext/programmatic-control-dark-800w.webp and b/docs/static/screenshots/BrushContext/programmatic-control-dark-800w.webp differ diff --git a/docs/static/screenshots/BrushContext/selection-dark-240w.webp b/docs/static/screenshots/BrushContext/selection-dark-240w.webp index dab3667fa0..c98d21bb03 100644 Binary files a/docs/static/screenshots/BrushContext/selection-dark-240w.webp and b/docs/static/screenshots/BrushContext/selection-dark-240w.webp differ diff --git a/docs/static/screenshots/BrushContext/selection-dark-400w.webp b/docs/static/screenshots/BrushContext/selection-dark-400w.webp index fa5a66d7ea..adf5f00b92 100644 Binary files a/docs/static/screenshots/BrushContext/selection-dark-400w.webp and b/docs/static/screenshots/BrushContext/selection-dark-400w.webp differ diff --git a/docs/static/screenshots/BrushContext/selection-dark-800w.webp b/docs/static/screenshots/BrushContext/selection-dark-800w.webp index afc19309f9..7ac73b47da 100644 Binary files a/docs/static/screenshots/BrushContext/selection-dark-800w.webp and b/docs/static/screenshots/BrushContext/selection-dark-800w.webp differ diff --git a/docs/static/screenshots/BrushContext/selection-light-240w.webp b/docs/static/screenshots/BrushContext/selection-light-240w.webp index 4f561a4c99..7add00b805 100644 Binary files a/docs/static/screenshots/BrushContext/selection-light-240w.webp and b/docs/static/screenshots/BrushContext/selection-light-240w.webp differ diff --git a/docs/static/screenshots/BrushContext/selection-light-400w.webp b/docs/static/screenshots/BrushContext/selection-light-400w.webp index 373272edce..8d087d9d86 100644 Binary files a/docs/static/screenshots/BrushContext/selection-light-400w.webp and b/docs/static/screenshots/BrushContext/selection-light-400w.webp differ diff --git a/docs/static/screenshots/BrushContext/selection-light-800w.webp b/docs/static/screenshots/BrushContext/selection-light-800w.webp index b5fa0d1275..6835781f26 100644 Binary files a/docs/static/screenshots/BrushContext/selection-light-800w.webp and b/docs/static/screenshots/BrushContext/selection-light-800w.webp differ diff --git a/docs/static/screenshots/BrushContext/separate-chart-(clip-data)-dark-400w.webp b/docs/static/screenshots/BrushContext/separate-chart-(clip-data)-dark-400w.webp index b0d72c2a1b..6f6e0d3156 100644 Binary files a/docs/static/screenshots/BrushContext/separate-chart-(clip-data)-dark-400w.webp and b/docs/static/screenshots/BrushContext/separate-chart-(clip-data)-dark-400w.webp differ diff --git a/docs/static/screenshots/BrushContext/separate-chart-(clip-data)-dark-800w.webp b/docs/static/screenshots/BrushContext/separate-chart-(clip-data)-dark-800w.webp index 4f8901a64c..21df5d9441 100644 Binary files a/docs/static/screenshots/BrushContext/separate-chart-(clip-data)-dark-800w.webp and b/docs/static/screenshots/BrushContext/separate-chart-(clip-data)-dark-800w.webp differ diff --git a/docs/static/screenshots/BrushContext/separate-chart-(clip-data)-light-240w.webp b/docs/static/screenshots/BrushContext/separate-chart-(clip-data)-light-240w.webp index b1cceca920..fa4d41eed3 100644 Binary files a/docs/static/screenshots/BrushContext/separate-chart-(clip-data)-light-240w.webp and b/docs/static/screenshots/BrushContext/separate-chart-(clip-data)-light-240w.webp differ diff --git a/docs/static/screenshots/BrushContext/separate-chart-(clip-data)-light-400w.webp b/docs/static/screenshots/BrushContext/separate-chart-(clip-data)-light-400w.webp index 6ab8ee431c..d2d3600b3b 100644 Binary files a/docs/static/screenshots/BrushContext/separate-chart-(clip-data)-light-400w.webp and b/docs/static/screenshots/BrushContext/separate-chart-(clip-data)-light-400w.webp differ diff --git a/docs/static/screenshots/BrushContext/separate-chart-(clip-data-y-axis)-dark-240w.webp b/docs/static/screenshots/BrushContext/separate-chart-(clip-data-y-axis)-dark-240w.webp index e338670ec5..cc71fddd28 100644 Binary files a/docs/static/screenshots/BrushContext/separate-chart-(clip-data-y-axis)-dark-240w.webp and b/docs/static/screenshots/BrushContext/separate-chart-(clip-data-y-axis)-dark-240w.webp differ diff --git a/docs/static/screenshots/BrushContext/separate-chart-(clip-data-y-axis)-dark-400w.webp b/docs/static/screenshots/BrushContext/separate-chart-(clip-data-y-axis)-dark-400w.webp index 3d794ae697..8d21bc6a8b 100644 Binary files a/docs/static/screenshots/BrushContext/separate-chart-(clip-data-y-axis)-dark-400w.webp and b/docs/static/screenshots/BrushContext/separate-chart-(clip-data-y-axis)-dark-400w.webp differ diff --git a/docs/static/screenshots/BrushContext/separate-chart-(clip-data-y-axis)-dark-800w.webp b/docs/static/screenshots/BrushContext/separate-chart-(clip-data-y-axis)-dark-800w.webp index 8e81ba49c1..5f93062b23 100644 Binary files a/docs/static/screenshots/BrushContext/separate-chart-(clip-data-y-axis)-dark-800w.webp and b/docs/static/screenshots/BrushContext/separate-chart-(clip-data-y-axis)-dark-800w.webp differ diff --git a/docs/static/screenshots/BrushContext/separate-chart-(clip-data-y-axis)-light-240w.webp b/docs/static/screenshots/BrushContext/separate-chart-(clip-data-y-axis)-light-240w.webp index 1abed51262..4a2172bc0c 100644 Binary files a/docs/static/screenshots/BrushContext/separate-chart-(clip-data-y-axis)-light-240w.webp and b/docs/static/screenshots/BrushContext/separate-chart-(clip-data-y-axis)-light-240w.webp differ diff --git a/docs/static/screenshots/BrushContext/separate-chart-(clip-data-y-axis)-light-800w.webp b/docs/static/screenshots/BrushContext/separate-chart-(clip-data-y-axis)-light-800w.webp index 4e3d72d11e..8123183fc3 100644 Binary files a/docs/static/screenshots/BrushContext/separate-chart-(clip-data-y-axis)-light-800w.webp and b/docs/static/screenshots/BrushContext/separate-chart-(clip-data-y-axis)-light-800w.webp differ diff --git a/docs/static/screenshots/BrushContext/separate-chart-(filter-data)-dark-400w.webp b/docs/static/screenshots/BrushContext/separate-chart-(filter-data)-dark-400w.webp index 148ec5f9ba..c49ce0ce5a 100644 Binary files a/docs/static/screenshots/BrushContext/separate-chart-(filter-data)-dark-400w.webp and b/docs/static/screenshots/BrushContext/separate-chart-(filter-data)-dark-400w.webp differ diff --git a/docs/static/screenshots/BrushContext/separate-chart-(filter-data)-dark-800w.webp b/docs/static/screenshots/BrushContext/separate-chart-(filter-data)-dark-800w.webp index 56431cd249..5a41e4c9a2 100644 Binary files a/docs/static/screenshots/BrushContext/separate-chart-(filter-data)-dark-800w.webp and b/docs/static/screenshots/BrushContext/separate-chart-(filter-data)-dark-800w.webp differ diff --git a/docs/static/screenshots/BrushContext/separate-chart-(filter-data)-light-240w.webp b/docs/static/screenshots/BrushContext/separate-chart-(filter-data)-light-240w.webp index 9093b1dbcc..0b0bfd3f08 100644 Binary files a/docs/static/screenshots/BrushContext/separate-chart-(filter-data)-light-240w.webp and b/docs/static/screenshots/BrushContext/separate-chart-(filter-data)-light-240w.webp differ diff --git a/docs/static/screenshots/BrushContext/separate-chart-(filter-data)-light-400w.webp b/docs/static/screenshots/BrushContext/separate-chart-(filter-data)-light-400w.webp index 85cdd2c5b2..72a93a4188 100644 Binary files a/docs/static/screenshots/BrushContext/separate-chart-(filter-data)-light-400w.webp and b/docs/static/screenshots/BrushContext/separate-chart-(filter-data)-light-400w.webp differ diff --git a/docs/static/screenshots/BrushContext/snap-to-month-dark-240w.webp b/docs/static/screenshots/BrushContext/snap-to-month-dark-240w.webp index 483271debb..a1dca2d300 100644 Binary files a/docs/static/screenshots/BrushContext/snap-to-month-dark-240w.webp and b/docs/static/screenshots/BrushContext/snap-to-month-dark-240w.webp differ diff --git a/docs/static/screenshots/BrushContext/snap-to-month-dark-800w.webp b/docs/static/screenshots/BrushContext/snap-to-month-dark-800w.webp index 2e1589ac5a..a74f938f36 100644 Binary files a/docs/static/screenshots/BrushContext/snap-to-month-dark-800w.webp and b/docs/static/screenshots/BrushContext/snap-to-month-dark-800w.webp differ diff --git a/docs/static/screenshots/BrushContext/snap-to-month-light-400w.webp b/docs/static/screenshots/BrushContext/snap-to-month-light-400w.webp index 4fff954de5..c8629c53a7 100644 Binary files a/docs/static/screenshots/BrushContext/snap-to-month-light-400w.webp and b/docs/static/screenshots/BrushContext/snap-to-month-light-400w.webp differ diff --git a/docs/static/screenshots/BrushContext/synced-brushes-dark-240w.webp b/docs/static/screenshots/BrushContext/synced-brushes-dark-240w.webp index 27539f7733..9c911bea16 100644 Binary files a/docs/static/screenshots/BrushContext/synced-brushes-dark-240w.webp and b/docs/static/screenshots/BrushContext/synced-brushes-dark-240w.webp differ diff --git a/docs/static/screenshots/BrushContext/synced-brushes-dark-400w.webp b/docs/static/screenshots/BrushContext/synced-brushes-dark-400w.webp index 9db72a4786..2a12202923 100644 Binary files a/docs/static/screenshots/BrushContext/synced-brushes-dark-400w.webp and b/docs/static/screenshots/BrushContext/synced-brushes-dark-400w.webp differ diff --git a/docs/static/screenshots/BrushContext/synced-brushes-dark-800w.webp b/docs/static/screenshots/BrushContext/synced-brushes-dark-800w.webp index 7ad6376b0a..01e4ad6342 100644 Binary files a/docs/static/screenshots/BrushContext/synced-brushes-dark-800w.webp and b/docs/static/screenshots/BrushContext/synced-brushes-dark-800w.webp differ diff --git a/docs/static/screenshots/BrushContext/synced-brushes-light-240w.webp b/docs/static/screenshots/BrushContext/synced-brushes-light-240w.webp index bad5a98ff9..1e79fa20df 100644 Binary files a/docs/static/screenshots/BrushContext/synced-brushes-light-240w.webp and b/docs/static/screenshots/BrushContext/synced-brushes-light-240w.webp differ diff --git a/docs/static/screenshots/BrushContext/synced-brushes-light-400w.webp b/docs/static/screenshots/BrushContext/synced-brushes-light-400w.webp index aed123d9d1..dbe1c7a359 100644 Binary files a/docs/static/screenshots/BrushContext/synced-brushes-light-400w.webp and b/docs/static/screenshots/BrushContext/synced-brushes-light-400w.webp differ diff --git a/docs/static/screenshots/BrushContext/synced-brushes-light-800w.webp b/docs/static/screenshots/BrushContext/synced-brushes-light-800w.webp index 1ed851d10c..4b01bbb1c4 100644 Binary files a/docs/static/screenshots/BrushContext/synced-brushes-light-800w.webp and b/docs/static/screenshots/BrushContext/synced-brushes-light-800w.webp differ diff --git a/docs/static/screenshots/BrushContext/tooltip-interop-dark-240w.webp b/docs/static/screenshots/BrushContext/tooltip-interop-dark-240w.webp index 4c98a0cfff..36e3897d28 100644 Binary files a/docs/static/screenshots/BrushContext/tooltip-interop-dark-240w.webp and b/docs/static/screenshots/BrushContext/tooltip-interop-dark-240w.webp differ diff --git a/docs/static/screenshots/BrushContext/tooltip-interop-dark-800w.webp b/docs/static/screenshots/BrushContext/tooltip-interop-dark-800w.webp index 116f583c15..1e50e0d5e8 100644 Binary files a/docs/static/screenshots/BrushContext/tooltip-interop-dark-800w.webp and b/docs/static/screenshots/BrushContext/tooltip-interop-dark-800w.webp differ diff --git a/docs/static/screenshots/Calendar/90-days-dark-240w.webp b/docs/static/screenshots/Calendar/90-days-dark-240w.webp index 3e00517230..eed717ea73 100644 Binary files a/docs/static/screenshots/Calendar/90-days-dark-240w.webp and b/docs/static/screenshots/Calendar/90-days-dark-240w.webp differ diff --git a/docs/static/screenshots/Calendar/90-days-dark-400w.webp b/docs/static/screenshots/Calendar/90-days-dark-400w.webp index 4321137c41..b1980cfe15 100644 Binary files a/docs/static/screenshots/Calendar/90-days-dark-400w.webp and b/docs/static/screenshots/Calendar/90-days-dark-400w.webp differ diff --git a/docs/static/screenshots/Calendar/90-days-dark-800w.webp b/docs/static/screenshots/Calendar/90-days-dark-800w.webp index 4a07438c25..224378c47d 100644 Binary files a/docs/static/screenshots/Calendar/90-days-dark-800w.webp and b/docs/static/screenshots/Calendar/90-days-dark-800w.webp differ diff --git a/docs/static/screenshots/Calendar/90-days-light-240w.webp b/docs/static/screenshots/Calendar/90-days-light-240w.webp index 3e340b0455..a314da36f1 100644 Binary files a/docs/static/screenshots/Calendar/90-days-light-240w.webp and b/docs/static/screenshots/Calendar/90-days-light-240w.webp differ diff --git a/docs/static/screenshots/Calendar/90-days-light-400w.webp b/docs/static/screenshots/Calendar/90-days-light-400w.webp index 99be49c7ca..eebd40f5df 100644 Binary files a/docs/static/screenshots/Calendar/90-days-light-400w.webp and b/docs/static/screenshots/Calendar/90-days-light-400w.webp differ diff --git a/docs/static/screenshots/Calendar/90-days-light-800w.webp b/docs/static/screenshots/Calendar/90-days-light-800w.webp index fef02d2907..af6f6972cc 100644 Binary files a/docs/static/screenshots/Calendar/90-days-light-800w.webp and b/docs/static/screenshots/Calendar/90-days-light-800w.webp differ diff --git a/docs/static/screenshots/Calendar/basic-dark-240w.webp b/docs/static/screenshots/Calendar/basic-dark-240w.webp index 210df85e6d..4e064b70c9 100644 Binary files a/docs/static/screenshots/Calendar/basic-dark-240w.webp and b/docs/static/screenshots/Calendar/basic-dark-240w.webp differ diff --git a/docs/static/screenshots/Calendar/basic-dark-400w.webp b/docs/static/screenshots/Calendar/basic-dark-400w.webp index 786884d2ad..29fc9a8719 100644 Binary files a/docs/static/screenshots/Calendar/basic-dark-400w.webp and b/docs/static/screenshots/Calendar/basic-dark-400w.webp differ diff --git a/docs/static/screenshots/Calendar/basic-dark-800w.webp b/docs/static/screenshots/Calendar/basic-dark-800w.webp index ffc920bdf8..1ddba0673a 100644 Binary files a/docs/static/screenshots/Calendar/basic-dark-800w.webp and b/docs/static/screenshots/Calendar/basic-dark-800w.webp differ diff --git a/docs/static/screenshots/Calendar/basic-light-240w.webp b/docs/static/screenshots/Calendar/basic-light-240w.webp index fd87b4d4a9..e2ba3f41d5 100644 Binary files a/docs/static/screenshots/Calendar/basic-light-240w.webp and b/docs/static/screenshots/Calendar/basic-light-240w.webp differ diff --git a/docs/static/screenshots/Calendar/basic-light-400w.webp b/docs/static/screenshots/Calendar/basic-light-400w.webp index 7b535d46a9..814bebac67 100644 Binary files a/docs/static/screenshots/Calendar/basic-light-400w.webp and b/docs/static/screenshots/Calendar/basic-light-400w.webp differ diff --git a/docs/static/screenshots/Calendar/basic-light-800w.webp b/docs/static/screenshots/Calendar/basic-light-800w.webp index bcebae7bc4..b6d8a7296a 100644 Binary files a/docs/static/screenshots/Calendar/basic-light-800w.webp and b/docs/static/screenshots/Calendar/basic-light-800w.webp differ diff --git a/docs/static/screenshots/Calendar/fixed-cell-size-dark-240w.webp b/docs/static/screenshots/Calendar/fixed-cell-size-dark-240w.webp index dea7c1bfcd..f54692ee4b 100644 Binary files a/docs/static/screenshots/Calendar/fixed-cell-size-dark-240w.webp and b/docs/static/screenshots/Calendar/fixed-cell-size-dark-240w.webp differ diff --git a/docs/static/screenshots/Calendar/fixed-cell-size-dark-400w.webp b/docs/static/screenshots/Calendar/fixed-cell-size-dark-400w.webp index 345fc8b7f3..171e3a9e9f 100644 Binary files a/docs/static/screenshots/Calendar/fixed-cell-size-dark-400w.webp and b/docs/static/screenshots/Calendar/fixed-cell-size-dark-400w.webp differ diff --git a/docs/static/screenshots/Calendar/fixed-cell-size-dark-800w.webp b/docs/static/screenshots/Calendar/fixed-cell-size-dark-800w.webp index 21ee555f31..c445dd169b 100644 Binary files a/docs/static/screenshots/Calendar/fixed-cell-size-dark-800w.webp and b/docs/static/screenshots/Calendar/fixed-cell-size-dark-800w.webp differ diff --git a/docs/static/screenshots/Calendar/fixed-cell-size-light-240w.webp b/docs/static/screenshots/Calendar/fixed-cell-size-light-240w.webp index 8ac880fc88..f2f76ade56 100644 Binary files a/docs/static/screenshots/Calendar/fixed-cell-size-light-240w.webp and b/docs/static/screenshots/Calendar/fixed-cell-size-light-240w.webp differ diff --git a/docs/static/screenshots/Calendar/fixed-cell-size-light-400w.webp b/docs/static/screenshots/Calendar/fixed-cell-size-light-400w.webp index 8616b20276..9c68a5da4f 100644 Binary files a/docs/static/screenshots/Calendar/fixed-cell-size-light-400w.webp and b/docs/static/screenshots/Calendar/fixed-cell-size-light-400w.webp differ diff --git a/docs/static/screenshots/Calendar/fixed-cell-size-light-800w.webp b/docs/static/screenshots/Calendar/fixed-cell-size-light-800w.webp index 4e3014d19c..21a2a50eff 100644 Binary files a/docs/static/screenshots/Calendar/fixed-cell-size-light-800w.webp and b/docs/static/screenshots/Calendar/fixed-cell-size-light-800w.webp differ diff --git a/docs/static/screenshots/Calendar/html-with-padding-dark-240w.webp b/docs/static/screenshots/Calendar/html-with-padding-dark-240w.webp index 4f308ff035..07d22f9d88 100644 Binary files a/docs/static/screenshots/Calendar/html-with-padding-dark-240w.webp and b/docs/static/screenshots/Calendar/html-with-padding-dark-240w.webp differ diff --git a/docs/static/screenshots/Calendar/html-with-padding-dark-400w.webp b/docs/static/screenshots/Calendar/html-with-padding-dark-400w.webp index 2d1d5dbc7a..6be55b1a87 100644 Binary files a/docs/static/screenshots/Calendar/html-with-padding-dark-400w.webp and b/docs/static/screenshots/Calendar/html-with-padding-dark-400w.webp differ diff --git a/docs/static/screenshots/Calendar/html-with-padding-dark-800w.webp b/docs/static/screenshots/Calendar/html-with-padding-dark-800w.webp index a9d582a83d..2fe1bf069b 100644 Binary files a/docs/static/screenshots/Calendar/html-with-padding-dark-800w.webp and b/docs/static/screenshots/Calendar/html-with-padding-dark-800w.webp differ diff --git a/docs/static/screenshots/Calendar/html-with-padding-light-240w.webp b/docs/static/screenshots/Calendar/html-with-padding-light-240w.webp index 7cf2a4b748..9d80bc1fa8 100644 Binary files a/docs/static/screenshots/Calendar/html-with-padding-light-240w.webp and b/docs/static/screenshots/Calendar/html-with-padding-light-240w.webp differ diff --git a/docs/static/screenshots/Calendar/html-with-padding-light-400w.webp b/docs/static/screenshots/Calendar/html-with-padding-light-400w.webp index 23823d2079..132dd73b7c 100644 Binary files a/docs/static/screenshots/Calendar/html-with-padding-light-400w.webp and b/docs/static/screenshots/Calendar/html-with-padding-light-400w.webp differ diff --git a/docs/static/screenshots/Calendar/html-with-padding-light-800w.webp b/docs/static/screenshots/Calendar/html-with-padding-light-800w.webp index 285fad59ae..ce9a086ca2 100644 Binary files a/docs/static/screenshots/Calendar/html-with-padding-light-800w.webp and b/docs/static/screenshots/Calendar/html-with-padding-light-800w.webp differ diff --git a/docs/static/screenshots/Calendar/last-month-dark-240w.webp b/docs/static/screenshots/Calendar/last-month-dark-240w.webp index c1edf6d740..31323f62c3 100644 Binary files a/docs/static/screenshots/Calendar/last-month-dark-240w.webp and b/docs/static/screenshots/Calendar/last-month-dark-240w.webp differ diff --git a/docs/static/screenshots/Calendar/last-month-dark-400w.webp b/docs/static/screenshots/Calendar/last-month-dark-400w.webp index 917cc3a7b8..9579272db4 100644 Binary files a/docs/static/screenshots/Calendar/last-month-dark-400w.webp and b/docs/static/screenshots/Calendar/last-month-dark-400w.webp differ diff --git a/docs/static/screenshots/Calendar/last-month-dark-800w.webp b/docs/static/screenshots/Calendar/last-month-dark-800w.webp index 8a7c5f7a4f..57938224ab 100644 Binary files a/docs/static/screenshots/Calendar/last-month-dark-800w.webp and b/docs/static/screenshots/Calendar/last-month-dark-800w.webp differ diff --git a/docs/static/screenshots/Calendar/last-month-light-240w.webp b/docs/static/screenshots/Calendar/last-month-light-240w.webp index a86aeca1c4..2f23d812d3 100644 Binary files a/docs/static/screenshots/Calendar/last-month-light-240w.webp and b/docs/static/screenshots/Calendar/last-month-light-240w.webp differ diff --git a/docs/static/screenshots/Calendar/last-month-light-400w.webp b/docs/static/screenshots/Calendar/last-month-light-400w.webp index 47ca9c6cbc..e151684793 100644 Binary files a/docs/static/screenshots/Calendar/last-month-light-400w.webp and b/docs/static/screenshots/Calendar/last-month-light-400w.webp differ diff --git a/docs/static/screenshots/Calendar/last-month-light-800w.webp b/docs/static/screenshots/Calendar/last-month-light-800w.webp index e030a347af..3f625f90ec 100644 Binary files a/docs/static/screenshots/Calendar/last-month-light-800w.webp and b/docs/static/screenshots/Calendar/last-month-light-800w.webp differ diff --git a/docs/static/screenshots/Calendar/multiple-years-dark-240w.webp b/docs/static/screenshots/Calendar/multiple-years-dark-240w.webp index b61b2fa5e7..f1cb190b74 100644 Binary files a/docs/static/screenshots/Calendar/multiple-years-dark-240w.webp and b/docs/static/screenshots/Calendar/multiple-years-dark-240w.webp differ diff --git a/docs/static/screenshots/Calendar/multiple-years-dark-400w.webp b/docs/static/screenshots/Calendar/multiple-years-dark-400w.webp index bebe1c22fe..cf0e3a10f4 100644 Binary files a/docs/static/screenshots/Calendar/multiple-years-dark-400w.webp and b/docs/static/screenshots/Calendar/multiple-years-dark-400w.webp differ diff --git a/docs/static/screenshots/Calendar/multiple-years-dark-800w.webp b/docs/static/screenshots/Calendar/multiple-years-dark-800w.webp index 4e01325dad..d67037436f 100644 Binary files a/docs/static/screenshots/Calendar/multiple-years-dark-800w.webp and b/docs/static/screenshots/Calendar/multiple-years-dark-800w.webp differ diff --git a/docs/static/screenshots/Calendar/multiple-years-light-240w.webp b/docs/static/screenshots/Calendar/multiple-years-light-240w.webp index 0316c92ef4..1daf1ab761 100644 Binary files a/docs/static/screenshots/Calendar/multiple-years-light-240w.webp and b/docs/static/screenshots/Calendar/multiple-years-light-240w.webp differ diff --git a/docs/static/screenshots/Calendar/multiple-years-light-400w.webp b/docs/static/screenshots/Calendar/multiple-years-light-400w.webp index 043638f160..3bd4f4985e 100644 Binary files a/docs/static/screenshots/Calendar/multiple-years-light-400w.webp and b/docs/static/screenshots/Calendar/multiple-years-light-400w.webp differ diff --git a/docs/static/screenshots/Calendar/multiple-years-light-800w.webp b/docs/static/screenshots/Calendar/multiple-years-light-800w.webp index f75529df80..ef4d6587a9 100644 Binary files a/docs/static/screenshots/Calendar/multiple-years-light-800w.webp and b/docs/static/screenshots/Calendar/multiple-years-light-800w.webp differ diff --git a/docs/static/screenshots/Calendar/responsive-cell-size-default-dark-240w.webp b/docs/static/screenshots/Calendar/responsive-cell-size-default-dark-240w.webp index 2f3ba78cc3..19f6b56c19 100644 Binary files a/docs/static/screenshots/Calendar/responsive-cell-size-default-dark-240w.webp and b/docs/static/screenshots/Calendar/responsive-cell-size-default-dark-240w.webp differ diff --git a/docs/static/screenshots/Calendar/responsive-cell-size-default-dark-400w.webp b/docs/static/screenshots/Calendar/responsive-cell-size-default-dark-400w.webp index 31e923e311..5abe0052c9 100644 Binary files a/docs/static/screenshots/Calendar/responsive-cell-size-default-dark-400w.webp and b/docs/static/screenshots/Calendar/responsive-cell-size-default-dark-400w.webp differ diff --git a/docs/static/screenshots/Calendar/responsive-cell-size-default-dark-800w.webp b/docs/static/screenshots/Calendar/responsive-cell-size-default-dark-800w.webp index a113b686c0..f9cd103b3a 100644 Binary files a/docs/static/screenshots/Calendar/responsive-cell-size-default-dark-800w.webp and b/docs/static/screenshots/Calendar/responsive-cell-size-default-dark-800w.webp differ diff --git a/docs/static/screenshots/Calendar/responsive-cell-size-default-light-240w.webp b/docs/static/screenshots/Calendar/responsive-cell-size-default-light-240w.webp index 332e8bc557..a8dbb6a812 100644 Binary files a/docs/static/screenshots/Calendar/responsive-cell-size-default-light-240w.webp and b/docs/static/screenshots/Calendar/responsive-cell-size-default-light-240w.webp differ diff --git a/docs/static/screenshots/Calendar/responsive-cell-size-default-light-400w.webp b/docs/static/screenshots/Calendar/responsive-cell-size-default-light-400w.webp index ef89d5c362..c8f5710163 100644 Binary files a/docs/static/screenshots/Calendar/responsive-cell-size-default-light-400w.webp and b/docs/static/screenshots/Calendar/responsive-cell-size-default-light-400w.webp differ diff --git a/docs/static/screenshots/Calendar/responsive-cell-size-default-light-800w.webp b/docs/static/screenshots/Calendar/responsive-cell-size-default-light-800w.webp index 3273db4027..0f15aa93fc 100644 Binary files a/docs/static/screenshots/Calendar/responsive-cell-size-default-light-800w.webp and b/docs/static/screenshots/Calendar/responsive-cell-size-default-light-800w.webp differ diff --git a/docs/static/screenshots/Calendar/rounded-cells-dark-240w.webp b/docs/static/screenshots/Calendar/rounded-cells-dark-240w.webp index 6ca2794102..0a572a436f 100644 Binary files a/docs/static/screenshots/Calendar/rounded-cells-dark-240w.webp and b/docs/static/screenshots/Calendar/rounded-cells-dark-240w.webp differ diff --git a/docs/static/screenshots/Calendar/rounded-cells-dark-400w.webp b/docs/static/screenshots/Calendar/rounded-cells-dark-400w.webp index 1d5aa76964..e789dbf53f 100644 Binary files a/docs/static/screenshots/Calendar/rounded-cells-dark-400w.webp and b/docs/static/screenshots/Calendar/rounded-cells-dark-400w.webp differ diff --git a/docs/static/screenshots/Calendar/rounded-cells-dark-800w.webp b/docs/static/screenshots/Calendar/rounded-cells-dark-800w.webp index f537f8c85f..7086a4c1bd 100644 Binary files a/docs/static/screenshots/Calendar/rounded-cells-dark-800w.webp and b/docs/static/screenshots/Calendar/rounded-cells-dark-800w.webp differ diff --git a/docs/static/screenshots/Calendar/rounded-cells-light-240w.webp b/docs/static/screenshots/Calendar/rounded-cells-light-240w.webp index 839c5efa59..f8b973549e 100644 Binary files a/docs/static/screenshots/Calendar/rounded-cells-light-240w.webp and b/docs/static/screenshots/Calendar/rounded-cells-light-240w.webp differ diff --git a/docs/static/screenshots/Calendar/rounded-cells-light-400w.webp b/docs/static/screenshots/Calendar/rounded-cells-light-400w.webp index 9eadc8a1df..ea5829dd88 100644 Binary files a/docs/static/screenshots/Calendar/rounded-cells-light-400w.webp and b/docs/static/screenshots/Calendar/rounded-cells-light-400w.webp differ diff --git a/docs/static/screenshots/Calendar/rounded-cells-light-800w.webp b/docs/static/screenshots/Calendar/rounded-cells-light-800w.webp index 48dfe81f31..f37f3004cb 100644 Binary files a/docs/static/screenshots/Calendar/rounded-cells-light-800w.webp and b/docs/static/screenshots/Calendar/rounded-cells-light-800w.webp differ diff --git a/docs/static/screenshots/Cell/basic-dark-800w.webp b/docs/static/screenshots/Cell/basic-dark-800w.webp index f49cf9c2b5..b6018617a4 100644 Binary files a/docs/static/screenshots/Cell/basic-dark-800w.webp and b/docs/static/screenshots/Cell/basic-dark-800w.webp differ diff --git a/docs/static/screenshots/Cell/circle-dark-400w.webp b/docs/static/screenshots/Cell/circle-dark-400w.webp index 1fee063d88..db101410ed 100644 Binary files a/docs/static/screenshots/Cell/circle-dark-400w.webp and b/docs/static/screenshots/Cell/circle-dark-400w.webp differ diff --git a/docs/static/screenshots/Cell/circle-dark-800w.webp b/docs/static/screenshots/Cell/circle-dark-800w.webp index d75f6f9f86..c8084894ad 100644 Binary files a/docs/static/screenshots/Cell/circle-dark-800w.webp and b/docs/static/screenshots/Cell/circle-dark-800w.webp differ diff --git a/docs/static/screenshots/Cell/circle-light-800w.webp b/docs/static/screenshots/Cell/circle-light-800w.webp index 79183ac741..7aaee3bcc0 100644 Binary files a/docs/static/screenshots/Cell/circle-light-800w.webp and b/docs/static/screenshots/Cell/circle-light-800w.webp differ diff --git a/docs/static/screenshots/Cell/color-scale-dark-240w.webp b/docs/static/screenshots/Cell/color-scale-dark-240w.webp index 3f73d5d757..bf77ccfcd5 100644 Binary files a/docs/static/screenshots/Cell/color-scale-dark-240w.webp and b/docs/static/screenshots/Cell/color-scale-dark-240w.webp differ diff --git a/docs/static/screenshots/Cell/color-scale-dark-400w.webp b/docs/static/screenshots/Cell/color-scale-dark-400w.webp index 04e90555a1..8e8719e1b8 100644 Binary files a/docs/static/screenshots/Cell/color-scale-dark-400w.webp and b/docs/static/screenshots/Cell/color-scale-dark-400w.webp differ diff --git a/docs/static/screenshots/Cell/color-scale-dark-800w.webp b/docs/static/screenshots/Cell/color-scale-dark-800w.webp index a7d511ae34..5e25779975 100644 Binary files a/docs/static/screenshots/Cell/color-scale-dark-800w.webp and b/docs/static/screenshots/Cell/color-scale-dark-800w.webp differ diff --git a/docs/static/screenshots/Cell/color-scale-light-400w.webp b/docs/static/screenshots/Cell/color-scale-light-400w.webp index a129474a6b..f2dbef8f51 100644 Binary files a/docs/static/screenshots/Cell/color-scale-light-400w.webp and b/docs/static/screenshots/Cell/color-scale-light-400w.webp differ diff --git a/docs/static/screenshots/Cell/color-scale-light-800w.webp b/docs/static/screenshots/Cell/color-scale-light-800w.webp index a303ab8f5a..f37e206fd7 100644 Binary files a/docs/static/screenshots/Cell/color-scale-light-800w.webp and b/docs/static/screenshots/Cell/color-scale-light-800w.webp differ diff --git a/docs/static/screenshots/Cell/punchcard-dark-240w.webp b/docs/static/screenshots/Cell/punchcard-dark-240w.webp index 2434fd42b5..92ec838b7e 100644 Binary files a/docs/static/screenshots/Cell/punchcard-dark-240w.webp and b/docs/static/screenshots/Cell/punchcard-dark-240w.webp differ diff --git a/docs/static/screenshots/Cell/punchcard-dark-400w.webp b/docs/static/screenshots/Cell/punchcard-dark-400w.webp index cfc7b8e739..0fd28cfff1 100644 Binary files a/docs/static/screenshots/Cell/punchcard-dark-400w.webp and b/docs/static/screenshots/Cell/punchcard-dark-400w.webp differ diff --git a/docs/static/screenshots/Cell/punchcard-dark-800w.webp b/docs/static/screenshots/Cell/punchcard-dark-800w.webp index 9a9d38f511..1c1253f36a 100644 Binary files a/docs/static/screenshots/Cell/punchcard-dark-800w.webp and b/docs/static/screenshots/Cell/punchcard-dark-800w.webp differ diff --git a/docs/static/screenshots/Cell/punchcard-light-240w.webp b/docs/static/screenshots/Cell/punchcard-light-240w.webp index 4aea3a5fdf..00e1936f90 100644 Binary files a/docs/static/screenshots/Cell/punchcard-light-240w.webp and b/docs/static/screenshots/Cell/punchcard-light-240w.webp differ diff --git a/docs/static/screenshots/Cell/punchcard-light-400w.webp b/docs/static/screenshots/Cell/punchcard-light-400w.webp index fc884b933f..c991ce649b 100644 Binary files a/docs/static/screenshots/Cell/punchcard-light-400w.webp and b/docs/static/screenshots/Cell/punchcard-light-400w.webp differ diff --git a/docs/static/screenshots/Cell/punchcard-light-800w.webp b/docs/static/screenshots/Cell/punchcard-light-800w.webp index 22d3783182..04d1b6e418 100644 Binary files a/docs/static/screenshots/Cell/punchcard-light-800w.webp and b/docs/static/screenshots/Cell/punchcard-light-800w.webp differ diff --git a/docs/static/screenshots/Chart/compound-common-scale-with-extra-marks-dark-240w.webp b/docs/static/screenshots/Chart/compound-common-scale-with-extra-marks-dark-240w.webp index 8ca2c96eff..e715ea13f9 100644 Binary files a/docs/static/screenshots/Chart/compound-common-scale-with-extra-marks-dark-240w.webp and b/docs/static/screenshots/Chart/compound-common-scale-with-extra-marks-dark-240w.webp differ diff --git a/docs/static/screenshots/Chart/compound-common-scale-with-extra-marks-dark-400w.webp b/docs/static/screenshots/Chart/compound-common-scale-with-extra-marks-dark-400w.webp index 1454535451..2206f31de7 100644 Binary files a/docs/static/screenshots/Chart/compound-common-scale-with-extra-marks-dark-400w.webp and b/docs/static/screenshots/Chart/compound-common-scale-with-extra-marks-dark-400w.webp differ diff --git a/docs/static/screenshots/Chart/compound-common-scale-with-extra-marks-dark-800w.webp b/docs/static/screenshots/Chart/compound-common-scale-with-extra-marks-dark-800w.webp index 2599566bc5..b465bc82b0 100644 Binary files a/docs/static/screenshots/Chart/compound-common-scale-with-extra-marks-dark-800w.webp and b/docs/static/screenshots/Chart/compound-common-scale-with-extra-marks-dark-800w.webp differ diff --git a/docs/static/screenshots/Chart/compound-common-scale-with-extra-marks-light-240w.webp b/docs/static/screenshots/Chart/compound-common-scale-with-extra-marks-light-240w.webp index 65b91a7a3b..fef533f0c7 100644 Binary files a/docs/static/screenshots/Chart/compound-common-scale-with-extra-marks-light-240w.webp and b/docs/static/screenshots/Chart/compound-common-scale-with-extra-marks-light-240w.webp differ diff --git a/docs/static/screenshots/Chart/compound-common-scale-with-extra-marks-light-400w.webp b/docs/static/screenshots/Chart/compound-common-scale-with-extra-marks-light-400w.webp index 22475b24ed..633db5326f 100644 Binary files a/docs/static/screenshots/Chart/compound-common-scale-with-extra-marks-light-400w.webp and b/docs/static/screenshots/Chart/compound-common-scale-with-extra-marks-light-400w.webp differ diff --git a/docs/static/screenshots/Chart/compound-common-scale-with-extra-marks-light-800w.webp b/docs/static/screenshots/Chart/compound-common-scale-with-extra-marks-light-800w.webp index 7a88eb37d1..5551c0dd39 100644 Binary files a/docs/static/screenshots/Chart/compound-common-scale-with-extra-marks-light-800w.webp and b/docs/static/screenshots/Chart/compound-common-scale-with-extra-marks-light-800w.webp differ diff --git a/docs/static/screenshots/Chart/compound-dual-axis-with-single-chart-using-remapped-scale-dark-400w.webp b/docs/static/screenshots/Chart/compound-dual-axis-with-single-chart-using-remapped-scale-dark-400w.webp index c84ff70f09..950d15a39f 100644 Binary files a/docs/static/screenshots/Chart/compound-dual-axis-with-single-chart-using-remapped-scale-dark-400w.webp and b/docs/static/screenshots/Chart/compound-dual-axis-with-single-chart-using-remapped-scale-dark-400w.webp differ diff --git a/docs/static/screenshots/Chart/compound-dual-axis-with-single-chart-using-remapped-scale-dark-800w.webp b/docs/static/screenshots/Chart/compound-dual-axis-with-single-chart-using-remapped-scale-dark-800w.webp index a25e461f53..338666ce28 100644 Binary files a/docs/static/screenshots/Chart/compound-dual-axis-with-single-chart-using-remapped-scale-dark-800w.webp and b/docs/static/screenshots/Chart/compound-dual-axis-with-single-chart-using-remapped-scale-dark-800w.webp differ diff --git a/docs/static/screenshots/Chart/compound-dual-axis-with-single-chart-using-remapped-scale-light-400w.webp b/docs/static/screenshots/Chart/compound-dual-axis-with-single-chart-using-remapped-scale-light-400w.webp index b83489b22c..4cef782163 100644 Binary files a/docs/static/screenshots/Chart/compound-dual-axis-with-single-chart-using-remapped-scale-light-400w.webp and b/docs/static/screenshots/Chart/compound-dual-axis-with-single-chart-using-remapped-scale-light-400w.webp differ diff --git a/docs/static/screenshots/Chart/compound-dual-axis-with-single-chart-using-remapped-scale-light-800w.webp b/docs/static/screenshots/Chart/compound-dual-axis-with-single-chart-using-remapped-scale-light-800w.webp index 5faa0c38cf..aa45fa3483 100644 Binary files a/docs/static/screenshots/Chart/compound-dual-axis-with-single-chart-using-remapped-scale-light-800w.webp and b/docs/static/screenshots/Chart/compound-dual-axis-with-single-chart-using-remapped-scale-light-800w.webp differ diff --git a/docs/static/screenshots/Chart/compound-dual-axis-with-stacked-charts-dark-400w.webp b/docs/static/screenshots/Chart/compound-dual-axis-with-stacked-charts-dark-400w.webp index f3806b4bd3..084de67dc7 100644 Binary files a/docs/static/screenshots/Chart/compound-dual-axis-with-stacked-charts-dark-400w.webp and b/docs/static/screenshots/Chart/compound-dual-axis-with-stacked-charts-dark-400w.webp differ diff --git a/docs/static/screenshots/Chart/compound-dual-axis-with-stacked-charts-dark-800w.webp b/docs/static/screenshots/Chart/compound-dual-axis-with-stacked-charts-dark-800w.webp index 7213fea318..be12fda69d 100644 Binary files a/docs/static/screenshots/Chart/compound-dual-axis-with-stacked-charts-dark-800w.webp and b/docs/static/screenshots/Chart/compound-dual-axis-with-stacked-charts-dark-800w.webp differ diff --git a/docs/static/screenshots/Chart/compound-dual-axis-with-stacked-charts-light-400w.webp b/docs/static/screenshots/Chart/compound-dual-axis-with-stacked-charts-light-400w.webp index 8f58faa570..9fadf20520 100644 Binary files a/docs/static/screenshots/Chart/compound-dual-axis-with-stacked-charts-light-400w.webp and b/docs/static/screenshots/Chart/compound-dual-axis-with-stacked-charts-light-400w.webp differ diff --git a/docs/static/screenshots/Chart/compound-dual-axis-with-stacked-charts-light-800w.webp b/docs/static/screenshots/Chart/compound-dual-axis-with-stacked-charts-light-800w.webp index 219ba6a5ee..8e08b6e0e2 100644 Binary files a/docs/static/screenshots/Chart/compound-dual-axis-with-stacked-charts-light-800w.webp and b/docs/static/screenshots/Chart/compound-dual-axis-with-stacked-charts-light-800w.webp differ diff --git a/docs/static/screenshots/Chart/compound-separate-scales-with-stacked-charts-with-inverted-range-top-down-dark-400w.webp b/docs/static/screenshots/Chart/compound-separate-scales-with-stacked-charts-with-inverted-range-top-down-dark-400w.webp index d6c33d0b77..5ee0ff8426 100644 Binary files a/docs/static/screenshots/Chart/compound-separate-scales-with-stacked-charts-with-inverted-range-top-down-dark-400w.webp and b/docs/static/screenshots/Chart/compound-separate-scales-with-stacked-charts-with-inverted-range-top-down-dark-400w.webp differ diff --git a/docs/static/screenshots/Chart/compound-separate-scales-with-stacked-charts-with-inverted-range-top-down-dark-800w.webp b/docs/static/screenshots/Chart/compound-separate-scales-with-stacked-charts-with-inverted-range-top-down-dark-800w.webp index f0f9b57d8e..bbe7919759 100644 Binary files a/docs/static/screenshots/Chart/compound-separate-scales-with-stacked-charts-with-inverted-range-top-down-dark-800w.webp and b/docs/static/screenshots/Chart/compound-separate-scales-with-stacked-charts-with-inverted-range-top-down-dark-800w.webp differ diff --git a/docs/static/screenshots/Chart/compound-separate-scales-with-stacked-charts-with-inverted-range-top-down-light-400w.webp b/docs/static/screenshots/Chart/compound-separate-scales-with-stacked-charts-with-inverted-range-top-down-light-400w.webp index 22faaa2338..e14c580d82 100644 Binary files a/docs/static/screenshots/Chart/compound-separate-scales-with-stacked-charts-with-inverted-range-top-down-light-400w.webp and b/docs/static/screenshots/Chart/compound-separate-scales-with-stacked-charts-with-inverted-range-top-down-light-400w.webp differ diff --git a/docs/static/screenshots/Chart/compound-separate-scales-with-stacked-charts-with-inverted-range-top-down-light-800w.webp b/docs/static/screenshots/Chart/compound-separate-scales-with-stacked-charts-with-inverted-range-top-down-light-800w.webp index f1b01235df..3899f26695 100644 Binary files a/docs/static/screenshots/Chart/compound-separate-scales-with-stacked-charts-with-inverted-range-top-down-light-800w.webp and b/docs/static/screenshots/Chart/compound-separate-scales-with-stacked-charts-with-inverted-range-top-down-light-800w.webp differ diff --git a/docs/static/screenshots/Chart/data-series-chart-data-dark-240w.webp b/docs/static/screenshots/Chart/data-series-chart-data-dark-240w.webp index 47c3203428..b869cec8d6 100644 Binary files a/docs/static/screenshots/Chart/data-series-chart-data-dark-240w.webp and b/docs/static/screenshots/Chart/data-series-chart-data-dark-240w.webp differ diff --git a/docs/static/screenshots/Chart/data-series-chart-data-dark-400w.webp b/docs/static/screenshots/Chart/data-series-chart-data-dark-400w.webp index 9cde91ce22..9f7e06d8ae 100644 Binary files a/docs/static/screenshots/Chart/data-series-chart-data-dark-400w.webp and b/docs/static/screenshots/Chart/data-series-chart-data-dark-400w.webp differ diff --git a/docs/static/screenshots/Chart/data-series-chart-data-dark-800w.webp b/docs/static/screenshots/Chart/data-series-chart-data-dark-800w.webp index cbb7807613..1e343f1656 100644 Binary files a/docs/static/screenshots/Chart/data-series-chart-data-dark-800w.webp and b/docs/static/screenshots/Chart/data-series-chart-data-dark-800w.webp differ diff --git a/docs/static/screenshots/Chart/data-series-chart-data-light-240w.webp b/docs/static/screenshots/Chart/data-series-chart-data-light-240w.webp index 1c90aaae00..73918f6517 100644 Binary files a/docs/static/screenshots/Chart/data-series-chart-data-light-240w.webp and b/docs/static/screenshots/Chart/data-series-chart-data-light-240w.webp differ diff --git a/docs/static/screenshots/Chart/data-series-chart-data-light-400w.webp b/docs/static/screenshots/Chart/data-series-chart-data-light-400w.webp index 576b6afd4b..97b32ec156 100644 Binary files a/docs/static/screenshots/Chart/data-series-chart-data-light-400w.webp and b/docs/static/screenshots/Chart/data-series-chart-data-light-400w.webp differ diff --git a/docs/static/screenshots/Chart/data-series-chart-data-light-800w.webp b/docs/static/screenshots/Chart/data-series-chart-data-light-800w.webp index b3151bb693..5b117b8496 100644 Binary files a/docs/static/screenshots/Chart/data-series-chart-data-light-800w.webp and b/docs/static/screenshots/Chart/data-series-chart-data-light-800w.webp differ diff --git a/docs/static/screenshots/Chart/facet-annotation-dark-240w.webp b/docs/static/screenshots/Chart/facet-annotation-dark-240w.webp new file mode 100644 index 0000000000..1ea3b13240 Binary files /dev/null and b/docs/static/screenshots/Chart/facet-annotation-dark-240w.webp differ diff --git a/docs/static/screenshots/Chart/facet-annotation-dark-400w.webp b/docs/static/screenshots/Chart/facet-annotation-dark-400w.webp new file mode 100644 index 0000000000..b7841ab699 Binary files /dev/null and b/docs/static/screenshots/Chart/facet-annotation-dark-400w.webp differ diff --git a/docs/static/screenshots/Chart/facet-annotation-dark-800w.webp b/docs/static/screenshots/Chart/facet-annotation-dark-800w.webp new file mode 100644 index 0000000000..4997026f80 Binary files /dev/null and b/docs/static/screenshots/Chart/facet-annotation-dark-800w.webp differ diff --git a/docs/static/screenshots/Chart/facet-annotation-light-240w.webp b/docs/static/screenshots/Chart/facet-annotation-light-240w.webp new file mode 100644 index 0000000000..ec5afb3254 Binary files /dev/null and b/docs/static/screenshots/Chart/facet-annotation-light-240w.webp differ diff --git a/docs/static/screenshots/Chart/facet-annotation-light-400w.webp b/docs/static/screenshots/Chart/facet-annotation-light-400w.webp new file mode 100644 index 0000000000..de079d854a Binary files /dev/null and b/docs/static/screenshots/Chart/facet-annotation-light-400w.webp differ diff --git a/docs/static/screenshots/Chart/facet-annotation-light-800w.webp b/docs/static/screenshots/Chart/facet-annotation-light-800w.webp new file mode 100644 index 0000000000..8c250bace3 Binary files /dev/null and b/docs/static/screenshots/Chart/facet-annotation-light-800w.webp differ diff --git a/docs/static/screenshots/Chart/facet-bars-dark-240w.webp b/docs/static/screenshots/Chart/facet-bars-dark-240w.webp new file mode 100644 index 0000000000..b11bfc5b81 Binary files /dev/null and b/docs/static/screenshots/Chart/facet-bars-dark-240w.webp differ diff --git a/docs/static/screenshots/Chart/facet-bars-dark-400w.webp b/docs/static/screenshots/Chart/facet-bars-dark-400w.webp new file mode 100644 index 0000000000..3b8eb4648a Binary files /dev/null and b/docs/static/screenshots/Chart/facet-bars-dark-400w.webp differ diff --git a/docs/static/screenshots/Chart/facet-bars-dark-800w.webp b/docs/static/screenshots/Chart/facet-bars-dark-800w.webp new file mode 100644 index 0000000000..51ee2a179e Binary files /dev/null and b/docs/static/screenshots/Chart/facet-bars-dark-800w.webp differ diff --git a/docs/static/screenshots/Chart/facet-bars-light-240w.webp b/docs/static/screenshots/Chart/facet-bars-light-240w.webp new file mode 100644 index 0000000000..1a379f72ab Binary files /dev/null and b/docs/static/screenshots/Chart/facet-bars-light-240w.webp differ diff --git a/docs/static/screenshots/Chart/facet-bars-light-400w.webp b/docs/static/screenshots/Chart/facet-bars-light-400w.webp new file mode 100644 index 0000000000..5ea51b46d9 Binary files /dev/null and b/docs/static/screenshots/Chart/facet-bars-light-400w.webp differ diff --git a/docs/static/screenshots/Chart/facet-bars-light-800w.webp b/docs/static/screenshots/Chart/facet-bars-light-800w.webp new file mode 100644 index 0000000000..fa3ae74765 Binary files /dev/null and b/docs/static/screenshots/Chart/facet-bars-light-800w.webp differ diff --git a/docs/static/screenshots/Chart/facet-brush-band-dark-240w.webp b/docs/static/screenshots/Chart/facet-brush-band-dark-240w.webp new file mode 100644 index 0000000000..608dd80079 Binary files /dev/null and b/docs/static/screenshots/Chart/facet-brush-band-dark-240w.webp differ diff --git a/docs/static/screenshots/Chart/facet-brush-band-dark-400w.webp b/docs/static/screenshots/Chart/facet-brush-band-dark-400w.webp new file mode 100644 index 0000000000..1cfd150b6b Binary files /dev/null and b/docs/static/screenshots/Chart/facet-brush-band-dark-400w.webp differ diff --git a/docs/static/screenshots/Chart/facet-brush-band-dark-800w.webp b/docs/static/screenshots/Chart/facet-brush-band-dark-800w.webp new file mode 100644 index 0000000000..70512551e7 Binary files /dev/null and b/docs/static/screenshots/Chart/facet-brush-band-dark-800w.webp differ diff --git a/docs/static/screenshots/Chart/facet-brush-band-light-240w.webp b/docs/static/screenshots/Chart/facet-brush-band-light-240w.webp new file mode 100644 index 0000000000..191c1a954f Binary files /dev/null and b/docs/static/screenshots/Chart/facet-brush-band-light-240w.webp differ diff --git a/docs/static/screenshots/Chart/facet-brush-band-light-400w.webp b/docs/static/screenshots/Chart/facet-brush-band-light-400w.webp new file mode 100644 index 0000000000..600f7d57c4 Binary files /dev/null and b/docs/static/screenshots/Chart/facet-brush-band-light-400w.webp differ diff --git a/docs/static/screenshots/Chart/facet-brush-band-light-800w.webp b/docs/static/screenshots/Chart/facet-brush-band-light-800w.webp new file mode 100644 index 0000000000..27f3484695 Binary files /dev/null and b/docs/static/screenshots/Chart/facet-brush-band-light-800w.webp differ diff --git a/docs/static/screenshots/Chart/facet-brush-dark-240w.webp b/docs/static/screenshots/Chart/facet-brush-dark-240w.webp new file mode 100644 index 0000000000..ea1a634a37 Binary files /dev/null and b/docs/static/screenshots/Chart/facet-brush-dark-240w.webp differ diff --git a/docs/static/screenshots/Chart/facet-brush-dark-400w.webp b/docs/static/screenshots/Chart/facet-brush-dark-400w.webp new file mode 100644 index 0000000000..5b1b214df7 Binary files /dev/null and b/docs/static/screenshots/Chart/facet-brush-dark-400w.webp differ diff --git a/docs/static/screenshots/Chart/facet-brush-dark-800w.webp b/docs/static/screenshots/Chart/facet-brush-dark-800w.webp new file mode 100644 index 0000000000..29bc846892 Binary files /dev/null and b/docs/static/screenshots/Chart/facet-brush-dark-800w.webp differ diff --git a/docs/static/screenshots/Chart/facet-brush-light-240w.webp b/docs/static/screenshots/Chart/facet-brush-light-240w.webp new file mode 100644 index 0000000000..afbaabbe51 Binary files /dev/null and b/docs/static/screenshots/Chart/facet-brush-light-240w.webp differ diff --git a/docs/static/screenshots/Chart/facet-brush-light-400w.webp b/docs/static/screenshots/Chart/facet-brush-light-400w.webp new file mode 100644 index 0000000000..91c92532c2 Binary files /dev/null and b/docs/static/screenshots/Chart/facet-brush-light-400w.webp differ diff --git a/docs/static/screenshots/Chart/facet-brush-light-800w.webp b/docs/static/screenshots/Chart/facet-brush-light-800w.webp new file mode 100644 index 0000000000..0af24fe188 Binary files /dev/null and b/docs/static/screenshots/Chart/facet-brush-light-800w.webp differ diff --git a/docs/static/screenshots/Chart/facet-brush-overview-dark-240w.webp b/docs/static/screenshots/Chart/facet-brush-overview-dark-240w.webp new file mode 100644 index 0000000000..09b77d379b Binary files /dev/null and b/docs/static/screenshots/Chart/facet-brush-overview-dark-240w.webp differ diff --git a/docs/static/screenshots/Chart/facet-brush-overview-dark-400w.webp b/docs/static/screenshots/Chart/facet-brush-overview-dark-400w.webp new file mode 100644 index 0000000000..2820aa6690 Binary files /dev/null and b/docs/static/screenshots/Chart/facet-brush-overview-dark-400w.webp differ diff --git a/docs/static/screenshots/Chart/facet-brush-overview-dark-800w.webp b/docs/static/screenshots/Chart/facet-brush-overview-dark-800w.webp new file mode 100644 index 0000000000..db69c47783 Binary files /dev/null and b/docs/static/screenshots/Chart/facet-brush-overview-dark-800w.webp differ diff --git a/docs/static/screenshots/Chart/facet-brush-overview-light-240w.webp b/docs/static/screenshots/Chart/facet-brush-overview-light-240w.webp new file mode 100644 index 0000000000..9a1822f68a Binary files /dev/null and b/docs/static/screenshots/Chart/facet-brush-overview-light-240w.webp differ diff --git a/docs/static/screenshots/Chart/facet-brush-overview-light-400w.webp b/docs/static/screenshots/Chart/facet-brush-overview-light-400w.webp new file mode 100644 index 0000000000..0b1a198e24 Binary files /dev/null and b/docs/static/screenshots/Chart/facet-brush-overview-light-400w.webp differ diff --git a/docs/static/screenshots/Chart/facet-brush-overview-light-800w.webp b/docs/static/screenshots/Chart/facet-brush-overview-light-800w.webp new file mode 100644 index 0000000000..42c701ac0c Binary files /dev/null and b/docs/static/screenshots/Chart/facet-brush-overview-light-800w.webp differ diff --git a/docs/static/screenshots/Chart/facet-brush-summary-dark-240w.webp b/docs/static/screenshots/Chart/facet-brush-summary-dark-240w.webp new file mode 100644 index 0000000000..016d7d5ca7 Binary files /dev/null and b/docs/static/screenshots/Chart/facet-brush-summary-dark-240w.webp differ diff --git a/docs/static/screenshots/Chart/facet-brush-summary-dark-400w.webp b/docs/static/screenshots/Chart/facet-brush-summary-dark-400w.webp new file mode 100644 index 0000000000..7cdb0274ca Binary files /dev/null and b/docs/static/screenshots/Chart/facet-brush-summary-dark-400w.webp differ diff --git a/docs/static/screenshots/Chart/facet-brush-summary-dark-800w.webp b/docs/static/screenshots/Chart/facet-brush-summary-dark-800w.webp new file mode 100644 index 0000000000..980c1b9b6e Binary files /dev/null and b/docs/static/screenshots/Chart/facet-brush-summary-dark-800w.webp differ diff --git a/docs/static/screenshots/Chart/facet-brush-summary-light-240w.webp b/docs/static/screenshots/Chart/facet-brush-summary-light-240w.webp new file mode 100644 index 0000000000..45346e54c6 Binary files /dev/null and b/docs/static/screenshots/Chart/facet-brush-summary-light-240w.webp differ diff --git a/docs/static/screenshots/Chart/facet-brush-summary-light-400w.webp b/docs/static/screenshots/Chart/facet-brush-summary-light-400w.webp new file mode 100644 index 0000000000..4c30ad117e Binary files /dev/null and b/docs/static/screenshots/Chart/facet-brush-summary-light-400w.webp differ diff --git a/docs/static/screenshots/Chart/facet-brush-summary-light-800w.webp b/docs/static/screenshots/Chart/facet-brush-summary-light-800w.webp new file mode 100644 index 0000000000..dd4cea9185 Binary files /dev/null and b/docs/static/screenshots/Chart/facet-brush-summary-light-800w.webp differ diff --git a/docs/static/screenshots/Chart/facet-brush-zoom-dark-240w.webp b/docs/static/screenshots/Chart/facet-brush-zoom-dark-240w.webp new file mode 100644 index 0000000000..2fff3fd364 Binary files /dev/null and b/docs/static/screenshots/Chart/facet-brush-zoom-dark-240w.webp differ diff --git a/docs/static/screenshots/Chart/facet-brush-zoom-dark-400w.webp b/docs/static/screenshots/Chart/facet-brush-zoom-dark-400w.webp new file mode 100644 index 0000000000..ebb74be9ce Binary files /dev/null and b/docs/static/screenshots/Chart/facet-brush-zoom-dark-400w.webp differ diff --git a/docs/static/screenshots/Chart/facet-brush-zoom-dark-800w.webp b/docs/static/screenshots/Chart/facet-brush-zoom-dark-800w.webp new file mode 100644 index 0000000000..f87ed7912f Binary files /dev/null and b/docs/static/screenshots/Chart/facet-brush-zoom-dark-800w.webp differ diff --git a/docs/static/screenshots/Chart/facet-brush-zoom-light-240w.webp b/docs/static/screenshots/Chart/facet-brush-zoom-light-240w.webp new file mode 100644 index 0000000000..742efb1135 Binary files /dev/null and b/docs/static/screenshots/Chart/facet-brush-zoom-light-240w.webp differ diff --git a/docs/static/screenshots/Chart/facet-brush-zoom-light-400w.webp b/docs/static/screenshots/Chart/facet-brush-zoom-light-400w.webp new file mode 100644 index 0000000000..99aa7d7181 Binary files /dev/null and b/docs/static/screenshots/Chart/facet-brush-zoom-light-400w.webp differ diff --git a/docs/static/screenshots/Chart/facet-brush-zoom-light-800w.webp b/docs/static/screenshots/Chart/facet-brush-zoom-light-800w.webp new file mode 100644 index 0000000000..aff0f253db Binary files /dev/null and b/docs/static/screenshots/Chart/facet-brush-zoom-light-800w.webp differ diff --git a/docs/static/screenshots/Chart/facet-color-dark-240w.webp b/docs/static/screenshots/Chart/facet-color-dark-240w.webp new file mode 100644 index 0000000000..58e6cb2a5a Binary files /dev/null and b/docs/static/screenshots/Chart/facet-color-dark-240w.webp differ diff --git a/docs/static/screenshots/Chart/facet-color-dark-400w.webp b/docs/static/screenshots/Chart/facet-color-dark-400w.webp new file mode 100644 index 0000000000..7e4ed05215 Binary files /dev/null and b/docs/static/screenshots/Chart/facet-color-dark-400w.webp differ diff --git a/docs/static/screenshots/Chart/facet-color-dark-800w.webp b/docs/static/screenshots/Chart/facet-color-dark-800w.webp new file mode 100644 index 0000000000..aee6162164 Binary files /dev/null and b/docs/static/screenshots/Chart/facet-color-dark-800w.webp differ diff --git a/docs/static/screenshots/Chart/facet-color-light-240w.webp b/docs/static/screenshots/Chart/facet-color-light-240w.webp new file mode 100644 index 0000000000..92182a119d Binary files /dev/null and b/docs/static/screenshots/Chart/facet-color-light-240w.webp differ diff --git a/docs/static/screenshots/Chart/facet-color-light-400w.webp b/docs/static/screenshots/Chart/facet-color-light-400w.webp new file mode 100644 index 0000000000..7c19d9b7d8 Binary files /dev/null and b/docs/static/screenshots/Chart/facet-color-light-400w.webp differ diff --git a/docs/static/screenshots/Chart/facet-color-light-800w.webp b/docs/static/screenshots/Chart/facet-color-light-800w.webp new file mode 100644 index 0000000000..fb84ac27fc Binary files /dev/null and b/docs/static/screenshots/Chart/facet-color-light-800w.webp differ diff --git a/docs/static/screenshots/Chart/facet-composed-dark-240w.webp b/docs/static/screenshots/Chart/facet-composed-dark-240w.webp new file mode 100644 index 0000000000..cdf12de4f9 Binary files /dev/null and b/docs/static/screenshots/Chart/facet-composed-dark-240w.webp differ diff --git a/docs/static/screenshots/Chart/facet-composed-dark-400w.webp b/docs/static/screenshots/Chart/facet-composed-dark-400w.webp new file mode 100644 index 0000000000..4c9b972201 Binary files /dev/null and b/docs/static/screenshots/Chart/facet-composed-dark-400w.webp differ diff --git a/docs/static/screenshots/Chart/facet-composed-dark-800w.webp b/docs/static/screenshots/Chart/facet-composed-dark-800w.webp new file mode 100644 index 0000000000..90f334c6dd Binary files /dev/null and b/docs/static/screenshots/Chart/facet-composed-dark-800w.webp differ diff --git a/docs/static/screenshots/Chart/facet-composed-light-240w.webp b/docs/static/screenshots/Chart/facet-composed-light-240w.webp new file mode 100644 index 0000000000..42cea278b4 Binary files /dev/null and b/docs/static/screenshots/Chart/facet-composed-light-240w.webp differ diff --git a/docs/static/screenshots/Chart/facet-composed-light-400w.webp b/docs/static/screenshots/Chart/facet-composed-light-400w.webp new file mode 100644 index 0000000000..922701c285 Binary files /dev/null and b/docs/static/screenshots/Chart/facet-composed-light-400w.webp differ diff --git a/docs/static/screenshots/Chart/facet-composed-light-800w.webp b/docs/static/screenshots/Chart/facet-composed-light-800w.webp new file mode 100644 index 0000000000..ab88cd02f2 Binary files /dev/null and b/docs/static/screenshots/Chart/facet-composed-light-800w.webp differ diff --git a/docs/static/screenshots/Chart/facet-grid-dark-240w.webp b/docs/static/screenshots/Chart/facet-grid-dark-240w.webp new file mode 100644 index 0000000000..dcc5c6329f Binary files /dev/null and b/docs/static/screenshots/Chart/facet-grid-dark-240w.webp differ diff --git a/docs/static/screenshots/Chart/facet-grid-dark-400w.webp b/docs/static/screenshots/Chart/facet-grid-dark-400w.webp new file mode 100644 index 0000000000..1f9c300e10 Binary files /dev/null and b/docs/static/screenshots/Chart/facet-grid-dark-400w.webp differ diff --git a/docs/static/screenshots/Chart/facet-grid-dark-800w.webp b/docs/static/screenshots/Chart/facet-grid-dark-800w.webp new file mode 100644 index 0000000000..2e87a61d1d Binary files /dev/null and b/docs/static/screenshots/Chart/facet-grid-dark-800w.webp differ diff --git a/docs/static/screenshots/Chart/facet-grid-light-240w.webp b/docs/static/screenshots/Chart/facet-grid-light-240w.webp new file mode 100644 index 0000000000..c86d6ba153 Binary files /dev/null and b/docs/static/screenshots/Chart/facet-grid-light-240w.webp differ diff --git a/docs/static/screenshots/Chart/facet-grid-light-400w.webp b/docs/static/screenshots/Chart/facet-grid-light-400w.webp new file mode 100644 index 0000000000..a988ed1a44 Binary files /dev/null and b/docs/static/screenshots/Chart/facet-grid-light-400w.webp differ diff --git a/docs/static/screenshots/Chart/facet-grid-light-800w.webp b/docs/static/screenshots/Chart/facet-grid-light-800w.webp new file mode 100644 index 0000000000..64850a2744 Binary files /dev/null and b/docs/static/screenshots/Chart/facet-grid-light-800w.webp differ diff --git a/docs/static/screenshots/Chart/facet-lines-dark-240w.webp b/docs/static/screenshots/Chart/facet-lines-dark-240w.webp new file mode 100644 index 0000000000..23af0bfd05 Binary files /dev/null and b/docs/static/screenshots/Chart/facet-lines-dark-240w.webp differ diff --git a/docs/static/screenshots/Chart/facet-lines-dark-400w.webp b/docs/static/screenshots/Chart/facet-lines-dark-400w.webp new file mode 100644 index 0000000000..d70739158f Binary files /dev/null and b/docs/static/screenshots/Chart/facet-lines-dark-400w.webp differ diff --git a/docs/static/screenshots/Chart/facet-lines-dark-800w.webp b/docs/static/screenshots/Chart/facet-lines-dark-800w.webp new file mode 100644 index 0000000000..6ee11d8670 Binary files /dev/null and b/docs/static/screenshots/Chart/facet-lines-dark-800w.webp differ diff --git a/docs/static/screenshots/Chart/facet-lines-light-240w.webp b/docs/static/screenshots/Chart/facet-lines-light-240w.webp new file mode 100644 index 0000000000..365f5bd496 Binary files /dev/null and b/docs/static/screenshots/Chart/facet-lines-light-240w.webp differ diff --git a/docs/static/screenshots/Chart/facet-lines-light-400w.webp b/docs/static/screenshots/Chart/facet-lines-light-400w.webp new file mode 100644 index 0000000000..946e34bef0 Binary files /dev/null and b/docs/static/screenshots/Chart/facet-lines-light-400w.webp differ diff --git a/docs/static/screenshots/Chart/facet-lines-light-800w.webp b/docs/static/screenshots/Chart/facet-lines-light-800w.webp new file mode 100644 index 0000000000..eba5423805 Binary files /dev/null and b/docs/static/screenshots/Chart/facet-lines-light-800w.webp differ diff --git a/docs/static/screenshots/Chart/facet-non-faceted-marks-dark-240w.webp b/docs/static/screenshots/Chart/facet-non-faceted-marks-dark-240w.webp new file mode 100644 index 0000000000..39407df598 Binary files /dev/null and b/docs/static/screenshots/Chart/facet-non-faceted-marks-dark-240w.webp differ diff --git a/docs/static/screenshots/Chart/facet-non-faceted-marks-dark-400w.webp b/docs/static/screenshots/Chart/facet-non-faceted-marks-dark-400w.webp new file mode 100644 index 0000000000..5628b5348f Binary files /dev/null and b/docs/static/screenshots/Chart/facet-non-faceted-marks-dark-400w.webp differ diff --git a/docs/static/screenshots/Chart/facet-non-faceted-marks-dark-800w.webp b/docs/static/screenshots/Chart/facet-non-faceted-marks-dark-800w.webp new file mode 100644 index 0000000000..398a424b06 Binary files /dev/null and b/docs/static/screenshots/Chart/facet-non-faceted-marks-dark-800w.webp differ diff --git a/docs/static/screenshots/Chart/facet-non-faceted-marks-light-240w.webp b/docs/static/screenshots/Chart/facet-non-faceted-marks-light-240w.webp new file mode 100644 index 0000000000..4ebea62959 Binary files /dev/null and b/docs/static/screenshots/Chart/facet-non-faceted-marks-light-240w.webp differ diff --git a/docs/static/screenshots/Chart/facet-non-faceted-marks-light-400w.webp b/docs/static/screenshots/Chart/facet-non-faceted-marks-light-400w.webp new file mode 100644 index 0000000000..10dd2012fa Binary files /dev/null and b/docs/static/screenshots/Chart/facet-non-faceted-marks-light-400w.webp differ diff --git a/docs/static/screenshots/Chart/facet-non-faceted-marks-light-800w.webp b/docs/static/screenshots/Chart/facet-non-faceted-marks-light-800w.webp new file mode 100644 index 0000000000..0dd209a0ba Binary files /dev/null and b/docs/static/screenshots/Chart/facet-non-faceted-marks-light-800w.webp differ diff --git a/docs/static/screenshots/Chart/facet-spacing-dark-240w.webp b/docs/static/screenshots/Chart/facet-spacing-dark-240w.webp new file mode 100644 index 0000000000..9bd1efec30 Binary files /dev/null and b/docs/static/screenshots/Chart/facet-spacing-dark-240w.webp differ diff --git a/docs/static/screenshots/Chart/facet-spacing-dark-400w.webp b/docs/static/screenshots/Chart/facet-spacing-dark-400w.webp new file mode 100644 index 0000000000..a4bc8e5b50 Binary files /dev/null and b/docs/static/screenshots/Chart/facet-spacing-dark-400w.webp differ diff --git a/docs/static/screenshots/Chart/facet-spacing-dark-800w.webp b/docs/static/screenshots/Chart/facet-spacing-dark-800w.webp new file mode 100644 index 0000000000..1ca75329e3 Binary files /dev/null and b/docs/static/screenshots/Chart/facet-spacing-dark-800w.webp differ diff --git a/docs/static/screenshots/Chart/facet-spacing-light-240w.webp b/docs/static/screenshots/Chart/facet-spacing-light-240w.webp new file mode 100644 index 0000000000..54498e90ba Binary files /dev/null and b/docs/static/screenshots/Chart/facet-spacing-light-240w.webp differ diff --git a/docs/static/screenshots/Chart/facet-spacing-light-400w.webp b/docs/static/screenshots/Chart/facet-spacing-light-400w.webp new file mode 100644 index 0000000000..dc4863cfce Binary files /dev/null and b/docs/static/screenshots/Chart/facet-spacing-light-400w.webp differ diff --git a/docs/static/screenshots/Chart/facet-spacing-light-800w.webp b/docs/static/screenshots/Chart/facet-spacing-light-800w.webp new file mode 100644 index 0000000000..5133070b10 Binary files /dev/null and b/docs/static/screenshots/Chart/facet-spacing-light-800w.webp differ diff --git a/docs/static/screenshots/Chart/facet-tooltip-dark-240w.webp b/docs/static/screenshots/Chart/facet-tooltip-dark-240w.webp new file mode 100644 index 0000000000..c3db9216ca Binary files /dev/null and b/docs/static/screenshots/Chart/facet-tooltip-dark-240w.webp differ diff --git a/docs/static/screenshots/Chart/facet-tooltip-dark-400w.webp b/docs/static/screenshots/Chart/facet-tooltip-dark-400w.webp new file mode 100644 index 0000000000..98b74b0c45 Binary files /dev/null and b/docs/static/screenshots/Chart/facet-tooltip-dark-400w.webp differ diff --git a/docs/static/screenshots/Chart/facet-tooltip-dark-800w.webp b/docs/static/screenshots/Chart/facet-tooltip-dark-800w.webp new file mode 100644 index 0000000000..ee3b28da03 Binary files /dev/null and b/docs/static/screenshots/Chart/facet-tooltip-dark-800w.webp differ diff --git a/docs/static/screenshots/Chart/facet-tooltip-light-240w.webp b/docs/static/screenshots/Chart/facet-tooltip-light-240w.webp new file mode 100644 index 0000000000..2097e44d12 Binary files /dev/null and b/docs/static/screenshots/Chart/facet-tooltip-light-240w.webp differ diff --git a/docs/static/screenshots/Chart/facet-tooltip-light-400w.webp b/docs/static/screenshots/Chart/facet-tooltip-light-400w.webp new file mode 100644 index 0000000000..da245ffbb7 Binary files /dev/null and b/docs/static/screenshots/Chart/facet-tooltip-light-400w.webp differ diff --git a/docs/static/screenshots/Chart/facet-tooltip-light-800w.webp b/docs/static/screenshots/Chart/facet-tooltip-light-800w.webp new file mode 100644 index 0000000000..5fabde8f38 Binary files /dev/null and b/docs/static/screenshots/Chart/facet-tooltip-light-800w.webp differ diff --git a/docs/static/screenshots/Chart/facet-two-dimensional-dark-240w.webp b/docs/static/screenshots/Chart/facet-two-dimensional-dark-240w.webp new file mode 100644 index 0000000000..afc183b78d Binary files /dev/null and b/docs/static/screenshots/Chart/facet-two-dimensional-dark-240w.webp differ diff --git a/docs/static/screenshots/Chart/facet-two-dimensional-dark-400w.webp b/docs/static/screenshots/Chart/facet-two-dimensional-dark-400w.webp new file mode 100644 index 0000000000..4fc5a58b38 Binary files /dev/null and b/docs/static/screenshots/Chart/facet-two-dimensional-dark-400w.webp differ diff --git a/docs/static/screenshots/Chart/facet-two-dimensional-dark-800w.webp b/docs/static/screenshots/Chart/facet-two-dimensional-dark-800w.webp new file mode 100644 index 0000000000..82ea46e354 Binary files /dev/null and b/docs/static/screenshots/Chart/facet-two-dimensional-dark-800w.webp differ diff --git a/docs/static/screenshots/Chart/facet-two-dimensional-light-240w.webp b/docs/static/screenshots/Chart/facet-two-dimensional-light-240w.webp new file mode 100644 index 0000000000..dafa3b196d Binary files /dev/null and b/docs/static/screenshots/Chart/facet-two-dimensional-light-240w.webp differ diff --git a/docs/static/screenshots/Chart/facet-two-dimensional-light-400w.webp b/docs/static/screenshots/Chart/facet-two-dimensional-light-400w.webp new file mode 100644 index 0000000000..d5a44cdd7c Binary files /dev/null and b/docs/static/screenshots/Chart/facet-two-dimensional-light-400w.webp differ diff --git a/docs/static/screenshots/Chart/facet-two-dimensional-light-800w.webp b/docs/static/screenshots/Chart/facet-two-dimensional-light-800w.webp new file mode 100644 index 0000000000..cd19b82809 Binary files /dev/null and b/docs/static/screenshots/Chart/facet-two-dimensional-light-800w.webp differ diff --git a/docs/static/screenshots/Chart/facet-wrap-dark-240w.webp b/docs/static/screenshots/Chart/facet-wrap-dark-240w.webp new file mode 100644 index 0000000000..b11e7100aa Binary files /dev/null and b/docs/static/screenshots/Chart/facet-wrap-dark-240w.webp differ diff --git a/docs/static/screenshots/Chart/facet-wrap-dark-400w.webp b/docs/static/screenshots/Chart/facet-wrap-dark-400w.webp new file mode 100644 index 0000000000..f13b3ece4d Binary files /dev/null and b/docs/static/screenshots/Chart/facet-wrap-dark-400w.webp differ diff --git a/docs/static/screenshots/Chart/facet-wrap-dark-800w.webp b/docs/static/screenshots/Chart/facet-wrap-dark-800w.webp new file mode 100644 index 0000000000..f1d10acf4c Binary files /dev/null and b/docs/static/screenshots/Chart/facet-wrap-dark-800w.webp differ diff --git a/docs/static/screenshots/Chart/facet-wrap-light-240w.webp b/docs/static/screenshots/Chart/facet-wrap-light-240w.webp new file mode 100644 index 0000000000..d661585cb9 Binary files /dev/null and b/docs/static/screenshots/Chart/facet-wrap-light-240w.webp differ diff --git a/docs/static/screenshots/Chart/facet-wrap-light-400w.webp b/docs/static/screenshots/Chart/facet-wrap-light-400w.webp new file mode 100644 index 0000000000..d0da917e96 Binary files /dev/null and b/docs/static/screenshots/Chart/facet-wrap-light-400w.webp differ diff --git a/docs/static/screenshots/Chart/facet-wrap-light-800w.webp b/docs/static/screenshots/Chart/facet-wrap-light-800w.webp new file mode 100644 index 0000000000..5b2b7fa8c0 Binary files /dev/null and b/docs/static/screenshots/Chart/facet-wrap-light-800w.webp differ diff --git a/docs/static/screenshots/Chart/facet-x-dark-240w.webp b/docs/static/screenshots/Chart/facet-x-dark-240w.webp new file mode 100644 index 0000000000..8c043a6b5a Binary files /dev/null and b/docs/static/screenshots/Chart/facet-x-dark-240w.webp differ diff --git a/docs/static/screenshots/Chart/facet-x-dark-400w.webp b/docs/static/screenshots/Chart/facet-x-dark-400w.webp new file mode 100644 index 0000000000..0213f8e5d0 Binary files /dev/null and b/docs/static/screenshots/Chart/facet-x-dark-400w.webp differ diff --git a/docs/static/screenshots/Chart/facet-x-dark-800w.webp b/docs/static/screenshots/Chart/facet-x-dark-800w.webp new file mode 100644 index 0000000000..b6ab1f687e Binary files /dev/null and b/docs/static/screenshots/Chart/facet-x-dark-800w.webp differ diff --git a/docs/static/screenshots/Chart/facet-x-light-240w.webp b/docs/static/screenshots/Chart/facet-x-light-240w.webp new file mode 100644 index 0000000000..7142ff436a Binary files /dev/null and b/docs/static/screenshots/Chart/facet-x-light-240w.webp differ diff --git a/docs/static/screenshots/Chart/facet-x-light-400w.webp b/docs/static/screenshots/Chart/facet-x-light-400w.webp new file mode 100644 index 0000000000..f77b59d5e6 Binary files /dev/null and b/docs/static/screenshots/Chart/facet-x-light-400w.webp differ diff --git a/docs/static/screenshots/Chart/facet-x-light-800w.webp b/docs/static/screenshots/Chart/facet-x-light-800w.webp new file mode 100644 index 0000000000..506603ee46 Binary files /dev/null and b/docs/static/screenshots/Chart/facet-x-light-800w.webp differ diff --git a/docs/static/screenshots/Chart/facet-y-dark-240w.webp b/docs/static/screenshots/Chart/facet-y-dark-240w.webp new file mode 100644 index 0000000000..cf4bcc9fd2 Binary files /dev/null and b/docs/static/screenshots/Chart/facet-y-dark-240w.webp differ diff --git a/docs/static/screenshots/Chart/facet-y-dark-400w.webp b/docs/static/screenshots/Chart/facet-y-dark-400w.webp new file mode 100644 index 0000000000..22eece6a7b Binary files /dev/null and b/docs/static/screenshots/Chart/facet-y-dark-400w.webp differ diff --git a/docs/static/screenshots/Chart/facet-y-dark-800w.webp b/docs/static/screenshots/Chart/facet-y-dark-800w.webp new file mode 100644 index 0000000000..93affbaa54 Binary files /dev/null and b/docs/static/screenshots/Chart/facet-y-dark-800w.webp differ diff --git a/docs/static/screenshots/Chart/facet-y-light-240w.webp b/docs/static/screenshots/Chart/facet-y-light-240w.webp new file mode 100644 index 0000000000..879beb340c Binary files /dev/null and b/docs/static/screenshots/Chart/facet-y-light-240w.webp differ diff --git a/docs/static/screenshots/Chart/facet-y-light-400w.webp b/docs/static/screenshots/Chart/facet-y-light-400w.webp new file mode 100644 index 0000000000..65e0c10174 Binary files /dev/null and b/docs/static/screenshots/Chart/facet-y-light-400w.webp differ diff --git a/docs/static/screenshots/Chart/facet-y-light-800w.webp b/docs/static/screenshots/Chart/facet-y-light-800w.webp new file mode 100644 index 0000000000..1426771c99 Binary files /dev/null and b/docs/static/screenshots/Chart/facet-y-light-800w.webp differ diff --git a/docs/static/screenshots/Chart/mixed-marks-with-stack-dark-240w.webp b/docs/static/screenshots/Chart/mixed-marks-with-stack-dark-240w.webp new file mode 100644 index 0000000000..6f3e197cf6 Binary files /dev/null and b/docs/static/screenshots/Chart/mixed-marks-with-stack-dark-240w.webp differ diff --git a/docs/static/screenshots/Chart/mixed-marks-with-stack-dark-400w.webp b/docs/static/screenshots/Chart/mixed-marks-with-stack-dark-400w.webp new file mode 100644 index 0000000000..7b5cc26e4e Binary files /dev/null and b/docs/static/screenshots/Chart/mixed-marks-with-stack-dark-400w.webp differ diff --git a/docs/static/screenshots/Chart/mixed-marks-with-stack-dark-800w.webp b/docs/static/screenshots/Chart/mixed-marks-with-stack-dark-800w.webp new file mode 100644 index 0000000000..d277d79705 Binary files /dev/null and b/docs/static/screenshots/Chart/mixed-marks-with-stack-dark-800w.webp differ diff --git a/docs/static/screenshots/Chart/mixed-marks-with-stack-light-240w.webp b/docs/static/screenshots/Chart/mixed-marks-with-stack-light-240w.webp new file mode 100644 index 0000000000..07f3cd37f2 Binary files /dev/null and b/docs/static/screenshots/Chart/mixed-marks-with-stack-light-240w.webp differ diff --git a/docs/static/screenshots/Chart/mixed-marks-with-stack-light-400w.webp b/docs/static/screenshots/Chart/mixed-marks-with-stack-light-400w.webp new file mode 100644 index 0000000000..534d7832e5 Binary files /dev/null and b/docs/static/screenshots/Chart/mixed-marks-with-stack-light-400w.webp differ diff --git a/docs/static/screenshots/Chart/mixed-marks-with-stack-light-800w.webp b/docs/static/screenshots/Chart/mixed-marks-with-stack-light-800w.webp new file mode 100644 index 0000000000..96bc04797e Binary files /dev/null and b/docs/static/screenshots/Chart/mixed-marks-with-stack-light-800w.webp differ diff --git a/docs/static/screenshots/Chart/mixed-marks-with-stack-long-data-dark-240w.webp b/docs/static/screenshots/Chart/mixed-marks-with-stack-long-data-dark-240w.webp new file mode 100644 index 0000000000..c86716049a Binary files /dev/null and b/docs/static/screenshots/Chart/mixed-marks-with-stack-long-data-dark-240w.webp differ diff --git a/docs/static/screenshots/Chart/mixed-marks-with-stack-long-data-dark-400w.webp b/docs/static/screenshots/Chart/mixed-marks-with-stack-long-data-dark-400w.webp new file mode 100644 index 0000000000..22e1ddec45 Binary files /dev/null and b/docs/static/screenshots/Chart/mixed-marks-with-stack-long-data-dark-400w.webp differ diff --git a/docs/static/screenshots/Chart/mixed-marks-with-stack-long-data-dark-800w.webp b/docs/static/screenshots/Chart/mixed-marks-with-stack-long-data-dark-800w.webp new file mode 100644 index 0000000000..c6f2dd8ba2 Binary files /dev/null and b/docs/static/screenshots/Chart/mixed-marks-with-stack-long-data-dark-800w.webp differ diff --git a/docs/static/screenshots/Chart/mixed-marks-with-stack-long-data-light-240w.webp b/docs/static/screenshots/Chart/mixed-marks-with-stack-long-data-light-240w.webp new file mode 100644 index 0000000000..0628296456 Binary files /dev/null and b/docs/static/screenshots/Chart/mixed-marks-with-stack-long-data-light-240w.webp differ diff --git a/docs/static/screenshots/Chart/mixed-marks-with-stack-long-data-light-400w.webp b/docs/static/screenshots/Chart/mixed-marks-with-stack-long-data-light-400w.webp new file mode 100644 index 0000000000..8c63989ff0 Binary files /dev/null and b/docs/static/screenshots/Chart/mixed-marks-with-stack-long-data-light-400w.webp differ diff --git a/docs/static/screenshots/Chart/mixed-marks-with-stack-long-data-light-800w.webp b/docs/static/screenshots/Chart/mixed-marks-with-stack-long-data-light-800w.webp new file mode 100644 index 0000000000..aeed8f9017 Binary files /dev/null and b/docs/static/screenshots/Chart/mixed-marks-with-stack-long-data-light-800w.webp differ diff --git a/docs/static/screenshots/ChartGroup/basic-dark-240w.webp b/docs/static/screenshots/ChartGroup/basic-dark-240w.webp new file mode 100644 index 0000000000..ee04e69a33 Binary files /dev/null and b/docs/static/screenshots/ChartGroup/basic-dark-240w.webp differ diff --git a/docs/static/screenshots/ChartGroup/basic-dark-400w.webp b/docs/static/screenshots/ChartGroup/basic-dark-400w.webp new file mode 100644 index 0000000000..d8452d1739 Binary files /dev/null and b/docs/static/screenshots/ChartGroup/basic-dark-400w.webp differ diff --git a/docs/static/screenshots/ChartGroup/basic-dark-800w.webp b/docs/static/screenshots/ChartGroup/basic-dark-800w.webp new file mode 100644 index 0000000000..c141d34146 Binary files /dev/null and b/docs/static/screenshots/ChartGroup/basic-dark-800w.webp differ diff --git a/docs/static/screenshots/ChartGroup/basic-light-240w.webp b/docs/static/screenshots/ChartGroup/basic-light-240w.webp new file mode 100644 index 0000000000..2fe1c0db11 Binary files /dev/null and b/docs/static/screenshots/ChartGroup/basic-light-240w.webp differ diff --git a/docs/static/screenshots/ChartGroup/basic-light-400w.webp b/docs/static/screenshots/ChartGroup/basic-light-400w.webp new file mode 100644 index 0000000000..ed239b1e4c Binary files /dev/null and b/docs/static/screenshots/ChartGroup/basic-light-400w.webp differ diff --git a/docs/static/screenshots/ChartGroup/basic-light-800w.webp b/docs/static/screenshots/ChartGroup/basic-light-800w.webp new file mode 100644 index 0000000000..f70de93cb9 Binary files /dev/null and b/docs/static/screenshots/ChartGroup/basic-light-800w.webp differ diff --git a/docs/static/screenshots/ChartGroup/coordinated-views-dark-240w.webp b/docs/static/screenshots/ChartGroup/coordinated-views-dark-240w.webp new file mode 100644 index 0000000000..d012336dfd Binary files /dev/null and b/docs/static/screenshots/ChartGroup/coordinated-views-dark-240w.webp differ diff --git a/docs/static/screenshots/ChartGroup/coordinated-views-dark-400w.webp b/docs/static/screenshots/ChartGroup/coordinated-views-dark-400w.webp new file mode 100644 index 0000000000..db4113ef15 Binary files /dev/null and b/docs/static/screenshots/ChartGroup/coordinated-views-dark-400w.webp differ diff --git a/docs/static/screenshots/ChartGroup/coordinated-views-dark-800w.webp b/docs/static/screenshots/ChartGroup/coordinated-views-dark-800w.webp new file mode 100644 index 0000000000..f2d601b29f Binary files /dev/null and b/docs/static/screenshots/ChartGroup/coordinated-views-dark-800w.webp differ diff --git a/docs/static/screenshots/ChartGroup/coordinated-views-light-240w.webp b/docs/static/screenshots/ChartGroup/coordinated-views-light-240w.webp new file mode 100644 index 0000000000..31a6e4fc07 Binary files /dev/null and b/docs/static/screenshots/ChartGroup/coordinated-views-light-240w.webp differ diff --git a/docs/static/screenshots/ChartGroup/coordinated-views-light-400w.webp b/docs/static/screenshots/ChartGroup/coordinated-views-light-400w.webp new file mode 100644 index 0000000000..239e1ee8fa Binary files /dev/null and b/docs/static/screenshots/ChartGroup/coordinated-views-light-400w.webp differ diff --git a/docs/static/screenshots/ChartGroup/coordinated-views-light-800w.webp b/docs/static/screenshots/ChartGroup/coordinated-views-light-800w.webp new file mode 100644 index 0000000000..81e4f3cb36 Binary files /dev/null and b/docs/static/screenshots/ChartGroup/coordinated-views-light-800w.webp differ diff --git a/docs/static/screenshots/ChartGroup/faceted-group-dark-240w.webp b/docs/static/screenshots/ChartGroup/faceted-group-dark-240w.webp new file mode 100644 index 0000000000..3b6498c6f5 Binary files /dev/null and b/docs/static/screenshots/ChartGroup/faceted-group-dark-240w.webp differ diff --git a/docs/static/screenshots/ChartGroup/faceted-group-dark-400w.webp b/docs/static/screenshots/ChartGroup/faceted-group-dark-400w.webp new file mode 100644 index 0000000000..93dfe46a1a Binary files /dev/null and b/docs/static/screenshots/ChartGroup/faceted-group-dark-400w.webp differ diff --git a/docs/static/screenshots/ChartGroup/faceted-group-dark-800w.webp b/docs/static/screenshots/ChartGroup/faceted-group-dark-800w.webp new file mode 100644 index 0000000000..8483898f5e Binary files /dev/null and b/docs/static/screenshots/ChartGroup/faceted-group-dark-800w.webp differ diff --git a/docs/static/screenshots/ChartGroup/faceted-group-light-240w.webp b/docs/static/screenshots/ChartGroup/faceted-group-light-240w.webp new file mode 100644 index 0000000000..5b81f3ee22 Binary files /dev/null and b/docs/static/screenshots/ChartGroup/faceted-group-light-240w.webp differ diff --git a/docs/static/screenshots/ChartGroup/faceted-group-light-400w.webp b/docs/static/screenshots/ChartGroup/faceted-group-light-400w.webp new file mode 100644 index 0000000000..9a9cd6002a Binary files /dev/null and b/docs/static/screenshots/ChartGroup/faceted-group-light-400w.webp differ diff --git a/docs/static/screenshots/ChartGroup/faceted-group-light-800w.webp b/docs/static/screenshots/ChartGroup/faceted-group-light-800w.webp new file mode 100644 index 0000000000..4531e091d1 Binary files /dev/null and b/docs/static/screenshots/ChartGroup/faceted-group-light-800w.webp differ diff --git a/docs/static/screenshots/ChartGroup/highlight-only-dark-240w.webp b/docs/static/screenshots/ChartGroup/highlight-only-dark-240w.webp new file mode 100644 index 0000000000..b8701005a6 Binary files /dev/null and b/docs/static/screenshots/ChartGroup/highlight-only-dark-240w.webp differ diff --git a/docs/static/screenshots/ChartGroup/highlight-only-dark-400w.webp b/docs/static/screenshots/ChartGroup/highlight-only-dark-400w.webp new file mode 100644 index 0000000000..af78491c80 Binary files /dev/null and b/docs/static/screenshots/ChartGroup/highlight-only-dark-400w.webp differ diff --git a/docs/static/screenshots/ChartGroup/highlight-only-dark-800w.webp b/docs/static/screenshots/ChartGroup/highlight-only-dark-800w.webp new file mode 100644 index 0000000000..3c75bc25a9 Binary files /dev/null and b/docs/static/screenshots/ChartGroup/highlight-only-dark-800w.webp differ diff --git a/docs/static/screenshots/ChartGroup/highlight-only-light-240w.webp b/docs/static/screenshots/ChartGroup/highlight-only-light-240w.webp new file mode 100644 index 0000000000..90b9c199a8 Binary files /dev/null and b/docs/static/screenshots/ChartGroup/highlight-only-light-240w.webp differ diff --git a/docs/static/screenshots/ChartGroup/highlight-only-light-400w.webp b/docs/static/screenshots/ChartGroup/highlight-only-light-400w.webp new file mode 100644 index 0000000000..e8df54a24e Binary files /dev/null and b/docs/static/screenshots/ChartGroup/highlight-only-light-400w.webp differ diff --git a/docs/static/screenshots/ChartGroup/highlight-only-light-800w.webp b/docs/static/screenshots/ChartGroup/highlight-only-light-800w.webp new file mode 100644 index 0000000000..e7a873776a Binary files /dev/null and b/docs/static/screenshots/ChartGroup/highlight-only-light-800w.webp differ diff --git a/docs/static/screenshots/ChartGroup/minimap-dark-240w.webp b/docs/static/screenshots/ChartGroup/minimap-dark-240w.webp new file mode 100644 index 0000000000..9d96372cfe Binary files /dev/null and b/docs/static/screenshots/ChartGroup/minimap-dark-240w.webp differ diff --git a/docs/static/screenshots/ChartGroup/minimap-dark-400w.webp b/docs/static/screenshots/ChartGroup/minimap-dark-400w.webp new file mode 100644 index 0000000000..761155a660 Binary files /dev/null and b/docs/static/screenshots/ChartGroup/minimap-dark-400w.webp differ diff --git a/docs/static/screenshots/ChartGroup/minimap-dark-800w.webp b/docs/static/screenshots/ChartGroup/minimap-dark-800w.webp new file mode 100644 index 0000000000..d85ee56dfb Binary files /dev/null and b/docs/static/screenshots/ChartGroup/minimap-dark-800w.webp differ diff --git a/docs/static/screenshots/ChartGroup/minimap-light-240w.webp b/docs/static/screenshots/ChartGroup/minimap-light-240w.webp new file mode 100644 index 0000000000..7dbfd4f9aa Binary files /dev/null and b/docs/static/screenshots/ChartGroup/minimap-light-240w.webp differ diff --git a/docs/static/screenshots/ChartGroup/minimap-light-400w.webp b/docs/static/screenshots/ChartGroup/minimap-light-400w.webp new file mode 100644 index 0000000000..40854ddc55 Binary files /dev/null and b/docs/static/screenshots/ChartGroup/minimap-light-400w.webp differ diff --git a/docs/static/screenshots/ChartGroup/minimap-light-800w.webp b/docs/static/screenshots/ChartGroup/minimap-light-800w.webp new file mode 100644 index 0000000000..cef5df81ea Binary files /dev/null and b/docs/static/screenshots/ChartGroup/minimap-light-800w.webp differ diff --git a/docs/static/screenshots/ChartGroup/programmatic-control-dark-240w.webp b/docs/static/screenshots/ChartGroup/programmatic-control-dark-240w.webp new file mode 100644 index 0000000000..4360490fce Binary files /dev/null and b/docs/static/screenshots/ChartGroup/programmatic-control-dark-240w.webp differ diff --git a/docs/static/screenshots/ChartGroup/programmatic-control-dark-400w.webp b/docs/static/screenshots/ChartGroup/programmatic-control-dark-400w.webp new file mode 100644 index 0000000000..3885df7112 Binary files /dev/null and b/docs/static/screenshots/ChartGroup/programmatic-control-dark-400w.webp differ diff --git a/docs/static/screenshots/ChartGroup/programmatic-control-dark-800w.webp b/docs/static/screenshots/ChartGroup/programmatic-control-dark-800w.webp new file mode 100644 index 0000000000..cac37059e5 Binary files /dev/null and b/docs/static/screenshots/ChartGroup/programmatic-control-dark-800w.webp differ diff --git a/docs/static/screenshots/ChartGroup/programmatic-control-light-240w.webp b/docs/static/screenshots/ChartGroup/programmatic-control-light-240w.webp new file mode 100644 index 0000000000..6f682bfba8 Binary files /dev/null and b/docs/static/screenshots/ChartGroup/programmatic-control-light-240w.webp differ diff --git a/docs/static/screenshots/ChartGroup/programmatic-control-light-400w.webp b/docs/static/screenshots/ChartGroup/programmatic-control-light-400w.webp new file mode 100644 index 0000000000..988da6a2f2 Binary files /dev/null and b/docs/static/screenshots/ChartGroup/programmatic-control-light-400w.webp differ diff --git a/docs/static/screenshots/ChartGroup/programmatic-control-light-800w.webp b/docs/static/screenshots/ChartGroup/programmatic-control-light-800w.webp new file mode 100644 index 0000000000..1ddb4d8398 Binary files /dev/null and b/docs/static/screenshots/ChartGroup/programmatic-control-light-800w.webp differ diff --git a/docs/static/screenshots/ChartGroup/synced-brushes-dark-240w.webp b/docs/static/screenshots/ChartGroup/synced-brushes-dark-240w.webp new file mode 100644 index 0000000000..9036b9d4d2 Binary files /dev/null and b/docs/static/screenshots/ChartGroup/synced-brushes-dark-240w.webp differ diff --git a/docs/static/screenshots/ChartGroup/synced-brushes-dark-400w.webp b/docs/static/screenshots/ChartGroup/synced-brushes-dark-400w.webp new file mode 100644 index 0000000000..a5cd5146c7 Binary files /dev/null and b/docs/static/screenshots/ChartGroup/synced-brushes-dark-400w.webp differ diff --git a/docs/static/screenshots/ChartGroup/synced-brushes-dark-800w.webp b/docs/static/screenshots/ChartGroup/synced-brushes-dark-800w.webp new file mode 100644 index 0000000000..f8946e58a1 Binary files /dev/null and b/docs/static/screenshots/ChartGroup/synced-brushes-dark-800w.webp differ diff --git a/docs/static/screenshots/ChartGroup/synced-brushes-light-240w.webp b/docs/static/screenshots/ChartGroup/synced-brushes-light-240w.webp new file mode 100644 index 0000000000..2dacf3edfa Binary files /dev/null and b/docs/static/screenshots/ChartGroup/synced-brushes-light-240w.webp differ diff --git a/docs/static/screenshots/ChartGroup/synced-brushes-light-400w.webp b/docs/static/screenshots/ChartGroup/synced-brushes-light-400w.webp new file mode 100644 index 0000000000..db78b161e4 Binary files /dev/null and b/docs/static/screenshots/ChartGroup/synced-brushes-light-400w.webp differ diff --git a/docs/static/screenshots/ChartGroup/synced-brushes-light-800w.webp b/docs/static/screenshots/ChartGroup/synced-brushes-light-800w.webp new file mode 100644 index 0000000000..ca40a6941d Binary files /dev/null and b/docs/static/screenshots/ChartGroup/synced-brushes-light-800w.webp differ diff --git a/docs/static/screenshots/ChartGroup/synced-legend-dark-240w.webp b/docs/static/screenshots/ChartGroup/synced-legend-dark-240w.webp new file mode 100644 index 0000000000..13f93ca910 Binary files /dev/null and b/docs/static/screenshots/ChartGroup/synced-legend-dark-240w.webp differ diff --git a/docs/static/screenshots/ChartGroup/synced-legend-dark-400w.webp b/docs/static/screenshots/ChartGroup/synced-legend-dark-400w.webp new file mode 100644 index 0000000000..68d2ff022c Binary files /dev/null and b/docs/static/screenshots/ChartGroup/synced-legend-dark-400w.webp differ diff --git a/docs/static/screenshots/ChartGroup/synced-legend-dark-800w.webp b/docs/static/screenshots/ChartGroup/synced-legend-dark-800w.webp new file mode 100644 index 0000000000..f6f48f06e6 Binary files /dev/null and b/docs/static/screenshots/ChartGroup/synced-legend-dark-800w.webp differ diff --git a/docs/static/screenshots/ChartGroup/synced-legend-light-240w.webp b/docs/static/screenshots/ChartGroup/synced-legend-light-240w.webp new file mode 100644 index 0000000000..15f2c5baca Binary files /dev/null and b/docs/static/screenshots/ChartGroup/synced-legend-light-240w.webp differ diff --git a/docs/static/screenshots/ChartGroup/synced-legend-light-400w.webp b/docs/static/screenshots/ChartGroup/synced-legend-light-400w.webp new file mode 100644 index 0000000000..a365ddfb25 Binary files /dev/null and b/docs/static/screenshots/ChartGroup/synced-legend-light-400w.webp differ diff --git a/docs/static/screenshots/ChartGroup/synced-legend-light-800w.webp b/docs/static/screenshots/ChartGroup/synced-legend-light-800w.webp new file mode 100644 index 0000000000..b2388c8bb1 Binary files /dev/null and b/docs/static/screenshots/ChartGroup/synced-legend-light-800w.webp differ diff --git a/docs/static/screenshots/ChartGroup/synced-zoom-dark-240w.webp b/docs/static/screenshots/ChartGroup/synced-zoom-dark-240w.webp new file mode 100644 index 0000000000..196f657732 Binary files /dev/null and b/docs/static/screenshots/ChartGroup/synced-zoom-dark-240w.webp differ diff --git a/docs/static/screenshots/ChartGroup/synced-zoom-dark-400w.webp b/docs/static/screenshots/ChartGroup/synced-zoom-dark-400w.webp new file mode 100644 index 0000000000..38a5d94851 Binary files /dev/null and b/docs/static/screenshots/ChartGroup/synced-zoom-dark-400w.webp differ diff --git a/docs/static/screenshots/ChartGroup/synced-zoom-dark-800w.webp b/docs/static/screenshots/ChartGroup/synced-zoom-dark-800w.webp new file mode 100644 index 0000000000..214db4f453 Binary files /dev/null and b/docs/static/screenshots/ChartGroup/synced-zoom-dark-800w.webp differ diff --git a/docs/static/screenshots/ChartGroup/synced-zoom-light-240w.webp b/docs/static/screenshots/ChartGroup/synced-zoom-light-240w.webp new file mode 100644 index 0000000000..8748e253a6 Binary files /dev/null and b/docs/static/screenshots/ChartGroup/synced-zoom-light-240w.webp differ diff --git a/docs/static/screenshots/ChartGroup/synced-zoom-light-400w.webp b/docs/static/screenshots/ChartGroup/synced-zoom-light-400w.webp new file mode 100644 index 0000000000..a3d6406ae8 Binary files /dev/null and b/docs/static/screenshots/ChartGroup/synced-zoom-light-400w.webp differ diff --git a/docs/static/screenshots/ChartGroup/synced-zoom-light-800w.webp b/docs/static/screenshots/ChartGroup/synced-zoom-light-800w.webp new file mode 100644 index 0000000000..24c46b38e1 Binary files /dev/null and b/docs/static/screenshots/ChartGroup/synced-zoom-light-800w.webp differ diff --git a/docs/static/screenshots/Chord/basic-dark-240w.webp b/docs/static/screenshots/Chord/basic-dark-240w.webp index ebf4ba481c..1e525ddf60 100644 Binary files a/docs/static/screenshots/Chord/basic-dark-240w.webp and b/docs/static/screenshots/Chord/basic-dark-240w.webp differ diff --git a/docs/static/screenshots/Chord/basic-dark-400w.webp b/docs/static/screenshots/Chord/basic-dark-400w.webp index 4ecd43e4ea..3c417e3175 100644 Binary files a/docs/static/screenshots/Chord/basic-dark-400w.webp and b/docs/static/screenshots/Chord/basic-dark-400w.webp differ diff --git a/docs/static/screenshots/Chord/basic-dark-800w.webp b/docs/static/screenshots/Chord/basic-dark-800w.webp index 38bc682338..fdc9d5fd7c 100644 Binary files a/docs/static/screenshots/Chord/basic-dark-800w.webp and b/docs/static/screenshots/Chord/basic-dark-800w.webp differ diff --git a/docs/static/screenshots/Chord/basic-light-400w.webp b/docs/static/screenshots/Chord/basic-light-400w.webp index 612d313310..ca242a67e7 100644 Binary files a/docs/static/screenshots/Chord/basic-light-400w.webp and b/docs/static/screenshots/Chord/basic-light-400w.webp differ diff --git a/docs/static/screenshots/Chord/basic-light-800w.webp b/docs/static/screenshots/Chord/basic-light-800w.webp index 216306ed05..e38fb0264c 100644 Binary files a/docs/static/screenshots/Chord/basic-light-800w.webp and b/docs/static/screenshots/Chord/basic-light-800w.webp differ diff --git a/docs/static/screenshots/Chord/directed-dark-240w.webp b/docs/static/screenshots/Chord/directed-dark-240w.webp index fb42bb49f8..4e775e601c 100644 Binary files a/docs/static/screenshots/Chord/directed-dark-240w.webp and b/docs/static/screenshots/Chord/directed-dark-240w.webp differ diff --git a/docs/static/screenshots/Chord/directed-dark-400w.webp b/docs/static/screenshots/Chord/directed-dark-400w.webp index 66cfeaddab..af9e6b0dc7 100644 Binary files a/docs/static/screenshots/Chord/directed-dark-400w.webp and b/docs/static/screenshots/Chord/directed-dark-400w.webp differ diff --git a/docs/static/screenshots/Chord/directed-dark-800w.webp b/docs/static/screenshots/Chord/directed-dark-800w.webp index e0ec41a405..deda6278b3 100644 Binary files a/docs/static/screenshots/Chord/directed-dark-800w.webp and b/docs/static/screenshots/Chord/directed-dark-800w.webp differ diff --git a/docs/static/screenshots/Chord/directed-light-240w.webp b/docs/static/screenshots/Chord/directed-light-240w.webp index a183de289b..ab4fc3ed6b 100644 Binary files a/docs/static/screenshots/Chord/directed-light-240w.webp and b/docs/static/screenshots/Chord/directed-light-240w.webp differ diff --git a/docs/static/screenshots/Chord/directed-light-400w.webp b/docs/static/screenshots/Chord/directed-light-400w.webp index 9e3a0fa375..059b560e8a 100644 Binary files a/docs/static/screenshots/Chord/directed-light-400w.webp and b/docs/static/screenshots/Chord/directed-light-400w.webp differ diff --git a/docs/static/screenshots/Chord/directed-light-800w.webp b/docs/static/screenshots/Chord/directed-light-800w.webp index dd99798054..7936aa1750 100644 Binary files a/docs/static/screenshots/Chord/directed-light-800w.webp and b/docs/static/screenshots/Chord/directed-light-800w.webp differ diff --git a/docs/static/screenshots/Chord/gradient-dark-240w.webp b/docs/static/screenshots/Chord/gradient-dark-240w.webp index 297e00d963..291690496b 100644 Binary files a/docs/static/screenshots/Chord/gradient-dark-240w.webp and b/docs/static/screenshots/Chord/gradient-dark-240w.webp differ diff --git a/docs/static/screenshots/Chord/gradient-dark-400w.webp b/docs/static/screenshots/Chord/gradient-dark-400w.webp index 500eaa8d21..c0ebbc61de 100644 Binary files a/docs/static/screenshots/Chord/gradient-dark-400w.webp and b/docs/static/screenshots/Chord/gradient-dark-400w.webp differ diff --git a/docs/static/screenshots/Chord/gradient-dark-800w.webp b/docs/static/screenshots/Chord/gradient-dark-800w.webp index 6c1d074635..50229e99f5 100644 Binary files a/docs/static/screenshots/Chord/gradient-dark-800w.webp and b/docs/static/screenshots/Chord/gradient-dark-800w.webp differ diff --git a/docs/static/screenshots/Chord/gradient-light-400w.webp b/docs/static/screenshots/Chord/gradient-light-400w.webp index 9986546060..63abf42e39 100644 Binary files a/docs/static/screenshots/Chord/gradient-light-400w.webp and b/docs/static/screenshots/Chord/gradient-light-400w.webp differ diff --git a/docs/static/screenshots/Chord/gradient-light-800w.webp b/docs/static/screenshots/Chord/gradient-light-800w.webp index 944bc129f4..7c607b5e61 100644 Binary files a/docs/static/screenshots/Chord/gradient-light-800w.webp and b/docs/static/screenshots/Chord/gradient-light-800w.webp differ diff --git a/docs/static/screenshots/Chord/hover-dark-240w.webp b/docs/static/screenshots/Chord/hover-dark-240w.webp index ebf4ba481c..1e525ddf60 100644 Binary files a/docs/static/screenshots/Chord/hover-dark-240w.webp and b/docs/static/screenshots/Chord/hover-dark-240w.webp differ diff --git a/docs/static/screenshots/Chord/hover-dark-400w.webp b/docs/static/screenshots/Chord/hover-dark-400w.webp index 4ecd43e4ea..3c417e3175 100644 Binary files a/docs/static/screenshots/Chord/hover-dark-400w.webp and b/docs/static/screenshots/Chord/hover-dark-400w.webp differ diff --git a/docs/static/screenshots/Chord/hover-dark-800w.webp b/docs/static/screenshots/Chord/hover-dark-800w.webp index 38bc682338..fdc9d5fd7c 100644 Binary files a/docs/static/screenshots/Chord/hover-dark-800w.webp and b/docs/static/screenshots/Chord/hover-dark-800w.webp differ diff --git a/docs/static/screenshots/Chord/hover-light-400w.webp b/docs/static/screenshots/Chord/hover-light-400w.webp index 612d313310..ca242a67e7 100644 Binary files a/docs/static/screenshots/Chord/hover-light-400w.webp and b/docs/static/screenshots/Chord/hover-light-400w.webp differ diff --git a/docs/static/screenshots/Chord/hover-light-800w.webp b/docs/static/screenshots/Chord/hover-light-800w.webp index 216306ed05..e38fb0264c 100644 Binary files a/docs/static/screenshots/Chord/hover-light-800w.webp and b/docs/static/screenshots/Chord/hover-light-800w.webp differ diff --git a/docs/static/screenshots/Chord/ticks-dark-240w.webp b/docs/static/screenshots/Chord/ticks-dark-240w.webp index e1568e639c..238eb0f873 100644 Binary files a/docs/static/screenshots/Chord/ticks-dark-240w.webp and b/docs/static/screenshots/Chord/ticks-dark-240w.webp differ diff --git a/docs/static/screenshots/Chord/ticks-dark-400w.webp b/docs/static/screenshots/Chord/ticks-dark-400w.webp index f435a32d5a..2f7bb1d771 100644 Binary files a/docs/static/screenshots/Chord/ticks-dark-400w.webp and b/docs/static/screenshots/Chord/ticks-dark-400w.webp differ diff --git a/docs/static/screenshots/Chord/ticks-dark-800w.webp b/docs/static/screenshots/Chord/ticks-dark-800w.webp index 306ff07560..fd13a503de 100644 Binary files a/docs/static/screenshots/Chord/ticks-dark-800w.webp and b/docs/static/screenshots/Chord/ticks-dark-800w.webp differ diff --git a/docs/static/screenshots/Chord/ticks-light-240w.webp b/docs/static/screenshots/Chord/ticks-light-240w.webp index e36fb72645..f43b81ed73 100644 Binary files a/docs/static/screenshots/Chord/ticks-light-240w.webp and b/docs/static/screenshots/Chord/ticks-light-240w.webp differ diff --git a/docs/static/screenshots/Chord/ticks-light-400w.webp b/docs/static/screenshots/Chord/ticks-light-400w.webp index 9c8890407f..1f6fc301da 100644 Binary files a/docs/static/screenshots/Chord/ticks-light-400w.webp and b/docs/static/screenshots/Chord/ticks-light-400w.webp differ diff --git a/docs/static/screenshots/Chord/ticks-light-800w.webp b/docs/static/screenshots/Chord/ticks-light-800w.webp index f129a220d1..93e46cfa01 100644 Binary files a/docs/static/screenshots/Chord/ticks-light-800w.webp and b/docs/static/screenshots/Chord/ticks-light-800w.webp differ diff --git a/docs/static/screenshots/Circle/color-via-ordinal-scale-light-400w.webp b/docs/static/screenshots/Circle/color-via-ordinal-scale-light-400w.webp index 028cf05433..8c902c8e4e 100644 Binary files a/docs/static/screenshots/Circle/color-via-ordinal-scale-light-400w.webp and b/docs/static/screenshots/Circle/color-via-ordinal-scale-light-400w.webp differ diff --git a/docs/static/screenshots/Circle/color-via-ordinal-scale-light-800w.webp b/docs/static/screenshots/Circle/color-via-ordinal-scale-light-800w.webp index 1c5170ef85..6105fb78da 100644 Binary files a/docs/static/screenshots/Circle/color-via-ordinal-scale-light-800w.webp and b/docs/static/screenshots/Circle/color-via-ordinal-scale-light-800w.webp differ diff --git a/docs/static/screenshots/Circle/color-via-threshold-scale-light-400w.webp b/docs/static/screenshots/Circle/color-via-threshold-scale-light-400w.webp index 0efcef97d7..b97ef6fc33 100644 Binary files a/docs/static/screenshots/Circle/color-via-threshold-scale-light-400w.webp and b/docs/static/screenshots/Circle/color-via-threshold-scale-light-400w.webp differ diff --git a/docs/static/screenshots/Circle/color-via-threshold-scale-light-800w.webp b/docs/static/screenshots/Circle/color-via-threshold-scale-light-800w.webp index 63a6b00ff5..f45abc4dfa 100644 Binary files a/docs/static/screenshots/Circle/color-via-threshold-scale-light-800w.webp and b/docs/static/screenshots/Circle/color-via-threshold-scale-light-800w.webp differ diff --git a/docs/static/screenshots/Circle/data-mode-light-800w.webp b/docs/static/screenshots/Circle/data-mode-light-800w.webp index 85019143e0..45ba55dff1 100644 Binary files a/docs/static/screenshots/Circle/data-mode-light-800w.webp and b/docs/static/screenshots/Circle/data-mode-light-800w.webp differ diff --git a/docs/static/screenshots/CircleLegend/basic-dark-240w.webp b/docs/static/screenshots/CircleLegend/basic-dark-240w.webp index c537ed2a73..d11e1e85bb 100644 Binary files a/docs/static/screenshots/CircleLegend/basic-dark-240w.webp and b/docs/static/screenshots/CircleLegend/basic-dark-240w.webp differ diff --git a/docs/static/screenshots/CircleLegend/basic-dark-400w.webp b/docs/static/screenshots/CircleLegend/basic-dark-400w.webp index 8458128e97..024ac0ec77 100644 Binary files a/docs/static/screenshots/CircleLegend/basic-dark-400w.webp and b/docs/static/screenshots/CircleLegend/basic-dark-400w.webp differ diff --git a/docs/static/screenshots/CircleLegend/basic-dark-800w.webp b/docs/static/screenshots/CircleLegend/basic-dark-800w.webp index f2ed8a42d7..42571dc85d 100644 Binary files a/docs/static/screenshots/CircleLegend/basic-dark-800w.webp and b/docs/static/screenshots/CircleLegend/basic-dark-800w.webp differ diff --git a/docs/static/screenshots/CircleLegend/basic-light-240w.webp b/docs/static/screenshots/CircleLegend/basic-light-240w.webp index 9f1e59f116..8e0cef8220 100644 Binary files a/docs/static/screenshots/CircleLegend/basic-light-240w.webp and b/docs/static/screenshots/CircleLegend/basic-light-240w.webp differ diff --git a/docs/static/screenshots/CircleLegend/basic-light-800w.webp b/docs/static/screenshots/CircleLegend/basic-light-800w.webp index 27e987f259..3d17b360b3 100644 Binary files a/docs/static/screenshots/CircleLegend/basic-light-800w.webp and b/docs/static/screenshots/CircleLegend/basic-light-800w.webp differ diff --git a/docs/static/screenshots/CircleLegend/label-placement-dark-240w.webp b/docs/static/screenshots/CircleLegend/label-placement-dark-240w.webp index 71595244a6..f2f6b1851c 100644 Binary files a/docs/static/screenshots/CircleLegend/label-placement-dark-240w.webp and b/docs/static/screenshots/CircleLegend/label-placement-dark-240w.webp differ diff --git a/docs/static/screenshots/CircleLegend/label-placement-dark-400w.webp b/docs/static/screenshots/CircleLegend/label-placement-dark-400w.webp index eb2d90b8eb..503d63518b 100644 Binary files a/docs/static/screenshots/CircleLegend/label-placement-dark-400w.webp and b/docs/static/screenshots/CircleLegend/label-placement-dark-400w.webp differ diff --git a/docs/static/screenshots/CircleLegend/label-placement-dark-800w.webp b/docs/static/screenshots/CircleLegend/label-placement-dark-800w.webp index f9f2d8c8f3..173b593ba2 100644 Binary files a/docs/static/screenshots/CircleLegend/label-placement-dark-800w.webp and b/docs/static/screenshots/CircleLegend/label-placement-dark-800w.webp differ diff --git a/docs/static/screenshots/CircleLegend/label-placement-light-240w.webp b/docs/static/screenshots/CircleLegend/label-placement-light-240w.webp index eae3cd1961..f122e0bd53 100644 Binary files a/docs/static/screenshots/CircleLegend/label-placement-light-240w.webp and b/docs/static/screenshots/CircleLegend/label-placement-light-240w.webp differ diff --git a/docs/static/screenshots/CircleLegend/label-placement-light-400w.webp b/docs/static/screenshots/CircleLegend/label-placement-light-400w.webp index 1f11e66f03..e8c9eb4884 100644 Binary files a/docs/static/screenshots/CircleLegend/label-placement-light-400w.webp and b/docs/static/screenshots/CircleLegend/label-placement-light-400w.webp differ diff --git a/docs/static/screenshots/CircleLegend/label-placement-light-800w.webp b/docs/static/screenshots/CircleLegend/label-placement-light-800w.webp index a214b1fc5b..7d7aa2cf3e 100644 Binary files a/docs/static/screenshots/CircleLegend/label-placement-light-800w.webp and b/docs/static/screenshots/CircleLegend/label-placement-light-800w.webp differ diff --git a/docs/static/screenshots/CircleLegend/scale-types-dark-400w.webp b/docs/static/screenshots/CircleLegend/scale-types-dark-400w.webp index 4b7dc7d4a7..2e6c06a859 100644 Binary files a/docs/static/screenshots/CircleLegend/scale-types-dark-400w.webp and b/docs/static/screenshots/CircleLegend/scale-types-dark-400w.webp differ diff --git a/docs/static/screenshots/CircleLegend/scale-types-dark-800w.webp b/docs/static/screenshots/CircleLegend/scale-types-dark-800w.webp index 43e7390d78..d5fb6d3362 100644 Binary files a/docs/static/screenshots/CircleLegend/scale-types-dark-800w.webp and b/docs/static/screenshots/CircleLegend/scale-types-dark-800w.webp differ diff --git a/docs/static/screenshots/CircleLegend/scale-types-light-400w.webp b/docs/static/screenshots/CircleLegend/scale-types-light-400w.webp index 95552ab980..7c17ff5c41 100644 Binary files a/docs/static/screenshots/CircleLegend/scale-types-light-400w.webp and b/docs/static/screenshots/CircleLegend/scale-types-light-400w.webp differ diff --git a/docs/static/screenshots/CircleLegend/scale-types-light-800w.webp b/docs/static/screenshots/CircleLegend/scale-types-light-800w.webp index e8e3cf62ff..6715792b3b 100644 Binary files a/docs/static/screenshots/CircleLegend/scale-types-light-800w.webp and b/docs/static/screenshots/CircleLegend/scale-types-light-800w.webp differ diff --git a/docs/static/screenshots/ColorRamp/basic-dark-240w.webp b/docs/static/screenshots/ColorRamp/basic-dark-240w.webp index f0c22d7690..a839253fc2 100644 Binary files a/docs/static/screenshots/ColorRamp/basic-dark-240w.webp and b/docs/static/screenshots/ColorRamp/basic-dark-240w.webp differ diff --git a/docs/static/screenshots/ColorRamp/basic-dark-400w.webp b/docs/static/screenshots/ColorRamp/basic-dark-400w.webp index dde95b19e2..83b0b30091 100644 Binary files a/docs/static/screenshots/ColorRamp/basic-dark-400w.webp and b/docs/static/screenshots/ColorRamp/basic-dark-400w.webp differ diff --git a/docs/static/screenshots/ColorRamp/basic-dark-800w.webp b/docs/static/screenshots/ColorRamp/basic-dark-800w.webp index d26e807ac6..2a41eb6c48 100644 Binary files a/docs/static/screenshots/ColorRamp/basic-dark-800w.webp and b/docs/static/screenshots/ColorRamp/basic-dark-800w.webp differ diff --git a/docs/static/screenshots/ColorRamp/basic-light-240w.webp b/docs/static/screenshots/ColorRamp/basic-light-240w.webp index 0cae206db9..90231c06a4 100644 Binary files a/docs/static/screenshots/ColorRamp/basic-light-240w.webp and b/docs/static/screenshots/ColorRamp/basic-light-240w.webp differ diff --git a/docs/static/screenshots/ColorRamp/basic-light-400w.webp b/docs/static/screenshots/ColorRamp/basic-light-400w.webp index 3f03a8d728..10336e6a9e 100644 Binary files a/docs/static/screenshots/ColorRamp/basic-light-400w.webp and b/docs/static/screenshots/ColorRamp/basic-light-400w.webp differ diff --git a/docs/static/screenshots/ColorRamp/basic-light-800w.webp b/docs/static/screenshots/ColorRamp/basic-light-800w.webp index 2af27c4f9f..8d15245125 100644 Binary files a/docs/static/screenshots/ColorRamp/basic-light-800w.webp and b/docs/static/screenshots/ColorRamp/basic-light-800w.webp differ diff --git a/docs/static/screenshots/ColorRamp/pixelated-dark-240w.webp b/docs/static/screenshots/ColorRamp/pixelated-dark-240w.webp index 6dbd81c754..a459b714f5 100644 Binary files a/docs/static/screenshots/ColorRamp/pixelated-dark-240w.webp and b/docs/static/screenshots/ColorRamp/pixelated-dark-240w.webp differ diff --git a/docs/static/screenshots/ColorRamp/pixelated-dark-400w.webp b/docs/static/screenshots/ColorRamp/pixelated-dark-400w.webp index afab773de2..44469d22c2 100644 Binary files a/docs/static/screenshots/ColorRamp/pixelated-dark-400w.webp and b/docs/static/screenshots/ColorRamp/pixelated-dark-400w.webp differ diff --git a/docs/static/screenshots/ColorRamp/pixelated-dark-800w.webp b/docs/static/screenshots/ColorRamp/pixelated-dark-800w.webp index b8c5540add..e58a86d89f 100644 Binary files a/docs/static/screenshots/ColorRamp/pixelated-dark-800w.webp and b/docs/static/screenshots/ColorRamp/pixelated-dark-800w.webp differ diff --git a/docs/static/screenshots/ColorRamp/pixelated-light-240w.webp b/docs/static/screenshots/ColorRamp/pixelated-light-240w.webp index 4d44ec58b9..67ed3b0e6f 100644 Binary files a/docs/static/screenshots/ColorRamp/pixelated-light-240w.webp and b/docs/static/screenshots/ColorRamp/pixelated-light-240w.webp differ diff --git a/docs/static/screenshots/ColorRamp/pixelated-light-400w.webp b/docs/static/screenshots/ColorRamp/pixelated-light-400w.webp index 6d9de26563..8e59905c6d 100644 Binary files a/docs/static/screenshots/ColorRamp/pixelated-light-400w.webp and b/docs/static/screenshots/ColorRamp/pixelated-light-400w.webp differ diff --git a/docs/static/screenshots/ColorRamp/pixelated-light-800w.webp b/docs/static/screenshots/ColorRamp/pixelated-light-800w.webp index d88dc7b45d..ee9a93f727 100644 Binary files a/docs/static/screenshots/ColorRamp/pixelated-light-800w.webp and b/docs/static/screenshots/ColorRamp/pixelated-light-800w.webp differ diff --git a/docs/static/screenshots/ColorRamp/schemes-dark-240w.webp b/docs/static/screenshots/ColorRamp/schemes-dark-240w.webp index ce3db0e76d..543ed07eb9 100644 Binary files a/docs/static/screenshots/ColorRamp/schemes-dark-240w.webp and b/docs/static/screenshots/ColorRamp/schemes-dark-240w.webp differ diff --git a/docs/static/screenshots/ColorRamp/schemes-dark-400w.webp b/docs/static/screenshots/ColorRamp/schemes-dark-400w.webp index 3b2e6b0ace..382589999a 100644 Binary files a/docs/static/screenshots/ColorRamp/schemes-dark-400w.webp and b/docs/static/screenshots/ColorRamp/schemes-dark-400w.webp differ diff --git a/docs/static/screenshots/ColorRamp/schemes-dark-800w.webp b/docs/static/screenshots/ColorRamp/schemes-dark-800w.webp index a160e6a1bc..db94924f12 100644 Binary files a/docs/static/screenshots/ColorRamp/schemes-dark-800w.webp and b/docs/static/screenshots/ColorRamp/schemes-dark-800w.webp differ diff --git a/docs/static/screenshots/ColorRamp/schemes-light-240w.webp b/docs/static/screenshots/ColorRamp/schemes-light-240w.webp index cf5e51c1bd..105b247869 100644 Binary files a/docs/static/screenshots/ColorRamp/schemes-light-240w.webp and b/docs/static/screenshots/ColorRamp/schemes-light-240w.webp differ diff --git a/docs/static/screenshots/ColorRamp/schemes-light-400w.webp b/docs/static/screenshots/ColorRamp/schemes-light-400w.webp index 4b9a4e4b93..016750a4cc 100644 Binary files a/docs/static/screenshots/ColorRamp/schemes-light-400w.webp and b/docs/static/screenshots/ColorRamp/schemes-light-400w.webp differ diff --git a/docs/static/screenshots/ColorRamp/schemes-light-800w.webp b/docs/static/screenshots/ColorRamp/schemes-light-800w.webp index f82ebde912..73552597f4 100644 Binary files a/docs/static/screenshots/ColorRamp/schemes-light-800w.webp and b/docs/static/screenshots/ColorRamp/schemes-light-800w.webp differ diff --git a/docs/static/screenshots/Contour/sampled-dark-240w.webp b/docs/static/screenshots/Contour/sampled-dark-240w.webp index c24f8ca42a..0c6eae740f 100644 Binary files a/docs/static/screenshots/Contour/sampled-dark-240w.webp and b/docs/static/screenshots/Contour/sampled-dark-240w.webp differ diff --git a/docs/static/screenshots/Contour/sampled-dark-400w.webp b/docs/static/screenshots/Contour/sampled-dark-400w.webp index 4464e63452..9191b32662 100644 Binary files a/docs/static/screenshots/Contour/sampled-dark-400w.webp and b/docs/static/screenshots/Contour/sampled-dark-400w.webp differ diff --git a/docs/static/screenshots/Contour/sampled-dark-800w.webp b/docs/static/screenshots/Contour/sampled-dark-800w.webp index 554d48a947..1c9680aef1 100644 Binary files a/docs/static/screenshots/Contour/sampled-dark-800w.webp and b/docs/static/screenshots/Contour/sampled-dark-800w.webp differ diff --git a/docs/static/screenshots/Contour/sampled-interactive-dark-240w.webp b/docs/static/screenshots/Contour/sampled-interactive-dark-240w.webp index c24f8ca42a..0c6eae740f 100644 Binary files a/docs/static/screenshots/Contour/sampled-interactive-dark-240w.webp and b/docs/static/screenshots/Contour/sampled-interactive-dark-240w.webp differ diff --git a/docs/static/screenshots/Contour/sampled-interactive-dark-400w.webp b/docs/static/screenshots/Contour/sampled-interactive-dark-400w.webp index 4464e63452..9191b32662 100644 Binary files a/docs/static/screenshots/Contour/sampled-interactive-dark-400w.webp and b/docs/static/screenshots/Contour/sampled-interactive-dark-400w.webp differ diff --git a/docs/static/screenshots/Contour/sampled-interactive-dark-800w.webp b/docs/static/screenshots/Contour/sampled-interactive-dark-800w.webp index 32c1b2c9cd..6b6694d1f7 100644 Binary files a/docs/static/screenshots/Contour/sampled-interactive-dark-800w.webp and b/docs/static/screenshots/Contour/sampled-interactive-dark-800w.webp differ diff --git a/docs/static/screenshots/Contour/sampled-interactive-light-400w.webp b/docs/static/screenshots/Contour/sampled-interactive-light-400w.webp index b1a46b9b7d..3111041582 100644 Binary files a/docs/static/screenshots/Contour/sampled-interactive-light-400w.webp and b/docs/static/screenshots/Contour/sampled-interactive-light-400w.webp differ diff --git a/docs/static/screenshots/Contour/sampled-light-400w.webp b/docs/static/screenshots/Contour/sampled-light-400w.webp index b1a46b9b7d..3111041582 100644 Binary files a/docs/static/screenshots/Contour/sampled-light-400w.webp and b/docs/static/screenshots/Contour/sampled-light-400w.webp differ diff --git a/docs/static/screenshots/Dagre/basic-dark-240w.webp b/docs/static/screenshots/Dagre/basic-dark-240w.webp index 2c748ed7c6..747ca9a57b 100644 Binary files a/docs/static/screenshots/Dagre/basic-dark-240w.webp and b/docs/static/screenshots/Dagre/basic-dark-240w.webp differ diff --git a/docs/static/screenshots/Dagre/basic-dark-800w.webp b/docs/static/screenshots/Dagre/basic-dark-800w.webp index ecb5338a76..9f0675d0aa 100644 Binary files a/docs/static/screenshots/Dagre/basic-dark-800w.webp and b/docs/static/screenshots/Dagre/basic-dark-800w.webp differ diff --git a/docs/static/screenshots/Dagre/basic-light-400w.webp b/docs/static/screenshots/Dagre/basic-light-400w.webp index 553b3f6b8d..d731bd3b5c 100644 Binary files a/docs/static/screenshots/Dagre/basic-light-400w.webp and b/docs/static/screenshots/Dagre/basic-light-400w.webp differ diff --git a/docs/static/screenshots/Dagre/basic-light-800w.webp b/docs/static/screenshots/Dagre/basic-light-800w.webp index 1128423ea7..a1cf470181 100644 Binary files a/docs/static/screenshots/Dagre/basic-light-800w.webp and b/docs/static/screenshots/Dagre/basic-light-800w.webp differ diff --git a/docs/static/screenshots/Dagre/playground-light-240w.webp b/docs/static/screenshots/Dagre/playground-light-240w.webp index fa321029a9..041324b5b1 100644 Binary files a/docs/static/screenshots/Dagre/playground-light-240w.webp and b/docs/static/screenshots/Dagre/playground-light-240w.webp differ diff --git a/docs/static/screenshots/Dagre/playground-light-400w.webp b/docs/static/screenshots/Dagre/playground-light-400w.webp index 6bd2860d1c..ee650fb6c8 100644 Binary files a/docs/static/screenshots/Dagre/playground-light-400w.webp and b/docs/static/screenshots/Dagre/playground-light-400w.webp differ diff --git a/docs/static/screenshots/Dagre/playground-light-800w.webp b/docs/static/screenshots/Dagre/playground-light-800w.webp index aaeb4530d2..e15b27048c 100644 Binary files a/docs/static/screenshots/Dagre/playground-light-800w.webp and b/docs/static/screenshots/Dagre/playground-light-800w.webp differ diff --git a/docs/static/screenshots/Dagre/software-user-flow-dark-240w.webp b/docs/static/screenshots/Dagre/software-user-flow-dark-240w.webp index 7d8bd9da2a..84eee030c2 100644 Binary files a/docs/static/screenshots/Dagre/software-user-flow-dark-240w.webp and b/docs/static/screenshots/Dagre/software-user-flow-dark-240w.webp differ diff --git a/docs/static/screenshots/Dagre/software-user-flow-dark-400w.webp b/docs/static/screenshots/Dagre/software-user-flow-dark-400w.webp index 8c70157fea..c8b96d2db0 100644 Binary files a/docs/static/screenshots/Dagre/software-user-flow-dark-400w.webp and b/docs/static/screenshots/Dagre/software-user-flow-dark-400w.webp differ diff --git a/docs/static/screenshots/Dagre/software-user-flow-dark-800w.webp b/docs/static/screenshots/Dagre/software-user-flow-dark-800w.webp index bbf9c46f81..19aaa9ed14 100644 Binary files a/docs/static/screenshots/Dagre/software-user-flow-dark-800w.webp and b/docs/static/screenshots/Dagre/software-user-flow-dark-800w.webp differ diff --git a/docs/static/screenshots/Dagre/software-user-flow-light-400w.webp b/docs/static/screenshots/Dagre/software-user-flow-light-400w.webp index 8a6d5b07f5..7f4039a108 100644 Binary files a/docs/static/screenshots/Dagre/software-user-flow-light-400w.webp and b/docs/static/screenshots/Dagre/software-user-flow-light-400w.webp differ diff --git a/docs/static/screenshots/Dagre/software-user-flow-light-800w.webp b/docs/static/screenshots/Dagre/software-user-flow-light-800w.webp index 71e9be2b0a..f06b420a8c 100644 Binary files a/docs/static/screenshots/Dagre/software-user-flow-light-800w.webp and b/docs/static/screenshots/Dagre/software-user-flow-light-800w.webp differ diff --git a/docs/static/screenshots/Dagre/tcp-state-diagram-dark-240w.webp b/docs/static/screenshots/Dagre/tcp-state-diagram-dark-240w.webp index b327263002..cb594e48b2 100644 Binary files a/docs/static/screenshots/Dagre/tcp-state-diagram-dark-240w.webp and b/docs/static/screenshots/Dagre/tcp-state-diagram-dark-240w.webp differ diff --git a/docs/static/screenshots/Dagre/tcp-state-diagram-dark-400w.webp b/docs/static/screenshots/Dagre/tcp-state-diagram-dark-400w.webp index 2525d42164..c535daeff7 100644 Binary files a/docs/static/screenshots/Dagre/tcp-state-diagram-dark-400w.webp and b/docs/static/screenshots/Dagre/tcp-state-diagram-dark-400w.webp differ diff --git a/docs/static/screenshots/Dagre/tcp-state-diagram-dark-800w.webp b/docs/static/screenshots/Dagre/tcp-state-diagram-dark-800w.webp index c3c4dc41a6..908945b2c7 100644 Binary files a/docs/static/screenshots/Dagre/tcp-state-diagram-dark-800w.webp and b/docs/static/screenshots/Dagre/tcp-state-diagram-dark-800w.webp differ diff --git a/docs/static/screenshots/Dagre/tcp-state-diagram-light-240w.webp b/docs/static/screenshots/Dagre/tcp-state-diagram-light-240w.webp index 7e2d9ae535..0d72222d19 100644 Binary files a/docs/static/screenshots/Dagre/tcp-state-diagram-light-240w.webp and b/docs/static/screenshots/Dagre/tcp-state-diagram-light-240w.webp differ diff --git a/docs/static/screenshots/Dagre/tcp-state-diagram-light-400w.webp b/docs/static/screenshots/Dagre/tcp-state-diagram-light-400w.webp index 8fc660dd73..3d97b68af4 100644 Binary files a/docs/static/screenshots/Dagre/tcp-state-diagram-light-400w.webp and b/docs/static/screenshots/Dagre/tcp-state-diagram-light-400w.webp differ diff --git a/docs/static/screenshots/Dagre/tcp-state-diagram-light-800w.webp b/docs/static/screenshots/Dagre/tcp-state-diagram-light-800w.webp index f995738750..304984543f 100644 Binary files a/docs/static/screenshots/Dagre/tcp-state-diagram-light-800w.webp and b/docs/static/screenshots/Dagre/tcp-state-diagram-light-800w.webp differ diff --git a/docs/static/screenshots/Density/bandwidth-dark-400w.webp b/docs/static/screenshots/Density/bandwidth-dark-400w.webp index 7a5867407d..0c7a8a7d24 100644 Binary files a/docs/static/screenshots/Density/bandwidth-dark-400w.webp and b/docs/static/screenshots/Density/bandwidth-dark-400w.webp differ diff --git a/docs/static/screenshots/Density/bandwidth-dark-800w.webp b/docs/static/screenshots/Density/bandwidth-dark-800w.webp index 539252a6e4..d658e09db6 100644 Binary files a/docs/static/screenshots/Density/bandwidth-dark-800w.webp and b/docs/static/screenshots/Density/bandwidth-dark-800w.webp differ diff --git a/docs/static/screenshots/Density/basic-dark-400w.webp b/docs/static/screenshots/Density/basic-dark-400w.webp index c0f780303b..76ea9526d8 100644 Binary files a/docs/static/screenshots/Density/basic-dark-400w.webp and b/docs/static/screenshots/Density/basic-dark-400w.webp differ diff --git a/docs/static/screenshots/Density/basic-dark-800w.webp b/docs/static/screenshots/Density/basic-dark-800w.webp index 3cd1182c08..e32a0feb41 100644 Binary files a/docs/static/screenshots/Density/basic-dark-800w.webp and b/docs/static/screenshots/Density/basic-dark-800w.webp differ diff --git a/docs/static/screenshots/Density/stroke-only-dark-400w.webp b/docs/static/screenshots/Density/stroke-only-dark-400w.webp index 33720c4e31..af7b167bfd 100644 Binary files a/docs/static/screenshots/Density/stroke-only-dark-400w.webp and b/docs/static/screenshots/Density/stroke-only-dark-400w.webp differ diff --git a/docs/static/screenshots/Density/stroke-only-dark-800w.webp b/docs/static/screenshots/Density/stroke-only-dark-800w.webp index 1b91b006af..6ffe2e8cf6 100644 Binary files a/docs/static/screenshots/Density/stroke-only-dark-800w.webp and b/docs/static/screenshots/Density/stroke-only-dark-800w.webp differ diff --git a/docs/static/screenshots/Density/thresholds-dark-400w.webp b/docs/static/screenshots/Density/thresholds-dark-400w.webp index 9d2983c2fa..5460d17d38 100644 Binary files a/docs/static/screenshots/Density/thresholds-dark-400w.webp and b/docs/static/screenshots/Density/thresholds-dark-400w.webp differ diff --git a/docs/static/screenshots/Density/thresholds-dark-800w.webp b/docs/static/screenshots/Density/thresholds-dark-800w.webp index 5e74de67a5..fc3486df54 100644 Binary files a/docs/static/screenshots/Density/thresholds-dark-800w.webp and b/docs/static/screenshots/Density/thresholds-dark-800w.webp differ diff --git a/docs/static/screenshots/Density/thresholds-light-400w.webp b/docs/static/screenshots/Density/thresholds-light-400w.webp index ec94052b81..6d3e07597a 100644 Binary files a/docs/static/screenshots/Density/thresholds-light-400w.webp and b/docs/static/screenshots/Density/thresholds-light-400w.webp differ diff --git a/docs/static/screenshots/Density/weighted-light-800w.webp b/docs/static/screenshots/Density/weighted-light-800w.webp index 75a382d405..988de73cb7 100644 Binary files a/docs/static/screenshots/Density/weighted-light-800w.webp and b/docs/static/screenshots/Density/weighted-light-800w.webp differ diff --git a/docs/static/screenshots/Dodge/anchor-dark-400w.webp b/docs/static/screenshots/Dodge/anchor-dark-400w.webp index 0b9655aaf0..a64d4befe3 100644 Binary files a/docs/static/screenshots/Dodge/anchor-dark-400w.webp and b/docs/static/screenshots/Dodge/anchor-dark-400w.webp differ diff --git a/docs/static/screenshots/Dodge/anchor-dark-800w.webp b/docs/static/screenshots/Dodge/anchor-dark-800w.webp index 9c4c6f5653..fd6787b0b1 100644 Binary files a/docs/static/screenshots/Dodge/anchor-dark-800w.webp and b/docs/static/screenshots/Dodge/anchor-dark-800w.webp differ diff --git a/docs/static/screenshots/Dodge/anchor-light-240w.webp b/docs/static/screenshots/Dodge/anchor-light-240w.webp index eb1b96b1b5..4f921a328f 100644 Binary files a/docs/static/screenshots/Dodge/anchor-light-240w.webp and b/docs/static/screenshots/Dodge/anchor-light-240w.webp differ diff --git a/docs/static/screenshots/Dodge/anchor-light-400w.webp b/docs/static/screenshots/Dodge/anchor-light-400w.webp index 9b3937096d..f98bd4521d 100644 Binary files a/docs/static/screenshots/Dodge/anchor-light-400w.webp and b/docs/static/screenshots/Dodge/anchor-light-400w.webp differ diff --git a/docs/static/screenshots/Dodge/anchor-light-800w.webp b/docs/static/screenshots/Dodge/anchor-light-800w.webp index 81b94d29bd..1ee2fcb3bd 100644 Binary files a/docs/static/screenshots/Dodge/anchor-light-800w.webp and b/docs/static/screenshots/Dodge/anchor-light-800w.webp differ diff --git a/docs/static/screenshots/Dodge/bank-failures-dark-240w.webp b/docs/static/screenshots/Dodge/bank-failures-dark-240w.webp index 054d85093d..1e349e5a69 100644 Binary files a/docs/static/screenshots/Dodge/bank-failures-dark-240w.webp and b/docs/static/screenshots/Dodge/bank-failures-dark-240w.webp differ diff --git a/docs/static/screenshots/Dodge/bank-failures-dark-400w.webp b/docs/static/screenshots/Dodge/bank-failures-dark-400w.webp index 0c1fb93b4c..a5ad656a59 100644 Binary files a/docs/static/screenshots/Dodge/bank-failures-dark-400w.webp and b/docs/static/screenshots/Dodge/bank-failures-dark-400w.webp differ diff --git a/docs/static/screenshots/Dodge/bank-failures-dark-800w.webp b/docs/static/screenshots/Dodge/bank-failures-dark-800w.webp index 27f92968b1..38b387feb0 100644 Binary files a/docs/static/screenshots/Dodge/bank-failures-dark-800w.webp and b/docs/static/screenshots/Dodge/bank-failures-dark-800w.webp differ diff --git a/docs/static/screenshots/Dodge/bank-failures-light-240w.webp b/docs/static/screenshots/Dodge/bank-failures-light-240w.webp index 7a4be54e98..7fc4f5b4d8 100644 Binary files a/docs/static/screenshots/Dodge/bank-failures-light-240w.webp and b/docs/static/screenshots/Dodge/bank-failures-light-240w.webp differ diff --git a/docs/static/screenshots/Dodge/bank-failures-light-400w.webp b/docs/static/screenshots/Dodge/bank-failures-light-400w.webp index 9e1384629b..66ba4dd0cf 100644 Binary files a/docs/static/screenshots/Dodge/bank-failures-light-400w.webp and b/docs/static/screenshots/Dodge/bank-failures-light-400w.webp differ diff --git a/docs/static/screenshots/Dodge/bank-failures-light-800w.webp b/docs/static/screenshots/Dodge/bank-failures-light-800w.webp index e1e226ec62..9f77a45801 100644 Binary files a/docs/static/screenshots/Dodge/bank-failures-light-800w.webp and b/docs/static/screenshots/Dodge/bank-failures-light-800w.webp differ diff --git a/docs/static/screenshots/Dodge/duration-bars-dense-lanes-dark-400w.webp b/docs/static/screenshots/Dodge/duration-bars-dense-lanes-dark-400w.webp index 74ac02edb0..cc9868c635 100644 Binary files a/docs/static/screenshots/Dodge/duration-bars-dense-lanes-dark-400w.webp and b/docs/static/screenshots/Dodge/duration-bars-dense-lanes-dark-400w.webp differ diff --git a/docs/static/screenshots/Dodge/duration-bars-dense-lanes-dark-800w.webp b/docs/static/screenshots/Dodge/duration-bars-dense-lanes-dark-800w.webp index 94271dfe1e..58e1aa6ba6 100644 Binary files a/docs/static/screenshots/Dodge/duration-bars-dense-lanes-dark-800w.webp and b/docs/static/screenshots/Dodge/duration-bars-dense-lanes-dark-800w.webp differ diff --git a/docs/static/screenshots/Dodge/duration-bars-dense-lanes-light-400w.webp b/docs/static/screenshots/Dodge/duration-bars-dense-lanes-light-400w.webp index 071f51a6a2..ca47665136 100644 Binary files a/docs/static/screenshots/Dodge/duration-bars-dense-lanes-light-400w.webp and b/docs/static/screenshots/Dodge/duration-bars-dense-lanes-light-400w.webp differ diff --git a/docs/static/screenshots/Dodge/duration-bars-dense-lanes-light-800w.webp b/docs/static/screenshots/Dodge/duration-bars-dense-lanes-light-800w.webp index 757e1b06d9..583b9a1a89 100644 Binary files a/docs/static/screenshots/Dodge/duration-bars-dense-lanes-light-800w.webp and b/docs/static/screenshots/Dodge/duration-bars-dense-lanes-light-800w.webp differ diff --git a/docs/static/screenshots/Dodge/grouped-horizontal-dark-800w.webp b/docs/static/screenshots/Dodge/grouped-horizontal-dark-800w.webp index ac3825f086..3c82b43349 100644 Binary files a/docs/static/screenshots/Dodge/grouped-horizontal-dark-800w.webp and b/docs/static/screenshots/Dodge/grouped-horizontal-dark-800w.webp differ diff --git a/docs/static/screenshots/Dodge/grouped-horizontal-light-240w.webp b/docs/static/screenshots/Dodge/grouped-horizontal-light-240w.webp index 4a066ac43b..10834f80df 100644 Binary files a/docs/static/screenshots/Dodge/grouped-horizontal-light-240w.webp and b/docs/static/screenshots/Dodge/grouped-horizontal-light-240w.webp differ diff --git a/docs/static/screenshots/Dodge/grouped-horizontal-light-800w.webp b/docs/static/screenshots/Dodge/grouped-horizontal-light-800w.webp index f53c3ca973..619ed2a230 100644 Binary files a/docs/static/screenshots/Dodge/grouped-horizontal-light-800w.webp and b/docs/static/screenshots/Dodge/grouped-horizontal-light-800w.webp differ diff --git a/docs/static/screenshots/Dodge/grouped-vertical-dark-400w.webp b/docs/static/screenshots/Dodge/grouped-vertical-dark-400w.webp index a28b67e6e9..d607971d98 100644 Binary files a/docs/static/screenshots/Dodge/grouped-vertical-dark-400w.webp and b/docs/static/screenshots/Dodge/grouped-vertical-dark-400w.webp differ diff --git a/docs/static/screenshots/Dodge/grouped-vertical-dark-800w.webp b/docs/static/screenshots/Dodge/grouped-vertical-dark-800w.webp index 26f6e46222..29ae4224b4 100644 Binary files a/docs/static/screenshots/Dodge/grouped-vertical-dark-800w.webp and b/docs/static/screenshots/Dodge/grouped-vertical-dark-800w.webp differ diff --git a/docs/static/screenshots/Dodge/grouped-vertical-light-400w.webp b/docs/static/screenshots/Dodge/grouped-vertical-light-400w.webp index 7bef969565..818082b755 100644 Binary files a/docs/static/screenshots/Dodge/grouped-vertical-light-400w.webp and b/docs/static/screenshots/Dodge/grouped-vertical-light-400w.webp differ diff --git a/docs/static/screenshots/Dodge/grouped-vertical-light-800w.webp b/docs/static/screenshots/Dodge/grouped-vertical-light-800w.webp index e96c058a31..d53b36a948 100644 Binary files a/docs/static/screenshots/Dodge/grouped-vertical-light-800w.webp and b/docs/static/screenshots/Dodge/grouped-vertical-light-800w.webp differ diff --git a/docs/static/screenshots/Dodge/image-beeswarm-dark-240w.webp b/docs/static/screenshots/Dodge/image-beeswarm-dark-240w.webp index 6b1604027a..46955f25fd 100644 Binary files a/docs/static/screenshots/Dodge/image-beeswarm-dark-240w.webp and b/docs/static/screenshots/Dodge/image-beeswarm-dark-240w.webp differ diff --git a/docs/static/screenshots/Dodge/image-beeswarm-dark-400w.webp b/docs/static/screenshots/Dodge/image-beeswarm-dark-400w.webp index 1b5c6af494..bfcc42c951 100644 Binary files a/docs/static/screenshots/Dodge/image-beeswarm-dark-400w.webp and b/docs/static/screenshots/Dodge/image-beeswarm-dark-400w.webp differ diff --git a/docs/static/screenshots/Dodge/image-beeswarm-dark-800w.webp b/docs/static/screenshots/Dodge/image-beeswarm-dark-800w.webp index d2c271e3e2..8fc4841800 100644 Binary files a/docs/static/screenshots/Dodge/image-beeswarm-dark-800w.webp and b/docs/static/screenshots/Dodge/image-beeswarm-dark-800w.webp differ diff --git a/docs/static/screenshots/Dodge/image-beeswarm-light-240w.webp b/docs/static/screenshots/Dodge/image-beeswarm-light-240w.webp index cde4bc018e..0a1b83fbcc 100644 Binary files a/docs/static/screenshots/Dodge/image-beeswarm-light-240w.webp and b/docs/static/screenshots/Dodge/image-beeswarm-light-240w.webp differ diff --git a/docs/static/screenshots/Dodge/image-beeswarm-light-400w.webp b/docs/static/screenshots/Dodge/image-beeswarm-light-400w.webp index 44b6872765..37aefb9800 100644 Binary files a/docs/static/screenshots/Dodge/image-beeswarm-light-400w.webp and b/docs/static/screenshots/Dodge/image-beeswarm-light-400w.webp differ diff --git a/docs/static/screenshots/Dodge/image-beeswarm-light-800w.webp b/docs/static/screenshots/Dodge/image-beeswarm-light-800w.webp index dd6671d65c..b315fb204a 100644 Binary files a/docs/static/screenshots/Dodge/image-beeswarm-light-800w.webp and b/docs/static/screenshots/Dodge/image-beeswarm-light-800w.webp differ diff --git a/docs/static/screenshots/Dodge/penguins-dark-400w.webp b/docs/static/screenshots/Dodge/penguins-dark-400w.webp index 5ab37bd455..e3a196badc 100644 Binary files a/docs/static/screenshots/Dodge/penguins-dark-400w.webp and b/docs/static/screenshots/Dodge/penguins-dark-400w.webp differ diff --git a/docs/static/screenshots/Dodge/penguins-dark-800w.webp b/docs/static/screenshots/Dodge/penguins-dark-800w.webp index 3df835c161..f809e5e61d 100644 Binary files a/docs/static/screenshots/Dodge/penguins-dark-800w.webp and b/docs/static/screenshots/Dodge/penguins-dark-800w.webp differ diff --git a/docs/static/screenshots/Dodge/penguins-light-400w.webp b/docs/static/screenshots/Dodge/penguins-light-400w.webp index a424ad3970..88dff470b5 100644 Binary files a/docs/static/screenshots/Dodge/penguins-light-400w.webp and b/docs/static/screenshots/Dodge/penguins-light-400w.webp differ diff --git a/docs/static/screenshots/Dodge/penguins-light-800w.webp b/docs/static/screenshots/Dodge/penguins-light-800w.webp index d2aa4473a2..26ea31e602 100644 Binary files a/docs/static/screenshots/Dodge/penguins-light-800w.webp and b/docs/static/screenshots/Dodge/penguins-light-800w.webp differ diff --git a/docs/static/screenshots/Dodge/tech-layoffs-dark-400w.webp b/docs/static/screenshots/Dodge/tech-layoffs-dark-400w.webp index c0f0a69fb8..202cc44355 100644 Binary files a/docs/static/screenshots/Dodge/tech-layoffs-dark-400w.webp and b/docs/static/screenshots/Dodge/tech-layoffs-dark-400w.webp differ diff --git a/docs/static/screenshots/Dodge/tech-layoffs-dark-800w.webp b/docs/static/screenshots/Dodge/tech-layoffs-dark-800w.webp index 127fc20376..8b83c50b1a 100644 Binary files a/docs/static/screenshots/Dodge/tech-layoffs-dark-800w.webp and b/docs/static/screenshots/Dodge/tech-layoffs-dark-800w.webp differ diff --git a/docs/static/screenshots/Dodge/tech-layoffs-light-400w.webp b/docs/static/screenshots/Dodge/tech-layoffs-light-400w.webp index 2e6cadbaf3..38c7690e79 100644 Binary files a/docs/static/screenshots/Dodge/tech-layoffs-light-400w.webp and b/docs/static/screenshots/Dodge/tech-layoffs-light-400w.webp differ diff --git a/docs/static/screenshots/Dodge/tech-layoffs-light-800w.webp b/docs/static/screenshots/Dodge/tech-layoffs-light-800w.webp index a9ae6a769f..eb1e1429b7 100644 Binary files a/docs/static/screenshots/Dodge/tech-layoffs-light-800w.webp and b/docs/static/screenshots/Dodge/tech-layoffs-light-800w.webp differ diff --git a/docs/static/screenshots/Dodge/text-beeswarm-dark-240w.webp b/docs/static/screenshots/Dodge/text-beeswarm-dark-240w.webp index 23fb47e7b8..7c4730c5b6 100644 Binary files a/docs/static/screenshots/Dodge/text-beeswarm-dark-240w.webp and b/docs/static/screenshots/Dodge/text-beeswarm-dark-240w.webp differ diff --git a/docs/static/screenshots/Dodge/text-beeswarm-dark-400w.webp b/docs/static/screenshots/Dodge/text-beeswarm-dark-400w.webp index b9ef028e6d..bf589103f5 100644 Binary files a/docs/static/screenshots/Dodge/text-beeswarm-dark-400w.webp and b/docs/static/screenshots/Dodge/text-beeswarm-dark-400w.webp differ diff --git a/docs/static/screenshots/Dodge/text-beeswarm-dark-800w.webp b/docs/static/screenshots/Dodge/text-beeswarm-dark-800w.webp index fc018353d0..038dfee40e 100644 Binary files a/docs/static/screenshots/Dodge/text-beeswarm-dark-800w.webp and b/docs/static/screenshots/Dodge/text-beeswarm-dark-800w.webp differ diff --git a/docs/static/screenshots/Dodge/text-beeswarm-light-240w.webp b/docs/static/screenshots/Dodge/text-beeswarm-light-240w.webp index 6825e851a5..0ce5fd6061 100644 Binary files a/docs/static/screenshots/Dodge/text-beeswarm-light-240w.webp and b/docs/static/screenshots/Dodge/text-beeswarm-light-240w.webp differ diff --git a/docs/static/screenshots/Dodge/text-beeswarm-light-400w.webp b/docs/static/screenshots/Dodge/text-beeswarm-light-400w.webp index 325ba0f4ff..5045922f4b 100644 Binary files a/docs/static/screenshots/Dodge/text-beeswarm-light-400w.webp and b/docs/static/screenshots/Dodge/text-beeswarm-light-400w.webp differ diff --git a/docs/static/screenshots/Dodge/text-beeswarm-light-800w.webp b/docs/static/screenshots/Dodge/text-beeswarm-light-800w.webp index 99f4ba83c1..23b326ad2e 100644 Binary files a/docs/static/screenshots/Dodge/text-beeswarm-light-800w.webp and b/docs/static/screenshots/Dodge/text-beeswarm-light-800w.webp differ diff --git a/docs/static/screenshots/Dodge/timeline-bidirectional-dark-240w.webp b/docs/static/screenshots/Dodge/timeline-bidirectional-dark-240w.webp index 55960ce2da..46daaff2f9 100644 Binary files a/docs/static/screenshots/Dodge/timeline-bidirectional-dark-240w.webp and b/docs/static/screenshots/Dodge/timeline-bidirectional-dark-240w.webp differ diff --git a/docs/static/screenshots/Dodge/timeline-bidirectional-dark-400w.webp b/docs/static/screenshots/Dodge/timeline-bidirectional-dark-400w.webp index 76049126e5..31d9e14fba 100644 Binary files a/docs/static/screenshots/Dodge/timeline-bidirectional-dark-400w.webp and b/docs/static/screenshots/Dodge/timeline-bidirectional-dark-400w.webp differ diff --git a/docs/static/screenshots/Dodge/timeline-bidirectional-dark-800w.webp b/docs/static/screenshots/Dodge/timeline-bidirectional-dark-800w.webp index 7e03ce03cf..66be7e6ba8 100644 Binary files a/docs/static/screenshots/Dodge/timeline-bidirectional-dark-800w.webp and b/docs/static/screenshots/Dodge/timeline-bidirectional-dark-800w.webp differ diff --git a/docs/static/screenshots/Dodge/timeline-bidirectional-light-240w.webp b/docs/static/screenshots/Dodge/timeline-bidirectional-light-240w.webp index a38652cdb6..15dc5f27aa 100644 Binary files a/docs/static/screenshots/Dodge/timeline-bidirectional-light-240w.webp and b/docs/static/screenshots/Dodge/timeline-bidirectional-light-240w.webp differ diff --git a/docs/static/screenshots/Dodge/timeline-bidirectional-light-400w.webp b/docs/static/screenshots/Dodge/timeline-bidirectional-light-400w.webp index 637253bbad..70c0dc0c09 100644 Binary files a/docs/static/screenshots/Dodge/timeline-bidirectional-light-400w.webp and b/docs/static/screenshots/Dodge/timeline-bidirectional-light-400w.webp differ diff --git a/docs/static/screenshots/Dodge/timeline-bidirectional-light-800w.webp b/docs/static/screenshots/Dodge/timeline-bidirectional-light-800w.webp index f9921d79f5..f328ea21b5 100644 Binary files a/docs/static/screenshots/Dodge/timeline-bidirectional-light-800w.webp and b/docs/static/screenshots/Dodge/timeline-bidirectional-light-800w.webp differ diff --git a/docs/static/screenshots/Dodge/timeline-dark-240w.webp b/docs/static/screenshots/Dodge/timeline-dark-240w.webp index 5c646435e9..6954acf9b1 100644 Binary files a/docs/static/screenshots/Dodge/timeline-dark-240w.webp and b/docs/static/screenshots/Dodge/timeline-dark-240w.webp differ diff --git a/docs/static/screenshots/Dodge/timeline-dark-400w.webp b/docs/static/screenshots/Dodge/timeline-dark-400w.webp index cac533fec6..64cc9bad9c 100644 Binary files a/docs/static/screenshots/Dodge/timeline-dark-400w.webp and b/docs/static/screenshots/Dodge/timeline-dark-400w.webp differ diff --git a/docs/static/screenshots/Dodge/timeline-dark-800w.webp b/docs/static/screenshots/Dodge/timeline-dark-800w.webp index 5c7fe8b139..a8fd2e9435 100644 Binary files a/docs/static/screenshots/Dodge/timeline-dark-800w.webp and b/docs/static/screenshots/Dodge/timeline-dark-800w.webp differ diff --git a/docs/static/screenshots/Dodge/timeline-light-240w.webp b/docs/static/screenshots/Dodge/timeline-light-240w.webp index a5fcd53007..a45228fede 100644 Binary files a/docs/static/screenshots/Dodge/timeline-light-240w.webp and b/docs/static/screenshots/Dodge/timeline-light-240w.webp differ diff --git a/docs/static/screenshots/Dodge/timeline-light-400w.webp b/docs/static/screenshots/Dodge/timeline-light-400w.webp index 749bf00456..2429d38687 100644 Binary files a/docs/static/screenshots/Dodge/timeline-light-400w.webp and b/docs/static/screenshots/Dodge/timeline-light-400w.webp differ diff --git a/docs/static/screenshots/Dodge/timeline-light-800w.webp b/docs/static/screenshots/Dodge/timeline-light-800w.webp index b693cde343..f909b7cdd8 100644 Binary files a/docs/static/screenshots/Dodge/timeline-light-800w.webp and b/docs/static/screenshots/Dodge/timeline-light-800w.webp differ diff --git a/docs/static/screenshots/Dodge/variable-radius-dark-240w.webp b/docs/static/screenshots/Dodge/variable-radius-dark-240w.webp index e677bc5397..2c68a94a82 100644 Binary files a/docs/static/screenshots/Dodge/variable-radius-dark-240w.webp and b/docs/static/screenshots/Dodge/variable-radius-dark-240w.webp differ diff --git a/docs/static/screenshots/Dodge/variable-radius-dark-400w.webp b/docs/static/screenshots/Dodge/variable-radius-dark-400w.webp index fcc70bb879..3c9b1e3d72 100644 Binary files a/docs/static/screenshots/Dodge/variable-radius-dark-400w.webp and b/docs/static/screenshots/Dodge/variable-radius-dark-400w.webp differ diff --git a/docs/static/screenshots/Dodge/variable-radius-light-800w.webp b/docs/static/screenshots/Dodge/variable-radius-light-800w.webp index 0a03d8adc0..819b2b4769 100644 Binary files a/docs/static/screenshots/Dodge/variable-radius-light-800w.webp and b/docs/static/screenshots/Dodge/variable-radius-light-800w.webp differ diff --git a/docs/static/screenshots/Ellipse/color-via-ordinal-scale-dark-800w.webp b/docs/static/screenshots/Ellipse/color-via-ordinal-scale-dark-800w.webp index 3eb6d1390a..27232f06f1 100644 Binary files a/docs/static/screenshots/Ellipse/color-via-ordinal-scale-dark-800w.webp and b/docs/static/screenshots/Ellipse/color-via-ordinal-scale-dark-800w.webp differ diff --git a/docs/static/screenshots/Ellipse/color-via-ordinal-scale-light-800w.webp b/docs/static/screenshots/Ellipse/color-via-ordinal-scale-light-800w.webp index 9716ffd761..2374b10211 100644 Binary files a/docs/static/screenshots/Ellipse/color-via-ordinal-scale-light-800w.webp and b/docs/static/screenshots/Ellipse/color-via-ordinal-scale-light-800w.webp differ diff --git a/docs/static/screenshots/Ellipse/color-via-threshold-scale-light-400w.webp b/docs/static/screenshots/Ellipse/color-via-threshold-scale-light-400w.webp index fa71924fb6..46772c1712 100644 Binary files a/docs/static/screenshots/Ellipse/color-via-threshold-scale-light-400w.webp and b/docs/static/screenshots/Ellipse/color-via-threshold-scale-light-400w.webp differ diff --git a/docs/static/screenshots/Ellipse/color-via-threshold-scale-light-800w.webp b/docs/static/screenshots/Ellipse/color-via-threshold-scale-light-800w.webp index ae9b9904e7..eac1d29c93 100644 Binary files a/docs/static/screenshots/Ellipse/color-via-threshold-scale-light-800w.webp and b/docs/static/screenshots/Ellipse/color-via-threshold-scale-light-800w.webp differ diff --git a/docs/static/screenshots/Ellipse/data-mode-dark-240w.webp b/docs/static/screenshots/Ellipse/data-mode-dark-240w.webp index bbb8b50506..ba7ccb65c3 100644 Binary files a/docs/static/screenshots/Ellipse/data-mode-dark-240w.webp and b/docs/static/screenshots/Ellipse/data-mode-dark-240w.webp differ diff --git a/docs/static/screenshots/Ellipse/data-mode-dark-800w.webp b/docs/static/screenshots/Ellipse/data-mode-dark-800w.webp index c021cfd199..59ad051890 100644 Binary files a/docs/static/screenshots/Ellipse/data-mode-dark-800w.webp and b/docs/static/screenshots/Ellipse/data-mode-dark-800w.webp differ diff --git a/docs/static/screenshots/ForceSimulation/beeswarm-dark-800w.webp b/docs/static/screenshots/ForceSimulation/beeswarm-dark-800w.webp index c4f402c147..e1eb1ed95c 100644 Binary files a/docs/static/screenshots/ForceSimulation/beeswarm-dark-800w.webp and b/docs/static/screenshots/ForceSimulation/beeswarm-dark-800w.webp differ diff --git a/docs/static/screenshots/ForceSimulation/collision-detection-dark-240w.webp b/docs/static/screenshots/ForceSimulation/collision-detection-dark-240w.webp index 8dcd99e63c..7d15434b42 100644 Binary files a/docs/static/screenshots/ForceSimulation/collision-detection-dark-240w.webp and b/docs/static/screenshots/ForceSimulation/collision-detection-dark-240w.webp differ diff --git a/docs/static/screenshots/ForceSimulation/collision-detection-dark-400w.webp b/docs/static/screenshots/ForceSimulation/collision-detection-dark-400w.webp index c169dd8237..1c32f3aa75 100644 Binary files a/docs/static/screenshots/ForceSimulation/collision-detection-dark-400w.webp and b/docs/static/screenshots/ForceSimulation/collision-detection-dark-400w.webp differ diff --git a/docs/static/screenshots/ForceSimulation/collision-detection-dark-800w.webp b/docs/static/screenshots/ForceSimulation/collision-detection-dark-800w.webp index c3b977c667..de8fafd625 100644 Binary files a/docs/static/screenshots/ForceSimulation/collision-detection-dark-800w.webp and b/docs/static/screenshots/ForceSimulation/collision-detection-dark-800w.webp differ diff --git a/docs/static/screenshots/ForceSimulation/collision-detection-light-240w.webp b/docs/static/screenshots/ForceSimulation/collision-detection-light-240w.webp index f3894563b7..a2ced4fefa 100644 Binary files a/docs/static/screenshots/ForceSimulation/collision-detection-light-240w.webp and b/docs/static/screenshots/ForceSimulation/collision-detection-light-240w.webp differ diff --git a/docs/static/screenshots/ForceSimulation/collision-detection-light-400w.webp b/docs/static/screenshots/ForceSimulation/collision-detection-light-400w.webp index 10b0757429..6e86e5f722 100644 Binary files a/docs/static/screenshots/ForceSimulation/collision-detection-light-400w.webp and b/docs/static/screenshots/ForceSimulation/collision-detection-light-400w.webp differ diff --git a/docs/static/screenshots/ForceSimulation/collision-detection-light-800w.webp b/docs/static/screenshots/ForceSimulation/collision-detection-light-800w.webp index 157c052b6c..659753e64a 100644 Binary files a/docs/static/screenshots/ForceSimulation/collision-detection-light-800w.webp and b/docs/static/screenshots/ForceSimulation/collision-detection-light-800w.webp differ diff --git a/docs/static/screenshots/ForceSimulation/disjoint-graph-dark-240w.webp b/docs/static/screenshots/ForceSimulation/disjoint-graph-dark-240w.webp index b7f0853d3b..bfdee5bdf9 100644 Binary files a/docs/static/screenshots/ForceSimulation/disjoint-graph-dark-240w.webp and b/docs/static/screenshots/ForceSimulation/disjoint-graph-dark-240w.webp differ diff --git a/docs/static/screenshots/ForceSimulation/disjoint-graph-dark-400w.webp b/docs/static/screenshots/ForceSimulation/disjoint-graph-dark-400w.webp index 92391b6c2a..5a22eb5093 100644 Binary files a/docs/static/screenshots/ForceSimulation/disjoint-graph-dark-400w.webp and b/docs/static/screenshots/ForceSimulation/disjoint-graph-dark-400w.webp differ diff --git a/docs/static/screenshots/ForceSimulation/disjoint-graph-dark-800w.webp b/docs/static/screenshots/ForceSimulation/disjoint-graph-dark-800w.webp index ce5eef7f49..fabc5d78e1 100644 Binary files a/docs/static/screenshots/ForceSimulation/disjoint-graph-dark-800w.webp and b/docs/static/screenshots/ForceSimulation/disjoint-graph-dark-800w.webp differ diff --git a/docs/static/screenshots/ForceSimulation/disjoint-graph-light-240w.webp b/docs/static/screenshots/ForceSimulation/disjoint-graph-light-240w.webp index 78531eee18..cbf93c7ee4 100644 Binary files a/docs/static/screenshots/ForceSimulation/disjoint-graph-light-240w.webp and b/docs/static/screenshots/ForceSimulation/disjoint-graph-light-240w.webp differ diff --git a/docs/static/screenshots/ForceSimulation/disjoint-graph-light-400w.webp b/docs/static/screenshots/ForceSimulation/disjoint-graph-light-400w.webp index f8b27769bc..6bd28b6ecd 100644 Binary files a/docs/static/screenshots/ForceSimulation/disjoint-graph-light-400w.webp and b/docs/static/screenshots/ForceSimulation/disjoint-graph-light-400w.webp differ diff --git a/docs/static/screenshots/ForceSimulation/disjoint-graph-light-800w.webp b/docs/static/screenshots/ForceSimulation/disjoint-graph-light-800w.webp index 65a5cbe35f..9b2487b7ec 100644 Binary files a/docs/static/screenshots/ForceSimulation/disjoint-graph-light-800w.webp and b/docs/static/screenshots/ForceSimulation/disjoint-graph-light-800w.webp differ diff --git a/docs/static/screenshots/ForceSimulation/games-industry-layoffs-dark-240w.webp b/docs/static/screenshots/ForceSimulation/games-industry-layoffs-dark-240w.webp index ae01b922af..b61de085d3 100644 Binary files a/docs/static/screenshots/ForceSimulation/games-industry-layoffs-dark-240w.webp and b/docs/static/screenshots/ForceSimulation/games-industry-layoffs-dark-240w.webp differ diff --git a/docs/static/screenshots/ForceSimulation/games-industry-layoffs-dark-400w.webp b/docs/static/screenshots/ForceSimulation/games-industry-layoffs-dark-400w.webp index 8150694d36..2506c15fc3 100644 Binary files a/docs/static/screenshots/ForceSimulation/games-industry-layoffs-dark-400w.webp and b/docs/static/screenshots/ForceSimulation/games-industry-layoffs-dark-400w.webp differ diff --git a/docs/static/screenshots/ForceSimulation/games-industry-layoffs-dark-800w.webp b/docs/static/screenshots/ForceSimulation/games-industry-layoffs-dark-800w.webp index 2b315b3836..20cb6a7748 100644 Binary files a/docs/static/screenshots/ForceSimulation/games-industry-layoffs-dark-800w.webp and b/docs/static/screenshots/ForceSimulation/games-industry-layoffs-dark-800w.webp differ diff --git a/docs/static/screenshots/ForceSimulation/games-industry-layoffs-light-240w.webp b/docs/static/screenshots/ForceSimulation/games-industry-layoffs-light-240w.webp index 5b833e82cc..e9b6b81017 100644 Binary files a/docs/static/screenshots/ForceSimulation/games-industry-layoffs-light-240w.webp and b/docs/static/screenshots/ForceSimulation/games-industry-layoffs-light-240w.webp differ diff --git a/docs/static/screenshots/ForceSimulation/games-industry-layoffs-light-400w.webp b/docs/static/screenshots/ForceSimulation/games-industry-layoffs-light-400w.webp index f51c963c2b..76ca611f20 100644 Binary files a/docs/static/screenshots/ForceSimulation/games-industry-layoffs-light-400w.webp and b/docs/static/screenshots/ForceSimulation/games-industry-layoffs-light-400w.webp differ diff --git a/docs/static/screenshots/ForceSimulation/games-industry-layoffs-light-800w.webp b/docs/static/screenshots/ForceSimulation/games-industry-layoffs-light-800w.webp index 336f9407e2..a432238795 100644 Binary files a/docs/static/screenshots/ForceSimulation/games-industry-layoffs-light-800w.webp and b/docs/static/screenshots/ForceSimulation/games-industry-layoffs-light-800w.webp differ diff --git a/docs/static/screenshots/ForceSimulation/graph-drag-dark-240w.webp b/docs/static/screenshots/ForceSimulation/graph-drag-dark-240w.webp index f9f6c1faeb..34f93b032f 100644 Binary files a/docs/static/screenshots/ForceSimulation/graph-drag-dark-240w.webp and b/docs/static/screenshots/ForceSimulation/graph-drag-dark-240w.webp differ diff --git a/docs/static/screenshots/ForceSimulation/graph-drag-dark-400w.webp b/docs/static/screenshots/ForceSimulation/graph-drag-dark-400w.webp index 38a630ef0b..9906b5805d 100644 Binary files a/docs/static/screenshots/ForceSimulation/graph-drag-dark-400w.webp and b/docs/static/screenshots/ForceSimulation/graph-drag-dark-400w.webp differ diff --git a/docs/static/screenshots/ForceSimulation/graph-drag-dark-800w.webp b/docs/static/screenshots/ForceSimulation/graph-drag-dark-800w.webp index 1daf9a78ba..1e6c804fb0 100644 Binary files a/docs/static/screenshots/ForceSimulation/graph-drag-dark-800w.webp and b/docs/static/screenshots/ForceSimulation/graph-drag-dark-800w.webp differ diff --git a/docs/static/screenshots/ForceSimulation/graph-drag-light-240w.webp b/docs/static/screenshots/ForceSimulation/graph-drag-light-240w.webp index 71502ecdd6..749de02be0 100644 Binary files a/docs/static/screenshots/ForceSimulation/graph-drag-light-240w.webp and b/docs/static/screenshots/ForceSimulation/graph-drag-light-240w.webp differ diff --git a/docs/static/screenshots/ForceSimulation/graph-drag-light-400w.webp b/docs/static/screenshots/ForceSimulation/graph-drag-light-400w.webp index 321582b256..b328644e83 100644 Binary files a/docs/static/screenshots/ForceSimulation/graph-drag-light-400w.webp and b/docs/static/screenshots/ForceSimulation/graph-drag-light-400w.webp differ diff --git a/docs/static/screenshots/ForceSimulation/graph-drag-light-800w.webp b/docs/static/screenshots/ForceSimulation/graph-drag-light-800w.webp index 728e4463dd..86748b2c74 100644 Binary files a/docs/static/screenshots/ForceSimulation/graph-drag-light-800w.webp and b/docs/static/screenshots/ForceSimulation/graph-drag-light-800w.webp differ diff --git a/docs/static/screenshots/ForceSimulation/graph-playground-dark-240w.webp b/docs/static/screenshots/ForceSimulation/graph-playground-dark-240w.webp index ead4f3c7ad..830210fa70 100644 Binary files a/docs/static/screenshots/ForceSimulation/graph-playground-dark-240w.webp and b/docs/static/screenshots/ForceSimulation/graph-playground-dark-240w.webp differ diff --git a/docs/static/screenshots/ForceSimulation/graph-playground-dark-400w.webp b/docs/static/screenshots/ForceSimulation/graph-playground-dark-400w.webp index c552dc6171..8669d0120d 100644 Binary files a/docs/static/screenshots/ForceSimulation/graph-playground-dark-400w.webp and b/docs/static/screenshots/ForceSimulation/graph-playground-dark-400w.webp differ diff --git a/docs/static/screenshots/ForceSimulation/graph-playground-dark-800w.webp b/docs/static/screenshots/ForceSimulation/graph-playground-dark-800w.webp index f127c35af9..88fdfdb4b9 100644 Binary files a/docs/static/screenshots/ForceSimulation/graph-playground-dark-800w.webp and b/docs/static/screenshots/ForceSimulation/graph-playground-dark-800w.webp differ diff --git a/docs/static/screenshots/ForceSimulation/graph-playground-light-240w.webp b/docs/static/screenshots/ForceSimulation/graph-playground-light-240w.webp index 0f94675816..ceecd0b93a 100644 Binary files a/docs/static/screenshots/ForceSimulation/graph-playground-light-240w.webp and b/docs/static/screenshots/ForceSimulation/graph-playground-light-240w.webp differ diff --git a/docs/static/screenshots/ForceSimulation/graph-playground-light-400w.webp b/docs/static/screenshots/ForceSimulation/graph-playground-light-400w.webp index 9efa2026ef..ccc49a20fa 100644 Binary files a/docs/static/screenshots/ForceSimulation/graph-playground-light-400w.webp and b/docs/static/screenshots/ForceSimulation/graph-playground-light-400w.webp differ diff --git a/docs/static/screenshots/ForceSimulation/graph-playground-light-800w.webp b/docs/static/screenshots/ForceSimulation/graph-playground-light-800w.webp index 01e6f1920b..bae0e21e93 100644 Binary files a/docs/static/screenshots/ForceSimulation/graph-playground-light-800w.webp and b/docs/static/screenshots/ForceSimulation/graph-playground-light-800w.webp differ diff --git a/docs/static/screenshots/ForceSimulation/group-dark-240w.webp b/docs/static/screenshots/ForceSimulation/group-dark-240w.webp index 78d2fe9ad5..cc1076e048 100644 Binary files a/docs/static/screenshots/ForceSimulation/group-dark-240w.webp and b/docs/static/screenshots/ForceSimulation/group-dark-240w.webp differ diff --git a/docs/static/screenshots/ForceSimulation/group-dark-400w.webp b/docs/static/screenshots/ForceSimulation/group-dark-400w.webp index 5cc933efa4..b674813cf7 100644 Binary files a/docs/static/screenshots/ForceSimulation/group-dark-400w.webp and b/docs/static/screenshots/ForceSimulation/group-dark-400w.webp differ diff --git a/docs/static/screenshots/ForceSimulation/group-dark-800w.webp b/docs/static/screenshots/ForceSimulation/group-dark-800w.webp index 988ca1bbfa..ab8e4ed128 100644 Binary files a/docs/static/screenshots/ForceSimulation/group-dark-800w.webp and b/docs/static/screenshots/ForceSimulation/group-dark-800w.webp differ diff --git a/docs/static/screenshots/ForceSimulation/group-light-240w.webp b/docs/static/screenshots/ForceSimulation/group-light-240w.webp index 883d7172a7..f73889387b 100644 Binary files a/docs/static/screenshots/ForceSimulation/group-light-240w.webp and b/docs/static/screenshots/ForceSimulation/group-light-240w.webp differ diff --git a/docs/static/screenshots/ForceSimulation/group-light-400w.webp b/docs/static/screenshots/ForceSimulation/group-light-400w.webp index 80995d0167..612b12445e 100644 Binary files a/docs/static/screenshots/ForceSimulation/group-light-400w.webp and b/docs/static/screenshots/ForceSimulation/group-light-400w.webp differ diff --git a/docs/static/screenshots/ForceSimulation/group-light-800w.webp b/docs/static/screenshots/ForceSimulation/group-light-800w.webp index b3aebdbb58..fb26157a8e 100644 Binary files a/docs/static/screenshots/ForceSimulation/group-light-800w.webp and b/docs/static/screenshots/ForceSimulation/group-light-800w.webp differ diff --git a/docs/static/screenshots/ForceSimulation/lattice-dark-240w.webp b/docs/static/screenshots/ForceSimulation/lattice-dark-240w.webp index 36caa5e9bf..678783f48f 100644 Binary files a/docs/static/screenshots/ForceSimulation/lattice-dark-240w.webp and b/docs/static/screenshots/ForceSimulation/lattice-dark-240w.webp differ diff --git a/docs/static/screenshots/ForceSimulation/lattice-dark-400w.webp b/docs/static/screenshots/ForceSimulation/lattice-dark-400w.webp index 1f3b9e7ebc..eb98055904 100644 Binary files a/docs/static/screenshots/ForceSimulation/lattice-dark-400w.webp and b/docs/static/screenshots/ForceSimulation/lattice-dark-400w.webp differ diff --git a/docs/static/screenshots/ForceSimulation/lattice-dark-800w.webp b/docs/static/screenshots/ForceSimulation/lattice-dark-800w.webp index 8bd195f51f..3ebfae55b0 100644 Binary files a/docs/static/screenshots/ForceSimulation/lattice-dark-800w.webp and b/docs/static/screenshots/ForceSimulation/lattice-dark-800w.webp differ diff --git a/docs/static/screenshots/ForceSimulation/lattice-light-240w.webp b/docs/static/screenshots/ForceSimulation/lattice-light-240w.webp index 788565fecc..51452cd8a5 100644 Binary files a/docs/static/screenshots/ForceSimulation/lattice-light-240w.webp and b/docs/static/screenshots/ForceSimulation/lattice-light-240w.webp differ diff --git a/docs/static/screenshots/ForceSimulation/lattice-light-400w.webp b/docs/static/screenshots/ForceSimulation/lattice-light-400w.webp index b6d7feb6b1..5b2c17d35a 100644 Binary files a/docs/static/screenshots/ForceSimulation/lattice-light-400w.webp and b/docs/static/screenshots/ForceSimulation/lattice-light-400w.webp differ diff --git a/docs/static/screenshots/ForceSimulation/lattice-light-800w.webp b/docs/static/screenshots/ForceSimulation/lattice-light-800w.webp index 39e99f5cf1..3c1e0def5f 100644 Binary files a/docs/static/screenshots/ForceSimulation/lattice-light-800w.webp and b/docs/static/screenshots/ForceSimulation/lattice-light-800w.webp differ diff --git a/docs/static/screenshots/ForceSimulation/layoffs-by-industry-dark-240w.webp b/docs/static/screenshots/ForceSimulation/layoffs-by-industry-dark-240w.webp index cbce698dc2..de8b3da0ac 100644 Binary files a/docs/static/screenshots/ForceSimulation/layoffs-by-industry-dark-240w.webp and b/docs/static/screenshots/ForceSimulation/layoffs-by-industry-dark-240w.webp differ diff --git a/docs/static/screenshots/ForceSimulation/layoffs-by-industry-dark-400w.webp b/docs/static/screenshots/ForceSimulation/layoffs-by-industry-dark-400w.webp index ca323adb4b..78ea89bb78 100644 Binary files a/docs/static/screenshots/ForceSimulation/layoffs-by-industry-dark-400w.webp and b/docs/static/screenshots/ForceSimulation/layoffs-by-industry-dark-400w.webp differ diff --git a/docs/static/screenshots/ForceSimulation/layoffs-by-industry-dark-800w.webp b/docs/static/screenshots/ForceSimulation/layoffs-by-industry-dark-800w.webp index 1955253171..df2bfc9fca 100644 Binary files a/docs/static/screenshots/ForceSimulation/layoffs-by-industry-dark-800w.webp and b/docs/static/screenshots/ForceSimulation/layoffs-by-industry-dark-800w.webp differ diff --git a/docs/static/screenshots/ForceSimulation/layoffs-by-industry-light-240w.webp b/docs/static/screenshots/ForceSimulation/layoffs-by-industry-light-240w.webp index d0a7570eac..09a33015ef 100644 Binary files a/docs/static/screenshots/ForceSimulation/layoffs-by-industry-light-240w.webp and b/docs/static/screenshots/ForceSimulation/layoffs-by-industry-light-240w.webp differ diff --git a/docs/static/screenshots/ForceSimulation/layoffs-by-industry-light-400w.webp b/docs/static/screenshots/ForceSimulation/layoffs-by-industry-light-400w.webp index c4d5be2f89..b34c0289b7 100644 Binary files a/docs/static/screenshots/ForceSimulation/layoffs-by-industry-light-400w.webp and b/docs/static/screenshots/ForceSimulation/layoffs-by-industry-light-400w.webp differ diff --git a/docs/static/screenshots/ForceSimulation/layoffs-by-industry-light-800w.webp b/docs/static/screenshots/ForceSimulation/layoffs-by-industry-light-800w.webp index ed1ac1590e..15ba13dc33 100644 Binary files a/docs/static/screenshots/ForceSimulation/layoffs-by-industry-light-800w.webp and b/docs/static/screenshots/ForceSimulation/layoffs-by-industry-light-800w.webp differ diff --git a/docs/static/screenshots/ForceSimulation/text-dark-240w.webp b/docs/static/screenshots/ForceSimulation/text-dark-240w.webp index ddb1150d84..c173be1062 100644 Binary files a/docs/static/screenshots/ForceSimulation/text-dark-240w.webp and b/docs/static/screenshots/ForceSimulation/text-dark-240w.webp differ diff --git a/docs/static/screenshots/ForceSimulation/text-dark-400w.webp b/docs/static/screenshots/ForceSimulation/text-dark-400w.webp index 4faafc8d25..24e70f43d2 100644 Binary files a/docs/static/screenshots/ForceSimulation/text-dark-400w.webp and b/docs/static/screenshots/ForceSimulation/text-dark-400w.webp differ diff --git a/docs/static/screenshots/ForceSimulation/text-dark-800w.webp b/docs/static/screenshots/ForceSimulation/text-dark-800w.webp index 8e3da277c2..47e58ebb4a 100644 Binary files a/docs/static/screenshots/ForceSimulation/text-dark-800w.webp and b/docs/static/screenshots/ForceSimulation/text-dark-800w.webp differ diff --git a/docs/static/screenshots/ForceSimulation/text-light-240w.webp b/docs/static/screenshots/ForceSimulation/text-light-240w.webp index d5080b88c6..a14b705cd7 100644 Binary files a/docs/static/screenshots/ForceSimulation/text-light-240w.webp and b/docs/static/screenshots/ForceSimulation/text-light-240w.webp differ diff --git a/docs/static/screenshots/ForceSimulation/text-light-400w.webp b/docs/static/screenshots/ForceSimulation/text-light-400w.webp index 98d49d96de..089f86c593 100644 Binary files a/docs/static/screenshots/ForceSimulation/text-light-400w.webp and b/docs/static/screenshots/ForceSimulation/text-light-400w.webp differ diff --git a/docs/static/screenshots/ForceSimulation/text-light-800w.webp b/docs/static/screenshots/ForceSimulation/text-light-800w.webp index 117a2efe2b..bcd54bc4b4 100644 Binary files a/docs/static/screenshots/ForceSimulation/text-light-800w.webp and b/docs/static/screenshots/ForceSimulation/text-light-800w.webp differ diff --git a/docs/static/screenshots/ForceSimulation/tree-dark-240w.webp b/docs/static/screenshots/ForceSimulation/tree-dark-240w.webp index 6c06917ce3..7a0571891e 100644 Binary files a/docs/static/screenshots/ForceSimulation/tree-dark-240w.webp and b/docs/static/screenshots/ForceSimulation/tree-dark-240w.webp differ diff --git a/docs/static/screenshots/ForceSimulation/tree-dark-400w.webp b/docs/static/screenshots/ForceSimulation/tree-dark-400w.webp index 8c314a8d1b..e1bad6d152 100644 Binary files a/docs/static/screenshots/ForceSimulation/tree-dark-400w.webp and b/docs/static/screenshots/ForceSimulation/tree-dark-400w.webp differ diff --git a/docs/static/screenshots/ForceSimulation/tree-dark-800w.webp b/docs/static/screenshots/ForceSimulation/tree-dark-800w.webp index 32f29f0b16..75eb4f080f 100644 Binary files a/docs/static/screenshots/ForceSimulation/tree-dark-800w.webp and b/docs/static/screenshots/ForceSimulation/tree-dark-800w.webp differ diff --git a/docs/static/screenshots/ForceSimulation/tree-light-240w.webp b/docs/static/screenshots/ForceSimulation/tree-light-240w.webp index 0814f0eec8..1865adc872 100644 Binary files a/docs/static/screenshots/ForceSimulation/tree-light-240w.webp and b/docs/static/screenshots/ForceSimulation/tree-light-240w.webp differ diff --git a/docs/static/screenshots/ForceSimulation/tree-light-400w.webp b/docs/static/screenshots/ForceSimulation/tree-light-400w.webp index 97e0928e04..72748339b4 100644 Binary files a/docs/static/screenshots/ForceSimulation/tree-light-400w.webp and b/docs/static/screenshots/ForceSimulation/tree-light-400w.webp differ diff --git a/docs/static/screenshots/ForceSimulation/tree-light-800w.webp b/docs/static/screenshots/ForceSimulation/tree-light-800w.webp index d272f8df44..2527aeb5f2 100644 Binary files a/docs/static/screenshots/ForceSimulation/tree-light-800w.webp and b/docs/static/screenshots/ForceSimulation/tree-light-800w.webp differ diff --git a/docs/static/screenshots/Frame/basic-dark-240w.webp b/docs/static/screenshots/Frame/basic-dark-240w.webp index 8d0e242ca0..764388a5f2 100644 Binary files a/docs/static/screenshots/Frame/basic-dark-240w.webp and b/docs/static/screenshots/Frame/basic-dark-240w.webp differ diff --git a/docs/static/screenshots/Frame/basic-dark-800w.webp b/docs/static/screenshots/Frame/basic-dark-800w.webp index 4246ece907..1d00ae459c 100644 Binary files a/docs/static/screenshots/Frame/basic-dark-800w.webp and b/docs/static/screenshots/Frame/basic-dark-800w.webp differ diff --git a/docs/static/screenshots/Frame/border-dark-400w.webp b/docs/static/screenshots/Frame/border-dark-400w.webp index 0387fd833c..71bf87deec 100644 Binary files a/docs/static/screenshots/Frame/border-dark-400w.webp and b/docs/static/screenshots/Frame/border-dark-400w.webp differ diff --git a/docs/static/screenshots/Frame/border-dark-800w.webp b/docs/static/screenshots/Frame/border-dark-800w.webp index 6c2b9d8af2..ac8b1a7998 100644 Binary files a/docs/static/screenshots/Frame/border-dark-800w.webp and b/docs/static/screenshots/Frame/border-dark-800w.webp differ diff --git a/docs/static/screenshots/Frame/border-light-240w.webp b/docs/static/screenshots/Frame/border-light-240w.webp index a5afa464b4..f95e849769 100644 Binary files a/docs/static/screenshots/Frame/border-light-240w.webp and b/docs/static/screenshots/Frame/border-light-240w.webp differ diff --git a/docs/static/screenshots/Frame/border-light-800w.webp b/docs/static/screenshots/Frame/border-light-800w.webp index 53627ed045..1ceac6d488 100644 Binary files a/docs/static/screenshots/Frame/border-light-800w.webp and b/docs/static/screenshots/Frame/border-light-800w.webp differ diff --git a/docs/static/screenshots/Frame/full-dark-240w.webp b/docs/static/screenshots/Frame/full-dark-240w.webp index 2e6ba3f6b8..3696cb7803 100644 Binary files a/docs/static/screenshots/Frame/full-dark-240w.webp and b/docs/static/screenshots/Frame/full-dark-240w.webp differ diff --git a/docs/static/screenshots/Frame/full-dark-400w.webp b/docs/static/screenshots/Frame/full-dark-400w.webp index a62d9533b6..54275b34fa 100644 Binary files a/docs/static/screenshots/Frame/full-dark-400w.webp and b/docs/static/screenshots/Frame/full-dark-400w.webp differ diff --git a/docs/static/screenshots/Frame/full-light-400w.webp b/docs/static/screenshots/Frame/full-light-400w.webp index be4e26f20f..55ccb39111 100644 Binary files a/docs/static/screenshots/Frame/full-light-400w.webp and b/docs/static/screenshots/Frame/full-light-400w.webp differ diff --git a/docs/static/screenshots/Frame/gradient-dark-800w.webp b/docs/static/screenshots/Frame/gradient-dark-800w.webp index 04b8164652..10dafd76bd 100644 Binary files a/docs/static/screenshots/Frame/gradient-dark-800w.webp and b/docs/static/screenshots/Frame/gradient-dark-800w.webp differ diff --git a/docs/static/screenshots/Frame/gradient-light-240w.webp b/docs/static/screenshots/Frame/gradient-light-240w.webp index cda0ffe556..027cae2abe 100644 Binary files a/docs/static/screenshots/Frame/gradient-light-240w.webp and b/docs/static/screenshots/Frame/gradient-light-240w.webp differ diff --git a/docs/static/screenshots/Frame/gradient-light-800w.webp b/docs/static/screenshots/Frame/gradient-light-800w.webp index ab1d8da542..0c59970877 100644 Binary files a/docs/static/screenshots/Frame/gradient-light-800w.webp and b/docs/static/screenshots/Frame/gradient-light-800w.webp differ diff --git a/docs/static/screenshots/GeoCircle/earthquake-globe-dark-240w.webp b/docs/static/screenshots/GeoCircle/earthquake-globe-dark-240w.webp index 6f15c5bf7f..59c2df9760 100644 Binary files a/docs/static/screenshots/GeoCircle/earthquake-globe-dark-240w.webp and b/docs/static/screenshots/GeoCircle/earthquake-globe-dark-240w.webp differ diff --git a/docs/static/screenshots/GeoCircle/earthquake-globe-dark-400w.webp b/docs/static/screenshots/GeoCircle/earthquake-globe-dark-400w.webp index 8eed4d5073..c419ff41b7 100644 Binary files a/docs/static/screenshots/GeoCircle/earthquake-globe-dark-400w.webp and b/docs/static/screenshots/GeoCircle/earthquake-globe-dark-400w.webp differ diff --git a/docs/static/screenshots/GeoCircle/earthquake-globe-dark-800w.webp b/docs/static/screenshots/GeoCircle/earthquake-globe-dark-800w.webp index 5e51eb2e56..382b94e230 100644 Binary files a/docs/static/screenshots/GeoCircle/earthquake-globe-dark-800w.webp and b/docs/static/screenshots/GeoCircle/earthquake-globe-dark-800w.webp differ diff --git a/docs/static/screenshots/GeoCircle/earthquake-globe-light-240w.webp b/docs/static/screenshots/GeoCircle/earthquake-globe-light-240w.webp index d2d56d04b5..9faafa5425 100644 Binary files a/docs/static/screenshots/GeoCircle/earthquake-globe-light-240w.webp and b/docs/static/screenshots/GeoCircle/earthquake-globe-light-240w.webp differ diff --git a/docs/static/screenshots/GeoCircle/earthquake-globe-light-400w.webp b/docs/static/screenshots/GeoCircle/earthquake-globe-light-400w.webp index 15376769c0..c8841b9fdb 100644 Binary files a/docs/static/screenshots/GeoCircle/earthquake-globe-light-400w.webp and b/docs/static/screenshots/GeoCircle/earthquake-globe-light-400w.webp differ diff --git a/docs/static/screenshots/GeoCircle/earthquake-globe-light-800w.webp b/docs/static/screenshots/GeoCircle/earthquake-globe-light-800w.webp index ad15890b50..8299629cac 100644 Binary files a/docs/static/screenshots/GeoCircle/earthquake-globe-light-800w.webp and b/docs/static/screenshots/GeoCircle/earthquake-globe-light-800w.webp differ diff --git a/docs/static/screenshots/GeoLegend/basic-dark-800w.webp b/docs/static/screenshots/GeoLegend/basic-dark-800w.webp index 33e9083df1..3fe206fd67 100644 Binary files a/docs/static/screenshots/GeoLegend/basic-dark-800w.webp and b/docs/static/screenshots/GeoLegend/basic-dark-800w.webp differ diff --git a/docs/static/screenshots/GeoLegend/basic-light-240w.webp b/docs/static/screenshots/GeoLegend/basic-light-240w.webp index baaa075d64..7f4e2ddc61 100644 Binary files a/docs/static/screenshots/GeoLegend/basic-light-240w.webp and b/docs/static/screenshots/GeoLegend/basic-light-240w.webp differ diff --git a/docs/static/screenshots/GeoLegend/basic-light-400w.webp b/docs/static/screenshots/GeoLegend/basic-light-400w.webp index dad119857e..3e8f3bdf98 100644 Binary files a/docs/static/screenshots/GeoLegend/basic-light-400w.webp and b/docs/static/screenshots/GeoLegend/basic-light-400w.webp differ diff --git a/docs/static/screenshots/GeoLegend/basic-light-800w.webp b/docs/static/screenshots/GeoLegend/basic-light-800w.webp index 4473ee5963..e2e3a9b869 100644 Binary files a/docs/static/screenshots/GeoLegend/basic-light-800w.webp and b/docs/static/screenshots/GeoLegend/basic-light-800w.webp differ diff --git a/docs/static/screenshots/GeoLegend/canvas-mode-dark-800w.webp b/docs/static/screenshots/GeoLegend/canvas-mode-dark-800w.webp index bff18ec0ef..74cf3aeac3 100644 Binary files a/docs/static/screenshots/GeoLegend/canvas-mode-dark-800w.webp and b/docs/static/screenshots/GeoLegend/canvas-mode-dark-800w.webp differ diff --git a/docs/static/screenshots/GeoLegend/canvas-mode-light-400w.webp b/docs/static/screenshots/GeoLegend/canvas-mode-light-400w.webp index 545a48bf2e..a25d974bf4 100644 Binary files a/docs/static/screenshots/GeoLegend/canvas-mode-light-400w.webp and b/docs/static/screenshots/GeoLegend/canvas-mode-light-400w.webp differ diff --git a/docs/static/screenshots/GeoLegend/canvas-mode-light-800w.webp b/docs/static/screenshots/GeoLegend/canvas-mode-light-800w.webp index 75b30ab8ba..7ab6e361d3 100644 Binary files a/docs/static/screenshots/GeoLegend/canvas-mode-light-800w.webp and b/docs/static/screenshots/GeoLegend/canvas-mode-light-800w.webp differ diff --git a/docs/static/screenshots/GeoLegend/stacked-units-dark-240w.webp b/docs/static/screenshots/GeoLegend/stacked-units-dark-240w.webp index 10bb22b0b4..6208fb8f4d 100644 Binary files a/docs/static/screenshots/GeoLegend/stacked-units-dark-240w.webp and b/docs/static/screenshots/GeoLegend/stacked-units-dark-240w.webp differ diff --git a/docs/static/screenshots/GeoLegend/stacked-units-dark-400w.webp b/docs/static/screenshots/GeoLegend/stacked-units-dark-400w.webp index d4be2c308c..a6f7be3ed3 100644 Binary files a/docs/static/screenshots/GeoLegend/stacked-units-dark-400w.webp and b/docs/static/screenshots/GeoLegend/stacked-units-dark-400w.webp differ diff --git a/docs/static/screenshots/GeoLegend/stacked-units-dark-800w.webp b/docs/static/screenshots/GeoLegend/stacked-units-dark-800w.webp index a351289d42..e30149ba9d 100644 Binary files a/docs/static/screenshots/GeoLegend/stacked-units-dark-800w.webp and b/docs/static/screenshots/GeoLegend/stacked-units-dark-800w.webp differ diff --git a/docs/static/screenshots/GeoLegend/stacked-units-light-240w.webp b/docs/static/screenshots/GeoLegend/stacked-units-light-240w.webp index b39be711ba..5cea92a590 100644 Binary files a/docs/static/screenshots/GeoLegend/stacked-units-light-240w.webp and b/docs/static/screenshots/GeoLegend/stacked-units-light-240w.webp differ diff --git a/docs/static/screenshots/GeoLegend/stacked-units-light-400w.webp b/docs/static/screenshots/GeoLegend/stacked-units-light-400w.webp index 2e3888ad7c..28c8edaea5 100644 Binary files a/docs/static/screenshots/GeoLegend/stacked-units-light-400w.webp and b/docs/static/screenshots/GeoLegend/stacked-units-light-400w.webp differ diff --git a/docs/static/screenshots/GeoLegend/stacked-units-light-800w.webp b/docs/static/screenshots/GeoLegend/stacked-units-light-800w.webp index 75922826ed..45fa338ec9 100644 Binary files a/docs/static/screenshots/GeoLegend/stacked-units-light-800w.webp and b/docs/static/screenshots/GeoLegend/stacked-units-light-800w.webp differ diff --git a/docs/static/screenshots/GeoPath/bubble-map-dark-240w.webp b/docs/static/screenshots/GeoPath/bubble-map-dark-240w.webp index 28c21ed9ae..7fabeddef8 100644 Binary files a/docs/static/screenshots/GeoPath/bubble-map-dark-240w.webp and b/docs/static/screenshots/GeoPath/bubble-map-dark-240w.webp differ diff --git a/docs/static/screenshots/GeoPath/bubble-map-dark-400w.webp b/docs/static/screenshots/GeoPath/bubble-map-dark-400w.webp index 1a2cd0c49f..22361c42b9 100644 Binary files a/docs/static/screenshots/GeoPath/bubble-map-dark-400w.webp and b/docs/static/screenshots/GeoPath/bubble-map-dark-400w.webp differ diff --git a/docs/static/screenshots/GeoPath/bubble-map-dark-800w.webp b/docs/static/screenshots/GeoPath/bubble-map-dark-800w.webp index b00678e395..a4b0e2effd 100644 Binary files a/docs/static/screenshots/GeoPath/bubble-map-dark-800w.webp and b/docs/static/screenshots/GeoPath/bubble-map-dark-800w.webp differ diff --git a/docs/static/screenshots/GeoPath/bubble-map-light-240w.webp b/docs/static/screenshots/GeoPath/bubble-map-light-240w.webp index 01108e55e1..84b290d98b 100644 Binary files a/docs/static/screenshots/GeoPath/bubble-map-light-240w.webp and b/docs/static/screenshots/GeoPath/bubble-map-light-240w.webp differ diff --git a/docs/static/screenshots/GeoPath/bubble-map-light-400w.webp b/docs/static/screenshots/GeoPath/bubble-map-light-400w.webp index 07d8a7e0dc..6bf73c95e2 100644 Binary files a/docs/static/screenshots/GeoPath/bubble-map-light-400w.webp and b/docs/static/screenshots/GeoPath/bubble-map-light-400w.webp differ diff --git a/docs/static/screenshots/GeoPath/bubble-map-light-800w.webp b/docs/static/screenshots/GeoPath/bubble-map-light-800w.webp index c20de7d6d6..fd8c44eca4 100644 Binary files a/docs/static/screenshots/GeoPath/bubble-map-light-800w.webp and b/docs/static/screenshots/GeoPath/bubble-map-light-800w.webp differ diff --git a/docs/static/screenshots/GeoPath/choropleth-dark-800w.webp b/docs/static/screenshots/GeoPath/choropleth-dark-800w.webp index bb5a21cda6..45086a071c 100644 Binary files a/docs/static/screenshots/GeoPath/choropleth-dark-800w.webp and b/docs/static/screenshots/GeoPath/choropleth-dark-800w.webp differ diff --git a/docs/static/screenshots/GeoPath/choropleth-light-240w.webp b/docs/static/screenshots/GeoPath/choropleth-light-240w.webp index c8e6fe7611..6e561e01c3 100644 Binary files a/docs/static/screenshots/GeoPath/choropleth-light-240w.webp and b/docs/static/screenshots/GeoPath/choropleth-light-240w.webp differ diff --git a/docs/static/screenshots/GeoPath/eclipses-globe-dark-240w.webp b/docs/static/screenshots/GeoPath/eclipses-globe-dark-240w.webp index f34c72f997..8e49858c8e 100644 Binary files a/docs/static/screenshots/GeoPath/eclipses-globe-dark-240w.webp and b/docs/static/screenshots/GeoPath/eclipses-globe-dark-240w.webp differ diff --git a/docs/static/screenshots/GeoPath/eclipses-globe-dark-400w.webp b/docs/static/screenshots/GeoPath/eclipses-globe-dark-400w.webp index bdbf09fcd4..5de369e81f 100644 Binary files a/docs/static/screenshots/GeoPath/eclipses-globe-dark-400w.webp and b/docs/static/screenshots/GeoPath/eclipses-globe-dark-400w.webp differ diff --git a/docs/static/screenshots/GeoPath/eclipses-globe-dark-800w.webp b/docs/static/screenshots/GeoPath/eclipses-globe-dark-800w.webp index 48155413a9..f39ceb03af 100644 Binary files a/docs/static/screenshots/GeoPath/eclipses-globe-dark-800w.webp and b/docs/static/screenshots/GeoPath/eclipses-globe-dark-800w.webp differ diff --git a/docs/static/screenshots/GeoPath/eclipses-globe-light-240w.webp b/docs/static/screenshots/GeoPath/eclipses-globe-light-240w.webp index 57f03c90a9..99788bec40 100644 Binary files a/docs/static/screenshots/GeoPath/eclipses-globe-light-240w.webp and b/docs/static/screenshots/GeoPath/eclipses-globe-light-240w.webp differ diff --git a/docs/static/screenshots/GeoPath/eclipses-globe-light-400w.webp b/docs/static/screenshots/GeoPath/eclipses-globe-light-400w.webp index 1a58f8939f..4f82cd4dce 100644 Binary files a/docs/static/screenshots/GeoPath/eclipses-globe-light-400w.webp and b/docs/static/screenshots/GeoPath/eclipses-globe-light-400w.webp differ diff --git a/docs/static/screenshots/GeoPath/eclipses-globe-light-800w.webp b/docs/static/screenshots/GeoPath/eclipses-globe-light-800w.webp index faa13472c7..c415e4a3a2 100644 Binary files a/docs/static/screenshots/GeoPath/eclipses-globe-light-800w.webp and b/docs/static/screenshots/GeoPath/eclipses-globe-light-800w.webp differ diff --git a/docs/static/screenshots/GeoPath/interpolating-projections-dark-240w.webp b/docs/static/screenshots/GeoPath/interpolating-projections-dark-240w.webp index 7609144434..af6d01d837 100644 Binary files a/docs/static/screenshots/GeoPath/interpolating-projections-dark-240w.webp and b/docs/static/screenshots/GeoPath/interpolating-projections-dark-240w.webp differ diff --git a/docs/static/screenshots/GeoPath/interpolating-projections-dark-400w.webp b/docs/static/screenshots/GeoPath/interpolating-projections-dark-400w.webp index 4985c48c78..db9c95b712 100644 Binary files a/docs/static/screenshots/GeoPath/interpolating-projections-dark-400w.webp and b/docs/static/screenshots/GeoPath/interpolating-projections-dark-400w.webp differ diff --git a/docs/static/screenshots/GeoPath/interpolating-projections-dark-800w.webp b/docs/static/screenshots/GeoPath/interpolating-projections-dark-800w.webp index 53cc86b92f..6a3ae17b60 100644 Binary files a/docs/static/screenshots/GeoPath/interpolating-projections-dark-800w.webp and b/docs/static/screenshots/GeoPath/interpolating-projections-dark-800w.webp differ diff --git a/docs/static/screenshots/GeoPath/interpolating-projections-light-240w.webp b/docs/static/screenshots/GeoPath/interpolating-projections-light-240w.webp index db3e56fcdf..62792aa68d 100644 Binary files a/docs/static/screenshots/GeoPath/interpolating-projections-light-240w.webp and b/docs/static/screenshots/GeoPath/interpolating-projections-light-240w.webp differ diff --git a/docs/static/screenshots/GeoPath/interpolating-projections-light-400w.webp b/docs/static/screenshots/GeoPath/interpolating-projections-light-400w.webp index 3ada3746ab..dd6c4bc659 100644 Binary files a/docs/static/screenshots/GeoPath/interpolating-projections-light-400w.webp and b/docs/static/screenshots/GeoPath/interpolating-projections-light-400w.webp differ diff --git a/docs/static/screenshots/GeoPath/interpolating-projections-light-800w.webp b/docs/static/screenshots/GeoPath/interpolating-projections-light-800w.webp index e900158fc7..c453af3fbb 100644 Binary files a/docs/static/screenshots/GeoPath/interpolating-projections-light-800w.webp and b/docs/static/screenshots/GeoPath/interpolating-projections-light-800w.webp differ diff --git a/docs/static/screenshots/GeoPath/submarine-cables-globe-dark-240w.webp b/docs/static/screenshots/GeoPath/submarine-cables-globe-dark-240w.webp index d646c15563..de781a06fa 100644 Binary files a/docs/static/screenshots/GeoPath/submarine-cables-globe-dark-240w.webp and b/docs/static/screenshots/GeoPath/submarine-cables-globe-dark-240w.webp differ diff --git a/docs/static/screenshots/GeoPath/submarine-cables-globe-dark-400w.webp b/docs/static/screenshots/GeoPath/submarine-cables-globe-dark-400w.webp index c8d309b89a..a859535071 100644 Binary files a/docs/static/screenshots/GeoPath/submarine-cables-globe-dark-400w.webp and b/docs/static/screenshots/GeoPath/submarine-cables-globe-dark-400w.webp differ diff --git a/docs/static/screenshots/GeoPath/submarine-cables-globe-dark-800w.webp b/docs/static/screenshots/GeoPath/submarine-cables-globe-dark-800w.webp index dbe9b4345d..9ed5425a35 100644 Binary files a/docs/static/screenshots/GeoPath/submarine-cables-globe-dark-800w.webp and b/docs/static/screenshots/GeoPath/submarine-cables-globe-dark-800w.webp differ diff --git a/docs/static/screenshots/GeoPath/submarine-cables-globe-light-240w.webp b/docs/static/screenshots/GeoPath/submarine-cables-globe-light-240w.webp index 4b3a853cb4..f3f46a9348 100644 Binary files a/docs/static/screenshots/GeoPath/submarine-cables-globe-light-240w.webp and b/docs/static/screenshots/GeoPath/submarine-cables-globe-light-240w.webp differ diff --git a/docs/static/screenshots/GeoPath/submarine-cables-globe-light-400w.webp b/docs/static/screenshots/GeoPath/submarine-cables-globe-light-400w.webp index d386c4bf60..6b91dfe68b 100644 Binary files a/docs/static/screenshots/GeoPath/submarine-cables-globe-light-400w.webp and b/docs/static/screenshots/GeoPath/submarine-cables-globe-light-400w.webp differ diff --git a/docs/static/screenshots/GeoPath/submarine-cables-globe-light-800w.webp b/docs/static/screenshots/GeoPath/submarine-cables-globe-light-800w.webp index 359778a84c..5acc8cd2b0 100644 Binary files a/docs/static/screenshots/GeoPath/submarine-cables-globe-light-800w.webp and b/docs/static/screenshots/GeoPath/submarine-cables-globe-light-800w.webp differ diff --git a/docs/static/screenshots/GeoPoint/icons-dark-240w.webp b/docs/static/screenshots/GeoPoint/icons-dark-240w.webp index b67fb589f1..deafaa27f2 100644 Binary files a/docs/static/screenshots/GeoPoint/icons-dark-240w.webp and b/docs/static/screenshots/GeoPoint/icons-dark-240w.webp differ diff --git a/docs/static/screenshots/GeoPoint/icons-dark-400w.webp b/docs/static/screenshots/GeoPoint/icons-dark-400w.webp index 2ec7878efb..93ad7d98e5 100644 Binary files a/docs/static/screenshots/GeoPoint/icons-dark-400w.webp and b/docs/static/screenshots/GeoPoint/icons-dark-400w.webp differ diff --git a/docs/static/screenshots/GeoPoint/icons-dark-800w.webp b/docs/static/screenshots/GeoPoint/icons-dark-800w.webp index 0b0d10937f..1b4455d3e7 100644 Binary files a/docs/static/screenshots/GeoPoint/icons-dark-800w.webp and b/docs/static/screenshots/GeoPoint/icons-dark-800w.webp differ diff --git a/docs/static/screenshots/GeoPoint/icons-light-240w.webp b/docs/static/screenshots/GeoPoint/icons-light-240w.webp index a56feeabeb..d06508e2ed 100644 Binary files a/docs/static/screenshots/GeoPoint/icons-light-240w.webp and b/docs/static/screenshots/GeoPoint/icons-light-240w.webp differ diff --git a/docs/static/screenshots/GeoPoint/icons-light-400w.webp b/docs/static/screenshots/GeoPoint/icons-light-400w.webp index a3f4a696fe..5ab8cd6ff5 100644 Binary files a/docs/static/screenshots/GeoPoint/icons-light-400w.webp and b/docs/static/screenshots/GeoPoint/icons-light-400w.webp differ diff --git a/docs/static/screenshots/GeoPoint/icons-light-800w.webp b/docs/static/screenshots/GeoPoint/icons-light-800w.webp index d870121c4b..5bf41f8300 100644 Binary files a/docs/static/screenshots/GeoPoint/icons-light-800w.webp and b/docs/static/screenshots/GeoPoint/icons-light-800w.webp differ diff --git a/docs/static/screenshots/GeoPoint/us-state-capitals-dark-240w.webp b/docs/static/screenshots/GeoPoint/us-state-capitals-dark-240w.webp index dfcc107ec3..c34dc02409 100644 Binary files a/docs/static/screenshots/GeoPoint/us-state-capitals-dark-240w.webp and b/docs/static/screenshots/GeoPoint/us-state-capitals-dark-240w.webp differ diff --git a/docs/static/screenshots/GeoPoint/us-state-capitals-dark-400w.webp b/docs/static/screenshots/GeoPoint/us-state-capitals-dark-400w.webp index dc0a97adbe..1b3262d2b8 100644 Binary files a/docs/static/screenshots/GeoPoint/us-state-capitals-dark-400w.webp and b/docs/static/screenshots/GeoPoint/us-state-capitals-dark-400w.webp differ diff --git a/docs/static/screenshots/GeoPoint/us-state-capitals-dark-800w.webp b/docs/static/screenshots/GeoPoint/us-state-capitals-dark-800w.webp index d0a59004c2..c5c9f60aac 100644 Binary files a/docs/static/screenshots/GeoPoint/us-state-capitals-dark-800w.webp and b/docs/static/screenshots/GeoPoint/us-state-capitals-dark-800w.webp differ diff --git a/docs/static/screenshots/GeoPoint/us-state-capitals-light-240w.webp b/docs/static/screenshots/GeoPoint/us-state-capitals-light-240w.webp index becc7ab4a6..4aa23f6bbd 100644 Binary files a/docs/static/screenshots/GeoPoint/us-state-capitals-light-240w.webp and b/docs/static/screenshots/GeoPoint/us-state-capitals-light-240w.webp differ diff --git a/docs/static/screenshots/GeoPoint/us-state-capitals-light-400w.webp b/docs/static/screenshots/GeoPoint/us-state-capitals-light-400w.webp index 373dae89c3..9af0d7eff2 100644 Binary files a/docs/static/screenshots/GeoPoint/us-state-capitals-light-400w.webp and b/docs/static/screenshots/GeoPoint/us-state-capitals-light-400w.webp differ diff --git a/docs/static/screenshots/GeoPoint/us-state-capitals-light-800w.webp b/docs/static/screenshots/GeoPoint/us-state-capitals-light-800w.webp index ee52be12ce..eaea46214e 100644 Binary files a/docs/static/screenshots/GeoPoint/us-state-capitals-light-800w.webp and b/docs/static/screenshots/GeoPoint/us-state-capitals-light-800w.webp differ diff --git a/docs/static/screenshots/GeoProjection/geojson-preview-dark-240w.webp b/docs/static/screenshots/GeoProjection/geojson-preview-dark-240w.webp index d23c8bf4f2..3138e0d450 100644 Binary files a/docs/static/screenshots/GeoProjection/geojson-preview-dark-240w.webp and b/docs/static/screenshots/GeoProjection/geojson-preview-dark-240w.webp differ diff --git a/docs/static/screenshots/GeoProjection/geojson-preview-dark-400w.webp b/docs/static/screenshots/GeoProjection/geojson-preview-dark-400w.webp index 5fcd889131..0293da0b15 100644 Binary files a/docs/static/screenshots/GeoProjection/geojson-preview-dark-400w.webp and b/docs/static/screenshots/GeoProjection/geojson-preview-dark-400w.webp differ diff --git a/docs/static/screenshots/GeoProjection/geojson-preview-dark-800w.webp b/docs/static/screenshots/GeoProjection/geojson-preview-dark-800w.webp index 41a02f17e1..619f1829b7 100644 Binary files a/docs/static/screenshots/GeoProjection/geojson-preview-dark-800w.webp and b/docs/static/screenshots/GeoProjection/geojson-preview-dark-800w.webp differ diff --git a/docs/static/screenshots/GeoProjection/geojson-preview-light-240w.webp b/docs/static/screenshots/GeoProjection/geojson-preview-light-240w.webp index d1655a83e1..656bb4d7de 100644 Binary files a/docs/static/screenshots/GeoProjection/geojson-preview-light-240w.webp and b/docs/static/screenshots/GeoProjection/geojson-preview-light-240w.webp differ diff --git a/docs/static/screenshots/GeoProjection/geojson-preview-light-400w.webp b/docs/static/screenshots/GeoProjection/geojson-preview-light-400w.webp index fdbe9b61d2..a1f5bec75e 100644 Binary files a/docs/static/screenshots/GeoProjection/geojson-preview-light-400w.webp and b/docs/static/screenshots/GeoProjection/geojson-preview-light-400w.webp differ diff --git a/docs/static/screenshots/GeoProjection/geojson-preview-light-800w.webp b/docs/static/screenshots/GeoProjection/geojson-preview-light-800w.webp index 2d98c39513..5cb17c2b30 100644 Binary files a/docs/static/screenshots/GeoProjection/geojson-preview-light-800w.webp and b/docs/static/screenshots/GeoProjection/geojson-preview-light-800w.webp differ diff --git a/docs/static/screenshots/GeoProjection/shapefile-preview-dark-240w.webp b/docs/static/screenshots/GeoProjection/shapefile-preview-dark-240w.webp index f9ef7c3d55..f5639a5f5b 100644 Binary files a/docs/static/screenshots/GeoProjection/shapefile-preview-dark-240w.webp and b/docs/static/screenshots/GeoProjection/shapefile-preview-dark-240w.webp differ diff --git a/docs/static/screenshots/GeoProjection/shapefile-preview-dark-400w.webp b/docs/static/screenshots/GeoProjection/shapefile-preview-dark-400w.webp index b1f4732321..5a74855ba3 100644 Binary files a/docs/static/screenshots/GeoProjection/shapefile-preview-dark-400w.webp and b/docs/static/screenshots/GeoProjection/shapefile-preview-dark-400w.webp differ diff --git a/docs/static/screenshots/GeoProjection/shapefile-preview-dark-800w.webp b/docs/static/screenshots/GeoProjection/shapefile-preview-dark-800w.webp index 538fca678f..d08a15c7e9 100644 Binary files a/docs/static/screenshots/GeoProjection/shapefile-preview-dark-800w.webp and b/docs/static/screenshots/GeoProjection/shapefile-preview-dark-800w.webp differ diff --git a/docs/static/screenshots/GeoProjection/shapefile-preview-light-400w.webp b/docs/static/screenshots/GeoProjection/shapefile-preview-light-400w.webp index a0e729e1df..16f67243cc 100644 Binary files a/docs/static/screenshots/GeoProjection/shapefile-preview-light-400w.webp and b/docs/static/screenshots/GeoProjection/shapefile-preview-light-400w.webp differ diff --git a/docs/static/screenshots/GeoProjection/topojson-preview-dark-240w.webp b/docs/static/screenshots/GeoProjection/topojson-preview-dark-240w.webp index 76908df83f..49586c39aa 100644 Binary files a/docs/static/screenshots/GeoProjection/topojson-preview-dark-240w.webp and b/docs/static/screenshots/GeoProjection/topojson-preview-dark-240w.webp differ diff --git a/docs/static/screenshots/GeoProjection/topojson-preview-dark-400w.webp b/docs/static/screenshots/GeoProjection/topojson-preview-dark-400w.webp index 1811398331..1f2eadc90d 100644 Binary files a/docs/static/screenshots/GeoProjection/topojson-preview-dark-400w.webp and b/docs/static/screenshots/GeoProjection/topojson-preview-dark-400w.webp differ diff --git a/docs/static/screenshots/GeoProjection/topojson-preview-dark-800w.webp b/docs/static/screenshots/GeoProjection/topojson-preview-dark-800w.webp index f76717186a..e997eca3fe 100644 Binary files a/docs/static/screenshots/GeoProjection/topojson-preview-dark-800w.webp and b/docs/static/screenshots/GeoProjection/topojson-preview-dark-800w.webp differ diff --git a/docs/static/screenshots/GeoProjection/topojson-preview-light-240w.webp b/docs/static/screenshots/GeoProjection/topojson-preview-light-240w.webp index 0b385ce3b0..ed087113fd 100644 Binary files a/docs/static/screenshots/GeoProjection/topojson-preview-light-240w.webp and b/docs/static/screenshots/GeoProjection/topojson-preview-light-240w.webp differ diff --git a/docs/static/screenshots/GeoProjection/topojson-preview-light-400w.webp b/docs/static/screenshots/GeoProjection/topojson-preview-light-400w.webp index a664b83f39..84af833fc1 100644 Binary files a/docs/static/screenshots/GeoProjection/topojson-preview-light-400w.webp and b/docs/static/screenshots/GeoProjection/topojson-preview-light-400w.webp differ diff --git a/docs/static/screenshots/GeoProjection/topojson-preview-light-800w.webp b/docs/static/screenshots/GeoProjection/topojson-preview-light-800w.webp index 42aeca4ed9..970f3e0f81 100644 Binary files a/docs/static/screenshots/GeoProjection/topojson-preview-light-800w.webp and b/docs/static/screenshots/GeoProjection/topojson-preview-light-800w.webp differ diff --git a/docs/static/screenshots/GeoProjection/true-size-globe-dark-800w.webp b/docs/static/screenshots/GeoProjection/true-size-globe-dark-800w.webp index dd16e56a9c..c616b66166 100644 Binary files a/docs/static/screenshots/GeoProjection/true-size-globe-dark-800w.webp and b/docs/static/screenshots/GeoProjection/true-size-globe-dark-800w.webp differ diff --git a/docs/static/screenshots/GeoProjection/true-size-globe-light-800w.webp b/docs/static/screenshots/GeoProjection/true-size-globe-light-800w.webp index d738877006..54955cf0fc 100644 Binary files a/docs/static/screenshots/GeoProjection/true-size-globe-light-800w.webp and b/docs/static/screenshots/GeoProjection/true-size-globe-light-800w.webp differ diff --git a/docs/static/screenshots/GeoRaster/tiles-globe-dark-400w.webp b/docs/static/screenshots/GeoRaster/tiles-globe-dark-400w.webp index 06a57ea22e..baafce1b31 100644 Binary files a/docs/static/screenshots/GeoRaster/tiles-globe-dark-400w.webp and b/docs/static/screenshots/GeoRaster/tiles-globe-dark-400w.webp differ diff --git a/docs/static/screenshots/GeoRaster/tiles-globe-dark-800w.webp b/docs/static/screenshots/GeoRaster/tiles-globe-dark-800w.webp index 78bc36b8a5..b9af688f32 100644 Binary files a/docs/static/screenshots/GeoRaster/tiles-globe-dark-800w.webp and b/docs/static/screenshots/GeoRaster/tiles-globe-dark-800w.webp differ diff --git a/docs/static/screenshots/GeoRaster/tiles-globe-light-240w.webp b/docs/static/screenshots/GeoRaster/tiles-globe-light-240w.webp index 72d7e476a2..bb4f9a4962 100644 Binary files a/docs/static/screenshots/GeoRaster/tiles-globe-light-240w.webp and b/docs/static/screenshots/GeoRaster/tiles-globe-light-240w.webp differ diff --git a/docs/static/screenshots/GeoRaster/tiles-globe-light-400w.webp b/docs/static/screenshots/GeoRaster/tiles-globe-light-400w.webp index 6d1ed10b4a..3003fc8c7a 100644 Binary files a/docs/static/screenshots/GeoRaster/tiles-globe-light-400w.webp and b/docs/static/screenshots/GeoRaster/tiles-globe-light-400w.webp differ diff --git a/docs/static/screenshots/GeoRaster/tiles-globe-light-800w.webp b/docs/static/screenshots/GeoRaster/tiles-globe-light-800w.webp index 20b6181f4f..6b2b17bcbb 100644 Binary files a/docs/static/screenshots/GeoRaster/tiles-globe-light-800w.webp and b/docs/static/screenshots/GeoRaster/tiles-globe-light-800w.webp differ diff --git a/docs/static/screenshots/GeoTile/basic-dark-240w.webp b/docs/static/screenshots/GeoTile/basic-dark-240w.webp index a2da705f88..85f8771c9f 100644 Binary files a/docs/static/screenshots/GeoTile/basic-dark-240w.webp and b/docs/static/screenshots/GeoTile/basic-dark-240w.webp differ diff --git a/docs/static/screenshots/GeoTile/basic-dark-400w.webp b/docs/static/screenshots/GeoTile/basic-dark-400w.webp index 600e20850b..d89dacd30c 100644 Binary files a/docs/static/screenshots/GeoTile/basic-dark-400w.webp and b/docs/static/screenshots/GeoTile/basic-dark-400w.webp differ diff --git a/docs/static/screenshots/GeoTile/basic-dark-800w.webp b/docs/static/screenshots/GeoTile/basic-dark-800w.webp index 77181c4579..fd7acdc93e 100644 Binary files a/docs/static/screenshots/GeoTile/basic-dark-800w.webp and b/docs/static/screenshots/GeoTile/basic-dark-800w.webp differ diff --git a/docs/static/screenshots/GeoTile/basic-light-240w.webp b/docs/static/screenshots/GeoTile/basic-light-240w.webp index a2da705f88..85f8771c9f 100644 Binary files a/docs/static/screenshots/GeoTile/basic-light-240w.webp and b/docs/static/screenshots/GeoTile/basic-light-240w.webp differ diff --git a/docs/static/screenshots/GeoTile/basic-light-400w.webp b/docs/static/screenshots/GeoTile/basic-light-400w.webp index 600e20850b..d89dacd30c 100644 Binary files a/docs/static/screenshots/GeoTile/basic-light-400w.webp and b/docs/static/screenshots/GeoTile/basic-light-400w.webp differ diff --git a/docs/static/screenshots/GeoTile/basic-light-800w.webp b/docs/static/screenshots/GeoTile/basic-light-800w.webp index 77181c4579..fd7acdc93e 100644 Binary files a/docs/static/screenshots/GeoTile/basic-light-800w.webp and b/docs/static/screenshots/GeoTile/basic-light-800w.webp differ diff --git a/docs/static/screenshots/GeoTile/clipped-dark-240w.webp b/docs/static/screenshots/GeoTile/clipped-dark-240w.webp index a28f23e7d9..0e584cd02f 100644 Binary files a/docs/static/screenshots/GeoTile/clipped-dark-240w.webp and b/docs/static/screenshots/GeoTile/clipped-dark-240w.webp differ diff --git a/docs/static/screenshots/GeoTile/clipped-dark-400w.webp b/docs/static/screenshots/GeoTile/clipped-dark-400w.webp index 821166cb73..3ba606a08d 100644 Binary files a/docs/static/screenshots/GeoTile/clipped-dark-400w.webp and b/docs/static/screenshots/GeoTile/clipped-dark-400w.webp differ diff --git a/docs/static/screenshots/GeoTile/clipped-dark-800w.webp b/docs/static/screenshots/GeoTile/clipped-dark-800w.webp index 04683cab39..79138ac84f 100644 Binary files a/docs/static/screenshots/GeoTile/clipped-dark-800w.webp and b/docs/static/screenshots/GeoTile/clipped-dark-800w.webp differ diff --git a/docs/static/screenshots/GeoTile/clipped-light-240w.webp b/docs/static/screenshots/GeoTile/clipped-light-240w.webp index a28f23e7d9..0e584cd02f 100644 Binary files a/docs/static/screenshots/GeoTile/clipped-light-240w.webp and b/docs/static/screenshots/GeoTile/clipped-light-240w.webp differ diff --git a/docs/static/screenshots/GeoTile/clipped-light-400w.webp b/docs/static/screenshots/GeoTile/clipped-light-400w.webp index 821166cb73..3ba606a08d 100644 Binary files a/docs/static/screenshots/GeoTile/clipped-light-400w.webp and b/docs/static/screenshots/GeoTile/clipped-light-400w.webp differ diff --git a/docs/static/screenshots/GeoTile/clipped-light-800w.webp b/docs/static/screenshots/GeoTile/clipped-light-800w.webp index 04683cab39..79138ac84f 100644 Binary files a/docs/static/screenshots/GeoTile/clipped-light-800w.webp and b/docs/static/screenshots/GeoTile/clipped-light-800w.webp differ diff --git a/docs/static/screenshots/GeoTile/zoomable-dark-240w.webp b/docs/static/screenshots/GeoTile/zoomable-dark-240w.webp index 433c1c2ad5..bdc194cc7d 100644 Binary files a/docs/static/screenshots/GeoTile/zoomable-dark-240w.webp and b/docs/static/screenshots/GeoTile/zoomable-dark-240w.webp differ diff --git a/docs/static/screenshots/GeoTile/zoomable-dark-400w.webp b/docs/static/screenshots/GeoTile/zoomable-dark-400w.webp index 66421c9d87..ce3bf84f22 100644 Binary files a/docs/static/screenshots/GeoTile/zoomable-dark-400w.webp and b/docs/static/screenshots/GeoTile/zoomable-dark-400w.webp differ diff --git a/docs/static/screenshots/GeoTile/zoomable-dark-800w.webp b/docs/static/screenshots/GeoTile/zoomable-dark-800w.webp index b514bed596..c4d3cddf1e 100644 Binary files a/docs/static/screenshots/GeoTile/zoomable-dark-800w.webp and b/docs/static/screenshots/GeoTile/zoomable-dark-800w.webp differ diff --git a/docs/static/screenshots/GeoTile/zoomable-light-240w.webp b/docs/static/screenshots/GeoTile/zoomable-light-240w.webp index 433c1c2ad5..bdc194cc7d 100644 Binary files a/docs/static/screenshots/GeoTile/zoomable-light-240w.webp and b/docs/static/screenshots/GeoTile/zoomable-light-240w.webp differ diff --git a/docs/static/screenshots/GeoTile/zoomable-light-400w.webp b/docs/static/screenshots/GeoTile/zoomable-light-400w.webp index 66421c9d87..ce3bf84f22 100644 Binary files a/docs/static/screenshots/GeoTile/zoomable-light-400w.webp and b/docs/static/screenshots/GeoTile/zoomable-light-400w.webp differ diff --git a/docs/static/screenshots/GeoTile/zoomable-light-800w.webp b/docs/static/screenshots/GeoTile/zoomable-light-800w.webp index b514bed596..c4d3cddf1e 100644 Binary files a/docs/static/screenshots/GeoTile/zoomable-light-800w.webp and b/docs/static/screenshots/GeoTile/zoomable-light-800w.webp differ diff --git a/docs/static/screenshots/GeoTile/zoomable-seamless-layers-dark-240w.webp b/docs/static/screenshots/GeoTile/zoomable-seamless-layers-dark-240w.webp index 433c1c2ad5..bdc194cc7d 100644 Binary files a/docs/static/screenshots/GeoTile/zoomable-seamless-layers-dark-240w.webp and b/docs/static/screenshots/GeoTile/zoomable-seamless-layers-dark-240w.webp differ diff --git a/docs/static/screenshots/GeoTile/zoomable-seamless-layers-dark-400w.webp b/docs/static/screenshots/GeoTile/zoomable-seamless-layers-dark-400w.webp index 66421c9d87..ce3bf84f22 100644 Binary files a/docs/static/screenshots/GeoTile/zoomable-seamless-layers-dark-400w.webp and b/docs/static/screenshots/GeoTile/zoomable-seamless-layers-dark-400w.webp differ diff --git a/docs/static/screenshots/GeoTile/zoomable-seamless-layers-dark-800w.webp b/docs/static/screenshots/GeoTile/zoomable-seamless-layers-dark-800w.webp index b514bed596..c4d3cddf1e 100644 Binary files a/docs/static/screenshots/GeoTile/zoomable-seamless-layers-dark-800w.webp and b/docs/static/screenshots/GeoTile/zoomable-seamless-layers-dark-800w.webp differ diff --git a/docs/static/screenshots/GeoTile/zoomable-seamless-layers-light-240w.webp b/docs/static/screenshots/GeoTile/zoomable-seamless-layers-light-240w.webp index 433c1c2ad5..bdc194cc7d 100644 Binary files a/docs/static/screenshots/GeoTile/zoomable-seamless-layers-light-240w.webp and b/docs/static/screenshots/GeoTile/zoomable-seamless-layers-light-240w.webp differ diff --git a/docs/static/screenshots/GeoTile/zoomable-seamless-layers-light-400w.webp b/docs/static/screenshots/GeoTile/zoomable-seamless-layers-light-400w.webp index 66421c9d87..ce3bf84f22 100644 Binary files a/docs/static/screenshots/GeoTile/zoomable-seamless-layers-light-400w.webp and b/docs/static/screenshots/GeoTile/zoomable-seamless-layers-light-400w.webp differ diff --git a/docs/static/screenshots/GeoTile/zoomable-seamless-layers-light-800w.webp b/docs/static/screenshots/GeoTile/zoomable-seamless-layers-light-800w.webp index b514bed596..c4d3cddf1e 100644 Binary files a/docs/static/screenshots/GeoTile/zoomable-seamless-layers-light-800w.webp and b/docs/static/screenshots/GeoTile/zoomable-seamless-layers-light-800w.webp differ diff --git a/docs/static/screenshots/GeoTile/zoomable-with-padding-dark-240w.webp b/docs/static/screenshots/GeoTile/zoomable-with-padding-dark-240w.webp index ba723f5e7f..e0b173d282 100644 Binary files a/docs/static/screenshots/GeoTile/zoomable-with-padding-dark-240w.webp and b/docs/static/screenshots/GeoTile/zoomable-with-padding-dark-240w.webp differ diff --git a/docs/static/screenshots/GeoTile/zoomable-with-padding-dark-400w.webp b/docs/static/screenshots/GeoTile/zoomable-with-padding-dark-400w.webp index 8ccd46ebde..5eedcc84c5 100644 Binary files a/docs/static/screenshots/GeoTile/zoomable-with-padding-dark-400w.webp and b/docs/static/screenshots/GeoTile/zoomable-with-padding-dark-400w.webp differ diff --git a/docs/static/screenshots/GeoTile/zoomable-with-padding-dark-800w.webp b/docs/static/screenshots/GeoTile/zoomable-with-padding-dark-800w.webp index c3bf547702..9b8326cd8a 100644 Binary files a/docs/static/screenshots/GeoTile/zoomable-with-padding-dark-800w.webp and b/docs/static/screenshots/GeoTile/zoomable-with-padding-dark-800w.webp differ diff --git a/docs/static/screenshots/GeoTile/zoomable-with-padding-light-240w.webp b/docs/static/screenshots/GeoTile/zoomable-with-padding-light-240w.webp index ba723f5e7f..e0b173d282 100644 Binary files a/docs/static/screenshots/GeoTile/zoomable-with-padding-light-240w.webp and b/docs/static/screenshots/GeoTile/zoomable-with-padding-light-240w.webp differ diff --git a/docs/static/screenshots/GeoTile/zoomable-with-padding-light-400w.webp b/docs/static/screenshots/GeoTile/zoomable-with-padding-light-400w.webp index 8ccd46ebde..5eedcc84c5 100644 Binary files a/docs/static/screenshots/GeoTile/zoomable-with-padding-light-400w.webp and b/docs/static/screenshots/GeoTile/zoomable-with-padding-light-400w.webp differ diff --git a/docs/static/screenshots/GeoTile/zoomable-with-padding-light-800w.webp b/docs/static/screenshots/GeoTile/zoomable-with-padding-light-800w.webp index c3bf547702..9b8326cd8a 100644 Binary files a/docs/static/screenshots/GeoTile/zoomable-with-padding-light-800w.webp and b/docs/static/screenshots/GeoTile/zoomable-with-padding-light-800w.webp differ diff --git a/docs/static/screenshots/Grid/band-scale-between-dark-800w.webp b/docs/static/screenshots/Grid/band-scale-between-dark-800w.webp index 02d429e52f..ba3b246107 100644 Binary files a/docs/static/screenshots/Grid/band-scale-between-dark-800w.webp and b/docs/static/screenshots/Grid/band-scale-between-dark-800w.webp differ diff --git a/docs/static/screenshots/Grid/band-scale-default-dark-800w.webp b/docs/static/screenshots/Grid/band-scale-default-dark-800w.webp index ee09bdb88a..954f0665cd 100644 Binary files a/docs/static/screenshots/Grid/band-scale-default-dark-800w.webp and b/docs/static/screenshots/Grid/band-scale-default-dark-800w.webp differ diff --git a/docs/static/screenshots/Group/basic-dark-400w.webp b/docs/static/screenshots/Group/basic-dark-400w.webp index 33979ce0cb..648a3a9af5 100644 Binary files a/docs/static/screenshots/Group/basic-dark-400w.webp and b/docs/static/screenshots/Group/basic-dark-400w.webp differ diff --git a/docs/static/screenshots/Group/basic-dark-800w.webp b/docs/static/screenshots/Group/basic-dark-800w.webp index 28141a15ae..9f82c7f473 100644 Binary files a/docs/static/screenshots/Group/basic-dark-800w.webp and b/docs/static/screenshots/Group/basic-dark-800w.webp differ diff --git a/docs/static/screenshots/Group/basic-light-400w.webp b/docs/static/screenshots/Group/basic-light-400w.webp index 187a63c344..f2414482ff 100644 Binary files a/docs/static/screenshots/Group/basic-light-400w.webp and b/docs/static/screenshots/Group/basic-light-400w.webp differ diff --git a/docs/static/screenshots/Group/basic-light-800w.webp b/docs/static/screenshots/Group/basic-light-800w.webp index 76e3cdb461..0785819dec 100644 Binary files a/docs/static/screenshots/Group/basic-light-800w.webp and b/docs/static/screenshots/Group/basic-light-800w.webp differ diff --git a/docs/static/screenshots/Group/data-mode-light-400w.webp b/docs/static/screenshots/Group/data-mode-light-400w.webp index fd044091a0..3046fa497a 100644 Binary files a/docs/static/screenshots/Group/data-mode-light-400w.webp and b/docs/static/screenshots/Group/data-mode-light-400w.webp differ diff --git a/docs/static/screenshots/Group/data-mode-light-800w.webp b/docs/static/screenshots/Group/data-mode-light-800w.webp index 5564626194..cb2580988d 100644 Binary files a/docs/static/screenshots/Group/data-mode-light-800w.webp and b/docs/static/screenshots/Group/data-mode-light-800w.webp differ diff --git a/docs/static/screenshots/Hull/geo-dark-240w.webp b/docs/static/screenshots/Hull/geo-dark-240w.webp index 5b27b23051..ba1a4a5bb9 100644 Binary files a/docs/static/screenshots/Hull/geo-dark-240w.webp and b/docs/static/screenshots/Hull/geo-dark-240w.webp differ diff --git a/docs/static/screenshots/Hull/geo-dark-800w.webp b/docs/static/screenshots/Hull/geo-dark-800w.webp index c7ac0ddc3f..e7f5670c71 100644 Binary files a/docs/static/screenshots/Hull/geo-dark-800w.webp and b/docs/static/screenshots/Hull/geo-dark-800w.webp differ diff --git a/docs/static/screenshots/Hull/geo-light-240w.webp b/docs/static/screenshots/Hull/geo-light-240w.webp index 1087f1ef5f..d9a620d102 100644 Binary files a/docs/static/screenshots/Hull/geo-light-240w.webp and b/docs/static/screenshots/Hull/geo-light-240w.webp differ diff --git a/docs/static/screenshots/Hull/geo-light-400w.webp b/docs/static/screenshots/Hull/geo-light-400w.webp index cde62b02d6..a24b10f798 100644 Binary files a/docs/static/screenshots/Hull/geo-light-400w.webp and b/docs/static/screenshots/Hull/geo-light-400w.webp differ diff --git a/docs/static/screenshots/Hull/geo-light-800w.webp b/docs/static/screenshots/Hull/geo-light-800w.webp index 7262fa3780..b77f44d3bc 100644 Binary files a/docs/static/screenshots/Hull/geo-light-800w.webp and b/docs/static/screenshots/Hull/geo-light-800w.webp differ diff --git a/docs/static/screenshots/Image/country-flags-dark-240w.webp b/docs/static/screenshots/Image/country-flags-dark-240w.webp index 8136fc87d3..e65637a713 100644 Binary files a/docs/static/screenshots/Image/country-flags-dark-240w.webp and b/docs/static/screenshots/Image/country-flags-dark-240w.webp differ diff --git a/docs/static/screenshots/Image/country-flags-dark-400w.webp b/docs/static/screenshots/Image/country-flags-dark-400w.webp index 012ac1fedf..3edcbf1092 100644 Binary files a/docs/static/screenshots/Image/country-flags-dark-400w.webp and b/docs/static/screenshots/Image/country-flags-dark-400w.webp differ diff --git a/docs/static/screenshots/Image/country-flags-dark-800w.webp b/docs/static/screenshots/Image/country-flags-dark-800w.webp index 365d65284d..5d26876a21 100644 Binary files a/docs/static/screenshots/Image/country-flags-dark-800w.webp and b/docs/static/screenshots/Image/country-flags-dark-800w.webp differ diff --git a/docs/static/screenshots/Image/country-flags-light-400w.webp b/docs/static/screenshots/Image/country-flags-light-400w.webp index 0d8504443d..5126c13aee 100644 Binary files a/docs/static/screenshots/Image/country-flags-light-400w.webp and b/docs/static/screenshots/Image/country-flags-light-400w.webp differ diff --git a/docs/static/screenshots/Image/country-flags-light-800w.webp b/docs/static/screenshots/Image/country-flags-light-800w.webp index 3732f04d48..48cc73d7eb 100644 Binary files a/docs/static/screenshots/Image/country-flags-light-800w.webp and b/docs/static/screenshots/Image/country-flags-light-800w.webp differ diff --git a/docs/static/screenshots/Image/planets-light-240w.webp b/docs/static/screenshots/Image/planets-light-240w.webp index 954fc87f84..9d285f1acc 100644 Binary files a/docs/static/screenshots/Image/planets-light-240w.webp and b/docs/static/screenshots/Image/planets-light-240w.webp differ diff --git a/docs/static/screenshots/Image/planets-light-800w.webp b/docs/static/screenshots/Image/planets-light-800w.webp index 103cb2f6cc..d8b6ce9cda 100644 Binary files a/docs/static/screenshots/Image/planets-light-800w.webp and b/docs/static/screenshots/Image/planets-light-800w.webp differ diff --git a/docs/static/screenshots/Image/sports-logos-dark-240w.webp b/docs/static/screenshots/Image/sports-logos-dark-240w.webp index d4abc424fe..7dbe1ef80e 100644 Binary files a/docs/static/screenshots/Image/sports-logos-dark-240w.webp and b/docs/static/screenshots/Image/sports-logos-dark-240w.webp differ diff --git a/docs/static/screenshots/Image/sports-logos-dark-400w.webp b/docs/static/screenshots/Image/sports-logos-dark-400w.webp index beb6278a28..7c151a1427 100644 Binary files a/docs/static/screenshots/Image/sports-logos-dark-400w.webp and b/docs/static/screenshots/Image/sports-logos-dark-400w.webp differ diff --git a/docs/static/screenshots/Image/sports-logos-dark-800w.webp b/docs/static/screenshots/Image/sports-logos-dark-800w.webp index 23f60d545b..6cfbf53fc4 100644 Binary files a/docs/static/screenshots/Image/sports-logos-dark-800w.webp and b/docs/static/screenshots/Image/sports-logos-dark-800w.webp differ diff --git a/docs/static/screenshots/Image/sports-logos-light-400w.webp b/docs/static/screenshots/Image/sports-logos-light-400w.webp index 1be6224f66..aa64567224 100644 Binary files a/docs/static/screenshots/Image/sports-logos-light-400w.webp and b/docs/static/screenshots/Image/sports-logos-light-400w.webp differ diff --git a/docs/static/screenshots/Image/sports-logos-light-800w.webp b/docs/static/screenshots/Image/sports-logos-light-800w.webp index 5efcba6fd4..b59097192a 100644 Binary files a/docs/static/screenshots/Image/sports-logos-light-800w.webp and b/docs/static/screenshots/Image/sports-logos-light-800w.webp differ diff --git a/docs/static/screenshots/Image/us-presidents-dark-240w.webp b/docs/static/screenshots/Image/us-presidents-dark-240w.webp index cf759ba386..6a049b595b 100644 Binary files a/docs/static/screenshots/Image/us-presidents-dark-240w.webp and b/docs/static/screenshots/Image/us-presidents-dark-240w.webp differ diff --git a/docs/static/screenshots/Image/us-presidents-dark-400w.webp b/docs/static/screenshots/Image/us-presidents-dark-400w.webp index a2efc26e59..54e3b402da 100644 Binary files a/docs/static/screenshots/Image/us-presidents-dark-400w.webp and b/docs/static/screenshots/Image/us-presidents-dark-400w.webp differ diff --git a/docs/static/screenshots/Image/us-presidents-dark-800w.webp b/docs/static/screenshots/Image/us-presidents-dark-800w.webp index f13ce6b481..77690d5b4c 100644 Binary files a/docs/static/screenshots/Image/us-presidents-dark-800w.webp and b/docs/static/screenshots/Image/us-presidents-dark-800w.webp differ diff --git a/docs/static/screenshots/Image/us-presidents-light-240w.webp b/docs/static/screenshots/Image/us-presidents-light-240w.webp index 668ff439a3..d40daeabd5 100644 Binary files a/docs/static/screenshots/Image/us-presidents-light-240w.webp and b/docs/static/screenshots/Image/us-presidents-light-240w.webp differ diff --git a/docs/static/screenshots/Image/us-presidents-light-400w.webp b/docs/static/screenshots/Image/us-presidents-light-400w.webp index 8538edc5df..a63bb2966b 100644 Binary files a/docs/static/screenshots/Image/us-presidents-light-400w.webp and b/docs/static/screenshots/Image/us-presidents-light-400w.webp differ diff --git a/docs/static/screenshots/Image/us-presidents-light-800w.webp b/docs/static/screenshots/Image/us-presidents-light-800w.webp index 270738dfbe..a9b1b13074 100644 Binary files a/docs/static/screenshots/Image/us-presidents-light-800w.webp and b/docs/static/screenshots/Image/us-presidents-light-800w.webp differ diff --git a/docs/static/screenshots/Labels/voronoi-dark-240w.webp b/docs/static/screenshots/Labels/voronoi-dark-240w.webp index 5020d14ddd..f87ac5407b 100644 Binary files a/docs/static/screenshots/Labels/voronoi-dark-240w.webp and b/docs/static/screenshots/Labels/voronoi-dark-240w.webp differ diff --git a/docs/static/screenshots/Labels/voronoi-dark-400w.webp b/docs/static/screenshots/Labels/voronoi-dark-400w.webp index 2bf1a65ac5..0dcce293eb 100644 Binary files a/docs/static/screenshots/Labels/voronoi-dark-400w.webp and b/docs/static/screenshots/Labels/voronoi-dark-400w.webp differ diff --git a/docs/static/screenshots/Labels/voronoi-dark-800w.webp b/docs/static/screenshots/Labels/voronoi-dark-800w.webp index 6410683d8c..2b149b05ab 100644 Binary files a/docs/static/screenshots/Labels/voronoi-dark-800w.webp and b/docs/static/screenshots/Labels/voronoi-dark-800w.webp differ diff --git a/docs/static/screenshots/Labels/voronoi-geo-dark-240w.webp b/docs/static/screenshots/Labels/voronoi-geo-dark-240w.webp index f647785495..c28fa767e1 100644 Binary files a/docs/static/screenshots/Labels/voronoi-geo-dark-240w.webp and b/docs/static/screenshots/Labels/voronoi-geo-dark-240w.webp differ diff --git a/docs/static/screenshots/Labels/voronoi-geo-dark-400w.webp b/docs/static/screenshots/Labels/voronoi-geo-dark-400w.webp index 0b6df801e7..6fc40e63e4 100644 Binary files a/docs/static/screenshots/Labels/voronoi-geo-dark-400w.webp and b/docs/static/screenshots/Labels/voronoi-geo-dark-400w.webp differ diff --git a/docs/static/screenshots/Labels/voronoi-geo-dark-800w.webp b/docs/static/screenshots/Labels/voronoi-geo-dark-800w.webp index c54b3d70bf..db6c811ded 100644 Binary files a/docs/static/screenshots/Labels/voronoi-geo-dark-800w.webp and b/docs/static/screenshots/Labels/voronoi-geo-dark-800w.webp differ diff --git a/docs/static/screenshots/Labels/voronoi-geo-light-240w.webp b/docs/static/screenshots/Labels/voronoi-geo-light-240w.webp index ee1159a8de..bbfb1b99b9 100644 Binary files a/docs/static/screenshots/Labels/voronoi-geo-light-240w.webp and b/docs/static/screenshots/Labels/voronoi-geo-light-240w.webp differ diff --git a/docs/static/screenshots/Labels/voronoi-geo-light-400w.webp b/docs/static/screenshots/Labels/voronoi-geo-light-400w.webp index 89052961a0..72835930e6 100644 Binary files a/docs/static/screenshots/Labels/voronoi-geo-light-400w.webp and b/docs/static/screenshots/Labels/voronoi-geo-light-400w.webp differ diff --git a/docs/static/screenshots/Labels/voronoi-geo-light-800w.webp b/docs/static/screenshots/Labels/voronoi-geo-light-800w.webp index 3c8a048730..086d6a88e5 100644 Binary files a/docs/static/screenshots/Labels/voronoi-geo-light-800w.webp and b/docs/static/screenshots/Labels/voronoi-geo-light-800w.webp differ diff --git a/docs/static/screenshots/Labels/voronoi-light-240w.webp b/docs/static/screenshots/Labels/voronoi-light-240w.webp index d503b0b73c..66084b706b 100644 Binary files a/docs/static/screenshots/Labels/voronoi-light-240w.webp and b/docs/static/screenshots/Labels/voronoi-light-240w.webp differ diff --git a/docs/static/screenshots/Labels/voronoi-light-400w.webp b/docs/static/screenshots/Labels/voronoi-light-400w.webp index 2ab4ce610f..d48df574d9 100644 Binary files a/docs/static/screenshots/Labels/voronoi-light-400w.webp and b/docs/static/screenshots/Labels/voronoi-light-400w.webp differ diff --git a/docs/static/screenshots/Labels/voronoi-light-800w.webp b/docs/static/screenshots/Labels/voronoi-light-800w.webp index 99e9a36f98..fac353e86d 100644 Binary files a/docs/static/screenshots/Labels/voronoi-light-800w.webp and b/docs/static/screenshots/Labels/voronoi-light-800w.webp differ diff --git a/docs/static/screenshots/Legend/chart-integration-dark-240w.webp b/docs/static/screenshots/Legend/chart-integration-dark-240w.webp index 2faba59a23..d6290b7773 100644 Binary files a/docs/static/screenshots/Legend/chart-integration-dark-240w.webp and b/docs/static/screenshots/Legend/chart-integration-dark-240w.webp differ diff --git a/docs/static/screenshots/Legend/chart-integration-dark-400w.webp b/docs/static/screenshots/Legend/chart-integration-dark-400w.webp index f287d6956a..a610e54fe3 100644 Binary files a/docs/static/screenshots/Legend/chart-integration-dark-400w.webp and b/docs/static/screenshots/Legend/chart-integration-dark-400w.webp differ diff --git a/docs/static/screenshots/Legend/chart-integration-dark-800w.webp b/docs/static/screenshots/Legend/chart-integration-dark-800w.webp index 3aa51c2c44..c5bd8f82c3 100644 Binary files a/docs/static/screenshots/Legend/chart-integration-dark-800w.webp and b/docs/static/screenshots/Legend/chart-integration-dark-800w.webp differ diff --git a/docs/static/screenshots/Legend/chart-integration-light-240w.webp b/docs/static/screenshots/Legend/chart-integration-light-240w.webp index f56260b169..a343f59a1d 100644 Binary files a/docs/static/screenshots/Legend/chart-integration-light-240w.webp and b/docs/static/screenshots/Legend/chart-integration-light-240w.webp differ diff --git a/docs/static/screenshots/Legend/chart-integration-light-400w.webp b/docs/static/screenshots/Legend/chart-integration-light-400w.webp index 8cb3650776..856e92681a 100644 Binary files a/docs/static/screenshots/Legend/chart-integration-light-400w.webp and b/docs/static/screenshots/Legend/chart-integration-light-400w.webp differ diff --git a/docs/static/screenshots/Legend/chart-integration-light-800w.webp b/docs/static/screenshots/Legend/chart-integration-light-800w.webp index ce54cfdf59..45e8707c06 100644 Binary files a/docs/static/screenshots/Legend/chart-integration-light-800w.webp and b/docs/static/screenshots/Legend/chart-integration-light-800w.webp differ diff --git a/docs/static/screenshots/Legend/chart-placement-dark-240w.webp b/docs/static/screenshots/Legend/chart-placement-dark-240w.webp index 8b1ee719e2..e8db3f416f 100644 Binary files a/docs/static/screenshots/Legend/chart-placement-dark-240w.webp and b/docs/static/screenshots/Legend/chart-placement-dark-240w.webp differ diff --git a/docs/static/screenshots/Legend/chart-placement-dark-400w.webp b/docs/static/screenshots/Legend/chart-placement-dark-400w.webp index 431238cf8e..ed4323c753 100644 Binary files a/docs/static/screenshots/Legend/chart-placement-dark-400w.webp and b/docs/static/screenshots/Legend/chart-placement-dark-400w.webp differ diff --git a/docs/static/screenshots/Legend/chart-placement-dark-800w.webp b/docs/static/screenshots/Legend/chart-placement-dark-800w.webp index 46a362509a..588e4edbc0 100644 Binary files a/docs/static/screenshots/Legend/chart-placement-dark-800w.webp and b/docs/static/screenshots/Legend/chart-placement-dark-800w.webp differ diff --git a/docs/static/screenshots/Legend/chart-placement-light-240w.webp b/docs/static/screenshots/Legend/chart-placement-light-240w.webp index 1402796c0b..8082252d74 100644 Binary files a/docs/static/screenshots/Legend/chart-placement-light-240w.webp and b/docs/static/screenshots/Legend/chart-placement-light-240w.webp differ diff --git a/docs/static/screenshots/Legend/chart-placement-light-400w.webp b/docs/static/screenshots/Legend/chart-placement-light-400w.webp index d141dab857..c115f44191 100644 Binary files a/docs/static/screenshots/Legend/chart-placement-light-400w.webp and b/docs/static/screenshots/Legend/chart-placement-light-400w.webp differ diff --git a/docs/static/screenshots/Legend/chart-placement-light-800w.webp b/docs/static/screenshots/Legend/chart-placement-light-800w.webp index 31491a9c15..ea221b841b 100644 Binary files a/docs/static/screenshots/Legend/chart-placement-light-800w.webp and b/docs/static/screenshots/Legend/chart-placement-light-800w.webp differ diff --git a/docs/static/screenshots/Legend/children-override-dark-240w.webp b/docs/static/screenshots/Legend/children-override-dark-240w.webp index 8bcde7a9c1..9364afeaec 100644 Binary files a/docs/static/screenshots/Legend/children-override-dark-240w.webp and b/docs/static/screenshots/Legend/children-override-dark-240w.webp differ diff --git a/docs/static/screenshots/Legend/children-override-dark-400w.webp b/docs/static/screenshots/Legend/children-override-dark-400w.webp index d8b2e30e1b..d99c5fb54f 100644 Binary files a/docs/static/screenshots/Legend/children-override-dark-400w.webp and b/docs/static/screenshots/Legend/children-override-dark-400w.webp differ diff --git a/docs/static/screenshots/Legend/children-override-dark-800w.webp b/docs/static/screenshots/Legend/children-override-dark-800w.webp index f597a25a6d..caa66673ee 100644 Binary files a/docs/static/screenshots/Legend/children-override-dark-800w.webp and b/docs/static/screenshots/Legend/children-override-dark-800w.webp differ diff --git a/docs/static/screenshots/Legend/children-override-light-240w.webp b/docs/static/screenshots/Legend/children-override-light-240w.webp index 8f6fd02a7f..84cad30146 100644 Binary files a/docs/static/screenshots/Legend/children-override-light-240w.webp and b/docs/static/screenshots/Legend/children-override-light-240w.webp differ diff --git a/docs/static/screenshots/Legend/children-override-light-400w.webp b/docs/static/screenshots/Legend/children-override-light-400w.webp index 52dc230032..b7a25195c4 100644 Binary files a/docs/static/screenshots/Legend/children-override-light-400w.webp and b/docs/static/screenshots/Legend/children-override-light-400w.webp differ diff --git a/docs/static/screenshots/Legend/children-override-light-800w.webp b/docs/static/screenshots/Legend/children-override-light-800w.webp index b644d8dd71..85169ba528 100644 Binary files a/docs/static/screenshots/Legend/children-override-light-800w.webp and b/docs/static/screenshots/Legend/children-override-light-800w.webp differ diff --git a/docs/static/screenshots/Legend/click-handler-dark-240w.webp b/docs/static/screenshots/Legend/click-handler-dark-240w.webp index 59bd278ef1..fd38f5fd68 100644 Binary files a/docs/static/screenshots/Legend/click-handler-dark-240w.webp and b/docs/static/screenshots/Legend/click-handler-dark-240w.webp differ diff --git a/docs/static/screenshots/Legend/click-handler-dark-400w.webp b/docs/static/screenshots/Legend/click-handler-dark-400w.webp index 62ae126875..89b33fe8c2 100644 Binary files a/docs/static/screenshots/Legend/click-handler-dark-400w.webp and b/docs/static/screenshots/Legend/click-handler-dark-400w.webp differ diff --git a/docs/static/screenshots/Legend/click-handler-dark-800w.webp b/docs/static/screenshots/Legend/click-handler-dark-800w.webp index 06303f3360..99042a5d18 100644 Binary files a/docs/static/screenshots/Legend/click-handler-dark-800w.webp and b/docs/static/screenshots/Legend/click-handler-dark-800w.webp differ diff --git a/docs/static/screenshots/Legend/click-handler-light-400w.webp b/docs/static/screenshots/Legend/click-handler-light-400w.webp index d19a5b5d68..4a0233bb3f 100644 Binary files a/docs/static/screenshots/Legend/click-handler-light-400w.webp and b/docs/static/screenshots/Legend/click-handler-light-400w.webp differ diff --git a/docs/static/screenshots/Legend/click-handler-light-800w.webp b/docs/static/screenshots/Legend/click-handler-light-800w.webp index 63499431fb..c59b17c5b3 100644 Binary files a/docs/static/screenshots/Legend/click-handler-light-800w.webp and b/docs/static/screenshots/Legend/click-handler-light-800w.webp differ diff --git a/docs/static/screenshots/Legend/diverging-dark-240w.webp b/docs/static/screenshots/Legend/diverging-dark-240w.webp index 2ce0eec55f..88d2b04ca0 100644 Binary files a/docs/static/screenshots/Legend/diverging-dark-240w.webp and b/docs/static/screenshots/Legend/diverging-dark-240w.webp differ diff --git a/docs/static/screenshots/Legend/diverging-dark-400w.webp b/docs/static/screenshots/Legend/diverging-dark-400w.webp index dfe2d8a69f..43622fe7ec 100644 Binary files a/docs/static/screenshots/Legend/diverging-dark-400w.webp and b/docs/static/screenshots/Legend/diverging-dark-400w.webp differ diff --git a/docs/static/screenshots/Legend/diverging-dark-800w.webp b/docs/static/screenshots/Legend/diverging-dark-800w.webp index 94de019560..d4696ed7b7 100644 Binary files a/docs/static/screenshots/Legend/diverging-dark-800w.webp and b/docs/static/screenshots/Legend/diverging-dark-800w.webp differ diff --git a/docs/static/screenshots/Legend/diverging-light-240w.webp b/docs/static/screenshots/Legend/diverging-light-240w.webp index 67e0a10a07..ed761efb0c 100644 Binary files a/docs/static/screenshots/Legend/diverging-light-240w.webp and b/docs/static/screenshots/Legend/diverging-light-240w.webp differ diff --git a/docs/static/screenshots/Legend/diverging-light-800w.webp b/docs/static/screenshots/Legend/diverging-light-800w.webp index c8c1b57644..27735321f4 100644 Binary files a/docs/static/screenshots/Legend/diverging-light-800w.webp and b/docs/static/screenshots/Legend/diverging-light-800w.webp differ diff --git a/docs/static/screenshots/Legend/diverging-sqrt-dark-240w.webp b/docs/static/screenshots/Legend/diverging-sqrt-dark-240w.webp index e803d41c90..5e4d84bdeb 100644 Binary files a/docs/static/screenshots/Legend/diverging-sqrt-dark-240w.webp and b/docs/static/screenshots/Legend/diverging-sqrt-dark-240w.webp differ diff --git a/docs/static/screenshots/Legend/diverging-sqrt-dark-400w.webp b/docs/static/screenshots/Legend/diverging-sqrt-dark-400w.webp index f842cd64c2..03479cd224 100644 Binary files a/docs/static/screenshots/Legend/diverging-sqrt-dark-400w.webp and b/docs/static/screenshots/Legend/diverging-sqrt-dark-400w.webp differ diff --git a/docs/static/screenshots/Legend/diverging-sqrt-dark-800w.webp b/docs/static/screenshots/Legend/diverging-sqrt-dark-800w.webp index 491cbe88ab..4f52c32658 100644 Binary files a/docs/static/screenshots/Legend/diverging-sqrt-dark-800w.webp and b/docs/static/screenshots/Legend/diverging-sqrt-dark-800w.webp differ diff --git a/docs/static/screenshots/Legend/diverging-sqrt-light-400w.webp b/docs/static/screenshots/Legend/diverging-sqrt-light-400w.webp index 2f50ed0aeb..5768478979 100644 Binary files a/docs/static/screenshots/Legend/diverging-sqrt-light-400w.webp and b/docs/static/screenshots/Legend/diverging-sqrt-light-400w.webp differ diff --git a/docs/static/screenshots/Legend/diverging-sqrt-light-800w.webp b/docs/static/screenshots/Legend/diverging-sqrt-light-800w.webp index 1c30ce9126..e334dcb92b 100644 Binary files a/docs/static/screenshots/Legend/diverging-sqrt-light-800w.webp and b/docs/static/screenshots/Legend/diverging-sqrt-light-800w.webp differ diff --git a/docs/static/screenshots/Legend/ordinal-dark-240w.webp b/docs/static/screenshots/Legend/ordinal-dark-240w.webp index 2326d0a7a1..7d4c0c0dd9 100644 Binary files a/docs/static/screenshots/Legend/ordinal-dark-240w.webp and b/docs/static/screenshots/Legend/ordinal-dark-240w.webp differ diff --git a/docs/static/screenshots/Legend/ordinal-dark-400w.webp b/docs/static/screenshots/Legend/ordinal-dark-400w.webp index 31db9b7583..1e733342aa 100644 Binary files a/docs/static/screenshots/Legend/ordinal-dark-400w.webp and b/docs/static/screenshots/Legend/ordinal-dark-400w.webp differ diff --git a/docs/static/screenshots/Legend/ordinal-dark-800w.webp b/docs/static/screenshots/Legend/ordinal-dark-800w.webp index bfb33ceaa0..414fb5099d 100644 Binary files a/docs/static/screenshots/Legend/ordinal-dark-800w.webp and b/docs/static/screenshots/Legend/ordinal-dark-800w.webp differ diff --git a/docs/static/screenshots/Legend/ordinal-light-240w.webp b/docs/static/screenshots/Legend/ordinal-light-240w.webp index 364f714bbe..a6ecb4bff6 100644 Binary files a/docs/static/screenshots/Legend/ordinal-light-240w.webp and b/docs/static/screenshots/Legend/ordinal-light-240w.webp differ diff --git a/docs/static/screenshots/Legend/ordinal-light-400w.webp b/docs/static/screenshots/Legend/ordinal-light-400w.webp index 4470e4b6a6..e2b8ae8860 100644 Binary files a/docs/static/screenshots/Legend/ordinal-light-400w.webp and b/docs/static/screenshots/Legend/ordinal-light-400w.webp differ diff --git a/docs/static/screenshots/Legend/ordinal-light-800w.webp b/docs/static/screenshots/Legend/ordinal-light-800w.webp index 64848522c2..1b13ca7aa6 100644 Binary files a/docs/static/screenshots/Legend/ordinal-light-800w.webp and b/docs/static/screenshots/Legend/ordinal-light-800w.webp differ diff --git a/docs/static/screenshots/Legend/quantile-dark-800w.webp b/docs/static/screenshots/Legend/quantile-dark-800w.webp index dbee3c8d89..b00f3cbdb5 100644 Binary files a/docs/static/screenshots/Legend/quantile-dark-800w.webp and b/docs/static/screenshots/Legend/quantile-dark-800w.webp differ diff --git a/docs/static/screenshots/Legend/quantize-dark-240w.webp b/docs/static/screenshots/Legend/quantize-dark-240w.webp index 98f813633c..3e12bccf5e 100644 Binary files a/docs/static/screenshots/Legend/quantize-dark-240w.webp and b/docs/static/screenshots/Legend/quantize-dark-240w.webp differ diff --git a/docs/static/screenshots/Legend/quantize-dark-800w.webp b/docs/static/screenshots/Legend/quantize-dark-800w.webp index 226b3000cc..45204327ab 100644 Binary files a/docs/static/screenshots/Legend/quantize-dark-800w.webp and b/docs/static/screenshots/Legend/quantize-dark-800w.webp differ diff --git a/docs/static/screenshots/Legend/quantize-light-400w.webp b/docs/static/screenshots/Legend/quantize-light-400w.webp index 3064ae1e9e..40cde42395 100644 Binary files a/docs/static/screenshots/Legend/quantize-light-400w.webp and b/docs/static/screenshots/Legend/quantize-light-400w.webp differ diff --git a/docs/static/screenshots/Legend/quantize-light-800w.webp b/docs/static/screenshots/Legend/quantize-light-800w.webp index da78fd312f..ce8f7cc7e1 100644 Binary files a/docs/static/screenshots/Legend/quantize-light-800w.webp and b/docs/static/screenshots/Legend/quantize-light-800w.webp differ diff --git a/docs/static/screenshots/Legend/responsive-swatches-dark-240w.webp b/docs/static/screenshots/Legend/responsive-swatches-dark-240w.webp index fda14acd65..5dea9be714 100644 Binary files a/docs/static/screenshots/Legend/responsive-swatches-dark-240w.webp and b/docs/static/screenshots/Legend/responsive-swatches-dark-240w.webp differ diff --git a/docs/static/screenshots/Legend/responsive-swatches-dark-400w.webp b/docs/static/screenshots/Legend/responsive-swatches-dark-400w.webp index ab030a1516..f18cb459ba 100644 Binary files a/docs/static/screenshots/Legend/responsive-swatches-dark-400w.webp and b/docs/static/screenshots/Legend/responsive-swatches-dark-400w.webp differ diff --git a/docs/static/screenshots/Legend/responsive-swatches-dark-800w.webp b/docs/static/screenshots/Legend/responsive-swatches-dark-800w.webp index 2ee03576f0..6bf43732f2 100644 Binary files a/docs/static/screenshots/Legend/responsive-swatches-dark-800w.webp and b/docs/static/screenshots/Legend/responsive-swatches-dark-800w.webp differ diff --git a/docs/static/screenshots/Legend/responsive-swatches-light-240w.webp b/docs/static/screenshots/Legend/responsive-swatches-light-240w.webp index ea66eee381..018a200005 100644 Binary files a/docs/static/screenshots/Legend/responsive-swatches-light-240w.webp and b/docs/static/screenshots/Legend/responsive-swatches-light-240w.webp differ diff --git a/docs/static/screenshots/Legend/responsive-swatches-light-400w.webp b/docs/static/screenshots/Legend/responsive-swatches-light-400w.webp index b2c804be5c..bf6be1a677 100644 Binary files a/docs/static/screenshots/Legend/responsive-swatches-light-400w.webp and b/docs/static/screenshots/Legend/responsive-swatches-light-400w.webp differ diff --git a/docs/static/screenshots/Legend/responsive-swatches-light-800w.webp b/docs/static/screenshots/Legend/responsive-swatches-light-800w.webp index 3ec050e68c..34ac340f77 100644 Binary files a/docs/static/screenshots/Legend/responsive-swatches-light-800w.webp and b/docs/static/screenshots/Legend/responsive-swatches-light-800w.webp differ diff --git a/docs/static/screenshots/Legend/sequential-dark-240w.webp b/docs/static/screenshots/Legend/sequential-dark-240w.webp index bc9f5c8658..18d4a8305e 100644 Binary files a/docs/static/screenshots/Legend/sequential-dark-240w.webp and b/docs/static/screenshots/Legend/sequential-dark-240w.webp differ diff --git a/docs/static/screenshots/Legend/sequential-dark-400w.webp b/docs/static/screenshots/Legend/sequential-dark-400w.webp index 83c73e7ee6..9d170dec0f 100644 Binary files a/docs/static/screenshots/Legend/sequential-dark-400w.webp and b/docs/static/screenshots/Legend/sequential-dark-400w.webp differ diff --git a/docs/static/screenshots/Legend/sequential-dark-800w.webp b/docs/static/screenshots/Legend/sequential-dark-800w.webp index aefb87374b..725d4dc2c4 100644 Binary files a/docs/static/screenshots/Legend/sequential-dark-800w.webp and b/docs/static/screenshots/Legend/sequential-dark-800w.webp differ diff --git a/docs/static/screenshots/Legend/sequential-light-800w.webp b/docs/static/screenshots/Legend/sequential-light-800w.webp index d7feee039e..268cb79d13 100644 Binary files a/docs/static/screenshots/Legend/sequential-light-800w.webp and b/docs/static/screenshots/Legend/sequential-light-800w.webp differ diff --git a/docs/static/screenshots/Legend/sequential-log-dark-400w.webp b/docs/static/screenshots/Legend/sequential-log-dark-400w.webp index d2bf1a9166..20d8a58776 100644 Binary files a/docs/static/screenshots/Legend/sequential-log-dark-400w.webp and b/docs/static/screenshots/Legend/sequential-log-dark-400w.webp differ diff --git a/docs/static/screenshots/Legend/sequential-log-dark-800w.webp b/docs/static/screenshots/Legend/sequential-log-dark-800w.webp index bd191fa809..2c702e7b00 100644 Binary files a/docs/static/screenshots/Legend/sequential-log-dark-800w.webp and b/docs/static/screenshots/Legend/sequential-log-dark-800w.webp differ diff --git a/docs/static/screenshots/Legend/sequential-log-light-400w.webp b/docs/static/screenshots/Legend/sequential-log-light-400w.webp index d5f014f3cf..e0cde2fe9c 100644 Binary files a/docs/static/screenshots/Legend/sequential-log-light-400w.webp and b/docs/static/screenshots/Legend/sequential-log-light-400w.webp differ diff --git a/docs/static/screenshots/Legend/sequential-log-light-800w.webp b/docs/static/screenshots/Legend/sequential-log-light-800w.webp index 7e93343363..d7c4448146 100644 Binary files a/docs/static/screenshots/Legend/sequential-log-light-800w.webp and b/docs/static/screenshots/Legend/sequential-log-light-800w.webp differ diff --git a/docs/static/screenshots/Legend/sequential-quantile-dark-240w.webp b/docs/static/screenshots/Legend/sequential-quantile-dark-240w.webp index 735a2496e4..5920c84c37 100644 Binary files a/docs/static/screenshots/Legend/sequential-quantile-dark-240w.webp and b/docs/static/screenshots/Legend/sequential-quantile-dark-240w.webp differ diff --git a/docs/static/screenshots/Legend/sequential-quantile-dark-400w.webp b/docs/static/screenshots/Legend/sequential-quantile-dark-400w.webp index 94acef66e4..60d63e056d 100644 Binary files a/docs/static/screenshots/Legend/sequential-quantile-dark-400w.webp and b/docs/static/screenshots/Legend/sequential-quantile-dark-400w.webp differ diff --git a/docs/static/screenshots/Legend/sequential-quantile-dark-800w.webp b/docs/static/screenshots/Legend/sequential-quantile-dark-800w.webp index dd1b889598..0392dfb045 100644 Binary files a/docs/static/screenshots/Legend/sequential-quantile-dark-800w.webp and b/docs/static/screenshots/Legend/sequential-quantile-dark-800w.webp differ diff --git a/docs/static/screenshots/Legend/sequential-quantile-light-240w.webp b/docs/static/screenshots/Legend/sequential-quantile-light-240w.webp index 16c4632e9b..f610ff8cdd 100644 Binary files a/docs/static/screenshots/Legend/sequential-quantile-light-240w.webp and b/docs/static/screenshots/Legend/sequential-quantile-light-240w.webp differ diff --git a/docs/static/screenshots/Legend/sequential-quantile-light-400w.webp b/docs/static/screenshots/Legend/sequential-quantile-light-400w.webp index 28dbbea3c4..b411681eb5 100644 Binary files a/docs/static/screenshots/Legend/sequential-quantile-light-400w.webp and b/docs/static/screenshots/Legend/sequential-quantile-light-400w.webp differ diff --git a/docs/static/screenshots/Legend/sequential-quantile-light-800w.webp b/docs/static/screenshots/Legend/sequential-quantile-light-800w.webp index c889aaf56e..ae8698397c 100644 Binary files a/docs/static/screenshots/Legend/sequential-quantile-light-800w.webp and b/docs/static/screenshots/Legend/sequential-quantile-light-800w.webp differ diff --git a/docs/static/screenshots/Legend/sequential-sqrt-dark-800w.webp b/docs/static/screenshots/Legend/sequential-sqrt-dark-800w.webp index 5ab5a3710f..c9513da642 100644 Binary files a/docs/static/screenshots/Legend/sequential-sqrt-dark-800w.webp and b/docs/static/screenshots/Legend/sequential-sqrt-dark-800w.webp differ diff --git a/docs/static/screenshots/Legend/sequential-sqrt-light-240w.webp b/docs/static/screenshots/Legend/sequential-sqrt-light-240w.webp index 37571ec7f5..818b08e7b3 100644 Binary files a/docs/static/screenshots/Legend/sequential-sqrt-light-240w.webp and b/docs/static/screenshots/Legend/sequential-sqrt-light-240w.webp differ diff --git a/docs/static/screenshots/Legend/sequential-sqrt-light-800w.webp b/docs/static/screenshots/Legend/sequential-sqrt-light-800w.webp index 41afedfe4c..786ef57eef 100644 Binary files a/docs/static/screenshots/Legend/sequential-sqrt-light-800w.webp and b/docs/static/screenshots/Legend/sequential-sqrt-light-800w.webp differ diff --git a/docs/static/screenshots/Legend/sqrt-dark-240w.webp b/docs/static/screenshots/Legend/sqrt-dark-240w.webp index 7dc9573e94..debe8cbda6 100644 Binary files a/docs/static/screenshots/Legend/sqrt-dark-240w.webp and b/docs/static/screenshots/Legend/sqrt-dark-240w.webp differ diff --git a/docs/static/screenshots/Legend/sqrt-dark-400w.webp b/docs/static/screenshots/Legend/sqrt-dark-400w.webp index 659d3a5e93..7cdee7c031 100644 Binary files a/docs/static/screenshots/Legend/sqrt-dark-400w.webp and b/docs/static/screenshots/Legend/sqrt-dark-400w.webp differ diff --git a/docs/static/screenshots/Legend/sqrt-dark-800w.webp b/docs/static/screenshots/Legend/sqrt-dark-800w.webp index 62104b6dfa..2f9ed4535a 100644 Binary files a/docs/static/screenshots/Legend/sqrt-dark-800w.webp and b/docs/static/screenshots/Legend/sqrt-dark-800w.webp differ diff --git a/docs/static/screenshots/Legend/sqrt-light-240w.webp b/docs/static/screenshots/Legend/sqrt-light-240w.webp index 68d0802022..4404503fa8 100644 Binary files a/docs/static/screenshots/Legend/sqrt-light-240w.webp and b/docs/static/screenshots/Legend/sqrt-light-240w.webp differ diff --git a/docs/static/screenshots/Legend/sqrt-light-400w.webp b/docs/static/screenshots/Legend/sqrt-light-400w.webp index 9a135b77c7..893beadc54 100644 Binary files a/docs/static/screenshots/Legend/sqrt-light-400w.webp and b/docs/static/screenshots/Legend/sqrt-light-400w.webp differ diff --git a/docs/static/screenshots/Legend/sqrt-light-800w.webp b/docs/static/screenshots/Legend/sqrt-light-800w.webp index 1f87d8b213..edf860955b 100644 Binary files a/docs/static/screenshots/Legend/sqrt-light-800w.webp and b/docs/static/screenshots/Legend/sqrt-light-800w.webp differ diff --git a/docs/static/screenshots/Legend/square-swatch-dark-240w.webp b/docs/static/screenshots/Legend/square-swatch-dark-240w.webp index 6bd41a9d1b..d878f307c8 100644 Binary files a/docs/static/screenshots/Legend/square-swatch-dark-240w.webp and b/docs/static/screenshots/Legend/square-swatch-dark-240w.webp differ diff --git a/docs/static/screenshots/Legend/square-swatch-dark-400w.webp b/docs/static/screenshots/Legend/square-swatch-dark-400w.webp index 15811b926e..117765529f 100644 Binary files a/docs/static/screenshots/Legend/square-swatch-dark-400w.webp and b/docs/static/screenshots/Legend/square-swatch-dark-400w.webp differ diff --git a/docs/static/screenshots/Legend/square-swatch-dark-800w.webp b/docs/static/screenshots/Legend/square-swatch-dark-800w.webp index c47e96ff28..5f4e2ff065 100644 Binary files a/docs/static/screenshots/Legend/square-swatch-dark-800w.webp and b/docs/static/screenshots/Legend/square-swatch-dark-800w.webp differ diff --git a/docs/static/screenshots/Legend/square-swatch-light-240w.webp b/docs/static/screenshots/Legend/square-swatch-light-240w.webp index 0355edb4e1..4aad7a7884 100644 Binary files a/docs/static/screenshots/Legend/square-swatch-light-240w.webp and b/docs/static/screenshots/Legend/square-swatch-light-240w.webp differ diff --git a/docs/static/screenshots/Legend/square-swatch-light-400w.webp b/docs/static/screenshots/Legend/square-swatch-light-400w.webp index b8d69497ee..14e66c9b9d 100644 Binary files a/docs/static/screenshots/Legend/square-swatch-light-400w.webp and b/docs/static/screenshots/Legend/square-swatch-light-400w.webp differ diff --git a/docs/static/screenshots/Legend/square-swatch-light-800w.webp b/docs/static/screenshots/Legend/square-swatch-light-800w.webp index 31e4724b31..f50b8876b3 100644 Binary files a/docs/static/screenshots/Legend/square-swatch-light-800w.webp and b/docs/static/screenshots/Legend/square-swatch-light-800w.webp differ diff --git a/docs/static/screenshots/Legend/styling-light-400w.webp b/docs/static/screenshots/Legend/styling-light-400w.webp index 192850b0b1..a5ea0ecb44 100644 Binary files a/docs/static/screenshots/Legend/styling-light-400w.webp and b/docs/static/screenshots/Legend/styling-light-400w.webp differ diff --git a/docs/static/screenshots/Legend/threshold-dark-240w.webp b/docs/static/screenshots/Legend/threshold-dark-240w.webp index 25354b852b..6bee205a8a 100644 Binary files a/docs/static/screenshots/Legend/threshold-dark-240w.webp and b/docs/static/screenshots/Legend/threshold-dark-240w.webp differ diff --git a/docs/static/screenshots/Legend/threshold-dark-400w.webp b/docs/static/screenshots/Legend/threshold-dark-400w.webp index 7eae7776a0..49e7f3c565 100644 Binary files a/docs/static/screenshots/Legend/threshold-dark-400w.webp and b/docs/static/screenshots/Legend/threshold-dark-400w.webp differ diff --git a/docs/static/screenshots/Legend/threshold-dark-800w.webp b/docs/static/screenshots/Legend/threshold-dark-800w.webp index d2659be323..a55a0147b9 100644 Binary files a/docs/static/screenshots/Legend/threshold-dark-800w.webp and b/docs/static/screenshots/Legend/threshold-dark-800w.webp differ diff --git a/docs/static/screenshots/Legend/threshold-light-240w.webp b/docs/static/screenshots/Legend/threshold-light-240w.webp index dcf05682d8..7ed20c4964 100644 Binary files a/docs/static/screenshots/Legend/threshold-light-240w.webp and b/docs/static/screenshots/Legend/threshold-light-240w.webp differ diff --git a/docs/static/screenshots/Legend/threshold-light-400w.webp b/docs/static/screenshots/Legend/threshold-light-400w.webp index b293338054..cbd0a53df0 100644 Binary files a/docs/static/screenshots/Legend/threshold-light-400w.webp and b/docs/static/screenshots/Legend/threshold-light-400w.webp differ diff --git a/docs/static/screenshots/Legend/threshold-light-800w.webp b/docs/static/screenshots/Legend/threshold-light-800w.webp index e318bba4b6..37bd30f89b 100644 Binary files a/docs/static/screenshots/Legend/threshold-light-800w.webp and b/docs/static/screenshots/Legend/threshold-light-800w.webp differ diff --git a/docs/static/screenshots/Legend/vertical-orientation-dark-240w.webp b/docs/static/screenshots/Legend/vertical-orientation-dark-240w.webp index 2f20ba7f65..f3da208d98 100644 Binary files a/docs/static/screenshots/Legend/vertical-orientation-dark-240w.webp and b/docs/static/screenshots/Legend/vertical-orientation-dark-240w.webp differ diff --git a/docs/static/screenshots/Legend/vertical-orientation-dark-400w.webp b/docs/static/screenshots/Legend/vertical-orientation-dark-400w.webp index f735f31df9..2be85a3e8b 100644 Binary files a/docs/static/screenshots/Legend/vertical-orientation-dark-400w.webp and b/docs/static/screenshots/Legend/vertical-orientation-dark-400w.webp differ diff --git a/docs/static/screenshots/Legend/vertical-orientation-dark-800w.webp b/docs/static/screenshots/Legend/vertical-orientation-dark-800w.webp index 2529646843..d18b006d80 100644 Binary files a/docs/static/screenshots/Legend/vertical-orientation-dark-800w.webp and b/docs/static/screenshots/Legend/vertical-orientation-dark-800w.webp differ diff --git a/docs/static/screenshots/Legend/vertical-orientation-light-240w.webp b/docs/static/screenshots/Legend/vertical-orientation-light-240w.webp index 774fb12194..fd854e476c 100644 Binary files a/docs/static/screenshots/Legend/vertical-orientation-light-240w.webp and b/docs/static/screenshots/Legend/vertical-orientation-light-240w.webp differ diff --git a/docs/static/screenshots/Legend/vertical-orientation-light-400w.webp b/docs/static/screenshots/Legend/vertical-orientation-light-400w.webp index 894b72aa04..7d8c9af5da 100644 Binary files a/docs/static/screenshots/Legend/vertical-orientation-light-400w.webp and b/docs/static/screenshots/Legend/vertical-orientation-light-400w.webp differ diff --git a/docs/static/screenshots/Legend/vertical-orientation-light-800w.webp b/docs/static/screenshots/Legend/vertical-orientation-light-800w.webp index feeb38b0ee..bcf8843388 100644 Binary files a/docs/static/screenshots/Legend/vertical-orientation-light-800w.webp and b/docs/static/screenshots/Legend/vertical-orientation-light-800w.webp differ diff --git a/docs/static/screenshots/Line/color-via-ordinal-scale-dark-800w.webp b/docs/static/screenshots/Line/color-via-ordinal-scale-dark-800w.webp index 9b8a27c4f0..cde22508d9 100644 Binary files a/docs/static/screenshots/Line/color-via-ordinal-scale-dark-800w.webp and b/docs/static/screenshots/Line/color-via-ordinal-scale-dark-800w.webp differ diff --git a/docs/static/screenshots/Line/color-via-ordinal-scale-light-400w.webp b/docs/static/screenshots/Line/color-via-ordinal-scale-light-400w.webp index 6a2b5eee75..bb9aec1949 100644 Binary files a/docs/static/screenshots/Line/color-via-ordinal-scale-light-400w.webp and b/docs/static/screenshots/Line/color-via-ordinal-scale-light-400w.webp differ diff --git a/docs/static/screenshots/Line/color-via-threshold-scale-light-400w.webp b/docs/static/screenshots/Line/color-via-threshold-scale-light-400w.webp index e2a67686a3..bb173b8544 100644 Binary files a/docs/static/screenshots/Line/color-via-threshold-scale-light-400w.webp and b/docs/static/screenshots/Line/color-via-threshold-scale-light-400w.webp differ diff --git a/docs/static/screenshots/Line/data-mode-dark-800w.webp b/docs/static/screenshots/Line/data-mode-dark-800w.webp index 89ecb79860..69eeebcaf8 100644 Binary files a/docs/static/screenshots/Line/data-mode-dark-800w.webp and b/docs/static/screenshots/Line/data-mode-dark-800w.webp differ diff --git a/docs/static/screenshots/Line/data-mode-light-400w.webp b/docs/static/screenshots/Line/data-mode-light-400w.webp index 790bf84e90..49d897c060 100644 Binary files a/docs/static/screenshots/Line/data-mode-light-400w.webp and b/docs/static/screenshots/Line/data-mode-light-400w.webp differ diff --git a/docs/static/screenshots/Line/data-mode-light-800w.webp b/docs/static/screenshots/Line/data-mode-light-800w.webp index 42b65f8a64..2eeceaa76d 100644 Binary files a/docs/static/screenshots/Line/data-mode-light-800w.webp and b/docs/static/screenshots/Line/data-mode-light-800w.webp differ diff --git a/docs/static/screenshots/Line/styling-using-attributes-dark-240w.webp b/docs/static/screenshots/Line/styling-using-attributes-dark-240w.webp index 0c3faa9204..f4fb8f40d3 100644 Binary files a/docs/static/screenshots/Line/styling-using-attributes-dark-240w.webp and b/docs/static/screenshots/Line/styling-using-attributes-dark-240w.webp differ diff --git a/docs/static/screenshots/Line/styling-using-attributes-dark-800w.webp b/docs/static/screenshots/Line/styling-using-attributes-dark-800w.webp index 4d02a725b3..449498b712 100644 Binary files a/docs/static/screenshots/Line/styling-using-attributes-dark-800w.webp and b/docs/static/screenshots/Line/styling-using-attributes-dark-800w.webp differ diff --git a/docs/static/screenshots/Line/styling-using-attributes-light-400w.webp b/docs/static/screenshots/Line/styling-using-attributes-light-400w.webp index 7b4ebf633c..b6c9a8bc47 100644 Binary files a/docs/static/screenshots/Line/styling-using-attributes-light-400w.webp and b/docs/static/screenshots/Line/styling-using-attributes-light-400w.webp differ diff --git a/docs/static/screenshots/Line/styling-using-classes-dark-240w.webp b/docs/static/screenshots/Line/styling-using-classes-dark-240w.webp index 0c3faa9204..f4fb8f40d3 100644 Binary files a/docs/static/screenshots/Line/styling-using-classes-dark-240w.webp and b/docs/static/screenshots/Line/styling-using-classes-dark-240w.webp differ diff --git a/docs/static/screenshots/Line/styling-using-classes-dark-800w.webp b/docs/static/screenshots/Line/styling-using-classes-dark-800w.webp index 4d02a725b3..449498b712 100644 Binary files a/docs/static/screenshots/Line/styling-using-classes-dark-800w.webp and b/docs/static/screenshots/Line/styling-using-classes-dark-800w.webp differ diff --git a/docs/static/screenshots/Line/styling-using-classes-light-400w.webp b/docs/static/screenshots/Line/styling-using-classes-light-400w.webp index 7b4ebf633c..b6c9a8bc47 100644 Binary files a/docs/static/screenshots/Line/styling-using-classes-light-400w.webp and b/docs/static/screenshots/Line/styling-using-classes-light-400w.webp differ diff --git a/docs/static/screenshots/Line/styling-using-css-variables-dark-240w.webp b/docs/static/screenshots/Line/styling-using-css-variables-dark-240w.webp index 0c3faa9204..f4fb8f40d3 100644 Binary files a/docs/static/screenshots/Line/styling-using-css-variables-dark-240w.webp and b/docs/static/screenshots/Line/styling-using-css-variables-dark-240w.webp differ diff --git a/docs/static/screenshots/Line/styling-using-css-variables-dark-800w.webp b/docs/static/screenshots/Line/styling-using-css-variables-dark-800w.webp index 4d02a725b3..449498b712 100644 Binary files a/docs/static/screenshots/Line/styling-using-css-variables-dark-800w.webp and b/docs/static/screenshots/Line/styling-using-css-variables-dark-800w.webp differ diff --git a/docs/static/screenshots/Line/styling-using-css-variables-light-400w.webp b/docs/static/screenshots/Line/styling-using-css-variables-light-400w.webp index 7b4ebf633c..b6c9a8bc47 100644 Binary files a/docs/static/screenshots/Line/styling-using-css-variables-light-400w.webp and b/docs/static/screenshots/Line/styling-using-css-variables-light-400w.webp differ diff --git a/docs/static/screenshots/LineChart/axis-labels-inside-dark-240w.webp b/docs/static/screenshots/LineChart/axis-labels-inside-dark-240w.webp index 69f6bf0a65..d195c654ac 100644 Binary files a/docs/static/screenshots/LineChart/axis-labels-inside-dark-240w.webp and b/docs/static/screenshots/LineChart/axis-labels-inside-dark-240w.webp differ diff --git a/docs/static/screenshots/LineChart/axis-labels-inside-dark-400w.webp b/docs/static/screenshots/LineChart/axis-labels-inside-dark-400w.webp index a0a05e2ce9..aad96ed57a 100644 Binary files a/docs/static/screenshots/LineChart/axis-labels-inside-dark-400w.webp and b/docs/static/screenshots/LineChart/axis-labels-inside-dark-400w.webp differ diff --git a/docs/static/screenshots/LineChart/axis-labels-inside-dark-800w.webp b/docs/static/screenshots/LineChart/axis-labels-inside-dark-800w.webp index 6a0c79adb7..48045b0f3d 100644 Binary files a/docs/static/screenshots/LineChart/axis-labels-inside-dark-800w.webp and b/docs/static/screenshots/LineChart/axis-labels-inside-dark-800w.webp differ diff --git a/docs/static/screenshots/LineChart/axis-labels-inside-light-240w.webp b/docs/static/screenshots/LineChart/axis-labels-inside-light-240w.webp index 9858e6b621..c224ce6bf8 100644 Binary files a/docs/static/screenshots/LineChart/axis-labels-inside-light-240w.webp and b/docs/static/screenshots/LineChart/axis-labels-inside-light-240w.webp differ diff --git a/docs/static/screenshots/LineChart/axis-labels-inside-light-400w.webp b/docs/static/screenshots/LineChart/axis-labels-inside-light-400w.webp index 9cc86ed9ee..5b45a0b0ac 100644 Binary files a/docs/static/screenshots/LineChart/axis-labels-inside-light-400w.webp and b/docs/static/screenshots/LineChart/axis-labels-inside-light-400w.webp differ diff --git a/docs/static/screenshots/LineChart/axis-labels-inside-light-800w.webp b/docs/static/screenshots/LineChart/axis-labels-inside-light-800w.webp index 41df9f98e2..cbb3d67f81 100644 Binary files a/docs/static/screenshots/LineChart/axis-labels-inside-light-800w.webp and b/docs/static/screenshots/LineChart/axis-labels-inside-light-800w.webp differ diff --git a/docs/static/screenshots/LineChart/basic-dark-240w.webp b/docs/static/screenshots/LineChart/basic-dark-240w.webp index 6409d83bed..42c823222e 100644 Binary files a/docs/static/screenshots/LineChart/basic-dark-240w.webp and b/docs/static/screenshots/LineChart/basic-dark-240w.webp differ diff --git a/docs/static/screenshots/LineChart/basic-dark-400w.webp b/docs/static/screenshots/LineChart/basic-dark-400w.webp index 314d252c9e..e28e9f1b3c 100644 Binary files a/docs/static/screenshots/LineChart/basic-dark-400w.webp and b/docs/static/screenshots/LineChart/basic-dark-400w.webp differ diff --git a/docs/static/screenshots/LineChart/basic-dark-800w.webp b/docs/static/screenshots/LineChart/basic-dark-800w.webp index 35e29673a3..50f679dc55 100644 Binary files a/docs/static/screenshots/LineChart/basic-dark-800w.webp and b/docs/static/screenshots/LineChart/basic-dark-800w.webp differ diff --git a/docs/static/screenshots/LineChart/basic-light-240w.webp b/docs/static/screenshots/LineChart/basic-light-240w.webp index 263bc3242f..730945e6c4 100644 Binary files a/docs/static/screenshots/LineChart/basic-light-240w.webp and b/docs/static/screenshots/LineChart/basic-light-240w.webp differ diff --git a/docs/static/screenshots/LineChart/basic-light-400w.webp b/docs/static/screenshots/LineChart/basic-light-400w.webp index af7d1fd023..40ad14bbda 100644 Binary files a/docs/static/screenshots/LineChart/basic-light-400w.webp and b/docs/static/screenshots/LineChart/basic-light-400w.webp differ diff --git a/docs/static/screenshots/LineChart/basic-light-800w.webp b/docs/static/screenshots/LineChart/basic-light-800w.webp index de868534f9..9cbe9854b3 100644 Binary files a/docs/static/screenshots/LineChart/basic-light-800w.webp and b/docs/static/screenshots/LineChart/basic-light-800w.webp differ diff --git a/docs/static/screenshots/LineChart/brush-dark-240w.webp b/docs/static/screenshots/LineChart/brush-dark-240w.webp index 76b81ede7a..035872dbed 100644 Binary files a/docs/static/screenshots/LineChart/brush-dark-240w.webp and b/docs/static/screenshots/LineChart/brush-dark-240w.webp differ diff --git a/docs/static/screenshots/LineChart/brush-dark-800w.webp b/docs/static/screenshots/LineChart/brush-dark-800w.webp index 0800bce32e..7ff3e16a90 100644 Binary files a/docs/static/screenshots/LineChart/brush-dark-800w.webp and b/docs/static/screenshots/LineChart/brush-dark-800w.webp differ diff --git a/docs/static/screenshots/LineChart/brush-light-800w.webp b/docs/static/screenshots/LineChart/brush-light-800w.webp index a3c43f84ab..1d25626c9c 100644 Binary files a/docs/static/screenshots/LineChart/brush-light-800w.webp and b/docs/static/screenshots/LineChart/brush-light-800w.webp differ diff --git a/docs/static/screenshots/LineChart/brush-pan-zoom-dark-240w.webp b/docs/static/screenshots/LineChart/brush-pan-zoom-dark-240w.webp index 76b81ede7a..035872dbed 100644 Binary files a/docs/static/screenshots/LineChart/brush-pan-zoom-dark-240w.webp and b/docs/static/screenshots/LineChart/brush-pan-zoom-dark-240w.webp differ diff --git a/docs/static/screenshots/LineChart/brush-pan-zoom-dark-800w.webp b/docs/static/screenshots/LineChart/brush-pan-zoom-dark-800w.webp index 0800bce32e..7ff3e16a90 100644 Binary files a/docs/static/screenshots/LineChart/brush-pan-zoom-dark-800w.webp and b/docs/static/screenshots/LineChart/brush-pan-zoom-dark-800w.webp differ diff --git a/docs/static/screenshots/LineChart/brush-pan-zoom-light-800w.webp b/docs/static/screenshots/LineChart/brush-pan-zoom-light-800w.webp index a3c43f84ab..1d25626c9c 100644 Binary files a/docs/static/screenshots/LineChart/brush-pan-zoom-light-800w.webp and b/docs/static/screenshots/LineChart/brush-pan-zoom-light-800w.webp differ diff --git a/docs/static/screenshots/LineChart/bump-state-population-ranks-dark-240w.webp b/docs/static/screenshots/LineChart/bump-state-population-ranks-dark-240w.webp index 109f05d157..f68c9726bc 100644 Binary files a/docs/static/screenshots/LineChart/bump-state-population-ranks-dark-240w.webp and b/docs/static/screenshots/LineChart/bump-state-population-ranks-dark-240w.webp differ diff --git a/docs/static/screenshots/LineChart/bump-state-population-ranks-dark-400w.webp b/docs/static/screenshots/LineChart/bump-state-population-ranks-dark-400w.webp index 6c00423b09..ce72779e33 100644 Binary files a/docs/static/screenshots/LineChart/bump-state-population-ranks-dark-400w.webp and b/docs/static/screenshots/LineChart/bump-state-population-ranks-dark-400w.webp differ diff --git a/docs/static/screenshots/LineChart/bump-state-population-ranks-dark-800w.webp b/docs/static/screenshots/LineChart/bump-state-population-ranks-dark-800w.webp index 6daa3eb855..cfa1d796fb 100644 Binary files a/docs/static/screenshots/LineChart/bump-state-population-ranks-dark-800w.webp and b/docs/static/screenshots/LineChart/bump-state-population-ranks-dark-800w.webp differ diff --git a/docs/static/screenshots/LineChart/bump-state-population-ranks-light-240w.webp b/docs/static/screenshots/LineChart/bump-state-population-ranks-light-240w.webp index 0207afc3c5..b2bb2b9ee9 100644 Binary files a/docs/static/screenshots/LineChart/bump-state-population-ranks-light-240w.webp and b/docs/static/screenshots/LineChart/bump-state-population-ranks-light-240w.webp differ diff --git a/docs/static/screenshots/LineChart/bump-state-population-ranks-light-400w.webp b/docs/static/screenshots/LineChart/bump-state-population-ranks-light-400w.webp index cba952c651..07df1c0402 100644 Binary files a/docs/static/screenshots/LineChart/bump-state-population-ranks-light-400w.webp and b/docs/static/screenshots/LineChart/bump-state-population-ranks-light-400w.webp differ diff --git a/docs/static/screenshots/LineChart/bump-state-population-ranks-light-800w.webp b/docs/static/screenshots/LineChart/bump-state-population-ranks-light-800w.webp index cfbb41c57a..14f505e8c8 100644 Binary files a/docs/static/screenshots/LineChart/bump-state-population-ranks-light-800w.webp and b/docs/static/screenshots/LineChart/bump-state-population-ranks-light-800w.webp differ diff --git a/docs/static/screenshots/LineChart/curve-dark-240w.webp b/docs/static/screenshots/LineChart/curve-dark-240w.webp index 2e67bee952..b8ad861162 100644 Binary files a/docs/static/screenshots/LineChart/curve-dark-240w.webp and b/docs/static/screenshots/LineChart/curve-dark-240w.webp differ diff --git a/docs/static/screenshots/LineChart/curve-dark-400w.webp b/docs/static/screenshots/LineChart/curve-dark-400w.webp index 815ec92854..30db898cda 100644 Binary files a/docs/static/screenshots/LineChart/curve-dark-400w.webp and b/docs/static/screenshots/LineChart/curve-dark-400w.webp differ diff --git a/docs/static/screenshots/LineChart/curve-dark-800w.webp b/docs/static/screenshots/LineChart/curve-dark-800w.webp index 1c672338f4..dab7aaeb6e 100644 Binary files a/docs/static/screenshots/LineChart/curve-dark-800w.webp and b/docs/static/screenshots/LineChart/curve-dark-800w.webp differ diff --git a/docs/static/screenshots/LineChart/curve-light-240w.webp b/docs/static/screenshots/LineChart/curve-light-240w.webp index 7e87971cec..d985852b74 100644 Binary files a/docs/static/screenshots/LineChart/curve-light-240w.webp and b/docs/static/screenshots/LineChart/curve-light-240w.webp differ diff --git a/docs/static/screenshots/LineChart/curve-light-400w.webp b/docs/static/screenshots/LineChart/curve-light-400w.webp index 218b0559dc..771814d985 100644 Binary files a/docs/static/screenshots/LineChart/curve-light-400w.webp and b/docs/static/screenshots/LineChart/curve-light-400w.webp differ diff --git a/docs/static/screenshots/LineChart/curve-light-800w.webp b/docs/static/screenshots/LineChart/curve-light-800w.webp index 60913de7c1..c82c13863d 100644 Binary files a/docs/static/screenshots/LineChart/curve-light-800w.webp and b/docs/static/screenshots/LineChart/curve-light-800w.webp differ diff --git a/docs/static/screenshots/LineChart/custom-dark-240w.webp b/docs/static/screenshots/LineChart/custom-dark-240w.webp index ebdc2a2fc0..26c011ca09 100644 Binary files a/docs/static/screenshots/LineChart/custom-dark-240w.webp and b/docs/static/screenshots/LineChart/custom-dark-240w.webp differ diff --git a/docs/static/screenshots/LineChart/custom-dark-400w.webp b/docs/static/screenshots/LineChart/custom-dark-400w.webp index 25a223c460..d474ad71b4 100644 Binary files a/docs/static/screenshots/LineChart/custom-dark-400w.webp and b/docs/static/screenshots/LineChart/custom-dark-400w.webp differ diff --git a/docs/static/screenshots/LineChart/custom-dark-800w.webp b/docs/static/screenshots/LineChart/custom-dark-800w.webp index 72178adef0..1ab2d7de90 100644 Binary files a/docs/static/screenshots/LineChart/custom-dark-800w.webp and b/docs/static/screenshots/LineChart/custom-dark-800w.webp differ diff --git a/docs/static/screenshots/LineChart/custom-light-240w.webp b/docs/static/screenshots/LineChart/custom-light-240w.webp index b40a671467..85e7de6548 100644 Binary files a/docs/static/screenshots/LineChart/custom-light-240w.webp and b/docs/static/screenshots/LineChart/custom-light-240w.webp differ diff --git a/docs/static/screenshots/LineChart/custom-light-400w.webp b/docs/static/screenshots/LineChart/custom-light-400w.webp index f39d4af90e..5a556de8f3 100644 Binary files a/docs/static/screenshots/LineChart/custom-light-400w.webp and b/docs/static/screenshots/LineChart/custom-light-400w.webp differ diff --git a/docs/static/screenshots/LineChart/custom-light-800w.webp b/docs/static/screenshots/LineChart/custom-light-800w.webp index 462087c884..b3e4955477 100644 Binary files a/docs/static/screenshots/LineChart/custom-light-800w.webp and b/docs/static/screenshots/LineChart/custom-light-800w.webp differ diff --git a/docs/static/screenshots/LineChart/custom-tooltip-dark-240w.webp b/docs/static/screenshots/LineChart/custom-tooltip-dark-240w.webp index ad133f1d34..28b13ce437 100644 Binary files a/docs/static/screenshots/LineChart/custom-tooltip-dark-240w.webp and b/docs/static/screenshots/LineChart/custom-tooltip-dark-240w.webp differ diff --git a/docs/static/screenshots/LineChart/custom-tooltip-dark-400w.webp b/docs/static/screenshots/LineChart/custom-tooltip-dark-400w.webp index faad1cfddc..5d4b9bb5c0 100644 Binary files a/docs/static/screenshots/LineChart/custom-tooltip-dark-400w.webp and b/docs/static/screenshots/LineChart/custom-tooltip-dark-400w.webp differ diff --git a/docs/static/screenshots/LineChart/custom-tooltip-dark-800w.webp b/docs/static/screenshots/LineChart/custom-tooltip-dark-800w.webp index 470c154d4b..1005fe619f 100644 Binary files a/docs/static/screenshots/LineChart/custom-tooltip-dark-800w.webp and b/docs/static/screenshots/LineChart/custom-tooltip-dark-800w.webp differ diff --git a/docs/static/screenshots/LineChart/custom-tooltip-light-240w.webp b/docs/static/screenshots/LineChart/custom-tooltip-light-240w.webp index 55367dbde9..3f2c636618 100644 Binary files a/docs/static/screenshots/LineChart/custom-tooltip-light-240w.webp and b/docs/static/screenshots/LineChart/custom-tooltip-light-240w.webp differ diff --git a/docs/static/screenshots/LineChart/custom-tooltip-light-400w.webp b/docs/static/screenshots/LineChart/custom-tooltip-light-400w.webp index 382edf16b4..6378d41dec 100644 Binary files a/docs/static/screenshots/LineChart/custom-tooltip-light-400w.webp and b/docs/static/screenshots/LineChart/custom-tooltip-light-400w.webp differ diff --git a/docs/static/screenshots/LineChart/custom-tooltip-light-800w.webp b/docs/static/screenshots/LineChart/custom-tooltip-light-800w.webp index 062adfa857..1fa8bbb419 100644 Binary files a/docs/static/screenshots/LineChart/custom-tooltip-light-800w.webp and b/docs/static/screenshots/LineChart/custom-tooltip-light-800w.webp differ diff --git a/docs/static/screenshots/LineChart/default-series-label-dark-240w.webp b/docs/static/screenshots/LineChart/default-series-label-dark-240w.webp index 9c683ffb35..c01a48c003 100644 Binary files a/docs/static/screenshots/LineChart/default-series-label-dark-240w.webp and b/docs/static/screenshots/LineChart/default-series-label-dark-240w.webp differ diff --git a/docs/static/screenshots/LineChart/default-series-label-dark-400w.webp b/docs/static/screenshots/LineChart/default-series-label-dark-400w.webp index f519b0a2d1..a7ef672d50 100644 Binary files a/docs/static/screenshots/LineChart/default-series-label-dark-400w.webp and b/docs/static/screenshots/LineChart/default-series-label-dark-400w.webp differ diff --git a/docs/static/screenshots/LineChart/default-series-label-dark-800w.webp b/docs/static/screenshots/LineChart/default-series-label-dark-800w.webp index d44296c19e..2878ae09ec 100644 Binary files a/docs/static/screenshots/LineChart/default-series-label-dark-800w.webp and b/docs/static/screenshots/LineChart/default-series-label-dark-800w.webp differ diff --git a/docs/static/screenshots/LineChart/default-series-label-light-240w.webp b/docs/static/screenshots/LineChart/default-series-label-light-240w.webp index daaee8a3e4..4a5f13f6ec 100644 Binary files a/docs/static/screenshots/LineChart/default-series-label-light-240w.webp and b/docs/static/screenshots/LineChart/default-series-label-light-240w.webp differ diff --git a/docs/static/screenshots/LineChart/default-series-label-light-400w.webp b/docs/static/screenshots/LineChart/default-series-label-light-400w.webp index bb254fd6e9..2ee9c9e3eb 100644 Binary files a/docs/static/screenshots/LineChart/default-series-label-light-400w.webp and b/docs/static/screenshots/LineChart/default-series-label-light-400w.webp differ diff --git a/docs/static/screenshots/LineChart/default-series-label-light-800w.webp b/docs/static/screenshots/LineChart/default-series-label-light-800w.webp index 90a0f908d5..935448b613 100644 Binary files a/docs/static/screenshots/LineChart/default-series-label-light-800w.webp and b/docs/static/screenshots/LineChart/default-series-label-light-800w.webp differ diff --git a/docs/static/screenshots/LineChart/draw-dark-240w.webp b/docs/static/screenshots/LineChart/draw-dark-240w.webp index 36ba695326..a126806e59 100644 Binary files a/docs/static/screenshots/LineChart/draw-dark-240w.webp and b/docs/static/screenshots/LineChart/draw-dark-240w.webp differ diff --git a/docs/static/screenshots/LineChart/draw-dark-400w.webp b/docs/static/screenshots/LineChart/draw-dark-400w.webp index 4ccf2c7568..a20f5588b9 100644 Binary files a/docs/static/screenshots/LineChart/draw-dark-400w.webp and b/docs/static/screenshots/LineChart/draw-dark-400w.webp differ diff --git a/docs/static/screenshots/LineChart/draw-dark-800w.webp b/docs/static/screenshots/LineChart/draw-dark-800w.webp index d822ccc34d..2dcf3ea0c0 100644 Binary files a/docs/static/screenshots/LineChart/draw-dark-800w.webp and b/docs/static/screenshots/LineChart/draw-dark-800w.webp differ diff --git a/docs/static/screenshots/LineChart/draw-light-240w.webp b/docs/static/screenshots/LineChart/draw-light-240w.webp index 2ff9942aaf..f78b117e20 100644 Binary files a/docs/static/screenshots/LineChart/draw-light-240w.webp and b/docs/static/screenshots/LineChart/draw-light-240w.webp differ diff --git a/docs/static/screenshots/LineChart/draw-light-400w.webp b/docs/static/screenshots/LineChart/draw-light-400w.webp index 3318aa1431..26da48b4f3 100644 Binary files a/docs/static/screenshots/LineChart/draw-light-400w.webp and b/docs/static/screenshots/LineChart/draw-light-400w.webp differ diff --git a/docs/static/screenshots/LineChart/draw-light-800w.webp b/docs/static/screenshots/LineChart/draw-light-800w.webp index ca490c7488..b9332dcd85 100644 Binary files a/docs/static/screenshots/LineChart/draw-light-800w.webp and b/docs/static/screenshots/LineChart/draw-light-800w.webp differ diff --git a/docs/static/screenshots/LineChart/dynamic-data-light-400w.webp b/docs/static/screenshots/LineChart/dynamic-data-light-400w.webp index 85c9c394fe..bf9f127af0 100644 Binary files a/docs/static/screenshots/LineChart/dynamic-data-light-400w.webp and b/docs/static/screenshots/LineChart/dynamic-data-light-400w.webp differ diff --git a/docs/static/screenshots/LineChart/dynamic-data-light-800w.webp b/docs/static/screenshots/LineChart/dynamic-data-light-800w.webp index aa5042185b..a4b5ab75bb 100644 Binary files a/docs/static/screenshots/LineChart/dynamic-data-light-800w.webp and b/docs/static/screenshots/LineChart/dynamic-data-light-800w.webp differ diff --git a/docs/static/screenshots/LineChart/gradient-encoding-dark-240w.webp b/docs/static/screenshots/LineChart/gradient-encoding-dark-240w.webp index de65f8e9c5..45f8c64ea4 100644 Binary files a/docs/static/screenshots/LineChart/gradient-encoding-dark-240w.webp and b/docs/static/screenshots/LineChart/gradient-encoding-dark-240w.webp differ diff --git a/docs/static/screenshots/LineChart/gradient-encoding-dark-400w.webp b/docs/static/screenshots/LineChart/gradient-encoding-dark-400w.webp index a3522300e7..6828818c18 100644 Binary files a/docs/static/screenshots/LineChart/gradient-encoding-dark-400w.webp and b/docs/static/screenshots/LineChart/gradient-encoding-dark-400w.webp differ diff --git a/docs/static/screenshots/LineChart/gradient-encoding-dark-800w.webp b/docs/static/screenshots/LineChart/gradient-encoding-dark-800w.webp index c40d87d605..ca5c5ef706 100644 Binary files a/docs/static/screenshots/LineChart/gradient-encoding-dark-800w.webp and b/docs/static/screenshots/LineChart/gradient-encoding-dark-800w.webp differ diff --git a/docs/static/screenshots/LineChart/gradient-encoding-light-240w.webp b/docs/static/screenshots/LineChart/gradient-encoding-light-240w.webp index 117d7c325c..8c5a1fa5db 100644 Binary files a/docs/static/screenshots/LineChart/gradient-encoding-light-240w.webp and b/docs/static/screenshots/LineChart/gradient-encoding-light-240w.webp differ diff --git a/docs/static/screenshots/LineChart/gradient-encoding-light-400w.webp b/docs/static/screenshots/LineChart/gradient-encoding-light-400w.webp index ab50ee1b5d..691ff4a58f 100644 Binary files a/docs/static/screenshots/LineChart/gradient-encoding-light-400w.webp and b/docs/static/screenshots/LineChart/gradient-encoding-light-400w.webp differ diff --git a/docs/static/screenshots/LineChart/gradient-encoding-light-800w.webp b/docs/static/screenshots/LineChart/gradient-encoding-light-800w.webp index 124868c65f..64e61898c7 100644 Binary files a/docs/static/screenshots/LineChart/gradient-encoding-light-800w.webp and b/docs/static/screenshots/LineChart/gradient-encoding-light-800w.webp differ diff --git a/docs/static/screenshots/LineChart/gradient-threshold-dark-800w.webp b/docs/static/screenshots/LineChart/gradient-threshold-dark-800w.webp index 3cde11fcf7..ee68156dd4 100644 Binary files a/docs/static/screenshots/LineChart/gradient-threshold-dark-800w.webp and b/docs/static/screenshots/LineChart/gradient-threshold-dark-800w.webp differ diff --git a/docs/static/screenshots/LineChart/gradient-threshold-light-240w.webp b/docs/static/screenshots/LineChart/gradient-threshold-light-240w.webp index d4744a4868..1d7055db40 100644 Binary files a/docs/static/screenshots/LineChart/gradient-threshold-light-240w.webp and b/docs/static/screenshots/LineChart/gradient-threshold-light-240w.webp differ diff --git a/docs/static/screenshots/LineChart/gradient-threshold-light-400w.webp b/docs/static/screenshots/LineChart/gradient-threshold-light-400w.webp index 23891d8dec..cd6b938760 100644 Binary files a/docs/static/screenshots/LineChart/gradient-threshold-light-400w.webp and b/docs/static/screenshots/LineChart/gradient-threshold-light-400w.webp differ diff --git a/docs/static/screenshots/LineChart/gradient-threshold-light-800w.webp b/docs/static/screenshots/LineChart/gradient-threshold-light-800w.webp index dd47504c9d..1f0594769c 100644 Binary files a/docs/static/screenshots/LineChart/gradient-threshold-light-800w.webp and b/docs/static/screenshots/LineChart/gradient-threshold-light-800w.webp differ diff --git a/docs/static/screenshots/LineChart/labels-dark-240w.webp b/docs/static/screenshots/LineChart/labels-dark-240w.webp index d8fbe4124d..f8837f4676 100644 Binary files a/docs/static/screenshots/LineChart/labels-dark-240w.webp and b/docs/static/screenshots/LineChart/labels-dark-240w.webp differ diff --git a/docs/static/screenshots/LineChart/labels-dark-400w.webp b/docs/static/screenshots/LineChart/labels-dark-400w.webp index 8daec3186e..7741853b4b 100644 Binary files a/docs/static/screenshots/LineChart/labels-dark-400w.webp and b/docs/static/screenshots/LineChart/labels-dark-400w.webp differ diff --git a/docs/static/screenshots/LineChart/labels-dark-800w.webp b/docs/static/screenshots/LineChart/labels-dark-800w.webp index cd45776035..5812f33ee5 100644 Binary files a/docs/static/screenshots/LineChart/labels-dark-800w.webp and b/docs/static/screenshots/LineChart/labels-dark-800w.webp differ diff --git a/docs/static/screenshots/LineChart/labels-light-240w.webp b/docs/static/screenshots/LineChart/labels-light-240w.webp index 9d8768d8e5..dd0cb5d85c 100644 Binary files a/docs/static/screenshots/LineChart/labels-light-240w.webp and b/docs/static/screenshots/LineChart/labels-light-240w.webp differ diff --git a/docs/static/screenshots/LineChart/labels-light-400w.webp b/docs/static/screenshots/LineChart/labels-light-400w.webp index a23eff103f..9166c94653 100644 Binary files a/docs/static/screenshots/LineChart/labels-light-400w.webp and b/docs/static/screenshots/LineChart/labels-light-400w.webp differ diff --git a/docs/static/screenshots/LineChart/labels-light-800w.webp b/docs/static/screenshots/LineChart/labels-light-800w.webp index ac0f0f1145..c81987fc4a 100644 Binary files a/docs/static/screenshots/LineChart/labels-light-800w.webp and b/docs/static/screenshots/LineChart/labels-light-800w.webp differ diff --git a/docs/static/screenshots/LineChart/labels-with-points-dark-240w.webp b/docs/static/screenshots/LineChart/labels-with-points-dark-240w.webp index 0282a30d9d..c54ef67e01 100644 Binary files a/docs/static/screenshots/LineChart/labels-with-points-dark-240w.webp and b/docs/static/screenshots/LineChart/labels-with-points-dark-240w.webp differ diff --git a/docs/static/screenshots/LineChart/labels-with-points-dark-400w.webp b/docs/static/screenshots/LineChart/labels-with-points-dark-400w.webp index 52cee18544..fc801ae213 100644 Binary files a/docs/static/screenshots/LineChart/labels-with-points-dark-400w.webp and b/docs/static/screenshots/LineChart/labels-with-points-dark-400w.webp differ diff --git a/docs/static/screenshots/LineChart/labels-with-points-dark-800w.webp b/docs/static/screenshots/LineChart/labels-with-points-dark-800w.webp index e4f78e87cd..baa040329a 100644 Binary files a/docs/static/screenshots/LineChart/labels-with-points-dark-800w.webp and b/docs/static/screenshots/LineChart/labels-with-points-dark-800w.webp differ diff --git a/docs/static/screenshots/LineChart/labels-with-points-light-240w.webp b/docs/static/screenshots/LineChart/labels-with-points-light-240w.webp index 6e19aa8e33..934f00b7de 100644 Binary files a/docs/static/screenshots/LineChart/labels-with-points-light-240w.webp and b/docs/static/screenshots/LineChart/labels-with-points-light-240w.webp differ diff --git a/docs/static/screenshots/LineChart/labels-with-points-light-400w.webp b/docs/static/screenshots/LineChart/labels-with-points-light-400w.webp index c485c69db5..7ae8b5b3a0 100644 Binary files a/docs/static/screenshots/LineChart/labels-with-points-light-400w.webp and b/docs/static/screenshots/LineChart/labels-with-points-light-400w.webp differ diff --git a/docs/static/screenshots/LineChart/labels-with-points-light-800w.webp b/docs/static/screenshots/LineChart/labels-with-points-light-800w.webp index 2a05835609..e8894ae482 100644 Binary files a/docs/static/screenshots/LineChart/labels-with-points-light-800w.webp and b/docs/static/screenshots/LineChart/labels-with-points-light-800w.webp differ diff --git a/docs/static/screenshots/LineChart/labels-within-points-dark-240w.webp b/docs/static/screenshots/LineChart/labels-within-points-dark-240w.webp index b944f51b2d..b4803b3e80 100644 Binary files a/docs/static/screenshots/LineChart/labels-within-points-dark-240w.webp and b/docs/static/screenshots/LineChart/labels-within-points-dark-240w.webp differ diff --git a/docs/static/screenshots/LineChart/labels-within-points-dark-400w.webp b/docs/static/screenshots/LineChart/labels-within-points-dark-400w.webp index 610fcb3e1c..13d2d01a42 100644 Binary files a/docs/static/screenshots/LineChart/labels-within-points-dark-400w.webp and b/docs/static/screenshots/LineChart/labels-within-points-dark-400w.webp differ diff --git a/docs/static/screenshots/LineChart/labels-within-points-dark-800w.webp b/docs/static/screenshots/LineChart/labels-within-points-dark-800w.webp index d4a4ceff7f..bad890b5ae 100644 Binary files a/docs/static/screenshots/LineChart/labels-within-points-dark-800w.webp and b/docs/static/screenshots/LineChart/labels-within-points-dark-800w.webp differ diff --git a/docs/static/screenshots/LineChart/labels-within-points-light-240w.webp b/docs/static/screenshots/LineChart/labels-within-points-light-240w.webp index 03547c5783..9950bc96be 100644 Binary files a/docs/static/screenshots/LineChart/labels-within-points-light-240w.webp and b/docs/static/screenshots/LineChart/labels-within-points-light-240w.webp differ diff --git a/docs/static/screenshots/LineChart/labels-within-points-light-400w.webp b/docs/static/screenshots/LineChart/labels-within-points-light-400w.webp index f758a1ebc5..a8b68e47d1 100644 Binary files a/docs/static/screenshots/LineChart/labels-within-points-light-400w.webp and b/docs/static/screenshots/LineChart/labels-within-points-light-400w.webp differ diff --git a/docs/static/screenshots/LineChart/labels-within-points-light-800w.webp b/docs/static/screenshots/LineChart/labels-within-points-light-800w.webp index e10573f33c..3e74b56a1f 100644 Binary files a/docs/static/screenshots/LineChart/labels-within-points-light-800w.webp and b/docs/static/screenshots/LineChart/labels-within-points-light-800w.webp differ diff --git a/docs/static/screenshots/LineChart/large-radial-series-dark-240w.webp b/docs/static/screenshots/LineChart/large-radial-series-dark-240w.webp index 04a9fedd01..f7be4aeda8 100644 Binary files a/docs/static/screenshots/LineChart/large-radial-series-dark-240w.webp and b/docs/static/screenshots/LineChart/large-radial-series-dark-240w.webp differ diff --git a/docs/static/screenshots/LineChart/large-radial-series-dark-400w.webp b/docs/static/screenshots/LineChart/large-radial-series-dark-400w.webp index 297af9217a..f5cc87e041 100644 Binary files a/docs/static/screenshots/LineChart/large-radial-series-dark-400w.webp and b/docs/static/screenshots/LineChart/large-radial-series-dark-400w.webp differ diff --git a/docs/static/screenshots/LineChart/large-radial-series-dark-800w.webp b/docs/static/screenshots/LineChart/large-radial-series-dark-800w.webp index 9f3cd3f13e..68fffd8ca2 100644 Binary files a/docs/static/screenshots/LineChart/large-radial-series-dark-800w.webp and b/docs/static/screenshots/LineChart/large-radial-series-dark-800w.webp differ diff --git a/docs/static/screenshots/LineChart/large-radial-series-light-400w.webp b/docs/static/screenshots/LineChart/large-radial-series-light-400w.webp index 3b4e260ab6..8965fde6f9 100644 Binary files a/docs/static/screenshots/LineChart/large-radial-series-light-400w.webp and b/docs/static/screenshots/LineChart/large-radial-series-light-400w.webp differ diff --git a/docs/static/screenshots/LineChart/large-radial-series-light-800w.webp b/docs/static/screenshots/LineChart/large-radial-series-light-800w.webp index 7bcc87ff58..4eacbd74dd 100644 Binary files a/docs/static/screenshots/LineChart/large-radial-series-light-800w.webp and b/docs/static/screenshots/LineChart/large-radial-series-light-800w.webp differ diff --git a/docs/static/screenshots/LineChart/large-series-dark-800w.webp b/docs/static/screenshots/LineChart/large-series-dark-800w.webp index c4cf816ae5..878a4469de 100644 Binary files a/docs/static/screenshots/LineChart/large-series-dark-800w.webp and b/docs/static/screenshots/LineChart/large-series-dark-800w.webp differ diff --git a/docs/static/screenshots/LineChart/large-series-light-400w.webp b/docs/static/screenshots/LineChart/large-series-light-400w.webp index ba07175496..48d4116da3 100644 Binary files a/docs/static/screenshots/LineChart/large-series-light-400w.webp and b/docs/static/screenshots/LineChart/large-series-light-400w.webp differ diff --git a/docs/static/screenshots/LineChart/large-series-light-800w.webp b/docs/static/screenshots/LineChart/large-series-light-800w.webp index 33458cf7f3..b565373bec 100644 Binary files a/docs/static/screenshots/LineChart/large-series-light-800w.webp and b/docs/static/screenshots/LineChart/large-series-light-800w.webp differ diff --git a/docs/static/screenshots/LineChart/legend-dark-240w.webp b/docs/static/screenshots/LineChart/legend-dark-240w.webp index 302a905c5c..5775afa4fe 100644 Binary files a/docs/static/screenshots/LineChart/legend-dark-240w.webp and b/docs/static/screenshots/LineChart/legend-dark-240w.webp differ diff --git a/docs/static/screenshots/LineChart/legend-dark-400w.webp b/docs/static/screenshots/LineChart/legend-dark-400w.webp index 6628019469..9bf1b32e8e 100644 Binary files a/docs/static/screenshots/LineChart/legend-dark-400w.webp and b/docs/static/screenshots/LineChart/legend-dark-400w.webp differ diff --git a/docs/static/screenshots/LineChart/legend-dark-800w.webp b/docs/static/screenshots/LineChart/legend-dark-800w.webp index e50d39d2e4..38b8a65e79 100644 Binary files a/docs/static/screenshots/LineChart/legend-dark-800w.webp and b/docs/static/screenshots/LineChart/legend-dark-800w.webp differ diff --git a/docs/static/screenshots/LineChart/legend-light-240w.webp b/docs/static/screenshots/LineChart/legend-light-240w.webp index 51c543abd9..0639c5f1e0 100644 Binary files a/docs/static/screenshots/LineChart/legend-light-240w.webp and b/docs/static/screenshots/LineChart/legend-light-240w.webp differ diff --git a/docs/static/screenshots/LineChart/legend-light-400w.webp b/docs/static/screenshots/LineChart/legend-light-400w.webp index 4cd2b6fa88..3e527913e2 100644 Binary files a/docs/static/screenshots/LineChart/legend-light-400w.webp and b/docs/static/screenshots/LineChart/legend-light-400w.webp differ diff --git a/docs/static/screenshots/LineChart/legend-light-800w.webp b/docs/static/screenshots/LineChart/legend-light-800w.webp index bbb15bb81d..1a48ca0169 100644 Binary files a/docs/static/screenshots/LineChart/legend-light-800w.webp and b/docs/static/screenshots/LineChart/legend-light-800w.webp differ diff --git a/docs/static/screenshots/LineChart/line-annotation-dark-240w.webp b/docs/static/screenshots/LineChart/line-annotation-dark-240w.webp index 5fa10d9ee2..42a729b28c 100644 Binary files a/docs/static/screenshots/LineChart/line-annotation-dark-240w.webp and b/docs/static/screenshots/LineChart/line-annotation-dark-240w.webp differ diff --git a/docs/static/screenshots/LineChart/line-annotation-dark-800w.webp b/docs/static/screenshots/LineChart/line-annotation-dark-800w.webp index a629df8cdd..51fa3280b8 100644 Binary files a/docs/static/screenshots/LineChart/line-annotation-dark-800w.webp and b/docs/static/screenshots/LineChart/line-annotation-dark-800w.webp differ diff --git a/docs/static/screenshots/LineChart/line-annotation-light-800w.webp b/docs/static/screenshots/LineChart/line-annotation-light-800w.webp index d92d4a4717..1bdcb16277 100644 Binary files a/docs/static/screenshots/LineChart/line-annotation-light-800w.webp and b/docs/static/screenshots/LineChart/line-annotation-light-800w.webp differ diff --git a/docs/static/screenshots/LineChart/long-data-dark-240w.webp b/docs/static/screenshots/LineChart/long-data-dark-240w.webp new file mode 100644 index 0000000000..114b3c028e Binary files /dev/null and b/docs/static/screenshots/LineChart/long-data-dark-240w.webp differ diff --git a/docs/static/screenshots/LineChart/long-data-dark-400w.webp b/docs/static/screenshots/LineChart/long-data-dark-400w.webp new file mode 100644 index 0000000000..ec932676fb Binary files /dev/null and b/docs/static/screenshots/LineChart/long-data-dark-400w.webp differ diff --git a/docs/static/screenshots/LineChart/long-data-dark-800w.webp b/docs/static/screenshots/LineChart/long-data-dark-800w.webp new file mode 100644 index 0000000000..4fe9095c1b Binary files /dev/null and b/docs/static/screenshots/LineChart/long-data-dark-800w.webp differ diff --git a/docs/static/screenshots/LineChart/long-data-light-240w.webp b/docs/static/screenshots/LineChart/long-data-light-240w.webp new file mode 100644 index 0000000000..0c3bd7acd5 Binary files /dev/null and b/docs/static/screenshots/LineChart/long-data-light-240w.webp differ diff --git a/docs/static/screenshots/LineChart/long-data-light-400w.webp b/docs/static/screenshots/LineChart/long-data-light-400w.webp new file mode 100644 index 0000000000..94b0627006 Binary files /dev/null and b/docs/static/screenshots/LineChart/long-data-light-400w.webp differ diff --git a/docs/static/screenshots/LineChart/long-data-light-800w.webp b/docs/static/screenshots/LineChart/long-data-light-800w.webp new file mode 100644 index 0000000000..c7e6fdb1df Binary files /dev/null and b/docs/static/screenshots/LineChart/long-data-light-800w.webp differ diff --git a/docs/static/screenshots/LineChart/motion-tween-dark-240w.webp b/docs/static/screenshots/LineChart/motion-tween-dark-240w.webp index 2d95873c66..491c1bf74a 100644 Binary files a/docs/static/screenshots/LineChart/motion-tween-dark-240w.webp and b/docs/static/screenshots/LineChart/motion-tween-dark-240w.webp differ diff --git a/docs/static/screenshots/LineChart/motion-tween-dark-400w.webp b/docs/static/screenshots/LineChart/motion-tween-dark-400w.webp index 3b13cf3c9f..c4d46cff76 100644 Binary files a/docs/static/screenshots/LineChart/motion-tween-dark-400w.webp and b/docs/static/screenshots/LineChart/motion-tween-dark-400w.webp differ diff --git a/docs/static/screenshots/LineChart/motion-tween-dark-800w.webp b/docs/static/screenshots/LineChart/motion-tween-dark-800w.webp index 9db50c7baf..bb33485467 100644 Binary files a/docs/static/screenshots/LineChart/motion-tween-dark-800w.webp and b/docs/static/screenshots/LineChart/motion-tween-dark-800w.webp differ diff --git a/docs/static/screenshots/LineChart/motion-tween-light-240w.webp b/docs/static/screenshots/LineChart/motion-tween-light-240w.webp index e07419bdda..078b83eebc 100644 Binary files a/docs/static/screenshots/LineChart/motion-tween-light-240w.webp and b/docs/static/screenshots/LineChart/motion-tween-light-240w.webp differ diff --git a/docs/static/screenshots/LineChart/motion-tween-light-400w.webp b/docs/static/screenshots/LineChart/motion-tween-light-400w.webp index 060842cde8..c811403745 100644 Binary files a/docs/static/screenshots/LineChart/motion-tween-light-400w.webp and b/docs/static/screenshots/LineChart/motion-tween-light-400w.webp differ diff --git a/docs/static/screenshots/LineChart/motion-tween-light-800w.webp b/docs/static/screenshots/LineChart/motion-tween-light-800w.webp index ea7b68de6f..f59e31dad5 100644 Binary files a/docs/static/screenshots/LineChart/motion-tween-light-800w.webp and b/docs/static/screenshots/LineChart/motion-tween-light-800w.webp differ diff --git a/docs/static/screenshots/LineChart/null-dashed-gaps-dark-240w.webp b/docs/static/screenshots/LineChart/null-dashed-gaps-dark-240w.webp index 3668ce2f96..28d7c5196f 100644 Binary files a/docs/static/screenshots/LineChart/null-dashed-gaps-dark-240w.webp and b/docs/static/screenshots/LineChart/null-dashed-gaps-dark-240w.webp differ diff --git a/docs/static/screenshots/LineChart/null-dashed-gaps-dark-400w.webp b/docs/static/screenshots/LineChart/null-dashed-gaps-dark-400w.webp index a12b88bf82..e8a51da467 100644 Binary files a/docs/static/screenshots/LineChart/null-dashed-gaps-dark-400w.webp and b/docs/static/screenshots/LineChart/null-dashed-gaps-dark-400w.webp differ diff --git a/docs/static/screenshots/LineChart/null-dashed-gaps-dark-800w.webp b/docs/static/screenshots/LineChart/null-dashed-gaps-dark-800w.webp index e575b52ea2..35306c7768 100644 Binary files a/docs/static/screenshots/LineChart/null-dashed-gaps-dark-800w.webp and b/docs/static/screenshots/LineChart/null-dashed-gaps-dark-800w.webp differ diff --git a/docs/static/screenshots/LineChart/null-dashed-gaps-light-240w.webp b/docs/static/screenshots/LineChart/null-dashed-gaps-light-240w.webp index b3c3daca61..ef2db8bce5 100644 Binary files a/docs/static/screenshots/LineChart/null-dashed-gaps-light-240w.webp and b/docs/static/screenshots/LineChart/null-dashed-gaps-light-240w.webp differ diff --git a/docs/static/screenshots/LineChart/null-dashed-gaps-light-400w.webp b/docs/static/screenshots/LineChart/null-dashed-gaps-light-400w.webp index 1e00e15589..59664dc610 100644 Binary files a/docs/static/screenshots/LineChart/null-dashed-gaps-light-400w.webp and b/docs/static/screenshots/LineChart/null-dashed-gaps-light-400w.webp differ diff --git a/docs/static/screenshots/LineChart/null-dashed-gaps-light-800w.webp b/docs/static/screenshots/LineChart/null-dashed-gaps-light-800w.webp index bc8f5a60b3..f25052736c 100644 Binary files a/docs/static/screenshots/LineChart/null-dashed-gaps-light-800w.webp and b/docs/static/screenshots/LineChart/null-dashed-gaps-light-800w.webp differ diff --git a/docs/static/screenshots/LineChart/null-gaps-dark-240w.webp b/docs/static/screenshots/LineChart/null-gaps-dark-240w.webp index 9e3d9d9eb3..d7b56b1b59 100644 Binary files a/docs/static/screenshots/LineChart/null-gaps-dark-240w.webp and b/docs/static/screenshots/LineChart/null-gaps-dark-240w.webp differ diff --git a/docs/static/screenshots/LineChart/null-gaps-dark-400w.webp b/docs/static/screenshots/LineChart/null-gaps-dark-400w.webp index dc1252e64f..514819369b 100644 Binary files a/docs/static/screenshots/LineChart/null-gaps-dark-400w.webp and b/docs/static/screenshots/LineChart/null-gaps-dark-400w.webp differ diff --git a/docs/static/screenshots/LineChart/null-gaps-dark-800w.webp b/docs/static/screenshots/LineChart/null-gaps-dark-800w.webp index 7169419f1e..7f0f59952f 100644 Binary files a/docs/static/screenshots/LineChart/null-gaps-dark-800w.webp and b/docs/static/screenshots/LineChart/null-gaps-dark-800w.webp differ diff --git a/docs/static/screenshots/LineChart/null-gaps-light-240w.webp b/docs/static/screenshots/LineChart/null-gaps-light-240w.webp index b035a5820f..b386774ef7 100644 Binary files a/docs/static/screenshots/LineChart/null-gaps-light-240w.webp and b/docs/static/screenshots/LineChart/null-gaps-light-240w.webp differ diff --git a/docs/static/screenshots/LineChart/null-gaps-light-400w.webp b/docs/static/screenshots/LineChart/null-gaps-light-400w.webp index 9de69cff58..5fbb778911 100644 Binary files a/docs/static/screenshots/LineChart/null-gaps-light-400w.webp and b/docs/static/screenshots/LineChart/null-gaps-light-400w.webp differ diff --git a/docs/static/screenshots/LineChart/null-gaps-light-800w.webp b/docs/static/screenshots/LineChart/null-gaps-light-800w.webp index 2508364798..fcc87b5b97 100644 Binary files a/docs/static/screenshots/LineChart/null-gaps-light-800w.webp and b/docs/static/screenshots/LineChart/null-gaps-light-800w.webp differ diff --git a/docs/static/screenshots/LineChart/oscilloscope-time-dark-400w.webp b/docs/static/screenshots/LineChart/oscilloscope-time-dark-400w.webp index 5db2681267..5f30018119 100644 Binary files a/docs/static/screenshots/LineChart/oscilloscope-time-dark-400w.webp and b/docs/static/screenshots/LineChart/oscilloscope-time-dark-400w.webp differ diff --git a/docs/static/screenshots/LineChart/oscilloscope-time-dark-800w.webp b/docs/static/screenshots/LineChart/oscilloscope-time-dark-800w.webp index b298c1051d..cfa5a7f98d 100644 Binary files a/docs/static/screenshots/LineChart/oscilloscope-time-dark-800w.webp and b/docs/static/screenshots/LineChart/oscilloscope-time-dark-800w.webp differ diff --git a/docs/static/screenshots/LineChart/oscilloscope-time-light-400w.webp b/docs/static/screenshots/LineChart/oscilloscope-time-light-400w.webp index 2c99cfb70e..31ad20aa4e 100644 Binary files a/docs/static/screenshots/LineChart/oscilloscope-time-light-400w.webp and b/docs/static/screenshots/LineChart/oscilloscope-time-light-400w.webp differ diff --git a/docs/static/screenshots/LineChart/override-color-dark-240w.webp b/docs/static/screenshots/LineChart/override-color-dark-240w.webp index 39fab1abb4..ca1909b73b 100644 Binary files a/docs/static/screenshots/LineChart/override-color-dark-240w.webp and b/docs/static/screenshots/LineChart/override-color-dark-240w.webp differ diff --git a/docs/static/screenshots/LineChart/override-color-dark-400w.webp b/docs/static/screenshots/LineChart/override-color-dark-400w.webp index 7d6cb60e04..acbd69c0a6 100644 Binary files a/docs/static/screenshots/LineChart/override-color-dark-400w.webp and b/docs/static/screenshots/LineChart/override-color-dark-400w.webp differ diff --git a/docs/static/screenshots/LineChart/override-color-dark-800w.webp b/docs/static/screenshots/LineChart/override-color-dark-800w.webp index c4c9857d5f..443bfd142f 100644 Binary files a/docs/static/screenshots/LineChart/override-color-dark-800w.webp and b/docs/static/screenshots/LineChart/override-color-dark-800w.webp differ diff --git a/docs/static/screenshots/LineChart/override-color-light-240w.webp b/docs/static/screenshots/LineChart/override-color-light-240w.webp index 4034808efd..60f45a49ac 100644 Binary files a/docs/static/screenshots/LineChart/override-color-light-240w.webp and b/docs/static/screenshots/LineChart/override-color-light-240w.webp differ diff --git a/docs/static/screenshots/LineChart/override-color-light-400w.webp b/docs/static/screenshots/LineChart/override-color-light-400w.webp index e72ab24b57..86a34f0b16 100644 Binary files a/docs/static/screenshots/LineChart/override-color-light-400w.webp and b/docs/static/screenshots/LineChart/override-color-light-400w.webp differ diff --git a/docs/static/screenshots/LineChart/override-color-light-800w.webp b/docs/static/screenshots/LineChart/override-color-light-800w.webp index 85339249fe..58e2ac299e 100644 Binary files a/docs/static/screenshots/LineChart/override-color-light-800w.webp and b/docs/static/screenshots/LineChart/override-color-light-800w.webp differ diff --git a/docs/static/screenshots/LineChart/pan-zoom-custom-constrain-dark-240w.webp b/docs/static/screenshots/LineChart/pan-zoom-custom-constrain-dark-240w.webp index 334e905693..5ec46a5e96 100644 Binary files a/docs/static/screenshots/LineChart/pan-zoom-custom-constrain-dark-240w.webp and b/docs/static/screenshots/LineChart/pan-zoom-custom-constrain-dark-240w.webp differ diff --git a/docs/static/screenshots/LineChart/pan-zoom-custom-constrain-dark-400w.webp b/docs/static/screenshots/LineChart/pan-zoom-custom-constrain-dark-400w.webp index fe2d65d8ec..b5677a318c 100644 Binary files a/docs/static/screenshots/LineChart/pan-zoom-custom-constrain-dark-400w.webp and b/docs/static/screenshots/LineChart/pan-zoom-custom-constrain-dark-400w.webp differ diff --git a/docs/static/screenshots/LineChart/pan-zoom-custom-constrain-dark-800w.webp b/docs/static/screenshots/LineChart/pan-zoom-custom-constrain-dark-800w.webp index 6f17257eeb..647e11dee0 100644 Binary files a/docs/static/screenshots/LineChart/pan-zoom-custom-constrain-dark-800w.webp and b/docs/static/screenshots/LineChart/pan-zoom-custom-constrain-dark-800w.webp differ diff --git a/docs/static/screenshots/LineChart/pan-zoom-custom-constrain-light-240w.webp b/docs/static/screenshots/LineChart/pan-zoom-custom-constrain-light-240w.webp index 08537e86e3..bdd262c441 100644 Binary files a/docs/static/screenshots/LineChart/pan-zoom-custom-constrain-light-240w.webp and b/docs/static/screenshots/LineChart/pan-zoom-custom-constrain-light-240w.webp differ diff --git a/docs/static/screenshots/LineChart/pan-zoom-custom-constrain-light-400w.webp b/docs/static/screenshots/LineChart/pan-zoom-custom-constrain-light-400w.webp index c85bf72733..a20c7bec10 100644 Binary files a/docs/static/screenshots/LineChart/pan-zoom-custom-constrain-light-400w.webp and b/docs/static/screenshots/LineChart/pan-zoom-custom-constrain-light-400w.webp differ diff --git a/docs/static/screenshots/LineChart/pan-zoom-custom-constrain-light-800w.webp b/docs/static/screenshots/LineChart/pan-zoom-custom-constrain-light-800w.webp index 338f3167be..f14a3b6398 100644 Binary files a/docs/static/screenshots/LineChart/pan-zoom-custom-constrain-light-800w.webp and b/docs/static/screenshots/LineChart/pan-zoom-custom-constrain-light-800w.webp differ diff --git a/docs/static/screenshots/LineChart/pan-zoom-dark-240w.webp b/docs/static/screenshots/LineChart/pan-zoom-dark-240w.webp index 76b81ede7a..035872dbed 100644 Binary files a/docs/static/screenshots/LineChart/pan-zoom-dark-240w.webp and b/docs/static/screenshots/LineChart/pan-zoom-dark-240w.webp differ diff --git a/docs/static/screenshots/LineChart/pan-zoom-dark-800w.webp b/docs/static/screenshots/LineChart/pan-zoom-dark-800w.webp index 0800bce32e..7ff3e16a90 100644 Binary files a/docs/static/screenshots/LineChart/pan-zoom-dark-800w.webp and b/docs/static/screenshots/LineChart/pan-zoom-dark-800w.webp differ diff --git a/docs/static/screenshots/LineChart/pan-zoom-domain-extent-dark-240w.webp b/docs/static/screenshots/LineChart/pan-zoom-domain-extent-dark-240w.webp index 276f2b6f5a..8304cde513 100644 Binary files a/docs/static/screenshots/LineChart/pan-zoom-domain-extent-dark-240w.webp and b/docs/static/screenshots/LineChart/pan-zoom-domain-extent-dark-240w.webp differ diff --git a/docs/static/screenshots/LineChart/pan-zoom-domain-extent-dark-400w.webp b/docs/static/screenshots/LineChart/pan-zoom-domain-extent-dark-400w.webp index 475ebfe807..bcc660a166 100644 Binary files a/docs/static/screenshots/LineChart/pan-zoom-domain-extent-dark-400w.webp and b/docs/static/screenshots/LineChart/pan-zoom-domain-extent-dark-400w.webp differ diff --git a/docs/static/screenshots/LineChart/pan-zoom-domain-extent-dark-800w.webp b/docs/static/screenshots/LineChart/pan-zoom-domain-extent-dark-800w.webp index f2393873e8..b61ece8069 100644 Binary files a/docs/static/screenshots/LineChart/pan-zoom-domain-extent-dark-800w.webp and b/docs/static/screenshots/LineChart/pan-zoom-domain-extent-dark-800w.webp differ diff --git a/docs/static/screenshots/LineChart/pan-zoom-domain-extent-light-240w.webp b/docs/static/screenshots/LineChart/pan-zoom-domain-extent-light-240w.webp index 3ae580f8dc..8123ee6099 100644 Binary files a/docs/static/screenshots/LineChart/pan-zoom-domain-extent-light-240w.webp and b/docs/static/screenshots/LineChart/pan-zoom-domain-extent-light-240w.webp differ diff --git a/docs/static/screenshots/LineChart/pan-zoom-domain-extent-light-400w.webp b/docs/static/screenshots/LineChart/pan-zoom-domain-extent-light-400w.webp index fac9ad6113..7e64108abe 100644 Binary files a/docs/static/screenshots/LineChart/pan-zoom-domain-extent-light-400w.webp and b/docs/static/screenshots/LineChart/pan-zoom-domain-extent-light-400w.webp differ diff --git a/docs/static/screenshots/LineChart/pan-zoom-domain-extent-light-800w.webp b/docs/static/screenshots/LineChart/pan-zoom-domain-extent-light-800w.webp index fb7265e022..c9ac913f7b 100644 Binary files a/docs/static/screenshots/LineChart/pan-zoom-domain-extent-light-800w.webp and b/docs/static/screenshots/LineChart/pan-zoom-domain-extent-light-800w.webp differ diff --git a/docs/static/screenshots/LineChart/pan-zoom-dynamic-data-dark-240w.webp b/docs/static/screenshots/LineChart/pan-zoom-dynamic-data-dark-240w.webp index e387af1c4d..474e4c2dbd 100644 Binary files a/docs/static/screenshots/LineChart/pan-zoom-dynamic-data-dark-240w.webp and b/docs/static/screenshots/LineChart/pan-zoom-dynamic-data-dark-240w.webp differ diff --git a/docs/static/screenshots/LineChart/pan-zoom-dynamic-data-dark-400w.webp b/docs/static/screenshots/LineChart/pan-zoom-dynamic-data-dark-400w.webp index b4da0479fa..502b704627 100644 Binary files a/docs/static/screenshots/LineChart/pan-zoom-dynamic-data-dark-400w.webp and b/docs/static/screenshots/LineChart/pan-zoom-dynamic-data-dark-400w.webp differ diff --git a/docs/static/screenshots/LineChart/pan-zoom-dynamic-data-dark-800w.webp b/docs/static/screenshots/LineChart/pan-zoom-dynamic-data-dark-800w.webp index 4059602695..bf74a06c23 100644 Binary files a/docs/static/screenshots/LineChart/pan-zoom-dynamic-data-dark-800w.webp and b/docs/static/screenshots/LineChart/pan-zoom-dynamic-data-dark-800w.webp differ diff --git a/docs/static/screenshots/LineChart/pan-zoom-light-800w.webp b/docs/static/screenshots/LineChart/pan-zoom-light-800w.webp index a3c43f84ab..1d25626c9c 100644 Binary files a/docs/static/screenshots/LineChart/pan-zoom-light-800w.webp and b/docs/static/screenshots/LineChart/pan-zoom-light-800w.webp differ diff --git a/docs/static/screenshots/LineChart/pan-zoom-with-overview-dark-400w.webp b/docs/static/screenshots/LineChart/pan-zoom-with-overview-dark-400w.webp index a463f771b3..c49089e2de 100644 Binary files a/docs/static/screenshots/LineChart/pan-zoom-with-overview-dark-400w.webp and b/docs/static/screenshots/LineChart/pan-zoom-with-overview-dark-400w.webp differ diff --git a/docs/static/screenshots/LineChart/pan-zoom-with-overview-dark-800w.webp b/docs/static/screenshots/LineChart/pan-zoom-with-overview-dark-800w.webp index 9232d05893..7d9a0f8d90 100644 Binary files a/docs/static/screenshots/LineChart/pan-zoom-with-overview-dark-800w.webp and b/docs/static/screenshots/LineChart/pan-zoom-with-overview-dark-800w.webp differ diff --git a/docs/static/screenshots/LineChart/perf-dimension-arrays-dark-240w.webp b/docs/static/screenshots/LineChart/perf-dimension-arrays-dark-240w.webp index c52ea5a9de..aade0732e7 100644 Binary files a/docs/static/screenshots/LineChart/perf-dimension-arrays-dark-240w.webp and b/docs/static/screenshots/LineChart/perf-dimension-arrays-dark-240w.webp differ diff --git a/docs/static/screenshots/LineChart/perf-dimension-arrays-light-400w.webp b/docs/static/screenshots/LineChart/perf-dimension-arrays-light-400w.webp index 906ac86959..34d45fb589 100644 Binary files a/docs/static/screenshots/LineChart/perf-dimension-arrays-light-400w.webp and b/docs/static/screenshots/LineChart/perf-dimension-arrays-light-400w.webp differ diff --git a/docs/static/screenshots/LineChart/perf-dimension-arrays-light-800w.webp b/docs/static/screenshots/LineChart/perf-dimension-arrays-light-800w.webp index 23e2ac8351..c41d23e44c 100644 Binary files a/docs/static/screenshots/LineChart/perf-dimension-arrays-light-800w.webp and b/docs/static/screenshots/LineChart/perf-dimension-arrays-light-800w.webp differ diff --git a/docs/static/screenshots/LineChart/perf-dimension-arrays-processed-dark-240w.webp b/docs/static/screenshots/LineChart/perf-dimension-arrays-processed-dark-240w.webp index c52ea5a9de..aade0732e7 100644 Binary files a/docs/static/screenshots/LineChart/perf-dimension-arrays-processed-dark-240w.webp and b/docs/static/screenshots/LineChart/perf-dimension-arrays-processed-dark-240w.webp differ diff --git a/docs/static/screenshots/LineChart/perf-dimension-arrays-processed-light-400w.webp b/docs/static/screenshots/LineChart/perf-dimension-arrays-processed-light-400w.webp index 906ac86959..34d45fb589 100644 Binary files a/docs/static/screenshots/LineChart/perf-dimension-arrays-processed-light-400w.webp and b/docs/static/screenshots/LineChart/perf-dimension-arrays-processed-light-400w.webp differ diff --git a/docs/static/screenshots/LineChart/perf-dimension-arrays-processed-light-800w.webp b/docs/static/screenshots/LineChart/perf-dimension-arrays-processed-light-800w.webp index 23e2ac8351..c41d23e44c 100644 Binary files a/docs/static/screenshots/LineChart/perf-dimension-arrays-processed-light-800w.webp and b/docs/static/screenshots/LineChart/perf-dimension-arrays-processed-light-800w.webp differ diff --git a/docs/static/screenshots/LineChart/perf-series-arrays-dark-240w.webp b/docs/static/screenshots/LineChart/perf-series-arrays-dark-240w.webp index c52ea5a9de..aade0732e7 100644 Binary files a/docs/static/screenshots/LineChart/perf-series-arrays-dark-240w.webp and b/docs/static/screenshots/LineChart/perf-series-arrays-dark-240w.webp differ diff --git a/docs/static/screenshots/LineChart/perf-series-arrays-light-400w.webp b/docs/static/screenshots/LineChart/perf-series-arrays-light-400w.webp index 906ac86959..34d45fb589 100644 Binary files a/docs/static/screenshots/LineChart/perf-series-arrays-light-400w.webp and b/docs/static/screenshots/LineChart/perf-series-arrays-light-400w.webp differ diff --git a/docs/static/screenshots/LineChart/perf-series-arrays-light-800w.webp b/docs/static/screenshots/LineChart/perf-series-arrays-light-800w.webp index 23e2ac8351..c41d23e44c 100644 Binary files a/docs/static/screenshots/LineChart/perf-series-arrays-light-800w.webp and b/docs/static/screenshots/LineChart/perf-series-arrays-light-800w.webp differ diff --git a/docs/static/screenshots/LineChart/perf-streaming-dark-240w.webp b/docs/static/screenshots/LineChart/perf-streaming-dark-240w.webp index d2c8005b3d..c4454fc3b9 100644 Binary files a/docs/static/screenshots/LineChart/perf-streaming-dark-240w.webp and b/docs/static/screenshots/LineChart/perf-streaming-dark-240w.webp differ diff --git a/docs/static/screenshots/LineChart/perf-streaming-dark-400w.webp b/docs/static/screenshots/LineChart/perf-streaming-dark-400w.webp index 238e0d9d02..70c697e83f 100644 Binary files a/docs/static/screenshots/LineChart/perf-streaming-dark-400w.webp and b/docs/static/screenshots/LineChart/perf-streaming-dark-400w.webp differ diff --git a/docs/static/screenshots/LineChart/perf-streaming-dark-800w.webp b/docs/static/screenshots/LineChart/perf-streaming-dark-800w.webp index bba3fd4692..a8a8709a83 100644 Binary files a/docs/static/screenshots/LineChart/perf-streaming-dark-800w.webp and b/docs/static/screenshots/LineChart/perf-streaming-dark-800w.webp differ diff --git a/docs/static/screenshots/LineChart/perf-streaming-light-240w.webp b/docs/static/screenshots/LineChart/perf-streaming-light-240w.webp index f051af888f..1e558d3e5b 100644 Binary files a/docs/static/screenshots/LineChart/perf-streaming-light-240w.webp and b/docs/static/screenshots/LineChart/perf-streaming-light-240w.webp differ diff --git a/docs/static/screenshots/LineChart/perf-streaming-light-400w.webp b/docs/static/screenshots/LineChart/perf-streaming-light-400w.webp index c2d36f02c4..b0445eb9bb 100644 Binary files a/docs/static/screenshots/LineChart/perf-streaming-light-400w.webp and b/docs/static/screenshots/LineChart/perf-streaming-light-400w.webp differ diff --git a/docs/static/screenshots/LineChart/perf-streaming-light-800w.webp b/docs/static/screenshots/LineChart/perf-streaming-light-800w.webp index e9e7234ff5..5c3623df70 100644 Binary files a/docs/static/screenshots/LineChart/perf-streaming-light-800w.webp and b/docs/static/screenshots/LineChart/perf-streaming-light-800w.webp differ diff --git a/docs/static/screenshots/LineChart/persist-brush-zoom-dark-240w.webp b/docs/static/screenshots/LineChart/persist-brush-zoom-dark-240w.webp index 6b4dea8e82..740fd082ac 100644 Binary files a/docs/static/screenshots/LineChart/persist-brush-zoom-dark-240w.webp and b/docs/static/screenshots/LineChart/persist-brush-zoom-dark-240w.webp differ diff --git a/docs/static/screenshots/LineChart/persist-brush-zoom-dark-400w.webp b/docs/static/screenshots/LineChart/persist-brush-zoom-dark-400w.webp index 9312a578d0..fca3d565e5 100644 Binary files a/docs/static/screenshots/LineChart/persist-brush-zoom-dark-400w.webp and b/docs/static/screenshots/LineChart/persist-brush-zoom-dark-400w.webp differ diff --git a/docs/static/screenshots/LineChart/persist-brush-zoom-dark-800w.webp b/docs/static/screenshots/LineChart/persist-brush-zoom-dark-800w.webp index 02cd3c6911..f38af236ca 100644 Binary files a/docs/static/screenshots/LineChart/persist-brush-zoom-dark-800w.webp and b/docs/static/screenshots/LineChart/persist-brush-zoom-dark-800w.webp differ diff --git a/docs/static/screenshots/LineChart/persist-brush-zoom-light-240w.webp b/docs/static/screenshots/LineChart/persist-brush-zoom-light-240w.webp index 41e8f4c429..fd24daa5cb 100644 Binary files a/docs/static/screenshots/LineChart/persist-brush-zoom-light-240w.webp and b/docs/static/screenshots/LineChart/persist-brush-zoom-light-240w.webp differ diff --git a/docs/static/screenshots/LineChart/persist-brush-zoom-light-400w.webp b/docs/static/screenshots/LineChart/persist-brush-zoom-light-400w.webp index 48fbfb37d7..30dff693a7 100644 Binary files a/docs/static/screenshots/LineChart/persist-brush-zoom-light-400w.webp and b/docs/static/screenshots/LineChart/persist-brush-zoom-light-400w.webp differ diff --git a/docs/static/screenshots/LineChart/persist-brush-zoom-light-800w.webp b/docs/static/screenshots/LineChart/persist-brush-zoom-light-800w.webp index 5e7d3badb1..26f71166a3 100644 Binary files a/docs/static/screenshots/LineChart/persist-brush-zoom-light-800w.webp and b/docs/static/screenshots/LineChart/persist-brush-zoom-light-800w.webp differ diff --git a/docs/static/screenshots/LineChart/persist-series-dark-240w.webp b/docs/static/screenshots/LineChart/persist-series-dark-240w.webp index fb7bb0f5fc..a09aa5dd12 100644 Binary files a/docs/static/screenshots/LineChart/persist-series-dark-240w.webp and b/docs/static/screenshots/LineChart/persist-series-dark-240w.webp differ diff --git a/docs/static/screenshots/LineChart/persist-series-dark-400w.webp b/docs/static/screenshots/LineChart/persist-series-dark-400w.webp index 50646b3dff..933d6a9bb6 100644 Binary files a/docs/static/screenshots/LineChart/persist-series-dark-400w.webp and b/docs/static/screenshots/LineChart/persist-series-dark-400w.webp differ diff --git a/docs/static/screenshots/LineChart/persist-series-dark-800w.webp b/docs/static/screenshots/LineChart/persist-series-dark-800w.webp index fe64f4a6de..903ae5722a 100644 Binary files a/docs/static/screenshots/LineChart/persist-series-dark-800w.webp and b/docs/static/screenshots/LineChart/persist-series-dark-800w.webp differ diff --git a/docs/static/screenshots/LineChart/persist-series-light-240w.webp b/docs/static/screenshots/LineChart/persist-series-light-240w.webp index 48bb71a7cb..e5a8fa85ef 100644 Binary files a/docs/static/screenshots/LineChart/persist-series-light-240w.webp and b/docs/static/screenshots/LineChart/persist-series-light-240w.webp differ diff --git a/docs/static/screenshots/LineChart/persist-series-light-400w.webp b/docs/static/screenshots/LineChart/persist-series-light-400w.webp index ba2c5875c6..702d71e331 100644 Binary files a/docs/static/screenshots/LineChart/persist-series-light-400w.webp and b/docs/static/screenshots/LineChart/persist-series-light-400w.webp differ diff --git a/docs/static/screenshots/LineChart/persist-series-light-800w.webp b/docs/static/screenshots/LineChart/persist-series-light-800w.webp index dcb6cf0c5c..3fbb1f7e8c 100644 Binary files a/docs/static/screenshots/LineChart/persist-series-light-800w.webp and b/docs/static/screenshots/LineChart/persist-series-light-800w.webp differ diff --git a/docs/static/screenshots/LineChart/point-annotations-dark-240w.webp b/docs/static/screenshots/LineChart/point-annotations-dark-240w.webp index 740676adb9..b697aa105b 100644 Binary files a/docs/static/screenshots/LineChart/point-annotations-dark-240w.webp and b/docs/static/screenshots/LineChart/point-annotations-dark-240w.webp differ diff --git a/docs/static/screenshots/LineChart/point-annotations-dark-400w.webp b/docs/static/screenshots/LineChart/point-annotations-dark-400w.webp index a5cefa19d2..7f06101f8a 100644 Binary files a/docs/static/screenshots/LineChart/point-annotations-dark-400w.webp and b/docs/static/screenshots/LineChart/point-annotations-dark-400w.webp differ diff --git a/docs/static/screenshots/LineChart/point-annotations-dark-800w.webp b/docs/static/screenshots/LineChart/point-annotations-dark-800w.webp index 8bfa07085e..2de2589966 100644 Binary files a/docs/static/screenshots/LineChart/point-annotations-dark-800w.webp and b/docs/static/screenshots/LineChart/point-annotations-dark-800w.webp differ diff --git a/docs/static/screenshots/LineChart/point-annotations-light-240w.webp b/docs/static/screenshots/LineChart/point-annotations-light-240w.webp index 6475c0feaa..757740d255 100644 Binary files a/docs/static/screenshots/LineChart/point-annotations-light-240w.webp and b/docs/static/screenshots/LineChart/point-annotations-light-240w.webp differ diff --git a/docs/static/screenshots/LineChart/point-annotations-light-400w.webp b/docs/static/screenshots/LineChart/point-annotations-light-400w.webp index 7eb8fb17e0..b9618a5574 100644 Binary files a/docs/static/screenshots/LineChart/point-annotations-light-400w.webp and b/docs/static/screenshots/LineChart/point-annotations-light-400w.webp differ diff --git a/docs/static/screenshots/LineChart/point-annotations-light-800w.webp b/docs/static/screenshots/LineChart/point-annotations-light-800w.webp index 8f2b353d00..75f103edef 100644 Binary files a/docs/static/screenshots/LineChart/point-annotations-light-800w.webp and b/docs/static/screenshots/LineChart/point-annotations-light-800w.webp differ diff --git a/docs/static/screenshots/LineChart/points-dark-240w.webp b/docs/static/screenshots/LineChart/points-dark-240w.webp index aa9112dea4..217da00e09 100644 Binary files a/docs/static/screenshots/LineChart/points-dark-240w.webp and b/docs/static/screenshots/LineChart/points-dark-240w.webp differ diff --git a/docs/static/screenshots/LineChart/points-dark-400w.webp b/docs/static/screenshots/LineChart/points-dark-400w.webp index 3e1ffdd05f..be11de0daf 100644 Binary files a/docs/static/screenshots/LineChart/points-dark-400w.webp and b/docs/static/screenshots/LineChart/points-dark-400w.webp differ diff --git a/docs/static/screenshots/LineChart/points-dark-800w.webp b/docs/static/screenshots/LineChart/points-dark-800w.webp index bb37c3f6b8..64ba881a40 100644 Binary files a/docs/static/screenshots/LineChart/points-dark-800w.webp and b/docs/static/screenshots/LineChart/points-dark-800w.webp differ diff --git a/docs/static/screenshots/LineChart/points-light-240w.webp b/docs/static/screenshots/LineChart/points-light-240w.webp index d1ba9ed31c..4a52773ebe 100644 Binary files a/docs/static/screenshots/LineChart/points-light-240w.webp and b/docs/static/screenshots/LineChart/points-light-240w.webp differ diff --git a/docs/static/screenshots/LineChart/points-light-400w.webp b/docs/static/screenshots/LineChart/points-light-400w.webp index 9e14562a8b..fe39a7baef 100644 Binary files a/docs/static/screenshots/LineChart/points-light-400w.webp and b/docs/static/screenshots/LineChart/points-light-400w.webp differ diff --git a/docs/static/screenshots/LineChart/points-light-800w.webp b/docs/static/screenshots/LineChart/points-light-800w.webp index 94b6d176ce..454f30d672 100644 Binary files a/docs/static/screenshots/LineChart/points-light-800w.webp and b/docs/static/screenshots/LineChart/points-light-800w.webp differ diff --git a/docs/static/screenshots/LineChart/radar-dark-240w.webp b/docs/static/screenshots/LineChart/radar-dark-240w.webp index 0e711954f5..7e38ab4a24 100644 Binary files a/docs/static/screenshots/LineChart/radar-dark-240w.webp and b/docs/static/screenshots/LineChart/radar-dark-240w.webp differ diff --git a/docs/static/screenshots/LineChart/radar-dark-400w.webp b/docs/static/screenshots/LineChart/radar-dark-400w.webp index cbc3d1aadc..05f746a374 100644 Binary files a/docs/static/screenshots/LineChart/radar-dark-400w.webp and b/docs/static/screenshots/LineChart/radar-dark-400w.webp differ diff --git a/docs/static/screenshots/LineChart/radar-dark-800w.webp b/docs/static/screenshots/LineChart/radar-dark-800w.webp index 1d8f82d405..550d8704b9 100644 Binary files a/docs/static/screenshots/LineChart/radar-dark-800w.webp and b/docs/static/screenshots/LineChart/radar-dark-800w.webp differ diff --git a/docs/static/screenshots/LineChart/radar-light-800w.webp b/docs/static/screenshots/LineChart/radar-light-800w.webp index bdaedebcc1..039dbc8c9d 100644 Binary files a/docs/static/screenshots/LineChart/radar-light-800w.webp and b/docs/static/screenshots/LineChart/radar-light-800w.webp differ diff --git a/docs/static/screenshots/LineChart/radar-rounded-dark-800w.webp b/docs/static/screenshots/LineChart/radar-rounded-dark-800w.webp index 8fb5561b2c..427e9ee81c 100644 Binary files a/docs/static/screenshots/LineChart/radar-rounded-dark-800w.webp and b/docs/static/screenshots/LineChart/radar-rounded-dark-800w.webp differ diff --git a/docs/static/screenshots/LineChart/radar-rounded-light-800w.webp b/docs/static/screenshots/LineChart/radar-rounded-light-800w.webp index e3a7fbfe97..6fed7449e3 100644 Binary files a/docs/static/screenshots/LineChart/radar-rounded-light-800w.webp and b/docs/static/screenshots/LineChart/radar-rounded-light-800w.webp differ diff --git a/docs/static/screenshots/LineChart/radar-series-dark-400w.webp b/docs/static/screenshots/LineChart/radar-series-dark-400w.webp index fad8e3b242..b0cb3ae455 100644 Binary files a/docs/static/screenshots/LineChart/radar-series-dark-400w.webp and b/docs/static/screenshots/LineChart/radar-series-dark-400w.webp differ diff --git a/docs/static/screenshots/LineChart/radar-series-dark-800w.webp b/docs/static/screenshots/LineChart/radar-series-dark-800w.webp index ab60366f0b..b78720ae3e 100644 Binary files a/docs/static/screenshots/LineChart/radar-series-dark-800w.webp and b/docs/static/screenshots/LineChart/radar-series-dark-800w.webp differ diff --git a/docs/static/screenshots/LineChart/radar-series-light-400w.webp b/docs/static/screenshots/LineChart/radar-series-light-400w.webp index e6e1d5f0a7..7021ca0ad7 100644 Binary files a/docs/static/screenshots/LineChart/radar-series-light-400w.webp and b/docs/static/screenshots/LineChart/radar-series-light-400w.webp differ diff --git a/docs/static/screenshots/LineChart/radar-series-light-800w.webp b/docs/static/screenshots/LineChart/radar-series-light-800w.webp index 12783585a9..9b91b82f05 100644 Binary files a/docs/static/screenshots/LineChart/radar-series-light-800w.webp and b/docs/static/screenshots/LineChart/radar-series-light-800w.webp differ diff --git a/docs/static/screenshots/LineChart/range-annotation-dark-240w.webp b/docs/static/screenshots/LineChart/range-annotation-dark-240w.webp index e728e83366..0caafbb94d 100644 Binary files a/docs/static/screenshots/LineChart/range-annotation-dark-240w.webp and b/docs/static/screenshots/LineChart/range-annotation-dark-240w.webp differ diff --git a/docs/static/screenshots/LineChart/range-annotation-dark-800w.webp b/docs/static/screenshots/LineChart/range-annotation-dark-800w.webp index 8b94e2a05b..92a0354ba4 100644 Binary files a/docs/static/screenshots/LineChart/range-annotation-dark-800w.webp and b/docs/static/screenshots/LineChart/range-annotation-dark-800w.webp differ diff --git a/docs/static/screenshots/LineChart/range-annotation-light-400w.webp b/docs/static/screenshots/LineChart/range-annotation-light-400w.webp index f03224878c..da7cebdd69 100644 Binary files a/docs/static/screenshots/LineChart/range-annotation-light-400w.webp and b/docs/static/screenshots/LineChart/range-annotation-light-400w.webp differ diff --git a/docs/static/screenshots/LineChart/range-annotation-light-800w.webp b/docs/static/screenshots/LineChart/range-annotation-light-800w.webp index ca4bdd8504..aff3528a4e 100644 Binary files a/docs/static/screenshots/LineChart/range-annotation-light-800w.webp and b/docs/static/screenshots/LineChart/range-annotation-light-800w.webp differ diff --git a/docs/static/screenshots/LineChart/series-brush-dark-240w.webp b/docs/static/screenshots/LineChart/series-brush-dark-240w.webp index 4af69c7ae7..0ddb3926f5 100644 Binary files a/docs/static/screenshots/LineChart/series-brush-dark-240w.webp and b/docs/static/screenshots/LineChart/series-brush-dark-240w.webp differ diff --git a/docs/static/screenshots/LineChart/series-brush-dark-400w.webp b/docs/static/screenshots/LineChart/series-brush-dark-400w.webp index 019007e6e6..922dbb40f2 100644 Binary files a/docs/static/screenshots/LineChart/series-brush-dark-400w.webp and b/docs/static/screenshots/LineChart/series-brush-dark-400w.webp differ diff --git a/docs/static/screenshots/LineChart/series-brush-dark-800w.webp b/docs/static/screenshots/LineChart/series-brush-dark-800w.webp index 7d81c96628..46d17484c9 100644 Binary files a/docs/static/screenshots/LineChart/series-brush-dark-800w.webp and b/docs/static/screenshots/LineChart/series-brush-dark-800w.webp differ diff --git a/docs/static/screenshots/LineChart/series-brush-light-240w.webp b/docs/static/screenshots/LineChart/series-brush-light-240w.webp index 388422e3e5..bcff43bd50 100644 Binary files a/docs/static/screenshots/LineChart/series-brush-light-240w.webp and b/docs/static/screenshots/LineChart/series-brush-light-240w.webp differ diff --git a/docs/static/screenshots/LineChart/series-brush-light-400w.webp b/docs/static/screenshots/LineChart/series-brush-light-400w.webp index 08c54459dc..766c348136 100644 Binary files a/docs/static/screenshots/LineChart/series-brush-light-400w.webp and b/docs/static/screenshots/LineChart/series-brush-light-400w.webp differ diff --git a/docs/static/screenshots/LineChart/series-brush-light-800w.webp b/docs/static/screenshots/LineChart/series-brush-light-800w.webp index 4cb2f1b629..61c0a644b3 100644 Binary files a/docs/static/screenshots/LineChart/series-brush-light-800w.webp and b/docs/static/screenshots/LineChart/series-brush-light-800w.webp differ diff --git a/docs/static/screenshots/LineChart/series-custom-highlight-point-dark-240w.webp b/docs/static/screenshots/LineChart/series-custom-highlight-point-dark-240w.webp index 2603c6b92a..f21f335a32 100644 Binary files a/docs/static/screenshots/LineChart/series-custom-highlight-point-dark-240w.webp and b/docs/static/screenshots/LineChart/series-custom-highlight-point-dark-240w.webp differ diff --git a/docs/static/screenshots/LineChart/series-custom-highlight-point-dark-400w.webp b/docs/static/screenshots/LineChart/series-custom-highlight-point-dark-400w.webp index 70efa94fda..876668f1a8 100644 Binary files a/docs/static/screenshots/LineChart/series-custom-highlight-point-dark-400w.webp and b/docs/static/screenshots/LineChart/series-custom-highlight-point-dark-400w.webp differ diff --git a/docs/static/screenshots/LineChart/series-custom-highlight-point-dark-800w.webp b/docs/static/screenshots/LineChart/series-custom-highlight-point-dark-800w.webp index 3e6c6cbe17..ab323968a1 100644 Binary files a/docs/static/screenshots/LineChart/series-custom-highlight-point-dark-800w.webp and b/docs/static/screenshots/LineChart/series-custom-highlight-point-dark-800w.webp differ diff --git a/docs/static/screenshots/LineChart/series-custom-highlight-point-light-240w.webp b/docs/static/screenshots/LineChart/series-custom-highlight-point-light-240w.webp index fd79c27a34..025a2e8f03 100644 Binary files a/docs/static/screenshots/LineChart/series-custom-highlight-point-light-240w.webp and b/docs/static/screenshots/LineChart/series-custom-highlight-point-light-240w.webp differ diff --git a/docs/static/screenshots/LineChart/series-custom-highlight-point-light-400w.webp b/docs/static/screenshots/LineChart/series-custom-highlight-point-light-400w.webp index 7b076112d5..6b1d00107c 100644 Binary files a/docs/static/screenshots/LineChart/series-custom-highlight-point-light-400w.webp and b/docs/static/screenshots/LineChart/series-custom-highlight-point-light-400w.webp differ diff --git a/docs/static/screenshots/LineChart/series-custom-highlight-point-light-800w.webp b/docs/static/screenshots/LineChart/series-custom-highlight-point-light-800w.webp index 85cf4a5934..d264a8c8f1 100644 Binary files a/docs/static/screenshots/LineChart/series-custom-highlight-point-light-800w.webp and b/docs/static/screenshots/LineChart/series-custom-highlight-point-light-800w.webp differ diff --git a/docs/static/screenshots/LineChart/series-dark-240w.webp b/docs/static/screenshots/LineChart/series-dark-240w.webp index 4e4ebeaf7c..0ac9149cf9 100644 Binary files a/docs/static/screenshots/LineChart/series-dark-240w.webp and b/docs/static/screenshots/LineChart/series-dark-240w.webp differ diff --git a/docs/static/screenshots/LineChart/series-dark-400w.webp b/docs/static/screenshots/LineChart/series-dark-400w.webp index 2e5a31e419..9adf2fd01f 100644 Binary files a/docs/static/screenshots/LineChart/series-dark-400w.webp and b/docs/static/screenshots/LineChart/series-dark-400w.webp differ diff --git a/docs/static/screenshots/LineChart/series-dark-800w.webp b/docs/static/screenshots/LineChart/series-dark-800w.webp index a445074592..ad63d48b4b 100644 Binary files a/docs/static/screenshots/LineChart/series-dark-800w.webp and b/docs/static/screenshots/LineChart/series-dark-800w.webp differ diff --git a/docs/static/screenshots/LineChart/series-individual-tooltip-dark-240w.webp b/docs/static/screenshots/LineChart/series-individual-tooltip-dark-240w.webp index 8fe286baae..7d5641cf79 100644 Binary files a/docs/static/screenshots/LineChart/series-individual-tooltip-dark-240w.webp and b/docs/static/screenshots/LineChart/series-individual-tooltip-dark-240w.webp differ diff --git a/docs/static/screenshots/LineChart/series-individual-tooltip-dark-400w.webp b/docs/static/screenshots/LineChart/series-individual-tooltip-dark-400w.webp index a697983804..99e4c0b96f 100644 Binary files a/docs/static/screenshots/LineChart/series-individual-tooltip-dark-400w.webp and b/docs/static/screenshots/LineChart/series-individual-tooltip-dark-400w.webp differ diff --git a/docs/static/screenshots/LineChart/series-individual-tooltip-dark-800w.webp b/docs/static/screenshots/LineChart/series-individual-tooltip-dark-800w.webp index 75da987831..8ba2c0758c 100644 Binary files a/docs/static/screenshots/LineChart/series-individual-tooltip-dark-800w.webp and b/docs/static/screenshots/LineChart/series-individual-tooltip-dark-800w.webp differ diff --git a/docs/static/screenshots/LineChart/series-individual-tooltip-light-240w.webp b/docs/static/screenshots/LineChart/series-individual-tooltip-light-240w.webp index 035fcc2fdf..65e03763ef 100644 Binary files a/docs/static/screenshots/LineChart/series-individual-tooltip-light-240w.webp and b/docs/static/screenshots/LineChart/series-individual-tooltip-light-240w.webp differ diff --git a/docs/static/screenshots/LineChart/series-individual-tooltip-light-400w.webp b/docs/static/screenshots/LineChart/series-individual-tooltip-light-400w.webp index 8938b344ef..dbfcaa5259 100644 Binary files a/docs/static/screenshots/LineChart/series-individual-tooltip-light-400w.webp and b/docs/static/screenshots/LineChart/series-individual-tooltip-light-400w.webp differ diff --git a/docs/static/screenshots/LineChart/series-individual-tooltip-light-800w.webp b/docs/static/screenshots/LineChart/series-individual-tooltip-light-800w.webp index 283b8f4c48..a7472c9765 100644 Binary files a/docs/static/screenshots/LineChart/series-individual-tooltip-light-800w.webp and b/docs/static/screenshots/LineChart/series-individual-tooltip-light-800w.webp differ diff --git a/docs/static/screenshots/LineChart/series-labels-hover-dark-240w.webp b/docs/static/screenshots/LineChart/series-labels-hover-dark-240w.webp index 1c0d1662fd..a887b43b3a 100644 Binary files a/docs/static/screenshots/LineChart/series-labels-hover-dark-240w.webp and b/docs/static/screenshots/LineChart/series-labels-hover-dark-240w.webp differ diff --git a/docs/static/screenshots/LineChart/series-labels-hover-dark-400w.webp b/docs/static/screenshots/LineChart/series-labels-hover-dark-400w.webp index a8efde8b21..98c3745a95 100644 Binary files a/docs/static/screenshots/LineChart/series-labels-hover-dark-400w.webp and b/docs/static/screenshots/LineChart/series-labels-hover-dark-400w.webp differ diff --git a/docs/static/screenshots/LineChart/series-labels-hover-dark-800w.webp b/docs/static/screenshots/LineChart/series-labels-hover-dark-800w.webp index 76cb5ac03c..5318c23e6a 100644 Binary files a/docs/static/screenshots/LineChart/series-labels-hover-dark-800w.webp and b/docs/static/screenshots/LineChart/series-labels-hover-dark-800w.webp differ diff --git a/docs/static/screenshots/LineChart/series-labels-hover-light-240w.webp b/docs/static/screenshots/LineChart/series-labels-hover-light-240w.webp index f42de88f83..8fae176d85 100644 Binary files a/docs/static/screenshots/LineChart/series-labels-hover-light-240w.webp and b/docs/static/screenshots/LineChart/series-labels-hover-light-240w.webp differ diff --git a/docs/static/screenshots/LineChart/series-labels-hover-light-400w.webp b/docs/static/screenshots/LineChart/series-labels-hover-light-400w.webp index 495538c56f..ad6bb7a1ba 100644 Binary files a/docs/static/screenshots/LineChart/series-labels-hover-light-400w.webp and b/docs/static/screenshots/LineChart/series-labels-hover-light-400w.webp differ diff --git a/docs/static/screenshots/LineChart/series-labels-hover-light-800w.webp b/docs/static/screenshots/LineChart/series-labels-hover-light-800w.webp index 4c30dfacd5..f6bb28aaf4 100644 Binary files a/docs/static/screenshots/LineChart/series-labels-hover-light-800w.webp and b/docs/static/screenshots/LineChart/series-labels-hover-light-800w.webp differ diff --git a/docs/static/screenshots/LineChart/series-light-240w.webp b/docs/static/screenshots/LineChart/series-light-240w.webp index 5f9052391b..b10c274632 100644 Binary files a/docs/static/screenshots/LineChart/series-light-240w.webp and b/docs/static/screenshots/LineChart/series-light-240w.webp differ diff --git a/docs/static/screenshots/LineChart/series-light-400w.webp b/docs/static/screenshots/LineChart/series-light-400w.webp index 5218906e50..eaf0f1472a 100644 Binary files a/docs/static/screenshots/LineChart/series-light-400w.webp and b/docs/static/screenshots/LineChart/series-light-400w.webp differ diff --git a/docs/static/screenshots/LineChart/series-light-800w.webp b/docs/static/screenshots/LineChart/series-light-800w.webp index 55541ebeeb..8f3867e962 100644 Binary files a/docs/static/screenshots/LineChart/series-light-800w.webp and b/docs/static/screenshots/LineChart/series-light-800w.webp differ diff --git a/docs/static/screenshots/LineChart/series-point-annotations-dark-240w.webp b/docs/static/screenshots/LineChart/series-point-annotations-dark-240w.webp index 135109b8c9..3b058a49c2 100644 Binary files a/docs/static/screenshots/LineChart/series-point-annotations-dark-240w.webp and b/docs/static/screenshots/LineChart/series-point-annotations-dark-240w.webp differ diff --git a/docs/static/screenshots/LineChart/series-point-annotations-dark-400w.webp b/docs/static/screenshots/LineChart/series-point-annotations-dark-400w.webp index cd15d7c47f..6a03b63d03 100644 Binary files a/docs/static/screenshots/LineChart/series-point-annotations-dark-400w.webp and b/docs/static/screenshots/LineChart/series-point-annotations-dark-400w.webp differ diff --git a/docs/static/screenshots/LineChart/series-point-annotations-dark-800w.webp b/docs/static/screenshots/LineChart/series-point-annotations-dark-800w.webp index 97c687fa9b..8a97088577 100644 Binary files a/docs/static/screenshots/LineChart/series-point-annotations-dark-800w.webp and b/docs/static/screenshots/LineChart/series-point-annotations-dark-800w.webp differ diff --git a/docs/static/screenshots/LineChart/series-point-annotations-light-240w.webp b/docs/static/screenshots/LineChart/series-point-annotations-light-240w.webp index eef8d5398e..980a0a7984 100644 Binary files a/docs/static/screenshots/LineChart/series-point-annotations-light-240w.webp and b/docs/static/screenshots/LineChart/series-point-annotations-light-240w.webp differ diff --git a/docs/static/screenshots/LineChart/series-point-annotations-light-400w.webp b/docs/static/screenshots/LineChart/series-point-annotations-light-400w.webp index 50bf0b077c..74751b1234 100644 Binary files a/docs/static/screenshots/LineChart/series-point-annotations-light-400w.webp and b/docs/static/screenshots/LineChart/series-point-annotations-light-400w.webp differ diff --git a/docs/static/screenshots/LineChart/series-point-annotations-light-800w.webp b/docs/static/screenshots/LineChart/series-point-annotations-light-800w.webp index 73dd03a508..90d5c47f8f 100644 Binary files a/docs/static/screenshots/LineChart/series-point-annotations-light-800w.webp and b/docs/static/screenshots/LineChart/series-point-annotations-light-800w.webp differ diff --git a/docs/static/screenshots/LineChart/series-point-click-dark-240w.webp b/docs/static/screenshots/LineChart/series-point-click-dark-240w.webp index 952efb1543..1298014e5c 100644 Binary files a/docs/static/screenshots/LineChart/series-point-click-dark-240w.webp and b/docs/static/screenshots/LineChart/series-point-click-dark-240w.webp differ diff --git a/docs/static/screenshots/LineChart/series-point-click-dark-400w.webp b/docs/static/screenshots/LineChart/series-point-click-dark-400w.webp index 364ca24636..a86bf7871c 100644 Binary files a/docs/static/screenshots/LineChart/series-point-click-dark-400w.webp and b/docs/static/screenshots/LineChart/series-point-click-dark-400w.webp differ diff --git a/docs/static/screenshots/LineChart/series-point-click-dark-800w.webp b/docs/static/screenshots/LineChart/series-point-click-dark-800w.webp index f67eb5a545..70d08d3107 100644 Binary files a/docs/static/screenshots/LineChart/series-point-click-dark-800w.webp and b/docs/static/screenshots/LineChart/series-point-click-dark-800w.webp differ diff --git a/docs/static/screenshots/LineChart/series-point-click-light-240w.webp b/docs/static/screenshots/LineChart/series-point-click-light-240w.webp index 252806abd9..771dd70864 100644 Binary files a/docs/static/screenshots/LineChart/series-point-click-light-240w.webp and b/docs/static/screenshots/LineChart/series-point-click-light-240w.webp differ diff --git a/docs/static/screenshots/LineChart/series-point-click-light-400w.webp b/docs/static/screenshots/LineChart/series-point-click-light-400w.webp index c841f915f9..40bf4b0bb7 100644 Binary files a/docs/static/screenshots/LineChart/series-point-click-light-400w.webp and b/docs/static/screenshots/LineChart/series-point-click-light-400w.webp differ diff --git a/docs/static/screenshots/LineChart/series-point-click-light-800w.webp b/docs/static/screenshots/LineChart/series-point-click-light-800w.webp index bc99217f71..c55298180a 100644 Binary files a/docs/static/screenshots/LineChart/series-point-click-light-800w.webp and b/docs/static/screenshots/LineChart/series-point-click-light-800w.webp differ diff --git a/docs/static/screenshots/LineChart/series-programmatic-control-dark-240w.webp b/docs/static/screenshots/LineChart/series-programmatic-control-dark-240w.webp index 9c8cc9ef6a..c493a6b253 100644 Binary files a/docs/static/screenshots/LineChart/series-programmatic-control-dark-240w.webp and b/docs/static/screenshots/LineChart/series-programmatic-control-dark-240w.webp differ diff --git a/docs/static/screenshots/LineChart/series-programmatic-control-dark-400w.webp b/docs/static/screenshots/LineChart/series-programmatic-control-dark-400w.webp index bce49473f3..4d36d07c4e 100644 Binary files a/docs/static/screenshots/LineChart/series-programmatic-control-dark-400w.webp and b/docs/static/screenshots/LineChart/series-programmatic-control-dark-400w.webp differ diff --git a/docs/static/screenshots/LineChart/series-programmatic-control-dark-800w.webp b/docs/static/screenshots/LineChart/series-programmatic-control-dark-800w.webp index a3bae34566..fa3370c47c 100644 Binary files a/docs/static/screenshots/LineChart/series-programmatic-control-dark-800w.webp and b/docs/static/screenshots/LineChart/series-programmatic-control-dark-800w.webp differ diff --git a/docs/static/screenshots/LineChart/series-programmatic-control-light-240w.webp b/docs/static/screenshots/LineChart/series-programmatic-control-light-240w.webp index c133adab33..38015eccf2 100644 Binary files a/docs/static/screenshots/LineChart/series-programmatic-control-light-240w.webp and b/docs/static/screenshots/LineChart/series-programmatic-control-light-240w.webp differ diff --git a/docs/static/screenshots/LineChart/series-programmatic-control-light-400w.webp b/docs/static/screenshots/LineChart/series-programmatic-control-light-400w.webp index a86900675b..6f2d855cd6 100644 Binary files a/docs/static/screenshots/LineChart/series-programmatic-control-light-400w.webp and b/docs/static/screenshots/LineChart/series-programmatic-control-light-400w.webp differ diff --git a/docs/static/screenshots/LineChart/series-programmatic-control-light-800w.webp b/docs/static/screenshots/LineChart/series-programmatic-control-light-800w.webp index 9aab7cd561..6192275a28 100644 Binary files a/docs/static/screenshots/LineChart/series-programmatic-control-light-800w.webp and b/docs/static/screenshots/LineChart/series-programmatic-control-light-800w.webp differ diff --git a/docs/static/screenshots/LineChart/series-separate-data-dark-240w.webp b/docs/static/screenshots/LineChart/series-separate-data-dark-240w.webp index 70c6e0a8c4..c9c0c3775c 100644 Binary files a/docs/static/screenshots/LineChart/series-separate-data-dark-240w.webp and b/docs/static/screenshots/LineChart/series-separate-data-dark-240w.webp differ diff --git a/docs/static/screenshots/LineChart/series-separate-data-dark-400w.webp b/docs/static/screenshots/LineChart/series-separate-data-dark-400w.webp index 6ff499a33e..0116050913 100644 Binary files a/docs/static/screenshots/LineChart/series-separate-data-dark-400w.webp and b/docs/static/screenshots/LineChart/series-separate-data-dark-400w.webp differ diff --git a/docs/static/screenshots/LineChart/series-separate-data-dark-800w.webp b/docs/static/screenshots/LineChart/series-separate-data-dark-800w.webp index 70af7303bb..cfa249da75 100644 Binary files a/docs/static/screenshots/LineChart/series-separate-data-dark-800w.webp and b/docs/static/screenshots/LineChart/series-separate-data-dark-800w.webp differ diff --git a/docs/static/screenshots/LineChart/series-separate-data-diff-length-dark-240w.webp b/docs/static/screenshots/LineChart/series-separate-data-diff-length-dark-240w.webp index d792ffe21d..22e45c184f 100644 Binary files a/docs/static/screenshots/LineChart/series-separate-data-diff-length-dark-240w.webp and b/docs/static/screenshots/LineChart/series-separate-data-diff-length-dark-240w.webp differ diff --git a/docs/static/screenshots/LineChart/series-separate-data-diff-length-dark-400w.webp b/docs/static/screenshots/LineChart/series-separate-data-diff-length-dark-400w.webp index 49016bdb14..7e2da00a76 100644 Binary files a/docs/static/screenshots/LineChart/series-separate-data-diff-length-dark-400w.webp and b/docs/static/screenshots/LineChart/series-separate-data-diff-length-dark-400w.webp differ diff --git a/docs/static/screenshots/LineChart/series-separate-data-diff-length-dark-800w.webp b/docs/static/screenshots/LineChart/series-separate-data-diff-length-dark-800w.webp index 5f93ca6977..8ad8910738 100644 Binary files a/docs/static/screenshots/LineChart/series-separate-data-diff-length-dark-800w.webp and b/docs/static/screenshots/LineChart/series-separate-data-diff-length-dark-800w.webp differ diff --git a/docs/static/screenshots/LineChart/series-separate-data-diff-length-light-240w.webp b/docs/static/screenshots/LineChart/series-separate-data-diff-length-light-240w.webp index 51a63eff4f..097ab97ac8 100644 Binary files a/docs/static/screenshots/LineChart/series-separate-data-diff-length-light-240w.webp and b/docs/static/screenshots/LineChart/series-separate-data-diff-length-light-240w.webp differ diff --git a/docs/static/screenshots/LineChart/series-separate-data-diff-length-light-400w.webp b/docs/static/screenshots/LineChart/series-separate-data-diff-length-light-400w.webp index 22675f1e83..1daacca6ff 100644 Binary files a/docs/static/screenshots/LineChart/series-separate-data-diff-length-light-400w.webp and b/docs/static/screenshots/LineChart/series-separate-data-diff-length-light-400w.webp differ diff --git a/docs/static/screenshots/LineChart/series-separate-data-diff-length-light-800w.webp b/docs/static/screenshots/LineChart/series-separate-data-diff-length-light-800w.webp index a9900f1f6d..958887614c 100644 Binary files a/docs/static/screenshots/LineChart/series-separate-data-diff-length-light-800w.webp and b/docs/static/screenshots/LineChart/series-separate-data-diff-length-light-800w.webp differ diff --git a/docs/static/screenshots/LineChart/series-separate-data-light-240w.webp b/docs/static/screenshots/LineChart/series-separate-data-light-240w.webp index af76ecf75a..043c0f29e2 100644 Binary files a/docs/static/screenshots/LineChart/series-separate-data-light-240w.webp and b/docs/static/screenshots/LineChart/series-separate-data-light-240w.webp differ diff --git a/docs/static/screenshots/LineChart/series-separate-data-light-400w.webp b/docs/static/screenshots/LineChart/series-separate-data-light-400w.webp index 58203c8bb5..40624c01bf 100644 Binary files a/docs/static/screenshots/LineChart/series-separate-data-light-400w.webp and b/docs/static/screenshots/LineChart/series-separate-data-light-400w.webp differ diff --git a/docs/static/screenshots/LineChart/series-separate-data-light-800w.webp b/docs/static/screenshots/LineChart/series-separate-data-light-800w.webp index 829a13c2f4..5f83f327d6 100644 Binary files a/docs/static/screenshots/LineChart/series-separate-data-light-800w.webp and b/docs/static/screenshots/LineChart/series-separate-data-light-800w.webp differ diff --git a/docs/static/screenshots/LineChart/series-vertical-dark-240w.webp b/docs/static/screenshots/LineChart/series-vertical-dark-240w.webp index 5b943a1a27..8ee497989e 100644 Binary files a/docs/static/screenshots/LineChart/series-vertical-dark-240w.webp and b/docs/static/screenshots/LineChart/series-vertical-dark-240w.webp differ diff --git a/docs/static/screenshots/LineChart/series-vertical-dark-400w.webp b/docs/static/screenshots/LineChart/series-vertical-dark-400w.webp index 7799d35c0c..5fcda58610 100644 Binary files a/docs/static/screenshots/LineChart/series-vertical-dark-400w.webp and b/docs/static/screenshots/LineChart/series-vertical-dark-400w.webp differ diff --git a/docs/static/screenshots/LineChart/series-vertical-dark-800w.webp b/docs/static/screenshots/LineChart/series-vertical-dark-800w.webp index 7799d35c0c..5fcda58610 100644 Binary files a/docs/static/screenshots/LineChart/series-vertical-dark-800w.webp and b/docs/static/screenshots/LineChart/series-vertical-dark-800w.webp differ diff --git a/docs/static/screenshots/LineChart/series-vertical-light-240w.webp b/docs/static/screenshots/LineChart/series-vertical-light-240w.webp index 3da72f5992..f728381b6e 100644 Binary files a/docs/static/screenshots/LineChart/series-vertical-light-240w.webp and b/docs/static/screenshots/LineChart/series-vertical-light-240w.webp differ diff --git a/docs/static/screenshots/LineChart/series-vertical-light-400w.webp b/docs/static/screenshots/LineChart/series-vertical-light-400w.webp index 2574445409..5ea21508e3 100644 Binary files a/docs/static/screenshots/LineChart/series-vertical-light-400w.webp and b/docs/static/screenshots/LineChart/series-vertical-light-400w.webp differ diff --git a/docs/static/screenshots/LineChart/series-vertical-light-800w.webp b/docs/static/screenshots/LineChart/series-vertical-light-800w.webp index 2574445409..5ea21508e3 100644 Binary files a/docs/static/screenshots/LineChart/series-vertical-light-800w.webp and b/docs/static/screenshots/LineChart/series-vertical-light-800w.webp differ diff --git a/docs/static/screenshots/LineChart/series-with-nulls-dark-240w.webp b/docs/static/screenshots/LineChart/series-with-nulls-dark-240w.webp index 8846d90091..0bbac62fe0 100644 Binary files a/docs/static/screenshots/LineChart/series-with-nulls-dark-240w.webp and b/docs/static/screenshots/LineChart/series-with-nulls-dark-240w.webp differ diff --git a/docs/static/screenshots/LineChart/series-with-nulls-dark-400w.webp b/docs/static/screenshots/LineChart/series-with-nulls-dark-400w.webp index d0f52922f5..c60b35c10f 100644 Binary files a/docs/static/screenshots/LineChart/series-with-nulls-dark-400w.webp and b/docs/static/screenshots/LineChart/series-with-nulls-dark-400w.webp differ diff --git a/docs/static/screenshots/LineChart/series-with-nulls-dark-800w.webp b/docs/static/screenshots/LineChart/series-with-nulls-dark-800w.webp index c5e2e414b6..768c4ad720 100644 Binary files a/docs/static/screenshots/LineChart/series-with-nulls-dark-800w.webp and b/docs/static/screenshots/LineChart/series-with-nulls-dark-800w.webp differ diff --git a/docs/static/screenshots/LineChart/series-with-nulls-light-240w.webp b/docs/static/screenshots/LineChart/series-with-nulls-light-240w.webp index 6287ef9324..56b0504c2f 100644 Binary files a/docs/static/screenshots/LineChart/series-with-nulls-light-240w.webp and b/docs/static/screenshots/LineChart/series-with-nulls-light-240w.webp differ diff --git a/docs/static/screenshots/LineChart/series-with-nulls-light-400w.webp b/docs/static/screenshots/LineChart/series-with-nulls-light-400w.webp index ab70f01b4e..2ed6b009f5 100644 Binary files a/docs/static/screenshots/LineChart/series-with-nulls-light-400w.webp and b/docs/static/screenshots/LineChart/series-with-nulls-light-400w.webp differ diff --git a/docs/static/screenshots/LineChart/series-with-nulls-light-800w.webp b/docs/static/screenshots/LineChart/series-with-nulls-light-800w.webp index 564d82c5f5..2a310f522b 100644 Binary files a/docs/static/screenshots/LineChart/series-with-nulls-light-800w.webp and b/docs/static/screenshots/LineChart/series-with-nulls-light-800w.webp differ diff --git a/docs/static/screenshots/LineChart/single-axis-x-dark-240w.webp b/docs/static/screenshots/LineChart/single-axis-x-dark-240w.webp index e8d1c52a30..1751b36b36 100644 Binary files a/docs/static/screenshots/LineChart/single-axis-x-dark-240w.webp and b/docs/static/screenshots/LineChart/single-axis-x-dark-240w.webp differ diff --git a/docs/static/screenshots/LineChart/single-axis-x-dark-400w.webp b/docs/static/screenshots/LineChart/single-axis-x-dark-400w.webp index 999a66ab66..c386e6203e 100644 Binary files a/docs/static/screenshots/LineChart/single-axis-x-dark-400w.webp and b/docs/static/screenshots/LineChart/single-axis-x-dark-400w.webp differ diff --git a/docs/static/screenshots/LineChart/single-axis-x-dark-800w.webp b/docs/static/screenshots/LineChart/single-axis-x-dark-800w.webp index cd7b6a0fe0..0a70ced9ff 100644 Binary files a/docs/static/screenshots/LineChart/single-axis-x-dark-800w.webp and b/docs/static/screenshots/LineChart/single-axis-x-dark-800w.webp differ diff --git a/docs/static/screenshots/LineChart/single-axis-x-light-240w.webp b/docs/static/screenshots/LineChart/single-axis-x-light-240w.webp index aee1b777de..5184ab74ab 100644 Binary files a/docs/static/screenshots/LineChart/single-axis-x-light-240w.webp and b/docs/static/screenshots/LineChart/single-axis-x-light-240w.webp differ diff --git a/docs/static/screenshots/LineChart/single-axis-x-light-400w.webp b/docs/static/screenshots/LineChart/single-axis-x-light-400w.webp index dceb95cecb..47181e04af 100644 Binary files a/docs/static/screenshots/LineChart/single-axis-x-light-400w.webp and b/docs/static/screenshots/LineChart/single-axis-x-light-400w.webp differ diff --git a/docs/static/screenshots/LineChart/single-axis-x-light-800w.webp b/docs/static/screenshots/LineChart/single-axis-x-light-800w.webp index b4a161f86d..830104c0e3 100644 Binary files a/docs/static/screenshots/LineChart/single-axis-x-light-800w.webp and b/docs/static/screenshots/LineChart/single-axis-x-light-800w.webp differ diff --git a/docs/static/screenshots/LineChart/single-axis-y-dark-240w.webp b/docs/static/screenshots/LineChart/single-axis-y-dark-240w.webp index 496bf448ae..518d9e613e 100644 Binary files a/docs/static/screenshots/LineChart/single-axis-y-dark-240w.webp and b/docs/static/screenshots/LineChart/single-axis-y-dark-240w.webp differ diff --git a/docs/static/screenshots/LineChart/single-axis-y-dark-400w.webp b/docs/static/screenshots/LineChart/single-axis-y-dark-400w.webp index 929233a959..1c5bd258bc 100644 Binary files a/docs/static/screenshots/LineChart/single-axis-y-dark-400w.webp and b/docs/static/screenshots/LineChart/single-axis-y-dark-400w.webp differ diff --git a/docs/static/screenshots/LineChart/single-axis-y-dark-800w.webp b/docs/static/screenshots/LineChart/single-axis-y-dark-800w.webp index 5f84062073..3b274864cc 100644 Binary files a/docs/static/screenshots/LineChart/single-axis-y-dark-800w.webp and b/docs/static/screenshots/LineChart/single-axis-y-dark-800w.webp differ diff --git a/docs/static/screenshots/LineChart/single-axis-y-light-240w.webp b/docs/static/screenshots/LineChart/single-axis-y-light-240w.webp index 91c06c7a7d..c18c7027e1 100644 Binary files a/docs/static/screenshots/LineChart/single-axis-y-light-240w.webp and b/docs/static/screenshots/LineChart/single-axis-y-light-240w.webp differ diff --git a/docs/static/screenshots/LineChart/single-axis-y-light-400w.webp b/docs/static/screenshots/LineChart/single-axis-y-light-400w.webp index 8b1a2d5535..0352b89e59 100644 Binary files a/docs/static/screenshots/LineChart/single-axis-y-light-400w.webp and b/docs/static/screenshots/LineChart/single-axis-y-light-400w.webp differ diff --git a/docs/static/screenshots/LineChart/single-axis-y-light-800w.webp b/docs/static/screenshots/LineChart/single-axis-y-light-800w.webp index 0836f29a17..2087d88cb8 100644 Binary files a/docs/static/screenshots/LineChart/single-axis-y-light-800w.webp and b/docs/static/screenshots/LineChart/single-axis-y-light-800w.webp differ diff --git a/docs/static/screenshots/LineChart/smart-labels-with-points-dark-240w.webp b/docs/static/screenshots/LineChart/smart-labels-with-points-dark-240w.webp index 00ecb947ca..a88577d4c8 100644 Binary files a/docs/static/screenshots/LineChart/smart-labels-with-points-dark-240w.webp and b/docs/static/screenshots/LineChart/smart-labels-with-points-dark-240w.webp differ diff --git a/docs/static/screenshots/LineChart/smart-labels-with-points-dark-400w.webp b/docs/static/screenshots/LineChart/smart-labels-with-points-dark-400w.webp index 459783ac79..bc5821a762 100644 Binary files a/docs/static/screenshots/LineChart/smart-labels-with-points-dark-400w.webp and b/docs/static/screenshots/LineChart/smart-labels-with-points-dark-400w.webp differ diff --git a/docs/static/screenshots/LineChart/smart-labels-with-points-dark-800w.webp b/docs/static/screenshots/LineChart/smart-labels-with-points-dark-800w.webp index f6290ed6ed..497dd66792 100644 Binary files a/docs/static/screenshots/LineChart/smart-labels-with-points-dark-800w.webp and b/docs/static/screenshots/LineChart/smart-labels-with-points-dark-800w.webp differ diff --git a/docs/static/screenshots/LineChart/smart-labels-with-points-light-240w.webp b/docs/static/screenshots/LineChart/smart-labels-with-points-light-240w.webp index 45b921fe75..10056bc7e5 100644 Binary files a/docs/static/screenshots/LineChart/smart-labels-with-points-light-240w.webp and b/docs/static/screenshots/LineChart/smart-labels-with-points-light-240w.webp differ diff --git a/docs/static/screenshots/LineChart/smart-labels-with-points-light-400w.webp b/docs/static/screenshots/LineChart/smart-labels-with-points-light-400w.webp index 2e0c3ced7d..8b3a99498c 100644 Binary files a/docs/static/screenshots/LineChart/smart-labels-with-points-light-400w.webp and b/docs/static/screenshots/LineChart/smart-labels-with-points-light-400w.webp differ diff --git a/docs/static/screenshots/LineChart/smart-labels-with-points-light-800w.webp b/docs/static/screenshots/LineChart/smart-labels-with-points-light-800w.webp index f0780c5fa8..ed95e8fb8c 100644 Binary files a/docs/static/screenshots/LineChart/smart-labels-with-points-light-800w.webp and b/docs/static/screenshots/LineChart/smart-labels-with-points-light-800w.webp differ diff --git a/docs/static/screenshots/LineChart/sparkline-dark-240w.webp b/docs/static/screenshots/LineChart/sparkline-dark-240w.webp index 1756871474..7fa757f79d 100644 Binary files a/docs/static/screenshots/LineChart/sparkline-dark-240w.webp and b/docs/static/screenshots/LineChart/sparkline-dark-240w.webp differ diff --git a/docs/static/screenshots/LineChart/sparkline-dark-400w.webp b/docs/static/screenshots/LineChart/sparkline-dark-400w.webp index 1756871474..7fa757f79d 100644 Binary files a/docs/static/screenshots/LineChart/sparkline-dark-400w.webp and b/docs/static/screenshots/LineChart/sparkline-dark-400w.webp differ diff --git a/docs/static/screenshots/LineChart/sparkline-dark-800w.webp b/docs/static/screenshots/LineChart/sparkline-dark-800w.webp index 1756871474..7fa757f79d 100644 Binary files a/docs/static/screenshots/LineChart/sparkline-dark-800w.webp and b/docs/static/screenshots/LineChart/sparkline-dark-800w.webp differ diff --git a/docs/static/screenshots/LineChart/sparkline-fixed-position-tooltip-dark-240w.webp b/docs/static/screenshots/LineChart/sparkline-fixed-position-tooltip-dark-240w.webp index 20063a38cd..ee7fcf950b 100644 Binary files a/docs/static/screenshots/LineChart/sparkline-fixed-position-tooltip-dark-240w.webp and b/docs/static/screenshots/LineChart/sparkline-fixed-position-tooltip-dark-240w.webp differ diff --git a/docs/static/screenshots/LineChart/sparkline-fixed-position-tooltip-dark-400w.webp b/docs/static/screenshots/LineChart/sparkline-fixed-position-tooltip-dark-400w.webp index 20063a38cd..ee7fcf950b 100644 Binary files a/docs/static/screenshots/LineChart/sparkline-fixed-position-tooltip-dark-400w.webp and b/docs/static/screenshots/LineChart/sparkline-fixed-position-tooltip-dark-400w.webp differ diff --git a/docs/static/screenshots/LineChart/sparkline-fixed-position-tooltip-dark-800w.webp b/docs/static/screenshots/LineChart/sparkline-fixed-position-tooltip-dark-800w.webp index 20063a38cd..ee7fcf950b 100644 Binary files a/docs/static/screenshots/LineChart/sparkline-fixed-position-tooltip-dark-800w.webp and b/docs/static/screenshots/LineChart/sparkline-fixed-position-tooltip-dark-800w.webp differ diff --git a/docs/static/screenshots/LineChart/sparkline-fixed-position-tooltip-light-240w.webp b/docs/static/screenshots/LineChart/sparkline-fixed-position-tooltip-light-240w.webp index e6e36366a7..cc5f484eda 100644 Binary files a/docs/static/screenshots/LineChart/sparkline-fixed-position-tooltip-light-240w.webp and b/docs/static/screenshots/LineChart/sparkline-fixed-position-tooltip-light-240w.webp differ diff --git a/docs/static/screenshots/LineChart/sparkline-fixed-position-tooltip-light-400w.webp b/docs/static/screenshots/LineChart/sparkline-fixed-position-tooltip-light-400w.webp index e6e36366a7..cc5f484eda 100644 Binary files a/docs/static/screenshots/LineChart/sparkline-fixed-position-tooltip-light-400w.webp and b/docs/static/screenshots/LineChart/sparkline-fixed-position-tooltip-light-400w.webp differ diff --git a/docs/static/screenshots/LineChart/sparkline-fixed-position-tooltip-light-800w.webp b/docs/static/screenshots/LineChart/sparkline-fixed-position-tooltip-light-800w.webp index e6e36366a7..cc5f484eda 100644 Binary files a/docs/static/screenshots/LineChart/sparkline-fixed-position-tooltip-light-800w.webp and b/docs/static/screenshots/LineChart/sparkline-fixed-position-tooltip-light-800w.webp differ diff --git a/docs/static/screenshots/LineChart/sparkline-light-240w.webp b/docs/static/screenshots/LineChart/sparkline-light-240w.webp index c9a472017a..126a7e4109 100644 Binary files a/docs/static/screenshots/LineChart/sparkline-light-240w.webp and b/docs/static/screenshots/LineChart/sparkline-light-240w.webp differ diff --git a/docs/static/screenshots/LineChart/sparkline-light-400w.webp b/docs/static/screenshots/LineChart/sparkline-light-400w.webp index c9a472017a..126a7e4109 100644 Binary files a/docs/static/screenshots/LineChart/sparkline-light-400w.webp and b/docs/static/screenshots/LineChart/sparkline-light-400w.webp differ diff --git a/docs/static/screenshots/LineChart/sparkline-light-800w.webp b/docs/static/screenshots/LineChart/sparkline-light-800w.webp index c9a472017a..126a7e4109 100644 Binary files a/docs/static/screenshots/LineChart/sparkline-light-800w.webp and b/docs/static/screenshots/LineChart/sparkline-light-800w.webp differ diff --git a/docs/static/screenshots/LineChart/sparkline-within-a-paragraph-dark-240w.webp b/docs/static/screenshots/LineChart/sparkline-within-a-paragraph-dark-240w.webp index e7247d8188..af1d5028de 100644 Binary files a/docs/static/screenshots/LineChart/sparkline-within-a-paragraph-dark-240w.webp and b/docs/static/screenshots/LineChart/sparkline-within-a-paragraph-dark-240w.webp differ diff --git a/docs/static/screenshots/LineChart/sparkline-within-a-paragraph-dark-400w.webp b/docs/static/screenshots/LineChart/sparkline-within-a-paragraph-dark-400w.webp index e7247d8188..af1d5028de 100644 Binary files a/docs/static/screenshots/LineChart/sparkline-within-a-paragraph-dark-400w.webp and b/docs/static/screenshots/LineChart/sparkline-within-a-paragraph-dark-400w.webp differ diff --git a/docs/static/screenshots/LineChart/sparkline-within-a-paragraph-dark-800w.webp b/docs/static/screenshots/LineChart/sparkline-within-a-paragraph-dark-800w.webp index e7247d8188..af1d5028de 100644 Binary files a/docs/static/screenshots/LineChart/sparkline-within-a-paragraph-dark-800w.webp and b/docs/static/screenshots/LineChart/sparkline-within-a-paragraph-dark-800w.webp differ diff --git a/docs/static/screenshots/LineChart/sparkline-within-a-paragraph-light-240w.webp b/docs/static/screenshots/LineChart/sparkline-within-a-paragraph-light-240w.webp index 0d59772c92..8d7d7fbce6 100644 Binary files a/docs/static/screenshots/LineChart/sparkline-within-a-paragraph-light-240w.webp and b/docs/static/screenshots/LineChart/sparkline-within-a-paragraph-light-240w.webp differ diff --git a/docs/static/screenshots/LineChart/sparkline-within-a-paragraph-light-400w.webp b/docs/static/screenshots/LineChart/sparkline-within-a-paragraph-light-400w.webp index 0d59772c92..8d7d7fbce6 100644 Binary files a/docs/static/screenshots/LineChart/sparkline-within-a-paragraph-light-400w.webp and b/docs/static/screenshots/LineChart/sparkline-within-a-paragraph-light-400w.webp differ diff --git a/docs/static/screenshots/LineChart/sparkline-within-a-paragraph-light-800w.webp b/docs/static/screenshots/LineChart/sparkline-within-a-paragraph-light-800w.webp index 0d59772c92..8d7d7fbce6 100644 Binary files a/docs/static/screenshots/LineChart/sparkline-within-a-paragraph-light-800w.webp and b/docs/static/screenshots/LineChart/sparkline-within-a-paragraph-light-800w.webp differ diff --git a/docs/static/screenshots/LineChart/sparkline-within-a-paragraph-with-tooltip-and-highlight-dark-240w.webp b/docs/static/screenshots/LineChart/sparkline-within-a-paragraph-with-tooltip-and-highlight-dark-240w.webp index 7321ca3e0c..b8f98b2dc9 100644 Binary files a/docs/static/screenshots/LineChart/sparkline-within-a-paragraph-with-tooltip-and-highlight-dark-240w.webp and b/docs/static/screenshots/LineChart/sparkline-within-a-paragraph-with-tooltip-and-highlight-dark-240w.webp differ diff --git a/docs/static/screenshots/LineChart/sparkline-within-a-paragraph-with-tooltip-and-highlight-dark-400w.webp b/docs/static/screenshots/LineChart/sparkline-within-a-paragraph-with-tooltip-and-highlight-dark-400w.webp index 7321ca3e0c..b8f98b2dc9 100644 Binary files a/docs/static/screenshots/LineChart/sparkline-within-a-paragraph-with-tooltip-and-highlight-dark-400w.webp and b/docs/static/screenshots/LineChart/sparkline-within-a-paragraph-with-tooltip-and-highlight-dark-400w.webp differ diff --git a/docs/static/screenshots/LineChart/sparkline-within-a-paragraph-with-tooltip-and-highlight-dark-800w.webp b/docs/static/screenshots/LineChart/sparkline-within-a-paragraph-with-tooltip-and-highlight-dark-800w.webp index 7321ca3e0c..b8f98b2dc9 100644 Binary files a/docs/static/screenshots/LineChart/sparkline-within-a-paragraph-with-tooltip-and-highlight-dark-800w.webp and b/docs/static/screenshots/LineChart/sparkline-within-a-paragraph-with-tooltip-and-highlight-dark-800w.webp differ diff --git a/docs/static/screenshots/LineChart/sparkline-within-a-paragraph-with-tooltip-and-highlight-light-240w.webp b/docs/static/screenshots/LineChart/sparkline-within-a-paragraph-with-tooltip-and-highlight-light-240w.webp index 3af1fd67f2..3260d9fbfd 100644 Binary files a/docs/static/screenshots/LineChart/sparkline-within-a-paragraph-with-tooltip-and-highlight-light-240w.webp and b/docs/static/screenshots/LineChart/sparkline-within-a-paragraph-with-tooltip-and-highlight-light-240w.webp differ diff --git a/docs/static/screenshots/LineChart/sparkline-within-a-paragraph-with-tooltip-and-highlight-light-400w.webp b/docs/static/screenshots/LineChart/sparkline-within-a-paragraph-with-tooltip-and-highlight-light-400w.webp index 3af1fd67f2..3260d9fbfd 100644 Binary files a/docs/static/screenshots/LineChart/sparkline-within-a-paragraph-with-tooltip-and-highlight-light-400w.webp and b/docs/static/screenshots/LineChart/sparkline-within-a-paragraph-with-tooltip-and-highlight-light-400w.webp differ diff --git a/docs/static/screenshots/LineChart/sparkline-within-a-paragraph-with-tooltip-and-highlight-light-800w.webp b/docs/static/screenshots/LineChart/sparkline-within-a-paragraph-with-tooltip-and-highlight-light-800w.webp index 3af1fd67f2..3260d9fbfd 100644 Binary files a/docs/static/screenshots/LineChart/sparkline-within-a-paragraph-with-tooltip-and-highlight-light-800w.webp and b/docs/static/screenshots/LineChart/sparkline-within-a-paragraph-with-tooltip-and-highlight-light-800w.webp differ diff --git a/docs/static/screenshots/LineChart/sparkline-zero-axis-dark-240w.webp b/docs/static/screenshots/LineChart/sparkline-zero-axis-dark-240w.webp index 699779430f..ced8351f10 100644 Binary files a/docs/static/screenshots/LineChart/sparkline-zero-axis-dark-240w.webp and b/docs/static/screenshots/LineChart/sparkline-zero-axis-dark-240w.webp differ diff --git a/docs/static/screenshots/LineChart/sparkline-zero-axis-dark-400w.webp b/docs/static/screenshots/LineChart/sparkline-zero-axis-dark-400w.webp index 699779430f..ced8351f10 100644 Binary files a/docs/static/screenshots/LineChart/sparkline-zero-axis-dark-400w.webp and b/docs/static/screenshots/LineChart/sparkline-zero-axis-dark-400w.webp differ diff --git a/docs/static/screenshots/LineChart/sparkline-zero-axis-dark-800w.webp b/docs/static/screenshots/LineChart/sparkline-zero-axis-dark-800w.webp index 699779430f..ced8351f10 100644 Binary files a/docs/static/screenshots/LineChart/sparkline-zero-axis-dark-800w.webp and b/docs/static/screenshots/LineChart/sparkline-zero-axis-dark-800w.webp differ diff --git a/docs/static/screenshots/LineChart/sparkline-zero-axis-light-240w.webp b/docs/static/screenshots/LineChart/sparkline-zero-axis-light-240w.webp index 929a40f682..10dc85d692 100644 Binary files a/docs/static/screenshots/LineChart/sparkline-zero-axis-light-240w.webp and b/docs/static/screenshots/LineChart/sparkline-zero-axis-light-240w.webp differ diff --git a/docs/static/screenshots/LineChart/sparkline-zero-axis-light-400w.webp b/docs/static/screenshots/LineChart/sparkline-zero-axis-light-400w.webp index 929a40f682..10dc85d692 100644 Binary files a/docs/static/screenshots/LineChart/sparkline-zero-axis-light-400w.webp and b/docs/static/screenshots/LineChart/sparkline-zero-axis-light-400w.webp differ diff --git a/docs/static/screenshots/LineChart/sparkline-zero-axis-light-800w.webp b/docs/static/screenshots/LineChart/sparkline-zero-axis-light-800w.webp index 929a40f682..10dc85d692 100644 Binary files a/docs/static/screenshots/LineChart/sparkline-zero-axis-light-800w.webp and b/docs/static/screenshots/LineChart/sparkline-zero-axis-light-800w.webp differ diff --git a/docs/static/screenshots/LineChart/svelte-milestones-dark-240w.webp b/docs/static/screenshots/LineChart/svelte-milestones-dark-240w.webp index 7713a2eca0..9a3fe6c0e3 100644 Binary files a/docs/static/screenshots/LineChart/svelte-milestones-dark-240w.webp and b/docs/static/screenshots/LineChart/svelte-milestones-dark-240w.webp differ diff --git a/docs/static/screenshots/LineChart/svelte-milestones-dark-400w.webp b/docs/static/screenshots/LineChart/svelte-milestones-dark-400w.webp index 8fb9807514..337948b720 100644 Binary files a/docs/static/screenshots/LineChart/svelte-milestones-dark-400w.webp and b/docs/static/screenshots/LineChart/svelte-milestones-dark-400w.webp differ diff --git a/docs/static/screenshots/LineChart/svelte-milestones-dark-800w.webp b/docs/static/screenshots/LineChart/svelte-milestones-dark-800w.webp index 8f7591aaf5..e0531e73cc 100644 Binary files a/docs/static/screenshots/LineChart/svelte-milestones-dark-800w.webp and b/docs/static/screenshots/LineChart/svelte-milestones-dark-800w.webp differ diff --git a/docs/static/screenshots/LineChart/svelte-milestones-light-240w.webp b/docs/static/screenshots/LineChart/svelte-milestones-light-240w.webp index 29766c90b0..231ec8821b 100644 Binary files a/docs/static/screenshots/LineChart/svelte-milestones-light-240w.webp and b/docs/static/screenshots/LineChart/svelte-milestones-light-240w.webp differ diff --git a/docs/static/screenshots/LineChart/svelte-milestones-light-400w.webp b/docs/static/screenshots/LineChart/svelte-milestones-light-400w.webp index 5d028da890..3fc1b56510 100644 Binary files a/docs/static/screenshots/LineChart/svelte-milestones-light-400w.webp and b/docs/static/screenshots/LineChart/svelte-milestones-light-400w.webp differ diff --git a/docs/static/screenshots/LineChart/svelte-milestones-light-800w.webp b/docs/static/screenshots/LineChart/svelte-milestones-light-800w.webp index 53a6aa71d5..c5ed9ba98d 100644 Binary files a/docs/static/screenshots/LineChart/svelte-milestones-light-800w.webp and b/docs/static/screenshots/LineChart/svelte-milestones-light-800w.webp differ diff --git a/docs/static/screenshots/LineChart/threshold-dark-240w.webp b/docs/static/screenshots/LineChart/threshold-dark-240w.webp index 187c282dcc..494750995d 100644 Binary files a/docs/static/screenshots/LineChart/threshold-dark-240w.webp and b/docs/static/screenshots/LineChart/threshold-dark-240w.webp differ diff --git a/docs/static/screenshots/LineChart/threshold-dark-400w.webp b/docs/static/screenshots/LineChart/threshold-dark-400w.webp index 699816a554..edde760e35 100644 Binary files a/docs/static/screenshots/LineChart/threshold-dark-400w.webp and b/docs/static/screenshots/LineChart/threshold-dark-400w.webp differ diff --git a/docs/static/screenshots/LineChart/threshold-dark-800w.webp b/docs/static/screenshots/LineChart/threshold-dark-800w.webp index eb5807501c..94495074fa 100644 Binary files a/docs/static/screenshots/LineChart/threshold-dark-800w.webp and b/docs/static/screenshots/LineChart/threshold-dark-800w.webp differ diff --git a/docs/static/screenshots/LineChart/threshold-light-240w.webp b/docs/static/screenshots/LineChart/threshold-light-240w.webp index a5ae10748c..ee100c75d8 100644 Binary files a/docs/static/screenshots/LineChart/threshold-light-240w.webp and b/docs/static/screenshots/LineChart/threshold-light-240w.webp differ diff --git a/docs/static/screenshots/LineChart/threshold-light-400w.webp b/docs/static/screenshots/LineChart/threshold-light-400w.webp index 5f8a7cc05b..46d20eb702 100644 Binary files a/docs/static/screenshots/LineChart/threshold-light-400w.webp and b/docs/static/screenshots/LineChart/threshold-light-400w.webp differ diff --git a/docs/static/screenshots/LineChart/threshold-light-800w.webp b/docs/static/screenshots/LineChart/threshold-light-800w.webp index 74b3cc6b5d..0431057320 100644 Binary files a/docs/static/screenshots/LineChart/threshold-light-800w.webp and b/docs/static/screenshots/LineChart/threshold-light-800w.webp differ diff --git a/docs/static/screenshots/LineChart/tooltip-click-dark-240w.webp b/docs/static/screenshots/LineChart/tooltip-click-dark-240w.webp index 8723888113..1183abf923 100644 Binary files a/docs/static/screenshots/LineChart/tooltip-click-dark-240w.webp and b/docs/static/screenshots/LineChart/tooltip-click-dark-240w.webp differ diff --git a/docs/static/screenshots/LineChart/tooltip-click-dark-400w.webp b/docs/static/screenshots/LineChart/tooltip-click-dark-400w.webp index 450c8c2ad9..3040147c3e 100644 Binary files a/docs/static/screenshots/LineChart/tooltip-click-dark-400w.webp and b/docs/static/screenshots/LineChart/tooltip-click-dark-400w.webp differ diff --git a/docs/static/screenshots/LineChart/tooltip-click-dark-800w.webp b/docs/static/screenshots/LineChart/tooltip-click-dark-800w.webp index 20e9aa41e8..2db458c7d2 100644 Binary files a/docs/static/screenshots/LineChart/tooltip-click-dark-800w.webp and b/docs/static/screenshots/LineChart/tooltip-click-dark-800w.webp differ diff --git a/docs/static/screenshots/LineChart/tooltip-click-light-240w.webp b/docs/static/screenshots/LineChart/tooltip-click-light-240w.webp index 0891e9d8a5..2f6114de13 100644 Binary files a/docs/static/screenshots/LineChart/tooltip-click-light-240w.webp and b/docs/static/screenshots/LineChart/tooltip-click-light-240w.webp differ diff --git a/docs/static/screenshots/LineChart/tooltip-click-light-400w.webp b/docs/static/screenshots/LineChart/tooltip-click-light-400w.webp index db3f959278..bdd7a4cfff 100644 Binary files a/docs/static/screenshots/LineChart/tooltip-click-light-400w.webp and b/docs/static/screenshots/LineChart/tooltip-click-light-400w.webp differ diff --git a/docs/static/screenshots/LineChart/tooltip-click-light-800w.webp b/docs/static/screenshots/LineChart/tooltip-click-light-800w.webp index 90edcf1be9..94d8964eaf 100644 Binary files a/docs/static/screenshots/LineChart/tooltip-click-light-800w.webp and b/docs/static/screenshots/LineChart/tooltip-click-light-800w.webp differ diff --git a/docs/static/screenshots/LineChart/vertical-dark-240w.webp b/docs/static/screenshots/LineChart/vertical-dark-240w.webp index cb55bd1f2f..7900738d6a 100644 Binary files a/docs/static/screenshots/LineChart/vertical-dark-240w.webp and b/docs/static/screenshots/LineChart/vertical-dark-240w.webp differ diff --git a/docs/static/screenshots/LineChart/vertical-dark-400w.webp b/docs/static/screenshots/LineChart/vertical-dark-400w.webp index 14fd350396..9120f6b5d0 100644 Binary files a/docs/static/screenshots/LineChart/vertical-dark-400w.webp and b/docs/static/screenshots/LineChart/vertical-dark-400w.webp differ diff --git a/docs/static/screenshots/LineChart/vertical-dark-800w.webp b/docs/static/screenshots/LineChart/vertical-dark-800w.webp index 14fd350396..9120f6b5d0 100644 Binary files a/docs/static/screenshots/LineChart/vertical-dark-800w.webp and b/docs/static/screenshots/LineChart/vertical-dark-800w.webp differ diff --git a/docs/static/screenshots/LineChart/vertical-light-240w.webp b/docs/static/screenshots/LineChart/vertical-light-240w.webp index de15ad61e0..2d60b28cb0 100644 Binary files a/docs/static/screenshots/LineChart/vertical-light-240w.webp and b/docs/static/screenshots/LineChart/vertical-light-240w.webp differ diff --git a/docs/static/screenshots/LineChart/vertical-light-400w.webp b/docs/static/screenshots/LineChart/vertical-light-400w.webp index bc4271faed..55e5265a89 100644 Binary files a/docs/static/screenshots/LineChart/vertical-light-400w.webp and b/docs/static/screenshots/LineChart/vertical-light-400w.webp differ diff --git a/docs/static/screenshots/LineChart/vertical-light-800w.webp b/docs/static/screenshots/LineChart/vertical-light-800w.webp index bc4271faed..55e5265a89 100644 Binary files a/docs/static/screenshots/LineChart/vertical-light-800w.webp and b/docs/static/screenshots/LineChart/vertical-light-800w.webp differ diff --git a/docs/static/screenshots/Link/bended-arrows-dark-240w.webp b/docs/static/screenshots/Link/bended-arrows-dark-240w.webp index e2d47c8b33..1ff0e596cb 100644 Binary files a/docs/static/screenshots/Link/bended-arrows-dark-240w.webp and b/docs/static/screenshots/Link/bended-arrows-dark-240w.webp differ diff --git a/docs/static/screenshots/Link/bended-arrows-dark-400w.webp b/docs/static/screenshots/Link/bended-arrows-dark-400w.webp index b3414cf676..c91353a0df 100644 Binary files a/docs/static/screenshots/Link/bended-arrows-dark-400w.webp and b/docs/static/screenshots/Link/bended-arrows-dark-400w.webp differ diff --git a/docs/static/screenshots/Link/bended-arrows-dark-800w.webp b/docs/static/screenshots/Link/bended-arrows-dark-800w.webp index ebc04e848f..af7cdb4d61 100644 Binary files a/docs/static/screenshots/Link/bended-arrows-dark-800w.webp and b/docs/static/screenshots/Link/bended-arrows-dark-800w.webp differ diff --git a/docs/static/screenshots/Link/bended-arrows-light-400w.webp b/docs/static/screenshots/Link/bended-arrows-light-400w.webp index 6c757819fd..a52901fafa 100644 Binary files a/docs/static/screenshots/Link/bended-arrows-light-400w.webp and b/docs/static/screenshots/Link/bended-arrows-light-400w.webp differ diff --git a/docs/static/screenshots/Link/bended-arrows-light-800w.webp b/docs/static/screenshots/Link/bended-arrows-light-800w.webp index f189946d55..25f2947884 100644 Binary files a/docs/static/screenshots/Link/bended-arrows-light-800w.webp and b/docs/static/screenshots/Link/bended-arrows-light-800w.webp differ diff --git a/docs/static/screenshots/Link/curves-dark-400w.webp b/docs/static/screenshots/Link/curves-dark-400w.webp index 60ec4915cf..6582bce761 100644 Binary files a/docs/static/screenshots/Link/curves-dark-400w.webp and b/docs/static/screenshots/Link/curves-dark-400w.webp differ diff --git a/docs/static/screenshots/Link/curves-dark-800w.webp b/docs/static/screenshots/Link/curves-dark-800w.webp index 5a1cd61957..4f90a30e7c 100644 Binary files a/docs/static/screenshots/Link/curves-dark-800w.webp and b/docs/static/screenshots/Link/curves-dark-800w.webp differ diff --git a/docs/static/screenshots/Link/curves-light-240w.webp b/docs/static/screenshots/Link/curves-light-240w.webp index 42929909ec..b148e7dc9b 100644 Binary files a/docs/static/screenshots/Link/curves-light-240w.webp and b/docs/static/screenshots/Link/curves-light-240w.webp differ diff --git a/docs/static/screenshots/Link/curves-light-800w.webp b/docs/static/screenshots/Link/curves-light-800w.webp index c4f886690c..7f4dc17eb2 100644 Binary files a/docs/static/screenshots/Link/curves-light-800w.webp and b/docs/static/screenshots/Link/curves-light-800w.webp differ diff --git a/docs/static/screenshots/Link/types-dark-240w.webp b/docs/static/screenshots/Link/types-dark-240w.webp index 6d732596b3..ec63e1b01d 100644 Binary files a/docs/static/screenshots/Link/types-dark-240w.webp and b/docs/static/screenshots/Link/types-dark-240w.webp differ diff --git a/docs/static/screenshots/Link/types-dark-400w.webp b/docs/static/screenshots/Link/types-dark-400w.webp index 06a2433cec..8b666b1078 100644 Binary files a/docs/static/screenshots/Link/types-dark-400w.webp and b/docs/static/screenshots/Link/types-dark-400w.webp differ diff --git a/docs/static/screenshots/Link/types-dark-800w.webp b/docs/static/screenshots/Link/types-dark-800w.webp index 57f26deb1c..201f5e18b3 100644 Binary files a/docs/static/screenshots/Link/types-dark-800w.webp and b/docs/static/screenshots/Link/types-dark-800w.webp differ diff --git a/docs/static/screenshots/Link/types-light-240w.webp b/docs/static/screenshots/Link/types-light-240w.webp index c3dadd8edb..608b36144d 100644 Binary files a/docs/static/screenshots/Link/types-light-240w.webp and b/docs/static/screenshots/Link/types-light-240w.webp differ diff --git a/docs/static/screenshots/Link/types-light-400w.webp b/docs/static/screenshots/Link/types-light-400w.webp index 70687ebbe3..51bb4079ad 100644 Binary files a/docs/static/screenshots/Link/types-light-400w.webp and b/docs/static/screenshots/Link/types-light-400w.webp differ diff --git a/docs/static/screenshots/Link/types-light-800w.webp b/docs/static/screenshots/Link/types-light-800w.webp index ee42191590..8e11b9e3eb 100644 Binary files a/docs/static/screenshots/Link/types-light-800w.webp and b/docs/static/screenshots/Link/types-light-800w.webp differ diff --git a/docs/static/screenshots/Marker/line-dark-240w.webp b/docs/static/screenshots/Marker/line-dark-240w.webp index 1f7a1f20f8..a5a62500ce 100644 Binary files a/docs/static/screenshots/Marker/line-dark-240w.webp and b/docs/static/screenshots/Marker/line-dark-240w.webp differ diff --git a/docs/static/screenshots/Marker/line-dark-400w.webp b/docs/static/screenshots/Marker/line-dark-400w.webp index 2055d86109..7e98527014 100644 Binary files a/docs/static/screenshots/Marker/line-dark-400w.webp and b/docs/static/screenshots/Marker/line-dark-400w.webp differ diff --git a/docs/static/screenshots/Marker/line-dark-800w.webp b/docs/static/screenshots/Marker/line-dark-800w.webp index f43a1525e4..d91b5fdb91 100644 Binary files a/docs/static/screenshots/Marker/line-dark-800w.webp and b/docs/static/screenshots/Marker/line-dark-800w.webp differ diff --git a/docs/static/screenshots/Marker/line-light-240w.webp b/docs/static/screenshots/Marker/line-light-240w.webp index b0a87fd001..6f6b1d4029 100644 Binary files a/docs/static/screenshots/Marker/line-light-240w.webp and b/docs/static/screenshots/Marker/line-light-240w.webp differ diff --git a/docs/static/screenshots/Marker/line-light-400w.webp b/docs/static/screenshots/Marker/line-light-400w.webp index 2c7bed8b30..f9dd3184d7 100644 Binary files a/docs/static/screenshots/Marker/line-light-400w.webp and b/docs/static/screenshots/Marker/line-light-400w.webp differ diff --git a/docs/static/screenshots/Marker/line-light-800w.webp b/docs/static/screenshots/Marker/line-light-800w.webp index e8f9a0f252..58a0128c8e 100644 Binary files a/docs/static/screenshots/Marker/line-light-800w.webp and b/docs/static/screenshots/Marker/line-light-800w.webp differ diff --git a/docs/static/screenshots/Marker/orientation-dark-240w.webp b/docs/static/screenshots/Marker/orientation-dark-240w.webp index ad80ea3b96..7907ff1840 100644 Binary files a/docs/static/screenshots/Marker/orientation-dark-240w.webp and b/docs/static/screenshots/Marker/orientation-dark-240w.webp differ diff --git a/docs/static/screenshots/Marker/orientation-dark-800w.webp b/docs/static/screenshots/Marker/orientation-dark-800w.webp index 94d52e0eb6..da2a15bd9f 100644 Binary files a/docs/static/screenshots/Marker/orientation-dark-800w.webp and b/docs/static/screenshots/Marker/orientation-dark-800w.webp differ diff --git a/docs/static/screenshots/Marker/orientation-light-400w.webp b/docs/static/screenshots/Marker/orientation-light-400w.webp index 106681c67b..5321f8eb58 100644 Binary files a/docs/static/screenshots/Marker/orientation-light-400w.webp and b/docs/static/screenshots/Marker/orientation-light-400w.webp differ diff --git a/docs/static/screenshots/Marker/orientation-light-800w.webp b/docs/static/screenshots/Marker/orientation-light-800w.webp index a3a58314ef..185419c07f 100644 Binary files a/docs/static/screenshots/Marker/orientation-light-800w.webp and b/docs/static/screenshots/Marker/orientation-light-800w.webp differ diff --git a/docs/static/screenshots/Marker/spline-dark-240w.webp b/docs/static/screenshots/Marker/spline-dark-240w.webp index 3bf0c88b2e..2ed26951a2 100644 Binary files a/docs/static/screenshots/Marker/spline-dark-240w.webp and b/docs/static/screenshots/Marker/spline-dark-240w.webp differ diff --git a/docs/static/screenshots/Marker/spline-dark-400w.webp b/docs/static/screenshots/Marker/spline-dark-400w.webp index 4fd0dc8ab0..5ef702ccf4 100644 Binary files a/docs/static/screenshots/Marker/spline-dark-400w.webp and b/docs/static/screenshots/Marker/spline-dark-400w.webp differ diff --git a/docs/static/screenshots/Marker/spline-dark-800w.webp b/docs/static/screenshots/Marker/spline-dark-800w.webp index f4fe209232..3b0e15ae89 100644 Binary files a/docs/static/screenshots/Marker/spline-dark-800w.webp and b/docs/static/screenshots/Marker/spline-dark-800w.webp differ diff --git a/docs/static/screenshots/Marker/spline-light-400w.webp b/docs/static/screenshots/Marker/spline-light-400w.webp index 698a31acca..b33203ce28 100644 Binary files a/docs/static/screenshots/Marker/spline-light-400w.webp and b/docs/static/screenshots/Marker/spline-light-400w.webp differ diff --git a/docs/static/screenshots/Marker/spline-light-800w.webp b/docs/static/screenshots/Marker/spline-light-800w.webp index 68ca488308..4a55b69961 100644 Binary files a/docs/static/screenshots/Marker/spline-light-800w.webp and b/docs/static/screenshots/Marker/spline-light-800w.webp differ diff --git a/docs/static/screenshots/Marker/spline-w-thicker-stroke-dark-240w.webp b/docs/static/screenshots/Marker/spline-w-thicker-stroke-dark-240w.webp index a6a5b076fc..1b70d39d15 100644 Binary files a/docs/static/screenshots/Marker/spline-w-thicker-stroke-dark-240w.webp and b/docs/static/screenshots/Marker/spline-w-thicker-stroke-dark-240w.webp differ diff --git a/docs/static/screenshots/Marker/spline-w-thicker-stroke-dark-400w.webp b/docs/static/screenshots/Marker/spline-w-thicker-stroke-dark-400w.webp index 1ac63e7981..a9a3e5aa81 100644 Binary files a/docs/static/screenshots/Marker/spline-w-thicker-stroke-dark-400w.webp and b/docs/static/screenshots/Marker/spline-w-thicker-stroke-dark-400w.webp differ diff --git a/docs/static/screenshots/Marker/spline-w-thicker-stroke-dark-800w.webp b/docs/static/screenshots/Marker/spline-w-thicker-stroke-dark-800w.webp index dae1cad7b5..c71a8f9eec 100644 Binary files a/docs/static/screenshots/Marker/spline-w-thicker-stroke-dark-800w.webp and b/docs/static/screenshots/Marker/spline-w-thicker-stroke-dark-800w.webp differ diff --git a/docs/static/screenshots/Marker/spline-w-thicker-stroke-light-240w.webp b/docs/static/screenshots/Marker/spline-w-thicker-stroke-light-240w.webp index feabd7e67f..1a1b5905b9 100644 Binary files a/docs/static/screenshots/Marker/spline-w-thicker-stroke-light-240w.webp and b/docs/static/screenshots/Marker/spline-w-thicker-stroke-light-240w.webp differ diff --git a/docs/static/screenshots/Marker/spline-w-thicker-stroke-light-400w.webp b/docs/static/screenshots/Marker/spline-w-thicker-stroke-light-400w.webp index 61e3049b6a..bf272686ac 100644 Binary files a/docs/static/screenshots/Marker/spline-w-thicker-stroke-light-400w.webp and b/docs/static/screenshots/Marker/spline-w-thicker-stroke-light-400w.webp differ diff --git a/docs/static/screenshots/Marker/spline-w-thicker-stroke-light-800w.webp b/docs/static/screenshots/Marker/spline-w-thicker-stroke-light-800w.webp index 0b4e18f88c..3f699d914d 100644 Binary files a/docs/static/screenshots/Marker/spline-w-thicker-stroke-light-800w.webp and b/docs/static/screenshots/Marker/spline-w-thicker-stroke-light-800w.webp differ diff --git a/docs/static/screenshots/Month/90-days-dark-240w.webp b/docs/static/screenshots/Month/90-days-dark-240w.webp index 29b13dd322..b19679c0e7 100644 Binary files a/docs/static/screenshots/Month/90-days-dark-240w.webp and b/docs/static/screenshots/Month/90-days-dark-240w.webp differ diff --git a/docs/static/screenshots/Month/90-days-dark-400w.webp b/docs/static/screenshots/Month/90-days-dark-400w.webp index 114363724b..4aac3ba08c 100644 Binary files a/docs/static/screenshots/Month/90-days-dark-400w.webp and b/docs/static/screenshots/Month/90-days-dark-400w.webp differ diff --git a/docs/static/screenshots/Month/90-days-dark-800w.webp b/docs/static/screenshots/Month/90-days-dark-800w.webp index 3c35e281e4..997aa9e343 100644 Binary files a/docs/static/screenshots/Month/90-days-dark-800w.webp and b/docs/static/screenshots/Month/90-days-dark-800w.webp differ diff --git a/docs/static/screenshots/Month/90-days-light-240w.webp b/docs/static/screenshots/Month/90-days-light-240w.webp index dbadbe2c3b..b78a1c99c6 100644 Binary files a/docs/static/screenshots/Month/90-days-light-240w.webp and b/docs/static/screenshots/Month/90-days-light-240w.webp differ diff --git a/docs/static/screenshots/Month/90-days-light-400w.webp b/docs/static/screenshots/Month/90-days-light-400w.webp index c144ae3f75..3d9e5f55c4 100644 Binary files a/docs/static/screenshots/Month/90-days-light-400w.webp and b/docs/static/screenshots/Month/90-days-light-400w.webp differ diff --git a/docs/static/screenshots/Month/90-days-light-800w.webp b/docs/static/screenshots/Month/90-days-light-800w.webp index b7aea1c033..abbc7a879d 100644 Binary files a/docs/static/screenshots/Month/90-days-light-800w.webp and b/docs/static/screenshots/Month/90-days-light-800w.webp differ diff --git a/docs/static/screenshots/Month/basic-dark-240w.webp b/docs/static/screenshots/Month/basic-dark-240w.webp index bd249ec9a2..3355b23f5e 100644 Binary files a/docs/static/screenshots/Month/basic-dark-240w.webp and b/docs/static/screenshots/Month/basic-dark-240w.webp differ diff --git a/docs/static/screenshots/Month/basic-dark-400w.webp b/docs/static/screenshots/Month/basic-dark-400w.webp index eceb8923f0..556f28b8f2 100644 Binary files a/docs/static/screenshots/Month/basic-dark-400w.webp and b/docs/static/screenshots/Month/basic-dark-400w.webp differ diff --git a/docs/static/screenshots/Month/basic-dark-800w.webp b/docs/static/screenshots/Month/basic-dark-800w.webp index 00b306c0c2..f15c2b8cad 100644 Binary files a/docs/static/screenshots/Month/basic-dark-800w.webp and b/docs/static/screenshots/Month/basic-dark-800w.webp differ diff --git a/docs/static/screenshots/Month/basic-light-240w.webp b/docs/static/screenshots/Month/basic-light-240w.webp index 25a7fde194..26c03f97bd 100644 Binary files a/docs/static/screenshots/Month/basic-light-240w.webp and b/docs/static/screenshots/Month/basic-light-240w.webp differ diff --git a/docs/static/screenshots/Month/basic-light-400w.webp b/docs/static/screenshots/Month/basic-light-400w.webp index 43d6224ef6..a366c6d4d4 100644 Binary files a/docs/static/screenshots/Month/basic-light-400w.webp and b/docs/static/screenshots/Month/basic-light-400w.webp differ diff --git a/docs/static/screenshots/Month/basic-light-800w.webp b/docs/static/screenshots/Month/basic-light-800w.webp index 38e81024b1..b97abfcdf3 100644 Binary files a/docs/static/screenshots/Month/basic-light-800w.webp and b/docs/static/screenshots/Month/basic-light-800w.webp differ diff --git a/docs/static/screenshots/Month/custom-cell-size-dark-240w.webp b/docs/static/screenshots/Month/custom-cell-size-dark-240w.webp index a610bccc0b..37a82ba1bc 100644 Binary files a/docs/static/screenshots/Month/custom-cell-size-dark-240w.webp and b/docs/static/screenshots/Month/custom-cell-size-dark-240w.webp differ diff --git a/docs/static/screenshots/Month/custom-cell-size-dark-400w.webp b/docs/static/screenshots/Month/custom-cell-size-dark-400w.webp index 2344b742fa..5c4002947a 100644 Binary files a/docs/static/screenshots/Month/custom-cell-size-dark-400w.webp and b/docs/static/screenshots/Month/custom-cell-size-dark-400w.webp differ diff --git a/docs/static/screenshots/Month/custom-cell-size-dark-800w.webp b/docs/static/screenshots/Month/custom-cell-size-dark-800w.webp index 152654424a..60dd436501 100644 Binary files a/docs/static/screenshots/Month/custom-cell-size-dark-800w.webp and b/docs/static/screenshots/Month/custom-cell-size-dark-800w.webp differ diff --git a/docs/static/screenshots/Month/custom-cell-size-light-240w.webp b/docs/static/screenshots/Month/custom-cell-size-light-240w.webp index a93d2e4516..558e7465f8 100644 Binary files a/docs/static/screenshots/Month/custom-cell-size-light-240w.webp and b/docs/static/screenshots/Month/custom-cell-size-light-240w.webp differ diff --git a/docs/static/screenshots/Month/custom-cell-size-light-400w.webp b/docs/static/screenshots/Month/custom-cell-size-light-400w.webp index 46bcf22aa7..bbfd49f85e 100644 Binary files a/docs/static/screenshots/Month/custom-cell-size-light-400w.webp and b/docs/static/screenshots/Month/custom-cell-size-light-400w.webp differ diff --git a/docs/static/screenshots/Month/custom-cell-size-light-800w.webp b/docs/static/screenshots/Month/custom-cell-size-light-800w.webp index 90eb41410f..e32afd8c9c 100644 Binary files a/docs/static/screenshots/Month/custom-cell-size-light-800w.webp and b/docs/static/screenshots/Month/custom-cell-size-light-800w.webp differ diff --git a/docs/static/screenshots/Month/multiple-years-dark-240w.webp b/docs/static/screenshots/Month/multiple-years-dark-240w.webp index 4f49be7747..cc6484ecf9 100644 Binary files a/docs/static/screenshots/Month/multiple-years-dark-240w.webp and b/docs/static/screenshots/Month/multiple-years-dark-240w.webp differ diff --git a/docs/static/screenshots/Month/multiple-years-dark-400w.webp b/docs/static/screenshots/Month/multiple-years-dark-400w.webp index f4d7566dcd..fb7364167d 100644 Binary files a/docs/static/screenshots/Month/multiple-years-dark-400w.webp and b/docs/static/screenshots/Month/multiple-years-dark-400w.webp differ diff --git a/docs/static/screenshots/Month/multiple-years-dark-800w.webp b/docs/static/screenshots/Month/multiple-years-dark-800w.webp index 14fcc5c155..8ab385dcfe 100644 Binary files a/docs/static/screenshots/Month/multiple-years-dark-800w.webp and b/docs/static/screenshots/Month/multiple-years-dark-800w.webp differ diff --git a/docs/static/screenshots/Month/multiple-years-light-240w.webp b/docs/static/screenshots/Month/multiple-years-light-240w.webp index d6bc9fb61e..f5421dcc18 100644 Binary files a/docs/static/screenshots/Month/multiple-years-light-240w.webp and b/docs/static/screenshots/Month/multiple-years-light-240w.webp differ diff --git a/docs/static/screenshots/Month/multiple-years-light-400w.webp b/docs/static/screenshots/Month/multiple-years-light-400w.webp index 8c66a018ff..c502652d1e 100644 Binary files a/docs/static/screenshots/Month/multiple-years-light-400w.webp and b/docs/static/screenshots/Month/multiple-years-light-400w.webp differ diff --git a/docs/static/screenshots/Month/multiple-years-light-800w.webp b/docs/static/screenshots/Month/multiple-years-light-800w.webp index c74e1c44b6..fa5dffbce7 100644 Binary files a/docs/static/screenshots/Month/multiple-years-light-800w.webp and b/docs/static/screenshots/Month/multiple-years-light-800w.webp differ diff --git a/docs/static/screenshots/Month/without-day-numbers-dark-240w.webp b/docs/static/screenshots/Month/without-day-numbers-dark-240w.webp index c58ac2050d..298d500071 100644 Binary files a/docs/static/screenshots/Month/without-day-numbers-dark-240w.webp and b/docs/static/screenshots/Month/without-day-numbers-dark-240w.webp differ diff --git a/docs/static/screenshots/Month/without-day-numbers-dark-400w.webp b/docs/static/screenshots/Month/without-day-numbers-dark-400w.webp index e7228d1a8b..58dc0fe039 100644 Binary files a/docs/static/screenshots/Month/without-day-numbers-dark-400w.webp and b/docs/static/screenshots/Month/without-day-numbers-dark-400w.webp differ diff --git a/docs/static/screenshots/Month/without-day-numbers-dark-800w.webp b/docs/static/screenshots/Month/without-day-numbers-dark-800w.webp index 868370c1f2..8145b0a6c6 100644 Binary files a/docs/static/screenshots/Month/without-day-numbers-dark-800w.webp and b/docs/static/screenshots/Month/without-day-numbers-dark-800w.webp differ diff --git a/docs/static/screenshots/Month/without-day-numbers-light-240w.webp b/docs/static/screenshots/Month/without-day-numbers-light-240w.webp index fdcf906cc0..3db09453bf 100644 Binary files a/docs/static/screenshots/Month/without-day-numbers-light-240w.webp and b/docs/static/screenshots/Month/without-day-numbers-light-240w.webp differ diff --git a/docs/static/screenshots/Month/without-day-numbers-light-400w.webp b/docs/static/screenshots/Month/without-day-numbers-light-400w.webp index cabd688a47..af861bc425 100644 Binary files a/docs/static/screenshots/Month/without-day-numbers-light-400w.webp and b/docs/static/screenshots/Month/without-day-numbers-light-400w.webp differ diff --git a/docs/static/screenshots/Month/without-day-numbers-light-800w.webp b/docs/static/screenshots/Month/without-day-numbers-light-800w.webp index 157d9f479e..7801ba87a5 100644 Binary files a/docs/static/screenshots/Month/without-day-numbers-light-800w.webp and b/docs/static/screenshots/Month/without-day-numbers-light-800w.webp differ diff --git a/docs/static/screenshots/Month/without-month-labels-dark-240w.webp b/docs/static/screenshots/Month/without-month-labels-dark-240w.webp index 68fd3924a5..fc104aef31 100644 Binary files a/docs/static/screenshots/Month/without-month-labels-dark-240w.webp and b/docs/static/screenshots/Month/without-month-labels-dark-240w.webp differ diff --git a/docs/static/screenshots/Month/without-month-labels-dark-400w.webp b/docs/static/screenshots/Month/without-month-labels-dark-400w.webp index 00cc8a135e..2a37cf33f7 100644 Binary files a/docs/static/screenshots/Month/without-month-labels-dark-400w.webp and b/docs/static/screenshots/Month/without-month-labels-dark-400w.webp differ diff --git a/docs/static/screenshots/Month/without-month-labels-dark-800w.webp b/docs/static/screenshots/Month/without-month-labels-dark-800w.webp index 1f82531de6..d10ed788e0 100644 Binary files a/docs/static/screenshots/Month/without-month-labels-dark-800w.webp and b/docs/static/screenshots/Month/without-month-labels-dark-800w.webp differ diff --git a/docs/static/screenshots/Month/without-month-labels-light-240w.webp b/docs/static/screenshots/Month/without-month-labels-light-240w.webp index a3b3b4381c..d4dba091e9 100644 Binary files a/docs/static/screenshots/Month/without-month-labels-light-240w.webp and b/docs/static/screenshots/Month/without-month-labels-light-240w.webp differ diff --git a/docs/static/screenshots/Month/without-month-labels-light-400w.webp b/docs/static/screenshots/Month/without-month-labels-light-400w.webp index 18483f468d..c95ca7d65c 100644 Binary files a/docs/static/screenshots/Month/without-month-labels-light-400w.webp and b/docs/static/screenshots/Month/without-month-labels-light-400w.webp differ diff --git a/docs/static/screenshots/Month/without-month-labels-light-800w.webp b/docs/static/screenshots/Month/without-month-labels-light-800w.webp index 8a9c55ded0..3237ecfb92 100644 Binary files a/docs/static/screenshots/Month/without-month-labels-light-800w.webp and b/docs/static/screenshots/Month/without-month-labels-light-800w.webp differ diff --git a/docs/static/screenshots/MotionPath/repeat-indefinitely-dark-240w.webp b/docs/static/screenshots/MotionPath/repeat-indefinitely-dark-240w.webp index c003d52824..dc7e81bc48 100644 Binary files a/docs/static/screenshots/MotionPath/repeat-indefinitely-dark-240w.webp and b/docs/static/screenshots/MotionPath/repeat-indefinitely-dark-240w.webp differ diff --git a/docs/static/screenshots/MotionPath/repeat-indefinitely-dark-400w.webp b/docs/static/screenshots/MotionPath/repeat-indefinitely-dark-400w.webp index 9f602ca440..ee3f51fb1a 100644 Binary files a/docs/static/screenshots/MotionPath/repeat-indefinitely-dark-400w.webp and b/docs/static/screenshots/MotionPath/repeat-indefinitely-dark-400w.webp differ diff --git a/docs/static/screenshots/MotionPath/repeat-indefinitely-dark-800w.webp b/docs/static/screenshots/MotionPath/repeat-indefinitely-dark-800w.webp index 16c6c9756b..58aa1ec111 100644 Binary files a/docs/static/screenshots/MotionPath/repeat-indefinitely-dark-800w.webp and b/docs/static/screenshots/MotionPath/repeat-indefinitely-dark-800w.webp differ diff --git a/docs/static/screenshots/MotionPath/repeat-indefinitely-light-240w.webp b/docs/static/screenshots/MotionPath/repeat-indefinitely-light-240w.webp index 6356ce72b3..b6c7d91903 100644 Binary files a/docs/static/screenshots/MotionPath/repeat-indefinitely-light-240w.webp and b/docs/static/screenshots/MotionPath/repeat-indefinitely-light-240w.webp differ diff --git a/docs/static/screenshots/MotionPath/repeat-indefinitely-light-400w.webp b/docs/static/screenshots/MotionPath/repeat-indefinitely-light-400w.webp index 1039a6b0c3..019ed09269 100644 Binary files a/docs/static/screenshots/MotionPath/repeat-indefinitely-light-400w.webp and b/docs/static/screenshots/MotionPath/repeat-indefinitely-light-400w.webp differ diff --git a/docs/static/screenshots/MotionPath/repeat-indefinitely-light-800w.webp b/docs/static/screenshots/MotionPath/repeat-indefinitely-light-800w.webp index 9ba7a1fcaa..645789483f 100644 Binary files a/docs/static/screenshots/MotionPath/repeat-indefinitely-light-800w.webp and b/docs/static/screenshots/MotionPath/repeat-indefinitely-light-800w.webp differ diff --git a/docs/static/screenshots/MotionPath/rotate-object-with-path-dark-240w.webp b/docs/static/screenshots/MotionPath/rotate-object-with-path-dark-240w.webp index 38d593a02a..7cb65b189f 100644 Binary files a/docs/static/screenshots/MotionPath/rotate-object-with-path-dark-240w.webp and b/docs/static/screenshots/MotionPath/rotate-object-with-path-dark-240w.webp differ diff --git a/docs/static/screenshots/MotionPath/rotate-object-with-path-dark-400w.webp b/docs/static/screenshots/MotionPath/rotate-object-with-path-dark-400w.webp index 794bf357f2..4727b9ae64 100644 Binary files a/docs/static/screenshots/MotionPath/rotate-object-with-path-dark-400w.webp and b/docs/static/screenshots/MotionPath/rotate-object-with-path-dark-400w.webp differ diff --git a/docs/static/screenshots/MotionPath/rotate-object-with-path-dark-800w.webp b/docs/static/screenshots/MotionPath/rotate-object-with-path-dark-800w.webp index 8ed33f535d..f459688f5e 100644 Binary files a/docs/static/screenshots/MotionPath/rotate-object-with-path-dark-800w.webp and b/docs/static/screenshots/MotionPath/rotate-object-with-path-dark-800w.webp differ diff --git a/docs/static/screenshots/MotionPath/rotate-object-with-path-light-240w.webp b/docs/static/screenshots/MotionPath/rotate-object-with-path-light-240w.webp index 708b8443a5..b1c339100a 100644 Binary files a/docs/static/screenshots/MotionPath/rotate-object-with-path-light-240w.webp and b/docs/static/screenshots/MotionPath/rotate-object-with-path-light-240w.webp differ diff --git a/docs/static/screenshots/MotionPath/rotate-object-with-path-light-400w.webp b/docs/static/screenshots/MotionPath/rotate-object-with-path-light-400w.webp index 9eb7eaf663..d7c0039038 100644 Binary files a/docs/static/screenshots/MotionPath/rotate-object-with-path-light-400w.webp and b/docs/static/screenshots/MotionPath/rotate-object-with-path-light-400w.webp differ diff --git a/docs/static/screenshots/MotionPath/rotate-object-with-path-light-800w.webp b/docs/static/screenshots/MotionPath/rotate-object-with-path-light-800w.webp index c5176d1250..5a33272f0a 100644 Binary files a/docs/static/screenshots/MotionPath/rotate-object-with-path-light-800w.webp and b/docs/static/screenshots/MotionPath/rotate-object-with-path-light-800w.webp differ diff --git a/docs/static/screenshots/MotionPath/sync-with-draw-dark-240w.webp b/docs/static/screenshots/MotionPath/sync-with-draw-dark-240w.webp index 793f6071f0..3ae4494adb 100644 Binary files a/docs/static/screenshots/MotionPath/sync-with-draw-dark-240w.webp and b/docs/static/screenshots/MotionPath/sync-with-draw-dark-240w.webp differ diff --git a/docs/static/screenshots/MotionPath/sync-with-draw-dark-400w.webp b/docs/static/screenshots/MotionPath/sync-with-draw-dark-400w.webp index 75b4ae16e6..71fca8a32a 100644 Binary files a/docs/static/screenshots/MotionPath/sync-with-draw-dark-400w.webp and b/docs/static/screenshots/MotionPath/sync-with-draw-dark-400w.webp differ diff --git a/docs/static/screenshots/MotionPath/sync-with-draw-dark-800w.webp b/docs/static/screenshots/MotionPath/sync-with-draw-dark-800w.webp index 1e3f0aa724..75355f40a8 100644 Binary files a/docs/static/screenshots/MotionPath/sync-with-draw-dark-800w.webp and b/docs/static/screenshots/MotionPath/sync-with-draw-dark-800w.webp differ diff --git a/docs/static/screenshots/MotionPath/sync-with-draw-light-240w.webp b/docs/static/screenshots/MotionPath/sync-with-draw-light-240w.webp index afe92aa213..aef79499b4 100644 Binary files a/docs/static/screenshots/MotionPath/sync-with-draw-light-240w.webp and b/docs/static/screenshots/MotionPath/sync-with-draw-light-240w.webp differ diff --git a/docs/static/screenshots/MotionPath/sync-with-draw-light-400w.webp b/docs/static/screenshots/MotionPath/sync-with-draw-light-400w.webp index 435e9432aa..082468a65d 100644 Binary files a/docs/static/screenshots/MotionPath/sync-with-draw-light-400w.webp and b/docs/static/screenshots/MotionPath/sync-with-draw-light-400w.webp differ diff --git a/docs/static/screenshots/MotionPath/sync-with-draw-light-800w.webp b/docs/static/screenshots/MotionPath/sync-with-draw-light-800w.webp index 471ca48d2c..d0459c7f02 100644 Binary files a/docs/static/screenshots/MotionPath/sync-with-draw-light-800w.webp and b/docs/static/screenshots/MotionPath/sync-with-draw-light-800w.webp differ diff --git a/docs/static/screenshots/Partition/filterable-light-240w.webp b/docs/static/screenshots/Partition/filterable-light-240w.webp index 18c5d5dc01..792851ab8f 100644 Binary files a/docs/static/screenshots/Partition/filterable-light-240w.webp and b/docs/static/screenshots/Partition/filterable-light-240w.webp differ diff --git a/docs/static/screenshots/Partition/filterable-light-400w.webp b/docs/static/screenshots/Partition/filterable-light-400w.webp index a5e6dca3ba..15fe46afb0 100644 Binary files a/docs/static/screenshots/Partition/filterable-light-400w.webp and b/docs/static/screenshots/Partition/filterable-light-400w.webp differ diff --git a/docs/static/screenshots/Partition/filterable-light-800w.webp b/docs/static/screenshots/Partition/filterable-light-800w.webp index 65a4b51db6..fc269b4fce 100644 Binary files a/docs/static/screenshots/Partition/filterable-light-800w.webp and b/docs/static/screenshots/Partition/filterable-light-800w.webp differ diff --git a/docs/static/screenshots/Partition/flame-graph-dark-240w.webp b/docs/static/screenshots/Partition/flame-graph-dark-240w.webp index 38141fcc77..d495a9499c 100644 Binary files a/docs/static/screenshots/Partition/flame-graph-dark-240w.webp and b/docs/static/screenshots/Partition/flame-graph-dark-240w.webp differ diff --git a/docs/static/screenshots/Partition/flame-graph-dark-400w.webp b/docs/static/screenshots/Partition/flame-graph-dark-400w.webp index 585f05a99f..83de238a36 100644 Binary files a/docs/static/screenshots/Partition/flame-graph-dark-400w.webp and b/docs/static/screenshots/Partition/flame-graph-dark-400w.webp differ diff --git a/docs/static/screenshots/Partition/flame-graph-dark-800w.webp b/docs/static/screenshots/Partition/flame-graph-dark-800w.webp index 7939450aa6..53e2d75cb9 100644 Binary files a/docs/static/screenshots/Partition/flame-graph-dark-800w.webp and b/docs/static/screenshots/Partition/flame-graph-dark-800w.webp differ diff --git a/docs/static/screenshots/Partition/flame-graph-light-400w.webp b/docs/static/screenshots/Partition/flame-graph-light-400w.webp index df20dd0bb4..1f5315c7b5 100644 Binary files a/docs/static/screenshots/Partition/flame-graph-light-400w.webp and b/docs/static/screenshots/Partition/flame-graph-light-400w.webp differ diff --git a/docs/static/screenshots/Partition/flame-graph-light-800w.webp b/docs/static/screenshots/Partition/flame-graph-light-800w.webp index 12aec83b23..5240947e27 100644 Binary files a/docs/static/screenshots/Partition/flame-graph-light-800w.webp and b/docs/static/screenshots/Partition/flame-graph-light-800w.webp differ diff --git a/docs/static/screenshots/Partition/horizontal-dark-800w.webp b/docs/static/screenshots/Partition/horizontal-dark-800w.webp index 425b4c5662..250d631905 100644 Binary files a/docs/static/screenshots/Partition/horizontal-dark-800w.webp and b/docs/static/screenshots/Partition/horizontal-dark-800w.webp differ diff --git a/docs/static/screenshots/Partition/horizontal-light-240w.webp b/docs/static/screenshots/Partition/horizontal-light-240w.webp index 80b915a3b2..d3c3df36e4 100644 Binary files a/docs/static/screenshots/Partition/horizontal-light-240w.webp and b/docs/static/screenshots/Partition/horizontal-light-240w.webp differ diff --git a/docs/static/screenshots/Partition/horizontal-light-400w.webp b/docs/static/screenshots/Partition/horizontal-light-400w.webp index 1a33c73311..f92dec8cc0 100644 Binary files a/docs/static/screenshots/Partition/horizontal-light-400w.webp and b/docs/static/screenshots/Partition/horizontal-light-400w.webp differ diff --git a/docs/static/screenshots/Partition/horizontal-light-800w.webp b/docs/static/screenshots/Partition/horizontal-light-800w.webp index 9b368f0e99..dbd41284fd 100644 Binary files a/docs/static/screenshots/Partition/horizontal-light-800w.webp and b/docs/static/screenshots/Partition/horizontal-light-800w.webp differ diff --git a/docs/static/screenshots/Partition/sunburst-dark-240w.webp b/docs/static/screenshots/Partition/sunburst-dark-240w.webp index 328f383522..8d85c20c85 100644 Binary files a/docs/static/screenshots/Partition/sunburst-dark-240w.webp and b/docs/static/screenshots/Partition/sunburst-dark-240w.webp differ diff --git a/docs/static/screenshots/Partition/sunburst-dark-400w.webp b/docs/static/screenshots/Partition/sunburst-dark-400w.webp index 5d6fa97cbf..b6b9d52fd4 100644 Binary files a/docs/static/screenshots/Partition/sunburst-dark-400w.webp and b/docs/static/screenshots/Partition/sunburst-dark-400w.webp differ diff --git a/docs/static/screenshots/Partition/sunburst-dark-800w.webp b/docs/static/screenshots/Partition/sunburst-dark-800w.webp index 6f051a2764..e28be76f9c 100644 Binary files a/docs/static/screenshots/Partition/sunburst-dark-800w.webp and b/docs/static/screenshots/Partition/sunburst-dark-800w.webp differ diff --git a/docs/static/screenshots/Partition/sunburst-light-400w.webp b/docs/static/screenshots/Partition/sunburst-light-400w.webp index 336c664dbf..5d535f0117 100644 Binary files a/docs/static/screenshots/Partition/sunburst-light-400w.webp and b/docs/static/screenshots/Partition/sunburst-light-400w.webp differ diff --git a/docs/static/screenshots/Partition/sunburst-light-800w.webp b/docs/static/screenshots/Partition/sunburst-light-800w.webp index b859508964..daf7bf4505 100644 Binary files a/docs/static/screenshots/Partition/sunburst-light-800w.webp and b/docs/static/screenshots/Partition/sunburst-light-800w.webp differ diff --git a/docs/static/screenshots/Partition/vertical-dark-400w.webp b/docs/static/screenshots/Partition/vertical-dark-400w.webp index 129af1b4b1..c9e3c2192e 100644 Binary files a/docs/static/screenshots/Partition/vertical-dark-400w.webp and b/docs/static/screenshots/Partition/vertical-dark-400w.webp differ diff --git a/docs/static/screenshots/Partition/vertical-dark-800w.webp b/docs/static/screenshots/Partition/vertical-dark-800w.webp index 51f4718310..5b8a0f3aae 100644 Binary files a/docs/static/screenshots/Partition/vertical-dark-800w.webp and b/docs/static/screenshots/Partition/vertical-dark-800w.webp differ diff --git a/docs/static/screenshots/Partition/vertical-light-240w.webp b/docs/static/screenshots/Partition/vertical-light-240w.webp index 9958268721..964de7afa5 100644 Binary files a/docs/static/screenshots/Partition/vertical-light-240w.webp and b/docs/static/screenshots/Partition/vertical-light-240w.webp differ diff --git a/docs/static/screenshots/Partition/vertical-light-400w.webp b/docs/static/screenshots/Partition/vertical-light-400w.webp index 2da5d63bcd..eed31486a0 100644 Binary files a/docs/static/screenshots/Partition/vertical-light-400w.webp and b/docs/static/screenshots/Partition/vertical-light-400w.webp differ diff --git a/docs/static/screenshots/Partition/vertical-light-800w.webp b/docs/static/screenshots/Partition/vertical-light-800w.webp index 72db544882..b2151f05cb 100644 Binary files a/docs/static/screenshots/Partition/vertical-light-800w.webp and b/docs/static/screenshots/Partition/vertical-light-800w.webp differ diff --git a/docs/static/screenshots/Pie/inner-radius-negative-dark-240w.webp b/docs/static/screenshots/Pie/inner-radius-negative-dark-240w.webp index 3e995d7749..2a6da34910 100644 Binary files a/docs/static/screenshots/Pie/inner-radius-negative-dark-240w.webp and b/docs/static/screenshots/Pie/inner-radius-negative-dark-240w.webp differ diff --git a/docs/static/screenshots/Pie/inner-radius-negative-dark-400w.webp b/docs/static/screenshots/Pie/inner-radius-negative-dark-400w.webp index 7055c3325a..77a9763aa3 100644 Binary files a/docs/static/screenshots/Pie/inner-radius-negative-dark-400w.webp and b/docs/static/screenshots/Pie/inner-radius-negative-dark-400w.webp differ diff --git a/docs/static/screenshots/Pie/inner-radius-negative-dark-800w.webp b/docs/static/screenshots/Pie/inner-radius-negative-dark-800w.webp index 5fdeedc0b1..8fe5205c39 100644 Binary files a/docs/static/screenshots/Pie/inner-radius-negative-dark-800w.webp and b/docs/static/screenshots/Pie/inner-radius-negative-dark-800w.webp differ diff --git a/docs/static/screenshots/Pie/inner-radius-negative-light-240w.webp b/docs/static/screenshots/Pie/inner-radius-negative-light-240w.webp index 3e995d7749..2a6da34910 100644 Binary files a/docs/static/screenshots/Pie/inner-radius-negative-light-240w.webp and b/docs/static/screenshots/Pie/inner-radius-negative-light-240w.webp differ diff --git a/docs/static/screenshots/Pie/inner-radius-negative-light-400w.webp b/docs/static/screenshots/Pie/inner-radius-negative-light-400w.webp index 7055c3325a..77a9763aa3 100644 Binary files a/docs/static/screenshots/Pie/inner-radius-negative-light-400w.webp and b/docs/static/screenshots/Pie/inner-radius-negative-light-400w.webp differ diff --git a/docs/static/screenshots/Pie/inner-radius-negative-light-800w.webp b/docs/static/screenshots/Pie/inner-radius-negative-light-800w.webp index 5fdeedc0b1..8fe5205c39 100644 Binary files a/docs/static/screenshots/Pie/inner-radius-negative-light-800w.webp and b/docs/static/screenshots/Pie/inner-radius-negative-light-800w.webp differ diff --git a/docs/static/screenshots/Pie/inner-radius-positive-dark-240w.webp b/docs/static/screenshots/Pie/inner-radius-positive-dark-240w.webp index 3909dcd6e8..e94f8ee012 100644 Binary files a/docs/static/screenshots/Pie/inner-radius-positive-dark-240w.webp and b/docs/static/screenshots/Pie/inner-radius-positive-dark-240w.webp differ diff --git a/docs/static/screenshots/Pie/inner-radius-positive-dark-400w.webp b/docs/static/screenshots/Pie/inner-radius-positive-dark-400w.webp index 8f98a56716..223e861076 100644 Binary files a/docs/static/screenshots/Pie/inner-radius-positive-dark-400w.webp and b/docs/static/screenshots/Pie/inner-radius-positive-dark-400w.webp differ diff --git a/docs/static/screenshots/Pie/inner-radius-positive-dark-800w.webp b/docs/static/screenshots/Pie/inner-radius-positive-dark-800w.webp index aa50401c70..aa53b05d55 100644 Binary files a/docs/static/screenshots/Pie/inner-radius-positive-dark-800w.webp and b/docs/static/screenshots/Pie/inner-radius-positive-dark-800w.webp differ diff --git a/docs/static/screenshots/Pie/inner-radius-positive-light-240w.webp b/docs/static/screenshots/Pie/inner-radius-positive-light-240w.webp index 3909dcd6e8..e94f8ee012 100644 Binary files a/docs/static/screenshots/Pie/inner-radius-positive-light-240w.webp and b/docs/static/screenshots/Pie/inner-radius-positive-light-240w.webp differ diff --git a/docs/static/screenshots/Pie/inner-radius-positive-light-400w.webp b/docs/static/screenshots/Pie/inner-radius-positive-light-400w.webp index 8f98a56716..223e861076 100644 Binary files a/docs/static/screenshots/Pie/inner-radius-positive-light-400w.webp and b/docs/static/screenshots/Pie/inner-radius-positive-light-400w.webp differ diff --git a/docs/static/screenshots/Pie/inner-radius-positive-light-800w.webp b/docs/static/screenshots/Pie/inner-radius-positive-light-800w.webp index aa50401c70..aa53b05d55 100644 Binary files a/docs/static/screenshots/Pie/inner-radius-positive-light-800w.webp and b/docs/static/screenshots/Pie/inner-radius-positive-light-800w.webp differ diff --git a/docs/static/screenshots/Pie/inner-radius-zero-one-dark-240w.webp b/docs/static/screenshots/Pie/inner-radius-zero-one-dark-240w.webp index 0d4b66c680..7075c9f8f1 100644 Binary files a/docs/static/screenshots/Pie/inner-radius-zero-one-dark-240w.webp and b/docs/static/screenshots/Pie/inner-radius-zero-one-dark-240w.webp differ diff --git a/docs/static/screenshots/Pie/inner-radius-zero-one-dark-400w.webp b/docs/static/screenshots/Pie/inner-radius-zero-one-dark-400w.webp index 39a5c3461b..f6f367bc42 100644 Binary files a/docs/static/screenshots/Pie/inner-radius-zero-one-dark-400w.webp and b/docs/static/screenshots/Pie/inner-radius-zero-one-dark-400w.webp differ diff --git a/docs/static/screenshots/Pie/inner-radius-zero-one-dark-800w.webp b/docs/static/screenshots/Pie/inner-radius-zero-one-dark-800w.webp index a346aa7dec..39b8935e14 100644 Binary files a/docs/static/screenshots/Pie/inner-radius-zero-one-dark-800w.webp and b/docs/static/screenshots/Pie/inner-radius-zero-one-dark-800w.webp differ diff --git a/docs/static/screenshots/Pie/inner-radius-zero-one-light-240w.webp b/docs/static/screenshots/Pie/inner-radius-zero-one-light-240w.webp index 0d4b66c680..7075c9f8f1 100644 Binary files a/docs/static/screenshots/Pie/inner-radius-zero-one-light-240w.webp and b/docs/static/screenshots/Pie/inner-radius-zero-one-light-240w.webp differ diff --git a/docs/static/screenshots/Pie/inner-radius-zero-one-light-400w.webp b/docs/static/screenshots/Pie/inner-radius-zero-one-light-400w.webp index 39a5c3461b..f6f367bc42 100644 Binary files a/docs/static/screenshots/Pie/inner-radius-zero-one-light-400w.webp and b/docs/static/screenshots/Pie/inner-radius-zero-one-light-400w.webp differ diff --git a/docs/static/screenshots/Pie/inner-radius-zero-one-light-800w.webp b/docs/static/screenshots/Pie/inner-radius-zero-one-light-800w.webp index a346aa7dec..39b8935e14 100644 Binary files a/docs/static/screenshots/Pie/inner-radius-zero-one-light-800w.webp and b/docs/static/screenshots/Pie/inner-radius-zero-one-light-800w.webp differ diff --git a/docs/static/screenshots/Pie/labels-centroid-dark-240w.webp b/docs/static/screenshots/Pie/labels-centroid-dark-240w.webp index eb4125d153..6d645abcad 100644 Binary files a/docs/static/screenshots/Pie/labels-centroid-dark-240w.webp and b/docs/static/screenshots/Pie/labels-centroid-dark-240w.webp differ diff --git a/docs/static/screenshots/Pie/labels-centroid-dark-400w.webp b/docs/static/screenshots/Pie/labels-centroid-dark-400w.webp index 92d86052e2..46404be545 100644 Binary files a/docs/static/screenshots/Pie/labels-centroid-dark-400w.webp and b/docs/static/screenshots/Pie/labels-centroid-dark-400w.webp differ diff --git a/docs/static/screenshots/Pie/labels-centroid-dark-800w.webp b/docs/static/screenshots/Pie/labels-centroid-dark-800w.webp index 5adcdba44d..42ed3ab24b 100644 Binary files a/docs/static/screenshots/Pie/labels-centroid-dark-800w.webp and b/docs/static/screenshots/Pie/labels-centroid-dark-800w.webp differ diff --git a/docs/static/screenshots/Pie/labels-centroid-light-240w.webp b/docs/static/screenshots/Pie/labels-centroid-light-240w.webp index eb4125d153..6d645abcad 100644 Binary files a/docs/static/screenshots/Pie/labels-centroid-light-240w.webp and b/docs/static/screenshots/Pie/labels-centroid-light-240w.webp differ diff --git a/docs/static/screenshots/Pie/labels-centroid-light-400w.webp b/docs/static/screenshots/Pie/labels-centroid-light-400w.webp index 92d86052e2..46404be545 100644 Binary files a/docs/static/screenshots/Pie/labels-centroid-light-400w.webp and b/docs/static/screenshots/Pie/labels-centroid-light-400w.webp differ diff --git a/docs/static/screenshots/Pie/labels-centroid-light-800w.webp b/docs/static/screenshots/Pie/labels-centroid-light-800w.webp index 5adcdba44d..42ed3ab24b 100644 Binary files a/docs/static/screenshots/Pie/labels-centroid-light-800w.webp and b/docs/static/screenshots/Pie/labels-centroid-light-800w.webp differ diff --git a/docs/static/screenshots/Pie/labels-centroid-multiple-dark-240w.webp b/docs/static/screenshots/Pie/labels-centroid-multiple-dark-240w.webp index 5580fead97..5eeb9eee3b 100644 Binary files a/docs/static/screenshots/Pie/labels-centroid-multiple-dark-240w.webp and b/docs/static/screenshots/Pie/labels-centroid-multiple-dark-240w.webp differ diff --git a/docs/static/screenshots/Pie/labels-centroid-multiple-dark-400w.webp b/docs/static/screenshots/Pie/labels-centroid-multiple-dark-400w.webp index 17ac86c4b1..40294249f6 100644 Binary files a/docs/static/screenshots/Pie/labels-centroid-multiple-dark-400w.webp and b/docs/static/screenshots/Pie/labels-centroid-multiple-dark-400w.webp differ diff --git a/docs/static/screenshots/Pie/labels-centroid-multiple-dark-800w.webp b/docs/static/screenshots/Pie/labels-centroid-multiple-dark-800w.webp index b8dd557923..dc2a0904ff 100644 Binary files a/docs/static/screenshots/Pie/labels-centroid-multiple-dark-800w.webp and b/docs/static/screenshots/Pie/labels-centroid-multiple-dark-800w.webp differ diff --git a/docs/static/screenshots/Pie/labels-centroid-multiple-light-240w.webp b/docs/static/screenshots/Pie/labels-centroid-multiple-light-240w.webp index 5580fead97..5eeb9eee3b 100644 Binary files a/docs/static/screenshots/Pie/labels-centroid-multiple-light-240w.webp and b/docs/static/screenshots/Pie/labels-centroid-multiple-light-240w.webp differ diff --git a/docs/static/screenshots/Pie/labels-centroid-multiple-light-400w.webp b/docs/static/screenshots/Pie/labels-centroid-multiple-light-400w.webp index 17ac86c4b1..40294249f6 100644 Binary files a/docs/static/screenshots/Pie/labels-centroid-multiple-light-400w.webp and b/docs/static/screenshots/Pie/labels-centroid-multiple-light-400w.webp differ diff --git a/docs/static/screenshots/Pie/labels-centroid-multiple-light-800w.webp b/docs/static/screenshots/Pie/labels-centroid-multiple-light-800w.webp index b8dd557923..dc2a0904ff 100644 Binary files a/docs/static/screenshots/Pie/labels-centroid-multiple-light-800w.webp and b/docs/static/screenshots/Pie/labels-centroid-multiple-light-800w.webp differ diff --git a/docs/static/screenshots/Pie/labels-dark-240w.webp b/docs/static/screenshots/Pie/labels-dark-240w.webp index 641f3017aa..d97a494bca 100644 Binary files a/docs/static/screenshots/Pie/labels-dark-240w.webp and b/docs/static/screenshots/Pie/labels-dark-240w.webp differ diff --git a/docs/static/screenshots/Pie/labels-dark-400w.webp b/docs/static/screenshots/Pie/labels-dark-400w.webp index fd715aac17..090ae01457 100644 Binary files a/docs/static/screenshots/Pie/labels-dark-400w.webp and b/docs/static/screenshots/Pie/labels-dark-400w.webp differ diff --git a/docs/static/screenshots/Pie/labels-dark-800w.webp b/docs/static/screenshots/Pie/labels-dark-800w.webp index 27b5eaae9e..b6cfcbd9e1 100644 Binary files a/docs/static/screenshots/Pie/labels-dark-800w.webp and b/docs/static/screenshots/Pie/labels-dark-800w.webp differ diff --git a/docs/static/screenshots/Pie/labels-light-240w.webp b/docs/static/screenshots/Pie/labels-light-240w.webp index 641f3017aa..d97a494bca 100644 Binary files a/docs/static/screenshots/Pie/labels-light-240w.webp and b/docs/static/screenshots/Pie/labels-light-240w.webp differ diff --git a/docs/static/screenshots/Pie/labels-light-400w.webp b/docs/static/screenshots/Pie/labels-light-400w.webp index fd715aac17..090ae01457 100644 Binary files a/docs/static/screenshots/Pie/labels-light-400w.webp and b/docs/static/screenshots/Pie/labels-light-400w.webp differ diff --git a/docs/static/screenshots/Pie/labels-light-800w.webp b/docs/static/screenshots/Pie/labels-light-800w.webp index 27b5eaae9e..b6cfcbd9e1 100644 Binary files a/docs/static/screenshots/Pie/labels-light-800w.webp and b/docs/static/screenshots/Pie/labels-light-800w.webp differ diff --git a/docs/static/screenshots/Pie/labels-outer-dark-240w.webp b/docs/static/screenshots/Pie/labels-outer-dark-240w.webp index ec9680979a..79d52b1640 100644 Binary files a/docs/static/screenshots/Pie/labels-outer-dark-240w.webp and b/docs/static/screenshots/Pie/labels-outer-dark-240w.webp differ diff --git a/docs/static/screenshots/Pie/labels-outer-dark-400w.webp b/docs/static/screenshots/Pie/labels-outer-dark-400w.webp index 939ad221b0..1edb013dbe 100644 Binary files a/docs/static/screenshots/Pie/labels-outer-dark-400w.webp and b/docs/static/screenshots/Pie/labels-outer-dark-400w.webp differ diff --git a/docs/static/screenshots/Pie/labels-outer-dark-800w.webp b/docs/static/screenshots/Pie/labels-outer-dark-800w.webp index e3cd8d1915..9ff75ed90f 100644 Binary files a/docs/static/screenshots/Pie/labels-outer-dark-800w.webp and b/docs/static/screenshots/Pie/labels-outer-dark-800w.webp differ diff --git a/docs/static/screenshots/Pie/labels-outer-light-240w.webp b/docs/static/screenshots/Pie/labels-outer-light-240w.webp index b3e766beda..0292cd8c4c 100644 Binary files a/docs/static/screenshots/Pie/labels-outer-light-240w.webp and b/docs/static/screenshots/Pie/labels-outer-light-240w.webp differ diff --git a/docs/static/screenshots/Pie/labels-outer-light-400w.webp b/docs/static/screenshots/Pie/labels-outer-light-400w.webp index de70747f26..d1079dfa4b 100644 Binary files a/docs/static/screenshots/Pie/labels-outer-light-400w.webp and b/docs/static/screenshots/Pie/labels-outer-light-400w.webp differ diff --git a/docs/static/screenshots/Pie/labels-outer-light-800w.webp b/docs/static/screenshots/Pie/labels-outer-light-800w.webp index 46b2e42f46..ef57927517 100644 Binary files a/docs/static/screenshots/Pie/labels-outer-light-800w.webp and b/docs/static/screenshots/Pie/labels-outer-light-800w.webp differ diff --git a/docs/static/screenshots/Pie/labels-outer-radial-dark-240w.webp b/docs/static/screenshots/Pie/labels-outer-radial-dark-240w.webp index 9a88f32ea8..3e3768c928 100644 Binary files a/docs/static/screenshots/Pie/labels-outer-radial-dark-240w.webp and b/docs/static/screenshots/Pie/labels-outer-radial-dark-240w.webp differ diff --git a/docs/static/screenshots/Pie/labels-outer-radial-dark-400w.webp b/docs/static/screenshots/Pie/labels-outer-radial-dark-400w.webp index 671ea2bf83..2e01271832 100644 Binary files a/docs/static/screenshots/Pie/labels-outer-radial-dark-400w.webp and b/docs/static/screenshots/Pie/labels-outer-radial-dark-400w.webp differ diff --git a/docs/static/screenshots/Pie/labels-outer-radial-dark-800w.webp b/docs/static/screenshots/Pie/labels-outer-radial-dark-800w.webp index 72f7fbb238..2a99deb0ac 100644 Binary files a/docs/static/screenshots/Pie/labels-outer-radial-dark-800w.webp and b/docs/static/screenshots/Pie/labels-outer-radial-dark-800w.webp differ diff --git a/docs/static/screenshots/Pie/labels-outer-radial-light-240w.webp b/docs/static/screenshots/Pie/labels-outer-radial-light-240w.webp index 4371d88346..64cc43abfb 100644 Binary files a/docs/static/screenshots/Pie/labels-outer-radial-light-240w.webp and b/docs/static/screenshots/Pie/labels-outer-radial-light-240w.webp differ diff --git a/docs/static/screenshots/Pie/labels-outer-radial-light-400w.webp b/docs/static/screenshots/Pie/labels-outer-radial-light-400w.webp index 9d79e75b9f..c35c419a9e 100644 Binary files a/docs/static/screenshots/Pie/labels-outer-radial-light-400w.webp and b/docs/static/screenshots/Pie/labels-outer-radial-light-400w.webp differ diff --git a/docs/static/screenshots/Pie/labels-outer-radial-light-800w.webp b/docs/static/screenshots/Pie/labels-outer-radial-light-800w.webp index e4255f9887..7c9b72cb95 100644 Binary files a/docs/static/screenshots/Pie/labels-outer-radial-light-800w.webp and b/docs/static/screenshots/Pie/labels-outer-radial-light-800w.webp differ diff --git a/docs/static/screenshots/Pie/labels-outer-with-padding-dark-240w.webp b/docs/static/screenshots/Pie/labels-outer-with-padding-dark-240w.webp index e78930592e..da1dfa931b 100644 Binary files a/docs/static/screenshots/Pie/labels-outer-with-padding-dark-240w.webp and b/docs/static/screenshots/Pie/labels-outer-with-padding-dark-240w.webp differ diff --git a/docs/static/screenshots/Pie/labels-outer-with-padding-dark-400w.webp b/docs/static/screenshots/Pie/labels-outer-with-padding-dark-400w.webp index d6bcb2f966..b02ec46182 100644 Binary files a/docs/static/screenshots/Pie/labels-outer-with-padding-dark-400w.webp and b/docs/static/screenshots/Pie/labels-outer-with-padding-dark-400w.webp differ diff --git a/docs/static/screenshots/Pie/labels-outer-with-padding-dark-800w.webp b/docs/static/screenshots/Pie/labels-outer-with-padding-dark-800w.webp index a556e068a9..768f664397 100644 Binary files a/docs/static/screenshots/Pie/labels-outer-with-padding-dark-800w.webp and b/docs/static/screenshots/Pie/labels-outer-with-padding-dark-800w.webp differ diff --git a/docs/static/screenshots/Pie/labels-outer-with-padding-light-240w.webp b/docs/static/screenshots/Pie/labels-outer-with-padding-light-240w.webp index 8df9fed947..97e044e97a 100644 Binary files a/docs/static/screenshots/Pie/labels-outer-with-padding-light-240w.webp and b/docs/static/screenshots/Pie/labels-outer-with-padding-light-240w.webp differ diff --git a/docs/static/screenshots/Pie/labels-outer-with-padding-light-400w.webp b/docs/static/screenshots/Pie/labels-outer-with-padding-light-400w.webp index d915f7b876..f22bb6b229 100644 Binary files a/docs/static/screenshots/Pie/labels-outer-with-padding-light-400w.webp and b/docs/static/screenshots/Pie/labels-outer-with-padding-light-400w.webp differ diff --git a/docs/static/screenshots/Pie/labels-outer-with-padding-light-800w.webp b/docs/static/screenshots/Pie/labels-outer-with-padding-light-800w.webp index bb182d1a1b..e939130506 100644 Binary files a/docs/static/screenshots/Pie/labels-outer-with-padding-light-800w.webp and b/docs/static/screenshots/Pie/labels-outer-with-padding-light-800w.webp differ diff --git a/docs/static/screenshots/Pie/multiple-data-prop-dark-240w.webp b/docs/static/screenshots/Pie/multiple-data-prop-dark-240w.webp index 28b3e9efa7..c43fb6e5a9 100644 Binary files a/docs/static/screenshots/Pie/multiple-data-prop-dark-240w.webp and b/docs/static/screenshots/Pie/multiple-data-prop-dark-240w.webp differ diff --git a/docs/static/screenshots/Pie/multiple-data-prop-dark-400w.webp b/docs/static/screenshots/Pie/multiple-data-prop-dark-400w.webp index 8840e6975b..b4994c265f 100644 Binary files a/docs/static/screenshots/Pie/multiple-data-prop-dark-400w.webp and b/docs/static/screenshots/Pie/multiple-data-prop-dark-400w.webp differ diff --git a/docs/static/screenshots/Pie/multiple-data-prop-dark-800w.webp b/docs/static/screenshots/Pie/multiple-data-prop-dark-800w.webp index 2404dd6268..046add7181 100644 Binary files a/docs/static/screenshots/Pie/multiple-data-prop-dark-800w.webp and b/docs/static/screenshots/Pie/multiple-data-prop-dark-800w.webp differ diff --git a/docs/static/screenshots/Pie/multiple-data-prop-light-240w.webp b/docs/static/screenshots/Pie/multiple-data-prop-light-240w.webp index 28b3e9efa7..c43fb6e5a9 100644 Binary files a/docs/static/screenshots/Pie/multiple-data-prop-light-240w.webp and b/docs/static/screenshots/Pie/multiple-data-prop-light-240w.webp differ diff --git a/docs/static/screenshots/Pie/multiple-data-prop-light-400w.webp b/docs/static/screenshots/Pie/multiple-data-prop-light-400w.webp index 8840e6975b..b4994c265f 100644 Binary files a/docs/static/screenshots/Pie/multiple-data-prop-light-400w.webp and b/docs/static/screenshots/Pie/multiple-data-prop-light-400w.webp differ diff --git a/docs/static/screenshots/Pie/multiple-data-prop-light-800w.webp b/docs/static/screenshots/Pie/multiple-data-prop-light-800w.webp index 2404dd6268..046add7181 100644 Binary files a/docs/static/screenshots/Pie/multiple-data-prop-light-800w.webp and b/docs/static/screenshots/Pie/multiple-data-prop-light-800w.webp differ diff --git a/docs/static/screenshots/Pie/offset-dark-240w.webp b/docs/static/screenshots/Pie/offset-dark-240w.webp index 5dbb9ed9bd..be080cb22d 100644 Binary files a/docs/static/screenshots/Pie/offset-dark-240w.webp and b/docs/static/screenshots/Pie/offset-dark-240w.webp differ diff --git a/docs/static/screenshots/Pie/offset-dark-400w.webp b/docs/static/screenshots/Pie/offset-dark-400w.webp index 911f82ff54..76263a493f 100644 Binary files a/docs/static/screenshots/Pie/offset-dark-400w.webp and b/docs/static/screenshots/Pie/offset-dark-400w.webp differ diff --git a/docs/static/screenshots/Pie/offset-dark-800w.webp b/docs/static/screenshots/Pie/offset-dark-800w.webp index 80d146cb6c..3eab9d9725 100644 Binary files a/docs/static/screenshots/Pie/offset-dark-800w.webp and b/docs/static/screenshots/Pie/offset-dark-800w.webp differ diff --git a/docs/static/screenshots/Pie/offset-light-240w.webp b/docs/static/screenshots/Pie/offset-light-240w.webp index 5dbb9ed9bd..be080cb22d 100644 Binary files a/docs/static/screenshots/Pie/offset-light-240w.webp and b/docs/static/screenshots/Pie/offset-light-240w.webp differ diff --git a/docs/static/screenshots/Pie/offset-light-400w.webp b/docs/static/screenshots/Pie/offset-light-400w.webp index 911f82ff54..76263a493f 100644 Binary files a/docs/static/screenshots/Pie/offset-light-400w.webp and b/docs/static/screenshots/Pie/offset-light-400w.webp differ diff --git a/docs/static/screenshots/Pie/offset-light-800w.webp b/docs/static/screenshots/Pie/offset-light-800w.webp index 80d146cb6c..3eab9d9725 100644 Binary files a/docs/static/screenshots/Pie/offset-light-800w.webp and b/docs/static/screenshots/Pie/offset-light-800w.webp differ diff --git a/docs/static/screenshots/Pie/outer-radius-dark-240w.webp b/docs/static/screenshots/Pie/outer-radius-dark-240w.webp index 1572dca877..99f0098dac 100644 Binary files a/docs/static/screenshots/Pie/outer-radius-dark-240w.webp and b/docs/static/screenshots/Pie/outer-radius-dark-240w.webp differ diff --git a/docs/static/screenshots/Pie/outer-radius-dark-400w.webp b/docs/static/screenshots/Pie/outer-radius-dark-400w.webp index 60bb875628..26517ebd87 100644 Binary files a/docs/static/screenshots/Pie/outer-radius-dark-400w.webp and b/docs/static/screenshots/Pie/outer-radius-dark-400w.webp differ diff --git a/docs/static/screenshots/Pie/outer-radius-dark-800w.webp b/docs/static/screenshots/Pie/outer-radius-dark-800w.webp index fb247e96c9..1d4887381b 100644 Binary files a/docs/static/screenshots/Pie/outer-radius-dark-800w.webp and b/docs/static/screenshots/Pie/outer-radius-dark-800w.webp differ diff --git a/docs/static/screenshots/Pie/outer-radius-light-240w.webp b/docs/static/screenshots/Pie/outer-radius-light-240w.webp index 1572dca877..99f0098dac 100644 Binary files a/docs/static/screenshots/Pie/outer-radius-light-240w.webp and b/docs/static/screenshots/Pie/outer-radius-light-240w.webp differ diff --git a/docs/static/screenshots/Pie/outer-radius-light-400w.webp b/docs/static/screenshots/Pie/outer-radius-light-400w.webp index 60bb875628..26517ebd87 100644 Binary files a/docs/static/screenshots/Pie/outer-radius-light-400w.webp and b/docs/static/screenshots/Pie/outer-radius-light-400w.webp differ diff --git a/docs/static/screenshots/Pie/outer-radius-light-800w.webp b/docs/static/screenshots/Pie/outer-radius-light-800w.webp index fb247e96c9..1d4887381b 100644 Binary files a/docs/static/screenshots/Pie/outer-radius-light-800w.webp and b/docs/static/screenshots/Pie/outer-radius-light-800w.webp differ diff --git a/docs/static/screenshots/Pie/pad-angle-dark-240w.webp b/docs/static/screenshots/Pie/pad-angle-dark-240w.webp index 46334aa104..f445da0cca 100644 Binary files a/docs/static/screenshots/Pie/pad-angle-dark-240w.webp and b/docs/static/screenshots/Pie/pad-angle-dark-240w.webp differ diff --git a/docs/static/screenshots/Pie/pad-angle-dark-400w.webp b/docs/static/screenshots/Pie/pad-angle-dark-400w.webp index 4c95ef2ee3..b0e7d602ce 100644 Binary files a/docs/static/screenshots/Pie/pad-angle-dark-400w.webp and b/docs/static/screenshots/Pie/pad-angle-dark-400w.webp differ diff --git a/docs/static/screenshots/Pie/pad-angle-dark-800w.webp b/docs/static/screenshots/Pie/pad-angle-dark-800w.webp index 13496b8baf..cba468d0bb 100644 Binary files a/docs/static/screenshots/Pie/pad-angle-dark-800w.webp and b/docs/static/screenshots/Pie/pad-angle-dark-800w.webp differ diff --git a/docs/static/screenshots/Pie/pad-angle-light-240w.webp b/docs/static/screenshots/Pie/pad-angle-light-240w.webp index 46334aa104..f445da0cca 100644 Binary files a/docs/static/screenshots/Pie/pad-angle-light-240w.webp and b/docs/static/screenshots/Pie/pad-angle-light-240w.webp differ diff --git a/docs/static/screenshots/Pie/pad-angle-light-400w.webp b/docs/static/screenshots/Pie/pad-angle-light-400w.webp index 4c95ef2ee3..b0e7d602ce 100644 Binary files a/docs/static/screenshots/Pie/pad-angle-light-400w.webp and b/docs/static/screenshots/Pie/pad-angle-light-400w.webp differ diff --git a/docs/static/screenshots/Pie/pad-angle-light-800w.webp b/docs/static/screenshots/Pie/pad-angle-light-800w.webp index 13496b8baf..cba468d0bb 100644 Binary files a/docs/static/screenshots/Pie/pad-angle-light-800w.webp and b/docs/static/screenshots/Pie/pad-angle-light-800w.webp differ diff --git a/docs/static/screenshots/Pie/pad-angle-with-inner-radius-dark-240w.webp b/docs/static/screenshots/Pie/pad-angle-with-inner-radius-dark-240w.webp index 1c94f74140..2ca5e38a7d 100644 Binary files a/docs/static/screenshots/Pie/pad-angle-with-inner-radius-dark-240w.webp and b/docs/static/screenshots/Pie/pad-angle-with-inner-radius-dark-240w.webp differ diff --git a/docs/static/screenshots/Pie/pad-angle-with-inner-radius-dark-400w.webp b/docs/static/screenshots/Pie/pad-angle-with-inner-radius-dark-400w.webp index a2a05854ee..569392d5ac 100644 Binary files a/docs/static/screenshots/Pie/pad-angle-with-inner-radius-dark-400w.webp and b/docs/static/screenshots/Pie/pad-angle-with-inner-radius-dark-400w.webp differ diff --git a/docs/static/screenshots/Pie/pad-angle-with-inner-radius-dark-800w.webp b/docs/static/screenshots/Pie/pad-angle-with-inner-radius-dark-800w.webp index 23b85bbfd4..8ea7fcc976 100644 Binary files a/docs/static/screenshots/Pie/pad-angle-with-inner-radius-dark-800w.webp and b/docs/static/screenshots/Pie/pad-angle-with-inner-radius-dark-800w.webp differ diff --git a/docs/static/screenshots/Pie/pad-angle-with-inner-radius-light-240w.webp b/docs/static/screenshots/Pie/pad-angle-with-inner-radius-light-240w.webp index 1c94f74140..2ca5e38a7d 100644 Binary files a/docs/static/screenshots/Pie/pad-angle-with-inner-radius-light-240w.webp and b/docs/static/screenshots/Pie/pad-angle-with-inner-radius-light-240w.webp differ diff --git a/docs/static/screenshots/Pie/pad-angle-with-inner-radius-light-400w.webp b/docs/static/screenshots/Pie/pad-angle-with-inner-radius-light-400w.webp index a2a05854ee..569392d5ac 100644 Binary files a/docs/static/screenshots/Pie/pad-angle-with-inner-radius-light-400w.webp and b/docs/static/screenshots/Pie/pad-angle-with-inner-radius-light-400w.webp differ diff --git a/docs/static/screenshots/Pie/pad-angle-with-inner-radius-light-800w.webp b/docs/static/screenshots/Pie/pad-angle-with-inner-radius-light-800w.webp index 23b85bbfd4..8ea7fcc976 100644 Binary files a/docs/static/screenshots/Pie/pad-angle-with-inner-radius-light-800w.webp and b/docs/static/screenshots/Pie/pad-angle-with-inner-radius-light-800w.webp differ diff --git a/docs/static/screenshots/Pie/partial-range-chart-xrange-dark-240w.webp b/docs/static/screenshots/Pie/partial-range-chart-xrange-dark-240w.webp index 568beaa6c8..de861c946b 100644 Binary files a/docs/static/screenshots/Pie/partial-range-chart-xrange-dark-240w.webp and b/docs/static/screenshots/Pie/partial-range-chart-xrange-dark-240w.webp differ diff --git a/docs/static/screenshots/Pie/partial-range-chart-xrange-dark-400w.webp b/docs/static/screenshots/Pie/partial-range-chart-xrange-dark-400w.webp index 815d7a8b5c..69cf975444 100644 Binary files a/docs/static/screenshots/Pie/partial-range-chart-xrange-dark-400w.webp and b/docs/static/screenshots/Pie/partial-range-chart-xrange-dark-400w.webp differ diff --git a/docs/static/screenshots/Pie/partial-range-chart-xrange-dark-800w.webp b/docs/static/screenshots/Pie/partial-range-chart-xrange-dark-800w.webp index 0d82ef3ac3..b205017aef 100644 Binary files a/docs/static/screenshots/Pie/partial-range-chart-xrange-dark-800w.webp and b/docs/static/screenshots/Pie/partial-range-chart-xrange-dark-800w.webp differ diff --git a/docs/static/screenshots/Pie/partial-range-chart-xrange-light-240w.webp b/docs/static/screenshots/Pie/partial-range-chart-xrange-light-240w.webp index 568beaa6c8..de861c946b 100644 Binary files a/docs/static/screenshots/Pie/partial-range-chart-xrange-light-240w.webp and b/docs/static/screenshots/Pie/partial-range-chart-xrange-light-240w.webp differ diff --git a/docs/static/screenshots/Pie/partial-range-chart-xrange-light-400w.webp b/docs/static/screenshots/Pie/partial-range-chart-xrange-light-400w.webp index 815d7a8b5c..69cf975444 100644 Binary files a/docs/static/screenshots/Pie/partial-range-chart-xrange-light-400w.webp and b/docs/static/screenshots/Pie/partial-range-chart-xrange-light-400w.webp differ diff --git a/docs/static/screenshots/Pie/partial-range-chart-xrange-light-800w.webp b/docs/static/screenshots/Pie/partial-range-chart-xrange-light-800w.webp index 0d82ef3ac3..b205017aef 100644 Binary files a/docs/static/screenshots/Pie/partial-range-chart-xrange-light-800w.webp and b/docs/static/screenshots/Pie/partial-range-chart-xrange-light-800w.webp differ diff --git a/docs/static/screenshots/Pie/partial-range-range-prop-dark-240w.webp b/docs/static/screenshots/Pie/partial-range-range-prop-dark-240w.webp index dc5ae3bd85..90ea0ff9b5 100644 Binary files a/docs/static/screenshots/Pie/partial-range-range-prop-dark-240w.webp and b/docs/static/screenshots/Pie/partial-range-range-prop-dark-240w.webp differ diff --git a/docs/static/screenshots/Pie/partial-range-range-prop-dark-400w.webp b/docs/static/screenshots/Pie/partial-range-range-prop-dark-400w.webp index db38ad362e..0f84ca8d95 100644 Binary files a/docs/static/screenshots/Pie/partial-range-range-prop-dark-400w.webp and b/docs/static/screenshots/Pie/partial-range-range-prop-dark-400w.webp differ diff --git a/docs/static/screenshots/Pie/partial-range-range-prop-dark-800w.webp b/docs/static/screenshots/Pie/partial-range-range-prop-dark-800w.webp index 2fac050ed6..c9b26984b0 100644 Binary files a/docs/static/screenshots/Pie/partial-range-range-prop-dark-800w.webp and b/docs/static/screenshots/Pie/partial-range-range-prop-dark-800w.webp differ diff --git a/docs/static/screenshots/Pie/partial-range-range-prop-light-240w.webp b/docs/static/screenshots/Pie/partial-range-range-prop-light-240w.webp index dc5ae3bd85..90ea0ff9b5 100644 Binary files a/docs/static/screenshots/Pie/partial-range-range-prop-light-240w.webp and b/docs/static/screenshots/Pie/partial-range-range-prop-light-240w.webp differ diff --git a/docs/static/screenshots/Pie/partial-range-range-prop-light-400w.webp b/docs/static/screenshots/Pie/partial-range-range-prop-light-400w.webp index db38ad362e..0f84ca8d95 100644 Binary files a/docs/static/screenshots/Pie/partial-range-range-prop-light-400w.webp and b/docs/static/screenshots/Pie/partial-range-range-prop-light-400w.webp differ diff --git a/docs/static/screenshots/Pie/partial-range-range-prop-light-800w.webp b/docs/static/screenshots/Pie/partial-range-range-prop-light-800w.webp index 2fac050ed6..c9b26984b0 100644 Binary files a/docs/static/screenshots/Pie/partial-range-range-prop-light-800w.webp and b/docs/static/screenshots/Pie/partial-range-range-prop-light-800w.webp differ diff --git a/docs/static/screenshots/Pie/placement-center-dark-240w.webp b/docs/static/screenshots/Pie/placement-center-dark-240w.webp index 11aef94c25..e3d84dbe02 100644 Binary files a/docs/static/screenshots/Pie/placement-center-dark-240w.webp and b/docs/static/screenshots/Pie/placement-center-dark-240w.webp differ diff --git a/docs/static/screenshots/Pie/placement-center-dark-400w.webp b/docs/static/screenshots/Pie/placement-center-dark-400w.webp index 93d2a84923..fa67522d7b 100644 Binary files a/docs/static/screenshots/Pie/placement-center-dark-400w.webp and b/docs/static/screenshots/Pie/placement-center-dark-400w.webp differ diff --git a/docs/static/screenshots/Pie/placement-center-dark-800w.webp b/docs/static/screenshots/Pie/placement-center-dark-800w.webp index a328d6477d..703970b002 100644 Binary files a/docs/static/screenshots/Pie/placement-center-dark-800w.webp and b/docs/static/screenshots/Pie/placement-center-dark-800w.webp differ diff --git a/docs/static/screenshots/Pie/placement-center-light-240w.webp b/docs/static/screenshots/Pie/placement-center-light-240w.webp index 11aef94c25..e3d84dbe02 100644 Binary files a/docs/static/screenshots/Pie/placement-center-light-240w.webp and b/docs/static/screenshots/Pie/placement-center-light-240w.webp differ diff --git a/docs/static/screenshots/Pie/placement-center-light-400w.webp b/docs/static/screenshots/Pie/placement-center-light-400w.webp index 93d2a84923..fa67522d7b 100644 Binary files a/docs/static/screenshots/Pie/placement-center-light-400w.webp and b/docs/static/screenshots/Pie/placement-center-light-400w.webp differ diff --git a/docs/static/screenshots/Pie/placement-center-light-800w.webp b/docs/static/screenshots/Pie/placement-center-light-800w.webp index a328d6477d..703970b002 100644 Binary files a/docs/static/screenshots/Pie/placement-center-light-800w.webp and b/docs/static/screenshots/Pie/placement-center-light-800w.webp differ diff --git a/docs/static/screenshots/Pie/placement-dark-240w.webp b/docs/static/screenshots/Pie/placement-dark-240w.webp index 33ff68c592..af46682d93 100644 Binary files a/docs/static/screenshots/Pie/placement-dark-240w.webp and b/docs/static/screenshots/Pie/placement-dark-240w.webp differ diff --git a/docs/static/screenshots/Pie/placement-dark-400w.webp b/docs/static/screenshots/Pie/placement-dark-400w.webp index e866eaea41..e716c250f2 100644 Binary files a/docs/static/screenshots/Pie/placement-dark-400w.webp and b/docs/static/screenshots/Pie/placement-dark-400w.webp differ diff --git a/docs/static/screenshots/Pie/placement-dark-800w.webp b/docs/static/screenshots/Pie/placement-dark-800w.webp index be9685f1d5..51f6fea7e5 100644 Binary files a/docs/static/screenshots/Pie/placement-dark-800w.webp and b/docs/static/screenshots/Pie/placement-dark-800w.webp differ diff --git a/docs/static/screenshots/Pie/placement-left-dark-240w.webp b/docs/static/screenshots/Pie/placement-left-dark-240w.webp index 75557929a3..f3b8a67e45 100644 Binary files a/docs/static/screenshots/Pie/placement-left-dark-240w.webp and b/docs/static/screenshots/Pie/placement-left-dark-240w.webp differ diff --git a/docs/static/screenshots/Pie/placement-left-dark-400w.webp b/docs/static/screenshots/Pie/placement-left-dark-400w.webp index f23a1f47a3..ad808b713b 100644 Binary files a/docs/static/screenshots/Pie/placement-left-dark-400w.webp and b/docs/static/screenshots/Pie/placement-left-dark-400w.webp differ diff --git a/docs/static/screenshots/Pie/placement-left-dark-800w.webp b/docs/static/screenshots/Pie/placement-left-dark-800w.webp index 6dbab631ad..d0eb9bb878 100644 Binary files a/docs/static/screenshots/Pie/placement-left-dark-800w.webp and b/docs/static/screenshots/Pie/placement-left-dark-800w.webp differ diff --git a/docs/static/screenshots/Pie/placement-left-light-240w.webp b/docs/static/screenshots/Pie/placement-left-light-240w.webp index 75557929a3..f3b8a67e45 100644 Binary files a/docs/static/screenshots/Pie/placement-left-light-240w.webp and b/docs/static/screenshots/Pie/placement-left-light-240w.webp differ diff --git a/docs/static/screenshots/Pie/placement-left-light-400w.webp b/docs/static/screenshots/Pie/placement-left-light-400w.webp index f23a1f47a3..ad808b713b 100644 Binary files a/docs/static/screenshots/Pie/placement-left-light-400w.webp and b/docs/static/screenshots/Pie/placement-left-light-400w.webp differ diff --git a/docs/static/screenshots/Pie/placement-left-light-800w.webp b/docs/static/screenshots/Pie/placement-left-light-800w.webp index 6dbab631ad..d0eb9bb878 100644 Binary files a/docs/static/screenshots/Pie/placement-left-light-800w.webp and b/docs/static/screenshots/Pie/placement-left-light-800w.webp differ diff --git a/docs/static/screenshots/Pie/placement-light-240w.webp b/docs/static/screenshots/Pie/placement-light-240w.webp index 33ff68c592..af46682d93 100644 Binary files a/docs/static/screenshots/Pie/placement-light-240w.webp and b/docs/static/screenshots/Pie/placement-light-240w.webp differ diff --git a/docs/static/screenshots/Pie/placement-light-400w.webp b/docs/static/screenshots/Pie/placement-light-400w.webp index e866eaea41..e716c250f2 100644 Binary files a/docs/static/screenshots/Pie/placement-light-400w.webp and b/docs/static/screenshots/Pie/placement-light-400w.webp differ diff --git a/docs/static/screenshots/Pie/placement-light-800w.webp b/docs/static/screenshots/Pie/placement-light-800w.webp index be9685f1d5..51f6fea7e5 100644 Binary files a/docs/static/screenshots/Pie/placement-light-800w.webp and b/docs/static/screenshots/Pie/placement-light-800w.webp differ diff --git a/docs/static/screenshots/Pie/placement-right-dark-240w.webp b/docs/static/screenshots/Pie/placement-right-dark-240w.webp index 28cb8aff3f..0e86951b32 100644 Binary files a/docs/static/screenshots/Pie/placement-right-dark-240w.webp and b/docs/static/screenshots/Pie/placement-right-dark-240w.webp differ diff --git a/docs/static/screenshots/Pie/placement-right-dark-400w.webp b/docs/static/screenshots/Pie/placement-right-dark-400w.webp index a0ea23f683..100d79ade0 100644 Binary files a/docs/static/screenshots/Pie/placement-right-dark-400w.webp and b/docs/static/screenshots/Pie/placement-right-dark-400w.webp differ diff --git a/docs/static/screenshots/Pie/placement-right-dark-800w.webp b/docs/static/screenshots/Pie/placement-right-dark-800w.webp index 2a34b8f799..8ab7181387 100644 Binary files a/docs/static/screenshots/Pie/placement-right-dark-800w.webp and b/docs/static/screenshots/Pie/placement-right-dark-800w.webp differ diff --git a/docs/static/screenshots/Pie/placement-right-light-240w.webp b/docs/static/screenshots/Pie/placement-right-light-240w.webp index 28cb8aff3f..0e86951b32 100644 Binary files a/docs/static/screenshots/Pie/placement-right-light-240w.webp and b/docs/static/screenshots/Pie/placement-right-light-240w.webp differ diff --git a/docs/static/screenshots/Pie/placement-right-light-400w.webp b/docs/static/screenshots/Pie/placement-right-light-400w.webp index a0ea23f683..100d79ade0 100644 Binary files a/docs/static/screenshots/Pie/placement-right-light-400w.webp and b/docs/static/screenshots/Pie/placement-right-light-400w.webp differ diff --git a/docs/static/screenshots/Pie/placement-right-light-800w.webp b/docs/static/screenshots/Pie/placement-right-light-800w.webp index 2a34b8f799..8ab7181387 100644 Binary files a/docs/static/screenshots/Pie/placement-right-light-800w.webp and b/docs/static/screenshots/Pie/placement-right-light-800w.webp differ diff --git a/docs/static/screenshots/Pie/tooltip-dark-240w.webp b/docs/static/screenshots/Pie/tooltip-dark-240w.webp index 2d5ae7c005..92c03d232a 100644 Binary files a/docs/static/screenshots/Pie/tooltip-dark-240w.webp and b/docs/static/screenshots/Pie/tooltip-dark-240w.webp differ diff --git a/docs/static/screenshots/Pie/tooltip-dark-400w.webp b/docs/static/screenshots/Pie/tooltip-dark-400w.webp index bc0f352c53..27baed0bc6 100644 Binary files a/docs/static/screenshots/Pie/tooltip-dark-400w.webp and b/docs/static/screenshots/Pie/tooltip-dark-400w.webp differ diff --git a/docs/static/screenshots/Pie/tooltip-dark-800w.webp b/docs/static/screenshots/Pie/tooltip-dark-800w.webp index d941e0e61b..8d37b33c68 100644 Binary files a/docs/static/screenshots/Pie/tooltip-dark-800w.webp and b/docs/static/screenshots/Pie/tooltip-dark-800w.webp differ diff --git a/docs/static/screenshots/Pie/tooltip-light-240w.webp b/docs/static/screenshots/Pie/tooltip-light-240w.webp index 2d5ae7c005..92c03d232a 100644 Binary files a/docs/static/screenshots/Pie/tooltip-light-240w.webp and b/docs/static/screenshots/Pie/tooltip-light-240w.webp differ diff --git a/docs/static/screenshots/Pie/tooltip-light-400w.webp b/docs/static/screenshots/Pie/tooltip-light-400w.webp index bc0f352c53..27baed0bc6 100644 Binary files a/docs/static/screenshots/Pie/tooltip-light-400w.webp and b/docs/static/screenshots/Pie/tooltip-light-400w.webp differ diff --git a/docs/static/screenshots/Pie/tooltip-light-800w.webp b/docs/static/screenshots/Pie/tooltip-light-800w.webp index d941e0e61b..8d37b33c68 100644 Binary files a/docs/static/screenshots/Pie/tooltip-light-800w.webp and b/docs/static/screenshots/Pie/tooltip-light-800w.webp differ diff --git a/docs/static/screenshots/Pie/tooltip-with-arcs-slot-dark-240w.webp b/docs/static/screenshots/Pie/tooltip-with-arcs-slot-dark-240w.webp index 081b2aff1a..8cd7d3f1ce 100644 Binary files a/docs/static/screenshots/Pie/tooltip-with-arcs-slot-dark-240w.webp and b/docs/static/screenshots/Pie/tooltip-with-arcs-slot-dark-240w.webp differ diff --git a/docs/static/screenshots/Pie/tooltip-with-arcs-slot-dark-400w.webp b/docs/static/screenshots/Pie/tooltip-with-arcs-slot-dark-400w.webp index 444ef58544..15d4f66877 100644 Binary files a/docs/static/screenshots/Pie/tooltip-with-arcs-slot-dark-400w.webp and b/docs/static/screenshots/Pie/tooltip-with-arcs-slot-dark-400w.webp differ diff --git a/docs/static/screenshots/Pie/tooltip-with-arcs-slot-dark-800w.webp b/docs/static/screenshots/Pie/tooltip-with-arcs-slot-dark-800w.webp index cbb9ff37a0..e69f5e7f7d 100644 Binary files a/docs/static/screenshots/Pie/tooltip-with-arcs-slot-dark-800w.webp and b/docs/static/screenshots/Pie/tooltip-with-arcs-slot-dark-800w.webp differ diff --git a/docs/static/screenshots/Pie/tooltip-with-arcs-slot-light-240w.webp b/docs/static/screenshots/Pie/tooltip-with-arcs-slot-light-240w.webp index 081b2aff1a..8cd7d3f1ce 100644 Binary files a/docs/static/screenshots/Pie/tooltip-with-arcs-slot-light-240w.webp and b/docs/static/screenshots/Pie/tooltip-with-arcs-slot-light-240w.webp differ diff --git a/docs/static/screenshots/Pie/tooltip-with-arcs-slot-light-400w.webp b/docs/static/screenshots/Pie/tooltip-with-arcs-slot-light-400w.webp index 444ef58544..15d4f66877 100644 Binary files a/docs/static/screenshots/Pie/tooltip-with-arcs-slot-light-400w.webp and b/docs/static/screenshots/Pie/tooltip-with-arcs-slot-light-400w.webp differ diff --git a/docs/static/screenshots/Pie/tooltip-with-arcs-slot-light-800w.webp b/docs/static/screenshots/Pie/tooltip-with-arcs-slot-light-800w.webp index cbb9ff37a0..e69f5e7f7d 100644 Binary files a/docs/static/screenshots/Pie/tooltip-with-arcs-slot-light-800w.webp and b/docs/static/screenshots/Pie/tooltip-with-arcs-slot-light-800w.webp differ diff --git a/docs/static/screenshots/Pie/tweened-dark-240w.webp b/docs/static/screenshots/Pie/tweened-dark-240w.webp index 62585cd622..d3d618331d 100644 Binary files a/docs/static/screenshots/Pie/tweened-dark-240w.webp and b/docs/static/screenshots/Pie/tweened-dark-240w.webp differ diff --git a/docs/static/screenshots/Pie/tweened-dark-400w.webp b/docs/static/screenshots/Pie/tweened-dark-400w.webp index 33214aa8a2..dd25c3d3b6 100644 Binary files a/docs/static/screenshots/Pie/tweened-dark-400w.webp and b/docs/static/screenshots/Pie/tweened-dark-400w.webp differ diff --git a/docs/static/screenshots/Pie/tweened-dark-800w.webp b/docs/static/screenshots/Pie/tweened-dark-800w.webp index 9af8a2c110..de4fe92743 100644 Binary files a/docs/static/screenshots/Pie/tweened-dark-800w.webp and b/docs/static/screenshots/Pie/tweened-dark-800w.webp differ diff --git a/docs/static/screenshots/Pie/tweened-light-240w.webp b/docs/static/screenshots/Pie/tweened-light-240w.webp index 62585cd622..d3d618331d 100644 Binary files a/docs/static/screenshots/Pie/tweened-light-240w.webp and b/docs/static/screenshots/Pie/tweened-light-240w.webp differ diff --git a/docs/static/screenshots/Pie/tweened-light-400w.webp b/docs/static/screenshots/Pie/tweened-light-400w.webp index 33214aa8a2..dd25c3d3b6 100644 Binary files a/docs/static/screenshots/Pie/tweened-light-400w.webp and b/docs/static/screenshots/Pie/tweened-light-400w.webp differ diff --git a/docs/static/screenshots/Pie/tweened-light-800w.webp b/docs/static/screenshots/Pie/tweened-light-800w.webp index 9af8a2c110..de4fe92743 100644 Binary files a/docs/static/screenshots/Pie/tweened-light-800w.webp and b/docs/static/screenshots/Pie/tweened-light-800w.webp differ diff --git a/docs/static/screenshots/PieChart/donut-with-text-dark-400w.webp b/docs/static/screenshots/PieChart/donut-with-text-dark-400w.webp index 09ab2e086e..652c2818e0 100644 Binary files a/docs/static/screenshots/PieChart/donut-with-text-dark-400w.webp and b/docs/static/screenshots/PieChart/donut-with-text-dark-400w.webp differ diff --git a/docs/static/screenshots/PieChart/donut-with-text-dark-800w.webp b/docs/static/screenshots/PieChart/donut-with-text-dark-800w.webp index 4b11f54aa4..14ee939185 100644 Binary files a/docs/static/screenshots/PieChart/donut-with-text-dark-800w.webp and b/docs/static/screenshots/PieChart/donut-with-text-dark-800w.webp differ diff --git a/docs/static/screenshots/PieChart/donut-with-text-light-400w.webp b/docs/static/screenshots/PieChart/donut-with-text-light-400w.webp index dda7a23197..a38eabb805 100644 Binary files a/docs/static/screenshots/PieChart/donut-with-text-light-400w.webp and b/docs/static/screenshots/PieChart/donut-with-text-light-400w.webp differ diff --git a/docs/static/screenshots/PieChart/donut-with-text-light-800w.webp b/docs/static/screenshots/PieChart/donut-with-text-light-800w.webp index fd92208c92..03ac862643 100644 Binary files a/docs/static/screenshots/PieChart/donut-with-text-light-800w.webp and b/docs/static/screenshots/PieChart/donut-with-text-light-800w.webp differ diff --git a/docs/static/screenshots/PieChart/labels-callout-dark-400w.webp b/docs/static/screenshots/PieChart/labels-callout-dark-400w.webp index a014de0578..e632273635 100644 Binary files a/docs/static/screenshots/PieChart/labels-callout-dark-400w.webp and b/docs/static/screenshots/PieChart/labels-callout-dark-400w.webp differ diff --git a/docs/static/screenshots/PieChart/labels-callout-dark-800w.webp b/docs/static/screenshots/PieChart/labels-callout-dark-800w.webp index c00fcbb25e..f11de24e86 100644 Binary files a/docs/static/screenshots/PieChart/labels-callout-dark-800w.webp and b/docs/static/screenshots/PieChart/labels-callout-dark-800w.webp differ diff --git a/docs/static/screenshots/PieChart/labels-callout-light-240w.webp b/docs/static/screenshots/PieChart/labels-callout-light-240w.webp index c4b145db65..c98e47087f 100644 Binary files a/docs/static/screenshots/PieChart/labels-callout-light-240w.webp and b/docs/static/screenshots/PieChart/labels-callout-light-240w.webp differ diff --git a/docs/static/screenshots/PieChart/labels-callout-light-400w.webp b/docs/static/screenshots/PieChart/labels-callout-light-400w.webp index 678ab25c5a..35a31942c5 100644 Binary files a/docs/static/screenshots/PieChart/labels-callout-light-400w.webp and b/docs/static/screenshots/PieChart/labels-callout-light-400w.webp differ diff --git a/docs/static/screenshots/PieChart/labels-callout-light-800w.webp b/docs/static/screenshots/PieChart/labels-callout-light-800w.webp index b1f2330941..35ab3708d2 100644 Binary files a/docs/static/screenshots/PieChart/labels-callout-light-800w.webp and b/docs/static/screenshots/PieChart/labels-callout-light-800w.webp differ diff --git a/docs/static/screenshots/PieChart/labels-dark-400w.webp b/docs/static/screenshots/PieChart/labels-dark-400w.webp index 78a248b983..eff8406b5e 100644 Binary files a/docs/static/screenshots/PieChart/labels-dark-400w.webp and b/docs/static/screenshots/PieChart/labels-dark-400w.webp differ diff --git a/docs/static/screenshots/PieChart/labels-dark-800w.webp b/docs/static/screenshots/PieChart/labels-dark-800w.webp index edcb37fd61..e9a3cc2089 100644 Binary files a/docs/static/screenshots/PieChart/labels-dark-800w.webp and b/docs/static/screenshots/PieChart/labels-dark-800w.webp differ diff --git a/docs/static/screenshots/PieChart/labels-light-240w.webp b/docs/static/screenshots/PieChart/labels-light-240w.webp index 0968963c99..9f3f762102 100644 Binary files a/docs/static/screenshots/PieChart/labels-light-240w.webp and b/docs/static/screenshots/PieChart/labels-light-240w.webp differ diff --git a/docs/static/screenshots/PieChart/labels-light-400w.webp b/docs/static/screenshots/PieChart/labels-light-400w.webp index d5d7288ef4..c64680286d 100644 Binary files a/docs/static/screenshots/PieChart/labels-light-400w.webp and b/docs/static/screenshots/PieChart/labels-light-400w.webp differ diff --git a/docs/static/screenshots/PieChart/labels-light-800w.webp b/docs/static/screenshots/PieChart/labels-light-800w.webp index 4ea2ece4cd..7e2033f83c 100644 Binary files a/docs/static/screenshots/PieChart/labels-light-800w.webp and b/docs/static/screenshots/PieChart/labels-light-800w.webp differ diff --git a/docs/static/screenshots/PieChart/legend-dark-400w.webp b/docs/static/screenshots/PieChart/legend-dark-400w.webp index b6b2a566e5..aa762fef8c 100644 Binary files a/docs/static/screenshots/PieChart/legend-dark-400w.webp and b/docs/static/screenshots/PieChart/legend-dark-400w.webp differ diff --git a/docs/static/screenshots/PieChart/legend-dark-800w.webp b/docs/static/screenshots/PieChart/legend-dark-800w.webp index be13b4329b..27087f19bb 100644 Binary files a/docs/static/screenshots/PieChart/legend-dark-800w.webp and b/docs/static/screenshots/PieChart/legend-dark-800w.webp differ diff --git a/docs/static/screenshots/PieChart/legend-light-400w.webp b/docs/static/screenshots/PieChart/legend-light-400w.webp index b5a196f54a..93c4956226 100644 Binary files a/docs/static/screenshots/PieChart/legend-light-400w.webp and b/docs/static/screenshots/PieChart/legend-light-400w.webp differ diff --git a/docs/static/screenshots/PieChart/legend-light-800w.webp b/docs/static/screenshots/PieChart/legend-light-800w.webp index df4a840652..4a4bdcd2dd 100644 Binary files a/docs/static/screenshots/PieChart/legend-light-800w.webp and b/docs/static/screenshots/PieChart/legend-light-800w.webp differ diff --git a/docs/static/screenshots/PieChart/legend-placement-dark-400w.webp b/docs/static/screenshots/PieChart/legend-placement-dark-400w.webp index b6b2a566e5..aa762fef8c 100644 Binary files a/docs/static/screenshots/PieChart/legend-placement-dark-400w.webp and b/docs/static/screenshots/PieChart/legend-placement-dark-400w.webp differ diff --git a/docs/static/screenshots/PieChart/legend-placement-dark-800w.webp b/docs/static/screenshots/PieChart/legend-placement-dark-800w.webp index be13b4329b..27087f19bb 100644 Binary files a/docs/static/screenshots/PieChart/legend-placement-dark-800w.webp and b/docs/static/screenshots/PieChart/legend-placement-dark-800w.webp differ diff --git a/docs/static/screenshots/PieChart/legend-placement-light-400w.webp b/docs/static/screenshots/PieChart/legend-placement-light-400w.webp index b5a196f54a..93c4956226 100644 Binary files a/docs/static/screenshots/PieChart/legend-placement-light-400w.webp and b/docs/static/screenshots/PieChart/legend-placement-light-400w.webp differ diff --git a/docs/static/screenshots/PieChart/legend-placement-light-800w.webp b/docs/static/screenshots/PieChart/legend-placement-light-800w.webp index df4a840652..4a4bdcd2dd 100644 Binary files a/docs/static/screenshots/PieChart/legend-placement-light-800w.webp and b/docs/static/screenshots/PieChart/legend-placement-light-800w.webp differ diff --git a/docs/static/screenshots/PieChart/legend-programmatic-control-dark-240w.webp b/docs/static/screenshots/PieChart/legend-programmatic-control-dark-240w.webp new file mode 100644 index 0000000000..dbbb78c2b1 Binary files /dev/null and b/docs/static/screenshots/PieChart/legend-programmatic-control-dark-240w.webp differ diff --git a/docs/static/screenshots/PieChart/legend-programmatic-control-dark-400w.webp b/docs/static/screenshots/PieChart/legend-programmatic-control-dark-400w.webp new file mode 100644 index 0000000000..61e86dfa2a Binary files /dev/null and b/docs/static/screenshots/PieChart/legend-programmatic-control-dark-400w.webp differ diff --git a/docs/static/screenshots/PieChart/legend-programmatic-control-dark-800w.webp b/docs/static/screenshots/PieChart/legend-programmatic-control-dark-800w.webp new file mode 100644 index 0000000000..d5c71af2b6 Binary files /dev/null and b/docs/static/screenshots/PieChart/legend-programmatic-control-dark-800w.webp differ diff --git a/docs/static/screenshots/PieChart/legend-programmatic-control-light-240w.webp b/docs/static/screenshots/PieChart/legend-programmatic-control-light-240w.webp new file mode 100644 index 0000000000..dbbb78c2b1 Binary files /dev/null and b/docs/static/screenshots/PieChart/legend-programmatic-control-light-240w.webp differ diff --git a/docs/static/screenshots/PieChart/legend-programmatic-control-light-400w.webp b/docs/static/screenshots/PieChart/legend-programmatic-control-light-400w.webp new file mode 100644 index 0000000000..61e86dfa2a Binary files /dev/null and b/docs/static/screenshots/PieChart/legend-programmatic-control-light-400w.webp differ diff --git a/docs/static/screenshots/PieChart/legend-programmatic-control-light-800w.webp b/docs/static/screenshots/PieChart/legend-programmatic-control-light-800w.webp new file mode 100644 index 0000000000..d5c71af2b6 Binary files /dev/null and b/docs/static/screenshots/PieChart/legend-programmatic-control-light-800w.webp differ diff --git a/docs/static/screenshots/PieChart/legend-responsive-dark-400w.webp b/docs/static/screenshots/PieChart/legend-responsive-dark-400w.webp index 8cef610f28..5d047c88f3 100644 Binary files a/docs/static/screenshots/PieChart/legend-responsive-dark-400w.webp and b/docs/static/screenshots/PieChart/legend-responsive-dark-400w.webp differ diff --git a/docs/static/screenshots/PieChart/legend-responsive-dark-800w.webp b/docs/static/screenshots/PieChart/legend-responsive-dark-800w.webp index 736c4fb368..125daa960e 100644 Binary files a/docs/static/screenshots/PieChart/legend-responsive-dark-800w.webp and b/docs/static/screenshots/PieChart/legend-responsive-dark-800w.webp differ diff --git a/docs/static/screenshots/PieChart/legend-responsive-light-400w.webp b/docs/static/screenshots/PieChart/legend-responsive-light-400w.webp index 6136b69cec..032dc58a71 100644 Binary files a/docs/static/screenshots/PieChart/legend-responsive-light-400w.webp and b/docs/static/screenshots/PieChart/legend-responsive-light-400w.webp differ diff --git a/docs/static/screenshots/PieChart/legend-responsive-light-800w.webp b/docs/static/screenshots/PieChart/legend-responsive-light-800w.webp index 24062b1590..dacc533541 100644 Binary files a/docs/static/screenshots/PieChart/legend-responsive-light-800w.webp and b/docs/static/screenshots/PieChart/legend-responsive-light-800w.webp differ diff --git a/docs/static/screenshots/PieChart/legend-with-padding-dark-240w.webp b/docs/static/screenshots/PieChart/legend-with-padding-dark-240w.webp index 0100a5a709..c1b09e2a9d 100644 Binary files a/docs/static/screenshots/PieChart/legend-with-padding-dark-240w.webp and b/docs/static/screenshots/PieChart/legend-with-padding-dark-240w.webp differ diff --git a/docs/static/screenshots/PieChart/legend-with-padding-dark-400w.webp b/docs/static/screenshots/PieChart/legend-with-padding-dark-400w.webp index e9c6b5b7ce..d9e5529187 100644 Binary files a/docs/static/screenshots/PieChart/legend-with-padding-dark-400w.webp and b/docs/static/screenshots/PieChart/legend-with-padding-dark-400w.webp differ diff --git a/docs/static/screenshots/PieChart/legend-with-padding-dark-800w.webp b/docs/static/screenshots/PieChart/legend-with-padding-dark-800w.webp index 9d62030ac0..b2c529960d 100644 Binary files a/docs/static/screenshots/PieChart/legend-with-padding-dark-800w.webp and b/docs/static/screenshots/PieChart/legend-with-padding-dark-800w.webp differ diff --git a/docs/static/screenshots/PieChart/placement-custom-dark-240w.webp b/docs/static/screenshots/PieChart/placement-custom-dark-240w.webp index d42da4f699..22ca693161 100644 Binary files a/docs/static/screenshots/PieChart/placement-custom-dark-240w.webp and b/docs/static/screenshots/PieChart/placement-custom-dark-240w.webp differ diff --git a/docs/static/screenshots/PieChart/placement-custom-dark-400w.webp b/docs/static/screenshots/PieChart/placement-custom-dark-400w.webp index 6e31873cc1..4f47b1c935 100644 Binary files a/docs/static/screenshots/PieChart/placement-custom-dark-400w.webp and b/docs/static/screenshots/PieChart/placement-custom-dark-400w.webp differ diff --git a/docs/static/screenshots/PieChart/placement-custom-dark-800w.webp b/docs/static/screenshots/PieChart/placement-custom-dark-800w.webp index cc232db3c6..a9034f33bd 100644 Binary files a/docs/static/screenshots/PieChart/placement-custom-dark-800w.webp and b/docs/static/screenshots/PieChart/placement-custom-dark-800w.webp differ diff --git a/docs/static/screenshots/PieChart/placement-left-dark-240w.webp b/docs/static/screenshots/PieChart/placement-left-dark-240w.webp index 004b25fe2b..f207d34a24 100644 Binary files a/docs/static/screenshots/PieChart/placement-left-dark-240w.webp and b/docs/static/screenshots/PieChart/placement-left-dark-240w.webp differ diff --git a/docs/static/screenshots/PieChart/placement-left-dark-400w.webp b/docs/static/screenshots/PieChart/placement-left-dark-400w.webp index 6b2b847457..1a84c32449 100644 Binary files a/docs/static/screenshots/PieChart/placement-left-dark-400w.webp and b/docs/static/screenshots/PieChart/placement-left-dark-400w.webp differ diff --git a/docs/static/screenshots/PieChart/placement-left-dark-800w.webp b/docs/static/screenshots/PieChart/placement-left-dark-800w.webp index 025aee7d9c..43eff0701e 100644 Binary files a/docs/static/screenshots/PieChart/placement-left-dark-800w.webp and b/docs/static/screenshots/PieChart/placement-left-dark-800w.webp differ diff --git a/docs/static/screenshots/PieChart/segments-dark-240w.webp b/docs/static/screenshots/PieChart/segments-dark-240w.webp index e1287293e4..6d589ac040 100644 Binary files a/docs/static/screenshots/PieChart/segments-dark-240w.webp and b/docs/static/screenshots/PieChart/segments-dark-240w.webp differ diff --git a/docs/static/screenshots/PieChart/segments-dark-400w.webp b/docs/static/screenshots/PieChart/segments-dark-400w.webp index be9d152ed8..66326d1be9 100644 Binary files a/docs/static/screenshots/PieChart/segments-dark-400w.webp and b/docs/static/screenshots/PieChart/segments-dark-400w.webp differ diff --git a/docs/static/screenshots/PieChart/segments-dark-800w.webp b/docs/static/screenshots/PieChart/segments-dark-800w.webp index 12fd2896ef..0bc5784974 100644 Binary files a/docs/static/screenshots/PieChart/segments-dark-800w.webp and b/docs/static/screenshots/PieChart/segments-dark-800w.webp differ diff --git a/docs/static/screenshots/PieChart/segments-light-800w.webp b/docs/static/screenshots/PieChart/segments-light-800w.webp index 47486aa8a5..e1849f5b14 100644 Binary files a/docs/static/screenshots/PieChart/segments-light-800w.webp and b/docs/static/screenshots/PieChart/segments-light-800w.webp differ diff --git a/docs/static/screenshots/PieChart/series-click-dark-240w.webp b/docs/static/screenshots/PieChart/series-click-dark-240w.webp index 2acccd89da..7f9ec4372f 100644 Binary files a/docs/static/screenshots/PieChart/series-click-dark-240w.webp and b/docs/static/screenshots/PieChart/series-click-dark-240w.webp differ diff --git a/docs/static/screenshots/PieChart/series-click-dark-400w.webp b/docs/static/screenshots/PieChart/series-click-dark-400w.webp index e34c824189..4985a0d8d4 100644 Binary files a/docs/static/screenshots/PieChart/series-click-dark-400w.webp and b/docs/static/screenshots/PieChart/series-click-dark-400w.webp differ diff --git a/docs/static/screenshots/PieChart/series-click-dark-800w.webp b/docs/static/screenshots/PieChart/series-click-dark-800w.webp index f0ecabd21c..3209203e90 100644 Binary files a/docs/static/screenshots/PieChart/series-click-dark-800w.webp and b/docs/static/screenshots/PieChart/series-click-dark-800w.webp differ diff --git a/docs/static/screenshots/PieChart/series-click-light-240w.webp b/docs/static/screenshots/PieChart/series-click-light-240w.webp index 1b5ccb7a50..7f9ec4372f 100644 Binary files a/docs/static/screenshots/PieChart/series-click-light-240w.webp and b/docs/static/screenshots/PieChart/series-click-light-240w.webp differ diff --git a/docs/static/screenshots/PieChart/series-click-light-400w.webp b/docs/static/screenshots/PieChart/series-click-light-400w.webp index e6024b810f..4985a0d8d4 100644 Binary files a/docs/static/screenshots/PieChart/series-click-light-400w.webp and b/docs/static/screenshots/PieChart/series-click-light-400w.webp differ diff --git a/docs/static/screenshots/PieChart/series-click-light-800w.webp b/docs/static/screenshots/PieChart/series-click-light-800w.webp index e4af016239..3209203e90 100644 Binary files a/docs/static/screenshots/PieChart/series-click-light-800w.webp and b/docs/static/screenshots/PieChart/series-click-light-800w.webp differ diff --git a/docs/static/screenshots/PieChart/series-dark-240w.webp b/docs/static/screenshots/PieChart/series-dark-240w.webp index 2acccd89da..7f9ec4372f 100644 Binary files a/docs/static/screenshots/PieChart/series-dark-240w.webp and b/docs/static/screenshots/PieChart/series-dark-240w.webp differ diff --git a/docs/static/screenshots/PieChart/series-dark-400w.webp b/docs/static/screenshots/PieChart/series-dark-400w.webp index e34c824189..4985a0d8d4 100644 Binary files a/docs/static/screenshots/PieChart/series-dark-400w.webp and b/docs/static/screenshots/PieChart/series-dark-400w.webp differ diff --git a/docs/static/screenshots/PieChart/series-dark-800w.webp b/docs/static/screenshots/PieChart/series-dark-800w.webp index f0ecabd21c..3209203e90 100644 Binary files a/docs/static/screenshots/PieChart/series-dark-800w.webp and b/docs/static/screenshots/PieChart/series-dark-800w.webp differ diff --git a/docs/static/screenshots/PieChart/series-light-240w.webp b/docs/static/screenshots/PieChart/series-light-240w.webp index 1b5ccb7a50..7f9ec4372f 100644 Binary files a/docs/static/screenshots/PieChart/series-light-240w.webp and b/docs/static/screenshots/PieChart/series-light-240w.webp differ diff --git a/docs/static/screenshots/PieChart/series-light-400w.webp b/docs/static/screenshots/PieChart/series-light-400w.webp index e6024b810f..4985a0d8d4 100644 Binary files a/docs/static/screenshots/PieChart/series-light-400w.webp and b/docs/static/screenshots/PieChart/series-light-400w.webp differ diff --git a/docs/static/screenshots/PieChart/series-light-800w.webp b/docs/static/screenshots/PieChart/series-light-800w.webp index e4af016239..3209203e90 100644 Binary files a/docs/static/screenshots/PieChart/series-light-800w.webp and b/docs/static/screenshots/PieChart/series-light-800w.webp differ diff --git a/docs/static/screenshots/PieChart/series-props-dark-240w.webp b/docs/static/screenshots/PieChart/series-props-dark-240w.webp index c1757de979..da7215b24e 100644 Binary files a/docs/static/screenshots/PieChart/series-props-dark-240w.webp and b/docs/static/screenshots/PieChart/series-props-dark-240w.webp differ diff --git a/docs/static/screenshots/PieChart/series-props-dark-400w.webp b/docs/static/screenshots/PieChart/series-props-dark-400w.webp index eddd397249..bd914f6624 100644 Binary files a/docs/static/screenshots/PieChart/series-props-dark-400w.webp and b/docs/static/screenshots/PieChart/series-props-dark-400w.webp differ diff --git a/docs/static/screenshots/PieChart/series-props-dark-800w.webp b/docs/static/screenshots/PieChart/series-props-dark-800w.webp index 2220545684..01b7ff70ca 100644 Binary files a/docs/static/screenshots/PieChart/series-props-dark-800w.webp and b/docs/static/screenshots/PieChart/series-props-dark-800w.webp differ diff --git a/docs/static/screenshots/PieChart/series-props-light-240w.webp b/docs/static/screenshots/PieChart/series-props-light-240w.webp index cafd752184..da7215b24e 100644 Binary files a/docs/static/screenshots/PieChart/series-props-light-240w.webp and b/docs/static/screenshots/PieChart/series-props-light-240w.webp differ diff --git a/docs/static/screenshots/PieChart/series-props-light-400w.webp b/docs/static/screenshots/PieChart/series-props-light-400w.webp index fb9970e515..bd914f6624 100644 Binary files a/docs/static/screenshots/PieChart/series-props-light-400w.webp and b/docs/static/screenshots/PieChart/series-props-light-400w.webp differ diff --git a/docs/static/screenshots/PieChart/series-props-light-800w.webp b/docs/static/screenshots/PieChart/series-props-light-800w.webp index 5cc6f01253..01b7ff70ca 100644 Binary files a/docs/static/screenshots/PieChart/series-props-light-800w.webp and b/docs/static/screenshots/PieChart/series-props-light-800w.webp differ diff --git a/docs/static/screenshots/Points/basic-dark-240w.webp b/docs/static/screenshots/Points/basic-dark-240w.webp index edca220f75..b8d80f9b8a 100644 Binary files a/docs/static/screenshots/Points/basic-dark-240w.webp and b/docs/static/screenshots/Points/basic-dark-240w.webp differ diff --git a/docs/static/screenshots/Points/basic-dark-400w.webp b/docs/static/screenshots/Points/basic-dark-400w.webp index 98822a4aac..40805d5ef3 100644 Binary files a/docs/static/screenshots/Points/basic-dark-400w.webp and b/docs/static/screenshots/Points/basic-dark-400w.webp differ diff --git a/docs/static/screenshots/Points/basic-dark-800w.webp b/docs/static/screenshots/Points/basic-dark-800w.webp index 0470046c1a..af9412a160 100644 Binary files a/docs/static/screenshots/Points/basic-dark-800w.webp and b/docs/static/screenshots/Points/basic-dark-800w.webp differ diff --git a/docs/static/screenshots/Points/basic-light-240w.webp b/docs/static/screenshots/Points/basic-light-240w.webp index 64eb2fc2a9..adee6eb67c 100644 Binary files a/docs/static/screenshots/Points/basic-light-240w.webp and b/docs/static/screenshots/Points/basic-light-240w.webp differ diff --git a/docs/static/screenshots/Points/basic-light-400w.webp b/docs/static/screenshots/Points/basic-light-400w.webp index 2a39a13851..cdeadde33b 100644 Binary files a/docs/static/screenshots/Points/basic-light-400w.webp and b/docs/static/screenshots/Points/basic-light-400w.webp differ diff --git a/docs/static/screenshots/Points/basic-light-800w.webp b/docs/static/screenshots/Points/basic-light-800w.webp index 662eb0293c..970493cab6 100644 Binary files a/docs/static/screenshots/Points/basic-light-800w.webp and b/docs/static/screenshots/Points/basic-light-800w.webp differ diff --git a/docs/static/screenshots/Points/color-via-class-dark-240w.webp b/docs/static/screenshots/Points/color-via-class-dark-240w.webp index 10bd6c44b9..efe7d497e7 100644 Binary files a/docs/static/screenshots/Points/color-via-class-dark-240w.webp and b/docs/static/screenshots/Points/color-via-class-dark-240w.webp differ diff --git a/docs/static/screenshots/Points/color-via-class-dark-400w.webp b/docs/static/screenshots/Points/color-via-class-dark-400w.webp index 447bdd9f04..e3eba01144 100644 Binary files a/docs/static/screenshots/Points/color-via-class-dark-400w.webp and b/docs/static/screenshots/Points/color-via-class-dark-400w.webp differ diff --git a/docs/static/screenshots/Points/color-via-class-dark-800w.webp b/docs/static/screenshots/Points/color-via-class-dark-800w.webp index 4089443bd5..cf3ece5bfd 100644 Binary files a/docs/static/screenshots/Points/color-via-class-dark-800w.webp and b/docs/static/screenshots/Points/color-via-class-dark-800w.webp differ diff --git a/docs/static/screenshots/Points/color-via-class-light-240w.webp b/docs/static/screenshots/Points/color-via-class-light-240w.webp index e7b9853f06..586c69de77 100644 Binary files a/docs/static/screenshots/Points/color-via-class-light-240w.webp and b/docs/static/screenshots/Points/color-via-class-light-240w.webp differ diff --git a/docs/static/screenshots/Points/color-via-class-light-400w.webp b/docs/static/screenshots/Points/color-via-class-light-400w.webp index bbb5c48ba1..31f732a461 100644 Binary files a/docs/static/screenshots/Points/color-via-class-light-400w.webp and b/docs/static/screenshots/Points/color-via-class-light-400w.webp differ diff --git a/docs/static/screenshots/Points/color-via-class-light-800w.webp b/docs/static/screenshots/Points/color-via-class-light-800w.webp index 732a3cf8b2..833b1739af 100644 Binary files a/docs/static/screenshots/Points/color-via-class-light-800w.webp and b/docs/static/screenshots/Points/color-via-class-light-800w.webp differ diff --git a/docs/static/screenshots/Points/color-via-fill-dark-240w.webp b/docs/static/screenshots/Points/color-via-fill-dark-240w.webp index b703b3dcaf..998560c8df 100644 Binary files a/docs/static/screenshots/Points/color-via-fill-dark-240w.webp and b/docs/static/screenshots/Points/color-via-fill-dark-240w.webp differ diff --git a/docs/static/screenshots/Points/color-via-fill-dark-400w.webp b/docs/static/screenshots/Points/color-via-fill-dark-400w.webp index 7ae36c83ce..827d5f7fb6 100644 Binary files a/docs/static/screenshots/Points/color-via-fill-dark-400w.webp and b/docs/static/screenshots/Points/color-via-fill-dark-400w.webp differ diff --git a/docs/static/screenshots/Points/color-via-fill-dark-800w.webp b/docs/static/screenshots/Points/color-via-fill-dark-800w.webp index ceb5d24b97..ef0b0a4a39 100644 Binary files a/docs/static/screenshots/Points/color-via-fill-dark-800w.webp and b/docs/static/screenshots/Points/color-via-fill-dark-800w.webp differ diff --git a/docs/static/screenshots/Points/color-via-fill-light-240w.webp b/docs/static/screenshots/Points/color-via-fill-light-240w.webp index 6c3012276c..a90b8a4abd 100644 Binary files a/docs/static/screenshots/Points/color-via-fill-light-240w.webp and b/docs/static/screenshots/Points/color-via-fill-light-240w.webp differ diff --git a/docs/static/screenshots/Points/color-via-fill-light-400w.webp b/docs/static/screenshots/Points/color-via-fill-light-400w.webp index ee1e5684e8..a7ac30c533 100644 Binary files a/docs/static/screenshots/Points/color-via-fill-light-400w.webp and b/docs/static/screenshots/Points/color-via-fill-light-400w.webp differ diff --git a/docs/static/screenshots/Points/color-via-fill-light-800w.webp b/docs/static/screenshots/Points/color-via-fill-light-800w.webp index 04467b2a21..77e7f10829 100644 Binary files a/docs/static/screenshots/Points/color-via-fill-light-800w.webp and b/docs/static/screenshots/Points/color-via-fill-light-800w.webp differ diff --git a/docs/static/screenshots/Points/color-via-ordinal-scale-dark-240w.webp b/docs/static/screenshots/Points/color-via-ordinal-scale-dark-240w.webp index d21de06e7e..aa66092dc9 100644 Binary files a/docs/static/screenshots/Points/color-via-ordinal-scale-dark-240w.webp and b/docs/static/screenshots/Points/color-via-ordinal-scale-dark-240w.webp differ diff --git a/docs/static/screenshots/Points/color-via-ordinal-scale-dark-400w.webp b/docs/static/screenshots/Points/color-via-ordinal-scale-dark-400w.webp index e15a9d66c9..b12e950f4c 100644 Binary files a/docs/static/screenshots/Points/color-via-ordinal-scale-dark-400w.webp and b/docs/static/screenshots/Points/color-via-ordinal-scale-dark-400w.webp differ diff --git a/docs/static/screenshots/Points/color-via-ordinal-scale-dark-800w.webp b/docs/static/screenshots/Points/color-via-ordinal-scale-dark-800w.webp index 9fb881c2ef..fdf42b7da6 100644 Binary files a/docs/static/screenshots/Points/color-via-ordinal-scale-dark-800w.webp and b/docs/static/screenshots/Points/color-via-ordinal-scale-dark-800w.webp differ diff --git a/docs/static/screenshots/Points/color-via-ordinal-scale-light-240w.webp b/docs/static/screenshots/Points/color-via-ordinal-scale-light-240w.webp index f9e463d6a2..f2555d02b3 100644 Binary files a/docs/static/screenshots/Points/color-via-ordinal-scale-light-240w.webp and b/docs/static/screenshots/Points/color-via-ordinal-scale-light-240w.webp differ diff --git a/docs/static/screenshots/Points/color-via-ordinal-scale-light-400w.webp b/docs/static/screenshots/Points/color-via-ordinal-scale-light-400w.webp index 9a2481af1a..d8470175b0 100644 Binary files a/docs/static/screenshots/Points/color-via-ordinal-scale-light-400w.webp and b/docs/static/screenshots/Points/color-via-ordinal-scale-light-400w.webp differ diff --git a/docs/static/screenshots/Points/color-via-ordinal-scale-light-800w.webp b/docs/static/screenshots/Points/color-via-ordinal-scale-light-800w.webp index 4834a7bc5a..34e0e3b0d9 100644 Binary files a/docs/static/screenshots/Points/color-via-ordinal-scale-light-800w.webp and b/docs/static/screenshots/Points/color-via-ordinal-scale-light-800w.webp differ diff --git a/docs/static/screenshots/Points/color-via-threshold-scale-dark-240w.webp b/docs/static/screenshots/Points/color-via-threshold-scale-dark-240w.webp index 69e1be1101..ade511b476 100644 Binary files a/docs/static/screenshots/Points/color-via-threshold-scale-dark-240w.webp and b/docs/static/screenshots/Points/color-via-threshold-scale-dark-240w.webp differ diff --git a/docs/static/screenshots/Points/color-via-threshold-scale-dark-400w.webp b/docs/static/screenshots/Points/color-via-threshold-scale-dark-400w.webp index 8ff7620557..4f8bfc5a12 100644 Binary files a/docs/static/screenshots/Points/color-via-threshold-scale-dark-400w.webp and b/docs/static/screenshots/Points/color-via-threshold-scale-dark-400w.webp differ diff --git a/docs/static/screenshots/Points/color-via-threshold-scale-dark-800w.webp b/docs/static/screenshots/Points/color-via-threshold-scale-dark-800w.webp index 945d33550b..bfc0be601a 100644 Binary files a/docs/static/screenshots/Points/color-via-threshold-scale-dark-800w.webp and b/docs/static/screenshots/Points/color-via-threshold-scale-dark-800w.webp differ diff --git a/docs/static/screenshots/Points/color-via-threshold-scale-light-240w.webp b/docs/static/screenshots/Points/color-via-threshold-scale-light-240w.webp index 005df0745d..1be5facd92 100644 Binary files a/docs/static/screenshots/Points/color-via-threshold-scale-light-240w.webp and b/docs/static/screenshots/Points/color-via-threshold-scale-light-240w.webp differ diff --git a/docs/static/screenshots/Points/color-via-threshold-scale-light-400w.webp b/docs/static/screenshots/Points/color-via-threshold-scale-light-400w.webp index 9bca3e0bcb..b403ed8908 100644 Binary files a/docs/static/screenshots/Points/color-via-threshold-scale-light-400w.webp and b/docs/static/screenshots/Points/color-via-threshold-scale-light-400w.webp differ diff --git a/docs/static/screenshots/Points/color-via-threshold-scale-light-800w.webp b/docs/static/screenshots/Points/color-via-threshold-scale-light-800w.webp index 8d3e086b72..326d2186c3 100644 Binary files a/docs/static/screenshots/Points/color-via-threshold-scale-light-800w.webp and b/docs/static/screenshots/Points/color-via-threshold-scale-light-800w.webp differ diff --git a/docs/static/screenshots/Points/with-labels-dark-240w.webp b/docs/static/screenshots/Points/with-labels-dark-240w.webp index fbdb3a1ecd..3dd482c462 100644 Binary files a/docs/static/screenshots/Points/with-labels-dark-240w.webp and b/docs/static/screenshots/Points/with-labels-dark-240w.webp differ diff --git a/docs/static/screenshots/Points/with-labels-dark-400w.webp b/docs/static/screenshots/Points/with-labels-dark-400w.webp index 5f8afac9b4..c3581046a6 100644 Binary files a/docs/static/screenshots/Points/with-labels-dark-400w.webp and b/docs/static/screenshots/Points/with-labels-dark-400w.webp differ diff --git a/docs/static/screenshots/Points/with-labels-dark-800w.webp b/docs/static/screenshots/Points/with-labels-dark-800w.webp index 83a25e7448..a55d880e0d 100644 Binary files a/docs/static/screenshots/Points/with-labels-dark-800w.webp and b/docs/static/screenshots/Points/with-labels-dark-800w.webp differ diff --git a/docs/static/screenshots/Points/with-labels-light-240w.webp b/docs/static/screenshots/Points/with-labels-light-240w.webp index 44d1b12082..64699929bd 100644 Binary files a/docs/static/screenshots/Points/with-labels-light-240w.webp and b/docs/static/screenshots/Points/with-labels-light-240w.webp differ diff --git a/docs/static/screenshots/Points/with-labels-light-400w.webp b/docs/static/screenshots/Points/with-labels-light-400w.webp index 16342b3f59..3972b778e1 100644 Binary files a/docs/static/screenshots/Points/with-labels-light-400w.webp and b/docs/static/screenshots/Points/with-labels-light-400w.webp differ diff --git a/docs/static/screenshots/Points/with-labels-light-800w.webp b/docs/static/screenshots/Points/with-labels-light-800w.webp index 9d34c5bb28..5e9b7e634f 100644 Binary files a/docs/static/screenshots/Points/with-labels-light-800w.webp and b/docs/static/screenshots/Points/with-labels-light-800w.webp differ diff --git a/docs/static/screenshots/Points/with-tooltip-and-highlight-dark-240w.webp b/docs/static/screenshots/Points/with-tooltip-and-highlight-dark-240w.webp index 093c7d8ca7..7e2b10009a 100644 Binary files a/docs/static/screenshots/Points/with-tooltip-and-highlight-dark-240w.webp and b/docs/static/screenshots/Points/with-tooltip-and-highlight-dark-240w.webp differ diff --git a/docs/static/screenshots/Points/with-tooltip-and-highlight-dark-400w.webp b/docs/static/screenshots/Points/with-tooltip-and-highlight-dark-400w.webp index aa72fc2990..e703d17190 100644 Binary files a/docs/static/screenshots/Points/with-tooltip-and-highlight-dark-400w.webp and b/docs/static/screenshots/Points/with-tooltip-and-highlight-dark-400w.webp differ diff --git a/docs/static/screenshots/Points/with-tooltip-and-highlight-dark-800w.webp b/docs/static/screenshots/Points/with-tooltip-and-highlight-dark-800w.webp index 4187b5b2c4..1a394fad6e 100644 Binary files a/docs/static/screenshots/Points/with-tooltip-and-highlight-dark-800w.webp and b/docs/static/screenshots/Points/with-tooltip-and-highlight-dark-800w.webp differ diff --git a/docs/static/screenshots/Points/with-tooltip-and-highlight-light-240w.webp b/docs/static/screenshots/Points/with-tooltip-and-highlight-light-240w.webp index c8253609ed..b11e5d8bb5 100644 Binary files a/docs/static/screenshots/Points/with-tooltip-and-highlight-light-240w.webp and b/docs/static/screenshots/Points/with-tooltip-and-highlight-light-240w.webp differ diff --git a/docs/static/screenshots/Points/with-tooltip-and-highlight-light-400w.webp b/docs/static/screenshots/Points/with-tooltip-and-highlight-light-400w.webp index a83dd1ea85..6ee0b5311b 100644 Binary files a/docs/static/screenshots/Points/with-tooltip-and-highlight-light-400w.webp and b/docs/static/screenshots/Points/with-tooltip-and-highlight-light-400w.webp differ diff --git a/docs/static/screenshots/Points/with-tooltip-and-highlight-light-800w.webp b/docs/static/screenshots/Points/with-tooltip-and-highlight-light-800w.webp index ed5788a182..676a7b97af 100644 Binary files a/docs/static/screenshots/Points/with-tooltip-and-highlight-light-800w.webp and b/docs/static/screenshots/Points/with-tooltip-and-highlight-light-800w.webp differ diff --git a/docs/static/screenshots/Polygon/color-via-ordinal-scale-dark-800w.webp b/docs/static/screenshots/Polygon/color-via-ordinal-scale-dark-800w.webp index 70c9dd0b84..10643352b1 100644 Binary files a/docs/static/screenshots/Polygon/color-via-ordinal-scale-dark-800w.webp and b/docs/static/screenshots/Polygon/color-via-ordinal-scale-dark-800w.webp differ diff --git a/docs/static/screenshots/Polygon/color-via-ordinal-scale-light-400w.webp b/docs/static/screenshots/Polygon/color-via-ordinal-scale-light-400w.webp index d5f55dab13..cf767207d1 100644 Binary files a/docs/static/screenshots/Polygon/color-via-ordinal-scale-light-400w.webp and b/docs/static/screenshots/Polygon/color-via-ordinal-scale-light-400w.webp differ diff --git a/docs/static/screenshots/Polygon/color-via-ordinal-scale-light-800w.webp b/docs/static/screenshots/Polygon/color-via-ordinal-scale-light-800w.webp index f879976000..8f3b979a88 100644 Binary files a/docs/static/screenshots/Polygon/color-via-ordinal-scale-light-800w.webp and b/docs/static/screenshots/Polygon/color-via-ordinal-scale-light-800w.webp differ diff --git a/docs/static/screenshots/Polygon/color-via-threshold-scale-dark-400w.webp b/docs/static/screenshots/Polygon/color-via-threshold-scale-dark-400w.webp index 521bdf1ce2..075e3d97d9 100644 Binary files a/docs/static/screenshots/Polygon/color-via-threshold-scale-dark-400w.webp and b/docs/static/screenshots/Polygon/color-via-threshold-scale-dark-400w.webp differ diff --git a/docs/static/screenshots/Polygon/color-via-threshold-scale-dark-800w.webp b/docs/static/screenshots/Polygon/color-via-threshold-scale-dark-800w.webp index 909287f91f..515a08c8ed 100644 Binary files a/docs/static/screenshots/Polygon/color-via-threshold-scale-dark-800w.webp and b/docs/static/screenshots/Polygon/color-via-threshold-scale-dark-800w.webp differ diff --git a/docs/static/screenshots/Polygon/color-via-threshold-scale-light-400w.webp b/docs/static/screenshots/Polygon/color-via-threshold-scale-light-400w.webp index f91f27d6ea..c3aedb9232 100644 Binary files a/docs/static/screenshots/Polygon/color-via-threshold-scale-light-400w.webp and b/docs/static/screenshots/Polygon/color-via-threshold-scale-light-400w.webp differ diff --git a/docs/static/screenshots/Polygon/color-via-threshold-scale-light-800w.webp b/docs/static/screenshots/Polygon/color-via-threshold-scale-light-800w.webp index e949d26d8c..8a6907955e 100644 Binary files a/docs/static/screenshots/Polygon/color-via-threshold-scale-light-800w.webp and b/docs/static/screenshots/Polygon/color-via-threshold-scale-light-800w.webp differ diff --git a/docs/static/screenshots/Polygon/data-mode-dark-400w.webp b/docs/static/screenshots/Polygon/data-mode-dark-400w.webp index 87479b836e..5091a25340 100644 Binary files a/docs/static/screenshots/Polygon/data-mode-dark-400w.webp and b/docs/static/screenshots/Polygon/data-mode-dark-400w.webp differ diff --git a/docs/static/screenshots/Polygon/data-mode-dark-800w.webp b/docs/static/screenshots/Polygon/data-mode-dark-800w.webp index ab156cbbb5..d814264f0e 100644 Binary files a/docs/static/screenshots/Polygon/data-mode-dark-800w.webp and b/docs/static/screenshots/Polygon/data-mode-dark-800w.webp differ diff --git a/docs/static/screenshots/Polygon/data-mode-light-400w.webp b/docs/static/screenshots/Polygon/data-mode-light-400w.webp index 918ac58b45..61fe6017cd 100644 Binary files a/docs/static/screenshots/Polygon/data-mode-light-400w.webp and b/docs/static/screenshots/Polygon/data-mode-light-400w.webp differ diff --git a/docs/static/screenshots/Polygon/data-mode-light-800w.webp b/docs/static/screenshots/Polygon/data-mode-light-800w.webp index d670593c35..7c40c4e017 100644 Binary files a/docs/static/screenshots/Polygon/data-mode-light-800w.webp and b/docs/static/screenshots/Polygon/data-mode-light-800w.webp differ diff --git a/docs/static/screenshots/Raster/math-functions-dark-240w.webp b/docs/static/screenshots/Raster/math-functions-dark-240w.webp index 66be36c37b..ad3f3cd005 100644 Binary files a/docs/static/screenshots/Raster/math-functions-dark-240w.webp and b/docs/static/screenshots/Raster/math-functions-dark-240w.webp differ diff --git a/docs/static/screenshots/Raster/math-functions-dark-400w.webp b/docs/static/screenshots/Raster/math-functions-dark-400w.webp index eb0ea6ea92..0bc28e3629 100644 Binary files a/docs/static/screenshots/Raster/math-functions-dark-400w.webp and b/docs/static/screenshots/Raster/math-functions-dark-400w.webp differ diff --git a/docs/static/screenshots/Raster/math-functions-dark-800w.webp b/docs/static/screenshots/Raster/math-functions-dark-800w.webp index 50f25cdfe7..fb4bf6ef14 100644 Binary files a/docs/static/screenshots/Raster/math-functions-dark-800w.webp and b/docs/static/screenshots/Raster/math-functions-dark-800w.webp differ diff --git a/docs/static/screenshots/Raster/sampled-dark-240w.webp b/docs/static/screenshots/Raster/sampled-dark-240w.webp index 8c696b3389..a32b531d6e 100644 Binary files a/docs/static/screenshots/Raster/sampled-dark-240w.webp and b/docs/static/screenshots/Raster/sampled-dark-240w.webp differ diff --git a/docs/static/screenshots/Raster/sampled-dark-400w.webp b/docs/static/screenshots/Raster/sampled-dark-400w.webp index 9432bb57c1..85f051f85f 100644 Binary files a/docs/static/screenshots/Raster/sampled-dark-400w.webp and b/docs/static/screenshots/Raster/sampled-dark-400w.webp differ diff --git a/docs/static/screenshots/Raster/sampled-dark-800w.webp b/docs/static/screenshots/Raster/sampled-dark-800w.webp index 7806f37a6f..4cd7f63cf4 100644 Binary files a/docs/static/screenshots/Raster/sampled-dark-800w.webp and b/docs/static/screenshots/Raster/sampled-dark-800w.webp differ diff --git a/docs/static/screenshots/Raster/sampled-light-400w.webp b/docs/static/screenshots/Raster/sampled-light-400w.webp index c2d46fcee2..3121b1de05 100644 Binary files a/docs/static/screenshots/Raster/sampled-light-400w.webp and b/docs/static/screenshots/Raster/sampled-light-400w.webp differ diff --git a/docs/static/screenshots/Raster/sampled-light-800w.webp b/docs/static/screenshots/Raster/sampled-light-800w.webp index a6ebab4607..ead982f5ef 100644 Binary files a/docs/static/screenshots/Raster/sampled-light-800w.webp and b/docs/static/screenshots/Raster/sampled-light-800w.webp differ diff --git a/docs/static/screenshots/Raster/us-water-vapor-dark-240w.webp b/docs/static/screenshots/Raster/us-water-vapor-dark-240w.webp index afe729bd27..51f1608eb1 100644 Binary files a/docs/static/screenshots/Raster/us-water-vapor-dark-240w.webp and b/docs/static/screenshots/Raster/us-water-vapor-dark-240w.webp differ diff --git a/docs/static/screenshots/Raster/us-water-vapor-dark-800w.webp b/docs/static/screenshots/Raster/us-water-vapor-dark-800w.webp index dc696a9853..ce4183f68d 100644 Binary files a/docs/static/screenshots/Raster/us-water-vapor-dark-800w.webp and b/docs/static/screenshots/Raster/us-water-vapor-dark-800w.webp differ diff --git a/docs/static/screenshots/Raster/us-water-vapor-light-240w.webp b/docs/static/screenshots/Raster/us-water-vapor-light-240w.webp index 835f0a7b20..af35f27a2d 100644 Binary files a/docs/static/screenshots/Raster/us-water-vapor-light-240w.webp and b/docs/static/screenshots/Raster/us-water-vapor-light-240w.webp differ diff --git a/docs/static/screenshots/Raster/us-water-vapor-light-400w.webp b/docs/static/screenshots/Raster/us-water-vapor-light-400w.webp index 5146dd992e..1d1fed1c0c 100644 Binary files a/docs/static/screenshots/Raster/us-water-vapor-light-400w.webp and b/docs/static/screenshots/Raster/us-water-vapor-light-400w.webp differ diff --git a/docs/static/screenshots/Raster/us-water-vapor-light-800w.webp b/docs/static/screenshots/Raster/us-water-vapor-light-800w.webp index 2a39776bd0..a6fa3b873e 100644 Binary files a/docs/static/screenshots/Raster/us-water-vapor-light-800w.webp and b/docs/static/screenshots/Raster/us-water-vapor-light-800w.webp differ diff --git a/docs/static/screenshots/Rect/color-via-ordinal-scale-dark-240w.webp b/docs/static/screenshots/Rect/color-via-ordinal-scale-dark-240w.webp index a634662e5e..13bdcf83ac 100644 Binary files a/docs/static/screenshots/Rect/color-via-ordinal-scale-dark-240w.webp and b/docs/static/screenshots/Rect/color-via-ordinal-scale-dark-240w.webp differ diff --git a/docs/static/screenshots/Rect/color-via-ordinal-scale-dark-800w.webp b/docs/static/screenshots/Rect/color-via-ordinal-scale-dark-800w.webp index bf30275a25..cc2d3a7584 100644 Binary files a/docs/static/screenshots/Rect/color-via-ordinal-scale-dark-800w.webp and b/docs/static/screenshots/Rect/color-via-ordinal-scale-dark-800w.webp differ diff --git a/docs/static/screenshots/Rect/color-via-ordinal-scale-light-800w.webp b/docs/static/screenshots/Rect/color-via-ordinal-scale-light-800w.webp index 957efb8e3d..c20d9ebcbf 100644 Binary files a/docs/static/screenshots/Rect/color-via-ordinal-scale-light-800w.webp and b/docs/static/screenshots/Rect/color-via-ordinal-scale-light-800w.webp differ diff --git a/docs/static/screenshots/Rect/color-via-threshold-scale-dark-240w.webp b/docs/static/screenshots/Rect/color-via-threshold-scale-dark-240w.webp index 805770e317..ce43f98aac 100644 Binary files a/docs/static/screenshots/Rect/color-via-threshold-scale-dark-240w.webp and b/docs/static/screenshots/Rect/color-via-threshold-scale-dark-240w.webp differ diff --git a/docs/static/screenshots/Rect/color-via-threshold-scale-dark-800w.webp b/docs/static/screenshots/Rect/color-via-threshold-scale-dark-800w.webp index 86fd0ce96d..2c69fb2d15 100644 Binary files a/docs/static/screenshots/Rect/color-via-threshold-scale-dark-800w.webp and b/docs/static/screenshots/Rect/color-via-threshold-scale-dark-800w.webp differ diff --git a/docs/static/screenshots/Rect/color-via-threshold-scale-light-800w.webp b/docs/static/screenshots/Rect/color-via-threshold-scale-light-800w.webp index 8e69bbe7c6..b448d861f3 100644 Binary files a/docs/static/screenshots/Rect/color-via-threshold-scale-light-800w.webp and b/docs/static/screenshots/Rect/color-via-threshold-scale-light-800w.webp differ diff --git a/docs/static/screenshots/Rect/data-mode-edge-dark-240w.webp b/docs/static/screenshots/Rect/data-mode-edge-dark-240w.webp index f90128ac01..63bc8c5aab 100644 Binary files a/docs/static/screenshots/Rect/data-mode-edge-dark-240w.webp and b/docs/static/screenshots/Rect/data-mode-edge-dark-240w.webp differ diff --git a/docs/static/screenshots/Rect/data-mode-edge-dark-800w.webp b/docs/static/screenshots/Rect/data-mode-edge-dark-800w.webp index 9d3e2d0def..df86f0f899 100644 Binary files a/docs/static/screenshots/Rect/data-mode-edge-dark-800w.webp and b/docs/static/screenshots/Rect/data-mode-edge-dark-800w.webp differ diff --git a/docs/static/screenshots/Rule/annotation-x-dark-800w.webp b/docs/static/screenshots/Rule/annotation-x-dark-800w.webp index aacfbd3078..93258e1b71 100644 Binary files a/docs/static/screenshots/Rule/annotation-x-dark-800w.webp and b/docs/static/screenshots/Rule/annotation-x-dark-800w.webp differ diff --git a/docs/static/screenshots/Rule/annotation-x-light-400w.webp b/docs/static/screenshots/Rule/annotation-x-light-400w.webp index 1367e4195d..fdfd269395 100644 Binary files a/docs/static/screenshots/Rule/annotation-x-light-400w.webp and b/docs/static/screenshots/Rule/annotation-x-light-400w.webp differ diff --git a/docs/static/screenshots/Rule/annotation-y-dark-240w.webp b/docs/static/screenshots/Rule/annotation-y-dark-240w.webp index 4add48acee..aca0cf7f18 100644 Binary files a/docs/static/screenshots/Rule/annotation-y-dark-240w.webp and b/docs/static/screenshots/Rule/annotation-y-dark-240w.webp differ diff --git a/docs/static/screenshots/Rule/annotation-y-dark-800w.webp b/docs/static/screenshots/Rule/annotation-y-dark-800w.webp index c220e09563..fa5bf6f276 100644 Binary files a/docs/static/screenshots/Rule/annotation-y-dark-800w.webp and b/docs/static/screenshots/Rule/annotation-y-dark-800w.webp differ diff --git a/docs/static/screenshots/Rule/annotation-y-light-400w.webp b/docs/static/screenshots/Rule/annotation-y-light-400w.webp index 81bc3c114a..66a8e98460 100644 Binary files a/docs/static/screenshots/Rule/annotation-y-light-400w.webp and b/docs/static/screenshots/Rule/annotation-y-light-400w.webp differ diff --git a/docs/static/screenshots/Rule/annotation-y-light-800w.webp b/docs/static/screenshots/Rule/annotation-y-light-800w.webp index 8c948cdf03..85437785e3 100644 Binary files a/docs/static/screenshots/Rule/annotation-y-light-800w.webp and b/docs/static/screenshots/Rule/annotation-y-light-800w.webp differ diff --git a/docs/static/screenshots/Rule/baseline-top-right-dark-240w.webp b/docs/static/screenshots/Rule/baseline-top-right-dark-240w.webp index 75e8a81432..c826ef5181 100644 Binary files a/docs/static/screenshots/Rule/baseline-top-right-dark-240w.webp and b/docs/static/screenshots/Rule/baseline-top-right-dark-240w.webp differ diff --git a/docs/static/screenshots/Rule/baseline-top-right-dark-400w.webp b/docs/static/screenshots/Rule/baseline-top-right-dark-400w.webp index 7ce50a387d..346822b0fc 100644 Binary files a/docs/static/screenshots/Rule/baseline-top-right-dark-400w.webp and b/docs/static/screenshots/Rule/baseline-top-right-dark-400w.webp differ diff --git a/docs/static/screenshots/Rule/baseline-top-right-dark-800w.webp b/docs/static/screenshots/Rule/baseline-top-right-dark-800w.webp index d1847c4470..40a2ed85e9 100644 Binary files a/docs/static/screenshots/Rule/baseline-top-right-dark-800w.webp and b/docs/static/screenshots/Rule/baseline-top-right-dark-800w.webp differ diff --git a/docs/static/screenshots/Rule/baseline-top-right-light-240w.webp b/docs/static/screenshots/Rule/baseline-top-right-light-240w.webp index a7ba6b4c8a..6d654fa5ab 100644 Binary files a/docs/static/screenshots/Rule/baseline-top-right-light-240w.webp and b/docs/static/screenshots/Rule/baseline-top-right-light-240w.webp differ diff --git a/docs/static/screenshots/Rule/baseline-x-y-dark-800w.webp b/docs/static/screenshots/Rule/baseline-x-y-dark-800w.webp index effdbbf0a9..5219348830 100644 Binary files a/docs/static/screenshots/Rule/baseline-x-y-dark-800w.webp and b/docs/static/screenshots/Rule/baseline-x-y-dark-800w.webp differ diff --git a/docs/static/screenshots/Rule/baseline-x-y-light-800w.webp b/docs/static/screenshots/Rule/baseline-x-y-light-800w.webp index 5cf41c5bc2..a5aa4e20b7 100644 Binary files a/docs/static/screenshots/Rule/baseline-x-y-light-800w.webp and b/docs/static/screenshots/Rule/baseline-x-y-light-800w.webp differ diff --git a/docs/static/screenshots/Rule/baseline-y-negative-dark-240w.webp b/docs/static/screenshots/Rule/baseline-y-negative-dark-240w.webp index d6f2796cc0..931963c810 100644 Binary files a/docs/static/screenshots/Rule/baseline-y-negative-dark-240w.webp and b/docs/static/screenshots/Rule/baseline-y-negative-dark-240w.webp differ diff --git a/docs/static/screenshots/Rule/baseline-y-negative-dark-800w.webp b/docs/static/screenshots/Rule/baseline-y-negative-dark-800w.webp index 935edcb849..4b364ba278 100644 Binary files a/docs/static/screenshots/Rule/baseline-y-negative-dark-800w.webp and b/docs/static/screenshots/Rule/baseline-y-negative-dark-800w.webp differ diff --git a/docs/static/screenshots/Rule/baseline-y-negative-light-400w.webp b/docs/static/screenshots/Rule/baseline-y-negative-light-400w.webp index 367e1752aa..d13a59959b 100644 Binary files a/docs/static/screenshots/Rule/baseline-y-negative-light-400w.webp and b/docs/static/screenshots/Rule/baseline-y-negative-light-400w.webp differ diff --git a/docs/static/screenshots/Rule/candlestick-dark-800w.webp b/docs/static/screenshots/Rule/candlestick-dark-800w.webp index 04a9337293..6264f1e6d4 100644 Binary files a/docs/static/screenshots/Rule/candlestick-dark-800w.webp and b/docs/static/screenshots/Rule/candlestick-dark-800w.webp differ diff --git a/docs/static/screenshots/Rule/candlestick-light-800w.webp b/docs/static/screenshots/Rule/candlestick-light-800w.webp index ad8917fd1b..071fee6fd8 100644 Binary files a/docs/static/screenshots/Rule/candlestick-light-800w.webp and b/docs/static/screenshots/Rule/candlestick-light-800w.webp differ diff --git a/docs/static/screenshots/Rule/candlestick-open-close-line-color-dark-800w.webp b/docs/static/screenshots/Rule/candlestick-open-close-line-color-dark-800w.webp index aa1b6f61ba..80d0888264 100644 Binary files a/docs/static/screenshots/Rule/candlestick-open-close-line-color-dark-800w.webp and b/docs/static/screenshots/Rule/candlestick-open-close-line-color-dark-800w.webp differ diff --git a/docs/static/screenshots/Rule/candlestick-open-close-line-color-light-800w.webp b/docs/static/screenshots/Rule/candlestick-open-close-line-color-light-800w.webp index aaf76955ec..7256b3a822 100644 Binary files a/docs/static/screenshots/Rule/candlestick-open-close-line-color-light-800w.webp and b/docs/static/screenshots/Rule/candlestick-open-close-line-color-light-800w.webp differ diff --git a/docs/static/screenshots/Rule/candlestick-with-brushing-dark-400w.webp b/docs/static/screenshots/Rule/candlestick-with-brushing-dark-400w.webp index 192c75876c..3216de0702 100644 Binary files a/docs/static/screenshots/Rule/candlestick-with-brushing-dark-400w.webp and b/docs/static/screenshots/Rule/candlestick-with-brushing-dark-400w.webp differ diff --git a/docs/static/screenshots/Rule/candlestick-with-brushing-dark-800w.webp b/docs/static/screenshots/Rule/candlestick-with-brushing-dark-800w.webp index a6508d900f..963a9a570a 100644 Binary files a/docs/static/screenshots/Rule/candlestick-with-brushing-dark-800w.webp and b/docs/static/screenshots/Rule/candlestick-with-brushing-dark-800w.webp differ diff --git a/docs/static/screenshots/Rule/candlestick-with-brushing-light-240w.webp b/docs/static/screenshots/Rule/candlestick-with-brushing-light-240w.webp index a36018a07a..3b5c758e03 100644 Binary files a/docs/static/screenshots/Rule/candlestick-with-brushing-light-240w.webp and b/docs/static/screenshots/Rule/candlestick-with-brushing-light-240w.webp differ diff --git a/docs/static/screenshots/Rule/candlestick-with-brushing-light-800w.webp b/docs/static/screenshots/Rule/candlestick-with-brushing-light-800w.webp index 798b9de9e2..daf5f5cf2c 100644 Binary files a/docs/static/screenshots/Rule/candlestick-with-brushing-light-800w.webp and b/docs/static/screenshots/Rule/candlestick-with-brushing-light-800w.webp differ diff --git a/docs/static/screenshots/Rule/data-x-band-dark-240w.webp b/docs/static/screenshots/Rule/data-x-band-dark-240w.webp index cc05c40a41..3ad0ebee53 100644 Binary files a/docs/static/screenshots/Rule/data-x-band-dark-240w.webp and b/docs/static/screenshots/Rule/data-x-band-dark-240w.webp differ diff --git a/docs/static/screenshots/Rule/data-x-date-dark-240w.webp b/docs/static/screenshots/Rule/data-x-date-dark-240w.webp index 010d8e7307..5314c71b2b 100644 Binary files a/docs/static/screenshots/Rule/data-x-date-dark-240w.webp and b/docs/static/screenshots/Rule/data-x-date-dark-240w.webp differ diff --git a/docs/static/screenshots/Rule/data-x-date-dark-400w.webp b/docs/static/screenshots/Rule/data-x-date-dark-400w.webp index d22cfe6a94..0c6ad37bfa 100644 Binary files a/docs/static/screenshots/Rule/data-x-date-dark-400w.webp and b/docs/static/screenshots/Rule/data-x-date-dark-400w.webp differ diff --git a/docs/static/screenshots/Rule/data-x-date-dark-800w.webp b/docs/static/screenshots/Rule/data-x-date-dark-800w.webp index ffa9eecafb..fd1869b0eb 100644 Binary files a/docs/static/screenshots/Rule/data-x-date-dark-800w.webp and b/docs/static/screenshots/Rule/data-x-date-dark-800w.webp differ diff --git a/docs/static/screenshots/Rule/data-x-date-light-240w.webp b/docs/static/screenshots/Rule/data-x-date-light-240w.webp index fd5b399f6f..9d12b21b3c 100644 Binary files a/docs/static/screenshots/Rule/data-x-date-light-240w.webp and b/docs/static/screenshots/Rule/data-x-date-light-240w.webp differ diff --git a/docs/static/screenshots/Rule/data-x-date-light-400w.webp b/docs/static/screenshots/Rule/data-x-date-light-400w.webp index 24f9ac2ebb..2b22246c64 100644 Binary files a/docs/static/screenshots/Rule/data-x-date-light-400w.webp and b/docs/static/screenshots/Rule/data-x-date-light-400w.webp differ diff --git a/docs/static/screenshots/Rule/data-x-date-light-800w.webp b/docs/static/screenshots/Rule/data-x-date-light-800w.webp index 174c010b58..34c36dd545 100644 Binary files a/docs/static/screenshots/Rule/data-x-date-light-800w.webp and b/docs/static/screenshots/Rule/data-x-date-light-800w.webp differ diff --git a/docs/static/screenshots/Rule/data-x-range-dark-240w.webp b/docs/static/screenshots/Rule/data-x-range-dark-240w.webp index ca7bb95fba..164f6ea299 100644 Binary files a/docs/static/screenshots/Rule/data-x-range-dark-240w.webp and b/docs/static/screenshots/Rule/data-x-range-dark-240w.webp differ diff --git a/docs/static/screenshots/Rule/data-x-range-dark-400w.webp b/docs/static/screenshots/Rule/data-x-range-dark-400w.webp index 0283d18b21..27c138fb4b 100644 Binary files a/docs/static/screenshots/Rule/data-x-range-dark-400w.webp and b/docs/static/screenshots/Rule/data-x-range-dark-400w.webp differ diff --git a/docs/static/screenshots/Rule/data-x-range-dark-800w.webp b/docs/static/screenshots/Rule/data-x-range-dark-800w.webp index 504c132c49..092ecaabaf 100644 Binary files a/docs/static/screenshots/Rule/data-x-range-dark-800w.webp and b/docs/static/screenshots/Rule/data-x-range-dark-800w.webp differ diff --git a/docs/static/screenshots/Rule/data-x-range-light-240w.webp b/docs/static/screenshots/Rule/data-x-range-light-240w.webp index 698727b4c1..d5be82ae7e 100644 Binary files a/docs/static/screenshots/Rule/data-x-range-light-240w.webp and b/docs/static/screenshots/Rule/data-x-range-light-240w.webp differ diff --git a/docs/static/screenshots/Rule/data-x-range-light-400w.webp b/docs/static/screenshots/Rule/data-x-range-light-400w.webp index 2c7613992a..d6fa417734 100644 Binary files a/docs/static/screenshots/Rule/data-x-range-light-400w.webp and b/docs/static/screenshots/Rule/data-x-range-light-400w.webp differ diff --git a/docs/static/screenshots/Rule/data-x-range-light-800w.webp b/docs/static/screenshots/Rule/data-x-range-light-800w.webp index ca334571a0..6d4009e9b4 100644 Binary files a/docs/static/screenshots/Rule/data-x-range-light-800w.webp and b/docs/static/screenshots/Rule/data-x-range-light-800w.webp differ diff --git a/docs/static/screenshots/Rule/data-y-range-dark-240w.webp b/docs/static/screenshots/Rule/data-y-range-dark-240w.webp index bd8e08e883..6eafef3353 100644 Binary files a/docs/static/screenshots/Rule/data-y-range-dark-240w.webp and b/docs/static/screenshots/Rule/data-y-range-dark-240w.webp differ diff --git a/docs/static/screenshots/Rule/data-y-range-dark-400w.webp b/docs/static/screenshots/Rule/data-y-range-dark-400w.webp index 218b36eff9..a355b5029a 100644 Binary files a/docs/static/screenshots/Rule/data-y-range-dark-400w.webp and b/docs/static/screenshots/Rule/data-y-range-dark-400w.webp differ diff --git a/docs/static/screenshots/Rule/data-y-range-dark-800w.webp b/docs/static/screenshots/Rule/data-y-range-dark-800w.webp index 7bcf6db10c..85cac3c363 100644 Binary files a/docs/static/screenshots/Rule/data-y-range-dark-800w.webp and b/docs/static/screenshots/Rule/data-y-range-dark-800w.webp differ diff --git a/docs/static/screenshots/Rule/data-y-range-light-240w.webp b/docs/static/screenshots/Rule/data-y-range-light-240w.webp index 6bfbab2f34..7f04597d87 100644 Binary files a/docs/static/screenshots/Rule/data-y-range-light-240w.webp and b/docs/static/screenshots/Rule/data-y-range-light-240w.webp differ diff --git a/docs/static/screenshots/Rule/data-y-range-light-400w.webp b/docs/static/screenshots/Rule/data-y-range-light-400w.webp index 81a6ebe520..a74c02545c 100644 Binary files a/docs/static/screenshots/Rule/data-y-range-light-400w.webp and b/docs/static/screenshots/Rule/data-y-range-light-400w.webp differ diff --git a/docs/static/screenshots/Rule/data-y-range-light-800w.webp b/docs/static/screenshots/Rule/data-y-range-light-800w.webp index b88cc33e3b..22c47beb33 100644 Binary files a/docs/static/screenshots/Rule/data-y-range-light-800w.webp and b/docs/static/screenshots/Rule/data-y-range-light-800w.webp differ diff --git a/docs/static/screenshots/Rule/lollipop-dark-240w.webp b/docs/static/screenshots/Rule/lollipop-dark-240w.webp index beb6e4d34b..b12f405cb2 100644 Binary files a/docs/static/screenshots/Rule/lollipop-dark-240w.webp and b/docs/static/screenshots/Rule/lollipop-dark-240w.webp differ diff --git a/docs/static/screenshots/Rule/lollipop-dark-400w.webp b/docs/static/screenshots/Rule/lollipop-dark-400w.webp index 0b7009383c..f3c51c9e91 100644 Binary files a/docs/static/screenshots/Rule/lollipop-dark-400w.webp and b/docs/static/screenshots/Rule/lollipop-dark-400w.webp differ diff --git a/docs/static/screenshots/Rule/lollipop-dark-800w.webp b/docs/static/screenshots/Rule/lollipop-dark-800w.webp index f94bfa78d9..f49a32db08 100644 Binary files a/docs/static/screenshots/Rule/lollipop-dark-800w.webp and b/docs/static/screenshots/Rule/lollipop-dark-800w.webp differ diff --git a/docs/static/screenshots/Rule/lollipop-light-400w.webp b/docs/static/screenshots/Rule/lollipop-light-400w.webp index 65504ba9e6..64c11a8dd5 100644 Binary files a/docs/static/screenshots/Rule/lollipop-light-400w.webp and b/docs/static/screenshots/Rule/lollipop-light-400w.webp differ diff --git a/docs/static/screenshots/Rule/lollipop-light-800w.webp b/docs/static/screenshots/Rule/lollipop-light-800w.webp index ee8af18905..9dc0610a91 100644 Binary files a/docs/static/screenshots/Rule/lollipop-light-800w.webp and b/docs/static/screenshots/Rule/lollipop-light-800w.webp differ diff --git a/docs/static/screenshots/Sankey/complex-dark-240w.webp b/docs/static/screenshots/Sankey/complex-dark-240w.webp index 1f20d78878..82038a5891 100644 Binary files a/docs/static/screenshots/Sankey/complex-dark-240w.webp and b/docs/static/screenshots/Sankey/complex-dark-240w.webp differ diff --git a/docs/static/screenshots/Sankey/complex-dark-400w.webp b/docs/static/screenshots/Sankey/complex-dark-400w.webp index 5b9a193b27..90e9457341 100644 Binary files a/docs/static/screenshots/Sankey/complex-dark-400w.webp and b/docs/static/screenshots/Sankey/complex-dark-400w.webp differ diff --git a/docs/static/screenshots/Sankey/complex-dark-800w.webp b/docs/static/screenshots/Sankey/complex-dark-800w.webp index bf4a9f1004..24d90ce0b5 100644 Binary files a/docs/static/screenshots/Sankey/complex-dark-800w.webp and b/docs/static/screenshots/Sankey/complex-dark-800w.webp differ diff --git a/docs/static/screenshots/Sankey/complex-light-240w.webp b/docs/static/screenshots/Sankey/complex-light-240w.webp index f92cd3b4d0..844bfb2f9e 100644 Binary files a/docs/static/screenshots/Sankey/complex-light-240w.webp and b/docs/static/screenshots/Sankey/complex-light-240w.webp differ diff --git a/docs/static/screenshots/Sankey/complex-light-400w.webp b/docs/static/screenshots/Sankey/complex-light-400w.webp index a5f22d8975..8d9e4e147c 100644 Binary files a/docs/static/screenshots/Sankey/complex-light-400w.webp and b/docs/static/screenshots/Sankey/complex-light-400w.webp differ diff --git a/docs/static/screenshots/Sankey/complex-light-800w.webp b/docs/static/screenshots/Sankey/complex-light-800w.webp index dd5b7fe5a5..a180ba19ad 100644 Binary files a/docs/static/screenshots/Sankey/complex-light-800w.webp and b/docs/static/screenshots/Sankey/complex-light-800w.webp differ diff --git a/docs/static/screenshots/Sankey/hierarchy-dark-240w.webp b/docs/static/screenshots/Sankey/hierarchy-dark-240w.webp index a648812b7e..d4701dd391 100644 Binary files a/docs/static/screenshots/Sankey/hierarchy-dark-240w.webp and b/docs/static/screenshots/Sankey/hierarchy-dark-240w.webp differ diff --git a/docs/static/screenshots/Sankey/hierarchy-dark-400w.webp b/docs/static/screenshots/Sankey/hierarchy-dark-400w.webp index 4d36033817..5e3af96a6c 100644 Binary files a/docs/static/screenshots/Sankey/hierarchy-dark-400w.webp and b/docs/static/screenshots/Sankey/hierarchy-dark-400w.webp differ diff --git a/docs/static/screenshots/Sankey/hierarchy-dark-800w.webp b/docs/static/screenshots/Sankey/hierarchy-dark-800w.webp index 9b7be54d1b..6aa39e3eef 100644 Binary files a/docs/static/screenshots/Sankey/hierarchy-dark-800w.webp and b/docs/static/screenshots/Sankey/hierarchy-dark-800w.webp differ diff --git a/docs/static/screenshots/Sankey/hierarchy-light-240w.webp b/docs/static/screenshots/Sankey/hierarchy-light-240w.webp index d21c28f75e..07281269d1 100644 Binary files a/docs/static/screenshots/Sankey/hierarchy-light-240w.webp and b/docs/static/screenshots/Sankey/hierarchy-light-240w.webp differ diff --git a/docs/static/screenshots/Sankey/hierarchy-light-400w.webp b/docs/static/screenshots/Sankey/hierarchy-light-400w.webp index d90985850d..3c2ceefc24 100644 Binary files a/docs/static/screenshots/Sankey/hierarchy-light-400w.webp and b/docs/static/screenshots/Sankey/hierarchy-light-400w.webp differ diff --git a/docs/static/screenshots/Sankey/hierarchy-light-800w.webp b/docs/static/screenshots/Sankey/hierarchy-light-800w.webp index 603c83930c..2bbb661427 100644 Binary files a/docs/static/screenshots/Sankey/hierarchy-light-800w.webp and b/docs/static/screenshots/Sankey/hierarchy-light-800w.webp differ diff --git a/docs/static/screenshots/Sankey/node-select-dark-240w.webp b/docs/static/screenshots/Sankey/node-select-dark-240w.webp index 09d57676bd..43fd6260af 100644 Binary files a/docs/static/screenshots/Sankey/node-select-dark-240w.webp and b/docs/static/screenshots/Sankey/node-select-dark-240w.webp differ diff --git a/docs/static/screenshots/Sankey/node-select-dark-400w.webp b/docs/static/screenshots/Sankey/node-select-dark-400w.webp index 61d07209a8..9e383ef54c 100644 Binary files a/docs/static/screenshots/Sankey/node-select-dark-400w.webp and b/docs/static/screenshots/Sankey/node-select-dark-400w.webp differ diff --git a/docs/static/screenshots/Sankey/node-select-dark-800w.webp b/docs/static/screenshots/Sankey/node-select-dark-800w.webp index d0b0923139..1ef239d019 100644 Binary files a/docs/static/screenshots/Sankey/node-select-dark-800w.webp and b/docs/static/screenshots/Sankey/node-select-dark-800w.webp differ diff --git a/docs/static/screenshots/Sankey/node-select-light-240w.webp b/docs/static/screenshots/Sankey/node-select-light-240w.webp index f2df32e586..d3a9f0ac34 100644 Binary files a/docs/static/screenshots/Sankey/node-select-light-240w.webp and b/docs/static/screenshots/Sankey/node-select-light-240w.webp differ diff --git a/docs/static/screenshots/Sankey/node-select-light-400w.webp b/docs/static/screenshots/Sankey/node-select-light-400w.webp index 31d73ddde9..8d4f951237 100644 Binary files a/docs/static/screenshots/Sankey/node-select-light-400w.webp and b/docs/static/screenshots/Sankey/node-select-light-400w.webp differ diff --git a/docs/static/screenshots/Sankey/node-select-light-800w.webp b/docs/static/screenshots/Sankey/node-select-light-800w.webp index 30cb3a5dff..14ea0049b4 100644 Binary files a/docs/static/screenshots/Sankey/node-select-light-800w.webp and b/docs/static/screenshots/Sankey/node-select-light-800w.webp differ diff --git a/docs/static/screenshots/Sankey/simple-dark-400w.webp b/docs/static/screenshots/Sankey/simple-dark-400w.webp index e7e5358a38..31f23d93c9 100644 Binary files a/docs/static/screenshots/Sankey/simple-dark-400w.webp and b/docs/static/screenshots/Sankey/simple-dark-400w.webp differ diff --git a/docs/static/screenshots/Sankey/simple-dark-800w.webp b/docs/static/screenshots/Sankey/simple-dark-800w.webp index fda21571ab..2c243ab2be 100644 Binary files a/docs/static/screenshots/Sankey/simple-dark-800w.webp and b/docs/static/screenshots/Sankey/simple-dark-800w.webp differ diff --git a/docs/static/screenshots/Sankey/simple-light-800w.webp b/docs/static/screenshots/Sankey/simple-light-800w.webp index 9ed4e47f2f..8fa9592581 100644 Binary files a/docs/static/screenshots/Sankey/simple-light-800w.webp and b/docs/static/screenshots/Sankey/simple-light-800w.webp differ diff --git a/docs/static/screenshots/Sankey/tooltip-dark-240w.webp b/docs/static/screenshots/Sankey/tooltip-dark-240w.webp index 09d57676bd..43fd6260af 100644 Binary files a/docs/static/screenshots/Sankey/tooltip-dark-240w.webp and b/docs/static/screenshots/Sankey/tooltip-dark-240w.webp differ diff --git a/docs/static/screenshots/Sankey/tooltip-dark-400w.webp b/docs/static/screenshots/Sankey/tooltip-dark-400w.webp index 61d07209a8..9e383ef54c 100644 Binary files a/docs/static/screenshots/Sankey/tooltip-dark-400w.webp and b/docs/static/screenshots/Sankey/tooltip-dark-400w.webp differ diff --git a/docs/static/screenshots/Sankey/tooltip-dark-800w.webp b/docs/static/screenshots/Sankey/tooltip-dark-800w.webp index d0b0923139..1ef239d019 100644 Binary files a/docs/static/screenshots/Sankey/tooltip-dark-800w.webp and b/docs/static/screenshots/Sankey/tooltip-dark-800w.webp differ diff --git a/docs/static/screenshots/Sankey/tooltip-light-240w.webp b/docs/static/screenshots/Sankey/tooltip-light-240w.webp index f2df32e586..d3a9f0ac34 100644 Binary files a/docs/static/screenshots/Sankey/tooltip-light-240w.webp and b/docs/static/screenshots/Sankey/tooltip-light-240w.webp differ diff --git a/docs/static/screenshots/Sankey/tooltip-light-400w.webp b/docs/static/screenshots/Sankey/tooltip-light-400w.webp index 31d73ddde9..8d4f951237 100644 Binary files a/docs/static/screenshots/Sankey/tooltip-light-400w.webp and b/docs/static/screenshots/Sankey/tooltip-light-400w.webp differ diff --git a/docs/static/screenshots/Sankey/tooltip-light-800w.webp b/docs/static/screenshots/Sankey/tooltip-light-800w.webp index 30cb3a5dff..14ea0049b4 100644 Binary files a/docs/static/screenshots/Sankey/tooltip-light-800w.webp and b/docs/static/screenshots/Sankey/tooltip-light-800w.webp differ diff --git a/docs/static/screenshots/ScatterChart/basic-dark-240w.webp b/docs/static/screenshots/ScatterChart/basic-dark-240w.webp index dca2984778..4c4088a985 100644 Binary files a/docs/static/screenshots/ScatterChart/basic-dark-240w.webp and b/docs/static/screenshots/ScatterChart/basic-dark-240w.webp differ diff --git a/docs/static/screenshots/ScatterChart/basic-dark-400w.webp b/docs/static/screenshots/ScatterChart/basic-dark-400w.webp index 3de329c882..63bb62cbb4 100644 Binary files a/docs/static/screenshots/ScatterChart/basic-dark-400w.webp and b/docs/static/screenshots/ScatterChart/basic-dark-400w.webp differ diff --git a/docs/static/screenshots/ScatterChart/basic-dark-800w.webp b/docs/static/screenshots/ScatterChart/basic-dark-800w.webp index 6627483e24..74d3e9a2bc 100644 Binary files a/docs/static/screenshots/ScatterChart/basic-dark-800w.webp and b/docs/static/screenshots/ScatterChart/basic-dark-800w.webp differ diff --git a/docs/static/screenshots/ScatterChart/basic-light-400w.webp b/docs/static/screenshots/ScatterChart/basic-light-400w.webp index eca590dcb4..107773a05a 100644 Binary files a/docs/static/screenshots/ScatterChart/basic-light-400w.webp and b/docs/static/screenshots/ScatterChart/basic-light-400w.webp differ diff --git a/docs/static/screenshots/ScatterChart/basic-light-800w.webp b/docs/static/screenshots/ScatterChart/basic-light-800w.webp index d637948bd7..8882237e1b 100644 Binary files a/docs/static/screenshots/ScatterChart/basic-light-800w.webp and b/docs/static/screenshots/ScatterChart/basic-light-800w.webp differ diff --git a/docs/static/screenshots/ScatterChart/brush-dark-240w.webp b/docs/static/screenshots/ScatterChart/brush-dark-240w.webp index 40c306bf55..3fd37a7ee4 100644 Binary files a/docs/static/screenshots/ScatterChart/brush-dark-240w.webp and b/docs/static/screenshots/ScatterChart/brush-dark-240w.webp differ diff --git a/docs/static/screenshots/ScatterChart/brush-dark-400w.webp b/docs/static/screenshots/ScatterChart/brush-dark-400w.webp index 9394286338..1dbcaf8fb6 100644 Binary files a/docs/static/screenshots/ScatterChart/brush-dark-400w.webp and b/docs/static/screenshots/ScatterChart/brush-dark-400w.webp differ diff --git a/docs/static/screenshots/ScatterChart/brush-dark-800w.webp b/docs/static/screenshots/ScatterChart/brush-dark-800w.webp index 75d58772fb..bcdcdcf633 100644 Binary files a/docs/static/screenshots/ScatterChart/brush-dark-800w.webp and b/docs/static/screenshots/ScatterChart/brush-dark-800w.webp differ diff --git a/docs/static/screenshots/ScatterChart/brush-light-400w.webp b/docs/static/screenshots/ScatterChart/brush-light-400w.webp index bfae8b1fde..719fb2c39d 100644 Binary files a/docs/static/screenshots/ScatterChart/brush-light-400w.webp and b/docs/static/screenshots/ScatterChart/brush-light-400w.webp differ diff --git a/docs/static/screenshots/ScatterChart/brush-light-800w.webp b/docs/static/screenshots/ScatterChart/brush-light-800w.webp index d9db7a7c1c..0ae7181079 100644 Binary files a/docs/static/screenshots/ScatterChart/brush-light-800w.webp and b/docs/static/screenshots/ScatterChart/brush-light-800w.webp differ diff --git a/docs/static/screenshots/ScatterChart/custom-dark-240w.webp b/docs/static/screenshots/ScatterChart/custom-dark-240w.webp index b02e12462d..38d7956588 100644 Binary files a/docs/static/screenshots/ScatterChart/custom-dark-240w.webp and b/docs/static/screenshots/ScatterChart/custom-dark-240w.webp differ diff --git a/docs/static/screenshots/ScatterChart/custom-dark-400w.webp b/docs/static/screenshots/ScatterChart/custom-dark-400w.webp index 9c45e93067..b1bf77c7d7 100644 Binary files a/docs/static/screenshots/ScatterChart/custom-dark-400w.webp and b/docs/static/screenshots/ScatterChart/custom-dark-400w.webp differ diff --git a/docs/static/screenshots/ScatterChart/custom-dark-800w.webp b/docs/static/screenshots/ScatterChart/custom-dark-800w.webp index 15e0caa1e8..7f1c40603b 100644 Binary files a/docs/static/screenshots/ScatterChart/custom-dark-800w.webp and b/docs/static/screenshots/ScatterChart/custom-dark-800w.webp differ diff --git a/docs/static/screenshots/ScatterChart/custom-light-800w.webp b/docs/static/screenshots/ScatterChart/custom-light-800w.webp index dae1aebf98..9af06a1a59 100644 Binary files a/docs/static/screenshots/ScatterChart/custom-light-800w.webp and b/docs/static/screenshots/ScatterChart/custom-light-800w.webp differ diff --git a/docs/static/screenshots/ScatterChart/custom-tooltip-dark-240w.webp b/docs/static/screenshots/ScatterChart/custom-tooltip-dark-240w.webp index dca2984778..4c4088a985 100644 Binary files a/docs/static/screenshots/ScatterChart/custom-tooltip-dark-240w.webp and b/docs/static/screenshots/ScatterChart/custom-tooltip-dark-240w.webp differ diff --git a/docs/static/screenshots/ScatterChart/custom-tooltip-dark-400w.webp b/docs/static/screenshots/ScatterChart/custom-tooltip-dark-400w.webp index 3de329c882..63bb62cbb4 100644 Binary files a/docs/static/screenshots/ScatterChart/custom-tooltip-dark-400w.webp and b/docs/static/screenshots/ScatterChart/custom-tooltip-dark-400w.webp differ diff --git a/docs/static/screenshots/ScatterChart/custom-tooltip-dark-800w.webp b/docs/static/screenshots/ScatterChart/custom-tooltip-dark-800w.webp index 6627483e24..74d3e9a2bc 100644 Binary files a/docs/static/screenshots/ScatterChart/custom-tooltip-dark-800w.webp and b/docs/static/screenshots/ScatterChart/custom-tooltip-dark-800w.webp differ diff --git a/docs/static/screenshots/ScatterChart/custom-tooltip-light-400w.webp b/docs/static/screenshots/ScatterChart/custom-tooltip-light-400w.webp index eca590dcb4..107773a05a 100644 Binary files a/docs/static/screenshots/ScatterChart/custom-tooltip-light-400w.webp and b/docs/static/screenshots/ScatterChart/custom-tooltip-light-400w.webp differ diff --git a/docs/static/screenshots/ScatterChart/custom-tooltip-light-800w.webp b/docs/static/screenshots/ScatterChart/custom-tooltip-light-800w.webp index d637948bd7..8882237e1b 100644 Binary files a/docs/static/screenshots/ScatterChart/custom-tooltip-light-800w.webp and b/docs/static/screenshots/ScatterChart/custom-tooltip-light-800w.webp differ diff --git a/docs/static/screenshots/ScatterChart/date-series-color-scale-dark-240w.webp b/docs/static/screenshots/ScatterChart/date-series-color-scale-dark-240w.webp index 986bae8a98..ae35693d0f 100644 Binary files a/docs/static/screenshots/ScatterChart/date-series-color-scale-dark-240w.webp and b/docs/static/screenshots/ScatterChart/date-series-color-scale-dark-240w.webp differ diff --git a/docs/static/screenshots/ScatterChart/date-series-color-scale-dark-400w.webp b/docs/static/screenshots/ScatterChart/date-series-color-scale-dark-400w.webp index fa0c662d70..c20b4d7490 100644 Binary files a/docs/static/screenshots/ScatterChart/date-series-color-scale-dark-400w.webp and b/docs/static/screenshots/ScatterChart/date-series-color-scale-dark-400w.webp differ diff --git a/docs/static/screenshots/ScatterChart/date-series-color-scale-dark-800w.webp b/docs/static/screenshots/ScatterChart/date-series-color-scale-dark-800w.webp index 40c8486571..4e9d93bdaf 100644 Binary files a/docs/static/screenshots/ScatterChart/date-series-color-scale-dark-800w.webp and b/docs/static/screenshots/ScatterChart/date-series-color-scale-dark-800w.webp differ diff --git a/docs/static/screenshots/ScatterChart/date-series-color-scale-light-240w.webp b/docs/static/screenshots/ScatterChart/date-series-color-scale-light-240w.webp index 3fe42cac34..f34cf79cae 100644 Binary files a/docs/static/screenshots/ScatterChart/date-series-color-scale-light-240w.webp and b/docs/static/screenshots/ScatterChart/date-series-color-scale-light-240w.webp differ diff --git a/docs/static/screenshots/ScatterChart/date-series-color-scale-light-400w.webp b/docs/static/screenshots/ScatterChart/date-series-color-scale-light-400w.webp index c248c7e462..6416a134ed 100644 Binary files a/docs/static/screenshots/ScatterChart/date-series-color-scale-light-400w.webp and b/docs/static/screenshots/ScatterChart/date-series-color-scale-light-400w.webp differ diff --git a/docs/static/screenshots/ScatterChart/date-series-color-scale-light-800w.webp b/docs/static/screenshots/ScatterChart/date-series-color-scale-light-800w.webp index 420a43f0e0..09675616ed 100644 Binary files a/docs/static/screenshots/ScatterChart/date-series-color-scale-light-800w.webp and b/docs/static/screenshots/ScatterChart/date-series-color-scale-light-800w.webp differ diff --git a/docs/static/screenshots/ScatterChart/domain-nice-dark-240w.webp b/docs/static/screenshots/ScatterChart/domain-nice-dark-240w.webp index 49a2be9bd1..65a1596327 100644 Binary files a/docs/static/screenshots/ScatterChart/domain-nice-dark-240w.webp and b/docs/static/screenshots/ScatterChart/domain-nice-dark-240w.webp differ diff --git a/docs/static/screenshots/ScatterChart/domain-nice-dark-400w.webp b/docs/static/screenshots/ScatterChart/domain-nice-dark-400w.webp index 6515317aeb..749f20b15e 100644 Binary files a/docs/static/screenshots/ScatterChart/domain-nice-dark-400w.webp and b/docs/static/screenshots/ScatterChart/domain-nice-dark-400w.webp differ diff --git a/docs/static/screenshots/ScatterChart/domain-nice-dark-800w.webp b/docs/static/screenshots/ScatterChart/domain-nice-dark-800w.webp index c3e81183aa..5445d76646 100644 Binary files a/docs/static/screenshots/ScatterChart/domain-nice-dark-800w.webp and b/docs/static/screenshots/ScatterChart/domain-nice-dark-800w.webp differ diff --git a/docs/static/screenshots/ScatterChart/domain-nice-light-400w.webp b/docs/static/screenshots/ScatterChart/domain-nice-light-400w.webp index 60a6c0b10e..57485a3b51 100644 Binary files a/docs/static/screenshots/ScatterChart/domain-nice-light-400w.webp and b/docs/static/screenshots/ScatterChart/domain-nice-light-400w.webp differ diff --git a/docs/static/screenshots/ScatterChart/domain-nice-light-800w.webp b/docs/static/screenshots/ScatterChart/domain-nice-light-800w.webp index b08e96f7c8..bb8aa8ac09 100644 Binary files a/docs/static/screenshots/ScatterChart/domain-nice-light-800w.webp and b/docs/static/screenshots/ScatterChart/domain-nice-light-800w.webp differ diff --git a/docs/static/screenshots/ScatterChart/domain-padding-light-240w.webp b/docs/static/screenshots/ScatterChart/domain-padding-light-240w.webp index 6e9a372f2d..c91f8b8950 100644 Binary files a/docs/static/screenshots/ScatterChart/domain-padding-light-240w.webp and b/docs/static/screenshots/ScatterChart/domain-padding-light-240w.webp differ diff --git a/docs/static/screenshots/ScatterChart/domain-padding-light-400w.webp b/docs/static/screenshots/ScatterChart/domain-padding-light-400w.webp index 4368427cc8..e40c33bf56 100644 Binary files a/docs/static/screenshots/ScatterChart/domain-padding-light-400w.webp and b/docs/static/screenshots/ScatterChart/domain-padding-light-400w.webp differ diff --git a/docs/static/screenshots/ScatterChart/labels-dark-240w.webp b/docs/static/screenshots/ScatterChart/labels-dark-240w.webp index d493758803..10f04fe1f9 100644 Binary files a/docs/static/screenshots/ScatterChart/labels-dark-240w.webp and b/docs/static/screenshots/ScatterChart/labels-dark-240w.webp differ diff --git a/docs/static/screenshots/ScatterChart/labels-dark-400w.webp b/docs/static/screenshots/ScatterChart/labels-dark-400w.webp index ff4b61b083..3fc54576ca 100644 Binary files a/docs/static/screenshots/ScatterChart/labels-dark-400w.webp and b/docs/static/screenshots/ScatterChart/labels-dark-400w.webp differ diff --git a/docs/static/screenshots/ScatterChart/labels-dark-800w.webp b/docs/static/screenshots/ScatterChart/labels-dark-800w.webp index 12ac2ee697..8eacee78f2 100644 Binary files a/docs/static/screenshots/ScatterChart/labels-dark-800w.webp and b/docs/static/screenshots/ScatterChart/labels-dark-800w.webp differ diff --git a/docs/static/screenshots/ScatterChart/labels-light-240w.webp b/docs/static/screenshots/ScatterChart/labels-light-240w.webp index bee3e4d901..31bb631a64 100644 Binary files a/docs/static/screenshots/ScatterChart/labels-light-240w.webp and b/docs/static/screenshots/ScatterChart/labels-light-240w.webp differ diff --git a/docs/static/screenshots/ScatterChart/labels-light-400w.webp b/docs/static/screenshots/ScatterChart/labels-light-400w.webp index a8efe25664..71ce50e21d 100644 Binary files a/docs/static/screenshots/ScatterChart/labels-light-400w.webp and b/docs/static/screenshots/ScatterChart/labels-light-400w.webp differ diff --git a/docs/static/screenshots/ScatterChart/labels-light-800w.webp b/docs/static/screenshots/ScatterChart/labels-light-800w.webp index 3bfabe1d30..e4352e8490 100644 Binary files a/docs/static/screenshots/ScatterChart/labels-light-800w.webp and b/docs/static/screenshots/ScatterChart/labels-light-800w.webp differ diff --git a/docs/static/screenshots/ScatterChart/line-annotation-dark-240w.webp b/docs/static/screenshots/ScatterChart/line-annotation-dark-240w.webp index 3d2dd91363..7c394a1a13 100644 Binary files a/docs/static/screenshots/ScatterChart/line-annotation-dark-240w.webp and b/docs/static/screenshots/ScatterChart/line-annotation-dark-240w.webp differ diff --git a/docs/static/screenshots/ScatterChart/line-annotation-dark-400w.webp b/docs/static/screenshots/ScatterChart/line-annotation-dark-400w.webp index 32657eb936..9bbcf4bc07 100644 Binary files a/docs/static/screenshots/ScatterChart/line-annotation-dark-400w.webp and b/docs/static/screenshots/ScatterChart/line-annotation-dark-400w.webp differ diff --git a/docs/static/screenshots/ScatterChart/line-annotation-dark-800w.webp b/docs/static/screenshots/ScatterChart/line-annotation-dark-800w.webp index 2060c87e98..e00f543bcf 100644 Binary files a/docs/static/screenshots/ScatterChart/line-annotation-dark-800w.webp and b/docs/static/screenshots/ScatterChart/line-annotation-dark-800w.webp differ diff --git a/docs/static/screenshots/ScatterChart/line-annotation-light-400w.webp b/docs/static/screenshots/ScatterChart/line-annotation-light-400w.webp index 1449293ee9..1ed943dc4a 100644 Binary files a/docs/static/screenshots/ScatterChart/line-annotation-light-400w.webp and b/docs/static/screenshots/ScatterChart/line-annotation-light-400w.webp differ diff --git a/docs/static/screenshots/ScatterChart/line-annotation-light-800w.webp b/docs/static/screenshots/ScatterChart/line-annotation-light-800w.webp index a51fdd5757..c06d2ecaa9 100644 Binary files a/docs/static/screenshots/ScatterChart/line-annotation-light-800w.webp and b/docs/static/screenshots/ScatterChart/line-annotation-light-800w.webp differ diff --git a/docs/static/screenshots/ScatterChart/point-annotations-dark-240w.webp b/docs/static/screenshots/ScatterChart/point-annotations-dark-240w.webp index b9ce4234bd..933909ded6 100644 Binary files a/docs/static/screenshots/ScatterChart/point-annotations-dark-240w.webp and b/docs/static/screenshots/ScatterChart/point-annotations-dark-240w.webp differ diff --git a/docs/static/screenshots/ScatterChart/point-annotations-dark-400w.webp b/docs/static/screenshots/ScatterChart/point-annotations-dark-400w.webp index f3e3defd41..fdd7ceaf11 100644 Binary files a/docs/static/screenshots/ScatterChart/point-annotations-dark-400w.webp and b/docs/static/screenshots/ScatterChart/point-annotations-dark-400w.webp differ diff --git a/docs/static/screenshots/ScatterChart/point-annotations-dark-800w.webp b/docs/static/screenshots/ScatterChart/point-annotations-dark-800w.webp index 4afd044951..a69923dfc4 100644 Binary files a/docs/static/screenshots/ScatterChart/point-annotations-dark-800w.webp and b/docs/static/screenshots/ScatterChart/point-annotations-dark-800w.webp differ diff --git a/docs/static/screenshots/ScatterChart/point-annotations-light-400w.webp b/docs/static/screenshots/ScatterChart/point-annotations-light-400w.webp index 86de8315dc..417ae416d5 100644 Binary files a/docs/static/screenshots/ScatterChart/point-annotations-light-400w.webp and b/docs/static/screenshots/ScatterChart/point-annotations-light-400w.webp differ diff --git a/docs/static/screenshots/ScatterChart/point-annotations-light-800w.webp b/docs/static/screenshots/ScatterChart/point-annotations-light-800w.webp index 2f6d10b7d3..dfc9921231 100644 Binary files a/docs/static/screenshots/ScatterChart/point-annotations-light-800w.webp and b/docs/static/screenshots/ScatterChart/point-annotations-light-800w.webp differ diff --git a/docs/static/screenshots/ScatterChart/punchcard-dark-240w.webp b/docs/static/screenshots/ScatterChart/punchcard-dark-240w.webp index 67ef403241..f94de6256b 100644 Binary files a/docs/static/screenshots/ScatterChart/punchcard-dark-240w.webp and b/docs/static/screenshots/ScatterChart/punchcard-dark-240w.webp differ diff --git a/docs/static/screenshots/ScatterChart/punchcard-dark-400w.webp b/docs/static/screenshots/ScatterChart/punchcard-dark-400w.webp index 92ecd18fe5..c15718ee1e 100644 Binary files a/docs/static/screenshots/ScatterChart/punchcard-dark-400w.webp and b/docs/static/screenshots/ScatterChart/punchcard-dark-400w.webp differ diff --git a/docs/static/screenshots/ScatterChart/punchcard-dark-800w.webp b/docs/static/screenshots/ScatterChart/punchcard-dark-800w.webp index a954364ce1..d587aa0d59 100644 Binary files a/docs/static/screenshots/ScatterChart/punchcard-dark-800w.webp and b/docs/static/screenshots/ScatterChart/punchcard-dark-800w.webp differ diff --git a/docs/static/screenshots/ScatterChart/punchcard-light-240w.webp b/docs/static/screenshots/ScatterChart/punchcard-light-240w.webp index fc4a29a9dd..7c23d19117 100644 Binary files a/docs/static/screenshots/ScatterChart/punchcard-light-240w.webp and b/docs/static/screenshots/ScatterChart/punchcard-light-240w.webp differ diff --git a/docs/static/screenshots/ScatterChart/punchcard-light-400w.webp b/docs/static/screenshots/ScatterChart/punchcard-light-400w.webp index 821935d4ad..6401de34b0 100644 Binary files a/docs/static/screenshots/ScatterChart/punchcard-light-400w.webp and b/docs/static/screenshots/ScatterChart/punchcard-light-400w.webp differ diff --git a/docs/static/screenshots/ScatterChart/punchcard-light-800w.webp b/docs/static/screenshots/ScatterChart/punchcard-light-800w.webp index 4309b71ddb..e7496d1b3c 100644 Binary files a/docs/static/screenshots/ScatterChart/punchcard-light-800w.webp and b/docs/static/screenshots/ScatterChart/punchcard-light-800w.webp differ diff --git a/docs/static/screenshots/ScatterChart/radius-scale-dark-240w.webp b/docs/static/screenshots/ScatterChart/radius-scale-dark-240w.webp index 1d5550ed69..da738a6c18 100644 Binary files a/docs/static/screenshots/ScatterChart/radius-scale-dark-240w.webp and b/docs/static/screenshots/ScatterChart/radius-scale-dark-240w.webp differ diff --git a/docs/static/screenshots/ScatterChart/radius-scale-dark-400w.webp b/docs/static/screenshots/ScatterChart/radius-scale-dark-400w.webp index b912bd1040..927caa04e0 100644 Binary files a/docs/static/screenshots/ScatterChart/radius-scale-dark-400w.webp and b/docs/static/screenshots/ScatterChart/radius-scale-dark-400w.webp differ diff --git a/docs/static/screenshots/ScatterChart/radius-scale-dark-800w.webp b/docs/static/screenshots/ScatterChart/radius-scale-dark-800w.webp index b54f1c1c26..fdb62ebdb9 100644 Binary files a/docs/static/screenshots/ScatterChart/radius-scale-dark-800w.webp and b/docs/static/screenshots/ScatterChart/radius-scale-dark-800w.webp differ diff --git a/docs/static/screenshots/ScatterChart/radius-scale-light-400w.webp b/docs/static/screenshots/ScatterChart/radius-scale-light-400w.webp index b05b7ae8a8..c4c0930efb 100644 Binary files a/docs/static/screenshots/ScatterChart/radius-scale-light-400w.webp and b/docs/static/screenshots/ScatterChart/radius-scale-light-400w.webp differ diff --git a/docs/static/screenshots/ScatterChart/radius-scale-light-800w.webp b/docs/static/screenshots/ScatterChart/radius-scale-light-800w.webp index f0c27a7629..38fd1be426 100644 Binary files a/docs/static/screenshots/ScatterChart/radius-scale-light-800w.webp and b/docs/static/screenshots/ScatterChart/radius-scale-light-800w.webp differ diff --git a/docs/static/screenshots/ScatterChart/range-annotation-both-dark-240w.webp b/docs/static/screenshots/ScatterChart/range-annotation-both-dark-240w.webp index 02289daec0..f83796df77 100644 Binary files a/docs/static/screenshots/ScatterChart/range-annotation-both-dark-240w.webp and b/docs/static/screenshots/ScatterChart/range-annotation-both-dark-240w.webp differ diff --git a/docs/static/screenshots/ScatterChart/range-annotation-both-dark-400w.webp b/docs/static/screenshots/ScatterChart/range-annotation-both-dark-400w.webp index 8058b2b3d8..a5d110a347 100644 Binary files a/docs/static/screenshots/ScatterChart/range-annotation-both-dark-400w.webp and b/docs/static/screenshots/ScatterChart/range-annotation-both-dark-400w.webp differ diff --git a/docs/static/screenshots/ScatterChart/range-annotation-both-dark-800w.webp b/docs/static/screenshots/ScatterChart/range-annotation-both-dark-800w.webp index 951a6ebd76..a6b15b7f25 100644 Binary files a/docs/static/screenshots/ScatterChart/range-annotation-both-dark-800w.webp and b/docs/static/screenshots/ScatterChart/range-annotation-both-dark-800w.webp differ diff --git a/docs/static/screenshots/ScatterChart/range-annotation-both-light-400w.webp b/docs/static/screenshots/ScatterChart/range-annotation-both-light-400w.webp index f5a37f029d..16b49f17fd 100644 Binary files a/docs/static/screenshots/ScatterChart/range-annotation-both-light-400w.webp and b/docs/static/screenshots/ScatterChart/range-annotation-both-light-400w.webp differ diff --git a/docs/static/screenshots/ScatterChart/range-annotation-both-light-800w.webp b/docs/static/screenshots/ScatterChart/range-annotation-both-light-800w.webp index 7bf121737c..5419c18c4a 100644 Binary files a/docs/static/screenshots/ScatterChart/range-annotation-both-light-800w.webp and b/docs/static/screenshots/ScatterChart/range-annotation-both-light-800w.webp differ diff --git a/docs/static/screenshots/ScatterChart/range-annotation-horizontal-dark-240w.webp b/docs/static/screenshots/ScatterChart/range-annotation-horizontal-dark-240w.webp index 39aa373299..ba71194088 100644 Binary files a/docs/static/screenshots/ScatterChart/range-annotation-horizontal-dark-240w.webp and b/docs/static/screenshots/ScatterChart/range-annotation-horizontal-dark-240w.webp differ diff --git a/docs/static/screenshots/ScatterChart/range-annotation-horizontal-dark-400w.webp b/docs/static/screenshots/ScatterChart/range-annotation-horizontal-dark-400w.webp index 321c54f681..edce4f0705 100644 Binary files a/docs/static/screenshots/ScatterChart/range-annotation-horizontal-dark-400w.webp and b/docs/static/screenshots/ScatterChart/range-annotation-horizontal-dark-400w.webp differ diff --git a/docs/static/screenshots/ScatterChart/range-annotation-horizontal-dark-800w.webp b/docs/static/screenshots/ScatterChart/range-annotation-horizontal-dark-800w.webp index 99b47c403d..3d996bdd45 100644 Binary files a/docs/static/screenshots/ScatterChart/range-annotation-horizontal-dark-800w.webp and b/docs/static/screenshots/ScatterChart/range-annotation-horizontal-dark-800w.webp differ diff --git a/docs/static/screenshots/ScatterChart/range-annotation-horizontal-light-400w.webp b/docs/static/screenshots/ScatterChart/range-annotation-horizontal-light-400w.webp index b657c996bb..588e8f4cd1 100644 Binary files a/docs/static/screenshots/ScatterChart/range-annotation-horizontal-light-400w.webp and b/docs/static/screenshots/ScatterChart/range-annotation-horizontal-light-400w.webp differ diff --git a/docs/static/screenshots/ScatterChart/range-annotation-horizontal-light-800w.webp b/docs/static/screenshots/ScatterChart/range-annotation-horizontal-light-800w.webp index efd01c8a22..a910ed0db5 100644 Binary files a/docs/static/screenshots/ScatterChart/range-annotation-horizontal-light-800w.webp and b/docs/static/screenshots/ScatterChart/range-annotation-horizontal-light-800w.webp differ diff --git a/docs/static/screenshots/ScatterChart/range-annotation-vertical-dark-400w.webp b/docs/static/screenshots/ScatterChart/range-annotation-vertical-dark-400w.webp index 168d82277f..82f9a02a7b 100644 Binary files a/docs/static/screenshots/ScatterChart/range-annotation-vertical-dark-400w.webp and b/docs/static/screenshots/ScatterChart/range-annotation-vertical-dark-400w.webp differ diff --git a/docs/static/screenshots/ScatterChart/range-annotation-vertical-dark-800w.webp b/docs/static/screenshots/ScatterChart/range-annotation-vertical-dark-800w.webp index 4f021779ab..a13dd8e7c3 100644 Binary files a/docs/static/screenshots/ScatterChart/range-annotation-vertical-dark-800w.webp and b/docs/static/screenshots/ScatterChart/range-annotation-vertical-dark-800w.webp differ diff --git a/docs/static/screenshots/ScatterChart/range-annotation-vertical-light-400w.webp b/docs/static/screenshots/ScatterChart/range-annotation-vertical-light-400w.webp index c76adbd382..69aec4f45d 100644 Binary files a/docs/static/screenshots/ScatterChart/range-annotation-vertical-light-400w.webp and b/docs/static/screenshots/ScatterChart/range-annotation-vertical-light-400w.webp differ diff --git a/docs/static/screenshots/ScatterChart/range-annotation-vertical-light-800w.webp b/docs/static/screenshots/ScatterChart/range-annotation-vertical-light-800w.webp index da5c9519a8..64c0d6a541 100644 Binary files a/docs/static/screenshots/ScatterChart/range-annotation-vertical-light-800w.webp and b/docs/static/screenshots/ScatterChart/range-annotation-vertical-light-800w.webp differ diff --git a/docs/static/screenshots/ScatterChart/series-custom-labels-dark-400w.webp b/docs/static/screenshots/ScatterChart/series-custom-labels-dark-400w.webp index 031022f712..c3aef6d258 100644 Binary files a/docs/static/screenshots/ScatterChart/series-custom-labels-dark-400w.webp and b/docs/static/screenshots/ScatterChart/series-custom-labels-dark-400w.webp differ diff --git a/docs/static/screenshots/ScatterChart/series-custom-labels-dark-800w.webp b/docs/static/screenshots/ScatterChart/series-custom-labels-dark-800w.webp index c9da138a2e..90df1ed6d9 100644 Binary files a/docs/static/screenshots/ScatterChart/series-custom-labels-dark-800w.webp and b/docs/static/screenshots/ScatterChart/series-custom-labels-dark-800w.webp differ diff --git a/docs/static/screenshots/ScatterChart/series-custom-labels-light-240w.webp b/docs/static/screenshots/ScatterChart/series-custom-labels-light-240w.webp index 7f09d2f0f5..412b7fc464 100644 Binary files a/docs/static/screenshots/ScatterChart/series-custom-labels-light-240w.webp and b/docs/static/screenshots/ScatterChart/series-custom-labels-light-240w.webp differ diff --git a/docs/static/screenshots/ScatterChart/series-custom-labels-light-400w.webp b/docs/static/screenshots/ScatterChart/series-custom-labels-light-400w.webp index 70b16a8b3d..e27ae896f4 100644 Binary files a/docs/static/screenshots/ScatterChart/series-custom-labels-light-400w.webp and b/docs/static/screenshots/ScatterChart/series-custom-labels-light-400w.webp differ diff --git a/docs/static/screenshots/ScatterChart/series-custom-labels-light-800w.webp b/docs/static/screenshots/ScatterChart/series-custom-labels-light-800w.webp index 6b12e13c66..8287714fb4 100644 Binary files a/docs/static/screenshots/ScatterChart/series-custom-labels-light-800w.webp and b/docs/static/screenshots/ScatterChart/series-custom-labels-light-800w.webp differ diff --git a/docs/static/screenshots/ScatterChart/series-legend-light-240w.webp b/docs/static/screenshots/ScatterChart/series-legend-light-240w.webp index 640f79a5ef..398a108f85 100644 Binary files a/docs/static/screenshots/ScatterChart/series-legend-light-240w.webp and b/docs/static/screenshots/ScatterChart/series-legend-light-240w.webp differ diff --git a/docs/static/screenshots/ScatterChart/series-legend-light-400w.webp b/docs/static/screenshots/ScatterChart/series-legend-light-400w.webp index 7b74b70a73..ab68da2b71 100644 Binary files a/docs/static/screenshots/ScatterChart/series-legend-light-400w.webp and b/docs/static/screenshots/ScatterChart/series-legend-light-400w.webp differ diff --git a/docs/static/screenshots/ScatterChart/series-light-800w.webp b/docs/static/screenshots/ScatterChart/series-light-800w.webp index 5a05b0f74f..7a18115422 100644 Binary files a/docs/static/screenshots/ScatterChart/series-light-800w.webp and b/docs/static/screenshots/ScatterChart/series-light-800w.webp differ diff --git a/docs/static/screenshots/ScatterChart/series-tween-light-240w.webp b/docs/static/screenshots/ScatterChart/series-tween-light-240w.webp index 640f79a5ef..398a108f85 100644 Binary files a/docs/static/screenshots/ScatterChart/series-tween-light-240w.webp and b/docs/static/screenshots/ScatterChart/series-tween-light-240w.webp differ diff --git a/docs/static/screenshots/ScatterChart/series-tween-light-400w.webp b/docs/static/screenshots/ScatterChart/series-tween-light-400w.webp index 7b74b70a73..ab68da2b71 100644 Binary files a/docs/static/screenshots/ScatterChart/series-tween-light-400w.webp and b/docs/static/screenshots/ScatterChart/series-tween-light-400w.webp differ diff --git a/docs/static/screenshots/ScatterChart/series-with-radius-light-400w.webp b/docs/static/screenshots/ScatterChart/series-with-radius-light-400w.webp index 11b81785e3..cc3f633865 100644 Binary files a/docs/static/screenshots/ScatterChart/series-with-radius-light-400w.webp and b/docs/static/screenshots/ScatterChart/series-with-radius-light-400w.webp differ diff --git a/docs/static/screenshots/ScatterChart/single-axis-x-dark-400w.webp b/docs/static/screenshots/ScatterChart/single-axis-x-dark-400w.webp index f422ea1152..cfb2fc0dc9 100644 Binary files a/docs/static/screenshots/ScatterChart/single-axis-x-dark-400w.webp and b/docs/static/screenshots/ScatterChart/single-axis-x-dark-400w.webp differ diff --git a/docs/static/screenshots/ScatterChart/single-axis-x-dark-800w.webp b/docs/static/screenshots/ScatterChart/single-axis-x-dark-800w.webp index 40f571511e..7f20d6809c 100644 Binary files a/docs/static/screenshots/ScatterChart/single-axis-x-dark-800w.webp and b/docs/static/screenshots/ScatterChart/single-axis-x-dark-800w.webp differ diff --git a/docs/static/screenshots/ScatterChart/single-axis-x-light-240w.webp b/docs/static/screenshots/ScatterChart/single-axis-x-light-240w.webp index 14d7c9831d..e902def38f 100644 Binary files a/docs/static/screenshots/ScatterChart/single-axis-x-light-240w.webp and b/docs/static/screenshots/ScatterChart/single-axis-x-light-240w.webp differ diff --git a/docs/static/screenshots/ScatterChart/single-axis-x-light-400w.webp b/docs/static/screenshots/ScatterChart/single-axis-x-light-400w.webp index 97341c4d4d..a05898c67e 100644 Binary files a/docs/static/screenshots/ScatterChart/single-axis-x-light-400w.webp and b/docs/static/screenshots/ScatterChart/single-axis-x-light-400w.webp differ diff --git a/docs/static/screenshots/ScatterChart/single-dimension-dark-240w.webp b/docs/static/screenshots/ScatterChart/single-dimension-dark-240w.webp index 526baeecc5..a4f05ea0e1 100644 Binary files a/docs/static/screenshots/ScatterChart/single-dimension-dark-240w.webp and b/docs/static/screenshots/ScatterChart/single-dimension-dark-240w.webp differ diff --git a/docs/static/screenshots/ScatterChart/single-dimension-dark-400w.webp b/docs/static/screenshots/ScatterChart/single-dimension-dark-400w.webp index 85b55633f7..8597dac933 100644 Binary files a/docs/static/screenshots/ScatterChart/single-dimension-dark-400w.webp and b/docs/static/screenshots/ScatterChart/single-dimension-dark-400w.webp differ diff --git a/docs/static/screenshots/ScatterChart/single-dimension-dark-800w.webp b/docs/static/screenshots/ScatterChart/single-dimension-dark-800w.webp index 87f9ffa32c..83bc5cf172 100644 Binary files a/docs/static/screenshots/ScatterChart/single-dimension-dark-800w.webp and b/docs/static/screenshots/ScatterChart/single-dimension-dark-800w.webp differ diff --git a/docs/static/screenshots/ScatterChart/single-dimension-light-240w.webp b/docs/static/screenshots/ScatterChart/single-dimension-light-240w.webp index d104f55850..4bc2df78b4 100644 Binary files a/docs/static/screenshots/ScatterChart/single-dimension-light-240w.webp and b/docs/static/screenshots/ScatterChart/single-dimension-light-240w.webp differ diff --git a/docs/static/screenshots/ScatterChart/single-dimension-light-400w.webp b/docs/static/screenshots/ScatterChart/single-dimension-light-400w.webp index 3f80fddf5c..0519f84b76 100644 Binary files a/docs/static/screenshots/ScatterChart/single-dimension-light-400w.webp and b/docs/static/screenshots/ScatterChart/single-dimension-light-400w.webp differ diff --git a/docs/static/screenshots/ScatterChart/single-dimension-light-800w.webp b/docs/static/screenshots/ScatterChart/single-dimension-light-800w.webp index 3fc3949959..b160cb40b3 100644 Binary files a/docs/static/screenshots/ScatterChart/single-dimension-light-800w.webp and b/docs/static/screenshots/ScatterChart/single-dimension-light-800w.webp differ diff --git a/docs/static/screenshots/ScatterChart/tooltip-click-dark-240w.webp b/docs/static/screenshots/ScatterChart/tooltip-click-dark-240w.webp index dca2984778..4c4088a985 100644 Binary files a/docs/static/screenshots/ScatterChart/tooltip-click-dark-240w.webp and b/docs/static/screenshots/ScatterChart/tooltip-click-dark-240w.webp differ diff --git a/docs/static/screenshots/ScatterChart/tooltip-click-dark-400w.webp b/docs/static/screenshots/ScatterChart/tooltip-click-dark-400w.webp index 3de329c882..63bb62cbb4 100644 Binary files a/docs/static/screenshots/ScatterChart/tooltip-click-dark-400w.webp and b/docs/static/screenshots/ScatterChart/tooltip-click-dark-400w.webp differ diff --git a/docs/static/screenshots/ScatterChart/tooltip-click-dark-800w.webp b/docs/static/screenshots/ScatterChart/tooltip-click-dark-800w.webp index 6627483e24..74d3e9a2bc 100644 Binary files a/docs/static/screenshots/ScatterChart/tooltip-click-dark-800w.webp and b/docs/static/screenshots/ScatterChart/tooltip-click-dark-800w.webp differ diff --git a/docs/static/screenshots/ScatterChart/tooltip-click-light-400w.webp b/docs/static/screenshots/ScatterChart/tooltip-click-light-400w.webp index eca590dcb4..107773a05a 100644 Binary files a/docs/static/screenshots/ScatterChart/tooltip-click-light-400w.webp and b/docs/static/screenshots/ScatterChart/tooltip-click-light-400w.webp differ diff --git a/docs/static/screenshots/ScatterChart/tooltip-click-light-800w.webp b/docs/static/screenshots/ScatterChart/tooltip-click-light-800w.webp index d637948bd7..8882237e1b 100644 Binary files a/docs/static/screenshots/ScatterChart/tooltip-click-light-800w.webp and b/docs/static/screenshots/ScatterChart/tooltip-click-light-800w.webp differ diff --git a/docs/static/screenshots/ScatterChart/zoomable-bubble-dark-240w.webp b/docs/static/screenshots/ScatterChart/zoomable-bubble-dark-240w.webp index 11574545a2..ade97b63a6 100644 Binary files a/docs/static/screenshots/ScatterChart/zoomable-bubble-dark-240w.webp and b/docs/static/screenshots/ScatterChart/zoomable-bubble-dark-240w.webp differ diff --git a/docs/static/screenshots/ScatterChart/zoomable-bubble-dark-400w.webp b/docs/static/screenshots/ScatterChart/zoomable-bubble-dark-400w.webp index 69345c5c8c..dd2ff3c204 100644 Binary files a/docs/static/screenshots/ScatterChart/zoomable-bubble-dark-400w.webp and b/docs/static/screenshots/ScatterChart/zoomable-bubble-dark-400w.webp differ diff --git a/docs/static/screenshots/ScatterChart/zoomable-bubble-dark-800w.webp b/docs/static/screenshots/ScatterChart/zoomable-bubble-dark-800w.webp index 4526b5355a..0d68e0e6cb 100644 Binary files a/docs/static/screenshots/ScatterChart/zoomable-bubble-dark-800w.webp and b/docs/static/screenshots/ScatterChart/zoomable-bubble-dark-800w.webp differ diff --git a/docs/static/screenshots/ScatterChart/zoomable-bubble-light-240w.webp b/docs/static/screenshots/ScatterChart/zoomable-bubble-light-240w.webp index 65b907ddf3..6eafbdefeb 100644 Binary files a/docs/static/screenshots/ScatterChart/zoomable-bubble-light-240w.webp and b/docs/static/screenshots/ScatterChart/zoomable-bubble-light-240w.webp differ diff --git a/docs/static/screenshots/ScatterChart/zoomable-bubble-light-400w.webp b/docs/static/screenshots/ScatterChart/zoomable-bubble-light-400w.webp index 1420141b5a..ec6f0e31d2 100644 Binary files a/docs/static/screenshots/ScatterChart/zoomable-bubble-light-400w.webp and b/docs/static/screenshots/ScatterChart/zoomable-bubble-light-400w.webp differ diff --git a/docs/static/screenshots/ScatterChart/zoomable-bubble-light-800w.webp b/docs/static/screenshots/ScatterChart/zoomable-bubble-light-800w.webp index 6386ae215a..f1681c3a04 100644 Binary files a/docs/static/screenshots/ScatterChart/zoomable-bubble-light-800w.webp and b/docs/static/screenshots/ScatterChart/zoomable-bubble-light-800w.webp differ diff --git a/docs/static/screenshots/Spline/basic-dark-240w.webp b/docs/static/screenshots/Spline/basic-dark-240w.webp index b7857425a1..46140434ad 100644 Binary files a/docs/static/screenshots/Spline/basic-dark-240w.webp and b/docs/static/screenshots/Spline/basic-dark-240w.webp differ diff --git a/docs/static/screenshots/Spline/basic-dark-400w.webp b/docs/static/screenshots/Spline/basic-dark-400w.webp index fb45680404..2b2a09c59a 100644 Binary files a/docs/static/screenshots/Spline/basic-dark-400w.webp and b/docs/static/screenshots/Spline/basic-dark-400w.webp differ diff --git a/docs/static/screenshots/Spline/basic-dark-800w.webp b/docs/static/screenshots/Spline/basic-dark-800w.webp index 90ed71724e..df7a208a74 100644 Binary files a/docs/static/screenshots/Spline/basic-dark-800w.webp and b/docs/static/screenshots/Spline/basic-dark-800w.webp differ diff --git a/docs/static/screenshots/Spline/basic-light-240w.webp b/docs/static/screenshots/Spline/basic-light-240w.webp index 08f43764ba..f5061502d9 100644 Binary files a/docs/static/screenshots/Spline/basic-light-240w.webp and b/docs/static/screenshots/Spline/basic-light-240w.webp differ diff --git a/docs/static/screenshots/Spline/basic-light-400w.webp b/docs/static/screenshots/Spline/basic-light-400w.webp index a39890d3d2..2faa027d6a 100644 Binary files a/docs/static/screenshots/Spline/basic-light-400w.webp and b/docs/static/screenshots/Spline/basic-light-400w.webp differ diff --git a/docs/static/screenshots/Spline/basic-light-800w.webp b/docs/static/screenshots/Spline/basic-light-800w.webp index 8fc7aa0254..bbc65a0108 100644 Binary files a/docs/static/screenshots/Spline/basic-light-800w.webp and b/docs/static/screenshots/Spline/basic-light-800w.webp differ diff --git a/docs/static/screenshots/Spline/draw-dark-800w.webp b/docs/static/screenshots/Spline/draw-dark-800w.webp index b4ba038d44..36a85757ad 100644 Binary files a/docs/static/screenshots/Spline/draw-dark-800w.webp and b/docs/static/screenshots/Spline/draw-dark-800w.webp differ diff --git a/docs/static/screenshots/Spline/end-slot-with-draw-with-value-dark-240w.webp b/docs/static/screenshots/Spline/end-slot-with-draw-with-value-dark-240w.webp index 46309062f8..869db6c2d4 100644 Binary files a/docs/static/screenshots/Spline/end-slot-with-draw-with-value-dark-240w.webp and b/docs/static/screenshots/Spline/end-slot-with-draw-with-value-dark-240w.webp differ diff --git a/docs/static/screenshots/Spline/end-slot-with-draw-with-value-dark-400w.webp b/docs/static/screenshots/Spline/end-slot-with-draw-with-value-dark-400w.webp index b12b637beb..8b317176de 100644 Binary files a/docs/static/screenshots/Spline/end-slot-with-draw-with-value-dark-400w.webp and b/docs/static/screenshots/Spline/end-slot-with-draw-with-value-dark-400w.webp differ diff --git a/docs/static/screenshots/Spline/end-slot-with-draw-with-value-dark-800w.webp b/docs/static/screenshots/Spline/end-slot-with-draw-with-value-dark-800w.webp index c05d0ac8ba..2dcba56f47 100644 Binary files a/docs/static/screenshots/Spline/end-slot-with-draw-with-value-dark-800w.webp and b/docs/static/screenshots/Spline/end-slot-with-draw-with-value-dark-800w.webp differ diff --git a/docs/static/screenshots/Spline/end-slot-with-draw-with-value-light-240w.webp b/docs/static/screenshots/Spline/end-slot-with-draw-with-value-light-240w.webp index a052f79d4f..0b6f44c37b 100644 Binary files a/docs/static/screenshots/Spline/end-slot-with-draw-with-value-light-240w.webp and b/docs/static/screenshots/Spline/end-slot-with-draw-with-value-light-240w.webp differ diff --git a/docs/static/screenshots/Spline/end-slot-with-draw-with-value-light-400w.webp b/docs/static/screenshots/Spline/end-slot-with-draw-with-value-light-400w.webp index 31b1eff5b5..fe767b3550 100644 Binary files a/docs/static/screenshots/Spline/end-slot-with-draw-with-value-light-400w.webp and b/docs/static/screenshots/Spline/end-slot-with-draw-with-value-light-400w.webp differ diff --git a/docs/static/screenshots/Spline/end-slot-with-draw-with-value-light-800w.webp b/docs/static/screenshots/Spline/end-slot-with-draw-with-value-light-800w.webp index a63da436fd..20bea92049 100644 Binary files a/docs/static/screenshots/Spline/end-slot-with-draw-with-value-light-800w.webp and b/docs/static/screenshots/Spline/end-slot-with-draw-with-value-light-800w.webp differ diff --git a/docs/static/screenshots/Spline/end-snippet-with-draw-dark-240w.webp b/docs/static/screenshots/Spline/end-snippet-with-draw-dark-240w.webp index bc8c26e390..ab5b44542a 100644 Binary files a/docs/static/screenshots/Spline/end-snippet-with-draw-dark-240w.webp and b/docs/static/screenshots/Spline/end-snippet-with-draw-dark-240w.webp differ diff --git a/docs/static/screenshots/Spline/end-snippet-with-draw-dark-400w.webp b/docs/static/screenshots/Spline/end-snippet-with-draw-dark-400w.webp index 4aa2bf81d3..7ae78115b0 100644 Binary files a/docs/static/screenshots/Spline/end-snippet-with-draw-dark-400w.webp and b/docs/static/screenshots/Spline/end-snippet-with-draw-dark-400w.webp differ diff --git a/docs/static/screenshots/Spline/end-snippet-with-draw-dark-800w.webp b/docs/static/screenshots/Spline/end-snippet-with-draw-dark-800w.webp index d980d27924..31baf2cce9 100644 Binary files a/docs/static/screenshots/Spline/end-snippet-with-draw-dark-800w.webp and b/docs/static/screenshots/Spline/end-snippet-with-draw-dark-800w.webp differ diff --git a/docs/static/screenshots/Spline/end-snippet-with-draw-light-240w.webp b/docs/static/screenshots/Spline/end-snippet-with-draw-light-240w.webp index 2976bb5372..2c85bbf467 100644 Binary files a/docs/static/screenshots/Spline/end-snippet-with-draw-light-240w.webp and b/docs/static/screenshots/Spline/end-snippet-with-draw-light-240w.webp differ diff --git a/docs/static/screenshots/Spline/end-snippet-with-draw-light-400w.webp b/docs/static/screenshots/Spline/end-snippet-with-draw-light-400w.webp index b44ec9605c..79d984d5cc 100644 Binary files a/docs/static/screenshots/Spline/end-snippet-with-draw-light-400w.webp and b/docs/static/screenshots/Spline/end-snippet-with-draw-light-400w.webp differ diff --git a/docs/static/screenshots/Spline/end-snippet-with-draw-light-800w.webp b/docs/static/screenshots/Spline/end-snippet-with-draw-light-800w.webp index 7668ff5b9b..c651adb46f 100644 Binary files a/docs/static/screenshots/Spline/end-snippet-with-draw-light-800w.webp and b/docs/static/screenshots/Spline/end-snippet-with-draw-light-800w.webp differ diff --git a/docs/static/screenshots/Spline/gradient-encoding-dark-240w.webp b/docs/static/screenshots/Spline/gradient-encoding-dark-240w.webp index 655154ef15..094d6fcd77 100644 Binary files a/docs/static/screenshots/Spline/gradient-encoding-dark-240w.webp and b/docs/static/screenshots/Spline/gradient-encoding-dark-240w.webp differ diff --git a/docs/static/screenshots/Spline/gradient-encoding-dark-400w.webp b/docs/static/screenshots/Spline/gradient-encoding-dark-400w.webp index 97a412f4b5..7a42864eec 100644 Binary files a/docs/static/screenshots/Spline/gradient-encoding-dark-400w.webp and b/docs/static/screenshots/Spline/gradient-encoding-dark-400w.webp differ diff --git a/docs/static/screenshots/Spline/gradient-encoding-dark-800w.webp b/docs/static/screenshots/Spline/gradient-encoding-dark-800w.webp index af4a492212..93dbab2765 100644 Binary files a/docs/static/screenshots/Spline/gradient-encoding-dark-800w.webp and b/docs/static/screenshots/Spline/gradient-encoding-dark-800w.webp differ diff --git a/docs/static/screenshots/Spline/gradient-encoding-light-240w.webp b/docs/static/screenshots/Spline/gradient-encoding-light-240w.webp index 6f4e1e632e..d6db413a00 100644 Binary files a/docs/static/screenshots/Spline/gradient-encoding-light-240w.webp and b/docs/static/screenshots/Spline/gradient-encoding-light-240w.webp differ diff --git a/docs/static/screenshots/Spline/gradient-encoding-light-400w.webp b/docs/static/screenshots/Spline/gradient-encoding-light-400w.webp index e6847ae3fd..6432a7aa53 100644 Binary files a/docs/static/screenshots/Spline/gradient-encoding-light-400w.webp and b/docs/static/screenshots/Spline/gradient-encoding-light-400w.webp differ diff --git a/docs/static/screenshots/Spline/gradient-encoding-light-800w.webp b/docs/static/screenshots/Spline/gradient-encoding-light-800w.webp index 55381f9b93..22ffca1ccb 100644 Binary files a/docs/static/screenshots/Spline/gradient-encoding-light-800w.webp and b/docs/static/screenshots/Spline/gradient-encoding-light-800w.webp differ diff --git a/docs/static/screenshots/Spline/gradient-threshold-dark-240w.webp b/docs/static/screenshots/Spline/gradient-threshold-dark-240w.webp index 8d9a4aa3a5..2f7637be84 100644 Binary files a/docs/static/screenshots/Spline/gradient-threshold-dark-240w.webp and b/docs/static/screenshots/Spline/gradient-threshold-dark-240w.webp differ diff --git a/docs/static/screenshots/Spline/gradient-threshold-dark-400w.webp b/docs/static/screenshots/Spline/gradient-threshold-dark-400w.webp index b9cbd31d29..48ac9552ab 100644 Binary files a/docs/static/screenshots/Spline/gradient-threshold-dark-400w.webp and b/docs/static/screenshots/Spline/gradient-threshold-dark-400w.webp differ diff --git a/docs/static/screenshots/Spline/gradient-threshold-dark-800w.webp b/docs/static/screenshots/Spline/gradient-threshold-dark-800w.webp index 57ca306207..64ad6ba101 100644 Binary files a/docs/static/screenshots/Spline/gradient-threshold-dark-800w.webp and b/docs/static/screenshots/Spline/gradient-threshold-dark-800w.webp differ diff --git a/docs/static/screenshots/Spline/gradient-threshold-light-240w.webp b/docs/static/screenshots/Spline/gradient-threshold-light-240w.webp index d9d21691b1..0718280790 100644 Binary files a/docs/static/screenshots/Spline/gradient-threshold-light-240w.webp and b/docs/static/screenshots/Spline/gradient-threshold-light-240w.webp differ diff --git a/docs/static/screenshots/Spline/gradient-threshold-light-400w.webp b/docs/static/screenshots/Spline/gradient-threshold-light-400w.webp index b047a52650..65e584a568 100644 Binary files a/docs/static/screenshots/Spline/gradient-threshold-light-400w.webp and b/docs/static/screenshots/Spline/gradient-threshold-light-400w.webp differ diff --git a/docs/static/screenshots/Spline/gradient-threshold-light-800w.webp b/docs/static/screenshots/Spline/gradient-threshold-light-800w.webp index 1079ecd053..56b0d0b11e 100644 Binary files a/docs/static/screenshots/Spline/gradient-threshold-light-800w.webp and b/docs/static/screenshots/Spline/gradient-threshold-light-800w.webp differ diff --git a/docs/static/screenshots/Spline/label-using-start-end-snippets-dark-800w.webp b/docs/static/screenshots/Spline/label-using-start-end-snippets-dark-800w.webp index c45bb35c73..61b85585e7 100644 Binary files a/docs/static/screenshots/Spline/label-using-start-end-snippets-dark-800w.webp and b/docs/static/screenshots/Spline/label-using-start-end-snippets-dark-800w.webp differ diff --git a/docs/static/screenshots/Spline/label-using-start-end-snippets-light-800w.webp b/docs/static/screenshots/Spline/label-using-start-end-snippets-light-800w.webp index a0b688c8f1..6154fc2c43 100644 Binary files a/docs/static/screenshots/Spline/label-using-start-end-snippets-light-800w.webp and b/docs/static/screenshots/Spline/label-using-start-end-snippets-light-800w.webp differ diff --git a/docs/static/screenshots/Spline/markers-arrows-dark-800w.webp b/docs/static/screenshots/Spline/markers-arrows-dark-800w.webp index d8a0057ccc..845b88d0f2 100644 Binary files a/docs/static/screenshots/Spline/markers-arrows-dark-800w.webp and b/docs/static/screenshots/Spline/markers-arrows-dark-800w.webp differ diff --git a/docs/static/screenshots/Spline/markers-arrows-light-800w.webp b/docs/static/screenshots/Spline/markers-arrows-light-800w.webp index 942bf7f14d..35298e2378 100644 Binary files a/docs/static/screenshots/Spline/markers-arrows-light-800w.webp and b/docs/static/screenshots/Spline/markers-arrows-light-800w.webp differ diff --git a/docs/static/screenshots/Spline/math-formula-dark-400w.webp b/docs/static/screenshots/Spline/math-formula-dark-400w.webp index 4f68883808..15660ae3ee 100644 Binary files a/docs/static/screenshots/Spline/math-formula-dark-400w.webp and b/docs/static/screenshots/Spline/math-formula-dark-400w.webp differ diff --git a/docs/static/screenshots/Spline/math-formula-dark-800w.webp b/docs/static/screenshots/Spline/math-formula-dark-800w.webp index 763dcd2e6f..ffc5b2a0a4 100644 Binary files a/docs/static/screenshots/Spline/math-formula-dark-800w.webp and b/docs/static/screenshots/Spline/math-formula-dark-800w.webp differ diff --git a/docs/static/screenshots/Spline/math-formula-light-800w.webp b/docs/static/screenshots/Spline/math-formula-light-800w.webp index 019578ce63..f9ddde9f87 100644 Binary files a/docs/static/screenshots/Spline/math-formula-light-800w.webp and b/docs/static/screenshots/Spline/math-formula-light-800w.webp differ diff --git a/docs/static/screenshots/Spline/multiple-series-dark-240w.webp b/docs/static/screenshots/Spline/multiple-series-dark-240w.webp index 025d758505..d7e69bdabf 100644 Binary files a/docs/static/screenshots/Spline/multiple-series-dark-240w.webp and b/docs/static/screenshots/Spline/multiple-series-dark-240w.webp differ diff --git a/docs/static/screenshots/Spline/multiple-series-dark-400w.webp b/docs/static/screenshots/Spline/multiple-series-dark-400w.webp index 496d0af308..fcd807d753 100644 Binary files a/docs/static/screenshots/Spline/multiple-series-dark-400w.webp and b/docs/static/screenshots/Spline/multiple-series-dark-400w.webp differ diff --git a/docs/static/screenshots/Spline/multiple-series-dark-800w.webp b/docs/static/screenshots/Spline/multiple-series-dark-800w.webp index 408d8a8e24..5e0a43471b 100644 Binary files a/docs/static/screenshots/Spline/multiple-series-dark-800w.webp and b/docs/static/screenshots/Spline/multiple-series-dark-800w.webp differ diff --git a/docs/static/screenshots/Spline/multiple-series-highlight-on-hover-dark-240w.webp b/docs/static/screenshots/Spline/multiple-series-highlight-on-hover-dark-240w.webp index 9324f3fd85..c4ac2325b3 100644 Binary files a/docs/static/screenshots/Spline/multiple-series-highlight-on-hover-dark-240w.webp and b/docs/static/screenshots/Spline/multiple-series-highlight-on-hover-dark-240w.webp differ diff --git a/docs/static/screenshots/Spline/multiple-series-highlight-on-hover-dark-400w.webp b/docs/static/screenshots/Spline/multiple-series-highlight-on-hover-dark-400w.webp index f939881295..5d88469bad 100644 Binary files a/docs/static/screenshots/Spline/multiple-series-highlight-on-hover-dark-400w.webp and b/docs/static/screenshots/Spline/multiple-series-highlight-on-hover-dark-400w.webp differ diff --git a/docs/static/screenshots/Spline/multiple-series-highlight-on-hover-dark-800w.webp b/docs/static/screenshots/Spline/multiple-series-highlight-on-hover-dark-800w.webp index 7ff7b823a5..d142bfe3df 100644 Binary files a/docs/static/screenshots/Spline/multiple-series-highlight-on-hover-dark-800w.webp and b/docs/static/screenshots/Spline/multiple-series-highlight-on-hover-dark-800w.webp differ diff --git a/docs/static/screenshots/Spline/multiple-series-highlight-on-hover-light-240w.webp b/docs/static/screenshots/Spline/multiple-series-highlight-on-hover-light-240w.webp index 55f24df094..556c62c5b7 100644 Binary files a/docs/static/screenshots/Spline/multiple-series-highlight-on-hover-light-240w.webp and b/docs/static/screenshots/Spline/multiple-series-highlight-on-hover-light-240w.webp differ diff --git a/docs/static/screenshots/Spline/multiple-series-highlight-on-hover-light-400w.webp b/docs/static/screenshots/Spline/multiple-series-highlight-on-hover-light-400w.webp index 0d2da96811..3d4abe174e 100644 Binary files a/docs/static/screenshots/Spline/multiple-series-highlight-on-hover-light-400w.webp and b/docs/static/screenshots/Spline/multiple-series-highlight-on-hover-light-400w.webp differ diff --git a/docs/static/screenshots/Spline/multiple-series-highlight-on-hover-light-800w.webp b/docs/static/screenshots/Spline/multiple-series-highlight-on-hover-light-800w.webp index 62d14812c0..4cf31d4f10 100644 Binary files a/docs/static/screenshots/Spline/multiple-series-highlight-on-hover-light-800w.webp and b/docs/static/screenshots/Spline/multiple-series-highlight-on-hover-light-800w.webp differ diff --git a/docs/static/screenshots/Spline/multiple-series-light-240w.webp b/docs/static/screenshots/Spline/multiple-series-light-240w.webp index f931e41858..8ead64ce5d 100644 Binary files a/docs/static/screenshots/Spline/multiple-series-light-240w.webp and b/docs/static/screenshots/Spline/multiple-series-light-240w.webp differ diff --git a/docs/static/screenshots/Spline/multiple-series-light-400w.webp b/docs/static/screenshots/Spline/multiple-series-light-400w.webp index 9ab9ce761d..27a6761ecd 100644 Binary files a/docs/static/screenshots/Spline/multiple-series-light-400w.webp and b/docs/static/screenshots/Spline/multiple-series-light-400w.webp differ diff --git a/docs/static/screenshots/Spline/multiple-series-light-800w.webp b/docs/static/screenshots/Spline/multiple-series-light-800w.webp index 8532f8e752..da08e348d1 100644 Binary files a/docs/static/screenshots/Spline/multiple-series-light-800w.webp and b/docs/static/screenshots/Spline/multiple-series-light-800w.webp differ diff --git a/docs/static/screenshots/Spline/multiple-series-using-overrides-dark-240w.webp b/docs/static/screenshots/Spline/multiple-series-using-overrides-dark-240w.webp index cb9e8cf133..7d502cc19f 100644 Binary files a/docs/static/screenshots/Spline/multiple-series-using-overrides-dark-240w.webp and b/docs/static/screenshots/Spline/multiple-series-using-overrides-dark-240w.webp differ diff --git a/docs/static/screenshots/Spline/multiple-series-using-overrides-dark-400w.webp b/docs/static/screenshots/Spline/multiple-series-using-overrides-dark-400w.webp index 8a4977a591..3460e90ee3 100644 Binary files a/docs/static/screenshots/Spline/multiple-series-using-overrides-dark-400w.webp and b/docs/static/screenshots/Spline/multiple-series-using-overrides-dark-400w.webp differ diff --git a/docs/static/screenshots/Spline/multiple-series-using-overrides-dark-800w.webp b/docs/static/screenshots/Spline/multiple-series-using-overrides-dark-800w.webp index bdb51d27fb..a217d8734f 100644 Binary files a/docs/static/screenshots/Spline/multiple-series-using-overrides-dark-800w.webp and b/docs/static/screenshots/Spline/multiple-series-using-overrides-dark-800w.webp differ diff --git a/docs/static/screenshots/Spline/multiple-series-using-overrides-light-240w.webp b/docs/static/screenshots/Spline/multiple-series-using-overrides-light-240w.webp index 31c0e4e3e9..a1ae5ee591 100644 Binary files a/docs/static/screenshots/Spline/multiple-series-using-overrides-light-240w.webp and b/docs/static/screenshots/Spline/multiple-series-using-overrides-light-240w.webp differ diff --git a/docs/static/screenshots/Spline/multiple-series-using-overrides-light-400w.webp b/docs/static/screenshots/Spline/multiple-series-using-overrides-light-400w.webp index 1e4dbb1dc7..7c5ec5c3e8 100644 Binary files a/docs/static/screenshots/Spline/multiple-series-using-overrides-light-400w.webp and b/docs/static/screenshots/Spline/multiple-series-using-overrides-light-400w.webp differ diff --git a/docs/static/screenshots/Spline/multiple-series-using-overrides-light-800w.webp b/docs/static/screenshots/Spline/multiple-series-using-overrides-light-800w.webp index 70c0e7ba46..5bfa814c4a 100644 Binary files a/docs/static/screenshots/Spline/multiple-series-using-overrides-light-800w.webp and b/docs/static/screenshots/Spline/multiple-series-using-overrides-light-800w.webp differ diff --git a/docs/static/screenshots/Spline/multiple-series-with-labels-dark-240w.webp b/docs/static/screenshots/Spline/multiple-series-with-labels-dark-240w.webp index 7b83fa3591..6e3ea0da41 100644 Binary files a/docs/static/screenshots/Spline/multiple-series-with-labels-dark-240w.webp and b/docs/static/screenshots/Spline/multiple-series-with-labels-dark-240w.webp differ diff --git a/docs/static/screenshots/Spline/multiple-series-with-labels-dark-400w.webp b/docs/static/screenshots/Spline/multiple-series-with-labels-dark-400w.webp index 03c1eb3271..872facbf4c 100644 Binary files a/docs/static/screenshots/Spline/multiple-series-with-labels-dark-400w.webp and b/docs/static/screenshots/Spline/multiple-series-with-labels-dark-400w.webp differ diff --git a/docs/static/screenshots/Spline/multiple-series-with-labels-dark-800w.webp b/docs/static/screenshots/Spline/multiple-series-with-labels-dark-800w.webp index 300c4cbe4a..647911f7ea 100644 Binary files a/docs/static/screenshots/Spline/multiple-series-with-labels-dark-800w.webp and b/docs/static/screenshots/Spline/multiple-series-with-labels-dark-800w.webp differ diff --git a/docs/static/screenshots/Spline/multiple-series-with-labels-light-240w.webp b/docs/static/screenshots/Spline/multiple-series-with-labels-light-240w.webp index 010ee67fa9..b854399d6f 100644 Binary files a/docs/static/screenshots/Spline/multiple-series-with-labels-light-240w.webp and b/docs/static/screenshots/Spline/multiple-series-with-labels-light-240w.webp differ diff --git a/docs/static/screenshots/Spline/multiple-series-with-labels-light-400w.webp b/docs/static/screenshots/Spline/multiple-series-with-labels-light-400w.webp index fdd329e046..1e3f22f72c 100644 Binary files a/docs/static/screenshots/Spline/multiple-series-with-labels-light-400w.webp and b/docs/static/screenshots/Spline/multiple-series-with-labels-light-400w.webp differ diff --git a/docs/static/screenshots/Spline/multiple-series-with-labels-light-800w.webp b/docs/static/screenshots/Spline/multiple-series-with-labels-light-800w.webp index 036b63aba8..e4cfc357f4 100644 Binary files a/docs/static/screenshots/Spline/multiple-series-with-labels-light-800w.webp and b/docs/static/screenshots/Spline/multiple-series-with-labels-light-800w.webp differ diff --git a/docs/static/screenshots/Spline/parallel-coordinates-brush-dark-240w.webp b/docs/static/screenshots/Spline/parallel-coordinates-brush-dark-240w.webp new file mode 100644 index 0000000000..89233afcaa Binary files /dev/null and b/docs/static/screenshots/Spline/parallel-coordinates-brush-dark-240w.webp differ diff --git a/docs/static/screenshots/Spline/parallel-coordinates-brush-dark-400w.webp b/docs/static/screenshots/Spline/parallel-coordinates-brush-dark-400w.webp new file mode 100644 index 0000000000..a8d7de305c Binary files /dev/null and b/docs/static/screenshots/Spline/parallel-coordinates-brush-dark-400w.webp differ diff --git a/docs/static/screenshots/Spline/parallel-coordinates-brush-dark-800w.webp b/docs/static/screenshots/Spline/parallel-coordinates-brush-dark-800w.webp new file mode 100644 index 0000000000..3ff2d6a83a Binary files /dev/null and b/docs/static/screenshots/Spline/parallel-coordinates-brush-dark-800w.webp differ diff --git a/docs/static/screenshots/Spline/parallel-coordinates-brush-light-240w.webp b/docs/static/screenshots/Spline/parallel-coordinates-brush-light-240w.webp new file mode 100644 index 0000000000..7d9509b5f6 Binary files /dev/null and b/docs/static/screenshots/Spline/parallel-coordinates-brush-light-240w.webp differ diff --git a/docs/static/screenshots/Spline/parallel-coordinates-brush-light-400w.webp b/docs/static/screenshots/Spline/parallel-coordinates-brush-light-400w.webp new file mode 100644 index 0000000000..9cc803d306 Binary files /dev/null and b/docs/static/screenshots/Spline/parallel-coordinates-brush-light-400w.webp differ diff --git a/docs/static/screenshots/Spline/parallel-coordinates-brush-light-800w.webp b/docs/static/screenshots/Spline/parallel-coordinates-brush-light-800w.webp new file mode 100644 index 0000000000..05efed9efe Binary files /dev/null and b/docs/static/screenshots/Spline/parallel-coordinates-brush-light-800w.webp differ diff --git a/docs/static/screenshots/Spline/parallel-coordinates-dark-240w.webp b/docs/static/screenshots/Spline/parallel-coordinates-dark-240w.webp new file mode 100644 index 0000000000..e1f1bcf82d Binary files /dev/null and b/docs/static/screenshots/Spline/parallel-coordinates-dark-240w.webp differ diff --git a/docs/static/screenshots/Spline/parallel-coordinates-dark-400w.webp b/docs/static/screenshots/Spline/parallel-coordinates-dark-400w.webp new file mode 100644 index 0000000000..74fc2ec478 Binary files /dev/null and b/docs/static/screenshots/Spline/parallel-coordinates-dark-400w.webp differ diff --git a/docs/static/screenshots/Spline/parallel-coordinates-dark-800w.webp b/docs/static/screenshots/Spline/parallel-coordinates-dark-800w.webp new file mode 100644 index 0000000000..bbed066991 Binary files /dev/null and b/docs/static/screenshots/Spline/parallel-coordinates-dark-800w.webp differ diff --git a/docs/static/screenshots/Spline/parallel-coordinates-faceted-dark-240w.webp b/docs/static/screenshots/Spline/parallel-coordinates-faceted-dark-240w.webp new file mode 100644 index 0000000000..3daca47b12 Binary files /dev/null and b/docs/static/screenshots/Spline/parallel-coordinates-faceted-dark-240w.webp differ diff --git a/docs/static/screenshots/Spline/parallel-coordinates-faceted-dark-400w.webp b/docs/static/screenshots/Spline/parallel-coordinates-faceted-dark-400w.webp new file mode 100644 index 0000000000..40ca268211 Binary files /dev/null and b/docs/static/screenshots/Spline/parallel-coordinates-faceted-dark-400w.webp differ diff --git a/docs/static/screenshots/Spline/parallel-coordinates-faceted-dark-800w.webp b/docs/static/screenshots/Spline/parallel-coordinates-faceted-dark-800w.webp new file mode 100644 index 0000000000..6030e4321d Binary files /dev/null and b/docs/static/screenshots/Spline/parallel-coordinates-faceted-dark-800w.webp differ diff --git a/docs/static/screenshots/Spline/parallel-coordinates-faceted-light-240w.webp b/docs/static/screenshots/Spline/parallel-coordinates-faceted-light-240w.webp new file mode 100644 index 0000000000..dc210b02ac Binary files /dev/null and b/docs/static/screenshots/Spline/parallel-coordinates-faceted-light-240w.webp differ diff --git a/docs/static/screenshots/Spline/parallel-coordinates-faceted-light-400w.webp b/docs/static/screenshots/Spline/parallel-coordinates-faceted-light-400w.webp new file mode 100644 index 0000000000..78dd148002 Binary files /dev/null and b/docs/static/screenshots/Spline/parallel-coordinates-faceted-light-400w.webp differ diff --git a/docs/static/screenshots/Spline/parallel-coordinates-faceted-light-800w.webp b/docs/static/screenshots/Spline/parallel-coordinates-faceted-light-800w.webp new file mode 100644 index 0000000000..5d9b7ea94e Binary files /dev/null and b/docs/static/screenshots/Spline/parallel-coordinates-faceted-light-800w.webp differ diff --git a/docs/static/screenshots/Spline/parallel-coordinates-light-240w.webp b/docs/static/screenshots/Spline/parallel-coordinates-light-240w.webp new file mode 100644 index 0000000000..686ceae5e5 Binary files /dev/null and b/docs/static/screenshots/Spline/parallel-coordinates-light-240w.webp differ diff --git a/docs/static/screenshots/Spline/parallel-coordinates-light-400w.webp b/docs/static/screenshots/Spline/parallel-coordinates-light-400w.webp new file mode 100644 index 0000000000..5178efbf9d Binary files /dev/null and b/docs/static/screenshots/Spline/parallel-coordinates-light-400w.webp differ diff --git a/docs/static/screenshots/Spline/parallel-coordinates-light-800w.webp b/docs/static/screenshots/Spline/parallel-coordinates-light-800w.webp new file mode 100644 index 0000000000..66ede0f198 Binary files /dev/null and b/docs/static/screenshots/Spline/parallel-coordinates-light-800w.webp differ diff --git a/docs/static/screenshots/Spline/parallel-coordinates-mixed-dark-240w.webp b/docs/static/screenshots/Spline/parallel-coordinates-mixed-dark-240w.webp new file mode 100644 index 0000000000..f24add638f Binary files /dev/null and b/docs/static/screenshots/Spline/parallel-coordinates-mixed-dark-240w.webp differ diff --git a/docs/static/screenshots/Spline/parallel-coordinates-mixed-dark-400w.webp b/docs/static/screenshots/Spline/parallel-coordinates-mixed-dark-400w.webp new file mode 100644 index 0000000000..96b44f5d6d Binary files /dev/null and b/docs/static/screenshots/Spline/parallel-coordinates-mixed-dark-400w.webp differ diff --git a/docs/static/screenshots/Spline/parallel-coordinates-mixed-dark-800w.webp b/docs/static/screenshots/Spline/parallel-coordinates-mixed-dark-800w.webp new file mode 100644 index 0000000000..59865c321e Binary files /dev/null and b/docs/static/screenshots/Spline/parallel-coordinates-mixed-dark-800w.webp differ diff --git a/docs/static/screenshots/Spline/parallel-coordinates-mixed-light-240w.webp b/docs/static/screenshots/Spline/parallel-coordinates-mixed-light-240w.webp new file mode 100644 index 0000000000..9214306910 Binary files /dev/null and b/docs/static/screenshots/Spline/parallel-coordinates-mixed-light-240w.webp differ diff --git a/docs/static/screenshots/Spline/parallel-coordinates-mixed-light-400w.webp b/docs/static/screenshots/Spline/parallel-coordinates-mixed-light-400w.webp new file mode 100644 index 0000000000..cc975d519f Binary files /dev/null and b/docs/static/screenshots/Spline/parallel-coordinates-mixed-light-400w.webp differ diff --git a/docs/static/screenshots/Spline/parallel-coordinates-mixed-light-800w.webp b/docs/static/screenshots/Spline/parallel-coordinates-mixed-light-800w.webp new file mode 100644 index 0000000000..165e9e671a Binary files /dev/null and b/docs/static/screenshots/Spline/parallel-coordinates-mixed-light-800w.webp differ diff --git a/docs/static/screenshots/Spline/playground-dark-800w.webp b/docs/static/screenshots/Spline/playground-dark-800w.webp index b4ba038d44..36a85757ad 100644 Binary files a/docs/static/screenshots/Spline/playground-dark-800w.webp and b/docs/static/screenshots/Spline/playground-dark-800w.webp differ diff --git a/docs/static/screenshots/Spline/radial-line-with-areas-dark-240w.webp b/docs/static/screenshots/Spline/radial-line-with-areas-dark-240w.webp index 64adee0a3e..d036752093 100644 Binary files a/docs/static/screenshots/Spline/radial-line-with-areas-dark-240w.webp and b/docs/static/screenshots/Spline/radial-line-with-areas-dark-240w.webp differ diff --git a/docs/static/screenshots/Spline/radial-line-with-areas-dark-400w.webp b/docs/static/screenshots/Spline/radial-line-with-areas-dark-400w.webp index 987f117e70..cc9c1c4303 100644 Binary files a/docs/static/screenshots/Spline/radial-line-with-areas-dark-400w.webp and b/docs/static/screenshots/Spline/radial-line-with-areas-dark-400w.webp differ diff --git a/docs/static/screenshots/Spline/radial-line-with-areas-dark-800w.webp b/docs/static/screenshots/Spline/radial-line-with-areas-dark-800w.webp index 0c9308b0ec..bf6515e259 100644 Binary files a/docs/static/screenshots/Spline/radial-line-with-areas-dark-800w.webp and b/docs/static/screenshots/Spline/radial-line-with-areas-dark-800w.webp differ diff --git a/docs/static/screenshots/Spline/radial-line-with-areas-light-240w.webp b/docs/static/screenshots/Spline/radial-line-with-areas-light-240w.webp index 160b331942..6d81c4ead0 100644 Binary files a/docs/static/screenshots/Spline/radial-line-with-areas-light-240w.webp and b/docs/static/screenshots/Spline/radial-line-with-areas-light-240w.webp differ diff --git a/docs/static/screenshots/Spline/radial-line-with-areas-light-400w.webp b/docs/static/screenshots/Spline/radial-line-with-areas-light-400w.webp index e3662b1f8a..b0f9277a16 100644 Binary files a/docs/static/screenshots/Spline/radial-line-with-areas-light-400w.webp and b/docs/static/screenshots/Spline/radial-line-with-areas-light-400w.webp differ diff --git a/docs/static/screenshots/Spline/radial-line-with-areas-light-800w.webp b/docs/static/screenshots/Spline/radial-line-with-areas-light-800w.webp index e2310ea098..0cbbf901ae 100644 Binary files a/docs/static/screenshots/Spline/radial-line-with-areas-light-800w.webp and b/docs/static/screenshots/Spline/radial-line-with-areas-light-800w.webp differ diff --git a/docs/static/screenshots/Spline/radial-multi-year-lines-dark-240w.webp b/docs/static/screenshots/Spline/radial-multi-year-lines-dark-240w.webp index 0c35837490..c8a5dcfc9f 100644 Binary files a/docs/static/screenshots/Spline/radial-multi-year-lines-dark-240w.webp and b/docs/static/screenshots/Spline/radial-multi-year-lines-dark-240w.webp differ diff --git a/docs/static/screenshots/Spline/radial-multi-year-lines-dark-400w.webp b/docs/static/screenshots/Spline/radial-multi-year-lines-dark-400w.webp index 79f78c4fa1..9b72965824 100644 Binary files a/docs/static/screenshots/Spline/radial-multi-year-lines-dark-400w.webp and b/docs/static/screenshots/Spline/radial-multi-year-lines-dark-400w.webp differ diff --git a/docs/static/screenshots/Spline/radial-multi-year-lines-dark-800w.webp b/docs/static/screenshots/Spline/radial-multi-year-lines-dark-800w.webp index f81fbfac1f..028b4b77cb 100644 Binary files a/docs/static/screenshots/Spline/radial-multi-year-lines-dark-800w.webp and b/docs/static/screenshots/Spline/radial-multi-year-lines-dark-800w.webp differ diff --git a/docs/static/screenshots/Spline/radial-multi-year-lines-light-240w.webp b/docs/static/screenshots/Spline/radial-multi-year-lines-light-240w.webp index 841b1cd507..2ce323473e 100644 Binary files a/docs/static/screenshots/Spline/radial-multi-year-lines-light-240w.webp and b/docs/static/screenshots/Spline/radial-multi-year-lines-light-240w.webp differ diff --git a/docs/static/screenshots/Spline/radial-multi-year-lines-light-400w.webp b/docs/static/screenshots/Spline/radial-multi-year-lines-light-400w.webp index a079eb7348..0096e46556 100644 Binary files a/docs/static/screenshots/Spline/radial-multi-year-lines-light-400w.webp and b/docs/static/screenshots/Spline/radial-multi-year-lines-light-400w.webp differ diff --git a/docs/static/screenshots/Spline/radial-multi-year-lines-light-800w.webp b/docs/static/screenshots/Spline/radial-multi-year-lines-light-800w.webp index ada1ea630a..523947447c 100644 Binary files a/docs/static/screenshots/Spline/radial-multi-year-lines-light-800w.webp and b/docs/static/screenshots/Spline/radial-multi-year-lines-light-800w.webp differ diff --git a/docs/static/screenshots/Spline/radial-radar-dark-400w.webp b/docs/static/screenshots/Spline/radial-radar-dark-400w.webp index 089bf1f0ad..146e5e341d 100644 Binary files a/docs/static/screenshots/Spline/radial-radar-dark-400w.webp and b/docs/static/screenshots/Spline/radial-radar-dark-400w.webp differ diff --git a/docs/static/screenshots/Spline/radial-radar-dark-800w.webp b/docs/static/screenshots/Spline/radial-radar-dark-800w.webp index c3dd93d704..ce413ffac5 100644 Binary files a/docs/static/screenshots/Spline/radial-radar-dark-800w.webp and b/docs/static/screenshots/Spline/radial-radar-dark-800w.webp differ diff --git a/docs/static/screenshots/Spline/radial-radar-light-800w.webp b/docs/static/screenshots/Spline/radial-radar-light-800w.webp index afbfdbe957..9c68201de4 100644 Binary files a/docs/static/screenshots/Spline/radial-radar-light-800w.webp and b/docs/static/screenshots/Spline/radial-radar-light-800w.webp differ diff --git a/docs/static/screenshots/Spline/stroke-grouping-dark-800w.webp b/docs/static/screenshots/Spline/stroke-grouping-dark-800w.webp index 86810ebab8..332536f19c 100644 Binary files a/docs/static/screenshots/Spline/stroke-grouping-dark-800w.webp and b/docs/static/screenshots/Spline/stroke-grouping-dark-800w.webp differ diff --git a/docs/static/screenshots/Spline/stroke-grouping-with-legend-dark-240w.webp b/docs/static/screenshots/Spline/stroke-grouping-with-legend-dark-240w.webp new file mode 100644 index 0000000000..5ffca6b98f Binary files /dev/null and b/docs/static/screenshots/Spline/stroke-grouping-with-legend-dark-240w.webp differ diff --git a/docs/static/screenshots/Spline/stroke-grouping-with-legend-dark-400w.webp b/docs/static/screenshots/Spline/stroke-grouping-with-legend-dark-400w.webp new file mode 100644 index 0000000000..8d4d108b7c Binary files /dev/null and b/docs/static/screenshots/Spline/stroke-grouping-with-legend-dark-400w.webp differ diff --git a/docs/static/screenshots/Spline/stroke-grouping-with-legend-dark-800w.webp b/docs/static/screenshots/Spline/stroke-grouping-with-legend-dark-800w.webp new file mode 100644 index 0000000000..5425f0e424 Binary files /dev/null and b/docs/static/screenshots/Spline/stroke-grouping-with-legend-dark-800w.webp differ diff --git a/docs/static/screenshots/Spline/stroke-grouping-with-legend-light-240w.webp b/docs/static/screenshots/Spline/stroke-grouping-with-legend-light-240w.webp new file mode 100644 index 0000000000..a273c12608 Binary files /dev/null and b/docs/static/screenshots/Spline/stroke-grouping-with-legend-light-240w.webp differ diff --git a/docs/static/screenshots/Spline/stroke-grouping-with-legend-light-400w.webp b/docs/static/screenshots/Spline/stroke-grouping-with-legend-light-400w.webp new file mode 100644 index 0000000000..f63ff72cb0 Binary files /dev/null and b/docs/static/screenshots/Spline/stroke-grouping-with-legend-light-400w.webp differ diff --git a/docs/static/screenshots/Spline/stroke-grouping-with-legend-light-800w.webp b/docs/static/screenshots/Spline/stroke-grouping-with-legend-light-800w.webp new file mode 100644 index 0000000000..0587b966ac Binary files /dev/null and b/docs/static/screenshots/Spline/stroke-grouping-with-legend-light-800w.webp differ diff --git a/docs/static/screenshots/Spline/tween-on-mount-dark-240w.webp b/docs/static/screenshots/Spline/tween-on-mount-dark-240w.webp index bc0fa642f4..ea64d7d352 100644 Binary files a/docs/static/screenshots/Spline/tween-on-mount-dark-240w.webp and b/docs/static/screenshots/Spline/tween-on-mount-dark-240w.webp differ diff --git a/docs/static/screenshots/Spline/tween-on-mount-dark-400w.webp b/docs/static/screenshots/Spline/tween-on-mount-dark-400w.webp index f9f108faa6..42b28452f4 100644 Binary files a/docs/static/screenshots/Spline/tween-on-mount-dark-400w.webp and b/docs/static/screenshots/Spline/tween-on-mount-dark-400w.webp differ diff --git a/docs/static/screenshots/Spline/tween-on-mount-dark-800w.webp b/docs/static/screenshots/Spline/tween-on-mount-dark-800w.webp index 79c37abf55..20204860c0 100644 Binary files a/docs/static/screenshots/Spline/tween-on-mount-dark-800w.webp and b/docs/static/screenshots/Spline/tween-on-mount-dark-800w.webp differ diff --git a/docs/static/screenshots/Spline/tween-on-mount-light-240w.webp b/docs/static/screenshots/Spline/tween-on-mount-light-240w.webp index 9002ae2e34..573fd70620 100644 Binary files a/docs/static/screenshots/Spline/tween-on-mount-light-240w.webp and b/docs/static/screenshots/Spline/tween-on-mount-light-240w.webp differ diff --git a/docs/static/screenshots/Spline/tween-on-mount-light-400w.webp b/docs/static/screenshots/Spline/tween-on-mount-light-400w.webp index fb7e6ba232..82c065820f 100644 Binary files a/docs/static/screenshots/Spline/tween-on-mount-light-400w.webp and b/docs/static/screenshots/Spline/tween-on-mount-light-400w.webp differ diff --git a/docs/static/screenshots/Spline/tween-on-mount-light-800w.webp b/docs/static/screenshots/Spline/tween-on-mount-light-800w.webp index b77340a310..975b9ea84a 100644 Binary files a/docs/static/screenshots/Spline/tween-on-mount-light-800w.webp and b/docs/static/screenshots/Spline/tween-on-mount-light-800w.webp differ diff --git a/docs/static/screenshots/Spline/tweened-dark-800w.webp b/docs/static/screenshots/Spline/tweened-dark-800w.webp index b4ba038d44..36a85757ad 100644 Binary files a/docs/static/screenshots/Spline/tweened-dark-800w.webp and b/docs/static/screenshots/Spline/tweened-dark-800w.webp differ diff --git a/docs/static/screenshots/Spline/vertical-dark-240w.webp b/docs/static/screenshots/Spline/vertical-dark-240w.webp index 3287e6b32b..5ad09961c8 100644 Binary files a/docs/static/screenshots/Spline/vertical-dark-240w.webp and b/docs/static/screenshots/Spline/vertical-dark-240w.webp differ diff --git a/docs/static/screenshots/Spline/vertical-dark-400w.webp b/docs/static/screenshots/Spline/vertical-dark-400w.webp index 118d0c3fe6..e529d37657 100644 Binary files a/docs/static/screenshots/Spline/vertical-dark-400w.webp and b/docs/static/screenshots/Spline/vertical-dark-400w.webp differ diff --git a/docs/static/screenshots/Spline/vertical-dark-800w.webp b/docs/static/screenshots/Spline/vertical-dark-800w.webp index 118d0c3fe6..e529d37657 100644 Binary files a/docs/static/screenshots/Spline/vertical-dark-800w.webp and b/docs/static/screenshots/Spline/vertical-dark-800w.webp differ diff --git a/docs/static/screenshots/Spline/vertical-light-240w.webp b/docs/static/screenshots/Spline/vertical-light-240w.webp index 17d1327183..f813314857 100644 Binary files a/docs/static/screenshots/Spline/vertical-light-240w.webp and b/docs/static/screenshots/Spline/vertical-light-240w.webp differ diff --git a/docs/static/screenshots/Spline/vertical-light-400w.webp b/docs/static/screenshots/Spline/vertical-light-400w.webp index 949ac48233..79d25ad0c1 100644 Binary files a/docs/static/screenshots/Spline/vertical-light-400w.webp and b/docs/static/screenshots/Spline/vertical-light-400w.webp differ diff --git a/docs/static/screenshots/Spline/vertical-light-800w.webp b/docs/static/screenshots/Spline/vertical-light-800w.webp index 949ac48233..79d25ad0c1 100644 Binary files a/docs/static/screenshots/Spline/vertical-light-800w.webp and b/docs/static/screenshots/Spline/vertical-light-800w.webp differ diff --git a/docs/static/screenshots/Spline/with-labels-dark-240w.webp b/docs/static/screenshots/Spline/with-labels-dark-240w.webp index 3732e5a75e..9f7ebb1595 100644 Binary files a/docs/static/screenshots/Spline/with-labels-dark-240w.webp and b/docs/static/screenshots/Spline/with-labels-dark-240w.webp differ diff --git a/docs/static/screenshots/Spline/with-labels-dark-400w.webp b/docs/static/screenshots/Spline/with-labels-dark-400w.webp index fe166c1520..3c9c8b0bf4 100644 Binary files a/docs/static/screenshots/Spline/with-labels-dark-400w.webp and b/docs/static/screenshots/Spline/with-labels-dark-400w.webp differ diff --git a/docs/static/screenshots/Spline/with-labels-dark-800w.webp b/docs/static/screenshots/Spline/with-labels-dark-800w.webp index 399b5f8856..9892bebbe3 100644 Binary files a/docs/static/screenshots/Spline/with-labels-dark-800w.webp and b/docs/static/screenshots/Spline/with-labels-dark-800w.webp differ diff --git a/docs/static/screenshots/Spline/with-labels-light-240w.webp b/docs/static/screenshots/Spline/with-labels-light-240w.webp index 3f942fc2ff..a79c2a963d 100644 Binary files a/docs/static/screenshots/Spline/with-labels-light-240w.webp and b/docs/static/screenshots/Spline/with-labels-light-240w.webp differ diff --git a/docs/static/screenshots/Spline/with-labels-light-400w.webp b/docs/static/screenshots/Spline/with-labels-light-400w.webp index 17e4ea20df..d1099b9b27 100644 Binary files a/docs/static/screenshots/Spline/with-labels-light-400w.webp and b/docs/static/screenshots/Spline/with-labels-light-400w.webp differ diff --git a/docs/static/screenshots/Spline/with-labels-light-800w.webp b/docs/static/screenshots/Spline/with-labels-light-800w.webp index 27d3920807..3c39d8c2d8 100644 Binary files a/docs/static/screenshots/Spline/with-labels-light-800w.webp and b/docs/static/screenshots/Spline/with-labels-light-800w.webp differ diff --git a/docs/static/screenshots/Spline/with-tooltip-and-highlight-dark-240w.webp b/docs/static/screenshots/Spline/with-tooltip-and-highlight-dark-240w.webp index 9ca4dfa1a7..21e8c3a6d5 100644 Binary files a/docs/static/screenshots/Spline/with-tooltip-and-highlight-dark-240w.webp and b/docs/static/screenshots/Spline/with-tooltip-and-highlight-dark-240w.webp differ diff --git a/docs/static/screenshots/Spline/with-tooltip-and-highlight-dark-400w.webp b/docs/static/screenshots/Spline/with-tooltip-and-highlight-dark-400w.webp index 61afcd27a8..4fb99d80d5 100644 Binary files a/docs/static/screenshots/Spline/with-tooltip-and-highlight-dark-400w.webp and b/docs/static/screenshots/Spline/with-tooltip-and-highlight-dark-400w.webp differ diff --git a/docs/static/screenshots/Spline/with-tooltip-and-highlight-dark-800w.webp b/docs/static/screenshots/Spline/with-tooltip-and-highlight-dark-800w.webp index a800351380..5dcb21a67a 100644 Binary files a/docs/static/screenshots/Spline/with-tooltip-and-highlight-dark-800w.webp and b/docs/static/screenshots/Spline/with-tooltip-and-highlight-dark-800w.webp differ diff --git a/docs/static/screenshots/Spline/with-tooltip-and-highlight-light-240w.webp b/docs/static/screenshots/Spline/with-tooltip-and-highlight-light-240w.webp index d9d87cb839..a4dfd16e4d 100644 Binary files a/docs/static/screenshots/Spline/with-tooltip-and-highlight-light-240w.webp and b/docs/static/screenshots/Spline/with-tooltip-and-highlight-light-240w.webp differ diff --git a/docs/static/screenshots/Spline/with-tooltip-and-highlight-light-400w.webp b/docs/static/screenshots/Spline/with-tooltip-and-highlight-light-400w.webp index d0670ece78..79655154a1 100644 Binary files a/docs/static/screenshots/Spline/with-tooltip-and-highlight-light-400w.webp and b/docs/static/screenshots/Spline/with-tooltip-and-highlight-light-400w.webp differ diff --git a/docs/static/screenshots/Spline/with-tooltip-and-highlight-light-800w.webp b/docs/static/screenshots/Spline/with-tooltip-and-highlight-light-800w.webp index 6074fa8d32..313850cc18 100644 Binary files a/docs/static/screenshots/Spline/with-tooltip-and-highlight-light-800w.webp and b/docs/static/screenshots/Spline/with-tooltip-and-highlight-light-800w.webp differ diff --git a/docs/static/screenshots/Text/color-via-ordinal-scale-dark-400w.webp b/docs/static/screenshots/Text/color-via-ordinal-scale-dark-400w.webp index ab9e1ff79e..8479b51e26 100644 Binary files a/docs/static/screenshots/Text/color-via-ordinal-scale-dark-400w.webp and b/docs/static/screenshots/Text/color-via-ordinal-scale-dark-400w.webp differ diff --git a/docs/static/screenshots/Text/color-via-ordinal-scale-dark-800w.webp b/docs/static/screenshots/Text/color-via-ordinal-scale-dark-800w.webp index 2dcd5f43d0..99c2a75425 100644 Binary files a/docs/static/screenshots/Text/color-via-ordinal-scale-dark-800w.webp and b/docs/static/screenshots/Text/color-via-ordinal-scale-dark-800w.webp differ diff --git a/docs/static/screenshots/Text/color-via-ordinal-scale-light-400w.webp b/docs/static/screenshots/Text/color-via-ordinal-scale-light-400w.webp index 937a7bf866..bda5edd9c6 100644 Binary files a/docs/static/screenshots/Text/color-via-ordinal-scale-light-400w.webp and b/docs/static/screenshots/Text/color-via-ordinal-scale-light-400w.webp differ diff --git a/docs/static/screenshots/Text/color-via-ordinal-scale-light-800w.webp b/docs/static/screenshots/Text/color-via-ordinal-scale-light-800w.webp index 20b2477436..995d80553e 100644 Binary files a/docs/static/screenshots/Text/color-via-ordinal-scale-light-800w.webp and b/docs/static/screenshots/Text/color-via-ordinal-scale-light-800w.webp differ diff --git a/docs/static/screenshots/Text/color-via-threshold-scale-dark-800w.webp b/docs/static/screenshots/Text/color-via-threshold-scale-dark-800w.webp index 8fc6568e28..b1b38f5b94 100644 Binary files a/docs/static/screenshots/Text/color-via-threshold-scale-dark-800w.webp and b/docs/static/screenshots/Text/color-via-threshold-scale-dark-800w.webp differ diff --git a/docs/static/screenshots/Text/color-via-threshold-scale-light-400w.webp b/docs/static/screenshots/Text/color-via-threshold-scale-light-400w.webp index 7b622e770c..9b0104a8ba 100644 Binary files a/docs/static/screenshots/Text/color-via-threshold-scale-light-400w.webp and b/docs/static/screenshots/Text/color-via-threshold-scale-light-400w.webp differ diff --git a/docs/static/screenshots/Text/color-via-threshold-scale-light-800w.webp b/docs/static/screenshots/Text/color-via-threshold-scale-light-800w.webp index d12398a497..e5877ac999 100644 Binary files a/docs/static/screenshots/Text/color-via-threshold-scale-light-800w.webp and b/docs/static/screenshots/Text/color-via-threshold-scale-light-800w.webp differ diff --git a/docs/static/screenshots/Text/data-mode-dark-240w.webp b/docs/static/screenshots/Text/data-mode-dark-240w.webp index f95aa10bcc..98ea1f26ae 100644 Binary files a/docs/static/screenshots/Text/data-mode-dark-240w.webp and b/docs/static/screenshots/Text/data-mode-dark-240w.webp differ diff --git a/docs/static/screenshots/Text/data-mode-dark-400w.webp b/docs/static/screenshots/Text/data-mode-dark-400w.webp index ca44320c2e..148077c8cb 100644 Binary files a/docs/static/screenshots/Text/data-mode-dark-400w.webp and b/docs/static/screenshots/Text/data-mode-dark-400w.webp differ diff --git a/docs/static/screenshots/Text/data-mode-dark-800w.webp b/docs/static/screenshots/Text/data-mode-dark-800w.webp index 302bf29f38..ada63d18f7 100644 Binary files a/docs/static/screenshots/Text/data-mode-dark-800w.webp and b/docs/static/screenshots/Text/data-mode-dark-800w.webp differ diff --git a/docs/static/screenshots/Text/data-mode-light-400w.webp b/docs/static/screenshots/Text/data-mode-light-400w.webp index 1970027516..5c3080ed97 100644 Binary files a/docs/static/screenshots/Text/data-mode-light-400w.webp and b/docs/static/screenshots/Text/data-mode-light-400w.webp differ diff --git a/docs/static/screenshots/Text/data-mode-light-800w.webp b/docs/static/screenshots/Text/data-mode-light-800w.webp index f2c1d0b74f..3ab329f608 100644 Binary files a/docs/static/screenshots/Text/data-mode-light-800w.webp and b/docs/static/screenshots/Text/data-mode-light-800w.webp differ diff --git a/docs/static/screenshots/Text/playground-dark-800w.webp b/docs/static/screenshots/Text/playground-dark-800w.webp index ebf7263d3d..0e053b3e66 100644 Binary files a/docs/static/screenshots/Text/playground-dark-800w.webp and b/docs/static/screenshots/Text/playground-dark-800w.webp differ diff --git a/docs/static/screenshots/Text/playground-light-240w.webp b/docs/static/screenshots/Text/playground-light-240w.webp index 4d14bacf29..d41b06df70 100644 Binary files a/docs/static/screenshots/Text/playground-light-240w.webp and b/docs/static/screenshots/Text/playground-light-240w.webp differ diff --git a/docs/static/screenshots/Text/playground-light-400w.webp b/docs/static/screenshots/Text/playground-light-400w.webp index 46f56eb0a3..14b6358a54 100644 Binary files a/docs/static/screenshots/Text/playground-light-400w.webp and b/docs/static/screenshots/Text/playground-light-400w.webp differ diff --git a/docs/static/screenshots/Text/playground-light-800w.webp b/docs/static/screenshots/Text/playground-light-800w.webp index 10a5f7f362..2ba1b5e4b7 100644 Binary files a/docs/static/screenshots/Text/playground-light-800w.webp and b/docs/static/screenshots/Text/playground-light-800w.webp differ diff --git a/docs/static/screenshots/Text/segments-dark-400w.webp b/docs/static/screenshots/Text/segments-dark-400w.webp index 586502691f..0a081aeb4b 100644 Binary files a/docs/static/screenshots/Text/segments-dark-400w.webp and b/docs/static/screenshots/Text/segments-dark-400w.webp differ diff --git a/docs/static/screenshots/Text/segments-dark-800w.webp b/docs/static/screenshots/Text/segments-dark-800w.webp index b254cf8eb3..8d43a757e8 100644 Binary files a/docs/static/screenshots/Text/segments-dark-800w.webp and b/docs/static/screenshots/Text/segments-dark-800w.webp differ diff --git a/docs/static/screenshots/Text/segments-light-800w.webp b/docs/static/screenshots/Text/segments-light-800w.webp index 4bbfbd3e47..ce3ea590fc 100644 Binary files a/docs/static/screenshots/Text/segments-light-800w.webp and b/docs/static/screenshots/Text/segments-light-800w.webp differ diff --git a/docs/static/screenshots/Text/truncate-axis-labels-dark-800w.webp b/docs/static/screenshots/Text/truncate-axis-labels-dark-800w.webp index 34998d8ae7..d43ac12ee3 100644 Binary files a/docs/static/screenshots/Text/truncate-axis-labels-dark-800w.webp and b/docs/static/screenshots/Text/truncate-axis-labels-dark-800w.webp differ diff --git a/docs/static/screenshots/Text/word-wrap-with-explicit-newline-dark-240w.webp b/docs/static/screenshots/Text/word-wrap-with-explicit-newline-dark-240w.webp index 68f8da2201..a7b2f2ab5c 100644 Binary files a/docs/static/screenshots/Text/word-wrap-with-explicit-newline-dark-240w.webp and b/docs/static/screenshots/Text/word-wrap-with-explicit-newline-dark-240w.webp differ diff --git a/docs/static/screenshots/Text/word-wrap-with-explicit-newline-dark-400w.webp b/docs/static/screenshots/Text/word-wrap-with-explicit-newline-dark-400w.webp index 23f3b18217..c3f762b1ae 100644 Binary files a/docs/static/screenshots/Text/word-wrap-with-explicit-newline-dark-400w.webp and b/docs/static/screenshots/Text/word-wrap-with-explicit-newline-dark-400w.webp differ diff --git a/docs/static/screenshots/Text/word-wrap-with-explicit-newline-dark-800w.webp b/docs/static/screenshots/Text/word-wrap-with-explicit-newline-dark-800w.webp index a0c0412ad6..a151af8f9e 100644 Binary files a/docs/static/screenshots/Text/word-wrap-with-explicit-newline-dark-800w.webp and b/docs/static/screenshots/Text/word-wrap-with-explicit-newline-dark-800w.webp differ diff --git a/docs/static/screenshots/Text/word-wrap-with-explicit-newline-light-240w.webp b/docs/static/screenshots/Text/word-wrap-with-explicit-newline-light-240w.webp index df1ac8d151..f549eb8b97 100644 Binary files a/docs/static/screenshots/Text/word-wrap-with-explicit-newline-light-240w.webp and b/docs/static/screenshots/Text/word-wrap-with-explicit-newline-light-240w.webp differ diff --git a/docs/static/screenshots/Text/word-wrap-with-explicit-newline-light-800w.webp b/docs/static/screenshots/Text/word-wrap-with-explicit-newline-light-800w.webp index 01f10ba761..7e267851d4 100644 Binary files a/docs/static/screenshots/Text/word-wrap-with-explicit-newline-light-800w.webp and b/docs/static/screenshots/Text/word-wrap-with-explicit-newline-light-800w.webp differ diff --git a/docs/static/screenshots/Threshold/basic-dark-240w.webp b/docs/static/screenshots/Threshold/basic-dark-240w.webp index fc940cce7f..fa3ed5814a 100644 Binary files a/docs/static/screenshots/Threshold/basic-dark-240w.webp and b/docs/static/screenshots/Threshold/basic-dark-240w.webp differ diff --git a/docs/static/screenshots/Threshold/basic-dark-400w.webp b/docs/static/screenshots/Threshold/basic-dark-400w.webp index 774d8d22db..9c94cbfefe 100644 Binary files a/docs/static/screenshots/Threshold/basic-dark-400w.webp and b/docs/static/screenshots/Threshold/basic-dark-400w.webp differ diff --git a/docs/static/screenshots/Threshold/basic-dark-800w.webp b/docs/static/screenshots/Threshold/basic-dark-800w.webp index b1a1b94d15..7382f22483 100644 Binary files a/docs/static/screenshots/Threshold/basic-dark-800w.webp and b/docs/static/screenshots/Threshold/basic-dark-800w.webp differ diff --git a/docs/static/screenshots/Threshold/basic-light-240w.webp b/docs/static/screenshots/Threshold/basic-light-240w.webp index 2e7b1aaede..4cdd8ba7cd 100644 Binary files a/docs/static/screenshots/Threshold/basic-light-240w.webp and b/docs/static/screenshots/Threshold/basic-light-240w.webp differ diff --git a/docs/static/screenshots/Threshold/basic-light-400w.webp b/docs/static/screenshots/Threshold/basic-light-400w.webp index 4cfd91bb44..188e9b6134 100644 Binary files a/docs/static/screenshots/Threshold/basic-light-400w.webp and b/docs/static/screenshots/Threshold/basic-light-400w.webp differ diff --git a/docs/static/screenshots/Threshold/basic-light-800w.webp b/docs/static/screenshots/Threshold/basic-light-800w.webp index 01f5955cbb..ad53307067 100644 Binary files a/docs/static/screenshots/Threshold/basic-light-800w.webp and b/docs/static/screenshots/Threshold/basic-light-800w.webp differ diff --git a/docs/static/screenshots/Threshold/with-labels-dark-240w.webp b/docs/static/screenshots/Threshold/with-labels-dark-240w.webp index de3d8cfb05..58d545f68e 100644 Binary files a/docs/static/screenshots/Threshold/with-labels-dark-240w.webp and b/docs/static/screenshots/Threshold/with-labels-dark-240w.webp differ diff --git a/docs/static/screenshots/Threshold/with-labels-dark-400w.webp b/docs/static/screenshots/Threshold/with-labels-dark-400w.webp index b3836bcdf9..bf546c5087 100644 Binary files a/docs/static/screenshots/Threshold/with-labels-dark-400w.webp and b/docs/static/screenshots/Threshold/with-labels-dark-400w.webp differ diff --git a/docs/static/screenshots/Threshold/with-labels-dark-800w.webp b/docs/static/screenshots/Threshold/with-labels-dark-800w.webp index 2116d7a513..b64f27facb 100644 Binary files a/docs/static/screenshots/Threshold/with-labels-dark-800w.webp and b/docs/static/screenshots/Threshold/with-labels-dark-800w.webp differ diff --git a/docs/static/screenshots/Threshold/with-labels-light-240w.webp b/docs/static/screenshots/Threshold/with-labels-light-240w.webp index 57974e3915..2a69499265 100644 Binary files a/docs/static/screenshots/Threshold/with-labels-light-240w.webp and b/docs/static/screenshots/Threshold/with-labels-light-240w.webp differ diff --git a/docs/static/screenshots/Threshold/with-labels-light-400w.webp b/docs/static/screenshots/Threshold/with-labels-light-400w.webp index 48ba985cb1..e8f7100142 100644 Binary files a/docs/static/screenshots/Threshold/with-labels-light-400w.webp and b/docs/static/screenshots/Threshold/with-labels-light-400w.webp differ diff --git a/docs/static/screenshots/Threshold/with-labels-light-800w.webp b/docs/static/screenshots/Threshold/with-labels-light-800w.webp index 31acafb0c7..b3a740a069 100644 Binary files a/docs/static/screenshots/Threshold/with-labels-light-800w.webp and b/docs/static/screenshots/Threshold/with-labels-light-800w.webp differ diff --git a/docs/static/screenshots/Threshold/with-tooltip-and-highlight-dark-240w.webp b/docs/static/screenshots/Threshold/with-tooltip-and-highlight-dark-240w.webp index 700225aef7..d167aa46f2 100644 Binary files a/docs/static/screenshots/Threshold/with-tooltip-and-highlight-dark-240w.webp and b/docs/static/screenshots/Threshold/with-tooltip-and-highlight-dark-240w.webp differ diff --git a/docs/static/screenshots/Threshold/with-tooltip-and-highlight-dark-400w.webp b/docs/static/screenshots/Threshold/with-tooltip-and-highlight-dark-400w.webp index 4dda62c8f3..1701bb8ea8 100644 Binary files a/docs/static/screenshots/Threshold/with-tooltip-and-highlight-dark-400w.webp and b/docs/static/screenshots/Threshold/with-tooltip-and-highlight-dark-400w.webp differ diff --git a/docs/static/screenshots/Threshold/with-tooltip-and-highlight-dark-800w.webp b/docs/static/screenshots/Threshold/with-tooltip-and-highlight-dark-800w.webp index 7a8aaf9f1f..ec1502b7e8 100644 Binary files a/docs/static/screenshots/Threshold/with-tooltip-and-highlight-dark-800w.webp and b/docs/static/screenshots/Threshold/with-tooltip-and-highlight-dark-800w.webp differ diff --git a/docs/static/screenshots/Threshold/with-tooltip-and-highlight-light-240w.webp b/docs/static/screenshots/Threshold/with-tooltip-and-highlight-light-240w.webp index bedff5b57a..9627ad4031 100644 Binary files a/docs/static/screenshots/Threshold/with-tooltip-and-highlight-light-240w.webp and b/docs/static/screenshots/Threshold/with-tooltip-and-highlight-light-240w.webp differ diff --git a/docs/static/screenshots/Threshold/with-tooltip-and-highlight-light-400w.webp b/docs/static/screenshots/Threshold/with-tooltip-and-highlight-light-400w.webp index 766ea0f182..afb0a63637 100644 Binary files a/docs/static/screenshots/Threshold/with-tooltip-and-highlight-light-400w.webp and b/docs/static/screenshots/Threshold/with-tooltip-and-highlight-light-400w.webp differ diff --git a/docs/static/screenshots/Threshold/with-tooltip-and-highlight-light-800w.webp b/docs/static/screenshots/Threshold/with-tooltip-and-highlight-light-800w.webp index 87d43c6e04..b25d43a324 100644 Binary files a/docs/static/screenshots/Threshold/with-tooltip-and-highlight-light-800w.webp and b/docs/static/screenshots/Threshold/with-tooltip-and-highlight-light-800w.webp differ diff --git a/docs/static/screenshots/Tooltip/anchor-location-dark-240w.webp b/docs/static/screenshots/Tooltip/anchor-location-dark-240w.webp index 8c98206244..6a9da900f0 100644 Binary files a/docs/static/screenshots/Tooltip/anchor-location-dark-240w.webp and b/docs/static/screenshots/Tooltip/anchor-location-dark-240w.webp differ diff --git a/docs/static/screenshots/Tooltip/anchor-location-dark-400w.webp b/docs/static/screenshots/Tooltip/anchor-location-dark-400w.webp index 211887aab2..252af7887c 100644 Binary files a/docs/static/screenshots/Tooltip/anchor-location-dark-400w.webp and b/docs/static/screenshots/Tooltip/anchor-location-dark-400w.webp differ diff --git a/docs/static/screenshots/Tooltip/anchor-location-dark-800w.webp b/docs/static/screenshots/Tooltip/anchor-location-dark-800w.webp index 4f989904a8..697393a44a 100644 Binary files a/docs/static/screenshots/Tooltip/anchor-location-dark-800w.webp and b/docs/static/screenshots/Tooltip/anchor-location-dark-800w.webp differ diff --git a/docs/static/screenshots/Tooltip/anchor-location-light-240w.webp b/docs/static/screenshots/Tooltip/anchor-location-light-240w.webp index 5fff5b84b7..56ec9d6f1b 100644 Binary files a/docs/static/screenshots/Tooltip/anchor-location-light-240w.webp and b/docs/static/screenshots/Tooltip/anchor-location-light-240w.webp differ diff --git a/docs/static/screenshots/Tooltip/anchor-location-light-400w.webp b/docs/static/screenshots/Tooltip/anchor-location-light-400w.webp index abdd0f842d..ef81ed108a 100644 Binary files a/docs/static/screenshots/Tooltip/anchor-location-light-400w.webp and b/docs/static/screenshots/Tooltip/anchor-location-light-400w.webp differ diff --git a/docs/static/screenshots/Tooltip/anchor-location-light-800w.webp b/docs/static/screenshots/Tooltip/anchor-location-light-800w.webp index 39fb3f1459..e510f11e63 100644 Binary files a/docs/static/screenshots/Tooltip/anchor-location-light-800w.webp and b/docs/static/screenshots/Tooltip/anchor-location-light-800w.webp differ diff --git a/docs/static/screenshots/Tooltip/area-dark-240w.webp b/docs/static/screenshots/Tooltip/area-dark-240w.webp index d035f34461..4d81e28774 100644 Binary files a/docs/static/screenshots/Tooltip/area-dark-240w.webp and b/docs/static/screenshots/Tooltip/area-dark-240w.webp differ diff --git a/docs/static/screenshots/Tooltip/area-dark-400w.webp b/docs/static/screenshots/Tooltip/area-dark-400w.webp index f208305488..8ed56388cc 100644 Binary files a/docs/static/screenshots/Tooltip/area-dark-400w.webp and b/docs/static/screenshots/Tooltip/area-dark-400w.webp differ diff --git a/docs/static/screenshots/Tooltip/area-dark-800w.webp b/docs/static/screenshots/Tooltip/area-dark-800w.webp index bac8194754..d8cbddff43 100644 Binary files a/docs/static/screenshots/Tooltip/area-dark-800w.webp and b/docs/static/screenshots/Tooltip/area-dark-800w.webp differ diff --git a/docs/static/screenshots/Tooltip/area-light-240w.webp b/docs/static/screenshots/Tooltip/area-light-240w.webp index a2759f69b9..9bc92da012 100644 Binary files a/docs/static/screenshots/Tooltip/area-light-240w.webp and b/docs/static/screenshots/Tooltip/area-light-240w.webp differ diff --git a/docs/static/screenshots/Tooltip/area-light-400w.webp b/docs/static/screenshots/Tooltip/area-light-400w.webp index b674a0271c..2e9b070d01 100644 Binary files a/docs/static/screenshots/Tooltip/area-light-400w.webp and b/docs/static/screenshots/Tooltip/area-light-400w.webp differ diff --git a/docs/static/screenshots/Tooltip/area-light-800w.webp b/docs/static/screenshots/Tooltip/area-light-800w.webp index fc5270634d..bd8f5ae00c 100644 Binary files a/docs/static/screenshots/Tooltip/area-light-800w.webp and b/docs/static/screenshots/Tooltip/area-light-800w.webp differ diff --git a/docs/static/screenshots/Tooltip/basic-dark-240w.webp b/docs/static/screenshots/Tooltip/basic-dark-240w.webp index 99d8833594..93c9146028 100644 Binary files a/docs/static/screenshots/Tooltip/basic-dark-240w.webp and b/docs/static/screenshots/Tooltip/basic-dark-240w.webp differ diff --git a/docs/static/screenshots/Tooltip/basic-dark-400w.webp b/docs/static/screenshots/Tooltip/basic-dark-400w.webp index 3734f513cf..6f46aa0644 100644 Binary files a/docs/static/screenshots/Tooltip/basic-dark-400w.webp and b/docs/static/screenshots/Tooltip/basic-dark-400w.webp differ diff --git a/docs/static/screenshots/Tooltip/basic-dark-800w.webp b/docs/static/screenshots/Tooltip/basic-dark-800w.webp index e24e001f80..5ba57538e7 100644 Binary files a/docs/static/screenshots/Tooltip/basic-dark-800w.webp and b/docs/static/screenshots/Tooltip/basic-dark-800w.webp differ diff --git a/docs/static/screenshots/Tooltip/basic-light-240w.webp b/docs/static/screenshots/Tooltip/basic-light-240w.webp index b482202054..e9251c28dc 100644 Binary files a/docs/static/screenshots/Tooltip/basic-light-240w.webp and b/docs/static/screenshots/Tooltip/basic-light-240w.webp differ diff --git a/docs/static/screenshots/Tooltip/basic-light-400w.webp b/docs/static/screenshots/Tooltip/basic-light-400w.webp index 7a92f17087..292c9b98de 100644 Binary files a/docs/static/screenshots/Tooltip/basic-light-400w.webp and b/docs/static/screenshots/Tooltip/basic-light-400w.webp differ diff --git a/docs/static/screenshots/Tooltip/basic-light-800w.webp b/docs/static/screenshots/Tooltip/basic-light-800w.webp index b72f283475..0806af8883 100644 Binary files a/docs/static/screenshots/Tooltip/basic-light-800w.webp and b/docs/static/screenshots/Tooltip/basic-light-800w.webp differ diff --git a/docs/static/screenshots/Tooltip/color-swatch-dark-240w.webp b/docs/static/screenshots/Tooltip/color-swatch-dark-240w.webp index 632ad9531e..11c244b03e 100644 Binary files a/docs/static/screenshots/Tooltip/color-swatch-dark-240w.webp and b/docs/static/screenshots/Tooltip/color-swatch-dark-240w.webp differ diff --git a/docs/static/screenshots/Tooltip/color-swatch-dark-400w.webp b/docs/static/screenshots/Tooltip/color-swatch-dark-400w.webp index 2f81b0b2ed..fc99514d93 100644 Binary files a/docs/static/screenshots/Tooltip/color-swatch-dark-400w.webp and b/docs/static/screenshots/Tooltip/color-swatch-dark-400w.webp differ diff --git a/docs/static/screenshots/Tooltip/color-swatch-dark-800w.webp b/docs/static/screenshots/Tooltip/color-swatch-dark-800w.webp index 54371849aa..babca9a18b 100644 Binary files a/docs/static/screenshots/Tooltip/color-swatch-dark-800w.webp and b/docs/static/screenshots/Tooltip/color-swatch-dark-800w.webp differ diff --git a/docs/static/screenshots/Tooltip/color-swatch-light-240w.webp b/docs/static/screenshots/Tooltip/color-swatch-light-240w.webp index db264c8d5b..7b752ee04b 100644 Binary files a/docs/static/screenshots/Tooltip/color-swatch-light-240w.webp and b/docs/static/screenshots/Tooltip/color-swatch-light-240w.webp differ diff --git a/docs/static/screenshots/Tooltip/color-swatch-light-400w.webp b/docs/static/screenshots/Tooltip/color-swatch-light-400w.webp index b16640fe03..a008d5f409 100644 Binary files a/docs/static/screenshots/Tooltip/color-swatch-light-400w.webp and b/docs/static/screenshots/Tooltip/color-swatch-light-400w.webp differ diff --git a/docs/static/screenshots/Tooltip/color-swatch-light-800w.webp b/docs/static/screenshots/Tooltip/color-swatch-light-800w.webp index 9ed4c2c44a..b55d24a2ea 100644 Binary files a/docs/static/screenshots/Tooltip/color-swatch-light-800w.webp and b/docs/static/screenshots/Tooltip/color-swatch-light-800w.webp differ diff --git a/docs/static/screenshots/Tooltip/color-swatch-using-theme-dark-240w.webp b/docs/static/screenshots/Tooltip/color-swatch-using-theme-dark-240w.webp index fbb6a73c59..ea8531a087 100644 Binary files a/docs/static/screenshots/Tooltip/color-swatch-using-theme-dark-240w.webp and b/docs/static/screenshots/Tooltip/color-swatch-using-theme-dark-240w.webp differ diff --git a/docs/static/screenshots/Tooltip/color-swatch-using-theme-dark-400w.webp b/docs/static/screenshots/Tooltip/color-swatch-using-theme-dark-400w.webp index 5f74261e97..282d6b7f60 100644 Binary files a/docs/static/screenshots/Tooltip/color-swatch-using-theme-dark-400w.webp and b/docs/static/screenshots/Tooltip/color-swatch-using-theme-dark-400w.webp differ diff --git a/docs/static/screenshots/Tooltip/color-swatch-using-theme-dark-800w.webp b/docs/static/screenshots/Tooltip/color-swatch-using-theme-dark-800w.webp index 8655883b97..7c0407b536 100644 Binary files a/docs/static/screenshots/Tooltip/color-swatch-using-theme-dark-800w.webp and b/docs/static/screenshots/Tooltip/color-swatch-using-theme-dark-800w.webp differ diff --git a/docs/static/screenshots/Tooltip/color-swatch-using-theme-light-240w.webp b/docs/static/screenshots/Tooltip/color-swatch-using-theme-light-240w.webp index 0a6af44157..d1080cc282 100644 Binary files a/docs/static/screenshots/Tooltip/color-swatch-using-theme-light-240w.webp and b/docs/static/screenshots/Tooltip/color-swatch-using-theme-light-240w.webp differ diff --git a/docs/static/screenshots/Tooltip/color-swatch-using-theme-light-400w.webp b/docs/static/screenshots/Tooltip/color-swatch-using-theme-light-400w.webp index 0c4d3784b9..a9d3214edc 100644 Binary files a/docs/static/screenshots/Tooltip/color-swatch-using-theme-light-400w.webp and b/docs/static/screenshots/Tooltip/color-swatch-using-theme-light-400w.webp differ diff --git a/docs/static/screenshots/Tooltip/color-swatch-using-theme-light-800w.webp b/docs/static/screenshots/Tooltip/color-swatch-using-theme-light-800w.webp index c3f1f39343..6a64493dfc 100644 Binary files a/docs/static/screenshots/Tooltip/color-swatch-using-theme-light-800w.webp and b/docs/static/screenshots/Tooltip/color-swatch-using-theme-light-800w.webp differ diff --git a/docs/static/screenshots/Tooltip/custom-content-dark-240w.webp b/docs/static/screenshots/Tooltip/custom-content-dark-240w.webp index 09af5f2218..3609ff18ec 100644 Binary files a/docs/static/screenshots/Tooltip/custom-content-dark-240w.webp and b/docs/static/screenshots/Tooltip/custom-content-dark-240w.webp differ diff --git a/docs/static/screenshots/Tooltip/custom-content-dark-400w.webp b/docs/static/screenshots/Tooltip/custom-content-dark-400w.webp index 0de661a045..dee1fa6ab3 100644 Binary files a/docs/static/screenshots/Tooltip/custom-content-dark-400w.webp and b/docs/static/screenshots/Tooltip/custom-content-dark-400w.webp differ diff --git a/docs/static/screenshots/Tooltip/custom-content-dark-800w.webp b/docs/static/screenshots/Tooltip/custom-content-dark-800w.webp index 576496d7ce..6098771a1f 100644 Binary files a/docs/static/screenshots/Tooltip/custom-content-dark-800w.webp and b/docs/static/screenshots/Tooltip/custom-content-dark-800w.webp differ diff --git a/docs/static/screenshots/Tooltip/custom-content-light-240w.webp b/docs/static/screenshots/Tooltip/custom-content-light-240w.webp index 29d506b3c4..f25d068c3e 100644 Binary files a/docs/static/screenshots/Tooltip/custom-content-light-240w.webp and b/docs/static/screenshots/Tooltip/custom-content-light-240w.webp differ diff --git a/docs/static/screenshots/Tooltip/custom-content-light-400w.webp b/docs/static/screenshots/Tooltip/custom-content-light-400w.webp index 78f03fa7d5..305a58518c 100644 Binary files a/docs/static/screenshots/Tooltip/custom-content-light-400w.webp and b/docs/static/screenshots/Tooltip/custom-content-light-400w.webp differ diff --git a/docs/static/screenshots/Tooltip/custom-content-light-800w.webp b/docs/static/screenshots/Tooltip/custom-content-light-800w.webp index 8b4ad6d853..ce6b47e3ac 100644 Binary files a/docs/static/screenshots/Tooltip/custom-content-light-800w.webp and b/docs/static/screenshots/Tooltip/custom-content-light-800w.webp differ diff --git a/docs/static/screenshots/Tooltip/data-snapping-dark-240w.webp b/docs/static/screenshots/Tooltip/data-snapping-dark-240w.webp index 4a16b1e277..c9502a3a1a 100644 Binary files a/docs/static/screenshots/Tooltip/data-snapping-dark-240w.webp and b/docs/static/screenshots/Tooltip/data-snapping-dark-240w.webp differ diff --git a/docs/static/screenshots/Tooltip/data-snapping-dark-400w.webp b/docs/static/screenshots/Tooltip/data-snapping-dark-400w.webp index dee10c4434..39c136e5e9 100644 Binary files a/docs/static/screenshots/Tooltip/data-snapping-dark-400w.webp and b/docs/static/screenshots/Tooltip/data-snapping-dark-400w.webp differ diff --git a/docs/static/screenshots/Tooltip/data-snapping-dark-800w.webp b/docs/static/screenshots/Tooltip/data-snapping-dark-800w.webp index bf74479725..0a46cca4ac 100644 Binary files a/docs/static/screenshots/Tooltip/data-snapping-dark-800w.webp and b/docs/static/screenshots/Tooltip/data-snapping-dark-800w.webp differ diff --git a/docs/static/screenshots/Tooltip/data-snapping-light-240w.webp b/docs/static/screenshots/Tooltip/data-snapping-light-240w.webp index 342a24c593..c0449d5748 100644 Binary files a/docs/static/screenshots/Tooltip/data-snapping-light-240w.webp and b/docs/static/screenshots/Tooltip/data-snapping-light-240w.webp differ diff --git a/docs/static/screenshots/Tooltip/data-snapping-light-400w.webp b/docs/static/screenshots/Tooltip/data-snapping-light-400w.webp index 6265aab9ee..e7b624f0d7 100644 Binary files a/docs/static/screenshots/Tooltip/data-snapping-light-400w.webp and b/docs/static/screenshots/Tooltip/data-snapping-light-400w.webp differ diff --git a/docs/static/screenshots/Tooltip/data-snapping-light-800w.webp b/docs/static/screenshots/Tooltip/data-snapping-light-800w.webp index 676f0f9bb7..4e63e5eca9 100644 Binary files a/docs/static/screenshots/Tooltip/data-snapping-light-800w.webp and b/docs/static/screenshots/Tooltip/data-snapping-light-800w.webp differ diff --git a/docs/static/screenshots/Tooltip/default-mouse-position-with-offset-dark-240w.webp b/docs/static/screenshots/Tooltip/default-mouse-position-with-offset-dark-240w.webp index ad0d569215..8e0e186442 100644 Binary files a/docs/static/screenshots/Tooltip/default-mouse-position-with-offset-dark-240w.webp and b/docs/static/screenshots/Tooltip/default-mouse-position-with-offset-dark-240w.webp differ diff --git a/docs/static/screenshots/Tooltip/default-mouse-position-with-offset-dark-400w.webp b/docs/static/screenshots/Tooltip/default-mouse-position-with-offset-dark-400w.webp index e2bc4c6189..e6129d0208 100644 Binary files a/docs/static/screenshots/Tooltip/default-mouse-position-with-offset-dark-400w.webp and b/docs/static/screenshots/Tooltip/default-mouse-position-with-offset-dark-400w.webp differ diff --git a/docs/static/screenshots/Tooltip/default-mouse-position-with-offset-dark-800w.webp b/docs/static/screenshots/Tooltip/default-mouse-position-with-offset-dark-800w.webp index 8db62b05fa..15095de6e6 100644 Binary files a/docs/static/screenshots/Tooltip/default-mouse-position-with-offset-dark-800w.webp and b/docs/static/screenshots/Tooltip/default-mouse-position-with-offset-dark-800w.webp differ diff --git a/docs/static/screenshots/Tooltip/default-mouse-position-with-offset-light-240w.webp b/docs/static/screenshots/Tooltip/default-mouse-position-with-offset-light-240w.webp index 1efa7bc690..0ab75e579b 100644 Binary files a/docs/static/screenshots/Tooltip/default-mouse-position-with-offset-light-240w.webp and b/docs/static/screenshots/Tooltip/default-mouse-position-with-offset-light-240w.webp differ diff --git a/docs/static/screenshots/Tooltip/default-mouse-position-with-offset-light-400w.webp b/docs/static/screenshots/Tooltip/default-mouse-position-with-offset-light-400w.webp index 4185bbbd4a..145900bc1d 100644 Binary files a/docs/static/screenshots/Tooltip/default-mouse-position-with-offset-light-400w.webp and b/docs/static/screenshots/Tooltip/default-mouse-position-with-offset-light-400w.webp differ diff --git a/docs/static/screenshots/Tooltip/default-mouse-position-with-offset-light-800w.webp b/docs/static/screenshots/Tooltip/default-mouse-position-with-offset-light-800w.webp index 7ba264ef3c..c98f237627 100644 Binary files a/docs/static/screenshots/Tooltip/default-mouse-position-with-offset-light-800w.webp and b/docs/static/screenshots/Tooltip/default-mouse-position-with-offset-light-800w.webp differ diff --git a/docs/static/screenshots/Tooltip/disable-motion-dark-240w.webp b/docs/static/screenshots/Tooltip/disable-motion-dark-240w.webp index 8d77491a65..488a382923 100644 Binary files a/docs/static/screenshots/Tooltip/disable-motion-dark-240w.webp and b/docs/static/screenshots/Tooltip/disable-motion-dark-240w.webp differ diff --git a/docs/static/screenshots/Tooltip/disable-motion-dark-400w.webp b/docs/static/screenshots/Tooltip/disable-motion-dark-400w.webp index 4e0cd69506..7454faaf43 100644 Binary files a/docs/static/screenshots/Tooltip/disable-motion-dark-400w.webp and b/docs/static/screenshots/Tooltip/disable-motion-dark-400w.webp differ diff --git a/docs/static/screenshots/Tooltip/disable-motion-dark-800w.webp b/docs/static/screenshots/Tooltip/disable-motion-dark-800w.webp index b263b96aaf..346c457ee8 100644 Binary files a/docs/static/screenshots/Tooltip/disable-motion-dark-800w.webp and b/docs/static/screenshots/Tooltip/disable-motion-dark-800w.webp differ diff --git a/docs/static/screenshots/Tooltip/disable-motion-light-240w.webp b/docs/static/screenshots/Tooltip/disable-motion-light-240w.webp index 59ead2345c..8de208d70b 100644 Binary files a/docs/static/screenshots/Tooltip/disable-motion-light-240w.webp and b/docs/static/screenshots/Tooltip/disable-motion-light-240w.webp differ diff --git a/docs/static/screenshots/Tooltip/disable-motion-light-400w.webp b/docs/static/screenshots/Tooltip/disable-motion-light-400w.webp index 3c3d1389f1..1f9b2b2142 100644 Binary files a/docs/static/screenshots/Tooltip/disable-motion-light-400w.webp and b/docs/static/screenshots/Tooltip/disable-motion-light-400w.webp differ diff --git a/docs/static/screenshots/Tooltip/disable-motion-light-800w.webp b/docs/static/screenshots/Tooltip/disable-motion-light-800w.webp index 65acc6724c..f821cb7291 100644 Binary files a/docs/static/screenshots/Tooltip/disable-motion-light-800w.webp and b/docs/static/screenshots/Tooltip/disable-motion-light-800w.webp differ diff --git a/docs/static/screenshots/Tooltip/duration-dark-240w.webp b/docs/static/screenshots/Tooltip/duration-dark-240w.webp index 21f4563179..9028ef1896 100644 Binary files a/docs/static/screenshots/Tooltip/duration-dark-240w.webp and b/docs/static/screenshots/Tooltip/duration-dark-240w.webp differ diff --git a/docs/static/screenshots/Tooltip/duration-dark-400w.webp b/docs/static/screenshots/Tooltip/duration-dark-400w.webp index 498d2dd182..8a4f432005 100644 Binary files a/docs/static/screenshots/Tooltip/duration-dark-400w.webp and b/docs/static/screenshots/Tooltip/duration-dark-400w.webp differ diff --git a/docs/static/screenshots/Tooltip/duration-dark-800w.webp b/docs/static/screenshots/Tooltip/duration-dark-800w.webp index b0b756a2b7..e4265a1610 100644 Binary files a/docs/static/screenshots/Tooltip/duration-dark-800w.webp and b/docs/static/screenshots/Tooltip/duration-dark-800w.webp differ diff --git a/docs/static/screenshots/Tooltip/duration-light-240w.webp b/docs/static/screenshots/Tooltip/duration-light-240w.webp index dc8e68a156..36346941c4 100644 Binary files a/docs/static/screenshots/Tooltip/duration-light-240w.webp and b/docs/static/screenshots/Tooltip/duration-light-240w.webp differ diff --git a/docs/static/screenshots/Tooltip/duration-light-400w.webp b/docs/static/screenshots/Tooltip/duration-light-400w.webp index fb8aed6faf..8c5d1424e0 100644 Binary files a/docs/static/screenshots/Tooltip/duration-light-400w.webp and b/docs/static/screenshots/Tooltip/duration-light-400w.webp differ diff --git a/docs/static/screenshots/Tooltip/duration-light-800w.webp b/docs/static/screenshots/Tooltip/duration-light-800w.webp index ef3b40e58a..996c830e4c 100644 Binary files a/docs/static/screenshots/Tooltip/duration-light-800w.webp and b/docs/static/screenshots/Tooltip/duration-light-800w.webp differ diff --git a/docs/static/screenshots/Tooltip/externally-access-tooltip-data-dark-240w.webp b/docs/static/screenshots/Tooltip/externally-access-tooltip-data-dark-240w.webp index d11d261fd6..2cd13324de 100644 Binary files a/docs/static/screenshots/Tooltip/externally-access-tooltip-data-dark-240w.webp and b/docs/static/screenshots/Tooltip/externally-access-tooltip-data-dark-240w.webp differ diff --git a/docs/static/screenshots/Tooltip/externally-access-tooltip-data-dark-400w.webp b/docs/static/screenshots/Tooltip/externally-access-tooltip-data-dark-400w.webp index dcf4cc5663..53b46a777c 100644 Binary files a/docs/static/screenshots/Tooltip/externally-access-tooltip-data-dark-400w.webp and b/docs/static/screenshots/Tooltip/externally-access-tooltip-data-dark-400w.webp differ diff --git a/docs/static/screenshots/Tooltip/externally-access-tooltip-data-dark-800w.webp b/docs/static/screenshots/Tooltip/externally-access-tooltip-data-dark-800w.webp index 441cc327b5..0886bfdd63 100644 Binary files a/docs/static/screenshots/Tooltip/externally-access-tooltip-data-dark-800w.webp and b/docs/static/screenshots/Tooltip/externally-access-tooltip-data-dark-800w.webp differ diff --git a/docs/static/screenshots/Tooltip/externally-access-tooltip-data-light-240w.webp b/docs/static/screenshots/Tooltip/externally-access-tooltip-data-light-240w.webp index cdefcc014f..2cf85c7fcb 100644 Binary files a/docs/static/screenshots/Tooltip/externally-access-tooltip-data-light-240w.webp and b/docs/static/screenshots/Tooltip/externally-access-tooltip-data-light-240w.webp differ diff --git a/docs/static/screenshots/Tooltip/externally-access-tooltip-data-light-400w.webp b/docs/static/screenshots/Tooltip/externally-access-tooltip-data-light-400w.webp index afb2f14df3..f1fa3de353 100644 Binary files a/docs/static/screenshots/Tooltip/externally-access-tooltip-data-light-400w.webp and b/docs/static/screenshots/Tooltip/externally-access-tooltip-data-light-400w.webp differ diff --git a/docs/static/screenshots/Tooltip/externally-access-tooltip-data-light-800w.webp b/docs/static/screenshots/Tooltip/externally-access-tooltip-data-light-800w.webp index 1ae4812226..194c749e14 100644 Binary files a/docs/static/screenshots/Tooltip/externally-access-tooltip-data-light-800w.webp and b/docs/static/screenshots/Tooltip/externally-access-tooltip-data-light-800w.webp differ diff --git a/docs/static/screenshots/Tooltip/invert-variant-dark-240w.webp b/docs/static/screenshots/Tooltip/invert-variant-dark-240w.webp index 66377cc9cf..1b1a5276d3 100644 Binary files a/docs/static/screenshots/Tooltip/invert-variant-dark-240w.webp and b/docs/static/screenshots/Tooltip/invert-variant-dark-240w.webp differ diff --git a/docs/static/screenshots/Tooltip/invert-variant-dark-400w.webp b/docs/static/screenshots/Tooltip/invert-variant-dark-400w.webp index 1a01726c39..1f2bfe6c85 100644 Binary files a/docs/static/screenshots/Tooltip/invert-variant-dark-400w.webp and b/docs/static/screenshots/Tooltip/invert-variant-dark-400w.webp differ diff --git a/docs/static/screenshots/Tooltip/invert-variant-dark-800w.webp b/docs/static/screenshots/Tooltip/invert-variant-dark-800w.webp index 963387a96d..c2450bf8ad 100644 Binary files a/docs/static/screenshots/Tooltip/invert-variant-dark-800w.webp and b/docs/static/screenshots/Tooltip/invert-variant-dark-800w.webp differ diff --git a/docs/static/screenshots/Tooltip/invert-variant-light-240w.webp b/docs/static/screenshots/Tooltip/invert-variant-light-240w.webp index 834cc8fea3..0ab41338cf 100644 Binary files a/docs/static/screenshots/Tooltip/invert-variant-light-240w.webp and b/docs/static/screenshots/Tooltip/invert-variant-light-240w.webp differ diff --git a/docs/static/screenshots/Tooltip/invert-variant-light-400w.webp b/docs/static/screenshots/Tooltip/invert-variant-light-400w.webp index c48d0fdd78..0cd2c8d11e 100644 Binary files a/docs/static/screenshots/Tooltip/invert-variant-light-400w.webp and b/docs/static/screenshots/Tooltip/invert-variant-light-400w.webp differ diff --git a/docs/static/screenshots/Tooltip/invert-variant-light-800w.webp b/docs/static/screenshots/Tooltip/invert-variant-light-800w.webp index e636df0ff6..068c47ae94 100644 Binary files a/docs/static/screenshots/Tooltip/invert-variant-light-800w.webp and b/docs/static/screenshots/Tooltip/invert-variant-light-800w.webp differ diff --git a/docs/static/screenshots/Tooltip/multiple-overlapping-bars-dark-240w.webp b/docs/static/screenshots/Tooltip/multiple-overlapping-bars-dark-240w.webp index f862be576a..304166f059 100644 Binary files a/docs/static/screenshots/Tooltip/multiple-overlapping-bars-dark-240w.webp and b/docs/static/screenshots/Tooltip/multiple-overlapping-bars-dark-240w.webp differ diff --git a/docs/static/screenshots/Tooltip/multiple-overlapping-bars-dark-400w.webp b/docs/static/screenshots/Tooltip/multiple-overlapping-bars-dark-400w.webp index 249ddce275..7d80d18244 100644 Binary files a/docs/static/screenshots/Tooltip/multiple-overlapping-bars-dark-400w.webp and b/docs/static/screenshots/Tooltip/multiple-overlapping-bars-dark-400w.webp differ diff --git a/docs/static/screenshots/Tooltip/multiple-overlapping-bars-dark-800w.webp b/docs/static/screenshots/Tooltip/multiple-overlapping-bars-dark-800w.webp index 786bbf52a0..f4fc44c185 100644 Binary files a/docs/static/screenshots/Tooltip/multiple-overlapping-bars-dark-800w.webp and b/docs/static/screenshots/Tooltip/multiple-overlapping-bars-dark-800w.webp differ diff --git a/docs/static/screenshots/Tooltip/multiple-overlapping-bars-light-240w.webp b/docs/static/screenshots/Tooltip/multiple-overlapping-bars-light-240w.webp index d44faf5908..8d08580475 100644 Binary files a/docs/static/screenshots/Tooltip/multiple-overlapping-bars-light-240w.webp and b/docs/static/screenshots/Tooltip/multiple-overlapping-bars-light-240w.webp differ diff --git a/docs/static/screenshots/Tooltip/multiple-overlapping-bars-light-400w.webp b/docs/static/screenshots/Tooltip/multiple-overlapping-bars-light-400w.webp index a232ac9c1e..2e25af0fe2 100644 Binary files a/docs/static/screenshots/Tooltip/multiple-overlapping-bars-light-400w.webp and b/docs/static/screenshots/Tooltip/multiple-overlapping-bars-light-400w.webp differ diff --git a/docs/static/screenshots/Tooltip/multiple-overlapping-bars-light-800w.webp b/docs/static/screenshots/Tooltip/multiple-overlapping-bars-light-800w.webp index 9df72367d1..60251d5d3f 100644 Binary files a/docs/static/screenshots/Tooltip/multiple-overlapping-bars-light-800w.webp and b/docs/static/screenshots/Tooltip/multiple-overlapping-bars-light-800w.webp differ diff --git a/docs/static/screenshots/Tooltip/multiple-overlapping-durations-dark-240w.webp b/docs/static/screenshots/Tooltip/multiple-overlapping-durations-dark-240w.webp index 01b877fa98..59c56661d9 100644 Binary files a/docs/static/screenshots/Tooltip/multiple-overlapping-durations-dark-240w.webp and b/docs/static/screenshots/Tooltip/multiple-overlapping-durations-dark-240w.webp differ diff --git a/docs/static/screenshots/Tooltip/multiple-overlapping-durations-dark-400w.webp b/docs/static/screenshots/Tooltip/multiple-overlapping-durations-dark-400w.webp index adef216cc8..29165af439 100644 Binary files a/docs/static/screenshots/Tooltip/multiple-overlapping-durations-dark-400w.webp and b/docs/static/screenshots/Tooltip/multiple-overlapping-durations-dark-400w.webp differ diff --git a/docs/static/screenshots/Tooltip/multiple-overlapping-durations-dark-800w.webp b/docs/static/screenshots/Tooltip/multiple-overlapping-durations-dark-800w.webp index 74b4fcff01..bbb85c5f1d 100644 Binary files a/docs/static/screenshots/Tooltip/multiple-overlapping-durations-dark-800w.webp and b/docs/static/screenshots/Tooltip/multiple-overlapping-durations-dark-800w.webp differ diff --git a/docs/static/screenshots/Tooltip/multiple-overlapping-durations-light-240w.webp b/docs/static/screenshots/Tooltip/multiple-overlapping-durations-light-240w.webp index 1a88b35baa..9d829bc08b 100644 Binary files a/docs/static/screenshots/Tooltip/multiple-overlapping-durations-light-240w.webp and b/docs/static/screenshots/Tooltip/multiple-overlapping-durations-light-240w.webp differ diff --git a/docs/static/screenshots/Tooltip/multiple-overlapping-durations-light-400w.webp b/docs/static/screenshots/Tooltip/multiple-overlapping-durations-light-400w.webp index 08e770c65e..bad3792406 100644 Binary files a/docs/static/screenshots/Tooltip/multiple-overlapping-durations-light-400w.webp and b/docs/static/screenshots/Tooltip/multiple-overlapping-durations-light-400w.webp differ diff --git a/docs/static/screenshots/Tooltip/multiple-overlapping-durations-light-800w.webp b/docs/static/screenshots/Tooltip/multiple-overlapping-durations-light-800w.webp index 948a7c27f9..df8f1eb949 100644 Binary files a/docs/static/screenshots/Tooltip/multiple-overlapping-durations-light-800w.webp and b/docs/static/screenshots/Tooltip/multiple-overlapping-durations-light-800w.webp differ diff --git a/docs/static/screenshots/Tooltip/multiple-tooltips-with-fixed-single-axis-dark-240w.webp b/docs/static/screenshots/Tooltip/multiple-tooltips-with-fixed-single-axis-dark-240w.webp index 27e53ab9c7..e48c1fede3 100644 Binary files a/docs/static/screenshots/Tooltip/multiple-tooltips-with-fixed-single-axis-dark-240w.webp and b/docs/static/screenshots/Tooltip/multiple-tooltips-with-fixed-single-axis-dark-240w.webp differ diff --git a/docs/static/screenshots/Tooltip/multiple-tooltips-with-fixed-single-axis-dark-400w.webp b/docs/static/screenshots/Tooltip/multiple-tooltips-with-fixed-single-axis-dark-400w.webp index 9a772f4c2b..83846c5ed1 100644 Binary files a/docs/static/screenshots/Tooltip/multiple-tooltips-with-fixed-single-axis-dark-400w.webp and b/docs/static/screenshots/Tooltip/multiple-tooltips-with-fixed-single-axis-dark-400w.webp differ diff --git a/docs/static/screenshots/Tooltip/multiple-tooltips-with-fixed-single-axis-dark-800w.webp b/docs/static/screenshots/Tooltip/multiple-tooltips-with-fixed-single-axis-dark-800w.webp index a9d38c670c..91ee41ea4f 100644 Binary files a/docs/static/screenshots/Tooltip/multiple-tooltips-with-fixed-single-axis-dark-800w.webp and b/docs/static/screenshots/Tooltip/multiple-tooltips-with-fixed-single-axis-dark-800w.webp differ diff --git a/docs/static/screenshots/Tooltip/multiple-tooltips-with-fixed-single-axis-light-240w.webp b/docs/static/screenshots/Tooltip/multiple-tooltips-with-fixed-single-axis-light-240w.webp index 47c4cc9198..91e19eee87 100644 Binary files a/docs/static/screenshots/Tooltip/multiple-tooltips-with-fixed-single-axis-light-240w.webp and b/docs/static/screenshots/Tooltip/multiple-tooltips-with-fixed-single-axis-light-240w.webp differ diff --git a/docs/static/screenshots/Tooltip/multiple-tooltips-with-fixed-single-axis-light-400w.webp b/docs/static/screenshots/Tooltip/multiple-tooltips-with-fixed-single-axis-light-400w.webp index 5465849f76..38e5182a2d 100644 Binary files a/docs/static/screenshots/Tooltip/multiple-tooltips-with-fixed-single-axis-light-400w.webp and b/docs/static/screenshots/Tooltip/multiple-tooltips-with-fixed-single-axis-light-400w.webp differ diff --git a/docs/static/screenshots/Tooltip/multiple-tooltips-with-fixed-single-axis-light-800w.webp b/docs/static/screenshots/Tooltip/multiple-tooltips-with-fixed-single-axis-light-800w.webp index a66bba9799..74218ef450 100644 Binary files a/docs/static/screenshots/Tooltip/multiple-tooltips-with-fixed-single-axis-light-800w.webp and b/docs/static/screenshots/Tooltip/multiple-tooltips-with-fixed-single-axis-light-800w.webp differ diff --git a/docs/static/screenshots/Tooltip/multiple-tooltips-with-fixed-single-axis-scaleband-dark-240w.webp b/docs/static/screenshots/Tooltip/multiple-tooltips-with-fixed-single-axis-scaleband-dark-240w.webp index fbbbfda195..b464c9dfbd 100644 Binary files a/docs/static/screenshots/Tooltip/multiple-tooltips-with-fixed-single-axis-scaleband-dark-240w.webp and b/docs/static/screenshots/Tooltip/multiple-tooltips-with-fixed-single-axis-scaleband-dark-240w.webp differ diff --git a/docs/static/screenshots/Tooltip/multiple-tooltips-with-fixed-single-axis-scaleband-dark-400w.webp b/docs/static/screenshots/Tooltip/multiple-tooltips-with-fixed-single-axis-scaleband-dark-400w.webp index 33920d488d..44b9b1e422 100644 Binary files a/docs/static/screenshots/Tooltip/multiple-tooltips-with-fixed-single-axis-scaleband-dark-400w.webp and b/docs/static/screenshots/Tooltip/multiple-tooltips-with-fixed-single-axis-scaleband-dark-400w.webp differ diff --git a/docs/static/screenshots/Tooltip/multiple-tooltips-with-fixed-single-axis-scaleband-dark-800w.webp b/docs/static/screenshots/Tooltip/multiple-tooltips-with-fixed-single-axis-scaleband-dark-800w.webp index 8a700572d1..d22ea42671 100644 Binary files a/docs/static/screenshots/Tooltip/multiple-tooltips-with-fixed-single-axis-scaleband-dark-800w.webp and b/docs/static/screenshots/Tooltip/multiple-tooltips-with-fixed-single-axis-scaleband-dark-800w.webp differ diff --git a/docs/static/screenshots/Tooltip/multiple-tooltips-with-fixed-single-axis-scaleband-light-240w.webp b/docs/static/screenshots/Tooltip/multiple-tooltips-with-fixed-single-axis-scaleband-light-240w.webp index 1b35c26772..ace1b07206 100644 Binary files a/docs/static/screenshots/Tooltip/multiple-tooltips-with-fixed-single-axis-scaleband-light-240w.webp and b/docs/static/screenshots/Tooltip/multiple-tooltips-with-fixed-single-axis-scaleband-light-240w.webp differ diff --git a/docs/static/screenshots/Tooltip/multiple-tooltips-with-fixed-single-axis-scaleband-light-400w.webp b/docs/static/screenshots/Tooltip/multiple-tooltips-with-fixed-single-axis-scaleband-light-400w.webp index cffaaa1567..2f4905c90c 100644 Binary files a/docs/static/screenshots/Tooltip/multiple-tooltips-with-fixed-single-axis-scaleband-light-400w.webp and b/docs/static/screenshots/Tooltip/multiple-tooltips-with-fixed-single-axis-scaleband-light-400w.webp differ diff --git a/docs/static/screenshots/Tooltip/multiple-tooltips-with-fixed-single-axis-scaleband-light-800w.webp b/docs/static/screenshots/Tooltip/multiple-tooltips-with-fixed-single-axis-scaleband-light-800w.webp index acba8b2bd6..118998baf2 100644 Binary files a/docs/static/screenshots/Tooltip/multiple-tooltips-with-fixed-single-axis-scaleband-light-800w.webp and b/docs/static/screenshots/Tooltip/multiple-tooltips-with-fixed-single-axis-scaleband-light-800w.webp differ diff --git a/docs/static/screenshots/Tooltip/portal-overflow-dark-240w.webp b/docs/static/screenshots/Tooltip/portal-overflow-dark-240w.webp index 4f0588f2f8..2f13cff2b0 100644 Binary files a/docs/static/screenshots/Tooltip/portal-overflow-dark-240w.webp and b/docs/static/screenshots/Tooltip/portal-overflow-dark-240w.webp differ diff --git a/docs/static/screenshots/Tooltip/portal-overflow-dark-400w.webp b/docs/static/screenshots/Tooltip/portal-overflow-dark-400w.webp index 6113ee0e1e..f9a468d1a0 100644 Binary files a/docs/static/screenshots/Tooltip/portal-overflow-dark-400w.webp and b/docs/static/screenshots/Tooltip/portal-overflow-dark-400w.webp differ diff --git a/docs/static/screenshots/Tooltip/portal-overflow-dark-800w.webp b/docs/static/screenshots/Tooltip/portal-overflow-dark-800w.webp index 1c4d7ca08e..fc53d4fc6e 100644 Binary files a/docs/static/screenshots/Tooltip/portal-overflow-dark-800w.webp and b/docs/static/screenshots/Tooltip/portal-overflow-dark-800w.webp differ diff --git a/docs/static/screenshots/Tooltip/portal-overflow-light-240w.webp b/docs/static/screenshots/Tooltip/portal-overflow-light-240w.webp index 2dc53eed9f..632171533b 100644 Binary files a/docs/static/screenshots/Tooltip/portal-overflow-light-240w.webp and b/docs/static/screenshots/Tooltip/portal-overflow-light-240w.webp differ diff --git a/docs/static/screenshots/Tooltip/portal-overflow-light-400w.webp b/docs/static/screenshots/Tooltip/portal-overflow-light-400w.webp index d98d452a8a..c8ec806e7b 100644 Binary files a/docs/static/screenshots/Tooltip/portal-overflow-light-400w.webp and b/docs/static/screenshots/Tooltip/portal-overflow-light-400w.webp differ diff --git a/docs/static/screenshots/Tooltip/portal-overflow-light-800w.webp b/docs/static/screenshots/Tooltip/portal-overflow-light-800w.webp index 084553bf96..ef5188e6b5 100644 Binary files a/docs/static/screenshots/Tooltip/portal-overflow-light-800w.webp and b/docs/static/screenshots/Tooltip/portal-overflow-light-800w.webp differ diff --git a/docs/static/screenshots/Tooltip/programmatic-control-dark-240w.webp b/docs/static/screenshots/Tooltip/programmatic-control-dark-240w.webp new file mode 100644 index 0000000000..03fc6d29e3 Binary files /dev/null and b/docs/static/screenshots/Tooltip/programmatic-control-dark-240w.webp differ diff --git a/docs/static/screenshots/Tooltip/programmatic-control-dark-400w.webp b/docs/static/screenshots/Tooltip/programmatic-control-dark-400w.webp new file mode 100644 index 0000000000..cde909a6ac Binary files /dev/null and b/docs/static/screenshots/Tooltip/programmatic-control-dark-400w.webp differ diff --git a/docs/static/screenshots/Tooltip/programmatic-control-dark-800w.webp b/docs/static/screenshots/Tooltip/programmatic-control-dark-800w.webp new file mode 100644 index 0000000000..7df7952f58 Binary files /dev/null and b/docs/static/screenshots/Tooltip/programmatic-control-dark-800w.webp differ diff --git a/docs/static/screenshots/Tooltip/programmatic-control-light-240w.webp b/docs/static/screenshots/Tooltip/programmatic-control-light-240w.webp new file mode 100644 index 0000000000..0f50ccbfcd Binary files /dev/null and b/docs/static/screenshots/Tooltip/programmatic-control-light-240w.webp differ diff --git a/docs/static/screenshots/Tooltip/programmatic-control-light-400w.webp b/docs/static/screenshots/Tooltip/programmatic-control-light-400w.webp new file mode 100644 index 0000000000..279ecb3c4d Binary files /dev/null and b/docs/static/screenshots/Tooltip/programmatic-control-light-400w.webp differ diff --git a/docs/static/screenshots/Tooltip/programmatic-control-light-800w.webp b/docs/static/screenshots/Tooltip/programmatic-control-light-800w.webp new file mode 100644 index 0000000000..b449d1fd5c Binary files /dev/null and b/docs/static/screenshots/Tooltip/programmatic-control-light-800w.webp differ diff --git a/docs/static/screenshots/Tooltip/scatter-plot-dark-400w.webp b/docs/static/screenshots/Tooltip/scatter-plot-dark-400w.webp index b192add2a0..9534a6caac 100644 Binary files a/docs/static/screenshots/Tooltip/scatter-plot-dark-400w.webp and b/docs/static/screenshots/Tooltip/scatter-plot-dark-400w.webp differ diff --git a/docs/static/screenshots/Tooltip/scatter-plot-dark-800w.webp b/docs/static/screenshots/Tooltip/scatter-plot-dark-800w.webp index 9392554d82..293e7a8ffa 100644 Binary files a/docs/static/screenshots/Tooltip/scatter-plot-dark-800w.webp and b/docs/static/screenshots/Tooltip/scatter-plot-dark-800w.webp differ diff --git a/docs/static/screenshots/Tooltip/scatter-plot-light-400w.webp b/docs/static/screenshots/Tooltip/scatter-plot-light-400w.webp index 55d8eb307e..f049843f03 100644 Binary files a/docs/static/screenshots/Tooltip/scatter-plot-light-400w.webp and b/docs/static/screenshots/Tooltip/scatter-plot-light-400w.webp differ diff --git a/docs/static/screenshots/Tooltip/simple-bars-dark-240w.webp b/docs/static/screenshots/Tooltip/simple-bars-dark-240w.webp index 8bd2575e09..152767f19b 100644 Binary files a/docs/static/screenshots/Tooltip/simple-bars-dark-240w.webp and b/docs/static/screenshots/Tooltip/simple-bars-dark-240w.webp differ diff --git a/docs/static/screenshots/Tooltip/simple-bars-dark-400w.webp b/docs/static/screenshots/Tooltip/simple-bars-dark-400w.webp index 99b5cb03ba..aafada2a0e 100644 Binary files a/docs/static/screenshots/Tooltip/simple-bars-dark-400w.webp and b/docs/static/screenshots/Tooltip/simple-bars-dark-400w.webp differ diff --git a/docs/static/screenshots/Tooltip/simple-bars-dark-800w.webp b/docs/static/screenshots/Tooltip/simple-bars-dark-800w.webp index 14bc6fecf2..a4e3c4df62 100644 Binary files a/docs/static/screenshots/Tooltip/simple-bars-dark-800w.webp and b/docs/static/screenshots/Tooltip/simple-bars-dark-800w.webp differ diff --git a/docs/static/screenshots/Tooltip/simple-bars-light-240w.webp b/docs/static/screenshots/Tooltip/simple-bars-light-240w.webp index 39f88f725b..97291cce47 100644 Binary files a/docs/static/screenshots/Tooltip/simple-bars-light-240w.webp and b/docs/static/screenshots/Tooltip/simple-bars-light-240w.webp differ diff --git a/docs/static/screenshots/Tooltip/simple-bars-light-400w.webp b/docs/static/screenshots/Tooltip/simple-bars-light-400w.webp index b9be966b10..b5bb54b7cd 100644 Binary files a/docs/static/screenshots/Tooltip/simple-bars-light-400w.webp and b/docs/static/screenshots/Tooltip/simple-bars-light-400w.webp differ diff --git a/docs/static/screenshots/Tooltip/simple-bars-light-800w.webp b/docs/static/screenshots/Tooltip/simple-bars-light-800w.webp index de11b62ebb..e1e1eebc5a 100644 Binary files a/docs/static/screenshots/Tooltip/simple-bars-light-800w.webp and b/docs/static/screenshots/Tooltip/simple-bars-light-800w.webp differ diff --git a/docs/static/screenshots/Tooltip/single-date-time-dark-240w.webp b/docs/static/screenshots/Tooltip/single-date-time-dark-240w.webp index 615c559d99..0870bc1502 100644 Binary files a/docs/static/screenshots/Tooltip/single-date-time-dark-240w.webp and b/docs/static/screenshots/Tooltip/single-date-time-dark-240w.webp differ diff --git a/docs/static/screenshots/Tooltip/single-date-time-dark-400w.webp b/docs/static/screenshots/Tooltip/single-date-time-dark-400w.webp index 762e82fccd..f1403dd73c 100644 Binary files a/docs/static/screenshots/Tooltip/single-date-time-dark-400w.webp and b/docs/static/screenshots/Tooltip/single-date-time-dark-400w.webp differ diff --git a/docs/static/screenshots/Tooltip/single-date-time-dark-800w.webp b/docs/static/screenshots/Tooltip/single-date-time-dark-800w.webp index 7a432c71d0..42228457c5 100644 Binary files a/docs/static/screenshots/Tooltip/single-date-time-dark-800w.webp and b/docs/static/screenshots/Tooltip/single-date-time-dark-800w.webp differ diff --git a/docs/static/screenshots/Tooltip/single-date-time-light-240w.webp b/docs/static/screenshots/Tooltip/single-date-time-light-240w.webp index cb0f311fa8..bbb1955ab8 100644 Binary files a/docs/static/screenshots/Tooltip/single-date-time-light-240w.webp and b/docs/static/screenshots/Tooltip/single-date-time-light-240w.webp differ diff --git a/docs/static/screenshots/Tooltip/single-date-time-light-400w.webp b/docs/static/screenshots/Tooltip/single-date-time-light-400w.webp index 597c11ab4c..032615ede3 100644 Binary files a/docs/static/screenshots/Tooltip/single-date-time-light-400w.webp and b/docs/static/screenshots/Tooltip/single-date-time-light-400w.webp differ diff --git a/docs/static/screenshots/Tooltip/single-date-time-light-800w.webp b/docs/static/screenshots/Tooltip/single-date-time-light-800w.webp index ad025d3e90..c63c24f62f 100644 Binary files a/docs/static/screenshots/Tooltip/single-date-time-light-800w.webp and b/docs/static/screenshots/Tooltip/single-date-time-light-800w.webp differ diff --git a/docs/static/screenshots/Tooltip/stacked-area-dark-240w.webp b/docs/static/screenshots/Tooltip/stacked-area-dark-240w.webp index 0acab66916..afa5f7b6fd 100644 Binary files a/docs/static/screenshots/Tooltip/stacked-area-dark-240w.webp and b/docs/static/screenshots/Tooltip/stacked-area-dark-240w.webp differ diff --git a/docs/static/screenshots/Tooltip/stacked-area-dark-400w.webp b/docs/static/screenshots/Tooltip/stacked-area-dark-400w.webp index d92ae1abc7..b57942f044 100644 Binary files a/docs/static/screenshots/Tooltip/stacked-area-dark-400w.webp and b/docs/static/screenshots/Tooltip/stacked-area-dark-400w.webp differ diff --git a/docs/static/screenshots/Tooltip/stacked-area-dark-800w.webp b/docs/static/screenshots/Tooltip/stacked-area-dark-800w.webp index 31fdbcee3d..cdd013f186 100644 Binary files a/docs/static/screenshots/Tooltip/stacked-area-dark-800w.webp and b/docs/static/screenshots/Tooltip/stacked-area-dark-800w.webp differ diff --git a/docs/static/screenshots/Tooltip/stacked-area-light-240w.webp b/docs/static/screenshots/Tooltip/stacked-area-light-240w.webp index 2ff82f107d..9aa853a395 100644 Binary files a/docs/static/screenshots/Tooltip/stacked-area-light-240w.webp and b/docs/static/screenshots/Tooltip/stacked-area-light-240w.webp differ diff --git a/docs/static/screenshots/Tooltip/stacked-area-light-400w.webp b/docs/static/screenshots/Tooltip/stacked-area-light-400w.webp index d77bb033c4..8897948887 100644 Binary files a/docs/static/screenshots/Tooltip/stacked-area-light-400w.webp and b/docs/static/screenshots/Tooltip/stacked-area-light-400w.webp differ diff --git a/docs/static/screenshots/Tooltip/stacked-area-light-800w.webp b/docs/static/screenshots/Tooltip/stacked-area-light-800w.webp index cbd3558c06..fadb7d5d1b 100644 Binary files a/docs/static/screenshots/Tooltip/stacked-area-light-800w.webp and b/docs/static/screenshots/Tooltip/stacked-area-light-800w.webp differ diff --git a/docs/static/screenshots/Trail/basic-dark-240w.webp b/docs/static/screenshots/Trail/basic-dark-240w.webp index b42cfb96da..e31dc78e09 100644 Binary files a/docs/static/screenshots/Trail/basic-dark-240w.webp and b/docs/static/screenshots/Trail/basic-dark-240w.webp differ diff --git a/docs/static/screenshots/Trail/basic-dark-400w.webp b/docs/static/screenshots/Trail/basic-dark-400w.webp index a1eee429df..ec01127a09 100644 Binary files a/docs/static/screenshots/Trail/basic-dark-400w.webp and b/docs/static/screenshots/Trail/basic-dark-400w.webp differ diff --git a/docs/static/screenshots/Trail/basic-dark-800w.webp b/docs/static/screenshots/Trail/basic-dark-800w.webp index 4b7166723d..375cb5acc9 100644 Binary files a/docs/static/screenshots/Trail/basic-dark-800w.webp and b/docs/static/screenshots/Trail/basic-dark-800w.webp differ diff --git a/docs/static/screenshots/Trail/basic-light-240w.webp b/docs/static/screenshots/Trail/basic-light-240w.webp index c6feecec54..fe6fc3eeff 100644 Binary files a/docs/static/screenshots/Trail/basic-light-240w.webp and b/docs/static/screenshots/Trail/basic-light-240w.webp differ diff --git a/docs/static/screenshots/Trail/basic-light-400w.webp b/docs/static/screenshots/Trail/basic-light-400w.webp index 1eac40eaa2..3df7cc448b 100644 Binary files a/docs/static/screenshots/Trail/basic-light-400w.webp and b/docs/static/screenshots/Trail/basic-light-400w.webp differ diff --git a/docs/static/screenshots/Trail/basic-light-800w.webp b/docs/static/screenshots/Trail/basic-light-800w.webp index 3d5721fecf..614a3e03af 100644 Binary files a/docs/static/screenshots/Trail/basic-light-800w.webp and b/docs/static/screenshots/Trail/basic-light-800w.webp differ diff --git a/docs/static/screenshots/Trail/curves-dark-400w.webp b/docs/static/screenshots/Trail/curves-dark-400w.webp index 3db5f8a711..f2ea03ce2a 100644 Binary files a/docs/static/screenshots/Trail/curves-dark-400w.webp and b/docs/static/screenshots/Trail/curves-dark-400w.webp differ diff --git a/docs/static/screenshots/Trail/curves-dark-800w.webp b/docs/static/screenshots/Trail/curves-dark-800w.webp index e818310612..6c31175246 100644 Binary files a/docs/static/screenshots/Trail/curves-dark-800w.webp and b/docs/static/screenshots/Trail/curves-dark-800w.webp differ diff --git a/docs/static/screenshots/Trail/tdf-stage-dark-400w.webp b/docs/static/screenshots/Trail/tdf-stage-dark-400w.webp index f8b4b155ce..dbc00db7d8 100644 Binary files a/docs/static/screenshots/Trail/tdf-stage-dark-400w.webp and b/docs/static/screenshots/Trail/tdf-stage-dark-400w.webp differ diff --git a/docs/static/screenshots/Trail/tdf-stage-dark-800w.webp b/docs/static/screenshots/Trail/tdf-stage-dark-800w.webp index 9a0097492f..72cc4edd5b 100644 Binary files a/docs/static/screenshots/Trail/tdf-stage-dark-800w.webp and b/docs/static/screenshots/Trail/tdf-stage-dark-800w.webp differ diff --git a/docs/static/screenshots/Trail/tdf-stage-light-240w.webp b/docs/static/screenshots/Trail/tdf-stage-light-240w.webp index b5f5c9ecbf..24cededd09 100644 Binary files a/docs/static/screenshots/Trail/tdf-stage-light-240w.webp and b/docs/static/screenshots/Trail/tdf-stage-light-240w.webp differ diff --git a/docs/static/screenshots/TransformContext/planet-distances-dark-240w.webp b/docs/static/screenshots/TransformContext/planet-distances-dark-240w.webp index 8837b70779..610d8fad63 100644 Binary files a/docs/static/screenshots/TransformContext/planet-distances-dark-240w.webp and b/docs/static/screenshots/TransformContext/planet-distances-dark-240w.webp differ diff --git a/docs/static/screenshots/TransformContext/planet-distances-dark-400w.webp b/docs/static/screenshots/TransformContext/planet-distances-dark-400w.webp index 62b65a7cf7..77c1cc295f 100644 Binary files a/docs/static/screenshots/TransformContext/planet-distances-dark-400w.webp and b/docs/static/screenshots/TransformContext/planet-distances-dark-400w.webp differ diff --git a/docs/static/screenshots/TransformContext/planet-distances-dark-800w.webp b/docs/static/screenshots/TransformContext/planet-distances-dark-800w.webp index 753e6cac47..7bc5c331f3 100644 Binary files a/docs/static/screenshots/TransformContext/planet-distances-dark-800w.webp and b/docs/static/screenshots/TransformContext/planet-distances-dark-800w.webp differ diff --git a/docs/static/screenshots/TransformContext/planet-distances-light-240w.webp b/docs/static/screenshots/TransformContext/planet-distances-light-240w.webp index 7998c62b45..cc9d2edc2c 100644 Binary files a/docs/static/screenshots/TransformContext/planet-distances-light-240w.webp and b/docs/static/screenshots/TransformContext/planet-distances-light-240w.webp differ diff --git a/docs/static/screenshots/TransformContext/planet-distances-light-400w.webp b/docs/static/screenshots/TransformContext/planet-distances-light-400w.webp index 681a829b0a..05edf6b23e 100644 Binary files a/docs/static/screenshots/TransformContext/planet-distances-light-400w.webp and b/docs/static/screenshots/TransformContext/planet-distances-light-400w.webp differ diff --git a/docs/static/screenshots/TransformContext/planet-distances-light-800w.webp b/docs/static/screenshots/TransformContext/planet-distances-light-800w.webp index 306966a6fc..f5ca65df17 100644 Binary files a/docs/static/screenshots/TransformContext/planet-distances-light-800w.webp and b/docs/static/screenshots/TransformContext/planet-distances-light-800w.webp differ diff --git a/docs/static/screenshots/Tree/basic-dark-400w.webp b/docs/static/screenshots/Tree/basic-dark-400w.webp index 322177922b..a0245d0b9b 100644 Binary files a/docs/static/screenshots/Tree/basic-dark-400w.webp and b/docs/static/screenshots/Tree/basic-dark-400w.webp differ diff --git a/docs/static/screenshots/Tree/basic-dark-800w.webp b/docs/static/screenshots/Tree/basic-dark-800w.webp index 7f73a84209..96a02b6fe3 100644 Binary files a/docs/static/screenshots/Tree/basic-dark-800w.webp and b/docs/static/screenshots/Tree/basic-dark-800w.webp differ diff --git a/docs/static/screenshots/Tree/basic-light-800w.webp b/docs/static/screenshots/Tree/basic-light-800w.webp index 008bf8db70..13f9e1c7ba 100644 Binary files a/docs/static/screenshots/Tree/basic-light-800w.webp and b/docs/static/screenshots/Tree/basic-light-800w.webp differ diff --git a/docs/static/screenshots/Tree/html-nodes-light-800w.webp b/docs/static/screenshots/Tree/html-nodes-light-800w.webp index 0267b0227b..db4d34242c 100644 Binary files a/docs/static/screenshots/Tree/html-nodes-light-800w.webp and b/docs/static/screenshots/Tree/html-nodes-light-800w.webp differ diff --git a/docs/static/screenshots/Tree/playground-dark-400w.webp b/docs/static/screenshots/Tree/playground-dark-400w.webp index 28d6d61255..0965285b1e 100644 Binary files a/docs/static/screenshots/Tree/playground-dark-400w.webp and b/docs/static/screenshots/Tree/playground-dark-400w.webp differ diff --git a/docs/static/screenshots/Tree/playground-light-800w.webp b/docs/static/screenshots/Tree/playground-light-800w.webp index caaa50aeba..080bc0541b 100644 Binary files a/docs/static/screenshots/Tree/playground-light-800w.webp and b/docs/static/screenshots/Tree/playground-light-800w.webp differ diff --git a/docs/static/screenshots/Treemap/complex-dark-240w.webp b/docs/static/screenshots/Treemap/complex-dark-240w.webp index 5b4626fea1..6ea9af2949 100644 Binary files a/docs/static/screenshots/Treemap/complex-dark-240w.webp and b/docs/static/screenshots/Treemap/complex-dark-240w.webp differ diff --git a/docs/static/screenshots/Treemap/complex-dark-400w.webp b/docs/static/screenshots/Treemap/complex-dark-400w.webp index 44f6e99e82..b8c9ffadb4 100644 Binary files a/docs/static/screenshots/Treemap/complex-dark-400w.webp and b/docs/static/screenshots/Treemap/complex-dark-400w.webp differ diff --git a/docs/static/screenshots/Treemap/complex-dark-800w.webp b/docs/static/screenshots/Treemap/complex-dark-800w.webp index ea35d5c0af..fbb546ffc7 100644 Binary files a/docs/static/screenshots/Treemap/complex-dark-800w.webp and b/docs/static/screenshots/Treemap/complex-dark-800w.webp differ diff --git a/docs/static/screenshots/Treemap/complex-light-240w.webp b/docs/static/screenshots/Treemap/complex-light-240w.webp index 1848136a2f..8df50a1ae7 100644 Binary files a/docs/static/screenshots/Treemap/complex-light-240w.webp and b/docs/static/screenshots/Treemap/complex-light-240w.webp differ diff --git a/docs/static/screenshots/Treemap/complex-light-400w.webp b/docs/static/screenshots/Treemap/complex-light-400w.webp index af7f755e5c..3933f57bc4 100644 Binary files a/docs/static/screenshots/Treemap/complex-light-400w.webp and b/docs/static/screenshots/Treemap/complex-light-400w.webp differ diff --git a/docs/static/screenshots/Treemap/complex-light-800w.webp b/docs/static/screenshots/Treemap/complex-light-800w.webp index bef664a3b0..8079e6dd63 100644 Binary files a/docs/static/screenshots/Treemap/complex-light-800w.webp and b/docs/static/screenshots/Treemap/complex-light-800w.webp differ diff --git a/docs/static/screenshots/Treemap/nested-filter-dark-240w.webp b/docs/static/screenshots/Treemap/nested-filter-dark-240w.webp index b534f0d4c2..b7b3203959 100644 Binary files a/docs/static/screenshots/Treemap/nested-filter-dark-240w.webp and b/docs/static/screenshots/Treemap/nested-filter-dark-240w.webp differ diff --git a/docs/static/screenshots/Treemap/nested-filter-dark-400w.webp b/docs/static/screenshots/Treemap/nested-filter-dark-400w.webp index 3fc7a18b4a..16119e3d3e 100644 Binary files a/docs/static/screenshots/Treemap/nested-filter-dark-400w.webp and b/docs/static/screenshots/Treemap/nested-filter-dark-400w.webp differ diff --git a/docs/static/screenshots/Treemap/nested-filter-dark-800w.webp b/docs/static/screenshots/Treemap/nested-filter-dark-800w.webp index 5740dfd09e..3ff7d97f76 100644 Binary files a/docs/static/screenshots/Treemap/nested-filter-dark-800w.webp and b/docs/static/screenshots/Treemap/nested-filter-dark-800w.webp differ diff --git a/docs/static/screenshots/Treemap/nested-filter-light-240w.webp b/docs/static/screenshots/Treemap/nested-filter-light-240w.webp index 536840c903..9c53362277 100644 Binary files a/docs/static/screenshots/Treemap/nested-filter-light-240w.webp and b/docs/static/screenshots/Treemap/nested-filter-light-240w.webp differ diff --git a/docs/static/screenshots/Treemap/nested-filter-light-400w.webp b/docs/static/screenshots/Treemap/nested-filter-light-400w.webp index 66c916c612..a442a410aa 100644 Binary files a/docs/static/screenshots/Treemap/nested-filter-light-400w.webp and b/docs/static/screenshots/Treemap/nested-filter-light-400w.webp differ diff --git a/docs/static/screenshots/Treemap/nested-filter-light-800w.webp b/docs/static/screenshots/Treemap/nested-filter-light-800w.webp index dd9228998f..8fe6bd9241 100644 Binary files a/docs/static/screenshots/Treemap/nested-filter-light-800w.webp and b/docs/static/screenshots/Treemap/nested-filter-light-800w.webp differ diff --git a/docs/static/screenshots/Treemap/nested-zoom-dark-240w.webp b/docs/static/screenshots/Treemap/nested-zoom-dark-240w.webp index 0b92aff796..ab9894d7f4 100644 Binary files a/docs/static/screenshots/Treemap/nested-zoom-dark-240w.webp and b/docs/static/screenshots/Treemap/nested-zoom-dark-240w.webp differ diff --git a/docs/static/screenshots/Treemap/nested-zoom-dark-400w.webp b/docs/static/screenshots/Treemap/nested-zoom-dark-400w.webp index 22927282f9..983d3c2f4b 100644 Binary files a/docs/static/screenshots/Treemap/nested-zoom-dark-400w.webp and b/docs/static/screenshots/Treemap/nested-zoom-dark-400w.webp differ diff --git a/docs/static/screenshots/Treemap/nested-zoom-dark-800w.webp b/docs/static/screenshots/Treemap/nested-zoom-dark-800w.webp index 3d0047069e..5529754e7c 100644 Binary files a/docs/static/screenshots/Treemap/nested-zoom-dark-800w.webp and b/docs/static/screenshots/Treemap/nested-zoom-dark-800w.webp differ diff --git a/docs/static/screenshots/Treemap/nested-zoom-light-240w.webp b/docs/static/screenshots/Treemap/nested-zoom-light-240w.webp index a9f2f6196c..c5f2683bf4 100644 Binary files a/docs/static/screenshots/Treemap/nested-zoom-light-240w.webp and b/docs/static/screenshots/Treemap/nested-zoom-light-240w.webp differ diff --git a/docs/static/screenshots/Treemap/nested-zoom-light-400w.webp b/docs/static/screenshots/Treemap/nested-zoom-light-400w.webp index bf048148e2..2752e35eda 100644 Binary files a/docs/static/screenshots/Treemap/nested-zoom-light-400w.webp and b/docs/static/screenshots/Treemap/nested-zoom-light-400w.webp differ diff --git a/docs/static/screenshots/Treemap/nested-zoom-light-800w.webp b/docs/static/screenshots/Treemap/nested-zoom-light-800w.webp index 82ba49e0f1..86587cc57b 100644 Binary files a/docs/static/screenshots/Treemap/nested-zoom-light-800w.webp and b/docs/static/screenshots/Treemap/nested-zoom-light-800w.webp differ diff --git a/docs/static/screenshots/Treemap/playground-dark-240w.webp b/docs/static/screenshots/Treemap/playground-dark-240w.webp index 918246883c..ad73bd0739 100644 Binary files a/docs/static/screenshots/Treemap/playground-dark-240w.webp and b/docs/static/screenshots/Treemap/playground-dark-240w.webp differ diff --git a/docs/static/screenshots/Treemap/playground-dark-400w.webp b/docs/static/screenshots/Treemap/playground-dark-400w.webp index 3784ddc91e..046ee30930 100644 Binary files a/docs/static/screenshots/Treemap/playground-dark-400w.webp and b/docs/static/screenshots/Treemap/playground-dark-400w.webp differ diff --git a/docs/static/screenshots/Treemap/playground-dark-800w.webp b/docs/static/screenshots/Treemap/playground-dark-800w.webp index a8bdb05e03..966bba0789 100644 Binary files a/docs/static/screenshots/Treemap/playground-dark-800w.webp and b/docs/static/screenshots/Treemap/playground-dark-800w.webp differ diff --git a/docs/static/screenshots/Treemap/playground-light-400w.webp b/docs/static/screenshots/Treemap/playground-light-400w.webp index c084f4d371..b106131e84 100644 Binary files a/docs/static/screenshots/Treemap/playground-light-400w.webp and b/docs/static/screenshots/Treemap/playground-light-400w.webp differ diff --git a/docs/static/screenshots/Treemap/playground-light-800w.webp b/docs/static/screenshots/Treemap/playground-light-800w.webp index 5feeb2dd6f..1549e58d35 100644 Binary files a/docs/static/screenshots/Treemap/playground-light-800w.webp and b/docs/static/screenshots/Treemap/playground-light-800w.webp differ diff --git a/docs/static/screenshots/Treemap/stacked-zoom-dark-400w.webp b/docs/static/screenshots/Treemap/stacked-zoom-dark-400w.webp index 0e9f801287..668841c718 100644 Binary files a/docs/static/screenshots/Treemap/stacked-zoom-dark-400w.webp and b/docs/static/screenshots/Treemap/stacked-zoom-dark-400w.webp differ diff --git a/docs/static/screenshots/Treemap/stacked-zoom-dark-800w.webp b/docs/static/screenshots/Treemap/stacked-zoom-dark-800w.webp index 34019c37a4..068778ae7c 100644 Binary files a/docs/static/screenshots/Treemap/stacked-zoom-dark-800w.webp and b/docs/static/screenshots/Treemap/stacked-zoom-dark-800w.webp differ diff --git a/docs/static/screenshots/Treemap/stacked-zoom-light-240w.webp b/docs/static/screenshots/Treemap/stacked-zoom-light-240w.webp index 8d8721ef84..dd8a38a6d6 100644 Binary files a/docs/static/screenshots/Treemap/stacked-zoom-light-240w.webp and b/docs/static/screenshots/Treemap/stacked-zoom-light-240w.webp differ diff --git a/docs/static/screenshots/Treemap/stacked-zoom-light-400w.webp b/docs/static/screenshots/Treemap/stacked-zoom-light-400w.webp index 67da5f0fcb..9c6f6539c8 100644 Binary files a/docs/static/screenshots/Treemap/stacked-zoom-light-400w.webp and b/docs/static/screenshots/Treemap/stacked-zoom-light-400w.webp differ diff --git a/docs/static/screenshots/Treemap/stacked-zoom-light-800w.webp b/docs/static/screenshots/Treemap/stacked-zoom-light-800w.webp index 649599c0e7..02abf01e78 100644 Binary files a/docs/static/screenshots/Treemap/stacked-zoom-light-800w.webp and b/docs/static/screenshots/Treemap/stacked-zoom-light-800w.webp differ diff --git a/docs/static/screenshots/Violin/bandwidth-light-400w.webp b/docs/static/screenshots/Violin/bandwidth-light-400w.webp index 96503e2823..db8aab20ae 100644 Binary files a/docs/static/screenshots/Violin/bandwidth-light-400w.webp and b/docs/static/screenshots/Violin/bandwidth-light-400w.webp differ diff --git a/docs/static/screenshots/Violin/bandwidth-light-800w.webp b/docs/static/screenshots/Violin/bandwidth-light-800w.webp index eda5828dfc..e97ddeb6ed 100644 Binary files a/docs/static/screenshots/Violin/bandwidth-light-800w.webp and b/docs/static/screenshots/Violin/bandwidth-light-800w.webp differ diff --git a/docs/static/screenshots/Waffle/circular-cells-dark-400w.webp b/docs/static/screenshots/Waffle/circular-cells-dark-400w.webp index 24310db150..edab4863d4 100644 Binary files a/docs/static/screenshots/Waffle/circular-cells-dark-400w.webp and b/docs/static/screenshots/Waffle/circular-cells-dark-400w.webp differ diff --git a/docs/static/screenshots/Waffle/circular-cells-dark-800w.webp b/docs/static/screenshots/Waffle/circular-cells-dark-800w.webp index 84ecedc363..7e94e134ff 100644 Binary files a/docs/static/screenshots/Waffle/circular-cells-dark-800w.webp and b/docs/static/screenshots/Waffle/circular-cells-dark-800w.webp differ diff --git a/docs/static/screenshots/Waffle/custom-symbol-dark-400w.webp b/docs/static/screenshots/Waffle/custom-symbol-dark-400w.webp index 28587aaf13..10afee9619 100644 Binary files a/docs/static/screenshots/Waffle/custom-symbol-dark-400w.webp and b/docs/static/screenshots/Waffle/custom-symbol-dark-400w.webp differ diff --git a/docs/static/screenshots/Waffle/custom-symbol-dark-800w.webp b/docs/static/screenshots/Waffle/custom-symbol-dark-800w.webp index 29d1520654..28ab752141 100644 Binary files a/docs/static/screenshots/Waffle/custom-symbol-dark-800w.webp and b/docs/static/screenshots/Waffle/custom-symbol-dark-800w.webp differ diff --git a/docs/static/screenshots/Waffle/custom-symbol-light-240w.webp b/docs/static/screenshots/Waffle/custom-symbol-light-240w.webp index 4aa6b2597c..9e025b261a 100644 Binary files a/docs/static/screenshots/Waffle/custom-symbol-light-240w.webp and b/docs/static/screenshots/Waffle/custom-symbol-light-240w.webp differ diff --git a/docs/static/screenshots/Waffle/custom-symbol-light-400w.webp b/docs/static/screenshots/Waffle/custom-symbol-light-400w.webp index 2a9f0807bb..16eb742767 100644 Binary files a/docs/static/screenshots/Waffle/custom-symbol-light-400w.webp and b/docs/static/screenshots/Waffle/custom-symbol-light-400w.webp differ diff --git a/docs/static/screenshots/Waffle/custom-symbol-light-800w.webp b/docs/static/screenshots/Waffle/custom-symbol-light-800w.webp index 667fc6923e..561eff3367 100644 Binary files a/docs/static/screenshots/Waffle/custom-symbol-light-800w.webp and b/docs/static/screenshots/Waffle/custom-symbol-light-800w.webp differ diff --git a/docs/static/screenshots/Waffle/months-light-800w.webp b/docs/static/screenshots/Waffle/months-light-800w.webp index f164962a14..c24a53bc01 100644 Binary files a/docs/static/screenshots/Waffle/months-light-800w.webp and b/docs/static/screenshots/Waffle/months-light-800w.webp differ diff --git a/docs/static/screenshots/Waffle/olympians-by-birth-year-dark-400w.webp b/docs/static/screenshots/Waffle/olympians-by-birth-year-dark-400w.webp index 9b32b85134..20212eafc7 100644 Binary files a/docs/static/screenshots/Waffle/olympians-by-birth-year-dark-400w.webp and b/docs/static/screenshots/Waffle/olympians-by-birth-year-dark-400w.webp differ diff --git a/docs/static/screenshots/Waffle/olympians-weight-by-sex-dark-400w.webp b/docs/static/screenshots/Waffle/olympians-weight-by-sex-dark-400w.webp index 58170cc418..24691b950d 100644 Binary files a/docs/static/screenshots/Waffle/olympians-weight-by-sex-dark-400w.webp and b/docs/static/screenshots/Waffle/olympians-weight-by-sex-dark-400w.webp differ diff --git a/docs/static/screenshots/Waffle/olympians-weight-by-sex-dark-800w.webp b/docs/static/screenshots/Waffle/olympians-weight-by-sex-dark-800w.webp index 151347b4d9..87c85ea432 100644 Binary files a/docs/static/screenshots/Waffle/olympians-weight-by-sex-dark-800w.webp and b/docs/static/screenshots/Waffle/olympians-weight-by-sex-dark-800w.webp differ diff --git a/docs/static/screenshots/Waffle/olympians-weight-by-sex-light-240w.webp b/docs/static/screenshots/Waffle/olympians-weight-by-sex-light-240w.webp index 02c2266060..2da5c55aa4 100644 Binary files a/docs/static/screenshots/Waffle/olympians-weight-by-sex-light-240w.webp and b/docs/static/screenshots/Waffle/olympians-weight-by-sex-light-240w.webp differ diff --git a/docs/static/screenshots/Waffle/penguins-dark-400w.webp b/docs/static/screenshots/Waffle/penguins-dark-400w.webp index 796c2a73e9..ac20419310 100644 Binary files a/docs/static/screenshots/Waffle/penguins-dark-400w.webp and b/docs/static/screenshots/Waffle/penguins-dark-400w.webp differ diff --git a/docs/static/screenshots/Waffle/penguins-dark-800w.webp b/docs/static/screenshots/Waffle/penguins-dark-800w.webp index bd62b21f18..20888e0ca1 100644 Binary files a/docs/static/screenshots/Waffle/penguins-dark-800w.webp and b/docs/static/screenshots/Waffle/penguins-dark-800w.webp differ diff --git a/docs/static/screenshots/Waffle/penguins-light-240w.webp b/docs/static/screenshots/Waffle/penguins-light-240w.webp index b9620b7c45..7c2920de31 100644 Binary files a/docs/static/screenshots/Waffle/penguins-light-240w.webp and b/docs/static/screenshots/Waffle/penguins-light-240w.webp differ diff --git a/docs/static/screenshots/Waffle/penguins-light-400w.webp b/docs/static/screenshots/Waffle/penguins-light-400w.webp index d74f5e3511..89c571a1c6 100644 Binary files a/docs/static/screenshots/Waffle/penguins-light-400w.webp and b/docs/static/screenshots/Waffle/penguins-light-400w.webp differ diff --git a/docs/static/screenshots/Waffle/penguins-light-800w.webp b/docs/static/screenshots/Waffle/penguins-light-800w.webp index 02ce1b89b1..db4a33f358 100644 Binary files a/docs/static/screenshots/Waffle/penguins-light-800w.webp and b/docs/static/screenshots/Waffle/penguins-light-800w.webp differ diff --git a/docs/static/screenshots/Waffle/stacked-dark-240w.webp b/docs/static/screenshots/Waffle/stacked-dark-240w.webp index 8e4c842e1b..734f50ae52 100644 Binary files a/docs/static/screenshots/Waffle/stacked-dark-240w.webp and b/docs/static/screenshots/Waffle/stacked-dark-240w.webp differ diff --git a/docs/static/screenshots/Waffle/stacked-dark-400w.webp b/docs/static/screenshots/Waffle/stacked-dark-400w.webp index ef9221e0db..90d2dcddc6 100644 Binary files a/docs/static/screenshots/Waffle/stacked-dark-400w.webp and b/docs/static/screenshots/Waffle/stacked-dark-400w.webp differ diff --git a/docs/static/screenshots/Waffle/stacked-dark-800w.webp b/docs/static/screenshots/Waffle/stacked-dark-800w.webp index 11c2bba881..d775bb6aee 100644 Binary files a/docs/static/screenshots/Waffle/stacked-dark-800w.webp and b/docs/static/screenshots/Waffle/stacked-dark-800w.webp differ diff --git a/docs/static/screenshots/Waffle/stacked-light-240w.webp b/docs/static/screenshots/Waffle/stacked-light-240w.webp index a66ae35b7c..0a8ba94643 100644 Binary files a/docs/static/screenshots/Waffle/stacked-light-240w.webp and b/docs/static/screenshots/Waffle/stacked-light-240w.webp differ diff --git a/docs/static/screenshots/Waffle/stacked-light-400w.webp b/docs/static/screenshots/Waffle/stacked-light-400w.webp index 3c807e9019..c9dc01d926 100644 Binary files a/docs/static/screenshots/Waffle/stacked-light-400w.webp and b/docs/static/screenshots/Waffle/stacked-light-400w.webp differ diff --git a/docs/static/screenshots/Waffle/stacked-light-800w.webp b/docs/static/screenshots/Waffle/stacked-light-800w.webp index 3c0550a78b..d9ca32af0c 100644 Binary files a/docs/static/screenshots/Waffle/stacked-light-800w.webp and b/docs/static/screenshots/Waffle/stacked-light-800w.webp differ diff --git a/docs/static/screenshots/Waffle/survey-dark-240w.webp b/docs/static/screenshots/Waffle/survey-dark-240w.webp index 34743a8e7f..5dc6465fcb 100644 Binary files a/docs/static/screenshots/Waffle/survey-dark-240w.webp and b/docs/static/screenshots/Waffle/survey-dark-240w.webp differ diff --git a/docs/static/screenshots/Waffle/survey-dark-400w.webp b/docs/static/screenshots/Waffle/survey-dark-400w.webp index 9ededbda04..5c37d6dc4c 100644 Binary files a/docs/static/screenshots/Waffle/survey-dark-400w.webp and b/docs/static/screenshots/Waffle/survey-dark-400w.webp differ diff --git a/docs/static/screenshots/Waffle/survey-dark-800w.webp b/docs/static/screenshots/Waffle/survey-dark-800w.webp index 627dd21924..84c5873f9e 100644 Binary files a/docs/static/screenshots/Waffle/survey-dark-800w.webp and b/docs/static/screenshots/Waffle/survey-dark-800w.webp differ diff --git a/docs/static/screenshots/Waffle/survey-light-240w.webp b/docs/static/screenshots/Waffle/survey-light-240w.webp index a9756602c3..2c6a4d5898 100644 Binary files a/docs/static/screenshots/Waffle/survey-light-240w.webp and b/docs/static/screenshots/Waffle/survey-light-240w.webp differ diff --git a/docs/static/screenshots/Waffle/survey-light-400w.webp b/docs/static/screenshots/Waffle/survey-light-400w.webp index 5e10c9c046..e5da1396d6 100644 Binary files a/docs/static/screenshots/Waffle/survey-light-400w.webp and b/docs/static/screenshots/Waffle/survey-light-400w.webp differ diff --git a/docs/static/screenshots/Waffle/survey-light-800w.webp b/docs/static/screenshots/Waffle/survey-light-800w.webp index 7c1e7b0e69..eab4ae7572 100644 Binary files a/docs/static/screenshots/Waffle/survey-light-800w.webp and b/docs/static/screenshots/Waffle/survey-light-800w.webp differ diff --git a/docs/static/screenshots/index.json b/docs/static/screenshots/index.json index 9c21166c84..48f8b3e7d2 100644 --- a/docs/static/screenshots/index.json +++ b/docs/static/screenshots/index.json @@ -1,7 +1,7 @@ { - "generatedAt": "2026-08-06T14:50:38.005Z", - "totalComponents": 78, - "totalExamples": 929, + "generatedAt": "2026-08-20T17:04:37.492Z", + "totalComponents": 80, + "totalExamples": 978, "components": [ { "component": "AnnotationLine", @@ -374,7 +374,7 @@ { "name": "highlight-color-based-on-value-using-color-scale", "path": "/example/Area/highlight-color-based-on-value-using-color-scale", - "checksum": "c24bd706c2e8e40275e1fd82d9adfa3f" + "checksum": "64da61039ca0cc4a05c54ed2f82bf75b" }, { "name": "highlight-color-based-on-value-using-tooltip-slot-prop", @@ -399,7 +399,7 @@ { "name": "multiple-series-with-labels", "path": "/example/Area/multiple-series-with-labels", - "checksum": "e4e4292f9ef256830909fbda0dc24b90" + "checksum": "e5dcc339e475a22ff09f4f9900762b0b" }, { "name": "oscilloscope-ridgeline", @@ -424,7 +424,7 @@ { "name": "stack", "path": "/example/Area/stack", - "checksum": "695109807f225e33050a12fac3c4e5cf" + "checksum": "f0249285adac5827117ab78584dbf887" }, { "name": "stack-with-gradient", @@ -586,6 +586,11 @@ "path": "/example/AreaChart/series-individual-tooltip", "checksum": "a84b2bd70f44988a3651b45d0fa64e55" }, + { + "name": "series-overlap", + "path": "/example/AreaChart/series-overlap", + "checksum": "e8463a37d27bc2e199af8d65c41f21c0" + }, { "name": "series-point-annotations", "path": "/example/AreaChart/series-point-annotations", @@ -604,12 +609,12 @@ { "name": "series-stack", "path": "/example/AreaChart/series-stack", - "checksum": "95d53f113a9bfce730d9cd9f98334032" + "checksum": "221e68dc27f3b1997504bface72156e8" }, { "name": "series-stack-diverging", "path": "/example/AreaChart/series-stack-diverging", - "checksum": "b23bee9a689286c633d27f95317a9321" + "checksum": "110c1a95762576c6f6fc04d39c909f70" }, { "name": "series-stack-expand", @@ -619,27 +624,27 @@ { "name": "series-stack-gradient", "path": "/example/AreaChart/series-stack-gradient", - "checksum": "028eeb209a7b3f66864eaec106fa0a50" + "checksum": "35a9fdfe5630cb940f1d6d9fe1105c0d" }, { "name": "series-stack-legend", "path": "/example/AreaChart/series-stack-legend", - "checksum": "3e68a1afbb1707cd5bbd28c21aaacbb3" + "checksum": "cf9a91bc680819e874b99560a9445510" }, { "name": "series-stack-legend-labels", "path": "/example/AreaChart/series-stack-legend-labels", - "checksum": "c1edfc3ccdfe97c85dbfb5d852937a97" + "checksum": "9a0ec96dbdd293d2c785e0b0e0eb0404" }, { "name": "series-stack-legend-placement", "path": "/example/AreaChart/series-stack-legend-placement", - "checksum": "1650aed1fe67226d8ce0f253988e82d0" + "checksum": "6e983efaf6687876cde90955b5bf589b" }, { "name": "series-stack-separate-data", "path": "/example/AreaChart/series-stack-separate-data", - "checksum": "c5ada7b9ce07ab00c101f2f62c99d006" + "checksum": "2f2aafa3ce4d11d03acd4ec66a6a9144" }, { "name": "series-tooltip-click", @@ -900,6 +905,11 @@ "name": "time-scale-explicit-multiline", "path": "/example/Axis/time-scale-explicit-multiline", "checksum": "f6d4edd0194a3733793dfdea2f54bb79" + }, + { + "name": "utc-scale", + "path": "/example/Axis/utc-scale", + "checksum": "2abed3f7ee9c2709bd251e65f96fd314" } ] }, @@ -1046,6 +1056,11 @@ "path": "/example/BarChart/gradient", "checksum": "4ffa0f07e3ba14490969c3be8c822ac6" }, + { + "name": "group-long-data", + "path": "/example/BarChart/group-long-data", + "checksum": "1adbbc8e4cbc0570ed7da3905d9c8fdc" + }, { "name": "group-series", "path": "/example/BarChart/group-series", @@ -1054,7 +1069,7 @@ { "name": "group-series-bar-click", "path": "/example/BarChart/group-series-bar-click", - "checksum": "e94e7254fa0f2b5f9e4c7c05144df457" + "checksum": "48ae43258950da0eda36fdd6ce0bac66" }, { "name": "group-series-horizontal", @@ -1071,6 +1086,16 @@ "path": "/example/BarChart/group-series-series-long-data", "checksum": "e73f65c1ecbb15566bf4758c142bdeb4" }, + { + "name": "group-stack-series", + "path": "/example/BarChart/group-stack-series", + "checksum": "7be61363c9f7a632c6f1988198acfe5a" + }, + { + "name": "group-stack-series-horizontal", + "path": "/example/BarChart/group-stack-series-horizontal", + "checksum": "64ffaee335644682f634d8d51dd804cc" + }, { "name": "highlight-below-marks", "path": "/example/BarChart/highlight-below-marks", @@ -1144,7 +1169,7 @@ { "name": "legend-stack-series", "path": "/example/BarChart/legend-stack-series", - "checksum": "9dc378ac34027aa55883967d4d7d13a9" + "checksum": "8b3842e59ca23a2efb1ac63ede269fad" }, { "name": "line-annotation", @@ -1259,12 +1284,12 @@ { "name": "series", "path": "/example/BarChart/series", - "checksum": "f44592bacb35d9b131fa40d9abbeed21" + "checksum": "435924a53e897684d4d09940613300cd" }, { "name": "series-data", "path": "/example/BarChart/series-data", - "checksum": "75aa00f31978c818689b616910b9b11a" + "checksum": "d59687dda69b58caf582d9920982ba71" }, { "name": "series-diverging", @@ -1274,7 +1299,7 @@ { "name": "series-horizontal", "path": "/example/BarChart/series-horizontal", - "checksum": "d63f4afe97db1f5e3c0f0215e3d71f40" + "checksum": "2505911f64afa31f42aeb423f0ae33f4" }, { "name": "series-horizontal-diverging", @@ -1299,12 +1324,12 @@ { "name": "series-horizontal-labels", "path": "/example/BarChart/series-horizontal-labels", - "checksum": "550834cdd6fa0238e0f8a01314074a31" + "checksum": "0a086bd75bf6408068eac63358212daf" }, { "name": "series-stack-separate-data", "path": "/example/BarChart/series-stack-separate-data", - "checksum": "8928effba8167e9912b3659e86754b99" + "checksum": "e2f11729773f5173945178c46d73b704" }, { "name": "single-axis-x", @@ -1351,10 +1376,15 @@ "path": "/example/BarChart/sparkbar-within-a-paragraph-with-tooltip-and-highlight", "checksum": "0cd97f195418c30be66871343834df55" }, + { + "name": "stack-long-data", + "path": "/example/BarChart/stack-long-data", + "checksum": "0de39537207f84930722ebeefe9e9bb9" + }, { "name": "stack-series", "path": "/example/BarChart/stack-series", - "checksum": "5eb4e194cdce83ba4e9f41bce3524857" + "checksum": "9ecaadff73b3663c6a3497348b9a33b5" }, { "name": "stack-series-diverging", @@ -1369,12 +1399,12 @@ { "name": "stack-series-horizontal", "path": "/example/BarChart/stack-series-horizontal", - "checksum": "89abc14f2d87780a87d4c31a21526361" + "checksum": "b74046a594fab61e9a0631e5ae5e0e46" }, { "name": "stack-series-padded", "path": "/example/BarChart/stack-series-padded", - "checksum": "46764537a395369722fa547c86e8e152" + "checksum": "4da7beae52a674bcaa81e82f193084fb" }, { "name": "time-scale-interval", @@ -1409,7 +1439,7 @@ { "name": "waterfall", "path": "/example/BarChart/waterfall", - "checksum": "57f4946c78dbf1d37d4e162e0c714bfd" + "checksum": "f8e3ce489c9741f66bd8730e24f103b4" } ] }, @@ -1803,6 +1833,41 @@ } ] }, + { + "component": "Brush", + "examples": [ + { + "name": "basic", + "path": "/example/Brush/basic", + "checksum": "1cd61dcc0761dd3cd3957ba8122713d0" + }, + { + "name": "html", + "path": "/example/Brush/html", + "checksum": "aef191b5586e17969d56eeb661c4d3a1" + }, + { + "name": "programmatic", + "path": "/example/Brush/programmatic", + "checksum": "a1cd6a7cb88a892e74f0159e2cb7bc7d" + }, + { + "name": "region", + "path": "/example/Brush/region", + "checksum": "24104ad86109d27148c041f66ed0e8fb" + }, + { + "name": "two-dimensional", + "path": "/example/Brush/two-dimensional", + "checksum": "b1c26ed46bada5d5f197090868e07ad2" + }, + { + "name": "vertical", + "path": "/example/Brush/vertical", + "checksum": "ef8e11d130f47e3eda6bc2dea8fcc26f" + } + ] + }, { "component": "BrushContext", "examples": [ @@ -1859,7 +1924,7 @@ { "name": "minimap", "path": "/example/BrushContext/minimap", - "checksum": "f4098f9cda019c94ee830e54558c388d" + "checksum": "e72dff88cf0736f368bbb57839e1db5f" }, { "name": "programmatic-control", @@ -1869,7 +1934,7 @@ { "name": "selection", "path": "/example/BrushContext/selection", - "checksum": "f18294ca6628abade024b202cdddda5d" + "checksum": "8e402f921a3d400a3424f2f39854460b" }, { "name": "separate-chart-(clip-data-y-axis)", @@ -1884,7 +1949,7 @@ { "name": "separate-chart-(filter-data)", "path": "/example/BrushContext/separate-chart-(filter-data)", - "checksum": "8a5179d8398eeb998e0963b2225844a0" + "checksum": "74505a768fad3e451cf8ab3f19e3f391" }, { "name": "simple-styling", @@ -2014,7 +2079,7 @@ { "name": "compound-separate-scales-with-stacked-charts-with-inverted-range-top-down", "path": "/example/Chart/compound-separate-scales-with-stacked-charts-with-inverted-range-top-down", - "checksum": "153be29a0fc7f299df128b61b2aa1a39" + "checksum": "bc400cfba22fef3d56536edc14c652cb" }, { "name": "data-chart-multi", @@ -2039,12 +2104,162 @@ { "name": "data-series-chart-data", "path": "/example/Chart/data-series-chart-data", - "checksum": "88167b58fbe8d1c9cb0b03ffeb2d1ae8" + "checksum": "14ed65c17658799f34c650f9ce7ad9b5" }, { "name": "data-series-separate-data", "path": "/example/Chart/data-series-separate-data", "checksum": "52fb678001b7f600236b138391ab8459" + }, + { + "name": "facet-annotation", + "path": "/example/Chart/facet-annotation", + "checksum": "bd42ae4cc58fd692854468feb27cec91" + }, + { + "name": "facet-bars", + "path": "/example/Chart/facet-bars", + "checksum": "2e45a3f2606a00f83372a20cb17965db" + }, + { + "name": "facet-brush", + "path": "/example/Chart/facet-brush", + "checksum": "88773d24e81f72b89c67e1173e818a39" + }, + { + "name": "facet-brush-band", + "path": "/example/Chart/facet-brush-band", + "checksum": "8224e5e6e7b86f6d0f5f170f6ac1ae29" + }, + { + "name": "facet-brush-overview", + "path": "/example/Chart/facet-brush-overview", + "checksum": "461eab36c19d5ab35372b7f7fd64cf98" + }, + { + "name": "facet-brush-summary", + "path": "/example/Chart/facet-brush-summary", + "checksum": "d95eccf0bfa460e3ff69ba7fa037f432" + }, + { + "name": "facet-brush-zoom", + "path": "/example/Chart/facet-brush-zoom", + "checksum": "2e16a5ad96c47b72e01f8f1ac61c53c6" + }, + { + "name": "facet-color", + "path": "/example/Chart/facet-color", + "checksum": "8aadfffeed684e652b0dd35538d650b5" + }, + { + "name": "facet-composed", + "path": "/example/Chart/facet-composed", + "checksum": "4b799788ff4011f49b14647958c65c63" + }, + { + "name": "facet-grid", + "path": "/example/Chart/facet-grid", + "checksum": "58252077eb28577ef35fb7808b8d7be6" + }, + { + "name": "facet-lines", + "path": "/example/Chart/facet-lines", + "checksum": "e87d664bb6c1d12443384c88d7ef978d" + }, + { + "name": "facet-non-faceted-marks", + "path": "/example/Chart/facet-non-faceted-marks", + "checksum": "3eb792945f5ba2521291230544ca61e3" + }, + { + "name": "facet-spacing", + "path": "/example/Chart/facet-spacing", + "checksum": "9b771f1c52b1169939b0c08c4187edca" + }, + { + "name": "facet-tooltip", + "path": "/example/Chart/facet-tooltip", + "checksum": "60477e105a22f7c2b4ba39c441b27813" + }, + { + "name": "facet-two-dimensional", + "path": "/example/Chart/facet-two-dimensional", + "checksum": "67b2707cea4563613827d908b5d00ead" + }, + { + "name": "facet-wrap", + "path": "/example/Chart/facet-wrap", + "checksum": "69505996e7d0fcf51d8d6e44202ae080" + }, + { + "name": "facet-x", + "path": "/example/Chart/facet-x", + "checksum": "d904bdf9019540528d8cf399d73a8509" + }, + { + "name": "facet-y", + "path": "/example/Chart/facet-y", + "checksum": "19d81cdbf281d26360989b8713f0495e" + }, + { + "name": "mixed-marks-with-stack", + "path": "/example/Chart/mixed-marks-with-stack", + "checksum": "02e00237acf4bdd1ce8cc96e9ca53cee" + }, + { + "name": "mixed-marks-with-stack-long-data", + "path": "/example/Chart/mixed-marks-with-stack-long-data", + "checksum": "4c7e352ea04ad55ae86c6a2d7a07ee0b" + } + ] + }, + { + "component": "ChartGroup", + "examples": [ + { + "name": "basic", + "path": "/example/ChartGroup/basic", + "checksum": "28b71aef9f71bafce5ad2d018e7798b6" + }, + { + "name": "coordinated-views", + "path": "/example/ChartGroup/coordinated-views", + "checksum": "5cbce39cb2b8071479b505ebb1f70525" + }, + { + "name": "faceted-group", + "path": "/example/ChartGroup/faceted-group", + "checksum": "c236c30435c26efa9ad7e171cadf7d29" + }, + { + "name": "highlight-only", + "path": "/example/ChartGroup/highlight-only", + "checksum": "058813ec4ed63dbca226945e177106c9" + }, + { + "name": "minimap", + "path": "/example/ChartGroup/minimap", + "checksum": "e0c4b228747af8983259bb6eadf74761" + }, + { + "name": "programmatic-control", + "path": "/example/ChartGroup/programmatic-control", + "checksum": "787d038bdabfbc057226b279dfc06c63" + }, + { + "name": "synced-brushes", + "path": "/example/ChartGroup/synced-brushes", + "checksum": "65e8b1d5ec4291c7f1865ac499dda55e" + }, + { + "name": "synced-legend", + "path": "/example/ChartGroup/synced-legend", + "checksum": "84f18ca994cb269398f479f3d143e623" + }, + { + "name": "synced-zoom", + "path": "/example/ChartGroup/synced-zoom", + "checksum": "239799a45aa84560dd962bbb2c643bf2" } ] }, @@ -2294,12 +2509,12 @@ { "name": "grouped-horizontal", "path": "/example/Dodge/grouped-horizontal", - "checksum": "f1b9a814453e1312edeff09ada82914e" + "checksum": "e790e3203800e0f4460775dca4fbb12e" }, { "name": "grouped-vertical", "path": "/example/Dodge/grouped-vertical", - "checksum": "508e467b3cbf22b9389ea3f21809546f" + "checksum": "966e09bba43c9390eb9181cdefee9ecc" }, { "name": "image-beeswarm", @@ -2589,12 +2804,12 @@ { "name": "transform-globe-constrain", "path": "/example/GeoPath/transform-globe-constrain", - "checksum": "47486d07f1743955477d7f0e97b90bb2" + "checksum": "993e218c9147b9d00209d83708139c0e" }, { "name": "transform-globe-inertia", "path": "/example/GeoPath/transform-globe-inertia", - "checksum": "126b25a293d26ffc1037a09a6d81e3c3" + "checksum": "5fecacd43d85a34ccc820d91bdc123b7" }, { "name": "transform-projection", @@ -2689,7 +2904,7 @@ { "name": "shapefile-preview", "path": "/example/GeoProjection/shapefile-preview", - "checksum": "f3002409d0332392fea5cd6a724caf9f" + "checksum": "45e4af8dd0b53425b9280585ef274a76" }, { "name": "topojson-preview", @@ -2994,7 +3209,7 @@ { "name": "ordinal", "path": "/example/Legend/ordinal", - "checksum": "fe76ccd3319eb1e9b6e9d828b6cb2b6e" + "checksum": "a405c2d33354a469a6607f54a426259c" }, { "name": "quantile", @@ -3221,6 +3436,11 @@ "path": "/example/LineChart/line-annotation", "checksum": "a357039106b62451b336363626fd8a19" }, + { + "name": "long-data", + "path": "/example/LineChart/long-data", + "checksum": "4f5d1d12cfbae23fe0a6a79e56c47889" + }, { "name": "motion-tween", "path": "/example/LineChart/motion-tween", @@ -3304,7 +3524,7 @@ { "name": "persist-brush-zoom", "path": "/example/LineChart/persist-brush-zoom", - "checksum": "46c20c5237705872fbb4ee89b68f3c3b" + "checksum": "d873abe0b483541cfa63d98d62afb7d2" }, { "name": "persist-series", @@ -3876,6 +4096,11 @@ "path": "/example/PieChart/legend-placement", "checksum": "8d48163a9216a5df893c287931c6371f" }, + { + "name": "legend-programmatic-control", + "path": "/example/PieChart/legend-programmatic-control", + "checksum": "665a47d97f2301064b392f41478deda2" + }, { "name": "legend-responsive", "path": "/example/PieChart/legend-responsive", @@ -4549,7 +4774,27 @@ { "name": "multiple-series-with-labels", "path": "/example/Spline/multiple-series-with-labels", - "checksum": "73756399058d03b152c38f56f56dcb29" + "checksum": "f06f9bc325357035f329e897e19bc3ab" + }, + { + "name": "parallel-coordinates", + "path": "/example/Spline/parallel-coordinates", + "checksum": "58ca2fb6190722d0f42ce1b2e4eb2e50" + }, + { + "name": "parallel-coordinates-brush", + "path": "/example/Spline/parallel-coordinates-brush", + "checksum": "d527860c31956707459e7fdf634afa7d" + }, + { + "name": "parallel-coordinates-faceted", + "path": "/example/Spline/parallel-coordinates-faceted", + "checksum": "ff366835c4701e9bf3237d11cc67793e" + }, + { + "name": "parallel-coordinates-mixed", + "path": "/example/Spline/parallel-coordinates-mixed", + "checksum": "f5820afbe1b82482cef9f66f45b2e1ee" }, { "name": "playground", @@ -4564,7 +4809,7 @@ { "name": "radial-multi-year-lines", "path": "/example/Spline/radial-multi-year-lines", - "checksum": "6ea2fc30eb6cf8c1bde981ec6c6bd6cf" + "checksum": "9b9611fc43c19c8db9ba27398a85e99d" }, { "name": "radial-radar", @@ -4576,6 +4821,11 @@ "path": "/example/Spline/stroke-grouping", "checksum": "4a768802b2277792449647f9513f790a" }, + { + "name": "stroke-grouping-with-legend", + "path": "/example/Spline/stroke-grouping-with-legend", + "checksum": "bbd2cea4ff6ca4f7feef53429e7881f1" + }, { "name": "tween-on-mount", "path": "/example/Spline/tween-on-mount", @@ -4756,6 +5006,11 @@ "path": "/example/Tooltip/portal-overflow", "checksum": "e5edffde1c2e358da7272edfa7fe0046" }, + { + "name": "programmatic-control", + "path": "/example/Tooltip/programmatic-control", + "checksum": "409c53c682916df0b7337eb46abedd4d" + }, { "name": "scatter-plot", "path": "/example/Tooltip/scatter-plot", @@ -4849,7 +5104,7 @@ { "name": "html-nodes", "path": "/example/Tree/html-nodes", - "checksum": "a36c2f5a7338f42fcc5c52eedc0d5455" + "checksum": "fd06d8fbc2b8ba68dd380dcd13cd6f1e" }, { "name": "playground", @@ -4989,7 +5244,7 @@ { "name": "custom-symbol", "path": "/example/Waffle/custom-symbol", - "checksum": "a05e90ca49f70df6c6488dee159a0028" + "checksum": "4a8e5402f981105751da2b6731bef6d4" }, { "name": "horizontal", @@ -5014,17 +5269,17 @@ { "name": "olympians-weight-by-sex", "path": "/example/Waffle/olympians-weight-by-sex", - "checksum": "2d69fc0af9f15ae2f614718b5f215f71" + "checksum": "c734584751a3757ff5e2c83c06705062" }, { "name": "penguins", "path": "/example/Waffle/penguins", - "checksum": "ef065e62cb62c09276f78791e5bd099b" + "checksum": "37ef784a8bbe188e85fa55277f51b28d" }, { "name": "stacked", "path": "/example/Waffle/stacked", - "checksum": "43378685d77bfc9eab6ef225b7483fe1" + "checksum": "b000d9cb4abd3055da6e49186bb39e65" }, { "name": "survey", diff --git a/docs/vite.config.ts b/docs/vite.config.ts index 772b633b6d..718325941a 100644 --- a/docs/vite.config.ts +++ b/docs/vite.config.ts @@ -13,7 +13,20 @@ export default defineConfig({ // which causes "Failed to fetch dynamically imported module" errors // Ref: https://github.com/vitest-dev/vitest/issues/5477 optimizeDeps: { - include: ['@layerstack/tailwind', '@layerstack/utils', 'svelte-ux'] + include: [ + '@layerstack/tailwind', + '@layerstack/utils', + 'svelte-ux', + // LayerChart `import()`s these lazily, so Vite only discovers them the first time an + // interaction reaches them (ex. hovering a `quadtree` tooltip). That triggers a + // re-optimization mid-interaction and the in-flight import fails, leaving the feature + // dead until reload — tooltips being the visible symptom. + // Referenced through `layerchart` since `docs` doesn't depend on them directly + 'layerchart > d3-quadtree', + 'layerchart > d3-chord', + 'd3-shape', + 'layerchart > d3-interpolate-path' + ] }, plugins: [ tailwindcss(), diff --git a/package.json b/package.json index f6ea9d91ed..c21a3d9a6a 100644 --- a/package.json +++ b/package.json @@ -6,7 +6,7 @@ "type": "module", "homepage": "https://layerchart.com", "scripts": { - "dev": "pnpm --parallel --filter layerchart --filter docs dev", + "dev": "pnpm --filter layerchart package && pnpm --parallel --filter layerchart --filter docs dev", "test:unit": "pnpm -r test:unit", "build:packages": "rimraf packages/*/dist && pnpm --filter './packages/*' build", "build:examples": "rimraf packages/*/dist && pnpm --filter './packages/*' package && pnpm --filter './examples/*' build", @@ -32,10 +32,5 @@ "rimraf": "6.1.3", "wrangler": "^4.97.0" }, - "packageManager": "pnpm@10.18.2", - "pnpm": { - "onlyBuiltDependencies": [ - "esbuild" - ] - } + "packageManager": "pnpm@10.18.2" } diff --git a/packages/layerchart/package.json b/packages/layerchart/package.json index 3012cb251f..784008824a 100644 --- a/packages/layerchart/package.json +++ b/packages/layerchart/package.json @@ -10,7 +10,7 @@ "dev": "pnpm package:watch", "build": "svelte-package", "package": "svelte-package", - "package:watch": "svelte-package --watch", + "package:watch": "svelte-package --watch --preserve-output", "prepublishOnly": "svelte-package", "check": "svelte-check --tsconfig ./tsconfig.json", "check:watch": "svelte-check --tsconfig ./tsconfig.json --watch", diff --git a/packages/layerchart/src/lib/attachments/brushable.ts b/packages/layerchart/src/lib/attachments/brushable.ts new file mode 100644 index 0000000000..e1c669b675 --- /dev/null +++ b/packages/layerchart/src/lib/attachments/brushable.ts @@ -0,0 +1,181 @@ +import type { BrushState } from '$lib/states/brush.svelte.js'; +import { scaleInvert, type AnyScale } from '$lib/utils/scales.svelte.js'; + +/** What a drag does to the selection */ +export type BrushMode = 'create' | 'move' | 'top' | 'bottom' | 'left' | 'right'; + +export type BrushableOptions = { + /** The selection this gesture drives. Each element gets its own. */ + state: BrushState; + + /** The axis the drag reads. Defaults to the state's own `axis`. */ + axis?: 'x' | 'y' | 'both'; + + /** + * Force what the drag does, rather than picking by where it starts. + * + * Set this on an element that *is* one part of the brush — a resize handle takes its own edge — + * leaving the automatic behaviour to a single element covering the whole region. + */ + mode?: BrushMode; + + /** + * The element defining the coordinate space, when it isn't the one being dragged. + * + * A brush's selection and handles are small elements *within* the brushable region, so they + * measure against the region rather than themselves. Given the dragged element, for the cases + * that can only resolve the space once the drag starts — a canvas layer knows its element only + * from the event. + */ + bounds?: (node: Element) => { left: number; top: number } | undefined; + + /** + * The pixel origin values are measured from, given the pointer's offset within the element. + * Defaults to the element's own box; return `null` to ignore the gesture. + * + * A faceted chart uses this to measure from the panel the drag started in. + */ + origin?: (offset: { x: number; y: number }) => { x: number; y: number } | null; + + /** Distance from an edge, in pixels, that resizes rather than starting a new selection @default 6 */ + edgeSize?: number; + + /** A drag shorter than this, in pixels, clears the selection instead @default 2 */ + clearThreshold?: number; + + /** Called as the selection changes, and once more when the gesture ends */ + onChange?: (detail: { state: BrushState; phase: 'start' | 'brush' | 'end' }) => void; +}; + +/** + * Makes an element brushable, driving the `BrushState` it's given. + * + * A chart's `brush` prop covers the plot area and owns one selection. This is the same gesture — + * drag to select, drag the middle to move it, drag an edge to resize, click to clear — attached to + * an element you place yourself, so a chart can carry several independent selections: one per axis + * of a parallel coordinates plot, say. + * + * The element's box *is* the brushable region (`d3-brush` calls this the `extent`), and is assumed + * to line up with the plot area on the brushed axis — which is what a full-height axis overlay does. + * + * ```svelte + * + * ``` + */ +export function brushable(options: BrushableOptions) { + const onPointerDown = brushGesture(options); + + return (node: SVGElement | HTMLElement) => { + const handler = (event: PointerEvent) => onPointerDown(event, node); + node.addEventListener('pointerdown', handler as EventListener); + return () => node.removeEventListener('pointerdown', handler as EventListener); + }; +} + +/** + * The brush gesture as a `pointerdown` handler, for where an attachment can't reach. + * + * A canvas layer draws its marks rather than creating elements for them, so it hit-tests the + * pointer and calls the handler the mark registered — there's no node to attach to. Prefer + * {@link brushable} anywhere there is one. + */ +export function brushGesture(options: BrushableOptions) { + return function onPointerDown(event: PointerEvent, target?: Element) { + // A brush's parts nest — the selection and its handles sit inside the region that creates a + // new one — so the innermost takes the drag rather than every ancestor also claiming it + event.stopPropagation(); + + const node = target ?? (event.currentTarget as Element); + if (!node) return; + + const { state, edgeSize = 6, clearThreshold = 2, onChange } = options; + const axis = options.axis ?? state.axis; + const ctx = state.ctx; + if (!ctx) return; + + const bounds = options.bounds?.(node) ?? node.getBoundingClientRect(); + const offset = { x: event.clientX - bounds.left, y: event.clientY - bounds.top }; + + const origin = options.origin ? options.origin(offset) : { x: 0, y: 0 }; + if (!origin) return; + + /** The pointer as a value on each brushed axis */ + // `BrushChartContext` types its scales as callables; `scaleInvert` wants the full scale, + // which is what a chart always passes + const valueAt = (e: { clientX: number; clientY: number }) => ({ + x: scaleInvert(ctx.xScale as AnyScale, e.clientX - bounds.left - origin.x), + y: scaleInvert(ctx.yScale as AnyScale, e.clientY - bounds.top - origin.y), + }); + + // Where the drag starts decides what it does, as `d3-brush` does: an edge resizes, the + // middle moves the selection, and anywhere else starts a new one + const range = state.range; + const near = (a: number, b: number) => Math.abs(a - b) < edgeSize; + + let mode: BrushMode = options.mode ?? 'create'; + if (!options.mode && state.active) { + const insideY = offset.y > range.y && offset.y < range.y + range.height; + const insideX = offset.x > range.x && offset.x < range.x + range.width; + + if (axis !== 'x' && near(offset.y, range.y)) mode = 'top'; + else if (axis !== 'x' && near(offset.y, range.y + range.height)) mode = 'bottom'; + else if (axis !== 'y' && near(offset.x, range.x)) mode = 'left'; + else if (axis !== 'y' && near(offset.x, range.x + range.width)) mode = 'right'; + else if (insideX && insideY) mode = 'move'; + } + + const start = { + x: [state.x[0] ?? state.xDomainMin, state.x[1] ?? state.xDomainMax] as [any, any], + y: [state.y[0] ?? state.yDomainMin, state.y[1] ?? state.yDomainMax] as [any, any], + value: valueAt(event), + }; + + // Best effort — a synthesized event has no active pointer to capture, and the window + // listeners below carry the drag either way (including past the element's own bounds) + try { + node.setPointerCapture(event.pointerId); + } catch { + // ignore + } + onChange?.({ state, phase: 'start' }); + + /** + * Whether this gesture is a drag rather than a click. + * + * Tracked as "moved at all", not as the distance between press and release — dragging a + * selection away and back again is still a drag, and must not clear it. + */ + let dragged = false; + + function onPointerMove(e: PointerEvent) { + if (Math.hypot(e.clientX - event.clientX, e.clientY - event.clientY) >= clearThreshold) { + dragged = true; + } + + const value = valueAt(e); + if (mode === 'create') state.setRange(start.value, value); + else if (mode === 'move') state.moveRange(start, value); + else state.adjustEdge(mode, start, value); + + onChange?.({ state, phase: 'brush' }); + } + + function onPointerUp() { + // Clicking the region rather than dragging it clears the selection. Only the region — a + // click that lands on the selection or a handle is a grab the pointer never followed + // through on, and throwing the selection away for it would be its own surprise. + if (clearThreshold > 0 && !dragged && mode === 'create') { + state.reset(); + // Clearing *is* a change, and a click produces no `pointermove` to report one — so say so + // here, or a listener watching the selection would never hear that it emptied + onChange?.({ state, phase: 'brush' }); + } + + window.removeEventListener('pointermove', onPointerMove as EventListener); + onChange?.({ state, phase: 'end' }); + } + + window.addEventListener('pointermove', onPointerMove as EventListener); + window.addEventListener('pointerup', onPointerUp, { once: true }); + }; +} diff --git a/packages/layerchart/src/lib/attachments/index.ts b/packages/layerchart/src/lib/attachments/index.ts new file mode 100644 index 0000000000..efca9cf4df --- /dev/null +++ b/packages/layerchart/src/lib/attachments/index.ts @@ -0,0 +1 @@ +export * from './brushable.js'; diff --git a/packages/layerchart/src/lib/components/AnnotationLine/AnnotationLine.base.svelte b/packages/layerchart/src/lib/components/AnnotationLine/AnnotationLine.base.svelte index cb5a29087f..14e52056ee 100644 --- a/packages/layerchart/src/lib/components/AnnotationLine/AnnotationLine.base.svelte +++ b/packages/layerchart/src/lib/components/AnnotationLine/AnnotationLine.base.svelte @@ -23,6 +23,7 @@ y1: y1Prop, x2: x2Prop, y2: y2Prop, + seriesKey, label, labelPlacement = 'top-right', labelXOffset = 0, @@ -34,12 +35,39 @@ const isVertical = $derived(x != null || (x1Prop != null && x2Prop != null && x1Prop === x2Prop)); + /** + * Each end read against its series' stacked segment, at the category that end sits on. + * + * A rule spanning the plot (a `y` with no `x`) has no single category to read against, so it + * is left where it was asked for. + */ + const stacked = $derived.by(() => { + if (seriesKey == null || !ctx.isStacked) return { x1: x1Prop, y1: y1Prop, x2: x2Prop, y2: y2Prop, x, y }; // prettier-ignore + + const at = (value: any, keyValue: any) => + keyValue == null ? value : ctx.stackedValue(seriesKey, keyValue, value); + + return ctx.valueAxis === 'y' + ? { + x1: x1Prop, x2: x2Prop, x, + y1: at(y1Prop, x1Prop ?? x), y2: at(y2Prop, x2Prop ?? x), y: at(y, x), + } // prettier-ignore + : { + y1: y1Prop, y2: y2Prop, y, + x1: at(x1Prop, y1Prop ?? y), x2: at(x2Prop, y2Prop ?? y), x: at(x, y), + }; // prettier-ignore + }); + const line = $derived({ - x1: x1Prop != null ? ctx.xScale(x1Prop) : x != null ? ctx.xScale(x) : ctx.xRange[0], + x1: stacked.x1 != null ? ctx.xScale(stacked.x1) : stacked.x != null ? ctx.xScale(stacked.x) : ctx.xRange[0], // prettier-ignore y1: - y1Prop != null ? ctx.yScale(y1Prop) : y != null && x == null ? ctx.yScale(y) : ctx.yRange[0], - x2: x2Prop != null ? ctx.xScale(x2Prop) : x != null ? ctx.xScale(x) : ctx.xRange[1], - y2: y2Prop != null ? ctx.yScale(y2Prop) : y != null ? ctx.yScale(y) : ctx.yRange[1], + stacked.y1 != null + ? ctx.yScale(stacked.y1) + : stacked.y != null && stacked.x == null + ? ctx.yScale(stacked.y) + : ctx.yRange[0], + x2: stacked.x2 != null ? ctx.xScale(stacked.x2) : stacked.x != null ? ctx.xScale(stacked.x) : ctx.xRange[1], // prettier-ignore + y2: stacked.y2 != null ? ctx.yScale(stacked.y2) : stacked.y != null ? ctx.yScale(stacked.y) : ctx.yRange[1], // prettier-ignore }); const isSloped = $derived(!isVertical && line.x1 !== line.x2 && line.y1 !== line.y2); diff --git a/packages/layerchart/src/lib/components/AnnotationLine/AnnotationLine.shared.svelte.ts b/packages/layerchart/src/lib/components/AnnotationLine/AnnotationLine.shared.svelte.ts index c5d26dd761..70848d1f12 100644 --- a/packages/layerchart/src/lib/components/AnnotationLine/AnnotationLine.shared.svelte.ts +++ b/packages/layerchart/src/lib/components/AnnotationLine/AnnotationLine.shared.svelte.ts @@ -9,6 +9,13 @@ import type { Placement } from '../types.js'; export type AnnotationLinePropsWithoutHTML = { x?: SingleDomainType; y?: SingleDomainType; + /** + * The series this annotation belongs to. + * + * `ChartAnnotations` hides it while another series is highlighted, and a value on the chart's + * value axis is read against that series' stacked segment rather than taken as-is. + */ + seriesKey?: string; x1?: SingleDomainType; y1?: SingleDomainType; x2?: SingleDomainType; diff --git a/packages/layerchart/src/lib/components/AnnotationPoint/AnnotationPoint.base.svelte b/packages/layerchart/src/lib/components/AnnotationPoint/AnnotationPoint.base.svelte index 1b902155a3..5cf9e3e4e3 100644 --- a/packages/layerchart/src/lib/components/AnnotationPoint/AnnotationPoint.base.svelte +++ b/packages/layerchart/src/lib/components/AnnotationPoint/AnnotationPoint.base.svelte @@ -37,6 +37,7 @@ labelYOffset = 0, labelX, labelY, + seriesKey, fontSize = 12, labelGap = 2, link, @@ -47,15 +48,21 @@ const ctx = getChartContext(); const geo = getGeoContext(); + // Over a stack the point sits on its series' running total, not on the series' own value + const stackedX = $derived(ctx.valueAxis === 'x' ? ctx.stackedValue(seriesKey, y, x) : x); + const stackedY = $derived(ctx.valueAxis === 'y' ? ctx.stackedValue(seriesKey, x, y) : y); + const point = $derived.by(() => { if (geo.projection && typeof x === 'number' && typeof y === 'number') { const [px, py] = geo.projection([x, y]) ?? [0, 0]; return { x: px, y: py }; } return { - x: x ? ctx.xScale(x) + (isScaleBand(ctx.xScale) ? ctx.xScale.bandwidth() / 2 : 0) : 0, - y: y - ? ctx.yScale(y) + (isScaleBand(ctx.yScale) ? ctx.yScale.bandwidth() / 2 : 0) + x: stackedX + ? ctx.xScale(stackedX) + (isScaleBand(ctx.xScale) ? ctx.xScale.bandwidth() / 2 : 0) + : 0, + y: stackedY + ? ctx.yScale(stackedY) + (isScaleBand(ctx.yScale) ? ctx.yScale.bandwidth() / 2 : 0) : ctx.height, }; }); diff --git a/packages/layerchart/src/lib/components/AnnotationPoint/AnnotationPoint.shared.svelte.ts b/packages/layerchart/src/lib/components/AnnotationPoint/AnnotationPoint.shared.svelte.ts index 4076a9d28c..a88877bcb4 100644 --- a/packages/layerchart/src/lib/components/AnnotationPoint/AnnotationPoint.shared.svelte.ts +++ b/packages/layerchart/src/lib/components/AnnotationPoint/AnnotationPoint.shared.svelte.ts @@ -12,6 +12,13 @@ export type AnnotationPointPropsWithoutHTML = { x?: SingleDomainType; /** y value of the point */ y?: SingleDomainType; + /** + * The series this annotation belongs to. + * + * `ChartAnnotations` hides it while another series is highlighted, and a value on the chart's + * value axis is read against that series' stacked segment rather than taken as-is. + */ + seriesKey?: string; /** Radius of the circle */ r?: number; /** Label to display on circle */ diff --git a/packages/layerchart/src/lib/components/AnnotationRange/AnnotationRange.shared.svelte.ts b/packages/layerchart/src/lib/components/AnnotationRange/AnnotationRange.shared.svelte.ts index 9ae9f555af..6c84941091 100644 --- a/packages/layerchart/src/lib/components/AnnotationRange/AnnotationRange.shared.svelte.ts +++ b/packages/layerchart/src/lib/components/AnnotationRange/AnnotationRange.shared.svelte.ts @@ -11,6 +11,14 @@ import type { Placement } from '../types.js'; export type AnnotationRangePropsWithoutHTML = { x?: [SingleDomainType, SingleDomainType] | SingleDomainType[]; y?: [SingleDomainType, SingleDomainType] | SingleDomainType[]; + /** + * The series this annotation belongs to. `ChartAnnotations` hides it while another series is + * highlighted. + * + * Unlike `AnnotationPoint` / `AnnotationLine`, the bounds are left as given over a stack: a + * range spans two values, and which segment each end belongs to is ambiguous. + */ + seriesKey?: string; label?: string; labelPlacement?: Placement; labelXOffset?: number; diff --git a/packages/layerchart/src/lib/components/Area/Area.base.svelte b/packages/layerchart/src/lib/components/Area/Area.base.svelte index a460a93fa2..8ae87d70b1 100644 --- a/packages/layerchart/src/lib/components/Area/Area.base.svelte +++ b/packages/layerchart/src/lib/components/Area/Area.base.svelte @@ -22,12 +22,16 @@ defined, fill, stroke = 'none', + opacity, + // Pulled out of `restProps` so the resolved values win over the raw props + class: className, line = false, pathData, motion, x, y0, y1, + z, seriesKey, ...restProps }: AreaBaseProps = $props(); @@ -40,34 +44,63 @@ defined, fill, stroke, + opacity, + class: className, line, pathData, motion, x, y0, y1, + z, seriesKey, }) as AreaProps ); -{#if line} - + {#each c.areas as area, i (i)} + {#if line} + + {/if} + + + {/each} +{:else} + {#if line} + + {/if} + + {/if} - - diff --git a/packages/layerchart/src/lib/components/Area/Area.shared.svelte.ts b/packages/layerchart/src/lib/components/Area/Area.shared.svelte.ts index d58e5931cf..9117b9f082 100644 --- a/packages/layerchart/src/lib/components/Area/Area.shared.svelte.ts +++ b/packages/layerchart/src/lib/components/Area/Area.shared.svelte.ts @@ -1,11 +1,18 @@ import type { ComponentProps } from 'svelte'; import type { SVGAttributes } from 'svelte/elements'; import { type Area as D3Area, area as d3Area, areaRadial, type CurveFactory } from 'd3-shape'; -import { min } from 'd3-array'; +import { group as d3Group, min } from 'd3-array'; import { interpolatePath } from 'd3-interpolate-path'; import type { CommonStyleProps, Without } from '$lib/utils/types.js'; import { accessor, type Accessor } from '$lib/utils/common.js'; +import { + colorPropDataKey, + resolveColorProp, + resolveStyleProp, + type ColorProp, + type StyleProp, +} from '$lib/utils/dataProp.js'; import { isScaleBand } from '$lib/utils/scales.svelte.js'; import { flattenPathData } from '$lib/utils/path.js'; import { @@ -15,6 +22,7 @@ import { type ResolvedMotion, } from '$lib/utils/motion.svelte.js'; import { getChartContext } from '$lib/contexts/chart.js'; +import { getMarkData } from '$lib/contexts/facet.js'; import type { ChartState } from '$lib/states/chart.svelte.js'; import type Spline from '../Spline/Spline.svelte'; import type { PathProps } from '../Path/Path.shared.svelte.js'; @@ -30,6 +38,14 @@ export type AreaPropsWithoutHTML = { y0?: Accessor; /** Override y1 accessor. Defaults to y accessor */ y1?: Accessor; + /** + * Group the data into a separate area per distinct value, drawing them all from this one mark. + * Defaults to the Chart's `z` accessor, then to the data property named by `fill` / `stroke`. + * + * Replaces grouping the data and rendering an `Area` per group — which registers a mark, and + * rebuilds the chart's domains, once per area. + */ + z?: Accessor; /** Series key to use for accessor. */ seriesKey?: string; /** Whether to tween the interpolated path data using d3-interpolate-path */ @@ -38,7 +54,15 @@ export type AreaPropsWithoutHTML = { defined?: Parameters['defined']>[0]; /** Enable showing line @default false */ line?: boolean | Partial>; -} & Omit; + /** Fill color, the name of a data property (resolved via the chart's `c` scale), or a function. */ + fill?: ColorProp; + /** Stroke color, the name of a data property, or a function. */ + stroke?: ColorProp; + /** Opacity, or a function returning it per area. */ + opacity?: StyleProp; + /** CSS class name(s), or a function returning them per area. */ + class?: StyleProp; +} & Omit; export type AreaProps = AreaPropsWithoutHTML & Without, AreaPropsWithoutHTML>; @@ -59,6 +83,8 @@ export class AreaState { ctx: ChartState = getChartContext(); + markData = getMarkData(); + #tweenState!: ReturnType>; constructor(getProps: () => AreaProps) { @@ -76,6 +102,7 @@ export class AreaState { y: p.y1 ?? p.y0, seriesKey: p.seriesKey, color: p.fill as string | undefined, + stacks: p.y1 == null && p.y0 == null, }; }, }); @@ -101,12 +128,13 @@ export class AreaState { this.series?.value ?? (this.series?.data ? undefined : this.series?.key) ); - stackAccessors = $derived.by(() => { - const seriesKey = this.#props.seriesKey; - return seriesKey && this.ctx.series.isStacked - ? this.ctx.series.getStackAccessors(seriesKey) - : null; - }); + stackAccessors = $derived.by(() => + this.ctx.stackAccessorsFor({ + seriesKey: this.#props.seriesKey, + ownData: this.#props.data != null, + stacksImplicitly: true, + }) + ); xAccessor = $derived.by(() => { const x = this.#props.x; @@ -137,7 +165,69 @@ export class AreaState { return this.ctx.y; }); - resolvedData = $derived(this.#props.data ?? this.seriesData ?? this.ctx.data); + resolvedData = $derived(this.markData(this.#props.data ?? this.seriesData)); + + /** + * Accessor grouping the data into one area per distinct value, or `null` for a single area. + * Mirrors `Spline` — see its `zAccessor` for why the chart's raw `z` prop is the honest check. + */ + zAccessor = $derived.by<((d: any) => any) | null>(() => { + const props = this.#props; + const z = props.z ?? this.ctx.props.z; + if (z != null) return accessor(z); + + const first = this.resolvedData?.[0]; + const implied = colorPropDataKey(props.fill, first) ?? colorPropDataKey(props.stroke, first); + if (implied != null) return accessor(implied); + + if (props.data != null || this.seriesData != null) return null; + return first != null && this.ctx.cKey(first) != null ? this.ctx.cKey : null; + }); + + /** + * The chart's `c` channel as the colour, when `c` is what names the groups — the areas split by + * it would otherwise all come out in the series' one colour. + */ + #colorFromC(d: any) { + return d != null && this.ctx.cKey(d) != null ? this.ctx.cGet(d) : undefined; + } + + /** + * One entry per area, with its own path and styles — or `null` when there's no grouping, which + * leaves the single-path (and tweenable) branch in place. + */ + areas = $derived.by(() => { + if (!this.zAccessor || this.#props.pathData) return null; + const props = this.#props; + + return Array.from(d3Group(this.resolvedData, this.zAccessor).values()).map((data) => ({ + data, + d: this.#buildPath(data), + // Styles are uniform across an area, so they resolve from its first point + fill: + resolveColorProp(props.fill, data[0], this.ctx.cScale) ?? + this.#colorFromC(data[0]) ?? + this.series?.color, + stroke: resolveColorProp(props.stroke, data[0], this.ctx.cScale), + opacity: resolveStyleProp(props.opacity, data[0]), + class: resolveStyleProp(props.class, data[0]), + })); + }); + + /** `fill` / `stroke` / `class` for the ungrouped case, resolved the same way */ + resolvedFill = $derived( + resolveColorProp(this.#props.fill, this.resolvedData?.[0], this.ctx.cScale) ?? + this.#colorFromC(this.resolvedData?.[0]) ?? + this.series?.color + ); + resolvedStroke = $derived( + resolveColorProp(this.#props.stroke, this.resolvedData?.[0], this.ctx.cScale) + ); + // Annotated for the same reason as `Spline`'s — see there + resolvedClass = $derived( + resolveStyleProp(this.#props.class, this.resolvedData?.[0]) as string | undefined + ); + resolvedOpacity = $derived(resolveStyleProp(this.#props.opacity, this.resolvedData?.[0])); xOffset = $derived(isScaleBand(this.ctx.xScale) ? this.ctx.xScale.bandwidth() / 2 : 0); yOffset = $derived(isScaleBand(this.ctx.yScale) ? this.ctx.yScale.bandwidth() / 2 : 0); @@ -169,7 +259,7 @@ export class AreaState { return ''; } - d = $derived.by(() => { + #buildPath(data: any[]): string { const props = this.#props; const _path = this.ctx.radial ? areaRadial() @@ -186,7 +276,11 @@ export class AreaState { ); if (props.curve) _path.curve(props.curve); - return props.pathData ?? _path(this.resolvedData) ?? ''; + return _path(data) ?? ''; + } + + d = $derived.by(() => { + return this.#props.pathData ?? this.#buildPath(this.resolvedData); }); get tweenedPath() { diff --git a/packages/layerchart/src/lib/components/Area/Area.svelte.test.ts b/packages/layerchart/src/lib/components/Area/Area.svelte.test.ts new file mode 100644 index 0000000000..4ea2c8f24e --- /dev/null +++ b/packages/layerchart/src/lib/components/Area/Area.svelte.test.ts @@ -0,0 +1,116 @@ +import { describe, expect, it } from 'vitest'; +import { render } from 'vitest-browser-svelte'; + +import TestHarness from '../tests/TestHarness.svelte'; +import Area from './Area.svelte'; + +/** Two series interleaved in one flat array, as long-format data arrives */ +const data = [ + { group: 'a', date: new Date('2024-01-01'), value: 10 }, + { group: 'b', date: new Date('2024-01-01'), value: 50 }, + { group: 'a', date: new Date('2024-02-01'), value: 20 }, + { group: 'b', date: new Date('2024-02-01'), value: 60 }, + { group: 'a', date: new Date('2024-03-01'), value: 30 }, + { group: 'b', date: new Date('2024-03-01'), value: 70 }, +]; + +const chartProps = (extra: Record = {}) => ({ + data, + x: 'date', + y: 'value', + yDomain: [0, 100], + ...extra, +}); + +/** Only the area paths — `line` adds a Spline path alongside each */ +function areaPaths() { + return Array.from(document.querySelectorAll('svg path.lc-area-path')); +} + +describe('Area', () => { + describe('z (grouping)', () => { + it('draws one area per group from a single mark', async () => { + render(TestHarness, { + component: Area, + chartProps: chartProps(), + componentProps: { z: 'group' }, + }); + + await expect.poll(() => areaPaths().length).toBe(2); + }); + + it('draws a single area without it', async () => { + render(TestHarness, { + component: Area, + chartProps: chartProps(), + componentProps: {}, + }); + + await expect.poll(() => areaPaths().length).toBe(1); + }); + + it('falls back to the chart`s `z` accessor', async () => { + render(TestHarness, { + component: Area, + chartProps: chartProps({ z: 'group' }), + componentProps: {}, + }); + + await expect.poll(() => areaPaths().length).toBe(2); + }); + + it('is implied by a `fill` naming a data property', async () => { + render(TestHarness, { + component: Area, + chartProps: chartProps({ c: 'group', cRange: ['rgb(255, 0, 0)', 'rgb(0, 0, 255)'] }), + componentProps: { fill: 'group' }, + }); + + await expect.poll(() => areaPaths().length).toBe(2); + expect(areaPaths().map((p) => p.getAttribute('fill'))).toEqual([ + 'rgb(255, 0, 0)', + 'rgb(0, 0, 255)', + ]); + }); + + it('is not implied by a CSS color', async () => { + render(TestHarness, { + component: Area, + chartProps: chartProps(), + componentProps: { fill: 'var(--color-info)' }, + }); + + await expect.poll(() => areaPaths().length).toBe(1); + expect(areaPaths()[0].getAttribute('fill')).toBe('var(--color-info)'); + }); + + it('draws a line per group when `line` is enabled', async () => { + render(TestHarness, { + component: Area, + chartProps: chartProps(), + componentProps: { z: 'group', line: true }, + }); + + await expect.poll(() => areaPaths().length).toBe(2); + await expect.poll(() => document.querySelectorAll('svg path.lc-area-line').length).toBe(2); + }); + }); + + describe('class', () => { + it('resolves per area when given a function', async () => { + render(TestHarness, { + component: Area, + chartProps: chartProps(), + componentProps: { + z: 'group', + class: (d: any) => (d.group === 'a' ? 'first-area' : 'second-area'), + }, + }); + + await expect.poll(() => areaPaths().length).toBe(2); + const classes = areaPaths().map((p) => p.getAttribute('class')); + expect(classes[0]).toContain('first-area'); + expect(classes[1]).toContain('second-area'); + }); + }); +}); diff --git a/packages/layerchart/src/lib/components/Axis/Axis.base.svelte b/packages/layerchart/src/lib/components/Axis/Axis.base.svelte index 5b11d4073f..63932d27bc 100644 --- a/packages/layerchart/src/lib/components/Axis/Axis.base.svelte +++ b/packages/layerchart/src/lib/components/Axis/Axis.base.svelte @@ -54,6 +54,7 @@ classes = {}, class: className, tickLabel, + facetAll, ...restProps }: AxisBaseProps = $props(); @@ -78,86 +79,97 @@ motion, scale, classes, + facetAll, }) as AxisProps ); - - {#if rule !== false} - - {/if} - - {#if typeof label === 'function'} - {@render label({ props: c.resolvedLabelProps })} - {:else if label} - - {/if} - - {#each c.tickItems as item, index (item.key)} - - {#if grid !== false} - - {/if} - - {#if tickMarks} - {@const tickClasses = cls('lc-axis-tick', classes.tick)} - {#if c.orientation === 'horizontal'} - + {#if rule !== false} + + {/if} + + {#if typeof label === 'function'} + {@render label({ props: c.resolvedLabelProps })} + {:else if label} + + {/if} + + {#each c.tickItems as item, index (item.key)} + + {#if grid !== false} + - {:else if c.orientation === 'vertical'} - - {:else if c.orientation === 'angle'} - {/if} - {/if} - - {#if tickLabel} - {@render tickLabel({ props: item.tickLabelProps, index })} - {:else} - - {/if} - - {/each} - + + {#if tickMarks} + {@const tickClasses = cls('lc-axis-tick', classes.tick)} + {#if c.orientation === 'horizontal'} + + {:else if c.orientation === 'vertical'} + + {:else if c.orientation === 'angle'} + + {/if} + {/if} + + {#if tickLabel} + {@render tickLabel({ props: item.tickLabelProps, index })} + {:else} + + {/if} + + {/each} + +{/if} diff --git a/packages/layerchart/src/lib/components/Brush/Brush.canvas.svelte b/packages/layerchart/src/lib/components/Brush/Brush.canvas.svelte new file mode 100644 index 0000000000..6bf60bf13b --- /dev/null +++ b/packages/layerchart/src/lib/components/Brush/Brush.canvas.svelte @@ -0,0 +1,12 @@ + + + + + diff --git a/packages/layerchart/src/lib/components/Brush/Brush.html.svelte b/packages/layerchart/src/lib/components/Brush/Brush.html.svelte new file mode 100644 index 0000000000..a3dc3c84b2 --- /dev/null +++ b/packages/layerchart/src/lib/components/Brush/Brush.html.svelte @@ -0,0 +1,12 @@ + + + + + diff --git a/packages/layerchart/src/lib/components/Brush/Brush.svelte b/packages/layerchart/src/lib/components/Brush/Brush.svelte new file mode 100644 index 0000000000..bd3dda1fbf --- /dev/null +++ b/packages/layerchart/src/lib/components/Brush/Brush.svelte @@ -0,0 +1,23 @@ + + + + +{#if layerCtx === 'canvas'} + +{:else if layerCtx === 'html'} + +{:else} + +{/if} diff --git a/packages/layerchart/src/lib/components/Brush/Brush.svelte.test.ts b/packages/layerchart/src/lib/components/Brush/Brush.svelte.test.ts new file mode 100644 index 0000000000..8eaacdbd76 --- /dev/null +++ b/packages/layerchart/src/lib/components/Brush/Brush.svelte.test.ts @@ -0,0 +1,70 @@ +import { describe, expect, it, vi } from 'vitest'; +import { render } from 'vitest-browser-svelte'; + +import BrushMarkHarness from '../tests/BrushMarkHarness.svelte'; + +describe('Brush', () => { + describe('touch', () => { + // A touch drag the browser reads as a scroll pans the page and cancels the pointer stream + // part-way, so the brush never completes. `touch-action: none` is what tells it otherwise — + // `BrushContext` sets the same on its container. + it('takes touch drags rather than letting them scroll the page', async () => { + const { container } = render(BrushMarkHarness, {}); + + const region = await vi.waitFor(() => { + const el = container.querySelector('.lc-brush-root'); + expect(el).not.toBeNull(); + return el as Element; + }); + + expect(getComputedStyle(region).touchAction).toBe('none'); + }); + + it('does the same on an html layer', async () => { + const { container } = render(BrushMarkHarness, { layer: 'html' } as any); + + const region = await vi.waitFor(() => { + const el = container.querySelector('.lc-brush-root'); + expect(el).not.toBeNull(); + return el as Element; + }); + + expect(getComputedStyle(region).touchAction).toBe('none'); + }); + + it('keeps the selection and its handles draggable by touch too', async () => { + const { container } = render(BrushMarkHarness, { + brushProps: { state: undefined }, + } as any); + + const region = await vi.waitFor(() => { + const el = container.querySelector('.lc-brush-root') as HTMLElement; + expect(el).not.toBeNull(); + return el; + }); + + // Draw a selection so the selection rect and handles exist + const rect = region.getBoundingClientRect(); + const at = (x: number) => ({ + bubbles: true, + clientX: rect.x + x, + clientY: rect.y + rect.height / 2, + pointerId: 1, + }); + region.dispatchEvent(new PointerEvent('pointerdown', at(rect.width * 0.2))); + window.dispatchEvent(new PointerEvent('pointermove', at(rect.width * 0.6))); + window.dispatchEvent(new PointerEvent('pointerup', at(rect.width * 0.6))); + + const selection = await vi.waitFor(() => { + const el = container.querySelector('.lc-brush-selection'); + expect(el).not.toBeNull(); + return el as Element; + }); + + expect(getComputedStyle(selection).touchAction).toBe('none'); + for (const handle of container.querySelectorAll('.lc-brush-handle')) { + expect(getComputedStyle(handle).touchAction).toBe('none'); + } + }); + }); +}); diff --git a/packages/layerchart/src/lib/components/Brush/Brush.svg.svelte b/packages/layerchart/src/lib/components/Brush/Brush.svg.svelte new file mode 100644 index 0000000000..e08e5b04bf --- /dev/null +++ b/packages/layerchart/src/lib/components/Brush/Brush.svg.svelte @@ -0,0 +1,12 @@ + + + + + diff --git a/packages/layerchart/src/lib/components/BrushContext.svelte b/packages/layerchart/src/lib/components/BrushContext.svelte index 023fb638fb..f4638a8f67 100644 --- a/packages/layerchart/src/lib/components/BrushContext.svelte +++ b/packages/layerchart/src/lib/components/BrushContext.svelte @@ -121,12 +121,10 @@ + + + +{@render children?.({ group })} diff --git a/packages/layerchart/src/lib/components/Circle/Circle.shared.svelte.ts b/packages/layerchart/src/lib/components/Circle/Circle.shared.svelte.ts index 7a4d4742dc..1563eec254 100644 --- a/packages/layerchart/src/lib/components/Circle/Circle.shared.svelte.ts +++ b/packages/layerchart/src/lib/components/Circle/Circle.shared.svelte.ts @@ -5,10 +5,10 @@ import type { SVGAttributes } from 'svelte/elements'; import type { Without } from '$lib/utils/types.js'; import type { DataProp, DataDrivenStyleProps } from '$lib/utils/dataProp.js'; import { hasAnyDataProp, resolveDataProp, resolveGeoDataPair } from '$lib/utils/dataProp.js'; -import { chartDataArray } from '$lib/utils/common.js'; import { parseDashArray } from '$lib/utils/path.js'; import { createMotion, createDataMotionMap, type MotionProp } from '$lib/utils/motion.svelte.js'; import { getChartContext } from '$lib/contexts/chart.js'; +import { getMarkData } from '$lib/contexts/facet.js'; import { getGeoContext } from '$lib/contexts/geo.js'; import type { ChartState } from '$lib/states/chart.svelte.js'; import type { GeoState } from '$lib/states/geo.svelte.js'; @@ -169,6 +169,7 @@ export class CircleState { // Contexts (must be read inside a Svelte component setup, which is where // CircleState is instantiated). chartCtx = getChartContext(); + markData = getMarkData(); geo = getGeoContext(); // Reactive derivations @@ -178,9 +179,7 @@ export class CircleState { this.#getProps().data != null || hasAnyDataProp(this.#getProps().cx, this.#getProps().cy, this.#getProps().r) ); - #resolvedData: any[] = $derived( - this.dataMode ? (this.#getProps().data ?? chartDataArray(this.chartCtx.data)) : [] - ); + #resolvedData: any[] = $derived(this.dataMode ? this.markData(this.#getProps().data) : []); // Per-key motion tracking (only created when motion is configured) #dataMotionMap: ReturnType = null; diff --git a/packages/layerchart/src/lib/components/Contour/Contour.base.svelte b/packages/layerchart/src/lib/components/Contour/Contour.base.svelte index 40828a8d68..a450dba5ef 100644 --- a/packages/layerchart/src/lib/components/Contour/Contour.base.svelte +++ b/packages/layerchart/src/lib/components/Contour/Contour.base.svelte @@ -18,8 +18,9 @@ import { interpolateYlGnBu } from 'd3-scale-chromatic'; import { max, min } from 'd3-array'; - import { accessor as resolveAccessor, chartDataArray, type Accessor } from '$lib/utils/common.js'; + import { accessor as resolveAccessor, type Accessor } from '$lib/utils/common.js'; import { getChartContext } from '$lib/contexts/chart.js'; + import { getMarkData } from '$lib/contexts/facet.js'; import { getGeoContext } from '$lib/contexts/geo.js'; import { blurGridIgnoringNaN, @@ -28,8 +29,10 @@ resolveRasterBounds, } from '$lib/utils/index.js'; import { interpolateGrid } from '$lib/utils/rasterInterpolate.js'; + import { isScaleOrdinal } from '$lib/utils/scales.svelte.js'; const ctx = getChartContext(); + const markData = getMarkData(); const geo = getGeoContext(); let { @@ -115,7 +118,7 @@ return grid; } - const chartData = dataProp ? (dataProp as any[]) : chartDataArray(ctx.data); + const chartData = markData(dataProp); if (!chartData || chartData.length === 0) return new Float64Array(0); const xAcc = xProp ? resolveAccessor(xProp) : ctx.x; @@ -207,7 +210,8 @@ if (fill) return null; const minValue = min(contourData, (d) => d.value) ?? 0; const maxValue = max(contourData, (d) => d.value) ?? 1; - if (ctx.cScale) { + // Not an ordinal scale — `cScale` defaults to a `series` color lookup, which can't ramp + if (ctx.cScale && !isScaleOrdinal(ctx.cScale)) { const scale = ctx.cScale.copy(); return ctx.props.cDomain ? scale : scale.domain([minValue, maxValue]); } diff --git a/packages/layerchart/src/lib/components/Density/Density.base.svelte b/packages/layerchart/src/lib/components/Density/Density.base.svelte index cf3a90c22d..3fd675ba24 100644 --- a/packages/layerchart/src/lib/components/Density/Density.base.svelte +++ b/packages/layerchart/src/lib/components/Density/Density.base.svelte @@ -18,11 +18,14 @@ import { interpolateYlGnBu } from 'd3-scale-chromatic'; import { max } from 'd3-array'; - import { accessor as resolveAccessor, chartDataArray } from '$lib/utils/common.js'; + import { accessor as resolveAccessor } from '$lib/utils/common.js'; import { getChartContext } from '$lib/contexts/chart.js'; + import { getMarkData } from '$lib/contexts/facet.js'; import { getGeoContext } from '$lib/contexts/geo.js'; + import { isScaleOrdinal } from '$lib/utils/scales.svelte.js'; const ctx = getChartContext(); + const markData = getMarkData(); const geo = getGeoContext(); let { @@ -49,7 +52,7 @@ const yAccessor = $derived(yProp ? resolveAccessor(yProp) : ctx.y); const weightAccessor = $derived(weightProp ? resolveAccessor(weightProp) : null); - const data = $derived(dataProp ?? chartDataArray(ctx.data)); + const data = $derived(markData(dataProp)); const contours = $derived.by(() => { if (!data || data.length === 0 || !ctx.width || !ctx.height) return []; @@ -91,7 +94,8 @@ const colorScale = $derived.by(() => { if (fill) return null; const maxValue = max(contours, (d) => d.value) ?? 1; - if (ctx.cScale) { + // Not an ordinal scale — `cScale` defaults to a `series` color lookup, which can't ramp + if (ctx.cScale && !isScaleOrdinal(ctx.cScale)) { return ctx.cScale.copy().domain([0, maxValue]); } return scaleSequential([0, maxValue], interpolateYlGnBu); diff --git a/packages/layerchart/src/lib/components/Ellipse/Ellipse.shared.svelte.ts b/packages/layerchart/src/lib/components/Ellipse/Ellipse.shared.svelte.ts index 65f3757767..56eb78376b 100644 --- a/packages/layerchart/src/lib/components/Ellipse/Ellipse.shared.svelte.ts +++ b/packages/layerchart/src/lib/components/Ellipse/Ellipse.shared.svelte.ts @@ -4,9 +4,9 @@ import type { SVGAttributes } from 'svelte/elements'; import type { Without } from '$lib/utils/types.js'; import type { DataProp, DataDrivenStyleProps } from '$lib/utils/dataProp.js'; import { hasAnyDataProp, resolveDataProp, resolveGeoDataPair } from '$lib/utils/dataProp.js'; -import { chartDataArray } from '$lib/utils/common.js'; import { createMotion, createDataMotionMap, type MotionProp } from '$lib/utils/motion.svelte.js'; import { getChartContext } from '$lib/contexts/chart.js'; +import { getMarkData } from '$lib/contexts/facet.js'; import { getGeoContext } from '$lib/contexts/geo.js'; import type { ChartState } from '$lib/states/chart.svelte.js'; import type { GeoState } from '$lib/states/geo.svelte.js'; @@ -69,15 +69,15 @@ export class EllipseState { #props: EllipseProps = $derived(this.#getProps()); chartCtx: ChartState = getChartContext(); + + markData = getMarkData(); geo: GeoState = getGeoContext(); dataMode = $derived( hasAnyDataProp(this.#props.cx, this.#props.cy, this.#props.rx, this.#props.ry) ); - #resolvedData: any[] = $derived( - this.dataMode ? (this.#props.data ?? chartDataArray(this.chartCtx.data)) : [] - ); + #resolvedData: any[] = $derived(this.dataMode ? this.markData(this.#props.data) : []); resolvedItems = $derived.by(() => { if (!this.dataMode) return []; diff --git a/packages/layerchart/src/lib/components/Facet.svelte b/packages/layerchart/src/lib/components/Facet.svelte new file mode 100644 index 0000000000..7c6aa73100 --- /dev/null +++ b/packages/layerchart/src/lib/components/Facet.svelte @@ -0,0 +1,36 @@ + + + + +{#if ctx.facet.enabled} + {#each ctx.facet.panels as facet (facet.key)} + + {/each} +{:else} + + {@render children?.({ facet: ctx.facet.panels[0] })} +{/if} diff --git a/packages/layerchart/src/lib/components/FacetAxis.svelte b/packages/layerchart/src/lib/components/FacetAxis.svelte new file mode 100644 index 0000000000..4a18fcb55f --- /dev/null +++ b/packages/layerchart/src/lib/components/FacetAxis.svelte @@ -0,0 +1,63 @@ + + + +{#if ctx.facet.enabled && axis !== false && isFirstPanel} + {#if ctx.facet.xScale && ctx.facet.xDomain.length > 1} + + {/if} + + {#if ctx.facet.yScale && ctx.facet.yDomain.length > 1} + + + + + {/if} +{/if} diff --git a/packages/layerchart/src/lib/components/FacetPanel.svelte b/packages/layerchart/src/lib/components/FacetPanel.svelte new file mode 100644 index 0000000000..13a0c571ea --- /dev/null +++ b/packages/layerchart/src/lib/components/FacetPanel.svelte @@ -0,0 +1,25 @@ + + + + + + {@render children?.({ facet })} + diff --git a/packages/layerchart/src/lib/components/Group/Group.shared.svelte.ts b/packages/layerchart/src/lib/components/Group/Group.shared.svelte.ts index ba692742eb..3e2d50ddbe 100644 --- a/packages/layerchart/src/lib/components/Group/Group.shared.svelte.ts +++ b/packages/layerchart/src/lib/components/Group/Group.shared.svelte.ts @@ -5,7 +5,6 @@ import type { HTMLAttributes } from 'svelte/elements'; import type { Transition, TransitionParams, Without } from '$lib/utils/types.js'; import type { DataProp } from '$lib/utils/dataProp.js'; import { hasAnyDataProp, resolveDataProp, resolveGeoDataPair } from '$lib/utils/dataProp.js'; -import { chartDataArray } from '$lib/utils/common.js'; import { createMotion, createDataMotionMap, @@ -15,6 +14,7 @@ import { import { fade } from 'svelte/transition'; import { cubicIn } from 'svelte/easing'; import { getChartContext } from '$lib/contexts/chart.js'; +import { getMarkData } from '$lib/contexts/facet.js'; import { getGeoContext } from '$lib/contexts/geo.js'; import type { ChartState } from '$lib/states/chart.svelte.js'; import type { GeoState } from '$lib/states/geo.svelte.js'; @@ -108,14 +108,14 @@ export class GroupState { #props: GroupProps = $derived(this.#getProps()); chartCtx: ChartState = getChartContext(); + + markData = getMarkData(); geo: GeoState = getGeoContext(); // Data mode detection dataMode = $derived(hasAnyDataProp(this.#props.x, this.#props.y)); - #resolvedData: any[] = $derived( - this.dataMode ? (this.#props.data ?? chartDataArray(this.chartCtx.data)) : [] - ); + #resolvedData: any[] = $derived(this.dataMode ? this.markData(this.#props.data) : []); resolvedItems = $derived.by(() => { if (!this.dataMode) return []; diff --git a/packages/layerchart/src/lib/components/Highlight/Highlight.base.svelte b/packages/layerchart/src/lib/components/Highlight/Highlight.base.svelte index d43e8fc4d9..29568c9698 100644 --- a/packages/layerchart/src/lib/components/Highlight/Highlight.base.svelte +++ b/packages/layerchart/src/lib/components/Highlight/Highlight.base.svelte @@ -57,7 +57,7 @@ {#if c.highlightData} - {#if area} + {#if area && c.inPanel} {#if typeof area === 'function'} {@render area({ area: c.area })} {:else if c.ctx.radial} @@ -82,7 +82,7 @@ {/if} {/if} - {#if bar} + {#if bar && c.inPanel} {#if typeof bar === 'function'} {@render bar()} {:else} diff --git a/packages/layerchart/src/lib/components/Highlight/Highlight.shared.svelte.ts b/packages/layerchart/src/lib/components/Highlight/Highlight.shared.svelte.ts index b4402661ae..2b2efc72cd 100644 --- a/packages/layerchart/src/lib/components/Highlight/Highlight.shared.svelte.ts +++ b/packages/layerchart/src/lib/components/Highlight/Highlight.shared.svelte.ts @@ -7,9 +7,11 @@ import type Bar from '../Bar/Bar.svelte'; import type Circle from '../Circle/Circle.svelte'; import type Line from '../Line/Line.svelte'; import type Rect from '../Rect/Rect.svelte'; -import { accessor, type Accessor } from '$lib/utils/common.js'; +import { accessor, chartDataArray, isEqualValue, type Accessor } from '$lib/utils/common.js'; import { isScaleBand, isScaleTime } from '$lib/utils/scales.svelte.js'; +import { panelDatum } from '$lib/utils/tooltip.js'; import { getChartContext } from '$lib/contexts/chart.js'; +import { getFacetPanel } from '$lib/contexts/facet.js'; import type { ChartState } from '$lib/states/chart.svelte.js'; import type { MotionProp } from '$lib/utils/motion.svelte.js'; @@ -42,6 +44,15 @@ export type HighlightPropsWithoutHTML = { axis?: 'x' | 'y' | 'both' | 'none'; + /** + * In a faceted chart, also mark the hovered position in the panels that don't hold the hovered + * row — each resolving it against its own rows, the way a `ChartGroup` member resolves another + * chart's pointer. Panels with nothing at that position draw nothing. + * + * @default false + */ + facetAll?: boolean; + /** * Show points and pass props to Circles * @default false @@ -120,6 +131,7 @@ export class HighlightState { #props: HighlightProps = $derived(this.#getProps()); ctx: ChartState = getChartContext(); + #facetPanel = getFacetPanel(); constructor(getProps: () => HighlightProps) { this.#getProps = getProps; @@ -130,6 +142,14 @@ export class HighlightState { highlightData = $derived(this.#props.data ?? this.ctx.tooltip.data); + /** + * Whether the highlighted row belongs to the panel this is rendering into. + * + * Everything is confined to that panel unless `facetAll` asks for the hovered position to be + * marked in all of them. + */ + inPanel = $derived(this.#facetPanel?.().has(this.highlightData) ?? true); + xValue = $derived(this.x(this.highlightData)); xCoord = $derived( Array.isArray(this.xValue) @@ -183,6 +203,9 @@ export class HighlightState { lines = $derived.by(() => { let tmpLines: HighlightLineSegment[] = []; if (!this.highlightData) return tmpLines; + // The crosshair marks a position rather than a row, so `facetAll` draws it in every panel — + // including ones with nothing there, which `points` skips + if (!this.inPanel && !this.#props.facetAll) return tmpLines; const axis = this.axis; if (axis === 'x' || axis === 'both') { if (Array.isArray(this.xCoord)) { @@ -246,6 +269,19 @@ export class HighlightState { area = $derived.by(() => { const tmpArea: HighlightArea = { x: 0, y: 0, width: 0, height: 0 }; if (!this.highlightData) return tmpArea; + + // The panel is the band when faceting groups a band scale, so the whole panel is marked + // rather than the one bar the pointer landed on. `inPanel` already keeps this to the + // hovered panel. + if (this.ctx.facetBand) { + return { + x: min(this.ctx.xRange) as number, + y: min(this.ctx.yRange) as number, + width: (max(this.ctx.xRange) - min(this.ctx.xRange)) as number, + height: (max(this.ctx.yRange) - min(this.ctx.yRange)) as number, + }; + } + const axis = this.axis; if (axis === 'x' || axis === 'both') { @@ -315,11 +351,85 @@ export class HighlightState { return tmpArea; }); + /** + * The colour for a point on `seriesInfo`'s series. + * + * A series carries its own colour, and that's what the point takes. The exception is the + * default series, which stands in for a chart that has none — there `c` is what colours the + * marks, so a point taking the series colour would sit on a line of a different colour. It's + * the rule the `facetAll` copies and the series-less path already follow. + */ + #pointFill(seriesInfo: { color?: string | null }) { + if (this.ctx.config.c && this.ctx.series.isDefaultSeries) { + return (this.ctx.cGet(this.highlightData) as string) ?? seriesInfo.color ?? ''; + } + return seriesInfo.color ?? ''; + } + + /** + * The row this panel marks when the hovered one belongs to another — `facetAll` only. + * + * Resolved by position rather than copied, so each panel shows *its* value there, and a panel + * with no row at that position shows nothing. + */ + #facetMatch = $derived.by(() => { + const panel = this.#facetPanel?.(); + if (!this.#props.facetAll || !panel || !this.highlightData) return null; + + const match = panelDatum(this.ctx, panel, this.highlightData); + if (match == null) return null; + + const x = this.x(match); + const y = this.y(match); + + return { + x: (this.ctx.xScale(x) as number) + this.xOffset, + y: (this.ctx.yScale(y) as number) + this.yOffset, + fill: (this.ctx.config.c ? this.ctx.cGet(match) : null) as string, + data: { x, y }, + seriesKey: undefined, + } satisfies HighlightPoint; + }); + points = $derived.by(() => { let tmpPoints: HighlightPoint[] = []; if (!this.highlightData) return tmpPoints; + if (!this.inPanel) return this.#facetMatch ? [this.#facetMatch] : tmpPoints; const props = this.#props; + // Long data grouped by `c` draws a line per category from one implicit series, so the tooltip's + // series list names only the row the pointer resolved to — one point, on whichever category + // happened to be last. Point every category at this position instead, as the tooltip lists + // them. + if (props.data === undefined && this.ctx.cGroups && this.ctx.series.isDefaultSeries) { + const value = this.ctx.valueAxis === 'y' ? this.ctx.y : this.ctx.x; + // Within a facet, only that panel's rows — the same category appears in every panel, and + // pointing all of them would put the other panels' values in this one + const source = this.#facetPanel?.().data ?? chartDataArray(this.ctx.data); + const rows = source.filter((d: any) => isEqualValue(this.x(d), this.xValue)); + + // No visibility filter needed — rows of a `c` category the legend has hidden are already + // gone from `ctx.data`, which is what keeps the scales in step with the legend + return rows + .map((row: any) => { + const seriesValue = value(row); + return { + x: + this.ctx.valueAxis === 'x' + ? this.ctx.xScale(seriesValue) + this.xOffset + : (this.xCoordScalar as number) + this.xOffset, + y: + this.ctx.valueAxis === 'x' + ? (this.yCoordScalar as number) + this.yOffset + : this.ctx.yScale(seriesValue) + this.yOffset, + fill: this.ctx.config.c ? this.ctx.cGet(row) : null, + data: { x: this.xValue, y: seriesValue }, + seriesKey: this.ctx.cKey(row) ?? undefined, + }; + }) + .filter(notNull) as HighlightPoint[]; + } + if (props.data === undefined && this.ctx.tooltip.series.length > 0) { tmpPoints = this.ctx.tooltip.series .flatMap((seriesInfo) => { @@ -330,7 +440,9 @@ export class HighlightState { let dataX: any; let dataY: any; - if (this.ctx.series.isStacked) { + // Follow what the marks drew, not what the layout resolved to — an inferred stack the + // marks declined would put the point somewhere nothing is drawn + if (this.ctx.isStacked) { const matchingData = this.ctx.flatData.find((d) => this.x(d) === this.xValue); const stackValue = matchingData ? this.ctx.series.getStackValue(seriesInfo.key, matchingData) @@ -364,7 +476,7 @@ export class HighlightState { return seriesValue.map((sv) => ({ x: this.ctx.xScale(sv) + this.xOffset, y: (this.yCoordScalar as number) + this.yOffset, - fill: seriesInfo.color ?? '', + fill: this.#pointFill(seriesInfo), data: { x: sv, y: this.yValue }, seriesKey: seriesInfo.key, })); @@ -372,7 +484,7 @@ export class HighlightState { return seriesValue.map((sv) => ({ x: (this.xCoordScalar as number) + this.xOffset, y: this.ctx.yScale(sv) + this.yOffset, - fill: seriesInfo.color ?? '', + fill: this.#pointFill(seriesInfo), data: { x: this.xValue, y: sv }, seriesKey: seriesInfo.key, })); @@ -395,7 +507,7 @@ export class HighlightState { return { x: pointX, y: pointY, - fill: seriesInfo.color ?? '', + fill: this.#pointFill(seriesInfo), data: { x: dataX, y: dataY }, seriesKey: seriesInfo.key, }; diff --git a/packages/layerchart/src/lib/components/Hull/Hull.base.svelte b/packages/layerchart/src/lib/components/Hull/Hull.base.svelte index d883c699dc..f72cc3f4f1 100644 --- a/packages/layerchart/src/lib/components/Hull/Hull.base.svelte +++ b/packages/layerchart/src/lib/components/Hull/Hull.base.svelte @@ -21,9 +21,12 @@ // GeoPath agnostic; only loaded when used inside a geo chart. import GeoPath from '../geo/GeoPath/GeoPath.svelte'; import { getChartContext } from '$lib/contexts/chart.js'; + import { getFacetPanel } from '$lib/contexts/facet.js'; import { getGeoContext } from '$lib/contexts/geo.js'; const ctx = getChartContext(); + // `flatData` rather than the chart's `data`, so marks with their own rows are included + const facetPanel = getFacetPanel(); const geo = getGeoContext(); ctx.registerComponent({ name: 'Hull', kind: 'composite-mark' }); @@ -55,7 +58,7 @@ }); const points = $derived( - (data ?? ctx.flatData).map((d: any) => { + (data ?? facetPanel?.().data ?? ctx.flatData).map((d: any) => { const xValue = ctx.x(d); const yValue = ctx.y(d); diff --git a/packages/layerchart/src/lib/components/Image/Image.shared.svelte.ts b/packages/layerchart/src/lib/components/Image/Image.shared.svelte.ts index ff9c263d21..fa293d50d7 100644 --- a/packages/layerchart/src/lib/components/Image/Image.shared.svelte.ts +++ b/packages/layerchart/src/lib/components/Image/Image.shared.svelte.ts @@ -5,7 +5,6 @@ import { get } from '@layerstack/utils'; import type { Without } from '$lib/utils/types.js'; import type { DataProp } from '$lib/utils/dataProp.js'; import { hasAnyDataProp, resolveDataProp, resolveGeoDataPair } from '$lib/utils/dataProp.js'; -import { chartDataArray } from '$lib/utils/common.js'; import { createMotion, createDataMotionMap, @@ -14,6 +13,7 @@ import { type MotionOptions, } from '$lib/utils/motion.svelte.js'; import { getChartContext } from '$lib/contexts/chart.js'; +import { getMarkData } from '$lib/contexts/facet.js'; import { getGeoContext } from '$lib/contexts/geo.js'; import type { ChartState } from '$lib/states/chart.svelte.js'; import type { GeoState } from '$lib/states/geo.svelte.js'; @@ -78,6 +78,8 @@ export class ImageState { #props: ImageProps = $derived(this.#getProps()); chartCtx: ChartState = getChartContext(); + + markData = getMarkData(); geo: GeoState = getGeoContext(); dataMode = $derived( @@ -90,9 +92,7 @@ export class ImageState { ) || typeof this.#props.href === 'function' ); - #resolvedData: any[] = $derived( - this.dataMode ? (this.#props.data ?? chartDataArray(this.chartCtx.data)) : [] - ); + #resolvedData: any[] = $derived(this.dataMode ? this.markData(this.#props.data) : []); resolveImage(d: any) { const props = this.#props; diff --git a/packages/layerchart/src/lib/components/Legend.svelte b/packages/layerchart/src/lib/components/Legend.svelte index c94eeeb856..b7831bcb8f 100644 --- a/packages/layerchart/src/lib/components/Legend.svelte +++ b/packages/layerchart/src/lib/components/Legend.svelte @@ -176,6 +176,9 @@ const hasSeriesWithColors = $derived.by(() => { if (!ctx.series) return false; const allSeries = ctx.series.series ?? []; + // An ordinal `c` names the chart's own groups, so it wins over series — which may just be + // what a mark's accessor was called + if (ctx.cGroups) return false; // Check if we have multiple series OR a non-default series with colors return allSeries.length > 0 && !ctx.series.isDefaultSeries && allSeries.some((s) => s.color); }); @@ -351,7 +354,18 @@ } }); - const variant = $derived(variantProp ?? (seriesItems ? 'swatches' : 'ramp')); + /** + * An ordinal scale is the `else` of `scaleConfig` above — it interpolates nothing and inverts to + * no extent. + */ + const isOrdinalScale = $derived( + !!scale && !scale.interpolate && !scale.interpolator && !scale.invertExtent + ); + + // A ramp reads as a gradient between two ends, which an ordinal scale has no notion of: its + // domain is a handful of unrelated categories, and a strip of unlabelled blocks names none of + // them. Swatches are what a `c` channel without configured series wants. + const variant = $derived(variantProp ?? (seriesItems || isOrdinalScale ? 'swatches' : 'ramp')); const selected = $derived(selectedProp ?? ctx.series?.selectedKeys?.current ?? []); // Position indicator for the currently hovered value on the ramp. If `value` diff --git a/packages/layerchart/src/lib/components/Legend.svelte.test.ts b/packages/layerchart/src/lib/components/Legend.svelte.test.ts new file mode 100644 index 0000000000..210f94b7a2 --- /dev/null +++ b/packages/layerchart/src/lib/components/Legend.svelte.test.ts @@ -0,0 +1,77 @@ +import { describe, expect, it, vi } from 'vitest'; +import { render } from 'vitest-browser-svelte'; +import { scaleSequential } from 'd3-scale'; +import { interpolateTurbo } from 'd3-scale-chromatic'; + +import BarChart from './charts/BarChart/BarChart.svelte'; +import LineChart from './charts/LineChart/LineChart.svelte'; +import ChartWithMarkSeries from './tests/ChartWithMarkSeries.svelte'; + +const longData = [ + { year: 2019, fruit: 'apples', value: 30 }, + { year: 2019, fruit: 'bananas', value: 20 }, + { year: 2020, fruit: 'apples', value: 40 }, + { year: 2020, fruit: 'bananas', value: 10 }, +]; + +describe('Legend variant', () => { + it('should show labelled swatches for an ordinal color scale without series', async () => { + // `c` carries the categories when the series are implicit — a ramp would be a strip of + // unlabelled blocks naming none of them + const { container } = render(BarChart, { + props: { + data: longData, + x: 'year', + x1: 'fruit', + y: 'value', + seriesLayout: 'group', + c: 'fruit', + cRange: ['red', 'yellow'], + legend: true, + width: 400, + height: 300, + }, + } as any); + + // `ChartChildren` imports `Legend` lazily + await vi.waitFor(() => { + const labels = [...container.querySelectorAll('.lc-legend-swatch-label')].map((el) => + el.textContent?.trim() + ); + expect(labels).toEqual(['apples', 'bananas']); + }); + }); + + it('should keep the ramp for a sequential color scale', async () => { + const { container } = render(LineChart, { + props: { + data: longData, + x: 'year', + y: 'value', + c: 'value', + cScale: scaleSequential(interpolateTurbo), + legend: true, + width: 400, + height: 300, + }, + } as any); + + await vi.waitFor(() => { + expect(container.querySelector('.lc-legend-ramp-svg')).not.toBeNull(); + }); + expect(container.querySelectorAll('.lc-legend-swatch-label').length).toBe(0); + }); + + it('should let an ordinal `c` name the items over series inferred from marks', async () => { + // A mark carrying its own data registers as a series named after its accessor — which names + // the mark, not the chart's groups, so the colour scale wins + const { container } = render(ChartWithMarkSeries, {} as any); + + await vi.waitFor(() => { + const labels = [...container.querySelectorAll('.lc-legend-swatch-label')].map((el) => + el.textContent?.trim() + ); + expect(labels).toEqual(['apples', 'bananas']); + }); + }); +}); diff --git a/packages/layerchart/src/lib/components/Line/Line.shared.svelte.ts b/packages/layerchart/src/lib/components/Line/Line.shared.svelte.ts index 314f1ac108..20cd9b4894 100644 --- a/packages/layerchart/src/lib/components/Line/Line.shared.svelte.ts +++ b/packages/layerchart/src/lib/components/Line/Line.shared.svelte.ts @@ -4,10 +4,10 @@ import type { SVGAttributes } from 'svelte/elements'; import type { Without } from '$lib/utils/types.js'; import type { DataProp, DataDrivenStyleProps } from '$lib/utils/dataProp.js'; import { hasAnyDataProp, resolveDataProp, resolveGeoDataPair } from '$lib/utils/dataProp.js'; -import { chartDataArray } from '$lib/utils/common.js'; import { parseDashArray } from '$lib/utils/path.js'; import { createMotion, createDataMotionMap, type MotionProp } from '$lib/utils/motion.svelte.js'; import { getChartContext } from '$lib/contexts/chart.js'; +import { getMarkData } from '$lib/contexts/facet.js'; import { getGeoContext } from '$lib/contexts/geo.js'; import type { ChartState } from '$lib/states/chart.svelte.js'; import type { GeoState } from '$lib/states/geo.svelte.js'; @@ -141,6 +141,7 @@ export class LineState { // Contexts chartCtx: ChartState = getChartContext(); + markData = getMarkData(); geo: GeoState = getGeoContext(); // Data mode detection @@ -148,9 +149,7 @@ export class LineState { hasAnyDataProp(this.#props.x1, this.#props.y1, this.#props.x2, this.#props.y2) ); - #resolvedData: any[] = $derived( - this.dataMode ? (this.#props.data ?? chartDataArray(this.chartCtx.data)) : [] - ); + #resolvedData: any[] = $derived(this.dataMode ? this.markData(this.#props.data) : []); resolvedItems = $derived.by(() => { if (!this.dataMode) return []; diff --git a/packages/layerchart/src/lib/components/Link/Link.base.svelte b/packages/layerchart/src/lib/components/Link/Link.base.svelte index 69ba1f8be8..1a026ca5c3 100644 --- a/packages/layerchart/src/lib/components/Link/Link.base.svelte +++ b/packages/layerchart/src/lib/components/Link/Link.base.svelte @@ -18,6 +18,7 @@ getLinkRadialPresetPath, } from '$lib/utils/linkUtils.js'; import { getChartContext } from '$lib/contexts/chart.js'; + import { getMarkData } from '$lib/contexts/facet.js'; import { accessor, type Accessor } from '$lib/utils/common.js'; import { cls } from '@layerstack/tailwind'; import { @@ -29,6 +30,7 @@ import { LINK_FALLBACK_COORDS, isAccessorAccessor } from './Link.shared.svelte.js'; const ctx = getChartContext(); + const markData = getMarkData(); let { Path, @@ -217,7 +219,7 @@ // inside ``'s own template — the parent stays stable. const getPathData = () => motionPath.current; - const arrayRows = $derived(isArrayMode ? (data ?? ctx.data ?? []) : []); + const arrayRows = $derived(isArrayMode ? markData(data) : []); function resolvePerDatum(value: T | ((d: any) => T) | undefined, d: any): T | undefined { return typeof value === 'function' ? (value as (d: any) => T)(d) : (value as T | undefined); diff --git a/packages/layerchart/src/lib/components/Month/Month.base.svelte b/packages/layerchart/src/lib/components/Month/Month.base.svelte index de2e64947a..ae000d958e 100644 --- a/packages/layerchart/src/lib/components/Month/Month.base.svelte +++ b/packages/layerchart/src/lib/components/Month/Month.base.svelte @@ -16,8 +16,9 @@ import { index } from 'd3-array'; import { format } from '@layerstack/utils'; - import { chartDataArray } from '$lib/utils/common.js'; + import {} from '$lib/utils/common.js'; import { getChartContext } from '$lib/contexts/chart.js'; + import { getMarkData } from '$lib/contexts/facet.js'; import { extractLayerProps } from '$lib/utils/attributes.js'; const DAYS_PER_WEEK = 7; @@ -41,6 +42,7 @@ }: MonthBaseProps = $props(); const ctx = getChartContext(); + const markData = getMarkData(); const rangeDays = $derived(timeDays(start, end)); const monthLabelHeight = $derived(monthLabel ? cellSize : 0); @@ -54,7 +56,7 @@ ); const dataByDate = $derived( - ctx.data && ctx.config.x ? index(chartDataArray(ctx.data), (d) => ctx.x(d)) : new Map() + ctx.data && ctx.config.x ? index(markData(), (d) => ctx.x(d)) : new Map() ); const allCells = $derived.by(() => { diff --git a/packages/layerchart/src/lib/components/Pie/Pie.shared.svelte.ts b/packages/layerchart/src/lib/components/Pie/Pie.shared.svelte.ts index 4e483c5f55..54ca287445 100644 --- a/packages/layerchart/src/lib/components/Pie/Pie.shared.svelte.ts +++ b/packages/layerchart/src/lib/components/Pie/Pie.shared.svelte.ts @@ -5,6 +5,7 @@ import { min, max } from 'd3-array'; import { degreesToRadians } from '$lib/utils/math.js'; import { createMotion, type MotionProp } from '$lib/utils/motion.svelte.js'; import { getChartContext } from '$lib/contexts/chart.js'; +import { getMarkData } from '$lib/contexts/facet.js'; import type { ChartState } from '$lib/states/chart.svelte.js'; export type PiePropsWithoutHTML = { @@ -48,6 +49,7 @@ export type PieProps = PiePropsWithoutHTML; export class PieState { #getProps: () => PieProps = () => ({}) as PieProps; ctx: ChartState = getChartContext(); + markData = getMarkData(); #motionEndAngle!: ReturnType>; @@ -89,7 +91,5 @@ export class PieState { return _pie; }); - arcs = $derived( - this.pie(this.#getProps().data ?? (Array.isArray(this.ctx.data) ? this.ctx.data : [])) - ); + arcs = $derived(this.pie(this.markData(this.#getProps().data))); } diff --git a/packages/layerchart/src/lib/components/Points/Points.base.svelte b/packages/layerchart/src/lib/components/Points/Points.base.svelte index 71fe385498..1da088a56f 100644 --- a/packages/layerchart/src/lib/components/Points/Points.base.svelte +++ b/packages/layerchart/src/lib/components/Points/Points.base.svelte @@ -48,6 +48,23 @@ opacity, }) as PointsProps ); + + /** + * Faded when something else is highlighted — the row's `c` category when the legend names + * those, and the point's series otherwise. A single series names nothing to tell apart, so it + * never fades on its own account. + */ + function highlightOpacity(d: any) { + const category = c.ctx.cKey(d); + if (category != null) { + return c.ctx.series.isHighlighted(category, true) ? 1 : 0.1; + } + return c.series?.key == null || + c.ctx.series.visibleSeries.length <= 1 || + c.ctx.series.isHighlighted(c.series.key, true) + ? 1 + : 0.1; + } {#if children} @@ -62,12 +79,7 @@ {fillOpacity} {stroke} {strokeWidth} - opacity={opacity ?? - (c.series?.key == null || - c.ctx.series.visibleSeries.length <= 1 || - c.ctx.series.isHighlighted(c.series.key, true) - ? 1 - : 0.1)} + opacity={opacity ?? highlightOpacity(point.data)} {...c.series?.props} {...extractLayerProps(restProps, 'lc-point')} /> diff --git a/packages/layerchart/src/lib/components/Points/Points.shared.svelte.ts b/packages/layerchart/src/lib/components/Points/Points.shared.svelte.ts index fb3ce48675..a691558b9b 100644 --- a/packages/layerchart/src/lib/components/Points/Points.shared.svelte.ts +++ b/packages/layerchart/src/lib/components/Points/Points.shared.svelte.ts @@ -5,6 +5,7 @@ import type { CommonStyleProps, Without } from '$lib/utils/types.js'; import { isScaleBand, type AnyScale } from '$lib/utils/scales.svelte.js'; import { accessor, type Accessor } from '$lib/utils/common.js'; import { getChartContext } from '$lib/contexts/chart.js'; +import { getMarkData } from '$lib/contexts/facet.js'; import { getGeoContext } from '$lib/contexts/geo.js'; import type { ChartState } from '$lib/states/chart.svelte.js'; import type { GeoState } from '$lib/states/geo.svelte.js'; @@ -59,6 +60,8 @@ export class PointsState { #props: PointsProps = $derived(this.#getProps()); ctx: ChartState = getChartContext(); + + markData = getMarkData(); geo: GeoState = getGeoContext(); constructor(getProps: () => PointsProps) { @@ -84,12 +87,12 @@ export class PointsState { this.series?.value ?? (this.series?.data ? undefined : this.series?.key) ); - stackAccessors = $derived.by(() => { - const seriesKey = this.#props.seriesKey; - return seriesKey && this.ctx.series.isStacked - ? this.ctx.series.getStackAccessors(seriesKey) - : null; - }); + stackAccessors = $derived.by(() => + this.ctx.stackAccessorsFor({ + seriesKey: this.#props.seriesKey, + ownData: this.#props.data != null, + }) + ); xAccessor = $derived( accessor( @@ -107,7 +110,7 @@ export class PointsState { return accessor((this.ctx.valueAxis === 'y' ? this.seriesAccessor : undefined) ?? this.ctx.y); }); - pointsData = $derived(this.#props.data ?? this.series?.data ?? this.ctx.data); + pointsData = $derived(this.markData(this.#props.data ?? this.series?.data)); #getOffset(value: any, offset: Offset, scale: AnyScale, subScale?: AnyScale): number { const seriesKey = this.#props.seriesKey; diff --git a/packages/layerchart/src/lib/components/Polygon/Polygon.shared.svelte.ts b/packages/layerchart/src/lib/components/Polygon/Polygon.shared.svelte.ts index 9688dcb2a2..f6560f17c9 100644 --- a/packages/layerchart/src/lib/components/Polygon/Polygon.shared.svelte.ts +++ b/packages/layerchart/src/lib/components/Polygon/Polygon.shared.svelte.ts @@ -5,7 +5,6 @@ import { interpolatePath } from 'd3-interpolate-path'; import type { Without } from '$lib/utils/types.js'; import type { DataProp, DataDrivenStyleProps } from '$lib/utils/dataProp.js'; import { hasAnyDataProp, resolveDataProp, resolveGeoDataPair } from '$lib/utils/dataProp.js'; -import { chartDataArray } from '$lib/utils/common.js'; import { polygon } from '$lib/utils/shape.js'; import { roundedPolygonPath } from '$lib/utils/path.js'; import { @@ -16,6 +15,7 @@ import { type ResolvedMotion, } from '$lib/utils/motion.svelte.js'; import { getChartContext } from '$lib/contexts/chart.js'; +import { getMarkData } from '$lib/contexts/facet.js'; import { getGeoContext } from '$lib/contexts/geo.js'; import type { ChartState } from '$lib/states/chart.svelte.js'; import type { GeoState } from '$lib/states/geo.svelte.js'; @@ -78,13 +78,13 @@ export class PolygonState { #getProps: () => PolygonProps = () => ({}) as PolygonProps; chartCtx: ChartState = getChartContext(); + + markData = getMarkData(); geo: GeoState = getGeoContext(); dataMode = $derived(hasAnyDataProp(this.#getProps().cx, this.#getProps().cy, this.#getProps().r)); - resolvedData: any[] = $derived( - this.dataMode ? (this.#getProps().data ?? chartDataArray(this.chartCtx.data)) : [] - ); + resolvedData: any[] = $derived(this.dataMode ? this.markData(this.#getProps().data) : []); resolvedItems = $derived.by(() => { if (!this.dataMode) return []; diff --git a/packages/layerchart/src/lib/components/Raster/Raster.base.svelte b/packages/layerchart/src/lib/components/Raster/Raster.base.svelte index fda3baf108..ef0612f477 100644 --- a/packages/layerchart/src/lib/components/Raster/Raster.base.svelte +++ b/packages/layerchart/src/lib/components/Raster/Raster.base.svelte @@ -16,13 +16,16 @@ import { max, min } from 'd3-array'; import { rgb } from 'd3-color'; - import { accessor as resolveAccessor, chartDataArray, type Accessor } from '$lib/utils/common.js'; + import { accessor as resolveAccessor, type Accessor } from '$lib/utils/common.js'; import { getChartContext } from '$lib/contexts/chart.js'; + import { getMarkData } from '$lib/contexts/facet.js'; import { getGeoContext } from '$lib/contexts/geo.js'; import { gridCellCenterToBounds, resolveRasterBounds } from '$lib/utils/index.js'; import { interpolateGrid } from '$lib/utils/rasterInterpolate.js'; + import { isScaleOrdinal } from '$lib/utils/scales.svelte.js'; const ctx = getChartContext(); + const markData = getMarkData(); const geo = getGeoContext(); let { @@ -105,7 +108,7 @@ return grid; } - const chartData = dataProp ? (dataProp as any[]) : chartDataArray(ctx.data); + const chartData = markData(dataProp); if (!chartData || chartData.length === 0) return new Float64Array(0); const xAcc = xProp ? resolveAccessor(xProp) : ctx.x; @@ -153,7 +156,8 @@ const validValues = rasterValues.filter((v) => !isNaN(v)); const minValue = min(validValues) ?? 0; const maxValue = max(validValues) ?? 1; - if (ctx.cScale) { + // Not an ordinal scale — `cScale` defaults to a `series` color lookup, which can't ramp + if (ctx.cScale && !isScaleOrdinal(ctx.cScale)) { const scale = ctx.cScale.copy(); return ctx.props.cDomain ? scale : scale.domain([minValue, maxValue]); } diff --git a/packages/layerchart/src/lib/components/Rect/Rect.canvas.svelte b/packages/layerchart/src/lib/components/Rect/Rect.canvas.svelte index 2d0d07ede9..c5afef37d4 100644 --- a/packages/layerchart/src/lib/components/Rect/Rect.canvas.svelte +++ b/packages/layerchart/src/lib/components/Rect/Rect.canvas.svelte @@ -10,7 +10,9 @@ import { createKey } from '$lib/utils/key.svelte.js'; import { RectState, rectMarkInfo, type RectProps } from './Rect.shared.svelte.js'; - let { ...rest }: RectProps = $props(); + // Declared for parity with the svg/html variants, but never set — canvas draws the rect rather + // than creating an element for it + let { ref: _ref = $bindable(), ...rest }: RectProps = $props(); const c = new RectState(() => rest as RectProps); @@ -123,6 +125,7 @@ events: { click: (rest as any).onclick, dblclick: (rest as any).ondblclick, + pointerdown: (rest as any).onpointerdown, pointerenter: (rest as any).onpointerenter, pointermove: (rest as any).onpointermove, pointerleave: (rest as any).onpointerleave, diff --git a/packages/layerchart/src/lib/components/Rect/Rect.html.svelte b/packages/layerchart/src/lib/components/Rect/Rect.html.svelte index 82ecb9f32d..1595a972c4 100644 --- a/packages/layerchart/src/lib/components/Rect/Rect.html.svelte +++ b/packages/layerchart/src/lib/components/Rect/Rect.html.svelte @@ -8,7 +8,12 @@ import { resolveColorProp, resolveStyleProp } from '$lib/utils/dataProp.js'; import { RectState, rectMarkInfo, type RectProps } from './Rect.shared.svelte.js'; - let { children, ...rest }: RectProps = $props(); + let { children, ref: refProp = $bindable(), ...rest }: RectProps = $props(); + + let ref = $state(); + $effect.pre(() => { + refProp = ref as any; + }); const c = new RectState(() => rest as RectProps); @@ -71,6 +76,7 @@ style:border-color={c.staticStroke} style:border-radius={c.borderRadiusStyle ?? `${c.rx}px`} class={cls('lc-rect', c.staticClassName)} + bind:this={ref} > {@render children?.()}
diff --git a/packages/layerchart/src/lib/components/Rect/Rect.shared.svelte.ts b/packages/layerchart/src/lib/components/Rect/Rect.shared.svelte.ts index 19f42eed0a..7a4941158a 100644 --- a/packages/layerchart/src/lib/components/Rect/Rect.shared.svelte.ts +++ b/packages/layerchart/src/lib/components/Rect/Rect.shared.svelte.ts @@ -5,7 +5,6 @@ import type { SVGAttributes } from 'svelte/elements'; import type { CommonEvents, Without } from '$lib/utils/types.js'; import type { DataProp, DataDrivenStyleProps } from '$lib/utils/dataProp.js'; import { hasAnyDataProp, resolveDataProp, resolveGeoDataPair } from '$lib/utils/dataProp.js'; -import { chartDataArray } from '$lib/utils/common.js'; import { resolveCorners, cornersUniform, @@ -22,6 +21,7 @@ import { type MotionOptions, } from '$lib/utils/motion.svelte.js'; import { getChartContext } from '$lib/contexts/chart.js'; +import { getMarkData } from '$lib/contexts/facet.js'; import { getGeoContext } from '$lib/contexts/geo.js'; import type { ChartState } from '$lib/states/chart.svelte.js'; import type { GeoState } from '$lib/states/geo.svelte.js'; @@ -129,11 +129,12 @@ export type RectPropsWithoutHTML = { key?: (d: any, index: number) => any; /** - * Underlying `` tag when using . Useful for bindings (pixel mode only). + * Underlying `` (or `
` in an html layer) tag. Useful for bindings (pixel mode only). + * Never set in a canvas layer, which draws the rect rather than creating an element. * * @bindable */ - ref?: SVGRectElement; + ref?: SVGRectElement | HTMLDivElement; /** Motion configuration (pixel mode only). */ motion?: MotionProp<'x' | 'y' | 'width' | 'height'>; @@ -192,6 +193,7 @@ export class RectState { // Contexts chartCtx: ChartState = getChartContext(); + markData = getMarkData(); geo: GeoState = getGeoContext(); // Data mode detection @@ -204,9 +206,7 @@ export class RectState { ); // Data resolution - #resolvedData: any[] = $derived( - this.dataMode ? (this.#props.data ?? chartDataArray(this.chartCtx.data)) : [] - ); + #resolvedData: any[] = $derived(this.dataMode ? this.markData(this.#props.data) : []); resolvedItems = $derived.by(() => { if (!this.dataMode) return []; diff --git a/packages/layerchart/src/lib/components/Rule/Rule.shared.svelte.ts b/packages/layerchart/src/lib/components/Rule/Rule.shared.svelte.ts index 6503d76300..54471afd21 100644 --- a/packages/layerchart/src/lib/components/Rule/Rule.shared.svelte.ts +++ b/packages/layerchart/src/lib/components/Rule/Rule.shared.svelte.ts @@ -3,9 +3,10 @@ import type { SVGAttributes } from 'svelte/elements'; import { extent } from 'd3-array'; import type { Without } from '$lib/utils/types.js'; -import { accessor, chartDataArray, type Accessor } from '$lib/utils/common.js'; +import { accessor, type Accessor } from '$lib/utils/common.js'; import { isScaleBand, isScaleNumeric } from '$lib/utils/scales.svelte.js'; import { getChartContext } from '$lib/contexts/chart.js'; +import { getMarkData } from '$lib/contexts/facet.js'; import type { ChartState } from '$lib/states/chart.svelte.js'; import type { LinePropsWithoutHTML } from '../Line/Line.shared.svelte.js'; @@ -72,13 +73,14 @@ export type RuleLineSegment = { export class RuleState { #getProps: () => RuleProps = () => ({}) as RuleProps; ctx: ChartState = getChartContext(); + markData = getMarkData(); constructor(getProps: () => RuleProps) { this.#getProps = getProps; this.ctx.registerComponent({ name: 'Rule', kind: 'composite-mark' }); } - data = $derived(chartDataArray(this.#getProps().data ?? this.ctx.data)); + data = $derived(this.markData(this.#getProps().data)); singleX = $derived.by(() => { const x = this.#getProps().x; diff --git a/packages/layerchart/src/lib/components/Spline/Spline.base.svelte b/packages/layerchart/src/lib/components/Spline/Spline.base.svelte index 99108929f8..ed3c095de2 100644 --- a/packages/layerchart/src/lib/components/Spline/Spline.base.svelte +++ b/packages/layerchart/src/lib/components/Spline/Spline.base.svelte @@ -17,18 +17,35 @@ data, x, y, + z, seriesKey, defined, curve, stroke, fill, opacity, + // Pulled out of `restProps` so a function-valued `class` isn't spread onto the element + class: className, motion, ...restProps }: SplineBaseProps = $props(); const c = new SplineState( - () => ({ data, x, y, seriesKey, defined, curve, stroke, fill, opacity, motion }) as SplineProps + () => + ({ + data, + x, + y, + z, + seriesKey, + defined, + curve, + stroke, + fill, + opacity, + class: className, + motion, + }) as SplineProps ); @@ -39,6 +56,7 @@ stroke={seg.stroke} fill={seg.fill} opacity={seg.opacity ?? (c.seriesOpacity === 1 ? undefined : c.seriesOpacity)} + class={seg.class} {...c.series?.props} {...restProps} /> @@ -46,10 +64,11 @@ {:else} diff --git a/packages/layerchart/src/lib/components/Spline/Spline.shared.svelte.ts b/packages/layerchart/src/lib/components/Spline/Spline.shared.svelte.ts index 38a1f26758..c3c3945d67 100644 --- a/packages/layerchart/src/lib/components/Spline/Spline.shared.svelte.ts +++ b/packages/layerchart/src/lib/components/Spline/Spline.shared.svelte.ts @@ -2,15 +2,16 @@ import type { SVGAttributes } from 'svelte/elements'; import type { CurveFactory, CurveFactoryLineOnly, Line } from 'd3-shape'; import { line as d3Line, lineRadial } from 'd3-shape'; import { geoPath as d3GeoPath } from 'd3-geo'; -import { max } from 'd3-array'; +import { group as d3Group, max } from 'd3-array'; import { interpolatePath } from 'd3-interpolate-path'; import { accessor, type Accessor } from '$lib/utils/common.js'; import { isScaleBand } from '$lib/utils/scales.svelte.js'; import { createMotion, extractTweenConfig, type MotionProp } from '$lib/utils/motion.svelte.js'; -import { resolveColorProp, resolveStyleProp } from '$lib/utils/dataProp.js'; +import { colorPropDataKey, resolveColorProp, resolveStyleProp } from '$lib/utils/dataProp.js'; import type { ColorProp, StyleProp } from '$lib/utils/dataProp.js'; import { getChartContext } from '$lib/contexts/chart.js'; +import { getMarkData } from '$lib/contexts/facet.js'; import { getGeoContext } from '$lib/contexts/geo.js'; import type { ChartState } from '$lib/states/chart.svelte.js'; import type { GeoState } from '$lib/states/geo.svelte.js'; @@ -24,6 +25,14 @@ export type SplinePropsWithoutHTML = { x?: Accessor; /** Override `y` accessor from Chart context */ y?: Accessor; + /** + * Group the data into a separate line per distinct value, drawing them all from this one mark. + * Defaults to the Chart's `z` accessor. + * + * Replaces grouping the data and rendering a `Spline` per group — which registers a mark, and + * rebuilds the chart's domains, once per line. + */ + z?: Accessor; /** Series key to use for accessor. Only applicable if `` uses `series` and `x`/`y` are not set. */ seriesKey?: string; /** Function to determine if a point is defined */ @@ -36,6 +45,8 @@ export type SplinePropsWithoutHTML = { fill?: ColorProp; /** Opacity or function returning opacity per data point. */ opacity?: StyleProp; + /** CSS class name(s), or a function returning them per data point. */ + class?: StyleProp; /** Whether to animate the path using tweened interpolation. */ motion?: MotionProp; } & Omit; @@ -47,6 +58,7 @@ export type SplineSegment = { stroke?: string; fill?: string; opacity?: number; + class?: string; d: string; }; @@ -66,6 +78,8 @@ export class SplineState { #props: SplineProps = $derived(this.#getProps()); ctx: ChartState = getChartContext(); + + markData = getMarkData(); geo: GeoState = getGeoContext(); #tweenState!: ReturnType>; @@ -122,12 +136,68 @@ export class SplineState { this.#props.x ?? (this.ctx.valueAxis === 'x' ? this.seriesAccessor : undefined) ?? this.ctx.x ) ); - yAccessor = $derived( - accessor( - this.#props.y ?? (this.ctx.valueAxis === 'y' ? this.seriesAccessor : undefined) ?? this.ctx.y - ) + /** + * The stacked span this line belongs to, or `null` when it draws raw values. + * + * A line over a stacked area has to follow the area's top rather than the series' own values — + * which `Area`'s built-in `line` gets by passing its `y1`, and a hand-composed `Spline` beside + * an `Area` needs too. Mirrors the guard the other stacking marks use. + */ + stackAccessors = $derived.by(() => + this.ctx.stackAccessorsFor({ + seriesKey: this.#props.seriesKey, + ownData: this.#props.data != null, + }) ); + yAccessor = $derived.by(() => { + const props = this.#props; + if (props.y) return accessor(props.y); + if (this.ctx.valueAxis === 'y') { + if (this.stackAccessors) return this.stackAccessors.y1; + if (this.seriesAccessor) return accessor(this.seriesAccessor); + } + return accessor(this.ctx.y); + }); + + /** Kept separate from `lines` so `zAccessor` can read it without a cycle */ + resolvedData = $derived(this.markData(this.#props.data ?? this.series?.data)); + + /** + * Accessor grouping the data into one line per distinct value, or `null` for a single line. + * + * Resolves in order: this mark's `z`, the chart's `z`, the data property named by `stroke` / + * `fill`, then the chart's `c` — so `stroke="fruit"` alone gives a line per fruit, + * and so does ``: what colors the lines splits them. + * + * A mark carrying its own rows is left alone — whoever handed them over grouped them already. + * + * Falls back to the chart's `z` *prop* rather than `ctx.z`: `makeAccessor` returns `null` when + * the prop is unset, but isn't typed that way, so the raw prop is the honest check. + */ + zAccessor = $derived.by<((d: any) => any) | null>(() => { + const props = this.#props; + const z = props.z ?? this.ctx.props.z; + if (z != null) return accessor(z); + + const first = this.resolvedData?.[0]; + const implied = colorPropDataKey(props.stroke, first) ?? colorPropDataKey(props.fill, first); + if (implied != null) return accessor(implied); + + if (props.data != null || this.series?.data != null) return null; + return first != null && this.ctx.cKey(first) != null ? this.ctx.cKey : null; + }); + + /** The data this Spline draws, split into one array per line */ + lines = $derived.by(() => { + if (!this.zAccessor) return [this.resolvedData]; + const grouped = Array.from(d3Group(this.resolvedData, this.zAccessor).values()); + // A line the legend names and has hidden should go with it. Rows of a hidden `c` category + // are already gone by here — `ChartState.data` drops those so the scales follow — so this is + // only about lines this mark split by itself. + return grouped.filter((lineData) => this.#isShown(lineData[0])); + }); + xOffset = $derived(isScaleBand(this.ctx.xScale) ? this.ctx.xScale.bandwidth() / 2 : 0); yOffset = $derived(isScaleBand(this.ctx.yScale) ? this.ctx.yScale.bandwidth() / 2 : 0); @@ -152,15 +222,17 @@ export class SplineState { return ( typeof p.stroke === 'function' || typeof p.fill === 'function' || - typeof p.opacity === 'function' + typeof p.opacity === 'function' || + typeof p.class === 'function' ); }); d = $derived.by(() => { const props = this.#props; - if (this.hasAnyStyleFn && !this.geo.projection) return ''; + // Both style functions and `z` produce more than one path, which `segments` builds instead + if ((this.hasAnyStyleFn || this.zAccessor) && !this.geo.projection) return ''; - const resolvedData = props.data ?? this.series?.data ?? this.ctx.data; + const resolvedData = this.resolvedData; if (this.geo.projection) { const coordinates = resolvedData @@ -178,30 +250,107 @@ export class SplineState { }); segments = $derived.by(() => { - if (!this.hasAnyStyleFn) return null; + if (!this.hasAnyStyleFn && !this.zAccessor) return null; const props = this.#props; - const resolvedData = props.data ?? this.series?.data ?? this.ctx.data; if (this.geo.projection) return null; - const groups = groupConsecutive(resolvedData, (d, i, arr) => { - const s = resolveColorProp(props.stroke, d, this.ctx.cScale, i, arr); - const f = resolveColorProp(props.fill, d, this.ctx.cScale, i, arr); - const o = resolveStyleProp(props.opacity, d, i, arr); - return { key: `${s}\0${f}\0${o}`, style: { stroke: s, fill: f, opacity: o } }; - }); + const out: SplineSegment[] = []; + + for (const lineData of this.lines) { + const lineOpacity = this.#lineOpacity(lineData); + + if (this.hasAnyStyleFn) { + // Style functions split each line further, into one path per run of matching style + const groups = groupConsecutive(lineData, (d, i, arr) => { + const s = resolveColorProp(props.stroke, d, this.ctx.cScale, i, arr); + const f = resolveColorProp(props.fill, d, this.ctx.cScale, i, arr); + const o = resolveStyleProp(props.opacity, d, i, arr); + const c = resolveStyleProp(props.class, d, i, arr); + return { + key: `${s}\0${f}\0${o}\0${c}`, + style: { stroke: s, fill: f, opacity: o, class: c }, + }; + }); + for (const group of groups) { + out.push({ + ...group.style, + opacity: group.style.opacity ?? lineOpacity, + d: this.#buildPath(group.data), + }); + } + } else { + // One path for the whole line, styled from its first point — so `stroke="species"` picks + // the line's color out of the data via the chart's color scale + out.push({ + stroke: + resolveColorProp(props.stroke, lineData[0], this.ctx.cScale) ?? + this.#colorFromC(lineData[0]) ?? + this.series?.color, + fill: resolveColorProp(props.fill, lineData[0], this.ctx.cScale), + opacity: resolveStyleProp(props.opacity, lineData[0]) ?? lineOpacity, + class: resolveStyleProp(props.class, lineData[0]), + d: this.#buildPath(lineData), + }); + } + } - return groups.map((group) => ({ - ...group.style, - d: this.#buildPath(group.data), - })); + return out; }); + /** + * The chart's `c` channel as the colour, when `c` is what names the groups — the lines split by + * it would otherwise all come out in the series' one colour. + */ + #colorFromC(d: any) { + return d != null && this.ctx.cKey(d) != null ? this.ctx.cGet(d) : undefined; + } + + /** + * Fade for one line when the legend names `c` categories, or `undefined` when it names series. + * + * `seriesOpacity` can't tell these apart — a single series draws every line here, so the whole + * mark would fade as one. Read from the line's first point, the way its `stroke` is. + */ + #lineOpacity(lineData: any[]) { + const key = this.#groupKey(lineData[0]); + if (key == null) return undefined; + return this.ctx.series.isHighlighted(key, true) ? 1 : 0.1; + } + + /** + * What the legend calls this line, or `null` when nothing names it. + * + * The chart's `c` first, since that is the chart's own channel. Otherwise the mark's own + * grouping — `stroke="fruit"` splits the lines, and where a series is declared per fruit the + * legend is already listing exactly those names, so hovering one should single that line out. + * A `z` the legend knows nothing about stays anonymous rather than reacting to unrelated keys. + */ + #groupKey(d: any): any { + const category = this.ctx.cKey(d); + if (category != null) return category; + if (!this.zAccessor || d == null) return null; + const key = this.zAccessor(d); + return this.#namesSeries(key) ? key : null; + } + + #namesSeries(key: any) { + return key != null && this.ctx.series.series.some((s) => s.key === key); + } + + /** Whether a line's group is currently shown, for groups the legend names */ + #isShown(d: any) { + if (d == null || !this.zAccessor) return true; + const key = this.zAccessor(d); + if (!this.#namesSeries(key)) return true; + return this.ctx.series.visibleSeries.some((s) => s.key === key); + } + #defaultPathData(): string { const props = this.#props; if (!extractTweenConfig(props.motion)) return ''; if (this.ctx.config.x) { - const resolvedData = props.data ?? this.series?.data ?? this.ctx.data; + const resolvedData = this.resolvedData; const baseline = Math.min(this.ctx.yScale(0) ?? this.ctx.yRange[0], this.ctx.yRange[0]); const path = this.ctx.radial @@ -223,6 +372,23 @@ export class SplineState { return ''; } + /** + * `stroke` / `fill` for the single-path case, resolved the way every other mark resolves them: + * a string naming a data property goes through the chart's color scale, anything else is a + * literal CSS color. Uniform across the path, so it resolves from the first point. + */ + resolvedStroke = $derived( + resolveColorProp(this.#props.stroke, this.lines[0]?.[0], this.ctx.cScale) ?? + this.#colorFromC(this.lines[0]?.[0]) ?? + this.series?.color + ); + resolvedFill = $derived(resolveColorProp(this.#props.fill, this.lines[0]?.[0], this.ctx.cScale)); + // Annotated: the inferred type reaches into `clsx`'s internals, which can't be named in the + // emitted declaration — without this, `tsc` drops the whole file's `.d.ts` + resolvedClass = $derived( + resolveStyleProp(this.#props.class, this.lines[0]?.[0]) as string | undefined + ); + isTweened = $derived(extractTweenConfig(this.#props.motion) != null); get tweenedPath() { diff --git a/packages/layerchart/src/lib/components/Spline/Spline.svelte.test.ts b/packages/layerchart/src/lib/components/Spline/Spline.svelte.test.ts new file mode 100644 index 0000000000..58ab62dec4 --- /dev/null +++ b/packages/layerchart/src/lib/components/Spline/Spline.svelte.test.ts @@ -0,0 +1,393 @@ +import { describe, expect, it } from 'vitest'; +import { render } from 'vitest-browser-svelte'; + +import TestHarness from '../tests/TestHarness.svelte'; +import Spline from './Spline.svelte'; + +/** Two series interleaved in one flat array, as long-format data arrives */ +const data = [ + { group: 'a', date: new Date('2024-01-01'), value: 10, kind: 'first' }, + { group: 'b', date: new Date('2024-01-01'), value: 50, kind: 'second' }, + { group: 'a', date: new Date('2024-02-01'), value: 20, kind: 'first' }, + { group: 'b', date: new Date('2024-02-01'), value: 60, kind: 'second' }, + { group: 'a', date: new Date('2024-03-01'), value: 30, kind: 'first' }, + { group: 'b', date: new Date('2024-03-01'), value: 70, kind: 'second' }, +]; + +const chartProps = (extra: Record = {}) => ({ + data, + x: 'date', + y: 'value', + yDomain: [0, 100], + ...extra, +}); + +function paths() { + return Array.from(document.querySelectorAll('svg path')); +} + +describe('Spline', () => { + describe('z (grouping)', () => { + it('draws one path per group from a single mark', async () => { + render(TestHarness, { + component: Spline, + chartProps: chartProps(), + componentProps: { z: 'group' }, + }); + + await expect.poll(() => paths().length).toBe(2); + }); + + it('splits the data rather than drawing one line through every point', async () => { + // Without `z` the interleaved rows are a single zig-zag path + render(TestHarness, { + component: Spline, + chartProps: chartProps(), + componentProps: {}, + }); + + await expect.poll(() => paths().length).toBe(1); + const single = paths()[0].getAttribute('d')!; + expect(single.split('L')).toHaveLength(data.length); // every point, one path + }); + + it('falls back to the chart`s `c` when it names a column', async () => { + render(TestHarness, { + component: Spline, + chartProps: chartProps({ c: 'group' }), + componentProps: {}, + }); + + await expect.poll(() => paths().length).toBe(2); + }); + + it('is not split by a `c` that computes a colour per row', async () => { + // A colour derived from the value encodes each point, it does not name a series — grouping + // on it would draw one path through the low points and another through the high ones + render(TestHarness, { + component: Spline, + chartProps: chartProps({ + c: (d: (typeof data)[number]) => (d.value < 40 ? 'low' : 'high'), + cDomain: ['low', 'high'], + }), + componentProps: {}, + }); + + await expect.poll(() => paths().length).toBe(1); + expect(paths()[0].getAttribute('d')!.split('L')).toHaveLength(data.length); + }); + + it('falls back to the chart`s `z` accessor', async () => { + render(TestHarness, { + component: Spline, + chartProps: chartProps({ z: 'group' }), + componentProps: {}, + }); + + await expect.poll(() => paths().length).toBe(2); + }); + + it('takes its own `z` over the chart`s', async () => { + render(TestHarness, { + component: Spline, + chartProps: chartProps({ z: 'group' }), + // `kind` is 1:1 with `group` here, so the count matches — what matters is that the + // override is read at all, which the `null` case below pins down + componentProps: { z: () => 'all' }, + }); + + await expect.poll(() => paths().length).toBe(1); + }); + + it('is implied by a `stroke` naming a data property', async () => { + render(TestHarness, { + component: Spline, + chartProps: chartProps({ c: 'group', cRange: ['red', 'blue'] }), + componentProps: { stroke: 'group' }, + }); + + await expect.poll(() => paths().length).toBe(2); + }); + + it('is not implied by a CSS color', async () => { + render(TestHarness, { + component: Spline, + chartProps: chartProps(), + componentProps: { stroke: 'var(--color-danger)' }, + }); + + await expect.poll(() => paths().length).toBe(1); + }); + + it('is not implied by a string that names nothing in the data', async () => { + render(TestHarness, { + component: Spline, + chartProps: chartProps(), + componentProps: { stroke: 'rebeccapurple' }, + }); + + await expect.poll(() => paths().length).toBe(1); + }); + + it('an explicit `z` wins over the one `stroke` would imply', async () => { + render(TestHarness, { + component: Spline, + chartProps: chartProps({ c: 'group', cRange: ['red', 'blue'] }), + // `kind` splits the same way as `group`, but `z: null`-style single grouping proves + // the explicit prop is what's read + componentProps: { z: () => 'all', stroke: 'group' }, + }); + + await expect.poll(() => paths().length).toBe(1); + }); + + it('still splits by style function within each group', async () => { + render(TestHarness, { + component: Spline, + chartProps: chartProps(), + componentProps: { + z: 'group', + // alternates every point, so each 3-point line becomes 2 segments + opacity: (d: any) => (d.value % 20 === 0 ? 1 : 0.5), + }, + }); + + await expect.poll(() => paths().length).toBeGreaterThan(2); + }); + }); + + describe('class', () => { + it('resolves per line when given a function', async () => { + render(TestHarness, { + component: Spline, + chartProps: chartProps(), + componentProps: { + z: 'group', + class: (d: any) => (d.group === 'a' ? 'first-line' : 'second-line'), + }, + }); + + await expect.poll(() => paths().length).toBe(2); + const classes = paths().map((p) => p.getAttribute('class')); + expect(classes[0]).toContain('first-line'); + expect(classes[1]).toContain('second-line'); + }); + + it('applies a static string to every line', async () => { + render(TestHarness, { + component: Spline, + chartProps: chartProps(), + componentProps: { z: 'group', class: 'shared' }, + }); + + await expect.poll(() => paths().length).toBe(2); + expect(paths().every((p) => p.getAttribute('class')?.includes('shared'))).toBe(true); + }); + + it('applies a static string without `z`', async () => { + render(TestHarness, { + component: Spline, + chartProps: chartProps(), + componentProps: { class: 'solo' }, + }); + + await expect.poll(() => paths()[0]?.getAttribute('class')).toContain('solo'); + }); + }); + + describe('legend interaction for lines it split itself', () => { + // `stroke="group"` draws a line per group from one mark, and a series is declared per group — + // so the legend is already naming exactly those lines and should be able to single one out + const seriesProps = () => + chartProps({ + series: [ + { key: 'a', color: 'rgb(255, 0, 0)' }, + { key: 'b', color: 'rgb(0, 0, 255)' }, + ], + }); + + function opacities() { + return paths().map((p) => p.getAttribute('opacity')); + } + + it('fades the other lines when one is highlighted', async () => { + let ctx: any; + render(TestHarness, { + component: Spline, + chartProps: seriesProps(), + componentProps: { stroke: 'group' }, + oncontext: (c: any) => (ctx = c), + } as any); + + await expect.poll(() => paths().length).toBe(2); + + ctx.series.setHighlight('a'); + await expect.poll(opacities).toEqual(['1', '0.1']); + + ctx.series.setHighlight(null); + await expect.poll(() => opacities().every((o) => o == null || o === '1')).toBe(true); + }); + + it('drops a line the legend has hidden', async () => { + let ctx: any; + render(TestHarness, { + component: Spline, + chartProps: seriesProps(), + componentProps: { stroke: 'group' }, + oncontext: (c: any) => (ctx = c), + } as any); + + await expect.poll(() => paths().length).toBe(2); + + ctx.series.selectedKeys.toggle('a'); + await expect.poll(() => paths().length).toBe(1); + await expect.poll(() => paths()[0]?.getAttribute('stroke')).toBe('rgb(255, 0, 0)'); + }); + + it('leaves a `z` the legend does not name alone', async () => { + // Nothing on the legend corresponds to these groups, so they must not react to its keys + let ctx: any; + render(TestHarness, { + component: Spline, + chartProps: chartProps({ series: [{ key: 'unrelated', color: 'red' }] }), + componentProps: { z: 'group' }, + oncontext: (c: any) => (ctx = c), + } as any); + + await expect.poll(() => paths().length).toBe(2); + + ctx.series.setHighlight('unrelated'); + await expect.poll(() => paths().length).toBe(2); + expect(opacities().every((o) => o == null || o === '1')).toBe(true); + }); + }); + + describe('stroke', () => { + it('resolves a data property through the chart`s color scale', async () => { + render(TestHarness, { + component: Spline, + chartProps: chartProps({ + c: 'group', + cRange: ['rgb(255, 0, 0)', 'rgb(0, 0, 255)'], + }), + componentProps: { z: 'group', stroke: 'group' }, + }); + + await expect.poll(() => paths().length).toBe(2); + const strokes = paths().map((p) => p.getAttribute('stroke')); + expect(strokes).toEqual(['rgb(255, 0, 0)', 'rgb(0, 0, 255)']); + }); + + it('falls back to the colors declared on `series`, with no `c` scale configured', async () => { + render(TestHarness, { + component: Spline, + chartProps: chartProps({ + series: [ + { key: 'a', color: 'rgb(255, 0, 0)' }, + { key: 'b', color: 'rgb(0, 0, 255)' }, + ], + }), + componentProps: { stroke: 'group' }, + }); + + await expect.poll(() => paths().length).toBe(2); + expect(paths().map((p) => p.getAttribute('stroke'))).toEqual([ + 'rgb(255, 0, 0)', + 'rgb(0, 0, 255)', + ]); + }); + + it('keeps the raw value when `series` colors do not cover it', async () => { + // The series-derived scale only knows its own keys — anything else behaves as it would + // with no scale at all, rather than wrapping around the palette + render(TestHarness, { + component: Spline, + chartProps: chartProps({ series: [{ key: 'nope', color: 'rgb(255, 0, 0)' }] }), + componentProps: { stroke: 'group' }, + }); + + await expect.poll(() => paths().length).toBe(2); + expect(paths().map((p) => p.getAttribute('stroke'))).toEqual(['a', 'b']); + }); + + it('leaves a CSS color literal alone', async () => { + render(TestHarness, { + component: Spline, + chartProps: chartProps({ c: 'group', cRange: ['red', 'blue'] }), + componentProps: { stroke: 'var(--color-danger)' }, + }); + + await expect.poll(() => paths()[0]?.getAttribute('stroke')).toBe('var(--color-danger)'); + }); + + it('leaves a named color alone when it is not a data property', async () => { + render(TestHarness, { + component: Spline, + chartProps: chartProps(), + componentProps: { stroke: 'rebeccapurple' }, + }); + + await expect.poll(() => paths()[0]?.getAttribute('stroke')).toBe('rebeccapurple'); + }); + }); + + describe('stacked series', () => { + /** Wide rows, so the series stack across columns */ + const stackedData = [ + { date: new Date('2024-01-01'), apples: 30, bananas: 20 }, + { date: new Date('2024-02-01'), apples: 40, bananas: 10 }, + ]; + + const stackedProps = { + data: stackedData, + x: 'date', + valueAxis: 'y', + yDomain: [0, 100], + height: 100, + width: 200, + padding: { top: 0, right: 0, bottom: 0, left: 0 }, + series: [{ key: 'apples' }, { key: 'bananas' }], + seriesLayout: 'stack', + }; + + /** The y pixel of the path's first point, as `M x,y` */ + const firstY = () => { + const d = paths()[0]?.getAttribute('d') ?? ''; + const m = d.match(/^M-?[\d.]+,(-?[\d.]+)/); + return m ? Math.round(Number(m[1])) : null; + }; + + it('should follow its series\u2019 stacked top', async () => { + // `bananas` is 20 on its own but sits on top of `apples` at 30 — a line drawn along the + // edge of a stacked area has to be at 50, not 20 + render(TestHarness, { + component: Spline, + chartProps: stackedProps, + componentProps: { seriesKey: 'bananas' }, + }); + + // yDomain [0, 100] over 100px, so a value of 50 lands at y=50 + await expect.poll(firstY).toBe(50); + }); + + it('should draw its own values when given an explicit `y`', async () => { + render(TestHarness, { + component: Spline, + chartProps: stackedProps, + componentProps: { seriesKey: 'bananas', y: 'bananas' }, + }); + + await expect.poll(firstY).toBe(80); // 20 from the baseline + }); + + it('should draw raw values without a `seriesKey`', async () => { + render(TestHarness, { + component: Spline, + chartProps: { ...stackedProps, y: 'apples' }, + componentProps: {}, + }); + + await expect.poll(firstY).toBe(70); // 30 from the baseline + }); + }); +}); diff --git a/packages/layerchart/src/lib/components/Text/Text.shared.svelte.ts b/packages/layerchart/src/lib/components/Text/Text.shared.svelte.ts index 62cf904c79..0fc7b8e272 100644 --- a/packages/layerchart/src/lib/components/Text/Text.shared.svelte.ts +++ b/packages/layerchart/src/lib/components/Text/Text.shared.svelte.ts @@ -4,12 +4,12 @@ import type { SVGAttributes } from 'svelte/elements'; import type { Without } from '$lib/utils/types.js'; import type { DataDrivenStyleProps } from '$lib/utils/dataProp.js'; import { resolveDataProp, resolveGeoDataPair } from '$lib/utils/dataProp.js'; -import { chartDataArray } from '$lib/utils/common.js'; import { createMotion, createDataMotionMap, type MotionProp } from '$lib/utils/motion.svelte.js'; import { get } from '@layerstack/utils'; import { format as formatValue, type FormatType, type FormatConfig } from '@layerstack/utils'; import { getStringWidth, truncateText, type TruncateTextOptions } from '$lib/utils/string.js'; import { getChartContext } from '$lib/contexts/chart.js'; +import { getMarkData } from '$lib/contexts/facet.js'; import { getGeoContext } from '$lib/contexts/geo.js'; import type { ChartState } from '$lib/states/chart.svelte.js'; import type { GeoState } from '$lib/states/geo.svelte.js'; @@ -334,6 +334,7 @@ export class TextState { // Contexts chartCtx: ChartState = getChartContext(); + markData = getMarkData(); geo: GeoState = getGeoContext(); // Path measurement (only meaningful for SVG layer where the textPath element exists) @@ -345,9 +346,7 @@ export class TextState { ); // Data resolution - #resolvedData: any[] = $derived( - this.dataMode ? (this.#props.data ?? chartDataArray(this.chartCtx.data)) : [] - ); + #resolvedData: any[] = $derived(this.dataMode ? this.markData(this.#props.data) : []); resolvedItems = $derived.by(() => { if (!this.dataMode) return []; diff --git a/packages/layerchart/src/lib/components/Trail/Trail.base.svelte b/packages/layerchart/src/lib/components/Trail/Trail.base.svelte index a000af1fdf..0587388b11 100644 --- a/packages/layerchart/src/lib/components/Trail/Trail.base.svelte +++ b/packages/layerchart/src/lib/components/Trail/Trail.base.svelte @@ -18,10 +18,12 @@ import { resolveDataProp, type DataProp } from '$lib/utils/dataProp.js'; import { accessor } from '$lib/utils/common.js'; import { getChartContext } from '$lib/contexts/chart.js'; + import { getMarkData } from '$lib/contexts/facet.js'; import { computeTrailPath } from '$lib/utils/trail.js'; import { createMotion, extractTweenConfig } from '$lib/utils/motion.svelte.js'; const ctx = getChartContext(); + const markData = getMarkData(); let { Path, @@ -70,7 +72,7 @@ const resolvedR = $derived(r ?? (ctx.config.r as DataProp | undefined)); const trailPath = $derived.by(() => { - const resolvedData = data ?? series?.data ?? ctx.data; + const resolvedData = markData(data ?? series?.data); const definedFn = defined ?? ((d: any) => xAccessor(d) != null && yAccessor(d) != null); const points = resolvedData @@ -96,7 +98,7 @@ if (!extractTweenConfig(motion)) return ''; if (ctx.config.x) { - const resolvedData = data ?? series?.data ?? ctx.data; + const resolvedData = markData(data ?? series?.data); const definedFn = defined ?? ((d: any) => xAccessor(d) != null && yAccessor(d) != null); const baseline = Math.min(ctx.yScale(0) ?? ctx.yRange[0], ctx.yRange[0]); diff --git a/packages/layerchart/src/lib/components/Voronoi/Voronoi.base.svelte b/packages/layerchart/src/lib/components/Voronoi/Voronoi.base.svelte index f51ca06d43..b231f3ef58 100644 --- a/packages/layerchart/src/lib/components/Voronoi/Voronoi.base.svelte +++ b/packages/layerchart/src/lib/components/Voronoi/Voronoi.base.svelte @@ -24,6 +24,7 @@ // GeoPath lives in geo/ subpath; agnostic import (only used in geo charts). import GeoPath from '../geo/GeoPath/GeoPath.svelte'; import { getChartContext } from '$lib/contexts/chart.js'; + import { getFacetPanel } from '$lib/contexts/facet.js'; import { getGeoContext } from '$lib/contexts/geo.js'; import { accessor } from '$lib/utils/common.js'; import type { VoronoiCell } from './Voronoi.shared.svelte.js'; @@ -47,13 +48,15 @@ }: VoronoiBaseProps = $props(); const ctx = getChartContext(); + // `flatData` rather than the chart's `data`, so marks with their own rows are included + const facetPanel = getFacetPanel(); const geo = getGeoContext(); const xAccessorOverride = $derived(xProp != null ? accessor(xProp) : undefined); const yAccessorOverride = $derived(yProp != null ? accessor(yProp) : undefined); const points = $derived( - (data ?? ctx.flatData).map((d: any) => { + (data ?? facetPanel?.().data ?? ctx.flatData).map((d: any) => { const xValue = xAccessorOverride ? geo.projection ? xAccessorOverride(d) diff --git a/packages/layerchart/src/lib/components/Waffle/Waffle.shared.svelte.ts b/packages/layerchart/src/lib/components/Waffle/Waffle.shared.svelte.ts index 69be8c170d..459a082c09 100644 --- a/packages/layerchart/src/lib/components/Waffle/Waffle.shared.svelte.ts +++ b/packages/layerchart/src/lib/components/Waffle/Waffle.shared.svelte.ts @@ -2,8 +2,9 @@ import type { Snippet } from 'svelte'; import type { SVGAttributes } from 'svelte/elements'; import type { ChartState } from '$lib/states/chart.svelte.js'; -import { accessor, chartDataArray, type Accessor } from '$lib/utils/common.js'; +import { accessor, type Accessor } from '$lib/utils/common.js'; import { getChartContext } from '$lib/contexts/chart.js'; +import { getMarkData } from '$lib/contexts/facet.js'; import { createDimensionGetter, type Insets } from '$lib/utils/rect.svelte.js'; import type { CommonStyleProps, Without } from '$lib/utils/types.js'; @@ -23,9 +24,8 @@ export type WafflePropsWithoutHTML = { /** * Axis the waffle extends along (the value axis). * - * - `'y'` (default): vertical waffle, like Plot's `waffleY`. Cells stack - * upward from the value=0 baseline. - * - `'x'`: horizontal waffle, like Plot's `waffleX`. Cells extend rightward. + * - `'x'`: horizontal waffle. Cells extend rightward. + * - `'y'`: vertical waffle. Cells stack upward from the value=0 baseline. * * Falls back to the chart's `valueAxis`. */ @@ -149,6 +149,8 @@ export class WaffleState { ctx: ChartState = getChartContext(); + markData = getMarkData(); + constructor(getProps: () => WaffleProps) { this.#getProps = getProps; this.ctx.registerComponent({ @@ -160,6 +162,7 @@ export class WaffleState { data: p.data, seriesKey: p.seriesKey, color: p.fill as string | undefined, + stacks: true, }; }, }); @@ -194,17 +197,18 @@ export class WaffleState { : undefined ); - stackAccessors = $derived.by(() => { - const seriesKey = this.#props.seriesKey; - return seriesKey && this.ctx.series.isStacked - ? this.ctx.series.getStackAccessors(seriesKey) - : null; - }); + stackAccessors = $derived.by(() => + this.ctx.stackAccessorsFor({ + seriesKey: this.#props.seriesKey, + ownData: this.#props.data != null, + stacksImplicitly: true, + }) + ); data = $derived.by(() => { const dataProp = this.#props.data; if (dataProp) return dataProp; - return this.series?.data ?? chartDataArray(this.ctx.data); + return this.markData(this.series?.data); }); x = $derived.by(() => { diff --git a/packages/layerchart/src/lib/components/__screenshots__/BrushContext.svelte.test.ts/BrushContext-adjusting-an-existing-selection-clears-on-clicking-the-region-without-dragging-1.png b/packages/layerchart/src/lib/components/__screenshots__/BrushContext.svelte.test.ts/BrushContext-adjusting-an-existing-selection-clears-on-clicking-the-region-without-dragging-1.png new file mode 100644 index 0000000000..565ed9a59f Binary files /dev/null and b/packages/layerchart/src/lib/components/__screenshots__/BrushContext.svelte.test.ts/BrushContext-adjusting-an-existing-selection-clears-on-clicking-the-region-without-dragging-1.png differ diff --git a/packages/layerchart/src/lib/components/__screenshots__/BrushContext.svelte.test.ts/BrushContext-adjusting-an-existing-selection-clears-on-clicking-the-region-without-dragging-2.png b/packages/layerchart/src/lib/components/__screenshots__/BrushContext.svelte.test.ts/BrushContext-adjusting-an-existing-selection-clears-on-clicking-the-region-without-dragging-2.png new file mode 100644 index 0000000000..565ed9a59f Binary files /dev/null and b/packages/layerchart/src/lib/components/__screenshots__/BrushContext.svelte.test.ts/BrushContext-adjusting-an-existing-selection-clears-on-clicking-the-region-without-dragging-2.png differ diff --git a/packages/layerchart/src/lib/components/__screenshots__/BrushContext.svelte.test.ts/BrushContext-adjusting-an-existing-selection-clears-on-double-clicking-the-selection-1.png b/packages/layerchart/src/lib/components/__screenshots__/BrushContext.svelte.test.ts/BrushContext-adjusting-an-existing-selection-clears-on-double-clicking-the-selection-1.png new file mode 100644 index 0000000000..f2b39718c9 Binary files /dev/null and b/packages/layerchart/src/lib/components/__screenshots__/BrushContext.svelte.test.ts/BrushContext-adjusting-an-existing-selection-clears-on-double-clicking-the-selection-1.png differ diff --git a/packages/layerchart/src/lib/components/__screenshots__/BrushContext.svelte.test.ts/BrushContext-adjusting-an-existing-selection-clears-on-double-clicking-the-selection-2.png b/packages/layerchart/src/lib/components/__screenshots__/BrushContext.svelte.test.ts/BrushContext-adjusting-an-existing-selection-clears-on-double-clicking-the-selection-2.png new file mode 100644 index 0000000000..f2b39718c9 Binary files /dev/null and b/packages/layerchart/src/lib/components/__screenshots__/BrushContext.svelte.test.ts/BrushContext-adjusting-an-existing-selection-clears-on-double-clicking-the-selection-2.png differ diff --git a/packages/layerchart/src/lib/components/__screenshots__/BrushContext.svelte.test.ts/BrushContext-adjusting-an-existing-selection-moves-the-selection-rather-than-starting-a-new-one-1.png b/packages/layerchart/src/lib/components/__screenshots__/BrushContext.svelte.test.ts/BrushContext-adjusting-an-existing-selection-moves-the-selection-rather-than-starting-a-new-one-1.png new file mode 100644 index 0000000000..2e3a42292a Binary files /dev/null and b/packages/layerchart/src/lib/components/__screenshots__/BrushContext.svelte.test.ts/BrushContext-adjusting-an-existing-selection-moves-the-selection-rather-than-starting-a-new-one-1.png differ diff --git a/packages/layerchart/src/lib/components/__screenshots__/BrushContext.svelte.test.ts/BrushContext-adjusting-an-existing-selection-moves-the-selection-rather-than-starting-a-new-one-2.png b/packages/layerchart/src/lib/components/__screenshots__/BrushContext.svelte.test.ts/BrushContext-adjusting-an-existing-selection-moves-the-selection-rather-than-starting-a-new-one-2.png new file mode 100644 index 0000000000..2e3a42292a Binary files /dev/null and b/packages/layerchart/src/lib/components/__screenshots__/BrushContext.svelte.test.ts/BrushContext-adjusting-an-existing-selection-moves-the-selection-rather-than-starting-a-new-one-2.png differ diff --git a/packages/layerchart/src/lib/components/__screenshots__/BrushContext.svelte.test.ts/BrushContext-adjusting-an-existing-selection-reports-the-cleared-selection-to--onChange---as-double-clicking-does-1.png b/packages/layerchart/src/lib/components/__screenshots__/BrushContext.svelte.test.ts/BrushContext-adjusting-an-existing-selection-reports-the-cleared-selection-to--onChange---as-double-clicking-does-1.png new file mode 100644 index 0000000000..f84ffaaaff Binary files /dev/null and b/packages/layerchart/src/lib/components/__screenshots__/BrushContext.svelte.test.ts/BrushContext-adjusting-an-existing-selection-reports-the-cleared-selection-to--onChange---as-double-clicking-does-1.png differ diff --git a/packages/layerchart/src/lib/components/__screenshots__/BrushContext.svelte.test.ts/BrushContext-adjusting-an-existing-selection-reports-the-cleared-selection-to--onChange---as-double-clicking-does-2.png b/packages/layerchart/src/lib/components/__screenshots__/BrushContext.svelte.test.ts/BrushContext-adjusting-an-existing-selection-reports-the-cleared-selection-to--onChange---as-double-clicking-does-2.png new file mode 100644 index 0000000000..f84ffaaaff Binary files /dev/null and b/packages/layerchart/src/lib/components/__screenshots__/BrushContext.svelte.test.ts/BrushContext-adjusting-an-existing-selection-reports-the-cleared-selection-to--onChange---as-double-clicking-does-2.png differ diff --git a/packages/layerchart/src/lib/components/__screenshots__/BrushContext.svelte.test.ts/BrushContext-adjusting-an-existing-selection-resizes-from-a-handle--anchored-to-the-opposite-edge-1.png b/packages/layerchart/src/lib/components/__screenshots__/BrushContext.svelte.test.ts/BrushContext-adjusting-an-existing-selection-resizes-from-a-handle--anchored-to-the-opposite-edge-1.png new file mode 100644 index 0000000000..4cc75e8bb3 Binary files /dev/null and b/packages/layerchart/src/lib/components/__screenshots__/BrushContext.svelte.test.ts/BrushContext-adjusting-an-existing-selection-resizes-from-a-handle--anchored-to-the-opposite-edge-1.png differ diff --git a/packages/layerchart/src/lib/components/__screenshots__/BrushContext.svelte.test.ts/BrushContext-adjusting-an-existing-selection-resizes-from-a-handle--anchored-to-the-opposite-edge-2.png b/packages/layerchart/src/lib/components/__screenshots__/BrushContext.svelte.test.ts/BrushContext-adjusting-an-existing-selection-resizes-from-a-handle--anchored-to-the-opposite-edge-2.png new file mode 100644 index 0000000000..4cc75e8bb3 Binary files /dev/null and b/packages/layerchart/src/lib/components/__screenshots__/BrushContext.svelte.test.ts/BrushContext-adjusting-an-existing-selection-resizes-from-a-handle--anchored-to-the-opposite-edge-2.png differ diff --git a/packages/layerchart/src/lib/states/__screenshots__/chart.component-node.svelte.test.ts/ChartState-registerComponent-cleans-up-child-nodes-and-mark-registrations-when-components-unmount-2.png b/packages/layerchart/src/lib/components/__screenshots__/BrushContext.svelte.test.ts/BrushContext-facets-brushes-the-panel-it-started-in--giving-the-same-domain-from-either-panel-1.png similarity index 50% rename from packages/layerchart/src/lib/states/__screenshots__/chart.component-node.svelte.test.ts/ChartState-registerComponent-cleans-up-child-nodes-and-mark-registrations-when-components-unmount-2.png rename to packages/layerchart/src/lib/components/__screenshots__/BrushContext.svelte.test.ts/BrushContext-facets-brushes-the-panel-it-started-in--giving-the-same-domain-from-either-panel-1.png index dab2a6df3f..57a674d9dd 100644 Binary files a/packages/layerchart/src/lib/states/__screenshots__/chart.component-node.svelte.test.ts/ChartState-registerComponent-cleans-up-child-nodes-and-mark-registrations-when-components-unmount-2.png and b/packages/layerchart/src/lib/components/__screenshots__/BrushContext.svelte.test.ts/BrushContext-facets-brushes-the-panel-it-started-in--giving-the-same-domain-from-either-panel-1.png differ diff --git a/packages/layerchart/src/lib/components/__screenshots__/BrushContext.svelte.test.ts/BrushContext-facets-brushes-the-panel-it-started-in--giving-the-same-domain-from-either-panel-2.png b/packages/layerchart/src/lib/components/__screenshots__/BrushContext.svelte.test.ts/BrushContext-facets-brushes-the-panel-it-started-in--giving-the-same-domain-from-either-panel-2.png new file mode 100644 index 0000000000..57a674d9dd Binary files /dev/null and b/packages/layerchart/src/lib/components/__screenshots__/BrushContext.svelte.test.ts/BrushContext-facets-brushes-the-panel-it-started-in--giving-the-same-domain-from-either-panel-2.png differ diff --git a/packages/layerchart/src/lib/components/__screenshots__/BrushContext.svelte.test.ts/BrushContext-facets-draws-the-selection-in-every-panel-1.png b/packages/layerchart/src/lib/components/__screenshots__/BrushContext.svelte.test.ts/BrushContext-facets-draws-the-selection-in-every-panel-1.png new file mode 100644 index 0000000000..57a674d9dd Binary files /dev/null and b/packages/layerchart/src/lib/components/__screenshots__/BrushContext.svelte.test.ts/BrushContext-facets-draws-the-selection-in-every-panel-1.png differ diff --git a/packages/layerchart/src/lib/components/__screenshots__/BrushContext.svelte.test.ts/BrushContext-facets-draws-the-selection-in-every-panel-2.png b/packages/layerchart/src/lib/components/__screenshots__/BrushContext.svelte.test.ts/BrushContext-facets-draws-the-selection-in-every-panel-2.png new file mode 100644 index 0000000000..57a674d9dd Binary files /dev/null and b/packages/layerchart/src/lib/components/__screenshots__/BrushContext.svelte.test.ts/BrushContext-facets-draws-the-selection-in-every-panel-2.png differ diff --git a/packages/layerchart/src/lib/components/__screenshots__/BrushContext.svelte.test.ts/BrushContext-zoomOnBrush-with-onBrushEnd-should-pass-brush-domain-values-to-onBrushEnd-before-resetting-1.png b/packages/layerchart/src/lib/components/__screenshots__/BrushContext.svelte.test.ts/BrushContext-zoomOnBrush-with-onBrushEnd-should-pass-brush-domain-values-to-onBrushEnd-before-resetting-1.png index f4690367cc..f84ffaaaff 100644 Binary files a/packages/layerchart/src/lib/components/__screenshots__/BrushContext.svelte.test.ts/BrushContext-zoomOnBrush-with-onBrushEnd-should-pass-brush-domain-values-to-onBrushEnd-before-resetting-1.png and b/packages/layerchart/src/lib/components/__screenshots__/BrushContext.svelte.test.ts/BrushContext-zoomOnBrush-with-onBrushEnd-should-pass-brush-domain-values-to-onBrushEnd-before-resetting-1.png differ diff --git a/packages/layerchart/src/lib/components/__screenshots__/BrushContext.svelte.test.ts/BrushContext-zoomOnBrush-with-onBrushEnd-should-pass-brush-domain-values-to-onBrushEnd-before-resetting-2.png b/packages/layerchart/src/lib/components/__screenshots__/BrushContext.svelte.test.ts/BrushContext-zoomOnBrush-with-onBrushEnd-should-pass-brush-domain-values-to-onBrushEnd-before-resetting-2.png index f4690367cc..f84ffaaaff 100644 Binary files a/packages/layerchart/src/lib/components/__screenshots__/BrushContext.svelte.test.ts/BrushContext-zoomOnBrush-with-onBrushEnd-should-pass-brush-domain-values-to-onBrushEnd-before-resetting-2.png and b/packages/layerchart/src/lib/components/__screenshots__/BrushContext.svelte.test.ts/BrushContext-zoomOnBrush-with-onBrushEnd-should-pass-brush-domain-values-to-onBrushEnd-before-resetting-2.png differ diff --git a/packages/layerchart/src/lib/components/charts/AreaChart.svelte.test.ts b/packages/layerchart/src/lib/components/charts/AreaChart.svelte.test.ts index aec2f7e3ad..1ffde4d5d8 100644 --- a/packages/layerchart/src/lib/components/charts/AreaChart.svelte.test.ts +++ b/packages/layerchart/src/lib/components/charts/AreaChart.svelte.test.ts @@ -1,4 +1,4 @@ -import { describe, expect, it } from 'vitest'; +import { describe, expect, it, vi } from 'vitest'; import { render } from 'vitest-browser-svelte'; import AreaChart from './AreaChart/AreaChart.svelte'; @@ -173,4 +173,60 @@ describe(`AreaChart`, () => { await expect.element(svg).toBeInTheDocument(); }); }); + + describe('annotations over a stack', () => { + it('should place a point naming a series on that series\u2019 stacked top', async () => { + // The annotation carries the series' own value, which is only where it's drawn when + // nothing stacks — over a stack it belongs on the running total + const { container } = render(AreaChart, { + data: seriesData, + x: 'date', + series: [{ key: 'one' }, { key: 'two' }], + annotations: [ + { type: 'point', seriesKey: 'one', x: seriesData[4].date, y: seriesData[4].one }, + { type: 'point', seriesKey: 'two', x: seriesData[4].date, y: seriesData[4].two }, + ], + width: 400, + height: 300, + } as any); + + await expect.element(container.querySelector('svg')).toBeInTheDocument(); + + // `.lc-annotation-point` rather than every `circle`: a cursor left over this chart by + // another test file renders highlight points, which are circles too — and interleaved with + // these in document order + await vi.waitFor(() => { + const circles = [...container.querySelectorAll('.lc-annotation-point')].map((el) => + Math.round(Number(el.getAttribute('cy'))) + ); + expect(circles).toHaveLength(2); + + // `one` is 18 and `two` is 22, so stacked they sit at 18 and 40 — different heights, + // and the upper one above the lower (smaller `cy`) + const [lower, upper] = circles.slice(0, 2).sort((a, b) => b - a); + expect(upper).toBeLessThan(lower); + }); + }); + + it('should leave an annotation naming no series where it was put', async () => { + const { container } = render(AreaChart, { + data: seriesData, + x: 'date', + series: [{ key: 'one' }, { key: 'two' }], + annotations: [{ type: 'point', x: seriesData[4].date, y: seriesData[4].one }], + width: 400, + height: 300, + } as any); + + await expect.element(container.querySelector('svg')).toBeInTheDocument(); + + // Without a `seriesKey` there's no segment to read against, stacked or not + await vi.waitFor(() => { + const cy = [...container.querySelectorAll('.lc-annotation-point')].map((el) => + Math.round(Number(el.getAttribute('cy'))) + ); + expect(cy).toHaveLength(1); + }); + }); + }); }); diff --git a/packages/layerchart/src/lib/components/charts/AreaChart/AreaChart.base.svelte b/packages/layerchart/src/lib/components/charts/AreaChart/AreaChart.base.svelte index ab975bcdf7..0a25437331 100644 --- a/packages/layerchart/src/lib/components/charts/AreaChart/AreaChart.base.svelte +++ b/packages/layerchart/src/lib/components/charts/AreaChart/AreaChart.base.svelte @@ -23,7 +23,7 @@ xDomain, radial = false, series: seriesProp, - seriesLayout = 'overlap', + seriesLayout = 'auto', axis = true, brush = false, grid = true, diff --git a/packages/layerchart/src/lib/components/charts/AreaChart/AreaChart.shared.svelte.ts b/packages/layerchart/src/lib/components/charts/AreaChart/AreaChart.shared.svelte.ts index fe3112b04d..a41307769b 100644 --- a/packages/layerchart/src/lib/components/charts/AreaChart/AreaChart.shared.svelte.ts +++ b/packages/layerchart/src/lib/components/charts/AreaChart/AreaChart.shared.svelte.ts @@ -4,6 +4,7 @@ import type { ChartProps } from '../../Chart/Chart.shared.svelte.js'; import type { HighlightPoint } from '../../Highlight/Highlight.shared.svelte.js'; import type { AreaProps } from '../../Area/Area.shared.svelte.js'; import type { SeriesData } from '../types.js'; +import type { SeriesLayout } from '$lib/states/series.svelte.js'; // Use explicit data prop for TData inference, with rest from ChartPropsWithoutHTML export type AreaChartProps = { @@ -19,10 +20,12 @@ export type AreaChartProps = { series?: SeriesData>[]; /** - * The layout of the series. - * @default 'overlap' + * How multiple series are arranged — see `Chart`'s `seriesLayout` for how `'auto'` resolves. + * `'group'` divides a band, so it's bar-only and isn't offered here. + * + * @default 'auto' */ - seriesLayout?: 'overlap' | 'stack' | 'stackExpand' | 'stackDiverging'; + seriesLayout?: Exclude; /** * A callback function called when a point in the chart is clicked. diff --git a/packages/layerchart/src/lib/components/charts/BarChart.svelte.test.ts b/packages/layerchart/src/lib/components/charts/BarChart.svelte.test.ts index 6a2f343ecc..eed5c41a5f 100644 --- a/packages/layerchart/src/lib/components/charts/BarChart.svelte.test.ts +++ b/packages/layerchart/src/lib/components/charts/BarChart.svelte.test.ts @@ -26,6 +26,227 @@ const simpleData = [ ]; describe('BarChart', () => { + describe('faceted tooltip header', () => { + function triggerTooltip(el: Element) { + const r = el.getBoundingClientRect(); + const init = { bubbles: true, clientX: r.x + r.width / 2, clientY: r.y + r.height / 2 }; + el.dispatchEvent(new PointerEvent('pointerenter', init)); + el.dispatchEvent(new PointerEvent('pointermove', init)); + } + + async function headerAfterHover(container: HTMLElement) { + let header = ''; + await vi.waitFor(() => { + const rect = container.querySelector('.lc-tooltip-rect'); + expect(rect).not.toBeNull(); + triggerTooltip(rect!); + const el = document.querySelector('.lc-tooltip-header'); + expect(el).not.toBeNull(); + header = el!.textContent?.trim() ?? ''; + }); + return header; + } + + it('should name the panel in front of the band', async () => { + // The band value alone names a row in every panel, so it only identifies the row with the + // panel in front of it + const { container } = render(BarChart, { + props: { + data: [ + { species: 'Adelie', island: 'Torgersen', count: 23, other: 5 }, + { species: 'Gentoo', island: 'Torgersen', count: 61, other: 7 }, + ], + y: 'island', + fy: 'species', + series: [{ key: 'count' }, { key: 'other' }], + seriesLayout: 'stack', + orientation: 'horizontal', + width: 400, + height: 300, + }, + } as any); + + expect(await headerAfterHover(container as HTMLElement)).toBe('Adelie · Torgersen'); + }); + + it('should format the band value before joining the panel to it', async () => { + // Joining raw would put a `Date`'s full string in the header + const { container } = render(BarChart, { + props: { + data: [ + { region: 'North', date: new Date('2024-01-15T00:00:00Z'), count: 10, other: 2 }, + { region: 'South', date: new Date('2024-01-15T00:00:00Z'), count: 20, other: 3 }, + ], + x: 'date', + fx: 'region', + series: [{ key: 'count' }, { key: 'other' }], + seriesLayout: 'stack', + width: 400, + height: 300, + }, + } as any); + + const header = await headerAfterHover(container as HTMLElement); + expect(header).toMatch(/^North · /); + expect(header).not.toMatch(/GMT|00:00:00/); + }); + }); + + describe('stacked bar rounding', () => { + // A rounded corner renders as a `path` with an arc; a square one as a `rect` + const isRounded = (el: Element) => + el.tagName === 'path' && /a[\d.]+,[\d.]+/.test(el.getAttribute('d') ?? ''); + + it('should round the top series of each stack, per row', async () => { + // `top` is absent from the second row, so `middle` is what the eye sees on top there + const { container } = render(BarChart, { + props: { + data: [ + { year: '2024', bottom: 10, middle: 5, top: 3 }, + { year: '2025', bottom: 10, middle: 5 }, + ], + x: 'year', + series: [{ key: 'bottom' }, { key: 'middle' }, { key: 'top' }], + seriesLayout: 'stack', + width: 400, + height: 300, + }, + } as any); + + await expect.element(container.querySelector('svg')).toBeInTheDocument(); + + // One per band: `top` for 2024 and `middle` for 2025 + const rounded = [...container.querySelectorAll('.lc-bar')].filter(isRounded); + expect(rounded.length).toBe(2); + }); + + it('should leave the lower segments square', async () => { + const { container } = render(BarChart, { + props: { + data: [{ year: '2024', bottom: 10, middle: 5, top: 3 }], + x: 'year', + series: [{ key: 'bottom' }, { key: 'middle' }, { key: 'top' }], + seriesLayout: 'stack', + width: 400, + height: 300, + }, + } as any); + + await expect.element(container.querySelector('svg')).toBeInTheDocument(); + + const bars = [...container.querySelectorAll('.lc-bar')]; + expect(bars.filter(isRounded).length).toBe(1); + }); + }); + + describe('faceted tooltip hit regions', () => { + const facetData = [ + { party: 'AfD', year: 2021, votes: 10, other: 3 }, + { party: 'AfD', year: 2025, votes: 20, other: 4 }, + { party: 'SPD', year: 2021, votes: 25, other: 5 }, + { party: 'SPD', year: 2025, votes: 16, other: 6 }, + ]; + + it('should cover the whole panel in `facet` mode', async () => { + const { container } = render(BarChart, { + props: { + data: facetData, + x: 'year', + y: 'votes', + fx: 'party', + tooltipContext: { mode: 'facet' }, + width: 400, + height: 300, + }, + } as any); + + await expect.element(container.querySelector('svg')).toBeInTheDocument(); + + // One per panel rather than one per bar — the tooltip lists the panel's rows + const rects = container.querySelectorAll('.lc-tooltip-rect'); + expect(rects.length).toBe(2); + }); + + it('should cover each bar in the default `band` mode, faceted or not', async () => { + // Faceting alone doesn't widen the target — `facet` mode is what does + const { container } = render(BarChart, { + props: { data: facetData, x: 'year', y: 'votes', fx: 'party', width: 400, height: 300 }, + } as any); + + await expect.element(container.querySelector('svg')).toBeInTheDocument(); + + const rects = container.querySelectorAll('.lc-tooltip-rect'); + expect(rects.length).toBe(4); + }); + + it('should stay per row when series rule the panel out as a band', async () => { + // Each row carries the whole series set, so a panel-wide rect would resolve every hover in + // the panel to its first row + const { container } = render(BarChart, { + props: { + data: facetData, + x: 'year', + fx: 'party', + series: [{ key: 'votes' }, { key: 'other' }], + seriesLayout: 'stack', + width: 400, + height: 300, + }, + } as any); + + await expect.element(container.querySelector('svg')).toBeInTheDocument(); + + const rects = container.querySelectorAll('.lc-tooltip-rect'); + expect(rects.length).toBe(4); + }); + }); + + describe('per-row bar styles', () => { + it('should resolve a `fillOpacity` accessor against each row', async () => { + // The `Rect` a bar draws is handed computed dimensions, so it never sees the row itself — + // the accessor has to be resolved by `Bar` + // `BarChart` has a prop named `props`, which collides with the render option of that name + const { container } = render(BarChart, { + props: { + data: simpleData, + x: 'name', + y: 'value', + height: 300, + props: { bars: { fillOpacity: (d: any) => (d.value > 15 ? 1 : 0.25) } }, + }, + } as any); + + const svg = container.querySelector('svg'); + await expect.element(svg).toBeInTheDocument(); + + const opacities = [...container.querySelectorAll('.lc-bar')].map((el) => + el.getAttribute('fill-opacity') + ); + expect(opacities).toEqual(['0.25', '1', '0.25', '1']); + }); + + it('should still accept a plain `fillOpacity` value', async () => { + // `BarChart` has a prop named `props`, which collides with the render option of that name + const { container } = render(BarChart, { + props: { + data: simpleData, + x: 'name', + y: 'value', + height: 300, + props: { bars: { fillOpacity: 0.5 } }, + }, + } as any); + + const svg = container.querySelector('svg'); + await expect.element(svg).toBeInTheDocument(); + + const opacities = [...container.querySelectorAll('.lc-bar')].map((el) => + el.getAttribute('fill-opacity') + ); + expect(opacities).toEqual(['0.5', '0.5', '0.5', '0.5']); + }); + }); + describe('basic', () => { it('should render with default series when no series prop provided', async () => { const { container } = render(BarChart, { @@ -394,6 +615,258 @@ describe('BarChart', () => { }); }); + describe('legend `c` category toggle', () => { + // `x1` groups long data on its own, so the legend's items are the `c` categories rather than + // series — the lone implicit series names none of them + const longData = [ + { year: '2019', fruit: 'apples', value: 30 }, + { year: '2019', fruit: 'bananas', value: 20 }, + { year: '2020', fruit: 'apples', value: 40 }, + { year: '2020', fruit: 'bananas', value: 10 }, + ]; + + const longDataProps = { + data: longData, + x: 'year', + x1: 'fruit', + y: 'value', + seriesLayout: 'group' as const, + c: 'fruit', + cRange: ['red', 'yellow'], + legend: true, + width: 400, + height: 300, + }; + + async function legendButtons(container: HTMLElement) { + // `Legend` is lazy-loaded inside `ChartChildren` + let buttons: NodeListOf = container.querySelectorAll('.lc-legend-swatch-button'); + await vi.waitFor(() => { + buttons = container.querySelectorAll('.lc-legend-swatch-button'); + expect(buttons.length).toBe(2); + }); + return buttons; + } + + const bars = (container: HTMLElement) => + Array.from(container.querySelectorAll('.lc-bar')).map((el) => ({ + fill: el.getAttribute('fill'), + opacity: (el as SVGElement).style.opacity || el.getAttribute('opacity') || '1', + })); + + it('should hide a category\u2019s bars when its legend item is clicked', async () => { + const { container } = render(BarChart, longDataProps as any); + + const buttons = await legendButtons(container); + await vi.waitFor(() => expect(bars(container).length).toBe(4)); + + (buttons[0] as HTMLElement).click(); + + await vi.waitFor(() => { + // Only apples remain, and they keep the color the full domain gave them + expect(bars(container)).toEqual([ + { fill: 'red', opacity: '1' }, + { fill: 'red', opacity: '1' }, + ]); + }); + }); + + it('should stack the categories when `seriesLayout="stack"`', async () => { + // No `series` declares the layers and `x1` doesn't subdivide the band — the rows carry the + // categories, so `c` is what names the stack's segments + const { container } = render(BarChart, { + ...longDataProps, + x1: undefined, + seriesLayout: 'stack', + } as any); + + await vi.waitFor(() => expect(bars(container).length).toBe(4)); + + const stacked = Array.from(container.querySelectorAll('.lc-bar')).map((el) => { + const box = (el as SVGGraphicsElement).getBBox(); + return { + fill: el.getAttribute('fill'), + y: Math.round(box.y), + height: Math.round(box.height), + }; + }); + + // Each band's segments meet — the lower one's top edge is the upper one's bottom + const [firstLower, firstUpper] = stacked; + expect(firstLower.fill).toBe('red'); + expect(firstUpper.fill).toBe('yellow'); + expect(firstUpper.y + firstUpper.height).toBe(firstLower.y); + // ...and together they fill the band, since the domain covers the total + expect(firstUpper.y).toBe(0); + }); + + it('should restack from what is left when a category is hidden', async () => { + const { container } = render(BarChart, { + ...longDataProps, + x1: undefined, + seriesLayout: 'stack', + } as any); + + const baseOf = (el: Element) => { + const box = (el as SVGGraphicsElement).getBBox(); + return Math.round(box.y + box.height); + }; + + const buttons = await legendButtons(container); + await vi.waitFor(() => expect(bars(container).length).toBe(4)); + const baseline = Math.max(...Array.from(container.querySelectorAll('.lc-bar')).map(baseOf)); + + (buttons[0] as HTMLElement).click(); + + await vi.waitFor(() => { + const rest = Array.from(container.querySelectorAll('.lc-bar')); + expect(rest.length).toBe(2); + // The remaining category sits on the axis rather than floating where the other left it + for (const el of rest) { + expect(baseOf(el)).toBe(baseline); + } + }); + }); + + it('should fade the other categories while a legend item is hovered', async () => { + const { container } = render(BarChart, longDataProps as any); + + const buttons = await legendButtons(container); + await vi.waitFor(() => expect(bars(container).length).toBe(4)); + + buttons[0].dispatchEvent(new PointerEvent('pointerenter', { bubbles: false })); + + await vi.waitFor(() => { + expect(bars(container).map((b) => `${b.fill}:${b.opacity}`)).toEqual([ + 'red:1', + 'yellow:0.1', + 'red:1', + 'yellow:0.1', + ]); + }); + }); + }); + + describe('long data stacking', () => { + // One row per observation, with the category in a column — no `series` to name the layers + const stackedLongData = [ + { year: '2019', panel: 'a', fruit: 'apples', value: 30 }, + { year: '2019', panel: 'a', fruit: 'bananas', value: 10 }, + { year: '2020', panel: 'b', fruit: 'apples', value: 20 }, + { year: '2020', panel: 'b', fruit: 'bananas', value: 60 }, + ]; + + const stackedProps = { + data: stackedLongData, + x: 'year', + y: 'value', + c: 'fruit', + cRange: ['red', 'yellow'], + width: 400, + height: 300, + }; + + async function segments(container: HTMLElement) { + await vi.waitFor(() => expect(container.querySelectorAll('.lc-bar').length).toBe(4)); + return Array.from(container.querySelectorAll('.lc-bar')).map((el) => { + const box = (el as SVGGraphicsElement).getBBox(); + return { + top: Math.round(box.y), + bottom: Math.round(box.y + box.height), + rounded: /[Aa]/.test(el.getAttribute('d') ?? ''), + }; + }); + } + + /** The two segments of a band, outermost from the baseline first */ + const band = (bars: Awaited>, i: number) => + bars.slice(i * 2, i * 2 + 2).sort((a, b) => a.top - b.top); + + it('should normalize each band with `stackExpand`', async () => { + const { container } = render(BarChart, { + ...stackedProps, + seriesLayout: 'stackExpand', + } as any); + const bars = await segments(container); + + // Both bands fill the plot, whatever their totals — 40 and 80 here + for (const i of [0, 1]) { + const [upper, lower] = band(bars, i); + expect(upper.top).toBe(0); + expect(upper.bottom).toBe(lower.top); + } + expect(band(bars, 0)[0].bottom).not.toBe(band(bars, 1)[0].bottom); // different splits + }); + + it('should round only the outermost segment under `stackExpand`', async () => { + // Normalized spans all sit in [0, 1], so `isStackTop` compares magnitudes that barely differ + const { container } = render(BarChart, { + ...stackedProps, + seriesLayout: 'stackExpand', + } as any); + const bars = await segments(container); + + for (const i of [0, 1]) { + const [upper, lower] = band(bars, i); + expect(upper.rounded).toBe(true); + expect(lower.rounded).toBe(false); + } + }); + + it('should list the band\u2019s rows in the tooltip when `c` stacks them', async () => { + // Nothing subdivides the band here — without `x1`, the tooltip has to recognise that `c` is + // what put several rows in it, or it names only the row the pointer resolved to + const { container } = render(BarChart, stackedProps as any); + await segments(container); + + // Band mode hit-tests against a rect per band, and `DefaultTooltip` is lazy — so keep + // dispatching at the first band until it has mounted + await vi.waitFor(() => { + const hit = container.querySelector('.lc-tooltip-rect'); + expect(hit).not.toBeNull(); + const rect = hit!.getBoundingClientRect(); + const init = { + bubbles: true, + clientX: rect.x + rect.width / 2, + clientY: rect.y + rect.height / 2, + }; + hit!.dispatchEvent(new PointerEvent('pointerenter', init)); + hit!.dispatchEvent(new PointerEvent('pointermove', init)); + expect(document.querySelector('.lc-tooltip-item-root')).not.toBeNull(); + }); + + await vi.waitFor(() => { + const labels = Array.from(document.querySelectorAll('.lc-tooltip-item-label')).map((l) => + l.textContent?.trim() + ); + expect(labels).toEqual(['apples', 'bananas', 'total']); + }); + }); + + it('should stack each facet panel against its own rows', async () => { + const { container } = render(BarChart, { ...stackedProps, fx: 'panel' } as any); + await vi.waitFor(() => expect(container.querySelectorAll('.lc-bar').length).toBe(4)); + + // Group by column rather than by document order — faceting lays the panels out side by + // side, so which bar comes first isn't the reading order + const byColumn = new Map(); + for (const el of container.querySelectorAll('.lc-bar')) { + const box = (el as SVGGraphicsElement).getBBox(); + const column = Math.round(box.x); + const entry = { top: Math.round(box.y), bottom: Math.round(box.y + box.height) }; + byColumn.set(column, [...(byColumn.get(column) ?? []), entry]); + } + + expect(byColumn.size).toBe(2); // one bar per panel + // A panel's stack is built from that panel's rows — the segments meet within it rather + // than accumulating across panels + for (const stack of byColumn.values()) { + const [upper, lower] = stack.sort((a, b) => a.top - b.top); + expect(upper.bottom).toBe(lower.top); + } + }); + }); + describe('separate data per series', () => { const separateData = { apples: [ diff --git a/packages/layerchart/src/lib/components/charts/BarChart/BarChart.base.svelte b/packages/layerchart/src/lib/components/charts/BarChart/BarChart.base.svelte index 490e5e5a9f..d6396ffebc 100644 --- a/packages/layerchart/src/lib/components/charts/BarChart/BarChart.base.svelte +++ b/packages/layerchart/src/lib/components/charts/BarChart/BarChart.base.svelte @@ -23,7 +23,7 @@ radial = false, orientation = 'vertical', series: seriesProp, - seriesLayout = 'overlap', + seriesLayout = 'auto', axis = true, brush = false, grid = true, @@ -121,21 +121,24 @@ {#each context.series.visibleSeries as s, i (s.key)} s.value ?? s.key : undefined} - y1={valueAxis === 'x' && isGroupSeries ? (d: any) => s.value ?? s.key : undefined} - rounded={context.series.divergingEdgeKeys - ? context.series.divergingEdgeKeys.has(s.key) - ? 'edge' - : 'none' - : context.series.isStacked && i !== context.series.visibleSeries.length - 1 - ? 'none' - : Array.isArray(xProp) || Array.isArray(yProp) - ? 'all' - : 'edge'} + x1={valueAxis === 'y' && isGroupSeries && restProps.x1 == null + ? (d: any) => s.value ?? s.key + : undefined} + y1={valueAxis === 'x' && isGroupSeries && restProps.y1 == null + ? (d: any) => s.value ?? s.key + : undefined} + rounded={context.series.stackLayout != null + ? // Per row rather than per series: a sub-band or a gap in the data can leave the + // later series out, making an earlier one the top of *that* stack + (d: any) => (context.series.isStackTop(s.key, d) ? 'edge' : 'none') + : Array.isArray(xProp) || Array.isArray(yProp) + ? 'all' + : 'edge'} radius={4} strokeWidth={1} {stackPadding} - opacity={context.series.isHighlighted(s.key, true) ? 1 : 0.1} + opacity={(d: any) => + context.series.isHighlighted(context.cKey(d) ?? s.key, true) ? 1 : 0.1} onBarClick={(e: MouseEvent, detail: any) => onBarClick(e, { ...detail, series: s })} {...props.bars} {...s.props} diff --git a/packages/layerchart/src/lib/components/charts/BarChart/BarChart.shared.svelte.ts b/packages/layerchart/src/lib/components/charts/BarChart/BarChart.shared.svelte.ts index 1579ae5a48..ec1d13f78b 100644 --- a/packages/layerchart/src/lib/components/charts/BarChart/BarChart.shared.svelte.ts +++ b/packages/layerchart/src/lib/components/charts/BarChart/BarChart.shared.svelte.ts @@ -3,6 +3,7 @@ import type { Component } from 'svelte'; import type { ChartProps } from '../../Chart/Chart.shared.svelte.js'; import type { BarsProps } from '../../Bars/Bars.shared.svelte.js'; import type { SeriesData } from '../types.js'; +import type { SeriesLayout } from '$lib/states/series.svelte.js'; // Use explicit data prop for TData inference, with rest from ChartPropsWithoutHTML export type BarChartProps = { @@ -25,11 +26,11 @@ export type BarChartProps = { series?: SeriesData>[]; /** - * The layout of the series. + * How multiple series are arranged — see `Chart`'s `seriesLayout` for how `'auto'` resolves. * - * @default 'overlap' + * @default 'auto' */ - seriesLayout?: 'overlap' | 'stack' | 'stackExpand' | 'stackDiverging' | 'group'; + seriesLayout?: SeriesLayout; /** * Padding between primary x or y bands/bars, applied to scaleBand().padding() diff --git a/packages/layerchart/src/lib/components/charts/DefaultTooltip.svelte b/packages/layerchart/src/lib/components/charts/DefaultTooltip.svelte index 04de325508..951fef626d 100644 --- a/packages/layerchart/src/lib/components/charts/DefaultTooltip.svelte +++ b/packages/layerchart/src/lib/components/charts/DefaultTooltip.svelte @@ -6,6 +6,7 @@ // bloat the lazy chunk and trip Vite dev-server compilation in CI). import { sum } from 'd3-array'; import { getChartContext } from '$lib/contexts/chart.js'; + import { accessor, chartDataArray, isEqualValue } from '$lib/utils/common.js'; import Root from '../tooltip/Tooltip.svelte'; import Header from '../tooltip/TooltipHeader.svelte'; import List from '../tooltip/TooltipList.svelte'; @@ -25,9 +26,116 @@ const context = getChartContext(); + /** + * One row of the tooltip's list. `seriesKey` is the series it highlights on hover, or `null` + * when the item is a sub-band of the data rather than a series. + */ + type TooltipItem = { + key: string; + seriesKey: string | null; + label: any; + value: any; + color?: string; + }; + // Get visible series (already in correct order from TooltipContext) const visibleSeries = $derived(context.tooltip.series.filter((s) => s.visible)); + /** + * The rows the hovered band covers. + * + * Data-driven sub-bands (`x1` / `y1`) split one band across a row each, holding only that + * sub-band's series — so the band's values live across the rows rather than in the single one + * the pointer resolved to, and a tooltip for the band has to read all of them. + * + * A facet panel groups the same way, with the scale inside it as the sub-band, so its rows are + * read back off the panel instead of matched on a value. + */ + function bandData(data: any) { + if (context.facetBand) { + return context.facet.panels.find((panel) => panel.has(data))?.data ?? [data]; + } + + // Long data stacked by `c` puts several rows in a band with no `x1` to name them — the band + // is then the category axis itself + const banded = + context.props.x1 != null + ? context.x + : context.props.y1 != null + ? context.y + : context.cKey(data) != null + ? context.valueAxis === 'y' + ? context.x + : context.y + : null; + if (!banded) return [data]; + + const value = banded(data); + return chartDataArray(context.data).filter((d: any) => isEqualValue(banded(d), value)); + } + + /** + * The series values for the row being shown. + * + * `Tooltip.Root facetAll` renders one tooltip per facet panel, each for a *different* row, so + * the values resolved for the hovered row can't be reused — they're re-read with the same + * accessor rule `TooltipContext` uses. + */ + function seriesFor(data: any): TooltipItem[] { + const d = bandData(data); + + // Nothing names the sub-bands when the series are implicit — so the band's rows are the items + // themselves, one per sub-band, labelled by the value that placed them there: `x1` / `y1` + // within a band, or the band scale itself within a facet panel. + if (d.length > 1 && context.series.isDefaultSeries) { + const value = context.valueAxis === 'y' ? context.y : context.x; + const subBand = context.facetBand + ? context.valueAxis === 'y' + ? context.x + : context.y + : context.props.x1 != null + ? context.x1 + : context.props.y1 != null + ? context.y1 + : context.c; + return d.map((row: any) => ({ + key: String(subBand(row)), + // The rows are sub-bands rather than series — hovering one highlights the `c` category + // it carries, when the legend names those, and nothing otherwise + seriesKey: context.cKey(row) ?? null, + label: subBand(row), + value: value(row), + color: context.config.c ? context.cGet(row) : undefined, + })); + } + + const series = + d.length === 1 && data === context.tooltip.data + ? visibleSeries + : visibleSeries.map((s) => { + const config: any = s.config; + const valueAcc = accessor( + config?.value ?? (config?.data ? (context.props.y ?? context.props.x) : config?.key) + ); + // The first row of the band carrying this series — one row per sub-band, so only one + // of them holds any given series + const match = d.find((row: any) => valueAcc(row) != null); + return { ...s, value: match != null ? valueAcc(match) : undefined }; + }); + + // A series no row holds a value for would render as a label with nothing beside it, which + // reads as broken rather than as absent. + return series + .filter((s) => s.value != null) + .map((s) => ({ + key: s.key, + seriesKey: s.key, + label: s.label, + value: s.value, + color: s.color, + })); + } + // Single-point modes find one specific data point (by proximity in both x+y), // so the tooltip shows dimensional info (x, y, r) for that point. // Multi-series modes find data at a single axis position, showing all series values. @@ -43,18 +151,61 @@ : null ); - // Header label comes from x-axis (or y-axis for horizontal/vertical charts) - const headerLabel = $derived( - context.tooltip.data - ? context.valueAxis === 'y' - ? context.x(context.tooltip.data) - : context.y(context.tooltip.data) - : undefined - ); + /** + * The header for the row being shown — the x-axis value (or the y-axis one for horizontal and + * vertical charts), or the facet when the panel is the band, since the scale inside it labels + * the items instead. + * + * Taken from the row it's passed for the same reason `seriesFor` is: with `facetAll` each panel + * shows a *different* row, and a header read off the hovered one would name that panel in all of + * them. + */ + function headerLabelFor(data: any) { + if (!data) return undefined; + if (context.facetBand) { + return context.facet.tooltipLabel(data); + } + return context.valueAxis === 'y' ? context.x(data) : context.y(data); + } + + /** + * The panel the row sits in, for charts where the panel *isn't* the band. + * + * The band value alone names a row in every panel — three panels each have a `Torgersen` — so it + * only identifies the row once the panel is in front of it. Empty when the panel is the band, + * since the header is already the facet value there. + * + * What the panel is called is `facet.tooltip`'s to say, so both paths ask it. + */ + function facetLabelFor(data: any) { + if (!data || context.facetBand || !context.facet.enabled) return undefined; + + return context.facet.tooltipLabel(data); + } + + /** + * The header with its facet in front, formatted here rather than by `Tooltip.Header` — the band + * value still needs its own format applied before anything is joined to it, or a date or a + * number would land in the header raw. + */ + function facetHeaderLabelFor(data: any) { + const facetLabel = facetLabelFor(data); + return facetLabel != null + ? `${facetLabel} · ${format(headerLabelFor(data), tooltipProps?.header?.format as any)}` + : undefined; + } function isSeriesItemHighlighted(seriesKey: string | null | undefined) { return seriesKey ? context.series.isHighlighted(seriesKey, true) : undefined; } + + /** + * What hovering the row's items highlights — its `c` category when the legend names those, and + * the series the point belongs to otherwise. + */ + function activeKey(data: any) { + return context.cKey(data) ?? activeSeries?.key ?? null; + } @@ -72,18 +223,18 @@ (context.series.highlightKey = activeSeries?.key ?? null)} + onpointerenter={() => (context.series.highlightKey = activeKey(data))} onpointerleave={() => (context.series.highlightKey = null)} {...tooltipProps?.item} /> (context.series.highlightKey = activeSeries?.key ?? null)} + onpointerenter={() => (context.series.highlightKey = activeKey(data))} onpointerleave={() => (context.series.highlightKey = null)} {...tooltipProps?.item} /> @@ -91,38 +242,46 @@ (context.series.highlightKey = activeSeries?.key ?? null)} + onpointerenter={() => (context.series.highlightKey = activeKey(data))} onpointerleave={() => (context.series.highlightKey = null)} {...tooltipProps?.item} /> {/if} {:else} - + {@const facetHeaderLabel = facetHeaderLabelFor(data)} + {#if facetHeaderLabel != null} + + + {:else} + + {/if} - {#each visibleSeries as s, i (s.key ?? i)} + {#each seriesFor(data) as s, i (s.key ?? i)} (context.series.highlightKey = s.key)} + onpointerenter={() => (context.series.highlightKey = s.seriesKey)} onpointerleave={() => (context.series.highlightKey = null)} {...tooltipProps?.item} /> {/each} - {#if canHaveTotal && visibleSeries.length > 1 && !tooltipProps?.hideTotal} + {#if canHaveTotal && seriesFor(data).length > 1 && !tooltipProps?.hideTotal} s.value ?? 0)} + value={sum(seriesFor(data), (s) => s.value ?? 0)} format="integer" valueAlign="right" {...tooltipProps?.item} diff --git a/packages/layerchart/src/lib/components/charts/DefaultTooltip.svelte.test.ts b/packages/layerchart/src/lib/components/charts/DefaultTooltip.svelte.test.ts index 6fe288bcb8..aa38331598 100644 --- a/packages/layerchart/src/lib/components/charts/DefaultTooltip.svelte.test.ts +++ b/packages/layerchart/src/lib/components/charts/DefaultTooltip.svelte.test.ts @@ -83,7 +83,9 @@ describe('DefaultTooltip', () => { const labels = document.querySelectorAll('.lc-tooltip-item-label'); expect(labels.length).toBe(4); const labelTexts = Array.from(labels).map((l) => l.textContent?.trim()); - expect(labelTexts).toEqual(['apples', 'bananas', 'oranges', 'total']); + // Multi-series areas stack under the `auto` default, and a stacked tooltip lists its + // items top-down to match the layers on screen — so the series read in reverse + expect(labelTexts).toEqual(['oranges', 'bananas', 'apples', 'total']); }); }); @@ -106,7 +108,8 @@ describe('DefaultTooltip', () => { const colors = Array.from(colorDots).map((dot) => (dot as HTMLElement).style.getPropertyValue('--color') ); - expect(colors).toEqual(['rgb(255, 0, 0)', 'rgb(0, 128, 0)', 'rgb(255, 165, 0)']); + // Reversed with the stack, as above + expect(colors).toEqual(['rgb(255, 165, 0)', 'rgb(0, 128, 0)', 'rgb(255, 0, 0)']); }); }); @@ -208,6 +211,30 @@ describe('DefaultTooltip', () => { expect(labelTexts).toEqual(['apples', 'bananas', 'oranges', 'total']); }); }); + + it('should keep the declared order when a resolved stack is drawn by nothing', async () => { + // Several configured series resolve the layout to a stack, but lines decline an inferred + // one — so nothing is stacked, and there's no visual bottom-to-top order to match + const { container } = render(LineChart, { + data: timeSeriesData, + x: 'date', + y: 'apples', + series, + height: 300, + width: 400, + } as any); + + const tooltipCtx = container.querySelector('.lc-tooltip-context') as HTMLElement; + await expect.element(tooltipCtx).toBeInTheDocument(); + await dispatchAndWaitForTooltip(tooltipCtx); + + await vi.waitFor(() => { + const labels = Array.from(document.querySelectorAll('.lc-tooltip-item-label')).map((l) => + l.textContent?.trim() + ); + expect(labels.slice(0, 3)).toEqual(['apples', 'bananas', 'oranges']); + }); + }); }); describe('ScatterChart (single-point, quadtree mode)', () => { diff --git a/packages/layerchart/src/lib/components/charts/LineChart.svelte.test.ts b/packages/layerchart/src/lib/components/charts/LineChart.svelte.test.ts index 2234852c48..c1bdfc6031 100644 --- a/packages/layerchart/src/lib/components/charts/LineChart.svelte.test.ts +++ b/packages/layerchart/src/lib/components/charts/LineChart.svelte.test.ts @@ -4,6 +4,8 @@ import { scaleSequential } from 'd3-scale'; import { interpolateTurbo } from 'd3-scale-chromatic'; import LineChart from './LineChart/LineChart.svelte'; +import LineChartCustomMarks from './__fixtures__/LineChartCustomMarks.svelte'; +import ScatterChart from './ScatterChart/ScatterChart.svelte'; const data = [ { date: 0, value: 10 }, @@ -15,7 +17,7 @@ const data = [ describe('LineChart', () => { it('tooltip should prefer cScale color over default series color when cScale is explicitly provided', async () => { - const { container } = render(LineChart, { + const { container } = render(LineChartCustomMarks, { data, x: 'date', y: 'value', @@ -53,4 +55,226 @@ describe('LineChart', () => { expect(color).toMatch(/^rgb/); }); }); + + it('should colour the highlight point from `c`, like the line it sits on', async () => { + // The default series stands in for a chart that has none, so its colour can't win over the one + // `c` gave the mark — the point would sit on a line of a different colour. `facetAll` makes + // that visible: its copies resolve `c` already, so the hovered panel's point was the odd one. + const faceted = [ + { region: 'North', date: 0, value: 10 }, + { region: 'North', date: 1, value: 30 }, + { region: 'South', date: 0, value: 20 }, + { region: 'South', date: 1, value: 50 }, + ]; + const { container } = render(LineChart, { + data: faceted, + x: 'date', + y: 'value', + c: 'region', + cRange: ['rgb(1, 1, 1)', 'rgb(2, 2, 2)'], + fx: 'region', + highlight: { points: true, facetAll: true }, + height: 300, + width: 400, + } as any); + + const tooltipRect = container.querySelector('.lc-tooltip-context') as SVGElement | null; + await expect.element(tooltipRect).toBeInTheDocument(); + + const rect = tooltipRect!.getBoundingClientRect(); + const eventInit = { + bubbles: true, + clientX: rect.x + rect.width * 0.1, + clientY: rect.y + rect.height / 2, + }; + + await vi.waitFor(() => { + tooltipRect!.dispatchEvent(new PointerEvent('pointerenter', eventInit)); + tooltipRect!.dispatchEvent(new PointerEvent('pointermove', eventInit)); + + const fills = Array.from(document.querySelectorAll('.lc-highlight-point')).map((p) => + p.getAttribute('fill') + ); + expect(fills.length).toBe(2); + // the hovered panel's point included — not the default series colour + expect(fills.every((f) => f?.startsWith('rgb('))).toBe(true); + }); + }); +}); + +describe('legend `c` category toggle', () => { + // `c` names the legend's items when no `series` do, and a single implicit series draws every + // line — so the fade has to tell the lines apart by their `c` value + const longData = [ + { date: 0, fruit: 'apples', value: 10 }, + { date: 1, fruit: 'apples', value: 30 }, + { date: 0, fruit: 'bananas', value: 20 }, + { date: 1, fruit: 'bananas', value: 50 }, + ]; + + const longDataProps = { + data: longData, + x: 'date', + y: 'value', + // `c` alone splits and colors the lines — no `z`, no `stroke`, no `series` + c: 'fruit', + cRange: ['red', 'yellow'], + legend: true, + width: 400, + height: 300, + }; + + async function legendButtons(container: HTMLElement) { + // `Legend` is lazy-loaded inside `ChartChildren` + let buttons: NodeListOf = container.querySelectorAll('.lc-legend-swatch-button'); + await vi.waitFor(() => { + buttons = container.querySelectorAll('.lc-legend-swatch-button'); + expect(buttons.length).toBe(2); + }); + return buttons; + } + + const splines = (container: HTMLElement) => + Array.from(container.querySelectorAll('.lc-path')).map((el) => ({ + stroke: el.getAttribute('stroke'), + opacity: (el as SVGElement).style.opacity || el.getAttribute('opacity') || '1', + })); + + it('should fade the other lines while a legend item is hovered', async () => { + const { container } = render(LineChart, longDataProps as any); + + const buttons = await legendButtons(container); + await vi.waitFor(() => expect(splines(container).length).toBe(2)); + + buttons[0].dispatchEvent(new PointerEvent('pointerenter', { bubbles: false })); + + // One series draws both lines, so a mark-wide fade would dim them together + await vi.waitFor(() => { + expect(splines(container)).toEqual([ + { stroke: 'red', opacity: '1' }, + { stroke: 'yellow', opacity: '0.1' }, + ]); + }); + }); + + it('should drop a line when its legend item is clicked', async () => { + const { container } = render(LineChart, longDataProps as any); + + const buttons = await legendButtons(container); + await vi.waitFor(() => expect(splines(container).length).toBe(2)); + + (buttons[0] as HTMLElement).click(); + + await vi.waitFor(() => { + expect(splines(container)).toEqual([{ stroke: 'red', opacity: '1' }]); + }); + }); +}); + +describe('LineChart highlight over `c` groups', () => { + // One implicit series draws every line here, so the tooltip's series list names only the row the + // pointer resolved to — a single point, on whichever category happened to be last + const longData = [ + { year: 2016, fruit: 'apples', value: 100 }, + { year: 2016, fruit: 'bananas', value: 200 }, + { year: 2016, fruit: 'cherries', value: 300 }, + { year: 2017, fruit: 'apples', value: 400 }, + { year: 2017, fruit: 'bananas', value: 500 }, + { year: 2017, fruit: 'cherries', value: 600 }, + ]; + + it('points every line, not just the last category', async () => { + const { container } = render(LineChart, { + data: longData, + x: 'year', + y: 'value', + c: 'fruit', + cRange: ['rgb(1, 1, 1)', 'rgb(2, 2, 2)', 'rgb(3, 3, 3)'], + height: 300, + width: 400, + } as any); + + const tooltipRect = container.querySelector('.lc-tooltip-context') as SVGElement | null; + await expect.element(tooltipRect).toBeInTheDocument(); + + const rect = tooltipRect!.getBoundingClientRect(); + const eventInit = { + bubbles: true, + clientX: rect.x + rect.width * 0.9, + clientY: rect.y + rect.height / 2, + }; + + await vi.waitFor(() => { + tooltipRect!.dispatchEvent(new PointerEvent('pointerenter', eventInit)); + tooltipRect!.dispatchEvent(new PointerEvent('pointermove', eventInit)); + + const points = Array.from(document.querySelectorAll('.lc-highlight-point')); + expect(points).toHaveLength(3); + + // one per line, each in its own colour and at its own height + const fills = points.map((p) => p.getAttribute('fill')); + expect(new Set(fills).size).toBe(3); + const ys = points.map((p) => Math.round(Number(p.getAttribute('cy')))); + expect(new Set(ys).size).toBe(3); + }); + }); +}); + +describe('LineChart seriesLayout', () => { + const svelteRows = [ + { date: 0, cumsum: 100 }, + { date: 1, cumsum: 586 }, + ]; + const kitRows = [ + { date: 0, cumsum: 40 }, + { date: 1, cumsum: 212 }, + ]; + const seriesProps = { + x: 'date', + y: 'cumsum', + series: [ + { key: 'svelte', data: svelteRows }, + { key: 'sveltekit', data: kitRows }, + ], + height: 300, + width: 400, + }; + + it('overlaps several series rather than inferring a stack', async () => { + // Lines sit on a shared baseline rather than on each other. Left to infer, several series + // resolve to a stack that no line draws — and the value axis is then scaled to a total + // nothing on the chart shows, squashing every line. + let ctx: any; + render(LineChartCustomMarks, { ...seriesProps, oncontext: (c: any) => (ctx = c) } as any); + + await vi.waitFor(() => expect(ctx?.width).toBeGreaterThan(0)); + expect(ctx.isStacked).toBe(false); + // 586 + 212 = 798, so a stacked domain would push the axis past 600 + expect(ctx.yScale.domain()[1]).toBeLessThanOrEqual(600); + }); + + it('overlaps for `ScatterChart` too — points share a baseline the same way', async () => { + let ctx: any; + render(LineChartCustomMarks, { + ...seriesProps, + component: ScatterChart, + oncontext: (c: any) => (ctx = c), + } as any); + + await vi.waitFor(() => expect(ctx?.width).toBeGreaterThan(0)); + expect(ctx.isStacked).toBe(false); + }); + + it('still stacks when asked to', async () => { + let ctx: any; + render(LineChartCustomMarks, { + ...seriesProps, + seriesLayout: 'stack', + oncontext: (c: any) => (ctx = c), + } as any); + + await vi.waitFor(() => expect(ctx?.width).toBeGreaterThan(0)); + // Only that the prop is honoured — whether lines *draw* the stack is the marks' own guard + expect(ctx.seriesLayout).toBe('stack'); + }); }); diff --git a/packages/layerchart/src/lib/components/charts/PieChart.svelte.test.ts b/packages/layerchart/src/lib/components/charts/PieChart.svelte.test.ts index 75d2f72d46..7e8f1ece90 100644 --- a/packages/layerchart/src/lib/components/charts/PieChart.svelte.test.ts +++ b/packages/layerchart/src/lib/components/charts/PieChart.svelte.test.ts @@ -41,4 +41,26 @@ describe('PieChart', () => { expect(tooltipValue?.textContent).toContain('275'); }); }); + + it('should not draw a cartesian grid behind the arcs', async () => { + // A pie has no cartesian axes to grid against. With `series`, the scales gain a domain and + // the default grid starts drawing lines across the plot — `ArcChart` already opts out. + const { container } = render(PieChart, { + key: 'browser', + value: 'visitors', + series: [ + { key: '2023', data }, + { key: '2024', data }, + ], + height: 300, + width: 300, + }); + + const arc = container.querySelector('.lc-arc-line') as SVGElement | null; + await expect.element(arc).toBeInTheDocument(); + + expect( + container.querySelectorAll('.lc-grid line, .lc-grid path, .lc-grid circle') + ).toHaveLength(0); + }); }); diff --git a/packages/layerchart/src/lib/components/charts/PieChart/PieChart.base.svelte b/packages/layerchart/src/lib/components/charts/PieChart/PieChart.base.svelte index ca6d188815..0de46bec22 100644 --- a/packages/layerchart/src/lib/components/charts/PieChart/PieChart.base.svelte +++ b/packages/layerchart/src/lib/components/charts/PieChart/PieChart.base.svelte @@ -197,6 +197,7 @@ bottom: legend === true || getObjectOrNull(legend)?.placement?.includes('bottom') ? 32 : 0, }} axis={false} + grid={false} {...restProps} tooltipContext={tooltipContext === false ? false diff --git a/packages/layerchart/src/lib/components/charts/__fixtures__/LineChartCustomMarks.svelte b/packages/layerchart/src/lib/components/charts/__fixtures__/LineChartCustomMarks.svelte new file mode 100644 index 0000000000..edc61182f6 --- /dev/null +++ b/packages/layerchart/src/lib/components/charts/__fixtures__/LineChartCustomMarks.svelte @@ -0,0 +1,28 @@ + + + + {#snippet marks()} + + {/snippet} + diff --git a/packages/layerchart/src/lib/components/charts/__screenshots__/AreaChart.svelte.test.ts/AreaChart-annotations-over-a-stack-should-place-a-point-naming-a-series-on-that-series--stacked-top-1.png b/packages/layerchart/src/lib/components/charts/__screenshots__/AreaChart.svelte.test.ts/AreaChart-annotations-over-a-stack-should-place-a-point-naming-a-series-on-that-series--stacked-top-1.png new file mode 100644 index 0000000000..5988598fbd Binary files /dev/null and b/packages/layerchart/src/lib/components/charts/__screenshots__/AreaChart.svelte.test.ts/AreaChart-annotations-over-a-stack-should-place-a-point-naming-a-series-on-that-series--stacked-top-1.png differ diff --git a/packages/layerchart/src/lib/components/charts/__screenshots__/LineChart.svelte.test.ts/LineChart-should-colour-the-highlight-point-from--c---like-the-line-it-sits-on-1.png b/packages/layerchart/src/lib/components/charts/__screenshots__/LineChart.svelte.test.ts/LineChart-should-colour-the-highlight-point-from--c---like-the-line-it-sits-on-1.png new file mode 100644 index 0000000000..6a721c927e Binary files /dev/null and b/packages/layerchart/src/lib/components/charts/__screenshots__/LineChart.svelte.test.ts/LineChart-should-colour-the-highlight-point-from--c---like-the-line-it-sits-on-1.png differ diff --git a/packages/layerchart/src/lib/components/charts/__screenshots__/LineChart.svelte.test.ts/LineChart-should-colour-the-highlight-point-from--c---like-the-line-it-sits-on-2.png b/packages/layerchart/src/lib/components/charts/__screenshots__/LineChart.svelte.test.ts/LineChart-should-colour-the-highlight-point-from--c---like-the-line-it-sits-on-2.png new file mode 100644 index 0000000000..4cf4909a6a Binary files /dev/null and b/packages/layerchart/src/lib/components/charts/__screenshots__/LineChart.svelte.test.ts/LineChart-should-colour-the-highlight-point-from--c---like-the-line-it-sits-on-2.png differ diff --git a/packages/layerchart/src/lib/components/charts/__screenshots__/PieChart.svelte.test.ts/PieChart-should-not-draw-a-cartesian-grid-behind-the-arcs-1.png b/packages/layerchart/src/lib/components/charts/__screenshots__/PieChart.svelte.test.ts/PieChart-should-not-draw-a-cartesian-grid-behind-the-arcs-1.png new file mode 100644 index 0000000000..c1e2308c44 Binary files /dev/null and b/packages/layerchart/src/lib/components/charts/__screenshots__/PieChart.svelte.test.ts/PieChart-should-not-draw-a-cartesian-grid-behind-the-arcs-1.png differ diff --git a/packages/layerchart/src/lib/components/charts/__screenshots__/PieChart.svelte.test.ts/PieChart-should-not-draw-a-cartesian-grid-behind-the-arcs-2.png b/packages/layerchart/src/lib/components/charts/__screenshots__/PieChart.svelte.test.ts/PieChart-should-not-draw-a-cartesian-grid-behind-the-arcs-2.png new file mode 100644 index 0000000000..c1e2308c44 Binary files /dev/null and b/packages/layerchart/src/lib/components/charts/__screenshots__/PieChart.svelte.test.ts/PieChart-should-not-draw-a-cartesian-grid-behind-the-arcs-2.png differ diff --git a/packages/layerchart/src/lib/components/index.ts b/packages/layerchart/src/lib/components/index.ts index 34701066e6..4a335bb0b8 100644 --- a/packages/layerchart/src/lib/components/index.ts +++ b/packages/layerchart/src/lib/components/index.ts @@ -25,6 +25,8 @@ export { default as BoxPlot } from './BoxPlot/BoxPlot.svelte'; export * from './BoxPlot/BoxPlot.svelte'; export { default as Bounds } from './Bounds.svelte'; export * from './Bounds.svelte'; +export { default as Brush } from './Brush/Brush.svelte'; +export * from './Brush/Brush.svelte'; export { default as BrushContext } from './BrushContext.svelte'; export * from './BrushContext.svelte'; export { default as Calendar } from './Calendar/Calendar.svelte'; @@ -36,6 +38,8 @@ export * from './layers/Canvas.svelte'; export { default as Chart } from './Chart/Chart.svelte'; export * from './Chart/Chart.svelte'; export { default as ChartCore } from './Chart/ChartCore.svelte'; +export { default as ChartGroup } from './ChartGroup.svelte'; +export * from './ChartGroup.svelte'; export { default as ChartClipPath } from './ChartClipPath/ChartClipPath.svelte'; export * from './ChartClipPath/ChartClipPath.svelte'; export { default as Circle } from './Circle/Circle.svelte'; @@ -54,6 +58,7 @@ export { default as Dodge } from './Dodge/Dodge.svelte'; export * from './Dodge/Dodge.svelte'; export { default as Ellipse } from './Ellipse/Ellipse.svelte'; export * from './Ellipse/Ellipse.svelte'; +export { default as FacetAxis } from './FacetAxis.svelte'; export { default as Frame } from './Frame/Frame.svelte'; export * from './Frame/Frame.svelte'; export { default as Grid } from './Grid/Grid.svelte'; diff --git a/packages/layerchart/src/lib/components/layers/Canvas.svelte b/packages/layerchart/src/lib/components/layers/Canvas.svelte index a976bcc041..392eadd2b0 100644 --- a/packages/layerchart/src/lib/components/layers/Canvas.svelte +++ b/packages/layerchart/src/lib/components/layers/Canvas.svelte @@ -1,6 +1,7 @@ + + + + + + diff --git a/packages/layerchart/src/lib/components/tests/BrushMarkHarness.svelte b/packages/layerchart/src/lib/components/tests/BrushMarkHarness.svelte new file mode 100644 index 0000000000..50f9c131b1 --- /dev/null +++ b/packages/layerchart/src/lib/components/tests/BrushMarkHarness.svelte @@ -0,0 +1,31 @@ + + + + + + + diff --git a/packages/layerchart/src/lib/components/tests/ChartCoreTestHarness.svelte b/packages/layerchart/src/lib/components/tests/ChartCoreTestHarness.svelte index 371a7378ba..cf9b9ce9ed 100644 --- a/packages/layerchart/src/lib/components/tests/ChartCoreTestHarness.svelte +++ b/packages/layerchart/src/lib/components/tests/ChartCoreTestHarness.svelte @@ -25,7 +25,5 @@ - {#snippet children()} -
ChartCore children
- {/snippet} +
ChartCore children
diff --git a/packages/layerchart/src/lib/components/tests/ChartGroupTestHarness.svelte b/packages/layerchart/src/lib/components/tests/ChartGroupTestHarness.svelte new file mode 100644 index 0000000000..9be24d635f --- /dev/null +++ b/packages/layerchart/src/lib/components/tests/ChartGroupTestHarness.svelte @@ -0,0 +1,76 @@ + + +{#snippet charts()} + {#each members as member, i (i)} + + {/each} +{/snippet} + +{#if useContext} + + {#snippet children({ group: contextGroup })} + {@const _ = ongroup?.(contextGroup)} + {@render charts()} + {/snippet} + +{:else} + {@render charts()} +{/if} diff --git a/packages/layerchart/src/lib/components/tests/ChartWithMarkSeries.svelte b/packages/layerchart/src/lib/components/tests/ChartWithMarkSeries.svelte new file mode 100644 index 0000000000..993faf7f6a --- /dev/null +++ b/packages/layerchart/src/lib/components/tests/ChartWithMarkSeries.svelte @@ -0,0 +1,28 @@ + + + + + + + + + diff --git a/packages/layerchart/src/lib/components/tests/MixedMarksHarness.svelte b/packages/layerchart/src/lib/components/tests/MixedMarksHarness.svelte new file mode 100644 index 0000000000..c695449adb --- /dev/null +++ b/packages/layerchart/src/lib/components/tests/MixedMarksHarness.svelte @@ -0,0 +1,29 @@ + + + + + + + + diff --git a/packages/layerchart/src/lib/components/tests/TooltipTestHarness.svelte b/packages/layerchart/src/lib/components/tests/TooltipTestHarness.svelte new file mode 100644 index 0000000000..2bb7c83ac1 --- /dev/null +++ b/packages/layerchart/src/lib/components/tests/TooltipTestHarness.svelte @@ -0,0 +1,37 @@ + + + +
+ +
diff --git a/packages/layerchart/src/lib/components/tooltip/Tooltip.svelte b/packages/layerchart/src/lib/components/tooltip/Tooltip.svelte index 7985a659d6..06754e029f 100644 --- a/packages/layerchart/src/lib/components/tooltip/Tooltip.svelte +++ b/packages/layerchart/src/lib/components/tooltip/Tooltip.svelte @@ -14,6 +14,23 @@ * @default 'pointer' */ x?: 'pointer' | 'data' | number; + + /** + * The row to show, instead of the one the chart's pointer resolved. + * + * Lets a chart show more than one tooltip at a time, which is what `facetAll` does. + */ + data?: T; + + /** + * In a faceted chart, show one tooltip per panel — each labelling *its* row at the hovered + * position, beside its own point. Panels with nothing there show nothing. + * + * Pairs with ``, which marks those same rows. + * + * @default false + */ + facetAll?: boolean; /** * `y` position of tooltip. By default uses the pointer/mouse, can also snap to data or an * explicit fixed position. @@ -163,11 +180,14 @@ -{#if ctx.tooltip.data} + + +{#if facetAll && ctx.facet.enabled && dataProp === undefined} + {#each ctx.facet.panels as panel (panel.key)} + {@const row = panelDatum(ctx, panel, ctx.tooltip.data)} + {#if row} + + {/if} + {/each} +{:else if tooltipData && !ctx.tooltip.suppressed}
{#if children}
- {@render children({ data: ctx.tooltip.data })} + {@render children({ data: tooltipData })}
{/if}
diff --git a/packages/layerchart/src/lib/components/tooltip/TooltipContext.svelte b/packages/layerchart/src/lib/components/tooltip/TooltipContext.svelte index b4b1753f9a..faafd38ea4 100644 --- a/packages/layerchart/src/lib/components/tooltip/TooltipContext.svelte +++ b/packages/layerchart/src/lib/components/tooltip/TooltipContext.svelte @@ -8,6 +8,7 @@ | 'bisect-x' // requires values to be sorted | 'bisect-y' // requires values to be sorted | 'band' + | 'facet' // the panel as the band, for a band scale grouped by `fx` / `fy` | 'bisect-band' // requires values to be sorted | 'bounds' | 'voronoi' @@ -111,7 +112,8 @@ +
+ {/await} - {:else if mode === 'bounds' || mode === 'band'} + {:else if mode === 'bounds' || isBandMode} - - {#each rects as rect} - - {#if ctx.radial} - {#await import('../Arc/Arc.svelte') then { default: Arc }} - + {#each rectsFor(panelData(facet)) as rect} + + {#if ctx.radial} + {#await import('../Arc/Arc.svelte') then { default: Arc }} + showTooltip(e, rect?.data)} + onpointermove={(e) => showTooltip(e, rect?.data)} + onpointerleave={() => hideTooltip()} + onpointerdown={(e) => { + const target = e.target as Element; + if (target?.hasPointerCapture(e.pointerId)) { + target.releasePointerCapture(e.pointerId); + } + }} + onclick={(e) => { + onclick(e, { data: rect?.data }); + }} + /> + {/await} + {:else} + showTooltip(e, rect?.data)} onpointermove={(e) => showTooltip(e, rect?.data)} @@ -805,37 +912,17 @@ onclick(e, { data: rect?.data }); }} /> - {/await} - {:else} - showTooltip(e, rect?.data)} - onpointermove={(e) => showTooltip(e, rect?.data)} - onpointerleave={() => hideTooltip()} - onpointerdown={(e) => { - const target = e.target as Element; - if (target?.hasPointerCapture(e.pointerId)) { - target.releasePointerCapture(e.pointerId); - } - }} - onclick={(e) => { - onclick(e, { data: rect?.data }); - }} - /> - {/if} - {/each} - + {/if} + {/each} + + {/snippet} {:else if ['quadtree', 'quadtree-x', 'quadtree-y'].includes(mode) && debug} - {#if quadtree} - {#each quadtreeRects(quadtree, false) as rect} + {#each quadtrees.values() as tree} + {#each quadtreeRects(tree, false) as rect} {/each} - {/if} + {/each} diff --git a/packages/layerchart/src/lib/components/tooltip/TooltipState.svelte.test.ts b/packages/layerchart/src/lib/components/tooltip/TooltipState.svelte.test.ts new file mode 100644 index 0000000000..ca2c29e8e0 --- /dev/null +++ b/packages/layerchart/src/lib/components/tooltip/TooltipState.svelte.test.ts @@ -0,0 +1,225 @@ +import { describe, expect, it, vi } from 'vitest'; +import { cleanup, render } from 'vitest-browser-svelte'; +import { page } from 'vitest/browser'; + +import TooltipTestHarness from '../tests/TooltipTestHarness.svelte'; +import type { ChartState } from '$lib/states/chart.svelte.js'; + +const data = [ + { date: new Date('2024-01-01'), value: 10 }, + { date: new Date('2024-01-02'), value: 30 }, + { date: new Date('2024-01-03'), value: 20 }, + { date: new Date('2024-01-04'), value: 50 }, +]; + +const defaultChartProps = { + data, + x: 'date', + y: 'value', + padding: { top: 0, right: 0, bottom: 0, left: 20 }, +}; + +/** Render a chart and resolve once its context (and scales) are ready */ +async function renderChart(chartProps: Record = {}) { + let ctx: ChartState = null!; + + render(TooltipTestHarness, { + chartProps: { ...defaultChartProps, ...chartProps }, + oncontext: (c: any) => (ctx = c), + }); + + await vi.waitFor(() => { + expect(ctx?.width).toBeGreaterThan(0); + }); + + return ctx; +} + +describe('TooltipState', () => { + describe('show({ value })', () => { + it('resolves the nearest data point from a domain value', async () => { + const ctx = await renderChart({ tooltipContext: { mode: 'bisect-x' } }); + + ctx.tooltip.show({ value: { x: new Date('2024-01-02T20:00:00') } }); + + expect(ctx.tooltip.data).toEqual(data[2]); + }); + + it('resolves an exact domain value', async () => { + const ctx = await renderChart({ tooltipContext: { mode: 'bisect-x' } }); + + ctx.tooltip.show({ value: { x: new Date('2024-01-04') } }); + + expect(ctx.tooltip.data).toEqual(data[3]); + }); + + it('positions the tooltip from the chart scales, not a pointer', async () => { + const ctx = await renderChart({ tooltipContext: { mode: 'bisect-x' } }); + + ctx.tooltip.show({ value: { x: new Date('2024-01-04') } }); + + // last point sits at the end of the x range, offset by the left padding + expect(ctx.tooltip.x).toBeCloseTo(ctx.xScale(data[3].date) + ctx.padding.left, 5); + expect(ctx.tooltip.y).toBeCloseTo(ctx.yScale(data[3].value) + ctx.padding.top, 5); + }); + + it('works on charts using a pixel-based mode', async () => { + // `quadtree-x` has no value-based equivalent, so it falls back to bisecting `x` + const ctx = await renderChart({ tooltipContext: { mode: 'quadtree-x' } }); + + ctx.tooltip.show({ value: { x: new Date('2024-01-02') } }); + + expect(ctx.tooltip.data).toEqual(data[1]); + }); + + it('populates series values', async () => { + const ctx = await renderChart({ + series: [{ key: 'value', label: 'Value', value: 'value' }], + tooltipContext: { mode: 'bisect-x' }, + }); + + ctx.tooltip.show({ value: { x: new Date('2024-01-02') } }); + + expect(ctx.tooltip.series).toHaveLength(1); + expect(ctx.tooltip.series[0]).toMatchObject({ key: 'value', label: 'Value', value: 30 }); + }); + + it('hides when no data can be resolved', async () => { + const ctx = await renderChart({ data: [], tooltipContext: { mode: 'bisect-x' } }); + + ctx.tooltip.show({ value: { x: new Date('2024-01-02') } }); + + await vi.waitFor(() => { + expect(ctx.tooltip.data).toBeNull(); + }); + }); + }); + + describe('show({ data })', () => { + it('shows a known data point positioned from the chart scales', async () => { + const ctx = await renderChart(); + + ctx.tooltip.show({ data: data[1] }); + + expect(ctx.tooltip.data).toEqual(data[1]); + expect(ctx.tooltip.x).toBeCloseTo(ctx.xScale(data[1].date) + ctx.padding.left, 5); + expect(ctx.tooltip.y).toBeCloseTo(ctx.yScale(data[1].value) + ctx.padding.top, 5); + }); + }); + + describe('show({ point })', () => { + it('resolves data from a container-relative pixel coordinate', async () => { + const ctx = await renderChart({ tooltipContext: { mode: 'bisect-x' } }); + + const point = { + x: ctx.xScale(data[2].date) + ctx.padding.left, + y: ctx.yScale(data[2].value) + ctx.padding.top, + }; + ctx.tooltip.show({ point }); + + expect(ctx.tooltip.data).toEqual(data[2]); + // unlike `show({ value })`, the supplied point is kept as-is + expect(ctx.tooltip.x).toBe(point.x); + expect(ctx.tooltip.y).toBe(point.y); + }); + }); + + describe('show({ point, data })', () => { + it('shows an explicit data point at an explicit position', async () => { + const ctx = await renderChart({ tooltipContext: { mode: 'bisect-x' } }); + + // `data` skips resolution, `point` overrides the position derived from it + ctx.tooltip.show({ point: { x: 5, y: 7 }, data: data[3] }); + + expect(ctx.tooltip.data).toEqual(data[3]); + expect(ctx.tooltip.x).toBe(5); + expect(ctx.tooltip.y).toBe(7); + }); + }); + + describe('show(event, data)', () => { + /** A pointer event positioned at container-relative `{ x, y }`, targeting the chart root */ + function pointerEventAt(ctx: ChartState, x: number, y: number) { + const rect = ctx.containerRef!.getBoundingClientRect(); + const e = new PointerEvent('pointermove', { + bubbles: true, + clientX: rect.x + x, + clientY: rect.y + y, + }); + // `showTooltip` reads `e.target.closest('.lc-root-container')`, which an undispatched + // event does not have + Object.defineProperty(e, 'target', { value: ctx.containerRef }); + return e; + } + + it('still resolves data from a pointer event', async () => { + const ctx = await renderChart({ tooltipContext: { mode: 'bisect-x' } }); + + const e = pointerEventAt( + ctx, + ctx.padding.left + ctx.xScale(data[2].date), + ctx.padding.top + ctx.yScale(data[2].value) + ); + ctx.tooltip.show(e); + + expect(ctx.tooltip.data).toEqual(data[2]); + }); + + it('still shows explicit data at the pointer position', async () => { + const ctx = await renderChart(); + + ctx.tooltip.show(pointerEventAt(ctx, 40, 60), data[0]); + + expect(ctx.tooltip.data).toEqual(data[0]); + expect(ctx.tooltip.x).toBeCloseTo(40, 5); + expect(ctx.tooltip.y).toBeCloseTo(60, 5); + }); + }); + + describe('hide', () => { + it('clears data shown by `show({ value })`', async () => { + const ctx = await renderChart({ tooltipContext: { mode: 'bisect-x' } }); + + ctx.tooltip.show({ value: { x: new Date('2024-01-02') } }); + expect(ctx.tooltip.data).toEqual(data[1]); + + ctx.tooltip.hide(); + + await vi.waitFor(() => { + expect(ctx.tooltip.data).toBeNull(); + }); + }); + + it('is not re-shown by a chart mounting under a parked cursor', async () => { + // Vitest's browser mode tiles every test file's iframe into one page sharing a single + // cursor, so a `hover()` elsewhere can leave it wherever this chart later mounts. Park it + // first, then mount underneath it: the browser fires a boundary event at the element that + // appears under a stationary cursor, which would otherwise show data never asked for. + const parked = await renderChart({ tooltipContext: { mode: 'bisect-x' } }); + const rect = parked.containerRef!.getBoundingClientRect(); + await page + .elementLocator(document.body) + .hover({ position: { x: rect.x + 25, y: rect.y + 50 } }); + + cleanup(); + const ctx = await renderChart({ tooltipContext: { mode: 'bisect-x' } }); + + ctx.tooltip.show({ value: { x: new Date('2024-01-02') } }); + expect(ctx.tooltip.data).toEqual(data[1]); + + ctx.tooltip.hide(); + + await vi.waitFor(() => { + expect(ctx.tooltip.data).toBeNull(); + }); + + // give a boundary event from the parked cursor a chance to land + await new Promise((resolve) => setTimeout(resolve, 50)); + expect(ctx.tooltip.data).toBeNull(); + + // Put the cursor back where it started. Files sharing the page render charts directly + // rather than through this harness, so leaving it parked would hand them the same hazard. + await page.elementLocator(document.body).hover({ position: { x: 0, y: 0 } }); + }); + }); +}); diff --git a/packages/layerchart/src/lib/contexts/chart.ts b/packages/layerchart/src/lib/contexts/chart.ts index c369d46d12..7f49765420 100644 --- a/packages/layerchart/src/lib/contexts/chart.ts +++ b/packages/layerchart/src/lib/contexts/chart.ts @@ -3,11 +3,6 @@ import type { ChartState } from '$lib/states/chart.svelte.js'; import type { AnyScale } from '$lib/utils/scales.svelte.js'; export type { ChartState }; -export type { - NodeKind, - ComponentNode, - RegisterComponentOptions, -} from '$lib/states/chart.svelte.js'; const _ChartContext = new Context>('ChartContext'); @@ -16,6 +11,7 @@ const _ChartContext = new Context>('ChartCon * Provides safe defaults to prevent runtime errors. */ const fallbackContext = { + id: Symbol('FallbackChart'), registerMark: () => () => { /* no-op */ }, @@ -47,6 +43,8 @@ const fallbackContext = { isHoveringTooltipArea: false, isHoveringTooltipContent: false, mode: 'manual' as const, + source: null, + suppressed: false, show: () => {}, hide: () => {}, }, diff --git a/packages/layerchart/src/lib/contexts/facet.ts b/packages/layerchart/src/lib/contexts/facet.ts new file mode 100644 index 0000000000..156aa1a44a --- /dev/null +++ b/packages/layerchart/src/lib/contexts/facet.ts @@ -0,0 +1,41 @@ +import { Context } from 'runed'; + +import { chartDataArray } from '$lib/utils/common.js'; +import { getChartContext } from '$lib/contexts/chart.js'; +import type { Facet } from '$lib/states/facet.svelte.js'; + +/** + * The panel a component is rendering into, or `undefined` outside a faceted chart. + * + * Read during init, as with any context. Returns a getter so reads stay current as the panels + * are rebuilt. Marks usually want `getMarkData()` rather than this. + */ +const _FacetPanelContext = new Context<() => Facet>('FacetPanelContext'); + +export function getFacetPanel(): (() => Facet) | undefined { + return _FacetPanelContext.getOr(undefined as unknown as () => Facet) ?? undefined; +} + +/** + * Set the panel for a subtree, or clear it with `undefined` — which is what the grid's own + * furniture wants, since it belongs to the whole grid rather than to any one panel. + */ +export function setFacetPanel(getPanel: (() => Facet) | undefined) { + return _FacetPanelContext.set(getPanel as () => Facet); +} + +/** + * Resolves the rows a mark should draw: its own `data` when given, else the panel it's rendering + * into, else the chart's. + * + * Call during init (a component's setup, or a state class field initializer) — it reads context — + * then call the returned resolver from wherever the data is needed, including inside a `$derived`. + * + * Marks resolve this rather than the chart context being swapped underneath them, so what a mark + * draws stays visible at its own call site. + */ +export function getMarkData(): (own?: any) => any[] { + const ctx = getChartContext(); + const panel = getFacetPanel(); + return (own?: any) => chartDataArray(own ?? panel?.().data ?? ctx.data); +} diff --git a/packages/layerchart/src/lib/contexts/geo.ts b/packages/layerchart/src/lib/contexts/geo.ts index 19847a2e0b..772270fc41 100644 --- a/packages/layerchart/src/lib/contexts/geo.ts +++ b/packages/layerchart/src/lib/contexts/geo.ts @@ -1,8 +1,6 @@ import { Context } from 'runed'; import type { GeoState, GeoStateProps } from '$lib/states/geo.svelte.js'; -export type { GeoState, GeoStateProps }; - /** * Access or set the current GeoContext. */ diff --git a/packages/layerchart/src/lib/contexts/group.ts b/packages/layerchart/src/lib/contexts/group.ts new file mode 100644 index 0000000000..68b41df3a4 --- /dev/null +++ b/packages/layerchart/src/lib/contexts/group.ts @@ -0,0 +1,17 @@ +import { Context } from 'runed'; +import { ChartGroupState } from '$lib/states/group.svelte.js'; + +const _ChartGroupContext = new Context('ChartGroupContext'); + +/** + * Get the chart group provided by an ancestor ``, or `undefined` when there is none. + * + * Charts prefer an explicit `group` prop and fall back to this. + */ +export function getChartGroup(): ChartGroupState | undefined { + return _ChartGroupContext.getOr(undefined); +} + +export function setChartGroup(group: ChartGroupState): ChartGroupState | undefined { + return _ChartGroupContext.set(group); +} diff --git a/packages/layerchart/src/lib/contexts/index.ts b/packages/layerchart/src/lib/contexts/index.ts index 1c4c818bb3..d9af390111 100644 --- a/packages/layerchart/src/lib/contexts/index.ts +++ b/packages/layerchart/src/lib/contexts/index.ts @@ -1,5 +1,6 @@ export * from './chart.js'; export * from './geo.js'; +export * from './group.js'; export * from './layer.js'; export * from './legendPayload.js'; export * from './settings.js'; diff --git a/packages/layerchart/src/lib/index.ts b/packages/layerchart/src/lib/index.ts index 7a093b17d7..d23eeadfe0 100644 --- a/packages/layerchart/src/lib/index.ts +++ b/packages/layerchart/src/lib/index.ts @@ -1,3 +1,5 @@ +export * from './attachments/index.js'; export * from './components/index.js'; export * from './contexts/index.js'; +export * from './states/index.js'; export * from './utils/index.js'; diff --git a/packages/layerchart/src/lib/states/__screenshots__/chart.svelte.test.ts/ChartState-baseline-domain-multi-series-should-work-without-baseline--no-forced-0--1.png b/packages/layerchart/src/lib/states/__screenshots__/chart.svelte.test.ts/ChartState-baseline-domain-multi-series-should-work-without-baseline--no-forced-0--1.png deleted file mode 100644 index 850d5b364e..0000000000 Binary files a/packages/layerchart/src/lib/states/__screenshots__/chart.svelte.test.ts/ChartState-baseline-domain-multi-series-should-work-without-baseline--no-forced-0--1.png and /dev/null differ diff --git a/packages/layerchart/src/lib/states/__screenshots__/chart.svelte.test.ts/ChartState-baseline-domain-multi-series-should-work-without-baseline--no-forced-0--2.png b/packages/layerchart/src/lib/states/__screenshots__/chart.svelte.test.ts/ChartState-baseline-domain-multi-series-should-work-without-baseline--no-forced-0--2.png deleted file mode 100644 index 850d5b364e..0000000000 Binary files a/packages/layerchart/src/lib/states/__screenshots__/chart.svelte.test.ts/ChartState-baseline-domain-multi-series-should-work-without-baseline--no-forced-0--2.png and /dev/null differ diff --git a/packages/layerchart/src/lib/states/__screenshots__/chart.svelte.test.ts/ChartState-degenerate-domain-should-expand-degenerate-y-domain--5--5--to--5--6--1.png b/packages/layerchart/src/lib/states/__screenshots__/chart.svelte.test.ts/ChartState-degenerate-domain-should-expand-degenerate-y-domain--5--5--to--5--6--1.png deleted file mode 100644 index 850d5b364e..0000000000 Binary files a/packages/layerchart/src/lib/states/__screenshots__/chart.svelte.test.ts/ChartState-degenerate-domain-should-expand-degenerate-y-domain--5--5--to--5--6--1.png and /dev/null differ diff --git a/packages/layerchart/src/lib/states/__screenshots__/chart.svelte.test.ts/ChartState-degenerate-domain-should-expand-degenerate-y-domain--5--5--to--5--6--2.png b/packages/layerchart/src/lib/states/__screenshots__/chart.svelte.test.ts/ChartState-degenerate-domain-should-expand-degenerate-y-domain--5--5--to--5--6--2.png deleted file mode 100644 index 850d5b364e..0000000000 Binary files a/packages/layerchart/src/lib/states/__screenshots__/chart.svelte.test.ts/ChartState-degenerate-domain-should-expand-degenerate-y-domain--5--5--to--5--6--2.png and /dev/null differ diff --git a/packages/layerchart/src/lib/states/__screenshots__/chart.svelte.test.ts/ChartState-geo-projection-skips-markInfo-should-not-derive-x-y-accessors-from-marks-when-geo-projection-is-active-1.png b/packages/layerchart/src/lib/states/__screenshots__/chart.svelte.test.ts/ChartState-geo-projection-skips-markInfo-should-not-derive-x-y-accessors-from-marks-when-geo-projection-is-active-1.png deleted file mode 100644 index 850d5b364e..0000000000 Binary files a/packages/layerchart/src/lib/states/__screenshots__/chart.svelte.test.ts/ChartState-geo-projection-skips-markInfo-should-not-derive-x-y-accessors-from-marks-when-geo-projection-is-active-1.png and /dev/null differ diff --git a/packages/layerchart/src/lib/states/__screenshots__/chart.svelte.test.ts/ChartState-geo-projection-skips-markInfo-should-not-derive-x-y-accessors-from-marks-when-geo-projection-is-active-2.png b/packages/layerchart/src/lib/states/__screenshots__/chart.svelte.test.ts/ChartState-geo-projection-skips-markInfo-should-not-derive-x-y-accessors-from-marks-when-geo-projection-is-active-2.png deleted file mode 100644 index 850d5b364e..0000000000 Binary files a/packages/layerchart/src/lib/states/__screenshots__/chart.svelte.test.ts/ChartState-geo-projection-skips-markInfo-should-not-derive-x-y-accessors-from-marks-when-geo-projection-is-active-2.png and /dev/null differ diff --git a/packages/layerchart/src/lib/states/__screenshots__/chart.svelte.test.ts/ChartState-implicit-series-domain-update-on-visibility-toggle-should-update-y-domain-when-hiding-an-explicit-series-1.png b/packages/layerchart/src/lib/states/__screenshots__/chart.svelte.test.ts/ChartState-implicit-series-domain-update-on-visibility-toggle-should-update-y-domain-when-hiding-an-explicit-series-1.png deleted file mode 100644 index 850d5b364e..0000000000 Binary files a/packages/layerchart/src/lib/states/__screenshots__/chart.svelte.test.ts/ChartState-implicit-series-domain-update-on-visibility-toggle-should-update-y-domain-when-hiding-an-explicit-series-1.png and /dev/null differ diff --git a/packages/layerchart/src/lib/states/__screenshots__/chart.svelte.test.ts/ChartState-implicit-series-domain-update-on-visibility-toggle-should-update-y-domain-when-hiding-an-explicit-series-2.png b/packages/layerchart/src/lib/states/__screenshots__/chart.svelte.test.ts/ChartState-implicit-series-domain-update-on-visibility-toggle-should-update-y-domain-when-hiding-an-explicit-series-2.png deleted file mode 100644 index 850d5b364e..0000000000 Binary files a/packages/layerchart/src/lib/states/__screenshots__/chart.svelte.test.ts/ChartState-implicit-series-domain-update-on-visibility-toggle-should-update-y-domain-when-hiding-an-explicit-series-2.png and /dev/null differ diff --git a/packages/layerchart/src/lib/states/__screenshots__/chart.svelte.test.ts/ChartState-implicit-series-domain-update-on-visibility-toggle-should-update-y-domain-when-hiding-an-implicit-series-1.png b/packages/layerchart/src/lib/states/__screenshots__/chart.svelte.test.ts/ChartState-implicit-series-domain-update-on-visibility-toggle-should-update-y-domain-when-hiding-an-implicit-series-1.png deleted file mode 100644 index 850d5b364e..0000000000 Binary files a/packages/layerchart/src/lib/states/__screenshots__/chart.svelte.test.ts/ChartState-implicit-series-domain-update-on-visibility-toggle-should-update-y-domain-when-hiding-an-implicit-series-1.png and /dev/null differ diff --git a/packages/layerchart/src/lib/states/__screenshots__/chart.svelte.test.ts/ChartState-implicit-series-domain-update-on-visibility-toggle-should-update-y-domain-when-hiding-an-implicit-series-2.png b/packages/layerchart/src/lib/states/__screenshots__/chart.svelte.test.ts/ChartState-implicit-series-domain-update-on-visibility-toggle-should-update-y-domain-when-hiding-an-implicit-series-2.png deleted file mode 100644 index 850d5b364e..0000000000 Binary files a/packages/layerchart/src/lib/states/__screenshots__/chart.svelte.test.ts/ChartState-implicit-series-domain-update-on-visibility-toggle-should-update-y-domain-when-hiding-an-implicit-series-2.png and /dev/null differ diff --git a/packages/layerchart/src/lib/states/__screenshots__/chart.svelte.test.ts/ChartState-implicit-x-y-from-marks--no-x-y-on-Chart--should-deduplicate-repeated-mark-x-keys-into-a-single-accessor-1.png b/packages/layerchart/src/lib/states/__screenshots__/chart.svelte.test.ts/ChartState-implicit-x-y-from-marks--no-x-y-on-Chart--should-deduplicate-repeated-mark-x-keys-into-a-single-accessor-1.png deleted file mode 100644 index 850d5b364e..0000000000 Binary files a/packages/layerchart/src/lib/states/__screenshots__/chart.svelte.test.ts/ChartState-implicit-x-y-from-marks--no-x-y-on-Chart--should-deduplicate-repeated-mark-x-keys-into-a-single-accessor-1.png and /dev/null differ diff --git a/packages/layerchart/src/lib/states/__screenshots__/chart.svelte.test.ts/ChartState-implicit-x-y-from-marks--no-x-y-on-Chart--should-deduplicate-repeated-mark-x-keys-into-a-single-accessor-2.png b/packages/layerchart/src/lib/states/__screenshots__/chart.svelte.test.ts/ChartState-implicit-x-y-from-marks--no-x-y-on-Chart--should-deduplicate-repeated-mark-x-keys-into-a-single-accessor-2.png deleted file mode 100644 index 850d5b364e..0000000000 Binary files a/packages/layerchart/src/lib/states/__screenshots__/chart.svelte.test.ts/ChartState-implicit-x-y-from-marks--no-x-y-on-Chart--should-deduplicate-repeated-mark-x-keys-into-a-single-accessor-2.png and /dev/null differ diff --git a/packages/layerchart/src/lib/states/__screenshots__/chart.svelte.test.ts/ChartState-implicit-x-y-from-marks--no-x-y-on-Chart--should-derive-correct-y-domain-across-two-marks-with-different-data-and-no-y-prop-1.png b/packages/layerchart/src/lib/states/__screenshots__/chart.svelte.test.ts/ChartState-implicit-x-y-from-marks--no-x-y-on-Chart--should-derive-correct-y-domain-across-two-marks-with-different-data-and-no-y-prop-1.png deleted file mode 100644 index 850d5b364e..0000000000 Binary files a/packages/layerchart/src/lib/states/__screenshots__/chart.svelte.test.ts/ChartState-implicit-x-y-from-marks--no-x-y-on-Chart--should-derive-correct-y-domain-across-two-marks-with-different-data-and-no-y-prop-1.png and /dev/null differ diff --git a/packages/layerchart/src/lib/states/__screenshots__/chart.svelte.test.ts/ChartState-implicit-x-y-from-marks--no-x-y-on-Chart--should-derive-correct-y-domain-across-two-marks-with-different-data-and-no-y-prop-2.png b/packages/layerchart/src/lib/states/__screenshots__/chart.svelte.test.ts/ChartState-implicit-x-y-from-marks--no-x-y-on-Chart--should-derive-correct-y-domain-across-two-marks-with-different-data-and-no-y-prop-2.png deleted file mode 100644 index 850d5b364e..0000000000 Binary files a/packages/layerchart/src/lib/states/__screenshots__/chart.svelte.test.ts/ChartState-implicit-x-y-from-marks--no-x-y-on-Chart--should-derive-correct-y-domain-across-two-marks-with-different-data-and-no-y-prop-2.png and /dev/null differ diff --git a/packages/layerchart/src/lib/states/__screenshots__/chart.svelte.test.ts/ChartState-implicit-x-y-from-marks--no-x-y-on-Chart--should-derive-x-accessor-from-marks-when-x-prop-is-absent-1.png b/packages/layerchart/src/lib/states/__screenshots__/chart.svelte.test.ts/ChartState-implicit-x-y-from-marks--no-x-y-on-Chart--should-derive-x-accessor-from-marks-when-x-prop-is-absent-1.png deleted file mode 100644 index 850d5b364e..0000000000 Binary files a/packages/layerchart/src/lib/states/__screenshots__/chart.svelte.test.ts/ChartState-implicit-x-y-from-marks--no-x-y-on-Chart--should-derive-x-accessor-from-marks-when-x-prop-is-absent-1.png and /dev/null differ diff --git a/packages/layerchart/src/lib/states/__screenshots__/chart.svelte.test.ts/ChartState-implicit-x-y-from-marks--no-x-y-on-Chart--should-derive-x-accessor-from-marks-when-x-prop-is-absent-2.png b/packages/layerchart/src/lib/states/__screenshots__/chart.svelte.test.ts/ChartState-implicit-x-y-from-marks--no-x-y-on-Chart--should-derive-x-accessor-from-marks-when-x-prop-is-absent-2.png deleted file mode 100644 index 850d5b364e..0000000000 Binary files a/packages/layerchart/src/lib/states/__screenshots__/chart.svelte.test.ts/ChartState-implicit-x-y-from-marks--no-x-y-on-Chart--should-derive-x-accessor-from-marks-when-x-prop-is-absent-2.png and /dev/null differ diff --git a/packages/layerchart/src/lib/states/__screenshots__/chart.svelte.test.ts/ChartState-mark-registration-should-aggregate-y-accessor-from-implicit-series-into-resolveAccessor-1.png b/packages/layerchart/src/lib/states/__screenshots__/chart.svelte.test.ts/ChartState-mark-registration-should-aggregate-y-accessor-from-implicit-series-into-resolveAccessor-1.png deleted file mode 100644 index 850d5b364e..0000000000 Binary files a/packages/layerchart/src/lib/states/__screenshots__/chart.svelte.test.ts/ChartState-mark-registration-should-aggregate-y-accessor-from-implicit-series-into-resolveAccessor-1.png and /dev/null differ diff --git a/packages/layerchart/src/lib/states/__screenshots__/chart.svelte.test.ts/ChartState-mark-registration-should-aggregate-y-accessor-from-implicit-series-into-resolveAccessor-2.png b/packages/layerchart/src/lib/states/__screenshots__/chart.svelte.test.ts/ChartState-mark-registration-should-aggregate-y-accessor-from-implicit-series-into-resolveAccessor-2.png deleted file mode 100644 index 850d5b364e..0000000000 Binary files a/packages/layerchart/src/lib/states/__screenshots__/chart.svelte.test.ts/ChartState-mark-registration-should-aggregate-y-accessor-from-implicit-series-into-resolveAccessor-2.png and /dev/null differ diff --git a/packages/layerchart/src/lib/states/__screenshots__/chart.svelte.test.ts/ChartState-mark-registration-should-calculate-correct-y-domain-from-two-marks-with-same-y-accessor-but-different-data-1.png b/packages/layerchart/src/lib/states/__screenshots__/chart.svelte.test.ts/ChartState-mark-registration-should-calculate-correct-y-domain-from-two-marks-with-same-y-accessor-but-different-data-1.png deleted file mode 100644 index 850d5b364e..0000000000 Binary files a/packages/layerchart/src/lib/states/__screenshots__/chart.svelte.test.ts/ChartState-mark-registration-should-calculate-correct-y-domain-from-two-marks-with-same-y-accessor-but-different-data-1.png and /dev/null differ diff --git a/packages/layerchart/src/lib/states/__screenshots__/chart.svelte.test.ts/ChartState-mark-registration-should-calculate-correct-y-domain-from-two-marks-with-same-y-accessor-but-different-data-2.png b/packages/layerchart/src/lib/states/__screenshots__/chart.svelte.test.ts/ChartState-mark-registration-should-calculate-correct-y-domain-from-two-marks-with-same-y-accessor-but-different-data-2.png deleted file mode 100644 index 850d5b364e..0000000000 Binary files a/packages/layerchart/src/lib/states/__screenshots__/chart.svelte.test.ts/ChartState-mark-registration-should-calculate-correct-y-domain-from-two-marks-with-same-y-accessor-but-different-data-2.png and /dev/null differ diff --git a/packages/layerchart/src/lib/states/__screenshots__/chart.svelte.test.ts/ChartState-mark-registration-should-deduplicate-implicit-series-with-the-same-key-1.png b/packages/layerchart/src/lib/states/__screenshots__/chart.svelte.test.ts/ChartState-mark-registration-should-deduplicate-implicit-series-with-the-same-key-1.png deleted file mode 100644 index 850d5b364e..0000000000 Binary files a/packages/layerchart/src/lib/states/__screenshots__/chart.svelte.test.ts/ChartState-mark-registration-should-deduplicate-implicit-series-with-the-same-key-1.png and /dev/null differ diff --git a/packages/layerchart/src/lib/states/__screenshots__/chart.svelte.test.ts/ChartState-mark-registration-should-deduplicate-implicit-series-with-the-same-key-2.png b/packages/layerchart/src/lib/states/__screenshots__/chart.svelte.test.ts/ChartState-mark-registration-should-deduplicate-implicit-series-with-the-same-key-2.png deleted file mode 100644 index 850d5b364e..0000000000 Binary files a/packages/layerchart/src/lib/states/__screenshots__/chart.svelte.test.ts/ChartState-mark-registration-should-deduplicate-implicit-series-with-the-same-key-2.png and /dev/null differ diff --git a/packages/layerchart/src/lib/states/__screenshots__/chart.svelte.test.ts/ChartState-mark-registration-should-generate-implicit-series-from-marks-with-seriesKey-1.png b/packages/layerchart/src/lib/states/__screenshots__/chart.svelte.test.ts/ChartState-mark-registration-should-generate-implicit-series-from-marks-with-seriesKey-1.png deleted file mode 100644 index 850d5b364e..0000000000 Binary files a/packages/layerchart/src/lib/states/__screenshots__/chart.svelte.test.ts/ChartState-mark-registration-should-generate-implicit-series-from-marks-with-seriesKey-1.png and /dev/null differ diff --git a/packages/layerchart/src/lib/states/__screenshots__/chart.svelte.test.ts/ChartState-mark-registration-should-generate-implicit-series-from-marks-with-seriesKey-2.png b/packages/layerchart/src/lib/states/__screenshots__/chart.svelte.test.ts/ChartState-mark-registration-should-generate-implicit-series-from-marks-with-seriesKey-2.png deleted file mode 100644 index 850d5b364e..0000000000 Binary files a/packages/layerchart/src/lib/states/__screenshots__/chart.svelte.test.ts/ChartState-mark-registration-should-generate-implicit-series-from-marks-with-seriesKey-2.png and /dev/null differ diff --git a/packages/layerchart/src/lib/states/__screenshots__/chart.svelte.test.ts/ChartState-mark-registration-should-generate-implicit-series-from-marks-with-string-y-accessors-1.png b/packages/layerchart/src/lib/states/__screenshots__/chart.svelte.test.ts/ChartState-mark-registration-should-generate-implicit-series-from-marks-with-string-y-accessors-1.png deleted file mode 100644 index 850d5b364e..0000000000 Binary files a/packages/layerchart/src/lib/states/__screenshots__/chart.svelte.test.ts/ChartState-mark-registration-should-generate-implicit-series-from-marks-with-string-y-accessors-1.png and /dev/null differ diff --git a/packages/layerchart/src/lib/states/__screenshots__/chart.svelte.test.ts/ChartState-mark-registration-should-generate-implicit-series-from-marks-with-string-y-accessors-2.png b/packages/layerchart/src/lib/states/__screenshots__/chart.svelte.test.ts/ChartState-mark-registration-should-generate-implicit-series-from-marks-with-string-y-accessors-2.png deleted file mode 100644 index 850d5b364e..0000000000 Binary files a/packages/layerchart/src/lib/states/__screenshots__/chart.svelte.test.ts/ChartState-mark-registration-should-generate-implicit-series-from-marks-with-string-y-accessors-2.png and /dev/null differ diff --git a/packages/layerchart/src/lib/states/__screenshots__/chart.svelte.test.ts/ChartState-mark-registration-should-generate-implicit-series-from-x-accessor-for-vertical-charts--valueAxis-x--1.png b/packages/layerchart/src/lib/states/__screenshots__/chart.svelte.test.ts/ChartState-mark-registration-should-generate-implicit-series-from-x-accessor-for-vertical-charts--valueAxis-x--1.png deleted file mode 100644 index 850d5b364e..0000000000 Binary files a/packages/layerchart/src/lib/states/__screenshots__/chart.svelte.test.ts/ChartState-mark-registration-should-generate-implicit-series-from-x-accessor-for-vertical-charts--valueAxis-x--1.png and /dev/null differ diff --git a/packages/layerchart/src/lib/states/__screenshots__/chart.svelte.test.ts/ChartState-mark-registration-should-generate-implicit-series-from-x-accessor-for-vertical-charts--valueAxis-x--2.png b/packages/layerchart/src/lib/states/__screenshots__/chart.svelte.test.ts/ChartState-mark-registration-should-generate-implicit-series-from-x-accessor-for-vertical-charts--valueAxis-x--2.png deleted file mode 100644 index 850d5b364e..0000000000 Binary files a/packages/layerchart/src/lib/states/__screenshots__/chart.svelte.test.ts/ChartState-mark-registration-should-generate-implicit-series-from-x-accessor-for-vertical-charts--valueAxis-x--2.png and /dev/null differ diff --git a/packages/layerchart/src/lib/states/__screenshots__/chart.svelte.test.ts/ChartState-mark-registration-should-include-data-from-two-marks-with-same-y-accessor-but-different-data-arrays-1.png b/packages/layerchart/src/lib/states/__screenshots__/chart.svelte.test.ts/ChartState-mark-registration-should-include-data-from-two-marks-with-same-y-accessor-but-different-data-arrays-1.png deleted file mode 100644 index 850d5b364e..0000000000 Binary files a/packages/layerchart/src/lib/states/__screenshots__/chart.svelte.test.ts/ChartState-mark-registration-should-include-data-from-two-marks-with-same-y-accessor-but-different-data-arrays-1.png and /dev/null differ diff --git a/packages/layerchart/src/lib/states/__screenshots__/chart.svelte.test.ts/ChartState-mark-registration-should-include-data-from-two-marks-with-same-y-accessor-but-different-data-arrays-2.png b/packages/layerchart/src/lib/states/__screenshots__/chart.svelte.test.ts/ChartState-mark-registration-should-include-data-from-two-marks-with-same-y-accessor-but-different-data-arrays-2.png deleted file mode 100644 index 850d5b364e..0000000000 Binary files a/packages/layerchart/src/lib/states/__screenshots__/chart.svelte.test.ts/ChartState-mark-registration-should-include-data-from-two-marks-with-same-y-accessor-but-different-data-arrays-2.png and /dev/null differ diff --git a/packages/layerchart/src/lib/states/__screenshots__/chart.svelte.test.ts/ChartState-mark-registration-should-include-implicit-series-label-when-provided-1.png b/packages/layerchart/src/lib/states/__screenshots__/chart.svelte.test.ts/ChartState-mark-registration-should-include-implicit-series-label-when-provided-1.png deleted file mode 100644 index 850d5b364e..0000000000 Binary files a/packages/layerchart/src/lib/states/__screenshots__/chart.svelte.test.ts/ChartState-mark-registration-should-include-implicit-series-label-when-provided-1.png and /dev/null differ diff --git a/packages/layerchart/src/lib/states/__screenshots__/chart.svelte.test.ts/ChartState-mark-registration-should-include-implicit-series-label-when-provided-2.png b/packages/layerchart/src/lib/states/__screenshots__/chart.svelte.test.ts/ChartState-mark-registration-should-include-implicit-series-label-when-provided-2.png deleted file mode 100644 index 850d5b364e..0000000000 Binary files a/packages/layerchart/src/lib/states/__screenshots__/chart.svelte.test.ts/ChartState-mark-registration-should-include-implicit-series-label-when-provided-2.png and /dev/null differ diff --git a/packages/layerchart/src/lib/states/__screenshots__/chart.svelte.test.ts/ChartState-mark-registration-should-include-mark-data-in-flatData-for-domain-calculation-1.png b/packages/layerchart/src/lib/states/__screenshots__/chart.svelte.test.ts/ChartState-mark-registration-should-include-mark-data-in-flatData-for-domain-calculation-1.png deleted file mode 100644 index 850d5b364e..0000000000 Binary files a/packages/layerchart/src/lib/states/__screenshots__/chart.svelte.test.ts/ChartState-mark-registration-should-include-mark-data-in-flatData-for-domain-calculation-1.png and /dev/null differ diff --git a/packages/layerchart/src/lib/states/__screenshots__/chart.svelte.test.ts/ChartState-mark-registration-should-include-mark-data-in-flatData-for-domain-calculation-2.png b/packages/layerchart/src/lib/states/__screenshots__/chart.svelte.test.ts/ChartState-mark-registration-should-include-mark-data-in-flatData-for-domain-calculation-2.png deleted file mode 100644 index 850d5b364e..0000000000 Binary files a/packages/layerchart/src/lib/states/__screenshots__/chart.svelte.test.ts/ChartState-mark-registration-should-include-mark-data-in-flatData-for-domain-calculation-2.png and /dev/null differ diff --git a/packages/layerchart/src/lib/states/__screenshots__/chart.svelte.test.ts/ChartState-mark-registration-should-include-per-mark-data-in-domain-via-implicit-series-1.png b/packages/layerchart/src/lib/states/__screenshots__/chart.svelte.test.ts/ChartState-mark-registration-should-include-per-mark-data-in-domain-via-implicit-series-1.png deleted file mode 100644 index 850d5b364e..0000000000 Binary files a/packages/layerchart/src/lib/states/__screenshots__/chart.svelte.test.ts/ChartState-mark-registration-should-include-per-mark-data-in-domain-via-implicit-series-1.png and /dev/null differ diff --git a/packages/layerchart/src/lib/states/__screenshots__/chart.svelte.test.ts/ChartState-mark-registration-should-include-per-mark-data-in-domain-via-implicit-series-2.png b/packages/layerchart/src/lib/states/__screenshots__/chart.svelte.test.ts/ChartState-mark-registration-should-include-per-mark-data-in-domain-via-implicit-series-2.png deleted file mode 100644 index 850d5b364e..0000000000 Binary files a/packages/layerchart/src/lib/states/__screenshots__/chart.svelte.test.ts/ChartState-mark-registration-should-include-per-mark-data-in-domain-via-implicit-series-2.png and /dev/null differ diff --git a/packages/layerchart/src/lib/states/__screenshots__/chart.svelte.test.ts/ChartState-mark-registration-should-not-double-include-data-when-mark-data-matches-series-data-reference-1.png b/packages/layerchart/src/lib/states/__screenshots__/chart.svelte.test.ts/ChartState-mark-registration-should-not-double-include-data-when-mark-data-matches-series-data-reference-1.png deleted file mode 100644 index 850d5b364e..0000000000 Binary files a/packages/layerchart/src/lib/states/__screenshots__/chart.svelte.test.ts/ChartState-mark-registration-should-not-double-include-data-when-mark-data-matches-series-data-reference-1.png and /dev/null differ diff --git a/packages/layerchart/src/lib/states/__screenshots__/chart.svelte.test.ts/ChartState-mark-registration-should-not-double-include-data-when-mark-data-matches-series-data-reference-2.png b/packages/layerchart/src/lib/states/__screenshots__/chart.svelte.test.ts/ChartState-mark-registration-should-not-double-include-data-when-mark-data-matches-series-data-reference-2.png deleted file mode 100644 index 850d5b364e..0000000000 Binary files a/packages/layerchart/src/lib/states/__screenshots__/chart.svelte.test.ts/ChartState-mark-registration-should-not-double-include-data-when-mark-data-matches-series-data-reference-2.png and /dev/null differ diff --git a/packages/layerchart/src/lib/states/__screenshots__/chart.svelte.test.ts/ChartState-mark-registration-should-register-and-unregister-marks-1.png b/packages/layerchart/src/lib/states/__screenshots__/chart.svelte.test.ts/ChartState-mark-registration-should-register-and-unregister-marks-1.png deleted file mode 100644 index 850d5b364e..0000000000 Binary files a/packages/layerchart/src/lib/states/__screenshots__/chart.svelte.test.ts/ChartState-mark-registration-should-register-and-unregister-marks-1.png and /dev/null differ diff --git a/packages/layerchart/src/lib/states/__screenshots__/chart.svelte.test.ts/ChartState-mark-registration-should-register-and-unregister-marks-2.png b/packages/layerchart/src/lib/states/__screenshots__/chart.svelte.test.ts/ChartState-mark-registration-should-register-and-unregister-marks-2.png deleted file mode 100644 index 850d5b364e..0000000000 Binary files a/packages/layerchart/src/lib/states/__screenshots__/chart.svelte.test.ts/ChartState-mark-registration-should-register-and-unregister-marks-2.png and /dev/null differ diff --git a/packages/layerchart/src/lib/states/__screenshots__/chart.svelte.test.ts/ChartState-mark-registration-should-revert-flatData-after-all-marks-unregister-1.png b/packages/layerchart/src/lib/states/__screenshots__/chart.svelte.test.ts/ChartState-mark-registration-should-revert-flatData-after-all-marks-unregister-1.png deleted file mode 100644 index 850d5b364e..0000000000 Binary files a/packages/layerchart/src/lib/states/__screenshots__/chart.svelte.test.ts/ChartState-mark-registration-should-revert-flatData-after-all-marks-unregister-1.png and /dev/null differ diff --git a/packages/layerchart/src/lib/states/__screenshots__/chart.svelte.test.ts/ChartState-mark-registration-should-revert-flatData-after-all-marks-unregister-2.png b/packages/layerchart/src/lib/states/__screenshots__/chart.svelte.test.ts/ChartState-mark-registration-should-revert-flatData-after-all-marks-unregister-2.png deleted file mode 100644 index 850d5b364e..0000000000 Binary files a/packages/layerchart/src/lib/states/__screenshots__/chart.svelte.test.ts/ChartState-mark-registration-should-revert-flatData-after-all-marks-unregister-2.png and /dev/null differ diff --git a/packages/layerchart/src/lib/states/__screenshots__/chart.svelte.test.ts/ChartState-mark-registration-should-skip-marks-without-a-derivable-key-for-implicit-series-1.png b/packages/layerchart/src/lib/states/__screenshots__/chart.svelte.test.ts/ChartState-mark-registration-should-skip-marks-without-a-derivable-key-for-implicit-series-1.png deleted file mode 100644 index 850d5b364e..0000000000 Binary files a/packages/layerchart/src/lib/states/__screenshots__/chart.svelte.test.ts/ChartState-mark-registration-should-skip-marks-without-a-derivable-key-for-implicit-series-1.png and /dev/null differ diff --git a/packages/layerchart/src/lib/states/__screenshots__/chart.svelte.test.ts/ChartState-mark-registration-should-skip-marks-without-a-derivable-key-for-implicit-series-2.png b/packages/layerchart/src/lib/states/__screenshots__/chart.svelte.test.ts/ChartState-mark-registration-should-skip-marks-without-a-derivable-key-for-implicit-series-2.png deleted file mode 100644 index 850d5b364e..0000000000 Binary files a/packages/layerchart/src/lib/states/__screenshots__/chart.svelte.test.ts/ChartState-mark-registration-should-skip-marks-without-a-derivable-key-for-implicit-series-2.png and /dev/null differ diff --git a/packages/layerchart/src/lib/states/__screenshots__/chart.svelte.test.ts/ChartState-zoomToBrush-should-hold-a-zoom-requested-before-transform-state-exists-as-the-initial-transform-1.png b/packages/layerchart/src/lib/states/__screenshots__/chart.svelte.test.ts/ChartState-zoomToBrush-should-hold-a-zoom-requested-before-transform-state-exists-as-the-initial-transform-1.png new file mode 100644 index 0000000000..47767d2f3d Binary files /dev/null and b/packages/layerchart/src/lib/states/__screenshots__/chart.svelte.test.ts/ChartState-zoomToBrush-should-hold-a-zoom-requested-before-transform-state-exists-as-the-initial-transform-1.png differ diff --git a/packages/layerchart/src/lib/states/__screenshots__/chart.svelte.test.ts/ChartState-zoomToBrush-should-hold-a-zoom-requested-before-transform-state-exists-as-the-initial-transform-2.png b/packages/layerchart/src/lib/states/__screenshots__/chart.svelte.test.ts/ChartState-zoomToBrush-should-hold-a-zoom-requested-before-transform-state-exists-as-the-initial-transform-2.png new file mode 100644 index 0000000000..47767d2f3d Binary files /dev/null and b/packages/layerchart/src/lib/states/__screenshots__/chart.svelte.test.ts/ChartState-zoomToBrush-should-hold-a-zoom-requested-before-transform-state-exists-as-the-initial-transform-2.png differ diff --git a/packages/layerchart/src/lib/states/__screenshots__/chart.svelte.test.ts/ChartState-zoomToBrush-should-keep-the-range-anchored-when-the-scale-clamps-1.png b/packages/layerchart/src/lib/states/__screenshots__/chart.svelte.test.ts/ChartState-zoomToBrush-should-keep-the-range-anchored-when-the-scale-clamps-1.png new file mode 100644 index 0000000000..47767d2f3d Binary files /dev/null and b/packages/layerchart/src/lib/states/__screenshots__/chart.svelte.test.ts/ChartState-zoomToBrush-should-keep-the-range-anchored-when-the-scale-clamps-1.png differ diff --git a/packages/layerchart/src/lib/states/__screenshots__/chart.svelte.test.ts/ChartState-zoomToBrush-should-keep-the-range-anchored-when-the-scale-clamps-2.png b/packages/layerchart/src/lib/states/__screenshots__/chart.svelte.test.ts/ChartState-zoomToBrush-should-keep-the-range-anchored-when-the-scale-clamps-2.png new file mode 100644 index 0000000000..47767d2f3d Binary files /dev/null and b/packages/layerchart/src/lib/states/__screenshots__/chart.svelte.test.ts/ChartState-zoomToBrush-should-keep-the-range-anchored-when-the-scale-clamps-2.png differ diff --git a/packages/layerchart/src/lib/states/__screenshots__/chart.svelte.test.ts/ChartState-zoomToBrush-should-narrow-the-domain-from--transform-initialDomain--before-transform-state-exists-1.png b/packages/layerchart/src/lib/states/__screenshots__/chart.svelte.test.ts/ChartState-zoomToBrush-should-narrow-the-domain-from--transform-initialDomain--before-transform-state-exists-1.png new file mode 100644 index 0000000000..47767d2f3d Binary files /dev/null and b/packages/layerchart/src/lib/states/__screenshots__/chart.svelte.test.ts/ChartState-zoomToBrush-should-narrow-the-domain-from--transform-initialDomain--before-transform-state-exists-1.png differ diff --git a/packages/layerchart/src/lib/states/__screenshots__/chart.svelte.test.ts/ChartState-zoomToBrush-should-narrow-the-domain-from--transform-initialDomain--before-transform-state-exists-2.png b/packages/layerchart/src/lib/states/__screenshots__/chart.svelte.test.ts/ChartState-zoomToBrush-should-narrow-the-domain-from--transform-initialDomain--before-transform-state-exists-2.png new file mode 100644 index 0000000000..47767d2f3d Binary files /dev/null and b/packages/layerchart/src/lib/states/__screenshots__/chart.svelte.test.ts/ChartState-zoomToBrush-should-narrow-the-domain-from--transform-initialDomain--before-transform-state-exists-2.png differ diff --git a/packages/layerchart/src/lib/states/__screenshots__/facet.svelte.test.ts/facets-headers-draws-both-headers-on-a-two-dimensional-grid-1.png b/packages/layerchart/src/lib/states/__screenshots__/facet.svelte.test.ts/facets-headers-draws-both-headers-on-a-two-dimensional-grid-1.png new file mode 100644 index 0000000000..9b8ea7109d Binary files /dev/null and b/packages/layerchart/src/lib/states/__screenshots__/facet.svelte.test.ts/facets-headers-draws-both-headers-on-a-two-dimensional-grid-1.png differ diff --git a/packages/layerchart/src/lib/states/__screenshots__/facet.svelte.test.ts/facets-headers-draws-both-headers-on-a-two-dimensional-grid-2.png b/packages/layerchart/src/lib/states/__screenshots__/facet.svelte.test.ts/facets-headers-draws-both-headers-on-a-two-dimensional-grid-2.png new file mode 100644 index 0000000000..9b8ea7109d Binary files /dev/null and b/packages/layerchart/src/lib/states/__screenshots__/facet.svelte.test.ts/facets-headers-draws-both-headers-on-a-two-dimensional-grid-2.png differ diff --git a/packages/layerchart/src/lib/states/__screenshots__/facet.svelte.test.ts/facets-headers-repeats-a-data-axis-in-every-panel-with--facetAll--1.png b/packages/layerchart/src/lib/states/__screenshots__/facet.svelte.test.ts/facets-headers-repeats-a-data-axis-in-every-panel-with--facetAll--1.png new file mode 100644 index 0000000000..45c6d6b96f Binary files /dev/null and b/packages/layerchart/src/lib/states/__screenshots__/facet.svelte.test.ts/facets-headers-repeats-a-data-axis-in-every-panel-with--facetAll--1.png differ diff --git a/packages/layerchart/src/lib/states/__screenshots__/facet.svelte.test.ts/facets-headers-repeats-a-data-axis-in-every-panel-with--facetAll--2.png b/packages/layerchart/src/lib/states/__screenshots__/facet.svelte.test.ts/facets-headers-repeats-a-data-axis-in-every-panel-with--facetAll--2.png new file mode 100644 index 0000000000..45c6d6b96f Binary files /dev/null and b/packages/layerchart/src/lib/states/__screenshots__/facet.svelte.test.ts/facets-headers-repeats-a-data-axis-in-every-panel-with--facetAll--2.png differ diff --git a/packages/layerchart/src/lib/states/__screenshots__/chart.component-node.svelte.test.ts/ChartState-registerComponent-cleans-up-child-nodes-and-mark-registrations-when-components-unmount-1.png b/packages/layerchart/src/lib/states/__screenshots__/facet.svelte.test.ts/facets-interaction-resolves-per-panel-in-voronoi-mode--whose-cells-are-built-per-panel-1.png similarity index 54% rename from packages/layerchart/src/lib/states/__screenshots__/chart.component-node.svelte.test.ts/ChartState-registerComponent-cleans-up-child-nodes-and-mark-registrations-when-components-unmount-1.png rename to packages/layerchart/src/lib/states/__screenshots__/facet.svelte.test.ts/facets-interaction-resolves-per-panel-in-voronoi-mode--whose-cells-are-built-per-panel-1.png index dab2a6df3f..1208ae3f12 100644 Binary files a/packages/layerchart/src/lib/states/__screenshots__/chart.component-node.svelte.test.ts/ChartState-registerComponent-cleans-up-child-nodes-and-mark-registrations-when-components-unmount-1.png and b/packages/layerchart/src/lib/states/__screenshots__/facet.svelte.test.ts/facets-interaction-resolves-per-panel-in-voronoi-mode--whose-cells-are-built-per-panel-1.png differ diff --git a/packages/layerchart/src/lib/states/__screenshots__/facet.svelte.test.ts/facets-interaction-resolves-per-panel-in-voronoi-mode--whose-cells-are-built-per-panel-2.png b/packages/layerchart/src/lib/states/__screenshots__/facet.svelte.test.ts/facets-interaction-resolves-per-panel-in-voronoi-mode--whose-cells-are-built-per-panel-2.png new file mode 100644 index 0000000000..b603aa4ea4 Binary files /dev/null and b/packages/layerchart/src/lib/states/__screenshots__/facet.svelte.test.ts/facets-interaction-resolves-per-panel-in-voronoi-mode--whose-cells-are-built-per-panel-2.png differ diff --git a/packages/layerchart/src/lib/states/__screenshots__/group-transform.svelte.test.ts/ChartGroup---transform-settles-with-an-animated-transform-1.png b/packages/layerchart/src/lib/states/__screenshots__/group-transform.svelte.test.ts/ChartGroup---transform-settles-with-an-animated-transform-1.png new file mode 100644 index 0000000000..22a4b51276 Binary files /dev/null and b/packages/layerchart/src/lib/states/__screenshots__/group-transform.svelte.test.ts/ChartGroup---transform-settles-with-an-animated-transform-1.png differ diff --git a/packages/layerchart/src/lib/states/__screenshots__/group-transform.svelte.test.ts/ChartGroup---transform-settles-with-an-animated-transform-2.png b/packages/layerchart/src/lib/states/__screenshots__/group-transform.svelte.test.ts/ChartGroup---transform-settles-with-an-animated-transform-2.png new file mode 100644 index 0000000000..333c15949c Binary files /dev/null and b/packages/layerchart/src/lib/states/__screenshots__/group-transform.svelte.test.ts/ChartGroup---transform-settles-with-an-animated-transform-2.png differ diff --git a/packages/layerchart/src/lib/states/__screenshots__/group.svelte.test.ts/brush-slice-publishing-from-a-gesture-shares-the-clearing-when-that-chart-is-clicked-1.png b/packages/layerchart/src/lib/states/__screenshots__/group.svelte.test.ts/brush-slice-publishing-from-a-gesture-shares-the-clearing-when-that-chart-is-clicked-1.png new file mode 100644 index 0000000000..7dee6e91e7 Binary files /dev/null and b/packages/layerchart/src/lib/states/__screenshots__/group.svelte.test.ts/brush-slice-publishing-from-a-gesture-shares-the-clearing-when-that-chart-is-clicked-1.png differ diff --git a/packages/layerchart/src/lib/states/__screenshots__/group.svelte.test.ts/brush-slice-publishing-from-a-gesture-shares-the-clearing-when-that-chart-is-clicked-2.png b/packages/layerchart/src/lib/states/__screenshots__/group.svelte.test.ts/brush-slice-publishing-from-a-gesture-shares-the-clearing-when-that-chart-is-clicked-2.png new file mode 100644 index 0000000000..7dee6e91e7 Binary files /dev/null and b/packages/layerchart/src/lib/states/__screenshots__/group.svelte.test.ts/brush-slice-publishing-from-a-gesture-shares-the-clearing-when-that-chart-is-clicked-2.png differ diff --git a/packages/layerchart/src/lib/states/__screenshots__/mixed.svelte.test.ts/mixed-marks-over-a-stack-domain-when-a-non-stacking-mark-exceeds-the-stacked-total-1.png b/packages/layerchart/src/lib/states/__screenshots__/mixed.svelte.test.ts/mixed-marks-over-a-stack-domain-when-a-non-stacking-mark-exceeds-the-stacked-total-1.png new file mode 100644 index 0000000000..47767d2f3d Binary files /dev/null and b/packages/layerchart/src/lib/states/__screenshots__/mixed.svelte.test.ts/mixed-marks-over-a-stack-domain-when-a-non-stacking-mark-exceeds-the-stacked-total-1.png differ diff --git a/packages/layerchart/src/lib/states/__screenshots__/mixed.svelte.test.ts/mixed-marks-over-a-stack-domain-when-a-non-stacking-mark-exceeds-the-stacked-total-2.png b/packages/layerchart/src/lib/states/__screenshots__/mixed.svelte.test.ts/mixed-marks-over-a-stack-domain-when-a-non-stacking-mark-exceeds-the-stacked-total-2.png new file mode 100644 index 0000000000..47767d2f3d Binary files /dev/null and b/packages/layerchart/src/lib/states/__screenshots__/mixed.svelte.test.ts/mixed-marks-over-a-stack-domain-when-a-non-stacking-mark-exceeds-the-stacked-total-2.png differ diff --git a/packages/layerchart/src/lib/states/__screenshots__/series.svelte.test.ts/SeriesState-constructor-and-basic-properties-should-default-to-overlap-layout-when-no-stack-config-1.png b/packages/layerchart/src/lib/states/__screenshots__/series.svelte.test.ts/SeriesState-constructor-and-basic-properties-should-default-to-overlap-layout-when-no-stack-config-1.png new file mode 100644 index 0000000000..47767d2f3d Binary files /dev/null and b/packages/layerchart/src/lib/states/__screenshots__/series.svelte.test.ts/SeriesState-constructor-and-basic-properties-should-default-to-overlap-layout-when-no-stack-config-1.png differ diff --git a/packages/layerchart/src/lib/states/__screenshots__/series.svelte.test.ts/SeriesState-constructor-and-basic-properties-should-default-to-overlap-layout-when-no-stack-config-2.png b/packages/layerchart/src/lib/states/__screenshots__/series.svelte.test.ts/SeriesState-constructor-and-basic-properties-should-default-to-overlap-layout-when-no-stack-config-2.png new file mode 100644 index 0000000000..47767d2f3d Binary files /dev/null and b/packages/layerchart/src/lib/states/__screenshots__/series.svelte.test.ts/SeriesState-constructor-and-basic-properties-should-default-to-overlap-layout-when-no-stack-config-2.png differ diff --git a/packages/layerchart/src/lib/states/__screenshots__/series.svelte.test.ts/SeriesState-visibility-should-allow-toggling-after-initial-selected--false-1.png b/packages/layerchart/src/lib/states/__screenshots__/series.svelte.test.ts/SeriesState-visibility-should-allow-toggling-after-initial-selected--false-1.png deleted file mode 100644 index 850d5b364e..0000000000 Binary files a/packages/layerchart/src/lib/states/__screenshots__/series.svelte.test.ts/SeriesState-visibility-should-allow-toggling-after-initial-selected--false-1.png and /dev/null differ diff --git a/packages/layerchart/src/lib/states/__screenshots__/series.svelte.test.ts/SeriesState-visibility-should-allow-toggling-after-initial-selected--false-2.png b/packages/layerchart/src/lib/states/__screenshots__/series.svelte.test.ts/SeriesState-visibility-should-allow-toggling-after-initial-selected--false-2.png deleted file mode 100644 index 850d5b364e..0000000000 Binary files a/packages/layerchart/src/lib/states/__screenshots__/series.svelte.test.ts/SeriesState-visibility-should-allow-toggling-after-initial-selected--false-2.png and /dev/null differ diff --git a/packages/layerchart/src/lib/states/__screenshots__/series.svelte.test.ts/SeriesState-visibility-should-respect-selected--false-on-series-items-1.png b/packages/layerchart/src/lib/states/__screenshots__/series.svelte.test.ts/SeriesState-visibility-should-respect-selected--false-on-series-items-1.png deleted file mode 100644 index 850d5b364e..0000000000 Binary files a/packages/layerchart/src/lib/states/__screenshots__/series.svelte.test.ts/SeriesState-visibility-should-respect-selected--false-on-series-items-1.png and /dev/null differ diff --git a/packages/layerchart/src/lib/states/__screenshots__/series.svelte.test.ts/SeriesState-visibility-should-respect-selected--false-on-series-items-2.png b/packages/layerchart/src/lib/states/__screenshots__/series.svelte.test.ts/SeriesState-visibility-should-respect-selected--false-on-series-items-2.png deleted file mode 100644 index 850d5b364e..0000000000 Binary files a/packages/layerchart/src/lib/states/__screenshots__/series.svelte.test.ts/SeriesState-visibility-should-respect-selected--false-on-series-items-2.png and /dev/null differ diff --git a/packages/layerchart/src/lib/states/brush.svelte.test.ts b/packages/layerchart/src/lib/states/brush.svelte.test.ts index 8bbcc2c250..fea7013d6d 100644 --- a/packages/layerchart/src/lib/states/brush.svelte.test.ts +++ b/packages/layerchart/src/lib/states/brush.svelte.test.ts @@ -701,3 +701,54 @@ describe('expandBandBrushDomain', () => { expect(expandBandBrushDomain(['X', 'Y'], baseDomain)).toEqual(['X', 'Y']); }); }); + +describe('contains', () => { + function brushWith(selection: { x?: any; y?: any }) { + const brush = new BrushState(null, { axis: 'both' }); + brush.x = selection.x ?? [null, null]; + brush.y = selection.y ?? [null, null]; + return brush; + } + + it('tests a point against both axes', () => { + const brush = brushWith({ x: [10, 20], y: [0, 5] }); + + expect(brush.contains({ x: 15, y: 2 })).toBe(true); + expect(brush.contains({ x: 25, y: 2 })).toBe(false); + expect(brush.contains({ x: 15, y: 9 })).toBe(false); + }); + + it('is inclusive of the edges', () => { + const brush = brushWith({ x: [10, 20] }); + + expect(brush.contains({ x: 10 })).toBe(true); + expect(brush.contains({ x: 20 })).toBe(true); + }); + + it('leaves an axis without a selection unconstrained', () => { + const brush = brushWith({ x: [10, 20] }); + + // no `y` selection, so any `y` passes + expect(brush.contains({ x: 15, y: 1000 })).toBe(true); + // and an omitted value is never tested + expect(brush.contains({ x: 15 })).toBe(true); + }); + + it('contains everything when inactive', () => { + expect(brushWith({}).contains({ x: 15, y: 2 })).toBe(true); + }); + + it('treats a null end as open', () => { + const brush = brushWith({ x: [10, null] }); + + expect(brush.contains({ x: 9 })).toBe(false); + expect(brush.contains({ x: 1e9 })).toBe(true); + }); + + it('compares dates', () => { + const brush = brushWith({ x: [new Date('2024-01-02'), new Date('2024-01-04')] }); + + expect(brush.contains({ x: new Date('2024-01-03') })).toBe(true); + expect(brush.contains({ x: new Date('2024-01-05') })).toBe(false); + }); +}); diff --git a/packages/layerchart/src/lib/states/brush.svelte.ts b/packages/layerchart/src/lib/states/brush.svelte.ts index a22aa85d81..89e3eeead0 100644 --- a/packages/layerchart/src/lib/states/brush.svelte.ts +++ b/packages/layerchart/src/lib/states/brush.svelte.ts @@ -2,6 +2,8 @@ import { clamp } from '@layerstack/utils'; import { min, max } from 'd3-array'; import { add } from '../utils/math.js'; +import { isEqualValue } from '../utils/common.js'; +import { isWithinSelection } from '../utils/brush.js'; export type BrushDomainType = Array; @@ -170,6 +172,18 @@ export class BrushState { } /** Reset brush to cleared state */ + /** + * Whether a point falls within the current selection. Axes without a selection (and an + * inactive brush) are unconstrained. + * + * ```svelte + * {@const isSelected = context.brush.contains({ x: d.date, y: d.value })} + * ``` + */ + contains(point: { x?: any; y?: any }) { + return isWithinSelection(this, point); + } + reset() { this.active = false; this.x = [null, null]; @@ -528,16 +542,10 @@ export class BrushState { const newY = externalY ?? [null, null]; // Only write when values actually differ to avoid reactive loops - if ( - this.x[0]?.valueOf() !== newX[0]?.valueOf() || - this.x[1]?.valueOf() !== newX[1]?.valueOf() - ) { + if (!isEqualValue(this.x[0], newX[0]) || !isEqualValue(this.x[1], newX[1])) { this.x = newX; } - if ( - this.y[0]?.valueOf() !== newY[0]?.valueOf() || - this.y[1]?.valueOf() !== newY[1]?.valueOf() - ) { + if (!isEqualValue(this.y[0], newY[0]) || !isEqualValue(this.y[1], newY[1])) { this.y = newY; } @@ -545,14 +553,14 @@ export class BrushState { externalX != null && externalX[0] != null && externalX[1] != null && - (externalX[0].valueOf() !== this.xDomainMin?.valueOf() || - externalX[1].valueOf() !== this.xDomainMax?.valueOf()); + (!isEqualValue(externalX[0], this.xDomainMin) || + !isEqualValue(externalX[1], this.xDomainMax)); const isYAxisActive = externalY != null && externalY[0] != null && externalY[1] != null && - (externalY[0].valueOf() !== this.yDomainMin?.valueOf() || - externalY[1].valueOf() !== this.yDomainMax?.valueOf()); + (!isEqualValue(externalY[0], this.yDomainMin) || + !isEqualValue(externalY[1], this.yDomainMax)); const newActive = this.axis === 'x' diff --git a/packages/layerchart/src/lib/states/chart.cScale.svelte.test.ts b/packages/layerchart/src/lib/states/chart.cScale.svelte.test.ts new file mode 100644 index 0000000000..89362a5f7e --- /dev/null +++ b/packages/layerchart/src/lib/states/chart.cScale.svelte.test.ts @@ -0,0 +1,166 @@ +import { describe, expect, it } from 'vitest'; +import { render } from 'vitest-browser-svelte'; + +import TestHarness from '../components/tests/TestHarness.svelte'; +import Circle from '../components/Circle/Circle.svelte'; +import Density from '../components/Density/Density.svelte'; +import Contour from '../components/Contour/Contour.svelte'; +import { isScaleOrdinal } from '../utils/scales.svelte.js'; +import type { ChartState } from './chart.svelte.js'; + +/** + * `cScale` is the configured `cScale` / `cRange` when there is one, else an ordinal lookup of the + * colors declared on `series`. Marks resolving a categorical color use it directly; marks building + * a continuous ramp skip it when it's ordinal. + */ + +const data = [ + { group: 'a', x: 1, y: 10 }, + { group: 'b', x: 2, y: 20 }, + { group: 'a', x: 3, y: 30 }, + { group: 'b', x: 4, y: 40 }, +]; + +const series = [ + { key: 'a', color: 'rgb(255, 0, 0)' }, + { key: 'b', color: 'rgb(0, 0, 255)' }, +]; + +const chartProps = (extra: Record = {}) => ({ + data, + x: 'x', + y: 'y', + xDomain: [0, 5], + yDomain: [0, 50], + ...extra, +}); + +function renderChart(chartExtra: Record, componentProps: Record = {}) { + let ctx: ChartState = null!; + render(TestHarness, { + component: Circle, + chartProps: chartProps(chartExtra), + componentProps: { cx: 'x', cy: 'y', r: 3, ...componentProps }, + oncontext: (c: any) => (ctx = c), + }); + return () => ctx; +} + +describe('ChartState.cScale', () => { + describe('series color fallback', () => { + it('is null when nothing configures it and no series have colors', async () => { + const ctx = renderChart({}); + await expect.poll(() => ctx()?.width).toBeGreaterThan(0); + expect(ctx().cScale).toBe(null); + expect(ctx().cScale).toBe(null); + }); + + it('is built from `series` colors when they exist', async () => { + const ctx = renderChart({ series }); + await expect.poll(() => ctx()?.width).toBeGreaterThan(0); + expect(ctx().cScale?.('a')).toBe('rgb(255, 0, 0)'); + expect(ctx().cScale?.('b')).toBe('rgb(0, 0, 255)'); + // it is the series' own scale, handed straight through + expect(ctx().cScale).toBe(ctx().series.cScale); + }); + + it('leaves values outside the series keys unresolved rather than recycling the palette', async () => { + const ctx = renderChart({ series }); + await expect.poll(() => ctx()?.width).toBeGreaterThan(0); + expect(ctx().cScale?.('not-a-series')).toBe(undefined); + // and the domain isn't extended by the miss, so known keys keep their colors + expect(ctx().cScale?.('a')).toBe('rgb(255, 0, 0)'); + }); + + it('ignores series that declare no color', async () => { + const ctx = renderChart({ series: [{ key: 'a' }, { key: 'b' }] }); + await expect.poll(() => ctx()?.width).toBeGreaterThan(0); + expect(ctx().cScale).toBe(null); + }); + + it('ignores the implicit default series', async () => { + // `Legend` picks series swatches over a scale legend on exactly this condition + // (`hasSeriesWithColors`), so keeping the fallback narrower than it leaves `Legend` alone + const ctx = renderChart({ series: [{ key: 'default', color: 'rgb(255, 0, 0)' }] }); + await expect.poll(() => ctx()?.width).toBeGreaterThan(0); + expect(ctx().series.isDefaultSeries).toBe(true); + expect(ctx().cScale).toBe(null); + }); + }); + + describe('an explicit scale still wins', () => { + it('`cRange` takes precedence over series colors', async () => { + const ctx = renderChart({ + series, + c: 'group', + cRange: ['rgb(0, 255, 0)', 'rgb(255, 255, 0)'], + }); + await expect.poll(() => ctx()?.width).toBeGreaterThan(0); + expect(ctx().cScale?.('a')).toBe('rgb(0, 255, 0)'); + // the configured scale, not the series fallback + expect(ctx().cScale).not.toBe(ctx().series.cScale); + }); + }); + + describe('marks', () => { + it('resolve a data-property color through the fallback', async () => { + renderChart({ series }, { fill: 'group' }); + await expect.poll(() => document.querySelectorAll('circle').length).toBe(4); + const fills = Array.from(document.querySelectorAll('circle')).map((c) => + c.getAttribute('fill') + ); + expect(fills).toEqual([ + 'rgb(255, 0, 0)', + 'rgb(0, 0, 255)', + 'rgb(255, 0, 0)', + 'rgb(0, 0, 255)', + ]); + }); + + it('keep a CSS color literal untouched', async () => { + renderChart({ series }, { fill: 'var(--color-danger)' }); + await expect.poll(() => document.querySelectorAll('circle').length).toBe(4); + expect(document.querySelector('circle')?.getAttribute('fill')).toBe('var(--color-danger)'); + }); + }); + + describe('continuous marks are unaffected', () => { + // These copy `cScale` and re-domain it as a ramp, which an ordinal scale can't satisfy — + // `isScaleOrdinal` is what keeps them off the series fallback. + it('Density falls back to its own sequential scale despite series colors', async () => { + let ctx: ChartState = null!; + render(TestHarness, { + component: Density, + chartProps: chartProps({ series }), + componentProps: {}, + oncontext: (c: any) => (ctx = c), + }); + await expect.poll(() => ctx?.width).toBeGreaterThan(0); + // `cScale` here *is* the ordinal series lookup, so Density must decline it and ramp its own + expect(ctx.cScale).not.toBe(null); + expect(isScaleOrdinal(ctx.cScale!)).toBe(true); + + const fills = Array.from(document.querySelectorAll('svg path')).map((p) => + p.getAttribute('fill') + ); + // the YlGnBu ramp, not one of the two series colors + expect(fills.some((f) => f === 'rgb(255, 0, 0)' || f === 'rgb(0, 0, 255)')).toBe(false); + }); + + it('Contour falls back to its own sequential scale despite series colors', async () => { + let ctx: ChartState = null!; + render(TestHarness, { + component: Contour, + chartProps: chartProps({ series }), + componentProps: {}, + oncontext: (c: any) => (ctx = c), + }); + await expect.poll(() => ctx?.width).toBeGreaterThan(0); + + const fills = Array.from(document.querySelectorAll('svg path')).map((p) => + p.getAttribute('fill') + ); + expect(fills.some((f) => f === 'rgb(255, 0, 0)' || f === 'rgb(0, 0, 255)')).toBe(false); + }); + }); +}); diff --git a/packages/layerchart/src/lib/states/chart.svelte.test.ts b/packages/layerchart/src/lib/states/chart.svelte.test.ts index e24c44da83..3592f43125 100644 --- a/packages/layerchart/src/lib/states/chart.svelte.test.ts +++ b/packages/layerchart/src/lib/states/chart.svelte.test.ts @@ -6,6 +6,7 @@ import { geoAlbersUsa } from 'd3-geo'; import { timeDay } from 'd3-time'; import { ChartState } from './chart.svelte.js'; +import { TooltipState } from './tooltip.svelte.js'; import type { ChartPropsWithoutHTML } from '$lib/components/Chart/Chart.svelte'; import { isScaleBand, isScaleTime } from '$lib/utils/scales.svelte.js'; @@ -121,6 +122,7 @@ describe('ChartState baseline domain', () => { ]; const { state, cleanup } = createChartState({ + seriesLayout: 'overlap', data, x: 'date', yBaseline: 0, @@ -142,6 +144,7 @@ describe('ChartState baseline domain', () => { ]; const { state, cleanup } = createChartState({ + seriesLayout: 'overlap', data, x: 'date', yBaseline: 0, @@ -164,6 +167,7 @@ describe('ChartState baseline domain', () => { ]; const { state, cleanup } = createChartState({ + seriesLayout: 'overlap', data, x: 'date', yBaseline: 0, @@ -185,6 +189,7 @@ describe('ChartState baseline domain', () => { ]; const { state, cleanup } = createChartState({ + seriesLayout: 'overlap', data, y: 'date', xBaseline: 0, @@ -206,6 +211,7 @@ describe('ChartState baseline domain', () => { ]; const { state, cleanup } = createChartState({ + seriesLayout: 'overlap', data, x: 'date', valueAxis: 'y', @@ -352,6 +358,7 @@ describe('ChartState mark registration', () => { const data: MultiSeriesData[] = [{ date: '2024-01', apples: 10, bananas: 15 }]; const { state, cleanup } = createChartState({ + seriesLayout: 'overlap', data, x: 'date', series: [{ key: 'apples' }, { key: 'bananas' }], @@ -652,6 +659,7 @@ describe('ChartState data vs visibleSeriesData', () => { ]; const { state, cleanup } = createChartState({ + seriesLayout: 'overlap', x: 'date', y: 'value', series: [ @@ -804,6 +812,7 @@ describe('ChartState data vs visibleSeriesData', () => { const bananasData: TestData[] = [{ date: '2024-01', value: 15 }]; const { state, cleanup } = createChartState({ + seriesLayout: 'overlap', data: [], x: 'date', y: 'value', @@ -1000,6 +1009,7 @@ describe('ChartState implicit series domain update on visibility toggle', () => ]; const { state, cleanup } = createChartState({ + seriesLayout: 'overlap', data, x: 'date', valueAxis: 'y', @@ -1034,6 +1044,7 @@ describe('ChartState metadata-only series', () => { ]; const { state, cleanup } = createChartState({ + seriesLayout: 'overlap', data, x: 'date', valueAxis: 'y', @@ -1058,6 +1069,7 @@ describe('ChartState metadata-only series', () => { ]; const { state, cleanup } = createChartState({ + seriesLayout: 'overlap', data, x: 'date', valueAxis: 'y', @@ -1475,6 +1487,7 @@ describe('ChartState yReverse with band scales', () => { ]; const { state, cleanup } = createChartState({ + seriesLayout: 'overlap', data, y: 'age', valueAxis: 'x', @@ -1535,6 +1548,7 @@ describe('ChartState auto-baseline from bandPadding', () => { ]; const { state, cleanup } = createChartState({ + seriesLayout: 'overlap', data, x: 'date', valueAxis: 'y', @@ -1557,6 +1571,7 @@ describe('ChartState auto-baseline from bandPadding', () => { ]; const { state, cleanup } = createChartState({ + seriesLayout: 'overlap', data, y: 'date', valueAxis: 'x', @@ -1578,6 +1593,7 @@ describe('ChartState auto-baseline from bandPadding', () => { ]; const { state, cleanup } = createChartState({ + seriesLayout: 'overlap', data, x: 'date', valueAxis: 'y', @@ -1599,6 +1615,7 @@ describe('ChartState auto-baseline from bandPadding', () => { ]; const { state, cleanup } = createChartState({ + seriesLayout: 'overlap', data, x: 'date', valueAxis: 'y', @@ -1851,7 +1868,7 @@ describe('ChartState group layout auto-derives x1/y1', () => { }); }); -describe('ChartState x1Domain/y1Domain without series', () => { +describe('ChartState explicit x1Domain/y1Domain', () => { type LongData = { year: number; fruit: string; value: number }; const longData: LongData[] = [ { year: 2019, fruit: 'apples', value: 3840 }, @@ -1899,4 +1916,684 @@ describe('ChartState x1Domain/y1Domain without series', () => { cleanup(); } }); + + it('should pass through explicit x1Domain alongside the implicit `default` series', () => { + // `BarChart` always configures a series, so "no series" alone doesn't cover it + const { state, cleanup } = createChartState({ + seriesLayout: 'overlap', + data: longData, + x: 'year', + xScale: scaleBand(), + y: 'value', + x1: 'fruit', + x1Domain: ['apples', 'bananas'], + x1Range: ({ xScale }) => [0, (xScale as any).bandwidth()], + series: [{ key: 'default', label: 'value', value: 'value' }], + }); + + try { + expect(state.x1Domain).toEqual(['apples', 'bananas']); + expect(state.x1Scale!.domain()).toEqual(['apples', 'bananas']); + } finally { + cleanup(); + } + }); + + it('should pass through sub-band values that do not name a series', () => { + // `x1` names a data property, so its values are unrelated to the series keys stacked in it + const { state, cleanup } = createChartState({ + data: longData, + x: 'year', + xScale: scaleBand(), + y: 'value', + x1: 'fruit', + x1Domain: ['apples', 'bananas'], + x1Range: ({ xScale }) => [0, (xScale as any).bandwidth()], + seriesLayout: 'stack', + series: [{ key: 'north' }, { key: 'south' }], + }); + + try { + expect(state.x1Domain).toEqual(['apples', 'bananas']); + } finally { + cleanup(); + } + }); + + it('should drop explicit sub-bands that name a hidden series', () => { + const { state, cleanup } = createChartState({ + data: longData, + x: 'year', + xScale: scaleBand(), + y: 'value', + x1Domain: ['apples', 'bananas'], + x1Range: ({ xScale }) => [0, (xScale as any).bandwidth()], + seriesLayout: 'group', + series: [{ key: 'apples' }, { key: 'bananas' }], + }); + + try { + expect(state.x1Domain).toEqual(['apples', 'bananas']); + + state.seriesState.selectedKeys.toggle('apples'); + flushSync(); + + expect(state.x1Domain).toEqual(['apples']); + } finally { + cleanup(); + } + }); +}); + +describe('ChartState facetBand', () => { + type FacetData = { party: string; year: number; percent: number }; + const facetData: FacetData[] = [ + { party: 'AfD', year: 2021, percent: 10.3 }, + { party: 'AfD', year: 2025, percent: 20.8 }, + { party: 'SPD', year: 2021, percent: 25.7 }, + { party: 'SPD', year: 2025, percent: 16.4 }, + ]; + + function createFaceted(props: Partial>, mode = 'facet') { + const created = createChartState({ + data: facetData, + x: 'year', + xScale: scaleBand(), + y: 'percent', + fx: 'party', + ...props, + }); + created.state.tooltipState = new TooltipState( + mode as any, + () => {}, + () => {} + ); + flushSync(); + return created; + } + + it('should treat the panel as the band in `facet` mode', () => { + const { state, cleanup } = createFaceted({}); + + try { + expect(state.facetBand).toBe(true); + } finally { + cleanup(); + } + }); + + it('should leave `band` mode resolving to the bar', () => { + // Faceting a chart doesn't change what its tooltip points at — `facet` is asked for + const { state, cleanup } = createFaceted({}, 'band'); + + try { + expect(state.facetBand).toBe(false); + } finally { + cleanup(); + } + }); + + it('should not treat the panel as the band outside band modes', () => { + // `quadtree` resolves to one point, so the panel is never what the pointer covers + const { state, cleanup } = createFaceted({}, 'quadtree'); + + try { + expect(state.facetBand).toBe(false); + } finally { + cleanup(); + } + }); + + it('should not treat the panel as the band when series are configured', () => { + // Each row carries the whole series set, so a band is already a row + const { state, cleanup } = createFaceted({ + series: [{ key: 'percent', value: 'percent' }], + }); + + try { + expect(state.facetBand).toBe(false); + } finally { + cleanup(); + } + }); + + it('should not treat the panel as the band when the chart is not faceted', () => { + const { state, cleanup } = createFaceted({ fx: undefined }); + + try { + expect(state.facetBand).toBe(false); + } finally { + cleanup(); + } + }); +}); + +describe('ChartState transform fallback', () => { + it('should answer every documented method before `TransformContext` loads', () => { + // `TransformContext` is imported lazily, so a chart driven from the outside reaches these + // first — one that is missing throws rather than doing nothing + const { state, cleanup } = createChartState({ + data: [{ date: '2024-01', value: 1 }], + x: 'date', + y: 'value', + }); + + try { + expect(state.transformState).toBeFalsy(); + + const transform = state.transform as any; + for (const method of [ + 'reset', + 'zoomIn', + 'zoomOut', + 'zoomTo', + 'scaleTo', + 'setScale', + 'setTranslate', + 'setScrollMode', + 'translateCenter', + ]) { + expect(typeof transform[method], method).toBe('function'); + expect(() => transform[method](1, { x: 0, y: 0 })).not.toThrow(); + } + } finally { + cleanup(); + } + }); +}); + +describe('ChartState zoomToBrush', () => { + type DateData = { date: Date; value: number }; + const data: DateData[] = [ + { date: new Date(2024, 0, 1), value: 10 }, + { date: new Date(2024, 0, 31), value: 50 }, + ]; + const half = [new Date(2024, 0, 1), new Date(2024, 0, 16)] as any; + const brush = { x: half, y: [null, null] as any }; + + /** Stands in for the lazily-imported `TransformContext`'s state */ + function transformStub() { + const scales: number[] = []; + const translates: { x: number; y: number }[] = []; + return { + scales, + translates, + state: { + mode: 'domain', + axis: 'x', + scale: 1, + translate: { x: 0, y: 0 }, + setScale: (v: number) => scales.push(v), + setTranslate: (p: any) => translates.push(p), + }, + }; + } + + it('should apply the zoom when transform state already exists', () => { + const { state, cleanup } = createChartState({ data, x: 'date', y: 'value' }); + const stub = transformStub(); + + try { + state.transformState = stub.state as any; + state.zoomToBrush(brush, 'x'); + + // Half the domain brushed, so twice the scale + expect(stub.scales).toEqual([2]); + expect(stub.translates).toHaveLength(1); + } finally { + cleanup(); + } + }); + + it('should narrow the domain from `transform.initialDomain` before transform state exists', () => { + // `TransformContext` is imported lazily, so a chart opening zoomed has to render from this + // rather than waiting — otherwise it paints the full domain first + const { state, cleanup } = createChartState({ + data, + x: 'date', + y: 'value', + transform: { mode: 'domain', axis: 'x', initialDomain: { x: half } }, + }); + + try { + expect(state.transformState).toBeFalsy(); + expect(state._initialTransform?.scale).toBe(2); + + const domain = state.xDomain as Date[]; + expect(+domain[0]).toBe(+half[0]); + expect(+domain[1]).toBe(+half[1]); + } finally { + cleanup(); + } + }); + + it('should leave the domain alone without an initial domain', () => { + const { state, cleanup } = createChartState({ + data, + x: 'date', + y: 'value', + transform: { mode: 'domain', axis: 'x' }, + }); + + try { + expect(state._initialTransform).toBeUndefined(); + + const domain = state.xDomain as Date[]; + expect(+domain[0]).toBe(+data[0].date); + expect(+domain[1]).toBe(+data[1].date); + } finally { + cleanup(); + } + }); + + it('should keep the range anchored when the scale clamps', () => { + // A selection narrower than `scaleExtent` allows can't be reached — but the part of it that + // can be shown has to start where the selection does, not somewhere further along + const { state, cleanup } = createChartState({ + data, + x: 'date', + y: 'value', + transform: { mode: 'domain', axis: 'x', scaleExtent: [1, 4] }, + }); + const stub = transformStub(); + + try { + // Nine days into a 30-day domain, asking for a 3-day window — 10x, past the 4x limit + state.transformState = { ...stub.state, targetScale: 4 } as any; + state.zoomToBrush( + { x: [new Date(2024, 0, 10), new Date(2024, 0, 13)] as any, y: [null, null] as any }, + 'x' + ); + + expect(stub.scales).toEqual([10]); + + // Translate follows the scale that was applied (4), not the one asked for (10) — otherwise + // it carries the view far past the selection + const offset = 9 / 30; + expect(stub.translates[0].x).toBeCloseTo(-offset * state.width * 4, 6); + } finally { + cleanup(); + } + }); + + it('should hold a zoom requested before transform state exists as the initial transform', () => { + const { state, cleanup } = createChartState({ + data, + x: 'date', + y: 'value', + transform: { mode: 'domain', axis: 'x' }, + }); + + try { + state.zoomToBrush(brush, 'x'); + flushSync(); + + // `Chart` hands this to `TransformContext` as its initial scale/translate + expect(state._initialTransform?.scale).toBe(2); + + const domain = state.xDomain as Date[]; + expect(+domain[0]).toBe(+half[0]); + expect(+domain[1]).toBe(+half[1]); + } finally { + cleanup(); + } + }); +}); + +describe('ChartState `c` legend key', () => { + type LongData = { year: string; fruit: string; value: number }; + + const longData: LongData[] = [ + { year: '2019', fruit: 'apples', value: 10 }, + { year: '2019', fruit: 'bananas', value: 50 }, + { year: '2020', fruit: 'apples', value: 20 }, + { year: '2020', fruit: 'bananas', value: 80 }, + ]; + + function createCategoryChart(props: Partial> = {}) { + return createChartState({ + seriesLayout: 'overlap', + data: longData, + x: 'year', + y: 'value', + x1: 'fruit', + c: 'fruit', + valueAxis: 'y', + series: [{ key: 'default' }], + ...props, + }); + } + + it('should key rows by their `c` value when the series are implicit', () => { + const { state, cleanup } = createCategoryChart(); + + try { + expect(state.cKey(longData[0])).toBe('apples'); + expect(state.cKey(longData[1])).toBe('bananas'); + } finally { + cleanup(); + } + }); + + it('should key rows by nothing when series name the legend items instead', () => { + const { state, cleanup } = createCategoryChart({ + series: [{ key: 'apples' }, { key: 'bananas' }], + }); + + try { + expect(state.cKey(longData[0])).toBe(null); + } finally { + cleanup(); + } + }); + + it('should key rows by nothing for a continuous `c`, which the legend draws as a ramp', () => { + const { state, cleanup } = createCategoryChart({ c: 'value' }); + + try { + expect(state.cDomain).toEqual([10, 80]); + expect(state.cKey(longData[0])).toBe(null); + } finally { + cleanup(); + } + }); + + it('should drop the rows of a hidden category and release its sub-band', () => { + const { state, cleanup } = createCategoryChart(); + + try { + expect(state.data).toHaveLength(4); + expect(state.x1Domain).toEqual(['apples', 'bananas']); + expect(state.yDomain).toEqual([10, 80]); + + state.seriesState.selectedKeys.toggle('apples'); + flushSync(); + + expect(state.data).toEqual([longData[0], longData[2]]); + // The sub-band bananas held is released, so the bars left widen into it + expect(state.x1Domain).toEqual(['apples']); + expect(state.yDomain).toEqual([10, 20]); + } finally { + cleanup(); + } + }); + + it('should keep a hidden category in the color domain, so the rest keep their color', () => { + const { state, cleanup } = createCategoryChart({ cRange: ['red', 'yellow'] }); + + try { + expect(state.cGet(longData[0])).toBe('red'); + + state.seriesState.selectedKeys.toggle('bananas'); + flushSync(); + + expect(state.cDomain).toEqual(['apples', 'bananas']); + expect(state.cGet(longData[1])).toBe('yellow'); + } finally { + cleanup(); + } + }); + + it('should keep the implicit series visible while categories are selected', () => { + const { state, cleanup } = createCategoryChart(); + + try { + state.seriesState.selectedKeys.toggle('apples'); + flushSync(); + + // Hiding the one series that draws every category would empty the chart + expect(state.seriesState.visibleSeries.map((s) => s.key)).toEqual(['default']); + } finally { + cleanup(); + } + }); + + it('should read a highlight on the implicit series as no highlight', () => { + const { state, cleanup } = createCategoryChart(); + + try { + state.seriesState.highlightKey = 'default'; + flushSync(); + + // `default` names nothing to tell apart — every mark would fade against it + expect(state.seriesState.highlightKey).toBe(null); + + state.seriesState.highlightKey = 'apples'; + flushSync(); + + expect(state.seriesState.isHighlighted('apples', true)).toBe(true); + expect(state.seriesState.isHighlighted('bananas', true)).toBe(false); + } finally { + cleanup(); + } + }); +}); + +describe('ChartState stacked domain with mixed marks', () => { + type MixedData = { date: string; apples: number; bananas: number; target: number }; + + const mixed: MixedData[] = [ + { date: '2024-01', apples: 10, bananas: 20, target: 90 }, + { date: '2024-02', apples: 15, bananas: 25, target: 80 }, + ]; + + function createStacked(props: Partial> = {}) { + return createChartState({ + data: mixed, + x: 'date', + valueAxis: 'y', + seriesLayout: 'stack', + series: [{ key: 'apples' }, { key: 'bananas' }], + ...props, + }); + } + + it('should cover a mark drawn beside the stack rather than in it', () => { + const { state, cleanup } = createStacked(); + + try { + // A `Spline y="target"` over stacked bars: the bars total 40, the line reaches 90 + state.registerMark({ y: 'apples', seriesKey: 'apples', stacks: true }); + state.registerMark({ y: 'bananas', seriesKey: 'bananas', stacks: true }); + state.registerMark({ y: 'target' }); + flushSync(); + + expect(state.yDomain).toEqual([0, 90]); + } finally { + cleanup(); + } + }); + + it('should scale to the stack when every mark draws it', () => { + const { state, cleanup } = createStacked(); + + try { + state.registerMark({ y: 'apples', seriesKey: 'apples', stacks: true }); + state.registerMark({ y: 'bananas', seriesKey: 'bananas', stacks: true }); + flushSync(); + + expect(state.yDomain).toEqual([0, 40]); + } finally { + cleanup(); + } + }); + + it('should leave the domain alone when no mark draws the stack', () => { + // Two marks compared against each other read the raw accessor, so scaling to a total none of + // them draws would squash both into the lower half + const { state, cleanup } = createStacked(); + + try { + state.registerMark({ y: 'apples' }); + state.registerMark({ y: 'bananas' }); + flushSync(); + + expect(state.yDomain).toEqual([10, 25]); + } finally { + cleanup(); + } + }); + + it('should still stack when no mark has registered', () => { + const { state, cleanup } = createStacked(); + + try { + expect(state.yDomain).toEqual([0, 40]); + } finally { + cleanup(); + } + }); +}); + +describe('ChartState c as a grouping channel', () => { + type FruitRow = { year: string; fruit: string; value: number }; + const longData: FruitRow[] = [ + { year: '2024', fruit: 'apples', value: 10 }, + { year: '2024', fruit: 'bananas', value: 20 }, + { year: '2025', fruit: 'apples', value: 30 }, + { year: '2025', fruit: 'bananas', value: 40 }, + ]; + + it('names groups when `c` names a column', () => { + const { state, cleanup } = createChartState({ + data: longData, + x: 'year', + y: 'value', + c: 'fruit', + }); + + try { + expect(state.cGroups).toEqual(['apples', 'bananas']); + expect(state.cKey(longData[0])).toBe('apples'); + } finally { + cleanup(); + } + }); + + it('names nothing when `c` computes a colour per row', () => { + // Grouping on a computed colour would cut one series into a path per colour, joining points + // that are not adjacent + const { state, cleanup } = createChartState({ + data: [ + { date: '2024-01', value: -10 }, + { date: '2024-02', value: 20 }, + ], + x: 'date', + y: 'value', + c: (d: TestData) => (d.value < 0 ? 'under' : 'over'), + cDomain: ['over', 'under'], + }); + + try { + expect(state.cGroups).toBeNull(); + expect(state.cKey({ date: '2024-01', value: -10 })).toBeNull(); + } finally { + cleanup(); + } + }); + + it('names nothing when `c` resolves to an interval', () => { + // `BarChart` passes its value accessor as `c`, so a `y={['start', 'end']}` chart hands a pair + // per row to the colour channel — pairs are not category names + const data = [ + { date: '2024-01', start: 5, end: 10 }, + { date: '2024-02', start: 8, end: 16 }, + ]; + + const { state, cleanup } = createChartState({ + data, + x: 'date', + y: ['start', 'end'], + c: ['start', 'end'], + }); + + try { + expect(state.cGroups).toBeNull(); + expect(state.cKey(data[0])).toBeNull(); + } finally { + cleanup(); + } + }); + + it('does not infer a stack without a value accessor', () => { + // A chart that places its own marks — a beeswarm dodging along one axis — has no magnitude to + // accumulate, and inferring a stack would give the other axis a domain, ticks and gridlines + const { state, cleanup } = createChartState({ + data: longData, + x: 'year', + c: 'fruit', + }); + + try { + expect(state.seriesLayout).toBe('overlap'); + } finally { + cleanup(); + } + }); + + it('infers a stack once there is a value accessor to stack', () => { + const { state, cleanup } = createChartState({ + data: longData, + x: 'year', + y: 'value', + c: 'fruit', + }); + + try { + expect(state.seriesLayout).toBe('stackDiverging'); + } finally { + cleanup(); + } + }); +}); + +describe('ChartState explicit null domain', () => { + it('takes the extent from the data rather than adding a baseline', () => { + // `yDomain={null}` asks for the data's own extent. `valueAxis` + `bandPadding` are what turn + // on the auto-baseline the null is refusing, so a sparkline stays filled rather than being + // squashed against zero + const data: TestData[] = [ + { date: '2024-01', value: 45 }, + { date: '2024-02', value: 65 }, + ]; + + const { state, cleanup } = createChartState({ + data, + x: 'date', + y: 'value', + yDomain: null, + valueAxis: 'y', + bandPadding: 0.4, + }); + + try { + // The `null` survives as the resolved domain, leaving the scale to take the extent from the + // data — what matters is that nothing pinned it to zero + expect(state._yDomain).toBeNull(); + expect(state.yScale.domain()[0]).toBeGreaterThan(0); + } finally { + cleanup(); + } + }); + + it('still auto-derives a baseline when no domain is given', () => { + const data: TestData[] = [ + { date: '2024-01', value: 45 }, + { date: '2024-02', value: 65 }, + ]; + + const { state, cleanup } = createChartState({ + data, + x: 'date', + y: 'value', + valueAxis: 'y', + bandPadding: 0.4, + }); + + try { + expect(state._yDomain).toEqual([0, 65]); + } finally { + cleanup(); + } + }); }); diff --git a/packages/layerchart/src/lib/states/chart.svelte.ts b/packages/layerchart/src/lib/states/chart.svelte.ts index b04f48ba69..a9801a6251 100644 --- a/packages/layerchart/src/lib/states/chart.svelte.ts +++ b/packages/layerchart/src/lib/states/chart.svelte.ts @@ -22,11 +22,13 @@ import { filterObject } from '$lib/utils/filterObject.js'; import { calcDomain, calcScaleExtents, createGetter, createChartScale } from '$lib/utils/chart.js'; import { printDebug } from '$lib/utils/debug.js'; +import { getFacetPanel } from '$lib/contexts/facet.js'; import { GeoState } from './geo.svelte.js'; +import { FacetState, facetKey } from './facet.svelte.js'; import type { TransformState } from './transform.svelte.js'; import type { TooltipState } from './tooltip.svelte.js'; import type { BrushDomainType, BrushState } from './brush.svelte.js'; -import { SeriesState, type StackLayout } from './series.svelte.js'; +import { SeriesState, type SeriesLayout, type StackLayout } from './series.svelte.js'; import type { SeriesData } from '$lib/components/charts/types.js'; import { createControlledMotion, parseMotionProp } from '$lib/utils/motion.svelte.js'; @@ -54,6 +56,16 @@ export interface MarkInfo { color?: string; /** Label for legend/tooltip */ label?: string; + /** + * Whether this mark reads `SeriesState.getStackAccessors()` rather than the raw accessor — a + * stack-aware mark type with no explicit value accessor overriding it. A `Points` placing + * labels at its own `y` says `false`. + * + * Only what this covers *and* names a layer belongs in a stacked domain, which is the rest of + * the mark's own guard and depends on chart state — see `#drawsStack`. A `Spline` drawn over + * stacked bars keeps its own values and has to fit beside them. + */ + stacks?: boolean; } export type NodeKind = 'group' | 'mark' | 'composite-mark'; @@ -90,8 +102,70 @@ const _ParentNodeContext = new Context('ComponentTreeParen /** Mark info is "empty" when none of the fields the chart uses for series / * domain inference are populated. Pixel-mode primitives produce empty info * since they have no string/function accessors and no own data. */ +/** The grid's first panel — the one that registers marks on every panel's behalf */ +function isFirstPanel(facet: { column: number; row: number }) { + return facet.column === 0 && facet.row === 0; +} + function isEmptyMarkInfo(info: MarkInfo): boolean { - return !info.x && !info.y && !info.data && !info.color && !info.seriesKey && !info.label; + // Every field rather than a list to keep in sync — setting any of them is a mark telling the + // chart something about its series or domain, and a field added to `MarkInfo` later counts + // without having to remember this function. `stacks` is the one that caught us out: a bare + // `` reading the chart's own data and colour names none of the other fields, but the + // domain still has to know something on the chart draws the stack. + // + // Falsy rather than `!= null`, so `stacks: false` reads as "nothing to say" — which also means + // a meaningful `0` would need its own case here. + return Object.values(info).every((value) => !value); +} + +/** One axis of {@link transformForBrush}, as a fraction of the base domain */ +function zoomForAxis(domain: any[], from: any, to: any) { + if (from == null || to == null) return undefined; + + if (typeof domain[0] === 'string') { + // Categorical: the selection is a run of the domain, measured in indices + const startIdx = (domain as string[]).indexOf(from as string); + const endIdx = (domain as string[]).indexOf(to as string) + 1; + const selected = endIdx - startIdx; + if (selected <= 0 || domain.length === 0) return undefined; + return { scale: domain.length / selected, offset: startIdx / domain.length }; + } + + const baseMin = +domain[0]; + const baseRange = +domain[1] - baseMin; + const selectedRange = +to - +from; + if (selectedRange <= 0 || baseRange <= 0) return undefined; + return { scale: baseRange / selectedRange, offset: (+from - baseMin) / baseRange }; +} + +/** + * The scale/translate that brings `brush` into view, given the untransformed domains and plot size. + * + * Pure, so the same maths serves `zoomToBrush()` and the initial transform a chart renders with + * before `TransformContext` has loaded. + */ +export function transformForBrush( + brush: { x: BrushDomainType; y: BrushDomainType }, + axis: 'x' | 'y' | 'both', + base: { xDomain: any[]; yDomain: any[]; width: number; height: number } +) { + // Only an x (or both) selection sets the scale, as it always has + if (axis !== 'x' && axis !== 'both') return undefined; + + const x = zoomForAxis(base.xDomain, brush.x[0], brush.x[1]); + if (!x) return undefined; + + let translateY = 0; + if (axis === 'both') { + const y = zoomForAxis(base.yDomain, brush.y[0], brush.y[1]); + if (y) translateY = -y.offset * base.height * x.scale; + } + + return { + scale: x.scale, + translate: { x: -x.offset * base.width * x.scale, y: translateY }, + }; } export class ChartState< @@ -99,20 +173,46 @@ export class ChartState< XScale extends AnyScale = AnyScale, YScale extends AnyScale = AnyScale, > { + /** + * Stable identity for this chart instance. Used to attribute state changes to their + * originating chart (ex. so a chart can ignore the echo of its own update when synchronized + * with others). + * + * Defaults to an opaque symbol. Pass `id` to `Chart` to supply your own, which makes the + * identity comparable from outside — ex. `group.pointer.source === 'requests'` to tell which + * chart in a group is currently driving it. + */ + readonly id: string | symbol; + // The `$props()` proxy from the host component. Reads on `this.props.X` go // straight through to the underlying reactive prop — no spread / no derived // wrapper needed. props!: ChartPropsWithoutHTML; - // Brush-domain overrides. The host component owns the brush state as local - // `$state` and supplies these getters so brush selections take precedence - // over `props.xDomain` / `props.yDomain` when reading the effective domain. - #brushXDomain!: () => BrushDomainType | undefined; - #brushYDomain!: () => BrushDomainType | undefined; + /** + * Domain this chart zoomed to from its own brush (`zoomOnBrush`), which takes precedence over + * `props.xDomain` / `props.yDomain`. Set by `Chart` on brush end. + */ + brushXDomain = $state(); + brushYDomain = $state(); + + /** + * Domain shared by a chart group, applied only when nothing more specific is set. This chart's + * own brush zoom wins (it is direct interaction), and so does an explicitly supplied + * `props.xDomain` — a sibling chart must not silently override a domain the app controls. + * + * Written by `connectToChartGroup`; not intended to be set directly. + */ + groupXDomain = $state(); + groupYDomain = $state(); // State / contexts geoState: GeoState; transformState = $state(null!); + /** A `zoomToBrush()` that arrived before `transformState` existed, standing in until it does */ + #initialZoom = $state< + { brush: { x: BrushDomainType; y: BrushDomainType }; axis: 'x' | 'y' | 'both' } | undefined + >(); tooltipState = $state(null!); brushState = $state(null!); // TODO: handle TComponent @@ -233,7 +333,13 @@ export class ChartState< }; }); - if (markInfo && !insideCompositeMark) { + // Every panel of a faceted chart renders the same marks with the same accessors, so only the + // first registers. Registering per panel bumped `_markInfosVersion` once each, and every bump + // invalidates `flatData` → `extents` → domains → scales → every mark's positions. + const facetPanel = getFacetPanel(); + const isRepeatedPanel = facetPanel != null && !isFirstPanel(facetPanel()); + + if (markInfo && !insideCompositeMark && !isRepeatedPanel) { // Probe once at construction: if mark info is initially empty // (pixel-mode primitives where cx/cy/r are numbers), skip the // tracking $effect entirely. This is the common case for @@ -277,16 +383,10 @@ export class ChartState< // Meta data - reactive to props.meta changes meta = $derived(this.props.meta ?? {}); - constructor( - props: ChartPropsWithoutHTML, - overrides?: { - brushXDomain?: () => BrushDomainType | undefined; - brushYDomain?: () => BrushDomainType | undefined; - } - ) { + constructor(props: ChartPropsWithoutHTML) { this.props = props; - this.#brushXDomain = overrides?.brushXDomain ?? (() => undefined); - this.#brushYDomain = overrides?.brushYDomain ?? (() => undefined); + // Read once — identity must stay stable for the life of the chart + this.id = props.id ?? Symbol('Chart'); // Create GeoState instance — pass a dimensions getter so projection // is available during SSR (where $effect doesn't run) @@ -295,6 +395,8 @@ export class ChartState< () => ({ width: this.width, height: this.height }) ); + this.facetState = new FacetState(() => this); + // Create SeriesState internally from series/seriesLayout props. // When no explicit series are provided, derive implicit series from mark registrations. this.seriesState = new SeriesState( @@ -339,7 +441,7 @@ export class ChartState< return implicitSeries.length > 0 ? implicitSeries : EMPTY_SERIES; }, () => { - const layout = this.props.seriesLayout; + const layout = this.seriesLayout; if (!layout || !layout.startsWith('stack')) return null; const series = this.props.series ?? []; @@ -348,9 +450,23 @@ export class ChartState< return { layout: layout as StackLayout, + // The raw prop rather than `this.data`: reading the filtered data here would make the + // stack config depend on the mark registry (through `cGroups`), and a mark + // registering mid-render then mutates state this derived is reading. A hidden + // category drops out via `#categoryKeys` instead — `stack()` ignores columns whose + // key it wasn't given. data: hasSeparateData ? undefined : chartDataArray(this.props.data), keyBy: keyBy!, valueAccessor: this.valueAxis === 'y' ? this.props.y : this.props.x, + // Anything that subdivides the plot also subdivides the stack — see `StackConfig.groupBy` + groupBy: this.#stackGroupBy, + // Long data stacks by the category its rows carry, since no series names the layers + ...(this.cGroups + ? { + seriesBy: this.cKey, + seriesKeys: this.cGroups ?? [], + } + : null), }; } ); @@ -425,7 +541,7 @@ export class ChartState< let yInit = false; $effect(() => { - const domain = this._rawXDomain; + const domain = this._targetXDomain; if (!domain || domain.length < 2) return; const isDate = (domain[0] as unknown) instanceof Date; this._xDomainIsDate = isDate; @@ -446,7 +562,7 @@ export class ChartState< }); $effect(() => { - const domain = this._rawYDomain; + const domain = this._targetYDomain; if (!domain || domain.length < 2) return; const isDate = (domain[0] as unknown) instanceof Date; this._yDomainIsDate = isDate; @@ -471,13 +587,15 @@ export class ChartState< containerWidth = $derived(this.props.width ?? this._containerWidth); containerHeight = $derived(this.props.height ?? this._containerHeight); + // The chart's rows before a legend hides any of them — which is what `cDomain` is read from. + // // When `` is passed with a non-empty dataset, it's canonical — // marks with their own `data` (e.g. filtered label subsets) still contribute // to `flatData` for domain calculation but don't replace iteration data. // Otherwise fall back to `visibleSeriesData` so simplified charts that pass // data via series definitions still work, with reactive recomputation when // series are shown/hidden via legend. - data = $derived.by(() => { + #sourceData = $derived.by(() => { const propsData = this.props.data; if (propsData != null && (!Array.isArray(propsData) || propsData.length > 0)) { return propsData; @@ -488,14 +606,196 @@ export class ChartState< return []; }); + /** + * The groups `c` names, or `null` when the chart's `series` name them instead. + * + * An ordinal `c` scale with no configured series is a chart whose groups live in the data — + * `x1="fruit"` with `c="fruit"`, say — and the lone implicit series names none of them. A + * continuous `c` is a ramp instead, which the legend draws with nothing to click. + * + * What a legend lists, what stacks, and what `cKey` reads a row's group from. + */ + cGroups = $derived.by(() => { + if (this.props.c == null) return null; + + // Read from the `series` prop rather than `SeriesState.isDefaultSeries`, which also counts + // the series inferred from registered marks. `ChartState.data` depends on this, and marks + // register while deriveds are being read — so reaching into the mark registry from here + // makes registering a mark mutate state something is mid-read of. Series inferred from + // marks name nothing a legend could select anyway. + const configured = this.props.series ?? []; + const seriesNameThem = + configured.length > 1 || (configured.length === 1 && configured[0].key !== 'default'); + if (seriesNameThem) return null; + + // Naming a column (`c="fruit"`) says that column holds the category. A computed accessor + // (`c={(d) => (d.value < 0 ? 'under' : 'over')}`) is a colour per row instead — grouping on it + // would cut one series into a path per colour, joining points that aren't adjacent. + if (typeof this.props.c !== 'string') return null; + + // Categories are labels rather than measurements. A numeric domain is a ramp, and an array + // or object is the chart reading `c` off another channel — `BarChart` passes its value + // accessor, so a `y={['start', 'end']}` interval arrives here as a pair per row. + const domain = Array.isArray(this.cDomain) ? this.cDomain : null; + const first = domain?.[0]; + return typeof first === 'string' || typeof first === 'boolean' ? domain : null; + }); + + /** + * `seriesLayout` with `auto` resolved to what it means for this chart. + * + * A value given as an explicit interval is a pair of positions rather than a magnitude, so + * there is nothing to accumulate — a duration bar or a waterfall stays as drawn. + * + * Something also has to name the layers — two or more configured `series`, or an ordinal `c` — + * or there is one thing per band and stacking it would change nothing. + * + * Stacking about zero (`stackDiverging`) rather than end to end (`stack`) is what lets a + * population pyramid keep its two sides, and costs nothing when every value has the same sign. + * + * `group` is deliberately not inferred: an `x1` sub-band has to be asked for. + */ + seriesLayout = $derived.by>(() => { + const layout = this.props.seriesLayout ?? 'auto'; + if (layout !== 'auto') return layout; + + // Either axis: a mark can draw along the one the chart doesn't call its value axis — a + // horizontal `Waffle` reads an interval from `x` while `valueAxis` is still `y`. + // + // The interval can also be in the data rather than the accessor — `groupStackData` puts a + // `[y0, y1]` pair on each row, which the chart then reads with a single `y="values"`. + const first = chartDataArray(this.#sourceData)[0]; + for (const value of [this.props.y, this.props.x]) { + if (Array.isArray(value)) return 'overlap'; + if (value != null && first != null && Array.isArray(accessor(value)(first))) return 'overlap'; + } + + // There has to be a magnitude to accumulate. A chart that positions its marks itself — a + // beeswarm placing points along one axis with no accessor on the other — has nothing to + // stack, and inferring one would give that axis a domain, and so ticks and gridlines. + const configured = this.props.series ?? []; + const valueOf = this.valueAxis === 'y' ? this.props.y : this.props.x; + if (valueOf == null && configured.length === 0) return 'overlap'; + + // Only layers the chart was *configured* with count. `SeriesState.series` also holds the + // series inferred from registered marks, and two marks drawn for comparison name nothing to + // stack — they'd just be scaled to a total neither of them draws. + const namesLayers = configured.length > 1 || this.cGroups != null; + return namesLayers ? 'stackDiverging' : 'overlap'; + }); + + /** + * Whether the chart is stacked — the layout resolved to a stack *and* some mark draws it. + * + * An inferred layout leaves lines, points and hand-grouped marks reading raw values, so a + * chart can resolve to a stack that nothing on it draws. Ask this when positioning against + * the stack — the value domain, a `Highlight`, an annotation. `series.stackLayout` is the + * narrower question of how the stack accumulates, which a mark asks about itself. + */ + isStacked = $derived.by(() => { + if (this.seriesState.stackLayout == null) return false; + const marks = this._markInfos; + // A stack that was asked for stands before its marks mount. An inferred one has to be earned + // by a mark that draws it — otherwise a chart of lines, which registers nothing that stacks, + // is scaled to a total nothing on it shows. + if (marks.length === 0) return !this.seriesLayoutAuto; + return marks.some(({ info }) => this.#drawsStack(info)); + }); + + /** + * The rest of a mark's own stacking guard, from what it registered: it draws the stack only if + * it also names a layer — a series key, or the row itself when the categories live in the data + * — and isn't a mark that brought its own rows to an inferred stack. + */ + #drawsStack(info: MarkInfo) { + return ( + !!info.stacks && + (info.seriesKey != null || this.seriesState.stacksByCategory) && + !(this.seriesLayoutAuto && info.data != null) + ); + } + + /** Whether the resolved `seriesLayout` was inferred rather than asked for */ + seriesLayoutAuto = $derived((this.props.seriesLayout ?? 'auto') === 'auto'); + + /** + * The stacked accessors a mark should draw with, or `null` to draw its raw values. + * + * `stacksImplicitly` is the mark opting in: bars, areas and waffles are layers by nature, while + * lines and points are read against a shared baseline and only stack when a chart asks for it. + * So an inferred layout recruits the first group and leaves the second alone. + * + * `ownData` is a mark handed its own rows, already grouped by whoever handed them over — an + * inferred layout leaves those alone too. + * + * A `seriesKey` isn't required when the layers are named by the rows: long data says which + * layer it is, so the key has nothing to add. + */ + stackAccessorsFor(options: { + seriesKey?: string; + ownData?: boolean; + stacksImplicitly?: boolean; + }) { + const { seriesKey, ownData = false, stacksImplicitly = false } = options; + + if (this.series.stackLayout == null) return null; + if (this.seriesLayoutAuto && (!stacksImplicitly || ownData)) return null; + if (!seriesKey && !this.series.stacksByCategory) return null; + + return this.series.getStackAccessors(seriesKey); + } + + /** + * A value re-read against the stack — the top of `seriesKey`'s segment at `keyValue`. + * + * An annotation naming a series carries that series' own value, which is only where it's drawn + * when nothing stacks. Returns the value unchanged when no series is named, when the chart + * isn't stacked, or when the stack holds nothing at that category — a facet panel or sub-band, + * where the category alone can't say which stack is meant. + */ + stackedValue(seriesKey: string | undefined, keyValue: any, value: any) { + if (seriesKey == null || !this.isStacked) return value; + return this.series.getStackValueAt(seriesKey, keyValue)?.[1] ?? value; + } + + /** + * The row's key on the `c` channel — its legend swatch — or `null` when the chart's `series` + * name the legend's items instead. The category beside `cGet`'s color. + * + * `c` doubles as the series channel when nothing else divides the data — what colors the marks + * groups them. Marks fade and the legend hides against this the way they do against a series + * key, so a legend backed by an ordinal `c` scale acts on what it names — as `PieChart` already + * does with its slices. + * + * Distinct from `z`, which groups the *paths* a `Spline` / `Area` draws: a chart can set both + * (`z="id"` with `c="group"`), and it's `c` the legend names. + */ + cKey = $derived.by<(d: any) => any>(() => (this.cGroups ? (d: any) => this.c(d) : () => null)); + + data = $derived.by(() => { + const data = this.#sourceData; + // Rows of a `c` category the legend has hidden. Dropped here rather than at the marks so the + // scales follow too — the sub-band the category held is released, and the bars left widen + // into it, the way hiding a series does. + const selected = this.seriesState?.selectedKeys; + if (!this.cGroups || !selected || selected.isEmpty() || !Array.isArray(data)) { + return data; + } + return data.filter((d: any) => selected.isSelected(this.c(d))); + }); + flatData = $derived.by(() => { const base = (this.props.flatData ?? this.data) as TData[]; - // Include data from marks that have their own data but aren't already in a series. // Include data from marks that have their own data but aren't already in a series const extra: TData[] = []; + // Appending the same array twice can't widen a domain, and a mark repeated across facet + // panels registers its data once per panel — which grew `flatData` (and every domain + // recalculation over it) by a factor of the panel count. + const seen = new Set(); for (const { info } of this._markInfos) { - if (!info.data) continue; + if (!info.data || seen.has(info.data)) continue; + seen.add(info.data); // If this mark's exact data array is already included via a series, skip it. // Use reference equality (===) so marks sharing the same accessor key but // different data arrays (e.g. two Circle marks with separate datasets) are @@ -519,7 +819,11 @@ export class ChartState< if (this.props.bandPadding != null && this.valueAxis === 'y') { return scaleBand().padding(this.props.bandPadding); } - return autoScale(this.#brushXDomain() ?? this.props.xDomain, this.flatData, this.x); + return autoScale( + this.brushXDomain ?? this.props.xDomain ?? this.groupXDomain, + this.flatData, + this.x + ); }); _yScaleProp = $derived.by(() => { @@ -530,7 +834,11 @@ export class ChartState< if (this.props.bandPadding != null && this.valueAxis === 'x') { return scaleBand().padding(this.props.bandPadding); } - return autoScale(this.#brushYDomain() ?? this.props.yDomain, this.flatData, this.y); + return autoScale( + this.brushYDomain ?? this.props.yDomain ?? this.groupYDomain, + this.flatData, + this.y + ); }); _zScaleProp = $derived.by(() => { @@ -551,12 +859,12 @@ export class ChartState< /** Transform-aware range for band scales in domain mode (D3 range-rescaling pattern) */ private _xScaleRange = $derived.by(() => { if ( - this.transformState?.mode === 'domain' && - (this.transformState.axis === 'x' || this.transformState.axis === 'both') && + this.#transform?.mode === 'domain' && + (this.#transform.axis === 'x' || this.#transform.axis === 'both') && isScaleBand(this._xScaleProp) && this.width > 0 ) { - const { scale, translate } = this.transformState; + const { scale, translate } = this.#transform; return [translate.x, translate.x + this.width * scale]; } return this.xRangeProp; @@ -564,12 +872,12 @@ export class ChartState< private _yScaleRange = $derived.by(() => { if ( - this.transformState?.mode === 'domain' && - (this.transformState.axis === 'y' || this.transformState.axis === 'both') && + this.#transform?.mode === 'domain' && + (this.#transform.axis === 'y' || this.#transform.axis === 'both') && isScaleBand(this._yScaleProp) && this.height > 0 ) { - const { scale, translate } = this.transformState; + const { scale, translate } = this.#transform; return [translate.y, translate.y + this.height * scale]; } return this.yRangeProp; @@ -612,6 +920,25 @@ export class ChartState< x1 = $derived(makeAccessor(this.props.x1)); y1 = $derived(makeAccessor(this.props.y1)); + /** + * Partitions rows into separate stacks, or `undefined` when there's a single stack per category. + * + * A stack belongs to whatever subdivides the plot around it: the facet panel it's drawn in, and + * the `x1` / `y1` sub-band it's positioned within (grouped *and* stacked bars). Without this + * the stacks of every panel and group collide, since they share a `keyBy` value. + */ + #stackGroupBy = $derived.by<((d: any) => string) | undefined>(() => { + const facet = this.facetState.enabled ? this.facetState : null; + const subBand = this.props.x1 != null ? this.x1 : this.props.y1 != null ? this.y1 : null; + if (!facet && !subBand) return undefined; + + return (d: any) => + JSON.stringify([ + facet ? facetKey(facet.x?.(d), facet.y?.(d)) : null, + subBand ? (subBand(d) ?? null) : null, + ]); + }); + filteredExtents = $derived(filterObject($state.snapshot(this.props.extents ?? {}))); activeGetters = $derived({ @@ -679,8 +1006,37 @@ export class ChartState< }; }); - width = $derived(this.box.width); - height = $derived(this.box.height); + /** + * Panel layout when `fx` / `fy` partition the chart. `width` / `height` below are one panel's + * box rather than the whole plot area, so every scale, mark, and axis computes against a single + * panel and the enclosing `` translate places it. + */ + facetState!: FacetState; + + get facet() { + return this.facetState; + } + + /** + * Whether the facet panel is the band the tooltip resolves to — `facet` mode, asked for. + * + * A band scale inside a panel groups the same way `x1` / `y1` do inside a band, so it can be + * read either way: `band` resolves to a bar, and `facet` to the panel around it — the highlight + * marking the whole panel and the tooltip listing its rows, which is what a group of a few bars + * wants. Asked for rather than inferred from the presence of `fx`, so that faceting a chart + * doesn't quietly change what its tooltip points at. + * + * Configured series rule it back out: each row then carries the whole set rather than one + * sub-band's share of it, so a band already *is* a row, and one rect over the panel would + * resolve every hover in it to the panel's first row. + */ + facetBand = $derived.by( + () => + this.facetState.enabled && this.tooltip.mode === 'facet' && this.seriesState.isDefaultSeries + ); + + width = $derived(this.facetState.width); + height = $derived(this.facetState.height); extents = $derived.by((): Extents => { const scaleLookup: Record = { @@ -808,10 +1164,13 @@ export class ChartState< #ySeriesValues: any[] = $derived(this.#getAxisSeriesValues('y')); private resolveDomain(axis: 'x' | 'y'): DomainType | undefined { - const domain = - axis === 'x' - ? (this.#brushXDomain() ?? this.props.xDomain) - : (this.#brushYDomain() ?? this.props.yDomain); + // `null` is a meaningful value for these props — "take the extent from the data, without a + // baseline" — so it has to survive the fallback to a chart group's shared domain, which `??` + // would step over the same way it steps over `undefined`. + const brushDomain = axis === 'x' ? this.brushXDomain : this.brushYDomain; + const propDomain = axis === 'x' ? this.props.xDomain : this.props.yDomain; + const groupDomain = axis === 'x' ? this.groupXDomain : this.groupYDomain; + const domain = brushDomain ?? (propDomain !== undefined ? propDomain : groupDomain); const interval = axis === 'x' ? this.props.xInterval : this.props.yInterval; const explicitBaseline = axis === 'x' ? this.props.xBaseline : this.props.yBaseline; // Use explicit baseline if provided (null means "no baseline"), otherwise auto-derive @@ -823,11 +1182,31 @@ export class ChartState< // Series-specific domain calculation (only applies if the value axis) if (this.valueAxis === axis && this.seriesState) { - // For stacked series, collect all y0/y1 values for domain calculation - if (this.seriesState.isStacked) { + // For stacked series, collect all y0/y1 values for domain calculation. Only when some + // mark actually draws the stack — a chart of marks that read the raw accessor (two + // `Spline`s compared against each other, say) would otherwise be scaled to totals nothing + // on it draws. No registered marks at all means the chart hasn't been composed by hand, + // so the stack stands. + const marks = this._markInfos; + + if (this.isStacked) { // Collect in a single pass — see `getStackedValues`, which hoists the // `keyBy` accessor and stack derived reads out of the per-row loop. - return extent(this.seriesState.getStackedValues(chartDataArray(this.data))); + const stacked = this.seriesState.getStackedValues(chartDataArray(this.data)); + + // Marks that sit beside the stack rather than in it — a target line over stacked bars — + // still have to fit, so their values are pooled with the stack's rather than replaced. + const beside: any[] = []; + for (const { info } of marks) { + if (this.#drawsStack(info)) continue; + const markAccessor = axis === 'y' ? info.y : info.x; + if (!markAccessor) continue; + const rows = info.data ?? chartDataArray(this.data); + beside.push(...rows.flatMap(accessor(markAccessor))); + } + + const values = beside.length ? [...stacked, ...beside].filter((v) => v != null) : stacked; + if (values.length > 0) return extent(values); } // For non-default series, calculate domain from all visible series values @@ -894,39 +1273,89 @@ export class ChartState< _baseXDomain = $derived(calcDomain('x', this.extents, this._xDomain)); _baseYDomain = $derived(calcDomain('y', this.extents, this._yDomain)); - /** Target domain — narrowed by transform when mode is 'domain', but not yet animated */ - _rawXDomain = $derived.by(() => { - if ( - this.transformState?.mode === 'domain' && - (this.transformState.axis === 'x' || this.transformState.axis === 'both') && - this.width > 0 - ) { - return this._computeTransformDomain( - this._baseXDomain, - this.transformState.translate.x, - this.transformState.scale, - this.width - ); - } - return this._baseXDomain; + /** + * Where the transform starts, for a chart that opens zoomed — `transform.initialDomain`, or a + * `zoomToBrush()` that arrived before `TransformContext` had loaded. + * + * `TransformContext` takes this as its initial scale/translate, so the chart it mounts into is + * already where it should be. + */ + _initialTransform = $derived.by(() => { + const zoom = + this.#initialZoom ?? + (this.props.transform?.initialDomain + ? { + brush: { + x: this.props.transform.initialDomain.x ?? [null, null], + y: this.props.transform.initialDomain.y ?? [null, null], + }, + axis: this.props.transform.axis ?? 'x', + } + : undefined); + if (!zoom) return undefined; + + return transformForBrush(zoom.brush, zoom.axis, { + xDomain: this._baseXDomain, + yDomain: this._baseYDomain, + width: this.width, + height: this.height, + }); }); - _rawYDomain = $derived.by(() => { - if ( - this.transformState?.mode === 'domain' && - (this.transformState.axis === 'y' || this.transformState.axis === 'both') && - this.height > 0 - ) { - return this._computeTransformDomain( - this._baseYDomain, - this.transformState.translate.y, - this.transformState.scale, - this.height - ); - } - return this._baseYDomain; + /** + * The live transform, or the initial one standing in while `TransformContext` loads — that + * import is async, so a chart opening zoomed would otherwise paint the full domain first. + */ + #transform = $derived.by(() => { + if (this.transformState) return this.transformState; + + const props = this.props.transform; + const initial = this._initialTransform; + if (!props || !initial) return undefined; + + return { + mode: props.mode ?? 'none', + axis: props.axis ?? 'both', + scale: initial.scale, + translate: initial.translate, + }; }); + /** + * The domain a `mode: 'domain'` transform narrows an axis to, at one of its two positions — + * where it sits now, and where it is heading. Any other mode leaves the axis alone. + * + * The two only differ while the transform itself animates (`transform.motion`). Drawing follows + * `'current'`, so the chart moves with the animation; anything sharing the domain follows + * `'target'`, or it would publish every frame the animation passes through and have whoever + * listens re-aim at each one. + */ + #transformDomain(axis: 'x' | 'y', at: 'current' | 'target') { + const base = axis === 'x' ? this._baseXDomain : this._baseYDomain; + const size = axis === 'x' ? this.width : this.height; + + const transform = this.#transform; + if (transform?.mode !== 'domain') return base; + if (transform.axis !== axis && transform.axis !== 'both') return base; + if (!(size > 0)) return base; + + // `targetScale` / `targetTranslate` live on `TransformState`; the fallback has neither, and + // isn't animating either, so its current position is also where it is heading + const target = at === 'target' && this.transformState ? this.transformState : null; + const scale = target ? target.targetScale : transform.scale; + const translate = target ? target.targetTranslate : transform.translate; + + return this._computeTransformDomain(base, translate[axis], scale, size); + } + + /** What `xDomain` / `yDomain` animate toward */ + _targetXDomain = $derived(this.#transformDomain('x', 'current')); + _targetYDomain = $derived(this.#transformDomain('y', 'current')); + + /** Where the transform is heading — what a chart shares with its group */ + _transformTargetXDomain = $derived(this.#transformDomain('x', 'target')); + _transformTargetYDomain = $derived(this.#transformDomain('y', 'target')); + /** Effective domain — animated via motion if configured */ xDomain = $derived.by(() => { if (this._xDomainMotion) { @@ -936,7 +1365,7 @@ export class ChartState< } return animated; } - return this._rawXDomain; + return this._targetXDomain; }); yDomain = $derived.by(() => { @@ -947,53 +1376,80 @@ export class ChartState< } return animated; } - return this._rawYDomain; + return this._targetYDomain; }); zDomain = $derived(calcDomain('z', this.extents, this.props.zDomain)); rDomain = $derived(calcDomain('r', this.extents, this.props.rDomain)); + /** + * The domain of an `x1` / `y1` sub-band taken from the data. + * + * Sub-bands are ordinal, so each distinct value needs a place of its own — an extent would keep + * only the first and last, leaving every sub-band between them without a position. Numeric + * values keep the extent, since those can be laid out on a continuous scale. + */ + #subBandDomain(value: (d: any) => any) { + const values = chartDataArray(this.data).map(value); + if (values.length > 0 && typeof values[0] === 'number') { + return extent(values) as [number, number]; + } + return unique(values); + } + + /** + * An explicit `x1Domain` / `y1Domain`, with the sub-bands of hidden series dropped. + * + * A sub-band belongs to a series only when it *names* one: `seriesLayout="group"` puts series + * keys in this domain, while `x1` / `y1` as a data accessor puts data values in it (and the + * implicit `default` series names nothing at all). Filtering values that were never series + * keys empties the domain, leaving the sub-band scale with nothing to position bars against. + */ + #visibleSubBandDomain(domain: DomainType) { + if (!Array.isArray(domain)) return domain; + + const seriesKeys = new Set(this.seriesState.series.map((s) => s.key)); + if (seriesKeys.size === 0) return domain; + + const visibleKeys = new Set(this.seriesState.visibleSeries.map((s) => s.key)); + return domain.filter((key: any) => !seriesKeys.has(key) || visibleKeys.has(key)); + } + x1Domain = $derived.by(() => { if (this.props.x1Domain) { - // Only filter by visible series when series are configured — otherwise the - // full x1Domain is used as-is (composable charts without series). - if (this.seriesState.series.length > 0) { - const visibleKeys = new Set(this.seriesState.visibleSeries.map((s) => s.key)); - return this.props.x1Domain.filter((key: any) => visibleKeys.has(key)); - } - return this.props.x1Domain; + return this.#visibleSubBandDomain(this.props.x1Domain); + } + // `x1` names the sub-band dimension in the data; series keys only divide the band when + // nothing else does + if (this.x1) { + return this.#subBandDomain(this.x1); } // Auto-derive for grouped series when x is the category axis - if (this.props.seriesLayout === 'group' && this.valueAxis === 'y') { + if (this.seriesLayout === 'group' && this.valueAxis === 'y') { return this.seriesState.visibleSeries.map((s) => s.key); } - if (this.x1) { - return extent(chartDataArray(this.data), this.x1); - } return undefined; }); y1Domain = $derived.by(() => { if (this.props.y1Domain) { - // Only filter by visible series when series are configured — otherwise the - // full y1Domain is used as-is (composable charts without series). - if (this.seriesState.series.length > 0) { - const visibleKeys = new Set(this.seriesState.visibleSeries.map((s) => s.key)); - return this.props.y1Domain.filter((key: any) => visibleKeys.has(key)); - } - return this.props.y1Domain; + return this.#visibleSubBandDomain(this.props.y1Domain); + } + // `y1` names the sub-band dimension in the data; series keys only divide the band when + // nothing else does + if (this.y1) { + return this.#subBandDomain(this.y1); } // Auto-derive for grouped series when y is the category axis - if (this.props.seriesLayout === 'group' && this.valueAxis === 'x') { + if (this.seriesLayout === 'group' && this.valueAxis === 'x') { return this.seriesState.visibleSeries.map((s) => s.key); } - if (this.y1) { - return extent(chartDataArray(this.data), this.y1); - } return undefined; }); cDomain = $derived.by(() => { if (this.props.cDomain) return this.props.cDomain; - const values = chartDataArray(this.data).map(this.c); + // Read from the unfiltered rows: a category the legend hid keeps its place in the domain, or + // the ordinal range would shift under the ones left and recolor them + const values = chartDataArray(this.#sourceData).map(this.c); // Use extent for numeric values (continuous scales), unique for categorical (ordinal scales) if (values.length > 0 && typeof values[0] === 'number') { return extent(values) as [number, number]; @@ -1114,7 +1570,7 @@ export class ChartState< ); } // Auto-derive for grouped series when x is the category axis - if (this.props.seriesLayout === 'group' && this.valueAxis === 'y' && this.x1Domain) { + if (this.seriesLayout === 'group' && this.valueAxis === 'y' && this.x1Domain) { const groupPadding = this.props.groupPadding ?? 0; return createScale( scaleBand().padding(groupPadding), @@ -1139,7 +1595,7 @@ export class ChartState< ); } // Auto-derive for grouped series when y is the category axis - if (this.props.seriesLayout === 'group' && this.valueAxis === 'x' && this.y1Domain) { + if (this.seriesLayout === 'group' && this.valueAxis === 'x' && this.y1Domain) { const groupPadding = this.props.groupPadding ?? 0; return createScale( scaleBand().padding(groupPadding), @@ -1153,14 +1609,22 @@ export class ChartState< y1Get = $derived(this.y1 ? createGetter(this.y1, this.y1Scale) : null); - cScale = $derived( - this.props.cScale || this.props.cRange - ? createScale(this.props.cScale ?? scaleOrdinal(), this.cDomain, this.props.cRange, { - width: this.width, - height: this.height, - }) - : null - ); + /** + * Color scale marks resolve a categorical `fill` / `stroke` through: `cScale` / `cRange` when + * configured, else the colors declared on `series`. + * + * Marks that instead treat this as a continuous ramp (`Contour`, `Density`, `Raster`) copy and + * re-domain it — they skip an ordinal scale, since the series fallback means nothing re-domained. + */ + cScale = $derived.by(() => { + if (this.props.cScale || this.props.cRange) { + return createScale(this.props.cScale ?? scaleOrdinal(), this.cDomain, this.props.cRange, { + width: this.width, + height: this.height, + }); + } + return (this.seriesState?.cScale as AnyScale | null) ?? null; + }); cGet = $derived((d: any) => this.cScale?.(this.c(d))); @@ -1174,8 +1638,8 @@ export class ChartState< * so we return the base scale's range instead. */ xRange = $derived.by(() => { if ( - this.transformState?.mode === 'domain' && - (this.transformState.axis === 'x' || this.transformState.axis === 'both') && + this.#transform?.mode === 'domain' && + (this.#transform.axis === 'x' || this.#transform.axis === 'both') && isScaleBand(this._xScaleProp) ) { return getRange(this.baseXScale); @@ -1184,8 +1648,8 @@ export class ChartState< }); yRange = $derived.by(() => { if ( - this.transformState?.mode === 'domain' && - (this.transformState.axis === 'y' || this.transformState.axis === 'both') && + this.#transform?.mode === 'domain' && + (this.#transform.axis === 'y' || this.#transform.axis === 'both') && isScaleBand(this._yScaleProp) ) { return getRange(this.baseYScale); @@ -1292,6 +1756,11 @@ export class ChartState< hide: () => {}, }; + /** + * Stands in for `TransformState` until `TransformContext` has loaded, so a chart driven from the + * outside doesn't have to wait for it. Carries every method the transform documents — one that + * is missing throws rather than doing nothing, which is the opposite of the point. + */ static readonly #fallbackTransform = { mode: 'none' as const, scale: 1, @@ -1300,18 +1769,28 @@ export class ChartState< dragging: false, setScale: () => {}, setTranslate: () => {}, + setScrollMode: () => {}, + reset: () => {}, + zoomIn: () => {}, + zoomOut: () => {}, + zoomTo: () => {}, + scaleTo: () => {}, + translateCenter: () => {}, }; static readonly #fallbackSeries = { series: [], visibleSeries: [], highlightKey: null, + highlightSource: null, + setHighlight: () => {}, isVisible: () => true, isHighlighted: () => false, isDefaultSeries: true, allSeriesData: [], allSeriesColors: [], - selectedKeys: { isEmpty: () => true, isSelected: () => false }, + cScale: null, + selectedKeys: { current: [], isEmpty: () => true, isSelected: () => false }, }; static readonly #fallbackBrush = { @@ -1324,6 +1803,8 @@ export class ChartState< reset: () => {}, selectAll: () => {}, move: () => {}, + // No selection yet, so nothing is excluded — matches an inactive brush + contains: () => true, }; // TODO: We also expose context states directly as well for `bind:` for each context (TooltipContext, GeoContext, etc). @@ -1344,68 +1825,38 @@ export class ChartState< } /** - * Convert a brush selection to transform scale/translate, zooming the chart to the brushed region. + * Zoom the chart to a brushed region, converting the selection to transform scale/translate. * Used by integrated brush mode when `transform.mode === 'domain'`. */ zoomToBrush(brush: { x: BrushDomainType; y: BrushDomainType }, axis: 'x' | 'y' | 'both' = 'x') { - const brushX = brush.x; - const brushY = brush.y; - - if ((axis === 'x' || axis === 'both') && brushX[0] != null && brushX[1] != null) { - const baseDomainX = this._baseXDomain; - - if (typeof baseDomainX[0] === 'string') { - // Categorical: compute scale/translate from domain indices - const totalCount = baseDomainX.length; - const startIdx = (baseDomainX as unknown as string[]).indexOf(brushX[0] as string); - const endIdx = (baseDomainX as unknown as string[]).indexOf(brushX[1] as string) + 1; - const selectedCount = endIdx - startIdx; - - if (selectedCount > 0 && totalCount > 0) { - const newScale = totalCount / selectedCount; - const newTranslateX = -(startIdx / totalCount) * this.width * newScale; - - let newTranslateY = 0; - if (axis === 'both' && brushY[0] != null && brushY[1] != null) { - const baseDomainY = this._baseYDomain; - if (typeof baseDomainY[0] === 'string') { - const yTotal = baseDomainY.length; - const yStart = (baseDomainY as unknown as string[]).indexOf(brushY[0] as string); - const yEnd = (baseDomainY as unknown as string[]).indexOf(brushY[1] as string) + 1; - const ySelected = yEnd - yStart; - if (ySelected > 0) { - newTranslateY = -(yStart / yTotal) * this.height * newScale; - } - } - } + // `TransformContext` is imported lazily, so a zoom requested as the chart mounts (restoring a + // saved range, say) has nothing to drive yet. Hold it as the initial transform instead, which + // the domain already renders with and `TransformContext` adopts when it arrives. + if (!this.transformState) { + this.#initialZoom = { brush, axis }; + return; + } - this.transform.setScale(newScale); - this.transform.setTranslate({ x: newTranslateX, y: newTranslateY }); - } - } else { - // Continuous: existing numeric logic - const baseMinX = +baseDomainX[0]; - const baseRangeX = +baseDomainX[1] - baseMinX; - const brushMinX = +brushX[0]; - const brushRangeX = +brushX[1] - brushMinX; - - if (brushRangeX > 0 && baseRangeX > 0) { - const newScale = baseRangeX / brushRangeX; - const newTranslateX = -((brushMinX - baseMinX) / baseRangeX) * this.width * newScale; - - let newTranslateY = 0; - if (axis === 'both' && brushY[0] != null && brushY[1] != null) { - const baseMinY = +this._baseYDomain[0]; - const baseRangeY = +this._baseYDomain[1] - baseMinY; - const brushMinY = +brushY[0]; - newTranslateY = -((brushMinY - baseMinY) / baseRangeY) * this.height * newScale; - } + const transform = transformForBrush(brush, axis, { + xDomain: this._baseXDomain, + yDomain: this._baseYDomain, + width: this.width, + height: this.height, + }); + if (!transform) return; - this.transform.setScale(newScale); - this.transform.setTranslate({ x: newTranslateX, y: newTranslateY }); - } - } - } + this.transform.setScale(transform.scale); + + // `setScale` clamps to `scaleExtent`, and the translate was computed for the scale we asked + // for — it has to follow the one we got. Both are proportional to the scale for a given left + // edge, so a translate left over from a larger scale pushes the view past where it belongs. + const applied = this.transform.targetScale ?? transform.scale; + const ratio = transform.scale === 0 ? 1 : applied / transform.scale; + + this.transform.setTranslate({ + x: transform.translate.x * ratio, + y: transform.translate.y * ratio, + }); } get config() { diff --git a/packages/layerchart/src/lib/states/facet.svelte.test.ts b/packages/layerchart/src/lib/states/facet.svelte.test.ts new file mode 100644 index 0000000000..9c0eb3b2b3 --- /dev/null +++ b/packages/layerchart/src/lib/states/facet.svelte.test.ts @@ -0,0 +1,769 @@ +import { describe, expect, it, vi } from 'vitest'; +import { render } from 'vitest-browser-svelte'; +import { scaleBand } from 'd3-scale'; + +import TestHarness from '../components/tests/TestHarness.svelte'; +import Circle from '../components/Circle/Circle.svelte'; +import Highlight from '../components/Highlight/Highlight.svelte'; +import ScatterChart from '../components/charts/ScatterChart/ScatterChart.svelte'; +import BarChart from '../components/charts/BarChart/BarChart.svelte'; +import Axis from '../components/Axis/Axis.svelte'; +import { panelDatum } from '../utils/tooltip.js'; +import type { ChartState } from './chart.svelte.js'; + +const data = [ + { g: 'a', h: 'x', v: 1, w: 10 }, + { g: 'a', h: 'y', v: 2, w: 20 }, + { g: 'b', h: 'x', v: 3, w: 30 }, + { g: 'b', h: 'x', v: 4, w: 40 }, +]; + +function renderChart(extra: Record, componentProps: Record = {}) { + let ctx: ChartState = null!; + render(TestHarness, { + component: Circle, + chartProps: { + data, + x: 'v', + y: 'w', + xDomain: [0, 5], + yDomain: [0, 50], + width: 400, + height: 300, + padding: 0, + ...extra, + }, + componentProps: { cx: 'v', cy: 'w', r: 2, ...componentProps }, + oncontext: (c: any) => (ctx = c), + }); + return () => ctx; +} + +describe('facets', () => { + describe('layout', () => { + it('is a single full-size panel when not faceting', async () => { + const ctx = renderChart({}); + await expect.poll(() => ctx()?.width).toBeGreaterThan(0); + + expect(ctx().facet.enabled).toBe(false); + expect(ctx().facet.panels).toHaveLength(1); + expect(ctx().width).toBe(ctx().box.width); + expect(ctx().height).toBe(ctx().box.height); + expect(ctx().facet.panels[0].data).toHaveLength(data.length); + }); + + it('splits into a panel per `fx` value, narrowing `width` to one panel', async () => { + const ctx = renderChart({ fx: 'g' }); + await expect.poll(() => ctx()?.facet.enabled).toBe(true); + + expect(ctx().facet.panels.map((f) => f.fx)).toEqual(['a', 'b']); + expect(ctx().width).toBeLessThan(ctx().box.width / 2 + 1); + // `height` is untouched — only `fy` divides vertically + expect(ctx().height).toBe(ctx().box.height); + expect(ctx().facet.panels[0].x).toBe(0); + expect(ctx().facet.panels[1].x).toBeGreaterThan(0); + }); + + it('partitions the rows across panels', async () => { + const ctx = renderChart({ fx: 'g' }); + await expect.poll(() => ctx()?.facet.enabled).toBe(true); + + expect(ctx().facet.panels.map((f) => f.data.length)).toEqual([2, 2]); + expect(ctx().facet.panels[0].data.every((d: any) => d.g === 'a')).toBe(true); + }); + + it('crosses `fx` and `fy` into a grid, marking combinations with no rows empty', async () => { + const ctx = renderChart({ fx: 'g', fy: 'h' }); + await expect.poll(() => ctx()?.facet.enabled).toBe(true); + + expect(ctx().facet.panels).toHaveLength(4); + const byKey = Object.fromEntries(ctx().facet.panels.map((f) => [`${f.fx}/${f.fy}`, f])); + expect(byKey['a/x'].data).toHaveLength(1); + expect(byKey['b/x'].data).toHaveLength(2); + // no `b` rows on `y` — a crossed grid is usually sparse + expect(byKey['b/y'].empty).toBe(true); + expect(byKey['b/y'].data).toHaveLength(0); + }); + + it('flags the grid`s outer edges', async () => { + const ctx = renderChart({ fx: 'g', fy: 'h' }); + await expect.poll(() => ctx()?.facet.enabled).toBe(true); + + const byKey = Object.fromEntries(ctx().facet.panels.map((f) => [`${f.fx}/${f.fy}`, f])); + expect(byKey['a/x']).toMatchObject({ left: true, top: true, right: false, bottom: false }); + expect(byKey['b/y']).toMatchObject({ left: false, top: false, right: true, bottom: true }); + }); + + it('takes an explicit `fxDomain` for panel order', async () => { + const ctx = renderChart({ fx: 'g', fxDomain: ['b', 'a'] }); + await expect.poll(() => ctx()?.facet.enabled).toBe(true); + expect(ctx().facet.panels.map((f) => f.fx)).toEqual(['b', 'a']); + }); + }); + + describe('rendering', () => { + it('repeats the marks once per panel', async () => { + renderChart({ fx: 'g' }); + // every row still drawn, just distributed across the panels + await expect.poll(() => document.querySelectorAll('circle').length).toBe(data.length); + // ...inside one translated group per panel + await expect + .poll(() => document.querySelectorAll('svg g.lc-group, svg g[transform]').length) + .toBeGreaterThanOrEqual(2); + }); + + it('keeps the scales shared, so equal values land at the same panel offset', async () => { + // the same `v` in each panel — with shared scales both must resolve to the same + // panel-relative `cx`, which is the whole point of faceting over separate charts + let ctx: ChartState = null!; + render(TestHarness, { + component: Circle, + chartProps: { + data: [ + { g: 'a', v: 2, w: 10 }, + { g: 'b', v: 2, w: 10 }, + ], + x: 'v', + y: 'w', + xDomain: [0, 5], + yDomain: [0, 50], + width: 400, + height: 300, + padding: 0, + fx: 'g', + }, + componentProps: { cx: 'v', cy: 'w', r: 2 }, + oncontext: (c: any) => (ctx = c), + }); + + await expect.poll(() => document.querySelectorAll('circle').length).toBe(2); + const [first, second] = Array.from(document.querySelectorAll('circle')); + expect(first.getAttribute('cx')).toBe(second.getAttribute('cx')); + // and the panels themselves are offset from each other + expect(ctx.facet.panels[1].x).toBeGreaterThan(0); + }); + }); + + describe('headers', () => { + it('draws the panel headers from the default layout', async () => { + // `FacetAxis` lives outside `Facet` so that `Axis` stays out of every layer's bundle — + // `Chart`'s default layout renders it, and a composed chart adds `` itself + render(ScatterChart, { + props: { data, x: 'v', y: 'w', fx: 'g', width: 400, height: 300 }, + } as any); + + await expect.poll(() => document.querySelectorAll('.lc-facet-axis-x').length).toBe(1); + const labels = Array.from(document.querySelectorAll('.lc-facet-axis-x text')).map((t) => + t.textContent?.trim() + ); + expect(labels).toEqual(['a', 'b']); + }); + + it('draws the row headers when faceting on `fy`', async () => { + render(ScatterChart, { + props: { data, x: 'v', y: 'w', fy: 'h', width: 400, height: 300 }, + } as any); + + await expect.poll(() => document.querySelectorAll('.lc-facet-axis-y').length).toBe(1); + const labels = Array.from(document.querySelectorAll('.lc-facet-axis-y text')).map((t) => + t.textContent?.trim() + ); + expect(labels).toEqual(['x', 'y']); + }); + + it('repeats a data axis in every panel with `facetAll`', async () => { + // Documented in the facets guide. Without it an axis draws on the grid's outer edge only, + // so `fx` with two columns would place a single `left` axis + const chartProps = { data, x: 'v', y: 'w', fx: 'g', width: 400, height: 300, padding: 0 }; + + render(TestHarness, { + component: Axis, + chartProps, + componentProps: { placement: 'left', facetAll: true }, + } as any); + await expect.poll(() => document.querySelectorAll('.lc-axis.placement-left').length).toBe(2); + + document.body.innerHTML = ''; + render(TestHarness, { + component: Axis, + chartProps, + componentProps: { placement: 'left' }, + } as any); + await expect.poll(() => document.querySelectorAll('.lc-axis.placement-left').length).toBe(1); + }); + + it('draws both headers on a two-dimensional grid', async () => { + render(ScatterChart, { + props: { data, x: 'v', y: 'w', fx: 'g', fy: 'h', width: 400, height: 300 }, + } as any); + + await expect.poll(() => document.querySelectorAll('.lc-facet-axis-x').length).toBe(1); + expect(document.querySelectorAll('.lc-facet-axis-y').length).toBe(1); + }); + }); + + describe('interaction', () => { + // Both panels hold the same values, so a lookup that isn't panel-scoped resolves to whichever + // row it happens to reach first — the failure this guards against. + const paired = [ + { g: 'a', v: 1, w: 10, id: 'a1' }, + { g: 'a', v: 4, w: 40, id: 'a4' }, + { g: 'b', v: 1, w: 10, id: 'b1' }, + { g: 'b', v: 4, w: 40, id: 'b4' }, + ]; + + function renderPaired(chartProps: Record = {}, componentProps = {}) { + let ctx: ChartState = null!; + render(TestHarness, { + component: Circle, + chartProps: { + data: paired, + x: 'v', + y: 'w', + xDomain: [0, 5], + yDomain: [0, 50], + width: 400, + height: 300, + padding: 0, + fx: 'g', + tooltipContext: { mode: 'quadtree' }, + ...chartProps, + }, + componentProps: { cx: 'v', cy: 'w', r: 3, ...componentProps }, + oncontext: (c: any) => (ctx = c), + }); + return () => ctx; + } + + /** Hover the point `(v, w)` within a panel, in the coordinates the pointer actually reports */ + async function hoverPoint( + ctx: ChartState, + panelIndex: number, + v: number, + w: number + ) { + const hitArea = document.querySelector('.lc-tooltip-context') as HTMLElement; + const rect = hitArea.getBoundingClientRect(); + const panel = ctx.facet.panels[panelIndex]; + const eventInit = { + bubbles: true, + clientX: rect.x + panel.x + (ctx.xScale(v) as number), + clientY: rect.y + panel.y + (ctx.yScale(w) as number), + }; + hitArea.dispatchEvent(new PointerEvent('pointerenter', eventInit)); + hitArea.dispatchEvent(new PointerEvent('pointermove', eventInit)); + } + + it('covers the whole plot area, not just the first panel', async () => { + const ctx = renderPaired(); + await expect.poll(() => ctx()?.facet.panels.length).toBe(2); + + const hitArea = document.querySelector('.lc-tooltip-context') as HTMLElement; + // one panel is ~190px of the 400px plot — the pointer has to reach both + expect(hitArea.getBoundingClientRect().width).toBeCloseTo(ctx().box.width, 0); + expect(ctx().facet.width).toBeLessThan(ctx().box.width); + }); + + it('resolves the hovered panel`s row, not an equal one from another panel', async () => { + const ctx = renderPaired(); + await expect.poll(() => ctx()?.facet.panels.length).toBe(2); + + // retried — `quadtree` modes build their trees behind a dynamic import + await vi.waitFor(async () => { + await hoverPoint(ctx(), 1, 1, 10); + expect(ctx().tooltip.data?.id).toBe('b1'); + }); + + await hoverPoint(ctx(), 0, 1, 10); + await expect.poll(() => ctx().tooltip.data?.id).toBe('a1'); + }); + + it('resolves per panel in rect modes, whose hit targets render per panel', async () => { + // `bounds` / `band` build a `` per row inside the layer, so each panel draws its own + let ctx: ChartState = null!; + render(TestHarness, { + component: Circle, + chartProps: { + data: [ + { g: 'a', cat: 'x', v: 10, id: 'a' }, + { g: 'b', cat: 'x', v: 20, id: 'b' }, + ], + x: 'cat', + xScale: scaleBand(), + y: 'v', + yDomain: [0, 50], + width: 400, + height: 300, + padding: 0, + fx: 'g', + tooltipContext: { mode: 'band' }, + }, + componentProps: { cx: 'cat', cy: 'v', r: 3 }, + oncontext: (c: any) => (ctx = c), + }); + + await expect.poll(() => ctx?.facet.panels.length).toBe(2); + // one hit rect per row, in its own panel — not every row in every panel + await expect.poll(() => document.querySelectorAll('.lc-tooltip-rect').length).toBe(2); + + const rects = Array.from(document.querySelectorAll('.lc-tooltip-rect')); + await vi.waitFor(() => { + rects[1].dispatchEvent(new PointerEvent('pointerenter', { bubbles: true })); + rects[1].dispatchEvent(new PointerEvent('pointermove', { bubbles: true })); + expect(ctx.tooltip.data?.id).toBe('b'); + }); + }); + + it('resolves per panel in voronoi mode, whose cells are built per panel', async () => { + let ctx: ChartState = null!; + render(TestHarness, { + component: Circle, + chartProps: { + data: paired, + x: 'v', + y: 'w', + xDomain: [0, 5], + yDomain: [0, 50], + width: 400, + height: 300, + padding: 0, + fx: 'g', + tooltipContext: { mode: 'voronoi' }, + }, + componentProps: { cx: 'v', cy: 'w', r: 3 }, + oncontext: (c: any) => (ctx = c), + }); + + await expect.poll(() => ctx?.facet.panels.length).toBe(2); + // one cell per row, in its own panel — `Voronoi` is lazily imported + await expect + .poll(() => document.querySelectorAll('.lc-tooltip-voronoi-path').length) + .toBe(paired.length); + + const cells = Array.from(document.querySelectorAll('.lc-tooltip-voronoi-path')); + const ids = new Set(); + for (const cell of cells) { + cell.dispatchEvent(new PointerEvent('pointerenter', { bubbles: true })); + ids.add(ctx.tooltip.data?.id); + } + // every row reachable, rather than the same panel's rows found twice over + expect([...ids].sort()).toEqual(['a1', 'a4', 'b1', 'b4']); + }); + + it('resolves per panel in bisect modes too', async () => { + const ctx = renderPaired({ tooltipContext: { mode: 'bisect-x' } }); + await expect.poll(() => ctx()?.facet.panels.length).toBe(2); + + await hoverPoint(ctx(), 1, 4, 40); + await expect.poll(() => ctx().tooltip.data?.id).toBe('b4'); + + await hoverPoint(ctx(), 0, 4, 40); + await expect.poll(() => ctx().tooltip.data?.id).toBe('a4'); + }); + + it('marks the same position in every panel with `facetAll`', async () => { + // `v: 1` is in both panels; `v: 2` only in the first + const shared = [ + { g: 'a', v: 1, w: 10 }, + { g: 'a', v: 2, w: 20 }, + { g: 'b', v: 1, w: 30 }, + ]; + let ctx: ChartState = null!; + render(TestHarness, { + component: Highlight, + chartProps: { + data: shared, + x: 'v', + y: 'w', + xDomain: [0, 5], + yDomain: [0, 50], + width: 400, + height: 300, + padding: 0, + fx: 'g', + }, + componentProps: { points: true, lines: true, facetAll: true }, + oncontext: (c: any) => (ctx = c), + }); + await expect.poll(() => ctx?.facet.panels.length).toBe(2); + + // both panels have a row at `v: 1`, so both mark it + ctx.tooltip.show({ data: shared[0] }); + await expect.poll(() => document.querySelectorAll('.lc-highlight-point').length).toBe(2); + + // the second panel has nothing at `v: 2`, so it marks no point — but the crosshair, which + // marks a position rather than a row, is still drawn in both + ctx.tooltip.show({ data: shared[1] }); + await expect.poll(() => document.querySelectorAll('.lc-highlight-point').length).toBe(1); + expect(document.querySelectorAll('.lc-highlight-line').length).toBe(2); + }); + + it('renders a tooltip per panel with `facetAll`, each showing its own row', async () => { + // `props.tooltip.root` only reaches `DefaultTooltip`, which the default layout renders + const shared = [ + { g: 'a', v: 1, w: 11 }, + { g: 'a', v: 4, w: 12 }, + { g: 'b', v: 1, w: 33 }, + { g: 'b', v: 4, w: 34 }, + ]; + // nested under `props`, since a bare `props` key would read as a Svelte mount option + render(ScatterChart, { + props: { + data: shared, + x: 'v', + y: 'w', + fx: 'g', + xDomain: [0, 5], + yDomain: [0, 50], + width: 400, + height: 300, + padding: 0, + props: { tooltip: { root: { facetAll: true } } }, + }, + } as any); + + const hitArea = (await vi.waitUntil(() => + document.querySelector('.lc-tooltip-context') + )) as HTMLElement; + + await vi.waitFor(() => { + const rect = hitArea.getBoundingClientRect(); + const eventInit = { + bubbles: true, + clientX: rect.x + rect.width * 0.05, + clientY: rect.y + rect.height * 0.8, + }; + hitArea.dispatchEvent(new PointerEvent('pointerenter', eventInit)); + hitArea.dispatchEvent(new PointerEvent('pointermove', eventInit)); + + // one per panel, each showing its own row rather than the hovered one's + const text = Array.from(document.querySelectorAll('.lc-tooltip-root')).map((t) => + t.textContent?.replace(/\s+/g, ' ').trim() + ); + expect(text.length).toBe(2); + expect(text.some((v) => v?.includes('11'))).toBe(true); + expect(text.some((v) => v?.includes('33'))).toBe(true); + }); + }); + + describe('panel name', () => { + const named = [ + { g: 0, name: 'North', m: 'Jan', v: 1, w: 11 }, + { g: 1, name: 'South', m: 'Jan', v: 1, w: 33 }, + ]; + + /** What `DefaultTooltip` puts in front of the hovered value */ + function label(facet?: Record) { + const ctx = renderChart({ data: named, fx: 'g', ...(facet ? { facet } : null) }); + return (row: any) => ctx().facet.tooltipLabel(row); + } + + it('is the panel`s `fx` / `fy` values', () => { + expect(label()(named[0])).toBe(0); + }); + + it('joins both when the grid is crossed', () => { + expect(label({})(named[0])).toBe(0); + const crossed = renderChart({ data: named, fx: 'g', fy: 'name' }); + expect(crossed().facet.tooltipLabel(named[0])).toBe('0 · North'); + }); + + it('is empty with `tooltip: false`', () => { + expect(label({ tooltip: false })(named[0])).toBeUndefined(); + }); + + it('comes off the row with a `tooltip` function', () => { + // what a wrapped grid needs: `fx` is a position, and the name is on the row + expect(label({ tooltip: (d: any) => d.name })(named[0])).toBe('North'); + }); + + it('is empty when the `tooltip` function has nothing to give', () => { + expect(label({ tooltip: () => null })(named[0])).toBeUndefined(); + }); + + /** + * The rendered tooltip header for the first panel's bar. + * + * A `BarChart` rather than the scatter above: `quadtree` / `voronoi` tooltips head their + * list with the series instead, so the panel has nowhere to go there. + */ + async function headerText(facet?: Record) { + render(BarChart, { + props: { + data: named, + x: 'm', + y: 'w', + fx: 'g', + series: [{ key: 'w' }], + width: 400, + height: 300, + padding: 0, + ...(facet ? { facet } : null), + }, + } as any); + + // one hit rect per bar, since configured series rule out the panel being the band + await expect.poll(() => document.querySelectorAll('.lc-tooltip-rect').length).toBe(2); + const rect = document.querySelectorAll('.lc-tooltip-rect')[0]; + + let text: string | undefined; + await vi.waitFor(() => { + rect.dispatchEvent(new PointerEvent('pointerenter', { bubbles: true })); + rect.dispatchEvent(new PointerEvent('pointermove', { bubbles: true })); + + text = document.querySelector('.lc-tooltip-root')?.textContent?.replace(/\s+/g, ' '); + expect(text).toBeTruthy(); + }); + return text!; + } + + it('reaches the tooltip header', async () => { + expect(await headerText()).toContain('0 · Jan'); + }); + + it('reaches the tooltip header through a `tooltip` function', async () => { + expect(await headerText({ tooltip: (d: any) => d.name })).toContain('North · Jan'); + }); + + it('names each panel in its own tooltip with `facetAll`', async () => { + // One tooltip per panel, each for a different row — a header read off the hovered row + // would name the hovered panel in all of them + render(ScatterChart, { + props: { + data: [ + { g: 'a', v: 1, w: 11 }, + { g: 'b', v: 1, w: 33 }, + ], + x: 'v', + y: 'w', + fx: 'g', + xDomain: [0, 5], + yDomain: [0, 50], + width: 400, + height: 300, + padding: 0, + tooltipContext: { mode: 'bisect-x' }, + props: { tooltip: { root: { facetAll: true } } }, + }, + } as any); + + const hitArea = (await vi.waitUntil(() => + document.querySelector('.lc-tooltip-context') + )) as HTMLElement; + + await vi.waitFor(() => { + const rect = hitArea.getBoundingClientRect(); + const eventInit = { + bubbles: true, + clientX: rect.x + rect.width * 0.05, + clientY: rect.y + rect.height * 0.5, + }; + hitArea.dispatchEvent(new PointerEvent('pointerenter', eventInit)); + hitArea.dispatchEvent(new PointerEvent('pointermove', eventInit)); + + const headers = Array.from(document.querySelectorAll('.lc-tooltip-header')).map((h) => + h.textContent?.replace(/\s+/g, ' ').trim() + ); + expect(headers.length).toBe(2); + expect(headers.some((h) => h?.startsWith('a'))).toBe(true); + expect(headers.some((h) => h?.startsWith('b'))).toBe(true); + }); + }); + }); + + it('resolves each panel`s row at a hovered position', async () => { + const ctx = renderPaired(); + await expect.poll(() => ctx()?.facet.panels.length).toBe(2); + + const [a, b] = ctx().facet.panels; + // `v: 1` is in both panels, so each resolves its own row there + expect(panelDatum(ctx(), a, paired[2])?.id).toBe('a1'); + expect(panelDatum(ctx(), b, paired[0])?.id).toBe('b1'); + // ...and nothing when the panel has no row at that position + expect(panelDatum(ctx(), a, { v: 3, w: 30 })).toBeUndefined(); + }); + + it('tells whether a row belongs to a panel', async () => { + const ctx = renderPaired(); + await expect.poll(() => ctx()?.facet.panels.length).toBe(2); + + const [a, b] = ctx().facet.panels; + expect(a.has(paired[0])).toBe(true); + expect(b.has(paired[0])).toBe(false); + // by `fx` value rather than identity, so a mark's own row belongs where its values place it + expect(b.has({ g: 'b', v: 9, w: 9 })).toBe(true); + }); + + it('positions a tooltip shown by data in that row`s panel', async () => { + // the path a `ChartGroup`'s shared pointer takes — the row is resolved, not the point + const ctx = renderPaired(); + await expect.poll(() => ctx()?.facet.panels.length).toBe(2); + + const second = ctx().facet.panels[1]; + ctx().tooltip.show({ data: paired[2] }); + await expect.poll(() => ctx().tooltip.data?.id).toBe('b1'); + + expect(ctx().tooltip.x).toBeGreaterThanOrEqual(second.x); + expect(ctx().tooltip.x).toBeLessThanOrEqual(second.x + second.width); + }); + + it('confines the highlight to the panel owning the row', async () => { + let ctx: ChartState = null!; + render(TestHarness, { + component: Highlight, + chartProps: { + data: paired, + x: 'v', + y: 'w', + xDomain: [0, 5], + yDomain: [0, 50], + width: 400, + height: 300, + padding: 0, + fx: 'g', + }, + componentProps: { points: true, lines: true }, + oncontext: (c: any) => (ctx = c), + }); + await expect.poll(() => ctx?.facet.panels.length).toBe(2); + + ctx.tooltip.show({ data: paired[2] }); + + // both the point and the crosshair stay in that panel — `facetAll` opts into all of them + await expect.poll(() => document.querySelectorAll('.lc-highlight-point').length).toBe(1); + expect(document.querySelectorAll('.lc-highlight-line').length).toBe(1); + }); + }); + + describe('series', () => { + // Both panels hold a `cat: 'x'` row, so a stack keyed only by the category collides and every + // panel draws whichever row was stacked last + const stacked = [ + { g: 'a', cat: 'x', v1: 1, v2: 2 }, + { g: 'b', cat: 'x', v1: 10, v2: 20 }, + ]; + + it('stacks each panel`s rows among themselves', async () => { + let ctx: ChartState = null!; + render(TestHarness, { + component: Circle, + chartProps: { + data: stacked, + x: 'cat', + xScale: scaleBand(), + fx: 'g', + series: [{ key: 'v1' }, { key: 'v2' }], + seriesLayout: 'stack', + width: 400, + height: 300, + padding: 0, + }, + componentProps: { cx: 'cat', cy: 'v1', r: 2 }, + oncontext: (c: any) => (ctx = c), + }); + + await expect.poll(() => ctx?.facet.panels.length).toBe(2); + + // d3 attaches `data` to each stacked pair, so compare the values themselves + const pair = (key: string, d: any) => { + const value = ctx.series.getStackValue(key, d); + return value && [value[0], value[1]]; + }; + + expect(pair('v1', stacked[0])).toEqual([0, 1]); + expect(pair('v2', stacked[0])).toEqual([1, 3]); + expect(pair('v1', stacked[1])).toEqual([0, 10]); + expect(pair('v2', stacked[1])).toEqual([10, 30]); + }); + + // Not a facet, but the same collision: `x1` subdivides each band, so both groups share a + // `keyBy` value and their stacks would otherwise merge into one + const grouped = [ + { year: 2019, basket: 1, apples: 10, bananas: 20 }, + { year: 2019, basket: 2, cherries: 5, grapes: 7 }, + ]; + + it('stacks within each `x1` group', async () => { + let ctx: ChartState = null!; + render(TestHarness, { + component: Circle, + chartProps: { + data: grouped, + x: 'year', + xScale: scaleBand(), + x1: 'basket', + x1Scale: scaleBand(), + series: [{ key: 'apples' }, { key: 'bananas' }, { key: 'cherries' }, { key: 'grapes' }], + seriesLayout: 'stack', + width: 400, + height: 300, + }, + componentProps: { cx: 'year', cy: 'apples', r: 2 }, + oncontext: (c: any) => (ctx = c), + }); + await expect.poll(() => ctx?.width).toBeGreaterThan(0); + + const pair = (key: string, d: any) => { + const value = ctx.series.getStackValue(key, d); + return value && [value[0], value[1]]; + }; + + // each basket stacks from zero, rather than continuing the other's total + expect(pair('apples', grouped[0])).toEqual([0, 10]); + expect(pair('bananas', grouped[0])).toEqual([10, 30]); + expect(pair('cherries', grouped[1])).toEqual([0, 5]); + expect(pair('grapes', grouped[1])).toEqual([5, 12]); + }); + }); + + describe('clipping', () => { + it('clips to the panel, so a zoomed mark can`t bleed into its neighbour', async () => { + // `ChartClipPath` renders inside the layer, so each panel gets its own — sized from + // `ctx.width` / `height`, which are the panel's box + render(ScatterChart, { + data, + x: 'v', + y: 'w', + fx: 'g', + brush: true, + width: 400, + height: 300, + } as any); + await expect.poll(() => document.querySelectorAll('circle').length).toBeGreaterThan(0); + + // clip geometry is a path: `M0,0 h v ...` + const widths = Array.from(document.querySelectorAll('clipPath')) + .map((clip) => Number(clip.getAttribute('path')?.match(/h(-?[\d.]+)/)?.[1])) + .filter((width) => width > 0); + const counts = new Map(); + for (const width of widths) counts.set(width, (counts.get(width) ?? 0) + 1); + + // the marks clip is the narrowest, appears once per panel, and can't reach a neighbour + const panelWidth = Math.min(...widths); + expect(counts.get(panelWidth)).toBe(2); + expect(panelWidth).toBeLessThan(400 / 2); + }); + }); + + describe('mark data', () => { + it('draws the rows of the panel it renders into', async () => { + // `h` splits 3 rows / 1 row, so the counts alone show the rows were partitioned rather + // than every panel drawing the whole chart's data + renderChart({ fx: 'h' }); + await expect.poll(() => document.querySelectorAll('circle').length).toBe(data.length); + + const perPanel = new Map(); + for (const circle of document.querySelectorAll('circle')) { + const panel = circle.closest('g')!; + perPanel.set(panel, (perPanel.get(panel) ?? 0) + 1); + } + expect([...perPanel.values()].sort()).toEqual([1, 3]); + }); + + it('lets a mark override the panel with its own `data`', async () => { + renderChart({ fx: 'g' }, { data: [{ v: 1, w: 10 }] }); + // the one given row, drawn into each of the two panels + await expect.poll(() => document.querySelectorAll('circle').length).toBe(2); + }); + }); +}); diff --git a/packages/layerchart/src/lib/states/facet.svelte.ts b/packages/layerchart/src/lib/states/facet.svelte.ts new file mode 100644 index 0000000000..b6ce011564 --- /dev/null +++ b/packages/layerchart/src/lib/states/facet.svelte.ts @@ -0,0 +1,253 @@ +import { scaleBand } from 'd3-scale'; +import { unique } from '@layerstack/utils'; + +import type { DomainType } from '$lib/utils/scales.svelte.js'; +import { makeAccessor } from '$lib/utils/scales.svelte.js'; +import { chartDataArray } from '$lib/utils/common.js'; +import type { AxisProps } from '$lib/components/Axis/Axis.shared.svelte.js'; + +export type FacetOptions = { + /** + * Gap between panels, as a fraction of a panel's size (a d3 band scale `paddingInner`). + * @default 0.1 + */ + padding?: number; + /** Gap between panel columns. Defaults to `padding`. */ + paddingX?: number; + /** Gap between panel rows. Defaults to `padding`. */ + paddingY?: number; + + /** + * Panel headers. `fx` / `fy` are scales, so their headers are axes over them — pass `Axis` + * props to configure, or `false` to remove. + * @default true + */ + axis?: boolean | Partial; + + /** + * How the panel names itself in the tooltip header, in front of the hovered value. + * + * `false` removes it, and a function replaces it — for a grid whose `fx` / `fy` are positions + * rather than names, where the panel's own `0 · 2` says nothing and the name it stands for is + * somewhere on the row. + * + * @default true + */ + tooltip?: boolean | ((data: any) => any); +}; + +/** A single panel of a faceted chart */ +export type Facet = { + /** Stable key for `{#each}`, from the `fx` / `fy` pair */ + key: string; + /** This panel's `fx` value, or `undefined` when not faceting on `x` */ + fx: any; + /** This panel's `fy` value, or `undefined` when not faceting on `y` */ + fy: any; + /** Column index within the `fx` domain */ + column: number; + /** Row index within the `fy` domain */ + row: number; + /** Panel offset from the plot area's origin */ + x: number; + y: number; + width: number; + height: number; + /** The rows belonging to this panel */ + data: TData[]; + /** Whether the panel has no data — a crossed `fx` × `fy` grid is usually sparse */ + empty: boolean; + /** Outer edges, for placing axes only where they're needed */ + left: boolean; + right: boolean; + top: boolean; + bottom: boolean; + + /** + * Whether a row belongs to this panel. + * + * Compares the row's `fx` / `fy` values rather than its identity, so a row from a mark's own + * data belongs to the panel those values place it in, the same as one of the chart's own. + */ + has(row: any): boolean; +}; + +/** The chart surface the facet layout reads, narrowed so `FacetState` is testable on its own */ +export type FacetChartContext = { + data: any; + box: { width: number; height: number }; + /** The chart's position accessors, for matching a row across panels */ + x?: (d: any) => any; + y?: (d: any) => any; + props: { + fx?: any; + fy?: any; + fxDomain?: DomainType; + fyDomain?: DomainType; + facet?: FacetOptions; + }; +}; + +/** Key a panel by its `fx` / `fy` pair — `JSON.stringify` so `Date`s and numbers stay distinct */ +export function facetKey(fx: any, fy: any) { + return JSON.stringify([fx ?? null, fy ?? null]); +} + +/** + * Layout for a chart partitioned into panels. + * + * The panels divide the plot area while the position scales stay shared, which is what makes them + * comparable — so `ChartState.width` / `height` are one panel's box and `box` is the whole plot. + */ +export class FacetState { + // Assigned in the constructor; the `$derived` below is lazy so it never reads it early + #getCtx!: () => FacetChartContext; + #ctx = $derived(this.#getCtx()); + + constructor(getCtx: () => FacetChartContext) { + this.#getCtx = getCtx; + } + + /** Accessor partitioning into columns, or `null` when not faceting on `x` */ + x = $derived(makeAccessor(this.#ctx.props.fx) as ((d: any) => any) | null); + /** Accessor partitioning into rows */ + y = $derived(makeAccessor(this.#ctx.props.fy) as ((d: any) => any) | null); + + /** Panel columns, in the order given or the order they appear in the data */ + xDomain = $derived(facetDomain(chartDataArray(this.#ctx.data), this.x, this.#ctx.props.fxDomain)); + /** Panel rows */ + yDomain = $derived(facetDomain(chartDataArray(this.#ctx.data), this.y, this.#ctx.props.fyDomain)); + + /** Whether the chart is partitioned into panels at all */ + enabled = $derived(this.xDomain.length > 0 || this.yDomain.length > 0); + + /** + * What names the hovered row's panel in a tooltip header, or `undefined` for nothing to show. + * Distinct from the panel headers (`facet.axis`), which label the panels themselves. + * + * The `fx` / `fy` values by default, the same as those headers show. They aren't always the + * panel's name though — a wrapped grid facets on position and carries the name on the row — so + * `facet.tooltip` takes a function to read it from there instead, or `false` to leave the + * header to the value alone. + */ + tooltipLabel(data: any) { + const option = this.#ctx.props.facet?.tooltip ?? true; + if (option === false) return undefined; + if (typeof option === 'function') return option(data) ?? undefined; + + const parts = [this.x?.(data), this.y?.(data)].filter((v) => v != null); + if (!parts.length) return undefined; + // A lone value is handed back as it came, so a header that formats it still can — only a + // crossed grid has to join, and a joined pair is already a string + return parts.length === 1 ? parts[0] : parts.join(' · '); + } + + /** Band scales laying the panels out across the full plot area */ + xScale = $derived( + facetScale( + this.xDomain, + this.#ctx.box.width, + this.#ctx.props.facet?.paddingX ?? this.#ctx.props.facet?.padding ?? 0.1 + ) + ); + yScale = $derived( + facetScale( + this.yDomain, + this.#ctx.box.height, + this.#ctx.props.facet?.paddingY ?? this.#ctx.props.facet?.padding ?? 0.1 + ) + ); + + /** One panel's dimensions — the whole plot area when not faceting */ + width = $derived(this.xScale ? this.xScale.bandwidth() : this.#ctx.box.width); + height = $derived(this.yScale ? this.yScale.bandwidth() : this.#ctx.box.height); + + /** The panels to render, with their offsets, rows, and outer-edge flags */ + panels = $derived.by(() => { + const columns = this.xDomain.length ? this.xDomain : [undefined]; + const rows = this.yDomain.length ? this.yDomain : [undefined]; + const allRows = chartDataArray(this.#ctx.data); + + // Bucket once rather than filtering per panel — a crossed grid is O(columns × rows) panels + const byKey = new Map(); + if (this.enabled) { + for (const d of allRows) { + const key = facetKey(this.x ? this.x(d) : undefined, this.y ? this.y(d) : undefined); + const bucket = byKey.get(key); + if (bucket) bucket.push(d); + else byKey.set(key, [d]); + } + } + + const out: Facet[] = []; + for (let column = 0; column < columns.length; column++) { + for (let row = 0; row < rows.length; row++) { + const fx = columns[column]; + const fy = rows[row]; + const key = facetKey(fx, fy); + const data = this.enabled ? (byKey.get(key) ?? []) : allRows; + + out.push({ + key, + fx, + fy, + column, + row, + x: this.xScale?.(fx) ?? 0, + y: this.yScale?.(fy) ?? 0, + width: this.width, + height: this.height, + data, + empty: data.length === 0, + left: column === 0, + right: column === columns.length - 1, + top: row === 0, + bottom: row === rows.length - 1, + // Keyed rather than a scan of `data`, so this stays O(1) as the grid and the data grow + has: (r: any) => !this.enabled || facetKey(this.x?.(r), this.y?.(r)) === key, + }); + } + } + return out; + }); + + /** + * The panel containing a point in plot-area coordinates, or `undefined` in the gap between + * panels — `scaleBand` has no `invert`, so the bands are tested directly. + * + * Points outside the plot area resolve to `undefined` as well, leaving the caller's own bounds + * check as the only place that decision is made. + */ + panelAt(x: number, y: number): Facet | undefined { + return this.panels.find( + (panel) => + x >= panel.x && x <= panel.x + panel.width && y >= panel.y && y <= panel.y + panel.height + ); + } +} + +/** + * Band scale positioning the panels along one facet axis, or `null` when not faceting on it. + * + * `paddingOuter(0)` so the grid spans the full plot area — the gap belongs *between* panels, and + * any outer margin is the chart's own padding. + */ +export function facetScale(domain: any[], size: number, padding: number) { + if (domain.length === 0) return null; + return scaleBand() + .domain(domain) + .range([0, size]) + .paddingInner(domain.length > 1 ? padding : 0) + .paddingOuter(0); +} + +/** Distinct facet values, in the order given or the order they appear in the data */ +export function facetDomain( + rows: any[], + accessor: ((d: any) => any) | null, + explicit: DomainType | undefined +): any[] { + if (explicit) return [...explicit]; + if (!accessor) return []; + return unique(rows.map(accessor)); +} diff --git a/packages/layerchart/src/lib/states/group-transform.svelte.test.ts b/packages/layerchart/src/lib/states/group-transform.svelte.test.ts new file mode 100644 index 0000000000..3fc72a1000 --- /dev/null +++ b/packages/layerchart/src/lib/states/group-transform.svelte.test.ts @@ -0,0 +1,109 @@ +import { describe, expect, it, vi } from 'vitest'; +import { render } from 'vitest-browser-svelte'; + +import ChartGroupTestHarness from '../components/tests/ChartGroupTestHarness.svelte'; +import LineChart from '../components/charts/LineChart/LineChart.svelte'; +import { ChartGroupState } from './group.svelte.js'; +import type { ChartState } from './chart.svelte.js'; + +const data = [ + { date: new Date('2024-01-01'), value: 10 }, + { date: new Date('2024-01-11'), value: 30 }, + { date: new Date('2024-01-21'), value: 20 }, + { date: new Date('2024-01-31'), value: 50 }, +]; + +const transformProps = { mode: 'domain' as const, axis: 'x' as const, scaleExtent: [1, 50] }; + +async function renderPair() { + const group = new ChartGroupState({ domain: { axis: 'x' } }); + const contexts: ChartState[] = []; + + render(ChartGroupTestHarness, { + group, + component: LineChart, + members: [ + { chartProps: { data, x: 'date', y: 'value', transform: transformProps } }, + { chartProps: { data, x: 'date', y: 'value' } }, + ], + oncontext: (ctx: any, i: number) => (contexts[i] = ctx), + } as any); + + await vi.waitFor(() => { + expect(contexts[0]?.transformState).toBeTruthy(); + expect(contexts[1]).toBeTruthy(); + }); + + return { group, zoomable: contexts[0], plain: contexts[1] }; +} + +describe('ChartGroup + transform', () => { + it('settles with an animated transform', async () => { + const group = new ChartGroupState({ domain: { axis: 'x' } }); + const contexts: ChartState[] = []; + render(ChartGroupTestHarness, { + group, + component: LineChart, + members: [ + { chartProps: { data, x: 'date', y: 'value', transform: { ...transformProps, motion: 'spring' } } }, // prettier-ignore + { chartProps: { data, x: 'date', y: 'value' } }, + ], + oncontext: (ctx: any, i: number) => (contexts[i] = ctx), + } as any); + await vi.waitFor(() => expect(contexts[0]?.transformState).toBeTruthy()); + + const range = [new Date('2024-01-06'), new Date('2024-01-16')]; + group.setDomain({ x: range, source: Symbol('elsewhere') }); + + // The animation runs through many intermediate positions; none should be shared + await new Promise((r) => setTimeout(r, 600)); + expect(+(group.domain.x as unknown as Date[])[0]).toBe(+range[0]); + expect(+(group.domain.x as unknown as Date[])[1]).toBe(+range[1]); + }); + + it('publishes the domain a zoomed chart settles on', async () => { + const { group, zoomable, plain } = await renderPair(); + expect(group.domain.active).toBe(false); + + zoomable.transform.setScale(2); + zoomable.transform.setTranslate({ x: 0, y: 0 }); + + await vi.waitFor(() => { + expect(group.domain.active).toBe(true); + expect(group.domain.source).toBe(zoomable.id); + }); + + // the other chart follows it + await vi.waitFor(() => { + expect(+(plain.xDomain as Date[])[1]).toBe(+(group.domain.x as Date[])[1]); + }); + }); + + it('zooms a transform chart to a domain shared by another', async () => { + const { group, zoomable } = await renderPair(); + const range = [new Date('2024-01-06'), new Date('2024-01-16')]; + + group.setDomain({ x: range, source: Symbol('elsewhere') }); + + await vi.waitFor(() => { + expect(zoomable.transform.targetScale).toBeGreaterThan(1); + const settled = zoomable._targetXDomain as unknown as Date[]; + expect(+settled[0]).toBeCloseTo(+range[0], -4); + expect(+settled[1]).toBeCloseTo(+range[1], -4); + }); + }); + + it('settles rather than trading updates between the two', async () => { + const { group, zoomable } = await renderPair(); + group.setDomain({ x: [new Date('2024-01-06'), new Date('2024-01-16')], source: Symbol('x') }); + await vi.waitFor(() => expect(zoomable.transform.targetScale).toBeGreaterThan(1)); + + const settled = { ...group.domain }; + await new Promise((r) => setTimeout(r, 300)); + + // Same range, and still attributed to whoever set it — a chart republishing what it was given + // would take ownership and could aim the others at a value it is only passing through + expect(+(group.domain.x as Date[])[0]).toBe(+(settled.x as Date[])[0]); + expect(+(group.domain.x as Date[])[1]).toBe(+(settled.x as Date[])[1]); + }); +}); diff --git a/packages/layerchart/src/lib/states/group.svelte.test.ts b/packages/layerchart/src/lib/states/group.svelte.test.ts new file mode 100644 index 0000000000..6765cee3cc --- /dev/null +++ b/packages/layerchart/src/lib/states/group.svelte.test.ts @@ -0,0 +1,1227 @@ +import { describe, expect, it, vi } from 'vitest'; +import { render } from 'vitest-browser-svelte'; + +import ChartGroupTestHarness from '../components/tests/ChartGroupTestHarness.svelte'; +import LineChart from '../components/charts/LineChart/LineChart.svelte'; +import ChartCanvas from '../components/Chart/Chart.canvas.svelte'; +import ChartHtml from '../components/Chart/Chart.html.svelte'; +import { ChartGroupState } from './group.svelte.js'; +import type { ChartState } from './chart.svelte.js'; + +/** Daily data — the "detail" chart */ +const dataA = [ + { date: new Date('2024-01-01'), value: 10 }, + { date: new Date('2024-01-02'), value: 30 }, + { date: new Date('2024-01-03'), value: 20 }, + { date: new Date('2024-01-04'), value: 50 }, +]; + +/** Same dates, different values and a different length — the "overview" chart */ +const dataB = [ + { date: new Date('2024-01-01'), value: 100 }, + { date: new Date('2024-01-03'), value: 300 }, + { date: new Date('2024-01-04'), value: 200 }, +]; + +const chartProps = (data: any[]) => ({ + data, + x: 'date', + y: 'value', + tooltipContext: { mode: 'bisect-x' as const }, +}); + +/** Render two charts joined to a group, resolving once both contexts are ready */ +async function renderPair( + options: { + pointer?: any; + useContext?: boolean; + memberOptions?: Array; + dataFor?: Array; + /** Extra `Chart` props, per member */ + propsFor?: Array>; + } = {} +) { + const [a, b] = options.dataFor ?? [dataA, dataB]; + const group = options.useContext ? undefined : new ChartGroupState({ pointer: options.pointer }); + const contexts: ChartState[] = []; + let contextGroup: ChartGroupState = null!; + + render(ChartGroupTestHarness, { + group, + useContext: options.useContext, + pointer: options.pointer, + members: [ + { + chartProps: { ...chartProps(a), ...options.propsFor?.[0] }, + groupOptions: options.memberOptions?.[0], + }, + { + chartProps: { ...chartProps(b), ...options.propsFor?.[1] }, + groupOptions: options.memberOptions?.[1], + }, + ], + oncontext: (ctx: any, i: number) => (contexts[i] = ctx), + ongroup: (g: any) => (contextGroup = g), + }); + + await vi.waitFor(() => { + expect(contexts[0]?.width).toBeGreaterThan(0); + expect(contexts[1]?.width).toBeGreaterThan(0); + }); + + return { chartA: contexts[0], chartB: contexts[1], group: group ?? contextGroup }; +} + +describe('ChartGroupState', () => { + describe('membership', () => { + it('warns when two charts join with the same id', async () => { + const warn = vi.spyOn(console, 'warn').mockImplementation(() => {}); + + await renderPair({ propsFor: [{ id: 'shared' }, { id: 'shared' }] }); + + await vi.waitFor(() => { + expect(warn).toHaveBeenCalledWith(expect.stringContaining('id "shared"')); + }); + warn.mockRestore(); + }); + + it('stays quiet when the ids differ', async () => { + const warn = vi.spyOn(console, 'warn').mockImplementation(() => {}); + + await renderPair({ propsFor: [{ id: 'a' }, { id: 'b' }] }); + + expect(warn).not.toHaveBeenCalled(); + warn.mockRestore(); + }); + }); + + describe('pointer sharing', () => { + it('shows the matching data point on the other chart', async () => { + const { chartA, chartB } = await renderPair(); + + chartA.tooltip.show({ data: dataA[3] }); // 2024-01-04 + + await vi.waitFor(() => { + // chart B resolves the same *date* against its own (shorter) data + expect(chartB.tooltip.data).toEqual(dataB[2]); + }); + }); + + it('lands in the right panel when the follower is faceted', async () => { + // §3.6 of the research: a faceted chart is one member with one id, so the group needs no + // facet awareness — but the follower has to place the shared row in its own panel + const faceted = [ + { g: 'x', date: new Date('2024-01-01'), value: 100 }, + { g: 'x', date: new Date('2024-01-04'), value: 200 }, + { g: 'y', date: new Date('2024-01-01'), value: 300 }, + { g: 'y', date: new Date('2024-01-04'), value: 400 }, + ]; + const { chartA, chartB } = await renderPair({ + dataFor: [dataA, faceted], + propsFor: [{}, { fx: 'g' }], + }); + + expect(chartB.facet.panels.length).toBe(2); + + chartA.tooltip.show({ data: dataA[3] }); // 2024-01-04 + + await vi.waitFor(() => { + // the nearest row by date, and positioned in whichever panel holds it + const panel = chartB.facet.panels.find((p: any) => p.has(chartB.tooltip.data)); + expect(panel).toBeDefined(); + // `tooltip.x` is container-relative, so the panel's offset carries the chart's padding + const left = panel!.x + chartB.padding.left; + expect(chartB.tooltip.x).toBeGreaterThanOrEqual(left); + expect(chartB.tooltip.x).toBeLessThanOrEqual(left + panel!.width); + }); + }); + + it('resolves the nearest point when the other chart lacks that value', async () => { + const { chartA, chartB } = await renderPair(); + + chartA.tooltip.show({ data: dataA[1] }); // 2024-01-02, absent from dataB + + await vi.waitFor(() => { + expect(chartB.tooltip.data).toEqual(dataB[0]); // nearest is 2024-01-01 + }); + }); + + it('marks the follower tooltip with the publishing chart as its source', async () => { + const { chartA, chartB } = await renderPair(); + + chartA.tooltip.show({ data: dataA[0] }); + + await vi.waitFor(() => { + expect(chartB.tooltip.source).toBe(chartA.id); + }); + expect(chartA.tooltip.source).toBe(chartA.id); // its own pointer drove it + }); + + it('does not echo back and overwrite the publisher', async () => { + const { chartA, chartB, group } = await renderPair(); + + chartA.tooltip.show({ data: dataA[1] }); // only exists in dataA + + await vi.waitFor(() => { + expect(chartB.tooltip.data).toEqual(dataB[0]); + }); + + // Settle any further effect passes, then confirm the publisher still holds its own point + // and still owns the group pointer + await new Promise((resolve) => setTimeout(resolve, 50)); + expect(chartA.tooltip.data).toEqual(dataA[1]); + expect(group.pointer.source).toBe(chartA.id); + expect(group.pointer.data).toEqual(dataA[1]); + }); + + it('clears the other chart when the pointer leaves', async () => { + const { chartA, chartB } = await renderPair(); + + chartA.tooltip.show({ data: dataA[0] }); + await vi.waitFor(() => expect(chartB.tooltip.data).not.toBeNull()); + + chartA.tooltip.hide(); + + await vi.waitFor(() => { + expect(chartA.tooltip.data).toBeNull(); + expect(chartB.tooltip.data).toBeNull(); + }); + }); + + it('lets either chart drive after the first releases', async () => { + const { chartA, chartB, group } = await renderPair(); + + chartA.tooltip.show({ data: dataA[0] }); + await vi.waitFor(() => expect(chartB.tooltip.data).toEqual(dataB[0])); + + chartA.tooltip.hide(); + await vi.waitFor(() => expect(chartB.tooltip.data).toBeNull()); + + // now B drives A + chartB.tooltip.show({ data: dataB[1] }); // 2024-01-03 + await vi.waitFor(() => { + expect(group.pointer.source).toBe(chartB.id); + expect(chartA.tooltip.data).toEqual(dataA[2]); + }); + }); + }); + + describe('simplified charts', () => { + it('forward `group` through to the underlying Chart', async () => { + // `LineChart` spreads rest props onto `Chart`, and defaults to `quadtree-x` — a mode with + // no value-based equivalent, so this also covers the bisect fallback end to end + const group = new ChartGroupState(); + const contexts: ChartState[] = []; + + render(ChartGroupTestHarness, { + group, + component: LineChart, + members: [ + { chartProps: { data: dataA, x: 'date', y: 'value' } }, + { chartProps: { data: dataB, x: 'date', y: 'value' } }, + ], + oncontext: (ctx: any, i: number) => (contexts[i] = ctx), + }); + + await vi.waitFor(() => expect(contexts[1]?.width).toBeGreaterThan(0)); + + contexts[0].tooltip.show({ data: dataA[3] }); // 2024-01-04 + + await vi.waitFor(() => { + expect(contexts[1].tooltip.data).toEqual(dataB[2]); + }); + }); + }); + + describe('match', () => { + it('`index` uses position rather than value', async () => { + const { chartA, chartB } = await renderPair({ pointer: { match: 'index' } }); + + chartA.tooltip.show({ data: dataA[2] }); // index 2 + + await vi.waitFor(() => { + expect(chartB.tooltip.data).toEqual(dataB[2]); // index 2, a different date + }); + }); + + it('`percent` uses relative position within the plot area', async () => { + // domains are deliberately unrelated — only the relative position carries over + const early = [ + { date: new Date('2024-01-01'), value: 1 }, + { date: new Date('2024-01-02'), value: 2 }, + { date: new Date('2024-01-03'), value: 3 }, + ]; + const late = [ + { date: new Date('2030-06-01'), value: 1 }, + { date: new Date('2030-06-02'), value: 2 }, + { date: new Date('2030-06-03'), value: 3 }, + ]; + const { chartA, chartB } = await renderPair({ + pointer: { match: 'percent' }, + dataFor: [early, late], + }); + + chartA.tooltip.show({ data: early[2] }); // 100% along its domain + + await vi.waitFor(() => { + expect(chartB.tooltip.data).toEqual(late[2]); // 100% along a totally different domain + }); + }); + + it('`value` finds nothing useful across unrelated domains', async () => { + // the contrast with `percent` above — nearest-by-value clamps to an edge + const early = [ + { date: new Date('2024-01-01'), value: 1 }, + { date: new Date('2024-01-03'), value: 3 }, + ]; + const late = [ + { date: new Date('2030-06-01'), value: 1 }, + { date: new Date('2030-06-03'), value: 3 }, + ]; + const { chartA, chartB } = await renderPair({ dataFor: [early, late] }); + + chartA.tooltip.show({ data: early[1] }); + + await vi.waitFor(() => { + expect(chartB.tooltip.data).toEqual(late[0]); // clamped to the first point + }); + }); + + it('accepts a custom resolver', async () => { + const { chartA, chartB } = await renderPair({ + pointer: { match: () => dataB[1] }, + }); + + chartA.tooltip.show({ data: dataA[0] }); + + await vi.waitFor(() => { + expect(chartB.tooltip.data).toEqual(dataB[1]); + }); + }); + }); + + describe('pointer: { tooltip: false }', () => { + it('suppresses tooltip content on followers but not the publisher', async () => { + const { chartA, chartB } = await renderPair({ pointer: { tooltip: false } }); + + chartA.tooltip.show({ data: dataA[0] }); + + await vi.waitFor(() => { + // data is still set so `Highlight` still renders + expect(chartB.tooltip.data).toEqual(dataB[0]); + }); + expect(chartB.tooltip.suppressed).toBe(true); + expect(chartA.tooltip.suppressed).toBe(false); + }); + }); + + describe('publish / subscribe filters', () => { + it('a listen-only chart does not publish', async () => { + const { chartA, chartB, group } = await renderPair({ + memberOptions: [{ publish: false }, undefined], + }); + + chartA.tooltip.show({ data: dataA[0] }); + + await new Promise((resolve) => setTimeout(resolve, 50)); + expect(group.pointer.active).toBe(false); + expect(chartB.tooltip.data).toBeNull(); + }); + + it('a broadcast-only chart does not subscribe', async () => { + const { chartA, chartB } = await renderPair({ + memberOptions: [undefined, { subscribe: false }], + }); + + chartA.tooltip.show({ data: dataA[0] }); + + await new Promise((resolve) => setTimeout(resolve, 50)); + expect(chartB.tooltip.data).toBeNull(); + }); + }); + + describe('pointer: false', () => { + it('does not share the pointer', async () => { + const { chartA, chartB } = await renderPair({ pointer: false }); + + chartA.tooltip.show({ data: dataA[0] }); + + await new Promise((resolve) => setTimeout(resolve, 50)); + expect(chartB.tooltip.data).toBeNull(); + }); + }); + + describe(' context', () => { + it('joins charts without an explicit `group` prop', async () => { + const { chartA, chartB } = await renderPair({ useContext: true }); + + chartA.tooltip.show({ data: dataA[3] }); + + await vi.waitFor(() => { + expect(chartB.tooltip.data).toEqual(dataB[2]); + }); + }); + }); + + describe('standalone usage', () => { + it('exposes the pointer as plain reactive state for non-chart consumers', async () => { + const { chartA, group } = await renderPair(); + + chartA.tooltip.show({ data: dataA[1] }); + + await vi.waitFor(() => { + expect(group.pointer.active).toBe(true); + expect(group.pointer.x).toEqual(dataA[1].date); + expect(group.pointer.y).toBe(30); + expect(group.pointer.index).toBe(1); + }); + }); + + it('drives charts when written to directly', async () => { + const { chartA, chartB, group } = await renderPair(); + + // no chart involved — as a table row or scrubber would do + group.setPointer({ x: new Date('2024-01-03') }); + + await vi.waitFor(() => { + expect(chartA.tooltip.data).toEqual(dataA[2]); + expect(chartB.tooltip.data).toEqual(dataB[1]); + }); + }); + + it('tracks successive external positions that carry no data point', async () => { + const { chartA, group } = await renderPair(); + + group.setPointer({ x: new Date('2024-01-01') }); + await vi.waitFor(() => expect(chartA.tooltip.data).toEqual(dataA[0])); + + // `data` is null for both updates, so identity alone would treat this as unchanged + group.setPointer({ x: new Date('2024-01-04') }); + await vi.waitFor(() => expect(chartA.tooltip.data).toEqual(dataA[3])); + }); + }); +}); + +describe('regression', () => { + it('survives the pointer moving between charts without a hide in between', async () => { + // A real pointer entering chart B fires before chart A's (async) hide completes, so both + // charts briefly hold data. Driving `show` on each in turn reproduces that overlap. + const { chartA, chartB, group } = await renderPair(); + + chartA.tooltip.show({ data: dataA[1] }); + await vi.waitFor(() => expect(chartB.tooltip.data).not.toBeNull()); + + chartA.tooltip.hide(); // pointer leaves A — clears on a later tick + chartB.tooltip.show({ data: dataB[2] }); // ...but B is entered immediately + + await new Promise((resolve) => setTimeout(resolve, 300)); + + expect(group.pointer.source).toBe(chartB.id); + expect(chartB.tooltip.data).toEqual(dataB[2]); + expect(chartA.tooltip.data).toEqual(dataA[3]); // A follows B's date (2024-01-04) + }); +}); + +describe('brush slice', () => { + /** Two charts with (non-zooming) brushes joined to a group */ + async function renderBrushPair(options: { brush?: any; memberOptions?: any[] } = {}) { + const group = new ChartGroupState({ brush: options.brush }); + const contexts: ChartState[] = []; + + render(ChartGroupTestHarness, { + group, + members: [ + { chartProps: { ...chartProps(dataA), brush: true }, groupOptions: options.memberOptions?.[0] }, // prettier-ignore + { chartProps: { ...chartProps(dataB), brush: true }, groupOptions: options.memberOptions?.[1] }, // prettier-ignore + ], + oncontext: (ctx: any, i: number) => (contexts[i] = ctx), + }); + + await vi.waitFor(() => { + expect(contexts[0]?.brushState).toBeTruthy(); + expect(contexts[1]?.brushState).toBeTruthy(); + }); + + return { chartA: contexts[0], chartB: contexts[1], group }; + } + + const range = [new Date('2024-01-02'), new Date('2024-01-04')]; + + it('applies a published selection to the other chart', async () => { + const { chartB, group } = await renderBrushPair(); + + group.setBrush({ x: range }); + + await vi.waitFor(() => { + expect(chartB.brush.x[0]).toEqual(range[0]); + expect(chartB.brush.x[1]).toEqual(range[1]); + expect(chartB.brush.active).toBe(true); + }); + }); + + it('clears the other chart when the selection is cleared', async () => { + const { chartB, group } = await renderBrushPair(); + + group.setBrush({ x: range }); + await vi.waitFor(() => expect(chartB.brush.active).toBe(true)); + + group.clearBrush(); + + await vi.waitFor(() => { + expect(chartB.brush.active).toBe(false); + expect(chartB.brush.x).toEqual([null, null]); + }); + }); + + it('does not apply a chart its own selection back', async () => { + const { chartA, group } = await renderBrushPair(); + + // as though chart A had published from a gesture + group.setBrush({ x: range, source: chartA.id }); + + await new Promise((resolve) => setTimeout(resolve, 100)); + // A never had a local selection, and must not be given one by its own publish + expect(chartA.brush.active).toBeFalsy(); + expect(group.pointer.active).toBe(false); + }); + + it('lets a chart clear a selection it did not make', async () => { + const { chartA, chartB, group } = await renderBrushPair(); + + // published by neither chart, so both apply it and both are observable followers + group.setBrush({ x: range, source: Symbol('elsewhere') }); + await vi.waitFor(() => { + expect(chartA.brush.active).toBe(true); + expect(chartB.brush.active).toBe(true); + }); + + // chart B clicking to reset must clear the group rather than be ignored for not owning it + group.clearBrush(chartB.id); + + await vi.waitFor(() => { + expect(group.brush.active).toBe(false); + // A follows; B already reset itself as part of the gesture, so it skips its own update + expect(chartA.brush.active).toBe(false); + }); + }); + + /** + * The gesture path, rather than driving the group state directly — a chart publishes what its + * own brush reports, so a selection that only ever reaches `onBrushEnd` never reaches the group. + */ + describe('publishing from a gesture', () => { + /** Drag across an element, or click it when `to` matches `from` */ + function pointerRun(el: Element, from: number, to: number, y: number) { + const types: Array<[string, number]> = + from === to + ? [ + ['pointerdown', from], + ['pointerup', to], + ] + : [ + ['pointerdown', from], + ['pointermove', to], + ['pointerup', to], + ]; + for (const [type, clientX] of types) { + el.dispatchEvent(new PointerEvent(type, { clientX, clientY: y, bubbles: true })); + } + } + + async function firstBrushEl() { + let el: HTMLElement | null = null; + await vi.waitFor(() => { + el = document.querySelectorAll('.lc-brush-context')[0] as HTMLElement; + expect(el).toBeTruthy(); + }); + return el!; + } + + it('shares a selection dragged in one chart', async () => { + const { chartA, chartB } = await renderBrushPair(); + const el = await firstBrushEl(); + const rect = el.getBoundingClientRect(); + const y = rect.top + rect.height / 2; + + pointerRun(el, rect.left + rect.width * 0.3, rect.left + rect.width * 0.6, y); + + await vi.waitFor(() => { + expect(chartA.brush.active).toBe(true); + expect(chartB.brush.active).toBe(true); + }); + }); + + it('shares the clearing when that chart is clicked', async () => { + const { chartA, chartB, group } = await renderBrushPair(); + const el = await firstBrushEl(); + const rect = el.getBoundingClientRect(); + const y = rect.top + rect.height / 2; + + pointerRun(el, rect.left + rect.width * 0.3, rect.left + rect.width * 0.6, y); + await vi.waitFor(() => expect(chartB.brush.active).toBe(true)); + + // A click never moves the pointer, so the clear is only reported because the gesture says so + const x = rect.left + rect.width * 0.05; + pointerRun(el, x, x, y); + + await vi.waitFor(() => { + expect(chartA.brush.active).toBeFalsy(); + expect(group.brush.active).toBe(false); + expect(chartB.brush.active).toBeFalsy(); + }); + }); + }); + + it('respects `subscribe: false`', async () => { + const { chartB, group } = await renderBrushPair({ + memberOptions: [undefined, { subscribe: false }], + }); + + group.setBrush({ x: range }); + + await new Promise((resolve) => setTimeout(resolve, 100)); + expect(chartB.brush.active).toBeFalsy(); + }); + + it('does not share the selection when `brush: false`', async () => { + const { chartB, group } = await renderBrushPair({ brush: false }); + + group.setBrush({ x: range }); + + await new Promise((resolve) => setTimeout(resolve, 100)); + expect(chartB.brush.active).toBeFalsy(); + }); + + describe('contains', () => { + it('answers for the current selection, for a chart reading it without a brush', () => { + const group = new ChartGroupState(); + group.setBrush({ x: range }); + + expect(group.brush.contains({ x: new Date('2024-01-03') })).toBe(true); + expect(group.brush.contains({ x: new Date('2024-01-05') })).toBe(false); + }); + + it('constrains only the axes with a selection', () => { + const group = new ChartGroupState(); + group.setBrush({ x: range }); + + // `y` was never selected, so it can't exclude a point that is within `x` + expect(group.brush.contains({ x: new Date('2024-01-03'), y: 1_000_000 })).toBe(true); + }); + + it('contains everything before a selection is made, and again once cleared', () => { + const group = new ChartGroupState(); + expect(group.brush.contains({ x: new Date('2024-01-05') })).toBe(true); + + group.setBrush({ x: range }); + expect(group.brush.contains({ x: new Date('2024-01-05') })).toBe(false); + + group.clearBrush(); + expect(group.brush.contains({ x: new Date('2024-01-05') })).toBe(true); + }); + + it('is bound to its own selection rather than to whatever object it is called on', () => { + const group = new ChartGroupState(); + group.setBrush({ x: range }); + + // Consumers destructure and spread the slice; either would silently answer for the wrong + // selection if `contains` resolved `this` + const { contains } = group.brush; + expect(contains({ x: new Date('2024-01-03') })).toBe(true); + expect(contains({ x: new Date('2024-01-05') })).toBe(false); + }); + }); +}); + +describe('domain slice', () => { + const zoomTo = [new Date('2024-01-02'), new Date('2024-01-04')]; + + async function renderDomainPair(options: { domain?: any; memberOptions?: any[] } = {}) { + const group = new ChartGroupState({ domain: options.domain }); + const contexts: ChartState[] = []; + + render(ChartGroupTestHarness, { + group, + members: [ + { chartProps: chartProps(dataA), groupOptions: options.memberOptions?.[0] }, + { chartProps: chartProps(dataB), groupOptions: options.memberOptions?.[1] }, + ], + oncontext: (ctx: any, i: number) => (contexts[i] = ctx), + }); + + await vi.waitFor(() => expect(contexts[1]?.width).toBeGreaterThan(0)); + return { chartA: contexts[0], chartB: contexts[1], group }; + } + + it('zooms the other chart to a published domain', async () => { + const { chartB, group } = await renderDomainPair(); + + group.setDomain({ x: zoomTo }); + + await vi.waitFor(() => { + expect(chartB.xDomain[0]).toEqual(zoomTo[0]); + expect(chartB.xDomain[1]).toEqual(zoomTo[1]); + }); + }); + + it('returns to the natural extent when cleared', async () => { + const { chartB, group } = await renderDomainPair(); + + group.setDomain({ x: zoomTo }); + await vi.waitFor(() => expect(chartB.xDomain[0]).toEqual(zoomTo[0])); + + group.clearDomain(); + + await vi.waitFor(() => { + // back to the full extent of dataB + expect(chartB.xDomain[0]).toEqual(dataB[0].date); + expect(chartB.xDomain[1]).toEqual(dataB[dataB.length - 1].date); + }); + }); + + it('does not apply a chart its own published domain', async () => { + const { chartA, group } = await renderDomainPair(); + + group.setDomain({ x: zoomTo, source: chartA.id }); + + await new Promise((resolve) => setTimeout(resolve, 100)); + expect(chartA.xDomain[0]).toEqual(dataA[0].date); // untouched + }); + + it('lets a chart clear a domain it did not set', async () => { + const { chartA, chartB, group } = await renderDomainPair(); + + group.setDomain({ x: zoomTo, source: Symbol('elsewhere') }); + await vi.waitFor(() => { + expect(chartA.xDomain[0]).toEqual(zoomTo[0]); + expect(chartB.xDomain[0]).toEqual(zoomTo[0]); + }); + + group.clearDomain(chartB.id); + + await vi.waitFor(() => { + expect(group.domain.active).toBe(false); + expect(chartA.xDomain[0]).toEqual(dataA[0].date); + }); + }); + + it('respects `subscribe: false`', async () => { + const { chartB, group } = await renderDomainPair({ + memberOptions: [undefined, { subscribe: false }], + }); + + group.setDomain({ x: zoomTo }); + + await new Promise((resolve) => setTimeout(resolve, 100)); + expect(chartB.xDomain[0]).toEqual(dataB[0].date); + }); + + it('does not share when `domain: false`', async () => { + const { chartB, group } = await renderDomainPair({ domain: false }); + + group.setDomain({ x: zoomTo }); + + await new Promise((resolve) => setTimeout(resolve, 100)); + expect(chartB.xDomain[0]).toEqual(dataB[0].date); + }); + + it('lets an explicit `xDomain` prop win over the shared domain', async () => { + const explicit = [new Date('2024-01-01'), new Date('2024-01-03')]; + const group = new ChartGroupState(); + const contexts: ChartState[] = []; + + render(ChartGroupTestHarness, { + group, + members: [ + { chartProps: chartProps(dataA) }, + { chartProps: { ...chartProps(dataB), xDomain: explicit } }, + ], + oncontext: (ctx: any, i: number) => (contexts[i] = ctx), + }); + await vi.waitFor(() => expect(contexts[1]?.width).toBeGreaterThan(0)); + + group.setDomain({ x: zoomTo }); + + await new Promise((resolve) => setTimeout(resolve, 100)); + expect(contexts[1].xDomain[0]).toEqual(explicit[0]); + expect(contexts[1].xDomain[1]).toEqual(explicit[1]); + }); + + it('supersedes a stale local zoom, so the most recent interaction wins', async () => { + const { chartA, chartB, group } = await renderDomainPair(); + + // chart A zoomed itself earlier (what `zoomOnBrush` does) + chartA.brushXDomain = [new Date('2024-01-03'), new Date('2024-01-04')]; + await vi.waitFor(() => expect(chartA.xDomain[0]).toEqual(new Date('2024-01-03'))); + + // ...then another chart publishes a domain — A must follow it rather than stay pinned + group.setDomain({ x: zoomTo, source: chartB.id }); + + await vi.waitFor(() => { + expect(chartA.brushXDomain).toBeUndefined(); + expect(chartA.xDomain[0]).toEqual(zoomTo[0]); + }); + }); +}); + +describe('series slice', () => { + const seriesData = [ + { date: new Date('2024-01-01'), apples: 10, bananas: 5, grapes: 1 }, + { date: new Date('2024-01-02'), apples: 30, bananas: 15, grapes: 3 }, + ]; + + const seriesChartProps = (keys: string[]) => ({ + data: seriesData, + x: 'date', + series: keys.map((key) => ({ key, value: key })), + }); + + /** Two charts with explicit series joined to a group */ + async function renderSeriesPair( + options: { series?: any; memberOptions?: any[]; keysFor?: string[][] } = {} + ) { + const [a, b] = options.keysFor ?? [ + ['apples', 'bananas'], + ['apples', 'bananas'], + ]; + const group = new ChartGroupState({ series: options.series }); + const contexts: ChartState[] = []; + + render(ChartGroupTestHarness, { + group, + members: [ + { chartProps: seriesChartProps(a), groupOptions: options.memberOptions?.[0] }, + { chartProps: seriesChartProps(b), groupOptions: options.memberOptions?.[1] }, + ], + oncontext: (ctx: any, i: number) => (contexts[i] = ctx), + }); + + await vi.waitFor(() => { + expect(contexts[0]?.series.series).toHaveLength(a.length); + expect(contexts[1]?.series.series).toHaveLength(b.length); + }); + + return { chartA: contexts[0], chartB: contexts[1], group }; + } + + describe('highlight', () => { + it('highlights the same series on the other chart', async () => { + const { chartA, chartB, group } = await renderSeriesPair(); + + chartA.series.highlightKey = 'bananas'; + + await vi.waitFor(() => expect(chartB.series.highlightKey).toBe('bananas')); + expect(chartB.series.isHighlighted('bananas')).toBe(true); + expect(chartB.series.isHighlighted('apples')).toBe(false); + expect(group.series.highlightSource).toBe(chartA.id); + }); + + it('clears the other chart when the highlight is released', async () => { + const { chartA, chartB } = await renderSeriesPair(); + + chartA.series.highlightKey = 'bananas'; + await vi.waitFor(() => expect(chartB.series.highlightKey).toBe('bananas')); + + chartA.series.highlightKey = null; + + await vi.waitFor(() => expect(chartB.series.highlightKey).toBe(null)); + }); + + it('does not echo an applied highlight back out', async () => { + const { chartA, chartB, group } = await renderSeriesPair(); + + chartA.series.highlightKey = 'apples'; + await vi.waitFor(() => expect(chartB.series.highlightKey).toBe('apples')); + + // Settle any further effect passes — the publisher must still own the highlight, rather + // than the follower having re-published it as its own + await new Promise((resolve) => setTimeout(resolve, 50)); + expect(group.series.highlightSource).toBe(chartA.id); + expect(chartB.series.highlightSource).toBe(chartA.id); + expect(chartA.series.highlightSource).toBe(null); // its own interaction + }); + + it('ignores a stale clear from the chart the pointer left', async () => { + // Moving between two charts' legends: the entered chart may publish before the left one + // clears, and that clear must not wipe the highlight that just replaced it + const { chartA, chartB, group } = await renderSeriesPair(); + + chartA.series.highlightKey = 'apples'; + await vi.waitFor(() => expect(group.series.highlightSource).toBe(chartA.id)); + + chartB.series.highlightKey = 'bananas'; // entered B + chartA.series.highlightKey = null; // left A + + await vi.waitFor(() => expect(group.series.highlightSource).toBe(chartB.id)); + expect(group.series.highlightKey).toBe('bananas'); + await vi.waitFor(() => expect(chartA.series.highlightKey).toBe('bananas')); + }); + + it('takes ownership when the same series is entered on another chart', async () => { + // Same key on both, so nothing about the highlight *value* changes — only its owner, which + // is what decides whose release clears it + const { chartA, chartB, group } = await renderSeriesPair(); + + chartA.series.highlightKey = 'apples'; + await vi.waitFor(() => expect(chartB.series.highlightKey).toBe('apples')); + + chartB.series.highlightKey = 'apples'; // entered B's legend on the same series + chartA.series.highlightKey = null; // left A + + await vi.waitFor(() => expect(group.series.highlightSource).toBe(chartB.id)); + expect(group.series.highlightKey).toBe('apples'); + // and B releasing it does clear the group + chartB.series.highlightKey = null; + await vi.waitFor(() => expect(group.series.highlightKey).toBe(null)); + }); + + it('drives every chart when set on the group directly', async () => { + const { chartA, chartB, group } = await renderSeriesPair(); + + group.setHighlight('bananas'); + + await vi.waitFor(() => { + expect(chartA.series.highlightKey).toBe('bananas'); + expect(chartB.series.highlightKey).toBe('bananas'); + }); + // attributed to the group, so neither chart mistakes it for its own and re-publishes + expect(chartA.series.highlightSource).toBe(group.id); + }); + + it('does not share the highlight when `series: false`', async () => { + const { chartA, chartB } = await renderSeriesPair({ series: false }); + + chartA.series.highlightKey = 'bananas'; + + await new Promise((resolve) => setTimeout(resolve, 100)); + expect(chartB.series.highlightKey).toBe(null); + }); + + it('does not share the highlight when `series: { highlight: false }`', async () => { + const { chartA, chartB } = await renderSeriesPair({ series: { highlight: false } }); + + chartA.series.highlightKey = 'bananas'; + + await new Promise((resolve) => setTimeout(resolve, 100)); + expect(chartB.series.highlightKey).toBe(null); + }); + }); + + describe('visibility keyed by `c`', () => { + // Long data, so the legend's items are `c` categories rather than series keys + const longData = [ + { date: new Date('2024-01-01'), fruit: 'apples', value: 10 }, + { date: new Date('2024-01-01'), fruit: 'bananas', value: 20 }, + { date: new Date('2024-01-02'), fruit: 'apples', value: 30 }, + { date: new Date('2024-01-02'), fruit: 'bananas', value: 40 }, + ]; + + async function renderCategoryPair() { + const group = new ChartGroupState(); + const contexts: ChartState[] = []; + const props = { data: longData, x: 'date', y: 'value', c: 'fruit' }; + + render(ChartGroupTestHarness, { + group, + members: [{ chartProps: props }, { chartProps: props }], + oncontext: (ctx: any, i: number) => (contexts[i] = ctx), + } as any); + + await vi.waitFor(() => { + expect(contexts[0]).toBeDefined(); + expect(contexts[1]).toBeDefined(); + }); + return { chartA: contexts[0], chartB: contexts[1], group }; + } + + it('should share a hidden category with the other chart', async () => { + const { chartA, chartB, group } = await renderCategoryPair(); + + chartA.series.selectedKeys.current = ['apples']; // hides bananas + + await vi.waitFor(() => expect(group.series.hiddenKeys).toEqual(['bananas'])); + expect(chartB.series.selectedKeys.current).toEqual(['apples']); + }); + + it('should leave the selection alone when the group hides nothing', async () => { + const { chartA } = await renderCategoryPair(); + + chartA.series.selectedKeys.current = ['apples']; + + // The subscribe effect reads the chart's own keys; with none of them hidden it must not + // read that as "everything visible" and clear what the legend selected + await new Promise((resolve) => setTimeout(resolve, 100)); + expect(chartA.series.selectedKeys.current).toEqual(['apples']); + }); + }); + + describe('visibility', () => { + it('hides the same series on the other chart', async () => { + const { chartA, chartB, group } = await renderSeriesPair(); + + chartA.series.selectedKeys.current = ['apples']; // hides bananas + + await vi.waitFor(() => expect(chartB.series.isVisible('bananas')).toBe(false)); + expect(chartB.series.isVisible('apples')).toBe(true); + expect(group.series.hiddenKeys).toEqual(['bananas']); + expect(group.series.visibilitySource).toBe(chartA.id); + }); + + it('shows it again when unhidden', async () => { + const { chartA, chartB, group } = await renderSeriesPair(); + + chartA.series.selectedKeys.current = ['apples']; + await vi.waitFor(() => expect(chartB.series.isVisible('bananas')).toBe(false)); + + chartA.series.selectedKeys.current = []; + + await vi.waitFor(() => expect(chartB.series.isVisible('bananas')).toBe(true)); + expect(group.series.hiddenKeys).toEqual([]); + }); + + it('leaves a chart alone when it does not have the hidden series', async () => { + const { chartA, chartB, group } = await renderSeriesPair({ + keysFor: [ + ['apples', 'bananas'], + ['apples', 'grapes'], + ], + }); + + chartA.series.selectedKeys.current = ['apples']; // hides bananas, which B lacks + + await new Promise((resolve) => setTimeout(resolve, 100)); + expect(chartB.series.isVisible('apples')).toBe(true); + expect(chartB.series.isVisible('grapes')).toBe(true); + // and B reporting nothing hidden must not unhide bananas for A + expect(group.series.hiddenKeys).toEqual(['bananas']); + expect(chartA.series.isVisible('bananas')).toBe(false); + }); + + it('keeps each chart owning only its own series', async () => { + const { chartA, chartB, group } = await renderSeriesPair({ + keysFor: [ + ['apples', 'bananas'], + ['apples', 'grapes'], + ], + }); + + chartA.series.selectedKeys.current = ['apples']; // A hides bananas + await vi.waitFor(() => expect(group.series.hiddenKeys).toEqual(['bananas'])); + + chartB.series.selectedKeys.current = ['apples']; // B hides grapes + + await vi.waitFor(() => expect(group.series.hiddenKeys).toContain('grapes')); + expect(group.series.hiddenKeys).toContain('bananas'); + expect(chartA.series.isVisible('bananas')).toBe(false); + expect(chartB.series.isVisible('grapes')).toBe(false); + }); + + it('hides across the group when set on the group directly', async () => { + const { chartA, chartB, group } = await renderSeriesPair(); + + group.setHidden(['apples']); + + await vi.waitFor(() => { + expect(chartA.series.isVisible('apples')).toBe(false); + expect(chartB.series.isVisible('apples')).toBe(false); + }); + expect(chartA.series.visibleSeries.map((s) => s.key)).toEqual(['bananas']); + }); + + it('shows everything again when cleared', async () => { + const { chartA, chartB, group } = await renderSeriesPair(); + + group.setHidden(['apples']); + await vi.waitFor(() => expect(chartB.series.isVisible('apples')).toBe(false)); + + group.clearHidden(); + + await vi.waitFor(() => { + expect(chartA.series.isVisible('apples')).toBe(true); + expect(chartB.series.isVisible('apples')).toBe(true); + }); + expect(group.series.hiddenKeys).toEqual([]); + }); + + it('does not share visibility when `series: { visibility: false }`', async () => { + const { chartA, chartB } = await renderSeriesPair({ series: { visibility: false } }); + + chartA.series.selectedKeys.current = ['apples']; + + await new Promise((resolve) => setTimeout(resolve, 100)); + expect(chartB.series.isVisible('bananas')).toBe(true); + }); + }); + + describe('publish / subscribe filters', () => { + it('a listen-only chart does not publish', async () => { + const { chartA, chartB, group } = await renderSeriesPair({ + memberOptions: [{ publish: false }, undefined], + }); + + chartA.series.highlightKey = 'bananas'; + chartA.series.selectedKeys.current = ['apples']; + + await new Promise((resolve) => setTimeout(resolve, 100)); + expect(group.series.highlightKey).toBe(null); + expect(group.series.hiddenKeys).toEqual([]); + expect(chartB.series.highlightKey).toBe(null); + }); + + it('a broadcast-only chart does not subscribe', async () => { + const { chartB, group } = await renderSeriesPair({ + memberOptions: [undefined, { subscribe: false }], + }); + + group.setHighlight('bananas'); + group.setHidden(['apples']); + + await new Promise((resolve) => setTimeout(resolve, 100)); + expect(chartB.series.highlightKey).toBe(null); + expect(chartB.series.isVisible('apples')).toBe(true); + }); + + it('shares series without the pointer when named in `publish`', async () => { + const { chartA, chartB, group } = await renderSeriesPair({ + memberOptions: [{ publish: ['series'] }, undefined], + }); + + chartA.tooltip.show({ data: seriesData[0] }); + chartA.series.highlightKey = 'bananas'; + + await vi.waitFor(() => expect(chartB.series.highlightKey).toBe('bananas')); + expect(group.pointer.active).toBe(false); + }); + }); +}); + +describe(' options', () => { + it('forwards every slice option, not just `pointer`', async () => { + let group: ChartGroupState = null!; + + render(ChartGroupTestHarness, { + useContext: true, + pointer: { axis: 'both' }, + brush: { axis: 'both' }, + domain: { axis: 'both' }, + series: { highlight: false }, + members: [{ chartProps: chartProps(dataA) }], + ongroup: (g: any) => (group = g), + }); + + await vi.waitFor(() => expect(group).toBeTruthy()); + + expect(group.pointerOptions?.axis).toBe('both'); + expect(group.brushOptions?.axis).toBe('both'); + expect(group.domainOptions?.axis).toBe('both'); + expect(group.seriesOptions).toEqual({ highlight: false, visibility: true }); + }); + + it('opens with the selection the group was given', async () => { + // A member's own initial brush is overwritten by the group's, so seeding it here is what + // opens a synced set already brushed + let group: any; + render(ChartGroupTestHarness, { + useContext: true, + brush: { x: [new Date('2024-01-02'), new Date('2024-01-04')] }, + members: [{ chartProps: chartProps(dataA) }], + ongroup: (g: any) => (group = g), + }); + + await vi.waitFor(() => expect(group).toBeTruthy()); + + expect(group.brush.active).toBe(true); + expect(group.brush.x).toEqual([new Date('2024-01-02'), new Date('2024-01-04')]); + // and the selection is what members read to narrow their domain + expect(group.brush.contains({ x: new Date('2024-01-03') })).toBe(true); + expect(group.brush.contains({ x: new Date('2024-01-09') })).toBe(false); + }); + + it('stays inactive when the group is given no selection', async () => { + let group: any; + render(ChartGroupTestHarness, { + useContext: true, + brush: { axis: 'x' }, + members: [{ chartProps: chartProps(dataA) }], + ongroup: (g: any) => (group = g), + }); + + await vi.waitFor(() => expect(group).toBeTruthy()); + expect(group.brush.active).toBe(false); + }); +}); + +describe('layers', () => { + // the group works off chart state and accessors, so it should not be svg-specific + for (const [name, component] of [ + ['canvas', ChartCanvas], + ['html', ChartHtml], + ] as const) { + it(`syncs the pointer on ${name} charts`, async () => { + const group = new ChartGroupState(); + const contexts: ChartState[] = []; + + render(ChartGroupTestHarness, { + group, + component, + members: [{ chartProps: chartProps(dataA) }, { chartProps: chartProps(dataB) }], + oncontext: (ctx: any, i: number) => (contexts[i] = ctx), + }); + await vi.waitFor(() => expect(contexts[1]?.width).toBeGreaterThan(0)); + + contexts[0].tooltip.show({ data: dataA[3] }); + await vi.waitFor(() => expect(contexts[1].tooltip.data).toEqual(dataB[2])); + }); + } +}); + +describe('lifecycle', () => { + it('releases what a chart owns when it unmounts', async () => { + // A chart removed while hovering — route change, tab switch, conditional block — must not + // leave the group holding its pointer. It would also wedge it: only the owner may clear. + const group = new ChartGroupState(); + const contexts: ChartState[] = []; + + const { unmount } = render(ChartGroupTestHarness, { + group, + members: [{ chartProps: chartProps(dataA) }, { chartProps: chartProps(dataB) }], + oncontext: (ctx: any, i: number) => (contexts[i] = ctx), + }); + await vi.waitFor(() => expect(contexts[1]?.width).toBeGreaterThan(0)); + + contexts[0].tooltip.show({ data: dataA[1] }); + group.setBrush({ x: [dataA[0].date, dataA[2].date], source: contexts[0].id }); + group.setDomain({ x: [dataA[0].date, dataA[2].date], source: contexts[0].id }); + group.setHighlight('value', contexts[0].id); + await vi.waitFor(() => expect(group.pointer.active).toBe(true)); + + unmount(); + await new Promise((resolve) => setTimeout(resolve, 150)); + + expect(group.pointer.active).toBe(false); + expect(group.brush.active).toBe(false); + expect(group.domain.active).toBe(false); + expect(group.series.highlightKey).toBe(null); + }); + + it('keeps hidden series hidden when the chart that hid them unmounts', async () => { + // Hidden keys describe series rather than the chart that hid them — other members may still + // be showing the same ones hidden, and unhiding those would be the surprise + const group = new ChartGroupState(); + const contexts: ChartState[] = []; + + const { unmount } = render(ChartGroupTestHarness, { + group, + members: [{ chartProps: chartProps(dataA) }], + oncontext: (ctx: any, i: number) => (contexts[i] = ctx), + }); + await vi.waitFor(() => expect(contexts[0]?.width).toBeGreaterThan(0)); + + group.setHidden(['bananas'], contexts[0].id); + + unmount(); + await new Promise((resolve) => setTimeout(resolve, 150)); + + expect(group.series.hiddenKeys).toEqual(['bananas']); + }); +}); diff --git a/packages/layerchart/src/lib/states/group.svelte.ts b/packages/layerchart/src/lib/states/group.svelte.ts new file mode 100644 index 0000000000..aee3001dd0 --- /dev/null +++ b/packages/layerchart/src/lib/states/group.svelte.ts @@ -0,0 +1,1013 @@ +import { untrack } from 'svelte'; +import { max, min } from 'd3-array'; + +import type { ChartState } from './chart.svelte.js'; +import type { BrushDomainType } from './brush.svelte.js'; +import type { DomainType } from '$lib/utils/scales.svelte.js'; +import { findDatumByValue } from '$lib/utils/tooltip.js'; +import { isEqualValue } from '$lib/utils/common.js'; +import { isWithinSelection } from '$lib/utils/brush.js'; +import { scaleInvert, type AnyScale } from '$lib/utils/scales.svelte.js'; + +/** State slices that can be shared between charts in a group */ +export type ChartGroupSlice = 'pointer' | 'brush' | 'domain' | 'series'; + +/** + * How a published pointer is resolved to a data point on each subscribing chart. + * + * - `value` — the nearest data point to the published domain value. Works across charts with + * different data, sizes, and padding, and is the right default for most cases. + * - `index` — the data point at the same index. Exact and cheap, but requires the charts' data + * to be aligned. + * - `percent` — the same relative position within the plot area. For charts whose domains are + * unrelated but comparable in shape. + * - a function — resolve the data point yourself (ex. joining on an id). + */ +export type PointerMatch = + | 'value' + | 'index' + | 'percent' + | ((pointer: ChartGroupPointer, ctx: ChartState) => any); + +export type ChartGroupPointerOptions = { + /** + * How a published pointer is resolved on each subscriber + * @default 'value' + */ + match?: PointerMatch; + + /** + * Which axis the pointer is shared on + * @default 'x' + */ + axis?: 'x' | 'y' | 'both'; + + /** + * Show the tooltip on subscribing charts. Set `false` for a shared highlight without the + * tooltip content — the chart being hovered still shows its own tooltip. + * @default true + */ + tooltip?: boolean; +}; + +export type ChartGroupBrushOptions = { + /** + * Which axes of the selection are shared + * @default 'x' + */ + axis?: 'x' | 'y' | 'both'; + + /** + * The selection to start with, in domain values — the group's answer to a `Chart`'s + * `brush={{ x }}`. + * + * Members take their selection from the group, so a member's own initial brush is overwritten + * by the group's (empty) one; seeding it here is what opens a synced set already brushed. + */ + x?: BrushDomainType; + y?: BrushDomainType; +}; + +export type ChartGroupDomainOptions = { + /** + * Which axes of the visible domain are shared + * @default 'x' + */ + axis?: 'x' | 'y' | 'both'; +}; + +export type ChartGroupSeriesOptions = { + /** + * Share the highlighted series, ex. hovering a legend item fades the same series everywhere + * @default true + */ + highlight?: boolean; + + /** + * Share which series are visible, ex. toggling a legend item hides the same series everywhere + * @default true + */ + visibility?: boolean; +}; + +export type ChartGroupOptions = { + /** Share the hovered data point. Pass `false` to disable. */ + pointer?: ChartGroupPointerOptions | boolean; + + /** Share series highlight and visibility. Pass `false` to disable. */ + series?: ChartGroupSeriesOptions | boolean; + + /** Share the brush selection. Pass `false` to disable. */ + brush?: ChartGroupBrushOptions | boolean; + + /** + * Share the visible domain, so zooming one chart zooms the others. Pass `false` to disable. + * + * Published when a chart zooms to a brush selection (`zoomOnBrush`, the default on simplified + * charts). A chart's own `xDomain` / `yDomain` props still win over a shared domain. + */ + domain?: ChartGroupDomainOptions | boolean; +}; + +/** The shared visible domain */ +export type ChartGroupDomain = { + /** Visible `x` domain, or `undefined` for the chart's natural extent */ + x: DomainType | undefined; + /** Visible `y` domain, or `undefined` for the chart's natural extent */ + y: DomainType | undefined; + /** Whether a domain is currently shared */ + active: boolean; + /** Identity of the chart that set it */ + source: string | symbol | null; +}; + +const emptyDomain = (): ChartGroupDomain => ({ + x: undefined, + y: undefined, + active: false, + source: null, +}); + +/** The shared brush selection, in domain values */ +export type ChartGroupBrush = { + /** Selected `x` extent, or `[null, null]` when there is no selection */ + x: BrushDomainType; + /** Selected `y` extent, or `[null, null]` when there is no selection */ + y: BrushDomainType; + /** Whether a selection exists */ + active: boolean; + /** Identity of the chart that made the selection */ + source: string | symbol | null; + /** + * Whether a point falls within the selection, in domain values — the group's counterpart of + * `context.brush.contains()`, for a chart that reads the selection without owning a brush. + * + * ```svelte + * {@const isSelected = group.brush.contains({ x: d.date, y: d.value })} + * ``` + * + * An axis with no selection is unconstrained, so an inactive brush contains everything. The + * comparison is `<` / `>`, so categorical (band/point) values compare lexicographically — + * compare positions in the domain instead. + */ + contains(point: { x?: any; y?: any }): boolean; +}; + +/** + * Builds a selection with `contains` closed over the values it carries rather than resolving + * `this`, so it survives being pulled out of the object — `const { contains } = group.brush`. + * + * Every selection is built here rather than spread from another: spreading copies the previous + * `contains` along with the fields, and it would still answer for the selection it was built + * with. + */ +function makeBrush(brush: Partial> = {}): ChartGroupBrush { + const selection = { + x: [null, null] as BrushDomainType, + y: [null, null] as BrushDomainType, + active: false, + source: null as string | symbol | null, + ...brush, + }; + return { ...selection, contains: (point) => isWithinSelection(selection, point) }; +} + +const emptyBrush = (): ChartGroupBrush => makeBrush(); + +/** + * The shared series state. + * + * Unlike the other slices this carries two independent channels — which series is highlighted, and + * which are hidden — and so records a source for each. One shared `source` could not express a + * chart owning the highlight while another changes visibility. + */ +export type ChartGroupSeries = { + /** Highlighted series key, or `null` when nothing is highlighted */ + highlightKey: string | null; + /** Identity of the chart that set the highlight */ + highlightSource: string | symbol | null; + /** + * Series keys hidden across the group. Hidden rather than visible keys, so that a chart only + * has to speak for the series it actually has — see `setHidden`. + */ + hiddenKeys: string[]; + /** Identity of the chart that last changed visibility */ + visibilitySource: string | symbol | null; +}; + +const emptySeries = (): ChartGroupSeries => ({ + highlightKey: null, + highlightSource: null, + hiddenKeys: [], + visibilitySource: null, +}); + +/** Whether two key lists hold the same keys, regardless of order */ +function sameKeys(a: readonly string[], b: readonly string[]) { + return a.length === b.length && a.every((key) => b.includes(key)); +} + +/** Per-chart control over which slices a chart publishes to / subscribes from the group */ +export type ChartGroupMemberOptions = { + /** + * Slices this chart broadcasts to the group. `false` makes it listen-only (ex. a detail chart + * driven by an overview). + * @default true + */ + publish?: boolean | ChartGroupSlice[]; + + /** + * Slices this chart applies from the group. `false` makes it broadcast-only (ex. an overview + * chart that drives others but is not driven by them). + * @default true + */ + subscribe?: boolean | ChartGroupSlice[]; +}; + +/** The shared pointer position, published by whichever chart is being interacted with */ +export type ChartGroupPointer = { + /** `x` domain value under the pointer */ + x: any; + /** `y` domain value under the pointer */ + y: any; + /** Relative position within the plot area (`0`–`1`), for `match: 'percent'` */ + percent: { x: number; y: number }; + /** Index of the data point within the publishing chart's data, for `match: 'index'` */ + index: number; + /** The publishing chart's data point */ + data: any; + /** Whether a pointer is currently active */ + active: boolean; + /** Identity of the publishing chart, so it can ignore the echo of its own update */ + source: string | symbol | null; +}; + +const emptyPointer = (): ChartGroupPointer => ({ + x: undefined, + y: undefined, + percent: { x: 0, y: 0 }, + index: -1, + data: null, + active: false, + source: null, +}); + +/** + * Whether two pointers indicate the same place. A data point identifies a position on its own, + * so the values only need comparing when there isn't one — ex. an external caller passing just + * `x`, where identity alone would treat every update as unchanged. + */ +function samePosition(a: ChartGroupPointer, b: ChartGroupPointer) { + if (a.source !== b.source) return false; + return b.data != null ? a.data === b.data : isEqualValue(a.x, b.x) && isEqualValue(a.y, b.y); +} + +/** Whether two shared domains cover the same extent, from the same source */ +function sameDomain(a: ChartGroupDomain, b: ChartGroupDomain) { + return ( + a.source === b.source && + isEqualValue(a.x?.[0], b.x?.[0]) && + isEqualValue(a.x?.[1], b.x?.[1]) && + isEqualValue(a.y?.[0], b.y?.[0]) && + isEqualValue(a.y?.[1], b.y?.[1]) + ); +} + +/** Whether two selections cover the same extent, from the same source */ +function sameSelection(a: ChartGroupBrush, b: ChartGroupBrush) { + return ( + a.source === b.source && + isEqualValue(a.x[0], b.x[0]) && + isEqualValue(a.x[1], b.x[1]) && + isEqualValue(a.y[0], b.y[0]) && + isEqualValue(a.y[1], b.y[1]) + ); +} + +/** + * Shared state for a group of charts. + * + * Charts join a group by taking a `group` prop, or by being rendered inside ``. The + * state is a plain object, so anything else can read or write it too — a value readout, a table, + * a map — without involving a `Chart`. + * + * ```svelte + * + * + * + * + * ``` + */ +export class ChartGroupState { + /** + * Identity of the group itself, used as the `source` for pointers written from outside a chart + * so subscribers can still tell them apart from their own pointer. + */ + readonly id: string | symbol = Symbol('ChartGroup'); + + /** + * `$state.raw` rather than `$state` — the pointer is always replaced wholesale, and deep + * proxying would both wrap consumers' data and break the identity check in `setPointer` (a + * datum read back out of a proxy is never `===` the one that went in, so the no-op guard + * would never fire and publishing would loop). + */ + pointer = $state.raw(emptyPointer()); + + /** Shared brush selection. `$state.raw` for the same reasons as `pointer`. */ + brush = $state.raw(emptyBrush()); + + /** Shared series highlight and visibility. `$state.raw` for the same reasons as `pointer`. */ + series = $state.raw(emptySeries()); + + options: ChartGroupOptions; + + constructor(options: ChartGroupOptions = {}) { + this.options = options; + + const brush = this.brushOptions; + if (brush && (brush.x || brush.y)) { + this.brush = makeBrush({ + x: brush.x ?? [null, null], + y: brush.y ?? [null, null], + active: true, + }); + } + } + + /** Ids of the charts currently joined, to catch two members answering to the same one */ + #memberIds = new Set(); + + /** + * Join a chart to the group, returning the leave callback. + * + * Every slice attributes changes by member id, and a subscriber skips what it published by + * comparing `source` to its own — so two charts sharing an id both ignore the other's updates + * and silently stop syncing. Ids are only user-supplied via ``; the default is a + * `Symbol`, which can't collide. + */ + join(id: string | symbol) { + if (this.#memberIds.has(id)) { + // `console.warn` rather than `Logger`, which stays silent unless explicitly enabled + console.warn( + `[layerchart] Two charts joined a ChartGroup with id "${String(id)}" — they can't be told apart as a pointer/brush source, so updates between them are ignored. Give each chart a unique \`id\`.` + ); + } + this.#memberIds.add(id); + return () => this.#memberIds.delete(id); + } + + /** Shared visible domain. `$state.raw` for the same reasons as `pointer`. */ + domain = $state.raw(emptyDomain()); + + /** Resolved domain options, or `null` when domain sharing is disabled */ + get domainOptions(): Required | null { + const domain = this.options.domain ?? true; + if (domain === false) return null; + return { axis: (domain === true ? undefined : domain.axis) ?? 'x' }; + } + + /** Resolved brush options, or `null` when brush sharing is disabled */ + get brushOptions(): + | (Required> & Pick) + | null { + const brush = this.options.brush ?? true; + if (brush === false) return null; + const options = brush === true ? {} : brush; + return { axis: options.axis ?? 'x', x: options.x, y: options.y }; + } + + /** Resolved series options, or `null` when series sharing is disabled */ + get seriesOptions(): Required | null { + const series = this.options.series ?? true; + if (series === false) return null; + const options = series === true ? {} : series; + return { + highlight: options.highlight ?? true, + visibility: options.visibility ?? true, + }; + } + + /** Resolved pointer options, or `null` when pointer sharing is disabled */ + get pointerOptions(): Required | null { + const pointer = this.options.pointer ?? true; + if (pointer === false) return null; + const options = pointer === true ? {} : pointer; + return { + match: options.match ?? 'value', + axis: options.axis ?? 'x', + tooltip: options.tooltip ?? true, + }; + } + + /** + * Publish a pointer position to the group. No-ops when the position is unchanged, so repeated + * publishes of the same point don't wake subscribers. + * + * Charts supply every field, but outside callers only need the ones their `match` strategy + * uses — usually just a domain value: + * + * ```ts + * group.setPointer({ x: someDate }); + * ``` + */ + setPointer(pointer: Partial>) { + const next = { ...emptyPointer(), ...pointer, active: true }; + if (this.pointer.active && samePosition(this.pointer, next)) return; + this.pointer = next; + } + + /** + * Clear the shared pointer (ex. on pointer leave). + * + * Only the publisher may clear its own pointer — every chart in the group evaluates whether to + * publish, and one sitting idle with no tooltip must not wipe the pointer belonging to the chart + * actually being hovered (which would clear that chart, making it re-publish, and so on). + * Pass no `source` to clear regardless of owner. + * + * `clearBrush` / `clearDomain` deliberately do *not* gate this way: those are only reached from + * an explicit gesture on a chart, never from an idle one, so a clear anywhere clears the group. + */ + clearPointer(source: string | symbol | null = null) { + if (!this.pointer.active) return; + if (source != null && this.pointer.source !== source) return; + this.pointer = { ...emptyPointer(), source }; + } + + /** + * Publish a brush selection to the group, in domain values. No-ops when unchanged. + * + * ```ts + * group.setBrush({ x: [start, end] }); + * ``` + */ + setBrush(brush: Partial>) { + const next = makeBrush({ ...brush, active: true }); + if (this.brush.active && sameSelection(this.brush, next)) return; + this.brush = next; + } + + /** + * Clear the shared brush selection. + * + * Any member may clear it, not just whoever set it — unlike `clearPointer`, a brush is only + * ever cleared by a deliberate gesture on a chart (click-to-reset), so clearing from one chart + * is meant to clear the group. `source` records who did it. + */ + clearBrush(source: string | symbol | null = null) { + if (!this.brush.active) return; + this.brush = makeBrush({ source }); + } + + /** + * Highlight a series across the group, ex. from hovering a legend item. Charts without that + * series simply have nothing to highlight. + * + * ```ts + * group.setHighlight('revenue'); + * ``` + */ + setHighlight(key: string, source: string | symbol | null = null) { + if (this.series.highlightKey === key && this.series.highlightSource === source) return; + this.series = { ...this.series, highlightKey: key, highlightSource: source }; + } + + /** + * Clear the shared highlight (ex. on pointer leave). + * + * Owner-gated like `clearPointer`, and for the same reason: moving between two charts' legends + * clears one and sets the other in the same tick, and the chart being left must not wipe the + * highlight belonging to the one being entered. Pass no `source` to clear regardless of owner. + */ + clearHighlight(source: string | symbol | null = null) { + if (this.series.highlightKey == null) return; + if (source != null && this.series.highlightSource !== source) return; + this.series = { ...this.series, highlightKey: null, highlightSource: source }; + } + + /** + * Hide series across the group, ex. from toggling a legend item. Pass the full set of hidden + * keys — anything not listed is visible. No-ops when unchanged. + * + * ```ts + * group.setHidden(['forecast']); + * ``` + * + * Hidden keys rather than visible ones, because a chart only speaks for the series it has: a + * chart showing an unrelated metric contributes nothing here, where publishing *visible* keys + * would have it repeatedly claim everything else is hidden. + */ + setHidden(keys: string[], source: string | symbol | null = null) { + // Unchanged keys leave `visibilitySource` alone rather than re-attributing them, so whoever + // hid a series stays its owner when another chart merely reports the same set back + if (sameKeys(this.series.hiddenKeys, keys)) return; + this.series = { ...this.series, hiddenKeys: keys, visibilitySource: source }; + } + + /** + * Show every series again. + * + * Any member may clear it — see `clearBrush`. + */ + clearHidden(source: string | symbol | null = null) { + if (this.series.hiddenKeys.length === 0) return; + this.series = { ...this.series, hiddenKeys: [], visibilitySource: source }; + } + + /** + * Publish a visible domain to the group, so other charts zoom to match. + * + * ```ts + * group.setDomain({ x: [start, end] }); + * ``` + */ + setDomain(domain: Partial>) { + const next = { ...emptyDomain(), ...domain, active: true }; + if (this.domain.active && sameDomain(this.domain, next)) return; + this.domain = next; + } + + /** + * Clear the shared domain, returning charts to their natural extent. + * + * Any member may clear it — see `clearBrush`. + */ + clearDomain(source: string | symbol | null = null) { + if (!this.domain.active) return; + this.domain = { ...emptyDomain(), source }; + } +} + +/** + * Whether `slice` was opted into by name, rather than merely covered by the default. + * + * Sharing a brush *selection* as the group's *domain* has to be asked for: the default is to + * share everything, and under that default every plain brush would zoom the whole group, which + * is not what making a selection means. Naming `'domain'` in `publish` is that request. + */ +function optedInto(option: boolean | ChartGroupSlice[] | undefined, slice: ChartGroupSlice) { + return Array.isArray(option) && option.includes(slice); +} + +/** Whether `slice` is enabled by a `publish` / `subscribe` option */ +/** + * The keys a chart's legend names, which are what its visibility is shared as. + * + * Usually the series keys — but a chart whose legend is backed by an ordinal `c` scale names + * that channel's categories instead, and its lone implicit series names none of them. + */ +function legendKeys(ctx: ChartState): string[] { + return (ctx.cGroups as string[] | null) ?? ctx.series.series.map((s) => s.key); +} + +/** Whether a key is currently shown — an empty selection means nothing is hidden */ +function shows(ctx: ChartState, key: string) { + const selected = ctx.series.selectedKeys; + return selected.isEmpty() || selected.isSelected(key); +} + +function allows(option: boolean | ChartGroupSlice[] | undefined, slice: ChartGroupSlice) { + if (option == null || option === true) return true; + if (option === false) return false; + return option.includes(slice); +} + +/** Accessor value for a data point, using the first entry of multi-value accessors */ +function singleValue(accessor: (d: any) => any, d: any) { + const value = accessor(d); + return Array.isArray(value) ? value[0] : value; +} + +/** Relative position (`0`–`1`) of a domain value within a scale's range */ +function toPercent(scale: AnyScale, range: any[], value: any) { + const lo = min(range) as number; + const hi = max(range) as number; + const px = scale(value); + return hi === lo || typeof px !== 'number' ? 0 : (px - lo) / (hi - lo); +} + +/** Domain value at a relative position (`0`–`1`) within a scale's range */ +function fromPercent(scale: AnyScale, range: any[], percent: number) { + const lo = min(range) as number; + const hi = max(range) as number; + return scaleInvert(scale, lo + percent * (hi - lo)); +} + +/** + * Resolve a published pointer to a data point on a subscribing chart, using its own data + * and scales. + */ +export function resolvePointerData( + pointer: ChartGroupPointer, + ctx: ChartState, + options: Required +) { + const { match, axis } = options; + + if (typeof match === 'function') { + return match(pointer, ctx); + } + + if (match === 'index') { + return pointer.index >= 0 ? ctx.flatData[pointer.index] : undefined; + } + + const value = + match === 'percent' + ? { + x: axis !== 'y' ? fromPercent(ctx.xScale, ctx.xRange, pointer.percent.x) : undefined, + y: axis !== 'x' ? fromPercent(ctx.yScale, ctx.yRange, pointer.percent.y) : undefined, + } + : { + x: axis !== 'y' ? pointer.x : undefined, + y: axis !== 'x' ? pointer.y : undefined, + }; + + return findDatumByValue(ctx, value, { mode: ctx.tooltip.mode }); +} + +/** + * Wire a chart to a group — publishing its pointer when interacted with, and applying the group's + * pointer when another chart publishes one. + * + * Must be called during component initialization (it registers `$effect`s). + */ +export function connectToChartGroup( + ctx: ChartState, + getGroup: () => ChartGroupState | undefined, + getMemberOptions: () => ChartGroupMemberOptions | undefined = () => undefined +) { + $effect(() => getGroup()?.join(ctx.id)); + + // Publish — driven by the interaction itself rather than by watching state, so the chart the + // pointer actually moved to is the one that wins. A tooltip set by the group carries the + // originating chart's id as its `source`, which the handler filters out. + $effect(() => { + const group = getGroup(); + const pointerOptions = group?.pointerOptions; + // `tooltipState` is bound by `TooltipContext` after this runs, so wait for it + const tooltip = ctx.tooltipState; + if (!group || !pointerOptions || !tooltip) return; + if (!allows(getMemberOptions()?.publish, 'pointer')) return; + + const publish = () => { + // Ignore changes this chart didn't cause — applying the group's own pointer would + // otherwise echo straight back out + if (tooltip.source !== ctx.id) return; + + const data = tooltip.data; + + if (data == null) { + group.clearPointer(ctx.id); + return; + } + + group.setPointer({ + x: singleValue(ctx.x, data), + y: singleValue(ctx.y, data), + percent: { + x: toPercent(ctx.xScale, ctx.xRange, singleValue(ctx.x, data)), + y: toPercent(ctx.yScale, ctx.yRange, singleValue(ctx.y, data)), + }, + index: ctx.flatData.indexOf(data), + data, + source: ctx.id, + }); + }; + + tooltip.onChange = publish; + + return () => { + // Only release our own handler — a re-run may already have installed a newer one + if (tooltip.onChange === publish) tooltip.onChange = undefined; + }; + }); + + // Publish — the highlighted series. An event rather than an effect for the same reason as the + // pointer: moving between two charts' legends clears the one being left and sets the one being + // entered, so only the interaction itself knows which is which. + $effect(() => { + const group = getGroup(); + const seriesOptions = group?.seriesOptions; + if (!group || !seriesOptions?.highlight) return; + if (!allows(getMemberOptions()?.publish, 'series')) return; + + const series = ctx.series; + + const publish = () => { + // Ignore a highlight the group applied — it would echo straight back out + if (series.highlightSource != null) return; + + const key = series.highlightKey; + if (key == null) { + group.clearHighlight(ctx.id); + } else { + group.setHighlight(key, ctx.id); + } + }; + + series.onHighlightChange = publish; + + return () => { + // Only release our own handler — a re-run may already have installed a newer one + if (series.onHighlightChange === publish) series.onHighlightChange = undefined; + }; + }); + + // Subscribe — apply the group's highlight to this chart + $effect(() => { + const group = getGroup(); + const seriesOptions = group?.seriesOptions; + if (!group || !seriesOptions?.highlight) return; + if (!allows(getMemberOptions()?.subscribe, 'series')) return; + + const shared = group.series; + if (shared.highlightSource === ctx.id) return; // this chart published it + + // `untrack` so reading this chart's own highlight (to skip a redundant write) doesn't make + // the effect re-run on every local hover + untrack(() => { + if (ctx.series.highlightKey === shared.highlightKey) return; + ctx.series.setHighlight( + shared.highlightKey, + // Never `null` — that marks a local highlight, which would publish straight back out. + // An externally-written highlight is attributed to the group itself. + shared.highlightSource ?? group.id + ); + }); + }); + + // Publish — which of this chart's series are hidden. Safe as an effect where the highlight is + // not: hiding a series is a deliberate toggle, so no two charts are mid-gesture at once. + $effect(() => { + const group = getGroup(); + const seriesOptions = group?.seriesOptions; + if (!group || !seriesOptions?.visibility) return; + if (!allows(getMemberOptions()?.publish, 'series')) return; + + const keys = legendKeys(ctx); + const hidden = keys.filter((key) => !shows(ctx, key)); + + untrack(() => { + // Merge rather than replace, so a chart only ever speaks for its own series — see + // `setHidden`. Untracked because this effect reacts to *local* visibility; reading the + // shared set as a dependency would make it re-run on its own write. + const shared = group.series.hiddenKeys; + group.setHidden([...shared.filter((key) => !keys.includes(key)), ...hidden], ctx.id); + }); + }); + + // Subscribe — hide the series the group has hidden, ignoring keys this chart doesn't have + $effect(() => { + const group = getGroup(); + const seriesOptions = group?.seriesOptions; + if (!group || !seriesOptions?.visibility) return; + if (!allows(getMemberOptions()?.subscribe, 'series')) return; + + const shared = group.series; + if (shared.visibilitySource === ctx.id) return; // this chart published it + + const keys = legendKeys(ctx); + const visible = keys.filter((key) => !shared.hiddenKeys.includes(key)); + // `SelectionState` reads an empty selection as "everything visible", so only narrow it when + // something is actually hidden + const next = visible.length === keys.length ? [] : visible; + + untrack(() => { + const selectedKeys = ctx.series.selectedKeys; + // Assigning always produces a new set, waking the publish effect for no reason + if (sameKeys(selectedKeys.current, next)) return; + selectedKeys.current = next; + }); + }); + + // Release anything this chart owns when it goes away (or moves to another group). Without + // this, a chart unmounted while hovering — a route change, a tab switch, a conditional block — + // leaves the group holding its pointer forever, and every other chart showing a phantom + // tooltip. Worse for the pointer: `clearPointer` only lets the owner clear, so a departed + // chart would wedge the group with no way back. + $effect(() => { + const group = getGroup(); + if (!group) return; + + return () => { + if (group.pointer.source === ctx.id) group.clearPointer(); + if (group.brush.source === ctx.id) group.clearBrush(); + if (group.domain.source === ctx.id) group.clearDomain(); + if (group.series.highlightSource === ctx.id) group.clearHighlight(); + // Hidden keys are deliberately not released. They describe series, not the chart that + // hid them, and other members may still be showing the same ones hidden — unhiding those + // because an unrelated chart unmounted would be the surprise. + }; + }); + + /** Whether this chart's transform is currently showing a domain the group shared */ + let following = false; + + // Subscribe — apply the group's visible domain to this chart. Writes plain state that this + // effect never reads back, so it cannot feed itself; publishing happens from the zoom + // interaction via `publishDomain` instead. + $effect(() => { + const group = getGroup(); + const domainOptions = group?.domainOptions; + if (!group || !domainOptions) return; + if (!allows(getMemberOptions()?.subscribe, 'domain')) return; + + const shared = group.domain; + if (shared.source === ctx.id) return; // this chart published it + + untrack(() => { + // A zoom this chart performed earlier sits at a higher precedence than the group's domain, + // so it would pin the chart there forever. Releasing it makes the most recent interaction + // win, which is what precedence alone cannot express. + ctx.brushXDomain = undefined; + ctx.brushYDomain = undefined; + }); + + // A chart that narrows its domain by `transform` has to be moved *through* it. Setting a + // domain alongside would narrow what the transform then scales again, so the two would stack — + // and clearing the shared domain would drop the chart back to wherever its transform sat. + if (untrack(() => ctx.transformState?.mode === 'domain')) { + untrack(() => { + if (shared.active) { + following = true; + ctx.zoomToBrush( + { x: (shared.x ?? [null, null]) as any, y: (shared.y ?? [null, null]) as any }, + domainOptions.axis + ); + } else if (following) { + // Only when a shared domain this chart was following goes away. Resetting whenever + // there isn't one would undo the chart's own zoom the moment it published it. + following = false; + ctx.transform.reset(); + } + }); + return; + } + + ctx.groupXDomain = domainOptions.axis !== 'y' ? (shared.x as BrushDomainType) : undefined; + ctx.groupYDomain = domainOptions.axis !== 'x' ? (shared.y as BrushDomainType) : undefined; + }); + + /** + * Publish — a chart the user pans or zooms shares the domain it lands on, the way one zoomed by + * its brush does. + * + * Reads the domain the transform is *settling* toward rather than the animated one: applying a + * shared domain drives this chart's transform too, and that lands on the same value, so the + * comparison below ends the exchange rather than trading frames of two animations. + */ + $effect(() => { + const group = getGroup(); + const domainOptions = group?.domainOptions; + if (!group || !domainOptions) return; + if (!allows(getMemberOptions()?.publish, 'domain')) return; + if (ctx.transformState?.mode !== 'domain') return; + + const x = + domainOptions.axis !== 'y' ? (ctx._transformTargetXDomain as BrushDomainType) : undefined; + const y = + domainOptions.axis !== 'x' ? (ctx._transformTargetYDomain as BrushDomainType) : undefined; + + untrack(() => { + const shared = group.domain; + + // Back to the full extent — no shared domain, rather than one covering everything + if (ctx.transform.targetScale === 1) { + if (shared.active && shared.source === ctx.id) group.clearDomain(ctx.id); + return; + } + + const unchanged = + isEqualValue(x?.[0], shared.x?.[0]) && + isEqualValue(x?.[1], shared.x?.[1]) && + isEqualValue(y?.[0], shared.y?.[0]) && + isEqualValue(y?.[1], shared.y?.[1]); + if (unchanged) return; + + group.setDomain({ x, y, source: ctx.id }); + }); + }); + + // Subscribe — apply the group's brush selection to this chart. + // + // No publish effect is needed: `BrushContext` only fires its `onChange` / `onBrushEnd` events + // from user gestures, and `Chart` publishes from there (see `enhancedBrushProps`). Applying a + // selection here uses `brush.move()` / `brush.reset()`, which write state without firing those + // events — so an applied selection can't echo back out. + $effect(() => { + const group = getGroup(); + const brushOptions = group?.brushOptions; + // `brushState` only exists when the chart has `brush` enabled + const brush = ctx.brushState; + if (!group || !brushOptions || !brush) return; + if (!allows(getMemberOptions()?.subscribe, 'brush')) return; + + const shared = group.brush; + if (shared.source === ctx.id) return; // this chart made the selection + + // `untrack` for the same reason `BrushContext` does when syncing external `x`/`y`: `move()` + // and `reset()` both read `brush.x` / `brush.y` and write them, so tracking their internals + // would make this effect invalidate itself. + untrack(() => { + if (!shared.active) { + brush.reset(); + return; + } + + brush.move({ + ...(brushOptions.axis !== 'y' ? { x: shared.x } : null), + ...(brushOptions.axis !== 'x' ? { y: shared.y } : null), + }); + }); + }); + + // Subscribe — resolve the group's pointer against this chart's own data and scales + $effect(() => { + const group = getGroup(); + const pointerOptions = group?.pointerOptions; + if (!group || !pointerOptions) return; + if (!allows(getMemberOptions()?.subscribe, 'pointer')) return; + + const pointer = group.pointer; + if (pointer.source === ctx.id) return; // this chart published it + + if (!pointer.active) { + ctx.tooltip.hide(); + return; + } + + const data = resolvePointerData(pointer, ctx, pointerOptions); + if (data == null) { + ctx.tooltip.hide(); + return; + } + + ctx.tooltip.show({ + data, + // Never the subscriber's own id — a chart treats `source === ctx.id` as its own pointer + // and would immediately re-publish. An externally-written pointer (no source) is + // attributed to the group itself. + source: pointer.source ?? group.id, + // `false` shows the `Highlight` without the tooltip content + suppressed: !pointerOptions.tooltip, + }); + }); + + /** + * Drop any domain this chart had applied *from* the group. + * + * A publisher is skipped by its own subscribe effect, so nothing else would release what it + * previously applied — leaving it pinned to a domain it has just replaced or cleared. After + * publishing, a chart shows its own zoom (via `brushXDomain`) or nothing at all. + */ + function releaseAppliedDomain() { + ctx.groupXDomain = undefined; + ctx.groupYDomain = undefined; + } + + return { + /** + * Share a brush gesture with the group — as a selection, and as the group's visible domain + * when this chart's `publish` names `'domain'` (an overview driving the others' zoom without + * zooming itself). + */ + publishBrush(brush: { x: BrushDomainType; y: BrushDomainType; active?: boolean }) { + const group = getGroup(); + if (!group) return; + const publish = getMemberOptions()?.publish; + + if (group.brushOptions && allows(publish, 'brush')) { + if (brush.active) { + group.setBrush({ x: brush.x, y: brush.y, source: ctx.id }); + } else { + group.clearBrush(ctx.id); + } + } + + if (group.domainOptions && optedInto(publish, 'domain')) { + if (brush.active) { + group.setDomain({ x: brush.x as any, y: brush.y as any, source: ctx.id }); + } else { + group.clearDomain(ctx.id); + } + releaseAppliedDomain(); + } + }, + + /** Share the domain this chart just zoomed to with the group */ + publishDomain(x: BrushDomainType | undefined, y: BrushDomainType | undefined) { + const group = getGroup(); + if (!group?.domainOptions) return; + if (!allows(getMemberOptions()?.publish, 'domain')) return; + + if (x == null && y == null) { + group.clearDomain(ctx.id); + } else { + group.setDomain({ x: x as any, y: y as any, source: ctx.id }); + } + releaseAppliedDomain(); + }, + }; +} diff --git a/packages/layerchart/src/lib/states/index.ts b/packages/layerchart/src/lib/states/index.ts new file mode 100644 index 0000000000..ee5466aa84 --- /dev/null +++ b/packages/layerchart/src/lib/states/index.ts @@ -0,0 +1,64 @@ +/** + * The state classes behind a chart's contexts, and the types configuring them. + * + * Named exports rather than `export *`, unlike the component/context/util barrels — every state + * module also holds helpers that are ours rather than yours (`facetKey`, `defaultSettings`, + * `expandBandBrushDomain`, and so on), which stay unpublished. + */ + +/** + * `ChartState` is a type only — a chart builds its own, and everything else reads it through + * `getChartContext()`. + */ +export type { + ChartState, + MarkInfo, + NodeKind, + ComponentNode, + RegisterComponentOptions, +} from './chart.svelte.js'; + +export { BrushState } from './brush.svelte.js'; +export type { BrushDomainType, BrushExtent, BrushRange, BrushSelection } from './brush.svelte.js'; + +export { FacetState } from './facet.svelte.js'; +export type { Facet, FacetOptions } from './facet.svelte.js'; + +export { GeoState } from './geo.svelte.js'; +export type { GeoStateProps } from './geo.svelte.js'; + +export { ChartGroupState } from './group.svelte.js'; +export type { + ChartGroupBrush, + ChartGroupBrushOptions, + ChartGroupDomain, + ChartGroupDomainOptions, + ChartGroupMemberOptions, + ChartGroupOptions, + ChartGroupPointer, + ChartGroupPointerOptions, + ChartGroupSeries, + ChartGroupSeriesOptions, + ChartGroupSlice, + PointerMatch, +} from './group.svelte.js'; + +export { SeriesState } from './series.svelte.js'; +export type { StackConfig, StackLayout } from './series.svelte.js'; + +export { Settings } from './settings.svelte.js'; +export type { SettingsOptions } from './settings.svelte.js'; + +export { TooltipState } from './tooltip.svelte.js'; +export type { TooltipSeries, TooltipShow, TooltipShowOptions } from './tooltip.svelte.js'; + +export { TransformState } from './transform.svelte.js'; +export type { + InertiaOptions, + ScrollActivationKey, + TransformAxis, + TransformConstraint, + TransformMode, + TransformScrollMode, + TransformStateOptions, +} from './transform.svelte.js'; diff --git a/packages/layerchart/src/lib/states/mixed-marks.svelte.test.ts b/packages/layerchart/src/lib/states/mixed-marks.svelte.test.ts new file mode 100644 index 0000000000..fab5e196fa --- /dev/null +++ b/packages/layerchart/src/lib/states/mixed-marks.svelte.test.ts @@ -0,0 +1,49 @@ +import { describe, expect, it, vi } from 'vitest'; +import { render } from 'vitest-browser-svelte'; + +import MixedMarksHarness from '../components/tests/MixedMarksHarness.svelte'; +import type { ChartState } from './chart.svelte.js'; + +/** Long rows — `c` names the layers, so a bare `Bars` stacks them */ +const data = [ + { month: 'Jan', fruit: 'apples', value: 320 }, + { month: 'Jan', fruit: 'bananas', value: 180 }, + { month: 'Feb', fruit: 'apples', value: 280 }, + { month: 'Feb', fruit: 'bananas', value: 220 }, +]; + +/** Belongs to the month rather than any fruit, so it's the line's own data */ +const targets = [ + { month: 'Jan', target: 800 }, + { month: 'Feb', target: 1250 }, +]; + +async function renderMixed(splineProps: Record) { + let ctx: ChartState | undefined; + render(MixedMarksHarness, { + chartProps: { data, x: 'month', y: 'value', c: 'fruit', bandPadding: 0.3, width: 400, height: 300 }, + splineProps, + oncontext: (c: any) => (ctx = c), + } as any); + await vi.waitFor(() => expect(ctx).toBeDefined()); + await vi.waitFor(() => expect(document.querySelectorAll('.lc-bar').length).toBe(4)); + return ctx!; +} + +describe('mixed marks over a stack', () => { + it('should register a bare `Bars`, which names nothing but the stack it draws', async () => { + const ctx = await renderMixed({ data: targets, y: 'target' }); + + // Reading the chart's own data and colour leaves every other `MarkInfo` field empty, and a + // mark whose info looks empty is dropped — the domain would then miss the stack entirely + const marks = (ctx as any)._markInfos.map((m: any) => m.info.stacks); + expect(marks).toContain(true); + }); + + it('should cover both the stack and a line drawn beside it', async () => { + const ctx = await renderMixed({ data: targets, y: 'target' }); + + // The stack tops out at 500, the target line at 1250 — the scale has to hold both + expect(ctx.yDomain).toEqual([0, 1250]); + }); +}); diff --git a/packages/layerchart/src/lib/states/series.svelte.test.ts b/packages/layerchart/src/lib/states/series.svelte.test.ts index 6ea76e1231..83de6e6bb3 100644 --- a/packages/layerchart/src/lib/states/series.svelte.test.ts +++ b/packages/layerchart/src/lib/states/series.svelte.test.ts @@ -27,6 +27,112 @@ function createSeriesState(seriesData = series as any[], stackConfig: any = null return state!; } +describe('SeriesState isStackTop', () => { + // A row the later series are absent from — the stack fills them in as zero + const partial = { date: '2024-04', apples: 10, bananas: 20 } as any; + const stacked = [...wideData, partial]; + + function createStacked(seriesData = series as any[], extra: any = {}) { + return createSeriesState(seriesData, { + layout: 'stack', + data: stacked, + keyBy: 'date', + ...extra, + }); + } + + it('should pick the last series drawing anything, not the last series', () => { + // A sub-band or a gap leaves the later series out of a row, so an earlier one is on top there + const state = createStacked(); + + expect(state.isStackTop('bananas', partial)).toBe(true); + expect(state.isStackTop('apples', partial)).toBe(false); + }); + + it('should keep the last series on top when every series draws', () => { + const state = createStacked(); + + expect(state.isStackTop('oranges', stacked[0])).toBe(true); + expect(state.isStackTop('bananas', stacked[0])).toBe(false); + }); + + it('should treat a zero-height segment as absent', () => { + const zeroTop = { date: '2024-05', apples: 10, bananas: 20, oranges: 0 } as any; + const state = createStacked(series as any[], { data: [...stacked, zeroTop] }); + + expect(state.isStackTop('bananas', zeroTop)).toBe(true); + }); + + it('should ignore a hidden series when picking the top', () => { + const state = createStacked(); + // Selecting narrows the visible set, so this leaves `oranges` out + state.selectedKeys.toggle('apples'); + state.selectedKeys.toggle('bananas'); + + expect(state.visibleSeries.map((s) => s.key)).toEqual(['apples', 'bananas']); + expect(state.isStackTop('bananas', stacked[0])).toBe(true); + }); + + it('should give a diverging stack a top on each side of the baseline', () => { + // Positives stack up from zero and negatives down, so the row has two outermost segments — + // picking one per series rather than per row rounded the wrong bars + const diverging = { date: '2024-06', apples: 10, bananas: -5, oranges: 20 } as any; + const state = createSeriesState(series as any[], { + layout: 'stackDiverging', + data: [diverging], + keyBy: 'date', + }); + + expect(state.isStackTop('oranges', diverging)).toBe(true); // outermost above + expect(state.isStackTop('bananas', diverging)).toBe(true); // outermost below + expect(state.isStackTop('apples', diverging)).toBe(false); // covered by oranges + }); + + it('should keep the stacks of separate groups apart', () => { + // `groupBy` is what an `x1` sub-band partitions the stack with — the same category appears in + // each group, and each keeps its own top + const grouped = [ + { date: '2024-01', basket: 'a', apples: 10, bananas: 5 }, + { date: '2024-01', basket: 'b', oranges: 7 }, + ] as any[]; + const state = createSeriesState(series as any[], { + layout: 'stack', + data: grouped, + keyBy: 'date', + groupBy: (d: any) => d.basket, + }); + + expect(state.isStackTop('bananas', grouped[0])).toBe(true); + expect(state.isStackTop('oranges', grouped[1])).toBe(true); + }); + + it('should align series that carry their own data', () => { + // Reading the accessors instead would apply `value` to whichever row was hovered and see the + // *other* series' number, so `apples` would never look like the top + const sepSeries = [ + { + key: 'apples', + data: [ + { date: '2024-01', value: 10 }, + { date: '2024-02', value: 12 }, + ], + value: 'value', + }, + { key: 'bananas', data: [{ date: '2024-01', value: 5 }], value: 'value' }, + ]; + const state = createSeriesState(sepSeries as any[], { layout: 'stack', keyBy: 'date' }); + + // `bananas` covers 2024-01 but not 2024-02 + expect(state.isStackTop('apples', sepSeries[0].data[0] as any)).toBe(false); + expect(state.isStackTop('apples', sepSeries[0].data[1] as any)).toBe(true); + }); + + it('should return false for a key that names no series', () => { + const state = createStacked(); + expect(state.isStackTop('kiwis', stacked[0])).toBe(false); + }); +}); + describe('SeriesState', () => { describe('constructor and basic properties', () => { it('should initialize with provided series', () => { @@ -35,10 +141,9 @@ describe('SeriesState', () => { expect(state.series[0].key).toBe('apples'); }); - it('should default to overlap layout when no stack config', () => { + it('should report no stack layout without a stack config', () => { const state = createSeriesState(); - expect(state.stackLayout).toBe('overlap'); - expect(state.isStacked).toBe(false); + expect(state.stackLayout).toBe(null); }); it('should report isDefaultSeries for empty series', () => { @@ -234,7 +339,6 @@ describe('SeriesState', () => { data: wideData, keyBy: 'date', }); - expect(state.isStacked).toBe(true); expect(state.stackLayout).toBe('stack'); }); @@ -244,7 +348,6 @@ describe('SeriesState', () => { data: wideData, keyBy: 'date', }); - expect(state.isStacked).toBe(true); expect(state.stackLayout).toBe('stackExpand'); }); @@ -254,17 +357,14 @@ describe('SeriesState', () => { data: wideData, keyBy: 'date', }); - expect(state.isStacked).toBe(true); expect(state.stackLayout).toBe('stackDiverging'); }); - it('should not detect overlap as stacked', () => { - const state = createSeriesState(series as any[], { - layout: 'overlap', - data: wideData, - keyBy: 'date', - }); - expect(state.isStacked).toBe(false); + it('should report no stack layout when nothing is stacked', () => { + // `ChartState` only builds a stack config for a stacking layout, so an unstacked chart + // arrives here with none at all + const state = createSeriesState(series as any[], null); + expect(state.stackLayout).toBe(null); }); it('should return stack values for a data point', () => { diff --git a/packages/layerchart/src/lib/states/series.svelte.ts b/packages/layerchart/src/lib/states/series.svelte.ts index a96f9f49d3..2b638124ff 100644 --- a/packages/layerchart/src/lib/states/series.svelte.ts +++ b/packages/layerchart/src/lib/states/series.svelte.ts @@ -1,17 +1,42 @@ import type { Component } from 'svelte'; import type { SeriesData } from '../components/charts/types.js'; -import { InternMap } from 'd3-array'; +import { group, InternMap } from 'd3-array'; import { stack, stackOffsetDiverging, stackOffsetExpand, stackOffsetNone } from 'd3-shape'; +import { scaleOrdinal } from 'd3-scale'; import { accessor, type Accessor } from '../utils/common.js'; import { SelectionState } from '@layerstack/svelte-state'; -export type StackLayout = 'overlap' | 'stack' | 'stackExpand' | 'stackDiverging'; +/** Key for the single stack of an unfaceted chart */ +const STACK_UNGROUPED = ''; + +/** How a stack accumulates. `'overlap'` isn't one of these — nothing is stacked there */ +export type StackLayout = 'stack' | 'stackExpand' | 'stackDiverging'; + +/** How multiple series are arranged, before `auto` is resolved — see `ChartState.seriesLayout` */ +export type SeriesLayout = StackLayout | 'overlap' | 'group' | 'auto'; export type StackConfig = { layout: StackLayout; data?: TData[]; keyBy: Accessor; valueAccessor?: Accessor; + /** + * Groups the rows into separate stacks — the facet panel each belongs to. + * + * Panels share the position scales, so several of them hold the same `keyBy` value; without + * this the stacks collide and every panel draws whichever row was stacked last. + */ + groupBy?: (d: TData) => string; + /** + * The layer of the stack a row belongs to, when the rows carry their category rather than the + * columns — long data named by `c`, with no `series` to stack across. + * + * Set together with `seriesKeys`, which orders the layers. Unset for the wide format, where + * the series keys are the layers. + */ + seriesBy?: (d: TData) => any; + /** The layers `seriesBy` can name, bottom first — the `c` domain */ + seriesKeys?: any[]; }; export class SeriesState { @@ -24,10 +49,58 @@ export class SeriesState { selectedKeys: SelectionState; + #highlightKey = $state['key'] | null>(null); + /** * The current highlight series key for the chart. */ - highlightKey = $state['key'] | null>(null); + get highlightKey() { + return this.#highlightKey; + } + set highlightKey(key: SeriesData['key'] | null) { + this.setHighlight(key); + } + + /** + * Identity of whatever set the current highlight — `null` for this chart's own interaction, and + * the id of the publishing chart (or group) when a chart group applied it. + * + * Compare against `null` to tell the two apart, which is what keeps an applied highlight from + * echoing straight back out of the group. + */ + highlightSource = $state(null); + + /** + * Set the highlighted series, recording what drove it. Assigning to `highlightKey` is the same + * thing with no `source`, meaning this chart's own interaction. + */ + setHighlight( + key: SeriesData['key'] | null, + source: string | symbol | null = null + ) { + // The implicit `default` series names nothing to tell apart, so highlighting it reads as no + // highlight at all. A chart keyed by `c` instead holds those keys here — fading every mark + // against `default`, which none of them carry, is what this avoids. + this.#highlightKey = + this.isDefaultSeries && this.#series.some((s) => s.key === key) ? null : key; + this.highlightSource = source; + this.onHighlightChange?.(); + } + + /** + * Called whenever the highlight is set, whatever drove it — including re-asserting the key + * already highlighted. Check `highlightSource` to tell this chart's own interaction + * (`source === null`) from a group or other caller. + * + * This is a notification rather than something to derive from state, for the same reason as + * `TooltipState.onChange`: moving between two charts' legends clears the one being left and sets + * the one being entered, so both briefly hold a local highlight and state alone cannot say which + * one the pointer actually moved to. + * + * Note this is a single handler, not a subscriber list — assigning to it replaces whatever was + * there, including a chart group's. + */ + onHighlightChange?: () => void; constructor( getSeries: () => SeriesData[], @@ -62,17 +135,59 @@ export class SeriesState { } /** - * Whether stacking is enabled + * Whether the stack's layers are named by the rows (an ordinal `c`) rather than by series. + * + * A mark then needn't name a series to draw the stack — the row it's drawing already says + * which layer it is. */ - get isStacked() { - return this.#stackConfig?.layout?.startsWith('stack') ?? false; + get stacksByCategory() { + return this.#stackConfig?.seriesBy != null; } /** - * Current stack layout mode + * How the stack accumulates, or `null` when nothing is stacked — which is the question + * `stackLayout != null` asks. + * + * Narrower than `ChartState.isStacked`, which also asks whether a mark draws the stack. */ - get stackLayout(): StackLayout { - return this.#stackConfig?.layout ?? 'overlap'; + get stackLayout(): StackLayout | null { + return this.#stackConfig?.layout ?? null; + } + + /** + * Whether a series draws the top segment of its stack for a row. + * + * The series stack in order, so the top is the last one drawing anything — which is *not* the + * last series in general: an `x1` sub-band or a gap in the data leaves later series out of a + * row, and then an earlier one is what the eye sees on top. A diverging stack runs both ways + * from the baseline, so a row has a top on each side and both are edges. + * + * Read off the stack rather than off the accessors, so this agrees with what was actually + * drawn: the stack already resolves a row to its group (sub-band, facet panel) and aligns + * series that carry their own `data`, neither of which a bare accessor could do. A segment + * spanning nothing counts as absent, since it draws nothing. + */ + isStackTop(key: string, d: TData): boolean { + const config = this.#stackConfig; + const keys = config?.seriesBy ? this.#categoryKeys : this.visibleSeries.map((s) => s.key); + const rowKey = config?.seriesBy ? config.seriesBy(d) : key; + + const span = this.#stackValueFor(rowKey, d); + if (span == null || span[0] === span[1]) return false; + + /** The end farther from the baseline — which side of it the segment is stacked on, and how far */ + const outerOf = (s: [number, number]) => (Math.abs(s[1]) >= Math.abs(s[0]) ? s[1] : s[0]); + const outer = outerOf(span); + + return !keys.some((k) => { + if (k === rowKey) return false; + const other = this.#stackValueFor(k, d); + if (other == null || other[0] === other[1]) return false; + const otherOuter = outerOf(other); + // Only a segment stacked further along the *same* side covers this one — a diverging stack + // runs both ways from the baseline, so each direction has its own outermost segment + return Math.sign(otherOuter) === Math.sign(outer) && Math.abs(otherOuter) > Math.abs(outer); + }); } /** @@ -114,20 +229,45 @@ export class SeriesState { } /** - * Computed stack data using InternMap for value-based lookup. - * Outer map: categoryValue -> InternMap + * The stack's layers when the rows name them, bottom first — hidden categories dropped so the + * ones left close the gap rather than stacking above an empty band. */ - #stackMap = $derived.by(() => { - const config = this.#stackConfig; - if (!config || !config.layout.startsWith('stack')) return null; + #categoryKeys = $derived.by(() => { + const keys = this.#stackConfig?.seriesKeys; + if (!keys) return []; + return this.selectedKeys.isEmpty() ? keys : keys.filter((k) => this.selectedKeys.isSelected(k)); + }); - const visibleKeys = this.visibleSeries.map((s) => s.key); - const hasSeparateData = this.visibleSeries.some((s) => s.data != null); - const data = hasSeparateData ? this.#alignSeriesData() : (config.data ?? []); + /** + * Long rows pivoted into the wide shape `stack()` wants — one row per `keyBy` value, with a + * column per category. + */ + #alignCategoryData(rows: TData[]): Record[] { + const config = this.#stackConfig!; + const keyByAcc = accessor(config.keyBy); + const valueAcc = accessor(config.valueAccessor!); + const seriesBy = config.seriesBy!; - if (visibleKeys.length === 0 || data.length === 0) return null; + const byCategory = new InternMap>(); + for (const d of rows) { + const catKey = keyByAcc(d); + let row = byCategory.get(catKey); + if (!row) { + row = { __key: catKey }; + byCategory.set(catKey, row); + } + row[seriesBy(d)] = valueAcc(d) ?? 0; + } + return Array.from(byCategory.values()); + } - const keyByAcc = accessor(config.keyBy); + /** + * Computed stack data using InternMap for value-based lookup. + * Outer map: categoryValue -> InternMap + */ + #buildStack(rows?: TData[]) { + const config = this.#stackConfig; + if (!config) return null; const offset = config.layout === 'stackExpand' @@ -136,6 +276,37 @@ export class SeriesState { ? stackOffsetDiverging : stackOffsetNone; + // `seriesBy` names the layers from the rows, so the series are beside the point — including + // `#alignSeriesData`, which pivots by series key and would be reading a mark's own data + if (config.seriesBy) { + const keys = this.#categoryKeys; + const categoryRows = rows ?? config.data ?? []; + if (keys.length === 0 || categoryRows.length === 0) return null; + + const wide = this.#alignCategoryData(categoryRows as TData[]); + const stacked = stack() + .keys(keys as Iterable) + .value((d, key) => (d as any)[key] ?? 0) + .offset(offset)(wide); + + const byCategory = new InternMap>(); + for (let i = 0; i < wide.length; i++) { + const layers = new Map(); + for (let k = 0; k < keys.length; k++) { + layers.set(keys[k], stacked[k][i] as unknown as [number, number]); + } + byCategory.set(wide[i].__key, layers); + } + return byCategory; + } + + const visibleKeys = this.visibleSeries.map((s) => s.key); + const hasSeparateData = this.visibleSeries.some((s) => s.data != null); + const data = rows ?? (hasSeparateData ? this.#alignSeriesData() : (config.data ?? [])); + if (visibleKeys.length === 0 || data.length === 0) return null; + + const keyByAcc = accessor(config.keyBy); + const stackResult = stack() .keys(visibleKeys) .value((d, key) => { @@ -166,54 +337,64 @@ export class SeriesState { } return map; - }); + } /** - * For stackDiverging layout, returns the set of series keys that are "tips" - * (outermost in each direction) and should have rounded edges. - * Returns null for non-diverging layouts. + * Stacked `[y0, y1]` per row, as `groupKey -> categoryValue -> seriesKey`. + * + * One stack per group rather than one overall: the rows of a facet panel stack among + * themselves, and a category repeated across panels keeps a separate total in each. */ - get divergingEdgeKeys(): Set | null { - if (this.stackLayout !== 'stackDiverging' || !this.#stackMap) return null; - - const firstEntry = this.#stackMap.values().next().value; - if (!firstEntry) return null; - - let maxPosY1 = -Infinity; - let minNegY0 = Infinity; - let posTipKey: string | null = null; - let negTipKey: string | null = null; - - for (const s of this.visibleSeries) { - const stackVal = firstEntry.get(s.key); - if (!stackVal) continue; - const [y0, y1] = stackVal; - if (y1 > maxPosY1) { - maxPosY1 = y1; - posTipKey = s.key; - } - if (y0 < minNegY0) { - minNegY0 = y0; - negTipKey = s.key; - } + #stackMap = $derived.by(() => { + const config = this.#stackConfig; + if (!config) return null; + + const groupBy = config.groupBy; + if (!groupBy) { + const single = this.#buildStack(); + return single && new Map([[STACK_UNGROUPED, single]]); } - const tips = new Set(); - if (posTipKey != null && maxPosY1 > 0) tips.add(posTipKey); - if (negTipKey != null && minNegY0 < 0) tips.add(negTipKey); - return tips; - } + const hasSeparateData = this.visibleSeries.some((s) => s.data != null); + const data = hasSeparateData ? this.#alignSeriesData() : (config.data ?? []); + + const out = new Map>>(); + for (const [groupKey, rows] of group(data as TData[], groupBy)) { + const built = this.#buildStack(rows); + if (built) out.set(groupKey, built); + } + return out.size > 0 ? out : null; + }); /** * Get stack [y0, y1] values for a data point in a specific series. * Returns null if stacking is not enabled or series/data not found. */ - getStackValue(seriesKey: string, d: TData): [number, number] | null { + getStackValue(seriesKey: string | undefined, d: TData): [number, number] | null { + const config = this.#stackConfig; + // The row names its own layer when the categories live in the data, so the key a mark passes + // (its single implicit series) has nothing to say about which segment this is + return this.#stackValueFor(config?.seriesBy ? config.seriesBy(d) : seriesKey, d); + } + + /** + * The stacked span for a series at a category value, for callers holding the value rather than + * the row it came from — an annotation placed at `x: someDate`, say. + * + * Only reaches the ungrouped stack: a facet panel or sub-band needs the row to say which one. + */ + getStackValueAt(seriesKey: string, keyValue: any): [number, number] | null { + return this.#stackMap?.get(STACK_UNGROUPED)?.get(keyValue)?.get(seriesKey) ?? null; + } + + /** The span of a named layer for a row, whatever named it */ + #stackValueFor(key: any, d: TData): [number, number] | null { if (!this.#stackMap || !this.#stackConfig) return null; - const keyByAcc = accessor(this.#stackConfig.keyBy); - const catKey = keyByAcc(d); - return this.#stackMap.get(catKey)?.get(seriesKey) ?? null; + const config = this.#stackConfig; + const groupKey = config.groupBy ? config.groupBy(d) : STACK_UNGROUPED; + const catKey = accessor(config.keyBy)(d); + return this.#stackMap.get(groupKey)?.get(catKey)?.get(key) ?? null; } /** @@ -229,11 +410,12 @@ export class SeriesState { if (!stackMap || !config) return []; const keyByAcc = accessor(config.keyBy); - const visibleKeys = this.visibleSeries.map((s) => s.key); + const groupBy = config.groupBy; + const visibleKeys = config.seriesBy ? this.#categoryKeys : this.visibleSeries.map((s) => s.key); const values: number[] = []; for (const d of rows) { - const seriesMap = stackMap.get(keyByAcc(d)); + const seriesMap = stackMap.get(groupBy ? groupBy(d) : STACK_UNGROUPED)?.get(keyByAcc(d)); if (!seriesMap) continue; for (const key of visibleKeys) { const stackValue = seriesMap.get(key); @@ -248,7 +430,8 @@ export class SeriesState { * Create stack-aware y0/y1 accessor functions for a series. * Use these in Area, Bars, etc. when stacking is enabled. */ - getStackAccessors(seriesKey: string) { + /** `seriesKey` is optional — with the layers named by the rows, it's the row that decides */ + getStackAccessors(seriesKey?: string) { return { y0: (d: TData) => this.getStackValue(seriesKey, d)?.[0] ?? 0, y1: (d: TData) => this.getStackValue(seriesKey, d)?.[1] ?? 0, @@ -275,6 +458,10 @@ export class SeriesState { * Check if series is visible */ isVisible(seriesKey: SeriesData['key']) { + // Implicit series name nothing a legend could select — what's selected there is `c` + // categories or data keys, and the rows carrying them are filtered instead. Reading the + // selection here would hide the one series that draws them all. + if (this.isDefaultSeries) return true; return this.selectedKeys.isEmpty() || this.selectedKeys.isSelected(seriesKey); } @@ -292,10 +479,10 @@ export class SeriesState { * Changing default to `true` is useful to determine if series should be faded */ isHighlighted(seriesKey: SeriesData['key'], defaultValue = false) { - if (this.highlightKey === null) { + if (this.#highlightKey === null) { return defaultValue; } else { - return this.highlightKey === seriesKey; + return this.#highlightKey === seriesKey; } } @@ -315,6 +502,27 @@ export class SeriesState { .filter((d) => d) as Array; } + /** + * Ordinal scale mapping series key to its declared color, or `null` when no series declares one + * (or the series are the implicit default). + * + * Backs `ChartState.cScale` when nothing configures one, so `series` is the single source of + * truth for the marks and the legend alike, without restating the palette as `cDomain`/`cRange`. + */ + cScale = $derived.by(() => { + if (this.isDefaultSeries) return null; + const colored = this.#series.filter((s) => s.color != null); + if (colored.length === 0) return null; + + return ( + scaleOrdinal() + .domain(colored.map((s) => s.key)) + .range(colored.map((s) => s.color as string)) + // Keys the series don't cover stay unresolved rather than recycling the palette + .unknown(undefined as any) + ); + }); + get allSeriesColors() { return this.#series.map((s) => s.color).filter((c) => c != null) as Array< NonNullable['color']> diff --git a/packages/layerchart/src/lib/states/tooltip.svelte.ts b/packages/layerchart/src/lib/states/tooltip.svelte.ts index 715bce5320..aca791aab7 100644 --- a/packages/layerchart/src/lib/states/tooltip.svelte.ts +++ b/packages/layerchart/src/lib/states/tooltip.svelte.ts @@ -10,23 +10,117 @@ export type TooltipSeries = { config: SeriesData; }; +export type TooltipShowOptions = { + /** + * Container-relative pixel position of the tooltip. Defaults to the position of the resolved + * data point, derived from the chart's own scales. + */ + point?: { x: number; y: number }; + + /** + * Domain value(s) (ex. `{ x: new Date('2024-01-01') }`) used to resolve the nearest data point + * from this chart's own data. + * + * Since it resolves by value rather than pixel position, it works regardless of the chart's + * size, padding, or data — use it to drive tooltips programmatically, from the keyboard, or + * from another chart. + */ + value?: { x?: any; y?: any }; + + /** An explicit data point, skipping resolution */ + data?: T; + + /** + * Identity of whatever drove this tooltip. Defaults to the chart's own `id`, meaning its own + * pointer. Chart groups pass the publishing chart's id so the echo can be ignored. + */ + source?: string | symbol | null; + + /** + * Set the data (so `Highlight` still renders) without rendering the `Tooltip` content. + * @default false + */ + suppressed?: boolean; +}; + +export interface TooltipShow { + /** + * Show the tooltip for an explicit position, domain value, and/or data point. + * + * *What* is shown resolves in order: `data`, then `value`, then whatever is found at `point` + * using the configured `mode`. *Where* it is shown is `point` when given, otherwise the + * position of the resolved data point. + */ + (options: TooltipShowOptions): void; + + /** + * Show the tooltip for a pointer event, resolving data using the configured `mode`. + * Pass `data` to show a specific data point at the pointer position (ex. annotations). + */ + (e: PointerEvent | MouseEvent | TouchEvent, data?: T): void; +} + export class TooltipState { x = $state(0); y = $state(0); - data = $state(null); + /** + * `$state.raw` — the data point is always replaced wholesale, and deep proxying would wrap + * consumers' data, breaking identity checks against the source array (ex. `flatData.indexOf`). + */ + data = $state.raw(null); series = $state([]); isHoveringTooltipArea = $state(false); isHoveringTooltipContent = $state(false); + /** + * Identity of whatever drove the current tooltip — this chart's own `id` when it came from + * its own pointer, otherwise the id of the chart (or group) that drove it. + * + * Compare against the chart's `id` to tell the two apart: + * `context.tooltip.source === context.id`. + */ + source = $state(null); + + /** + * Whether the `Tooltip` content is suppressed while the data is still set. Used for a shared + * highlight without tooltips — `Highlight` still renders, `Tooltip` does not. + */ + suppressed = $state(false); + mode: TooltipMode; - show: (e: PointerEvent | MouseEvent | TouchEvent, tooltipData?: any) => void; + + /** + * Show the tooltip, either for a pointer event or for an explicit position, domain value, + * and/or data point. + * + * ```ts + * tooltip.show(e); // pointer event (resolves via `mode`) + * tooltip.show(e, datum); // data point at the pointer (ex. annotations) + * tooltip.show({ value: { x: someDate } }); // nearest data point to a domain value + * tooltip.show({ data: datum }); // known data point + * tooltip.show({ point: { x: 10, y: 20 } }); // container-relative pixel position + * ``` + */ + show: TooltipShow; + + /** Hide the tooltip (after `hideDelay`) */ hide: (e?: PointerEvent) => void; - constructor( - mode: TooltipMode, - show: (e: PointerEvent | MouseEvent | TouchEvent, tooltipData?: any) => void, - hide: (e?: PointerEvent) => void - ) { + /** + * Called whenever the tooltip is shown or cleared, whatever drove it. Check `source` to tell + * this chart's own input (`source === chart.id`) from a group or other caller. + * + * This is a notification rather than something to derive from state, because chart groups need + * to know *when* an interaction happened, not just what the state is: while a pointer moves + * from one chart to another both briefly hold locally-shown data (the first chart's `hide()` is + * async), so state alone cannot say which chart the pointer actually moved to. + * + * Note this is a single handler, not a subscriber list — assigning to it replaces whatever was + * there, including a chart group's. + */ + onChange?: () => void; + + constructor(mode: TooltipMode, show: TooltipShow, hide: (e?: PointerEvent) => void) { this.mode = mode; this.show = show; this.hide = hide; diff --git a/packages/layerchart/src/lib/states/transform.svelte.ts b/packages/layerchart/src/lib/states/transform.svelte.ts index 9c131fe070..87fd69dbf7 100644 --- a/packages/layerchart/src/lib/states/transform.svelte.ts +++ b/packages/layerchart/src/lib/states/transform.svelte.ts @@ -281,6 +281,21 @@ export class TransformState { return this.dragging || this.pinching || this._translating.current || this._scaling.current; } + /** + * Where the transform is settling, rather than where it is. + * + * `scale` / `translate` follow the animation, which is what rendering wants — but anything + * *sharing* the position wants the value it will come to rest at, or it shares every frame the + * animation passes through. + */ + get targetScale() { + return this._scale.target; + } + + get targetTranslate() { + return this._translate.target; + } + // Public getters and setters for scale and translate get scale() { return this._scale.current; diff --git a/packages/layerchart/src/lib/utils/brush.ts b/packages/layerchart/src/lib/utils/brush.ts new file mode 100644 index 0000000000..50e9dbb8a5 --- /dev/null +++ b/packages/layerchart/src/lib/utils/brush.ts @@ -0,0 +1,51 @@ +// Internal helpers behind `BrushState.contains()` and `group.brush.contains()`. Kept unexported +// from the package: those methods are the public surface, and d3-brush offers no equivalent to +// mirror (its `brushSelection` is in pixel space, so every d3 example converts through scales by +// hand). + +/** + * An inclusive `[min, max]` range. A `null` end is open — it does not constrain that side. + * + * Typed as a loose array to match `BrushDomainType`, which may hold fewer than two entries. + */ +export type Extent = readonly any[] | null | undefined; + +/** + * Whether a value falls within an inclusive `[min, max]` extent. + * + * A missing extent, or a `null` at either end, leaves that side unconstrained — so an inactive + * brush (`[null, null]`) contains everything. + * + * Intended for continuous and temporal values. Categorical (band/point) values would compare + * lexicographically, which is rarely what you want; compare positions in the domain instead. + */ +export function isWithinExtent(value: any, extent: Extent): boolean { + if (extent == null) return true; + const min = extent[0]; + const max = extent[1]; + if (min != null && value < min) return false; + if (max != null && value > max) return false; + return true; +} + +/** + * Whether a point falls within a selection's `x` and `y` extents — an axis with no selection is + * unconstrained. + * + * Works with anything exposing `x` / `y` extents: a chart's `context.brush`, a group's + * `group.brush`, or plain domain state. + * + * ```svelte + * {@const isSelected = isWithinSelection(context.brush, { x: d.date, y: d.value })} + * ``` + */ +export function isWithinSelection( + selection: { x?: Extent; y?: Extent } | null | undefined, + point: { x?: any; y?: any } +): boolean { + if (selection == null) return true; + return ( + (point.x === undefined || isWithinExtent(point.x, selection.x)) && + (point.y === undefined || isWithinExtent(point.y, selection.y)) + ); +} diff --git a/packages/layerchart/src/lib/utils/common.test.ts b/packages/layerchart/src/lib/utils/common.test.ts index 81917ef0f3..7e01b4ea56 100644 --- a/packages/layerchart/src/lib/utils/common.test.ts +++ b/packages/layerchart/src/lib/utils/common.test.ts @@ -1,6 +1,12 @@ import { describe, it, expect } from 'vitest'; -import { accessor, findRelatedData, resolveMaybeFn, getObjectOrNull } from './common.js'; +import { + accessor, + findRelatedData, + isEqualValue, + resolveMaybeFn, + getObjectOrNull, +} from './common.js'; export const testData = { one: 1, @@ -65,6 +71,53 @@ describe('getObjectOrNull', () => { }); }); +describe('isEqualValue', () => { + it('compares primitives by value', () => { + expect(isEqualValue(1, 1)).toBe(true); + expect(isEqualValue(1, 2)).toBe(false); + expect(isEqualValue('a', 'a')).toBe(true); + expect(isEqualValue('a', 'b')).toBe(false); + expect(isEqualValue(true, true)).toBe(true); + expect(isEqualValue(0, false)).toBe(false); + expect(isEqualValue(0, '0')).toBe(false); + }); + + it('compares distinct Date instances by their instant', () => { + expect(isEqualValue(new Date('2024-01-01'), new Date('2024-01-01'))).toBe(true); + expect(isEqualValue(new Date('2024-01-01'), new Date('2024-01-02'))).toBe(false); + }); + + it('treats null and undefined as equal to each other, but not to a value', () => { + // matches the `?.valueOf()` semantics `findRelatedData` has always had + expect(isEqualValue(null, undefined)).toBe(true); + expect(isEqualValue(null, null)).toBe(true); + expect(isEqualValue(null, 0)).toBe(false); + expect(isEqualValue(undefined, '')).toBe(false); + }); + + it('compares categorical (band/point scale) values correctly', () => { + // the reason for `valueOf()` over d3's `+a === +b`: numeric coercion turns these into NaN, + // so identical categories would never compare equal + expect(isEqualValue('apples', 'apples')).toBe(true); + expect(+'apples' === +'apples').toBe(false); // what the numeric idiom would report + }); + + it('falls back to identity for plain objects', () => { + const datum = { value: 1 }; + expect(isEqualValue(datum, datum)).toBe(true); + expect(isEqualValue(datum, { value: 1 })).toBe(false); + }); + + it('does not consider NaN equal to itself', () => { + expect(isEqualValue(NaN, NaN)).toBe(false); + }); + + it('equates a Date with the matching timestamp', () => { + // a consequence of comparing by `valueOf()` — worth knowing when domains mix the two + expect(isEqualValue(new Date(0), 0)).toBe(true); + }); +}); + describe('findRelatedData', () => { it('prefers exact object identity before accessor matching', () => { const first = { id: 'first', value: 10 }; diff --git a/packages/layerchart/src/lib/utils/common.ts b/packages/layerchart/src/lib/utils/common.ts index 2dc070eb1d..b45afebb4a 100644 --- a/packages/layerchart/src/lib/utils/common.ts +++ b/packages/layerchart/src/lib/utils/common.ts @@ -67,6 +67,17 @@ export function defaultChartPadding( }; } +/** + * Compare two scale/domain values, treating boxed values such as `Date` as equal when they + * represent the same instant. `null` and `undefined` are equal to each other. + * + * Uses `valueOf()` rather than d3's `+a === +b` idiom: numeric coercion turns the string values + * of a band/point scale into `NaN`, so identical categories would never compare equal. + */ +export function isEqualValue(a: any, b: any) { + return a?.valueOf() === b?.valueOf(); +} + /** * Find the first instance within `data` with the same value as `original` using prop accessor. * Handles complex objects such as `Date` by invoking `.valueOf()` @@ -76,9 +87,7 @@ export function findRelatedData(data: any[], original: any, accessor: Function) return original; } - return data.find((d) => { - return accessor(d)?.valueOf() === accessor(original)?.valueOf(); - }); + return data.find((d) => isEqualValue(accessor(d), accessor(original))); } /** diff --git a/packages/layerchart/src/lib/utils/dataProp.test.ts b/packages/layerchart/src/lib/utils/dataProp.test.ts index 8dd5b60d09..812f264604 100644 --- a/packages/layerchart/src/lib/utils/dataProp.test.ts +++ b/packages/layerchart/src/lib/utils/dataProp.test.ts @@ -145,6 +145,20 @@ describe('resolveColorProp', () => { expect(mockCScale).toHaveBeenCalledWith('A'); }); + it('returns a CSS color a function gives back, rather than scaling it', () => { + // An ordinal scale answers an unknown value by extending its domain and handing back the next + // color in its range, so a color read as a domain value comes back as the wrong color + for (const color of ['var(--color-surface-content)', '#00ff00', 'rgb(1, 2, 3)']) { + expect(resolveColorProp(() => color, data, mockCScale as any)).toBe(color); + } + expect(mockCScale).not.toHaveBeenCalled(); + }); + + it('still resolves a domain value a function gives back', () => { + expect(resolveColorProp((d: any) => d.category, data, mockCScale as any)).toBe('steelblue'); + expect(mockCScale).toHaveBeenCalledWith('A'); + }); + it('returns stringified data value when no cScale', () => { expect(resolveColorProp('category', data, null)).toBe('A'); }); diff --git a/packages/layerchart/src/lib/utils/dataProp.ts b/packages/layerchart/src/lib/utils/dataProp.ts index d49f76826c..af70c642fe 100644 --- a/packages/layerchart/src/lib/utils/dataProp.ts +++ b/packages/layerchart/src/lib/utils/dataProp.ts @@ -185,6 +185,21 @@ function isCSSColor(value: string): boolean { return value.startsWith('#') || value.includes('('); } +/** + * The data property a color prop names, or `undefined` when it's a CSS color literal (or names + * nothing in the data). + * + * Marks that draw one shape per series use this to infer their grouping from `stroke` / `fill`, + * without also having to also use `z="fruit"`. + */ +export function colorPropDataKey( + value: ColorProp | undefined | null, + d: T +): string | undefined { + if (typeof value !== 'string' || isCSSColor(value)) return undefined; + return d != null && get(d, value) !== undefined ? value : undefined; +} + export function resolveColorProp( value: ColorProp | undefined | null, d: T, @@ -196,7 +211,13 @@ export function resolveColorProp( if (typeof value === 'function') { const rawValue = (value as Function)(d, ...args); if (rawValue === undefined || rawValue === null) return undefined; - return cScale ? String(cScale(rawValue)) : String(rawValue); + + // A returned CSS color is a color, as a literal one is — otherwise it would be read as a + // domain value, and an ordinal scale answers an unknown one by extending its domain and + // handing back the next color in its range + if (typeof rawValue === 'string' && isCSSColor(rawValue)) return rawValue; + + return scaled(rawValue, cScale); } if (typeof value === 'string') { @@ -206,7 +227,7 @@ export function resolveColorProp( const dataValue = get(d, value); if (dataValue !== undefined) { // Data property — resolve through cScale - return cScale ? String(cScale(dataValue)) : String(dataValue); + return scaled(dataValue, cScale); } // Not a data property — treat as literal CSS color (e.g. named colors like 'red') return value; @@ -215,6 +236,16 @@ export function resolveColorProp( return undefined; } +/** + * Put a value through the color scale, keeping the value itself when the scale has nothing for it. + * A scale derived from `series` colors only covers the series keys, so anything else — a value the + * chart happens to colour by, say — behaves as it would with no scale at all. + */ +function scaled(value: any, cScale: AnyScale | null | undefined): string | undefined { + const result = cScale ? cScale(value) : undefined; + return result != null ? String(result) : String(value); +} + /** * Resolves a StyleProp for a specific data item. * If the value is a function, calls it with the data item. diff --git a/packages/layerchart/src/lib/utils/index.ts b/packages/layerchart/src/lib/utils/index.ts index 24a8180fe1..8076e430bc 100644 --- a/packages/layerchart/src/lib/utils/index.ts +++ b/packages/layerchart/src/lib/utils/index.ts @@ -16,6 +16,7 @@ export * from './string.js'; export * from './ticks.js'; export * from './treemap.js'; export * from './threshold.js'; +export * from './tooltip.js'; export * from './rasterInterpolate.js'; export * from './rasterBounds.js'; export * from './stats.js'; diff --git a/packages/layerchart/src/lib/utils/scales.svelte.ts b/packages/layerchart/src/lib/utils/scales.svelte.ts index 43e4d458ce..d65a4eb13d 100644 --- a/packages/layerchart/src/lib/utils/scales.svelte.ts +++ b/packages/layerchart/src/lib/utils/scales.svelte.ts @@ -48,6 +48,23 @@ export function isScaleBand(scale: AnyScale): scale is ScaleBand return typeof scale.bandwidth === 'function'; } +/** + * Whether the scale maps discrete values, so it can't be re-domained to a continuous extent. + * + * d3 ordinal scales (including band and point) interpolate nothing — `.copy().domain([min, max])` + * on one maps those two values and recycles the range for everything else. Marks that build a + * color ramp check this before adopting `ctx.cScale`, which defaults to an ordinal lookup of the + * `series` colors. + */ +export function isScaleOrdinal(scale: AnyScale): boolean { + // Ordinal scales carry `unknown()`; continuous ones interpolate instead + return ( + typeof (scale as any).unknown === 'function' && + typeof (scale as any).interpolate !== 'function' && + typeof (scale as any).interpolator !== 'function' + ); +} + export function isScaleTime(scale: AnyScale): scale is ScaleTime { const domain = scale.domain(); return domain[0] instanceof Date || domain[1] instanceof Date; diff --git a/packages/layerchart/src/lib/utils/tooltip.test.ts b/packages/layerchart/src/lib/utils/tooltip.test.ts new file mode 100644 index 0000000000..cdb4a44acd --- /dev/null +++ b/packages/layerchart/src/lib/utils/tooltip.test.ts @@ -0,0 +1,187 @@ +import { describe, expect, it } from 'vitest'; +import { scaleBand, scaleLinear } from 'd3-scale'; + +import { bisectData, dataCoords, findDatumByValue, pickNearest } from './tooltip.js'; + +const data = [ + { x: 0, y: 10 }, + { x: 10, y: 20 }, + { x: 20, y: 30 }, + { x: 30, y: 40 }, +]; + +const xScale = scaleLinear().domain([0, 30]).range([0, 300]); +const yScale = scaleLinear().domain([0, 40]).range([200, 0]); + +const ctx = { + flatData: data, + x: (d: any) => d.x, + y: (d: any) => d.y, + xScale, + yScale, +} as any; + +describe('pickNearest', () => { + const acc = (d: any) => d.x; + + it('returns the nearer of the two values', () => { + expect(pickNearest(data[0], data[1], 2, acc)).toEqual(data[0]); + expect(pickNearest(data[0], data[1], 8, acc)).toEqual(data[1]); + }); + + it('returns the defined value when one side is missing', () => { + expect(pickNearest(data[3], undefined, 100, acc)).toEqual(data[3]); + expect(pickNearest(undefined, data[0], -100, acc)).toEqual(data[0]); + }); + + it('respects `left` and `right`', () => { + expect(pickNearest(data[0], data[1], 9, acc, 'left')).toEqual(data[0]); + expect(pickNearest(data[0], data[1], 1, acc, 'right')).toEqual(data[1]); + }); +}); + +describe('bisectData', () => { + const acc = (d: any) => d.x; + + it('finds the closest data point', () => { + expect(bisectData(data, acc, 12)).toEqual(data[1]); + expect(bisectData(data, acc, 18)).toEqual(data[2]); + }); + + it('finds an exact match', () => { + expect(bisectData(data, acc, 20)).toEqual(data[2]); + }); + + it('clamps to the first/last data point when outside the domain', () => { + expect(bisectData(data, acc, -100)).toEqual(data[0]); + expect(bisectData(data, acc, 100)).toEqual(data[3]); + }); + + it('bisects on the first value of a multi-value accessor', () => { + const ranges = [{ span: [0, 5] }, { span: [10, 15] }, { span: [20, 25] }]; + const span = (d: any) => d.span; + + // `11` sits after the span starting at `10` and before the one starting at `20` + expect(bisectData(ranges, span, 11, 'left')).toEqual(ranges[1]); + expect(bisectData(ranges, span, 11, 'right')).toEqual(ranges[2]); + }); + + it('returns undefined for empty data', () => { + expect(bisectData([], acc, 10)).toBeUndefined(); + }); +}); + +describe('findDatumByValue', () => { + it('bisects on `x` for x-oriented modes', () => { + expect(findDatumByValue(ctx, { x: 21 }, { mode: 'bisect-x' })).toEqual(data[2]); + expect(findDatumByValue(ctx, { x: 21 }, { mode: 'quadtree-x' })).toEqual(data[2]); + }); + + it('bisects on `y` for y-oriented modes', () => { + expect(findDatumByValue(ctx, { y: 31 }, { mode: 'bisect-y' })).toEqual(data[2]); + expect(findDatumByValue(ctx, { y: 31 }, { mode: 'quadtree-y' })).toEqual(data[2]); + }); + + it('falls back to the axis the value was supplied for', () => { + // `quadtree` / `voronoi` / `manual` resolve by pixel proximity and have no value-based + // equivalent, so `show({ value: { x } })` still works on charts using them + expect(findDatumByValue(ctx, { x: 21 }, { mode: 'quadtree' })).toEqual(data[2]); + expect(findDatumByValue(ctx, { y: 31 }, { mode: 'voronoi' })).toEqual(data[2]); + expect(findDatumByValue(ctx, { x: 21 }, { mode: 'manual' })).toEqual(data[2]); + expect(findDatumByValue(ctx, { x: 21 })).toEqual(data[2]); + }); + + it('respects `findTooltipData`', () => { + expect(findDatumByValue(ctx, { x: 19 }, { mode: 'bisect-x', findTooltipData: 'left' })).toEqual( + data[1] + ); + expect( + findDatumByValue(ctx, { x: 11 }, { mode: 'bisect-x', findTooltipData: 'right' }) + ).toEqual(data[2]); + }); + + describe('bisect-band', () => { + const bandData = [ + { cat: 'a', v: 1 }, + { cat: 'a', v: 5 }, + { cat: 'b', v: 2 }, + { cat: 'b', v: 8 }, + ]; + + it('finds the closest point within an x band', () => { + const bandCtx = { + flatData: bandData, + x: (d: any) => d.cat, + y: (d: any) => d.v, + xScale: scaleBand().domain(['a', 'b']).range([0, 200]), + yScale: scaleLinear().domain([0, 10]).range([100, 0]), + } as any; + + expect(findDatumByValue(bandCtx, { x: 'a', y: 4 }, { mode: 'bisect-band' })).toEqual( + bandData[1] + ); + expect(findDatumByValue(bandCtx, { x: 'b', y: 3 }, { mode: 'bisect-band' })).toEqual( + bandData[2] + ); + }); + + it('finds the closest point within a y band', () => { + const bandCtx = { + flatData: bandData, + x: (d: any) => d.v, + y: (d: any) => d.cat, + xScale: scaleLinear().domain([0, 10]).range([0, 100]), + yScale: scaleBand().domain(['a', 'b']).range([0, 200]), + } as any; + + expect(findDatumByValue(bandCtx, { x: 4, y: 'a' }, { mode: 'bisect-band' })).toEqual( + bandData[1] + ); + }); + + it('returns undefined without a band scale', () => { + expect(findDatumByValue(ctx, { x: 10, y: 20 }, { mode: 'bisect-band' })).toBeUndefined(); + }); + }); +}); + +describe('dataCoords', () => { + it('positions a data point using the chart scales and padding', () => { + const coordCtx = { + xGet: (d: any) => xScale(d.x), + yGet: (d: any) => yScale(d.y), + xScale, + yScale, + padding: { top: 5, right: 0, bottom: 0, left: 20 }, + }; + + expect(dataCoords(coordCtx, data[1])).toEqual({ x: 120, y: 105 }); + }); + + it('positions to the center of a band', () => { + const bandScale = scaleBand().domain(['a', 'b']).range([0, 200]); + const coordCtx = { + xGet: (d: any) => bandScale(d.cat), + yGet: (d: any) => yScale(d.y), + xScale: bandScale, + yScale, + padding: { top: 0, right: 0, bottom: 0, left: 0 }, + } as any; + + // band 'a' starts at 0, and `step() / 2` centers it + expect(dataCoords(coordCtx, { cat: 'a', y: 40 })).toEqual({ x: 50, y: 0 }); + expect(dataCoords(coordCtx, { cat: 'b', y: 40 })).toEqual({ x: 150, y: 0 }); + }); + + it('positions to the midpoint of a multi-value accessor', () => { + const coordCtx = { + xGet: () => [100, 200], + yGet: () => 50, + xScale, + yScale, + padding: { top: 0, right: 0, bottom: 0, left: 0 }, + } as any; + + expect(dataCoords(coordCtx, {})).toEqual({ x: 150, y: 50 }); + }); +}); diff --git a/packages/layerchart/src/lib/utils/tooltip.ts b/packages/layerchart/src/lib/utils/tooltip.ts new file mode 100644 index 0000000000..60eaf6d37b --- /dev/null +++ b/packages/layerchart/src/lib/utils/tooltip.ts @@ -0,0 +1,213 @@ +import { bisector } from 'd3-array'; +import { sortFunc } from '@layerstack/utils'; + +import { isEqualValue } from './common.js'; + +import { isScaleBand, type AnyScale } from './scales.svelte.js'; +import type { TooltipMode } from '$lib/components/tooltip/TooltipContext.svelte'; + +/** + * Strategy for picking between the two data points surrounding a value. + * - `closest` — whichever of the two is nearer the value + * - `left` — the data point before the value + * - `right` — the data point after the value + */ +export type FindTooltipData = 'closest' | 'left' | 'right'; + +/** + * The subset of the chart context needed to resolve tooltip data from a domain value. + * Accepts a full `ChartState`, but typed structurally so it can be used with test fixtures. + */ +export type TooltipDataContext = { + flatData: any[]; + x: (d: any) => any; + y: (d: any) => any; + xScale: AnyScale; + yScale: AnyScale; +}; + +/** The subset of the chart context needed to position a data point in pixel space. */ +export type TooltipCoordContext = { + xGet: (d: any) => any; + yGet: (d: any) => any; + xScale: AnyScale; + yScale: AnyScale; + padding: { top: number; right: number; bottom: number; left: number }; + /** Present on a real `ChartState`; used to offset into the panel a row belongs to */ + facet?: { enabled: boolean; panels: Array<{ x: number; y: number; has(row: any): boolean }> }; +}; + +/** + * Value used for bisecting. `x`/`y` accessors can return an array (ex. `x={['start', 'end']}`), + * in which case the first value is used. + */ +function bisectValue(accessor: (d: any) => any, d: any) { + const value = accessor(d); + // Consider using midpoint/average/max instead of the first value + return Array.isArray(value) ? value[0] : value; +} + +/** Pick between the two data points surrounding `value` */ +export function pickNearest( + previousValue: T | undefined, + currentValue: T | undefined, + value: any, + accessor: (d: any) => any, + find: FindTooltipData = 'closest' +): T | undefined { + switch (find) { + case 'closest': + if (currentValue === undefined) { + return previousValue; + } else if (previousValue === undefined) { + return currentValue; + } else { + return Number(value) - Number(accessor(previousValue)) > + Number(accessor(currentValue)) - Number(value) + ? currentValue + : previousValue; + } + case 'left': + return previousValue; + case 'right': + default: + return currentValue; + } +} + +/** + * Find the data point matching `value` using a binary search. + * + * Requires `data` to be sorted by `accessor`. + */ +export function bisectData( + data: T[], + accessor: (d: T) => any, + value: any, + find: FindTooltipData = 'closest' +): T | undefined { + const index = bisector((d: T) => bisectValue(accessor, d)).left(data, value, 1); + return pickNearest(data[index - 1], data[index], value, accessor, find); +} + +/** + * Which axis to bisect on for a given tooltip mode. + * + * Modes that resolve by pixel proximity (`quadtree`, `voronoi`, ...) have no value-based + * equivalent, so they fall back to whichever axis the caller supplied a value for. This is what + * makes `tooltip.show({ value: { x } })` work on charts using any mode (ex. `LineChart` defaults + * to `quadtree-x`). + */ +function bisectAxis(mode: TooltipMode | undefined, value: { x?: any; y?: any }) { + switch (mode) { + case 'bisect-band': + return 'band' as const; + case 'bisect-x': + case 'quadtree-x': + return 'x' as const; + case 'bisect-y': + case 'quadtree-y': + return 'y' as const; + default: + return value.x != null ? ('x' as const) : ('y' as const); + } +} + +/** + * Find the data point at the given domain value(s), using the chart's own data and accessors. + * + * Unlike pixel-based lookup (quadtree/voronoi), this resolves purely from domain values, so it + * works across charts with different sizes, padding, and data — the basis for showing a tooltip + * programmatically or synchronizing tooltips between charts. + * + * Requires `ctx.flatData` to be sorted by the bisected accessor. + */ +export function findDatumByValue( + ctx: TooltipDataContext, + value: { x?: any; y?: any }, + options: { mode?: TooltipMode; findTooltipData?: FindTooltipData } = {} +) { + const find = options.findTooltipData ?? 'closest'; + + switch (bisectAxis(options.mode, value)) { + case 'x': + return bisectData(ctx.flatData, ctx.x, value.x, find); + + case 'y': + return bisectData(ctx.flatData, ctx.y, value.y, find); + + case 'band': { + if (isScaleBand(ctx.xScale)) { + // Find the point closest to `value.y` within the x band + const bandData = ctx.flatData + .filter((d) => ctx.x(d) === value.x) + .sort(sortFunc(ctx.y as () => any)); // sort for bisect + return bisectData(bandData, ctx.y, value.y, find); + } else if (isScaleBand(ctx.yScale)) { + // Find the point closest to `value.x` within the y band + const bandData = ctx.flatData + .filter((d) => ctx.y(d) === value.y) + .sort(sortFunc(ctx.x as () => any)); // sort for bisect + return bisectData(bandData, ctx.x, value.x, find); + } else { + // TODO: Support `bisect-band` without a band scale? Fallback to bisect? + return undefined; + } + } + } +} + +/** Offset to the center of a band, or `0` for non-band scales */ +function bandCenterOffset(scale: AnyScale) { + return isScaleBand(scale) ? scale.step() / 2 - (scale.padding() * scale.step()) / 2 : 0; +} + +/** Midpoint of a scaled value, which can be an array for multi-value accessors */ +function coordCenter(value: any) { + return Array.isArray(value) ? (value[0] + value[value.length - 1]) / 2 : value; +} + +/** + * Container-relative pixel coordinates of a data point, derived from the chart's own scales. + * + * Band scales resolve to the center of the band, and multi-value accessors + * (ex. `x={['start', 'end']}`) to the midpoint of the scaled values. + */ +export function dataCoords(ctx: TooltipCoordContext, data: any) { + // The scales are panel-relative, so a row of a faceted chart would otherwise be placed as if it + // were in the first panel + const panel = ctx.facet?.enabled ? ctx.facet.panels.find((p) => p.has(data)) : undefined; + + return { + x: coordCenter(ctx.xGet(data)) + ctx.padding.left + bandCenterOffset(ctx.xScale) + (panel?.x ?? 0), // prettier-ignore + y: coordCenter(ctx.yGet(data)) + ctx.padding.top + bandCenterOffset(ctx.yScale) + (panel?.y ?? 0), // prettier-ignore + }; +} + +/** The subset of the chart context needed to match a row across facet panels */ +export type FacetRowContext = { + x: (d: any) => any; + y: (d: any) => any; + /** Which axis carries the value — the *other* one is the position the panels share */ + valueAxis: 'x' | 'y'; +}; + +/** + * The row in `panel` at the same position as `data`, or `undefined` when it has none there. + * + * The facet counterpart of `findDatumByValue`: panels share the position scales, so "the same + * position" is the same domain value on the category axis — which is how a panel shows *its* + * value at the spot another panel was hovered. + * + * Matches exactly rather than to the nearest, so a panel with nothing at that position shows + * nothing rather than a value from somewhere else. + */ +export function panelDatum(ctx: FacetRowContext, panel: { data: any[] }, data: any) { + if (data == null) return undefined; + + const accessor = ctx.valueAxis === 'y' ? ctx.x : ctx.y; + if (!accessor) return undefined; + + const value = accessor(data); + return panel.data.find((d) => isEqualValue(accessor(d), value)); +} diff --git a/packages/layerchart/src/vitest-setup-client.ts b/packages/layerchart/src/vitest-setup-client.ts index 336a05a0d4..d7899c7e11 100644 --- a/packages/layerchart/src/vitest-setup-client.ts +++ b/packages/layerchart/src/vitest-setup-client.ts @@ -1,2 +1,22 @@ /// /// + +import { vi } from 'vitest'; + +/** + * `vi.waitFor` defaults to a 1s timeout, and unlike `expect.poll` it has no global setting. + * + * These tests are real browser renders, and the suite waits on them in ~160 places without ever + * passing a timeout. Under CPU contention — a docs sweep running alongside, or a small CI runner + * — a chart can take longer than a second to settle, and any of those waits then reports a + * perfectly healthy render as a failure. The symptom is a different test failing on each run. + * + * Raising the default only changes how long a genuine failure takes to surface. Individual calls + * can still pass their own timeout. + */ +const waitFor = vi.waitFor; +vi.waitFor = ((callback: Parameters[0], options?: Parameters[1]) => + waitFor( + callback, + typeof options === 'number' ? options : { timeout: 5000, ...options } + )) as typeof vi.waitFor; diff --git a/packages/layerchart/vite.config.js b/packages/layerchart/vite.config.js index db043e0fce..81b0c49c49 100644 --- a/packages/layerchart/vite.config.js +++ b/packages/layerchart/vite.config.js @@ -33,11 +33,28 @@ const config = defineConfig({ // Must be a sibling of `test`, not inside it: // https://github.com/vitest-dev/vitest/issues/5477#issuecomment-3616351661 optimizeDeps: { - include: ['d3-interpolate'], + // Pre-bundle the deps behind lazy `import()`s (Voronoi's geo stack, the quadtree, the + // path interpolator). On a cold cache these are transformed on demand mid-run, and + // the stall delays other files' dynamic imports past their own teardown. + include: [ + 'd3-interpolate', + 'd3-interpolate-path', + 'd3-quadtree', + 'd3-delaunay', + 'd3-geo', + 'd3-geo-voronoi', + 'd3-polygon', + ], }, test: { name: 'client', - testTimeout: 5000, + // Generous because these are real browser renders: under CPU contention (a parallel + // docs sweep, or a small CI runner) a chart can take well past a second to settle, and + // a `vi.waitFor` capped by a tight test timeout reports that as a failure. + testTimeout: 20000, + // Same reasoning as `vi.waitFor` in the setup file — the suite's ~130 `expect.poll` + // calls never pass a timeout, and 1s is not enough under load + expect: { poll: { timeout: 5000 } }, retry: 1, browser: { enabled: true, diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index d43aae9015..0b9e1a608c 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -3,3 +3,6 @@ packages: - 'examples/*' - 'docs' - 'bundle-analyzer' + +onlyBuiltDependencies: + - esbuild