Engineering AccessibilityWCAGARIA

Accessibility Expert

Web accessibility: WCAG 2.2 AA/AAA compliance, ARIA patterns, keyboard navigation, screen reader testing, automated auditing with axe-core, and remediation.

A web accessibility expert who audits against WCAG 2.2 AA criteria, implements ARIA roles and properties correctly, and designs keyboard navigation patterns for complex widgets like data grids, date pickers, and modals. Integrates axe-core into CI to catch regressions, and tests with NVDA, VoiceOver, and JAWS to catch screen reader-specific issues that automated tools miss.

Added Mar 20, 2026

$npx skills add johnefemer/skillfish --skill accessibility-expert

What This Skill Can Do

Concrete capabilities you get when you install this skill.

Audit pages against WCAG 2.2 AA criteria with axe-core and manual checks

Implement ARIA roles, states, and properties for complex interactive widgets

Design keyboard navigation patterns: focus management, trap focus, and skip links

Write accessible React components with proper semantic HTML and ARIA

Test with NVDA, VoiceOver, and JAWS and remediate screen reader-specific issues

Add axe-core to CI/CD pipelines to prevent accessibility regressions

Real Conversations

See how the Accessibility Expert skill responds to actual requests. These are representative examples of what your AI agent will produce.

You

My React modal passes axe-core checks but when I tab through it, focus escapes the modal and reaches background content. Screen reader users can also navigate outside the modal. How do I fix this?

Agent

You need focus trapping and a proper ARIA dialog role. Here's a complete accessible modal:

import { useEffect, useRef } from 'react';

const FOCUSABLE = 'a[href],button:not([disabled]),input,select,textarea,[tabindex]:not([tabindex="-1"])';

function Modal({ isOpen, onClose, title, children }: ModalProps) {
  const dialogRef = useRef<HTMLDivElement>(null);
  const previousFocus = useRef<HTMLElement | null>(null);

  useEffect(() => {
    if (!isOpen) return;
    previousFocus.current = document.activeElement as HTMLElement;
    // Move focus into the modal
    const firstFocusable = dialogRef.current?.querySelector<HTMLElement>(FOCUSABLE);
    firstFocusable?.focus();

    return () => {
      previousFocus.current?.focus(); // restore focus on close
    };
  }, [isOpen]);

  const trapFocus = (e: React.KeyboardEvent) => {
    if (e.key !== 'Tab') return;
    const focusable = Array.from(dialogRef.current?.querySelectorAll<HTMLElement>(FOCUSABLE) ?? []);
    const first = focusable[0];
    const last = focusable[focusable.length - 1];

    if (e.shiftKey && document.activeElement === first) {
      e.preventDefault();
      last.focus();
    } else if (!e.shiftKey && document.activeElement === last) {
      e.preventDefault();
      first.focus();
    }
  };

  if (!isOpen) return null;
  return (
    <div role="dialog" aria-modal="true" aria-labelledby="modal-title"
         ref={dialogRef} onKeyDown={trapFocus}>
      <h2 id="modal-title">{title}</h2>
      {children}
      <button onClick={onClose}>Close</button>
    </div>
  );
}

The three requirements for accessible modals:

  1. role="dialog" + aria-modal="true" — tells screen readers to restrict virtual cursor to the dialog
  2. aria-labelledby pointing to the title — announced when focus enters
  3. Focus trap + focus restore — keyboard and AT users can't escape accidentally

Get Started

How to install and use this skill in your preferred environment.

Skills are designed for AI coding agents (Claude Code, Cursor, Windsurf) and IDE-based workflows where the agent can read files, run scripts, and act on your codebase.

Models & Context

Which AI models and context windows work best with this skill.

Recommended Models

Claude Sonnet 4 or GPT-4o for ARIA patterns and WCAG interpretation. Screen reader behavior varies — always verify with actual AT (NVDA, VoiceOver) in addition to automated checks.

Context Window

SKILL.md ~4KB. Fits in 32K context; full component library audits benefit from 64K+.

Pro tips for best results

1

Be specific

Include numbers — users, budget, RPS — so the skill can size the architecture.

2

Share constraints

Compliance needs, team size, and existing stack all improve the output.

3

Iterate

Start with a high-level design, then ask follow-ups for IaC, cost analysis, or security review.

4

Combine skills

Pair with companion skills below for end-to-end coverage.

Works Great With

These skills complement Accessibility Expert for end-to-end coverage. Install them together for better results.

$ skillfish add johnefemer/skillfish --all # install all skills at once

Ready to try Accessibility Expert?

Install the skill and start getting expert-level guidance in your workflow — any agent, any IDE.

$npx skills add johnefemer/skillfish --skill accessibility-expert
← Browse all skills