/* ============================================================
   SMG Devis — Dark theme
   Conforme au cahier des charges § 10 (charte graphique)
   ============================================================ */

:root {
  /* surfaces */
  --bg:    #0b1220;
  --sf:    #131a2c;
  --sf2:   #1a2238;
  --sf3:   #232c46;
  --bd:    #2a3552;
  --bd2:   #3a4670;

  /* textes */
  --t:     #e6e9f2;
  --t2:    #a4adc4;
  --t3:    #6b7592;

  /* accents */
  --blue:   #06b6d4;
  --blue2:  #0891b2;
  --blue3:  #155e75;
  --green:  #10b981;
  --green2: #059669;
  --orange: #f59e0b;
  --red:    #ef4444;
  --red2:   #c00000;
  --red3:   #7f1d1d;
  --rose:   #f43f5e;
  --yellow: #facc15;
  --hl:     #fff59d;     /* surlignage cases grille */

  --rad:    8px;
  --rad-s:  4px;
  --sh:     0 2px 8px rgba(0,0,0,.4);
  --sh2:    0 8px 28px rgba(0,0,0,.6);
}

/* ── Thème CLAIR : override des surfaces/textes uniquement.
   Les accents (blue/green/red/orange/yellow) sont conservés pour garder
   la même identité visuelle entre les deux modes. ────────────────── */
body.theme-light {
  --bg:    #f5f7fa;
  --sf:    #ffffff;
  --sf2:   #f0f3f8;
  --sf3:   #e6ebf2;
  --bd:    #d0d7e3;
  --bd2:   #b5bfd0;

  --t:     #1a2238;
  --t2:    #4a5670;
  --t3:    #7a8295;

  --hl:    #fff59d;       /* surlignage jaune identique (déjà clair) */
  --sh:    0 2px 8px rgba(0,0,0,.08);
  --sh2:   0 8px 28px rgba(0,0,0,.15);
}

/* Bouton thème (toujours visible en topbar, à droite) */
.topbar-right {
  display: flex;
  align-items: center;
  gap: 10px;
}
.theme-btn {
  width: 34px; height: 34px;
  border-radius: 50%;
  border: 1px solid var(--bd);
  background: var(--sf2);
  color: var(--t);
  cursor: pointer;
  display: flex;
  align-items: center;
  justify-content: center;
  font-size: 16px;
  transition: background 0.15s, transform 0.15s;
  flex-shrink: 0;
}
.theme-btn:hover { background: var(--sf3); transform: rotate(15deg); }
.theme-btn:active { transform: rotate(0deg) scale(0.95); }
.theme-btn .theme-icon { line-height: 1; }
/* Icônes SVG (cloche / soleil-lune) : trait fin, taille contenue, couleur du texte */
.theme-btn .theme-icon, .theme-btn .notif-icon { display: flex; align-items: center; justify-content: center; }
.theme-btn svg { display: block; width: 17px; height: 17px; }

* { box-sizing: border-box; margin: 0; padding: 0; }
html, body { height: 100%; }
body {
  font: 14px/1.45 -apple-system, "Segoe UI", Roboto, Helvetica, Arial, sans-serif;
  color: var(--t);
  background: var(--bg);
  display: flex;
}
a { color: inherit; text-decoration: none; }
button { font: inherit; cursor: pointer; border: none; background: none; color: inherit; }
code { font-family: ui-monospace, Consolas, Menlo, monospace; font-size: 12.5px; color: var(--blue); background: rgba(6,182,212,.08); padding: 1px 5px; border-radius: 3px; }
.hidden { display: none !important; }

/* Inputs ---------------------------------------------------- */
input, select, textarea, .fi {
  font: inherit;
  padding: 7px 9px;
  border: 1px solid var(--bd);
  border-radius: var(--rad-s);
  background: var(--sf2);
  color: var(--t);
  width: 100%;
}
input:focus, select:focus, textarea:focus, .fi:focus {
  outline: none;
  border-color: var(--blue);
  box-shadow: 0 0 0 2px rgba(6,182,212,.18);
}
input[type="number"] { font-variant-numeric: tabular-nums; }
input::placeholder, textarea::placeholder { color: var(--t3); }
select { appearance: none; -webkit-appearance: none; padding-right: 22px;
  background-image: linear-gradient(45deg, transparent 50%, var(--t2) 50%),
                    linear-gradient(135deg, var(--t2) 50%, transparent 50%);
  background-position: calc(100% - 12px) 50%, calc(100% - 7px) 50%;
  background-size: 5px 5px, 5px 5px;
  background-repeat: no-repeat;
}
label { font-size: 12px; color: var(--t2); display: block; margin-bottom: 4px; font-weight: 500; }

/* Tableaux -------------------------------------------------- */
table { width: 100%; border-collapse: collapse; }
th, td { padding: 8px 10px; text-align: left; border-bottom: 1px solid var(--bd); vertical-align: middle; }
th { font-size: 11px; font-weight: 600; color: var(--t3); text-transform: uppercase; letter-spacing: .03em; background: var(--sf2); }
tbody tr:hover { background: rgba(255,255,255,.02); }
td .small { font-size: 11.5px; color: var(--t2); }
.num { text-align: right; font-variant-numeric: tabular-nums; }

/* Sidebar --------------------------------------------------- */
#sidebar {
  width: 220px;
  background: var(--sf);
  border-right: 1px solid var(--bd);
  display: flex;
  flex-direction: column;
  flex-shrink: 0;
  min-height: 100vh;
  overflow: hidden;            /* clippe le contenu quand on replie */
  transition: width .18s ease;
}
/* Repliée : largeur nulle → #main (flex:1) prend toute la place. Le bouton
   à cheval sur le bord devient un petit onglet collé à gauche pour redéployer.
   État persistant (localStorage). */
body.sidebar-collapsed #sidebar { width: 0; border-right: none; }
/* Bouton replier/déployer : pastille à cheval sur le bord droit de la sidebar
   (fixed → échappe à l'overflow:hidden de la sidebar quand elle est repliée). */
#sidebar-toggle {
  position: fixed;
  left: 220px; top: 44px;
  transform: translateX(-50%);
  z-index: 150;                 /* sous les bannières espion/groupe (200) */
  width: 24px; height: 24px;
  padding: 0;
  border: 1px solid var(--bd);
  border-radius: 50%;
  background: var(--sf2);
  color: var(--t2);
  cursor: pointer;
  font-size: 13px; line-height: 1;
  display: flex; align-items: center; justify-content: center;
  transition: left .18s ease, background .15s;
}
#sidebar-toggle:hover { background: var(--sf3); color: var(--t); }
body.sidebar-collapsed #sidebar-toggle {
  left: 0; transform: none;
  border-left: none;
  border-radius: 0 12px 12px 0;
}
body.logged-out #sidebar-toggle { display: none; }
/* Flèche retour (topbar) : centrée sur la ligne du titre */
#back-btn { align-self: center; width: 30px; height: 30px; font-size: 15px; }
/* Les bannières fixes (espion / groupe) calées sur la sidebar suivent le repli. */
#spy-banner, #groupe-banner { transition: left .18s ease; }
body.sidebar-collapsed #spy-banner,
body.sidebar-collapsed #groupe-banner { left: 0; }
.brand {
  display: flex;
  align-items: center;
  gap: 10px;
  padding: 16px 16px;
  border-bottom: 1px solid var(--bd);
  color: inherit;
  text-decoration: none;
  transition: background 0.15s;
}
.brand:hover { background: var(--sf2); }
.brand:active { background: var(--sf3); }
.brand-logo-img {
  height: 40px;
  max-width: 130px;
  object-fit: contain;
  display: block;
}
.brand-text strong { display: block; font-size: 14px; }
.brand-text small  { color: var(--t3); font-size: 11px; }

#nav { padding: 6px 8px; flex: 1; overflow-y: auto; }
.nav-section { margin: 10px 0 8px; }
.nav-section-title, .nav-group-title {
  font-size: 10.5px;
  text-transform: uppercase;
  letter-spacing: .08em;
  color: var(--t3);
  padding: 6px 10px;
  font-weight: 600;
  cursor: pointer;
  user-select: none;
  display: flex; align-items: center; gap: 10px;
  border-radius: var(--rad-s);
}
.nav-section-title:hover, .nav-group-title:hover { color: var(--t); background: var(--sf2); }
/* Icône optionnelle devant un titre (sous-sections Devis/Suivi/Achats) */
#nav .nav-section-title .ic, #nav .nav-group-title .ic { display: inline-block; width: 18px; text-align: center; opacity: .9; font-size: 12px; }
/* Chevron à droite (poussé par margin-left:auto) : ouvre l'espace en vignettes */
.nav-section-title::after, .nav-group-title::after { content: '▸'; margin-left: auto; font-size: 9px; opacity: .55; }
/* Navigation par vignettes : la sidebar n'affiche QUE les grands menus. Les
   liens restent dans le DOM (source de vérité des vignettes + filtrage par
   droits) mais ne s'affichent jamais ici. */
#nav .nav-section > a { display: none !important; }
/* Grand menu actif (l'écran courant appartient à cette section / ce groupe) */
#nav .nav-section.active-sec > .nav-section-title,
#nav .nav-group.active-sec > .nav-group-title { color: #fff; background: var(--blue3); }

/* ── Groupe « Commercial » (premier niveau contenant des sous-sections) ── */
.nav-group { margin: 10px 0 8px; }
/* Sous-sections jamais listées dans la sidebar (elles vivent en vignettes) */
#nav .nav-group > .nav-section { display: none !important; }
/* Idem pour un lien direct du groupe (ex. Chantier : liens à plat + une
   sous-section « Générateur de documents ») — jamais listé ici non plus. */
#nav .nav-group > a { display: none !important; }
/* Sous-section dans un groupe : indentée, casse normale (≠ titres de 1er niveau) */
.nav-group > .nav-section { margin: 2px 0; }
.nav-group > .nav-section > .nav-section-title {
  text-transform: none; letter-spacing: 0; font-size: 12px; color: var(--t2);
  padding-left: 20px;
}
.nav-group > .nav-section > a { padding-left: 28px; }
#nav a {
  display: flex; align-items: center; gap: 10px;
  padding: 6px 10px;
  border-radius: var(--rad-s);
  font-size: 12px;
  color: var(--t2);
  margin-bottom: 1px;
}
/* Accueil : entrée directe en tête de sidebar, hors sections/accordéon —
   toujours visible, légèrement mise en avant. */
#nav > a.nav-home {
  margin: 2px 0 8px;
  padding: 8px 10px;
  font-size: 12.5px;
  font-weight: 600;
  color: var(--t);
  border: 1px solid var(--bd);
  background: var(--sf2);
}
#nav > a.nav-home:hover { background: var(--sf3); }
#nav > a.nav-home.active { background: var(--blue3); border-color: var(--blue3); color: #fff; }
#nav a .ic { display: inline-block; width: 18px; text-align: center; opacity: .9; }
.nav-badge {
  margin-left: auto;
  min-width: 16px; height: 16px; padding: 0 4px; box-sizing: border-box;
  background: var(--red); color: #fff; font-size: 10px; font-weight: 700;
  line-height: 16px; text-align: center; border-radius: 9px; flex: none;
}
.nav-badge.hidden { display: none; }
#nav a:hover { background: var(--sf2); color: var(--t); }
#nav a.active {
  background: var(--blue3);
  color: #fff;
  font-weight: 500;
}
#sidebar footer {
  padding: 10px 12px;
  border-top: 1px solid var(--bd);
  font-size: 11.5px;
  display: flex; flex-direction: column; gap: 8px;
  color: var(--t3);
}
.footer-row { display: flex; align-items: center; justify-content: space-between; gap: 8px; }
#sidebar footer a:hover { color: var(--t); }
.dot { display: inline-block; width: 7px; height: 7px; border-radius: 50%; background: var(--red); }
.dot.online { background: var(--green); }
/* Pastille présence — écran Utilisateurs, réservée au compte mpercet (cf. app.js
   _renderUsersRows) : même `.dot`/`.dot.online` que le statut API du pied de
   sidebar, juste réaligné pour un usage inline devant un nom. */
td .dot { vertical-align: middle; margin-right: 1px; }
/* Multi-agences : sélecteur d'agence visuel (bouton + menu déroulant) ───── */
.agence-switch { position: relative; width: 100%; }

/* Bouton déclencheur : badge (code) + nom + sous-titre + chevron. */
.ag-trigger {
  display: flex; align-items: center; gap: 9px; width: 100%;
  padding: 7px 9px; cursor: pointer; text-align: left;
  background: var(--sf2); border: 1px solid var(--bd); border-radius: 8px;
  color: var(--t); transition: border-color .12s, background .12s;
}
.ag-trigger:hover { border-color: var(--bd2); background: var(--sf3); }
.ag-trigger.is-groupe { border-color: #0f766e; background: rgba(15, 118, 110, .12); }

/* Pastille du code agence : largeur adaptée au texte (le code peut faire
   jusqu'à 8 caractères — un carré fixe le faisait déborder), bornée avec
   ellipse au-delà, hauteur constante pour rester alignée avec le nom. */
.ag-badge {
  flex: 0 0 auto; min-width: 26px; max-width: 76px; height: 26px;
  padding: 0 7px; border-radius: 7px;
  display: inline-flex; align-items: center; justify-content: center;
  font-size: 10.5px; font-weight: 700; letter-spacing: .02em;
  background: var(--blue3); color: #fff; text-transform: uppercase;
  white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
}
.ag-trigger.is-groupe .ag-badge, .ag-item.groupe .ag-badge { background: #0f766e; }

.ag-meta { display: flex; flex-direction: column; min-width: 0; flex: 1; line-height: 1.25; }
.ag-name { font-size: 12.5px; font-weight: 600; color: var(--t); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.ag-sub  { font-size: 10.5px; color: var(--t3); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }

.ag-caret { flex: 0 0 auto; color: var(--t3); font-size: 10px; transition: transform .15s; }
.ag-trigger[aria-expanded="true"] .ag-caret { transform: rotate(180deg); }

/* Menu déroulant : s'ouvre AU-DESSUS du bouton (footer en bas de sidebar). */
.ag-menu {
  position: absolute; left: 0; right: 0; bottom: calc(100% + 6px);
  background: var(--sf); border: 1px solid var(--bd2); border-radius: 10px;
  box-shadow: 0 8px 28px rgba(0, 0, 0, .35); padding: 6px; z-index: 300;
  display: flex; flex-direction: column; gap: 2px;
  max-height: 320px; overflow: auto;
}
.ag-item {
  display: flex; align-items: center; gap: 9px; width: 100%;
  padding: 7px 8px; cursor: pointer; text-align: left;
  background: transparent; border: 1px solid transparent; border-radius: 7px;
  color: var(--t); transition: background .12s;
}
.ag-item:hover  { background: var(--sf2); }
.ag-item.active { background: var(--sf2); }
.ag-item .ag-check { flex: 0 0 14px; color: var(--blue); font-weight: 700; font-size: 12px; text-align: center; }
.ag-item.groupe .ag-name { color: #14b8a6; }
.ag-divider { height: 1px; background: var(--bd); margin: 4px 2px; }
/* Affectation users↔agences (modale utilisateur) */
.ag-assign { display: flex; flex-direction: column; gap: 6px; max-height: 220px; overflow: auto; border: 1px solid var(--bd); border-radius: 8px; padding: 8px; }
.ag-row { display: flex; align-items: center; justify-content: space-between; gap: 10px; }
.ag-row .ck { margin: 0; }
.ag-row select { max-width: 200px; }
/* Lignes d'agence cliquables (écran Agences) */
#tb-agences tr.ag-rowclick { cursor: pointer; }
#tb-agences tr.ag-rowclick:hover td { background: var(--sf2); }

/* Main / topbar --------------------------------------------- */
#main { flex: 1; display: flex; flex-direction: column; min-width: 0; }
#topbar {
  background: var(--sf);
  border-bottom: 1px solid var(--bd);
  padding: 12px 24px;
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 16px;
}
.topbar-left { display: flex; align-items: baseline; gap: 12px; flex-wrap: wrap; }
#topbar h1 { font-size: 18px; font-weight: 600; }
#page-actions { display: flex; gap: 6px; flex-wrap: wrap; }
#view { padding: 18px 24px; flex: 1; overflow-x: auto; }

/* Boutons --------------------------------------------------- */
.btn {
  display: inline-flex; align-items: center; gap: 5px;
  padding: 7px 12px;
  border-radius: var(--rad-s);
  font-size: 13px;
  font-weight: 500;
  background: var(--sf2);
  border: 1px solid var(--bd);
  color: var(--t);
  transition: all .12s;
  white-space: nowrap;
}
.btn:hover { background: var(--sf3); border-color: var(--bd2); }
.btn.bp { background: var(--blue);  border-color: var(--blue);  color: #fff; }
.btn.bp:hover { background: var(--blue2); border-color: var(--blue2); }
.btn.bs { background: var(--sf3); border-color: var(--bd2); }
.btn.bg { background: transparent; border-color: transparent; color: var(--t2); }
.btn.bg:hover { background: var(--sf2); color: var(--t); }
.btn.bd { background: var(--red);  border-color: var(--red); color: #fff; }
.btn.bd:hover { background: #dc2626; border-color: #dc2626; }
.btn.bv { background: var(--green); border-color: var(--green); color: #fff; }
.btn.bv:hover { background: var(--green2); border-color: var(--green2); }
.btn.bsm { padding: 3px 8px; font-size: 11.5px; }
/* Groupe de boutons d'action en bout de ligne (tables) : espacement régulier
   pour éviter qu'ils se touchent (et limiter les clics par erreur sur 🗑). */
.row-actions { display: inline-flex; flex-wrap: wrap; align-items: center; gap: 8px; justify-content: flex-end; }
.row-actions .btn.bd { margin-left: 4px; }
.btn:disabled { opacity: .45; cursor: not-allowed; }
/* LG verrouillée (forcée par la sous-réf) : non éditable en édition de devis. */
input.lg-locked { background: var(--sf2); color: var(--t2); cursor: not-allowed; }
/* Ss-réf surlignée de sa couleur de repérage dans le récap du devis. */
code.recap-coul { padding: 1px 7px; border-radius: 4px; font-weight: 600; }

/* Saisie groupée des budgets (dep) — catalogue sous-réf + modale dépenses devis. */
.dep-groups { display: flex; flex-direction: column; gap: 10px; margin-top: 6px; }
.dep-group { background: var(--sf); border: 1px solid var(--bd); border-radius: var(--rad); padding: 9px 11px; }
.dep-group-head { font-size: 11px; font-weight: 600; text-transform: uppercase; letter-spacing: .02em; color: var(--t2); margin-bottom: 8px; }
.dep-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(150px, 1fr)); gap: 8px 10px; }
.dep-field { display: flex; flex-direction: column; gap: 3px; margin: 0; }
.dep-label { font-size: 12px; color: var(--t2); }
.dep-input { display: flex; align-items: center; gap: 4px; }
.dep-input input { border-top-right-radius: 0; border-bottom-right-radius: 0; text-align: right; }
.dep-input input[readonly] { background: var(--sf3); color: var(--t2); }
.dep-unit { display: inline-flex; align-items: center; padding: 0 9px; font-size: 12px; color: var(--t2);
  background: var(--sf3); border: 1px solid var(--bd); border-left: 0;
  border-radius: 0 var(--rad-s) var(--rad-s) 0; white-space: nowrap; }
/* Détail multi-lignes d'un budget (ROADMAP « DEPENSES CATALOGUE SS-REF ») :
   petit bouton pictogramme à côté du champ, flex:none pour ne pas s'étirer. */
.dep-detail-btn { flex: none; padding: 0 8px; }

.ic-btn {
  width: 28px; height: 28px;
  display: inline-flex; align-items: center; justify-content: center;
  border-radius: var(--rad-s);
  color: var(--t2);
}
.ic-btn:hover { background: var(--sf3); color: var(--t); }
/* Variante compacte : ⊕ « créer une ss-réf » logé DANS la cellule Ss-réf de
   l'édition de devis (gain de place dans la colonne actions). */
.ic-mini { width: 18px; height: 18px; font-size: 12px; vertical-align: middle; }

/* ── Communication & Ordre de Service (chat d'entreprise) ─────── */
.comm-card { display: flex; flex-direction: column; padding: 0; }
.comm-msgs { overflow-y: auto; max-height: calc(100vh - 320px); min-height: 220px;
             padding: 14px 16px; display: flex; flex-direction: column; gap: 10px; }
.comm-msg { background: var(--sf2); border: 1px solid var(--bd); border-radius: 10px; padding: 8px 12px; }
.comm-msg.mine { border-color: var(--blue); }
.comm-head { display: flex; align-items: center; gap: 8px; }
.comm-body { white-space: pre-wrap; margin-top: 4px; }
.comm-compose { display: flex; gap: 8px; padding: 10px 12px; border-top: 1px solid var(--bd);
                background: var(--sf2); border-radius: 0 0 var(--rad) var(--rad); }
.comm-compose textarea { flex: 1; resize: vertical; }

/* Cards ----------------------------------------------------- */
.card {
  background: var(--sf);
  border: 1px solid var(--bd);
  border-radius: var(--rad);
  padding: 16px;
  box-shadow: var(--sh);
}
.card h3 {
  font-size: 12px;
  text-transform: uppercase;
  letter-spacing: .04em;
  color: var(--t3);
  margin-bottom: 8px;
  font-weight: 600;
}

/* Grid utils */
.grid { display: grid; gap: 14px; }
.grid.c2 { grid-template-columns: repeat(2, 1fr); }
.grid.c3 { grid-template-columns: repeat(3, 1fr); }
.grid.c4 { grid-template-columns: repeat(4, 1fr); }
@media (max-width: 960px) { .grid.c3, .grid.c4 { grid-template-columns: repeat(2, 1fr); } }
@media (max-width: 640px) { .grid.c2, .grid.c3, .grid.c4 { grid-template-columns: 1fr; } }

/* KPI cards ------------------------------------------------- */
.kpi {
  background: var(--sf);
  border: 1px solid var(--bd);
  border-left: 3px solid var(--blue);
  border-radius: var(--rad);
  padding: 14px 16px;
}
.kpi.kv { border-left-color: var(--green); }
.kpi.ka { border-left-color: var(--orange); }
.kpi.kr { border-left-color: var(--red); }

/* Cartes de synthèse du tableau de bord commercial */
.synth-env { border-left: 4px solid #0ea5e9; }
.synth-val { border-left: 4px solid var(--green); }
.kpi.kp { border-left-color: var(--rose); }
.kpi .lbl { font-size: 11.5px; color: var(--t3); text-transform: uppercase; letter-spacing: .04em; }
.kpi .val { font-size: 22px; font-weight: 700; margin-top: 4px; }
.kpi .sub { font-size: 11.5px; color: var(--t2); margin-top: 4px; }

/* Santé des chantiers en cours (dashboard) : 2 jauges épurées ----- */
/* Barre fine ; la piste est une version claire de la MÊME teinte que le
   remplissage (l'état se lit sur toute la barre). Textes en tokens texte,
   jamais dans la couleur de la donnée. */
.sante-body { display: flex; flex-direction: column; gap: 18px; padding: 16px; }
.sante-meter .sm-top { display: flex; align-items: baseline; justify-content: space-between; margin-bottom: 7px; }
.sante-meter .sm-lbl { font-size: 12px; color: var(--t2); text-transform: uppercase; letter-spacing: .05em; font-weight: 600; }
.sante-meter .sm-pct { font-size: 26px; font-weight: 700; color: var(--t); line-height: 1; }
.sante-meter .sm-bar { height: 10px; border-radius: 5px; overflow: hidden; }
.sante-meter .sm-fill { height: 100%; border-radius: 0 4px 4px 0; transition: width .4s ease; }
.sante-meter .sm-foot { display: flex; align-items: baseline; gap: 6px; margin-top: 7px; font-size: 12px; flex-wrap: wrap; }
.sante-meter .sm-val { font-weight: 600; color: var(--t); }
.sante-meter .sm-tot { color: var(--t2); }
.sante-meter .sm-over { color: var(--red); font-weight: 600; }
/* Teintes : dépenses = bleu (orange ≥ 90 %, rouge > 100 %), facturé = vert. */
.sante-meter.sev-dep    .sm-bar { background: rgba(6,182,212,.16); }
.sante-meter.sev-dep    .sm-fill { background: var(--blue); }
.sante-meter.sev-warn   .sm-bar { background: rgba(245,158,11,.18); }
.sante-meter.sev-warn   .sm-fill { background: var(--orange); }
.sante-meter.sev-danger .sm-bar { background: rgba(239,68,68,.18); }
.sante-meter.sev-danger .sm-fill { background: var(--red); }
.sante-meter.sev-fact   .sm-bar { background: rgba(16,185,129,.16); }
.sante-meter.sev-fact   .sm-fill { background: var(--green); }

/* Recherche globale (onglet Recherche) ----------------------- */
.gs-input { font-size: 16px; padding: 12px 14px; }
.gs-list .gs-row {
  display: flex; align-items: center; gap: 12px;
  padding: 10px 16px; color: inherit; text-decoration: none;
  border-top: 1px solid var(--bd);
}
.gs-list .gs-row:hover { background: var(--sf2); }
.gs-row .gs-main { flex: 1; min-width: 0; }
.gs-row .gs-titre { font-weight: 600; font-size: 13px; }
.gs-row .gs-arrow { color: var(--t3); font-size: 18px; }

/* Raccourcis vers les TB détaillés (depuis le dashboard général) */
.dash-shortcut {
  position: relative;
  display: grid;
  grid-template-columns: 60px 1fr 28px;
  align-items: center;
  gap: 16px;
  padding: 18px 20px 18px 24px;
  background: var(--sf);
  border: 1px solid var(--bd);
  border-radius: var(--rad);
  text-decoration: none;
  color: inherit;
  overflow: hidden;
  transition: transform .15s ease, box-shadow .15s ease, border-color .15s ease;
}
.dash-shortcut::before {
  content: "";
  position: absolute;
  inset: 0 auto 0 0;
  width: 5px;
  background: var(--blue);
}
.dash-shortcut.sc-comm::before { background: linear-gradient(180deg, #06b6d4, #0891b2); }
.dash-shortcut.sc-chan::before { background: linear-gradient(180deg, #f59e0b, #d97706); }
.dash-shortcut:hover {
  transform: translateY(-2px);
  box-shadow: 0 8px 22px rgba(0,0,0,.10);
}
.dash-shortcut.sc-comm:hover { border-color: var(--blue); }
.dash-shortcut.sc-chan:hover { border-color: var(--orange); }
.dash-shortcut .ic {
  width: 56px; height: 56px;
  display: grid; place-items: center;
  font-size: 28px;
  border-radius: 12px;
  background: rgba(6,182,212,.10);
}
.dash-shortcut.sc-chan .ic { background: rgba(245,158,11,.12); }
.dash-shortcut .bd h3 {
  margin: 0 0 4px;
  font-size: 15px;
  font-weight: 700;
  color: var(--t);
}
.dash-shortcut .bd p {
  margin: 0;
  font-size: 12.5px;
  color: var(--t2);
  line-height: 1.45;
}
.dash-shortcut .ar {
  font-size: 24px;
  font-weight: 600;
  color: var(--t3);
  transition: transform .15s ease, color .15s ease;
}
.dash-shortcut:hover .ar { transform: translateX(4px); }
.dash-shortcut.sc-comm:hover .ar { color: var(--blue); }
.dash-shortcut.sc-chan:hover .ar { color: var(--orange); }

/* Tableau card ---------------------------------------------- */
.tc {
  background: var(--sf);
  border: 1px solid var(--bd);
  border-radius: var(--rad);
  overflow: hidden;
}
.tc > header {
  padding: 12px 16px;
  border-bottom: 1px solid var(--bd);
  display: flex; align-items: center; justify-content: space-between;
  gap: 10px;
}
.tc > header h2 { font-size: 14px; font-weight: 600; }
/* Lien « Détail des données » dans l'en-tête d'un graphique (remplace l'ancienne
   légende « survole une barre… ») : discret, accentué au survol. */
.lnk-detail { font-size: 12px; color: var(--t3); text-decoration: none; white-space: nowrap; }
.lnk-detail:hover { color: var(--blue); text-decoration: underline; }
.tc .toolbar {
  padding: 8px 16px;
  border-bottom: 1px solid var(--bd);
  background: var(--sf2);
  display: flex; gap: 8px; align-items: center; flex-wrap: wrap;
}
.tc .toolbar input, .tc .toolbar select { max-width: 260px; }
.tc .empty {
  padding: 36px 18px;
  text-align: center;
  color: var(--t3);
  font-size: 13px;
}
/* Tableaux avec leur propre sous-fenêtre de défilement (conteneur à
   max-height + overflow:auto, cf. classe `tc-scroll` posée en JS) : en-tête
   de colonnes figé pendant le défilement des lignes. */
.tc-scroll thead th {
  position: sticky;
  top: 0;
  background: var(--sf2);
  z-index: 2;
}

/* Badges statuts -------------------------------------------- */
.b {
  display: inline-block;
  padding: 1px 7px;
  font-size: 10.5px;
  border-radius: 10px;
  font-weight: 600;
  text-transform: uppercase;
  letter-spacing: .03em;
  border: 1px solid transparent;
  white-space: nowrap;
}
.b-br        { background: #2a3552; color: #cbd5e1; }
.b-en        { background: #082f49; color: #7dd3fc; border-color: #155e75; }
.b-neg       { background: #2e1065; color: #c4b5fd; border-color: #5b21b6; }
.b-re        { background: #451a03; color: #fdba74; border-color: #9a3412; }
.b-va        { background: #052e1f; color: #6ee7b7; border-color: #065f46; }
.b-ar        { background: #1e293b; color: #cbd5e1; border-color: #475569; }
.b-pe        { background: #450a0a; color: #fca5a5; border-color: #991b1b; }
.b-tse       { background: #083344; color: #67e8f9; border-color: #155e75; }
.b-tsv       { background: #052e1f; color: #6ee7b7; border-color: #065f46; }
.b-tsr       { background: #450a0a; color: #fca5a5; border-color: #991b1b; }
.b-fa        { background: #052e1f; color: #6ee7b7; border-color: #065f46; }
.b-sdef      { background: #082f49; color: #7dd3fc; border-color: #155e75; }
.b-sct       { background: #422006; color: #fde68a; border-color: #92400e; }
.b-sem       { background: #082f49; color: #7dd3fc; border-color: #155e75; }
/* Type de demande (Demandes BE — badge board). */
.b-ty        { background: #3730a3; color: #c7d2fe; border-color: #4338ca; }

/* Pills */
.pill {
  display: inline-block;
  padding: 1px 7px;
  border-radius: 3px;
  font-size: 10.5px;
  font-weight: 500;
  background: var(--sf3);
  color: var(--t2);
  margin-right: 4px;
}
.pill.ts { background: #155e75; color: #7dd3fc; }

/* Modal ----------------------------------------------------- */
.ov {
  position: fixed; inset: 0;
  display: flex; align-items: center; justify-content: center;
  z-index: 100;
}
.ov.hidden { display: none; }
.ov-bg { position: absolute; inset: 0; background: rgba(2,6,23,.7); backdrop-filter: blur(2px); }
.modal {
  position: relative;
  background: var(--sf);
  border: 1px solid var(--bd);
  border-radius: var(--rad);
  width: 92%;
  max-width: 620px;
  max-height: 92vh;
  display: flex;
  flex-direction: column;
  box-shadow: var(--sh2);
  overflow: hidden;
}
.modal.lg  { max-width: 900px; }
.modal.xl  { max-width: 1180px; }
.modal.full { max-width: calc(100vw - 60px); max-height: calc(100vh - 60px); }
.modal.sm  { max-width: 380px; }
.mh {
  padding: 12px 16px;
  border-bottom: 1px solid var(--bd);
  display: flex; align-items: center; justify-content: space-between;
}
.mh h2 { font-size: 15px; font-weight: 600; }
.mb2 { padding: 16px; overflow-y: auto; flex: 1; }
.mf {
  padding: 10px 16px;
  border-top: 1px solid var(--bd);
  display: flex; justify-content: flex-end; gap: 8px;
  background: var(--sf2);
}

/* Forms ----------------------------------------------------- */
.fr  { margin-bottom: 10px; }
.fg  { display: grid; gap: 10px; grid-template-columns: repeat(2, 1fr); }
.fg.c1 { grid-template-columns: 1fr; }
.fg.c3 { grid-template-columns: repeat(3, 1fr); }
.fg.c4 { grid-template-columns: repeat(4, 1fr); }
.fg .full { grid-column: 1 / -1; }
@media (max-width: 600px) { .fg, .fg.c3, .fg.c4 { grid-template-columns: 1fr; } }

/* Toasts ---------------------------------------------------- */
#toasts {
  position: fixed;
  bottom: 92px; right: 18px;   /* au-dessus du bouton flottant « + » */
  display: flex; flex-direction: column; gap: 8px;
  z-index: 200;
}
.toast {
  background: var(--sf3);
  color: var(--t);
  padding: 10px 14px;
  border-radius: var(--rad-s);
  font-size: 12.5px;
  min-width: 220px;
  border-left: 3px solid var(--blue);
  box-shadow: var(--sh2);
  animation: slide-in .22s ease;
}
.toast.success { border-left-color: var(--green); }
.toast.error   { border-left-color: var(--red);   }
.toast.warn    { border-left-color: var(--orange);}
@keyframes slide-in {
  from { transform: translateX(40px); opacity: 0; }
  to   { transform: translateX(0); opacity: 1; }
}

/* ── Verrouillage pessimiste (bandeau de blocage, sprint SS2) ──── */
.verrou-bandeau {
  display: flex; align-items: flex-start; gap: 12px;
  background: var(--sf3);
  border-left: 3px solid var(--orange);
  border-radius: var(--rad-s);
  padding: 10px 14px;
  margin-bottom: 12px;
  font-size: 13px;
  color: var(--t);
  box-shadow: var(--sh2);
}
.verrou-bandeau .vb-ico { font-size: 16px; line-height: 1.4; flex: none; }
.verrou-bandeau .vb-txt { flex: 1 1 auto; line-height: 1.4; }
.verrou-bandeau .vb-txt b { display: block; color: var(--t); }
.verrou-bandeau .vb-txt small { display: block; color: var(--t2); margin-top: 2px; }
.verrou-bandeau .vb-actions { flex: none; display: flex; gap: 8px; align-items: center; }

/* ── Bouton flottant « + » (raccourcis de création) ────────────── */
#fab-create {
  /* Sous la modale (.ov = 100) pour ne pas flotter par-dessus une création en
     cours ; au-dessus du contenu normal de la page. */
  position: fixed; bottom: 24px; right: 24px; z-index: 90;
  display: flex; flex-direction: column; align-items: flex-end; gap: 12px;
}
body.logged-out #fab-create { display: none; }
body.spying #fab-create { bottom: 44px; }   /* au-dessus de la barre « mode espion » */
#fab-btn {
  width: 46px; height: 46px; border-radius: 50%; position: relative;
  background: linear-gradient(135deg, var(--blue), var(--blue2));
  box-shadow: 0 6px 18px rgba(6, 182, 212, .42), 0 2px 6px rgba(0, 0, 0, .3);
  transition: transform .22s cubic-bezier(.34, 1.56, .64, 1), box-shadow .2s, filter .15s;
}
/* Le « + » est dessiné en deux barres parfaitement centrées (top/left 50% +
   marges négatives) → il reste centré quand le bouton tourne pour faire la croix. */
#fab-btn::before, #fab-btn::after {
  content: ''; position: absolute; top: 50%; left: 50%;
  background: #fff; border-radius: 2px;
}
#fab-btn::before { width: 16px; height: 2.5px; margin: -1.25px 0 0 -8px; }
#fab-btn::after  { width: 2.5px; height: 16px; margin: -8px 0 0 -1.25px; }
#fab-btn:hover { filter: brightness(1.08); box-shadow: 0 9px 24px rgba(6, 182, 212, .55), 0 2px 6px rgba(0, 0, 0, .35); }
#fab-btn:active { transform: scale(.94); }
#fab-create.open #fab-btn { transform: rotate(135deg); }   /* + → × (barres centrées) */
.fab-menu { display: flex; flex-direction: column; gap: 9px; align-items: flex-end; }
.fab-menu.hidden { display: none; }
.fab-item {
  display: flex; align-items: center; gap: 11px;
  background: var(--sf); color: var(--t);
  border: 1px solid var(--bd); border-radius: 12px;
  padding: 7px 15px 7px 7px; font-size: 13px; font-weight: 500;
  box-shadow: var(--sh2); white-space: nowrap; cursor: pointer;
  animation: fab-pop .2s cubic-bezier(.34, 1.56, .64, 1) backwards;
  transition: transform .12s ease, border-color .12s, box-shadow .12s;
}
.fab-item:hover { border-color: var(--blue); transform: translateX(-3px); box-shadow: var(--sh2), 0 0 0 1px var(--blue) inset; }
.fab-item .fab-ic {
  width: 30px; height: 30px; border-radius: 9px; flex-shrink: 0;
  display: flex; align-items: center; justify-content: center;
  background: var(--sf3); font-size: 16px; line-height: 1;
}
.fab-item .fab-lbl { padding-right: 2px; }
.fab-item:nth-child(1) { animation-delay: .02s; }
.fab-item:nth-child(2) { animation-delay: .05s; }
.fab-item:nth-child(3) { animation-delay: .08s; }
.fab-item:nth-child(4) { animation-delay: .11s; }
.fab-item:nth-child(5) { animation-delay: .14s; }
@keyframes fab-pop { from { opacity: 0; transform: translateY(8px) scale(.96); } to { opacity: 1; transform: none; } }

/* ============================================================
   Wizard (devis 3 étapes)
   ============================================================ */
.wiz-steps {
  display: flex; gap: 4px; margin-bottom: 16px;
  background: var(--sf);
  border: 1px solid var(--bd);
  border-radius: var(--rad);
  padding: 6px;
}
.wiz-steps button {
  flex: 1;
  padding: 9px 12px;
  border-radius: var(--rad-s);
  font-size: 13px;
  font-weight: 500;
  color: var(--t2);
  display: flex; align-items: center; justify-content: center; gap: 8px;
}
.wiz-steps button .n {
  width: 22px; height: 22px;
  border-radius: 50%;
  background: var(--sf3);
  color: var(--t2);
  display: inline-flex; align-items: center; justify-content: center;
  font-weight: 700;
  font-size: 12px;
}
.wiz-steps button.active { background: var(--sf2); color: var(--t); }
.wiz-steps button.active .n { background: var(--blue); color: #fff; }
.wiz-steps button.done .n { background: var(--green); color: #fff; }

/* Bâtiments chips */
.bats-chips {
  display: flex; flex-wrap: wrap; gap: 6px; margin-top: 4px;
}
.bat-chip {
  display: inline-flex; align-items: center; gap: 4px;
  background: var(--sf3);
  border: 1px solid var(--bd);
  padding: 4px 4px 4px 9px;
  border-radius: 14px;
  font-size: 12px;
}
.bat-chip input { background: transparent; border: none; padding: 0; width: 70px; }
.bat-chip input:focus { box-shadow: none; }
.bat-chip button { color: var(--t3); padding: 0 5px; font-size: 14px; }
.bat-chip button:hover { color: var(--red); }

/* ============================================================
   Devis : table de lignes (étape 2)
   ============================================================ */
.dv-lignes {
  border: 1px solid var(--bd);
  border-radius: var(--rad);
  background: var(--sf);
  overflow-x: auto;
}
/* Édition devis (étape Lignes) : le tableau défile DANS son cadre (hauteur
   bornée à l'écran) → la ligne des titres, déjà sticky top, reste visible en
   descendant dans le devis ; la barre d'actions (+ Titre, + Ouvrage…) colle en
   bas. NB : le sticky ne peut pas s'appuyer sur le scroll de la page — #view
   et .dv-lignes sont des conteneurs overflow qui l'en empêchent. */
.dv-sticky { overflow: auto; max-height: max(320px, calc(100vh - 180px)); }
.dv-sticky .lignes-actions { position: sticky; bottom: 0; left: 0; z-index: 2; }
.dv-lignes table { font-size: 12.5px; min-width: 1000px; }
.dv-lignes th { background: var(--sf2); position: sticky; top: 0; z-index: 1; }
.dv-lignes td { padding: 6px 8px; border-bottom: 1px solid var(--bd); }
.dv-lignes td input,
.dv-lignes td select,
.dv-lignes td textarea {
  padding: 4px 6px;
  font-size: 12px;
  background: transparent;
  border: 1px solid transparent;
}
.dv-lignes td input:hover,
.dv-lignes td select:hover,
.dv-lignes td textarea:hover { border-color: var(--bd); background: var(--sf2); }
.dv-lignes td input:focus,
.dv-lignes td select:focus,
.dv-lignes td textarea:focus { border-color: var(--blue); background: var(--sf2); }
/* Combos datalist (ref / ssref) — apparence légèrement marquée */
.dv-lignes td input[list] {
  border-color: var(--bd);
  background: var(--sf2);
  cursor: text;
}
.dv-lignes td input[list]:hover { background: var(--sf3); }
.dv-lignes tr.t-titre td      { background: var(--red3); color: #fff; font-weight: 600; }
.dv-lignes tr.t-titre td input { color: #fff; font-weight: 600; }
.dv-lignes tr.t-soustitre td  { background: #7c2d12; color: #fed7aa; font-weight: 500; }
.dv-lignes tr.t-soustitre td input { color: #fed7aa; }
.dv-lignes tr.t-sst td        { background: #422006; color: #fde68a; font-weight: 500; }
.dv-lignes tr.t-sst td input  { color: #fde68a; }
.dv-lignes tr.t-fd td         { background: #1e3a5f; color: #cbd5e1; font-style: italic; }
.dv-lignes tr.t-fd td input,
.dv-lignes tr.t-fd td textarea { color: #cbd5e1; font-style: italic; }
/* Notes : pas de surlignement (pour ne plus confondre avec les ss-ss-titres) —
   simplement en gras italique. */
.dv-lignes tr.t-note td       { font-style: italic; font-weight: 600; color: var(--t); }
.dv-lignes tr.t-note td input { font-style: italic; font-weight: 600; color: var(--t); }
.dv-lignes tr.t-ouvrage:hover td { background: rgba(255,255,255,.03); }
.dv-lignes .row-drag { cursor: grab; color: var(--t3); user-select: none; text-align: center; width: 16px; }
.dv-lignes .row-drag:hover { color: var(--t); }
.dv-lignes tr.dragging { opacity: 0.4; }
.dv-lignes tr.drag-over td { border-top: 2px solid var(--blue); }
/* Flash de repérage de la ligne fraîchement ajoutée (auto-scroll des boutons
   d'ajout de l'édition de devis). */
@keyframes dv-row-flash { 0%, 60% { background: rgba(37, 99, 235, .22); } 100% { background: transparent; } }
.dv-lignes tr.row-flash td { animation: dv-row-flash 1.6s ease; }
/* Même repérage, générique pour les autres tableaux (ex. arrivée depuis un
   résultat de la Recherche globale, ROADMAP « ONGLET RECHERCHE »). */
.tc table tr.row-flash td { animation: dv-row-flash 1.6s ease; }

.lignes-actions {
  display: flex; gap: 6px; flex-wrap: wrap;
  padding: 10px;
  background: var(--sf2);
  border-top: 1px solid var(--bd);
}

/* ============================================================
   Devis détail header
   ============================================================ */
.dv-head {
  background: var(--sf);
  border: 1px solid var(--bd);
  border-radius: var(--rad);
  padding: 14px 16px;
  margin-bottom: 14px;
  display: grid;
  grid-template-columns: 1fr auto;
  gap: 14px;
}
.dv-head h2 { font-size: 17px; margin-bottom: 3px; }
.dv-head .meta { color: var(--t2); font-size: 12.5px; }
.dv-head .tot { text-align: right; }
.dv-head .tot .ht { font-size: 22px; font-weight: 700; }
.dv-head .tot .mn { font-size: 12px; color: var(--green); margin-top: 4px; }

/* Barre d'action rapide pour changer le statut d'un devis */
/* ── Carte de statut d'un devis : pipeline du cycle de vie + actions ─── */
.dv-status-card {
  background: var(--sf);
  border: 1px solid var(--bd);
  border-radius: var(--rad-s);
  padding: 12px 14px;
  margin-bottom: 12px;
}

/* Pipeline visuel : étapes Brouillon → Envoyé → Négociation → Validé → Archivé,
   reliées par un trait. État : done (✓ vert), current (numéro bleu, surligné),
   todo (gris). 'perdu'/'ts_refuse' = étape « lost » rouge en bout de chaîne. */
.dv-flow { display: flex; align-items: center; flex-wrap: wrap; gap: 0; }
.dv-step {
  display: inline-flex; align-items: center; gap: 7px;
  padding: 4px 10px; border-radius: 999px;
  font-size: 12px; font-weight: 600; color: var(--t3);
  white-space: nowrap;
}
.dv-step .dot {
  width: 18px; height: 18px; flex: 0 0 18px;
  border-radius: 50%; display: grid; place-items: center;
  font-size: 10.5px; line-height: 1;
  background: var(--sf3); color: var(--t3); border: 1px solid var(--bd2);
}
.dv-step.done    { color: var(--t2); }
.dv-step.done    .dot { background: var(--green); color: #fff; border-color: var(--green); }
.dv-step.current { color: var(--t); background: var(--sf2); }
.dv-step.current .dot { background: var(--blue); color: #fff; border-color: var(--blue); }
.dv-step.lost    { color: var(--red); background: rgba(239, 68, 68, .10); }
.dv-step.lost    .dot { background: var(--red); color: #fff; border-color: var(--red); }
.dv-sep { flex: 0 0 16px; height: 2px; background: var(--bd2); margin: 0 1px; border-radius: 2px; }

/* Séparateur vertical dans la barre d'actions d'en-tête (isole Supprimer). */
.act-sep { width: 1px; align-self: stretch; background: var(--bd); margin: 0 5px; }

/* Statut en lecture seule dans le formulaire infos (se change via la carte). */
.dv-statut-ro { display: flex; align-items: center; gap: 8px; min-height: 34px; }

/* Zone d'actions : libellé + boutons groupés, séparée du pipeline par un trait. */
.dv-actions {
  display: flex; align-items: center; flex-wrap: wrap; gap: 8px 10px;
  margin-top: 11px; padding-top: 11px; border-top: 1px solid var(--bd);
}
.dv-actions-lbl {
  font-size: 11px; color: var(--t3);
  text-transform: uppercase; letter-spacing: .04em;
}
.dv-actions-btns { display: flex; flex-wrap: wrap; gap: 7px; }

.dv-mini {
  display: grid;
  grid-template-columns: repeat(5, 1fr);
  gap: 10px;
  margin-bottom: 14px;
}
.dv-mini .m {
  background: var(--sf);
  border: 1px solid var(--bd);
  border-radius: var(--rad-s);
  padding: 9px 11px;
}
.dv-mini .m .lbl { font-size: 10.5px; color: var(--t3); text-transform: uppercase; }
.dv-mini .m .val { font-size: 15px; font-weight: 600; margin-top: 2px; }
@media (max-width: 900px) { .dv-mini { grid-template-columns: repeat(2, 1fr); } }

/* ── Rentabilité chantier — bandeau « OBJECTIF vs RÉSULTAT » ──────── */
.ovr { display: flex; flex-direction: column; gap: 10px; }
.ovr-titre {
  font-size: 12px; font-weight: 800; letter-spacing: .1em;
  text-transform: uppercase; color: var(--t3);
}
/* En-tête du bandeau : titre à gauche, puces d'années (N / N-1 / N-2…) à droite. */
.ovr-head { display: flex; align-items: center; justify-content: space-between; gap: 12px; flex-wrap: wrap; }
.ovr-annees { margin: 0; }
.ovr-annees .pl-tab { padding: 3px 10px; font-size: 12px; }
.ovr-row {
  display: flex; align-items: center; gap: 16px;
  background: var(--sf); border: 1px solid var(--bd);
  border-radius: var(--rad); box-shadow: var(--sh);
  padding: 12px 18px;
}
.ovr-lbl { flex: 1; font-weight: 700; font-size: 15px; min-width: 0; }
.ovr-sub { font-weight: 400; font-size: 11px; color: var(--t3); margin-top: 2px; }
.ovr-obj { color: var(--t3); font-size: 13px; white-space: nowrap; }
.ovr-obj b { font-size: 16px; font-weight: 700; color: var(--t2); margin-left: 4px; }
.ovr-val { font-size: 20px; font-weight: 800; text-align: right; white-space: nowrap; min-width: 120px; }
.ovr-val-sub { display: block; font-size: 11px; font-weight: 600; color: var(--t3); }
.ovr-row.ok   .ovr-val { color: var(--green); }
.ovr-row.warn .ovr-val { color: var(--orange); }
.ovr-row.bad  .ovr-val { color: var(--red); }
.ovr-row.off  .ovr-val { color: var(--t3); }
.ovr-ico {
  flex: none; width: 34px; height: 34px; border-radius: 50%;
  display: flex; align-items: center; justify-content: center;
  color: #fff; font-weight: 800; font-size: 16px; background: var(--t3);
}
.ovr-row.ok .ovr-ico { background: var(--green); }
.ovr-row.warn .ovr-ico, .ovr-row.bad .ovr-ico {
  border-radius: 0; clip-path: polygon(50% 4%, 100% 96%, 0 96%);
  align-items: flex-end; padding-bottom: 3px; font-size: 14px;
}
.ovr-row.warn .ovr-ico { background: var(--orange); }
.ovr-row.bad  .ovr-ico { background: var(--red); }
.ovr-row.off  .ovr-ico { font-size: 11px; }
@media (max-width: 640px) {
  .ovr-row { flex-wrap: wrap; }
  .ovr-lbl { flex: 1 1 100%; }
  .ovr-obj { margin-left: auto; }
}

/* ── Facturation — liste des chantiers (niveau 1) ─────────────────── */
.ch-totals { display: flex; gap: 12px; flex-wrap: wrap; }
.ch-total {
  background: var(--sf); border: 1px solid var(--bd); border-radius: var(--rad);
  padding: 10px 16px; min-width: 160px;
}
.ch-total .num { font-size: 17px; margin-top: 2px; }
.ch-list { display: flex; flex-direction: column; gap: 10px; }
.ch-row {
  display: grid;
  grid-template-columns: 1fr 150px 110px 230px 24px;
  gap: 16px;
  align-items: center;
  background: var(--sf);
  border: 1px solid var(--bd);
  border-radius: var(--rad);
  padding: 14px 18px;
  cursor: pointer;
  transition: border-color .12s, background .12s, transform .06s;
}
.ch-row:hover { background: var(--sf2); border-color: var(--bd2); }
.ch-row:active { transform: scale(.997); }
.ch-row:focus-visible { outline: 2px solid var(--blue); outline-offset: 2px; }
.ch-title { font-size: 14.5px; font-weight: 600; color: var(--t); }
.ch-sub { margin-top: 2px; }
.ch-metric .num { font-size: 14px; margin-top: 2px; }
.ch-arrow { font-size: 26px; color: var(--t3); text-align: center; line-height: 1; }
@media (max-width: 820px) {
  .ch-row { grid-template-columns: 1fr auto; }
  .ch-row .ch-prog, .ch-row .ch-metric:nth-child(3) { display: none; }
}

/* ── Fiches chantiers — liste (niveau 1) : avancement global P.D.C/Pose ── */
.fch-row {
  display: flex; align-items: center; gap: 18px;
  background: var(--sf); border: 1px solid var(--bd); border-radius: var(--rad);
  padding: 14px 18px; cursor: pointer;
  transition: border-color .12s, background .12s, transform .06s;
}
.fch-row:hover { background: var(--sf2); border-color: var(--bd2); }
.fch-row:active { transform: scale(.997); }
.fch-row:focus-visible { outline: 2px solid var(--blue); outline-offset: 2px; }
.fch-main { flex: 1 1 auto; min-width: 0; }
.fch-bars { display: flex; flex-direction: column; gap: 6px; width: 230px; flex: 0 0 auto; }
.fch-bar-item { display: flex; align-items: center; gap: 8px; }
.fch-bar-lbl {
  font-size: 10.5px; font-weight: 700; color: var(--t3);
  text-transform: uppercase; letter-spacing: .03em; width: 36px; flex: 0 0 auto;
}
.fch-bar { flex: 1 1 auto; height: 7px; border-radius: 999px; background: var(--sf3); overflow: hidden; }
.fch-bar-fill { height: 100%; border-radius: 999px; background: var(--orange); transition: width .2s; }
.fch-bar-fill.ok { background: var(--green); }
.fch-bar-pct { font-size: 11px; font-weight: 600; color: var(--t2); width: 32px; text-align: right; flex: 0 0 auto; }
@media (max-width: 820px) {
  .fch-row { flex-wrap: wrap; }
  .fch-bars { width: 100%; order: 3; flex-direction: row; gap: 16px; }
  .fch-bar-item { flex: 1 1 0; }
}

/* Pastilles d'état de facturation sur une situation */
.ftag {
  display: inline-block; font-size: 10px; font-weight: 600; line-height: 1;
  padding: 3px 7px; border-radius: 999px; margin-left: 4px; vertical-align: middle;
}
.ftag-fact  { background: rgba(16,185,129,.16); color: var(--green); }
.ftag-avoir { background: rgba(239,68,68,.16);  color: var(--red); }
.ftag-corr  { background: rgba(6,182,212,.16);  color: var(--blue); }

/* ── Section Envoyés : sous-groupes par nombre de relances ────────── */
.env-group + .env-group { margin-top: 6px; }
.env-group-hd {
  display: flex; align-items: center; gap: 8px;
  padding: 12px 14px 6px;
  font-size: 12.5px; font-weight: 600; color: var(--t2);
  text-transform: uppercase; letter-spacing: .03em;
}
.env-count {
  font-size: 11px; font-weight: 600; color: var(--t3);
  background: var(--sf2); border: 1px solid var(--bd);
  border-radius: 999px; padding: 1px 8px; text-transform: none; letter-spacing: 0;
}

/* ── Page d'actions d'une situation (niveau 3) ────────────────────── */
.act-grid {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(230px, 1fr));
  gap: 12px;
}
.act-card {
  display: flex; flex-direction: column; gap: 3px;
  text-align: left; align-items: flex-start;
  background: var(--sf);
  border: 1px solid var(--bd);
  border-left: 3px solid var(--bd2);
  border-radius: var(--rad);
  padding: 16px 16px;
  cursor: pointer; color: var(--t);
  transition: border-color .12s, background .12s, transform .06s;
}
.act-card:hover { background: var(--sf2); border-color: var(--bd2); }
.act-card:active { transform: scale(.99); }
.act-card.bp { border-left-color: var(--blue); }
.act-card.bd { border-left-color: var(--red); }
.act-icon  { font-size: 22px; line-height: 1; margin-bottom: 4px; }
.act-label { font-size: 14px; font-weight: 600; }
.act-desc  { font-size: 11.5px; color: var(--t3); }

/* ── Formulaire d'édition d'un devis (étape Informations) ─────────── */
/* Deux colonnes : le devis lui-même à gauche, sa vie commerciale à droite. */
.dform-grid {
  display: grid;
  grid-template-columns: minmax(0, 1.55fr) minmax(0, 1fr);
  gap: 14px;
  align-items: start;
}
.dform-col { display: flex; flex-direction: column; gap: 14px; min-width: 0; }
@media (max-width: 1080px) { .dform-grid { grid-template-columns: 1fr; } }

/* Cartes-sections : en-tête icône + titre + sous-titre explicatif */
.dsec-hd { display: flex; align-items: center; gap: 11px; margin-bottom: 14px; }
.dsec-ic {
  width: 36px; height: 36px; flex-shrink: 0;
  display: flex; align-items: center; justify-content: center;
  font-size: 17px; border-radius: 9px;
  background: rgba(6,182,212,.13);
  border: 1px solid rgba(6,182,212,.25);
}
.dsec-title { font-size: 13.5px; font-weight: 700; color: var(--t); line-height: 1.2; }
.dsec-sub   { font-size: 11.5px; color: var(--t3); margin-top: 2px; }

/* Aide contextuelle sous un champ + marqueur champ requis */
.fhelp { display: block; font-size: 11px; color: var(--t3); margin-top: 4px; line-height: 1.4; }
label .req { color: var(--rose); font-weight: 700; }

/* Interrupteurs (checkbox stylée en switch) */
.tgl-row {
  display: flex; align-items: flex-start; gap: 10px;
  padding: 10px 12px; margin-bottom: 10px;
  background: var(--sf2); border: 1px solid var(--bd); border-radius: var(--rad-s);
  cursor: pointer;
}
.tgl-row:hover { border-color: var(--bd2); }
.tgl-row input[type="checkbox"] {
  appearance: none; -webkit-appearance: none;
  width: 34px; min-width: 34px; height: 20px; padding: 0; margin: 1px 0 0;
  border-radius: 999px; border: none;
  background: var(--bd2);
  position: relative; cursor: pointer;
  transition: background .15s;
}
.tgl-row input[type="checkbox"]::after {
  content: ''; position: absolute; top: 2px; left: 2px;
  width: 16px; height: 16px; border-radius: 50%;
  background: #fff; transition: left .15s;
}
.tgl-row input[type="checkbox"]:checked { background: var(--blue); }
.tgl-row input[type="checkbox"]:checked::after { left: 16px; }
.tgl-row input[type="checkbox"]:disabled { opacity: .45; cursor: not-allowed; }
.tgl-txt { font-size: 13px; line-height: 1.4; }
.tgl-txt strong { font-weight: 600; }
.tgl-txt .fhelp { margin-top: 2px; }
.tgl-txt em { font-style: normal; color: var(--orange); }

/* Barre d'actions sticky : Enregistrer / Lignes → toujours visibles */
.dform-save {
  position: sticky; bottom: 10px; z-index: 5;
  display: flex; align-items: center; justify-content: space-between; gap: 12px;
  flex-wrap: wrap;
  margin-top: 14px; padding: 10px 14px;
  background: var(--sf); border: 1px solid var(--bd2);
  border-radius: var(--rad); box-shadow: var(--sh2);
}
.dform-save .fhelp { margin: 0; }

/* Bandeau timeline (durées clés : demandé / envoyé / négo / versions) */
.dv-timeline {
  display: flex;
  flex-wrap: wrap;
  gap: 8px;
  margin: 8px 0 14px;
}
.dv-timeline .tl-pill {
  display: inline-flex;
  align-items: baseline;
  gap: 6px;
  background: var(--sf);
  border: 1px solid var(--bd);
  border-radius: 999px;
  padding: 5px 12px;
  font-size: 12.5px;
}
.dv-timeline .tl-pill .ic { font-size: 13px; }
.dv-timeline .tl-pill .tl-lbl { color: var(--t3); }
.dv-timeline .tl-pill .tl-val { font-weight: 600; }

/* Historique des négociations (étape 1) : liste chronologique */
.nego-list { display: flex; flex-direction: column; gap: 8px; margin-bottom: 14px; }
.nego-item {
  display: flex; align-items: flex-start; gap: 10px;
  padding: 9px 11px;
  background: var(--sf2); border: 1px solid var(--bd); border-radius: var(--rad-s);
}
.nego-date { font-size: 12px; font-weight: 600; white-space: nowrap; color: var(--t2); padding-top: 1px; }
.nego-rem  { flex: 1; min-width: 0; font-size: 12.5px; line-height: 1.45; white-space: pre-wrap; word-break: break-word; }
.nego-item > button { color: var(--t3); font-size: 13px; padding: 0 2px; flex-shrink: 0; line-height: 1.4; }
.nego-item > button:hover { color: var(--red); }
.nego-add { display: flex; flex-direction: column; gap: 2px; }
.nego-add .fr { margin-bottom: 8px; }

/* Versions du devis (étape 1) : liste compacte V1, V2… */
.ver-list { display: flex; flex-direction: column; gap: 8px; }
.ver-item {
  display: flex; align-items: center; gap: 10px;
  padding: 9px 11px;
  background: var(--sf2); border: 1px solid var(--bd); border-radius: var(--rad-s);
}
.ver-num {
  flex-shrink: 0; min-width: 36px; text-align: center;
  font-size: 12px; font-weight: 700; color: var(--blue);
  background: rgba(6,182,212,.12); border: 1px solid rgba(6,182,212,.25);
  border-radius: 6px; padding: 4px 6px;
}
.ver-body { flex: 1; min-width: 0; }
.ver-line1 { font-size: 12.5px; font-weight: 600; }
.ver-line2 { font-size: 11.5px; color: var(--t3); margin-top: 1px; font-variant-numeric: tabular-nums; }
.ver-item .btn { flex-shrink: 0; }

/* Récap par famille (étape 3) */
.recap-fam table { font-size: 12.5px; }
.recap-fam tfoot td { background: var(--sf2); font-weight: 600; }

/* Sliders simulation */
.simul {
  background: var(--sf2);
  border: 1px solid var(--bd);
  border-radius: var(--rad);
  padding: 14px;
  margin-top: 12px;
}
.simul label { display: flex; justify-content: space-between; align-items: center; }
.simul input[type=range] {
  width: 100%; padding: 0; background: transparent; border: none;
  -webkit-appearance: none; appearance: none;
}
.simul input[type=range]::-webkit-slider-runnable-track { height: 4px; background: var(--bd); border-radius: 2px; }
.simul input[type=range]::-webkit-slider-thumb { -webkit-appearance: none; width: 14px; height: 14px; border-radius: 50%; background: var(--blue); margin-top: -5px; }

/* ============================================================
   Catalogue
   ============================================================ */
.fam-desc {
  padding: 8px 16px;
  border-bottom: 1px solid var(--bd);
  background: var(--sf2);
  font-size: 12.5px;
}
.fam-desc summary { cursor: pointer; font-weight: 500; color: var(--t2); padding: 4px 0; }
.fam-desc summary:hover { color: var(--t); }
.fam-desc pre { font-family: inherit; white-space: pre-wrap; margin-top: 6px; color: var(--t2); line-height: 1.45; font-size: 12px; }

/* ============================================================
   Facturation : grille d'avancement
   ============================================================ */
.grille-av {
  background: var(--sf);
  border: 1px solid var(--bd);
  border-radius: var(--rad);
  overflow-x: auto;
}
.grille-av table { min-width: 900px; font-size: 12.5px; }
.grille-av th.bat-head { background: var(--sf3); text-align: center; border-left: 1px solid var(--bd); }
.grille-av th.sub { font-size: 10.5px; text-transform: none; letter-spacing: 0; }
.grille-av td.mche { color: var(--t2); }
.grille-av td.real { color: var(--green); font-weight: 500; }
.grille-av td.pct  { background: var(--sf2); min-width: 72px; }
.grille-av th.sub  { min-width: 72px; }
/* Input transparent pour que le fond du <td> traverse (sinon le bg gris foncé
   par défaut de l'input cache la couleur de surlignage jaune et masque le texte
   foncé une fois has-val activé). Largeur 100 % + spinners masqués pour que la
   valeur (ex. « 100 ») s'affiche entièrement. */
.grille-av td.pct input {
  width: 100%; box-sizing: border-box;
  text-align: right; padding: 4px 8px; background: transparent; color: var(--t);
  -moz-appearance: textfield; appearance: textfield;
}
.grille-av td.pct input::-webkit-outer-spin-button,
.grille-av td.pct input::-webkit-inner-spin-button { -webkit-appearance: none; margin: 0; }
.grille-av td.pct.has-val { background: var(--hl); color: #1f2937; font-weight: 600; }
.grille-av td.has-val input { color: #1f2937; }
.grille-av tr.av-row td { background: rgba(245,158,11,.07); font-style: italic; }
/* Séparation visuelle avant le bloc des avenants (1ʳᵉ ligne av-row qui suit
   une ligne non-avenant — l'ordre est familles → prorata → avenants). */
.grille-av tr:not(.av-row) + tr.av-row td { border-top: 3px double var(--bd2); }

/* Fiches d'appro : TOUTE la ligne surlignée avec la couleur du statut
   (ROADMAP « FICHE APPRO » 11/08/2026) — même couleur que la pastille
   (--ap-bg posée en inline sur le <tr>, cf. rowHtml/dotHtml), en transparence
   pour rester lisible. Ciblage sur les <td> (pas le <tr>) : cohérent avec le
   reste du tableau (survol, alternance) qui repose sur le fond des cellules. */
tr[data-row-open] td { background: color-mix(in srgb, var(--ap-bg, transparent) 16%, transparent); }
/* Liste des fiches d'appro : pastille de statut en début de ligne + aperçu du
   contenu (réf · désignation · qté à commander) à la place de la colonne Statut. */
.ap-dot {
  display: inline-block; width: 12px; height: 12px; border-radius: 50%;
  box-shadow: 0 0 0 2px rgba(127, 127, 127, .18); vertical-align: middle;
}
.ap-dot-cell { width: 26px; text-align: center; }
/* N° de fiche : discret (petite police grise, colonne resserrée). */
td.ap-num, th.ap-num { width: 110px; max-width: 110px; }
td.ap-num {
  font-size: 11px; color: var(--t3);
  font-family: ui-monospace, Consolas, monospace;
  white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
}
.ap-contenu { max-width: 420px; }
.ap-lg {
  display: flex; align-items: baseline; gap: 6px;
  font-size: 12px; line-height: 1.5; white-space: nowrap;
  overflow: hidden; text-overflow: ellipsis;
}
.ap-lg-ref { font-weight: 700; font-family: ui-monospace, Consolas, monospace; font-size: 11px; }
.ap-lg-des { color: var(--t2); overflow: hidden; text-overflow: ellipsis; min-width: 0; flex: 0 1 auto; }
.ap-lg-qte { color: var(--t3); font-weight: 600; flex: none; }
.ap-lg-plus { color: var(--t3); font-style: italic; }
.ap-leg {
  display: flex; flex-wrap: wrap; gap: 6px 16px; margin-bottom: 8px;
  font-size: 11.5px; color: var(--t3);
}
.ap-leg span { display: inline-flex; align-items: center; gap: 6px; }
.ap-leg .ap-dot { width: 10px; height: 10px; }
/* Ligne Prorata : auto-calculée, en lecture seule */
.grille-av tr.pro-row td { background: rgba(99, 102, 241, .08); font-style: italic; }
.grille-av tr.pro-row td.pct.has-val { background: rgba(99, 102, 241, .25); color: #312e81; }
.grille-av tr.pro-row input[readonly] { cursor: not-allowed; opacity: .85; }
.grille-av tfoot td { background: var(--sf2); font-weight: 700; }
.grille-av .border-left { border-left: 1px solid var(--bd); }
/* Colonnes finales : cumul + facturer (séparées du bloc bâtiments par un trait) */
.grille-av th.col-cumul, .grille-av td.col-cumul {
  border-left: 1px solid var(--bd);
  background: rgba(8, 145, 178, .06);
}
.grille-av th.col-fact, .grille-av td.col-fact {
  border-left: 2px solid var(--green);
  background: rgba(16, 185, 129, .10);
  color: var(--green);
}
.grille-av tfoot td.col-fact { color: #fff; background: var(--green2); }

/* Situation récap */
.sit-recap {
  display: grid; grid-template-columns: repeat(3, 1fr); gap: 12px;
  margin-top: 14px;
}
.sit-recap .card .lbl { color: var(--t3); font-size: 11.5px; text-transform: uppercase; }
.sit-recap .card .val { font-size: 18px; font-weight: 700; margin-top: 4px; }
.sit-recap .card.hl   { border-color: var(--green); }
.sit-recap .card.hl .val { color: var(--green); }
@media (max-width: 800px) { .sit-recap { grid-template-columns: 1fr; } }

/* Progress bar */
.pb {
  position: relative;
  height: 7px;
  background: var(--sf3);
  border-radius: 4px;
  overflow: hidden;
  margin-top: 4px;
}
.pb > div {
  position: absolute; left: 0; top: 0; bottom: 0;
  background: linear-gradient(90deg, var(--blue), var(--green));
  transition: width .2s;
}
.pb-label { font-size: 11px; color: var(--t2); }

/* Util ------------------------------------------------------ */
.muted  { color: var(--t3); }
.right  { text-align: right; }
.center { text-align: center; }
.mb-1   { margin-bottom: 8px; }
.mb-2   { margin-bottom: 14px; }
.mt-1   { margin-top: 8px; }
.mt-2   { margin-top: 14px; }
.gap-1  { gap: 8px; }
.gap-2  { gap: 14px; }
.flex   { display: flex; align-items: center; }
.space-between { justify-content: space-between; }
.flex-wrap { flex-wrap: wrap; }
.w-full { width: 100%; }
.f-12   { font-size: 12px; }
.f-grow { flex: 1; min-width: 0; }

.loading {
  padding: 40px;
  text-align: center;
  color: var(--t3);
}
.loading::after {
  content: '';
  display: inline-block;
  width: 13px; height: 13px;
  border: 2px solid var(--bd);
  border-top-color: var(--blue);
  border-radius: 50%;
  animation: spin .8s linear infinite;
  margin-left: 8px;
  vertical-align: middle;
}
@keyframes spin { to { transform: rotate(360deg); } }

/* Donut + bars (canvas-less, SVG) */
.chart-wrap {
  display: flex; align-items: center; gap: 14px;
}
.donut-legend { font-size: 12px; }
.donut-legend > div { display: flex; align-items: center; gap: 6px; margin-bottom: 3px; }
.donut-legend .swatch { width: 10px; height: 10px; border-radius: 2px; display: inline-block; }
.bars-row { display: flex; align-items: end; gap: 6px; height: 120px; padding: 6px 0; }
.bars-row .bar {
  flex: 1;
  background: linear-gradient(180deg, var(--blue), var(--blue3));
  border-radius: 3px 3px 0 0;
  position: relative;
  min-height: 2px;
}
.bars-row .bar:hover { background: linear-gradient(180deg, var(--blue), var(--blue2)); }
.bars-row .bar .v {
  position: absolute; top: -16px; left: 50%; transform: translateX(-50%);
  font-size: 10px; color: var(--t2);
}
.bars-row .bar .l {
  position: absolute; bottom: -16px; left: 50%; transform: translateX(-50%);
  font-size: 10px; color: var(--t3);
}

/* ── Auth : login overlay + sidebar logout ─────────────────────── */
/* Quand non connecté, on masque l'app pour ne laisser que le login. */
body.logged-out #sidebar,
body.logged-out #main { display: none; }
body.logged-out { background: var(--bg); }

.login-screen {
  position: fixed; inset: 0;
  display: flex; align-items: center; justify-content: center;
  /* Fond travaillé : halos rouge (logo SMG) + cyan (accent app) sur dégradé sombre */
  background:
    radial-gradient(ellipse 55% 45% at 12% 88%, rgba(192, 0, 0, 0.16), transparent 65%),
    radial-gradient(ellipse 45% 40% at 88% 12%, rgba(6, 182, 212, 0.13), transparent 65%),
    radial-gradient(ellipse 90% 70% at 50% 45%, #121a30, var(--bg));
  z-index: 9999;
  overflow: hidden;
}
/* Grille en filigrane (clin d'œil plans / métré) qui s'estompe vers les bords */
.login-screen::before {
  content: '';
  position: absolute; inset: 0;
  background-image:
    linear-gradient(rgba(255, 255, 255, 0.03) 1px, transparent 1px),
    linear-gradient(90deg, rgba(255, 255, 255, 0.03) 1px, transparent 1px);
  background-size: 44px 44px;
  -webkit-mask-image: radial-gradient(ellipse 75% 75% at 50% 50%, black 25%, transparent 75%);
  mask-image: radial-gradient(ellipse 75% 75% at 50% 50%, black 25%, transparent 75%);
  pointer-events: none;
}
body.theme-light .login-screen {
  background:
    radial-gradient(ellipse 55% 45% at 12% 88%, rgba(192, 0, 0, 0.07), transparent 65%),
    radial-gradient(ellipse 45% 40% at 88% 12%, rgba(6, 182, 212, 0.09), transparent 65%),
    var(--bg);
}
body.theme-light .login-screen::before {
  background-image:
    linear-gradient(rgba(0, 0, 0, 0.035) 1px, transparent 1px),
    linear-gradient(90deg, rgba(0, 0, 0, 0.035) 1px, transparent 1px);
}

.login-card {
  position: relative;
  background: var(--sf);
  border: 1px solid var(--bd);
  border-radius: 14px;
  padding: 36px 32px 24px;
  width: min(400px, calc(100% - 32px));
  box-shadow: var(--sh2), 0 0 90px rgba(192, 0, 0, 0.08);
  display: flex; flex-direction: column; gap: 15px;
  animation: login-pop 0.4s cubic-bezier(0.2, 0.9, 0.3, 1.15);
}
@keyframes login-pop {
  from { opacity: 0; transform: translateY(16px) scale(0.97); }
  to   { opacity: 1; transform: translateY(0)    scale(1); }
}
/* Liseré dégradé rouge → cyan en haut de la card */
.login-card::before {
  content: '';
  position: absolute; top: 0; left: 20px; right: 20px; height: 2px;
  background: linear-gradient(90deg, transparent, var(--red2), var(--blue), transparent);
  border-radius: 2px;
  opacity: 0.85;
}

/* En-tête de card : logo rond + titre + sous-titre */
.login-brand {
  display: flex; flex-direction: column; align-items: center;
  gap: 12px;
  margin-bottom: 6px;
  text-align: center;
}
.login-logo {
  width: 96px; height: 96px;
  border-radius: 50%;
  object-fit: contain;
  /* Le logo PNG a un fond noir intégré → on l'assume dans une pastille sombre,
     identique dans les deux thèmes. */
  background: radial-gradient(circle at 50% 42%, #2b2b2b, #000 78%);
  border: 2px solid var(--bd2);
  box-shadow: 0 0 0 5px rgba(192, 0, 0, 0.12), 0 10px 30px rgba(0, 0, 0, 0.5);
  padding: 5px;
}
.login-brand h2 {
  margin: 0;
  color: var(--t);
  font-size: 25px;
  font-weight: 700;
  letter-spacing: 0.5px;
}
.login-brand h2 .accent { color: var(--red); }
.login-sub {
  margin: 0;
  font-size: 11.5px;
  color: var(--t2);
  text-transform: uppercase;
  letter-spacing: 2.5px;
}

.login-card label { display: flex; flex-direction: column; gap: 5px; }
.login-card label span {
  font-size: 11px;
  font-weight: 600;
  color: var(--t2);
  text-transform: uppercase;
  letter-spacing: 0.8px;
}
.login-card input {
  padding: 11px 12px;
  background: var(--sf2);
  border: 1px solid var(--bd);
  border-radius: 8px;
  color: var(--t);
  font-size: 14px;
  transition: border-color 0.15s, box-shadow 0.15s;
}
.login-card input:focus {
  outline: none;
  border-color: var(--blue);
  box-shadow: 0 0 0 3px rgba(6, 182, 212, 0.18);
}
.login-card button[type="submit"] {
  margin-top: 8px;
  padding: 12px;
  border: 0;
  border-radius: 8px;
  background: linear-gradient(135deg, var(--blue), var(--blue2));
  color: white;
  font-weight: 700;
  font-size: 14px;
  letter-spacing: 0.3px;
  cursor: pointer;
  box-shadow: 0 4px 14px rgba(6, 182, 212, 0.22);
  transition: transform 0.15s, box-shadow 0.15s, filter 0.15s;
}
.login-card button[type="submit"]:hover {
  filter: brightness(1.12);
  transform: translateY(-1px);
  box-shadow: 0 6px 20px rgba(6, 182, 212, 0.32);
}
.login-card button[type="submit"]:active { transform: translateY(0); }
.login-card button[type="submit"][disabled] {
  opacity: 0.6;
  cursor: progress;
  transform: none;
  filter: none;
}
.login-error {
  background: rgba(239, 68, 68, 0.12);
  border: 1px solid var(--red);
  color: var(--red);
  padding: 9px 11px;
  border-radius: 8px;
  font-size: 13px;
}

/* Pied de card : raison sociale */
.login-foot {
  margin-top: 4px;
  padding-top: 12px;
  border-top: 1px solid var(--bd);
  text-align: center;
  font-size: 11px;
  color: var(--t3);
  letter-spacing: 0.5px;
}

/* Mot de passe oublié : lien sous le bouton + message de confirmation */
.forgot-link {
  text-align: center;
  font-size: 12.5px;
  color: var(--t2);
  text-decoration: none;
  transition: color 0.15s;
}
.forgot-link:hover { color: var(--blue); text-decoration: underline; }
.forgot-help {
  margin: 0;
  font-size: 12.5px;
  color: var(--t2);
  line-height: 1.55;
  text-align: center;
}
.forgot-success {
  background: rgba(34, 197, 94, 0.12);
  border: 1px solid var(--green, #22c55e);
  color: var(--green, #22c55e);
  padding: 9px 11px;
  border-radius: 8px;
  font-size: 13px;
}

/* Footer sidebar : user chip + bouton logout */
.user-chip {
  font-size: 12px; color: var(--t2);
  background: var(--sf2); border: 1px solid var(--bd);
  padding: 2px 8px; border-radius: 999px;
  max-width: 100px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}
.logout-btn {
  background: transparent; border: 1px solid var(--bd);
  color: var(--t2); cursor: pointer;
  padding: 2px 8px; border-radius: var(--rad-s);
  font-size: 14px; line-height: 1;
}
.logout-btn:hover { background: var(--sf3); color: var(--red); border-color: var(--red); }

/* Inputs désactivés (mode lecture seule pour les rôles sans write) :
   styling cohérent avec le reste du design system. */
#view input:disabled,
#view textarea:disabled,
#view select:disabled {
  opacity: 0.7;
  cursor: not-allowed;
  background: var(--sf2);
  color: var(--t2);
}



/* ── Fiches chantiers (suivi conducteurs : P.D.C / Pose) ─────────── */
.fiche-table { width: 100%; border-collapse: collapse; }
.fiche-table th, .fiche-table td { padding: 7px 10px; border-bottom: 1px solid var(--bd); }
.fiche-table thead th { font-size: 12px; color: var(--t2); text-transform: uppercase; letter-spacing: .5px; }
/* Lignes de structure (titre / sous-titre) */
.fiche-sec td { background: var(--sf2); font-weight: 700; letter-spacing: .3px; }
.fiche-sec.lvl-titre td { color: var(--t); text-transform: uppercase; }
.fiche-sec.lvl-soustitre td { color: var(--t2); padding-left: 22px; }
.fiche-sec.lvl-sst td { color: var(--t3); padding-left: 34px; font-weight: 600; }
/* Lignes d'ouvrage colorées selon l'avancement agrégé */
.fiche-ouv td:first-child { padding-left: 22px; }
.fiche-ouv.fe-ok   { background: rgba(16, 185, 129, 0.16); }
.fiche-ouv.fe-wip  { background: rgba(245, 158, 11, 0.16); }
.fiche-ouv.fe-ko   { background: rgba(239, 68, 68, 0.14); }
.fiche-ssref { font-size: 11px; color: var(--t3); }
/* Pastille de couleur de repérage (DEVIS ETUDES) dans la fiche chantier */
.fiche-coul { display: inline-block; width: 12px; height: 12px; border-radius: 3px; margin-right: 7px; vertical-align: middle; border: 1px solid rgba(0, 0, 0, 0.35); }
/* Cellule d'avancement P.D.C / Pose : barre de progression (ROADMAP « FICHES
   CHANTIER » 30/07/2026, remplace les 3 boutons ✓ ≈ ✗). P.D.C = lecture seule
   (automatique) ; Pose = cliquable (fc-clic), fait défiler non_traite → en_cours
   → traite au clic. */
.fc-cell { white-space: nowrap; text-align: center; min-width: 110px; }
.fc-cell.fc-clic { cursor: pointer; }
.fc-bar {
  display: inline-block; width: 72px; height: 8px; border-radius: 999px;
  background: var(--sf2); border: 1px solid var(--bd); overflow: hidden;
  vertical-align: middle;
}
.fc-bar-fill { height: 100%; background: var(--orange); border-radius: 999px; transition: width .2s; }
.fc-bar-fill.ok { background: var(--green); }
.fc-cell[data-etat="non_traite"] .fc-bar-fill { background: var(--red); }
.fc-bar-pct { display: inline-block; margin-left: 6px; font-size: 11px; font-weight: 700; color: var(--t2); vertical-align: middle; width: 32px; text-align: left; }
.fc-cell.fc-clic:hover .fc-bar { border-color: var(--bd2); }
/* Carte chantier (liste) */
.fiche-chantiers { display: flex; flex-direction: column; gap: 8px; }

/* ── Barre de filtres Tableau achats ────────────────────────────── */
.achats-filters { padding: 16px 18px; }
.achats-filters .af-head {
  display: flex; align-items: center; justify-content: space-between;
  margin-bottom: 12px;
}
.achats-filters .af-title {
  font-size: 13px; font-weight: 700; color: var(--t2);
  text-transform: uppercase; letter-spacing: 1px;
}
.achats-filters .af-grid {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(210px, 1fr));
  gap: 14px;
}
.achats-filters .af-search { grid-column: 1 / -1; }   /* la recherche prend toute la largeur */
.achats-filters .fr { display: flex; flex-direction: column; gap: 5px; margin: 0; }
.achats-filters .fr label {
  font-size: 11px; font-weight: 600; color: var(--t2);
  text-transform: uppercase; letter-spacing: .6px;
}
.achats-filters input,
.achats-filters select {
  width: 100%;
  padding: 11px 12px;
  background: var(--sf2);
  border: 1px solid var(--bd);
  border-radius: 8px;
  color: var(--t);
  font-size: 14px;
}
.achats-filters input:focus,
.achats-filters select:focus {
  outline: none;
  border-color: var(--blue);
  box-shadow: 0 0 0 3px rgba(6, 182, 212, 0.18);
}

/* ── Mon compte — éditeur d'ordre des sections ──────────────────── */
.me-sections { display: flex; flex-direction: column; gap: 6px; }
.me-sec-row {
  display: flex; align-items: center; justify-content: space-between;
  padding: 8px 10px; background: var(--sf2);
  border: 1px solid var(--bd); border-radius: 8px;
}
.me-sec-lbl { font-weight: 600; }
.me-sec-act { display: flex; gap: 4px; }

/* ── Notifications (cloche en-tête) ─────────────────────────────── */
.notif-wrap { position: relative; }
.notif-badge {
  position: absolute; top: -3px; right: -3px;
  min-width: 16px; height: 16px; padding: 0 4px; box-sizing: border-box;
  background: var(--red); color: #fff; font-size: 10px; font-weight: 700;
  line-height: 16px; text-align: center; border-radius: 9px; pointer-events: none;
}
/* Rappel visuel : le badge sursaute (toutes les 5 s via JS) tant que la cloche n'a pas été ouverte. */
@keyframes notif-shake {
  0%, 60%, 100% { transform: translateY(0) scale(1); }
  10% { transform: translateY(-5px) scale(1.3); }
  25% { transform: translateY(0) scale(1); }
  40% { transform: translateY(-3px) scale(1.2); }
}
.notif-badge.notif-shake { animation: notif-shake .7s ease; }
.notif-panel {
  position: absolute; top: calc(100% + 8px); right: 0;
  width: 340px; max-height: 420px; overflow-y: auto;
  background: var(--sf); border: 1px solid var(--bd); border-radius: 10px;
  box-shadow: 0 8px 28px rgba(0, 0, 0, 0.35); z-index: 60; padding: 6px;
}
.notif-head {
  display: flex; align-items: center; justify-content: space-between;
  gap: 8px; padding: 6px 8px 8px; border-bottom: 1px solid var(--bd); margin-bottom: 4px;
}
.notif-head strong { font-size: 13px; }
.notif-item {
  display: flex; align-items: flex-start; gap: 6px;
  width: 100%; text-align: left; padding: 8px 10px; box-sizing: border-box;
  border: none; background: transparent; color: inherit; font: inherit;
  border-radius: 8px; cursor: pointer;
}
.notif-item:hover { background: var(--sf2); }
.notif-txt { flex: 1; min-width: 0; }
.notif-head-actions { display: flex; gap: 6px; }
/* Bouton archiver (par notification) : discret, visible au survol. */
.notif-arch {
  flex: 0 0 auto; border: none; background: transparent; cursor: pointer;
  font-size: 13px; padding: 2px 4px; border-radius: 6px; opacity: 0;
  transition: opacity .12s;
}
.notif-item:hover .notif-arch { opacity: .7; }
.notif-arch:hover { opacity: 1 !important; background: var(--bd); }
/* Bloc repliable « Archives » en bas du panneau. */
.notif-archives { border-top: 1px solid var(--bd); margin-top: 6px; }
.notif-archives summary {
  cursor: pointer; padding: 8px 10px; font-size: 12px; font-weight: 700; color: var(--t2);
}
.notif-archives .notif-item { opacity: .8; }
.notif-item.unread { background: var(--sf2); }
.notif-item.unread .notif-msg { font-weight: 600; }
.notif-msg { display: block; font-size: 13px; }
.notif-time { display: block; font-size: 11px; color: var(--t2); margin-top: 2px; }
.notif-empty { padding: 18px; text-align: center; color: var(--t2); font-size: 13px; }

/* ── « 📦 Docs prod à importer » (Tableau achats) ────────────────── */
.dp-count {
  display: inline-block; min-width: 17px; padding: 0 5px;
  border-radius: 999px; background: #dc2626; color: #fff;
  font-size: 10.5px; font-weight: 800; text-align: center;
}
.dp-fourn { margin-bottom: 18px; }
.dp-fourn-titre {
  font-size: 14px; font-weight: 800; margin-bottom: 8px;
  padding-bottom: 4px; border-bottom: 2px solid var(--bd2);
}
.dp-doc {
  border: 1px solid var(--bd); border-radius: 10px; background: var(--sf2);
  padding: 10px 12px; margin-bottom: 10px;
}
.dp-doc-head { display: flex; align-items: center; justify-content: space-between; gap: 10px; margin-bottom: 8px; }
.dp-doc-actions { display: flex; align-items: center; gap: 6px; }
.dp-switch { display: flex; gap: 6px; }
.dp-doc-archive { opacity: .85; }
.dp-table { width: 100%; border-collapse: collapse; font-size: 12px; }
.dp-table th {
  text-align: left; font-size: 10px; text-transform: uppercase; letter-spacing: .04em;
  color: var(--t2); padding: 3px 8px; border-bottom: 1px solid var(--bd);
}
.dp-table td { padding: 5px 8px; border-bottom: 1px solid var(--bd); }
.dp-table tbody tr:last-child td { border-bottom: none; }
.dp-table td.num { text-align: right; }

/* Duos affaire - ouvrage empilés dans la liste des commandes. */
.cmd-duo { line-height: 1.45; white-space: nowrap; }
.cmd-duo + .cmd-duo { margin-top: 1px; }

/* Sélecteur discret des modes de référence (quincaillerie) :
   Catalogue / Saisie manuelle / + Nouvelle réf. */
.cmd-refmode {
  display: inline-flex; flex-wrap: wrap; margin-top: 3px;
  border: 1px solid var(--bd); border-radius: 10px; overflow: hidden;
  background: var(--sf);
}
.cmd-refmode button {
  border: none; background: transparent; cursor: pointer;
  font: inherit; font-size: 10px; font-weight: 600; color: var(--t2);
  padding: 2px 9px; line-height: 1.4; white-space: nowrap;
  transition: background .12s, color .12s;
}
.cmd-refmode button + button { border-left: 1px solid var(--bd); }
.cmd-refmode button:hover { color: var(--t); background: var(--sf2); }
.cmd-refmode button.on { background: var(--bd2); color: var(--sf); font-weight: 800; }
.cmd-refmode button[data-mode="nouvelle"].on { background: #16a34a; color: #fff; }

/* ── Liste des commandes (Tableau achats) ───────────────────────── */
.ctr { text-align: center; }
.pastille {
  display: inline-flex; align-items: center; justify-content: center;
  min-width: 22px; height: 22px; padding: 0 5px; border-radius: 11px;
  font-size: 12px; font-weight: 700;
}
.pa-ok   { background: rgba(16, 185, 129, 0.18); color: var(--green); }
.pa-wait { background: rgba(245, 158, 11, 0.18); color: #f59e0b; }
.pa-ko   { background: rgba(239, 68, 68, 0.18);  color: var(--red); }
.cmd-actions { display: inline-flex; gap: 4px; }

/* ── Tableau achats : barre de recherche + filtres ──────────────── */
.cmd-filters { padding: 14px 16px; }
.cmd-filters .cmd-q { width: 100%; margin-bottom: 12px; }
.cmd-filter-grid {
  display: grid; gap: 10px 12px; align-items: end;
  grid-template-columns: repeat(auto-fit, minmax(160px, 1fr));
}
.cmd-fl { display: flex; flex-direction: column; gap: 4px; margin: 0; }
.cmd-fl > span {
  font-size: 11px; font-weight: 600; color: var(--t2);
  text-transform: uppercase; letter-spacing: .5px;
}
.cmd-fl select { width: 100%; }
#cmd-f-reset { align-self: end; white-space: nowrap; }
.cmd-lines td { padding: 9px 8px; vertical-align: top; }
.cmd-lines th { padding-bottom: 8px; }
.cmd-lines [data-f="designation"], .cmd-lines select[data-f] { width: 100%; min-width: 120px; }
.cmd-lines .ck { display: flex; align-items: center; gap: 4px; margin-top: 4px; }
/* Colonne « Réf. » visible seulement en mode quincaillerie. */
.cmd-lines.quinc-off .q-ref { display: none; }

/* ── Formulaire « Nouvelle commande » : en-tête de section + respiration ── */
.cmd-form { padding: 18px 20px; }
.af-head {
  display: flex; align-items: center; justify-content: space-between;
  gap: 12px; margin-bottom: 16px; padding-bottom: 12px;
  border-bottom: 1px solid var(--bd);
}
.af-title {
  font-size: 13px; font-weight: 700; color: var(--t2);
  text-transform: uppercase; letter-spacing: 1px;
}
.cmd-subtotal {
  margin-top: 14px; padding-top: 14px;
  border-top: 1px solid var(--bd); font-size: 14px;
}
.cmd-actions-bar { display: flex; gap: 10px; margin-top: 18px; }

/* ── Mode espion (impersonation) ────────────────────────────────── */
#spy-banner {
  /* Commence après la sidebar (220px) pour ne pas masquer son pied (sélecteur
     d'agence, chip utilisateur). Barre fine et discrète. */
  position: fixed; left: 220px; right: 0; bottom: 0; z-index: 200;
  display: flex; align-items: center; justify-content: center; gap: 10px;
  padding: 4px 12px; background: #7c3aed; color: #fff;
  font-size: 11.5px; font-weight: 500; opacity: 0.95;
  box-shadow: 0 -1px 8px rgba(0, 0, 0, 0.25);
}
#spy-banner button { padding: 1px 8px; font-size: 11px; background: rgba(255, 255, 255, 0.18); border-color: rgba(255, 255, 255, 0.45); color: #fff; }
#spy-banner button:hover { background: rgba(255, 255, 255, 0.3); }
body.spying #main { padding-bottom: 30px; }

/* Bannière « SMG GROUPE » (vue consolidée lecture seule) */
#groupe-banner {
  /* Commence après la sidebar (220px) pour ne pas empiéter sur le logo /
     le nom « SMG Pilot » en haut de la barre latérale. */
  position: fixed; left: 220px; right: 0; top: 0; z-index: 200;
  display: flex; align-items: center; justify-content: center; gap: 12px;
  padding: 7px 14px; background: #0f766e; color: #fff;
  font-size: 13px; font-weight: 600; box-shadow: 0 2px 12px rgba(0, 0, 0, 0.3);
}
body.groupe-view #main { padding-top: 40px; }

/* Comparatif agences (vue GROUPE) : cartes KPI + total */
.kpi-row { display: grid; grid-template-columns: repeat(auto-fit, minmax(180px, 1fr)); gap: 12px; margin-bottom: 14px; }
.kpi-card { background: var(--sf); border: 1px solid var(--bd); border-radius: 10px; padding: 12px 14px; }
.kpi-label { font-size: 11px; text-transform: uppercase; letter-spacing: .04em; color: var(--t3); }
.kpi-val { font-size: 22px; font-weight: 700; color: var(--t); margin-top: 4px; }
.kpi-sub { font-size: 12px; color: var(--t2); margin-top: 2px; }
tr.row-total td { border-top: 2px solid var(--bd); background: var(--sf2); }
/* Bannière « devis en lecture seule » (verrou par statut) */
.lock-banner { background: rgba(245, 158, 11, 0.14); border: 1px solid rgba(245, 158, 11, 0.45); border-radius: 8px; padding: 9px 13px; margin-bottom: 12px; font-size: 13px; color: var(--t); }

/* ── Module Planification (FullCalendar) ─────────────────────────── */
/* Menu contextuel (clic droit sur une mission) */
.pl-ctxmenu { position: fixed; z-index: 9999; background: var(--sf); border: 1px solid var(--bd2);
  border-radius: 8px; box-shadow: 0 8px 24px rgba(0,0,0,.35); padding: 4px; min-width: 190px; }
.pl-ctxmenu-item { display: block; width: 100%; text-align: left; background: none; border: none;
  color: var(--t); padding: 8px 12px; border-radius: 6px; cursor: pointer; font: inherit; }
.pl-ctxmenu-item:hover { background: var(--sf3); }
.pl-ctxmenu-danger { color: var(--red); }
.pl-ctxmenu-danger:hover { background: rgba(239,68,68,.12); }

/* Palette de couleurs de repérage (DEVIS ETUDES) — popover 30 pastilles */
.repcoul-pop { position: fixed; z-index: 9999; background: var(--sf); border: 1px solid var(--bd2);
  border-radius: 8px; box-shadow: 0 8px 24px rgba(0,0,0,.35); padding: 8px;
  display: grid; grid-template-columns: repeat(6, 22px); gap: 5px; }
.repcoul-sw { width: 22px; height: 22px; border-radius: 4px; border: 1px solid var(--bd2); cursor: pointer; padding: 0; }
.repcoul-sw.active { outline: 2px solid var(--t); outline-offset: 1px; }
.repcoul-btn { width: 30px; height: 22px; padding: 0; border: 1px solid var(--bd); border-radius: 4px; cursor: pointer; }
.pl-filters { display: flex; flex-wrap: wrap; gap: 12px; align-items: end; margin-bottom: 12px; }
.pl-f { display: flex; flex-direction: column; gap: 4px; font-size: 12px; color: var(--t2); }
.pl-filters select, .pl-filters input { min-width: 180px; }

/* Filtres planning multi-sélection (ROADMAP « PLANNING FILTRE » 05/08/2026) :
   bouton compact ouvrant un panneau flottant de cases à cocher. */
.pl-f-multi-btn { min-width: 160px; text-align: left; display: flex; justify-content: space-between;
  align-items: center; gap: 6px; background: var(--sf); border: 1px solid var(--bd); border-radius: var(--rad-s);
  padding: 6px 10px; font-size: 13px; color: var(--t); cursor: pointer; }
.pl-f-multi-btn:hover { background: var(--sf2); }
.pl-f-panel { position: fixed; z-index: 9999; background: var(--sf); border: 1px solid var(--bd2);
  border-radius: 8px; box-shadow: 0 8px 24px rgba(0,0,0,.35); padding: 6px; max-height: 280px; overflow: auto;
  min-width: 220px; display: flex; flex-direction: column; gap: 1px; }
.pl-f-panel label { display: flex; align-items: center; gap: 6px; font-size: 13px; padding: 5px 6px;
  border-radius: 4px; cursor: pointer; white-space: nowrap; }
.pl-f-panel label:hover { background: var(--sf3); }
.pl-f-panel input { width: auto; margin: 0; }
.pl-f-panel .pl-f-clear { font-size: 12px; color: var(--blue); cursor: pointer; padding: 6px; margin-top: 4px;
  border-top: 1px solid var(--bd); }
.pl-f-panel .pl-f-clear:hover { text-decoration: underline; }

/* Intégration au thème : FullCalendar v6 expose des variables --fc-*. */
#pl-calendar {
  --fc-border-color: var(--bd);
  --fc-page-bg-color: var(--sf);
  --fc-neutral-bg-color: var(--sf2);
  --fc-today-bg-color: rgba(6, 182, 212, .10);
  --fc-now-indicator-color: var(--red);
  --fc-list-event-hover-bg-color: var(--sf3);
  color: var(--t);
}
#pl-calendar .fc .fc-col-header-cell-cushion,
#pl-calendar .fc .fc-daygrid-day-number,
#pl-calendar .fc .fc-timegrid-axis-cushion,
#pl-calendar .fc .fc-list-day-text,
#pl-calendar .fc .fc-list-day-side-text { color: var(--t); text-decoration: none; }
#pl-calendar .fc .fc-toolbar-title { font-size: 1.05rem; color: var(--t); }
#pl-calendar .fc .fc-button {
  background: var(--sf2); border-color: var(--bd); color: var(--t2);
  text-transform: capitalize; box-shadow: none;
}
#pl-calendar .fc .fc-button:hover { background: var(--sf3); color: var(--t); }
#pl-calendar .fc .fc-button-primary:not(:disabled).fc-button-active,
#pl-calendar .fc .fc-button-primary:not(:disabled):active {
  background: var(--blue); border-color: var(--blue); color: #fff;
}
#pl-calendar .fc-event { cursor: pointer; font-size: 11.5px; }
#pl-calendar .fc-event.pl-pending { opacity: .85; border-style: dashed !important; border-width: 2px !important; }
#pl-calendar .fc-event.pl-refused { opacity: .5; text-decoration: line-through; }

/* Pastilles plus lisibles, notamment en vue Mois (events en bloc plein). */
#pl-calendar .fc-daygrid-event { padding: 2px 6px; margin-top: 2px; font-size: 12px; font-weight: 600; }
#pl-calendar .fc-event-title, #pl-calendar .fc-event-time { color: #fff; text-shadow: 0 1px 1px rgba(0,0,0,.4); }
#pl-calendar .fc-daygrid-block-event .fc-event-title { white-space: normal; }
#pl-calendar .fc-daygrid-event-harness { margin-bottom: 1px; }

/* Sélecteur d'ouvrages repliable (modale de mission). */
.pl-ouv-head { display: flex; align-items: center; gap: 8px; justify-content: space-between; }
.pl-ouv-summary { color: var(--t2); font-size: 13px; line-height: 1.3; }
.pl-ouv-picker { margin-top: 6px; border: 1px solid var(--bd); border-radius: var(--rad-s); padding: 6px; background: var(--sf2); }
.pl-ouv-list { max-height: 170px; overflow: auto; display: flex; flex-direction: column; gap: 1px; margin-bottom: 6px; }
.pl-ouv-item { display: flex; align-items: center; gap: 6px; font-size: 13px; cursor: pointer; padding: 3px 4px; border-radius: 3px; }
.pl-ouv-item:hover { background: var(--sf3); }
.pl-ouv-item input { width: auto; margin: 0; }

/* Badge « N en attente » (validation des missions) dans le header. */
.pl-pending-btn { background: var(--orange); border-color: var(--orange); color: #1a1200; font-weight: 600; }
.pl-pending-btn:hover { filter: brightness(1.08); }
/* Filtre « en attente » actif : bouton enfoncé, re-cliquer ré-affiche tout. */
.pl-pending-btn.pl-pending-on { box-shadow: inset 0 0 0 2px rgba(0,0,0,.35); filter: brightness(.92); }

/* Types de tâche non-mission : motif rayé pour les distinguer des missions. */
#pl-calendar .pl-type-conge, #pl-calendar .pl-type-formation,
#pl-calendar .pl-type-reunion, #pl-calendar .pl-type-absence {
  background-image: repeating-linear-gradient(45deg, rgba(255,255,255,.18) 0 5px, transparent 5px 11px);
}
#pl-calendar .pl-type-absence { opacity: .82; }
/* Chevauchement (même personne, créneaux qui se recoupent) : liseré rouge. */
#pl-calendar .pl-overlap { box-shadow: 0 0 0 2px var(--red), var(--sh); }

/* Responsive : planning lisible sur mobile. */
@media (max-width: 640px) {
  .pl-filters { gap: 8px; }
  .pl-filters select, .pl-filters input, .pl-f { min-width: 0; width: 100%; }
  .pl-f { flex: 1 1 45%; }
  #pl-calendar .fc-toolbar { flex-direction: column; gap: 6px; }
  #pl-calendar .fc-toolbar-title { font-size: .95rem; }
  #pl-calendar .fc-header-toolbar { margin-bottom: 8px; }
  #pl-calendar .fc-button { padding: 3px 6px; font-size: 12px; }
}

/* ── Module Saisie des heures ───────────────────────────────────── */
.empty { color: var(--t3); text-align: center; padding: 18px 8px; }

.h-nav {
  display: flex; align-items: center; gap: 10px;
  margin-bottom: 12px; flex-wrap: wrap;
}
.h-nav-date { flex: 1 1 auto; text-align: center; min-width: 180px; }
.h-nav-date strong { text-transform: capitalize; }

.h-card { display: flex; flex-direction: column; gap: 12px; }
.h-head {
  display: flex; align-items: center; justify-content: space-between;
  gap: 12px; flex-wrap: wrap;
}
.h-counter { font-size: 14px; color: var(--t2); }
.h-counter strong { color: var(--t); }
.h-counter.ok    { color: var(--green); }
.h-counter.ok strong { color: var(--green); }
.h-counter.under { color: var(--t2); }
.h-counter.over  { color: var(--orange); }
.h-counter.over strong { color: var(--orange); }

.h-refus {
  background: rgba(239,68,68,.12); border: 1px solid var(--red3);
  color: var(--red); border-radius: var(--rad-s); padding: 8px 12px; font-size: 13px;
}
.h-ok {
  background: rgba(16,185,129,.12); border: 1px solid var(--green2);
  color: var(--green); border-radius: var(--rad-s); padding: 8px 12px; font-size: 13px;
}

.hl-list { display: flex; flex-direction: column; gap: 8px; }
.hl-row {
  display: flex; align-items: center; gap: 10px; flex-wrap: wrap;
  padding: 8px; border: 1px solid var(--bd); border-radius: var(--rad-s);
  background: var(--sf2);
}
.hl-row.hl-bad { border-color: var(--orange); }
.hl-fields { display: flex; gap: 8px; flex: 1 1 auto; flex-wrap: wrap; min-width: 0; }
.hl-fields select, .hl-fields input { min-width: 120px; flex: 1 1 auto; }
.hl-right { display: flex; align-items: center; gap: 8px; }
.hl-step { display: flex; align-items: center; gap: 6px; }
.hl-step .btn { min-width: 34px; font-size: 16px; line-height: 1; padding: 4px 8px; }
.hl-h { min-width: 56px; text-align: center; font-variant-numeric: tabular-nums; font-weight: 600; }
.hl-warn { color: var(--orange); font-size: 16px; }
.hl-actions { display: flex; gap: 8px; flex-wrap: wrap; justify-content: flex-end; }

/* Filtres de l'écran « Heures à valider » (vue globale, ROADMAP 11/08/2026). */
.hv-filters { display: flex; align-items: center; gap: 6px; flex-wrap: wrap; margin-bottom: 14px; }
.hv-role-pill.on { background: var(--blue); color: #fff; border-color: var(--blue); }
.hv-filters #hv-q { min-width: 220px; flex: 1 1 220px; }

.hv-group { margin-bottom: 12px; }
.hv-person { font-weight: 600; margin-bottom: 8px; }
.hv-row {
  display: flex; flex-direction: column; align-items: stretch; gap: 6px;
  padding: 8px 0; border-top: 1px solid var(--bd);
}
.hv-row-hd { display: flex; align-items: center; gap: 12px; flex-wrap: wrap; }
.hv-clickable { cursor: pointer; border-radius: var(--rad-s); transition: background .12s; }
.hv-clickable:hover { background: var(--sf2); }
/* Détail par chantier/ouvrage affiché directement sur la ligne « à valider »
   (ROADMAP « HEURES A VALIDER » 11/08/2026) — le responsable voit le détail
   AVANT de décider, sans clic supplémentaire. */
.hv-lignes { display: flex; flex-direction: column; gap: 2px; padding-left: 2px; }
.hv-ligne { font-size: 12.5px; color: var(--t2); }
.hv-ligne-h { font-variant-numeric: tabular-nums; font-weight: 600; color: var(--t); margin-right: 6px; }

/* Écran « Toutes les feuilles d'heures » (managers). */
.hh-bar { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; }
.hh-bar select { min-width: 170px; }
.hh-bar #hh-user { margin-left: auto; }
.hh-head { display: flex; align-items: center; gap: 12px; flex-wrap: wrap; margin-bottom: 6px;
  padding-bottom: 8px; border-bottom: 1px solid var(--bd); }
.hh-person { font-weight: 600; font-size: 14px; }
.hh-tot { display: flex; align-items: center; gap: 8px; }
.hh-print { margin-left: auto; }
.hh-row { padding: 7px 8px; }
.hh-row .hh-date { min-width: 96px; text-transform: capitalize; }
.hh-row .hh-st { min-width: 92px; }
.hh-row .hh-hrs { font-variant-numeric: tabular-nums; }
.hh-row .hh-meta { margin-left: auto; text-align: right; }

/* Vue liste « Mes feuilles » (salarié). */
.mf-row { padding: 9px 10px; gap: 14px; }
.mf-date { min-width: 170px; text-transform: capitalize; }
.mf-st { min-width: 96px; }
.mf-hrs { margin-left: auto; font-variant-numeric: tabular-nums; }
.mf-hrs.under { color: var(--orange); }
/* Vue globale mensuelle (ROADMAP « HEURES » 11/08/2026) : jour ouvré sans
   feuille encore créée — même rythme visuel que .mf-row (colonne, même
   padding/bordure), en <button> pour l'action « + ». */
.mf-add {
  all: unset; box-sizing: border-box; cursor: pointer; display: flex;
  flex-direction: column; width: 100%; align-items: stretch; gap: 6px;
  padding: 9px 10px; border-top: 1px solid var(--bd); border-radius: var(--rad-s);
  transition: background .12s;
}
.mf-add:hover { background: var(--sf2); }
.mf-add .mf-date { color: var(--t2); text-transform: capitalize; }
.mf-add-lbl { font-weight: 600; font-size: 12.5px; color: var(--blue); }
.hv-d { min-width: 110px; text-transform: capitalize; }
.hv-t { font-variant-numeric: tabular-nums; }
.hv-t.under { color: var(--orange); }
.hv-act { display: flex; gap: 6px; margin-left: auto; flex-wrap: wrap; }
.hv-detail { width: 100%; }
.h-refus-input { width: 100%; box-sizing: border-box; }

/* Rapports heures (réel vs devisé + heures/personne). */
.h-rap-bar { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; margin-bottom: 12px; }
.h-rap-bar select { min-width: 220px; }
.h-rap-bar #rap-csv { margin-left: auto; }
.rap-tbl { width: 100%; }
.rap-tbl td.over { color: var(--orange); }
.rap-tbl td.ok   { color: var(--green); }
.rap-barcell { width: 40%; min-width: 140px; }
.rap-bar { height: 8px; border-radius: 4px; margin: 2px 0; min-width: 1px; }
.rap-bar-dev  { background: var(--t3); }
.rap-bar-reel { background: var(--blue); }

/* Rentabilité MO (tableau de bord chantier) : barre de filtres. */

/* ── Module Congés ──────────────────────────────────────────────── */
.cg-period { margin-bottom: 10px; }
.cg-counters { display: grid; grid-template-columns: repeat(auto-fill, minmax(180px, 1fr)); gap: 10px; }
.cg-counter { background: var(--sf2); border: 1px solid var(--bd); border-radius: var(--rad-s); padding: 8px 12px; }
.cg-counter-lbl { font-size: 11px; text-transform: uppercase; letter-spacing: .03em; color: var(--t3); }
.cg-counter-val { font-size: 14px; margin-top: 2px; }
.cg-refus { color: var(--red); font-size: 11.5px; margin-top: 3px; }
.cg-cp-note { margin-top: 8px; }
.cg-demi.hidden, .cg-cp-note.hidden { display: none; }
.cg-refus-input { width: 100%; box-sizing: border-box; }
.cg-detail { width: 100%; }
.cg-detail td:first-child { width: 38%; white-space: nowrap; }
.cg-row { cursor: pointer; }
.cg-row:hover { background: var(--sf2); }
.cg-cal-bar { gap: 10px; }
.cg-legend { display: inline-flex; align-items: center; gap: 12px; flex-wrap: wrap; margin-left: auto; font-size: 11.5px; color: var(--t2); }
.cg-leg { display: inline-flex; align-items: center; gap: 5px; }
.cg-leg-dot { width: 11px; height: 11px; border-radius: 3px; display: inline-block; }
#cgc-cal { padding: 14px 4px 4px; }
.fc .cg-ev-pending { opacity: .55; border-style: dashed; }
.cg-solde { margin: 8px 0; font-size: 14px; }
.cg-solde .b { margin-left: 6px; }
.num.cg-neg { color: var(--red); font-weight: 600; }

/* Bandeau visuel « Mes congés payés » (récap solde) */
.cg-hero-head { display: flex; align-items: baseline; justify-content: space-between; gap: 10px; flex-wrap: wrap; margin-bottom: 14px; }
.cg-hero-title { margin: 0; font-size: 13px; text-transform: uppercase; letter-spacing: .04em; color: var(--t3); font-weight: 600; }
.cg-stats { display: grid; grid-template-columns: repeat(auto-fit, minmax(120px, 1fr)); gap: 10px; margin-bottom: 14px; }
.cg-stat { background: var(--sf2); border: 1px solid var(--bd); border-radius: var(--rad); padding: 12px 14px; text-align: center; }
.cg-stat-val { font-size: 22px; font-weight: 700; color: var(--t); line-height: 1.1; }
.cg-stat-lbl { font-size: 11px; text-transform: uppercase; letter-spacing: .5px; color: var(--t3); margin-top: 4px; }
.cg-stat-pris .cg-stat-val { color: var(--blue); }
.cg-stat-att  .cg-stat-val { color: var(--orange); }
.cg-stat-rest .cg-stat-val { color: var(--green); }
.cg-stat-neg  .cg-stat-val { color: var(--red); }
.cg-gauge { display: flex; height: 12px; border-radius: 999px; overflow: hidden; background: var(--sf3); border: 1px solid var(--bd); }
.cg-gauge-pris { background: var(--blue); }
.cg-gauge-att  { background: var(--orange); opacity: .85; }
.cg-hero-foot { margin-top: 8px; }

/* Mobile : steppers tactiles plus gros, lignes empilées. */
@media (max-width: 640px) {
  .hl-row { align-items: stretch; }
  .hl-fields { flex: 1 1 100%; }
  .hl-right { width: 100%; justify-content: space-between; }
  .hl-step .btn { min-width: 44px; font-size: 18px; padding: 6px 10px; }
  .hl-actions .btn { flex: 1 1 auto; }
  .hv-act { width: 100%; }
  .hv-act .btn { flex: 1 1 auto; }
}

/* ── Module Tâches ───────────────────────────────────────────────── */
.tk-bar { gap: 14px; align-items: center; flex-wrap: wrap; margin-bottom: 22px; }
/* Barre de recherche des tâches — seul filtre du tableau (titre + description). */
.tk-search { flex: 1 1 280px; max-width: 420px; }

/* Interrupteur « Afficher les tâches annulées » */
.tk-switch { display: inline-flex; align-items: center; gap: 7px; cursor: pointer; user-select: none; color: var(--t2); }
.tk-switch input { position: absolute; opacity: 0; width: 0; height: 0; }
.tk-switch-tr { position: relative; box-sizing: border-box; width: 34px; height: 18px; flex: none; border-radius: 999px; background: var(--sf3); border: 1px solid var(--bd); transition: background .15s, border-color .15s; }
.tk-switch-tr::after { content: ''; position: absolute; top: 1px; left: 1px; width: 14px; height: 14px; border-radius: 50%; background: var(--t2); transition: transform .15s, background .15s; }
.tk-switch:hover .tk-switch-tr { border-color: var(--bd2); }
.tk-switch input:checked + .tk-switch-tr { background: rgba(6,182,212,.25); border-color: var(--blue); }
.tk-switch input:checked + .tk-switch-tr::after { transform: translateX(16px); background: var(--blue); }
.tk-switch:has(input:checked) { color: var(--t); }
.tk-switch input:focus-visible + .tk-switch-tr { outline: 2px solid var(--blue); outline-offset: 1px; }
.tk-board { display: grid; grid-template-columns: repeat(auto-fit, minmax(220px, 1fr)); gap: 16px; align-items: start; }
.tk-col { background: var(--sf2); border: 1px solid var(--bd); border-radius: 10px; display: flex; flex-direction: column; min-height: 80px; }
.tk-col-head { font-weight: 600; font-size: 13px; padding: 10px 12px; border-bottom: 1px solid var(--bd); display: flex; align-items: center; gap: 6px; color: var(--t); }
.tk-count { background: var(--sf3); color: var(--t2); border-radius: 10px; padding: 0 7px; font-size: 11px; font-weight: 600; }
.tk-col-body { padding: 10px; display: flex; flex-direction: column; gap: 10px; }
.tk-empty { color: var(--t3); text-align: center; font-size: 13px; padding: 14px 0; }
/* Sous-sections par chantier (colonne « Traitée », ROADMAP « DEMANDES BE »
   11/08/2026) : les vignettes déjà réunifiées par ss-réf se regroupent en
   plus par affaire, avec un en-tête discret (pas de <details> — utile même
   avec 1-2 demandes par chantier, contrairement à un historique qui grossit
   sans fin). */
.pc-chantier-section { display: flex; flex-direction: column; gap: 8px; }
.pc-chantier-section + .pc-chantier-section { margin-top: 4px; padding-top: 10px; border-top: 1px dashed var(--bd); }
.pc-chantier-hd { font-size: 12px; font-weight: 700; color: var(--t2); display: flex; align-items: center; gap: 6px; text-transform: uppercase; letter-spacing: .02em; }
/* Carte : titre en tête, liseré gauche = priorité, fond teinté si retard. */
.tk-card { background: var(--sf); border: 1px solid var(--bd); border-left: 3px solid var(--bd2); border-radius: 10px; padding: 10px 12px; cursor: pointer; transition: box-shadow .15s, transform .1s; }
.tk-card:hover { box-shadow: var(--sh); transform: translateY(-1px); }
.tk-card[draggable="true"] { cursor: grab; }
.tk-card.tk-dragging { opacity: .5; cursor: grabbing; }
.tk-card.tk-pr-faible  { border-left-color: #94a3b8; }
.tk-card.tk-pr-moyenne { border-left-color: #3b82f6; }
.tk-card.tk-pr-haute   { border-left-color: #f97316; }
.tk-card.tk-pr-urgente { border-left-color: #ef4444; }
.tk-card.tk-late { background: rgba(239,68,68,.05); }
.tk-col-drop { outline: 2px dashed var(--blue); outline-offset: -2px; background: rgba(6,182,212,.06); }
.tk-card-badges { display: flex; align-items: center; flex-wrap: wrap; gap: 6px; margin-top: 6px; }
/* .tk-card-top : encore utilisé hors module Tâches (BE-Travaux, prises de côtes). */
.tk-card-top { display: flex; align-items: center; justify-content: space-between; gap: 6px; margin-bottom: 4px; }
.tk-card-titre { font-weight: 650; font-size: 14px; line-height: 1.35; color: var(--t); }
/* Tâche terminée : carte réduite au titre (atténuée), clic = revoir le détail. */
.tk-card.tk-done { padding: 6px 10px; border-left-color: #22c55e; opacity: .72; }
.tk-card.tk-done .tk-card-titre { font-size: 12.5px; font-weight: 600; color: var(--t2); }
.tk-card.tk-done:hover { opacity: 1; }
/* Regroupement mois/année de la colonne Terminée (ROADMAP 10/08/2026) —
   <details> natif, replié par défaut ; seul le mois en cours reste affiché
   carte par carte hors de ces vignettes. */
.tk-done-group { border: 1px solid var(--bd); border-radius: 8px; background: var(--sf); }
.tk-done-group + .tk-done-group, .tk-card + .tk-done-group { margin-top: 2px; }
.tk-done-group summary {
  cursor: pointer; padding: 6px 10px; font-size: 12px; font-weight: 600; color: var(--t2);
  list-style: none; display: flex; align-items: center; gap: 6px; user-select: none;
}
.tk-done-group summary::-webkit-details-marker { display: none; }
.tk-done-group summary::before { content: '▸'; font-size: 10px; color: var(--t3); transition: transform .15s; }
.tk-done-group[open] > summary::before { transform: rotate(90deg); }
.tk-done-group summary:hover { color: var(--t); }
.tk-done-group-body { padding: 6px 8px 8px; display: flex; flex-direction: column; gap: 6px; }
.tk-done-year > summary { font-weight: 700; }
.tk-done-year > .tk-done-group-body { padding: 4px 0 2px 6px; gap: 4px; }
/* Prise de côtes « Traitée » : vignette réduite à une ligne (titre), en vert. */
.tk-card.pc-done { padding: 6px 10px; border-left-color: #22c55e; border-color: rgba(34,197,94,.4); background: rgba(34,197,94,.08); }
.tk-card.pc-done .tk-card-titre { font-size: 12.5px; font-weight: 600; color: #15803d; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
/* ── PDC (ROADMAP) : rang de dépôt, historique réunifié, multi-ss-réfs ── */
.pc-card { position: relative; }
/* Badge « 2ᵉ » en haut à droite : un dépôt antérieur vise déjà la même ss-réf. */
.pc-rang { position: absolute; top: -7px; right: -7px; background: var(--orange, #f59e0b); color: #fff;
  font-size: 10px; font-weight: 700; padding: 1px 6px; border-radius: 10px; box-shadow: 0 1px 3px rgba(0,0,0,.25); }
/* Compteur ×N sur la vignette traitée réunifiée (N dépôts historiques). */
.pc-hist-n { display: inline-block; margin-left: 6px; font-size: 11px; font-weight: 700;
  color: #15803d; background: rgba(34,197,94,.18); border-radius: 10px; padding: 0 6px; }
/* Ligne cliquable de l'historique des dépôts. */
.pc-hist-row { border: 1px solid var(--bd); border-radius: 8px; padding: 8px 10px; margin-bottom: 8px; cursor: pointer; color: var(--t); }
.pc-hist-row:hover { background: var(--sf2); }
/* Sélection multi-ss-réfs de la modale de création : lignes cliquables (case
   masquée) — un clic sur la ligne sélectionne, coche bleue + surbrillance. */
.pc-choices { max-height: 260px; overflow-y: auto; border: 1px solid var(--bd); border-radius: 8px; padding: 4px 6px; background: var(--sf); }
.pc-choice-wrap { margin: 2px 0; border-radius: 6px; }
.pc-choice { display: flex; align-items: center; gap: 8px; padding: 6px 8px; border: 1px solid transparent; border-radius: 6px; cursor: pointer; font-size: 13px; color: var(--t); user-select: none; }
.pc-choice:hover { background: var(--sf2); border-color: var(--bd); }
.pc-choice input { display: none; }
.pc-choice-check { flex: none; width: 16px; height: 16px; border: 1.5px solid var(--bd2); border-radius: 4px; display: inline-flex; align-items: center; justify-content: center; font-size: 11px; color: transparent; }
.pc-choice:has(input:checked) { background: rgba(6,182,212,.10); border-color: var(--blue); }
.pc-choice:has(input:checked) .pc-choice-check { background: var(--blue); border-color: var(--blue); color: #fff; }
/* Avancement de la prise de côte (25/50/75/100 %, OBLIGATOIRE) — sous la ligne
   ss-réf cochée, hors du <label> pour ne pas interférer avec la sélection. */
.pc-choice-pct { display: flex; align-items: center; gap: 6px; padding: 2px 8px 8px 30px; flex-wrap: wrap; }
.pc-choice-pct.hidden { display: none; }
.pc-pct-btn {
  padding: 3px 10px; font: inherit; font-size: 12px; font-weight: 700; cursor: pointer;
  border: 1px solid var(--bd); border-radius: 999px; background: var(--sf2); color: var(--t2);
  transition: background .12s, color .12s, border-color .12s;
}
.pc-pct-btn:hover { border-color: var(--bd2); }
.pc-pct-btn.on { background: var(--blue); border-color: var(--blue); color: #fff; }
/* Ligne ss-réf + chevron replier/déplier son détail (indépendant de la coche). */
.pc-choice-row { display: flex; align-items: center; gap: 4px; }
.pc-choice-row .pc-choice { flex: 1; }
.pc-choice-collapse { flex: none; border: none; background: transparent; cursor: pointer; color: var(--t2); font-size: 13px; padding: 4px 8px; border-radius: 6px; }
.pc-choice-collapse:hover { color: var(--t); background: var(--sf2); }
.pc-choice-collapse.hidden { visibility: hidden; }
.dbe-wiz-next { margin-top: 14px; }
/* ── Demandes BE : assistant de création (3 onglets verticaux) ── */
.dbe-wiz { display: flex; gap: 16px; align-items: flex-start; }
.dbe-wiz-nav { display: flex; flex-direction: column; gap: 4px; flex: none; width: 170px; }
.dbe-wiz-tab {
  text-align: left; padding: 9px 12px; border: 1px solid var(--bd); border-radius: 8px;
  background: var(--sf2); color: var(--t2); font: inherit; font-size: 13px; font-weight: 600; cursor: pointer;
}
.dbe-wiz-tab:hover:not(:disabled) { border-color: var(--bd2); color: var(--t); }
.dbe-wiz-tab.on { background: var(--blue); border-color: var(--blue); color: #fff; }
.dbe-wiz-tab:disabled { opacity: .5; cursor: not-allowed; }
.dbe-wiz-panels { flex: 1; min-width: 0; }
.dbe-wiz-panel.hidden { display: none; }
/* Boutons de choix (type de demande, flexibilité) — pastilles cliquables. */
.dbe-pills { display: flex; flex-wrap: wrap; gap: 6px; }
.dbe-pill {
  padding: 6px 12px; font: inherit; font-size: 13px; font-weight: 600; cursor: pointer;
  border: 1px solid var(--bd); border-radius: 999px; background: var(--sf2); color: var(--t2);
}
.dbe-pill:hover { border-color: var(--bd2); }
.dbe-pill.on { background: var(--blue); border-color: var(--blue); color: #fff; }
.dbe-familles { display: flex; flex-wrap: wrap; gap: 6px; }
/* Détail par ouvrage (Menu 2) : champs texte + zones de fichiers, sous la ligne cochée. */
.dbe-detail { padding: 8px 8px 4px 30px; }
.dbe-detail.hidden { display: none; }
.dbe-detail textarea { width: 100%; margin-bottom: 4px; }
.dbe-detail input[type="file"] { display: block; font-size: 12px; margin-bottom: 8px; }
/* ── Détail d'une prise de côtes : en-tête statut, sections, pastilles ── */
.pc-d-head { display: flex; justify-content: space-between; align-items: flex-start; gap: 10px;
  padding: 10px 14px; border-radius: 10px; background: var(--sf2); border-left: 4px solid var(--bd2); }
.pc-d-en_attente { border-left-color: #f59e0b; }
.pc-d-acceptee   { border-left-color: #3b82f6; }
.pc-d-traitee    { border-left-color: #22c55e; }
.pc-d-incomplete { border-left-color: #ef4444; }
.pc-d-affaire { font-weight: 700; font-size: 16px; color: var(--t); line-height: 1.3; }
.pc-d-client  { color: var(--t2); font-size: 12px; margin-top: 1px; }
.pc-d-meta { color: var(--t2); font-size: 12.5px; line-height: 1.5; margin: 10px 2px 0; }
.pc-d-sec { margin-top: 18px; }
.pc-d-sec-t { font-size: 11.5px; font-weight: 700; letter-spacing: .4px; text-transform: uppercase; color: var(--t2); margin-bottom: 9px; }
.pc-d-count { background: var(--sf3); color: var(--t2); border-radius: 10px; padding: 0 7px; font-size: 11px; }
.pc-d-cible { display: flex; align-items: center; gap: 8px; padding: 3px 0; }
.pc-d-cible-des { font-size: 13.5px; color: var(--t); }
.pc-rang-inline { font-size: 11px; font-weight: 700; color: #b45309; background: rgba(245,158,11,.15); border-radius: 10px; padding: 0 8px; white-space: nowrap; }
.pc-d-note { white-space: pre-wrap; font-size: 13.5px; line-height: 1.55; color: var(--t); background: var(--sf2); border-radius: 8px; padding: 10px 12px; }
/* Demandes BE : détail par ouvrage (onglet « Détails demande ») — accordéon
   replié par défaut, en-tête cliquable (allège la vue d'ensemble). */
.pc-d-cible-block { border: 1px solid var(--bd); border-radius: 8px; padding: 10px 12px; margin-bottom: 10px; }
.pc-d-cible-hd { display: flex; align-items: center; gap: 8px; padding: 4px 0; cursor: pointer; user-select: none; }
.pc-d-cible-hd:hover .pc-d-cible-des { color: var(--t); }
.pc-d-cible-chev { margin-left: auto; color: var(--t2); font-size: 12px; transition: transform .15s; }
.pc-d-cible-hd.open .pc-d-cible-chev { transform: rotate(90deg); }
.pc-d-cible-body { margin-top: 10px; }
.pc-d-cible-body.hidden { display: none; }
.pc-d-champ { font-size: 13.5px; line-height: 1.5; color: var(--t); margin: 5px 0; white-space: pre-wrap; }
.pc-d-zone { margin-top: 10px; }
/* Pièces jointes en vignettes. */
.pc-d-docs { display: flex; flex-wrap: wrap; gap: 6px; }
.pc-doc { display: inline-flex; align-items: center; gap: 6px; background: var(--sf2); border: 1px solid var(--bd); border-radius: 8px; padding: 4px 9px; font-size: 12.5px; max-width: 100%; }
.pc-doc a { text-decoration: none; }
.pc-doc-open { max-width: 240px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.pc-doc-del { color: #ef4444; }
.pc-upl-btn { display: inline-block; margin-top: 8px; font-size: 12.5px; font-weight: 600; color: var(--blue); border: 1px dashed var(--blue); border-radius: 8px; padding: 4px 12px; cursor: pointer; }
.pc-upl-btn:hover { background: rgba(6,182,212,.08); }
/* Statut : pastilles cliquables (BE), teintées par statut quand sélectionnées. */
.pc-st-pills { display: flex; flex-wrap: wrap; gap: 6px; margin-bottom: 8px; }
.pc-st-pill { border: 1px solid var(--bd); background: var(--sf); color: var(--t2); font-size: 12.5px; font-weight: 600; padding: 5px 13px; border-radius: 16px; cursor: pointer; }
.pc-st-pill:hover { border-color: var(--bd2); color: var(--t); }
.pc-st-pill.on[data-st="en_attente"] { background: rgba(245,158,11,.15); border-color: #f59e0b; color: #b45309; }
.pc-st-pill.on[data-st="acceptee"]   { background: rgba(59,130,246,.15); border-color: #3b82f6; color: #1d4ed8; }
.pc-st-pill.on[data-st="traitee"]    { background: rgba(34,197,94,.15); border-color: #22c55e; color: #15803d; }
.pc-st-pill.on[data-st="incomplete"] { background: rgba(239,68,68,.15); border-color: #ef4444; color: #b91c1c; }
/* Espace échanges façon messagerie : mes messages à droite. */
.pc-d-msgs { max-height: 240px; overflow-y: auto; display: flex; flex-direction: column; gap: 6px; padding: 2px; }
.pc-msg { max-width: 85%; padding: 6px 10px; border-radius: 10px; background: var(--sf2); border: 1px solid var(--bd); align-self: flex-start; }
.pc-msg-own { align-self: flex-end; }
.pc-msg-be { border-left: 3px solid #2563eb; }
.pc-msg-cd { border-left: 3px solid #16a34a; }
.pc-msg-head { display: flex; justify-content: space-between; gap: 12px; font-size: 11px; color: var(--t2); }
.pc-msg-head b { color: var(--t); }
.pc-msg-txt { white-space: pre-wrap; font-size: 13px; color: var(--t); margin-top: 2px; }
.pc-msg-row { display: flex; gap: 6px; align-items: flex-start; margin-top: 8px; }
.pc-msg-row textarea { flex: 1; }
/* ── Annotation d'un document par le BE (remarques dessinées) ── */
.pc-ann-bar { display: flex; align-items: center; gap: 6px; flex-wrap: wrap; margin-bottom: 8px; }
.pc-ann-tool.on { border-color: var(--blue); color: var(--blue); background: rgba(6,182,212,.08); }
.pc-ann-colors { display: inline-flex; gap: 5px; margin-left: 4px; }
.pc-ann-color { width: 20px; height: 20px; border-radius: 50%; border: 2px solid transparent; cursor: pointer; padding: 0; }
.pc-ann-color.on { border-color: var(--t); transform: scale(1.15); }
.pc-ann-pages { display: inline-flex; align-items: center; gap: 6px; }
.pc-ann-wrap { max-height: 60vh; overflow: auto; border: 1px solid var(--bd); border-radius: 8px; background: var(--sf2); }
.pc-ann-stack { position: relative; width: fit-content; margin: 0 auto; }
.pc-ann-stack canvas { display: block; max-width: 100%; height: auto; }
#pc-ann-over { position: absolute; inset: 0; width: 100%; height: 100%; cursor: crosshair; touch-action: none; }
#pc-ann-over.pc-ann-main { cursor: grab; }
#pc-ann-over.pc-ann-main.pc-ann-grab { cursor: grabbing; }
.pc-ann-zoom { display: inline-flex; align-items: center; gap: 4px; }
.pc-ann-zoom #pc-ann-zl { min-width: 40px; text-align: center; }
/* Pièce « remarques BE » dans la liste des documents. */
.pc-doc-rembe { border-color: #f59e0b; background: rgba(245,158,11,.08); }
.pc-doc-tag { background: #f59e0b; color: #fff; font-size: 10px; font-weight: 700; border-radius: 6px; padding: 0 5px; }
.tk-card-desc { color: var(--t2); font-size: 12px; margin-top: 5px; }
.tk-prio { font-size: 11px; font-weight: 600; padding: 1px 8px; border-radius: 10px; white-space: nowrap; }
.tk-p-faible  { background: #eef2f5; color: #5b6573; }
.tk-p-moyenne { background: #e0edff; color: #1d4ed8; }
.tk-p-haute   { background: #ffedd5; color: #c2410c; }
.tk-p-urgente { background: #fee2e2; color: #b91c1c; }
.tk-ech { font-size: 11px; color: var(--t2); white-space: nowrap; background: var(--sf2); border-radius: 10px; padding: 1px 8px; }
.tk-ech-retard { color: #b91c1c; background: #fee2e2; font-weight: 600; }
.tk-detail-top { display: flex; gap: 10px; align-items: center; margin-bottom: 8px; }
.tk-detail-desc { white-space: pre-wrap; margin: 0 0 12px; color: var(--t); }
/* Équipe (SS3) */
.tk-col-hl .tk-col-head { background: rgba(245,158,11,.16); color: var(--orange); border-radius: 10px 10px 0 0; }
.tk-card-meta { font-size: 11px; color: var(--t2); margin-top: 4px; }
.tk-valid { display: inline-block; margin-top: 4px; font-size: 11px; font-weight: 600; color: var(--orange); }
.tk-tovalidate { background: #fee2e2; color: #b91c1c; font-weight: 600; font-size: 12px; padding: 3px 10px; border-radius: 12px; margin-left: auto; }
.tk-tag { background: #e0edff; color: #1d4ed8; font-size: 11px; font-weight: 600; padding: 1px 8px; border-radius: 10px; }
.tk-picker { max-height: 220px; overflow-y: auto; border: 1px solid var(--bd); border-radius: 8px; padding: 4px; }
.tk-picker-row { display: flex; align-items: center; justify-content: space-between; gap: 8px; padding: 4px 6px; }
.tk-picker-row + .tk-picker-row { border-top: 1px solid var(--bd); }
.tk-picker-nom { font-size: 13px; }
.tk-picker-row select { min-width: 130px; }
.tk-parts { margin: 12px 0; border-top: 1px solid var(--bd); padding-top: 10px; }
.tk-parts-head { font-size: 13px; margin-bottom: 6px; }
.tk-part-row { display: flex; align-items: center; justify-content: space-between; gap: 8px; padding: 3px 0; font-size: 13px; }
.tk-ok { color: var(--green); font-weight: 700; }
.tk-wf-note { background: rgba(245,158,11,.14); color: var(--orange); border-radius: 8px; padding: 8px 10px; font-size: 13px; margin: 6px 0; }
.tk-wf-note.tk-wf-ok { background: rgba(16,185,129,.16); color: var(--green); }

/* Rappels & commentaires (SS5) */
.tk-rappels, .tk-comments { margin: 12px 0; border-top: 1px solid var(--bd); padding-top: 10px; }
.tk-sec-head { font-size: 13px; font-weight: 600; margin-bottom: 6px; color: var(--t); }
.tk-rappel-row { display: flex; align-items: center; justify-content: space-between; gap: 8px; padding: 3px 0; font-size: 13px; color: var(--t); }
.tk-rappel-act { display: flex; align-items: center; gap: 6px; }
.tk-snooze { font-size: 12px; padding: 2px 4px; }
.tk-rappel-form { display: grid; gap: 8px; background: var(--sf2); border-radius: 8px; padding: 10px; }
.tk-rappel-form-act { display: flex; gap: 8px; }
.tk-cm { background: var(--sf2); border-radius: 8px; padding: 8px 10px; margin-bottom: 6px; font-size: 13px; color: var(--t); }
.tk-cm-meta { font-size: 12px; color: var(--t2); margin-bottom: 2px; }
.tk-cm-body { white-space: pre-wrap; }
.tk-cm-refus { background: rgba(239,68,68,.14); border-left: 3px solid var(--red); }
.tk-cm-sys { background: rgba(6,182,212,.14); border-left: 3px solid var(--blue); }
.tk-comment-add { display: flex; gap: 8px; align-items: flex-start; }
.tk-comment-add textarea { flex: 1; }
@media (max-width: 720px) {
  .tk-board { grid-template-columns: 1fr; }
}

/* ════════════════════════════════════════════════════════════════
   INFORMATIONS GÉNÉRALES — frise d'avancement des chantiers
   ════════════════════════════════════════════════════════════════ */
.ig-frise-wrap { padding: 6px 26px 18px; overflow-x: auto; }
/* Cadre de la frise : 0 % à gauche → 100 % à droite. L'axe gradué est en haut ;
   sous lui la piste (track) accueille les vignettes positionnées en absolu,
   chacune reliée à l'axe par une tige verticale. */
.ig-frise { position: relative; min-width: 760px; }

/* Axe horizontal gradué, en haut de la frise. */
.ig-axis {
  position: relative; height: 28px;
  border-bottom: 2px solid var(--bd2);
}
.ig-axis .ig-tick { position: absolute; bottom: 0; transform: translateX(-50%); }
.ig-axis .ig-tick::after {
  content: ''; position: absolute; bottom: -7px; left: 50%; transform: translateX(-50%);
  width: 2px; height: 8px; background: var(--bd2);
}
.ig-axis .ig-tick-lbl {
  display: block; font-size: 11px; font-weight: 700;
  color: var(--t2); white-space: nowrap;
}

.ig-track { position: relative; width: 100%; }

/* Lignes verticales de repère (0/25/50/75/100 %) traversant la piste. */
.ig-grid { position: absolute; inset: 0; pointer-events: none; }
.ig-gline {
  position: absolute; top: 0; bottom: 0; width: 0;
  border-left: 1px dashed var(--bd);
}

/* Tige reliant l'axe (haut) à la vignette. Hauteur posée en inline. */
.ig-pin-stem {
  position: absolute; top: 0; width: 2px;
  transform: translateX(-50%);
  background: var(--c-ring);
}
.ig-pin-stem::before {
  content: ''; position: absolute; top: -5px; left: 50%; transform: translateX(-50%);
  width: 9px; height: 9px; border-radius: 50%;
  background: var(--c-ring); box-shadow: 0 0 0 2px var(--sf);
}

/* Vignette épurée : nom du chantier + % facturé. Couleur = --c (par chantier). */
.ig-pin {
  position: absolute; transform: translateX(var(--tx, -50%));
  width: 168px; box-sizing: border-box;
  display: flex; flex-direction: column; gap: 1px;
  padding: 7px 11px;
  background: var(--sf2);
  border: 1px solid var(--bd);
  border-left: 4px solid var(--c);
  border-radius: var(--rad);
  box-shadow: var(--sh);
  cursor: pointer; text-align: left;
  font: inherit; color: var(--t);
  transition: transform .12s, box-shadow .12s, border-color .12s;
  z-index: 2;
}
.ig-pin:hover {
  transform: translateX(var(--tx, -50%)) translateY(-3px);
  box-shadow: var(--sh2);
  border-color: var(--c-ring);
  z-index: 6;
}
.ig-pin-title {
  font-size: 12.5px; font-weight: 600; line-height: 1.25;
  white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
}
.ig-pin-pct { font-size: 15px; font-weight: 700; color: var(--c); line-height: 1.1; }

@media (max-width: 700px) {
  .ig-pin { width: 148px; }
}

/* ════════════════════════════════════════════════════════════════
   TB CHANTIER — Avancement administratif : ligne par chantier, 3 barres
   Démarrage / Suivi / Clôture (REFORMATER AVANCEMENT GENERAL 30/07/2026,
   10 étapes — fusion Dossier technique + Transmission AP)
   ════════════════════════════════════════════════════════════════ */
/* Barre de filtres (ROADMAP « AVANCEMENT GENERAL » 30/07/2026) : recherche
   texte + filtres classiques (type de chantier, phase, alertes), persistants
   côté client (_aaFilters) — remplace le tri comme seul moyen de retrouver
   un chantier. */
.aa-filters {
  display: flex; flex-wrap: wrap; align-items: center; gap: 8px;
  padding: 0 14px 10px;
}
.aa-filters select, .aa-filters input[type="search"] {
  padding: 5px 8px; border: 1px solid var(--bd); border-radius: 8px;
  background: var(--sf); color: var(--t); font: inherit; font-size: 12.5px;
}
.aa-f-alerte {
  display: inline-flex; align-items: center; gap: 5px;
  font-size: 12.5px; color: var(--t2); cursor: pointer; white-space: nowrap;
}
.aa-wrap { padding: 12px 14px 16px; overflow-x: auto; }
.aa-table { width: 100%; border-collapse: collapse; min-width: 760px; }
.aa-table th {
  text-align: left; font-size: 10.5px; font-weight: 800; text-transform: uppercase;
  letter-spacing: .04em; color: var(--t2); padding: 0 10px 8px;
}
.aa-row { cursor: pointer; transition: background .12s; }
.aa-row:hover { background: var(--sf2); }
.aa-row.aa-row-open { background: var(--sf2); }
.aa-row td { padding: 8px 10px; border-top: 1px solid var(--bd); vertical-align: middle; }
.aa-row-nom { font-weight: 700; font-size: 13px; color: var(--t); border-left: 4px solid var(--c); }
/* Ligne dépliée (accordéon) sous un chantier cliqué : contenu partagé avec la
   modale du bandeau (mountAvancementDetail), sans chrome de modale. */
.aa-detail-row td { padding: 14px 18px 18px; background: var(--sf2); border-top: none; }
/* Barre de progression d'un groupe (Démarrage/Suivi/Clôture) : pleine = 100 %
   d'étapes dépassées, fraction = process cochés sur l'étape en cours. */
.aa-bar-cell { display: flex; align-items: center; gap: 8px; min-width: 120px; }
.aa-bar-track {
  flex: 1; height: 8px; border-radius: 999px; background: var(--sf2);
  border: 1px solid var(--bd); overflow: hidden;
}
.aa-bar-fill { height: 100%; background: hsl(215, 70%, 48%); border-radius: 999px; transition: width .2s; }
.aa-bar-fill.ok { background: linear-gradient(90deg, #16a34a, #22c55e); }
/* Groupe où se trouve l'étape courante du chantier : liseré teinté. */
.aa-bar-cell.aa-bar-cur .aa-bar-track { border-color: var(--c); box-shadow: 0 0 0 2px var(--c-soft, transparent); }
.aa-bar-pct { font-size: 10.5px; font-weight: 800; color: var(--t2); width: 32px; text-align: right; flex: 0 0 auto; }
.aa-etape-badge {
  display: inline-flex; align-items: center; gap: 4px; padding: 2px 8px;
  border-radius: 999px; font-size: 11px; font-weight: 700;
  background: var(--sf); border: 1px solid var(--bd); color: var(--t);
  white-space: nowrap;
}
.aa-num {
  display: inline-flex; align-items: center; justify-content: center;
  width: 20px; height: 20px; border-radius: 50%;
  background: hsl(215, 70%, 48%); color: #fff; font-size: 11px; font-weight: 700;
  flex: 0 0 auto;
}
.aa-warn { font-size: 11px; }
/* Badge compteur des process cochés de l'étape courante (x/y ; vert = tout
   est coché, le chantier peut passer à l'étape suivante). */
.aa-prog {
  flex: 0 0 auto; padding: 1px 5px;
  border: 1px solid var(--bd); border-radius: 999px;
  font-size: 10px; font-weight: 800; color: var(--t2); background: var(--sf);
}
.aa-prog.ok { border-color: #22c55e; color: #22c55e; }
/* Alerte de stagnation : le chantier dépasse le délai admis sur son étape →
   clignotement rouge toutes les 2 s + pictogramme ⚠ (ROADMAP DETAIL PROCESS). */
.aa-alerte { animation: aa-blink 2s step-start infinite; }
@keyframes aa-blink {
  0%, 100% { border-color: #dc2626; border-left-color: #dc2626; box-shadow: 0 0 0 2px rgba(220, 38, 38, .35); }
  50%      { border-color: var(--bd); border-left-color: var(--c); box-shadow: var(--sh); }
}

/* ════════════════════════════════════════════════════════════════
   PLANNING AP — planning partagé SMG ↔ AP (réplique du Google Sheet)
   ════════════════════════════════════════════════════════════════ */
.pap-leg::before { content: '●'; margin-right: 4px; }
.pap-leg { font-size: 11px; font-weight: 600; }
.pap-leg.rouge { color: #dc2626; }
.pap-leg.rose { color: #db2777; }
/* Bandeau d'indicateurs cliquables (filtres) + résumé camions. */
.pap-kpis { display: flex; flex-wrap: wrap; gap: 8px; align-items: center; }
.pap-kpi {
  font: inherit; font-size: 12px; font-weight: 600; cursor: pointer;
  padding: 5px 12px; border-radius: 999px;
  border: 1px solid var(--bd); background: var(--sf); color: var(--t);
  transition: border-color .12s, background .12s;
}
.pap-kpi b { font-size: 13px; }
.pap-kpi:hover:not(.passive) { border-color: var(--bd2); }
.pap-kpi.on { background: #2563eb; border-color: #2563eb; color: #fff; }
.pap-kpi.rouge { border-color: rgba(220, 38, 38, .55); color: #dc2626; }
.pap-kpi.rouge.on { background: #dc2626; color: #fff; }
.pap-kpi.passive { cursor: default; color: var(--t2); }
.pap-camions { display: flex; flex-wrap: wrap; gap: 6px; }
.pap-camion {
  font: inherit; font-size: 12px; font-weight: 600; cursor: pointer;
  padding: 4px 11px; border-radius: 999px;
  border: 1px dashed var(--bd2); background: var(--sf); color: var(--t);
}
.pap-camion {
  border-color: var(--cam, var(--bd2));
  background: linear-gradient(var(--cam-soft, transparent), var(--cam-soft, transparent)), var(--sf);
  color: var(--cam, var(--t));
}
.pap-camion.on { border-style: solid; box-shadow: 0 0 0 2px var(--cam-soft, rgba(37, 99, 235, .2)); }
.pap-camion.fige { border-style: solid; }
/* Toutes les lignes d'un même camion (même date d'arrivée prévue) : liseré
   gauche de la couleur du camion. */
tr.pap-cam td:first-child { border-left: 4px solid var(--cam); }
/* Badge camion dérivé dans la ligne (n° chronologique de l'année). */
.pap-cam-badge-cell {
  font: inherit; font-size: 11px; font-weight: 800; cursor: pointer;
  padding: 2px 9px; border-radius: 999px;
  border: 1px solid var(--cam);
  background: linear-gradient(var(--cam-soft), var(--cam-soft)), var(--sf);
  color: var(--cam);
}
.pap-cam-badge-cell:hover { filter: brightness(1.1); }
/* Camion figé : lignes verrouillées (teinte or + cadenas). */
tr.pap-row-fige td { background: rgba(217, 164, 32, .07); }
.pap-cadenas { margin-right: 3px; font-size: 11px; cursor: help; }
/* ── Fiche camion (modale) : héro coloré + tuiles + liste de commandes ── */
.pap-cam-hero {
  padding: 14px 16px 12px; margin-bottom: 12px;
  border: 1px solid var(--bd); border-left: 4px solid var(--cam);
  border-radius: var(--rad);
  background: linear-gradient(135deg, var(--cam-soft), transparent 70%), var(--sf2);
}
.pap-cam-hero-top { display: flex; align-items: center; justify-content: space-between; gap: 10px; flex-wrap: wrap; }
.pap-cam-titre { font-size: 17px; font-weight: 800; }
.pap-cam-badge {
  padding: 3px 11px; border-radius: 999px;
  border: 1px solid var(--bd2); font-size: 11px; font-weight: 700; color: var(--t2);
  white-space: nowrap;
}
.pap-cam-badge.fige { border-color: rgba(217, 164, 32, .7); background: rgba(217, 164, 32, .15); color: #b45309; }
.pap-cam-stats { display: flex; flex-wrap: wrap; gap: 8px; margin-top: 10px; }
.pap-cam-stat {
  flex: 1; min-width: 110px; padding: 7px 10px;
  border: 1px solid var(--bd); border-radius: 10px; background: var(--sf);
  text-align: center;
}
.pap-cam-stat .lbl { font-size: 9.5px; font-weight: 700; text-transform: uppercase; letter-spacing: .05em; color: var(--t2); }
.pap-cam-stat .val { font-size: 15px; font-weight: 800; margin-top: 1px; }
.pap-cam-stat .val small { font-size: 10.5px; font-weight: 600; color: var(--t2); margin-left: 4px; }
.pap-cam-note { margin-top: 10px; font-size: 11.5px; color: var(--t2); font-style: italic; }
.pap-cam-liste { display: flex; flex-direction: column; gap: 7px; }
.pap-cam-ligne {
  display: flex; align-items: center; justify-content: space-between; gap: 12px; flex-wrap: wrap;
  padding: 9px 12px;
  border: 1px solid var(--bd); border-radius: 10px; background: var(--sf2);
}
.pap-cam-ligne-g { min-width: 0; flex: 1; }
.pap-cam-chantier { display: flex; align-items: center; gap: 6px; font-size: 13px; font-weight: 800; }
.pap-cam-dot { width: 9px; height: 9px; border-radius: 50%; flex: 0 0 auto; }
.pap-cam-ouvrages { font-size: 12px; color: var(--t2); margin-top: 1px; overflow-wrap: break-word; }
.pap-cam-ligne-d { display: flex; align-items: center; gap: 10px; flex-wrap: wrap; }
.pap-cam-qte {
  padding: 2px 10px; border-radius: 999px;
  background: var(--bd); font-size: 12px; font-weight: 800;
}
.pap-cam-arrivee { font-size: 11.5px; font-weight: 700; }
.pap-cam-lieu { font-size: 11.5px; color: var(--t2); }
.pap-pill-lecture {
  display: inline-block; padding: 2px 9px; border-radius: 999px;
  border: 1px solid var(--bd); font-size: 11px; font-weight: 700;
}
/* Cellules dates : la petite semaine (S32) sous le champ ; retard / écart. */
.pap-datew { display: flex; flex-direction: column; align-items: center; gap: 1px; }
.pap-datew input[type="date"] { width: 100%; font-size: 11px; padding: 3px 3px; }
.pap-datew small { font-size: 9.5px; font-weight: 700; color: var(--t2); }
.pap-cell-retard { background: rgba(220, 38, 38, .14) !important; }
.pap-cell-retard small { color: #dc2626; }
.pap-cell-ecart { background: rgba(245, 158, 11, .16) !important; }
.pap-cell-ecart small { color: #b45309; }
/* Colonne CAMION (2ᵉ) : badge du n° dérivé + petit rang de priorité gris en
   bas à droite ; l'ordre se change en GLISSANT la ligne (drag & drop). */
.pap-td-camion { position: relative; padding-bottom: 12px !important; }
.pap-prio-mini {
  position: absolute; bottom: 1px; right: 4px;
  font-size: 9px; font-weight: 700; color: var(--t2); opacity: .8;
  cursor: default;
}
tr[draggable="true"] { cursor: grab; }
tr[draggable="true"]:active { cursor: grabbing; }
tr.pap-dragging td { opacity: .35; }
tr.pap-drop-cible td { box-shadow: inset 0 3px 0 #2563eb; }
/* Menu contextuel générique (clic droit sur une ligne/vignette) — utilisé par
   le Planning AP (Supprimer/Dupliquer) et par les vignettes-famille de la
   Checklist Chantier (Dissocier). */
.pap-ctx, .avp-ctx {
  position: fixed; z-index: 1000; min-width: 210px;
  padding: 5px;
  background: var(--sf); border: 1px solid var(--bd); border-radius: 10px;
  box-shadow: var(--sh2);
}
.pap-ctx-titre, .avp-ctx-titre {
  padding: 5px 10px 6px; font-size: 11px; font-weight: 800; color: var(--t2);
  border-bottom: 1px solid var(--bd); margin-bottom: 4px;
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}
.pap-ctx button, .avp-ctx button {
  display: block; width: 100%; text-align: left;
  padding: 7px 10px; border: none; border-radius: 7px;
  background: transparent; color: var(--t);
  font: inherit; font-size: 12.5px; cursor: pointer;
}
.pap-ctx button:hover:not(:disabled), .avp-ctx button:hover:not(:disabled) { background: var(--sf2); }
.pap-ctx button.danger, .avp-ctx button.danger { color: #dc2626; }
.pap-ctx button:disabled, .avp-ctx button:disabled { opacity: .5; cursor: default; }

/* Chantier : liste déroulante des chantiers validés en cours (côté SMG). */
.pap-select-chantier {
  width: 100%; box-sizing: border-box;
  font: inherit; font-size: 12px; font-weight: 700;
  padding: 3px 4px; border-radius: 6px;
  border: 1px solid transparent; background: transparent; color: var(--t);
  text-overflow: ellipsis; cursor: pointer;
}
.pap-select-chantier:hover:not(:disabled) { border-color: var(--bd2); }
.pap-select-chantier:focus { border-color: #2563eb; background: var(--sf); outline: none; }
.pap-chantier-ro { font-size: 12px; font-weight: 700; overflow-wrap: break-word; }

/* Lieu de livraison : liste des laqueurs + « Autre… » (saisie libre). */
.pap-lieu { display: flex; flex-direction: column; gap: 3px; }
.pap-lieu select { font: inherit; font-size: 11.5px; padding: 3px 4px; border-radius: 6px; border: 1px solid var(--bd); background: var(--sf); color: var(--t); }
.pap-lie { font-size: 11px; cursor: help; }
.pap-td select.pap-pill {
  width: 100%; min-width: 0; box-sizing: border-box;
  border: 1px solid var(--bd); border-radius: 999px;
  background: var(--sf); color: var(--t);
  font: inherit; font-size: 11.5px; font-weight: 700; text-align: center;
  padding: 3px 6px; cursor: pointer;
}
.pap-td select.pap-pill:disabled { cursor: default; }
.pap-changements { display: flex; flex-wrap: wrap; gap: 8px; align-items: center; padding: 10px 14px; font-size: 12.5px; }
.pap-chg {
  font: inherit; font-size: 12px; font-weight: 600; cursor: pointer;
  padding: 3px 10px; border-radius: 999px; background: var(--sf);
  border: 1px solid var(--bd); color: var(--t);
}
.pap-chg.ap { border-color: rgba(220, 38, 38, .55); color: #dc2626; }
.pap-chg.smg { border-color: rgba(219, 39, 119, .55); color: #db2777; }
.pap-scroll { overflow-x: auto; padding: 0; border: 1px solid var(--bd); border-radius: 12px; }
/* table-layout fixed + colgroup : TOUTES les colonnes ont une largeur fixe en
   pixels (y compris LIVRÉ et 💬 commentaires, cf. colgroup généré en JS).
   `min-width` colle à la somme exacte de ces largeurs (40 + 1148 + 200 = 1388,
   marge incluse) : le tableau ne s'écrase JAMAIS en dessous — il défile
   horizontalement via `.pap-scroll` à la place. Avant ce correctif (05/08/2026),
   la colonne commentaires était laissée « auto » et min-width trop bas (1080) :
   sur fenêtre resserrée (sidebar ouverte), elle s'écrasait au lieu de déclencher
   le défilement, provoquant un retour à la ligne du texte et des lignes trop
   hautes — bug remonté par l'utilisateur. */
.pap-table { width: 100%; min-width: 1400px; border-collapse: collapse; font-size: 12.5px; table-layout: fixed; }
/* Grille ALLÉGÉE : plus de quadrillage complet — séparateurs horizontaux fins,
   les fonds teintés SMG/AP suffisent à délimiter les groupes de colonnes. */
.pap-table th, .pap-table td {
  border: none; border-bottom: 1px solid var(--bd);
  padding: 6px 3px; text-align: center; vertical-align: middle;
}
.pap-table tbody tr:last-child td { border-bottom: none; }
/* Survol : toute la ligne se détache légèrement (calque neutre par-dessus les
   teintes existantes, alertes comprises). */
.pap-table tbody tr:hover td { box-shadow: inset 0 0 0 100px rgba(128, 128, 128, .06); }
/* Bande des camps : chips fusionnés par groupe (CÔTÉ SMG / CÔTÉ AP). */
.pap-head-camps th {
  font-size: 9.5px; font-weight: 800; letter-spacing: .1em;
  padding: 5px 4px 4px; border-bottom: none;
}
.pap-head-camps th.smg { background: rgba(90, 130, 220, .16); color: #2563eb; box-shadow: inset 0 3px 0 rgba(90, 130, 220, .55); }
.pap-head-camps th.ap { background: rgba(217, 164, 32, .18); color: #b45309; box-shadow: inset 0 3px 0 rgba(217, 164, 32, .65); }
.pap-head-camps th.mixte { background: var(--sf2); color: var(--t2); box-shadow: inset 0 3px 0 var(--bd2); }
.pap-head-camps th.neutre { background: transparent; }
/* Rang des libellés de colonnes : discret, en petites capitales. */
.pap-head-cols th {
  font-size: 10px; font-weight: 700; letter-spacing: .03em; color: var(--t2);
  padding: 4px 5px 6px; text-transform: uppercase;
}
.pap-head-cols th.smg { background: rgba(90, 130, 220, .07); }
.pap-head-cols th.ap { background: rgba(217, 164, 32, .08); }
.pap-head-cols th.mixte { background: var(--sf2); }
.pap-td input[type="text"], .pap-td input[type="number"] {
  width: 100%; min-width: 60px; box-sizing: border-box;
  border: 1px solid transparent; background: transparent; color: var(--t);
  font: inherit; font-size: 12.5px; text-align: center; border-radius: 6px; padding: 3px 4px;
}
.pap-td input:hover:not(:disabled) { border-color: var(--bd2); }
.pap-td input:focus { border-color: var(--p, #2563eb); background: var(--sf); outline: none; }
.pap-td.ap { background: rgba(217, 164, 32, .06); }
.pap-td.smg { background: rgba(90, 130, 220, .05); }
.pap-td input.pap-pill { border: 1px solid var(--bd); border-radius: 999px; font-weight: 700; font-size: 11.5px; }
.pap-td-fin { width: 34px; }
/* Cellule conversation : montre le DERNIER message (« Tiago : ok pour le
   07/07 ») — cliquer n'importe où dans la cellule ouvre la discussion. */
.pap-td-com { text-align: left; cursor: pointer; position: relative; }
.pap-td-com:hover .pap-com-apercu { text-decoration: underline; }
.pap-nonvu-badge {
  position: absolute; top: 3px; right: 4px;
  padding: 0 6px; border-radius: 999px;
  background: #dc2626; color: #fff; font-size: 9.5px; font-weight: 800;
}
/* Chantier relié / champs texte : le contenu déborde proprement (layout fixe). */
.pap-td input[type="text"] { text-overflow: ellipsis; }
.pap-com-apercu { font-size: 11px; line-height: 1.35; margin-bottom: 3px; overflow-wrap: break-word; }
.pap-com-apercu.rouge { color: #dc2626; font-weight: 600; }
.pap-com-apercu.rose { color: #db2777; font-weight: 600; }
.pap-nonvu { color: #dc2626; }
/* Ligne modifiée non vue : liseré + fond façon légende du sheet. */
tr.pap-row-rouge td { background: rgba(220, 38, 38, .07); }
tr.pap-row-rouge td:first-child { border-left: 4px solid #dc2626; }
tr.pap-row-rose td { background: rgba(219, 39, 119, .07); }
tr.pap-row-rose td:first-child { border-left: 4px solid #db2777; }
tr.pap-finie td { opacity: .75; }
/* RÈGLE DE DÉLAI : arrivée souhaitée ≤ 4 semaines sans réponse AP adaptée →
   ligne clignotante toutes les 2 s (s'éteint quand AP avance l'état et que
   les semaines souhaitée/prévue coïncident). */
tr.pap-row-clignote td { animation: pap-cligno 2s step-start infinite; }
@keyframes pap-cligno {
  0%, 100% { background-color: rgba(220, 38, 38, .18); }
  50%      { background-color: transparent; }
}
.pap-alertes { display: flex; flex-wrap: wrap; gap: 8px; align-items: center; padding: 10px 14px; font-size: 12.5px; border-color: rgba(220, 38, 38, .5); }
/* DÉLAI INTENABLE : < 6 semaines entre envoi plans prévu et arrivée souhaitée
   → les deux cases de dates clignotent en rouge. */
.pap-cell-intenable { animation: pap-cligno 2s step-start infinite; }
.pap-cell-intenable small { color: #dc2626; font-weight: 800; }
.pap-cell-intenable input { color: #dc2626; font-weight: 700; }
/* Envoi des plans : surbrillance à J-7, clignotement une fois la date dépassée
   si AP est toujours « En attente SMG ». */
.pap-cell-envoi-proche { background: rgba(245, 158, 11, .25) !important; }
.pap-cell-envoi-proche small { color: #b45309; font-weight: 800; }
.pap-cell-envoi-depasse { animation: pap-cligno 2s step-start infinite; }
.pap-cell-envoi-depasse small { color: #dc2626; font-weight: 800; }
.pap-cell-envoi-depasse input { color: #dc2626; font-weight: 700; }
.pap-chg.alerte { border-color: rgba(220, 38, 38, .55); color: #dc2626; text-align: left; }
tr.pap-flash td { animation: pap-flash 0.8s ease 2; }
@keyframes pap-flash { 50% { background: rgba(37, 99, 235, .18); } }
.pap-finies summary { cursor: pointer; padding: 10px 14px; font-weight: 700; }
/* Fil de commentaires (modale) — présentation type CHAT : mes messages à
   droite, ceux de l'autre camp à gauche, bulles teintées par camp. */
.pap-chat {
  display: flex; flex-direction: column; gap: 8px;
  max-height: 380px; min-height: 120px; overflow-y: auto;
  padding: 12px 10px; margin-bottom: 10px;
  background: var(--sf2); border: 1px solid var(--bd); border-radius: 12px;
}
.pap-chat-vide { text-align: center; margin: auto 0; }
.pap-msg { display: flex; }
.pap-msg.mien { justify-content: flex-end; }
.pap-msg-bulle {
  max-width: 78%; padding: 7px 11px 5px;
  border-radius: 14px; border: 1px solid var(--bd);
  background: var(--sf); box-shadow: var(--sh);
}
.pap-msg .pap-msg-bulle { border-bottom-left-radius: 4px; }
.pap-msg.mien .pap-msg-bulle { border-bottom-right-radius: 4px; border-bottom-left-radius: 14px; }
.pap-msg-bulle.ap { background: linear-gradient(rgba(217, 164, 32, .13), rgba(217, 164, 32, .13)), var(--sf); }
.pap-msg-bulle.smg { background: linear-gradient(rgba(90, 130, 220, .12), rgba(90, 130, 220, .12)), var(--sf); }
/* Non « vu » par l'autre camp : accent rouge (AP) / rose (SMG), comme le sheet. */
.pap-msg-bulle.ap.nonvu { border-color: rgba(220, 38, 38, .55); }
.pap-msg-bulle.ap.nonvu .pap-msg-texte { color: #dc2626; font-weight: 600; }
.pap-msg-bulle.smg.nonvu { border-color: rgba(219, 39, 119, .55); }
.pap-msg-bulle.smg.nonvu .pap-msg-texte { color: #db2777; font-weight: 600; }
.pap-msg-head { display: flex; align-items: baseline; gap: 6px; margin-bottom: 2px; font-size: 11px; }
.pap-msg-texte { font-size: 13px; line-height: 1.4; white-space: pre-wrap; overflow-wrap: break-word; }
.pap-msg-meta { margin-top: 3px; font-size: 10px; color: var(--t2); text-align: right; }
.pap-side-tag { font-size: 9px; font-weight: 800; padding: 1px 6px; border-radius: 999px; letter-spacing: .05em; }
.pap-side-tag.ap { background: rgba(217, 164, 32, .2); color: #b45309; }
.pap-side-tag.smg { background: rgba(90, 130, 220, .18); color: #2563eb; }
.pap-chat-vu { margin-bottom: 8px; }
.pap-chat-saisie { display: flex; gap: 8px; align-items: flex-end; }
.pap-chat-saisie textarea {
  flex: 1; resize: none; min-height: 38px; max-height: 120px;
  border-radius: 19px; padding: 9px 14px;
}
.pap-chat-envoyer {
  flex: 0 0 auto; width: 38px; height: 38px; padding: 0;
  border-radius: 50%; font-size: 15px; line-height: 1;
  display: inline-flex; align-items: center; justify-content: center;
}

/* ── Bandeau « chantiers en cours » (en-tête du TB chantier) ────── */
/* Pastilles compactes sur une ligne : [n° étape] nom [x/y] — le client et le
   libellé d'étape restent dans l'infobulle pour garder la frise visible sans
   descendre. */
.tbc-tiles {
  display: flex; flex-wrap: wrap; gap: 6px;
  padding: 8px 14px 12px;
}
.tbc-tile {
  display: inline-flex; align-items: center; gap: 6px;
  max-width: 230px; padding: 4px 9px 4px 5px;
  font: inherit; cursor: pointer; text-align: left;
  background: linear-gradient(var(--c-soft, transparent), var(--c-soft, transparent)), var(--sf);
  border: 1px solid var(--bd);
  border-left: 3px solid var(--c);
  border-radius: 999px;
  box-shadow: var(--sh);
  color: var(--t);
  transition: transform .12s, box-shadow .12s;
}
.tbc-tile:hover { transform: translateY(-1px); box-shadow: var(--sh2); }
.tbc-tile-nom {
  min-width: 0; font-size: 11px; font-weight: 700; line-height: 1.2;
  overflow-wrap: break-word;
}
.tbc-tile-num {
  flex: 0 0 auto;
  display: inline-flex; align-items: center; justify-content: center;
  min-width: 18px; height: 18px; padding: 0 4px; border-radius: 999px;
  background: var(--c); color: #fff; font-size: 9.5px; font-weight: 800;
}

/* ── Modale « process de l'étape » (clic vignette chantier) ─────── */
/* En-tête héro aux couleurs du chantier (--c = teinte de sa vignette). */
.avp-hero {
  padding: 14px 16px 12px;
  border: 1px solid var(--bd);
  border-left: 4px solid var(--c);
  border-radius: var(--rad);
  background: linear-gradient(135deg, var(--c-soft), transparent 70%), var(--sf2);
  margin-bottom: 14px;
}
.avp-hero-top { display: flex; align-items: center; justify-content: space-between; gap: 10px; flex-wrap: wrap; }
.avp-etape-badge {
  padding: 3px 10px; border-radius: 999px;
  background: var(--c); color: #fff;
  font-size: 11px; font-weight: 800; letter-spacing: .03em; white-space: nowrap;
}
.avp-client {
  font-size: 12px; font-weight: 600; color: var(--t2);
  white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
}
/* Avancement général — Dissociation (ROADMAP 03/08/2026) : badge ss-réf
   discret + boutons Historique/Dissocier dans le bandeau. */
.avp-ssrefs {
  font-size: 11px; color: var(--t2); background: var(--sf3);
  border-radius: 999px; padding: 2px 9px; white-space: nowrap; cursor: default;
}
.avp-dissocier-btn { margin-left: auto; }
.avp-etape-nom { margin-top: 8px; font-size: 17px; font-weight: 800; line-height: 1.25; }

.avp-progress-row { display: flex; align-items: baseline; justify-content: space-between; margin-bottom: 5px; }
.avp-pct { font-size: 13px; color: var(--t2); }
.avp-pct.ok { color: #22c55e; }
.avp-bar {
  height: 7px; border-radius: 999px; background: var(--bd);
  overflow: hidden; margin-bottom: 14px;
}
.avp-bar-fill {
  height: 100%; border-radius: 999px;
  background: linear-gradient(90deg, #f59e0b, #fbbf24);
  transition: width .35s ease;
}
.avp-bar-fill.ok { background: linear-gradient(90deg, #16a34a, #22c55e); }

.avp-list { list-style: none; margin: 0; padding: 0; display: flex; flex-direction: column; gap: 8px; }
.avp-item {
  display: flex; align-items: center; gap: 10px;
  padding: 10px 12px;
  border: 1px solid var(--bd); border-radius: 10px;
  background: var(--sf2);
  transition: border-color .15s, background .15s, box-shadow .15s;
}
.avp-item:not(.done):not(.lock):hover { border-color: var(--bd2); box-shadow: var(--sh); }
.avp-item.done { background: rgba(34, 197, 94, .07); border-color: rgba(34, 197, 94, .35); }
.avp-item.done .avp-lbl { color: var(--t2); }
.avp-check { flex: 1; display: flex; align-items: center; gap: 10px; min-width: 0; cursor: pointer; position: relative; }
.avp-item.lock .avp-check { cursor: default; }
.avp-check input { position: absolute; opacity: 0; width: 0; height: 0; }
/* Case custom : carré arrondi qui se remplit en vert avec un ✓. */
.avp-box {
  flex: 0 0 auto; width: 22px; height: 22px; border-radius: 7px;
  border: 2px solid var(--bd2); background: var(--sf);
  display: inline-flex; align-items: center; justify-content: center;
  color: transparent; font-size: 13px; font-weight: 900; line-height: 1;
  transition: background .15s, border-color .15s, color .15s, transform .1s;
}
.avp-item:not(.done):not(.lock) .avp-check:hover .avp-box { border-color: #22c55e; }
.avp-item.done .avp-box { background: #22c55e; border-color: #22c55e; color: #fff; }
.avp-check:active .avp-box { transform: scale(.9); }
.avp-item.lock .avp-check:active .avp-box { transform: none; }
.avp-lbl { font-size: 13.5px; font-weight: 600; line-height: 1.35; }
.avp-meta { flex: 0 0 auto; display: flex; align-items: center; gap: 8px; }
.avp-auto {
  padding: 2px 8px; border-radius: 999px;
  border: 1px dashed var(--bd2); font-size: 10px; font-weight: 800;
  color: var(--t2); text-transform: uppercase; letter-spacing: .05em;
  white-space: nowrap; cursor: help;
}
.avp-auto.on { border-color: #22c55e; color: #22c55e; background: rgba(34, 197, 94, .08); }
.avp-who {
  display: flex; flex-direction: column; align-items: flex-end;
  font-size: 11px; font-weight: 600; color: var(--t2); line-height: 1.3;
  max-width: 130px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}
.avp-who small { font-weight: 400; opacity: .8; }
/* Bandeau « prêt à passer à l'étape suivante ». */
.avp-ready {
  margin: 12px 0 0; padding: 9px 12px;
  border: 1px solid rgba(34, 197, 94, .4); border-radius: var(--rad);
  background: rgba(34, 197, 94, .08); color: #16a34a;
  font-size: 12.5px; font-weight: 700;
}
.avp-ready.avp-attente { border-color: rgba(245, 158, 11, .45); background: rgba(245, 158, 11, .09); color: #b45309; }
/* Navigation Revenir/Valider — inline dans le contenu (partagée par la ligne
   dépliée du tableau et la modale du bandeau, REFORMATER AVANCEMENT GENERAL). */
.avp-footer-nav { display: flex; justify-content: flex-end; gap: 8px; margin-top: 14px; }
/* Coche réservée à certains rôles (ex. OS signé → Resp. commercial). */
.avp-role {
  padding: 2px 8px; border-radius: 999px;
  border: 1px solid var(--bd); background: var(--sf);
  font-size: 10px; font-weight: 700; color: var(--t2);
  white-space: nowrap; cursor: help;
}
/* Groupes alternatifs : la famille est satisfaite quand UNE variante est
   entièrement cochée (fabrication interne OU commande fournisseur). */
.avp-famille {
  margin-top: 10px; padding: 10px 12px;
  border: 1px solid var(--bd); border-radius: 10px; background: var(--sf);
}
.avp-famille.ok { border-color: rgba(34, 197, 94, .45); }
.avp-famille-head { display: flex; align-items: baseline; gap: 8px; margin-bottom: 8px; }
.avp-fam-ok { margin-left: auto; color: #22c55e; font-weight: 900; }
.avp-variantes { display: grid; grid-template-columns: repeat(var(--avp-variantes-n, 2), 1fr); gap: 8px; }
@media (max-width: 700px) { .avp-variantes { grid-template-columns: 1fr; } }
.avp-variante {
  padding: 8px; border: 1px dashed var(--bd); border-radius: 8px;
}
.avp-variante.ok { border-style: solid; border-color: rgba(34, 197, 94, .45); background: rgba(34, 197, 94, .05); }
.avp-variante-titre { font-size: 11px; font-weight: 800; text-transform: uppercase; letter-spacing: .04em; color: var(--t2); margin-bottom: 6px; }
/* Frise miniature du panneau déplié (REFORMATER AVANCEMENT GENERAL, 2e passe
   30/07/2026) : une colonne par étape, une vignette « Chantier » dedans — ou,
   sur les étapes 4 à 8 d'un devis multi-famille, plusieurs vignettes
   « {Famille} » empilées dans la colonne correspondant à la position
   ACTUELLE de chacune (progression indépendante par famille d'ouvrage,
   dérivée dynamiquement du devis — pas une liste fixe). Cliquer une vignette
   charge sa checklist en dessous. */
.avp-frise-mini {
  display: flex; gap: 4px; overflow-x: auto; padding-bottom: 4px; margin-bottom: 14px;
}
.avp-frise-col { display: flex; flex-direction: column; align-items: center; gap: 4px; flex: 1; min-width: 74px; }
.avp-frise-num {
  display: inline-flex; align-items: center; justify-content: center;
  width: 18px; height: 18px; border-radius: 50%;
  background: var(--bd); color: var(--t2); font-size: 10px; font-weight: 800;
}
.avp-frise-num.cur { background: var(--c); color: #fff; }
.avp-frise-num.done { background: var(--bd2); color: var(--t2); }
.avp-frise-stack { display: flex; flex-direction: column; gap: 3px; width: 100%; }
.avp-frise-chip {
  width: 100%; display: flex; flex-direction: column; align-items: center; gap: 2px;
  padding: 5px 6px; font: inherit; cursor: pointer;
  border: 1px solid var(--bd); border-radius: 8px; background: var(--sf);
  transition: border-color .12s, background .12s, transform .1s;
}
.avp-frise-chip:hover { border-color: var(--bd2); transform: translateY(-1px); }
.avp-frise-chip.sel { border-color: var(--c); border-width: 2px; background: var(--c-soft, transparent); }
.avp-frise-chip.done { opacity: .65; }
.avp-frise-chip-t {
  font-size: 10px; font-weight: 700; color: var(--t); text-align: center;
  white-space: nowrap; overflow: hidden; text-overflow: ellipsis; max-width: 100%;
}
.avp-frise-fam { border-left: 3px solid var(--c); }
/* Sélection multiple (Ctrl+clic, ROADMAP « AVANCEMENT GENERALE DISSOCIATION »
   03/08/2026) — distinct du focus `.sel` (bordure pleine colorée). */
.avp-frise-fam.multi-sel { outline: 2px dashed var(--c); outline-offset: 1px; background: var(--c-soft, transparent); }
.avp-frise-lbl {
  font-size: 9.5px; font-weight: 700; color: var(--t2); text-align: center;
  text-transform: uppercase; letter-spacing: .02em;
  white-space: nowrap; overflow: hidden; text-overflow: ellipsis; max-width: 100%;
}
.avp-frise-vide { font-size: 10px; color: var(--t2); opacity: .5; }

/* Aperçu à 2 colonnes du modal de dissociation — checklists réelles côte à
   côte (ROADMAP « MODIF AVANCEMENT GENERAL » 04/08/2026). */
.avp-dissoc-cols { display: flex; gap: 16px; margin-top: 14px; align-items: flex-start; }
.avp-dissoc-col { flex: 1; min-width: 0; border: 1px solid var(--bd); border-radius: 8px; padding: 10px 12px; }
.avp-dissoc-col-t { font-weight: 700; font-size: 13px; color: var(--t); margin-bottom: 8px; }
/* Historique des dissociations (modale) — ROADMAP « AVANCEMENT GENERALE
   DISSOCIATION » 03/08/2026. */
.avp-historique { display: flex; flex-direction: column; gap: 10px; }
.avp-hist-item { border: 1px solid var(--bd); border-radius: 8px; padding: 8px 10px; font-size: 13px; color: var(--t); }
.avp-hist-item > div { margin: 2px 0; }
/* Badge variante dans l'éditeur admin du catalogue. */
.avc-alt {
  padding: 1px 7px; border-radius: 999px;
  border: 1px dashed var(--bd2); font-size: 10px; font-weight: 600; color: var(--t2);
  cursor: help;
}

/* ── Modale « Réunion de passation » (validation d'un devis) ────── */
.rp-invites { margin-top: 12px; display: flex; flex-direction: column; gap: 6px; }
.rp-tags { display: flex; flex-wrap: wrap; gap: 6px; }
.rp-tag {
  display: inline-flex; align-items: baseline; gap: 5px;
  padding: 3px 10px; border-radius: 999px;
  border: 1px solid var(--bd); background: var(--sf2);
  font-size: 12px; font-weight: 600; cursor: default;
}
.rp-tag small { font-weight: 400; color: var(--t2); font-size: 10.5px; }
.rp-warn {
  padding: 6px 10px; border-radius: var(--rad);
  border: 1px solid rgba(245, 158, 11, .45); background: rgba(245, 158, 11, .09);
  color: #b45309;
}

/* ── Éditeur admin du catalogue de process (⚙ Gérer les process) ── */
.avc-etape { margin-bottom: 14px; }
.avc-etape-head { display: flex; align-items: center; gap: 8px; margin-bottom: 6px; }
.avc-list { list-style: none; margin: 0 0 6px; padding: 0; display: flex; flex-direction: column; gap: 4px; }
.avc-item {
  display: flex; align-items: center; gap: 8px;
  padding: 5px 8px; border: 1px solid var(--bd); border-radius: var(--rad);
  background: var(--sf2);
}
.avc-item.off { opacity: .55; }
.avc-lbl { flex: 1; min-width: 0; font-size: 13px; }
.avc-actions { display: flex; gap: 2px; }
.avc-actions button {
  border: none; background: transparent; color: var(--t2);
  font-size: 12px; padding: 2px 5px; border-radius: 4px; cursor: pointer;
}
.avc-actions button:hover:not(:disabled) { background: var(--bd); color: var(--t); }
.avc-actions button:disabled { opacity: .3; cursor: default; }
.avc-vide { margin: 0 0 6px; }
.avc-add { display: flex; gap: 6px; }
.avc-add input { flex: 1; }

/* ── Éditeur devis : curseur d'insertion des nouvelles lignes ────── */
/* Ligne cible : trait bleu épais sous la ligne = point d'insertion. */
.dv-lignes tr.insert-after td { border-bottom: 3px solid #2563eb; }
.ic-btn.ins-active { color: #2563eb; background: rgba(37, 99, 235, .14); border-radius: 4px; }

/* ════════════════════════════════════════════════════════════════
   RENTABILITÉ — « Fil de l'affaire » (timeline des événements)
   ════════════════════════════════════════════════════════════════ */
.fa-fil { padding: 10px 16px 14px; max-height: 420px; overflow-y: auto; }
.fa-item { position: relative; padding: 0 0 20px 36px; }
/* Tige pointillée reliant les événements (masquée sur le dernier). */
.fa-item::before {
  content: ''; position: absolute; left: 10px; top: 20px; bottom: -2px;
  border-left: 3px dotted var(--bd2);
}
.fa-item:last-child { padding-bottom: 2px; }
.fa-item:last-child::before { display: none; }
.fa-dot {
  position: absolute; left: 1px; top: 1px;
  width: 19px; height: 19px; border-radius: 50%;
  background: #2563eb; box-shadow: 0 0 0 2px var(--sf);
}
.fa-lbl { font-size: 13px; font-weight: 700; line-height: 1.3; color: var(--t); }
.fa-date {
  margin-top: 2px; font-size: 11.5px; color: var(--t2);
  font-family: ui-monospace, Consolas, monospace;
}
.fa-par { font-style: italic; }
/* À traiter (ex. situation à émettre) : point orange. */
.fa-item.att .fa-dot { background: #ea580c; }
/* Jalon futur : point creux + texte grisé. */
.fa-item.fut .fa-dot { background: transparent; border: 4px solid var(--bd2); }
.fa-item.fut .fa-lbl { color: var(--t2); }

/* ── Filigrane de marque global (logo + agence, toutes les pages) ── */
/* Centré dans le premier écran de #main, opacité 12 %, non interactif. Le
   contenu (topbar + vue) est positionné avec un z-index supérieur : les
   données et boutons passent TOUJOURS au-dessus du filigrane. */
#main { position: relative; }
#app-wm {
  position: absolute; top: 0; left: 0; right: 0; height: 100vh; z-index: 0;
  display: flex; flex-direction: column; align-items: center; justify-content: center; gap: 14px;
  opacity: .12; pointer-events: none; user-select: none;
  font-size: 46px; font-weight: 800; letter-spacing: .08em; text-transform: uppercase;
  color: var(--t); text-align: center;
}
#app-wm img { max-width: 340px; max-height: 190px; object-fit: contain; }
#app-wm img:not([src]), #app-wm img[src=""] { display: none; }
#view { position: relative; z-index: 1; }
/* Topbar au-dessus de la vue : ses menus déroulants (cloche…) doivent
   recouvrir le contenu, sinon le contexte d'empilement de #view passe devant. */
#topbar { position: relative; z-index: 2; }

/* ── Accueil (tableau de bord personnel, par espace) ─────────────── */
/* Bandeau héro : salutation + alertes transverses */
.acc-hero {
  display: flex; align-items: flex-end; justify-content: space-between; gap: 18px;
  flex-wrap: wrap; margin-bottom: 18px; padding: 22px 24px;
  border-radius: 16px; border: 1px solid var(--bd);
  background:
    radial-gradient(1100px 280px at 0% 0%, color-mix(in srgb, var(--blue) 13%, transparent), transparent 60%),
    linear-gradient(135deg, var(--sf2), var(--sf));
}
.acc-hero h1 { margin: 0 0 4px; font-size: 26px; font-weight: 800; letter-spacing: -.02em; }
.acc-date { color: var(--t2); font-size: 13px; text-transform: capitalize; }
.acc-chips { display: flex; gap: 8px; flex-wrap: wrap; justify-content: flex-end; }
.acc-chip {
  display: inline-flex; align-items: center; gap: 6px; text-decoration: none;
  font-size: 12px; font-weight: 600; color: var(--t);
  padding: 6px 12px; border-radius: 999px;
  background: color-mix(in srgb, var(--red) 13%, var(--sf));
  border: 1px solid color-mix(in srgb, var(--red) 40%, var(--bd));
}
.acc-chip b { font-size: 14px; color: var(--red); }
a.acc-chip:hover { filter: brightness(1.12); }
.acc-chip.chip-ok {
  background: color-mix(in srgb, var(--green) 12%, var(--sf));
  border-color: color-mix(in srgb, var(--green) 40%, var(--bd));
  color: var(--green);
}

/* Accueil personnalisable (ROADMAP « ACCUEIL PERSO » 12/08/2026) : tuiles
   raccourcis + visuels mélangées dans la grille masonry (.esp-grid),
   réordonnables par drag en les attrapant sur leur bordure haute. */
.acc-tile { position: relative; }
.acc-tile.dragging { opacity: .35; }
.acc-tile.drag-over { outline: 2px dashed var(--blue); outline-offset: 3px; border-radius: 14px; }
.acc-tile-handle {
  position: absolute; top: 0; left: 0; right: 0; height: 16px; z-index: 3;
  cursor: grab; border-radius: 14px 14px 0 0;
}
.acc-tile-handle:hover { background: color-mix(in srgb, var(--t) 5%, transparent); }
.acc-tile-handle:hover::after {
  content: '⠿'; position: absolute; left: 50%; top: 50%; transform: translate(-50%, -50%);
  font-size: 11px; color: var(--t3, #94a3b8); letter-spacing: 1px;
}
.acc-tile-remove {
  position: absolute; top: 6px; right: 6px; z-index: 4;
  width: 22px; height: 22px; border-radius: 50%; border: none;
  background: var(--sf2); color: var(--t2); cursor: pointer; font-size: 11px;
  display: flex; align-items: center; justify-content: center;
  opacity: 0; transition: opacity .12s ease;
}
.acc-tile:hover .acc-tile-remove, .acc-tile:focus-within .acc-tile-remove { opacity: 1; }
.acc-tile-remove:hover { background: color-mix(in srgb, var(--red) 15%, var(--sf2)); color: var(--red); }
/* Fait de la place au ✕ dans le coin haut-droit, à côté du lien « Ouvrir →». */
.acc-tile .esp-head { padding-right: 38px; }

/* Tuile raccourci compacte (même grille masonry que les cartes espace) */
.acc-tile-sc {
  display: inline-block; width: 100%; vertical-align: top;
  break-inside: avoid; margin: 0 0 16px;
  background: var(--sf); border: 1px solid var(--bd); border-radius: 14px;
  padding: 16px 40px 16px 16px;
}
.acc-sc-link {
  display: flex; align-items: center; gap: 8px; min-width: 0;
  text-decoration: none; color: var(--t); font-weight: 600; font-size: 13px;
}
.acc-sc-link .acc-sc-ic { font-size: 17px; line-height: 1; }
.acc-sc-link .acc-sc-lbl { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }

.acc-tile-add {
  display: inline-flex; align-items: center; justify-content: center; gap: 6px;
  width: 100%; break-inside: avoid; margin: 0 0 16px; min-height: 52px;
  background: transparent; border: 1px dashed var(--bd); border-radius: 14px;
  padding: 16px; color: var(--t2); cursor: pointer; font-size: 13px; font-weight: 600;
}
.acc-tile-add:hover { border-color: var(--blue); color: var(--blue); background: color-mix(in srgb, var(--blue) 6%, transparent); }

/* Modale « Nouveau visuel » : choix Raccourci / Visuel */
.acc-type-choice { display: grid; grid-template-columns: 1fr 1fr; gap: 12px; }
.acc-type-btn {
  display: flex; flex-direction: column; align-items: center; gap: 6px; text-align: center;
  background: var(--sf2); border: 1px solid var(--bd); border-radius: 12px;
  padding: 20px 14px; cursor: pointer; color: var(--t);
}
.acc-type-btn:hover { border-color: var(--blue); background: color-mix(in srgb, var(--blue) 6%, transparent); }
.acc-type-ic { font-size: 26px; }

.acc-sc-pick-list { display: flex; flex-direction: column; gap: 4px; max-height: 50vh; overflow-y: auto; }
.acc-sc-pick-row {
  display: flex; align-items: center; gap: 10px; text-align: left;
  border: 1px solid transparent; background: transparent; border-radius: 8px;
  padding: 8px 10px; cursor: pointer; font-size: 13px; color: var(--t);
}
.acc-sc-pick-row:hover { background: var(--sf2); border-color: var(--bd); }

/* Grille des cartes espace — cascade façon Pinterest (ROADMAP « ACCUEIL »
   11/08/2026) : CSS multi-colonnes (pas de grid) pour que chaque carte se
   place au plus court de sa colonne, sans ligne commune imposée — une carte
   plus haute que ses voisines ne laisse plus de trou dessous, chaque colonne
   se comble indépendamment au cas par cas. */
.esp-grid {
  columns: 330px;
  column-gap: 16px;
}
.esp-card {
  position: relative; overflow: hidden;
  display: inline-block; width: 100%; vertical-align: top;
  break-inside: avoid; -webkit-column-break-inside: avoid;
  margin: 0 0 16px;
  background: var(--sf); border: 1px solid var(--bd); border-radius: 14px;
  box-shadow: var(--sh);
  transition: transform .15s ease, box-shadow .15s ease, border-color .15s ease;
}
/* Liseré dégradé aux couleurs de l'espace, en haut de la carte */
.esp-card::before {
  content: ''; position: absolute; top: 0; left: 0; right: 0; height: 4px;
  background: linear-gradient(90deg, var(--ac), color-mix(in srgb, var(--ac) 15%, transparent));
}
.esp-card:hover {
  transform: translateY(-2px); box-shadow: var(--sh2);
  border-color: color-mix(in srgb, var(--ac) 50%, var(--bd));
}
/* Couleur d'accent par espace (reprise sur liseré, icône, KPI, liens) */
.esp-taches     { --ac: #8b5cf6; }
.esp-commercial { --ac: #06b6d4; }
.esp-suivi      { --ac: #3b82f6; }
.esp-chantier   { --ac: #f59e0b; }
.esp-achats     { --ac: #10b981; }
.esp-production { --ac: #6366f1; }
.esp-conges     { --ac: #f43f5e; }
.esp-planning   { --ac: #6366f1; }
.esp-partenaire { --ac: #0ea5e9; }   /* partenaires extérieurs (AP, sous-traitants) */

.esp-head { display: flex; align-items: center; gap: 10px; padding: 14px 16px 10px; }
.esp-head h2 { margin: 0; font-size: 15px; font-weight: 700; flex: 1; }
.esp-ic {
  width: 34px; height: 34px; border-radius: 10px; flex-shrink: 0;
  display: flex; align-items: center; justify-content: center; font-size: 17px;
  background: color-mix(in srgb, var(--ac) 16%, transparent);
}
.esp-go {
  font-size: 12px; font-weight: 600; text-decoration: none; color: var(--ac);
  padding: 4px 10px; border-radius: 999px; white-space: nowrap;
  background: color-mix(in srgb, var(--ac) 10%, transparent);
}
.esp-go:hover { background: color-mix(in srgb, var(--ac) 22%, transparent); }

/* KPIs : gros chiffres cliquables */
.esp-kpis { display: flex; gap: 8px; padding: 2px 16px 10px; flex-wrap: wrap; }
.esp-kpi {
  flex: 1 1 0; min-width: 88px; text-decoration: none;
  display: flex; flex-direction: column; gap: 2px;
  padding: 10px 12px; border-radius: 10px;
  background: var(--sf2); border: 1px solid var(--bd);
}
.esp-kpi b { font-size: 24px; font-weight: 800; line-height: 1; color: var(--ac); }
.esp-kpi span { font-size: 11px; font-weight: 600; color: var(--t2); }
.esp-kpi:hover { border-color: color-mix(in srgb, var(--ac) 50%, var(--bd)); }
.esp-kpi.kpi-warn { background: color-mix(in srgb, var(--red) 9%, var(--sf2)); }
.esp-kpi.kpi-warn b { color: var(--red); }

/* Listes courtes (échéances, missions, feuilles…) */
.esp-list { padding: 0 16px 10px; display: flex; flex-direction: column; }
.esp-sub {
  font-size: 11px; font-weight: 700; color: var(--t2); text-transform: uppercase;
  letter-spacing: .05em; padding: 8px 0 4px;
}
.esp-row {
  display: flex; align-items: center; gap: 10px; justify-content: space-between;
  padding: 6px 0; border-bottom: 1px solid var(--bd);
  font-size: 13px; text-decoration: none; color: inherit;
}
.esp-row:last-child { border-bottom: 0; }
a.esp-row:hover { color: var(--ac); }
.esp-row.esp-col { flex-direction: column; align-items: flex-start; gap: 2px; }
.esp-row .grow { flex: 1; }
.esp-empty { font-size: 12px; color: var(--t2); font-style: italic; padding: 6px 0; }

/* Raccourcis vers les écrans de l'espace */
.esp-foot {
  display: flex; gap: 6px; flex-wrap: wrap;
  padding: 10px 16px 14px; border-top: 1px dashed var(--bd);
}
.esp-pill {
  font-size: 11.5px; font-weight: 600; text-decoration: none; color: var(--t2);
  padding: 4px 10px; border-radius: 999px; border: 1px solid var(--bd); background: var(--sf2);
}
.esp-pill:hover { color: var(--ac); border-color: color-mix(in srgb, var(--ac) 50%, var(--bd)); }

/* Pastilles partagées (échéance, statut feuille, priorité tâche) */
.acc-sub { font-size: 11px; color: var(--t2); }
.acc-ech {
  font-size: 11px; font-weight: 600; white-space: nowrap;
  padding: 2px 7px; border-radius: 999px; background: var(--sf2); color: var(--t2);
}
.acc-ech.ech-past { background: #fee2e2; color: #b91c1c; }
.acc-ech.ech-soon { background: #ffedd5; color: #9a3412; }
.acc-stat { font-size: 11px; font-weight: 600; padding: 2px 7px; border-radius: 999px; background: var(--sf2); color: var(--t2); }
.acc-stat.st-validee { background: #dcfce7; color: #15803d; }
.acc-stat.st-refusee { background: #fee2e2; color: #b91c1c; }
.acc-stat.st-soumise { background: #ffedd5; color: #9a3412; }
.acc-prio { font-size: 10px; color: var(--t3, #94a3b8); }
.acc-prio.p-haute { color: #b91c1c; }
.acc-prio.p-moyenne { color: #d97706; }
.acc-prio.p-basse { color: #16a34a; }

/* ── Liste des devis (pipeline commercial, bas de l Analyse des chiffrages) ── */
.pl-kpis {
  display: grid; grid-template-columns: repeat(auto-fit, minmax(180px, 1fr));
  gap: 10px; padding: 12px 14px;
}
.pl-tabs { display: flex; gap: 6px; padding: 4px 14px 10px; flex-wrap: wrap; }
.pl-tab {
  border: 1px solid var(--bd); background: var(--sf2); color: var(--t2);
  font: inherit; font-size: 12.5px; font-weight: 600;
  padding: 7px 14px; border-radius: 999px; cursor: pointer;
}
.pl-tab:hover { background: var(--sf3); color: var(--t); }
.pl-tab.active { background: var(--blue3); border-color: var(--blue3); color: #fff; }
.pl-tab .pl-count {
  display: inline-block; min-width: 18px; padding: 0 5px; margin-left: 4px;
  border-radius: 999px; background: rgba(255,255,255,.18); font-size: 11px; text-align: center;
}
.pl-tab:not(.active) .pl-count { background: var(--sf3); color: var(--t2); }
.pl-wrap { overflow-x: auto; }
.pl-table { min-width: 1180px; }
.pl-table td { vertical-align: top; }
.pl-table input, .pl-table select { font-size: 12px; padding: 4px 6px; }

/* ── Sélecteur de graphiques (bouton « Graphiques ▾ » des dashboards) ── */
.cf-wrap { position: relative; }
.cf-btn .cf-caret { font-size: 10px; opacity: .7; }
.cf-badge {
  min-width: 17px; height: 17px; padding: 0 4px; border-radius: 9px;
  background: var(--blue); color: #fff; font-size: 11px; font-weight: 700;
  display: inline-flex; align-items: center; justify-content: center;
}
.cf-menu {
  position: absolute; right: 0; top: calc(100% + 6px);
  background: var(--sf); border: 1px solid var(--bd2); border-radius: 12px;
  box-shadow: 0 8px 28px rgba(0, 0, 0, .35); padding: 10px; z-index: 400;
  min-width: 300px; max-width: 420px; max-height: 62vh; overflow: auto;
}
.cf-menu.hidden { display: none; }
.cf-head {
  display: flex; align-items: center; justify-content: space-between; gap: 14px;
  padding: 0 2px 8px; margin-bottom: 8px; border-bottom: 1px solid var(--bd);
  font-size: 11px; font-weight: 600; letter-spacing: .3px; color: var(--t3);
  white-space: nowrap;
}
.cf-all {
  background: none; border: none; font: inherit; font-size: 12px; font-weight: 600;
  color: var(--blue); cursor: pointer; padding: 0;
}
.cf-all:hover { text-decoration: underline; }
.cf-all.hidden { display: none; }
/* Pastilles : une par bloc — pleine avec œil = affiché, grisée barrée = masqué. */
.cf-chips { display: flex; flex-wrap: wrap; gap: 7px; }
.cf-chip {
  display: inline-flex; align-items: center; gap: 6px;
  padding: 6px 12px; border-radius: 999px;
  border: 1px dashed var(--bd2); background: transparent; color: var(--t3);
  font: inherit; font-size: 12.5px; line-height: 1.2; cursor: pointer;
  transition: background .15s, border-color .15s, color .15s;
}
.cf-chip:hover { border-color: var(--blue); color: var(--t2); }
.cf-chip .cf-chip-eye { display: none; }
.cf-chip .cf-chip-eyeoff { display: inline-flex; opacity: .7; }
.cf-chip .cf-chip-txt { text-decoration: line-through; }
.cf-chip.on {
  border-style: solid; border-color: color-mix(in srgb, var(--blue) 55%, transparent);
  background: color-mix(in srgb, var(--blue) 13%, transparent); color: var(--t);
}
.cf-chip.on .cf-chip-eye { display: inline-flex; color: var(--blue); }
.cf-chip.on .cf-chip-eyeoff { display: none; }
.cf-chip.on .cf-chip-txt { text-decoration: none; }
/* Œil barré au survol d'un bloc : masquage en un clic, directement sur la page. */
.cf-target { position: relative; }
.cf-hide {
  position: absolute; top: 8px; right: 8px; z-index: 5;
  width: 27px; height: 27px; padding: 0; border-radius: 50%;
  display: flex; align-items: center; justify-content: center;
  background: var(--sf3); color: var(--t2); border: 1px solid var(--bd2);
  cursor: pointer; opacity: 0; transition: opacity .15s, background .15s;
}
.cf-target:hover > .cf-hide, .cf-hide:focus-visible { opacity: .92; }
.cf-hide:hover { background: var(--blue); border-color: var(--blue); color: #fff; }
@media (hover: none) { .cf-hide { opacity: .55; } }

/* Loupe de recherche sur les longues listes déroulantes (31/07/2026) : icône
   intégrée DANS la case, juste à gauche de la flèche déroulante (31/07/2026 —
   déplacée depuis une icône externe à côté du <select>). Le wrapper reprend
   le gabarit block/100% du <select> (règle globale `select { width:100% }`)
   pour ne rien changer à la mise en page environnante. */
.ssel-wrap { position: relative; display: block; width: 100%; }
.ssel-wrap select.ssel-has-icon { padding-right: 40px; }
.ssel-icon {
  position: absolute; top: 50%; right: 20px; transform: translateY(-50%);
  display: inline-flex; align-items: center; justify-content: center;
  width: 18px; height: 18px; padding: 0;
  border: none; border-radius: 50%;
  background: transparent; color: var(--t3); font-size: 10px; line-height: 1;
  cursor: pointer; opacity: .6; transition: opacity .15s, background .15s, color .15s;
}
.ssel-icon:hover, .ssel-icon:focus-visible { opacity: 1; background: var(--blue); color: #fff; }
.ssel-panel {
  position: fixed; z-index: 500; width: 260px; max-height: 320px;
  background: var(--sf); border: 1px solid var(--bd2); border-radius: 10px;
  box-shadow: 0 8px 28px rgba(0, 0, 0, .35);
  display: flex; flex-direction: column; overflow: hidden;
}
.ssel-panel input {
  margin: 8px 8px 6px; width: auto;
}
.ssel-panel ul { list-style: none; margin: 0; padding: 0 6px 8px; overflow-y: auto; }
.ssel-panel li {
  padding: 7px 10px; border-radius: 6px; cursor: pointer; font-size: 13px;
  white-space: nowrap; overflow: hidden; text-overflow: ellipsis; color: var(--t);
}
.ssel-panel li:hover { background: var(--sf2); }
.ssel-panel li.sel { font-weight: 600; color: var(--blue); }
.ssel-panel li.ssel-empty { color: var(--t3); text-align: center; cursor: default; font-size: 12.5px; }
.ssel-panel li.ssel-empty:hover { background: none; }

/* Icône d'aide « ? » discrète à côté du titre d'un bloc d'analyse (graphique
   ou tableau) : ouvre une petite fenêtre expliquant le bloc en 2-3 phrases. */
.chart-help {
  display: inline-flex; align-items: center; justify-content: center;
  width: 15px; height: 15px; margin-left: 6px; padding: 0;
  border-radius: 50%; border: 1px solid var(--bd2);
  background: transparent; color: var(--t3);
  font-size: 10px; font-weight: 700; line-height: 1;
  cursor: pointer; vertical-align: middle;
  transition: background .15s, color .15s, border-color .15s;
}
.chart-help:hover, .chart-help:focus-visible { background: var(--blue); border-color: var(--blue); color: #fff; }

/* ── Espaces : navigation par grandes vignettes (#/espace/<clé>) ────────── */
/* Accents des espaces sans classe existante (les autres réutilisent .esp-*). */
.esp-principal { --ac: #0ea5e9; }
.esp-systeme   { --ac: #6b7280; }
.esp-crumb {
  display: inline-flex; align-items: center; gap: 6px;
  margin-bottom: 16px; font-size: 13px; color: var(--t2); text-decoration: none;
}
.esp-crumb:hover { color: var(--t); }
.esp-tiles {
  display: grid; grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));
  gap: 16px; max-width: 1150px;
}
.esp-tile {
  --ac: var(--blue);
  position: relative; overflow: hidden;
  display: flex; align-items: center; gap: 16px;
  padding: 24px 20px; border-radius: 14px;
  background: var(--sf); border: 1px solid var(--bd);
  text-decoration: none; color: var(--t);
  transition: transform .12s ease, border-color .12s ease, box-shadow .12s ease;
}
.esp-tile::before { content: ''; position: absolute; left: 0; top: 0; bottom: 0; width: 4px; background: var(--ac); }
.esp-tile:hover { transform: translateY(-2px); border-color: var(--ac); box-shadow: 0 8px 22px rgba(0, 0, 0, .18); }
.esp-tile-ic {
  width: 54px; height: 54px; border-radius: 13px; flex: none;
  display: flex; align-items: center; justify-content: center; font-size: 25px;
  background: var(--sf2);
  background: color-mix(in srgb, var(--ac) 14%, transparent);
}
.esp-tile-bd { flex: 1; min-width: 0; }
.esp-tile-bd h3 { font-size: 15.5px; font-weight: 600; margin: 0; }
.esp-tile-bd p { margin: 5px 0 0; font-size: 12px; line-height: 1.5; color: var(--t2); }
.esp-tile-ar { font-size: 17px; color: var(--t3); flex: none; transition: transform .12s ease, color .12s ease; }
.esp-tile:hover .esp-tile-ar { transform: translateX(3px); color: var(--ac); }
.pl-table input[data-pl-f="pipeline_contact"] { width: 130px; }
.pl-table input[data-pl-f="pipeline_commentaire"] { width: 180px; }
.pl-table .pl-nb { width: 64px; }
a.pl-lnk { color: inherit; text-decoration: none; }
a.pl-lnk:hover { color: var(--blue); }
.pl-simpct { display: inline-flex; align-items: center; gap: 3px; white-space: nowrap; font-size: 11px; color: var(--t2); }
.pl-simpct input { width: 62px; text-align: right; }
.pl-delta { display: inline-block; font-size: 10.5px; font-weight: 700; color: var(--orange); margin-left: 3px; }
tr.pl-simmode { background: color-mix(in srgb, var(--orange) 7%, transparent); }
tr.pl-simmode .pl-simpct input { border-color: var(--orange); }
.pl-reset { font-size: 12px; margin-top: 2px; }

/* ── Suivi facturation / prévisionnel (tableau annuel, espace Facturation) ── */
.fp-wrap { overflow-x: auto; }
.fp-table { min-width: 1500px; border-collapse: collapse; width: 100%; }
.fp-table th, .fp-table td { border: 1px solid var(--bd); padding: 5px 7px; font-size: 12px; }
.fp-table thead th { position: sticky; top: 0; background: var(--sf2); z-index: 2; }
.fp-table .fp-aff, .fp-table thead th:first-child, .fp-table tfoot td:first-child {
  position: sticky; left: 0; background: var(--sf); z-index: 1; min-width: 190px;
}
.fp-table thead th:first-child { z-index: 3; background: var(--sf2); }
.fp-table tfoot td { background: var(--sf2); font-weight: 600; }
.fp-th-sub { font-size: 10px; font-weight: 500; color: var(--t2); }
.fp-table .fp-m { min-width: 68px; }
.fp-aff a { color: inherit; text-decoration: none; }
.fp-aff a:hover { color: var(--blue); }
.fp-pb { height: 4px; margin-top: 3px; }
.fp-cell { text-align: right; vertical-align: top; }
.fp-cell.fp-edit { cursor: cell; }
.fp-cell.fp-edit:hover { outline: 2px solid color-mix(in srgb, var(--blue) 55%, transparent); outline-offset: -2px; }
.fp-cell.has-fact { background: var(--sf3); }
.fp-fact { color: var(--t2); }
td.fp-cell .fp-fact { font-weight: 600; }
.fp-env  { color: var(--orange); font-weight: 600; }
.fp-prev, .fp-man { color: var(--blue); font-style: italic; }
.fp-input { width: 76px; font-size: 11.5px; padding: 2px 4px; text-align: right; display: block; margin-left: auto; }
.fp-leg { font-size: 11px; font-weight: 600; font-style: normal; }
.fp-leg.fp-fact { background: var(--sf3); padding: 1px 6px; border-radius: 4px; }

/* ── Analyse des chiffrages (tb-commercial) — mise en page épurée ── */
.tbc-duo { display: grid; grid-template-columns: repeat(auto-fit, minmax(340px, 1fr)); gap: 16px; align-items: stretch; }
.tbc-card h3 { display: flex; align-items: baseline; gap: 8px; justify-content: space-between; }

/* Barre segmentée « en jeu par étape » : marques fines, 2px d écart, bouts arrondis */
.seg-bar { display: flex; gap: 2px; height: 14px; margin: 12px 0 10px; border-radius: 4px; overflow: hidden; }
.seg { border-radius: 4px; min-width: 6px; }
.seg.s-env { background: #06b6d4; }
.seg.s-neg { background: #6366f1; }
.seg.s-rel { background: #f59e0b; }
.seg.s-empty { background: var(--sf3); }
.seg-leg { display: flex; flex-wrap: wrap; gap: 6px 16px; font-size: 12px; color: var(--t2); }
.seg-leg b { color: var(--t); font-weight: 700; }
.seg-dot { display: inline-block; width: 9px; height: 9px; border-radius: 3px; margin-right: 5px; vertical-align: baseline; }
.seg-dot.s-env { background: #06b6d4; }
.seg-dot.s-neg { background: #6366f1; }
.seg-dot.s-rel { background: #f59e0b; }
.tbc-rythme {
  display: flex; flex-wrap: wrap; gap: 4px 20px; margin-top: 12px; padding-top: 10px;
  border-top: 1px dashed var(--bd); font-size: 12px; color: var(--t2);
}
.tbc-rythme b { font-size: 15px; color: var(--t); }

/* Barres classées (postes / clients) : tout est étiqueté directement */
.rk-list { display: flex; flex-direction: column; gap: 7px; padding: 6px 0 2px; }
.rk-row { display: flex; align-items: center; gap: 10px; font-size: 12px; }
.rk-lbl { flex: 0 0 128px; color: var(--t2); text-align: right; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.rk-bar { flex: 1; height: 10px; background: var(--sf2); border-radius: 4px; overflow: hidden; }
.rk-bar > div { height: 100%; border-radius: 4px; }
.rk-bar .rk-orange { background: #f59e0b; }
.rk-bar .rk-blue   { background: #06b6d4; }
.rk-val { flex: 0 0 auto; min-width: 96px; text-align: right; font-weight: 600; white-space: nowrap; }
.rk-pct { font-weight: 500; color: var(--t2); font-size: 11px; }
.rk-inline { display: flex; align-items: center; gap: 10px; }
.rk-inline .rk-val { min-width: 72px; }
.tbc-clients td, .tbc-clients th { font-size: 12.5px; }

/* ── Trésorerie (vue GROUPE) ──────────────────────────────────────── */
.tr-table td:first-child { min-width: 200px; }
.tr-table .tr-hypcell { cursor: pointer; }
.tr-table .tr-hypcell:hover { outline: 2px solid color-mix(in srgb, var(--blue) 55%, transparent); outline-offset: -2px; }
.tr-hyp { color: var(--blue); font-style: italic; font-weight: 600; }
.tr-plus { color: var(--t3); font-weight: 700; opacity: 0; }
.tr-hypcell:hover .tr-plus { opacity: 1; }
.tr-nb {
  display: inline-block; min-width: 15px; margin-left: 3px; padding: 0 4px;
  border-radius: 999px; background: var(--sf3); color: var(--t2);
  font-size: 10px; font-weight: 700; text-align: center;
}
tr.tr-flux td { background: var(--sf2); font-weight: 600; }
tr.tr-cumul td { background: var(--sf3); font-weight: 700; border-top: 2px solid var(--bd2); }
.tr-neg { color: var(--red); }
.tr-tabsep { width: 1px; align-self: stretch; background: var(--bd); margin: 0 6px; }
#tr-init { width: 92px; font-size: 12px; padding: 3px 6px; text-align: right; }
.tr-ligne { display: flex; gap: 8px; align-items: center; margin-bottom: 8px; }
.tr-ligne input[data-lib], .tr-ligne #tr-new-lib { flex: 1; }
.tr-ligne input[type="number"] { width: 120px; text-align: right; }
.tr-ligne .tr-ag {
  font-size: 10.5px; font-weight: 700; color: var(--t2); background: var(--sf2);
  border: 1px solid var(--bd); border-radius: 999px; padding: 2px 8px;
}
.tr-ligne.tr-new { margin-top: 12px; padding-top: 12px; border-top: 1px dashed var(--bd); }

/* Trésorerie : lignes de détail des hypothèses (une par libellé) */
tr.tr-detail td { border-top: none; padding-top: 2px; padding-bottom: 2px; font-size: 11.5px; background: color-mix(in srgb, var(--blue) 4%, transparent); }
.tr-det-lbl { color: var(--t2); padding-left: 14px; font-style: italic; }

/* Trésorerie : périodicité d une nouvelle hypothèse */
.tr-ligne.tr-periode { margin-top: 4px; }
.tr-ligne.tr-periode select { flex: 0 0 auto; }
.tr-ligne.tr-periode input[type="month"] { width: 150px; }

/* Trésorerie : ligne auto (facturation prévisionnelle des chantiers) */
tr.tr-auto td { background: color-mix(in srgb, var(--blue) 6%, transparent); }

/* ============================================================
   Évolution & Croissance (vue GROUPE) : historique annuel figé
   ============================================================ */
.evo-grid {
  display: grid;
  grid-template-columns: repeat(2, minmax(0, 1fr));
  gap: 14px;
}
@media (max-width: 1100px) { .evo-grid { grid-template-columns: 1fr; } }
.evo-chart { position: relative; height: 260px; margin-top: 8px; }

/* Variation d'une année sur l'autre (▲/▼). .up = favorable, .down = défavorable
   (les classes sont posées côté JS en tenant compte du sens : une hausse de
   dépenses est défavorable). */
.evo-delta { font-weight: 600; font-size: 12px; white-space: nowrap; }
.evo-delta.up   { color: var(--green); }
.evo-delta.down { color: var(--red); }

/* Écart réel − prévisionnel (€) */
.evo-pos { color: var(--green); font-weight: 600; }
.evo-neg { color: var(--red);  font-weight: 600; }

/* Ligne « année en cours » (provisoire, non figée) */
tr.evo-encours td { background: color-mix(in srgb, var(--blue) 5%, transparent); font-style: italic; }
tr.evo-encours td .b { font-style: normal; }

/* Valeur en lecture seule (écran Paramètres vue agence : profil effectif) */
.ro-val {
  padding: 7px 9px; min-height: 34px;
  background: var(--sf2); border: 1px solid var(--bd); border-radius: var(--rad-s);
  font-size: 13.5px; line-height: 1.4; white-space: pre-wrap; word-break: break-word;
}
