Les couleurs sont des jetons, et le contraste est un nombre calculé
La palette tient dans un bloc de 14 variables, et le texte secondaire utilise un seul jeton : `--muted: #666b65`. Les rapports, recalculés avec la formule de luminance relative du WCAG sur les sept fonds du site : 5,45:1 sur blanc, 5,15, 5,11, 5,03, 5,02, 4,79 et 4,72. Le texte principal, `--ink: #181a19`, obtient 17,49:1 sur blanc ; l’accent vert `#355c46`, 7,58:1. Lorsqu’une couleur n’atteint pas le seuil, c’est le jeton qui change, pas l’argumentation en réunion.
Les composants ont un modèle de clavier, pas seulement un aspect
Le groupe d’onglets de la page d’accueil utilise un index de tabulation mobile : seul l’onglet actif est accessible avec Tab, les autres sont retirés de l’ordre, et les flèches gauche/droite, Home et End déplacent le focus, avec le comportement par défaut de la touche annulé. C’est le modèle des pratiques recommandées pour les composants accessibles, implémenté, non cité. Dans les composants de base du site, il y a 21 étiquettes accessibles, 7 états pressé/non pressé, 3 liens entre titre et région, 2 états de sélection, 2 régions qui annoncent les changements et 2 liens entre la commande et le panneau qu’elle contrôle.
Le mouvement a un bouton d’arrêt et s’éteint selon la préférence du système
Sur la page d’accueil, il y a 38 éléments animés à l’infini, lancés automatiquement, qui durent plus de cinq secondes — exactement la situation régie par le critère « Pause, arrêt, masquage ». Les 38 sont couverts par des boutons de pause : à l’appui, les animations passent à l’état arrêté et l’état du bouton change. Séparément, avec `prefers-reduced-motion: reduce`, une règle globale annule toute animation et transition, arrête le défilement fluide, supprime le déplacement au survol de la souris et masque le bouton de pause. Dans la feuille principale, il y a sept blocs de ce type, plus un dans la feuille de base.
Indicateur de focus visible, seulement là où il faut
Contour solide de 2 px, dans le vert d’accent, avec 5 px d’écart, appliqué via `:focus-visible` — il apparaît donc lors de la navigation au clavier et non au clic de souris. Vérifié dans le navigateur, élément par élément, dans l’en-tête et sur les premières commandes du contenu : quatre éléments différents, le même contour. Nulle part dans la feuille de style il n’existe de contour supprimé sans remplacement.
Formulaires qui annoncent leurs états
Dans le formulaire de contact du site, les étiquettes sont implicites sur les champs, l’erreur est marquée comme alerte et la confirmation comme état — donc les lecteurs d’écran les annoncent sans que l’utilisateur doive chercher. Le piège pour les bots est correctement masqué : parent sans affichage, marqué comme masqué pour les technologies d’assistance et retiré de l’ordre de tabulation. L’audit interne confirme que les règles d’étiquetage, de nom pour les sélecteurs et de remplissage automatique passent toutes.
La vérification se fait avec un outil, sur des pages réelles
Nous exécutons axe-core 4.10.2 sur la page live, pas dans un environnement de test, sur un échantillon de dix pages couvrant différents modèles : la page d’accueil, le catalogue, une page produit, l’index des services, une page de service, la matrice de solutions, une combinaison de la matrice, le contact, les tarifs, un article et un document juridique. Le résultat brut est écrit sur la page, avec le nombre de nœuds, pas résumé en « conforme ».
Ce qui a échoué est publié, pas arrondi
Du même audit : à 320 px de largeur, la commande de l’en-tête et le bouton de menu dépassent l’écran de 22 px et la page défile horizontalement — l’arithmétique donne 362 px de contenu dans un conteneur de 280 px. Dans les documents juridiques, les liens dans le texte ne se distinguent du texte environnant que par la couleur, et le rapport entre l’accent et le texte courant est de 1,01:1, donc le soulignement est obligatoire. Les deux sont ouverts, avec correction écrite. Nous les publions parce qu’un acheteur qui demande l’accessibilité mérite de voir à quoi ressemble une vraie liste de défauts.
Pas de thème sombre — dit, non simulé
Le site n’a pas de thème sombre. Le bloc de jetons est déclaré pour trois sélecteurs qui reçoivent des valeurs identiques, et dans le code il n’existe aucune règle pour la préférence de schéma du système. Vérifié dans le navigateur avec le schéma sombre émulé : la page reste blanche. La conséquence utile : tous les rapports de contraste mesurés sont valables dans les deux schémas. La conséquence désagréable : le commutateur de thème est du code mort du point de vue de la couleur. Un vrai thème sombre signifie une nouvelle mesure complète du contraste, pas la copie des valeurs.
Typographie avec des règles, pas avec des préférences
Une seule famille pour les titres et le texte, avec un espacement des lettres ajusté par niveau — plus serré pour les grands titres, `-0,055em` aux niveaux un et deux, `-0,035em` au niveau trois — et une graisse 500 pour les titres. Les paragraphes utilisent l’équilibrage des lignes, afin qu’un mot ne reste pas seul sur la dernière ligne. Le conteneur a une largeur maximale de 1240 px avec des marges de 48 px, et les boutons ont partout la même hauteur de ligne. Ce sont des règles écrites dans la feuille de style, donc elles s’appliquent aussi après notre départ.