ADR 0089 – Mode allégé de la coquille, accueil mobile et « Enchaîner »
Accepté (2026-10-17, dans le cadre de l'ADR 0086 §1 validé par Aurélien)
ADR 0089 – Mode allégé de la coquille, accueil mobile et « Enchaîner »
Statut : Accepté (2026-10-17, dans le cadre de l’ADR 0086 §1 validé par Aurélien)
Suite des ADR 0087 (moteur de dashboards) et 0088 (accueil « Maintenant » côté front) : lignes A5, A6 et A7 du fil A du backlog du jalon 4, et un correctif de l’affichage du digest. Maquettes : canvas « Second Brain · Charte graphique », planches Accueil · Maintenant (web) et (mobile). Tout est côté navigateur ; aucun changement d’API ni de configuration.
Décision
Mode allégé de la coquille (A5)
- Une route peut déclarer
data: { shell: 'light' }(lu parshellMode,core/workspace/shell-mode.ts). Posé sur l’accueil (/),/dashboards/:nameet/inbox. - En mode allégé, sur grand écran, l’arborescence (panneau gauche) et le panneau de contexte sont repliés ; la barre d’icônes reste, et les panneaux se rouvrent à la main.
- Le choix fait dans ce mode n’est jamais mémorisé :
WorkspaceStoregarde un état à part (lightLeft,lightRight), remis à « replié » à chaque entrée dans le mode, et lelocalStoragen’est ni lu ni écrit. En quittant la page, on retrouve exactement la disposition mémorisée. - Sous 900 px, les panneaux sont déjà des tiroirs fermés : le mode n’y change rien.
- La coquille applique le mode à chaque
NavigationEnd(WorkspaceStore.setLight) ; une route sansshellest en mode complet. - Effet attendu : à 1280 px la page d’accueil tient sur ses deux colonnes (le conteneur de l’accueil passe en une colonne sous 900 px de largeur de page, ADR 0088, donc volets ouverts l’accueil se replie, volets fermés il reste sur deux colonnes).
Accueil mobile (A6)
- Sous 900 px (le même seuil que la coquille,
WorkspaceStore.mobile), le dashboardlayout: focusàcapture: true:- reste en une colonne dans l’ordre du DOM (ADR 0088) : colonne principale (Aujourd’hui), puis latérale (À expédier vite, Dans un coin de la tête, puis la ligne de puces dont Inbox en bas de colonne). La barre de charge reste sous le titre et la date du widget « Aujourd’hui » ;
- retire le champ de capture de l’en-tête au profit de la barre basse ;
- affiche une barre basse flottante (
HomeBottomBar, collante en bas de la zone de défilement) : un bouton « Capturer » qui ouvre le champ de capture existant (QuickCapture) au-dessus de la barre, « Fermer » le referme, une capture réussie le referme.
- Emplacement « Dicter » : la barre projette tout élément portant l’attribut
dictate(<ng-content select="[dictate]">). Sans contenu projeté, l’emplacement est vide donc masqué (:empty). Aucune logique vocale ici : le bouton « Dicter » est le fil C (ligne C4). - Aucune barre basse hors accueil : elle n’existe que dans un dashboard
focusaveccapture, sur petit écran. - Cibles tactiles de 44 px sous 600 px : case « Fait » (zone cliquable de 44 px autour de la case), titre, « Reporter », boutons d’en-tête de widget, « Tout voir », puces, titres du digest, bouton « Capturer ».
- Vérifié à 390 px (captures ci-dessous) : pas de défilement horizontal, ordre des blocs et mesures des cibles contrôlés par script.
« Enchaîner » (A7)
- Un widget
viewavecchain: true(dashboardfocus) affiche un bouton « Enchaîner » dans son en-tête. Le mode enchaîne toutes les lignes lues de la vue, pas seulement celles affichées (limitne limite que l’affichage), figées à l’ouverture : les relectures de fond (après un « Fait ») ne changent pas la liste en cours. - Mode focus plein écran, côté navigateur seulement : un
<dialog>modal (couche supérieure du navigateur, donc plein écran même dans un conteneur à confinement, focus piégé nativement). Une tâche à la fois : titre, estimation (champsumdu widget), contexte (projet…) et échéance, lus comme les lignes de l’accueil (taskLines, extrait deTaskRowset partagé). - « Fait » appelle le même chemin que la case à cocher (
ViewWidget.markDone: action rapide de la ligne qui écrit un état final, API des lots, écriture annulable, vues relues). Le bouton n’existe pas si la ligne n’a pas d’action de ce genre. En cas de refus du serveur, on reste sur la tâche, le message de refus est celui du widget (« Transition refusée… ») et un rappel s’affiche dans le mode. - « Passer » garde la tâche telle quelle (aucune écriture) et passe à la suivante.
- Minuteur facultatif : « Démarrer le minuteur » / « Pause » / « Reprendre », durée écoulée comparée à l’estimation (« 04:12 sur 20 min », en alerte au-delà) ; remis à zéro à chaque tâche. Rien n’est enregistré.
- Fin de liste : « C’est fini ! » avec le bilan (« 3 faites, 1 passée ») et « Fermer ». Échap quitte à tout moment ; le focus entre sur « Fait », reste dans le dialogue (Tab circulaire) et revient au bouton « Enchaîner » à la fermeture. Tout est accessible au clavier, boutons natifs et nom accessible sur chaque bouton icône.
Digest : métadonnées compactes
Les lignes du digest (colonne latérale) affichaient « Échéance après-demain · Estimation (minutes) 10 ». ViewList gagne l’entrée compact : valeurs seules, séparées par « · » (« après-demain · 10 min »), le libellé de la colonne passant en infobulle. L’unité d’une colonne de nombre est lue dans son libellé entre parenthèses (« (minutes) » donne « min », avec les abréviations usuelles minutes, heures, jours ; une autre unité est gardée telle quelle). Le front ne connaît toujours aucun champ.
Alternatives écartées
- Mémoriser le choix des panneaux en mode allégé : un panneau rouvert une fois sur l’accueil resterait ouvert partout, ou écraserait la disposition mémorisée ailleurs. L’état temporaire est plus simple à raisonner.
- Un mode allégé par la largeur de page seule : ne replie pas les panneaux, donc l’accueil serait en une colonne à 1280 px.
- Overlay en
position: fixeddans le widget : les conteneurscontainer-type: inline-sizede l’accueil deviennent le bloc conteneur dufixed; le<dialog>modal y échappe. - Relire la vue à chaque « Fait » dans l’enchaînement : la liste changerait sous les yeux ; on garde la liste d’ouverture et la vue se relit derrière.
- Détecter l’emplacement « Dicter » par un
inputbooléen : le fil C projette son composant, la barre n’a rien à savoir de lui.
Conséquences
- Aucune migration, aucune définition changée ;
maintenant.yamlutilise déjàchain: truesur « À expédier vite ». - Limites : le mode allégé ne s’applique pas sous 900 px (déjà des tiroirs) ; l’enchaînement ne propose pas de reprise après rechargement de la page ; le minuteur n’est pas conservé en quittant le mode ; la barre basse apparaît sous 900 px (tablette comprise) pour rester cohérente avec la coquille, la planche mobile étant dessinée à 390 px.
- Captures :
docs/captures/jalon4-accueil/(accueil-maintenant-web-1280-allege.png,accueil-maintenant-mobile-390.png,accueil-maintenant-mobile-390-capture.png,enchainer-web.png,enchainer-mobile-390.png).