﻿/* =====================================================================
   design-tokens.css — socle visuel de l'application Marquetis.
   ---------------------------------------------------------------------
   Chargé par head_commun.php, donc présent sur toutes les pages.

   ÉTAT ACTUEL : les 16 pages partagent un seul rendu, la classe
   "fond-pilotage" (plus bas), issue du dashboard. Les 5 fonds et les
   2 styles de carte qui coexistaient auparavant ont été supprimés une
   fois qu'aucune page ne les portait plus — leur définition reste dans
   l'historique Git si un besoin revient.

   UNE PAGE NOUVELLE se raccorde en portant, sur son <body> :
     min-h-screen text-slate-100 font-sans antialiased overflow-x-hidden fond-pilotage
   et rien d'autre : fond, cartes, champs, en-têtes de tableau et boutons
   segmentés suivent. Ne pas y recopier de couleur — utiliser les
   variables déclarées par "fond-pilotage" (--panel-plein, --panel-opaque,
   --bordure-carte, --entete-tableau).

   POUR CHANGER LE DESIGN D'ENSEMBLE : une couleur (orange, teal, texte,
   fond) se change sur une seule ligne du bloc :root ci-dessous, et les
   16 pages suivent.
   ===================================================================== */

:root {
  color-scheme: dark;

  /* --- Surfaces --- */
  --bg: #16262b;
  --bg-soft: #101826;
  --panel: rgba(28, 48, 56, 0.55);          /* opacité des cartes .glass */
  --panel-strong-top: rgba(28, 48, 56, 0.92);
  --panel-strong-bottom: rgba(22, 38, 43, 0.88);
  --border: rgba(148, 163, 184, 0.14);
  --border-glass: rgba(255, 255, 255, 0.06);

  /* --- Texte --- */
  --text: #e5e9ea;
  --muted: #94a3b8;

  /* --- Accents. Les noms Tailwind historiques sont violet / azure /
         emerald2 — mêmes valeurs, voir head_commun.php. --- */
  --accent: #f2622e;
  --accent-dim: #d94e1a;
  --accent-2: #0f9c8f;
  --accent-2-dim: #0c7d73;
  --accent-3: #10b981;
  --accent-3-dim: #059669;

  /* --- États (barèmes de couleur du dashboard) --- */
  --succes: #34d399;
  --alerte: #fbbf24;
  --danger: #fb7185;
  /* Teal clair des icônes, badges et messages de confirmation. Écrit en dur
     (#5eead4) dans une quinzaine d'endroits, y compris depuis du JS qui pose
     un style inline : en variable, sa contrepartie claire suit partout. */
  --teal-vif: #5eead4;

  /* Textes pastel posés sur une pastille translucide (badges de statut,
     cellules de charge du planning). La pastille, elle, reste la même dans
     les deux thèmes : c'est le texte qui doit s'inverser, sinon on obtient
     du rose pâle sur rose pâle. */
  --pastel-vert:  #a7f3d0;
  --pastel-rouge: #fecaca;
  --pastel-jaune: #fde047;
  --pastel-bleu:  #93c5fd;
  --pastel-gris:  #cbd5e1;
  --pastel-orange: #fdba74;

  /* --- Tiroir de navigation (sidebar.php) --- */
  --nav: rgba(13, 23, 27, 0.92);
  --nav-survol: rgba(255, 255, 255, 0.05);
  --nav-actif: rgba(255, 255, 255, 0.10);
  --nav-lisere: #fb923c;                     /* liseré du lien actif */
  --nav-texte: #e2e8f0;                      /* libellés au repos */
  --nav-texte-vif: #f1f5f9;                  /* au survol */
  --nav-texte-actif: #ffffff;                /* page courante */
  --nav-bouton: rgba(28, 48, 56, 0.75);      /* pastille ☰ */
  --nav-bouton-bordure: rgba(255, 255, 255, 0.1);

  --scrollbar: rgba(148, 163, 184, 0.25);
  --scrollbar-survol: rgba(148, 163, 184, 0.4);
}

/* Thème clair : ne s'active que si l'utilisateur clique le bouton dédié
   (classe "light" posée sur <html>). Tant qu'il ne le fait pas, rien de
   ce bloc ne s'applique et l'apparence sombre reste celle d'origine. */
html.light {
  color-scheme: light;

  /* Aligné sur le fond réellement peint par "fond-pilotage" plus bas : c'est
     --bg que <html> affiche dans le rebond élastique du défilement, et un
     écart s'y voit comme une bande plus claire en haut ou en bas de page. */
  --bg: #edf2f3;
  --bg-soft: #e4ecee;
  --panel: rgba(255, 255, 255, 0.9);
  --panel-strong-top: rgba(255, 255, 255, 0.96);
  --panel-strong-bottom: rgba(248, 250, 252, 0.94);
  --border: rgba(15, 23, 42, 0.08);
  --border-glass: rgba(15, 23, 42, 0.08);

  --text: #1e293b;
  --muted: #64748b;

  /* Les quatre teintes d'état sont calibrées pour un fond sombre : sur blanc,
     #34d399 tombe à 1,8:1 et #fbbf24 à 1,7:1 — un message « enregistré » ou un
     avertissement y devient illisible. Mêmes familles, versions foncées. */
  --succes: #047857;
  --alerte: #b45309;
  --danger: #be123c;
  --teal-vif: #0d7d73;
  --pastel-vert:  #065f46;
  --pastel-rouge: #991b1b;
  --pastel-jaune: #854d0e;
  --pastel-bleu:  #1e40af;
  --pastel-gris:  #475569;
  --pastel-orange: #9a3412;

  --nav: rgba(255, 255, 255, 0.96);
  --nav-survol: rgba(15, 23, 42, 0.04);
  --nav-actif: rgba(15, 23, 42, 0.07);
  /* Les trois teintes de libellé étaient les seules variables du tiroir
     laissées en version sombre : #e2e8f0 / #f1f5f9 / #ffffff, soit du blanc
     cassé sur le fond blanc ci-dessus. Titres de groupe illisibles, et le
     lien de la page courante carrément invisible (blanc pur sur gris très
     clair). C'est ce qui rendait le tiroir inutilisable en thème clair. */
  --nav-texte: #334155;
  --nav-texte-vif: #0f172a;
  --nav-texte-actif: #0f172a;
  --nav-lisere: #ea580c;                     /* #fb923c passe mal sur blanc */
  --nav-bouton: rgba(255, 255, 255, 0.92);
  --nav-bouton-bordure: rgba(15, 23, 42, 0.12);

  --scrollbar: rgba(15, 23, 42, 0.18);
  --scrollbar-survol: rgba(15, 23, 42, 0.3);
}

/* =====================================================================
   Base commune à toutes les pages
   ===================================================================== */

html {
  background: var(--bg);
  overflow-x: hidden;
  min-height: 100%;
}

body {
  margin: 0;
  min-height: 100vh;
  overflow-x: hidden;
  font-family: 'Manrope', sans-serif;
  color: var(--text);
  background-color: var(--bg);
}

::-webkit-scrollbar { width: 10px; height: 10px; }
::-webkit-scrollbar-track { background: transparent; }
::-webkit-scrollbar-thumb { background: var(--scrollbar); border-radius: 8px; }
::-webkit-scrollbar-thumb:hover { background: var(--scrollbar-survol); }


/* La carte de base. Son fond, sa bordure et son absence de flou sont
   redefinies par "fond-pilotage" plus bas ; ce qui reste ici sert de
   repli si une page oublie la classe sur son <body>. */
.glass, .glass-strong {
  background: var(--panel);
  border: 1px solid var(--border-glass);
}

/* Coins arrondis par DÉFAUT, pas par recopie. Le rayon vivait dans chaque
   page : `rounded-2xl` posé sur chaque carte de dashboard_sql.php, une règle
   `.glass, .glass-strong { border-radius: 22px }` dans le <style> de
   saisie_heures.php. Une page qui oubliait les deux sortait à angles droits,
   sans que rien ne le signale — mesuré le 16/08/2026 : gestion_taches.php
   (jusqu'à 8 blocs par vue) et sauvegarde.php (13 boutons sur 13), contre
   0 sur les huit autres écrans.

   Le `:where()` est là pour ça : il met la spécificité à ZÉRO, donc n'importe
   quel `rounded-lg` / `rounded-2xl` déjà posé continue de gagner, quel que
   soit l'ordre de chargement des feuilles. C'est un défaut, pas une reprise
   en main — retirer les utilitaires existants n'est pas nécessaire. */
:where(.glass, .glass-strong) { border-radius: 18px; }

/* =====================================================================
   LOOK "PILOTAGE" — le rendu de référence, partagé
   ---------------------------------------------------------------------
   Ces règles vivaient dans le <style> de dashboard_sql.php, donc nulle
   part ailleurs : toute autre page qui voulait le même rendu devait les
   recopier. Elles sont ici pour qu'il suffise de poser la classe
   "fond-pilotage" sur le <body>.

   Il déclare deux valeurs sous forme de variables, pour que les pages
   qui ont leurs propres surfaces (colonne figée, en-tête de tableau à
   deux étages…) s'y raccordent sans réécrire de couleur :
     --panel-plein      fond de carte (translucide, sur le fond de page)
     --panel-opaque     même teinte à plat — pour une colonne figée, qui
                        doit rester opaque sinon les cellules défilent
                        visiblement dessous
     --entete-tableau   fond des <th> figés

   Toutes les pages de l'application la portent.
   ===================================================================== */

body.fond-pilotage {
  --panel-plein: rgba(40, 68, 79, 0.86);
  --panel-opaque: #284350;          /* = --panel-plein aplati sur #24434e */
  --bordure-carte: rgba(186, 214, 220, 0.20);
  --entete-tableau: #223a42;

  /* Le fond immersif superposait un voile presque opaque sur une base
     #16262b : les halos orange et teal passaient dessous et tout l'écran
     tirait au noir. Base remontée d'un cran, voile allégé — mêmes halos,
     aux mêmes places, mais visibles. */
  background-color: #24434e;
  /* Calé sur la fenêtre, pas sur la hauteur du document : sinon le même fond
     rend différemment d'une page à l'autre (le dégradé s'étire sur toute la
     page, donc une page courte atteint sa teinte la plus sombre dès le
     premier écran, une page longue jamais).
     ponytail: "fixed" repeint le fond à chaque défilement — à surveiller si
     une page très longue devient saccadée au scroll. */
  background-attachment: fixed;
  background-image:
    radial-gradient(circle at 10% 6%, rgba(240,82,37,0.24), transparent 48%),
    radial-gradient(circle at 90% 8%, rgba(15,156,143,0.24), transparent 46%),
    radial-gradient(circle at 78% 92%, rgba(94,67,56,0.18), transparent 50%),
    radial-gradient(circle at 15% 95%, rgba(32,118,119,0.20), transparent 48%),
    linear-gradient(180deg, rgba(26,48,56,0.18), rgba(26,48,56,0.34));
}

/* Deux halos fixes, qui ne défilent pas avec le contenu. Ils étaient deux
   <div> en dur dans dashboard_sql.php ; en pseudo-éléments, une page n'a
   rien à recopier dans son corps pour les avoir. */
body.fond-pilotage::before,
body.fond-pilotage::after {
  content: "";
  position: fixed;
  z-index: 0;
  border-radius: 999px;
  pointer-events: none;
}
body.fond-pilotage::before {
  top: -6rem; left: -6rem; width: 18rem; height: 18rem;
  background: radial-gradient(circle, #f2622e, transparent 70%);
  opacity: .10;
}
body.fond-pilotage::after {
  top: 33%; right: -8rem; width: 24rem; height: 24rem;
  background: radial-gradient(circle, #0f9c8f, transparent 70%);
  opacity: .08;
}

/* Les cartes montent avec le fond, sinon elles s'y fondent. Elles restent un
   cran au-dessus pour se détacher, et leur bordure gagne en présence : sur un
   fond plus clair, un contour à 12 % d'opacité disparaît. */
body.fond-pilotage .glass,
body.fond-pilotage .glass-strong {
  background: var(--panel-plein);
  border: 1px solid var(--bordure-carte);
  backdrop-filter: none;
  -webkit-backdrop-filter: none;
}
body.fond-pilotage .glass-strong {
  background: linear-gradient(180deg, rgba(45,75,86,0.92), rgba(38,65,76,0.88));
}
/* Les cartes KPI se détachaient à peine du fond du dashboard : ce gris-bleu
   avait été réglé sur l'ancien fond de page (--bg #16262b, plus sombre),
   jamais repris quand le fond a été remonté à #24434e — les deux se
   retrouvaient à moins de 10 valeurs RGB l'une de l'autre. Plus sombre que
   le glass-strong générique, pour que la carte reste nettement une carte. */
body.fond-pilotage .kpi-card.glass-strong {
  background: linear-gradient(180deg, rgba(33,54,63,0.93), rgba(27,46,54,0.90));
}
/* Même fond que les cartes KPI, pour les graphiques d'évolution (chart1-4,
   marge) — sinon les deux familles de carte ne se répondent plus une fois
   les KPI assombries. */
body.fond-pilotage .chart-card.glass-strong {
  background: linear-gradient(180deg, rgba(33,54,63,0.93), rgba(27,46,54,0.90));
}

/* =====================================================================
   CARTES D'INDICATEUR (.kpi-card)
   ---------------------------------------------------------------------
   Partagées par le dashboard et l'écran de saisie des heures. La règle
   vivait en double dans les <style> des deux pages, et les deux copies
   avaient déjà divergé.

   Une carte déclare sa couleur de série dans --teinte, À PLAT (#0f9c8f),
   jamais en rgba pré-dilué : la bordure, le halo d'angle et l'arête en
   descendent tous les trois par color-mix. Une seule valeur à tenir par
   carte, au lieu d'une par usage.

   Le même indicateur porte la même teinte d'un écran à l'autre — c'est
   ce qui sépare un code couleur d'une décoration :
     #0f9c8f  PO, campagnes            #f2622e  CA, absences
     #10b981  heures                   #a78bfa  fiches, saisies
     #ec4899  taux de transformation

   Défaut = la bordure de carte elle-même. Une carte qui ne mesure rien
   (le pavé « Point de contrôle » de la saisie) garde donc le contour
   commun et n'affiche aucune arête, plutôt que de se voir attribuer une
   couleur qui laisserait croire à une série.
   ===================================================================== */

.kpi-card {
  --teinte: var(--bordure-carte);
  position: relative;
  overflow: hidden;
}
/* Même défaut à spécificité nulle que .glass : une carte d'indicateur posée
   sans .glass-strong à côté (sauvegarde.php) sortait à angles droits, alors
   que son halo d'angle et son arête teintée, eux, supposent un coin arrondi. */
:where(.kpi-card) { border-radius: 18px; }
body.fond-pilotage .kpi-card {
  border-color: color-mix(in srgb, var(--teinte) 34%, var(--bordure-carte));
  box-shadow: 0 18px 40px -18px rgba(6,18,22,0.75),
              inset 0 1px 0 rgba(255,255,255,0.08);
}
.kpi-card::before {
  content: "";
  position: absolute;
  inset: 0;
  opacity: .5;
  background: radial-gradient(140px 90px at 90% -10%,
              color-mix(in srgb, var(--teinte) 35%, transparent), transparent 70%);
  pointer-events: none;
}
/* L'arête : la seule ligne de l'écran où la couleur de série se lit d'un
   coup d'œil, sans avoir à viser la pastille d'icône. Retirée des angles
   pour ne pas dessiner un coin qui contredirait l'arrondi ; z-index 2 car
   les cartes du dashboard portent un sparkline de fond en inset-0. */
.kpi-card::after {
  content: "";
  position: absolute;
  left: 18px; right: 18px; top: 0;
  height: 2px;
  background: linear-gradient(90deg, transparent, var(--teinte), transparent);
  opacity: .85;
  pointer-events: none;
  z-index: 2;
}

/* En clair la carte est blanche sur un fond #edf2f3 : l'ombre portée fait
   tout le travail de séparation (l'inset blanc du sombre n'aurait rien à
   éclairer). La teinte descend d'un cran — à 34 % sur du blanc, le contour
   coloré passait devant le chiffre qu'il entoure. Et le halo d'angle à
   50 % vire à la tache sur du blanc. */
html.light body.fond-pilotage .kpi-card {
  border-color: color-mix(in srgb, var(--teinte) 26%, var(--bordure-carte));
  box-shadow: 0 16px 34px -20px rgba(15,23,42,0.30);
}
html.light .kpi-card::before { opacity: .20; }

/* ---------------------------------------------------------------------
   VARIANTE "TEINTE PLEINE" (.kpi-teinte) — reprise le 15/08/2026 : après
   être passé par un fond neutre sombre, l'avis s'est porté sur ce dégradé
   coloré (léger, pas un aplat) comme fond de référence des cartes KPI.
   S'ajoute à .kpi-card sans le remplacer : saisie_heures.php, qui partage
   .kpi-card, garde son rendu (glass-strong neutre) tant qu'on ne lui pose
   pas cette classe.
   ===================================================================== */
body.fond-pilotage .kpi-card.kpi-teinte {
  background: linear-gradient(160deg,
                color-mix(in srgb, var(--teinte) 30%, #0b1614),
                color-mix(in srgb, var(--teinte) 6%, #0b1614) 65%);
  border-color: color-mix(in srgb, var(--teinte) 42%, transparent);
}
html.light body.fond-pilotage .kpi-card.kpi-teinte {
  background: linear-gradient(160deg,
                color-mix(in srgb, var(--teinte) 18%, #ffffff),
                color-mix(in srgb, var(--teinte) 5%, #ffffff) 65%);
  border-color: color-mix(in srgb, var(--teinte) 38%, transparent);
  color: #12241f;
}
/* Le halo et l'arête redisent déjà la même couleur que le fond plein :
   ici ils n'ajoutent qu'un grain, ils ne portent plus l'identité seuls. */
.kpi-card.kpi-teinte::before { opacity: .12; }
.kpi-card.kpi-teinte::after { opacity: .35; }

/* La pastille d'icône ne peut plus emprunter la teinte de la carte —
   elle y est déjà, partout : sur .kpi-teinte elle passe en blanc
   translucide, qui se détache de n'importe quelle teinte de fond. */
.kpi-card.kpi-teinte .kpi-icon-badge {
  background: rgba(255,255,255,0.16) !important;
  border-color: rgba(255,255,255,0.28) !important;
  color: #fff !important;
}
html.light .kpi-card.kpi-teinte .kpi-icon-badge {
  background: rgba(255,255,255,0.55) !important;
  border-color: rgba(255,255,255,0.75) !important;
  color: #12241f !important;
}

.kpi-card.kpi-teinte .bar-track { background: rgba(0,0,0,0.24); }
html.light .kpi-card.kpi-teinte .bar-track { background: rgba(0,0,0,0.10); }

/* Les étiquettes neutres (text-slate-400/300/500) sont calibrées pour un
   fond gris ardoise, pas pour un fond déjà teinté : trop pâles en clair,
   trop ternes en sombre sur .kpi-teinte, elles reprennent l'encre du
   thème courant, à opacité réduite plutôt qu'un gris qui leur est propre. */
.kpi-card.kpi-teinte .text-slate-400,
.kpi-card.kpi-teinte .text-slate-300,
.kpi-card.kpi-teinte .text-slate-500 { color: rgba(255,255,255,0.72) !important; }
html.light .kpi-card.kpi-teinte .text-slate-400,
html.light .kpi-card.kpi-teinte .text-slate-300,
html.light .kpi-card.kpi-teinte .text-slate-500 { color: rgba(18,36,31,0.66) !important; }

/* Le jeton "Atterrissage · NN%" : un fond blanc translucide qui se lit
   sur n'importe quelle teinte, jamais un aplat de couleur — c'est la
   couleur du TEXTE (classes .text-emerald-400 / .text-amber-400 /
   .text-rose-400 déjà posées par le JS) qui porte le statut. */
.chip-atterrissage {
  display: inline-flex; align-items: center; gap: 5px;
  padding: 4px 10px 4px 8px; border-radius: 999px; font-size: 11px; font-weight: 700;
  background: rgba(255,255,255,0.14); border: 1px solid rgba(255,255,255,0.22);
}
html.light .chip-atterrissage {
  background: rgba(255,255,255,0.68); border-color: rgba(255,255,255,0.85);
  box-shadow: 0 1px 2px rgba(15,23,42,0.08);
}

/* Champs de saisie et listes. La règle
     input, select { background: rgba(255,255,255,0.04); ... }
   était recopiée telle quelle dans 7 pages ; ici elle prend en plus les
   surfaces de la barre de filtres du dashboard, pour qu'un champ ait le
   même poids partout.

   Cases à cocher et boutons radio exclus : leur poser un fond et une
   bordure fait perdre à Chrome le rendu natif (la coche disparaît). Les
   pages référentiels en sont pleines. */
/* `background-color`, surtout PAS le raccourci `background` : celui-ci remet
   aussi `background-image` à `none`. Il effaçait le chevron que `select.seg`
   dessine en image de fond (spécificité 0,1,2 contre 0,1,1 pour un <select>)
   — donc sur TOUS les <select> de l'application en thème sombre (repéré le
   15/09/2026 sur le filtre "Vue" de l'Historique, invisible sans le chevron)
   et le point coloré de priorité de la grille des tâches, où le même défaut
   avait déjà été corrigé le 16/08/2026, mais alors seulement pour la
   variante `html.light` juste en dessous. Un raccourci qui réinitialise huit
   propriétés pour n'en poser qu'une. */
body.fond-pilotage input:not([type="checkbox"]):not([type="radio"]),
body.fond-pilotage select,
body.fond-pilotage textarea {
  background-color: rgba(30, 41, 59, 0.6);
  border: 1px solid rgba(71, 85, 105, 0.4);
  color: #e2e8f0;
}
body.fond-pilotage select option { background: var(--entete-tableau); color: #f1f5f9; }
/* Ces surfaces sont écrites en CSS et non en classes Tailwind : le remappage
   "slate vers blanc" du socle ne les voit pas, il leur faut leur propre
   contrepartie claire. */
html.light body.fond-pilotage input:not([type="checkbox"]):not([type="radio"]),
html.light body.fond-pilotage select,
html.light body.fond-pilotage textarea {
  background-color: #ffffff;
  border-color: rgba(15, 23, 42, 0.16);
  color: #1e293b;
}
html.light body.fond-pilotage select option { background: #ffffff; color: #1e293b; }

/* =====================================================================
   Lisibilité des textes secondaires sur le fond éclairci
   ---------------------------------------------------------------------
   Les utilitaires slate-400/500/600 ont été choisis quand le fond était
   quasi noir. Sur #24434e ils passent sous le seuil : slate-500 (#64748b)
   n'offre plus que 2,2:1, là où un texte de 11 px demande 4,5:1. Les
   libellés d'aide, les en-têtes d'étape et les notes de bas de carte
   devenaient illisibles.

   On remonte la gamme en gardant trois niveaux distincts, pour ne pas
   perdre la hiérarchie au passage. Contrastes obtenus sur #24434e :
   5,9:1 / 5,0:1 / 4,3:1.
   ===================================================================== */
body.fond-pilotage .text-slate-400 { color: #b9c8ce; }
body.fond-pilotage .text-slate-500 { color: #a6b7bf; }
body.fond-pilotage .text-slate-600 { color: #97a9b3; }
body.fond-pilotage { --muted: #b0c1c8; }

/* Le socle ramène déjà ces classes vers du gris foncé en thème clair ;
   les règles ci-dessus étant plus spécifiques, il faut leur redonner la
   main explicitement. */
html.light body.fond-pilotage .text-slate-400 { color: #475569; }
html.light body.fond-pilotage .text-slate-500 { color: #64748b; }
html.light body.fond-pilotage .text-slate-600 { color: #7c8ba1; }
html.light body.fond-pilotage { --muted: #64748b; }

body.fond-pilotage table thead th {
  position: sticky;
  top: 0;
  z-index: 20;
  background-color: var(--entete-tableau);
  box-shadow: 0 1px 0 rgba(148,163,184,0.15);
}
body.fond-pilotage tbody tr { transition: background .15s ease; }
body.fond-pilotage tbody tr:hover { background: rgba(148,163,184,0.06); }

/* Le fond immersif du thème clair.
   ---------------------------------------------------------------------
   Ce bloc ne redéfinissait que "background-color". "background-image"
   n'étant pas touché, les cinq calques écrits pour le fond sombre
   restaient peints par-dessus la base claire — dont
   linear-gradient(rgba(26,48,56,0.18) → 0.34), un voile bleu-ardoise
   foncé. La page annoncée à #eef2f7 s'affichait donc entre #c8cfd5 et
   #a6b0b6, et les halos de marque viraient au rose sale (#d2b1ab) et au
   vert-de-gris (#9bc3c4). C'était ça, le « gris » du thème clair : pas
   une couleur choisie, une couleur claire assombrie de 34 %.

   Le clair a maintenant son propre calque, construit sur le geste
   inverse du sombre : le sombre CREUSE (voile foncé qui descend), le
   clair LÈVE (voile blanc qui s'efface vers le bas).

   Deux points à ne pas « corriger » sans y repenser :
   - le halo brun rgba(94,67,56,…) du thème sombre n'est pas repris. Il
     ne sert qu'à réchauffer un fond foncé ; sur du clair, du brun à
     faible opacité EST la sensation de saleté. Il est remplacé par de
     l'orange de marque.
   - la base reste à #edf2f3 et ne monte pas au blanc cassé : les cartes
     sont blanches (--panel-plein), il leur faut une marche de fond pour
     exister, exactement comme #284350 se détache de #24434e en sombre. */
html.light body.fond-pilotage {
  --panel-plein: #ffffff;
  --panel-opaque: #ffffff;
  --bordure-carte: rgba(15, 23, 42, 0.12);
  /* Plus soutenu que la base : sinon l'en-tête de tableau collant se
     confond avec le fond de page dès qu'on fait défiler. */
  --entete-tableau: #e4ecee;
  /* Sans cette ligne, --bg-soft hérite du générique html.light (#e4ecee,
     ligne ~94) -- exactement la même valeur que --entete-tableau ci-dessus.
     Une colonne "Campagne" censée se détacher du fond devenait alors
     indiscernable de l'en-tête en thème clair (visible sur
     planning_consultation.php / saisie_heures.php, onglet Planning). Un cran
     plus foncé, pas juste répétée. */
  --bg-soft: #d3dee1;
  background-color: #edf2f3;
  background-image:
    radial-gradient(circle at 10% 6%,  rgba(240,82,37,0.10), transparent 48%),
    radial-gradient(circle at 90% 8%,  rgba(15,156,143,0.10), transparent 46%),
    radial-gradient(circle at 78% 92%, rgba(240,82,37,0.06), transparent 50%),
    radial-gradient(circle at 15% 95%, rgba(15,156,143,0.08), transparent 48%),
    linear-gradient(180deg, rgba(255,255,255,0.55), rgba(255,255,255,0));
}
html.light body.fond-pilotage .glass-strong {
  background: linear-gradient(180deg, #ffffff, #f6f9f9);
}
html.light body.fond-pilotage table thead th { box-shadow: 0 1px 0 rgba(15,23,42,0.08); }
html.light body.fond-pilotage tbody tr:hover { background: rgba(15,23,42,0.035); }

/* =====================================================================
   BOUTONS SEGMENTÉS (.gbtn) — Jour/Semaine/Mois, Heures/ETP…
   ---------------------------------------------------------------------
   Venaient aussi de dashboard_sql.php. L'état est porté par
   data-active="true|false", pas par une classe, pour que le JS n'ait
   qu'un attribut à basculer.
   ===================================================================== */

.gbtn {
  position: relative;
  overflow: hidden;
  transition: all .18s ease;
}
/* Même défaut à spécificité nulle que pour .glass ci-dessus : 8px = le
   `rounded-lg` que posent déjà les barres d'onglets, pour qu'un bouton qui
   l'a oublié s'aligne sur ses voisins au lieu de sortir plus rond qu'eux. */
:where(.gbtn) { border-radius: 8px; }
/* Faisceau lumineux qui balaie le bouton — UNIQUEMENT au survol (au repos le
   pseudo-élément reste hors-champ à gauche). Vitesse volontairement modérée
   pour rester élégant façon Liquid Glass. */
.gbtn::before {
  content: '';
  position: absolute;
  top: 0; left: -60%;
  width: 40%; height: 100%;
  background: linear-gradient(120deg, transparent, rgba(255,255,255,0.45), transparent);
  transform: skewX(-20deg);
  transition: left 1.1s ease;
  pointer-events: none;
}
.gbtn:hover::before { left: 130%; }
.gbtn:active { transform: scale(0.96); }
@media (prefers-reduced-motion: reduce) {
  .gbtn::before { transition: none; }
}
.gbtn[data-active="true"] {
  background: linear-gradient(135deg, rgba(242,98,46,0.9), rgba(15,156,143,0.85));
  color: white;
  box-shadow: 0 6px 16px -6px rgba(242,98,46,0.6);
}
.gbtn[data-active="false"] {
  background: rgba(148,163,184,0.08);
  color: #cbd5e1;
}
.gbtn[data-active="false"]:hover { background: rgba(148,163,184,0.16); }

html.light .gbtn[data-active="false"] { background: rgba(15,23,42,0.06); color: #475569; }
html.light .gbtn[data-active="false"]:hover { background: rgba(15,23,42,0.10); }

/* Un bouton segmenté qui porte AUSSI .glass — le cas de toute la barre de
   granularité de planning.php — perdait son état : `body.fond-pilotage .glass`
   (spécificité 0,2,1) l'emporte sur `.gbtn[data-active="true"]` (0,2,0). Le
   bouton actif retombait donc au fond de carte tout en gardant son
   `color: white`, c'est-à-dire blanc sur blanc en thème clair (1,0:1), et
   aucun état visible en sombre. On repasse devant .glass. */
body.fond-pilotage .gbtn[data-active="true"] {
  background: linear-gradient(135deg, rgba(242,98,46,0.9), rgba(15,156,143,0.85));
  color: #fff;
}
body.fond-pilotage .gbtn[data-active="false"] {
  background: rgba(148,163,184,0.08);
  color: #cbd5e1;
}
html.light body.fond-pilotage .gbtn[data-active="false"] {
  background: rgba(15,23,42,0.06);
  color: #475569;
}

/* Marge intérieure par DÉFAUT, même motif `:where()` que les rayons plus haut.
   `.seg` n'avait aucun style de base : chaque page passait le sien en
   utilitaires Tailwind (`pl-3 pr-8 py-2`), et une page qui l'oubliait sortait
   à `padding: 4px 0` — mesuré le 16/08/2026 sur la grille des tâches, texte
   collé au bord gauche et chevron par-dessus le texte à droite.
   Le `pr` généreux n'est pas décoratif : le chevron est une image de fond
   posée à `right .65rem`, il RECOUVRE le texte si rien ne lui réserve la
   place.

   Seul le RAYON est posé ici. La marge intérieure ne peut PAS l'être, et
   c'est mesuré, pas supposé — trois essais successifs :
     - `:where(.seg)` (0,0,0) : sans effet. Le preflight de Tailwind pose
       `select { padding: 0 }`, et un sélecteur de TYPE bat une spécificité
       nulle. Le rayon passe, lui, parce que le preflight n'y touche pas.
     - `select.seg` (0,1,1) : trop fort. Il écrasait les `pl-3 pr-8 py-2` de
       saisie_heures.php et planning_consultation.php, dont les champs ont
       visiblement changé de taille.
     - `select:where(.seg)` (0,0,1) : à égalité avec le preflight, donc perdant
       — Tailwind est injecté APRÈS cette feuille.
   Il n'existe aucun cran entre `select` et une classe : une page qui veut
   cette marge la déclare chez elle, comme le font déjà les quatre autres. */
:where(.seg) { border-radius: 8px; }

/* Chevron des <select> — même dessin sur toutes les pages. */
select.seg {
  appearance: none;
  -webkit-appearance: none;
  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20' fill='%2394a3b8'%3E%3Cpath fill-rule='evenodd' d='M5.23 7.21a.75.75 0 011.06.02L10 11.168l3.71-3.938a.75.75 0 111.08 1.04l-4.24 4.5a.75.75 0 01-1.08 0l-4.24-4.5a.75.75 0 01.02-1.06z' clip-rule='evenodd'/%3E%3C/svg%3E");
  background-repeat: no-repeat;
  background-position: right 0.65rem center;
  background-size: 1.1em;
  color: #e2e8f0;
}
select.seg option { background-color: #223a42; color: #f1f5f9; }
html.light select.seg { color: #1e293b; }
html.light select.seg option { background-color: #ffffff; color: #1e293b; }

/* =====================================================================
   Utilitaires transverses
   ===================================================================== */

.grad-text {
  background: linear-gradient(90deg, var(--accent), var(--accent-2));
  -webkit-background-clip: text;
  background-clip: text;
  color: transparent;
}

.grad-fond {
  background: linear-gradient(90deg, var(--accent), var(--accent-2));
}

/* =====================================================================
   Compatibilité thème clair pour les classes Tailwind "slate"
   ---------------------------------------------------------------------
   Les pages sont écrites avec ~1000 utilitaires slate-* pensés pour le
   fond sombre. Les remapper ici évite de les réécrire un par un.
   Sans effet tant que le thème clair n'est pas activé.

   ponytail: sélecteurs d'attribut volontairement larges, pour attraper
   toutes les variantes d'opacité (bg-slate-800/50, /60, /80…) sans les
   énumérer. Un élément qui devrait rester sombre en thème clair devra
   utiliser une couleur hors palette slate.
   ===================================================================== */

html.light .text-slate-100,
html.light .text-slate-200 { color: #0f172a; }
html.light .text-slate-300 { color: #334155; }
html.light .text-slate-400 { color: #475569; }
html.light .text-slate-500 { color: #64748b; }
html.light .text-slate-600 { color: #7c8ba1; }

/* hover:text-white sur un fond slate (qui devient clair) donnerait du blanc
   sur blanc au survol — une trentaine de boutons concernés. */
html.light .hover\:text-white:hover,
html.light .hover\:text-slate-100:hover,
html.light .hover\:text-slate-200:hover { color: #0f172a !important; }
html.light .hover\:text-slate-300:hover { color: #334155 !important; }

html.light [class*="bg-slate-800"],
html.light [class*="bg-slate-900"] { background-color: rgba(255, 255, 255, 0.85) !important; }
html.light [class*="bg-slate-700"] { background-color: rgba(15, 23, 42, 0.06) !important; }
html.light [class*="hover\:bg-slate-700"]:hover { background-color: rgba(15, 23, 42, 0.10) !important; }
html.light [class*="bg-slate-600"] { background-color: #cbd5e1 !important; }
html.light [class*="bg-slate-500"] { background-color: rgba(100, 116, 139, 0.12) !important; }

html.light [class*="border-slate-500"],
html.light [class*="border-slate-600"],
html.light [class*="border-slate-700"],
html.light [class*="border-slate-800"] { border-color: rgba(15, 23, 42, 0.10) !important; }

html.light [class*="divide-slate-700"] > * + * { border-color: rgba(15, 23, 42, 0.08) !important; }

html.light [class*="bg-white\/5"],
html.light [class*="bg-white\/10"] { background-color: rgba(15, 23, 42, 0.05) !important; }
html.light [class*="border-white\/5"],
html.light [class*="border-white\/10"] { border-color: rgba(15, 23, 42, 0.08) !important; }

/* Repères de projection des cartes KPI : un point et un segment en blanc semi-
   opaque, invisibles dès que le fond passe au clair. Ils portent une
   information (« projection au rythme actuel »), pas une décoration. */
html.light [class*="bg-white\/35"] { background-color: rgba(15, 23, 42, 0.28) !important; }
html.light [class*="bg-white\/85"] { background-color: rgba(15, 23, 42, 0.72) !important; }

/* Couleurs d'état (emerald / rose / red / amber / orange / yellow, nuances
   200 à 400). Choisies pour ressortir sur un fond quasi noir, elles tombent
   entre 1,8:1 et 2,7:1 sur une carte blanche : un « +1 079,7 % » en
   emerald-400 y devient un trait vert pâle qu'on devine au lieu d'un chiffre
   qu'on lit. Même famille de teinte, nuance 700 — le sens (vert = tenu,
   rouge = manqué) est conservé, la lisibilité revient.

   Sélecteurs d'attribut : ils attrapent aussi les variantes d'opacité
   écrites par le dashboard (text-emerald-400/90, text-rose-400/90). */
html.light [class*="text-emerald-300"],
html.light [class*="text-emerald-400"],
html.light [class*="text-emerald2"]   { color: #047857 !important; }
html.light [class*="text-rose-300"],
html.light [class*="text-rose-400"]   { color: #be123c !important; }
html.light [class*="text-red-200"],
html.light [class*="text-red-300"],
html.light [class*="text-red-400"]    { color: #b91c1c !important; }
html.light [class*="text-amber-200"],
html.light [class*="text-amber-300"],
html.light [class*="text-amber-400"]  { color: #b45309 !important; }
html.light [class*="text-orange-300"] { color: #c2410c !important; }
html.light [class*="text-yellow-300"] { color: #a16207 !important; }
html.light [class*="text-teal-300"]   { color: #0f766e !important; }

/* emerald2 (#10b981) est une couleur de REMPLISSAGE de la charte, pas une
   couleur de texte : posée en libellé sur sa propre pastille (bg-emerald2/15
   dans les alertes de planning.php) elle ne tenait que 2,99:1 même en thème
   sombre. On la remonte à --succes, qui est le même vert un cran plus clair. */
body.fond-pilotage [class*="text-emerald2"] { color: #34d399; }

/* La flèche de tri est en text-azure, ce qui suffit sur du blanc (3,4:1) mais
   pas sur le fond d'en-tête de tableau, plus soutenu (2,8:1). */
html.light .sort-arrow { color: #0b6259 !important; }

html.light ::placeholder { color: #94a3b8; }

/* =====================================================================
   Thème clair : composants écrits en CSS dans les pages
   ---------------------------------------------------------------------
   Le remappage "slate vers blanc" ci-dessus ne voit que les classes
   Tailwind. Les pages définissent en plus, dans leur propre <style>, des
   composants dont les couleurs sont écrites à la main pour le fond
   sombre : panneau de filtre, listes prédictives, bandes de mois du
   planning, plein écran… Sur fond blanc, ils restaient noirs, ou pire,
   devenaient invisibles (les voiles en blanc semi-opaque disparaissent
   complètement).

   Ces contreparties sont ici et non dans chaque page parce que les mêmes
   noms de classe sont recopiés d'une page à l'autre (.panneau-filtre et
   .liste-valeurs dans les 4 écrans de référentiels, .ligne-campagne et
   .bande-mois dans les 2 grilles de planning) : une seule copie du
   correctif au lieu de six.

   ponytail: la spécificité est calée juste au-dessus de celle des règles
   de page, qui sont chargées APRÈS cette feuille et gagneraient à égalité.
   D'où le "body.fond-pilotage" sur le survol de ligne, seule règle de page
   à monter à 0,1,2.
   ===================================================================== */

/* --- Voile du tiroir de navigation. Un noir à 50 % sur une interface
       claire donne l'impression que la page a été éteinte. --- */
html.light #sidebarOverlay { background-color: rgba(15, 23, 42, 0.35); }

/* --- Écrans de référentiels (api/dwh_admin_*.php) --- */
html.light .panneau-filtre {
  background: #ffffff;
  border-color: rgba(15, 23, 42, 0.12);
  box-shadow: 0 12px 32px rgba(15, 23, 42, 0.16);
}
html.light .liste-valeurs label { color: #334155; }
html.light .liste-valeurs label:hover { background: rgba(15, 23, 42, 0.05); }
html.light body.fond-pilotage table tr:hover td { background: rgba(15, 23, 42, 0.035); }
html.light .pastille-actif { background: rgba(16, 185, 129, 0.14); color: #047857; }
html.light .pastille-inactif { background: rgba(15, 23, 42, 0.06); color: #475569; }
html.light .badge-inconnue { color: #c2410c; }

/* --- Liste prédictive (référentiels + saisie des heures) --- */
html.light .combo-dropdown { box-shadow: 0 12px 28px rgba(15, 23, 42, 0.18); }
html.light .combo-item-creer { color: #047857; border-top-color: rgba(15, 23, 42, 0.08); }
html.light .combo-item-vide,
html.light .combo-item-compte { color: #64748b; }
html.light .combo-item-action { color: #64748b; }
html.light .combo-item-action:hover { background: rgba(15, 23, 42, 0.08); color: #0f172a; }

/* --- Grilles de planning (consultation + édition) --- */
html.light .tbl-sticky-col { box-shadow: 8px 0 12px -10px rgba(15, 23, 42, 0.35); }
html.light .bande-mois th { border-bottom-color: rgba(15, 23, 42, 0.10); }
html.light .bande-mois th.mois-alt {
  background-image: linear-gradient(rgba(15, 23, 42, .05), rgba(15, 23, 42, .05));
}
html.light .valeur-cellule:hover { outline-color: rgba(15, 23, 42, 0.35); }
/* .ligne-campagne n'est utilisée que par planning_consultation.php, qui porte
   désormais sa propre règle (colonne Campagne = même gris que l'en-tête) --
   ce doublon rendait cette règle-ci invisible/conflictuelle sans y toucher. */
html.light .popup-jour { box-shadow: 0 12px 28px rgba(15, 23, 42, 0.22); }

/* --- Plein écran de la heatmap (planning.php) --- */
html.light .fs-open {
  background: #ffffff;
  box-shadow: 0 20px 60px -10px rgba(15, 23, 42, 0.25), 0 0 0 9999px rgba(15, 23, 42, 0.55);
}
html.light .fs-close-btn {
  background: rgba(255, 255, 255, 0.95);
  border-color: rgba(15, 23, 42, 0.2);
  color: #0f172a;
}
html.light .fs-close-btn:hover { background: #f1f5f9; border-color: rgba(15, 23, 42, 0.35); }
html.light .bar-track { background: rgba(15, 23, 42, 0.10); }
html.light [data-gran][data-active="false"],
html.light [data-sup-gran][data-active="false"] { color: #64748b; }

/* --- Fil d'étapes des assistants de création (nouvelle_campagne.php) --- */
html.light .puce-etape { border-color: rgba(15, 23, 42, 0.18); }
html.light .puce-etape.courante { color: #0d7d73; }
html.light .trait-etape { background: rgba(15, 23, 42, 0.12); }
