# 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
```
Génère :
```html
```
### 2. Indicateurs requis
Les champs requis affichent automatiquement un astérisque et l'attribut `aria-required` :
```xml
```
### 3. Messages de validation
Les messages d'erreur sont annoncés aux lecteurs d'écran via `role="alert"` :
```xml
```
### 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
```
### 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
```
2. **Utiliser des labels descriptifs**
```xml
```
3. **Grouper les champs liés**
```xml
```
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
```
### ❌ À éviter
1. **Ne pas utiliser uniquement la couleur pour transmettre l'information**
```xml
Champ obligatoire Champ obligatoire
```
2. **Ne pas omettre les labels**
```xml
```
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
```
**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
```
### 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 ! 🎯