253 lines
7.0 KiB
Markdown
253 lines
7.0 KiB
Markdown
# Guide d'Accessibilité
|
|
|
|
PrimeFaces Freya Extension est conçu avec l'accessibilité en tête, suivant les directives **WCAG 2.1 niveau AA**.
|
|
|
|
## 🎯 Objectifs d'accessibilité
|
|
|
|
- ✅ **Navigation au clavier** - Tous les composants sont accessibles au clavier
|
|
- ✅ **Lecteurs d'écran** - Support ARIA pour les technologies d'assistance
|
|
- ✅ **Contraste des couleurs** - Respect des ratios de contraste WCAG
|
|
- ✅ **Focus visible** - Indicateurs de focus clairs
|
|
- ✅ **Labels explicites** - Tous les champs ont des labels associés
|
|
- ✅ **Messages d'erreur** - Validation accessible
|
|
|
|
## 🔍 Fonctionnalités d'accessibilité
|
|
|
|
### 1. Labels et associations
|
|
|
|
Tous les composants `fr:field*` génèrent automatiquement des labels associés :
|
|
|
|
```xml
|
|
<fr:fieldInput label="Nom complet" value="#{bean.nom}" required="true" />
|
|
```
|
|
|
|
Génère :
|
|
```html
|
|
<div class="field">
|
|
<label for="inputComponent">Nom complet <span class="p-error">*</span></label>
|
|
<input id="inputComponent" type="text" aria-required="true" />
|
|
<span class="p-message" role="alert"></span>
|
|
</div>
|
|
```
|
|
|
|
### 2. Indicateurs requis
|
|
|
|
Les champs requis affichent automatiquement un astérisque et l'attribut `aria-required` :
|
|
|
|
```xml
|
|
<fr:fieldInput label="Email" value="#{bean.email}" required="true" />
|
|
```
|
|
|
|
### 3. Messages de validation
|
|
|
|
Les messages d'erreur sont annoncés aux lecteurs d'écran via `role="alert"` :
|
|
|
|
```xml
|
|
<fr:fieldInput label="Téléphone" value="#{bean.phone}" required="true" />
|
|
<!-- Si erreur : message annoncé automatiquement -->
|
|
```
|
|
|
|
### 4. Navigation au clavier
|
|
|
|
| Composant | Raccourcis clavier |
|
|
|-----------|-------------------|
|
|
| `fieldInput` | Tab, Shift+Tab |
|
|
| `fieldSelect` | Tab, ↑↓ pour naviguer, Enter pour sélectionner |
|
|
| `fieldCalendar` | Tab, ↑↓←→ pour naviguer dans le calendrier |
|
|
| `fieldCheckbox` | Tab, Espace pour cocher/décocher |
|
|
| `fieldRadio` | Tab, ↑↓ pour changer de sélection |
|
|
| `button` | Tab, Enter ou Espace pour activer |
|
|
| `actionDialog` | Esc pour fermer, Tab pour naviguer |
|
|
| `dataTable` | Tab pour naviguer, ↑↓ pour les lignes |
|
|
| `tabView` | ←→ pour changer d'onglet |
|
|
|
|
### 5. Focus management
|
|
|
|
Les dialogs gèrent automatiquement le focus :
|
|
|
|
```xml
|
|
<fr:actionDialog widgetVar="editDialog" header="Éditer">
|
|
<!-- Le focus est automatiquement placé sur le premier champ -->
|
|
<fr:fieldInput label="Nom" value="#{bean.nom}" />
|
|
</fr:actionDialog>
|
|
```
|
|
|
|
### 6. Contraste des couleurs
|
|
|
|
Le thème Freya respecte les ratios de contraste WCAG :
|
|
|
|
- **Texte normal** : Ratio minimum 4.5:1
|
|
- **Texte large** : Ratio minimum 3:1
|
|
- **Composants UI** : Ratio minimum 3:1
|
|
|
|
### 7. Attributs ARIA
|
|
|
|
Les composants PrimeFaces sous-jacents incluent automatiquement :
|
|
|
|
- `aria-label` - Label pour les composants sans label visible
|
|
- `aria-required` - Indique les champs obligatoires
|
|
- `aria-invalid` - Indique les champs en erreur
|
|
- `aria-describedby` - Associe les messages d'aide
|
|
- `role` - Définit le rôle sémantique
|
|
|
|
## 📋 Bonnes pratiques
|
|
|
|
### ✅ À faire
|
|
|
|
1. **Toujours fournir un label**
|
|
```xml
|
|
<fr:fieldInput label="Nom" value="#{bean.nom}" />
|
|
```
|
|
|
|
2. **Utiliser des labels descriptifs**
|
|
```xml
|
|
<!-- ✅ Bon -->
|
|
<fr:fieldInput label="Adresse email professionnelle" value="#{bean.email}" />
|
|
|
|
<!-- ❌ Mauvais -->
|
|
<fr:fieldInput label="Email" value="#{bean.email}" />
|
|
```
|
|
|
|
3. **Grouper les champs liés**
|
|
```xml
|
|
<fieldset>
|
|
<legend>Informations personnelles</legend>
|
|
<fr:fieldInput label="Prénom" value="#{bean.prenom}" />
|
|
<fr:fieldInput label="Nom" value="#{bean.nom}" />
|
|
</fieldset>
|
|
```
|
|
|
|
4. **Fournir des messages d'erreur clairs**
|
|
```java
|
|
@NotBlank(message = "Le nom est obligatoire")
|
|
@Size(min = 2, max = 50, message = "Le nom doit contenir entre 2 et 50 caractères")
|
|
private String nom;
|
|
```
|
|
|
|
5. **Utiliser des placeholders informatifs**
|
|
```xml
|
|
<fr:fieldInput label="Téléphone"
|
|
value="#{bean.phone}"
|
|
placeholder="Ex: +33 6 12 34 56 78" />
|
|
```
|
|
|
|
### ❌ À éviter
|
|
|
|
1. **Ne pas utiliser uniquement la couleur pour transmettre l'information**
|
|
```xml
|
|
<!-- ❌ Mauvais : uniquement la couleur rouge -->
|
|
<span style="color: red;">Champ obligatoire</span>
|
|
|
|
<!-- ✅ Bon : icône + texte + couleur -->
|
|
<span class="p-error"><i class="pi pi-exclamation-circle"></i> Champ obligatoire</span>
|
|
```
|
|
|
|
2. **Ne pas omettre les labels**
|
|
```xml
|
|
<!-- ❌ Mauvais -->
|
|
<fr:fieldInput value="#{bean.nom}" placeholder="Nom" />
|
|
|
|
<!-- ✅ Bon -->
|
|
<fr:fieldInput label="Nom" value="#{bean.nom}" placeholder="Ex: Dupont" />
|
|
```
|
|
|
|
3. **Ne pas désactiver le focus visible**
|
|
```css
|
|
/* ❌ Mauvais */
|
|
*:focus {
|
|
outline: none;
|
|
}
|
|
|
|
/* ✅ Bon : personnaliser mais garder visible */
|
|
*:focus {
|
|
outline: 2px solid var(--primary-color);
|
|
outline-offset: 2px;
|
|
}
|
|
```
|
|
|
|
## 🧪 Tests d'accessibilité
|
|
|
|
### Outils recommandés
|
|
|
|
1. **axe DevTools** - Extension Chrome/Firefox pour audit automatique
|
|
2. **WAVE** - Extension pour évaluation visuelle
|
|
3. **Lighthouse** - Audit intégré dans Chrome DevTools
|
|
4. **NVDA** (Windows) ou **VoiceOver** (Mac) - Lecteurs d'écran
|
|
|
|
### Checklist de test
|
|
|
|
- [ ] Navigation complète au clavier (Tab, Shift+Tab)
|
|
- [ ] Tous les champs ont des labels visibles
|
|
- [ ] Les champs requis sont indiqués
|
|
- [ ] Les messages d'erreur sont annoncés
|
|
- [ ] Le focus est visible sur tous les éléments interactifs
|
|
- [ ] Les dialogs piègent le focus
|
|
- [ ] Esc ferme les dialogs
|
|
- [ ] Les tableaux ont des en-têtes appropriés
|
|
- [ ] Les images ont des textes alternatifs
|
|
- [ ] Le contraste des couleurs est suffisant
|
|
|
|
### Exemple de test avec lecteur d'écran
|
|
|
|
```xml
|
|
<fr:fieldInput label="Nom complet"
|
|
value="#{bean.nom}"
|
|
required="true"
|
|
placeholder="Ex: Jean Dupont" />
|
|
```
|
|
|
|
**Annonce attendue** :
|
|
> "Nom complet, champ obligatoire, zone de texte, Ex: Jean Dupont"
|
|
|
|
## 🎨 Personnalisation accessible
|
|
|
|
### Thème sombre
|
|
|
|
Le thème Freya supporte le mode sombre avec contraste approprié :
|
|
|
|
```xml
|
|
<fr:themeSelector />
|
|
<!-- Permet à l'utilisateur de choisir light/dark -->
|
|
```
|
|
|
|
### Taille de police
|
|
|
|
Respecter les préférences utilisateur :
|
|
|
|
```css
|
|
/* ✅ Utiliser rem au lieu de px */
|
|
.custom-text {
|
|
font-size: 1rem; /* S'adapte aux préférences utilisateur */
|
|
}
|
|
```
|
|
|
|
### Animations
|
|
|
|
Respecter `prefers-reduced-motion` :
|
|
|
|
```css
|
|
@media (prefers-reduced-motion: reduce) {
|
|
* {
|
|
animation-duration: 0.01ms !important;
|
|
transition-duration: 0.01ms !important;
|
|
}
|
|
}
|
|
```
|
|
|
|
## 📚 Ressources
|
|
|
|
- [WCAG 2.1 Guidelines](https://www.w3.org/WAI/WCAG21/quickref/)
|
|
- [PrimeFaces Accessibility](https://www.primefaces.org/showcase/ui/misc/accessibility.xhtml)
|
|
- [WAI-ARIA Authoring Practices](https://www.w3.org/WAI/ARIA/apg/)
|
|
- [WebAIM](https://webaim.org/)
|
|
|
|
## 🤝 Contribution
|
|
|
|
Si vous identifiez un problème d'accessibilité, veuillez :
|
|
1. Ouvrir une issue sur GitHub
|
|
2. Décrire le problème et le contexte
|
|
3. Fournir des suggestions de correction si possible
|
|
|
|
L'accessibilité est une priorité pour ce projet ! 🎯
|
|
|