ADR 0048 – Récents (Ctrl+E), Précédent et Suivant
Accepté (2026-10-16, mode autonome)
ADR 0048 – Récents (Ctrl+E), Précédent et Suivant
Statut : Accepté (2026-10-16, mode autonome)
Item 17 du jalon 3 (vague 2 du document d’idées) : retrouver en deux touches un nœud vu il y a peu, et revenir sur ses pas, comme dans IntelliJ (Ctrl+E pour les fichiers récents, Ctrl+Alt+←/→ pour la navigation).
Contexte
- Les onglets (ADR 0024) gardent au plus 20 nœuds ouverts dans la session. Un onglet fermé disparaît, et l’ordre est celui de l’ouverture, pas celui de la dernière consultation.
- Alt+←/→ changent déjà d’onglet depuis un onglet de nœud (ADR 0031). Hors d’un onglet de nœud, ils sont rendus au navigateur, dont c’est le Précédent et le Suivant.
- StarterKit (Tiptap) lie Ctrl/⌘+E au code en ligne.
- Le bundle initial est surveillé : la coquille ne doit charger que le strict nécessaire.
Décision
Récents
- Stockage :
RecentsStoregarde les 30 derniers nœuds affichés (id, titre, type, date), du plus récent au plus ancien, dans lelocalStoragedu navigateur. C’est une commodité de l’appareil, pas une donnée du deuxième cerveau : rien n’est écrit côté serveur.localStorageet nonsessionStoragecomme les onglets : la liste doit survivre à la fermeture du navigateur, c’est tout son intérêt. Les titres restent donc sur l’appareil ; l’application vise un poste personnel.- La liste est relue avant chaque écriture et suit l’événement
storage: deux onglets du navigateur ne s’écrasent pas.
- Alimentation : la fiche ajoute le nœud à chaque affichage ou enregistrement, et son titre suit les renommages. Une mise à la corbeille le retire.
- Ouverture : Ctrl+E (⌘E), ou le bouton « Nœuds récents » de l’en-tête, ouvre un dialogue chargé à la demande. Il suit le motif combobox/listbox de la palette :
- un filtre par mots, sans casse ni accents ;
- ↑/↓ (avec bouclage), Début/Fin, Entrée pour ouvrir, Échap pour fermer ;
- Ctrl+E à nouveau descend d’une ligne.
- Sélection initiale : le nœud précédent quand le premier est celui qu’on regarde, marqué « affiché ». Ctrl+E puis Entrée revient donc au nœud d’avant, comme dans IntelliJ.
- Éditeur : Ctrl+E est réservé, comme Ctrl+K (ADR 0014). Un plugin ProseMirror prioritaire laisse passer la touche avant les keymaps de l’éditeur, sans
preventDefault. Le code en ligne reste accessible par la barre d’outils et les accents graves.
Précédent et Suivant
- Historique : celui du navigateur, via
Location.back()etLocation.forward(): une seule histoire, partagée avec les gestes du système et les boutons du navigateur. - Boutons : deux flèches dans l’en-tête, à côté de la recherche. Elles sont désactivées quand la Navigation API dit qu’aucune page de l’application ne précède ou ne suit (
canGoBack,canGoForward, qui ne comptent que les pages de la même origine). Sans cette API, elles restent actives et le navigateur décide. - Raccourcis : Ctrl+Alt+←/→, comme IntelliJ, même dans un champ (aucune action de saisie ne les utilise). Sous macOS, ⌘[ et ⌘], comme le navigateur, car Ctrl+⌥+flèche y change de bureau ; sur un clavier AZERTY, la touche physique fait foi (⌘^ et ⌘$). Alt+←/→ seuls continuent de changer d’onglet. Au bout de l’historique, la touche est avalée : ⌘[ ne fait pas quitter l’application alors que la flèche est grisée.
- Ctrl+E sous un dialogue : la touche n’atteint jamais la barre d’adresse du navigateur. Sous les récents, elle descend d’une ligne ; sous un autre dialogue, elle ne fait rien.
- Navigation refusée : le routeur passe en
canceledNavigationResolution: 'computed'. Quand la garde des modifications non enregistrées refuse un Précédent, l’historique est rétabli au lieu que l’entrée précédente soit écrasée par la page courante. - Flèches :
aria-disabledplutôt quedisabled, pour que le bouton garde le focus quand on arrive au bout de l’historique ;aria-keyshortcutsannonce la touche. - Téléphone : sous 600 px, les flèches sont masquées (le geste et le bouton Retour du système suffisent) ; les récents restent.
Alternatives écartées
- Récents côté serveur (lus dans
node_event) : les événements notent les écritures, pas les lectures. Il faudrait journaliser chaque consultation, pour un usage propre à chaque appareil. - Pile de navigation propre à l’application : elle divergerait de l’historique du navigateur (Retour du système, rechargement) et dupliquerait ce qu’il fait déjà.
- Ctrl+Alt+←/→ sous macOS : pris par le système (changement de bureau).
Conséquences
- Les récents d’un ordinateur ne suivent pas sur le téléphone.
- Un nœud supprimé ailleurs reste dans la liste. L’ouvrir montre l’erreur de la fiche, et il disparaît après 30 consultations plus récentes.
- Dans un navigateur sans Navigation API, les flèches ne sont jamais grisées.
- Ctrl+Alt+←/→ peut être pris par le système avant la page : changement de bureau sous GNOME, rotation de l’écran avec certains pilotes Intel sous Windows. Les flèches de l’en-tête restent disponibles. Sous Windows, AltGr+← vaut Ctrl+Alt+← et revient donc en arrière.