Second Brain documentation

ADR 0055 – Commandes « / » et dates en ligne dans l'éditeur

Accepté (2026-10-16, mode autonome)

← Toutes les décisions

ADR 0055 – Commandes « / » et dates en ligne dans l’éditeur

Statut : Accepté (2026-10-16, mode autonome)

Item 24 du jalon 3 (vague 2 du document d’idées) :

  • taper / dans l’éditeur visuel ouvre un menu pour insérer un encadré, un lien, une date, une table, un bloc de code ou un modèle ;
  • dans le texte, @demain (et les autres dates relatives) devient une date cliquable.

Contexte

  • L’éditeur visuel est Tiptap (ADR 0008). Il a déjà une autocomplétion après [[ (ADR 0009), construite sur @tiptap/suggestion.
  • Les #tags du corps sont des décorations sur du texte, pas des nœuds (ADR 0011). Les encadrés sont des citations > [!type] (ADR 0010).
  • La capture en une ligne (ADR 0042) comprend déjà les dates en français, mais côté serveur (CaptureDates).
  • Le Markdown est la forme de stockage : tout ajout doit survivre à l’aller-retour Markdown ↔ éditeur sans perte.

Décision

Dates en ligne : @AAAA-MM-JJ dans le Markdown

  • Stockage : une date en ligne est écrite @2026-10-17. C’est du texte, sans nœud ni balise propre : la même forme dans l’export, les autres outils et la recherche plein texte. Il faut une frontière avant le @ (début, blanc, ouvrant) : jean@exemple.com n’est jamais une date.
  • Saisie :
    • @ ouvre un menu de dates : la saisie si elle est une date (« 22/10 »), puis les formes usuelles qui commencent par elle (« dem » → demain, « dans » → dans 1 semaine…), chacune avec la date complète. Le menu s’arrête à la première espace : les formes en plusieurs mots (« dans 3 jours », « 1er novembre ») se choisissent parmi les propositions ou s’écrivent en chiffres (« 01/11 ») ;
    • @demain suivi d’une espace ou d’une ponctuation devient directement @2026-10-17.
  • Grammaire : french-date.ts reprend celle de la capture (CaptureDates) : aujourd’hui, demain, après-demain, jours de la semaine, « la semaine prochaine », « dans N jours / semaines / mois », 22/10, « 1er novembre 2026 ». La table french-date-cases.json est lue par Vitest et par CaptureDatesTest : les deux grammaires ne peuvent pas diverger sans qu’un test casse.
  • Éditeur : la date reste visible sous sa forme écrite, décorée et avec la date complète en infobulle (« samedi 17 octobre 2026 · demain »). Cacher le texte derrière un libellé rendrait le curseur et la sélection trompeurs.
    • Clic : le sélecteur de date du navigateur s’ouvre sur la date, et la nouvelle valeur la remplace.
    • Ctrl/⌘+clic : ce qui en parle.
  • Aperçu : un lien « sam. 17 oct. », date complète en infobulle. Le nettoyage HTML retire les boutons ; un lien reste focalisable et s’active à Entrée. Un clic (avec ou sans Ctrl) ouvre la palette sur "2026-10-17" : la recherche plein texte trouve les notes qui citent ce jour. Elle ne lit pas les champs date des aspects (les échéances ne sont pas indexées) : montrer aussi les nœuds dus ce jour-là est une piste pour le backlog, pas une promesse de cette tranche.
  • / en début de ligne ou après une espace (jamais au milieu d’un mot, ni dans le code) ouvre les commandes, filtrées par mots sans casse ni accents :
    • titres 1 à 3, listes (puces, numérotée, tâches), citation ;
    • lien vers un nœud (insère [[, qui ouvre la recherche existante) ;
    • date (insère @, qui ouvre le menu des dates) et date du jour ;
    • table 3×3, bloc de code, séparateur, bloc de vue (ADR 0054) ;
    • encadrés de chaque type (les plus courants d’abord ; > [!type] sans titre écrit, l’encadré affiche celui de son type) ;
    • un modèle (ADR 0016) qui a un corps : son corps, variables résolues par le serveur (templateDraft, fuseau du navigateur), est inséré en Markdown à la place de la saisie.
  • La saisie /… est retirée avant la commande. Échap ferme le menu.
  • Accessibilité : même motif que les liens wiki. La liste est un role="listbox" reliée au contenu éditable par aria-controls et aria-activedescendant ; ↑↓, Entrée, Tab et la souris sont pris en charge ; le nombre de propositions est annoncé.

Alternatives écartées

  • Nœud Tiptap « date » avec une forme Markdown propre (<time>) : il faudrait une syntaxe de stockage qui ne serait ni du Markdown courant ni lisible ailleurs. Une décoration sur du texte suit déjà la règle des #tags.
  • Libellé « demain » figé dans le texte : il devient faux le lendemain. L’ISO est stable ; le relatif est calculé à l’affichage.
  • Analyser les dates côté serveur à chaque frappe : trop lent pour un menu, et inutile hors ligne. La table partagée garantit l’égalité des deux grammaires.

Conséquences

  • Dans l’éditeur, la date reste @2026-10-17 à l’écran ; la forme lisible est dans l’aperçu et l’infobulle.
  • La palette garde sa règle (ADR 0014) : la première entrée reste « Capturer ». Après un clic sur une date, les résultats sont dessous : ↓ puis Entrée.
  • Le menu « / » lit la liste des modèles à l’ouverture de l’éditeur : une requête par application, mise en cache par DefinitionsStore.
  • Pendant une recherche [[…]], ni « / » ni « @ » n’ouvrent leur menu : Entrée revient toujours à la recherche de lien.
  • Le libellé relatif (« demain ») est calculé à l’affichage : une page laissée ouverte après minuit le garde jusqu’à la modification suivante.