/* e-LAB — bundle CSS genere; ne pas modifier directement.
 * Source: npm run generate:frontend-css
 * Ordre: styles.css -> theme-v273.css -> ui-v353.css -> ui-v362.css -> ui-v363.css -> ui-v366.css -> ui-v369.css -> ui-v372.css -> ui-v377.css -> ui-v378.css -> ui-v379.css -> ui-v380.css -> ui-v382.css -> ui-v383.css -> ui-v3841.css -> ui-v3876.css -> ui-v397.css -> ui-v398.css -> ui-v402.css -> ui-v403.css -> ui-v4432.css
 */

/* --- styles.css --- */
/* Polices locales Fontsource 5.3.0, licence SIL OFL 1.1 dans assets/fonts.
   Deux sous-ensembles evitent tout appel a Google tout en couvrant les noms
   et adresses europeens saisis dans e-LAB. */
@font-face{font-family:'Inter';font-style:normal;font-display:swap;font-weight:100 900;
  src:url('/assets/fonts/inter-latin-wght-normal.woff2?v=0.282.0') format('woff2');
  unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}
@font-face{font-family:'Inter';font-style:normal;font-display:swap;font-weight:100 900;
  src:url('/assets/fonts/inter-latin-ext-wght-normal.woff2?v=0.282.0') format('woff2');
  unicode-range:U+0100-02BA,U+02BD-02C5,U+02C7-02CC,U+02CE-02D7,U+02DD-02FF,U+0304,U+0308,U+0329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF}
@font-face{font-family:'JetBrains Mono';font-style:normal;font-display:swap;font-weight:100 800;
  src:url('/assets/fonts/jetbrains-mono-latin-wght-normal.woff2?v=0.282.0') format('woff2');
  unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}
@font-face{font-family:'JetBrains Mono';font-style:normal;font-display:swap;font-weight:100 800;
  src:url('/assets/fonts/jetbrains-mono-latin-ext-wght-normal.woff2?v=0.282.0') format('woff2');
  unicode-range:U+0100-02BA,U+02BD-02C5,U+02C7-02CC,U+02CE-02D7,U+02DD-02FF,U+0304,U+0308,U+0329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF}

/* e-LAB v0.1.0 - charte validee (POC v8) : sombre par defaut, clair derive */
:root{color-scheme:dark;--bg:#0D1117;--surface:#151B23;--surface2:#1C242E;--raise:#212B37;--line:#232D39;--line2:#2D3947;--text:#E8EEF4;--muted:#8B99A8;--faint:#5B6875;--accent:#2BD9C7;--accent2:#19B3A6;--accent-glow:rgba(43,217,199,.14);--on-accent:#06312C;--violet:#8B7CF6;--amber:#F5B94A;--blue:#5EA2F7;--rouge:#F26D6D;--nav-bg:#10161D;--nav-bg2:#0D1117;--nav-text:#8B99A8;--nav-on:#E8EEF4;--nav-line:rgba(255,255,255,.05);--r:14px;--r-sm:9px;}
/* ===== FORET (defaut, charte e-LAB : sapin, creme, fil dore) ===== */
html[data-theme="light"]{color-scheme:light;--bg:#F4F1EA;--surface:#FFFFFF;--surface2:#EFEBE1;--raise:#FFFFFF;--line:#E5E0D3;--line2:#D2CBB9;--text:#1C2B24;--muted:#506159;--faint:#6F7E76;--accent:#2E7D5B;--accent2:#1E5C42;--accent-glow:rgba(46,125,91,.11);--on-accent:#FFFFFF;--violet:#7A6BD9;--amber:#B8860B;--blue:#2D7DD2;--rouge:#C0392B;--nav-bg:#1B3A2E;--nav-bg2:#122A20;--nav-text:#AFC4B6;--nav-on:#FFFFFF;--nav-line:rgba(255,255,255,.08);}
*{box-sizing:border-box;margin:0;padding:0}
[hidden]{display:none!important}
html{background:var(--bg)}
body{font-family:'Inter',-apple-system,sans-serif;background:
  radial-gradient(1200px 500px at 85% -10%,var(--accent-glow),transparent 60%),var(--bg);
  color:var(--text);min-height:100vh}
input,select,textarea,button{font:inherit;color:var(--text)}
.wordmark{font-weight:800;font-size:20px;letter-spacing:-.03em}
.wordmark span{color:var(--accent)}
.wordmark.big{font-size:30px;text-align:center}

/* ---- login ---- */
.login-wrap{min-height:100vh;display:flex;align-items:center;justify-content:center;padding:20px}
.login-card{background:var(--surface);border:1px solid var(--line);border-radius:var(--r);
  padding:34px 30px;width:100%;max-width:380px}
.login-sub{text-align:center;color:var(--muted);font-size:13px;margin:6px 0 24px}
.login-card label{display:block;font-size:11px;font-weight:700;text-transform:uppercase;
  letter-spacing:.08em;color:var(--faint);margin-bottom:14px}
.login-card input{display:block;width:100%;margin-top:6px;font-size:14px;
  background:var(--surface2);border:1px solid var(--line2);border-radius:var(--r-sm);
  padding:11px 12px;outline:none}
.login-card input:focus{border-color:var(--accent)}
.login-err{color:var(--rouge);font-size:12.5px;margin-bottom:12px}
.mfa-card{max-width:430px}
.mfa-title{text-align:center;font-size:18px;margin:10px 0 12px}
.mfa-text{font-size:12.5px;line-height:1.55;color:var(--muted);margin-bottom:10px}
.mfa-qr{display:flex;justify-content:center;margin:12px 0}
.mfa-qr img{width:196px;height:196px;image-rendering:pixelated;background:#fff;padding:6px;border-radius:10px}
.mfa-manual{font-size:11.5px;color:var(--muted);margin:8px 0 5px}
.mfa-secret,.mfa-codes{font-family:'JetBrains Mono',ui-monospace,monospace;background:var(--surface2);border:1px solid var(--line2);border-radius:10px;padding:10px 12px;word-break:break-all;text-align:center;color:var(--text)}
.mfa-codes{text-align:left;line-height:1.65;margin:10px 0;user-select:all;white-space:pre-wrap}
.mfa-card .btn.wide{width:100%;margin:6px 0}
.mfa-card .newbtn.wide{margin-top:8px}
/* ==================================================================
   v0.256.0 — UNE SEULE REGLE POUR TOUS LES BOUTONS
   Jacob : « une fois rond, une fois carre arrondi, une fois plus grand,
   une fois sans cadre ». C'etait exact : .newbtn etait une pilule,
   .btn un carre arrondi, .bsm2 un 8 px, et il y avait trois hauteurs.
   LA REGLE, desormais appliquee partout :
     forme   : PILULE (99px) pour toute commande cliquable ;
     hauteur : 36px en taille normale, 28px en petite ;
     primaire   = fond accent, AUCUNE bordure ;
     secondaire = fond surface + bordure 1px.
   Les definitions sont modifiees A LA SOURCE et non recouvertes par une
   surcouche : une surcouche aurait ajoute un quatrieme comportement au
   lieu d'en retirer trois.
   ================================================================== */
.newbtn{border:none;font-size:13px;font-weight:700;border-radius:99px;
  height:36px;padding:0 20px;cursor:pointer;color:var(--on-accent);
  display:inline-flex;align-items:center;justify-content:center;gap:6px;
  box-sizing:border-box;white-space:nowrap;
  background:linear-gradient(135deg,var(--accent),var(--accent2))}
.newbtn:hover{filter:brightness(1.1)}
/* v0.176.2 : un bouton porte par un <a>. Sans ca il est SOULIGNE (defaut
   du lien) et il se pose sur la ligne de base du texte au lieu du centre
   de la barre - d'ou le « Le classeur » plus haut que les onglets. */
a.newbtn,.newbtn.lnk{text-decoration:none;display:inline-flex;align-items:center;
  line-height:1;box-sizing:border-box}
.newbtn.wide{width:100%;margin-top:6px}
.linkbtn{display:block;width:100%;border:none;background:none;color:var(--muted);
  font-size:12.5px;margin-top:14px;cursor:pointer;text-align:center}
.linkbtn:hover{color:var(--accent)}

/* ---- shell app ---- */
.app-wrap{display:flex;height:100vh;overflow:hidden}
.support-session-banner{position:fixed;z-index:10020;top:0;left:236px;right:0;
  min-height:34px;padding:7px 18px;display:flex;align-items:center;justify-content:center;
  gap:14px;flex-wrap:wrap;background:#8f2d2d;color:#fff;border-bottom:1px solid #6f2020;
  box-shadow:0 3px 14px rgba(0,0,0,.22);font-size:12.5px}
.support-session-banner[hidden]{display:none!important}
.support-session-banner b{font-size:13px}.support-session-banner span{opacity:.9}
body.support-session-active main{padding-top:52px}
@media(max-width:700px){.support-session-banner{left:0}.support-session-banner span{display:none}
  body.support-session-active main{padding-top:48px}}
nav{width:236px;flex:none;display:flex;flex-direction:column;padding:22px 0;border-right:1px solid var(--nav-line);background:linear-gradient(178deg,var(--nav-bg) 0%,var(--nav-bg2) 100%);}
nav .wordmark{padding:0 18px 0;color:#fff;display:flex;align-items:center;gap:9px}
nav .wordmark::before{content:'';display:inline-block;flex:none;background:url('/assets/logo.png?v=0.282.0') center/contain no-repeat;}
nav .tagline{padding:0 22px 20px;font-weight:800;color:var(--or);text-transform:uppercase;}
.login-logo{display:block;margin:0 auto 12px;}
nav .wordmark span{color:var(--or)}
nav a{display:flex;align-items:center;gap:11px;padding:9px 22px;margin:1px 10px;
  font-size:13.5px;font-weight:500;color:var(--nav-text);cursor:pointer;border-radius:10px;
  text-decoration:none}
nav a:hover{color:var(--nav-on);background:rgba(255,255,255,.06)}
nav a.on{color:var(--nav-on);background:rgba(255,255,255,.10);box-shadow:inset 3px 0 0 var(--or)}
nav a.on .ic{color:currentColor}
/* ---------- menu en groupes (v0.167.0) ----------
   Accordeon plutot que menu volant : pas de survol, pas de calcul de
   position, ca marche au doigt comme a la souris. */
nav a[data-g] .chev{margin-left:auto;font-size:15px;color:var(--faint);
  transition:transform .15s ease;display:inline-block}
nav a[data-g].open .chev{transform:rotate(90deg)}
nav a[data-g] .n + .chev{margin-left:7px}
/* Le parent du groupe OUVERT reste marque, sans voler l'etat « on » a
   l'ecran courant : sinon deux entrees paraissent actives. */
nav a[data-g].cur{color:var(--nav-on)}
nav a[data-g].cur .ic{color:currentColor}
nav .sub{display:none}
nav .sub.open{display:block}
nav .sub a{padding-left:38px;font-size:13px;margin-top:0;margin-bottom:0}
nav .sub a .ic{font-size:12.5px;width:14px}
nav .sub a.on{box-shadow:inset 3px 0 0 var(--or)}
nav a .ic{width:18px;height:18px;flex:none;color:var(--faint);fill:none;
  stroke:currentColor;stroke-width:1.8;stroke-linecap:round;stroke-linejoin:round}
nav a .n{margin-left:auto;font-family:'JetBrains Mono',monospace;font-size:10.5px;
  background:var(--accent);color:var(--on-accent);border-radius:99px;padding:2px 8px;font-weight:700}
nav a .n:empty{display:none}
nav a .n.alert{background:var(--rouge);color:#fff}
/* Une pastille est un compteur fixe, pas une carte interactive : aucune
   translation au survol, y compris dans le groupe Financier. */
nav a .n,nav a .n:hover{transform:none!important;transition:none!important}
nav .sep{height:1px;background:var(--line);margin:14px 22px}
nav .user{margin-top:auto;padding:14px 22px;font-size:12px;color:var(--faint);line-height:1.5}
nav .user b{color:var(--muted);font-weight:600}
main{flex:1;min-width:0;padding:0 30px 26px;max-width:1600px;height:100vh;overflow-y:auto}

/* Navigation clavier visible et coherente sur les controles principaux. */
:where(a,button,input,select,textarea,[role="button"]):focus-visible{
  outline:3px solid color-mix(in srgb,var(--accent) 72%,white 28%);
  outline-offset:2px
}
:where(input[type="checkbox"],input[type="radio"]){accent-color:var(--accent)}
/* Une case ne change que si l'on clique sur son carré. Cela évite de
   cocher/décocher accidentellement en cliquant dans toute la ligne. */
label:has(> input[type="checkbox"]){pointer-events:none;cursor:default}
label:has(> input[type="checkbox"])>input[type="checkbox"]{pointer-events:auto;cursor:pointer}
:where(label:has(> input[type="radio"])){cursor:pointer}
nav a:focus-visible{color:var(--nav-on);background:rgba(255,255,255,.1)}

/* ---- liste travaux ---- */
.page-head{display:flex;align-items:center;gap:14px;padding-top:22px;margin-bottom:16px;}
/* v0.296.0 - EN-TETE FIGE (demande de Jacob, 07/08).
   `main` defile (height:100vh;overflow-y:auto) : `position:sticky` s'y
   accroche sans JavaScript. Le fond est OPAQUE, sinon les lignes de la
   liste defileraient VISIBLEMENT derriere le titre.
   Le padding lateral negatif compense celui de `main` : sans lui, une
   bande de 30 px resterait transparente de chaque cote. */
/* v0.297.0 - LE FOND ETAIT PERCE. Jacob voyait les lignes defiler
   DERRIERE l'en-tete fige. `--bg` est bien opaque, mais le bloc ne
   couvrait pas la bande de 22 px que `.page-head` reserve AU-DESSUS de
   lui (`padding-top`) : cette bande restait transparente et laissait
   passer la liste. On remonte donc le fond de 24 px avec une marge
   negative compensee par le padding. */
/* v0.306.0 - LE MASQUE PAR LE HAUT, SANS DEPLACER LA MISE EN PAGE.
   Jacob a trouve empiriquement que `top:-25px` masque enfin les lignes
   qui passent derriere - mais ca DECALE le bloc et l'ecran des achats ne
   s'aligne plus sur celui des ventes. Il avait raison sur le diagnostic,
   pas sur le remede : il existe donc bien une bande au-dessus du bloc
   figé par laquelle la liste se voit.
   On la peint avec un pseudo-element qui suit le bloc SANS occuper de
   place - `position:absolute` le sort du flux, et un element `sticky`
   est positionne, donc il lui sert de reference. La mise en page ne
   bouge pas d'un pixel, et rien ne passe plus par-dessus. */
.stick{position:sticky;top:0;z-index:40;background:var(--bg);
  margin:0 -30px;padding:2px 30px 12px;isolation:isolate;
  box-shadow:0 10px 16px -12px rgba(0,0,0,.5)}
.stick::before{content:'';position:absolute;left:0;right:0;top:-40px;height:40px;
  background:var(--bg);pointer-events:none}
/* ============================================================
   v0.329.0 — CES REGLES ECRASENT `.stick`, DONC ELLES VIENNENT APRES
   ============================================================
   Je les avais ecrites AVANT. A specificite egale, c'est la DERNIERE
   qui gagne : `.stick` reprenait la main sur les quatre, et aucune des
   trois corrections de la 0.328.0 ne s'appliquait. C'est la meme erreur
   que Jacob avait trouvee lui-meme sur `theme-v273.css` cet apres-midi.
   Une seule cause pour les trois defauts qu'il voit encore :

   `top`      `.stick{top:0}` gagnait -> le SECOND bloc se collait tout
              en haut, au-dessus du premier. C'est l'en-tete de colonnes
              qui apparaissait AU-DESSUS des filtres.
   `z-index`  les deux a 40 -> le second, plus bas dans le code, peignait
              par-dessus le premier.
   `margin`   le debordement de 30 px revenait -> barre de defilement
              horizontale, et tuiles decalees de 30 px.
   `::before` la bande opaque de 40 px revenait -> bas des tuiles rogne.
   ============================================================ */
.stick-a{z-index:41}
.stick-b{top:var(--stickA,0px);z-index:39}
.stick-a,.stick-b{margin-left:0;margin-right:0;padding-left:0;padding-right:0}
.stick-b::before{display:none}
/* v0.303.0 - MEME HAUTEUR QU'EN VENTES.
   L'ecran des ventes utilise `.fact-top{padding:2px 0 12px}` avec une
   `.page-head` a `padding-top:22px`. Les Achats avaient 14 px : les deux
   ecrans ne demarraient pas a la meme hauteur et le basculement d'un
   onglet a l'autre faisait sauter toute la page. On aligne. */
.stick .page-head{padding-top:22px;margin-bottom:12px}
/* La ligne d'en-tete de colonnes. Elle reprend EXACTEMENT la grille de
   `.wrow` - c'est l'appelant qui pose `grid-template-columns`, sinon les
   deux divergeraient au premier changement de largeur. */
/* v0.305.0 - LE FOND PROPRE DE LA ZONE FIGEE.
   Jacob voyait encore des lignes derriere l'en-tete. `.whead` n'avait
   PAS de fond a lui : il comptait sur celui de `.stick`, et le moindre
   ecart de boite laissait passer la liste. Chaque element de la zone
   figee porte desormais son propre fond opaque - on ne compte plus sur
   un fond herite pour masquer du contenu qui defile. */
/* v0.325.0 — L'EN-TETE N'A JAMAIS PU TOMBER EN FACE DES CHAMPS.
   Jacob : « aligne dans vente les titres des colonnes avec les champs ».
   Trois ecarts, pas un :
     gap            en-tete 12 px  ·  ligne 14 px
     padding gauche en-tete 14 px  ·  ligne 0
     padding droite en-tete 14 px  ·  ligne 16 px
   Plus le BORD de 1 px que la ligne porte et que l'en-tete n'a pas.
   Les colonnes derivaient donc de plus en plus vers la droite au fil
   de la ligne — d'ou l'ecart croissant de sa capture.
   L'en-tete reprend le gap de la ligne et compense son bord :
   1 px a gauche (0 + bord), 17 px a droite (16 + bord). */
.whead{background:var(--bg);display:grid;align-items:end;gap:14px;
  padding:7px 17px 7px 1px;
  font-size:10.5px;letter-spacing:.05em;text-transform:uppercase;font-weight:700;
  color:var(--faint);border-bottom:1px solid var(--line)}
@media (max-width:900px){.stick{margin:0 -14px;padding:0 14px}}
.page-head h1{font-size:21px;font-weight:700;letter-spacing:-.02em}
.page-head .spacer{flex:1}
.search{font-size:13.5px;padding:9px 16px;border:1px solid var(--line2);
  border-radius:99px;outline:none;background:var(--surface);width:250px}
.search::placeholder{color:var(--faint)}
.search:focus{border-color:var(--accent)}
.tabs{display:flex;gap:6px;margin-bottom:16px;flex-wrap:wrap}
/* v0.258.0 : les onglets aussi, meme hauteur. */
.tabs button{border:1px solid var(--line2);background:var(--surface);font-size:12.5px;
  font-weight:600;color:var(--muted);padding:0 15px;cursor:pointer;border-radius:99px;
  height:36px;box-sizing:border-box;display:inline-flex;align-items:center;gap:7px}
.tabs button:hover{color:var(--text);border-color:var(--faint)}
.tabs button.on{color:var(--on-accent);background:var(--accent);border-color:var(--accent)}
.tabs button .n{font-family:'JetBrains Mono',monospace;font-size:11px;margin-left:6px;opacity:.75}
.wlist{display:flex;flex-direction:column;gap:5px}
.wrow{display:grid;grid-template-columns:4px 96px 1.15fr 1fr 92px 64px;
  gap:14px;align-items:center;background:var(--surface);border:1px solid var(--line);
  border-radius:var(--r);padding:5px 16px 5px 0;cursor:pointer;
  transition:border-color .12s,transform .12s}
.wrow:hover{border-color:var(--accent);transform:translateY(-1px)}
.wrow .bar{align-self:stretch;border-radius:99px}
.wrow .num{font-family:'JetBrains Mono',monospace;font-size:12px;font-weight:600;color:var(--muted)}
.wrow .cl b{display:block;font-size:13.5px;font-weight:600}
.wrow .cl span,.wrow .pt span{font-size:11.5px;color:var(--muted)}
.wrow .cl .cid{font-family:'JetBrains Mono',monospace;font-size:10.5px;color:var(--faint);margin-right:5px}
.wrow .pt b{display:block;font-size:13px;font-weight:500}
.wrow .days{font-family:'JetBrains Mono',monospace;font-size:12px;font-weight:700;color:var(--accent);text-align:right}
.badge{font-size:10.5px;font-weight:700;border-radius:99px;padding:5px 11px;text-align:center}
.badge.devis{background:rgba(139,124,246,.15);color:var(--violet)}
.badge.en_cours{background:rgba(46,160,110,.14);color:var(--accent)}
.badge.fini{background:rgba(245,185,74,.14);color:var(--amber)}
.badge.releve{background:rgba(94,162,247,.14);color:var(--blue)}
.badge.facture{background:var(--surface2);color:var(--muted)}
.factbadge{font-size:13px;font-weight:800;border-radius:99px;padding:6px 14px;background:var(--accent);color:var(--on-accent);border:none;cursor:pointer;letter-spacing:.01em}
.factbadge:hover{opacity:.9}
.ppenv-badge{font-size:11px;font-weight:800;border-radius:99px;padding:5px 12px;letter-spacing:.02em}
.ppenv-acc{background:rgba(245,185,74,.16);color:var(--amber)}
.ppenv-prod{background:rgba(46,160,110,.16);color:var(--accent)}
.badge.annule{background:rgba(242,109,109,.12);color:var(--rouge)}
.placeholder{background:var(--surface);border:1px dashed var(--line2);border-radius:var(--r);
  padding:64px 20px;text-align:center;color:var(--muted);font-size:14px}

/* ---- modale nouveau travail ---- */
/* v0.201.0 : les fenetres sont CENTREES. Elles etaient calees en haut
   avec « align-items:flex-start » et une marge de 8vh - reglage qui
   tombe juste sur une fenetre haute et laisse une petite fiche flotter
   dans le tiers superieur.
   Le fond defile (overflow-y:auto) et la fenetre est plafonnee a 90vh :
   une fenetre plus haute que l'ecran reste entierement atteignable, ce
   qu'un simple centrage ne garantit pas. */
.modal-bg{position:fixed;inset:0;background:rgba(6,9,13,.7);z-index:100;
  display:flex;align-items:center;justify-content:center;padding:4vh 14px;
  overflow-y:auto;backdrop-filter:blur(3px)}
.modal{background:var(--surface);border:1px solid var(--line2);border-radius:var(--r);
  width:100%;max-width:440px;padding:22px;max-height:92vh;overflow-y:auto;
  margin:auto;position:relative}
.modal h3{font-size:15px;font-weight:700;margin-bottom:16px}
.modal > h3:first-child,.modal > .modal-x + h3{
  font-size:17px;line-height:1.3;letter-spacing:-.01em
}
.modal > .modal-x + h3{padding-right:36px}
.modal-head{display:flex;align-items:flex-start;justify-content:space-between;gap:18px;
  margin-bottom:16px;padding-right:2px}
.modal-head h3{margin:0 0 4px;font-size:17px;letter-spacing:-.01em}
.modal-head p{font-size:12.5px;line-height:1.45;color:var(--muted);margin:0}
.modal-head .modal-x{position:static;flex:none;margin:-4px -4px 0 0}
.modal label{display:block;font-size:10.5px;font-weight:700;text-transform:uppercase;
  letter-spacing:.08em;color:var(--faint);margin-bottom:12px}
.modal input,.modal select{display:block;width:100%;margin-top:5px;font-size:13.5px;
  background:var(--surface2);border:1px solid var(--line2);border-radius:var(--r-sm);
  padding:9px 11px;outline:none}
.modal input:focus,.modal select:focus{border-color:var(--accent)}
.modal .row{display:flex;gap:10px;justify-content:flex-end;margin-top:8px}
/* Controles compacts : la regle generique des champs ne doit jamais
   transformer une case en champ pleine largeur ni decaler son libelle. */
.modal input[type="checkbox"],.modal input[type="radio"]{
  display:inline-block;flex:none;width:17px;height:17px;margin:0;padding:0;
  background:transparent;border:1px solid var(--line2);accent-color:var(--accent);
  cursor:pointer
}
.modal label:has(> input[type="checkbox"]),
.modal label:has(> input[type="radio"]){
  display:flex;align-items:center;gap:9px;text-transform:none;letter-spacing:normal;
  font-size:12.5px;font-weight:600;color:var(--text);cursor:pointer
}
/* Un label utilise comme bouton fichier reste un bouton. Les anciennes
   regles de label en capitales ne doivent plus gagner sur le composant. */
.modal label.btn,.modal label.newbtn{
  display:inline-flex;align-items:center;justify-content:center;width:auto;
  margin:0;text-transform:none;letter-spacing:normal;font-size:12.5px;color:var(--text)
}
.modal label.newbtn{color:var(--on-accent)}
.modal-actions{display:flex;align-items:center;justify-content:flex-end;gap:9px;
  margin-top:16px;padding-top:16px;border-top:1px solid var(--line)}
/* Les anciennes fenetres utilisent encore .row pour leur pied. On leur
   applique le meme composant uniquement lorsque la derniere ligne contient
   de vrais boutons : les lignes de formulaire internes restent intactes. */
.modal > .row:last-child:has(> button),
.modal > form > .row:last-child:has(> button){
  margin-top:18px;padding-top:16px;border-top:1px solid var(--line);
  align-items:center;justify-content:flex-end;flex-wrap:wrap
}
.modal > .row:last-child:has(> button) > .btn,
.modal > .row:last-child:has(> button) > .newbtn,
.modal > form > .row:last-child:has(> button) > .btn,
.modal > form > .row:last-child:has(> button) > .newbtn{min-width:96px}
.btn{border:1px solid var(--line2);background:var(--surface2);font-size:12.5px;
  font-weight:600;border-radius:99px;height:36px;padding:0 15px;cursor:pointer;
  display:inline-flex;align-items:center;justify-content:center;gap:6px;
  box-sizing:border-box;line-height:1;white-space:nowrap}
.btn:hover{border-color:var(--accent);color:var(--accent)}
.btn:disabled,.newbtn:disabled,button:disabled{
  opacity:.46;cursor:not-allowed;filter:none;box-shadow:none
}
.btn:disabled:hover,.newbtn:disabled:hover,button:disabled:hover{
  border-color:var(--line2);color:inherit;filter:none
}
.btn.danger:hover{color:var(--rouge);border-color:var(--rouge);}
.btn.accent{color:var(--accent);border-color:var(--accent)}
.btn.warn{color:var(--amber)}
.topbar .btn,.topbar .newbtn{height:36px;padding:0 15px;display:inline-flex;align-items:center;justify-content:center;box-sizing:border-box;font-size:12.5px}
.toolbtn.danger{color:var(--rouge);border-color:var(--rouge)}

@media (max-width:880px){
  nav{width:58px}
  nav .wordmark{padding:0 0 22px;text-align:center;font-size:15px}
  nav a{padding:10px 0;justify-content:center;margin:1px 8px}
  nav a .txt,nav a .n,nav .user{display:none}
  /* v0.143.6 : en menu reduit (58px), le padding-left de 140px pousserait
     la version HORS de l'ecran, et le nom du labo n'a plus la place de
     s'afficher. Les deux disparaissent - le logo suffit a identifier. */
  nav #appVer,nav .sb-lab{display:none}
  main{padding:16px 12px}
  .wrow{grid-template-columns:4px 1fr 92px;grid-template-areas:"bar cl badge" "bar pt days"}
  .wrow .bar{grid-area:bar}.wrow .cl{grid-area:cl}.wrow .pt{grid-area:pt}
  .wrow .num{display:none}
  .wrow .badge{grid-area:badge}.wrow .days{grid-area:days}
}

/* ===== v0.3.0 : editeur bon de travail ===== */
.back{border:none;background:none;font-size:13px;font-weight:600;color:var(--accent);cursor:pointer;padding:4px 0;margin-bottom:10px}
.back:hover{text-decoration:underline}
.topbar{display:flex;align-items:center;gap:12px;margin-bottom:14px;flex-wrap:wrap}
.wo-ref{font-family:'JetBrains Mono',monospace;font-size:13px;background:var(--surface2);border:1px solid var(--line2);border-radius:99px;padding:5px 14px;font-weight:600}
.wtype{display:inline-flex;align-items:center;gap:7px;font-size:12px;font-weight:600;color:var(--muted)}
.wtype i{width:8px;height:8px;border-radius:99px;display:inline-block;box-shadow:0 0 8px currentColor}
.status-group{display:flex;border:1px solid var(--line2);border-radius:99px;overflow:hidden;background:var(--surface)}
.status-group button{border:none;background:none;font-size:12px;font-weight:600;padding:8px 15px;cursor:pointer;color:var(--muted)}
.status-group button.on{color:var(--on-accent);background:var(--accent)}
.status-group button.on.devis{background:var(--violet);color:#fff}
.status-group button.on.fini{background:var(--amber);color:#3A2A05}
.act{border:none;font-size:12.5px;font-weight:700;border-radius:99px;padding:9px 17px;cursor:pointer;display:none}
.act.show{display:inline-block}
.act.releve{background:rgba(94,162,247,.16);color:var(--blue);border:1px solid rgba(94,162,247,.4)}
.act.direct{background:linear-gradient(135deg,var(--accent),var(--accent2));color:var(--on-accent)}
.card{background:var(--surface);border:1px solid var(--line);border-radius:var(--r);padding:18px;margin-bottom:16px}
.card h2{font-size:11px;font-weight:700;text-transform:uppercase;letter-spacing:.1em;color:var(--muted);margin-bottom:6px}
/* v0.18.6 : l'ancienne grille 4 colonnes de la carte etranglait le headwrap
   (cause des 3 versions 'foireuses') - la carte redevient un simple bloc. */
.wo-card{display:block}
.f label{display:block;font-size:10px;font-weight:700;text-transform:uppercase;letter-spacing:.08em;color:var(--faint);margin-bottom:5px}
.f input,.f select{font-size:13.5px;width:100%;border:1px solid var(--line2);background:var(--surface2);border-radius:var(--r-sm);padding:8px 10px;outline:none}
.f input:focus,.f select:focus{border-color:var(--accent)}
.wo-card .row2{grid-column:1/-1;display:flex;gap:16px;align-items:center;flex-wrap:wrap;padding-top:4px}
.chip{display:inline-flex;align-items:center;background:var(--surface2);color:var(--accent);border:1px solid var(--line2);border-radius:99px;padding:3px 11px;font-weight:600;font-family:'JetBrains Mono',monospace;font-size:11px}
/* v0.309.0 : la bande .work-terms et son .standby n'existent plus. Leurs
   trois informations sont passees DANS les blocs du bandeau — remise et
   TVA sous le client, duree sous les dates. Les deux lignes ci-dessous
   se lisent, elles ne se saisissent pas : ni fond, ni cadre au survol,
   sinon elles se font passer pour des champs. */
.head4 .hz-rt,.head4 .hz-dur{background:none;border-color:transparent;gap:7px;padding:2px 0}
.head4 .hz-rt:hover,.head4 .hz-dur:hover{border-color:transparent}
.head4 .hz-rt .rt-v{font-family:'JetBrains Mono',monospace;font-size:13px;
  font-weight:600;color:var(--accent)}
.head4 .hz-rt .rt-sep{color:var(--faint);font-size:12px}
.head4 .hz-dur b{font-family:'JetBrains Mono',monospace;font-size:14.5px;color:var(--accent)}
.acte-vat-grid{display:grid;grid-template-columns:1fr 2fr .8fr .7fr;gap:0 12px;margin-top:8px}
@media (max-width:600px){.acte-vat-grid{grid-template-columns:1fr 1fr}}
.dtabs{display:flex;gap:6px;margin-bottom:14px}
.dtabs button{border:1px solid var(--line2);background:var(--surface);font-size:12.5px;font-weight:700;color:var(--muted);padding:8px 18px;cursor:pointer;border-radius:99px}
.dtabs button.on{color:var(--on-accent);background:var(--accent);border-color:var(--accent)}
/* v0.215.0 — « Le classeur » DOIT ressembler a « Registre », pas a un gros
   bouton d'action. Il portait .newbtn : police 13, remplissage 11/20, degrade,
   et surtout AUCUN nowrap - avec l'icone en svg{width:100%} a cote, le texte
   passait a la ligne et le bouton doublait de hauteur. Les valeurs ci-dessous
   sont celles de .dtabs button.on, a l'identique. */
.bookbtn{display:inline-flex;align-items:center;gap:7px;white-space:nowrap;
  text-decoration:none;font-size:12.5px;font-weight:700;padding:8px 18px;
  border-radius:99px;border:1px solid var(--accent);cursor:pointer;
  color:var(--on-accent);background:var(--accent);box-sizing:border-box}
.bookbtn:hover{filter:brightness(1.08)}
.bookbtn .bico{width:15px;height:15px;flex:none}
.hint{font-size:12px;color:var(--muted);margin-bottom:10px}
/* v0.317.0 : le bandeau des exceptions Peppol, dans l'ecran Achats. Il ne
   parait que s'il y a quelque chose a dire. */
.ach-exc{display:flex;align-items:center;gap:12px;width:100%;text-align:left;
  margin:0 0 10px;padding:9px 13px;font:inherit;font-size:12.5px;cursor:pointer;
  background:var(--surface2);border:1px solid var(--line2);
  border-left:3px solid var(--rouge);border-radius:var(--r-sm);color:var(--muted)}
.ach-exc:hover{border-color:var(--accent);border-left-color:var(--rouge)}
.ach-exc b{color:var(--rouge)}
/* v0.321.0 : les en-tetes de colonne triables. La fleche dit TOUJOURS ou
   on en est — une colonne triable sans marqueur oblige a cliquer pour
   savoir ce qui se passe. */
.th-tri{display:inline-flex;align-items:center;gap:4px;cursor:pointer;
  user-select:none;border-radius:5px;padding:1px 4px;margin:-1px -4px}
.th-tri:hover{color:var(--accent);background:var(--surface2)}
.th-tri i{font-style:normal;font-size:10px;opacity:.35;line-height:1}
.th-tri.on{color:var(--accent);font-weight:700}
.th-tri.on i{opacity:1}
/* v0.321.0 : l'icone de tuile. Elle se pose en filigrane a droite du
   pave — elle habille, elle ne dispute pas la lecture au chiffre, qui
   reste ce qu'on vient chercher. */
.fin-kpi{position:relative}
/* v0.323.0 — LA PASTILLE RONDE REVIENT, sur maquette de Jacob.
   ELLE AVAIT ETE RETIREE EN 0.263.0, a sa demande, pour recuperer de
   la place : « pas de pastille ronde a cote du libelle, c'est elle qui
   mange la largeur ». Il la redemande apres l'avoir vue sur sa propre
   maquette — c'est son ecran, et l'essai statique lui a permis de
   juger sur piece. Mais la raison d'alors reste vraie : SOUS 1200 px
   LA PASTILLE DISPARAIT et le chiffre garde toute la largeur. C'est
   le chiffre qu'on vient chercher.

   Aucun changement de gabarit : l'icone et les trois elements de
   texte restent freres dans le HTML, la grille les range. Toucher au
   gabarit pour une question d'apparence, c'est ce qui a casse la
   grille du portail cet apres-midi. */
.fin-kpi{display:grid;grid-template-columns:auto minmax(0,1fr);
  column-gap:13px;align-items:center;position:relative}
.fin-kpi>span,.fin-kpi>b,.fin-kpi>i{grid-column:2;min-width:0}
.kpi-ico{grid-column:1;grid-row:1/-1;width:36px;height:36px;padding:8px;
  border-radius:50%;background:var(--accent-glow);color:var(--accent);
  fill:none;stroke:currentColor;stroke-width:1.8;stroke-linecap:round;
  stroke-linejoin:round;pointer-events:none;box-sizing:content-box}
.fin-kpi.late .kpi-ico{background:rgba(192,57,43,.11);color:var(--rouge)}
@media (max-width:1200px){.kpi-ico{display:none}
  .fin-kpi{grid-template-columns:minmax(0,1fr)}
  .fin-kpi>span,.fin-kpi>b,.fin-kpi>i{grid-column:1}}
/* Cinq tuiles quand le resume les fournit. */
.fin-kpis.five{grid-template-columns:repeat(5,minmax(0,1fr))}
@media (max-width:1400px){.fin-kpis.five{grid-template-columns:repeat(3,minmax(0,1fr))}}
@media (max-width:900px){.fin-kpis.five{grid-template-columns:repeat(2,minmax(0,1fr))}}
/* v0.323.0 : la barre de filtres devient une CARTE. Elle flottait sur
   le fond et ses trois zones — recherche, statuts, periode — se
   confondaient. */
.fact-bar,.ach-bar{background:var(--surface);border:1px solid var(--line);
  border-radius:var(--r);padding:11px 13px}
/* v0.319.0 : le bandeau des doublons, et la marque sur la ligne. */
.ach-dup{border-left-color:var(--amber)}
.ach-dup b{color:var(--amber)}
.ach-dup.on{border-color:var(--amber);background:var(--surface2)}
.prow.is-dup{box-shadow:inset 3px 0 0 var(--amber)}
/* v0.319.0 : la barre du cycle Peppol. `wait` = on ne connait pas encore
   la quantite de travail : la barre respire au lieu de mentir a 0 %. */
.ach-cycle{display:flex;align-items:center;gap:12px;margin:0 0 10px;
  font-size:12.5px;color:var(--muted)}
.acy-bar{flex:1;height:5px;border-radius:99px;background:var(--line2);overflow:hidden}
.acy-bar i{display:block;height:100%;width:2%;border-radius:99px;
  background:var(--accent);transition:width .35s ease}
.acy-bar i.wait{animation:acyPulse 1.1s ease-in-out infinite}
@keyframes acyPulse{0%,100%{opacity:.35}50%{opacity:1}}
.ach-exc i{font-style:normal;margin-left:auto;color:var(--accent);font-weight:600}
/* v0.316.0 — LE CHAMP DE DATE DES FILTRES, sur le modele de la fiche de
   travail : un champ de texte a frappe libre, et une icone pour ceux qui
   preferent le calendrier. Le selecteur natif est present mais invisible :
   c'est lui qu'ouvre l'icone. */
.dtf{position:relative;display:inline-flex;align-items:center}
/* v0.316.2 — CORRECTIF D'ASPECT (Jacob) : « ton icone est colle, pas
   besoin de gras ». Le champ etait en JetBrains Mono, qui se lit plus
   epais que le reste de la barre, et l'icone tenait a 2 px du bord
   alors qu'un champ natif la pose a une dizaine. On reprend la police
   et la taille de `.ginput` — comme les champs de dates des Releves,
   que Jacob donne pour reference — et on rend son air a l'icone. */
.dtf-i{width:150px;text-align:left;padding-right:34px;font:inherit;font-size:13px}
/* v0.316.1 — CORRECTIF. J'AI REUTILISE DEUX MORCEAUX SANS LEUR STYLE.
   `calBtn()` rend un SVG SANS width ni height : sa taille venait
   entierement de `.hz .calbtn svg` et `.head4 .calbtn svg`. Hors de ces
   deux contextes, un SVG qui n'a qu'un viewBox prend TOUTE la place de
   son conteneur — d'ou les deux calendriers geants sur l'ecran des
   ventes. Et `.dpick`, le selecteur natif cache, n'etait masque que par
   `.hz .dpick` : hors de `.hz`, il s'affichait en entier.

   LES DEUX REGLES CI-DESSOUS SONT DE BASE, sans contexte : elles valent
   partout ou ces morceaux seront reutilises. Les regles existantes,
   plus specifiques, continuent de les surcharger. C'est la meme famille
   que les classes CSS inventees du lot Smilo n 4 : du code valide, une
   page cassee, et rien dans mes controles pour le voir — aucun d'eux ne
   calcule une mise en page. */
.calbtn{border:none;background:none;cursor:pointer;color:var(--muted);
  display:inline-flex;align-items:center;padding:0}
.calbtn:hover{color:var(--accent)}
.calbtn svg{width:15px;height:15px;flex:none}
.dpick{position:absolute;width:1px;height:1px;opacity:0;pointer-events:none;
  border:0;padding:0;margin:0}
.dtf .calbtn{position:absolute;right:10px;top:50%;transform:translateY(-50%)}
.dtf .dpick{right:8px;bottom:0}
/* v0.316.0 — LE BOUTON « Choisir un fichier » ETAIT ROGNE A GAUCHE.
   La regle qui habille TOUS les champs pose un border-radius de 10 px sans
   rembourrage ; le bouton natif du navigateur commence donc colle au bord
   et le coin arrondi lui mange le cote gauche. Vu par Jacob dans Societe,
   et c'etait partout — console SA comprise. */
input[type="file"]{padding:7px 9px;line-height:1.35;max-width:100%}
/* v0.312.0 — Origine : les deux boutons cote a cote, pas empiles. */
.ach-orig{font-size:11px;display:flex;gap:6px;align-items:center;justify-content:center;
  flex-wrap:wrap}
.ach-orig .btn{white-space:nowrap}
/* Le separateur d'annee dans la liste des factures. Un trait franc, pas
   une nuance : c'est un repere qu'on cherche en faisant defiler. */
.inv-year{display:flex;align-items:baseline;gap:10px;margin:16px 2px 6px;
  padding-bottom:5px;border-bottom:2px solid var(--accent)}
.inv-year b{font-family:'JetBrains Mono',monospace;font-size:15px;color:var(--accent);
  letter-spacing:.04em}
.inv-year span{font-size:11.5px;color:var(--muted)}
.inv-year:first-child{margin-top:2px}
/* Le choix de l'annee de facturation : deux pavés, celui en cours marque. */
.iy-list{display:flex;gap:10px;flex-wrap:wrap}
.iy-opt{flex:1 1 190px;text-align:left;border:1px solid var(--line2);border-radius:10px;
  background:var(--surface2);padding:11px 13px;cursor:pointer;font:inherit;
  display:flex;flex-direction:column;gap:3px}
.iy-opt:hover:not(:disabled){border-color:var(--accent)}
.iy-opt:disabled{opacity:.55;cursor:default}
.iy-opt b{font-family:'JetBrains Mono',monospace;font-size:17px;color:var(--text)}
.iy-opt span{font-size:11.5px;color:var(--muted)}
.iy-opt i{font-style:normal;font-size:10.5px;font-weight:700;color:var(--accent);
  text-transform:uppercase;letter-spacing:.06em}
.iy-opt.on{border-color:var(--accent);background:var(--accent-glow)}
/* v0.310.0 : .notice etait employee a TROIS endroits de app.js (le
   compte-rendu de releve, l'avertissement de quarantaine, et desormais
   celui de l'annee de facturation) sans exister nulle part pour
   l'application : elle n'est definie que sous .elab-admin, la console SA.
   Ces blocs sortaient donc sans fond ni marge interieure. Meme famille
   que --card : une classe posee, jamais definie. */
.notice{font-size:12.5px;color:var(--muted);background:var(--surface2);
  border:1px solid var(--line2);border-radius:var(--r-sm);padding:10px 12px;
  line-height:1.55}
/* Le pied de la liste des recues : combien, et ou on en est. */
.pin-pager{display:flex;align-items:center;gap:10px;flex-wrap:wrap;
  margin:12px 2px 4px;font-size:12.5px;color:var(--muted)}
.pin-pager .spacer{flex:1}
.pin-pg{font-family:'JetBrains Mono',monospace;font-size:12px;color:var(--text)}
/* L'annee de facturation dans l'entete. En ambre quand il y a une
   decision a prendre — jamais en rouge : rien n'est casse, on attend
   seulement que le laboratoire ait fini de facturer l'annee d'avant. */
.hint kbd{font-family:'JetBrains Mono',monospace;font-size:10.5px;background:var(--surface2);border:1px solid var(--line2);border-radius:5px;padding:1px 6px}
svg{display:block;width:100%;height:auto;user-select:none}
/* v0.252.2 — UN SVG QUI PORTE SA TAILLE LA GARDE.
   La regle ci-dessus est necessaire aux grands schemas (arcades,
   graphiques) qui doivent remplir leur conteneur. Mais elle BAT LES
   ATTRIBUTS HTML : une icone ecrite <svg width="15" height="15"> se
   retrouvait etiree a la taille de son bouton — 192 px de haut sur la
   capture de Jacob, a cote d'une voisine de 15 px.
   `width:auto` rend la main aux attributs, et le selecteur d'attribut
   (0,2,1) l'emporte sur le selecteur d'element (0,0,1). Une seule
   regle repare TOUTES les icones du produit, pas les trois de cet
   ecran — le defaut etait general, il ne s'etait vu que la. */
svg[width][height]{display:inline-block;width:auto;height:auto;flex:none}

/* ==================================================================
   v0.253.0 — ECRAN TARIFS : LES QUATRE LANGUES ET LES DIX NIVEAUX
   Quatre colonnes de libelle et dix de prix ne tiennent pas ensemble.
   On montre UNE langue (boutons FR/NL/EN/DE) et CINQ niveaux, avec des
   fleches pour faire glisser la fenetre.
   ================================================================== */
/* Les colonnes de niveau : etroites et en chasse fixe, pour que les
   montants s'alignent a la virgule d'une ligne a l'autre. */
.tplan-h{text-align:center;padding:6px 6px;font-size:10px;text-transform:uppercase;
  letter-spacing:.06em;color:var(--faint);border-bottom:1px solid var(--line);
  white-space:nowrap}
.tplan-c{padding:3px 4px;border-bottom:1px solid var(--line);text-align:right}
.tplan-in{width:72px;padding:3px 6px;border:1px solid transparent;border-radius:6px;
  background:none;color:var(--text);font-family:'JetBrains Mono',monospace;
  font-size:12px;text-align:right}
.tplan-in:hover{border-color:var(--line2)}
.tplan-in:focus{border-color:var(--accent);background:var(--surface);outline:none}
/* Un enregistrement reussi se voit une seconde, puis s'efface : une
   confirmation permanente sur trente lignes serait du bruit. */
.tplan-in.ok{background:rgba(46,139,87,.14)}
.tplan-in.ko{border-color:var(--rouge);background:rgba(192,57,43,.10)}
.tplan-a{border:1px solid var(--accent);background:var(--accent);color:var(--on-accent);
  border-radius:6px;width:18px;height:18px;line-height:1;cursor:pointer;
  font-size:13px;font-weight:800;padding:0;margin:0 4px;vertical-align:middle}
.tplan-a:hover{background:var(--accent);color:#fff}
.tva-inline{min-width:72px;height:30px;padding:2px 20px 2px 7px;border:1px solid var(--line2);
  border-radius:7px;background:var(--surface);color:var(--text);font:inherit;cursor:pointer}
.tva-inline:hover,.tva-inline:focus{border-color:var(--accent);outline:none}
.tva-inline.ok{background:rgba(46,139,87,.14)}
.tva-inline.ko{border-color:var(--rouge);background:rgba(192,57,43,.10)}
.te-add-actions{display:flex;gap:7px;align-items:center;flex-wrap:wrap}
/* v0.253.1 : le nom du niveau EN ENTIER. « T1 » ne disait rien — Jacob :
   « c'est quoi le T ? ». Deux lignes dans une colonne etroite valent
   mieux qu'une abreviation que personne ne decode. */
/* v0.263.0 — LES QUATRE CHIFFRES ET LA PAGINATION DES TARIFS. */
/* La rangee passe a trois colonnes quand la carte « sans tarif »
   disparait — sinon un vide s'ouvrirait a droite. */
.tk-row{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:10px;margin:10px 0 12px}
.tk-row.tk3{grid-template-columns:repeat(3,minmax(0,1fr))}
/* v0.263.0 : dans les Parametres, la rangee suit l'onglet — elle porte le
   meme data-gs que les blocs, donc elle se masque avec eux. */
.tk-row.gset[hidden]{display:none}
/* Le numero de section, devant le titre. Il donne un ORDRE de lecture a
   une page longue : on sait ou l'on en est. */
.gnum{font-style:normal;display:inline-flex;align-items:center;justify-content:center;
  width:22px;height:22px;border-radius:99px;background:var(--accent-glow);
  color:var(--accent2);font-size:12px;font-weight:800;margin-right:8px;
  vertical-align:-3px}
.tk{background:var(--surface2);border:1px solid var(--line);border-radius:12px;
  padding:9px 13px;display:flex;flex-direction:column;gap:1px;text-align:left}
.tk b{font-size:21px;font-weight:700;line-height:1.15}
.tk span{font-size:11px;color:var(--muted)}
/* Seule la carte cliquable se signale comme telle. */
.tk-cliq{cursor:pointer;font:inherit}
.tk-cliq:hover{border-color:var(--accent)}
.tk-cliq.on{border-color:var(--accent);background:var(--accent-glow)}
@media(max-width:820px){.tk-row{grid-template-columns:1fr 1fr}}
/* L'en-tete groupe : une rangee au-dessus des niveaux de tarif. */
.sa-table tr.tgrp th{padding:4px 6px 2px;font-size:10px;text-transform:uppercase;
  letter-spacing:.06em;color:var(--faint);text-align:center;font-weight:700;
  border-bottom:none}
/* v0.267.0 — LA PAGINATION RESTE VISIBLE.
   Jacob : « impossible de travailler ». Sur vingt lignes il faut
   descendre au bout pour changer de page, puis remonter : a chaque
   page. Elle colle donc au BAS du conteneur qui defile.
   Fond opaque, et une bordure haute plutot qu'une ombre — l'ombre
   d'une barre basse se projette vers le bas, ou personne ne la voit. */
.tpg{position:static;z-index:8;display:flex;align-items:center;gap:8px;
  padding:9px 6px;flex-wrap:wrap;background:var(--surface);
  border-top:1px solid var(--line);margin:0 -12px -12px;
  border-radius:0 0 12px 12px}
.tpg-n{font-size:12px;color:var(--muted)}
.tpg-p{font-size:12.5px;font-weight:700;min-width:56px;text-align:center}
.tplan-n{display:inline-block;line-height:1.15;text-align:center}
.tplan-n i{display:block;font-style:normal;font-size:8.5px;opacity:.75}

/* ---- LA BULLE DES QUATRE LANGUES (idee reprise d'EASYLab) ----
   Le libelle courant reste lisible ; le bouton porte le nombre de
   langues remplies, et l'ouvre sur les quatre a la fois. */
.tlbl-c{padding:5px 10px;border-bottom:1px solid var(--line);white-space:nowrap}
.tlbl-t{display:inline-block;max-width:270px;overflow:hidden;text-overflow:ellipsis;
  vertical-align:middle}
/* v0.255.2 — LES DRAPEAUX ONT LEUR PROPRE COLONNE.
   Colles a la fin du libelle, ils flottaient a une abscisse differente
   sur chaque ligne : illisibles, et impossibles a balayer des yeux.
   Ils occupent maintenant une colonne fixe entre LIBELLE et DEPARTEMENT,
   en carre de deux sur deux et nettement plus grands. */
.tlbl-b{border:1px solid var(--line2);background:var(--surface);border-radius:7px;
  padding:3px;cursor:pointer;display:inline-grid;grid-template-columns:repeat(2,1fr);
  gap:2px;line-height:0;vertical-align:middle}
.tlbl-b:hover{border-color:var(--accent)}
/* position:relative EST INDISPENSABLE : le drapeau anglais est dessine
   avec ::before et ::after en position:absolute; inset:0. Sans ancrage
   ici, ils se calent sur la PAGE et couvrent tout l'ecran d'une immense
   croix rouge - c'est exactement ce qui est arrive en 0.255.0. */
.tlbl-fm{position:relative;width:17px;height:12px;border-radius:2px;
  border:.5px solid rgba(0,0,0,.22);overflow:hidden;display:block}
/* Une langue vide : le drapeau s'efface presque, mais reste a sa place -
   les quatre gardent le meme ordre d'une ligne a l'autre. */
.tlbl-fm.vide{opacity:.22;filter:grayscale(1)}
/* v0.262.0 : la colonne CODE respire un peu plus (les codes a six
   caracteres se cassaient sur deux lignes), et la colonne PORTAIL rend
   ce qu'elle prend — son bouton fait 70 px, elle en occupait 140. */
.sa-table .acte-row > td:first-child{min-width:96px;white-space:nowrap}
.sa-table th:first-child{min-width:96px}
.sa-table .acte-row > td:nth-last-child(3){width:1%;white-space:nowrap;
  padding-left:4px;padding-right:4px}
.lang-c{padding:4px 10px;border-bottom:1px solid var(--line);width:1%;
  white-space:nowrap;text-align:center}
.tlbl-pop{position:fixed;z-index:300;width:480px;background:var(--surface);
  border:1px solid var(--line2);border-radius:11px;padding:9px;
  box-shadow:0 14px 34px rgba(0,0,0,.18)}
.tlbl-h{font-family:'JetBrains Mono',monospace;font-size:11px;font-weight:700;
  color:var(--accent);margin:0 0 6px 2px}
.tlbl-r{display:flex;align-items:center;gap:7px;margin-bottom:5px}
.tlbl-k{font-size:9.5px;font-weight:800;color:var(--faint);width:18px;flex:none;
  letter-spacing:.03em}
.tlbl-r input{flex:1;min-width:0;margin:0;padding:4px 7px;font-size:12.5px;
  border:1px solid var(--line2);border-radius:7px;background:var(--surface2);
  color:var(--text)}
.tlbl-r input:focus{border-color:var(--accent);outline:none}
.tlbl-r input.ok{background:rgba(46,139,87,.14)}
.tlbl-r input.ko{border-color:var(--rouge)}
/* Les drapeaux sont dessines en CSS : aucune image a charger, et ils
   s'affichent pareil sous Windows, ou les emojis de drapeau ne sont pas
   rendus. Le code de langue reste ecrit a cote : un drapeau simplifie ne
   doit jamais etre la SEULE facon de savoir quelle langue on remplit. */
.tlbl-f{position:relative;width:22px;height:15px;border-radius:3px;flex:none;
  border:1px solid rgba(0,0,0,.18);overflow:hidden}
.tlbl-f::after{position:absolute;left:0;right:0;bottom:-14px;font-size:8px;
  font-weight:800;color:var(--muted);text-align:center}
.fl-fr{background:linear-gradient(90deg,#00267f 33.3%,#fff 33.3% 66.6%,#f31830 66.6%)}
.fl-nl{background:linear-gradient(180deg,#ae1c28 33.3%,#fff 33.3% 66.6%,#21468b 66.6%)}
.fl-de{background:linear-gradient(180deg,#000 33.3%,#dd0000 33.3% 66.6%,#ffce00 66.6%)}
/* v0.259.0 : LE VRAI UNION JACK. Jacob : « c'est pas le drapeau
   anglais ». Il avait raison : ma version n'avait que la croix droite,
   ce qui donne le drapeau de l'ANGLETERRE, pas celui du Royaume-Uni.
   Il manquait les DIAGONALES — la croix de Saint-Andre blanche et
   celle de Saint-Patrick rouge. Elles se font en degrades a 45 degres,
   poses sous la croix droite qui les recouvre au centre.
   L'ordre des couches compte : diagonales d'abord, croix ensuite. */
.fl-en{background:#012169}
.fl-en::before{content:'';position:absolute;inset:0;
  background:
    linear-gradient(45deg,transparent 43%,#c8102e 43% 57%,transparent 57%),
    linear-gradient(-45deg,transparent 43%,#c8102e 43% 57%,transparent 57%),
    linear-gradient(45deg,transparent 36%,#fff 36% 64%,transparent 64%),
    linear-gradient(-45deg,transparent 36%,#fff 36% 64%,transparent 64%)}
.fl-en::after{content:'';position:absolute;inset:0;
  background:
    linear-gradient(180deg,transparent 36%,#c8102e 36% 64%,transparent 64%),
    linear-gradient(90deg,transparent 36%,#c8102e 36% 64%,transparent 64%),
    linear-gradient(180deg,transparent 28%,#fff 28% 72%,transparent 72%),
    linear-gradient(90deg,transparent 28%,#fff 28% 72%,transparent 72%)}

/* v0.253.1 — LARGEURS DE COLONNES (capture de Jacob).
   « Taux 1 » se cassait en deux lignes et « 5.Gouttieres/Positionneur »
   aussi ; l'ecart entre le code et le libelle etait trop grand. */
.sa-table td.tva-c,.sa-table th.tva-h{white-space:nowrap;min-width:64px}
.sa-table td.dept-c{min-width:150px}
.acte-row > td:first-child{padding-right:4px}

/* v0.254.0 — L'OEIL DES CHAMPS DE MOT DE PASSE.
   L'oeil est DESSINE en CSS, pas un emoji : sous Windows les emojis
   d'oeil sont rendus en couleur et de travers selon la police. La barre
   oblique apparait quand le mot de passe est visible - l'icone dit donc
   l'ETAT, pas seulement l'action. */
.pw-wrap{position:relative;display:block}
.pw-wrap input{width:100%;padding-right:38px}
.pw-eye{position:absolute;right:6px;top:50%;transform:translateY(-50%);
  width:28px;height:26px;border:none;background:none;cursor:pointer;padding:0}
.pw-eye::before{content:'';position:absolute;left:5px;top:8px;width:18px;height:10px;
  border:1.6px solid var(--muted);border-radius:10px 10px 10px 10px/14px 14px 14px 14px}
.pw-eye::after{content:'';position:absolute;left:11px;top:11px;width:6px;height:6px;
  border-radius:50%;background:var(--muted)}
.pw-eye:hover::before{border-color:var(--accent)}
.pw-eye:hover::after{background:var(--accent)}
.pw-eye.on::before{border-color:var(--accent)}
.pw-eye.on::after{background:var(--accent)}
/* La barre oblique du mode « visible ». */
.pw-eye.on{background:linear-gradient(45deg,transparent 46%,var(--accent) 46% 54%,transparent 54%)}
.odo{max-width:620px;margin:0 auto}
.arch-label{font-family:'JetBrains Mono',monospace;font-size:10px;font-weight:600;letter-spacing:.14em;color:var(--faint);text-align:center;text-transform:uppercase}
.tooth{cursor:pointer;outline:none}
.tooth .crown{fill:var(--surface2);stroke:var(--line2);stroke-width:1.3;transition:fill .12s,stroke .12s}
.tooth .fdi{font-family:'JetBrains Mono',monospace;font-size:9.5px;font-weight:500;fill:var(--muted);text-anchor:middle;pointer-events:none}
.tooth:hover .crown{stroke:var(--accent);fill:var(--accent-glow)}
.tooth:focus-visible .crown{stroke:var(--accent);stroke-width:2.2}
.tooth.sel .crown{fill:var(--accent);stroke:var(--accent);filter:drop-shadow(0 0 6px var(--accent-glow))}
.tooth.sel .fdi{fill:var(--on-accent);font-weight:700}
.tooth.pending .crown{fill:var(--accent-glow);stroke:var(--accent);stroke-dasharray:4 3}
.tooth .dot{fill:#fff;stroke:var(--accent);stroke-width:1.2;opacity:0}
.tooth.noted .dot{opacity:1}
.midline{stroke:var(--line2);stroke-dasharray:3 5;stroke-width:1}
.vmid{stroke:var(--line2);stroke-dasharray:3 5;stroke-width:1}
.panel-title{display:flex;align-items:baseline;justify-content:space-between;margin-bottom:8px;gap:10px;flex-wrap:wrap}
.panel-title .actions{display:flex;gap:8px;align-items:center}
.panel-title.actbar{align-items:center;justify-content:flex-start;gap:10px}
.panel-title.actbar .actions{margin-left:auto;flex-wrap:wrap;justify-content:flex-end}
.panel-title.actbar .wo-ref-edit{margin:0}
.count{font-family:'JetBrains Mono',monospace;font-size:11.5px;color:var(--accent);background:var(--accent-glow);border-radius:99px;padding:3px 10px;font-weight:700}
.te-head,.te-row{display:grid;align-items:center;}
.te-head{text-transform:uppercase;padding:0 0 4px;border-bottom:1px solid var(--line);}
.te-row{border-bottom:1px solid var(--line);position:relative;}
.te-row:last-child{border-bottom:none}
.te-row.dragging{opacity:.35}
.te-row.drop-above{box-shadow:0 -2px 0 0 var(--accent)}
.te-row.drop-below{box-shadow:0 2px 0 0 var(--accent)}
.grip{cursor:grab;color:var(--faint);font-size:13px;text-align:center;user-select:none;padding:6px 0;border-radius:6px}
.grip:hover{color:var(--accent);background:var(--accent-glow)}
.te-row input,.te-row select,.te-row .ro{border:none;border-bottom:1.5px solid transparent;background:transparent;outline:none;min-width:0;width:100%;color:var(--text);}
.te-row input:hover{border-bottom-color:var(--line2)}
.te-row input:focus,.te-row select:focus{border-bottom-color:var(--accent)}
.te-row input::placeholder{color:var(--faint)}
.code-in{font-family:'JetBrains Mono',monospace;font-weight:700;font-size:12px;text-transform:uppercase;color:var(--accent)}
.dent-in{font-family:'JetBrains Mono',monospace;font-weight:700;font-size:12px;text-align:center}
.dent-in.filled{background:var(--accent);color:var(--on-accent);border-radius:var(--r-sm)}
.num{text-align:right;font-family:'JetBrains Mono',monospace;font-size:12px}
.ro{color:var(--muted);text-align:right;font-family:'JetBrains Mono',monospace;font-size:12px}
.ro.total{color:var(--text);font-weight:700}
.tva-btn{border:none;background:var(--surface2);cursor:pointer;font-family:'JetBrains Mono',monospace;font-size:11px;font-weight:700;color:var(--muted);border-radius:99px;padding:4px 0;width:100%;text-align:center}
.tva-btn.t2{background:rgba(139,124,246,.16);color:var(--violet)}
.tech-sel{font-family:'JetBrains Mono',monospace;font-size:11.5px;text-align:center;appearance:none;-webkit-appearance:none;cursor:pointer;color:var(--muted);background:transparent}
.tech-sel.set{color:var(--accent);font-weight:700}
.done-btn{border:1.5px solid var(--line2);background:none;cursor:pointer;border-radius:6px;font-size:12px;color:transparent;justify-self:center;padding:0;}
.done-btn:hover{border-color:var(--accent)}
.done-btn.on{background:var(--accent);border-color:var(--accent);color:var(--on-accent)}
.tdel{border:none;background:none;cursor:pointer;color:var(--faint);font-size:15px;padding:5px;border-radius:var(--r-sm);justify-self:center}
.tdel:hover{color:var(--rouge);background:rgba(242,109,109,.12)}
.lot-btn{background:none;cursor:pointer;justify-self:center;font-family:'JetBrains Mono',monospace;font-size:10px;font-weight:700;color:var(--faint);border:1px dashed var(--line2);border-radius:99px;padding:4px 5px}
.lot-btn:hover{border-color:var(--or,#E5B558);color:var(--or,#E5B558)}
.lot-btn.has{background:rgba(229,181,88,.13);border:1px solid var(--or,#E5B558);color:var(--or,#E5B558)}
.te-row.entry{background:linear-gradient(90deg,var(--accent-glow) 0,transparent 60%);border-left:3px solid var(--accent);border-radius:var(--r-sm);padding-left:5px;margin-left:-8px;border-bottom:none;margin-top:6px}
.te-row.entry .ro{color:var(--faint)}
.lotpop{position:absolute;right:0;top:100%;z-index:40;background:var(--raise);border:1px solid var(--line2);border-radius:var(--r-sm);box-shadow:0 12px 34px rgba(0,0,0,.5)}
.lotpop h4{font-weight:700;text-transform:uppercase;margin-bottom:8px}
.lotpop label{display:flex;gap:9px;align-items:baseline;font-size:12.5px;padding:6px 4px;border-radius:6px;cursor:pointer}
.lotpop label:hover{background:var(--surface2)}
.lotpop .lc{font-family:'JetBrains Mono',monospace;font-weight:700;color:var(--or,#E5B558);min-width:92px}
.lotpop .exp{margin-left:auto;font-family:'JetBrains Mono',monospace;font-size:11px;color:var(--faint)}
.lotpop input{accent-color:var(--accent)}
.totals{display:flex;justify-content:flex-end;border-top:1px solid var(--line);flex-wrap:wrap;align-items:center;}
/* v0.20.2 : TVA eclatee par taux */
.tot .v.vsplit{font-size:12px;line-height:1.55;white-space:nowrap;margin:3px 0}
.tot.vatsplit{min-width:150px}
/* v0.20.2 : info interne (net sous-traitant) - ne s'imprime pas */
/* v0.207.0 — sous-traitance en liste : une ligne = une part du travail. */
/* v0.208.0 — implants en liste : une ligne = un composant pose. */
.improw{border:1px solid var(--line);border-radius:9px;padding:8px 9px;margin-bottom:8px;background:var(--surface2)}
.improw .ir-g{display:grid;grid-template-columns:repeat(4,1fr) auto;gap:6px;align-items:end}
.improw label{display:block;font-size:9px;font-weight:800;text-transform:uppercase;letter-spacing:.05em;color:var(--faint)}
.improw input{width:100%}
.improw textarea{width:100%;margin-top:6px;min-height:40px}
.improw .lnk-del{background:none;border:0;color:var(--faint);cursor:pointer;font-size:14px;padding:4px 6px;line-height:1;align-self:center}
.improw .lnk-del:hover{color:var(--rouge)}
/* v0.237.0 — la ligne de TITRE dans l'editeur de note. Un seul champ,
   sur toute la largeur, en gras et dans la couleur d'accent : c'est ce
   qu'elle sera a l'impression, autant le voir des la saisie. */
.te-row.te-title{grid-template-columns:22px 1fr 26px !important;
  border-top:1.5px solid var(--accent);background:var(--accent-glow)}
.te-title .ti-lib{font-weight:700;color:var(--accent);font-size:13px;
  background:none;border:none;outline:none;width:100%;padding:6px 4px;
  letter-spacing:.02em}
.te-title .ti-lib::placeholder{font-weight:500;color:var(--faint)}
.subrow{border:1px solid var(--line);border-radius:9px;padding:8px 9px;margin-bottom:8px;background:var(--surface2)}
.subrow.late{border-color:var(--rouge)}
/* v0.266.0 — LES CHAMPS DE LA SOUS-TRAITANCE N'AVAIENT AUCUN STYLE.
   Ni classe ginput, ni regle propre : ils sortaient bruts du
   navigateur, avec ses bordures et sa police, au milieu d'un ecran qui
   n'en a nulle part ailleurs. Meme defaut que les champs de date de la
   Facturation.
   On style par le CONTENEUR plutot que d'ajouter la classe sur chaque
   champ : la ligne en compte huit, et le prochain champ ajoute serait
   correct sans qu'on y pense. */
.subrow input,.subrow select{font-size:12.5px;background:var(--surface);
  border:1px solid var(--line2);border-radius:8px;padding:6px 9px;outline:none;
  min-width:0;width:100%;box-sizing:border-box;color:var(--text);font-family:inherit}
.subrow input:focus,.subrow select:focus{border-color:var(--accent)}
.subrow input[type="date"]{padding:5px 8px}
.subrow input::placeholder{color:var(--faint)}
.subrow input:disabled,.subrow select:disabled{opacity:.6;cursor:not-allowed}
.subrow .sr-l{display:grid;grid-template-columns:1.4fr 1fr 1fr .8fr;gap:6px}
.subrow .sr-r{display:grid;grid-template-columns:1fr 1fr 1fr auto;gap:6px;align-items:end;margin-top:6px}
.subrow .sr-r label{display:block;font-size:9px;font-weight:800;text-transform:uppercase;letter-spacing:.05em;color:var(--faint)}
.subrow .sub-date-wrap{position:relative;display:block;margin-top:2px}
.subrow .sub-date-wrap input{padding-right:55px;cursor:pointer}
.subrow .sub-date-wrap input::-webkit-calendar-picker-indicator{opacity:0;width:0;padding:0}
.subrow .sub-date-clear,.subrow .sub-date-pick{position:absolute;top:50%;transform:translateY(-50%);z-index:2;
  width:24px;height:24px;padding:0;border:0;border-radius:6px;background:var(--surface2);
  color:var(--muted);font:700 16px/24px inherit;cursor:pointer;text-align:center}
.subrow .sub-date-clear{right:29px}.subrow .sub-date-pick{right:3px;display:flex;align-items:center;justify-content:center}
.subrow .sub-date-pick svg{width:15px;height:15px}
.subrow .sub-date-clear:hover{background:var(--rouge);color:#fff}
.subrow .sub-date-pick:hover{background:var(--accent-glow);color:var(--accent)}
.subrow input,.subrow select{width:100%}
.subrow .lnk-del{background:none;border:0;color:var(--faint);cursor:pointer;font-size:14px;padding:4px 6px;line-height:1}
.subrow .lnk-del:hover{color:var(--rouge)}
.subrow .sr-act{margin-top:8px;display:flex;align-items:center;gap:10px;flex-wrap:wrap}
.subrow .sr-due{font-size:11px;color:var(--amber)}
.tot-info{margin-top:10px;padding-top:9px;border-top:1px dashed var(--line);text-align:right;font-size:12px;color:var(--muted);font-family:'JetBrains Mono',monospace}
.tot-info .si-lbl{display:inline-block;font-family:'Inter',sans-serif;font-size:9px;font-weight:800;text-transform:uppercase;letter-spacing:.06em;color:var(--faint);background:var(--surface2);border:1px solid var(--line);padding:2px 7px;border-radius:6px;margin-right:9px}
/* v0.20.2 : toast d'erreur (message date clair) */
.elab-toast{position:fixed;top:18px;left:50%;transform:translateX(-50%) translateY(-14px);z-index:9999;background:#C0392B;color:#fff;font-weight:700;font-size:13px;padding:10px 18px;border-radius:10px;box-shadow:0 8px 24px rgba(0,0,0,.22);opacity:0;pointer-events:none;transition:opacity .18s ease,transform .18s ease}
.elab-toast.show{opacity:1;transform:translateX(-50%) translateY(0)}
.tot{min-width:72px;text-align:right}
.tot.grand{padding-left:22px;margin-left:4px;border-left:1px solid var(--line)}
/* v0.20.1 fiche : colonne gauche alignee (calendrier = statut = pastilles) */
.wo-card .headleft .minical{width:100%;max-width:none}
.wo-card .hl-col{display:flex;flex-direction:row;flex-wrap:wrap;align-items:center;gap:7px;width:100%}
.wo-card .hl-col .st-sel{flex:0 0 auto;min-width:118px}
.wo-card .headleft .pastels.mini{display:grid;grid-template-columns:repeat(5,1fr);gap:5px;width:auto;justify-items:center}
/* v0.20.1 : point de clic visible sur la ligne d'ajout d'acte */
.te-row.entry .dent-in,.te-row.entry .code-in{border-bottom:1.5px dashed var(--line2);border-radius:0}
.te-row.entry .dent-in:focus,.te-row.entry .code-in:focus{border-bottom-color:var(--accent);border-bottom-style:solid}
/* v0.20.1 : date de sortie < date d'entree */
.hz.dt-bad{border-color:#C0392B!important;box-shadow:0 0 0 2px rgba(192,57,43,.22)!important;animation:dtShake .3s}
@keyframes dtShake{0%,100%{transform:translateX(0)}25%{transform:translateX(-3px)}75%{transform:translateX(3px)}}
/* v0.20.1 : editeur couleurs marqueur (Societe) */
.mk-c{box-sizing:border-box;width:30px;height:30px;flex:0 0 30px;border-radius:8px;
  cursor:pointer;background:none;border:1px solid var(--line2);padding:2px}
.mk-c::-webkit-color-swatch-wrapper{padding:0}
.mk-c::-webkit-color-swatch{border:0;border-radius:5px}
.mk-c::-moz-color-swatch{border:0;border-radius:5px}
.tot .l{font-size:9.5px;font-weight:700;text-transform:uppercase;letter-spacing:.07em;color:var(--faint)}
.tot .v{font-family:'JetBrains Mono',monospace;font-size:14px;font-weight:700;margin-top:3px}
.tot.grand .v{color:var(--accent);font-size:23px;line-height:1.1}
.tot input{font-family:'JetBrains Mono',monospace;font-size:13.5px;font-weight:700;width:54px;text-align:right;border:none;border-bottom:1.5px solid var(--line2);background:transparent;outline:none;padding:2px;color:var(--text)}
.tot input:focus{border-bottom-color:var(--accent)}
.summary{background:linear-gradient(160deg,var(--surface2),var(--surface));border:1px solid var(--line2);border-radius:var(--r);padding:18px;margin-bottom:16px}
.summary h2{color:var(--muted);font-size:10.5px;font-weight:700;text-transform:uppercase;letter-spacing:.1em;margin-bottom:9px;cursor:pointer;user-select:none}
/* v0.20.3 : tracabilite repliable */
.summary.collapsed{padding-bottom:14px}
.summary.collapsed h2{margin-bottom:0}
.summary.collapsed .sum-body{display:none}
.sum-caret{display:inline-block;font-size:9px;color:var(--accent);transition:transform .15s;margin-right:3px}
.summary:not(.collapsed) .sum-caret{transform:rotate(90deg)}
/* v0.20.3 : net labo (interne) en gras + surligne */
.net-hl{font-weight:800;background:#FBEE9E;color:#3a3a2a;padding:1px 7px;border-radius:5px}
.sline{display:flex;gap:12px;font-size:13px;line-height:1.6;padding:3px 0}
.sline .k{font-family:'JetBrains Mono',monospace;font-size:11px;color:var(--accent);font-weight:700;flex:none;width:42px;padding-top:2px}
.sline .v{flex:1}
.sline .v em{color:var(--faint);font-style:normal}
.sline .v b{color:var(--text)}
.sline .v .lot{color:var(--or,#E5B558);font-family:'JetBrains Mono',monospace;font-size:11.5px}
.ac{position:absolute;top:100%;left:64px;z-index:30;background:var(--raise);border:1px solid var(--line2);border-radius:var(--r-sm);box-shadow:0 12px 34px rgba(0,0,0,.5);max-height:240px;overflow-y:auto;min-width:360px;max-width:92%}
.ac div{padding:8px 12px;font-size:12.5px;cursor:pointer;display:flex;gap:10px;align-items:baseline}
.ac div:hover,.ac div.hl{background:var(--surface2)}
.ac .c{font-family:'JetBrains Mono',monospace;font-weight:700;color:var(--accent);min-width:62px}
.ac .p{margin-left:auto;font-family:'JetBrains Mono',monospace;font-size:11.5px;color:var(--muted);white-space:nowrap}
.ac .macro-tag,.macro-tag{font-size:9px;font-weight:800;background:rgba(139,124,246,.18);color:var(--violet);border-radius:4px;padding:2px 6px;letter-spacing:.06em}
.det .grp{border-bottom:1px solid var(--line);padding:11px 0}
.det .grp:last-child{border-bottom:none;padding-bottom:0}
.det h3{font-size:10px;font-weight:800;text-transform:uppercase;letter-spacing:.1em;color:var(--accent);margin-bottom:9px}
.det{max-width:none}
.det .fr{display:grid;grid-template-columns:90px 1fr;gap:6px 10px;align-items:center;font-size:12.5px;margin-bottom:7px}
.det .fr label{color:var(--muted);font-size:11.5px;font-weight:500}
.det .fr input,.det .fr select{font-size:12.5px;width:100%;border:1px solid var(--line2);border-radius:7px;background:var(--surface2);padding:6px 8px;outline:none}
.det .fr input:focus,.det .fr select:focus{border-color:var(--accent)}
.det textarea{width:100%;resize:vertical;min-height:48px;border:1px solid var(--line2);border-radius:var(--r-sm);padding:8px;background:var(--surface2);outline:none;font-size:12.5px;color:var(--text)}
.det textarea:focus{border-color:var(--accent)}
.det .toggles{display:grid;grid-template-columns:1fr 1fr;gap:7px 12px}
.det .tog{display:flex;align-items:center;gap:8px;font-size:12px;cursor:pointer}
.det .tog input{accent-color:var(--accent)}
.det .flags{display:flex;gap:8px;flex-wrap:wrap}
.flag{border:1px solid var(--line2);background:none;font-size:11.5px;font-weight:700;border-radius:99px;padding:6px 13px;cursor:pointer;color:var(--muted)}
.flag.on.rappel{background:rgba(242,109,109,.13);border-color:var(--rouge);color:var(--rouge)}
.flag.on.plainte{background:rgba(229,181,88,.13);border-color:var(--or,#E5B558);color:var(--or,#E5B558)}
:root{--or:#E5B558}
html[data-theme="light"]{--or:#B4842E}
@media (max-width:880px){
  .wo-card{grid-template-columns:1fr 1fr}
  .te-head{display:none}
  .te-head,.te-row{grid-template-columns:16px 58px minmax(100px,1fr) 36px 28px 22px;
    grid-template-areas:"grip code lib dent lot del" "grip qte pu rem tech done" "grip tva tva total total total"}
  .a-grip{grid-area:grip}.a-dent{grid-area:dent}.a-code{grid-area:code}
  .a-lib{grid-area:lib}.a-qte{grid-area:qte}.a-pu{grid-area:pu}.a-rem{grid-area:rem}
  .a-tva{grid-area:tva}.a-total{grid-area:total}.a-tech{grid-area:tech}
  .a-done{grid-area:done}.a-lot{grid-area:lot}.a-del{grid-area:del}
  .ac{left:8px;right:8px;min-width:0;max-width:none}
  .lotpop{right:8px}
}

/* ===== v0.5.2 : cartes + filtre type + autocomplete client ===== */
.cardgrid{display:grid;grid-template-columns:repeat(auto-fill,minmax(225px,1fr));gap:12px}
.wcard,.ccard{position:relative;background:var(--surface);border:1px solid var(--line);
  border-radius:var(--r);padding:14px 14px 12px;cursor:pointer;overflow:hidden;
  transition:border-color .12s,transform .12s}
.wcard:hover,.ccard:hover{border-color:var(--accent);transform:translateY(-2px)}
.wc-bar{position:absolute;top:0;left:0;right:0;height:4px}
.wcbar{position:absolute;left:0;top:0;bottom:0;width:5px;z-index:1}
.wl-table td.wlnum{position:relative;padding-left:16px}
.cbar{position:absolute;left:5px;top:6px;bottom:6px;width:5px;border-radius:3px}
.wc-top,.cc-top{display:flex;align-items:center;justify-content:space-between;gap:8px;margin:2px 0 8px}
.wc-top .num,.cc-top .num{font-family:'JetBrains Mono',monospace;font-size:11.5px;font-weight:600;color:var(--muted)}
.wc-patient,.cc-name{font-size:14.5px;font-weight:700;letter-spacing:-.01em;margin-bottom:3px;
  white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.wc-client,.cc-city{font-size:12px;color:var(--muted);margin-bottom:10px;
  white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.wc-client .cid{font-family:'JetBrains Mono',monospace;font-size:10.5px;color:var(--faint)}
.wc-foot,.cc-foot{display:flex;justify-content:space-between;gap:8px;font-size:11px;
  color:var(--faint);border-top:1px solid var(--line);padding-top:8px;flex-wrap:wrap}
.wc-foot .days{font-family:'JetBrains Mono',monospace;font-weight:700;color:var(--accent)}
.groupchip{font-size:10px;font-weight:700;background:rgba(139,124,246,.15);color:var(--violet);
  border-radius:99px;padding:3px 9px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:60%}
.client-groupchip{max-width:78%;border:0;font:inherit;font-size:10px;font-weight:700;cursor:pointer}
.client-groupchip:hover{filter:brightness(.94);box-shadow:0 0 0 1px rgba(139,124,246,.25)}
.client-searchbox{position:relative;width:min(290px,34vw)}
.client-searchbox .search{width:100%;padding-right:38px}
.client-searchbox button{position:absolute;right:7px;top:50%;transform:translateY(-50%);width:27px;height:27px;
  border:0;border-radius:50%;background:transparent;color:var(--muted);font-size:21px;line-height:1;cursor:pointer}
.client-searchbox button:hover{background:var(--surface2);color:var(--text)}
.typefilter{display:flex;gap:6px;margin-bottom:16px;flex-wrap:wrap}
/* v0.258.0 : LES SELECTEURS SEGMENTES PRENNENT LA HAUTEUR COMMUNE.
   Jacob : « il est plus haut que tous les autres ». Ce n'etait pas le
   bouton vert qui depassait — il fait 36px comme tous les boutons
   depuis la 0.256.0 — ce sont « Sortants | Entrants » et « Mois |
   Semaine » qui restaient a 29px. Trois hauteurs dans un bandeau, ca
   se voit meme sans les mesurer.
   Ils gardent leur role de SELECTEUR (fond clair, halo quand actif) :
   seule la hauteur s'aligne. */
.typefilter .tf{display:inline-flex;align-items:center;justify-content:center;gap:7px;
  border:1px solid var(--line2);box-sizing:border-box;height:36px;
  background:var(--surface);font-size:11.5px;font-weight:600;color:var(--muted);
  padding:0 14px;cursor:pointer;border-radius:99px}
.typefilter .tf i{width:8px;height:8px;border-radius:99px;display:inline-block}
.typefilter .tf:hover{color:var(--text);border-color:var(--faint)}
.typefilter .tf.on{color:var(--text);border-color:var(--accent);background:var(--accent-glow)}
/* v0.260.0 : les deux boutons de marqueur se distinguent des types —
   ce ne sont pas des categories mais des bascules, et ils se cumulent. */
.typefilter .tf-mk{font-weight:700;letter-spacing:.02em}
.typefilter .tf-mk.on{background:var(--accent);color:var(--on-accent);
  border-color:var(--accent)}
.ac-wrap{position:relative;display:block}
.client-ac{position:absolute;left:0;right:0;top:100%;margin-top:4px;z-index:40;background:var(--surface);
  border:1px solid var(--line2);border-radius:10px;max-height:280px;overflow-y:auto;
  box-shadow:0 10px 28px rgba(0,0,0,.16)}
.client-ac:empty{display:none}
.cac-item{display:flex;gap:10px;align-items:baseline;padding:8px 10px;font-size:13px;
  cursor:pointer;border-radius:8px;background:var(--surface2);margin-top:4px;
  border:1px solid var(--line)}
.cac-item:hover{border-color:var(--accent)}
.cac-item .c{font-family:'JetBrains Mono',monospace;font-weight:700;color:var(--accent);min-width:58px}
.cac-item .g{margin-left:auto;font-size:10px;font-weight:700;color:var(--violet);
  background:rgba(139,124,246,.15);border-radius:99px;padding:2px 8px}

/* 0.370.0 — utilitaires partages avec la console SA. La couche applicative
   les redefinit sous .elab-lab ; ici ils restent disponibles sur .elab-admin. */
.u-m-0{margin:0}.u-mb-6{margin-bottom:6px}.u-mb-8{margin-bottom:8px}
.u-mb-10{margin-bottom:10px}.u-mb-12{margin-bottom:12px}
.u-m-0-0-8{margin:0 0 8px}.u-m-0-0-10{margin:0 0 10px}.u-m-0-0-12{margin:0 0 12px}
.u-mt-6{margin-top:6px}.u-mt-8{margin-top:8px}.u-mt-10{margin-top:10px}
.u-mt-12{margin-top:12px}.u-mt-14{margin-top:14px}.u-grid-full{grid-column:1/-1}
.u-center{text-align:center}.u-pointer{cursor:pointer}.u-pad-8{padding:8px}
.u-small-muted{font-size:11px;color:var(--muted)}.u-faint{color:var(--faint)}
.u-text{color:var(--text)}.u-fs-9{font-size:9px}.u-fs-11{font-size:11px}.u-fs-12{font-size:12px}
.u-flex-gap-8-mt10{display:flex;gap:8px;margin-top:10px}
.u-flex-wrap-mb8{display:flex;gap:10px;flex-wrap:wrap;margin-bottom:8px}

/* ===== v0.6.0 ===== */
/* v0.267.0 — PLUS DE COLONNE VIDE.
   La grille etait a DEUX colonnes fixes. Or les cartes appartiennent a
   des ONGLETS differents : quand un onglet n'en montre qu'une, la
   seconde colonne reste vide et la carte s'arrete au milieu de
   l'ecran — c'est le trou que Jacob voit sur Affichage.
   `auto-fit` supprime les pistes vides : une carte seule prend toute
   la largeur, deux se partagent, et ca vaut pour tous les onglets
   sans qu'on ait a le regler onglet par onglet. */
.gestion-grid{display:grid;gap:14px;
  grid-template-columns:repeat(auto-fit,minmax(min(100%,440px),1fr))}
/* Paramètres > Affichage : apparence à gauche, bandeau à droite, puis les
   automatismes restent dans la colonne droite pour équilibrer la page. */
#main.settings-display{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));
  gap:14px;align-items:start}
#main.settings-display > .page-head,
#main.settings-display > .tk-row{grid-column:1/-1;margin-top:0;margin-bottom:0}
#main.settings-display > .card[data-gs="affichage"]{grid-column:1;margin-bottom:0!important}
#main.settings-display > .gestion-grid{display:contents}
#main.settings-display > .gestion-grid > .card[data-gs="affichage"]{
  grid-column:auto!important;margin:0}
#main.settings-display > .gestion-grid > .settings-autom{grid-column:2!important}
/* Bloc 3 : aucune emphase en gras. Les options ont toutes le même poids
   visuel, y compris les libellés des vues et de la charge planning. */
#main.settings-display .settings-autom,
#main.settings-display .settings-autom *{font-weight:400!important}
@media(max-width:1050px){#main.settings-display{grid-template-columns:1fr}
  #main.settings-display > .page-head,#main.settings-display > .tk-row{grid-column:1}
  #main.settings-display > .gestion-grid > .settings-autom{grid-column:1!important}}
/* v0.268.0 : les cartes ne s'alignent plus sur la plus haute. Quatorze
   departements etiraient « Coursiers », vide a cote. */
.gestion-grid > .card{align-self:start}
/* Huit lignes, puis on defile dans le bloc — meme regle que l'Accueil.
   Une hauteur en lignes et non en vh : deux listes cote a cote doivent
   en montrer autant l'une que l'autre. */
.parlist{max-height:calc(8 * 39px);overflow-y:auto;margin:0 -4px;padding:0 4px}
/* v0.268.0 : la navigation par jour de l'Accueil. */
.day-nav{display:flex;align-items:center;gap:5px;flex-wrap:wrap}
.day-nav .ginput{width:auto}
.day-nav .btn{padding:0 10px;min-width:32px;justify-content:center}
#homeGrid{grid-template-columns:repeat(3,minmax(0,1fr))}
/* v0.267.1 — DOUZE LIGNES, PUIS UN ASCENSEUR DANS LE BLOC.
   Le bloc « en retard » comptait 271 lignes : il etirait toute la
   rangee, et « chez le sous-traitant » — vide — s'etirait avec lui.
   C'est pour ca qu'un bloc a zero ligne occupait un demi-ecran.
   Chaque liste defile maintenant chez elle, et les cartes ne
   s'alignent plus sur la plus haute : chacune prend sa taille. */
.home-card{min-width:0;align-self:start}
/* v0.267.1 : douze lignes exactement, puis on defile dans le bloc.
   « 40vh » variait avec la taille de l'ecran — deux blocs cote a cote
   n'affichaient donc pas le meme nombre de lignes, et on ne pouvait
   pas les comparer d'un coup d'oeil. */
.home-list{max-height:calc(12 * 28px);overflow-y:auto;overflow-x:hidden;
  margin-top:4px;padding-right:3px}
#homeGrid .dayrow{grid-template-columns:54px minmax(0,1fr) minmax(0,1fr) 60px minmax(0,92px);gap:5px;font-size:11px;padding:6px 5px}
#homeGrid .dayrow>span{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.home-list::-webkit-scrollbar{width:7px}
.home-list::-webkit-scrollbar-thumb{background:var(--line2);border-radius:6px}
@media (max-width:1300px){#homeGrid{grid-template-columns:1fr 1fr}}
@media (max-width:900px){#homeGrid{grid-template-columns:1fr}}
.ginput{font-size:13px;background:var(--surface2);border:1px solid var(--line2);border-radius:8px;padding:8px 10px;outline:none;min-width:0}
.ginput:focus{border-color:var(--accent)}
/* v0.156.2 — UN CHAMP VIDE DOIT SE VOIR. Aucune regle ::placeholder
   n'existait sur .ginput ni dans les fenetres : le navigateur posait sa
   couleur par defaut, assez sombre pour passer pour une valeur saisie.
   Jacob a demande, capture a l'appui, si les champs etaient « deja
   completes ». Ils etaient vides. Gris clair + italique : on ne peut
   plus confondre, et ca vaut pour toute l'application. */
.ginput::placeholder,
.modal input::placeholder,
.modal textarea::placeholder{color:var(--faint);font-style:italic}
/* v0.256.0 : SIX colonnes sur UNE ligne — deux dates, deux filtres, la
   recherche, le bouton. La recherche etait la plus large alors qu'elle
   sert le moins : elle passe en 1fr apres les filtres, qui prennent une
   largeur fixe suffisante pour leur plus long libelle. */
.browse-filters{display:grid;
  grid-template-columns:132px 132px 150px 130px minmax(180px,1fr) auto;
  gap:10px;align-items:end}
@media (max-width:1180px){.browse-filters{grid-template-columns:1fr 1fr 1fr 1fr}
  .browse-filters .bf-q{grid-column:1/4}}
.browse-filters label{display:block;font-size:10px;font-weight:700;text-transform:uppercase;letter-spacing:.07em;color:var(--faint)}
.browse-filters input,.browse-filters select{display:block;width:100%;margin-top:5px;font-size:13px;background:var(--surface2);border:1px solid var(--line2);border-radius:8px;padding:8px 10px;outline:none}
.browse-filters input:focus,.browse-filters select:focus{border-color:var(--accent)}
.browse-row{display:grid;grid-template-columns:26px 82px 1.2fr 1fr 1fr 82px 96px 90px;gap:8px;align-items:center;padding:7px 0;border-bottom:1px solid var(--line);font-size:13px}
.browse-row:last-of-type{border-bottom:none}
.browse-row input[type="checkbox"]{accent-color:var(--accent);width:15px;height:15px}
/* v0.263.0 — LA BARRE DE SELECTION, EN DEUX RANGEES NETTES.
   En flex avec retour a la ligne, le bouton « Facturer la selection »
   se retrouvait seul sous une phrase d'explication : on ne savait plus
   ce qui allait avec quoi. Une GRILLE la tient : les commandes a
   gauche, le total et le bouton a droite, et l'explication sur sa
   propre rangee, en dessous, ou elle ne pousse rien. */
/* v0.267.0 : la carte de filtres, barre de selection comprise, reste
   collee en haut. Fond opaque obligatoire — sinon les lignes de la
   liste defilent en transparence sous elle. */
.brz-fixe{position:sticky;top:0;z-index:20;background:var(--surface);
  isolation:isolate;box-shadow:0 -24px 0 var(--bg),0 8px 12px -8px rgba(0,0,0,.22)}
/* Dans la carte, la barre n'a plus besoin de sa marge du bas ni de son
   ombre : c'est la carte qui les porte. */
.brz-fixe .browse-actions{margin-top:10px;padding-top:10px;margin-bottom:0;
  box-shadow:none;background:none}
.browse-actions{display:grid;
  grid-template-columns:auto auto auto 1fr auto auto;
  gap:8px 14px;align-items:center;border-top:1px solid var(--line);
  margin-top:6px;padding-top:12px}
.browse-actions #bNoSel{grid-column:1/-1;grid-row:2;margin:0;line-height:1.35}
@media(max-width:1000px){.browse-actions{grid-template-columns:1fr 1fr}
  .browse-actions #bNoSel{grid-row:auto}}
@media (max-width:880px){
  .gestion-grid{grid-template-columns:1fr}
  .browse-filters{grid-template-columns:1fr 1fr}
  .browse-row{grid-template-columns:24px 1fr 1fr 80px;font-size:12px}
  .browse-row span:nth-child(4),.browse-row span:nth-child(5),.browse-row span:nth-child(6){display:none}
}

/* ===== v0.7.0 : statistiques ===== */
.statcards{display:grid;grid-template-columns:repeat(auto-fit,minmax(130px,1fr));gap:10px;margin-bottom:16px}
.statcard{background:var(--surface);border:1px solid var(--line);border-radius:var(--r);padding:14px;text-align:center}
.statcard .sc-n{font-size:22px;font-weight:700;color:var(--accent)}
.statcard .sc-l{font-size:10.5px;font-weight:700;text-transform:uppercase;letter-spacing:.06em;color:var(--faint);margin-top:4px}
/* v0.259.0 : la colonne des chiffres passe de 120 a 190 px. Jacob :
   « reduis la largeur du graphe pour ne pas avoir 2 lignes dans les
   infos ». C'est la BARRE qui doit ceder de la place, pas le chiffre :
   « 10 300,27 EUR - 178 trav. » ne tient pas en 120 px, et une barre
   un peu plus courte ne perd rien puisqu'elle est relative. */
/* La valeur prend uniquement sa largeur utile. Les anciennes colonnes fixes
   190 + 230 px ne laissaient que quelques pixels à la barre dans une carte
   en demi-largeur : elle ressemblait alors à un simple trait vertical. */
.statline{display:grid;grid-template-columns:minmax(150px,190px) minmax(80px,1fr) max-content;gap:10px;
  align-items:center;padding:5px 0;font-size:12.5px}
.statline .sl-label{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;color:var(--muted)}
.statline .sl-bar{background:var(--surface2);border-radius:99px;overflow:hidden}
/* v0.267.0 — DE LA COULEUR. Tout etait vert ou gris : sur huit lignes
   empilees, rien ne distingue la premiere de la derniere et l'oeil ne
   s'accroche nulle part. Chaque rang prend sa teinte, du plus fort au
   plus faible — la couleur porte alors le RANG, elle n'est pas
   decorative. */
.statline .sl-bar i{display:block;height:100%;border-radius:99px;
  background:var(--accent)}
.statline:nth-child(1) .sl-bar i{background:#2E7D5B}
.statline:nth-child(2) .sl-bar i{background:#4F9E7E}
.statline:nth-child(3) .sl-bar i{background:#5B7FD1}
.statline:nth-child(4) .sl-bar i{background:#7FBFA4}
.statline:nth-child(5) .sl-bar i{background:#E08A5B}
.statline:nth-child(6) .sl-bar i{background:#F5B94A}
.statline:nth-child(7) .sl-bar i{background:#9C7BB8}
.statline:nth-child(n+8) .sl-bar i{background:#8FA6B8}
/* La barre s'epaissit un peu : a 10 px, une teinte se distingue mal. */
.statline .sl-bar{height:12px}
.statline .sl-val{text-align:right;font-size:11.5px;font-weight:600;
  white-space:nowrap}
.st-year{width:auto}
.stat-wide{grid-column:1/-1}
.stat-client-search{position:relative;max-width:340px}
.stat-client-search .ginput{width:100%}
.stat-client-result{margin-top:10px}
.rolechip{font-size:10px;font-weight:800;border-radius:99px;padding:3px 10px}
.r-owner{background:var(--accent-glow);color:var(--accent)}
.r-admin{background:rgba(139,124,246,.16);color:var(--violet)}
.r-member{background:rgba(94,162,247,.15);color:var(--blue)}
.r-readonly{background:var(--surface);color:var(--muted);border:1px solid var(--line2)}
.linkbox{background:rgba(245,185,74,.09);border:1px solid var(--amber);border-radius:var(--r-sm);padding:12px}
.linkbox .lb-l{font-size:11.5px;color:var(--amber);font-weight:600;margin-bottom:7px}
.linkbox .lb-url{width:100%;font-family:'JetBrains Mono',monospace;font-size:11.5px;background:var(--surface);border:1px solid var(--line2);border-radius:7px;padding:8px 10px;color:var(--text);outline:none}
.ok-msg{color:var(--accent);font-size:13px}

/* ===== v0.9.0 : journee, pastels, sous-traitance ===== */
.outdate{font-family:'JetBrains Mono',monospace;font-weight:700;color:var(--accent);font-size:12px}
.outdate.soon{color:var(--amber)}
.outdate.late{color:var(--rouge)}
.stbadge{font-size:9.5px;font-weight:800;letter-spacing:.05em;background:rgba(240,165,60,.18);color:var(--or);border:1px solid var(--or);border-radius:6px;padding:2px 6px}
.stbadge.late{background:rgba(242,109,109,.15);color:var(--rouge);border-color:var(--rouge);animation:stpulse 1.6s infinite}
@keyframes stpulse{}
.pastels{display:flex;gap:8px;flex-wrap:wrap}
.pastel{width:30px;height:30px;border-radius:99px;border:2px solid transparent;cursor:pointer;padding:0}
.pastel:hover{transform:scale(1.12)}
.pastel.on{border-color:var(--text);box-shadow:0 0 0 2px var(--surface),0 0 0 4px var(--accent);transform:scale(1.18);z-index:1}
.pastel.none{background:var(--surface2);color:var(--muted);}
.dayrow{display:grid;grid-template-columns:80px 1fr 1fr 100px 150px;gap:8px;align-items:center;padding:7px 8px;border-bottom:1px solid var(--line);font-size:12.5px;cursor:pointer}
.dayrow:hover{background:var(--surface2)}
.dayrow:last-of-type{border-bottom:none}
@media (max-width:880px){.dayrow{grid-template-columns:70px 1fr 90px;font-size:12px}
.dayrow span:nth-child(3),.dayrow span:nth-child(5){display:none}}

/* ===== v0.10.0 ===== */
.cardmenu{position:fixed;z-index:300;min-width:210px;background:var(--surface);border:1px solid var(--line2);border-radius:12px;box-shadow:0 12px 34px rgba(0,0,0,.35);overflow:hidden;padding-bottom:4px}
.cardmenu .cm-title{font-size:10px;font-weight:800;text-transform:uppercase;letter-spacing:.07em;color:var(--faint);padding:9px 12px 4px}
.cardmenu .cm-item{display:block;width:100%;text-align:left;background:none;border:none;font-size:13px;color:var(--text);padding:8px 12px;cursor:pointer}
.cardmenu .cm-item:hover{background:var(--surface2)}
.cardmenu .cm-item.danger{color:var(--rouge)}
.cardmenu .pastel{width:24px;height:24px}
.sl-bar.dbl{display:flex;flex-direction:column;gap:2px;height:16px}
.sl-bar.dbl i{height:7px}
/* Petite taille : MEME forme, seule la hauteur change. */
.bsm2{height:28px;padding:0 11px;font-size:11px;border:1px solid var(--line2);
  background:var(--surface);border-radius:99px;cursor:pointer;color:var(--muted);
  display:inline-flex;align-items:center;justify-content:center;gap:5px;
  box-sizing:border-box}
.bsm2:hover{border-color:var(--accent);color:var(--text)}

/* ===== v0.12.0 : agenda semaine + bandeau annonces ===== */
.annbanner{background:rgba(245,185,74,.12);border-bottom:1px solid var(--amber);color:var(--amber);font-size:12.5px;font-weight:600;padding:9px 22px;display:flex;gap:22px;flex-wrap:wrap}
.annbanner i{font-style:normal;opacity:.7;font-weight:400}
.agweek{display:grid;grid-template-columns:repeat(7,1fr);gap:8px}
.agday{background:var(--surface);border:1px solid var(--line);border-radius:var(--r);padding:8px;min-height:140px}
.agday.today{border-color:var(--accent);box-shadow:0 0 0 1px var(--accent-glow)}
.agday-h{font-weight:800;text-transform:uppercase;letter-spacing:.06em;display:flex;gap:6px;align-items:center;padding-bottom:7px;border-bottom:1px solid var(--line);margin-bottom:7px}
.agday.today .agday-h{color:var(--accent)}
.agday-h .n{margin-left:auto;font-size:9.5px;background:var(--surface2);border-radius:99px;padding:1px 7px}
.agchip{border-left:3px solid var(--accent);background:var(--surface2);border-radius:7px;padding:6px 8px;margin-bottom:6px;font-size:11px;transition:transform .1s;}
.agchip:hover{transform:translateX(2px)}
.agc-1{display:flex;gap:5px;align-items:center}
.agc-1 .mono{font-size:9.5px;color:var(--faint)}
.agc-2{font-weight:600;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;margin:2px 0}
.agc-3{font-size:10px;color:var(--muted)}
@media (max-width:1100px){.agweek{grid-template-columns:repeat(4,1fr)}}
@media (max-width:700px){.agweek{grid-template-columns:repeat(2,1fr)}}

/* ===== v0.13.0 : boutons outils editeur (hors mecanique de statut) ===== */
.toolbtn{display:inline-flex;align-items:center;gap:6px;padding:8px 13px;font-size:12px;font-weight:600;background:var(--surface);border:1px solid var(--line2);border-radius:9px;color:var(--muted);cursor:pointer;transition:border-color .12s,color .12s}
.toolbtn:hover{border-color:var(--accent);color:var(--text)}
input[type=color].pastel{width:26px;height:26px;border-radius:7px;cursor:pointer;background:none}
input[type=color].pastel::-webkit-color-swatch-wrapper{padding:2px}
input[type=color].pastel::-webkit-color-swatch{border:none;border-radius:5px}

/* ===== v0.14.0 : restructuration (alertes, tournees, sous-traitants) ===== */
.alerts{display:flex;flex-direction:column;gap:7px;margin-bottom:16px}
.alert{font-size:12.5px;font-weight:600;padding:9px 14px;border-radius:9px;cursor:pointer;border:1px solid transparent;transition:transform .1s}
.alerts .alert:hover{transform:translateX(3px)}
.alert.red{background:rgba(242,109,109,.1);border-color:rgba(242,109,109,.45);color:var(--rouge)}
.alert.amber{background:rgba(245,185,74,.09);border-color:rgba(245,185,74,.4);color:var(--amber)}
@keyframes pulse{0%,100%{opacity:1}50%{opacity:.55}}
.sub-choice{width:100%;display:flex;gap:10px;align-items:center;padding:9px 8px;border:1px solid transparent;
  border-bottom-color:var(--line);background:transparent;color:var(--text);font:inherit;text-align:left;cursor:pointer;border-radius:8px}
.sub-choice:hover{background:var(--surface2)}
.sub-choice.on{background:rgba(73,117,105,.10);border-color:var(--accent)}
.sub-out-card{margin-top:14px;margin-bottom:14px}
.sub-overdue{animation:none!important;opacity:1}
.u-sub-ref{font-size:10.5px;color:var(--violet)}
.sub-period{display:flex;gap:8px;margin-bottom:10px;align-items:end}
.sub-period label{display:grid;gap:4px;font-size:10px;font-weight:700;text-transform:uppercase;color:var(--faint)}
.soc-counter{width:56px;height:28px;min-height:28px;text-align:right;padding:2px 7px;line-height:22px}
/* L'etat du travail reste modifiable sur place. La couleur n'occupe plus
   une colonne : le filet gauche la rend deja visible sans ambiguite. */
.tourrow{display:grid;
  grid-template-columns:56px 62px 1.15fr 0.8fr 104px 132px 100px 92px;
  gap:10px;align-items:center;padding:8px 6px;font-size:12.5px;}
.tstsel{width:100%;padding:4px 6px;font-size:11.5px;border:1px solid var(--line2);
  border-radius:99px;background:var(--surface);color:var(--text)}
.tstat .badge{font-size:10px}
.tourrow.late{background:rgba(242,109,109,.05)}
.tourrow{border-bottom:none}
.tourrow-wrap{border-bottom:1px solid var(--line)}
.tourlog{padding:0 6px 7px 130px;font-size:10.5px;color:var(--muted);letter-spacing:.01em}
.refgen{border:1px solid var(--line2);background:var(--surface);color:var(--muted);cursor:pointer;font-size:14px;line-height:1;padding:3px 8px;border-radius:7px}
.refgen:hover{color:var(--accent);border-color:var(--accent)}
.hz .refgen{flex:none;border:none;background:none;padding:0 10px 0 2px}
.patref{display:flex;gap:5px;align-items:center}
.patref input{flex:1;min-width:0}
.tourrow .thr{color:var(--accent);font-weight:700;font-size:12px}
.tourrow .tcli{color:var(--text);font-weight:700}
.tour-work-address{display:block;margin-top:3px;color:var(--muted);font-size:10.8px;line-height:1.3;font-weight:400;white-space:normal}
.latetag{color:var(--rouge);font-size:10px;font-style:normal;font-weight:600}
.oubtn{margin-left:8px;border:1px solid var(--line2);background:var(--surface);color:var(--rouge);cursor:pointer;font-size:11px;font-weight:600;padding:3px 10px;border-radius:99px;vertical-align:1px}
.oubtn.on{background:rgba(242,109,109,.12);border-color:var(--rouge)}
.oubtn.clean{color:var(--muted);border-color:var(--line2);background:transparent}
.oubtn.clean:hover{color:var(--rouge);border-color:var(--rouge)}
.tour-forget-count{padding:10px 12px;border-radius:9px;background:var(--surface2);font-size:12.5px;font-weight:600}
.tourrow.gone{opacity:.45}
.tourrow .tflag{font-size:10.5px;font-weight:700;letter-spacing:.03em}
.tour-stops{margin:12px 0 16px;padding:14px 18px}
.tour-stops h2{display:flex;gap:7px;align-items:center;margin:0 0 7px;font-size:10.5px;line-height:1.2;font-weight:700;text-transform:uppercase;letter-spacing:.07em}.tour-stops h2 span{font-size:10px;font-weight:400;color:var(--faint)}
.tour-stop-head,.tour-stop{display:grid;grid-template-columns:minmax(300px,1.4fr) 82px 82px minmax(260px,1fr) 210px;gap:9px;align-items:center}
.tour-stop-head{padding:2px 6px 7px;color:var(--faint);font-size:10px;font-weight:700;text-transform:uppercase}.tour-stop-head .tsh-pick,.tour-stop-head .tsh-drop{text-align:center}.tour-stop-head .tsh-comment{text-align:left}
.tour-stop{min-height:42px;padding:5px 6px;border-top:1px solid var(--line);font-size:11.5px;background:transparent!important}
.tour-stop>span:first-child{min-width:0;line-height:1.2}.tour-stop>span:first-child b{font-size:12.5px;font-weight:700}.tour-stop>span:first-child i{font-size:9.5px;color:var(--faint);font-style:normal}
.tour-stop small{display:block;color:var(--muted);font-size:11.5px;line-height:1.3;white-space:normal;margin-top:2px}
.tour-stop input{min-width:0;height:30px;box-sizing:border-box;padding:4px 2px;border:0!important;border-bottom:1px solid var(--line2)!important;border-radius:0!important;background:transparent!important;font-size:11.5px;box-shadow:none!important}.tour-stop input[type=number]{text-align:center}.tour-stop output{display:flex;align-items:center;justify-content:center;min-height:30px;border:0;border-bottom:1px solid var(--line2);border-radius:0;background:transparent!important;font-size:11.5px;font-weight:600;color:var(--text)}
.tour-stop-actions{display:flex;gap:7px;justify-content:flex-end;align-items:center}.tour-stop-actions .btn{white-space:nowrap}
.tour-stop-modal{max-width:590px}.tour-stop-modal label{display:grid;gap:5px;margin:10px 0;font-size:11px;font-weight:700;text-transform:uppercase;color:var(--faint)}
.tour-stop-modal select,.tour-stop-modal input,.tour-stop-modal textarea{font:inherit;color:var(--text);background:var(--surface);border:1px solid var(--line2);border-radius:9px;padding:9px;text-transform:none}
.tour-stop-modal textarea{min-height:90px;resize:vertical}
@media(max-width:1050px){.tour-stop-head{display:none}.tour-stop{grid-template-columns:1fr 80px 80px}.tour-stop .tour-comment,.tour-stop-actions{grid-column:1/-1}}
.sub-out-row{grid-template-columns:56px minmax(150px,1fr) minmax(180px,1.2fr) minmax(130px,.8fr) 160px 92px}
.sub-out-row .sub-overdue{white-space:nowrap}
.tflag.ok{color:var(--accent)}.tflag.ko{color:var(--rouge)}
.tstep,.tour-stop-actions .btn{height:30px;min-height:30px;padding:0 10px;font-size:11px;line-height:1;box-sizing:border-box}
.tstep{border-radius:8px;border:1px solid var(--line2);background:var(--surface);color:var(--muted);cursor:pointer}
.tstep.on{border-color:var(--accent);color:var(--accent);background:rgba(43,217,199,.07)}
.annbanner .dsmsg{color:var(--violet)}
@media (max-width:900px){.tourrow{grid-template-columns:40px 44px 1fr 88px auto auto auto;font-size:11.5px}.tourrow>span:nth-child(4){display:none}.tourlog{padding-left:88px}}

/* ===== v0.15.0 : agenda RDV ===== */
/* v0.267.0 : les noms de jours passent de --faint a --muted. En 10 px
   sur la teinte la plus pale de la charte, ils etaient a la limite du
   lisible — or ce sont eux qui donnent la colonne ou l'on regarde. */
.agd-head{display:grid;grid-template-columns:repeat(7,1fr);gap:6px;font-size:10.5px;
  font-weight:800;text-transform:uppercase;letter-spacing:.07em;color:var(--muted);
  padding:0 2px 6px}
.agd-grid{display:grid;grid-template-columns:repeat(7,1fr);gap:6px}
.agd-cell{background:var(--surface);border:1px solid var(--line);border-radius:10px;min-height:96px;padding:6px;cursor:pointer;transition:border-color .12s}
.agd-cell:hover{border-color:var(--line2)}
.agd-cell.off{opacity:.38}
.agd-cell.today{border-color:var(--accent)}
.agd-n{font-size:11px;font-weight:700;color:var(--muted);margin-bottom:4px}
.agd-cell.today .agd-n{color:var(--accent)}
.agd-appt{font-size:10.5px;border-left:3px solid var(--accent);background:var(--surface2);border-radius:5px;padding:3px 6px;margin-bottom:4px;overflow:hidden}
.agd-appt .mono{color:var(--faint);font-size:9.5px}
.agd-appt-main,.agd-appt-note{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.agd-appt-note{margin-top:2px;color:var(--muted);font-size:9.5px;font-style:italic}
.ap-notes-field{display:block;width:100%;clear:both}
.modal .ap-notes-field textarea{display:block;width:100%;min-height:76px;margin-top:5px;
  box-sizing:border-box;resize:vertical}
.modal .ap-delete{width:38px;height:38px;min-width:38px;padding:0;font-size:18px;
  line-height:1;display:inline-flex;align-items:center;justify-content:center}
@media (max-width:900px){.agd-grid{grid-template-columns:repeat(2,1fr)}.agd-head{display:none}.agd-cell{min-height:60px}.agd-cell.off{display:none}}

/* ===== v0.15.1 : planning de charge + toolbtns ===== */
.toolbtn.big{font-size:18px;line-height:1}
.pl-grid .pl-cell{background:var(--surface);border:1px solid var(--line);border-radius:10px;min-height:52px;padding:5px;cursor:pointer;text-align:center;transition:border-color .12s,transform .1s}
.pl-cell:hover{transform:translateY(-1px);border-color:var(--line2)}
.pl-cell.off{opacity:.32}
.pl-cell.today{border-color:var(--accent)}
.pl-cell.sel{outline:2px solid var(--accent)}
.pl-cell.full{border-color:rgba(242,109,109,.5);}
.pl-n{font-size:19px;font-weight:800;font-family:'JetBrains Mono',monospace}
.pl-cell.ok .pl-n{color:var(--accent)}.pl-cell.warn .pl-n{color:var(--amber)}.pl-cell.full .pl-n{color:var(--rouge)}
.pl-free{font-size:9.5px;color:var(--faint);text-transform:uppercase;letter-spacing:.08em;margin-top:6px}
.pl-dot{display:inline-block;width:9px;height:9px;border-radius:3px;vertical-align:-1px}
.pl-dot.ok{background:#7cc6a6}.pl-dot.warn{background:#ecca7a}.pl-dot.full{background:#e0938a}

/* ===== v0.16.2 : mini-calendrier de charge dans la fiche ===== */
.minical{max-width:260px;}
.mc-nav{background:none;border:1px solid var(--line2);border-radius:6px;color:var(--muted);cursor:pointer;font-size:11px;padding:1px 7px}
.mc-nav:hover{border-color:var(--accent);color:var(--text)}
.mc-d{font-size:10px;text-align:center;color:var(--muted);}
.mc-d.ok{background:rgba(43,217,199,.13);color:var(--accent)}
.mc-d.warn{background:rgba(245,185,74,.2);color:var(--amber)}
.mc-d.full{background:rgba(242,109,109,.22);color:var(--rouge);font-weight:800}
.mc-d.today{text-decoration:underline}

/* ===== v0.16.3 : calendrier de charge compact a gauche de la fiche (EasyLab) ===== */
.headfields{flex:1;min-width:0;display:grid;grid-template-columns:1fr 1fr;gap:2px 16px;align-content:start}
.minical{flex:none;margin-top:0;background:var(--surface2);border:1px solid var(--line);border-radius:12px;}
.mc-h{display:flex;align-items:center;justify-content:space-between;gap:6px;}
.mc-w{font-size:8.5px;font-weight:800;color:var(--faint);text-align:center;text-transform:uppercase}
.mc-grid{display:grid;grid-template-columns:repeat(7,1fr);}
.mc-d{display:flex;flex-direction:column;align-items:center;font-family:'JetBrains Mono',monospace;border-radius:6px;cursor:pointer;border:1px solid transparent;line-height:1.15;}
.mc-d b{font-weight:700;color:var(--muted);}
.mc-d em{font-style:normal;color:var(--faint);}
.mc-bar{display:block;width:82%;height:3px;border-radius:2px;background:var(--line);margin:1px 0;overflow:hidden}
.mc-bar u{display:block;height:100%;background:var(--accent)}
.mc-d.ok b{color:var(--accent)}.mc-d.ok em{color:var(--accent)}
.mc-d.warn b{color:var(--amber)}.mc-d.warn em{color:var(--amber)}.mc-d.warn .mc-bar u{background:var(--amber)}
.mc-d.full b{color:var(--rouge)}.mc-d.full em{color:var(--rouge)}.mc-d.full .mc-bar u{background:var(--rouge)}
.mc-d:hover{border-color:var(--accent)}
.mc-d.off{opacity:.22;pointer-events:none}
.mc-d.today{box-shadow:inset 0 0 0 2px var(--text)}
.mc-d.today b{font-weight:800;color:var(--text)}
.mc-legend{font-size:8.5px;color:var(--faint);text-align:center;letter-spacing:.03em;}
@media (max-width:1000px){.headwrap{flex-direction:column}.minical{width:100%;max-width:300px}}

/* ===== v0.18.2 : en-tete fiche en 3 colonnes (calendrier | champs | dents) ===== */
.headwrap{display:grid;gap:20px;align-items:stretch;}
.minical{width:auto;display:flex;flex-direction:column;}
.mc-grid{gap:4px}
.headfields .f{min-width:0}
.headfields .f:nth-child(1){grid-column:1/-1}
.headfields .f input,.headfields .f select{width:100%}
.odo-head{align-self:stretch;background:var(--surface2);border:1px solid var(--line);border-radius:12px;}
.odo-head svg{display:block;width:100%}
@media (max-width:1250px){.odo-head{grid-column:1/-1}}
@media (max-width:900px){.headwrap{grid-template-columns:1fr}}

/* ===== v0.18.3 : fiche = calendrier +10% | champs nus + schema dessous ===== */
.headwrap{grid-template-columns:360px 1fr}
.headright{display:flex;flex-direction:column;gap:10px;min-width:0}
.hf-row{display:flex;gap:12px}
.hf{position:relative;min-width:0}
.hf input,.hf select{width:100%;font-size:13.5px;padding:9px 12px;background:var(--surface2);border:1px solid var(--line2);border-radius:9px}
.hf input::placeholder{color:var(--faint)}
.hf-date{display:flex;align-items:center;background:var(--surface2);border:1px solid var(--line2);border-radius:9px}
.hf-date .inlbl{font-size:9px;font-weight:800;text-transform:uppercase;letter-spacing:.08em;color:var(--faint);padding:0 0 0 11px;flex:none}
.hf-date input{border:none;background:none;flex:1;padding:9px 10px 9px 7px}
.odo-head{flex:1;margin-top:2px;display:flex;flex-direction:column;justify-content:center;}
.odo-head svg{max-width:820px;}
@media (max-width:1250px){.headwrap{grid-template-columns:300px 1fr}}

/* v0.18.4 : jour CHOISI = plein vert, sans confusion avec la charge */
.mc-d.cur{background:var(--accent)!important;box-shadow:0 1px 6px rgba(46,125,91,.35);}
.mc-d.cur b,.mc-d.cur em{color:#fff!important}
.mc-d.cur .mc-bar{background:rgba(255,255,255,.35)}
.mc-d.cur .mc-bar u{background:#fff}
.mc-legend::after{content:' — plein vert = date choisie'}

/* ===== v0.18.5 : en-tete AUTONOME (zones nommees, ecrase tout l'anterieur) ===== */
.wo-card .headwrap{display:grid!important;align-items:stretch;}
.wo-card .headright{display:grid;align-content:start;min-width:0;}
.hz{min-width:0;display:flex;align-items:center;background:var(--surface2);border:1px solid var(--line2);border-radius:9px}
.hz input,.hz select{flex:1;min-width:0;width:auto;border:none;background:none;font-size:13.5px;outline:none;}
.hz:focus-within{border-color:var(--accent)}
.hz .inlbl{font-size:9px;font-weight:800;text-transform:uppercase;letter-spacing:.08em;color:var(--faint);padding-left:11px;flex:none}
.hz-client{grid-area:client;position:relative}
.hz-site{grid-area:site}.hz-patient{grid-area:patient}
.hz-in{grid-area:in;background:rgba(45,125,210,.10);border-color:rgba(45,125,210,.4)}.hz-out{grid-area:out}.hz-type{grid-area:type}
.wo-card .odo-head{grid-area:odo;align-self:stretch;display:flex;flex-direction:column;justify-content:center;margin:2px 0 0;background:var(--surface2);border:1px solid var(--line);border-radius:12px;padding:3px 12px;max-width:none}
.wo-card .odo-head svg{display:block;width:100%;margin:0;}
.hz-in,.hz-out{position:relative}
.hz.dt-in{border-color:var(--blue)}
.hz.dt-in:focus-within{border-color:var(--blue);box-shadow:0 0 0 2px rgba(45,125,210,.16)}
.hz.dt-out{border-color:var(--or)}
.hz.dt-out:focus-within{border-color:var(--or);box-shadow:0 0 0 2px rgba(201,169,97,.22)}
.hz .calbtn{flex:none;border:none;background:none;cursor:pointer;padding:0 10px 0 2px;
  color:var(--muted);display:flex;align-items:center;height:100%}
.hz .calbtn:hover{color:var(--accent)}
.hz .calbtn svg{width:16px;height:16px}
.hz.dt-in .calbtn{color:var(--blue)}
.hz.dt-out .calbtn{color:var(--or)}
.hz .dpick{position:absolute;right:8px;bottom:0;width:1px;height:1px;opacity:0;
  pointer-events:none;border:0;padding:0}
/* details du travail : 2 colonnes, on ne scrolle plus pour rien */
#tabDetails{display:grid!important;grid-template-columns:1fr 1fr;align-items:start;}
#tabDetails[style*='none']{display:none!important}
#tabDetails .grp{margin:0}
@media (max-width:1100px){#tabDetails{grid-template-columns:1fr}}

/* ===== v0.18.8 : deux blocs nets, tout aligne sur le schema ===== */
.wo-card .headwrap{justify-content:start;}
.mc-legend{margin-top:4px}
.wo-card .odo-head svg{max-width:none}
/* Details : la grille vit sur la carte (un seul enfant sous tabDetails) */
.card.det{gap:2px 26px;align-items:start;}
.card.det .grp{min-width:0;margin:0 0 14px}
@media (max-width:1100px){.card.det{grid-template-columns:1fr}}

/* ===== v0.18.9 : sidebar figee, carte utilisateur Smilo, version, decor ===== */
nav{position:sticky;top:0;height:100vh;overflow-y:auto;scrollbar-width:thin}
.navfoot{margin-top:auto;padding:12px 14px 6px}
.usercard{display:flex;gap:10px;align-items:center;background:rgba(255,255,255,.08);border:1px solid var(--nav-line);border-radius:12px;cursor:pointer;position:relative}
.uavatar{width:34px;height:34px;border-radius:50%;background:var(--or);color:#1B3A2E;font-weight:800;font-size:13px;display:flex;align-items:center;justify-content:center;flex:none}
.uinfo{min-width:0;display:flex;flex-direction:column;line-height:1.25}
.uinfo b{color:var(--nav-on);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;}
.uinfo i{font-style:normal;color:var(--nav-text);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;}
.userrow{display:flex;gap:8px;margin-top:8px}
.userrow select{flex:none;width:64px;background:rgba(255,255,255,.08);border:1px solid var(--nav-line);border-radius:8px;color:var(--nav-on);font-size:11px;padding:5px 6px}
.userrow select option{color:#1B3A2E}
.userrow button{flex:1;background:none;border:1px solid var(--nav-line);border-radius:8px;color:var(--nav-text);font-size:11px;padding:5px 8px;cursor:pointer;text-align:left}
.userrow button:hover{color:var(--nav-on);border-color:var(--or)}
#appVer{top:10px;right:14px;z-index:60;pointer-events:none;}
/* v0.267.0 : le pictogramme du scanner, dans les proportions du bouton.
   Isole dans son propre element, il grandit sans emporter le mot a
   cote, et l'alignement vertical se fait sur la ligne de base du
   texte plutot qu'au petit bonheur. */
.scan-i{display:block;width:17px;height:17px;flex:none;margin:0;
  fill:none;stroke:currentColor;stroke-width:1.8;stroke-linecap:round;
  stroke-linejoin:round}
.decor-teeth{position:fixed;left:-30px;bottom:-24px;pointer-events:none;}
html[data-theme='dark'] .decor-teeth{opacity:.06}
main{position:relative;z-index:1}

/* ===== v0.19.0 : vrai logo (assets/), tagline une ligne, decor derriere ===== */
nav{z-index:20}
nav .tagline{white-space:nowrap;font-size:6.8px;letter-spacing:.16em;margin-top:-16px}
nav .wordmark::before{width:34px;height:34px;filter:none}
.decor-teeth{z-index:2;opacity:.35;width:210px}
.login-logo{width:86px;height:86px}

/* ===== v0.19.1 : annotations fiche ===== */
.hz-courier{grid-area:courier}
.card.det{grid-template-columns:1fr 1fr;}
.card.det .detcol{min-width:0}
.card.det .detcol:nth-child(3){grid-column:1/-1;display:grid;grid-template-columns:1fr 1fr;gap:2px 26px}
.panel-title .actions{margin-left:auto}

/* ===== v0.19.2 : grille finale de l'en-tete + calendrier + sidebar ===== */
.minical{justify-content:flex-start;gap:4px}
.minical .mc-grid{margin-top:2px}
.hz-status{grid-area:status;display:flex;justify-content:flex-end;align-items:center}
.hz-status .status-group{margin:0}
#appVer{position:static;display:inline;margin-left:8px;font-family:'JetBrains Mono',monospace;font-size:9px;color:var(--nav-text);opacity:.75;font-weight:400;vertical-align:2px}
.uinfo b{font-size:12px}
.uinfo i{font-size:10.5px}

/* ===== v0.19.3 : DEUX CADRES cote a cote, pleine largeur ===== */
.card.det{display:block!important;width:auto;margin:0}
#tabDetails{gap:16px}

/* ===== v0.19.4 : salve img1-4 ===== */
.headleft{display:flex;flex-direction:column;gap:8px}
.hl-row{display:flex;gap:8px;align-items:center}
.st-sel{flex:1;font-size:12.5px;font-weight:700;padding:7px 10px;border-radius:9px;border:1.5px solid var(--line2);background:var(--surface2);text-align:center;text-align-last:center}
.st-sel.st-devis{color:var(--violet);border-color:var(--violet)}
.st-sel.st-en_cours{color:var(--accent);border-color:var(--accent);background:var(--accent-glow)}
.st-sel.st-fini{color:var(--amber);border-color:var(--amber)}
.wo-card .headright{grid-template-areas:'client site courier' 'patient in out' 'odo odo odo'}
.hz-out{background:rgba(184,134,11,.10);border-color:rgba(184,134,11,.45)}
.hz-in input::placeholder,.hz-out input::placeholder{font-size:11px;letter-spacing:.02em}
.verline{padding:0 22px 16px;margin-top:-16px;font-family:'JetBrains Mono',monospace;font-size:9px;color:var(--nav-text);opacity:.75}
.usercard:hover{border-color:var(--or)}
.udots{margin-left:auto;color:var(--nav-text);font-size:15px}
.usermenu{background:#fff;border-radius:12px;padding:8px 0;margin-bottom:8px;box-shadow:0 6px 24px rgba(0,0,0,.3)}
html[data-theme='dark'] .usermenu{background:var(--raise)}
.um-title{font-size:9px;font-weight:800;text-transform:uppercase;letter-spacing:.1em;color:var(--faint);padding:4px 14px 6px}
.usermenu a{display:block;font-size:12.5px;cursor:pointer;}
.usermenu a.on::before{content:'\2713  ';color:var(--accent);font-weight:700}
.um-sep{border-top:1px solid var(--line);margin:6px 0}

/* ===== v0.19.5 ===== */
/* 1/ calendrier +15% */
.wo-card .headwrap{grid-template-columns:400px minmax(0,1fr);}
.minical{padding:12px 14px}
.mc-d{padding:3px 0 2px}
.mc-d b{font-size:13px}
.mc-d em{font-size:9.5px}
.mc-h{font-size:14px;margin-bottom:6px}
/* 2/ statut centre, pastilles dessous, couleurs plus franches */
.hl-col{display:flex;flex-direction:column;gap:5px}
.pastels.mini{display:flex;gap:6px;justify-content:center}
.pastels.mini .pastel{width:20px;height:20px;filter:saturate(1.9) brightness(.94);border:1.5px solid rgba(0,0,0,.12)}
.pastels.mini .pastel.on{outline:2px solid var(--text)}
.pastels.mini input[type=color]{width:20px;height:20px;padding:0;border-radius:50%;overflow:hidden;cursor:pointer}
/* 3/ champs client/patient moins larges, schema ajuste, dates = via calendrier */
.wo-card .headright{grid-template-columns:minmax(0,1.25fr) minmax(0,1fr) minmax(0,1fr);max-width:850px}
.mc-d.curin{outline:2px solid #2D7DD2;border-radius:6px}
.mc-d.cur{outline:none}
/* 4/ tableau harmonise : en-tetes discrets, codes non cries */
.te-head{font-size:9px;font-weight:600;letter-spacing:.09em;color:var(--faint)}
.te-row .mono b,.te-row b{font-weight:600}
/* menu langue lisible (les regles nav a l'ecrasaient) */
.usermenu a{color:#1C2B24!important;margin:0!important;padding:7px 16px!important;border-radius:0}
.usermenu a:hover{background:var(--accent-glow)!important;color:#1C2B24!important}
html[data-theme='dark'] .usermenu a{color:var(--text)!important}

/* ===== Kanban production (v0.21.0) ===== */
.vtoggle{display:inline-flex;border:1px solid var(--line2);border-radius:99px;overflow:hidden;margin-right:10px}
.vtoggle button{border:none;background:var(--surface);color:var(--muted);font-size:12.5px;font-weight:700;
  padding:7px 15px;cursor:pointer}
.vtoggle button+button{border-left:1px solid var(--line2)}
.vtoggle button.on{background:var(--accent);color:var(--on-accent)}
.ktools{display:flex;align-items:center;gap:16px;flex-wrap:wrap;margin-bottom:14px}
.kfilter{display:inline-flex;border:1px solid var(--line2);border-radius:99px;overflow:hidden}
.kfilter button{border:none;background:var(--surface);color:var(--muted);font-size:12px;font-weight:700;
  padding:6px 14px;cursor:pointer}
.kfilter button+button{border-left:1px solid var(--line2)}
.kfilter button.on{background:var(--accent-glow);color:var(--text)}
.ktools .typefilter{margin-bottom:0}
.kboard{display:grid;gap:12px;align-items:start;overflow-x:auto;padding-bottom:8px}
.kcol{background:var(--surface2);border:1px solid var(--line);border-radius:12px;min-height:120px;display:flex;flex-direction:column}
.kcol-h{display:flex;align-items:center;gap:8px;font-size:12px;font-weight:800;text-transform:uppercase;
  letter-spacing:.05em;color:var(--muted);padding:11px 13px;border-bottom:1px solid var(--line)}
.kcol-h .kn{margin-left:auto;font-family:'JetBrains Mono',monospace;font-size:11px;background:var(--surface);
  border:1px solid var(--line2);border-radius:99px;min-width:20px;text-align:center;padding:1px 6px;color:var(--faint)}
/* v0.267.0 : le « calc(100vh - 300px) » etait une hauteur devinee — la
   colonne s'arretait avant le bas de la fenetre, d'ou le blanc que
   Jacob a entoure. La valeur reste ici comme filet de securite si le
   script ne passait pas, mais c'est la MESURE au moment du dessin qui
   fait foi (voir ajusterKanban dans app.js). */
.kcol-b{padding:10px;display:flex;flex-direction:column;gap:9px;flex:1;min-height:46px;
  max-height:calc(100vh - 300px);overflow-y:auto;border-radius:0 0 12px 12px;
  transition:background .12s}
.kempty{color:var(--faint);font-size:12px;text-align:center;padding:14px 0}
.kcard{background:var(--surface);border:1px solid var(--line2);border-radius:10px;padding:10px 11px;cursor:pointer;overflow:hidden;min-width:0;
  box-shadow:0 1px 2px rgba(0,0,0,.04);transition:border-color .12s,box-shadow .12s}
.kcard:hover{border-color:var(--accent);box-shadow:0 2px 8px rgba(0,0,0,.08)}
.kc-top{display:flex;align-items:center;gap:7px;margin-bottom:5px;min-width:0}
.kmk{width:9px;height:9px;border-radius:99px;flex:none}
.wl-table{grid-column:1/-1;width:100%;border-collapse:collapse;font-size:13px;background:var(--surface);border:1px solid var(--line);border-radius:12px;overflow:hidden}
.wl-table th{text-align:left;padding:9px 11px;font-size:10px;text-transform:uppercase;letter-spacing:.05em;color:var(--faint);border-bottom:1px solid var(--line2);background:var(--surface2)}
.wl-table td{padding:9px 11px;border-bottom:1px solid var(--line);cursor:pointer}
.wl-table tr:last-child td{border-bottom:none}
.wl-table tbody tr:hover td{background:var(--surface2)}
@media print{nav,.page-head .vtoggle,.page-head .search,#lsort,#scanWork,#newWork,.tabs,.typefilter,#wlPrint,.kalert,.kinfo,.no-print{display:none!important}body{background:#fff}main{padding:0}.wl-table td{cursor:default}.wl-table{border:none}}

.kc-num{font-family:'JetBrains Mono',monospace;font-size:12px;font-weight:700;color:var(--text)}
/* v0.251.2 : la date remonte en haut de carte, a droite du numero. Elle
   occupait une ligne entiere en pied pour six caracteres ; la carte perd
   une ligne et la colonne en affiche une de plus par ecran. */
.kc-when{font-size:11px;color:var(--muted);white-space:nowrap;margin-left:auto}
/* v0.252.0 : la pastille « facture » sur la carte du tableau du jour.
   Un travail facture y RESTE desormais — il a bien ete produit ce
   jour-la — il faut donc le distinguer sans lire le pied de carte.
   Elle passe AVANT la date : quand elle est presente, c'est elle qui
   pousse la date vers la droite (margin-left:auto sur .kc-when). */
/* v0.252.3 : une ligne verrouillee se VOIT. Les champs sont desactives,
   mais un champ desactive dans un tableau dense passe inapercu. */
.te-row.te-locked{background:rgba(0,0,0,.02)}
.te-row.te-locked input,.te-row.te-locked select,.te-row.te-locked button{
  opacity:.62;cursor:not-allowed}
/* v0.252.3 : de l'air entre le statut et le numero de facture. */
.head4 .f .factbadge{margin-left:8px}
.kc-billed{margin-left:auto;font-size:11px;font-weight:700;color:var(--accent);
  background:rgba(42,122,145,.12);border-radius:99px;padding:0 6px;line-height:16px}
.kc-billed + .kc-when{margin-left:6px}
/* Quand le type est present il vient APRES la date : c'est lui qui porte
   la couleur, il doit rester le dernier element lu. */
.kc-when + .kc-type{margin-left:7px}
.kc-type{margin-left:auto;font-size:10.5px;font-weight:700;border:1px solid;border-radius:99px;
  padding:1px 8px;color:var(--muted);white-space:nowrap;max-width:48%;min-width:0;overflow:hidden;text-overflow:ellipsis;flex:0 1 auto}
.kc-cli{font-size:13px;font-weight:600;color:var(--text)}
.kc-pat{font-size:12px;color:var(--muted);margin-top:1px}
.kc-foot{display:flex;align-items:center;justify-content:space-between;gap:8px;margin-top:7px;
  font-size:11px;color:var(--faint)}
.kc-steps{font-family:'JetBrains Mono',monospace;font-weight:700;color:var(--muted)}
.kprog{height:4px;border-radius:99px;background:var(--line);margin-top:8px;overflow:hidden}
.kprog i{display:block;height:100%;background:var(--accent);border-radius:99px}
.kstart{margin-top:9px;width:100%;border:1px solid var(--or);background:none;color:var(--or);
  font-size:11.5px;font-weight:800;border-radius:8px;padding:6px 0;cursor:pointer}
.kstart:hover{background:var(--or);color:#fff}
.kstart:disabled{opacity:.5;cursor:default}

/* ===== Suivi etapes dans la fiche ===== */
.psteps-box{margin-top:10px}
.psteps-h{display:flex;align-items:center;gap:8px;font-size:11px;font-weight:800;text-transform:uppercase;
  letter-spacing:.05em;color:var(--muted);margin-bottom:6px}
.psteps-h span{margin-left:auto;font-family:'JetBrains Mono',monospace;color:var(--accent)}
.pstep{display:flex;align-items:center;gap:9px;padding:6px 0;border-bottom:1px solid var(--line);font-size:13px;cursor:pointer}
.pstep input{width:16px;height:16px;accent-color:var(--accent);cursor:pointer}
.pstep-nm{color:var(--text)}
.pstep.done .pstep-nm{color:var(--muted)}
.pstep-by{margin-left:auto;font-size:11px;color:var(--faint);font-family:'JetBrains Mono',monospace}

/* ===== Config etapes (Parametres) ===== */
.prod-toggles{display:flex;flex-direction:column;gap:9px;margin:6px 0 16px}
.prod-toggles .tog{display:flex;align-items:center;gap:9px;font-size:13px;font-weight:600;color:var(--text);cursor:pointer}
.portal-visibility .prod-toggles .tog{font-weight:400}
.prod-toggles .tog input{width:16px;height:16px;accent-color:var(--accent);cursor:pointer}
.prod-cfg{border-top:1px solid var(--line);padding-top:14px}
.prod-cfg-top{display:flex;gap:8px;flex-wrap:wrap;align-items:center;margin-bottom:12px}
.pstep-row{display:flex;gap:6px;align-items:center;margin-bottom:6px}
.pstep-in{flex:1}
.pstep-row .btn{padding:0 12px}

/* ===== Fiche compacte (v0.22.0) ===== */
.wo-ref-edit{font-family:'JetBrains Mono',monospace;font-size:13px;background:var(--surface2);
  border:1px solid var(--line2);border-radius:99px;padding:5px 13px;font-weight:600;color:var(--text);
  width:118px;outline:none;text-align:center;letter-spacing:.02em}
.wo-ref-edit:hover{border-color:var(--faint)}
.wo-ref-edit:focus{border-color:var(--accent);background:var(--surface)}
.wo-ref-edit[readonly]{opacity:.7;cursor:default}
.newbtn.bsm{height:28px;padding:0 14px;font-size:12px}
.btn.bsm{height:28px;padding:0 12px;font-size:11.5px}
/* tick de deverrouillage du client */
.cl-lock{display:inline-flex;align-items:center;padding:0 9px;cursor:pointer;flex:none;user-select:none}
.cl-lock input{position:absolute;opacity:0;width:0;height:0}
.cl-lock span{font-size:14px;filter:grayscale(1);opacity:.45;transition:opacity .12s}
.cl-lock:hover span{opacity:.75}
.cl-lock input:checked+span{filter:none;opacity:1}
/* heure de sortie, dans la cellule date de sortie */
.hz-time{flex:none!important;width:74px!important;border-left:1px solid var(--line2)!important;
  padding:7px 2px 7px 6px!important;font-size:12.5px!important;color:var(--muted)}
.hz-time:focus{color:var(--text)}
/* carte : code client dans la ligne proeminente */
.wc-patient .cid{font-family:'JetBrains Mono',monospace;font-size:10.5px;color:var(--faint);font-weight:600}

/* ===== Kanban refondu (v0.23.0) : date + drag + alerte ===== */
.kdate{display:inline-flex;align-items:center;gap:6px}
.kdate .kd-nav{border:1px solid var(--line2);background:var(--surface);color:var(--muted);
  width:30px;height:30px;border-radius:8px;cursor:pointer;font-size:12px}
.kdate .kd-nav:hover{border-color:var(--accent);color:var(--accent)}
.kdate input[type=date]{border:1px solid var(--line2);background:var(--surface);color:var(--text);
  border-radius:8px;padding:6px 9px;font-size:13px;font-weight:600}
.kd-today{border:1px solid var(--line2);background:var(--surface);color:var(--muted);
  border-radius:99px;padding:6px 13px;font-size:12px;font-weight:700;cursor:pointer}
.kd-today:hover{border-color:var(--accent);color:var(--accent)}
.kalert{background:rgba(192,57,43,.10);border:1px solid rgba(192,57,43,.4);color:#C0392B;
  border-radius:10px;padding:10px 14px;font-size:13px;font-weight:600;margin-bottom:12px}
.kalert.ok{background:var(--accent-glow);border-color:var(--accent);color:var(--accent2)}
.kcard[draggable=true]{cursor:grab}
.kcard.dragging{opacity:.45;cursor:grabbing}
.kcol.kover{background:var(--accent-glow);outline:2px dashed var(--accent);outline-offset:-3px}
.kc-inv{font-family:'JetBrains Mono',monospace;font-size:10.5px;font-weight:700;color:var(--accent2);
  background:var(--accent-glow);border-radius:5px;padding:1px 6px}

/* ===== Fiche v0.25 : barre partagee onglets+outils, boutons homogenes, popover jour ===== */
.fbar2{display:flex;align-items:center;gap:10px;flex-wrap:wrap;}
.fbar2 .dtabs{margin-bottom:0}
.fbar2 .actions{display:flex;align-items:center;gap:8px;flex-wrap:wrap}
/* meme angulation (9px) + meme hauteur (36px) pour Nouveau / icones / Tarif */
.fbar2 .actions .newbtn,
.fbar2 .actions .toolbtn,
/* v0.256.0 : meme forme que partout ailleurs. */
.fbar2 .actions .btn{border-radius:99px;height:36px;padding:0 13px;font-size:13px;
  display:inline-flex;align-items:center;justify-content:center;box-sizing:border-box}
.fbar2 .actions .toolbtn.big{font-size:17px;padding:0 12px}
/* popover des sorties du jour (clic sur le mini-calendrier) */
.mc-pop{position:fixed;left:50%;top:50%;transform:translate(-50%,-50%);z-index:200;
  background:var(--raise);border:1px solid var(--line2);border-radius:12px;
  box-shadow:0 16px 44px rgba(0,0,0,.45);padding:12px;min-width:264px;max-width:92vw;max-height:70vh;overflow:auto}
.mc-pop-h{font-size:12px;font-weight:800;text-transform:uppercase;letter-spacing:.05em;color:var(--muted);margin-bottom:8px}
.mc-pop-i{display:flex;align-items:center;gap:9px;width:100%;text-align:left;border:1px solid var(--line);
  background:var(--surface);border-radius:8px;padding:8px 10px;margin-bottom:6px;cursor:pointer}
.mc-pop-i:hover{border-color:var(--accent)}
.mc-pop-num{font-family:'JetBrains Mono',monospace;font-size:12px;font-weight:700;color:var(--text)}
.mc-pop-cli{font-size:13px;color:var(--text)}
.mc-pop-pat{font-size:12px;color:var(--muted);margin-left:auto}
.mc-pop-empty{font-size:13px;color:var(--muted);padding:8px 0}
.mc-pop-close{margin-top:6px;width:100%;border:1px solid var(--line2);background:var(--surface2);
  border-radius:8px;padding:7px;font-size:12px;font-weight:700;color:var(--muted);cursor:pointer}

/* ===== Photos par travail (v0.27) ===== */
.ph-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(96px,1fr));gap:8px;margin-top:6px}
.ph-item{position:relative;aspect-ratio:1;border-radius:9px;overflow:hidden;border:1px solid var(--line2);background:var(--surface2)}
.ph-item img{width:100%;height:100%;object-fit:cover;cursor:zoom-in;display:block}
.ph-del{position:absolute;top:4px;right:4px;width:22px;height:22px;border:none;border-radius:99px;
  background:rgba(0,0,0,.55);color:#fff;font-size:15px;line-height:1;cursor:pointer;display:flex;
  align-items:center;justify-content:center}
.ph-del:hover{background:#C0392B}
.ph-add:hover{border-color:var(--accent);color:var(--accent)}
.ph-add span{font-size:20px;line-height:1.3}

/* ===== Camera live (v0.28) ===== */
.ph-add{aspect-ratio:1;border:1.5px dashed var(--line2);border-radius:9px;display:flex;align-items:center;
  justify-content:center;cursor:pointer;color:var(--muted);font-size:12px;font-weight:600;text-align:center;
  background:none;transition:border-color .12s,color .12s}
.cam-modal{max-width:620px;width:96vw;overflow-x:hidden}
.cam-stage{position:relative;background:#0d1418;border-radius:10px;overflow:hidden;aspect-ratio:4/3;
  display:flex;align-items:center;justify-content:center;margin-bottom:12px}
.cam-stage video{width:100%;height:100%;object-fit:cover}
.cam-msg{position:absolute;inset:0;color:#cbd5e1;font-size:13px;padding:20px;
  text-align:center;display:flex;flex-direction:column;align-items:center;justify-content:center;
  gap:10px;line-height:1.45}
.cam-msg-icon{display:flex;align-items:center;justify-content:center;width:46px;height:46px;
  border-radius:14px;background:rgba(255,255,255,.08);font-size:21px;filter:grayscale(1)}
.cam-ctrl{display:flex;align-items:center;gap:14px;flex-wrap:wrap;margin-bottom:12px}
.modal .cam-ctrl label{display:flex;align-items:center;gap:9px;font-size:11px;
  font-weight:700;color:var(--muted);flex:1;min-width:180px;margin:0;
  text-transform:uppercase;letter-spacing:.06em}
.modal .cam-ctrl input[type=range]{display:block;flex:1;width:auto;height:18px;margin:0;
  padding:0;border:0;background:transparent;accent-color:var(--accent)}
.cam-row svg{width:17px;height:17px;fill:none;stroke:currentColor;stroke-width:1.6;
  stroke-linecap:round;stroke-linejoin:round;flex:none}
.cam-row .newbtn{padding:0 17px}
.cam-import{min-width:164px}

/* ===== Visibilite photo client (v0.29) ===== */
.modal .cam-vis{display:flex;align-items:center;gap:11px;margin:2px 0 0;padding:11px 13px;
  border:1px solid var(--line);border-radius:10px;background:var(--surface2);
  text-transform:none;letter-spacing:normal;color:var(--text)}
.modal .cam-vis input[type="checkbox"]{width:18px;height:18px;margin:0}
.cam-vis span{display:flex;flex-direction:column;gap:2px;min-width:0}
.cam-vis b{font-size:12.5px;font-weight:700;color:var(--text)}
.cam-vis small{font-size:11.5px;line-height:1.35;font-weight:400;color:var(--muted)}
/* Sans camera, les reglages deviennent sans objet, la grande zone noire se
   resserre et l'import prend naturellement la place d'action principale. */
.cam-modal.is-unavailable .cam-stage{aspect-ratio:auto;min-height:156px}
.cam-modal.is-unavailable .cam-ctrl{display:none}
.cam-modal.is-unavailable #camShot{display:none}
.cam-modal.is-unavailable #camImp{color:var(--on-accent);border-color:transparent;
  background:linear-gradient(135deg,var(--accent),var(--accent2));font-weight:700}
.cam-modal.is-unavailable #camImp:hover{filter:brightness(1.08);color:var(--on-accent)}
.cam-modal.is-busy .cam-stage::after{content:'';position:absolute;inset:0;
  background:rgba(13,20,24,.38);pointer-events:none}
@media (max-width:560px){
  .cam-modal{padding:17px}
  .cam-stage{aspect-ratio:1/1}
  .modal .cam-ctrl label{min-width:100%;width:100%}
  .cam-row{flex-wrap:wrap}
  .cam-row .btn,.cam-row .newbtn{flex:1 1 100%;width:100%}
}
.ph-vis{position:absolute;top:4px;left:4px;width:22px;height:22px;border:none;border-radius:99px;
  background:rgba(0,0,0,.5);color:#8794a1;font-size:12px;line-height:1;cursor:pointer;display:flex;
  align-items:center;justify-content:center}
button.ph-vis{cursor:pointer}
.ph-vis.on{color:#fff;background:var(--accent)}

/* ===== Fiche client 360 (v0.31) ===== */
.fc-head{display:flex;align-items:center;gap:10px;margin-bottom:10px}
.fc-head .back{margin-bottom:0}
.fc-title{display:flex;align-items:center;gap:10px;flex-wrap:wrap;margin-bottom:18px}
.fc-title h1{margin:0;font-size:24px}
.fc-title .fc-sub{flex-basis:100%;font-size:12.5px;color:var(--muted);margin-top:2px}
.fc-title .fc-sub b{font-family:'JetBrains Mono',monospace;color:var(--text)}
.fc-cards{display:grid;grid-template-columns:repeat(4,1fr);gap:14px;margin-bottom:16px}
.fc-card{background:var(--surface);border:1px solid var(--line);border-radius:14px;padding:16px}
.fc-card h3{margin:0 0 10px;font-size:12px;font-weight:800;text-transform:uppercase;letter-spacing:.05em;color:var(--muted)}
.fc-cardhead{display:flex;align-items:center;justify-content:space-between}
.fc-cardhead h3{margin-bottom:12px}
.fc-line{font-size:13.5px;color:var(--text);margin-bottom:5px}
.fc-add{border:1px solid var(--line2);background:var(--surface2);color:var(--accent);width:22px;height:22px;
  border-radius:99px;cursor:pointer;font-size:15px;line-height:1;margin-left:8px}
.fc-contact{position:relative;padding:7px 0;border-bottom:1px solid var(--line);font-size:13px}
.fc-contact:last-child{border-bottom:none}
.fc-role{font-size:11px;color:var(--muted);background:var(--surface2);border-radius:99px;padding:1px 7px;margin-left:4px}
/* v0.157.0 : une commande contenant une demande hors catalogue arrive a
   0 EUR. La pastille ambre est la pour qu'on ne l'accepte pas sans la voir. */
.fc-role.warn{color:var(--amber);background:rgba(245,185,74,.14)}

/* ---------- postes de travail (v0.169.0) ---------- */
.ws-m{display:flex;flex-wrap:wrap;gap:6px;margin-top:4px}
.ws-mi{display:inline-flex;align-items:center;gap:5px;font-size:12.5px;
  border:1px solid var(--line2);border-radius:99px;padding:3px 10px;cursor:pointer}
.ws-mi input{width:auto;margin:0}
.ws-h{display:flex;gap:7px;margin-top:6px}
.ws-h .hzN{flex:0 0 150px}
.ws-h .hzA{flex:1}
/* ---------- v0.174.0 : en-tete RGPD compact + barre d'enregistrement ---
   Le mot « Langue » retire (le menu se comprend seul) et le bouton
   Enregistrer remonte en haut du bloc, ou il RESTE visible pendant
   qu'on defile : huit zones de texte ne tiendront jamais dans un
   ecran, autant que le bouton ne se derobe pas. */
.gd-lang{width:auto;min-width:74px}
/* v0.176.2 : la barre ne fait plus que la hauteur de son etiquette. Le
   bouton y est pose en ABSOLU : il ne pousse donc pas le contenu vers le
   bas, et la carte de droite demarre exactement au meme niveau que la
   premiere liste de gauche. C'etait la « bizarrerie » de decalage. */
.gd-right{padding-top:15px;box-sizing:border-box}
.gd-bar{position:sticky;top:0;z-index:2;display:flex;align-items:center;
  background:var(--card);border-bottom:1px solid var(--line);
  margin:-14px -14px 12px;padding:4px 14px;min-height:34px}
.gd-bar .newbtn{position:absolute;right:12px;top:4px;transform:none;
  box-sizing:border-box;height:34px;padding:0 16px;font-size:12px}
.gd-upd{font-weight:400;letter-spacing:0;text-transform:none;color:var(--faint)}
/* Objectifs : la liste la plus longue, on lui donne la place disponible. */
/* v0.176.0 : encore plus haut - c'est la liste ou l'on cherche, et
   14 objectifs tiennent desormais sans defiler. */
.gd-col.tall .gd-box{max-height:420px}
.tf-row.off{opacity:.55}
/* Initiales du technicien dans la liste du personnel. Une place fixe
   meme quand la personne n'en a pas : sinon les noms ne s'alignent
   plus d'une ligne a l'autre. */
.st-ini{flex:0 0 30px;font-family:ui-monospace,Menlo,monospace;font-size:11px;
  font-weight:700;color:var(--accent2);letter-spacing:.04em}
.st-ini.nt{color:transparent}
/* v0.179.0 : les droits reels de la personne, en lecture seule. */
/* v0.192.0 : l encart des droits ne coupe plus. Il etait a flex:1.1 et
   « Proprietaire (tous les droits) » n y tenait pas. */
.st-rights{border:1px solid var(--line2);border-radius:8px;padding:8px 11px;
  font-size:13px;background:var(--surface2);min-height:38px;box-sizing:border-box;
  white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.tf-r.ok{background:rgba(46,125,91,.14);color:var(--accent)}
/* ---------- v0.175.0 : analyse de risque et actions ---------- */
.gr-c .gd-split{gap:12px}
/* Crochets JS de l'analyse de risque : declares pour que le controle
   « toute classe utilisee existe » reste vrai. */
.grCat,.grSave,.grDel,.grRisk,.grMeans,.grPlan{}
.gt-done{opacity:.55}
.gt-done td:nth-child(3){text-decoration:line-through}
/* v0.196.0 : le lien vers la corbeille, discret a cote du filtre. */
.lnk{color:var(--accent);text-decoration:none;font-weight:600}
.lnk:hover{text-decoration:underline}
.tzR{}
/* ---------- fenetre de signature (v0.194.0) ----------
   Une croix en haut a droite plutot qu un bouton « Fermer » en bas :
   renoncer n est pas une action, ca n a pas sa place dans la barre
   des actions. Et les deux boutons de gauche ont la meme hauteur. */
.sig-m{position:relative}
.modal-x{position:absolute;top:10px;right:12px;border:0;background:none;
  color:var(--faint);font-size:22px;line-height:1;cursor:pointer;padding:2px 6px}
.modal-x:hover{color:var(--text)}
.sig-m .btn.bsm2{height:36px;padding:0 14px;font-size:12.5px}
.sig-m label.btn.bsm2{display:inline-flex;align-items:center}
/* v0.198.0 : le motif de refus Flowin, en clair et selectionnable.
   .err-s existe deja dans sa.html pour la console SA ; l app du labo
   ne l avait pas. */
.err-s{font-family:ui-monospace,Menlo,monospace;font-size:11px;color:var(--muted);
  white-space:pre-wrap;background:var(--surface2);border:1px solid var(--line2);
  border-radius:8px;padding:9px 11px;overflow:auto;user-select:text}
/* v0.201.0 : le retour en haut. L'apercu de la facture fait defiler la
   page vers le bas ; sans ce bouton, il faut remonter a la main. Il ne
   se montre QUE lorsqu'on a reellement defile. */
/* v0.214.0 — ecran de maintenance. Volontairement DIFFERENT de
   l'ecran des impayes (.dun-lock) : fond clair, pas de cadenas, pas de
   rouge. Une mise a jour de dix minutes n'est pas une suspension. */
.maint-lock{position:fixed;inset:0;z-index:9999;display:flex;align-items:center;
  justify-content:center;background:var(--bg);padding:24px}
.maint-c{max-width:460px;text-align:center;background:var(--surface);
  border:1px solid var(--line);border-radius:18px;padding:38px 32px}
.maint-i{color:var(--accent);margin-bottom:14px}
.maint-c h1{margin:0 0 10px;font-size:22px}
.maint-m{margin:0 0 12px;font-size:14.5px;color:var(--text)}
.maint-h{margin:0;font-size:12.5px;color:var(--muted);line-height:1.5}
.maint-dots{display:flex;gap:6px;justify-content:center;margin-top:18px}
.maint-dots i{width:7px;height:7px;border-radius:50%;background:var(--accent);
  opacity:.3;animation:maintb 1.2s infinite}
.maint-dots i:nth-child(2){animation-delay:.2s}
.maint-dots i:nth-child(3){animation-delay:.4s}
@keyframes maintb{0%,80%,100%{opacity:.25}40%{opacity:1}}
/* v0.215.0 : inverse - fond accent, fleche blanche. */
/* v0.262.0 : z-index remonte a 120. A 60, elle passait sous les barres
   collantes de certains ecrans — meme presente, on ne la voyait pas. */
.totop{position:fixed;right:22px;bottom:22px;z-index:120;width:44px;height:44px;
  border-radius:50%;border:1px solid var(--accent);background:var(--accent);
  color:var(--on-accent);font-size:20px;line-height:1;cursor:pointer;
  box-shadow:0 6px 20px rgba(0,0,0,.18);display:none;align-items:center;
  justify-content:center;padding:0}
.totop.on{display:flex}
.totop:hover{filter:brightness(1.08)}
/* v0.202.0 : la colonne Portail tient en UN bouton. Ma version de la
   0.201.0 mettait une pastille A COTE du bouton : deux objets de largeurs
   differentes par ligne, et la colonne partait en dents de scie.
   Le bouton porte l'etat lui-meme - vert plein quand l'acte est au
   portail. Une largeur, une chose a regarder. */
.pa-btn{min-width:96px;height:30px;min-height:30px;justify-content:center}
.btn.bsm2.pa-btn.on{background:var(--accent);border-color:var(--accent);
  color:var(--on-accent);font-weight:700}
.btn.bsm2.pa-btn.on:hover{filter:brightness(1.06)}
.pa-ro{font-size:11px;color:var(--muted)}
.pa-ro.on{color:var(--accent);font-weight:700}
/* v0.201.0 : le type de client, reconnaissable d'un coup d'oeil. */
/* v0.210.0 : l'icone est un SVG trace, pas un emoji ni une lettre.
   vertical-align:middle cale la pastille sur le milieu du texte, quelle
   que soit sa taille - le titre de la fiche est bien plus gros que la
   ligne d'une carte, et un decalage en pixels ne pouvait pas convenir
   aux deux. */
/* v0.212.0 : plus de pastille pleine - l'icone est un trait, dans la
   couleur du type. Le carre saturé faisait « cheap » et rendait tres
   visible le moindre defaut de centrage du trace. */
.co-chip{display:inline-flex;align-items:center;gap:7px}
.co-chip .co-n{font-weight:700;color:var(--text)}
.co-chip .co-h{font-family:'JetBrains Mono',monospace;font-size:11px;color:var(--muted)}
.co-chip .co-time{font-family:'JetBrains Mono',monospace;font-size:11px;
  background:var(--surface);border:1px solid var(--line2);border-radius:6px;
  padding:2px 5px;outline:none;color:var(--text)}
.co-chip .co-time:focus{border-color:var(--accent)}
.pstep-bar{display:flex;align-items:center;gap:12px;margin-top:12px;flex-wrap:wrap}
/* Le bouton-lien du classeur : .lnk:hover ajoutait un soulignement que
   rien d'autre ne porte, parce que sa regle arrive APRES a.newbtn. */
/* v0.214.1 — j'ai empile deux corrections sur « newbtn lnk » avant de voir
   l'evidence : ces trois boutons n'ont AUCUNE raison de porter .lnk. La
   classe est retiree du HTML, les rustines partent avec. a.newbtn suffit :
   il annule le soulignement et cale l'element, et .newbtn donne la bonne
   couleur de texte. Une contradiction ne se corrige pas, elle se supprime. */
.ct-ico{display:inline-flex;align-items:center;justify-content:center;margin-right:8px;flex:none;line-height:0;vertical-align:middle}
/* v0.215.0 : la taille de l'icone est posee ICI et pas en attribut. La regle
   globale « svg{width:100%} » quelques lignes plus haut bat n'importe quel
   width="27" ecrit dans la balise - c'est pour ca que mes quatre changements
   de taille successifs n'ont rien donne a l'ecran. */
.ct-ico svg{display:block;width:25px;height:25px;flex:none}
/* v0.206.0 : pastille lettree au lieu d'un emoji. Trois couleurs qui
   restent lisibles en noir et blanc a l'impression. */
.ct-priv{color:#5C6B62}
/* Les classes de couleur servent aussi aux compteurs de l'en-tete. Leur
   fond ne doit jamais contaminer le pictogramme de type du client. */
.ct-ico.ct-dent,.ct-ico.ct-lab,.ct-ico.ct-priv{background:transparent}
/* ---------- statut AFMPS du client (v0.191.1) ----------
   Une ligne, centree sur celle du menu « Type de client ». Plus de case
   a cocher : la regle est certaine, elle n'a pas a etre confirmee. */
.afx{display:flex;align-items:center;gap:10px;flex-wrap:wrap;padding-bottom:9px}
.afx-p{font-size:11px;font-weight:800;border-radius:99px;padding:5px 12px;
  letter-spacing:.02em;white-space:nowrap}
.afx-p.on{background:rgba(46,125,91,.14);color:var(--accent)}
.afx-p.off{background:var(--surface2);color:var(--muted)}
/* ---------- ligne utilisateur (v0.191.0) ----------
   Le menu de role se faisait couper au bord droit. La ligne s'enroule
   desormais par blocs entiers, et la zone d'action reste groupee. */
.usr-row{display:flex;gap:10px;align-items:center;flex-wrap:wrap;
  padding:9px 0;border-bottom:1px solid var(--line);font-size:13px}
.usr-row > .mono{min-width:190px}
/* v0.191.2 — LA CAUSE DU DECALAGE : .hint porte un margin-bottom:10px
   (utile en bloc, nefaste en ligne). Dans un flex centre, une marge
   basse sur UN enfant le remonte de la moitie par rapport aux autres.
   C'est ce qui faisait flotter « non rattache » au-dessus du reste.
   On neutralise TOUTES les marges des enfants de la ligne : aucune
   n'a de sens ici, et une seule oubliee suffit a tout decaler. */
.usr-row > *, .usr-act > *{margin-top:0;margin-bottom:0}
.usr-act{display:flex;gap:8px;align-items:center;flex-wrap:wrap;margin-left:auto}
/* Les menus etaient trop etroits : « member — travaux uniquement » ne
   tient pas dans 170 px. On donne une largeur MINIMALE et on les laisse
   grandir, plutot qu'une largeur fixe reglee au jugé. */
.usr-act .urole{min-width:270px;width:auto}
.usr-row .ugroup{min-width:165px;width:auto}
@media (max-width:1000px){ .usr-act{margin-left:0;width:100%} }
/* ---------- relance des impayes (v0.183.0) ----------
   La fenetre d'etape 1 ne se ferme QUE par le bouton : pas de croix,
   pas de clic sur le fond. C'est ce qui rend l'accuse incontestable. */
.dun-m{max-width:440px;text-align:center}
.dun-i{font-size:40px;line-height:1;margin-bottom:10px}
.dun-lock{position:fixed;inset:0;z-index:9999;background:var(--bg);
  display:flex;align-items:center;justify-content:center;padding:24px}
.dun-lc{max-width:520px;text-align:center;background:var(--card);
  border:1px solid var(--line2);border-radius:16px;padding:34px 30px}
/* ---------- graphes (v0.181.0) ----------
   Barres et lignes dessinees a la main : aucune bibliotheque. Le SVG
   s'imprime net et ne depend de rien. */
.ch-c{margin-bottom:12px}
.ch-2{display:grid;grid-template-columns:1fr 1fr;gap:12px}
.ch-bars{display:flex;flex-direction:column;gap:5px}
.ch-b{display:flex;align-items:center;gap:10px;font-size:12.5px}
.ch-l{flex:0 0 190px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:var(--text)}
.ch-t{flex:1;height:14px;background:var(--surface2);border-radius:99px;overflow:hidden}
.ch-t i{display:block;height:100%;border-radius:99px}
/* v0.259.0 : 150 -> 210 px et pas de retour a la ligne. « 29 549,99 EUR
   1470 travaux » ne tenait pas, et c'est le CHIFFRE qu'on lit, pas la
   longueur de la barre — elle est relative de toute facon. */
.ch-v{flex:0 0 210px;text-align:right;font-size:12px;white-space:nowrap}
.ch-svg{width:100%;height:auto;display:block}
.ch-x{font-size:10px;fill:var(--faint)}
.ch-n{font-size:9.5px;fill:var(--muted)}
.ch-share{display:flex;height:22px;border-radius:99px;overflow:hidden;margin:6px 0 10px}
.ch-share i{display:block;height:100%}
.ch-leg{display:flex;flex-wrap:wrap;gap:4px 14px;font-size:11.5px;color:var(--muted)}
.ch-leg i{display:inline-block;width:10px;height:10px;border-radius:3px;margin-right:5px;
  vertical-align:-1px}
@media (max-width:900px){ .ch-2{grid-template-columns:1fr} .ch-l{flex:0 0 120px} }
@media print{ .ch-c{break-inside:avoid;page-break-inside:avoid} }
/* ---------- listings (v0.180.0) ---------- */
.rp-t th{font-size:10px;text-transform:uppercase;letter-spacing:.06em;color:var(--faint);
  text-align:left;padding:6px 8px;border-bottom:1px solid var(--line2)}
.rp-t td.r,.rp-t th.r{text-align:right}
.rp-t tfoot td{border-top:2px solid var(--line2);font-weight:700;padding-top:8px}
.rp-t tbody tr:hover{background:var(--surface2)}
/* ---------- taxe AFMPS (v0.177.0) ---------- */
.ax-tot{display:grid;grid-template-columns:repeat(4,1fr);gap:12px;margin-bottom:14px}
.ax-tot > div{background:var(--card);border:1px solid var(--line2);border-radius:var(--r);
  padding:12px 14px}
.ax-tot span{display:block;font-size:10px;text-transform:uppercase;letter-spacing:.07em;
  color:var(--faint);margin-bottom:4px}
.ax-tot b{font-size:19px;font-family:ui-monospace,Menlo,monospace}
/* Le montant du est ce qu'on vient chercher : il se detache. */
.ax-tot .due{border-color:var(--accent);background:var(--accent-glow)}
.ax-tot .due b{color:var(--accent2)}
@media (max-width:900px){ .ax-tot{grid-template-columns:repeat(2,1fr)} }
/* ---------- registre RGPD (v0.173.0) ----------
   Trois listes en cascade a gauche, les huit colonnes a droite. */
/* v0.259.0 : les deux colonnes n'ont pas le meme travail a faire. A
   gauche, trois listes de choix — des noms courts, 1fr etait trop
   large. A droite, les huit colonnes du registre, avec du texte a
   ecrire : c'est elle qui manque de place.
   `align-items:start` laissait en plus les deux cadres a des hauteurs
   differentes ; `stretch` les aligne, ce que Jacob demande. */
/* v0.262.0 : 380 -> 475 px, soit les 25 % demandes. `align-items:stretch`
   etait deja pose mais ne suffit pas : il etire la CELLULE, pas la carte
   qu'elle contient. C'est la carte qu'il faut etirer, d'ou height:100%
   sur les enfants directs. C'est ce demi-centimetre d'ecart que Jacob
   voyait. */
.gd-split{display:grid;grid-template-columns:minmax(0,475px) minmax(0,1fr);
  gap:16px;align-items:stretch}
.gd-split > div{height:100%}

/* v0.263.0 : le haut du Planning reste visible pendant qu'on parcourt
   la journee. Le fond est OPAQUE : sans lui, les lignes defileraient en
   transparence sous le calendrier. */
.pl-fixe{position:sticky;top:0;z-index:12;background:var(--bg);
  padding-bottom:6px}
/* La recherche et le scanner, dans la barre du haut. */
.pl-find{display:flex;gap:6px;align-items:center;margin-right:8px}
.pl-find .pl-filter{width:230px;height:36px;box-sizing:border-box;margin:0}
/* v0.267.0 : le pictogramme du scanner etait a 15 px, cale a gauche par
   le rembourrage horizontal. Bouton CARRE et contenu centre : c'est la
   seule facon qu'un pictogramme seul tombe au milieu. */
.pl-find .btn{width:36px;padding:0;font-size:19px;display:flex;
  align-items:center;justify-content:center;line-height:1}
@media (max-width:1200px){.pl-find .pl-filter{width:150px}}
.gd-split > div{min-width:0}
.gd-cols{display:grid;grid-template-columns:1fr;gap:12px}
.gd-col .tf-lbl{margin-bottom:4px}
.gd-box{border:1px solid var(--line2);border-radius:8px;background:var(--surface);max-height:190px;overflow:auto}
.gd-row{display:flex;align-items:center;border-bottom:1px solid var(--line)}
.gd-row:last-child{border-bottom:0}
/* v0.265.0 : meme repere que les autres listes du produit — une barre
   a gauche, pas seulement un fond. Trois listes empilees dans la meme
   colonne : sans barre, on ne sait plus laquelle porte la selection
   courante quand les trois sont teintees. */
.gd-row.on{background:var(--accent-glow);box-shadow:inset 3px 0 0 var(--accent)}
.gd-row.on .gd-name{color:var(--accent2);font-weight:600}
.gd-name{flex:1;min-width:0;text-align:left;font:inherit;font-size:13px;color:var(--text);background:none;border:0;padding:7px 10px;cursor:pointer;overflow:hidden;text-overflow:ellipsis}
.gd-x{border:0;background:none;color:var(--faint);cursor:pointer;font-size:14px;padding:0 7px}
.gd-x:hover{color:var(--accent)}
.gd-add{margin-top:5px;border:1px dashed var(--line2);background:none;color:var(--muted);font:inherit;font-size:12px;border-radius:8px;padding:5px 12px;cursor:pointer}
.gd-add:hover{border-color:var(--accent);color:var(--accent)}
@media (max-width:1100px){ .gd-split{grid-template-columns:1fr} }
/* ---------- ecrans AFMPS : mise en page (v0.171.1) ----------
   J'avais utilise .row, .fbar et .fbtn. Les deux dernieres n'existent
   QUE dans le portail ; .row, lui, n'existe qu'IMBRIQUE (.modal .row,
   .fc-card .row) et n'est donc pas flex tout seul. Resultat : boutons
   nus et colonnes empilees. Ces deux classes-ci sont a moi, definies
   ici, et ne touchent a rien d'existant. */
.af-row{display:flex;gap:10px;align-items:flex-end;flex-wrap:wrap}
.cx-d{margin-top:2px}
/* Crochets JS, sans style : declares ici pour qu'un controle « toute
   classe utilisee existe-t-elle ? » reste vrai, et pour qu'on sache en
   les lisant qu'elles servent a selectionner, pas a habiller. */
.ws-c,.cx-c,.wsName,.wsSave,.wsDel,.wsM,.wsHz,.hzN,.hzA{}
.af-row > label{margin:0}
/* Liste a gauche, fiche a droite - au lieu de tout empiler.
   340 px : assez pour « Prothese conjointe ceramo-metallique » sans
   couper, sans voler la place de l'editeur. */
.af-split{display:grid;grid-template-columns:340px minmax(0,1fr);gap:14px;align-items:start}
/* v0.259.0 : la liste du Personnel etait a l'etroit — « Marco Martino
   Gestion Technique et administrative » se cassait en deux lignes. 340
   -> 420 px. La fiche a largement de quoi rendre ces 80 px. */
.st-split{grid-template-columns:420px minmax(0,1fr)}
/* v0.263.0 — LA LISTE DU PERSONNEL. */
.st-q{width:100%;margin:0 0 8px;height:34px;box-sizing:border-box}
/* Nom au-dessus, fonction en dessous : « Gestion Technique et
   administrative » ne tient pas a cote d'un nom, et la tronquer fait
   perdre ce qui distingue les gens. */
.st-nm{flex:1;min-width:0;display:flex;flex-direction:column;gap:1px;text-align:left}
.st-nm b{font-size:13px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.st-nm i{font-style:normal;font-size:11px;color:var(--muted);
  overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.st-row{align-items:center;padding-top:7px;padding-bottom:7px}
/* Les titres de section de la fiche : un pictogramme donne un point
   d'accroche a l'oeil dans un formulaire long. */
.st-sec{margin:16px 0 10px;display:flex;align-items:center;gap:8px;
  font-size:12px;text-transform:uppercase;letter-spacing:.07em;color:var(--accent2)}
.st-sec:first-child{margin-top:0}
.st-sec i{font-style:normal;font-size:14px;opacity:.85}
/* Les cases du Personnel héritaient de la taille générique des toggles
   d'administration et paraissaient plus grandes que tous les champs voisins. */
.st-form .tog{font-size:13px;line-height:1.25;white-space:nowrap}
.st-form .tog input{width:15px;height:15px;margin:0;flex:none}
/* v0.264.0 — LA ZONE DE TEXTE ENRICHI (AFMPS, RGPD).
   Elle ressemble a un champ pour qu'on comprenne qu'on peut ecrire
   dedans, et se comporte comme un document pour qu'on voie le rendu. */
/* La zone de saisie a une hauteur MAXIMALE : sans elle, une procedure
   de trois pages pousse le bouton Enregistrer hors de l'ecran et il
   faut defiler tout le texte pour l'atteindre. */
.rted{border:1px solid var(--line2);border-radius:0 0 10px 10px;background:var(--surface);
  padding:9px 11px;font-size:13px;line-height:1.5;overflow:auto;color:var(--text);
  max-height:42vh}
.rted:focus{outline:none;border-color:var(--accent)}
.rted ul,.rted ol{margin:4px 0 4px 20px}
.rtb{display:flex;gap:4px;align-items:center;border:1px solid var(--line2);
  border-bottom:none;border-radius:10px 10px 0 0;background:var(--surface2);
  padding:4px 6px;margin-top:4px}
.rtb-b{border:1px solid transparent;background:none;color:var(--muted);cursor:pointer;
  border-radius:99px;height:26px;min-width:26px;padding:0 8px;font-size:12px}
.rtb-b:hover{border-color:var(--line2);color:var(--text)}
/* v0.265.0 : les boutons d'action de la fiche travail portent leur NOM.
   Cinq icones cote a cote se ressemblent toutes ; « Supprimer » et
   « Dupliquer » ne sont pas des gestes qu'on veut confondre. Le mot
   passe AVANT l'icone : c'est lui qu'on lit. */
/* v0.265.0 : les titres de section du panneau Details prennent la meme
   forme que ceux du Personnel et du formulaire client — petites
   capitales en accent. Une seule convention de titre dans tout le
   produit : on sait ou l'on est sans lire. */
/* v0.266.0 — LE CATALOGUE EN PANNEAU FLOTTANT.
   Pas de voile : la note reste visible et vivante derriere, et chaque
   code ajoute s'y voit apparaitre. Le panneau se deplace par sa barre
   de titre et reste AU-DESSUS tant qu'on ne le ferme pas. */
.catpan{position:fixed;right:26px;top:96px;z-index:400;width:560px;max-width:92vw;
  max-height:74vh;display:flex;flex-direction:column;background:var(--surface);
  border:1px solid var(--line2);border-radius:14px;
  box-shadow:0 18px 48px rgba(0,0,0,.24)}
.catpan-h{display:flex;align-items:center;gap:10px;padding:9px 12px;
  border-bottom:1px solid var(--line);cursor:move;user-select:none;
  background:var(--surface2);border-radius:13px 13px 0 0}
.catpan-h b{font-size:13.5px}
.catpan-hint{font-size:11px;color:var(--faint);flex:1;
  overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.catpan-x{border:none;background:none;color:var(--muted);font-size:20px;
  line-height:1;cursor:pointer;padding:0 4px}
.catpan-x:hover{color:var(--rouge)}
.catpan-b{padding:10px 12px 12px;display:flex;flex-direction:column;
  gap:8px;overflow:hidden;flex:1;min-height:0}
.catpan-b #cq{width:100%;box-sizing:border-box}
.catpan-b #cl{overflow-y:auto;flex:1;min-height:0}
@media(max-width:760px){.catpan{left:8px;right:8px;width:auto}}
.grp > h3{font-size:12px;text-transform:uppercase;letter-spacing:.07em;
  color:var(--accent2);font-weight:700;margin:0 0 8px}
.toolbtn.big .tb-l{font-size:11.5px;font-weight:600;margin-right:6px}
.toolbtn.big{padding:0 12px;gap:0}
.toolbtn.big.danger .tb-l{color:var(--rouge)}
.rtb-c{width:30px;height:24px;border:1px solid var(--line2);border-radius:99px;
  background:none;cursor:pointer;padding:2px}
@media (max-width:1100px){.st-split{grid-template-columns:1fr}}
.af-split > div{min-width:0}
/* La colonne de gauche suit le defilement : sur 24 fiches, remonter
   chercher la suivante a chaque fois serait penible. */
.af-split > div:first-child{position:sticky;top:14px;max-height:calc(100vh - 90px);overflow:auto}
@media (max-width:1100px){
  .af-split{grid-template-columns:1fr}
  .af-split > div:first-child{position:static;max-height:340px}
}
/* ---------- dossier technique (v0.168.0) ---------- */
.tf-row{display:flex;align-items:center;gap:8px;width:100%;text-align:left;font:inherit;
  font-size:13px;color:var(--text);background:none;border:0;border-radius:8px;
  padding:8px 10px;cursor:pointer}
.tf-row:hover{background:var(--surface2)}
/* v0.265.0 : la ligne choisie porte une barre a gauche. Le seul fond
   colore se lit mal sur une liste longue — l'oeil doit comparer des
   teintes ; une barre se voit sans comparer. Le rayon passe a zero a
   gauche : un coin arrondi sur une bordure d'un seul cote fait un
   decrochement disgracieux. */
.tf-row.on{background:var(--accent-glow);color:var(--accent2);font-weight:600;
  border-left:3px solid var(--accent);border-radius:0 8px 8px 0;padding-left:7px}
.tf-r{margin-left:auto;font-size:10.5px;font-weight:700;border-radius:99px;padding:1px 7px;
  background:var(--surface2);color:var(--muted)}
.tf-r.r2{background:rgba(245,185,74,.18);color:var(--amber)}
.tf-r.r3{background:rgba(242,109,109,.16);color:var(--rouge)}
.tf-lbl{display:block;font-size:10.5px;font-weight:700;letter-spacing:.06em;
  text-transform:uppercase;color:var(--faint);margin-bottom:4px}
/* ---------- fil de discussion avec le cabinet (v0.164.0) ---------- */
.th-m{border-radius:var(--r-sm);padding:9px 12px;margin-bottom:8px;max-width:82%}
.th-m.me{background:var(--accent-glow);border:1px solid var(--accent);margin-left:auto}
.th-m.them{background:var(--surface2);border:1px solid var(--line2)}
.th-h{font-size:11px;color:var(--faint);margin-bottom:3px}
.th-h span{margin-left:6px}
.th-b{font-size:13.5px;line-height:1.45;white-space:pre-wrap}
.th-ph{display:block;margin-top:7px}
.th-ph img{max-width:200px;border-radius:8px;border:1px solid var(--line2);display:block}
.th-w{display:flex;gap:8px;align-items:flex-end;margin-top:12px}
.th-w textarea{flex:1;min-height:44px;resize:vertical}
/* ---------- commande recue, ligne restructuree (v0.163.0) ---------- */
.ord-top{display:flex;gap:10px;align-items:baseline;flex-wrap:wrap}
.ord-pat{font-size:15px}
.ord-cab{margin-top:3px;font-size:13px;color:var(--text);font-weight:600}
/* Les DEUX dates en noir et libellees : elles etaient grises au milieu
   d'une suite de « hint », donc indistinguables l'une de l'autre. */
.ord-dates{display:flex;gap:18px;flex-wrap:wrap;margin-top:4px;font-size:13px}
.ord-dates b{color:var(--text);font-weight:600}
/* Trois boutons de MEME forme : deux decisions symetriques ne peuvent pas
   avoir deux tailles et deux bordures differentes. */
.ord-act{display:flex;gap:8px;flex-wrap:wrap;margin-top:10px}
.ordb{font:inherit;font-size:12.5px;font-weight:600;padding:7px 14px;border-radius:99px;
  border:1px solid var(--line2);background:var(--surface);color:var(--text);cursor:pointer}
.ordb:hover{border-color:var(--accent)}
.ordb.ok{background:var(--accent2);border-color:var(--accent2);color:#fff}
.ordb.no{border-color:var(--rouge);color:var(--rouge)}
.ordb.no:hover{background:rgba(242,109,109,.1)}
.ordb:disabled{opacity:.5;cursor:default}
/* Vignettes : on VOIT la photo, on ne la telecharge plus pour la voir. */
.ordfiles{display:flex;gap:7px;flex-wrap:wrap;align-items:center}
.ord-th{display:block;width:62px;height:62px;border-radius:8px;overflow:hidden;
  border:1px solid var(--line2);background:var(--surface2)}
.ord-th img{width:100%;height:100%;object-fit:cover;display:block}
.ord-th:hover{border-color:var(--accent)}
.ord-fl{font-size:12px}
.photo-bg{cursor:zoom-out;padding:24px}
.photo-bg img{max-width:96vw;max-height:92vh;border-radius:10px;box-shadow:0 12px 40px rgba(0,0,0,.5)}
.op-t{width:100%;border-collapse:collapse;margin-top:8px;font-size:13px}
.op-t td{padding:5px 7px;border-bottom:1px solid var(--line)}
.fc-cdel{position:absolute;top:6px;right:0;border:none;background:none;color:var(--faint);cursor:pointer;font-size:15px}
.fc-cdel:hover{color:#C0392B}
/* v0.262.0 : de l'air entre l'etiquette et la valeur. Sur « Facturation »
   suivi d'un nom d'hopital sur trois lignes, les deux se touchaient et on
   ne savait plus ou finissait l'un et commencait l'autre. */
.fc-kv{display:flex;justify-content:space-between;gap:18px;font-size:13px;
  padding:4px 0;color:var(--muted)}
.fc-kv > span:first-child{flex:none}
.fc-kv > span:last-child{text-align:right;min-width:0}
.fc-kv b{color:var(--text)}
/* v0.267.0 — LES CHIFFRES ET LE RESUME SUR LA MEME RANGEE.
   Les cinq cartes passent en deux lignes de trois pour laisser un tiers
   de largeur au resume : elles ne portent qu'un nombre, elles tiennent
   sans peine. C'est le resume qui a besoin de place, avec son cercle. */
.fc-top{display:grid;grid-template-columns:minmax(0,1fr) minmax(250px,285px);gap:10px;
  align-items:stretch;margin-bottom:14px}
/* v0.267.1 : les cartes se RESSERRENT. A trois colonnes sur un ecran
   large, chacune faisait 370 px pour porter « 0,00 EUR » — un vide
   enorme a droite de chaque chiffre. `auto-fit` avec un minimum de
   165 px les met sur UNE ligne quand la place le permet, deux sinon,
   et chacune ne prend que ce qu'il lui faut. */
.fc-kpis{display:grid;gap:8px;margin:0;
  grid-template-columns:repeat(6,minmax(112px,1fr))}
.kpi{background:var(--surface);border:1px solid var(--line);border-radius:14px;
  padding:9px 11px;min-height:90px}
.kpi-l{font-size:11px;color:var(--muted);font-weight:600;margin-bottom:3px}
.kpi-v{font-size:18px;font-weight:800;letter-spacing:-.02em;color:var(--text)}
/* Le resume s'etire sur toute la hauteur des deux lignes de cartes. */
.fc-sum{margin:0;display:flex;flex-direction:column;justify-content:center;padding:9px 11px;min-height:90px}
.fc-sum .fc-sec{margin-bottom:4px}
.fc-sum .fc-donutwrap{gap:9px;display:grid;grid-template-columns:68px minmax(0,1fr)}
@media(max-width:1350px){.fc-kpis{grid-template-columns:repeat(3,minmax(135px,1fr))}}
@media(max-width:1100px){.fc-top{grid-template-columns:1fr}.fc-kpis{grid-template-columns:repeat(3,minmax(135px,1fr))}}
.kpi-s{font-size:11px;color:var(--muted);margin-top:3px}
/* v0.267.0 : c'est la COURBE qui occupe la droite depuis que le resume
   est remonte. Douze mois sur trois annees demandent de la largeur ;
   la liste des derniers travaux, elle, tient en cinq colonnes etroites.
   Les proportions s'inversent donc. */
/* v0.267.1 : la liste des derniers travaux est BORNEE et defile chez
   elle. Sans borne, 5 268 travaux finis etiraient la rangee sur toute
   la page et forcaient le graphe a s'etirer dans le vide. */
.fc-2col{display:grid;grid-template-columns:1fr 1.35fr;gap:14px;margin-bottom:16px}
.fc-2col .fc-tbl-wrap{max-height:340px;overflow-y:auto;margin:0 -4px;padding:0 4px}
/* L'en-tete du tableau reste visible pendant qu'on parcourt la liste :
   sans lui on ne sait plus quelle colonne porte quoi. */
.fc-2col .fc-tbl-wrap thead th{position:sticky;top:0;background:var(--surface);z-index:1}
.fc-quick,.fc-chip{font-size:11.5px}
.fc-quick{display:flex;gap:6px}
.fc-chip{background:var(--surface2);border:1px solid var(--line2);border-radius:99px;padding:2px 10px;color:var(--muted);font-weight:600}
.fc-tbl{width:100%;border-collapse:collapse;font-size:13px}
.fc-tbl th{text-align:left;font-size:10.5px;text-transform:uppercase;letter-spacing:.05em;color:var(--faint);
  font-weight:700;padding:6px 8px;border-bottom:1px solid var(--line)}
.fc-tbl td{padding:8px;border-bottom:1px solid var(--line)}
.fc-tbl .mono{font-family:'JetBrains Mono',monospace;font-size:12px;font-weight:700}
.fc-wrow{cursor:pointer}
.fc-wrow:hover td{background:var(--surface2)}
.fc-donutwrap{display:flex;align-items:center;gap:18px;flex-wrap:wrap}
/* Le cercle se resserre : il partage desormais la rangee du haut. */
.fc-donut{width:68px;height:68px;border-radius:99px;flex:none;display:flex;
  align-items:center;justify-content:center}
.fc-donut-c{width:51px;height:51px;border-radius:99px;background:var(--surface);display:flex;flex-direction:column;
  align-items:center;justify-content:center;font-size:15px;font-weight:800;color:var(--text)}
.fc-donut-c span{font-size:8px;font-weight:700;color:var(--muted);text-transform:uppercase}
.fc-legend{font-size:11px;min-width:0}
.fc-legend div{display:flex;align-items:center;gap:6px;padding:1px 0;color:var(--muted)}
.fc-legend i{width:11px;height:11px;border-radius:3px;flex:none}
.fc-legend b{color:var(--text);margin-left:auto}
.fc-noteadd{display:flex;gap:8px;margin-bottom:12px}
.fc-noteadd input{flex:1;border:1px solid var(--line2);background:var(--surface2);border-radius:9px;padding:9px 12px;font-size:13.5px;outline:none}
.fc-note{padding:8px 0;border-bottom:1px solid var(--line)}
.fc-note-b{font-size:13.5px;color:var(--text);margin-bottom:2px}
.fc-ndel{border:none;background:none;color:var(--faint);cursor:pointer;font-size:11px;text-decoration:underline}
.fc-ndel:hover{color:#C0392B}
@media (max-width:1100px){.fc-cards{grid-template-columns:repeat(2,1fr)}.fc-2col{grid-template-columns:1fr}}

/* ===== Evolution CA client (v0.33) ===== */
.yc-legend{display:flex;gap:16px;flex-wrap:wrap;font-size:12px;color:var(--muted);margin:8px 0 12px}
.yc-legend i{width:10px;height:10px;border-radius:3px;display:inline-block;margin-right:5px;vertical-align:-1px}
.yc-legend b{color:var(--text)}
/* v0.267.1 — LE GRAPHE REMPLIT SA CARTE.
   Il etait fige a 150 px de haut. Comme la carte s'etire pour egaler
   celle des derniers travaux, tout le reste devenait du BLANC — d'ou
   l'impression d'un graphe minuscule perdu au milieu.
   Il prend maintenant la place disponible, avec un plancher : douze
   groupes de trois barres sous 130 px ne se lisent plus. */
.yc-chart{display:flex;align-items:flex-end;gap:4px;flex:1;min-height:130px}
/* La carte devient une colonne : legende en haut, graphe qui s'etire. */
#fcYearly{display:flex;flex-direction:column}
#fcYearly .yc-legend{flex:none}
.yc-col{flex:1;display:flex;flex-direction:column;align-items:center;height:100%}
.yc-grp{flex:1;display:flex;align-items:flex-end;gap:2px;width:100%;justify-content:center}
.yc-bar{width:6px;border-radius:2px 2px 0 0;min-height:1px}
.yc-x{font-size:9px;color:var(--faint);margin-top:4px}

/* ===== Planning refonte (v0.39) ===== */
.pl-date{font-size:19px;font-weight:800;color:var(--text);line-height:1}
.pl-count{font-size:10.5px;color:var(--muted);font-weight:600;margin-top:4px}
.pl-cell.off .pl-date{color:var(--faint)}
.pl-cell{cursor:pointer;transition:background .12s}
.pl-cell.ok{background:rgba(46,160,110,.085)}
.pl-cell.warn{background:rgba(232,176,75,.15)}
.pl-cell.full{background:rgba(192,57,43,.19)}
.pl-cell.today{outline:2px solid var(--accent);outline-offset:-2px}
.pl-cell.sel{box-shadow:inset 0 0 0 2px var(--accent)}
.pl-cell:hover{filter:brightness(.97)}
.plrow{cursor:pointer;border-radius:8px;transition:background .1s}
.plrow:hover{background:var(--surface2)}
.pl-stat{cursor:pointer;transition:filter .1s}
.pl-stat:hover{filter:brightness(1.08);text-decoration:underline}

/* ===== Planning punch-list (v0.40) ===== */
.agd-head div{text-align:center}
.pl-legend{display:flex;align-items:center;gap:6px;font-size:12px;font-weight:600;color:var(--muted);margin:2px 0 12px}
.pl-legend .pl-dot{width:11px;height:11px}
.page-head{flex-wrap:wrap;row-gap:8px}
.modal .row .btn{border-radius:99px}

/* ===== Planning liste du jour (v0.42) ===== */
.pl-daycard{margin-top:14px}
.pl-dayhead{display:flex;align-items:center;justify-content:space-between;gap:12px;flex-wrap:wrap;margin-bottom:8px}
.pl-filter{border:1px solid var(--line2);background:var(--surface2);border-radius:99px;padding:7px 14px;
  font-size:12.5px;outline:none;min-width:240px}
.pl-filter:focus{border-color:var(--accent)}
/* v0.258.0 : la colonne des marqueurs de la ligne du jour. A place
   fixe, donc comparable d'une ligne a l'autre — c'est tout l'interet
   d'une colonne plutot que d'icones collees au texte. */
/* v0.258.0 : les trois couleurs du laboratoire. */
.labcol-row{display:flex;gap:12px;align-items:end;flex-wrap:wrap}
.labcol-i{display:flex;flex-direction:column;gap:4px;font-size:10px;font-weight:700;
  text-transform:uppercase;letter-spacing:.06em;color:var(--faint)}
.labcol-i input{width:32px;height:32px}
.labcol-theme-grid{display:grid;grid-template-columns:repeat(5,minmax(92px,1fr));gap:8px;max-width:620px}
.labcol-theme-item{min-width:0;padding:9px 10px;border:1px solid var(--line);border-radius:10px;
  background:var(--surface2);align-items:center;text-align:center;justify-content:space-between}
.labcol-theme-item span{font-size:9.5px;line-height:1.25;min-height:24px;display:flex;align-items:center;justify-content:center}
.labcol-theme-item input.color-pick{width:44px;height:34px;flex-basis:34px;border-radius:9px}
.labcol-actions{display:flex;gap:8px;align-items:center;margin-top:9px;flex-wrap:wrap}
@media(max-width:720px){.labcol-theme-grid{grid-template-columns:repeat(2,minmax(110px,1fr))}}
/* Un seul composant de couleur pour l'accent, les surfaces, les marqueurs,
   les départements et les types. Le navigateur ne doit plus leur appliquer
   cinq tailles et cinq remplissages natifs différents. */
input.color-pick{box-sizing:border-box;width:32px;height:32px;flex:0 0 32px;
  border:1px solid var(--line2);border-radius:8px;background:var(--surface);
  cursor:pointer;padding:2px;overflow:hidden}
input.color-pick::-webkit-color-swatch-wrapper{padding:0}
input.color-pick::-webkit-color-swatch{border:0;border-radius:5px}
input.color-pick::-moz-color-swatch{border:0;border-radius:5px}
input.color-pick:disabled{cursor:default;opacity:.65}
.pl-marks{display:flex;align-items:center;gap:4px;justify-content:flex-start}
.plm-dot{width:10px;height:10px;border-radius:99px;flex:none;
  box-shadow:0 0 0 1px rgba(0,0,0,.12)}
.plm-i{width:15px;height:15px;border-radius:99px;flex:none;font-style:normal;
  font-size:10px;font-weight:800;display:inline-flex;align-items:center;
  justify-content:center;line-height:1}
.plm-cp{background:rgba(192,57,43,.28);color:#a9251d;border-color:rgba(169,37,29,.42)}
.plm-sub{background:rgba(45,125,210,.14);color:#2D7DD2}
/* Sous-traitance EN COURS : le travail n'est pas chez nous, ca se voit. */
.plm-sub.open{background:#2D7DD2;color:#fff}
.plm-of{background:rgba(184,134,11,.18);color:#8a6410}
.plm-rd{background:rgba(120,80,160,.16);color:#6b4a94}
/* v0.262.0 : plus d'ascenseur interne quand la liste tient. Jacob :
   « enleve l'ascenseur, reduit un peu la hauteur ». Une hauteur MAXIMALE
   plus grande et des lignes plus courtes : la barre n'apparait que si la
   journee est vraiment chargee, et on voit trois lignes de plus. */
/* v0.263.0 — DOUZE LIGNES, PUIS ON DEFILE.
   Hier j'avais RESSERRE ces lignes pour en montrer plus ; Jacob demande
   maintenant de les aerer. Les deux se concilient parce que le
   calendrier ne defile plus : la place se prend ailleurs.
   La hauteur vaut douze lignes — mais jamais plus que ce que l'ecran
   laisse sous le calendrier, sinon sur un portable la liste sortirait
   par le bas et il faudrait defiler la page ENTIERE, ce qu'on vient
   justement d'empecher. `min()` prend la plus petite des deux. */
/* v0.267.0 — PLUS D'ASCENSEUR SUR LA FENETRE ELLE-MEME.
   Jacob a barre la barre de defilement de droite : la page entiere
   defilait encore, ce qui vide de son sens le calendrier fige.
   La reserve passe de 430 a 545 px — hauteur reelle du bloc fige plus
   l'en-tete de la liste — et le plafond de douze a DIX lignes. La page
   tient alors dans l'ecran, et seul le panneau du bas defile. */
.pl-daylist{max-height:min(calc(10 * 40px), calc(100vh - 545px));
  min-height:140px;overflow-y:auto;margin:0 -6px;padding:0 6px}
.pl-daylist > div{padding-top:8px;padding-bottom:8px}
.pl-daylist .plrow:nth-child(even){background:rgba(0,0,0,.015)}

/* ===== Signature conformite (v0.43) ===== */
.sig-pad{width:100%;max-width:380px;height:130px;border:1.5px dashed var(--line2);border-radius:10px;
  background:var(--surface);touch-action:none;cursor:crosshair;display:block}
.sig-actions{display:flex;gap:8px;margin-top:8px;flex-wrap:wrap}
.co-main{display:grid;grid-template-columns:minmax(0,2.4fr) minmax(310px,1fr);
  gap:16px;align-items:start}
.co-fields,.co-brand{min-width:0}
.co-brand{text-align:center}
.co-logo-prev{min-height:70px;display:flex;align-items:center;justify-content:center;
  border:1px dashed var(--line2);border-radius:10px;padding:8px;margin-bottom:8px}
/* Le logo et la signature finissent exactement sur les mêmes bords. Le
   canvas n'est plus limité par le max-width générique de .sig-pad. */
.co-brand .co-sig-pad{max-width:none;width:100%;height:150px;box-sizing:border-box}
.co-peppol-zone{margin:10px 0;padding:11px 12px;border:1px solid var(--line2);
  border-radius:11px;background:var(--surface2)}
.co-peppol-head{display:flex;align-items:center;justify-content:space-between;gap:10px;
  margin-bottom:9px;font-size:11px;text-transform:uppercase;letter-spacing:.06em;
  color:var(--faint)}
.co-peppol-head b{color:var(--text);font-size:12px}
@media(max-width:980px){.co-main{grid-template-columns:1fr}.co-brand{max-width:520px}}
.det .grp textarea[data-d="implant_info"]{min-height:54px}

/* ===== Planning liste : client/patient + type + tooltip (v0.44) ===== */
.pl-cli{display:flex;flex-direction:column;line-height:1.25;min-width:0}
.pl-cli b{color:var(--text)}
.pl-pat{font-size:11px;color:var(--muted);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.pl-type{font-size:11.5px;color:var(--muted);text-align:left;padding-left:2px}
.plan-tip{position:absolute;z-index:200;background:#1a2b33;color:#fff;font-size:12px;font-weight:500;
  padding:7px 11px;border-radius:8px;max-width:320px;line-height:1.5;white-space:pre-line;
  box-shadow:0 8px 24px rgba(0,0,0,.22);pointer-events:none;display:none}

/* ===== Mini-cal popover : definir la date (v0.48) ===== */
.mc-pop-set{display:flex;flex-direction:column;gap:5px;margin:8px 0 4px;padding-top:8px;border-top:1px solid var(--line);font-size:11px;color:var(--muted)}
.mc-pop-btn{border:1px solid var(--line2);background:var(--surface2);border-radius:8px;padding:6px 9px;font-size:12px;cursor:pointer;text-align:left;color:var(--text)}
.mc-pop-btn:hover{border-color:var(--accent);color:var(--accent)}

/* ===== VIES spinner (v0.51) ===== */
.vies-spin{display:inline-block;width:14px;height:14px;border:2px solid var(--line2);
  border-top-color:var(--accent);border-radius:50%;vertical-align:-1px;animation:viesspin .7s linear infinite}
@keyframes viesspin{to{transform:rotate(360deg)}}

/* ===== Journee : bandeau demain + pastille devis (v0.60) ===== */
.kalert.demain{background:rgba(94,162,247,.12);border-color:rgba(94,162,247,.4);color:#3a6ea5}
.kalert.urgent{background:rgba(242,109,109,.22);border-color:#C0392B;color:#8f1d13;font-weight:600;animation:dtShake .4s}
.kdevis{border:1px solid var(--violet);background:rgba(139,124,246,.12);color:var(--violet);
  font-weight:700;font-size:12.5px;border-radius:99px;padding:6px 14px;cursor:pointer;margin-left:2px}
.kdevis:hover{background:rgba(139,124,246,.2)}

/* ===== Financier : KPI + retard + actions (v0.61) ===== */
.fin-kpis{display:grid;grid-template-columns:repeat(3,1fr);margin:12px 0}
/* v0.302.0 - QUATRE TUILES SUR UNE SEULE LIGNE (demande de Jacob).
   `minmax(0,1fr)` et non `1fr` : sans le minimum a zero, un montant long
   comme 450 282,48 empeche la colonne de retrecir et la 4e tuile passe a
   la ligne. C'est le defaut classique des grilles CSS.
   La taille du chiffre baisse d'un cran : quatre nombres a six chiffres
   sur une ligne ne tiennent pas autrement. */
.fin-kpis.four{grid-template-columns:repeat(4,minmax(0,1fr))}
.fin-kpis.four .fin-kpi b{font-size:20px;letter-spacing:-.01em}
.fin-kpis.four .fin-kpi span{font-size:10px}
.fin-kpis.four .fin-kpi i{font-size:10px}
@media (max-width:1180px){.fin-kpis.four{grid-template-columns:repeat(2,minmax(0,1fr))}}
.fin-kpi{background:var(--surface2);border:1px solid var(--line);border-radius:12px;row-gap:3px}
/* v0.257.0 : le rappel « toutes periodes » sous le chiffre de la periode.
   Une dette de 2019 reste due meme quand on regarde 2026 : la masquer
   serait remplacer un chiffre inutile par un chiffre faux. */
/* v0.263.0 — CARTES PLUS BASSES. Jacob demandait de recuperer de la
   place : le chiffre passe de 26 a 21px et le rembourrage se resserre.
   Pas de pastille ronde a cote du libelle — c'est elle qui mange la
   largeur, pas le chiffre. Une barre de couleur a gauche suffit a
   distinguer les trois cartes. */
.fin-kpi i{font-style:normal;font-size:10.5px;color:var(--faint);font-weight:600}
.fin-kpis{gap:10px}
/* v0.325.0 : hauteur reprise sur le bloc du haut, validee sur l'essai 2.
   Le chiffre passe de 21 a 19 px et la pastille de 36 a 30 : les tuiles
   perdent environ un tiers de leur hauteur en restant lisibles. */
.fin-kpi{padding:8px 12px;border-left:3px solid var(--line2)}
.fin-kpi>b{font-size:19px}
.fin-kpi .kpi-ico{width:30px;height:30px;padding:6px}
.fin-kpi.late{border-left-color:var(--rouge)}
.fin-kpi.ok{border-left-color:var(--accent)}

/* La barre unique : statuts a gauche, periode a droite. */
.fact-bar{display:flex;align-items:center;gap:10px;flex-wrap:wrap;margin:8px 0 12px}
.fact-bar .tabs{margin:0}
.fact-per{display:flex;align-items:center;gap:6px;margin-left:auto;flex-wrap:wrap}
.fact-per .ginput{height:36px;box-sizing:border-box;width:auto;padding:0 8px}
.fact-arrow{font-style:normal;color:var(--faint)}

/* Les nouvelles colonnes de la ligne de facture. */
.invrow .idate{font-size:12px;color:var(--muted)}
.invrow .iech{display:flex;flex-direction:column;line-height:1.25}
.invrow .iech b{font-size:12.5px}
.invrow .iech b.ko{color:var(--rouge)}
.invrow .iech span{font-size:11px;color:var(--faint)}
.invrow .ilast{font-size:12px}
.invrow .ilast .muted{color:var(--faint)}
/* La date de paiement est un BOUTON : elle se corrige. */
.inv-paid{border:1px solid transparent;background:none;color:var(--accent);
  cursor:pointer;padding:3px 7px;border-radius:99px}
.inv-paid:hover{border-color:var(--accent);background:var(--accent-glow)}
/* Le numero de facture, plus marque : c'est lui qu'on cherche. */
/* v0.263.0 : le panneau d'ajout d'une facture en cours. */
.invadd{padding:10px 12px;margin-bottom:10px}
.invadd-r{display:flex;gap:8px;align-items:center;flex-wrap:wrap}
.invadd-r + .invadd-r{margin-top:8px;padding-top:8px;border-top:1px solid var(--line)}
.invadd-r .tf-lbl{min-width:118px;margin:0}
.invadd-r .ginput{height:34px;box-sizing:border-box}
.inv-head-spacer{flex:1}
.invadd-client{width:180px}
.invadd-work{flex:1;min-width:0}
/* v0.267.0 : la ligne se resserre — on gagne deux factures a l'ecran.
   Le nom de l'entite reste sur deux lignes quand il est long : c'est la
   seule chose qui distingue trois factures du meme hopital. */
/* v0.326.0 — LE GAP DES VENTES EST PROPRE A LEUR LIGNE, ET L'EN-TETE
   DOIT LE SUIVRE. J'ai aligne `.whead` sur `.wrow` en 0.325.0 — mais
   `.invrow` REDEFINIT le gap a 6 px pour ses dix colonnes serrees.
   L'en-tete gardait donc 14 px : l'ecart se creusait de 8 px a chaque
   colonne, et au bout de dix ca fait 80 px. C'est ce que Jacob voit —
   les achats tombent juste (ils gardent le gap de `.wrow`), les ventes
   partent en biais.
   LE GAP EST DONC ECRIT UNE SEULE FOIS pour les deux, sur un selecteur
   commun. Deux valeurs pour la meme grille, c'est la garantie de
   diverger a la premiere retouche. */
.invrow,.whead.wh-inv{gap:6px}
/* v0.327.0 — LE NUMERO COLLAIT AU NOM DU CLIENT.
   Jacob : « cree un espace entre le n° de facture et le nom, tres serre,
   l'un sur l'autre ; on n'aura jamais 99999-2026 donc on peut ».
   Le numero est aligne A DROITE : un rembourrage a droite le pousse vers
   la gauche, dans la place que la colonne a de reste. L'en-tete ne bouge
   pas — son libelle est aligne a gauche, il n'est pas concerne. */
.invrow .num{padding-right:11px}
/* v0.327.0 : « Date paiement ». Un tiret seul, cale a gauche sous un
   titre centre, se lit comme une donnee manquante d'une autre colonne. */
.invrow .ilast{text-align:center}
.invrow{padding-top:6px;padding-bottom:6px;align-items:start}
.invrow .cl b{font-size:12.5px;line-height:1.25}
.invrow .cl span{font-size:10.5px}
.invrow .num{font-size:13px;font-weight:700;color:var(--accent2);
  font-family:'JetBrains Mono',monospace}
/* v0.258.0 : une carte cliquable doit se voir cliquable. */
.fin-kpi.cliq{cursor:pointer}
.fin-kpi.cliq:hover{border-color:var(--accent)}
/* La periode, juste au-dessus des chiffres qu'elle commande. */
.fin-per{display:flex;gap:10px;align-items:end;flex-wrap:wrap;margin-top:10px}
.fin-per label{display:block;font-size:10px;font-weight:700;text-transform:uppercase;
  letter-spacing:.07em;color:var(--faint)}
.fin-per input{margin-top:4px}
.fin-kpi span{font-size:11px;color:var(--muted);text-transform:uppercase;letter-spacing:.05em}
.fin-kpi b{font-size:22px;font-weight:800}
.fin-kpi.late{border-color:rgba(192,57,43,.5);background:rgba(192,57,43,.07)}
.fin-kpi.late b{color:var(--rouge)}
.fin-kpi.ok b{color:var(--accent)}
.invrow.inv-late{background:rgba(192,57,43,.05)}
.inv-act{display:flex;gap:5px;align-items:center;justify-content:flex-end}
/* v0.256.0 : ramenee a la regle commune. Posee plus bas que la
   definition generale, c'est ELLE qui l'emportait — avec un rayon de
   7px et une hauteur libre. C'est la source du « une fois rond, une
   fois carre arrondi ». */
.btn.bsm{height:28px;padding:0 12px;font-size:11.5px;border-radius:99px}
.inv-paid{font-size:11px;color:var(--accent);font-weight:700}
@media (max-width:640px){.fin-kpis{grid-template-columns:1fr}}

/* ===== Planning semaine : drag & drop (v0.63) ===== */
.agchip{cursor:grab}
.agchip.dragging{opacity:.45}
.agday.agover{background:rgba(46,160,110,.10);outline:2px dashed var(--accent);outline-offset:-3px}

/* ===== Carte travail : menu ... + statut rapide (v0.64) ===== */
.wc-menu{margin-left:6px;border:none;background:transparent;color:var(--muted);font-size:17px;line-height:1;cursor:pointer;padding:0 3px;border-radius:6px}
.wc-menu:hover{background:var(--line2);color:var(--text)}
.cm-strow{display:flex;gap:5px;padding:2px 10px 9px;flex-wrap:wrap}
.cm-st{flex:1;min-width:64px;border:1px solid var(--line2);background:var(--surface2);color:var(--text);border-radius:8px;padding:6px 4px;font-size:12px;cursor:pointer}
.cm-st:hover{border-color:var(--accent)}
.cm-st.on{background:var(--accent);border-color:var(--accent);color:#fff;font-weight:700}

/* ===== Relevé éclaté par client (v0.72) ===== */
.brz-client{margin-bottom:16px}
.brz-chead{display:flex;align-items:center;gap:10px;padding:9px 8px;background:var(--surface2);border-radius:9px;margin-bottom:2px}
.brz-cname{flex:1;font-weight:700}
.brz-cn{font-size:11px;color:var(--muted);font-weight:600}
.brz-csub{color:var(--accent);font-weight:700;font-size:13px}
.brz-row{display:grid;grid-template-columns:26px 118px 1fr 84px 116px 92px;gap:10px;align-items:center;padding:7px 8px;border-bottom:1px solid var(--line);font-size:13px}
/* v0.251.1 : les titres de colonnes, sous chaque client. MEME gabarit
   que .brz-row — deux gabarits separes se decaleraient au premier
   changement de largeur, et les titres designeraient la mauvaise
   colonne. */
.brz-cols{display:grid;grid-template-columns:26px 118px 1fr 84px 116px 92px;gap:10px;
  align-items:center;padding:2px 8px 5px;font-size:10px;font-weight:700;
  text-transform:uppercase;letter-spacing:.05em;color:var(--muted)}
.brz-row:last-child{border-bottom:none}
/* v0.263.0 : MEME COULEUR QUE PARTOUT AILLEURS. Un numero de travail
   cliquable est en accent dans les Tournees (.tour-open) et dans les
   fiches ; ici seul il etait en bleu. Deux conventions pour la meme
   chose, c'est une de trop — et le bleu ne sert nulle part ailleurs
   pour un numero. */
.brz-open{color:var(--accent2);cursor:pointer;text-decoration:underline}
.brz-open:hover{color:var(--accent)}
.brz-inv{color:var(--accent);cursor:pointer;text-decoration:underline;font-family:'JetBrains Mono',monospace;font-size:12px;font-weight:600}
/* v0.252.1 : la colonne « Statut / facture » est centree, titre compris. */
.brz-row > span:nth-child(5){text-align:center}
.brz-cols > span:nth-child(5){text-align:center}
.brz-st{font-size:12px;padding:5px 7px;border:1px solid var(--line2);border-radius:7px;background:var(--surface);color:var(--text);width:100%}
@media(max-width:700px){.brz-row{grid-template-columns:24px 100px 1fr 100px 84px;}
  .brz-row .brz-open{grid-column:2}
  /* Sur petit ecran les titres prendraient une ligne entiere pour rien. */
  .brz-cols{display:none}}

.btn.danger{color:var(--rouge)}

.inv-rm{border:1px solid var(--line2);background:var(--surface);color:var(--rouge);cursor:pointer;font-size:14px;line-height:1;padding:4px 8px;border-radius:7px;opacity:1;vertical-align:middle}
.inv-rm:hover{background:rgba(242,109,109,.14);border-color:var(--rouge)}

/* ===== Facture : lignes libres + ajout (v0.86) ===== */
.inv-free-h{font-size:11px;font-weight:800;text-transform:uppercase;letter-spacing:.08em;color:var(--violet);padding:14px 0 4px}
.inv-free-row{display:grid;grid-template-columns:1fr 60px 80px 55px 55px 90px 66px;gap:8px;padding:5px 0;border-bottom:1px solid var(--line);font-size:12.5px;align-items:baseline}
.inv-free-num{text-align:right}
.inv-free-mut{color:var(--muted)}
.inv-free-total{font-weight:600}
.inv-free-act{display:flex;gap:5px;justify-content:flex-end}
.inv-ed{border:1px solid var(--line2);background:var(--surface);color:var(--accent);cursor:pointer;font-size:14px;line-height:1;padding:4px 8px;border-radius:7px}
.inv-ed:hover{background:var(--accent-glow);border-color:var(--accent)}
.inv-free-row.editing{align-items:center}
.inv-free-row.editing input,.inv-free-row.editing select{font:inherit;font-size:12.5px;padding:5px 7px;border:1px solid var(--line2);border-radius:7px;background:var(--surface);color:var(--text);width:100%;min-width:0}
.inv-addline{display:flex;gap:8px;align-items:center;margin-top:12px;flex-wrap:wrap;background:var(--surface2);padding:10px;border-radius:10px}
.inv-addline input,.inv-addline select{font-size:13px;padding:8px 10px;border:1px solid var(--line2);border-radius:8px;background:var(--surface);color:var(--text)}
.inv-addline input#ilQty{width:64px}.inv-addline input#ilPu{width:92px}.inv-addline input#ilDisc{width:62px}
.ial-code{position:relative;flex:1;min-width:220px}
.ial-code input{width:100%}
.ac-sug{position:absolute;top:calc(100% + 4px);left:0;right:0;z-index:30;background:var(--raise);border:1px solid var(--line2);border-radius:10px;box-shadow:0 10px 30px rgba(0,0,0,.22);max-height:260px;overflow:auto}
.ac-item{padding:9px 11px;cursor:pointer;font-size:12.5px;border-bottom:1px solid var(--line)}
.ac-item:last-child{border-bottom:none}
.ac-item:hover{background:var(--surface2)}
.ac-price{float:right}

/* ===== Facture : lisibilite + apercu (v0.87) ===== */
.inv-cols{display:grid;grid-template-columns:1fr 60px 80px 55px 55px 90px;gap:8px;font-size:10px;font-weight:700;text-transform:uppercase;letter-spacing:.05em;color:var(--muted);padding:4px 0 4px 26px;border-bottom:2px solid var(--line2)}
.inv-cols span:not(:first-child){text-align:right}
.inv-wo{display:flex;align-items:center;gap:8px;padding:9px 11px;background:var(--surface2);border-left:3px solid var(--accent);border-radius:8px 8px 0 0;cursor:pointer}
.inv-wo .iwo-t{flex:1;font-size:12.5px;font-weight:800;color:var(--accent);letter-spacing:.02em}
.inv-wo-block{margin-top:12px}
.iwo-body{border-left:3px solid var(--accent);padding:2px 0 4px 23px}
.inv-line{display:grid;grid-template-columns:1fr 60px 80px 55px 55px 90px;gap:8px;padding:5px 0;border-bottom:1px solid var(--line);font-size:12.5px;align-items:baseline}
.inv-line span:not(:first-child){text-align:right}
.inv-line .mut{color:var(--muted)}
.inv-line .strong{font-weight:600}
.inv-line:last-child{border-bottom:none}
/* v0.316.0 : le cadre d'apercu et son separateur sont retires — l'apercu
   s'ouvre dans un autre onglet (demande de Jacob : deux jeux de totaux
   dans une meme colonne ne se scindent pas bien). La pastille du bouton
   ci-dessous sert toujours. */
/* Le retour de la fiche de travail, plus visible (demande de Jacob). */
.wo-topcal .back{font-weight:700;letter-spacing:.01em;background:var(--surface2);
  border:1px solid var(--line2);border-radius:99px;padding:4px 12px}
.wo-topcal .back:hover{border-color:var(--accent);background:var(--accent-glow)}
#invPreview.on{background:var(--accent);color:#fff;border-color:var(--accent)}
.inv-bill-name{font-weight:800}
.inv-meta{font-size:12.5px;color:var(--muted)}
.inv-date-inline{display:inline-flex;align-items:center;gap:5px;color:inherit}
.inv-date-inline input{width:136px;height:30px;padding:3px 7px;border:1px solid var(--line2);
  border-radius:7px;background:var(--surface);color:var(--text);font:inherit}
.inv-wo .inv-edit-work,.inv-wo .inv-rm-work{height:32px;min-height:32px;display:inline-flex;
  align-items:center;justify-content:center;margin:0}
.inv-wo .inv-rm-work{width:36px;padding:0;font-size:18px;line-height:1}
.inv-lines{margin-top:12px}
.inv-work-count{margin:-4px 0 8px}
.inv-comment{margin-top:12px}
.inv-comment label{font-size:10px;font-weight:700;text-transform:uppercase;
  letter-spacing:.07em;color:var(--faint)}
.inv-comment textarea{display:block;width:100%;margin-top:5px;min-height:44px;resize:vertical}
.inv-print-comment{display:flex!important;align-items:center;gap:7px;margin-top:8px;font-size:12.5px!important;font-weight:400!important;text-transform:none!important;letter-spacing:0!important;color:var(--muted)}
.inv-discount{color:var(--rouge)}

/* ===== Facture : remise globale (v0.89) ===== */
.inv-gd{display:flex;align-items:center;gap:8px;margin-top:14px;padding:10px 12px;background:var(--surface2);border-radius:10px;font-size:13px;flex-wrap:wrap}
.inv-gd-l{font-weight:600;color:var(--muted)}
.inv-gd input[type=number]{width:70px;padding:7px 9px;border:1px solid var(--line2);border-radius:8px;background:var(--surface);color:var(--text)}
.inv-gd-auto{display:flex;align-items:center;gap:6px;color:var(--muted);font-size:12.5px}

/* ===== DENSITE EDITEUR (v0.102.33) : moins de scroll haut/bas =====
   Bloc ajoute en fin de fichier : ne modifie aucune regle existante.
   Uniquement des reductions de marges/paddings/hauteurs (pas de changement
   de structure de grille) -> a verifier visuellement sur staging. ===== */
.fbar2{margin-bottom:8px}
.wo-card{padding:12px 14px}
.wo-card .headwrap{gap:14px}
.wo-card .headright{gap:7px}
.hz input,.hz select{padding:5px 10px}
.odo-head{padding:2px 8px 0}
.odo-head svg{max-height:30px;margin:0 auto}
#tabActes>.card{padding:14px 16px}
.te-head{padding-bottom:3px}
.te-row .grip{padding:2px 0}
.te-row input,.te-row select,.te-row .ro{font-size:12px;}
.te-row .done-btn{width:18px;height:18px}
.te-row .lot-btn{padding:3px 5px}
.totals{margin-top:12px;padding-top:12px;gap:32px}

/* ==================================================================
   CONSOLIDATION v0.105.12
   Les 13 blocs correctifs empiles entre v0.104.0 et v0.105.11 ont ete
   nettoyes : 249 declarations MORTES supprimees (redeclarees plus loin
   par un selecteur strictement identique) et 63 regles devenues vides.
   AUCUNE regle n'a ete deplacee, aucun selecteur reecrit : la cascade
   est donc equivalente par construction. Verifie : 3725 declarations
   gagnantes avant, 3725 apres, 0 difference.
   Les en-tetes de version ci-dessous sont conserves : ils expliquent
   POURQUOI chaque regle existe, ce qu'un fichier compacte perdrait.
   ================================================================== */

/* ==================================================================
   v0.104.0 — NOUVELLE MISE EN PAGE DE L'EDITEUR DE TRAVAIL
   Bandeau a 4 blocs (calendrier / client-cabinet-patient /
   entree-sortie-coursier / bon-type-statut), puis odontogramme +
   marqueur avec les onglets et les actions sur la meme ligne.
   Les anciennes regles .wo-card .headwrap / .headright / .fbar2 ne
   matchent plus aucun element : elles sont laissees en place (mortes)
   pour pouvoir revenir en arriere en un seul remplacement de app.js.
   ================================================================== */
.head4{display:grid;grid-template-columns:238px minmax(0,1fr) minmax(0,1fr) minmax(0,.92fr);gap:8px;align-items:stretch;}
.head4 .stack{display:flex;flex-direction:column;height:100%;}
.head4 .f{min-width:0}
.flbl{display:block;font-size:9.5px;font-weight:700;text-transform:uppercase;
  letter-spacing:.06em;color:var(--faint);margin-bottom:1px}
.head4 .f-due{border-left:2px solid var(--amber);}
.head4 .hz{min-width:0;}
.head4 .hz input,.head4 .hz select{width:100%}
.head4 .blk-cal .minical{width:100%;max-width:none;margin:0;border:none;background:none;padding:0}

.ctxrow{display:flex;gap:8px;flex-wrap:wrap;align-items:stretch;}
.odo-card{min-width:0;}
.odo-card .odo-head svg{display:block;width:100%;}
.mark-card{min-width:460px;display:flex;flex-direction:column;}
.markhead{display:flex;align-items:center;gap:14px;flex-wrap:wrap}
.markhead .pastels.mini{display:flex;width:auto;}
.markrow{display:flex;gap:10px;flex-wrap:wrap;}
.markrow .dtabs{display:flex;}
.markrow .dtabs button{flex:0 0 88px;text-align:center}
.markrow .actions{display:flex;align-items:center}

/* charge du labo : fond teinte au lieu d'un filet, compteur lisible */
.minical .mc-d.ok{color:var(--accent2);}
.minical .mc-d.warn{color:var(--amber);}
.minical .mc-d.full{color:var(--rouge);}
.minical .mc-d em{font-size:9.5px;opacity:1}
.minical .mc-d .mc-bar{display:none}
.minical .mc-d.cur{background:var(--accent2);color:#fff}
.minical .mc-d.cur em{color:rgba(255,255,255,.8)}

/* colonnes du tableau : toutes elastiques, plus de trou au milieu */
.te-head,.te-row{gap:14px;}

@media (max-width:1240px){
  .head4{grid-template-columns:238px minmax(0,1fr) minmax(0,1fr)}
  .head4 .blk:last-child{grid-column:2/4}
}
@media (max-width:1000px){
  .head4{grid-template-columns:1fr 1fr}
  .head4 .blk-cal{order:3;grid-column:1/3}
  .head4 .blk:last-child{grid-column:auto}
  .mark-card{min-width:0;flex:1 1 100%}
}
@media (max-width:620px){
  .head4{grid-template-columns:1fr}
  .head4 .blk-cal{grid-column:auto}
  .markrow .dtabs{flex-wrap:wrap}
  .markrow .dtabs button{flex:1 1 auto}
}

/* banniere de mise a jour — barre pleine largeur en haut (v0.104.5,
   reprise du modele Smilo : couleur franche, version affichee, bouton
   plein, croix ronde). */
.upd-banner{position:fixed;top:0;left:0;right:0;z-index:9000;
  display:flex;align-items:center;justify-content:center;gap:14px;
  background:var(--accent);color:var(--on-accent);
  padding:11px 56px 11px 18px;font-size:13.5px;font-weight:500;
  transform:translateY(-100%);will-change:transform;
  transition:transform 2500ms cubic-bezier(.22,.61,.36,1);
  box-shadow:0 2px 14px rgba(0,0,0,.14)}
.upd-banner.show{transform:translateY(0)}
.upd-banner .upd-ico{flex:none;width:17px;height:17px;opacity:.9}
.upd-banner .upd-txt{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.upd-banner .upd-go{flex:none;background:var(--surface);color:var(--accent2);
  border:none;border-radius:9px;padding:7px 18px;font:inherit;font-weight:600;
  cursor:pointer;box-shadow:0 1px 3px rgba(0,0,0,.12)}
.upd-banner .upd-go:hover{filter:brightness(.96)}
.upd-banner .upd-x{position:absolute;right:14px;top:50%;transform:translateY(-50%);
  width:26px;height:26px;border:none;border-radius:50%;cursor:pointer;
  background:rgba(255,255,255,.22);color:var(--on-accent);
  font-size:17px;line-height:1;display:flex;align-items:center;justify-content:center;padding:0}
.upd-banner .upd-x:hover{background:rgba(255,255,255,.34)}
@media (max-width:640px){
  .upd-banner{gap:10px;padding:10px 46px 10px 12px;font-size:12.5px}
  .upd-banner .upd-go{padding:6px 12px}
}
@media (prefers-reduced-motion:reduce){
  .upd-banner{transition-duration:.01ms}
}

/* ==================================================================
   v0.104.4 — FINITION de la mise en page (le 0.104.0 posait la
   structure, les elements avaient garde leur habillage d'origine).
   ================================================================== */

/* 1. Champs du bandeau : valeur en texte, plus de boite dans la boite.
   L'encadre reapparait au survol et a la saisie, pour qu'on sache
   toujours que c'est modifiable. */
.head4 .hz{background:none;border:1px solid transparent;border-radius:7px;margin:0 -6px}
.head4 .hz:hover{border-color:var(--line)}
.head4 .hz:focus-within{background:var(--surface2);border-color:var(--accent)}
.head4 .hz select{appearance:none;-webkit-appearance:none}
.head4 .hz .inlbl{display:none}
.head4 .wo-ref-edit{background:var(--surface2);border-radius:7px;}
.head4 .blk-cal{padding:7px 9px}

/* 2. Odontogramme : le max-width:620px de .odo bridait le SVG au milieu
   d'une carte plus large -> dents minuscules et grands vides lateraux.
   Ici il occupe toute la carte, donc les dents grandissent. */
.odo-card .odo{max-width:none;margin:0}
.odo-card .odo-head{background:none;border:none;}
.odo-card .odo-head svg{max-width:none;max-height:none;margin:0}

/* 3. Barre d'actions : carres teintes, un par action, comme la maquette. */
.markrow .actions .toolbtn.big,.markrow .actions .newbtn{
  padding:0;display:inline-flex;align-items:center;
  justify-content:center;border:1px solid transparent;font-size:0}
.markrow .actions #wNew{background:var(--accent-glow);color:var(--accent2)}
.markrow .actions #wPrint{background:rgba(45,125,210,.10);color:#2D7DD2}
.markrow .actions #wPrintCert{background:rgba(45,125,210,.10);color:#2D7DD2}
.markrow .actions #wMail{background:rgba(122,107,217,.10);color:var(--violet)}
.markrow .actions #wDup{background:rgba(180,132,46,.12);color:var(--or)}
.markrow .actions #wLabSend{
  background:color-mix(in srgb,var(--accent) 14%,var(--surface));
  color:var(--accent2);
  border-color:color-mix(in srgb,var(--accent) 34%,var(--line))
}
.markrow .actions #wDelete{background:rgba(192,57,43,.09);color:var(--rouge)}
.markrow .actions .toolbtn.big:hover,.markrow .actions .newbtn:hover{filter:brightness(.94)}
.markrow .actions #openCat{width:auto;height:32px;padding:0 16px;font-size:12.5px;
  border-radius:99px;border:1px solid var(--line2);background:var(--surface);color:var(--muted)}
.markrow .dtabs button{padding:6px 0;width:92px;font-weight:500}

/* 4. Lignes plus compactes : c'etait le .te-row{padding:8px 0} d'une
   media query qui gonflait la hauteur. */
.te-row{padding:3px 0}
.te-row input,.te-row select,.te-row .ro{padding:1px 2px;line-height:1.2}
.done-btn{width:17px;height:17px}

.markrow .dtabs #openCat{width:auto;padding:6px 18px;border-radius:99px;border:1px solid var(--line2);background:var(--surface);color:var(--muted);font-size:12.5px;font-weight:500;cursor:pointer;}
.markrow .dtabs #openCat:hover{border-color:var(--accent);color:var(--text)}

/* v0.104.7 : le calendrier dictait la hauteur du bandeau (cases sur 2 lignes,
   6 rangees) et les 4 blocs faisaient 250px. Cases compactees -> ~180px. */
.head4 .blk-cal .mc-h{font-size:11.5px;}
.head4 .blk-cal .mc-w{font-size:8.5px}
/* les champs se repartissent sans s'ecarter : hauteur pilotee par le contenu */
.head4 .blk{align-self:stretch}

/* ==================================================================
   v0.104.8 — reglages demandes (1 a 6)
   ================================================================== */
/* 1 + 6 : plus d'air entre les champs, texte plus grand, cadres plus courts */
.head4 .stack{justify-content:flex-start;}
.head4 .flbl{font-size:10px;letter-spacing:.05em;}
.head4 .wo-ref-edit{font-size:15px;padding:3px 12px}
.head4 .st-sel{font-size:14px;padding:4px 12px}
.head4 .blk{padding:11px 15px}

/* 2 : plus d'icone calendrier dans les champs de date ; la sortie garde son
   liseré ambre et passe en gras, comme la maquette */
.head4 .f-due .hz input{font-weight:600}
.head4 .hz-out .hz-time,.head4 .dt-out .hz-time{font-size:13.5px;padding:1px 4px}

/* 3 : pastilles toutes a la meme taille, ecart identique */
.markhead .pastels.mini{gap:8px;align-items:center}
.markhead .pastels.mini .pastel,
.markhead .pastels.mini input[type=color].pastel,
.markhead .pastels.mini .pastel.none{width:19px;height:19px;border-radius:50%;padding:0;flex:none}

/* 4 : les icones d'action calees a droite */
.markrow{align-items:center}

/* 5 : le mois sans cadre, en gras */
.head4 .blk-cal .mc-nav{border:none;background:none;color:var(--muted)}

/* calendrier encore un peu resserre pour compenser l'air ajoute aux champs */
.head4 .blk-cal .mc-grid{gap:2px}
/* v0.210.0 : padding regle par Jacob dans F12 (0 0 1px -> 3px 0 3px).
   ATTENTION : j'avais d'abord ajoute une regle identique plus haut dans
   le fichier - elle n'aurait rien fait, celle-ci arrivant apres l'aurait
   ecrasee. C'est CETTE ligne qu'il fallait changer. */
.head4 .blk-cal .mc-d{padding:3px 0px 3px;font-size:10px;line-height:1.05}
.head4 .blk-cal .mc-d em{font-size:8px}
.head4 .blk-cal .mc-h{margin-bottom:3px}

/* ==================================================================
   v0.104.8 — retours Jacob (1 a 7)
   ================================================================== */

/* 1. Champs plus aeres et texte plus grand : on a la place. */
.head4 .stack{gap:19px}
.head4 .hz input,.head4 .hz select{font-size:14.5px;padding:3px 6px}
.head4 .wtype{font-size:14.5px}
.head4 .flbl{margin-bottom:2px}

/* 2. Plus d'icones calendrier dans le bandeau ; la sortie se lit
   "date + heure" d'un trait, comme sur la v6. Le mini-calendrier du
   bloc 1 reste le moyen de poser la date de sortie. */
.head4 .hz input[type="date"]::-webkit-calendar-picker-indicator,
.head4 .hz input[type="time"]::-webkit-calendar-picker-indicator{display:none}

/* 3. Meme ecart entre les quatre pastilles. */
.markrow .dtabs{gap:8px}
.markrow .dtabs #openCat{margin-left:0}

/* 4. Icones calees en bas a droite de la carte. */
.mark-card .markrow{width:100%;}
.markrow .actions{margin-left:auto;}

/* 5. Le mois : pas de cadre, en gras. */
.head4 .blk-cal .mc-home{border:none;background:none;padding:0;font-weight:700;
  font-size:12.5px;color:var(--text)}
.head4 .blk-cal .mc-home:hover{color:var(--accent2)}

/* 6. Numero de bon et statut : cadres ramenes a leur contenu. */
.head4 .wo-ref-edit{width:auto;min-width:118px;max-width:100%}
.head4 .st-sel{width:auto;min-width:132px;max-width:100%}

/* 7. Charge du jour : teintes adoucies (trop marquees). */
/* v0.252.1 : 20 % MOINS pastel, a la demande de Jacob. On augmente
   l'opacite d'un cinquieme — .085 -> .102, .11 -> .132, .09 -> .108 —
   plutot que de changer les teintes : la couleur reste la meme, elle
   est juste moins delavee. C'est bien CETTE regle qu'il faut modifier,
   pas celle de la ligne 604 : celle-ci vient apres et l'emporte. */
.minical .mc-d.ok{background:rgba(46,125,91,.14)}
.minical .mc-d.warn{background:rgba(184,134,11,.18)}
.minical .mc-d.full{background:rgba(192,57,43,.15)}

/* v0.313.0 : `.wo-theme` est retiree avec son bouton. A la place, la
   premiere ligne de la carte du calendrier porte le retour et l'etat
   d'enregistrement — la barre du haut n'existe plus, et l'ecran gagne
   sa hauteur pour la liste des travaux. */
.wo-topcal{display:flex;align-items:center;gap:8px;margin-bottom:7px;min-height:18px}
.wo-topcal .back{margin:0;font-size:12.5px;line-height:1}
.wo-topcal #saveState{font-size:11px;color:var(--muted);line-height:1;white-space:nowrap}

/* ==================================================================
   v0.105.0 — retours Jacob (1 a 9)
   ================================================================== */

/* 1. Bouton Theme : meme arrondi que le reste, pas une gelule. */

/* 2 + 9. Les icones calendrier reviennent sur ENTREE et SORTIE : qui veut
   taper tape, qui veut choisir clique. L'heure se colle a la date. */
.head4 .calbtn{display:inline-flex;flex:none;padding:0 6px;color:var(--muted)}
.head4 .calbtn:hover{color:var(--accent2)}
.head4 .calbtn svg{width:15px;height:15px}
.head4 .hz-out{gap:0}
.head4 .hz-out #hDateOut{flex:0 1 auto;min-width:0;width:104px}
.head4 .hz-time{flex:0 0 auto;width:auto;text-align:left;}

/* 9. Hauteur de champ identique partout (client, cabinet, patient,
   entree, sortie, coursier). */
.head4 .hz{min-height:30px}
.head4 .hz input,.head4 .hz select{height:26px;line-height:26px}

/* 3. Le numero de bon et le statut font la meme longueur. */
.head4 .wo-ref-edit,.head4 .st-sel{width:180px;min-width:0;max-width:100%}

/* 4. Liseré sur ENTREE aussi, et 20% plus large sur les deux. */
.head4 .f-due{border-left-width:3px;padding-left:9px;margin-left:-3px}

/* 5. Chiffres des jours moins gras. */
.head4 .blk-cal .mc-d b{font-weight:500}

/* 6. Onglets et icones sur la MEME ligne mediane (plus d'escalier). */
.mark-card .markrow{align-items:center}
.markrow .actions{align-self:center}

/* 8. Marqueur passe SOUS les onglets et occupe la largeur. Le bouton
   "sans marqueur" gardait un double anneau quand il etait actif. */
.mark-card .markhead{margin-top:2px}
.pastel.none.on{box-shadow:none;border-color:var(--accent);transform:none}

/* 7. Totaux aeres : ils se serraient a droite alors que la place est a
   gauche. Ils s'etalent maintenant sur toute la largeur. */
#tabActes .totals{padding-left:6px;padding-right:6px;}
#tabActes .totals .tot{min-width:0}
#tabActes .totals .tot:first-child{margin-left:0}

/* ==================================================================
   v0.105.1 — retours Jacob (1 a 10)
   ================================================================== */

/* 3. Les icones calendrier ne s'affichaient pas : une regle
   .head4 .hz .calbtn{display:none} (3 classes) battait ma
   .head4 .calbtn (2 classes). Meme specificite ici, et plus bas
   dans le fichier -> elle gagne. */
.head4 .hz .calbtn{display:inline-flex;flex:none;color:var(--muted);}
.head4 .hz .calbtn:hover{color:var(--accent2)}
.head4 .hz .calbtn svg{width:16px;height:16px}

/* v0.270.0 — vue Production confidentielle.
   Le serveur retire deja les colonnes sensibles. L'interface suit la meme
   matrice : aucun champ vide ne suggere qu'un Technicien pourrait retrouver
   un client, un patient ou un montant en manipulant l'ecran. */
#main.production-privacy .head4 .blk:nth-child(2){display:none}
#main.finance-hidden .a-pu,
#main.finance-hidden .a-rem,
#main.finance-hidden .a-tva,
#main.finance-hidden .a-total,
#main.finance-hidden #tabActes .totals,
#main.finance-hidden #subNet{display:none!important}
#main.finance-hidden .te-head,
#main.finance-hidden .te-row{
  grid-template-columns:16px 64px minmax(180px,2.5fr) 46px minmax(52px,.5fr)
    minmax(70px,.7fr) 34px 40px 26px;
  grid-template-areas:"grip code lib dent qte tech done lot del";
}
#main.finance-hidden .a-grip{grid-area:grip}
#main.finance-hidden .a-dent{grid-area:dent}
#main.finance-hidden .a-code{grid-area:code}
#main.finance-hidden .a-lib{grid-area:lib}
#main.finance-hidden .a-qte{grid-area:qte}
#main.finance-hidden .a-tech{grid-area:tech}
#main.finance-hidden .a-done{grid-area:done}
#main.finance-hidden .a-lot{grid-area:lot}
#main.finance-hidden .a-del{grid-area:del}
@media (max-width:880px){
  #main.finance-hidden .te-head{display:none}
  #main.finance-hidden .te-row{
    grid-template-columns:16px 64px minmax(120px,1fr) 42px 44px 36px 26px;
    grid-template-areas:"grip code lib dent lot done del" "grip qte qte tech tech tech del";
  }
}
@media (max-width:560px){
  .modal-bg{padding:14px 10px}
  .modal{padding:18px;max-height:calc(100vh - 28px)}
  .modal > .row:last-child:has(> button) > .btn,
  .modal > .row:last-child:has(> button) > .newbtn,
  .modal > form > .row:last-child:has(> button) > .btn,
  .modal > form > .row:last-child:has(> button) > .newbtn{flex:1 1 auto}
}
.head4 .hz.dt-in .calbtn,.head4 .hz.dt-out .calbtn{color:var(--muted)}

/* 1. Cadenas client et bouton de reference patient : trop discrets. */
.head4 .cl-lock{padding:0 6px}
.head4 .cl-lock span{font-size:16px}
.head4 .refgen{font-size:17px;padding:0 6px}

/* 2. Meme lisere sur les deux dates, et plus de barre a gauche de
   l'heure : c'est l'icone montre native qui fait la separation. */
.head4 .hz-time{border-left:none!important;padding-left:2px!important}
.head4 .hz input[type="time"]::-webkit-calendar-picker-indicator{opacity:.5;cursor:pointer;}
.head4 .hz input[type="time"]::-webkit-calendar-picker-indicator:hover{opacity:.85}

/* 4. Colonne TVA deux fois moins large. */
.te-head,.te-row{grid-template-columns:16px 64px minmax(160px,2.2fr) 46px minmax(52px,.5fr)
  minmax(88px,.85fr) minmax(58px,.6fr) minmax(44px,.3fr) minmax(94px,.9fr) minmax(58px,.6fr)
  34px 40px 26px}

/* 6+7+8. Totaux : groupes sur la moitie droite, pas etales sur toute
   la largeur. */
#tabActes .totals{width:60%;margin-left:auto;justify-content:space-between;gap:16px}

/* 9. Icones d'action calees en bas a droite de la carte. */
.mark-card{position:relative}
.mark-card .markrow .actions{position:absolute;margin:0;}

/* 10. "MARQUEUR" au-dessus, pastilles en dessous ; et le X enfin
   centre (il heritait de l'alignement du texte, pas d'un centrage). */
.mark-card .markhead{flex-direction:column;align-items:flex-start;}
.pastel.none{display:inline-flex;align-items:center;justify-content:center;
  font-size:13px;line-height:1}

/* ==================================================================
   v0.105.2 — retours Jacob (1 a 3)
   ================================================================== */

/* 1. Icone calendrier AVANT la date (flex order), sur les deux champs. */
.head4 .hz .calbtn{order:-1;padding:0 7px 0 2px}

/* 2. L'heure est poussee a droite, precedee de son icone montre.
   L'indicateur natif est masque : c'est notre bouton qui ouvre le
   selecteur (showPicker), et il est a GAUCHE. */
.head4 .hz .timebtn{order:0;margin-left:auto;padding:0 5px 0 0}
.head4 .hz-time{order:0;margin-right:0!important;min-width:52px}
.head4 .hz input[type="time"]::-webkit-calendar-picker-indicator{display:none}

/* 3. Menu de codes : ouverture vers le HAUT quand il deborde en bas
   (classe .up posee par le JS apres mesure). */
.ac.up{top:auto;bottom:100%;margin-bottom:2px;
  box-shadow:0 -12px 34px rgba(0,0,0,.5)}

/* ==================================================================
   v0.105.3 — liseres des dates : MEME FORMAT, DEUX COULEURS
   Au delta precedent j'avais lu "meme type de barre" comme "meme
   couleur" : c'etait le FORMAT qu'il fallait aligner. L'entree portait
   son lisere sur le CHAMP (30px) et la sortie sur le BLOC entier
   (48px, etiquette comprise) -> une barre courte et une longue.
   Les deux portent maintenant sur le bloc, et font 4px.
   ================================================================== */
.head4 .hz-in{border-left:none;padding-left:0;margin-left:0}

/* ==================================================================
   v0.105.4 — GEOMETRIE UNIQUE des deux champs de date.
   Six regles concurrentes s'etaient accumulees sur .f-in / .f-due /
   .hz-in (2px, 3px, 4px, paddings differents) : d'ou les decalages.
   Ce bloc fixe TOUT explicitement des deux cotes, et rien d'autre ne
   doit venir apres.
   ================================================================== */
.head4 .f-in,.head4 .f-due{
  border-left-style:solid;border-left-width:5px;
  padding-left:11px;margin-left:-5px}
.head4 .f-in{border-left-color:var(--accent)}
.head4 .f-due{border-left-color:var(--amber)}

/* le champ ne rajoute plus le moindre decalage : tout est porte par le bloc */
.head4 .f-in .hz,.head4 .f-due .hz{
  border-left:none;padding-left:0;margin-left:0;gap:0}
.head4 .f-in .hz input,.head4 .f-due .hz input{padding-left:0}

/* meme boite d'icone des deux cotes -> les deux calendriers tombent
   exactement sur la meme verticale, et la date demarre au meme x */
.head4 .f-in .calbtn,.head4 .f-due .calbtn{
  order:-1;flex:none;margin:0;padding:0;width:26px;
  display:inline-flex;align-items:center;justify-content:flex-start}
.head4 .f-in .calbtn svg,.head4 .f-due .calbtn svg{width:16px;height:16px}

/* l'horloge et l'heure restent groupees a droite */
.head4 .f-due .timebtn{order:0;width:auto;margin-left:auto;padding:0 6px 0 0}

/* ==================================================================
   v0.105.7 — DEUX DEMANDES, RIEN D'AUTRE
   (annule et remplace mes v0.105.5 et v0.105.6, a jeter)
   ================================================================== */

/* 1. ECARTS ENTRE LES BLOCS
   Cause reelle : .card porte margin-bottom:16px pour TOUTES les cartes.
   Chaque bloc ajoutait donc 16px aux 8px que je mettais entre les
   sections = 24px. On neutralise la marge des cartes de l'editeur et on
   pilote l'ecart au niveau des sections uniquement. */
.head4 .card,.ctxrow .card{margin-bottom:0}
.head4{margin-bottom:10px}
.ctxrow{margin-bottom:10px}
#tabActes>.card{margin-bottom:10px}
#tabActes .summary{margin-bottom:10px}

/* 2. HAUTEUR DES DEUX CARTES : environ -25%
   La hauteur de l'odontogramme vient de la LARGEUR de sa carte (le SVG
   garde ses proportions). 620 -> 460px, plus des marges internes
   resserrees. Les dents suivent : elles perdent ~25% elles aussi,
   c'est la contrepartie assumee de ta demande. */
.odo-card .odo-head{margin:0;padding:0}

/* la carte de droite doit tenir dans la meme hauteur : contenu
   resserre, et la place des icones reservee en bas (elles sont en
   position absolue, sans reservation elles chevaucheraient). */
.mark-card{flex:1 1 560px;gap:7px;justify-content:flex-start;}
.mark-card .markhead{gap:5px}
.mark-card .markrow .dtabs button{padding:5px 0}
.mark-card .markrow .actions{bottom:7px;right:11px}
.markhead .pastels.mini .pastel{width:17px;height:17px}

/* ==================================================================
   v0.105.8 — odontogramme plus grand et cadrans aeres
   La hauteur suit la LARGEUR de la carte (le SVG garde ses
   proportions) : 460 -> 580px = dents de 22,5 a 28,6px de large,
   arcade de 41 a 52px, carte de ~112 a ~136px. On reste 10% sous la
   hauteur d'avant le resserrage, tout en gagnant 27% sur les dents.
   La separation des deux cadrans passe de 16 a 40 unites (cote JS).
   ================================================================== */
.odo-card{flex:0 1 580px;}
.odo-card .flbl{margin-bottom:3px}
.mark-card{padding:6px 12px 40px}

/* ==================================================================
   v0.105.9 — Cabinet et Coursier : valeur centree verticalement.
   Les deux sont des <select>. Ils heritaient de line-height:26px, or
   un select ne centre pas son texte sur la line-height comme le fait
   un input : le libelle se retrouvait pousse vers le haut. On rend la
   main au navigateur (line-height:normal) et on laisse le centrage se
   faire par la hauteur du controle.
   ================================================================== */
.head4 .hz select{line-height:normal;height:26px;padding-top:0;padding-bottom:0}
.head4 .hz{align-items:center}

/* ==================================================================
   v0.105.10 — odontogramme : rangees plus espacees, chiffres plus gros
   Le SVG du milieu (la ligne pointillee) porte l'ecart entre les deux
   arcades : on lui donne une marge verticale plutot que de toucher aux
   viewBox, qui commandent aussi le dessin des dents.
   ================================================================== */
.odo-card .odo-head svg:nth-of-type(2){margin:8px 0}
.odo-card{padding:8px 12px 10px}

/* chiffres des dents : 9,5 -> 11 unites SVG (ils grandissent avec
   l'arcade, donc ~13px reels a la taille actuelle de la carte) */
.odo-card .tooth .fdi{font-size:11px}

/* v0.116.0 : plaintes et reprises */
.cp-badge{font:inherit;font-size:12.5px;border:1px solid var(--line2);background:var(--surface);
  color:var(--muted);border-radius:99px;padding:4px 12px;cursor:pointer}
.cp-badge:hover{border-color:var(--accent)}
.cp-badge.on{background:rgba(192,57,43,.10);border-color:var(--rouge);color:var(--rouge);font-weight:600}
.cp-dot{color:var(--rouge);margin-left:5px;font-size:12px}
/* v0.250.0 : les deux marqueurs « offert » et « recommence ».
   Couleurs FIXES pour ce lot — vert pour le geste commercial, ambre pour
   ce qui a ete refait. Elles reprennent les variables du theme, donc
   elles suivront un changement de charte sans etre reecrites ici. */
.mk-dot{margin-left:5px;font-size:12px;vertical-align:baseline}
/* v0.251.0 : les deux compteurs par type dans l'en-tete des clients.
   Ils reprennent les couleurs des marqueurs de type deja poses sur les
   cartes (dentiste / laboratoire), pour qu'on fasse le lien sans legende. */
.ctcount{display:inline-block;min-width:20px;padding:1px 7px;border-radius:99px;
  font-size:11.5px;font-weight:700;text-align:center;vertical-align:1px;margin-left:3px}
.ct-dent{background:rgba(42,122,145,.13);color:var(--accent)}
.ct-lab{background:rgba(184,134,11,.16);color:var(--amber)}
.mk-offert{color:var(--vert,#2E8B57)}
.mk-refait{color:var(--amber,#B8860B)}
.flag.offert.on{background:rgba(46,139,87,.14);border-color:rgba(46,139,87,.45);color:#2E8B57}
.flag.refait.on{background:rgba(184,134,11,.16);border-color:rgba(184,134,11,.45);color:var(--amber)}
/* Le pourcentage a cote du compteur : plus petit et plus discret que le
   nombre, parce que c'est le nombre qui compte d'abord. */
.statcard .sc-n .sc-pct{font-size:12px;font-weight:600;color:var(--muted);margin-left:6px}
.cp-kind{font-size:10.5px;font-weight:700;text-transform:uppercase;letter-spacing:.06em;
  padding:2px 8px;border-radius:99px;background:var(--surface2);color:var(--muted)}
.cp-kind.plainte{background:rgba(192,57,43,.12);color:var(--rouge)}
.cp-kind.reprise{background:rgba(184,134,11,.14);color:var(--amber)}
.cp-st{font-size:11px;font-weight:600;padding:2px 9px;border-radius:99px}
.cp-st.open{background:rgba(192,57,43,.10);color:var(--rouge)}
.cp-st.warn{background:rgba(184,134,11,.14);color:var(--amber)}
.cp-st.done{background:var(--surface2);color:var(--muted)}

/* v0.117.0 : popover des lots — plus large et lisible.
   L'ancien faisait 240px : le nom du produit passait a la ligne mot par
   mot, ce qui rendait la liste illisible. */
.lotpop{width:min(560px,92vw)!important;max-width:calc(100vw - 24px)!important;padding:14px 16px}
.lotpop h4{margin:0 0 10px;font-size:11px;text-transform:uppercase;letter-spacing:.07em;
  color:var(--faint)}
.lotpop .lot-search{width:100%;font:inherit;font-size:13px;padding:7px 10px;margin-bottom:8px;
  background:var(--surface2);border:1px solid var(--line);border-radius:var(--r-sm);color:var(--text)}
.lotpop .lot-list{max-height:var(--lotmax,220px);overflow-y:auto;overflow-x:hidden;margin-bottom:10px}
.lotpop .lot-list label{display:grid;grid-template-columns:20px 104px 1fr 58px 26px;gap:10px;
  align-items:center;padding:6px 2px;border-bottom:1px solid var(--line);
  font-size:12.5px;cursor:pointer;white-space:nowrap}
.lotpop .lot-list label:hover{background:var(--surface2)}
.lotpop .lot-list .lc{font-family:ui-monospace,Menlo,monospace;color:var(--amber);font-weight:600}
.lotpop .lot-list .lp{overflow:hidden;text-overflow:ellipsis}
.lotpop .lot-list .lp i{color:var(--muted);font-style:normal;font-size:11.5px}
.lotpop .lot-list .exp{text-align:right;color:var(--muted);font-size:11.5px}
.lotpop .lot-empty{font-size:12px;color:var(--muted);padding:10px 2px}
.lotpop .lot-new{border-top:1px solid var(--line2);padding-top:10px}
.lotpop .lot-new-h{font-size:10.5px;text-transform:uppercase;letter-spacing:.07em;
  color:var(--faint);font-weight:700;margin-bottom:7px}
.lotpop .lot-grid{display:grid;grid-template-columns:1fr 1fr;gap:6px}
.lotpop .lot-grid input{font:inherit;font-size:13px;padding:7px 9px;background:var(--surface2);
  border:1px solid var(--line);border-radius:var(--r-sm);color:var(--text);min-width:0}
.lotpop .lot-grid input:focus{outline:none;border-color:var(--accent)}
@media (max-width:640px){ .lotpop .lot-grid{grid-template-columns:1fr} }

/* v0.117.0 : la periode du planning devient lisible.
   Le mois etait en 15px gris a cote du titre : on le cherchait avant de
   le trouver, alors que c'est l'information centrale de l'ecran. */
.pl-period{margin:0;font-size:19px;font-weight:700;letter-spacing:-.01em;
  color:var(--text);text-transform:capitalize;white-space:nowrap}

/* Vue semaine : la date de chaque jour passe devant, elle aussi. */
.agday-h{font-size:12.5px!important;color:var(--text)!important}
.agday-h .d{font-size:15px;font-weight:800;margin-right:5px}
.agday.today .agday-h .d{color:var(--accent)}

@media (max-width:900px){ .pl-period{font-size:16px} }

/* v0.117.1 : la plainte rejoint la barre d'actions du travail.
   Gris tant qu'il n'y a rien, rouge plein des qu'un dossier est ouvert :
   on doit le voir sans le chercher. */
/* Isolee des actions, poussee a droite de la rangee d'onglets : une
   plainte est un ETAT du travail, pas une action qu'on lui applique. */

/* v0.117.3 : rapport de taille entre les deux groupes.
   Le drapeau signale un ETAT : il doit se remarquer sans peser. Les cinq
   actions, elles, sont des cibles qu'on clique tous les jours - elles
   meritent d'etre plus grandes que lui, pas l'inverse. */

.markrow .actions .toolbtn.big,.markrow .actions .newbtn{width:38px;height:35px;border-radius:10px}
.markrow .actions .toolbtn.big svg,.markrow .actions .newbtn svg{width:19px;height:19px}
.markrow .actions{gap:7px}

/* v0.117.4 : le drapeau adopte EXACTEMENT le traitement des cinq actions.
   Il avait une bordure sans fond quand les autres ont un fond sans
   bordure : deux langages differents pour des elements qui se regardent.
   Meme cadre, meme rayon, meme fond. Ce qui le distingue, c'est sa
   COULEUR et sa POSITION - pas sa geometrie. */

/* ==================================================================
   v0.119.0 — MODE ATELIER
   Ecrit pour l'ETABLI : on y arrive les mains occupees. Grosses cibles
   (48px minimum, la taille d'un doigt), fort contraste, aucune
   information dont le technicien n'a pas besoin.
   ================================================================== */
.at-wrap{max-width:620px;margin:0 auto;padding:8px 4px 40px}
/* v0.134.0 : le bouton de scan faisait 120px de haut avec une icone de
   30px - massif au point d'ecraser le reste de l'ecran. Ramene a une
   taille de bouton normale : il reste la cible principale sans occuper
   la moitie de la page. */
.at-scan{display:flex;flex-direction:row;align-items:center;justify-content:center;
  width:100%;min-height:56px;font:inherit;font-size:15px;font-weight:600;cursor:pointer;
  background:var(--accent2);color:#fff;border:none;border-radius:var(--r-sm)}
.at-scan:active{filter:brightness(.92)}
.at-or{text-align:center;color:var(--faint);font-size:12px;margin:12px 0 8px;
  text-transform:uppercase;letter-spacing:.08em}
.at-num{width:100%;font:inherit;font-size:19px;text-align:center;padding:14px;
  font-family:ui-monospace,Menlo,monospace;letter-spacing:.05em;
  background:var(--surface);border:1px solid var(--line2);border-radius:var(--r);color:var(--text)}
.at-num:focus{outline:none;border-color:var(--accent)}

.at-card{background:var(--surface);border:1px solid var(--line);border-radius:var(--r);
  padding:18px;margin-top:18px}
.at-head{display:flex;align-items:center;gap:10px}
.at-no{font-family:ui-monospace,Menlo,monospace;font-size:21px;font-weight:700;letter-spacing:.04em}
.at-urg{background:rgba(192,57,43,.14);color:var(--rouge);font-size:11.5px;font-weight:700;
  padding:3px 10px;border-radius:99px;text-transform:uppercase;letter-spacing:.05em}
.at-pat{font-size:24px;font-weight:600;margin:6px 0 2px}
.at-meta{color:var(--muted);font-size:14px}
.at-due{margin-top:8px;font-size:15px;font-weight:600;color:var(--accent2)}
.at-due.late{color:var(--rouge)}

.at-steps{margin:16px 0 6px;display:flex;flex-direction:column;gap:8px}
.at-step{display:flex;align-items:center;gap:12px;width:100%;min-height:54px;padding:0 14px;
  font:inherit;font-size:16px;text-align:left;cursor:pointer;
  background:var(--surface2);border:1px solid var(--line);border-radius:var(--r-sm);color:var(--text)}
.at-step .tick{flex:none;width:26px;height:26px;border-radius:7px;border:2px solid var(--line2);
  display:flex;align-items:center;justify-content:center;font-size:15px;color:transparent}
.at-step.on{background:var(--accent-glow);border-color:var(--accent)}
.at-step.on .tick{background:var(--accent);border-color:var(--accent);color:var(--on-accent)}
.at-step .lbl{flex:1}
.at-step .who{font-size:12px;color:var(--muted);font-family:ui-monospace,Menlo,monospace}
.at-step:disabled{opacity:.5}

.at-actions{display:flex;gap:10px;margin-top:16px}
.at-btn{flex:1;min-height:56px;font:inherit;font-size:16px;font-weight:600;cursor:pointer;
  border-radius:var(--r-sm);border:1px solid var(--line2);background:var(--surface2);color:var(--text)}
.at-btn.done{background:var(--accent2);border-color:var(--accent2);color:#fff}
.at-btn:active{filter:brightness(.93)}
.at-fini{flex:1;display:flex;align-items:center;justify-content:center;min-height:56px;
  color:var(--accent2);font-weight:600}
.at-msg{color:var(--muted);font-size:14px;text-align:center;padding:18px 4px}
.at-msg.ko{color:var(--rouge)}

@media (max-width:640px){
  .at-pat{font-size:21px}
  .at-actions{flex-direction:column}
}

/* Ce qu'il y a a faire, en tete : a l'etabli c'est l'information la plus
   utile - avant meme les etapes a cocher. */
.at-lines{margin-top:14px;border-top:1px solid var(--line);padding-top:10px}
.at-line{display:grid;grid-template-columns:66px 1fr auto;gap:10px;align-items:center;
  padding:6px 0;font-size:15px}
.at-line .d{font-family:ui-monospace,Menlo,monospace;font-weight:700;color:var(--accent2);
  font-size:14px}
.at-line .q{color:var(--muted);font-size:13px}

/* v0.121.0 : le popover des lots bascule vers le haut quand il deborde,
   exactement comme le menu des codes depuis la v0.105.2. */
.lotpop.up{top:auto;bottom:100%;margin-bottom:2px;
  box-shadow:0 -12px 34px rgba(0,0,0,.5)}


/* v0.131.5 — APRES QUATRE ESSAIS, LE MINIMUM QUI MARCHE.
   Facturer et Plainte sont des .toolbtn.big comme les cinq autres :
   ils heritent donc du meme dimensionnement, qui fonctionne depuis
   toujours. Mes classes a part (inv-tool, cp-tool) echappaient a la
   regle de taille de .actions - d'ou le bouton geant.
   Ne restent ici que la COULEUR et le TRAIT de separation. */
.markrow .actions #wInv{background:rgba(30,92,66,.12);color:var(--accent2)}
/* CORRIGE v0.131.7 : le margin-right:10px etait un vestige du trait de
   separation de la v0.131.5, quand les deux boutons etaient MELANGES
   aux cinq autres. Depuis qu'ils ont leur propre rangee, ce trait n'a
   plus d'objet - et cette marge decalait toute la rangee du haut de
   10px vers la gauche par rapport a celle du bas. */
.markrow .actions #wReminder{background:var(--surface2);color:var(--muted)}
.markrow .actions #wReminder.on{background:rgba(211,145,32,.14);color:var(--amber)}
/* v0.131.6 : les deux boutons d'ETAT ont leur propre rangee, .actions
   state. Elle GARDE la classe .actions - donc elle herite de tout ce
   qui fonctionne deja : la taille des boutons, le position:absolute,
   les marges. Je n'ajoute qu'UNE chose : elle se cale en HAUT au lieu
   du bas.
   C'est ce que j'aurais du faire au premier essai, au lieu d'inventer
   un mecanisme parallele quatre fois de suite. */
/* Meme right que la rangee du bas (11px) : les deux colonnes de boutons
   sont ainsi rigoureusement alignees sur le meme bord droit. */
.mark-card .markrow .actions.state{top:7px;bottom:auto;right:11px}

/* v0.132.1 : onglets de l'ecran Parametres. Treize sections dans une page,
   et la liste grandit a chaque livraison - on choisit sa famille au lieu
   de faire derouler. */
.gs-tabs{flex-wrap:wrap}
.gset[hidden]{display:none!important}
@media (max-width:700px){
  .gs-tabs{width:100%;margin:8px 0 0 0!important}
}

/* ==================================================================
   v0.133.0 — MATRICE DES PERMISSIONS
   Modules en lignes, profils en colonnes : on voit qui peut quoi d'un
   seul coup d'oeil, au lieu d'ouvrir chaque profil l'un apres l'autre.
   ================================================================== */
.pmx-wrap{overflow-x:auto;border:1px solid var(--line);border-radius:var(--r-sm);
  background:var(--surface)}
.pmx{width:100%;border-collapse:collapse;font-size:13px}
.pmx thead th{position:sticky;top:0;background:var(--surface2);text-align:center;
  padding:9px 12px;font-size:12px;font-weight:600;border-bottom:1px solid var(--line2);
  white-space:nowrap;z-index:1}
.pmx thead th.pmx-h{text-align:left;min-width:230px}
.pmx-name{display:block;color:var(--text)}
.pmx-n{display:block;font-size:10.5px;font-weight:400;color:var(--muted);margin-top:1px}
.pmx tbody tr:hover{background:var(--surface2)}
.pmx td{padding:5px 12px;border-bottom:1px solid var(--line)}
.pmx-lbl{color:var(--text)}
.pmx-c{text-align:center}
/* Le nom de famille reprend la decoupe des onglets Parametres : memes
   reperes d'un ecran a l'autre. */
.pmx-fam td{background:var(--surface2);font-size:10.5px;font-weight:700;
  text-transform:uppercase;letter-spacing:.07em;color:var(--faint);padding:6px 12px}
.pmx-fam:hover td{background:var(--surface2)}
.pmx-s{font:inherit;font-size:12px;padding:3px 6px;border:1px solid var(--line);
  border-radius:6px;background:var(--surface);color:var(--text);cursor:pointer}
.pmx-s:focus{outline:none;border-color:var(--accent)}
/* Une case modifiee se voit : on n'enregistre pas a l'aveugle. */
.pmx-s.changed{border-color:var(--amber);background:rgba(184,134,11,.10);font-weight:600}
.pmx-ro{font-size:12px;color:var(--muted)}
.pmx-ro.edit{color:var(--accent2);font-weight:600}
.pmx-ro.view{color:var(--text)}

/* v0.134.0 : la corbeille des tarifs etait collee au chiffre de quantite. */
.acte-del{margin-left:14px}

/* v0.134.0 : colonne ADMIN de la matrice - un repere, pas un reglage.
   Grisee et non modifiable : on lit les autres profils par rapport a elle,
   et on ne peut pas se couper soi-meme l'acces. */
.pmx .pmx-adm{background:var(--surface2);opacity:.72}
.pmx thead th.pmx-adm{opacity:1}
.pmx td.pmx-adm{border-right:1px solid var(--line2)}
.pmx thead th.pmx-adm{border-right:1px solid var(--line2)}
/* Les boutons du bas se touchaient. */
.pmx-actions{flex-wrap:wrap}
.pmx-actions .btn{margin-left:2px}

/* v0.135.0 : temoin d'ecoute du scanner. Sans lui, rien ne dit que
   l'ecran attend une douchette - et un technicien qui doute finit par
   cliquer le bouton camera, ce qu'on cherchait justement a eviter. */
.at-listen{display:flex;align-items:center;justify-content:center;gap:8px;
  margin:12px 0 0;font-size:12.5px;color:var(--muted)}
.at-listen .dot{width:8px;height:8px;border-radius:50%;background:var(--accent);
  box-shadow:0 0 0 0 var(--accent-glow);animation:atpulse 2s ease-out infinite}
@keyframes atpulse{
  0%{box-shadow:0 0 0 0 rgba(46,125,91,.45)}
  70%{box-shadow:0 0 0 7px rgba(46,125,91,0)}
  100%{box-shadow:0 0 0 0 rgba(46,125,91,0)}
}
@media (prefers-reduced-motion: reduce){ .at-listen .dot{animation:none} }

/* v0.135.0 : l'ecoute de la douchette est PERMANENTE - il faut donc le
   DIRE, sinon rien ne l'indique et on cherche un bouton. */
.at-listen{display:flex;align-items:center;justify-content:center;gap:8px;
  margin-top:10px;font-size:12.5px;color:var(--muted)}
.at-dot{width:8px;height:8px;border-radius:50%;background:var(--accent);
  box-shadow:0 0 0 0 var(--accent-glow);animation:atPulse 2.2s ease-out infinite}
@keyframes atPulse{
  0%{box-shadow:0 0 0 0 var(--accent-glow)}
  70%{box-shadow:0 0 0 7px transparent}
  100%{box-shadow:0 0 0 0 transparent}
}
@media (prefers-reduced-motion: reduce){ .at-dot{animation:none} }

/* v0.137.0 : depuis une tournee, le numero ouvre le bon - on verifie une
   note sans quitter l'ecran. */
.tour-open{color:var(--accent2)!important;cursor:pointer;text-decoration:underline;
  text-decoration-style:dotted;text-underline-offset:2px}
.tour-open:hover{color:var(--accent)!important}

/* v0.137.0 : sur l'ecran Atelier, la douchette passe devant. Le bouton
   camera reste - sur telephone il n'y a pas de douchette - mais discret. */
.at-scan.sec{background:var(--surface2);color:var(--muted);min-height:44px;font-size:13.5px}
.at-scan.sec:hover{background:var(--surface);color:var(--text)}

/* v0.138.0 : le menu de langue s'ouvrait DANS le flux de la barre laterale.
   Il allongeait donc la colonne et declenchait un ascenseur des que la
   fenetre etait un peu courte - c'est exactement ce que montrait la
   capture. On le fait FLOTTER au-dessus du menu : il ne prend plus de
   hauteur, donc plus d'ascenseur.
   .navfoot devient le repere de position ; le menu se cale juste au-dessus
   de la carte utilisateur. */
.navfoot{position:relative}
.usermenu{position:absolute;left:0;right:0;bottom:100%;margin-bottom:8px;z-index:80}

/* ==================================================================
   v0.139.0 — LE LOT EST CLIQUABLE, ET CA DOIT SE VOIR.
   Jacob l'a decouvert PAR HASARD : la fonction existait mais rien ne
   l'annoncait. Un soulignement pointille au repos (discret mais present),
   franc au survol, plus le curseur main et une petite loupe.
   ================================================================== */
.lot-trace{cursor:pointer;position:relative;
  text-decoration:underline;text-decoration-style:dotted;
  text-decoration-color:var(--line2);text-underline-offset:3px}
.lot-trace:hover{color:var(--accent)!important;
  text-decoration-style:solid;text-decoration-color:var(--accent)}
.lot-trace::after{content:'\1F50D';font-size:9px;margin-left:6px;opacity:0;
  transition:opacity .15s ease}
.lot-trace:hover::after{opacity:.75}

/* CORRIGE : les lignes de stock portent la classe browse-row, pas
   stk-row que j'avais supposee. Verifie dans le code. */

@media (prefers-reduced-motion: reduce){ .lot-trace::after{transition:none} }

/* v0.141.0 : confirmation d'arrivee d'une photo, dans la modale de session. */
.ps-new{margin:12px 0 0;font-size:13.5px;font-weight:600;color:var(--accent2);
  background:var(--accent-glow);border-radius:var(--r-sm);padding:8px 12px}

/* ==================================================================
   v0.143.0 — IDENTITE EN HAUT, PERSONNE EN BAS
   Le nom du laboratoire etait en pied de menu, tronque a cote de
   l'utilisateur. C'est une information d'IDENTITE : elle se lit en
   arrivant, pas en cherchant son compte. Elle remonte sous le logo, avec
   la version a cote - comme dans Smilo.
   ================================================================== */
/* v0.143.5 : la version passe SOUS le logo - sur sa propre ligne - et le
   nom du labo en dessous, plus grand. Ordre demande : logo, version,
   laboratoire.
   Regle ciblee sur "nav #appVer" : deux regles #appVer existent plus haut
   (l'une en position absolue), et un ID l'emporte sur une classe. */
/* v0.143.6 : valeurs reglees par Jacob directement dans le navigateur.
   La cle etait le padding-left de 140px : la version se place SOUS le
   logo mais ALIGNEE A SA FIN, pas au ras du bord gauche. Mon "padding:
   0 22px" la collait a gauche - d'ou un rendu qui ne convenait jamais,
   quel que soit l'ordre des elements.
   Le margin-top negatif la remonte contre le mot-logo. */
nav #appVer{position:static;display:block;right:auto;top:auto;
  padding:2px 8px 0 140px;margin:-8px 0 5px;
  font-family:'JetBrains Mono',monospace;font-size:10.5px;font-weight:400;
  letter-spacing:.04em;color:var(--nav-text);opacity:.6}
.sb-lab{padding:0 18px 15px;margin-top:3px;font-size:16px;font-weight:700;
  letter-spacing:-.01em;color:var(--nav-text);opacity:.95;
  white-space:nowrap;overflow:hidden;text-overflow:ellipsis}

/* La carte utilisateur se resserre : elle ne porte plus qu'un nom. */
.usercard{padding:8px 10px}
.usercard .uavatar{width:28px;height:28px;font-size:12px}
.usercard .uinfo b{font-size:12.5px;font-weight:600}

/* ==================================================================
   v0.143.3 — MEME SURVOL PARTOUT
   Les lignes de Tarifs et de Stock ne reagissaient pas au survol. On
   reprend exactement le geste de l'Accueil (.alert:hover) : un
   glissement de 3 px vers la droite. Meme repere visuel d'un ecran a
   l'autre - on comprend qu'une ligne est vivante sans l'apprendre.
   ================================================================== */
/* .browse-row est un div : le glissement fonctionne. */
.browse-row{transition:transform .14s ease,background .14s ease}
.browse-row:hover{transform:translateX(3px);background:var(--surface2)}

/* .acte-row est un <tr> : translateX y est ignore ou fait sauter les
   bordures selon le navigateur. On obtient le meme effet de "ligne
   vivante" par un liseré a gauche et le fond, sans deplacer la ligne. */
.acte-row{transition:background .14s ease,box-shadow .14s ease}
.acte-row:hover{background:var(--surface2);
  box-shadow:inset 3px 0 0 0 var(--accent)}

/* Le bouton de scan n'a plus de libelle : l'icone parle, et le temoin
   vert juste en dessous dit deja ce qui se passe. */
.at-scan{gap:0}


/* v0.144.0 : les identifiants du labo a transmettre au client. Presentes
   en lignes lisibles plutot qu'en champs : on les LIT et on les copie,
   on ne les modifie pas. */
/* v0.146.2 : bloc resserre. Il porte trois lignes de lecture, il n'a pas
   besoin de la hauteur d'un formulaire - et il pousse tout le reste vers
   le bas. Largeur bornee aussi : ces valeurs sont courtes, les etaler sur
   1400 px eloigne le libelle de sa valeur pour rien. */
.pt-mine{background:var(--surface2);border:1px solid var(--line);border-radius:var(--r-sm);
  padding:6px 12px;max-width:620px}
.pt-mine > div{display:flex;align-items:center;gap:10px;padding:3px 0;font-size:12.5px;
  border-bottom:1px solid var(--line)}
.pt-mine > div:last-child{border-bottom:none}
.pt-mine span{color:var(--muted);flex:0 0 130px}
.pt-mine b{color:var(--text);word-break:break-all}
.pt-mine .mono{font-family:ui-monospace,Menlo,monospace;color:var(--accent2)}

/* v0.145.1 : le choix "tous / certains" des webhooks. Un choix explicite
   vaut mieux qu'une regle implicite expliquee en note de bas de page. */
/* v0.145.3 : .modal label force uppercase + 10.5px - c'est fait pour les
   TITRES de champ. Mes deux options en heritaient : des phrases entieres
   en capitales, sur deux lignes. On annule pour ces libellés-la. */
.wh-mode{display:flex;align-items:baseline;gap:8px;margin:7px 0;
  font-size:13px;font-weight:400;text-transform:none;letter-spacing:normal;
  color:var(--text);cursor:pointer}
.wh-mode input{width:auto;flex:none;margin:0}
.wh-mode b{font-weight:600;text-transform:none;letter-spacing:normal;white-space:nowrap}
.wh-mode .hint{font-size:12px;font-weight:400;text-transform:none;letter-spacing:normal;margin:0}

/* v0.145.2 : champs editables sur place dans la liste des partenaires.
   Discrets au repos - ils ne doivent pas transformer une liste en
   formulaire - mais visiblement modifiables au survol. */
/* Les champs editables doivent pouvoir RETRECIR : sans min-width:0 un
   input flex refuse de passer sous sa taille par defaut (~170px) et pousse
   les boutons hors de la ligne. C'est la cause du chevauchement. */
.pt-edit{font:inherit;font-size:13px;color:var(--text);background:transparent;
  border:1px solid transparent;border-radius:6px;padding:3px 6px;
  min-width:0;width:auto}
/* v0.146.2 : nom et code FIXES, URL ELASTIQUE, boutons ancres a droite.
   Mon essai precedent figeait TOUT, y compris les boutons (flex:none) :
   plus rien ne pouvait retrecir, donc la ligne debordait de la carte des
   qu'elle manquait de place. C'est ce que montrait le trait vertical de
   Jacob.
   Ici l'URL absorbe toute la variation : les colonnes de gauche restent
   alignees d'une ligne a l'autre, et les boutons touchent toujours le
   bord droit. */
.pt-edit.pt-name{flex:0 0 170px;width:170px}
/* v0.146.3 : le code flottait PLUS HAUT que le nom et l'URL.
   Cause : la classe .hint porte margin-bottom:10px (prevu pour les
   paragraphes d'aide). Dans une ligne flex centree, cette marge du bas
   pousse l'element vers le HAUT - c'est exactement le decalage visible.
   On l'annule ici, et on aligne sur la meme hauteur que les champs. */
.pt-row-code{flex:0 0 70px;width:70px;margin:0;
  display:flex;align-items:center;min-height:28px}
.pt-edit.pt-orig{flex:1 1 auto;min-width:0}
.pt-edit:hover{border-color:var(--line2);background:var(--surface2)}
.pt-edit:focus{outline:none;border-color:var(--accent);background:var(--surface)}
.pt-edit.pt-name{font-weight:700}
.pt-edit.pt-orig{font-size:12px;color:var(--muted);text-overflow:ellipsis}

/* Le groupe de boutons : ancre a droite, il garde sa taille mais ne
   pousse plus la ligne hors de la carte. */
.pt-acts{margin-left:auto;display:flex;gap:8px;flex:0 0 auto;white-space:nowrap}

/* Meme cause pour le cas non-owner : .hint porte margin-bottom:10px.
   Toute ligne flex qui contient un .hint doit l'annuler, sinon l'element
   remonte. */
.pt-row .hint{margin-bottom:0}

/* v0.147.0 : la carte Acces portail porte cinq reglages quand ses voisines
   en portent trois lignes. Elle prend deux colonnes de la grille. */
/* v0.148.0 : fc-wide (v0.147.0) n'a plus d'objet - la carte est
   maintenant dans une COLONNE, pas dans une grille a 4 cases. Un
   grid-column:span 2 dans un conteneur flex la ferait deborder. */
.fc-3col .fc-card.fc-wide{grid-column:auto}

/* ==================================================================
   v0.148.0 — FICHE CLIENT EN TROIS COLONNES (maquette Jacob)
   L'ancienne grille imposait QUATRE colonnes egales : chaque carte avait
   la meme largeur quel que soit son contenu, d'ou l'Acces portail
   comprime a cote d'une carte de trois lignes.
   Ici, trois colonnes qui regroupent ce qui va ensemble, et chaque carte
   prend la hauteur dont elle a besoin.
   ================================================================== */
/* ==================================================================
   v0.216.0 — GRILLE A PLAT ET DEPLACABLE (option A, choisie par Jacob)
   Les trois colonnes identite / relation / commercial disparaissent en
   tant que structure : chaque carte est une case de la meme grille et
   peut aller n'importe ou. Les regles .fc-3col restent en place mais ne
   s'appliquent plus a rien - elles partiront quand la mise a plat aura
   ete eprouvee, pas avant.
   ================================================================== */
/* v0.251.0 — PLUS DE TROUS DANS LA GRILLE.
   La grille CSS donne a chaque RANGEE la hauteur de sa carte la plus
   haute : une carte courte a cote d'une carte longue laissait un vide
   sous elle, et aucun agencement ne pouvait le combler. C'est ce que
   Jacob decrit par « plein de trous » — ce n'etait pas un reglage a
   trouver, c'etait la grille qui ne pouvait pas faire autrement.
   On passe donc en COLONNES : les cartes s'empilent et remplissent, il
   ne reste que le bas de la derniere colonne.
   CONSEQUENCE ASSUMEE : l'ordre se lit desormais colonne par colonne
   (haut en bas, puis colonne suivante) et non plus rangee par rangee.
   C'est le prix du remplissage : une vraie grille en maconnerie
   (grid masonry) n'est pas encore utilisable dans les navigateurs. */
.fc-cards.fc-flat{display:block;columns:3;column-gap:14px;margin-bottom:16px}
.fc-flat .fc-card{margin:0 0 14px;break-inside:avoid;-webkit-column-break-inside:avoid}
/* fc-wide n'a plus d'objet en colonnes : une carte occupe la largeur de
   sa colonne, ni plus ni moins. La regle reste neutralisee plutot que
   supprimee — la classe est encore posee par le rendu. */
.fc-flat .fc-card.fc-wide{grid-column:auto}
/* La poignee : meme caractere et meme discretion que celle de l'Accueil. */
.fc-grip{cursor:grab;color:var(--faint);font-size:13px;margin-right:7px;
  vertical-align:middle;letter-spacing:-1px}
.fc-card[draggable="true"]:hover .fc-grip{color:var(--accent)}
/* La carte entiere est saisissable, mais rien ne le disait. Un curseur
   suffit : une poignee dessinee sur sept cartes ferait du bruit pour un
   geste qu'on fait deux fois par an. */
.fc-flat .fc-card[draggable="true"]{cursor:grab}
.fc-flat .fc-card[draggable="true"]:active{cursor:grabbing}
@media (max-width:1250px){.fc-cards.fc-flat{columns:2}}
@media (max-width:820px){.fc-cards.fc-flat{columns:1}}
.fc-cards.fc-3col{display:grid;grid-template-columns:1fr 1.25fr 1fr;
  gap:14px;align-items:start}
.fc-3col .fc-col{display:flex;flex-direction:column;gap:14px;min-width:0}
.fc-3col .fc-col > .fc-card{margin:0}

/* La colonne centrale porte l'Acces portail : elle est un peu plus large,
   c'est la qu'on agit. */
@media (max-width:1200px){
  .fc-cards.fc-3col{grid-template-columns:1fr 1fr}
  .fc-3col .fc-col:last-child{grid-column:1/-1}
}
@media (max-width:760px){
  .fc-cards.fc-3col{grid-template-columns:1fr}
  .fc-3col .fc-col:last-child{grid-column:auto}
}

/* v0.148.1 : le bandeau de la fiche client touchait le bord haut de la
   fenetre - le bouton "Nouveau travail" semblait colle a la barre. */
/* v0.148.2 : le conteneur main a padding:0 30px 26px - ZERO en haut.
   Mes 10px sur .fc-head ne pouvaient pas suffire : c'est la page
   entiere qui touche le bord. On corrige a la source, pour tous les
   ecrans, pas seulement la fiche client. */
main{padding-top:18px}

/* Dans Donnees patient, le champ de recherche et le bouton n'etaient pas
   a la meme hauteur : le champ porte un padding, pas le bouton. */
.fc-card .row{display:flex;gap:8px;align-items:stretch}
.fc-card .row .ginput{flex:1;min-width:0}
.fc-card .row .btn{flex:none;align-self:stretch;display:flex;align-items:center}

/* ==================================================================
   v0.148.2 — DONNEES PATIENT : hauteur, espacement, alignement
   ================================================================== */
/* (2) Le champ et le bouton se touchaient : 6px en dur, et deux hauteurs
   differentes. Ecart franc, meme hauteur. */
.pd-search{display:flex;gap:10px;align-items:stretch;margin-bottom:4px}
.pd-search .ginput{flex:1;min-width:0}
.pd-search .btn{flex:none;display:flex;align-items:center;white-space:nowrap}

/* (2) Une ligne de patient : nom, nombre de travaux et bouton sur la MEME
   ligne de base. .hint est neutralise - sa marge du bas remontait le
   nombre de travaux. */
.pd-row{display:flex;gap:10px;align-items:center;padding:7px 0;
  border-bottom:1px solid var(--line);font-size:12.5px}
.pd-row:last-child{border-bottom:none}
.pd-row b{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.pd-row .pd-n{flex:none;margin:0;color:var(--muted);font-size:12px}
.pd-row .btn{flex:none}

/* (1) La liste respire, et defile au-dela de 5 patients au lieu
   d'allonger la carte indefiniment. */
#pdList{max-height:232px;overflow-y:auto;margin-top:6px;
  scrollbar-width:thin;padding-right:2px}

/* (3)(5) Les trois colonnes s'equilibrent : chaque carte de contenu
   variable a une hauteur minimale, ce qui evite qu'une colonne soit deux
   fois plus courte que sa voisine. */
.fc-3col .fc-card{min-height:96px}

/* (3) Les deux blocs du bas - Derniers travaux et Resume facturation -
   avaient des hauteurs libres, donc inegales. align-items:stretch les
   met a la meme hauteur, celle du plus grand. */
.fc-2col{align-items:stretch}
.fc-2col > .fc-card{display:flex;flex-direction:column;margin:0}

/* ==================================================================
   v0.149.0 — MODALE CLIENT : le gras seulement ou il sert
   Tous les champs etaient en gras majuscules, donc AUCUN ne ressortait.
   Seuls les champs d'IDENTITE et le plan tarifaire le restent : ce sont
   ceux qu'on cherche des yeux en ouvrant la fiche.
   ================================================================== */
.modal-client label{font-weight:400;text-transform:none;letter-spacing:normal;
  font-size:11.5px;color:var(--muted)}
.modal-client label.key{font-weight:700;text-transform:uppercase;
  letter-spacing:.08em;font-size:10.5px;color:var(--faint)}
.modal-client label.key input,.modal-client label.key select{font-weight:600}

/* La grille profite de la largeur : 4 colonnes au lieu de 3 sur grand
   ecran, donc moins de defilement. */
@media (min-width:1000px){
  .modal-client .f{grid-template-columns:repeat(4,1fr)}
}

/* v0.149.0 : cabinets rattaches a un partenaire. */
.pt-links{width:100%;margin:6px 0 2px;padding-left:12px;
  border-left:2px solid var(--line2)}
.pt-link{display:flex;gap:10px;align-items:center;padding:5px 0;font-size:12.5px}
.pt-link b{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.pt-link .hint{margin:0;flex:none;font-size:11.5px}
.btn.danger{color:var(--rouge);border-color:var(--line2)}
.btn.danger:hover{background:rgba(242,109,109,.1);border-color:var(--rouge)}

/* ==================================================================
   v0.270.6 — ACTIONS DE LA FICHE TRAVAIL
   Les anciens boutons etaient encore forces a 38 px alors que la v0.265.0
   leur avait ajoute un libelle. Le texte debordait donc sur le bouton voisin.
   Une classe de composant distingue maintenant les outils du travail des
   petits boutons d'etat places au-dessus. Les libelles gardent leur largeur,
   et les icones restent seules sur les ecrans tres etroits.
   ================================================================== */
.mark-card .markrow .actions.work-tools{
  left:11px;right:11px;bottom:7px;max-width:none;
  justify-content:flex-end;flex-wrap:nowrap;gap:7px
}
.markrow .actions.work-tools .toolbtn.big{
  width:auto;min-width:38px;height:35px;padding:0 10px;
  border-radius:10px;flex:0 0 auto
}
.markrow .actions.work-tools .toolbtn.big .tb-l,
.markrow .actions.work-tools .newbtn .tb-l{
  display:inline-block;position:static;width:auto;height:auto;
  margin:0 6px 0 0;overflow:visible;clip:auto;clip-path:none;
  white-space:nowrap;line-height:1;font-size:11.5px;font-weight:600
}
.markrow .actions.work-tools .newbtn{
  flex:0 0 auto;width:auto;min-width:38px;height:35px;padding:0 10px;border-radius:10px
}

@media (max-width:760px){
  .markrow .actions.work-tools .toolbtn.big{width:38px;min-width:38px;padding:0}
  .markrow .actions.work-tools .toolbtn.big .tb-l,
  .markrow .actions.work-tools .newbtn .tb-l{
    position:absolute;width:1px;height:1px;margin:0;overflow:hidden;
    clip:rect(0 0 0 0);clip-path:inset(50%)
  }
  .markrow .actions.work-tools .newbtn{width:38px;min-width:38px;padding:0}
}

/* ==================================================================
   v0.276.0 — LISIBILITE, PERIODES ET LONGUES LISTES
   ================================================================== */

/* La fiche client distingue franchement l'etat actif sans employer une
   couleur criarde. L'ancien badge ambre etait presque ton sur ton. */
.client-status{border:1px solid transparent;font-weight:800}
.client-status.is-active{
  color:var(--accent2);background:color-mix(in srgb,var(--accent) 18%,var(--surface));
  border-color:color-mix(in srgb,var(--accent) 46%,var(--line))
}
.client-status.is-inactive{
  color:var(--rouge);background:color-mix(in srgb,var(--rouge) 12%,var(--surface));
  border-color:color-mix(in srgb,var(--rouge) 38%,var(--line))
}

/* Carte/Liste : la periode explique les compteurs et permet de parcourir
   les mois sans charger toute l'histoire du laboratoire. */
.works-listbar{display:flex;align-items:center;justify-content:space-between;
  gap:12px;margin-bottom:10px;flex-wrap:wrap}
.works-listbar .tabs{margin:0}
.works-monthbar{display:flex;align-items:center;gap:6px;margin-left:auto}
.works-monthbar .ginput{height:36px;width:auto;padding:0 9px}
@media(max-width:760px){
  .works-monthbar{width:100%;margin-left:0;flex-wrap:wrap}
  .fc-kpis{grid-template-columns:repeat(2,minmax(0,1fr))}
}

/* Une periode de facturation choisie est un etat, pas un simple bouton. */
.fact-per .btn.on{
  color:var(--on-accent);background:var(--accent);border-color:var(--accent);
  box-shadow:0 0 0 2px var(--accent-glow)
}
.invpick,.ilast,.inv-act{position:relative;z-index:2}
.invpick{display:flex;align-items:center;justify-content:center;min-height:32px;cursor:pointer}
.invpick .invchk{cursor:pointer}
.fact-top{isolation:isolate;background:var(--bg)!important;
  box-shadow:0 -24px 0 var(--bg),0 8px 12px -8px rgba(0,0,0,.22)!important}

/* Tarifs : commandes et chiffres fixes, tableau seul defilant, pagination
   fixe et totalement opaque. Aucune ligne ne passe sous ces deux zones. */
.tarif-screen{height:100%;min-height:0;display:flex;flex-direction:column;overflow:hidden}
.tarif-fixed{position:relative;z-index:5;flex:none;background:var(--bg);
  box-shadow:0 9px 14px -13px rgba(0,0,0,.38)}
.tarif-card{flex:1;min-height:0;display:flex;flex-direction:column;overflow:hidden;
  padding:0 12px 12px;background:var(--surface)}
.tarif-scroll{flex:1;min-height:0;overflow:auto;overscroll-behavior:contain;
  scrollbar-width:thin;background:var(--surface)}
.tarif-scroll .sa-table thead{position:sticky;top:0;z-index:6}
.tarif-scroll .sa-table thead th{background:var(--surface)}
.tarif-card .tpg{position:relative;z-index:7;flex:none;margin:0 -12px -12px;
  padding:9px 12px;background:var(--surface);box-shadow:0 -8px 14px -13px rgba(0,0,0,.48)}

/* v0.282.0 — saisie achats : composants nommes et parcours clavier.
   Ces regles remplacent les styles ponctuels de la modale sans modifier
   la charte Minerale ni sa largeur validee. */
.purchase-modal{max-width:680px;max-height:90vh;overflow-y:auto}
.purchase-lines-title{margin-top:14px}
.purchase-add-line{margin-top:8px}
.purchase-line{border:1px solid var(--line);border-radius:10px;padding:9px;margin-bottom:8px}
.purchase-line-grid{display:grid;grid-template-columns:1.6fr 70px 90px 70px 30px;gap:8px}
.purchase-number{text-align:right}
.purchase-new-grid{display:grid;grid-template-columns:1.4fr 1fr 1fr 1fr;gap:8px;margin-top:7px}
.modal-client{display:flex;flex-direction:column;max-width:1120px;height:min(94vh,900px);
  max-height:94vh;overflow:hidden}
.modal-client>h3{flex:none}
.client-modal-scroll{flex:1;min-height:0;overflow-y:auto;overflow-x:hidden;padding-right:8px;
  scrollbar-gutter:stable}
.modal-client>.login-err{flex:none;margin:8px 0 0}
.modal-client .client-modal-actions{flex:none;margin:0 -22px -22px;padding:12px 22px;
  border-top:1px solid var(--line);background:var(--surface);box-shadow:0 -8px 18px -16px rgba(0,0,0,.5);
  position:relative;z-index:4}
.client-grid{display:grid;gap:0 14px}
.client-grid-3{grid-template-columns:repeat(3,minmax(0,1fr))}
.client-grid-4{grid-template-columns:repeat(4,minmax(0,1fr))}
.client-type-grid{grid-template-columns:1fr 2fr;align-items:center}
.client-section-title{margin-top:16px}
@media(max-width:760px){
  .purchase-line-grid{grid-template-columns:minmax(150px,1fr) 62px 78px 62px 30px;overflow-x:auto}
  .purchase-new-grid{grid-template-columns:1fr 1fr}
}
@media(max-width:720px){
  .client-grid-3,.client-grid-4{grid-template-columns:1fr 1fr}
  .client-type-grid{grid-template-columns:1fr}
}
@media(max-width:480px){
  .client-grid-3,.client-grid-4{grid-template-columns:1fr}
}

/* ============================================================ */
/* v0.333.0 - RAPPROCHEMENT PEPPOL <-> ACHATS                    */
/* ============================================================ */
/* Aucune regle existante n'est ecrasee : toutes ces classes sont */
/* neuves et prefixees `rap`. Ecrites en FIN de feuille, donc     */
/* apres tout ce qui pourrait les concerner - c'est la lecon de   */
/* la 0.329 (a specificite egale, la derniere gagne).             */
.rap-bar{display:flex;align-items:center;gap:12px;background:var(--surface);
  border:1px solid var(--line);border-left:3px solid var(--amber);
  border-radius:var(--r-sm);padding:10px 14px;cursor:pointer;margin:0 0 12px}
.rap-bar:hover{border-color:var(--line2)}
.rap-bar .rap-pin{width:26px;height:26px;border-radius:50%;background:var(--accent-glow);
  display:grid;place-items:center;flex:0 0 auto}
.rap-bar .rap-pin svg{width:15px;height:15px;stroke:var(--accent);fill:none;stroke-width:1.7}
.rap-bar .rap-gap{color:var(--amber);font-weight:800;font-variant-numeric:tabular-nums}
.rap-bar .rap-go{margin-left:auto;color:var(--accent);font-weight:700;font-size:12.5px}
.rap{background:var(--surface);border:1px solid var(--line);border-radius:var(--r);
  overflow:hidden;margin:0 0 14px}
.rap-head{display:flex;align-items:center;gap:14px;padding:14px 18px;
  border-bottom:1px solid var(--line);background:var(--surface2)}
.rap-head h3{margin:0;font-size:13.5px;font-weight:800}
.rap-head .rap-per{color:var(--muted);font-size:12px}
.rap-head .rap-x{margin-left:auto}
.rap-tot{display:grid;grid-template-columns:1fr 1fr 1fr;border-bottom:1px solid var(--line)}
.rap-t{display:flex;align-items:center;gap:13px;padding:16px 18px;border-right:1px solid var(--line)}
.rap-t:last-child{border-right:0}
.rap-t .rap-pin{width:34px;height:34px;border-radius:50%;background:var(--accent-glow);
  display:grid;place-items:center;flex:0 0 auto}
.rap-t .rap-pin svg{width:18px;height:18px;stroke:var(--accent);fill:none;stroke-width:1.7}
.rap-t .rap-lb{font-size:10.5px;letter-spacing:.07em;text-transform:uppercase;
  color:var(--faint);font-weight:800}
.rap-t .rap-nb{font-size:21px;font-weight:800;font-variant-numeric:tabular-nums}
.rap-t .rap-cm{font-size:11.5px;color:var(--muted)}
.rap-t.rap-e{background:color-mix(in srgb,var(--amber) 9%,transparent)}
.rap-t.rap-e .rap-nb{color:var(--amber)}
.rap-m{display:grid;grid-template-columns:26px 1fr 92px 140px 74px;gap:12px;align-items:center;
  padding:11px 18px;border-bottom:1px solid var(--line)}
.rap-m:hover{background:var(--surface2)}
.rap-sg{width:22px;height:22px;border-radius:6px;display:grid;place-items:center;
  font-weight:800;font-size:13px;line-height:1}
.rap-sg.rap-p{background:color-mix(in srgb,var(--amber) 16%,transparent);color:var(--amber)}
.rap-sg.rap-n{background:color-mix(in srgb,var(--blue) 16%,transparent);color:var(--blue)}
.rap-ti{font-weight:600}
.rap-de{color:var(--muted);font-size:11.5px;margin-top:2px}
.rap-n{color:var(--muted);font-size:12.5px;text-align:right;font-variant-numeric:tabular-nums}
.rap-eur{text-align:right;font-weight:700;font-variant-numeric:tabular-nums}
.rap-eur.rap-neg{color:var(--rouge)}
.rap-vo{text-align:right}
.rap-sum{display:grid;grid-template-columns:26px 1fr 92px 140px 74px;gap:12px;align-items:center;
  padding:12px 18px;background:var(--surface2);font-weight:700}
.rap-ok{color:var(--accent);font-weight:800}
.rap-ko{color:var(--rouge);font-weight:800}
.rap-note{display:flex;gap:11px;padding:12px 18px;border-top:1px solid var(--line);
  color:var(--muted);font-size:12px;align-items:flex-start}
.rap-note svg{width:15px;height:15px;stroke:var(--blue);fill:none;stroke-width:1.8;
  flex:0 0 auto;margin-top:1px}
.rap-row{display:grid;grid-template-columns:140px 1fr 100px 130px 130px;gap:12px;
  align-items:center;padding:9px 18px;border-bottom:1px solid var(--line);font-size:12.5px}
.rap-row:hover{background:var(--surface2)}
.rap-row .rap-num{font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:11.5px;
  color:var(--muted)}
.rap-row .rap-eur{font-weight:600}
@media(max-width:1100px){
  .rap-tot{grid-template-columns:1fr}
  .rap-t{border-right:0;border-bottom:1px solid var(--line)}
  .rap-m,.rap-sum{grid-template-columns:26px 1fr 120px}
  .rap-n{display:none}
  .rap-vo{grid-column:3}
  .rap-row{grid-template-columns:1fr 110px}
}

/* ============================================================ */
/* v0.339.0 - TRACABILITE : LA MISE EN PAGE                      */
/* ============================================================ */
/* [Jacob] « tout est colle, tout ce qui se trouve au-dessus de la */
/* ligne rouge doit etre fige ». Le bandeau et l'en-tete des       */
/* colonnes reprennent `.stick-a` / `.stick-b`, deja en place sur  */
/* Ventes et Achats : l'en-tete se cale sur `--stickA`, mesuree    */
/* apres rendu. Ecrites en FIN de feuille (lecon 0.329).           */
.tra-kpis{display:grid;grid-template-columns:repeat(4,1fr);gap:12px;margin:14px 0 0}
.tra-kpi{background:var(--surface);border:1px solid var(--line);border-radius:var(--r);
  padding:11px 15px;display:flex;align-items:baseline;gap:10px}
.tra-kpi .l{font-size:10.5px;letter-spacing:.07em;text-transform:uppercase;
  color:var(--faint);font-weight:800}
.tra-kpi .v{font-size:19px;font-weight:800;margin-left:auto;font-variant-numeric:tabular-nums}
.tra-kpi.ok .v{color:var(--accent)}
.tra-kpi.warn .v{color:var(--amber)}
.tra-ban{display:flex;gap:10px;align-items:flex-start;background:var(--surface);
  border:1px solid var(--line);border-left:3px solid var(--amber);
  border-radius:var(--r-sm);padding:10px 14px;margin:14px 0 0;font-size:12.5px}
.tra-grid{display:grid;
  grid-template-columns:88px minmax(150px,1.1fr) minmax(130px,1fr) 92px 116px minmax(180px,1.4fr) 96px;
  gap:14px;align-items:start}
.tra-head{background:var(--surface2);border:1px solid var(--line);border-bottom-width:2px;
  border-radius:var(--r) var(--r) 0 0;padding:9px 15px;font-size:10.5px;
  letter-spacing:.06em;text-transform:uppercase;color:var(--faint);font-weight:800;
  box-shadow:none}
.tra-r{text-align:right}
.tra-card{background:var(--surface);border:1px solid var(--line);border-top:0;
  border-radius:0 0 var(--r) var(--r);overflow:hidden}
.tra-row{padding:11px 15px;border-bottom:1px solid var(--line);font-size:13px}
.tra-row:last-child{border-bottom:0}
.tra-row:hover{background:var(--surface2)}
.tra-code{font-weight:800;font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:12.5px}
.tra-acte{font-weight:600}
.tra-acte.none{color:var(--faint);font-weight:400}
.tra-ref{font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:12px;color:var(--muted)}
.tra-four{color:var(--muted)}
/* Un n° de lot peut faire 120 caracteres : il se replie DANS sa colonne */
/* au lieu de pousser les voisines et de casser la grille.               */
.tra-lot{font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:11.5px;
  word-break:break-word;line-height:1.35}
.tra-k{display:inline-block;margin-top:3px;font-size:10px;font-weight:800;
  font-family:inherit;letter-spacing:.03em}
.tra-numero{color:var(--accent)}
.tra-composite{color:var(--blue)}
.tra-voir_note{color:var(--amber)}
.tra-absent{color:var(--rouge)}
.tra-qte{text-align:right;font-variant-numeric:tabular-nums}
.tra-qte small{color:var(--faint);font-weight:400}
@media(max-width:1200px){
  .tra-kpis{grid-template-columns:1fr 1fr}
  .tra-grid{grid-template-columns:80px 1fr 100px minmax(150px,1.2fr) 90px;gap:10px}
  .tra-c4,.tra-four{display:none}
}

/* ============================================================ */
/* v0.342.0 - LE LOT PORTE SA DENT, ET PEUT ETRE FINI            */
/* ============================================================ */
/* Ecrites en FIN de feuille (lecon 0.329). Les dents ne          */
/* paraissent que quand la ligne en porte plusieurs : elles       */
/* passent donc a la ligne sous le lot, sans deranger sa grille.  */
.lot-list label .lot-x{margin-left:auto;display:flex;align-items:center}
.lot-list label .lot-x .btn{padding:1px 6px;font-size:12px;line-height:1.2}
.lot-teeth{flex-basis:100%;display:flex;flex-wrap:wrap;gap:4px;margin:4px 0 2px 22px}
.lot-teeth .btn{padding:1px 7px;font-size:11px;font-variant-numeric:tabular-nums}
.lot-teeth .btn.on{background:var(--accent);color:var(--on-accent);border-color:var(--accent)}
.lot-teeth i{font-size:10.5px;color:var(--faint);font-style:normal;align-self:center}
.lot-list label{flex-wrap:wrap}

/* ============================================================ */
/* v0.343.0 - LE SELECTEUR DE LOTS, REMIS D'APLOMB               */
/* ============================================================ */
/* [Jacob] « met le txt sur 1 ligne », « le interdit met-le en bout */
/* de ligne », « l'ascenseur horizontal degage il y a rien        */
/* derriere !!!! », « enleve ce cadre ».                          */
/*                                                                */
/* LA CAUSE DES TROIS PREMIERS EST LA MEME : la ligne est une     */
/* GRILLE a quatre colonnes. Mes deux ajouts (bouton « fini »,    */
/* dents) sont devenus les elements 5 et 6 — donc une deuxieme    */
/* rangee — et la largeur qui debordait a fait apparaitre la      */
/* barre horizontale. On donne donc SA colonne au bouton, et une  */
/* rangee entiere aux dents.                                      */
.lotpop .lot-list .lot-x{display:flex;justify-content:flex-end}
.lotpop .lot-list .lot-x .btn{padding:0 4px;font-size:13px;line-height:1.5;border:none;background:none;color:var(--muted)}
.lotpop .lot-list .lot-x .btn:hover{color:var(--rouge)}
/* Les dents prennent toute la rangee suivante : elles ne poussent */
/* plus les colonnes du lot.                                       */
.lotpop .lot-teeth{grid-column:1/-1;margin:2px 0 0 30px}
/* La case « voir tous » : un DIV, donc aucun costume de ligne.     */
.lotpop .lot-all{display:grid;grid-template-columns:20px 1fr;gap:10px;align-items:center;padding:6px 2px;margin:0 0 6px;cursor:pointer}
.lotpop .lot-all span{font-size:11.5px;color:var(--muted);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.lotpop .lot-all input{justify-self:start;margin:0}
/* Le titre d'une famille de lots.                                 */
.lotpop .lot-grp{font-size:10px;font-weight:800;letter-spacing:.06em;
  text-transform:uppercase;color:var(--faint);padding:8px 2px 3px}

.head-type-choice{display:flex;align-items:center;gap:9px;min-height:34px}
.head-type-choice>i{width:9px;height:9px;border-radius:50%;flex:0 0 9px}
.head-type-choice select,.head-type-choice select:hover,.head-type-choice select:focus,.head-type-choice select:focus-visible{
  border:0!important;outline:0!important;box-shadow:none!important;background:transparent!important;
  padding-left:0!important;width:auto;min-width:0;flex:1}
.badge-report-pan{width:880px;max-width:calc(100vw - 32px);top:76px;right:32px;max-height:78vh}
.badge-report-pan .catpan-h b{font-size:13.5px;line-height:1.2;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.badge-report-count{display:inline-flex;min-width:28px;height:22px;padding:0 8px;align-items:center;justify-content:center;
  border-radius:99px;background:var(--accent);color:var(--on-accent);font-size:11px;font-weight:800}
.badge-report-search{height:36px;margin:0!important}
.badge-report-head,.badge-report-row{display:grid;grid-template-columns:155px minmax(170px,1fr) minmax(170px,1fr) 180px;gap:14px;align-items:center}
.badge-report-head{padding:2px 12px 5px;color:var(--faint);font-size:9.5px;font-weight:800;text-transform:uppercase;letter-spacing:.07em}
.badge-report-list{overflow:auto;display:grid;gap:4px;min-height:0;padding-right:3px}
.badge-report-row{text-align:left;border:1px solid var(--line);background:var(--surface2);color:var(--text);border-radius:9px;padding:9px 12px;cursor:pointer;font-size:12.5px}
.badge-report-row:hover{border-color:var(--accent)}
.badge-report-row span{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.badge-report-row b{font-family:'JetBrains Mono',monospace;font-size:12px;color:var(--accent2)}
.badge-report-row small{color:var(--muted);white-space:nowrap;text-align:right}
@media(max-width:700px){
  .badge-report-pan{left:8px;right:8px;width:auto;top:70px}
  .badge-report-head{display:none}
  .badge-report-row{grid-template-columns:110px minmax(0,1fr) 90px}
  .badge-report-row span:nth-of-type(2){display:none}
}
.hz-rt{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:14px;align-items:start;width:100%}
/* Tarif, remise et TVA partagent strictement le même gabarit. Le premier est
   un label/select interactif : on neutralise donc les marges et graisses que
   les formulaires appliquent normalement aux labels. */
.work-term-field,.f label.work-term-field{display:grid;grid-template-rows:12px 20px;gap:2px;
  min-width:0;margin:0;font-weight:400;text-transform:none;letter-spacing:normal}
.work-term-field small{display:block;height:12px;line-height:12px;font-size:9px;font-weight:400;
  text-transform:uppercase;letter-spacing:.06em;color:var(--faint)}
.work-term-field .rt-v{display:flex;align-items:center;height:20px;line-height:20px;
  font-family:inherit;font-size:13px;font-weight:400;color:var(--accent)}
.work-term-field select,.f .work-term-field select{display:block;width:100%;height:20px;max-width:none;
  margin:0;padding:0 22px 0 0;line-height:20px;font-family:inherit;
  font-size:13px;font-weight:400;color:var(--accent);border:0;background-color:transparent;box-shadow:none}
.cl-peppol-row{display:grid;grid-template-columns:minmax(210px,.9fr) minmax(210px,1fr) minmax(210px,1fr);
  gap:8px;margin-bottom:5px;align-items:end}
.cl-peppol-field{display:grid;grid-template-rows:12px 34px;gap:3px;min-width:0;margin:0}
.cl-peppol-field>span{font-size:10px;line-height:12px;font-weight:600;text-transform:uppercase;
  letter-spacing:.06em;color:var(--faint)}
.cl-peppol-field select,.cl-peppol-field input{width:100%;height:34px!important;min-height:34px!important;
  margin:0!important;padding-top:0!important;padding-bottom:0!important}
.cl-peppol-value>span{visibility:hidden}
.cl-peppol-value>span+*{min-width:0}
.pl-tech{height:30px!important;min-height:30px!important;padding:2px 28px 2px 8px!important}
@media(max-width:900px){.cl-peppol-row{grid-template-columns:1fr}}
.tp-filter{display:flex;align-items:center;gap:7px;margin:0}
.tp-filter span{font-size:10px;font-weight:700;text-transform:uppercase;letter-spacing:.06em;color:var(--faint)}
.tp-filter select{min-width:190px;height:38px}
.settings-working-days{display:flex;align-items:center;gap:16px;flex-wrap:wrap;margin:5px 0 8px}
.settings-working-days>span{font-size:13px;font-weight:600}
.settings-working-days .tog{margin:0}
@media(max-width:760px){.tp-filter span{display:none}.tp-filter select{min-width:145px}}

/* --- theme-v273.css --- */
/* ==================================================================
   e-LAB 0.282.0 — charte Minéral
   Couche visuelle commune : application laboratoire, console SA,
   portail cabinet et dépôt public. Les variables métier personnalisables
   restent celles de l'application (--accent, --bg, --surface, --nav-bg).
   ================================================================== */

:root,
html[data-theme="light"]{
  color-scheme:light;
  --bg:#F4F6F5;
  --surface:#FFFFFF;
  --surface2:#E9EFEC;
  --raise:#FFFFFF;
  --line:#DCE4E0;
  --line2:#CBD6D2;
  --text:#24312F;
  --muted:#566763;
  --faint:#6F7E7A;
  --accent:#668C82;
  --accent2:#466C63;
  --accent-glow:rgba(102,140,130,.15);
  --on-accent:#FFFFFF;
  --violet:#89849D;
  --amber:#A98954;
  --blue:#718FA2;
  --rouge:#AD6E68;
  --nav-bg:#283C3A;
  --nav-bg2:#1E302E;
  --nav-text:#B8C7C3;
  --nav-on:#F5F8F7;
  --nav-line:rgba(245,248,247,.10);
  --or:#AA8B55;
  --r:14px;
  --r-sm:10px;
  --shadow-soft:0 12px 36px rgba(35,55,52,.07);
  --shadow-float:0 18px 48px rgba(25,45,42,.16);
}

html[data-theme="dark"],
:root.t-dark{
  color-scheme:dark;
  --bg:#1D2629;
  --surface:#253034;
  --surface2:#303C40;
  --raise:#2A363A;
  --line:#3D4A4E;
  --line2:#4B595D;
  --text:#EEF3F1;
  --muted:#C3CEC9;
  --faint:#A4B1AB;
  --accent:#7C9A91;
  --accent2:#A8BEB7;
  --accent-glow:rgba(124,154,145,.18);
  --on-accent:#1F302B;
  --violet:#AAA5BD;
  --amber:#C1A778;
  --blue:#86A0AE;
  --rouge:#C08079;
  --nav-bg:#222D30;
  --nav-bg2:#192326;
  --nav-text:#ABB8B4;
  --nav-on:#F3F6F5;
  --nav-line:rgba(243,246,245,.10);
  --or:#C1A778;
  --shadow-soft:0 14px 38px rgba(0,0,0,.13);
  --shadow-float:0 20px 52px rgba(0,0,0,.28);
}

@media (prefers-color-scheme:dark){
  :root:not(.t-light):not([data-theme="light"]){
    --bg:#1D2629;
    --surface:#253034;
    --surface2:#303C40;
    --raise:#2A363A;
    --line:#3D4A4E;
    --line2:#4B595D;
    --text:#EEF3F1;
    --muted:#C3CEC9;
    --faint:#A4B1AB;
    --accent:#7C9A91;
    --accent2:#A8BEB7;
    --accent-glow:rgba(124,154,145,.18);
    --on-accent:#1F302B;
    --violet:#AAA5BD;
    --amber:#C1A778;
    --blue:#86A0AE;
    --rouge:#C08079;
  }
}

body{
  background:
    radial-gradient(900px 380px at 88% -12%,var(--accent-glow),transparent 62%),
    var(--bg);
  color:var(--text);
  -webkit-font-smoothing:antialiased;
  text-rendering:optimizeLegibility;
}

/* ---------- application laboratoire ---------- */
.elab-lab .app-wrap{background:var(--bg)}
.elab-lab nav{
  width:216px;
  padding:20px 12px 14px;
  border-right:0;
  background:linear-gradient(180deg,var(--nav-bg),var(--nav-bg2));
  box-shadow:8px 0 30px rgba(25,45,42,.08);
}
.elab-lab nav .wordmark{
  min-height:42px;
  padding:0 8px;
  gap:10px;
  color:var(--nav-on);
  font-size:19px;
  font-weight:700;
}
.elab-lab nav .wordmark::before{width:38px;height:38px}
.elab-lab nav .wordmark span{color:var(--nav-on)}
.elab-lab nav .verline{padding:0 10px 10px;margin:0;color:var(--nav-text)}
.elab-lab nav .sb-lab{
  padding:3px 10px 14px;
  margin:0;
  color:var(--nav-on);
  font-size:13px;
  font-weight:500;
}
.elab-lab nav a{
  min-height:42px;
  margin:2px 0;
  padding:6px 10px;
  gap:9px;
  border-radius:11px;
  color:var(--nav-text);
  font-size:13px;
  font-weight:500;
  transition:background .14s ease,color .14s ease,transform .14s ease;
}
.elab-lab nav a:hover{
  color:var(--nav-on);
  background:rgba(245,248,247,.08);
  transform:translateX(1px);
}
.elab-lab nav a.on{
  color:var(--nav-on);
  background:rgba(245,248,247,.12);
  box-shadow:none;
}
.elab-lab nav a .ic{
  width:30px;
  height:30px;
  padding:7px;
  border-radius:9px;
  color:var(--nav-text);
  background:rgba(245,248,247,.06);
  stroke-width:1.8;
}
.elab-lab nav a.on .ic{
  color:var(--nav-on);
  background:rgba(102,140,130,.42);
}
.elab-lab nav .sub{margin:1px 0 4px 15px;padding-left:8px;border-left:0}
.elab-lab nav .sub a{min-height:35px;padding:4px 8px;font-size:12.5px}
.elab-lab nav .sub a .ic{width:26px;height:26px;padding:6px}
.elab-lab nav a .n{
  background:rgba(245,248,247,.13);
  color:var(--nav-on);
  font-weight:500;
}
.elab-lab nav a .n.alert{background:var(--rouge);color:#fff}
.elab-lab .navfoot{padding:10px 0 0}
.elab-lab .usercard{
  min-height:48px;
  padding:8px 9px;
  border-color:var(--nav-line);
  border-radius:12px;
  background:rgba(245,248,247,.07);
  box-shadow:none;
}
.elab-lab .usercard:hover{border-color:rgba(245,248,247,.24)}
.elab-lab .uavatar{background:rgba(102,140,130,.46);color:var(--nav-on);font-weight:500}
.elab-lab .usermenu{border:1px solid var(--line);box-shadow:var(--shadow-float)}
.elab-lab .decor-teeth{opacity:.12;width:180px}

.elab-lab main{
  max-width:none;
  padding:22px 26px 30px;
  background:var(--bg);
}
.elab-lab .page-head{
  min-height:42px;
  padding-top:0;
  margin-bottom:17px;
  gap:12px;
  color:var(--page-text,var(--text));
}
.elab-lab .page-head h1{
  color:inherit;
  font-size:22px;
  font-weight:600;
  letter-spacing:-.025em;
}
.elab-lab .page-head h1 .mono{color:var(--accent2)}

/* ---------- choix de thème : aperçu fidèle, sans popup technique ---------- */
.elab-lab .theme-gallery-head{
  display:flex;
  align-items:baseline;
  gap:7px;
  margin:14px 0 8px;
  color:var(--text);
  font-size:12px;
}
.elab-lab .theme-gallery-head b{font-size:12.5px;font-weight:600}
.elab-lab .theme-gallery-head span{color:var(--muted)}
.elab-lab .theme-gallery{
  display:grid;
  grid-template-columns:repeat(auto-fit,minmax(132px,1fr));
  gap:9px;
  margin-bottom:9px;
}
.elab-lab .theme-choice{
  position:relative;
  display:grid;
  grid-template-columns:42px minmax(0,1fr) 16px;
  align-items:center;
  gap:7px;
  min-height:46px;
  padding:6px 7px;
  border:1px solid var(--line);
  border-radius:11px;
  background:var(--surface2);
  color:var(--text);
  font:inherit;
  text-align:left;
  cursor:pointer;
  transition:border-color .14s ease,box-shadow .14s ease,transform .14s ease;
}
.elab-lab .theme-choice:hover{
  border-color:var(--accent);
  box-shadow:0 7px 18px rgba(35,55,52,.08);
  transform:translateY(-1px);
}
.elab-lab .theme-choice.on{
  border-color:var(--accent);
  box-shadow:0 0 0 2px var(--accent-glow);
}
.elab-lab .theme-mini{
  position:relative;
  display:block;
  width:42px;
  height:30px;
  overflow:hidden;
  border:1px solid rgba(0,0,0,.10);
  border-radius:7px;
  background:var(--tp-bg);
}
.elab-lab .theme-mini i{
  position:absolute;
  inset:0 auto 0 0;
  width:11px;
  background:var(--tp-menu);
}
.elab-lab .theme-mini b{
  position:absolute;
  inset:6px 4px 6px 15px;
  border-radius:4px;
  background:var(--tp-surface);
  box-shadow:0 1px 2px rgba(0,0,0,.09);
}
.elab-lab .theme-mini em{
  position:absolute;
  right:6px;
  bottom:7px;
  width:7px;
  height:7px;
  border-radius:50%;
  background:var(--tp-accent);
  box-shadow:0 0 0 1px rgba(0,0,0,.08);
}
.elab-lab .theme-choice-name{
  overflow:hidden;
  font-size:12px;
  font-weight:600;
  line-height:1.2;
  text-overflow:ellipsis;
  white-space:nowrap;
}
.elab-lab .theme-choice-check{
  display:grid;
  width:16px;
  height:16px;
  place-items:center;
  border:1px solid var(--line2);
  border-radius:50%;
  color:transparent;
  font-size:11px;
  font-weight:700;
}
.elab-lab .theme-choice.on .theme-choice-check{
  border-color:var(--accent);
  background:var(--accent);
  color:var(--on-accent);
}
.elab-lab .theme-default{margin:0 0 6px}

/* Surfaces communes à tous les rendus dynamiques. */
.elab-lab .card,
.elab-lab .summary,
.elab-lab .fc-card,
.elab-lab .statcard,
.elab-lab .wcard,
.elab-lab .ccard,
.elab-lab .wo-card,
.elab-lab .kcol,
.elab-lab .cal-wrap,
.elab-lab .pl-card,
.elab-lab .gd-card,
.elab-lab .stock-card{
  border-color:var(--line);
  border-radius:14px;
  background:var(--surface);
  box-shadow:0 1px 0 rgba(35,55,52,.02);
}
.elab-lab .summary{background:var(--surface)}
.elab-lab .card h2,
.elab-lab .fc-card h3,
.elab-lab .summary h2{
  color:var(--muted);
  letter-spacing:.055em;
}
.elab-lab .wcard:hover,
.elab-lab .ccard:hover{
  border-color:color-mix(in srgb,var(--accent) 52%,var(--line));
  box-shadow:var(--shadow-soft);
  transform:translateY(-1px);
}

/* Boutons : angle doux et hiérarchie calme, identiques sur chaque page. */
.elab-lab .newbtn,
.elab-lab .btn,
.elab-lab .toolbtn,
.elab-lab .tabs button,
.elab-lab .typefilter .tf,
.elab-lab .vtoggle,
.elab-lab .kfilter,
.elab-lab .status-group,
.elab-lab .flag{
  border-radius:10px;
}
.elab-lab .newbtn{
  background:var(--accent2);
  color:var(--on-accent);
  font-weight:600;
  box-shadow:0 6px 16px rgba(70,108,99,.14);
}
.elab-lab .newbtn:hover{filter:none;background:color-mix(in srgb,var(--accent2) 88%,var(--text))}
.elab-lab .btn,
.elab-lab .toolbtn{
  border-color:var(--line2);
  background:var(--surface);
  color:var(--text);
  font-weight:500;
}
.elab-lab .btn:hover,
.elab-lab .toolbtn:hover{
  border-color:color-mix(in srgb,var(--accent) 58%,var(--line2));
  color:var(--accent2);
  background:color-mix(in srgb,var(--accent) 7%,var(--surface));
}
.elab-lab .tabs{gap:7px;margin-bottom:17px}
.elab-lab .tabs button{
  border-color:var(--line2);
  background:var(--surface);
  color:var(--muted);
  font-weight:500;
}
.elab-lab .tabs button.on{
  color:var(--on-accent);
  background:var(--accent2);
  border-color:var(--accent2);
}
.elab-lab .typefilter .tf,
.elab-lab .vtoggle button,
.elab-lab .kfilter button,
.elab-lab .status-group button{font-weight:500}
.elab-lab .typefilter .tf.on,
.elab-lab .kfilter button.on{
  color:var(--accent2);
  background:var(--accent-glow);
  border-color:color-mix(in srgb,var(--accent) 45%,var(--line));
}

/* Champs et recherches. */
.elab-lab :where(input:not([type="checkbox"]):not([type="radio"]):not([type="range"]),select,textarea),
.elab-lab .search,
.elab-lab .ginput{
  border-color:var(--line2);
  border-radius:10px;
  background:var(--surface);
  color:var(--text);
}
.elab-lab :where(input,select,textarea):focus,
.elab-lab .search:focus,
.elab-lab .ginput:focus{
  border-color:var(--accent);
  box-shadow:0 0 0 3px var(--accent-glow);
  outline:none;
}
.elab-lab .search{width:min(290px,100%)}

/* Tableaux et listes. */
.elab-lab :where(table) th{
  color:var(--muted);
  font-weight:600;
  letter-spacing:.045em;
}
.elab-lab :where(table) td,
.elab-lab :where(table) th{border-color:var(--line)}
.elab-lab :where(table) tbody tr{transition:background .12s ease}
.elab-lab :where(table) tbody tr:hover{background:color-mix(in srgb,var(--accent) 6%,var(--surface))}
.elab-lab .badge,
.elab-lab .pill,
.elab-lab .groupchip,
.elab-lab .tag{font-weight:500}
.elab-lab .badge.en_cours,
.elab-lab .ppenv-prod{background:var(--accent-glow);color:var(--accent2)}
.elab-lab .badge.fini{background:rgba(169,137,84,.15);color:var(--amber)}
.elab-lab .badge.releve{background:rgba(113,143,162,.14);color:var(--blue)}

/* Indicateurs : chiffres sombres, accent utilisé comme repère discret. */
.elab-lab .statcards{gap:11px}
.elab-lab .statcard{text-align:left;padding:15px 16px}
.elab-lab .statcard .sc-n{color:var(--text);font-weight:600}
.elab-lab .statcard .sc-l{color:var(--muted);font-weight:500;letter-spacing:.045em}
.elab-lab .tk{border-color:var(--line);background:var(--surface2);border-radius:11px}
.elab-lab .tk b{color:var(--text);font-weight:600}
.elab-lab .tk-cliq.on{background:var(--accent-glow);border-color:var(--accent)}

/* Fenêtres, menus et panneaux flottants. */
.elab-lab .modal-bg{background:rgba(27,43,41,.58);backdrop-filter:blur(5px)}
.elab-lab .modal{
  border-color:var(--line);
  border-radius:16px;
  background:var(--surface);
  box-shadow:var(--shadow-float);
}
.elab-lab .modal h3{font-weight:600}
.elab-lab .modal label{color:var(--muted);font-weight:600}
.elab-lab .modal input,
.elab-lab .modal select,
.elab-lab .modal textarea{background:var(--surface)}
.elab-lab .modal-actions{border-color:var(--line)}
.elab-lab .cardmenu,
.elab-lab .ac,
.elab-lab .client-ac,
.elab-lab .lotpop,
.elab-lab .tlbl-pop{
  border-color:var(--line);
  background:var(--raise);
  box-shadow:var(--shadow-float);
}

/* Connexion laboratoire et SA. */
.elab-lab .login-wrap,
.elab-admin .login-wrap{background:var(--bg)}
.elab-lab .login-card,
.elab-admin .login-card{
  border-color:var(--line);
  border-radius:18px;
  box-shadow:var(--shadow-soft);
}
.elab-lab .login-logo{width:76px;height:76px}
.elab-lab .wordmark.big,
.elab-admin .wordmark.big{color:var(--text);font-weight:600}
.elab-lab .wordmark.big span,
.elab-admin .wordmark.big span{color:var(--accent2)}

/* ---------- console superadmin ---------- */
.elab-admin{background:var(--bg)}
.elab-admin .sa-wrap{max-width:1460px;padding:24px}
.elab-admin .page-head{
  padding:0 0 18px;
  margin-bottom:0;
  border-bottom:1px solid var(--line);
}
.elab-admin .page-head h1{font-size:22px;font-weight:600;letter-spacing:-.02em}
.elab-admin .sa-tabs{
  top:0;
  gap:7px;
  margin:0 0 18px;
  padding:14px 0;
  background:color-mix(in srgb,var(--bg) 92%,transparent);
  backdrop-filter:blur(10px);
}
.elab-admin .sa-tab-btn{
  min-height:36px;
  border-color:var(--line2);
  border-radius:10px;
  background:var(--surface);
  color:var(--muted);
  font-weight:500;
}
.elab-admin .sa-tab-btn.on{background:var(--accent2);border-color:var(--accent2);color:var(--on-accent)}
.elab-admin .sa-card{
  border-color:var(--line);
  border-radius:14px;
  background:var(--surface);
  box-shadow:0 1px 0 rgba(35,55,52,.02);
}
.elab-admin .sa-card h2{color:var(--text);font-weight:600}
.elab-admin .sa-kpi{border-color:var(--line);border-radius:11px;background:var(--surface2)}
.elab-admin .sa-kpi .v{color:var(--text);font-weight:600}
.elab-admin .sa-kpi .l{font-weight:500}
.elab-admin .sa-btn,
.elab-admin .newbtn,
.elab-admin .btn{
  border-radius:10px;
  font-weight:500;
}
.elab-admin .newbtn{background:var(--accent2);box-shadow:0 6px 16px rgba(70,108,99,.14)}
.elab-admin .sa-btn{border-color:var(--line2);background:var(--surface)}
.elab-admin :where(input,select,textarea){border-color:var(--line2);background:var(--surface);border-radius:10px}
.elab-admin :where(input,select,textarea):focus{border-color:var(--accent);box-shadow:0 0 0 3px var(--accent-glow);outline:none}
.elab-admin .notice{background:var(--surface2);color:var(--muted)}
.elab-admin .sa-table tbody tr:hover{background:color-mix(in srgb,var(--accent) 6%,var(--surface))}

/* ---------- portail cabinet ---------- */
.elab-portal .brand,
.elab-depot .brand{
  display:flex;
  align-items:center;
  gap:9px;
  color:var(--text);
  font-weight:600;
}
.elab-portal .brand::before,
.elab-depot .brand::before{
  content:"";
  width:38px;
  height:38px;
  flex:none;
  background:url('/assets/logo.png?v=0.282.0') center/contain no-repeat;
}
.elab-portal .brand span,
.elab-depot .brand span{color:var(--accent2)}
.elab-portal .card,
.elab-depot .card{
  border-color:var(--line);
  border-radius:16px;
  background:var(--surface);
  box-shadow:0 1px 0 rgba(35,55,52,.02);
}
.elab-portal .auth,
.elab-depot .card{box-shadow:var(--shadow-soft)}
.elab-portal input,
.elab-portal select,
.elab-portal textarea{
  border-color:var(--line2);
  border-radius:10px;
  background:var(--surface);
}
.elab-portal input:focus,
.elab-portal select:focus,
.elab-portal textarea:focus{border-color:var(--accent);box-shadow:0 0 0 3px var(--accent-glow)}
.elab-portal .btn{
  border-color:var(--line2);
  border-radius:10px;
  background:var(--surface);
  font-weight:500;
}
.elab-portal .btn.pri{background:var(--accent2);border-color:var(--accent2);color:var(--on-accent)}
.elab-portal .top{
  border-color:var(--line);
  background:color-mix(in srgb,var(--surface) 94%,transparent);
  backdrop-filter:blur(10px);
  box-shadow:0 6px 22px rgba(35,55,52,.05);
}
.elab-portal main{max-width:920px}
.elab-portal .w{
  border-color:var(--line);
  border-radius:13px;
  background:var(--surface);
  box-shadow:none;
}
.elab-portal .w:hover{border-color:color-mix(in srgb,var(--accent) 48%,var(--line));background:color-mix(in srgb,var(--accent) 4%,var(--surface))}
.elab-portal .fbtn{border-color:var(--line2);border-radius:10px;background:var(--surface);font-weight:500}
.elab-portal .fbtn.on{background:var(--accent-glow);border-color:var(--accent);color:var(--accent2)}
.elab-portal .osec-n{background:var(--accent-glow);color:var(--accent2)}
.elab-portal .pk-card,
.elab-portal .odrop,
.elab-portal .pk-res{border-color:var(--line);border-radius:12px}

/* ---------- dépôt public ---------- */
.elab-depot .cam,
.elab-depot .btn{border-radius:10px;background:var(--accent2);color:var(--on-accent);font-weight:600}
.elab-depot .drop{border-color:var(--line2);border-radius:13px;background:var(--surface2)}
.elab-depot .drop:hover,
.elab-depot .drop.over{border-color:var(--accent);background:var(--accent-glow)}

@media(max-width:880px){
  .elab-lab nav{width:66px;padding:14px 7px}
  .elab-lab nav .wordmark{padding:0;justify-content:center}
  .elab-lab nav .wordmark::before{width:38px;height:38px}
  .elab-lab nav a{padding:6px;justify-content:center}
  .elab-lab nav a .ic{width:32px;height:32px}
  .elab-lab nav .sub{margin-left:0;padding-left:0;border-left:0}
  .elab-lab main{padding:18px 14px 26px}
}

@media(max-width:560px){
  .elab-lab .page-head{align-items:flex-start}
  .elab-lab .page-head .search{width:100%}
  .elab-admin .sa-wrap{padding:16px 12px}
  .elab-admin .sa-tabs{top:0}
  .elab-portal .top{gap:6px;padding-left:9px;padding-right:9px}
}

/* --- ui-v353.css --- */
/* =====================================================================
   e-LAB 0.357.0 — socle d'interface Minéral Pro

   Couche volontairement additive et limitée à l'application laboratoire.
   Aucun gabarit HTML ni comportement métier n'est modifié ici. Le portail
   embarqué Smilo reste hors périmètre jusqu'à validation d'une autre piste.
   ===================================================================== */

body.elab-lab{
  --surface3:color-mix(in srgb,var(--surface) 84%,var(--bg));
  --surface-hover:color-mix(in srgb,var(--accent) 5%,var(--surface));
  --control-h:36px;
  --ui-shadow:0 8px 28px rgba(30,48,45,.055);
  --ui-shadow-hover:0 12px 32px rgba(30,48,45,.09);
  background:var(--bg);
}

html[data-theme="dark"] body.elab-lab,
html.t-dark body.elab-lab{
  --ui-shadow:0 8px 28px rgba(0,0,0,.11);
  --ui-shadow-hover:0 14px 34px rgba(0,0,0,.18);
}

/* ---------- structure générale ---------- */
.elab-lab .app-wrap{background:var(--bg)}
.elab-lab nav{
  width:232px;
  padding:20px 14px 14px;
  background:linear-gradient(180deg,var(--nav-bg),var(--nav-bg2));
  box-shadow:12px 0 30px rgba(20,38,35,.075);
}
.elab-lab nav .wordmark{
  min-height:48px;
  padding:0 10px;
  font-size:20px;
  font-weight:700;
  letter-spacing:.01em;
}
.elab-lab nav .wordmark::before{width:38px;height:38px}
.elab-lab nav .sb-lab{
  margin:0 0 11px;
  padding:4px 10px 13px;
  border-bottom:1px solid var(--nav-line);
  font-size:12.5px;
  font-weight:500;
}
.elab-lab nav a{
  min-height:39px;
  margin:2px 0;
  padding:5px 11px;
  border-radius:10px;
  font-size:12.5px;
  font-weight:550;
}
.elab-lab nav a:hover{
  transform:none;
  background:rgba(245,248,247,.065);
}
.elab-lab nav a.on{
  background:rgba(245,248,247,.115);
  box-shadow:inset 3px 0 0 color-mix(in srgb,var(--accent) 72%,#fff);
}
.elab-lab nav a .ic{
  width:28px;
  height:28px;
  padding:6px;
  border-radius:8px;
  background:rgba(245,248,247,.06);
}
.elab-lab nav a.on .ic{background:rgba(245,248,247,.10)}
.elab-lab nav .sub{margin:1px 0 4px;padding-left:0}
.elab-lab nav .sub a{
  min-height:34px;
  padding:4px 9px 4px 46px;
  color:color-mix(in srgb,var(--nav-text) 90%,transparent);
  font-size:12px;
}
.elab-lab nav .sub a .ic{display:none}
.elab-lab nav .sub a.on{box-shadow:none;background:rgba(245,248,247,.10)}
.elab-lab nav a .n{
  min-width:24px;
  padding:2px 7px;
  border-radius:99px;
  text-align:center;
  font-size:10px;
}
.elab-lab .navfoot{padding-top:11px}
.elab-lab .usercard{
  min-height:48px;
  padding:8px 10px;
  border-color:var(--nav-line);
  background:rgba(245,248,247,.055);
}
.elab-lab main{
  padding:23px 28px 38px;
  background:var(--bg);
}
.elab-lab .page-head{
  min-height:42px;
  margin-bottom:17px;
  gap:10px;
}
.elab-lab .page-head h1{
  font-size:22px;
  line-height:1.15;
  font-weight:680;
  letter-spacing:-.025em;
}

/* ---------- surfaces et hiérarchie ---------- */
.elab-lab .card,
.elab-lab .summary,
.elab-lab .fc-card,
.elab-lab .statcard,
.elab-lab .wcard,
.elab-lab .ccard,
.elab-lab .wo-card,
.elab-lab .kcol,
.elab-lab .cal-wrap,
.elab-lab .pl-card,
.elab-lab .gd-card,
.elab-lab .stock-card{
  border:1px solid var(--line);
  border-radius:14px;
  background:var(--surface);
  box-shadow:var(--ui-shadow);
}
.elab-lab .card h2,
.elab-lab .fc-card h3,
.elab-lab .summary h2{
  color:var(--muted);
  font-weight:700;
  letter-spacing:.075em;
}
.elab-lab .wcard,
.elab-lab .ccard,
.elab-lab .fin-kpi,
.elab-lab .browse-row,
.elab-lab .wrow{transition:border-color .14s ease,background .14s ease,box-shadow .14s ease}
.elab-lab .wcard:hover,
.elab-lab .ccard:hover{
  transform:none;
  border-color:color-mix(in srgb,var(--accent) 48%,var(--line));
  box-shadow:var(--ui-shadow-hover);
}

/* ---------- boutons : trois rôles, une seule géométrie ---------- */
.elab-lab .btn,
.elab-lab .newbtn,
.elab-lab .toolbtn{
  min-height:var(--control-h);
  border-radius:10px;
  font-weight:590;
  line-height:1;
  transition:border-color .14s ease,background .14s ease,color .14s ease,box-shadow .14s ease,transform .14s ease;
}
.elab-lab .btn,
.elab-lab .toolbtn{
  border-color:var(--line2);
  background:var(--surface);
  color:var(--text);
  box-shadow:0 1px 0 rgba(20,30,28,.02);
}
.elab-lab .btn:hover,
.elab-lab .toolbtn:hover{
  transform:translateY(-1px);
  border-color:var(--accent);
  background:var(--surface-hover);
  color:var(--accent2);
}
.elab-lab .newbtn{
  background:var(--accent2);
  color:var(--on-accent);
  box-shadow:0 6px 16px rgba(54,95,86,.17);
}
.elab-lab .newbtn:hover{
  transform:translateY(-1px);
  background:color-mix(in srgb,var(--accent2) 90%,var(--text));
  box-shadow:0 8px 20px rgba(54,95,86,.21);
}
.elab-lab .btn.bsm,
.elab-lab .newbtn.bsm{
  min-height:30px;
  height:30px;
  padding:0 11px;
  border-radius:9px;
  font-size:11.5px;
}
.elab-lab .btn:disabled,
.elab-lab .newbtn:disabled,
.elab-lab .toolbtn:disabled{opacity:.43;transform:none;box-shadow:none}
.elab-lab :where(button,a,input,select,textarea):focus-visible{
  outline:0;
  box-shadow:0 0 0 3px var(--accent-glow);
}

/* Les pastilles sont réservées aux filtres et statuts. */
.elab-lab .tabs{
  width:max-content;
  max-width:100%;
  gap:2px;
  padding:3px;
  border-radius:11px;
  background:var(--surface2);
}
.elab-lab .tabs button{
  height:30px;
  padding:0 11px;
  border:0;
  border-radius:8px;
  background:transparent;
  color:var(--muted);
  font-size:12px;
  font-weight:590;
}
.elab-lab .tabs button:hover{border:0;background:color-mix(in srgb,var(--surface) 55%,transparent);color:var(--text)}
.elab-lab .tabs button.on{
  border:0;
  background:var(--surface);
  color:var(--text);
  box-shadow:0 2px 8px rgba(30,45,42,.08);
}
.elab-lab .tabs button .n{margin-left:2px;color:var(--faint);opacity:1}
.elab-lab .dtabs{
  gap:3px;
  margin-bottom:12px;
  padding:3px;
  border-radius:11px;
  background:var(--surface3);
}
.elab-lab .dtabs button{
  min-height:31px;
  padding:0 12px;
  border:0;
  border-radius:8px;
  background:transparent;
  color:var(--muted);
  font-size:12px;
  font-weight:600;
}
.elab-lab .dtabs button.on{
  border:0;
  background:var(--accent-glow);
  color:var(--accent2);
  box-shadow:none;
}
.elab-lab .vtoggle{padding:3px;border-radius:10px;background:var(--surface2)}
.elab-lab .vtoggle button{min-height:29px;border:0;border-radius:8px;background:transparent}
.elab-lab .vtoggle button.on{background:var(--surface);color:var(--text);box-shadow:0 2px 8px rgba(30,45,42,.08)}
.elab-lab .typefilter{gap:6px;margin-bottom:14px}
.elab-lab .typefilter .tf{
  min-height:29px;
  padding:0 10px;
  border-color:var(--line);
  border-radius:9px;
  background:transparent;
  color:var(--muted);
  font-size:10.5px;
  font-weight:550;
}
.elab-lab .typefilter .tf.on{
  border-color:transparent;
  background:var(--accent-glow);
  color:var(--accent2);
  font-weight:650;
}

/* ---------- champs ---------- */
.elab-lab :where(input:not([type="checkbox"]):not([type="radio"]):not([type="range"]):not([type="color"]),select,textarea),
.elab-lab .search,
.elab-lab .ginput{
  border-color:var(--line2);
  border-radius:10px;
  background:var(--surface);
  color:var(--text);
  box-shadow:none;
}
.elab-lab .search,
.elab-lab .ginput{min-height:var(--control-h)}
.elab-lab :where(input,select,textarea):focus,
.elab-lab .search:focus,
.elab-lab .ginput:focus{
  border-color:var(--accent);
  box-shadow:0 0 0 3px var(--accent-glow);
}
.elab-lab :where(input,textarea)::placeholder{color:var(--faint);opacity:.86}

/* ---------- listes et tableaux ---------- */
.elab-lab .whead{
  padding-top:8px;
  padding-bottom:8px;
  background:var(--surface3);
  color:var(--faint);
  font-size:9.5px;
  letter-spacing:.075em;
  border-color:var(--line);
}
.elab-lab .wlist{
  gap:0;
  overflow:hidden;
  border:1px solid var(--line);
  border-radius:14px;
  background:var(--surface);
  box-shadow:var(--ui-shadow);
}
.elab-lab .wlist .wrow{
  margin:0;
  border:0;
  border-bottom:1px solid var(--line);
  border-radius:0;
  background:var(--surface);
}
.elab-lab .wlist .wrow:last-child{border-bottom:0}
.elab-lab .wlist .wrow:hover{
  transform:none;
  border-color:var(--line);
  background:var(--surface-hover);
  box-shadow:inset 3px 0 0 color-mix(in srgb,var(--accent) 72%,transparent);
}
.elab-lab .wlist .wrow .bar{border-radius:0 5px 5px 0}
.elab-lab .wlist .inv-year{
  margin:0;
  border-radius:0;
  background:var(--surface2);
}
.elab-lab :where(table){border-color:var(--line)}
.elab-lab :where(table) th{
  background:var(--surface3);
  color:var(--faint);
  font-size:9.5px;
  font-weight:700;
  letter-spacing:.075em;
}
.elab-lab :where(table) tbody tr:hover{background:var(--surface-hover)}
.elab-lab .browse-row:hover{
  transform:none;
  background:var(--surface-hover);
  box-shadow:inset 3px 0 0 color-mix(in srgb,var(--accent) 62%,transparent);
}
.elab-lab .badge,
.elab-lab .pill,
.elab-lab .groupchip,
.elab-lab .tag{
  border-radius:99px;
  font-size:10.5px;
  font-weight:650;
}
.elab-lab .badge.en_cours,
.elab-lab .ppenv-prod{background:var(--accent-glow);color:var(--accent2)}

/* ---------- KPI financiers et statistiques ---------- */
.elab-lab .fin-kpis{gap:11px}
.elab-lab .fin-kpi{
  min-height:92px;
  padding:12px 14px;
  border:1px solid var(--line);
  border-left:3px solid var(--line2);
  border-radius:14px;
  background:var(--surface);
  box-shadow:var(--ui-shadow);
}
.elab-lab .fin-kpi:hover{box-shadow:var(--ui-shadow-hover)}
.elab-lab .fin-kpi.late{border-color:color-mix(in srgb,var(--rouge) 45%,var(--line));border-left-color:var(--rouge);background:var(--surface)}
.elab-lab .fin-kpi.ok{border-left-color:var(--accent)}
.elab-lab .fin-kpi .kpi-ico{
  width:29px;
  height:29px;
  padding:6px;
  border-radius:9px;
  background:var(--accent-glow);
}
.elab-lab .fin-kpi>span{font-size:9.5px;font-weight:700;letter-spacing:.065em}
.elab-lab .fin-kpi>b{color:var(--text);font-family:'JetBrains Mono',monospace;font-size:19px;font-weight:650;letter-spacing:-.035em}
.elab-lab .fin-kpi.ok b{color:var(--text)}
.elab-lab .fact-bar,
.elab-lab .ach-bar{
  padding:9px;
  border-radius:14px;
  background:var(--surface);
  box-shadow:var(--ui-shadow);
}
.elab-lab .statcard{padding:15px 16px}
.elab-lab .statcard .sc-n{font-family:'JetBrains Mono',monospace;font-weight:650;letter-spacing:-.025em}

/* ---------- fiche travail ---------- */
.elab-lab .head4{gap:11px}
.elab-lab .head4 .blk{padding:12px 15px}
.elab-lab .head4 .flbl,
.elab-lab .te-head,
.elab-lab .whead{
  color:var(--faint);
  font-weight:700;
  text-transform:uppercase;
  letter-spacing:.075em;
}
.elab-lab .head4 .wo-ref-edit{background:var(--surface2)}
.elab-lab .ctxrow{gap:11px}
.elab-lab .mark-card .markrow{border-color:var(--line)}
.elab-lab .te-card{overflow:hidden}
.elab-lab .te-head{background:var(--surface3)}
.elab-lab .totals{border-color:var(--line)}
.elab-lab .totals .grand{border-left:1px solid var(--line)}

/* ---------- fenêtres et menus ---------- */
.elab-lab .modal-bg{background:rgba(25,42,39,.56);backdrop-filter:blur(5px)}
.elab-lab .modal{
  border-color:var(--line);
  border-radius:16px;
  background:var(--surface);
  box-shadow:var(--shadow-float);
}
.elab-lab .modal h3{font-size:16px;font-weight:680;letter-spacing:-.015em}
.elab-lab .modal label{color:var(--muted);font-weight:700;letter-spacing:.065em}
.elab-lab .cardmenu,
.elab-lab .ac,
.elab-lab .client-ac,
.elab-lab .lotpop,
.elab-lab .tlbl-pop{
  border-color:var(--line);
  border-radius:12px;
  background:var(--raise);
  box-shadow:var(--shadow-float);
}

/* ---------- connexion ---------- */
.elab-lab .login-wrap{background:var(--bg)}
.elab-lab .login-card{
  border-color:var(--line);
  border-radius:18px;
  box-shadow:var(--ui-shadow-hover);
}
.elab-lab .login-logo{width:76px;height:76px}

/* ---------- thèmes : vignettes plus discrètes et rigoureusement égales ---------- */
.elab-lab .theme-gallery{gap:8px}
.elab-lab .theme-choice{
  grid-template-columns:42px minmax(0,1fr) 16px;
  min-height:45px;
  padding:6px 7px;
  border-radius:10px;
  background:var(--surface3);
  box-shadow:none;
}
.elab-lab .theme-choice:hover{transform:none;box-shadow:none}
.elab-lab .theme-mini{width:42px;height:30px;border-radius:7px}

/* ---------- responsive sans changement de navigation métier ---------- */
@media(max-width:1180px){
  .elab-lab .fin-kpis.five{grid-template-columns:repeat(3,minmax(0,1fr))}
}

@media(max-width:880px){
  .elab-lab nav{width:66px;padding:14px 7px}
  .elab-lab nav .wordmark{padding:0;justify-content:center}
  .elab-lab nav .sb-lab{border:0;padding:0;margin:0}
  .elab-lab nav a{padding:5px;justify-content:center}
  .elab-lab nav a.on{box-shadow:inset 3px 0 0 color-mix(in srgb,var(--accent) 72%,#fff)}
  .elab-lab nav .sub a{padding:4px;min-height:34px}
  .elab-lab nav .sub a .ic{display:block}
  .elab-lab main{padding:18px 14px 28px}
  .elab-lab .tabs{width:100%;overflow-x:auto;flex-wrap:nowrap}
  .elab-lab .tabs button{flex:none}
}

@media(max-width:640px){
  .elab-lab .page-head{align-items:flex-start}
  .elab-lab .page-head .search{width:100%}
  .elab-lab .fin-kpis.five,
  .elab-lab .fin-kpis.four{grid-template-columns:1fr}
  .elab-lab .fact-bar,
  .elab-lab .ach-bar{align-items:stretch}
  .elab-lab .fact-per{margin-left:0}
  .elab-lab .ctxrow>.card{min-width:0;width:100%}
  .elab-lab .te-card{overflow-x:auto;overscroll-behavior-x:contain}
}

@media(prefers-reduced-motion:reduce){
  .elab-lab *,
  .elab-lab *::before,
  .elab-lab *::after{scroll-behavior:auto!important;animation-duration:.01ms!important;transition-duration:.01ms!important}
}

/* --- ui-v362.css --- */
/* =====================================================================
   e-LAB 0.362.0 — finitions Minéral Pro des écrans principaux

   Couche additive, chargée après ui-v353.css et limitée à l'application
   laboratoire. Elle ne change ni le DOM métier ni les interactions.
   ===================================================================== */

body.elab-lab{
  --ui-gap:14px;
  --ui-gap-sm:9px;
  --ui-toolbar:color-mix(in srgb,var(--surface) 94%,var(--bg));
  --ui-subtle:color-mix(in srgb,var(--accent) 4%,var(--surface));
}

/* ---------- socle commun ---------- */
.elab-lab #main{min-width:0}
.elab-lab #main>.page-head:first-child,
.elab-lab #main>.fact-top>.page-head:first-child{
  position:relative;
  align-items:center;
  padding-bottom:12px;
  border-bottom:1px solid var(--line);
}
.elab-lab #main>.page-head:first-child::after,
.elab-lab #main>.fact-top>.page-head:first-child::after{
  content:"";
  position:absolute;
  left:0;
  bottom:-1px;
  width:38px;
  height:2px;
  border-radius:99px;
  background:var(--accent);
}
.elab-lab #main>.page-head .spacer{min-width:8px}
.elab-lab #main>.page-head :where(.search,.ginput){flex:0 1 auto}
.elab-lab .placeholder{
  min-height:160px;
  display:grid;
  place-items:center;
  padding:28px;
  border:1px dashed var(--line2);
  border-radius:14px;
  background:var(--ui-subtle);
  color:var(--muted);
  text-align:center;
}
.elab-lab :where(.home-list,.kcol-b,.parlist,.tarif-scroll){
  scrollbar-width:thin;
  scrollbar-color:var(--line2) transparent;
}
.elab-lab :where(.home-list,.kcol-b,.parlist,.tarif-scroll)::-webkit-scrollbar{width:7px;height:7px}
.elab-lab :where(.home-list,.kcol-b,.parlist,.tarif-scroll)::-webkit-scrollbar-thumb{
  border-radius:99px;
  background:var(--line2);
}
.elab-lab :where(button,a,input,select,textarea):focus-visible{
  outline:2px solid color-mix(in srgb,var(--accent) 72%,transparent);
  outline-offset:2px;
  box-shadow:0 0 0 3px var(--accent-glow);
}

/* ---------- Accueil ---------- */
.elab-lab #main[data-page="accueil"] .alerts{margin-bottom:12px}
.elab-lab #main[data-page="accueil"] .alert{
  border-radius:12px;
  box-shadow:none;
}
.elab-lab #main[data-page="accueil"] .day-nav{
  padding:4px;
  border:1px solid var(--line);
  border-radius:12px;
  background:var(--surface);
}
.elab-lab #main[data-page="accueil"] .day-nav .btn{
  min-width:31px;
  border-color:transparent;
  background:transparent;
  box-shadow:none;
}
.elab-lab #main[data-page="accueil"] .day-nav .btn:hover{background:var(--surface2)}
.elab-lab #main[data-page="accueil"] .day-nav .ginput{
  height:30px;
  min-height:30px;
  border:0;
  background:transparent;
  font-weight:650;
}
.elab-lab #main[data-page="accueil"] #homeGrid{gap:var(--ui-gap)}
.elab-lab #main[data-page="accueil"] .home-card{
  overflow:hidden;
  padding:0;
}
.elab-lab #main[data-page="accueil"] .home-card>h2{
  margin:0;
  padding:12px 14px 10px;
  border-bottom:1px solid var(--line);
  background:var(--surface3);
  color:var(--muted);
  font-size:10.5px;
}
.elab-lab #main[data-page="accueil"] .home-list{
  margin:0;
  padding:4px 6px 5px;
}
.elab-lab #main[data-page="accueil"] .dayrow{
  min-height:29px;
  border-radius:7px;
  border-bottom-color:var(--line);
}
.elab-lab #main[data-page="accueil"] .dayrow:hover{background:var(--surface-hover)}
.elab-lab #main[data-page="accueil"] .home-card>.hint{
  min-height:88px;
  display:grid;
  place-items:center;
  margin:0;
  padding:18px;
  color:var(--faint);
  text-align:center;
}

/* ---------- Travaux ---------- */
.elab-lab #main[data-page="travaux"]>.page-head{
  flex-wrap:wrap;
}
.elab-lab #main[data-page="travaux"]>.page-head .search{
  width:clamp(210px,22vw,330px);
}
.elab-lab #main[data-page="travaux"] .vtoggle{flex:none}
.elab-lab #main[data-page="travaux"] .ktools,
.elab-lab #main[data-page="travaux"] .works-listbar{
  gap:10px;
  padding:9px;
  border:1px solid var(--line);
  border-radius:14px;
  background:var(--ui-toolbar);
  box-shadow:var(--ui-shadow);
}
.elab-lab #main[data-page="travaux"] .ktools{
  display:grid;
  grid-template-columns:auto minmax(0,1fr);
  align-items:center;
}
.elab-lab #main[data-page="travaux"] .kdate{
  padding-right:10px;
  border-right:1px solid var(--line);
}
.elab-lab #main[data-page="travaux"] .typefilter{
  min-width:0;
  margin:0;
  padding:1px 2px 3px;
  overflow-x:auto;
  flex-wrap:nowrap;
  scrollbar-width:thin;
}
.elab-lab #main[data-page="travaux"] .typefilter .tf{flex:none}
.elab-lab #main[data-page="travaux"] .works-listbar{
  display:flex;
  align-items:center;
  justify-content:space-between;
  margin-bottom:10px;
}
.elab-lab #main[data-page="travaux"] .works-listbar+.typefilter{
  margin-bottom:12px;
  padding:4px 2px;
}
.elab-lab #main[data-page="travaux"] .works-monthbar{
  display:flex;
  align-items:center;
  gap:6px;
}
.elab-lab #main[data-page="travaux"] .kboard{gap:11px}
.elab-lab #main[data-page="travaux"] .kcol{
  overflow:hidden;
  border-radius:14px;
  box-shadow:none;
}
.elab-lab #main[data-page="travaux"] .kcol-h{
  min-height:43px;
  background:var(--surface3);
}
.elab-lab #main[data-page="travaux"] .kcol-b{padding:9px}
.elab-lab #main[data-page="travaux"] .kcard{
  border-color:var(--line);
  box-shadow:none;
}
.elab-lab #main[data-page="travaux"] .kcard:hover{box-shadow:var(--ui-shadow)}
.elab-lab #main[data-page="travaux"] .cardgrid{gap:11px}

/* ---------- Fiche travail ---------- */
.elab-lab #main.work-editor .head4{
  grid-template-columns:238px minmax(230px,1.05fr) minmax(230px,1fr) minmax(220px,.92fr);
  gap:var(--ui-gap);
  margin-bottom:var(--ui-gap);
}
.elab-lab #main.work-editor .head4 .blk{
  overflow:hidden;
  border-radius:14px;
  box-shadow:var(--ui-shadow);
}
.elab-lab #main.work-editor .head4 .blk-cal{padding-top:9px}
.elab-lab #main.work-editor .wo-topcal{
  min-height:25px;
  padding-bottom:7px;
  border-bottom:1px solid var(--line);
}
.elab-lab #main.work-editor .ctxrow{
  display:grid;
  grid-template-columns:minmax(420px,.9fr) minmax(520px,1.35fr);
  gap:var(--ui-gap);
  margin-bottom:var(--ui-gap);
}
.elab-lab #main.work-editor .odo-card,
.elab-lab #main.work-editor .mark-card{
  width:auto;
  min-width:0;
  max-width:none;
  flex:none;
  box-shadow:var(--ui-shadow);
}
.elab-lab #main.work-editor .mark-card{padding:10px 14px 43px}
.elab-lab #main.work-editor .markhead{
  align-items:flex-start;
  justify-content:space-between;
}
.elab-lab #main.work-editor .markrow{
  align-items:center;
  justify-content:space-between;
  gap:8px;
}
.elab-lab #main.work-editor .markrow .dtabs{min-width:0;margin:0}
.elab-lab #main.work-editor .markrow .actions{margin-left:auto}
.elab-lab #main.work-editor .te-card,
.elab-lab #main.work-editor #tabDetails>.card,
.elab-lab #main.work-editor #tabPhotos>.card,
.elab-lab #main.work-editor #tabMessages>.card,
.elab-lab #main.work-editor #tabTarif>.card{
  border-radius:14px;
  box-shadow:var(--ui-shadow);
}

/* ---------- Facturation ---------- */
.elab-lab #main[data-page="facturation"] .fact-top{
  padding-top:0;
  border-radius:0 0 14px 14px;
}
.elab-lab #main[data-page="facturation"] .fact-top>.page-head{
  margin-bottom:9px;
  flex-wrap:wrap;
}
.elab-lab #main[data-page="facturation"] #invQ{
  width:clamp(210px,25vw,370px);
  margin-left:4px!important;
}
.elab-lab #main[data-page="facturation"] .fact-bar,
.elab-lab #main[data-page="facturation"] .ach-bar{
  margin:0 0 12px;
  padding:8px;
}
.elab-lab #main[data-page="facturation"] .fact-per{
  min-width:0;
  justify-content:flex-end;
}
.elab-lab #main[data-page="facturation"] .fact-per .ginput{background:var(--surface2)}
.elab-lab #main[data-page="facturation"] .fin-kpis{margin:12px 0 14px}
.elab-lab #main[data-page="facturation"] .fin-kpi{
  min-width:0;
  min-height:86px;
}
.elab-lab #main[data-page="facturation"] .stick-b{
  border:1px solid var(--line);
  border-radius:12px 12px 0 0;
  overflow:hidden;
  background:var(--surface);
}
.elab-lab #main[data-page="facturation"] .stick-b+.wlist{
  border-top:0;
  border-radius:0 0 14px 14px;
}
.elab-lab #main[data-page="facturation"] .whead{border-bottom:1px solid var(--line)}
.elab-lab #main[data-page="facturation"] .invrow .cl b{
  display:-webkit-box;
  overflow:hidden;
  -webkit-line-clamp:2;
  -webkit-box-orient:vertical;
}

/* ---------- Statistiques ---------- */
.elab-lab #main[data-page="stats"]>.page-head{flex-wrap:wrap}
.elab-lab #main[data-page="stats"] .statcards{
  grid-template-columns:repeat(6,minmax(0,1fr));
  gap:var(--ui-gap);
  margin-bottom:var(--ui-gap);
}
.elab-lab #main[data-page="stats"] .statcard{
  min-width:0;
  min-height:78px;
  display:flex;
  flex-direction:column;
  align-items:flex-start;
  justify-content:center;
  text-align:left;
  border-left:3px solid var(--line2);
}
.elab-lab #main[data-page="stats"] .statcard:nth-child(2),
.elab-lab #main[data-page="stats"] .statcard:nth-child(3){border-left-color:var(--accent)}
.elab-lab #main[data-page="stats"] .statcard .sc-n{
  color:var(--text);
  font-size:20px;
}
.elab-lab #main[data-page="stats"] .statcard .sc-pct{
  margin-left:5px;
  color:var(--muted);
  font-size:10px;
}
.elab-lab #main[data-page="stats"]>.gestion-grid{
  grid-template-columns:repeat(2,minmax(0,1fr));
  align-items:start;
  gap:var(--ui-gap);
}
.elab-lab #main[data-page="stats"]>.gestion-grid>.card{margin:0}
.elab-lab #main[data-page="stats"] .stat-wide{grid-column:1/-1}
.elab-lab #main[data-page="stats"] .statline{
  min-height:30px;
  padding:4px 0;
}
.elab-lab #main[data-page="stats"] .sl-bar{
  min-width:80px;
  height:10px;
  background:var(--surface3);
}
.elab-lab #main[data-page="stats"] .sl-val{
  white-space:nowrap;
  font-variant-numeric:tabular-nums;
}

/* ---------- Paramètres ---------- */
.elab-lab #main[data-page="parametres"]>.page-head{align-items:center}
.elab-lab #main[data-page="parametres"] .gs-tabs{
  min-width:0;
  margin:0 0 0 8px!important;
  padding:3px;
  border-radius:11px;
  background:var(--surface2);
  overflow-x:auto;
  flex-wrap:nowrap;
}
.elab-lab #main[data-page="parametres"] .gs-tabs .tf{flex:none}
.elab-lab #main[data-page="parametres"] .tk-row{
  gap:var(--ui-gap);
  margin-bottom:var(--ui-gap);
}
.elab-lab #main[data-page="parametres"] .tk{
  min-height:66px;
  padding:10px 13px;
  border:1px solid var(--line);
  border-radius:12px;
  background:var(--surface);
  box-shadow:var(--ui-shadow);
}
.elab-lab #main[data-page="parametres"] .tk b{
  overflow:hidden;
  text-overflow:ellipsis;
  white-space:nowrap;
}
.elab-lab #main[data-page="parametres"] .gestion-grid{gap:var(--ui-gap)}
.elab-lab #main[data-page="parametres"] .gset.card{padding:16px 18px}
.elab-lab #main[data-page="parametres"] .gset.card>h2{
  display:flex;
  align-items:center;
  min-height:25px;
  margin-bottom:8px;
}
.elab-lab #main[data-page="parametres"] .theme-gallery{
  grid-template-columns:repeat(3,minmax(0,1fr));
}
.elab-lab #main[data-page="parametres"] .labcol-row{gap:9px}
.elab-lab #main[data-page="parametres"] .color-pick{
  width:32px!important;
  height:32px!important;
  min-width:32px;
  flex:0 0 32px;
  padding:3px;
  border:1px solid var(--line2);
  border-radius:9px;
  background:var(--surface);
}
.elab-lab #main[data-page="parametres"] .parlist{
  border-top:1px solid var(--line);
  border-bottom:1px solid var(--line);
}
.elab-lab #main.settings-display{
  gap:var(--ui-gap);
}
.elab-lab #main.settings-display>.card[data-gs="affichage"],
.elab-lab #main.settings-display>.gestion-grid>.settings-autom{
  height:100%;
}

/* ---------- écrans intermédiaires / zoom 125 % ---------- */
@media(max-width:1380px){
  .elab-lab #main.work-editor .head4{
    grid-template-columns:228px repeat(2,minmax(235px,1fr));
  }
  .elab-lab #main.work-editor .head4 .blk:last-child{grid-column:2/4}
  .elab-lab #main[data-page="stats"] .statcards{grid-template-columns:repeat(3,minmax(0,1fr))}
}

@media(max-width:1120px){
  .elab-lab #main[data-page="travaux"] .ktools{grid-template-columns:1fr}
  .elab-lab #main[data-page="travaux"] .kdate{padding:0 0 8px;border:0;border-bottom:1px solid var(--line)}
  .elab-lab #main.work-editor .head4{grid-template-columns:repeat(2,minmax(0,1fr))}
  .elab-lab #main.work-editor .head4 .blk-cal{grid-column:1}
  .elab-lab #main.work-editor .head4 .blk:last-child{grid-column:auto}
  .elab-lab #main.work-editor .ctxrow{grid-template-columns:1fr}
  .elab-lab #main[data-page="facturation"] .fact-per{width:100%;justify-content:flex-start;margin-left:0}
  .elab-lab #main[data-page="stats"]>.gestion-grid{grid-template-columns:1fr}
  .elab-lab #main[data-page="stats"] .stat-wide{grid-column:1}
}

@media(max-width:820px){
  .elab-lab #main>.page-head:first-child,
  .elab-lab #main>.fact-top>.page-head:first-child{align-items:flex-start}
  .elab-lab #main[data-page="accueil"] .day-nav{width:100%;overflow-x:auto;flex-wrap:nowrap}
  .elab-lab #main[data-page="accueil"] .day-nav>*{flex:none}
  .elab-lab #main[data-page="travaux"]>.page-head .search{width:100%;order:10}
  .elab-lab #main[data-page="travaux"] .works-listbar{align-items:flex-start;flex-direction:column}
  .elab-lab #main.work-editor .head4{grid-template-columns:1fr}
  .elab-lab #main.work-editor .head4 .blk-cal,
  .elab-lab #main.work-editor .head4 .blk:last-child{grid-column:auto}
  .elab-lab #main[data-page="facturation"] #invQ{width:100%;margin-left:0!important;order:12}
  .elab-lab #main[data-page="stats"] .statcards{grid-template-columns:repeat(2,minmax(0,1fr))}
  .elab-lab #main[data-page="parametres"]>.page-head{align-items:flex-start}
  .elab-lab #main[data-page="parametres"] .gs-tabs{width:100%;margin-left:0!important}
  .elab-lab #main[data-page="parametres"] .theme-gallery{grid-template-columns:repeat(2,minmax(0,1fr))}
}

@media(max-width:520px){
  .elab-lab #main[data-page="stats"] .statcards{grid-template-columns:1fr}
  .elab-lab #main[data-page="stats"] .statline{
    grid-template-columns:minmax(90px,1fr) minmax(60px,1fr);
  }
  .elab-lab #main[data-page="stats"] .statline .sl-val{grid-column:1/-1;padding-top:0}
  .elab-lab #main[data-page="parametres"] .theme-gallery{grid-template-columns:1fr}
}

@media print{
  .elab-lab #main>.page-head:first-child,
  .elab-lab #main>.fact-top>.page-head:first-child{border-bottom:1px solid #bbb}
  .elab-lab #main>.page-head:first-child::after,
  .elab-lab #main>.fact-top>.page-head:first-child::after{display:none}
}

/* --- ui-v363.css --- */
/* ========================================================================== 
   e-LAB 0.365.0 — invitation d'installation PWA, charte Minéral Pro
   ========================================================================== */
.elab-lab .pwa-install-banner{
  position:fixed;
  right:22px;
  bottom:22px;
  z-index:99998;
  display:grid;
  grid-template-columns:48px minmax(0,1fr) 28px;
  gap:0 13px;
  width:min(430px,calc(100vw - 32px));
  padding:15px;
  border:1px solid var(--line2);
  border-radius:16px;
  background:color-mix(in srgb,var(--surface) 96%,var(--bg));
  color:var(--text);
  box-shadow:0 18px 52px rgba(17,32,29,.22);
  opacity:0;
  transform:translateY(12px);
  transition:opacity .2s ease,transform .2s ease;
}
.elab-lab .pwa-install-banner.show{opacity:1;transform:translateY(0)}
.elab-lab .pwa-install-icon{
  grid-row:1;
  width:48px;
  height:48px;
  border-radius:12px;
  box-shadow:0 0 0 1px var(--line);
}
.elab-lab .pwa-install-copy{grid-column:2;display:flex;flex-direction:column;gap:3px;min-width:0}
.elab-lab .pwa-install-copy strong{font-size:14px;line-height:1.3}
.elab-lab .pwa-install-copy span{font-size:12.5px;line-height:1.45;color:var(--muted)}
.elab-lab .pwa-install-close{
  grid-column:3;
  align-self:start;
  width:28px;
  height:28px;
  padding:0;
  border:0;
  border-radius:8px;
  background:transparent;
  color:var(--muted);
  font:400 21px/28px system-ui,sans-serif;
  cursor:pointer;
}
.elab-lab .pwa-install-close:hover{background:var(--surface2);color:var(--text)}
.elab-lab .pwa-install-actions{
  grid-column:2/4;
  display:flex;
  justify-content:flex-end;
  gap:8px;
  margin-top:12px;
}
.elab-lab .pwa-install-actions .btn,
.elab-lab .pwa-install-actions .newbtn{
  display:inline-flex;
  flex:1 1 0;
  align-items:center;
  justify-content:center;
  min-width:0;
  min-height:38px;
  padding:8px 14px;
}
.elab-lab #pwaInstallBtn{font-weight:700}
.elab-lab #pwaInstallBtn[hidden]{display:none!important}
@media(max-width:720px){
  .elab-lab .pwa-install-banner{right:12px;bottom:12px;width:calc(100vw - 24px)}
}
@media(prefers-reduced-motion:reduce){
  .elab-lab .pwa-install-banner{transition:none}
}

/* --- ui-v366.css --- */
/* =====================================================================
   e-LAB 0.366.0 — composants fonctionnels et dette CSS progressive
   Couche additive chargee apres les finitions precedentes.
   ===================================================================== */

/* Six utilitaires simples remplacent les styles en ligne les plus repetes
   dans app.js. Ils couvrent 168 occurrences sans modifier le DOM metier. */
.elab-lab .u-w-100{width:100%}
.elab-lab .u-w-auto{width:auto}
.elab-lab .u-flex-1{flex:1}
.elab-lab .u-text-right{text-align:right}
.elab-lab .u-danger{color:var(--rouge)}
.elab-lab .u-accent{color:var(--accent)}

/* Quantite reellement consommee dans le selecteur de lots. */
.elab-lab .lotpop{width:min(640px,94vw)!important}
.elab-lab .lotpop .lot-list label{
  grid-template-columns:20px 94px minmax(125px,1fr) 58px 78px 26px;
  align-items:center;
}
.elab-lab .lotpop .lot-use{display:grid;gap:2px;min-width:0}
.elab-lab .lotpop .lot-use small{
  color:var(--faint);font-size:9px;font-weight:750;line-height:1;
  letter-spacing:.04em;text-transform:uppercase;
}
.elab-lab .lotpop .lot-use input{
  width:76px;min-width:0;height:27px;margin:0;padding:3px 6px;
  border:1px solid var(--line2);border-radius:7px;background:var(--surface);
  color:var(--text);font:600 11.5px ui-monospace,Menlo,monospace;
}
.elab-lab .lotpop .lot-use input:focus{border-color:var(--accent);outline:none}
@media(max-width:680px){
  .elab-lab .lotpop .lot-list label{
    grid-template-columns:20px 84px minmax(100px,1fr) 70px 26px;
  }
  .elab-lab .lotpop .lot-list .exp{display:none}
}

/* Editeur unique de nomenclature : Tarifs et Tracabilite. */
.elab-lab .nom-modal{width:min(690px,94vw);max-width:690px}
.elab-lab .nom-modal-title{
  display:flex;align-items:center;justify-content:space-between;gap:12px;
  margin-bottom:15px;color:var(--accent);font-size:15px;font-weight:780;
}
.elab-lab .nom-modal-title .mono{
  padding:4px 8px;border:1px solid var(--line);border-radius:7px;
  background:var(--surface2);color:var(--muted);font-size:12px;
}
.elab-lab .nom-form{display:grid;grid-template-columns:1fr 1fr;gap:11px 14px}
.elab-lab .nom-form label{margin:0}
.elab-lab .nom-form .nom-wide{grid-column:1/-1}
.elab-lab .nom-actions{display:flex;align-items:center;gap:8px;margin-top:17px}
.elab-lab .nom-actions .spacer{flex:1}
.elab-lab .nom-section-head{
  display:flex;align-items:center;justify-content:space-between;gap:8px;
  margin:12px 0 4px;padding-top:10px;border-top:1px solid var(--line);
  color:var(--faint);font-size:10px;font-weight:800;letter-spacing:.06em;text-transform:uppercase;
}
.elab-lab .nom-line{
  display:grid;grid-template-columns:90px minmax(110px,1fr) minmax(90px,.75fr) minmax(90px,.8fr) auto;
  gap:8px;align-items:center;padding:6px 0;border-bottom:1px dashed var(--line);font-size:12px;
}
.elab-lab .nom-ref,.elab-lab .nom-sup{color:var(--muted)}
.elab-lab .nom-lot{color:var(--amber);font-size:11px}
.elab-lab .nom-source,.elab-lab .nom-empty{margin-top:5px;color:var(--muted);font-size:11px}
.elab-lab .tra-grid{
  grid-template-columns:80px minmax(120px,1fr) minmax(100px,.85fr) minmax(110px,1fr)
    minmax(90px,.8fr) minmax(120px,1fr) 76px 72px;
}
.elab-lab .tra-edit{justify-self:end;align-self:center}
@media(max-width:1200px){
  .elab-lab .tra-grid{grid-template-columns:80px 1fr 100px minmax(150px,1.2fr) 76px 72px}
}
@media(max-width:640px){
  .elab-lab .nom-form{grid-template-columns:1fr}
  .elab-lab .nom-form .nom-wide{grid-column:auto}
  .elab-lab .nom-line{grid-template-columns:82px 1fr auto}
  .elab-lab .nom-sup,.elab-lab .nom-lot{display:none}
}

/* --- ui-v369.css --- */
/* =====================================================================
   e-LAB 0.370.0 — finitions autonomes et grille Parametres
   Couche additive chargee en dernier : aucune reecriture du theme Mineral.
   ===================================================================== */

/* Parametres > Affichage : deux colonnes independantes. La colonne gauche
   empile 1 puis 2 ; la colonne droite empile 3 puis 4. */
.elab-lab #main.settings-display{display:block}
.elab-lab #main.settings-display>.page-head{margin-bottom:14px}
.elab-lab #main.settings-display>.tk-row{margin-bottom:14px}
.elab-lab .settings-display-grid{
  display:grid;grid-template-columns:minmax(0,1fr) minmax(0,1fr);
  gap:14px;align-items:start;margin-bottom:14px;
}
.elab-lab .settings-display-left,.elab-lab .settings-display-stack{
  display:grid;gap:14px;min-width:0;align-content:start;
}
.elab-lab .settings-display-grid .card{margin:0;min-width:0}
.elab-lab .settings-message .announce-form{
  display:grid;grid-template-columns:2fr 1fr 1fr auto;gap:8px;margin-top:10px;
}
.elab-lab .settings-qr-choice{padding-left:26px}
.elab-lab .settings-select-row{gap:10px}
.elab-lab .settings-load-row{gap:8px;flex-wrap:wrap}
.elab-lab .settings-load-input{width:60px}
.elab-lab .settings-install-action{
  display:grid;grid-template-columns:max-content minmax(0,1fr);align-items:center;gap:12px;margin-top:10px;
}
.elab-lab .settings-install-action .hint{margin:0;line-height:1.35}
.elab-lab .settings-install>p.hint{max-width:680px;margin-bottom:0}
@media(max-width:1050px){
  .elab-lab .settings-display-grid{grid-template-columns:1fr}
}
@media(max-width:700px){
  .elab-lab .settings-message .announce-form{grid-template-columns:1fr}
}

/* Utilitaires progressifs : uniquement des proprietes de presentation.
   Ils permettent de retirer les valeurs statiques repetees du HTML JS. */
.elab-lab .u-m-0{margin:0}
.elab-lab .u-mb-6{margin-bottom:6px}
.elab-lab .u-mb-8{margin-bottom:8px}
.elab-lab .u-mb-10{margin-bottom:10px}
.elab-lab .u-mb-12{margin-bottom:12px}
.elab-lab .u-m-0-0-8{margin:0 0 8px}
.elab-lab .u-m-0-0-10{margin:0 0 10px}
.elab-lab .u-m-0-0-12{margin:0 0 12px}
.elab-lab .u-mt-6{margin-top:6px}
.elab-lab .u-mt-8{margin-top:8px}
.elab-lab .u-mt-10{margin-top:10px}
.elab-lab .u-mt-12{margin-top:12px}
.elab-lab .u-mt-14{margin-top:14px}
.elab-lab .u-grid-full{grid-column:1/-1}
.elab-lab .u-center{text-align:center}
.elab-lab .u-pointer{cursor:pointer}
.elab-lab .u-pad-8{padding:8px}
.elab-lab .u-small-muted{font-size:11px;color:var(--muted)}
.elab-lab .u-faint{color:var(--faint)}
.elab-lab .u-text{color:var(--text)}
.elab-lab .u-fs-9{font-size:9px}
.elab-lab .u-fs-11{font-size:11px}
.elab-lab .u-fs-12{font-size:12px}
.elab-lab .u-flex-gap-8{display:flex;gap:8px}
.elab-lab .u-flex-gap-8-mt10{display:flex;gap:8px;margin-top:10px}
.elab-lab .u-flex-wrap-mb8{display:flex;gap:10px;flex-wrap:wrap;margin-bottom:8px}

/* Estimation EASYLab : informative, jamais confondue avec le stock reel. */
.elab-lab .sales-estimate{margin-top:14px}
.elab-lab .sales-estimate-head{
  display:flex;align-items:flex-start;justify-content:space-between;gap:12px;
  padding:13px 15px;border-bottom:1px solid var(--line);
}
.elab-lab .sales-estimate-head h2{margin:0 0 3px}
.elab-lab .sales-estimate-head p{margin:0}
.elab-lab .sales-estimate-grid{
  display:grid;grid-template-columns:minmax(150px,1.3fr) minmax(120px,1fr) 100px 110px;
  gap:10px;align-items:center;padding:8px 15px;border-bottom:1px solid var(--line);
  font-size:12px;
}
.elab-lab .sales-estimate-grid.head{
  color:var(--faint);font-size:10px;font-weight:750;letter-spacing:.05em;text-transform:uppercase;
}
.elab-lab .sales-estimate-grid .num{text-align:right;font-family:'JetBrains Mono',monospace}
.elab-lab .sales-estimate-empty{padding:18px 15px;color:var(--muted);font-size:12px}
@media(max-width:700px){
  .elab-lab .sales-estimate-grid{grid-template-columns:1fr 90px}
  .elab-lab .sales-estimate-grid>:nth-child(2),
  .elab-lab .sales-estimate-grid>:nth-child(3){display:none}
}

/* --- ui-v372.css --- */
/* =====================================================================
   e-LAB 0.372.0 — dette CSS ciblee, rendu strictement inchange
   Cette couche retire des declarations de presentation des gabarits JS
   Tracabilite / Stock / Lots sans modifier leur structure ni leur metier.
   ===================================================================== */

.elab-lab .lot-create-hint{margin:4px 0 6px}
.elab-lab .tra-empty{padding:16px}
.elab-lab .tra-truncated{padding:10px 16px}
.elab-lab .stk-expired-badge{
  background:rgba(242,109,109,.16);color:var(--rouge);cursor:pointer;
}
.elab-lab .stock-search{width:min(280px,40vw)}
.elab-lab .stk-clear-active{border-color:var(--accent);color:var(--accent)}
.elab-lab .stk-due-label{color:var(--amber)}
.elab-lab .lot-available{
  display:block;margin-top:2px;color:var(--accent);font-size:9px;font-weight:750;
  line-height:1;white-space:nowrap;
}

/* --- ui-v377.css --- */
/* e-LAB 0.377.0 — dette CSS ciblee : ecrans Statistiques.
   Ces regles remplacent uniquement des styles inline statiques, a rendu
   strictement equivalent dans la charte Mineral. */

.stats-yoy-head {
  font-size: 10px;
  font-weight: 700;
  text-transform: uppercase;
  letter-spacing: .06em;
  color: var(--faint);
}
.stats-yoy-row { grid-template-columns: 1fr 120px 160px; }
.stats-client-link { cursor: pointer; text-decoration: underline dotted; }
.stats-client-group { color: var(--violet); font-size: 10px; }
.stats-client-title {
  font-size: 12px;
  font-weight: 800;
  color: var(--accent);
  margin-bottom: 8px;
}
.stats-filter-year { flex: 0 0 130px; }
.stats-filter-report { flex: 0 0 260px; }
.stats-filter-date { flex: 0 0 150px; }
.stats-filter-search { flex: 1; min-width: 170px; }
.stats-card-title { margin: 0 0 2px; }
.stats-report-hint { margin: -4px 0 12px; }
.stats-report-count { margin: 6px 0 0; }
.rp-work-link { padding: 0; border: 0; background: transparent; color: var(--accent);
  font: inherit; font-weight: 700; text-decoration: underline; text-underline-offset: 2px; cursor: pointer; }
.rp-work-link:hover { color: var(--accent2); }
.stats-afmps-code { width: 80px; }
.stats-afmps-qty { width: 70px; text-align: right; }
.stats-afmps-amount,
.stats-run-amount { width: 110px; text-align: right; }
.stats-reset-title { margin: 0 0 4px; }
.stats-reset-hint { margin: 0; max-width: 640px; }
.stats-run-date { width: 150px; }
.stats-run-coef { width: 70px; }
.stats-run-kind { width: 90px; }

@media (max-width: 760px) {
  .stats-yoy-row { grid-template-columns: minmax(140px, 1fr) 90px 120px; }
  .stats-filter-year,
  .stats-filter-report,
  .stats-filter-date,
  .stats-filter-search { flex: 1 1 150px; }
}

/* --- ui-v378.css --- */
/* e-LAB 0.378.0 — Accueil : devis separes et grille metier lisible. */

/* Sur trois colonnes :
   1) Entres | A sortir | Sortis
   2) Retards sur deux colonnes | Sous-traitant
   3) Devis sur deux colonnes   | Plaintes */
.elab-lab #main[data-page="accueil"] #homeGrid
  .home-card:is([data-home-key="overdue"],[data-home-key="quotes"]){
  grid-column:span 2;
}

/* Les deux listes larges montrent les donnees completes. Si un libelle est
   exceptionnellement long, il passe a la ligne au lieu de produire « ... ». */
.elab-lab #main[data-page="accueil"] #homeGrid
  .home-card:is([data-home-key="overdue"],[data-home-key="quotes"]) .dayrow{
  grid-template-columns:minmax(105px,.65fr) minmax(150px,.9fr)
    minmax(180px,1.2fr) minmax(72px,.45fr) minmax(240px,1.45fr);
  align-items:start;
  gap:8px;
}
.elab-lab #main[data-page="accueil"] #homeGrid
  .home-card:is([data-home-key="overdue"],[data-home-key="quotes"]) .dayrow>span{
  overflow:visible;
  text-overflow:clip;
  white-space:normal;
  overflow-wrap:anywhere;
}

@media(max-width:1300px){
  .elab-lab #main[data-page="accueil"] #homeGrid
    .home-card:is([data-home-key="overdue"],[data-home-key="quotes"]){
    grid-column:1/-1;
  }
}
@media(max-width:900px){
  .elab-lab #main[data-page="accueil"] #homeGrid
    .home-card:is([data-home-key="overdue"],[data-home-key="quotes"]){
    grid-column:auto;
  }
  .elab-lab #main[data-page="accueil"] #homeGrid
    .home-card:is([data-home-key="overdue"],[data-home-key="quotes"]) .dayrow{
    grid-template-columns:54px minmax(0,1fr) minmax(0,1fr) 60px minmax(0,92px);
  }
  .elab-lab #main[data-page="accueil"] #homeGrid
    .home-card:is([data-home-key="overdue"],[data-home-key="quotes"]) .dayrow>span{
    overflow:hidden;
    text-overflow:ellipsis;
    white-space:nowrap;
  }
}

/* --- ui-v379.css --- */
/* e-LAB 0.379.0 — fiche client : saisie sure et lecture equilibree. */

/* Les deux annees de reference se lisent l'une sous l'autre. */
.elab-lab .fc-kpis .kpi-s .fc-yearline{
  display:block;
  line-height:1.35;
  white-space:nowrap;
}

/* Le panneau peut recevoir le focus sans marquer un champ comme editable. */
.elab-lab .modal-client:focus{outline:none}

/* La liste contient six informations utiles par ligne ; elle recoit donc la
   plus grande part de la largeur. Le graphique garde assez d'espace pour ses
   douze mois et repasse sous le tableau sur les ecrans plus etroits. */
.elab-lab .fc-2col{
  grid-template-columns:minmax(0,1.35fr) minmax(0,1fr);
}
.elab-lab .fc-2col .fc-tbl{table-layout:fixed}
.elab-lab .fc-2col .fc-tbl :is(th,td):nth-child(1){width:18%;white-space:nowrap}
.elab-lab .fc-2col .fc-tbl :is(th,td):nth-child(2){width:12%}
.elab-lab .fc-2col .fc-tbl :is(th,td):nth-child(3){width:30%;overflow-wrap:anywhere}
.elab-lab .fc-2col .fc-tbl :is(th,td):nth-child(4){width:14%;white-space:nowrap}
.elab-lab .fc-2col .fc-tbl :is(th,td):nth-child(5){width:14%;white-space:nowrap}
.elab-lab .fc-2col .fc-tbl :is(th,td):nth-child(6){width:12%;white-space:nowrap}

@media(max-width:1100px){
  .elab-lab .fc-2col{grid-template-columns:1fr}
}

/* Achats et Ventes : les pictogrammes restent colorés, sans carré de fond. */
.elab-lab #main[data-page="facturation"] .fin-kpi .kpi-ico{
  background:transparent;
  border-radius:0;
}

/* RGPD — les deux familles de responsables ont exactement la meme largeur. */
.elab-lab .gd-who-split{
  grid-template-columns:repeat(2,minmax(0,1fr));
}

/* Les suppressions de listes restent sobres mais ne sont plus invisibles. */
.elab-lab .gd-x.danger{color:var(--rouge)}
.elab-lab .gd-x.danger:hover{color:var(--rouge);background:rgba(242,109,109,.1)}
.elab-lab .ws-h .hzDel{flex:0 0 auto;align-self:center}

@media(max-width:1100px){
  .elab-lab .gd-who-split{grid-template-columns:1fr}
}

/* --- ui-v380.css --- */
/* e-LAB 0.380.0 — lisibilite des seuils de charge du planning. */

/* Trois chiffres et les fleches natives du champ numerique doivent rester
   visibles sans casser la phrase sur les resolutions usuelles. */
.elab-lab .settings-load-input{
  width:84px;
  min-width:84px;
  text-align:center;
}

/* Les coursiers sont un referentiel d'equipe, pas une etape de fabrication. */
.elab-lab #main[data-page="parametres"] .settings-couriers{order:3}

/* Kanban global et checklist par type : deux cartes autonomes, sans la
   separation interne qui entretenait la confusion dans l'ancien bloc. */
.elab-lab .production-steps-card .prod-cfg{
  border-top:0;
  padding-top:4px;
}
.elab-lab .production-kanban-card .prod-toggles{margin-bottom:0}

/* Douze evenements visibles ; le reste du journal defile dans sa carte. */
.elab-lab .audit-scroll{
  max-height:372px;
  overflow:auto;
  scrollbar-gutter:stable;
}
.elab-lab .audit-table{
  width:100%;
  border-collapse:collapse;
  font-size:12.5px;
}
.elab-lab .audit-row{
  height:31px;
  border-bottom:1px solid var(--line);
}
.elab-lab .audit-row td{white-space:nowrap}
.elab-lab .wh-queue-hint{margin:0 0 8px}

/* Achats : une action Peppol principale, les outils de maintenance dans un
   menu secondaire qui ne concurrence pas le geste quotidien. */
.elab-lab .purchase-tools{position:relative;flex:0 0 auto}
.elab-lab .purchase-tools>summary{list-style:none;white-space:nowrap}
.elab-lab .purchase-tools>summary::-webkit-details-marker{display:none}
.elab-lab .purchase-tools>summary::after{content:' ▾';font-size:10px}
.elab-lab .purchase-tools[open]>summary::after{content:' ▴'}
.elab-lab .purchase-tools-menu{
  position:absolute;
  z-index:30;
  top:calc(100% + 6px);
  right:0;
  min-width:220px;
  padding:7px;
  display:grid;
  gap:6px;
  background:var(--surface);
  border:1px solid var(--line2);
  border-radius:10px;
  box-shadow:var(--shadow-float);
}
.elab-lab .purchase-tools-menu .btn{justify-content:flex-start;width:100%}

/* Les anomalies sont annoncees sur une seule ligne. Le detail reste a un
   clic et conserve les filtres/actions existants. */
.elab-lab .purchase-checks{
  margin:0 0 10px;
  background:var(--surface);
  border:1px solid var(--line2);
  border-left:3px solid var(--amber);
  border-radius:var(--r-sm);
  overflow:hidden;
}
.elab-lab .purchase-checks>summary{
  min-height:36px;
  padding:8px 13px;
  display:flex;
  align-items:center;
  gap:12px;
  cursor:pointer;
  list-style:none;
  color:var(--muted);
  font-size:12.5px;
}
.elab-lab .purchase-checks>summary::-webkit-details-marker{display:none}
.elab-lab .purchase-checks>summary b{color:var(--text)}
.elab-lab .purchase-checks>summary span{margin-left:auto;color:var(--amber);font-weight:700}
.elab-lab .purchase-checks>summary::after{content:'▾';color:var(--accent)}
.elab-lab .purchase-checks[open]>summary::after{content:'▴'}
.elab-lab .purchase-checks-list{border-top:1px solid var(--line)}
.elab-lab .purchase-checks-list :is(.ach-exc,.rap-bar){
  margin:0;
  border:0;
  border-bottom:1px solid var(--line);
  border-radius:0;
  box-shadow:none;
}
.elab-lab .purchase-checks-list :is(.ach-exc,.rap-bar):last-child{border-bottom:0}

/* Le rapport comporte quatre colonnes : il exploite l'ecran disponible et
   ne force plus un ascenseur horizontal dans une modale de 540 px. */
.elab-lab .modal.sales-estimate{
  width:min(920px,calc(100vw - 40px));
  max-width:920px;
}

/* --- ui-v382.css --- */
/* e-LAB 0.382.0 — finitions i18n et menus de la note. */

/* Les listes de codes et de lots sont des fenêtres d'aide à la saisie.
   La carte de la note les rognait avec overflow:hidden : elles passent
   maintenant devant les lignes et les cartes voisines. */
.elab-lab #main.work-editor #tabActes > .te-card{
  position:relative;
  z-index:30;
  overflow:visible;
}
.elab-lab #main.work-editor .te-row:focus-within{z-index:60}
.elab-lab #main.work-editor .te-row > .ac,
.elab-lab #main.work-editor .te-row > .lotpop{z-index:80}

@media(max-width:760px){
  .elab-lab #main.work-editor #tabActes > .te-card{
    overflow-x:auto;
    overflow-y:visible;
  }
}

/* --- ui-v383.css --- */
/* e-LAB 0.383.0 — finitions langues, tournées et document CGV. */

/* L'action "parti" garde son pictogramme et son libellé sur une seule ligne. */
.elab-lab .tourrow{
  grid-template-columns:56px 62px minmax(180px,1.15fr) minmax(90px,.8fr) 104px 132px 100px 116px;
}
.elab-lab .tourrow .tstep{white-space:nowrap}

/* Le mois visible est formaté par e-LAB dans la langue de l'interface.
   L'input natif reste superposé afin de conserver le sélecteur du navigateur. */
.elab-lab .works-month-picker{
  position:relative;display:inline-flex;align-items:center;justify-content:space-between;
  gap:10px;width:154px;height:36px;padding:0 10px;box-sizing:border-box;
  border:1px solid var(--line2);border-radius:9px;background:var(--surface);
  color:var(--text);font-size:12px;cursor:pointer;overflow:hidden;
}
.elab-lab .works-month-calendar{color:var(--muted);font-size:13px}
.elab-lab .works-month-picker input{
  position:absolute;inset:0;width:100%;height:100%;opacity:0;cursor:pointer;
}

/* Le menu utilisateur ne transforme plus l'installation en titre gras. */
.elab-lab .usermenu{min-width:230px}
.elab-lab #pwaInstallBtn{
  display:flex;align-items:center;gap:8px;font-weight:400!important;
  white-space:nowrap;font-size:12px
}
.elab-lab #pwaInstallBtn[hidden]{display:none!important}
.elab-lab .pwa-menu-icon{
  width:20px;height:20px;flex:0 0 20px;border-radius:6px;object-fit:cover
}

/* Les CGV se rédigent sur une vraie feuille A4. Les mêmes unités physiques
   (210 × 297 mm, marges comprises) rendent la longueur et les retours à la
   ligne beaucoup plus proches de l'annexe imprimée. */
.elab-lab .co-terms-card{overflow-x:auto;padding:20px}
.elab-lab .co-terms-head{align-items:center;margin-bottom:16px}
.elab-lab .co-terms-tabs{
  gap:6px;padding:5px;border-radius:12px;background:var(--surface2);
}
.elab-lab .co-terms-tab{
  display:inline-flex;align-items:center;gap:7px;min-width:auto;height:36px;
  padding:0 13px;border:1px solid transparent;border-radius:9px;
  background:var(--surface);color:var(--muted);font-size:11.5px;font-weight:550;
}
.elab-lab .co-terms-tab span{
  display:inline-grid;place-items:center;min-width:24px;height:20px;padding:0 4px;
  border-radius:6px;background:var(--surface2);font-size:9px;font-weight:750;
  letter-spacing:.06em;color:var(--faint);
}
.elab-lab .co-terms-tab.on{border-color:var(--accent);background:var(--accent);color:var(--on-accent)}
.elab-lab .co-terms-tab.on span{background:rgba(255,255,255,.18);color:inherit}
.elab-lab .co-terms-pane>.rtb{width:min(210mm,100%);box-sizing:border-box;margin:0 auto}
.elab-lab .co-terms-paper-stage{min-width:min(210mm,100%);padding:12px 0 20px}
.elab-lab .co-terms-editor{
  width:210mm;max-width:100%;min-height:297mm;max-height:none;margin:0 auto;
  padding:18mm 20mm;box-sizing:border-box;border-radius:0;
  background:#fff;color:#1c2b24;font-size:10.5pt;line-height:1.48;
  box-shadow:0 8px 28px rgba(21,45,39,.13);overflow:visible;
}
@media(max-width:900px){
  .elab-lab .tourrow{
    grid-template-columns:40px 44px minmax(150px,1fr) 88px auto auto 108px;
  }
  .elab-lab .co-terms-head{align-items:stretch;flex-direction:column}
  .elab-lab .co-terms-tabs{align-self:flex-start;flex-wrap:wrap}
  .elab-lab .co-terms-editor{min-height:70vh;padding:22px}
}

/* --- ui-v3841.css --- */
/* e-LAB 0.385.0 — micro-correctif du menu utilisateur. */

/* Le menu NL est plus long que le français. La barre latérale gagne juste
   l'espace nécessaire pour conserver les actions sur une ligne. */
@media (min-width:881px){
  .elab-lab nav{
    width:264px;
    overflow-x:hidden;
  }
}

/* Le popup reste entièrement contenu dans la barre latérale : il n'est plus
   rogné à droite et ne peut plus créer d'ascenseur horizontal. */
.elab-lab .navfoot{min-width:0}
.elab-lab .usermenu{
  left:0;
  right:0;
  width:auto;
  min-width:0;
  max-width:100%;
  box-sizing:border-box;
  z-index:200;
  overflow:hidden;
}
.elab-lab #pwaInstallBtn{
  white-space:nowrap;
  font-size:11.5px;
}

/* Recherche transversale disponible sans quitter la fiche de travail. */
.work-editor .wo-editorbar{
  display:flex;
  align-items:center;
  gap:10px;
  margin:0 0 7px;
}
.work-editor .wo-editorbar>.back{
  flex:0 0 auto;
  height:36px;
  margin:0;
  padding:0 14px;
  border:1px solid var(--line);
  border-radius:10px;
  background:var(--surface);
  color:var(--accent);
  font-weight:700;
  cursor:pointer;
}
.work-editor .wo-editorbar>.back:hover{border-color:var(--accent);background:var(--accent-glow)}
.work-editor .wo-editorbar>#saveState{
  flex:0 0 auto;
  color:var(--muted);
  font-size:11px;
  white-space:nowrap;
}
.work-editor .wo-global-search{
  position:relative;
  display:flex;
  flex:1 1 auto;
  align-items:center;
  height:36px;
  margin:0;
  border:1px solid var(--line);
  border-radius:10px;
  background:var(--surface);
  box-shadow:0 2px 8px rgba(30,54,51,.05);
  z-index:40;
}
.work-editor .wo-search-icon{margin:0 8px 0 12px;color:var(--muted);font-size:13px}
.work-editor #woGlobalQ{
  flex:1;
  min-width:0;
  height:34px;
  padding:0;
  border:0;
  outline:0;
  background:transparent;
  color:var(--text);
  font-size:12.5px;
}
.work-editor #woGlobalClear{
  display:block;
  width:34px;
  height:34px;
  border:0;
  background:transparent;
  color:var(--muted);
  cursor:pointer;
}
.work-editor #woGlobalClear:not(.show){opacity:.42}
.work-editor #woGlobalClear.show{display:block;opacity:1}
.work-editor .wo-global-results{
  position:absolute;
  left:auto;
  right:0;
  top:calc(100% + 4px);
  width:min(820px,100%);
  max-height:248px;
  box-sizing:border-box;
  overflow:auto;
  overscroll-behavior:contain;
  border:1px solid var(--line);
  border-radius:10px;
  background:var(--surface);
  box-shadow:0 12px 28px rgba(30,54,51,.18);
  z-index:120;
}
.work-editor .wo-search-row{
  display:grid;
  grid-template-columns:minmax(145px,180px) minmax(220px,1.5fr) minmax(150px,.8fr) 96px;
  align-items:center;
  width:100%;
  min-height:42px;
  padding:5px 12px;
  gap:14px;
  border:0;
  border-bottom:1px solid var(--line);
  background:transparent;
  color:var(--text);
  text-align:left;
  cursor:pointer;
}
.work-editor .wo-search-row:last-child{border-bottom:0}
.work-editor .wo-search-row:hover,.work-editor .wo-search-row:focus{background:var(--surface2)}
.work-editor .wo-search-number{
  overflow:hidden;
  color:var(--accent2);
  font-family:var(--mono);
  font-size:15px;
  font-weight:800;
  line-height:1.1;
  text-overflow:ellipsis;
  white-space:nowrap;
}
.work-editor .wo-search-main{font-size:15px;font-weight:650;line-height:1.15}
.work-editor .wo-search-main,.work-editor .wo-search-client{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.work-editor .wo-search-client,.work-editor .wo-search-date{color:var(--muted);font-size:10.5px;line-height:1.15}
.work-editor .wo-search-date{text-align:right;white-space:nowrap}
.work-editor .wo-search-empty{padding:14px;color:var(--muted);font-size:12px}
@media (max-width:700px){
  .work-editor .wo-editorbar{gap:6px}
  .work-editor .wo-editorbar>.back{padding:0 9px}
  .work-editor .wo-editorbar>#saveState{display:none}
  .work-editor .wo-search-row{grid-template-columns:118px 1fr 76px;gap:8px}
  .work-editor .wo-search-client{display:none}
}

/* Fiche travail : un meme langage de forme pour les cinq onglets. Tarif
   n'est plus une pilule isolee et chaque onglet garde un cadre visible. */
.work-editor .markrow .dtabs button,
.work-editor .markrow .dtabs #openCat{
  box-sizing:border-box;
  border:1px solid var(--line2);
  border-radius:9px;
  background:var(--surface);
}
.work-editor .markrow .dtabs button:hover,
.work-editor .markrow .dtabs #openCat:hover{
  border-color:var(--accent);
}
.work-editor .markrow .dtabs button.on{
  border-color:color-mix(in srgb,var(--accent) 55%,var(--line));
  background:var(--accent-glow);
}

/* Meme regle pour tous les outils : couleur differente selon l'action,
   mais cadre, rayon et hauteur identiques. Sous-traiter n'est plus le seul
   bouton encadre. */
.work-editor .markrow .actions.work-tools .toolbtn.big,
.work-editor .markrow .actions.work-tools .newbtn,
.work-editor .markrow .actions.work-tools #wLabSend{
  box-sizing:border-box;
  border:1px solid var(--line2);
  border-radius:9px;
}

/* --- ui-v3876.css --- */
/* e-LAB 0.387.6 — journée de travail par technicien. */

.elab-lab #main[data-page="planning"] .tp-head{gap:8px;flex-wrap:wrap}
.elab-lab .tp-date{width:148px;height:36px;padding:0 9px}

.elab-lab .tp-kpis{
  display:grid;
  grid-template-columns:repeat(4,minmax(130px,1fr));
  gap:10px;
  margin:0 0 8px;
}
.elab-lab .tp-kpis>div{
  display:flex;
  align-items:center;
  justify-content:space-between;
  min-height:52px;
  padding:9px 13px;
  border:1px solid var(--line);
  border-radius:11px;
  background:var(--surface);
}
.elab-lab .tp-kpis span{color:var(--muted);font-size:10.5px;font-weight:700;text-transform:uppercase;letter-spacing:.04em}
.elab-lab .tp-kpis b{font-family:var(--mono);font-size:15px}
.elab-lab .tp-kpis .positive b{color:var(--accent2)}
.elab-lab .tp-kpis .negative b{color:var(--rouge)}
.elab-lab .tp-kpis .missing b{color:var(--faint)}
.elab-lab .tp-note{margin:0 2px 10px;font-size:10.5px}

.elab-lab .tp-grid{
  display:grid;
  grid-template-columns:repeat(auto-fit,minmax(285px,1fr));
  align-items:start;
  gap:12px;
}
.elab-lab .tp-tech{
  min-width:0;
  padding:0 11px 11px;
  overflow:hidden;
  border-top:4px solid var(--tp-color,var(--faint));
}
.elab-lab .tp-tech.unassigned{border-top-style:dashed}
.elab-lab .tp-tech>header{
  display:flex;
  align-items:center;
  gap:9px;
  min-height:52px;
  padding:8px 1px 7px;
  border-bottom:1px solid var(--line);
}
.elab-lab .tp-avatar{
  display:inline-flex;
  align-items:center;
  justify-content:center;
  flex:0 0 32px;
  width:32px;
  height:32px;
  border-radius:9px;
  background:color-mix(in srgb,var(--tp-color,var(--faint)) 18%,var(--surface));
  color:var(--text);
  font-family:var(--mono);
  font-size:11px;
  font-weight:800;
}
.elab-lab .tp-tech>header h2{margin:0;font-size:14px;line-height:1.2}
.elab-lab .tp-tech>header p{margin:2px 0 0;color:var(--muted);font-size:10.5px}
.elab-lab .tp-tech-time{
  display:flex;
  justify-content:space-between;
  gap:8px;
  padding:7px 1px;
  color:var(--muted);
  font-size:10.5px;
}
.elab-lab .tp-tech-time b{margin-left:3px;color:var(--text);font-family:var(--mono)}
.elab-lab .tp-profit{
  display:flex;
  align-items:center;
  justify-content:space-between;
  min-height:28px;
  margin:0 0 8px;
  padding:5px 8px;
  border-radius:8px;
  font-size:10.5px;
}
.elab-lab .tp-profit.positive{background:var(--accent-glow);color:var(--accent2)}
.elab-lab .tp-profit.negative{background:rgba(192,57,43,.09);color:var(--rouge)}
.elab-lab .tp-profit.missing{background:var(--surface2);color:var(--muted)}
.elab-lab .tp-list{display:grid;gap:7px}
.elab-lab .tp-empty{margin:8px 2px}

.elab-lab .tp-task{
  padding:8px 9px;
  border:1px solid var(--line);
  border-radius:9px;
  background:var(--surface2);
  cursor:pointer;
}
.elab-lab .tp-task:hover{border-color:var(--line2);box-shadow:0 4px 12px rgba(30,54,51,.06)}
.elab-lab .tp-task.running{border-color:var(--accent);box-shadow:inset 3px 0 0 var(--accent)}
.elab-lab .tp-task.completed{opacity:.72}
.elab-lab .tp-task-head{display:flex;align-items:center;justify-content:space-between;gap:8px}
.elab-lab .tp-task-head>.mono{color:var(--accent2);font-size:11.5px}
.elab-lab .tp-task h3{overflow:hidden;margin:5px 0 0;font-size:13px;line-height:1.15;text-overflow:ellipsis;white-space:nowrap}
.elab-lab .tp-client{overflow:hidden;margin:2px 0 0;color:var(--muted);font-size:10.5px;text-overflow:ellipsis;white-space:nowrap}
.elab-lab .tp-lines{
  display:-webkit-box;
  overflow:hidden;
  margin:5px 0 0;
  color:var(--muted);
  font-size:10px;
  line-height:1.25;
  -webkit-box-orient:vertical;
  -webkit-line-clamp:2;
}
.elab-lab .tp-times,.elab-lab .tp-money{
  display:grid;
  grid-template-columns:1fr 1fr;
  gap:6px;
  margin-top:7px;
}
.elab-lab .tp-times span,.elab-lab .tp-money span{
  display:flex;
  justify-content:space-between;
  gap:5px;
  color:var(--muted);
  font-size:9.5px;
}
.elab-lab .tp-times b,.elab-lab .tp-money b{color:var(--text);font-family:var(--mono);white-space:nowrap}
.elab-lab .tp-actions{display:flex;gap:6px;margin-top:8px}
.elab-lab .tp-actions .btn{height:30px;padding:0 9px;border-radius:8px;font-size:10.5px}
.elab-lab .tp-actions .tp-start{border-color:var(--accent);color:var(--accent2)}
.elab-lab .tp-actions .tp-stop{border-color:var(--rouge);color:var(--rouge)}
.elab-lab .tp-actions .tp-correct{margin-left:auto}

@media (max-width:900px){
  .elab-lab .tp-kpis{grid-template-columns:repeat(2,minmax(130px,1fr))}
}
@media (max-width:560px){
  .elab-lab .tp-kpis{grid-template-columns:1fr}
  .elab-lab .tp-grid{grid-template-columns:1fr}
  .elab-lab .tp-head .spacer{display:none}
}

/* 0.389.0 — cartes clients : groupe, langue, pays et statut Peppol. */
.elab-lab .ccard .cc-foot{display:grid;grid-template-columns:1fr;gap:4px}
.elab-lab .ccard .cc-providers{color:var(--text);font-weight:700}
.elab-lab .ccard .cc-facts{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.elab-lab .ccard .cc-facts b{color:var(--muted);font-weight:600}
.elab-lab .ccard .cc-tariff{overflow:hidden;color:var(--text);text-overflow:ellipsis;white-space:nowrap}
.elab-lab .ccard .cc-tariff b{color:var(--muted);font-weight:600}
.elab-lab .ccard .cc-subname{margin:-1px 0 4px 24px;color:var(--muted);font-size:12px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.elab-lab .ccard .cc-peppol{font-weight:700}
.elab-lab .ccard .cc-peppol.on{color:var(--accent2)}
.elab-lab .ccard .cc-peppol.off{color:var(--faint)}
.elab-lab .cl-peppol-toggle{display:flex;align-items:center;gap:7px;margin:2px 0 7px;color:var(--muted);font-size:12px}
.elab-lab .cl-peppol-toggle input{width:auto;accent-color:var(--accent)}
.elab-lab .fc-address-block{padding:2px 0 8px}
.elab-lab .fc-address-block+.fc-address-block{padding-top:9px;border-top:1px solid var(--line)}
.elab-lab .fc-address-block>b{display:block;margin-bottom:5px;color:var(--muted);font-size:10px;text-transform:uppercase;letter-spacing:.05em}
.elab-lab .fc-peppol.on{color:var(--accent2)}
.elab-lab .fc-peppol.off{color:var(--faint)}

/* --- ui-v397.css --- */
/* e-LAB 0.397.0 — module Courriers clients. */
.elab-lab .mail-page-hint{margin:-11px 0 14px;font-size:12px}
.elab-lab .mail-grid{display:grid;grid-template-columns:minmax(420px,.95fr) minmax(470px,1.05fr);gap:14px;align-items:stretch}
.elab-lab .mail-card{min-width:0;height:100%;box-sizing:border-box}
.elab-lab .mail-card>h2{margin:0 0 10px}
.elab-lab .mail-head-actions{display:flex;gap:8px;align-items:stretch;flex-wrap:wrap;margin:0 0 17px}
.elab-lab .mail-head-actions select{min-width:230px;height:36px}
.elab-lab .mail-head-actions button{height:36px}
.elab-lab .mail-lang-tabs{display:flex;gap:5px;margin:13px 0 10px;padding:4px;background:var(--surface2);border-radius:10px}
.elab-lab .mail-lang-tab{flex:1;height:34px;border:0;border-radius:8px;background:transparent;color:var(--muted);font-size:13px;font-weight:750;cursor:pointer}
.elab-lab .mail-lang-tab.on{background:var(--surface);color:var(--text);box-shadow:0 1px 4px rgba(20,40,35,.09)}
.elab-lab .mail-lang-pane[hidden]{display:none}
.elab-lab .mail-lang-pane label,.elab-lab .mail-name{display:block;margin-bottom:10px;color:var(--muted);font-size:11px;font-weight:700;text-transform:uppercase;letter-spacing:.04em}
.elab-lab .mail-lang-pane input,.elab-lab .mail-name input{display:block;width:100%;margin-top:5px}
.elab-lab .mail-lang-pane textarea{display:block;width:100%;min-height:245px;margin-top:5px;resize:vertical;line-height:1.5}
.elab-lab .mail-vars{margin:-3px 0 12px;font-size:11.5px;color:var(--faint)}
.elab-lab .mail-filters{display:grid;grid-template-columns:minmax(170px,1fr) 150px 130px;gap:8px;margin:10px 0}
.elab-lab .mail-select-tools{display:flex;gap:7px;flex-wrap:wrap;margin-bottom:9px}
.elab-lab .mail-rec-list{height:430px;overflow:auto;border:1px solid var(--line);border-radius:11px;background:var(--surface)}
.elab-lab .mail-rec{display:grid;grid-template-columns:24px minmax(135px,1fr) minmax(150px,1fr) 46px;gap:8px;align-items:center;padding:9px 10px;border-bottom:1px solid var(--line)}
.elab-lab .mail-rec:last-child{border-bottom:0}
.elab-lab .mail-rec.off{opacity:.55}
.elab-lab .mail-rec-name{min-width:0;font-size:12.5px;font-weight:700;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.elab-lab .mail-rec-name small{display:block;color:var(--muted);font-size:10.5px;font-weight:500}
.elab-lab .mail-rec-email{min-width:0;font-size:11px;color:var(--muted);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.elab-lab .mail-rec-lang{text-align:center;font-size:10px;font-weight:800;color:var(--accent)}
.elab-lab .mail-summary{display:flex;align-items:center;justify-content:space-between;gap:12px;margin-top:12px;padding:11px 12px;border-radius:11px;background:var(--surface2)}
.elab-lab .mail-summary b{display:block;font-size:13px}.elab-lab .mail-summary small{color:var(--muted)}
.elab-lab .mail-history{margin-top:14px}
.elab-lab .mail-hrow{display:grid;grid-template-columns:minmax(190px,1fr) 130px 220px 125px;gap:12px;align-items:center;padding:11px 4px;border-bottom:1px solid var(--line);cursor:pointer}
.elab-lab .mail-hrow:hover{background:var(--surface2)}
.elab-lab .mail-hname{font-weight:700}.elab-lab .mail-hdate{color:var(--muted);font-size:11px}
.elab-lab .mail-hcounts{font-size:11.5px;color:var(--muted)}
.elab-lab .mail-detail-list{max-height:54vh;overflow:auto;margin-top:12px;border:1px solid var(--line);border-radius:10px}
.elab-lab .mail-detail-row{display:grid;grid-template-columns:minmax(140px,1fr) minmax(170px,1fr) 70px;gap:10px;padding:9px;border-bottom:1px solid var(--line);font-size:11.5px}
@media(max-width:1100px){.elab-lab .mail-grid{grid-template-columns:1fr}.elab-lab .mail-rec-list{height:360px}}
@media(max-width:700px){.elab-lab .mail-filters{grid-template-columns:1fr}.elab-lab .mail-rec{grid-template-columns:24px 1fr 42px}.elab-lab .mail-rec-email{grid-column:2/4}.elab-lab .mail-hrow{grid-template-columns:1fr 100px}.elab-lab .mail-hcounts{grid-column:1/3}}

/* --- ui-v398.css --- */
/* e-LAB 0.398.0 — sélecteurs, dates PWA et croix d'effacement. */
.elab-lab .modal .client-ac{padding:3px}
.elab-lab .modal .cac-item{
  margin:0;padding:7px 8px;border:0;border-bottom:1px solid var(--line);
  border-radius:0;background:transparent;font-size:12px;line-height:1.25
}
.elab-lab .modal .cac-item:last-child{border-bottom:0}
.elab-lab .modal .cac-item:hover{background:var(--surface2)}
.elab-lab .modal .cac-item .c{font-size:11px}
.elab-lab .modal .cac-item .g{font-size:9px}
.elab-lab .field-clear-wrap{position:relative;display:block}
.elab-lab .field-clear-wrap>input{padding-right:42px!important}
.elab-lab .field-clear{
  position:absolute;right:7px;top:50%;transform:translateY(-50%);
  width:30px;height:30px;display:grid;place-items:center;border:0;border-radius:8px;
  background:transparent;color:var(--muted);font-size:18px;line-height:1;cursor:pointer
}
.elab-lab .field-clear:hover{background:var(--surface2);color:var(--rouge)}
.elab-lab .modal-date{position:relative;display:block}
.elab-lab .modal-date>input{width:100%;padding-right:42px!important}
.elab-lab .modal-date>.calbtn{
  position:absolute;right:9px;top:50%;transform:translateY(-50%);
  width:30px;height:30px;justify-content:center;color:var(--text);z-index:2
}
.elab-lab .modal-date>.calbtn svg{width:16px;height:16px}
.elab-lab .modal-date input[type="date"]::-webkit-calendar-picker-indicator{opacity:0}
.elab-lab .hz-client{position:relative}
.elab-lab .hz-client #hClientQ{padding-right:68px}
.elab-lab .hclient-clear{display:none;right:31px;width:26px;height:26px;font-size:15px}
.elab-lab .hclient-clear.show{display:grid}

/* --- ui-v402.css --- */
/* e-LAB 0.402.0 — fiche structurée Plainte / Réponse. */
.elab-lab .cp-modal{width:min(920px,calc(100vw - 20px));max-width:920px;max-height:calc(100vh - 12px);overflow:auto;padding:18px 22px 14px}
.elab-lab .cp-list-row{display:block;width:100%;margin:0 0 8px;padding:12px;text-align:left;color:var(--text);cursor:pointer}
.elab-lab .cp-list-row:hover{border-color:var(--accent);background:var(--surface2)}
.elab-lab .cp-sheet{border:1px solid var(--line2);border-radius:12px;overflow:hidden;background:var(--surface)}
.elab-lab .cp-section{padding:11px 16px}
.elab-lab .cp-section+.cp-section{border-top:1px solid var(--line2)}
.elab-lab .cp-section h4{margin:0 0 9px;font-size:15px;letter-spacing:.02em;text-transform:uppercase}
.elab-lab .cp-section.complaint h4{color:var(--rouge,#C0392B)}
.elab-lab .cp-section.response h4{color:var(--vert,#2E8B57)}
.elab-lab .cp-section-head{display:flex;align-items:center;justify-content:space-between;gap:12px;margin-bottom:9px}
.elab-lab .cp-section-head h4{margin:0}
.elab-lab .cp-afmps-link{font-size:11px;text-decoration:none;white-space:nowrap}
.elab-lab #cpfVigilanceFields{margin-top:8px;padding:8px 10px;border-left:3px solid var(--rouge,#C0392B);background:color-mix(in srgb,var(--rouge,#C0392B) 4%,transparent);border-radius:5px}
.elab-lab .cp-vigilance-grid{grid-template-columns:minmax(220px,1fr)}
.elab-lab .cp-form-grid{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:7px 12px}
.elab-lab .cp-response-grid{grid-template-columns:150px minmax(180px,1fr) 190px}
.elab-lab .cp-section label{display:block;min-width:0}
.elab-lab .cp-section label>span{display:block;margin:0 0 5px;color:var(--muted);font-size:10.5px;font-weight:750;text-transform:uppercase;letter-spacing:.04em}
.elab-lab .cp-section .ginput{width:100%}
.elab-lab .cp-wide{margin-top:7px}
.elab-lab .cp-wide textarea{resize:vertical;line-height:1.4}
.elab-lab #cpfDecision{height:58px;min-height:52px}
.elab-lab #cpfDetail{height:78px;min-height:64px}
.elab-lab #cpfResolution{height:68px;min-height:56px}
.elab-lab .cp-follow-list{margin:0 18px;padding:13px 0;border-top:1px solid var(--line)}
.elab-lab .cp-follow-list p{margin:7px 0 0;padding-left:10px;border-left:2px solid var(--line2);font-size:12px}
.elab-lab .cp-follow-list small{display:block;color:var(--muted);margin-bottom:2px}
.elab-lab .cp-follow-add{display:grid;grid-template-columns:1fr auto;gap:8px;align-items:end;margin:0 18px 14px}
.elab-lab .cp-follow-add textarea{width:100%;resize:vertical}
.elab-lab .cp-form-actions{padding:10px 16px;background:var(--surface2);border-top:1px solid var(--line)}
@media(max-width:700px){
  .elab-lab .cp-form-grid,.elab-lab .cp-response-grid{grid-template-columns:1fr}
  .elab-lab .cp-modal{width:calc(100vw - 16px);max-height:calc(100vh - 16px)}
}

/* --- ui-v403.css --- */
/* e-LAB 0.403.0 — rappels datés, états qualité et historique des passages. */
.elab-lab .modal .cac-item{font-size:11px;padding-top:6px;padding-bottom:6px}
.elab-lab .modal .cac-item .c{font-size:10px;min-width:54px}
.elab-lab .modal .cac-item .g{font-size:8px;padding:2px 6px}
.elab-lab .markrow .actions #wReminder.on{background:var(--amber);color:#fff;box-shadow:0 4px 12px rgba(211,145,32,.24)}
.elab-lab .flag.plainte.on{background:var(--rouge);border-color:var(--rouge);color:#fff}
.elab-lab .flag.rappel.on{background:var(--amber);border-color:var(--amber);color:#fff}
.elab-lab .reminder-due{margin:7px 0 0;font-size:11.5px;color:var(--amber)}
.elab-lab .cp-reminder-color{display:flex;align-items:center;gap:8px;height:38px}
.elab-lab .cp-reminder-color input[type="color"]{width:52px;height:30px;padding:2px;border:1px solid var(--line2);border-radius:7px;background:var(--surface)}
.elab-lab .reminder-modal{width:min(580px,calc(100vw - 28px));max-width:580px}
.elab-lab .reminder-modal>label{display:block;margin-top:14px}
.elab-lab .reminder-modal .tf-lbl{display:block;margin-bottom:6px;font-size:10.5px;font-weight:700;text-transform:uppercase;color:var(--muted)}
.elab-lab .reminder-modal textarea{width:100%;resize:vertical}
.elab-lab .reminder-grid{display:grid;grid-template-columns:1fr 1fr;gap:12px;margin-top:12px}
.elab-lab .reminder-grid-single{grid-template-columns:1fr}
.elab-lab .reminder-global-color{align-items:flex-end}
.elab-lab .reminder-global-color .hint{max-width:520px;margin:0 0 7px}
.elab-lab .reminder-actions{margin-top:18px;padding-top:14px;border-top:1px solid var(--line)}
@media(max-width:620px){.elab-lab .reminder-grid{grid-template-columns:1fr}}
.elab-lab .plm-rem{color:var(--amber);border-color:color-mix(in srgb,var(--amber) 45%,var(--line2));background:color-mix(in srgb,var(--amber) 12%,var(--surface))}
.elab-lab .plrow.reminder-row{background:color-mix(in srgb,var(--reminder-color) 17%,var(--surface));border-color:color-mix(in srgb,var(--reminder-color) 55%,var(--line2))}
.elab-lab .agchip.reminder-row{background:color-mix(in srgb,var(--reminder-color) 17%,var(--surface));border-left-width:4px}
.elab-lab .plm-reminder-alert{display:inline-flex;width:25px;height:25px;align-items:center;justify-content:center;cursor:help}
.elab-lab .plm-reminder-alert svg{width:20px;height:20px;fill:none;stroke:currentColor;stroke-width:2;stroke-linecap:round;stroke-linejoin:round}
html.modal-lock,body.modal-lock{overflow:hidden!important;height:100%}
.elab-lab .cp-ref-head{margin-left:auto;width:230px;height:36px}
.elab-lab .mark-card.has-marker{border:2px solid var(--work-marker-color);box-shadow:0 0 0 3px color-mix(in srgb,var(--work-marker-color) 18%,transparent),var(--ui-shadow)}
.elab-lab .mark-card.has-marker .dtabs button.on{background:var(--work-marker-color);border-color:var(--work-marker-color);color:var(--work-marker-text);box-shadow:0 2px 8px color-mix(in srgb,var(--work-marker-color) 38%,transparent)}
.elab-lab .markhead .pastels.mini .pastel.on{border-color:rgba(0,0,0,.12);box-shadow:none;outline:0;transform:none}
.elab-lab .pl-marks{gap:12px;min-height:24px}
.elab-lab .pl-marks .plm-i,.elab-lab .pl-marks .plm-dot,.elab-lab .pl-marks .plm-reminder-alert{width:20px;height:20px;flex:0 0 20px}
@media(min-height:850px){.elab-lab .cp-modal{max-height:none;overflow:visible}}
.elab-lab .wh-modal{width:min(780px,calc(100vw - 28px));max-width:780px;max-height:calc(100vh - 28px);overflow:auto}
.elab-lab .wh-timeline{position:relative;margin:12px 0 18px;padding-left:25px}
.elab-lab .wh-timeline:before{content:"";position:absolute;left:8px;top:8px;bottom:8px;width:2px;background:var(--line2)}
.elab-lab .wh-entry{position:relative;display:grid;grid-template-columns:150px 1fr;gap:14px;padding:0 0 16px}
.elab-lab .wh-entry>i{position:absolute;left:-22px;top:5px;width:11px;height:11px;border:2px solid var(--surface);border-radius:50%;background:var(--accent);box-shadow:0 0 0 1px var(--accent)}
.elab-lab .wh-date b,.elab-lab .wh-date span{display:block;font-size:12px}.elab-lab .wh-date span{color:var(--muted);margin-top:3px}
.elab-lab .wh-content{padding:10px 12px;border:1px solid var(--line);border-radius:9px;background:var(--surface2);font-size:12.5px}
.elab-lab .wh-content small{display:block;margin-bottom:4px;color:var(--accent);font-weight:700}.elab-lab .wh-content p{margin:6px 0 0;color:var(--muted)}
.elab-lab .wh-add{padding:12px 14px;border:1px solid var(--line);border-radius:10px;background:var(--surface2)}
.elab-lab .wh-add summary{cursor:pointer;font-weight:700;color:var(--accent)}
.elab-lab .wh-add-grid{display:grid;grid-template-columns:1fr 1fr;gap:10px;margin-top:12px}
.elab-lab .wh-add label{display:block;margin:9px 0;font-size:10.5px;font-weight:700;text-transform:uppercase;color:var(--muted)}
.elab-lab .wh-add .ginput{display:block;width:100%;margin-top:5px}

/* Société — compteurs légaux : ces deux petits nombres ne doivent pas
   reprendre la hauteur standard de tous les formulaires. */
.elab-lab .ginput.soc-counter{
  height:28px;min-height:28px;padding:1px 7px;line-height:20px;border-radius:7px
}
@media(max-width:620px){.elab-lab .wh-entry{grid-template-columns:1fr;gap:6px}.elab-lab .wh-add-grid{grid-template-columns:1fr}}

/* 0.434.0 — historique directement dans Détails, structuré comme le travail
   réel du laboratoire : dates puis supérieur / inférieur. */
.elab-lab .wh-direct-form{display:grid;grid-template-columns:minmax(230px,1fr) minmax(230px,1fr) auto;gap:8px;align-items:end;margin:8px 0 12px}
.elab-lab .wh-direct-form label{display:grid;gap:4px;font-size:9.5px;font-weight:700;text-transform:uppercase;color:var(--faint)}
.elab-lab .wh-direct-form .ginput{width:100%;height:34px;min-height:34px;padding:5px 8px}
.elab-lab .wh-arch{position:relative}.elab-lab .wh-arch .ginput{padding-left:31px}
.elab-lab .wh-jaw{display:inline-grid;place-items:center;width:21px;height:21px;border-radius:6px;font-size:10px;font-weight:800;color:#fff;flex:0 0 21px}
.elab-lab .wh-arch .wh-jaw{position:absolute;left:5px;bottom:6px;z-index:1}
.elab-lab .wh-jaw.upper{background:#4f8298}.elab-lab .wh-jaw.lower{background:#294e63}
.elab-lab .wh-direct-save{height:34px;min-height:34px;white-space:nowrap}
.elab-lab .wh-title-row{display:flex;align-items:center;justify-content:space-between;gap:10px}
.elab-lab .wh-title-row .btn{font-size:10px;font-weight:500;letter-spacing:0;text-transform:none;padding:5px 9px}
.elab-lab .wh-title-row .wh-manage{display:grid;place-items:center;width:30px;height:30px;padding:0;font-size:15px;line-height:1}
.elab-lab .wh-inline{display:grid;gap:7px}
.elab-lab .wh-inline-entry{display:grid;grid-template-columns:170px 1fr;gap:10px;align-items:start;padding:8px 10px;border:1px solid var(--line);border-radius:9px;background:var(--surface2);font-size:11.5px}
.elab-lab .wh-inline-dates{display:flex;gap:8px;align-items:center;white-space:nowrap;line-height:1.35}.elab-lab .wh-inline-dates span{color:var(--faint)}
.elab-lab .wh-inline-jobs p{display:flex;gap:6px;align-items:center;margin:0 0 5px}.elab-lab .wh-inline-jobs small{display:block;color:var(--muted);margin-top:5px}
@media(max-width:1100px){.elab-lab .wh-direct-form{grid-template-columns:1fr 1fr}.elab-lab .wh-direct-save{grid-column:1/-1}.elab-lab .wh-inline-entry{grid-template-columns:1fr}.elab-lab .wh-inline-jobs{grid-column:1/-1}}

/* Détails : ordre métier demandé et deux cartes strictement de même hauteur. */
.elab-lab #tabDetails{align-items:stretch}
.elab-lab #tabDetails>.card.det{height:100%;box-sizing:border-box}
.elab-lab #tabDetails>.card.det:nth-child(2){display:flex!important;flex-direction:column;align-items:stretch!important}
.elab-lab .detail-order-comment textarea{display:block;width:100%;max-width:none;box-sizing:border-box}
.elab-lab .detail-order-history{order:10}
.elab-lab .detail-order-comment{order:20}
.elab-lab .detail-order-sub{order:30}
.elab-lab .detail-order-alerts{order:40}
.elab-lab .detail-order-marks{order:50}
.elab-lab .detail-order-options{order:60}
.elab-lab .detail-order-lang{order:70;margin-top:auto!important}

.elab-lab .wh-choice-modal{max-width:620px}
.elab-lab .wh-choice-rows{display:grid;gap:7px;max-height:360px;overflow:auto;margin:14px 0}
.elab-lab .wh-choice-row{display:grid;grid-template-columns:1fr auto auto;gap:7px;align-items:center}
.elab-lab .wh-choice-row .ginput{height:34px}
.elab-lab .wh-choice-row .btn{height:34px;padding:6px 10px;font-size:11px}
.elab-lab .wh-choice-add{display:grid;grid-template-columns:1fr auto;gap:12px;padding-top:14px;border-top:1px solid var(--line)}
.elab-lab .wh-choice-add .ginput,.elab-lab .wh-choice-add .newbtn{height:36px;min-height:36px}
.elab-lab .cl-peppol-field{display:flex!important;flex:1;min-width:220px;flex-direction:column;gap:3px;font-size:10px!important;font-weight:500!important;text-transform:uppercase;color:var(--faint)}
.elab-lab .cl-peppol-field>input,.elab-lab .cl-peppol-field>select{display:block;width:100%!important;height:34px!important;min-height:34px!important;box-sizing:border-box;margin:0!important;padding:6px 9px!important;font-size:12.5px!important;font-weight:400!important;text-transform:none;background:var(--surface2);border:1px solid var(--line2);border-radius:8px;outline:none}

/* 0.425.0 — derniers alignements de lecture. */
.elab-lab .fc-address-block .fc-line,
.elab-lab .fc-address-block.billing .fc-line{font-size:13.5px;font-weight:400;line-height:1.35}
.elab-lab .mail-head-actions select,
.elab-lab .mail-head-actions button{height:36px;min-height:36px;box-sizing:border-box;margin:0;padding-top:0;padding-bottom:0;line-height:34px}
.elab-lab .stats-filter-report{flex:0 0 310px}
.elab-lab .stats-filter-search{flex:1 1 260px;min-width:210px}
.elab-lab .stats-search-clear{position:relative;display:block}
.elab-lab .stats-search-clear input{padding-right:38px}
.elab-lab .stats-search-clear button{position:absolute;right:4px;top:50%;transform:translateY(-50%);width:30px;height:30px;padding:0;border:0;background:transparent;color:var(--muted);font-size:22px;line-height:28px;cursor:pointer}
.elab-lab .stats-search-clear button:hover{color:var(--text)}
@media(max-width:760px){.elab-lab .stats-filter-report{flex:1 1 240px}.elab-lab .stats-filter-search{flex:1 1 200px}}

/* --- ui-v4432.css --- */
/* e-LAB 1.10.7 — correctifs d'interface chargés après les feuilles historiques. */

/* Société / CGV : le document et sa barre commencent sous le titre, à gauche. */
.elab-lab #coLabProfile .co-terms-card{width:100%;box-sizing:border-box;overflow:visible;padding:0!important}
.elab-lab #coLabProfile .co-terms-head{display:flex;flex-direction:column;align-items:flex-start!important;gap:10px;margin-bottom:12px}
.elab-lab #coLabProfile .co-terms-tabs{align-self:flex-start!important;display:flex;flex-wrap:wrap;gap:12px!important;padding:0!important;margin:0!important;background:transparent!important}
.elab-lab #coLabProfile .co-terms-pane,
.elab-lab #coLabProfile .co-terms-pane>.rtb,
.elab-lab #coLabProfile .co-terms-paper-stage,
.elab-lab #coLabProfile .co-terms-editor{margin-left:0!important;margin-right:auto!important}
.elab-lab #coLabProfile .co-terms-pane>.rtb,
.elab-lab #coLabProfile .co-terms-paper-stage{width:min(210mm,100%)!important;min-width:0!important;box-sizing:border-box}
.elab-lab #coLabProfile .co-terms-paper-stage{padding:12px 0 20px!important}

/* Catalogue : TVA et Portail ont exactement la même boîte. */
.elab-lab .tva-inline,.elab-lab .pa-btn{height:30px!important;min-height:30px!important;box-sizing:border-box!important}
.elab-lab .pa-btn{display:inline-flex!important;align-items:center;justify-content:center;padding-top:0!important;padding-bottom:0!important}

/* Carte de travail : titres et valeurs alignés sur « Durée totale / 1 j ». */
.elab-lab .work-term-field small{font-weight:700!important}
.elab-lab .work-term-field .rt-v,
.elab-lab .work-term-field select,
.elab-lab .f .work-term-field select{font-family:inherit!important;font-size:13px!important;font-weight:700!important;font-style:normal!important;line-height:20px!important;color:var(--accent)!important}

/* Même gabarit typographique et même ligne de base pour Tarif/Remise/TVA/Durée. */
.elab-lab .head4 #fRemTva,
.elab-lab .head4 #fDuree{margin:0!important;min-height:34px}
.elab-lab .head4 .work-term-field,
.elab-lab .head4 #fDuree{display:grid!important;grid-template-rows:12px 20px!important;row-gap:2px!important}
.elab-lab .head4 .work-term-field small,
.elab-lab .head4 #fDuree>.flbl{height:12px!important;margin:0!important;line-height:12px!important;font-size:10px!important;font-weight:700!important;letter-spacing:.05em!important}
.elab-lab .head4 #fRemTva>.hz-rt,
.elab-lab .head4 #fDuree>.hz-dur{height:20px!important;min-height:20px!important;margin:0!important;padding:0!important;align-items:center!important}
.elab-lab .head4 .work-term-field .rt-v,
.elab-lab .head4 .work-term-field select,
.elab-lab .head4 #fDuree>.hz-dur b{height:20px!important;margin:0!important;line-height:20px!important;font-family:inherit!important;font-size:13px!important;font-weight:700!important;color:var(--accent)!important}
.elab-lab .head4 #fDuree>.hz-dur b{display:flex;align-items:center;padding-left:5px;box-sizing:border-box}

/* Bande Tarif / Remise / TVA : valeurs légèrement décalées, sans cadre au focus. */
.elab-lab .work-term-field .rt-v{padding-left:5px!important;box-sizing:border-box}
.elab-lab .work-term-field select,
.elab-lab .f .work-term-field select{padding-left:5px!important;border:0!important;outline:none!important;box-shadow:none!important}
.elab-lab .head4 .hz-rt,
.elab-lab .head4 .hz-rt:focus,
.elab-lab .head4 .hz-rt:focus-within{background:transparent!important;border:0!important;border-radius:0!important;outline:none!important;box-shadow:none!important}
.elab-lab .head4 .hz-dur,
.elab-lab .head4 .hz-dur:hover,
.elab-lab .head4 .hz-dur:focus,
.elab-lab .head4 .hz-dur:focus-within{background:transparent!important;border:0!important;border-radius:0!important;outline:none!important;box-shadow:none!important;margin:0!important}

/* Marqueur : contour renforcé à 3 px. */
.elab-lab .mark-card.has-marker{border-width:3px!important}

/* Fiche client : les deux sous-titres d'adresse ont strictement la même
   hiérarchie visuelle. La classe billing ne change plus leur taille. */
.elab-lab .fc-address-block>b{font-size:12px!important;font-weight:600!important;line-height:1.2!important;letter-spacing:.05em!important}

/* Tournées : actions de passage calées sur le bouton Parti. */
.elab-lab .tour-stop-actions .btn,.elab-lab .tourrow .tstep{height:30px!important;min-height:30px!important;box-sizing:border-box!important;padding-top:0!important;padding-bottom:0!important;display:inline-flex!important;align-items:center!important;justify-content:center!important}

/* Mois, flèches et « Ce mois » : même hauteur. */
.elab-lab .kdate input[type=date],.elab-lab .kdate input[type=month],.elab-lab .kdate .kd-nav,.elab-lab .kdate .kd-today{height:30px!important;min-height:30px!important;box-sizing:border-box!important;margin:0!important;display:inline-flex;align-items:center;justify-content:center}
.elab-lab #main[data-page="travaux"] .works-month-picker,
.elab-lab #main[data-page="travaux"] .works-monthbar .btn.bsm{height:28px!important;min-height:28px!important;box-sizing:border-box!important;margin:0!important}

/* Liste des travaux : rapprocher client/patient et donner la place aux deux arcades. */
.elab-lab #main[data-page="travaux"] .wl-table{table-layout:fixed}
.elab-lab #main[data-page="travaux"] .wl-table th:nth-child(1){width:11%}
.elab-lab #main[data-page="travaux"] .wl-table th:nth-child(2){width:15%}
.elab-lab #main[data-page="travaux"] .wl-table th:nth-child(3){width:24%}
.elab-lab #main[data-page="travaux"] .wl-table th:nth-child(4){width:32%}
.elab-lab #main[data-page="travaux"] .wl-table th:nth-child(5){width:9%}
.elab-lab #main[data-page="travaux"] .wl-table th:nth-child(6){width:9%}
.elab-lab #main[data-page="travaux"] .wl-worktype div{display:grid;grid-template-columns:28px minmax(0,1fr);column-gap:4px;overflow:hidden;white-space:nowrap;line-height:1.35}
.elab-lab #main[data-page="travaux"] .wl-worktype b{font-weight:700;color:var(--muted);text-align:right}
.elab-lab #main[data-page="travaux"] .wl-worktype span{min-width:0;overflow:hidden;text-overflow:ellipsis}

/* Outils Tarifs : aperçu lisible avant toute copie ou indexation globale. */
.elab-lab .tarif-bulk-modal{max-width:620px}
.elab-lab .tarif-bulk-intro{margin:-5px 0 16px;color:var(--muted);font-size:12.5px;line-height:1.45}
.elab-lab .tarif-bulk-grid{display:grid;grid-template-columns:1fr 1fr;gap:0 14px}
.elab-lab .tarif-bulk-preview{min-height:70px;margin:4px 0 14px;padding:12px 14px;border:1px solid var(--line);border-radius:10px;background:var(--surface2);font-size:12.5px;color:var(--muted);line-height:1.45}
.elab-lab .tarif-bulk-preview>b,.elab-lab .tarif-bulk-preview>span{display:block}
.elab-lab .tarif-bulk-preview>b{color:var(--text);margin-bottom:4px}
.elab-lab .tarif-bulk-preview ul{list-style:none;margin:10px 0 0;padding:8px 0 0;border-top:1px solid var(--line)}
.elab-lab .tarif-bulk-preview li{display:flex;align-items:center;justify-content:space-between;gap:14px;padding:2px 0;font-variant-numeric:tabular-nums}
@media(max-width:640px){.elab-lab .tarif-bulk-grid{grid-template-columns:1fr}}

/* Relevés : badge centré avec le nom, numéro légèrement moins grand. */
.elab-lab .brz-cname{display:inline-flex;align-items:center;gap:7px;min-width:0;font-size:14px!important;font-weight:600!important;line-height:1.2}
.elab-lab .brz-client-label{text-transform:uppercase}
.elab-lab .brz-cname .groupchip{display:inline-flex;align-items:center;margin:0!important;vertical-align:middle}
.elab-lab .brz-work-number{font-size:11.5px!important}

/* Tarifs : la corbeille reste discrète, mais suffisamment grande pour être identifiable. */
.elab-lab #main[data-page="tarifs"] .acte-del{font-size:19px!important;line-height:1!important;display:inline-flex;align-items:center;justify-content:center;min-width:22px;min-height:22px}

/* Courriers : contrôles du modèle alignés et langues identiques aux CGV Société. */
.elab-lab #main[data-page="courriers"] .mail-head-actions{align-items:center!important}
.elab-lab #main[data-page="courriers"] .mail-head-actions select,
.elab-lab #main[data-page="courriers"] .mail-head-actions button{height:36px!important;min-height:36px!important;box-sizing:border-box}
.elab-lab #main[data-page="courriers"] .mail-grid{align-items:stretch}
.elab-lab #main[data-page="courriers"] .mail-card{height:100%}
.elab-lab #main[data-page="courriers"] .mail-lang-tabs{align-self:flex-start;display:flex;flex-wrap:wrap;gap:12px!important;margin:13px 0 10px;padding:0!important;background:transparent!important;border-radius:0}
.elab-lab #main[data-page="courriers"] .mail-lang-tab{flex:0 0 auto;display:inline-flex;align-items:center;gap:7px;min-width:auto;height:36px;padding:0 13px;border:1px solid transparent;border-radius:9px;background:var(--surface);color:var(--muted);font-size:11.5px;font-weight:550;box-shadow:none;cursor:pointer}
.elab-lab #main[data-page="courriers"] .mail-lang-tab span{display:inline-grid;place-items:center;min-width:24px;height:20px;padding:0 4px;border-radius:6px;background:var(--surface2);font-size:9px;font-weight:750;letter-spacing:.06em;color:var(--faint)}
.elab-lab #main[data-page="courriers"] .mail-lang-tab.on{border-color:var(--accent);background:var(--accent);color:var(--on-accent);box-shadow:none}
.elab-lab #main[data-page="courriers"] .mail-lang-tab.on span{background:rgba(255,255,255,.18);color:inherit}

/* Agenda mensuel : rendez-vous plus lisibles sans augmenter la hauteur des cellules. */
.elab-lab #main[data-page="agenda"] .agd-appt{font-size:12px!important;line-height:1.3}
.elab-lab #main[data-page="agenda"] .agd-appt .mono{font-size:10.5px!important}
.elab-lab #main[data-page="agenda"] .agd-appt-note{font-size:10.5px!important;line-height:1.25}
.elab-lab #main[data-page="agenda"] .kdate .kd-nav,
.elab-lab #main[data-page="agenda"] .kdate .kd-today,
.elab-lab #main[data-page="agenda"] #agdNew{border-radius:8px!important}
.elab-lab #main[data-page="agenda"] #agdNew{height:30px!important;min-height:30px!important;padding-top:0!important;padding-bottom:0!important;display:inline-flex;align-items:center;justify-content:center;box-sizing:border-box}
.elab-lab #main[data-page="agenda"] .agd-nav-icon{display:block;width:14px;height:14px;fill:none;stroke:currentColor;stroke-width:1.7;stroke-linecap:round;stroke-linejoin:round;pointer-events:none}

/* Liste des factures : première ligne des dates et du statut sur une base commune. */
.elab-lab .invrow .idate,.elab-lab .invrow .iech b,.elab-lab .invrow>.badge{line-height:18px;min-height:18px;box-sizing:border-box}
.elab-lab .invrow>.badge{padding-top:0;padding-bottom:0;align-self:start}

/* Détail facture : note plus confortable et poubelle à peine agrandie. */
.elab-lab .inv-comment label{display:block}
.elab-lab .inv-comment textarea{min-height:60px!important}
.elab-lab .inv-wo .inv-rm-work{width:38px!important;font-size:20px!important}

/* L'expiration reste explicitement sur la ligne suivante. */
.elab-lab .public-link-expiry{display:flex;flex-direction:column;align-items:flex-start;gap:1px;margin-top:7px;font-size:11.5px}
.elab-lab .public-link-expiry span,
.elab-lab .public-link-expiry b{display:block;white-space:nowrap}

/* Détails : crayon à droite et option du commentaire sous son champ. */
.elab-lab .wh-title-row{width:100%;justify-content:flex-start!important}
.elab-lab .wh-title-row .wh-manage{order:-1;margin-left:0!important;margin-right:2px!important;flex:0 0 30px}
.elab-lab .wh-inline-entry{display:block!important;padding:8px 10px!important}
.elab-lab .wh-inline-head{display:flex;align-items:flex-start;gap:12px;min-width:0}
.elab-lab .wh-inline-passage-date{display:inline-flex;align-items:center;justify-content:center;width:max-content;min-width:78px;height:22px;padding:0 7px;border-radius:6px;background:rgba(211,145,32,.22);color:#8a5a08;font-size:10.5px;font-weight:750;line-height:22px;white-space:nowrap;box-sizing:border-box}
.elab-lab .wh-inline-meta{min-width:0;flex:1;padding-top:1px}
.elab-lab .wh-inline-period{display:flex;align-items:center;gap:7px;white-space:nowrap;font-size:11.5px;line-height:1.25}
.elab-lab .wh-inline-period b{font-weight:700}
.elab-lab .wh-period-arrow{display:inline-flex;align-items:center;color:var(--accent);flex:0 0 30px}
.elab-lab .wh-period-arrow svg{display:block;width:30px;height:12px;fill:none;stroke:currentColor;stroke-width:1.7;stroke-linecap:round;stroke-linejoin:round}
.elab-lab .wh-inline-meta small{display:block;margin-top:4px;color:var(--muted);font-family:'JetBrains Mono',monospace;font-size:9.5px;line-height:1.2}
.elab-lab .wh-inline-entry .wh-inline-jobs{min-width:0;margin-top:7px;margin-left:90px}
.elab-lab .wh-inline-entry .wh-inline-jobs p{margin:0 0 4px!important;line-height:1.25}
@media(max-width:520px){.elab-lab .wh-inline-head{flex-wrap:wrap}.elab-lab .wh-inline-meta{flex-basis:100%}.elab-lab .wh-inline-entry .wh-inline-jobs{margin-left:0}}
.elab-lab .detail-order-comment .comment-print-toggle{margin-top:7px}
.elab-lab .detail-order-comment .comment-print-toggle .tog{display:inline-flex;align-items:center;margin:0}

/* Actions du travail : Facturer doit se lire comme une action forte ; la
   fiche labo possède le même fond visuel que les autres outils imprimables. */
.elab-lab .markrow .actions #wInv{border:2px solid color-mix(in srgb,var(--accent) 48%,var(--line))!important;font-weight:800}
.elab-lab .markrow .actions #wInv svg{stroke-width:2.1px}
.elab-lab .markrow .actions #wLabSheet{background:var(--surface2);color:var(--muted);border-color:var(--line)}

/* Notice du fabricant : option compacte à l'emplacement demandé et éditeur
   documentaire utilisable sans débordement sur téléphone ou tablette. */
.elab-lab .manufacturer-notice-setting{display:flex;align-items:center;gap:8px;min-width:0}
.elab-lab .manufacturer-notice-setting .tog{min-width:0;margin:0;flex:0 1 auto}
.elab-lab .manufacturer-notice-pencil{display:inline-flex;align-items:center;justify-content:center;width:31px;height:31px;flex:0 0 31px;padding:0;border:1px solid var(--line);border-radius:8px;background:var(--surface);color:var(--accent);font-size:18px;line-height:1;cursor:pointer}
.elab-lab .manufacturer-notice-pencil[hidden]{display:none!important}
.elab-lab .manufacturer-notice-pencil:hover{border-color:var(--accent);background:var(--surface2)}
.elab-lab .manufacturer-notice-modal{width:min(980px,calc(100vw - 28px));max-width:980px;max-height:92vh;overflow:auto;padding:22px}
.elab-lab .manufacturer-notice-hint{max-width:760px;margin:0 0 13px}
.elab-lab .manufacturer-notice-tabs{display:flex;flex-wrap:wrap;gap:10px;margin:0 0 10px}
.elab-lab .manufacturer-notice-pane>.rtb,.elab-lab .manufacturer-notice-pane>.co-terms-paper-stage{width:min(210mm,100%);min-width:0;box-sizing:border-box;margin-left:0;margin-right:auto}
.elab-lab .manufacturer-notice-editor{min-height:540px;line-height:1.45}
.elab-lab .manufacturer-notice-actions{display:flex;justify-content:flex-end;gap:9px;margin-top:14px;position:sticky;bottom:-22px;padding:12px 0 0;background:var(--surface)}
@media(max-width:700px){.elab-lab .manufacturer-notice-modal{width:calc(100vw - 14px);max-height:96vh;padding:16px 12px}.elab-lab .manufacturer-notice-editor{min-height:430px}.elab-lab .manufacturer-notice-tabs .co-terms-tab{flex:1 1 92px}.elab-lab .manufacturer-notice-pane>.rtb{overflow-x:auto;flex-wrap:nowrap}.elab-lab .manufacturer-notice-actions{bottom:-16px}}

/* Scanners intraoraux : quatre fournisseurs lisibles sur grand écran et une
   colonne sans débordement sur téléphone/tablette. */
.elab-lab .scanner-settings-card{overflow:hidden}
.elab-lab .scanner-card-head{display:flex;align-items:flex-start;justify-content:space-between;gap:18px;margin-bottom:14px}
.elab-lab .scanner-card-head h2{margin-bottom:4px}
.elab-lab .scanner-card-head .hint{margin:0;max-width:760px;line-height:1.45}
.elab-lab .scanner-security{flex:0 0 auto;padding:5px 9px;border:1px solid color-mix(in srgb,var(--accent) 32%,var(--line));border-radius:999px;background:color-mix(in srgb,var(--accent) 8%,var(--surface));color:var(--accent);font-size:10.5px;font-weight:700;white-space:nowrap}
.elab-lab .scanner-provider-grid{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:12px}
.elab-lab .scanner-provider{min-width:0;padding:14px;border:1px solid var(--line);border-radius:12px;background:var(--surface2);box-sizing:border-box}
.elab-lab .scanner-provider-active{grid-column:span 2;background:var(--surface)}
.elab-lab .scanner-provider-top{display:flex;align-items:center;gap:10px;min-width:0}
.elab-lab .scanner-provider-top>div{min-width:0}
.elab-lab .scanner-provider h3{margin:0 0 3px;font-size:14px;line-height:1.2}
.elab-lab .scanner-logo{display:inline-flex;align-items:center;justify-content:center;width:38px;height:38px;flex:0 0 38px;border-radius:10px;background:var(--surface);border:1px solid var(--line);color:var(--muted);font-size:12px;font-weight:850;letter-spacing:-.02em}
.elab-lab .scanner-logo.medit{background:#38a5a3;color:#fff;border-color:#38a5a3;font-size:20px}
.elab-lab .scanner-logo.dexis{background:#075da8;color:#fff;border-color:#075da8;font-size:20px}
.elab-lab .scanner-state{display:inline-flex;align-items:center;gap:5px;color:var(--muted);font-size:10.5px;font-weight:700}
.elab-lab .scanner-state:before{content:"";width:7px;height:7px;border-radius:50%;background:var(--faint)}
.elab-lab .scanner-state.ok{color:var(--accent)}
.elab-lab .scanner-state.ok:before{background:var(--accent)}
.elab-lab .scanner-provider>p{margin:11px 0 0;color:var(--muted);font-size:11.5px;line-height:1.4}
.elab-lab .scanner-account{display:flex;flex-wrap:wrap;gap:4px 10px!important}
.elab-lab .scanner-account span{overflow:hidden;text-overflow:ellipsis}
.elab-lab .scanner-metrics{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:6px;margin-top:12px}
.elab-lab .scanner-metrics span{min-width:0;padding:7px;border-radius:8px;background:var(--surface2);color:var(--muted);font-size:9.5px;line-height:1.25}
.elab-lab .scanner-metrics b{display:block;margin-bottom:1px;color:var(--text);font-size:15px}
.elab-lab .scanner-last{font-size:10.5px!important}
.elab-lab .scanner-actions{display:flex;align-items:center;gap:7px;flex-wrap:wrap;margin-top:12px}
.elab-lab .scanner-actions .scanner-env{width:auto;min-width:120px}
.elab-lab .scanner-config-warning{display:flex;flex-direction:column;gap:4px;margin-top:12px;padding:9px 10px;border:1px solid color-mix(in srgb,var(--amber) 36%,var(--line));border-radius:8px;background:color-mix(in srgb,var(--amber) 8%,var(--surface));font-size:11px;line-height:1.35}
.elab-lab .scanner-config-warning code{display:block;max-width:100%;overflow:auto;padding:4px 0;color:var(--text);font-size:10px;white-space:nowrap}
.elab-lab .scanner-mappings{margin-top:16px}
.elab-lab .scanner-mappings:empty{display:none}
.elab-lab .scanner-mappings h3{margin:0 0 4px;font-size:13px}
.elab-lab .scanner-mappings>.hint{margin:0 0 8px}
.elab-lab .scanner-map-list{border-top:1px solid var(--line)}
.elab-lab .scanner-map-row{display:grid;grid-template-columns:minmax(180px,1fr) minmax(220px,1fr) auto;gap:10px;align-items:center;padding:9px 0;border-bottom:1px solid var(--line)}
.elab-lab .scanner-map-row>div{min-width:0}
.elab-lab .scanner-map-row b,.elab-lab .scanner-map-row span{display:block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.elab-lab .scanner-map-row span{margin-top:2px;color:var(--muted);font-size:9.5px}
@media(max-width:1050px){.elab-lab .scanner-provider-grid{grid-template-columns:repeat(2,minmax(0,1fr))}.elab-lab .scanner-provider-active{grid-column:span 2}}
@media(max-width:700px){.elab-lab .scanner-card-head{display:block}.elab-lab .scanner-security{display:inline-flex;margin-top:9px;white-space:normal}.elab-lab .scanner-provider-grid{grid-template-columns:1fr}.elab-lab .scanner-provider-active{grid-column:auto}.elab-lab .scanner-metrics{grid-template-columns:1fr 1fr}.elab-lab .scanner-map-row{grid-template-columns:1fr}.elab-lab .scanner-map-row .newbtn{width:100%}.elab-lab .scanner-actions>*{flex:1 1 145px}.elab-lab .scanner-actions .scanner-env{width:100%}}
.elab-lab .scanner-order-source{border-color:color-mix(in srgb,#38a5a3 45%,var(--line));background:color-mix(in srgb,#38a5a3 11%,var(--surface));color:#287f7d}
.elab-lab .scanner-order-source-dexis{border-color:color-mix(in srgb,#075da8 45%,var(--line));background:color-mix(in srgb,#075da8 10%,var(--surface));color:#075da8}

/* Fiche client : tarif et actions du compte portail sur une seule ligne.
   La carte perd la rangee vide qui l'allongeait inutilement. */
.elab-lab .pu-access-row{display:flex;align-items:center;justify-content:space-between;gap:8px;flex-wrap:wrap;margin-top:5px}
.elab-lab .pu-plan{display:flex;align-items:center;gap:6px;min-width:0;flex:1 1 155px}
.elab-lab .pu-plan>.hint{flex:none;margin:0}
.elab-lab .pu-plan .puplan{min-width:112px;max-width:190px;height:35px}
.elab-lab .pu-actions{display:flex;align-items:center;gap:6px;flex:0 0 auto}
.elab-lab .pu-actions .btn{height:35px;min-height:35px;white-space:nowrap}
.elab-lab .fc-flat .fc-card[data-fck="portal"]{padding-top:14px;padding-bottom:14px}
@media(max-width:560px){.elab-lab .pu-actions{width:100%}.elab-lab .pu-actions .btn{flex:1 1 auto}}
