{"manifest":{"name":"WCAG Accessibility Auditor","version":"1.0.0","description":"Audit a UI component, page description, or HTML snippet against WCAG 2.2 AA criteria. Produces a checklist of pass/fail items with specific, actionable fixes — no generic advice.","tags":["accessibility","wcag","a11y","audit","ui","compliance"],"standard":"agentskills.io","standard_version":"1.0","content_checksum":"8e045eaf869585990f9534d4529264aad0fc7df845d87512c0931175eed66eb4","bundle_checksum":null,"metadata":{},"files":[]},"files":{"SKILL.md":"# WCAG Accessibility Auditor\n\n> **Purpose:** Audit any UI component, page structure, or HTML snippet against WCAG 2.2 Level AA criteria. Produces a structured checklist with pass/fail status for each applicable criterion, specific code-level fixes for failures, and a prioritized remediation plan. Covers all four WCAG principles: Perceivable, Operable, Understandable, and Robust.\n\n---\n\n## Invocation\n\n```\n/a11y-audit\n```\n\nProvide one of:\n- **HTML snippet** — paste raw HTML/JSX of a component\n- **Component description** — describe what it looks like and how it behaves\n- **URL** — describe the page structure (screenshot descriptions work too)\n\n---\n\n## Criteria Checked (WCAG 2.2 AA)\n\n### Perceivable\n- **1.1.1** Non-text content has text alternatives (`alt` text on images)\n- **1.3.1** Info and relationships conveyed through structure (semantic HTML, ARIA roles)\n- **1.3.2** Meaningful sequence — DOM order matches visual order\n- **1.3.3** Instructions don't rely solely on shape/color/size/location\n- **1.4.1** Color is not the only means of conveying information\n- **1.4.3** Contrast ratio ≥ 4.5:1 for normal text, ≥ 3:1 for large text\n- **1.4.4** Text can be resized 200% without loss of content\n- **1.4.10** Reflow — content works at 320px width without horizontal scroll\n- **1.4.11** Non-text contrast ≥ 3:1 for UI components and focus indicators\n\n### Operable\n- **2.1.1** All functionality available via keyboard\n- **2.1.2** No keyboard traps\n- **2.4.1** Skip navigation links present for repeated blocks\n- **2.4.2** Pages have descriptive titles\n- **2.4.3** Focus order is logical and predictable\n- **2.4.4** Link purpose clear from link text (no \"click here\")\n- **2.4.7** Keyboard focus is always visible\n- **2.5.3** Label in Name — visible label matches accessible name\n\n### Understandable\n- **3.1.1** Language of the page is set (`lang` attribute)\n- **3.2.1** No unexpected context changes on focus\n- **3.2.2** No unexpected changes on input (unless user is warned)\n- **3.3.1** Errors are identified and described in text\n- **3.3.2** Labels or instructions provided for user input\n\n### Robust\n- **4.1.1** Valid HTML — no duplicate IDs, proper nesting\n- **4.1.2** Name, Role, Value — all UI components have accessible names, roles, and states\n- **4.1.3** Status messages programmatically determinable (ARIA live regions)\n\n---\n\n## Output Format\n\n```markdown\n## Accessibility Audit Report\n\n**Component:** [name]\n**Standard:** WCAG 2.2 Level AA\n**Date:** [today]\n\n---\n\n### Overall Score: [X/28 criteria] — [PASS / FAIL / NEEDS REVIEW]\n\n---\n\n### Critical Failures (fix before launch)\n\n| Criterion | Issue | Fix |\n|-----------|-------|-----|\n| 1.4.3 | Contrast ratio 2.8:1 on `#999` text | Change to `#767676` (4.54:1) |\n| 2.1.1 | Dropdown not keyboard-accessible | Add `tabindex=\"0\"` and keydown handler |\n\n---\n\n### Warnings (fix this sprint)\n\n| Criterion | Issue | Recommendation |\n|-----------|-------|---------------|\n| 2.4.4 | \"Read more\" links lack context | Add `aria-label=\"Read more about [topic]\"` |\n\n---\n\n### Passed Criteria\n\n[List of criteria that pass, for confidence]\n\n---\n\n### Quick Fixes\n\n```html\n<!-- Before -->\n<img src=\"logo.png\">\n\n<!-- After -->\n<img src=\"logo.png\" alt=\"SkillSlap logo\">\n```\n\n---\n\n### Remediation Priority\n\n1. [Most critical fix]\n2. [Second fix]\n```\n\n---\n\n## Rules\n\n- Never mark a criterion as \"pass\" if you cannot confirm it from the provided input — use \"cannot verify\" instead\n- Always provide the **specific CSS/HTML/ARIA fix**, not just a description of the problem\n- Contrast ratio failures must include the exact hex values and their actual ratio\n- If the component has interactive states (hover, focus, error), audit those states separately\n- For JSX/React components, output fixes in JSX syntax, not plain HTML\n- Color contrast: use the formula `(L1 + 0.05) / (L2 + 0.05)` where L is relative luminance\n\n## Playground\n\n<!DOCTYPE html><html><head><meta charset='utf-8'><style>*{box-sizing:border-box;margin:0;padding:0}body{background:#0d1117;color:#e6edf3;font-family:monospace;font-size:12px;height:100vh;display:flex;flex-direction:column;overflow:hidden}.header{background:#161b22;border-bottom:1px solid #30363d;padding:8px 14px;font-size:11px;color:#8b949e;display:flex;justify-content:space-between;align-items:center;flex-shrink:0}.title{color:#58a6ff;font-weight:bold;font-size:13px}.panels{display:flex;flex:1;overflow:hidden}.panel{flex:1;overflow:auto;padding:12px;border-right:1px solid #30363d}.panel:last-child{border-right:none}.label{font-size:10px;color:#8b949e;text-transform:uppercase;letter-spacing:.08em;margin-bottom:6px}pre{white-space:pre-wrap;word-break:break-word;line-height:1.5}</style></head><body><div class='header'><span class='title'>WCAG Accessibility Auditor</span><span>Example · SkillSlap</span></div><div class='panels'><div class='panel'><div class='label'>Input: HTML snippet</div><pre><span style='color:#8b949e'>&lt;button style='color:#aaa;</span>\n<span style='color:#8b949e'>  background:#999;'&gt;</span>\n<span style='color:#8b949e'>  Submit</span>\n<span style='color:#8b949e'>&lt;/button&gt;</span>\n\n<span style='color:#8b949e'>&lt;img src='hero.jpg'&gt;</span>\n\n<span style='color:#8b949e'>&lt;input placeholder='Email'&gt;</span></pre></div><div class='panel'><div class='label'>Output: Audit findings</div><pre><span style='color:#f85149'>🔴 Contrast fail (button) — WCAG 1.4.3</span>\n<span style='color:#f85149'>   #aaa on #999 = 1.06:1</span>\n<span style='color:#f85149'>   Required: 4.5:1 for normal text.</span>\n<span style='color:#f85149'>   Fix: use #fff on #555 (7.5:1)</span>\n\n<span style='color:#f85149'>🔴 Missing alt (img) — WCAG 1.1.1</span>\n<span style='color:#f85149'>   Screen readers announce 'image'.</span>\n<span style='color:#f85149'>   Fix: alt='Hero banner showing...'</span>\n\n<span style='color:#e3b341'>🟡 Placeholder as label — WCAG 1.3.1</span>\n<span style='color:#e3b341'>   Disappears on focus; not announced.</span>\n<span style='color:#e3b341'>   Fix: add &lt;label&gt;Email&lt;/label&gt;</span>\n<span style='color:#e3b341'>   + id='email' on input.</span></pre></div></div></body></html>"}}