From b08aae33c8d762669dc4aaf207705f7a92004a19 Mon Sep 17 00:00:00 2001 From: Sean Lynch Date: Thu, 6 Feb 2025 17:38:09 -0500 Subject: [PATCH 1/2] Begin to setup BrushContext to support scaleBand --- .../layerchart/src/lib/components/BrushContext.svelte | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/packages/layerchart/src/lib/components/BrushContext.svelte b/packages/layerchart/src/lib/components/BrushContext.svelte index 5eb51aed..ae66d4b3 100644 --- a/packages/layerchart/src/lib/components/BrushContext.svelte +++ b/packages/layerchart/src/lib/components/BrushContext.svelte @@ -49,7 +49,7 @@ import { chartContext } from './ChartContext.svelte'; import { localPoint } from '../utils/event.js'; - import type { DomainType } from '../utils/scales.js'; + import { scaleInvert, type DomainType } from '../utils/scales.js'; import { add } from '../utils/math.js'; import type { HTMLAttributes } from 'svelte/elements'; @@ -157,8 +157,8 @@ xDomain: [xDomain?.[0] ?? xDomainMin, xDomain?.[1] ?? xDomainMax] as [number, number], yDomain: [yDomain?.[0] ?? yDomainMin, yDomain?.[1] ?? yDomainMax] as [number, number], value: { - x: $xScale.invert?.(startPoint?.x ?? 0), - y: $yScale.invert?.(startPoint?.y ?? 0), + x: scaleInvert($xScale, startPoint?.x ?? 0), + y: scaleInvert($yScale, startPoint?.y ?? 0), }, }; @@ -167,8 +167,8 @@ const onPointerMove = (e: PointerEvent) => { const currentPoint = localPoint(rootEl, e); fn(start, { - x: $xScale.invert?.(currentPoint?.x ?? 0), - y: $yScale.invert?.(currentPoint?.y ?? 0), + x: scaleInvert($xScale, currentPoint?.x ?? 0), + y: scaleInvert($yScale, currentPoint?.y ?? 0), }); onchange({ xDomain, yDomain }); From 198edbf021374b10204a7ea73c624f63ff69cc41 Mon Sep 17 00:00:00 2001 From: Sean Lynch Date: Thu, 6 Feb 2025 17:39:11 -0500 Subject: [PATCH 2/2] Begin to setup BarChart brush --- .../src/lib/components/charts/BarChart.svelte | 33 ++++++++++++++++--- .../docs/components/BarChart/+page.svelte | 8 +++++ 2 files changed, 37 insertions(+), 4 deletions(-) diff --git a/packages/layerchart/src/lib/components/charts/BarChart.svelte b/packages/layerchart/src/lib/components/charts/BarChart.svelte index 019dd9c4..6d436a40 100644 --- a/packages/layerchart/src/lib/components/charts/BarChart.svelte +++ b/packages/layerchart/src/lib/components/charts/BarChart.svelte @@ -9,6 +9,7 @@ import Axis from '../Axis.svelte'; import Bars from '../Bars.svelte'; + import BrushContext from '../BrushContext.svelte'; import Canvas from '../layout/Canvas.svelte'; import Chart from '../Chart.svelte'; import Grid from '../Grid.svelte'; @@ -33,6 +34,7 @@ interface $$Props extends ChartProps { axis?: typeof axis; + brush?: typeof brush; debug?: typeof debug; grid?: typeof grid; bandPadding?: typeof bandPadding; @@ -55,6 +57,9 @@ export let x: Accessor = undefined; export let y: Accessor = undefined; + /** Set xDomain. Useful for external brush control */ + export let xDomain: ComponentProps['xDomain'] = undefined; + export let orientation: 'vertical' | 'horizontal' = 'vertical'; $: isVertical = orientation === 'vertical'; @@ -81,6 +86,7 @@ $: groupSeries = seriesLayout === 'group'; export let axis: ComponentProps | 'x' | 'y' | boolean = true; + export let brush: ComponentProps | boolean = false; export let rule: ComponentProps | boolean = true; export let grid: ComponentProps | boolean = true; export let labels: ComponentProps | boolean = false; @@ -130,14 +136,13 @@ } export let props: { - xAxis?: Partial>; - yAxis?: Partial>; - grid?: Partial>; - rule?: Partial>; bars?: Partial>; + brush?: Partial>; + grid?: Partial>; legend?: Partial>; highlight?: Partial>; labels?: Partial>; + rule?: Partial>; tooltip?: { context?: Partial>; root?: Partial>; @@ -147,6 +152,8 @@ separator?: Partial>; hideTotal?: boolean; }; + xAxis?: Partial>; + yAxis?: Partial>; } = {}; export let renderContext: 'svg' | 'canvas' = 'svg'; @@ -274,6 +281,8 @@ ); }); + $: brushProps = { ...(typeof brush === 'object' ? brush : null), ...props.brush }; + if (profile) { console.time('BarChart render'); onMount(() => { @@ -317,6 +326,22 @@ ...props.tooltip?.context, ...$$props.tooltip, }} + brush={brush && (brush === true || brush.mode == undefined || brush.mode === 'integrated') + ? { + axis: 'x', + // resetOnEnd: true, + xDomain, + ...brushProps, + onchange: (e) => { + console.log('change', e.xDomain); + brushProps.onchange?.(e); + }, + onbrushend: (e) => { + xDomain = e.xDomain; + brushProps.onbrushend?.(e); + }, + } + : false} let:x let:xScale let:y diff --git a/packages/layerchart/src/routes/docs/components/BarChart/+page.svelte b/packages/layerchart/src/routes/docs/components/BarChart/+page.svelte index 54968c82..cb68038e 100644 --- a/packages/layerchart/src/routes/docs/components/BarChart/+page.svelte +++ b/packages/layerchart/src/routes/docs/components/BarChart/+page.svelte @@ -1172,6 +1172,14 @@ +

Brush

+ + +
+ +
+
+

Custom chart