:root {
  --bleu: #1f4e79;
  --bleu-clair: #eaf1f8;
  --vert: #1e8a4c;
  --rouge: #c0392b;
  --orange: #d68910;
  --gris: #5a6570;
  --bordure: #dfe4ea;
}
* { box-sizing: border-box; }
body {
  font-family: "Segoe UI", Arial, sans-serif;
  margin: 0;
  background: #f6f8fa;
  color: #1c2530;
}
.entete {
  background: var(--bleu);
  color: white;
  padding: 14px 28px;
  display: flex;
  justify-content: space-between;
  align-items: center;
}
.entete .logo { color: white; font-weight: 600; font-size: 1.1rem; text-decoration: none;
  display: flex; align-items: center; gap: 12px; }
.logo-marque { display: inline-flex; flex: 0 0 auto; filter: drop-shadow(0 1px 2px rgba(0,0,0,0.25)); }
.logo-texte { display: flex; flex-direction: column; line-height: 1.25; }
.logo-texte strong { font-size: 1.15rem; letter-spacing: 0.2px; }
.logo-texte small { font-size: 0.72rem; font-weight: 500; color: rgba(255,255,255,0.75); }
.entete nav a { color: white; margin-left: 20px; text-decoration: none; opacity: 0.9; }
.entete nav a:hover { opacity: 1; text-decoration: underline; }
.contenu { padding: 28px; max-width: 1100px; margin: 0 auto; }
h1 { color: var(--bleu); font-size: 1.4rem; }
h2 { color: var(--bleu); font-size: 1.1rem; margin-top: 28px; }
table { width: 100%; border-collapse: collapse; background: white; border-radius: 6px; overflow: hidden; box-shadow: 0 1px 3px rgba(0,0,0,0.06); }
th, td { padding: 10px 14px; text-align: left; border-bottom: 1px solid var(--bordure); }
th { background: var(--bleu-clair); color: var(--bleu); font-size: 0.85rem; text-transform: uppercase; }
tr:hover td { background: #fafbfc; }
a.bouton, button.bouton {
  display: inline-block; background: var(--bleu); color: white; padding: 10px 18px;
  border-radius: 5px; text-decoration: none; border: none; cursor: pointer; font-size: 0.95rem;
}
a.bouton:hover, button.bouton:hover { background: #163a5c; }
.carte {
  background: white; border-radius: 8px; padding: 20px; margin-bottom: 18px;
  box-shadow: 0 1px 3px rgba(0,0,0,0.06);
}
.grille-kpi { display: grid; grid-template-columns: repeat(auto-fit, minmax(160px, 1fr)); gap: 14px; margin-bottom: 20px; }
.kpi { background: white; border-radius: 8px; padding: 16px; text-align: center; box-shadow: 0 1px 3px rgba(0,0,0,0.06); }
.kpi .valeur { font-size: 1.6rem; font-weight: 700; color: var(--bleu); }
.kpi .label { font-size: 0.8rem; color: var(--gris); text-transform: uppercase; }
.badge { padding: 3px 10px; border-radius: 12px; font-size: 0.8rem; font-weight: 600; }
.badge.ok { background: #e3f6e9; color: var(--vert); }
.badge.non { background: #fdecea; color: var(--rouge); }
.alerte { background: #fff3cd; border: 1px solid #ffe08a; padding: 12px 16px; border-radius: 6px; margin-bottom: 16px; }
input[type=file], input[type=text], select {
  padding: 8px; border: 1px solid var(--bordure); border-radius: 5px; width: 100%; margin-bottom: 14px;
}
label { font-weight: 600; font-size: 0.9rem; display: block; margin-bottom: 4px; }

/* ---------- Barre de menu avec contexte ---------- */
.entete { display: block; padding: 0; }
.entete-haut {
  display: flex; justify-content: space-between; align-items: center;
  padding: 12px 28px; border-bottom: 1px solid rgba(255,255,255,0.18);
}
.entete nav { padding: 8px 28px; display: flex; flex-wrap: wrap; gap: 4px; align-items: center; }
.entete nav a {
  margin: 0; padding: 6px 12px; border-radius: 4px; font-size: 0.92rem;
}
.entete nav a:hover { background: rgba(255,255,255,0.14); text-decoration: none; }
.entete-controles { display: flex; align-items: center; gap: 16px; }
.selecteur-contexte { display: flex; align-items: center; gap: 10px; margin: 0; }
.selecteur-contexte .region {
  background: rgba(255,255,255,0.2); padding: 4px 12px; border-radius: 12px;
  font-size: 0.82rem; font-weight: 600; letter-spacing: 0.5px;
}
.selecteur-contexte select {
  margin: 0; width: auto; min-width: 230px; padding: 6px 10px;
  border: none; border-radius: 5px; font-size: 0.9rem;
}

/* Raccourcis réduits à leur pictogramme : consultés en un clic, jamais au
   quotidien — inutile de leur donner la même place qu'un onglet du menu. */
.outils-rapides { display: flex; align-items: center; gap: 6px;
  padding-left: 16px; border-left: 1px solid rgba(255,255,255,0.25); }
.outils-rapides a { display: inline-flex; text-decoration: none; border-radius: 50%; }
.outils-rapides a:hover .pastille-nav, .outils-rapides a.actif .pastille-nav {
  box-shadow: 0 0 0 2px rgba(255,255,255,0.7);
}

/* ---------- Calendriers ---------- */
.calendriers { display: grid; grid-template-columns: repeat(auto-fill, minmax(250px, 1fr)); gap: 16px; }
.mois-bloc { background: white; border-radius: 8px; padding: 12px; box-shadow: 0 1px 3px rgba(0,0,0,0.06); }
.mois-bloc h3 { margin: 0 0 8px; font-size: 0.95rem; color: var(--bleu); text-align: center; }
table.calendrier { box-shadow: none; border-radius: 0; }
table.calendrier th, table.calendrier td {
  padding: 0; text-align: center; border: 1px solid #eef1f4;
  font-size: 0.78rem; height: 26px; width: 14.28%; background: white;
}
table.calendrier th { background: #f4f7fa; color: var(--gris); text-transform: none; font-size: 0.72rem; }
table.calendrier td.hors-mois { background: #fbfcfd; color: #cfd6dd; }
table.calendrier td.weekend { background: #f7f9fb; color: #9aa5b1; }
table.calendrier td.cp-valide { background: #2e7d32; color: white; font-weight: 600; }
table.calendrier td.cp-simule { background: #a5d6a7; color: #1b5e20; font-weight: 600; }
table.calendrier td.alerte-seuil { background: #ffcdd2; color: #b71c1c; font-weight: 700; }
table.calendrier td.evenement { background: #1565c0; color: white; font-weight: 600; }
table.calendrier td.emi-prevu { background: #f9a825; color: #4e342e; font-weight: 600; }
table.calendrier td.emi-realise { background: #6a1b9a; color: white; font-weight: 600; }
table.calendrier td.ferie { background: #eceff1; color: #78909c; }

.legende { display: flex; flex-wrap: wrap; gap: 14px; margin: 12px 0 20px; font-size: 0.85rem; }
.legende span { display: flex; align-items: center; gap: 6px; }
.pastille { width: 14px; height: 14px; border-radius: 3px; display: inline-block; border: 1px solid rgba(0,0,0,0.08); }

/* ---------- Grilles de saisie / visualisation ---------- */
.pastille-niveau {
  display: inline-block; padding: 3px 12px; border-radius: 12px;
  font-size: 0.82rem; font-weight: 600; color: white; min-width: 68px; text-align: center;
}
.niv-rouge { background: #c62828; }
.niv-bleu { background: #1565c0; }
.niv-vert { background: #2e7d32; }
.niv-jaune { background: #f9a825; color: #4e342e; }
.niv-violet { background: #6a1b9a; }
.niv-inconnu { background: #cfd8dc; color: #546e7a; }

.jauge { background: #eceff1; border-radius: 10px; height: 16px; overflow: hidden; min-width: 90px; }
.jauge > div { height: 100%; background: var(--bleu); }
.jauge.verte > div { background: var(--vert); }
.jauge.rouge > div { background: var(--rouge); }

/* Avancement EMI : une ligne compacte par technicien, repliable. */
.carte-avancement-emi summary { cursor: pointer; font-weight: 600; color: var(--bleu);
  list-style: none; padding: 2px 0; }
.carte-avancement-emi summary::-webkit-details-marker { display: none; }
.carte-avancement-emi summary::before { content: "▸ "; }
.carte-avancement-emi[open] summary::before { content: "▾ "; }

/* Compteurs CP : repliable, correction manuelle sur une seule ligne. */
.carte-compteurs-cp summary { cursor: pointer; font-weight: 600; color: var(--bleu);
  list-style: none; padding: 2px 0; }
.carte-compteurs-cp summary::-webkit-details-marker { display: none; }
.carte-compteurs-cp summary::before { content: "▸ "; }
.carte-compteurs-cp[open] summary::before { content: "▾ "; }
.carte-compteurs-cp table { margin-top: 12px; }
td.actions .saisie-ajustement-cp { display: flex; flex-wrap: nowrap; gap: 5px; align-items: center; margin: 0; }
td.actions .saisie-ajustement-cp input[type=number] { width: 64px; min-width: 0; margin: 0; padding: 4px 6px; font-size: 0.82rem; }
td.actions .saisie-ajustement-cp input[type=text] { width: 110px; min-width: 0; margin: 0; padding: 4px 6px; font-size: 0.82rem; }
.liste-avancement-emi { display: flex; flex-direction: column; gap: 8px; margin-top: 12px; }
.ligne-avancement-emi { display: grid; align-items: center; gap: 12px;
  grid-template-columns: 160px 1fr 150px auto auto;
  padding: 6px 10px; border-radius: 6px; background: #fafbfc; }
.ligne-avancement-emi:nth-child(odd) { background: #f4f6f8; }
.avancement-nom { font-weight: 600; font-size: 0.88rem; }
.avancement-jauge { display: flex; align-items: center; gap: 8px; }
.avancement-jauge .jauge { flex: 1 1 auto; min-width: 60px; }
.avancement-jauge .aide { white-space: nowrap; }
.avancement-prochain { font-size: 0.85rem; white-space: nowrap; }
.avancement-actions { display: flex; align-items: center; gap: 4px; }
.avancement-lien { font-size: 0.85rem; white-space: nowrap; }

td.cellule-saisie { padding: 4px; }
td.cellule-saisie input { margin: 0; width: 62px; padding: 5px; text-align: center; }
.tableau-compact th, .tableau-compact td { padding: 7px 10px; font-size: 0.88rem; }
.manquant { color: var(--rouge); font-style: italic; }

/* ---------- Paramètres, sauvegardes, rapprochements, écarts ---------- */
.aide { color: var(--gris); font-size: 0.84rem; margin: 4px 0; display: block; }
.ligne-filtre { display: flex; flex-wrap: wrap; align-items: center; gap: 10px; margin: 0; }
.ligne-filtre label { margin: 0; }
.ligne-filtre input, .ligne-filtre select { margin: 0; width: auto; min-width: 180px; }
.grille-champs {
  display: grid; grid-template-columns: repeat(auto-fit, minmax(190px, 1fr));
  gap: 12px; margin: 12px 0;
}
.grille-champs input { margin-bottom: 2px; }
.parametre-entete { display: flex; align-items: center; flex-wrap: wrap; gap: 12px; }
.parametre-entete h3 { margin: 0; font-size: 1rem; color: var(--bleu); }
.badge.attention { background: #fff3cd; color: #8a6100; }
.badge.neutre { background: #eceff1; color: var(--gris); }
.lien-discret {
  background: none; border: none; color: var(--gris); font-size: 0.84rem;
  text-decoration: underline; cursor: pointer; padding: 0;
}
.lien-discret:hover { color: var(--bleu); }
td.actions form { display: flex; flex-wrap: wrap; align-items: center; gap: 6px; margin-bottom: 6px; }
td.actions input, td.actions select { margin: 0; width: auto; min-width: 130px; }
.bandeau-succes { border-left: 5px solid var(--vert); }
.bandeau-info { border-left: 5px solid var(--bleu); }
.bandeau-attention { border-left: 5px solid var(--orange); }
td.ecart-ok { background: #eefaf1; }
td.ecart-attention { background: #fff8e1; }
td.ecart-alerte { background: #fdecea; font-weight: 600; }
td.ecart-inconnu { color: var(--gris); }

/* ---------- Pilotage & support d'entretien ---------- */
.entete-entretien { display: flex; justify-content: space-between; align-items: flex-end; flex-wrap: wrap; gap: 12px; }
.entete-entretien h1 { margin-bottom: 2px; }
.liste-alertes { margin: 0; padding-left: 18px; font-size: 0.88rem; }
.liste-leviers { margin: 0; padding-left: 18px; line-height: 1.7; }
.liste-leviers .levier-atteint { color: var(--vert); }
.grille-tendances { display: flex; flex-wrap: wrap; justify-content: center; gap: 12px; }
.tendance { flex: 1 1 190px; max-width: 260px; text-align: center;
  background: white; border-radius: 8px; padding: 14px; box-shadow: 0 1px 3px rgba(0,0,0,0.06); border-left: 4px solid var(--bordure); }
.tendance .label { font-size: 0.78rem; color: var(--gris); text-transform: uppercase; }
.tendance .valeur { font-size: 1.35rem; font-weight: 700; color: var(--bleu); }
.tendance-favorable { border-left-color: var(--vert); }
.tendance-defavorable { border-left-color: var(--rouge); }
.tendance-neutre { border-left-color: var(--bordure); }
td.colonne-courante { background: var(--bleu-clair); font-weight: 600; }
.deux-colonnes { display: grid; grid-template-columns: repeat(auto-fit, minmax(260px, 1fr)); gap: 14px; }
textarea { width: 100%; padding: 8px; border: 1px solid var(--bordure); border-radius: 5px;
           margin-bottom: 14px; font-family: inherit; font-size: 0.95rem; }
input[type=number], input[type=date] { padding: 8px; border: 1px solid var(--bordure); border-radius: 5px; }

@media print {
  .entete, .sans-impression, .alerte { display: none !important; }
  .contenu { padding: 0; max-width: none; }
  .carte, .kpi, .tendance, table { box-shadow: none; border: 1px solid #ccc; }
  h2 { page-break-after: avoid; }
  table { page-break-inside: avoid; }
  textarea { border: 1px solid #ccc; min-height: 60px; }
}

/* ---------- Saisie manuelle : compacité et repérage ---------- */
.bouton-petit { padding: 4px 10px; font-size: 0.8rem; }
.sommaire-techniciens { display: flex; flex-wrap: wrap; gap: 10px; align-items: center; padding: 12px 20px; }
.sommaire-techniciens a { font-size: 0.85rem; color: var(--bleu); text-decoration: none;
  background: var(--bleu-clair); padding: 3px 10px; border-radius: 12px; }
.sommaire-techniciens a:hover { background: #d8e6f4; }
.tableau-saisie input { margin: 0; padding: 5px 6px; font-size: 0.86rem; }
.tableau-saisie input[type=date] { width: 140px; }
.tableau-saisie input[type=number] { width: 82px; }
.tableau-saisie td { padding: 5px 8px; }

/* ---------- Cockpit technicien ---------- */
.entete-cockpit { display: flex; justify-content: space-between; align-items: flex-end;
  flex-wrap: wrap; gap: 14px; margin-bottom: 18px; }
.entete-cockpit h1 { margin: 0 0 2px; }
.chiffre-cle { font-size: 2rem; font-weight: 700; color: var(--bleu); line-height: 1.1; }

.carte-bonus { border-left: 5px solid var(--bordure); }
.carte-bonus.bonus-atteint { border-left-color: var(--vert); }
.carte-bonus.bonus-en-cours { border-left-color: var(--orange); }
.bonus-entete { display: flex; align-items: center; gap: 12px; flex-wrap: wrap; margin-bottom: 14px; }
.bonus-corps { display: grid; grid-template-columns: repeat(auto-fit, minmax(230px, 1fr)); gap: 22px; }
.kpi-projection { border: 1px dashed var(--bleu); }
.kpi-projection .valeur { color: var(--gris); }
.grille-groupes { display: grid; grid-template-columns: repeat(auto-fit, minmax(320px, 1fr)); gap: 16px; }

/* Curseur d'efficacité */
.curseur { margin: 10px 0 18px; }
.curseur-piste { position: relative; height: 16px; border-radius: 8px; overflow: hidden;
  background: #eceff1; }
.curseur-zone { position: absolute; top: 0; height: 100%; }
.zone-basse { left: 0; background: #fdecea; }
.zone-moyenne { background: #fff3cd; }
.zone-haute { background: #e3f6e9; }
.curseur-seuil { position: absolute; top: 0; width: 2px; height: 100%; background: var(--gris); opacity: .55; }
.curseur-repere { position: absolute; top: -3px; width: 4px; height: 22px; border-radius: 2px;
  background: var(--bleu); transform: translateX(-2px); box-shadow: 0 0 0 2px white; }
.curseur-valeur { font-size: 1.5rem; font-weight: 700; color: var(--bleu); margin-top: 8px; }
.curseur-echelle { position: relative; height: 14px; font-size: 0.72rem; color: var(--gris); }
.curseur-echelle span { position: absolute; transform: translateX(-50%); }

/* Graphique de production */
.graphique { background: white; border-radius: 8px; padding: 16px 16px 10px;
  box-shadow: 0 1px 3px rgba(0,0,0,0.06); }
.graphique-svg { width: 100%; display: block; }
.graphique-axe { display: flex; margin-top: 2px; }
.graphique-axe span { flex: 1; text-align: center; font-size: 0.62rem; color: var(--gris); }
.graphique-axe span.week-end { color: #c3cbd3; }
tfoot td { background: var(--bleu-clair); font-weight: 600; }

/* ---------- Support d'entretien : visualisations ---------- */
.sparkline { width: 100%; height: 30px; display: block; }
.barres-h { display: flex; flex-direction: column; gap: 7px; }
.barre-h { display: grid; grid-template-columns: minmax(120px, 34%) 1fr 42px; gap: 10px; align-items: center; }
.barre-h-libelle { font-size: 0.86rem; }
.barre-h-piste { background: #eceff1; border-radius: 4px; height: 16px; overflow: hidden; }
.barre-h-valeur { height: 100%; border-radius: 4px; min-width: 2px; }
.barre-h-nombre { font-weight: 700; font-size: 0.9rem; text-align: right; }

.barres-mois { display: flex; gap: 10px; align-items: flex-end; justify-content: center; }
.barre-mois-unite { font-size: 0.72rem; font-weight: 600; margin-left: 2px; color: var(--gris); }
.barre-mois { flex: 1; text-align: center; }
.barre-mois-zone { display: flex; align-items: flex-end; background: #f4f7fa; border-radius: 5px; }
.barre-mois-remplissage { width: 100%; border-radius: 5px; min-height: 2px; transition: height .2s; }
.barre-mois-valeur { font-weight: 700; font-size: 0.9rem; color: var(--bleu); margin-top: 4px; }
.barre-mois-label { font-size: 0.72rem; color: var(--gris); }

.bloc-titre { display: flex; align-items: baseline; gap: 12px; flex-wrap: wrap; }
.bloc-titre h2 { margin: 0; }
.grille-blocs { display: grid; grid-template-columns: repeat(auto-fit, minmax(300px, 1fr)); gap: 16px; }
/* Variante centrée : rangée incomplète recentrée plutôt qu'alignée à gauche. */
.grille-centree { display: flex; flex-wrap: wrap; justify-content: center; gap: 16px; }
.grille-centree > .carte { flex: 1 1 300px; max-width: 380px; margin-bottom: 0; }
.carte-qualite { border-left: 5px solid var(--rouge); }
.carte-bte { border-left: 5px solid #1565c0; }
.carte-battitude { border-left: 5px solid #6a1b9a; }
.carte-leadmobile { border-left: 5px solid var(--vert); }
.ligne-chiffres { display: flex; gap: 26px; flex-wrap: wrap; align-items: baseline; margin: 6px 0 12px; }
.ligne-chiffres .bloc-chiffre .valeur { font-size: 1.7rem; font-weight: 700; color: var(--bleu); line-height: 1.1; }
.ligne-chiffres .bloc-chiffre .label { font-size: 0.76rem; color: var(--gris); text-transform: uppercase; }
.historique-entretiens li { margin-bottom: 6px; }

/* ---------- Entretien : évolutions, alertes, debrief ---------- */
/* Flex plutôt que grille : la dernière rangée, souvent incomplète, reste
   centrée au lieu de laisser un trou à droite. */
.grille-evolutions { display: flex; flex-wrap: wrap; justify-content: center; gap: 12px; }
.carte-evolution { flex: 1 1 215px; max-width: 300px; padding: 12px 14px 10px; margin-bottom: 0;
  text-align: center; }
.evolution-titre { font-size: 0.78rem; color: var(--gris); text-transform: uppercase;
  font-weight: 600; margin-bottom: 8px; letter-spacing: .2px; }

/* Bandeaux d'alerte (anomalies, véhicule) */
.carte-alerte { border-left: 6px solid var(--bordure); }
.carte-alerte.niveau-ok { border-left-color: var(--vert); background: #f7fdf9; }
.carte-alerte.niveau-attention { border-left-color: var(--orange); background: #fffdf5; }
.carte-alerte.niveau-alerte { border-left-color: var(--rouge); background: #fef8f7; }
.carte-alerte.niveau-inconnu { border-left-color: var(--bordure); }
.alerte-entete { display: flex; align-items: center; gap: 18px; flex-wrap: wrap; margin-bottom: 14px; }
.alerte-pastille { width: 42px; height: 42px; border-radius: 50%; display: flex;
  align-items: center; justify-content: center; font-size: 1.4rem; font-weight: 800;
  color: white; background: var(--gris); flex: none; }
.niveau-ok .alerte-pastille { background: var(--vert); }
.niveau-attention .alerte-pastille { background: var(--orange); }
.niveau-alerte .alerte-pastille { background: var(--rouge); }
.alerte-chiffre { font-size: 2rem; font-weight: 800; line-height: 1; color: var(--bleu); }
.niveau-alerte .alerte-chiffre { color: var(--rouge); }
.niveau-attention .alerte-chiffre { color: var(--orange); }
.alerte-message { flex: 1; min-width: 240px; font-size: 0.92rem; }

/* Trimestres de contrôle véhicule */
.trimestres { display: flex; gap: 10px; margin: 6px 0 4px; }
.trimestre { flex: 1; text-align: center; border-radius: 6px; padding: 8px 4px;
  background: #f4f7fa; border: 2px solid transparent; }
.trimestre.fait { background: #e3f6e9; color: var(--vert); }
.trimestre.manque { background: #fdecea; color: var(--rouge); }
.trimestre.vide { color: #b6c0c9; }
.trimestre.courant { border-color: var(--bleu); }
.trimestre-nom { font-size: 0.72rem; text-transform: uppercase; font-weight: 600; }
.trimestre-etat { font-size: 1.25rem; font-weight: 800; }

/* Intensité des tendances */
.tendance.intensite-marquee { border-left-width: 6px; }
.tendance.intensite-forte { border-left-width: 8px; }
.tendance-favorable.intensite-marquee { background: #f7fdf9; }
.tendance-favorable.intensite-forte { background: #eefaf1; }
.tendance-defavorable.intensite-marquee { background: #fef8f7; }
.tendance-defavorable.intensite-forte { background: #fdecea; }
.tendance-defavorable.intensite-forte .valeur { color: var(--rouge); }
.tendance-favorable.intensite-forte .valeur { color: var(--vert); }

/* Debrief mis en valeur */
.bandeau-debrief { background: var(--bleu); color: white; border-radius: 8px 8px 0 0;
  padding: 16px 22px; margin-top: 28px; }
.bandeau-debrief h2 { color: white; margin: 0 0 4px; }
.bandeau-debrief p { margin: 0; font-size: 0.9rem; opacity: .92; }
.carte-debrief { border-radius: 0 0 8px 8px; margin-top: 0;
  border: 2px solid var(--bleu); border-top: none; }
@media print { .bandeau-debrief { background: white; color: var(--bleu);
  border: 1px solid #ccc; border-bottom: none; } }

/* ---------- Compteur à aiguille ---------- */
.compteur { text-align: center; }
.compteur-svg { width: 100%; max-width: 250px; height: auto; display: block; margin: 0 auto; }
.compteur-valeur { font-size: 1.8rem; font-weight: 800; color: var(--bleu); margin: 2px 0 6px; }
.compteur-palier { display: inline-block; font-size: 0.76rem; font-weight: 700;
  text-transform: uppercase; letter-spacing: .3px; padding: 3px 12px; border-radius: 12px; }
.palier-maximum { background: #e3f6e9; color: var(--vert); }
.palier-intermediaire { background: #fff3cd; color: #8a6100; }
.palier-sous-seuil { background: #fdecea; color: var(--rouge); }

/* ---------- Cartes de synthèse du mois ---------- */
.grille-synthese { display: flex; flex-wrap: wrap; justify-content: center; gap: 14px; }
.carte-synthese { flex: 1 1 265px; max-width: 340px; margin-bottom: 0;
  padding: 18px 18px 12px; text-align: center;
  display: flex; flex-direction: column; justify-content: space-between; }
.carte-synthese .synthese-principal { font-size: 2.4rem; font-weight: 800; color: var(--bleu); line-height: 1; }
.carte-synthese > .label { font-size: 0.78rem; color: var(--gris); text-transform: uppercase;
  font-weight: 600; letter-spacing: .2px; margin-top: 4px; }
.synthese-decompose { display: flex; justify-content: center; gap: 20px; margin: 10px 0 6px;
  align-items: baseline; min-height: 26px; }
.synthese-decompose .chiffre { font-size: 1.25rem; font-weight: 700; color: var(--bleu); margin-right: 5px; }
.synthese-decompose .chiffre.vert { color: var(--vert); }
.synthese-decompose .chiffre.rouge { color: var(--rouge); }
.synthese-decompose .label { font-size: 0.72rem; color: var(--gris); text-transform: uppercase; }

/* Bonus mois par mois */
.bonus-mois { display: flex; gap: 10px; }
.bonus-mois-case { flex: 1; text-align: center; border-radius: 6px; padding: 8px 2px; background: #f4f7fa; }
.bonus-mois-case.atteint { background: #e3f6e9; color: var(--vert); }
.bonus-mois-case.rate { background: #fdecea; color: var(--rouge); }
.bonus-mois-case.vide { color: #b6c0c9; }
.bonus-mois-etat { font-size: 1.3rem; font-weight: 800; line-height: 1.1; }
.bonus-mois-valeur { font-size: 0.85rem; font-weight: 700; }

/* =====================================================================
   Icônes et boutons secondaires
   ===================================================================== */
.icone { vertical-align: -0.18em; flex: none; }
a.bouton.secondaire, button.bouton.secondaire {
  background: white; color: var(--bleu); border: 1px solid var(--bleu); }
a.bouton.secondaire:hover, button.bouton.secondaire:hover { background: var(--bleu-clair); }

/* =====================================================================
   Écran Techniciens : cartes et carte d'identité
   ===================================================================== */
.grille-fiches { display: flex; flex-wrap: wrap; justify-content: center; gap: 16px; }
.fiche-tech { flex: 1 1 300px; max-width: 360px; margin-bottom: 0; padding: 18px; }
.fiche-entete { display: flex; align-items: center; gap: 12px; }
.avatar { width: 44px; height: 44px; border-radius: 50%; background: var(--bleu-clair);
  color: var(--bleu); font-weight: 800; display: flex; align-items: center;
  justify-content: center; flex: none; letter-spacing: .5px; }
.fiche-nom { font-weight: 700; font-size: 1.05rem; color: var(--bleu); line-height: 1.2; }
.fiche-sous-titre { font-size: 0.82rem; color: var(--gris); display: flex; gap: 8px;
  align-items: center; flex-wrap: wrap; margin-top: 2px; }
.puce-gps { display: inline-flex; align-items: center; gap: 3px; background: var(--bleu-clair);
  color: var(--bleu); border-radius: 11px; padding: 1px 8px; font-weight: 600; font-size: 0.76rem; }
.fiche-etiquettes { display: flex; flex-wrap: wrap; gap: 6px; margin: 12px 0; }
.etiquette { display: inline-flex; align-items: center; gap: 5px; background: #f2f5f8;
  color: #3d4854; border-radius: 12px; padding: 3px 10px; font-size: 0.76rem; font-weight: 600; }
.etiquette.manquante { background: #fdecea; color: var(--rouge); }
.etiquette.anniversaire { background: #f3e8fa; color: #6a1b9a; }
.fiche-actions { display: flex; gap: 8px; flex-wrap: wrap; }
.fiche-actions .bouton { padding: 7px 12px; font-size: 0.85rem; }
.fiche-details { margin-top: 14px; border-top: 1px solid var(--bordure); padding-top: 10px; }
.fiche-details summary { cursor: pointer; font-weight: 600; color: var(--bleu);
  font-size: 0.88rem; display: flex; align-items: center; gap: 6px; list-style: none; }
.fiche-details summary::-webkit-details-marker { display: none; }
.fiche-details summary::after { content: "▾"; margin-left: auto; color: var(--gris); }
.fiche-details[open] summary::after { content: "▴"; }
.fiche-liste { margin: 10px 0 0; display: grid; grid-template-columns:repeat(2,minmax(0,1fr));gap:7px 12px;padding:10px;border-radius:10px;background:#f7f9fb; }
.fiche-liste div { min-width:0; }
.fiche-liste dt { color: var(--gris); font-size: 0.78rem; text-transform: uppercase; font-weight: 600; }
.fiche-liste dd { margin: 0; font-size: 0.9rem; }
.fiche-liste dd .aide { display: block; }
.fiche-saisie { margin-top: 10px; display: grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:8px 10px;padding-top:10px;border-top:1px dashed var(--bordure); }
.fiche-saisie>div{min-width:0}.fiche-saisie label{font-size:.76rem;margin-bottom:3px}.fiche-saisie input,.fiche-saisie select { margin-bottom: 0;padding:7px 8px;min-height:36px; }
.fiche-saisie>button{grid-column:1/-1;justify-self:end;margin-top:2px}
.case-nacelliste { display: flex; align-items: center; gap: 8px; font-weight: 600;
  font-size: 0.9rem; margin-bottom: 0; cursor: pointer; }
.case-nacelliste input { width: auto; margin: 0; }
@media(max-width:430px){.fiche-liste,.fiche-saisie{grid-template-columns:1fr}}

/* Règle commune anti-superposition : tout champ reste dans sa colonne. */
form[class]>*{min-width:0}
form[class] input:not([type="checkbox"]):not([type="radio"]),form[class] select,form[class] textarea{width:100%;max-width:100%;min-width:0}
.grille-champs>*,.fiche-saisie>*,.formulaire-evolution>*{min-width:0}
.fiche-saisie .case-nacelliste{min-height:36px;align-self:end;padding:7px 2px}
.fiche-saisie .case-nacelliste input{width:auto;flex:none}
.choix-outlook{max-width:760px;margin:7vh auto;text-align:center;padding:34px}.choix-outlook-actions{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:16px;margin-top:24px}.choix-outlook-carte{display:grid;justify-items:center;gap:8px;padding:24px 18px;border:1px solid var(--bordure);border-radius:15px;background:#f8fafb;color:#29485a;text-decoration:none}.choix-outlook-carte.principal{background:#edf6f8;border-color:#8db7c8;color:#174c66}.choix-outlook-carte:hover{transform:translateY(-2px);box-shadow:0 8px 20px rgba(30,64,82,.12)}.choix-outlook-carte span{font-size:.82rem;color:#617783}
.comparaison-equipes-table .equipe-selectionnee td{background:#edf6f8}.comparaison-equipes-table .jeton{margin-left:7px}
.controle-equipes ul{margin:10px 0 0;padding-left:20px}.controle-equipes li{margin:5px 0}
@media(max-width:650px){.choix-outlook-actions{grid-template-columns:1fr}.fiche-tech{max-width:100%}}

/* Filtres horizontaux, regroupés par libellé pour ne jamais se croiser. */
.entete-cockpit>form.ligne-filtre{display:flex;flex-flow:row wrap;align-items:flex-end;gap:10px 12px;max-width:100%}
.filtre-champ{display:flex;flex-direction:column;gap:3px;min-width:150px;flex:0 1 210px}
.filtre-champ label{font-size:.76rem;color:var(--gris);margin:0}.filtre-champ select,.filtre-champ input{width:100%!important;min-width:0!important;margin:0}

/* Planning présentiel : date, heure et action restent alignées et visibles. */
.ligne-presentiel{grid-template-columns:minmax(170px,1fr) minmax(330px,430px) auto;align-items:center}
.presentiel-saisie{display:grid;grid-template-columns:minmax(145px,1fr) 105px 88px;gap:7px;width:100%;min-width:0}
.presentiel-saisie input{width:100%!important;min-width:0!important}.presentiel-saisie .bouton{width:88px;min-width:88px;padding-left:8px;padding-right:8px}

/* Avancement annuel compact dans le coin de la synthèse Parc auto. */
.avancement-parc .avancement-entete{padding-right:145px}.camembert-parc{position:absolute;right:18px;top:14px;margin:0;padding:0;border:0;gap:10px}.camembert-parc .camembert-generique{width:76px;height:76px}.camembert-parc .camembert-generique:after{inset:17px}.camembert-parc .camembert-generique span{font-size:.82rem}.camembert-parc .legende-camembert{font-size:.68rem;gap:3px}.camembert-parc .legende-camembert strong{font-size:.72rem}
@media(max-width:850px){.ligne-presentiel{grid-template-columns:1fr}.presentiel-saisie{grid-template-columns:minmax(130px,1fr) 100px 88px}.avancement-parc .avancement-entete{padding-right:0}.camembert-parc{position:static;justify-content:flex-start;margin:12px 0}.entete-cockpit>form.ligne-filtre{width:100%}}
textarea { padding: 8px; border: 1px solid var(--bordure); border-radius: 5px;
  width: 100%; margin-bottom: 14px; font-family: inherit; font-size: 0.92rem; }
.grille-champs .champ-large { grid-column: 1 / -1; }
.grille-champs textarea { margin-bottom: 2px; }

/* =====================================================================
   Impression du support d'entretien sur UNE page

   Le support est fait pour être lu à l'écran ; sur papier, il doit tenir
   d'un seul tenant, sinon il est illisible en entretien. On ne supprime
   aucune information chiffrée : on réduit l'échelle, on resserre les
   grilles et on retire ce qui n'a de sens qu'à l'écran (formulaires,
   sélecteurs, historique consultable en ligne).
   ===================================================================== */
@media print {
  @page { size: A4 portrait; margin: 6mm; }

  body.impression-une-page { zoom: 0.34; }
  body.impression-une-page .contenu { padding: 0; }
  body.impression-une-page h1 { font-size: 1.9rem; margin: 0 0 2px; }
  body.impression-une-page h2 { font-size: 1.25rem; margin: 14px 0 6px; }
  body.impression-une-page .carte { padding: 12px; margin-bottom: 10px; }

  /* Ce qui n'a de sens qu'à l'écran. Le formulaire de debrief, lui, RESTE
     imprimé : son contenu est le compte rendu de l'entretien. */
  body.impression-une-page form.sans-impression,
  body.impression-une-page .saisie-ecran,
  body.impression-une-page details:not([open]),
  body.impression-une-page .historique-entretiens,
  body.impression-une-page .bloc-sans-papier { display: none !important; }

  /* Grilles resserrées : plus de colonnes, moins de hauteur */
  body.impression-une-page .grille-synthese,
  body.impression-une-page .grille-tendances,
  body.impression-une-page .grille-evolutions,
  body.impression-une-page .grille-centree { justify-content: flex-start; gap: 8px; }
  body.impression-une-page .carte-synthese { flex: 0 0 calc(16.66% - 8px); max-width: none; }
  body.impression-une-page .carte-evolution { flex: 0 0 calc(16.66% - 8px); max-width: none; }
  body.impression-une-page .grille-centree > .carte { flex: 0 0 calc(33.33% - 8px); max-width: none; }
  body.impression-une-page .tendance { flex: 0 0 calc(16.66% - 8px); max-width: none; padding: 8px; }
  body.impression-une-page .compteur-svg { max-width: 210px; }

  /* Les mini-graphiques répétés dans les blocs BTE, B-Attitude, LeadMobile et
     anomalies redisent ce que montre déjà la section « Évolution sur 3 mois » :
     sur papier, ils coûtent une page pour rien. */
  body.impression-une-page .carte-qualite .barres-mois,
  body.impression-une-page .carte-bte .barres-mois,
  body.impression-une-page .carte-battitude .barres-mois,
  body.impression-une-page .carte-leadmobile .barres-mois,
  body.impression-une-page .carte-alerte .barres-mois,
  body.impression-une-page .carte-synthese .sparkline { display: none !important; }
  body.impression-une-page textarea { min-height: 26px; }
  body.impression-une-page .grille-blocs { gap: 8px; }
  body.impression-une-page .bandeau-debrief { padding: 8px 14px; }
  body.impression-une-page .carte-debrief { padding: 8px 12px; }
  /* Le bloc de debrief est le dernier : s'il ne tient pas d'un bloc, mieux vaut
     le laisser se répartir que le rejeter entier sur une seconde page. */
  body.impression-une-page .carte-debrief { break-inside: auto; page-break-inside: auto; }

  /* Rien ne doit être coupé au milieu */
  body.impression-une-page .carte,
  body.impression-une-page .tendance,
  body.impression-une-page .carte-alerte { break-inside: avoid; page-break-inside: avoid; }
}
.ligne-identite { display: flex; align-items: center; gap: 10px; flex-wrap: wrap; }
.cellule-levier { min-width: 150px; }
.cellule-levier .aide { font-size: 0.76rem; }

/* =====================================================================
   Écran Pilotage : dense, lisible, sans défilement inutile
   ===================================================================== */
.bandeau-kpi { display: flex; flex-wrap: wrap; gap: 10px; margin: 16px 0 22px; }
.kpi-compact { flex: 1 1 120px; background: white; border-radius: 8px; padding: 10px 14px;
  box-shadow: 0 1px 3px rgba(0,0,0,0.06); text-align: center; }
.kpi-compact .valeur { display: block; font-size: 1.35rem; font-weight: 800; color: var(--bleu); line-height: 1.1; }
.kpi-compact .label { display: flex; align-items: center; justify-content: center; gap: 4px;
  font-size: 0.72rem; color: var(--gris); text-transform: uppercase; font-weight: 600; margin-top: 3px; }
.kpi-compact.gain { background: #eefaf1; }
.kpi-compact.gain .valeur { color: var(--vert); }

.deux-colonnes { display: grid; grid-template-columns: repeat(auto-fit, minmax(400px, 1fr)); gap: 22px; }
.deux-colonnes h2 { margin-top: 0; display: flex; align-items: center; gap: 7px; }

/* Priorités d'accompagnement : l'échelle de couleur est le message */
.liste-priorites { display: grid; gap: 8px; }
.priorite { display: grid; grid-template-columns: 1fr auto auto; gap: 14px; align-items: center;
  background: white; border-radius: 8px; padding: 11px 14px; text-decoration: none;
  color: inherit; box-shadow: 0 1px 3px rgba(0,0,0,0.06); border-left: 6px solid var(--bordure); }
.priorite:hover { background: #fafbfc; }
.priorite-nom { font-weight: 700; color: var(--bleu); }
.priorite-chiffre { font-size: 0.86rem; text-align: right; }
.priorite-gain { font-weight: 800; color: var(--vert); text-align: right; min-width: 92px; }
.priorite .aide { font-size: 0.74rem; }
.gain-fort { border-left-color: #1e8a4c; background: #f2fbf5; }
.gain-moyen { border-left-color: #d68910; background: #fffaf0; }
.gain-faible { border-left-color: #b0bcc7; }

.liste-alertes-compacte { display: grid; gap: 8px; }
.carte-alerte-tech { margin-bottom: 0; padding: 12px 14px; border-left: 4px solid var(--orange); }
.alerte-entete { display: flex; justify-content: space-between; align-items: center; gap: 10px; }
.alerte-entete a { font-weight: 700; color: var(--bleu); text-decoration: none; }
.carte-alerte-tech .liste-alertes { margin: 6px 0 0; padding-left: 18px; font-size: 0.84rem; }

/* Vue complète : une tuile par technicien plutôt qu'un tableau de douze colonnes */
.grille-equipe { display: grid; grid-template-columns: repeat(auto-fill, minmax(250px, 1fr)); gap: 12px; }
.tuile-tech { display: block; background: white; border-radius: 8px; padding: 12px 14px;
  text-decoration: none; color: inherit; box-shadow: 0 1px 3px rgba(0,0,0,0.06);
  border-top: 4px solid var(--bordure); }
.tuile-tech:hover { box-shadow: 0 2px 8px rgba(0,0,0,0.12); }
.tuile-tech.niveau-haut { border-top-color: var(--vert); }
.tuile-tech.niveau-moyen { border-top-color: var(--orange); }
.tuile-tech.niveau-bas { border-top-color: var(--rouge); }
.tuile-nom { font-weight: 700; color: var(--bleu); font-size: 0.94rem; margin-bottom: 8px; }
.tuile-principal { display: flex; justify-content: space-between; gap: 6px; text-align: center; }
.tuile-valeur { font-size: 1.15rem; font-weight: 800; color: var(--bleu); line-height: 1.1; }
.tuile-valeur small { font-size: 0.7rem; font-weight: 600; margin-left: 1px; }
.tuile-label { font-size: 0.68rem; color: var(--gris); text-transform: uppercase; }
.tuile-pieds { display: flex; flex-wrap: wrap; gap: 4px; margin-top: 10px; }
.jeton { background: #f2f5f8; color: #3d4854; border-radius: 10px; padding: 2px 8px;
  font-size: 0.72rem; font-weight: 600; }
.jeton.vert { background: #e3f6e9; color: var(--vert); }
.jeton.orange { background: #fff3cd; color: #8a6100; }
.jeton.rouge { background: #fdecea; color: var(--rouge); }

/* ---------- Simulateur ---------- */
.barre-simulateur { display: flex; flex-wrap: wrap; gap: 14px; align-items: end; }
.barre-simulateur > div { flex: 1 1 140px; }
.barre-simulateur label { display: flex; align-items: center; gap: 5px; }
.barre-simulateur input, .barre-simulateur select { margin-bottom: 0; width: 100%; }
.barre-simulateur .bouton { flex: 0 0 auto; }
.grille-simulation { display: grid; grid-template-columns: repeat(auto-fit, minmax(280px, 1fr)); gap: 14px; }
.carte-simulation { margin-bottom: 0; }
.simulation-titre { display: flex; align-items: center; gap: 6px; font-size: 0.78rem;
  color: var(--gris); text-transform: uppercase; font-weight: 700; letter-spacing: .2px; }
.simulation-avant-apres { display: flex; align-items: center; justify-content: space-between;
  gap: 10px; margin: 12px 0 6px; text-align: center; }
.simulation-avant-apres .valeur { display: block; font-size: 1.45rem; font-weight: 800; color: #6b7681; }
.simulation-avant-apres .valeur.accent { color: var(--bleu); }
.simulation-avant-apres .valeur.vert { color: var(--vert); }
.simulation-avant-apres .valeur.rouge { color: var(--rouge); }
.simulation-avant-apres .label { font-size: 0.72rem; color: var(--gris); text-transform: uppercase; }
.simulation-avant-apres .fleche { color: var(--gris); font-size: 1.2rem; }
.simulation-note { font-size: 0.86rem; border-top: 1px solid var(--bordure); padding-top: 8px; }
.carte-satcli { border-left: 5px solid #2e7d32; }

/* =====================================================================
   Congés : frise de période, filtres alignés, saisie large
   ===================================================================== */
.barre-filtres { align-items: end; gap: 14px; }
.barre-filtres > div { display: flex; flex-direction: column; gap: 3px; }
.barre-filtres label { margin: 0; font-size: 0.78rem; color: var(--gris);
  text-transform: uppercase; font-weight: 600; }
.barre-filtres select, .barre-filtres input { margin: 0; min-width: 150px; }

/* Tableaux plus larges que l'écran : on fait défiler la zone, jamais la page. */
.bande-defilante { overflow-x: auto; padding: 14px; }
.colonne-fixe { position: sticky; left: 0; background: white; z-index: 2;
  box-shadow: 1px 0 0 var(--bordure); white-space: nowrap; }
thead .colonne-fixe { background: var(--bleu-clair); }

table.frise { min-width: max-content; }
table.frise th { padding: 4px 3px; font-size: 0.66rem; text-align: center; }
table.frise td.case-frise { padding: 0; width: 20px; height: 22px; text-align: center;
  font-size: 0.68rem; font-weight: 700; color: #3d4854; background: #f4f7fa;
  border: 1px solid #eef1f4; }
.frise-basse { background: #e8f2fb !important; }
.frise-moyenne { background: #ffe9a8 !important; }
.frise-haute { background: #ffc98a !important; }
.frise-alerte { background: #ef9a9a !important; color: #7f1d1d !important; }

.tableau-saisie .max-semaine { color: var(--gris); font-weight: 600; }
.colonne-ferie { background: #f1f4f6 !important; }
/* Roulement : un jour non travaillé doit se distinguer d'un jour travaillé
   d'un simple coup d'œil, sans avoir à survoler la case. Fond marqué et
   hachures diagonales — la couleur seule ne suffit pas à l'impression ni pour
   un œil qui distingue mal les nuances de gris. */
table.calendrier td.non-travaille {
  background-color: #c9d4de; color: #6b7b8a; font-weight: 400;
  background-image: repeating-linear-gradient(135deg,
    rgba(255,255,255,.55) 0 3px, rgba(255,255,255,0) 3px 6px);
}
table.calendrier td.weekend { background: #e4eaef; color: #90a0ae; }
table.calendrier td.ferie {
  background-color: #b9c6d2; color: #2f3d4a; font-weight: 800;
  background-image: repeating-linear-gradient(45deg,
    rgba(255,255,255,.5) 0 4px, rgba(255,255,255,0) 4px 8px);
}
/* Un jour travaillé reste franchement blanc : c'est le contraste qui informe. */
table.calendrier td { background: white; }
table.frise td.colonne-fixe { padding: 2px 10px; font-size: 0.8rem; }

/* ---------- Planning : couleurs par type d'événement ---------- */
table.calendrier td.evenement.type-reunion { background: #1565c0; }
table.calendrier td.evenement.type-deplacement { background: #00838f; }
table.calendrier td.evenement.type-visite_terrain { background: #2e7d32; }
table.calendrier td.evenement.type-formation { background: #5e35b1; }
table.calendrier td.evenement.type-autre { background: #5a6570; }
.jeton-type { color: white; border-radius: 10px; padding: 2px 9px;
  font-size: 0.74rem; font-weight: 600; }

.titre-mode { display: flex; align-items: center; gap: 7px; color: var(--bleu);
  font-size: 1rem; margin: 0 0 10px; }
.titre-mode.terrain { color: #2e7d32; }
.titre-mode.presentiel { color: #1565c0; }
.compteur-mode { background: #eceff1; color: #3d4854; border-radius: 11px;
  padding: 1px 9px; font-size: 0.8rem; }
.liste-assignations { list-style: none; margin: 0; padding: 0; display: grid; gap: 4px; }
.liste-assignations li { display: flex; justify-content: space-between; align-items: center;
  gap: 10px; padding: 4px 0; border-bottom: 1px solid #f0f3f6; }
.liste-assignations label { display: flex; align-items: center; gap: 8px; margin: 0;
  font-weight: 500; cursor: pointer; }
.liste-assignations input[type=checkbox] { width: auto; margin: 0; }
.assignation-nom { font-weight: 600; }
.assignation-info { font-size: 0.78rem; color: var(--gris); text-align: right; }

/* =====================================================================
   Parc automobile : cartes, anneau d'avancement, saisie sans superposition
   ===================================================================== */
.grille-vehicules { display: grid; grid-template-columns: repeat(auto-fill, minmax(290px, 1fr)); gap: 14px; }
.carte-vehicule { margin-bottom: 0; padding: 15px; border-left: 5px solid var(--bordure); }
.carte-vehicule.etat-complet { border-left-color: var(--vert); }
.carte-vehicule.etat-en-cours { border-left-color: var(--orange); }
.carte-vehicule.etat-aucun { border-left-color: var(--rouge); }
.carte-vehicule.etat-sans-vehicule { border-left-color: #b0bcc7; background: #fbfcfd; }
.vehicule-entete { display: flex; justify-content: space-between; align-items: center; gap: 10px; }
.vehicule-tech { font-weight: 700; color: var(--bleu); font-size: 0.95rem; }
.vehicule-plaque { font-family: "Consolas", monospace; font-size: 1.05rem; font-weight: 700;
  letter-spacing: 1px; margin-top: 2px; }
.vehicule-details { display: flex; flex-wrap: wrap; gap: 5px; margin: 10px 0; }

/* Anneau d'avancement : la part réalisée se lit d'un coup d'œil. */
.anneau { width: 52px; height: 52px; border-radius: 50%; display: flex; flex: none;
  align-items: center; justify-content: center; font-size: 0.78rem; font-weight: 800;
  color: var(--bleu);
  background: conic-gradient(var(--vert) calc(var(--part) * 1%), #e8edf2 0); }
.anneau span { width: 38px; height: 38px; border-radius: 50%; background: white;
  display: flex; align-items: center; justify-content: center; }

.trimestres-parc { display: grid; grid-template-columns: repeat(4, 1fr); gap: 6px; }
.trimestres-parc form { margin: 0; }
.case-trimestre { width: 100%; border: 1px solid var(--bordure); border-radius: 6px;
  padding: 6px 2px; cursor: pointer; display: flex; flex-direction: column;
  align-items: center; gap: 2px; font-family: inherit; }
.case-trimestre.fait { background: #e3f6e9; border-color: #b5e3c7; color: var(--vert); }
.case-trimestre.a-faire { background: #fbfcfd; color: var(--gris); }
.case-trimestre:hover { border-color: var(--bleu); }
.trimestre-nom { font-size: 0.72rem; font-weight: 700; text-transform: uppercase; }
.trimestre-etat { font-size: 1rem; font-weight: 800; }

.attribution summary { cursor: pointer; color: var(--bleu); font-weight: 600;
  font-size: 0.86rem; display: flex; align-items: center; gap: 6px; }
/* Grille : les champs ne se chevauchent plus, chacun a sa colonne et son libellé. */
.formulaire-vehicule { display: grid; grid-template-columns: repeat(auto-fit, minmax(140px, 1fr));
  gap: 10px; align-items: end; margin-top: 12px; }
.formulaire-vehicule.en-ligne { grid-template-columns: repeat(auto-fit, minmax(160px, 1fr)); }
.formulaire-vehicule > div { display: flex; flex-direction: column; gap: 3px; }
.formulaire-vehicule label { margin: 0; font-size: 0.76rem; color: var(--gris);
  text-transform: uppercase; font-weight: 600; }
.formulaire-vehicule input, .formulaire-vehicule select { margin: 0; width: 100%; }
.formulaire-vehicule .bouton { align-self: end; }

/* =====================================================================
   Support envoyé en pièce jointe : un document, plus une application

   Le destinataire reçoit la page telle qu'elle est à l'écran, sans les
   éléments qui n'ont de sens que dans l'application : menu, sélecteurs,
   boutons d'action. Les zones de saisie deviennent du texte encadré.
   ===================================================================== */
body.document-autonome .entete,
body.document-autonome form.sans-impression,
body.document-autonome .saisie-ecran,
body.document-autonome .commentaire-battitude button,
body.document-autonome .alerte { display: none !important; }
body.document-autonome .contenu { max-width: none; }
body.document-autonome textarea,
body.document-autonome input { border: 1px solid var(--bordure); background: #fbfcfd; }
body.document-autonome button { display: none !important; }
.evolution-titre { display: flex; align-items: center; justify-content: center; gap: 5px; }
h2 .icone, h3 .icone { vertical-align: -0.15em; }

/* ---------- Bandeau de roulement — repliable dès qu'il est calé ---------- */
.carte-roulement { border-left: 5px solid var(--bleu); }
.carte-roulement > summary { cursor: pointer; display: flex; flex-wrap: wrap;
  align-items: center; gap: 10px; list-style: none; }
.carte-roulement > summary::-webkit-details-marker { display: none; }
.carte-roulement > summary::before { content: "▸ "; color: var(--gris); }
.carte-roulement[open] > summary::before { content: "▾ "; }
.roulement-corps { display: flex; flex-wrap: wrap; gap: 20px; align-items: flex-end;
  justify-content: space-between; margin-top: 14px; }
.roulement-titre { display: flex; align-items: center; gap: 7px; font-weight: 700;
  color: var(--bleu); }
.roulement-semaines { display: flex; flex-wrap: wrap; gap: 8px; }
.roulement-semaine { background: #f2f5f8; border-radius: 12px; padding: 3px 11px;
  font-size: 0.8rem; color: #3d4854; }
.roulement-semaine strong { color: var(--bleu); margin-right: 4px; }
.roulement-semaine.courante { background: var(--bleu-clair); box-shadow: inset 0 0 0 1px var(--bleu); }

/* ---------- Planning : entretiens distingués par mode et par état ---------- */
table.calendrier td.emi-presentiel-prevu { background: #f9a825; color: #4e342e; font-weight: 600; }
table.calendrier td.emi-presentiel-realise { background: #6a1b9a; color: white; font-weight: 600; }
table.calendrier td.emi-terrain-prevu { background: #4dd0a5; color: #06402c; font-weight: 600; }
table.calendrier td.emi-terrain-realise { background: #00695c; color: white; font-weight: 600; }

.legende-compacte { gap: 10px; font-size: 0.78rem; margin: 10px 0 14px; }
.ligne-actions-planning { padding: 14px 18px; }
.bloc-date-visite { padding-bottom: 12px; margin-bottom: 10px; border-bottom: 1px solid var(--bordure); }

.liste-presentiel { padding: 8px 14px; }
.ligne-presentiel { display: grid; grid-template-columns: 1fr auto auto; gap: 12px;
  align-items: center; padding: 8px 0; border-bottom: 1px solid #f0f3f6; }
.ligne-presentiel:last-child { border-bottom: none; }
.ligne-presentiel.planifie { background: #f7fbf8; }
.presentiel-nom strong { font-size: 0.92rem; }
.presentiel-saisie { display: flex; gap: 6px; align-items: center; margin: 0; }
.presentiel-saisie input { margin: 0; width: auto; padding: 5px 7px; font-size: 0.84rem; }

/* ---------- Parc auto : listes complétables sur place ---------- */
.grille-listes { display: grid; grid-template-columns: repeat(auto-fit, minmax(220px, 1fr)); gap: 14px; }
.bloc-liste { background: #fbfcfd; border: 1px solid var(--bordure); border-radius: 8px; padding: 12px; }
.bloc-liste-titre { display: flex; align-items: center; justify-content: space-between;
  font-weight: 700; color: var(--bleu); font-size: 0.9rem; margin-bottom: 8px; }
.valeurs-liste { display: flex; flex-wrap: wrap; gap: 5px; margin-bottom: 10px; }
.ajout-liste { display: flex; gap: 6px; }
.ajout-liste input { margin: 0; }
.saisie-immatriculation { font-family: "Consolas", monospace; letter-spacing: 1px;
  text-transform: uppercase; }

/* =====================================================================
   Écran Paramètres : navigable, hiérarchisé, adapté au type de réglage
   ===================================================================== */
.sommaire-parametres { display: grid; grid-template-columns: repeat(auto-fit, minmax(220px, 1fr));
  gap: 14px; background: white; border-radius: 8px; padding: 16px 18px;
  box-shadow: 0 1px 3px rgba(0,0,0,0.06); margin-bottom: 26px; }
.sommaire-theme { display: flex; flex-direction: column; gap: 3px; }
.sommaire-titre { font-size: 0.72rem; text-transform: uppercase; letter-spacing: .4px;
  color: var(--gris); font-weight: 700; margin-bottom: 4px; }
.sommaire-parametres a { display: flex; align-items: center; gap: 6px; color: var(--bleu);
  text-decoration: none; font-size: 0.87rem; padding: 3px 6px; border-radius: 4px; }
.sommaire-parametres a:hover { background: var(--bleu-clair); }
.sommaire-parametres a.incomplet { color: #8a6100; }
.pastille-nombre { margin-left: auto; background: #fff3cd; color: #8a6100;
  border-radius: 9px; padding: 0 7px; font-size: 0.72rem; font-weight: 700; }

.titre-theme { font-size: 0.8rem; text-transform: uppercase; letter-spacing: .6px;
  color: var(--gris); border-bottom: 1px solid var(--bordure); padding-bottom: 6px;
  margin-top: 34px; }
.groupe-parametres { margin-bottom: 26px; scroll-margin-top: 20px; }
.groupe-entete { display: flex; align-items: center; gap: 12px; margin: 16px 0 4px; }
.groupe-entete h3 { display: flex; align-items: center; gap: 7px; margin: 0;
  color: var(--bleu); font-size: 1.05rem; }
.parametre h4 { margin: 0; font-size: 0.95rem; color: #1c2530; }
.parametre.a-definir { border-left: 4px solid var(--orange); }
.parametre-actions { display: flex; flex-wrap: wrap; align-items: center; gap: 16px; }
.options-datees summary { cursor: pointer; color: var(--gris); font-size: 0.84rem;
  text-decoration: underline; }
.options-datees .grille-champs { margin-top: 8px; }
.facultatif { font-weight: 500; font-size: 0.72rem; color: var(--gris);
  text-transform: none; letter-spacing: 0; margin-left: 5px; }
.navigation-mois { display: flex; align-items: end; gap: 6px; }
.navigation-mois .bouton { padding: 7px 11px; line-height: 1.1; }

/* ---------- Plan de tournée ---------- */
table.plan-tournee th { padding: 5px 4px; }
table.plan-tournee td.case-tournee { width: 34px; height: 26px; text-align: center;
  padding: 0; font-size: 0.74rem; font-weight: 800; border: 1px solid #eef1f4; }
table.plan-tournee td.case-tournee.bureau { background: #f6f8fa; }
table.plan-tournee td.case-tournee.terrain { background: #2e7d32; color: white; }
table.plan-tournee td.case-tournee.fige { box-shadow: inset 0 0 0 2px #6a1b9a; }
table.plan-tournee td.case-tournee.total { background: var(--bleu-clair); color: var(--bleu); }
table.plan-tournee td.colonne-total, table.plan-tournee th.colonne-total {
  text-align: center; font-size: 0.78rem; white-space: nowrap; padding: 2px 10px; }

/* ---------- Parc auto : avancement sur l'effectif ---------- */
.avancement-parc { padding: 16px 18px; }
.avancement-entete { display: flex; flex-wrap: wrap; gap: 10px; align-items: baseline;
  justify-content: space-between; margin-bottom: 12px; }
.avancement-entete h3 { margin: 0; display: flex; align-items: center; gap: 7px;
  color: var(--bleu); font-size: 1rem; }
.grille-trimestres { display: grid; grid-template-columns: repeat(auto-fit, minmax(170px, 1fr)); gap: 14px; }
.trimestre-avancement { background: #fbfcfd; border: 1px solid var(--bordure);
  border-radius: 8px; padding: 10px 12px; }
.trimestre-avancement.courant { border-color: var(--bleu); background: var(--bleu-clair); }
.trimestre-entete { display: flex; justify-content: space-between; align-items: baseline;
  margin-bottom: 6px; }
.trimestre-libelle { font-weight: 700; color: var(--bleu); display: flex; align-items: center; gap: 6px; }
.trimestre-chiffre { font-weight: 700; font-size: 0.9rem; }
.trimestre-reste { font-size: 0.78rem; color: var(--gris); margin-top: 6px; }

/* ---------- Anniversaire du jour ---------- */
.bandeau-anniversaire { border-left: 5px solid #6a1b9a; background: #faf5fe;
  display: flex; flex-wrap: wrap; align-items: center; gap: 18px; }
.anniversaire-titre { display: flex; align-items: center; gap: 8px; font-weight: 700;
  color: #6a1b9a; }
.anniversaire-liste { display: flex; flex-wrap: wrap; gap: 12px; }
.anniversaire-liste a { display: flex; align-items: center; gap: 8px; text-decoration: none;
  color: inherit; background: white; border-radius: 20px; padding: 4px 12px 4px 4px;
  box-shadow: 0 1px 3px rgba(0,0,0,0.08); }
.anniversaire-liste .avatar { width: 30px; height: 30px; font-size: 0.76rem;
  background: #f3e8fa; color: #6a1b9a; }
.etiquette.anniversaire.aujourdhui { background: #6a1b9a; color: white; }
.barre-outils-techniciens { display: flex; flex-wrap: wrap; gap: 14px; align-items: center;
  justify-content: space-between; margin-bottom: 12px; }
.barre-outils-techniciens form { margin: 0; }

/* =====================================================================
   Navigation et filtres qui suivent le défilement

   Sur des écrans qui font plusieurs hauteurs de fenêtre (un an de
   calendrier, cinquante-cinq fiches), remonter pour changer d'équipe ou
   de mois casse le fil. Le menu et la barre de filtres restent donc
   accessibles — discrets, compacts, sans masquer le contenu.
   ===================================================================== */
.entete { position: sticky; top: 0; z-index: 40;
  box-shadow: 0 2px 6px rgba(0,0,0,0.12); }
/* Le menu se resserre dès qu'on défile : moins de hauteur perdue. */
.entete nav { padding: 5px 28px; }
.entete-haut { padding: 9px 28px; }

/* Barre de filtres de l'écran : collée juste sous le menu. */
.entete-cockpit { position: sticky; top: 92px; z-index: 30;
  background: #f6f8fa; padding: 10px 0 8px; margin-bottom: 6px;
  border-bottom: 1px solid transparent; }
.entete-cockpit.detachee { border-bottom-color: var(--bordure); }

/* Un titre de section reste lisible quand on l'atteint par un lien. */
h2, h3, section { scroll-margin-top: 150px; }

.retour-haut { position: fixed; right: 18px; bottom: 14px; z-index: 851;
  width: 42px; height: 42px; border-radius: 50%; border: none; cursor: pointer;
  background: rgba(31, 78, 121, 0.82); color: white; font-size: 0.95rem;
  box-shadow: 0 2px 8px rgba(0,0,0,0.25); opacity: .75; transition: opacity .15s; }
.retour-haut:hover { opacity: 1; }

@media print {
  .entete-cockpit { position: static; }
  .retour-haut { display: none !important; }
}
.pastille-hachuree { background: #ccd5dd;
  background-image: repeating-linear-gradient(45deg,
    rgba(255,255,255,.55) 0 3px, rgba(255,255,255,0) 3px 6px); }

/* ---------- Plan de tournée : rotation terrain sur plusieurs mois ---------- */
table.frise-tournee th { padding: 4px 3px; font-size: 0.7rem; }
table.frise-tournee td.case-tournee { width: 26px; height: 24px; padding: 0;
  border: 1px solid #eef1f4; background: #fbfcfd; }
table.frise-tournee td.case-tournee.mode-terrain { background: #2e7d32; }
table.frise-tournee td.case-tournee.mode-terrain-impose { background: #2e7d32;
  box-shadow: inset 0 0 0 2px var(--orange); }
table.frise-tournee td.total-tournee { text-align: center; font-weight: 700;
  color: var(--bleu); }
table.frise-tournee td.case-total { text-align: center; font-size: 0.74rem;
  font-weight: 700; color: var(--gris); background: #f4f7fa; }
table.frise-tournee tfoot td { border-top: 2px solid var(--bordure); }

/* ---------- Effectif : règles repliées, mouvement en tiroir par ligne ---------- */
.carte-regles-effectif summary { cursor: pointer; color: var(--bleu); list-style: none; }
.carte-regles-effectif summary::-webkit-details-marker { display: none; }
.carte-regles-effectif summary::before { content: "▸ "; }
.carte-regles-effectif[open] summary::before { content: "▾ "; }
.carte-regles-effectif ul { margin: 12px 0 8px; padding-left: 20px; }
.tableau-effectif td, .tableau-effectif th { vertical-align: top; }
.cellule-equipe-effectif form.ligne-filtre { margin-bottom: 4px; }
.cellule-equipe-effectif select { min-width: 150px; }
.mouvement-effectif summary { cursor: pointer; color: var(--bleu); font-size: 0.85rem;
  white-space: nowrap; list-style: none; }
.mouvement-effectif summary::-webkit-details-marker { display: none; }
.mouvement-effectif summary::before { content: "▸ "; }
.mouvement-effectif[open] summary::before { content: "▾ "; }
td.actions .grille-mouvement-effectif { display: grid; flex-wrap: nowrap; gap: 8px;
  margin-top: 10px; min-width: 210px; }
td.actions .grille-mouvement-effectif select, td.actions .grille-mouvement-effectif input { min-width: 0; }

/* ---------- Filière métier ---------- */
.kpi-niveau { display: flex; flex-direction: column; align-items: center; gap: 3px; }
.kpi-niveau .pastille-niveau { min-width: 58px; font-size: 0.72rem; padding: 2px 8px; }
.evolution { font-weight: 700; font-size: 0.72rem; }
.evolution.hausse { color: var(--vert); }
.evolution.baisse { color: var(--rouge); }
.tableau-filiere th.colonne-actuelle, .tableau-filiere td.colonne-actuelle {
  background: var(--bleu-clair); }
.tableau-filiere th small { display: block; font-weight: 500; text-transform: none;
  font-size: 0.68rem; opacity: .8; }
.tableau-filiere td, .tableau-filiere th { padding: 5px 8px; }
/* `td.actions form` (générique, plus loin dans la feuille) impose flex-wrap et
   des champs larges qui renvoient le bouton OK sous la ligne dès que la
   colonne est un peu étroite — on regagne la main ici avec un sélecteur plus
   spécifique, sur une seule ligne. */
td.actions .saisie-filiere { display: flex; flex-wrap: nowrap; gap: 5px;
  align-items: center; margin: 0; }
td.actions .saisie-filiere select { margin: 0; width: auto; min-width: 0; padding: 4px 6px;
  font-size: 0.82rem; }

/* ---------- Écarts : analyse plutôt que tableau brut ---------- */
.bandeau-conclusion p:first-child { font-size: 1rem; margin-top: 0; }
.liste-analyses { display: grid; gap: 10px; }
.carte-analyse { margin-bottom: 0; border-left: 5px solid var(--bordure); padding: 14px 18px; }
.carte-analyse.niveau-alerte { border-left-color: var(--rouge); background: #fffafa; }
.carte-analyse.niveau-attention { border-left-color: var(--orange); background: #fffdf7; }
.carte-analyse.niveau-info { border-left-color: var(--bleu); }
.carte-analyse.niveau-succes { border-left-color: var(--vert); background: #f8fdfa; }
.analyse-titre { display: flex; align-items: center; gap: 7px; font-weight: 700;
  color: var(--bleu); margin-bottom: 5px; }
.analyse-constat { margin: 0 0 4px; font-size: 0.92rem; }
.analyse-action { display: flex; align-items: baseline; gap: 6px; margin: 8px 0 0;
  font-size: 0.86rem; color: #1c2530; background: #f4f7fa; border-radius: 6px;
  padding: 7px 10px; }

.grille-indicateurs { display: grid; grid-template-columns: repeat(auto-fit, minmax(240px, 1fr)); gap: 12px; }
.carte-indicateur { margin-bottom: 0; padding: 14px; border-top: 4px solid var(--bordure); }
.carte-indicateur.niveau-alerte { border-top-color: var(--rouge); }
.carte-indicateur.niveau-attention { border-top-color: var(--orange); }
.carte-indicateur.niveau-ok { border-top-color: var(--vert); }
.indicateur-titre { display: flex; align-items: center; justify-content: space-between;
  gap: 8px; font-weight: 700; color: var(--bleu); font-size: 0.9rem; }
.indicateur-chiffre { font-size: 1.5rem; font-weight: 800; color: var(--bleu); margin: 6px 0 2px; }
.indicateur-chiffre small { font-size: 0.7rem; font-weight: 600; color: var(--gris); }
.indicateur-detail { font-size: 0.8rem; color: #3d4854; }

/* =====================================================================
   ÉCRANS LARGES

   Certains écrans ne servent pas à lire mais à organiser : un semestre de
   calendrier, une rotation sur douze mois, une saisie sur cinquante-cinq
   techniciens. Les 1100 px confortables pour un texte y deviennent une
   contrainte. Ces écrans occupent donc toute la largeur disponible.
   ===================================================================== */
body.page-large .contenu { max-width: none; }

/* ---------------------------------------------------------------------
   Calendrier en bande : tous les mois sur UNE ligne

   Lire le temps de gauche à droite, sans saut de rangée : c'est ce qui
   permet de repérer d'un coup d'œil une semaine chargée ou un creux. La
   bande défile horizontalement (molette, glissement tactile, ou les deux
   flèches), la page ne défile jamais latéralement.
   --------------------------------------------------------------------- */
.cadre-bande-calendrier { display: flex; align-items: stretch; gap: 8px;
  margin-bottom: 20px; }
.calendriers.en-bande {
  display: flex; flex-wrap: nowrap; gap: 12px;
  flex: 1 1 auto; min-width: 0;
  overflow-x: auto; overflow-y: hidden;
  padding: 2px 2px 12px;
  scroll-snap-type: x proximity;
}
.calendriers.en-bande .mois-bloc { flex: 0 0 224px; scroll-snap-align: start; }
/* Une barre de défilement visible : sans elle, rien ne dit qu'il y a une
   suite à droite. */
.calendriers.en-bande::-webkit-scrollbar { height: 10px; }
.calendriers.en-bande::-webkit-scrollbar-track { background: #eef2f6; border-radius: 6px; }
.calendriers.en-bande::-webkit-scrollbar-thumb { background: #c2ccd6; border-radius: 6px; }
.calendriers.en-bande::-webkit-scrollbar-thumb:hover { background: #a9b6c3; }
.calendriers.en-bande { scrollbar-color: #c2ccd6 #eef2f6; scrollbar-width: thin; }

.fleche-bande { flex: 0 0 auto; align-self: center;
  width: 32px; height: 90px; padding: 0;
  border: 1px solid var(--bordure); background: white; border-radius: 8px;
  color: var(--bleu); font-size: 0.9rem; cursor: pointer;
  box-shadow: 0 1px 3px rgba(0,0,0,0.06); }
.fleche-bande:hover:not(:disabled) { background: var(--bleu-clair); }
.fleche-bande:disabled { opacity: 0.28; cursor: default; }

/* ---------------------------------------------------------------------
   Navigation par mois : les flèches encadrent la liste

   Reculer à gauche, avancer à droite — la liste au milieu. Alignées avec
   le champ lui-même, pas avec son étiquette : elles se posaient sinon en
   décalage sous le libellé.
   --------------------------------------------------------------------- */
.navigation-mois { display: flex; flex-direction: column; gap: 3px; }
.navigation-mois-ligne { display: flex; align-items: center; gap: 6px; }
.navigation-mois-ligne select { margin: 0; }
.fleche-mois {
  display: inline-flex; align-items: center; justify-content: center;
  width: 30px; height: 34px; flex: 0 0 auto;
  border: 1px solid var(--bordure); border-radius: 5px; background: white;
  color: var(--bleu); text-decoration: none; font-size: 0.8rem; line-height: 1; }
.fleche-mois:hover { background: var(--bleu-clair); border-color: var(--bleu); }

/* Le plan de tournée juste au-dessus de la saisie des dates : on lit la
   rotation, puis on pose la date sans avoir à mémoriser la liste. */
.carte-plan-tournee > summary { cursor: pointer; color: var(--bleu); }
.carte-plan-tournee > summary strong { display: inline-flex; align-items: center; gap: 7px; }
.bande-defilante.sans-carte { padding: 0; background: none; box-shadow: none;
  overflow-x: auto; }
/* Le plan de tournée peut compter cinquante-cinq lignes : il défile dans son
   propre cadre pour que la saisie des dates reste visible juste en dessous,
   sans avoir à faire défiler toute la page. L'en-tête des mois reste affiché. */
.carte-plan-tournee .bande-defilante { max-height: 340px; overflow-y: auto; }
.carte-plan-tournee table.plan-tournee thead th { position: sticky; top: 0; z-index: 3; }
.carte-plan-tournee table.plan-tournee thead th.colonne-fixe { z-index: 4; }

/* =====================================================================
   PARC AUTO — papiers du véhicule

   Carte grise et attestation d'assurance : deux raccourcis toujours
   visibles sur la carte du véhicule. Présent = lien cliquable, absent =
   mention grise. Le manque doit se voir sans ouvrir quoi que ce soit,
   parce qu'on s'en aperçoit sinon au bord de la route.
   ===================================================================== */
.rappel-papiers { border-left: 4px solid var(--orange); background: #fffdf7;
  padding: 9px 14px; border-radius: 0 6px 6px 0; display: flex; flex-wrap: wrap;
  gap: 10px; align-items: center; }

.papiers-vehicule { border-top: 1px solid var(--bordure); margin-top: 12px;
  padding-top: 10px; }
.papiers-raccourcis { display: flex; flex-wrap: wrap; gap: 8px; }
.papier { display: inline-flex; align-items: center; gap: 6px;
  padding: 5px 11px; border-radius: 16px; font-size: 0.8rem; font-weight: 600;
  text-decoration: none; border: 1px solid transparent; }
.papier.present { background: #e6f4ec; color: #14603a; border-color: #bfe3d0; }
.papier.present:hover { background: #d4ecdf; }
.papier.present.bientot { background: #fff4dc; color: #7a4d00; border-color: #f0d9a5; }
.papier.present.perime { background: #fdecea; color: #8e2318; border-color: #f2c2bc; }
.papier.absent { background: #f2f5f8; color: #8b96a2; border-color: var(--bordure);
  font-weight: 500; }

.ajout-papier { margin-top: 10px; }
.ajout-papier > summary { cursor: pointer; color: var(--gris); font-size: 0.82rem;
  text-decoration: underline; }
.liste-papiers { list-style: none; margin: 10px 0; padding: 0; }
.liste-papiers li { display: flex; flex-wrap: wrap; align-items: baseline; gap: 10px;
  padding: 6px 0; border-bottom: 1px solid var(--bordure); font-size: 0.86rem; }
.formulaire-papier { display: flex; flex-wrap: wrap; align-items: end; gap: 10px;
  margin-top: 10px; }
.formulaire-papier > div { display: flex; flex-direction: column; gap: 3px; }
.formulaire-papier label { margin: 0; font-size: 0.74rem; color: var(--gris);
  text-transform: uppercase; font-weight: 600; }
.formulaire-papier select, .formulaire-papier input { margin: 0; }
.formulaire-papier input[type="file"] { font-size: 0.82rem; max-width: 260px; }
.formulaire-papier .aide { flex: 1 1 100%; margin: 2px 0 0; }

/* L'anneau d'avancement des contrôles, sur la carte du véhicule. */
.vehicule-avancement { flex: 0 0 auto; }
.vehicule-avancement .anneau { width: 46px; height: 46px; border-radius: 50%;
  display: flex; align-items: center; justify-content: center;
  font-size: 0.74rem; font-weight: 800; color: var(--bleu);
  background: conic-gradient(var(--vert) calc(var(--part) * 1%), #e8edf2 0); }
.vehicule-avancement .anneau span { width: 34px; height: 34px; border-radius: 50%;
  background: white; display: flex; align-items: center; justify-content: center; }

/* =====================================================================
   B-ATTITUDE

   Cet écran n'avait plus aucune feuille de style : le tableau annuel
   était gris, la navigation une simple liste de liens et la saisie
   occupait toute la largeur pour quatre champs. Tout est repris ici.
   ===================================================================== */

/* ---------- Vue d'équipe : la couleur porte l'information ---------- */
table.tableau-battitude { min-width: max-content; }
table.tableau-battitude th { text-align: center; padding: 6px 8px; font-size: 0.72rem; }
table.tableau-battitude th a { color: var(--bleu); text-decoration: none;
  display: block; padding: 2px 4px; border-radius: 4px; }
table.tableau-battitude th a:hover { background: white; text-decoration: underline; }
table.tableau-battitude th.colonne-fixe { text-align: left; }

td.case-battitude { text-align: center; font-weight: 700; font-size: 0.84rem;
  padding: 6px 10px; min-width: 52px; border: 1px solid #eef1f4;
  color: #1c2530; }
/* Base acquise : le mois s'est bien passé. */
td.case-battitude.complet { background: #d4f0de; color: #14603a; }
/* Une déduction est passée : à savoir avant l'entretien. */
td.case-battitude.reduit { background: #ffe9a8; color: #7a4d00; }
/* Aucun gain : c'est le cas qui doit sauter aux yeux. */
td.case-battitude.vide { background: #f9d2ce; color: #8e2318; }
td.total-battitude { text-align: right; white-space: nowrap;
  background: var(--bleu-clair); color: var(--bleu); }

/* Colonne isolée pour la remontée : elle reste repérable dans le tableau. */
th.colonne-active { background: #fff4d6 !important; }
td.case-battitude.colonne-active { box-shadow: inset 0 0 0 2px var(--orange); }

/* ---------- Colonne à copier ---------- */
.carte-colonne { border-left: 5px solid var(--orange); }
.colonne-entete { display: flex; align-items: baseline; justify-content: space-between;
  gap: 12px; }
.colonne-entete h3 { margin: 0; display: flex; align-items: center; gap: 7px;
  color: var(--bleu); font-size: 1rem; }
.actions-colonne { margin: 10px 0 12px; }
/* Noms et montants défilent ENSEMBLE, dans un seul cadre : c'est ce qui permet
   de vérifier que la n-ième valeur correspond bien au n-ième technicien. */
.colonne-a-copier { display: flex; gap: 18px; align-items: flex-start;
  max-height: 430px; overflow-y: auto; padding-right: 6px;
  border: 1px solid var(--bordure); border-radius: 8px; background: #fbfcfd; }
/* Les noms servent de repère visuel : ils sont hors de la zone copiée. */
.reperes-colonne { margin: 10px 0; padding: 0 0 0 40px; flex: 0 0 auto;
  font-size: 0.84rem; color: var(--gris); line-height: 1.62; }
.reperes-colonne li { padding-left: 4px; white-space: nowrap; }
.bloc-valeurs { flex: 0 0 auto; padding: 10px 0; }
.zone-copie { font-family: Consolas, "Courier New", monospace; font-size: 0.86rem;
  line-height: 1.62; width: 130px; padding: 0 10px; border: 1px solid var(--bordure);
  border-radius: 6px; background: white; text-align: right; resize: none;
  overflow: hidden; }

/* ---------- « Aller à » : une carte par technicien, en tête d'écran ---------- */
.navigation-techniciens { padding: 14px 16px; text-align: center; }
.navigation-titre { display: inline-flex; align-items: center; gap: 7px;
  font-size: 0.78rem; font-weight: 700; color: var(--gris);
  text-transform: uppercase; letter-spacing: .02em; }
/* Grille (pas flex) : chaque pastille s'étire pour occuper toute la largeur
   de l'écran plutôt que de former un petit bloc centré entouré de vide sur
   les grands écrans — tout en restant visuellement centrée puisque la
   dernière ligne incomplète se répartit d'elle-même sur toute la largeur. */
.pastilles-techniciens { display: grid;
  grid-template-columns: repeat(auto-fit, minmax(184px, 1fr));
  gap: 8px; margin-top: 10px; text-align: left; }
.pastille-tech {
  position: relative; display: flex; align-items: center; gap: 9px;
  padding: 8px 10px; border-radius: 9px; text-decoration: none; color: #1c2530;
  background: white; border: 1px solid var(--bordure);
  border-left: 4px solid #c9d4de;
  box-shadow: 0 1px 2px rgba(0,0,0,0.05);
  transition: transform .1s, box-shadow .1s; }
.pastille-tech:hover { transform: translateY(-1px);
  box-shadow: 0 3px 8px rgba(0,0,0,0.12); }
.pastille-tech.complet { border-left-color: var(--vert); background: #f4fbf7; }
.pastille-tech.reduit { border-left-color: var(--orange); background: #fffcf3; }
.pastille-tech.vide { border-left-color: var(--rouge); background: #fdf6f5; }
.pastille-initiales { flex: 0 0 auto; width: 30px; height: 30px; border-radius: 50%;
  display: flex; align-items: center; justify-content: center;
  font-size: 0.72rem; font-weight: 800; color: var(--bleu); background: var(--bleu-clair); }
.pastille-corps { display: flex; flex-direction: column; min-width: 0; flex: 1 1 auto; }
.pastille-nom { font-weight: 700; font-size: 0.82rem; line-height: 1.15;
  white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.pastille-prenom { font-size: 0.74rem; color: var(--gris); line-height: 1.2;
  white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.pastille-montant { flex: 0 0 auto; font-weight: 800; font-size: 0.82rem;
  color: var(--bleu); white-space: nowrap; }
.pastille-tech.complet .pastille-montant { color: #14603a; }
.pastille-tech.vide .pastille-montant { color: #8e2318; }
/* Nombre de saisies du mois : une pastille d'angle, lue d'un coup d'œil. */
.pastille-compte { position: absolute; top: -6px; right: -6px;
  min-width: 18px; height: 18px; padding: 0 5px; border-radius: 9px;
  background: var(--bleu); color: white; font-size: 0.68rem; font-weight: 700;
  display: flex; align-items: center; justify-content: center; }

/* ---------- Saisie : deux à trois techniciens par ligne ---------- */
.grille-saisie-battitude { display: grid; gap: 14px;
  grid-template-columns: repeat(auto-fill, minmax(440px, 1fr)); }
.carte-battitude-tech { margin-bottom: 0; padding: 14px 16px;
  border-top: 4px solid var(--bordure); }
.battitude-entete { display: flex; align-items: flex-start; justify-content: space-between;
  gap: 12px; margin-bottom: 10px; }
.battitude-entete h3 { margin: 0 0 2px; font-size: 0.98rem; color: var(--bleu); }
.battitude-total { font-size: 1.15rem; font-weight: 800; white-space: nowrap;
  padding: 3px 11px; border-radius: 16px; background: #eef2f6; color: var(--bleu); }
.battitude-total.complet { background: #d4f0de; color: #14603a; }
.battitude-total.reduit { background: #ffe9a8; color: #7a4d00; }
.battitude-total.vide { background: #f9d2ce; color: #8e2318; }

.formulaire-battitude { display: grid; gap: 8px 10px; align-items: end;
  /* La date a besoin de plus de place que les deux montants : sans cela, le
     champ jj/mm/aaaa se retrouve tronqué. */
  grid-template-columns: minmax(128px, 1.4fr) minmax(70px, 1fr) minmax(70px, 1fr) auto;
  padding: 10px; border-radius: 8px; background: #f7f9fb;
  border: 1px solid var(--bordure); }
.formulaire-battitude label { margin: 0 0 3px; display: block;
  font-size: 0.7rem; font-weight: 700; color: var(--gris);
  text-transform: uppercase; letter-spacing: .02em; }
.formulaire-battitude input, .formulaire-battitude select { margin: 0; width: 100%;
  padding: 6px 8px; font-size: 0.86rem; }
.formulaire-battitude .champ-categorie { grid-column: 1 / -1; }
.formulaire-battitude .champ-commentaire { grid-column: 1 / 4; }
.formulaire-battitude .champ-montant input { text-align: right; }
.formulaire-battitude button { align-self: end; white-space: nowrap; }

.choix-categories { display: flex; flex-wrap: wrap; gap: 6px; }
.choix-categorie { margin: 0; cursor: pointer; }
.choix-categorie input { position: absolute; opacity: 0; width: 0; height: 0; }
.choix-categorie span { display: inline-flex; align-items: center; gap: 5px;
  padding: 5px 10px; border-radius: 15px; font-size: 0.78rem; font-weight: 600;
  background: white; border: 1px solid var(--bordure); color: var(--gris); }
.choix-categorie input:checked + span { background: var(--bleu); border-color: var(--bleu);
  color: white; }
.choix-categorie input:focus-visible + span { outline: 2px solid var(--bleu);
  outline-offset: 2px; }

/* Le journal des saisies du mois, sous le formulaire. Chaque saisie tient sur
   deux lignes : date / catégorie / montants, puis commentaire et actions. Un
   tableau à six colonnes débordait de la carte. */
.liste-saisies { margin-top: 12px; }
.liste-saisies-titre { font-size: 0.7rem; font-weight: 700; color: var(--gris);
  text-transform: uppercase; letter-spacing: .02em; margin-bottom: 6px; }
.ligne-saisie { display: grid; gap: 5px 6px; align-items: center;
  grid-template-columns: minmax(112px, auto) minmax(0, 1fr) 62px 62px;
  padding: 8px; margin-bottom: 6px; border-radius: 7px;
  background: #fbfcfd; border: 1px solid var(--bordure); }
.ligne-saisie input, .ligne-saisie select { margin: 0; width: 100%;
  padding: 4px 6px; font-size: 0.8rem; }
.ligne-saisie .saisie-montant { text-align: right; }
.ligne-saisie .saisie-commentaire { grid-column: 1 / 3; }
.actions-saisie { grid-column: 3 / -1; display: flex; align-items: center;
  justify-content: flex-end; gap: 8px; white-space: nowrap; }
.actions-saisie .bouton-petit { padding: 4px 10px; font-size: 0.78rem; }

@media (max-width: 900px) {
  .formulaire-battitude { grid-template-columns: repeat(2, minmax(0, 1fr)); }
  .formulaire-battitude .champ-commentaire { grid-column: 1 / -1; }
}
/* Cinquante-cinq lignes : le tableau défile dans son cadre, en-tête figé, pour
   que la colonne à copier et la saisie restent atteignables sans traverser
   toute la page. */
.carte.bande-defilante:has(table.tableau-battitude) { max-height: 460px; overflow-y: auto; }
table.tableau-battitude thead th { position: sticky; top: 0; z-index: 3; }
table.tableau-battitude thead th.colonne-fixe { z-index: 4; }

/* =====================================================================
   Règles manquantes repérées par tests/test_ui_ecrans.py

   Une classe posée dans un gabarit sans règle correspondante est un
   morceau d'interface qui ne s'affiche pas comme prévu — c'est ainsi que
   l'écran B-Attitude avait perdu toutes ses couleurs.
   ===================================================================== */

/* Accueil : le bloc nom + équipe, à droite de l'avatar. */
.fiche-identite { display: flex; flex-direction: column; gap: 2px; min-width: 0; }

/* Roulement : le bandeau d'état, à gauche du formulaire de réglage. */
.roulement-etat { display: flex; flex-direction: column; gap: 8px;
  flex: 1 1 320px; min-width: 0; }

/* Flèches de la bande de calendrier : le sens sert de repère, la mise en
   forme reste identique des deux côtés. */
.fleche-bande.gauche { margin-left: 0; }
.fleche-bande.droite { margin-right: 0; }

/* B-Attitude : les champs du formulaire de saisie et du journal. */
.formulaire-battitude .champ-date { min-width: 0; }
.ligne-saisie .saisie-date { min-width: 0; }
.ligne-saisie .saisie-categorie { min-width: 0; }

/* Remarque d'import : ce que l'application a compris du fichier — ni erreur,
   ni exclusion. Exemple : une colonne de dates écrite à l'envers, lue quand
   même. Un ton neutre, pas alarmant. */
.note-import { display: flex; align-items: flex-start; gap: 8px;
  background: var(--bleu-clair); color: #1c3a56; border-radius: 6px;
  padding: 9px 12px; font-size: 0.86rem; margin: 0 0 12px; }

/* =====================================================================
   ICÔNES EN COULEUR

   Chaque pictogramme porte une couleur de sens, posée ici et non dans le
   tracé : un bloc qui impose déjà sa couleur (bouton bleu, badge, en-tête)
   la reprend d'une seule règle, et la palette se change en un seul endroit.

   Le code couleur :
     vert   ce qui va bien, ce qui est acquis, ce qui progresse
     rouge  ce qui alerte, ce qui échoue, ce qui se supprime
     orange ce qui attend, ce qui approche d'un seuil
     bleu   le pilotage, les chiffres, la mesure
     violet l'humain, l'équipe, le calendrier partagé
     teal   le matériel et la logistique
   ===================================================================== */
:root {
  --i-vert: #1e8a4c;
  --i-rouge: #c0392b;
  --i-orange: #d68910;
  --i-bleu: #1f6fb2;
  --i-violet: #6a4bab;
  --i-teal: #0e7c86;
  --i-rose: #c2185b;
  --i-brun: #8a6d3b;
}

/* -- Performance et chiffres -- */
.icone-actes, .icone-production, .icone-efficacite, .icone-cible,
.icone-loupe, .icone-identite, .icone-actes { color: var(--i-bleu); }
.icone-ok, .icone-hausse, .icone-conges, .icone-sauvegarde { color: var(--i-vert); }
.icone-ko, .icone-baisse, .icone-alerte, .icone-anomalie,
.icone-poubelle { color: var(--i-rouge); }
.icone-horloge, .icone-ecart, .icone-stable, .icone-ferie { color: var(--i-orange); }

/* -- Argent et primes -- */
.icone-euro, .icone-bonus { color: var(--i-brun); }
.icone-bte { color: var(--i-teal); }

/* -- Humain, équipe, temps partagé -- */
.icone-presence, .icone-effectif, .icone-reunion,
.icone-jour { color: var(--i-violet); }
.icone-anniversaire, .icone-satcli { color: var(--i-rose); }
.icone-depart { color: var(--i-rouge); }

/* -- Matériel, terrain, logistique -- */
.icone-vehicule, .icone-terrain, .icone-gps, .icone-filiere { color: var(--i-teal); }
.icone-qualite { color: var(--i-vert); }

/* -- Outils -- */
.icone-mail, .icone-commentaire, .icone-telephone { color: var(--i-bleu); }
.icone-imprimer, .icone-reglages, .icone-rapprochement { color: var(--gris); }
.icone-import { color: var(--i-vert); }
.icone-ajouter { color: var(--i-vert); }

/* Là où le bloc impose déjà sa couleur, l'icône la reprend : une icône verte
   sur un bouton bleu serait illisible, et un badge doit rester d'un seul ton. */
.bouton .icone, a.bouton .icone, button.bouton .icone,
.entete .icone, .badge .icone, .jeton .icone, .jeton-type .icone,
.avatar .icone, .battitude-total .icone, .papier .icone,
.choix-categorie input:checked + span .icone,
.case-trimestre .icone, .pastille-tech .icone,
body.document-autonome .icone { color: inherit; }

/* Menu : pictogramme + libellé. L'onglet ouvert se souligne — sur une
   dizaine d'entrées, savoir où l'on est évite de cliquer pour vérifier. */
.entete nav { display: flex; flex-wrap: wrap; align-items: center; gap: 2px 4px; }
.entete nav a, .entete nav summary { display: inline-flex; align-items: center; gap: 8px;
  margin-left: 0; padding: 5px 10px; border-radius: 6px; cursor: pointer; }
.entete nav a:hover { background: rgba(255,255,255,0.12); text-decoration: none; }
.entete nav a.actif { background: rgba(255,255,255,0.18); opacity: 1; font-weight: 600; }

/* Pastilles pleines et colorées : chaque pictogramme du menu se pose sur un
   disque de sa couleur de sens plutôt qu'en simple trait blanc — le menu se
   parcourt à la couleur, le texte confirmant pour qui ne les a pas retenues. */
.pastille-nav { display: inline-flex; align-items: center; justify-content: center;
  width: 26px; height: 26px; border-radius: 50%; flex: 0 0 auto; }
.pastille-nav .icone { color: white; }
.pastille-presence, .pastille-jour, .pastille-effectif { background: var(--i-violet); }
.pastille-cible { background: var(--i-bleu); }
.pastille-conges, .pastille-import { background: var(--i-vert); }
.pastille-vehicule, .pastille-filiere { background: var(--i-teal); }
.pastille-bonus { background: var(--i-brun); }
.pastille-anomalie { background: var(--i-rouge); }
.pastille-audit { background: #7357a6; }
.pastille-ecart { background: var(--i-orange); }
.pastille-reglages, .pastille-rapprochement, .pastille-sauvegarde { background: var(--gris); }

/* Écarts + Rapprochements : un seul tiroir plutôt que deux onglets voisins. */
.menu-deroulant { position: relative; }
.menu-deroulant summary { list-style: none; }
.menu-deroulant summary::-webkit-details-marker { display: none; }
.menu-deroulant[open] summary, .menu-deroulant.actif summary {
  background: rgba(255,255,255,0.18); opacity: 1; font-weight: 600;
}
.menu-deroulant-options {
  position: absolute; top: calc(100% + 6px); left: 0; z-index: 50;
  background: white; border-radius: 8px; box-shadow: 0 6px 18px rgba(0,0,0,0.18);
  padding: 6px; min-width: 210px; display: flex; flex-direction: column; gap: 2px;
}
.entete nav .menu-deroulant-options a { color: var(--bleu); opacity: 1; padding: 8px 10px; border-radius: 6px; margin: 0; }
.entete nav .menu-deroulant-options a:hover, .entete nav .menu-deroulant-options a.actif {
  background: var(--bleu-clair); text-decoration: none;
}

/* =====================================================================
   ANOMALIES — analyse, mouvement, plan d'action
   ===================================================================== */
.bandeau-succes { border-left: 5px solid var(--vert); }
.bandeau-erreur { border-left: 5px solid var(--rouge); }

/* Progression / régression : deux listes symétriques, lues côte à côte. */
.liste-mouvements { padding: 8px 10px; }
.ligne-mouvement { display: grid; align-items: center; gap: 10px;
  grid-template-columns: minmax(0, 1fr) auto 54px 92px;
  padding: 7px 8px; border-radius: 7px; border-left: 4px solid transparent; }
.ligne-mouvement:nth-child(odd) { background: #fbfcfd; }
.ligne-mouvement.progression { border-left-color: var(--vert); }
.ligne-mouvement.regression { border-left-color: var(--rouge); }
.mouvement-nom { font-weight: 600; color: #1c2530; text-decoration: none;
  white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.mouvement-nom:hover { color: var(--bleu); text-decoration: underline; }
.mouvement-chiffres { font-size: 0.84rem; color: var(--gris); white-space: nowrap; }
.mouvement-variation { font-weight: 800; font-size: 0.86rem; text-align: right;
  white-space: nowrap; }
.mouvement-variation.bonne { color: var(--vert); }
.mouvement-variation.mauvaise { color: var(--rouge); }
.mouvement-courbe { display: flex; justify-content: flex-end; }

/* Plan d'action : la priorité se lit sur le jeton, pas dans un tableau. */
.analyse-titre .jeton.priorite-1 { background: var(--rouge); color: white; }
.analyse-titre .jeton.priorite-2 { background: var(--orange); color: white; }
.analyse-titre .jeton.priorite-3 { background: var(--vert); color: white; }
.analyse-lien { margin: 8px 0 0; font-size: 0.86rem; }

/* Détail par technicien. */
table.tableau-anomalies { min-width: max-content; }
table.tableau-anomalies td, table.tableau-anomalies th { white-space: nowrap; }
table.tableau-anomalies td.colonne-courbe { width: 90px; }
tr.ligne-niveau-alerte td.colonne-fixe { box-shadow: inset 3px 0 0 var(--rouge); }
tr.ligne-niveau-attention td.colonne-fixe { box-shadow: inset 3px 0 0 var(--orange); }
.pastille-niveau.niveau-alerte { background: #f9d2ce; color: #8e2318; }
.pastille-niveau.niveau-attention { background: #ffe9a8; color: #7a4d00; }
.pastille-niveau.niveau-ok { background: #d4f0de; color: #14603a; }
table.tableau-types td:first-child { white-space: normal; }
/* Par type : une seule lecture — le libellé, sa barre, son poids. Deux
   représentations du même chiffre (barres au-dessus, tableau en dessous)
   faisaient lire deux fois la même chose. */
table.tableau-types td.type-libelle { min-width: 150px; }
table.tableau-types th.colonne-poids, table.tableau-types td.colonne-poids {
  width: 46%; white-space: nowrap; }
.barre-type { display: inline-block; width: calc(100% - 44px);
  vertical-align: middle; height: 10px; border-radius: 5px; background: #f0f3f6; }
.barre-type-remplissage { display: block; height: 100%; border-radius: 5px;
  background: var(--rouge); min-width: 2px; }
.barre-type-nombre { display: inline-block; width: 40px; text-align: right;
  vertical-align: middle; font-variant-numeric: tabular-nums; }
.jeton-etendue { font-variant-numeric: tabular-nums; }
.jeton-etendue.etendue-large { background: #fdecea; color: #8e2318; }
.jeton-etendue.etendue-ciblee { background: #eef2f6; color: #4a5560; }

/* ---------------------------------------------------------------------
   Matrice technicien x type d'anomalie : la vue d'ensemble de l'équipe.

   Une carte de chaleur, pas un tableau de plus. L'oeil doit repérer une
   colonne sombre (sujet collectif) ou une case isolée (technicien à voir)
   avant d'avoir lu un seul chiffre. L'intensité est calculée côté Python et
   posée en style inline : la couleur est une donnée, pas une décoration.
   --------------------------------------------------------------------- */
.carte-matrice { padding: 14px 0 0; }
.carte-matrice .bande-defilante { padding: 0 14px 14px; max-height: 560px;
  overflow: auto; }
.legende-matrice { margin: 0 14px 12px; align-items: center; gap: 10px; }
.echelle-matrice { display: inline-flex; gap: 2px; }
.case-echelle { width: 20px; height: 12px; border-radius: 2px;
  border: 1px solid #e6eaee; display: inline-block; }
.jeton-dominante { display: inline-flex; align-items: center; gap: 5px;
  background: #fdecea; color: #8e2318; border: 1px solid #f2c2bc;
  padding: 3px 9px; border-radius: 12px; font-size: 0.76rem; font-weight: 600; }
.jeton-dominante .icone { color: inherit; }

table.matrice-anomalies { min-width: max-content; border-collapse: separate;
  border-spacing: 2px; }
table.matrice-anomalies th, table.matrice-anomalies td { white-space: nowrap; }
table.matrice-anomalies td.colonne-fixe { min-width: 190px; }
/* Cinquante lignes et huit colonnes : sans en-tête ni nom figés, on ne sait
   plus quelle case on lit dès le premier défilement. */
table.matrice-anomalies thead th { position: sticky; top: 0; z-index: 3;
  background: var(--bleu-clair); }
table.matrice-anomalies thead th.colonne-fixe { z-index: 4; }
table.matrice-anomalies tfoot th { position: sticky; bottom: 0; z-index: 3; }
table.matrice-anomalies tfoot th.colonne-fixe { z-index: 4; }
table.matrice-anomalies th.colonne-total,
table.matrice-anomalies td.colonne-total { text-align: center; font-size: 0.82rem; }
table.matrice-anomalies th.colonne-type { max-width: 110px; text-align: center;
  vertical-align: bottom; font-size: 0.74rem; line-height: 1.15; }
table.matrice-anomalies th.colonne-type span { display: block;
  white-space: normal; word-break: break-word; }
table.matrice-anomalies td.case-matrice { text-align: center; min-width: 44px;
  font-variant-numeric: tabular-nums; font-weight: 600; border-radius: 3px; }
table.matrice-anomalies td.case-vide { background: #fbfcfd; font-weight: 400; }
table.matrice-anomalies td.case-dominante { box-shadow: inset 0 0 0 2px #1f4e79; }
table.matrice-anomalies tfoot th { background: #f4f7fa; text-align: center;
  font-size: 0.82rem; }
table.matrice-anomalies th.colonne-type-total { background: #eef2f6;
  border-radius: 3px; }

/* Technicien parti : la fiche reste — ses mois passés font partie de
   l'histoire de l'équipe — mais elle ne doit pas se confondre avec celle d'un
   présent. Marque explicite près du nom, carte atténuée. */
.marque-depart { display: inline-flex; align-items: center; gap: 4px;
  margin-left: 8px; padding: 2px 8px; border-radius: 12px;
  background: #fdecea; color: #8e2318; border: 1px solid #f2c2bc;
  font-size: 0.7rem; font-weight: 700; text-transform: uppercase;
  letter-spacing: .02em; vertical-align: middle; }
.marque-depart .icone { color: inherit; }
.fiche-tech.fiche-partie { border-left: 4px solid var(--rouge); background: #fdfbfb; }
.fiche-tech.fiche-partie .avatar { background: #f0e6e5; color: #8e2318; }

/* =====================================================================
   PLANNING — module d'ajout à gauche, calendrier à droite

   Le formulaire d'ajout sert souvent mais brièvement : il n'a aucune raison
   de manger la largeur dont le calendrier a réellement besoin. Il occupe
   donc une colonne étroite, avec la légende sous lui — le bloc « ce que je
   pose sur le calendrier » tient d'un seul tenant.
   ===================================================================== */
.zone-calendrier { display: grid; gap: 14px; align-items: start;
  grid-template-columns: minmax(230px, 250px) minmax(0, 1fr);
  margin-bottom: 20px; }
.colonne-evenements { display: flex; flex-direction: column; gap: 12px; min-width: 0; }
.carte-ajout-evenement { margin-bottom: 0; padding: 12px 14px; }
.carte-ajout-evenement h3 { margin: 0 0 8px; font-size: 0.95rem; color: var(--bleu);
  display: flex; align-items: center; gap: 7px; }
/* Une seule ligne, comme les formulaires d'incidents : la colonne de gauche
   ne sert que ponctuellement, elle n'a pas à empiler quatre champs à chaque
   fois qu'on veut poser une date. */
.formulaire-evenement-compact { display: flex; flex-wrap: wrap; align-items: center; gap: 7px; }
.formulaire-evenement-compact input, .formulaire-evenement-compact select { margin: 0;
  padding: 6px 7px; font-size: 0.84rem; }
.formulaire-evenement-compact select { width: auto; flex: 0 0 auto; }
.formulaire-evenement-compact input[type=date] { flex: 0 0 auto; }
.formulaire-evenement-compact .bouton { flex: 0 0 auto; white-space: nowrap; }
.legende-calendrier { margin: 4px 0 0; display: flex; flex-wrap: wrap;
  gap: 6px 16px; font-size: 0.78rem; }
.bloc-calendrier { min-width: 0; }
.bloc-calendrier .cadre-bande-calendrier { margin-bottom: 0; }

@media (max-width: 1000px) {
  .zone-calendrier { grid-template-columns: 1fr; }
}

/* ---------------------------------------------------------------------
   Supprimer un entretien : une poubelle, là où l'entretien est posé.
   Discrète au repos, franchement rouge au survol — on ne clique pas
   dessus par inadvertance, et on la trouve quand on la cherche.
   --------------------------------------------------------------------- */
.forme-suppression { display: inline-block; margin: 0; }
.bouton-poubelle { display: inline-flex; align-items: center; justify-content: center;
  width: 28px; height: 28px; padding: 0; border-radius: 6px; cursor: pointer;
  border: 1px solid transparent; background: transparent; color: #b0bac4; }
.bouton-poubelle:hover { background: #fdecea; border-color: #f2c2bc; color: var(--rouge); }
.bouton-poubelle .icone { color: inherit; }
/* Un entretien porteur d'un debrief se signale avant le clic. */
.bouton-poubelle.avec-debrief { color: #d9a3a0; }
.bouton-poubelle.avec-debrief:hover { color: var(--rouge); background: #fbe2e0; }

.actions-presentiel { display: inline-flex; align-items: center; gap: 4px; }
.actions-presentiel .bouton-petit { display: inline-flex; align-items: center;
  justify-content: center; width: 30px; height: 28px; padding: 0; }
.colonne-actions { white-space: nowrap; }
.colonne-actions > * { vertical-align: middle; }
/* Lien réduit à son pictogramme : le titre porte le sens pour la souris et
   l'aria-label pour le lecteur d'écran. */
.lien-icone { display: inline-flex; align-items: center; justify-content: center;
  width: 28px; height: 28px; border-radius: 6px; color: var(--i-bleu); }
.lien-icone:hover { background: var(--bleu-clair); }

/* Deux colonnes copiables côte à côte : les montants et les commentaires, dans
   le même ordre que les noms rappelés à gauche. Elles défilent ensemble. */
.titre-zone-copie { font-size: 0.68rem; font-weight: 700; color: var(--gris);
  text-transform: uppercase; letter-spacing: .02em; margin-bottom: 4px; }
.bloc-commentaires { flex: 1 1 260px; min-width: 0; }
.zone-copie-texte { width: 100%; min-width: 240px; text-align: left;
  font-family: "Segoe UI", Arial, sans-serif; }
.actions-colonne { display: flex; flex-wrap: wrap; gap: 8px; }
.actions-colonne .bouton { display: inline-flex; align-items: center; gap: 7px; }

/* =====================================================================
   AJUSTEMENTS MANUELS

   Ce qui est corrigé à la main doit se voir : la ligne est colorée selon
   le sens (ajout ou retrait), le motif est affiché à côté, et rien ne
   ressemble à une donnée importée.
   ===================================================================== */
.carte-ajustements { padding: 16px 18px; }
table.tableau-ajustements { margin-bottom: 14px; }
table.tableau-ajustements td:nth-child(2) { color: var(--gris); }
.ajustement-positif { color: var(--vert); }
.ajustement-negatif { color: var(--rouge); }

.deux-formulaires { display: grid; gap: 14px;
  grid-template-columns: repeat(auto-fit, minmax(330px, 1fr)); }
.formulaire-ajustement { display: grid; gap: 8px 10px; align-items: end;
  grid-template-columns: repeat(2, minmax(0, 1fr)) auto;
  padding: 12px 14px; border-radius: 8px; background: #f7f9fb;
  border: 1px solid var(--bordure); }
.formulaire-ajustement h3 { grid-column: 1 / -1; margin: 0 0 2px;
  font-size: 0.92rem; color: var(--bleu); display: flex; align-items: center; gap: 7px; }
.formulaire-ajustement > div { display: flex; flex-direction: column; gap: 3px; min-width: 0; }
.formulaire-ajustement .champ-large { grid-column: 1 / -1; }
.formulaire-ajustement label { margin: 0; font-size: 0.7rem; font-weight: 700;
  color: var(--gris); text-transform: uppercase; letter-spacing: .02em; }
.formulaire-ajustement input, .formulaire-ajustement select { margin: 0; width: 100%;
  padding: 6px 8px; font-size: 0.86rem; }
.formulaire-ajustement button { white-space: nowrap; }
.formulaire-ajustement .aide { grid-column: 1 / -1; margin: 2px 0 0; }

/* Chiffre corrigé : un repère discret mais présent, partout où il s'affiche. */
.marque-ajuste { display: inline-flex; align-items: center; gap: 4px;
  padding: 1px 7px; border-radius: 10px; background: #fff4dc; color: #7a4d00;
  border: 1px solid #f0d9a5; font-size: 0.68rem; font-weight: 700;
  text-transform: uppercase; letter-spacing: .02em; }
.marque-ajuste .icone { color: inherit; }

/* =====================================================================
   CLASSEMENT D'ÉQUIPE — un repère, pas une note
   ===================================================================== */
.position-globale { margin: 0 0 12px; font-size: 0.95rem; }
table.tableau-classement td:last-child { text-align: right; }
.rang { display: inline-flex; align-items: baseline; gap: 1px;
  padding: 2px 10px; border-radius: 12px; font-weight: 800; font-size: 0.86rem;
  background: #eef2f6; color: var(--bleu); }
.rang small { font-weight: 600; font-size: 0.72rem; opacity: .75; }
.rang.rang-tete { background: #d4f0de; color: #14603a; }
.rang.rang-queue { background: #f9d2ce; color: #8e2318; }

/* FPS et matériel : bandeau pleine largeur SOUS BTE / B-Attitude / LeadMobile,
   pas dans leur grille — il ne doit ni décaler leur ordre ni prendre une
   hauteur de carte pour ce qu'il contient : une ligne par incident, un
   formulaire d'une ligne par nature, jamais de grille à deux colonnes. */
.bandeau-incidents { border-left: 5px solid var(--orange); padding: 10px 16px; }
.bandeau-incidents h3 { display: flex; flex-wrap: wrap; align-items: baseline; gap: 8px; }
.bandeau-incidents .aide-inline { font-size: 0.78rem; font-weight: 400;
  color: var(--gris); }
.liste-incidents { list-style: none; margin: 8px 0 0; padding: 0; font-size: 0.86rem; }
.liste-incidents li { display: flex; flex-wrap: wrap; align-items: baseline;
  gap: 6px; padding: 4px 0; border-bottom: 1px solid var(--bordure); }
.liste-incidents li form { margin-left: auto; }
.saisie-incident > summary { cursor: pointer; color: var(--gris);
  font-size: 0.84rem; text-decoration: underline; margin-top: 10px; }
.formulaire-incident { display: flex; flex-wrap: wrap; align-items: center;
  gap: 8px; margin-top: 10px; }
.formulaire-incident-libelle { font-size: 0.82rem; font-weight: 700;
  color: var(--bleu); display: inline-flex; align-items: center; gap: 5px;
  min-width: 74px; }
.formulaire-incident input, .formulaire-incident select { margin: 0;
  padding: 5px 7px; font-size: 0.84rem; }
.formulaire-incident input[type=number] { width: 58px; }
.formulaire-incident select { width: auto; }
.formulaire-incident input[name=designation] { width: 130px; }
.formulaire-incident .bouton { flex: 0 0 auto; white-space: nowrap; }
/* Champ qui absorbe l'espace restant d'une ligne de formulaire compacte,
   commun à tous les formulaires en une ligne (incidents, ajout d'événement). */
.champ-etire { flex: 1 1 160px; min-width: 120px; }

/* Ajustements rappelés dans le support d'entretien. */
.carte-ajustements-entretien { border-left: 5px solid var(--orange); }
.liste-ajustements { list-style: none; margin: 10px 0 0; padding: 0; }
.liste-ajustements li { display: flex; flex-wrap: wrap; gap: 10px;
  align-items: baseline; padding: 6px 0; border-bottom: 1px solid var(--bordure); }
.carte-classement > summary { cursor: pointer; color: var(--bleu); }
.carte-classement > summary strong { display: inline-flex; align-items: center; gap: 7px; }

/* =====================================================================
   DIFFICULTÉS SIGNALÉES

   Ce que les fichiers ne disent pas. Le niveau porte la couleur : légère
   au bleu, marquée à l'orange, bloquante au rouge — et la difficulté
   héritée d'un mois précédent se signale, parce que c'est justement ce
   qu'on oublie.
   ===================================================================== */
.carte-difficultes { padding: 16px 18px; }
.liste-difficultes { display: grid; gap: 10px; margin-bottom: 12px; }
.bloc-difficulte { border-left: 4px solid var(--bordure); background: #fbfcfd;
  border-radius: 0 7px 7px 0; padding: 10px 12px; }
.bloc-difficulte.niveau-legere { border-left-color: var(--i-bleu); }
.bloc-difficulte.niveau-marquee { border-left-color: var(--orange); background: #fffdf7; }
.bloc-difficulte.niveau-bloquante { border-left-color: var(--rouge); background: #fffafa; }
.difficulte-entete { display: flex; flex-wrap: wrap; gap: 10px; align-items: baseline;
  margin-bottom: 6px; }
.difficulte-entete a { text-decoration: none; color: #1c2530; }
.difficulte-entete a:hover { color: var(--bleu); text-decoration: underline; }
.ligne-difficulte { display: flex; flex-wrap: wrap; gap: 8px; align-items: baseline;
  padding: 5px 0; border-top: 1px solid var(--bordure); font-size: 0.88rem; }
.difficulte-texte { flex: 1 1 240px; min-width: 0; }
.difficulte-action { display: inline-flex; align-items: baseline; gap: 5px;
  margin-left: 8px; color: var(--vert); font-size: 0.84rem; }
.difficulte-actions { display: flex; align-items: center; gap: 4px; }
.difficulte-actions form { margin: 0; }
.jeton-difficulte { display: inline-flex; align-items: center; gap: 5px;
  padding: 2px 9px; border-radius: 12px; font-size: 0.72rem; font-weight: 700;
  background: #eef2f6; color: var(--bleu); white-space: nowrap; }
.jeton-difficulte .icone { color: inherit; }
.jeton-difficulte.niveau-legere { background: var(--bleu-clair); color: var(--bleu); }
.jeton-difficulte.niveau-marquee { background: #ffe9a8; color: #7a4d00; }
.jeton-difficulte.niveau-bloquante { background: #f9d2ce; color: #8e2318; }

.saisie-difficulte > summary { cursor: pointer; color: var(--gris);
  font-size: 0.84rem; text-decoration: underline; }
.formulaire-difficulte { display: grid; gap: 8px 10px; align-items: end; margin-top: 10px;
  grid-template-columns: repeat(3, minmax(0, 1fr)) auto;
  padding: 12px 14px; border-radius: 8px; background: #f7f9fb;
  border: 1px solid var(--bordure); }
.formulaire-difficulte > div { display: flex; flex-direction: column; gap: 3px; min-width: 0; }
.formulaire-difficulte .champ-large { grid-column: 1 / 4; }
.formulaire-difficulte label { margin: 0; font-size: 0.7rem; font-weight: 700;
  color: var(--gris); text-transform: uppercase; letter-spacing: .02em; }
.formulaire-difficulte input, .formulaire-difficulte select { margin: 0; width: 100%;
  padding: 6px 8px; font-size: 0.86rem; }

/* Suggestions automatiques : même registre que les difficultés signalées,
   en plus discret — ce sont des pistes à confirmer, pas des constats déjà
   posés. « Signaler » ouvre le formulaire manuel, il n'écrit rien seul. */
.carte-suggestions-difficulte { padding: 14px 16px; border-left: 4px solid var(--bleu-clair);
  background: #fbfcfe; margin-bottom: 14px; }
.carte-suggestions-difficulte h3 { margin: 0 0 4px; font-size: 0.92rem; color: var(--bleu);
  display: flex; align-items: center; gap: 7px; }
.liste-suggestions-difficulte { list-style: none; margin: 8px 0 0; padding: 0; }
.liste-suggestions-difficulte li { display: flex; flex-wrap: wrap; gap: 8px;
  align-items: baseline; padding: 6px 0; border-top: 1px solid var(--bordure);
  font-size: 0.86rem; }
.liste-suggestions-difficulte li:first-child { border-top: none; }
.liste-suggestions-difficulte .aide { flex: 1 1 240px; min-width: 0; }
.suggestion-signaler { margin-left: auto; white-space: nowrap; }

/* =====================================================================
   ÉTATS D'UN ÉVÉNEMENT

   Annulé n'est pas supprimé. L'événement reste au calendrier, éteint et
   barré : trois mois plus tard, « la réunion de mars a bien été annulée ? »
   trouve sa réponse. Une ligne effacée n'aurait rien répondu.
   ===================================================================== */
/* Pleine largeur, repliée par défaut (<details> sans « open ») : consultée
   ponctuellement, elle n'a aucune raison de pousser en permanence le reste
   de la page vers le bas. */
.carte-evenements-periode { padding: 14px 16px; }
.carte-evenements-periode > summary { cursor: pointer; color: var(--bleu);
  display: flex; align-items: center; gap: 8px; flex-wrap: wrap; }
.carte-evenements-periode > summary strong { display: inline-flex;
  align-items: center; gap: 7px; }
/* Une colonne par type d'événement une fois dépliée : chaque type se lit
   d'un coup d'œil au lieu de se mélanger dans une liste unique. */
.colonnes-evenements-type { display: grid;
  grid-template-columns: repeat(auto-fit, minmax(190px, 1fr)); gap: 16px;
  margin-top: 12px; }
.colonne-type-evenement h4 { margin: 0 0 6px; display: flex;
  align-items: center; gap: 7px; font-size: 0.86rem; }

/* Chaque événement est une seule ligne par défaut : le changement d'état
   (auparavant un select + un champ + un bouton toujours affichés) est replié
   dans un petit menu déroulant. C'est ce qui empêchait la liste de « prendre
   une place monstre » dès qu'elle contenait plus de deux ou trois événements. */
.liste-evenements { list-style: none; margin: 0; padding: 0; display: grid; gap: 4px; }
.evenement-ligne { border: 1px solid var(--bordure); border-radius: 7px;
  padding: 5px 8px; background: #fbfcfd; }
.evenement-ligne-resume { display: flex; align-items: center; gap: 7px;
  flex-wrap: nowrap; min-width: 0; }
.evenement-date { font-size: 0.76rem; color: var(--gris); font-weight: 700;
  flex: 0 0 auto; }
.evenement-titre { font-size: 0.82rem; font-weight: 600; line-height: 1.3;
  flex: 1 1 auto; min-width: 0; overflow: hidden; text-overflow: ellipsis;
  white-space: nowrap; }
.evenement-etat-editer { flex: 0 0 auto; margin-left: auto; }
.evenement-etat-editer > summary { cursor: pointer; list-style: none;
  color: var(--gris); padding: 2px 4px; border-radius: 4px; }
.evenement-etat-editer > summary::-webkit-details-marker { display: none; }
.evenement-etat-editer > summary:hover { background: var(--bleu-clair); color: var(--bleu); }
.evenement-actions { display: flex; flex-wrap: wrap; gap: 5px; margin-top: 6px; }
.evenement-actions select { margin: 0; padding: 4px 6px; font-size: 0.8rem; }
.evenement-actions input { margin: 0; padding: 4px 6px; font-size: 0.8rem;
  min-width: 0; flex: 1 1 80px; }
.evenement-actions button { padding: 4px 10px; flex: 0 0 auto; }

/* Un événement annulé doit sauter aux yeux, pas s'éteindre : c'est ce qui
   permet de voir d'un coup d'œil qu'un déplacement ou une réunion a été
   annulé, y compris plusieurs mois plus tard dans l'historique. */
.evenement-ligne.etat-annule { background: #fdecea; border-color: #f2c2bc; }
.evenement-ligne.etat-annule .evenement-titre { text-decoration: line-through;
  color: var(--rouge); }
tr.etat-annule td:nth-child(3) { text-decoration: line-through; color: var(--rouge); }

.jeton-etat { display: inline-block; padding: 2px 9px; border-radius: 11px;
  font-size: 0.72rem; font-weight: 700; background: var(--bleu-clair); color: var(--bleu);
  white-space: nowrap; }
.jeton-etat.etat-realise { background: #d4f0de; color: #14603a; }
.jeton-etat.etat-reporte { background: #ffe9a8; color: #7a4d00; }
.jeton-etat.etat-annule { background: #f9d2ce; color: #8e2318; }

/* Au calendrier : l'événement annulé passe en rouge hachuré — très visible,
   sans disparaître du calendrier (c'est justement ce qu'on veut pouvoir
   retrouver plus tard : « ce déplacement a bien été annulé »). */
table.calendrier td.evenement.etat-annule {
  background-color: var(--rouge) !important; color: white;
  background-image: repeating-linear-gradient(135deg,
    rgba(255,255,255,.35) 0 3px, rgba(255,255,255,0) 3px 6px);
  text-decoration: line-through; font-weight: 700; }
table.calendrier td.evenement.etat-reporte {
  box-shadow: inset 0 0 0 2px var(--orange); }
table.calendrier td.evenement.etat-realise {
  box-shadow: inset 0 0 0 2px #14603a; }

/* Report automatique des dates terrain : un bandeau au-dessus de la saisie
   manuelle, qui reste disponible pour les cas particuliers. */
.bloc-report-auto { display: flex; flex-wrap: wrap; gap: 12px;
  align-items: center; justify-content: space-between;
  background: var(--bleu-clair); border-radius: 8px; padding: 10px 14px;
  margin-bottom: 12px; }
.bloc-report-auto strong { display: inline-flex; align-items: center; gap: 7px;
  color: var(--bleu); }
.bloc-report-auto .aide { margin: 4px 0 0; max-width: 62ch; }
.avertissement-territoire { color: #8e2318; display: flex; align-items: baseline; gap: 5px; }
.avertissement-territoire .icone { color: inherit; flex: 0 0 auto; }
.report-actions { display: flex; align-items: center; gap: 8px; }
.report-actions input { margin: 0; }
.report-actions .bouton { display: inline-flex; align-items: center; gap: 7px; }
.sans-affichage { display: none; }

/* Evolutions : les formulaires dépliés restent dans le flux. */
.edition-evenement { margin: .6rem 0; text-align:left; }
.edition-evenement form, .formulaire-evolution { display:flex; flex-wrap:wrap; gap:.65rem; align-items:end; }
.edition-evenement label, .formulaire-evolution label { display:flex; flex-direction:column; gap:.25rem; }
.edition-evenement input, .edition-evenement textarea, .edition-evenement select { max-width:100%; min-width:0; }
.evenement-ligne { display:block; }
.evenement-ligne-resume { flex-wrap:wrap; }
.evenement-etat-editer { position:static; }
.evenement-etat-editer[open] { flex-basis:100%; }
.evenement-etat-editer .evenement-actions { position:static; width:auto; flex-wrap:wrap; box-shadow:none; }
.grille-heures { display:grid; grid-template-columns:repeat(auto-fit,minmax(210px,1fr)); gap:.8rem; margin:1rem 0; }
.grille-heures .carte { margin:0; }
.densite-secteur { border-left:8px solid rgba(31,78,121,var(--densite)); }
.cal-evenement { display:block; font-size:9px; line-height:1.25; margin-top:3px; padding:2px; border-radius:3px; background:rgba(255,255,255,.85); color:#173752; white-space:normal; overflow-wrap:anywhere; }
.cal-evenement.etat-annule, .cal-evenement.etat-reporte { text-decoration:line-through; color:#a42020; background:#fff0f0; }
#notifications-locales:not(:empty) { position:fixed; bottom:16px; right:16px; width:min(350px,90vw); max-height:30vh; overflow:auto; z-index:100; background:#fff; border:1px solid #b5c6d8; border-radius:12px; box-shadow:0 4px 20px #0002; padding:12px; }
.rappel-local { display:flex; gap:10px; justify-content:space-between; align-items:center; font-size:13px; padding:7px 0; }
.rappel-local button { font-size:20px; border:0; background:transparent; cursor:pointer; padding:5px 9px; }
dialog { max-width:500px; border:1px solid #b5c6d8; border-radius:12px; padding:24px; }
dialog::backdrop { background:#0005; }
@media print { #notifications-locales { display:none; } }
.formulaire-evenement-compact label { flex:1 1 100%; max-width:100%; font-size:.8rem; }
.formulaire-evenement-compact label input { width:100%; box-sizing:border-box; min-width:0; }
.formulaire-evenement-compact > input { max-width:100%; box-sizing:border-box; min-width:0; }
.case-tournee form { margin:0; }
.case-tournee button { background:transparent; color:inherit; border:0; padding:8px; cursor:pointer; min-width:30px; }
/* Révision interface : surfaces compactes et feedback non bloquant. */
.zone-calendrier .mois-bloc {box-sizing:border-box;flex:0 0 294px!important;width:294px;min-width:294px}
.zone-calendrier table.calendrier {table-layout:fixed;width:266px;border-collapse:collapse}
.zone-calendrier table.calendrier td,.zone-calendrier table.calendrier th {box-sizing:border-box;width:38px;min-width:38px;max-width:38px;height:38px;padding:0;overflow:hidden;text-align:center}
.zone-calendrier table.calendrier td[title] {cursor:help}
.formulaire-evolution {display:flex;align-items:flex-end;gap:12px;margin:14px 0}
.formulaire-evolution label {display:flex;flex-direction:column;gap:6px;margin:0;min-width:160px;flex:1}
.formulaire-evolution input,.formulaire-evolution select {height:40px;box-sizing:border-box;margin:0;width:100%}
.formulaire-evolution > button {height:40px;margin:0}
.secteur-acces {float:right;display:grid;place-items:center;width:56px;height:56px;border-radius:16px;background:#e3f0f9;color:#22587b;box-shadow:0 3px 12px #20577918;margin:0 0 16px 16px}
.secteur-acces:hover {background:#cde5f4;transform:translateY(-2px)}
.feedback-stack {position:fixed;right:24px;top:24px;z-index:3000;display:grid;gap:12px;width:min(410px,calc(100vw - 48px));pointer-events:none}
.popup-feedback,.popup-anniversaire {position:relative;background:#fff;color:#233d50;border:1px solid #dae6ef;border-left:5px solid #3083ad;border-radius:18px;box-shadow:0 16px 60px #163d5933;padding:22px 48px 18px 22px;pointer-events:auto;animation:popup-arrive .2s ease-out}
.popup-feedback p,.popup-anniversaire p {margin:10px 0 0;line-height:1.5}
.popup-feedback > button,.popup-anniversaire > button {position:absolute;right:10px;top:10px;background:#f0f5f8;border:0;border-radius:50%;width:30px;height:30px;cursor:pointer;font-size:22px}
.popup-anniversaire {position:fixed;top:50%;left:50%;transform:translate(-50%,-50%);z-index:3100;width:min(480px,calc(100vw - 80px));padding:30px 48px 30px 30px;border-left:5px solid #c893cf;background:linear-gradient(120deg,#fff,#f8f2fc)}
.popup-anniversaire strong {font-size:1.25rem}
.todo-ligne {display:flex;align-items:center;gap:16px;border-top:1px solid #e7edf2;padding:14px 0}
.todo-ligne > div {flex:1;min-width:0;overflow-wrap:anywhere}
.todo-ligne small {display:block;color:#677f90;margin-top:4px}
.todo-ligne form {margin:0}
.todo-ligne details[open] {flex:1}
.todo-check {border:1px solid #b7cede;background:#edf5fa;color:#205779;border-radius:10px;width:38px;height:38px;font-size:23px;cursor:pointer}
.annuel-techniciens {border-top:4px solid #458aad}
.annuel-techniciens .table-scroll {max-height:320px;overflow:auto}
.annuel-techniciens th {position:sticky;top:0;background:#edf4fa}
#carte-secteurs {height:520px;border-radius:16px;isolation:isolate;background:#eaf0f5}
#carte-interventions {height:520px;border-radius:16px;isolation:isolate;background:#eaf0f5}
.outils-capture-interventions{display:flex;align-items:center;justify-content:space-between;gap:16px;margin:10px 0 12px}
.legende-chaleur{display:flex;align-items:center;gap:9px;color:#536371;font-size:.78rem;font-weight:700}
.legende-chaleur i{display:block;width:min(270px,35vw);height:13px;border-radius:999px;border:1px solid rgba(25,70,95,.13);background:linear-gradient(90deg,#c9f3ff,#7ddcff,#35b8e8,#48c784,#d8dc45,#ffc13d,#ef7040,#c92f45)}
.synthese-departements{padding:24px;border-radius:18px;background:linear-gradient(145deg,#f5fbfd,#edf6f8);border:1px solid #d8e7eb}
.entete-synthese-dpt{display:flex;align-items:flex-end;justify-content:space-between;gap:20px;margin-bottom:20px}
.entete-synthese-dpt h2{margin:2px 0 0}.entete-synthese-dpt>strong{font-size:1.35rem;color:#165a78}
.sur-titre{margin:0;color:#61727d;font-size:.72rem;font-weight:800;text-transform:uppercase;letter-spacing:.1em}
.liste-departements{display:grid;grid-template-columns:repeat(auto-fit,minmax(230px,1fr));gap:12px}
.carte-departement{display:grid;grid-template-columns:36px minmax(0,1fr) auto;align-items:center;gap:12px;padding:15px;background:#fff;border:1px solid #dbe8ec;border-radius:14px;box-shadow:0 5px 14px rgba(23,72,94,.07)}
.rang-departement{display:grid;place-items:center;width:34px;height:34px;border-radius:10px;background:#e1f2f7;color:#145c79;font-weight:900}
.contenu-departement{min-width:0}.contenu-departement strong{display:block;color:#194d65}.contenu-departement small{color:#667984}
.barre-departement{height:8px;margin:7px 0 4px;border-radius:999px;background:#e9f0f2;overflow:hidden}.barre-departement i{display:block;height:100%;border-radius:inherit;background:linear-gradient(90deg,#37b8d9,#ef8b3b)}
.carte-departement>b{font-size:1.7rem;color:#174e68}
.repere-volume-interventions{background:transparent!important;border:0!important}
.repere-volume-interventions span{display:grid;place-items:center;width:34px;height:34px;border:2px solid #fff;border-radius:50%;background:#185c79;color:#fff;font-size:.78rem;font-weight:900;box-shadow:0 3px 10px rgba(11,48,67,.35);text-shadow:0 1px 1px rgba(0,0,0,.2)}
@media(max-width:700px){.outils-capture-interventions{align-items:stretch;flex-direction:column}.legende-chaleur{justify-content:center}.legende-chaleur i{width:55vw}.synthese-departements{padding:16px}.liste-departements{grid-template-columns:1fr}}
@media print{body *{visibility:hidden}.synthese-departements,.synthese-departements *{visibility:visible}.synthese-departements{position:absolute;inset:0;width:100%;border:0;background:#fff}.liste-departements{grid-template-columns:repeat(3,1fr)}.bouton-taches-flottant,.bouton-retour-haut{display:none!important}}
.entete-audits{align-items:flex-end}.grille-kpi-audits{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:14px;margin-bottom:18px}
.grille-kpi-audits article{display:flex;align-items:center;justify-content:space-between;gap:14px;border-left:5px solid #287da0}.grille-kpi-audits span{color:#596c77;font-weight:700}.grille-kpi-audits strong{font-size:1.8rem;color:#174f68}.grille-kpi-audits .audit-alerte{border-left-color:#dd7a43;background:#fff8f4}.grille-kpi-audits .audit-ok{border-left-color:#36a272;background:#f4fbf7}
.formulaire-audit{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:14px;align-items:end}.formulaire-audit label{min-width:0}.formulaire-audit input,.formulaire-audit select,.formulaire-audit textarea{width:100%;box-sizing:border-box}.audit-champ-large{grid-column:1/-1}
.liste-audits{display:grid;gap:12px}.audit-ligne{display:grid;grid-template-columns:42px minmax(190px,1fr) 65px auto;align-items:center;gap:14px;padding:14px;border:1px solid #dce6eb;border-left:5px solid #df7945;border-radius:14px;background:#fff}.audit-ligne.repondu{border-left-color:#31966b;background:#f7fcf9}.audit-etat{display:grid;place-items:center;width:34px;height:34px;border-radius:50%;background:#fff0e8;color:#b95026;font-weight:900}.audit-ligne.repondu .audit-etat{background:#dff4e8;color:#19734c}.audit-identite{display:grid;gap:3px}.audit-identite small{color:#657680}.audit-score{display:flex;align-items:baseline;justify-content:center}.audit-score strong{font-size:1.35rem}.audit-score small{color:#71818a}.audit-actions{display:flex;align-items:center;justify-content:flex-end;gap:7px;flex-wrap:wrap}.audit-actions form{margin:0}.audit-details{grid-column:2/-1}.compact-audit{grid-template-columns:repeat(4,minmax(0,1fr));margin-top:12px}.grille-audit-annuelle{display:grid;grid-template-columns:repeat(auto-fit,minmax(230px,1fr));gap:10px}.grille-audit-annuelle article{display:grid;gap:4px;padding:13px;border:1px solid #dce7eb;border-radius:12px;background:#f8fbfc}.grille-audit-annuelle span{color:#175a76;font-size:1.05rem;font-weight:800}.grille-audit-annuelle small{color:#687983}.audit-analyse-future{border-left:5px solid #7d68b3;background:#faf8ff}
@media(max-width:900px){.formulaire-audit{grid-template-columns:repeat(2,minmax(0,1fr))}.audit-ligne{grid-template-columns:42px 1fr 60px}.audit-actions,.audit-details{grid-column:2/-1;justify-content:flex-start}.compact-audit{grid-template-columns:repeat(2,minmax(0,1fr))}}
@media(max-width:600px){.grille-kpi-audits{grid-template-columns:1fr}.formulaire-audit,.compact-audit{grid-template-columns:1fr}.audit-champ-large{grid-column:auto}.audit-ligne{grid-template-columns:38px 1fr}.audit-score{grid-column:1}.audit-actions,.audit-details{grid-column:1/-1}.audit-actions .bouton,.audit-actions form{width:100%}.audit-actions form .bouton{width:100%}}
.entete-liste-audits{display:flex;align-items:center;justify-content:space-between;gap:16px;margin-bottom:14px}.entete-liste-audits h2,.entete-liste-audits p{margin-top:0}.liste-techniciens-audits{display:grid;gap:9px}
.technicien-audit{display:grid;grid-template-columns:44px minmax(190px,1fr) auto 42px;align-items:center;gap:12px;padding:11px 13px;border:1px solid #dce6eb;border-radius:13px;background:#fbfdfe}.technicien-audit.avec-attente{border-left:4px solid #df7945}.avatar-audit{display:grid;place-items:center;width:40px;height:40px;border-radius:12px;background:linear-gradient(145deg,#795dae,#5d468b);color:#fff;font-size:.78rem;font-weight:900;letter-spacing:.03em}.nom-audit{display:grid;gap:2px}.nom-audit small{color:#687984}.etat-audit-tech .badge.neutre{background:#edf2f4;color:#5f7079}.etat-audit-tech .badge.attention{background:#fff0e8;color:#a84f29}.audit-ajouter{color:#674d98;background:#f0ebf8!important;border-color:#d9ceec!important}
.bouton-icone{display:inline-grid;place-items:center;width:34px;height:34px;padding:0;border:1px solid #d4e0e6;border-radius:10px;background:#fff;color:#225b75;cursor:pointer;text-decoration:none}.bouton-icone:hover{background:#eaf4f8;border-color:#a9ccd9}.saisie-audit-tech,.audits-tech-existants{grid-column:2/-1}.saisie-audit-tech{padding:13px;border-radius:12px;background:#f3f0f8;border:1px solid #ddd4ed}.saisie-audit-principale{display:grid;grid-template-columns:repeat(5,minmax(105px,1fr)) auto;align-items:end;gap:10px}.saisie-audit-principale label{min-width:0}.saisie-audit-principale input{width:100%;box-sizing:border-box}.bouton-fichier-audit{display:flex!important;align-items:center;justify-content:center;gap:7px;min-height:39px;padding:0 12px;border:1px dashed #8e78b5;border-radius:9px;background:#fff;color:#674e94;font-weight:800;cursor:pointer;white-space:nowrap}.bouton-fichier-audit input{position:absolute;width:1px!important;height:1px;opacity:0}.audit-options{margin-top:10px}.audit-options summary{color:#5f4a88;font-size:.82rem;font-weight:800;cursor:pointer}.audit-textes{display:grid;grid-template-columns:1fr 1fr;gap:10px;margin-top:10px}.audit-textes textarea{width:100%;box-sizing:border-box}.ligne-actions-audit{display:flex;justify-content:flex-end;margin-top:10px}
.audits-tech-existants{display:grid;gap:6px;margin-top:2px}.audit-mini{display:grid;grid-template-columns:28px auto auto auto minmax(80px,1fr) auto;align-items:center;gap:9px;padding:7px 9px;border-radius:10px;background:#fff;border:1px solid #e0e8ec;font-size:.82rem}.audit-mini.attente{background:#fffaf7}.audit-mini.termine{background:#f6fcf8}.audit-mini-etat{display:grid;place-items:center;width:24px;height:24px;border-radius:50%;background:#ffe5d7;color:#a84c25;font-weight:900}.audit-mini.termine .audit-mini-etat{background:#dff3e7;color:#20734e}.audit-mini-actions{display:flex;gap:5px}.audit-mini-actions form{margin:0}.audit-mini-actions .bouton-icone{width:30px;height:30px;border-radius:8px}.audit-mini-detail{grid-column:1/-1;padding:11px;border-top:1px solid #e2eaee}.audit-mini-detail>form:last-child{margin-top:8px}
@media(max-width:1050px){.saisie-audit-principale{grid-template-columns:repeat(3,minmax(110px,1fr))}.audit-mini{grid-template-columns:28px auto auto minmax(90px,1fr) auto}.audit-mini>span:nth-of-type(3){display:none}}
@media(max-width:700px){.technicien-audit{grid-template-columns:42px 1fr 38px}.etat-audit-tech{grid-column:2}.audit-ajouter{grid-column:3;grid-row:1/3}.saisie-audit-tech,.audits-tech-existants{grid-column:1/-1}.saisie-audit-principale{grid-template-columns:1fr 1fr}.audit-textes{grid-template-columns:1fr}.audit-mini{grid-template-columns:28px auto 1fr auto}.audit-mini>span:not(.audit-mini-etat){display:none}.audit-mini-actions{grid-column:4}}
@keyframes popup-arrive {from{opacity:0}to{opacity:1}}
@media(max-width:700px){.todo-ligne{flex-wrap:wrap}.todo-ligne > div{flex-basis:65%}.formulaire-evolution label{min-width:130px}}

/* Suivi des heures V1 */
.entete-page-heures,.titre-section-heures{display:flex;justify-content:space-between;align-items:flex-start;gap:20px;flex-wrap:wrap}
.entete-page-heures .ligne-filtre{margin-left:auto;align-items:flex-end}
.indicateurs-heures{grid-template-columns:repeat(auto-fit,minmax(155px,1fr))}
.indicateur{display:grid;gap:8px;border-top:4px solid var(--bleu,#1784c7)}
.indicateur strong{font-size:1.35rem}.indicateur.positif{border-color:#2f9e67}.indicateur.negatif{border-color:#d95858}.indicateur.accent{border-color:#8b5cf6}
.badge-info{display:inline-flex;align-items:center;padding:6px 10px;border-radius:999px;background:#e8f5fb;color:#14668c;font-size:.82rem;font-weight:700}
.case-simple{display:flex!important;grid-template-columns:auto 1fr!important;flex-direction:row!important;align-items:center!important;align-self:center;white-space:nowrap}
.case-simple input{width:auto!important;height:auto!important}
.calendriers-heures{display:grid;grid-template-columns:repeat(4,minmax(180px,1fr));gap:12px;margin:18px 0}
.mini-mois{border:1px solid #dce4ea;border-radius:12px;padding:10px;background:#fff}.mini-mois>strong{display:block;text-align:center;margin-bottom:6px}
.semaine-entete,.semaine-heures{display:grid;grid-template-columns:repeat(7,1fr);gap:2px}.semaine-entete span{text-align:center;font-size:.72rem;font-weight:700;color:#667}
.semaine-heures span{display:grid;place-items:center;aspect-ratio:1;border-radius:5px;font-size:.75rem}.semaine-heures .hors-mois{opacity:0}.semaine-heures .jour-supp{background:#f2d6ff;color:#67217b;font-weight:800}.semaine-heures .jour-supp.valide{background:#d8f3e5;color:#176943}
.liste-supp{display:grid;gap:9px;margin-top:12px}.ligne-supp{display:flex;align-items:center;gap:12px;flex-wrap:wrap;padding:10px 12px;border:1px solid #dde5eb;border-left:4px solid #9163cb;border-radius:9px}.ligne-supp.validee_m1{border-left-color:#2f9e67}.ligne-supp.annulee{opacity:.62}.ligne-supp>div{display:grid;min-width:220px;flex:1}.validation-horaire{display:flex;align-items:end;gap:6px;flex-wrap:wrap}.validation-horaire label{display:grid;gap:3px;font-size:.72rem}.validation-horaire input{width:92px}
.alerte-texte{color:#a33131}.table-responsive{overflow-x:auto}
.etat-lucca{display:flex;justify-content:space-between;align-items:center;gap:12px;margin:14px 0;padding:13px 16px;border-radius:12px;background:#e6f6ed;color:#176943;border:1px solid #9ed9ba}.etat-lucca.retard{background:#fff0e8;color:#a54621;border-color:#f0b89e}.etat-lucca strong{font-size:1.05rem}.badge-retard{background:#fff0e8;color:#a54621}.grille-modulation-recuperation{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:14px}.grille-modulation-recuperation>.carte{margin:0}.ligne-compacte{display:flex;justify-content:space-between;align-items:center;gap:10px;padding:8px 0;border-top:1px solid #e4e9ed}.edition-hs{min-width:100%}.edition-hs>summary{cursor:pointer;color:#176a91;font-weight:700}
.contingent-heures{border-left:5px solid #2f9e67}.contingent-heures.niveau-vigilance{border-left-color:#e5a72a}.contingent-heures.niveau-alerte,.contingent-heures.niveau-depasse{border-left-color:#d64b4b}.contingent-entete,.contingent-legende{display:flex;justify-content:space-between;align-items:center;gap:15px;flex-wrap:wrap}.contingent-entete strong{font-size:1.35rem}.jauge-contingent{height:14px;margin:14px 0 8px;border-radius:999px;background:#e8edf1;overflow:hidden}.jauge-contingent span{display:block;height:100%;border-radius:inherit;background:linear-gradient(90deg,#2f9e67 0 75%,#e5a72a 75% 90%,#d64b4b 90%)}.contingent-legende{font-size:.84rem;color:#5f6972}.grille-resumes-partis{display:grid;grid-template-columns:repeat(auto-fit,minmax(260px,1fr));gap:8px;margin-top:12px}.grille-resumes-partis article{display:grid;gap:4px;padding:10px;border:1px solid #dde5eb;border-radius:9px;background:#f8fafb}.grille-resumes-partis small{color:#65717b}
@media(max-width:1100px){.calendriers-heures{grid-template-columns:repeat(3,1fr)}}
@media(max-width:750px){.calendriers-heures{grid-template-columns:repeat(2,1fr)}.entete-page-heures .ligne-filtre{margin-left:0}}
@media(max-width:850px){.grille-modulation-recuperation{grid-template-columns:1fr}.etat-lucca{align-items:flex-start;flex-direction:column}}
@media(max-width:460px){.calendriers-heures{grid-template-columns:1fr}}
@media(prefers-reduced-motion:reduce){.popup-feedback,.popup-anniversaire{animation:none}}
.confirmation-design {border:1px solid #d6e3ee;border-radius:22px;padding:30px;max-width:480px;box-shadow:0 25px 90px #122f5540;color:#253f52}
.confirmation-design::backdrop {background:#17354d50;backdrop-filter:blur(3px)}
.confirmation-design button {margin-right:10px;margin-top:12px}
input:not([type]),textarea {border:1px solid #cddce8;border-radius:7px;padding:8px 10px;font:inherit;box-sizing:border-box;background:#fff;color:#233d50}
input:focus,select:focus,textarea:focus {outline:2px solid #5596c1;outline-offset:2px}
.rappel-local a {color:#275e84;text-decoration:none;line-height:1.4}
.rappel-local a:hover {text-decoration:underline}
.rappel-local button {flex:none}

/* V4 : états terminés et priorités visibles sans dépendre de la couleur seule. */
.todo-realisee {background:#eff9f2;border-left:4px solid #309560;padding-left:12px;border-radius:9px}
.todo-realisee .todo-check {background:#278353;color:white;border-color:#278353}
.todo-attention {background:#fff7e9;border-left:4px solid #d18a16;padding-left:12px;border-radius:9px}
.badge-realise,.badge-attention,.importance-tache {display:inline-block;border-radius:20px;padding:4px 9px;font-size:.76rem;font-weight:700;margin:4px 4px 0 0}
.badge-realise {background:#d6efdf;color:#1d6540}
.badge-attention {background:#ffebc6;color:#785000}
.importance-faible {background:#edf0f4;color:#53677a}
.importance-normale {background:#e6f0f9;color:#285d84}
.importance-haute {background:#fff0d4;color:#865000}
.importance-urgente {background:#ffe1e5;color:#9e2541}
.annuel-techniciens > summary {cursor:pointer;color:#245b80;padding:8px 0}
/* V5 : actions directes et pictogrammes cohérents. */
.pastille-blocnote {background:#376a8c}
.icone-blocnote,.icone-report,.icone-retour,.icone-priorite-faible,.icone-priorite-normale,.icone-priorite-haute {vertical-align:middle}
.outils-fiches {display:flex;float:right;gap:10px;margin:0 0 16px 18px}
.outils-fiches .secteur-acces {float:none;margin:0}
.gateau-nom {display:inline-flex;color:#a74183;vertical-align:middle;margin-left:5px}
.logo-marque-auto {width:32px;height:32px;display:inline-flex;align-items:center;justify-content:center;vertical-align:middle;background:#fff;border:1px solid #dce5ed;border-radius:9px;margin-right:5px;color:#264860;flex-shrink:0}
.logo-marque-auto img {object-fit:contain;width:24px;height:24px}
.action-tache {display:grid;place-items:center;width:38px;height:38px;border:1px solid #cedfea;background:#f4f8fb;border-radius:10px;color:#235877;cursor:pointer}
.action-tache:hover {background:#deedf7}
.supprimer-tache {color:#ad3b4a}
.supprimer-tache:hover {background:#ffe9eb}
.importance-tache .icone {vertical-align:middle;margin-right:3px}
.calendrier-partage {color:white!important;text-shadow:0 1px 2px #142f4b,0 0 2px #142f4b;font-weight:700}
@media(max-width:700px){.outils-fiches{float:none;margin-left:0}.todo-ligne details{max-width:100%}}

.icone-a-faire {vertical-align:middle}
/* Mise à jour UI : paramètres globaux, comparaison région et raccourcis */
.groupe-parametres{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:16px;align-items:start}
.groupe-parametres>.groupe-entete,.groupe-parametres>.aide,.groupe-parametres>.carte:only-of-type{grid-column:1/-1}
.groupe-parametres .parametre{margin:0;height:100%}
.invitation-parametres .grille-champs{grid-template-columns:repeat(2,minmax(0,1fr))}
.enregistrement-parametres-flottant{position:sticky;bottom:14px;z-index:20;margin:22px auto 12px;padding:12px 16px;max-width:760px;border:1px solid rgba(35,91,120,.2);border-radius:16px;background:rgba(255,255,255,.96);box-shadow:0 10px 35px rgba(24,48,64,.2);display:flex;align-items:center;justify-content:space-between;gap:16px;backdrop-filter:blur(9px)}
.enregistrement-parametres-flottant span{color:#60717c;font-size:.9rem}
.bouton-controle-vehicule{background:linear-gradient(135deg,#147c63,#20a77f);box-shadow:0 5px 14px rgba(20,124,99,.25)}
.comparaison-region{border-left:5px solid #235b78}
.comparaison-region-entete{display:flex;justify-content:space-between;gap:20px;align-items:flex-start}
.comparaison-region-entete h2{margin:0 0 4px}
.comparaison-region-grille{display:grid;grid-template-columns:repeat(6,minmax(0,1fr));gap:10px;margin-top:16px}
.comparaison-region-grille>div{padding:13px;border-radius:12px;background:#f3f7fa;text-align:center}
.comparaison-region-grille span,.comparaison-region-grille small{display:block;color:#647783;font-size:.75rem}
.comparaison-region-grille strong{display:block;margin:5px 0;font-size:1.5rem;color:#173f55}
.camembert-anomalies-zone{display:flex;align-items:center;gap:22px;padding:8px 4px 20px}
.camembert-anomalies{width:150px;height:150px;border-radius:50%;position:relative;flex:0 0 auto}
.camembert-anomalies:after{content:"";position:absolute;inset:31px;background:#fff;border-radius:50%}
.camembert-anomalies span{position:absolute;inset:0;z-index:1;display:grid;place-items:center;font-size:1.35rem;font-weight:750;color:#24495d}
.legende-camembert{display:grid;gap:7px;font-size:.8rem}.legende-camembert span{display:flex;align-items:center;gap:7px}.legende-camembert i{width:9px;height:9px;border-radius:50%;flex:0 0 auto}
.camembert-generique-zone{display:flex;align-items:center;justify-content:center;gap:24px}.camembert-generique{width:138px;height:138px;border-radius:50%;position:relative;flex:none}.camembert-generique:after{content:"";position:absolute;inset:29px;background:#fff;border-radius:50%}.camembert-generique span{position:absolute;inset:0;display:grid;place-items:center;z-index:1;font-size:1.25rem;font-weight:750;color:#24495d}.camembert-data{max-width:520px}.avancement-parc{position:relative}.camembert-parc{margin-top:18px;padding-top:16px;border-top:1px solid var(--bordure)}
.ouverture-messagerie{max-width:680px;margin:8vh auto;text-align:center;padding:38px}.ouverture-messagerie .bouton{margin:8px 4px}.ouverture-icone{width:70px;height:70px;margin:0 auto 14px;border-radius:20px;background:#e8f3f7;color:#235b78;display:grid;place-items:center}
@media(max-width:950px){.groupe-parametres,.invitation-parametres .grille-champs{grid-template-columns:1fr}.comparaison-region-grille{grid-template-columns:repeat(2,1fr)}}

/* V6.4 — en-têtes et formulaires stabilisés sur les écrans opérationnels. */
.entete-cockpit{align-items:flex-start}
.entete-cockpit>.barre-entete{margin-left:auto;align-self:flex-start;display:flex;flex-flow:row nowrap;align-items:flex-end;justify-content:flex-end;gap:10px 12px;width:auto}
.barre-entete .filtre-champ{flex:0 1 auto;min-width:0}
.barre-entete .filtre-champ select{min-width:150px;max-width:235px}
.barre-entete>a,.barre-entete>button{align-self:flex-end;white-space:nowrap;min-height:40px;display:inline-flex;align-items:center}
.barre-entete .lien-discret{min-height:40px;padding:0 5px}

.ligne-presentiel{display:grid;grid-template-columns:minmax(185px,1fr) minmax(365px,460px) minmax(88px,auto);align-items:center;gap:12px}
.presentiel-saisie{display:grid;grid-template-columns:minmax(155px,1fr) 108px 92px;align-items:center;gap:8px;width:100%;margin:0}
.presentiel-saisie input{box-sizing:border-box;width:100%;min-width:0;margin:0;height:38px}
.presentiel-saisie .bouton{box-sizing:border-box;width:92px;min-width:92px;height:38px;padding:6px 9px;white-space:nowrap}
.actions-presentiel{justify-self:end;white-space:nowrap}

.avancement-parc{position:relative}
.avancement-resume{display:flex;align-items:flex-start;justify-content:space-between;gap:20px;margin-bottom:16px}
.avancement-resume .avancement-entete{flex:1;min-width:0;padding-right:0}
.avancement-resume .camembert-parc{position:static;flex:0 0 auto;margin:0;padding:0;border:0;display:flex;align-items:center;gap:9px}
.avancement-resume .camembert-parc .camembert-generique{width:72px;height:72px}
.avancement-resume .camembert-parc .camembert-generique:after{inset:16px}
.avancement-resume .camembert-parc .camembert-generique span{font-size:.8rem}

@media(max-width:1050px){
  .entete-cockpit{flex-wrap:wrap}
  .entete-cockpit>.barre-entete{width:100%;justify-content:flex-end}
  .ligne-presentiel{grid-template-columns:minmax(170px,1fr) minmax(345px,1.7fr) auto}
}
@media(max-width:760px){
  .entete-cockpit>.barre-entete{flex-wrap:wrap;justify-content:flex-start}
  .barre-entete .filtre-champ{flex:1 1 145px}
  .barre-entete .filtre-champ select{width:100%;max-width:none}
  .ligne-presentiel{grid-template-columns:1fr}
  .presentiel-saisie{grid-template-columns:minmax(140px,1fr) 105px 92px}
  .actions-presentiel{justify-self:start}
  .avancement-resume{align-items:center}
}
@media(max-width:520px){
  .presentiel-saisie{grid-template-columns:1fr 1fr}
  .presentiel-saisie .bouton{grid-column:1/-1;width:100%}
  .avancement-resume{align-items:flex-start;flex-direction:column}
}

/* V6.5 — socle UI commun issu de l'audit. */
:root{
  --espace-1:4px;--espace-2:8px;--espace-3:12px;--espace-4:16px;--espace-5:24px;--espace-6:32px;
  --rayon-champ:9px;--rayon-carte:16px;--focus:#0b72b9;--hauteur-action:40px;
}
*,*::before,*::after{box-sizing:border-box}
html{scroll-behavior:smooth}
body{overflow-x:hidden}
.acces-rapide{position:fixed;left:12px;top:8px;z-index:10000;transform:translateY(-160%);padding:10px 14px;border-radius:9px;background:#173f55;color:#fff;font-weight:700}
.acces-rapide:focus{transform:translateY(0)}
:where(a,button,input,select,textarea,summary,[tabindex]):focus-visible{outline:3px solid color-mix(in srgb,var(--focus) 70%,white);outline-offset:2px}
:where(button,.bouton,.action-tache,.lien-icone){min-height:var(--hauteur-action)}
:where(input,select,textarea,button){font:inherit}
:where(input:not([type=checkbox]):not([type=radio]):not([type=hidden]),select,textarea){max-width:100%;min-width:0}
:where(form){min-width:0}
:where(form)>*{min-width:0}

.form-grid,.formulaire-evolution,.formulaire-vehicule,.grille-champs{display:grid;grid-template-columns:repeat(auto-fit,minmax(min(220px,100%),1fr));gap:var(--espace-3);align-items:end}
.form-grid label,.formulaire-evolution label,.formulaire-vehicule label,.grille-champs label,.filtre-champ{display:grid;gap:6px;min-width:0}
.champ-large{grid-column:1/-1}
.form-actions{display:flex;justify-content:flex-end;align-items:center;flex-wrap:wrap;gap:var(--espace-2)}
.form-compact{display:inline-flex;margin:0}
.titre-carte{margin-top:0}
.titre-sans-marge{margin:0}
.espace-haut{margin-top:12px}
.espace-bas-zero{margin-bottom:0}
.texte-preligne{white-space:pre-line}
.valeur-positive{color:var(--vert)}.valeur-negative{color:var(--rouge)}.valeur-info{color:#1565c0}.valeur-violette{color:#6a1b9a}
.champ-nombre-court{width:90px!important;flex:0 0 90px}
.champ-flexible{flex:1 1 180px}
.champ-fichier-large{min-width:min(340px,100%)}
.carte-accentuee{border-left:4px solid var(--bleu)}
.espace-bas{margin-bottom:14px}.espace-bas-court{margin-bottom:12px}
.summary-action{cursor:pointer;color:var(--bleu);font-weight:600}
.verdict-import{padding:10px 14px;border-radius:8px;font-weight:600;margin-top:0}
.verdict-succes{background:#e3f6e9;color:#1e8a4c}.verdict-info{background:#eaf1f8;color:#1f4e79}.verdict-attention{background:#fff3cd;color:#765b10}.verdict-erreur{background:#fdecea;color:#a92f25}
.entete-cockpit>form.ligne-filtre{margin-left:auto;align-self:flex-start;display:flex;flex-flow:row wrap;justify-content:flex-end;align-items:flex-end;gap:10px 12px}
.entete-cockpit>form.ligne-filtre>div,.entete-cockpit>form.ligne-filtre>.filtre-champ{display:grid;gap:5px}
.entete-cockpit>form.ligne-filtre>a,.entete-cockpit>form.ligne-filtre>button{align-self:flex-end;white-space:nowrap}

.tableau-defilant{width:100%;max-width:100%;overflow:auto;overscroll-behavior-inline:contain;border-radius:12px;scrollbar-gutter:stable}
.tableau-defilant:focus-visible{outline-offset:3px}
.tableau-defilant table{margin:0;min-width:max(100%,680px)}
.tableau-defilant thead th{position:sticky;top:0;z-index:2;background:#edf4fa;box-shadow:0 1px 0 var(--bordure)}
.tableau-defilant tbody tr:nth-child(even){background:rgba(235,243,248,.38)}
.tableau-defilant tbody tr:hover{background:#eef7fb}
.tableau-defilant td:first-child,.tableau-defilant th:first-child{padding-left:14px}
.tri-tableau{width:100%;min-height:34px;padding:2px 18px 2px 0;border:0;background:transparent;color:inherit;text-align:left;font-weight:inherit;cursor:pointer;position:relative}
.tableau-triable{font-variant-numeric:tabular-nums}
.tri-tableau::after{content:"↕";position:absolute;right:2px;opacity:.45}
.tri-tableau[aria-sort=ascending]::after{content:"↑";opacity:1}.tri-tableau[aria-sort=descending]::after{content:"↓";opacity:1}
.etat-vide{padding:14px 16px;border:1px dashed #bfd0db;border-radius:10px;background:#f7fafc;color:#526975}

form.en-cours{opacity:.78;pointer-events:none}
.chargement{position:relative;padding-right:34px!important}
.chargement::after{content:"";position:absolute;right:11px;width:14px;height:14px;border:2px solid currentColor;border-right-color:transparent;border-radius:50%;animation:rotation-ui .7s linear infinite}
@keyframes rotation-ui{to{transform:rotate(360deg)}}

.enregistrement-parametres-flottant button:disabled{opacity:.52;cursor:not-allowed;box-shadow:none}
.enregistrement-parametres-flottant.modifie{border-color:#e3a72f;background:#fffaf0}
.enregistrement-parametres-flottant.modifie span{color:#7b560c;font-weight:700}

.etat-vide,.carte>p:only-child{line-height:1.55}
.confirmation-design{width:min(480px,calc(100vw - 32px))}
.confirmation-design h2{margin-top:0}
.popup-feedback,.popup-anniversaire{max-width:min(440px,calc(100vw - 28px))}

@media(max-width:1199px){
  .contenu{padding-inline:18px}
  .entete-cockpit{position:static}
  .grille-kpi,.grille-synthese{grid-template-columns:repeat(2,minmax(0,1fr))}
}
@media(max-width:699px){
  html{scroll-behavior:auto}
  .contenu{padding-inline:10px}
  .carte{border-radius:12px;padding:14px}
  .ligne-filtre,.barre-filtres{display:grid;grid-template-columns:1fr;width:100%}
  .ligne-filtre :where(input,select,.bouton),.barre-filtres :where(input,select,.bouton){width:100%;max-width:none}
  .grille-kpi,.grille-synthese{grid-template-columns:1fr}
  .tableau-defilant{border:1px solid var(--bordure)}
  .tableau-defilant::after{content:"Faire défiler horizontalement si nécessaire";display:block;position:sticky;left:0;padding:5px 9px;color:var(--gris);font-size:.72rem;background:#f7fafc}
  .enregistrement-parametres-flottant{bottom:8px;margin-inline:0;padding:10px 12px}
  .enregistrement-parametres-flottant span{font-size:.78rem}
}
@media(prefers-reduced-motion:reduce){
  *,*::before,*::after{scroll-behavior:auto!important;animation-duration:.01ms!important;animation-iteration-count:1!important;transition-duration:.01ms!important}
}

/* V6.6 — calendriers mensuels complets et micro-corrections d'ergonomie. */
.calendriers{grid-template-columns:repeat(auto-fit,minmax(250px,1fr));overflow:visible;max-width:100%}
.calendriers .mois-bloc{flex:initial!important;min-width:0!important;width:auto!important;max-width:100%}
.calendriers table.calendrier{width:100%;min-width:0;table-layout:fixed}
.calendriers table.calendrier th,.calendriers table.calendrier td{width:14.285%;min-width:0;max-width:none}
td.actions .saisie-ajustement-cp .bouton{width:32px;min-width:32px;min-height:30px;height:30px;padding:0;display:inline-grid;place-items:center;line-height:1;text-align:center}
.popup-feedback>button,.popup-anniversaire>button{box-sizing:border-box;width:30px;min-width:30px;height:30px;min-height:30px;aspect-ratio:1;padding:0;display:grid;place-items:center;line-height:1;border-radius:50%}
.choix-outlook-retour{display:inline-flex;margin-top:20px;align-items:center;justify-content:center}
@media(max-width:699px){.calendriers{grid-template-columns:1fr}.calendriers table.calendrier th,.calendriers table.calendrier td{height:36px;font-size:.78rem}}

/* V6.7 — chaque module conserve son mode de lecture adapté. */
.zone-calendrier .calendriers.en-bande{display:flex;flex-wrap:nowrap;overflow-x:auto;overflow-y:hidden;scroll-snap-type:x proximity}
.zone-calendrier .calendriers.en-bande .mois-bloc{flex:0 0 294px!important;width:294px!important;min-width:294px!important;scroll-snap-align:start}
.zone-calendrier .calendriers.en-bande table.calendrier{width:266px}
.calendrier-conges .calendriers{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:14px;align-items:start}
.calendrier-conges .mois-bloc{width:100%!important;min-width:0!important}
.calendrier-conges table.calendrier{width:100%;min-width:0;table-layout:fixed}
@media(max-width:1100px){.calendrier-conges .calendriers{grid-template-columns:repeat(3,minmax(0,1fr))}}
@media(max-width:820px){.calendrier-conges .calendriers{grid-template-columns:repeat(2,minmax(0,1fr))}}
@media(max-width:520px){.calendrier-conges .calendriers{grid-template-columns:1fr}}

/* V6.8 — informations du jour compactes dans l'en-tête. */
.entete-haut{gap:18px}
.infos-jour{display:flex;align-items:center;justify-content:center;gap:9px;margin-left:auto;color:#fff;min-width:0}
.date-jour-wrap{position:relative}
.date-jour{display:grid;gap:1px;min-height:46px;padding:6px 12px;border:1px solid rgba(255,255,255,.2);border-radius:13px;background:rgba(255,255,255,.1);color:#fff;text-align:left;cursor:help;white-space:nowrap}
.date-jour:hover,.date-jour:focus-visible{background:rgba(255,255,255,.18)}
.date-jour>span{font-size:.84rem;font-weight:700}.date-jour>small{font-size:.69rem;color:rgba(255,255,255,.75)}
.ephemeride-jour{position:absolute;z-index:100;left:50%;top:calc(100% + 9px);width:max-content;max-width:min(330px,calc(100vw - 24px));padding:11px 13px;border:1px solid #d9e5ec;border-radius:11px;background:#fff;color:#274355;box-shadow:0 12px 36px rgba(13,38,55,.28);display:grid;gap:4px;font-size:.76rem;opacity:0;visibility:hidden;transform:translate(-50%,-4px);transition:.16s ease;pointer-events:none}
.ephemeride-jour::before{content:"";position:absolute;left:50%;top:-5px;width:10px;height:10px;background:#fff;border-left:1px solid #d9e5ec;border-top:1px solid #d9e5ec;transform:translateX(-50%) rotate(45deg)}
.date-jour-wrap:hover .ephemeride-jour,.date-jour-wrap:focus-within .ephemeride-jour{opacity:1;visibility:visible;transform:translate(-50%,0)}
.meteo-header{display:flex;align-items:center;gap:5px;min-width:0}
.meteo-item{display:grid;grid-template-columns:auto auto;grid-template-rows:auto auto;align-items:center;column-gap:3px;min-width:51px;padding:5px 7px;border-radius:11px;background:rgba(255,255,255,.1);line-height:1}
.meteo-icone{grid-row:1/3;font-size:1.15rem}.meteo-item strong{font-size:.82rem}.meteo-item small{font-size:.63rem;color:rgba(255,255,255,.7)}
.meteo-chargement::after{content:"Météo…";font-size:.7rem;color:rgba(255,255,255,.7)}
.meteo-indisponible{font-size:.68rem;color:rgba(255,255,255,.7)}
@media(max-width:1050px){.entete-haut{flex-wrap:wrap}.infos-jour{order:3;width:100%;margin:0;justify-content:flex-start}.entete-controles{margin-left:auto}}
@media(max-width:650px){.entete-haut{padding-inline:12px}.entete-controles{width:100%;justify-content:space-between}.selecteur-contexte .region{display:none}.selecteur-contexte select{min-width:0;max-width:210px}.infos-jour{overflow-x:auto;padding-bottom:2px}.date-jour{position:sticky;left:0;z-index:2;background:#285b86}.meteo-item{flex:none}}

/* V7.2 — accès global aux tâches et situation AT mensuelle. */
.panneau-taches-global{position:fixed;right:18px;bottom:66px;z-index:850;display:grid;justify-items:end;gap:8px}.declencheur-taches{display:flex;align-items:center;gap:8px;padding:10px 14px;border:0;border-radius:16px;background:#173f55;color:#fff;box-shadow:0 8px 25px rgba(15,48,68,.28);cursor:pointer;font-weight:750}.declencheur-taches strong{display:grid;place-items:center;min-width:22px;height:22px;border-radius:50%;background:#ef9c35;color:#263238;font-size:.75rem}
.contenu-taches-rapides{width:min(410px,calc(100vw - 24px));max-height:min(620px,calc(100vh - 100px));overflow:auto;border:1px solid #cbdce6;border-radius:18px;background:#fff;box-shadow:0 18px 48px rgba(14,40,57,.25)}.contenu-taches-rapides>header{display:flex;align-items:center;justify-content:space-between;gap:14px;padding:15px 16px;border-bottom:1px solid #e1e9ee;background:#f5f9fb}.contenu-taches-rapides>header div{display:grid}.contenu-taches-rapides>header small{color:var(--gris)}.contenu-taches-rapides>header a{font-size:.76rem;font-weight:700}.rappels-rapides{padding:8px 14px;background:#fff7e5;color:#72520a}.rappels-rapides p{margin:5px 0;font-size:.82rem}
.liste-taches-rapides{padding:8px 12px}.liste-taches-rapides form{display:flex;align-items:center;gap:9px;padding:7px 2px;border-bottom:1px solid #edf2f5}.liste-taches-rapides form>button{display:grid;place-items:center;width:28px;min-width:28px;min-height:28px;height:28px;padding:0;border:1px solid #98b6c7;border-radius:50%;background:#fff;color:#267249;cursor:pointer}.liste-taches-rapides span{display:flex;align-items:center;gap:8px;min-width:0;overflow-wrap:anywhere;font-size:.86rem}.liste-taches-rapides b{width:8px;height:8px;border-radius:50%;background:#7d93a0}.liste-taches-rapides .importance-haute{background:#e98924}.liste-taches-rapides .importance-urgente{background:#c43c35}.liste-taches-rapides .importance-faible{background:#68a1c2}
.ajout-tache-rapide{display:grid;grid-template-columns:minmax(0,1fr) 100px auto;gap:7px;padding:12px;border-top:1px solid #dce7ed;background:#fafcfd}.ajout-tache-rapide :where(input,select,button){min-height:38px}.situation-at{display:flex;align-items:end;justify-content:space-between;gap:16px;flex-wrap:wrap}.situation-at form{margin:0}.situation-at form label{display:grid;gap:5px}@media(max-width:600px){.panneau-taches-global{right:8px;bottom:60px}.retour-haut{right:8px;bottom:8px}.ajout-tache-rapide{grid-template-columns:1fr 96px}.ajout-tache-rapide button{grid-column:1/-1}.contenu-taches-rapides{max-height:70vh}}

/* V7.3 — compteur AT intégré aux KPI du cockpit. */
.kpi-at{transition:background .16s ease,border-color .16s ease}.kpi-at-ok{background:#e8f6ed!important;border-color:#add9bc!important}.kpi-at-alerte{background:#fdebea!important;border-color:#efb8b4!important}.compteur-at{display:flex;align-items:center;justify-content:center;gap:10px}.commandes-at{display:grid;gap:3px}.compteur-at form{margin:0}.compteur-at button{display:grid;place-items:center;width:26px;min-width:26px;height:22px;min-height:22px;padding:0;border:0;border-radius:7px;background:rgba(255,255,255,.78);color:#244c61;cursor:pointer;font-size:.66rem;line-height:1}.compteur-at button:hover{background:#fff;box-shadow:0 2px 8px rgba(20,55,72,.18)}.compteur-at button:disabled{opacity:.3;cursor:not-allowed;box-shadow:none}.kpi-at small{display:block;margin-top:5px;color:#536b76;font-size:.72rem;font-weight:650}

/* V8.0 — studio du lancement de journée. */
.lancement-entete{align-items:flex-start}.barre-lancement-actions{display:flex;align-items:center;justify-content:flex-end;gap:10px;flex-wrap:wrap;margin-bottom:16px}.studio-lancement{display:grid;grid-template-columns:minmax(420px,1fr) minmax(340px,520px);gap:22px;align-items:start}.editeur-lancement{display:grid;gap:15px}.editeur-lancement>.carte{margin:0}.editeur-lancement h2{display:flex;align-items:center;justify-content:space-between;gap:12px;margin-top:0}.editeur-lancement label{display:grid;gap:6px;margin-top:10px}.source-manuel,.source-mixte{font-size:.7rem;font-weight:700;padding:5px 8px;border-radius:999px}.source-manuel{background:#fde9e7;color:#9f332d}.source-mixte{background:#fff1c7;color:#705000}.choix-themes{display:grid;grid-template-columns:repeat(3,1fr);gap:8px}.theme-option{margin:0!important}.theme-option input{position:absolute;opacity:0}.theme-option span{display:grid;place-items:center;min-height:58px;padding:9px;border:2px solid var(--bordure);border-radius:13px;text-align:center;cursor:pointer;font-size:.82rem;font-weight:700}.theme-option input:checked+span{border-color:var(--bleu);background:#e8f2f8;color:var(--bleu)}.ligne-departement{display:grid;grid-template-columns:minmax(110px,1fr) 100px 38px;gap:7px;margin-bottom:7px}.bouton-icone{display:grid;place-items:center;border:1px solid var(--bordure);border-radius:9px;background:#fff;color:var(--rouge);cursor:pointer}.tendance-saisie{display:grid;align-content:center;gap:4px;padding:11px 14px;border-radius:11px;background:#edf4f7}.tendance-saisie small{color:var(--gris)}.tendance-hausse{color:#17713d}.tendance-baisse{color:#b53b34}.tendance-stable{color:#426879}.suggestion-objectif{padding:10px 12px;border-left:4px solid #e1a922;background:#fff7dd}.actions-validation{position:sticky;bottom:10px;z-index:10;display:flex;justify-content:flex-end;gap:10px;padding:12px;border:1px solid var(--bordure);border-radius:14px;background:rgba(255,255,255,.95);box-shadow:0 7px 22px rgba(20,50,70,.12)}
.apercu-lancement-wrap{position:sticky;top:12px;display:grid;gap:7px;justify-items:center}.apercu-titre{width:100%;display:flex;justify-content:space-between}.apercu-lancement{width:min(100%,450px);min-height:800px;padding:20px;overflow:hidden;display:grid;gap:10px;color:#173f55;background:#f6f0e7;border-radius:23px;box-shadow:0 17px 42px rgba(17,52,73,.22);grid-template-columns:1.18fr .82fr;grid-template-areas:"head head" "org perf" "motive perf" "client vip" "safety safety" "goal goal" "foot foot"}.apercu-lancement>header{grid-area:head;display:flex;justify-content:space-between;align-items:start;min-width:0}.apercu-lancement header h2{margin:2px 0;font-size:1.65rem;line-height:.96}.apercu-lancement header p{margin:5px 0;font-size:.72rem;font-weight:700}.meteo-visuel{display:grid;justify-items:end;gap:2px;font-size:.72rem;font-weight:800}.meteo-visuel span{padding:4px 6px;border-radius:999px;background:rgba(255,255,255,.82);color:#173f55}.bloc-lancement{min-width:0;min-height:0;padding:11px 12px;border-radius:18px;background:#fff;color:#173f55;overflow:hidden}.bloc-lancement h3{margin:0 0 6px;color:#176084;font-size:.8rem;text-transform:uppercase}.bloc-lancement p{margin:0;font-size:.76rem;line-height:1.3;overflow-wrap:anywhere}.bloc-organisation{grid-area:org}.bloc-performance{grid-area:perf;text-align:center}.bloc-motivation{grid-area:motive;background:#f6c94c;color:#173f55}.bloc-client{grid-area:client}.bloc-vip{grid-area:vip}.bloc-securite{grid-area:safety;display:flex;align-items:center;gap:10px;background:#ed7337;color:#fff}.bloc-securite h3{color:#fff}.bloc-securite img,.bloc-client img{width:72px;height:72px;flex:0 0 72px;border-radius:13px;object-fit:cover}.bloc-client{display:flex;align-items:center;gap:9px}.bloc-objectif{grid-area:goal}.apercu-lancement footer{grid-area:foot;text-align:center;font-size:.63rem;opacity:.8}.valeurs-organisation{display:grid;grid-template-columns:repeat(3,1fr);text-align:center}.valeurs-organisation strong,.score-j1{display:block;font-size:1.55rem}.valeurs-organisation small{font-size:.56rem}.detail-departements{margin-top:7px!important;color:#59717e}.departements-apercu{display:flex;flex-wrap:wrap;gap:4px;margin-top:7px}.departements-apercu span{display:grid;padding:3px 5px;border-radius:8px;background:#e8f3f7;text-align:center}.departements-apercu b{font-size:.85rem}.departements-apercu small{font-size:.5rem}.details-performance{display:grid;gap:4px;margin-top:8px;font-size:.62rem}.champ-image-securite{margin-top:13px}.champ-image-securite small{color:var(--gris)}.historique-lancements{margin-top:22px}
.theme-editorial{border-radius:0;background:#f3efe6;color:#173f55;box-shadow:0 17px 42px rgba(17,52,73,.18);grid-template-columns:1fr 1fr;grid-template-areas:"head head" "org org" "client perf" "client perf" "motive motive" "vip safety" "goal goal" "foot foot"}.theme-editorial .bloc-lancement{border-radius:0;border:1px solid #c7c0b5;border-left:5px solid #153e52;background:#fff;color:#173f55}.theme-editorial .bloc-motivation{border-left-color:#ed7337}.theme-editorial .bloc-securite{background:#153e52;color:#fff}.theme-editorial .bloc-securite h3{color:#fff}.theme-editorial>header{border-bottom:3px solid #153e52;padding-bottom:10px}
.theme-immersif{background:linear-gradient(155deg,#123f55 0 45%,#116d82 45% 75%,#ed7337 75%);color:#fff;grid-template-columns:1fr 1fr;grid-template-areas:"head head" "perf perf" "org org" "motive vip" "client client" "safety safety" "goal goal" "foot foot"}.theme-immersif .bloc-lancement{border-radius:28px;background:#fff;color:#173f55;box-shadow:0 8px 18px rgba(0,0,0,.15)}.theme-immersif .bloc-performance{display:grid;grid-template-columns:1fr 1fr 1fr;align-items:center;text-align:left}.theme-immersif .bloc-performance h3{grid-column:1/-1}.theme-immersif .bloc-motivation{background:#f6c94c;color:#173f55}.theme-immersif .bloc-securite{background:#ed7337;color:#fff}.theme-immersif .bloc-securite h3{color:#fff}.theme-immersif footer{color:#fff}.theme-immersif>header,.theme-signal>header{color:#fff}.theme-immersif .meteo-visuel span,.theme-signal .meteo-visuel span{background:rgba(255,255,255,.16);color:#fff}
@media(max-width:1000px){.studio-lancement{grid-template-columns:1fr}.apercu-lancement-wrap{position:static;order:-1}.apercu-lancement{max-width:420px}.choix-themes{grid-template-columns:1fr}}
@media print{body *{visibility:hidden}.apercu-lancement,.apercu-lancement *{visibility:visible}.apercu-lancement{position:absolute;left:0;top:0;width:1080px;height:1920px;box-shadow:none}}
.bloc-client{display:flex;align-items:center;gap:9px}.bloc-client img{width:52px;height:52px;flex:none;border-radius:50%;object-fit:cover}

/* V8.1 — saisie quotidienne plus rapide et support mobile enrichi. */
.section-essentielle{border-top:4px solid #297cab}.titre-interventions{display:flex;align-items:center;justify-content:space-between;gap:10px}.titre-interventions strong{padding:6px 10px;border-radius:999px;background:#e7f2f8;color:#176084}.grille-performance-j1{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:10px;align-items:end}.grille-performance-j1 label{margin:0}.grille-performance-j1 .tendance-saisie{grid-column:1/-1}.choix-humeurs{display:grid;grid-template-columns:repeat(auto-fit,minmax(118px,1fr));gap:8px}.choix-humeurs label{margin:0}.choix-humeurs input{position:absolute;opacity:0}.choix-humeurs span{display:grid;gap:3px;place-items:center;min-height:68px;padding:8px;border:2px solid var(--bordure);border-radius:13px;cursor:pointer;background:#fff}.choix-humeurs b{font-size:1.15rem;letter-spacing:2px}.choix-humeurs small{font-weight:700}.choix-humeurs input:checked+span{border-color:#ef8c32;background:#fff5e8;box-shadow:0 3px 12px rgba(200,110,30,.12)}.champ-avec-generateur{display:grid;gap:8px}.champ-avec-generateur .bouton{justify-self:start}.meteo-editeur{display:flex;gap:7px;flex-wrap:wrap;margin-top:12px}.meteo-lancement-item{display:flex;align-items:center;gap:5px;padding:7px 9px;border-radius:11px;background:#eaf4f8;color:#234d61;font-size:.8rem}.meteo-lancement-item.vigilance-active{background:#fff0d4;color:#7b5100;border:1px solid #e6bd62}.meteo-visuel{display:grid;gap:3px;text-align:right;font-size:.68rem}.meteo-visuel span{padding:3px 6px;border-radius:8px;background:rgba(255,255,255,.72)}.meteo-visuel .vigilance-active{background:#ffda72;color:#5d3a00;font-weight:800}.interventions-majeures{padding:5px;border-radius:12px;background:#dff1f7;color:#0c6387}.departements-apercu{display:flex;gap:5px;justify-content:center;flex-wrap:wrap;margin-top:8px}.departements-apercu span{display:grid;min-width:48px;padding:4px 6px;border-radius:9px;background:#e8f2f6;text-align:center}.departements-apercu b{font-size:1rem}.departements-apercu small{font-size:.52rem}.details-performance{display:grid;gap:5px;margin-top:9px;font-size:.58rem}.details-performance span{padding:4px;border-radius:7px;background:#eef5f7}.details-performance b{display:block;font-size:.78rem}
.theme-collage{background:#e9f2ef;color:#173f55;transform:rotate(-.15deg);grid-template-columns:1fr .85fr;grid-template-areas:"head head" "motive perf" "org perf" "client client" "vip safety" "goal goal" "foot foot"}.theme-collage .bloc-lancement{background:#fff;color:#173f55;box-shadow:4px 5px 0 rgba(23,63,85,.13)}.theme-collage .bloc-lancement:nth-of-type(odd){transform:rotate(-1deg)}.theme-collage .bloc-lancement:nth-of-type(even){transform:rotate(.8deg)}.theme-collage .bloc-motivation{background:#f1c94c;color:#173f55}.theme-collage .bloc-securite{background:#d65e3b;color:#fff}.theme-collage .bloc-securite h3{color:#fff}
.theme-aurore{background:linear-gradient(160deg,#fff4e8,#f7d7d6 58%,#a8d8d8);color:#493d58;grid-template-columns:1fr 1fr;grid-template-areas:"head head" "motive motive" "org perf" "client client" "safety vip" "goal goal" "foot foot"}.theme-aurore .bloc-lancement{border-radius:28px;background:rgba(255,255,255,.88);color:#493d58}.theme-aurore .bloc-lancement h3{color:#76516d}.theme-aurore .bloc-motivation{background:#f5d7a4;color:#493d58}.theme-aurore .bloc-securite{background:#b94f65;color:#fff}.theme-aurore .bloc-securite h3{color:#fff}.theme-aurore .bloc-objectif{background:#fff;color:#493d58}
.theme-signal{background:#161c28;color:#fff;border-radius:8px;grid-template-columns:1.15fr .85fr;grid-template-areas:"head perf" "org perf" "org vip" "motive motive" "safety client" "goal goal" "foot foot"}.theme-signal .bloc-lancement{border-radius:6px;border-left:5px solid #ff6b35;background:#f8fafc;color:#161c28}.theme-signal .bloc-lancement h3{color:#a9360f}.theme-signal .bloc-motivation{background:#f6c944;color:#161c28}.theme-signal .bloc-securite{background:#ff6b35;color:#161c28}.theme-signal .bloc-securite h3{color:#161c28}.theme-signal .bloc-objectif{background:#262f41;color:#fff}.theme-signal .bloc-objectif h3{color:#f6c944}.theme-signal footer{color:#fff}
.theme-option span{grid-template-rows:25px auto;gap:5px}.theme-option span::before{content:"";display:block;width:45px;height:25px;border-radius:5px;background:linear-gradient(135deg,#ef7132 0 34%,#fff 34% 68%,#53b8d2 68%)}.theme-option input[value="editorial"]+span::before{border-radius:0;background:linear-gradient(90deg,#153e52 0 13%,#fff 13% 67%,#ef7132 67%)}.theme-option input[value="immersif"]+span::before{border-radius:12px;background:linear-gradient(145deg,#123f55 0 42%,#f5c542 42% 66%,#ed7337 66%)}.theme-option input[value="collage"]+span::before{transform:rotate(-4deg);background:linear-gradient(35deg,#fff 0 42%,#f0c84b 42% 66%,#d65e3b 66%)}.theme-option input[value="aurore"]+span::before{border-radius:13px;background:linear-gradient(135deg,#fff4e8,#de7f8d,#7bc2c7)}.theme-option input[value="signal"]+span::before{border-radius:2px;background:linear-gradient(90deg,#161c28 0 50%,#ff6b35 50% 76%,#f6c944 76%)}
@media(max-width:620px){.grille-performance-j1{grid-template-columns:1fr}.titre-interventions{align-items:flex-start;flex-direction:column}}

/* V8.3 — identité d'équipe, météo renforcée et boîte à outils. */
.titre-lancement{display:flex;align-items:center;gap:9px;min-width:0}.logo-equipe-apercu{display:grid;place-items:center;flex:0 0 68px}.logo-equipe-apercu .logo-equipe-auto{display:block;width:68px;height:68px;filter:drop-shadow(0 5px 8px rgba(0,0,0,.2))}.meteo-visuel{display:flex;align-items:flex-start;justify-content:flex-end;gap:5px}.meteo-visuel span{position:relative;display:flex;min-width:54px;padding:5px 6px;flex-direction:column;align-items:center;gap:1px;border-radius:12px;text-align:center}.meteo-visuel .icone-meteo{font-size:1.65rem;line-height:1.05}.meteo-visuel .vigilance-meteo{position:absolute;right:2px;top:1px;font-size:.72rem}.meteo-visuel .vigilance-meteo:empty{display:none}.meteo-visuel strong{font-size:.84rem;line-height:1.1}.meteo-visuel small{display:flex;align-items:center;gap:2px;font-size:.52rem;font-weight:700;white-space:nowrap}.meteo-visuel small .icone-gps,.meteo-visuel .localisation-meteo{color:#d95038}.meteo-lancement-item{display:inline-flex;align-items:center;gap:5px}.meteo-lancement-item .icone-meteo{font-size:1.35rem}.meteo-lancement-item .localisation-meteo{color:#d95038}.pastille-boite-outils{background:#7356a8}.entete-page-outils{display:flex;align-items:flex-start;justify-content:space-between;margin-bottom:18px}.entete-page-outils h1{display:flex;align-items:center;gap:9px}.grille-boite-outils{display:grid;grid-template-columns:repeat(auto-fill,minmax(210px,260px));gap:18px}.tuile-outil{min-height:215px;padding:24px 20px;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:12px;border:1px solid var(--bordure);border-radius:22px;background:linear-gradient(155deg,#fff,#edf5f8);color:var(--texte);text-align:center;text-decoration:none;box-shadow:0 9px 25px rgba(20,50,70,.1);transition:transform .18s,box-shadow .18s,border-color .18s}.tuile-outil:hover{transform:translateY(-4px);border-color:var(--bleu);box-shadow:0 15px 32px rgba(20,50,70,.16)}.icone-outil{width:94px;height:94px;display:grid;place-items:center;border-radius:26px;background:linear-gradient(145deg,#1f6c8f,#4ea7bd);color:#fff;box-shadow:0 10px 20px rgba(31,108,143,.25)}.tuile-outil strong{font-size:1rem}.tuile-outil small{color:var(--gris);line-height:1.35}.choix-logos-equipe{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:10px}.choix-logos-equipe label{margin:0}.choix-logos-equipe input{position:absolute;opacity:0}.choix-logos-equipe span{display:grid;place-items:center;gap:4px;min-height:105px;padding:8px;border:2px solid var(--bordure);border-radius:15px;background:#fff;cursor:pointer}.choix-logos-equipe .logo-equipe-auto{width:66px;height:66px}.choix-logos-equipe small{font-weight:750}.choix-logos-equipe input:checked+span{border-color:var(--bleu);background:#edf6fa;box-shadow:0 4px 13px rgba(31,108,143,.12)}
@media(max-width:520px){.logo-equipe-apercu{flex-basis:56px}.logo-equipe-apercu .logo-equipe-auto{width:56px;height:56px}.apercu-lancement header h2{font-size:1.4rem}.meteo-visuel{font-size:.66rem}.grille-boite-outils{grid-template-columns:1fr}}

/* V8.5 — logos personnalisés, performance graphique et univers typographiques. */
.logo-equipe-apercu>img{display:block;width:68px;height:68px;object-fit:contain;filter:drop-shadow(0 5px 8px rgba(0,0,0,.16))}.choix-logos-equipe span>img{width:66px;height:66px;object-fit:contain}.import-logo-equipe{margin-top:14px!important;padding:12px;border:1px dashed #9bb8c8;border-radius:13px;background:#f6fafc}.import-logo-equipe small{color:var(--gris)}.tuile-outil-taches .icone-outil{background:linear-gradient(145deg,#7356a8,#a67bc5)}
.performance-visuelle{display:grid;place-items:center;margin:5px 0}.anneau-performance{display:grid;place-items:center;width:62px;height:62px;border-radius:50%;background:conic-gradient(#2a91b5 var(--performance),#dce8ed 0);position:relative}.anneau-performance::after{content:"";position:absolute;inset:7px;border-radius:50%;background:#fff}.anneau-performance b{position:relative;z-index:1;font-size:.67rem}.barre-performance{display:none;width:100%;height:11px;border-radius:999px;background:#dce8ed;overflow:hidden}.barre-performance i{display:block;width:var(--performance);height:100%;background:linear-gradient(90deg,#ef7132,#f3bd3f)}.segments-performance{display:none;gap:4px}.segments-performance i{width:20px;height:10px;border-radius:3px;background:#cfd9df}.segments-performance i.actif{background:#ff6b35}
.theme-organique{font-family:"Trebuchet MS","Segoe UI",sans-serif}.theme-editorial{font-family:Georgia,"Times New Roman",serif}.theme-editorial h2,.theme-editorial h3{font-family:"Segoe UI",Arial,sans-serif;letter-spacing:.035em}.theme-immersif{font-family:"Segoe UI",Arial,sans-serif}.theme-immersif h2,.theme-immersif h3{font-family:"Arial Rounded MT Bold","Trebuchet MS",sans-serif}.theme-collage{font-family:"Trebuchet MS","Segoe UI",sans-serif}.theme-aurore{font-family:"Segoe UI",Calibri,sans-serif}.theme-aurore h2,.theme-aurore h3{font-family:Georgia,"Times New Roman",serif}.theme-signal{font-family:Arial,Helvetica,sans-serif}.theme-signal h2,.theme-signal h3{font-family:Impact,"Arial Black",sans-serif;letter-spacing:.035em}
.theme-editorial .anneau-performance,.theme-collage .anneau-performance,.theme-signal .anneau-performance{display:none}.theme-editorial .barre-performance,.theme-collage .barre-performance{display:block}.theme-signal .segments-performance{display:flex}.theme-immersif .anneau-performance{width:72px;height:72px;background:conic-gradient(#f5c542 var(--performance),#dce8ed 0)}.theme-aurore .anneau-performance{background:conic-gradient(#b94f65 var(--performance),#eadde2 0)}
.theme-signal{grid-template-columns:1.15fr .85fr;grid-template-areas:"head head" "org perf" "org perf" "motive vip" "safety client" "goal goal" "foot foot"}.theme-signal>header{display:grid;grid-template-columns:minmax(0,1fr) auto;gap:8px}.theme-signal .meteo-visuel{align-self:start;max-width:180px}.theme-signal .bloc-performance{display:flex;flex-direction:column;align-items:center;justify-content:center}.theme-signal .score-j1{font-size:1.8rem}.theme-signal .details-performance{width:100%}
@media(max-width:520px){.logo-equipe-apercu>img{width:56px;height:56px}.choix-logos-equipe{grid-template-columns:1fr 1fr}.theme-signal .meteo-visuel{max-width:145px}}
.filtres-carte-interventions{display:flex;align-items:flex-end;gap:12px;flex-wrap:nowrap;width:100%}
.filtres-carte-interventions>label{flex:1 1 0;min-width:0;margin:0}
.filtres-carte-interventions select{width:100%;min-width:0}
.suppression-import-carte{display:flex;justify-content:flex-end;margin-top:12px}
.bouton-icone.danger{color:#a72d23;border-color:#efc4bf;background:#fff7f0}
.bouton-icone.danger:hover{background:#fbe1de}
@media(max-width:760px){.filtres-carte-interventions{display:grid;grid-template-columns:repeat(2,minmax(0,1fr))}}

/* V9.6 — audits comparables et actions homogènes. */
.grille-kpi-audits{grid-template-columns:repeat(3,minmax(0,1fr))}
.audit-mini-actions{align-items:center}
.audit-mini-actions form{display:grid;width:30px;height:30px;flex:0 0 30px}
.audit-mini-actions .bouton-icone{box-sizing:border-box;width:30px!important;height:30px!important;min-width:30px;padding:0!important;display:grid;place-items:center;border-radius:7px!important}
.jauge-audits-tech{width:min(220px,100%);height:7px;margin-top:5px;overflow:hidden;border-radius:999px;background:#e5edf1}
.jauge-audits-tech i{display:block;height:100%;border-radius:inherit;background:linear-gradient(90deg,#55a5c2,#7459a7)}
.tendance-audit{font-size:.7rem!important;font-weight:700}.tendance-audit.hausse{color:#7459a7}.tendance-audit.baisse{color:#3b7d99}.tendance-audit.stable{color:#71808a}
@media(max-width:900px){.grille-kpi-audits{grid-template-columns:repeat(2,minmax(0,1fr))}}
@media(max-width:600px){.grille-kpi-audits{grid-template-columns:1fr}}

/* V9.7 — barre d'actions Audit strictement carrée (le bouton + est exclu). */
.audit-mini-actions{display:grid!important;grid-auto-flow:column;grid-auto-columns:34px;justify-content:end;align-items:center;gap:6px;white-space:nowrap}
.audit-mini-actions>a,.audit-mini-actions>button,.audit-mini-actions>form{display:grid!important;place-items:center;width:34px!important;height:34px!important;min-width:34px!important;margin:0!important;padding:0!important;align-self:center}
.audit-mini-actions>form>.bouton-icone,.audit-mini-actions>a.bouton-icone,.audit-mini-actions>button.bouton-icone{display:grid!important;place-items:center;box-sizing:border-box;width:34px!important;height:34px!important;min-width:34px!important;margin:0!important;padding:0!important;border-radius:8px!important;line-height:1!important}

/* V9.8 — structure dédiée : aucune règle générique ne peut déformer les actions. */
.saisie-audit-principale{grid-template-columns:repeat(3,minmax(170px,1fr));gap:10px}
.saisie-audit-principale select{width:100%;box-sizing:border-box}
.audit-pdf-zone{box-sizing:border-box;width:100%;min-width:0;height:42px;min-height:42px;align-self:end;overflow:hidden}
.audit-pdf-zone span{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.audit-mini-actions{display:flex!important;align-items:center!important;justify-content:flex-end!important;gap:6px!important;height:34px}
.audit-mini-actions>.action-audit-form{display:block!important;flex:0 0 34px!important;width:34px!important;height:34px!important;min-width:34px!important;max-width:34px!important;margin:0!important;padding:0!important}
.audit-mini-actions .action-audit{appearance:none;-webkit-appearance:none;display:inline-flex!important;align-items:center!important;justify-content:center!important;box-sizing:border-box!important;flex:0 0 34px!important;width:34px!important;height:34px!important;min-width:34px!important;max-width:34px!important;min-height:34px!important;max-height:34px!important;margin:0!important;padding:0!important;border:1px solid #d4e0e6!important;border-radius:8px!important;background:#fff!important;color:#225b75!important;line-height:1!important;text-decoration:none!important;vertical-align:middle;cursor:pointer}
.audit-mini-actions .action-audit:hover{background:#eaf4f8!important;border-color:#a9ccd9!important}
.audit-mini-actions .action-audit.danger{color:#c84943!important;border-color:#efcbc7!important;background:#fff8f7!important}
@media(max-width:900px){.saisie-audit-principale{grid-template-columns:repeat(2,minmax(160px,1fr))}}
@media(max-width:560px){.saisie-audit-principale{grid-template-columns:1fr}.audit-mini{grid-template-columns:28px minmax(0,1fr)}.audit-mini-actions{grid-column:1/-1;justify-content:flex-start!important}}

/* V9.9 — ouverture de session et célébration de fin de to-do. */
.ecran-lancement{position:fixed;inset:0;z-index:10000;display:grid;place-items:center;background:#173f55;color:#fff;opacity:1;transition:opacity .6s ease,visibility .6s ease}.lancement-deja-vu .ecran-lancement{display:none}.ecran-lancement.sortie{opacity:0;visibility:hidden;pointer-events:none}.ecran-lancement-logo{display:grid;place-items:center;text-align:center;animation:respiration-logo 1.2s ease-in-out infinite}.ecran-lancement-logo svg{width:104px;height:104px;filter:drop-shadow(0 16px 25px rgba(0,0,0,.25))}.ecran-lancement-logo strong{margin-top:18px;font-size:1.45rem;letter-spacing:.02em}.ecran-lancement-logo span{margin-top:5px;color:#c7dce7;font-size:.83rem}
@keyframes respiration-logo{0%,100%{transform:scale(.94);opacity:.88}50%{transform:scale(1.06);opacity:1}}
.celebration-todo{position:fixed;inset:0;z-index:10020;display:grid;place-items:center;padding:20px;background:rgba(15,43,59,.52);backdrop-filter:blur(5px);animation:apparition-celebration .28s ease both;overflow:hidden}.celebration-todo.fermeture{opacity:0;transition:opacity .28s}.celebration-todo section{position:relative;z-index:2;width:min(390px,calc(100vw - 40px));padding:34px 28px 28px;border-radius:25px;background:linear-gradient(145deg,#fff,#ecf8f1);box-shadow:0 25px 70px rgba(8,35,49,.35);text-align:center;animation:rebond-celebration .55s cubic-bezier(.18,.9,.32,1.25) both}.celebration-todo-icone{display:grid;place-items:center;width:76px;height:76px;margin:-70px auto 14px;border:7px solid #fff;border-radius:50%;background:linear-gradient(145deg,#42b77a,#21895a);color:#fff;font-size:2.4rem;font-weight:900;box-shadow:0 10px 25px rgba(35,139,91,.3)}.celebration-todo section>strong{display:block;color:#173f55;font-size:1.8rem}.celebration-todo section>p{margin:9px 0 21px;color:#496575;font-size:1rem}.celebration-todo>i{--angle:calc(var(--i)*25.7deg);position:absolute;left:50%;top:50%;width:9px;height:18px;border-radius:3px;background:hsl(calc(var(--i)*47),72%,58%);animation:confetti-todo 1.35s ease-out both;transform:rotate(var(--angle)) translateY(-75px)}
@keyframes apparition-celebration{from{opacity:0}to{opacity:1}}@keyframes rebond-celebration{from{opacity:0;transform:scale(.72) translateY(25px)}to{opacity:1;transform:scale(1) translateY(0)}}@keyframes confetti-todo{0%{opacity:0;transform:rotate(var(--angle)) translateY(-55px) scale(.5)}25%{opacity:1}100%{opacity:0;transform:rotate(var(--angle)) translateY(-260px) rotate(380deg)}}
@media(prefers-reduced-motion:reduce){.ecran-lancement-logo,.celebration-todo section,.celebration-todo>i{animation:none}.ecran-lancement{transition-duration:.15s}}

/* V10.0 — tickets qualité et tableau global repliable du Pilotage. */
.tableau-performances-globales{margin:14px 0 20px;padding:0;overflow:hidden}.tableau-performances-globales>summary{display:flex;align-items:center;gap:9px;padding:16px 18px;cursor:pointer;font-weight:850;color:#204f69;background:linear-gradient(90deg,#f4f9fb,#fff);list-style:none}.tableau-performances-globales>summary::-webkit-details-marker{display:none}.tableau-performances-globales>summary:after{content:'⌄';margin-left:auto;font-size:1.25rem;transition:transform .2s}.tableau-performances-globales[open]>summary:after{transform:rotate(180deg)}.tableau-performances-globales>p{padding:0 18px}.tableau-performances-globales .tableau-defilant{margin:0 14px 16px}.tableau-performances-globales table{width:100%;border-collapse:collapse;font-size:.84rem}.tableau-performances-globales th,.tableau-performances-globales td{padding:10px 9px;border-bottom:1px solid #e3ebef;text-align:right;white-space:nowrap}.tableau-performances-globales th:first-child,.tableau-performances-globales td:first-child{text-align:left}.tableau-performances-globales tbody tr:hover{background:#f1f7fa}.tableau-performances-globales td a{color:#205b79;text-decoration:none}
/* === Production centralisée : connexion et administration === */
.page-connexion{min-height:100vh;display:grid;place-items:center;background:linear-gradient(145deg,#eef7fb,#dfeff6);font-family:system-ui,sans-serif;color:#173f59}.carte-connexion{width:min(420px,calc(100% - 32px));background:#fff;padding:38px;border-radius:26px;box-shadow:0 24px 70px rgba(24,71,99,.16);text-align:center}.connexion-logo{width:66px;height:66px;display:grid;place-items:center;margin:0 auto 14px;border-radius:20px;background:linear-gradient(145deg,#4a9bd1,#1f4e79);color:#fff;font-size:30px;font-weight:800}.carte-connexion h1{margin:0}.texte-secondaire{color:#668294}.formulaire-connexion{display:grid;gap:18px;text-align:left;margin-top:26px}.formulaire-connexion label{display:grid;gap:7px;font-weight:700}.formulaire-connexion input{padding:13px 14px;border:1px solid #cadae4;border-radius:11px;font:inherit}.formulaire-connexion button{width:100%;justify-content:center}
.compte-connecte{display:grid;grid-template-columns:auto auto;column-gap:8px;align-items:center;padding-left:12px;border-left:1px solid #d8e2e8}.compte-connecte span{font-weight:700;font-size:.83rem}.compte-connecte small{grid-column:1;color:#668294}.compte-connecte form{grid-column:2;grid-row:1/3}.compte-connecte button{border:0;background:#eef4f7;border-radius:9px;width:34px;height:34px;cursor:pointer}.grille-admin{grid-template-columns:repeat(auto-fit,minmax(190px,1fr));align-items:end}.grille-admin fieldset{border:1px solid #dce6ec;border-radius:12px;min-height:72px}.choix-equipe{display:inline-flex!important;align-items:center;gap:5px;margin:3px 12px 3px 0}.liste-utilisateurs{display:grid;gap:14px;margin-top:18px}.utilisateur-admin.inactif{opacity:.65}.utilisateur-entete{display:flex;align-items:center;gap:12px;margin-bottom:15px}.utilisateur-entete div:nth-child(2){display:grid}.utilisateur-entete small{color:#718693}.avatar-utilisateur{width:43px;height:43px;border-radius:13px;display:grid;place-items:center;background:#e5f1f7;color:#1f668d;font-weight:800}.badge{padding:5px 9px;border-radius:99px;font-size:.75rem;background:#eef2f4}.badge.admin{background:#eee7ff;color:#6042a5}.badge.manager{background:#e6f5fb;color:#146383}.badge.succes{background:#def5e8;color:#1f7147}.actions-admin{display:flex;gap:9px;margin-top:13px}
.zone-maj{display:grid;gap:14px}.zone-maj input{position:absolute;opacity:0;pointer-events:none}.zone-maj label{min-height:170px;border:2px dashed #84b6d0;border-radius:18px;display:grid;place-content:center;text-align:center;gap:8px;background:#f4fafc;cursor:pointer;transition:.2s}.zone-maj label:hover{background:#eaf6fb;border-color:#277fa9}.zone-maj label strong{font-size:1.1rem}.zone-maj label span{color:#6b8390}.zone-maj .bouton{justify-self:start}td progress{display:block;width:150px;margin-bottom:4px}td>small{display:block;color:#6b8390}
.zone-maj.survol label{background:#dff2fa;border-color:#147aa7;transform:scale(1.005)}
.titre-page{}.grille-formulaire{}.bouton.primaire,.primaire{}.tableau-responsive{overflow:auto}.anciens-heures{}.bouton-secondaire{}.compact{}.tableau-equipe-audits{}
.alerte-info{padding:14px 16px;border-radius:12px;background:#eaf6fb;border-left:4px solid #3692bd}.carte-mot-de-passe{max-width:720px}
.champ-lien-invitation{display:flex;gap:10px;align-items:center}.champ-lien-invitation input{flex:1;min-width:0}.compte-connecte>a{display:flex;flex-direction:column;color:inherit;text-decoration:none}

/* V10.1 — dépôts directs avec retour visuel et progression réseau réelle. */
.zone-depot{display:grid;gap:15px}.zone-depot>input[type=file]{position:absolute!important;width:1px;height:1px;opacity:0;pointer-events:none}.surface-depot{box-sizing:border-box;min-height:190px;padding:25px;border:2px dashed #84b6d0;border-radius:20px;display:flex!important;flex-direction:column;align-items:center;justify-content:center;gap:7px;background:linear-gradient(145deg,#f8fcfd,#edf7fb);text-align:center;cursor:pointer;transition:background .18s,border-color .18s,transform .18s,box-shadow .18s}.surface-depot:hover,.surface-depot.survol{background:#e5f6fc;border-color:#147aa7;box-shadow:0 9px 25px rgba(20,122,167,.12);transform:translateY(-2px)}.depot-icone{display:grid;place-items:center;width:54px;height:54px;margin-bottom:3px;border-radius:17px;background:#dceff7;color:#176d96;font-size:2rem;font-weight:900;transition:.18s}.surface-depot strong{font-size:1.08rem;color:#194e68}.surface-depot>span:not(.depot-icone):not(.depot-validation){color:#688392}.depot-validation{display:block;max-width:100%;margin-top:9px;color:#607c8b;font-size:.82rem;line-height:1.4;overflow-wrap:anywhere}.surface-depot.fichier-recu{border-style:solid;border-color:#3aaa70;background:#edf9f2}.surface-depot.fichier-recu .depot-icone{background:#d9f2e4;color:#248656}.surface-depot.fichier-recu .depot-validation{color:#207447;font-weight:750}.surface-depot.fichier-invalide{border-color:#d95e58;background:#fff2f1}.surface-depot.fichier-invalide .depot-validation{color:#b13c36;font-weight:750}.surface-depot.envoi-en-cours{pointer-events:none;opacity:.8}.surface-depot.envoi-reussi{border-color:#2d9c62;background:#e5f7ed}.televersement-etat{padding:14px 16px;border:1px solid #cfe0e8;border-radius:14px;background:#f7fafc}.televersement-etat>div{display:flex;align-items:center;justify-content:space-between;gap:10px;margin-bottom:9px}.televersement-etat progress{display:block;width:100%;height:13px;accent-color:#2489b5}.televersement-etat small{display:block;margin-top:7px;color:#617d8c}.zone-depot>[data-bouton-envoi]{justify-self:start}.zone-depot>[data-bouton-envoi]:disabled{opacity:.48;cursor:not-allowed}.entete-historique-maj{display:flex;align-items:flex-start;justify-content:space-between;gap:20px;margin-bottom:12px}.entete-historique-maj h2{margin-bottom:3px}.entete-historique-maj p{margin:0}.bouton.danger{border-color:#edc3bf;color:#a63d37;background:#fff7f6}.import-local-prioritaire{max-width:900px}.zone-import-data{margin-top:18px}.choix-mois-import{justify-content:flex-start}.choix-mois-import select{min-width:230px}.rappel-import{max-width:900px;background:#f4f9fb}.rappel-import h3{margin-top:0}.rappel-import p{margin-bottom:0;color:#587584}@media(max-width:650px){.entete-historique-maj{align-items:stretch;flex-direction:column}.entete-historique-maj form,.entete-historique-maj button{width:100%}.surface-depot{min-height:175px;padding:20px 14px}.choix-mois-import{display:grid;grid-template-columns:1fr}.choix-mois-import select{min-width:0;width:100%}.zone-depot>[data-bouton-envoi]{width:100%;justify-content:center}}
