# 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
Informations personnelles
``` 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 ! 🎯