Companion to the automated axe-core gate (ADR-0012). WCAG 2.1 AA is the bar. This checklist covers items that require human judgement — automated tooling reports zero violations and a human still needs to verify these.
- Every interactive element reachable by
Tab. -
Taborder matches visual reading order (top-to-bottom, with RTL flips whendir="rtl"). - No keyboard trap:
Escexits dialogs;Tabcycles inside modals only while open. - Focus is visible at every step (no
outline: nonewithout a replacement style). - Skip-to-content link works as the first focusable element on each page.
- Custom components (combobox, menu, tabs) follow ARIA Authoring Practices keyboard patterns.
- Reading order in English matches visual order with VoiceOver / NVDA / JAWS.
- Reading order in Arabic (RTL) matches visual order — verify with
lang="ar"+dir="rtl". - Headings form a coherent outline (no skipped levels; one
<h1>per page). - Landmarks present and labeled (
<main>,<nav>,<aside>,<footer>). - Live regions (
aria-live) announce notifications + form-submit results without spamming. -
aria-label/aria-labelledbyon icon-only buttons; the announcement makes sense in both languages.
- Opening a modal moves focus into it (typically the first focusable element or close button).
- Closing a modal returns focus to the element that triggered it.
- Background content has
inert/aria-hidden="true"while the modal is open. - Toasts / snackbars don't steal focus; they announce via
aria-live="polite"(orassertivefor errors).
- No information conveyed by color alone (e.g., red/green pairs always paired with text/icon).
- Charts use distinguishable patterns or labels in addition to color.
- Status indicators have a text or icon variant.
- Error states pair color with an
aria-invalidand a text message.
- All non-essential animation respects
prefers-reduced-motion: reduce. - Auto-playing carousels / loops are pausable (and don't loop more than 5s without an interaction option).
- No flashing / strobing content above WCAG seizure thresholds.
- Smooth-scroll respects reduced-motion preference.
- Every input has a visible label (not placeholder-only).
- Error messages programmatically associated (
aria-describedby) and announced on submit. - Required fields marked beyond visual asterisk (e.g.,
aria-required="true"+ text). - Field grouping uses
<fieldset>+<legend>where appropriate (radio sets, address blocks). - Validation triggers respect language: error text is in the user's selected language.
-
langattribute updated on language switch (root and any inline mixed-language content). - Numbers display per locale (Arabic-Indic vs Latin digits where applicable per design).
- Date/time formats locale-appropriate.
- Untranslated content doesn't crash the layout — fallback string shows clearly.
- Mixed-direction content uses
dir="auto"or explicitbdi/bdoto avoid garbled rendering.
- Tap targets ≥ 44 × 44 CSS px.
- No hover-only affordances (everything reachable on touch).
- Pinch-zoom not disabled (no
user-scalable=noin viewport meta). - Orientation changes don't trap users in an unusable layout.
- Run this checklist on every UI-touching PR that introduces a new screen or significantly changes an existing one.
- Re-run during sub-project DoD verification.
- Add items as new patterns emerge — this list is expected to grow.