Accessibility

WCAG-AA, enforced — not aspired to

Accessibility is a build gate, not a review step. Contrast is computed from the tokens on every CI run (audit:contrast); a failing pairing fails the build.

Contrast matrix

The accent pairings the system guarantees in both themes. The last row is the guardrail — why a separate fill token exists.

Aa · book a call
white on accent-fillAA ✓
Aa · book a call
white on accent-fill-hoverAA ✓
Aa · book a call
accent-text on dark baseAA ✓
Aa · book a call
accent-text on white (light)AA ✓
Aa · book a call
white on accent-default (text)3.73:1 ✗
The guardrail in code: white text on --color-accent-default (blue-500) is only 3.73:1 — it fails AA. Solid text-bearing fills must use --color-accent-fill (blue-600). A call-site lint catches violations before they ship.
Interaction

Keyboard

Every interactive element is reachable and operable by keyboard. Focus order follows reading order; nothing is a trap.

Focus

Visible focus ring on every control — --color-accent-focus-ring, never removed without a replacement.

Reduced motion

All Motion wraps useReducedMotion(). Indian low-end devices often run battery-saver, which sets this — animation degrades to instant, never to broken.

Targets

Touch targets meet the minimum hit area; spacing tokens keep adjacent controls separable.

Inclusive language

Say what it does

“Book a call”, not “Submit”. “Download the audit”, not “Click here”.

No ableist metaphors

Avoid “sanity check”, “blind spot” as filler. Name the actual thing.

Plain over clever

A screen reader reads literally — clarity beats wordplay in UI labels.