
wcag-accessibility
WCAG 2.2 AA compliance as required by the European Accessibility Act. Use when designing, building or reviewing any user-facing interface for accessibility.
- Installs
- 885
- Last 24h
- +8
- Trending rank
- #9818
- Security
- Not audited
Install
Works with every agent the skills CLI supports.
npx skills add https://github.com/dembrandt/dembrandt-skills --skill wcag-accessibility- 01
Install
Run the command in your project. The CLI asks which agents to install for.
- 02
Describe the task
Ask your agent for something this skill covers. It loads wcag-accessibility automatically when relevant.
- 03
Review the result
The agent follows the SKILL.md steps, scripts and references bundled with the skill.
SKILL.md
The instructions your agent reads when the skill is triggered.
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_reportrun 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. Seeextract-design.
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).
Weight is part of legibility, and the ratio cannot see it. The contrast formula measures ink colour against background colour and nothing else. It scores a hairline and a heavy weight identically at the same hue, while perceived legibility is the product of both. So the palette's faintest legible colour and the type scale's lightest weight must not land on the same text: a muted or secondary token, the one carrying captions, labels and helper text, takes a weight of at least 500 wherever the body default reads as regular or light. That floor is a house rule, not a WCAG requirement. The standard has nothing to say about weight, which is exactly why the failure gets through the audit. The same physics on dark surfaces is in [[color-mode-and-theme]]. A muted colour is already the palette's least assertive choice, and pairing it with the lightest weight compounds two decisions that both mean recede. The result at caption sizes is text a reader has to work at consciously, while the audit reports a pass.
Text Alternatives
- Every meaningful image needs
alttext describing its content or function - Decorative images use
alt=""so screen readers skip them - Icons used as buttons need an accessible label:
aria-labelor 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).
/* Minimum: do not remove focus outline without a replacement */
:focus-visible {
outline: 2px solid var(--color-focus);
outline-offset: 2px;
}
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
langattribute on the<html>element:<html lang="fi">or<html lang="en"> - Mark inline content in a different language with
langon 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.
<!-- Correct -->
<button>Save</button>
<nav aria-label="Main navigation">...</nav>
<h1>Page title</h1>
<!-- Wrong — requires manual ARIA to replicate what the element provides natively -->
<div onclick="save()">Save</div>
<div class="nav">...</div>
<div class="heading">Page title</div>
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-labeloraria-labelledbyfor components with no visible text labelaria-expandedon toggles, accordions, and dropdownsaria-liveregions for dynamic content updates (toast notifications, search results)role="dialog"witharia-modal="true"on modal overlaysaria-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" |
FAQ
What does the wcag-accessibility skill do?
WCAG 2.2 AA compliance as required by the European Accessibility Act. Use when designing, building or reviewing any user-facing interface for accessibility.
How do I install wcag-accessibility?
Run npx skills add https://github.com/dembrandt/dembrandt-skills --skill wcag-accessibility in your project. The skills CLI detects the agents you use and copies the skill into the right folder. For Claude Code you can also place the skill folder at ~/.claude/skills/wcag-accessibility/ (personal) or .claude/skills/wcag-accessibility/ (project).
Which AI agents can use wcag-accessibility?
Any agent that supports the open Agent Skills format (a folder with a SKILL.md file), including Claude Code, Codex, Cursor, GitHub Copilot, Gemini CLI, Windsurf, Cline, OpenCode and more.
Is wcag-accessibility safe to install?
No partner security audit is available yet. Skills can run commands and scripts, so read the SKILL.md and any bundled files before installing.
Who maintains wcag-accessibility?
It is published by dembrandt in dembrandt/dembrandt-skills. It has 885 recorded installs.
More from dembrandt/dembrandt-skills
nielsen-usability-heuristics
dembrandt/dembrandt-skills
Nielsen's 10 usability heuristics. Use when auditing an interface, designing interaction flows, writing error messages or reviewing usability.
performance-and-web-vitals
dembrandt/dembrandt-skills
Lighthouse audits and Core Web Vitals — LCP, CLS, INP. Use when optimising page load, layout shift, input delay, images, fonts or render-blocking resources.
color-mode-and-theme
dembrandt/dembrandt-skills
Light, dark or both, and when a theme selector is worth it. Use when defining a base palette or deciding on dark mode support.
ui-density
dembrandt/dembrandt-skills
Match information density to platform and user type. Use when designing data tables, dashboards or toolbars, or adapting a desktop product for mobile.
form-design
dembrandt/dembrandt-skills
Helper text, placeholders, validation and submit behaviour. Use when designing or reviewing a form, input field or data entry UI.
brand-visual-language
dembrandt/dembrandt-skills
Shape language across type, radius and icons carries brand personality. Use when starting a design system, picking icons or radius tokens, or reviewing visual consistency.
Popular frontend & design skills
setup-matt-pocock-skills
mattpocock/skills
Configure this repo for the engineering skills: set up its issue tracker, triage label vocabulary, and domain doc layout. Run once before first use of the other engineering skills.
frontend-design
anthropics/skills
Guidance for distinctive, intentional visual design when building new UI or reshaping an existing one. Helps with aesthetic direction, typography, and making choices that don't read as templated defaults.
hyperframes-animation
heygen-com/hyperframes
All animation knowledge for HyperFrames — atomic motion rules, multi-phase scene blueprints, scene transitions, broader motion-design techniques, AND the seven runtime adapters (GSAP default, plus Lottie, Three.js, Anime.js, CSS keyframes, Web Animations API, TypeGPU). Use for any motion or animation task: pick 2-4 rules and compose, or load a blueprint, or look up runtime-specific API (e.g. GSAP eases / Lottie player / Three.js mixer). Also covers auditing an existing composition's choreography (animation map) and 24 named text-animation effects. HyperFrames-native: single paused timeline, seek-safe, deterministic.
prototype
mattpocock/skills
Build a throwaway prototype to answer a design question. Use when the user wants to sanity-check whether a state model or logic feels right, or explore what a UI should look like.
hyperframes-core
heygen-com/hyperframes
The HyperFrames composition contract — build one renderable project. Use for composition structure, the data- timing attributes, class="clip", tracks, sub-compositions, variables, framework-owned media playback, deterministic-render rules, and validation. Read before writing composition HTML.
vercel-react-best-practices
vercel-labs/agent-skills
React and Next.js performance optimization guidelines from Vercel Engineering. This skill should be used when writing, reviewing, or refactoring React/Next.js code to ensure optimal performance patterns. Triggers on tasks involving React components, Next.js pages, data fetching, bundle optimization, or performance improvements.