Accessibility Audit
Comprehensive WCAG 2.1 accessibility audit for Webflow pages with detailed issue detection and actionable fixes.
Important Note
ALWAYS use Webflow MCP tools for all operations:
- Use Webflow MCP's
webflow_guide_tool to get best practices before starting
- Use Webflow MCP's
data_sites_tool with action list_sites to identify available sites
- Use Webflow MCP's
data_sites_tool with action get_site to retrieve site details
- Use Webflow MCP's
data_pages_tool with action list_pages to get all pages and their page IDs
- Use Webflow MCP's
data_element_tool with action get_all_elements (passing the page ID directly) to get detailed element information
- Use Webflow MCP's
data_element_tool with action set_attributes to fix accessibility issues
- Use Webflow MCP's
element_snapshot_tool to get visual previews of elements — this is a Designer tool and requires a Designer connection if used
- DO NOT use any other tools or methods for Webflow operations
- All tool calls must include the required
context parameter (15-25 words, third-person perspective)
- No Designer connection is required for the audit or fixes.
data_element_tool operates headlessly on any page ID from list_pages. Designer is only needed if you choose to use element_snapshot_tool for optional visual previews.
Instructions
Phase 1: Site & Page Selection
- Get site information: Use Webflow MCP's
data_sites_tool with action list_sites to identify target site
- Ask for page selection:
- If user provides page ID, use it directly
- Otherwise, use
data_pages_tool with action list_pages to show available pages
- Let user select which page(s) to audit
- Confirm audit scope: Ask user what to check:
- Full audit (all accessibility checks)
- Critical issues only (WCAG Level A)
- Specific categories (forms, buttons, navigation, etc.)
Phase 2: Element Extraction & Analysis
- Extract all elements: Use
data_element_tool with action get_all_elements, passing the target page's ID from Phase 1, for detailed analysis — no Designer connection needed
- Set
include_style_properties: true to check focus styles
- Set
include_all_breakpoint_styles: false to minimize data
- Parse element data: Identify interactive and content elements:
- Buttons (Button, LinkBlock with button role)
- Links (TextLink, Link, LinkBlock)
- Form inputs (Input, Select, Textarea)
- Headings (Heading elements with levels)
- Interactive divs/spans (check for onClick or interactive roles)
- Images (Image elements) - SKIP for this audit
- Extract attributes for each element:
- ARIA attributes (aria-label, aria-describedby, role, tabIndex)
- DOM attributes (id, domId, href, type, placeholder)
- Text content
- Style properties (outline, border for focus states)
- Element metadata (canHaveAttributes, tag name)
Phase 3: Accessibility Checks
Critical Issues (Must Fix - WCAG Level A)
Icon-only buttons without labels (WCAG 4.1.2)
- Find: Button elements with no text content
- Check: Missing
aria-label or aria-labelledby
- Impact: Screen readers cannot identify button purpose
- Fix: Add
aria-label attribute with descriptive text
Form inputs without labels (WCAG 1.3.1)
- Find: Input, Select, Textarea elements
- Check: Missing associated label or
aria-label
- Impact: Users don't know what input is for
- Fix: Add
aria-label or associate with <label> using id
Non-semantic click handlers (WCAG 2.1.1)
- Find: Div or Span elements (identified by element type)
- Check: Interactive behavior without proper role/keyboard support
- Impact: Not keyboard accessible, screen readers miss interactivity
- Fix: Add
role="button", tabIndex="0", suggest using real <button>
Links without destination (WCAG 2.1.1)
- Find: Link elements with no
href attribute
- Check: Links that only use onClick without href
- Impact: Not keyboard accessible, breaks browser features
- Fix: Add proper
href or convert to button
Serious Issues (Should Fix - WCAG Level AA)
Focus outline removed without replacement (WCAG 2.4.7)
- Find: Elements with
outline: none style
- Check: No visible alternative focus indicator
- Impact: Keyboard users can't see focus
- Fix: Add visible focus style (border, box-shadow, background change)
Missing keyboard handlers (WCAG 2.1.1)
- Find: Elements with onClick handlers
- Check: Missing onKeyDown for Enter/Space keys
- Impact: Not usable with keyboard alone
- Fix: Add keyboard event handlers
Touch target too small (WCAG 2.5.5)
- Find: Clickable elements (buttons, links)
- Check: Width or height < 44px
- Impact: Hard to tap on mobile devices
- Fix: Increase padding or min-width/min-height to 44px
Moderate Issues (Consider Fixing)
Heading hierarchy problems (WCAG 1.3.1)
- Find: Heading elements (h1-h6)
- Check: Skipped levels (h1 → h3, skipping h2)
- Impact: Confusing document structure
- Fix: Use proper sequential heading levels
Positive tabIndex (WCAG 2.4.3)
- Find: Elements with tabIndex > 0
- Check: Disrupts natural tab order
- Impact: Confusing keyboard navigation
- Fix: Use tabIndex="0" or "-1" only, let natural DOM order work
Role without required attributes (WCAG 4.1.2)
- Find: Elements with ARIA roles
- Check: Missing required ARIA attributes (e.g., role="button" without tabIndex)
- Impact: Incomplete accessibility semantics
- Fix: Add required attributes for role
Phase 4: Issue Categorization & Scoring
Categorize all findings:
- Critical: Must fix (blocks access)
- Serious: Should fix (significantly impacts usability)
- Moderate: Consider fixing (improves experience)
Calculate accessibility score (0-100):
- Start at 100
- Critical issue: -10 points each
- Serious issue: -5 points each
- Moderate issue: -2 points each
- Minimum score: 0
Generate severity summary:
- Total issues found
- Breakdown by severity
- Most common issue types
- Pages/sections most affected
Phase 5: Report Generation
Create detailed report with specific format:
═══════════════════════════════════════════════════
ACCESSIBILITY AUDIT: [Page Name]
═══════════════════════════════════════════════════
CRITICAL (X issues)
───────────────────
[A11Y] Element: Button "Submit"
Issue: Button missing accessible name
Location: Form section, element ID: {component: "abc", element: "xyz"}
Current: <button><CloseIcon /></button>
Fix: Add aria-label="Close"
WCAG: 4.1.2 Name, Role, Value
[A11Y] Element: Input field
Issue: Form input without label
Location: Contact form, element ID: {component: "def", element: "uvw"}
Current: <input type="email" />
Fix: Add aria-label="Email address" or associate with <label>
WCAG: 1.3.1 Info and Relationships
SERIOUS (X issues)
──────────────────
[A11Y] Element: Link "Read more"
Issue: Focus outline removed without visible alternative
Location: Blog section
Current: outline: none
Fix: Add visible focus style (e.g., border: 2px solid blue)
WCAG: 2.4.7 Focus Visible
MODERATE (X issues)
───────────────────
[A11Y] Element: Heading
Issue: Heading hierarchy skipped (h1 → h3)
Location: Article section
Current: <h3>Subsection</h3> after <h1>Title</h1>
Fix: Change to <h2> or add intermediate h2
WCAG: 1.3.1 Info and Relationships
═══════════════════════════════════════════════════
SUMMARY
───────────────────────────────────────────────────
Total Issues: X
- Critical: X issues
- Serious: X issues
- Moderate: X issues
Accessibility Score: XX/100
Most Common Issues:
1. [Issue type] - X occurrences
2. [Issue type] - X occurrences
3. [Issue type] - X occurrences
═══════════════════════════════════════════════════
Provide actionable insights:
- Prioritized fix list (critical first)
- Quick wins (easy fixes with big impact)
- Design pattern recommendations
- Resources for learning more
Phase 6: Fix Suggestions & Approval (Optional)
Offer to fix issues automatically: Fixes don't require Designer, so offer auto-fixes directly
Show preview of fixes:
Which issues would you like to fix?
[1] ✓ Add aria-label to Submit button
Element: Button in contact form
Fix: Add aria-label="Submit contact form"
Safe: Yes (adding attribute only)
[2] ✓ Add aria-label to email input
Element: Input in contact form
Fix: Add aria-label="Email address"
Safe: Yes
[3] ⚠️ Fix heading hierarchy
Element: h3 in article section
Fix: Change heading level from h3 to h2
Safe: May affect visual styling
Type numbers to skip (e.g., "3"), "all" for all, "none" to cancel
Apply approved fixes: Use data_element_tool with action set_attributes
- Process in batches
- Show progress for large fix sets
- Report success/failure for each
Generate post-fix report:
- Issues fixed: X
- Issues remaining: Y
- New accessibility score: XX/100 (improved from YY/100)
Phase 7: Export & Resources (Optional)
Offer export formats:
- Markdown (readable documentation)
- JSON (machine-readable for tracking)
- CSV (spreadsheet for team review)
Provide resources:
- WCAG 2.1 quick reference links
- Webflow accessibility best practices
- Recommended testing tools (browser extensions, screen readers)
Important Considerations
What This Skill Checks
✅ Button accessibility (labels, roles)
✅ Form input labels and associations
✅ Link semantics and keyboard access
✅ Focus visibility and keyboard navigation
✅ Heading hierarchy and structure
✅ ARIA roles and attributes
✅ Touch target sizes
✅ Interactive element semantics
What This Skill Does NOT Check
❌ Image alt text (use asset-audit skill instead)
❌ Color contrast ratios (requires visual analysis)
❌ Animation/motion preferences
❌ Screen reader testing (needs manual verification)
❌ Content readability (language level, clarity)
Limitations
- Cannot detect visual-only issues (color contrast, small text)
- Cannot test actual screen reader behavior
- Cannot validate content quality or clarity
- Relies on element attributes and structure only
Examples
Example 1: Full Page Audit
User prompt:
Run an accessibility audit on my homepage
Step 1: Site & Page Selection
🔍 Accessibility Audit: Page Selection
I'll help you audit your homepage for accessibility issues.
First, let me get your site information...
Available sites:
1. Company Website
2. Portfolio Site
Which site? (1/2)
User response: 1
Step 2: Page Selection
Available pages in Company Website:
1. Home (/)
2. About (/about)
3. Contact (/contact)
4. Blog (/blog)
Which page would you like to audit? (1 for Home)
User response: 1
Step 3: Audit Scope
What level of audit would you like?
1. Full audit (all WCAG checks) - Recommended
2. Critical issues only (Level A compliance)
3. Specific categories (buttons, forms, navigation)
Your choice: (1/2/3)
User response: 1
Step 4: Audit Progress
🔄 Running Accessibility Audit...
Progress:
✅ Extracted page content (45 elements)
✅ Analyzing buttons and interactive elements
✅ Checking form inputs and labels
✅ Validating heading hierarchy
✅ Checking keyboard navigation
🔄 Analyzing focus states...
Analysis complete!
Step 5: Report
═══════════════════════════════════════════════════
ACCESSIBILITY AUDIT: Home
═══════════════════════════════════════════════════
CRITICAL (3 issues)
───────────────────
[A11Y] Element: Button (navigation toggle)
Issue: Icon-only button missing accessible name
Location: Header navigation
Element ID: {component: "nav-01", element: "btn-menu"}
Current: <button><MenuIcon /></button>
Fix: Add aria-label="Open navigation menu"
WCAG: 4.1.2 Name, Role, Value
[A11Y] Element: Input (email subscription)
Issue: Form input without label
Location: Footer, newsletter signup
Element ID: {component: "footer-01", element: "email-input"}
Current: <input type="email" placeholder="Enter email" />
Fix: Add aria-label="Email address for newsletter"
WCAG: 1.3.1 Info and Relationships
[A11Y] Element: Div (clickable card)
Issue: Non-semantic interactive element
Location: Services section, card 2
Element ID: {component: "services-01", element: "card-02"}
Current: <div card</div>
Fix: Convert to <button> or add role="button" + tabIndex="0"
WCAG: 2.1.1 Keyboard
SERIOUS (5 issues)
──────────────────
[A11Y] Element: Link "Learn more"
Issue: Focus outline removed without visible alternative
Location: Hero section
Element ID: {component: "hero-01", element: "cta-link"}
Current: outline: none
Fix: Add focus style - border: 2px solid #0066cc or box-shadow
WCAG: 2.4.7 Focus Visible
[A11Y] Element: Button "Subscribe"
Issue: Touch target too small (30px × 36px)
Location: Footer newsletter form
Element ID: {component: "footer-01", element: "submit-btn"}
Current: Small button
Fix: Increase padding or set min-height: 44px
WCAG: 2.5.5 Target Size
[continues with 3 more serious issues...]
MODERATE (4 issues)
───────────────────
[A11Y] Element: Heading "Our Services"
Issue: Heading hierarchy skipped (h1 → h3)
Location: Services section
Element ID: {component: "services-01", element: "heading"}
Current: <h3>Our Services</h3> follows <h1>Welcome</h1>
Fix: Change to <h2> to maintain proper hierarchy
WCAG: 1.3.1 Info and Relationships
[continues with 3 more moderate issues...]
═══════════════════════════════════════════════════
SUMMARY
───────────────────────────────────────────────────
Total Issues: 12
- Critical: 3 issues (must fix)
- Serious: 5 issues (should fix)
- Moderate: 4 issues (consider fixing)
Accessibility Score: 64/100
Most Common Issues:
1. Missing button labels - 2 occurrences
2. Focus styles removed - 3 occurrences
3. Heading hierarchy problems - 2 occurrences
Quick Wins (Easy + High Impact):
✨ Add aria-label to icon buttons (2 min, +20 score points)
✨ Add input labels (5 min, +10 score points)
✨ Add focus styles (10 min, +15 score points)
═══════════════════════════════════════════════════
💡 Next Steps:
1. Fix critical issues first (blocks access for some users)
2. Add visible focus styles for keyboard users
3. Test with keyboard navigation (Tab, Enter, Space keys)
4. Consider testing with screen reader (NVDA/JAWS/VoiceOver)
Would you like me to help fix these issues?
Example 2: Multi-Page Audit
User prompt:
Audit accessibility across my entire site
Agent response:
🔍 Multi-Page Accessibility Audit
I'll audit all pages on your site for accessibility issues.
Found 8 pages:
1. Home
2. About
3. Services
4. Team
5. Blog
6. Blog Post Template (CMS)
7. Contact
8. Privacy Policy
This will take approximately 2-3 minutes.
Proceed with full site audit? (yes/no)
User: yes
Progress:
🔄 Auditing Site Accessibility...
Progress: ████████████░░░░░░░░ 60% (5/8 pages)
✅ Home - Score: 64/100 (12 issues)
✅ About - Score: 78/100 (6 issues)
✅ Services - Score: 71/100 (9 issues)
✅ Team - Score: 85/100 (4 issues)
✅ Blog - Score: 82/100 (5 issues)
🔄 Analyzing Blog Post Template...
Final Report:
═══════════════════════════════════════════════════
SITE-WIDE ACCESSIBILITY AUDIT
═══════════════════════════════════════════════════
OVERALL SCORE: 73/100
Pages Audited: 8
Total Issues: 48
- Critical: 11 issues
- Serious: 21 issues
- Moderate: 16 issues
═══════════════════════════════════════════════════
ISSUES BY PAGE
═══════════════════════════════════════════════════
🔴 Lowest Scores (Need Attention):
1. Home - 64/100 (12 issues: 3 critical, 5 serious, 4 moderate)
2. Services - 71/100 (9 issues: 2 critical, 5 serious, 2 moderate)
3. About - 78/100 (6 issues: 1 critical, 3 serious, 2 moderate)
🟢 Highest Scores:
1. Team - 85/100 (4 issues: 0 critical, 2 serious, 2 moderate)
2. Blog - 82/100 (5 issues: 1 critical, 2 serious, 2 moderate)
═══════════════════════════════════════════════════
SITE-WIDE PATTERNS
═══════════════════════════════════════════════════
Most Common Issues Across Site:
1. Missing button labels (icon buttons) - 8 occurrences
Pages affected: Home, Services, Blog, Contact
2. Focus outline removed - 12 occurrences
Pages affected: All pages (site-wide CSS issue)
3. Form inputs without labels - 5 occurrences
Pages affected: Home, Contact
4. Small touch targets (<44px) - 9 occurrences
Pages affected: Home, About, Services, Contact
═══════════════════════════════════════════════════
RECOMMENDATIONS
═══════════════════════════════════════════════════
🎯 Site-Wide Fixes (Fix Once, Helps Everywhere):
1. Add focus styles to global CSS (affects 12 issues across all pages)
2. Update button component to require aria-label (affects 8 issues)
3. Increase minimum touch target size in design system (affects 9 issues)
📋 Page-Specific Priorities:
1. Home page: Fix navigation menu button and newsletter form
2. Services page: Add labels to service card interactions
3. Contact page: Add proper labels to all form inputs
💡 Design System Improvements:
- Create accessible button component with required aria-label
- Add focus state variants to all interactive components
- Set minimum touch target size standard (44px)
Would you like:
1. Detailed report for specific page
2. Export findings to file (Markdown/JSON/CSV)
3. Help fixing site-wide issues
Example 3: Critical Issues Only
User prompt:
Check my contact page for critical accessibility issues only
Agent response:
🔍 Critical Issues Audit: Contact Page
Running quick scan for blocking accessibility issues...
✅ Page analyzed
═══════════════════════════════════════════════════
CRITICAL ISSUES: Contact Page
═══════════════════════════════════════════════════
Found: 4 critical issues
[1] Form Input Missing Label
Element: Email input field
Location: Contact form, top
Issue: No accessible name for screen readers
Fix: Add aria-label="Your email address"
WCAG: 1.3.1 (Level A)
[2] Form Input Missing Label
Element: Message textarea
Location: Contact form, bottom
Issue: No accessible name for screen readers
Fix: Add aria-label="Your message"
WCAG: 1.3.1 (Level A)
[3] Button Missing Label
Element: Submit button
Location: Contact form, bottom
Issue: Icon-only button with no text
Fix: Add aria-label="Submit contact form"
WCAG: 4.1.2 (Level A)
[4] Non-Semantic Interactive Element
Element: Social media link (Instagram)
Location: Footer
Issue: Div with onClick instead of proper link
Fix: Convert to <a href="..."> with aria-label="Instagram"
WCAG: 2.1.1 (Level A)
═══════════════════════════════════════════════════
⚠️ Impact: These issues prevent screen reader users from using your contact form.
🔧 Estimated fix time: 5 minutes
Would you like me to:
1. Run full audit (includes serious and moderate issues)
2. Fix these 4 critical issues now
3. Export this report (Markdown/JSON/CSV)
Safety Rules
Preview & Confirmation
- Always show detailed issue list before suggesting fixes
- Clearly mark severity levels (critical/serious/moderate)
- Explain impact of each issue in user-friendly terms
- Provide specific WCAG reference for each finding
Granular Approval for Fixes
- Allow user to select which issues to fix
- Warn about fixes that might affect visual design
- Process fixes in batches with progress indicators
- Report success/failure for each fix attempt
Error Handling
- If page cannot be accessed, explain clearly
- If element cannot be modified, suggest manual fix
- Separate automated fixes from manual review items
Validation
- Verify element types before suggesting fixes
- Check if element supports attributes before adding
- Test that suggested fixes are valid for element type
- Warn if fix might break existing functionality
Output Standards
Icons & Formatting
- 🔍 Discovery/Analysis
- 🔄 Processing
- ✅ Pass/Success
- ❌ Fail/Critical Issue
- ⚠️ Warning/Serious Issue
- 💡 Suggestion/Moderate Issue
- 📊 Report/Summary
- 🎯 Priority/Action Item
- 🔴 Critical Priority
- 🟡 Medium Priority
- 🟢 Low Priority
Report Structure
- Clear severity categorization
- Specific element identification with IDs
- Current state vs recommended fix
- WCAG reference for each issue
- Summary with actionable priorities
- Score for measurable progress
Communication
- Use clear, jargon-free language
- Explain WHY something is an issue (impact on users)
- Provide specific, actionable fixes
- Encourage testing with real assistive technology
- Emphasize that automated checks are just the start
Resources to Include
WCAG 2.1 Quick Reference
Webflow Accessibility Resources
- Webflow University: Accessibility best practices
- Using semantic HTML in Webflow
- Adding ARIA attributes in Webflow
Testing Tools
- Keyboard: Tab, Shift+Tab, Enter, Space
- Screen readers: NVDA (Windows), JAWS, VoiceOver (Mac/iOS)
- Browser extensions: axe DevTools, WAVE, Lighthouse
Common Fixes
- Button labels: Always include visible text or aria-label
- Form labels: Use Webflow's label element or aria-label
- Focus styles: Use :focus-visible pseudo-class
- Semantic HTML: Use proper elements (button, a, label)
1---
2name: webflow-mcp-accessibility-audit
3description: Run comprehensive accessibility audit (WCAG 2.1) on Webflow pages - checks buttons, forms, links, focus states, headings, keyboard navigation, and generates detailed reports with fixes. Runs entirely headlessly against a page ID — no Designer connection required. Excludes image alt text (covered by asset-audit skill).
4mcp-version: 2.0.1
5---
6
7# Accessibility Audit
8
9Comprehensive WCAG 2.1 accessibility audit for Webflow pages with detailed issue detection and actionable fixes.
10
11## Important Note
12
13**ALWAYS use Webflow MCP tools for all operations:**
14- Use Webflow MCP's `webflow_guide_tool` to get best practices before starting
15- Use Webflow MCP's `data_sites_tool` with action `list_sites` to identify available sites
16- Use Webflow MCP's `data_sites_tool` with action `get_site` to retrieve site details
17- Use Webflow MCP's `data_pages_tool` with action `list_pages` to get all pages and their page IDs
18- Use Webflow MCP's `data_element_tool` with action `get_all_elements` (passing the page ID directly) to get detailed element information
19- Use Webflow MCP's `data_element_tool` with action `set_attributes` to fix accessibility issues
20- Use Webflow MCP's `element_snapshot_tool` to get visual previews of elements — this is a Designer tool and requires a Designer connection if used
21- DO NOT use any other tools or methods for Webflow operations
22- All tool calls must include the required `context` parameter (15-25 words, third-person perspective)
23- **No Designer connection is required for the audit or fixes.** `data_element_tool` operates headlessly on any page ID from `list_pages`. Designer is only needed if you choose to use `element_snapshot_tool` for optional visual previews.
24
25## Instructions
26
27### Phase 1: Site & Page Selection
281. **Get site information**: Use Webflow MCP's `data_sites_tool` with action `list_sites` to identify target site
292. **Ask for page selection**:
30 - If user provides page ID, use it directly
31 - Otherwise, use `data_pages_tool` with action `list_pages` to show available pages
32 - Let user select which page(s) to audit
333. **Confirm audit scope**: Ask user what to check:
34 - Full audit (all accessibility checks)
35 - Critical issues only (WCAG Level A)
36 - Specific categories (forms, buttons, navigation, etc.)
37
38### Phase 2: Element Extraction & Analysis
394. **Extract all elements**: Use `data_element_tool` with action `get_all_elements`, passing the target page's ID from Phase 1, for detailed analysis — no Designer connection needed
40 - Set `include_style_properties: true` to check focus styles
41 - Set `include_all_breakpoint_styles: false` to minimize data
425. **Parse element data**: Identify interactive and content elements:
43 - Buttons (Button, LinkBlock with button role)
44 - Links (TextLink, Link, LinkBlock)
45 - Form inputs (Input, Select, Textarea)
46 - Headings (Heading elements with levels)
47 - Interactive divs/spans (check for onClick or interactive roles)
48 - Images (Image elements) - **SKIP for this audit**
496. **Extract attributes for each element**:
50 - ARIA attributes (aria-label, aria-describedby, role, tabIndex)
51 - DOM attributes (id, domId, href, type, placeholder)
52 - Text content
53 - Style properties (outline, border for focus states)
54 - Element metadata (canHaveAttributes, tag name)
55
56### Phase 3: Accessibility Checks
57
58#### Critical Issues (Must Fix - WCAG Level A)
597. **Icon-only buttons without labels** (WCAG 4.1.2)
60 - Find: Button elements with no text content
61 - Check: Missing `aria-label` or `aria-labelledby`
62 - Impact: Screen readers cannot identify button purpose
63 - Fix: Add `aria-label` attribute with descriptive text
64
658. **Form inputs without labels** (WCAG 1.3.1)
66 - Find: Input, Select, Textarea elements
67 - Check: Missing associated label or `aria-label`
68 - Impact: Users don't know what input is for
69 - Fix: Add `aria-label` or associate with `<label>` using `id`
70
719. **Non-semantic click handlers** (WCAG 2.1.1)
72 - Find: Div or Span elements (identified by element type)
73 - Check: Interactive behavior without proper role/keyboard support
74 - Impact: Not keyboard accessible, screen readers miss interactivity
75 - Fix: Add `role="button"`, `tabIndex="0"`, suggest using real `<button>`
76
7710. **Links without destination** (WCAG 2.1.1)
78 - Find: Link elements with no `href` attribute
79 - Check: Links that only use onClick without href
80 - Impact: Not keyboard accessible, breaks browser features
81 - Fix: Add proper `href` or convert to button
82
83#### Serious Issues (Should Fix - WCAG Level AA)
8411. **Focus outline removed without replacement** (WCAG 2.4.7)
85 - Find: Elements with `outline: none` style
86 - Check: No visible alternative focus indicator
87 - Impact: Keyboard users can't see focus
88 - Fix: Add visible focus style (border, box-shadow, background change)
89
9012. **Missing keyboard handlers** (WCAG 2.1.1)
91 - Find: Elements with onClick handlers
92 - Check: Missing onKeyDown for Enter/Space keys
93 - Impact: Not usable with keyboard alone
94 - Fix: Add keyboard event handlers
95
9613. **Touch target too small** (WCAG 2.5.5)
97 - Find: Clickable elements (buttons, links)
98 - Check: Width or height < 44px
99 - Impact: Hard to tap on mobile devices
100 - Fix: Increase padding or min-width/min-height to 44px
101
102#### Moderate Issues (Consider Fixing)
10314. **Heading hierarchy problems** (WCAG 1.3.1)
104 - Find: Heading elements (h1-h6)
105 - Check: Skipped levels (h1 → h3, skipping h2)
106 - Impact: Confusing document structure
107 - Fix: Use proper sequential heading levels
108
10915. **Positive tabIndex** (WCAG 2.4.3)
110 - Find: Elements with tabIndex > 0
111 - Check: Disrupts natural tab order
112 - Impact: Confusing keyboard navigation
113 - Fix: Use tabIndex="0" or "-1" only, let natural DOM order work
114
11516. **Role without required attributes** (WCAG 4.1.2)
116 - Find: Elements with ARIA roles
117 - Check: Missing required ARIA attributes (e.g., role="button" without tabIndex)
118 - Impact: Incomplete accessibility semantics
119 - Fix: Add required attributes for role
120
121### Phase 4: Issue Categorization & Scoring
12217. **Categorize all findings**:
123 - Critical: Must fix (blocks access)
124 - Serious: Should fix (significantly impacts usability)
125 - Moderate: Consider fixing (improves experience)
126
12718. **Calculate accessibility score** (0-100):
128 - Start at 100
129 - Critical issue: -10 points each
130 - Serious issue: -5 points each
131 - Moderate issue: -2 points each
132 - Minimum score: 0
133
13419. **Generate severity summary**:
135 - Total issues found
136 - Breakdown by severity
137 - Most common issue types
138 - Pages/sections most affected
139
140### Phase 5: Report Generation
14120. **Create detailed report** with specific format:
142 ```
143 ═══════════════════════════════════════════════════
144 ACCESSIBILITY AUDIT: [Page Name]
145 ═══════════════════════════════════════════════════
146
147 CRITICAL (X issues)
148 ───────────────────
149 [A11Y] Element: Button "Submit"
150 Issue: Button missing accessible name
151 Location: Form section, element ID: {component: "abc", element: "xyz"}
152 Current: <button><CloseIcon /></button>
153 Fix: Add aria-label="Close"
154 WCAG: 4.1.2 Name, Role, Value
155
156 [A11Y] Element: Input field
157 Issue: Form input without label
158 Location: Contact form, element ID: {component: "def", element: "uvw"}
159 Current: <input type="email" />
160 Fix: Add aria-label="Email address" or associate with <label>
161 WCAG: 1.3.1 Info and Relationships
162
163 SERIOUS (X issues)
164 ──────────────────
165 [A11Y] Element: Link "Read more"
166 Issue: Focus outline removed without visible alternative
167 Location: Blog section
168 Current: outline: none
169 Fix: Add visible focus style (e.g., border: 2px solid blue)
170 WCAG: 2.4.7 Focus Visible
171
172 MODERATE (X issues)
173 ───────────────────
174 [A11Y] Element: Heading
175 Issue: Heading hierarchy skipped (h1 → h3)
176 Location: Article section
177 Current: <h3>Subsection</h3> after <h1>Title</h1>
178 Fix: Change to <h2> or add intermediate h2
179 WCAG: 1.3.1 Info and Relationships
180
181 ═══════════════════════════════════════════════════
182 SUMMARY
183 ───────────────────────────────────────────────────
184 Total Issues: X
185 - Critical: X issues
186 - Serious: X issues
187 - Moderate: X issues
188
189 Accessibility Score: XX/100
190
191 Most Common Issues:
192 1. [Issue type] - X occurrences
193 2. [Issue type] - X occurrences
194 3. [Issue type] - X occurrences
195 ═══════════════════════════════════════════════════
196 ```
197
19821. **Provide actionable insights**:
199 - Prioritized fix list (critical first)
200 - Quick wins (easy fixes with big impact)
201 - Design pattern recommendations
202 - Resources for learning more
203
204### Phase 6: Fix Suggestions & Approval (Optional)
20522. **Offer to fix issues automatically**: Fixes don't require Designer, so offer auto-fixes directly
20623. **Show preview of fixes**:
207 ```
208 Which issues would you like to fix?
209
210 [1] ✓ Add aria-label to Submit button
211 Element: Button in contact form
212 Fix: Add aria-label="Submit contact form"
213 Safe: Yes (adding attribute only)
214
215 [2] ✓ Add aria-label to email input
216 Element: Input in contact form
217 Fix: Add aria-label="Email address"
218 Safe: Yes
219
220 [3] ⚠️ Fix heading hierarchy
221 Element: h3 in article section
222 Fix: Change heading level from h3 to h2
223 Safe: May affect visual styling
224
225 Type numbers to skip (e.g., "3"), "all" for all, "none" to cancel
226 ```
227
22824. **Apply approved fixes**: Use `data_element_tool` with action `set_attributes`
229 - Process in batches
230 - Show progress for large fix sets
231 - Report success/failure for each
232
23325. **Generate post-fix report**:
234 - Issues fixed: X
235 - Issues remaining: Y
236 - New accessibility score: XX/100 (improved from YY/100)
237
238### Phase 7: Export & Resources (Optional)
23926. **Offer export formats**:
240 - Markdown (readable documentation)
241 - JSON (machine-readable for tracking)
242 - CSV (spreadsheet for team review)
243
24427. **Provide resources**:
245 - WCAG 2.1 quick reference links
246 - Webflow accessibility best practices
247 - Recommended testing tools (browser extensions, screen readers)
248
249## Important Considerations
250
251### What This Skill Checks
252✅ Button accessibility (labels, roles)
253✅ Form input labels and associations
254✅ Link semantics and keyboard access
255✅ Focus visibility and keyboard navigation
256✅ Heading hierarchy and structure
257✅ ARIA roles and attributes
258✅ Touch target sizes
259✅ Interactive element semantics
260
261### What This Skill Does NOT Check
262❌ Image alt text (use **asset-audit** skill instead)
263❌ Color contrast ratios (requires visual analysis)
264❌ Animation/motion preferences
265❌ Screen reader testing (needs manual verification)
266❌ Content readability (language level, clarity)
267
268### Limitations
269- Cannot detect visual-only issues (color contrast, small text)
270- Cannot test actual screen reader behavior
271- Cannot validate content quality or clarity
272- Relies on element attributes and structure only
273
274## Examples
275
276### Example 1: Full Page Audit
277
278**User prompt:**
279```
280Run an accessibility audit on my homepage
281```
282
283**Step 1: Site & Page Selection**
284```
285🔍 Accessibility Audit: Page Selection
286
287I'll help you audit your homepage for accessibility issues.
288
289First, let me get your site information...
290
291Available sites:
2921. Company Website
2932. Portfolio Site
294
295Which site? (1/2)
296```
297
298**User response:** `1`
299
300**Step 2: Page Selection**
301```
302Available pages in Company Website:
3031. Home (/)
3042. About (/about)
3053. Contact (/contact)
3064. Blog (/blog)
307
308Which page would you like to audit? (1 for Home)
309```
310
311**User response:** `1`
312
313**Step 3: Audit Scope**
314```
315What level of audit would you like?
316
3171. Full audit (all WCAG checks) - Recommended
3182. Critical issues only (Level A compliance)
3193. Specific categories (buttons, forms, navigation)
320
321Your choice: (1/2/3)
322```
323
324**User response:** `1`
325
326**Step 4: Audit Progress**
327```
328🔄 Running Accessibility Audit...
329
330Progress:
331✅ Extracted page content (45 elements)
332✅ Analyzing buttons and interactive elements
333✅ Checking form inputs and labels
334✅ Validating heading hierarchy
335✅ Checking keyboard navigation
336🔄 Analyzing focus states...
337
338Analysis complete!
339```
340
341**Step 5: Report**
342```
343═══════════════════════════════════════════════════
344ACCESSIBILITY AUDIT: Home
345═══════════════════════════════════════════════════
346
347CRITICAL (3 issues)
348───────────────────
349[A11Y] Element: Button (navigation toggle)
350 Issue: Icon-only button missing accessible name
351 Location: Header navigation
352 Element ID: {component: "nav-01", element: "btn-menu"}
353 Current: <button><MenuIcon /></button>
354 Fix: Add aria-label="Open navigation menu"
355 WCAG: 4.1.2 Name, Role, Value
356
357[A11Y] Element: Input (email subscription)
358 Issue: Form input without label
359 Location: Footer, newsletter signup
360 Element ID: {component: "footer-01", element: "email-input"}
361 Current: <input type="email" placeholder="Enter email" />
362 Fix: Add aria-label="Email address for newsletter"
363 WCAG: 1.3.1 Info and Relationships
364
365[A11Y] Element: Div (clickable card)
366 Issue: Non-semantic interactive element
367 Location: Services section, card 2
368 Element ID: {component: "services-01", element: "card-02"}
369 Current: <div onClick={...}>Service card</div>
370 Fix: Convert to <button> or add role="button" + tabIndex="0"
371 WCAG: 2.1.1 Keyboard
372
373SERIOUS (5 issues)
374──────────────────
375[A11Y] Element: Link "Learn more"
376 Issue: Focus outline removed without visible alternative
377 Location: Hero section
378 Element ID: {component: "hero-01", element: "cta-link"}
379 Current: outline: none
380 Fix: Add focus style - border: 2px solid #0066cc or box-shadow
381 WCAG: 2.4.7 Focus Visible
382
383[A11Y] Element: Button "Subscribe"
384 Issue: Touch target too small (30px × 36px)
385 Location: Footer newsletter form
386 Element ID: {component: "footer-01", element: "submit-btn"}
387 Current: Small button
388 Fix: Increase padding or set min-height: 44px
389 WCAG: 2.5.5 Target Size
390
391[continues with 3 more serious issues...]
392
393MODERATE (4 issues)
394───────────────────
395[A11Y] Element: Heading "Our Services"
396 Issue: Heading hierarchy skipped (h1 → h3)
397 Location: Services section
398 Element ID: {component: "services-01", element: "heading"}
399 Current: <h3>Our Services</h3> follows <h1>Welcome</h1>
400 Fix: Change to <h2> to maintain proper hierarchy
401 WCAG: 1.3.1 Info and Relationships
402
403[continues with 3 more moderate issues...]
404
405═══════════════════════════════════════════════════
406SUMMARY
407───────────────────────────────────────────────────
408Total Issues: 12
409- Critical: 3 issues (must fix)
410- Serious: 5 issues (should fix)
411- Moderate: 4 issues (consider fixing)
412
413Accessibility Score: 64/100
414
415Most Common Issues:
4161. Missing button labels - 2 occurrences
4172. Focus styles removed - 3 occurrences
4183. Heading hierarchy problems - 2 occurrences
419
420Quick Wins (Easy + High Impact):
421✨ Add aria-label to icon buttons (2 min, +20 score points)
422✨ Add input labels (5 min, +10 score points)
423✨ Add focus styles (10 min, +15 score points)
424
425═══════════════════════════════════════════════════
426
427💡 Next Steps:
4281. Fix critical issues first (blocks access for some users)
4292. Add visible focus styles for keyboard users
4303. Test with keyboard navigation (Tab, Enter, Space keys)
4314. Consider testing with screen reader (NVDA/JAWS/VoiceOver)
432
433Would you like me to help fix these issues?
434```
435
436### Example 2: Multi-Page Audit
437
438**User prompt:**
439```
440Audit accessibility across my entire site
441```
442
443**Agent response:**
444```
445🔍 Multi-Page Accessibility Audit
446
447I'll audit all pages on your site for accessibility issues.
448
449Found 8 pages:
4501. Home
4512. About
4523. Services
4534. Team
4545. Blog
4556. Blog Post Template (CMS)
4567. Contact
4578. Privacy Policy
458
459This will take approximately 2-3 minutes.
460
461Proceed with full site audit? (yes/no)
462```
463
464**User:** `yes`
465
466**Progress:**
467```
468🔄 Auditing Site Accessibility...
469
470Progress: ████████████░░░░░░░░ 60% (5/8 pages)
471
472✅ Home - Score: 64/100 (12 issues)
473✅ About - Score: 78/100 (6 issues)
474✅ Services - Score: 71/100 (9 issues)
475✅ Team - Score: 85/100 (4 issues)
476✅ Blog - Score: 82/100 (5 issues)
477🔄 Analyzing Blog Post Template...
478```
479
480**Final Report:**
481```
482═══════════════════════════════════════════════════
483SITE-WIDE ACCESSIBILITY AUDIT
484═══════════════════════════════════════════════════
485
486OVERALL SCORE: 73/100
487
488Pages Audited: 8
489Total Issues: 48
490- Critical: 11 issues
491- Serious: 21 issues
492- Moderate: 16 issues
493
494═══════════════════════════════════════════════════
495ISSUES BY PAGE
496═══════════════════════════════════════════════════
497
498🔴 Lowest Scores (Need Attention):
4991. Home - 64/100 (12 issues: 3 critical, 5 serious, 4 moderate)
5002. Services - 71/100 (9 issues: 2 critical, 5 serious, 2 moderate)
5013. About - 78/100 (6 issues: 1 critical, 3 serious, 2 moderate)
502
503🟢 Highest Scores:
5041. Team - 85/100 (4 issues: 0 critical, 2 serious, 2 moderate)
5052. Blog - 82/100 (5 issues: 1 critical, 2 serious, 2 moderate)
506
507═══════════════════════════════════════════════════
508SITE-WIDE PATTERNS
509═══════════════════════════════════════════════════
510
511Most Common Issues Across Site:
5121. Missing button labels (icon buttons) - 8 occurrences
513 Pages affected: Home, Services, Blog, Contact
514
5152. Focus outline removed - 12 occurrences
516 Pages affected: All pages (site-wide CSS issue)
517
5183. Form inputs without labels - 5 occurrences
519 Pages affected: Home, Contact
520
5214. Small touch targets (<44px) - 9 occurrences
522 Pages affected: Home, About, Services, Contact
523
524═══════════════════════════════════════════════════
525RECOMMENDATIONS
526═══════════════════════════════════════════════════
527
528🎯 Site-Wide Fixes (Fix Once, Helps Everywhere):
5291. Add focus styles to global CSS (affects 12 issues across all pages)
5302. Update button component to require aria-label (affects 8 issues)
5313. Increase minimum touch target size in design system (affects 9 issues)
532
533📋 Page-Specific Priorities:
5341. Home page: Fix navigation menu button and newsletter form
5352. Services page: Add labels to service card interactions
5363. Contact page: Add proper labels to all form inputs
537
538💡 Design System Improvements:
539- Create accessible button component with required aria-label
540- Add focus state variants to all interactive components
541- Set minimum touch target size standard (44px)
542
543Would you like:
5441. Detailed report for specific page
5452. Export findings to file (Markdown/JSON/CSV)
5463. Help fixing site-wide issues
547```
548
549### Example 3: Critical Issues Only
550
551**User prompt:**
552```
553Check my contact page for critical accessibility issues only
554```
555
556**Agent response:**
557```
558🔍 Critical Issues Audit: Contact Page
559
560Running quick scan for blocking accessibility issues...
561
562✅ Page analyzed
563
564═══════════════════════════════════════════════════
565CRITICAL ISSUES: Contact Page
566═══════════════════════════════════════════════════
567
568Found: 4 critical issues
569
570[1] Form Input Missing Label
571 Element: Email input field
572 Location: Contact form, top
573 Issue: No accessible name for screen readers
574 Fix: Add aria-label="Your email address"
575 WCAG: 1.3.1 (Level A)
576
577[2] Form Input Missing Label
578 Element: Message textarea
579 Location: Contact form, bottom
580 Issue: No accessible name for screen readers
581 Fix: Add aria-label="Your message"
582 WCAG: 1.3.1 (Level A)
583
584[3] Button Missing Label
585 Element: Submit button
586 Location: Contact form, bottom
587 Issue: Icon-only button with no text
588 Fix: Add aria-label="Submit contact form"
589 WCAG: 4.1.2 (Level A)
590
591[4] Non-Semantic Interactive Element
592 Element: Social media link (Instagram)
593 Location: Footer
594 Issue: Div with onClick instead of proper link
595 Fix: Convert to <a href="..."> with aria-label="Instagram"
596 WCAG: 2.1.1 (Level A)
597
598═══════════════════════════════════════════════════
599
600⚠️ Impact: These issues prevent screen reader users from using your contact form.
601
602🔧 Estimated fix time: 5 minutes
603
604Would you like me to:
6051. Run full audit (includes serious and moderate issues)
6062. Fix these 4 critical issues now
6073. Export this report (Markdown/JSON/CSV)
608```
609
610## Safety Rules
611
612### Preview & Confirmation
613- Always show detailed issue list before suggesting fixes
614- Clearly mark severity levels (critical/serious/moderate)
615- Explain impact of each issue in user-friendly terms
616- Provide specific WCAG reference for each finding
617
618### Granular Approval for Fixes
619- Allow user to select which issues to fix
620- Warn about fixes that might affect visual design
621- Process fixes in batches with progress indicators
622- Report success/failure for each fix attempt
623
624### Error Handling
625- If page cannot be accessed, explain clearly
626- If element cannot be modified, suggest manual fix
627- Separate automated fixes from manual review items
628
629### Validation
630- Verify element types before suggesting fixes
631- Check if element supports attributes before adding
632- Test that suggested fixes are valid for element type
633- Warn if fix might break existing functionality
634
635## Output Standards
636
637### Icons & Formatting
638- 🔍 Discovery/Analysis
639- 🔄 Processing
640- ✅ Pass/Success
641- ❌ Fail/Critical Issue
642- ⚠️ Warning/Serious Issue
643- 💡 Suggestion/Moderate Issue
644- 📊 Report/Summary
645- 🎯 Priority/Action Item
646- 🔴 Critical Priority
647- 🟡 Medium Priority
648- 🟢 Low Priority
649
650### Report Structure
6511. Clear severity categorization
6522. Specific element identification with IDs
6533. Current state vs recommended fix
6544. WCAG reference for each issue
6555. Summary with actionable priorities
6566. Score for measurable progress
657
658### Communication
659- Use clear, jargon-free language
660- Explain WHY something is an issue (impact on users)
661- Provide specific, actionable fixes
662- Encourage testing with real assistive technology
663- Emphasize that automated checks are just the start
664
665## Resources to Include
666
667### WCAG 2.1 Quick Reference
668- https://www.w3.org/WAI/WCAG21/quickref/
669
670### Webflow Accessibility Resources
671- Webflow University: Accessibility best practices
672- Using semantic HTML in Webflow
673- Adding ARIA attributes in Webflow
674
675### Testing Tools
676- Keyboard: Tab, Shift+Tab, Enter, Space
677- Screen readers: NVDA (Windows), JAWS, VoiceOver (Mac/iOS)
678- Browser extensions: axe DevTools, WAVE, Lighthouse
679
680### Common Fixes
681- Button labels: Always include visible text or aria-label
682- Form labels: Use Webflow's label element or aria-label
683- Focus styles: Use :focus-visible pseudo-class
684- Semantic HTML: Use proper elements (button, a, label)