Choix et implémentation des composants
Les points suivants donnent des guides d'usage et d'implémentation pour les composants du design system.
Boutons
Utilisation des boutons
Chaque bouton doit avoir une action valide (non nulle et fonctionnelle) associée via l'attribut onClick
ou être inactif. l'exception de certains CTA et des boutons de soumission de formulaires, cette action ne doit pas induire une navigation. Dans le cas d'un changement de page, ouverture d'une nouvelle fenêtre ou redirection, il est recommandé d'utiliser un lien.
Implémentation de l'intitulé des boutons
Chaque lien (balise <a>
) doit avoir un intitulé explicite (voir intitulés)
Plusieurs options, par ordre de préférence :
- posséder un intitulé textuel entre les balises de fermeture et d'ouverture, ou dans les enfants de la balise (ex : paragraphe ou titre sémantique html)
- posséder un attribut
aria-label
portant un intitulé
Liens
Utilisation des liens
Chaque lien doit avoir un attribut href
valide (non vide et fonctionnel) ou être inactif. Dans le cas d'une action sans changement de page, ouverture d'une nouvelle fenêtre ou redirection (exemple : un téléchargement) ainsi que pour l'exception de certains CTA et des boutons de soumission de formulaires, il est recommandé d'utiliser un bouton.
Implémentation de l'intitulé des liens
Chaque lien (balise <a>
) doit avoir un intitulé explicite (voir intitulés)
Plusieurs options, par ordre de préférence :
- posséder un intitulé textuel entre les balises de fermeture et d'ouverture, ou dans les enfants de la balise (ex : paragraphe ou titre sémantique html)
- posséder un attribut
aria-label
portant un intitulé
Différentiation visuelle des liens
Chaque lien doit être visuellement différencié des autres textes.
Plusieurs options, par ordre de préférence :
- Porter uniquement la class
link
de Trilogy. Cela permet que le lien sans prise de focus (souligné), au survol (animation) ou avec prise de focus via le clavier (cadre bleu par défaut du navigateur) soit différencié par un critère autre que la couleur. -
Dans le cas où les classes additionnelles
is-static
ouis-plain
sont utilisées, le contraste de couleur entre- le lien survolé et le lien non survolé
- le lien survolé et le text qui n'est pas un lien
- le lien non survolé et le texte qui n'est pas un lien
Explication des non conformités des classes is static
et is-plain
:
- Si l'on supprime l'animation au survol en ajoutant la classe
is-static
, il n'existe aucun moyen de différencier visuellement un lien survolé d'un lien non survolé. Il n'existe actuellement aucun moyen d'indiquer cette différence en utilisant Trilogy ; l'usage de la classeis-static
est donc très fortement déconseillée. - Si l'on supprime le soulignement en ajoutant la classe
is-plain
, il n'existe aucun moyen de différencier visuellement un lien du texte environnant puisque le contraste de couleur entre les couleurs de la marque est actuellement insuffisant ; l'usage de la classeis-static
est donc très fortement déconseillée.
Formulaires
Saisie texte
Chaque champ de saisie de texte doit avoir un label le décrivant :
-
Un champ de saisie sans label visible doit posséder l'attribut
aria-label
<input class="input" type="text" aria-label="Recherche">
-
Un champ de saisie avec label visible doit lier le champ et le label au moyen d'une correspondance
id
/for
<div>
<input id="email" class="input" type="text">
<label for="email">Adresse mail</label>
<div>
Sélection
Chaque champ de sélection doit avoir un label le décrivant pour rester conforme aux exigences d'accessibilité :
-
Un champ de sélection sans label visible doit posséder l'attribut
aria-label
<div class="select">
<select aria-label="Sélectionner la langue">
<option>Français (FR)</option>
<option>English (US)</option>
</select>
<div> -
Un champ de sélection avec label visible doit lier le champ et le label au moyen d'une correspondance
id
/for
<div class="select">
<select id="country-code">
<option>+33 (FR)</option>
<option>+1 (US)</option>
</select>
<label for="country-code">Préfixe téléphonique</label>
<div>
Checkradio
Chaque checkbox, radio et switch doit avoir un label le décrivant pour rester conforme aux exigences d'accessibilité :
-
Un checkradio avec label visible doit lier le champ et le label au moyen d'une correspondance
id
/for
<div class="control">
<input class="is-checkradio" id="checkbox" type="checkbox">
<label for="checkbox">Checkbox</label>
</div>
Tableaux
Les tableaux sont utilisés pour présenter un ensemble de données qui serait peu clair sous forme de phrases.
Un tableau dit de présentation ; utiliser plutôt les éléments de mise en page comme les colonnes.
Les lecteurs d'écran lisent en détail la structure des tableaux, répétant régulièrement les coordonnées au sein du tableau, pour permettre à l'utilisateur de s'y repérer. La lecture d'un tableau est comparativement bien plus lourde que celle d'autres éléments. Il convient de ne les utiliser que si la donnée présentée est suffisemment complexe, et de simplifier au maximum le contenu de chaque ligne et cellule.
Pour la plupart des cas, il vaut mieux privilégier les phrases descriptives, les listes (ordonnées ou non), les listes de définition, les cartes, les tableaux d'offres ou le système de colonnes et lignes pour mettre en forme les éléments.
Caption
Chaque tableau doit avoir une caption le décrivant (qui sera notamment lue par un lecteur d'écran, pour que l'utilisateur puisse choisir de rentrer ou non dans le tableau).
Chaque balise <table>
doit donc contenir comme premier enfant une balise <caption>
portant une description succinte du tableau.
De préférence, la caption décrit factuellement la structure d'un tableau, et ne répète pas une information présente ailleurs sur la page.
Une caption qui répète une information présente ailleurs sur la page.
Sémantique minimale
Chaque tableau doit utiliser les balises <th>
pour identifier sémantiquement les en-têtes de colonnes et de lignes. Chaque cellule ne portant pas cette balise doit être déclarée <th>
. Les balises <tr>
sont recommendées pour structurées le lignes
Sémantique pour les tableaux de structure complexe
Les tableaux de structure complexe doivent associer les en-têtes et les données pour rester conforme aux exigences d'accessibilité (ici, pour le lecteurs d'ecran). Pour cela :
-
utiliser l'attribut
scope
sur les balises<th>
<table class="table">
<caption>Récapitulatif clients</caption>
<tr>
<td></td>
<th scope="col">Nom</th>
<th scope="col">Téléphone</th>
</tr>
<tr>
<td>1.</td>
<th scope="row">Alice</th>
<td>iPhone</td>
</tr>
<tr>
<td>2.</td>
<th scope="row">Bob</th>
<td>Samsung</td>
</tr>
<tr>
<td>3.</td>
<th scope="row">Charlie</th>
<td>Sony</td>
</tr>
</table> -
en cas de cellules fusionnées, associer une balise
<td>
à une ou plusieurs balises<th>
au moyen de l'attributheaders
<table>
<caption>Tableau complexe</caption>
<tbody>
<tr>
<th id="h-a1">Header 1</th>
<th id="h-a2">Header 2</th>
</tr>
<tr>
<td colspan="2" headers="h-a1 h-a2">Lorem</td>
</tr>
<tr>
<th colspan="2" id="h-b">Header 4</th>
</tr>
<tr>
<td headers="h-b">Lorem</td>
<td headers="h-b">Lorem</td>
</tr>
</tbody>
</table>
Onglets
Rôles et attributs ARIA
Un certain nombres de rôles et d'attributs sont nécessaires pour rester conforme aux exigences d'accessibilité :
- Les rôles ARIA
tablist
,tab
,tabpanel
sont nécessaires pour signaler sémantiquement un groupe d'ongles aux technologies d'assistance. - Les attributs ARIA
aria-selected
,aria-controls
etid
,aria-expanded
servent à indiquer l'état actuel du système d'onglets aux technologies d'assitance. - L'attribut
tabindex
facilite la navigation au clavier en implémentant un comportement de "roving tabindex" :- Un "tab in" amène le focus sur l'onglet portant la valeur
tabindex=0
- Le tab suivant amène le focus sur le prochain élément focusable après la liste d'onglets (c'est un "tab out")
- Le changement de tab actif se fait grâce aux touches gauche et droite, ainsi que home et end
- Le tab actif est celui qui porte la valeur
tabindex=0
et qui prendra le focus lors du prochain "tab in"
- Un "tab in" amène le focus sur l'onglet portant la valeur
Le changement des valeurs des attributs est géré par Trilogy Vanilla via les data attribute data-tabs-context
, data-tab-navigation
, data-tabs-wrapper
et data-tab-content
.
<div class="tab-context" data-tabs-context>
<div role="tablist" class="tabs">
<button role="tab" tabindex="0" aria-selected="true" aria-controls="panel-a1" class="tab is-active" data-tab-navigation>Bouygues en bref</button>
<button role="tab" tabindex="-1" aria-selected="false" aria-controls="panel-a2" class="tab" data-tab-navigation>Carte de la couverture</button>
<button role="tab" tabindex="-1" aria-selected="false" aria-controls="panel-a3" class="tab" data-tab-navigation>Notre 5G</button>
</div>
<div class="tab-panels" data-tabs-wrapper>
<div role="tabpanel" id="panel-a1" class="tab-panel is-active" aria-expanded="true" data-tab-content>
<p>Contenu lié au premier onglet</p>
</div>
<div role="tabpanel" id="panel-a2" class="tab-panel" aria-expanded="false" data-tab-content>
<p>Contenu lié au deuxième onglet</p>
</div>
<div role="tabpanel" id="panel-a3" class="tab-panel" aria-expanded="false" data-tab-content>
<p>Contenu lié au troisième onglet</p>
</div>
</div>
</div>
L'utilisation d'une balise <button>
pour les tabs est recommandée.