Accessibility Audit
WCAG 2.2 Accessibility Audit and Remediation Skill
Description
The a11y-audit skill provides a complete accessibility audit pipeline for modern web applications. It implements a three-phase workflow -- Scan, Fix, Verify -- that identifies WCAG 2.2 Level A and AA violations, generates exact fix code per framework, and produces stakeholder-ready compliance reports.
For every violation it finds, it provides the precise before/after code fix tailored to your framework (React, Next.js, Vue, Angular, Svelte, or plain HTML).
What this skill does:
- Scans your codebase for every WCAG 2.2 Level A and AA violation, categorized by severity (Critical, Major, Minor)
- Fixes each violation with framework-specific before/after code patterns
- Verifies that fixes resolve the original violations and introduces no regressions
- Reports findings in a structured format suitable for developers, PMs, and compliance stakeholders
- Integrates into CI/CD pipelines to prevent accessibility regressions
Features
| Feature |
Description |
| Full WCAG 2.2 Scan |
Checks all Level A and AA success criteria across your codebase |
| Framework Detection |
Auto-detects React, Next.js, Vue, Angular, Svelte, or plain HTML |
| Severity Classification |
Categorizes each violation as Critical, Major, or Minor |
| Fix Code Generation |
Produces before/after code diffs for every issue |
| Color Contrast Checker |
Validates foreground/background pairs against AA and AAA ratios |
| Compliance Reporting |
Generates stakeholder reports with pass/fail summaries |
| CI/CD Integration |
GitHub Actions, GitLab CI, Azure DevOps pipeline configs |
| Keyboard Navigation Audit |
Detects missing focus management and tab order issues |
| ARIA Validation |
Checks for incorrect, redundant, or missing ARIA attributes |
Severity Definitions
| Severity |
Definition |
Example |
SLA |
| Critical |
Blocks access for entire user groups |
Missing alt text, no keyboard access to navigation |
Fix before release |
| Major |
Significant barrier that degrades experience |
Insufficient color contrast, missing form labels |
Fix within current sprint |
| Minor |
Usability issue that causes friction |
Redundant ARIA roles, suboptimal heading hierarchy |
Fix within next 2 sprints |
Usage
Quick Start
# Scan entire project
python scripts/a11y_scanner.py /path/to/project
# Scan with JSON output for tooling
python scripts/a11y_scanner.py /path/to/project --json
# Check color contrast for specific values
python scripts/contrast_checker.py --fg "#777777" --bg "#ffffff"
# Check contrast across a CSS/Tailwind file
python scripts/contrast_checker.py --file /path/to/styles.css
Slash Command
/a11y-audit # Audit current project
/a11y-audit --scope src/ # Audit specific directory
/a11y-audit --fix # Audit and auto-apply fixes
/a11y-audit --report # Generate stakeholder report
/a11y-audit --ci # Output CI-compatible results
Three-Phase Workflow
Phase 1: Scan -- Walk the source tree, detect framework, apply rule set.
python scripts/a11y_scanner.py /path/to/project --format table
Phase 2: Fix -- Apply framework-specific fixes for each violation.
See references/framework-a11y-patterns.md for the complete fix patterns catalog.
Phase 3: Verify -- Re-run the scanner to confirm fixes and check for regressions.
python scripts/a11y_scanner.py /path/to/project --baseline audit-baseline.json
Example: React Component Audit
// BEFORE: src/components/ProductCard.tsx
function ProductCard({ product }) {
return (
<div => navigate(`/product/${product.id}`)}>
<img src={product.image} />
<div style={{ color: '#aaa', fontSize: '12px' }}>{product.name}</div>
<span style={{ color: '#999' }}>${product.price}</span>
</div>
);
}
| # |
WCAG |
Severity |
Issue |
| 1 |
1.1.1 |
Critical |
<img> missing alt attribute |
| 2 |
2.1.1 |
Critical |
<div onClick> not keyboard accessible |
| 3 |
1.4.3 |
Major |
Color #aaa on white fails contrast (2.32:1, needs 4.5:1) |
| 4 |
1.4.3 |
Major |
Color #999 on white fails contrast (2.85:1, needs 4.5:1) |
| 5 |
4.1.2 |
Major |
Interactive element missing role and accessible name |
// AFTER: src/components/ProductCard.tsx
function ProductCard({ product }) {
return (
<a href={`/product/${product.id}`} className="product-card"
aria-label={`View ${product.name} - $${product.price}`}>
<img src={product.image} alt={product.imageAlt || product.name} />
<div style={{ color: '#595959', fontSize: '12px' }}>{product.name}</div>
<span style={{ color: '#767676' }}>${product.price}</span>
</a>
);
}
See references/examples-by-framework.md for Vue, Angular, Next.js, and Svelte examples.
Tools Reference
a11y_scanner.py
Usage: python scripts/a11y_scanner.py <path> [options]
Options:
--json Output results as JSON
--format {table,csv} Output format (default: table)
--severity {critical,major,minor} Filter by minimum severity
--framework {react,vue,angular,svelte,html,auto} Force framework (default: auto)
--baseline FILE Compare against previous scan results
--report Generate stakeholder report
--output FILE Write results to file
--quiet Suppress output, exit code only
--ci CI mode: non-zero exit on critical issues
contrast_checker.py
Usage: python scripts/contrast_checker.py [options]
Options:
--fg COLOR Foreground color (hex)
--bg COLOR Background color (hex)
--file FILE Scan CSS file for color pairs
--tailwind DIR Scan directory for Tailwind color classes
--json Output results as JSON
--suggest Suggest accessible alternatives for failures
--level {aa,aaa} Target conformance level (default: aa)
Common Pitfalls
| Pitfall |
Correct Approach |
role="button" on a <div> |
Use native <button> -- includes keyboard handling for free |
tabindex="0" on everything |
Only interactive elements need focus; use native elements |
aria-label on non-interactive elements |
Use aria-labelledby pointing to visible text |
display: none for screen reader hiding |
Use .sr-only class instead |
| Color alone to convey meaning |
Add icons, text labels, or patterns alongside color |
| Placeholder as only label |
Always provide a visible <label> |
outline: none without replacement |
Always provide a visible focus indicator via focus-visible |
Empty alt="" on informational images |
Informational images need descriptive alt text |
| Skipping heading levels (h1 -> h3) |
Heading levels must be sequential |
onClick without onKeyDown |
Add keyboard support or prefer native elements |
Ignoring prefers-reduced-motion |
Wrap animations in @media (prefers-reduced-motion: no-preference) |
Related Skills
| Skill |
Relationship |
| senior-frontend |
Frontend patterns used in a11y fixes |
| code-reviewer |
Include a11y checks in code review workflows |
| senior-qa |
Integration of a11y testing into QA processes |
| playwright-pro |
Automated browser testing with accessibility assertions |
| epic-design |
WCAG 2.1 AA compliant animations and scroll storytelling |
| tdd-guide |
Test-driven development patterns for a11y test cases |
Reference Documentation
| Reference |
Description |
| wcag-quick-ref.md |
WCAG 2.2 Level A & AA criteria quick reference |
| wcag-22-new-criteria.md |
New WCAG 2.2 success criteria (Focus Appearance, Target Size, etc.) |
| aria-patterns.md |
ARIA patterns, keyboard interaction, and live regions |
| framework-a11y-patterns.md |
Framework-specific fix patterns (React, Vue, Angular, Svelte, HTML) |
| color-contrast-guide.md |
Color contrast checker details, Tailwind palette mapping, sr-only class |
| ci-cd-integration.md |
GitHub Actions, GitLab CI, Azure DevOps, pre-commit hook configs |
| audit-report-template.md |
Stakeholder-ready audit report template |
| testing-checklist.md |
Manual testing checklist (keyboard, screen reader, visual, forms) |
| examples-by-framework.md |
Full audit examples for Vue, Angular, Next.js, and Svelte |
Resources
Source: alirezarezvani/claude-skills → engineering-team/a11y-audit/skills/a11y-audit/SKILL.md
1---2name: a11y-audit3description: Accessibility audit skill for scanning, fixing, and verifying WCAG 2.2 Level A and AA compliance across React, Next.js, Vue, Angular, Svelte, and plain HTML codebases. Use when auditing accessibility, fixing a11y violations, checking color contrast, generating compliance reports, or integrating accessibility checks into CI/CD pipelines.4---5
6
7# Accessibility Audit
8
9WCAG 2.2 Accessibility Audit and Remediation Skill
10
11## Description
12
13The a11y-audit skill provides a complete accessibility audit pipeline for modern web applications. It implements a three-phase workflow -- Scan, Fix, Verify -- that identifies WCAG 2.2 Level A and AA violations, generates exact fix code per framework, and produces stakeholder-ready compliance reports.
14
15For every violation it finds, it provides the precise before/after code fix tailored to your framework (React, Next.js, Vue, Angular, Svelte, or plain HTML).
16
17**What this skill does:**
18
191. **Scans** your codebase for every WCAG 2.2 Level A and AA violation, categorized by severity (Critical, Major, Minor)
202. **Fixes** each violation with framework-specific before/after code patterns
213. **Verifies** that fixes resolve the original violations and introduces no regressions
224. **Reports** findings in a structured format suitable for developers, PMs, and compliance stakeholders
235. **Integrates** into CI/CD pipelines to prevent accessibility regressions
24
25## Features
26
27| Feature | Description |
28|---------|-------------|
29| **Full WCAG 2.2 Scan** | Checks all Level A and AA success criteria across your codebase |
30| **Framework Detection** | Auto-detects React, Next.js, Vue, Angular, Svelte, or plain HTML |
31| **Severity Classification** | Categorizes each violation as Critical, Major, or Minor |
32| **Fix Code Generation** | Produces before/after code diffs for every issue |
33| **Color Contrast Checker** | Validates foreground/background pairs against AA and AAA ratios |
34| **Compliance Reporting** | Generates stakeholder reports with pass/fail summaries |
35| **CI/CD Integration** | GitHub Actions, GitLab CI, Azure DevOps pipeline configs |
36| **Keyboard Navigation Audit** | Detects missing focus management and tab order issues |
37| **ARIA Validation** | Checks for incorrect, redundant, or missing ARIA attributes |
38
39### Severity Definitions
40
41| Severity | Definition | Example | SLA |
42|----------|-----------|---------|-----|
43| **Critical** | Blocks access for entire user groups | Missing alt text, no keyboard access to navigation | Fix before release |
44| **Major** | Significant barrier that degrades experience | Insufficient color contrast, missing form labels | Fix within current sprint |
45| **Minor** | Usability issue that causes friction | Redundant ARIA roles, suboptimal heading hierarchy | Fix within next 2 sprints |
46
47## Usage
48
49### Quick Start
50
51```bash
52# Scan entire project
53python scripts/a11y_scanner.py /path/to/project
54
55# Scan with JSON output for tooling
56python scripts/a11y_scanner.py /path/to/project --json
57
58# Check color contrast for specific values
59python scripts/contrast_checker.py --fg "#777777" --bg "#ffffff"
60
61# Check contrast across a CSS/Tailwind file
62python scripts/contrast_checker.py --file /path/to/styles.css
63```
64
65### Slash Command
66
67```
68/a11y-audit # Audit current project
69/a11y-audit --scope src/ # Audit specific directory
70/a11y-audit --fix # Audit and auto-apply fixes
71/a11y-audit --report # Generate stakeholder report
72/a11y-audit --ci # Output CI-compatible results
73```
74
75### Three-Phase Workflow
76
77**Phase 1: Scan** -- Walk the source tree, detect framework, apply rule set.
78
79```bash
80python scripts/a11y_scanner.py /path/to/project --format table
81```
82
83**Phase 2: Fix** -- Apply framework-specific fixes for each violation.
84
85> See [references/framework-a11y-patterns.md](references/framework-a11y-patterns.md) for the complete fix patterns catalog.
86
87**Phase 3: Verify** -- Re-run the scanner to confirm fixes and check for regressions.
88
89```bash
90python scripts/a11y_scanner.py /path/to/project --baseline audit-baseline.json
91```
92
93## Example: React Component Audit
94
95```tsx
96// BEFORE: src/components/ProductCard.tsx
97function ProductCard({ product }) {
98 return (
99 <div onClick={() => navigate(`/product/${product.id}`)}>
100 <img src={product.image} />
101 <div style={{ color: '#aaa', fontSize: '12px' }}>{product.name}</div>
102 <span style={{ color: '#999' }}>${product.price}</span>
103 </div>
104 );
105}
106```
107
108| # | WCAG | Severity | Issue |
109|---|------|----------|-------|
110| 1 | 1.1.1 | Critical | `<img>` missing `alt` attribute |
111| 2 | 2.1.1 | Critical | `<div onClick>` not keyboard accessible |
112| 3 | 1.4.3 | Major | Color `#aaa` on white fails contrast (2.32:1, needs 4.5:1) |
113| 4 | 1.4.3 | Major | Color `#999` on white fails contrast (2.85:1, needs 4.5:1) |
114| 5 | 4.1.2 | Major | Interactive element missing role and accessible name |
115
116```tsx
117// AFTER: src/components/ProductCard.tsx
118function ProductCard({ product }) {
119 return (
120 <a href={`/product/${product.id}`} className="product-card"
121 aria-label={`View ${product.name} - $${product.price}`}>
122 <img src={product.image} alt={product.imageAlt || product.name} />
123 <div style={{ color: '#595959', fontSize: '12px' }}>{product.name}</div>
124 <span style={{ color: '#767676' }}>${product.price}</span>
125 </a>
126 );
127}
128```
129
130> See [references/examples-by-framework.md](references/examples-by-framework.md) for Vue, Angular, Next.js, and Svelte examples.
131
132## Tools Reference
133
134### a11y_scanner.py
135
136```
137Usage: python scripts/a11y_scanner.py <path> [options]
138
139Options:
140 --json Output results as JSON
141 --format {table,csv} Output format (default: table)
142 --severity {critical,major,minor} Filter by minimum severity
143 --framework {react,vue,angular,svelte,html,auto} Force framework (default: auto)
144 --baseline FILE Compare against previous scan results
145 --report Generate stakeholder report
146 --output FILE Write results to file
147 --quiet Suppress output, exit code only
148 --ci CI mode: non-zero exit on critical issues
149```
150
151### contrast_checker.py
152
153```
154Usage: python scripts/contrast_checker.py [options]
155
156Options:
157 --fg COLOR Foreground color (hex)
158 --bg COLOR Background color (hex)
159 --file FILE Scan CSS file for color pairs
160 --tailwind DIR Scan directory for Tailwind color classes
161 --json Output results as JSON
162 --suggest Suggest accessible alternatives for failures
163 --level {aa,aaa} Target conformance level (default: aa)
164```
165
166## Common Pitfalls
167
168| Pitfall | Correct Approach |
169|---------|------------------|
170| `role="button"` on a `<div>` | Use native `<button>` -- includes keyboard handling for free |
171| `tabindex="0"` on everything | Only interactive elements need focus; use native elements |
172| `aria-label` on non-interactive elements | Use `aria-labelledby` pointing to visible text |
173| `display: none` for screen reader hiding | Use `.sr-only` class instead |
174| Color alone to convey meaning | Add icons, text labels, or patterns alongside color |
175| Placeholder as only label | Always provide a visible `<label>` |
176| `outline: none` without replacement | Always provide a visible focus indicator via `focus-visible` |
177| Empty `alt=""` on informational images | Informational images need descriptive alt text |
178| Skipping heading levels (h1 -> h3) | Heading levels must be sequential |
179| `onClick` without `onKeyDown` | Add keyboard support or prefer native elements |
180| Ignoring `prefers-reduced-motion` | Wrap animations in `@media (prefers-reduced-motion: no-preference)` |
181
182## Related Skills
183
184| Skill | Relationship |
185|-------|-------------|
186| **senior-frontend** | Frontend patterns used in a11y fixes |
187| **code-reviewer** | Include a11y checks in code review workflows |
188| **senior-qa** | Integration of a11y testing into QA processes |
189| **playwright-pro** | Automated browser testing with accessibility assertions |
190| **epic-design** | WCAG 2.1 AA compliant animations and scroll storytelling |
191| **tdd-guide** | Test-driven development patterns for a11y test cases |
192
193## Reference Documentation
194
195| Reference | Description |
196|-----------|-------------|
197| [wcag-quick-ref.md](references/wcag-quick-ref.md) | WCAG 2.2 Level A & AA criteria quick reference |
198| [wcag-22-new-criteria.md](references/wcag-22-new-criteria.md) | New WCAG 2.2 success criteria (Focus Appearance, Target Size, etc.) |
199| [aria-patterns.md](references/aria-patterns.md) | ARIA patterns, keyboard interaction, and live regions |
200| [framework-a11y-patterns.md](references/framework-a11y-patterns.md) | Framework-specific fix patterns (React, Vue, Angular, Svelte, HTML) |
201| [color-contrast-guide.md](references/color-contrast-guide.md) | Color contrast checker details, Tailwind palette mapping, sr-only class |
202| [ci-cd-integration.md](references/ci-cd-integration.md) | GitHub Actions, GitLab CI, Azure DevOps, pre-commit hook configs |
203| [audit-report-template.md](references/audit-report-template.md) | Stakeholder-ready audit report template |
204| [testing-checklist.md](references/testing-checklist.md) | Manual testing checklist (keyboard, screen reader, visual, forms) |
205| [examples-by-framework.md](references/examples-by-framework.md) | Full audit examples for Vue, Angular, Next.js, and Svelte |
206
207## Resources
208
209- [WCAG 2.2 Specification](https://www.w3.org/TR/WCAG22/)
210- [WAI-ARIA Authoring Practices 1.2](https://www.w3.org/WAI/ARIA/apg/)
211- [Deque axe-core Rules](https://github.com/dequelabs/axe-core/blob/develop/doc/rule-descriptions.md)
212- [eslint-plugin-jsx-a11y](https://github.com/jsx-eslint/eslint-plugin-jsx-a11y)
213
214---
215
216**Source:** [`alirezarezvani/claude-skills`](https://github.com/alirezarezvani/claude-skills) → `engineering-team/a11y-audit/skills/a11y-audit/SKILL.md`