Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
20 commits
Select commit Hold shift + click to select a range
092acaa
feat(Chart): add `isometric` prop to draw the plot area as a tilted f…
techniq Sep 25, 2026
d27e101
Rename grouped path channel from z to g
techniq Oct 5, 2026
996e85f
Add viewport-aligned text for isometric charts
techniq Oct 5, 2026
6ae2b5a
Add z-height boxes for isometric rects
techniq Oct 5, 2026
389ede4
Fit isometric charts on a proportional floor
techniq Oct 6, 2026
268acfa
Unify layer transforms for isometric charts and tooltips
techniq Oct 6, 2026
6922d07
Enable drag controls for isometric chart projections
techniq Oct 6, 2026
ebc8a8d
feat: add 3D scatter support for isometric charts
techniq Oct 6, 2026
7d46b97
Add interactive isometric transforms and stacked treemaps
techniq Oct 6, 2026
37690f0
Add isometric elevation support for paths, maps, and contours
techniq Oct 6, 2026
63c1d95
Add isometric heights for areas, polygons, and calendars
techniq Oct 7, 2026
f4c4705
Add isometric heights for bars, pies, lines, labels, and brushing
techniq Oct 7, 2026
bc959f0
consolidate isometric changesets
techniq Oct 7, 2026
4e1eb37
Improve isometric chart projection, interaction, and rendering
techniq Oct 7, 2026
ac1d7f9
Default volcano isometric contour to lines
techniq Oct 7, 2026
91e7d9a
Document screen-space Voronoi tooltip behavior
techniq Oct 8, 2026
5d2b9a3
Project isometric Voronoi cells from raised points
techniq Oct 8, 2026
ae7e7ad
Fix extruded path side class handling
techniq Oct 8, 2026
2425c2c
Reduce bundle size by changing API from `<Chart isometric={...}>` to …
techniq Oct 8, 2026
3166205
Export layer-specific isometric views for slimmer bundles
techniq Oct 8, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions .changeset/centred-zoom-controls.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
'layerchart': patch
---

fix(TransformContext): Zoom in / out about the middle of the plot area, and center a `canvas` zoom without resetting its scale
5 changes: 5 additions & 0 deletions .changeset/colored-contour-lines.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
'layerchart': minor
---

feat(Contour): Stroke unfilled contours in the bands' colors when no `stroke` is given
5 changes: 5 additions & 0 deletions .changeset/floating-points-walls.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
'layerchart': minor
---

feat(Frame|Grid|Axis|Highlight): Draw an `isometric` chart's back walls, their gridlines (`<Grid z>`), a height axis (`<Axis placement="back">`), and highlights at a point's height
5 changes: 5 additions & 0 deletions .changeset/geo-path-motion.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
'layerchart': patch
---

fix(GeoPath): Start a tweened map shape as itself rather than rising from a baseline
5 changes: 5 additions & 0 deletions .changeset/isometric-heights.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
'layerchart': minor
---

feat: Support `z` heights on an `isometric` chart — boxes (`Rect`, `Cell`, `Calendar`, `Bars` with `valueAxis="z"`), floating `Circle`, `Text`, `Labels` and `ArcLabel`, `Line` stems, and extruded `Polygon`, `Path`, `GeoPath`, `Contour`, `Pie`, `Area` and `Spline`
5 changes: 5 additions & 0 deletions .changeset/split-paths-by-g.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
'layerchart': minor
---

breaking(Chart|Spline|Area): Rename the `z` grouping channel to `g` (ex. `<Spline g="id">`), freeing `z` for a third position
5 changes: 5 additions & 0 deletions .changeset/steady-radial-ticks.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
'layerchart': patch
---

fix(Axis): Size an `angle` axis' ticks by its circle rather than the chart's width, so a continuous angle scale's tick count no longer changes with width (square charts get more ticks)
5 changes: 5 additions & 0 deletions .changeset/straight-links.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
'layerchart': patch
---

fix(Link): Draw links whose ends share an `x` or `y`
5 changes: 5 additions & 0 deletions .changeset/switchable-transform-mode.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
'layerchart': minor
---

feat(TransformContext): Switch `mode` without remounting the chart
5 changes: 5 additions & 0 deletions .changeset/tilted-floors-turn.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
'layerchart': minor
---

feat(Chart): Support `view={isometric}` to draw the plot area as a floor seen at an angle, turned with `isometric({ rotate, tilt })` or by dragging (`transform={{ drag: 'rotate' }}`), with `viewport` text facing the viewer
5 changes: 5 additions & 0 deletions .changeset/transformed-brush.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
'layerchart': patch
---

fix(BrushContext): Draw and measure the brush through a `canvas` pan / zoom
5 changes: 5 additions & 0 deletions .changeset/turned-ellipses.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
'layerchart': minor
---

feat(Ellipse): Support `rotate` to turn the ellipse about its center
5 changes: 5 additions & 0 deletions .changeset/zoomed-tooltips-find.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
'layerchart': patch
---

fix(TooltipContext): Account for `transform.mode: 'canvas'` pan / zoom in bisect modes and `'data'` tooltip placement
10 changes: 8 additions & 2 deletions docs/src/content/components/Area.md
Original file line number Diff line number Diff line change
Expand Up @@ -13,9 +13,9 @@ See also: [AreaChart](/docs/components/AreaChart) for simplified examples

:example{ name="basic" showCode }

### Multiple areas (`z`)
### Multiple areas (`g`)

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):
Set `g` to draw a separate area per distinct value, all from one mark — the same channel [`Spline`](/docs/components/Spline#multiple-lines-g) 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
<Chart {data} x="date" y="value" c="fruit" {cRange}>
Expand All @@ -34,3 +34,9 @@ This replaces grouping the data yourself and rendering an `Area` per group — e
### Playground

:example{ name="playground" }

## Isometric ridgeline

On an [isometric](/docs/guides/isometric) chart, `z` gives each point a height, and an `Area` stands up as a curtain from the floor to those heights. One curtain per row of a band `y`, drawn back to front, makes a 3D ridgeline.

:example{ name="oscilloscope-ridgeline-isometric" }
6 changes: 6 additions & 0 deletions docs/src/content/components/Bars.md
Original file line number Diff line number Diff line change
Expand Up @@ -18,3 +18,9 @@ See also: [BarChart](/docs/components/BarChart) for simplified examples
Use `width` or `height` to override the scale-derived size with a fixed pixel value. The bar is centered within its band.

:example{ name="vertical-fixed-width" showCode }

## Isometric

On an [isometric](/docs/guides/isometric) chart with `valueAxis="z"`, bars stand up off the floor as 3D columns, stacked by the chart.

:example{ component="Chart" name="isometric-stacked-columns" }
6 changes: 6 additions & 0 deletions docs/src/content/components/Calendar.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,3 +8,9 @@ related: [Month]
## Usage

:example{ name="basic" showCode }

## Isometric

On an [isometric](/docs/guides/isometric) chart, `z` stands each day up to its value.

:example{ name="isometric" }
26 changes: 26 additions & 0 deletions docs/src/content/components/Chart.md
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,32 @@ The same chart from long data needs no `series` at all — `c` names the layers,

:example{ name="mixed-marks-with-stack-long-data" }

## Isometric

`view={isometric}` draws the plot area as a floor seen from above at an angle, for a faux 3D look in any layer. See the [Isometric guide](/docs/guides/isometric) for the view options, height, text, and tooltips.

```svelte
<Chart view={isometric}>
```

:example{ name="isometric-heatmap" }

:example{ name="isometric-columns" }

:example{ name="isometric-stacked-columns" }

:example{ name="isometric-areas" }

:example{ name="isometric-scatter-3d" }

:example{ name="isometric-treemap" }

:example{ name="isometric-scatter" }

:example{ name="isometric-playground" }

:example{ name="isometric-pan-zoom" }

## 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.
Expand Down
14 changes: 14 additions & 0 deletions docs/src/content/components/Contour.md
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,20 @@ Filled contour bands of the same Maungawhau elevation data, colored by threshold

:example{ name="volcano-filled" showCode }

## Isometric terrain

On an [isometric](/docs/guides/isometric) chart, `z` raises each band. With `z="value"`, each band stands at its threshold, measured by `zScale`. Filled bands stack into terraces, and unfilled ones float as lines in the bands' colors. Drag to turn it.

```svelte
<Chart zDomain={extent(volcano.values)} zRange={[0, 100]} view={isometric}>
<Layer>
<Contour data={volcano.values} width={volcano.width} height={volcano.height} z="value" />
</Layer>
</Chart>
```

:example{ name="volcano-isometric" }

## Interactive controls

Adjust the number of **thresholds** and **blur** radius interactively.
Expand Down
6 changes: 6 additions & 0 deletions docs/src/content/components/GeoPath.md
Original file line number Diff line number Diff line change
Expand Up @@ -12,3 +12,9 @@ See the [Geo guide](/docs/guides/geo) for a full walkthrough of projections, fit
## Usage

:example{ name="tooltip" showCode }

## Isometric

On an [isometric](/docs/guides/isometric) chart, `z` stands each shape up off the floor. Here each state stands at its share of the 2020 presidential vote. Drag to turn it.

:example{ name="election-isometric" }
8 changes: 8 additions & 0 deletions docs/src/content/components/Line.md
Original file line number Diff line number Diff line change
Expand Up @@ -30,3 +30,11 @@ Use `stroke` with a data property name to color each line through the chart's co
Use a threshold scale to color lines based on value ranges.

:example{ name="color-via-threshold-scale" showCode }

## Isometric

On an [isometric](/docs/guides/isometric) chart, `z1` / `z2` raise each end of a line. A line from the floor up to a point is a stem:

```svelte
<Line x1="x" y1="y" x2="x" y2="y" z2="z" />
```
104 changes: 3 additions & 101 deletions docs/src/content/components/Pie.md
Original file line number Diff line number Diff line change
Expand Up @@ -13,106 +13,8 @@ See also: [PieChart](/docs/components/PieChart) for simplified examples

:example{ name="basic" showCode }

<!-- ## Examples
## Isometric

### Basic
On an [isometric](/docs/guides/isometric) chart, `z` stands every slice up, for a 3D pie or donut. Give an `ArcLabel` the same `z` and its callouts keep clear of the slices' sides. Drag to turn it.

:example{ name="basic" }

### Disable sorting

:example{ name="disable-sorting" }

### Partial range (Chart xRange)

:example{ name="partial-range-chart-xrange" }

### Partial range (range prop)

:example{ name="partial-range-range-prop" }

### Pad angle

:example{ name="pad-angle" }

### Pad angle (with inner radius)

:example{ name="pad-angle-with-inner-radius" }

### Inner radius

#### If value >= 1, value will be treated as discrete

:example{ name="inner-radius-positive" }

#### If value >= 0 and less than 1, value will be treated as a percentage of outerRadius

:example{ name="inner-radius-zero-one" }

#### If value less than 0, value will be treated as a offset of outerRadius

:example{ name="inner-radius-negative" }

### Outer radius

:example{ name="outer-radius" }

### Multiple (data prop)

:example{ name="multiple-data-prop" }

### Tweened

:example{ name="tweened" }

### Offset

:example{ name="offset" }

### default slot / render each Arc

:example{ name="default-slot-render-each-arc" }

### Labels

#### Centroid

:example{ name="labels-centroid" }

#### Centroid (multiple)

:example{ name="labels-centroid-multiple" }

### Outer

:example{ name="labels-outer" }

### Outer (with padding)

:example{ name="labels-outer-with-padding" }

### Outer Radial

:example{ name="labels-outer-radial" }

### Tooltip

:example{ name="tooltip" }

### Tooltip with Arcs (slot)

:example{ name="tooltip-with-arcs-slot" }

### Placement

#### Left

:example{ name="placement-left" }

#### Center

:example{ name="placement-center" }

#### Right

:example{ name="placement-right" } -->
:example{ name="isometric" }
4 changes: 4 additions & 0 deletions docs/src/content/components/Polygon.md
Original file line number Diff line number Diff line change
Expand Up @@ -30,3 +30,7 @@ Use `fill` or `stroke` with a data property name to color each item through the
Use a threshold scale to color items based on value ranges.

:example{ name="color-via-threshold-scale" showCode }

## Isometric

On an [isometric](/docs/guides/isometric) chart, `z` stands a polygon up into a prism. See the [isometric tree](/docs/components/Tree#isometric).
24 changes: 8 additions & 16 deletions docs/src/content/components/Spline.md
Original file line number Diff line number Diff line change
Expand Up @@ -13,44 +13,36 @@ See also: [LineChart](/docs/components/LineChart) for simplified examples

:example{ name="basic" showCode }

### Multiple lines (`z`)
### Multiple lines (`g`)

Set `z` to draw a separate line per distinct value, all from one mark — one line per series, without a mark each.
Set `g` to draw a separate line per distinct value, all from one mark — one line per series, without a mark each.

```svelte
<Chart {data} x="date" y="value" c="fruit" {cRange}>
<Spline stroke="fruit" />
</Chart>
```

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.
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. `g` resolves in order — this mark's `g`, the Chart's `g`, 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
<Chart {data} x="date" y="value" z="year" zDomain={[1940, 2024]} zRange={[0.1, 0.2]}>
<Spline opacity={(d) => context.zScale(d.year)} />
</Chart>
```

Set it explicitly when the grouping isn't the color — [parallel coordinates](#parallel-coordinates) groups by row (`z="index"`) while coloring by species.
Set it explicitly when the grouping isn't the color — [parallel coordinates](#parallel-coordinates) groups by row (`g="id"`) 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.
`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 `g`, the color resolves per line.

```svelte
<Spline stroke="fruit" />
```

### Per-segment styling

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:
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 `g` — each line is split into its own segments, so a function is the way to style a grouped `Spline` per line:

```svelte
<Spline z="year" class={(d) => (d.year === 2024 ? 'stroke-primary' : 'stroke-surface-content')} />
<Spline g="year" class={(d) => (d.year === 2024 ? 'stroke-primary' : 'stroke-surface-content')} />
```

:example{ name="stroke-grouping" }
Expand Down Expand Up @@ -86,7 +78,7 @@ When inside a `GeoProjection` context, Spline automatically renders as a project

### 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.
One line per row across an axis per dimension, from a single `Spline` grouped by `g`. 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" }

Expand Down
6 changes: 6 additions & 0 deletions docs/src/content/components/Tree.md
Original file line number Diff line number Diff line change
Expand Up @@ -12,3 +12,9 @@ related: []
### Playground

:example{ name="playground" }

## Isometric

On an [isometric](/docs/guides/isometric) chart, nodes can stand up as prisms (`Polygon`s with a `z`) over links lying on the floor.

:example{ name="isometric" }
Loading
Loading