Accessibility.
WCAG 2.2 AA as the floor, AAA on body text where achievable. Focus rings are 2px Werklist Blue with 2px offset. Every transition respects prefers-reduced-motion globally.
13.1
Target
WCAG 2.2 · AA
AA is the minimum. AAA applies to body prose. The placeholder gray #A0A0A8 is borderline AA and must only be used for placeholder input text. never body.
13.2
Contrast
Full matrix lives on /color. Highlights below.
#1863DC#FFFFFF4.89:1AA body · AAA large
#FFFFFF#03058514.7:1AAA all sizes
#52525B#FFFFFF8.17:1AAA all sizes
#A0A0A8#FFFFFF3.05:1Placeholder only
#B91C3A#FFFFFF6.02:1AAA all sizes
13.3
Focus ring
Focus ring specification
/* Light surfaces */
outline: 2px solid #1863DC;
outline-offset: 2px;
border-radius: inherit;
/* Dark surfaces */
outline: 2px solid #FFFFFF;
outline-offset: 2px;Never remove focus styling without replacing it with an equivalent affordance. Applied via :focus-visible globally in globals.css.
13.4
Keyboard
- All interactive elements are tab-navigable.
- Skip-link at top of every page jumps to main content.
- Modal and dropdown trap focus. Escape closes.
- Enter / Space activate buttons. Enter submits forms.
13.5
Screen readers
- Every form input has a visible <label> + aria-describedby for helper / error text.
- Icon-only buttons have aria-label.
- Live regions (role="status" / role="alert") for async feedback.
- Landmark roles on every page: header, nav, main, footer.
13.6
Reduced motion
Applied globally. not per-component.
globals.css
@media (prefers-reduced-motion: reduce) {
*, *::before, *::after {
animation-duration: 0.01ms !important;
animation-iteration-count: 1 !important;
transition-duration: 0.01ms !important;
scroll-behavior: auto !important;
}
}