Accessibility
Accessibility isn't a feature we add later. It's a constraint that shapes every decision below — and a floor we don't go under.
Standards#
- WCAG 2.2 AA is the minimum for all production surfaces.
- Color contrast: text over
bgandsurfacehits 4.5:1 or better. Large text (18 px bold / 24 px regular) hits 3:1. Trust badges clear both against their backgrounds. - Focus: every interactive element has a visible focus ring (2 px teal, 2 px offset). Focus is never removed for “cleanliness”.
- Keyboard: every feature is reachable with Tab, Enter, and Space. Skip links precede the main nav on every page.
- Motion: all animations and transitions shorten to ≤1 ms under
prefers-reduced-motion: reduce. No exceptions.
Per-component checklist#
When a component changes, verify:
- [ ] Has a visible focus ring on all interactive parts.
- [ ] Has a screen-reader-accessible label (text,
aria-label, oraria-labelledby). - [ ] Doesn't rely on color alone to convey state (active, error, success all have text or icon).
- [ ] Keyboard-navigable — Tab order is natural, Enter/Space activates.
- [ ] Hits contrast on both light and dark themes.
- [ ] Works when
prefers-reduced-motion: reduceis set — visuals still make sense without motion. - [ ] Tooltips and popovers open on focus, not only on hover.
Testing#
- Manual keyboard pass. Tab through the page with no mouse. Anything unreachable or unclearly focused is a bug.
- axe DevTools or equivalent. Ship zero serious violations. Track the moderate ones.
- VoiceOver / NVDA spot check. Once per release pass, navigate a representative flow with a screen reader. Ownership types, trust tiers, and prices must announce clearly.
- Reduced-motion verification. Toggle the OS preference. Static states must still be comprehensible — if a skeleton isn't visible without shimmer, add a subtle static fill.
Things we never do#
- Remove focus styles for design reasons.
- Put action in a tooltip (tooltip is for explanation; action has its own control).
- Use placeholder as label — placeholders disappear on type and don't read to assistive tech.
- Rely on hover for discoverability. Hover doesn't exist on touch, and keyboard users don't hover.
- Conflate disabled with read-only. Disabled removes from tab order; read-only does not.
Known gaps#
Tracked in the changelog. If you hit an accessibility bug that isn't listed there, file it.