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.
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.
<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.
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
day
Bookings
1 January 2026
20
2 January 2026
23
3 January 2026
26
4 January 2026
29
5 January 2026
32
6 January 2026
35
7 January 2026
38
8 January 2026
27
9 January 2026
30
10 January 2026
32
11 January 2026
35
12 January 2026
37
13 January 2026
40
14 January 2026
42
15 January 2026
30
16 January 2026
32
17 January 2026
34
18 January 2026
35
19 January 2026
37
20 January 2026
39
21 January 2026
40
22 January 2026
27
23 January 2026
28
24 January 2026
30
25 January 2026
31
26 January 2026
32
27 January 2026
33
28 January 2026
33
29 January 2026
20
30 January 2026
21
31 January 2026
22
1 February 2026
23
2 February 2026
24
3 February 2026
25
4 February 2026
26
5 February 2026
13
6 February 2026
14
7 February 2026
16
8 February 2026
17
9 February 2026
19
10 February 2026
20
11 February 2026
22
12 February 2026
10
13 February 2026
12
14 February 2026
14
15 February 2026
16
16 February 2026
19
17 February 2026
21
18 February 2026
24
19 February 2026
13
20 February 2026
15
21 February 2026
18
22 February 2026
21
23 February 2026
24
24 February 2026
27
25 February 2026
30
26 February 2026
19
27 February 2026
23
28 February 2026
26
1 March 2026
29
2 March 2026
32
3 March 2026
35
4 March 2026
38
5 March 2026
27
6 March 2026
29
7 March 2026
32
8 March 2026
35
9 March 2026
37
10 March 2026
40
11 March 2026
42
12 March 2026
30
13 March 2026
32
14 March 2026
34
15 March 2026
36
16 March 2026
37
17 March 2026
39
18 March 2026
40
19 March 2026
28
20 March 2026
29
21 March 2026
30
22 March 2026
31
23 March 2026
32
24 March 2026
33
25 March 2026
34
26 March 2026
21
27 March 2026
22
28 March 2026
23
29 March 2026
24
30 March 2026
25
31 March 2026
26
1 April 2026
27
2 April 2026
14
3 April 2026
15
4 April 2026
16
5 April 2026
17
6 April 2026
19
7 April 2026
21
8 April 2026
22
9 April 2026
10
10 April 2026
12
11 April 2026
14
12 April 2026
16
13 April 2026
19
14 April 2026
21
15 April 2026
24
16 April 2026
12
17 April 2026
15
18 April 2026
18
19 April 2026
21
20 April 2026
24
21 April 2026
27
22 April 2026
30
23 April 2026
19
24 April 2026
22
25 April 2026
25
26 April 2026
28
27 April 2026
31
28 April 2026
34
29 April 2026
37
30 April 2026
26
Drag across the chart, or use the handles from the keyboard.
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.