Interaction

Keyboard, tooltip, legend, zoom, brush, small multiples and animation.

Keyboard and screen readers

Every chart is one tab stop. The arrows move along the values — on a chart with several series, a column is one stop and the other arrows move inside it — Home and End jump to the ends, Enter pins the tooltip and fires onSelect, Escape unpins and then leaves.

A live region reads the focused value ("March 2026: Projects 28, Bookings 25"), and a visually hidden table lists every value, so the numbers are never locked inside the picture. Turn the table off with dataTable={false} only when the page shows the same table.

Tooltip and legend

The tooltip follows the pointer and the keyboard. tooltip={false} turns it off; a function replaces its content. The legend appears when there is more than one series; each entry is a toggle that hides its series without moving the axes. legend={false} hides it, for a page that draws its own.

Zoom

<Chart zoom /> zooms a continuous x axis. The wheel zooms only while the chart has focus, so a page still scrolls past it; + and − zoom around the focused value, Shift and the arrows pan, a drag pans when zoomed, 0 or the reset button goes back. The live region says what is on show.

Tab in, then press +

Arrow keys to move through the values, Enter to pin, Escape to leave. + and − to zoom, Shift and the arrows to pan, 0 to reset.
Data: Bookings per day
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

Brush

brushX({ onBrush }) from @voila.dev/chart/brush selects a range of x by dragging — or, from the keyboard, with two sliders that sit outside the graphic where assistive tech can reach them.

Arrow keys to move through the values, Enter to pin, Escape to leave.
Data: Bookings per day
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

Drag across the chart, or use the handles from the keyboard.

Small multiples

facet({ values, marks }) draws the chart once per value, every cell on the same x, y and colour domains so the cells compare at a glance.

Arrow keys to move through the values, Enter to pin, Escape to leave.
Data: Projects per month, city by city
monthProjects
Paris · January 202624
Paris · February 202632
Paris · March 202630
Paris · April 202638
Paris · May 202646
Paris · June 202643
Lyon · January 202616
Lyon · February 202621.67
Lyon · March 202620.67
Lyon · April 202626.33
Lyon · May 202632
Lyon · June 202630.33
Nantes · January 20268
Nantes · February 202611.33
Nantes · March 202611.33
Nantes · April 202614.67
Nantes · May 202618
Nantes · June 202617.67

Animation

A data update — a new definition, a series toggled — tweens from what is on screen to the new scene: shapes move, new ones fade in, removed ones go at once. A resize snaps, and so does prefers-reduced-motion. animate={false} or a number of milliseconds changes it.