wcag-accessibility
UI must comply with WCAG 2.2 Level AA, as required by the European Accessibility Act (EN 301 549). Do not deviate without deliberate justification. Disabled UI elements are explicitly exempt from colour contrast requirements. Use when designing, building, or reviewing any user-facing interface for a
By dembrandt · 643 installs
npx skills add dembrandt/dembrandt-skills --skill wcag-accessibility
Source repository · Upstream listing
WCAG Accessibility (EN 301 549 / European Standard)
The Standard
The European Accessibility Act (EAA) requires digital products and services in the EU to meet EN 301 549 , which references WCAG 2.2 Level AA as the technical baseline. This is not optional — it is a legal requirement for products operating in the EU market.
Default: always build to WCAG 2.2 AA. Deviating requires explicit, documented justification. Do not skip accessibility requirements because of timeline pressure or design preference.
WCAG 2.2 AA organises requirements under four principles: Perceivable, Operable, Understandable, Robust .
Perceivable
Users must be able to perceive all content and UI components.
Colour Contrast
Context Minimum ratio Enhanced (AAA)
Normal text (< 18pt / < 14pt bold) 4.5 : 1 7 : 1
Large text (≥ 18pt / ≥ 14pt bold) 3 : 1 4.5 : 1
UI components and graphical objects 3 : 1 —
Check contrast on the real rendered page, not the spec (dembrandt engine, optional). Design time swatches lie once real text lands on real backgrounds, gradients, and overlays. get findings / render report run against the live DOM and surface the actual failing text/background pairs with their measured ratios — a fast way to catch the combinations a static palette review misses. See [ extract design ](../extract design/SKILL.md).
Disabled elements are exempt. WCAG explicitly excludes inactive UI components from contrast requirements (WCAG 1.4.3 exception). A disabled button may use low contrast text — this is intentional and correct, as it communicates the unavailable state.
Do not use colour as the only means of conveying information (e.g. a red border alone to indicate an error — add an icon or text label).
Text Alternatives
Every meaningful image needs alt text describing its content or function
Decorative images use alt="" so screen readers skip them
Icons used as buttons need an accessible label: aria label or visually hidden text
Charts and data visualisations need a text summary or data table alternative
Captions and Transcripts
Video content needs captions
Audio only content needs a transcript
Operable
Users must be able to operate all UI components.
Keyboard Navigation
All interactive elements must be reachable and operable by keyboard alone.
Every button, link, input, and control must receive focus via Tab
Focus order must follow the visual reading order of the page
No keyboard traps — users must be able to navigate away from any component
Modal dialogs must trap focus inside while open, and return focus to the trigger element on close
Focus Visibility
A visible focus indicator is required on every interactive element (WCAG 2.2 strengthens focus visibility requirements).
Never use outline: none without providing a custom focus style. The focus ring is not a design problem to eliminate — it is a navigation tool.
Touch Target Size
Interactive elements on touch devices must be at least 24×24px (WCAG 2.2) — 44×44px is the recommended comfortable minimum (Apple HIG, Material Design). Small icon buttons need padding to reach this size even if the visual icon is smaller.
No Seizure Triggers
Nothing on screen should flash more than 3 times per second.
Skip Links
Pages with repeated navigation must provide a "Skip to main content" link as the first focusable element, so keyboard users can bypass navigation on every page.
Understandable
Users must be able to understand the content and how the UI works.
Language
Set lang attribute on the <html element: <html lang="fi" or <html lang="en"
Mark inline content in a different language with lang on that element
Labels and Instructions
Every form input must have a visible label — not just a placeholder (placeholders disappear on input)
Required fields must be indicated — do not rely on colour alone; add an asterisk and a legend
Error messages must be associated with their input via aria describedby
Predictability
Components that look the same must behave the same (see Consistency and Standards)
Navigation must appear in the same location across pages
Opening a new tab or window must be communicated in advance
Error Identification
Form validation errors must identify which field failed
Errors must be described in text — not only by colour or icon
Robust
Content must be interpreted reliably by assistive technologies.
Semantic HTML
Use the correct HTML element for the job. Semantics convey role, state, and structure to screen readers for free.
ARIA — Use Sparingly
ARIA supplements HTML semantics where native elements fall short. It does not fix broken HTML.
Rule: no ARIA is better than incorrect ARIA. Incorrect ARIA actively breaks screen reader output.
Required patterns:
aria label or aria labelledby for components with no visible text label
aria expanded on toggles, accordions, and dropdowns
aria live regions for dynamic content updates (toast notifications, search results)
role="dialog" with aria modal="true" on modal overlays
aria current="page" on the active navigation item
Status Messages
Dynamic updates (success toasts, loading states, error counts) must be announced to screen readers via aria live or role="status" — they will not be announced automatically unless the focused element changes.
The Disabled Element Exception
WCAG 1.4.3 explicitly states: "Text or images of text that are part of an inactive user interface component… have no contrast requirement."
This means:
Disabled buttons, inputs, and links may use low contrast text and colours
The visual dimming of disabled states is both correct and compliant
Do not add artificial contrast to disabled elements — the reduced contrast communicates "this is unavailable"
Review Checklist
Area Check
Contrast All active text ≥ 4.5:1 (normal) or 3:1 (large/UI)
Contrast Disabled elements exempt — intentionally low contrast is fine
Colour Colour is never the only information carrier
Keyboard All interactive elements reachable and operable by keyboard
Focus Visible focus indicator on every interactive element
Touch Interactive targets ≥ 44×44px on touch surfaces
Labels Every input has a visible label (not just placeholder)
Errors Validation errors identify the field and describe the problem in text
HTML Semantic elements used correctly; ARIA only where needed
Language lang attribute set on <html
Skip link "Skip to main content" as first focusable element
Live regions Dynamic updates announced via aria live or role="status"