Skip to content

Commit cba8249

Browse files
committed
docs(a11y): plan for better world
Signed-off-by: Alexandre Philibeaux <aphilibeaux@scaleway.com>
1 parent 707b50e commit cba8249

19 files changed

Lines changed: 1582 additions & 0 deletions

A11Y.md

Lines changed: 145 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,145 @@
1+
# Accessibilité (A11Y) - Ultraviolet Design System
2+
3+
## 🎯 Vision
4+
5+
Rendre la Design System Ultraviolet **entièrement accessible** et conforme aux standards **WCAG 2.1 niveau AA**, afin que tous les utilisateurs, quel que soit leur handicap, puissent utiliser les composants UI.
6+
7+
## 📂 Structure
8+
9+
Toute la documentation, l'outillage et les tickets relatifs à l'accessibilité sont centralisés dans le dossier [`a11y/`](./a11y/).
10+
11+
## 📋 Ce que nous allons faire
12+
13+
### Phase 1 : Infrastructure & Outillage 🔧
14+
15+
- [`UV-001`](./a11y/UV-001-setup-eslint-plugin-jsx-a11y.txt) : Configuration de `oxlint` avec règles A11y
16+
- [`UV-002`](./a11y/UV-002-configuration-jest-axe-tests-unitaires.txt) : Mise en place de `vitest-axe` pour les tests unitaires
17+
- [`UV-003`](./a11y/UV-003-storybook-a11y-configuration-avancee.txt) : Configuration avancée de Storybook avec addon a11y
18+
- [`UV-004`](./a11y/UV-004-ci-cd-tests-a11y-automatises.txt) : Intégration des tests A11y dans la CI/CD
19+
20+
### Phase 2 : Audit & Correctifs 🔍
21+
22+
- [`UV-005`](./a11y/UV-005-audit-complet-composants-ui.txt) : Audit complet de tous les composants UI
23+
- [`UV-006`](./a11y/UV-006-corriger-violations-critiques.txt) : Correction des violations critiques et serious
24+
- [`UV-007`](./a11y/UV-007-focus-management-modal-dialog.txt) : Focus management pour les modals/dialogs
25+
- [`UV-008`](./a11y/UV-008-navigation-clavier-composants-interactifs.txt) : Navigation clavier sur les composants interactifs
26+
- [`UV-009`](./a11y/UV-009-aria-labels-roles.txt) : ARIA labels et roles
27+
28+
### Phase 3 : Tests E2E A11y 🧪
29+
30+
- [`UV-010`](./a11y/UV-010-setup-playwright-a11y-tests.txt) : Setup de Playwright pour les tests d'accessibilité
31+
- [`UV-011`](./a11y/UV-011-tests-navigation-clavier-e2e.txt) : Tests automatisés de navigation clavier
32+
- [`UV-012`](./a11y/UV-012-tests-screen-readers.txt) : Tests de compatibilité avec les screen readers
33+
34+
### Phase 4 : Documentation & Guidelines 📚
35+
36+
- [`UV-013`](./a11y/UV-013-documentation-a11y-developpeurs.txt) : Documentation A11y pour les développeurs
37+
- [`UV-014`](./a11y/UV-014-stories-demonstration-a11y.txt) : Stories de démonstration des bonnes pratiques
38+
- [`UV-015`](./a11y/UV-015-template-pr-checklist-a11y.txt) : Template de PR avec checklist A11y obligatoire
39+
40+
### Phase 5 : Monitoring & Maintenance 📊
41+
42+
- [`UV-016`](./a11y/UV-016-dashboard-suivi-a11y.txt) : Dashboard de suivi des violations
43+
- [`UV-017`](./a11y/UV-017-audit-regulier-automatise.txt) : Audit régulier automatisé
44+
45+
## 🤔 Pourquoi faire ça ?
46+
47+
### 1. **Inclusion** 🌍
48+
49+
L'accessibilité numérique est un droit fondamental. Environ **15% de la population mondiale** vit avec un handicap. Rendre nos composants accessibles, c'est permettre à tous d'utiliser nos applications.
50+
51+
### 2. **Conformité légale** ⚖️
52+
53+
De nombreuses réglementations imposent l'accessibilité numérique :
54+
55+
- **RGAA** en France (Référentiel Général d'Amélioration de l'Accessibilité)
56+
- **ADA** aux États-Unis
57+
- **European Accessibility Act** pour l'UE
58+
59+
### 3. **Qualité technique** 💎
60+
61+
L'accessibilité améliore :
62+
63+
- La sémantique HTML
64+
- La navigation clavier
65+
- La compatibilité avec les technologies d'assistance
66+
- Le SEO (les bonnes pratiques A11y beneficient aussi au référencement)
67+
68+
### 4. **Expérience utilisateur**
69+
70+
Les fonctionnalités accessibles profitent à tous :
71+
72+
- Sous-titres → utiles dans un environnement bruyant
73+
- Navigation clavier → utile pour les power users
74+
- Contrastes élevés → utile en extérieur ou sur écrans de mauvaise qualité
75+
76+
## 🛠️ Comment nous allons procéder
77+
78+
### 1. Outillage automatique
79+
80+
```bash
81+
# Linting A11y en temps réel
82+
oxlint
83+
84+
# Tests unitaires
85+
npm test -- --testNamePattern="a11y"
86+
87+
# Tests E2E
88+
npm run test:e2e:a11y
89+
```
90+
91+
### 2. Workflow de développement
92+
93+
- **Avant chaque commit** : lint A11y via pre-commit hooks
94+
- **Avant chaque PR** : tests A11y automatisés + checklist manuelle
95+
- **Dans la CI** : blocage si violations critiques ou serious
96+
- **Dans Storybook** : validation A11y sur chaque story
97+
98+
### 3. Processus de correction
99+
100+
1. Détection automatique via oxlint/storybook
101+
2. Audit manuel sur les composants critiques
102+
3. Correction des violations par ordre de priorité (critical → serious → moderate)
103+
4. Tests de validation (clavier + screen reader)
104+
5. Documentation des patterns utilisés
105+
106+
### 4. Formation & Sensibilisation
107+
108+
- Documentation des bonnes pratiques
109+
- Exemples concrets dans Storybook
110+
- Revue de code systématique sur les aspects A11y
111+
112+
## 📊 Métriques de succès
113+
114+
| Objectif | Cible | Échéance |
115+
| ------------------------ | ------- | -------- |
116+
| 0 violation critical | ✅ 0 | Sprint 2 |
117+
| 0 violation serious | ✅ 0 | Sprint 3 |
118+
| < 50 violations moderate | ⚠️ < 50 | Sprint 4 |
119+
| WCAG AA compliance | 📈 95%+ | Sprint 6 |
120+
| Composants testés | ✅ 100% | Sprint 4 |
121+
122+
## 📚 Ressources
123+
124+
- [WCAG 2.1 Guidelines](https://www.w3.org/WAI/WCAG21/quickref/)
125+
- [WAI-ARIA Authoring Practices](https://www.w3.org/WAI/ARIA/apg/)
126+
- [RGAA 4.1](https://accessibilite.numerique.gouv.fr/rgaa/)
127+
- [A11y Project Checklist](https://www.a11yproject.com/checklist/)
128+
129+
## 🚀 Démarrage
130+
131+
1. Consulter la [roadmap détaillée et les 17 tickets](./a11y/README.md)
132+
2. Review des tickets dans [`a11y/`](./a11y/) :
133+
- Phase 1 : [`UV-001`](./a11y/UV-001-setup-eslint-plugin-jsx-a11y.txt), [`UV-002`](./a11y/UV-002-configuration-jest-axe-tests-unitaires.txt), [`UV-003`](./a11y/UV-003-storybook-a11y-configuration-avancee.txt), [`UV-004`](./a11y/UV-004-ci-cd-tests-a11y-automatises.txt)
134+
- Phase 2 : [`UV-005`](./a11y/UV-005-audit-complet-composants-ui.txt) à [`UV-009`](./a11y/UV-009-aria-labels-roles.txt)
135+
- Phase 3 : [`UV-010`](./a11y/UV-010-setup-playwright-a11y-tests.txt) à [`UV-012`](./a11y/UV-012-tests-screen-readers.txt)
136+
- Phase 4 : [`UV-013`](./a11y/UV-013-documentation-a11y-developpeurs.txt) à [`UV-015`](./a11y/UV-015-template-pr-checklist-a11y.txt)
137+
- Phase 5 : [`UV-016`](./a11y/UV-016-dashboard-suivi-a11y.txt), [`UV-017`](./a11y/UV-017-audit-regulier-automatise.txt)
138+
3. Priorisation avec l'équipe
139+
4. Lancement du Sprint 1
140+
141+
---
142+
143+
**Contact** : A11y Audit Team
144+
**Date** : Avril 2026
145+
**Statut** : En cours

a11y/README.md

Lines changed: 117 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,117 @@
1+
# A11y Audit Tickets - Ultraviolet Design System
2+
3+
Ce dossier contient 17 tickets Jira pour l'audit d'accessibilité de la Design System Ultraviolet.
4+
5+
## 📋 Liste des tickets
6+
7+
### Phase 1 : Infrastructure & Outillage 🔧
8+
9+
- **UV-001** - Setup eslint-plugin-jsx-a11y (High)
10+
- **UV-002** - Configuration jest-axe pour les tests unitaires (High)
11+
- **UV-003** - Storybook A11y - Configuration avancée (Medium)
12+
- **UV-004** - CI/CD - Tests A11y automatisés (High)
13+
14+
### Phase 2 : Audit & Correctifs 🔍
15+
16+
- **UV-005** - Audit complet des composants UI (High)
17+
- **UV-006** - Corriger les violations critiques (High)
18+
- **UV-007** - Focus Management - Modal/Dialog (High)
19+
- **UV-008** - Navigation clavier - Composants interactifs (Medium)
20+
- **UV-009** - ARIA Labels & Roles (Medium)
21+
22+
### Phase 3 : Tests E2E A11y 🧪
23+
24+
- **UV-010** - Setup Playwright A11y Tests (Medium)
25+
- **UV-011** - Tests E2E de navigation clavier (Medium)
26+
- **UV-012** - Tests Screen Readers (Low)
27+
28+
### Phase 4 : Documentation & Guidelines 📚
29+
30+
- **UV-013** - Documentation A11y pour les développeurs (Medium)
31+
- **UV-014** - Stories de démonstration A11y (Medium)
32+
- **UV-015** - Template de PR avec checklist A11y (Low)
33+
34+
### Phase 5 : Monitoring & Maintenance 📊
35+
36+
- **UV-016** - Dashboard de suivi A11y (Low)
37+
- **UV-017** - Audit régulier automatisé (Low)
38+
39+
## 🎯 Roadmap recommandée
40+
41+
### Sprint 1 (Semaines 1-2)
42+
43+
- UV-001: Setup eslint-plugin-jsx-a11y
44+
- UV-004: CI/CD - Tests A11y automatisés
45+
- UV-005: Audit complet des composants
46+
47+
### Sprint 2 (Semaines 3-4)
48+
49+
- UV-002: Configuration jest-axe
50+
- UV-006: Corriger les violations critiques
51+
- UV-007: Focus Management Modal
52+
53+
### Sprint 3 (Semaines 5-6)
54+
55+
- UV-008: Navigation clavier
56+
- UV-009: ARIA Labels & Roles
57+
- UV-010: Setup Playwright A11y
58+
59+
### Sprint 4 (Semaines 7-8)
60+
61+
- UV-011: Tests navigation clavier E2E
62+
- UV-013: Documentation A11y
63+
- UV-014: Stories de démonstration
64+
65+
### Sprint 5 (Semaines 9-10)
66+
67+
- UV-003: Storybook configuration avancée
68+
- UV-015: Template PR checklist
69+
- UV-016: Dashboard de suivi
70+
71+
### Sprint 6 (Semaines 11-12)
72+
73+
- UV-012: Tests Screen Readers
74+
- UV-017: Audit régulier automatisé
75+
76+
## 📊 Métriques de succès
77+
78+
- **0 violation critical** (objectif sprint 2)
79+
- **0 violation serious** (objectif sprint 3)
80+
- **< 50 violations moderate** (objectif sprint 4)
81+
- **WCAG AA compliance 95%+** (objectif sprint 6)
82+
- **100% des composants testés** (objectif sprint 4)
83+
84+
## 🔗 Import dans Jira
85+
86+
Pour importer ces tickets dans Jira:
87+
88+
1. Aller dans Jira → Issues → Import issues from CSV
89+
2. Mapper les champs:
90+
- Summary → Summary
91+
- Issue Type → Issue Type
92+
- Priority → Priority
93+
- Labels → Labels
94+
- Description → Description
95+
- Estimation → Original Estimate (en heures)
96+
3. Utiliser le format de fichier fourni
97+
98+
## 📝 Notes
99+
100+
- Chaque ticket est dans un fichier `.txt` séparé
101+
- Le format est compatible avec l'import CSV Jira
102+
- Les dépendances entre tickets sont notées dans chaque fichier
103+
- Les estimations sont en heures
104+
105+
## 🚀 Prochaines étapes
106+
107+
1. Review des tickets avec l'équipe
108+
2. Priorisation selon la roadmap
109+
3. Création des tickets dans Jira
110+
4. Assignation des premiers tickets (Sprint 1)
111+
5. Kick-off de l'audit A11y
112+
113+
---
114+
115+
**Contact**: A11y Audit Team
116+
**Date de création**: Avril 2026
117+
**Version**: 1.0
Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
Summary: Setup oxlint avec règles A11y pour l'audit A11y
2+
Issue Type: Story
3+
Priority: High
4+
Labels: a11y, devops, infrastructure, oxlint
5+
6+
Description:
7+
Configurer les règles A11y dans oxlint pour détecter automatiquement les problèmes d'accessibilité dans le code.
8+
9+
Contexte:
10+
- Actuellement 52 occurrences de règles a11y désactivées avec oxlint-disable
11+
- Nécessité d'avoir un linting a11y automatisé dans le workflow de développement
12+
- Premier pilier de l'infrastructure a11y
13+
14+
Tâches:
15+
[ ] Configurer les règles A11y dans .oxlintrc.jsonc
16+
[ ] Commencer en mode warning uniquement (ne pas bloquer la CI)
17+
[ ] Documenter les règles activées dans CONTRIBUTING.md
18+
[ ] Tester sur un échantillon de composants
19+
20+
Règles à activer (priorité haute):
21+
- accessible-emoji
22+
- alt-text
23+
- anchor-has-content
24+
- aria-activedescendant-has-tabindex
25+
- aria-props
26+
- aria-role
27+
- aria-unsupported-roles
28+
- autocomplete-valid
29+
- click-events-have-key-events
30+
- heading-has-content
31+
- html-has-lang
32+
- iframe-has-title
33+
- img-redundant-alt
34+
- label-has-associated-control
35+
- lang
36+
- media-has-caption
37+
- mouse-events-have-key-events
38+
- no-access-key
39+
- no-autofocus
40+
- no-noninteractive-element-interactions
41+
- no-noninteractive-element-to-interactive-role
42+
- no-noninteractive-tabindex
43+
- no-redundant-roles
44+
- no-static-element-interactions
45+
- role-has-required-aria-props
46+
- scope
47+
- tabindex-no-positive
48+
49+
Critères d'acceptation:
50+
- [ ] La configuration oxlint inclut les règles A11y
51+
- [ ] Les règles sont documentées
52+
- [ ] Le linting tourne en local sans erreurs bloquantes
53+
- [ ] La CI affiche les warnings a11y sans échouer
54+
55+
Estimation: 3h
56+
Assignee: Unassigned
57+
Reporter: A11y Audit Team
Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
Summary: Configuration vitest-axe pour les tests unitaires A11y
2+
Issue Type: Story
3+
Priority: High
4+
Labels: a11y, testing, vitest-axe, vitest
5+
6+
Description:
7+
Implémenter axe-core dans les tests unitaires via vitest-axe pour détecter les violations d'accessibilité automatiquement.
8+
9+
Contexte:
10+
- vitest-axe est déjà installé (voir vitest-axe.d.ts et expect.d.ts)
11+
- Mais peu ou pas utilisé dans les tests actuels
12+
- Utils/test contient les helpers de test (renderWithTheme, etc.)
13+
14+
Tâches:
15+
[ ] Ajouter axe-core aux dependencies de test (utils/test/package.json)
16+
[ ] Créer un helper toHaveNoAxeViolations dans utils/test/src/vitest/helpers/
17+
[ ] Configurer les règles axe personnalisées (WCAG AA)
18+
[ ] Ajouter la documentation d'usage dans utils/test/README.md
19+
[ ] Tester sur 2-3 composants existants (Button, Alert)
20+
[ ] Ajouter un exemple dans les tests existants
21+
22+
Configuration axe recommandée:
23+
```typescript
24+
const axeConfig = {
25+
rules: {
26+
'color-contrast': { enabled: true },
27+
'label': { enabled: true },
28+
'landmark-one-main': { enabled: false }, // Pas pertinent pour les composants isolés
29+
'region': { enabled: false }, // Idem
30+
}
31+
}
32+
```
33+
34+
Helper à créer:
35+
```typescript
36+
export const renderWithAxe = (component, options) => {
37+
const { container } = renderWithTheme(component, options)
38+
const results = await axe(container)
39+
expect(results).toHaveNoViolations()
40+
return renderWithTheme(component, options)
41+
}
42+
```
43+
44+
Critères d'acceptation:
45+
- [ ] Helper toHaveNoAxeViolations disponible dans @utils/test
46+
- [ ] Documentation à jour
47+
- [ ] Au moins 2 composants testés avec axe
48+
- [ ] Les tests passent en local et en CI
49+
50+
Estimation: 5h
51+
Assignee: Unassigned
52+
Reporter: A11y Audit Team
53+
Dependencies: UV-001

0 commit comments

Comments
 (0)