From 7ff1329a8697a569c668960c58f4e2ffd58eddff Mon Sep 17 00:00:00 2001 From: Bertrand Benjamin Date: Fri, 7 Aug 2026 18:36:07 +0200 Subject: [PATCH] =?UTF-8?q?=C3=89largir=20le=20panneau=20en=20glissant=20s?= =?UTF-8?q?on=20bord?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Trois cent quarante pixels suffisaient à des champs de date ; ils ne suffisent pas à une liste imbriquée, où chaque niveau mange une indentation. Le panneau reçoit donc la même poignée que la colonne des libellés (décision 18) : même geste, même double-clic de remise à zéro, même mémorisation dans `localStorage`. Le code de glisser, jusque-là écrit pour la seule colonne, est paramétré par le sens et la largeur qu'il pilote plutôt que dupliqué. Une largeur unique pour les deux panneaux : ce qu'on élargit est le volet, pas l'un ou l'autre de ses contenus. La largeur voulue et la largeur appliquée sont deux variables distinctes, faute de quoi réduire un instant la fenêtre ferait perdre le réglage. Co-Authored-By: Claude Opus 5 --- README.md | 5 ++ css/style.css | 39 ++++++++++- docs/decisions.md | 13 +++- index.html | 23 ++++++ js/app.js | 175 ++++++++++++++++++++++++++++++++++++---------- 5 files changed, 214 insertions(+), 41 deletions(-) diff --git a/README.md b/README.md index 6b46060..dd363ae 100644 --- a/README.md +++ b/README.md @@ -97,6 +97,7 @@ Une fois un projet en place : |---|---| | Glisser le corps d'une barre | Décale la phase, durée conservée | | Glisser le bord d'une barre | Change la date de début ou de fin | +| Glisser le bord gauche du panneau | Change sa largeur (double-clic : d'origine) | | Clic sur une barre ou son nom | Ouvre le panneau de détail | | Clic sur une autre barre, panneau ouvert | Bascule le panneau sur cette phase | | Clic sur un nom de phase hors écran | Ramène la frise sur elle | @@ -132,6 +133,10 @@ décision à quelle date. Elles se lisent aussi au survol du nom du projet dans et celles d'une phase au survol de sa barre : l'infobulle les affiche sans les marques de mise en forme, puces et cases dessinées comprises. +Le **panneau se redimensionne** en glissant son bord gauche, comme la colonne des projets ; un +double-clic revient à la largeur d'origine. Cette largeur est propre au navigateur, elle n'est pas +enregistrée dans le planning. + ### La vue par mois Les deux boutons **Frise** et **Par mois**, en haut à gauche, changent de regard sur les mêmes diff --git a/css/style.css b/css/style.css index cff43be..2bbf8ad 100644 --- a/css/style.css +++ b/css/style.css @@ -31,6 +31,9 @@ /* Doit rester en accord avec `LARGEUR_LIBELLES.defaut` (app.js), sur lequel retombe le double-clic de la poignée. */ --largeur-libelles: 300px; + /* Même règle, pour `LARGEUR_PANNEAU.defaut`. Les deux panneaux la partagent : + ce qu'on élargit est le volet, pas l'un ou l'autre de ses contenus. */ + --largeur-panneau: 380px; --rayon: 6px; --ombre: 0 1px 2px rgb(15 23 42 / 0.08); @@ -814,8 +817,8 @@ button[aria-pressed="true"] { top: 0; right: 0; bottom: 0; - width: 340px; - max-width: 90vw; + width: var(--largeur-panneau); + max-width: 100vw; background: var(--surface); border-left: 1px solid var(--bordure); box-shadow: -4px 0 16px rgb(15 23 42 / 0.12); @@ -824,6 +827,38 @@ button[aria-pressed="true"] { flex-direction: column; } +/* Poignée de largeur, sur le bord gauche. Jumelle de `.poignee-colonne` : même + épaisseur, même trait d'accent au survol, même curseur. Ce qui change est le + bord auquel elle s'accroche, puisque le panneau est ancré à droite. */ +.poignee-panneau { + position: absolute; + top: 0; + bottom: 0; + left: -4px; + width: 9px; + cursor: col-resize; + z-index: 1; +} + +.poignee-panneau::after { + content: ""; + position: absolute; + inset: 0 4px; + background: var(--accent); + opacity: 0; + transition: opacity 0.12s; +} + +.poignee-panneau:hover::after, +.poignee-panneau:focus-visible::after, +.poignee-panneau[data-glisse="true"]::after { + opacity: 1; +} + +.poignee-panneau:focus-visible { + outline: none; +} + /* Le panneau reçoit le focus à l'ouverture pour que le clavier le suive, mais il n'est pas un contrôle : un anneau de focus autour de tout le panneau n'apprendrait rien et attirerait l'œil loin du champ à remplir. */ diff --git a/docs/decisions.md b/docs/decisions.md index 346d567..5f9f17b 100644 --- a/docs/decisions.md +++ b/docs/decisions.md @@ -691,9 +691,18 @@ Une seule écriture y échappe : cocher une case depuis l'aperçu, où le champ pas prendre le focus. Le geste vide donc la pile — sans grande conséquence, puisqu'on n'était pas en train d'y taper. -### Les infobulles s'aplatissent +### Le volet s'élargit, les infobulles s'aplatissent -Les **infobulles** de la frise ne peuvent pas montrer de rendu : l'attribut `title` du +Trois cent quarante pixels suffisaient à des champs de date ; ils ne suffisent pas à une liste +imbriquée, où chaque niveau mange une indentation. Le panneau reçoit donc la **même poignée** que la +colonne des libellés (décision 18) : même geste, même double-clic de remise à zéro, même +mémorisation dans `localStorage` — c'est un réglage d'écran, pas une donnée à synchroniser. Une +largeur unique pour les deux panneaux, parce que ce qu'on élargit est le volet, pas l'un ou l'autre +de ses contenus. Elle est plafonnée à la fenêtre sans être écrasée pour autant : la largeur voulue +et la largeur appliquée sont deux variables distinctes, faute de quoi réduire un instant la fenêtre +ferait perdre le réglage. + +Les **infobulles** de la frise, elles, ne peuvent pas montrer de rendu : l'attribut `title` du navigateur ne connaît que le texte. Les notes y sont donc **aplaties** — marques retirées, et remplacées par un caractère qui porte le même sens là où il y en a un : `•` pour un tiret, `☐` et `☑` pour une case, `│` pour une citation. Sans cela, survoler une barre afficherait la source diff --git a/index.html b/index.html index 517c12d..5807e4d 100644 --- a/index.html +++ b/index.html @@ -106,6 +106,20 @@ flèches piloter la phase sélectionnée. -->