# X_UI_CONTRAST_INSUFFICIENT

## Means

a brand palette pairing does not meet WCAG 2.2 AA

## Typical cause

a `defineTheme()` override whose RESOLVED channels — the app's overrides on top of the shipped palette — put a pairing in `CONTRAST_PAIRS` below its floor: 4.5:1 for text (WCAG 2.2 1.4.3), 3:1 for the focus ring (1.4.11), 1.4:1 for a border. Only pairings the brand can have CHANGED are measured, because blaming an app for the framework's own colours is how a rule gets switched off — and half a pairing is the usual defect: a new `accent` against the shipped white `accent-fg`. AA and never APCA: APCA is not a standard, and AA is the operative legal benchmark (EN 301 549, ADA Title II, the EAA)

## Fix

darken or lighten the named role's channels in `defineTheme({ colors: { <theme>: { '<role>': '<R G B>' } } })` until `contrastRatio()` answers the required number — `@ultimat3/ui` exports `contrastRatio` and `roleContrast` to measure a candidate before shipping it

[UI](/error-codes#ui)
