Wcag Accessibility logo

Wcag Accessibility

Organization
dembrandt
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.

Overview

Publisherdembrandt
Repositorydembrandt-skills
Skill namewcag-accessibility
Stars
169
Forks
21
Bundled files
Instructions only
LicenseMIT
Links
  • Markdown instructions

    A SKILL.md file the model loads on demand, so it only costs tokens when a request actually matches.

  • Works with any LLM

    AI skills are plain Markdown, not provider-specific code, so this works with GPT, Claude, Gemini, Grok, or a local model.

  • Self-contained

    Everything the model needs lives in the instructions — no extra files to sync.

  • Open source

    Published by dembrandt on GitHub. Read the source before you install it.

Installation

Install the Wcag Accessibility AI skill in TypingMind to use it with any LLM, or drop it into another agent that reads SKILL.md.

1

Install in TypingMind

TypingMind installs a skill straight from its GitHub folder — it reads SKILL.md, bundles the resource files, and stores the result locally.

  1. Open the app and go to Plugins → Skills.
  2. Choose "Install from GitHub".
  3. Paste the skill folder URL below and confirm.
    https://github.com/dembrandt/dembrandt-skills/tree/main/skills/wcag-accessibility
  4. Enable the skill in any chat where you want it available.
Plugins → Skills → Add skill → From GitHub URL, then paste the folder URL and press Continue.
2

Install in another agent

Any agent that reads the Agent Skills format can use this skill — copy the folder into that agent's skills directory.

Claude Code — .claude/skills
git clone --depth 1 https://github.com/dembrandt/dembrandt-skills.git /tmp/dembrandt-skills
mkdir -p .claude/skills
cp -r /tmp/dembrandt-skills/skills/wcag-accessibility .claude/skills/wcag-accessibility
Restart Claude Code after copying so it picks up the new skill.

Use it in TypingMind

Enable Wcag Accessibility in any TypingMind chat and the model takes it from there. Its name and description sit in the system prompt, and the moment a request matches, the model loads the full instructions itself — you never invoke it by hand, and it costs no tokens until it is actually used.

The model loads Wcag Accessibility on its own as soon as a request matches it.

Works with any AI model

AI skills are plain Markdown instructions rather than provider-specific code, so Wcag Accessibility is not tied to the model it was written for. Install it once in TypingMind and use it with GPT-5, Claude, Gemini, Grok, DeepSeek, Mistral, Llama, or a local model you run yourself — all on your own API keys.

  • Loaded only when it is needed

    The system prompt carries just the name and description. The instructions are fetched on the first matching request, so an idle skill costs nothing.

  • Switch models mid-chat

    Because the skill is instructions rather than code, changing model does not break it — the next model reads the same SKILL.md.

Skill instructions

This is the SKILL.md content the model loads. Read it before installing — a skill is instructions your model will follow.

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

ContextMinimum ratioEnhanced (AAA)
Normal text (< 18pt / < 14pt bold)4.5 : 17 : 1
Large text (≥ 18pt / ≥ 14pt bold)3 : 14.5 : 1
UI components and graphical objects3 : 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.

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 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).

css
/* 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 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.

html
<!-- 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-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

AreaCheck
ContrastAll active text ≥ 4.5:1 (normal) or 3:1 (large/UI)
ContrastDisabled elements exempt — intentionally low contrast is fine
ColourColour is never the only information carrier
KeyboardAll interactive elements reachable and operable by keyboard
FocusVisible focus indicator on every interactive element
TouchInteractive targets ≥ 44×44px on touch surfaces
LabelsEvery input has a visible label (not just placeholder)
ErrorsValidation errors identify the field and describe the problem in text
HTMLSemantic elements used correctly; ARIA only where needed
Languagelang attribute set on <html>
Skip link"Skip to main content" as first focusable element
Live regionsDynamic updates announced via aria-live or role="status"

Frequently asked questions

What does the Wcag Accessibility AI 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.

Why use Wcag Accessibility on TypingMind?

Because you install it once and use it with any model. Wcag Accessibility is plain Markdown rather than provider-specific code, so the same skill runs on GPT-5, Claude, Gemini, Grok, or a local model — and you can switch model mid-chat without it breaking. TypingMind runs on your own API keys, so you pay providers directly instead of a per-seat subscription, and your skills and chats stay in your own storage.

How do I install Wcag Accessibility in TypingMind?

Open Plugins → Skills → Install from GitHub in TypingMind and paste https://github.com/dembrandt/dembrandt-skills/tree/main/skills/wcag-accessibility. TypingMind reads its SKILL.md and installs it as a skill you can enable per chat.

Which AI models can use Wcag Accessibility?

Any model you connect in TypingMind. AI skills are plain Markdown instructions rather than provider-specific code, so GPT, Claude, Gemini, Grok, and local models can all load this skill when a request matches it.

How many AI models can I use with Wcag Accessibility?

As many as you like. As long as a model supports skills, you can use Wcag Accessibility with it — GPT, Claude, Gemini, Grok, DeepSeek, Mistral, Llama and more — all on TypingMind with your own API keys.

Is the Wcag Accessibility AI skill free?

Yes. It is published on GitHub by dembrandt under the MIT license. You only pay your own AI provider for the tokens you use.

What are AI skills?

An AI skill is a reusable instruction bundle that teaches an AI model how to do one specific task. It follows the open Agent Skills format: a SKILL.md file with a name and description, plus any scripts, templates or reference files the model may need. The model reads the instructions only when your request matches the skill, so an installed skill costs nothing until it is used.

How are AI skills different from plugins or MCP servers?

A plugin or MCP server gives a model new tools to call — code that runs somewhere and returns a result. An AI skill gives the model knowledge and process instead: how to approach a task, which steps to follow, what good output looks like. Skills are plain Markdown, so they need no server, no API key and no runtime, and they work with any model.

View all

Set up your own AI workspace now

Get notified about new features and future giveaways by subscribing to our newsletter 👇