From 32489708e1e1bd6083b97abcebf00c1c82f68855 Mon Sep 17 00:00:00 2001 From: Sean Lynch Date: Wed, 19 Jun 2024 21:17:02 -0400 Subject: [PATCH] [Brush] Begin to support scaleBand() (Bar charts) --- .changeset/metal-windows-wait.md | 5 ++ .../src/lib/components/Brush.svelte | 10 +-- .../routes/docs/components/Brush/+page.svelte | 67 ++++++++++++++++++- 3 files changed, 75 insertions(+), 7 deletions(-) create mode 100644 .changeset/metal-windows-wait.md diff --git a/.changeset/metal-windows-wait.md b/.changeset/metal-windows-wait.md new file mode 100644 index 000000000..e87a95385 --- /dev/null +++ b/.changeset/metal-windows-wait.md @@ -0,0 +1,5 @@ +--- +'layerchart': minor +--- + +[Brush] Support scaleBand() (Bar charts) diff --git a/packages/layerchart/src/lib/components/Brush.svelte b/packages/layerchart/src/lib/components/Brush.svelte index ba9e67409..c4b71a045 100644 --- a/packages/layerchart/src/lib/components/Brush.svelte +++ b/packages/layerchart/src/lib/components/Brush.svelte @@ -7,6 +7,7 @@ import { chartContext } from './ChartContext.svelte'; import Frame from './Frame.svelte'; import { localPoint } from '$lib/utils/event.js'; + import { scaleInvert } from '$lib/utils/scales.js'; import Group from './Group.svelte'; const { xScale, yScale, width, height, padding } = chartContext(); @@ -68,12 +69,13 @@ ) => void ) { return (e: PointerEvent) => { + // TODO: Handle scaleBand domains const start = { xDomain: [xDomain[0] ?? xDomainMin, xDomain[1] ?? xDomainMax] as [number, number], yDomain: [yDomain[0] ?? yDomainMin, yDomain[1] ?? yDomainMax] as [number, number], value: { - x: $xScale.invert?.(localPoint(frameEl, e)?.x ?? 0 - $padding.left), - y: $yScale.invert?.(localPoint(frameEl, e)?.y ?? 0 - $padding.top), + x: scaleInvert($xScale, localPoint(frameEl, e)?.x ?? 0 - $padding.left), + y: scaleInvert($yScale, localPoint(frameEl, e)?.y ?? 0 - $padding.top), }, }; @@ -81,8 +83,8 @@ const onPointerMove = (e: PointerEvent) => { fn(start, { - x: $xScale.invert?.(localPoint(frameEl, e)?.x ?? 0 - $padding.left), - y: $yScale.invert?.(localPoint(frameEl, e)?.y ?? 0 - $padding.top), + x: scaleInvert($xScale, localPoint(frameEl, e)?.x ?? 0 - $padding.left), + y: scaleInvert($yScale, localPoint(frameEl, e)?.y ?? 0 - $padding.top), }); // if (xDomain[0] === xDomain[1] || yDomain[0] === yDomain[1]) { diff --git a/packages/layerchart/src/routes/docs/components/Brush/+page.svelte b/packages/layerchart/src/routes/docs/components/Brush/+page.svelte index a4f689c50..3f7520833 100644 --- a/packages/layerchart/src/routes/docs/components/Brush/+page.svelte +++ b/packages/layerchart/src/routes/docs/components/Brush/+page.svelte @@ -1,7 +1,8 @@

Examples

+

Bar (scaleBand) support

+ + +
+ +
+ + (xDomain[0] == null || d.date >= xDomain[0]) && + (xDomain[1] == null || d.date <= xDomain[1]) + )} + x="date" + xScale={scaleBand().padding(0.2)} + y="value" + yDomain={[0, null]} + yNice + padding={{ left: 24, bottom: 24 }} + > + + + scaleTime(scale.domain(), scale.range()).ticks(4)} + format={(value) => formatDate(value, PeriodType.Custom, { custom: 'MMM yyyy' })} + /> + + + + + { + console.log(e.detail); + set(e.detail.xDomain); + }} + /> + + +
+
+
+
+

Styling via classes