Guides
Accessibility
Accessibility is built into Flint's tokens, not added at the end. The build enforces most of it; the rest is up to each screen.
What Flint guarantees
| Area | Guarantee | WCAG |
|---|---|---|
| Text contrast | Every semantic text pairing clears 7:1 in light and dark. The build fails otherwise. | 1.4.3, 1.4.6 |
| Non-text contrast | Control edges, focus rings and chart marks clear 3:1. | 1.4.11 |
| Focus | A solid 2px ring, offset 2px, in the focus color. Never removed, never transparent. | 2.4.7, 2.4.11 |
| Target size | 24px minimum as a token. Density can't shrink it. 44pt on iOS. | 2.5.8 |
| Motion | Every animation has a reduced-motion version; Swift's helper returns none when Reduce Motion is on. | 2.3.3 |
| Text size | Nothing below 12px. Swift type styles scale with Dynamic Type. | 1.4.4 |
Flint holds text to AAA internally. Its published claim stays WCAG 2.2 AA. An AAA token pass is not a AAA conformance claim.
Annotate every screen
Every new screen or component ships with notes engineering can build from without guessing:
- Landmarks: header, nav with a label, main, footer.
- Accessible names for icon-only controls.
- States:
aria-current="page"for nav,aria-selectedfor tabs and options,aria-pressedfor toggles,aria-expandedfor anything that opens. - Live regions:
role="status"for progress and counts,role="alert"for errors. Keep them in the page, empty when unused. - Focus order, and where focus goes when something opens or closes.
- What each animation becomes under reduced motion.
Focus
- Skip links and same-page links move focus to the destination heading, not just the scroll position.
- On a field error, focus moves to the first field with an error.
- Dialogs trap focus inside and return it to the control that opened them.
- Icons inside a labeled control are
aria-hidden, so they aren't read twice.
How to test
- Run the build. Contrast, usage and parity checks must pass.
- Walk the component in the workbench: every state, light and dark, both densities.
- Use it with a keyboard only.
- Use it with VoiceOver or NVDA only. If someone can't finish the task that way, it isn't done.