:root{
  --bg:#f4f6f9; --card:#fff; --ink:#1f2937; --muted:#6b7280; --line:#e5e7eb;
  --accent:#2563eb; --navh:50px;
  --c-travail:#d9ead3; --c-cp:#cfe2f3; --c-f:#fce5cd; --c-at:#f4cccc;
  --c-am:#d9d2e9; --c-i:#e8e8e8; --c-autre:#fff2cc; --c-we:#f3f4f6;
  /* échéances formations/VM */
  --e-ko:#f4b6b6; --e-90:#fbd9a6; --e-180:#fdeeb3; --e-ok:#c7e9c0;
  --c-css:#cdeee6;   /* congé sans solde (30/10/2026) */
}
*{box-sizing:border-box}
html,body{margin:0;height:100%}
body{font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,Arial,sans-serif;
     background:var(--bg);color:var(--ink);font-size:13px}
.hidden{display:none !important}

/* ---- Login ---- */
.login{position:fixed;inset:0;display:flex;align-items:center;justify-content:center;
       background:linear-gradient(135deg,#eef2ff,#f4f6f9)}
.loginbox{background:#fff;border:1px solid var(--line);border-radius:14px;padding:28px;
          width:340px;box-shadow:0 10px 40px rgba(0,0,0,.08);text-align:center}
.loginbox h1{margin:0 0 6px;font-size:20px}
.loginbox p{margin:0 0 18px;color:var(--muted);font-size:12px}
.loginbox input{width:100%;padding:10px 12px;border:1px solid var(--line);border-radius:8px;font:inherit;margin-bottom:12px}
.loginbox button{width:100%}
.err{color:#dc2626;font-size:12px;margin-top:10px;min-height:16px}

/* ---- Header ---- */
header{background:var(--card);border-bottom:1px solid var(--line);padding:10px 16px;
       position:sticky;top:0;z-index:30;box-shadow:0 1px 3px rgba(0,0,0,.04)}
.row{display:flex;align-items:center;gap:10px;flex-wrap:wrap}
h1{font-size:16px;margin:0;font-weight:700}
h1 small{color:var(--muted);font-weight:500;margin-left:6px;font-size:12px}
button{font:inherit;border:1px solid var(--line);background:#fff;border-radius:8px;padding:6px 12px;cursor:pointer;color:var(--ink)}
button:hover{background:#f3f4f6}
button.primary{background:var(--accent);color:#fff;border-color:var(--accent)}
button.primary:hover{filter:brightness(.95)}
.nav{display:flex;align-items:center;gap:6px}
.weeklabel{font-weight:700;min-width:230px;text-align:center}
.weeklabel b{color:var(--accent)}
.spacer{flex:1}
input[type=search],select{font:inherit;padding:6px 10px;border:1px solid var(--line);border-radius:8px}
.chips{display:flex;gap:6px;flex-wrap:wrap}
.chip{padding:4px 10px;border:1px solid var(--line);border-radius:999px;cursor:pointer;background:#fff;font-size:12px}
.chip.on{background:var(--accent);color:#fff;border-color:var(--accent)}
.legend{display:flex;gap:14px;flex-wrap:wrap;color:var(--muted);font-size:12px;align-items:center}
.legend span{display:inline-flex;align-items:center;gap:5px}
.sw{width:13px;height:13px;border-radius:3px;border:1px solid rgba(0,0,0,.12);display:inline-block}

/* ---- Grille ---- */
.wrap{padding:14px 16px}
.count{color:var(--muted);font-size:12px;margin-bottom:8px}
/* zone de défilement propre : permet aux entêtes (thead) de rester figées */
#grid{max-height:calc(100vh - var(--navh) - 150px);overflow:auto;border:1px solid var(--line);
      border-radius:10px;background:var(--card)}
table{border-collapse:separate;border-spacing:0;width:100%;background:var(--card)}
th,td{border-right:1px solid var(--line);border-bottom:1px solid var(--line)}
thead th{background:#f9fafb;position:sticky;top:0;z-index:10;font-weight:600;padding:7px 8px;text-align:center;font-size:12px}
table.multi thead tr.wkrow th.wkhead{top:0}
/* en mode multi-semaines, la 2e ligne d'entête (jours) se colle sous la 1re */
table.multi thead tr:not(.wkrow) th{top:31px}
thead th.we{background:#eef0f3}
th.wkhead{background:#eef2ff;color:#3730a3;font-size:11px;letter-spacing:.3px}
.wsep{border-left:2px solid #c7cdd6}
.namecol{position:sticky;left:0;z-index:5;background:var(--card);text-align:left;padding:7px 10px;min-width:190px;max-width:190px;font-weight:600}
thead .namecol{z-index:15;background:#f9fafb}
.sect td{background:#eef2ff;color:#3730a3;font-weight:700;padding:5px 10px;position:sticky;left:0;z-index:4;text-transform:uppercase;letter-spacing:.4px;font-size:11px}
td.cell{height:34px;text-align:center;vertical-align:middle;font-size:11px;line-height:1.15;padding:2px 3px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:160px}
td.cell .cliname{display:block;overflow:hidden;text-overflow:ellipsis;font-weight:500}
td.cell .affnum{display:block;font-size:9px;color:#5b6470;font-variant-numeric:tabular-nums;
                overflow:hidden;text-overflow:ellipsis;margin-top:1px}
td.we{background:var(--c-we)}
td.travail{background:var(--c-travail)}
td.CP{background:var(--c-cp)} td.F{background:var(--c-f)} td.AT{background:var(--c-at)}
td.AM{background:var(--c-am)} td.I{background:var(--c-i)}
td.PER,td.AUTRE,td.RTT{background:var(--c-autre)}
td.ferie{box-shadow:inset 0 0 0 2px #f0a}
.name .tag{font-size:9px;border:1px solid var(--line);border-radius:4px;padding:0 4px;margin-left:6px;color:var(--muted);font-weight:600}
.name .comp{display:block;color:var(--muted);font-weight:400;font-size:10px;margin-top:1px}
.empty{color:#cbd5e1}
.pill{font-size:10px;background:rgba(0,0,0,.06);border-radius:999px;padding:0 5px;margin-left:3px}
footer{padding:10px 16px;color:var(--muted);font-size:11px;text-align:center}

/* ---- Édition : cases cliquables + popover ---- */
td.cell{cursor:pointer}
td.cell:hover{outline:2px solid var(--accent);outline-offset:-2px}
.modeedit td.cell{cursor:cell}
.toggle{display:flex;align-items:center;gap:6px;font-size:12px;color:var(--muted)}
/* identite connectee dans la barre de navigation */
.whoami{font-size:12px;color:#cbd5e1;padding:0 4px;white-space:nowrap}
/* Compte en LECTURE SEULE : on retire les commandes d'ecriture de l'interface.
   Le serveur refuse de toute facon toute modification (403). */
body.lecture-seule #dashAbs,
body.lecture-seule #dashNewCh,
body.lecture-seule #dashEditWrap,
body.lecture-seule #btnAddPers,
body.lecture-seule #btnMetiers,
body.lecture-seule #btnActivites,
body.lecture-seule #btnAddFor,
body.lecture-seule #btnScanAff,
body.lecture-seule #btnScanCli,
body.lecture-seule .dashtable button.addres,
body.lecture-seule .actcell button,
body.lecture-seule .tab[data-page="page-param"]{display:none !important}
body.lecture-seule .dashtable td.affcell:hover{outline:none}
.toggle input{margin:0}

.pop{position:fixed;z-index:100;background:#fff;border:1px solid var(--line);border-radius:12px;
     box-shadow:0 12px 40px rgba(0,0,0,.18);width:320px;padding:14px;font-size:13px}
.pop h3{margin:0 0 2px;font-size:14px}
.pop .who{color:var(--muted);font-size:12px;margin-bottom:10px}
.pop .seg{display:flex;gap:4px;margin-bottom:10px;background:#f3f4f6;padding:3px;border-radius:8px}
.pop .seg button{flex:1;border:none;background:transparent;padding:6px;border-radius:6px;font-size:12px}
.pop .seg button.on{background:#fff;box-shadow:0 1px 2px rgba(0,0,0,.1);font-weight:600}
.pop label{display:block;font-size:11px;color:var(--muted);margin:8px 0 3px}
.pop input,.pop select{width:100%;padding:7px 9px;border:1px solid var(--line);border-radius:8px;font:inherit}
.pop .affresult{max-height:150px;overflow:auto;border:1px solid var(--line);border-radius:8px;margin-top:4px}
.pop .affresult div{padding:6px 9px;cursor:pointer;border-bottom:1px solid var(--line)}
.pop .affresult div:hover{background:#eef2ff}
.pop .affresult div small{color:var(--muted);display:block}
.pop .grid2{display:grid;grid-template-columns:1fr 1fr;gap:6px}
.pop .abs-types{display:flex;flex-wrap:wrap;gap:5px}
.pop .abs-types button{flex:1 0 30%;padding:7px 4px;border:1px solid var(--line);border-radius:8px;background:#fff;font-size:12px;cursor:pointer}
.pop .abs-types button:hover{border-color:var(--accent)}
.pop .row2{display:flex;gap:8px;align-items:center;margin-top:10px}
.pop .actions{display:flex;justify-content:space-between;margin-top:12px;gap:8px}
.pop .actions .danger{color:#dc2626;border-color:#fca5a5}
.pop .hint{font-size:11px;color:var(--muted);margin-top:8px}
.backdrop{position:fixed;inset:0;z-index:90}
.saving{opacity:.5;pointer-events:none}
.pop .curaff{background:var(--c-travail);border:1px solid #9ec79a;border-radius:8px;
             padding:6px 9px;margin-bottom:10px;font-size:12px}
.pop .curaff small{color:var(--muted);margin-left:5px}
.toast{position:fixed;bottom:18px;left:50%;transform:translateX(-50%);background:#111827;color:#fff;
       padding:9px 16px;border-radius:10px;font-size:13px;z-index:200;opacity:0;transition:opacity .2s;
       max-width:min(92vw,900px);text-align:center}
.toast.show{opacity:1}
.toast.err{background:#b91c1c}

/* ============ Navigation multi-pages ============ */
.muted{color:var(--muted)}
.topnav{display:flex;align-items:center;gap:16px;background:#111827;color:#fff;
        padding:0 16px;height:var(--navh);position:sticky;top:0;z-index:50}
.topnav .brand{font-weight:700;font-size:15px}
.topnav .tabs{display:flex;gap:4px}
.topnav .tab{background:transparent;border:none;color:#cbd5e1;padding:8px 14px;border-radius:8px;
             cursor:pointer;font:inherit;font-size:13px}
.topnav .tab:hover{background:rgba(255,255,255,.08);color:#fff}
.topnav .tab.on{background:var(--accent);color:#fff;font-weight:600}
.topnav #logout{background:transparent;border:1px solid rgba(255,255,255,.25);color:#fff}
.topnav #logout:hover{background:rgba(255,255,255,.1)}

.page{display:block}
.page.hidden{display:none !important}
/* l'en-tête de jours du planning se cale sous la barre de nav */
.page thead th{top:var(--navh)}

/* en-tête de page (gestion) */
.pagehead{display:flex;align-items:center;gap:12px;padding:14px 16px;background:var(--card);
          border-bottom:1px solid var(--line);position:sticky;top:var(--navh);z-index:20;flex-wrap:wrap}
.pagehead h2{margin:0;font-size:17px}
.pagehead input[type=search]{min-width:240px}
.subhead{background:var(--card);border-bottom:1px solid var(--line);padding:10px 16px;
         position:sticky;top:var(--navh);z-index:20}

/* ============ Tables de gestion ============ */
/* Le tableau a son PROPRE défilement vertical : son en-tête se colle en
   haut du tableau (top:0), sans entrer en conflit avec .pagehead. */
.tablewrap{padding:14px 16px}
.tablewrap .scroll{max-height:calc(100vh - var(--navh) - 96px);overflow:auto;
                   border:1px solid var(--line);border-radius:10px;background:var(--card)}
table.grid{border-collapse:separate;border-spacing:0;width:100%;background:var(--card)}
table.grid th{background:#f9fafb;text-align:left;padding:9px 12px;font-size:12px;font-weight:600;
              position:sticky;top:0;z-index:5;border-bottom:2px solid var(--line);box-shadow:0 1px 0 var(--line)}
table.grid th.sortable{cursor:pointer;user-select:none;white-space:nowrap}
table.grid th.sortable:hover{background:#eef2ff;color:var(--accent)}

/* ---- Tableau Formations & VM ---- */
.forleg{font-size:11px;gap:10px}
table.forgrid th{white-space:nowrap;font-size:11px;padding:8px 8px}
table.forgrid td{font-size:12px;padding:6px 8px}
table.forgrid td.nm{position:sticky;left:0;background:#fff;z-index:2}
table.forgrid th:first-child{position:sticky;left:0;z-index:6}
td.ech{text-align:center;white-space:nowrap;font-variant-numeric:tabular-nums}
td.ech .empty{color:#cbd5e1}
td.ech.e-ko{background:var(--e-ko)}
td.ech.e-90{background:var(--e-90)}
td.ech.e-180{background:var(--e-180)}
td.ech.e-ok{background:var(--e-ok)}
/* echeances modifiables d'un clic (comptes en ecriture seulement) */
td.ech.modif{cursor:pointer}
td.ech.modif:hover{outline:2px solid var(--accent);outline-offset:-2px}
td.ech.maj{animation:echmaj 1.6s ease-out}
@keyframes echmaj{0%{box-shadow:inset 0 0 0 3px var(--accent)}100%{box-shadow:none}}
table.forgrid td.nm[data-row]{cursor:pointer}
table.forgrid td.nm i.ed{font-style:normal;opacity:.3;margin-left:6px;font-size:11px}
table.forgrid td.nm:hover i.ed{opacity:1}
#forTable .forhint{font-size:12px;color:var(--muted);margin:0 0 8px}
#forTable .forhint + .scroll{max-height:calc(100vh - var(--navh) - 126px)}
.pop.popech{width:285px}
.pop.popech .row2 button{flex:1;padding:7px 5px;border:1px solid var(--line);
  border-radius:8px;background:#fff;cursor:pointer;font-size:12px}
.pop.popech .row2 button:hover{border-color:var(--accent)}
@media print{#forTable .forhint,table.forgrid td.nm i.ed{display:none !important}}

/* ---- Évolution des effectifs (graphique) ---- */
.pagehead select{font:inherit;padding:5px 8px;border:1px solid var(--line);border-radius:8px;margin-left:6px}
.evowrap{padding:14px 16px}
.evolegend{display:flex;flex-wrap:wrap;gap:8px;margin-bottom:10px}
.evochip{display:inline-flex;align-items:center;gap:6px;padding:4px 11px;border:1px solid var(--line);
         border-radius:999px;cursor:pointer;font-size:12px;background:#fff;user-select:none}
.evochip i{width:12px;height:12px;border-radius:3px;display:inline-block}
.evochip.off{opacity:.4;text-decoration:line-through}
.evochip.ref{cursor:default;border-color:#f3b4b4;color:#c00000}
.evochip.evohatch{border-color:var(--line);color:#5b6470}
.evochip.evohatch i{background:repeating-linear-gradient(45deg,#7c8594 0 2px,#fff 2px 5px);border:1px solid #7c8594}
.evotools{display:flex;align-items:center;gap:8px;flex-wrap:wrap;margin-bottom:8px;font-size:13px}
.evotools button{padding:4px 10px;font-size:12px}
.pagehead input.evoseuil{font:inherit;width:72px;padding:5px 8px;border:1px solid var(--line);border-radius:8px;margin-left:6px}
.chartbox{background:var(--card);border:1px solid var(--line);border-radius:10px;
          height:calc(100vh - var(--navh) - 230px);min-height:320px;padding:8px}
.chartbox canvas{display:block;width:100%;height:100%;cursor:crosshair}
.evotip{position:fixed;z-index:200;display:none;background:#111827;color:#fff;font-size:12px;
        padding:8px 11px;border-radius:8px;box-shadow:0 6px 20px rgba(0,0,0,.3);pointer-events:none;
        line-height:1.5;white-space:nowrap}
table.grid td{padding:8px 12px;border-bottom:1px solid var(--line);font-size:13px;vertical-align:middle}
table.grid tbody tr:hover{background:#f8fafc}
table.grid tr.inactive{opacity:.5}
.badge{display:inline-block;font-size:11px;padding:1px 8px;border-radius:999px;background:#eef2ff;color:#3730a3}
.badge.ok{background:#dcfce7;color:#166534}
.badge.warn{background:#fef3c7;color:#92400e}
.pathcell{max-width:360px}
.path{display:block;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;color:var(--muted);font-size:11px}
.actcell{text-align:right;white-space:nowrap}
.actcell button{padding:4px 10px;font-size:12px}
.loading{padding:24px;text-align:center;color:var(--muted)}
.err2{padding:16px;background:#fef2f2;color:#b91c1c;border:1px solid #fecaca;border-radius:10px}

/* ============ Modale ============ */
.mbackdrop{position:fixed;inset:0;background:rgba(0,0,0,.35);z-index:150}
.modal{position:fixed;z-index:151;top:50%;left:50%;transform:translate(-50%,-50%);
       background:#fff;border-radius:14px;width:560px;max-width:94vw;max-height:90vh;overflow:auto;
       box-shadow:0 20px 60px rgba(0,0,0,.25)}
/* formulaires larges (chantier) : évite les bords rognés */
.modal.wide{width:920px}
.mhead{padding:16px 18px;border-bottom:1px solid var(--line)}
.mhead h3{margin:0;font-size:16px}
.mbody{padding:18px}
.mfoot{padding:14px 18px;border-top:1px solid var(--line);display:flex;gap:8px;align-items:center}
.mfoot .danger{color:#dc2626;border-color:#fca5a5}
.grid2{display:grid;grid-template-columns:1fr 1fr;gap:12px}
.grid2 label{display:block;font-size:11px;color:var(--muted);margin-bottom:3px}
.grid2 input,.grid2 select{width:100%;padding:8px 10px;border:1px solid var(--line);border-radius:8px;font:inherit}
.grid2 input:disabled{background:#f3f4f6;color:var(--muted)}
.ckrow{display:flex;flex-wrap:wrap;gap:14px;margin-top:16px;padding-top:14px;border-top:1px dashed var(--line)}
.ck{display:flex;align-items:center;gap:6px;font-size:13px}
.ck input{margin:0}
/* bouton discret facon lien (actions secondaires dans les formulaires) */
.lnk{border:none;background:none;color:var(--accent);cursor:pointer;font-size:11px;
  padding:2px 0;text-decoration:underline;margin-top:3px}
.metadd{display:flex;gap:8px;align-items:center}
.metadd input{padding:8px 10px;border:1px solid var(--line);border-radius:8px;font:inherit}
/* pastille de couleur (métier / activité) — utilisée hors du tableau de bord aussi */
.mdot{display:inline-block;width:8px;height:8px;border-radius:2px;margin-right:5px;vertical-align:middle}
.hint{font-size:11px;color:var(--muted);margin-top:8px}

/* ============ Tableau de bord (PLANNING MULTI-AFFAIRES) ============ */
#page-dash{background:#f7f9fc}
/* Le gros bandeau bleu a ete supprime : periode et compteurs sont dans la barre
   de commandes, et commandes + filtres sont figés ensemble sous la nav. */
.dashtop{position:sticky;top:var(--navh);z-index:20;background:#fff;box-shadow:0 1px 4px rgba(0,0,0,.06)}
.dashperiod{font-size:12px;font-weight:700;color:#1f3a5f;white-space:nowrap;
  padding-right:10px;margin-right:2px;border-right:1px solid var(--line)}
.dashperiod b{color:var(--accent)}
.kpis{display:flex;gap:14px;align-items:center;white-space:nowrap}
.kpi{display:inline-flex;align-items:baseline;gap:4px;font-size:10px;color:#5b6470;
  text-transform:uppercase;letter-spacing:.5px}
.kpi b{font-size:16px;font-weight:800;color:#1f3a5f;letter-spacing:0}
.dashctrl{display:flex;align-items:center;gap:8px;padding:8px 16px;background:#fff;
          border-bottom:1px solid var(--line);flex-wrap:wrap}
.dashctrl button{padding:6px 12px}
.dashctrl select,.dashctrl input{padding:6px 10px;border:1px solid var(--line);border-radius:8px;font:inherit}
.dashctrl input[type=search]{min-width:240px}

/* barre de filtres dédiés */
.dashfilters{display:flex;align-items:center;gap:8px;padding:6px 16px;background:#f3f6fb;
             border-bottom:1px solid var(--line);flex-wrap:wrap}
.dashfilters .flbl{font-size:12px;font-weight:600;color:#5b6470}
.dashfilters input,.dashfilters select{padding:5px 9px;border:1px solid var(--line);border-radius:8px;font:inherit;font-size:12px}
.dashfilters input{min-width:120px}

.dashwrap{padding:10px 16px;overflow:auto;max-height:calc(100vh - var(--navh) - 120px)}
table.dashtable{border-collapse:separate;border-spacing:0;width:100%;background:#fff;
                border:1px solid var(--line);border-radius:8px}
table.dashtable th{background:#1f3a5f;color:#fff;font-size:11px;font-weight:600;padding:7px 8px;
                   position:sticky;top:0;z-index:6;white-space:nowrap;text-align:center}
table.dashtable th small{font-weight:400;color:#bcd0e8}
table.dashtable td{padding:5px 8px;border-bottom:1px solid #eef1f5;font-size:12px;white-space:nowrap}
/* colonnes gauche figées — la position 'left' et la largeur sont posées en
   inline par dashboard.js (car l'ordre des colonnes est réordonnable). */
.dashtable td.c-aff,.dashtable td.c-cha,.dashtable td.c-act,.dashtable td.c-met,.dashtable td.c-per,.dashtable td.c-num,.dashtable td.c-cri,.dashtable td.c-prv{position:sticky;background:#fff;z-index:4}
.dashtable thead th.c-aff,.dashtable thead th.c-cha,.dashtable thead th.c-act,.dashtable thead th.c-met,.dashtable thead th.c-per,.dashtable thead th.c-num,.dashtable thead th.c-cri,.dashtable thead th.c-prv{
  position:sticky;z-index:8;background:#1f3a5f;color:#fff;text-align:left}
.dashtable td.c-num{text-align:center;color:#5b6470;font-variant-numeric:tabular-nums}
.dashtable td.c-cha{color:#5b6470;overflow:hidden;text-overflow:ellipsis;font-weight:600}
.dashtable td.c-act{overflow:hidden;text-overflow:ellipsis}
.dashtable td.c-act.noact{color:#b6bcc6}
.dashtable td.c-aff{border-left:4px solid var(--acol,transparent)}
.dashtable td.c-aff .sub{display:block;font-size:10px;color:#7a8290}
.dashtable td.c-aff b{color:#1f3a5f}
.dashtable .mdot{display:inline-block;width:8px;height:8px;border-radius:2px;margin-right:5px;vertical-align:middle}
.dashtable .c-per .tag{font-size:9px;border:1px solid var(--line);border-radius:4px;padding:0 4px;color:var(--muted)}
.dashtable .c-per .tag.inact{background:#fde68a;color:#92400e;border-color:#fcd34d}
.dashtable button.addres{border:1px solid var(--line);background:#fff;border-radius:5px;cursor:pointer;
  font-size:11px;line-height:1;padding:1px 5px;color:#16a34a;font-weight:700}
.dashtable button.addres:hover{background:#dcfce7}
.dashtable td.affcell:hover{outline:2px solid var(--accent);outline-offset:-2px}
/* récap "déjà sur ce chantier" dans le formulaire d'édition */
.ch-existing{background:#f7f9fc;border:1px solid var(--line);border-radius:8px;padding:8px 10px;margin-bottom:12px;max-height:170px;overflow:auto}
.ch-existing select.ch-exact{font:inherit;font-size:11px;padding:2px 4px;border:1px solid var(--line);
  border-radius:6px;background:#fff;max-width:150px}
.ch-existing .ch-exmet{font-size:12px;color:#5b6470}
/* le nom de la personne est un bouton : remplacer sans supprimer la ligne */
.ch-existing button.ch-exper{font:inherit;font-weight:700;color:inherit;background:none;border:none;
  border-bottom:1px dashed #94a3b8;border-radius:0;padding:0 1px;cursor:pointer}
.ch-existing button.ch-exper:hover{color:var(--accent);border-bottom-color:var(--accent)}
.ch-existing button.ch-exper i{font-style:normal;font-size:11px;opacity:.45;margin-left:4px}
.ch-existing button.ch-exper:hover i{opacity:1}
/* période d'une ligne déjà planifiée : modifiable sur place */
.ch-existing .ch-exdates{display:inline-flex;align-items:center;gap:4px;margin-left:auto}
.ch-existing .ch-exdates input[type=date]{font:inherit;font-size:11px;padding:2px 4px;
  border:1px solid var(--line);border-radius:6px}
.ch-existing .ch-exsem{font-size:10px;font-weight:700;color:var(--accent);white-space:nowrap}
/* case WE : sans elle, une borne posee un samedi etait silencieusement ecartee */
.ch-existing .ch-exwe{display:inline-flex;align-items:center;gap:3px;font-size:10px;
  color:var(--muted);white-space:nowrap}
.ch-existing .ch-exwe input{margin:0}
.ch-existing .ch-exline.besoin .ch-exdates{margin-left:auto}
.ch-existing .ch-exok{border:1px solid #bbf7d0;background:#f0fdf4;color:#15803d;border-radius:5px;
  cursor:pointer;font-size:12px;line-height:1;padding:2px 6px;font-weight:700}
.ch-existing .ch-exok:hover{background:#dcfce7}
.ch-existing .ch-exdel{margin-left:6px}
.ch-existing .ch-exhead{font-size:11px;font-weight:700;color:#5b6470;margin-bottom:4px}
.ch-existing .ch-exline{font-size:12px;padding:2px 0;display:flex;align-items:center;gap:5px}
.ch-existing .ch-exline small{color:var(--muted)}
.ch-existing .ch-exline.besoin{color:#b91c1c}
.ch-existing .ch-exdel{border:none;background:none;color:#dc2626;cursor:pointer;
  font-size:13px;padding:0 4px;line-height:1}
.ch-existing .ch-exdel:hover{background:#fde2e2;border-radius:4px}
/* poste à pourvoir : « choisir… » y place directement une personne */
.ch-existing .bs-pick{font:inherit;font-size:11px;padding:2px 8px;border:1px solid var(--accent);
  border-radius:6px;background:#fff;color:var(--accent);cursor:pointer;white-space:nowrap}
.ch-existing .bs-pick:hover{background:#eef2ff}
/* ligne qui vient d'être enregistrée (poste pourvu, période modifiée) */
@keyframes chexnew{0%{background:#bbf7d0}100%{background:transparent}}
.ch-existing .ch-exline.ch-exnew{animation:chexnew 2.5s ease-out}
/* trait marque au changement d'affaire */
.dashtable tr.affstart td{border-top:2px solid #9aa6b6}
/* ligne planifiee hors de la periode affichee : presente mais en retrait */
.dashtable tr.rowfutur td{background:#fbfcfd;color:#6b7280}
.dashtable tr.rowfutur td.c-aff b{color:#5b6470}
/* resultat hors periode affichee : bouton d'acces direct a la date */
.dashtable button.gotodate{border:1px solid #bfdbfe;background:#eff6ff;color:#1d4ed8;
  border-radius:5px;cursor:pointer;font-size:10px;line-height:1;padding:2px 5px;font-weight:700}
.dashtable button.gotodate:hover{background:#dbeafe}
.dashtable tbody tr:hover td{background:#f3f7fc}
.dashtable tbody tr:hover td.c-aff,.dashtable tbody tr:hover td.c-cha,.dashtable tbody tr:hover td.c-act,.dashtable tbody tr:hover td.c-met,.dashtable tbody tr:hover td.c-per,.dashtable tbody tr:hover td.c-num,.dashtable tbody tr:hover td.c-cri,.dashtable tbody tr:hover td.c-prv{background:#f3f7fc}

/* entêtes déplaçables + redimensionnables */
.dashtable th.draghead{cursor:grab;user-select:none;position:sticky}
.dashtable th.draghead:hover{background:#274b78}
.dashtable th.dragover{box-shadow:inset 3px 0 0 #facc15}
/* poignée de largeur : toujours visible (trait clair au bord droit de l'entête),
   surlignée au survol et pendant le glissement */
.dashtable th.draghead .colresize{position:absolute;top:0;right:0;width:9px;height:100%;
  cursor:col-resize;z-index:2;background:linear-gradient(to right,transparent 0,transparent 3px,
  rgba(255,255,255,.35) 3px,rgba(255,255,255,.35) 5px,transparent 5px)}
.dashtable th.draghead .colresize:hover,.dashtable th.draghead .colresize.rzon{background:rgba(250,204,21,.55)}

/* ressource cliquable + conflits */
.dashtable button.reslink{font:inherit;background:none;border:none;padding:0;color:#1f3a5f;
  cursor:pointer;text-decoration:underline dotted;text-underline-offset:2px}
.dashtable button.reslink:hover{color:#2563eb}
.dashtable td.cf-dbl{background:#fff4d6}
.dashtable td.cf-cg{background:#fde2e2}
.dashtable .warn-ic{font-size:9px;font-weight:700;color:#b45309;background:#fde68a;border-radius:4px;padding:0 3px}
.dashtable .warn-ic.cg{color:#fff;background:#dc2626}
.dashtable button.warn-dbl{border:none;cursor:pointer;font:inherit;font-size:9px;font-weight:700;line-height:1.4}
.dashtable button.warn-dbl:hover{background:#fcd34d}
.dashtable button.warn-dbl.active{background:#b45309;color:#fff;box-shadow:0 0 0 2px #fde68a}
/* clignotement des lignes d'une personne en double */
@keyframes flashrow{0%,100%{background:rgba(180,83,9,.06)}50%{background:rgba(245,158,11,.45)}}
.dashtable tr.flashrow td{animation:flashrow 1s ease-in-out infinite}
.dashtable tr.flashrow td.c-aff,.dashtable tr.flashrow td.c-met,
.dashtable tr.flashrow td.c-per,.dashtable tr.flashrow td.c-num,
.dashtable tr.flashrow td.c-cri,.dashtable tr.flashrow td.c-prv{animation:flashrow 1s ease-in-out infinite}
.dashtable td.tl.bardbl::after{outline:2px solid #b45309;outline-offset:-2px}

/* timeline */
.dashtable td.tl{padding:0;min-width:30px;border-left:1px solid #eef1f5}
.dashtable th.tl{position:sticky;top:0}
.dashtable th.tl.we,.dashtable td.tl.we{background:#eef0f3}
.dashtable td.tl.bar{position:relative}
.dashtable td.tl.bar::after{content:'';position:absolute;top:50%;transform:translateY(-50%);
  left:3px;right:3px;height:13px;border-radius:7px;background:var(--bar,#4472c4)}
.dashtable td.tl.bar.lcont::after{left:-1px;border-top-left-radius:0;border-bottom-left-radius:0}
.dashtable td.tl.bar.rcont::after{right:-1px;border-top-right-radius:0;border-bottom-right-radius:0}
.dashtable th.tl.ferie{box-shadow:inset 0 -3px 0 #f0a}

/* vue par personne dans le dashboard */
.dashtable tr.sect td{background:#eef2ff;color:#3730a3;font-weight:700;padding:4px 10px;
  position:sticky;left:0;z-index:3;text-transform:uppercase;letter-spacing:.4px;font-size:11px}
.dashtable td.pcell{text-align:center;font-size:10px;line-height:1.1;min-width:40px;padding:2px 3px;
  white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.dashtable td.pcell.travail{background:var(--c-travail)}
.dashtable td.pcell .pc-cli{display:block;font-weight:500}
.dashtable td.pcell.CP{background:var(--c-cp)} .dashtable td.pcell.F{background:var(--c-f)}
.dashtable td.pcell.AT{background:var(--c-at)} .dashtable td.pcell.AM{background:var(--c-am)}
.dashtable td.pcell.I{background:var(--c-i)}
.dashtable td.pcell.PER,.dashtable td.pcell.RTT,.dashtable td.pcell.AUTRE{background:var(--c-autre)}
/* Vue SEMAINE : fond coloré = absence, code + nb de jours au centre.
   La barre de chantier (::after) se superpose quand la personne travaille
   aussi dans la semaine : on voit alors les deux. */
/* ---- Vue multi-semaines : une colonne etroite par jour ouvre ----
   Le n° de semaine est porte par la 1re colonne de chaque semaine, avec un
   trait vertical marque pour separer les semaines a l'oeil. */
.dashtable th.tl.daycol{min-width:24px;width:24px;padding:3px 1px;font-size:9px;line-height:1.2}
.dashtable th.tl.daycol small{font-size:8px;color:#bcd0e8}
.dashtable td.tl.daycol{min-width:24px;width:24px}
.dashtable th.tl.wkstart,.dashtable td.tl.wkstart{border-left:2px solid #9aa6b6}
.dashtable th.tl .wklbl{display:block;font-size:9px;font-weight:800;color:#facc15;
  min-height:11px;letter-spacing:.2px}
/* absence sur une colonne-jour compacte : fond colore, pas de texte
   (le detail est dans l'infobulle). Defaut = code non repertorie. */
.dashtable td.tl.absd{background:var(--c-autre)}
.dashtable td.tl.absd.CP{background:var(--c-cp)}
.dashtable td.tl.absd.F{background:var(--c-f)}
.dashtable td.tl.absd.AT{background:var(--c-at)}
.dashtable td.tl.absd.AM{background:var(--c-am)}
.dashtable td.tl.absd.I{background:var(--c-i)}
.dashtable td.tl.absd.PER,.dashtable td.tl.absd.RTT,.dashtable td.tl.absd.AUTRE{background:var(--c-autre)}
.dashtable tbody tr:hover td.tl.absd{filter:brightness(.96)}
.abslegend{font-size:11px;gap:10px;margin-left:8px}
.abslegend .sw{width:11px;height:11px}
.dashtable td.pcell.cf-dbl{outline:2px solid #b45309;outline-offset:-2px}
.dashtable.editing td.pcell{cursor:cell}
.dashtable.editing td.pcell:hover{outline:2px solid var(--accent);outline-offset:-2px}

/* ============ Charge prévisionnelle (heatmap) ============ */
table.chgrid{border-collapse:separate;border-spacing:0}
table.chgrid th{background:#1f3a5f;color:#fff;font-size:11px;padding:6px 8px;text-align:center;
  position:sticky;top:calc(var(--navh) + var(--chTop, 0px));z-index:5;white-space:nowrap}
table.chgrid th small{color:#bcd0e8;font-weight:400}
table.chgrid th.c-met2,table.chgrid th.c-res2{text-align:left;z-index:8}
table.chgrid .c-met2{position:sticky;left:0;background:#fff;min-width:140px;max-width:140px;z-index:4;
  white-space:nowrap;overflow:hidden;text-overflow:ellipsis;font-size:12px;color:#5b6470}
table.chgrid .c-res2{position:sticky;left:140px;background:#fff;min-width:170px;max-width:170px;z-index:4;
  white-space:nowrap;overflow:hidden;text-overflow:ellipsis;font-size:12px;box-shadow:2px 0 0 #e2e7ee}
table.chgrid thead .c-met2,table.chgrid thead .c-res2{background:#1f3a5f;color:#fff}
table.chgrid td{border-bottom:1px solid #eef1f5;padding:4px 8px}
table.chgrid td.chv{text-align:center;font-size:12px;font-variant-numeric:tabular-nums;min-width:42px;border-left:1px solid #eef1f5}
table.chgrid td.chv .z{color:#d2d7df}
table.chgrid tbody tr:hover td{background:#f3f7fc}
table.chgrid tbody tr:hover .c-met2,table.chgrid tbody tr:hover .c-res2{background:#f3f7fc}
/* sections métier */
table.chgrid tr.chsect td{background:#eef2ff;border-bottom:1px solid #dfe4ee}
table.chgrid tr.chsect .c-res2{background:#eef2ff;color:#3730a3}
table.chgrid tr.chsect .c-met2{background:#eef2ff}
table.chgrid td.chsep{background:#eef2ff}
/* total */
table.chgrid tr.chtot td{background:#1f3a5f;color:#fff;font-weight:700;border-top:2px solid #14283f}
table.chgrid tr.chtot .c-met2,table.chgrid tr.chtot .c-res2{background:#1f3a5f;color:#fff}
/* heatmap : vert (léger) -> jaune -> orange -> rouge (surcharge) */
td.chv.ch-1{background:#e8f3e0}
td.chv.ch-2{background:#d7ecc8}
td.chv.ch-3{background:#fff2c2}
td.chv.ch-4{background:#ffd9a0}
td.chv.ch-5{background:#ffbe7a}
td.chv.ch-over{background:#f4a09a;font-weight:700;color:#7a1f1a}

/* panneau latéral "ressources disponibles" */
.dispopanel-bd{position:fixed;inset:0;background:rgba(0,0,0,.25);z-index:155}
.dispopanel{position:fixed;top:0;right:0;height:100%;width:340px;max-width:92vw;background:#fff;
  z-index:156;display:flex;flex-direction:column;box-shadow:-8px 0 30px rgba(0,0,0,.2)}
.dispopanel .dp-head{padding:13px 16px;background:#1f3a5f;color:#fff;font-size:14px;display:flex;align-items:center;gap:8px}
.dispopanel .dp-x{margin-left:auto;background:transparent;border:1px solid rgba(255,255,255,.4);color:#fff;border-radius:6px;cursor:pointer}
.dispopanel .dp-nav{display:flex;align-items:center;justify-content:space-between;gap:8px;padding:8px 10px;border-bottom:1px solid var(--line);background:#f3f6fb}
.dispopanel .dp-nav span{font-size:12px;font-weight:600;color:#5b6470}
.dispopanel .dp-nav button{padding:4px 10px;border:1px solid var(--line);border-radius:7px;background:#fff;cursor:pointer;font-size:12px}
.dispopanel .dp-days{display:flex;gap:3px;padding:8px;border-bottom:1px solid var(--line);flex-wrap:wrap}
.dispopanel .dp-day{flex:1;min-width:38px;border:1px solid var(--line);background:#fff;border-radius:6px;
  padding:5px 2px;font-size:11px;cursor:pointer;line-height:1.2}
.dispopanel .dp-day.on{background:var(--accent);color:#fff;border-color:var(--accent)}
.dispopanel .dp-body{overflow:auto;flex:1;padding:6px 0}
.dispopanel .dp-met{padding:8px 16px 3px;font-size:12px;font-weight:700;color:#1f3a5f;display:flex;align-items:center;gap:6px;cursor:pointer;user-select:none}
.dispopanel .dp-met:hover{background:#f3f7fc}
.dispopanel .dp-caret{width:10px;font-size:10px;color:#5b6470}
.dispopanel .dp-met .dp-n{margin-left:auto;background:#eef2ff;color:#3730a3;border-radius:999px;padding:0 7px;font-size:11px}
.dispopanel .dp-grp.off .dp-plist{display:none}
.dispopanel .dp-p{padding:4px 16px 4px 30px;font-size:13px;border-bottom:1px solid #f3f5f8}
.dispopanel .dp-p.dp-ko{color:#9aa2ad;background:#fafbfc}
.dispopanel .dp-p.dp-ko small{color:#b45309;font-size:11px;margin-left:6px}
.dispopanel .dp-opt{display:flex;align-items:center;gap:6px;padding:6px 16px;font-size:11px;
  color:var(--muted);border-bottom:1px solid var(--line)}
.dispopanel .dp-p .tag{font-size:9px;border:1px solid var(--line);border-radius:4px;padding:0 4px;color:var(--muted)}

/* barre de commandes des pages de gestion figee au defilement */
.gestionpage .pagehead{position:sticky;top:var(--navh);z-index:20;background:var(--card)}

/* page Parametrage : deux referentiels cote a cote */
.paramwrap{display:grid;grid-template-columns:1fr 1fr;gap:16px;padding:16px;align-items:start}
@media (max-width:1100px){ .paramwrap{grid-template-columns:1fr} }
.parambloc{background:var(--card);border:1px solid var(--line);border-radius:12px;padding:14px}
.parambloc h3{margin:0 0 12px;font-size:14px}
.parambloc h3 small{font-weight:400;color:var(--muted);margin-left:6px;font-size:11px}
.parambloc .scroll{max-height:52vh;overflow:auto;border:1px solid var(--line);border-radius:8px;margin-top:10px}
.parambloc .metadd input[type=color]{padding:2px;height:32px}
.parambloc input.pc-tel{width:100%;padding:4px 6px;border:1px solid var(--line);border-radius:6px;font:inherit}
/* Sous-menu de Parametrage (Referentiels / Affaires / Clients) : evite d'avoir
   deux onglets de plus dans la barre principale, tout en montrant ou l'on est. */
.subtabs{display:flex;gap:5px;margin-left:10px}
.subtab{border:1px solid var(--line);background:#f7f9fc;border-radius:999px;
  padding:5px 15px;font-size:12px;cursor:pointer;color:#5b6470;white-space:nowrap}
.subtab:hover{background:#eef2ff;border-color:#c7d2fe}
.subtab.on{background:var(--accent);color:#fff;border-color:var(--accent);font-weight:600}
/* rappel de la periode en clair a cote des champs date du navigateur */
.respick .rp-datelbl{font-size:10px;font-weight:700;color:var(--accent);white-space:nowrap}
.chgrid .tag{font-size:9px;border:1px solid var(--line);border-radius:4px;padding:0 4px;
  color:var(--muted);margin-left:5px;white-space:nowrap}
/* absences dans la heatmap : memes couleurs que le planning */
.chgrid td.chabs{font-size:10px;font-weight:700;color:#374151}
.chgrid td.chabs.CP{background:var(--c-cp)}
.chgrid td.chabs.F{background:var(--c-f)}
.chgrid td.chabs.AT{background:var(--c-at)}
.chgrid td.chabs.AM{background:var(--c-am)}
.chgrid td.chabs.I{background:var(--c-i)}
.chgrid td.chabs.PER,.chgrid td.chabs.RTT,.chgrid td.chabs.AUTRE{background:var(--c-autre)}
.chgrid .chabs-s{display:block;font-size:9px;font-weight:700;color:#b45309;line-height:1.1}
/* Detail des jours sous le total hebdomadaire : 7 petites cases lun->dim,
   comme le tableau de bord. Permet de voir OU sont les jours occupes. */
.chgrid .chn{display:block;line-height:1.1}
.chgrid .chj{display:flex;gap:1px;justify-content:center;margin-top:2px}
.chgrid .chj i{width:5px;height:7px;border-radius:1px;background:#eceff3;display:block}
.chgrid .chj i.we{background:#f6f7f9}
.chgrid .chj i.on{background:#4472c4}
.chgrid .chj i.ab{background:var(--c-autre)}
.chgrid .chj i.ab.CP{background:#7fb1e0}
.chgrid .chj i.ab.F{background:#f0a860}
.chgrid .chj i.ab.AT{background:#e08585}
.chgrid .chj i.ab.AM{background:#a898d0}
.chgrid .chj i.ab.I{background:#b8b8b8}
.chgrid td.chv{min-width:46px;padding:3px 4px}

/* ============ Impression ============
   On ne garde que la grille : ni navigation, ni commandes, ni fenetres.
   print-color-adjust force le navigateur a imprimer les couleurs des barres,
   sinon le Gantt sort tout blanc et devient illisible. */
/* bandeau de titre : uniquement sur la feuille imprimee */
.printonly { display: none; }

@media print {
  @page { size: landscape; margin: 8mm; }
  .topnav, .dashtop, .pagehead, .dispopanel, .dispopanel-bd,
  .respick, .respick-bd, .mbackdrop, .modal, .toast, #affTip, .fiche-apercu { display: none !important; }
  body { background: #fff; font-size: 10px; }
  .printonly { display: block !important; font-size: 15px; margin: 0 0 8px;
    padding-bottom: 5px; border-bottom: 2px solid #1f3a5f; color: #1f3a5f; }
  .printonly .pt-sub { font-size: 11px; color: #5b6470; font-weight: 400; }
  .dashwrap, .tablewrap, .tablewrap .scroll {
    max-height: none !important; overflow: visible !important; padding: 0 !important; }
  .dashtable td.c-aff, .dashtable td.c-cha, .dashtable td.c-act,
  .dashtable td.c-met, .dashtable td.c-per, .dashtable td.c-cri, .dashtable td.c-prv,
  .dashtable thead th { position: static !important; }
  /* IMPRIMER LES COULEURS : sans cette regle appliquee a TOUT, le navigateur
     retire les fonds et le planning sort en noir et blanc illisible. */
  *, *::before, *::after {
    -webkit-print-color-adjust: exact !important; print-color-adjust: exact !important; }
  /* L'impression suit la case « Affaires à venir » : quand elle est décochée,
     ces lignes ne sont deja pas generees ; quand elle est cochee, on les
     imprime comme a l'ecran. Aucune regle a ajouter ici. */
  .dashtable button.addres, .dashtable button.gotodate, .dashtable .warn-ic { display: none !important; }
  .dashtable button.reslink { text-decoration: none; color: #000; }
  .dashtable tbody tr { break-inside: avoid; }
  thead { display: table-header-group; }
}

/* postes à pourvoir (besoins) */
.dashtable td.cf-besoin{background:#fde2e2}
.dashtable button.besoinlink{font:inherit;background:#dc2626;color:#fff;border:none;border-radius:6px;
  padding:2px 8px;cursor:pointer;font-size:11px;font-weight:600}
.dashtable button.besoinlink:hover{background:#b91c1c}
.dashtable tr.rowbesoin td{background:#fff7f7}
.dashtable td.tl.bar.barbesoin::after{background:repeating-linear-gradient(45deg,#dc2626,#dc2626 4px,#f7a8a8 4px,#f7a8a8 8px)}

/* DOUBLON « planifié + absent » (demande client 17/09/2026). L'absence n'est
   jamais supprimée : les jours concernés sont hachurés rouge comme un poste à
   pourvoir, puisqu'il faut effectivement quelqu'un d'autre ces jours-là. */
.dashtable td.tl.bar.barabs::after{background:repeating-linear-gradient(45deg,#dc2626,#dc2626 4px,#f7a8a8 4px,#f7a8a8 8px);
  box-shadow:inset 0 0 0 1px #7f1d1d}
.dashtable button.warn-abs{border:none;cursor:pointer;font:inherit;font-size:9px;font-weight:700;line-height:1.4}
.dashtable button.warn-abs:hover{background:#991b1b}
.dashtable td.pcell.cf-abs{outline:2px solid #dc2626;outline-offset:-2px}
.dashtable td.pcell .pc-abs{display:inline-block;margin-right:3px;padding:0 3px;border-radius:3px;
  background:#dc2626;color:#fff;font-size:9px;font-weight:700}
.abslegend .sw.sw-dbl{background:repeating-linear-gradient(45deg,#dc2626,#dc2626 3px,#f7a8a8 3px,#f7a8a8 6px)}
.respick .rp-item small.rp-warn{color:#b91c1c;font-weight:600}
.ch-table .ch-alerte{font-size:11px;color:#b91c1c;font-weight:600;line-height:1.3;margin-top:3px}
.ab-alerte{font-size:12px;color:#b91c1c;font-weight:600;line-height:1.35;margin-top:4px}
.ch-existing .ch-exwarn{font-size:10px;font-weight:700;color:#fff;background:#dc2626;border-radius:4px;
  padding:0 5px;cursor:help;white-space:nowrap}
.chgrid .chj i.dbl{background:#dc2626}

/* infobulle affaire (chargé d'affaire + descriptif) */
.afftip{position:fixed;z-index:200;display:none;max-width:300px;background:#111827;color:#fff;
  padding:9px 12px;border-radius:8px;box-shadow:0 8px 26px rgba(0,0,0,.3);font-size:12px;line-height:1.5}
.afftip .aff-t{margin-bottom:4px}
.afftip .aff-num{color:#9aa8bd;font-size:11px}
.afftip .aff-k{display:inline-block;min-width:104px;color:#9aa8bd;font-size:11px}
.dashtable td.affcell{cursor:help}

/* formulaire Nouveau chantier */
.ch-grid{display:grid;grid-template-columns:1fr 1fr 1fr;gap:10px;margin-bottom:14px}
.ch-grid label{display:block;font-size:11px;color:var(--muted);margin-bottom:3px}
.ch-grid input,.ch-grid select,.ch-grid textarea{width:100%;padding:7px 9px;border:1px solid var(--line);border-radius:8px;font:inherit;resize:vertical}
.ch-grid .ch-f2{grid-column:span 1}
.ch-grid .ch-f3{grid-column:span 3}
/* bloc « Fiche de mission » du formulaire chantier */
.ch-fiche{border:1px solid #bfe3f4;border-radius:8px;margin-bottom:12px;background:#f7fcff}
.ch-fiche summary{cursor:pointer;padding:8px 10px;font-weight:600;font-size:13px;color:#1f3a5f}
.ch-fiche summary small{font-weight:400;color:var(--muted);margin-left:6px;font-size:11px}
.ch-fgrid{display:grid;grid-template-columns:1fr 1fr 1fr;gap:8px 10px;padding:2px 10px 10px}
.ch-fgrid .ch-fs2{grid-column:span 2}
.ch-fgrid .ch-fs3{grid-column:span 3}
.ch-fgrid label{display:block;font-size:11px;color:var(--muted);margin-bottom:3px}
.ch-fgrid input,.ch-fgrid select,.ch-fgrid textarea{width:100%;padding:6px 8px;border:1px solid var(--line);
  border-radius:7px;font:inherit;background:#fff;resize:vertical}
.ch-fgrid .fc-vehs{display:flex;flex-wrap:wrap;gap:6px}
.ch-fgrid .fc-vehs select{width:auto;min-width:210px;flex:1}
.ch-fiche .fc-print{display:flex;align-items:center;flex-wrap:wrap;gap:6px;padding:8px 10px;
  border-top:1px dashed #bfe3f4;font-size:12px}
.ch-fiche .fc-print input[type=date]{padding:4px 6px;border:1px solid var(--line);border-radius:6px;font:inherit;font-size:12px}
.ch-fiche .fc-print .muted{font-size:11px}
/* aperçu de la fiche de mission, par-dessus tout (cadre imprimable) */
.fiche-apercu{position:fixed;inset:0;z-index:400;display:flex;flex-direction:column;background:rgba(15,23,42,.55)}
.fiche-apercu .fa-barre{display:flex;align-items:center;flex-wrap:wrap;gap:10px;padding:10px 16px;
  background:#1f3a5f;color:#fff}
.fiche-apercu .fa-barre button{padding:6px 14px}
.fiche-apercu .fa-aide{font-size:12px;color:#c7d7ea}
.fiche-apercu .fa-cadre{flex:1;width:100%;border:0;background:#e5e7eb}
/* bandeau "Activité" (obligatoire) au-dessus des lignes de compétences */
.ch-actbar{display:flex;align-items:center;gap:10px;padding:9px 11px;margin-bottom:12px;
  background:#f3f6fb;border:1px solid var(--line);border-radius:8px}
.ch-actbar label{font-size:12px;font-weight:700;color:#5b6470}
.ch-actbar select{padding:7px 9px;border:1px solid var(--line);border-radius:8px;font:inherit;min-width:230px}
.ch-actbar .hint{margin:0;font-size:11px;color:var(--muted)}
/* champ activité manquant à l'enregistrement */
select.needed{border-color:#dc2626 !important;box-shadow:0 0 0 2px rgba(220,38,38,.15)}
.ch-lnhead{display:flex;align-items:center;gap:10px;font-weight:600;font-size:13px;margin:6px 0 8px}
.ch-add{margin-left:auto;font-size:12px;padding:5px 10px;border:1px solid var(--accent);color:var(--accent);background:#fff;border-radius:8px;cursor:pointer}
.ch-table{width:100%;border-collapse:collapse;table-layout:fixed}
.ch-table th:nth-child(1),.ch-table td:nth-child(1){width:21%}
.ch-table th:nth-child(2),.ch-table td:nth-child(2){width:19%}
.ch-table th:nth-child(3),.ch-table td:nth-child(3){width:15%}
.ch-table th:nth-child(4),.ch-table td:nth-child(4){width:15%}
.ch-table th:nth-child(5),.ch-table td:nth-child(5){width:8%}
.ch-table th:nth-child(6),.ch-table td:nth-child(6){width:17%}
.ch-table th:nth-child(7),.ch-table td:nth-child(7){width:5%}
.ch-table th{text-align:left;font-size:11px;color:var(--muted);font-weight:600;padding:3px 6px}
.ch-table td{padding:3px 6px}
.ch-table select,.ch-table input[type=date]{padding:6px 8px;border:1px solid var(--line);border-radius:7px;font:inherit;width:100%}
.ch-table .ch-we{display:flex;align-items:center;gap:4px;font-size:11px;color:var(--muted)}
.ch-table .ch-pick{padding:5px 9px;border:1px solid var(--line);border-radius:7px;background:#fff;cursor:pointer;font-size:12px}
.ch-table .ch-rlbl{display:block;font-size:11px;margin-top:2px}
.ch-table .ch-del{border:none;background:none;color:#dc2626;cursor:pointer;font-size:14px}
.ch-table .ch-dup{border:none;background:none;color:#2563eb;cursor:pointer;font-size:14px}
.ch-table .ch-acts{white-space:nowrap}
/* n° de semaine sous chaque date saisie */
.ch-table .ch-sem{display:block;font-size:10px;color:var(--accent);font-weight:700;margin-top:2px;min-height:12px}
/* selecteur de SEMAINE : son calendrier natif affiche les numeros de semaine,
   ce que le calendrier d une date ne fait pas. Choisir une semaine pose
   lundi -> vendredi dans les champs date. */
.ch-table input[type=week],.ch-grid input[type=week]{width:100%;margin-top:3px;padding:4px 6px;
  border:1px solid #bfdbfe;border-radius:6px;font:inherit;font-size:11px;
  color:var(--accent);font-weight:700;background:#f5f9ff}
.ch-rescell{min-width:130px}

/* popover de réaffectation */
.respick-bd{position:fixed;inset:0;z-index:160}
.respick{position:fixed;z-index:161;width:320px;max-height:min(70vh,520px);display:flex;flex-direction:column;
  background:#fff;border:1px solid var(--line);border-radius:12px;box-shadow:0 12px 40px rgba(0,0,0,.2)}
.respick .rp-head{padding:11px 13px;border-bottom:1px solid var(--line);font-size:13px}
.respick .rp-head small{color:var(--muted)}
/* périodes concernées, en haut du popover et en format français */
.respick .rp-per{font-size:12px;font-weight:700;color:var(--accent);margin-bottom:5px;line-height:1.45}
.respick .rp-opt{display:flex;align-items:center;gap:6px;padding:8px 13px;font-size:12px;color:var(--muted);border-bottom:1px solid var(--line)}
.respick .rp-list{overflow:auto;flex:1}
.respick .rp-item{padding:7px 13px;border-bottom:1px solid #f1f3f6;cursor:pointer;font-size:13px}
.respick .rp-item:hover{background:#eef2ff}
.respick .rp-item small{display:block;color:var(--muted);font-size:11px}
/* ressources NON disponibles : grisées, non cliquables, avec le motif */
/* intertitre métier dans les listes de ressources */
.respick .rp-met{padding:5px 13px;background:#f3f6fb;border-top:1px solid var(--line);
  border-bottom:1px solid var(--line);font-size:11px;font-weight:700;color:#1f3a5f;
  display:flex;align-items:center;gap:2px}
.respick .rp-met .rp-n{margin-left:auto;background:#eef2ff;color:#3730a3;border-radius:999px;
  padding:0 6px;font-size:10px}
.respick .rp-sep{padding:6px 13px;background:#fff7ed;border-top:1px solid #fed7aa;
  border-bottom:1px solid #fed7aa;font-size:10px;font-weight:700;color:#b45309;
  text-transform:uppercase;letter-spacing:.4px}
.respick .rp-off{padding:6px 13px;border-bottom:1px solid #f1f3f6;font-size:12px;color:#9aa2ad;cursor:default}
.respick .rp-off small{display:block;color:#b45309;font-size:11px}
.respick .rp-foot{display:flex;justify-content:space-between;align-items:center;padding:9px 13px;border-top:1px solid var(--line)}
/* période modifiable dans le popover « ajouter une personne » */
.respick .rp-dates{display:flex;align-items:center;gap:6px;padding:8px 13px;font-size:11px;
  color:var(--muted);border-bottom:1px solid var(--line);background:#f7f9fc}
.respick .rp-dates input{font:inherit;font-size:12px;padding:4px 6px;border:1px solid var(--line);
  border-radius:6px;flex:1;min-width:0}

/* ================= Lot du 30/10/2026 ================= */
/* motifs d'absence : récupération (comme RTT) et congé sans solde */
td.RECUP{background:var(--c-autre)}
td.CSS{background:var(--c-css)}
.dashtable td.pcell.RECUP{background:var(--c-autre)}
.dashtable td.pcell.CSS{background:var(--c-css)}
.dashtable td.tl.absd.RECUP{background:var(--c-autre)}
.dashtable td.tl.absd.CSS{background:var(--c-css)}
.chgrid td.chabs.RECUP{background:var(--c-autre)}
.chgrid td.chabs.CSS{background:var(--c-css)}

/* colonnes Criticité et Prévenu du tableau de bord (vue par affaire) */
.dashtable td.c-cri,.dashtable td.c-prv{text-align:center}
.dashtable thead th.c-cri,.dashtable thead th.c-prv{text-align:center}
.crit{display:inline-block;width:16px;height:16px;border-radius:50%;border:2px solid transparent;
  vertical-align:middle;padding:0;box-sizing:border-box}
button.crit{cursor:pointer;background:#fff;font:inherit;line-height:0}
.crit.crit-none{border:2px dashed #c3c9d3;background:#fff}
.crit.crit-R{background:#dc2626;border-color:#991b1b}
.crit.crit-O{background:#f59e0b;border-color:#b45309}
.crit.crit-V{background:#16a34a;border-color:#166534}
.dashtable button.crit:hover{box-shadow:0 0 0 3px #dbeafe}
body.lecture-seule .dashtable button.crit{cursor:default;box-shadow:none}
.pop.popcrit{width:210px}
.pop.popcrit .crit-opt{display:flex;align-items:center;gap:8px;width:100%;border:1px solid var(--line);
  background:#fff;border-radius:8px;padding:6px 10px;margin-top:6px;cursor:pointer;font:inherit;text-align:left}
.pop.popcrit .crit-opt:hover{border-color:var(--accent)}
.pop.popcrit .crit-opt.on{border-color:var(--accent);background:#eef2ff;font-weight:600}
.dashtable td.c-prv .pvbox{display:inline-flex;align-items:center;gap:3px;cursor:pointer;margin:0}
.dashtable td.c-prv input.pv{width:15px;height:15px;margin:0;cursor:pointer;accent-color:#16a34a}
.dashtable td.c-prv input.pv:disabled{cursor:default}
.dashtable td.c-prv .pv-warn{color:#c2410c;font-weight:800;font-size:12px}

/* affaire NON FACTURÉE : étoile ; en vue par affaire, la ligne sur fond ambré */
.dashtable .nf-star{color:#f59e0b;font-size:14px;margin-right:3px;-webkit-text-stroke:.6px #92400e}
.dashtable .nf-tag{color:#b45309;font-weight:700}
.dashtable tr.rownf td.c-aff{background:#fef3c7}
.dashtable tr.rownf td.c-cri,.dashtable tr.rownf td.c-cha,.dashtable tr.rownf td.c-act,
.dashtable tr.rownf td.c-met,.dashtable tr.rownf td.c-prv,.dashtable tr.rownf td.tl:not(.we){background:#fffbeb}
.dashtable tr td.c-prv.pv-modif{background:#ffedd5}
/* vue par personne : étoile dorée à la place du point les jours d'affaire non
   facturée — même couleur partout (légende, vue par affaire) : repérée d'un coup d'œil */
.dashtable td.tl.bar.nf::after{content:'\2605';background:none;color:#f59e0b;left:0;right:0;
  height:auto;border-radius:0;font-size:19px;line-height:1;text-align:center;-webkit-text-stroke:.8px #92400e}
.dashtable td.pcell.travail.nf{background:#fef3c7}
/* plusieurs affaires le même jour : case jaune + 2×, 3×… */
.dashtable td.tl.multi{background:#fff4d6}
.dashtable td.tl.multi::before{content:attr(data-n);position:absolute;top:0;right:1px;z-index:2;
  font-size:8px;font-weight:800;line-height:1;color:#b45309}
.dashtable td.pcell .pc-n{color:#b45309}
.abslegend .sw.sw-multi{background:#fff4d6;outline:2px solid #b45309;outline-offset:-2px}
.abslegend .sw-star{font-style:normal;color:#f59e0b;font-size:14px;line-height:1;margin-right:3px;
  -webkit-text-stroke:.6px #92400e}

/* formulaire chantier : case « affaire non facturée » */
.ch-grid .ch-nf{display:flex;align-items:center;gap:6px;font-size:13px;color:var(--ink);
  margin:0;padding:8px 0;cursor:pointer}
.ch-grid .ch-nf input{width:auto;margin:0}

/* listes de ressources : déjà sur une autre affaire ce jour (choisissable) */
.respick .rp-sep.rp-sep-occ{background:#fefce8;border-color:#fde68a;color:#a16207}

/* ============ Planning véhicules ============ */
.vp-head .vp-label{font-weight:700;color:#1f3a5f;margin-left:6px}
.vp-leg{font-size:11px;gap:10px}
.vp-leg .sw{width:12px;height:12px}
.vp-sw-auto{background:#e5e7eb;border:1px solid #9aa6b6}
.vp-sw-resa{background:#dbe4f0;border:1px solid #9aa6b6}
.vp-sw-indispo{background:#dc2626}
.vp-sw-conflit{background:#fff;outline:2px solid #dc2626;outline-offset:-2px}
table.vptable{border-collapse:collapse;width:100%;table-layout:fixed;background:#fff;font-size:12px}
table.vptable col.vp-cveh{width:150px}
table.vptable th,table.vptable td{border:1px solid #c3c9d3;padding:3px 4px;text-align:center;vertical-align:middle}
table.vptable thead th{background:#d9d9d9;color:#111;font-weight:800}
table.vptable th.vp-jour{font-size:12px;letter-spacing:.3px}
table.vptable th.vp-jour small{display:block;font-weight:600;font-size:10px;color:#4b5563}
table.vptable th.vp-demi{font-size:9px;font-weight:600;color:#6b7280;background:#f3f4f6;padding:1px}
table.vptable th.we,table.vptable td.we{background:#eceef1}
table.vptable th.ferie{box-shadow:inset 0 -3px 0 #f0a}
table.vptable td.vp-veh{background:var(--vcol,#d9d9d9);font-weight:800;line-height:1.15;font-size:11px}
table.vptable td.vp-veh small{display:block;font-weight:700;font-size:11px}
table.vptable td.vp-veh small.vp-locinfo,table.vptable td.vp-veh small.vp-hl{font-weight:400;font-size:10px;color:#374151}
table.vptable td.vp-veh.vp-loc{cursor:pointer}
table.vptable td.vp-free{height:30px;cursor:cell}
table.vptable td.vp-free:hover{background:#eef2ff}
table.vptable td.vp-free.pm,table.vptable th.vp-demi.pm{border-left:1px dashed #d1d5db}
table.vptable td.vp-horsloc{background:repeating-linear-gradient(45deg,#f3f4f6,#f3f4f6 4px,#e5e7eb 4px,#e5e7eb 8px);cursor:not-allowed}
table.vptable td.vp-e{font-size:11px;font-weight:700;line-height:1.2;cursor:pointer;overflow:hidden;padding:3px 5px}
/* 3 lignes au plus, coupées entre deux mots : le texte complet est dans l'infobulle */
table.vptable td.vp-e .vp-t{display:-webkit-box;-webkit-line-clamp:3;-webkit-box-orient:vertical;overflow:hidden}
table.vptable td.vp-auto{background:#e5e7eb;color:#111}
table.vptable td.vp-resa{background:#dbe4f0;color:#111}
table.vptable td.vp-indispo{background:#dc2626;color:#fff}
table.vptable td.vp-conflit{outline:3px solid #dc2626;outline-offset:-3px}
table.vptable td.vp-e:hover{filter:brightness(.94)}
table.vptable tr.vp-sect td{background:#6b7280;color:#fff;font-weight:800;letter-spacing:.5px;text-decoration:underline}
table.vptable td.vp-vide{color:var(--muted);font-style:italic;background:#fafafa}
table.vptable button.vp-libs{display:block;margin:3px auto 0;border:1px solid #9aa6b6;background:#fff;
  border-radius:5px;font-size:9px;padding:0 4px;cursor:pointer;font-weight:600}
body.lecture-seule table.vptable td.vp-free{cursor:default}
body.lecture-seule table.vptable td.vp-free:hover{background:transparent}
body.lecture-seule table.vptable td.vp-free.we:hover{background:#eceef1}
.pop.vp-pop{width:300px}
.vp-pop .vp-pinfo{font-size:12px;margin:4px 0 8px}
.vp-pop .vp-pwarn{color:#b91c1c;font-weight:700;font-size:12px;margin-bottom:8px}
.vp-pop .vp-pact{display:flex;gap:8px;flex-wrap:wrap}
.vp-pop .vp-pact .danger{color:#dc2626;border-color:#fca5a5}
.vp-pop .vp-libl{display:flex;align-items:center;justify-content:space-between;gap:8px;padding:5px 0;
  border-bottom:1px solid var(--line);font-size:12px}
.vp-pop .vp-libl small{display:block;color:var(--muted)}
.vp-types{display:flex;flex-direction:column;gap:6px;margin-bottom:12px;font-size:13px}
.vp-types label{display:flex;align-items:center;gap:6px;cursor:pointer}
.vp-types small{color:var(--muted)}
.vp-dt{display:flex;gap:6px}
.vp-dt input{flex:1;min-width:0}
.grid2 .vp-dt select{width:auto}

@media print {
  /* A3 : même mise en page, la feuille plus grande donne des colonnes plus larges */
  body.print-a3 table.vptable{font-size:13px}
  table.vptable{font-size:10px}
  table.vptable td.vp-free{height:22px}
  table.vptable button.vp-libs{display:none}
  .dashtable .crit.crit-none{border-color:transparent}
}
