Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

♿️fix(logo): évite les arrêts de vocalisation de lecteurs d'écrans #903

Open
wants to merge 1 commit into
base: main
Choose a base branch
from

Conversation

manuhabitela
Copy link

@manuhabitela manuhabitela commented Mar 8, 2024

👋

Suite à mon retour sur le slack de la communauté voici un commit concernant les logos.

Je recopie ici le message de commit :


Actuellement on utilise des <br> dans les logos pour que "République Française" ou autres termes s'affichent bien visuellement.

Par défaut, un lecteur d'écran peut avoir tendance à arrêter la lecture après un <br> quand on navigue pas à pas. C'est le comportement normal, c'est ce qu'on veut habituellement : il s'arrête pour marquer un passage à la ligne.

Cependant ici ça serait mieux que le lecteur ne s'arrête pas, le br étant utilisé uniquement pour l'aspect layout.

Masquer ces <br> de l'arbre d'accessibilité permet de rendre la vocalisation plus fluide (plus d'arrêts à cause des br) tout en gardant l'impact visuel.

Note : dans certains usages du logo, le problème n'était pas présent (le dom n'est pas tout à fait le même sur un "header minimal" et un "header sans navigation" par exemple). Cependant j'ai trouvé ça pas plus mal de garder cette idée de aria-hidden partout afin que tout copié/collé rapide du DSFR fonctionne.


Si ça vous dit de merger ça, ça serait peut-être intéressant de mentionner pourquoi ce fameux aria-hidden est présent dans la partie Accessibilité des composants concernés ?

Voici aussi une vidéo montrant la diff avant/après avec NVDA (le problème est aussi reproductible avec JAWS). Pas de son mais une boîte de dialogue affiche ce qui est vocalisé ;)

nvda-br.mp4

@keryanS keryanS added correctif Quelque chose ne fonctionne pas à valider labels Mar 13, 2024
@keryanS
Copy link
Contributor

keryanS commented Mar 13, 2024

Merci pour le retour Manu,
Nous avions conscience de ce problème mais il est passé à la trappe.
Ta PR me semble nickel, nous l'intégrerons dans la prochaine livraison.
Je crée un ticket pour la partie doc.
🔥

@manuhabitela manuhabitela force-pushed the fix/logo-line-breaks branch 2 times, most recently from 8d1f375 to e69f8e3 Compare March 14, 2024 12:43
@keryanS
Copy link
Contributor

keryanS commented Mar 18, 2024

Après discussion avec l'équipe, l'utilisation de <br aria-hiden=true> n'est pas forcément la solution que nous recommanderons. En effet, en terme de structure html, le <br> n'est pas vraiment recommandé dans un contexte de layout. Il serait surement plus judicieux de scinder le contenu dans des sous élements (span par exemple) avec une propriété css permettant le passage à la ligne (display : block).
Par exemple :

<p class="fr-logo">
  <span class="fr-logo__row">Intitulé</span>
  <span class="fr-logo__row">officiel</span>
</p>
.fr-logo__row {
  display: block;
}

@keryanS keryanS added invalide Ne semble pas correct and removed à valider labels Mar 18, 2024
@manuhabitela
Copy link
Author

manuhabitela commented Mar 18, 2024

Faudrait revérifier mais pour le coup pour l'usage dont je parle je pense que ça ne résout pas le problème ; le lecteur d'écran va voir deux blocs et donc faire une pause en plein milieu.

edit : effectivement au moins avec NVDA en faisant comme ça, ça repart à vocaliser en deux parties.

@keryanS
Copy link
Contributor

keryanS commented Mar 20, 2024

Faudrait revérifier mais pour le coup pour l'usage dont je parle je pense que ça ne résout pas le problème ; le lecteur d'écran va voir deux blocs et donc faire une pause en plein milieu.

edit : effectivement au moins avec NVDA en faisant comme ça, ça repart à vocaliser en deux parties.

Je n'ai pas testé, mais à priori les span ne vocalisent pas de pause, si ?

Actuellement on utilise des `<br>` dans les logos pour que
"République Française" ou autres termes s'affichent bien visuellement.

Par défaut, un lecteur d'écran peut avoir tendance à arrêter la lecture
après un `<br>`. C'est le comportement normal, c'est ce qu'on veut
habituellement : il s'arrête pour marquer un passage à la ligne.

Cependant ici ça serait mieux que le lecteur ne s'arrête pas, le br
étant utilisé uniquement pour l'aspect layout.

Indiquer que ces `<br>` sont purement décoratifs permet de rendre la
vocalisation plus fluide (plus d'arrêts à cause des br) tout en gardant
l'impact visuel.

Note : dans certains usages du logo, le problème n'était pas présent (le
dom n'est pas tout à fait le même sur un "header minimal" et un "header
sans navigation" par exemple). Cependant j'ai trouvé ça pas plus mal de
garder cette idée partout afin que tout copié/collé
rapide du DSFR fonctionne.
@manuhabitela manuhabitela force-pushed the fix/logo-line-breaks branch from e69f8e3 to daa493c Compare March 21, 2024 13:39
@manuhabitela
Copy link
Author

manuhabitela commented Mar 21, 2024

Bon c'est un peu overkill et c'est de la micro opti donc pas si grave si c'est pas géré hein, mais bon tant pis je suis lancé :P

NVDA regarde le CSS pour déduire comment vocaliser des éléments donc si, les span peuvent déclencher des pauses.

Le comportement est pas le même suivant les lecteurs d'écrans. J'ai fait une page de test pour donner une idée : https://codepen.io/leimi/pen/bGJqmrL :

  • VoiceOver vocalise tout bien.
  • JAWS s'arrête au saut de ligne avec le code actuel. Et vocalise mal les solutions span+display block ou span+display flex, il semble ne pas comprendre qu'il y a un espace entre les mots et dit "républiqué française".
  • NVDA s'arrête au saut de ligne avec span+display block. Et dit aussi "républiqué française" en span+display flex.
  • pas testé sur mobile

En alternative au <br aria-hidden="true">, un <br role="presentation"> répare le problème pour tout le monde et identifie mieux le pourquoi on l'utilise que le aria-hidden="true" dans le code. De plus le RGAA a un cas prévu pour ça (à défaut du aria-hidden).

J'ai mis à jour mon code pour utiliser le role plutôt que le aria-hidden.

@yaaax
Copy link

yaaax commented Mar 28, 2024

Bonjour !

Merci @manuhabitela pour cette PR. J’étais aussi tombé sur ce problème, mais il est tombé aux oubliettes.

Je viens de tester la deploy-preview ci-dessus et sur Safari (version 16.6.1) / VoiceOver (version 10) les 2 mots sont désormais "collés", je pense que c’est un problème.

intitule-officiel-sans-espace

@manuhabitela
Copy link
Author

oui bien vu, rajouter un espace avant la balise du br devrait régler le souci 👌

@zellerbaptiste
Copy link
Contributor

Bon c'est un peu overkill et c'est de la micro opti donc pas si grave si c'est pas géré hein, mais bon tant pis je suis lancé :P

NVDA regarde le CSS pour déduire comment vocaliser des éléments donc si, les span peuvent déclencher des pauses.

Le comportement est pas le même suivant les lecteurs d'écrans. J'ai fait une page de test pour donner une idée : https://codepen.io/leimi/pen/bGJqmrL :

  • VoiceOver vocalise tout bien.
  • JAWS s'arrête au saut de ligne avec le code actuel. Et vocalise mal les solutions span+display block ou span+display flex, il semble ne pas comprendre qu'il y a un espace entre les mots et dit "républiqué française".
  • NVDA s'arrête au saut de ligne avec span+display block. Et dit aussi "républiqué française" en span+display flex.
  • pas testé sur mobile

En alternative au <br aria-hidden="true">, un <br role="presentation"> répare le problème pour tout le monde et identifie mieux le pourquoi on l'utilise que le aria-hidden="true" dans le code. De plus le RGAA a un cas prévu pour ça (à défaut du aria-hidden).

J'ai mis à jour mon code pour utiliser le role plutôt que le aria-hidden.

Bonjour Emmanuel,
merci pour tout ces tests précieux qui aident à faire avancer notre reflexion.

Après en avoir re-discuté avec l'équipe et dans le but de fournir prochainement un correctif serait-il possible de tester également une structure avec les deux <span> en inline du type :

<p class="fr-logo">
  <span>Intitulé</span>
  <span class="fr-logo__row">officiel</span>
</p>

et en ajoutant en CSS un retour à la ligne dans un pseudo element sur la classe 'fr-logo__row' :

 .fr-logo__row::before {
  content: "\000A";
  white-space: pre-line;
}

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
correctif Quelque chose ne fonctionne pas invalide Ne semble pas correct
Projects
None yet
Development

Successfully merging this pull request may close these issues.

4 participants