Skip to content
accessibility-planning logo

Accessibility Planning

accessibility-planning

Plan accessibility compliance - WCAG 2.2, Section 508, EN 301 549, inclusive design principles, audit planning, and remediation strategies.

SKILL.md

Full skill instructions

Accessibility Planning

Plan for inclusive design and WCAG compliance before development begins.

When to Use This Skill

Use this skill when:

  • Accessibility Planning tasks - Working on plan accessibility compliance - wcag 2.2, section 508, en 301 549, inclusive design principles, audit planning, and remediation strategies
  • Planning or design - Need guidance on Accessibility Planning approaches
  • Best practices - Want to follow established patterns and standards

MANDATORY: Skill Loading First

Before answering ANY accessibility question:

  1. Use official WCAG and accessibility standards
  2. Base all guidance on validated accessibility practices

Accessibility Standards

WCAG 2.2 Overview

LevelDescriptionTypical Requirement
AMinimumBasic accessibility barriers removed
AAStandardMost common barriers addressed
AAAEnhancedHighest level of accessibility

Target: Most organizations target WCAG 2.2 Level AA.

Compliance Frameworks

StandardRegionApplies To
WCAG 2.2GlobalWeb content
Section 508USAFederal agencies, contractors
EN 301 549EuropePublic sector, ICT products
ADAUSAPublic accommodations
AODAOntario, CanadaBusinesses, organizations

WCAG 2.2 Principles (POUR)

1. Perceivable

Users must be able to perceive content.

GuidelineKey Requirements
1.1 Text AlternativesAlt text for images, captions for audio
1.2 Time-based MediaCaptions, audio descriptions, transcripts
1.3 AdaptableStructure via semantic HTML, meaningful sequence
1.4 DistinguishableColor contrast, resize text, audio control

2. Operable

Users must be able to operate the interface.

GuidelineKey Requirements
2.1 Keyboard AccessibleAll functionality via keyboard
2.2 Enough TimeAdjustable timing, pause/​stop content
2.3 SeizuresNo flashing content >3 times/​second
2.4 NavigableSkip links, page titles, focus order
2.5 Input ModalitiesPointer gestures, target size, motion

3. Understandable

Content and operation must be understandable.

GuidelineKey Requirements
3.1 ReadableLanguage identification, abbreviations
3.2 PredictableConsistent navigation, no unexpected changes
3.3 Input AssistanceError identification, labels, suggestions

4. Robust

Content must work with assistive technologies.

GuidelineKey Requirements
4.1 CompatibleValid markup, name/​role/​value for components

WCAG 2.2 New Success Criteria

CriterionLevelDescription
2.4.11 Focus Not Obscured (Min)AAFocused element not entirely hidden
2.4.12 Focus Not Obscured (Enhanced)AAAFocused element not partially hidden
2.4.13 Focus AppearanceAAAVisible focus indicator requirements
2.5.7 Dragging MovementsAASingle-pointer alternative to dragging
2.5.8 Target Size (Minimum)AA24x24 CSS pixels minimum
3.2.6 Consistent HelpAHelp mechanisms in consistent location
3.3.7 Redundant EntryADon't require re-entering same info
3.3.8 Accessible Authentication (Min)AANo cognitive function tests for auth
3.3.9 Accessible Authentication (Enhanced)AAAExtended auth requirements

Accessibility Audit Planning

Audit Types

TypeScopeWhen
Quick AuditHigh-traffic pages, key flowsSprint review
Comprehensive AuditFull WCAG checklistBefore launch
Continuous MonitoringAutomated scansOngoing
User TestingWith assistive technology usersPeriodically

Audit Checklist Template

# Accessibility Audit Plan

## Scope
- **Product/​Site:** [Name]
- **Pages/​Components:** [List or "All"]
- **Standard:** WCAG 2.2 Level AA
- **Timeline:** [Dates]

## Testing Matrix

### Automated Testing
- [ ] axe DevTools scan
- [ ] WAVE evaluation
- [ ] Lighthouse accessibility audit
- [ ] Pa11y CI integration

### Manual Testing
- [ ] Keyboard-only navigation
- [ ] Screen reader testing (NVDA, VoiceOver, JAWS)
- [ ] High contrast mode
- [ ] Browser zoom (200%)
- [ ] Color blindness simulation

### Assistive Technology Matrix

| AT | Browser | OS | Tester |
|----|---------|----|----|
| NVDA | Chrome | Windows | [Name] |
| JAWS | Chrome | Windows | [Name] |
| VoiceOver | Safari | macOS | [Name] |
| VoiceOver | Safari | iOS | [Name] |
| TalkBack | Chrome | Android | [Name] |

## Pages/​Components to Test

| Priority | Page/​Component | URL/​Location | Status |
|----------|----------------|--------------|--------|
| High | Homepage | / | Pending |
| High | Login | /​login | Pending |
| High | Checkout | /​checkout | Pending |
| Medium | Product listing | /​products | Pending |
| Medium | Forms | /​contact | Pending |

## Issue Tracking
- **Tool:** [Jira/​GitHub Issues/​etc.]
- **Label:** accessibility
- **Severity Levels:** Critical, Major, Minor, Enhancement

## Deliverables
- [ ] Issue log with WCAG mapping
- [ ] Prioritized remediation plan
- [ ] VPAT/​ACR (if required)
- [ ] Executive summary

Common Accessibility Issues

Critical (Level A failures)

IssueWCAGFix
Missing alt text1.1.1Add descriptive alt attributes
No keyboard access2.1.1Ensure all interactive elements focusable
Missing form labels1.3.1Associate labels with inputs
Empty buttons/​links4.1.2Add accessible names
Auto-playing media1.4.2Provide pause/​stop controls

Major (Level AA failures)

IssueWCAGFix
Low color contrast1.4.34.5:1 for text, 3:1 for large text
No skip navigation2.4.1Add skip link to main content
Missing page titles2.4.2Unique, descriptive titles
Focus not visible2.4.7Visible focus indicator
Reflow issues1.4.10Responsive at 400% zoom

.NET/​Blazor Accessibility Patterns

// Accessible button component
@code {
    [Parameter] public string AriaLabel { get; set; } = "";
    [Parameter] public bool IsDisabled { get; set; }
    [Parameter] public RenderFragment? ChildContent { get; set; }
    [Parameter] public EventCallback OnClick { get; set; }
}

<button
    type="button"
    aria-label="@AriaLabel"
    aria-disabled="@IsDisabled.ToString().ToLower()"
    disabled="@IsDisabled"
    @onclick="HandleClick"
    class="btn">
    @ChildContent
</​button>

@code {
    private async Task HandleClick()
    {
        if (!IsDisabled)
        {
            await OnClick.InvokeAsync();
        }
    }
}
// Accessible form field
<div class="form-group">
    <label for="@Id" class="@(IsRequired ? "required" : "")">
        @Label
        @if (IsRequired)
        {
            <span aria-hidden="true">*</​span>
            <span class="visually-hidden">(required)</​span>
        }
    </​label>

    <input
        id="@Id"
        name="@Name"
        type="@Type"
        @bind="Value"
        aria-required="@IsRequired.ToString().ToLower()"
        aria-invalid="@(!string.IsNullOrEmpty(ErrorMessage)).ToString().ToLower()"
        aria-describedby="@(HasError ? $"{Id}-error" : HintId)"
        class="@(HasError ? "input-error" : "")" />

    @if (!string.IsNullOrEmpty(Hint))
    {
        <span id="@HintId" class="hint">@Hint</​span>
    }

    @if (HasError)
    {
        <span id="@($"{Id}-error")" class="error" role="alert">
            @ErrorMessage
        </​span>
    }
</​div>
// Skip link component
<a href="#main-content" class="skip-link">
    Skip to main content
</​a>

<style>
    .skip-link {
        position: absolute;
        top: -40px;
        left: 0;
        background: #000;
        color: #fff;
        padding: 8px;
        z-index: 100;
    }

    .skip-link:focus {
        top: 0;
    }
</​style>

Color Contrast Requirements

Contrast Ratios

Element TypeWCAG AAWCAG AAA
Normal text (<18pt)4.5:17:1
Large text (≥18pt or ≥14pt bold)3:14.5:1
UI components & graphics3:13:1

Contrast Checker

public class ContrastChecker
{
    public record ContrastResult(
        double Ratio,
        bool PassesAA,
        bool PassesAAA,
        bool PassesLargeTextAA,
        bool PassesLargeTextAAA
    );

    public ContrastResult Calculate(string foreground, string background)
    {
        var fgLuminance = GetRelativeLuminance(foreground);
        var bgLuminance = GetRelativeLuminance(background);

        var lighter = Math.Max(fgLuminance, bgLuminance);
        var darker = Math.Min(fgLuminance, bgLuminance);

        var ratio = (lighter + 0.05) / (darker + 0.05);
        ratio = Math.Round(ratio, 2);

        return new ContrastResult(
            Ratio: ratio,
            PassesAA: ratio >= 4.5,
            PassesAAA: ratio >= 7,
            PassesLargeTextAA: ratio >= 3,
            PassesLargeTextAAA: ratio >= 4.5
        );
    }

    private static double GetRelativeLuminance(string hex)
    {
        var rgb = ParseHex(hex);
        var r = GetLuminanceComponent(rgb.R);
        var g = GetLuminanceComponent(rgb.G);
        var b = GetLuminanceComponent(rgb.B);

        return 0.2126 * r + 0.7152 * g + 0.0722 * b;
    }

    private static double GetLuminanceComponent(byte value)
    {
        var sRGB = value / 255.0;
        return sRGB <= 0.03928
            ? sRGB / 12.92
            : Math.Pow((sRGB + 0.055) / 1.055, 2.4);
    }

    private static (byte R, byte G, byte B) ParseHex(string hex)
    {
        hex = hex.TrimStart('#');
        return (
            Convert.ToByte(hex[..2], 16),
            Convert.ToByte(hex[2..4], 16),
            Convert.ToByte(hex[4..6], 16)
        );
    }
}

Keyboard Navigation Requirements

Focus Order

// Tab order management
public class FocusManager
{
    private readonly IJSRuntime _js;

    public async Task SetFocusTo(string elementId)
    {
        await _js.InvokeVoidAsync("focusElement", elementId);
    }

    public async Task TrapFocusInModal(string modalId)
    {
        await _js.InvokeVoidAsync("trapFocus", modalId);
    }

    public async Task RestoreFocus(string previousElementId)
    {
        await _js.InvokeVoidAsync("focusElement", previousElementId);
    }
}
// Focus trap for modals
window.trapFocus = function(modalId) {
    const modal = document.getElementById(modalId);
    const focusableElements = modal.querySelectorAll(
        'button, [href], input, select, textarea, [tabindex]:not([tabindex="-1"])'
    );

    const firstElement = focusableElements[0];
    const lastElement = focusableElements[focusableElements.length - 1];

    modal.addEventListener('keydown', function(e) {
        if (e.key === 'Tab') {
            if (e.shiftKey && document.activeElement === firstElement) {
                lastElement.focus();
                e.preventDefault();
            } else if (!e.shiftKey && document.activeElement === lastElement) {
                firstElement.focus();
                e.preventDefault();
            }
        }
    });

    firstElement.focus();
};

Required Keyboard Interactions

ComponentKeysAction
ButtonEnter, SpaceActivate
LinkEnterNavigate
CheckboxSpaceToggle
RadioArrow keysNavigate options
SelectArrow keys, EnterNavigate, select
Tab panelArrow keysSwitch tabs
MenuArrow keys, Enter, EscNavigate, select, close
ModalEscClose

VPAT (Voluntary Product Accessibility Template)

VPAT Structure

# [Product Name] Accessibility Conformance Report
## WCAG 2.2 Edition

**Report Date:** [Date]
**Product Version:** [Version]
**Contact:** [Email]

### Table 1: Success Criteria, Level A

| Criteria | Conformance Level | Remarks |
|----------|-------------------|---------|
| 1.1.1 Non-text Content | Supports | All images have alt text |
| 1.2.1 Audio-only and Video-only | Not Applicable | No pre-recorded media |
| 1.3.1 Info and Relationships | Partially Supports | [Explanation] |
| ... | ... | ... |

### Table 2: Success Criteria, Level AA
[Continue pattern]

### Conformance Levels
- **Supports:** Fully meets criterion
- **Partially Supports:** Some aspects don't meet criterion
- **Does Not Support:** Majority doesn't meet criterion
- **Not Applicable:** Criterion doesn't apply

Remediation Planning

Priority Matrix

PriorityCriteriaTimeline
P0 - CriticalLevel A failures, blocks functionalityImmediate
P1 - HighLevel AA failures, significant barriersSprint 1
P2 - MediumLevel AA improvements, minor barriersSprint 2-3
P3 - LowBest practices, enhancementsBacklog

Remediation Tracking

public class AccessibilityIssue
{
    public Guid Id { get; init; }
    public required string Title { get; init; }
    public required string Description { get; init; }
    public required WcagCriterion Criterion { get; init; }
    public required WcagLevel Level { get; init; }
    public required IssueStatus Status { get; init; }
    public required Priority Priority { get; init; }
    public required string AffectedComponent { get; init; }
    public string? Remediation { get; init; }
    public string? AssignedTo { get; init; }
    public DateOnly? TargetDate { get; init; }
}

public record WcagCriterion(string Number, string Name);

public enum WcagLevel { A, AA, AAA }

public enum Priority { Critical, High, Medium, Low }

public enum IssueStatus
{
    Open,
    InProgress,
    InReview,
    Closed,
    WontFix
}

Inclusive Design Principles

Microsoft Inclusive Design

  1. Recognize exclusion - Understand how exclusion happens
  2. Solve for one, extend to many - Design for edge cases first
  3. Learn from diversity - Include diverse perspectives

Permanent, Temporary, Situational

SensePermanentTemporarySituational
TouchOne armArm injuryHolding a baby
SeeBlindCataractBright sunlight
HearDeafEar infectionNoisy environment
SpeakNonverbalLaryngitisHeavy accent

Checklist: Accessibility Planning

Strategy

  • Target compliance level defined (AA recommended)
  • Legal requirements identified
  • Timeline established
  • Resources allocated

Design Phase

  • Color contrast verified
  • Touch targets sized (44x44px minimum)
  • Focus states designed
  • Error states accessible
  • Motion preferences considered

Development Phase

  • Semantic HTML used
  • ARIA used correctly (sparingly)
  • Keyboard navigation works
  • Focus management implemented
  • Skip links added

Testing Phase

  • Automated testing integrated
  • Manual testing completed
  • Screen reader testing done
  • Keyboard-only testing done
  • Zoom/​reflow tested

Documentation

  • Accessibility statement published
  • VPAT completed (if required)
  • Known issues documented
  • Contact for feedback provided

Related Skills

  • usability-testing - Inclusive usability testing
  • design-system-planning - Accessible components
  • heuristic-evaluation - Accessibility heuristics
  • service-blueprinting - Accessible service touchpoints

More skills from diegosouzapw

accessibility logo
diegosouzapw/awesome-omni-skill

accessibility

Accessibility guidelines for VS Code features — covers accessibility help dialogs, accessible views, verbosity settings, accessibility signals, ARIA alerts/status announcements, keyboard navigation, and ARIA labels/roles. Applies to both new interactive UI surfaces and updates to existing feature...

62 1
View
mermaid-diagrams logo
diegosouzapw/awesome-omni-skill

mermaid-diagrams

Mermaid diagram creation for flowcharts, sequences, ERDs, and more. Generate diagrams from text in markdown files. Use for documentation, architecture diagrams, and visual representations. Triggers on mermaid, flowchart, sequence diagram, ERD, entity relationship, gantt chart, pie chart, class di...

62 1
View
tauri2-react-rust logo
diegosouzapw/awesome-omni-skill

tauri2-react-rust

Guides development of cross-platform desktop apps with Tauri 2, TypeScript, React, and Rust. Use when building Tauri apps, implementing IPC, designing Rust backend or TypeScript/React frontend, when researching or cloning a website (open site, snapshot elements), when verifying local dev or built...

62 1
View
fp-ts-errors logo
diegosouzapw/awesome-omni-skill

fp-ts-errors

Handle errors as values using fp-ts Either and TaskEither for cleaner, more predictable TypeScript code. Use when implementing error handling patterns with fp-ts.

62 0
View
ring:pre-dev-research logo
diegosouzapw/awesome-omni-skill

ring:pre-dev-research

Gate 0 research phase for pre-dev workflow. Dispatches 3 parallel research agents to gather codebase patterns, external best practices, and framework documentation BEFORE creating PRD/TRD. Outputs research.md with file:line references.

62 0
View
create-assistant logo
diegosouzapw/awesome-omni-skill

create-assistant

Create and configure Vapi voice AI assistants with models, voices, transcribers, tools, hooks, and advanced settings. Use when building voice agents, phone bots, customer support assistants, or any conversational AI that handles phone or web calls.

62 0
View
codex-headless logo
diegosouzapw/awesome-omni-skill

codex-headless

Delegiere Aufgaben an OpenAI Codex CLI im Headless-Mode. Nutzt ChatGPT Subscription (KEIN API Key). Nur Workspace-Zugriff, KEIN System-Zugriff. Auto-Accept mit --full-auto. Web-Recherche mit --search.

62 0
View
social-media-scheduler logo
diegosouzapw/awesome-omni-skill

social-media-scheduler

Generate a full week of social media content for any topic. Outputs platform-optimized posts for Twitter/X, LinkedIn, and Instagram with hashtags and posting times.

62 0
View
Data Privacy Compliance logo
diegosouzapw/awesome-omni-skill

Data Privacy Compliance

Data privacy and regulatory compliance specialist for GDPR, CCPA, HIPAA, and international data protection laws. Use when implementing privacy controls, conducting data protection impact assessments, ensuring regulatory compliance, or managing data subject rights. Expert in consent management, da...

62 0
View
triple-review logo
diegosouzapw/awesome-omni-skill

triple-review

Reviews a task using the TRIPLE protocol, as the review agent.

62 0
View
Tech Stack & Architecture Decision logo
diegosouzapw/awesome-omni-skill

Tech Stack & Architecture Decision

Define and document the technology stack and architecture decisions for a project. Use when the user needs to choose a tech stack, make architecture decisions, define infrastructure choices, or document technology selections. Triggers on requests like "define the tech stack", "choose technologies...

62 0
View

Popular AI tools

Kaiber logo
Video

Kaiber

Generate, edit, and beat-sync AI video with leading models in one workspace.

Paid
View
Vimcal logo
Productivity

Vimcal

The world's fastest calendar for remote work

Free
View

Transform Your Design with AI Designer by ImgCreator.ai

Freemium
View
Akool AI logo
Content & writing

Akool AI

Revolutionizing Video Production with AI-Powered Creativity

Paid
View

Extend an image past the frame and let AI fill the new aspect ratio.

Freemium
View
StarByFace logo
Security

StarByFace

Discover your celebrity doppelgänger with StarByFace!

Free
View
C

ChainClarity explains 700+ crypto whitepapers in plain English, with layered summaries, comparisons, research tools, alerts, and a $4.99 Pro plan.

Freemium
View
Opus Clip logo
Coding & apps

Opus Clip

Opus.ai: Revolutionize Your Web Experience

Free
View