7.0 KiB
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 :
<fr:fieldInput label="Nom complet" value="#{bean.nom}" required="true" />
Génère :
<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 :
<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" :
<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 :
<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 visiblearia-required- Indique les champs obligatoiresaria-invalid- Indique les champs en erreuraria-describedby- Associe les messages d'aiderole- Définit le rôle sémantique
📋 Bonnes pratiques
✅ À faire
-
Toujours fournir un label
<fr:fieldInput label="Nom" value="#{bean.nom}" /> -
Utiliser des labels descriptifs
<!-- ✅ Bon --> <fr:fieldInput label="Adresse email professionnelle" value="#{bean.email}" /> <!-- ❌ Mauvais --> <fr:fieldInput label="Email" value="#{bean.email}" /> -
Grouper les champs liés
<fieldset> <legend>Informations personnelles</legend> <fr:fieldInput label="Prénom" value="#{bean.prenom}" /> <fr:fieldInput label="Nom" value="#{bean.nom}" /> </fieldset> -
Fournir des messages d'erreur clairs
@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; -
Utiliser des placeholders informatifs
<fr:fieldInput label="Téléphone" value="#{bean.phone}" placeholder="Ex: +33 6 12 34 56 78" />
❌ À éviter
-
Ne pas utiliser uniquement la couleur pour transmettre l'information
<!-- ❌ 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> -
Ne pas omettre les labels
<!-- ❌ Mauvais --> <fr:fieldInput value="#{bean.nom}" placeholder="Nom" /> <!-- ✅ Bon --> <fr:fieldInput label="Nom" value="#{bean.nom}" placeholder="Ex: Dupont" /> -
Ne pas désactiver le focus visible
/* ❌ 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
- axe DevTools - Extension Chrome/Firefox pour audit automatique
- WAVE - Extension pour évaluation visuelle
- Lighthouse - Audit intégré dans Chrome DevTools
- 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
<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é :
<fr:themeSelector />
<!-- Permet à l'utilisateur de choisir light/dark -->
Taille de police
Respecter les préférences utilisateur :
/* ✅ Utiliser rem au lieu de px */
.custom-text {
font-size: 1rem; /* S'adapte aux préférences utilisateur */
}
Animations
Respecter prefers-reduced-motion :
@media (prefers-reduced-motion: reduce) {
* {
animation-duration: 0.01ms !important;
transition-duration: 0.01ms !important;
}
}
📚 Ressources
🤝 Contribution
Si vous identifiez un problème d'accessibilité, veuillez :
- Ouvrir une issue sur GitHub
- Décrire le problème et le contexte
- Fournir des suggestions de correction si possible
L'accessibilité est une priorité pour ce projet ! 🎯