Rendering

Canvas, server rendering, size, and the subpaths that bring d3 in.

How a chart is drawn

compileChart(definition, { width, height }) is pure: the marks declare channels, the channels resolve the scales, the axes are measured and laid out, and each mark returns scene nodes and focusable points. The scene is plain data with stable keys. The SVG renderer and the Canvas renderer draw the same scene; hit-testing, keyboard focus, the tooltip and the data table all read it, never the DOM.

Canvas

For thousands of marks, paint on a canvas. Nothing else changes.

Arrow keys to move through the values, Enter to pin, Escape to leave.
Data: Bookings per day, on a canvas
dayBookings
1 January 202620
2 January 202623
3 January 202626
4 January 202629
5 January 202632
6 January 202635
7 January 202638
8 January 202627
9 January 202630
10 January 202632
11 January 202635
12 January 202637
13 January 202640
14 January 202642
15 January 202630
16 January 202632
17 January 202634
18 January 202635
19 January 202637
20 January 202639
21 January 202640
22 January 202627
23 January 202628
24 January 202630
25 January 202631
26 January 202632
27 January 202633
28 January 202633
29 January 202620
30 January 202621
31 January 202622
1 February 202623
2 February 202624
3 February 202625
4 February 202626
5 February 202613
6 February 202614
7 February 202616
8 February 202617
9 February 202619
10 February 202620
11 February 202622
12 February 202610
13 February 202612
14 February 202614
15 February 202616
16 February 202619
17 February 202621
18 February 202624
19 February 202613
20 February 202615
21 February 202618
22 February 202621
23 February 202624
24 February 202627
25 February 202630
26 February 202619
27 February 202623
28 February 202626
1 March 202629
2 March 202632
3 March 202635
4 March 202638
5 March 202627
6 March 202629
7 March 202632
8 March 202635
9 March 202637
10 March 202640
11 March 202642
12 March 202630
13 March 202632
14 March 202634
15 March 202636
16 March 202637
17 March 202639
18 March 202640
19 March 202628
20 March 202629
21 March 202630
22 March 202631
23 March 202632
24 March 202633
25 March 202634
26 March 202621
27 March 202622
28 March 202623
29 March 202624
30 March 202625
31 March 202626
1 April 202627
2 April 202614
3 April 202615
4 April 202616
5 April 202617
6 April 202619
7 April 202621
8 April 202622
9 April 202610
10 April 202612
11 April 202614
12 April 202616
13 April 202619
14 April 202621
15 April 202624
16 April 202612
17 April 202615
18 April 202618
19 April 202621
20 April 202624
21 April 202627
22 April 202630
23 April 202619
24 April 202622
25 April 202625
26 April 202628
27 April 202631
28 April 202634
29 April 202637
30 April 202626
import { CanvasRenderer } from "@voila.dev/chart/canvas";
 
<Chart definition={definition} ariaLabel="…" renderer={CanvasRenderer} />;

Colours stay CSS (var(--chart-1), color-mix(…)): the canvas resolves them against the page and repaints when the theme changes.

Server rendering

The server and the first client render lay out with the same width (initialWidth, 640 by default) and the same text-width estimate, so the hydrated markup always matches. Real text metrics and the measured width follow right after.

Size

A line chart with its tooltip, keyboard focus and data table is about 16 KB gzip. Facets and the brush ship only with the charts that use them. The core has no dependency; the heavy layouts reuse d3, each behind its own subpath, so a page without a map never loads d3-geo:

SubpathBrings
@voila.dev/chart/contourd3-contour
@voila.dev/chart/voronoid3-delaunay
@voila.dev/chart/hierarchyd3-hierarchy
@voila.dev/chart/sankeyd3-sankey
@voila.dev/chart/forced3-force
@voila.dev/chart/geod3-geo