# Final accessibility report

**Evidence classes (do not mix):**

| Class | What it is |
|---|---|
| Inherited Figma | P30 prompt/instructions in the Prompt Pack. Completed Figma P30 export **was not available**. The Figma canvas was **not** re-audited. |
| Application (Phase 7) | Runtime HTML/CSS/JS in CodeIgniter views. Checkpoints D and I. |
| Automated tests | `Phase7AccessibilityUnitTest`, `Phase7AccessibilityHttpTest` (15 P30 representative frames + dashboard). |
| Live browser | Chromium matrix (Checkpoint I) plus screenshots in `docs/phase7-audit/browser-qa/`. |

## Global runtime behaviour implemented

- Visible **2px** `:focus-visible` ring using a CSS variable; 2px offset where appropriate.
- Skip link is the first focusable control and targets `#main-content`.
- Landmarks: header / nav / main / footer; one page `h1`.
- Labels associated with controls; Company, Plant and Role selectors have accessible names.
- Errors associated with `aria-describedby`; failed submit focuses the error summary where that pattern exists.
- Status text is always present; information is not colour-only.
- Closed mobile drawer uses `inert` and is removed from the focus order.
- `prefers-reduced-motion` supported.
- Mobile touch targets ≥44×44 on hamburger and required actions.
- Semantic tables; numeric headers use tabular numbers.
- Overlay/dialog: initial focus, Tab cycle, restore to trigger, Cancel/Close keyboard accessible.
- Scrim/Escape only where the approved overlay allows it (`data-overlay-dismiss`).
- Permission-denied actions are absent. Status-blocked actions use `aria-disabled="true"` on a non-submitting control, intercept activation, and expose a full-sentence `aria-describedby` reason (P7-D4).

## Original 15 P30 representative frames (application evidence)

| Frame | Runtime evidence |
|---|---|
| D-CHL-SCR-002-Create-Error | `data-error-summary`, skip link |
| D-CHL-SCR-002-Create-Approved | CHL-SCR-002, separate invoice approval copy |
| D-INV-SCR-003-Review-PendingIRN | INV-2026-000119, `#main-content` |
| D-INV-SCR-008-Create-IRNFailed | Record IRN Outcome, Asia/Kolkata |
| D-INV-SCR-008-Create-PermissionRestricted | cannot record IRN details (action absent) |
| D-DSP-SCR-003-Review-PermissionRestricted | Disposition Resolution restricted copy |
| D-IAM-SCR-001-Edit-PermissionRestricted | Ungrantable options visible; `aria-label="Active role"` |
| D-RPT-SCR-006-Report-Default | Company/Plant name, 116.000 MT |
| T-RPT-SCR-006-Report-Default | inventory-scroll, tabindex, Closing |
| M-CHL-SCR-002-Create-Error | viewport-mobile, error summary, inert drawer |
| D-AUD-SCR-001-View-Default | Audit table |
| D-WST-SCR-001-Create-Draft | OV-15, Escape allowed |
| D-CMP-SCR-002-Edit-PermissionRestricted | OV-12, Escape allowed |
| D-DSH-SCR-001-View-Error | `role="alert"` dashboard error (not a form error-summary) |
| Dashboard `/` (15th surface) | skip link + `#main-content` without `?frame=` |

Figma annotations are **not** treated as runtime proof.
