<!-- Auto-generated by `velinstyle docs generate`. Do not edit. Source: core/a11y + src/a11y -->

# WCAG 2.2 AAA framework matrix

> **Using VelinStyle does not certify your application.** This matrix tracks what the **framework** provides by default.

Framework target: **WCAG 2.2 Level AAA** (token defaults + component contracts).

## Success criteria
| Criterion | Level | Name | Owner | Status | Test |
| --- | --- | --- | --- | --- | --- |
| 1.3.1 | A | Info and Relationships | Author + CSS | partial | `scan-a11y` |
| 1.4.3 | AA | Contrast (Minimum) | Tokens | pass | `test:contrast` |
| 1.4.6 | AAA | Contrast (Enhanced) | Tokens | pass | `test:contrast` |
| 1.4.11 | AA | Non-text Contrast | Tokens + WC | partial | `test:a11y` |
| 2.1.1 | A | Keyboard | Web Components | partial | `test:a11y` |
| 2.3.3 | AAA | Animation from Interactions | CSS + Motion | pass | `reduced-motion` |
| 2.4.1 | A | Bypass Blocks | CSS skip-link | pass | `scan-a11y` |
| 2.4.7 | AA | Focus Visible | CSS focus | pass | `test:a11y` |
| 2.4.11 | AA | Focus Not Obscured (Minimum) | CSS | pass | `focus-not-obscured` |
| 2.4.13 | AAA | Focus Appearance | CSS | pass | `focus-appearance` |
| 2.5.7 | AA | Dragging Movements | CSS + Sample | pass | `wcag22-dragging` |
| 2.5.8 | AA | Target Size | CSS + WC | pass | `target-size` |
| 3.2.6 | A | Consistent Help | CSS | pass | `consistent-help` |
| 3.3.2 | A | Labels or Instructions | Forms + WC | partial | `scan-a11y` |
| 3.3.7 | A | Redundant Entry | velin-persist + Author | partial | `velin-persist` |
| 3.3.8 | AA | Accessible Authentication | CSS + Sample | pass | `wcag22-auth` |
| 4.1.2 | A | Name, Role, Value | Web Components | partial | `contracts` |
| 4.1.3 | AA | Status Messages | Announcer + WC | pass | `live-regions` |
## Web component contracts
| Element | Status | Keyboard | Live region | Required attrs |
| --- | --- | --- | --- | --- |
| `<velin-accordion>` | pass | Arrow/Home/End between summaries | — | — |
| `<velin-announcer>` | pass | N/A | polite\|assertive | — |
| `<velin-bottom-nav>` | pass | Native links or buttons in slot | — | `aria-label` |
| `<velin-carousel>` | pass | Arrows, Home, End, dots | — | — |
| `<velin-code-block>` | pass | Expand toggle keyboard | — | — |
| `<velin-collapse>` | pass | Enter/Space on trigger | — | — |
| `<velin-combobox>` | pass | Roving, Escape, Enter | — | `aria-label` |
| `<velin-command>` | pass | Escape, arrows in results, Tab trap | — | — |
| `<velin-copy>` | pass | Native button | — | `aria-label` |
| `<velin-countdown>` | pass | N/A | polite | — |
| `<velin-counter>` | pass | N/A | polite | — |
| `<velin-dialog>` | pass | Native dialog, Escape | — | — |
| `<velin-drawer>` | pass | Escape, Tab trap | — | — |
| `<velin-dropdown>` | pass | Roving, typeahead, Escape | — | — |
| `<velin-email>` | pass | — | — | `aria-label` |
| `<velin-icon>` | pass | — | — | `label` |
| `<velin-lightbox>` | pass | Escape, arrows, Tab trap | polite | — |
| `<velin-live-dot>` | pass | — | — | — |
| `<velin-menubar>` | pass | Roving arrows | — | `aria-label` |
| `<velin-modal>` | pass | Escape, Tab trap | — | — |
| `<velin-persist>` | pass | N/A | — | — |
| `<velin-popover>` | pass | Escape, Enter/Space on trigger; focus opens hover mode | — | — |
| `<velin-progress-ring>` | pass | — | — | — |
| `<velin-rating>` | pass | Roving, arrows | — | — |
| `<velin-scroll-top>` | pass | — | — | `aria-label` |
| `<velin-scrollspy>` | pass | Native nav links | — | — |
| `<velin-search>` | pass | Arrows, Enter, Escape | — | `aria-label` |
| `<velin-secure-field>` | pass | — | — | — |
| `<velin-segmented-control>` | pass | Roving | — | `aria-label` |
| `<velin-sheet>` | pass | Escape, Tab trap | — | — |
| `<velin-sparkline>` | pass | — | — | `label` |
| `<velin-stepper>` | pass | N/A (display); pair with buttons calling next()/prev() | — | — |
| `<velin-tabs>` | pass | Roving, auto-select arrows | — | — |
| `<velin-theme-toggle>` | pass | Menu arrows, Escape | — | — |
| `<velin-toast>` | pass | Close button | polite\|assertive | — |
| `<velin-tooltip>` | pass | Escape, focusin | — | — |

Run `npm run test:a11y:coverage` for coverage score.
