AprĂšs nous ĂȘtre d’abord concentré·e·s sur l’approche thĂ©matique de notre chatbot LiipGPT — prĂ©sentĂ©e rĂ©cemment lors du relaunch de ZüriCityGPT — nous avons orientĂ© notre attention vers l’accessibilitĂ© avec pour objectif d’atteindre la conformitĂ© WCAG-AA. Comme pour beaucoup de fonctionnalitĂ©s, nous avons d’abord observĂ© comment les rĂ©fĂ©rence du secteur comme ChatGPT, Perplexity et Claude traitent l’accessibilitĂ©. Bien que nous ayons constatĂ© un potentiel d’amĂ©lioration partout, cela nous a inspiré·e·s Ă  rĂ©flĂ©chir Ă  la maniĂšre de faire mieux de notre cĂŽtĂ©.

Notre parcours vers l’accessibilitĂ© s’est articulĂ© autour de quatre Ă©tapes principales: des scans automatiques et quick fixes, la navigation au clavier, l’optimisation pour le zoom mobile ainsi que l’optimisation pour les lecteur·rice·s d’écran.

Scans automatiques et quick fixes

Nous avons commencĂ© par des tests automatisĂ©s d’accessibilitĂ© Ă  l’aide d’extensions de navigateur comme IBM Equal Access Accessibility Checker et axe DevTools. Ces outils nous ont aidé·e·s Ă  identifier des problĂšmes frĂ©quents: labels manquants, contraste de couleurs insuffisant, HTML sĂ©mantique incorrect et attributs ARIA absents. Bien que les scans automatisĂ©s ne dĂ©tectent qu’environ 40 % des problĂšmes d’accessibilitĂ©, ils constituent une base de dĂ©part solide.

Navigation au clavier

Une navigation correcte au clavier est fondamentale pour l’accessibilitĂ©. Garantir que la navigation de base avec la touche Tab fonctionne dans toute l’application est relativement simple. Des composants plus complexes comme les tabs, les menus et les fenêtres de dialogue nĂ©cessitent cependant des interactions clavier plus avancĂ©es comme l'utilisation des flĂšches directionnelles, la gestion de la touche Escape ou encore la gestion du focus selon les directives officielles du W3C. Les utilisateur·rice·s qui dĂ©pendent de la navigation au clavier s’attendent Ă  ces schĂ©mas spĂ©cifiques. S’en Ă©carter provoque confusion et frustration. PlutĂŽt que d’implĂ©menter ces schĂ©mas depuis zĂ©ro, nous avons utilisĂ© Bits UI, une bibliothĂšque headless UI qui applique correctement ces directives d’accessibilitĂ©.

Au-delĂ  des composants individuels, nous avons Ă©galement implĂ©mentĂ© des boucles de focus et une restauration du focus au niveau de l’application afin que les utilisateur·rice·s restent toujours orienté·e·s en passant d’une zone de l’interface du chat Ă  une autre.

Optimisation pour le zoom mobile

Lors de tests utilisateur pour meinplatz.ch avec des personnes en situation de handicap, nous avons observé quelque chose de frappant: beaucoup naviguent sur les sites web sur mobile avec un zoom de 200 % ou plus et tiennent leur appareil à environ 10 cm de leurs yeux. Cette observation a mis en évidence une lacune critique dans la plupart des implémentations de chatbots.

La majoritĂ© des chatbots utilisent des Ă©lĂ©ments Ă  position fixe: un champ de saisie en bas de l’écran et souvent un en-tĂȘte en haut. Lorsque les utilisateur·rice·s zooment fortement, ces Ă©lĂ©ments fixes peuvent occuper tout le viewport et rendre l’interface inutilisable. Malheureusement, les navigateurs ne permettent pas de dĂ©tecter de maniĂšre fiable le niveau de zoom. Pour rĂ©soudre cela, nous utilisons l’Intersection Observer pour dĂ©tecter lorsque l’en-tĂȘte ou le pied de page occupe plus d’espace que prĂ©vu. Dans ce cas, nous supprimons dynamiquement leur position fixe afin de rĂ©tablir l’utilisabilitĂ©.

Des éléments à position fixe causent des problèmes dans les vues fortement zoomées.
La solution: rétablir une position statique pour les éléments fixes lorsqu’un zoom est détecté.

ExpĂ©rience avec les lecteurs d’écran

L’accessibilitĂ© pour les lecteur·rice·s d’écran n’apparaĂźt pas automatiquement, elle nĂ©cessite une conception attentive. Nous nous sommes concentré·e·s sur la fourniture d’un contexte clair grĂące Ă  une structure de page propre (landmarks et titres). Les utilisateur·rice·s comprennent ainsi toujours oĂč iels se trouvent et ce qui se passe, tout en disposant de raccourcis vers les zones les plus importantes de l’application.

Fournir du contexte

Nous avons implĂ©mentĂ© une structure d’outline complĂšte avec des landmarks pour la navigation principale, les paramĂštres et les zones de saisie. Chaque message contient des titres et des labels corrects. De plus, nous avons ajoutĂ© aprĂšs le champ de saisie du chat (en bas de page) un skip-link permettant aux utilisateur·rice·s de revenir rapidement en haut de la page.

Défis avec les Web Components

Travailler avec des Web Components a apportĂ© ses propres dĂ©fis. VoiceOver est particuliĂšrement sensible Ă  la maniĂšre dont les bibliothĂšques sont implĂ©mentĂ©es. Nous avons travaillĂ© en Ă©troite collaboration avec l’équipe Bits UI (qui rĂ©agit trĂšs rapidement aux rapports de bugs) et avons par exemple implĂ©mentĂ© des portails locaux pour les menus dĂ©roulants afin d’éviter des problĂšmes de navigation avec VoiceOver.

Gestion des annonces

L’un des dĂ©fis les plus complexes a Ă©tĂ© la gestion des annonces VoiceOver lorsque plusieurs Ă©vĂ©nements se produisent simultanĂ©ment. Comme la mise en file des annonces ne fonctionne pas de maniĂšre fiable, nous avons soigneusement sĂ©quencĂ© les Ă©vĂ©nements et regroupĂ© les annonces liĂ©es. Par exemple, lorsqu’un·e utilisateur·rice clique sur « Tout sĂ©lectionner » dans une liste d’options, des annonces sĂ©parĂ©es seraient normalement dĂ©clenchĂ©es pour chaque option et se remplaceraient mutuellement. À la place, nous annulons ces annonces individuelles et les remplaçons par un seul message clair qui rĂ©sume la situation (tous les Ă©lĂ©ments sĂ©lectionnĂ©s ou dĂ©sĂ©lectionnĂ©s, retour Ă  la sĂ©lection prĂ©dĂ©finie, etc.).

Comme le chat est une SPA sans rechargement de page, il Ă©tait Ă©galement essentiel d’annoncer tous les changements visibles uniquement visuellement, comme par exemple le changement entre mode clair et sombre ou le changement de langue.

Flux du chat pour les lecteur·rice·s d’écran

Nous avons conçu l’expĂ©rience du chat spĂ©cifiquement pour les utilisateur·rice·s de lecteur d’écran :

  • Le champ de saisie contient Ă  la fois un placeholder et un aria-label avec le titre de la page. Cela fournit du contexte lors du chargement de la page, car le champ est automatiquement focalisĂ© et les utilisateur·rice·s peuvent ainsi ignorer le contenu initial.
  • Lorsqu’une rĂ©ponse est gĂ©nĂ©rĂ©e, nous l’annonçons clairement afin de fournir le mĂȘme retour qu’un indicateur de chargement visuel.
  • DĂšs qu’une rĂ©ponse est prĂȘte, elle est lue sans formatage Markdown (pas d’italique, pas de liens, etc.) afin de garantir un flux de lecture naturel.
  • AprĂšs la lecture d’une rĂ©ponse, nous indiquons que tu peux directement poser une nouvelle question ou naviguer vers les options du dernier message pour donner un feedback ou consulter les rĂ©fĂ©rences. Nous ajoutons dynamiquement cette section interactive du dernier message Ă  l’outline du document afin de crĂ©er un raccourci de navigation rapide.
  • L’historique du chat est structurĂ© comme une sĂ©rie d’articles avec des labels afin que les conversations prĂ©cĂ©dentes soient faciles Ă  parcourir.
La solution: navigation dans le chatbot avec le lecteur d’écran VoiceOver sur macOS.

Teste par toi-mĂȘme

Tu peux dĂ©couvrir ces amĂ©liorations avec Alva, le chatbot de l’administration du canton de BĂąle-Ville. Essaie de naviguer avec VoiceOver (macOS) ou NVA (Windows), d’utiliser uniquement ton clavier ou de zoomer fortement sur un appareil mobile.

Un parcours continu

Notre prochain objectif est d’intĂ©grer des tests automatisĂ©s d’accessibilitĂ© dans notre pipeline CI. Comme mentionnĂ© prĂ©cĂ©demment, les scans automatisĂ©s ne dĂ©tectent qu’environ 40 % des problĂšmes d’accessibilitĂ©. Cela signifie que nous devons continuer Ă  planifier soigneusement chaque nouvelle fonctionnalitĂ© et Ă  la tester manuellement. Rien ne remplace les tests humains lorsqu’il s’agit d’accessibilitĂ©. Les outils automatisĂ©s peuvent signaler des labels manquants ou des problĂšmes de contraste, mais ils ne peuvent pas dĂ©terminer si une interface est rĂ©ellement utilisable pour quelqu’un qui navigue avec un lecteur d’écran ou uniquement au clavier.

L’accessibilitĂ© est un parcours continu, pas une destination. Nous nous engageons Ă  rendre LiipGPT utilisable par tout le monde et continuerons Ă  faire Ă©voluer notre approche sur la base des retours issus de la pratique.

Besoin d’aide pour l’accessibilitĂ© ?

Nous proposons des audits d’accessibilitĂ© pour identifier et corriger les problĂšmes dans tes applications. Si tu souhaites amĂ©liorer l’accessibilitĂ© de ton produit, contacte-nous, nous serons ravi·e·s de t’aider.