web-accessibility
Skill1 starsChanged 7 days agoMITView on GitHub
Build, review, fix, and test web user interfaces for accessibility against WCAG 2.2 Level A and AA, using semantic HTML, the WAI-ARIA Authoring Practices, keyboard and focus management, and automated plus manual checks. Use when: accessibility or a11y work; WCAG 2.2 conformance; accessibility audit or code review; screen reader or keyboard support; focus management; color contrast; accessible forms, error messages, or login; ARIA roles, names, and states; dialogs, menus, tabs, or other custom widgets; axe, jest-axe, cypress-axe, Playwright axe, Storybook a11y, or Lighthouse accessibility findings.
19 other projects use a version of this.
Adopted by
Most recently taken up by
- aktsmm/Agent-Skillstheir own version, first seen Nov 8, 2026
- Shui-Ching/skillstheir own version, first seen Nov 8, 2026
- reddygopalkrishna/developer-agent-skillstheir own version, first seen Nov 8, 2026
- Lukk17/agent-standardstheir own version, first seen Nov 7, 2026
- ziniman/ai-instructtheir own version, first seen Nov 1, 2026
- neijix/AICodeFactorytheir own version, first seen Nov 1, 2026
Used with
Projects with it also use web-performance, api-design and 1 more.
Other files people use alongside this one.
Files found in the same public projects as a version of this one, more often than they turn up anywhere else. Each project counts once, large collections count for less, and this file's own repository is left out.
MRCalderon3DSkillweb-performance
Keep a browser game inside its frame budget through allocation discipline, pooling, and devtools-driven profiling.
Also in 3 projects that use this
MicrosoftSkillapi-design
Guide for designing and documenting RESTful APIs. Use when asked to design an API, create endpoints, or document an API.
Also in 3 projects that use this
SentrySkillsecurity-review
Finds exploitable application security vulnerabilities in code changes. Use for Warden security scans, appsec review, OWASP-style checks, authentication or authorization bugs, injection, XSS, SSRF, path traversal, secrets, unsafe crypto, webhook verification, open redirects, or sensitive data exposure.
Also in 3 projects that use this
Other versions19 projects use a version of this.
Word for word · 0
None found.
Edited · 0
None found.
Wrote their own version · 19
- hoodini/ai-agents-skills★ 295same name
- magnus919/agent-skills★ 172same name
- ziniman/ai-instruct★ 29same name
- aktsmm/Agent-Skills★ 26same name
- s-hiraoku/synapse-a2a★ 17same name
- reddygopalkrishna/developer-agent-skills★ 8same name
- chadixearth/graphyloop★ 3same name
- 1leyo/web-accessibility-skill★ 2same name
- Adhamxon/claude-code-skills★ 2same name
- Makiya1202/ai-agents-skills★ 2same name
9 more not listed
How matches are found. Word for word: the exact same text. Edited: shares passages with this file (“99% same” means 99% of its five-word phrases also appear here; 10% or more counts). Their own version: similar meaning, or, weakest, the same name. We can’t tell which project had it first. Projects are counted among the 200 most-starred candidates, and mentions are links to the repository we found, up to 50 per site, so both counts are a floor.
In this repository5 other files it gives its agents.
- bem-cssSkill
- chrome-validationSkill
- cleaner-commitsSkill
- create-better-skillSkill
- jest-coverageSkill
The file
We split this skill into the rules it gives an agent
11 rules. 0 are common, 9 are distinctive, and 2 are very specific to this project.
0
Common
Most of the 13 edited versions we read keep these.
9
Distinctive
This author's own choices. Worth a look.
2
Very specific
Tied to their project's names, files or tools. Probably skip.
- Common
- Distinctive
- Very specific
- Very specific: line 35
Names: every control, image, frame, and landmark that needs a name has one, and it contains the visible label text.
- Distinctive: line 64
Search the code in scope for these leads (use multiline search, because JSX attributes often span lines), then confirm each one in context …
- Very specific: line 87
Use an existing accessible component from the design system or library when one fits.
- Distinctive: line 90
Add automated checks with the repository's existing tooling (see Test).
- Distinctive: line 96
Static review: read the components and the markup they render, walk the definition of done and the relevant checklist sections, and scan …
- Distinctive: line 104
Prefer restoring native semantics and removing incorrect ARIA over adding more ARIA.
- Distinctive: line 105
Keep visible labels and accessible names in sync, avoid duplicate announcements, and preserve keyboard behavior and role-based test …
- Distinctive: line 106
Verify with the check that found the issue plus a keyboard pass, and add a regression test where the repository supports it.
- Distinctive: line 111
Use the repository's test runner, accessibility tooling, and testing conventions.
- Distinctive: line 112
Component tests: run axe on each meaningful state, query by role and accessible name, and assert keyboard behavior and focus.
- Distinctive: line 114
Lint: use the framework's accessibility plugin when the repository has one.
“Common” is measured: kept by at least 6 in 10 of the 13 edited versions of this file we could read. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.
Files
Web Accessibility
Make web interfaces usable by people with disabilities, and show the evidence. The default target is WCAG 2.2 Level AA; content that meets it also meets WCAG 2.1 and 2.0 AA.
This is a general baseline. Repository instructions (AGENTS.md, .github/copilot-instructions.md), design-system documentation, and project-specific accessibility skills take precedence for conventions and tooling. They may raise the target; lower it only on an explicit project decision.
Start
- Mode: Build (new UI), Review (audit code or a running page), Fix (remediate findings), or Test (add automated checks). When a request combines modes, review before fixing and test after fixing.
- Scope: files, components, routes, or user flows, plus the states to cover: open and closed overlays, errors, loading, empty, and narrow viewports.
- Stack and tooling: framework, component library or design system, and existing accessibility tooling (
eslint-plugin-jsx-a11y,jest-axeorvitest-axe,cypress-axe,@axe-core/playwright, Storybook a11y addon, Lighthouse CI). Reuse what exists. Add new tools only when the user asks or agrees. - References: load only what the task needs.
| Reference | Read when |
| WCAG 2.2 checklist | Auditing, mapping a finding to a success criterion (SC), conformance questions |
| Structure and content | Page title, language, landmarks, headings, lists, tables, links and buttons, images, SVG, media |
| ARIA and focus | Accessible names, roles, states, hiding content, live regions, keyboard and focus management, SPA routing |
| Component patterns | Dialogs, disclosures, accordions, tabs, menus, comboboxes, tooltips, toasts, carousels, sortable tables, drag and drop |
| Forms and authentication | Labels, hints, validation, error messages, autocomplete, login, multi-step flows, timeouts |
| Visual design | Contrast, use of color, focus indicators, target size, zoom, reflow, text spacing, motion, forced colors |
| Testing | Automated tools and recipes, reading axe and Lighthouse output, browser checks, manual and screen reader testing |
Definition of done
Apply to every UI change. The checklist maps each item to its success criteria. Apply each criterion's scope and exceptions; this is a review aid, not a blanket rule for every component. Items marked (best practice) go beyond WCAG 2.2 AA; report gaps in them as best practice, not as failures.
- Semantics: native elements for their purpose (
<button>for actions,<a href>for navigation, form controls, lists,<table>), landmarks, and a logical heading outline. DOM order matches the visual and reading order. - Names: every control, image, frame, and landmark that needs a name has one, and it contains the visible label text. Informative images have concise
alt; decorative images havealt="". - Keyboard: everything works with a keyboard alone. Tab reaches each control in a logical order; Enter, Space, arrow keys, and Escape behave as the pattern defines; there are no traps. No positive
tabindex(best practice). - Focus: keyboard focus is visible (2.4.7); visual information needed to identify the focused state meets the 3:1 contrast requirement where 1.4.11 applies; and focused components are not entirely hidden by author-created content (2.4.11). Focus moves deliberately when UI opens, closes, or disappears, and returns to a logical place.
- States: expanded, selected, checked, pressed, current, invalid, busy, and disabled states are exposed programmatically, not only visually.
- Feedback: errors are identified in text, associated with their fields, and summarized on submit. Status messages that don't move focus are announced by a live region that exists before the update.
- Visual: text contrast is at least 4.5:1, or 3:1 for large text (at least 24 CSS px, or 18.66 CSS px bold). Visual information needed to identify components and their states, and meaningful parts of graphics, meets 3:1 where 1.4.11 applies. Color is never the only cue.
- Adaptable: usable at 200% text size, at 320 CSS px wide without two-dimensional scrolling except for content that requires it, with increased text spacing, and in either orientation unless orientation is essential. Zoom is never disabled. Works in forced-colors mode (best practice).
- Pointer: targets meet the 24 × 24 CSS px minimum or spacing alternative, subject to the exceptions in 2.5.8. Dragging and path-based or multi-touch gestures have single-pointer alternatives where required. Meet pointer cancellation (2.5.2); prefer click/up activation, and use down-event activation only where a criterion exception applies.
- Motion and time: content that moves, blinks, or scrolls for more than 5 seconds, or auto-updates, can be paused, stopped, or hidden; nothing flashes more than three times per second; time limits can be turned off, adjusted, or extended. Large motion respects
prefers-reduced-motion(best practice). - Forms and authentication: visible labels and instructions,
autocompleteon personal-data fields, no paste blocking, no memory or puzzle test without an alternative, and no re-entering information already provided in the same process. - Consistency and language: a descriptive
<title>for every page and view;langon<html>and on passages in another language; navigation, help, and labels consistent across pages.
Choose the right element
| Need | Use | Avoid |
| Go to a page or location | <a href="..."> | Button that sets location; <a> without href; href="#" |
| Perform an action | <button type="button"> | <div onclick>, <span role="button">, <a href="#"> |
| Submit a form | <button type="submit"> inside <form> | Click handler on a non-button |
| On/off setting | <input type="checkbox">, or <button aria-pressed> for a toggle button | Visual-only "active" class |
| Show or hide a section | <details> and <summary>, or <button aria-expanded aria-controls> | Clickable heading <div> |
| One choice from a few | Radio group in <fieldset> with <legend> | Custom listbox |
| One choice from many | <select> | Custom dropdown, unless native can't meet the need |
| Modal | <dialog> opened with showModal() | <div> overlay without focus management or inert background |
| Tabular data | <table> with <caption> and <th scope> | CSS grid of <div> elements |
| Status message | role="status" (polite) or role="alert" (urgent) container rendered before updates | Live region inserted together with its message |
Red flags to scan for
Search the code in scope for these leads (use multiline search, because JSX attributes often span lines), then confirm each one in context before reporting it.
<(div|span|li|td|img|svg|p)\b[^>]*\s(onClick|@click|v-on:click|\(click\)): non-interactive element used as a control (2.1.1, 4.1.2).href=["'](#|javascript:[^"']*)["']: link used as a button (2.1.1, 4.1.2).outline-none|outline["']?\s*:\s*["']?(none|0)\s*[;"'},!]: focus indicator removed; confirm an equally visible replacement (2.4.7).tab[iI]ndex=\{?["']?[1-9]: positivetabindexbreaks focus order (2.4.3).user-scalable|maximum-scale: confirm zoom isn't disabled (1.4.4).aria-hidden: confirm the hidden subtree has no focusable or needed content (1.3.1, 4.1.2).<img\b: confirm each image has an appropriatealt(1.1.1).placeholder=: confirm a visible label exists (3.3.2, 4.1.2).<(div|span)\b[^>]*aria-label: naming is prohibited on generic elements and often ignored; confirm the element has a role that supports a name (4.1.2).role=["'](button|link|checkbox|tab|menu|menuitem|switch|option): confirm a native element can't be used, and that keyboard support and states are complete;menumust not be used for site navigation (4.1.2).paste: confirm paste isn't blocked in credential or code fields (3.3.8).autoFocus|autofocus: confirm the focus move is expected (2.4.3, 3.2.1).setTimeout|setIntervalin toasts, carousels, or sessions: confirm users can pause, extend, or dismiss (2.2.1, 2.2.2).:hover: confirm the same information or styling is available on:focus-visible, and that hover content meets 1.4.13.<(video|audio|iframe)\b: confirm captions, transcripts, or audio description, no autoplaying sound, and atitleon each iframe (1.2.x, 1.4.2, 4.1.2).@keyframes|animation:|scroll-behavior:\s*smooth: confirm auto-playing motion can be paused and large motion respectsprefers-reduced-motion(2.2.2; 2.3.3 at AAA).
Workflows
Build
- Use an existing accessible component from the design system or library when one fits. Follow its accessibility API (labels,
aria-*props, focus handling) and don't override its semantics. - Otherwise start from native HTML. For a custom widget, implement the complete APG pattern from component patterns: roles, states, keyboard, and focus.
- Build names, states, keyboard support, focus management, error handling, and responsive behavior with the feature, not after it.
- Add automated checks with the repository's existing tooling (see Test).
- Self-review against the definition of done and the red flags, and list what still needs manual or screen reader verification.
Review
- Confirm the scope, target level, and states to cover.
- Static review: read the components and the markup they render, walk the definition of done and the relevant checklist sections, and scan for red flags. Trace repeated issues to the shared component, token, or utility.
- Runtime review (only when a running app is available and the user asked for or agreed to browser checks): automated scan for leads, then the accessibility tree, a keyboard walk-through, and checks at 320 CSS px, 200% zoom, increased text spacing, forced colors, and reduced motion. See testing.
- Record each finding with evidence, location, success criterion, severity, and a concrete fix. Classify it as a WCAG failure, a best practice, or needs verification.
- Report in the format below. Never call a page "compliant" or "accessible" based on automated results or code review alone; state what was tested and how.
Fix
- Locate the source (rule ID, selector, component, success criterion) and fix the root cause, in the shared component, token, or utility when the pattern repeats.
- Prefer restoring native semantics and removing incorrect ARIA over adding more ARIA.
- Keep visible labels and accessible names in sync, avoid duplicate announcements, and preserve keyboard behavior and role-based test selectors.
- Verify with the check that found the issue plus a keyboard pass, and add a regression test where the repository supports it.
- Report what changed, what was verified, and what still needs manual or assistive-technology testing.
Test
- Use the repository's test runner, accessibility tooling, and testing conventions.
- Component tests: run axe on each meaningful state, query by role and accessible name, and assert keyboard behavior and focus.
- End-to-end tests: scan key pages after each state change and drive critical journeys with the keyboard only.
- Lint: use the framework's accessibility plugin when the repository has one.
- Never disable rules, exclude elements, or weaken assertions to get a pass. Turning off page-level rules such as
regionin isolated component tests is the one routine exception (see testing). If another scoped exclusion is unavoidable, such as for a third-party widget, document the reason with a tracked TODO.
Severity
Severity is user impact in context, not WCAG level. The names match axe impact levels so automated and manual findings sort together.
| Severity | Meaning | Typical examples |
| Critical | Blocks a task for some users or risks harm | Keyboard trap; control unreachable or unnamed in a core flow; focus left behind an open modal; flashing above the threshold |
| Serious | Major barrier with a hard or unreliable workaround | Body text below 4.5:1; no visible focus; errors shown only by color; errors or results not announced; content lost at 320 CSS px |
| Moderate | Real difficulty with a reasonable workaround | Vague link text in context; inconsistent labels for the same function; small, crowded targets |
| Minor | Friction or a best-practice gap, not a WCAG failure on its own | Skipped heading level; redundant title; link opens a new tab without warning |
Report format
## Accessibility report: <scope>
- Target: WCAG 2.2 AA
- Methods: <code review | tool and version | keyboard | screen reader and browser | 320 CSS px | 200% zoom | forced colors>
- Summary: <n> critical, <n> serious, <n> moderate, <n> minor; <n> need verification
| # | Severity | Type | WCAG SC | Location | Issue and impact | Fix | Evidence |
|---|---|---|---|---|---|---|---|
| 1 | Critical | Failure | 2.1.1 Keyboard (A) | `src/Card.tsx:42` | Details open only on mouse click; keyboard users can't reach them | Make the trigger a `<button>` | Code review; Tab skips the card |
### Needs verification
- <Check, how to perform it, and why it couldn't be decided>
### Not tested
- <Pages, states, browsers, or assistive technologies outside this review>For Build and Fix work, report the changes made, the checks run, and the remaining manual checks.
Sources
- WCAG 2.2 (W3C Recommendation, also ISO/IEC 40500:2025) and Understanding WCAG 2.2
- How to Meet WCAG 2.2 (Quick Reference)
- WAI-ARIA Authoring Practices Guide (APG) and ARIA in HTML
- W3C WAI tutorials and MDN accessibility
- WCAG 3 is an early draft; don't use it for conformance claims.
Does it work?
Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.
No reviews yet
People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.
- It worked
- Partly
- It didn't
Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.
Your trail
Files you open will collect here, so you can find them again.
Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.
Now do this for your own.
Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.

