ADR-047
Règle système : pas d'état `:visited` sur la navigation
English summary: Establishes a system-wide governance rule: navigation elements (nav, sidebar, TOC, tabs, breadcrumbs, footer links, icon-buttons) must never carry a distinct
:visitedcolor, since navigation is not "read/unread" content. Content links in prose are unaffected. Consolidates previously scattered, incomplete:visitedresets insite/build.js.
>
*The original French version follows below — preserved unaltered as the historical record.*
Contexte
Au cours du redesign du site, un défaut de pattern a été relevé : les éléments de navigation peuvent hériter de l'état :visited du navigateur (teinte violette, ou dérive de couleur), ce qui casse la cohérence visuelle et la hiérarchie. Un menu, un onglet, une sidebar, une table des matières ou un bouton-icône d'en-tête n'est pas du contenu « lu / non lu » : son apparence ne doit pas dépendre de l'historique de navigation.
Le site neutralisait déjà :visited de façon ponctuelle et dispersée (uniquement .top-nav et .github-btn), tandis que d'autres surfaces de navigation (.sidebar, .toc, .footer-links, .audit-footer-link) ne l'étaient pas. La demande humaine est explicite : en faire une règle de portée système entière, pas seulement une correction locale du site web.
Décision
Adoption d'une règle de gouvernance no-visited-nav (voir .claude/rules/no-visited-nav.md) :
Tout élément de navigation réaligne sa couleur
:visitedsur l'état non-visité. La règle s'applique au **site, aux composantsagtc-*et aux applications consommatrices**.
Périmètre de la règle
| ✅ Concerné (pas d'état visité) | ❌ Non concerné (état visité autorisé) |
|---|---|
| Nav header (+ CTA), sidebar, TOC, onglets, fil d'Ariane, pagination, menus, boutons-icônes header/footer, liens de pied de navigation | Liens de contenu dans la prose, listes de résultats/archives où « déjà lu » aide l'utilisateur |
Critère de tri : si l'élément sert à se déplacer dans le produit → navigation → pas d'état visité. S'il pointe vers une ressource à lire → état visité autorisé.
Implémentation de référence (site)
Bloc CSS unique et commenté dans site/build.js, neutralisant :visited sur toutes les surfaces de navigation via token sémantique (jamais de valeur en dur), déclaré avant les règles :hover/.active (à spécificité égale, le sélecteur le plus tardif l'emporte sur un lien visité ET survolé). Les déclarations :visited ponctuelles préexistantes (.top-nav, .github-btn) sont supprimées au profit de ce bloc consolidé.
Accessibilité (WCAG 2.2)
Neutre, voire bénéfique : supprimer la distinction :visited ne réduit aucune information utile sur de la navigation (l'état actif/courant reste porté par .active + aria-current). Aucun ratio de contraste n'est dégradé — la couleur visitée devient identique à la couleur non-visitée déjà validée. Sur les liens de contenu, où :visited peut aider l'orientation, la règle ne s'applique pas (WCAG 1.4.1 — ne pas véhiculer l'information par la seule couleur reste de toute façon respecté par les états .active/soulignement).
Alternatives rejetées
- Garder l'état
:visitedpar défaut du navigateur sur la navigation : teinte violette
incohérente avec la marque, casse la hiérarchie — rejeté.
- Limiter la correction au seul site web (sans règle système) : reconduit la dérive dans les
composants et les applications consommatrices — contraire à la demande explicite « au système complet ».
- Neutraliser
:visitedglobalement sur tout<a>(y compris contenu) : prive les liens de
contenu/archives d'un repère d'orientation parfois utile — trop large, rejeté au profit d'un périmètre « navigation ».
Conséquences
- Nouvelle règle versionnée
.claude/rules/no-visited-nav.md, applicable à tout agent et toute
surface (site + composants + apps).
site/build.js: neutralisation:visitedconsolidée sur 6 surfaces de navigation
(top-nav, sidebar, toc, footer-links, audit-footer-link, boutons-icônes), via tokens sémantiques. Build : 662 défini · 177 référencé · 0 fantôme.
- Les futurs composants exposant de la navigation (
agtc-linken usage nav,agtc-segmented, futur
agtc-tabs) devront neutraliser :visited dans leur shadow DOM selon la même règle.
- Aucun token ajouté ou modifié — décision purement de gouvernance/pattern.