/* ════════════════════════════════════════════════
   PUCACE — CSS mobile-first — version propre
   Taille cible : écran 390px (iPhone 14)
   ════════════════════════════════════════════════ */

/* ═══════════════════════════════════════════════
   DESIGN TOKENS — 3-layer system (Phase 4.A 2026)
   ──────────────────────────────────────────────
   Layer 1  Primitives (raw OKLCH palette)
            └─ used internally only, never par les composants directement
   Layer 2  Semantic (intent-based : --color-text-primary, --color-surface,
            --color-accent, --color-success, etc.) → dark mode override ICI
   Layer 3  Component + Legacy aliases (--txt, --surf, --acc, --grn, --red,
            --blue, --amber, --pur — 1:1 avec les valeurs précédentes pour
            backward compat totale ; aucun composant existant n'est cassé)

   OKLCH choisi car perceptuellement uniforme : color-mix(in oklch, …)
   produit des hover/disabled/soft prévisibles. Baseline-Widely-Available
   2026 (Safari 15.4+, Chrome 111+).
   ═══════════════════════════════════════════════ */

:root{
  /* Polices (2026-09-11, direction Apple) : la police du SYSTÈME — SF Pro sur iPhone
     et Mac, Roboto sur Android. --font-num porte les grandeurs (kg, CHF, arrêts) en
     SF Pro Rounded là où il existe : la signature du produit, comme Santé ou Forme. */
  --font-text:-apple-system,BlinkMacSystemFont,"SF Pro Text",system-ui,"Segoe UI",Roboto,"Helvetica Neue",sans-serif;
  --font-display:-apple-system,BlinkMacSystemFont,"SF Pro Display",system-ui,"Segoe UI",Roboto,"Helvetica Neue",sans-serif;
  --font-num:ui-rounded,"SF Pro Rounded",-apple-system,BlinkMacSystemFont,system-ui,Roboto,sans-serif;
  /* Layout */
  --nav:60px;--pad:12px;
  /* Radii (spec Paper & Ink) — --rad:14 et --radsm:10 conservés pour compat existante */
  --rad:14px;--radsm:10px;
  --rad-lg:14px;     /* alias --rad */
  /* Spacing 4/8/12/16/24 */
  --sp-1:4px;--sp-2:8px;--sp-3:12px;--sp-4:16px;--sp-5:24px;
  /* Motion */
  --t-fast:120ms;--t-base:200ms;--ease:cubic-bezier(.4,0,.2,1);
  /* Type scale (spec Paper & Ink) */
  /* Weights */

  /* ──────────────────────────────────────────────
     Layer 1 — Primitives (raw OKLCH palette)
     ────────────────────────────────────────────── */
  /* Orange (PUCACE accent — hue 49-56°) */

  /* Neutral grays (light mode — slight cool tint hue 270°) */

  /* Cool dark blue-grays (dark mode — hue 250-264°) */

  /* Green (success — hue 145-152°) */

  /* Red (danger — hue 25-30°) */

  /* Blue (info / twint — hue 240-260°) */

  /* Amber (warning — hue 56-66°) */

  /* Purple (pickup tag — hue 285-295°) */
}

/* ──────────────────────────────────────────────
   Layer 2 — Semantic (intent-based)
   Layer 3 — Legacy aliases (1:1 backward compat)
   ──────────────────────────────────────────────
   body.light et body.dark redéfinissent UNIQUEMENT la sémantique.
   Les alias legacy (--txt, --surf, --acc, etc.) restent strictement
   identiques aux valeurs précédentes pour zéro régression visuelle.
   Les valeurs rgba(…) historiques (borders/softs avec alpha tintée)
   sont conservées telles quelles : color-mix(transparent N%) ne donne
   pas le même rendu qu'un rgba teinté car la teinte alpha mix avec le
   fond et change selon le contexte. Préserver la fidélité prime ici.
   ────────────────────────────────────────────── */

body.light{
  /* === « Paper & Ink » — palette du design system PUCACE ===================
     Le gris « stone » d'origine (teinte neutre froide) est remplace par le
     PAPIER CHAUD et l'ENCRE BRUNE. Un seul point d'entree : ces 5 lignes
     alimentent les 1185 usages de var(--) de la feuille. Aucun JavaScript
     n'est touche — les 91 gestes de l'app restent identiques.
     Source : design system PUCACE, tokens/colors.css. */
  --acc:#C45C18; --acc-tint:#F6E8DC; --acc-deep:#A24D14; --acc-glow:rgba(196,92,24,0.18);
  --bg:#FAF7F2; --surf:#FFFFFF; --surf2:#F3ECE1; --surf3:#EDE4D5;
  --bdr:#E4DCCF; --bdr2:#D3C8B6;
  --txt:#241E17; --txt2:#5C5347; --txt3:#8B8073;

  /* Tuiles d'action — « Paper & Ink » n'a QU'UN accent. Les cinq teintes
     d'origine (vert / bleu / violet / ambre / rose) faisaient cinq marques dans
     un ecran. Elles deviennent du papier et de l'encre ; ce qui distingue une
     action, c'est son emoji et son mot, pas sa couleur. Seules les quatre
     semantiques metier (encaisse / Twint / impaye / alerte) gardent une couleur,
     parce qu'elles portent une information d'argent. */
  --call-bg:#F3ECE1; --call-bdr:#D3C8B6; --call-ico:#5C5347; 
  --pho-bg:#F3ECE1; --pho-bdr:#D3C8B6; --pho-lbl:#241E17;

  /* Semantiques METIER — les seules couleurs qui restent, parce qu'elles
     portent une information d'argent ou de risque :
       vert  = encaisse      bleu = Twint       rouge = impaye/annule
       ocre  = alerte (production necessaire, peremption qui presse)
     Les teintes Tailwind d'origine (indigo, purple, slate) n'avaient pas de
     sens metier : elles deviennent du papier. */
  --green:#3F7D4E; --green-bg:#EAF3EC; --green-bdr:#B7D6BF; --green-deep:#24502F;
  --amber:#A6771A; --amber-bg:#F7EFDC; --amber-bdr:#DCC48A; --amber-deep:#6B4C10;
  --slate-bg:#F3ECE1; --slate-bdr:#D3C8B6; --slate-deep:#241E17;
  --rose:#B23A2E; --rose-bg:#F8E9E7; --rose-bdr:#E0AFA9; --rose-deep:#72231B;
  --indigo:#2F5FB0; --indigo-bg:#E8EEF8; --indigo-bdr:#AFC4E4; --indigo-deep:#1E3D72;
  --purple:#8B8073; --purple-bg:#F3ECE1; --purple-bdr:#D3C8B6; --purple-deep:#241E17;
  color-scheme: light;

  /* === Legacy aliases (compat composants pré-mockup) — pointent vers tokens mockup === */

  --shadow:0 1px 6px rgba(30,50,100,.08);
  --shadow-card:0 1px 2px rgba(0,0,0,0.04),0 4px 8px rgba(0,0,0,0.04);
  --shadow-pop:0 12px 36px rgba(30,50,100,.14),0 2px 8px rgba(30,50,100,.08);
  --shadow-toast:0 4px 16px rgba(30,50,100,.18);

  --accd:  var(--acc-tint);
  --grn:   var(--green);
  --grnd:  var(--green-bg);
  --red:   var(--rose);
  --redd:  var(--rose-bg);
  --blue:  var(--call-ico);
  --blued: var(--call-bg);
  --pur:   var(--purple);
  --purd:  var(--purple-bg);
  --amberd:var(--amber-bg);
  --inpbg: var(--surf);
  --fg-3:var(--txt3);

  --btn-primary-text:      #FFFFFF;
}

body.dark{

  /* === « Paper & Ink » sombre — encre de nuit ============================
     Le bleu-gris d'origine (#080E1A, teinte 264) devient une encre CHAUDE :
     le sombre doit etre la meme matiere que le clair, pas une autre marque. */
  --acc:#E8862E; --acc-tint:#2C2115; --acc-deep:#F0A04E; --acc-glow:rgba(232,134,46,0.25);
  --bg:#14110E; --surf:#201B15; --surf2:#1C1813; --surf3:#241E17;
  --bdr:#322B22; --bdr2:#423A2E;
  --txt:#ECE4D8; --txt2:#B9AD9C; --txt3:#8A7F70;

  /* Memes tuiles en encre de nuit — meme regle : une seule marque. */
  --call-bg:#1C1813; --call-bdr:#423A2E; --call-ico:#B9AD9C; 
  --pho-bg:#1C1813; --pho-bdr:#423A2E; --pho-lbl:#ECE4D8;

  /* Memes semantiques en encre de nuit (tokens/colors.css, bloc sombre). */
  --green:#7BC48C; --green-bg:#1B2A1F; --green-bdr:#2F5238; --green-deep:#A8DDB5;
  --amber:#E0B458; --amber-bg:#2A2213; --amber-bdr:#4E3F1E; --amber-deep:#F0D08E;
  --slate-bg:#1C1813; --slate-bdr:#423A2E; --slate-deep:#ECE4D8;
  --rose:#E88B7E; --rose-bg:#2E1A17; --rose-bdr:#5A2E28; --rose-deep:#F3B5AC;
  --indigo:#8FB2E8; --indigo-bg:#172234; --indigo-bdr:#2C4463; --indigo-deep:#BBD0F0;
  --purple:#8A7F70; --purple-bg:#1C1813; --purple-bdr:#423A2E; --purple-deep:#ECE4D8;
  color-scheme: dark;

  /* === Legacy aliases dark === */

  --shadow:0 1px 8px rgba(0,0,0,.4);
  --shadow-card:0 1px 2px rgba(0,0,0,0.4),0 4px 12px rgba(0,0,0,0.3);
  --shadow-pop:0 12px 36px rgba(0,0,0,.5),0 2px 8px rgba(0,0,0,.35);
  --shadow-toast:0 4px 20px rgba(0,0,0,.5);

  --accd:  var(--acc-tint);
  --grn:   var(--green);
  --grnd:  var(--green-bg);
  --red:   var(--rose);
  --redd:  var(--rose-bg);
  --blue:  var(--call-ico);
  --blued: var(--call-bg);
  --pur:   var(--purple);
  --purd:  var(--purple-bg);
  --amberd:var(--amber-bg);
  --inpbg: var(--surf);
  --fg-3:var(--txt3);

  --btn-primary-text:      #FFFFFF;
}

/* ── Reset ── */
*,*::before,*::after{margin:0;padding:0;box-sizing:border-box;-webkit-tap-highlight-color:transparent}
html,body{height:100%;overflow:hidden}
html{touch-action:manipulation}
/* Phase 4.B — overscroll-behavior:contain disables iOS pull-to-refresh on the
   PWA shell. scrollbar-gutter:stable kills layout shift quand la scrollbar
   apparaît (desktop / Android). */
body{font-family:var(--font-text);background:var(--bg);color:var(--txt);display:flex;flex-direction:column;font-size:15px;font-variant-numeric:tabular-nums;font-feature-settings:'tnum' 1;-webkit-font-smoothing:antialiased;overscroll-behavior:contain;scrollbar-gutter:stable}

/* ── Icônes Lucide (Phase 4.C) ──
   Usage : <svg class="ico"><use href="#i-NAME"/></svg>
   Taille : 1em (suit font-size du parent). Couleur : currentColor.
   Variantes : .ico-sm (.85em) · .ico-lg (1.25em) · .ico-xl (1.5em). */
.ico{width:1em;height:1em;fill:none;stroke:currentColor;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;vertical-align:-.15em;flex-shrink:0;display:inline-block}
.ico-sm{width:.85em;height:.85em}
.ico-lg{width:1.25em;height:1.25em}
.ico-xl{width:1.5em;height:1.5em}

/* ── Layout principal ── */
header{flex-shrink:0;height:calc(52px + env(safe-area-inset-top));display:flex;align-items:center;justify-content:space-between;padding:env(safe-area-inset-top) var(--pad) 0;background:var(--surf);border-bottom:1px solid var(--bdr);box-shadow:var(--shadow-card);position:relative;z-index:10}
.logo{font-family:var(--font-display);font-weight:500;font-size:1.3rem;color:var(--txt);letter-spacing:-.025em}
.hdr-r{display:flex;align-items:center;gap:8px}
.wbadge{font-size:.62rem;font-weight:500;color:var(--txt2);background:var(--surf2);border:1px solid var(--bdr);padding:3px 8px;border-radius:20px;font-style:italic;text-transform:none;letter-spacing:0}
.wbadge b{color:var(--txt);font-weight:600}
.hdr-alert{background:var(--redd);color:var(--red);border:1px solid rgba(192,57,43,.2);border-radius:20px;padding:3px 10px;font-size:.65rem;font-weight:500;cursor:pointer}
.hdr-menu-wrap{position:relative}
.hdr-menu-btn{width:36px;height:36px;border-radius:50%;border:1px solid var(--bdr2);background:var(--surf2);cursor:pointer;font-size:1.2rem;display:flex;align-items:center;justify-content:center;color:var(--txt2);font-family:inherit}
.hdr-menu-btn:active{transform:scale(.9)}
.hdr-menu{display:none;position:absolute;top:calc(100% + 8px);right:0;min-width:180px;background:var(--surf);border:1px solid var(--bdr2);border-radius:14px;padding:8px;box-shadow:var(--shadow-pop);z-index:30}
/* 68px : l’en-tête (52px) et la marge du menu ; en paysage, le menu défile au lieu de sortir de l’écran. */
.hdr-menu.on{display:block;max-height:calc(var(--vvh,100dvh) - 68px - env(safe-area-inset-top) - env(safe-area-inset-bottom) - var(--env-height,0px));overflow-y:auto}
.hdr-menu-item{display:flex;align-items:center;gap:10px;width:100%;text-align:left;padding:12px 14px;border:none;background:none;border-radius:10px;cursor:pointer;font-size:.88rem;font-weight:600;color:var(--txt);font-family:inherit}
.hdr-menu-item:active{background:var(--surf2)}
.hdr-menu-danger{color:var(--red)}
.rpill{font-size:.6rem;font-weight:600;padding:3px 8px;border-radius:20px;letter-spacing:.04em;text-transform:uppercase;margin:0 auto 8px}
.rp-a{background:var(--accd);color:var(--acc);border:1px solid rgba(139,69,19,.2)}
.rp-l{background:var(--grnd);color:var(--grn);border:1px solid rgba(46,122,70,.2)}

.scroll{flex:1;overflow-y:auto;overflow-x:hidden;-webkit-overflow-scrolling:touch;scrollbar-width:none}
.scroll::-webkit-scrollbar{display:none}
.inner{padding:var(--pad) var(--pad) calc(var(--nav) + 16px + env(safe-area-inset-bottom))}

/* ── Bottom nav ── */
.bnav{height:calc(var(--nav) + env(safe-area-inset-bottom,0px));flex-shrink:0;background:var(--surf);border-top:1px solid var(--bdr);display:grid;padding-bottom:env(safe-area-inset-bottom,0px)}
.ni{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:3px;cursor:pointer;position:relative;transition:transform var(--t-fast) var(--ease)}
.ni:active{transform:scale(.94)}
.ni-ico{font-size:1.2rem;transition:transform var(--t-base) var(--ease);position:relative}
.ni-lbl{font-size:.58rem;font-weight:500;color:var(--txt3);text-transform:uppercase;letter-spacing:.08em;transition:color var(--t-base) var(--ease)}
.ni.on .ni-lbl{color:var(--txt);font-weight:600}
.ni.on .ni-ico{transform:translateY(-2px)}
.ni::after{content:'';position:absolute;top:0;left:50%;transform:translateX(-50%) scaleX(0);width:24px;height:2.5px;background:var(--acc);border-radius:0 0 3px 3px;transition:transform var(--t-base) var(--ease);transform-origin:center}
.ni.on::after{transform:translateX(-50%) scaleX(1)}

/* ── Sections ── */
.sec{display:none}
.sec.on{display:block;animation:fu .26s var(--ease)}
@keyframes fu{from{opacity:0}to{opacity:1}}
.sechead{margin-bottom:12px;display:flex;align-items:flex-start;justify-content:space-between}
.sh h2{font-family:var(--font-display);font-size:1.5rem;font-weight:500;letter-spacing:-.025em;color:var(--txt);line-height:1.05;text-wrap:balance}
.sh p{font-style:italic;font-size:.72rem;color:var(--txt2);margin-top:4px}

/* ── Cards ── */
.card{background:var(--surf);border:1px solid var(--bdr);border-radius:var(--rad);padding:var(--pad);margin-bottom:10px;box-shadow:var(--shadow-card)}
.ctitle{font-family:var(--font-display);font-size:.85rem;font-weight:500;font-style:italic;color:var(--txt2);margin-bottom:10px;letter-spacing:.005em;text-wrap:balance}

/* ── KPI grid ── */
.kg{display:grid;gap:8px;margin-bottom:10px}
.k2{grid-template-columns:1fr 1fr}
.kpi{background:var(--surf2);border:1px solid var(--bdr);border-radius:var(--radsm);padding:12px 11px;position:relative}
.kl{font-size:.58rem;color:var(--txt3);font-weight:500;text-transform:uppercase;letter-spacing:.09em;padding-bottom:6px;margin-bottom:6px;border-bottom:1px solid var(--bdr)}
.kv{font-family:var(--font-display);font-size:1.35rem;font-weight:500;line-height:1;letter-spacing:-.025em}
.ks{font-size:.58rem;color:var(--txt3);margin-top:3px;font-style:italic}
.cy{color:var(--acc)}.cg{color:var(--grn)}.cr{color:var(--red)}.cw{color:var(--txt)}

/* ── Lot semaine ── */
/* .lot-week-box retiré en Phase E — doublon avec KPI Coûts */

/* ── Badges ── */
.badge{display:inline-flex;align-items:center;gap:3px;padding:4px 9px;border-radius:4px;font-size:.6rem;font-weight:500;text-transform:uppercase;letter-spacing:.06em;border-width:1.5px;white-space:nowrap}
.bg{background:var(--grnd);color:var(--grn);border:1px solid rgba(56,196,114,.2)}
.by{background:var(--accd);color:var(--acc);border:1px solid rgba(139,69,19,.2)}
.br{background:var(--redd);color:var(--red);border:1px solid rgba(192,57,43,.2)}
.bb{background:var(--blued);color:var(--blue);border:1px solid rgba(26,95,160,.18)}
.bp{background:var(--purd);color:var(--pur);border:1px solid rgba(94,62,154,.18)}
.b-cash{background:var(--grnd);color:var(--grn);border:1px solid rgba(56,196,114,.18)}
.b-twint{background:var(--blued);color:var(--blue);border:1px solid rgba(26,95,160,.2)}
.b-later{background:rgba(200,120,0,.1);color:var(--amber);border:1px solid rgba(200,120,0,.2)}
body.dark .b-later{color:var(--amber)}

/* ── Boutons ── */
.btn{display:inline-flex;align-items:center;justify-content:center;gap:.3rem;padding:10px 14px;border-radius:var(--radsm);border:none;font-family:var(--font-text);font-size:.82rem;font-weight:600;cursor:pointer;transition:background var(--t-fast) var(--ease),border-color var(--t-fast) var(--ease),transform var(--t-fast) var(--ease),filter var(--t-fast) var(--ease),box-shadow var(--t-fast) var(--ease);text-decoration:none;white-space:nowrap;min-height:40px}
.bf{width:100%;display:flex}
.btn.bacc.bf{max-width:400px;margin-left:auto;margin-right:auto;border-radius:12px;box-shadow:var(--shadow-card)}
.bacc{background:var(--acc);color:#fff}.bacc:active{transform:scale(.96)}
.bgrn{background:var(--grnd);color:var(--grn);border:1px solid rgba(56,196,114,.22)}.bgrn:active{filter:brightness(.9)}
.bred{background:var(--redd);color:var(--red);border:1px solid rgba(192,57,43,.2)}
.bghost{background:transparent;color:var(--txt2);border:1px solid var(--bdr2)}.bghost:active{background:var(--surf2)}
.bblu{background:var(--blued);color:var(--blue);border:1px solid rgba(26,95,160,.18)}
.bsm{padding:6px 10px;font-size:.75rem;border-radius:8px;min-height:34px}
.al{display:inline-flex;align-items:center;gap:.22rem;padding:8px 12px;border-radius:8px;font-size:.72rem;font-weight:500;text-decoration:none;cursor:pointer;border:none;font-family:var(--font-text);transition:background var(--t-fast) var(--ease),border-color var(--t-fast) var(--ease),transform var(--t-fast) var(--ease),filter var(--t-fast) var(--ease);min-height:36px}
.al-m{background:var(--blued);color:var(--blue);border:1px solid rgba(26,95,160,.14)}
.al-w{background:rgba(37,211,102,.08);color:#25D366;border:1px solid rgba(37,211,102,.18)}
.al-c{background:var(--blued);color:var(--blue);border:1px solid rgba(26,95,160,.14)}
.al-d{background:var(--redd);color:var(--red);border:1px solid rgba(192,57,43,.15)}
.al-d.conf{background:var(--red);color:#fff;animation:pulse .3s ease}
@keyframes pulse{0%,100%{transform:scale(1)}50%{transform:scale(1.08)}}

/* ── Formulaires ── */
.field{margin-bottom:10px}
.field label{display:block;font-size:.62rem;color:var(--txt2);font-weight:600;text-transform:uppercase;letter-spacing:.06em;margin-bottom:5px}
/* CRIT-A-1 — font-size 1rem (16px) requis pour empêcher iOS Safari
   de zoomer automatiquement au focus (cf. WCAG 1.4.4 + UX iOS). */
.inp{width:100%;background:var(--inpbg);border:1px solid var(--bdr2);border-radius:var(--radsm);padding:11px 12px;color:var(--txt);font-family:var(--font-text);font-size:1rem;outline:none;transition:border-color var(--t-fast) var(--ease),box-shadow var(--t-fast) var(--ease);-webkit-appearance:none;appearance:none;min-height:44px}
.inp:focus{border-color:var(--acc);box-shadow:0 0 0 3px var(--accd)}
.sbox:focus-within .sico{opacity:.7}
.inp option{background:var(--surf2)}
textarea.inp{resize:none;min-height:auto}
.hint{font-size:.62rem;color:var(--txt3);margin-top:3px}
.frow{display:flex;gap:8px}.frow .field{flex:1}
.sbox{position:relative;margin-bottom:12px}
.sbox .inp{padding-left:2.2rem}
.sico{position:absolute;left:.7rem;top:50%;transform:translateY(-50%);font-size:.85rem;opacity:.4;pointer-events:none}
.slbl{font-size:.62rem;color:var(--txt2);font-weight:600;text-transform:uppercase;letter-spacing:.06em;margin-bottom:6px}

/* ── Misc ── */
.divider{height:1px;background:var(--bdr);margin:8px 0}
.row{display:flex;align-items:center;justify-content:space-between;padding:5px 0;font-size:.82rem}
.row.tot{font-weight:500;font-size:.88rem;border-top:1px solid var(--bdr);padding-top:8px;margin-top:2px}
.empty-st{text-align:center;padding:32px var(--pad);color:var(--txt3)}
.empty-st .ei{font-size:2.2rem;margin-bottom:8px}
.empty-st p{font-size:.78rem}

/* ── Statistiques ── */
.stabs{display:flex;gap:6px;margin-bottom:10px}
.stab{flex:1;padding:9px;border-radius:8px;border:1px solid var(--bdr);background:var(--surf2);color:var(--txt2);font-family:var(--font-text);font-size:.68rem;font-weight:500;text-transform:uppercase;letter-spacing:.06em;cursor:pointer;text-align:center}
.stab.sel{border-color:var(--acc);background:var(--accd);color:var(--acc)}

/* ── Livraisons — header jour ── */
.day-empty{font-size:.72rem;color:var(--txt3);padding:10px var(--pad);background:var(--surf2);border-radius:var(--radsm);border:1px dashed var(--bdr);text-align:center}

/* Bouton ⋮ contexte livraison */
/* .dlv-ctx retiré en Phase G — le bouton ⋮ passe dans la rangée
   d'icon-buttons de .dlv-actions comme 7e slot « Plus ». */

/* ── Historique ── */
.htog{display:flex;align-items:center;justify-content:space-between;padding:12px var(--pad);background:var(--surf);border:1px solid var(--bdr);border-radius:var(--rad);cursor:pointer;margin-bottom:5px;box-shadow:var(--shadow-card)}
.hbody{max-height:0;overflow:hidden;transition:max-height .3s ease}.hbody.on{max-height:3000px}
.hi{background:var(--surf);border:1px solid var(--bdr);border-left:3px solid var(--grn);border-radius:var(--rad);padding:10px var(--pad);margin-bottom:9px}
.hi-top{display:flex;align-items:center;justify-content:space-between;margin-bottom:3px}
.hi-name{font-weight:500;font-size:.85rem}

/* ── Menu contextuel ── */
.ctx-btn{width:32px;height:32px;border-radius:50%;border:1px solid var(--bdr2);background:transparent;color:var(--txt2);font-size:1.1rem;cursor:pointer;display:flex;align-items:center;justify-content:center;flex-shrink:0;font-family:inherit;line-height:1}
.ctx-btn:active{background:var(--surf2)}
.ctx-red-conf{background:var(--red)!important;color:#fff!important;animation:ctx-pulse-conf 1s ease-in-out infinite}
@keyframes ctx-pulse-conf{0%,100%{opacity:1}50%{opacity:.78}}

/* ── Planification ── */
.daybtns{display:flex;gap:6px;flex-wrap:wrap;margin-bottom:8px}
.daybtn{padding:8px 12px;border-radius:8px;border:1px solid var(--bdr);background:var(--surf2);color:var(--txt2);font-family:var(--font-text);font-size:.7rem;font-weight:500;text-transform:uppercase;letter-spacing:.05em;cursor:pointer;min-height:38px}
.daybtn.sel{border-color:var(--acc);background:var(--accd);color:var(--acc)}
.qty-row{display:flex;align-items:center;justify-content:space-between;background:var(--surf2);border:1px solid var(--bdr);border-radius:var(--radsm);padding:10px 12px;margin-bottom:8px}
.qnm{font-weight:600;font-size:.85rem;flex:1}
.qaddr{font-size:.62rem;color:var(--txt3);margin-top:2px}
.qctrl{display:flex;align-items:center;gap:14px}
.qbtn{width:36px;height:36px;border-radius:50%;border:2px solid var(--bdr2);background:var(--surf3);color:var(--txt);font-size:1.2rem;cursor:pointer;display:flex;align-items:center;justify-content:center;font-weight:500;font-family:var(--font-text)}
.qbtn:active{background:var(--acc);color:#fff;border-color:var(--acc)}
.qval{font-family:var(--font-display);font-size:1.2rem;font-weight:500;color:var(--acc);min-width:36px;text-align:center}

/* ── Alpha tabs clients ── */
.alpha-btn{padding:5px 8px;border-radius:8px;border:1px solid var(--bdr);background:var(--surf2);color:var(--txt2);font-size:.72rem;font-weight:600;cursor:pointer;min-width:30px;text-align:center;min-height:34px}
.alpha-btn.sel{background:var(--acc);color:#fff;border-color:var(--acc)}
.alpha-btn.has{color:var(--txt)}

/* ── Itinéraire ── */
.itin-st{background:var(--surf);border:1px solid var(--bdr);border-radius:var(--rad);padding:10px var(--pad);margin-bottom:8px;display:flex;gap:10px;align-items:flex-start;box-shadow:var(--shadow-card)}
.itin-n{width:28px;height:28px;border-radius:50%;background:var(--acc);color:#fff;font-weight:600;font-size:.75rem;display:flex;align-items:center;justify-content:center;flex-shrink:0;margin-top:2px}
.itin-b{flex:1}
.itin-nm{font-weight:500;font-size:.88rem}
.itin-ad{font-size:.68rem;color:var(--txt2);margin-top:2px}
.itin-mt{display:flex;gap:5px;flex-wrap:wrap;margin-top:6px}

/* ── Login ── */
/* Session présumée en cours de vérification (classe posée dans <head>, retirée par session.js). */
.session-restoring #loginsc{visibility:hidden}
.loginsc{position:fixed;inset:0;z-index:500;display:flex;align-items:center;justify-content:center;padding:24px;background:var(--bg)}
.lbox{width:100%;max-width:340px}
.trow{display:flex;gap:10px;margin-bottom:24px}
.topt{flex:1;padding:12px 8px;border-radius:12px;border:2px solid var(--bdr);background:var(--surf2);cursor:pointer;text-align:center}
.topt.sel{border-color:var(--acc);background:var(--accd)}
.toi{font-size:1.4rem;margin-bottom:3px}
.ton{font-size:.75rem;font-weight:500;color:var(--txt2)}
.topt.sel .ton{color:var(--acc)}
.lerr{font-size:.75rem;color:var(--red);margin-top:6px;display:none}

/* ── Modals ── */
.mover{display:none!important;position:fixed;inset:0;z-index:200;background:rgba(0,0,0,.72);backdrop-filter:blur(5px);align-items:flex-end;justify-content:center;animation:fadeover var(--t-base) var(--ease)}
.mover.on{display:flex!important}
/* Sans image de fin : le voile s’arrête sur SA teinte. L’ancienne fin (noir 72 %, flou) passait devant le voile PUCACE le temps de l’animation. */
@keyframes fadeover{from{background-color:rgba(0,0,0,0)}}
.modal{background:var(--surf);border:1px solid var(--bdr2);border-radius:14px 14px 0 0;padding:0 var(--pad) 36px;width:100%;max-width:600px;max-height:92vh;overflow-y:auto;animation:su .28s var(--ease);box-shadow:var(--shadow-pop);scrollbar-width:none}
.modal::-webkit-scrollbar{display:none}
@keyframes su{from{transform:translateY(8%);opacity:0}to{transform:translateY(0);opacity:1}}
.mhandle{width:36px;height:4px;background:var(--bdr2);border-radius:2px;margin:10px auto 16px;opacity:.6}
.mtitle{font-family:var(--font-display);font-size:1.25rem;font-weight:500;letter-spacing:-.02em;margin-bottom:14px;color:var(--txt);text-wrap:balance}
.mact{display:flex;gap:8px;margin-top:10px}.mact .btn{flex:1}

/* ── Phase 4.D — Native <dialog> (bottom-sheet) ─────────────────────────────
 * Reset UA defaults (centered box, opaque border) and restore the bottom-
 * sheet look used by .mover. The browser places <dialog> in the top-layer
 * when opened via showModal() — focus trap + ESC + scrim are free.
 */
/* transform:none — le .modal centré de la maquette (translate -50 %) décalait la fenêtre « Écrire » hors de l’écran. */
dialog.modal{position:fixed;inset:0;margin:auto auto 0;border:1px solid var(--bdr2);padding:0 var(--pad) 36px;color:var(--txt);transform:none}
dialog.modal:not([open]){display:none}
dialog.modal[open]{display:block;animation:su .28s var(--ease)}
dialog.modal::backdrop{background:rgba(0,0,0,.72);backdrop-filter:blur(5px)}

/* ── Pay sheet ── */
.payover{display:none;position:fixed;inset:0;z-index:300;background:rgba(0,0,0,.82);backdrop-filter:blur(7px);align-items:flex-end;justify-content:center}
.payover.on{display:flex}
.paysheet{background:var(--surf);border:1px solid var(--bdr2);border-radius:18px 18px 0 0;padding:0 var(--pad) 48px;width:100%;max-width:600px;animation:su .22s cubic-bezier(.4,0,.2,1)}
.ph{width:32px;height:3px;background:var(--bdr2);border-radius:2px;margin:10px auto 18px}
.pay-nm{font-family:var(--font-display);font-size:1.15rem;font-weight:500;margin-bottom:3px}
.pay-inf{font-size:.8rem;color:var(--txt2);margin-bottom:16px}
.pay-opts{display:grid;grid-template-columns:1fr 1fr 1fr;gap:10px;margin-bottom:16px}
.popt{padding:16px 8px;border-radius:12px;border:2px solid var(--bdr);background:var(--surf2);cursor:pointer;text-align:center;font-family:var(--font-text)}
.popt:active{transform:scale(.95)}
.popt.s-cash{border-color:var(--grn);background:var(--grnd)}
.popt.s-twint{border-color:var(--blue);background:var(--blued)}
.popt.s-later{border-color:var(--amber);background:rgba(200,120,0,.1)}
.poi{font-size:1.8rem;margin-bottom:5px}
.pon{font-size:.82rem;font-weight:500}
.paybtn{width:100%;padding:16px;border-radius:12px;border:none;font-family:var(--font-display);font-size:1.05rem;font-weight:600;cursor:pointer}
.paybtn:active{transform:scale(.97)}
.paycancel{width:100%;padding:10px;margin-top:8px;border-radius:var(--radsm);border:1px solid var(--bdr);background:transparent;color:var(--txt3);font-family:var(--font-text);font-size:.8rem;font-weight:500;cursor:pointer}

/* ── Toast ── */
.toast{position:fixed;top:60px;left:50%;transform:translateX(-50%) translateY(-12px) scale(.96);background:var(--surf);border:1px solid var(--bdr2);border-radius:20px;padding:6px 16px;font-size:.78rem;font-weight:600;color:var(--txt);opacity:0;transition:opacity var(--t-base) var(--ease),transform var(--t-base) var(--ease);z-index:400;pointer-events:none;width:max-content;max-width:calc(100vw - 32px);text-align:center;box-shadow:var(--shadow-toast)}
.toast.show{opacity:1;transform:translateX(-50%) translateY(0) scale(1)}
.flash-ok{position:fixed;inset:0;z-index:350;background:rgba(56,196,114,.18);pointer-events:none;opacity:0;transition:opacity .15s}
.flash-ok.on{opacity:1}

/* ── Addr autocomplete ── */
.addr-sugg{position:absolute;top:100%;left:0;right:0;background:var(--surf);border:1px solid var(--bdr2);border-radius:var(--radsm);z-index:250;max-height:200px;overflow-y:auto;display:none}
.addr-sugg.on{display:block}
.addr-item{padding:10px 12px;font-size:.8rem;cursor:pointer;border-bottom:1px solid var(--bdr);color:var(--txt)}
.addr-item:last-child{border-bottom:none}
.addr-item:active{background:var(--accd);color:var(--acc)}
.addr-field-wrap{position:relative}

/* ── Livraisons — nouveau design ── */
.liv-subhdr{display:flex;align-items:center;justify-content:space-between;margin-bottom:10px}
.liv-title{font-family:var(--font-display);font-weight:500;font-size:1.4rem;letter-spacing:-.025em;color:var(--txt);text-wrap:balance}
.liv-subtitle{font-size:.72rem;color:var(--txt2);margin-top:2px}
.liv-hdr-actions{display:flex;gap:6px}

/* Tabs filtre */
.liv-tabs{display:flex;gap:6px;overflow-x:auto;margin-bottom:12px;padding-bottom:2px;scrollbar-width:none}
.liv-tabs::-webkit-scrollbar{display:none}
.liv-tab{flex-shrink:0;padding:7px 12px;border-radius:8px;border:1.5px solid var(--bdr2);background:var(--surf);color:var(--txt2);font-family:var(--font-text);font-size:.68rem;font-weight:500;text-transform:uppercase;letter-spacing:.06em;cursor:pointer;display:inline-flex;align-items:center;gap:5px;white-space:nowrap;transition:background var(--t-fast) var(--ease),border-color var(--t-fast) var(--ease),color var(--t-fast) var(--ease)}
.liv-tab.sel{border-color:var(--blue);background:var(--blued);color:var(--blue)}
.liv-tab-count{display:inline-flex;align-items:center;justify-content:center;min-width:18px;height:18px;padding:0 5px;border-radius:99px;background:var(--surf2);color:var(--txt2);font-size:.65rem;font-weight:600}
.liv-tab.sel .liv-tab-count{background:var(--blue);color:#fff}

/* Carte livraison — spec preview/components-delivery-card.html
   Card full-width, pas d'indicateur externe. Statut = bordure gauche
   colorée (3px) + badge tampon interne. */
.dlv-row{margin-bottom:10px}
.dlv-card{width:100%;min-width:0;border-radius:10px;border:1px solid var(--bdr);border-left:3px solid var(--fg-3);background:var(--surf);overflow:hidden;box-shadow:var(--shadow-card)}
body.dark .dlv-card{background:var(--surf)}

.dlv-head{display:flex;align-items:center;gap:10px;padding:12px 12px 9px;border-bottom:1px solid var(--bdr)}
.dlv-num{padding:4px 9px;border-radius:6px;font-family:var(--font-display);font-size:.78rem;font-weight:500;letter-spacing:-.01em;white-space:nowrap;flex-shrink:0;background:var(--surf2);color:var(--txt2)}
.dlv-info{flex:1;min-width:0}
.dlv-name{font-size:.88rem;font-weight:500;color:var(--txt);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.dlv-phone{font-size:.7rem;color:var(--txt2);margin-top:1px}
.dlv-amount{text-align:right;flex-shrink:0}
.dlv-price{font-size:.9rem;font-weight:500;color:var(--txt);white-space:nowrap}
.dlv-price-unpaid{color:var(--red)}
.dlv-kg{font-size:.65rem;color:var(--txt3);margin-top:1px}

.dlv-addr{display:flex;align-items:flex-start;gap:6px;padding:7px 10px 0}
.dlv-addr-ico{font-size:.85rem;flex-shrink:0;line-height:1.4}
.dlv-addr1{font-size:.82rem;font-weight:600;color:var(--txt)}
.dlv-addr2{font-size:.7rem;color:var(--txt2);margin-top:1px}

.dlv-note{margin:5px 10px 0;font-size:.72rem;background:var(--purd);color:var(--pur);border-radius:8px;padding:5px 9px;font-weight:500;text-wrap:pretty}

.dlv-badges{display:flex;gap:6px;flex-wrap:wrap;padding:8px 12px}
.dlv-badge{display:inline-flex;align-items:center;gap:3px;padding:3px 9px;border-radius:99px;font-size:.66rem;font-weight:500;border:1px solid;white-space:nowrap}
.dlv-pay-cash{background:#F0FDF4;color:#166534;border-color:#86EFAC}
.dlv-pay-twint{background:#EFF6FF;color:#1D4ED8;border-color:#93C5FD}
/* Pastilles de statut — elles ecrivaient leur couleur EN DUR, donc elles
   ignoraient le theme sombre et echappaient a la palette. Remises sur les
   variables semantiques : « a livrer » et « deposee » sont des ETATS neutres,
   pas des alertes ; seuls l impaye (rouge) et le livre (vert) portent une
   couleur d argent. */
.dlv-pay-later{background:var(--rose-bg);color:var(--rose);border-color:var(--rose-bdr)}
.dlv-status-done{background:var(--green-bg);color:var(--green);border-color:var(--green-bdr)}
.dlv-status-post{background:var(--amber-bg);color:var(--amber);border-color:var(--amber-bdr)}
.dlv-status-pend{background:var(--surf2);color:var(--txt2);border-color:var(--bdr2)}
.dlv-status-dep{background:var(--amber-bg);color:var(--amber);border-color:var(--amber-bdr)}
.dlv-pickup{background:var(--indigo-bg);color:var(--indigo);border-color:var(--indigo-bdr)}
.dlv-date{background:var(--surf2);color:var(--txt2);border-color:var(--bdr)}
/* Ticketing : badge d'assignation sur chaque carte livraison */
.dlv-assignee{font-family:var(--font-text)}
.dlv-assignee-me{background:var(--grnd);color:var(--grn);border-color:rgba(56,196,114,.35)}
.dlv-assignee-other{background:var(--surf2);color:var(--txt2);border-color:var(--bdr2)}
.dlv-assignee-none{background:rgba(200,120,0,.12);color:var(--amber);border-color:rgba(200,120,0,.35)}
body.dark .dlv-assignee-none{color:var(--amber);border-color:rgba(224,144,32,.4);background:rgba(224,144,32,.12)}
body.dark .dlv-pay-cash{background:var(--grnd);color:var(--grn);border-color:rgba(56,196,114,.3)}
body.dark .dlv-pay-twint{background:var(--blued);color:var(--blue);border-color:rgba(74,156,245,.3)}
body.dark .dlv-status-done{background:var(--grnd);color:var(--grn);border-color:rgba(56,196,114,.3)}
body.dark .dlv-status-pend{background:var(--blued);color:var(--blue);border-color:rgba(74,156,245,.3)}
body.dark .dlv-status-dep{background:rgba(217,119,6,.15);color:#FCD34D;border-color:rgba(217,119,6,.3)}

/* ── Actions card : rangée de 7 icon-buttons ronds 40px + labels ─
   spec preview/components-delivery-card.html. Espacement space-between,
   pas de scroll horizontal. Les labels restent visibles en permanence
   (plus de media query qui les masquait). */
.dlv-actions{display:flex;align-items:flex-start;justify-content:space-between;gap:2px;padding:10px 10px 12px;border-top:1px solid var(--bdr)}
.dlv-act-wrap{display:flex;flex-direction:column;align-items:center;gap:3px;flex:1;min-width:0;cursor:pointer;background:none;border:none;padding:0;font-family:inherit;text-decoration:none;transition:opacity var(--t-fast) var(--ease)}
.dlv-act-wrap:active .dlv-act{background:var(--surf3)}
.dlv-act-wrap[disabled],.dlv-act-wrap.disabled{opacity:.4;pointer-events:none}
.dlv-act{width:40px;height:40px;border-radius:50%;border:1.5px solid var(--bdr2);background:var(--surf2);font-size:.95rem;display:flex;align-items:center;justify-content:center;flex-shrink:0;line-height:1;transition:background var(--t-fast) var(--ease)}
.dlv-act-wa{border-color:#BBF7D0;background:#F0FDF4;color:#166534}
body.dark .dlv-act-wa{border-color:rgba(56,196,114,.25);background:var(--grnd);color:var(--grn)}
.dlv-act-lbl{font-family:var(--font-text);font-size:.5rem;font-weight:500;color:var(--fg-3);text-transform:uppercase;letter-spacing:.08em;line-height:1;white-space:nowrap}

/* CTA en bas de card (Phase G décision Q1, uniquement si isActive).
   HIGH-I-4 : le mot "sticky" du commentaire originel n'était PAS du CSS
   position:sticky — c'est juste un CTA bottom-of-card en flux normal. La
   sticky-au-scroll viewport serait inutilisable dans une liste de 40 cards.
   CRIT-V-2 : radius aligné sur le 8 px final de .dlv-card (l. 768) au lieu
   de 9 px qui créait un défaut bas-gauche dû à overflow:hidden du parent. */
.dlv-cta{display:block;width:100%;margin-top:0;padding:11px 14px;border:none;border-top:1px solid var(--bdr);border-radius:0 0 8px 8px;font-family:var(--font-text);font-size:.86rem;font-weight:600;cursor:pointer;min-height:44px;text-align:center;transition:filter var(--t-fast) var(--ease),transform var(--t-fast) var(--ease)}
.dlv-cta.bacc{background:var(--acc);color:#fff}
.dlv-cta.bacc:active{filter:brightness(.94);transform:scale(.99)}
.route-meta{display:flex;gap:10px;flex-wrap:wrap;font-size:.67rem;color:var(--txt2);background:var(--surf2);border:1px solid var(--bdr);border-radius:var(--radsm);padding:7px 10px;margin-bottom:8px}

/* ── Admin ── */
.usr-row{display:flex;align-items:center;justify-content:space-between;padding:10px 0;border-bottom:1px solid var(--bdr)}

/* ── Plan summary ── */
.stbar{height:6px;background:var(--surf3);border-radius:3px;margin-top:5px;overflow:hidden}
.stfill{height:100%;border-radius:3px;transition:width .4s}

/* ══════════════════════════════════════════════════════
   UI POLISH — dark mode, transitions, inline extraction
   ══════════════════════════════════════════════════════ */

/* ── 1. Dark mode badge fixes ── */
body.dark .dlv-pay-later{background:rgba(200,120,0,.15);color:var(--amber);border-color:rgba(200,120,0,.3)}
body.dark .dlv-status-post{background:rgba(234,88,12,.12);color:#FB923C;border-color:rgba(234,88,12,.3)}
body.dark .dlv-pickup{background:var(--purd);color:var(--pur);border-color:rgba(155,127,232,.3)}
body.dark .dlv-date{background:var(--surf2);color:var(--txt2);border-color:var(--bdr2)}
body.dark .dlv-status-dep{background:rgba(217,119,6,.15);color:#FCD34D;border-color:rgba(217,119,6,.3)}
/* body.dark .dlv-ind-post retiré en Phase G (indicateur externe supprimé) */

/* ── 8. Route number classes (dark mode safe) ── */
.dlv-num-done{background:var(--grnd);color:var(--grn)}
.dlv-num-post{background:rgba(249,115,22,.1);color:#C2410C}
.dlv-num-pend{background:var(--surf2);color:var(--txt2)}
body.dark .dlv-num-done{background:rgba(34,197,94,.12);color:var(--grn)}
body.dark .dlv-num-post{background:rgba(249,115,22,.12);color:#FB923C}

/* ── 9. Search bar slide transition ── */
.liv-search-wrap{max-height:0;overflow:hidden;transition:max-height .2s ease;margin-bottom:0}
.liv-search-wrap.on{max-height:80px;margin-bottom:10px}

/* ── 10. Unpaid KPI clickable ── */
.kpi-link{cursor:pointer;transition:border-color .15s,box-shadow .15s}
.kpi-link:active{border-color:var(--red);box-shadow:0 0 0 2px var(--redd)}

/* ── 11. Reset button subtle ── */
.btn-reset{padding:8px 14px;font-size:.75rem;color:var(--txt3);border:none;background:none}
.btn-reset:active{color:var(--txt2)}

/* ── 12. Toast notch safe ── */
.toast{top:calc(60px + env(safe-area-inset-top));right:auto;bottom:auto;margin:0;overflow:visible}

/* ── 13. Focus visible ── */
/* MED-A-1 — focus-visible étendu : couvre maintenant ctx-item, dlv-act-wrap,
   dlv-cta, hist-pay-pill, assignee-pill, htog, ni, topt, kpi-link, hdr-alert,
   start-point-gps. Avant : focus invisible sur ces ~10 contrôles → impossible
   de naviguer au clavier sans repère visuel. */
.btn:focus-visible,.inp:focus-visible,.al:focus-visible,.daybtn:focus-visible,
.stab:focus-visible,.popt:focus-visible,.liv-tab:focus-visible,
.ctx-btn:focus-visible,.alpha-btn:focus-visible,
.dlv-act-wrap:focus-visible,.dlv-cta:focus-visible,
.hist-pay-pill:focus-visible,.assignee-pill:focus-visible,.htog:focus-visible,
.ni:focus-visible,.topt:focus-visible,.kpi-link:focus-visible,
.hdr-alert:focus-visible,.start-point-gps:focus-visible,
/* CSS-12 : contrôles v2 réellement interactifs (manquaient → aucun anneau de
   focus clavier sur la nav du bas, les onglets, les cartes radio paiement…). */
.nav-item:focus-visible,.tab:focus-visible,.hdr-btn:focus-visible,
.radio-card:focus-visible,.input:focus-visible,.select:focus-visible,
.cta:focus-visible,.stop-act:focus-visible,.stop-done:focus-visible,
.stop-item:focus-visible,.pay-chip:focus-visible,.pay-step:focus-visible,
.pay-close:focus-visible{
  /* Le repère clavier ne dépend pas des ombres décoratives des composants. */
  outline:2px solid var(--acc);outline-offset:1px
}

/* ── 14. Extracted inline styles — shared classes ── */
.flex-between{display:flex;align-items:center;justify-content:space-between}
.flex-start{display:flex;align-items:flex-start;justify-content:space-between}
.flex-wrap{display:flex;gap:5px;flex-wrap:wrap}
.txt-xs{font-size:.6rem;color:var(--txt2)}
.txt-xxs{font-size:.6rem;color:var(--txt3)}
.txt-label{font-size:.6rem;font-weight:600;color:var(--txt3);text-transform:uppercase;letter-spacing:.06em}
.txt-name{font-weight:500;font-size:.86rem}
.txt-price{font-weight:500;color:var(--grn)}
.txt-amount{font-weight:500;font-size:.9rem;color:var(--txt)}
.txt-sub{font-size:.63rem;color:var(--txt2)}
.txt-addr{font-size:.63rem;color:var(--txt2);margin-bottom:7px}
.text-right{text-align:right;flex-shrink:0;margin-left:var(--sp-2)}
.text-center{text-align:center}
.mb-2{margin-bottom:var(--sp-2)}.mb-3{margin-bottom:var(--sp-3)}.mb-4{margin-bottom:var(--sp-4)}
.mt-3{margin-top:var(--sp-3)}
.gap-2{gap:var(--sp-2)}
.grid-2{display:grid;grid-template-columns:1fr 1fr;gap:var(--sp-2)}
.hist-kpi{border-radius:var(--radsm);padding:10px;text-align:center}
.hist-kpi-grn{background:var(--grnd);border:1px solid rgba(26,122,70,.15)}
.hist-kpi-red{background:var(--redd);border:1px solid rgba(209,43,43,.15)}
.hist-kpi-neutral{background:var(--surf2);border:1px solid var(--bdr)}
.hist-month{background:var(--surf2);border:1px solid var(--bdr);border-radius:var(--sp-2);padding:10px var(--sp-3);margin-bottom:6px}
.hist-row{display:flex;justify-content:space-between;padding:4px 0;font-size:.72rem;border-top:1px solid var(--bdr)}
.itin-pay-btns{display:flex;gap:var(--sp-1);margin-top:6px;flex-wrap:wrap}
.itin-pay-btn{font-size:.65rem}
.itin-side{display:flex;flex-direction:column;gap:var(--sp-1);margin-left:6px;flex-shrink:0}
/* Petits écrans : header resserré (le badge de mode est parti avec la bascule, lot 7). */
@media (max-width:380px){
  .hdr-r{gap:6px}
}

/* ══════════════════════════════════════════════════════
   PAPER & INK LAYER — refonte visuelle Partie 3
   Direction éditoriale, fiches papier, tampons encreurs
   ══════════════════════════════════════════════════════ */

/* ── Login : hero éditorial ──
   Phase 4.F (DS-016) : 8 animations séquentielles 580 ms → 2 keyframes
   simples. Le logo+titre fade-in (loginIn 0.3s) ; le reste (form, boutons)
   fade-in avec 0.15s de délai (loginIn 0.3s 0.15s). */
.loginsc{padding:24px 22px}
.lbox{max-width:360px}
.llogo{margin-bottom:18px}
.llogo img{width:108px!important;height:108px!important;border-radius:22px!important;box-shadow:0 8px 28px rgba(60,40,15,.18),0 2px 6px rgba(60,40,15,.10)!important;animation:loginIn .3s var(--ease) both}
body.dark .llogo img{box-shadow:0 8px 32px rgba(0,0,0,.5),0 2px 8px rgba(0,0,0,.3)!important}
.l-title{font-family:var(--font-display);font-weight:500;font-size:2.4rem;color:var(--acc);letter-spacing:-.035em;line-height:.95;margin-bottom:6px;text-wrap:balance;animation:loginIn .3s var(--ease) both}
.l-tag{font-family:var(--font-display);font-style:italic;font-weight:500;font-size:.92rem;color:var(--txt2);margin-bottom:18px;letter-spacing:.005em;animation:loginIn .3s .15s var(--ease) both}
.l-tag::after{content:'';display:block;width:38px;height:1px;background:var(--bdr2);margin-top:12px}
.loginsc .slbl,.loginsc .trow,.loginsc .field,.loginsc .btn.bacc{animation:loginIn .3s .15s var(--ease) both}
.loginsc .trow{background:var(--surf2);border-radius:12px;padding:4px;gap:0;margin-bottom:22px}
.loginsc .topt{border:none;background:transparent;padding:11px 8px;border-radius:9px;transition:background var(--t-fast) var(--ease)}
.loginsc .topt.sel{background:var(--surf);box-shadow:var(--shadow-card)}
.loginsc .btn.bacc{border-radius:12px!important;padding:14px!important;font-size:.95rem;letter-spacing:.01em;box-shadow:0 4px 14px rgba(196,92,24,.22)}
body.dark .loginsc .btn.bacc{box-shadow:0 4px 14px rgba(232,134,46,.28)}
@keyframes loginIn{from{opacity:0;transform:translateY(6px)}to{opacity:1;transform:translateY(0)}}

/* ── Cartes livraison : fiches imprimées ── */
.dlv-card{border-radius:8px;border-left-width:3px;border-width:1px}
/* Éditorial card : le .dlv-ind externe a été retiré en Phase G.
   .dlv-row ne porte plus de margin spécifique (base = 10px). */
.dlv-num{font-family:var(--font-display);font-weight:500;font-size:.78rem;padding:4px 9px;border-radius:6px;letter-spacing:-.01em}
.dlv-name{font-family:var(--font-display);font-weight:500;font-size:.94rem;letter-spacing:-.01em}
.dlv-price{font-family:var(--font-display);font-weight:500;font-size:.98rem;letter-spacing:-.01em}
.dlv-addr1{font-size:.8rem;font-weight:600}
.dlv-addr2{font-size:.68rem;font-style:italic}
.dlv-head{padding:12px 11px 9px}
/* .dlv-actions padding géré par la règle de base 10px 10px 12px (Phase G) */

/* ── Cartes livraison : statut "delivered" plus discret ── */
/* Opacity delivered row retirée — signal livré porté par bordure vert
   + stamp « ✓ Livré · HH:MM » (voir .dlv-card border-left-color) */

/* ── Badges paiement : tampons encreurs ──────────────────────────────────
   Phase 4.F : consolidation famille stamp. Toutes les variantes partagent
   la même typo (.6rem, weight 600, uppercase, letter-spacing, border 1.5px,
   radius 4px). Variantes ne portent QUE le shadow + tilt + colors.
   Classes existantes intactes (utilisées dans templates JS) — on factorise
   seulement les propriétés répétées. */
.dlv-badges{padding:7px 11px;gap:6px}
.dlv-badge,
.dlv-pay-cash,.dlv-pay-twint,.dlv-pay-later,
.dlv-status-done,.dlv-status-post,.dlv-status-pend,.dlv-status-dep,
.dlv-pickup,.dlv-date,
.b-cash,.b-twint,.b-later{
  border-radius:4px;text-transform:uppercase;letter-spacing:.06em;
  font-size:.6rem;font-weight:600;border-width:1.5px;
  font-family:var(--font-text)
}
.dlv-badge{padding:4px 9px}
/* HIGH-V-3 + HIGH-V-4 — stroke-width:1.5 sur Lucide à très petite taille
   (badge .6rem ≈ 9.6px ; .hdr-alert .65rem ≈ 10px). Stroke 2px représentait
   20 % de la largeur → icônes credit-card / home / camera / coins chunky. */
.dlv-badge .ico,.hdr-alert .ico{stroke-width:1.5}
/* HIGH-V-1 — tilt + box-shadow ENCREUR appliqués maintenant aussi aux
   .dlv-status-* et .dlv-pickup pour cohérence visuelle famille stamp.
   Avant : status badges avaient typo+radius mais pas l'effet stamp,
   look "intermédiaire" ni pill ni stamp. */
.dlv-pay-cash,.dlv-pay-twint,.dlv-status-done,.dlv-status-pend,.dlv-pickup,
.b-cash,.b-twint{transform:rotate(-1deg);position:relative}
.dlv-pay-later,.dlv-status-post,.dlv-status-dep,.b-later{transform:rotate(-1.5deg);position:relative}
/* Box-shadow encreur — couleur sémantique par variante */
.dlv-pay-cash,.dlv-status-done,.b-cash{box-shadow:1.5px 1.5px 0 var(--grn)}
.dlv-pay-twint,.dlv-status-pend,.b-twint{box-shadow:1.5px 1.5px 0 var(--blue)}
.dlv-pay-later,.dlv-status-post,.dlv-status-dep,.b-later{box-shadow:1.5px 1.5px 0 var(--amber)}
.dlv-pickup{box-shadow:1.5px 1.5px 0 var(--pur)}
body.dark .dlv-pay-cash,body.dark .dlv-status-done,body.dark .b-cash{box-shadow:1.5px 1.5px 0 rgba(56,196,114,.5)}
body.dark .dlv-pay-twint,body.dark .dlv-status-pend,body.dark .b-twint{box-shadow:1.5px 1.5px 0 rgba(74,156,245,.5)}
body.dark .dlv-pay-later,body.dark .dlv-status-post,body.dark .dlv-status-dep,body.dark .b-later{box-shadow:1.5px 1.5px 0 rgba(224,144,32,.5)}
body.dark .dlv-pickup{box-shadow:1.5px 1.5px 0 rgba(155,127,232,.5)}

/* ── Section heads : typo éditoriale ── */
.sechead{margin-bottom:14px;padding-bottom:10px;border-bottom:1px solid var(--bdr)}

/* ── Liv subheader : titre éditorial ── */
.liv-subtitle{font-style:italic;font-size:.72rem;margin-top:3px}
.liv-subhdr{margin-bottom:12px;padding-bottom:10px;border-bottom:1px solid var(--bdr)}

/* ── Accordéon historique : fade content ── */
.htog{transition:background var(--t-fast) var(--ease)}
.htog:hover{background:var(--surf2)}
.hbody>*{opacity:0;transition:opacity var(--t-base) var(--ease)}
.hbody.on>*{opacity:1}
.harrow{transition:transform var(--t-base) var(--ease);display:inline-block;font-size:.7rem!important}

/* ── Empty states : caractère ── */
.empty-st{padding:42px var(--pad);background:var(--surf);border:1px solid var(--bdr);border-radius:var(--rad-lg);box-shadow:var(--shadow-card);max-width:420px;margin:0 auto}
.empty-st .ei{font-size:2.6rem;opacity:.55;margin-bottom:12px}
.empty-st p{font-size:.8rem;font-style:italic;color:var(--txt2);font-weight:500;text-wrap:pretty}

/* ── Bottom nav : indicateur plus typographique ── */
.ni::after{height:3px;width:28px}

/* ── Header : typo soignée ── */
header{border-bottom-width:1px}

/* ── Refresh button : rotation animation au click ── */
#hdr-refresh-btn:active{transform:rotate(180deg);transition:transform .4s var(--ease)}

/* ── Point de départ tournée (par jour) ── */
.start-point-row{display:flex;gap:6px;align-items:center}
/* CRIT-A-1 — 1rem!important pour priorité sur .inp (iOS zoom prevention). */
.start-point-inp{flex:1;font-size:1rem!important;padding:9px 10px!important;min-height:38px}
.start-point-gps{width:36px;height:36px;min-width:36px;border-radius:50%;border:1px solid var(--bdr2);background:var(--surf);color:var(--txt2);display:flex;align-items:center;justify-content:center;cursor:pointer;flex-shrink:0;transition:background var(--t-fast) var(--ease)}
.start-point-gps:hover,.start-point-gps:active{background:var(--surf2);color:var(--acc)}
.start-point-hint{font-size:.62rem;color:var(--txt3);margin-top:3px;font-style:italic}

/* ── Cartes livraison v2 : dégradés selon paiement + boutons carrés ── */
.dlv-card-cash{background:linear-gradient(135deg,var(--surf) 0%,rgba(22,163,74,.15) 100%)}
.dlv-card-twint{background:linear-gradient(135deg,var(--surf) 0%,rgba(37,99,235,.15) 100%)}
.dlv-card-later{background:linear-gradient(135deg,var(--surf) 0%,rgba(234,88,12,.15) 100%)}
body.dark .dlv-card-cash{background:linear-gradient(135deg,var(--surf) 0%,rgba(56,196,114,.18) 100%)}
body.dark .dlv-card-twint{background:linear-gradient(135deg,var(--surf) 0%,rgba(74,156,245,.18) 100%)}
body.dark .dlv-card-later{background:linear-gradient(135deg,var(--surf) 0%,rgba(232,134,46,.18) 100%)}
/* HIGH-V-5 — règle .dlv-card-postponed retirée : doublon avec
   .dlv-card:has(.dlv-status-post){opacity:.82} (l. 1044, post Phase 4.B). */

/* .dlv-act / .dlv-btn-blue retirés en Phase G : les 7 icon-buttons
   ronds 40px avec labels permanents ont remplacé les boutons carrés
   36px qui masquaient leurs labels en mobile. */

/* ── Historique livraisons : filtres + résumé + sous-header jour ── */
.hist-filters{background:var(--surf);border:1px solid var(--bdr);border-radius:var(--rad);padding:10px var(--pad);margin-bottom:10px;box-shadow:var(--shadow-card)}
.hist-filters .frow{margin-bottom:8px}
.hist-filters .field{margin-bottom:0}
.hist-filters label{font-size:.6rem;letter-spacing:.06em}
/* CRIT-A-1 — gardons 1rem pour éviter zoom iOS. min-height 40px OK. */
.hist-filters .inp{min-height:40px;font-size:1rem}
.hist-pay-toggles{display:flex;gap:6px;flex-wrap:wrap}
.hist-pay-pill{padding:7px 12px;border-radius:8px;border:1.5px solid var(--bdr2);background:var(--surf);color:var(--txt2);font-family:var(--font-text);font-size:.66rem;font-weight:600;cursor:pointer;text-transform:uppercase;letter-spacing:.06em;transition:background var(--t-fast) var(--ease),border-color var(--t-fast) var(--ease),color var(--t-fast) var(--ease);min-height:36px;display:inline-flex;align-items:center;gap:4px}
.hist-pay-pill:active{transform:scale(.96)}
.hist-pay-pill[data-pay="cash"].sel{border-color:var(--grn);background:var(--grnd);color:var(--grn)}
.hist-pay-pill[data-pay="twint"].sel{border-color:var(--blue);background:var(--blued);color:var(--blue)}
.hist-pay-pill[data-pay="later"].sel{border-color:var(--amber);background:rgba(200,120,0,.10);color:var(--amber)}
body.dark .hist-pay-pill[data-pay="later"].sel{color:var(--amber);border-color:rgba(224,144,32,.5);background:rgba(224,144,32,.12)}
.hist-pay-pill.sel:not([data-pay]){border-color:var(--acc);background:var(--accd);color:var(--acc)}
/* HIGH-V-7 — pill assignee dédiée (Toutes / Mes / Livreur). Avant : abusait
   de .hist-pay-pill, sélection vire orange (--acc) — couleur réservée aux
   primaires dans ALLÉGÉ §922. Maintenant : variante sobre var(--blue). */
.assignee-pill{padding:7px 12px;border-radius:8px;border:1.5px solid var(--bdr2);background:var(--surf);color:var(--txt2);font-family:var(--font-text);font-size:.66rem;font-weight:600;cursor:pointer;text-transform:uppercase;letter-spacing:.06em;transition:background var(--t-fast) var(--ease),border-color var(--t-fast) var(--ease),color var(--t-fast) var(--ease);min-height:36px;display:inline-flex;align-items:center;gap:4px}
.assignee-pill:active{transform:scale(.96)}
.assignee-pill.sel{border-color:var(--blue);background:var(--blued);color:var(--blue)}
.lots-sort-bar{display:flex;gap:6px;margin-bottom:12px;flex-wrap:wrap}
.hist-clear-btn{margin-top:8px;font-size:.7rem;color:var(--txt3);background:none;border:none;cursor:pointer;text-decoration:underline;font-family:inherit;padding:4px 0}
.hist-clear-btn:active{color:var(--txt2)}
.hist-summary{padding:10px var(--pad);font-size:.78rem;color:var(--txt2);margin-bottom:10px;background:var(--surf2);border:1px solid var(--bdr);border-radius:var(--radsm)}
.hist-summary strong{color:var(--txt);font-family:var(--font-display);font-weight:500;font-size:.92rem;letter-spacing:-.015em}
.hist-summary .cr strong{color:var(--red)}
.hist-day-subhdr{padding:10px 4px 6px;font-family:var(--font-display);font-weight:500;font-style:italic;font-size:.82rem;color:var(--txt2);border-bottom:1px solid var(--bdr);margin:10px 0 6px;display:flex;justify-content:space-between;align-items:baseline}
.hist-day-subhdr .count{font-size:.62rem;color:var(--txt3);font-family:var(--font-text);font-style:normal;font-weight:500;text-transform:uppercase;letter-spacing:.06em}
.hbody .hist-day-subhdr:first-child{margin-top:4px}

/* ══════════════════════════════════════════════════════════
   ALLÉGÉ — passe finale de sobriété
   ──────────────────────────────────────────────────────────
   Règles : orange UNIQUEMENT pour boutons primaires (.bacc),
   inputs en focus, et marqueurs d'itinéraire. Jamais dans les
   titres, tabs sélectionnés, nav active, chiffres KPI.
   Weights 700 → 500 partout sauf boutons primaires.
   On garde : couleurs badges paiement, filet vert livraisons,
   rouge danger/erreur, couleurs icônes natives.
   ══════════════════════════════════════════════════════════ */

/* — KPI : chiffres en graphite — */
.cy{color:var(--txt)}
/* On garde .cg (vert bénéfice) et .cr (rouge coût/impayé) — ce sont de la sémantique */

/* — Tabs : quand sélectionné, pas d'orange. Graphite + fond léger — */
.stab.sel{border-color:var(--txt);background:var(--surf3);color:var(--txt)}
.daybtn.sel{border-color:var(--txt);background:var(--surf3);color:var(--txt)}

/* — Alpha tabs clients — */
.alpha-btn{font-weight:500}
.alpha-btn.sel{background:var(--txt);color:var(--surf);border-color:var(--txt)}

/* — Nav du bas : indicateur graphite — */
.ni::after{background:var(--txt)}

/* — Quantité +/- : graphite — */
.qval{color:var(--txt);font-weight:500}
.qbtn:active{background:var(--txt);border-color:var(--txt)}

/* — Itinéraire : on garde le cercle numéroté orange (c'est le seul endroit
   où l'accent est utile — signale l'ordre d'étapes) — */
.itin-n{font-weight:600}
.itin-nm{font-weight:500}

/* — Labels de champs : moins criards — */
.field label{font-weight:600;letter-spacing:.06em}
.slbl{font-weight:500}

/* — Boutons standards (non primaires) : weight 500 — */
.btn{font-weight:500}
.bacc{font-weight:600}
/* .bacc garde l'orange — c'est le SEUL bouton accent */

.al{font-weight:500}
.hist-pay-pill{font-weight:500}

/* — Statut "delivered", etc — stamps gardent leur couleur sémantique,
   on allège juste le weight — */
.dlv-badge,
.dlv-status-done,.dlv-status-post,.dlv-status-pend,.dlv-status-dep,
.dlv-pickup,.dlv-date{font-weight:500}

/* — Historique — */
.hi-name{font-weight:500}
.hist-summary strong{font-weight:500}
.hist-day-subhdr{font-weight:500}

/* — Row total — */
.row.tot{font-weight:500}
.ton{font-weight:500}

/* — Top clients bars — dans stats — */
/* (laissé tel quel dans le JS, passe ok avec --blue/--txt) */

/* ── 15. Reduced motion ── */
@media (prefers-reduced-motion: reduce) {
  *,*::before,*::after{
    animation-duration:.01ms!important;
    animation-iteration-count:1!important;
    transition-duration:.01ms!important;
    scroll-behavior:auto!important
  }
}

/* ── Phase 4.B — Modern CSS extras ────────────────────────────────────────
 * 1. :has() — réplique le state-aware côté CSS de ce que la JS fait déjà
 *    (.dlv-card-cash/twint/later via deliveries.js:370). On laisse la JS
 *    en place pour zéro régression ; ces règles documentent le state futur
 *    et entrent en vigueur si la classe JS disparaît un jour.
 * 2. color-mix() en OKLCH — hover/active states sur les boutons primaires.
 *    Permet un hover prévisible sans devoir déclarer un token de plus.
 * 3. Native CSS nesting — démo sur .dlv-card / .dlv-name pour documenter
 *    le pattern. Le reste du fichier reste à plat (refactor à risque sinon).
 */

/* :has() state-aware (Phase 4.B) — couvert par les .dlv-card-* JS aujourd'hui */
.dlv-card:has(.dlv-pay-later){border-left-color:var(--amber)}
.dlv-card:has(.dlv-status-post){opacity:.82}

/* color-mix() OKLCH — hover/active sur primaires (Phase 4.B) */
.bacc:hover{background:color-mix(in oklch, var(--acc), white 8%)}
.bacc:active{background:color-mix(in oklch, var(--acc), black 6%)}
.dlv-cta.bacc:hover{background:color-mix(in oklch, var(--acc), white 8%)}

/* Native CSS nesting (Phase 4.B) — démo, non systématique.
   Equivaut à :
     .dlv-card { ... }
     .dlv-card .dlv-name { ... }
     .dlv-card:focus-within { ... }
*/
.dlv-card{
  & .dlv-name{transition:color var(--t-fast) var(--ease)}
  &:focus-within{box-shadow:0 0 0 2px var(--accd)}
}

/* ── 16. Print : masque chrome (Phase 4.B) ──
   Pour le cas print-from-app : factures et étiquettes utilisent déjà leur
   propre @page interne, mais si l'utilisateur fait Cmd-P depuis l'app,
   on cache la nav, le FAB et les toasts pour ne laisser
   que le contenu. */
@media print{
  .bnav,.toast,.flash-ok,.mover,.payover,.hdr-menu-wrap,#hdr-refresh-btn,#hdr-unpaid-alert{display:none!important}
  body{background:#fff!important;color:#000!important;overflow:visible!important}
  html,body,.scroll{height:auto!important;overflow:visible!important}
  header{box-shadow:none!important;border-bottom:1px solid #ccc!important}
  .card,.dlv-card,.empty-st{box-shadow:none!important;break-inside:avoid}
  *{print-color-adjust:exact;-webkit-print-color-adjust:exact}
}

/* ════════════════════════════════════════════════════════════════════════
   REFONTE MOCKUP-IMPL v2 — primitives CSS (1:1 specs/pucace-{card,screens}-mockup.html)
   Append-only : ces règles arrivent APRÈS toute déclaration legacy donc
   gagnent dans la cascade pour les sélecteurs partagés (.card, .modal, .btn,
   .fab). Les anciennes règles continuent de servir aux composants pré-mockup
   (deliveryCard old, etc.) tant que leur HTML n'est pas migré.
   ════════════════════════════════════════════════════════════════════════ */

/* ── Screen wrapper + page-title bar ── */
.screen { background: var(--bg); color: var(--txt); padding: 0; min-height: 600px; }
.screen-pad { padding: 16px; }
.page-title { display: flex; align-items: center; justify-content: space-between; padding: 14px 16px 6px; background: var(--bg); }
.page-title-l { display: flex; align-items: center; gap: 10px; }
.page-title-h1 { font-family:var(--font-display); font-weight: 500; font-size: 1.4rem; color: var(--txt); margin: 0; letter-spacing: -0.025em; line-height: 1; }
.page-title-sub { font-size: 0.72rem; color: var(--txt2); margin-top: 2px; font-style: italic; }
.page-title-r { display: flex; gap: 6px; }

/* ── Header v2 ── */
.hdr { display: flex; align-items: center; justify-content: space-between; background: var(--surf); border-bottom: 1px solid var(--bdr); padding: 10px 14px; position: relative; box-shadow: 0 1px 0 rgba(0,0,0,0.02); }
.hdr-l { display: flex; align-items: center; gap: 10px; }
.hdr-logo {
  width: 32px; height: 32px; border-radius: 8px;
  object-fit: contain;
  background: var(--surf2);
  box-shadow: inset 0 1px 0 rgba(255,255,255,0.3);
  flex-shrink: 0;
}
.hdr-brand { font-family:var(--font-display); font-weight: 500; font-size: 1.05rem; color: var(--txt); letter-spacing: -0.02em; }
.hdr-week { background: var(--surf2); border: 1px solid var(--bdr); padding: 2px 9px; border-radius: 999px; font-size: 0.65rem; font-weight: 600; color: var(--txt2); text-transform: uppercase; letter-spacing: 0.05em; }
.hdr-r { display: flex; align-items: center; gap: 6px; }
.hdr-btn { width: 36px; height: 36px; border-radius: 50%; background: var(--surf2); border: 1px solid var(--bdr); display: flex; align-items: center; justify-content: center; color: var(--txt2); cursor: pointer; position: relative; transition: all 120ms ease; }
.hdr-btn:hover { background: var(--surf3); color: var(--txt); }
.hdr-btn svg { width: 16px; height: 16px; }
.hdr-btn .badge { position: absolute; top: -4px; right: -4px; background: var(--rose); color: white; min-width: 18px; height: 18px; padding: 0 5px; border-radius: 999px; font-size: 0.65rem; font-weight: 700; display: flex; align-items: center; justify-content: center; border: 2px solid var(--surf); }

/* ── Bottom nav v2 ── */
.nav { display: flex; background: var(--surf); border-top: 1px solid var(--bdr); padding: 8px 4px; gap: 2px; box-shadow: 0 -2px 8px rgba(0,0,0,0.04); }
.nav-item { flex: 1; display: flex; flex-direction: column; align-items: center; gap: 3px; padding: 8px 4px; cursor: pointer; color: var(--txt3); text-decoration: none; border-radius: 8px; transition: all 120ms ease; }
.nav-item svg { width: 20px; height: 20px; }
.nav-item span { font-size: 0.62rem; font-weight: 600; text-transform: uppercase; letter-spacing: 0.04em; }
.nav-item:hover { background: var(--surf2); color: var(--txt2); }
.nav-item.active { color: var(--acc); }
.nav-item.active svg { color: var(--acc); }

/* ── Block titles ── */
.block { margin-top: 18px; }
.block-head { display: flex; align-items: baseline; justify-content: space-between; margin-bottom: 10px; }
.block-title { font-family:var(--font-display); font-weight: 500; font-size: 1.05rem; color: var(--txt); margin: 0; letter-spacing: -0.02em; }
.block-link { font-size: 0.72rem; color: var(--acc); font-weight: 600; cursor: pointer; }

/* ── Section-head + alert-icon (vue Livraisons) ── */
.section-head { display: flex; align-items: baseline; justify-content: space-between; margin: 18px 0 10px; }
.section-head h2 { font-family:var(--font-display); font-weight: 500; font-size: 1.05rem; margin: 0; letter-spacing: -0.02em; }
.section-head .meta { font-size: 0.7rem; color: var(--txt3); font-weight: 500; }
.alert-icon { display: inline-flex; align-items: center; gap: 6px; color: var(--rose-deep); font-weight: 500; }

/* ── KPI cards ── */
.kpi-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 10px; }
.kpi { background: var(--surf); border: 1px solid var(--bdr); border-radius: 12px; padding: 14px; position: relative; overflow: hidden; }
.kpi-lbl { font-size: 0.7rem; color: var(--txt3); text-transform: uppercase; letter-spacing: 0.05em; font-weight: 600; }
.kpi-val { font-family:var(--font-display); font-weight: 500; font-size: 1.7rem; color: var(--txt); letter-spacing: -0.03em; margin-top: 4px; font-variant-numeric: tabular-nums; line-height: 1.1; }
.kpi-val .unit { font-size: 0.85rem; color: var(--txt2); font-weight: 400; }
.kpi-trend { display: inline-flex; align-items: center; gap: 3px; margin-top: 6px; font-size: 0.7rem; font-weight: 600; }
.kpi-trend.up { color: var(--green); }
.kpi-trend.down { color: var(--rose); }
.kpi-icon { position: absolute; top: 12px; right: 12px; width: 28px; height: 28px; border-radius: 8px; background: var(--acc-tint); color: var(--acc); display: flex; align-items: center; justify-content: center; }
.kpi-icon svg { width: 14px; height: 14px; }

/* ── Stock card ── */
.stock-card { background: var(--surf); border: 1px solid var(--bdr); border-radius: 12px; padding: 14px; margin-bottom: 10px; }
.stock-head { display: flex; justify-content: space-between; align-items: baseline; margin-bottom: 10px; }
.stock-title { font-family:var(--font-display); font-weight: 500; font-size: 0.95rem; color: var(--txt); }
.stock-meta { font-size: 0.7rem; color: var(--txt3); font-weight: 500; }
.progress-track { background: var(--surf2); height: 8px; border-radius: 999px; overflow: hidden; }
.progress-fill { background: linear-gradient(90deg, var(--acc), #F59E0B); height: 100%; border-radius: 999px; box-shadow: inset 0 1px 0 rgba(255,255,255,0.2); }
.stock-foot { display: flex; gap: 14px; margin-top: 10px; font-size: 0.72rem; }
.stock-foot div span { color: var(--txt3); }
.stock-foot div b { color: var(--txt); font-weight: 600; }

/* ── List (top clients, à relancer) ── */
.list { background: var(--surf); border: 1px solid var(--bdr); border-radius: 12px; overflow: hidden; }
.list-row { display: flex; align-items: center; gap: 10px; padding: 10px 14px; border-bottom: 1px solid var(--bdr); }
.list-row:last-child { border-bottom: none; }
.list-avatar { width: 32px; height: 32px; border-radius: 50%; background: var(--surf2); border: 1px solid var(--bdr); display: flex; align-items: center; justify-content: center; font-family:var(--font-text); font-weight: 600; font-size: 0.8rem; color: var(--txt2); flex-shrink: 0; }
.list-avatar.gold { background: var(--amber-bg); color: var(--amber-deep); border-color: var(--amber-bdr); }
.list-avatar.silver { background: var(--slate-bg); color: var(--slate-deep); border-color: var(--slate-bdr); }
.list-avatar.bronze { background: var(--pho-bg); color: var(--pho-lbl); border-color: var(--pho-bdr); }
.list-info { flex: 1; min-width: 0; }
.list-name { font-family:var(--font-display); font-weight: 500; font-size: 0.95rem; color: var(--txt); line-height: 1.2; letter-spacing: -0.01em; }
.list-sub { font-size: 0.72rem; color: var(--txt3); margin-top: 2px; }
.list-amount { font-family:var(--font-display); font-weight: 500; font-size: 1rem; color: var(--txt); font-variant-numeric: tabular-nums; letter-spacing: -0.02em; }
.list-amount-sub { font-size: 0.68rem; color: var(--txt3); text-align: right; margin-top: 2px; font-weight: 500; }

/* ── Stamps tampons (encreurs, rotation, double border) ── */
.stamp { font-family:var(--font-display); font-weight: 500; font-size: 0.62rem; text-transform: uppercase; letter-spacing: 0.06em; padding: 3px 9px; border-radius: 4px; border: 1.5px solid; opacity: 0.92; box-shadow: inset 1px 1px 0 rgba(255,255,255,0.4), 1px 1px 0 rgba(0,0,0,0.05); display: inline-flex; align-items: center; gap: 4px; }
body.dark .stamp { box-shadow: inset 1px 1px 0 rgba(255,255,255,0.06), 1px 1px 0 rgba(0,0,0,0.3); }
.stamp svg { width: 11px; height: 11px; }
.stamp.cash { background: var(--green-bg); border-color: var(--green-bdr); color: var(--green-deep); transform: rotate(-1.2deg); }
.stamp.twint { background: var(--amber-bg); border-color: var(--amber-bdr); color: var(--amber-deep); transform: rotate(-1.2deg); }
.stamp.later { background: var(--slate-bg); border-color: var(--slate-bdr); color: var(--slate-deep); transform: rotate(-1.2deg); }
.stamp.impaye { background: var(--rose-bg); border-color: var(--rose-bdr); color: var(--rose-deep); transform: rotate(-1.4deg); }
.stamp.user { background: var(--surf2); border-color: var(--bdr2); color: var(--txt2); transform: rotate(0.5deg); }
.stamp.kg { background: var(--surf2); border-color: var(--bdr2); color: var(--txt2); transform: rotate(-0.5deg); }
.stamp.partial { background: var(--amber-bg); border-color: var(--amber-bdr); color: var(--amber-deep); transform: rotate(-1.2deg); }
.stamp.lot { background: var(--purple-bg); border-color: var(--purple-bdr); color: var(--purple-deep); transform: rotate(0.6deg); }
.stamp.vip { background: var(--amber-bg); border-color: var(--amber-bdr); color: var(--amber-deep); transform: rotate(-0.8deg); }
.stamp.dorm { background: var(--slate-bg); border-color: var(--slate-bdr); color: var(--slate-deep); transform: rotate(-0.4deg); }

/* ── Pills statut (pas de rotation) ── */
.pill { display: inline-flex; align-items: center; gap: 5px; font-family:var(--font-text); font-weight: 600; font-size: 0.62rem; text-transform: uppercase; letter-spacing: 0.05em; padding: 4px 10px; border-radius: 999px; border: 1px solid; }
.pill.active { background: var(--green-bg); color: var(--green-deep); border-color: var(--green-bdr); }
.pill.deposited { background: var(--amber-bg); color: var(--amber-deep); border-color: var(--amber-bdr); }
.pill.postponed { background: var(--rose-bg); color: var(--rose-deep); border-color: var(--rose-bdr); }
.pill.green { background: var(--green-bg); color: var(--green-deep); border-color: var(--green-bdr); }
.pill.amber { background: var(--amber-bg); color: var(--amber-deep); border-color: var(--amber-bdr); }
.pill.rose { background: var(--rose-bg); color: var(--rose-deep); border-color: var(--rose-bdr); }
.pill.purple { background: var(--purple-bg); color: var(--purple-deep); border-color: var(--purple-bdr); }
.pill.neu { background: var(--surf2); color: var(--txt2); border-color: var(--bdr); }
.pill .dot { width: 6px; height: 6px; border-radius: 50%; background: currentColor; }

/* ── Day chips (Planifier) ── */
.day-row { display: flex; gap: 6px; margin-bottom: 14px; overflow-x: auto; padding-bottom: 4px; }
.day-chip { flex-shrink: 0; padding: 8px 12px; border-radius: 10px; background: var(--surf2); border: 1px solid var(--bdr); font-family:var(--font-text); font-weight: 600; font-size: 0.72rem; color: var(--txt2); cursor: pointer; text-align: center; min-width: 56px; transition: all 120ms ease; }
.day-chip-d { font-family:var(--font-display); font-weight: 500; font-size: 0.95rem; color: var(--txt); display: block; line-height: 1; letter-spacing: -0.02em; }
.day-chip:hover { background: var(--surf3); }
.day-chip.active { background: var(--acc); color: white; border-color: var(--acc); box-shadow: 0 4px 12px var(--acc-glow); }
.day-chip.active .day-chip-d { color: white; }

/* ── Form / inputs v2 ── */
.input-row { display: flex; flex-direction: column; gap: 6px; margin-bottom: 14px; }
.input-row label { font-size: 0.72rem; font-weight: 600; color: var(--txt2); text-transform: uppercase; letter-spacing: 0.05em; }
.input-row .input, .input-row .select, .input, .select { width: 100%; height: 42px; padding: 0 12px; background: var(--surf); border: 1.5px solid var(--bdr); border-radius: 10px; color: var(--txt); font-family:var(--font-text); font-size: 1rem; transition: all 120ms ease; } /* CSS-10: 1rem = pas de zoom auto iOS au focus */
.input:focus, .select:focus { outline: none; border-color: var(--acc); box-shadow: 0 0 0 4px var(--acc-glow); }
.input::placeholder { color: var(--txt3); }
.field-help { font-size: 0.68rem; color: var(--txt3); margin-top: 2px; font-style: italic; }

/* ── Buttons v2 ── */
.btn { display: inline-flex; align-items: center; justify-content: center; gap: 8px; height: 44px; padding: 0 18px; border-radius: 10px; font-family:var(--font-text); font-weight: 600; font-size: 0.85rem; cursor: pointer; border: none; transition: all 120ms ease; }
.btn svg { width: 16px; height: 16px; }
.btn-primary { background: linear-gradient(180deg, rgba(255,255,255,0.10), transparent), var(--acc); color: white; box-shadow: 0 2px 8px var(--acc-glow); }
.btn-primary:hover { box-shadow: 0 4px 16px var(--acc-glow); transform: translateY(-1px); }
.btn-secondary { background: var(--surf); color: var(--txt); border: 1.5px solid var(--bdr); }
.btn-secondary:hover { background: var(--surf2); border-color: var(--bdr2); }
.btn-ghost { background: transparent; color: var(--txt2); border: 1px solid var(--bdr); }
.btn-icon { width: 38px; padding: 0; }
.btn-block { width: 100%; }

/* ── Modal v2 ── */
.modal-host { position: relative; min-height: 600px; background: var(--bg); padding: 0; overflow: hidden; }
.scrim { background: rgba(0,0,0,0.55); position: absolute; inset: 0; backdrop-filter: blur(4px); }
.modal { position: absolute; left: 50%; top: 50%; transform: translate(-50%, -50%); background: var(--surf); border: 1px solid var(--bdr); border-radius: 16px; padding: 20px; width: calc(100% - 32px); max-width: 380px; box-shadow: 0 16px 48px rgba(0,0,0,0.4); animation: modal-pop-in 220ms cubic-bezier(0.2, 0, 0.2, 1); }
/* CSS-7 : restaure le comportement bottom-sheet pour les modales affichées dans
   .mover. La règle .modal v2 ci-dessus (position:absolute, max-width 380px, SANS
   max-height/overflow) écrasait la legacy → les formulaires longs (m-user-edit,
   m-cli, historique) débordaient hors viewport (surtout clavier iOS). .mover .modal
   (spécificité 0,2,0) regagne quel que soit l'ordre source. */
.mover .modal { position: static; left: auto; top: auto; transform: none; width: 100%; max-width: 600px; max-height: 92vh; overflow-y: auto; border-radius: 14px 14px 0 0; animation: su .28s var(--ease); }
@keyframes modal-pop-in {
  from { opacity: 0; transform: translate(-50%, -50%) scale(0.96); }
  to   { opacity: 1; transform: translate(-50%, -50%) scale(1); }
}
.modal-title { font-family:var(--font-display); font-weight: 500; font-size: 1.15rem; color: var(--txt); margin: 0 0 14px; letter-spacing: -0.02em; display: flex; align-items: center; gap: 8px; }
.modal-title svg { width: 18px; height: 18px; color: var(--acc); }
.modal-foot { display: flex; gap: 8px; margin-top: 18px; }
.modal-foot .btn { flex: 1; }

.radio-grid { display: grid; grid-template-columns: 1fr 1fr 1fr; gap: 8px; }
.radio-card { padding: 12px 8px; border: 1.5px solid var(--bdr); border-radius: 10px; background: var(--surf); cursor: pointer; text-align: center; display: flex; flex-direction: column; align-items: center; gap: 6px; transition: all 120ms ease; }
.radio-card svg { width: 18px; height: 18px; color: var(--txt2); }
.radio-card .lbl { font-family:var(--font-text); font-weight: 600; font-size: 0.72rem; color: var(--txt2); text-transform: uppercase; letter-spacing: 0.04em; }
.radio-card.cash { border-color: var(--green-bdr); background: var(--green-bg); }
.radio-card.cash svg, .radio-card.cash .lbl { color: var(--green-deep); }
/* Twint est indigo partout ailleurs (badge .b-twint, récap de tournée) ;
   l'ambre est réservé à l'alerte. */
.radio-card.twint { border-color: var(--indigo-bdr); background: var(--indigo-bg); }
.radio-card.twint svg, .radio-card.twint .lbl { color: var(--indigo-deep); }
.radio-card.later { border-color: var(--slate-bdr); background: var(--slate-bg); }
.radio-card.later svg, .radio-card.later .lbl { color: var(--slate-deep); }
.radio-card.selected { box-shadow: 0 0 0 3px var(--acc-glow); border-color: var(--acc); }

.radio-inline { display: flex; gap: 6px; flex-wrap: wrap; }
.radio-inline label { flex: 1 1 calc(50% - 3px); padding: 8px 10px; border: 1.5px solid var(--bdr); border-radius: 10px; background: var(--surf); color: var(--txt2); font-size: 0.78rem; font-weight: 500; display: flex; align-items: center; gap: 6px; cursor: pointer; }
.radio-inline label.selected { background: var(--acc-tint); color: var(--acc-deep); border-color: var(--acc); }
.radio-inline label svg { width: 14px; height: 14px; }

/* ── Login v2 ── */
.login { min-height: 600px; background: var(--bg); display: flex; align-items: center; justify-content: center; padding: 24px; }
/* Dans la zone visible, clavier compris : la carte se centre s’il y a la place, défile sinon (margin:auto, pas align-items). */
#loginsc{min-height:0;height:calc(var(--vvh,100%) - var(--env-height,0px));overflow-y:auto;align-items:flex-start;padding-top:calc(24px + env(safe-area-inset-top));padding-bottom:calc(24px + env(safe-area-inset-bottom))}
#loginsc .login-card{margin:auto}
.login-card { background: var(--surf); border: 1px solid var(--bdr); border-radius: 16px; padding: 32px 24px; width: 100%; max-width: 340px; box-shadow: 0 16px 48px rgba(0,0,0,0.08); }
body.dark .login-card { box-shadow: 0 16px 48px rgba(0,0,0,0.4); }
.login-logo {
  display: block;
  width: 96px; height: 96px;
  border-radius: 22px;
  margin: 0 auto 18px;
  object-fit: contain;
  background: var(--surf);
  box-shadow: 0 8px 28px rgba(217,119,6,0.25), inset 0 1px 0 rgba(255,255,255,0.3);
}
.login-title { font-family:var(--font-display); font-weight: 500; font-size: 1.5rem; color: var(--txt); text-align: center; margin: 0 0 4px; letter-spacing: -0.02em; }
.login-sub { color: var(--txt3); font-size: 0.78rem; text-align: center; margin: 0 0 24px; }

/* ── Empty state v2 ── */
.empty { background: var(--bg); padding: 60px 24px; text-align: center; min-height: 400px; display: flex; flex-direction: column; align-items: center; justify-content: center; }
.empty-icon { width: 72px; height: 72px; border-radius: 50%; margin: 0 auto 16px; background: var(--surf2); border: 1px solid var(--bdr); display: flex; align-items: center; justify-content: center; color: var(--txt3); }
.empty-icon svg { width: 32px; height: 32px; }
.empty-title { font-family:var(--font-display); font-weight: 500; font-size: 1.2rem; color: var(--txt); margin: 0 0 6px; letter-spacing: -0.02em; }
.empty-desc { font-size: 0.85rem; color: var(--txt2); max-width: 280px; margin: 0 auto 18px; line-height: 1.5; }

/* ── Plan client row ── */
.plan-row { display: flex; align-items: center; gap: 10px; padding: 10px 12px; background: var(--surf); border: 1px solid var(--bdr); border-radius: 10px; margin-bottom: 6px; }
.plan-row.checked { background: var(--acc-tint); border-color: var(--acc); }
.checkbox { width: 22px; height: 22px; border-radius: 6px; background: var(--surf); border: 2px solid var(--bdr2); display: flex; align-items: center; justify-content: center; flex-shrink: 0; }
.plan-row.checked .checkbox { background: var(--acc); border-color: var(--acc); color: white; }
.checkbox svg { width: 14px; height: 14px; opacity: 0; }
.plan-row.checked .checkbox svg { opacity: 1; }
.plan-info { flex: 1; min-width: 0; }
/* Bouton natif pour le clavier (F16) : couvre la hauteur de la ligne, sans habillage. */
button.plan-info { align-self: stretch; margin: -10px 0; padding: 10px 0; display: flex; flex-direction: column; justify-content: center; background: none; border: 0; font: inherit; color: inherit; text-align: left; }
.plan-name { font-family:var(--font-display); font-weight: 500; font-size: 0.92rem; color: var(--txt); letter-spacing: -0.01em; }
.plan-meta { font-size: 0.68rem; color: var(--txt3); margin-top: 2px; }
.plan-kg-input { width: 60px; height: 32px; padding: 0 8px; background: var(--surf); border: 1.5px solid var(--bdr); border-radius: 8px; color: var(--txt); font-family:var(--font-text); font-weight: 600; font-size: 0.78rem; text-align: center; font-variant-numeric: tabular-nums; }
.plan-row.checked .plan-kg-input { border-color: var(--acc); }

/* ── Settings sections ── */
.settings-section { background: var(--surf); border: 1px solid var(--bdr); border-radius: 12px; margin-bottom: 10px; overflow: hidden; }
.settings-head { display: flex; align-items: center; gap: 10px; padding: 14px; cursor: pointer; }
.settings-icon { width: 32px; height: 32px; border-radius: 8px; background: var(--acc-tint); color: var(--acc); display: flex; align-items: center; justify-content: center; flex-shrink: 0; }
.settings-icon svg { width: 16px; height: 16px; }
.settings-title { font-family:var(--font-display); font-weight: 500; font-size: 0.95rem; color: var(--txt); flex: 1; letter-spacing: -0.01em; }
.settings-sub { font-size: 0.7rem; color: var(--txt3); margin-top: 1px; font-weight: 500; }
.settings-chev { color: var(--txt3); }
.settings-chev svg { width: 16px; height: 16px; }
.settings-body { padding: 0 14px 14px; border-top: 1px solid var(--bdr); padding-top: 14px; }
.toggle { width: 38px; height: 22px; background: var(--bdr2); border-radius: 999px; position: relative; cursor: pointer; flex-shrink: 0; transition: background 200ms ease; }
.toggle::after { content: ''; position: absolute; top: 2px; left: 2px; width: 18px; height: 18px; background: white; border-radius: 50%; box-shadow: 0 1px 3px rgba(0,0,0,0.2); transition: transform 200ms ease; }
.toggle.on { background: var(--acc); }
.toggle.on::after { transform: translateX(16px); }

/* ── Search bar v2 ── */
.search { display: flex; align-items: center; gap: 8px; background: var(--surf); border: 1.5px solid var(--bdr); border-radius: 12px; padding: 0 12px; height: 44px; margin-bottom: 14px; }
.search svg { color: var(--txt3); flex-shrink: 0; }
.search input { flex: 1; height: 100%; background: transparent; border: none; color: var(--txt); font-size: 0.9rem; outline: none; }
.search input::placeholder { color: var(--txt3); }

/* ── Nom de client, bouton icône v2 ── */
.client-name { font-family:var(--font-display); font-weight: 500; font-size: 0.95rem; color: var(--txt); letter-spacing: -0.01em; }
.ico-btn { width: 32px; height: 32px; border-radius: 8px; background: var(--surf2); border: 1px solid var(--bdr); display: flex; align-items: center; justify-content: center; cursor: pointer; color: var(--txt2); }
.ico-btn svg { width: 14px; height: 14px; }

/* ── Tabs (pill style v2) ── */
.tabs { display: flex; gap: 6px; padding: 0 16px 10px; background: var(--bg); }
.tab { padding: 8px 14px; background: var(--surf); border: 1.5px solid var(--bdr); border-radius: 999px; font-family:var(--font-text); font-weight: 600; font-size: 0.72rem; color: var(--txt2); cursor: pointer; display: inline-flex; align-items: center; gap: 6px; text-transform: uppercase; letter-spacing: 0.05em; }
.tab .count { background: var(--surf2); color: var(--txt2); padding: 1px 7px; border-radius: 999px; font-size: 0.65rem; font-weight: 700; }
.tab.active { background: var(--acc-tint); border-color: var(--acc); color: var(--acc-deep); }
.tab.active .count { background: var(--acc); color: white; }

/* ── Total bar (Planifier) ── */
.total-bar { background: var(--surf); border: 1px solid var(--bdr); border-radius: 12px; padding: 14px; margin-top: 12px; display: flex; justify-content: space-between; align-items: center; }
.total-l { font-family:var(--font-text); font-size: 0.78rem; color: var(--txt2); font-weight: 500; }
.total-r { font-family:var(--font-display); font-weight: 500; font-size: 1.4rem; color: var(--acc); letter-spacing: -0.02em; font-variant-numeric: tabular-nums; }

/* ════════════════════════════════════════════════════════════════════════
   Card livraison v2 — copie 1:1 de pucace-card-mockup.html
   .card override l'ancien .card legacy (cascade order, append after)
   ════════════════════════════════════════════════════════════════════════ */
.card { background: var(--surf); border: 1px solid var(--bdr); border-left: 5px solid var(--green); border-radius: 12px; padding: 16px; box-shadow: 0 1px 2px rgba(0,0,0,0.04), 0 4px 8px rgba(0,0,0,0.04); margin-bottom: 16px; position: relative; }
body.dark .card { box-shadow: 0 1px 2px rgba(0,0,0,0.4), 0 4px 12px rgba(0,0,0,0.3); }

/* C3 — Vue carte tournée (Leaflet local) */
/* Markers DivIcon : cercle 32×32 numéroté + border 3px couleur statut */
.tour-marker-wrap { background: transparent !important; border: none !important; }
.tour-marker {
  width: 32px; height: 32px; border-radius: 50%;
  background: var(--surf);
  border: 3px solid var(--status-color, var(--green));
  display: flex; align-items: center; justify-content: center;
  font-family:var(--font-display); font-weight: 600; font-size: 0.85rem;
  color: var(--txt);
  box-shadow: 0 2px 8px rgba(0,0,0,0.25);
}
/* Map container : pas de tile basemap (CSP imgSrc 'self' bloque OSM externe).
   Fond hatched neutre = donne un repère visuel sans tiles. */
#tour-map {
  background:
    repeating-linear-gradient(45deg, transparent, transparent 8px, rgba(0,0,0,0.03) 8px, rgba(0,0,0,0.03) 9px),
    var(--surf2);
}
[data-theme=dark] #tour-map,
body.dark #tour-map {
  background:
    repeating-linear-gradient(45deg, transparent, transparent 8px, rgba(255,255,255,0.025) 8px, rgba(255,255,255,0.025) 9px),
    var(--surf2);
}
/* Leaflet popup : remplace le style par défaut Leaflet par tokens mockup */
.leaflet-popup-content-wrapper {
  background: var(--surf) !important;
  color: var(--txt) !important;
  border: 1px solid var(--bdr);
  border-radius: 12px !important;
  box-shadow: 0 8px 24px rgba(0,0,0,0.18) !important;
}
.leaflet-popup-tip { background: var(--surf) !important; }
.leaflet-popup-content { margin: 12px 14px !important; }
/* Toggle Liste/Carte — réutilise .tab existant, juste ajustement icon */
.tour-view-btn svg { stroke-width: 2; }


/* ════════════════════════════════════════════════
   DASHBOARD REFONTE 2026-05-09
   Bénéfice hero + Tendance + Stock + Prochaines + Relance + KPIs
   ════════════════════════════════════════════════ */

.screen-pad { padding: 16px; }

/* Bénéfice HERO (vert saturé, premier plan) */
.benef-hero {
  background: linear-gradient(180deg, var(--green-bg), var(--surf));
  border: 1px solid var(--green-bdr);
  border-left: 5px solid var(--green);
  border-radius: 14px;
  padding: 20px 22px;
  margin-bottom: 6px;
  box-shadow: 0 1px 2px rgba(0,0,0,0.04), 0 4px 12px rgba(22,163,74,0.08);
}
body.dark .benef-hero {
  box-shadow: 0 1px 2px rgba(0,0,0,0.3), 0 4px 16px rgba(34,197,94,0.12);
}

.benef-lbl {
  font-size: 0.7rem;
  color: var(--green-deep);
  text-transform: uppercase;
  letter-spacing: 0.06em;
  font-weight: 600;
  margin-bottom: 6px;
  opacity: 0.85;
}

.benef-amt {
  font-family:var(--font-display);
  font-weight: 500;
  font-size: 2.4rem;
  letter-spacing: -0.04em;
  line-height: 1;
  font-variant-numeric: tabular-nums;
  margin-bottom: 6px;
}
.benef-amt.pos { color: var(--green-deep); }
.benef-amt.neg { color: var(--rose-deep); }
.benef-amt.neutral { color: var(--txt); }
.benef-amt em {
  opacity: 0.55;
  font-style: normal;
  font-weight: 400;
}
.benef-amt .benef-unit {
  font-size: 1rem;
  font-weight: 400;
  opacity: 0.6;
  margin-left: 2px;
  letter-spacing: -0.02em;
}

.benef-sub {
  font-size: 0.78rem;
  color: var(--green-deep);
  font-weight: 500;
  opacity: 0.85;
}

/* Next-card (prochaines livraisons compactes) */
.next-card {
  background: var(--surf);
  border: 1px solid var(--bdr);
  border-radius: 10px;
  padding: 12px 14px;
  margin-bottom: 8px;
  display: flex;
  gap: 12px;
  align-items: center;
  cursor: pointer;
  transition: all 120ms ease;
}
.next-card:hover {
  border-color: var(--bdr2);
  transform: translateY(-1px);
  box-shadow: 0 2px 8px rgba(0,0,0,0.04);
}
.next-info { flex: 1; min-width: 0; }
.next-name {
  font-family:var(--font-display);
  font-weight: 500;
  font-size: 0.95rem;
  color: var(--txt);
  letter-spacing: -0.01em;
  margin-bottom: 3px;
  line-height: 1.2;
}
.next-meta {
  display: flex;
  gap: 10px;
  font-size: 0.72rem;
  color: var(--txt3);
  flex-wrap: wrap;
}
.next-meta span {
  display: inline-flex;
  align-items: center;
  gap: 4px;
}
.next-meta svg {
  width: 11px;
  height: 11px;
  flex-shrink: 0;
}
.next-tag-pickup {
  color: var(--indigo-deep);
  font-weight: 500;
}
.next-amount {
  text-align: right;
  flex-shrink: 0;
}
.next-chf {
  font-family:var(--font-display);
  font-weight: 500;
  font-size: 1rem;
  color: var(--txt);
  letter-spacing: -0.02em;
  font-variant-numeric: tabular-nums;
}
.next-kg {
  font-size: 0.7rem;
  color: var(--txt3);
  margin-top: 1px;
  font-weight: 500;
}
.next-more {
  text-align: center;
  padding: 10px;
  font-size: 0.78rem;
  color: var(--txt2);
  display: flex;
  align-items: center;
  justify-content: center;
  gap: 6px;
  cursor: pointer;
}
.next-more svg { width: 12px; height: 12px; }

/* Stock card footer */
.stock-foot {
  display: flex;
  gap: 14px;
  margin-top: 10px;
  font-size: 0.72rem;
  flex-wrap: wrap;
}
.stock-foot div span { color: var(--txt3); }
.stock-foot div b { color: var(--txt); font-weight: 600; }

/* Trend card (Tendance) */
.trend-card {
  background: var(--surf);
  border: 1px solid var(--bdr);
  border-radius: 12px;
  padding: 12px 14px;
}

/* KPI val unit */
.kpi-val .unit {
  font-size: 0.85rem;
  color: var(--txt2);
  font-weight: 400;
}

/* Stabs (period buttons Tendance) */
.stabs {
  display: flex;
  gap: 4px;
}
.stabs .stab {
  font-family:var(--font-text);
  font-weight: 600;
  font-size: 0.62rem;
  text-transform: uppercase;
  letter-spacing: 0.05em;
  padding: 5px 10px;
  border-radius: 6px;
  background: var(--surf2);
  color: var(--txt2);
  border: 1px solid var(--bdr);
  cursor: pointer;
  transition: all 120ms ease;
}
.stabs .stab:hover {
  background: var(--surf3);
  color: var(--txt);
}
.stabs .stab.sel {
  background: var(--acc-tint);
  color: var(--acc-deep);
  border-color: var(--acc);
}

/* List amount sub */
.list-amount-sub {
  font-size: 0.68rem;
  color: var(--txt3);
  text-align: right;
  margin-top: 2px;
  font-weight: 500;
}

/* List sub (under list-name) */
.list-sub {
  font-size: 0.72rem;
  color: var(--txt3);
  margin-top: 2px;
}

/* KPI icon (decorative cube top-right) */
.kpi-icon {
  position: absolute;
  top: 12px;
  right: 12px;
  width: 28px;
  height: 28px;
  border-radius: 8px;
  background: var(--acc-tint);
  color: var(--acc);
  display: flex;
  align-items: center;
  justify-content: center;
}
.kpi-icon svg {
  width: 14px;
  height: 14px;
}

.kpi-link { cursor: pointer; transition: all 120ms ease; }
.kpi-link:hover {
  border-color: var(--acc);
  box-shadow: 0 0 0 3px var(--acc-glow);
}

.kpi-lbl {
  font-size: 0.7rem;
  color: var(--txt3);
  text-transform: uppercase;
  letter-spacing: 0.05em;
  font-weight: 600;
}
.kpi-val {
  font-family:var(--font-display);
  font-weight: 500;
  font-size: 1.7rem;
  color: var(--txt);
  letter-spacing: -0.03em;
  margin-top: 4px;
  font-variant-numeric: tabular-nums;
  line-height: 1.1;
}

.list-info { flex: 1; min-width: 0; }
.list-amount {
  font-family:var(--font-display);
  font-weight: 500;
  font-size: 1rem;
  color: var(--txt);
  font-variant-numeric: tabular-nums;
  letter-spacing: -0.02em;
}


/* ── Tour map : marker atelier (Diego) + badge nombre de retraits ── */
.tour-marker-wrap-atelier {
  background: transparent;
  border: none;
}
.tour-marker-atelier {
  background: var(--acc);
  color: white;
  border: 3px solid white;
  width: 38px; height: 38px;
  border-radius: 50%;
  display: flex;
  align-items: center;
  justify-content: center;
  box-shadow: 0 4px 12px rgba(217,89,31,0.4), 0 0 0 1px rgba(0,0,0,0.1);
  position: relative;
}
.tour-marker-badge {
  position: absolute;
  top: -6px;
  right: -6px;
  background: var(--rose);
  color: white;
  min-width: 20px;
  height: 20px;
  border-radius: 999px;
  border: 2px solid white;
  font-size: 0.7rem;
  font-weight: 700;
  display: flex;
  align-items: center;
  justify-content: center;
  padding: 0 4px;
  line-height: 1;
}


/* ── Dialog natif .mdialog (m-edel) — match style mockup .modal ── */
dialog.mdialog {
  position: fixed;
  left: 50%; top: 50%;
  transform: translate(-50%, -50%);
  margin: 0;
  background: var(--surf);
  color: var(--txt);
  border: 1px solid var(--bdr);
  border-radius: 16px;
  padding: 20px;
  width: calc(100% - 32px);
  max-width: 420px;
  max-height: 90vh;
  overflow-y: auto;
  box-shadow: 0 16px 48px rgba(0,0,0,0.4);
}
dialog.mdialog::backdrop {
  background: rgba(0, 0, 0, 0.55);
  backdrop-filter: blur(4px);
  -webkit-backdrop-filter: blur(4px);
}
dialog.mdialog:not([open]) { display: none; }
dialog.mdialog[open] {
  display: block;
  animation: mdialog-su 220ms cubic-bezier(0.2, 0, 0.2, 1);
}
@keyframes mdialog-su {
  from { opacity: 0; transform: translate(-50%, -45%); }
  to   { opacity: 1; transform: translate(-50%, -50%); }
}

/* ══════════════════════════════════════════════════
   Feuille de navigation (ex-immersif) — lot 7
   ──────────────────────────────────────────────
   Ce qui RESTE de la vue immersive supprimée : la feuille « Ouvrir avec… »
   (route.js, _showNavSheet) et le CTA « Reprendre la tournée » d’un arrêt
   démarré (deliveries.js, _stopCta). Tout le reste du bloc immersif est parti
   avec l’écran.
   ══════════════════════════════════════════════════ */

.cta.cta-immersive{
  background:linear-gradient(135deg,#4285F4 0%, #1A73E8 100%);
  color:#fff;font-weight:700;
}

/* ── Bottom-sheet choix navigation ── */
.imm-bottom-sheet{
  position:fixed;inset:0;z-index:300;
  display:none;align-items:flex-end;justify-content:center;
}
.imm-bottom-sheet.on{display:flex}
.imm-bottom-sheet-bd{
  position:absolute;inset:0;background:rgba(0,0,0,.45);
  animation:imm-sheet-bd 220ms cubic-bezier(.4,0,.2,1);
}
@keyframes imm-sheet-bd{from{opacity:0}to{opacity:1}}
.imm-bottom-sheet-card{
  position:relative;width:100%;max-width:420px;
  background:var(--surf);border-radius:18px 18px 0 0;
  padding:14px 18px calc(22px + env(safe-area-inset-bottom,0px));
  box-shadow:0 -4px 24px rgba(0,0,0,.18);
  animation:imm-sheet-up 280ms cubic-bezier(.4,0,.2,1);
}
@keyframes imm-sheet-up{
  from{transform:translateY(100%)}to{transform:translateY(0)}
}
.imm-bottom-sheet-handle{
  width:42px;height:4px;border-radius:2px;background:var(--bdr2);
  margin:0 auto 14px;
}
.imm-bottom-sheet-title{
  font-family:var(--font-display);font-weight:500;font-size:1rem;
  color:var(--txt);text-align:center;margin-bottom:14px;
}
.imm-bottom-sheet-actions{display:flex;flex-direction:column;gap:8px}
.imm-nav-opt{
  display:flex;align-items:center;gap:14px;
  padding:14px 16px;border-radius:12px;
  background:var(--surf2);border:1px solid var(--bdr);
  cursor:pointer;transition:all 120ms cubic-bezier(.4,0,.2,1);
  font-family:var(--font-text);font-weight:600;font-size:.95rem;
  color:var(--txt);text-align:left;
}
.imm-nav-opt:hover{background:var(--surf3,var(--surf2));border-color:var(--bdr2)}
.imm-nav-ico{
  width:38px;height:38px;border-radius:9px;
  display:flex;align-items:center;justify-content:center;
  color:#fff;font-family:var(--font-display);font-weight:700;font-size:1.05rem;
  flex-shrink:0;
}

/* ── Cibles tactiles — plancher de 44 px ────────────────────────────────────
   Six controles vivaient a 36 px (.hdr-menu-btn, .al, .qbtn, .start-point-gps,
   .hist-pay-pill, .assignee-pill). Sur un telephone tenu d'une main, en
   deplacement, 36 px se rate. Le design system vise 56 px pour la surface
   mobile ; on pose ici le plancher accessible de 44 px, sans deformer des
   rangees calibrees au pixel pres. */
.hdr-menu-btn,.qbtn,.start-point-gps{min-width:44px;min-height:44px}
.al,.hist-pay-pill,.assignee-pill{min-height:44px}

/* ══ ECRAN AUJOURD'HUI — upgrade du template (2026-09-01) ═══════════════════
   Porte les decisions de la maquette « Aujourd'hui » dans le front en service.
   Aucun geste n'est touche : les memes onclick, les memes fonctions. Ce qui
   change est la HIERARCHIE — ce qu'on lit en premier avant de partir.
   La carte generique (.card, filet vert a gauche, tout empile dedans) est
   abandonnee ici : chaque bloc devient son propre objet, pose sur le papier.
   ══════════════════════════════════════════════════════════════════════════ */

/* Pastille meteo — l'appel Open-Meteo est le seul tiers du front (cf. CSP). */
.today-meteo{display:inline-flex;align-items:center;gap:6px;font-size:.72rem;color:var(--txt2);background:var(--surf2);border:1px solid var(--bdr);border-radius:999px;padding:5px 11px;white-space:nowrap}

/* ── Tournee du jour ─────────────────────────────────────────────────────── */
.tdy-tour{margin-top:14px;padding:13px 14px 12px;background:var(--surf);border:1px solid var(--acc);border-radius:14px;box-shadow:0 1px 2px rgba(36,30,23,.05)}
.tdy-tour-f{margin-top:9px;padding-top:8px;border-top:1px solid var(--bdr);font-size:.7rem;color:var(--txt2)}
.tdy-tour-f + .tdy-tour-f{margin-top:4px;padding-top:0;border-top:0}
.tdy-dim{color:var(--txt3)}
.tdy-tour-empty{margin-top:14px;padding:18px;background:var(--surf2);border:1px solid var(--bdr);border-radius:14px;text-align:center;color:var(--txt3);font-size:.82rem}

/* Le bouton de depart est l'action de l'ecran : il occupe la largeur. */
.tdy-start-wrap{margin-top:12px}
.tdy-start{width:100%;height:auto;min-height:54px;padding:14px;font-family:var(--font-display);font-size:1rem;font-weight:600;letter-spacing:-.01em}

/* ── En-tetes de section ─────────────────────────────────────────────────── */
.tdy-sec{display:flex;align-items:baseline;gap:8px;margin:18px 0 7px}
.tdy-sec > span{flex:1;font-size:.62rem;font-weight:600;letter-spacing:.09em;text-transform:uppercase;color:var(--txt3)}
.tdy-sec > em{font-style:normal;font-size:.62rem;color:var(--txt3)}
.tdy-sub{margin:-3px 0 8px;font-size:.68rem;line-height:1.45;color:var(--txt3)}
.tdy-list{display:flex;flex-direction:column;gap:7px}

/* ── Stock du jour ───────────────────────────────────────────────────────── */
.tdy-stock{display:flex;align-items:center;gap:9px;padding:10px 12px;background:var(--surf);border:1px solid var(--bdr);border-radius:12px}
.tdy-stock.at-risk{background:var(--rose-bg);border-color:var(--rose-bdr)}
.tdy-stock-l{flex:1;min-width:0}
.tdy-stock-t{font-size:.84rem;font-weight:600;letter-spacing:-.01em;color:var(--txt);font-variant-numeric:tabular-nums}
.tdy-stock-s{margin-top:2px;font-size:.66rem;color:var(--txt3)}
.tdy-stock.at-risk .tdy-stock-t{color:var(--rose-deep)}
.tdy-stock.at-risk .tdy-stock-s{color:var(--rose-deep);opacity:.8}

/* ── Clients a relancer ──────────────────────────────────────────────────── */
.tdy-dorm{padding:11px 12px;background:var(--surf);border:1px solid var(--bdr);border-radius:12px}
.tdy-dorm-h{display:flex;align-items:flex-start;gap:10px}
.tdy-dorm-n{flex:1;min-width:0;font-size:.88rem;font-weight:600;letter-spacing:-.01em}
.tdy-dorm-r{flex:0 0 auto;text-align:right}
.tdy-dorm-r b{display:block;font-family:var(--font-display);font-size:1.05rem;font-weight:500;line-height:1;letter-spacing:-.02em;color:var(--amber-deep);font-variant-numeric:tabular-nums}
.tdy-dorm-r span{display:block;margin-top:2px;font-size:.55rem;font-weight:600;letter-spacing:.07em;text-transform:uppercase;color:var(--txt3)}
.tdy-dorm-s{margin-top:3px;font-size:.68rem;color:var(--txt3)}
/* Jauge de rythme : la part sombre est l'attente normale du client,
   la part accent le depassement. C'est le retard SUR SON RYTHME qu'on lit. */
.tdy-gauge{display:flex;gap:2px;height:8px;margin-top:8px}
.tdy-gauge i{flex:1 1 0;border-radius:2px;background:var(--surf3)}
.tdy-gauge i.over{background:var(--amber)}
.tdy-dorm-b{width:100%;margin-top:9px;height:44px;font-size:.74rem;text-decoration:none}

body.dark .tdy-tour,body.dark .tdy-stock,body.dark .tdy-dorm{background:var(--surf)}
/* Le titre du jour et la pastille meteo tiennent sur une ligne : sans cette
   borne, « Mardi 1 Septembre » se coupait en deux des que la meteo repondait. */
/* La date tient sur une ligne : la meteo descend sur la ligne du sous-titre
   plutot que de disputer la largeur au titre (« Mardi 1 Septembre » se coupait
   en deux des que la meteo repondait). */
#sec-today .page-title-h1{line-height:1.12}
.tdy-sub-line{display:flex;align-items:center;flex-wrap:wrap;gap:8px}



/* ══ ECRAN CLIENTS — upgrade du template (2026-09-01) ═══════════════════════
   Le retard sur le rythme propre du client. La ligne elle-même (consigne,
   WhatsApp, Appeler) : bloc « Nouvelle interface · Clients » en fin de fichier.
   ══════════════════════════════════════════════════════════════════════════ */
/* Retard mesure contre le rythme du client, pas contre un seuil fixe. */
.cli-late{display:inline-block;margin-left:6px;padding:2px 7px;border-radius:999px;background:var(--amber-bg);border:1px solid var(--amber-bdr);color:var(--amber-deep);font-size:.58rem;font-weight:700;white-space:nowrap;vertical-align:middle}
/* « Reporter a aujourd'hui » deplace une date : le dire evite de croire que ca
   annule ou que ca livre. */
.liv-late-note{margin:-4px 0 8px;font-size:.66rem;line-height:1.45;color:var(--txt3)}

/* ══ ECRAN PLANIFIER — upgrade du template (2026-09-01) ═════════════════════
   Le lot source n'affichait qu'une phrase (« 12 kg restant »). Il porte
   maintenant la meme jauge en cases de 0,5 kg que l'ecran Lots, et surtout un
   GARDE-FOU : la sur-allocation est refusee a l'ecriture (400), donc l'ecran
   dit le depassement PENDANT la composition et non au moment du Creer.
   ══════════════════════════════════════════════════════════════════════════ */
#ip-lot-hint{margin-top:8px}
.ip-gauge-wrap{display:flex;align-items:stretch;gap:3px}
.ip-gauge{flex:1;min-width:0;display:flex;gap:1px;height:12px;border-radius:5px;overflow:hidden;background:var(--surf3);border:1px solid var(--bdr)}
.ip-gauge i{flex:1 1 0;background:var(--surf3)}
.ip-gauge i.a{background:var(--surf3);box-shadow:inset 0 0 0 99px var(--bdr2)}
.ip-gauge i.i{background:var(--acc)}
.ip-gauge-over{flex:0 0 auto;display:flex;gap:1px;height:12px;border-radius:5px;overflow:hidden;border:1px solid var(--rose)}
.ip-gauge-over i{width:5px;background:var(--rose)}
.ip-leg{display:flex;flex-wrap:wrap;gap:3px 10px;margin-top:6px;font-size:.61rem;color:var(--txt2)}
.ip-leg span{display:inline-flex;align-items:center;gap:4px}
.ip-leg i{width:7px;height:7px;border-radius:2px;background:var(--surf3);border:1px solid var(--bdr);display:block}
.ip-leg i.a{background:var(--bdr2);border-color:var(--bdr2)}
.ip-leg i.i{background:var(--acc);border-color:var(--acc)}
.ip-leg em{font-style:normal;color:var(--txt3)}
.ip-guard{margin-top:8px;padding:8px 10px;border-radius:10px;font-size:.68rem;line-height:1.45}
.ip-guard.ok{background:var(--green-bg);border:1px solid var(--green-bdr);color:var(--green-deep)}
.ip-guard.ko{background:var(--rose-bg);border:1px solid var(--rose-bdr);color:var(--rose-deep);font-weight:600}

/* ── Jauges en mode sombre ──────────────────────────────────────────────────
   Le fond des cases libres (--surf3) est presque celui de la carte en sombre :
   la part restante se confondait avec l'exterieur de la jauge, et on ne lisait
   plus que le rempli. On monte la piste d'un cran (--bdr2). */
body.dark .ip-gauge{background:var(--bdr2)}
body.dark .ip-gauge i{background:var(--bdr2)}
body.dark .ip-gauge i.i{background:var(--acc)}
body.dark .ip-gauge i.a{box-shadow:inset 0 0 0 99px var(--txt3)}
body.dark .tdy-gauge i{background:var(--bdr2)}
body.dark .tdy-gauge i.over{background:var(--amber)}
body.dark .ip-leg i{background:var(--bdr2);border-color:var(--bdr2)}
body.dark .ip-leg i.a{background:var(--txt3);border-color:var(--txt3)}

/* ── Feuille d'encaissement : le montant d'abord ── */
.pay-amount-head{display:flex;align-items:baseline;gap:7px;margin-bottom:6px}
.pay-amount-head label{flex:1;margin:0}
.pay-chips{display:flex;gap:4px}
.pay-chip{min-height:30px;padding:0 9px;border-radius:8px;border:1px solid var(--bdr2);background:var(--surf2);color:var(--txt2);font-size:.66rem;font-weight:600;cursor:pointer}
.pay-chip.solde{border-color:var(--acc);background:var(--acc-tint);color:var(--acc-deep)}
.pay-stepper{display:flex;align-items:stretch;gap:7px}
.pay-step{width:48px;min-height:52px;flex:0 0 auto;border-radius:11px;border:1px solid var(--bdr2);background:var(--surf2);color:var(--txt);font-size:1.15rem;font-weight:600;cursor:pointer}
.pay-amount-wrap{flex:1;min-width:0;position:relative}
.pay-amount-wrap .input{height:52px;padding-right:46px;text-align:right;font-size:1.25rem;font-weight:500}
.pay-cur{position:absolute;right:12px;top:50%;transform:translateY(-50%);font-size:.7rem;font-weight:600;color:var(--txt3);pointer-events:none}
.pay-methods{grid-template-columns:1fr 1fr}
.pay-nomethod{margin-top:8px;padding:9px 11px;border-radius:11px;border:1px dashed var(--bdr2);background:var(--surf2);font-size:.71rem;line-height:1.4;color:var(--txt3)}
.pay-verdict{margin-top:9px;padding:9px 11px;border-radius:10px;font-size:.7rem;line-height:1.45}
.pay-verdict.ok{background:var(--green-bg);border:1px solid var(--green-bdr);color:var(--green-deep)}
.pay-verdict.partial{background:var(--amber-bg);border:1px solid var(--amber-bdr);color:var(--amber-deep)}
.pay-verdict.credit,.pay-verdict.over{background:var(--rose-bg);border:1px solid var(--rose-bdr);color:var(--rose-deep)}
/* Bloqué ≠ désactivé silencieusement : le bouton dit pourquoi il ne part pas. */
.btn.is-blocked{background:var(--surf2);color:var(--txt3);border:1px dashed var(--bdr2);box-shadow:none;cursor:not-allowed}

/* Le bouton annonce ce qu'il va faire, donc son libelle est long et variable
   (« Confirmer · acompte 45.00 CHF »). Les boutons de l'app sont en nowrap :
   sur 390 px de large, celui-ci debordait de l'ecran. Ici, il revient a la
   ligne plutot que d'etre coupe. */
.paysheet .modal-foot{align-items:stretch}
.paysheet .modal-foot .btn{min-width:0;white-space:normal;padding-left:10px;padding-right:10px}
.paysheet #paybtn{flex:1.8}
.paysheet #paybtn-lbl{line-height:1.15}

/* ── Relais de fin de visite ────────────────────────────────────────────────
   Une réussite ne finit plus par un simple toast : résultat de paiement,
   photo/message et prochain arrêt tiennent dans une seule feuille de pouce. */
/* `.modal` sert aussi à un mockup centré plus bas dans la feuille de style
   (left:50% + translate(-50%)). Un <dialog> qui l'héritait finissait donc à
   moitié hors écran après son animation. La feuille native reprend ici sa
   géométrie explicite de bottom-sheet. */
dialog.modal.delivery-handoff{position:fixed;inset:auto 0 0;width:100%;max-width:600px;margin:0 auto;transform:none;padding-bottom:calc(16px + env(safe-area-inset-bottom,0px));max-height:calc(100dvh - 12px);overflow-y:auto}
.handoff-head{display:flex;align-items:flex-start;gap:10px;margin-bottom:12px}
.handoff-check{width:42px;height:42px;flex:0 0 auto;display:flex;align-items:center;justify-content:center;border-radius:50%;background:var(--green-bg);border:1px solid var(--green-bdr);color:var(--green-deep)}
.handoff-check svg{width:21px;height:21px}
.handoff-heading{flex:1;min-width:0}
.handoff-kicker{font-size:.6rem;font-weight:700;letter-spacing:.09em;text-transform:uppercase;color:var(--green-deep)}
.delivery-handoff.is-queued .handoff-check{background:var(--amber-bg);border-color:var(--amber-bdr);color:var(--amber-deep)}
.delivery-handoff.is-queued .handoff-kicker{color:var(--amber-deep)}
.handoff-heading h3{margin:1px 0 0;font-family:var(--font-display);font-size:1.22rem;font-weight:500;letter-spacing:-.02em;line-height:1.15;color:var(--txt)}
.handoff-client{margin-top:2px;font-size:.74rem;color:var(--txt2);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.handoff-close{width:44px;height:44px;flex:0 0 auto;border:1px solid var(--bdr);border-radius:11px;background:var(--surf2);color:var(--txt2);font-size:.9rem;cursor:pointer}
.handoff-outcome{padding:11px 12px;border-radius:11px;background:var(--green-bg);border:1px solid var(--green-bdr);color:var(--green-deep);font-size:.76rem;font-weight:600;line-height:1.45;font-variant-numeric:tabular-nums}
.handoff-outcome.queued{background:var(--amber-bg);border-color:var(--amber-bdr);color:var(--amber-deep)}
.handoff-actions{display:grid;grid-template-columns:1fr 1fr;gap:8px;margin-top:10px}
.handoff-action{min-width:0;min-height:62px;display:flex;align-items:center;gap:9px;padding:9px 10px;border:1px solid var(--bdr2);border-radius:11px;background:var(--surf2);color:var(--txt);text-align:left;cursor:pointer}
.handoff-action>svg{width:21px;height:21px;flex:0 0 auto;color:var(--acc)}
.handoff-action span{min-width:0;display:flex;flex-direction:column}
.handoff-action b{font-size:.76rem;font-weight:650}
.handoff-action small{margin-top:1px;font-size:.59rem;line-height:1.25;color:var(--txt3)}
.handoff-action:disabled{opacity:.58;cursor:not-allowed;border-style:dashed}
.handoff-next{display:flex;flex-direction:column;margin-top:10px;padding:10px 12px;border:1px solid var(--bdr);border-radius:11px;background:var(--surf)}
.handoff-next>span{font-size:.58rem;font-weight:700;letter-spacing:.09em;text-transform:uppercase;color:var(--txt3)}
.handoff-next>strong{margin-top:2px;font-family:var(--font-display);font-size:.96rem;font-weight:500;color:var(--txt);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.handoff-next>small{margin-top:1px;font-size:.65rem;color:var(--txt2);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.handoff-next.is-done{background:var(--green-bg);border-color:var(--green-bdr)}
.handoff-continue{width:100%;min-height:52px;margin-top:10px;display:flex;align-items:center;justify-content:center;gap:7px;font-family:var(--font-display);font-size:.94rem}
.handoff-continue svg{width:17px;height:17px}
.handoff-close:focus-visible,.handoff-action:focus-visible{outline:2px solid var(--acc);outline-offset:2px}

/* ── Messages (boîte de réception WhatsApp) ── */
.wa-banner{margin:0 16px 10px;padding:9px 11px;border-radius:10px;font-size:.72rem;line-height:1.45}
.wa-banner.warn{background:var(--amber-bg);border:1px solid var(--amber-bdr);color:var(--amber-deep)}
.wa-banner.err{background:var(--rose-bg);border:1px solid var(--rose-bdr);color:var(--rose-deep)}
.wa-none{padding:14px 16px;font-size:.74rem;color:var(--txt3)}
.wa-conv{display:block;width:100%;text-align:left;font:inherit;color:inherit;background:var(--surf);border:1px solid var(--bdr);border-left:3px solid transparent;border-radius:12px;padding:11px 13px;margin:0 16px 8px;width:calc(100% - 32px);cursor:pointer}
.wa-conv.unread{border-left-color:var(--grn);background:var(--surf)}
.wa-conv-top{display:flex;align-items:baseline;gap:8px}
.wa-conv-name{flex:1;min-width:0;font-weight:600;font-size:.86rem;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.wa-conv.unread .wa-conv-name{font-weight:700}
.wa-conv-date{flex:0 0 auto;font-size:.62rem;color:var(--txt3)}
.wa-conv-bot{display:flex;align-items:center;gap:8px;margin-top:3px}
.wa-conv-last{flex:1;min-width:0;font-size:.74rem;color:var(--txt2);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.wa-conv.unread .wa-conv-last{color:var(--txt);font-weight:500}
.wa-you{color:var(--txt3)}
.wa-conv-badge{flex:0 0 auto;background:var(--grn);color:#fff;border-radius:99px;min-width:18px;height:18px;padding:0 5px;font-size:.6rem;font-weight:700;display:flex;align-items:center;justify-content:center}
.wa-conv-warn{margin-top:5px;font-size:.62rem;color:var(--amber-deep)}
.wa-thread-hdr{display:flex;align-items:center;gap:8px;padding:0 16px 10px;border-bottom:1px solid var(--bdr);margin-bottom:10px}
.wa-back{flex:0 0 auto;width:38px;height:38px;border-radius:10px;border:1px solid var(--bdr2);background:var(--surf2);color:var(--txt2);cursor:pointer;display:flex;align-items:center;justify-content:center;transform:rotate(180deg)}  /* i-chevron pointe a droite : demi-tour pour un retour */
.wa-back svg,.wa-hdr-act svg{width:16px;height:16px}
.wa-thread-id{flex:1;min-width:0}
.wa-thread-name{font-weight:600;font-size:.9rem;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.wa-thread-sub{font-size:.64rem;color:var(--txt3)}
.wa-hdr-act{flex:0 0 auto;width:38px;height:38px;border-radius:10px;border:1px solid var(--bdr2);background:var(--surf2);color:var(--txt2);cursor:pointer;display:flex;align-items:center;justify-content:center;text-decoration:none}
.wa-link{display:flex;gap:7px;align-items:center;margin:0 16px 10px}
.wa-link .inp{flex:1;min-width:0}
.wa-link.done{font-size:.72rem;color:var(--txt2);padding:8px 11px;border-radius:10px;background:var(--surf2);border:1px dashed var(--bdr2)}
.wa-link-btn{flex:0 0 auto;min-height:38px;padding:0 12px;border-radius:9px;border:1px solid var(--bdr2);background:var(--surf2);color:var(--txt2);font-size:.72rem;font-weight:600;cursor:pointer;margin-left:8px}
.wa-thread{display:flex;flex-direction:column;gap:7px;padding:0 16px 10px;overflow-y:auto;max-height:52vh}
.wa-day{align-self:center;font-size:.62rem;color:var(--txt3);margin:6px 0 2px}
.wa-msg{max-width:85%;padding:8px 12px;border-radius:12px;font-size:.8rem;line-height:1.4}
.wa-msg-body{white-space:pre-wrap;overflow-wrap:anywhere}
.wa-msg-time{margin-top:2px;text-align:right;font-size:.58rem;color:var(--txt3)}
.wa-msg.in{align-self:flex-start;background:var(--surf2);border:1px solid var(--bdr)}
.wa-msg.out{align-self:flex-end;background:var(--grnd);border:1px solid rgba(56,196,114,.2)}
.wa-compose{display:flex;gap:8px;align-items:flex-end;padding:0 16px 12px}
.wa-compose .inp{flex:1;min-width:0;resize:none}
.wa-compose .btn{flex:0 0 auto;min-height:44px;width:52px;padding:0}
/* Lot 5 — le fil relaye WhatsApp : accuses de reception, image recue, rattachement,
   issue de l'envoi et repli. Memes jetons que le reste de l'ecran Messages. */
.wa-ack{margin-left:3px;letter-spacing:-.06em}
.wa-ack.read{color:var(--acc)}
.wa-media{display:block;max-width:100%;height:auto;border-radius:9px;margin-bottom:6px}
.wa-more{display:block;width:100%;min-height:44px;margin-bottom:6px;border:1px solid var(--bdr2);background:var(--surf2);color:var(--txt2);border-radius:10px;font-size:.72rem;font-weight:600;cursor:pointer}
.wa-attach{display:block;margin-top:6px;min-height:44px;padding:0 12px;border:1px solid var(--bdr2);background:var(--surf);color:var(--txt2);border-radius:9px;font-size:.68rem;font-weight:600;cursor:pointer}
.wa-linked{display:block;margin-top:5px;font-size:.62rem;color:var(--txt3)}
.wa-status{margin:0 16px 10px;font-size:.68rem;color:var(--txt2)}
.wa-fallback{display:flex;flex-direction:column;gap:7px;margin:0 16px 10px;padding:11px;border:1px solid var(--amber-bdr);background:var(--amber-bg);border-radius:11px}
.wa-fb-title{font-size:.72rem;font-weight:600;color:var(--amber-deep)}
.wa-fallback .btn{width:100%;text-decoration:none}
.wa-photo-offer{position:fixed;left:0;right:0;bottom:0;z-index:60;display:flex;flex-direction:column;gap:8px;padding:14px 16px calc(14px + env(safe-area-inset-bottom));background:var(--surf);border-top:1px solid var(--bdr);border-radius:16px 16px 0 0;box-shadow:0 -6px 24px rgba(0,0,0,.14)}
.wa-offer-t{font-size:.8rem;font-weight:600}

/* ── Planifier : barre d'action collée au bas de l'écran (2026-09-11) ─────────
   « Créer les livraisons » était sous cinq cartes. La barre est collante dans
   #appscroll, le conteneur qui défile ; la barre du bas est hors de lui, donc
   rien ne la recouvre. */
.ip-bar{position:sticky;bottom:0;z-index:20;margin-top:12px;padding:12px 14px 14px;background:var(--surf);border:1px solid var(--bdr2);border-bottom:none;border-radius:14px 14px 0 0;box-shadow:0 -6px 20px color-mix(in srgb,var(--txt) 8%,transparent)}
.ip-bar-head{display:flex;align-items:flex-end;gap:9px;margin-bottom:10px}
.ip-bar-txt{flex:1;min-width:0}
.ip-bar-day{font-size:.6rem;text-transform:uppercase;letter-spacing:.09em;color:var(--txt3)}
.ip-bar-sum{font-family:var(--font-display);font-size:1.15rem;font-weight:500;letter-spacing:-.02em;line-height:1.15;margin-top:2px;color:var(--txt);font-variant-numeric:tabular-nums}
.ip-bar-reset{flex:0 0 auto;min-height:44px;padding:0 12px;font-size:.72rem;font-weight:600;color:var(--txt2);background:var(--surf2);border:1px solid var(--bdr2);border-radius:10px}
.ip-bar-go{min-height:52px;font-family:var(--font-display);font-size:1rem}
.ip-bar-go:disabled,.ip-bar-go.is-blocked{background:var(--surf2);color:var(--txt3);border:1px dashed var(--bdr2);box-shadow:none;cursor:not-allowed}
.ip-bar-why{margin-top:7px;text-align:center;font-size:.72rem;font-weight:600;color:var(--rose-deep)}

/* ── Feuille « Livré » : hauteur bornée, tête et pied fixes (2026-09-11) ───────
   Ancrée en bas et sans hauteur maximale, la feuille perdait son haut dès que le
   clavier s'ouvrait pour saisir le montant. Seul le corps défile désormais. */
.paysheet{display:flex;flex-direction:column;max-height:calc(100dvh - 12px);padding-bottom:0}
.paysheet .ph{flex:0 0 auto}
.pay-head{flex:0 0 auto;display:flex;align-items:flex-start;gap:9px;padding-bottom:12px;margin-bottom:12px;border-bottom:1px solid var(--bdr)}
.pay-head-txt{flex:1;min-width:0}
.pay-stop{font-size:.6rem;text-transform:uppercase;letter-spacing:.09em;color:var(--txt3);min-height:.9em}
.pay-title{font-family:var(--font-display);font-size:1.15rem;font-weight:500;letter-spacing:-.02em;line-height:1.2;margin:2px 0 0;color:var(--txt)}
.pay-meta{font-size:.74rem;color:var(--txt2);margin-top:2px;font-variant-numeric:tabular-nums}
.pay-close{flex:0 0 auto;width:44px;height:44px;border-radius:11px;border:1px solid var(--bdr);background:var(--surf2);color:var(--txt2);font-size:.95rem;cursor:pointer}
.pay-body{flex:1 1 auto;min-height:0;overflow-y:auto;overscroll-behavior:contain}
.pay-foot{flex:0 0 auto;margin-top:0;padding:12px 0 calc(14px + env(safe-area-inset-bottom,0px));border-top:1px solid var(--bdr);background:var(--surf)}

/* ── Checklist de départ : le total en tête, le départ à portée (2026-09-11) ── */
#m-departure .dep-sec{font-size:.62rem;text-transform:uppercase;letter-spacing:.09em;font-weight:600;color:var(--txt3);margin:14px 0 8px}
#m-departure .dep-sec:first-child{margin-top:0}
#m-departure .dep-total{display:flex;align-items:baseline;gap:8px;padding:10px 12px;border-radius:11px;background:var(--acc-tint);border:1px solid var(--acc);color:var(--acc-deep)}
#m-departure .dep-total span:first-child{flex:1;font-size:.76rem;font-weight:600}
#m-departure .dep-total-kg{font-family:var(--font-display);font-size:1.4rem;font-weight:500;letter-spacing:-.02em;font-variant-numeric:tabular-nums}
#m-departure .dep-line{margin-top:6px;padding:9px 12px;border-radius:10px;background:var(--surf2);border:1px solid var(--bdr);font-size:.76rem;font-weight:600}
#m-departure .dep-labels{display:flex;gap:7px}
#m-departure .dep-label{flex:1;padding:10px 12px;border-radius:11px;background:var(--surf2);border:1px solid var(--bdr);text-align:center}
#m-departure .dep-label b{display:block;font-family:var(--font-display);font-size:1.25rem;font-weight:500;font-variant-numeric:tabular-nums}
#m-departure .dep-label span{font-size:.64rem;color:var(--txt3)}
#m-departure .dep-warn{margin-top:7px;padding:9px 11px;border-radius:10px;background:var(--amber-bg);border:1px solid var(--amber-bdr);color:var(--amber-deep);font-size:.72rem;line-height:1.45}
#m-departure .dep-remind{list-style:none;margin:0;padding:0;font-size:.78rem;line-height:1.45;color:var(--txt2)}
#m-departure .dep-remind li{padding:6px 2px}
/* Le padding bas du dialogue décalerait le point de collage : le pied le reprend. */
dialog.mdialog#m-departure{padding-bottom:0}
#m-departure .dep-foot{position:sticky;bottom:0;display:flex;gap:8px;margin:14px -20px 0;padding:12px 20px 20px;background:var(--surf);border-top:1px solid var(--bdr)}

/* ── Formulaire client : « Enregistrer » à portée clavier ouvert (2026-09-11) ── */
/* Le padding bas de la feuille décalerait le point de collage : la rangée le reprend. */
#m-cli .modal{padding-bottom:0;scroll-padding-bottom:calc(76px + env(safe-area-inset-bottom,0px))}
/* 20 px : le padding réel de .modal (la règle « Modal v2 » écrase celle de .modal d'origine). */
#m-cli .mact{position:sticky;bottom:0;margin:10px -20px 0;padding:10px 20px calc(12px + env(safe-area-inset-bottom,0px));background:var(--surf);border-top:1px solid var(--bdr)}

/* ── Plancher tactile mesuré (2026-09-11) ─────────────────────────────────────
   Relevé par test/classique/tap-targets.mjs sur les six écrans mobiles : 18
   cibles sous 44 px. Portées au plancher quand cela n'allonge pas l'écran ;
   l'index alphabétique de Planifier est toléré, raison chiffrée dans le test. */
#sec-lots .btn,
#sec-plan .daybtn,
#sec-liv .tour-view-btn,
#sec-liv .start-point-inp{min-height:44px}
#sec-liv .ctx-btn{min-width:44px;min-height:44px}
/* « Autre date… » : 12 px de haut, sous le minimum WCAG de 24 px. */
#sec-plan .ip-other-date{display:inline-flex;align-items:center;min-height:44px;padding:0 4px;background:none;border:0;font-family:inherit}

/* ── Feuilles et clavier virtuel (2026-09-11) ─────────────────────────────────
   Le clavier ne rétrécit que la zone VISIBLE (Chrome ≥ 108, Safari iOS). Les
   feuilles de saisie se logent dans cette zone, publiée par utils.js en --vvh
   et --vvtop ; sans clavier, elles valent la fenêtre entière. */
.payover,#m-cli.mover{top:var(--vvtop,0px);bottom:auto;height:var(--vvh,100%)}
.paysheet{max-height:calc(var(--vvh,100dvh) - 12px)}
#m-cli .modal{max-height:calc(var(--vvh,100dvh) * .92)}

/* ══ LIVRAISON SUPERDESIGN · papier, encre et citron (2026-09-12) ══
   Une seule couche esthétique ; les règles de disposition restent ci-dessous.
   Manrope variable latin : Google Fonts, licence OFL dans ../fonts/. */
@font-face{font-family:Manrope;src:url('../fonts/manrope-latin.woff2') format('woff2');font-weight:200 800;font-style:normal;font-display:swap}
body.light{
  --bg:#F7F8F4;--surf:#FFFFFF;--surf2:#EDF0EA;--surf3:#E2E8E0;
  --txt:#173246;--txt2:#536370;--txt3:#536370;--bdr:#DDE3DE;--bdr2:#C4CFC7;
  --acc:#224F78;--acc-fill:#173246;--acc-deep:#224F78;--acc-tint:#E7EEF3;--acc-glow:rgba(34,79,120,.22);
  --green:#217046;--green-deep:#217046;--green-bg:#E6F2EA;--green-bdr:#BEDAC8;
  --rose:#B33432;--rose-deep:#B33432;--rose-bg:#FBECE9;--rose-bdr:#E9C2BC;
  --amber:#925000;--amber-deep:#925000;--amber-bg:#F8EEDC;--amber-bdr:#E3CCA6;
  --indigo:#604F91;--indigo-deep:#604F91;--indigo-bg:#EEEAF5;--indigo-bdr:#D3C9E5;
  --twint:#252A30;--twint-bg:#EBEDEF;--twint-bdr:#CDD3D8;
  --btn-primary-text:#FFFFFF;--status-on-fill:#FFFFFF;--glass:rgba(247,248,244,.94);--fill:#EDF0EA;--hair:#DDE3DE;
}
body.dark{
  --bg:#101D28;--surf:#1A2D3B;--surf2:#243B4A;--surf3:#304958;
  --txt:#E9F0F3;--txt2:#ACBCC5;--txt3:#ACBCC5;--bdr:#354B59;--bdr2:#506774;
  --acc:#A9D5F7;--acc-fill:#E4EDB5;--acc-deep:#A9D5F7;--acc-tint:#243F54;--acc-glow:rgba(169,213,247,.25);
  --green:#87D5A9;--green-deep:#87D5A9;--green-bg:#203F37;--green-bdr:#3E6858;
  --rose:#FFAAA5;--rose-deep:#FFAAA5;--rose-bg:#452F35;--rose-bdr:#725058;
  --amber:#F2C777;--amber-deep:#F2C777;--amber-bg:#423C2D;--amber-bdr:#6D6044;
  --indigo:#C5B9E9;--indigo-deep:#C5B9E9;--indigo-bg:#36334F;--indigo-bdr:#575276;
  --twint:#E1E5E9;--twint-bg:#30424E;--twint-bdr:#526371;
  --btn-primary-text:#173246;--status-on-fill:#173246;--glass:rgba(16,29,40,.94);--fill:#243B4A;--hair:#354B59;
}
body.light,body.dark{
  --font-text:Manrope,system-ui,-apple-system,sans-serif;--font-display:var(--font-text);--font-num:var(--font-text);
  --pad:20px;--rad:16px;--radsm:12px;
  --t-fast:160ms;--t-base:200ms;
  --slate-deep:var(--txt2);--slate-bg:var(--surf2);--slate-bdr:var(--bdr);
  --purple:var(--indigo);--purple-deep:var(--indigo-deep);--purple-bg:var(--indigo-bg);--purple-bdr:var(--indigo-bdr);
  --call-bg:var(--surf2);--call-bdr:var(--bdr);--call-ico:var(--acc);
  --pho-bg:var(--surf2);--pho-bdr:var(--bdr);--pho-lbl:var(--txt2);
  --shadow:none;--shadow-card:none;--shadow-pop:0 12px 40px rgba(16,29,40,.14);--shadow-toast:var(--shadow-pop);
}
body{font-family:var(--font-text);font-size:16px;font-variant-numeric:tabular-nums;-webkit-font-smoothing:antialiased}
body *{text-transform:none!important;letter-spacing:normal!important;font-style:normal!important}
h1,h2,h3,.mtitle,.modal-title,.pay-title{font-family:var(--font-display);font-weight:800}
.page-title h1,.page-title-l h1,.liv-title{font-size:30px;line-height:1.15;font-weight:800;letter-spacing:-.035em!important}
.page-title{padding-left:0;padding-right:0}
.page-title-h1::first-letter{text-transform:uppercase!important}
.page-title-sub,.liv-subtitle,.tdy-sub{font-size:13px;line-height:1.4;color:var(--txt2)}
.ctitle,.section-head,.mtitle,.modal-title{font-size:20px;line-height:1.25;font-weight:700;color:var(--txt)}
.ctitle span{font-size:14px;font-weight:400}
.kpi-val,.amount,.ip-bar-sum,.dep-total-kg,.dep-label b,.pay-amount-wrap input,.dlv-price{font-family:var(--font-num);font-weight:800}
.card{border:none!important;border-radius:16px;box-shadow:none!important;padding:16px}
.stamp,.pill,.dlv-badge,.rpill{transform:none!important;box-shadow:none!important;border:none!important;border-radius:8px!important;padding:3px 8px!important;font-size:12px!important;font-weight:600!important;font-family:var(--font-text)!important}
.stamp.user{background:var(--fill);color:var(--txt2)}
.hdr{height:calc(60px + env(safe-area-inset-top));padding:env(safe-area-inset-top) 20px 0;background:var(--bg);border:0;box-shadow:none}
.hdr-l{gap:8px}.hdr-brand{font-weight:800;font-size:15px}.hdr-week{border:0;background:none;padding:0;font-size:11px}
.hdr-r{gap:4px}.hdr-btn{width:44px;height:44px;background:none;border:0;border-radius:12px}.hdr-btn svg{width:22px;height:22px}
.hdr-btn .badge,.wa-conv-badge,#nav-badge-unpaid,#nav-badge-wa{color:var(--status-on-fill)!important}
.bnav,.nav{background:var(--surf)!important;border-top:1px solid var(--bdr)!important;box-shadow:none!important}
.nav-item span{font-size:11px;font-weight:600}.nav-item:hover{background:var(--surf2)}.nav-item svg{width:23px;height:23px}
.btn{border-radius:12px;font-weight:700;box-shadow:none!important;background-image:none!important}
.btn.bacc:not(.is-blocked),.btn.btn-primary,.cta,.daybtn.sel,.alpha-btn.sel,.assignee-pill.sel,.hist-pay-pill.sel:not([data-pay]){background:var(--acc-fill)!important;color:var(--btn-primary-text)!important;border:none}
.btn.btn-secondary,.btn.bghost,.btn.btn-ghost,.btn.btn-reset{background:var(--surf2);color:var(--acc);border:none}
.inp,.input,.sbox .inp{background:var(--surf2)!important;border:1px solid transparent!important;border-radius:12px;min-height:44px;font-size:16px;color:var(--txt)}
.inp:focus,.input:focus{box-shadow:0 0 0 3px var(--acc-glow)!important}
.tab{border-radius:10px;border:none!important;background:transparent;color:var(--txt2);font-weight:600;box-shadow:none}
.tab.active{background:var(--surf);color:var(--txt);box-shadow:none}
.daybtn,.alpha-btn{border:none!important;background:var(--surf2);color:var(--txt);border-radius:12px;font-weight:600;box-shadow:none}
.modal,.paysheet,dialog.mdialog{border:none!important;box-shadow:var(--shadow-pop)}
.modal,.paysheet{border-radius:28px 28px 0 0}dialog.mdialog{border-radius:24px}
.mhandle,.ph{width:36px!important;height:4px!important;border-radius:3px!important;background:var(--bdr2)!important;opacity:1}
.mover,.payover{background:rgba(16,29,40,.4);-webkit-backdrop-filter:none;backdrop-filter:none}
.ip-bar{border:0;border-top:1px solid var(--bdr);background:var(--glass);box-shadow:none;border-radius:20px 20px 0 0}
.ip-bar-sum{font-size:17px}
#sec-plan .ip-other-date{font-size:14px!important;text-decoration:none!important;color:var(--acc)!important;font-weight:600}
.tdy-tour,.tdy-stock{border:none!important;box-shadow:none!important}.tdy-tour{padding:16px}.tdy-tour-f{font-size:13px;color:var(--txt2)}
.tdy-sec{margin:24px 0 8px}.tdy-sec>span{font-size:18px;font-weight:700;color:var(--txt)}.tdy-sec>em{font-size:13px;color:var(--txt2)}
.kpi,.lot-card{border:none!important;box-shadow:none!important;border-radius:16px}.kpi .kv{font-family:var(--font-num);font-weight:800}#sec-lots .kpi .kv.cr{color:var(--txt)}
.hist-pay-pill,.assignee-pill{border:none!important;border-radius:12px;background:var(--surf2);color:var(--txt);font-size:13px;font-weight:600;padding:8px 12px}
.b-twint,.dlv-pay-twint,body.dark .dlv-pay-twint,.stamp.twint,.popt.s-twint,.hist-pay-pill[data-pay="twint"].sel,.radio-card.twint{background:var(--twint-bg)!important;color:var(--twint)!important}
.radio-card.twint:not(.selected){border-color:var(--twint-bdr)!important}.radio-card.twint svg,.radio-card.twint .lbl{color:var(--twint)!important}.dlv-card-twint,body.dark .dlv-card-twint{background:var(--surf)!important}
/* Même feuille et mêmes commandes en immersion ; le citron désigne l'action. */
.imm-header-overlay,body.dark .imm-header-overlay{background:var(--glass);border-color:var(--bdr)}
.imm-hdr-btn,body.dark .imm-hdr-btn{background:var(--surf);box-shadow:none;border-radius:12px}
.imm-hdr-badge{background:#E4EDB5;color:#173246;border-radius:8px}
.immersive-shell{--imm-peek-h:420px}
.imm-sheet,body.dark .imm-sheet{border-radius:28px 28px 0 0;box-shadow:var(--shadow-pop);transition-duration:200ms}
.imm-bottom-sheet-card{border-radius:28px 28px 0 0}
.imm-sheet-handle-bar{min-height:44px}
.progress-fill-big{background:var(--acc-fill);animation:none}
.stop-counter-num,.imm-popup .imm-popup-btn{background:var(--acc-fill);color:var(--btn-primary-text);box-shadow:none}
.stop-avatar{background:var(--surf2);color:var(--txt);border-radius:12px}
.imm-sheet .stop-name{font-size:22px;font-weight:800;white-space:normal}
.imm-sheet .stop-meta-amt{font-size:20px;color:var(--txt)}
.imm-sheet .stop-meta-pay{color:var(--txt2)}
.stop-actions .btn-secondary.nav{background:var(--surf2)!important;color:var(--acc);border-color:var(--bdr)}
.tdy-start.btn.bacc{background:#E4EDB5!important;color:#173246!important}
.pay-chip{min-width:44px;min-height:44px}

/* ── Nouvelle interface · Tournée (2026-09-11) ─────────────────────────────────
   Des lignes au lieu de cartes ; les actions dans la feuille d'arrêt ; le prochain
   arrêt au premier plan. */
.tour-sec{margin:0 0 22px}
/* Filtres de livreur sur une rangée qui défile, comme les jours de Planifier : dans
   une police large (DejaVu, sur le NUC), trois pastilles passaient sur deux rangées
   et Tournée retombait à 3 arrêts visibles. */
#sec-liv .hist-pay-toggles{display:flex;flex-wrap:nowrap;overflow-x:auto;scrollbar-width:none}
#sec-liv .hist-pay-toggles::-webkit-scrollbar{display:none}
#sec-liv .hist-pay-toggles>*{flex:0 0 auto}
.tour-h{display:flex;align-items:baseline;justify-content:space-between;gap:8px;margin:0 0 6px}
.tour-h h2{font-size:16px;font-weight:700;margin:0}
.tour-h span{font-size:12px;color:var(--txt3);text-align:right;line-height:1.3}
.tour-prog{margin:0 0 10px}
.tour-prog-bar{height:4px;border-radius:99px;background:var(--fill);overflow:hidden}
.tour-prog-bar i{display:block;height:100%;border-radius:99px;background:var(--acc-fill)}
.tour-prog-t{margin-top:4px;font-size:12px;color:var(--txt3)}
.tour-prog-t b{color:var(--txt);font-family:var(--font-num)}
.tour-tools{display:flex;flex-wrap:wrap;gap:8px;margin:12px 0 0}
.tour-tools .btn{flex:1;min-height:44px}
.tour-tools .btn:last-child{flex:0 0 52px}
.tour-tools .tour-add{flex:1 0 100%}
.route-readiness.route-meta{flex:1 0 100%;display:grid;grid-template-columns:minmax(0,1fr) auto;grid-template-areas:"main action";align-items:center;gap:10px;margin:0;padding:10px 10px 10px 12px;border:1px solid var(--bdr);border-left:4px solid var(--acc);border-radius:12px;background:var(--surf);color:var(--txt)}
.route-readiness-main{grid-area:main;min-width:0;display:flex;flex-direction:column;gap:2px}
.route-readiness-main strong{font-size:14px;line-height:1.2}
.route-readiness-main span{font-size:11px;line-height:1.3;color:var(--txt2)}
.route-readiness .route-optimize{grid-area:action;min-width:104px;min-height:44px;padding:8px 12px;background:var(--acc-fill)!important;color:var(--btn-primary-text);border-color:transparent;font-size:13px;white-space:nowrap}
.route-readiness[data-route-state="ready"]{border-left-color:var(--green)}
.route-readiness[data-route-state="local"],.route-readiness[data-route-state="stale"]{border-left-color:var(--amber)}
.route-readiness[data-route-state="error"]{border-left-color:var(--red)}
.route-readiness[data-route-state="offline"]{border-left-color:var(--txt3)}
.route-readiness[data-route-state="offline"] .route-optimize{background:var(--fill)!important;color:var(--txt3)}
#sec-today .route-readiness{margin:12px 0 0}
/* Posés sur le fond gris, les boutons prennent la cellule blanche : #0066CC y garde 5,6:1. */
#sec-liv .tour-tools .btn{background:var(--surf)}
.next-stop{position:relative;background:transparent;color:var(--txt);border-radius:0;padding:8px 0 14px 34px;margin:0;cursor:pointer;border-bottom:1px solid var(--bdr)}
.next-stop::before{content:"";position:absolute;left:13px;top:36px;bottom:0;width:1px;background:var(--bdr)}
.journey-stop-num{position:absolute;left:0;top:8px;width:27px;height:27px;border-radius:50%;background:#E4EDB5;color:#173246;display:grid;place-items:center;font-size:13px;font-weight:700}
.next-stop-k{display:flex;justify-content:space-between;gap:8px;align-items:flex-start;font-size:11px;font-weight:600;color:var(--txt2)}
.next-stop-k>span>small{display:block;font-size:12px;color:var(--txt2);margin-top:2px}
.next-stop-h{display:flex;flex-wrap:wrap;align-items:baseline;min-height:44px;margin-top:6px}
.next-stop-n{flex:1 0 100%;min-width:0;font-size:23px;font-weight:800;line-height:1.2;overflow-wrap:anywhere}
.next-stop-a{flex:0 0 100%;font-size:12px;color:var(--txt2);margin-top:4px;overflow-wrap:anywhere}
.next-stop-m{font-family:var(--font-num);font-size:22px;font-weight:800;white-space:nowrap;line-height:1.2;color:var(--txt)}
.next-stop-m small{font-size:11px;font-weight:500;color:var(--txt2);margin-left:4px}
.next-stop-money{text-align:right;max-width:210px}
.next-stop-due{font-size:10px;font-weight:600;color:var(--txt2)}
.next-stop-paid{margin-top:2px;font-size:10px;font-weight:500;line-height:1.2;color:var(--green)}
.next-stop-note{margin-top:6px;font-size:12px;line-height:1.35;color:var(--txt2);overflow-wrap:anywhere}
.stop-acts{display:flex;flex-wrap:wrap;gap:8px;margin:10px 0}
.stop-acts.next{margin:8px 0 0;gap:4px}
.stop-acts.next + .stop-acts.next{margin-top:4px}
.next-stop .stop-act{min-height:44px;flex-direction:row;gap:3px;background:var(--surf2);color:var(--txt);font-size:10px}
.next-stop .next-outcome .stop-act{font-size:12px}
.next-stop .stop-act-i svg{width:16px;height:16px}
.next-stop .stop-act.primary{background:var(--acc-fill);color:var(--btn-primary-text)}
.next-stop .cta.cta-immersive{min-height:44px;margin-top:8px;font-size:14px;background:var(--acc-fill);color:var(--btn-primary-text)}
/* Libellé en couleur de texte, icône teintée : le bleu sur --fill tombait sous
   4,5:1 en sombre (4,26:1) pour un texte de 13 px. */
.stop-act{flex:1 1 calc((100% - (var(--n,3) - 1) * 8px) / var(--n,3));min-width:0;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:4px;min-height:56px;border-radius:12px;border:none;background:var(--fill);color:var(--txt);font:inherit;font-size:13px;font-weight:600;text-decoration:none;cursor:pointer}
.stop-act-i{color:var(--acc)}
.stop-act.primary{background:var(--acc-fill);color:var(--btn-primary-text)}
.stop-act.primary .stop-act-i{color:inherit}
.stop-act-i svg{width:22px;height:22px;display:block}
.stop-act[disabled]{opacity:.35;cursor:default}
.stop-list{background:transparent;border-radius:0;overflow:hidden}
.stop-row{position:relative;display:flex;align-items:center;gap:8px;min-height:64px;margin:0;padding:8px 0;cursor:pointer;border-bottom:1px solid var(--bdr)}
.stop-row::before{content:"";position:absolute;left:13px;top:0;bottom:0;width:1px;background:var(--bdr);z-index:0}.stop-row>*{position:relative}

/* Au clavier et au lecteur d'écran, le bouton est le bloc du nom : la ligne porte
   ✓, le prochain arrêt ses actions de route, et un bouton ne contient pas de
   bouton. Au doigt, toute la ligne ouvre la feuille. */
.stop-main:focus-visible,.next-stop-h:focus-visible{outline:2px solid var(--acc);outline-offset:2px;border-radius:8px}
.next-stop :focus-visible{outline-color:var(--acc)}
.stop-num{flex:0 0 27px;height:28px;border-radius:50%;display:flex;align-items:center;justify-content:center;background:var(--bg);border:1px solid var(--bdr);color:var(--txt2);font-family:var(--font-num);font-weight:700;font-size:12px}
.stop-num svg{width:15px;height:15px}
/* Livré n'est pas encaissé : le ✓ reste neutre (le vert est à l'argent reçu). Le
   retrait garde son indigo. */
.stop-row.is-done .stop-num{background:var(--fill);color:var(--txt3)}
.stop-row.is-pickup .stop-num{background:var(--indigo-bg);color:var(--indigo)}
.stop-main{flex:1;min-width:0;min-height:44px;display:flex;flex-direction:column;justify-content:center}
.stop-name{font-size:16px;font-weight:600;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.stop-sub{font-size:12px;color:var(--txt3);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.stop-tags{display:flex;flex-wrap:wrap;gap:6px;margin-top:4px}
/* Consigne d'accès sur la ligne : une ligne, coupée ; entière dans la feuille. */
.stop-note{font-size:13px;color:var(--txt2);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
/* Pastilles des lignes dans la palette : reportée et boîte aux lettres sont des états,
   pas de l'argent (neutres) ; « Partiel » est un impayé (rouge). */
.stop-tags .pill.postponed,.stop-tags .pill.deposited{background:var(--fill);color:var(--txt2);border-color:transparent}
.stop-tags .stamp.partial{background:var(--rose-bg);color:var(--rose-deep);border-color:var(--rose-bdr)}
.stop-amt{font-family:var(--font-num);font-weight:700;font-size:16px;white-space:nowrap}
.stop-done{flex:0 0 44px;height:44px;border-radius:12px;border:none;background:var(--acc-fill);color:var(--btn-primary-text);display:flex;align-items:center;justify-content:center;cursor:pointer}
.stop-done svg{width:20px;height:20px}
.tour-start,.tour-more{margin:12px 0 0;background:var(--surf);border-radius:14px;padding:0 14px}
.tour-start summary,.tour-more summary{min-height:48px;display:flex;align-items:center;gap:6px;font-size:15px;font-weight:600;cursor:pointer;list-style:none}
.tour-start summary::-webkit-details-marker,.tour-more summary::-webkit-details-marker{display:none}
/* Un chevron dit que le repli s'ouvre ; il pivote une fois ouvert. */
.tour-start summary::after,.tour-more summary::after{content:"";flex:0 0 auto;width:7px;height:7px;margin:0 4px 0 10px;border:solid var(--txt3);border-width:0 2px 2px 0;transform:rotate(45deg) translateY(-2px);transition:transform .2s}
.tour-more summary::after{margin-left:auto}
.tour-start[open]>summary::after,.tour-more[open]>summary::after{transform:rotate(-135deg) translate(-2px,-1px)}
@media (prefers-reduced-motion:reduce){.tour-start summary::after,.tour-more summary::after{transition:none}}
.tour-start summary span{flex:1;min-width:0;text-align:right;font-weight:400;color:var(--txt3);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.tour-start[open]{padding-bottom:12px}
.tour-more .stop-list{margin:0 -14px;border-radius:0 0 14px 14px;border-top:.5px solid var(--hair)}
.tour-late-btn{margin-top:10px}
.tour-done{padding:20px;border-radius:18px;background:var(--green-bg);margin-bottom:12px}
.tour-done-k{font-size:22px;font-weight:700;color:var(--green)}
.tour-done-v{font-size:15px;color:var(--txt2);margin-top:4px}
.tour-done-v b{font-family:var(--font-num);color:var(--txt)}
/* L'action du moment, hors carte : la forme de .cta ne vivait que sous .card. */
.stop-sheet .cta,.next-stop .cta{display:flex;align-items:center;justify-content:center;gap:8px;width:100%;min-height:52px;margin-top:12px;border:none;border-radius:12px;cursor:pointer;font:inherit;font-size:17px;font-weight:600}
.stop-sheet .cta svg,.next-stop .cta svg{width:20px;height:20px;flex:0 0 auto}
/* Feuille d'arrêt */
.stop-sheet-k{font-size:13px;font-weight:600;color:var(--acc);min-height:1em}
.stop-sheet-n{font-size:24px;font-weight:700;margin:2px 0 0}
.stop-sheet-a{font-size:15px;color:var(--txt3);margin-top:2px}
.stop-sheet-m{display:flex;flex-wrap:wrap;align-items:center;gap:6px 10px;margin-top:8px;font-size:15px;color:var(--txt2)}
.stop-sheet-m b{font-family:var(--font-num);color:var(--txt)}
.stop-sheet-paid{flex:1 0 100%;font-size:13px;color:var(--green)}
.stop-sheet-note{margin-top:12px;padding:10px 12px;border-radius:10px;background:var(--surf2);font-size:15px;color:var(--txt2)}
.stop-menu{margin:16px 0 12px;background:var(--surf2);border-radius:14px;overflow:hidden}
.stop-item{display:flex;align-items:center;width:100%;min-height:48px;padding:0 16px;border:none;background:transparent;color:var(--acc);font:inherit;font-size:16px;text-align:left;text-decoration:none;cursor:pointer}
.stop-item + .stop-item{border-top:.5px solid var(--hair)}
.stop-item.danger{color:var(--rose)}
body.dark .stop-item.danger{color:var(--rose-deep)}
.stop-close{margin-top:4px}
.stop-sheet-n:focus{outline:none}
.tour-plan-next{margin-top:12px}
.pill.stop-who{border-color:var(--hair);background:var(--fill);color:var(--txt2)}
.tour-pickups{margin-top:16px}.tour-pickups h3{font-size:13px;color:var(--indigo);margin:0 0 8px}
.tour-driver{margin-top:14px}.tour-driver-h{font-size:13px;color:var(--txt2);margin:0 0 8px}

/* ── Nouvelle interface · Aujourd'hui : l'anneau de la journée (2026-09-11) ──────
   Le moment fort : l'anneau se remplit à chaque livraison, en vert quand la
   tournée est terminée. Il s'anime à l'ouverture depuis zéro, puis, redessiné
   sur place, depuis ce qu'il montrait (--from) ; jamais si l'on a demandé moins
   de mouvement. Les grands titres n'ont plus de carré d'icône (balisage retiré). */
.tdy-hero{display:flex;align-items:center;gap:16px;margin-top:14px;padding:16px;background:var(--surf);border-radius:24px}
.tdy-ring{position:relative;flex:0 0 128px;height:128px}
.tdy-ring svg{width:100%;height:100%;transform:rotate(-90deg)}
.tdy-ring circle{fill:none;stroke-width:12;stroke-linecap:round}
.tdy-ring-bg{stroke:var(--fill)}
.tdy-ring-fg{stroke:var(--acc-fill);animation:tdy-ring-in .2s cubic-bezier(.2,.8,.2,1) both}
.tdy-hero.complete .tdy-ring-fg{stroke:var(--green)}
@keyframes tdy-ring-in{from{stroke-dashoffset:var(--from)}}
@media (prefers-reduced-motion:reduce){.tdy-ring-fg{animation:none}}
.tdy-ring-c{position:absolute;inset:0;display:flex;flex-direction:column;align-items:center;justify-content:center}
.tdy-ring-c b{font-family:var(--font-num);font-size:40px;font-weight:700;line-height:1}
.tdy-ring-c span{font-size:15px;color:var(--txt3);margin-top:2px}
.tdy-hero-r{flex:1;min-width:0;display:flex;flex-direction:column;gap:10px}
.tdy-hero-k{font-size:15px;font-weight:600;color:var(--acc)}
.tdy-hero.complete .tdy-hero-k{color:var(--green)}
.tdy-hero-v b{display:block;font-family:var(--font-num);font-size:22px;font-weight:700;line-height:1.1}
.tdy-hero-v span{font-size:13px;color:var(--txt3)}
/* La note des retraits vit sous l'anneau, plus dans la carte : son filet de
   séparation flotterait entre deux blocs. */
#sec-today .tdy-tour-f{margin:8px 4px 0;padding:0;border-top:0}
#sec-today .next-stop{margin-top:14px}
/* À 360 px, le jour complet passait sur deux lignes et rejetait les actions du
   prochain client sous la barre fixe. Une seule ligne rend 28 px au terrain. */
@media(max-width:375px){
  #sec-today .page-title-h1{font-size:1.25rem}
  #sec-today .tdy-hero{gap:12px;margin-top:10px;padding:12px}
  #sec-today .tdy-ring{flex-basis:112px;height:112px}
  #sec-today .tdy-hero-r{gap:6px}
  #sec-today .tdy-hero-k{display:none}
}
/* Le bandeau démo/staging prend 24 px réels. Sur les téléphones courts, les
   cinq gestes du prochain arrêt doivent néanmoins rester au-dessus de la barre
   basse : on retire l'accueil redondant (semaine déjà dans l'en-tête) et on
   réserve la version la plus compacte de l'anneau aux hauteurs où la version
   normale masquerait encore une action.
   Les actions gardent toutes leur plancher tactile de 44 px. */
@media(max-width:430px) and (max-height:800px){
  /* Le retour du sous-écran occupe déjà 44 px : pas de marge vide au-dessus. */
  body.pucace-app .inner:has(#sec-today.on){padding-top:0}
  #sec-today .page-title{padding-top:6px;padding-bottom:2px}
  #sec-today .page-title-h1{font-size:18px;line-height:1.15}
  #sec-today .tdy-sub-line{display:none}
  #sec-today .route-readiness{margin-top:8px}
  #sec-today .next-stop{margin-top:8px}
}
@media(max-width:375px) and (max-height:720px),
       (min-width:376px) and (max-width:430px) and (max-height:800px){
  #sec-today .tdy-hero{gap:8px;margin-top:6px;padding:6px 10px;border-radius:16px}
  #sec-today .tdy-ring{flex-basis:56px;height:56px}
  #sec-today .tdy-ring circle{stroke-width:10}
  #sec-today .tdy-ring-c b{font-size:20px}
  #sec-today .tdy-ring-c span{font-size:9px;margin-top:0}
  #sec-today .tdy-hero-r{display:grid;grid-template-columns:1fr 1fr;gap:2px 10px}
  #sec-today .tdy-hero-k{display:none}
  #sec-today .tdy-hero-v b{font-size:16px}
  #sec-today .tdy-hero-v span{font-size:10px}
}
/* Les emplacements que le réseau remplit (météo, relances) : sans boîte à eux, leur
   contenu se place comme s'il était dessiné directement dans la page. */
.tdy-slot{display:contents}

/* ── Nouvelle interface · Clients : une ligne par client (2026-09-11) ─────────── */
#cli-list{background:var(--surf);border-radius:14px;overflow:hidden}
.cli-row{display:flex;align-items:center;gap:8px;min-height:64px;padding:10px 12px;cursor:pointer}
.cli-row + .cli-row{border-top:.5px solid var(--hair)}
.cli-row .list-avatar{flex:0 0 40px;width:40px;height:40px}
/* Le bloc du nom est le bouton du clavier et du lecteur d'écran : 44 px au moins,
   texte centré comme avant, et l'anneau de focus autour de lui. */
.cli-row-main{flex:1;min-width:0;min-height:44px;display:flex;flex-direction:column;justify-content:center;border-radius:8px}
.cli-row-main:focus-visible{outline:2px solid var(--acc);outline-offset:2px}
.cli-row .client-name{font-size:16px;font-weight:600;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
/* La ligne d'information passe à la ligne entre ses morceaux, jamais au milieu
   d'un chiffre (clients.js). */
.cli-row-sub{font-size:14px;color:var(--txt3)}
.cli-row-sub span{white-space:nowrap}
/* Le retard sur le rythme a sa ligne : dans le nom, l'ellipse l'effaçait. */
.cli-row .cli-late{margin:3px 0 0;align-self:flex-start}
/* La consigne passe à la ligne, jamais coupée : la fiche ne la montre pas, et c'est
   ce qu'on lit devant la porte. */
.cli-row-note{font-size:13px;line-height:1.35;color:var(--txt2);margin-top:2px;overflow-wrap:anywhere}
.cli-row-acts{display:flex;gap:4px;flex:0 0 auto}
.cli-ico{width:44px;height:44px;border-radius:12px;display:flex;align-items:center;justify-content:center;background:var(--fill);color:var(--acc)}
.cli-ico svg{width:20px;height:20px}
button.cli-ico{border:0;padding:0;font:inherit;cursor:pointer}
button.cli-ico[disabled]{opacity:.4;cursor:default}
/* « Voir les N autres » vit dans la liste groupée : en retrait, comme les lignes. */
#cli-show-all{padding:4px 14px 14px!important}
/* « Modifier » en tête de la fiche, comme dans Contacts : à l'écran quelle que soit
   la longueur de l'historique. Bouton texte teinté, aligné sur le bord droit. */
.cli-hist-top{display:flex;align-items:center;justify-content:space-between;gap:12px;margin-bottom:4px}
.cli-hist-top .mtitle{margin:0;min-width:0}
.cli-hist-edit{flex:0 0 auto;min-width:44px;min-height:44px;margin-right:-8px;padding:0 8px;border:none;border-radius:8px;background:none;color:var(--acc);font:inherit;font-size:17px;cursor:pointer}
.cli-hist-edit:focus-visible{outline:2px solid var(--acc);outline-offset:-2px}

/* ── Nouvelle interface · Planifier : les jours sur une rangée (2026-09-11) ────── */
/* 3 px de marge intérieure (compensée en haut) : le défileur rogne tout ce qui
   dépasse de sa boîte, dont l'anneau de focus clavier des jours (3 px). */
#ip-daybtns{display:flex;flex-wrap:nowrap;gap:8px;overflow-x:auto;scrollbar-width:none;margin:-3px -4px 0;padding:3px 4px}
#ip-daybtns::-webkit-scrollbar{display:none}
#ip-daybtns .daybtn{flex:0 0 auto}
/* Le bord fond du côté où il reste des jours à balayer (classes posées par
   markIPDayEdges, planning.js). La barre de défilement est masquée : sans ce
   fondu, rien ne disait que la rangée continue, et à 390 px, selon le jour de la
   semaine, quatre jours entiers passaient pour la liste complète. 40 px avec Manrope : plus que
   l'écart et la marge réunis (12 px), le fondu tombe toujours sur un jour. */
#ip-daybtns{--fade:40px;--fl:0px;--fr:0px}
#ip-daybtns.more-l{--fl:var(--fade)}
#ip-daybtns.more-r{--fr:var(--fade)}
#ip-daybtns.more-l,#ip-daybtns.more-r{-webkit-mask-image:linear-gradient(to right,transparent,#000 var(--fl),#000 calc(100% - var(--fr)),transparent);mask-image:linear-gradient(to right,transparent,#000 var(--fl),#000 calc(100% - var(--fr)),transparent)}
/* Fiche client : le nom en titre, téléphone et adresse lisibles dessous (l'adresse a
   quitté la ligne du carnet, elle vit ici). */
.cli-hist-h{margin:0 0 16px}
.cli-hist-n{font-size:22px;font-weight:700;line-height:1.2}
.cli-hist-a{font-size:15px;color:var(--txt2);margin-top:2px}

/* ── Fil de journée · 12 septembre : une tête continue, trois moments ── */
body.journey-active .hdr{background:#173246;color:#E9F0F3}
body.journey-active .hdr-brand,body.journey-active .hdr-btn{color:#E9F0F3}
body.journey-active .hdr-week{display:none}
body.journey-active .inner{padding-top:0}
.journey-hero{background:#173246;color:#E9F0F3;margin:0 -20px;padding:0 20px 14px}
.journey-date{font-size:11px;color:#BDC9CF}
.journey-hero-line{display:flex;align-items:flex-end;justify-content:space-between;gap:8px}
.journey-hero p{font-size:11px;color:#BDC9CF;margin:6px 0 2px}
.journey-hero h1{font-size:29px;line-height:1.12;letter-spacing:-1.2px;margin:0;font-weight:700}
.journey-progress{display:flex;align-items:baseline;gap:3px;flex:0 0 auto}
.journey-progress b{font-size:37px;font-weight:500;color:#E4EDB5;line-height:1}
.journey-progress span{font-size:12px;color:#BDC9CF}
.journey-progress small{display:block;font-size:9px;max-width:60px}
/* En route, le prochain client prime sur l'accroche éditoriale : une ligne de
   contexte suffit et rend l'espace aux arrêts sans réduire aucune cible tactile. */
#sec-liv .journey-hero{padding-bottom:0}
#sec-liv .journey-date,#sec-liv .journey-hero-line p{display:none}
#sec-liv .journey-hero-line{min-height:36px;align-items:center}
#sec-liv .journey-hero h1{font-size:22px;letter-spacing:-.5px}
#sec-liv .journey-progress b{font-size:29px}
#sec-liv .journey-progress small{display:none}
.journey-toolbar{display:flex;align-items:center;gap:2px;min-height:54px}
.journey-toolbar select{min-width:0;flex:1;min-height:44px;border:0;background:transparent;color:var(--txt);font:inherit;font-size:12px;font-weight:700;padding:0}
.journey-toolbar button{flex:0 0 auto;min-width:44px;min-height:44px;border:0;border-radius:8px;background:transparent;color:var(--txt);font:inherit;font-size:12px;padding:0 5px;display:flex;align-items:center;justify-content:center;gap:3px}
.journey-toolbar .ico{width:18px;height:18px}
.journey-toolbar [data-view=list].active{display:none}
.journey-summary{padding:12px 0 24px;border-bottom:1px solid var(--bdr);margin-bottom:20px}
.journey-eyebrow{font-size:14px;font-weight:700;color:var(--txt2)}
.journey-number{font-size:56px;line-height:1.2;font-weight:700;letter-spacing:-2px;margin:8px 0}
.journey-number small{font-size:20px;letter-spacing:0;font-weight:500}
.journey-summary p,.journey-note{font-size:14px;color:var(--txt2);line-height:1.6}
.journey-summary>.btn{margin-top:10px}
.journey-balance{display:flex;justify-content:space-between;gap:16px;padding:16px 0;border-block:1px solid var(--bdr);font-size:14px}
.journey-balance b{white-space:nowrap}
.journey-links{display:grid;grid-template-columns:1fr 1fr;gap:8px;margin-top:20px}
.journey-links .btn{white-space:normal;min-height:48px}
.stop-group-title{font-size:12px;color:var(--txt2);margin:16px 0 8px;font-weight:700}
.stop-menu{background:transparent;border-radius:0}
.stop-menu .stop-group-title{padding-top:16px;border-top:1px solid var(--bdr)}
.stop-item{padding:0 4px;font-size:14px;color:var(--txt)}
.stop-sheet .stop-acts{margin:8px 0}
.stop-sheet .cta{margin:0;min-height:44px}
.stop-sheet .stop-act{min-height:48px;flex-direction:row;font-size:12px}
.pay-head{padding:8px 0 16px;border-bottom:2px solid var(--txt)}
.pay-stop{font-size:11px;color:var(--txt2)}
.pay-amount-head>label::before{content:"1 · ";color:var(--txt2)}
#pay-method-row>label::before{content:"2 · ";color:var(--txt2)}
.imm-sheet .stop-card{background:transparent;border-radius:0;border-left:1px solid var(--bdr);padding-left:12px}
.imm-sheet .stop-counter-num{border-radius:50%}
.imm-sheet .stop-avatar{display:none}
.imm-sheet .stop-counter{font-size:11px}
@media(max-width:375px){.journey-hero h1{font-size:27px}.journey-progress b{font-size:32px}.journey-progress small{max-width:50px}.journey-toolbar select{font-size:11px}.journey-number{font-size:48px}}

.journey-toolbar button:focus-visible,.journey-toolbar select:focus-visible{outline:2px solid var(--acc);outline-offset:-3px}

/* File hors ligne et état des données (api.js) : styles hors du JavaScript. */
#offline-resolution{position:fixed;inset:0;z-index:350;background:var(--bg);color:var(--txt);padding:24px;overflow:auto}
#offline-resolution [data-queue-id]{border-top:1px solid var(--bdr);margin-top:16px;padding-top:12px}
#offline-resolution pre{white-space:pre-wrap;overflow-wrap:anywhere}
#data-status{position:fixed;top:92px;left:10px;right:10px;z-index:201;background:var(--surf);color:var(--txt);padding:10px;cursor:pointer}

/* Bandeau hors production. Couleur d'alerte hors palette : il ne s'affiche jamais en production. */
#env-banner{position:sticky;top:0;z-index:1000;background:#FF9F0A;color:#000;text-align:center;font:600 .78rem/1.9 var(--font-text)}

/* Identité approuvée le 28-09-2026, partagée par toute l’application Livraison,
   y compris Clients, comptes et feuilles ouvertes depuis les onglets. */
.journey-brand{display:none}
body.pucace-app{
  --bg:#F7F0E3;--surf:#FFFEFA;--surf2:#F1EADD;--surf3:#EAE0CD;--fill:#F1EADD;
  --txt:#433025;--txt2:#685749;--txt3:#746352;--bdr:#E4DAC9;--bdr2:#D1C1A7;
  --acc:#3C6D36;--acc-fill:#3C6D36;--acc-tint:#E7EDD9;--acc-deep:#2C5527;--btn-primary-text:#FFF;
  --green:#3C6D36;--font-text:Manrope,system-ui,sans-serif;--font-num:var(--font-text);
  background:var(--bg);color:var(--txt);font-family:var(--font-text)
}
body.dark.pucace-app{
  --bg:#241F19;--surf:#322A22;--surf2:#40372B;--surf3:#4E4435;--fill:#40372B;
  --txt:#F7F0E3;--txt2:#E2D4BE;--txt3:#C3B59F;--bdr:#514637;--bdr2:#76654F;
  --acc:#B6D4A1;--acc-fill:#B6D4A1;--acc-tint:#374730;--acc-deep:#D4E8C3;--green:#B6D4A1;--btn-primary-text:#20341B
}
body.pucace-app .hdr{z-index:100;background:var(--bg);color:var(--txt);height:calc(52px + env(safe-area-inset-top));padding-inline:16px}
body.pucace-app .hdr-logo{display:none}
body.pucace-app .journey-brand{display:block;object-fit:contain;flex:0 0 40px}
body.pucace-app .hdr-brand{color:var(--txt);font-family:Georgia,serif;letter-spacing:1.1px;font-size:16px}
body.pucace-app .hdr-btn{color:var(--txt)}
body.pucace-app .inner{padding-inline:16px}
body.pucace-app .bnav{background:var(--surf);border-top:1px solid var(--bdr)}
/* setupNav() remplace .bnav par .nav : la marge de la barre d’accueil (iPhone installé, Android bord à bord) se reporte ici. */
body.pucace-app #appnav{padding-bottom:calc(8px + env(safe-area-inset-bottom,0px))}
/* Paysage : en-tête, liste et onglets hors de l’encoche latérale. */
body.pucace-app{padding-inline:env(safe-area-inset-left,0px) env(safe-area-inset-right,0px)}
body.pucace-app .bnav a{color:var(--txt2)}
body.pucace-app .bnav a.active{color:var(--acc)}
#sec-liv .journey-hero{background:transparent;color:var(--txt);margin:0;padding:4px 0 10px}
#sec-liv .journey-date{color:var(--txt2);font-size:11px}
#sec-liv .journey-hero-line{align-items:center;min-height:40px}
#sec-liv .journey-hero h1{font-family:Georgia,serif;font-size:28px;font-weight:400;letter-spacing:-.6px;line-height:1.15}
#sec-liv .journey-hero p{display:none}
#sec-liv .journey-progress{background:var(--acc-tint);color:var(--acc);border-radius:24px;padding:8px 12px;gap:4px}
#sec-liv .journey-progress b{font-size:20px;font-weight:800;color:var(--acc)}
#sec-liv .journey-progress span{color:var(--acc);font-size:12px}
#sec-liv .journey-progress small{display:none}
#sec-liv .journey-toolbar{gap:2px;min-height:52px}
#sec-liv .journey-toolbar select{font-size:11px}
#sec-liv .journey-toolbar button{font-size:11px;border-radius:22px}
#sec-liv .journey-toolbar .tour-view-btn.active{background:var(--surf);box-shadow:0 1px 4px #43302512}
#sec-liv .journey-toolbar .tour-view-btn[data-view=list].active{display:flex}
#sec-liv .journey-toolbar .tour-view-btn{padding-inline:8px}
#sec-liv .tour-h{align-items:center;margin:2px 0 6px}
#sec-liv .tour-h h2{font-size:12px;font-weight:800}
#sec-liv .tour-h>span{font-size:10px}
#sec-liv .route-readiness.route-meta{border:0;border-radius:0;padding:0 0 8px;gap:8px;background:transparent;min-height:52px}
#sec-liv .route-readiness-main strong{font-size:12px;color:var(--txt)}
#sec-liv .route-readiness-main span{font-size:10px;color:var(--txt2)}
#sec-liv .route-readiness .route-optimize{min-width:96px;min-height:44px;font-size:12px;border-radius:22px;background:var(--acc-tint)!important;color:var(--acc)}
#sec-liv .next-stop{padding:14px;margin:0 0 8px;border:1px solid var(--bdr);border-radius:22px;background:var(--surf);box-shadow:0 4px 16px #43302509;cursor:default}
#sec-liv .next-stop:before{display:none}
#sec-liv .journey-stop-num{display:none}
#sec-liv .next-stop-k{font-size:10px;color:var(--acc);font-weight:800}
#sec-liv .next-stop-k>span>small{font-size:12px;font-weight:600;color:var(--txt2);margin-top:3px}
#sec-liv .next-stop-h{margin-top:4px;cursor:pointer}
#sec-liv .next-stop-n{font-family:Georgia,serif;font-weight:400;font-size:25px;line-height:1.1}
#sec-liv .next-stop-a{font-size:12px;line-height:1.4;color:var(--txt2);margin-top:4px}
#sec-liv .next-stop-m{font-size:24px;letter-spacing:-.5px}
#sec-liv .next-stop-m small{font-size:10px;letter-spacing:0}
#sec-liv .next-stop-due{font-size:10px}
#sec-liv .next-stop-paid{font-size:10px;max-width:180px}
#sec-liv .next-stop-note{font-size:11px;line-height:1.4;color:var(--txt2);border-left:2px solid #E8C46A;padding-left:8px;margin-top:8px}
#sec-liv .stop-acts.next{gap:6px;margin-top:8px}
#sec-liv .next-stop .stop-act{min-height:44px;border-radius:12px;background:var(--surf2);font-size:10px;gap:4px}
#sec-liv .next-stop .next-outcome .stop-act{font-size:11px}
#sec-liv .next-stop .stop-act.primary{background:var(--acc-fill);color:var(--btn-primary-text);font-size:13px;font-weight:800}
#sec-liv .stop-list{border-radius:0;overflow:visible}
#sec-liv .stop-row{min-height:68px;padding:8px 0;gap:8px}
#sec-liv .stop-row:before{display:none}
#sec-liv .stop-num{background:var(--surf);border-color:var(--bdr);color:var(--txt2);font-size:11px}
#sec-liv .stop-name{font-size:14px;font-weight:800}
#sec-liv .stop-sub,#sec-liv .stop-note{font-size:11px;color:var(--txt2)}
#sec-liv .stop-amt{font-size:13px}
#sec-liv .stop-done{border-radius:50%;background:var(--surf);color:var(--acc);border:1px solid var(--bdr)}
#sec-liv .tour-start,#sec-liv .tour-more{border:1px solid var(--bdr);background:var(--surf);border-radius:16px}
#sec-liv .tour-tools .btn{font-size:12px;border-radius:14px}
#sec-liv .tour-start summary,#sec-liv .tour-more summary{font-size:13px}
#sec-liv .journey-number{font-family:Georgia,serif;font-weight:400}
#sec-liv #tour-map-wrap{padding:0}
#sec-liv #tour-map{height:210px;min-height:0;border:1px solid var(--bdr);border-radius:18px;overflow:hidden;isolation:isolate}
#sec-liv #tour-map-stats{font-size:11px;color:var(--txt2);padding:4px 0 8px;line-height:1.4}
#sec-liv #tour-selected-stop{margin-top:10px}
#sec-liv .tour-marker-wrap{cursor:pointer}
#sec-liv .tour-marker{width:44px;height:44px;background:var(--surf);color:var(--txt);border:2px solid var(--acc);font-size:14px;box-shadow:0 2px 6px #0003}
#sec-liv .tour-marker-wrap.is-selected .tour-marker{background:var(--acc-fill);color:var(--btn-primary-text);border-color:var(--surf)}
#sec-liv .tour-marker-wrap:focus-visible{outline:3px solid var(--acc);outline-offset:3px;border-radius:50%}
#sec-liv .leaflet-control-zoom a{width:44px;height:44px;line-height:44px;color:#433025}
body.journey-active .paysheet,body.journey-active .stop-sheet,body.journey-active .delivery-handoff{background:var(--surf);color:var(--txt);border-radius:24px 24px 0 0}
body.journey-active .pay-title,body.journey-active .stop-sheet h2,body.journey-active #handoff-title{font-family:Georgia,serif;font-weight:400}
body.journey-active .pay-stepper{border-radius:16px;background:var(--surf2)}
body.journey-active .pay-verdict{font-size:13px;line-height:1.5;background:var(--acc-tint);color:var(--txt);border-color:var(--bdr)}
body.journey-active .pay-verdict.over{background:var(--rose-bg);color:var(--rose-deep)}
body.journey-active #paybtn{font-size:12px;white-space:normal;min-height:52px;line-height:1.4;border-radius:16px}
body.journey-active #paybtn svg{display:none}
body.journey-active .radio-card.selected{border-color:var(--acc);background:var(--acc-tint);color:var(--txt)}
body.journey-active .pay-amount-wrap .input{color:var(--txt)}
@media(prefers-reduced-motion:no-preference){
  #sec-liv .stop-act,#sec-liv .stop-done{transition:background-color .15s,transform .15s}
  #sec-liv .stop-act:active,#sec-liv .stop-done:active{transform:scale(.97)}
}
@media(max-width:375px){
  #sec-liv .journey-hero h1{font-size:26px}
  #sec-liv .next-stop{padding:12px}
  #sec-liv .next-stop-n{font-size:23px}
  #sec-liv .journey-toolbar{gap:0}
  #sec-liv .journey-toolbar .tour-view-btn{padding-inline:5px}
}

/* En carte, le nom de l’arrêt occupe la place du titre de page. Les phases
   restent accessibles ; la carte cède de la hauteur aux gestes sur petit écran. */
#sec-liv .journey-hero h1{font-size:28px}
#sec-liv[data-view="map"] .journey-hero{display:none}
#sec-liv[data-view="map"] #tour-map{height:clamp(130px,calc(100dvh - 590px),230px)}

#sec-liv .tour-stop-picker{min-height:44px;width:100%;max-width:170px;border:0;border-radius:8px;padding:0 18px 0 0;background:transparent;color:var(--acc);font:inherit;font-size:11px;cursor:pointer}
#sec-liv #tour-selected-stop .next-stop-k>span{min-width:0;flex:1}
#sec-liv #tour-selected-stop .next-stop-k>span>small{margin-top:0}
#sec-liv .tour-stop-picker:focus-visible{outline:2px solid var(--acc);outline-offset:2px}

/* Contenus déplacés sans changer les écrans Dashboard / Planifier. */
.daily-panel{margin-bottom:12px;border:1px solid var(--bdr);border-radius:12px;background:var(--surf);padding:0 12px}
.daily-panel>summary{min-height:48px;padding:14px 0;font-size:13px;font-weight:700;cursor:pointer}
.daily-panel>summary:focus-visible{outline:2px solid var(--acc);outline-offset:2px}
.daily-panel .journey-summary{border:0;margin:0;padding-bottom:16px}

/* WhatsApp · identité validée, lecture et composeur à hauteur du téléphone. */
#sec-wa{padding-bottom:16px}
#sec-wa svg,.wa-new-modal svg{width:20px;height:20px;flex-shrink:0}
.wa-heading{display:flex;align-items:center;justify-content:space-between;gap:12px;padding:12px 0 20px}
.wa-eyebrow{font-size:10px;letter-spacing:1.5px;font-weight:800;color:var(--txt2);margin:0 0 8px}
.wa-heading h1{font:400 34px/1.12 Georgia,serif;letter-spacing:-.8px;margin:0}
.wa-heading #wa-sub{font-size:12px;color:var(--txt2);margin:8px 0 0;line-height:1.5}
#sec-wa .wa-heading .btn{border-radius:24px;min-height:46px;padding:0 16px;gap:6px;background:var(--acc-fill);color:var(--btn-primary-text)}
#sec-wa .wa-banner{margin:0 0 12px;font-size:12px;padding:10px 12px;border-radius:12px;line-height:1.5}
#sec-wa .wa-banner button{font:inherit;color:inherit;font-weight:800;min-height:44px;border:0;background:transparent;text-decoration:underline}
#wa-search-box{display:flex;gap:10px;align-items:center;padding:0 14px;background:var(--surf);border:1px solid var(--bdr);border-radius:16px;color:var(--txt2)}
#wa-search-box .inp{border:0;background:transparent!important;padding:0;min-height:50px;font-size:16px;min-width:0}
.wa-filters{display:flex;align-items:center;gap:8px;padding:12px 0 6px}
.wa-filters button{font:700 12px var(--font-text);border:1px solid transparent;border-radius:24px;padding:0 16px;min-height:44px;color:var(--txt2);background:transparent;cursor:pointer}
.wa-filters button[aria-pressed=true]{color:var(--acc);background:var(--acc-tint);border-color:var(--bdr)}
.wa-filters .wa-refresh{margin-left:auto;padding:0;width:44px;display:grid;place-items:center}
#sec-wa .wa-conv{display:flex;align-items:center;gap:12px;width:100%;margin:0;padding:18px 0;border:0;border-bottom:1px solid var(--bdr);border-radius:0;background:transparent;min-height:96px}
.wa-avatar{display:grid;place-items:center;flex:0 0 46px;width:46px;height:46px;border-radius:16px;background:var(--surf3);color:var(--txt);font:400 18px Georgia,serif}
.wa-conv.unread .wa-avatar{background:var(--acc-tint);color:var(--acc)}
.wa-conv-content{flex:1;min-width:0;display:block}
#sec-wa .wa-conv-name{font-size:15px;font-weight:700}
#sec-wa .wa-conv-date{font-size:11px;line-height:1.5;color:var(--txt2)}
#sec-wa .wa-conv-last{font-size:13px;line-height:1.65;color:var(--txt2)}
#sec-wa .wa-conv-badge{min-width:8px;width:8px;height:8px;padding:0;background:var(--acc)}
#sec-wa .wa-conv-warn{display:block;margin-top:3px;font-size:11px;color:var(--txt2)}
.wa-draft-label{color:var(--acc);font-weight:700}
.wa-empty{padding:36px 16px;text-align:center;color:var(--txt2);margin:auto 0}
#sec-wa .wa-empty>svg{width:40px;height:40px;color:var(--acc);margin-bottom:12px}
.wa-empty h2{font:400 24px/1.2 Georgia,serif;color:var(--txt);margin:0 0 10px}
.wa-empty p{font-size:13px;line-height:1.65;margin:0}
body.wa-thread-active #sec-wa>.wa-heading,body.wa-thread-active #sec-wa>#wa-banner{display:none}
body.wa-thread-active #wa-thread-wrap{position:fixed;z-index:25;left:50%;transform:translateX(-50%);width:100%;max-width:620px;top:calc(52px + env(safe-area-inset-top) + var(--env-height,0px) + var(--banners-height,0px));bottom:var(--nav-height,calc(70px + env(safe-area-inset-bottom)));display:flex;flex-direction:column;background:var(--bg);overflow:hidden}
#sec-wa .wa-thread-hdr{flex-shrink:0;gap:8px;padding:10px 12px;margin:0;border:0;background:var(--bg)}
#sec-wa .wa-back,#sec-wa .wa-hdr-act,.wa-new-modal .wa-hdr-act{width:44px;height:44px;border:0;border-radius:50%;background:var(--surf);color:var(--txt)}
#sec-wa .wa-thread-hdr .wa-avatar{flex-basis:36px;width:36px;height:36px;border-radius:12px;font-size:15px}
#sec-wa .wa-thread-name{font-size:15px;font-weight:800}
#sec-wa .wa-thread-sub{font-size:11px;color:var(--txt2);margin-top:3px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
#sec-wa #wa-thread-banner .wa-banner{margin:0 12px 8px;padding:6px 10px;font-size:11px}
#wa-link-row{flex-shrink:0;max-height:30%;overflow-y:auto}
.wa-client{border-block:1px solid var(--bdr);background:var(--surf)}
.wa-client summary{display:flex;justify-content:space-between;align-items:center;list-style:none;min-height:44px;padding:8px 16px;font-size:12px;color:var(--txt2);cursor:pointer}
.wa-client summary::-webkit-details-marker{display:none}
.wa-client>div{padding:0 16px 12px}
.wa-client label{display:block;font-size:12px;margin:12px 0 6px;color:var(--txt2)}
.wa-client p{font-size:11px;color:var(--txt2);margin:10px 0 0}
#sec-wa .wa-link{margin:0;gap:6px}
#sec-wa .wa-link .inp{font-size:16px;min-height:44px;padding:6px}
#sec-wa .wa-link-btn{min-height:44px;font-size:12px;margin:0}
#sec-wa .wa-thread{flex:1;min-height:40px;max-height:none;overflow:auto;overscroll-behavior:contain;overflow-anchor:none;padding:12px 16px 16px;gap:10px;scrollbar-width:thin}
#sec-wa .wa-day{margin:10px 0;color:var(--txt2);font-size:11px}
#sec-wa .wa-msg{max-width:87%;padding:12px 14px 6px;border-radius:18px;font-size:15px;line-height:1.5;flex-shrink:0}
#sec-wa .wa-msg.in{border:1px solid var(--bdr);background:var(--surf);border-bottom-left-radius:4px}
#sec-wa .wa-msg.out{border:1px solid var(--bdr);background:var(--acc-tint);border-bottom-right-radius:4px}
.wa-msg-foot{display:flex;align-items:center;justify-content:flex-end;gap:6px;min-height:32px}
#sec-wa .wa-msg-time{font-size:10px;color:var(--txt2);margin:0}
.wa-msg-actions summary{min-width:44px;min-height:44px;display:grid;place-items:center;list-style:none;cursor:pointer;font-size:20px;line-height:1;color:var(--txt2)}
.wa-msg-actions summary::-webkit-details-marker{display:none}
#sec-wa .wa-media{min-width:100px;max-height:300px;object-fit:contain;border-radius:12px}
.wa-file{color:var(--acc);min-height:44px;display:flex;align-items:center;font-size:13px}
#sec-wa .wa-status{margin:0;padding:8px 16px;font-size:12px;color:var(--txt2);border-top:1px solid var(--bdr);background:var(--surf);flex-shrink:0;max-height:70px;overflow:auto;flex-shrink:1;min-height:20px}
#sec-wa .wa-fallback{margin:0 12px 8px;max-height:36%;overflow:auto;padding:0 12px;flex-shrink:1;min-height:0}
.wa-fallback summary{min-height:44px;display:flex;align-items:center;font-size:12px;font-weight:800;cursor:pointer}
.wa-fb-actions{display:flex;flex-direction:column;gap:8px;padding-bottom:12px}
.wa-fb-actions p{font-size:12px;line-height:1.5;margin:0}
#wa-attachment{padding:8px 16px;background:var(--surf);font-size:12px;color:var(--acc);font-weight:700}
#sec-wa .wa-compose{flex-shrink:0;align-items:flex-end;gap:8px;padding:10px 12px;background:var(--surf);border-top:1px solid var(--bdr)}
#sec-wa .wa-compose .inp{font-size:16px;line-height:22px;min-height:44px;max-height:104px;padding:11px 14px;border-radius:22px;background:var(--bg);border:1px solid var(--bdr);resize:none}
#sec-wa .wa-compose .btn{width:46px;min-height:46px;border-radius:50%;background:var(--acc-fill);color:var(--btn-primary-text)}
#sec-wa .wa-compose .btn:disabled{opacity:.45}
body.wa-keyboard #apphdr,body.wa-keyboard #appnav{visibility:hidden}
/* Hors clavier, le fil suit l’en-tête et les onglets (fenêtre de mise en page) ; au clavier, la zone visible, sous la barre d’état et le bandeau. */
body.wa-keyboard #wa-thread-wrap{top:calc(var(--vvtop,0px) + env(safe-area-inset-top) + var(--env-height,0px));bottom:auto;height:calc(var(--vvh,100dvh) - env(safe-area-inset-top) - var(--env-height,0px))}
/* Un bandeau de file ou de données reste sous l’en-tête masqué : au clavier, le fil commence sous lui. */
body.wa-keyboard.has-banners #wa-thread-wrap{top:calc(var(--vvtop,0px) + 52px + env(safe-area-inset-top) + var(--env-height,0px) + var(--banners-height,0px));height:calc(var(--vvh,100dvh) - 52px - env(safe-area-inset-top) - var(--env-height,0px) - var(--banners-height,0px))}
.wa-new-modal{padding:20px!important;background:var(--bg);color:var(--txt);border:1px solid var(--bdr);width:calc(100% - 20px);max-width:520px;max-height:calc(var(--vvh,100dvh) - 32px - env(safe-area-inset-top));border-radius:24px}
/* Calée sur le bas de la zone VISIBLE : pendant la recherche, les résultats restent au-dessus du clavier. */
dialog.wa-new-modal{top:auto;bottom:calc(100% - var(--vvtop,0px) - var(--vvh,100%));margin:0 auto}
.wa-new-modal[open]{display:flex;flex-direction:column}
.wa-new-header{display:flex;gap:12px;align-items:center;justify-content:space-between;flex-shrink:0}
.wa-new-header h2{font:400 26px Georgia,serif;margin:0 0 16px}
.wa-new-modal>.inp{font-size:16px;min-height:48px;flex-shrink:0}
#wa-new-list{overflow:auto;overscroll-behavior:contain;min-height:0;margin-top:10px}
.wa-contact{width:100%;display:flex;gap:12px;align-items:center;background:none;border:0;border-bottom:1px solid var(--bdr);padding:14px 0;color:var(--txt);font:inherit;text-align:left;cursor:pointer}
.wa-contact>span:nth-child(2){flex:1;min-width:0}
.wa-contact strong{display:block;font-size:14px;overflow-wrap:anywhere}
.wa-contact small{display:block;font-size:12px;color:var(--txt2);margin-top:4px}
@media(prefers-reduced-motion:no-preference){#sec-wa .wa-conv,#sec-wa .wa-filters button{transition:background .15s ease}#sec-wa .wa-conv:active{background:var(--surf2)}}

body.wa-keyboard #wa-link-row{display:none}

/* Planifier — même identité PUCACE, composition et contrôles propres à cet onglet. */
body.planning-active .inner{padding-top:8px}
#sec-plan{padding-bottom:0}
#sec-plan .plan-heading{margin:4px 0 16px}
#sec-plan .plan-heading>div{display:flex;justify-content:space-between;align-items:center;gap:12px;margin-top:5px}
#sec-plan h1{font:400 32px/1.2 Georgia,serif;letter-spacing:-.6px;margin:0}
#sec-plan .plan-heading p{font-size:12px;color:var(--txt2);margin:7px 0 0}
#sec-plan .btn{font-family:var(--font-text);border-radius:24px;min-height:44px;box-shadow:none}
#sec-plan .btn-secondary{background:var(--surf);color:var(--txt);border:1px solid var(--bdr);padding:9px 14px;font-size:12px;gap:7px}
#sec-plan fieldset{padding:0;margin:0;border:0;min-width:0}
#sec-plan .plan-section-heading{display:flex;align-items:center;justify-content:space-between;gap:12px;margin-bottom:12px}
#sec-plan h2{font-size:15px;line-height:1.4;font-weight:700;margin:0;text-transform:none}
#sec-plan .plan-section-heading>span{font-size:10px;color:var(--txt2)}
#sec-plan .plan-day{margin-bottom:16px}
#sec-plan #ip-chosen-day{font-family:Georgia,serif;font-size:21px;font-weight:400;text-transform:capitalize;max-width:48%}
#sec-plan .plan-date{min-width:0;max-width:51%}
#sec-plan .plan-date input{font-size:12px;padding:10px 8px;background:var(--surf);border:1px solid var(--bdr);border-radius:12px;max-width:100%;min-height:44px;color:var(--txt);box-sizing:border-box}
#sec-plan #ip-daybtns{gap:7px;margin:0;padding:4px;--fade:24px}
#sec-plan .daybtn{min-height:48px;padding:10px 15px;font-size:12px;border-radius:24px;background:var(--surf);border:1px solid var(--bdr)!important;color:var(--txt)}
#sec-plan .daybtn.sel{border-color:var(--acc-fill)!important}
#sec-plan .plan-day-summary{display:flex;flex-wrap:wrap;align-items:center;gap:5px 9px;padding:12px 0 0;font-size:11px;color:var(--txt2)}
#sec-plan .plan-day-summary strong{color:var(--txt);font-size:11px}
#sec-plan .plan-stock{background:var(--surf);padding:12px;border:1px solid var(--bdr);border-radius:20px;margin-bottom:18px}
#sec-plan .plan-stock select{background:var(--bg);color:var(--txt);min-height:46px;border:1px solid var(--bdr);border-radius:12px;padding:10px 30px 10px 10px;font-size:12px;width:100%;text-overflow:ellipsis}
#sec-plan .plan-stock-values{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:8px;margin:8px 0}
#sec-plan .plan-stock-values>span{color:var(--txt2);font-size:10px;line-height:1.5}
#sec-plan .plan-stock-values strong{display:block;color:var(--txt);font-size:19px;line-height:1.25;font-weight:700;margin-top:3px;overflow-wrap:anywhere}
#sec-plan .plan-stock-values small{font-size:11px;font-weight:500}
#sec-plan .plan-stock-values>span:last-child strong{color:var(--acc-deep)}
#sec-plan progress{appearance:none;display:block;width:100%;height:5px;border:0;border-radius:10px;background:var(--surf3);overflow:hidden}
#sec-plan progress::-webkit-progress-bar{background:var(--surf3)}
#sec-plan progress::-webkit-progress-value{background:var(--acc-fill);border-radius:10px}
#sec-plan progress::-moz-progress-bar{background:var(--acc-fill)}
#sec-plan .plan-stock-note{font-size:11px;color:var(--txt2);margin:6px 0 0;line-height:1.5}
#sec-plan .plan-warning{color:var(--rose-deep)}
#sec-plan .plan-search{display:flex;align-items:center;gap:10px;background:var(--surf);border:1px solid var(--bdr);border-radius:16px;padding:0 14px;min-height:52px}
#sec-plan .plan-search>svg{height:19px;width:19px;fill:none;stroke:currentColor;color:var(--txt2);flex:0 0 19px}
#sec-plan .plan-search input{height:50px;min-width:0;flex:1;border:0;border-radius:0;background:transparent!important;padding:8px 0;box-shadow:none;font-size:16px;color:var(--txt)}
#sec-plan .plan-filters{display:flex;align-items:center;gap:6px;margin:11px 0;position:relative}
#sec-plan .plan-filters>button,#sec-plan .plan-filters summary{display:flex;align-items:center;justify-content:center;min-height:44px;padding:8px 12px;border:1px solid transparent;border-radius:24px;font-size:11px;font-weight:600;background:transparent;color:var(--txt2);cursor:pointer;box-sizing:border-box;white-space:nowrap}
#sec-plan .plan-filters>button[aria-pressed=true]{background:var(--acc-tint);color:var(--acc-deep);border-color:var(--bdr)}
#sec-plan .plan-filters details{margin-left:auto}
#sec-plan .plan-filters summary::-webkit-details-marker{display:none}
#sec-plan #ip-alpha{position:absolute;top:50px;left:0;right:0;z-index:25;display:flex;flex-wrap:wrap;gap:6px;padding:12px;background:var(--surf);border:1px solid var(--bdr);border-radius:14px;box-shadow:0 8px 20px #0001}
#sec-plan .alpha-btn{min-height:44px;min-width:44px;border-radius:12px}
#sec-plan .plan-row{display:block;padding:0;margin:0;border:0;border-bottom:1px solid var(--bdr);border-radius:0;background:transparent;cursor:default}
#sec-plan .plan-row.checked{background:transparent;border-color:var(--bdr)}
#sec-plan .plan-client-main{display:flex;align-items:center;gap:10px;min-height:78px;padding:10px 0}
#sec-plan .plan-info{display:flex;align-items:center;flex:1;min-width:0;gap:10px;text-align:left;background:none;border:0;padding:0;min-height:52px;cursor:pointer;color:var(--txt)}
#sec-plan .plan-info>span:last-child{flex:1;min-width:0}
#sec-plan .checkbox{flex:0 0 24px;width:24px;height:24px;border-radius:8px;display:flex;align-items:center;justify-content:center;border:1.5px solid var(--bdr2);background:var(--surf);box-sizing:border-box}
#sec-plan .checkbox svg{width:17px;height:17px;stroke:transparent;fill:none}
#sec-plan .checked .checkbox{background:var(--acc-fill);border-color:var(--acc-fill)}
#sec-plan .checked .checkbox svg{stroke:var(--btn-primary-text)}
#sec-plan .plan-name{display:block;font-size:13px;font-weight:700;line-height:1.5;overflow-wrap:anywhere}
#sec-plan .plan-meta{display:block;font-size:11px;line-height:1.5;color:var(--txt2);white-space:normal;margin-top:3px}
#sec-plan .plan-weight{display:flex;align-items:center;flex:0 0 92px;gap:5px;background:var(--surf);border:1px solid var(--bdr2);border-radius:12px;padding-right:8px;height:48px;color:var(--txt2);font-size:12px}
#sec-plan .plan-kg-input{width:60px;min-width:0;flex:1;height:46px;min-height:44px;margin:0;padding:8px 2px 8px 6px;font-size:16px;font-family:var(--font-text);font-weight:700;text-align:center;border:0;background:transparent;color:var(--txt);border-radius:12px;box-shadow:none}
#sec-plan .plan-weight:has([aria-invalid=true]){border-color:var(--rose-deep)}
#sec-plan .plan-client-details{margin:0 0 10px 34px}
#sec-plan .plan-client-details summary{display:flex;justify-content:space-between;align-items:center;gap:8px;min-height:44px;font-size:11px;color:var(--txt2);list-style:none;cursor:pointer}
#sec-plan .plan-client-details summary span{color:var(--acc-deep);font-weight:700}
#sec-plan .plan-passage{display:flex;flex-wrap:wrap;gap:8px;padding:5px 0 12px}
#sec-plan .plan-passage button{flex:1;font-size:11px;padding:8px}
#sec-plan .plan-passage button[aria-pressed=true]{background:var(--acc-tint);border-color:var(--acc);color:var(--acc-deep)}
#sec-plan .plan-passage label{display:flex;align-items:center;justify-content:space-between;gap:12px;width:100%;font-size:12px}
#sec-plan .plan-passage input{min-height:44px;width:135px;background:var(--surf);color:var(--txt);border:1px solid var(--bdr);border-radius:10px;padding:8px}
#sec-plan .plan-empty{font-size:13px;color:var(--txt2);padding:24px 0;line-height:1.6}
#sec-plan .plan-assignment{padding:10px 0;border-bottom:1px solid var(--bdr);margin-top:15px}
#sec-plan .plan-assignment summary{min-height:44px;display:flex;align-items:center;font-size:12px;color:var(--txt2);cursor:pointer}
#sec-plan .plan-assignment label{font-size:12px;display:block;margin:8px 0}
#sec-plan .plan-assignment select{margin-bottom:12px;background:var(--surf);color:var(--txt);border:1px solid var(--bdr);min-height:48px}
#sec-plan #plan-departure{margin-top:20px;background:var(--surf);border-color:var(--bdr);border-radius:16px}
#sec-plan .ip-bar{margin:12px -16px -1px;padding:12px 16px 14px;border-radius:20px 20px 0 0;background:var(--surf);border:1px solid var(--bdr);border-bottom:0;box-shadow:0 -8px 22px #43302508}
#sec-plan .ip-bar-head{align-items:center;margin-bottom:10px}
#sec-plan .ip-bar-day{font-size:10px;text-transform:none;letter-spacing:0}
#sec-plan .ip-bar-sum{font-size:13px;line-height:1.5;font-family:var(--font-text);margin-top:2px;font-weight:700}
#sec-plan .ip-bar-reset{font-size:11px;padding:8px 12px;color:var(--txt2);background:transparent;border:0}
#sec-plan .ip-bar-go{font-size:14px;font-weight:700;min-height:50px;border-radius:26px}
#sec-plan .ip-bar-why{font-size:11px;line-height:1.5;text-align:left;margin:0 0 10px;color:var(--rose-deep)}
#sec-plan .plan-result:empty{display:none}
#sec-plan .plan-result{display:flex;flex-direction:column;gap:8px;padding:16px;border-radius:16px;background:var(--acc-tint);color:var(--txt);font-size:13px;line-height:1.5;margin:0 0 18px}
#sec-plan .plan-result p{margin:0}
#sec-plan .plan-result>span{font-size:12px;color:var(--txt2)}
#sec-plan .sr-only{position:absolute!important;width:1px!important;height:1px!important;padding:0!important;margin:-1px!important;overflow:hidden!important;clip:rect(0,0,0,0)!important;white-space:nowrap!important;border:0!important}
#sec-plan .plan-heading{display:block;padding:0;background:none;border:0;height:auto;position:static}
#sec-plan .plan-info{flex-direction:row;justify-content:flex-start;align-self:auto;margin:0}

#sec-plan .plan-stock .plan-section-heading{margin-bottom:8px}
body.list-keyboard #apphdr,body.list-keyboard #appnav{visibility:hidden}
/* Au clavier, la liste occupe la zone visible, sous la barre d’état et le bandeau d’environnement. */
body.list-keyboard #appscroll{position:fixed;top:calc(var(--vvtop,0px) + env(safe-area-inset-top) + var(--env-height,0px));left:env(safe-area-inset-left,0px);right:env(safe-area-inset-right,0px);bottom:auto;height:calc(var(--vvh,100dvh) - env(safe-area-inset-top) - var(--env-height,0px))}
/* La barre d’action tient sur une ligne : entière, elle prenait le tiers de la zone visible et recouvrait les clients trouvés. */
body.list-keyboard #sec-plan .ip-bar{display:grid;grid-template-columns:minmax(0,1fr) auto;align-items:center;column-gap:12px;padding:8px 16px}
body.list-keyboard #sec-plan .ip-bar-head{margin:0}
body.list-keyboard #sec-plan .ip-bar-day,body.list-keyboard #sec-plan .ip-bar-reset{display:none}
body.list-keyboard #sec-plan .ip-bar-why{grid-area:1/1/2/-1;margin:0 0 6px}
body.list-keyboard #sec-plan .ip-bar-go{width:auto;min-height:44px;margin:0;padding:0 18px}

/* Lots — les chiffres utiles avant les détails de production. */
body.lots-active .inner{padding-top:8px}
#sec-lots .lots-heading{display:block;position:static;height:auto;padding:0;background:none;border:0;box-shadow:none}
#sec-lots .lots-heading p{font-size:12px;color:var(--txt2);margin:12px 0 4px}
#sec-lots .lots-heading h1{font:38px/1.12 Georgia,serif;letter-spacing:-1px;margin:0 0 20px;color:var(--txt)}
#sec-lots .lots-stock{border-left:3px solid var(--acc);padding:2px 0 2px 16px;margin-bottom:20px}
.lots-eyebrow{font-size:10px;font-weight:700;letter-spacing:.06em;color:var(--txt2)}
#sec-lots .lots-stock>div{display:flex;align-items:baseline;gap:8px;margin:4px 0}
#sec-lots .lots-stock strong{font-size:44px;line-height:1.2;letter-spacing:-2px;color:var(--acc-deep);font-weight:700;font-variant-numeric:tabular-nums}
#sec-lots .lots-stock>div>span{font-size:20px;color:var(--acc-deep)}
#sec-lots .lots-stock p{font-size:11px;line-height:1.5;color:var(--txt2);margin:0}
#sec-lots .btn,.lot-dialog .btn{min-height:46px;border-radius:12px;font-family:var(--font-text);font-size:13px;font-weight:700}
#sec-lots .btn-primary,.lot-dialog .btn-primary{background:var(--acc);color:var(--on-acc,#fff);border-color:var(--acc)}
#sec-lots .btn-secondary,.lot-dialog .btn-secondary{background:var(--surf);color:var(--txt);border-color:var(--bdr)}
#sec-lots #lots-new{width:100%;border-radius:26px;min-height:52px;margin-bottom:20px}
#sec-lots [hidden],.lot-dialog [hidden]{display:none!important}
#sec-lots .lots-filter{display:flex;gap:6px;padding:4px;background:var(--surf2);border-radius:28px}
#sec-lots .lots-filter button{flex:1;border:0;background:transparent;min-height:44px;border-radius:24px;font:700 13px var(--font-text);color:var(--txt2);cursor:pointer}
#sec-lots .lots-filter button[aria-pressed=true]{background:var(--surf);color:var(--txt);box-shadow:0 2px 5px #43302510}
#sec-lots .lots-sort-bar{display:flex;justify-content:flex-end;gap:4px;padding:6px 0;margin:0}
#sec-lots .lots-sort-bar button{border:0;background:transparent;color:var(--txt2);font:11px var(--font-text);padding:8px;min-height:44px;border-radius:8px}
#sec-lots .lots-sort-bar button[aria-pressed=true]{color:var(--acc-deep);font-weight:800;text-decoration:underline;text-underline-offset:5px}
#sec-lots .lot-card{padding:18px;background:var(--surf);border:1px solid var(--bdr);border-radius:20px;margin:0 0 14px;box-shadow:none}
#sec-lots .lots-card-head{display:flex;align-items:flex-start;justify-content:space-between;gap:8px}
#sec-lots .lots-card-head h2{font:700 14px var(--font-text);margin:5px 0 0;overflow-wrap:anywhere;letter-spacing:0}
#sec-lots .lots-state{font-size:10px;font-weight:700;padding:6px 8px;background:var(--acc-tint);color:var(--acc-deep);border-radius:20px;white-space:nowrap}
#sec-lots .lots-state.alert{background:var(--rose-bg);color:var(--rose-deep)}
#sec-lots .lots-balance{display:flex;align-items:baseline;gap:8px;margin:18px 0 12px;flex-wrap:wrap}
#sec-lots .lots-balance strong{font-size:26px;line-height:1;font-weight:700;letter-spacing:-1px;color:var(--txt)}
#sec-lots .lots-balance small{font-size:14px;letter-spacing:0}
#sec-lots .lots-balance>span{font-size:11px;color:var(--txt2)}
#sec-lots .lots-track{height:6px;background:var(--acc-tint);border-radius:8px;display:flex;overflow:hidden}
#sec-lots .lots-track i:first-child{background:var(--acc)}
#sec-lots .lots-track i:nth-child(2){background:var(--amber)}
#sec-lots dl{margin:12px 0;display:flex;justify-content:space-between;gap:8px}
#sec-lots dl div{min-width:0}
#sec-lots dt{font-size:10px;color:var(--txt2);margin-bottom:4px}
#sec-lots dd{font-size:12px;font-weight:700;margin:0;color:var(--txt)}
#sec-lots .lots-date{font-size:11px;color:var(--txt2);margin:14px 0}
#sec-lots .lots-date.alert,#sec-lots .lots-warning{color:var(--rose-deep)}
#sec-lots .lots-warning{font-size:11px;line-height:1.5;margin:8px 0}
#sec-lots .lots-plan{display:flex;justify-content:space-between;width:100%;margin:12px 0 8px;padding-inline:15px}
#sec-lots .lots-tools{display:flex;gap:8px}
#sec-lots .lots-tools>*{flex:1}
#sec-lots .lots-detail{border-top:1px solid var(--bdr);margin-top:14px;padding-top:4px}
#sec-lots summary,.lot-dialog summary{list-style:none;display:flex;justify-content:space-between;align-items:center;gap:8px;min-height:44px;cursor:pointer;color:var(--txt);font-size:11px}
#sec-lots summary::-webkit-details-marker,.lot-dialog summary::-webkit-details-marker{display:none}
#sec-lots summary:after,.lot-dialog summary:after{content:'+';font-size:16px}
#sec-lots details[open]>summary:after,.lot-dialog details[open]>summary:after{content:'−'}
#sec-lots summary span{margin-left:auto;color:var(--txt2);font-size:10px}
#sec-lots .lots-detail dl{display:grid;grid-template-columns:1fr 1fr;gap:12px}
#sec-lots .lots-delete{color:var(--rose-deep);background:transparent;padding-inline:0}
#sec-lots #lots-costs{margin:18px 0}
#sec-lots #lots-costs p,#sec-lots .lots-empty{font-size:12px;line-height:1.6;color:var(--txt2)}
#sec-lots .lots-pending:empty{display:none}
#sec-lots .lots-pending{padding:14px;background:var(--amber-bg);border-radius:14px;margin-bottom:16px;font-size:12px;line-height:1.5}
.lot-dialog{position:fixed;inset:auto 0 auto;top:calc(var(--vvtop,0px) + var(--vvh,100dvh));transform:translateY(-100%);margin:0 auto;padding:0;border:1px solid var(--bdr);border-bottom:0;background:var(--bg);color:var(--txt);border-radius:24px 24px 0 0;width:100%;max-width:520px;max-height:calc(var(--vvh,100dvh) - 12px - env(safe-area-inset-top));overflow:hidden}
.lot-dialog::backdrop{background:#21191075}
.lot-dialog form{display:flex;flex-direction:column;max-height:calc(var(--vvh,100dvh) - 12px - env(safe-area-inset-top))}
.lot-dialog header{display:block;position:static;height:auto;background:none;border:0;box-shadow:none;padding:22px 20px 12px;flex-shrink:0}
.lot-dialog h2{font:27px/1.15 Georgia,serif;letter-spacing:-.6px;margin:7px 0 0;outline:none}
.lot-dialog .lot-form-scroll{overflow-y:auto;padding:0 20px;overscroll-behavior:contain;scroll-padding:16px}
.lot-dialog fieldset{border:0;padding:0;margin:0;min-width:0}
.lot-dialog .field{margin:12px 0}
.lot-dialog label{display:block;font-size:12px;font-weight:600;color:var(--txt);margin-bottom:7px;line-height:1.5}
.lot-dialog .inp{background:var(--surf);border:1px solid var(--bdr2);color:var(--txt);border-radius:12px;font:16px var(--font-text);min-height:48px;width:100%;min-width:0;padding:10px 12px}
.lot-dialog .lot-produced input{font-size:26px;font-weight:700;min-height:64px}
.lot-dialog .lot-produced label span{float:right;color:var(--txt2)}
.lot-dialog p{font-size:11px;color:var(--txt2);line-height:1.6;margin:8px 0}
.lot-dialog .lot-dates{display:grid;grid-template-columns:1fr 1fr;gap:12px}
.lot-dialog .lot-dates label{font-size:11px}
.lot-dialog #lot-cost-fields{border-top:1px solid var(--bdr);margin:18px 0 10px;padding-top:4px}
.lot-dialog summary{font-size:12px;font-weight:700}
.lot-dialog summary span{margin-left:auto;color:var(--txt2);font-weight:400;font-size:10px}
.lot-dialog footer{flex-shrink:0;padding:10px 20px max(12px,env(safe-area-inset-bottom));background:var(--bg);border-top:1px solid var(--bdr)}
.lot-dialog footer .btn{width:100%;margin-top:4px}
.lot-dialog #lot-save{border-radius:26px;min-height:50px}
.lot-dialog #lot-cancel{background:transparent;color:var(--txt2)}
.lot-dialog #lot-form-error{color:var(--rose-deep);margin:0 0 8px}
.lot-dialog #lot-form-error:empty{display:none}
#ed-conflict{color:var(--rose-deep);margin:0 0 8px}#ed-conflict p{margin:0 0 6px}
.lot-dialog .lot-ingredient{display:flex;gap:5px;margin:8px 0}
.lot-dialog .lot-ingredient input:first-child{flex:1;width:0}
.lot-dialog .lot-ingredient input:nth-child(2){width:78px}
.lot-dialog .lot-ingredient button{width:44px;flex-shrink:0;padding:0;font-size:22px}
body.lots-active #m-label-preview .modal{background:var(--bg);color:var(--txt);border-radius:24px 24px 0 0}
@media(max-height:500px){.lot-dialog header{padding:12px 20px 8px}.lot-dialog header .lots-eyebrow{display:none}.lot-dialog h2{font-size:21px}.lot-dialog footer{padding-top:6px}.lot-dialog #lot-cancel{min-height:36px}}

/* Dashboard PUCACE — vue du jour, actions puis détails. */
body.dashboard-active .inner{padding-top:12px}
#sec-dash{padding-bottom:24px}
#sec-dash [hidden]{display:none!important}
#sec-dash h1,#sec-dash h2,.dash-forecast-modal h2{font-family:Georgia,'Times New Roman',serif;font-weight:400;letter-spacing:-.5px;color:var(--txt)}
.dash-heading{display:flex;justify-content:space-between;align-items:center;padding:10px 0 22px;gap:12px}
.dash-heading h1{font-size:30px;margin:6px 0 8px;line-height:1.1}
.dash-heading p{font-size:12px;color:var(--txt2);margin:0;text-transform:capitalize}
.dash-eyebrow{font-size:9px;letter-spacing:1.25px;font-weight:800;line-height:1.5;color:var(--txt2)}
.dash-flower{font-size:42px;color:var(--acc);font-family:Georgia,serif}
.dash-card{background:var(--surf);border:1px solid var(--bdr);border-radius:22px;padding:20px;margin-bottom:16px}
.dash-tour{border-top:3px solid var(--acc);padding-top:18px}
.dash-tour h2{font-size:24px;line-height:1.12;margin:10px 0 18px}
#dash-progress{display:flex;align-items:baseline;gap:12px;color:var(--txt2);font-size:11px}
#dash-progress strong{font-family:Manrope,Arial,sans-serif;font-size:36px;letter-spacing:-1.6px;color:var(--txt);font-variant-numeric:tabular-nums;line-height:1}
#dash-progress strong span{font-size:22px;font-weight:500;color:var(--txt3)}
#dash-progress-bar{display:block;appearance:none;width:100%;height:6px;border:0;border-radius:10px;overflow:hidden;margin:13px 0;background:var(--surf2);color:var(--acc)}
#dash-progress-bar::-webkit-progress-bar{background:var(--surf2)}
#dash-progress-bar::-webkit-progress-value{background:var(--acc);border-radius:10px}
#dash-progress-bar::-moz-progress-bar{background:var(--acc);border-radius:10px}
.dash-caption{font-size:11px;color:var(--txt2);line-height:1.65;margin:10px 0}
#sec-dash .dash-next{width:100%;display:grid;grid-template-columns:minmax(0,1fr) 20px;gap:12px;border:1px solid var(--bdr);border-radius:16px;background:var(--bg);padding:15px;text-align:left;cursor:pointer;color:var(--txt);margin:16px 0 0;font:inherit;box-shadow:none}
.dash-next>span{display:flex;flex-direction:column;gap:5px;min-width:0}
.dash-next small{font-size:9px;letter-spacing:1px;font-weight:800;color:var(--acc)}
.dash-next strong{font-size:16px;line-height:1.4;overflow-wrap:anywhere}
.dash-next>span>span{font-size:11px;line-height:1.5;color:var(--txt2);overflow-wrap:anywhere}
.dash-next>svg{width:18px;height:18px;align-self:center}
.dash-next>b{grid-column:1/-1;display:flex;justify-content:space-between;border-top:1px solid var(--bdr);padding-top:12px;font-size:12px;color:var(--acc)}
.dash-primary{width:100%;min-height:48px;margin:16px 0 0;white-space:normal;line-height:1.4;justify-content:space-between}
.dash-disclosure summary{list-style:none;display:flex;justify-content:space-between;align-items:center;gap:10px;font-size:13px;font-weight:700;cursor:pointer;min-height:48px}
.dash-disclosure summary::-webkit-details-marker{display:none}
.dash-disclosure summary:after{content:'+';font-size:20px;font-weight:400;color:var(--acc)}
.dash-disclosure[open]>summary:after{content:'−'}
#dashboard-bilan{margin-top:10px;border-top:1px solid var(--bdr)}
#dashboard-bilan>summary{font-size:11px}
.dash-balance{margin:0;display:grid;gap:10px}
.dash-balance>div{display:flex;gap:12px;justify-content:space-between;font-size:12px}
.dash-balance dd{margin:0;font-weight:800;font-variant-numeric:tabular-nums}
.dash-links{display:flex;flex-wrap:wrap;gap:4px 12px}
.dash-links button{font:inherit;font-size:11px;font-weight:800;color:var(--acc);padding:12px 0;min-height:44px;border:0;background:transparent;cursor:pointer;text-decoration:underline;text-underline-offset:4px}
.dash-metrics{display:grid;grid-template-columns:1fr 1fr;gap:12px;margin-bottom:16px}
.dash-metric{display:flex;flex-direction:column;gap:8px;text-align:left;background:var(--surf);border:1px solid var(--bdr);border-radius:18px;padding:16px 13px;color:var(--txt);font:inherit;min-width:0;cursor:pointer}
.dash-metric>strong{font-size:22px;font-weight:800;letter-spacing:-.8px;font-variant-numeric:tabular-nums;overflow-wrap:anywhere}
.dash-metric>span:not(.dash-eyebrow),.dash-metric>small{font-size:10px;line-height:1.5;color:var(--txt2)}
.dash-metric>b{font-size:11px;color:var(--acc);display:flex;justify-content:space-between;gap:4px;margin-top:auto;padding-top:4px}
.dash-followup{display:grid;gap:8px;margin-bottom:16px}
.dash-followup:empty{display:none}
.dash-follow-row,.dash-message-row{font:inherit;display:flex;align-items:center;gap:12px;width:100%;text-align:left;border:1px solid var(--bdr);border-radius:16px;padding:14px;background:var(--surf);color:var(--txt);cursor:pointer}
.dash-follow-row>span:nth-child(2),.dash-message-row>span{flex:1;display:flex;flex-direction:column;gap:4px;min-width:0}
.dash-follow-row strong,.dash-message-row strong{font-size:12px;font-weight:700;line-height:1.4}
.dash-follow-row small,.dash-message-row small{font-size:11px;color:var(--txt2);line-height:1.4}
.dash-follow-row svg,.dash-message-row svg,.dash-section-head>svg{width:20px;height:20px;flex:none;color:var(--acc)}
.dash-follow-count{font-size:16px;font-weight:800;color:var(--txt);background:var(--surf2);border-radius:10px;min-width:32px;padding:6px;text-align:center}
.dash-message-row{margin-bottom:22px;background:transparent;border-style:dashed}
.dash-section-head{display:flex;justify-content:space-between;align-items:center;gap:12px}
.dash-card h2{font-size:21px;margin:10px 0 14px;line-height:1.25}
.dash-forecast-number{display:flex;align-items:baseline;gap:12px}
.dash-forecast-number>strong{font-size:30px;letter-spacing:-1px;white-space:nowrap}
.dash-forecast-number small{font-size:16px}
.dash-forecast-number>span{font-size:11px;color:var(--txt2)}
.dash-warning{font-size:12px;line-height:1.55;padding:12px;border-radius:12px;background:var(--amber-bg);color:var(--amber-deep);border:1px solid var(--bdr)}
#dash-analysis,#d-relaunch-section{padding-top:8px;padding-bottom:8px}
#dash-analysis[open],#d-relaunch-section[open]{padding-bottom:20px}
#dash-analysis .trend-card{padding:0;border:0;box-shadow:none;background:transparent}
.dash-trends{width:100%;border-collapse:collapse;font-size:11px;font-variant-numeric:tabular-nums}
.dash-trends th,.dash-trends td{padding:12px 5px;border-bottom:1px solid var(--bdr);text-align:right}
.dash-trends th:first-child{text-align:left}
.dash-trends th{font-weight:600;color:var(--txt2)}
.dash-trends th small{display:block;font-size:9px}
.dash-trends .current{background:var(--surf2)}
#dash-analysis .stab{min-height:44px;padding:6px 10px;font-size:11px}
#dash-analysis .list-row,#d-relaunch-section .list-row{padding-inline:0}
#dash-production-detail{font-size:12px;line-height:1.6}
#d-relaunch-section .btn{min-height:44px!important}
.dash-forecast-modal{background:var(--bg);color:var(--txt);border-radius:24px;padding:22px;max-height:min(85dvh,var(--vvh,85dvh));max-width:480px;width:calc(100% - 24px);overflow:auto}
.dash-forecast-modal li{margin:8px 0;font-size:13px;line-height:1.5}
.dash-forecast-modal h3{font-size:15px}
.dash-forecast-modal>.btn{width:100%;min-height:48px;margin-top:16px}
@media(max-width:350px){.dash-card{padding-inline:15px}.dash-heading h1{font-size:27px}.dash-metric{padding:14px 10px}.dash-metric>strong{font-size:19px}.dash-eyebrow{font-size:8px;letter-spacing:1px}.dash-balance>div{font-size:11px}.dash-next strong{font-size:14px}.dash-trends{font-size:10px}}

/* Raccords et états de synchronisation : place réservée, aucun bouton recouvert. */
#app-banners{position:sticky;top:0;z-index:90}
#offline-badge,#data-status{position:static;left:auto;right:auto;transform:none;width:100%;border:0;border-bottom:1px solid var(--bdr);border-radius:0;padding:10px 16px;background:var(--acc-tint);color:var(--txt);font:600 12px/1.5 var(--font-text);text-align:left;cursor:pointer}
#subscreen-back{display:flex;align-items:center;gap:8px;min-height:44px;margin:0 0 8px;padding:0 4px;background:none;border:0;color:var(--acc);font:700 12px var(--font-text)}
#subscreen-back[hidden]{display:none}
#sec-cli .page-title-h1,#sec-compta .page-title-h1{font:400 28px/1.2 Georgia,serif;letter-spacing:-.5px}
#sec-compta .tabs .tab,#sec-compta .btn,#cli-hist-body .btn{min-height:44px}
#offline-resolution{padding:calc(18px + env(safe-area-inset-top)) 18px calc(24px + env(safe-area-inset-bottom));font-size:13px;line-height:1.6}
#offline-resolution h2{font:400 26px/1.2 Georgia,serif;margin:20px 0 12px}
#offline-resolution h3{font-size:14px;overflow-wrap:anywhere}
#offline-resolution .btn{min-height:44px;margin:4px 8px 4px 0}
body.pucace-app .mover{top:var(--vvtop,0px);bottom:auto;height:var(--vvh,100%)}
.modal[tabindex="-1"]:focus,.paysheet[tabindex="-1"]:focus,.imm-bottom-sheet-card[tabindex="-1"]:focus{outline:none}
/* Feuilles du bas : ni sous la barre d’état, ni sous la barre d’accueil (iPhone installé, Android bord à bord). */
body.pucace-app .mover .modal{max-height:calc(var(--vvh,100dvh) - 12px - env(safe-area-inset-top));padding-bottom:calc(20px + env(safe-area-inset-bottom,0px))}

/* Fenêtres centrées : dans la zone visible, clavier ouvert compris, et hors de la barre d’état. */
dialog.mdialog{top:calc(var(--vvtop,0px) + var(--vvh,100vh)/2);max-height:min(90vh,calc(var(--vvh,100vh) - 16px - 2*env(safe-area-inset-top)))}
/* Modifier livraison : « Annuler / Enregistrer » restent à portée ; un champ ramené à l’écran s’arrête au-dessus d’eux. */
dialog.mdialog#m-edel{padding-bottom:0;scroll-padding-bottom:84px}
#m-edel .modal-foot{position:sticky;bottom:0;margin:12px -20px 0;padding:12px 20px 16px;background:var(--surf);border-top:1px solid var(--bdr)}
#offline-resolution>button:first-child{float:right;background:var(--surf2);padding-inline:16px}
#offline-resolution h2{padding-top:52px;clear:both}
#offline-resolution [data-queue-id]{background:var(--surf);border:1px solid var(--bdr);border-radius:20px;padding:16px;margin-top:16px}
#offline-resolution [data-queue-id] h3{margin:0 0 8px;font-size:16px}
#offline-resolution [data-queue-id] details{margin:16px 0;color:var(--txt2)}
#offline-resolution [data-queue-id] .btn{background:var(--surf2);padding-inline:12px}
