From 71bd42143b9617456f1bc73e59c56867928c7392 Mon Sep 17 00:00:00 2001 From: Sean Lynch Date: Tue, 11 Feb 2025 10:26:36 -0500 Subject: [PATCH] feat(AreaChart|BarChart|LineChart|PieChart|ScatterChart): Expose `tooltipContext` to enable `bind:` usage for external access --- .changeset/wild-pumas-doubt.md | 5 ++ .../lib/components/charts/AreaChart.svelte | 4 ++ .../src/lib/components/charts/BarChart.svelte | 4 ++ .../lib/components/charts/LineChart.svelte | 4 ++ .../src/lib/components/charts/PieChart.svelte | 4 ++ .../lib/components/charts/ScatterChart.svelte | 4 ++ .../docs/components/AreaChart/+page.svelte | 72 +++++++++++++++++++ 7 files changed, 97 insertions(+) create mode 100644 .changeset/wild-pumas-doubt.md diff --git a/.changeset/wild-pumas-doubt.md b/.changeset/wild-pumas-doubt.md new file mode 100644 index 000000000..7013a6e49 --- /dev/null +++ b/.changeset/wild-pumas-doubt.md @@ -0,0 +1,5 @@ +--- +'layerchart': minor +--- + +feat(AreaChart|BarChart|LineChart|PieChart|ScatterChart): Expose `tooltipContext` to enable `bind:` usage for external access diff --git a/packages/layerchart/src/lib/components/charts/AreaChart.svelte b/packages/layerchart/src/lib/components/charts/AreaChart.svelte index 894c26938..cad8f9bbf 100644 --- a/packages/layerchart/src/lib/components/charts/AreaChart.svelte +++ b/packages/layerchart/src/lib/components/charts/AreaChart.svelte @@ -83,6 +83,9 @@ export let points: ComponentProps | boolean = false; export let rule: ComponentProps | boolean = true; + /** Expose tooltip context for external access */ + export let tooltipContext: ComponentProps['tooltip'] = undefined; + /** Event dispatched with current tooltip data */ export let ontooltipclick: (e: MouseEvent, details: { data: any }) => void = () => {}; @@ -301,6 +304,7 @@ ...props.tooltip?.context, ...$$props.tooltip, }} + bind:tooltipContext brush={brush && (brush === true || brush.mode == undefined || brush.mode === 'integrated') ? { axis: 'x', diff --git a/packages/layerchart/src/lib/components/charts/BarChart.svelte b/packages/layerchart/src/lib/components/charts/BarChart.svelte index a9043dc69..2b4c4fee0 100644 --- a/packages/layerchart/src/lib/components/charts/BarChart.svelte +++ b/packages/layerchart/src/lib/components/charts/BarChart.svelte @@ -93,6 +93,9 @@ /** Padding between series items within bars when using 'seriesLayout="stack"' */ export let stackPadding = 0; + /** Expose tooltip context for external access */ + export let tooltipContext: ComponentProps['tooltip'] = undefined; + /** Event dispatched with current tooltip data */ export let ontooltipclick: (e: MouseEvent, detail: { data: any }) => void = () => {}; @@ -321,6 +324,7 @@ ...props.tooltip?.context, ...$$props.tooltip, }} + bind:tooltipContext let:x let:xScale let:y diff --git a/packages/layerchart/src/lib/components/charts/LineChart.svelte b/packages/layerchart/src/lib/components/charts/LineChart.svelte index a72e5c400..421002279 100644 --- a/packages/layerchart/src/lib/components/charts/LineChart.svelte +++ b/packages/layerchart/src/lib/components/charts/LineChart.svelte @@ -75,6 +75,9 @@ export let points: ComponentProps | boolean = false; export let rule: ComponentProps | boolean = true; + /** Expose tooltip context for external access */ + export let tooltipContext: ComponentProps['tooltip'] = undefined; + /** Event dispatched with current tooltip data */ export let ontooltipclick: (e: MouseEvent, details: { data: any }) => void = () => {}; @@ -232,6 +235,7 @@ ...props.tooltip?.context, ...$$props.tooltip, }} + bind:tooltipContext brush={brush && (brush === true || brush.mode == undefined || brush.mode === 'integrated') ? { axis: 'x', diff --git a/packages/layerchart/src/lib/components/charts/PieChart.svelte b/packages/layerchart/src/lib/components/charts/PieChart.svelte index 1c6752965..08ea30a94 100644 --- a/packages/layerchart/src/lib/components/charts/PieChart.svelte +++ b/packages/layerchart/src/lib/components/charts/PieChart.svelte @@ -97,6 +97,9 @@ /** Center chart. Override and use `props.group` for more control */ export let center = placement === 'center'; + /** Expose tooltip context for external access */ + export let tooltipContext: ComponentProps['tooltip'] = undefined; + // TODO: Not usable with manual tooltip / arc path. Use `onarcclick`? /** Event dispatched with current tooltip data */ export let ontooltipclick: (e: MouseEvent, detail: { data: any }) => void = () => {}; @@ -181,6 +184,7 @@ padding={{ bottom: legend === true ? 32 : 0 }} {...$$restProps} tooltip={props.tooltip?.context} + bind:tooltipContext let:x let:xScale let:y diff --git a/packages/layerchart/src/lib/components/charts/ScatterChart.svelte b/packages/layerchart/src/lib/components/charts/ScatterChart.svelte index beea3867d..057268292 100644 --- a/packages/layerchart/src/lib/components/charts/ScatterChart.svelte +++ b/packages/layerchart/src/lib/components/charts/ScatterChart.svelte @@ -64,6 +64,9 @@ export let legend: ComponentProps | boolean = false; export let rule: ComponentProps | boolean = true; + /** Expose tooltip context for external access */ + export let tooltipContext: ComponentProps['tooltip'] = undefined; + /** Event dispatched with current tooltip data */ export let ontooltipclick: (e: MouseEvent, detail: { data: any }) => void = () => {}; @@ -191,6 +194,7 @@ ...props.tooltip?.context, ...$$props.tooltip, }} + bind:tooltipContext brush={brush && (brush === true || brush.mode == undefined || brush.mode === 'integrated') ? { axis: 'both', diff --git a/packages/layerchart/src/routes/docs/components/AreaChart/+page.svelte b/packages/layerchart/src/routes/docs/components/AreaChart/+page.svelte index a8742a964..6851fc285 100644 --- a/packages/layerchart/src/routes/docs/components/AreaChart/+page.svelte +++ b/packages/layerchart/src/routes/docs/components/AreaChart/+page.svelte @@ -25,6 +25,7 @@ import type { DomainType } from '$lib/utils/scales.js'; import Html from 'layerchart/components/layout/Html.svelte'; import Blockquote from 'layerchart/docs/Blockquote.svelte'; + import type { ComponentProps } from 'svelte'; export let data; @@ -104,6 +105,7 @@ let debug = false; let markerPoints: { date: Date; value: number }[] = []; + let tooltipContext: ComponentProps>['tooltipContext']; +

Externally access tooltip data

+ + +
+ {#if $tooltipContext?.data} + date: {format($tooltipContext?.data?.date, PeriodType.Day, { variant: 'short' })} + value: {$tooltipContext?.data?.value} + {:else} + [hover chart] + {/if} +
+
+ +
+
+ + +

Brushing