💻 Développement

dev-accessibility-checker

Vérifie et améliore l'accessibilité web (WCAG 2.1/2.2).

⚡ Installation & lancement en 1 commande

Copiez-collez dans votre terminal : le skill s'installe dans ~/.claude/skills et Claude Code se lance directement dessus.

macOS / Linux
curl -fsSL https://raw.githubusercontent.com/khalilbenaz/claude-skills-collection/main/install.sh | sh -s -- dev-accessibility-checker --launch
Windows (PowerShell)
iex "& { $(iwr -useb https://raw.githubusercontent.com/khalilbenaz/claude-skills-collection/main/install.ps1) } dev-accessibility-checker -Launch"

🚀 Déjà installé ?

claude "/dev-accessibility-checker"

Ou tapez /dev-accessibility-checker dans une session Claude Code, ou décrivez simplement votre besoin — le skill se déclenche automatiquement via le skill-router.

🔑 Déclencheurs automatiques

Le skill s'active automatiquement quand votre demande contient :

accessibilitéa11yWCAGscreen readerARIAcontrasteaccessiblehandicaplecteur d'écran

📦 Installation manuelle

git clone https://github.com/khalilbenaz/claude-skills-collection.git cp -r claude-skills-collection/skills/dev-accessibility-checker ~/.claude/skills/

Payload du plugin : skills/dev-accessibility-checker · source éditable : dev-skills/accessibility-checker

📖 Manuel

Accessibility Checker

Workflow en étapes

1. Audit automatisé — base de départ

Lancer les outils automatisés pour couvrir ~30-40 % des problèmes détectables :

# axe-core CLI (Node)
npx axe http://localhost:3000 --tags wcag2aa --reporter json > axe-report.json

# pa11y (CI-friendly)
npx pa11y http://localhost:3000 --standard WCAG2AA --reporter json

# Lighthouse (headless)
npx lighthouse http://localhost:3000 --only-categories=accessibility --output json --quiet

Critère de décision : score Lighthouse >= 90 ET zéro violation axe critical/serious avant merge.

2. Navigation clavier (manuelle, ~5 min)

Parcourir la page uniquement au clavier (Tab / Shift+Tab / Enter / Espace / Flèches).

Checklist :

/* Focus visible minimal — ne jamais supprimer sans remplacement */
:focus-visible {
  outline: 3px solid #005fcc;
  outline-offset: 2px;
}

3. Sémantique HTML et landmarks

<!-- Structure minimale correcte -->
<header role="banner">…</header>
<nav aria-label="Navigation principale">…</nav>
<main id="main-content">
  <h1>Titre de la page</h1>   <!-- Un seul h1 par page -->
  …
</main>
<footer role="contentinfo">…</footer>

Pièges fréquents :

4. ARIA — règle d'or

Utiliser ARIA uniquement si le HTML natif ne peut pas exprimer le comportement.
<!-- MAL : ARIA redondant -->
<button role="button" aria-label="Envoyer">Envoyer</button>

<!-- BIEN : HTML natif seul -->
<button type="submit">Envoyer</button>

<!-- BIEN : ARIA nécessaire (état dynamique) -->
<button aria-expanded="false" aria-controls="menu-id">Menu</button>
<ul id="menu-id" hidden>…</ul>

<!-- Live region pour les notifications -->
<div role="status" aria-live="polite" aria-atomic="true">
  <!-- Injecté dynamiquement par JS après action utilisateur -->
</div>

5. Contraste et couleurs

Ratios WCAG 2.1 AA :

ContexteRatio minimum
Texte normal (< 18px / < 14px bold)4.5:1
Grand texte (≥ 18px ou ≥ 14px bold)3:1
Composants UI, bordures de champs3:1
Texte décoratif / logoexempt

Outils rapides :

# Vérification couleur via CLI
npx color-contrast-checker "#ffffff" "#767676"  # retourne le ratio

# Extension VS Code : axe Accessibility Linter
# Extension Chrome : Colour Contrast Analyser

Anti-pattern : transmettre une information uniquement par la couleur (ex. champ en erreur affiché uniquement en rouge sans icône ni texte).

6. Images et médias

<!-- Image porteuse de sens -->
<img src="graph.png" alt="Évolution du CA Q1-Q2 2025 : +12%">

<!-- Image décorative -->
<img src="separator.png" alt="" role="presentation">

<!-- Icône SVG inline cliquable -->
<button>
  <svg aria-hidden="true" focusable="false">…</svg>
  <span class="visually-hidden">Fermer la modale</span>
</button>
/* Classe utilitaire — masque visuellement mais accessible aux AT */
.visually-hidden {
  position: absolute;
  width: 1px; height: 1px;
  overflow: hidden;
  clip: rect(0,0,0,0);
  white-space: nowrap;
}

7. Formulaires accessibles

<!-- Association explicite label / champ -->
<label for="email">Adresse email <span aria-hidden="true">*</span></label>
<input type="email" id="email" name="email"
       required aria-required="true"
       aria-describedby="email-error">
<p id="email-error" role="alert" hidden>
  Veuillez saisir un email valide.
</p>

Critères de validation :

8. Intégration CI/CD

# GitHub Actions — pa11y-ci
- name: Accessibility tests
  run: |
    npx pa11y-ci --sitemap http://localhost:3000/sitemap.xml \
      --config .pa11yci.json
// .pa11yci.json
{
  "standard": "WCAG2AA",
  "timeout": 30000,
  "ignore": [],
  "runners": ["axe"]
}

9. Tests avec lecteurs d'écran (manuel)

OSLecteurRaccourci navigation
WindowsNVDA (gratuit)H = titres, F = formulaires, B = boutons
macOS/iOSVoiceOverVO+U = rotor, VO+Cmd+H = titres
AndroidTalkBackSwipe droite = élément suivant

Scénario minimal à tester : chargement page → navigation landmarks → remplissage formulaire → soumission → lecture du message de confirmation.

Garde-fous et anti-patterns

Anti-patternConséquenceCorrection
outline: none sans alternativefocus invisibleutiliser :focus-visible avec style custom
<div onclick> sans role/tabindexinaccessible au clavierremplacer par <button>
aria-label dupliquant le texte visibleredondance verbalesupprimer l'attribut
Placeholder comme seul labeldisparaît à la saisieajouter un vrai <label>
tabindex > 0ordre de focus imprévisibleutiliser uniquement tabindex="0" ou -1
Alt text = nom du fichierinutile pour les ATdécrire le sens de l'image
Contraste validé en light mode seulementéchec en dark modetester les deux thèmes

Référence critères WCAG

Critères AA les plus souvent violés en pratique :

Toujours citer le critère exact (ex. WCAG 2.1 — 1.4.3 AA) dans les rapports.