Repousser un projet en bloc, sauf ce dont on ne décide pas

Glisser la barre résumé décale toutes les phases du même nombre de jours,
écarts conservés : un projet engagé glisse souvent, et le faire phase par
phase les déformait. Restent en place ce qui est terminé — on ne réécrit
pas le passé — et les phases à date imposée, nouveau booléen `fixed` pour
ce qui est délégué ou tenu du dehors.

D'où le format en version 6 : sans l'incrément, un binaire antérieur
effacerait ces dates imposées à la première sauvegarde.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
2026-08-10 18:07:31 +02:00
parent 55128fd0d4
commit 4a513f9a59
15 changed files with 788 additions and 74 deletions

View File

@@ -829,6 +829,24 @@ button[aria-pressed="true"] {
);
}
/* Une phase dont la date ne nous appartient pas — déléguée, contractuelle,
réglementaire (docs/decisions.md, section 28).
Deux **taquets** verticaux à ses extrémités, comme les butées d'une pièce
qu'on ne peut plus faire coulisser. La marque se cumule avec les quatre
textures de statut au lieu de leur disputer la place : c'est bien une phase à
venir, en cours ou bloquée, qui se trouve en plus tenue par le dehors.
En `inset`, donc sans toucher à la géométrie : la barre garde exactement la
largeur de ses dates, et l'ombre portée reste déclarée à côté — un
`box-shadow` ne se cumule pas d'une règle à l'autre, il se remplace. */
.barre--imposee {
box-shadow:
var(--ombre),
inset 3px 0 0 var(--texte),
inset -3px 0 0 var(--texte);
}
/* Poignées de redimensionnement, révélées au survol de la barre. */
.poignee {
position: absolute;
@@ -884,6 +902,15 @@ button[aria-pressed="true"] {
background: var(--danger);
}
/* Un losange n'a pas d'extrémités où poser les taquets d'une barre imposée : il
se cercle. Déclarée après `.jalon`, dont elle partage la spécificité — c'est
l'ordre qui la fait gagner, un `box-shadow` se remplaçant en bloc. */
.jalon--impose {
box-shadow:
var(--ombre),
inset 0 0 0 2px var(--texte);
}
.jalon--selectionne {
outline: 2px solid var(--texte);
outline-offset: 1px;
@@ -907,8 +934,8 @@ button[aria-pressed="true"] {
déplié, et rendue à l'identique dans les deux cas — c'est le même objet, il
n'a pas à changer d'aspect quand on ouvre le couloir.
Volontairement plus mince qu'une barre de phase : elle voisine avec elles
dès que le projet est déplié, et ne se glisse pas.
Lecture seule : voir docs/decisions.md, section 8. */
dès que le projet est déplié.
Elle se glisse pour repousser le projet : voir docs/decisions.md, section 8. */
.barre-cumulative {
position: absolute;
top: calc((var(--hauteur-ligne) - var(--hauteur-cumulative)) / 2);
@@ -921,6 +948,25 @@ button[aria-pressed="true"] {
z-index: 2;
}
/* La prise ne s'annonce que là où elle mène quelque part : sur un projet dont
tout est terminé, la barre n'a pas de rôle et garde le curseur par défaut —
rien ne bougerait. */
.barre-cumulative[data-role='cumul'] {
cursor: grab;
}
.barre-cumulative[data-role='cumul']:hover {
background: color-mix(in srgb, var(--couleur-projet) 28%, var(--surface));
}
/* Mince comme elle est, une barre cumulative saisie se repère mal. L'ombre la
décolle du couloir le temps du geste, sans changer sa géométrie — ce qui
décalerait ce qu'on est en train de viser. */
.barre-cumulative.barre--glissee {
cursor: grabbing;
box-shadow: 0 0 0 2px color-mix(in srgb, var(--couleur-projet) 60%, transparent);
}
.segment {
position: absolute;
top: 0;