visual-design-principles/skills/accessibility-inclusive-design/SKILL.md
This skill should be used when the user is implementing accessible design, checking color contrast ratios, adding keyboard navigation, supporting screen readers, handling color blindness, implementing ARIA attributes, designing focus indicators, meeting WCAG 2.2 compliance, or building inclusive interfaces. Covers WCAG 2.2 AA requirements, color contrast (4.5:1 body, 3:1 large text), color independence (never rely on color alone), keyboard navigation, focus indicators, touch targets, screen reader considerations, and automated testing with axe-core.
npx skillsauth add oborchers/fractional-cto accessibility-inclusive-designInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
16% of the global population has a disability (WHO). Accessibility is not an edge case -- it is a core design quality dimension. WCAG 2.2 AA compliance is the minimum bar, not a stretch goal. Inaccessible design is broken design.
| Principle | Requirement | Key Rules | |-----------|-------------|-----------| | Perceivable | All content perceivable by all users | Text alternatives, captions, sufficient contrast, no color-only meaning | | Operable | All functionality operable via all input methods | Keyboard accessible, no time traps, skip links, focus indicators | | Understandable | Content and operation are understandable | Plain language, consistent navigation, specific error messages | | Robust | Content works with current and future technologies | Valid HTML, ARIA roles used correctly, tested across assistive tech |
| Element | Minimum Ratio (AA) | AAA Target | Tool | |---------|-------------------|------------|------| | Body text (<18px / <14px bold) | 4.5:1 | 7:1 | WebAIM Contrast Checker | | Large text (>=18px / >=14px bold) | 3:1 | 4.5:1 | Chrome DevTools | | Non-text elements (icons, borders, focus rings) | 3:1 | -- | axe-core | | Disabled elements | Exempt | -- | -- | | Decorative elements | Exempt | -- | -- |
Practical rule: Test every foreground/background combination. Gray text on white is the most common failure -- #767676 on #fff is the lightest gray that passes 4.5:1.
Never rely on color alone to convey meaning. Provide redundant encoding for every color-coded element.
| Context | Bad (Color Only) | Good (Redundant Encoding) | |---------|------------------|---------------------------| | Status indicators | Red dot / green dot | Red dot + "Error" label / green dot + checkmark icon | | Form validation | Red border on invalid field | Red border + error icon + error message text | | Charts and data viz | Color-coded lines only | Color + pattern (dash, dot) + labeled legend | | Links in body text | Color difference only | Color + underline (or underline on hover minimum) | | Alerts and banners | Background color only | Background color + icon + role="alert" |
Never remove :focus outlines without providing a replacement. Use :focus-visible to show focus rings only for keyboard users.
| Rule | Implementation |
|------|----------------|
| Never use outline: none without replacement | Remove only if custom focus style is applied |
| Use :focus-visible over :focus | Prevents focus rings on mouse clicks |
| Minimum focus ring | 3px solid with 2px offset in high-contrast color |
| Focus must be visible on all backgrounds | Test on light, dark, and colored backgrounds |
| Focus order must match visual order | Use tabindex="0", avoid positive tabindex values |
| Requirement | Implementation |
|-------------|----------------|
| All interactive elements reachable via Tab | Buttons, links, inputs, selects, custom widgets |
| Logical tab order | Matches visual left-to-right, top-to-bottom flow |
| Skip link as first focusable element | <a href="#main" class="skip-link">Skip to content</a> |
| Escape closes modals/dropdowns | Return focus to the trigger element |
| Arrow keys for composite widgets | Tabs, menus, radio groups, listboxes |
| No keyboard traps | Every focusable area can be exited via Tab or Escape |
Minimum touch target size is 44x44px (WCAG 2.2 Level AA). Maintain 8px minimum spacing between adjacent targets to prevent accidental activation.
| Element | Minimum Size | Minimum Spacing | |---------|-------------|-----------------| | Buttons | 44x44px | 8px | | Links in navigation | 44px height | 8px vertical gap | | Icon buttons | 44x44px (padding around smaller icons) | 8px | | Inline text links | Exempt (but avoid dense clusters) | -- |
| Guideline | Rule |
|-----------|------|
| Heading hierarchy | h1 through h6 in logical order -- never skip levels |
| Landmark regions | <header>, <nav>, <main>, <footer>, <aside> on every page |
| Alt text strategy | Informative images: describe content. Decorative images: alt="". Complex images: aria-describedby linking to long description |
| Button labels | Avoid "Click here" -- use descriptive labels: "Download invoice PDF" |
| Form labels | Every input has a visible <label> with matching for/id |
| Live regions | aria-live="polite" for status updates, aria-live="assertive" for errors |
| Hidden content | Use aria-hidden="true" for decorative elements, sr-only class for screen-reader-only text |
| Tool | Catches | Limitation | |------|---------|------------| | axe-core | ~30% of WCAG issues: contrast, missing labels, ARIA misuse | Cannot test visual layout, reading order, keyboard flow | | Lighthouse Accessibility | Same engine as axe-core, scores 0-100 | Score of 100 does not mean accessible | | WAVE | Visual overlay of issues on page | Cannot test dynamic content |
Automated tools catch 30-50% of issues. Manual testing is required for: keyboard navigation flow, screen reader experience, focus management in dynamic content, reading order, and cognitive clarity.
| Anti-Pattern | Why It Fails | Fix |
|-------------|-------------|-----|
| Color-only status indicators | Invisible to colorblind users (8% of males) | Add icon + text label |
| outline: none without replacement | Keyboard users cannot see focus | Use :focus-visible with custom ring |
| Placeholder-only labels | Disappear on input; not announced by all screen readers | Use visible <label> elements |
| Auto-playing video/audio | Disorienting; cannot be stopped by keyboard alone | Require user-initiated play |
| Missing heading hierarchy | Screen reader users cannot navigate by headings | Use h1-h6 in logical order |
| div and span as buttons | No keyboard support, no screen reader role | Use <button> or add role="button" + tabindex="0" + keyboard handler |
| Positive tabindex values | Breaks natural focus order | Use tabindex="0" or -1 only |
Working implementations in examples/:
examples/accessible-form-and-focus.md -- Accessible form with proper labels, focus indicators, error messaging, and ARIA attributes in CSS/HTML/ReactWhen reviewing or building for accessibility:
:focus-visible used instead of :focus where appropriateheader, nav, main, footer)<label> with matching for/idaria-describedbytools
This skill should be used when the user invokes any /plan-* command from the planning-tools plugin (/plan-context, /plan-master, /plan-open-questions, /plan-verify, /plan-tick, /plan-progress, /plan-delete), asks how Claude Code's plan files work, asks where plans are stored, asks to author or audit a multi-phase master planning document, asks how to walk through a plan's Open Questions interactively, asks how to write progress entries, or mentions ~/.claude/plans/ or .claude/planning-tools.local.md. Provides the index of planning-tools commands, the master-plan workflow lifecycle, the v0.3.0+ list-shape mandate (phases and questions as headings + bulleted scope items, never tables), the v0.3.2+ plain-bullet shape (no `- [ ]` checkboxes — heading emoji is the sole tick signal), the progress-entry methodology, and the mechanics of Claude Code's plan-mode file storage.
testing
This skill should be used by the plan-verifier agent and the /plan-verify command to audit a drafted master plan against a fixed checklist. Covers universal-core completeness, the v0.3.0+ no-tables-for-phases-or-questions rule, trigger-based section-coverage gaps, phase actionability (heading + per-phase TL;DR + bulleted scope + exit criteria), the v0.3.1+ per-phase TL;DR requirement, the v0.3.2+ plain-bullet scope shape (legacy `- [ ]`/`- [x]` accepted silently), the v0.3.3+ context-block shape (plan-level `**TL;DR:**` + bulleted metadata, legacy `>` blockquote accepted silently), integer phase numbering enforcement, dependency traceability, citation resolution, callout/evidence convention compliance, Open Questions placement, and the one-PR-per-master-plan rule. Single-owner of the audit checklist.
tools
This skill should be used when authoring, reviewing, or modifying a multi-phase master planning document via the planning-tools plugin (especially the /plan-master and /plan-verify commands). Codifies the universal core sections, trigger-based optional sections, integer-only phase numbering, Open Questions placement, one-PR-per-plan rule, status conventions, evidence attribution, callouts, cross-reference formats, the v0.3.0 list-shape mandate (phases and questions are heading + bulleted list, never markdown tables), the v0.3.1 per-phase TL;DR requirement (1–3 sentence what/why summary under each phase heading for glance-ability), the v0.3.2 plain-bullet scope shape (`- <action>` items, no `- [ ]` checkboxes — the phase status emoji is the sole tick signal), and the v0.3.3 context-block shape (a plan-level `**TL;DR:**` + a bulleted metadata list instead of a `>` blockquote; legacy blockquote blocks accepted silently). Project-agnostic — no ticket-prefix or plan-type taxonomy.
testing
This skill should be used when the user is adjusting spacing, padding, margins, content density, section gaps, vertical rhythm, or separation between elements. Also applies when reviewing whether a design feels cramped or too sparse, choosing between borders and whitespace for separation, or defining a spacing system. Covers the 4px/8px spacing system, macro vs micro whitespace, content density spectrum, separation techniques (whitespace > background shifts > borders), and vertical rhythm.