/* Feuille de style de l'application « Instruction des offres » (Qualipso).
 *
 * ════════════════════════════════════════════════════════════════════════════
 * CE FICHIER NE PORTE **PAS** LA DIRECTION ARTISTIQUE.
 *
 * Elle vit dans `maquette.css`, chargé AVANT celui-ci, et extrait tel quel de
 * `maquette/demo-sequentielle.html` par `scripts/extraire_css_maquette.py`.
 * La maquette est ce que le client a validé : l'application ne la recopie pas,
 * elle la charge. Recopier faisait diverger les deux à chaque retouche — c'est
 * exactement ce qui était arrivé (63 sélecteurs de la maquette réécrits ici,
 * avec d'autres couleurs et d'autres tailles).
 *
 * Ce fichier ne contient donc plus QUE ce que la démonstration n'a pas à
 * porter : les écrans qu'elle ne joue pas, le panneau de preuve, les blocs du
 * modèle, la visite guidée, les formulaires. Aucune de ces règles ne doit
 * redéfinir un sélecteur de la maquette — un test le vérifie
 * (`test_web_maquette.py`). Pour changer une couleur, une taille ou une marge :
 * modifier la maquette, puis relancer le script.
 * ════════════════════════════════════════════════════════════════════════════
 */

/* Palette d'états — chaque état porte sa teinte, son fond et sa bordure. Les
   teintes sont CELLES DE LA MAQUETTE, reprises par `var()` et non recopiées :
   si la maquette change de vert, les états changent avec elle. Seuls les fonds
   et les bordures sont ajoutés, pour qu'un pastel posé sur du blanc garde un
   contour lisible. */
:root{
  --etat-action:var(--navy);   --etat-action-bg:var(--tint);  --etat-action-bord:#bcd9ea;
  --etat-fait:var(--green);    --etat-fait-bg:#eff6ea;        --etat-fait-bord:#c9dfc0;
  --etat-afaire:var(--amber);  --etat-afaire-bg:#faf4e4;      --etat-afaire-bord:#e6d5ab;
  --etat-alerte:var(--red);    --etat-alerte-bg:#f9efed;      --etat-alerte-bord:#e2bfba;
  --etat-source:var(--violet); --etat-source-bg:#f2eefa;      --etat-source-bord:#d8cdee;
  --etat-neutre:var(--ink2);   --etat-neutre-bg:#f1f4f7;      --etat-neutre-bord:var(--hair2);
  /* alias historiques : des écrans les nomment encore */
  --green-bg:var(--etat-fait-bg); --amber-bg:var(--etat-afaire-bg); --red-bg:var(--etat-alerte-bg);
}

/* ================= colonne de gauche =================
   `.sidebar`, `.s-brand`, `.s-titre`, `.nv`, `.dot`, `.s-jour` viennent de la
   maquette. Ne restent ici que le pied — sortie et visite guidée — que la
   démonstration n'a pas, et le rendu du fil quand il ne mène nulle part. */
.sidebar .nv{text-decoration:none}
.s-titre a.rf{display:inline-block;color:var(--mut);text-decoration:none}
.s-titre a.rf:hover{color:var(--navy);text-decoration:underline;text-underline-offset:3px}
/* Une étape inerte — sans dossier ouvert, ou avant le lancement de l'instruction :
   même gabarit, même place dans le fil, mais rien ne s'y passe. Le repère reste,
   ce qui est précisément la règle des deux mondes. */
#rail span.nv{cursor:default;opacity:.55}
#rail span.nv:hover{background:none}
/* Le pied de colonne : la sortie et la visite guidée. La démonstration n'a ni
   l'une ni l'autre, c'est le seul morceau de la colonne que l'application ajoute. */
.s-foot{margin-top:auto;border-top:1px solid var(--hair);padding:12px 18px 14px;
  display:flex;flex-direction:column;gap:9px;font-size:.76rem;color:var(--mut)}
.s-foot a{color:var(--mut)}
.s-foot a:hover{color:var(--navy);text-decoration:underline;text-underline-offset:3px}

/* ================= page ================= */
/* L'en-tête de la maquette n'a rien à sa droite. Quand l'application y pose un
   compteur, elle passe en deux colonnes — et seulement là. Le compteur reste
   discret : il répète ce que le titre du bloc dit déjà, et deux lignes grasses
   alignées à droite tiraient l'œil avant le titre de l'écran. */
.pagehead.avec-meta{display:flex;align-items:baseline;justify-content:space-between;gap:24px}
.headmeta{flex:none;text-align:right;font-size:.76rem;color:var(--mut);line-height:1.5}
.headmeta b{color:var(--mut);font-weight:600}

.chips{display:flex;flex-wrap:wrap;gap:6px;margin:-4px 0 20px}
.chip{font-size:.81rem;font-weight:500;color:var(--ink2);background:var(--card);
  border:1px solid var(--hair);border-radius:6px;padding:4px 11px}
.chip b{font-weight:700;color:var(--ink)}
.chip.ref{color:var(--navy);border-color:#cde2ef;background:var(--tint2)}/* ================= cartes / grilles ================= */
/* La mention à droite d'un titre de carte est `.cardhead .n`, telle que la maquette
   la pose. Elle y tient sur une ligne (`white-space:nowrap`) ; quand l'application
   en écrit deux, le gabarit ajoute `.large` plutôt que de redéfinir la règle. */
.cardhead .n.large{white-space:normal;text-align:right;line-height:1.5;max-width:40ch}
.cols{display:flex;gap:14px;align-items:flex-start}
.cols .grow{flex:1;min-width:0}
.mt{margin-top:14px}

.pg{display:inline-block;font-size:.75rem;font-weight:650;color:var(--navy);background:var(--tint2);
  border:1px solid #cde2ef;border-radius:5px;padding:2px 8px;white-space:nowrap;cursor:pointer;margin:0 2px 2px 0}
.pg:hover{background:var(--tint)}
.pg.wrap{white-space:normal;max-width:100%}
/* Chaque valeur porte sa formule. L'affordance reste, la boîte part : un tableau de
   neuf lignes portait dix-huit pastilles « f(x) » encadrées, et c'est ce qui éloignait
   le plus l'écran de la maquette. Un signe discret suffit à dire « cliquable », et la
   valeur redevient ce qu'on lit d'abord. */
.fx{display:inline;font-family:inherit;font-weight:600;color:var(--blue);opacity:.5;
  background:none;border:0;border-radius:0;padding:0;margin-left:5px;cursor:pointer;
  vertical-align:1px;font-size:0}
.fx::after{content:"f(x)";font-size:.7rem;letter-spacing:.01em}
.fx:hover,.fx:focus-visible{opacity:1;text-decoration:underline;text-underline-offset:2px}/* `text-decoration:none` : un bouton porté par un <a> (« Reprendre », « Aller à
   l'écran Vos dossiers ») s'affichait souligné, et ne se lisait plus comme un bouton. */
.btn:hover{background:#123f58}
.btn.ghost:hover{background:var(--tint2);border-color:var(--navy)}
.btn[disabled]{opacity:.45;cursor:default}
table.t td.sub{color:var(--mut);font-size:.8rem}
table.t tr:last-child td{border-bottom:none}
table.t tr.ref td{background:var(--tint2);font-weight:600}
.v-ok{color:var(--green);font-weight:650}
.v-warn{color:var(--amber);font-weight:650}
.v-bad{color:var(--red);font-weight:650}/* Table plus large que sa carte : elle défile dans son propre cadre, jamais la page.
   L'ombre d'un côté n'apparaît que s'il reste quelque chose à voir de ce côté-là
   (dégradés « local » qui la recouvrent aux extrémités) : sans ce repère, une
   colonne coupée net se lit comme une colonne inexistante. */
/* tables logées dans une carte étroite : colonnes resserrées pour ne jamais déborder */
table.t.tight th,table.t.tight td{padding-left:8px;padding-right:8px}
table.t.tight th:first-child,table.t.tight td:first-child{padding-left:12px}
table.t.tight th:last-child,table.t.tight td:last-child{padding-right:12px}
table.t.tight .tag{white-space:normal}
.kvline .k .rule{display:block;font-size:.77rem;color:var(--mut);line-height:1.5;margin-top:2px}
.kvline .v.soft{font-weight:550;white-space:normal;text-align:right}
.note.warn b{color:var(--amber)}
.note.bad b{color:var(--red)}
.note.ok b{color:var(--green)}
.note.blue b{color:var(--navy)}
.note + .note{margin-top:8px}
.legal{font-size:.78rem;color:var(--ink2);line-height:1.6;border-left:2px solid var(--navy);padding:2px 0 2px 12px}
.legal b{color:var(--navy);font-weight:650}

/* divulgation progressive — un seul mécanisme de repli */
.more{border-top:1px solid var(--hair)}
.more>summary{cursor:pointer;padding:11px 18px;font-size:.82rem;font-weight:650;
  color:var(--navy);list-style:none}
.more>summary::-webkit-details-marker{display:none}
.more>summary::after{content:"  +";font-family:Consolas,monospace}
.more[open]>summary::after{content:"  \2013"}
.more>summary:hover{background:var(--tint2)}
.more .mbody{padding:0 18px 13px;font-size:.81rem;color:var(--ink2);line-height:1.6}
.more .mbody b{color:var(--ink2);font-weight:650}
/* `.heroline` est défini plus bas, une seule fois : l'ancienne version — encadré
   bleu pleine largeur — a été retirée. Deux définitions concurrentes dans la même
   feuille, c'est la dernière qui gagnait, en silence. */
.tracebar{margin-top:10px;display:flex;gap:18px;flex-wrap:wrap;font-size:.79rem;
  color:var(--mut);padding:0 2px}
.tracebar b{color:var(--ink2);font-weight:650}
.mval{font-size:.81rem;color:var(--ink2);margin-bottom:6px}
.mval b{font-weight:700;color:var(--ink)}
.effect{font-size:.75rem;color:var(--mut);line-height:1.5;margin-top:6px}
.decide>div{display:contents}
.decide .ok-btn,.decide .no-btn{display:flex;align-items:center;justify-content:center;
  width:100%;height:100%;text-align:center}
.decide .effect{align-self:start}
#s8 .paper .scrollx{margin:0 -26px;padding:0;overflow-x:auto}
#s8 .paper .scrollx table{min-width:0!important;width:100%;font-size:.8rem}
#s8 .paper .scrollx .t td,#s8 .paper .scrollx .t th{padding-left:3px;padding-right:3px}
#s8 .paper .scrollx .t th{letter-spacing:.03em}
#s8 .paper .scrollx .t th:first-child,#s8 .paper .scrollx .t td:first-child{padding-left:14px}
#s8 .paper .scrollx .t th:last-child,#s8 .paper .scrollx .t td:last-child{padding-right:14px}
#s8 .paper .scrollx .tag{white-space:normal;display:inline-block;margin-top:2px}

/* bloc rédigé par le modèle */
.mdl-blk{border:1px solid var(--hair);border-left:3px solid #8a6fc0;border-radius:8px;
  background:#fdfcff;padding:11px 14px}
.mdl-blk .mtag{display:inline-block;font-size:.69rem;font-weight:700;letter-spacing:.07em;
  text-transform:uppercase;color:#6b4fa1;margin-bottom:6px}
.mdl-blk p{font-size:.89rem;line-height:1.62;color:#252f38;margin:0 0 8px}
.mdl-blk p:last-of-type{margin-bottom:0}
.mdl-blk .mact{display:flex;gap:7px;margin-top:9px;flex-wrap:wrap}
.tok{display:inline-block;font-weight:650;background:var(--tint2);border-radius:4px;padding:0 5px;color:var(--navy)}

/* légende programme / modèle : une ligne discrète, au pied de page */
.legendbox{display:flex;align-items:center;gap:6px 15px;flex-wrap:wrap;
  font-size:.78rem;color:var(--ink2)}
.pagefoot .legendbox{flex-basis:100%;margin-top:9px;padding-top:9px;
  border-top:1px solid var(--hair);font-size:.76rem;color:var(--mut)}
.legendbox .li{display:inline-flex;align-items:center;gap:6px;white-space:nowrap}
/* Pastilles de légende : rondes et franchement teintées, pour se lire d'un coup d'œil
   sans être confondues avec des cases à cocher. La légende est passive : le marquage
   des blocs du modèle est permanent, il n'y a rien à commuter. */
.legendbox .swatch{width:11px;height:11px;border-radius:50%;flex:none}
.legendbox .swatch.calc{background:var(--navy);border:1px solid var(--navy)}
.legendbox .swatch.mdl{background:#8a6fc0;border:1px solid #6b4fa1}

/* listes latérales */
/* Le libellé d'une pièce court sur plusieurs lignes ; son étiquette doit rester en
   tête de bloc, sinon elle flotte au milieu du texte et paraît détachée. */
.pick{display:flex;align-items:flex-start;justify-content:space-between;gap:9px;padding:9px 14px;
  border-bottom:1px solid var(--hair);cursor:default}
.pick>.nm{min-width:0}
.pick>.tag,.pick>.v{flex:none}
.pick:last-child{border-bottom:none}
.pick .nm{font-size:.88rem;font-weight:600}
/* Le sous-titre d'une pièce court sur plusieurs lignes : il passe en bloc. Une
   ÉTIQUETTE logée dans le même libellé (le motif d'un courrier, à l'étape 5) n'est
   pas un sous-titre : elle garde sa forme, sa taille et sa teinte d'état. */
.pick .nm span:not(.tag){display:block;font-size:.77rem;color:var(--mut);font-weight:500;margin-top:2px;line-height:1.45}
.pick .nm span.tag{margin-top:2px}
.pick.sel{background:var(--tint2);box-shadow:inset 2px 0 0 var(--navy)}

/* vignettes s4 */
.vigrow{display:flex;gap:8px;flex-wrap:wrap;padding:12px 18px 14px}
.vig{flex:1 1 calc(20% - 8px);min-width:118px;max-width:calc(25% - 6px);border:1px solid var(--hair);border-radius:8px;padding:8px 11px;background:var(--card)}
.vig b{display:block;font-size:.81rem;font-weight:650;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.vig .n{font-size:1.06rem;font-weight:700;margin-top:3px}
.vig .st{font-size:.73rem;margin-top:3px;display:block;line-height:1.45}
.vig{cursor:pointer}
.vig:hover{border-color:var(--hair2);background:var(--tint2)}
.vig.sel{border-color:var(--navy);box-shadow:0 0 0 1px var(--navy);background:var(--card)}

/* décision s6 */
.decide{display:grid;grid-template-rows:auto auto;grid-auto-flow:column;
  grid-auto-columns:1fr;column-gap:7px}
.decide .ok-btn{border:1px solid var(--green);color:var(--green);background:var(--card);
  border-radius:7px;font-size:.84rem;font-weight:650;padding:8px 13px;cursor:pointer}
.decide .ok-btn:hover{background:var(--green-bg)}
.decide .no-btn{border:1px solid var(--red);color:var(--red);background:var(--card);
  border-radius:7px;font-size:.84rem;font-weight:650;padding:8px 13px;cursor:pointer}
.decide .no-btn:hover{background:var(--red-bg)}

/* rapport s8 */
.paper{max-width:730px;margin:0 auto;padding:22px 28px}
.paper .sec{font-size:.72rem;font-weight:700;letter-spacing:.07em;text-transform:uppercase;
  color:var(--ink2);margin:20px 0 7px}
.paper .sec:first-child{margin-top:0}

/* cockpit spécifique */
.grouplbl{padding:12px 18px 2px;display:flex;align-items:baseline;gap:8px}
.grouplbl .n{font-size:.8rem;font-weight:700;color:var(--red)}
.grouplbl.g2 .n{color:var(--amber)}
.task{display:flex;align-items:center;gap:16px;padding:11px 18px;border-bottom:1px solid var(--hair)}
.task:last-child{border-bottom:none}
.task .sev{width:7px;height:7px;border-radius:50%;flex:none}
.sev.red{background:var(--red)} .sev.amb{background:var(--amber)}
.task .tx{flex:1;min-width:0}
.task .tx b{font-size:.94rem;font-weight:650}
.task .tx p{font-size:.84rem;color:var(--ink2);margin-top:3px;line-height:1.5}
.task .meta{flex:none;text-align:right;font-size:.78rem;color:var(--mut);line-height:1.5;width:158px}
.act{flex:none;width:126px;text-align:right;font-size:.86rem;font-weight:650;color:var(--navy);
  white-space:nowrap;cursor:pointer}
.act:hover{text-decoration:underline;text-underline-offset:3px}
.act::after{content:" \2192"}
.row2{display:grid;grid-template-columns:1fr 344px;gap:16px;align-items:start}
table.t td .rk{display:inline-block;width:18px;font-size:.78rem;font-weight:700;color:var(--mut);margin-right:9px}
tr.lead td{background:var(--tint2)}
tr.lead td .rk{color:var(--navy)}
tr.gapline td{border-bottom:none;padding:0 14px}
.gapmark{display:flex;align-items:center;gap:10px;font-size:.75rem;font-weight:650;color:var(--amber)}
.gapmark::before,.gapmark::after{content:"";flex:1;border-top:1px dashed var(--amber);opacity:.5}
.tfoot-note{padding:11px 18px 14px;font-size:.8rem;color:var(--ink2);line-height:1.6;border-top:1px solid var(--hair)}
.tfoot-note b{color:var(--ink2);font-weight:650}
.pagefoot{margin:26px 0 24px;border-top:1px solid var(--hair);padding:12px 0 6px;display:flex;
  justify-content:space-between;gap:24px;flex-wrap:wrap;font-size:.77rem;color:var(--mut);line-height:1.55}
.frontiere{margin-top:16px;display:grid;grid-template-columns:1fr 1fr 1fr;border:1px solid var(--hair);
  border-radius:10px;overflow:hidden;font-size:.81rem;line-height:1.55;color:var(--ink2);background:var(--card)}
.frontiere div{padding:11px 16px}
.frontiere div + div{border-left:1px solid var(--hair)}
.frontiere b{display:block;font-size:.71rem;font-weight:700;letter-spacing:.07em;text-transform:uppercase;margin-bottom:4px}
.frontiere .f1 b{color:var(--ink)} .frontiere .f2 b{color:#6b4fa1} .frontiere .f3 b{color:var(--green)}

/* panneau de preuve */
.proof{position:fixed;top:0;right:0;bottom:0;width:408px;background:var(--card);border-left:1px solid var(--hair2);
  box-shadow:-6px 0 22px rgba(26,40,51,.09);z-index:80;display:none;flex-direction:column}
.proof.on{display:flex}
.proof-head{padding:15px 20px 12px;border-bottom:1px solid var(--hair);position:relative}
.proof-head h4{font-size:1rem;font-weight:650;margin-top:4px}
.proof-head p{font-size:.81rem;color:var(--ink2);margin-top:4px;line-height:1.55}
.proof-close{position:absolute;top:12px;right:14px;width:26px;height:26px;border-radius:6px;
  border:1px solid var(--hair);background:var(--card);color:var(--ink2);cursor:pointer;font-size:.85rem}
.proof-close:hover{background:var(--tint2)}
.proof-body{padding:16px 20px;overflow:auto;flex:1}
.pagemock{border:1px solid var(--hair2);border-radius:4px;background:#fff;padding:16px;
  box-shadow:0 2px 8px rgba(26,40,51,.06)}
.pagemock .pmh{font-size:.71rem;letter-spacing:.08em;text-transform:uppercase;color:var(--mut);
  font-weight:700;border-bottom:1px solid var(--hair);padding-bottom:7px;margin-bottom:11px;
  display:flex;justify-content:space-between}
.ln{height:7px;border-radius:2px;background:#eef1f4;margin-bottom:7px}
.ln.s{width:60%}.ln.m{width:87%}.ln.xs{width:36%}
.ln.hi{background:var(--tint);box-shadow:0 0 0 1px var(--blue)}
.pagemock .cap{font-size:.77rem;color:var(--mut);margin-top:11px;line-height:1.55}
.proof-body .quotebox{margin-top:12px;font-size:.84rem;color:var(--ink2);line-height:1.62;
  border-left:2px solid var(--blue);padding-left:11px}

/* popover formule */
.pop{position:fixed;z-index:90;width:360px;background:var(--card);border:1px solid var(--hair2);
  border-radius:8px;box-shadow:0 6px 24px rgba(26,40,51,.13);padding:13px 15px;display:none}
.pop.on{display:block}
.pop .ph{font-size:.68rem;letter-spacing:.08em;text-transform:uppercase;color:var(--mut);font-weight:700;margin-bottom:7px}
.pop .pf{font-family:Consolas,ui-monospace,monospace;font-size:.8rem;color:var(--navy);line-height:1.65;
  background:var(--tint2);border:1px solid var(--hair);border-radius:5px;padding:8px 10px;margin-bottom:8px;white-space:pre-wrap}
.pop .pn{font-size:.81rem;color:var(--ink2);line-height:1.55}
.pop .pclose{position:absolute;top:8px;right:10px;border:0;background:transparent;color:var(--mut);cursor:pointer;font-size:.85rem}
.pop .pclose:hover{color:var(--ink)}

/* =======================================================================
   Socle web — ajouts à la feuille de la maquette (rien n'est retiré ci-dessus).
   Ces règles n'existent pas dans cockpit.html : elles couvrent ce que la
   maquette simulait en JavaScript (écrans commutés) ou n'avait pas (connexion,
   preuve rendue en image, barre d'action, messages).
   ======================================================================= */

/* La maquette commute ses écrans dans une seule page (`.screen{display:none}` et
   `.screen.on{display:block}`). Ici, un écran EST une page servie par le serveur :
   les gabarits posent donc toujours `class="screen on"`, et la règle de la maquette
   s'applique telle quelle. Rien à redéfinir. */

/* accessibilité : cible de saut et anneau de focus visible partout */
.skip{position:absolute;left:-9999px;top:0;z-index:100;background:var(--navy);color:#fff;
  padding:8px 14px;border-radius:0 0 8px 0;font-size:.86rem;font-weight:650}
.skip:focus{left:0}
a:focus-visible,button:focus-visible,summary:focus-visible,input:focus-visible,
select:focus-visible,textarea:focus-visible,[tabindex]:focus-visible{
  outline:2px solid var(--blue);outline-offset:2px;border-radius:4px}/* champs de saisie : la maquette n'en avait aucun */
.champ>span{display:block;font-size:.7rem;font-weight:700;letter-spacing:.11em;
  text-transform:uppercase;color:var(--mut);margin-bottom:6px}
/* Aide d'un champ : l'intitulé dit quoi remplir, l'aide dit ce qui est attendu. */
.champ>span.aide{font-size:.79rem;font-weight:500;letter-spacing:0;text-transform:none;
  color:var(--mut);margin:-4px 0 6px;line-height:1.5}
/* La maquette stylise `.champ textarea,.champ input` : taille, bordure, rayon,
   fond. Elle ignore `<select>`, qu'aucun de ses écrans n'emploie — c'est la seule
   chose à ajouter, et elle reprend les mêmes valeurs par héritage de la règle. */
.champ select{width:100%;padding:10px 13px;border:1px solid var(--hair2);
  border-radius:9px;font-size:.88rem;background:#fff}
.champ input:focus,.champ select:focus,.champ textarea:focus{border-color:var(--navy);outline:none;
  box-shadow:0 0 0 3px var(--tint)}
form.action{display:inline}
form.action.bloc{display:block}
button[aria-busy="true"],.btn[aria-busy="true"]{opacity:.55;cursor:progress}

/* messages de l'application (validation écrite, refus, information) */
.flashes{margin-bottom:16px}

/* page de connexion */
.connexion{min-height:100vh;display:flex;align-items:center;justify-content:center;padding:32px 20px}
.connexion .card{width:100%;max-width:392px}
.connexion .marque{display:flex;align-items:center;gap:11px;padding:20px 22px 16px;
  border-bottom:1px solid var(--hair)}
.connexion .marque img{width:38px;height:38px;flex:none}
.connexion .marque .ident b{display:block;font-size:1.09rem;font-weight:700;color:var(--navy);
  letter-spacing:-.01em;text-transform:none}
.connexion .marque .ident>span{display:block;font-size:.64rem;font-weight:600;letter-spacing:.11em;
  color:var(--mut);text-transform:uppercase;margin-top:1px}
.connexion form{padding:18px 22px 20px}
.connexion .btn{width:100%;margin-top:4px}
.connexion .pied{font-size:.77rem;color:var(--mut);line-height:1.55;padding:0 22px 18px}

/* panneau de preuve : la maquette dessinait une page factice, ici c'est l'image réelle */
.proof-body .preuve{display:block;width:100%;height:auto;border:1px solid var(--hair2);
  border-radius:4px;background:#fff;box-shadow:0 2px 8px rgba(26,40,51,.06)}
.proof-body .attente{font-size:.82rem;color:var(--mut);line-height:1.55}
.proof-body .horspages{margin-bottom:10px}
.proof-head .lbl{color:var(--navy)}

/* barre du bas : action principale de l'écran, toujours visible */
.actionbar{position:fixed;left:256px;right:0;bottom:0;background:var(--card);
  border-top:1px solid var(--hair2);box-shadow:0 -6px 22px rgba(26,40,51,.09);z-index:60}
.actionbar .ab-in{max-width:1128px;margin:0 auto;padding:11px 36px;display:flex;gap:20px;
  align-items:center;justify-content:space-between;flex-wrap:wrap}
.actionbar .ab-tx{font-size:.83rem;color:var(--ink2);line-height:1.55;min-width:0}
.actionbar .ab-tx b{color:var(--ink);font-weight:650}
body.has-actionbar .page{padding-bottom:110px}

/* écran non encore disponible : la page doit rester propre, jamais vide */
.vide{padding:28px 18px 26px;text-align:center;color:var(--ink2);font-size:.9rem;line-height:1.65}
.vide b{display:block;color:var(--ink);font-size:1.02rem;font-weight:650;margin-bottom:6px}

/* =======================================================================
   Bloc 3 — palette d'états appliquée (lot C).

   Règle unique : la couleur marque un ÉTAT ou une ACTION, jamais un paragraphe.
   Une classe `.e-…` pose la paire teinte/fond/bordure de son état ; les blocs qui
   la reçoivent (`.kpi`, `.d-etat`, `.suite`, `.tag`, `.chip`) ne définissent que
   leur forme. Les tableaux et le texte courant restent au gris bleuté du socle.
   ======================================================================= */

/* --- porteurs génériques d'un état ------------------------------------------- */
.e-action{color:var(--etat-action);background:var(--etat-action-bg);border-color:var(--etat-action-bord)}
.e-fait{color:var(--etat-fait);background:var(--etat-fait-bg);border-color:var(--etat-fait-bord)}
.e-afaire{color:var(--etat-afaire);background:var(--etat-afaire-bg);border-color:var(--etat-afaire-bord)}
.e-alerte{color:var(--etat-alerte);background:var(--etat-alerte-bg);border-color:var(--etat-alerte-bord)}
.e-source{color:var(--etat-source);background:var(--etat-source-bg);border-color:var(--etat-source-bord)}
.e-neutre{color:var(--etat-neutre);background:var(--etat-neutre-bg);border-color:var(--etat-neutre-bord)}/* --- étiquettes : un trait de couleur sur fond blanc, jamais un aplat ---------
   La maquette pose des pastilles au trait ; l'application les remplissait d'un fond
   pastel. Sur un tableau de neuf verdicts, neuf aplats colorés se disputent le regard
   et l'écran cesse d'être calme. Le contour porte la même information et pèse moins. */
.tag.att{background:#fff;color:var(--etat-action);border-color:var(--etat-action-bord)}
/* « sans objet » n'est pas un verdict : c'est l'absence de verdict. La maquette
   l'écrit en texte gris, pas en pastille. */
.tag.info:where(.neutre),.t .tag.info{border-color:transparent;padding-left:0;padding-right:0}

/* --- chips : mêmes paires, forme inchangée ----------------------------------- */
.chip.ok{background:var(--etat-fait-bg);color:var(--etat-fait);border-color:var(--etat-fait-bord)}
.chip.ok b{color:var(--etat-fait)}
.chip.warn{background:var(--etat-afaire-bg);color:var(--etat-afaire);border-color:var(--etat-afaire-bord)}
.chip.warn b{color:var(--etat-afaire)}
.chip.bad{background:var(--etat-alerte-bg);color:var(--etat-alerte);border-color:var(--etat-alerte-bord)}
.chip.bad b{color:var(--etat-alerte)}
.chip.src{background:var(--etat-source-bg);color:var(--etat-source);border-color:var(--etat-source-bord)}
.chip.src b{color:var(--etat-source)}

/* --- messages de l'application : la teinte se lit du coin de l'œil ------------ */
.flashes .note{border-left-width:4px;padding-left:13px}
.flashes .note.ok{border-left-color:var(--etat-fait)}
.flashes .note.warn{border-left-color:var(--etat-afaire)}
.flashes .note.bad{border-left-color:var(--etat-alerte)}
.flashes .note.blue{border-left-color:var(--etat-action)}

/* --- compteurs d'état : un chiffre, ce qu'il compte, la couleur de son état --- */
/* Bandeau de tête : ce que le dossier porte, en quelques nombres, dans un seul cadre
   divisé — la forme de la maquette. À distinguer de `.compteurs`, qui aligne des cartes
   cliquables au cockpit. */
/* Le dépôt tient sur une ligne : un champ, un bouton. Ce qui l'expliquait — trois
   paragraphes et une seconde carte pour le dépôt à l'unité — passe sous un repli. */
.depot .depot-ligne,.depot-unite .depot-ligne{display:flex;gap:10px;align-items:center;
  flex-wrap:wrap;padding:13px 18px}
.depot .depot-ligne input[type=file]{flex:1 1 320px;min-width:0}
.depot-unite{margin-top:-6px}
.depot-unite .depot-ligne select{flex:0 1 260px}
.depot-unite .depot-ligne input[type=file]{flex:1 1 220px;min-width:0}

.compteurs{display:flex;flex-wrap:wrap;gap:8px;margin:0 0 16px}
.kpi{flex:1 1 162px;min-width:146px;background:var(--card);border:1px solid var(--hair);
  border-left:3px solid var(--etat-neutre-bord);border-radius:9px;padding:9px 13px 10px;
  display:block;text-decoration:none;color:var(--ink)}
.kpi .n{display:block;font-size:1.44rem;font-weight:700;letter-spacing:-.022em;line-height:1.15;color:var(--ink)}
.kpi .l{display:block;font-size:.71rem;font-weight:700;letter-spacing:.07em;text-transform:uppercase;
  color:var(--mut);margin-top:4px;line-height:1.4}
a.kpi:hover{border-color:var(--hair2)}
a.kpi .l::after{content:" \2192"}
.kpi.e-fait{border-left-color:var(--etat-fait)} .kpi.e-fait .n{color:var(--etat-fait)}
.kpi.e-afaire{border-left-color:var(--etat-afaire)} .kpi.e-afaire .n{color:var(--etat-afaire)}
.kpi.e-alerte{border-left-color:var(--etat-alerte)} .kpi.e-alerte .n{color:var(--etat-alerte)}
.kpi.e-source{border-left-color:var(--etat-source)} .kpi.e-source .n{color:var(--etat-source)}
.kpi.e-action{border-left-color:var(--etat-action)} .kpi.e-action .n{color:var(--etat-action)}
.kpi.e-neutre{border-left-color:var(--etat-neutre-bord)}
/* le fond des compteurs reste blanc : seule la barre et le chiffre portent l'état */
.kpi.e-fait,.kpi.e-afaire,.kpi.e-alerte,.kpi.e-source,.kpi.e-action,.kpi.e-neutre{background:var(--card)}

/* --- « Prochaine étape » : le bloc qui répond à « et maintenant ? » ----------- */
.suite{display:flex;align-items:center;gap:14px;flex-wrap:wrap;border:1px solid var(--etat-afaire-bord);
  border-left:4px solid var(--etat-afaire);background:var(--etat-afaire-bg);border-radius:10px;
  padding:12px 16px;margin-bottom:16px}
.suite .num{width:30px;height:30px;border-radius:50%;flex:none;display:flex;align-items:center;
  justify-content:center;font-size:.9rem;font-weight:700;background:var(--etat-afaire);color:#fff}
.suite .tx{flex:1;min-width:180px}
.suite .tx .lbl{color:var(--etat-afaire)}
.suite .tx b{display:block;font-size:1.06rem;font-weight:650;color:var(--ink);letter-spacing:-.012em;margin-top:2px}
.suite .tx p{font-size:.85rem;color:#6e5218;line-height:1.55;margin-top:4px;max-width:78ch}
.suite .btn{flex:none}
.suite.e-fait{border-color:var(--etat-fait-bord);border-left-color:var(--etat-fait);background:var(--etat-fait-bg)}
.suite.e-fait .num{background:var(--etat-fait)}
.suite.e-fait .tx .lbl{color:var(--etat-fait)}
.suite.e-fait .tx p{color:#31552a}
.suite.e-alerte{border-color:var(--etat-alerte-bord);border-left-color:var(--etat-alerte);background:var(--etat-alerte-bg)}
.suite.e-alerte .num{background:var(--etat-alerte)}
.suite.e-alerte .tx .lbl{color:var(--etat-alerte)}
.suite.e-alerte .tx p{color:#6e2e2a}

/* --- mot d'accueil : deux lignes quand la base ne porte encore aucun dossier --- */
.accueil{border:1px solid var(--etat-action-bord);border-left:4px solid var(--etat-action);
  background:var(--etat-action-bg);border-radius:10px;padding:14px 18px 16px;margin-bottom:18px}
.accueil .lbl{color:var(--etat-action)}
.accueil h2{font-size:1.16rem;font-weight:650;letter-spacing:-.015em;color:var(--navy);margin-top:3px}
.accueil p{font-size:.89rem;color:#2a4a60;line-height:1.6;margin-top:6px;max-width:80ch}
.accueil .btnrow{margin-top:13px}/* --- fil d'instruction : chaque étape porte son état ------------------------- *//* Le numéro gris remplace la pastille vide : une étape non commencée se lit
   comme une étape à venir, pas comme un rond décoratif. */
/* --- où en est chaque dossier de la maison : un état, sa paire teinte/fond ----- */
.d-etat{display:inline-block;font-size:.75rem;font-weight:700;border:1px solid;
  border-radius:5px;padding:3px 9px;white-space:nowrap}

@media (max-width:900px){
  .sidebar{position:static;width:auto;inset:auto;border-right:0;border-bottom:1px solid var(--hair)}
  main{margin-left:0}
  .page{padding:16px 18px 40px}
  .actionbar{left:0}
  .proof{width:100%}
  .row2{grid-template-columns:1fr}
  .suite .btn{margin-left:44px}
  .kpi{flex:1 1 140px}
}
.mode-demo{display:flex;align-items:center;gap:15px;margin:0 0 18px;padding:12px 14px;
  border:1px solid #8fb9aa;border-left:5px solid #1f7156;border-radius:10px;background:#f3faf7}
.mode-demo-signe{flex:none;padding:7px 10px;border-radius:7px;background:#1f7156;color:#fff;
  font-size:.72rem;line-height:1.2;font-weight:800;letter-spacing:.07em;text-align:center}
.mode-demo-texte{display:flex;flex:1;min-width:180px;flex-direction:column;font-size:.88rem;line-height:1.55;color:var(--ink2)}
.mode-demo-texte b{font-size:.98rem;color:var(--navy)}
.mode-demo-actions{display:flex;align-items:center;justify-content:flex-end;gap:7px;flex-wrap:wrap}
@media(max-width:900px){.mode-demo{align-items:flex-start;flex-wrap:wrap}.mode-demo-actions{width:100%;justify-content:flex-start}}
.demo-pas{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:0;padding:18px}
.demo-pas-item{display:flex;gap:10px;align-items:center;min-width:0;padding:10px 13px;border-right:1px solid var(--hair);color:var(--mut)}
.demo-pas-item:last-child{border-right:0}.demo-pas-item i{display:grid;place-items:center;width:28px;height:28px;flex:none;border:1px solid var(--hair);border-radius:50%;font-style:normal;font-weight:700}
.demo-pas-item span{display:flex;flex-direction:column;min-width:0}.demo-pas-item b{font-size:.86rem;color:var(--ink2)}.demo-pas-item small{font-size:.76rem;line-height:1.4}
.demo-pas-item.actif i{border-color:var(--blue);background:var(--blue);color:#fff}.demo-pas-item.actif b{color:var(--navy)}
.demo-pas-item.fait i{border-color:#1f7156;background:#e6f4ee;color:#1f7156}.demo-pas-item.fait b{color:#1f7156}
@media(max-width:900px){.demo-pas{grid-template-columns:1fr 1fr}.demo-pas-item:nth-child(2){border-right:0}}
@media(max-width:560px){.demo-pas{grid-template-columns:1fr}.demo-pas-item{border-right:0;border-bottom:1px solid var(--hair)}.demo-pas-item:last-child{border-bottom:0}}

/* Parcours séquentiel : le constat reste le repère, un seul dossier est ouvert. */
.examen-phases{display:flex;gap:9px;align-items:center;flex-wrap:wrap;margin:0 0 20px;font-size:.82rem}
.examen-phases a{padding:4px 12px;border:1px solid var(--hair2);border-radius:20px;color:var(--mut);
  text-decoration:none;background:#fff}
.examen-phases a:first-of-type{color:var(--navy);border-color:#bcd9ea}
.examen-phases span{color:var(--hair2)}
/* Une ligne de tableau tient sur une hauteur. Les précisions — « base 108 », « sans
   offre au dossier » — passaient à la ligne et doublaient chaque rangée : neuf sociétés
   occupaient deux fois la place qu'elles prennent dans la maquette. Elles restent
   lisibles, en gris, à la suite de ce qu'elles précisent. */
.examen-table td{padding-top:9px;padding-bottom:9px}
.examen-table small{display:inline;color:var(--mut);font-size:.78rem;margin-left:7px}
.examen-table [data-ouvrir-examen]{cursor:pointer}
.examen-table [data-ouvrir-examen]:hover,.examen-table .selectionnee{background:#eef6fb}
.examen-table .selectionnee td:first-child{box-shadow:inset 3px 0 #17506f}
.examen-gestes{display:flex;gap:12px;flex-wrap:wrap;font-size:.76rem;margin-top:7px}
.examen-gestes a{color:#17506f;text-decoration:underline;text-underline-offset:3px}
.examen-entreprise{border:1px solid #d8e1e7;border-radius:12px;background:#fff;overflow:hidden}
.examen-entete{background:#eef6fb;display:flex;justify-content:space-between;gap:20px;padding:18px 24px;color:#17506f}
.examen-entete span{margin-left:16px;font-size:.85rem}
.examen-bloc{padding:22px 24px;border-top:1px solid #e7edf1;scroll-margin-top:20px}
.examen-bloc .cardhead{padding:0 0 18px;border:0}
.examen-redaction,.examen-prelecture{background:#fcfaff;border:1px solid #d9ccee;color:#523c7d}
.examen-redaction{line-height:1.65!important}
.examen-texte{white-space:pre-wrap;overflow-wrap:anywhere;line-height:1.7;padding:16px 0}
.examen-prelecture{padding:18px;border-radius:8px}
.examen-envoi{display:flex;gap:14px;align-items:flex-end;flex-wrap:wrap}
.examen-envoi .champ{margin:0;max-width:240px}
.examen-courriers{display:flex;gap:10px;flex-wrap:wrap;margin-bottom:16px}
.examen-courriers a{padding:8px;border:1px solid #d8e1e7;border-radius:6px}
.examen-courriers a[aria-current]{background:#eef6fb;font-weight:600}
.examen-reference{flex:1;min-width:280px}
.examen-details{flex-wrap:wrap}.examen-details>.grow{min-width:300px;flex:2}
.examen-cloture{padding:16px;border-top:1px solid #e7edf1}
.examen-reperes{max-width:900px}
@media(max-width:800px){.examen-bloc{padding:18px 12px}.examen-entete{padding:16px 12px}.examen-entete span{display:block;margin:4px 0 0}.examen-table{min-width:760px}}/* =============================================================================
   ALIGNEMENT SUR LA MAQUETTE  —  21/09/2026
   -----------------------------------------------------------------------------
   `maquette/demo-sequentielle.html` est la référence visuelle validée par le
   client. Les tokens de couleur étaient déjà les siens ; ce qui éloignait
   l'application, ce sont les primitives partagées — la respiration des cartes,
   le traitement des messages, la largeur de la colonne. Les valeurs ci-dessous
   sont celles de la maquette, reprises à l'identique.

   Cette section vient en dernier : elle prime sur les réglages antérieurs, et
   elle se lit d'un bloc plutôt que dispersée dans le fichier.
   ========================================================================== *//* La colonne de lecture. 1128 px laissait les tableaux s'étaler ; 1010 px les
   ramène à la largeur où la maquette les a montrés. *//* Les cartes respirent : 24 px de marge intérieure, et un titre qui n'est pas
   séparé de son contenu par un filet. */

/* --- une ligne de valeur qui s'ouvre sur ce qui la fonde --------------------- */
/* La maquette résume le cadre du marché en six lignes. L'application en porte la
   matière : chaque ligne est donc la même ligne, et elle s'ouvre. Fermée, elle a
   exactement l'allure d'une `.kvline` ; ouverte, elle rend tout ce qui la justifie. */
.kvd{border-bottom:1px solid var(--hair)}
.kvd:last-child{border-bottom:0}
.kvd > summary{display:flex;justify-content:space-between;gap:20px;padding:9px 0;
  cursor:pointer;list-style:none}
.kvd > summary::-webkit-details-marker{display:none}
.kvd > summary::marker{content:""}
.kvd > summary .k{font-size:.87rem;color:var(--ink2)}
.kvd > summary .v{font-weight:620;white-space:nowrap}
.kvd > summary::after{content:"+";margin-left:-14px;color:var(--mut);font-weight:600}
.kvd[open] > summary::after{content:"–"}
.kvd > summary:hover .k,.kvd > summary:hover::after{color:var(--navy)}
.kvd > summary:focus-visible{outline:2px solid var(--blue);outline-offset:2px}
.kvd .mbody{padding:2px 0 16px;font-size:.87rem;color:var(--ink2);line-height:1.6}
.kvd .mbody > p{margin-top:10px}
.kvd .mbody .kvline{padding:7px 0}
.kvd .mbody .note{margin:10px 0}
.kvd .mbody .pick{padding-left:0;padding-right:0}

/* Une rangée de boutons déjà logée dans un bloc qui porte ses marges ne les
   reprend pas : elle doublerait le retrait. */
.card>.btnrow:only-child,.pad .btnrow,.mbody .btnrow,.depot-ligne .btnrow{padding:0}
/* Hors carte — barre d'action, flashes — le message n'a pas de carte pour lui
   donner ses marges : il les prend lui-même. */
.contenu>.note,.page>.note{margin-left:0;margin-right:0}
/* `.tag.att` est défini plus haut, avec la palette d'états : cette seconde
   définition posait les mêmes propriétés avec des couleurs écrites en dur. */

/* Le message principal d'un écran. La maquette écrit une phrase sous le titre
   (`.pagehead .chapeau`, qu'on emploie tel quel) ; celui-ci est le message qui
   change avec l'état du dossier, et il se distingue par un filet. */
.heroline{border-left:2px solid #a9cfe6;padding:2px 0 2px 15px;margin:0 0 20px;
  font-size:.92rem;color:var(--ink2)}
.heroline b{color:var(--ink);font-weight:650}
.heroline.amber{border-left-color:#dcc186}

/* La colonne de lecture s'est resserrée à la largeur de la maquette ; les tableaux de
   constat, eux, portent une colonne de plus qu'elle (le geste « voir le détail ») et
   des précisions de ligne. Sans largeur minimale, les en-têtes se coupaient en deux et
   chaque rangée reprenait deux hauteurs. Ils défilent plutôt que de se tasser — le
   conteneur `.scrollx` est déjà là pour ça. */
/* Les tableaux de constat portent, par ligne, une société, deux valeurs, un verdict
   en deux parties et l'état de l'examen. Trop serrés, le verdict passait à la ligne
   et chaque rangée prenait deux hauteurs — le tableau entier doublait. Ils défilent
   dans leur `.scrollx` plutôt que de se tasser. */
.examen-table{min-width:1040px}
.examen-table td.verdict{white-space:nowrap}
.examen-table td .tag{white-space:nowrap}
.examen-table small{white-space:nowrap}
