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/pagination/src/pagination.ts
MeasuredKeyboard map tested key by keyapps/sandbox-e2e/src/pagination.spec.ts — 15 cases × 3 engines. The claim gated is "the platform does it": Tab walking every button one stop at a time (['1', '2', '3', 'next']), Enter and Space paging, and a disabled stepper refusing focus outright
Measuredaxe audit on the component's own sandbox viewapps/sandbox-e2e/src/a11y.spec.ts — /pagination in SBX_ROUTES, so the WCAG 2.2 AA sweep and the landmark audit both take it
MeasuredVisual screenshotapps/sandbox-e2e/src/visual.spec.ts — pagination-fold, the strip with both gaps and the current page marked
Measuredforced-colors: active — no state carried by colour alonelibs/components/pagination/src/pagination.scss — the current page has a fill and a text colour of its own, plus aria-current; the @media block is written out rule by rule (lesson-70). The reading: apps/sandbox-e2e/src/forced-colors.spec.ts — the current page comes back Highlight/HighlightText, a plain one CanvasText, a spent stepper GrayText
n/aprefers-reduced-motion — duration from a tokennot applicable — the component has no transition of its own. The chevron rotation is static.
MeasuredTouch target ≥ 24×24 px outrightlibs/components/pagination/src/pagination.scss — min-inline-size / min-block-size are --pct-pagination-item-target-min = {pct.target.min}, the floor outright. The reading: apps/sandbox-e2e/src/pagination.spec.ts, taken at the smallest size on the axis, where the height token comes closest to the floor
MeasuredSize axis aligned to --pct-control-height-*libs/tokens/src/component.pagination.json — item-height / -sm / -lg are {pct.control.height.*}, the token shared with the field and the button; driven by data-pct-size on the host
MeasuredRTL — no physical properties + a dir="rtl" screenshotlibs/components/pagination/src/pagination.scss — logical properties throughout; the chevron points by a symmetric quarter-turn so it needs no RTL rule. The screenshot: pagination-fold-rtl in visual.spec.ts; the geometry: apps/sandbox-e2e/src/rtl.spec.ts — the two steppers really change sides
MeasuredSSR + hydration with no NG05xxapps/sandbox-e2e/src/hydration.spec.ts — /pagination in SBX_ROUTES
n/aFormsnot applicable — a pager holds no value a form owns and implements no FormValueControl. page is application state, not a field.
MeasuredParts registered in the inventorylibs/components/parts.snapshot.md, tools/check-parts.mjs — the Parts row above
MeasuredTokens registered + an entry in contrast.policy.jsonlibs/tokens/src/contrast.policy.json — six entries; libs/tokens/tokens.snapshot.md
MeasuredStrings through PCT_TEXTSlibs/components/pagination/src/pagination.html reads paginationPrevious / paginationNext at render time; pagination.ts reads paginationLabel in the host binding. Swap test: providePctTexts over all three keys in libs/components/pagination/src/pagination.spec.ts
MeasuredEntrypoint size budgetlibs/components/size.snapshot.md — the ./pagination row
MeasuredScreen-reader logRead 2026-10-12 from docs/acr/at/ — three readers, whole sandbox. The landmark, the list and the current page all arrive: navigation · Pagination · List with 5 items · 1 · button. · (Current page) (Orca), and 1 current page button list 5 items from VoiceOver in the record of 2026-09-16 (543eacde); NVDA reads the others as 2, button and the step controls by their label, Next page, button — a name a reader can act on rather than a glyph. VoiceOver leaves after one stop here, and on 2026-10-12 said only its own hint on the way out
MeasuredA docs page with live examplesapps/sandbox/src/app/views/pagination/ (the sandbox view). The published site: /components/pagination — prerendered, the demo's own source is the code tab
MeasuredUnit + mutationlibs/components/pagination/src/pagination.spec.ts — 36 cases; libs/components/pagination/src/pagination.property.spec.ts — seven laws over the fold, 120 cases each, read from the DOM: the numbers and the folded runs covering 1..count exactly once, the window following the page within siblingCount, boundaryCount pinned at each end in order, a gap never standing for one page, the width the identity min(count, 2b + 2s + 3), and a stepper spent exactly at its end; libs/components/mutation.snapshot.md — pagination.ts at 96.43, the four survivors equivalent (two sets of a value already held, and range's guard that Array.from already keeps). The sweep moved that score by nothing, and the row is the honest case for why a property is not only a mutant-killer: the laws it added say what the two counts MEAN, and Stryker throws no mutant that asks. pagination.types.ts has no row and needs none: it is a type alias, struck from the measurement by the *.types.ts pattern