diff --git a/docs/ACCESSIBILITY.md b/docs/ACCESSIBILITY.md index 63b36ea..7421d12 100644 --- a/docs/ACCESSIBILITY.md +++ b/docs/ACCESSIBILITY.md @@ -59,7 +59,8 @@ content/IA decision, not yet finalized — see `docs/PRD.md`, Open Items. ## Open Items - Whether any component will target AAA specifically, and which. -- Full accessibility test checklist / acceptance-criteria template for feature - issues (each feature issue's acceptance criteria should include at least one - accessibility-focused scenario, per the lightweight issue tracking approach in - `PROJECT.md`). +- Feature issues should draw their accessibility-focused acceptance criteria + from `docs/ACCESSIBILITY_CHECKLIST.md`, per the lightweight issue tracking + approach in `PROJECT.md`. The checklist itself still needs scripted/automated + coverage built out for its `(Script)`-tagged items (see that file's closing + notes). diff --git a/docs/ACCESSIBILITY_CHECKLIST.md b/docs/ACCESSIBILITY_CHECKLIST.md new file mode 100644 index 0000000..30f6d87 --- /dev/null +++ b/docs/ACCESSIBILITY_CHECKLIST.md @@ -0,0 +1,290 @@ +# WCAG 2.2 AA User Acceptance Checklist + +## Purpose + +This is the point-by-point acceptance checklist referenced as an open item in +`docs/ACCESSIBILITY.md`. It exists to make WCAG 2.2 AA compliance a series of +discrete, binary, testable checks rather than a general standard to keep in +mind. Every feature issue's acceptance criteria should draw from this list; +it is also the reference for manual QA passes and for scripting automated +coverage over time. + +## How to use this document + +Each item is written as a single **pass/fail check**, not a description of +the requirement — if you can't answer "pass" or "fail" for a page/component +without further interpretation, the item needs rewriting, not the page. + +Each item is tagged with: + +* **[SC x.x.x]** — the WCAG 2.2 success criterion it verifies, for traceability. +* **(Auto)** — mechanically checkable today by axe-core in CI + (`docs/CI_TESTING.md`) or by `html-validate`. +* **(Script)** — not covered by current tooling, but checkable by a + deterministic script/lint rule (DOM query, regex, computed-style check) + without a human in the loop. Candidates for future automation. +* **(Manual)** — requires a human, generally keyboard-only navigation and/or + a full JAWS pass per `docs/ACCESSIBILITY.md`'s process. Not realistically + scriptable. + +A page/feature is not "done" until every applicable item below is a pass — +this is a release gate, not a nice-to-have, per `docs/ACCESSIBILITY.md`. + +--- + +## Links + +* [ ] **(Script)** Every `` has a non-empty accessible name (text content, + `aria-label`, or `aria-labelledby`). [SC 2.4.4, 4.1.2] +* [ ] **(Manual)** Link text is understandable out of context (no bare + "click here" / "read more" / "learn more" without surrounding context that + disambiguates it programmatically, e.g. via `aria-label`). [SC 2.4.4] +* [ ] **(Script)** No `href="#"` or empty `href` used as a placeholder for + unshipped functionality. [Project rule, `docs/ACCESSIBILITY.md`] +* [ ] **(Script)** Every link that opens a new tab/window (`target="_blank"`) + has a visually-hidden text cue (e.g. "(opens in a new tab)") in its + accessible name. [SC 3.2.5 — best practice beyond the letter of AA] +* [ ] **(Auto)** Links are distinguishable from surrounding text by more than + color alone (underline or equivalent non-color indicator). [SC 1.4.1] +* [ ] **(Script)** No two links on the same page share identical accessible + names but point to different destinations. [SC 2.4.4] +* [ ] **(Manual)** Every link is reachable and operable via keyboard alone + (Tab to focus, Enter to activate). [SC 2.1.1] +* [ ] **(Auto)** Link has a visible focus indicator meeting the 3:1 contrast + minimum against adjacent colors, and is not fully suppressed + (`outline: none` with no replacement). [SC 2.4.7, 2.4.11] + +## Buttons + +* [ ] **(Script)** Every interactive-action element is a real `