<Tally> renders the ARIA grid pattern, runs fully from the keyboard and announces the result of every query change through a live region. This page lists what the component does, so you can test against it and extend it.
Name the grid
label is the accessible name of the grid. It is also the name of the cards region on narrow screens and of exported CSV files.
Roles
aria-rowcount is -1 while the total is unknown and while the grid is grouped. Rows are virtualized, so aria-rowindex and aria-colindex carry the real positions.
Focus
The grid is one tab stop. Focus stays on the viewport and the active cell is exposed througharia-activedescendant, so screen readers follow it while the DOM focus does not move. Tabbing into the grid with the keyboard focuses the first cell when none is active.
Every key in Intents works without a mouse: moving, extending ranges, editing, copying, undoing, selecting rows and expanding tree rows. Tab on the first or last column leaves the grid. Resize handles are focusable, and Left and Right resize the column by 8 pixels.
Buttons, chips, menu triggers, row checks, cards and resize handles draw a focus ring on :focus-visible. The ring color is --tally-ring. See Theming.
Announcements
A visually hidden live region withrole="status", aria-live="polite" and aria-atomic="true" speaks what changed. It waits for the query to finish and then reads the change and the new row count together.
Several changes in one step are read together, such as
Sorted by MRR descending. Filtered by plan is pro. 42 rows. The filter is read in its canonical query language form. A message equal to the previous one is still read again.
Every message is a label, so it can be reworded or translated through labels.
accounts.tsx
Reduced motion
Underprefers-reduced-motion: reduce, the stylesheet turns off the loading bar animation, row and detail sheet transitions, chip and column entrance animations, skeleton shimmer and the switch transition. The text decode effect on the row count, the filter bar and AI cells shows the final text at once.
Icons and decoration
Icons arearia-hidden. Avatars, tiles, sparklines and meters are aria-hidden too; the cell text carries the value. A custom renderer should keep a readable text value in the cell for the same reason. See Custom renderers and editors.