Software Development
Accessibility Auditor
Scans UI components for WCAG 2.2 AA violations including ARIA gaps, keyboard navigation issues, contrast failures, and screen reader compatibility. Useful for legal compliance and inclusive product development. Frontend engineers shipping UI, product teams preparing for enterprise procurement checklists, startups responding to accessibility-clause contract requirements, engineers working on public-sector software. AI-generated UI components consistently ship without the accessibility scaffolding that experienced frontend engineers apply reflexively: ARIA labels on icon-only buttons, focus management in modals, semantic landmarks, color contrast meeting AA ratios, keyboard handlers on interactive elements. A pre-ship auditor catches the high-signal violations before they reach production, which is when remediation is cheap.
One-Time Purchase
$19.99
Accessibility Audit — src/components/ProductFilterSidebar.tsx
Framework: React 19 + Radix UI · Target: WCAG 2.2 AA · Components scanned: 7
Verdict
Do not ship. Two criticals — a custom dual-handle price slider unreachable by keyboard or screen reader, and a global *:focus { outline: none; } rule that leaves keyboard users without a visible focus indicator on most controls. Eleven findings total. Static analysis catches structure and attributes; live-region timing and focus-trap correctness still need a manual NVDA/VoiceOver pass before the conformance claim is defensible.
Findings by severity
Findings by WCAG Criterion
| WCAG | Criterion | Location | Severity | Status |
|---|---|---|---|---|
| 1.4.3 | Contrast (Minimum) | FilterGroup.tsx:42 disabled count | Critical | 2.1:1 (need 4.5:1) |
| 2.1.1 + 4.1.2 | Keyboard / Name-Role-Value | PriceRangeSlider.tsx:18 | Critical | Unreachable |
| 2.4.11 | Focus Appearance | globals.css:3 | Critical | Outline suppressed globally |
| 1.4.1 + 4.1.2 | Use of Color / NRV | ColorSwatchGroup.tsx:29 | Serious | Selected/unavailable color-only |
| 4.1.2 + 1.3.1 | Name-Role-Value | CollapsibleSection.tsx:14 | Serious | Icon-only button, no aria-expanded |
| 2.1.1 | Keyboard | ClearFiltersLink.tsx:8 | Serious | <a> without href |
| 1.3.1 | Info and Relationships | FilterGroup.tsx:10 | Serious | No <fieldset>/<legend> |
| 4.1.3 | Status Messages | ApplyButton.tsx:22 | Moderate | No live region for result count |
| 1.3.1 | Info and Relationships | FilterGroup.tsx:26 | Moderate | id collision risk |
| 1.1.1 | Non-text Content | ChevronIcon.tsx, FilterIcon.tsx | Minor | Missing aria-hidden |
| 1.4.3 | Contrast (hover) | ApplyButton.module.css:18 | Minor | 3.8:1 on hover (need 4.5:1) |
Screen-Reader vs Keyboard
Screen reader (NVDA inferred)
5 blocking gaps
What a JAWS/NVDA user cannot do today
Keyboard-only
4 blocking gaps
What a Tab-key user cannot do today
Critical Findings — Detail
F-01 — Disabled filter count contrast Critical
FilterGroup.tsx:42 renders #9CA3AF on #F9FAFB at 13px / non-bold. Measured 2.1:1 against the 4.5:1 minimum.
/* Before — fails 1.4.3 */
.filter-count-disabled { color: #9CA3AF; background: #F9FAFB; }
/* After — passes at 5.3:1 */
.filter-count-disabled { color: #6B7280; background: #F9FAFB; }
F-02 — Price slider unreachable Critical
PriceRangeSlider.tsx:18 implements both handles as unstyled <div> elements with mouse-only drag handlers — no role="slider", no aria-value*, no tabIndex. A keyboard or screen-reader user has no path to use the control.
// Preferred: native inputs styled with CSS — no ARIA required
<div className="price-range-track">
<input type="range" min={0} max={500} value={minPrice}
onChange={(e) => setMinPrice(Number(e.target.value))}
aria-label="Minimum price" />
<input type="range" min={0} max={500} value={maxPrice}
onChange={(e) => setMaxPrice(Number(e.target.value))}
aria-label="Maximum price" />
</div>
First rule of ARIA: prefer native <input type="range"> over role="slider" on a <div>. Custom ARIA pattern only if a native input genuinely cannot meet the visual design after CSS.
F-07 — Focus indicator suppressed globally Critical
globals.css:3 contains *:focus { outline: none; }. Component-level :focus-visible exists on ApplyButton but not on checkboxes, swatches, or the collapse toggle. Result: a keyboard user often has no idea where focus is.
/* DELETE: *:focus { outline: none; } */
:focus-visible {
outline: 3px solid #2563EB;
outline-offset: 2px;
border-radius: 2px;
}
Recommended Fixes
Fix order (highest leverage first)
Color Contrast Report
| Element | Foreground | Background | Ratio | Status |
|---|---|---|---|---|
| Filter count (disabled) | #9CA3AF | #F9FAFB | 2.1:1 | Fail |
| Checkbox label | #111827 | #FFFFFF | 16.1:1 | Pass |
| Apply button (default) | #FFFFFF | #1D4ED8 | 8.6:1 | Pass |
| Apply button (hover) | #FFFFFF | #3B82F6 | 3.8:1 | Fail |
| Clear filters link | #6B7280 | #FFFFFF | 4.6:1 | Pass |
| Section label | #374151 | #F3F4F6 | 7.2:1 | Pass |
| Unavailable swatch label | #9CA3AF | #FFFFFF | 2.5:1 | Manual review |
Keyboard Traversal (inferred from static source)
| Component | Tab Stop | Arrow Keys | Issue |
|---|---|---|---|
CollapsibleSection toggle | Not reachable | n/a | F-04 |
PriceRangeSlider (min handle) | Not reachable | Unsupported | F-02 |
PriceRangeSlider (max handle) | Not reachable | Unsupported | F-02 |
| Color swatches | Reachable | No visible focus | F-07 |
| Filter checkboxes | Reachable | n/a | F-09 (id collision) |
| Apply button | Reachable | n/a | OK |
| Clear filters | Inconsistent | n/a | F-05 |
Scope notice
Static analysis confirms structural and attribute-level violations only. Focus-trap correctness on filter apply, live-region announcement timing, and screen-reader virtual-cursor interaction still require manual testing with NVDA / JAWS / VoiceOver. Testing with assistive-technology users is the final gate before any WCAG 2.2 AA conformance claim.
Illustrative component audit. Color values and line numbers reset per scan against the real source file.
This sample illustrates the skill's output format. Names, metrics, and operational details are illustrative unless the artifact explicitly analyzes public information.
View full sample →
All sales final. No refunds on digital products.
Includes support for Claude Code, Codex, OpenClaw, and Google Antigravity in the same license.
Also in Specs & Governance
Bundle price: $55. Compare this skill with the full workflow bundle or Pro access.
Best for
Frontend engineers and design-system maintainers running a WCAG 2.2 AA pass on a component library or a customer-facing app, and startups responding to an enterprise procurement checklist that requires an accessibility statement. Most useful as a pre-merge gate on UI components shipped by AI coding sessions, which routinely skip the accessibility scaffolding experienced frontend engineers apply reflexively.
Not ideal for
Anything that requires assistive-technology user testing — the audit catches the deterministic violations, not how a real screen-reader user experiences a flow. Also a poor fit for highly custom canvas or WebGL interfaces where the WCAG criteria don’t map cleanly and a specialist audit is needed.
Included in this purchase
- Claude Code, Codex, OpenClaw, and Google Antigravity skill files.
- Setup guidance for the right adapter in your workspace.
- One-time license for the purchased skill version.
Setup
Plan for a short setup in the repository or workspace where the skill will run. Some coding familiarity helps for implementation-heavy outputs.
Related Skills
$19.99
One-time license
$19.99
One-time license
$19.99
One-time license
Future Updates
This purchase includes the current version of the skill. If you want future adapter updates — meaning compatibility and packaging updates as supported platforms evolve — plus new catalog additions included automatically, upgrade to Pro.