Every line is a test in three engines or a gate on every commit. The gaps are listed the same way, each with the requirement that will close it.
MeasuredARIA pattern named in the class JSDoclibs/components/table/src/table.ts
MeasuredKeyboard map tested key by keythe table above — every row measured in apps/sandbox-e2e/src/table.spec.ts
Measuredaxe audit on the component's own sandbox viewapps/sandbox-e2e/src/a11y.spec.ts — /table in SBX_ROUTES, the overflowing frame included
MeasuredVisual screenshotapps/sandbox-e2e/src/visual.spec.ts — table-pattern and table-pattern-rtl
Measuredforced-colors: active — no state carried by colour alonelibs/components/table/src/header.scss, cell.scss, frame.scss — the lines CanvasText, the focus Highlight; the sorted column keeps its chevron, a drawing. The reading: apps/sandbox-e2e/src/forced-colors.spec.ts
n/aprefers-reduced-motion — duration from a tokennot applicable — no motion at all
MeasuredTouch target ≥ 24×24 px outrightlibs/components/table/src/header.scss — min-block-size: var(--pct-table-toggle-target-min) on the sort button, which fills its cell; measured in apps/sandbox-e2e/src/target-min.spec.ts
MeasuredSize axis aligned to --pct-control-height-*deliberately not: a cell is not a control, and a table is sized by its type and the spacing scale, as the badge is by its own
MeasuredDensity axislibs/tokens/src/component.table.json — the padding stands on space.3 and space.4, which the compact scope re-points; the sort button in apps/sandbox-e2e/src/density.spec.ts
MeasuredRTL — no physical properties + a dir="rtl" screenshotlogical properties only, held by check-styles; the screenshot table-pattern-rtl, where the caption and the text move to the right and the numbers to the left
MeasuredSSR + hydration with no NG05xxapps/sandbox-e2e/src/hydration.spec.ts — /table in SBX_ROUTES; the frame measures after render, so the server writes no region
n/aFormsnot applicable — a table holds no value a form owns
MeasuredParts registered in the inventorylibs/components/parts.snapshot.md — toggle, icon
MeasuredTokens registered + an entry in contrast.policy.jsonlibs/tokens/src/contrast.policy.json — seven entries: the text of a cell, the caption and a header cell (AA error), the sort hint's chevron (UI error), the header surface and both lines (UI warn); libs/tokens/tokens.snapshot.md
n/aStrings through PCT_TEXTSnot applicable — the component writes no word of its own
MeasuredEntrypoint size budgetlibs/components/size.snapshot.md — the ./table row
MeasuredScreen-reader logRead 2026-10-29 from docs/acr/at/ — three readers, whole sandbox. Each reader says part of a sort header: Orca both the header and the button, entering the table by its shape, table with 5 rows 3 columns · column header. · row 1. · column 1 · Name · button., then column header. · column 2 · Address · button.; NVDA the header alone, Address, column header, row 1, column 2, so under NVDA the sort is not announced as a control; VoiceOver the button alone, Address button. The overflowing frame is a named stop: NVDA Registers, region, VoiceOver main Registers region, Orca Registers. · clickable. — the name under all three, the role word under two. The press itself is not walked: aria-sort after a press is read by the e2e suite, not by a reader
MeasuredA docs page with live examplesapps/sandbox/src/app/views/table/ (the sandbox view). The published site: /components/table, its demo's source in the code tab
MeasuredUnit + mutationlibs/components/table/src/table.spec.ts; libs/components/mutation.snapshot.md — table.ts, measured by a narrow run