/* ═══════════════════════════════════════════════════════════════
   ExpéRHia · Refonte UI v1 — desktop uniquement
   Marque Expéria conservée (terracotta, brun, crème, Londrina logo)
   mais la couleur devient fonctionnelle : action ou statut, jamais
   décorative. Une seule action primaire par écran.
   ═══════════════════════════════════════════════════════════════ */
:root{
  /* Encres */
  --encre:#3E2B1A; --encre-2:#6E5B47; --muet:#98876F;
  /* Surfaces */
  --fond:#F7F4ED; --carte:#FFFFFF; --surface-2:#FBF9F4;
  --ligne:#ECE4D4; --ligne-2:#E0D5C0;
  /* Marque */
  --terra:#E96646; --terra-h:#D14F30; --terra-pale:#FCEDE7;
  --creme:#FFEDC4;
  /* Statuts : sens fixe dans toute l'app */
  --vert:#55803B;   --vert-pale:#EFF4E7;
  --jaune:#A97614;  --jaune-pale:#FAF1DB; --jaune-txt:#A97614;
  --rouge:#C43C43;  --rouge-pale:#FAEBEC;
  --bleu:#5A6EA5;   --bleu-pale:#EDF0F7;
  --violet:#8A5E86; --violet-pale:#F3EDF4;
  /* Alias hérités (anciens noms encore référencés en inline) */
  --brun:#6E5B47; --brun-fonce:#3E2B1A;
  --creme-fonce:#EFE1BE; --creme-40:#FBF9F4;
  --vert-fonce:#55803B; --terra-fonce:#D14F30;
  --rouge-fonce:#C43C43; --bleu-fonce:#4A5A8C; --violet-fonce:#7A4F76;
  --jaune-fonce:#A97614; --charbon:#37322F; --texte:#3E2B1A;
  /* ── DEUX SIGNES DESSINÉS ──                              (v14.72)
     Le « + » et le « ✓ » des pastilles étaient des glyphes de fonte :
     épais, mal centrés, différents d'une machine à l'autre. Ce sont
     deux traits, à la graisse des icônes du kit, portés en masque sur
     la couleur courante — ils suivent donc le texte. */
  --ic-plus:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='2.6' stroke-linecap='round'%3E%3Cpath d='M12 5v14M5 12h14'/%3E%3C/svg%3E");
  --ic-check:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='3' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M20 6 9 17l-5-5'/%3E%3C/svg%3E");
  /* Typo */
  --f-logo:'Londrina Solid',cursive;
  --f-titre:'Bricolage Grotesque',sans-serif;
  --f-ui:'Instrument Sans',sans-serif;
  --fd:var(--f-titre); --f-disp:var(--f-titre);
  --fb:var(--f-ui); --f-body:var(--f-ui);
  /* Métriques */
  --side-l:236px; --r:12px; --r-sm:9px;
  --ombre:0 1px 2px rgba(62,43,26,.05);
  --ombre-2:0 8px 28px -10px rgba(62,43,26,.16);
}
*{margin:0;padding:0;box-sizing:border-box}
html{min-width:1024px}
body{font-family:var(--f-ui);background:var(--fond);color:var(--encre);
  -webkit-font-smoothing:antialiased;font-variant-numeric:tabular-nums;font-size:14px}
button,input,select,textarea{font-family:var(--f-ui)}
a{color:inherit;text-decoration:none}
:is(button,a,input,select,textarea):focus-visible{outline:2px solid var(--terra);outline-offset:2px}
.ico{width:16px;height:16px;flex:none;vertical-align:-3px}

/* ═══ Garde mobile : desktop uniquement ═══ */
.mgate{display:none}
@media(max-width:767px){
  html{min-width:0}
  body>.app,body>.dwr,body>.modal,body>.toast,body>.delzone{display:none!important}
  .mgate{position:fixed;inset:0;z-index:999;background:var(--fond);
    display:flex;flex-direction:column;align-items:center;justify-content:center;
    text-align:center;padding:32px 24px;gap:6px}
  .mgate .lg-tile{margin-bottom:12px}
  .mgate h2{font-family:var(--f-titre);font-weight:600;font-size:21px}
  .mgate p{font-size:13.5px;color:var(--encre-2);line-height:1.6;max-width:300px}
  .mgate .stores{display:flex;gap:10px;margin-top:18px}
  .mgate .stores span{border:1px solid var(--ligne-2);background:var(--carte);
    border-radius:10px;padding:9px 16px;font-size:12px;font-weight:600;color:var(--muet)}
}

/* ═══ Coquille ═══ */
.app{display:block;min-height:100vh}

/* — Sidebar blanche — */

.lg-tile{font-family:var(--f-logo);font-size:17px;color:#fff;background:var(--terra);
  border-radius:8px;width:34px;height:34px;display:flex;align-items:center;
  justify-content:center;transform:rotate(-3deg);flex:none;box-shadow:var(--ombre)}
.lgm{font-family:var(--f-logo);font-size:22px;line-height:1;color:var(--encre)}
.lgm span{color:var(--terra)}
.lgs{font-size:9px;font-weight:600;letter-spacing:.14em;color:var(--muet);margin-top:2px}

.nc .ico{color:var(--muet)}

.nc.on .ico{color:var(--terra-h)}
.nc .pill{margin-left:auto}

.psw{background:var(--surface-2);border:1px solid var(--ligne);border-radius:10px;
  padding:3px;display:flex;gap:3px;margin-bottom:12px}
.psw button{flex:1;border:none;border-radius:7px;padding:6px 4px;font-size:10.5px;
  font-weight:600;background:transparent;color:var(--encre-2);cursor:pointer}
.psw button.on{background:var(--encre);color:#fff}

.av{width:32px;height:32px;border-radius:50%;background:var(--bleu);color:#fff;
  display:flex;align-items:center;justify-content:center;font-size:12px;font-weight:700;flex:none}
.usr .u1{font-size:12.5px;font-weight:600}
.usr .u2{font-size:11px;color:var(--muet)}

/* — Topbar — */
.main{display:flex;flex-direction:column;min-width:0}
.top{background:var(--carte);border-bottom:1px solid var(--ligne);height:58px;
  display:flex;align-items:center;gap:14px;padding:0 26px;position:sticky;top:0;z-index:40}
.burger{display:none}
.crumb{font-size:12.5px;color:var(--muet)}
.crumb b{color:var(--encre);font-weight:600}
.content{padding:26px 26px 70px;max-width:1360px;width:100%;margin:0 auto}
body.wide .content{max-width:none}
.vh{display:flex;align-items:flex-end;gap:16px;margin-bottom:22px;flex-wrap:wrap}
.eb{font-size:12px;font-weight:600;color:var(--muet)}
.vh h1{font-family:var(--f-titre);font-weight:600;font-size:26px;letter-spacing:-.01em;
  color:var(--encre);margin-top:3px;line-height:1.15}
.vh .vs{font-size:13px;color:var(--muet);margin-top:4px}
.va{margin-left:auto;display:flex;gap:8px;align-items:center;flex-wrap:wrap}

/* ── L'EN-TÊTE QUI TIENT SUR UNE LIGNE ──                  (v13.21)
   « On perd beaucoup de place en haut. » Le titre était déjà dans le
   fil d'Ariane et dans le rail ; le pavé de description répétait ce
   que les colonnes montrent. Les onglets et les actions partagent la
   ligne, et l'écran commence 130 px plus haut. */
.vbar{display:flex;align-items:center;gap:16px;margin-bottom:16px;flex-wrap:wrap}
.vbar .tabs{flex:1 1 auto;min-width:0;max-width:760px}
.vbar .va{margin-left:auto}

/* Le rôle porte la couleur choisie à sa création (ABS_PALETTE) : deux
   jeux de couleurs pour un même rôle feraient deux rôles à l'œil. */
.rlpill{display:inline-block;font-size:11.5px;font-weight:600;padding:2px 9px;
  border-radius:20px;border:1px solid;white-space:nowrap;margin:1px 3px 1px 0}

/* Sélecteur d'établissement (topbar) */
.topsel{display:flex;align-items:center;gap:8px;background:var(--surface-2);
  border:1px solid var(--ligne);border-radius:10px;padding:0 4px 0 11px;height:36px}
.topsel select{border:none;background:transparent;font-family:var(--f-ui);font-size:12.5px;
  font-weight:600;color:var(--encre);padding:0 26px 0 2px;cursor:pointer;appearance:none;
  -webkit-appearance:none;height:34px;
  background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='11' height='11' viewBox='0 0 24 24' fill='none' stroke='%2398876F' stroke-width='2.5' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='m6 9 6 6 6-6'/%3E%3C/svg%3E");
  background-repeat:no-repeat;background-position:right 8px center}
.topsel select:focus{outline:none}
.topsel:hover{border-color:var(--ligne-2)}

/* ═══ Actions : 4 niveaux, un seul primaire par écran ═══ */
.btn{display:inline-flex;align-items:center;justify-content:center;gap:8px;
  border-radius:10px;padding:0 15px;height:37px;font-weight:600;font-size:13px;
  cursor:pointer;border:1px solid var(--ligne-2);background:var(--carte);
  color:var(--encre);transition:background .12s,border-color .12s}
.btn:hover{border-color:var(--muet);background:var(--surface-2)}
.btn.p{background:var(--terra);border-color:var(--terra);color:#fff;box-shadow:var(--ombre)}
.btn.p:hover{background:var(--terra-h);border-color:var(--terra-h)}
.btn.ghost{background:transparent;border-color:transparent;color:var(--encre-2)}
.btn.ghost:hover{background:var(--surface-2);color:var(--encre)}
/* ── DEUX ROUGES, ET UN SEUL ÉTAIT ATTEIGNABLE ──          (v12.6)

   « .btn.danger » était défini DEUX FOIS dans ce fichier : ici, en
   contour, et huit cents lignes plus bas en fond rouge plein. La
   seconde définition l'emportait, et les vingt-deux écrans qui
   emploient la classe rendaient tous un bouton rouge PLEIN — la
   variante contour n'était atteignable nulle part, depuis le jour où
   le doublon est arrivé.

   Le doublon est retiré. Les deux rouges se distinguent maintenant
   par ce qu'ils font :

     .btn.danger  détruire, ou revenir sur une décision, quand le
                  bouton vit À CÔTÉ d'un autre. Il ne doit pas peser
                  plus que celui qu'on est venu presser.
     .btn.dp      détruire quand c'est TOUT ce que l'écran propose —
                  la fenêtre qui confirme une suppression. Là, le
                  rouge plein est le sujet de l'écran, et non un
                  risque posé à côté d'autre chose. */
.btn.danger{background:transparent;border-color:var(--rouge);color:var(--rouge)}
.btn.danger:hover{background:var(--rouge-pale);border-color:var(--rouge);color:#A32D34}
.btn.dp{background:var(--rouge);border-color:var(--rouge);color:#fff}
.btn.dp:hover{background:#A93036;border-color:#A93036}
.btn.sm{height:31px;padding:0 11px;font-size:12px;border-radius:8px}
/* ── UN BOUTON DÉSACTIVÉ DOIT SE VOIR ──                    (v14.11)
   « [disabled] » n'était habillé qu'à deux endroits : « .btn.danger »
   et la barre d'émargement. Partout ailleurs, un bouton désactivé
   gardait EXACTEMENT l'allure d'un bouton cliquable — on cliquait, il
   ne se passait rien, et on cherchait la panne. Le hover est
   neutralisé aussi : un bouton mort qui s'éclaire au survol promet
   quelque chose qu'il ne tiendra pas. */
.btn:disabled{opacity:.45;cursor:not-allowed;box-shadow:none}
.btn:disabled:hover{background:var(--carte);border-color:var(--ligne-2)}
.btn.p:disabled:hover{background:var(--terra);border-color:var(--terra)}
.btn .ico{width:15px;height:15px}
.w100{width:100%;justify-content:center}
.lk{font-size:12.5px;font-weight:600;color:var(--terra-h);cursor:pointer;
  background:none;border:none;letter-spacing:0}
.lk:hover{text-decoration:underline;text-underline-offset:3px}

/* ═══ Statuts : point + mot, sens fixe ═══ */
.pill{display:inline-flex;align-items:center;gap:6px;font-size:11.5px;font-weight:600;
  padding:3px 10px 3px 8px;border-radius:20px;white-space:nowrap;letter-spacing:0;
  text-transform:none}
.pill::before{content:'';width:6px;height:6px;border-radius:50%;background:currentColor;flex:none}
.pill.ok{background:var(--vert-pale);color:var(--vert)}
.pill.wa{background:var(--jaune-pale);color:var(--jaune)}
.pill.ko{background:var(--rouge-pale);color:var(--rouge)}
.pill.in{background:var(--bleu-pale);color:var(--bleu)}
.pill.vi{background:var(--violet-pale);color:var(--violet)}
.pill.gr{background:var(--surface-2);color:var(--encre-2);border:1px solid var(--ligne)}
.alert{border-radius:var(--r);padding:12px 15px;font-size:13px;font-weight:500;
  margin-bottom:14px;border:1px solid}
.alert.ok{background:var(--vert-pale);color:var(--vert);border-color:#D8E5C9}
.alert.ko{background:var(--rouge-pale);color:var(--rouge);border-color:#F0CFD1}
.mono{font-size:12px;font-weight:600;font-variant-numeric:tabular-nums}

/* ═══ Cartes & lignes ═══ */
.card{background:var(--carte);border:1px solid var(--ligne);border-radius:var(--r);
  box-shadow:var(--ombre);overflow:hidden;margin-bottom:16px}
.ch{display:flex;align-items:center;gap:10px;padding:15px 18px;border-bottom:1px solid var(--ligne)}
.ch h3{font-family:var(--f-titre);font-weight:600;font-size:15.5px;flex:1;color:var(--encre)}
/* ── « META » ÉTAIT ÉCRIT 413 FOIS, ET DÉFINI NULLE PART ── (v14.10.1)
   Neuf déclarations, toutes SCOPÉES — .ch, .sec-h, .tA td, .absline,
   .histoline, .cloh, .clgrp, .mdsal, .mdx — et pas une seule de base.
   Hors de ces neuf endroits, « class="meta" » ne faisait donc RIEN :
   le texte sortait en 14 px encre, à la taille d'un paragraphe, là où
   l'auteur voulait un aparté. C'est le défaut que le kit existe pour
   empêcher : un nom qu'on écrit en croyant qu'il habille.
   La base est celle qu'on trouvait le plus souvent (12 px, muet) ;
   les neuf scopes restent des variantes et continuent de gagner. */
.meta{font-size:12px;font-weight:500;color:var(--muet)}
.ch .meta{font-size:12px;font-weight:500;color:var(--muet)}
.g2{display:grid;grid-template-columns:1.6fr 1fr;gap:16px;align-items:start}
.g3{display:grid;grid-template-columns:repeat(3,1fr);gap:14px;margin-bottom:16px}
.kpis{display:grid;grid-template-columns:repeat(4,1fr);gap:14px;margin-bottom:22px}
.kpi{background:var(--carte);border:1px solid var(--ligne);border-radius:var(--r);
  box-shadow:var(--ombre);padding:16px 18px}
.kpi b{font-family:var(--f-titre);font-size:30px;font-weight:600;display:block;
  line-height:1;color:var(--encre);letter-spacing:-.02em}
.kpi span{font-size:12.5px;color:var(--muet);display:block;margin-top:6px}
.kpi .k1{font-size:11.5px;font-weight:600;color:var(--muet)}
.kpi .k2{font-family:var(--f-titre);font-size:26px;font-weight:600;line-height:1.15;
  color:var(--encre);margin-top:4px;letter-spacing:-.01em}
.kpi .k3{font-size:11.5px;color:var(--muet);margin-top:3px}
.row{display:flex;align-items:center;gap:12px;padding:12px 18px;border-bottom:1px solid var(--surface-2)}
.row:last-child{border-bottom:none}
.row:hover{background:var(--surface-2)}
.r1{font-weight:600;font-size:13px}
.r2{font-size:12px;color:var(--muet);margin-top:2px}
.rr{margin-left:auto;flex:none;text-align:right}
.av-m{width:30px;height:30px;border-radius:50%;color:#fff;display:flex;align-items:center;
  justify-content:center;font-size:11px;font-weight:700;flex:none}

/* ═══ L'ÉTAT VIDE ═══                                        (v14.14)
   Quand un élément n'a pas de valeur, l'écran le dit en UNE phrase,
   grise, centrée, sous l'icône du sujet. Pas de titre en gras, pas de
   paragraphe d'explication : un écran vide n'est pas l'endroit où on
   apprend à s'en servir, c'est l'endroit où on constate qu'il n'y a
   rien. L'explication, quand elle est nécessaire, se met à côté du
   réglage qu'elle concerne.

   Il remplace cinq classes retirées d'ici (.rgvide, .atrien, .sgvide,
   .orgvide, .aidvide), les blocs .row/.r1/.r2 détournés en état vide,
   et les .meta / .fhelp / .einfo / .vide posés faute de mieux — dont
   quatre .vide de bloc que RIEN ne stylait, comme .meta avant la
   v14.10.1. La feuille imprimée et la borne gardent les leurs
   (.prvide, .jl-rien, .frise-vide, .tbvide) : ce ne sont pas des
   cartes, et leur mise en page n'est pas celle de l'application.

   S'écrit :  <div class="neant"><?= ico('cal', 'class="ico nic"') ?>
                Aucune période
                <a class="lk" href="…">Créer une période</a></div>
   Dans un tableau, la classe se pose sur le <td colspan>. */
.neant{padding:28px 16px;text-align:center;font-size:13px;color:var(--muet);line-height:1.5}
.neant .lk{display:block;margin-top:9px}
/* Un écran entièrement vide n'a parfois pas d'autre chemin : un bouton,
   et un seul. Dans une carte parmi d'autres, c'est le lien qui suffit. */
.neant .btn{margin-top:13px}
.neant.sm{padding:16px 12px;font-size:12.5px}
td.neant{padding:28px 16px}
.tA tr:hover td.neant{background:none}
/* L'icône du sujet, pâle : elle nomme ce qui manque, elle ne décore pas. */
.neant .nic{width:22px;height:22px;display:block;margin:0 auto 10px;
  stroke-width:1.4;opacity:.5;vertical-align:0}
.neant.sm .nic{width:18px;height:18px;margin-bottom:7px}

/* ═══ LA PANNE ═══                                           (v14.15)
   Le pendant exact de l'état vide, et il ne faut jamais les confondre :
   .neant dit « il n'y a rien », .panne dit « ça n'a pas marché ».
   L'onglet Planification affichait du blanc pour la seconde raison, et
   on a cherché la première pendant trois jours.
   Hors production, elle porte ce qui a lâché, le fichier et la ligne. */
.panne{margin:14px 18px;padding:13px 15px;border-radius:11px;
  background:var(--rouge-pale);border:1px solid #EBC9CB;color:#8E3038;font-size:13px}
.panne b{display:block;font-weight:700}
.panne span{display:block;margin-top:5px;font-family:ui-monospace,SFMono-Regular,Menlo,monospace;
  font-size:12px;line-height:1.5;word-break:break-word}
.panne .ou{color:#A85C62;font-size:11.5px}
.panne.pleine{margin:18px}

/* ═══ Tableaux ═══ */
/* UN TABLEAU QUI CONTINUE LE DIT — (v14.133)
   Pas d'ombre : le contenu s'estompe sur 26 px du côté où il reste
   quelque chose à voir. Les classes tbfg / tbfd sont posées par le
   défilement (footer.php) ; au bout, il n'y a plus de fondu du tout. */
.scrollx{overflow-x:auto}
.scrollx.tbfg{-webkit-mask-image:linear-gradient(to right, transparent 0, #000 26px);
  mask-image:linear-gradient(to right, transparent 0, #000 26px)}
.scrollx.tbfd{-webkit-mask-image:linear-gradient(to left, transparent 0, #000 26px);
  mask-image:linear-gradient(to left, transparent 0, #000 26px)}
.scrollx.tbfg.tbfd{-webkit-mask-image:linear-gradient(to right, transparent 0, #000 26px, #000 calc(100% - 26px), transparent 100%);
  mask-image:linear-gradient(to right, transparent 0, #000 26px, #000 calc(100% - 26px), transparent 100%)}
/* Un tableau dont la première colonne est figée ne s'estompe qu'à droite :
   sinon le fondu mangerait les noms. */
.scrollx.tbfx.tbfg{-webkit-mask-image:none;mask-image:none}
.scrollx.tbfx.tbfd,.scrollx.tbfx.tbfg.tbfd{-webkit-mask-image:linear-gradient(to left, transparent 0, #000 26px);
  mask-image:linear-gradient(to left, transparent 0, #000 26px)}
.tA{width:100%;border-collapse:collapse;min-width:640px}
.tA th{font-size:11px;font-weight:600;letter-spacing:.06em;text-transform:uppercase;
  color:var(--muet);text-align:left;padding:11px 16px;background:var(--surface-2);
  border-bottom:1px solid var(--ligne)}
.tA th.rt,.tA td.rt{text-align:right}
.tA td{padding:12px 16px;border-bottom:1px solid var(--surface-2);font-size:13px;vertical-align:middle}
.tA tr:last-child td{border-bottom:none}
.tA tr:hover td{background:var(--surface-2)}
.tA .nomcell{display:flex;align-items:center;gap:10px;font-weight:600;font-size:13px}

/* ═══ Planning v1 (heures, historique…) ═══ */
/* ═══ LA BARRE D'OUTILS TIENT SUR UNE LIGNE ═══               (v12.9)

   Elle se repliait : sous 1200 px, le groupe « Vue · Favoris ·
   Affichage · Outils · Publier » passait à la ligne et la barre
   doublait de hauteur — 39 px devenaient 86. Sur un portable, deux
   rangées de boutons mangeaient la place du planning lui-même.

   Une ligne, et elle DÉFILE quand elle déborde. C'est le même choix
   que pour la grille juste en dessous : plutôt que d'entasser, on
   laisse glisser.

   ── LE PIÈGE, ET SA SORTIE ──

   « overflow-x:auto » fait passer « overflow-y » de « visible » à
   « auto » : le conteneur ROGNE alors ce qui dépasse en hauteur. Or
   les menus « Affichage » et « Outils » sont des panneaux absolus
   POSÉS DANS la barre. Mesuré : le panneau « Affichage » fait 630 px
   de haut et se retrouvait coupé à 30 px — le menu devenait
   inutilisable, et rien à l'écran ne l'expliquait.

   Les panneaux passent donc en « position:fixed » et se placent au
   clic, comme le fait déjà « poserPanneau() » pour la fenêtre météo
   (v12.4) : hors du flux, ils ne connaissent plus le rognage. */
.plbar{display:flex;align-items:center;gap:10px;flex-wrap:nowrap;margin-bottom:16px;
  overflow-x:auto;overflow-y:visible;scrollbar-width:thin}
/* Rien ne se comprime : un bouton écrasé est pire qu'un bouton qu'on
   atteint en glissant. Seul l'espaceur garde son élasticité — c'est
   lui qui centre le sélecteur de vue quand il y a de la place. */
.plbar > *{flex:none}
.plbar > .plsp{flex:1 1 0;min-width:0}
.plactions{flex-wrap:nowrap}
/* La barre défilante ne doit pas rogner ce qui dépasse EN HAUTEUR.
   « overflow-y:visible » ne suffit pas seul — le navigateur le
   ramène à « auto » dès que l'axe X défile —, d'où les panneaux en
   position fixe. Ce retrait laisse la place à leur ombre. */
.plbar{padding-bottom:2px}
.wknav{display:flex;align-items:center;gap:2px;background:var(--carte);
  border:1px solid var(--ligne);border-radius:10px;padding:3px;box-shadow:var(--ombre)}
.wknav a{width:31px;height:31px;border-radius:7px;color:var(--encre-2);
  display:flex;align-items:center;justify-content:center;font-weight:600}
.wknav a:hover{background:var(--surface-2);color:var(--encre)}
.wknav .wkd{font-size:13px;font-weight:600;color:var(--encre);padding:0 12px;
  display:flex;align-items:center;gap:8px}
.wknav .sem{font-size:10.5px;font-weight:700;color:var(--muet);background:none;
  border-radius:5px;padding:0}
.plwrap{overflow-x:auto}
.plgrid{min-width:1020px}
/* L'en-tête des jours forme son propre plan, au-dessus des cases :
   un shift qui déborde de sa colonne passait par-dessus « Lun 24 »
   au premier jour et au dernier (v7.90). */
.plh{display:grid;grid-template-columns:200px repeat(7,1fr);background:var(--surface-2);
  border-bottom:1px solid var(--ligne);position:relative;z-index:6}
/* Et une case ne laisse pas son contenu s'échapper. */
.plrow .pcell{min-width:0}
.pcell .sh{max-width:100%}
.plh .plc0{padding:11px 14px;font-size:11px;font-weight:600;letter-spacing:.06em;
  text-transform:uppercase;color:var(--muet)}
.plh .pld{padding:9px 6px;text-align:center;border-left:1px solid var(--ligne)}
.plh .pld .d1{font-size:10.5px;font-weight:600;text-transform:capitalize;
  letter-spacing:0;color:var(--muet)}
.plh .pld .d2{font-family:var(--f-titre);font-weight:600;font-size:16px;color:var(--encre);line-height:1.15}
.plh .pld.today{background:var(--terra-pale)}
.plh .pld.today .d1{color:var(--terra-h)}
.plh .pld.today .d2{color:var(--terra-h)}
.plrow{display:grid;grid-template-columns:200px repeat(7,1fr);border-bottom:1px solid var(--surface-2)}
.plemp{padding:11px 14px;display:flex;gap:10px;align-items:flex-start}
.plemp .pn{font-weight:600;font-size:13px;color:var(--encre);line-height:1.25}
.plemp .pc{font-size:11px;font-weight:500;color:var(--muet);margin-top:2px}
.plcell{border-left:1px solid var(--surface-2);padding:5px;display:flex;
  flex-direction:column;gap:4px;min-height:60px}
.shift{display:block;border-radius:8px;padding:6px 8px;cursor:pointer;
  border:none;border-left:3px solid var(--bleu);background:var(--bleu-pale);
  text-align:left;width:100%}
.shift:hover{filter:brightness(.975)}
.shift .st{font-size:10px;font-weight:600;letter-spacing:0;text-transform:none;
  display:block;color:var(--encre-2)}
.shift .sh{font-size:11.5px;font-weight:700;margin-top:1px;display:block}
.cellplus{background:transparent;border:1px dashed transparent;border-radius:8px;flex:1;
  min-height:18px;color:transparent;cursor:pointer;font-weight:700}
.plcell:hover .cellplus{border-color:var(--ligne-2);color:var(--muet)}
.legpl{display:flex;gap:14px;padding:12px 18px;border-top:1px solid var(--ligne);flex-wrap:wrap}
.legpl span{display:flex;align-items:center;gap:6px;font-size:11.5px;font-weight:500;color:var(--muet)}
.legpl i{width:11px;height:11px;border-radius:4px;display:block}
.plfoot{display:grid;grid-template-columns:210px repeat(7,1fr);border-top:1px solid var(--ligne);
  background:var(--surface-2)}
.plfoot .plemp{padding:10px 14px}
.plfoot .plcell{padding:9px 8px;text-align:center;border-left:1px solid var(--ligne);min-height:0}
.plfoot .plcell b{display:block;font-size:12.5px;color:var(--encre)}
.plfoot .plcell span{font-size:10px;color:var(--muet);font-weight:600}
.plfoot .plcell.today{background:var(--terra-pale)}

/* ═══ Modale ═══ */
.modal{position:fixed;inset:0;display:none;z-index:220}
.modal.open{display:block}
.modal-veil{position:absolute;inset:0;background:rgba(43,32,24,.42)}
.modal-box{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);
  width:min(480px,94vw);max-height:92vh;overflow-y:auto;background:var(--carte);
  border-radius:14px;box-shadow:var(--ombre-2)}
.mh{padding:16px 20px 14px;border-bottom:1px solid var(--ligne);display:flex;
  align-items:flex-start;gap:10px}
.mh h2{font-family:var(--f-titre);font-weight:600;font-size:17px;color:var(--encre);flex:1}
.mh .de{font-size:11px;font-weight:600;letter-spacing:.04em;color:var(--muet);text-transform:none}
/* La croix est tantôt un <button>, tantôt un <a> : un bouton centre
   son texte tout seul, pas un lien. Sans display:flex, la croix se
   posait donc en haut à gauche de son cadre au lieu d'en occuper le
   centre — c'est le genre de détail qu'on voit sans savoir le nommer
   (v11.14). */
.mclose{width:30px;height:30px;border-radius:8px;border:1px solid var(--ligne);
  background:var(--carte);cursor:pointer;color:var(--muet);font-size:14px;flex:none;
  display:inline-flex;align-items:center;justify-content:center;padding:0;line-height:1;
  text-decoration:none}
.mclose:hover{background:var(--surface-2);color:var(--encre)}
.mb{padding:16px 20px 20px}
.mf{display:flex;gap:9px;margin-top:16px}
.mf .btn{flex:1}
.veil{display:none}

/* ═══ Formulaires ═══ */
.fg{margin-bottom:13px}
.fl{display:block;font-size:12px;font-weight:600;letter-spacing:0;text-transform:none;
  color:var(--encre-2);margin:12px 0 5px}
.fl:first-child,.fg .fl{margin-top:0}
.freq{color:var(--terra);font-weight:700}
.fhelp{font-size:11.5px;color:var(--muet);margin-top:4px;line-height:1.45}
.fi{width:100%;border:1px solid var(--ligne-2);border-radius:10px;padding:9px 12px;
  font-size:13px;font-weight:500;background:#fff;color:var(--encre);
  transition:border-color .12s,box-shadow .12s}
.fi:hover{border-color:var(--muet)}
.fi:focus{outline:none;border-color:var(--terra)}
.fi::placeholder{color:#BFB2A0;font-weight:400}
.fi:disabled{background:var(--surface-2);color:var(--muet);cursor:not-allowed}
.fi.err{border-color:var(--rouge);box-shadow:0 0 0 3px rgba(196,60,67,.12)}
.fi.sm,.smsel{padding:6px 10px;font-size:12px;border-radius:8px;width:auto}
textarea.fi{min-height:84px;resize:vertical;line-height:1.5}
/* ── DES PARTS VRAIMENT ÉGALES ──                        (v14.31)
   « 1fr » vaut « minmax(auto,1fr) » : une colonne ne descend jamais
   sous la taille minimale de son contenu, et cette taille dépend du
   plus long mot d'un libellé ou du format de date du navigateur. Deux
   colonnes annoncées égales ne l'étaient donc pas, et les bords ne
   tombaient pas au même endroit. « minmax(0,1fr) » tient la promesse. */
.f2{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:10px}
.f3{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:10px}
/* Quatre champs courts sur une ligne — des nombres, des durées. Au-delà
   de quatre, on ne lit plus les libellés : on passe à deux rangs. */
.f4{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:10px}
/* ── UNE LIGNE DE CHAMPS AVEC UN BOUTON AU BOUT ──         (v14.31)
   « Le champ, et le geste qui s'applique dessus » : un select et
   « Gérer », deux selects et « Ajouter ». Les champs se partagent ce
   que le bouton laisse, et le bord droit de la ligne tombe sur celui
   des autres champs du formulaire.

   Elle existe parce que `.row` — qui a l'air d'un utilitaire — est en
   réalité une LIGNE DE LISTE : elle porte un rembourrage de dix-huit
   pixels et un filet en bas. S'en servir comme d'une rangée de
   formulaire rentrait la ligne de dix-huit pixels, et son bord droit
   ne tombait au même endroit que rien. */
.fline{display:flex;align-items:center;gap:8px}
.fline > .fi,.fline > select.fi{flex:1;min-width:0}
.fline > .btn{flex:none}
.fico{position:relative}
.fico .fi{padding-left:36px}
.fico svg{position:absolute;left:11px;top:50%;transform:translateY(-50%);width:16px;height:16px;
  stroke:var(--muet);pointer-events:none}
.fico:focus-within svg{stroke:var(--terra)}
input[type="date"].fi,input[type="time"].fi,input[type="datetime-local"].fi{color:var(--encre)}
input[type="date"].fi::-webkit-calendar-picker-indicator,
input[type="time"].fi::-webkit-calendar-picker-indicator{opacity:.45;cursor:pointer}
select.fi{appearance:none;-webkit-appearance:none;padding-right:32px;cursor:pointer;
  background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 24 24' fill='none' stroke='%2398876F' stroke-width='2.5' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='m6 9 6 6 6-6'/%3E%3C/svg%3E");
  background-repeat:no-repeat;background-position:right 11px center}
/* Switch */
.sw{display:inline-flex;align-items:center;gap:9px;cursor:pointer;user-select:none}
.sw input{position:absolute;opacity:0;width:0;height:0}
/* Interrupteur : le curseur est centré par calcul, pas par des
   valeurs ajustées à la main qui se décalent dès qu'on touche à
   la taille. --swh = hauteur, --swp = jeu autour du curseur. */
.sw .swt{--swh:22px;--swp:3px;width:40px;height:var(--swh);border-radius:20px;
  background:var(--ligne-2);position:relative;transition:background .18s;flex:none;
  box-sizing:border-box}
.sw .swt::after{content:'';position:absolute;top:var(--swp);left:var(--swp);
  width:calc(var(--swh) - var(--swp) * 2);height:calc(var(--swh) - var(--swp) * 2);
  border-radius:50%;background:#fff;box-shadow:0 1px 3px rgba(62,43,26,.3);
  transition:transform .18s;box-sizing:border-box}
.sw input:checked+.swt{background:var(--vert)}
.sw input:checked+.swt::after{transform:translateX(calc(40px - var(--swh)))}
.sw input:focus-visible+.swt{outline:2px solid var(--terra);outline-offset:2px}
.sw .swl{font-size:13px;font-weight:600;color:var(--encre)}
.sw input:not(:checked)~.swl{color:var(--muet)}
/* Case / radio */
.chk{display:flex;align-items:flex-start;gap:9px;cursor:pointer;user-select:none;
  font-size:13px;font-weight:500;color:var(--encre);line-height:1.35}
.chk input{position:absolute;opacity:0;width:0;height:0}
.chk .bx{width:19px;height:19px;border-radius:6px;border:1.5px solid var(--ligne-2);
  background:#fff;flex:none;position:relative;transition:all .13s;margin-top:0}
.chk .bx::after{content:'';position:absolute;left:5px;top:1.5px;width:5px;height:9px;
  border:solid #fff;border-width:0 2.5px 2.5px 0;transform:rotate(45deg) scale(0);transition:transform .13s}
.chk input:checked+.bx{background:var(--vert);border-color:var(--vert)}
.chk input:checked+.bx::after{transform:rotate(45deg) scale(1)}
.chk input:focus-visible+.bx{outline:2px solid var(--terra);outline-offset:2px}
.chk:hover .bx{border-color:var(--vert)}
.rad{display:flex;align-items:center;gap:9px;cursor:pointer;user-select:none;
  font-size:13px;font-weight:500;color:var(--encre)}
.rad input{position:absolute;opacity:0;width:0;height:0}
.rad .rd{width:19px;height:19px;border-radius:50%;border:1.5px solid var(--ligne-2);
  background:#fff;flex:none;position:relative;transition:all .13s}
.rad .rd::after{content:'';position:absolute;inset:4px;border-radius:50%;
  background:var(--terra);transform:scale(0);transition:transform .13s}
.rad input:checked+.rd{border-color:var(--terra)}
.rad input:checked+.rd::after{transform:scale(1)}
.rad input:focus-visible+.rd{outline:2px solid var(--terra);outline-offset:2px}
.radrow{display:flex;gap:18px;flex-wrap:wrap;padding:4px 0}
.chkcol{display:flex;flex-direction:column;gap:9px;padding:4px 0}
/* Chips */
/* ── LA PASTILLE À COCHER ──                                (v14.7.1)
   UNE seule définition. Il y en avait deux : celle-ci en vert, et
   « .chips .chip » en bleu huit cents lignes plus bas — plus
   spécifique, donc c'est elle que les quatre écrans employaient. Le
   kit documentait une pastille verte que personne n'a jamais vue.
   Et la v14.6.1 en a écrit une TROISIÈME, `.zp`, pour les zones de
   vacances, faute d'avoir cherché celle qui existait.

   Le bleu l'emporte parce que c'est ce qui est à l'écran aujourd'hui
   — habilitations, langues, primes, paie. Les teintes de zone sont
   des variantes, pas des composants. */
.chips{display:flex;flex-wrap:wrap;gap:7px;padding:2px 0}
.chip{cursor:pointer;user-select:none;position:relative}
.chip input{position:absolute;opacity:0;width:0;height:0}
.chip span{display:inline-flex;align-items:center;gap:6px;border:1px solid var(--ligne-2);
  background:#fff;border-radius:20px;padding:6px 13px;font-size:12px;font-weight:600;
  color:var(--encre-2);transition:all .13s}
/* ── LE SIGNE DE LA PASTILLE, DESSINÉ ──                   (v14.72)
   « Supprimer le tick moche pour le remplacer par un tick sobre. »
   C'étaient deux GLYPHES — « + » et « ✓ » — donc deux dessins tirés
   d'une fonte système, épais, mal centrés et différents d'une machine
   à l'autre. Ce sont maintenant deux traits, masqués sur la couleur
   courante : même graisse que les icônes du kit, même arrondi, et
   rigoureusement le même rendu partout. */
.chip span::before{content:'';width:10px;height:10px;flex:none;background:currentColor;opacity:.42;
  -webkit-mask:var(--ic-plus) center/10px 10px no-repeat;
  mask:var(--ic-plus) center/10px 10px no-repeat}
.chip:hover span{border-color:var(--muet);background:var(--surface-2)}
.chip input:checked+span{background:var(--bleu-pale);border-color:var(--bleu);color:var(--bleu)}
.chip input:checked+span::before{opacity:1;
  -webkit-mask:var(--ic-check) center/11px 11px no-repeat;
  mask:var(--ic-check) center/11px 11px no-repeat}
.chip input:focus-visible+span{outline:2px solid var(--terra);outline-offset:2px}
/* Ce que la pastille porte en plus de son nom : « · 12 périodes ». */
.chip i{font-style:normal;opacity:.75;font-weight:500}
/* Les variantes de teinte. Une zone scolaire garde sa couleur, une
   pastille qui appelle l'attention passe au jaune. */
.chip.terra input:checked+span{background:var(--terra-pale);border-color:var(--terra);color:var(--terra)}
.chip.zA input:checked+span{background:#E4EFDC;border-color:#6E8F52;color:#3D5C2A}
.chip.zB input:checked+span{background:var(--bleu-pale);border-color:var(--bleu);color:var(--bleu)}
.chip.zC input:checked+span{background:#F8EBD4;border-color:#B8863A;color:#7A5510}
.chip.zCorse input:checked+span{background:var(--violet-pale);border-color:var(--violet);color:var(--violet)}
.chip.att input:checked+span{background:var(--jaune-pale);border-color:var(--jaune);color:var(--jaune)}
/* Zone de dépôt */
.drop{border:1.5px dashed var(--ligne-2);border-radius:var(--r);background:var(--surface-2);
  padding:22px 16px;text-align:center;cursor:pointer;transition:all .15s;display:block}
.drop:hover,.drop.over{border-color:var(--terra);background:var(--terra-pale)}
.drop input{display:none}
.drop .d1{font-weight:600;font-size:13px;color:var(--encre)}
.drop .d1 u{color:var(--terra-h);text-decoration-thickness:1.5px;text-underline-offset:2px}
.drop .d2{font-size:11.5px;color:var(--muet);margin-top:3px}
.drop .dfile{font-size:12px;font-weight:600;color:var(--vert);margin-top:6px;display:none}
/* Onglets */
/* ═══ UN SEUL COMPOSANT D'ONGLETS ═══                     (v11.5)
   Il y en avait DEUX, presque identiques et pourtant différents :
   « .tabs » sur les fiches, fond blanc et onglet actif teinté
   terracotta, et « .pgt » sur les pages à sections, fond crème et
   onglet actif en pastille blanche. Deux composants pour un même
   geste, c'est un design system qui a cessé de tenir.

   On garde l'apparence de « .pgt » — la pastille blanche se
   détache mieux et supporte les libellés longs — et « .tabs » n'en
   est plus qu'une VARIANTE DE LARGEUR : ses onglets se partagent la
   ligne, ce qui reste juste pour une fiche à cinq onglets fixes.
   Rien à changer dans les pages : elles gardent leur classe. */
.tabs,.pgt{display:inline-flex;gap:3px;background:var(--surface-2);
  border:1px solid var(--ligne);border-radius:99px;padding:4px;margin-bottom:18px}
.tabs{display:flex;overflow-x:auto}
.tabs a,.pgt a{display:inline-flex;align-items:center;justify-content:center;gap:7px;
  font-size:14px;font-weight:600;color:var(--encre-2);padding:7px 20px;border-radius:99px;
  text-decoration:none;white-space:nowrap}
.tabs a{flex:1;font-size:13px;padding:7px 14px}
.tabs a.on,.pgt a.on{background:var(--carte);color:var(--encre);box-shadow:var(--ombre)}
.tabs a:hover:not(.on),.pgt a:hover:not(.on){color:var(--encre)}
.tabs .tbadge,.pgt .tbadge{background:var(--terra);color:#fff;border-radius:20px;
  padding:1px 7px;font-size:11px;font-weight:700;flex:none}

/* ═══ Fiche salarié ═══ */
.fichehead,.band{display:flex;align-items:center;gap:15px;background:var(--carte);
  border:1px solid var(--ligne);border-radius:var(--r);box-shadow:var(--ombre);
  padding:16px 20px;margin-bottom:18px;flex-wrap:wrap}
.fichehead .av-xl,.band .avatar{width:50px;height:50px;border-radius:50%;color:#fff;
  display:flex;align-items:center;justify-content:center;font-family:var(--f-titre);
  font-weight:600;font-size:19px;flex:none}
.fichehead h1,.band h1{font-family:var(--f-titre);font-weight:600;font-size:21px;
  color:var(--encre);line-height:1.15;letter-spacing:-.01em}
.fichehead .fsub,.band .bsub{font-size:12.5px;color:var(--muet);font-weight:500;margin-top:3px;
  display:flex;gap:10px;align-items:center;flex-wrap:wrap}
.band .ba{margin-left:auto;display:flex;gap:8px;align-items:center;flex-wrap:wrap}
.dosgrid{display:grid;grid-template-columns:190px 1fr;gap:22px;align-items:start}
.toc{position:sticky;top:120px}
.toc .tt{font-size:10.5px;font-weight:600;letter-spacing:.07em;text-transform:uppercase;
  color:var(--muet);margin-bottom:8px;padding-left:12px}
.toc a{display:flex;align-items:center;gap:9px;padding:8px 12px;border-radius:var(--r-sm);
  font-size:13px;font-weight:500;color:var(--encre-2);margin-bottom:1px;border:none}
.toc a .n{width:18px;height:18px;border-radius:6px;background:var(--surface-2);
  border:1px solid var(--ligne);font-size:9.5px;font-weight:700;display:flex;
  align-items:center;justify-content:center;flex:none;color:var(--muet)}
.toc a:hover{color:var(--encre);background:var(--surface-2)}
.toc a.on{color:var(--terra-h);background:var(--terra-pale);font-weight:600;border:none}
.toc a.on .n{background:var(--terra);border-color:var(--terra);color:#fff}
.toc a .cnt{margin-left:auto;font-size:11px;font-weight:600;color:var(--muet)}
.toc .sep{height:1px;background:var(--ligne);margin:10px 12px}
.toc .mini{padding:8px 12px;font-size:11px;color:var(--muet);line-height:1.6;font-weight:500}
.toc .mini b{color:var(--rouge)}
.sec{margin-bottom:26px;scroll-margin-top:130px}
.sec-h{display:flex;align-items:baseline;gap:10px;margin-bottom:10px;flex-wrap:wrap}
.sec-h h2{font-family:var(--f-titre);font-weight:600;font-size:17px;color:var(--encre)}
.sec-h .meta{font-size:12px;font-weight:500;color:var(--muet)}
.sec-h .act{margin-left:auto;display:flex;gap:8px}
.tiles{display:grid;grid-template-columns:repeat(4,1fr);gap:12px}
.tile{background:var(--carte);border:1px solid var(--ligne);border-radius:var(--r);
  box-shadow:var(--ombre);padding:13px 15px}
.tile .tk{font-size:11px;font-weight:600;letter-spacing:0;text-transform:none;
  color:var(--muet);display:flex;align-items:center;gap:6px}
.tile .tk .ico{width:14px;height:14px;color:var(--muet)}
.tile .tv{font-size:13.5px;font-weight:600;color:var(--encre);margin-top:6px;line-height:1.35;word-break:break-word}
.tile .ts{font-size:11.5px;color:var(--muet);font-weight:500;margin-top:1px;word-break:break-word}
.tile.warn{border-color:#EAD0D1;background:#FFFCFC}
.tile.warn .tk,.tile.warn .tk .ico{color:var(--rouge)}
/* Contrats */
.cwrap{display:grid;grid-template-columns:1.5fr 1fr;gap:12px;align-items:start}
.cmain{border-color:#D8E5C9;box-shadow:0 0 0 3px var(--vert-pale)}
.cmh{padding:13px 16px;display:flex;gap:10px;align-items:center;border-bottom:1px solid var(--surface-2)}
.cmh .t1{font-weight:600;font-size:13.5px;color:var(--encre)}
.cmh .t2{font-size:11.5px;color:var(--muet);font-weight:500;margin-top:2px}
.cgridd{display:grid;grid-template-columns:repeat(2,1fr)}
.cgridd>div{padding:10px 16px;border-bottom:1px solid var(--surface-2)}
.cgridd>div:nth-child(odd){border-right:1px solid var(--surface-2)}
.cgridd .k{font-size:11px;font-weight:600;letter-spacing:0;text-transform:none;color:var(--muet)}
.cgridd .v{font-size:12.5px;font-weight:600;color:var(--encre);margin-top:3px}
.avnrow{display:flex;gap:10px;align-items:center;padding:9px 16px;
  border-bottom:1px solid var(--surface-2);font-size:12px}
.avnrow .a1{font-weight:600;color:var(--encre)}
.avnrow .a2{color:var(--muet);font-size:11px}
/* align-items : sans lui, une note et un bouton posés côte à côte
   s'étirent chacun à la hauteur de la rangée et ne s'alignent sur
   rien (v11.14). */
.cfoot{display:flex;gap:8px;padding:10px 16px;background:var(--surface-2);flex-wrap:wrap;
  align-items:center}
.chist{display:flex;flex-direction:column;gap:10px}
.chitem{background:var(--carte);border:1px solid var(--ligne);border-radius:var(--r);
  padding:12px 14px;cursor:pointer;text-align:left;width:100%;box-shadow:var(--ombre)}
.chitem:hover{border-color:var(--ligne-2);background:var(--surface-2)}
.chitem .t1{font-weight:600;font-size:12.5px;color:var(--encre);display:flex;gap:8px;align-items:center}
.chitem .t1 .pill{margin-left:auto}
.chitem .t2{font-size:11px;color:var(--muet);font-weight:500;margin-top:3px}
.chitem.ghost{border-style:dashed;text-align:center;color:var(--muet);font-weight:600;
  font-size:12px;box-shadow:none}
.chitem.ghost:hover{color:var(--terra-h);border-color:var(--terra)}
/* Sections d'onglet */
.fsec{padding:16px 18px;border-bottom:1px solid var(--ligne)}
.fsec:last-child{border-bottom:none}
.fsec h4{font-family:var(--f-titre);font-weight:600;font-size:14.5px;color:var(--encre);
  margin-bottom:12px;display:flex;align-items:center;gap:8px}
.fgrid{display:grid;grid-template-columns:repeat(3,1fr);gap:12px}
.fgrid .colspan2{grid-column:span 2}
.fgrid .colspan3{grid-column:span 3}
.fsave{position:sticky;bottom:0;background:linear-gradient(transparent,var(--fond) 30%);
  padding:14px 0 4px;display:flex;justify-content:flex-end;gap:9px}
/* Documents */
.filtbar{display:flex;gap:7px;padding:11px 15px;border-bottom:1px solid var(--ligne);
  flex-wrap:wrap;align-items:center}
.fchip{border:1px solid var(--ligne-2);background:#fff;border-radius:20px;padding:5px 12px;
  font-size:11.5px;font-weight:600;color:var(--muet);cursor:pointer}
.fchip .c{font-size:10px;opacity:.7}
.fchip.on{background:var(--encre);border-color:var(--encre);color:#fff}
.fchip:hover:not(.on){border-color:var(--muet);color:var(--encre)}
.docrow{display:flex;align-items:center;gap:12px;padding:11px 18px;border-bottom:1px solid var(--surface-2)}
.docrow:last-child{border-bottom:none}
.docic{width:36px;height:36px;border-radius:10px;background:var(--surface-2);
  border:1px solid var(--ligne);display:flex;align-items:center;justify-content:center;
  font-size:9.5px;font-weight:700;color:var(--terra-h);flex:none}
.docrow .d1{font-weight:600;font-size:12.5px;color:var(--encre)}
.docrow .d2{font-size:11px;color:var(--muet);margin-top:1px}
.docrow .cat{font-size:10px;font-weight:600;color:var(--muet);background:var(--surface-2);
  border:1px solid var(--ligne);border-radius:6px;padding:3px 7px;white-space:nowrap}
.hline{display:flex;gap:10px;align-items:center;padding:10px 16px;
  border-bottom:1px solid var(--surface-2);font-size:12px}
.hline:last-child{border-bottom:none}
.hline .h1x{font-weight:600;color:var(--encre);font-size:12.5px}
.hline .h2x{font-size:11px;color:var(--muet);margin-top:1px}
.hline .rr{margin-left:auto;display:flex;gap:7px;align-items:center}
/* Deux enfants, et deux seulement : l'icône, puis UN élément qui
   porte tout le texte. Le gap du flex sépare les items, donc une
   balise inline laissée nue dans la ligne s'en détachait de 8 px
   (v11.16). Le sélecteur ci-dessous rattrape le cas. */
.warnline{display:flex;gap:8px;align-items:center;font-size:11.5px;font-weight:600;
  border-radius:9px;padding:7px 11px;margin-top:8px}
.warnline>span,.warnline>div{min-width:0}
.warnline.w{background:var(--jaune-pale);color:var(--jaune)}
.warnline.k{background:var(--rouge-pale);color:var(--rouge)}
.warnline.i{background:var(--bleu-pale);color:var(--bleu)}
/* Fil d'activité */
.feed{padding:4px 0}
.fitem{display:flex;gap:12px;padding:9px 16px;font-size:12px;position:relative}
.fitem::before{content:'';position:absolute;left:27px;top:31px;bottom:-3px;width:2px;background:var(--surface-2)}
.fitem:last-child::before{display:none}
.fdot{width:23px;height:23px;border-radius:50%;background:var(--surface-2);
  border:1px solid var(--ligne);flex:none;display:flex;align-items:center;
  justify-content:center;color:var(--terra-h);z-index:1}
.fdot .ico{width:10px;height:10px}
.fitem .f1{font-weight:600;color:var(--encre)}
.fitem .f2{font-size:10.5px;color:var(--muet);margin-top:1px;display:block;grid-template-columns:none}

/* ═══ Tiroir latéral ═══ */
.dwr{position:fixed;inset:0;z-index:90;pointer-events:none}
.dwr .dveil{position:absolute;inset:0;background:rgba(43,32,24,.38);opacity:0;transition:.18s}
/* ── UNE SEULE LARGEUR DE TIROIR ──                      (v11.73)
   Elle était déclarée DEUX fois : 440 px ici, 560 px cinq cents
   lignes plus bas — la seconde gagnait, sans que personne sache
   qu'il y en avait une première. Et le tiroir d'émargement, lui,
   faisait 520. Trois largeurs pour un même objet.
   Une seule, et plus large : ces tiroirs portent des tableaux
   légaux de cinq lignes et des sections à deux colonnes. */
.dwr .panel{position:absolute;right:0;top:0;bottom:0;width:min(640px,96vw);background:var(--carte);
  box-shadow:var(--ombre-2);display:flex;flex-direction:column;transform:translateX(100%);transition:.2s ease}
.dwr.open{pointer-events:auto}
.dwr.open .dveil{opacity:1}
.dwr.open .panel{transform:none}
.dwr .ph{padding:16px 18px;border-bottom:1px solid var(--ligne);display:flex;align-items:flex-start;gap:10px}
.dwr .ph .de{font-size:11px;font-weight:600;letter-spacing:.04em;text-transform:none;color:var(--muet)}
.dwr .ph h2{font-family:var(--f-titre);font-weight:600;font-size:17px;color:var(--encre);flex:1;line-height:1.2}
.dwr .mclose{border:1px solid var(--ligne);background:var(--carte);border-radius:8px;
  font-size:14px;color:var(--muet);cursor:pointer;padding:4px 8px}
.dwr .pb{padding:15px 18px;overflow-y:auto;flex:1}

/* ═══ LES LIBELLÉS À GAUCHE ═══                           (v14.31)

   Une VARIANTE DE DISPOSITION d'un corps de tiroir, pas une seconde
   famille de champs : les mêmes « .fg », « .fl », « .fi », « .fhelp »
   qu'ailleurs, rangés autrement.

   Le libellé au-dessus du champ donne un formulaire dont la colonne
   de gauche change de largeur à chaque ligne, parce que chaque ligne
   se découpe comme elle veut. Le libellé à gauche donne DEUX axes
   verticaux pour tout le tiroir : celui des libellés et celui des
   champs. Un seul regard suffit alors pour voir ce qui manque.

   À réserver aux formulaires à libellés COURTS — au-delà, le libellé
   se coupe sur deux lignes et le gain disparaît. Un formulaire d'état
   civil garde ses libellés au-dessus. */
.dwr .pb.fgau .fg{display:grid;grid-template-columns:132px minmax(0,1fr);
  gap:0 14px;align-items:start;margin-bottom:12px}
.dwr .pb.fgau .fg > .fl{grid-column:1;grid-row:1;padding-top:10px;margin:0}
/* Tout ce qui n'est pas le libellé se range sous le précédent, dans
   la colonne des champs — aide comprise. */
.dwr .pb.fgau .fg > *:not(.fl){grid-column:2}
/* Un champ seul, sans libellé (une ligne de rappel, un interrupteur),
   se cale quand même sur l'axe des champs. */
.dwr .pb.fgau .fgd{margin-left:146px}
/* Le filet qui sépare deux temps du formulaire traverse tout. */
.dwr .pb.fgau .fgsep{height:1px;background:var(--ligne);margin:17px 0}
@media(max-width:560px){
  .dwr .pb.fgau .fg{grid-template-columns:minmax(0,1fr)}
  .dwr .pb.fgau .fg > .fl{grid-column:1;padding-top:0;margin-bottom:5px}
  .dwr .pb.fgau .fg > *:not(.fl){grid-column:1}
  .dwr .pb.fgau .fgd{margin-left:0}
}
/* ═══ LE PIED D'UN TIROIR : TROIS RANGS ═══              (v11.71)

   La règle n'est pas nouvelle — elle est écrite dans le kit depuis la
   v11.45, à « .sgcta », pour les enveloppes de signature :

     · ce qu'on vient faire OCCUPE LA LARGEUR ;
     · ce qu'on fait parfois se range en creux, côte à côte ;
     · ce qui DÉTRUIT est en rouge, en bas, seul — jamais collé au
       bouton d'à côté.

   Les tiroirs du planning sont antérieurs et ne la suivaient pas :
   « Annuler + Créer » à la création, CINQ boutons à plat à la
   modification, UN bouton étiré sur l'absence. Le même geste ne se
   trouvait jamais au même endroit.

   ── POURQUOI UNE CLASSE NEUVE, ET PAS « .pf » CORRIGÉE ──

   Parce que « .dwr .pf .btn{flex:1} » étire TOUT bouton de pied, et
   que quinze écrans s'en défendent un par un avec « flex:none ».
   Retirer cette règle les remettrait tous d'aplomb — ou les casserait
   tous d'un coup. « .dwcta » vit à côté ; « .pf » ne bouge pas tant
   que les douze autres tiroirs n'ont pas été repris un par un.

   Le rang 2 est FACULTATIF : les tiroirs de shift n'en ont pas, il
   n'y a qu'un geste à faire. »

   ═══════════════════════════════════════════════════════════════ */
/* ── LE PIED COLLE AU BAS, IL NE DÉFILE PAS ──
   Le formulaire d'un tiroir est LUI-MÊME la zone qui défile
   (« .dwr .pb »). Un pied posé dedans part donc avec le contenu :
   sur une absence qui porte un justificatif, « Enregistrer » se
   retrouvait deux écrans plus bas. « sticky » le retient en bas de la
   zone visible ; les marges négatives annulent le retrait de « .pb »
   pour qu'il aille d'un bord à l'autre. */
/* ── DEUX RANGS, ET NON TROIS ──                          (v11.82.1)

   Trois boutons pleine largeur empilés, c'est un pied de tiroir qui
   occupe le quart de l'écran pour dire trois choses dont deux sont
   rares. Ce qu'on vient faire et ce qu'on fait parfois tiennent sur
   UNE ligne : le geste secondaire garde la largeur de son texte, le
   principal prend ce qui reste et finit à droite, là où l'œil sort du
   formulaire.

   Ce qui DÉTRUIT reste au rang du dessous, seul et centré. C'est la
   seule part de la règle de la v11.45 qui protège vraiment quelque
   chose : on ne clique pas « Supprimer » en visant « Enregistrer ».

   « wrap » est un filet, pas une intention : sur un panneau étroit ou
   un libellé très long, mieux vaut deux lignes qu'un bouton coupé. */
/* ── LA ZONE QUI DÉFILE NE GARDE PAS DE RETRAIT SOUS LE PIED ──
   « sticky » ne descend jamais plus bas que son bloc conteneur : avec
   les quinze pixels de retrait de « .pb » sous lui, le bandeau crème
   s'arrêtait quinze pixels avant le bas du panneau, et l'on voyait une
   bande blanche sous les boutons. Une marge négative n'y change rien —
   c'est la CONTENANCE qui s'arrête là. On retire donc le retrait à la
   zone, et c'est le pied qui le porte, dans son propre rembourrage. */
/* ── ET « margin-top:auto » DEMANDE UN CONTENEUR QUI SACHE LIRE ──
                                                          (v14.46)
   La règle au-dessous dit depuis la v12.6 que la marge haute
   automatique pousse le pied au bas du panneau. Elle ne l'a jamais
   fait : « .pb » était un bloc ordinaire, et dans le flux normal une
   marge « auto » verticale vaut zéro. Sur un tiroir court, le pied se
   posait donc juste sous le dernier champ — exactement le défaut que
   le commentaire décrivait comme corrigé.

   Une colonne flexible, et la marge reprend son sens. Le retrait
   vertical revient aux enfants pour que la zone qui défile n'en ait
   plus (voir juste en dessous). */
.dwr .pb:has(> .dwcta){padding-bottom:0;display:flex;flex-direction:column}
/* Un enfant de colonne flexible ne se comprime pas tout seul : sans
   cela, une liste longue rétrécirait au lieu de faire défiler. */
.dwr .pb:has(> .dwcta) > *{flex:none}
.dwr .pb:has(> .dwcta) > .dwcta{margin-top:auto}
/* Le débord horizontal ne vaut que DANS la zone qui défile : c'est
   son retrait de 18 px qu'il annule. Le tiroir du type d'absence,
   lui, porte son pied À CÔTÉ de « .pb » — la même marge l'y faisait
   dépasser du panneau de dix-huit pixels de chaque côté. */
.dwr .pb > .dwcta{margin-left:-18px;margin-right:-18px}
.dwr .dwcta{position:sticky;bottom:0;z-index:2;
  margin:auto 0 0;padding:13px 18px 15px;
  border-top:1px solid var(--ligne);background:var(--surface-2);
  display:flex;flex-wrap:wrap;align-items:center;gap:8px}
/* ── LE PIED TOMBE AU BAS, MÊME QUAND LE CONTENU EST COURT ──
   « sticky » ne retient un élément QUE s'il y a de quoi défiler.
   Sur une absence courte, le pied se posait juste sous le dernier
   champ, et le tiroir montrait un grand vide crème en dessous. La
   marge haute automatique le pousse au bas ; quand le contenu
   déborde, elle vaut zéro et « sticky » reprend la main. */
/* ── UNE SEULE LIGNE, UNE SEULE TAILLE ──                  (v12.6)

   RÈGLE D'OR : jamais deux tailles de boutons sur la même ligne.

   Le pied avait trois rangs — un petit bouton à gauche, le principal
   au milieu, un lien rouge dessous. Trois hauteurs pour trois gestes
   du même tiroir : on lisait trois écrans superposés au lieu d'un
   pied. Les trois rangs deviennent une ligne, et tous ses boutons ont
   la même hauteur.

   L'ordre de la ligne est celui du BALISAGE, et il dit la gravité :

     à gauche   ce qui détruit ou revient sur une décision  .btn.danger
     au milieu  ce qu'on fait parfois                       .btn
     à droite   ce qu'on est venu faire — UN SEUL           .btn.p
                                          ou .btn.vert pour valider

   Un pied dit ce qu'on PEUT faire ; il n'explique pas ce qu'on ne
   peut pas. La phrase qui expliquait, au pied du type d'absence,
   qu'une obligation légale ne se supprime pas, est partie : l'absence
   du bouton le dit déjà. */
.dwr .dwcta > .btn{flex:1 1 auto;justify-content:center;white-space:nowrap;order:2}
/* (« .dwcta2 » vivait ici — le rang 1, à gauche, en « .btn.sm ». La
   règle d'or l'a retiré : ses deux derniers usagers, « Relancer » et
   « Désactiver ce type », posaient un petit bouton à côté d'un grand.
   Le premier est descendu dans la section des justificatifs, où il
   parle de ce qu'il relance ; le second est revenu sur la ligne, à la
   taille des autres. v12.6) */
/* Rang 3 : sur sa propre ligne — « flex-basis 100 % » force le
   retour. Il ne reste qu'un usager, « Reprendre le calcul
   automatique » dans le tiroir des heures, gardé tel quel. */
.dwcta3{order:3;flex:1 0 100%;text-align:center;padding-top:1px}
.dwcta3 .lkq{font-size:12.5px;font-weight:600;color:var(--rouge)}
/* « .lkq + .lkq » pose un filet de séparation. Il se posait aussi
   APRÈS un bouton masqué — « Dévalider » ne s'affiche que sur un shift
   validé —, et le pied portait alors une barre verticale toute seule
   devant « Supprimer », sans rien à séparer. */
.dwcta3 .lkq[hidden] + .lkq{margin-left:0;padding-left:0;border-left:0}
.dwcta3 .lkq:hover{color:#A32D34;text-decoration:underline}
/* Un pied peut n'avoir aucun rang 1 : un shift validé n'attend rien
   de vous, c'est le ruban qui porte l'information. */
.dwr .dwcta:empty{display:none}

/* ═══ LE RUBAN D'ÉTAT ═══                                (v11.71)
   « Où en est cet objet » se lisait à deux endroits : au milieu du
   formulaire pour un shift validé, tout en bas pour le justificatif
   d'une absence. Une seule place, sous le récapitulatif, avant le
   formulaire — on sait dans quoi on entre avant de modifier quoi que
   ce soit. */
.dwetat{margin:10px 18px 0;padding:9px 12px;border-radius:10px;display:flex;gap:9px;
  align-items:baseline;font-size:12.5px;border:1px solid;line-height:1.4}
.dwetat[hidden]{display:none}
.dwetat b{font-weight:700;flex:none}
.dwetat span{opacity:.86}
.dwetat.ok{background:var(--vert-pale);border-color:#D7E3C8;color:#3F6129}
.dwetat.att{background:var(--jaune-pale);border-color:#EDDCB4;color:#8A5F0F}
.dwetat.ko{background:var(--rouge-pale);border-color:#F0CFD1;color:#A32D34}
.dwetat.info{background:var(--bleu-pale);border-color:#D5DDEE;color:#465A8C}

.dwr .pf,.dwr .pfx{padding:13px 18px;border-top:1px solid var(--ligne);display:flex;gap:9px;margin-top:0}
.dwr .pfx{padding:13px 0 2px;margin-top:14px}
.dwr .pf .btn,.dwr .pfx .btn{flex:1;justify-content:center}
.fl2{display:block;font-size:12px;font-weight:600;letter-spacing:0;text-transform:none;
  color:var(--encre-2);margin:13px 0 6px}
.fl2:first-of-type{margin-top:0}
.fn{background:var(--surface-2);border:1px solid var(--ligne);color:var(--encre-2);
  border-radius:6px;padding:1px 6px;margin-left:4px;font-size:10px}
.pillgrid{display:flex;flex-wrap:wrap;gap:6px}
.spill{cursor:pointer}
.spill input{position:absolute;opacity:0}
.spill span{display:inline-flex;align-items:center;gap:6px;border:1px solid var(--ligne-2);
  border-radius:20px;padding:3px 11px 3px 3px;font-size:11.5px;font-weight:600;color:var(--muet)}
/* Les initiales flottaient dans leur cercle : sans « line-height:1 »,
   c'est la HAUTEUR DE LIGNE qu'on centre, pas les lettres — et elle
   traîne une descendante invisible qui les pousse vers le haut.
   « flex:none » les empêche par ailleurs de rétrécir quand le nom
   est long (v11.69). */
.spill .avm{width:22px;height:22px;flex:none;border-radius:50%;color:#fff;
  display:flex;align-items:center;justify-content:center;
  font-size:9px;line-height:1;font-weight:700;font-style:normal;letter-spacing:.02em}
.spill .avm img{width:100%;height:100%;object-fit:cover;border-radius:50%;display:block}
.spill input:checked+span{border-color:var(--terra);background:var(--terra-pale);color:var(--encre)}
.jsel{display:flex;gap:4px}
.jsel label{flex:1;cursor:pointer;position:relative}
.jsel input{position:absolute;opacity:0}
.jsel span{display:block;text-align:center;font-size:10px;font-weight:700;color:var(--muet);
  border:1px solid var(--ligne-2);border-radius:8px;padding:5px 0;line-height:1.35}
.jsel input:checked+span{background:var(--terra);border-color:var(--terra);color:#fff}
/* SUPPRIMÉ v11.18 — « .repjours » n'était plus posé nulle part, mais
   ses règles restaient et retombaient sur « .repj », qui désigne
   depuis la v11.16 le CONTENEUR de la répartition et non plus une
   tuile. Deux composants pour un même nom : le second héritait des
   marges, du hover et de l'opacity du premier. */
.tagopt{display:flex;flex-wrap:wrap;gap:6px}
.tago{cursor:pointer;position:relative}
.tago input{position:absolute;opacity:0}
.tago span{display:inline-flex;align-items:center;gap:6px;border:1px solid var(--ligne-2);
  border-radius:20px;padding:5px 11px;font-size:11.5px;font-weight:600;color:var(--muet)}
/* Le rond de couleur laisse la place à l'ICÔNE du poste, à sa
   teinte (v11.71). « etiquettes.icone » existait et n'était pas lue
   ici. « Sans poste » garde son rond : il n'a pas d'icône. */
.tago i{width:9px;height:9px;border-radius:50%}
.tago .ico{width:14px;height:14px;flex:none}
.tago input:checked+span{border-color:var(--encre);background:var(--surface-2);color:var(--encre)}
.swpick{cursor:pointer;position:relative}
.swpick input{position:absolute;opacity:0}
.swpick i{display:block;width:24px;height:24px;border-radius:8px;border:2px solid transparent}
.swpick input:checked+i{border-color:var(--encre)}
.swpick:hover i{border-color:var(--ligne-2)}

/* ═══ Filtres & menus déroulants ═══ */
.filtres{display:flex;gap:8px;align-items:center;margin-left:auto}
.ddown{position:relative}
/* > summary : uniquement celui du menu Outils lui-même. Sans le
   sélecteur d'enfant direct, la règle noircissait aussi les
   sections repliées à l'intérieur du panneau. */
.ddown > summary{list-style:none;cursor:pointer;user-select:none}
.ddown > summary::-webkit-details-marker{display:none}
.ddown[open] > summary{background:var(--encre);color:#fff;border-color:var(--encre)}
/* « fixed » et non « absolute » : la barre d'outils défile
   désormais (v12.9), et un conteneur qui défile rogne ce qui dépasse.
   Le placement se fait au clic, dans planning_modales.php. */
.ddpanel{position:fixed;z-index:60;width:330px;
  background:var(--carte);border:1px solid var(--ligne);border-radius:var(--r);
  box-shadow:var(--ombre-2);padding:13px;display:flex;flex-direction:column;gap:8px}
.ddt{font-size:11px;font-weight:600;letter-spacing:.04em;text-transform:uppercase;
  color:var(--muet);margin-top:4px}
.ddt:first-child{margin-top:0}
.ddhelp{font-size:11px;color:var(--muet);font-weight:500;line-height:1.5}
.ddline{display:flex;gap:7px;align-items:center}

/* ═══ LE SEGMENT ═══                                         (v14.17)
   Trois crans quand l'interrupteur ne suffit plus : entre « pas
   d'absences » et « les absences avec leur motif », il y a le cran que
   tout le monde veut — le fait, sans la cause.

   ── IL EXISTE EN DEUX EXEMPLAIRES, ET C'EST VOULU ──
   La feuille d'impression (assets/print.css) est AUTONOME : le
   document imprimé ne charge pas app.css, pour ne pas emporter huit
   cents règles d'écran dans un fichier destiné au papier. Le
   composant y est donc redit à l'identique. Le kit reste la
   référence : toute retouche ici se reporte là-bas, et le banc 112
   éprouve le comportement, pas l'apparence. */
.prseg{display:flex;gap:2px;background:var(--surface-2);border:1px solid var(--ligne);
  border-radius:9px;padding:3px}
.prseg label{flex:1;cursor:pointer;position:relative}
.prseg input{position:absolute;opacity:0;pointer-events:none}
.prseg label span{display:block;text-align:center;font-size:11px;font-weight:600;
  color:var(--encre-2);padding:5px 3px;border-radius:6px}
.prseg label.on span{background:var(--terra);color:#fff}
.prseg label.ko{cursor:not-allowed}
.prseg label.ko span{color:var(--ligne-2)}
.prgn{font-size:10.5px;color:var(--muet);line-height:1.5;margin-top:6px}
.prgn b{color:var(--encre-2)}

/* ═══ LA VIGILANCE, DANS LA BARRE DU PLANNING ═══             (v14.16)
   Elle était dans la barre supérieure, sur les soixante-neuf écrans.
   Elle ne parle que du planning : elle vit là où on la corrige. Le
   panneau réutilise l'habillage des lignes de notification (.tpic,
   .tptx) — deux listes qui disent la même chose doivent se ressembler.
   Le bouton porte le jaune de l'attente, jamais le rouge : ce ne sont
   pas des erreurs, ce sont des choses à faire. */
.vigmenu .ddpanel{width:370px;padding:0;gap:0;max-height:70vh;overflow-y:auto}
.vigmenu .ddpanel .ddt{padding:12px 15px 8px;margin:0}
.vigmenu .ddpanel .neant{padding:22px 16px}
.vigmenu .nb{background:var(--jaune-pale);color:var(--jaune-txt);border-radius:20px;
  padding:0 6px;font-size:10.5px;font-weight:700;margin-left:5px}
.vigmenu .vigon{border-color:var(--jaune)}
.vigi{display:flex;gap:11px;padding:11px 15px;border-top:1px solid var(--surface-2);
  text-decoration:none;color:var(--encre)}
.vigi:hover{background:var(--surface-2)}

/* ═══ Planning v2 (planning.php / jour.php) ═══ */
.pl2card{overflow:hidden}
.pwrap{overflow-x:auto}

/* ═══ LA COLONNE DES SALARIÉS RESTE À L'ÉCRAN ═══             (v12.9)

   Sous 1180 px, « .pl2{min-width:1100px} » fait défiler le planning
   horizontalement — et la colonne des noms partait avec le reste. On
   se retrouvait devant sept colonnes de shifts sans savoir À QUI
   elles appartenaient : il fallait revenir en arrière, lire un nom,
   repartir. Un planning qu'on ne peut pas lire en une passe.

   La vue Jour gèle déjà sa colonne de noms depuis longtemps
   (« .jgrid .jlab »). On lui emprunte sa solution plutôt que d'en
   inventer une : « position:sticky; left:0 », et un fond OPAQUE —
   sans lui, les shifts défileraient en transparence dessous.

   Chaque famille de rangée porte son propre fond, et il faut le
   redire sur la case gelée : « background » ne s'hérite pas, et une
   case sans fond laisse voir ce qui passe derrière. */
.pl2 .pgh > .c0,
.prow > .pemp,
.pfoot > .c0,
.trow > .tlab,
.eqsep > .eql,
.pl2 .besrow > .c0{position:sticky;left:0;z-index:6}
/* Les fonds, famille par famille. La rangée ordinaire est sur la
   carte ; l'en-tête, le pied et le besoin sont sur la surface ; les
   non-assignés ont leur crème à eux. */
.prow > .pemp{background:var(--carte)}
.prow-na > .pemp{background:#FCF9F1}
.prow:hover > .pemp{background:#FDFCF9}
.pl2 .pgh > .c0,
.pfoot > .c0,
.eqsep > .eql,
.pl2 .besrow > .c0{background:var(--surface-2)}
.trow > .tlab{background:var(--carte)}
/* Un filet à la limite du gel : sans lui, on ne voit pas que le
   reste glisse dessous, et les deux zones se confondent. */
.pl2 .pgh > .c0,
.prow > .pemp,
.pfoot > .c0,
.trow > .tlab,
.eqsep > .eql,
.pl2 .besrow > .c0{box-shadow:1px 0 0 var(--ligne)}
/* ── UNE SEULE DÉFINITION POUR LES CINQ GRILLES ──          (v12.8)

   Le planning n'est pas un tableau : c'est une pile de GRILLES
   indépendantes — l'en-tête, chaque rangée de salarié, la rangée des
   non-assignés, les rangées de la vue par postes, celles du besoin
   théorique, le pied des totaux. Rien dans le CSS ne les obligeait à
   s'accorder : chacune redéclarait ses colonnes dans son coin.

   Elles avaient déjà divergé. « .besrow » ouvrait sa première colonne
   à « var(--c0w,210px) » quand toutes les autres tenaient 236 px — et
   « --c0w » n'était défini NULLE PART, si bien que le repli de 210 px
   s'appliquait toujours : ces rangées étaient décalées de 26 px, en
   permanence, sur tous les écrans.

   Le gabarit vit désormais ici, en un seul endroit, et les cinq le
   lisent. C'est la même doctrine que « shift_bande() » en v12.7 :
   une règle recopiée est une règle qui diverge. */
.pl2{min-width:1100px;--pl2c0:236px;--pl2cols:var(--pl2c0) repeat(7,minmax(0,1fr));
  /* ── LA TEINTE DU JOUR, UNE SEULE FOIS ──                 (v13.3)
     Il y en avait DEUX : « --terra-pale » (252,237,231) pour
     l'en-tête, le pied et les bandeaux d'équipe, et « #FEF7F0 »
     (254,247,240) pour les cases de jour. MESURÉ en descendant la
     colonne pixel par pixel : onze bandes, alternant les deux
     valeurs — la colonne du jour se lisait comme un empilement de
     rectangles plutôt que comme une colonne.

     Elle vaut désormais une seule chose, et cette chose a un nom :
     changer la teinte du jour se fait ici, et nulle part ailleurs. */
  --auj:var(--terra-pale)}

/* ═══ LES SEPT COLONNES SONT ÉGALES, ET LE RESTENT ═══        (v12.8)

   Le planning n'est pas UN tableau : c'est une pile de GRILLES
   indépendantes — l'en-tête des jours, chaque rangée de salarié, la
   rangée des non-assignés, le pied des totaux, les rangées de la vue
   par postes. Elles déclaraient toutes « repeat(7,1fr) », et l'on
   pouvait croire que cela suffisait à les aligner.

   Cela ne suffit pas. « 1fr » vaut « minmax(auto,1fr) » : le minimum
   AUTO empêche une colonne de descendre sous la largeur minimale de
   son contenu. Une grille dont une case porte quelque chose de large
   et d'insécable voit donc cette colonne DÉBORDER de sa part égale,
   et les six autres se serrer pour compenser.

   Chaque grille sizant ses colonnes d'après SON propre contenu, elles
   divergent dès que leurs contenus diffèrent.

   MESURÉ, à 1280 px de fenêtre, avec la météo dans l'en-tête :
   l'en-tête donnait 121 · 121 · 121 · 121 · 167 · 121 · 121 — la
   cinquième colonne, celle du jour même, gonflée par son bloc météo —
   pendant que les rangées de salariés donnaient sept fois 128. Les
   colonnes se décalaient jusqu'à 339 px de l'en-tête, et le planning
   « se cassait la gueule » d'autant plus que l'écran était petit,
   puisque la part égale y devient plus étroite que le contenu.

   « minmax(0,1fr) » retire ce minimum : les sept colonnes sont
   strictement égales, quoi qu'elles portent. C'est au CONTENU de
   savoir se réduire — d'où les « min-width:0 » qui suivent. Le
   défilement horizontal de « .pwrap », borné par « .pl2 », reste le
   filet de sécurité quand la fenêtre devient vraiment étroite. */
.pl2 .pgh{display:grid;grid-template-columns:var(--pl2cols);
  border-bottom:1px solid var(--ligne);background:var(--surface-2)}
.pl2 .pgh .c0{padding:9px 12px;font-size:10.5px;font-weight:600;letter-spacing:.06em;
  text-transform:uppercase;color:var(--muet);display:flex;align-items:center;gap:8px}
/* Sans « min-width:0 », la case reprendrait par le bas ce que
   « minmax(0,1fr) » lui a retiré par le haut : son contenu la
   ferait déborder de sa colonne au lieu de se réduire (v12.8). */
.pl2 .dd{padding:0;text-align:left;border-left:1px solid var(--ligne);min-width:0}
.dd .dtop{min-width:0}
/* ── LA CASE D'EN-TÊTE PASSE À LA LIGNE ──                  (v12.8)

   Colonnes égales, la case d'un jour vaut 128 px à 1280 px de
   fenêtre. Or, météo affichée, sa rangée en réclame 175 : la date
   (67), le relevé (48), le bouton de copie (24), plus les marges.
   Elle les prenait EN ÉLARGISSANT SA COLONNE — c'est très exactement
   ce qui désalignait le planning.

   Les colonnes ne cédant plus, c'est au contenu de s'arranger. La
   date garde sa largeur minimale et le relevé passe DESSOUS quand il
   n'y a pas la place : l'en-tête grandit d'une ligne sur les écrans
   étroits, et de rien du tout sur les larges. Aucun seuil à choisir,
   aucune règle de média — la mise en page décide toute seule.

   L'alternative était de porter « .pl2{min-width} » à 1461 px pour
   que sept cases de 175 px tiennent : le planning aurait défilé
   horizontalement sur tous les portables. */
.dd .dtop{display:flex;align-items:center;gap:8px;padding:8px 10px 7px;flex-wrap:wrap}
.dd .dgauche{min-width:62px;flex:1 1 auto}
.dd .evts{display:flex;flex-direction:column;gap:3px;flex:none}
.pl2 .dd .d1{font-size:11.5px;font-weight:600;line-height:1.1;color:var(--encre-2);
  text-transform:capitalize;letter-spacing:.02em;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.pl2 .dd .d2{font-family:var(--f-titre);font-weight:600;font-size:26px;line-height:1;color:var(--encre);
  margin:1px 0 0;letter-spacing:-.02em}
.pl2 .dd .d3{font-size:10.5px;font-weight:500;color:var(--muet);line-height:1.2;text-transform:lowercase;
  white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.pl2 .dd.we{background:#F6F2E9}
.pl2 .dd.today{background:var(--auj)}
.pl2 .dd.today .d1,.pl2 .dd.today .d3{color:var(--terra-h)}
.pl2 .dd.today .d2{color:var(--terra-h)}
.prow{display:grid;grid-template-columns:var(--pl2cols);border-bottom:1px solid var(--surface-2)}
.prow:last-of-type{border-bottom:none}
.prow:hover{background:#FDFCF9}
.prow-na{background:#FCF9F1}
.pemp{padding:10px 10px 10px 14px;display:flex;gap:10px;align-items:center;
  border-right:1px solid var(--surface-2);min-width:0}
.pemp .avm{width:32px;height:32px;border-radius:50%;color:#fff;display:flex;align-items:center;
  justify-content:center;font-size:11px;font-weight:700;flex:none}
/* Le badge d'alerte a quitté cette zone : il se pose dans le coin
   de la cellule (.wcoin), sans rien pousser ni masquer. */
.pemp .pn{font-weight:600;font-size:13px;color:var(--encre);line-height:1.15;
  white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.pemp .pn a:hover{color:var(--terra-h)}
.pemp .cnt{display:flex;gap:5px;align-items:center;margin-top:4px;font-size:10.5px;
  font-weight:500;color:var(--muet);white-space:nowrap}
.pemp .cnt b{font-weight:600;color:var(--encre-2)}
.pemp .cnt b:first-child{font-weight:700;color:var(--encre)}
.pemp .cnt i{font-style:normal;opacity:.45}
.dlt{font-size:9.5px;font-weight:700;padding:1px 6px;border-radius:6px;border:1px solid transparent}
.dlt.plus2{background:var(--jaune-pale);border-color:#EBD9AC;color:var(--jaune)}
.dlt.moins{background:var(--bleu-pale);border-color:#D6DDEC;color:var(--bleu)}
.dlt.zero{background:var(--vert-pale);border-color:#D8E5C9;color:var(--vert)}
.pcell{border-left:1px solid var(--surface-2);padding:6px;display:flex;flex-direction:column;
  gap:6px;min-height:74px;position:relative}
.pcell.we{background:#FBF8F1}
.pcell.today{background:var(--auj)}
.pcell.dover{background:var(--bleu-pale)!important;outline:2px dashed var(--bleu);
  outline-offset:-3px;border-radius:10px}
.pcell .plus{border:1.5px dashed var(--ligne-2);border-radius:8px;background:none;color:var(--terra);
  font-size:15px;font-weight:700;cursor:pointer;min-height:26px;opacity:0;transition:opacity .12s;
  pointer-events:none}
.pcell:hover .plus{opacity:1;pointer-events:auto}
.pcell:hover .plus:hover{background:var(--terra-pale);border-color:var(--terra);border-style:solid}
.pcell .plus:hover{background:var(--surface-2)}
/* La vignette de favori reprend l'apparence d'un shift SANS en
   porter la classe : « .sh[draggable] » sert au glisser-déposer des
   shifts, et une vignette n'en est pas un (v7.91). */
.sh,.favbar .favtag{border-radius:8px;padding:6px 9px;font-size:13px;font-weight:600;line-height:1.3;
  cursor:grab;border:1px solid transparent;border-left-width:3px;display:block;user-select:none}
.sh:active{cursor:grabbing}
.sh.dragsrc{opacity:.35}
.sh .tg,.favbar .favtag .tg{display:block;font-size:10.5px;font-weight:600;letter-spacing:0;text-transform:none;
  opacity:.75;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;margin-bottom:1px}
.sh .hh,.favbar .favtag .hh{white-space:nowrap;font-weight:700}
.sh:hover,.favbar .favtag:hover{filter:brightness(.97)}
.sh{position:relative}
.sh .pz,.favbar .favtag .pz{display:block;font-size:10px;font-weight:600;opacity:.72;margin-top:1px;
  white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.wemp.wshift{position:absolute;top:-6px;right:-6px;margin:0;padding:1.5px 5px;
  border:1.5px solid #fff;box-shadow:var(--ombre)}

/* ═══ Pause(s) répétables dans les tiroirs ═══ */
/* Les pastilles de durée et le réglage détaillé se touchaient : la
   ligne de paramètres semblait faire partie des boutons. Un espace
   les distingue — ce sont deux gestes différents (v7.80). */
.pauses{display:flex;flex-direction:column;gap:8px}
.pauses:not(:empty){margin-top:12px}
.pline{display:flex;align-items:center;gap:9px}
.pdur{display:flex;align-items:center;border:1px solid var(--ligne-2);border-radius:10px;
  background:#fff;padding:0 10px 0 12px;height:37px;flex:none;width:104px}
.pdur input{border:none;outline:none;width:44px;font-family:var(--f-ui);font-size:13px;
  font-weight:600;color:var(--encre);background:none;-moz-appearance:textfield}
.pdur input::-webkit-outer-spin-button,.pdur input::-webkit-inner-spin-button{-webkit-appearance:none;margin:0}
.pdur span{font-size:11.5px;font-weight:600;color:var(--muet);margin-left:auto}
.pdur:focus-within{border-color:var(--terra)}
.pdur.ko{border-color:var(--rouge)}
.phadd{border:none;background:none;font-family:var(--f-ui);font-size:12.5px;font-weight:600;
  color:var(--encre-2);cursor:pointer;padding:0 4px;white-space:nowrap;flex:1;text-align:left}
.phadd:hover{color:var(--terra-h)}
.phrs{display:none;align-items:center;gap:6px;flex:1;min-width:0}
.pline.withh .phadd{display:none}
.pline.withh .phrs{display:flex}
.phrs .fi{height:37px;padding:0 8px;font-size:12.5px;width:auto;flex:1;min-width:0}
.phrs .pto{font-size:11.5px;font-weight:600;color:var(--muet);flex:none}
.phdel{border:none;background:none;color:var(--muet);cursor:pointer;font-size:13px;
  padding:2px 4px;flex:none;font-family:var(--f-ui)}
.phdel:hover{color:var(--encre)}
.pdel{border:none;background:none;color:var(--rouge);cursor:pointer;padding:4px;flex:none;
  display:flex;align-items:center;border-radius:8px}
.pdel svg{width:16px;height:16px}
.pdel:hover{background:var(--rouge-pale)}
.addp{border:none;background:none;font-family:var(--f-ui);font-size:12.5px;font-weight:600;
  color:var(--encre-2);cursor:pointer;padding:8px 2px 2px;text-align:left;display:block}
.addp:hover{color:var(--terra-h)}
.perr{display:none;align-items:flex-start;gap:8px;background:var(--rouge-pale);
  border:1px solid #F0CFD1;border-radius:10px;padding:9px 12px;margin-top:8px;
  font-size:11.5px;font-weight:500;color:var(--rouge);line-height:1.45}
.perr.on{display:flex}
.perr::before{content:'⚠';font-size:12px;flex:none;line-height:1.3}
.sh .who{display:block;font-size:11px;font-weight:600;opacity:.85;margin-bottom:1px}
/* L'écart suit l'heure : « float:right » l'envoyait au bord droit,
   loin de la valeur qu'il commente (v8.1). */
/* ── L'écart, dans la couleur de l'étiquette ──
   Vert et rouge annonçaient un JUGEMENT — bien / mal — là où il n'y
   a qu'une mesure : arriver dix minutes plus tôt n'est pas une bonne
   nouvelle, et partir dix minutes plus tard n'est pas une faute. Et
   deux rouges au milieu d'un planning déjà coloré par les étiquettes
   faisaient trois systèmes de couleur qui se disputaient l'œil.
   L'encadré prend donc la bordure de son étiquette : il appartient
   visiblement à son shift, et la couleur ne dit plus rien qu'elle ne
   sait pas (v10.0). */
.sh .dl, .jsh .dl{display:inline-block;font-size:9px;font-weight:700;margin-left:5px;vertical-align:1px;
  background:var(--tbd,var(--ligne-2));color:var(--ttx,var(--encre));
  border-radius:5px;padding:1px 5px;line-height:1.35}
/* v10.1 · Un cran plus grand : les horaires d'un shift se lisent de
   biais, sur un écran partagé, souvent debout. Le gain de densité que
   donnaient 12 px ne valait pas de plisser les yeux. */
.sh .dl, .jsh .dl{font-size:10px}
/* Shift EN COURS : le contour pointillé dit que le chiffre n'est pas
   arrêté — il se recalculera au départ. */
.sh .dl.enc{background:transparent;border:1px dashed var(--tbd,var(--ligne-2));
  color:var(--ttx,var(--encre))}
/* Une absence se lit comme une PÉRIODE : bande continue d'un bout
   à l'autre, arrondie seulement à ses extrémités, libellé au seul
   premier jour visible. Les marges négatives suppriment l'espace
   entre les cases pour que la bande ne se coupe pas. */
/* ── LA BANDE D'ABSENCE, EN UNE SEULE PIÈCE ──            (v11.66)

   Elle se dessinait case par case : sept rubans dont seul le premier
   portait le libellé — d'où une première case plus haute que les
   autres, et un nom coupé à deux centimètres.

   Elle est maintenant UN élément posé sur la grille de la ligne, qui
   enjambe autant de colonnes que l'absence dure de jours. Le texte
   dispose donc de toute la période, et il n'y a plus qu'une seule
   hauteur.

   Elle RECOUVRE les cases (même rangée de grille) : c'est ce qui la
   rend continue par-dessus les bordures. Les cases reçoivent en
   échange un retrait par le haut, sans quoi un shift passerait
   dessous. */
/* ── DEUX RANGÉES EXPLICITES, PAS UN RECOUVREMENT ──

   Premier essai : la bande posée SUR les cases, même rangée de
   grille, avec un retrait par le haut pour que les shifts ne
   passent pas dessous.

   Ça ne tenait pas. La bande, placée en colonnes mais sans rangée
   explicite dans le flux d'auto-placement, se retrouvait sur une
   SECONDE rangée — la ligne faisait alors le double de sa hauteur,
   et les fonds de week-end et du jour s'arrêtaient au milieu.

   On déclare donc les deux rangées : la bande en haut, les cases en
   dessous, le nom à cheval sur les deux. Plus rien à deviner, plus
   rien à recouvrir, et la ligne fait exactement la hauteur qu'il
   faut. */
.prow.avecabs{grid-template-rows:auto 1fr}
.prow.avecabs > .pemp{grid-row:1 / span 2}
.prow.avecabs > .pcell{grid-row:2}
.absx{grid-row:1;margin:4px 3px;min-width:0;
  /* Conteneur de requête : ce qui se range dedans se décide sur la
     largeur de LA BANDE, pas sur celle de l'écran (v11.83, plus bas). */
  container-type:inline-size;
  display:flex;align-items:center;gap:8px;
  border-radius:6px;padding:2px 9px;min-height:19px;
  font-size:10px;font-weight:700;letter-spacing:.01em;
  background:var(--surface-2);color:var(--encre-2);
  border:1px solid var(--ligne-2);cursor:pointer}
/* Coupée par le bord de la semaine : le coin reste droit et la bande
   file jusqu'au bord — « ça continue » se voit sans qu'on l'écrive. */
.absx:not(.deb){border-top-left-radius:0;border-bottom-left-radius:0;
  border-left:none;margin-left:0}
.absx:not(.fin){border-top-right-radius:0;border-bottom-right-radius:0;
  border-right:none;margin-right:0}
.absx .ai{flex:none;display:flex;align-items:center;opacity:.75}
.absx .ai .ico{width:11px;height:11px;vertical-align:0}
/* Le libellé prend ce qu'il lui faut, pas toute la bande : la durée
   se lit JUSTE APRÈS lui. Collée au bord droit d'une bande de sept
   jours, elle se retrouvait à dix centimètres du nom qu'elle
   qualifie. */
.absx .absnom{flex:0 1 auto;min-width:0;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.absx .aj{flex:none;font-weight:700;font-size:9px;opacity:.7;
  background:rgba(255,255,255,.55);border-radius:20px;padding:0 6px}
/* ── ET LES HEURES, QUAND LA BANDE EN A LA PLACE ──        (v11.83)

   « 8 j » dit combien de jours l'absence couvre ; il ne dit pas ce
   qu'elle a RETIRÉ au planning. Sur un temps partiel, huit jours
   d'arrêt ne valent pas huit journées de travail.

   Sur une bande d'un jour il n'y a la place ni pour le nom du type,
   ni pour la pastille du justificatif, ni pour deux nombres. Ce sont
   donc les HEURES qui cèdent — le chiffre exact reste dans le panneau
   de survol et dans le tiroir.

   La mesure est celle de la BANDE, pas de l'écran : deux bandes de
   largeurs différentes sur la même ligne ne doivent pas se décider
   ensemble. C'est exactement ce que fait une requête de conteneur ;
   une média-requête les traiterait toutes pareil.

   « inline-size » seul : la hauteur continue de venir du contenu, et
   les dix-neuf pixels de la bande — gagnés en v11.68 après deux
   tentatives — ne bougent pas. Le « container-type » est déclaré une
   seule fois, dans « .absx » plus haut : deux fois, et l'on ne saurait
   plus laquelle gagne (leçon de la v11.73). */
@container (max-width: 190px){ .absx .ajh{display:none} }
/* ── « 1/2 » ──                                            (v11.87)
   Une bande EST une période : elle dit ses jours et ses heures, pas
   ceux de l'arrêt. Rien ne disait pourtant qu'il y en avait une autre.
   Trois caractères le disent ; le reste se lit dans le tiroir. Ils
   cèdent avant les heures : c'est l'indice le moins nécessaire des
   trois. */
.absx .ajp{margin-left:5px;padding:0 4px;border-radius:20px;
  background:rgba(255,255,255,.34);font-size:9px;font-weight:800}
@container (max-width: 250px){ .absx .ajp{display:none} }
/* En attente de validation : trame hachurée, la décision n'est pas prise. */
/* En attente de validation : un contour en pointillés, pas une
   trame. Le hachuré salissait la bande et rendait le libellé moins
   lisible sans rien dire de plus qu'un trait discontinu. */
.absx.att{border-style:dashed}
.absx:hover{filter:brightness(.97)}
/* La pastille du justificatif (v11.70). Elle ne se voit que là où un
   papier est attendu — les congés payés n'en portent aucune.
   Elle ne rétrécit pas : c'est le LIBELLÉ du type qui cède la place
   quand la bande est courte. Un « en retard » tronqué en « en re… »
   ne dit plus rien, alors qu'un nom d'absence coupé se devine. */
/* LA HAUTEUR EST CONTRAINTE, et ce n'est pas de l'esthétique : la
   bande fait 19 px, dont 4 de retrait et 2 de contour — il reste 13
   pour son contenu. Une pastille plus haute ÉPAISSIT la bande, donc
   la ligne, donc toute la grille. Onze pixels de ligne plus un
   contour d'un pixel de chaque côté : treize. */
.absx .absmq{flex:none;font-weight:800;font-size:9px;letter-spacing:.02em;
  border-radius:20px;padding:0 7px;line-height:11px;
  background:rgba(255,255,255,.72);color:inherit;
  border:1px solid currentColor}
/* Le retard tient sa couleur de lui-même : la bande porte déjà la
   teinte du type d'absence, et le rouge doit passer devant. */
.absx .absmq.ko{background:var(--rouge);color:#fff;border-color:transparent}
.absx .absmq.att{background:rgba(255,255,255,.9);border-style:dashed}
.absx .absmq.ok{background:rgba(255,255,255,.55);border-color:transparent;font-weight:700;opacity:.8}

/* Les rubans « .absb » — une absence dessinée case par case — ont
   été retirés en v11.66 : voir « .absx » plus haut. */
.pfoot{display:grid;grid-template-columns:var(--pl2cols);border-top:1px solid var(--ligne);
  background:var(--surface-2)}
.pfoot .c0{padding:10px 14px;font-size:11px;font-weight:600;color:var(--encre-2);
  letter-spacing:.04em;text-transform:uppercase}
.pfoot .fc{padding:8px 4px;text-align:center;border-left:1px solid var(--ligne)}
.pfoot .fc b{display:block;font-size:12px;color:var(--encre)}
.pfoot .fc span{font-size:9.5px;font-weight:500;color:var(--muet)}
.pfoot .fc.low b{color:var(--rouge)}
.pfoot .fc.today{background:var(--auj)}
.pfoot .fc .eur{display:block;font-size:10px;font-weight:700;color:var(--terra-h)}
/* Publication & notes de jour */
.pubpill{display:inline-flex;align-items:center;gap:6px;border-radius:20px;padding:6px 13px;
  font-size:12px;font-weight:600;letter-spacing:0;cursor:pointer;border:1px solid;font-family:var(--f-ui)}
.pubpill .ico{width:12px;height:12px}
.pubpill.ok{background:var(--vert-pale);border-color:#D8E5C9;color:var(--vert)}
.pubpill.brouillon{background:var(--jaune-pale);border-color:#EBD9AC;color:var(--jaune)}
.pubpill:hover{filter:brightness(.97)}
.dnote{display:flex;align-items:center;justify-content:center;gap:5px;width:100%;
  padding:4px 8px;margin-top:2px;border:none;border-top:1px solid var(--ligne);background:var(--jaune-pale);
  color:var(--jaune);font-size:10px;font-weight:600;font-family:var(--f-ui);cursor:pointer;
  text-align:center;line-height:1.3}
.dnote span{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.dnote svg{width:11px;height:11px;flex:none}
.dnote:hover{background:#F6E9C8}
.dnote .ico{width:9px;height:9px;flex:none}
.dnote.add{background:none;color:var(--muet);border-top-color:var(--surface-2);opacity:0;
  transition:opacity .12s}
.dd:hover .dnote.add{opacity:1}
.dnote.add:hover{background:var(--surface-2);color:var(--encre-2)}
.pl2 .dd:hover .dnote.add{color:var(--muet)}
.dnote.add:hover{color:var(--terra-h);background:var(--surface-2)}
/* Gestes */
.delzone{position:fixed;left:50%;bottom:20px;transform:translateX(-50%) translateY(12px);z-index:120;
  background:var(--rouge-pale);border:2px dashed var(--rouge);color:var(--rouge);
  padding:15px 30px;border-radius:14px;font-weight:600;font-size:13px;
  display:flex;align-items:center;gap:9px;
  opacity:0;visibility:hidden;pointer-events:none;transition:opacity .15s,transform .15s}
.delzone.on{opacity:1;visibility:visible;transform:translateX(-50%) translateY(0);pointer-events:auto}
.delzone.hot{background:var(--rouge);border-style:solid;color:#fff;
  transform:translateX(-50%) translateY(0) scale(1.03)}
.delzone svg{width:16px;height:16px}
.chooser{position:fixed;z-index:85;background:#fff;border:1px solid var(--ligne);border-radius:12px;
  box-shadow:var(--ombre-2);display:none;overflow:hidden}
.chooser.on{display:flex}
.chooser button{border:none;background:none;padding:11px 16px;font-size:12.5px;font-weight:600;
  color:var(--encre);cursor:pointer;display:flex;align-items:center;gap:8px}
.chooser button:first-child{border-right:1px solid var(--surface-2)}
.chooser button:hover{background:var(--surface-2);color:var(--terra-h)}
.chooser .ico{width:14px;height:14px}
.toast{position:fixed;bottom:20px;right:20px;background:var(--encre);color:#fff;
  padding:12px 17px;border-radius:12px;font-size:12.5px;font-weight:500;z-index:80;opacity:0;
  transform:translateY(8px);transition:.2s;max-width:360px;pointer-events:auto;box-shadow:var(--ombre-2)}
.toast.on{opacity:1;transform:none}
.toast.ko{background:var(--rouge);color:#fff}
.toast b{color:#fff;font-weight:700}
.tundo{margin-left:8px;border:1px solid rgba(255,255,255,.4);background:none;color:#fff;
  border-radius:7px;padding:2px 8px;font-size:11px;font-weight:600;cursor:pointer;
  font-family:var(--f-ui);pointer-events:auto}
.tundo:hover{background:rgba(255,255,255,.15)}
/* Sélecteur de vue & vue étiquettes */
.vseg{display:flex;background:var(--carte);border:1px solid var(--ligne);border-radius:10px;
  padding:3px;gap:2px;box-shadow:var(--ombre)}
.vseg a{padding:6px 12px;border-radius:7px;font-size:12px;font-weight:600;color:var(--muet)}
.vseg a.on{background:var(--terra-pale);color:var(--terra-h)}
.trow{display:grid;grid-template-columns:var(--pl2cols);border-bottom:1px solid var(--surface-2)}
.trow .tlab{padding:14px 12px 14px 14px;display:flex;align-items:flex-start;
  border-right:1px solid var(--surface-2)}
.trow .tpil{display:inline-flex;align-items:center;gap:7px;border-radius:20px;
  padding:6px 12px;font-size:11.5px;font-weight:600}
.trow .tpil i{width:9px;height:9px;border-radius:50%}

/* ═══ Vue frise ═══
   L'échelle couvre les 24 heures : une largeur fixe par heure et
   un défilement horizontal, plutôt que de deviner les bornes.
   La colonne des noms et celle des totaux restent visibles. */
.frcard{overflow:hidden;padding-bottom:4px}
.frscroll{overflow-x:auto;overflow-y:visible}
.frrule,.frday,.frrow{display:grid;
  grid-template-columns:200px minmax(calc(var(--frh, 80px) * 24), 1fr) 74px;
  align-items:center;min-width:max-content}
.frl,.frt{position:sticky;z-index:3;background:var(--carte)}
.frl{left:0}
.frt{right:0}
.frrule .frl,.frrule .frt,.frday .frl,.frday .frt{background:var(--surface-2)}
.frday.today .frl,.frday.today .frt{background:var(--terra-pale)}
.frrule{border-bottom:1px solid var(--ligne);background:var(--surface-2);height:30px}
.frscale{position:relative;height:100%}
.frscale span{position:absolute;transform:translateX(-50%);white-space:nowrap}
.frscale span.gh{top:7px;font-size:10px;font-weight:700;color:var(--encre)}
/* Les quarts d'heure de la frise n'apparaissent qu'au zoom, quand
   une heure dépasse 150 px. */
.frscale span.gq{top:9px;font-size:8.5px;font-weight:500;color:var(--muet);visibility:hidden}
.frcard.frfin .frscale span.gq{visibility:visible}
.frt{font-size:10px;font-weight:600;color:var(--muet);text-align:center;
  text-transform:uppercase;letter-spacing:.04em}
.frt.mono{font-size:11px;color:var(--encre);font-weight:700}
.frl{padding:0 10px 0 14px;font-size:12px;font-weight:600;color:var(--encre);display:flex;
  align-items:center;gap:8px;min-width:0;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.frday{background:var(--surface-2);border-top:1px solid var(--ligne);height:46px}
.frday.today{background:var(--terra-pale)}
.frday .frl b{font-family:var(--f-titre);font-weight:600;font-size:15px;text-transform:none;letter-spacing:0}
.frday .frl span{font-size:9.5px;color:var(--muet);font-weight:500;text-transform:uppercase}
.frrow{border-top:1px solid var(--surface-2);height:46px}
.frrow:hover{background:#FDFCF9}
.frrow .frl{font-weight:500;font-size:12px}
.frrow .avm{width:22px;height:22px;border-radius:50%;color:#fff;display:inline-flex;
  align-items:center;justify-content:center;font-size:8px;font-weight:700;flex:none}
.frband{position:relative;height:100%}
.frband .fre{position:absolute;top:50%;transform:translateY(-50%);text-align:center;
  font-size:10px;font-weight:600;color:#BCAF9B;font-style:normal}
.frband .fre.hi{color:var(--encre);font-size:11px}
.frband i.frh,.frband .frpic{display:none}
.frtrack{position:relative;height:100%;cursor:pointer;background:none}
/* Trois niveaux de repères, DESSINÉS EN CSS : les rendre en HTML
   demandait 8 000 éléments par semaine, soit un mégaoctet de page.
   Trois dégradés répétitifs font le même travail pour rien.
   --frh = largeur d'une heure ; 24 h occupent donc 24 × --frh. */
.frtrack{background-image:
  repeating-linear-gradient(to right, #FAF6EE 0 1px, transparent 1px calc(var(--frh) / 12)),
  repeating-linear-gradient(to right, #EFE7D8 0 1px, transparent 1px calc(var(--frh) / 4)),
  repeating-linear-gradient(to right, var(--ligne-2) 0 1px, transparent 1px var(--frh));
  background-position:0 0;background-repeat:repeat}
.frbar{position:absolute;top:8px;bottom:8px;border-radius:8px;overflow:hidden;
  border:1px solid rgba(62,43,26,.08);border-left-width:3px;display:flex;
  align-items:center;justify-content:flex-start;gap:7px;padding:0 8px}
.frbar .btg{font-size:8.5px;font-weight:600;letter-spacing:.03em;text-transform:uppercase;
  opacity:.7;white-space:nowrap}
.frbar .bhh{font-size:10.5px;font-weight:700;white-space:nowrap}
.frbar i{display:none}
.frv{color:var(--muet);font-size:10.5px;font-weight:500;font-style:italic}
.nowline{position:absolute;top:0;bottom:0;width:2px;background:var(--rouge);z-index:2}
.nowline.nowdot::after{content:'';display:block;position:absolute;top:-1px;left:-3px;
  width:8px;height:8px;border-radius:50%;background:var(--rouge)}
.rgrid{display:grid;grid-template-columns:repeat(auto-fill,minmax(300px,1fr));gap:10px}
.rc{border:1px solid var(--ligne);border-radius:var(--r);padding:11px 14px;display:flex;
  align-items:center;gap:10px;background:var(--carte)}
.rc .avm2{width:30px;height:30px;border-radius:50%;color:#fff;display:flex;align-items:center;
  justify-content:center;font-size:10px;font-weight:700;flex:none}
.rc .n{font-size:12px;font-weight:600;color:var(--encre)}
.rc .h{font-size:10.5px;font-weight:500;color:var(--muet)}
.rc .d{margin-left:auto;font-size:11px;font-weight:700;padding:3px 8px;border-radius:8px}
.rc .d.p{background:var(--vert-pale);color:var(--vert)}
.rc .d.m{background:var(--rouge-pale);color:var(--rouge)}

/* ═══ Rail latéral (pages planning, $navMini) ═══ */

body.navmini .content{padding:16px 20px 40px;max-width:none}

.plhero{margin-bottom:12px}
.phero{margin-right:6px}
.phero .eb{font-size:11px;font-weight:600;letter-spacing:.02em;text-transform:none;color:var(--muet)}
.phero h1{font-family:var(--f-titre);font-weight:600;font-size:21px;color:var(--encre);
  line-height:1.15;margin:0;letter-spacing:-.01em}
.grow{flex:1}

/* ═══ Espace salarié (moi.php — consultation desktop) ═══ */
.mjour{display:grid;grid-template-columns:150px 1fr;border-bottom:1px solid var(--surface-2);
  min-height:56px;align-items:center}
.mjour:last-child{border-bottom:none}
.mjour.today{background:var(--terra-pale)}
.mjl{padding:10px 14px;font-size:12.5px}
.mjl b{display:block;color:var(--encre);font-weight:600}
.mjl span{font-size:10px;color:var(--muet);font-weight:600;text-transform:capitalize}
.mjc{display:flex;flex-wrap:wrap;gap:8px;align-items:center;padding:9px 12px}
.msh{border-radius:8px;padding:6px 10px;font-weight:600;border:1px solid transparent;border-left-width:3px}
/* ── L'ÉCHANGE DEMANDÉ ──                                   (v13.15)
   Le shift NE QUITTE PAS le planning de celui qui le propose : tant
   que personne ne l'a pris, c'est lui qui y va. La pastille dit une
   demande en cours, rien de plus — un shift retiré d'emblée
   fabriquerait un trou que personne ne tient. */
/* ── L'APERÇU LÉGAL D'UN ÉCHANGE ──                         (v13.15)
   La question de l'écran, et la seule : si je valide, qu'est-ce que
   ça casse ? La réponse se lit SOUS la demande, sans cliquer — et
   « aucun contrôle en défaut » s'écrit comme un manquement s'écrit :
   un écran qui ne montre que les problèmes laisse croire qu'il n'a
   pas regardé. */
.echr{align-items:flex-start}
.echap{display:flex;flex-wrap:wrap;align-items:center;gap:7px;margin-top:8px}
.echap > b{font-size:12px;font-weight:700}
.echh{font-size:11.5px;color:var(--muet)}
.echf{display:inline-flex}
.echc{display:flex;gap:8px;flex:none;align-items:center}

/* ── L'ESPACE PERSONNEL, EN TÊTE DU TABLEAU DE BORD ──     (v13.16)
   « Mon espace » était un écran ; c'est devenu le premier étage du
   tableau de bord. Son en-tête doit donc se lire comme une SECTION et
   non comme un titre de page : le h1 « Tableau de bord » est au-dessus,
   deux h1 sur un écran ne se hiérarchisent plus. */
.mesp{margin-bottom:18px;padding-bottom:2px;border-bottom:1px solid var(--ligne)}
/* Seul sur l'écran, le bloc EST la page : plus de filet séparateur,
   puisqu'il n'y a rien dont il se sépare (v13.17). */
.mesp.meseul{border-bottom:0;padding-bottom:0}
.meh{font-family:var(--police-titre,inherit);font-size:20px;font-weight:700;margin:0;line-height:1.2}

/* ── L'ONGLET MODULATION DE LA FICHE SALARIÉ ──            (v13.19)
   Un compteur affichait « −795h00 » dans une pastille de trois
   caractères : un verdict sans preuve. Ces blocs déplient la même
   donnée — ce qui est dû, ce qui est fait, et le chemin. */
.modinfo{display:flex;flex-direction:column}
.modinfo .mdl{display:flex;align-items:baseline;gap:14px;padding:11px 16px;
  border-top:1px solid var(--ligne)}
.modinfo .mdl:first-child{border-top:0}
.mdl>span{flex:1;min-width:0;font-size:13px;color:var(--muet)}
.mdl>b{font-size:13.5px;font-weight:700;text-align:right}
.mdgros{font-size:17px!important}
.mdn{display:block;font-size:11.5px;color:var(--muet);font-weight:500;font-style:normal}
.mdd{display:block;font-size:11.5px;color:var(--muet);font-weight:400;font-style:normal;
  max-width:340px;line-height:1.4;margin-top:2px}
/* Le point d'interrogation d'une explication au survol : discret par
   défaut, il ne doit pas rivaliser avec la valeur qu'il commente. */
.mdq{display:inline-flex;align-items:center;justify-content:center;width:14px;height:14px;
  border:1px solid var(--ligne);border-radius:50%;font-size:9px;font-style:normal;
  color:var(--muet);cursor:help;vertical-align:1px;margin-left:3px}

.modecart{display:flex;gap:18px;padding:16px;align-items:stretch;flex-wrap:wrap}
/* Le chiffre qu'on vient chercher : il porte seul la moitié de la
   carte, parce qu'il est la réponse et le reste est la preuve. */
.mdgrand{flex:1;min-width:220px;display:flex;align-items:center;justify-content:center;
  font-size:38px;font-weight:800;letter-spacing:-.02em;border:1px solid var(--ligne);
  border-radius:12px;padding:22px 16px}
.mdgrand.p{color:var(--vert-h,#2E6B4F)}
.mdgrand.m{color:var(--terra)}
.mdcol{flex:1;min-width:260px;display:flex;flex-direction:column;justify-content:center}
.mdcol .mdl{border-top:1px solid var(--ligne);padding:10px 0}
.mdcol .mdl:first-child{border-top:0}

/* Huit colonnes de chiffres : le tableau défile dans SA boîte plutôt
   que de pousser la page — un dossier salarié se lit à la verticale. */
.modtwrap{overflow-x:auto}
.modt{width:100%;border-collapse:collapse;font-size:12.5px}
.modt th{text-align:left;font-size:11px;font-weight:700;color:var(--muet);
  text-transform:uppercase;letter-spacing:.03em;padding:10px 12px;
  background:var(--surface-2);white-space:nowrap;position:sticky;top:0}
.modt td{padding:9px 12px;border-top:1px solid var(--ligne);white-space:nowrap}
.modt tbody tr:hover{background:var(--surface-2)}
.mdc{color:var(--muet)}
.mde{font-weight:700}
.mde.p{color:var(--vert-h,#2E6B4F)}
.mde.m{color:var(--terra)}
/* La semaine en cours est le repère : c'est elle qu'on cherche en
   ouvrant le tableau. Les semaines à venir s'effacent — elles disent
   une prévision, pas un fait. */
.mdnow td{background:var(--terra-pale);font-weight:700}
.mdfut td{color:var(--muet)}
.mdfut .mde{opacity:.75}
.mdsem{display:block;font-size:10.5px;color:var(--muet);font-weight:500;font-style:normal}

/* ── LE CHOIX DES ÉTABLISSEMENTS DU REGISTRE ──            (v13.23)
   Chaque ligne annonce ce qu'elle contient : cocher un établissement
   sans savoir qu'il porte huit lignes incomplètes, c'est imprimer un
   registre non conforme et le découvrir au contrôle. */
.rupl{display:flex;flex-direction:column;border:1px solid var(--ligne);
  border-radius:var(--r-sm);overflow:hidden}
.rupi{display:flex;align-items:center;gap:10px;padding:9px 12px;cursor:pointer;
  border-top:1px solid var(--ligne);font-size:13px}
.rupl .rupi:first-child{border-top:0}
.rupi:hover{background:var(--surface-2)}
#rupMode .rupi{border:1px solid var(--ligne);border-radius:var(--r-sm);margin-top:6px}
.rupn{font-weight:600}
.rupc{margin-left:auto;font-size:11.5px;color:var(--muet);white-space:nowrap}
.rupk{color:var(--rouge)}

/* ── LA DPAE, SUR L'ONGLET CONTRAT ──                      (v13.22)
   Le seul bloc de la fiche qui porte une échéance légale. Il ne crie
   que quand il reste moins de vingt-quatre heures : une carte rouge en
   permanence ne se voit plus. */
.dpcard.urgent{border-color:var(--rouge);box-shadow:0 0 0 1px var(--rouge) inset}
.dprow{display:grid;grid-template-columns:repeat(3,1fr);padding:4px 0}
.dprow>div{padding:12px 18px;border-left:1px solid var(--ligne)}
.dprow>div:first-child{border-left:0}
.dpk span{display:block;font-size:11.5px;color:var(--muet);margin-bottom:3px}
.dpk b{font-family:var(--f-titre);font-size:16px;font-weight:700;display:block}
.dpk i{font-style:normal;font-size:11.5px;color:var(--muet)}
.dpurg{color:var(--rouge)}
.dpmanque{padding:14px 18px 16px}
.dpmanque .r1{font-weight:700;margin-bottom:8px}
.dplist{list-style:none;display:flex;flex-direction:column;gap:6px}
.dplist li{font-size:13px;display:flex;align-items:baseline;gap:10px;
  padding:7px 0;border-top:1px solid var(--ligne)}
.dplist li .lk{margin-left:auto;font-size:12px;white-space:nowrap}
.dpmotif{display:flex;gap:10px;align-items:flex-start;margin:0 18px 14px;
  background:var(--rouge-pale);color:var(--rouge);border-radius:var(--r-sm);
  padding:11px 14px;font-size:12.5px;line-height:1.5}
.dpmotif svg{flex:none;margin-top:2px}
.dpform{display:flex;align-items:center;gap:12px;flex-wrap:wrap}
@media(max-width:1080px){.dprow{grid-template-columns:1fr}
  .dprow>div{border-left:0;border-top:1px solid var(--ligne)}
  .dprow>div:first-child{border-top:0}}

/* ── OÙ FINIT LA PÉRIODE, ET LA COURBE ──                  (v13.20)
   Le solde dit d'où l'on vient ; ces deux blocs disent où l'on va. */
.mdphrase{padding:16px 18px 4px;font-family:var(--f-titre);font-size:19px;
  line-height:1.5;font-weight:500}
.mdphrase b{font-weight:700}
.mdp{color:var(--vert)} .mdm{color:var(--rouge)}
.mdlev{display:grid;grid-template-columns:repeat(4,1fr);padding:12px 0 0}
.mdlev>div{padding:10px 18px;border-left:1px solid var(--ligne)}
.mdlev>div:first-child{border-left:0}
.mdlev span{display:block;font-size:11.5px;color:var(--muet);margin-bottom:3px}
.mdlev b{font-family:var(--f-titre);font-size:20px;font-weight:700;display:block}
.mdlev i{font-style:normal;font-size:11.5px;color:var(--muet)}
.mdbar{padding:14px 18px 16px}
.mdbl{display:flex;justify-content:space-between;font-size:12px;color:var(--encre-2);margin-bottom:6px}
.mdbar .jauge{max-width:none;margin-top:0}
@media(max-width:1080px){.mdlev{grid-template-columns:repeat(2,1fr)}
  .mdlev>div:nth-child(3){border-left:0}}

/* L'ÉCART cumulé, et non les deux cumuls : deux courbes qui montent
   ensemble se touchent presque, et l'œil ne lit pas 50 h sur 900. */
.modtraj{padding:14px 18px 0}
.mdg{width:100%;height:250px;display:block}
.mdgr line{stroke:var(--ligne);stroke-width:1}
.mdgr text{fill:var(--muet);font-size:10px;text-anchor:end;font-family:var(--f-ui)}
.mdgx{fill:var(--muet);font-size:10px;text-anchor:middle;font-family:var(--f-ui)}
.mdga{fill:var(--terra-pale);opacity:.85}
.mdgf{fill:none;stroke:var(--terra);stroke-width:2.4;stroke-linejoin:round}
.mdgp{fill:none;stroke:var(--rouge);stroke-width:2;stroke-dasharray:5 5;opacity:.7}
.mdg0{stroke:var(--encre-2);stroke-width:1.2}
.mdgz{fill:var(--encre-2);font-size:10.5px;text-anchor:end;font-family:var(--f-ui);font-weight:600}
.mdgn{stroke:var(--encre);stroke-width:1;stroke-dasharray:3 3;opacity:.35}
.mdgpt{fill:var(--terra);stroke:#fff;stroke-width:2}
.mdgpf{fill:var(--rouge);stroke:#fff;stroke-width:2}
.mdleg{display:flex;gap:20px;flex-wrap:wrap;padding:4px 0 14px;font-size:12px;color:var(--encre-2)}
.mdleg span{display:inline-flex;align-items:center;gap:7px}
.mdleg i{width:16px;height:3px;border-radius:2px;display:block}
.mdleg i.l1{background:var(--terra)}
.mdleg i.l2{background:repeating-linear-gradient(90deg,var(--rouge) 0 4px,transparent 4px 8px)}
.mdleg .mdn{display:inline;color:var(--muet)}
.mdtri{display:grid;grid-template-columns:repeat(3,1fr);border-top:1px solid var(--ligne)}
.mdtri>div{padding:13px 18px;border-left:1px solid var(--ligne)}
.mdtri>div:first-child{border-left:0}
.mdtri span{display:block;font-size:11.5px;color:var(--muet);margin-bottom:4px}
.mdtri b{font-family:var(--f-titre);font-size:22px;font-weight:700;letter-spacing:-.01em}

/* ── AUJOURD'HUI ET DEMAIN ──                              (v13.17)
   L'écran d'arrivée du salarié portait sa semaine entière : sept
   lignes dont six disaient « repos ». Deux jours suffisent — ce sont
   les seuls qui se périment — et la semaine se lit au planning. */
.mejour .mjl b{display:block;font-size:13.5px}
.mejour .mjl span{font-size:11.5px;color:var(--muet)}
/* La ligne de semaine capitalisait chaque mot pour « Lun 31 / Août »,
   où le mois était SEUL sur sa ligne. Ici la date est d'un tenant :
   « Dim 6 Septembre » écrit un mois avec une majuscule qui n'existe
   pas en français (v13.17). */
.mejour .mjl span{text-transform:none}
/* Deux boutons de même taille sur une ligne : refuser et accepter
   sont deux réponses de même rang, et la règle d'or interdit d'en
   grossir une pour pousser à la choisir. */
.mact2{display:flex;gap:8px;flex:none;align-items:center}

/* ── LE TIROIR DU SALARIÉ SUR SON SHIFT ──                 (v13.17)
   « Je clique sur le shift et je demande l'échange avec quelqu'un. »
   Un salarié pose UNE question à son shift ; ce tiroir répond à
   celle-là et s'arrête. Il réemploie la coquille du kit (.dwr .panel
   .ph .pb) : c'est le même objet, ce n'est pas le même contenu. */
.mnres{font-size:15px;padding:14px 18px;border-bottom:1px solid var(--ligne)}
.mnpo{font-weight:800}
.mnti{font-size:12px;font-weight:800;text-transform:uppercase;letter-spacing:.04em;
  color:var(--muet);padding:16px 18px 0}
.mnsub{font-size:12.5px;color:var(--muet);padding:4px 18px 10px;line-height:1.45}
.mncands{display:flex;flex-direction:column;gap:7px;padding:0 18px}
/* Un collègue = un bouton pleine largeur : la liste se parcourt du
   pouce comme de l'œil, et le nom ne se coupe pas. */
.mncand{display:block}
.mncand .btn{width:100%;justify-content:flex-start;gap:10px;padding:9px 12px}
.mnav{width:26px;height:26px;border-radius:50%;flex:none;display:inline-flex;
  align-items:center;justify-content:center;color:#fff;font-size:11px;font-weight:800}
/* « ou » sépare deux gestes de même rang : demander à quelqu'un, ou
   ouvrir à tous. Ni l'un ni l'autre n'est le repli de l'autre. */
.mnou{display:flex;align-items:center;gap:10px;padding:16px 18px 10px;
  font-size:11.5px;color:var(--muet);text-transform:uppercase;letter-spacing:.06em}
.mnou::before,.mnou::after{content:"";height:1px;background:var(--ligne);flex:1}
.mnform{padding:0 18px 16px;display:flex;flex-direction:column;gap:6px;align-items:flex-start}
.mnaide{font-size:11.5px;color:var(--muet)}
.mnbox{margin:14px 18px;padding:13px 15px;border:1px dashed var(--terra);
  border-radius:11px;background:var(--terra-pale)}
.mnbt{font-size:13.5px;font-weight:800;color:var(--terra)}
.mnbs{font-size:12.5px;color:var(--texte);margin:4px 0 10px;line-height:1.45}
.mnbox .mnform{padding:0}
.mnhors{margin:14px 18px;font-size:12.5px;color:var(--muet);font-style:italic;line-height:1.5}

.mech{display:inline-flex;align-items:center;gap:6px;font-size:11px;font-weight:600;
  color:var(--terra);background:var(--terra-pale);border-radius:20px;padding:2px 9px;
  border:1px dashed var(--terra)}
/* Hors de la fenêtre d'échange, on ne grise pas le bouton : on dit
   pourquoi. Un bouton mort fait chercher la panne. */
.mhors{margin-left:auto;font-size:11.5px;color:var(--muet);font-style:italic}
.mact{margin-left:auto}
.mjc .mact + .mact,.mjc .mhors + .mhors{margin-left:8px}
.msh .tg{display:block;font-size:9.5px;letter-spacing:0;text-transform:none;opacity:.75}
.msh .hh{font-size:12px;white-space:nowrap;font-weight:700}
.mrepos{font-size:11.5px;color:var(--muet);font-style:italic;font-weight:500}
.mcol{font-size:10.5px;color:var(--muet);font-weight:500}

/* ═══ Pages auth ═══                              (v11.89)

   ── CE QUI N'ALLAIT PAS ──

   Une carte de 400 px au milieu de 1440 px de crème, et sous le
   bouton quatre liens du même poids : « mot de passe oublié »,
   « essai gratuit 30 jours », « borne de pointage ». Trois publics et
   trois gestes sans rapport, traités pareil. La page ne disait pas non
   plus ce qu'elle ouvre — « PLANNING & RH » en 8 px et en capitales
   est une signature, pas une phrase.

   ── CE QU'ON MET À LA PLACE ──

   Deux volets. À gauche, sur le fond encre de la borne : la marque,
   une phrase, et UNE SEMAINE DE PLANNING dessinée avec le vocabulaire
   de l'application. Ce n'est pas un décor — la règle de la maison
   interdit l'image décorative — c'est une démonstration, et elle ne
   pèse pas un octet : ni photo, ni illustration, ni icône.

   À droite, le formulaire, et rien d'autre. La borne et l'essai
   gratuit ont quitté la page : installer une tablette se fait depuis
   le tableau de bord, une fois connecté, par la personne qui en a le
   droit. Se connecter est le seul geste de la page de connexion. */
.page-auth{min-height:100vh;background:var(--fond)}
.authduo{min-height:100vh;display:grid;grid-template-columns:minmax(0,1.05fr) minmax(0,.95fr)}

/* ── LE VOLET, ÉCRIT UNE FOIS POUR CINQ PAGES ──
   Connexion, oubli, réinitialisation, code de vérification,
   inscription : il ne bouge pas d'un pixel de l'une à l'autre. C'est
   ce qui fait qu'on sait toujours où l'on est. */
/* ── LE VOLET EST CLAIR ──                                 (v11.91)

   Il était encre — le brun du texte de l'application, et celui de la
   borne de pointage. Très contrasté, très sérieux, et sévère pour une
   porte d'entrée : on voulait accueillir, on ouvrait sur un mur sombre.

   Le crème est le fond de l'application elle-même. Le planning
   miniature s'y dessine EXACTEMENT comme il apparaît une fois
   connecté — mêmes fonds, mêmes filets, mêmes couleurs de bande — au
   lieu d'une version claire sur fond sombre qu'on ne reverra jamais.
   Il n'y a plus de rupture entre la porte et la maison.

   Deux fonds clairs côte à côte demandent un filet, sans quoi la
   frontière se lit comme un accident d'affichage. */
.authvg{background:var(--surface-2);color:var(--encre);padding:38px 40px 30px;
  border-right:1px solid var(--ligne);
  display:flex;flex-direction:column;gap:18px;overflow:hidden}
/* ── LE BLOC RESPIRE AU MILIEU, LE PIED RESTE EN BAS ──
   Deux « margin auto » qui se partagent la place libre : le contenu se
   centre entre le haut et le pied, sans que le pied quitte le bas. Un
   « justify-content:center » aurait décollé le pied. */
.authmq{display:flex;align-items:center;gap:11px;margin-top:auto}
.authmq .lg-tile{margin:0}
.authmq .lgm{color:var(--encre)}
.authvg h1{font-family:var(--f-titre);font-size:27px;font-weight:600;line-height:1.28;
  letter-spacing:-.015em;margin:4px 0 0;color:var(--encre);max-width:20ch}
.authbl{margin:0;font-size:13.5px;line-height:1.6;color:var(--encre-2);max-width:36ch}
.authpd{margin-top:auto;font-size:10.5px;color:var(--muet);letter-spacing:.06em;
  text-transform:uppercase;font-weight:600}

/* ── LE PANNEAU DE DROITE ──
   Centré verticalement sur grand écran, collé en haut sur petit : le
   clavier d'un téléphone mange la moitié de l'écran dès qu'on touche
   un champ, et un formulaire centré passe alors sous lui. */
.authvd{background:var(--carte);padding:40px;display:flex;flex-direction:column;
  justify-content:center;min-width:0}
.authvd > .in{width:min(360px,100%);margin:0 auto}
.authvd h1{font-family:var(--f-titre);font-size:25px;font-weight:600;letter-spacing:-.015em;
  margin:0 0 4px;line-height:1.2}
.auth-p{font-size:12.5px;color:var(--muet);text-align:left;line-height:1.55;margin:0 0 4px}
.auth-p code{background:var(--surface-2);border:1px solid var(--ligne);border-radius:5px;
  padding:1px 5px;font-size:11px}
.authvd form{margin-top:18px}
.authvd .btn{margin-top:16px}
.authvd .alert{text-align:left;margin:0 0 16px}

/* ── LE VOLET RACONTE ──                                   (v13.4)

   La v11.89 dessinait une semaine figée (« .authsem »). Le volet joue
   désormais une histoire en quatre scènes — voir auth_volet.php pour
   la règle de ce qui bouge. Les classes « an… » sont les siennes ;
   « .apl2 / .aphd / .aprow / .apcell » dessinent la grille miniature
   avec les formes du vrai planning.

   La pile a une HAUTEUR FIXE : les scènes n'ont pas la même hauteur
   naturelle, et sans cela le volet respirerait à chaque changement. */
.authanim{position:relative;height:284px;margin-top:4px}
.anscene{position:absolute;inset:0 0 26px 0;opacity:0;transition:opacity .6s ease;pointer-events:none}
.anscene.on{opacity:1}
.anleg{position:absolute;left:0;right:0;bottom:0;display:flex;align-items:center;gap:8px}
.anlt{font-size:10px;font-weight:700;letter-spacing:.05em;text-transform:uppercase;color:var(--muet);
  margin-right:auto;transition:opacity .3s}
.anpts{display:flex;gap:5px}
.anpts i{width:6px;height:6px;border-radius:50%;background:var(--ligne-2);transition:all .3s}
.anpts i.on{background:var(--terra);width:16px;border-radius:3px}
/* L'ondée d'un toucher : le seul effet qui n'existe pas dans le
   produit, et il ne sert qu'à montrer OÙ le doigt s'est posé. */
.antap{position:absolute;left:50%;top:50%;width:10px;height:10px;margin:-5px 0 0 -5px;border-radius:50%;
  background:rgba(233,102,70,.45);opacity:0;pointer-events:none}
.antap.go{animation:antap .7s ease-out}
@keyframes antap{0%{opacity:.9;transform:scale(1)}100%{opacity:0;transform:scale(7)}}

/* 1 · le planning */
.apl2{position:relative;background:var(--carte);border:1px solid var(--ligne);border-radius:12px;
  padding:10px 12px 11px;font-size:9px}
.aphd,.aprow{display:grid;grid-template-columns:78px repeat(7,minmax(0,1fr));gap:3px;align-items:center}
.aphd{margin-bottom:5px}
.aphd span{text-align:center;color:var(--muet);font-weight:700;letter-spacing:.04em;font-size:8px;
  display:flex;flex-direction:column;align-items:center;gap:1px;padding:3px 0;border-radius:5px}
.aphd span b{font-family:var(--f-titre);font-size:13px;color:var(--encre);font-weight:600}
.aphd span.auj{background:var(--auj,var(--terra-pale))}
.aphd span.auj b,.aphd span.auj{color:var(--terra-h)}
.apc0{text-align:left!important;color:var(--encre-2)!important;font-weight:600!important;
  display:flex!important;flex-direction:row!important;align-items:center;gap:5px;padding:0!important;
  white-space:nowrap;overflow:hidden;font-size:9.5px!important;background:none!important}
.antot{flex-direction:column!important;align-items:flex-start!important;gap:2px!important}
.antot > span{display:flex;align-items:baseline;gap:3px}
.antot b{font-family:var(--f-titre);font-size:12px!important;color:var(--encre);font-weight:600;
  font-variant-numeric:tabular-nums}
.anpub{font-style:normal;font-size:7.5px;font-weight:700;letter-spacing:.03em;text-transform:uppercase;
  background:var(--jaune-pale);color:var(--jaune);border:1px solid #EBD9AC;border-radius:20px;padding:1px 7px;
  transition:all .4s}
.anpub.go{background:var(--vert-pale);color:var(--vert);border-color:#D8E5C9}
.apav{width:16px;height:16px;border-radius:50%;color:#fff;font-size:7px;font-weight:700;display:inline-flex;
  align-items:center;justify-content:center;flex:none;font-style:normal}
.aprow{margin-bottom:3px}
/* Sans « grid-row », une colonne explicite suffit à faire descendre
   l'élément à la ligne suivante (leçon de la v11.89). */
.aprow > *{grid-row:1}
.apcell{height:26px;border-radius:4px;background:#FBF9F4;display:flex;align-items:stretch;padding:2px;
  transition:background .3s,box-shadow .3s}
.apcell.auj{background:var(--auj,var(--terra-pale))}
.apcell.cible{box-shadow:inset 0 0 0 1.5px var(--terra);background:var(--auj,var(--terra-pale))}
.ansh{flex:1;border-radius:4px;border-left:3px solid;font-style:normal;font-weight:700;font-size:8.5px;
  display:flex;align-items:center;justify-content:center;white-space:nowrap;overflow:hidden;
  opacity:0;transform:scale(.8);transition:opacity .25s,transform .3s cubic-bezier(.2,.9,.3,1.2)}
.ansh.go{opacity:1;transform:none}
/* La carte qu'on déplace vit HORS de la grille : elle glisse d'une
   case à l'autre, et c'est le geste le plus fréquent du planning. */
.andrag{position:absolute;width:0;height:22px;left:0;top:0;opacity:0;transform:none;
  box-shadow:0 6px 14px rgba(62,43,26,.22);
  transition:left .8s cubic-bezier(.4,0,.2,1),top .8s cubic-bezier(.4,0,.2,1),opacity .2s,transform .3s}
.andrag.go{opacity:1}
.andrag.pose{box-shadow:none}
.apabs{height:18px;align-self:center;border-radius:4px;font-weight:700;font-size:8px;display:flex;
  align-items:center;padding:0 7px;white-space:nowrap;overflow:hidden;background:#E7F1EF;color:#2F6A5F}
.apabs.anabs{opacity:0;transform:scaleX(.3);transform-origin:left;border:1px dashed #2F6A5F;
  transition:opacity .3s,transform .5s cubic-bezier(.2,.9,.3,1.1)}
.anabs.go{opacity:1;transform:none}
.anabs.ok{border-style:solid;border-color:transparent}

/* 2 · le téléphone */
.an-moi{display:flex;justify-content:center}
.authph{position:relative;width:186px;background:var(--carte);border:6px solid var(--encre);border-radius:22px;
  padding:12px 11px;box-shadow:0 8px 22px rgba(62,43,26,.16);overflow:hidden}
.authpht{margin-bottom:6px}
.authpht b{display:block;font-family:var(--f-titre);font-size:14px;font-weight:600;color:var(--encre)}
.authpht i{font-style:normal;font-size:9px;color:var(--muet)}
.authpl{display:flex;align-items:center;gap:6px;padding:5px 0;border-top:1px solid var(--surface-2);font-size:9px}
.authpl span{width:36px;color:var(--muet);font-weight:600}
.authpl b{flex:1;color:var(--encre);font-weight:700}
.authpl i{width:8px;height:8px;border-radius:2px;flex:none}
.authpl em{font-style:normal;font-size:7.5px;color:#2F6A5F;background:#E7F1EF;border-radius:8px;padding:1px 5px;font-weight:700}
.authpl.auj span{color:var(--terra-h)}
.authpl.anrow{max-height:0;padding:0;opacity:0;overflow:hidden;transition:max-height .4s,padding .4s,opacity .4s}
.anrow.go{max-height:30px;padding:5px 0;opacity:1}
.authpb{position:relative;margin-top:9px;background:var(--terra);color:#fff;border-radius:9px;padding:7px;
  text-align:center;font-size:10px;font-weight:700;overflow:hidden}
.ansheet{position:absolute;left:0;right:0;bottom:0;background:var(--carte);border-top:1px solid var(--ligne);
  border-radius:16px 16px 0 0;padding:10px 12px 12px;transform:translateY(105%);
  transition:transform .45s cubic-bezier(.2,.9,.3,1);box-shadow:0 -6px 18px rgba(62,43,26,.12)}
.ansheet.go{transform:none}
.anshh{font-family:var(--f-titre);font-size:12px;font-weight:600;color:var(--encre);margin-bottom:6px}
.anshf{display:flex;justify-content:space-between;align-items:center;font-size:9px;padding:5px 0;
  border-top:1px solid var(--surface-2)}
.anshf span{color:var(--muet);font-weight:600}
.anshf b{color:var(--encre);opacity:0;transition:opacity .3s}
.anshf b.go{opacity:1}
.ansent{position:absolute;left:0;right:0;bottom:0;background:var(--vert);color:#fff;text-align:center;
  font-size:10px;font-weight:700;padding:9px;transform:translateY(105%);
  transition:transform .4s cubic-bezier(.2,.9,.3,1)}
.ansent.go{transform:none}
.ansent b{display:inline-block;margin-right:5px}

/* 3 · la tablette */
.authtab{background:var(--carte);border:1px solid var(--ligne);border-radius:12px;overflow:hidden}
.authth{background:var(--encre);color:#fff;padding:9px 12px;display:flex;align-items:center;gap:9px}
.authtr{width:22px;height:22px;border-radius:50%;background:rgba(255,255,255,.14);display:flex;
  align-items:center;justify-content:center;font-size:14px;flex:none}
.authth b{display:block;font-size:12px;font-weight:700}
.authth i{font-style:normal;font-size:9px;opacity:.6}
.andemn{text-decoration:none;color:var(--terra);font-weight:700;transition:opacity .4s}
.andemn.off{opacity:0}
.authtj{display:flex;gap:4px;padding:8px 10px;border-bottom:1px solid var(--ligne)}
.authtj span{flex:1;display:flex;flex-direction:column;align-items:center;border:1px solid var(--ligne);
  border-radius:7px;padding:4px 0;background:var(--carte)}
.authtj span i{font-style:normal;font-size:7.5px;font-weight:700;color:var(--muet);text-transform:uppercase}
.authtj span b{font-family:var(--f-titre);font-size:14px;font-weight:600;color:var(--encre)}
.authtj span.on{background:var(--terra);border-color:var(--terra)}
.authtj span.on i,.authtj span.on b{color:#fff}
.authts{padding:9px 10px 10px;display:flex;flex-direction:column;gap:6px;background:var(--surface-2)}
.authtc{background:var(--carte);border:1px solid var(--ligne);border-left:3px solid;border-radius:8px;padding:6px 10px}
.authtc b{display:block;font-size:11px;font-weight:700;color:var(--encre)}
.authtc i{font-style:normal;font-size:8.5px;color:var(--muet)}
.andem{display:flex;align-items:center;gap:8px;background:#E7F1EF;border:1px dashed #2F6A5F;border-radius:8px;
  padding:0 10px;max-height:0;opacity:0;overflow:hidden;
  transition:max-height .45s,opacity .4s,padding .45s,border-color .4s,background .4s}
.andem.go{max-height:60px;opacity:1;padding-top:6px;padding-bottom:6px}
.andem.ok{border-style:solid;border-color:transparent;background:var(--vert-pale)}
.andem > div{flex:1;min-width:0}
.andem b{display:block;font-size:10.5px;font-weight:700;color:#2F6A5F}
.andem i{font-style:normal;font-size:8.5px;color:var(--muet)}
.anval{position:relative;background:var(--vert);color:#fff;border-radius:7px;padding:5px 10px;font-size:9.5px;
  font-weight:700;overflow:hidden;flex:none;transition:background .3s}
.andem.ok .anval{background:transparent;color:var(--vert)}

/* 4 · la borne — la grille des cartes, telle qu'on la touche. */
.anborne{background:var(--encre);color:#fff;border-radius:12px;padding:12px 14px 14px;height:100%;
  box-sizing:border-box;display:flex;flex-direction:column;gap:10px}
.anbh{display:flex;align-items:baseline;gap:10px}
.anbh b.anheure{font-family:var(--f-titre);font-size:26px;font-weight:700;line-height:1;font-variant-numeric:tabular-nums}
.anbh > span{font-size:10px;opacity:.7;text-transform:capitalize}
.anbc{margin-left:auto;font-size:9.5px;opacity:.9!important;text-transform:none!important}
.anbc b{font-family:var(--f-titre);font-size:14px;font-weight:600;transition:color .3s}
.anbc b.tick{color:var(--terra)}
.anbg{display:grid;grid-template-columns:repeat(3,1fr);gap:8px;flex:1}
.anbp{position:relative;background:rgba(255,255,255,.07);border:1px solid rgba(255,255,255,.12);border-radius:12px;
  padding:9px 10px;display:flex;flex-direction:column;gap:3px;overflow:hidden;transition:background .4s,border-color .4s}
.anbp i{width:26px;height:26px;border-radius:50%;font-style:normal;font-size:8px;font-weight:700;display:flex;
  align-items:center;justify-content:center}
.anbp em{font-style:normal;font-size:8.5px;opacity:.55}
.anbp.ok{background:rgba(96,140,72,.28);border-color:rgba(140,190,110,.6)}
.anbp.ok em{opacity:1;color:#BFE3A6;font-weight:700}

/* Sans animation : chaque scène est montrée dans son état FINAL, et
   rien ne glisse. */
.authanim.fige .ansh,.authanim.fige .anabs,.authanim.fige .anrow,.authanim.fige .andem{opacity:1;transform:none;max-height:none}
@media (prefers-reduced-motion:reduce){.authanim *{transition:none!important;animation:none!important}}

/* ── LE MOT DE PASSE ET SON ŒIL ──                          (v13.4)
   Le bouton vit DANS le champ, au bout de la ligne ; le champ garde
   sa place à droite pour ne pas écrire sous lui. */
.mdpw{position:relative}
.mdpw .fi{padding-right:40px}
.mdpo{position:absolute;right:6px;top:50%;transform:translateY(-50%);width:28px;height:28px;border:0;
  border-radius:7px;background:none;color:var(--muet);cursor:pointer;display:flex;align-items:center;
  justify-content:center;padding:0}
.mdpo svg{width:16px;height:16px;stroke:currentColor;fill:none;stroke-width:1.8}
.mdpo:hover{background:var(--surface-2);color:var(--encre-2)}
/* Œil ouvert = mot de passe VISIBLE : le bouton dit l'état, pas le
   geste. Barré, il dirait « masqué » alors qu'on le voit. */
.mdpo.on{color:var(--terra-h)}
.mdpo.on::after{content:'';position:absolute;width:20px;height:1.8px;background:currentColor;
  transform:rotate(-45deg);border-radius:2px}

/* ── LE CODE À SIX CASES ──                                 (v13.4)
   La longueur se voit sans se lire, le curseur avance seul, un code
   collé remplit les six. « width:0 + flex:1 » : les cases se
   partagent la ligne, quelle que soit sa largeur. */
.authcode{display:flex;gap:7px}
.authcode .c6{width:0;flex:1;text-align:center;font-family:var(--f-titre);font-size:22px;font-weight:600;
  padding:10px 0;letter-spacing:0}
.authren{color:var(--muet)}
.authren b{color:var(--encre-2);font-variant-numeric:tabular-nums}

/* ── LA PORTE DE L'ESSAI ──                                 (v13.4.1)
   Sur sa propre ligne, et l'argument après le lien, en muet : collé à
   la question, « 30 jours, sans carte bancaire » se coupait en deux.
   (La pastille verte « Vous êtes déconnecté » de la v13.4 a vécu un
   jour : l'état est le TITRE, il n'a pas besoin d'un badge.) */
.authpied-essai{margin-top:22px;line-height:1.7}
.authpied-essai span{color:var(--muet);font-weight:400}
.authpied-essai span::before{content:'·';margin:0 6px}

/* ── LE VOLET PASSE AU-DESSUS, ET MAIGRIT ──
   La miniature disparaît la première : à 400 px de large elle serait
   illisible, et ce qu'on vient faire est en dessous. */
@media (max-width:880px){
  /* Le panneau blanc occupe ce qui reste : sans « 1fr », la page se
     termine sur une bande de crème qui n'appartient à rien. */
  .authduo{grid-template-columns:1fr;grid-template-rows:auto 1fr}
  /* Le volet passe au-dessus : son filet passe donc en dessous. */
  .authvg{padding:22px 22px 20px;gap:11px;border-right:0;border-bottom:1px solid var(--ligne)}
  .authmq{margin-top:0}
  .authvg h1{font-size:19px;max-width:26ch}
  .authbl,.authanim,.authpd{display:none}
  .authvd{padding:26px 22px 34px;justify-content:flex-start}
}

/* ═══ Borne (tablette — hors garde mobile) ═══ */
.page-borne{min-height:100vh;background:var(--encre);display:flex;align-items:center;
  justify-content:center;padding:20px}
.borne-box{width:min(430px,96vw);text-align:center}
.borne-clock{font-family:var(--f-titre);font-weight:600;font-size:60px;color:#fff;line-height:1}
.borne-date{font-size:13px;color:var(--creme);font-weight:500;margin-top:6px;text-transform:capitalize}
.borne-card{background:var(--carte);border-radius:18px;padding:22px;margin-top:20px;
  box-shadow:0 24px 60px rgba(0,0,0,.35)}
.pinrow{display:flex;justify-content:center;gap:10px;margin:6px 0 16px}
.pindot{width:16px;height:16px;border-radius:50%;border:2px solid var(--ligne-2)}
.pindot.full{background:var(--terra);border-color:var(--terra)}
.pinpad{display:grid;grid-template-columns:repeat(3,1fr);gap:9px}
.pinpad button{border:1px solid var(--ligne);background:var(--surface-2);border-radius:12px;
  padding:15px 0;font-size:19px;font-weight:700;color:var(--encre);cursor:pointer}
.pinpad button:active{background:var(--ligne)}
.borne-actions{display:flex;gap:8px;margin-top:14px}
.borne-actions button{flex:1;border:none;border-radius:11px;padding:13px 4px;font-weight:600;
  font-size:12.5px;cursor:pointer;color:#fff}
.ba-arr{background:var(--vert)}.ba-pau{background:#D8A125;color:#fff!important}
.ba-rep{background:var(--bleu)}.ba-dep{background:var(--terra)}
.borne-msg{border-radius:12px;padding:12px;font-size:13px;font-weight:600;margin-bottom:12px}
.borne-msg.ok{background:var(--vert-pale);color:var(--vert)}
.borne-msg.ko{background:var(--rouge-pale);color:var(--rouge)}
.borne-quit{margin-top:16px;font-size:11.5px;color:rgba(255,255,255,.6);display:inline-block}

/* ═══ Kit / styleguide ═══ */
.kitrow{display:grid;grid-template-columns:190px 1fr;gap:16px;padding:15px 18px;
  border-bottom:1px solid var(--ligne);align-items:start}
.kitrow:last-child{border-bottom:none}
.kitrow .kn{font-size:12px;font-weight:600;color:var(--encre);padding-top:6px}
.kitrow .kn small{display:block;font-size:11px;color:var(--muet);font-weight:500;margin-top:2px}
.kitswatch{display:flex;gap:8px;flex-wrap:wrap}
.kitswatch div{width:74px;border-radius:10px;overflow:hidden;border:1px solid var(--ligne);
  font-size:9px;font-weight:600;text-align:center}
.kitswatch div i{display:block;height:36px}
.kitswatch div b{display:block;padding:4px 2px;background:#fff;color:var(--muet)}

/* ═══ Impression du planning ═══ */
@media print{
  .side,.rail,.top,.va,.plbar,.legpl,.cellplus,.pcell .plus,.modal,.filtres,.ddown,.alert,
  .delzone,.toast,.chooser,.dwr{display:none!important}
  html{min-width:0}
  body{background:#fff}
  .app{display:block}
  .content{padding:0;margin:0;max-width:none}
  .vh{margin-bottom:8px}
  .vh h1{font-size:20px}
  .card{border:1px solid #bbb;border-radius:0;box-shadow:none;break-inside:avoid}
  .plgrid,.pl2{min-width:0}
  .shift,.sh,.absx,.pld,.dd,.pfoot .fc,.plfoot .plcell{-webkit-print-color-adjust:exact;print-color-adjust:exact}
  @page{size:A4 landscape;margin:10mm}
}

/* ═══ Dépôt scindé : Déplacer | Dupliquer au moment du drop ═══ */
.pcell.dover{background:var(--bleu-pale)!important;outline:none;border-radius:10px}
.dropsplit{position:absolute;inset:3px;display:flex;gap:3px;z-index:6;pointer-events:none}
.ds-half{flex:1;border:1.5px dashed var(--ligne-2);border-radius:8px;background:rgba(255,255,255,.88);
  display:flex;flex-direction:column;align-items:center;justify-content:center;gap:3px;
  font-size:9.5px;font-weight:700;color:var(--muet);min-width:0;overflow:hidden;transition:all .08s}
.ds-half svg{width:14px;height:14px;flex:none}
.ds-half span{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:92%}
.ds-half.hot{border-color:var(--bleu);border-style:solid;background:var(--bleu-pale);color:var(--bleu)}

/* ═══ Alertes : badge dans la case du salarié + panneau flottant ═══ */
.wemp{display:inline-flex;align-items:center;gap:3px;background:var(--rouge);color:#fff;
  border:none;border-radius:7px;padding:2px 6px;cursor:pointer;vertical-align:1px;margin-left:7px;
  font-family:var(--f-ui);font-size:10px;font-weight:700;line-height:1.3}
.wemp:hover{filter:brightness(.92)}
.wpanel{position:fixed;z-index:70;width:min(400px,90vw);background:var(--carte);
  border:1px solid var(--ligne);border-radius:14px;box-shadow:var(--ombre-2);
  display:none;overflow:hidden}
.wpanel.on{display:block}
/* Bandeau de titre en rouge plein : on doit voir au premier coup
   d'œil qu'il s'agit d'alertes, avant même de lire. */
.wpt{display:flex;align-items:center;gap:8px;font-family:var(--f-titre);font-weight:600;
  font-size:13.5px;color:#fff;background:var(--rouge);padding:11px 16px;
  border-radius:13px 13px 0 0;margin:0}
.wpt::before{content:'';width:16px;height:16px;flex:none;background-color:currentColor;
  -webkit-mask:var(--ico-warn) center/contain no-repeat;
  mask:var(--ico-warn) center/contain no-repeat}
/* Le panneau n'a plus de marge en tête : le bandeau touche les bords */
.wpanel{padding-top:0;overflow:hidden}
.wpanel .wpl{max-height:calc(55vh - 44px);overflow-y:auto}
.wpi{display:flex;gap:11px;padding:11px 16px;border-bottom:1px solid var(--surface-2);align-items:flex-start}
.wpi:last-child{border-bottom:none}
.wpi .avm{width:30px;height:30px;border-radius:50%;color:#fff;display:flex;align-items:center;
  justify-content:center;font-size:10px;font-weight:700;flex:none}
.wpi b{display:block;font-size:12.5px;color:var(--encre)}
.wpi span{display:block;font-size:12px;color:var(--encre-2);line-height:1.45;margin-top:2px}

/* ═══ Configuration : établissements ═══ */
.etabgrid{display:grid;grid-template-columns:repeat(auto-fill,minmax(320px,1fr));gap:14px}
.etabcard{background:var(--carte);border:1px solid var(--ligne);border-radius:var(--r);
  box-shadow:var(--ombre);overflow:hidden;display:block;color:var(--encre)}
.etabcard:hover{border-color:var(--ligne-2);box-shadow:var(--ombre-2)}
.ecc{display:flex;align-items:center;gap:12px;padding:15px 17px 13px}
.ecc .ei{width:38px;height:38px;border-radius:11px;background:var(--terra-pale);
  display:flex;align-items:center;justify-content:center;color:var(--terra-h);flex:none}
.ecc b{display:block;font-family:var(--f-titre);font-weight:600;font-size:15px;line-height:1.2}
.ecc .es{display:block;font-size:11.5px;color:var(--muet);margin-top:2px;
  white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.ecs{display:flex;gap:16px;padding:10px 17px;background:var(--surface-2);
  border-top:1px solid var(--ligne);font-size:11.5px;color:var(--muet)}
.ecs b{color:var(--encre);font-weight:700;font-size:12.5px}

/* Fiche établissement */
.cfgform{max-width:720px}
.cfgactions{max-width:720px;display:flex;justify-content:flex-end;gap:9px;margin:4px 0 26px}
.ch .sico{width:28px;height:28px;border-radius:9px;background:var(--vert-pale);color:var(--vert);
  display:flex;align-items:center;justify-content:center;flex:none}
.ch .sico.ko{background:var(--rouge-pale);color:var(--rouge)}
.ch .sico svg{width:15px;height:15px}
.danger-card{max-width:720px;border-color:#EAD0D1}
.kvrow{display:flex;gap:20px;padding:12px 18px;border-bottom:1px solid var(--surface-2);align-items:baseline}
.kvrow:last-child{border-bottom:none}
.kvrow .k{font-size:12.5px;font-weight:600;color:var(--encre-2);width:220px;flex:none}
.kvrow .vv{font-size:13px;color:var(--encre);flex:1}
.kvrow .vide{color:var(--muet);font-style:italic;font-size:12.5px}
.cfoot{padding:12px 18px;background:var(--surface-2);border-top:1px solid var(--ligne);
  display:flex;justify-content:flex-end}

/* Équipes & étiquettes */
.tagwrap{display:flex;flex-wrap:wrap;gap:8px;padding:14px 18px;align-items:center}
.eqchip{display:inline-flex;align-items:center;gap:7px;border:1px solid var(--ligne-2);
  background:#fff;border-radius:10px;padding:7px 9px 7px 11px;font-size:12.5px;color:var(--encre)}
.eqchip b{font-weight:600}
.eqchip .tn{font-size:10.5px;font-weight:700;color:var(--muet);background:var(--surface-2);
  border-radius:6px;padding:1px 6px}
.eqpen{border:none;background:none;color:var(--muet);cursor:pointer;padding:2px 3px;
  display:inline-flex;align-items:center;font-size:11px;font-family:var(--f-ui);border-radius:6px}
.eqpen:hover{background:var(--surface-2);color:var(--encre)}
.eqpen.ko:hover{background:var(--rouge-pale);color:var(--rouge)}
.tagsec{padding:12px 18px 14px;border-top:1px solid var(--surface-2)}
.tsh{font-family:var(--f-titre);font-weight:600;font-size:13.5px;color:var(--encre);margin-bottom:9px}
.tagchip{display:inline-flex;align-items:center;gap:7px;border:1px solid var(--ligne-2);
  background:#fff;border-radius:8px;padding:7px 13px;font-family:var(--f-ui);font-size:12.5px;
  font-weight:600;color:var(--encre);cursor:pointer}
.tagchip:hover{filter:brightness(.97)}
.tagchip .tn{font-size:10px;font-weight:700;opacity:.65}
.tagadd{border:1px dashed var(--ligne-2);background:none;border-radius:8px;padding:7px 13px;
  font-family:var(--f-ui);font-size:12.5px;font-weight:600;color:var(--muet);cursor:pointer}
.tagadd:hover{border-color:var(--terra);color:var(--terra-h);border-style:solid}

/* ═══ Recherche SIRET (base Sirene) ═══ */
.siretbar{display:flex;gap:8px;align-items:center}
.siretbar .fi{flex:1}
.siretres{margin-top:9px;display:flex;flex-direction:column;gap:6px}
.siretres:empty{margin:0}
.srt{font-size:11.5px;font-weight:600;color:var(--muet);padding:2px 0}
.sret{text-align:left;border:1px solid var(--ligne-2);background:#fff;border-radius:10px;
  padding:10px 13px;cursor:pointer;font-family:var(--f-ui);display:block;width:100%}
.sret:hover{border-color:var(--terra);background:var(--terra-pale)}
.sret b{display:block;font-size:13px;font-weight:600;color:var(--encre)}
.sret .sr1{display:block;font-size:12px;color:var(--encre-2);margin-top:2px}
.sret .sr2{display:block;font-size:11px;color:var(--muet);margin-top:3px}
.sload,.sok,.sko{font-size:12px;font-weight:500;border-radius:10px;padding:9px 12px;line-height:1.45}
.sload{background:var(--surface-2);color:var(--muet);border:1px solid var(--ligne)}
.sok{background:var(--vert-pale);color:var(--vert);border:1px solid #D8E5C9}
.sko{background:var(--rouge-pale);color:var(--rouge);border:1px solid #F0CFD1}
.fi.rempli{border-color:var(--vert);box-shadow:0 0 0 3px rgba(85,128,59,.14);
  transition:border-color .3s,box-shadow .3s}

/* ═══ Équipes & étiquettes fusionnées ═══ */
.eqbloc{padding:13px 18px 14px;border-top:1px solid var(--surface-2)}
.eqhead{display:flex;align-items:center;gap:8px;margin-bottom:10px}
.eqhead b{font-family:var(--f-titre);font-weight:600;font-size:14px;color:var(--encre)}
.eqhead .eqm{font-size:11.5px;color:var(--muet);margin-right:auto}

/* Palette de couleurs (modale étiquette) */
.swgrid{display:grid;grid-template-columns:repeat(8,minmax(0,1fr));gap:7px;padding:2px 0 4px}
.swopt{cursor:pointer;position:relative}
.swopt input{position:absolute;opacity:0;width:0;height:0}
.swopt span{display:flex;align-items:center;justify-content:center;height:34px;border-radius:9px;
  border:1px solid;font-size:11px;font-weight:700;transition:transform .1s}
.swopt:hover span{transform:scale(1.06)}
.swopt input:checked+span{box-shadow:0 0 0 2px var(--encre);border-color:var(--encre)}
.swopt input:focus-visible+span{outline:2px solid var(--terra);outline-offset:2px}
/* Neuf places quand la première sert à hériter : huit teintes plus
   « celle de la liste », sur un seul rang. Deux rangs pour neuf
   pastilles laisseraient une ligne d'une seule case.       (v14.31) */
.swgrid.sw9{grid-template-columns:repeat(9,minmax(0,1fr))}

/* Grille d'icônes */
/* Grille du choix d'icône d'ÉTIQUETTE : des colonnes de largeur
   égale, qui s'adaptent au nombre d'icônes sans jamais les écraser. */
.icgrid{display:grid;grid-template-columns:repeat(auto-fill,minmax(44px,1fr));
  gap:7px;padding:2px 0 4px}
.icopt{cursor:pointer;position:relative}
.icopt input{position:absolute;opacity:0;width:0;height:0}
.icopt span{display:flex;align-items:center;justify-content:center;height:40px;border-radius:9px;
  border:1px solid var(--ligne-2);background:#fff;color:var(--encre-2);transition:all .12s}
.icopt span svg{width:18px;height:18px}
.icopt .icnone{font-size:10px;font-weight:600;color:var(--muet)}
.icopt:hover span{border-color:var(--muet);background:var(--surface-2)}
.icopt input:checked+span{border-color:var(--terra);background:var(--terra-pale);color:var(--terra-h)}
.icopt input:focus-visible+span{outline:2px solid var(--terra);outline-offset:2px}

/* Aperçu de l'étiquette */
.tgprev{background:var(--surface-2);border:1px solid var(--ligne);border-radius:10px;padding:12px}
.tgprev .sh{max-width:180px;cursor:default}
.tgi{display:inline-flex;vertical-align:-2px;margin-right:4px}
.tgi svg{width:11px;height:11px}
.tagchip svg{flex:none}

/* ═══ Utilisateurs : comptes et accès ═══ */
.urow{display:flex;align-items:center;gap:12px;padding:13px 18px;border-bottom:1px solid var(--surface-2);flex-wrap:wrap}
.urow:last-child{border-bottom:none}
.urow:hover{background:var(--surface-2)}
.urow .uinfo{min-width:190px}
.urow .uacces{display:flex;gap:5px;flex-wrap:wrap;flex:1;min-width:180px}
.urow .uact{display:flex;gap:6px;margin-left:auto}

/* ═══ Organisation & facturation ═══ */
.cfg2{display:grid;grid-template-columns:minmax(0,1.55fr) minmax(280px,1fr);gap:20px;align-items:start}
.cfg2 .cfgform{max-width:none}
.cfg2 .cfgactions{max-width:none}
.factapercu{padding:16px 18px;display:flex;flex-direction:column;gap:2px;font-size:12.5px;line-height:1.5}
.factapercu b{font-family:var(--f-titre);font-weight:600;font-size:14.5px;margin-bottom:3px}
.factapercu .fmeta{color:var(--muet);font-size:11.5px;margin-top:4px}
.factapercu .vide{color:#C4B7A3;font-style:italic}

/* ═══ Abonnement : formules et tarif ═══ */
.tarifbox{display:flex;align-items:center;gap:16px;padding:16px 18px;background:var(--surface-2);
  border-bottom:1px solid var(--ligne);flex-wrap:wrap}
.tarifbox .tb1 b{font-family:var(--f-titre);font-weight:600;font-size:17px;display:block}
.tarifbox .tb1 span{font-size:12px;color:var(--muet)}
.tarifbox .tb2{margin-left:auto;text-align:right}
.tarifbox .tb2 b{font-family:var(--f-titre);font-weight:600;font-size:26px;color:var(--terra-h);
  display:block;line-height:1.1;letter-spacing:-.01em}
.tarifbox .tb2 span{font-size:11.5px;color:var(--muet)}
/* v15.1.25 : les avoirs dans la liste des factures (montants négatifs, facture d'origine). */
.tA.ab-fact th,.tA.ab-fact td{padding:10px 12px}
.tA.ab-fact td.num,.tA.ab-fact td.mono,.tA.ab-fact td:nth-child(2){white-space:nowrap}
.tA.ab-fact tr.ab-avoir td{background:var(--surface-2)}
.ab-mut{font-family:var(--f-ui);font-size:11px;color:var(--muet);font-weight:500}
.formules{display:grid;grid-template-columns:1fr 1fr;gap:12px;padding:16px 18px}
.fcard{border:1.5px solid var(--ligne-2);border-radius:var(--r);padding:14px 15px;cursor:pointer;
  display:flex;flex-direction:column;gap:5px;background:#fff;position:relative}
.fcard input{position:absolute;opacity:0}
.fcard:hover{border-color:var(--muet)}
.fcard.on,.fcard:has(input:checked){border-color:var(--terra);background:var(--terra-pale)}
.fc-h{display:flex;align-items:center;gap:8px}
.fc-h b{font-family:var(--f-titre);font-weight:600;font-size:15px}
.fc-p{font-family:var(--f-titre);font-weight:600;font-size:20px;color:var(--encre);letter-spacing:-.01em}
.fc-p i{font-style:normal;font-size:11.5px;font-weight:500;color:var(--muet);margin-left:5px;font-family:var(--f-ui)}
.fc-d{font-size:12px;color:var(--encre-2);line-height:1.45}
.fc-i{font-size:11.5px;color:var(--muet)}

/* ═══ Facture imprimable ═══ */
.factpage{max-width:800px;margin:0 auto;padding:24px 20px 60px}
.factbar{display:flex;align-items:center;gap:10px;margin-bottom:16px}
.factbar .btn:last-child{margin-left:auto}
.factdoc{background:#fff;border:1px solid var(--ligne);border-radius:var(--r);
  box-shadow:var(--ombre);padding:34px 38px}
.fdh{display:flex;justify-content:space-between;align-items:flex-start;gap:20px;
  padding-bottom:20px;border-bottom:2px solid var(--encre)}
.fdnum{text-align:right}
.fdnum b{font-family:var(--f-titre);font-weight:600;font-size:22px;display:block}
.fdnum span{display:block;font-size:12.5px;color:var(--encre-2)}
.fdparties{display:grid;grid-template-columns:1fr 1fr;gap:26px;padding:22px 0}
.fdparties .fdt{font-size:10.5px;font-weight:700;letter-spacing:.08em;text-transform:uppercase;
  color:var(--muet);margin-bottom:6px}
.fdparties b{font-size:14px;display:block;margin-bottom:2px}
.fdparties span{display:block;font-size:12.5px;color:var(--encre-2);line-height:1.5}
.fdparties .fdm{font-size:11.5px;color:var(--muet);margin-top:6px}
.fdtable{width:100%;border-collapse:collapse;margin-top:6px}
.fdtable th{text-align:left;font-size:10.5px;font-weight:700;letter-spacing:.06em;text-transform:uppercase;
  color:var(--muet);padding:9px 0;border-bottom:1px solid var(--ligne-2)}
.fdtable th.rt,.fdtable td.rt{text-align:right}
.fdtable td{padding:14px 0;border-bottom:1px solid var(--surface-2);vertical-align:top;font-size:13px}
.fdtable td b{font-size:13.5px}
.fdp{display:block;font-size:12px;color:var(--muet);margin-top:3px;line-height:1.5}
.fdtot{margin-left:auto;width:min(300px,100%);margin-top:14px}
.fdtot div{display:flex;justify-content:space-between;padding:6px 0;font-size:13px}
.fdtot div span{color:var(--encre-2)}
.fdtot .ttc{border-top:2px solid var(--encre);margin-top:6px;padding-top:10px;font-size:16px}
.fdtot .ttc b{font-family:var(--f-titre);font-weight:600;color:var(--terra-h)}
.fdpied{margin-top:30px;padding-top:16px;border-top:1px solid var(--surface-2);
  font-size:11.5px;color:var(--encre-2);line-height:1.6}
.fdpied .fdm{color:var(--muet);margin-top:6px}
@media print{
  body{background:#fff}
  .factbar{display:none}
  .factpage{max-width:none;padding:0}
  .factdoc{border:none;box-shadow:none;padding:0;border-radius:0}
  @page{size:A4;margin:16mm}
}

/* ═══ Liste des salariés ═══ */
.tabs a .cnt{font-size:10.5px;font-weight:700;color:var(--muet);margin-left:5px}
.tabs a.on .cnt{color:var(--terra-h)}
.tA .nomcell span:last-child{display:flex;align-items:center;gap:7px;flex-wrap:wrap}
.tA td .r2{font-size:11.5px;color:var(--muet);margin-top:2px;font-weight:500}
.tA td .meta{font-size:12px;color:var(--muet)}
.filtbar .fico .fi{padding-left:34px}
.filtbar .fico svg{left:10px}

/* ═══ Absences : tableau dépliable ═══ */
.absline{cursor:pointer}
.absline .chev{border:none;background:none;color:var(--muet);cursor:pointer;padding:4px;
  display:inline-flex;vertical-align:middle;transition:transform .15s}
.absline .chev svg{width:16px;height:16px}
.absline.ouvert .chev{transform:rotate(90deg);color:var(--encre)}
.absline.conflit{background:#FFFCFC}
.absline .meta{font-size:12.5px;color:var(--encre-2)}
.absdet{display:none}
.absdet.on{display:table-row}
.absdet>td{padding:0!important;background:var(--surface-2);border-bottom:1px solid var(--ligne)!important}
.detwrap{padding:6px 18px 18px}
.detsec{display:grid;grid-template-columns:180px 1fr;gap:18px;padding:14px 0;
  border-bottom:1px solid var(--ligne);align-items:start}
.detsec:last-child{border-bottom:none}
.detlab{font-size:10.5px;font-weight:700;letter-spacing:.07em;text-transform:uppercase;color:var(--muet);padding-top:3px}
.detval{font-size:13px;color:var(--encre)}
.detval textarea.fi{background:#fff}
.detact{display:flex;justify-content:flex-end;gap:9px;margin-top:10px;align-items:center}
.repbox{background:#fff;border:1px solid var(--ligne);border-radius:10px;padding:10px 13px;font-size:12.5px}
.cptab{width:100%;border-collapse:collapse;background:#fff;border:1px solid var(--ligne);border-radius:10px;overflow:hidden}
.cptab th{font-size:11px;font-weight:600;color:var(--encre-2);padding:9px 10px;text-align:center;
  background:var(--surface-2);border-bottom:1px solid var(--ligne)}
.cptab td{padding:11px 10px;text-align:center;font-size:14px;font-weight:600;font-variant-numeric:tabular-nums}
.cptab td.neg{color:var(--terra-h)}
.calinfo{font-size:12.5px;color:var(--encre-2);margin-bottom:8px}
.calinfo b{font-weight:700;color:var(--encre)}

/* Calendrier d'équipe */
.calleg{display:flex;gap:14px;flex-wrap:wrap;padding:8px 0 10px;font-size:11.5px;color:var(--encre-2)}
.calleg span{display:inline-flex;align-items:center;gap:6px}
.calleg i{width:11px;height:11px;border-radius:3px;display:block;border:1px solid rgba(0,0,0,.06)}
.calleg i.c-dem{background:#8A4B2A}
.calleg i.c-att{background:var(--terra)}
.calleg i.c-val{background:var(--bleu)}
.calleg i.c-auj{background:var(--terra-pale);border-color:var(--terra)}
.calgrid{display:grid;grid-template-columns:150px repeat(var(--nj),minmax(20px,1fr));
  background:#fff;border:1px solid var(--ligne);border-radius:10px;overflow:hidden;min-width:600px}
.calh{padding:5px 2px;text-align:center;background:var(--surface-2);border-bottom:1px solid var(--ligne);
  border-left:1px solid var(--surface-2);font-size:9.5px;line-height:1.25}
.calh span{display:block;color:var(--muet);font-weight:600}
.calh b{display:block;font-size:11px;color:var(--encre)}
.calh.calc0{grid-column:1;text-align:left;padding-left:12px;font-size:10.5px;font-weight:600;
  color:var(--muet);text-transform:uppercase;letter-spacing:.05em;display:flex;align-items:center;border-left:none}
.calh.we{background:#F3EFE6}
.calh.auj{background:var(--terra-pale)}
.calh.auj b{color:var(--terra-h)}
.calnom{padding:5px 8px 5px 12px;font-size:11.5px;border-top:1px solid var(--surface-2);
  white-space:nowrap;overflow:hidden;text-overflow:ellipsis;display:flex;align-items:center}
.calnom a:hover{color:var(--terra-h)}
.calc{border-top:1px solid var(--surface-2);border-left:1px solid var(--surface-2);min-height:22px}
.calc.we{background:#FBF8F1}
.calc.auj{box-shadow:inset 0 0 0 1px var(--terra-pale)}
.calc.c-dem{background:#8A4B2A}
.calc.c-att{background:var(--terra)}
.calc.c-val{background:var(--bleu)}

/* Sélecteur matin / après-midi */
.demirow{display:flex;gap:10px;align-items:center;margin-bottom:4px}
.demirow .fi{flex:1}
.demiseg{display:flex;background:var(--surface-2);border:1px solid var(--ligne);border-radius:10px;padding:3px;gap:3px}
.demiseg label{cursor:pointer;position:relative}
.demiseg input{position:absolute;opacity:0}
.demiseg span{display:block;padding:6px 13px;border-radius:8px;font-size:12px;font-weight:600;color:var(--encre-2)}
.demiseg input:checked+span{background:#fff;color:var(--encre);box-shadow:var(--ombre)}
.demiseg input:focus-visible+span{outline:2px solid var(--terra);outline-offset:1px}

/* ═══ Convention & types d'absence (réglages établissement) ═══ */
.ccngrid{display:grid;grid-template-columns:repeat(4,1fr);gap:1px;background:var(--ligne);
  border-top:1px solid var(--ligne)}
.ccngrid>div{background:#fff;padding:11px 14px}
.ccngrid span{display:block;font-size:11px;font-weight:600;color:var(--muet)}
.ccngrid b{display:block;font-size:14px;font-weight:600;margin-top:3px}
.abschip{display:inline-flex;align-items:center;border-radius:7px;padding:4px 10px;
  font-size:12px;font-weight:600;white-space:nowrap}
.abspal{display:flex;gap:8px;flex-wrap:wrap;padding:2px 0}
.abspick{cursor:pointer;position:relative}
.abspick input{position:absolute;opacity:0}
.abspick i{display:block;width:34px;height:26px;border-radius:8px;border:1.5px solid transparent}
.abspick input:checked+i{outline:2px solid var(--encre);outline-offset:2px}
.abspick:hover i{filter:brightness(.97)}

/* ═══ Logo, icônes d'absence, jours fériés ═══ */
.logorow{display:flex;gap:12px;align-items:center;flex-wrap:nowrap}
/* L'input fichier natif est masqué : sa largeur dépend du nom du
   fichier choisi et dilatait toute la mise en page. */
.logoinput{position:absolute;width:1px;height:1px;opacity:0;overflow:hidden;clip:rect(0 0 0 0)}
.logofield{flex:1;min-width:0;display:flex;align-items:center;gap:10px}
.logofield label.btn{flex:none;cursor:pointer}
.logonom{font-size:12px;color:var(--muet);white-space:nowrap;overflow:hidden;
  text-overflow:ellipsis;min-width:0;flex:1}
.logoretire{flex:none;white-space:nowrap}
.logoprev{width:64px;height:64px;border-radius:12px;border:1px solid var(--ligne);background:var(--surface-2);
  display:flex;align-items:center;justify-content:center;flex:none;overflow:hidden}
.logoprev img{max-width:100%;max-height:100%;object-fit:contain}
.logorow .chk{flex:none;padding-top:9px}
/* Choix d'icône d'ABSENCE — à ne pas confondre avec celui des
   étiquettes, plus haut, qui utilise une grille régulière. */
.icgrid-abs{display:flex;flex-wrap:wrap;gap:7px;padding:2px 0}
.icpick{cursor:pointer;position:relative}
.icpick input{position:absolute;opacity:0}
.icpick span{display:flex;align-items:center;justify-content:center;width:36px;height:32px;
  border:1px solid var(--ligne-2);border-radius:9px;background:#fff;color:var(--encre-2);font-size:12px}
.icpick span svg{width:17px;height:17px}
.icpick input:checked+span{border-color:var(--terra);background:var(--terra-pale);color:var(--terra-h)}
.icpick:hover span{border-color:var(--muet)}

.lg-fiche{width:54px;height:54px;border-radius:14px;flex:none}
.lg-fiche:hover{border-color:var(--terra)}
.ecc .ei img{width:100%;height:100%;object-fit:contain;border-radius:9px}
.ecc .ei{overflow:hidden;padding:3px;background:#fff;border:1px solid var(--ligne)}

.histoline{display:flex;gap:12px;align-items:baseline;padding:6px 0;font-size:12.5px;
  border-bottom:1px solid var(--surface-2)}
.histoline:last-child{border-bottom:none}
.histoline .mono{color:var(--muet);flex:none;width:80px}
.histoline .meta{margin-left:auto;font-size:11.5px;color:var(--muet)}

/* ═══ Configuration des positions (fiche établissement) ═══ */
.posconf{display:grid;grid-template-columns:minmax(220px,1fr) minmax(0,1.4fr);gap:0;align-items:start}
.posconf .pcol{border-right:1px solid var(--ligne);min-height:180px}
.posconf .pgrp{font-size:10.5px;font-weight:600;letter-spacing:.05em;text-transform:uppercase;
  color:var(--muet);padding:10px 16px 5px;background:var(--surface-2);border-bottom:1px solid var(--surface-2)}
.posconf .pitem{display:flex;align-items:center;gap:9px;padding:9px 16px;
  border-bottom:1px solid var(--surface-2);flex-wrap:wrap}
.posconf .pitem:hover{background:var(--surface-2)}
.posconf .pitem.on{background:var(--terra-pale)}
.posconf .pmeta{font-size:11px;color:var(--muet);width:100%}
.posconf .pdet{min-width:0}
.posconf .pdeth{display:flex;align-items:center;gap:10px;padding:13px 18px;border-bottom:1px solid var(--surface-2)}
.posconf .pdeth b{font-family:var(--f-titre);font-weight:600;font-size:14.5px}
.posconf .modbloc{margin-bottom:10px}
.posconf .modh{font-size:11px;font-weight:600;color:var(--encre-2);background:var(--surface-2);
  border-radius:7px;padding:4px 9px;margin-bottom:6px;display:inline-block}
.posgrid .plab .etq{font-size:9.5px;font-weight:700;color:var(--bleu);background:var(--bleu-pale);
  border-radius:5px;padding:1px 5px;flex:none}

/* ═══════════════════════════════════════════════════════════════
   DÉPLOIEMENT DES POSITIONS (v3.6)
   Tout est cloisonné sous .depgrid ou préfixé, pour ne jamais
   interférer avec le planning des équipes.
   ═══════════════════════════════════════════════════════════════ */
.depgrid{display:grid;grid-template-columns:minmax(0,1fr) 272px;gap:12px;align-items:start}
.depgrid .gwrap{overflow-x:auto}
.depgrid .dgrid{display:grid;grid-template-columns:var(--lab) var(--cols)}
.depgrid .dlab{grid-column:1;border-right:1px solid var(--ligne);padding:5px 10px;display:flex;
  align-items:center;gap:7px;min-width:0}
.depgrid .dlab.head{background:var(--surface-2);font-size:10.5px;font-weight:600;text-transform:uppercase;
  letter-spacing:.05em;color:var(--muet);border-bottom:1px solid var(--ligne)}
.depgrid .hc{grid-row:1;text-align:center;font-size:9.5px;font-weight:600;color:var(--muet);padding:5px 0;
  border-left:1px solid #F1EBE0}
.depgrid .hc::after{content:'';display:block;height:4px;margin:2px auto 0;width:1px;background:#E3DACA}
.depgrid .hc.pleine::after{height:7px;background:var(--ligne-2);width:1.5px}
.depgrid .hc.demi::after{height:5px;background:var(--ligne)}
.depgrid .hc.pleine{border-left-color:var(--ligne-2);color:var(--encre-2)}
.depgrid .hc.demi{border-left-color:var(--ligne)}
.depgrid .hc.now{background:var(--terra-pale);color:var(--terra-h)}
.depgrid .hc.head{background:var(--surface-2);border-bottom:1px solid var(--ligne)}
/* Fréquentation */
.depgrid .flab{grid-column:1;border-right:1px solid var(--ligne);padding:6px 11px;display:flex;
  flex-direction:column;justify-content:center;gap:1px}
.depgrid .flab .t{font-size:11px;font-weight:600}
.depgrid .flab .s{font-size:10px;color:var(--muet)}
.depgrid .fb{grid-row:1;border-left:1px solid var(--surface-2);height:40px;display:flex;align-items:flex-end}
.depgrid .fb.pleine{border-left-color:var(--ligne-2)}
.depgrid .fb i{display:block;width:100%;background:var(--bleu-pale);border-top:2px solid #B9C4DC}
.depgrid .fb.fort i{background:#DDE3F0;border-top-color:var(--bleu)}
.depgrid .fb.now{background:#FEF9F6}
/* Équipe du jour */
.depgrid .eqline{border-top:1px solid var(--surface-2)}
.depgrid .sallab{cursor:pointer;border-left:3px solid transparent}
.depgrid .sallab:hover{background:var(--surface-2)}
.depgrid .sallab.on{background:var(--terra-pale);border-left-color:var(--terra)}
.depgrid .sallab .av{width:22px;height:22px;border-radius:50%;color:#fff;font-size:8.5px;font-weight:700;
  display:flex;align-items:center;justify-content:center;flex:none}
.depgrid .sallab .nn{font-size:11.5px;font-weight:600;line-height:1.15;display:block;
  white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.depgrid .sallab .hh{font-size:9.5px;color:var(--muet);display:block}
.depgrid .sallab .rr{margin-left:auto;font-size:9px;font-weight:700;border-radius:5px;padding:1px 5px;flex:none}
.depgrid .sallab .rr.libre{background:var(--jaune-pale);color:var(--jaune)}
.depgrid .sallab .rr.ok{background:var(--vert-pale);color:var(--vert)}
.depgrid .eqc{grid-row:1;border-left:1px solid var(--surface-2);height:30px}
.depgrid .eqc.pleine{border-left-color:var(--ligne-2)}
.depgrid .eqc.now{background:#FEF9F6}
.depgrid .shiftbar{grid-row:1;align-self:stretch;margin:5px 1px;border-radius:7px;background:#F6E3C8;
  border:1px solid #E8CFA8;display:flex;align-items:center;padding:0 8px;font-size:10.5px;font-weight:700;
  color:#8A6A33;white-space:nowrap;pointer-events:none;overflow:hidden}
.depgrid .shiftbar .lb{background:rgba(255,255,255,.82);border-radius:5px;padding:1px 6px;font-size:9.5px}
.depgrid .eqseg{grid-row:1;align-self:stretch;margin:6px 1px;border-radius:5px;font-size:9px;font-weight:700;
  display:flex;align-items:center;padding:0 5px;overflow:hidden;white-space:nowrap;color:var(--encre-2);z-index:2}
.depgrid .eqseg.libre{background:repeating-linear-gradient(-45deg,#E7DECD,#E7DECD 3px,#F2ECE0 3px,#F2ECE0 7px);
  border:1px solid #DCD1BC;cursor:pointer}
.depgrid .eqseg.libre:hover{background:var(--terra-pale);border-color:var(--terra);color:var(--terra-h)}
.depgrid .creux{grid-row:1;align-self:stretch;margin:6px 0;background:#FDF8EE;border-left:1px dashed #E0C9A0;
  border-right:1px dashed #E0C9A0;position:relative;z-index:3}
.depgrid .creux.hors{background:repeating-linear-gradient(-45deg,#F7DCDE,#F7DCDE 3px,#FDF0F1 3px,#FDF0F1 6px);
  border-color:#E3A6AA}
.depgrid .creux span{position:absolute;left:50%;top:50%;transform:translate(-50%,-50%);font-size:8.5px;
  font-weight:700;color:#B09468;white-space:nowrap}
.depgrid .bilan{background:var(--surface-2);border-top:1px solid var(--ligne)}
.depgrid .bc{grid-row:1;border-left:1px solid var(--ligne);height:19px;display:flex;align-items:center;
  justify-content:center;font-size:9px;font-weight:800}
.depgrid .bc.eq{background:#F4F8EF;color:#9DB88A}
.depgrid .bc.manque{background:var(--rouge-pale);color:var(--rouge)}
.depgrid .bc.trop{background:var(--bleu-pale);color:var(--bleu)}
.depgrid .bc.nul{background:var(--surface-2);color:var(--muet)}
/* Grille des positions */
.depgrid .zn{display:flex;align-items:center;gap:8px;padding:7px 14px;background:#F3EEE3;
  border-top:1px solid var(--ligne);border-bottom:1px solid var(--ligne);min-width:1040px}
.depgrid .zn b{font-family:var(--f-titre);font-weight:600;font-size:12.5px}
.depgrid .zn .n{font-size:10.5px;color:var(--muet);margin-left:auto}
.depgrid .posbloc{border-top:1px solid var(--ligne)}
.depgrid .plab2{grid-column:1;border-right:1px solid var(--ligne);padding:9px 12px 9px 0;display:flex;
  flex-direction:column;justify-content:center;gap:3px;min-width:0;position:relative}
.depgrid .plab2::before{content:'';position:absolute;left:0;top:7px;bottom:7px;width:3px;
  border-radius:0 3px 3px 0;background:var(--cpos)}
.depgrid .plab2 .ttl{display:flex;align-items:center;gap:7px;padding-left:12px;min-width:0}
.depgrid .plab2 .nm2{font-family:var(--f-titre);font-weight:600;font-size:13.5px;line-height:1.15;
  white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.depgrid .plab2 .cnt{font-size:10px;font-weight:700;color:var(--muet);background:var(--surface-2);
  border:1px solid var(--ligne);border-radius:20px;padding:1px 7px;flex:none}
.depgrid .plab2 .hrs{font-size:10.5px;color:var(--muet);padding-left:12px;white-space:nowrap;
  overflow:hidden;text-overflow:ellipsis}
.depgrid .plab2 .tags{display:flex;gap:4px;flex-wrap:wrap;padding-left:12px}
.depgrid .plab2 .tags span{font-size:9px;font-weight:700;border-radius:4px;padding:1px 5px}
.depgrid .plab2 .tags .etq{background:var(--bleu-pale);color:var(--bleu)}
.depgrid .plab2 .tags .hab{background:#F3EDF4;color:#8A5E86}
.depgrid .plab2 .tags .mq{background:var(--rouge-pale);color:var(--rouge)}
.depgrid .cel{border-left:1px solid #F5F0E7;border-top:1px solid var(--surface-2);min-height:38px}
.depgrid .cel[data-voie="0"]{border-top:none}
.depgrid .cel.pleine{border-left-color:var(--ligne-2)}
.depgrid .cel.demi{border-left-color:var(--ligne)}
.depgrid .cel.now{background:#FEF9F6}
.depgrid .cel.ferme{background:repeating-linear-gradient(-45deg,#F2EEE5,#F2EEE5 3px,#F7F4ED 3px,#F7F4ED 7px)}
.depgrid .cel.facult{background:#FCFAF6}
.depgrid .cel.libre{cursor:cell}
.depgrid .cel.libre:hover{box-shadow:inset 0 0 0 1px var(--ligne-2)}
.depgrid.masque .cel,.depgrid.masque .blk,.depgrid.masque .vide{opacity:.3}
.depgrid #grillePos.masque .cel.possible{opacity:1;background:#FBFDF8;box-shadow:inset 0 0 0 1px #DDEBD0;cursor:cell}
.depgrid #grillePos.masque .cel.possible:hover{box-shadow:inset 0 0 0 1.5px var(--vert);background:var(--vert-pale)}
.depgrid .vide{grid-row:1;align-self:stretch;margin:5px 2px;border-radius:8px;z-index:1;pointer-events:none;
  background:rgba(196,60,67,.07);border:1.5px dashed rgba(196,60,67,.42);display:flex;align-items:center;
  justify-content:center;font-size:10.5px;font-weight:700;color:#B8555B;overflow:hidden;white-space:nowrap;padding:0 6px}
.depgrid .vide.gros{background:rgba(196,60,67,.14);border-color:rgba(196,60,67,.6);color:#9E3F45}
.depgrid .vide.court{font-size:0}
.depgrid .blk{align-self:stretch;margin:4px 2px;border-radius:7px;padding:0 7px;font-size:11.5px;
  font-weight:600;display:flex;align-items:center;gap:6px;white-space:nowrap;overflow:hidden;z-index:2;
  border-left:3px solid;cursor:grab;position:relative;min-width:0}
.depgrid .blk .av{width:19px;height:19px;border-radius:50%;color:#fff;font-size:8px;font-weight:700;
  display:flex;align-items:center;justify-content:center;flex:none}
.depgrid .blk .hd{position:absolute;top:0;bottom:0;width:9px;cursor:ew-resize;opacity:0;z-index:3}
.depgrid .blk:hover .hd{opacity:1;background:rgba(62,43,26,.16)}
.depgrid .blk .hd.g{left:0;border-radius:7px 0 0 7px}
.depgrid .blk .hd.d{right:0;border-radius:0 7px 7px 0}
.depgrid .blk .hd::after{content:'';position:absolute;left:50%;top:50%;transform:translate(-50%,-50%);
  width:2px;height:12px;border-radius:2px;background:rgba(255,255,255,.85)}
.depgrid .blk.alerte{outline:1.5px solid var(--rouge);outline-offset:-1px}
.depgrid .blk.alerte::after{content:'!';margin-left:auto;color:var(--rouge);font-weight:800}
.depgrid .blk.rot{box-shadow:inset 0 0 0 1.5px #C58A2E}
.depgrid .blk.rot::before{content:'⟳';color:#A97614;font-weight:800;font-size:12px}
.depgrid .blk.renfort{border-left-style:dashed}
.depgrid .blk.encours{z-index:5;box-shadow:0 4px 14px -4px rgba(62,43,26,.35);opacity:.92}
.depgrid .blk.fantome{opacity:.3}
/* Conseil et légendes */
.depgrid .conseil{padding:8px 16px;font-size:12px;color:var(--encre-2);background:var(--surface-2);
  border-bottom:1px solid var(--ligne)}
.depgrid .lg{display:flex;gap:11px;font-size:10.5px;color:var(--muet);flex-wrap:wrap}
.depgrid .lg span{display:flex;align-items:center;gap:5px}
.depgrid .lg i{width:11px;height:11px;border-radius:3px;display:block}
.depgrid .lg i.lgvide{background:rgba(196,60,67,.07);border:1.5px dashed rgba(196,60,67,.42)}
.depgrid .lg i.lgvide2{background:rgba(196,60,67,.16)}
.depgrid .lg i.lgfac{background:#FCFAF6;border:1px solid var(--ligne)}
.depgrid .lg i.lgferme{background:repeating-linear-gradient(-45deg,#F2EEE5,#F2EEE5 2px,#F7F4ED 2px,#F7F4ED 5px)}
.depgrid .lg i.lgshift{background:#F6E3C8;border:1px solid #E8CFA8}
.depgrid .lg i.lgpause{background:#FDF8EE;border:1px dashed #E0C9A0}
.depgrid .lg i.lglibre{background:repeating-linear-gradient(-45deg,#E7DECD,#E7DECD 2px,#F2ECE0 2px,#F2ECE0 5px)}
/* Panneau */
.depgrid .msg{padding:10px 13px;font-size:12px;line-height:1.5;border-bottom:1px solid var(--surface-2)}
.depgrid .msg:last-child{border-bottom:none}
.depgrid .msg.ko{background:var(--rouge-pale);color:#8E2A30}
.depgrid .msg.wa{background:var(--jaune-pale);color:#7A5510}
.depgrid .eqrow{display:flex;align-items:center;gap:8px;padding:7px 13px;
  border-bottom:1px solid var(--surface-2);font-size:12px}
.depgrid .eqrow .av{width:22px;height:22px;border-radius:50%;color:#fff;font-size:8px;font-weight:700;
  display:flex;align-items:center;justify-content:center;flex:none}
.depgrid .eqrow .n{flex:1;font-weight:600;min-width:0;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.depgrid .mini{display:flex;gap:2px;flex:none}
.depgrid .mini i{width:14px;height:14px;border-radius:3px;display:block}
.depgrid .eqrow .pv{font-size:9.5px;font-weight:700;border-radius:5px;padding:1px 5px;flex:none}
.depgrid .eqrow .pv.faible{background:var(--rouge-pale);color:var(--rouge)}
.depgrid .eqrow .pv.ok{background:var(--vert-pale);color:var(--vert)}
.depgrid .aide{padding:10px 13px;font-size:11.5px;color:var(--muet);line-height:1.55;border-top:1px solid var(--ligne)}
.kbd{display:inline-block;border:1px solid var(--ligne-2);border-bottom-width:2px;border-radius:5px;
  padding:0 5px;font-size:10.5px;font-weight:700;background:var(--surface-2)}
/* Barre de modèle */
.modbar{display:flex;align-items:center;gap:10px;background:var(--carte);border:1px solid var(--ligne);
  border-left:4px solid var(--terra);border-radius:var(--r);padding:10px 14px;margin-bottom:12px;flex-wrap:wrap}
.modbar .lbl{font-size:11px;font-weight:700;letter-spacing:.06em;text-transform:uppercase;color:var(--muet)}
.modpick{display:flex;gap:5px;flex-wrap:wrap}
.modpick button{border:1px solid var(--ligne-2);background:#fff;border-radius:9px;padding:6px 12px;
  font-size:12.5px;font-weight:600;color:var(--encre-2);text-align:left;line-height:1.25;font-family:var(--f-ui)}
.modpick button i{display:block;font-style:normal;font-size:10px;font-weight:500;color:var(--muet)}
.modpick button:hover{border-color:var(--muet)}
.modpick button.on{background:var(--terra-pale);border-color:var(--terra);color:var(--terra-h)}
.modpick button.on i{color:var(--terra-h);opacity:.8}
.modbar .droite{margin-left:auto;display:flex;gap:8px;align-items:center}
/* Fenêtre contextuelle */
.pop{position:fixed;z-index:200;background:#fff;border:1px solid var(--ligne);border-radius:12px;
  box-shadow:var(--ombre-2);padding:8px;display:none;min-width:230px;max-height:60vh;overflow:auto}
.pop.on{display:block}
.pop .pt{font-size:10.5px;font-weight:700;letter-spacing:.05em;text-transform:uppercase;color:var(--muet);padding:5px 8px}
.pop button{display:flex;align-items:center;gap:9px;width:100%;border:none;background:none;border-radius:8px;
  padding:7px 9px;font-size:12.5px;font-weight:600;text-align:left;font-family:var(--f-ui)}
.pop button:hover{background:var(--surface-2)}
.pop button .x{margin-left:auto;font-size:10px;color:var(--muet);font-weight:500}
.pop button.no{opacity:.45}

/* ═══ Tiroir de configuration des positions ═══ */
.dwr{position:fixed;inset:0;z-index:180;pointer-events:none}
.dwr .dveil{position:absolute;inset:0;background:rgba(43,32,24,.36);opacity:0;transition:.18s}
/* (La largeur est déclarée une seule fois, plus haut — v11.73.) */
.dwr .panel{position:absolute;right:0;top:0;bottom:0;background:var(--carte);
  box-shadow:var(--ombre-2);display:flex;flex-direction:column;transform:translateX(100%);transition:.2s ease}
.dwr.open{pointer-events:auto}
.dwr.open .dveil{opacity:1}
.dwr.open .panel{transform:none}
.dwr .ph{padding:15px 20px;border-bottom:1px solid var(--ligne);display:flex;align-items:center;gap:12px}
.dwr .ph h2{font-family:var(--f-titre);font-weight:600;font-size:17px;line-height:1.2}
.dwr .ph .de{font-size:11.5px;color:var(--muet);margin-top:2px}
.dwr .pb{overflow-y:auto;flex:1}
.dwr .pf{padding:12px 20px;border-top:1px solid var(--ligne);display:flex;gap:9px;align-items:center;
  background:var(--surface-2)}
/* Un tiroir dont le contenu EST un formulaire : sans cette règle, le
   formulaire ne s'étire pas, .pb ne défile pas et le pied se retrouve
   au milieu du panneau (v11.14). */
.dwr .panel > form{display:flex;flex-direction:column;flex:1;min-height:0}
.dwr .blk{padding:16px 20px;border-bottom:1px solid var(--surface-2)}
.dwr .blk .bt{font-size:10.5px;font-weight:700;letter-spacing:.06em;text-transform:uppercase;
  color:var(--muet);margin-bottom:11px}
/* Cartes de modèle dans le tiroir */
.modcard{border:1px solid var(--ligne);border-radius:11px;margin-bottom:10px;overflow:hidden;background:#fff}
.modcard.def{border-color:#E2D7BE;background:#FDFBF6}
.modcard .mh2{display:flex;align-items:center;gap:9px;padding:10px 13px;background:var(--surface-2);
  border-bottom:1px solid var(--ligne);flex-wrap:wrap}
.modcard .mh2 b{font-size:13px;font-family:var(--f-titre);font-weight:600}
.modcard .mb2{padding:11px 13px;display:flex;flex-wrap:wrap;gap:7px;align-items:center}
.modcard .eff{margin-left:auto;display:flex;align-items:center;gap:7px;font-size:11.5px;color:var(--muet)}
.modcard .eff input{width:60px;text-align:right}
.plg{display:inline-flex;align-items:center;gap:5px;background:var(--surface-2);border:1px solid var(--ligne);
  border-radius:9px;padding:4px 8px;font-size:12px;font-weight:600}
.plg input[type=time]{width:88px;padding:4px 6px;font-size:12px;border-radius:7px;border:1px solid var(--ligne-2)}
.plg .x{border:none;background:none;color:var(--muet);cursor:pointer;font-size:12px;padding:0 2px}
.plg .x:hover{color:var(--rouge)}
.addplg{border:1px dashed var(--ligne-2);background:none;border-radius:9px;padding:6px 12px;
  font-size:12px;font-weight:600;color:var(--muet);cursor:pointer;font-family:var(--f-ui)}
.addplg:hover{border-color:var(--terra);color:var(--terra-h);border-style:solid}
.palzone{border-top:1px dashed var(--ligne);padding:11px 13px;background:#FDFCF9}
.palzone .palt{font-size:10px;font-weight:700;letter-spacing:.05em;text-transform:uppercase;
  color:var(--muet);margin-bottom:8px}
.pal{display:flex;align-items:center;gap:7px;font-size:12px;margin-bottom:7px;flex-wrap:wrap}
.pal .des{color:var(--muet)}
.pal input[type=number]{width:82px;text-align:right;border:1px solid var(--ligne-2);border-radius:8px;
  padding:5px 8px;font-size:12px;font-family:var(--f-ui)}
.pal .x{border:none;background:none;color:var(--muet);cursor:pointer;font-size:12px;padding:0 3px}
.pal .x:hover{color:var(--rouge)}
.lienpal{border:none;background:none;font-size:11.5px;font-weight:600;color:var(--terra-h);
  cursor:pointer;padding:0;font-family:var(--f-ui)}
/* Chips d'étiquettes */
/* La seconde définition de .chip est retirée (v14.7.1) : elle vivait
   ici, huit cents lignes après la première, et l'emportait par sa
   spécificité. Une seule règle, tout en haut. */
/* Palette de couleurs */
.abspal{display:flex;gap:8px;flex-wrap:wrap;padding:2px 0}
.abspick{cursor:pointer;position:relative}
.abspick input{position:absolute;opacity:0}
.abspick i{display:block;width:36px;height:27px;border-radius:9px;border:1.5px solid}
.abspick input:checked+i{outline:2px solid var(--encre);outline-offset:2px}
/* Interrupteur */
/* Une SEULE définition de l'interrupteur : il y en avait deux, de
   tailles différentes (40×23 et 38×22, curseur 18 et 17 px). La
   seconde écrasait la première, mais pas toutes ses propriétés —
   d'où un rond blanc désaligné. Voir la définition unique plus
   haut dans ce fichier. */
.sw .swl{font-size:12.5px;font-weight:600}

/* ═══ Matrice positions × modèles (paramétrage) ═══ */
.mx{width:100%;border-collapse:separate;border-spacing:0}
.mx th{font-size:10.5px;font-weight:700;letter-spacing:.05em;text-transform:uppercase;color:var(--muet);
  text-align:left;padding:10px 14px;background:var(--surface-2);border-bottom:1px solid var(--ligne)}
.mx th.mod{text-align:center;border-left:1px solid var(--ligne);min-width:150px}
.mx th.mod b{display:block;font-size:12.5px;text-transform:none;letter-spacing:0;color:var(--encre);
  font-family:var(--f-titre);font-weight:600}
.mx th.mod .ch2{display:block;font-size:9.5px;font-weight:500;text-transform:none;letter-spacing:0;
  color:var(--muet);margin-top:2px}
.mx th.mod.def b::after{content:' · défaut';font-size:9px;color:var(--muet);font-weight:500}
.mx td{padding:0;border-bottom:1px solid var(--surface-2);vertical-align:middle}
.mx tr:last-child td{border-bottom:none}
.mx td.pn{padding:11px 14px;position:relative}
.mx td.pn::before{content:'';position:absolute;left:0;top:9px;bottom:9px;width:3px;
  border-radius:0 3px 3px 0;background:var(--cpos)}
.mx td.pn .n{font-family:var(--f-titre);font-weight:600;font-size:13.5px;padding-left:11px}
.mx td.pn .t{display:flex;gap:4px;flex-wrap:wrap;padding-left:11px;margin-top:4px}
.mx td.pn .t span{font-size:9px;font-weight:700;border-radius:4px;padding:1px 5px}
.mx td.pn .t .etq{background:var(--bleu-pale);color:var(--bleu)}
.mx td.pn .t .hab{background:#F3EDF4;color:#8A5E86}
.mx td.pn .t .pl,.mx td.pn .t .eq{background:var(--surface-2);color:var(--muet);border:1px solid var(--ligne)}
.mx td.cl{border-left:1px solid var(--ligne);padding:6px}
.cellmod{width:100%;border:1px solid var(--ligne);background:#fff;border-radius:9px;padding:8px 10px;
  text-align:left;font-family:var(--f-ui);cursor:pointer;display:block}
.cellmod:hover{border-color:var(--terra);background:var(--terra-pale)}
.cellmod .hh{font-size:11.5px;font-weight:600;line-height:1.35;display:block}
.cellmod .ee{font-size:10.5px;color:var(--muet);margin-top:2px;display:block}
.cellmod.ferme{background:repeating-linear-gradient(-45deg,#F4F1EA,#F4F1EA 4px,#FBF9F4 4px,#FBF9F4 8px);
  border-style:dashed}
.cellmod.ferme .hh{font-weight:500;color:var(--muet)}
.mx .rt{text-align:right}

/* Ajustements du tiroir de cellule : mêmes respirations que le reste */
.dwr #cl_plages{display:flex;flex-wrap:wrap;gap:7px}
.dwr #cl_pal{margin-bottom:4px}
.dwr .blk .fhelp{margin-top:8px}
.mx td.cl:last-of-type{border-right:1px solid var(--ligne)}
.mx thead th:last-child{border-left:1px solid var(--ligne)}

/* Bande des indicateurs de charge */
.depgrid .indline{border-top:1px solid var(--surface-2)}
.depgrid .indline:first-child{border-top:none}
.depgrid .flab{position:relative;padding-left:14px}
.depgrid .flab::before{content:'';position:absolute;left:0;top:8px;bottom:8px;width:3px;
  border-radius:0 3px 3px 0;background:var(--ci,var(--bleu))}
.depgrid .indline .fb{height:34px}

/* ═══ Saisie des indicateurs de charge ═══ */
.sgrid{overflow-x:auto}
.sg{min-width:900px}
.srow{display:grid;grid-template-columns:230px var(--hcols);border-top:1px solid var(--surface-2)}
.srow.head{border-top:none;background:var(--surface-2);border-bottom:1px solid var(--ligne)}
.srow .slab{grid-column:1;padding:9px 13px;border-right:1px solid var(--ligne);display:flex;
  flex-direction:column;justify-content:center;gap:3px;min-width:0;position:relative}
.srow .slab::before{content:'';position:absolute;left:0;top:9px;bottom:9px;width:3px;
  border-radius:0 3px 3px 0;background:var(--ci)}
.srow .slab .n{font-size:12.5px;font-weight:600;padding-left:11px}
.srow .slab .z{font-size:10px;color:var(--muet);padding-left:11px;display:flex;gap:5px;align-items:center;flex-wrap:wrap}
.srow.head .slab{font-size:10.5px;font-weight:700;text-transform:uppercase;letter-spacing:.05em;color:var(--muet)}
.srow.head .slab::before{display:none}
.srow .hcell{grid-row:1;text-align:center;font-size:10.5px;font-weight:700;color:var(--encre-2);
  padding:9px 0;border-left:1px solid var(--ligne)}
.srow .scell{border-left:1px solid var(--surface-2);padding:5px 4px;display:flex;flex-direction:column;gap:3px}
.srow .scell input{width:100%;border:1px solid var(--ligne-2);border-radius:7px;padding:4px 6px;
  font-size:12px;text-align:right;font-family:var(--f-ui);background:#fff;font-variant-numeric:tabular-nums}
.srow .scell input.reel{background:var(--vert-pale);border-color:#CBDCBB;font-weight:700}
.srow .scell .prop{font-size:9px;color:var(--muet);text-align:right;padding-right:3px;line-height:1.2}
.srow .scell .prop b{color:var(--violet);font-weight:700}
.srow .scell.now{background:#FEF9F6}
.szone{padding:7px 14px;background:#F3EEE3;border-top:1px solid var(--ligne);
  border-bottom:1px solid var(--ligne);font-family:var(--f-titre);font-weight:600;font-size:12.5px}
.unite{font-size:10px;font-weight:700;color:var(--muet);background:var(--surface-2);
  border:1px solid var(--ligne);border-radius:5px;padding:1px 6px}
.src{font-size:9.5px;font-weight:700;border-radius:5px;padding:1px 6px}
.src.saisi{background:var(--bleu-pale);color:var(--bleu)}
.src.mesure{background:var(--vert-pale);color:var(--vert)}
.src.histo{background:var(--violet-pale);color:var(--violet)}
.leg{display:flex;gap:13px;font-size:11px;color:var(--muet);flex-wrap:wrap}
.leg span{display:flex;align-items:center;gap:5px}
.leg i{width:11px;height:11px;border-radius:3px;display:block}
.leg i.lgprev{background:#fff;border:1px solid var(--ligne-2)}
.leg i.lgreel{background:var(--vert-pale);border:1px solid #CBDCBB}
.leg i.lghisto{background:var(--violet-pale)}

.ind{display:inline-flex;align-items:center;gap:7px;font-weight:600}
.ind i{width:10px;height:10px;border-radius:3px;flex:none}

/* ═══════════════════════════════════════════════════════════════
   PLANNING : MÉTÉO, ÉVÉNEMENTS, BORNES DE CONTRAT (v3.9)
   ═══════════════════════════════════════════════════════════════ */
/* Animations longues et douces : un mouvement rapide devient
   pénible sur un écran regardé toute la journée. */
@keyframes m-flotte{0%,100%{transform:translateX(0)}50%{transform:translateX(2.5px)}}
@keyframes m-tombe{0%{opacity:0;transform:translateY(-3px)}30%{opacity:1}100%{opacity:0;transform:translateY(6px)}}
@keyframes m-tourne{from{transform:rotate(0)}to{transform:rotate(360deg)}}
@keyframes m-pulse{0%,100%{opacity:.85}50%{opacity:1}}
.msvg .m-nuage{animation:m-flotte 4s ease-in-out infinite}
.msvg .m-goutte{animation:m-tombe 1.4s linear infinite}
.msvg .m-goutte:nth-of-type(2){animation-delay:.45s}
.msvg .m-goutte:nth-of-type(3){animation-delay:.9s}
.msvg .m-rayons{animation:m-tourne 26s linear infinite;transform-origin:center}
.msvg .m-pulse{animation:m-pulse 3.5s ease-in-out infinite}
.msvg .m-eclair{animation:m-pulse 1.1s ease-in-out infinite}
@media (prefers-reduced-motion:reduce){.msvg *{animation:none!important}}

/* Bandeau météo dans l'en-tête de jour */
.pl2 .dd .meteo{display:flex;flex-direction:column;align-items:center;gap:1px;flex:none;
  padding:3px 6px;border:1px solid transparent;border-radius:9px;background:none;cursor:pointer;
  font-family:var(--f-ui)}
.pl2 .dd .meteo:hover{background:var(--bleu-pale);border-color:#D3DBEB}
.pl2 .dd .meteo .mi{display:flex}
.pl2 .dd .meteo .mv{font-size:11px;font-weight:700;color:var(--encre);display:flex;align-items:baseline;gap:3px}
.pl2 .dd .meteo .mv i{font-style:normal;font-size:9.5px;font-weight:600;color:var(--muet)}
.pl2 .dd .meteo .mp{font-size:9px;font-weight:700;color:var(--bleu)}
/* Événements */
.pl2 .dd .evts{display:flex;flex-direction:column;gap:3px;flex:none}
.pl2 .dd .evt{width:19px;height:19px;border-radius:6px;display:flex;align-items:center;justify-content:center}
.pl2 .dd .evt svg{width:12px;height:12px}
.pl2 .dd .evt.anniv{background:var(--violet-pale);color:var(--violet)}
.pl2 .dd .evt.ferie{background:var(--rouge-pale);color:var(--rouge)}
.pl2 .dd .ferielbl{font-size:9.5px;font-weight:700;color:var(--rouge);background:var(--rouge-pale);
  padding:2px 9px;border-top:1px solid #F2D8DA;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
/* Hors période de contrat */
.pl2 .pcell.horsc{background:repeating-linear-gradient(-45deg,#F4F1EA,#F4F1EA 4px,#FAF8F2 4px,#FAF8F2 8px)}
.pl2 .pcell.horsc .sh{opacity:.5}
.pl2 .pcell.cdeb{box-shadow:inset 3px 0 0 var(--vert)}
.pl2 .pcell.cfin{box-shadow:inset -3px 0 0 var(--jaune)}
/* ── LA BORNE DE CONTRAT : UNE PASTILLE, PAS UN VOILE ──    (v13.6)
   Elle était posée en « inset:0 », centrée : elle occupait la case
   ENTIÈRE, par-dessus tout ce qu'elle contenait. Sur une case vide,
   c'était juste ; sur une case qui porte un shift, « 09h00–17h00 »
   passait sous l'icône et « pause 30 mn » sous le mot.

   Elle devient une pastille de coin, sur le fond de la carte — et la
   case lui réserve sa bande (« padding-top » plus bas), sinon on
   aurait déplacé le recouvrement d'un centimètre au lieu de le
   supprimer. Le libellé raccourcit parce qu'une pastille n'a pas la
   largeur d'une case. */
.pl2{--borne-h:19px}
.pl2 .pcell .borne{position:absolute;inset:auto 4px auto auto;top:3px;height:var(--borne-h);
  display:flex;align-items:center;gap:3px;font-size:9px;font-weight:700;
  letter-spacing:.02em;color:var(--muet);background:var(--carte);
  border:1px solid currentColor;border-radius:20px;padding:0 7px 0 5px;
  pointer-events:none;z-index:1;line-height:1;white-space:nowrap;box-sizing:border-box}
.pl2 .pcell .borne svg{width:10px;height:10px;stroke-width:1.7;flex:none}
/* La case lui réserve SA bande. Les deux nombres vont ensemble — une
   pastille plus haute que le retrait se reposerait sur le shift,
   c'est-à-dire exactement le défaut qu'on répare ; d'où la variable
   plutôt que deux valeurs à tenir d'accord à la main. */
.pl2 .pcell.cdeb,.pl2 .pcell.cfin{padding-top:calc(var(--borne-h) + 6px)}
.pl2 .pcell .borne.deb{color:var(--vert)}
.pl2 .pcell .borne.fin{color:var(--jaune)}
.pl2 .pcell.cdeb{box-shadow:inset 0 3px 0 var(--vert)}
.pl2 .pcell.cfin{box-shadow:inset 0 -3px 0 var(--jaune)}

/* ═══ Modale de détail météo ═══ */
.mmodal{position:fixed;inset:0;z-index:210;display:none;align-items:center;justify-content:center;padding:20px}
.mmodal.on{display:flex}
.mmveil{position:absolute;inset:0;background:rgba(43,32,24,.42)}
.mmbox{position:relative;background:var(--carte);border-radius:16px;box-shadow:var(--ombre-2);
  width:min(880px,96vw);max-height:92vh;overflow:auto}
.mmtop{display:flex;align-items:flex-start;gap:16px;padding:20px 22px;
  background:linear-gradient(135deg,var(--bleu-pale),var(--fond));border-bottom:1px solid var(--ligne)}
.mmico{flex:none;display:flex}
.mminfo{flex:1;min-width:0}
.mmj{font-size:12px;font-weight:600;color:var(--muet);text-transform:capitalize}
.mminfo h2{font-family:var(--f-titre);font-weight:600;font-size:23px;line-height:1.15;margin:2px 0 5px}
.mmtemp{font-size:15px;font-weight:600;display:flex;align-items:baseline;gap:5px;
  flex-wrap:wrap;justify-content:flex-start}
.mmtemp .moy{margin-left:9px}
.mmtemp .mx{color:var(--terra-h)}
.mmtemp .mn{color:var(--bleu)}
.mmtemp .sep{color:var(--muet);font-weight:400}
.mmtemp .moy{font-size:12px;color:var(--muet);font-weight:500}
.mmlieu{font-size:11.5px;color:var(--muet);margin-top:4px}
.mmclose{width:34px;height:34px;border-radius:10px;border:1px solid var(--ligne);background:#fff;
  color:var(--muet);font-size:16px;flex:none;cursor:pointer;font-family:var(--f-ui)}
.mmclose:hover{background:var(--surface-2);color:var(--encre)}
.mmstats{display:grid;grid-template-columns:repeat(auto-fit,minmax(150px,1fr));border-bottom:1px solid var(--ligne)}
.mmstat{padding:13px 16px;border-right:1px solid var(--surface-2)}
.mmstat:last-child{border-right:none}
.mmstat .l{font-size:10px;font-weight:700;letter-spacing:.05em;text-transform:uppercase;color:var(--muet)}
.mmstat .v{font-size:19px;font-weight:600;font-family:var(--f-titre);margin-top:3px;
  display:flex;align-items:center;gap:5px}
.mmstat .v small{font-size:11.5px;font-weight:500;color:var(--muet)}
.mmstat .s{font-size:10.5px;color:var(--muet);margin-top:3px}
.mmstat .s.alerte{color:var(--rouge);font-weight:600}
.mmheures{display:grid;grid-auto-flow:column;grid-auto-columns:minmax(54px,1fr);overflow-x:auto;
  border-bottom:1px solid var(--ligne)}
.mmh{padding:11px 4px 10px;text-align:center;border-right:1px solid var(--surface-2)}
.mmh:last-child{border-right:none}
.mmh .hh{font-size:10.5px;font-weight:700;color:var(--muet)}
.mmh svg{margin:5px auto 3px;display:block}
.mmh .tt{font-size:12.5px;font-weight:700}
.mmh .pp{font-size:9.5px;color:var(--bleu);font-weight:700;min-height:12px}
.mmh .pbar{height:3px;border-radius:2px;background:var(--bleu);margin:3px auto 0;opacity:.75}
.mmh .vv{font-size:9px;color:var(--muet);margin-top:3px}
.mmfoot{padding:12px 18px;font-size:11.5px;color:var(--muet);line-height:1.55;background:var(--surface-2)}

/* Anniversaire du jour, écrit en toutes lettres sous les notes */
.dd .danniv{display:flex;align-items:center;justify-content:center;gap:5px;width:100%;
  padding:4px 8px;border-top:1px solid var(--surface-2);background:var(--violet-pale);
  color:var(--violet);font-size:10px;font-weight:600;line-height:1.3;text-align:center}
.dd .danniv svg{width:12px;height:12px;flex:none}
.dd .danniv span{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}

/* ═══ Parcours à étapes : dupliquer et publier ═══ */
.mmbox.etp{width:min(680px,96vw);display:flex;flex-direction:column}
.mmbox.etp .eh{padding:18px 22px 14px;border-bottom:1px solid var(--ligne);position:relative}
.mmbox.etp .eh h2{font-family:var(--f-titre);font-weight:600;font-size:20px}
.mmbox.etp .eh .sub{font-size:12px;color:var(--muet);margin-top:2px}
.mmbox.etp .eh .mmclose{position:absolute;top:16px;right:18px}
/* ── LE FIL D'ÉTAPES ──                                  (v11.16)
   Il était écrit ici, à l'intérieur de « .mmbox.etp » : la modale
   à étapes savait l'afficher, aucun autre écran ne le pouvait. On
   le sort tel quel — même dessin, mêmes classes — pour qu'un
   tiroir s'en serve aussi. La modale garde seulement ses marges. */
.ebar{padding:13px 18px 12px;border-bottom:1px solid var(--ligne);background:var(--surface-2)}
.el{font-size:11.5px;font-weight:600;color:var(--encre-2);margin-bottom:7px}
.el b{color:var(--terra-h)}
.eb3{display:flex;gap:6px}
.eb3 i{flex:1;height:3px;border-radius:2px;background:var(--ligne);display:block}
.eb3 i.on{background:var(--terra)}
.mmbox.etp .ebar{padding:14px 22px 0;border-bottom:0;background:none}
.mmbox.etp .emb{padding:18px 22px;overflow-y:auto;flex:1}
.mmbox.etp .ef{padding:14px 22px;border-top:1px solid var(--ligne);display:flex;gap:9px;
  align-items:center;background:var(--surface-2)}
.einfo{display:flex;gap:11px;align-items:flex-start;padding:12px 14px;border-radius:11px;
  background:var(--bleu-pale);border:1px solid #D3DBEB;font-size:12.5px;line-height:1.5;
  color:#3F4E75;margin-bottom:14px}
.einfo.legal{background:var(--violet-pale);border-color:#DCC9DA;color:#6B4768}
.einfo svg{width:17px;height:17px;flex:none;margin-top:1px}
.eopt{display:flex;align-items:flex-start;gap:11px;padding:13px 15px;border:1px solid var(--ligne);
  border-radius:11px;margin-bottom:9px;cursor:pointer;background:#fff}
.eopt:hover{border-color:var(--muet)}
.eopt:has(input:checked){border-color:var(--terra);background:var(--terra-pale)}
.eopt input{margin-top:2px;flex:none;accent-color:var(--terra);width:16px;height:16px}
.eopt .t{font-size:13.5px;font-weight:600;display:block}
.eopt .d{font-size:12px;color:var(--muet);margin-top:2px;line-height:1.5;display:block}
.esem{display:flex;align-items:center;gap:11px;padding:11px 14px;border:1px solid var(--ligne);
  border-radius:10px;margin-bottom:7px;cursor:pointer;background:#fff}
.esem:hover{border-color:var(--muet)}
.esem:has(input:checked){border-color:var(--terra);background:var(--terra-pale)}
.esem.vide{opacity:.55;cursor:default}
.esem input{accent-color:var(--terra);width:16px;height:16px;flex:none}
.esem .lbl{font-size:13px;font-weight:600;display:flex;align-items:center;gap:7px}
.esem .n{font-size:11.5px;color:var(--muet);margin-left:auto}
.esem .warn{font-size:11.5px;font-weight:600;color:var(--jaune);margin-left:auto}
.esem .tagpub{font-size:9.5px;font-weight:700;background:var(--vert-pale);color:var(--vert);
  border-radius:5px;padding:1px 6px}
.lientout{border:none;background:none;font-size:12px;font-weight:600;color:var(--terra-h);
  cursor:pointer;padding:0;margin-bottom:10px;font-family:var(--f-ui)}
.erecap{background:var(--surface-2);border:1px solid var(--ligne);border-radius:11px;
  padding:13px 15px;font-size:12.5px;line-height:1.6;margin-top:12px}
.ehline{display:flex;align-items:center;gap:11px;padding:13px 15px;border:1px solid var(--ligne);
  border-radius:11px;background:#fff;margin-bottom:10px;cursor:pointer}
.ehline .fhelp{margin-left:auto}
.mmbox.etp textarea.fi{width:100%;min-height:80px;resize:vertical;line-height:1.5;
  border:1px solid var(--ligne-2);border-radius:11px;padding:11px 13px;font-size:13px;
  font-family:var(--f-ui);background:#fff}

/* Choix du type d'absence et demi-journées */
.abstypes{display:flex;flex-wrap:wrap;gap:6px}
.abstype{cursor:pointer;position:relative}
.abstype input{position:absolute;opacity:0}
.abstype span{display:inline-flex;align-items:center;border:1px solid var(--ligne-2);border-radius:20px;
  padding:5px 12px;font-size:12px;font-weight:600;color:var(--encre-2);background:#fff}
.abstype input:checked+span{background:var(--bg);border-color:var(--bd);color:var(--bd)}
.demi{display:flex;gap:5px;margin-top:6px}
.demi label{cursor:pointer;position:relative;flex:1}
.demi input{position:absolute;opacity:0}
.demi span{display:block;text-align:center;border:1px solid var(--ligne-2);border-radius:8px;
  padding:5px 4px;font-size:11.5px;font-weight:600;color:var(--muet);background:#fff}
.demi input:checked+span{background:var(--terra-pale);border-color:var(--terra);color:var(--terra-h)}
.mmbox.etp .fg{margin-bottom:13px}
.mmbox.etp .fl{display:block;font-size:12px;font-weight:600;color:var(--encre-2);margin-bottom:5px}
.mmbox.etp .fi{width:100%;border:1px solid var(--ligne-2);border-radius:9px;padding:8px 11px;
  font-size:13px;font-family:var(--f-ui);background:#fff}
.mmbox.etp .f2{display:grid;grid-template-columns:1fr 1fr;gap:12px}

/* Météo dans les vues Jour et Frise */
.jmeteo{display:inline-flex;align-items:center;gap:9px;padding:5px 11px;border:1px solid var(--ligne);
  border-radius:11px;background:#fff}
.jmeteo>span{display:flex;flex-direction:column;line-height:1.2}
.jmeteo b{font-size:14px;font-weight:700;font-family:var(--f-titre)}
.jmeteo i{font-style:normal;font-size:11px;color:var(--muet);font-weight:600;margin-left:4px}
.jmeteo em{font-style:normal;font-size:10.5px;color:var(--muet)}
.jmeteo .mp{font-size:10.5px;font-weight:700;color:var(--bleu);background:var(--bleu-pale);
  border-radius:6px;padding:2px 7px}
.jmeteo .mr{font-size:10.5px;font-weight:700;color:var(--rouge);background:var(--rouge-pale);
  border-radius:6px;padding:2px 7px}
.frl .frmeteo{display:inline-flex;vertical-align:-4px;margin-right:5px}

/* Bascule shift / absence dans le tiroir */
/* Le bascule Shift/Absence touchait le récapitulatif au-dessus et le
   bloc « Qui » en dessous : trois zones distinctes se lisaient comme
   un seul pavé. On les sépare (v7.80). */
.dwseg{display:flex;gap:3px;margin:12px 20px 16px;background:var(--surface-2);border:1px solid var(--ligne);
  border-radius:11px;padding:3px}
.dwseg button{flex:1;border:none;background:transparent;border-radius:9px;padding:8px 12px;
  font-size:12.5px;font-weight:600;color:var(--muet);font-family:var(--f-ui)}
.dwseg button.on{background:#fff;color:var(--encre);box-shadow:var(--ombre)}
.dwhelp{font-size:11.5px;color:var(--muet);line-height:1.55;margin-top:10px}
#f-abs{gap:0}
#f-abs .fl2{margin-top:14px}
#f-abs .fl2:first-of-type{margin-top:0}
/* Barres modifiables dans les vues Jour et Frise */
.frbar.cliq{cursor:pointer}
.frbar.cliq:hover{filter:brightness(.96);box-shadow:0 2px 8px -3px rgba(62,43,26,.35)}
.frtrack{cursor:cell}

/* ═══ Tiroir aéré : blocs séparés, listes déroulantes ═══ */
.dwform{gap:0}
.dwbloc{padding:15px 20px;border-bottom:1px solid var(--surface-2)}
.dwbloc .fl2{display:block;font-size:12px;font-weight:600;color:var(--encre-2);margin-bottom:7px}
.dwbloc .fi{width:100%}
.dwbloc select.fi{appearance:none;background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%2398876F' stroke-width='2' stroke-linecap='round'%3E%3Cpath d='m6 9 6 6 6-6'/%3E%3C/svg%3E");
  background-repeat:no-repeat;background-position:right 11px center;background-size:15px;padding-right:34px}
.perline{display:flex;align-items:center;gap:9px;margin-bottom:9px;flex-wrap:wrap}
.perline:last-child{margin-bottom:0}
.perline .pl{font-size:12px;font-weight:600;color:var(--muet);width:24px;flex:none}
.perline .fi{width:150px;flex:none}
.perline .demi{display:flex;gap:4px;margin-top:0;flex:1;min-width:150px}
/* Conflit avec des shifts existants */
.dwbloc.conflit{background:var(--jaune-pale);border-bottom-color:#EBDCB4}
.dwbloc.conflit .cfh{display:flex;align-items:center;gap:8px;font-size:13px;color:#7A5510;margin-bottom:9px}
.dwbloc.conflit .cfh svg{width:16px;height:16px;flex:none}
.dwbloc.conflit .cfl{display:flex;flex-wrap:wrap;gap:5px}
.dwbloc.conflit .cfp{font-size:10.5px;font-weight:600;background:#fff;border:1px solid #EBDCB4;
  border-radius:20px;padding:3px 9px;color:#7A5510}
.copt{display:flex;align-items:flex-start;gap:10px;padding:10px 12px;border:1px solid #EBDCB4;
  border-radius:10px;background:#fff;margin-bottom:7px;cursor:pointer}
.copt:last-child{margin-bottom:0}
.copt input{margin-top:2px;flex:none;accent-color:var(--jaune);width:15px;height:15px}
.copt b{font-size:12.5px;font-weight:600;display:block}
.copt i{font-style:normal;font-size:11.5px;color:var(--muet);display:block;margin-top:2px;line-height:1.5}
.copt:has(input:checked){border-color:var(--jaune);background:#FFFBF2}
/* Lignes sans shift dans les vues Jour et Frise */
.frrow.vide .frl{color:var(--muet)}
.frrow.vide .frtrack{background:repeating-linear-gradient(-45deg,#FBF9F4,#FBF9F4 5px,#FDFCF9 5px,#FDFCF9 10px)}
.frrow.vide:hover .frtrack{background:var(--surface-2)}

/* ═══════════════════════════════════════════════════════════════
   MENU EN RAIL (v4.3) — 78 px au lieu de 224
   ═══════════════════════════════════════════════════════════════ */
/* Largeur du rail : elle respire sur les grands écrans. */
:root{--rail-l:96px}
@media(min-width:1600px){:root{--rail-l:112px}}
@media(min-width:1920px){:root{--rail-l:124px}}
.rail{position:fixed;top:0;bottom:0;left:0;width:var(--rail-l);z-index:60;display:flex;
  flex-direction:column;align-items:center;padding:16px 0 14px;gap:5px;background:var(--carte);
  border-right:1px solid var(--ligne)}
.rail .rlogo{width:46px;height:46px;border-radius:14px;background:var(--terra);color:#fff;
  display:flex;align-items:center;justify-content:center;font-family:var(--f-logo,'Londrina Solid',cursive);
  font-size:21px;margin-bottom:16px;flex:none;letter-spacing:.02em}
.rail .rit{width:calc(var(--rail-l) - 20px);height:auto;min-height:0;padding:11px 6px 10px;
  border-radius:13px;display:flex;flex-direction:column;align-items:center;gap:6px;
  color:var(--encre-2);position:relative;flex:none;text-decoration:none;overflow:visible}
.rail .rit svg{width:23px;height:23px;stroke-width:1.6}
.rail .rit span{font-size:10.5px;font-weight:600;line-height:1.2;text-align:center;letter-spacing:.005em}
@media(min-width:1600px){
  .rail .rit svg{width:25px;height:25px}
  .rail .rit span{font-size:11.5px}
  .rail .rlogo{width:50px;height:50px;font-size:23px}
}
.rail .rit:hover{background:var(--surface-2);color:var(--encre)}
.rail .rit.on{background:var(--terra-pale);color:var(--terra-h)}
.rail .rit.on::before{content:'';position:absolute;left:-10px;top:50%;transform:translateY(-50%);
  width:3px;height:26px;border-radius:0 3px 3px 0;background:var(--terra)}
.rail .rit .rpt{position:absolute;top:7px;right:11px;width:7px;height:7px;border-radius:50%;
  background:var(--terra);border:1.5px solid var(--carte)}
.rail .rsep{width:40px;height:1px;background:var(--ligne);margin:9px 0;flex:none}
/* ── LA LISTE DES RUBRIQUES DÉFILE SEULE ──                  (v13.5)
   Le logo, sept rubriques et la version font 635 px : sur un écran de
   600 px, la version passait sous le bord. Seule la liste défile —
   défiler le rail entier aurait emporté la version avec elle. */
.rail .rlist{display:flex;flex-direction:column;align-items:center;gap:5px;
  width:100%;min-height:0;flex:0 1 auto;overflow-y:auto;overflow-x:hidden;
  scrollbar-width:thin;scrollbar-color:var(--ligne-2) transparent}
.rail .rlist::-webkit-scrollbar{width:6px}
.rail .rlist::-webkit-scrollbar-track{background:transparent}
.rail .rlist::-webkit-scrollbar-thumb{background:var(--ligne-2);border-radius:9px}
/* Le filet de la rubrique active déborde de 10 px à gauche : dans une
   liste qui défile, il serait rogné. On le rentre. */
.rail .rlist .rit.on::before{left:-4px}
.rail .rbas{margin-top:auto;padding-top:8px}
/* ── SUR UN ÉCRAN COURT, LE RAIL SE RESSERRE ──              (v13.5)
   La liste peut défiler, mais un rail qu'il faut faire défiler pour
   atteindre sa dernière rubrique est un rail qui a échoué : c'est le
   seul endroit d'où l'on part. Sept rubriques demandent 505 px, un
   écran de 600 px en laisse 448 — il manque exactement la hauteur
   d'une rubrique. On la reprend sur les blancs, pas sur les mots :
   l'étiquette reste, sinon le rail cesse de NOMMER, et c'est tout ce
   qu'il sait faire. Le défilement reste dessous, pour plus court
   encore. */
@media(max-height:760px){
  .rail{padding:12px 0 10px}
  .rail .rlogo{margin-bottom:9px}
  .rail .rit{padding:7px 6px 7px;gap:5px}
  .rail .rsep{margin:5px 0}
  .rail .rbas{padding-top:4px}
}
/* ═══ v11.36 · LA VERSION EN BAS DU RAIL ═══
   Elle a remplacé l'initiale de l'utilisateur, qui répétait le
   bandeau du haut. Assez discrète pour ne pas concurrencer les
   rubriques, assez lisible pour répondre à « c'est à jour ? » sans
   cliquer. */
.rail .rvers{display:flex;flex-direction:column;align-items:center;gap:2px;
  padding:7px 4px;border-radius:10px;text-decoration:none;color:var(--muet);
  transition:background .12s,color .12s}
.rail .rvers .ico{width:15px;height:15px;opacity:.65}
.rail .rvers span{font-size:9.5px;font-weight:700;letter-spacing:.01em;
  max-width:52px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.rail .rvers:hover{background:rgba(255,255,255,.10);color:#fff}
.rail .rvers:hover .ico{opacity:1}
.rail .rvers.on{background:rgba(255,255,255,.14);color:#fff}

/* ═══ v11.36 · LE JOURNAL DES VERSIONS ═══
   Deux colonnes : le numéro et sa date à gauche, ce qui a changé à
   droite. Un journal se parcourt par version, pas par phrase. */
.nvrow{display:flex;gap:22px;padding:18px 20px;border-top:1px solid var(--ligne)}
.nvrow:first-child{border-top:none}
.nvv{flex:none;width:120px;display:flex;flex-direction:column;gap:3px;align-items:flex-start}
.nvv b{font-family:var(--f-tit);font-size:17px;color:var(--encre)}
.nvv span{font-size:11px;color:var(--muet)}
.nvv .pill{margin-top:4px;font-style:normal}
.nvc{flex:1;min-width:0}
.nvc h3{font-family:var(--f-tit);font-size:15px;margin:0 0 8px;color:var(--encre)}
.nvc ul{margin:0;padding-left:17px}
.nvc li{font-size:12.5px;line-height:1.65;color:var(--encre-2,var(--encre));margin-bottom:5px}
.nvc li:last-child{margin-bottom:0}
.nvrow.on .nvv b{color:var(--terra)}
/* Panneau volant */
/* ── IL TIENT DANS L'ÉCRAN ──                                (v13.5)
   Dix-sept entrées font 859 px : sur un portable de 600 px, la moitié
   basse du menu Développeur n'existait pas — hors de l'écran, et la
   molette ne la ramenait pas. Le panneau s'arrête donc au bord et
   défile.

   Le plafond n'est pas 100vh : le script pose le panneau à 46 px du
   haut au minimum, et lui laisse 14 px sous le pied. 60 px de moins
   que la fenêtre, c'est exactement ce qui reste. Les deux nombres
   doivent bouger ENSEMBLE — c'est pourquoi celui-ci est écrit ici,
   en face de l'autre. */
.rfly{position:fixed;left:var(--rail-l);z-index:59;min-width:238px;background:var(--carte);
  border:1px solid var(--ligne);border-radius:0 14px 14px 0;box-shadow:var(--ombre-2);
  padding:13px 8px 10px;opacity:0;visibility:hidden;transform:translateX(-8px);
  transition:opacity .13s,transform .13s;
  max-height:calc(100vh - 60px);overflow-y:auto;overscroll-behavior:contain;
  scrollbar-width:thin;scrollbar-color:var(--ligne-2) transparent}
.rfly::-webkit-scrollbar{width:7px}
.rfly::-webkit-scrollbar-track{background:transparent}
.rfly::-webkit-scrollbar-thumb{background:var(--ligne-2);border-radius:9px}
.rfly.on{opacity:1;visibility:visible;transform:none}
.rfly .ft{font-family:var(--f-titre);font-weight:600;font-size:14px;padding:0 12px 9px;
  border-bottom:1px solid var(--ligne)}
.rfly a{display:flex;align-items:center;gap:9px;padding:8px 12px;border-radius:9px;
  font-size:13px;font-weight:500;color:var(--encre-2);margin-top:2px;text-decoration:none}
.rfly a:first-of-type{margin-top:7px}
.rfly a:hover{background:var(--surface-2);color:var(--encre)}
.rfly a.on{background:var(--terra-pale);color:var(--terra-h);font-weight:600}
.rfly a .fic{width:16px;height:16px;stroke-width:1.7;flex:none;opacity:.75}
.rfly a .bdg{margin-left:auto;font-size:10px;font-weight:700;background:var(--jaune-pale);
  color:var(--jaune);border-radius:20px;padding:1px 7px}
/* Le contenu récupère la place */
body .main{margin-left:var(--rail-l);min-height:100vh}

/* Panneau latéral du déploiement des positions (ex-.side) */
.pnlat{display:flex;flex-direction:column;gap:12px;min-width:0}

/* Absences dans les vues Jour et Frise */
.frabs{position:absolute;inset:3px 2px;border-radius:8px;border:1px dashed;display:flex;
  align-items:center;padding:0 10px;font-size:10.5px;font-weight:700;z-index:1;
  background-image:repeating-linear-gradient(-45deg,rgba(255,255,255,.5),rgba(255,255,255,.5) 5px,transparent 5px,transparent 10px)}
.frabs.cliq{cursor:pointer}
.frabs.cliq:hover{filter:brightness(.97)}
.absx.cliq{cursor:pointer}
/* Poignées de redimensionnement sur l'échelle continue */
.frbar.cliq{cursor:grab}
.frbar.endrag{cursor:grabbing;z-index:6;box-shadow:0 4px 14px -4px rgba(62,43,26,.45)}
.frbar .hpg{position:absolute;top:0;bottom:0;width:8px;cursor:ew-resize;opacity:0;z-index:2}
.frbar .hpg.g{left:-2px}
.frbar .hpg.d{right:-2px}
.frbar:hover .hpg{opacity:1;background:rgba(62,43,26,.14)}
.frbar .hpg.g{border-radius:7px 0 0 7px}
.frbar .hpg.d{border-radius:0 7px 7px 0}

/* ═══ Gestes sur les vues Jour et Frise ═══ */
.frbar.cliq{cursor:grab;user-select:none}
.frbar.cliq:active{cursor:grabbing}
.frbar.gdrag{z-index:20;box-shadow:0 6px 20px -6px rgba(62,43,26,.45);opacity:.94;cursor:grabbing}
.frbar .gh{position:absolute;top:0;bottom:0;width:8px;cursor:ew-resize;opacity:0;
  transition:opacity .12s;background:rgba(62,43,26,.18)}
.frbar .gh-g{left:0;border-radius:7px 0 0 7px}
.frbar .gh-d{right:0;border-radius:0 7px 7px 0}
.frbar:hover .gh{opacity:1}
.frtrack.gcible{background:var(--terra-pale);box-shadow:inset 0 0 0 1.5px var(--terra)}
body.gencours{cursor:grabbing;user-select:none}
/* Pendant un geste, les boutons « + » disparaissent : ils invitent
   à créer alors qu'on est en train de déplacer. */
body.gencours .jplus,body.gencours .frplus,body.gencours .plus,
body.gencours .dcopie{opacity:0!important;pointer-events:none}
body.gencours .frbar:not(.gdrag){opacity:.65}
/* Infobulle de geste */
.gtip{position:fixed;z-index:250;background:var(--encre);color:#fff;font-size:11.5px;font-weight:600;
  padding:5px 10px;border-radius:8px;pointer-events:none;opacity:0;transform:translateX(-50%);
  transition:opacity .1s;white-space:nowrap;font-variant-numeric:tabular-nums}
.gtip.on{opacity:1}

/* Les poignées sont à l'intérieur de la barre : elles survivent au
   rognage du texte, et passent au-dessus du libellé. */
.frbar>.btg,.frbar>.bhh{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;min-width:0}
.frbar .gh{z-index:3}
/* Sur une barre étroite, les poignées se rejoignent : on garde
   au moins un tiers de largeur pour le déplacement. */
.frbar .gh{max-width:33%}

/* Bouton « + » flottant sur la piste survolée */
.gplus{position:fixed;z-index:70;width:26px;height:26px;margin:-13px 0 0 -13px;border-radius:9px;
  border:1.5px dashed var(--ligne-2);background:#fff;color:var(--terra);font-size:15px;
  font-weight:700;line-height:1;display:flex;align-items:center;justify-content:center;
  opacity:0;visibility:hidden;pointer-events:none;transition:opacity .1s;font-family:var(--f-ui)}
.gplus.on{opacity:1;visibility:visible;pointer-events:auto}
.gplus:hover{background:var(--terra-pale);border-color:var(--terra);border-style:solid}
/* Choix au dépôt : déplacer ou dupliquer */
.gchoix{position:fixed;z-index:250;display:flex;background:#fff;border:1px solid var(--ligne);
  border-radius:11px;box-shadow:var(--ombre-2);overflow:hidden;transform:translate(-50%,-50%)}
.gchoix button{border:none;background:none;padding:10px 15px;font-size:12.5px;font-weight:600;
  color:var(--encre);font-family:var(--f-ui);white-space:nowrap}
.gchoix button+button{border-left:1px solid var(--ligne)}
.gchoix button:hover{background:var(--terra-pale);color:var(--terra-h)}

/* Pistes des vues Jour et Frise : elles gardent leur mise en page
   temporelle, la classe .pcell ne sert qu'au partage des styles. */
.frtrack,.frtrack.pcell{display:block!important;padding:0!important;min-height:0!important;
  height:100%;gap:0;border-left:none;position:relative!important;cursor:cell}
/* Le « + » est ancré sur SA piste : sans position:relative sur le
   parent, tous les boutons se superposaient sur la première ligne. */
.frtrack .plus,.frtrack.pcell .plus{position:absolute!important;left:8px;top:50%;
  transform:translateY(-50%);width:26px;height:26px;min-height:0!important;margin:0;z-index:4;
  border:1.5px dashed var(--ligne-2);border-radius:9px;background:#fff;color:var(--terra);
  font-size:15px;font-weight:700;line-height:1;display:flex;align-items:center;
  justify-content:center;opacity:0;pointer-events:none;transition:opacity .12s}
.frrow:hover .frtrack .plus,.frtrack:hover .plus{opacity:1;pointer-events:auto}
.frtrack .plus:hover{background:var(--terra-pale);border-color:var(--terra);border-style:solid}
.frtrack.gcible{background:var(--terra-pale);box-shadow:inset 0 0 0 1.5px var(--terra)}
.frbar.sh{cursor:grab}
.frbar.sh.gdrag{cursor:grabbing;z-index:30;box-shadow:0 6px 20px -6px rgba(62,43,26,.45)}

/* ═══════════════════════════════════════════════════════════════
   VUES JOUR ET FRISE : des lignes manipulables (v4.5.2)
   Des barres de 30 px sur des lignes de 46 px sont trop fines pour
   être attrapées à la souris, et la colonne des noms tronquait.
   ═══════════════════════════════════════════════════════════════ */
.frrule,.frday,.frrow{grid-template-columns:230px 1fr 84px}
.frrow{height:62px}
.frrow .frl{font-size:13px;font-weight:600}
.frrow .avm{width:28px;height:28px;font-size:9.5px}
.frbar{top:11px;bottom:11px;border-radius:9px}
.frbar .btg{font-size:9px}
.frbar .bhh{font-size:11px}
/* Poignées : assez larges pour être visées sans loupe */
.frbar .gh{width:11px;background:rgba(62,43,26,.14)}
.frbar:hover .gh{opacity:1;background:rgba(62,43,26,.22)}
.frbar .gh::after{content:'';position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);
  width:2px;height:12px;border-radius:2px;background:rgba(255,255,255,.85)}
/* Le « + » se voit à la hauteur des lignes agrandies */
.frtrack .plus,.frtrack.pcell .plus{width:28px;height:28px;font-size:16px}
/* La vue Jour a de la place : on aère davantage */
.vjour .frrow{height:74px}
.vjour .frbar{top:15px;bottom:15px}

/* ═══════════════════════════════════════════════════════════════
   VUE JOUR EN GRILLE DE QUARTS D'HEURE (v4.6)
   Une colonne = 15 minutes. Les shifts sont placés en colonnes de
   grille, pas en pixels : ils suivent la largeur de l'écran.
   ═══════════════════════════════════════════════════════════════ */
.jcard{overflow:hidden}
.jwrap{overflow-x:auto}
.jgrid{display:grid;width:100%;min-width:max-content}
/* Colonne des noms, figée au défilement horizontal */
.jgrid .jlab{grid-column:1;position:sticky;left:0;z-index:5;background:#fff;
  border-top:1px solid var(--surface-2);padding:9px 14px;display:flex;align-items:center;
  gap:10px;min-width:0}
.jgrid .jlab.jhead,.jgrid .jlab.jeff{background:var(--surface-2);border-top:none;
  border-bottom:1px solid var(--ligne);font-size:10.5px;font-weight:700;letter-spacing:.05em;
  text-transform:uppercase;color:var(--muet);padding:10px 14px}
.jgrid .jlab.jeff{background:#fff;text-transform:none;letter-spacing:0;font-size:11px}
.jgrid .jlab .avm{width:30px;height:30px;border-radius:50%;color:#fff;font-size:10.5px;
  font-weight:700;display:flex;align-items:center;justify-content:center;flex:none}
.jgrid .jlab .n{display:block;font-size:13px;font-weight:600;line-height:1.2;
  white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.jgrid .jlab .c{display:block;font-size:10.5px;color:var(--muet)}
.jgrid .jlab.jna .n{color:var(--terra-h)}
/* En-tête des heures */
.jgrid .jh{background:var(--surface-2);border-bottom:1px solid var(--ligne);
  border-left:1px solid var(--ligne);font-size:11px;font-weight:700;color:var(--encre-2);
  padding:10px 0 9px 6px;white-space:nowrap;overflow:hidden}
/* Les quarts d'heure n'apparaissent QUE si la colonne est assez
   large : au zoom, on gagne « h15 », « h30 », « h45 » ; au repos,
   ils resteraient illisibles. Le seuil est porté par --jcol, que
   le zoom modifie. */
.jgrid .jh.jq{font-size:9px;font-weight:600;color:transparent;
  border-left-color:var(--surface-2)}
.jgrid.jfin .jh.jq{color:var(--muet)}
/* Le texte devient transparent, la case reste opaque : en vue
   Semaine l'en-tête des heures est figé en haut, et des cases
   « visibility:hidden » y laissaient des trous par lesquels les
   shifts défilant dessous apparaissaient. */
.jgrid .jt{border-left:1px solid var(--ligne);border-top:1px solid var(--surface-2);
  background:var(--surface-2);display:flex;align-items:center;justify-content:center;
  font-size:12px;font-weight:700;color:var(--encre-2)}
.jgrid .jt.jhead{border-top:none;border-bottom:1px solid var(--ligne);font-size:10px;
  font-weight:700;letter-spacing:.05em;text-transform:uppercase;color:var(--muet)}
/* Bande d'effectif */
/* Effectif : le CHIFFRE par quart d'heure. Une barre oblige à
   comparer des hauteurs pour deviner un nombre qu'on peut lire. */
.jgrid .jec{border-bottom:1px solid var(--ligne);border-left:1px solid var(--surface-2);
  display:flex;align-items:center;justify-content:center;height:26px;
  font-size:10.5px;font-weight:600;color:var(--muet);font-variant-numeric:tabular-nums}
.jgrid .jec.q0{border-left-color:var(--ligne)}
.jgrid .jec.hi{color:var(--encre);font-weight:700;background:var(--surface-2)}
/* Cellules */
.jgrid .jcell{border-top:1px solid var(--surface-2);border-left:1px solid var(--surface-2);
  min-height:58px;position:relative}
.jgrid .jcell.q0{border-left-color:var(--ligne-2)}
.jgrid .jcell.q2{border-left-color:var(--ligne)}
.jgrid .jcell.hors{background:repeating-linear-gradient(-45deg,#F6F3EC,#F6F3EC 5px,#FBF9F4 5px,#FBF9F4 10px)}
.jgrid .jcell.jcible{background:var(--terra-pale);box-shadow:inset 0 0 0 1.5px var(--terra)}
.jgrid .jplus{position:absolute;inset:6px;border:1.5px dashed var(--ligne-2);border-radius:8px;
  background:none;color:var(--terra);font-size:15px;font-weight:700;opacity:0;
  display:flex;align-items:center;justify-content:center;pointer-events:none;
  transition:opacity .12s;font-family:var(--f-ui);padding:0}
.jgrid .jcell:hover .jplus{opacity:1;pointer-events:auto}
.jgrid .jcell:hover .jplus:hover{background:var(--terra-pale);border-color:var(--terra);border-style:solid}
/* Shifts */
.jgrid .jsh{position:relative;margin:7px 1px;border-radius:9px;padding:5px 9px;overflow:clip;
  border:1px solid rgba(62,43,26,.1);border-left-width:3px;display:flex;flex-direction:column;
  justify-content:center;cursor:grab;z-index:2;min-width:0}
.jgrid .jsh:active{cursor:grabbing}
.jgrid .jsh .t{font-size:9px;font-weight:700;letter-spacing:.05em;text-transform:uppercase;
  opacity:.72;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.jgrid .jsh .h{font-size:11.5px;font-weight:700;white-space:nowrap}
.jgrid .jsh.jdrag{opacity:.6;z-index:20;box-shadow:0 8px 22px -8px rgba(62,43,26,.5)}
.jgrid .jsh .jgh{position:absolute;top:0;bottom:0;width:12px;cursor:ew-resize;display:flex;
  align-items:center;justify-content:center;opacity:0;transition:opacity .12s;z-index:3}
.jgrid .jsh .jgh::after{content:'';width:3px;height:16px;border-radius:2px;background:rgba(62,43,26,.42)}

/* ═══ L'ÉTAT DU SHIFT, SUR LA PISTE ═══                      (v13.6)
   Les vues Jour et Semaine ne disaient RIEN : validé, à valider et en
   cours portaient le même rectangle. On ne réinvente pas un langage —
   ce sont les modificateurs de la vue Salariés, appliqués au bloc. */
.jgrid .jsh.shvalide{filter:saturate(1.4) brightness(.95);
  border-color:currentColor;border-width:1.5px;border-left-width:4px}
.jgrid .jsh.shencours{border-color:transparent;border-width:2px;border-left-width:3px}
.jgrid .jsh.shencours::before{content:'';position:absolute;inset:-2px;border-radius:10px;padding:2px;
  background:conic-gradient(from var(--ang,0deg),transparent 0deg,currentColor 60deg,
    transparent 130deg,transparent 360deg);
  -webkit-mask:linear-gradient(#000 0 0) content-box,linear-gradient(#000 0 0);
          mask:linear-gradient(#000 0 0) content-box,linear-gradient(#000 0 0);
  -webkit-mask-composite:xor;mask-composite:exclude;
  animation:shtour 2.4s linear infinite;pointer-events:none;z-index:1}
@supports not (background:conic-gradient(from 0deg,red,blue)){
  .jgrid .jsh.shencours{border-color:currentColor;border-style:dashed}
  .jgrid .jsh.shencours::before{display:none}
}
@media (prefers-reduced-motion:reduce){
  .jgrid .jsh.shencours::before{animation:none;background:currentColor;opacity:.5}
}
/* La pastille vit DANS la ligne des heures, qui est déjà collante :
   posée au bout du bloc, elle serait à huit heures du regard sur un
   bloc de huit heures, et par-dessus le libellé sur un bloc court.
   Elle rétrécit un peu — la carte de la vue Salariés a deux fois
   cette hauteur de texte. */
.jgrid .jsh .h{display:flex;align-items:center;gap:6px}
/* ── AU COIN BAS-DROIT, COMME SUR LA CARTE ──               (v13.11)
   Elle a d'abord vécu DANS la ligne des heures, pour rester sous
   l'œil sur un bloc de huit heures. Deux inconvénients l'en ont
   chassée : elle cognait le bloc soudé des heures retenues, et
   surtout elle n'était pas au même endroit d'un écran à l'autre —
   on la cherche là où la vue Salariés l'a mise. */
.jgrid .jsh .shtick,.jgrid .jsh .shring{width:13px;height:13px;
  position:absolute;right:5px;bottom:4px;z-index:2}
.jgrid .jsh .shtick{border-radius:50%;background:currentColor;display:flex;
  align-items:center;justify-content:center;box-shadow:0 0 0 1.5px rgba(255,255,255,.65);
  flex:none}
.jgrid .jsh .shtick::before{content:'✓';color:#fff;font-size:8px;font-weight:700;line-height:1}
/* Le libellé ne passe pas dessous : le kit règle déjà le même cas
   sur la carte (« .sh.shvalide{padding-right:24px} »). */
.jgrid .jsh.shvalide,.jgrid .jsh.shavalider{padding-right:22px}

/* ── LE PRÉVU ET LE RÉEL, DANS UN SEUL BLOC ──       (v13.6 · v13.13)

   Le bloc couvre L'UNION du prévu et de ce qui a eu lieu. Dedans,
   trois zones — et c'est tout le vocabulaire :

     plein      ce qui était prévu ET fait
     .jhors     fait sans être prévu   — hachuré
     .jcreux    prévu et non fait      — creux, le fond de la carte

   Il en a fallu trois pour arriver là. La v13.6 posait la part À
   CÔTÉ du bloc (« .jdep » dehors, « .jman » par-dessus) parce que le
   bloc restait sur le prévu ; la v13.11 a fait sauter le bloc sur le
   retenu à la validation, et la part est passée dedans. Le même
   dépassement se dessinait donc de deux façons selon qu'on avait
   cliqué « Valider ». Une seule géométrie, une seule règle : le bloc
   ne bouge plus, seule la marque d'état change.

   ── HACHURES ET CREUX, PAS DEUX VOILES ──
   Le VOILE clair est déjà la pause (« .jpz ») : deux choses
   différentes qui se ressemblent sont pires que deux choses
   différentes qu'on ne voit pas. Ce qui a été fait porte donc de la
   matière — des hachures ; ce qui n'a pas eu lieu n'en porte aucune :
   il montre le fond de la carte, entre deux pointillés.

   La couleur vient du POSTE : les zones sont filles du bloc, dont
   elles héritent « color » — c'est ce qui les dispense du piège que
   les pièces posées à côté avaient (« currentColor » leur donnait le
   noir du texte). */
.jsh .jhors,.jsh .jcreux{position:absolute;top:0;bottom:0;z-index:1;pointer-events:none;
  border-left:1px dashed currentColor;border-right:1px dashed currentColor}
.jsh .jhors{background:repeating-linear-gradient(-45deg,transparent 0 3px,currentColor 3px 4.5px);
  opacity:.45}
.jsh .jcreux{background:var(--carte);opacity:.92}
/* Une zone COLLÉE au bord du bloc n'a qu'un pointillé : le second
   doublerait la bordure du bloc, et « overflow:clip » l'aurait de
   toute façon rogné à moitié. Le côté est posé au rendu, pas déduit
   d'un « :first-child » — le libellé et la coche sont des enfants
   eux aussi, et l'ordre du balisage n'a pas à porter du sens. */
.jsh .jzg{border-left:0}
.jsh .jzd{border-right:0}
/* ── LE LIBELLÉ NE SE POSE PAS SUR UNE ZONE ──
   Il commence au bord gauche du bloc, et le bloc commence maintenant
   plus tôt que le service quand on est arrivé en avance. « --jdec »
   porte la largeur de la zone de gauche ; le calage collant, lui, ne
   bouge pas. */
.jsh .t,.jsh .h{margin-left:var(--jdec,0)}
.jgrid .jsh:hover .jgh{opacity:1}
.jgrid .jsh .jgg{left:0}
.jgrid .jsh .jgd{right:0}
/* Absence : bandeau sur toute la journée */
.jgrid .jabs{position:relative;margin:0 1px;align-self:center;min-height:22px;border-radius:7px;border:1px solid;
  display:flex;align-items:center;padding:2px 10px;font-size:10px;font-weight:600;z-index:1;
  overflow:clip}
/* v7.20.1 : même hauteur que le ruban d'absence de la vue
   Salariés (22 px, centré dans la ligne) ; un bloc à la hauteur
   d'un shift faisait lire une absence comme un poste. */
/* Instant présent */
.jgrid .jnow{background:var(--terra);width:2px;justify-self:start;margin-left:-1px;z-index:8;
  pointer-events:none;position:relative}
.jgrid .jnow::before{content:'';position:absolute;top:-3px;left:-3px;width:8px;height:8px;
  border-radius:50%;background:var(--terra)}
/* Pied et densité */
.jpied{display:flex;gap:14px;align-items:center;padding:11px 16px;border-top:1px solid var(--ligne);
  background:var(--surface-2);font-size:11.5px;color:var(--muet);flex-wrap:wrap}
.jpied .lg{display:flex;align-items:center;gap:6px}
.jpied .lg i{width:11px;height:11px;border-radius:3px;display:block}
.jpied .astuce{margin-left:auto;font-weight:600;color:var(--encre-2)}
.jzoom{display:flex;gap:2px;background:var(--surface-2);border:1px solid var(--ligne);
  border-radius:9px;padding:2px}
.jzoom button{border:none;background:none;border-radius:7px;padding:5px 10px;font-size:11.5px;
  font-weight:600;color:var(--muet);font-family:var(--f-ui)}
.jzoom button.on{background:#fff;color:var(--terra-h);box-shadow:var(--ombre)}

/* ═══ Sélecteur parcs & équipes (v4.8) ═══ */
.psel{position:relative;width:min(360px,100%)}
.psel .pchamp{display:flex;align-items:center;gap:10px;border:1px solid var(--ligne-2);
  background:#fff;border-radius:11px;padding:0 12px;height:38px;cursor:text}
.psel .pchamp:hover{border-color:var(--muet)}
.psel .pchamp.ouvert{border-color:var(--terra);box-shadow:0 0 0 3px var(--terra-pale)}
.psel .pchamp .loupe{width:16px;height:16px;stroke:var(--muet);fill:none;stroke-width:1.8;flex:none}
.psel .pchamp input{flex:1;min-width:0;border:none;outline:none;font-size:13.5px;
  font-family:var(--f-ui);background:none;color:var(--encre)}
.psel .pchamp input::placeholder{color:var(--encre);opacity:1;font-weight:600}
.psel .pchamp .chev{width:15px;height:15px;stroke:var(--muet);fill:none;stroke-width:2;flex:none;
  transition:transform .15s}
.psel .pchamp.ouvert .chev{transform:rotate(180deg)}
/* ── LE PANNEAU NE VIT PLUS DANS LA BARRE ──               (v14.15)
   Il était en position:absolute. Or la barre du planning défile en
   largeur (« overflow-x:auto »), et le navigateur ramène alors
   « overflow-y » à « auto » : le conteneur ROGNE ce qui dépasse en
   hauteur. Le panneau s'ouvrait bien — classe posée, chevron
   retourné — mais il était coupé à zéro. À l'écran, le bouton avait
   l'air mort.
   C'est exactement le piège relevé en v12.4 pour les menus Affichage
   et Outils, passés à l'époque en position fixe. Celui-ci avait été
   oublié. Il se place donc au clic, comme eux : hors du flux, plus
   rien ne le rogne. Sa largeur et sa place viennent du champ. */
.psel .ppan{position:fixed;left:0;top:0;width:340px;z-index:130;
  background:#fff;border:1px solid var(--ligne);border-radius:13px;box-shadow:var(--ombre-2);
  opacity:0;visibility:hidden;transform:translateY(-6px);transition:.14s;overflow:hidden}
.psel .ppan.on{opacity:1;visibility:visible;transform:none}
.psel .corps{max-height:340px;overflow-y:auto;padding:5px 0}
.psel .pgrp{border-top:1px solid var(--ligne)}
.psel .pgrp:first-child{border-top:none}
.psel .pline{display:flex;align-items:center;gap:10px;padding:10px 15px;cursor:pointer;
  font-size:13.5px;color:var(--encre)}
.psel .pline:hover{background:var(--surface-2)}
.psel .pline .ic{width:16px;height:16px;stroke:var(--encre-2);fill:none;stroke-width:1.7;flex:none}
.psel .pline.eq{padding-left:32px;font-size:13px}
.psel .pline.eq .ic{stroke:var(--muet)}
.psel .pline .n{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.psel .pline .nb{color:var(--muet);font-weight:500}
/* Un cercle vide marque le non-retenu, une pastille pleine le
   retenu : sans contraste, on ne distingue pas les deux. */
.psel .pline .ck{width:18px;height:18px;min-width:18px;border-radius:50%;flex:none;
  position:relative;border:1.5px solid var(--ligne-2);background:#fff;transition:.12s;
  box-sizing:border-box;display:block}
.psel .pline:hover .ck{border-color:var(--muet)}
.psel .pline.coche .ck{background:var(--terra);border-color:var(--terra)}
/* Retenu : une pastille pleine au centre du cercle, comme un bouton
   radio. Plus lisible qu'une coche à cette taille, et cohérent
   entre le parc et ses équipes. */
.psel .pline.coche .ck{border-color:var(--terra);background:#fff}
.psel .pline.coche .ck::after{content:'';position:absolute;left:50%;top:50%;
  width:9px;height:9px;border-radius:50%;background:var(--terra);
  transform:translate(-50%,-50%)}
/* Parc dont une partie seulement des équipes est retenue :
   même pastille, en plus petit et estompée. */
.psel .pline.part .ck{border-color:var(--terra);background:#fff}
.psel .pline.part .ck::after{content:'';position:absolute;left:50%;top:50%;
  width:6px;height:6px;border-radius:50%;background:var(--terra);opacity:.5;
  transform:translate(-50%,-50%)}
/* La ligne retenue se lit d'un coup d'œil, pas seulement à la coche */
.psel .pline.coche{background:var(--terra-pale)}
.psel .pline.coche .n{font-weight:600;color:var(--terra-h)}
.psel .pline.coche:hover{background:#F9DFD6}
.psel .pline.parc.coche .ic,.psel .pline.parc.part .ic{stroke:var(--terra-h)}
.psel .ppied{display:flex;gap:10px;align-items:center;padding:9px 13px;
  border-top:1px solid var(--ligne);background:var(--surface-2)}
.psel .ppied .lien{border:none;background:none;font-size:11.5px;font-weight:600;
  color:var(--terra-h);padding:0;font-family:var(--f-ui)}
.psel .ppied .info{margin-left:auto;font-size:11px;color:var(--muet)}

/* Parc du contrat en cours, dans la liste des salariés */
.pparc{display:inline-flex;align-items:center;gap:6px;font-size:11.5px;font-weight:600;
  background:var(--surface-2);border:1px solid var(--ligne);border-radius:20px;padding:3px 10px;
  color:var(--encre-2)}

/* ═══════════════════════════════════════════════════════════════
   OUTILS DE SAISIE DU PLANNING (v5.0)
   ═══════════════════════════════════════════════════════════════ */
/* Bibliothèque d'horaires types */

/* Déposer un favori, c'est COPIER : même signalement que le
   déplacement d'un shift — pointillé sur la case visée — mais en
   vert, la couleur de l'ajout, et avec la mention « Copier ».
   Une case orange pleine ne disait pas quel geste était en cours
   (v7.88). */
.pcell.vcible{background:var(--vert-pale,#EDF3E6)!important;outline:2px dashed var(--vert,#55773B);
  outline-offset:-3px;border-radius:10px;position:relative}
.pcell.vcible::after{content:'Copier';position:absolute;left:50%;top:50%;
  transform:translate(-50%,-50%);background:var(--vert,#55773B);color:#fff;
  font:700 10px/1 var(--f-ui);letter-spacing:.06em;text-transform:uppercase;
  padding:4px 8px;border-radius:6px;pointer-events:none;white-space:nowrap;z-index:4}
/* Sélection multiple */
.sh.shsel{outline:2px solid var(--terra);outline-offset:1px;z-index:3}
.selbar{position:fixed;left:50%;bottom:22px;transform:translateX(-50%);z-index:200;
  display:flex;align-items:center;gap:9px;padding:10px 15px;background:var(--encre);color:#fff;
  border-radius:12px;font-size:12.5px;font-weight:600;box-shadow:var(--ombre-2)}
.selbar button{border:1px solid rgba(255,255,255,.25);background:rgba(255,255,255,.1);color:#fff;
  border-radius:8px;padding:5px 11px;font-size:12px;font-weight:600;font-family:var(--f-ui)}
.selbar button:hover{background:rgba(255,255,255,.22)}
.selbar button.x{border:none;background:none;font-size:15px;padding:0 4px}
/* Reproduire sur la semaine */
.appsem{position:absolute;right:6px;bottom:6px;margin:0;display:flex;z-index:4}
.pemp{position:relative}
/* v7.21 : le bouton se logeait en bout de ligne et se superposait
   au nom dès que la colonne manquait de place ; il est désormais
   dans le coin bas droit de la case, au survol. */
.appsem button{border:1px solid var(--ligne-2);background:#fff;border-radius:8px;padding:0 8px;
  height:23px;font-size:10px;font-weight:600;color:var(--encre-2);display:inline-flex;
  align-items:center;gap:4px;opacity:0;transition:opacity .12s;font-family:var(--f-ui)}
.appsem button svg{width:11px;height:11px}
.prow:hover .appsem button{opacity:1}
.appsem button:hover{border-color:var(--terra);color:var(--terra-h)}
/* Commentaire sur un shift */
.sh .shnote{display:block;font-size:9.5px;font-style:italic;opacity:.82;white-space:nowrap;
  overflow:hidden;text-overflow:ellipsis}
/* Recherche d'un salarié */
.rechsal{display:flex;align-items:center;gap:7px;border:1px solid var(--ligne-2);border-radius:9px;
  padding:0 10px;height:30px;background:#fff;width:190px}
.rechsal .lp{width:14px;height:14px;stroke:var(--muet);fill:none;stroke-width:1.8;flex:none}
.rechsal input{border:none;outline:none;font-size:12px;font-family:var(--f-ui);width:100%;background:none}
.prow.surli .pemp{background:var(--jaune-pale);box-shadow:inset 3px 0 0 var(--jaune)}
.prow.estompe{opacity:.32}
/* Densité */

body.dens-dense .pcell{min-height:48px;padding:4px}
body.dens-dense .sh{padding:3px 6px;font-size:10px}
body.dens-dense .sh .hh{font-size:9px}
body.dens-dense .sh .pz,body.dens-dense .sh .shnote{display:none}
body.dens-dense .pemp{padding:6px 10px}
body.dens-lache .pcell{min-height:104px}
body.dens-lache .sh{padding:7px 10px}

/* ═══ Favoris (v5.1) ═══ */
.favbtn{gap:6px}
.favbtn svg{width:14px;height:14px}
.favbtn .nb{background:var(--terra-pale);color:var(--terra-h);border-radius:20px;
  padding:1px 7px;font-size:10.5px;font-weight:700}

.favnew summary::-webkit-details-marker{display:none}

.favnew .fl2{display:block;font-size:12px;font-weight:600;color:var(--encre-2);margin:12px 0 5px}
.favnew .fl2:first-of-type{margin-top:0}
.favnew .fi{width:100%;border:1px solid var(--ligne-2);border-radius:9px;padding:8px 11px;
  font-size:13px;font-family:var(--f-ui);background:#fff}
.favnew .f2{display:grid;grid-template-columns:1fr 1fr;gap:12px}
/* Le panneau s'efface pendant qu'on glisse vers la grille */
.mmodal.translucide{pointer-events:none}
.mmodal.translucide .mmbox{opacity:.14;transition:opacity .15s}
.mmodal.translucide .mmveil{opacity:0}

/* ═══ Lot 2 : disponibilités, besoins, demandes en attente (v5.2) ═══ */
/* ── UNE DEMANDE, UNE BANDE, UNE DÉCISION ──               (v14.13)

   « .absatt » vivait DANS la case : une demande de six jours posait
   six encadrés hachurés et SIX paires de boutons « Accepter /
   Refuser » pour une seule décision. On ne voyait pas que c'était la
   même demande, et rien ne disait où elle commençait.

   Elle emprunte maintenant la bande des absences validées (.absx,
   v11.66) : une pièce qui enjambe ses jours, hachurée pour dire
   qu'elle n'est pas tranchée, et la décision AU BOUT. Coupée par le
   bord de la semaine, elle reparaît la semaine suivante avec ses
   boutons — on décide depuis la semaine qu'on regarde.

   Quand une même ligne porte une absence validée ET une demande, la
   demande prend une seconde rangée : deux bandes sur la même rangée
   se recouvriraient là où leurs jours se croisent. */
.absx.att{background:repeating-linear-gradient(-45deg,#F7F1F6,#F7F1F6 4px,#FDFBFD 4px,#FDFBFD 8px);
  border:1.5px dashed var(--violet);color:var(--violet);cursor:default;
  /* Une bande d'un seul jour est étroite : elle rétrécit ce qu'elle
     porte, elle ne s'empile pas sur deux lignes — une ligne du
     planning plus haute que les autres se remarque plus que le
     libellé qu'on a sauvé. */
  flex-wrap:nowrap}
.absx.att .absnom{color:var(--violet)}
.absx.att .aj{color:var(--violet);opacity:.75}
.prow.avecatt{grid-template-rows:auto auto 1fr}
.prow.avecatt > .pemp{grid-row:1 / span 3}
.prow.avecatt > .absx.att{grid-row:2}
.prow.avecatt > .pcell{grid-row:3}
/* La décision, au bout de la bande : deux boutons de même taille,
   l'un plein — c'est celui qu'on prend neuf fois sur dix. */
.absdec{margin-left:auto;display:flex;gap:4px;flex:none}
.absdec button{border:none;border-radius:6px;padding:2px 8px;font-size:10px;
  font-weight:700;font-family:var(--f-ui);cursor:pointer;white-space:nowrap}
.absdec .ok{background:var(--vert);color:#fff}
.absdec .ok:hover{background:#47702F}
.absdec .no{background:#fff;border:1px solid var(--ligne-2);color:var(--muet)}
.absdec .no:hover{border-color:var(--rouge);color:var(--rouge)}
/* Trop étroite pour porter des mots : la bande garde ses boutons mais
   les réduit à leur signe. Le survol dit lequel est lequel. */
@container (max-width: 210px){
  .absdec button{font-size:0;padding:2px 6px}
  .absdec button::after{font-size:11px}
  .absdec .ok::after{content:'✓'}
  .absdec .no::after{content:'✕'}
  /* Le nombre de jours passe à la trappe avant le nom : sur une
     bande d'un jour, « 1 j » n'apprend rien que la largeur ne dise. */
  .absx.att .aj{display:none}
}
/* Indisponibilité récurrente */
.pcell .indz{font-size:9.5px;font-weight:600;color:var(--muet);text-align:center;
  padding:3px 6px;border-radius:6px;margin-bottom:3px;
  background:repeating-linear-gradient(-45deg,#F2EFE8,#F2EFE8 4px,#F9F7F2 4px,#F9F7F2 8px)}
/* Bouton « disponibles » dans l'en-tête de jour */

/* Panneau des disponibles */
.dispoline{display:flex;align-items:center;gap:10px;padding:10px 13px;border:1px solid var(--ligne);
  border-radius:10px;margin-bottom:7px;background:#fff;cursor:grab}
.dispoline:hover{border-color:var(--muet)}
.dispoline .n{flex:1;min-width:0;font-size:13px;font-weight:600}
.dispoline .n small{display:block;font-size:10.5px;font-weight:500;color:var(--muet)}
.dispoline .e{font-size:11.5px;font-weight:700;border-radius:20px;padding:3px 9px;flex:none}
.dispoline .e.moins{background:var(--bleu-pale);color:var(--bleu)}
.dispoline .e.plus{background:var(--jaune-pale);color:var(--jaune)}
/* Besoin contre planifié */
.pl2 .besrow{display:grid;grid-template-columns:var(--pl2cols);
  border-top:1px solid var(--surface-2);background:var(--surface-2)}
.pl2 .besrow .c0{padding:6px 12px;display:flex;align-items:center;gap:8px;flex-wrap:wrap}
.pl2 .besrow .bpil{font-size:10.5px;font-weight:600;border-radius:20px;padding:2px 8px}
.pl2 .besrow .bl{font-size:9.5px;color:var(--muet)}
.pl2 .besrow .besc{text-align:center;padding:6px 0;font-size:11.5px;font-weight:700;
  color:var(--muet);border-left:1px solid var(--ligne)}
.pl2 .besrow .besc.ok{color:var(--vert)}
.pl2 .besrow .besc.tr{background:var(--jaune-pale);color:var(--jaune)}
.pl2 .besrow .besc.ko{background:var(--rouge-pale);color:var(--rouge)}

/* ═══ Bandeau des favoris (v5.3) ═══
   Escamotable : une barre de vignettes qu'on affiche à la demande,
   plutôt qu'une fenêtre qui masque la grille. */
.favbar{display:none;gap:7px;padding:9px 12px;flex-wrap:wrap;align-items:center;
  background:var(--carte);border:1px solid var(--ligne);border-radius:var(--r);
  box-shadow:var(--ombre);margin-bottom:11px}
.favbar.on{display:flex}
/* La vignette EST un shift : elle en reprend la classe .sh, donc le
   bandeau vertical, la typographie et le survol. Seuls la largeur et
   le bouton de retrait lui sont propres. */
.favbar .favtag{position:relative;min-width:118px;padding-right:24px;flex:none}
.favbar .favtag:active{cursor:grabbing}

.favbar .favtag.vdrag{opacity:.4}
.favbar .favtag .fx{position:absolute;top:2px;right:2px}
.favbar .favtag .fx button{border:none;background:none;color:currentColor;opacity:.35;
  font-size:11px;padding:2px 4px;line-height:1;font-family:var(--f-ui)}
.favbar .favtag .fx button:hover{opacity:1}
.favbar .favplus{width:32px;height:32px;border:1.5px dashed var(--ligne-2);border-radius:9px;
  background:none;color:var(--muet);font-size:17px;line-height:1;font-family:var(--f-ui)}
.favbar .favplus:hover{border-color:var(--terra);color:var(--terra-h)}
.favbar .favvide{font-size:12px;color:var(--muet)}
.favbtn.actif{background:var(--terra-pale);border-color:var(--terra);color:var(--terra-h)}
/* ═══ Menu Affichage ═══ */
.affmenu .ddpanel{min-width:250px;max-height:70vh;overflow-y:auto}
.affmenu summary svg{width:14px;height:14px}
/* Options d'affichage : les BASCULES utilisent l'interrupteur
   officiel (.sw/.swt), les CHOIX EXCLUSIFS de densité restent des
   boutons radio — un interrupteur ne sait pas dire « l'un parmi
   trois ». */
.aopt{display:flex;align-items:center;gap:9px;padding:7px 10px;border-radius:8px;cursor:pointer;
  font-size:12.5px}
.aopt:hover{background:var(--surface-2)}
.aopt input[type="radio"]{width:15px;height:15px;accent-color:var(--terra);flex:none;cursor:pointer}
/* Variante interrupteur : le curseur remplace la case */
.aopt.sw{gap:10px}
.aopt.sw .swl{flex:1;min-width:0;font-size:12.5px}
.aopt.sw:hover{background:var(--surface-2)}
/* Familles masquables depuis le menu */
/* La bande n'est plus DANS la case : elle est posée sur la grille de
   la ligne. Le sélecteur qui la masque doit suivre, sinon
   « masquer les absences » cesse de masquer quoi que ce soit
   (v11.66). */
body.sans-abs .absx,
body.sans-attente .pcell .absatt,
body.sans-dispo .pcell .indz,
/* Note portée par un shift : elle se coupe séparément de la note du
   jour, qui concerne tout l'établissement (v7.91). */
body.sans-shnotes .sh .shnote{display:none}
body.sans-meteo .pl2 .dd .meteo,
body.sans-notes .pl2 .dd .dnote,
body.sans-besoin .pl2 .besrow,
body.sans-na .pl2 .prow-na{display:none!important}
.pl2 .prow.masque{display:none}

/* Le bandeau accepte le dépôt d'un shift du planning */
.favbar .favdrop{font-size:11px;color:var(--muet);font-style:italic;margin-left:4px}
.favbar.favcible{border-color:var(--terra);background:var(--terra-pale);
  box-shadow:0 0 0 3px rgba(233,102,70,.12)}
.favbar.favcible .favdrop,.favbar.favcible .favvide{color:var(--terra-h);font-weight:600;font-style:normal}

/* ═══ Conformité : prévenance et journal (v5.4) ═══ */
.prevbar{display:flex;align-items:flex-start;gap:12px;padding:12px 15px;margin-bottom:11px;
  background:var(--jaune-pale);border:1px solid #EBDCB4;border-left:3px solid var(--jaune);
  border-radius:var(--r)}
.prevbar .ico{width:19px;height:19px;stroke:var(--jaune);fill:none;stroke-width:1.7;flex:none;margin-top:1px}
.prevbar .pv1{flex:1;min-width:0}
.prevbar .pv1 b{display:block;font-size:13px;font-weight:600;color:#7A5510}
.prevbar .pv1 span{display:block;font-size:12px;color:var(--encre-2);line-height:1.55;margin-top:2px}
.prevbar .btn{flex:none;background:#fff}
.jrn{display:flex;flex-direction:column}
.jl{display:grid;grid-template-columns:88px 118px 1fr 92px 62px;gap:10px;align-items:baseline;
  padding:9px 4px;border-bottom:1px solid var(--surface-2);font-size:12px}
.jl.pub{background:var(--vert-pale);border-radius:8px;padding-left:8px;padding-right:8px}
/* Décision de paie : liseré bleu, la couleur des faits constatés
   dans l'application. Elle se distingue d'une modification de
   planning sans crier plus fort qu'elle (v10.9). */
.jl.jpaie{background:var(--bleu-pale);border-radius:8px;padding-left:8px;padding-right:8px;
  box-shadow:inset 2px 0 0 var(--bleu)}
.jl.jpaie .a{color:var(--bleu-fonce)}
.jl .h{font-size:11px;color:var(--muet);font-variant-numeric:tabular-nums}
.jl .a{font-weight:600}
.jl .q{min-width:0;color:var(--encre-2)}
.jl .q b{font-weight:600;color:var(--encre);margin-right:5px}
.jl .q i{font-style:normal;color:var(--muet);margin-left:5px}
.jl .w{font-size:11px;color:var(--muet);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.jl .badge{font-size:10px;font-weight:700;border-radius:20px;padding:2px 8px;text-align:center;
  background:var(--surface-2);color:var(--muet);border:1px solid var(--ligne)}
.jl .badge.ok{background:var(--vert-pale);color:var(--vert);border-color:#CFE0BE}
.jl .badge.ko{background:var(--rouge-pale);color:var(--rouge);border-color:#F2D8DA}

/* ═══ Préparation d'impression (v5.5) ═══ */

/* ═══ Identité visuelle de l'établissement (v5.6) ═══ */
.idvis{display:grid;grid-template-columns:150px 1fr;gap:18px;align-items:start}
@media(max-width:760px){.idvis{grid-template-columns:1fr}}
.idlogo{border:1px solid var(--ligne);border-radius:11px;background:var(--surface-2);
  height:110px;display:flex;align-items:center;justify-content:center;padding:12px;overflow:hidden}
.idlogo img{max-width:100%;max-height:100%;object-fit:contain}
.idvide{display:flex;flex-direction:column;align-items:center;gap:6px;color:var(--ligne-2)}
.idvide svg{width:28px;height:28px}
.idvide span{font-size:11px;font-weight:600;color:var(--muet)}
.idpal{display:flex;gap:7px;align-items:center;flex-wrap:wrap}
.idpick{cursor:pointer;position:relative}
.idpick input{position:absolute;opacity:0}
.idpick i{display:block;width:26px;height:26px;border-radius:8px;border:2px solid transparent;
  box-shadow:inset 0 0 0 1px rgba(62,43,26,.12)}
.idpick input:checked+i{border-color:var(--encre);box-shadow:0 0 0 2px #fff inset}

/* Choix de la mise en page à l'impression */

/* Aperçu miniature de chaque mise en page */
.apercu{display:flex;flex-direction:column;gap:3px;height:38px;justify-content:center;
  padding:6px 8px;background:var(--surface-2);border-radius:7px}


/* ═══ Alertes de saisie, verrou, historique (v6.3) ═══ */
.valert{position:fixed;left:50%;top:50%;transform:translate(-50%,-50%);z-index:400;width:min(430px,94vw);
  background:#fff;border:1px solid var(--ligne);border-radius:14px;box-shadow:var(--ombre-2);overflow:hidden}
.valert[hidden]{display:none}
.valert .vah{display:flex;align-items:center;gap:10px;padding:13px 16px;background:var(--jaune-pale);
  border-bottom:1px solid #EBDCB4}
.valert .vic{font-size:17px}
.valert .vah b{font-family:var(--f-titre);font-size:14.5px;font-weight:600;color:#7A5510}
.valert .vab{padding:12px 16px;max-height:52vh;overflow-y:auto}
.valert .val{border-left:3px solid var(--jaune);padding:2px 0 2px 11px;margin-bottom:11px}
.valert .val:last-child{margin-bottom:0}
.valert .val.bloc{border-left-color:var(--rouge)}
.valert .val.info{border-left-color:var(--bleu)}
.valert .val b{display:block;font-size:13px;font-weight:600;line-height:1.3}
.valert .val span{display:block;font-size:12px;color:var(--encre-2);margin-top:2px;line-height:1.5}
.valert .val i{display:block;font-style:normal;font-size:10.5px;color:var(--muet);margin-top:3px;
  font-weight:600;letter-spacing:.02em}
.valert .vaf{display:flex;gap:8px;justify-content:flex-end;padding:11px 16px;
  border-top:1px solid var(--ligne);background:var(--surface-2)}
/* (Le doublon de « .btn.danger » vivait ici — en fond rouge plein. Il
   écrasait la définition en contour du haut du fichier, qui devenait
   inatteignable. Retiré en v12.6 ; le rouge plein s'appelle
   « .btn.dp » et il est réservé aux fenêtres de confirmation.) */
/* Bandeau de verrouillage */
.verrbar{display:flex;align-items:center;gap:12px;padding:12px 15px;margin-bottom:11px;
  background:var(--vert-pale);border:1px solid #CFE0BE;border-left:3px solid var(--vert);
  border-radius:var(--r)}
.verrbar .ico{width:19px;height:19px;stroke:var(--vert);fill:none;stroke-width:1.8;flex:none}
.verrbar .vb1{flex:1;min-width:0}
.verrbar .vb1 b{display:block;font-size:13px;font-weight:600;color:#3D5C2A}
.verrbar .vb1 span{display:block;font-size:12px;color:var(--encre-2);margin-top:1px}
/* Historique au survol */
.histpop{position:fixed;z-index:350;width:418px;background:#fff;border:1px solid var(--ligne);
  border-radius:13px;box-shadow:var(--ombre-2);overflow:hidden;pointer-events:none}
.histpop[hidden]{display:none}
.histpop .hpt{padding:10px 14px;border-bottom:1px solid var(--ligne);background:var(--surface-2)}
.histpop .hpt b{font-family:var(--f-titre);font-size:13.5px;font-weight:600}
.histpop .hpt span{font-size:11px;color:var(--muet);margin-left:7px}
.histpop .hpg{width:100%;border-collapse:collapse;font-size:11px}
.histpop .hpg th{padding:5px 4px;font-size:9.5px;font-weight:700;color:var(--muet);
  text-transform:uppercase;letter-spacing:.05em;border-bottom:1px solid var(--ligne)}
.histpop .hpg td{padding:5px 4px;text-align:center;border-bottom:1px solid var(--surface-2);
  font-weight:600;color:var(--encre-2)}
.histpop .hpg .sm{font-weight:700;color:var(--muet);font-size:10px;text-align:left;padding-left:12px}
.histpop .hpg .tt{font-weight:700;color:var(--encre);background:var(--surface-2)}
.histpop .hpg .we{background:#FCFAF5}
.histpop .hpg .off{color:var(--ligne-2)}
.histpop .hpf{display:flex;gap:14px;padding:9px 14px;background:var(--surface-2);
  border-top:1px solid var(--ligne);font-size:11px;color:var(--muet);flex-wrap:wrap}
.histpop .hpf b{color:var(--encre);font-weight:700}
.histpop .hpf .neg b{color:var(--rouge)}
.histpop .hpf .pos b{color:var(--vert)}

/* Bandeau de semaine de référence */
.refbar{display:flex;align-items:center;gap:12px;padding:11px 15px;margin-bottom:11px;
  background:var(--bleu-pale);border:1px solid #D5DDEC;border-left:3px solid var(--bleu);
  border-radius:var(--r)}
.refbar .ico{width:18px;height:18px;stroke:var(--bleu);fill:none;stroke-width:1.8;flex:none}
.refbar .rb1{flex:1;min-width:0}
.refbar .rb1 b{display:block;font-size:13px;font-weight:600;color:#3E5480}
.refbar .rb1 span{display:block;font-size:12px;color:var(--encre-2);margin-top:1px}
.refbar .btn{background:#fff}
.refbar .rbx{border:none;background:none;color:var(--muet);font-size:14px;padding:2px 5px;
  line-height:1;font-family:var(--f-ui)}
.refbar .rbx:hover{color:var(--encre)}

/* ═══ Renforts entre parcs (v6.7) ═══ */
.pemp .renf{display:inline-flex;align-items:center;gap:4px;margin-top:3px;font-size:9.5px;
  font-weight:700;text-transform:uppercase;letter-spacing:.05em;color:var(--bleu);
  background:var(--bleu-pale);border-radius:20px;padding:2px 8px}
.pemp .renf svg{width:10px;height:10px;stroke:currentColor;fill:none;stroke-width:2}
.pemp .renf.sort{color:var(--violet);background:var(--violet-pale)}
.prow:has(.renf:not(.sort)) .pemp{box-shadow:inset 3px 0 0 var(--bleu)}
/* Bandeau des demandes reçues */
.renfbar{display:flex;align-items:flex-start;gap:12px;padding:12px 15px;margin-bottom:11px;
  background:var(--bleu-pale);border:1px solid #D5DDEC;border-left:3px solid var(--bleu);
  border-radius:var(--r)}
.renfbar .ico{width:19px;height:19px;stroke:var(--bleu);fill:none;stroke-width:1.8;flex:none;margin-top:1px}
.renfbar .rf1{flex:1;min-width:0}
.renfbar .rf1 b{display:block;font-size:13px;font-weight:600;color:#3E5480;margin-bottom:6px}
.renfbar .rfl{display:flex;align-items:center;gap:10px;padding:6px 0;flex-wrap:wrap;
  border-top:1px solid rgba(90,110,165,.15)}
.renfbar .rfl span{flex:1;min-width:200px;font-size:12px;color:var(--encre-2)}
.renfbar .rfl form{display:flex;gap:6px}
.renfbar .btn{background:#fff}
/* Liste des renforts en cours */
.renfline{display:flex;align-items:center;gap:11px;padding:10px 12px;border:1px solid var(--ligne);
  border-radius:10px;margin-bottom:7px;background:#fff}
.renfline .rn{flex:1;min-width:0}
.renfline .rn b{display:block;font-size:13px;font-weight:600}
.renfline .rn i{display:block;font-style:normal;font-size:11px;color:var(--muet);margin-top:1px}
.renfline .rs{font-size:10.5px;font-weight:700;border-radius:20px;padding:3px 10px;flex:none}
.renfline .rs.ok{background:var(--vert-pale);color:var(--vert)}
.renfline .rs.att{background:var(--jaune-pale);color:var(--jaune)}
/* Ventilation des heures */
.vent{display:grid;gap:7px}
.ventl{display:flex;align-items:center;gap:11px;padding:9px 12px;border:1px solid var(--ligne);
  border-radius:10px;background:#fff}
.ventl .vn{flex:1;min-width:0;font-size:13px;font-weight:600}
.ventl .vn small{display:block;font-size:11px;font-weight:500;color:var(--muet)}
.ventl .vb{width:120px;height:7px;border-radius:4px;background:var(--surface-2);
  overflow:hidden;flex:none}
.ventl .vb i{display:block;height:100%;border-radius:4px;background:var(--terra)}
.ventl .vh{font-family:var(--f-titre);font-size:14px;font-weight:600;min-width:56px;
  text-align:right;flex:none}
.ventl .vp{font-size:11px;color:var(--muet);min-width:38px;text-align:right;flex:none}

/* ═══ Socle des contrôles de formulaire ═══════════════════════
   98 cases à cocher dans l'application, 6 portaient accent-color :
   toutes les autres affichaient la coche BLEUE du navigateur, hors
   charte. Une règle globale suffit — les composants qui masquent
   l'input natif (interrupteurs, pastilles) ne sont pas concernés. */
input[type="checkbox"],
input[type="radio"]{accent-color:var(--terra)}
/* La sélection de texte suit aussi la charte */
::selection{background:var(--terra-pale);color:var(--terra-h)}
/* ── Anneau de focus, au clavier seulement ──
   L'ancienne règle imposait « border-radius:4px » à TOUT élément
   focalisé : les champs arrondis se carraient au clic, et l'anneau
   orange décalé de 2 px donnait ce halo flou qui débordait des
   angles. Le rayon n'est plus touché — chaque élément garde le sien
   — et le contour épouse la forme (v8.9). */
:focus-visible{outline:2px solid var(--terra);outline-offset:1px}
/* Les champs ont déjà leur propre marque de focus : un contour en
   plus ferait double emploi. */
.fi:focus-visible,input:focus-visible,textarea:focus-visible,select:focus-visible{outline:none}

/* ═══ Sélecteur de semaine (v7.0) ═══ */
.wkdbtn{border:none;background:none;font-family:inherit;font-size:inherit;font-weight:inherit;
  color:inherit;padding:0;cursor:pointer;display:inline-flex;align-items:center;gap:7px}
.wkdbtn:hover{color:var(--terra-h)}
.datepop{position:fixed;inset:0;z-index:340;display:flex;align-items:center;justify-content:center}
.datepop[hidden]{display:none}
.datepop .dpv{position:absolute;inset:0;background:rgba(43,32,24,.42)}
.datepop .dpbox{position:relative;width:min(390px,94vw);background:#fff;border-radius:15px;
  box-shadow:var(--ombre-2);overflow:hidden}
.dph{display:flex;align-items:center;gap:10px;padding:12px 14px;border-bottom:1px solid var(--ligne)}
.dph b{flex:1;text-align:center;font-family:var(--f-titre);font-size:15px;font-weight:600;
  text-transform:capitalize}
.dph button{width:34px;height:34px;border:1px solid var(--ligne);border-radius:10px;background:#fff;
  font-size:17px;line-height:1;color:var(--encre-2);font-family:var(--f-ui)}
.dph button:hover{border-color:var(--terra);color:var(--terra-h)}
.dpg{display:grid;grid-template-columns:44px repeat(7,1fr);gap:2px;padding:10px}
.dpj{text-align:center;font-size:10px;font-weight:700;color:var(--muet);padding:4px 0;
  text-transform:uppercase}
.dpsem{display:flex;align-items:center;justify-content:center;font-size:10.5px;font-weight:700;
  color:var(--muet);border:none;background:none;border-radius:8px;font-family:var(--f-ui)}
.dpsem.lien{cursor:pointer}
.dpsem.lien:hover{background:var(--terra-pale);color:var(--terra-h)}
.dpsem.on{background:var(--terra);color:#fff}
.dpd{border:none;background:none;border-radius:8px;padding:8px 0;font-size:13px;font-weight:500;
  color:var(--encre);font-family:var(--f-ui);cursor:pointer;font-variant-numeric:tabular-nums}
.dpd:hover{background:var(--surface-2)}
.dpd.hors{color:var(--ligne-2)}
.dpd.auj{font-weight:700;color:var(--terra-h)}
.dpd.sem{background:var(--terra-pale)}
.dpd.sem:hover{background:#F9DFD6}
.dpf{display:flex;align-items:center;gap:10px;padding:11px 14px;border-top:1px solid var(--ligne);
  background:var(--surface-2);flex-wrap:wrap}
.dpsaisie{display:flex;align-items:center;gap:7px;margin-left:auto;font-size:11.5px;
  color:var(--muet)}
.dpsaisie input{border:1px solid var(--ligne-2);border-radius:8px;padding:5px 8px;
  font-size:12px;font-family:var(--f-ui)}
/* Dépôt interdit sur une absence ou hors contrat */
.pcell.dinterdit{background:var(--rouge-pale)!important;
  box-shadow:inset 0 0 0 1.5px var(--rouge);cursor:not-allowed}
.pcell.dinterdit::after{content:'⃠';position:absolute;top:50%;left:50%;
  transform:translate(-50%,-50%);font-size:20px;color:var(--rouge);opacity:.55;
  pointer-events:none;z-index:5}

/* L'affichage des alertes se coupe depuis le menu Affichage :
   utile pour relire un planning sans le bruit des badges.

   Le BANDEAU de prévenance, lui, n'est plus concerné (v10.4) : une
   pastille de plus sur un shift est du bruit qu'on peut vouloir
   couper le temps d'une relecture, mais une semaine publiée trop
   tard est un fait juridique, et il tient en une ligne en haut de
   l'écran. Le masquer parce qu'on a coché une case il y a six mois,
   c'est exactement ce qu'on ne pourra pas expliquer devant un
   inspecteur. */
body.sans-alertes .wemp,
body.sans-alertes .wshift{display:none!important}

/* ── On ne coupe pas une alerte légale en silence ──
   Le réglage vit dans le navigateur : décoché une fois, il le reste
   des mois, sur ce poste-là seulement, sans que rien à l'écran ne le
   rappelle. Un bandeau discret le dit, et propose de les rétablir. */
.alertesoff{display:none}
body.sans-alertes .alertesoff{display:flex;align-items:center;gap:10px;
  background:var(--jaune-pale);border:1px solid #EFD3A6;color:#8A5A17;
  border-radius:11px;padding:9px 13px;font-size:12.5px;margin:0 0 12px}
.alertesoff b{font-weight:700}
.alertesoff button{margin-left:auto}

/* ═══ Ligne Événements (v7.2) ═══
   Une bande basse entre les jours et les non-assignés. Les
   vacances forment une rangée continue, fériés et anniversaires
   s'alignent dessous — sans quoi une cellule chargée décalait
   toutes les autres. */
.pl2 .evrow{border-top:1px solid var(--ligne);background:#FCFAF5}
.pl2 .evrow .evlab{display:flex;align-items:center;gap:7px;padding:5px 12px;
  font-size:10px;font-weight:700;letter-spacing:.06em;text-transform:uppercase;
  color:var(--muet);background:var(--surface-2)}
.pl2 .evrow .evlab .ico{width:12px;height:12px;stroke:currentColor;fill:none;stroke-width:1.9}
.evcell{padding:0;display:grid;grid-template-rows:auto auto;align-content:start;
  border-left:1px solid var(--surface-2);min-height:24px}
.evcell.we{background:#FBF8F1}
.evcell.today{background:var(--auj)}
/* Rangée 1 : la bande de vacances, toujours à la même hauteur */
.evcell .ev.vac{grid-row:1}
/* Rangée 2 : fériés et anniversaires, côte à côte */
.evcell .ev.ferie,.evcell .ev.anniv{grid-row:2;margin:2px 4px}
.evcell:not(:has(.ev.vac)) .ev.ferie,
.evcell:not(:has(.ev.anniv)) .ev.vac{grid-row:1}
.ev{display:inline-flex;align-items:center;gap:4px;font-size:9.5px;font-weight:600;
  line-height:1.25;border-radius:4px;padding:2px 6px;white-space:nowrap;overflow:hidden;
  text-overflow:ellipsis;min-width:0}
.ev .ico{width:10px;height:10px;flex:none;stroke:currentColor;fill:none;stroke-width:1.9}
.ev.ferie{background:var(--rouge-pale);color:var(--rouge);justify-self:start}
.ev.anniv{background:var(--violet-pale);color:var(--violet);justify-self:start}
.ev.anniv i{font-style:normal;opacity:.7}
/* Vacances : une bande pleine, teintée selon sa composition.
   Un changement de libellé ou de zones fait changer la couleur —
   la coupure se voit sans avoir à lire. */
.ev.vac{border-radius:0;padding:2px 7px;min-height:17px;font-size:9px;
  justify-content:flex-start;display:flex;width:100%;font-weight:600;
  border-top:1px solid rgba(62,43,26,.07);border-bottom:1px solid rgba(62,43,26,.07)}
.ev.vac.deb{border-radius:4px 0 0 4px}
.ev.vac.fin{border-radius:0 4px 4px 0}
.ev.vac.deb.fin{border-radius:4px}
.ev.vac .vl{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
/* Huit teintes claires, assez distinctes pour marquer un changement
   sans jamais gêner la lecture des shifts en dessous. */
.ev.vac.t0{background:#E7F0DE;color:#3D5C2A}
.ev.vac.t1{background:#E4EAF6;color:#3E5480}
.ev.vac.t2{background:#FAEDD6;color:#7A5510}
.ev.vac.t3{background:#F3E7F2;color:#6B4768}
.ev.vac.t4{background:#DDEEEE;color:#245D5D}
.ev.vac.t5{background:#FBE7E4;color:#A2452F}
.ev.vac.t6{background:#EFE9DC;color:#5C4A2E}
.ev.vac.t7{background:#E2EDF4;color:#2F5872}

/* Masquables depuis le menu Affichage */
body.sans-anniv .ev.anniv,
body.sans-feries .ev.ferie,
body.sans-vacances .ev.vac{display:none}
body.sans-anniv.sans-feries.sans-vacances .evrow{display:none}

/* ── LA FAMILLE, ET L'AIDE À LA DEMANDE ──                  (v14.7.1)
   Les titres de section du kit employaient `.kith h2 + p` — trois
   classes qui n'ont JAMAIS été définies nulle part. Les titres
   tombaient sur le style par défaut du navigateur : mauvaise fonte,
   mauvaise taille, mauvaise couleur, interlignes au hasard. Un design
   system dont les propres titres ne sont pas dans le design system.
   Ils emploient maintenant l'en-tête de carte, qui, lui, est
   documenté et employé par toute l'application. */
.kitfam{margin-top:26px}
.kitfam .ch h3{font-size:15px}
.kitfamh{border-bottom:1px solid var(--ligne);margin-bottom:2px}

/* Le « ? » : la règle d'un composant se lit quand on la demande.
   Elle faisait quinze lignes grises sous chaque démonstration —
   c'est ce qui rendait la page illisible et interminable. Le survol
   la montre, le clic la garde ouverte. */
.kitq{margin-left:6px;width:17px;height:17px;border-radius:50%;
  border:1px solid var(--ligne-2);background:#fff;color:var(--muet);
  font:700 10.5px/1 var(--f-ui);cursor:pointer;vertical-align:middle;padding:0}
.kitq:hover,.kitq[aria-expanded="true"]{border-color:var(--terra);color:var(--terra);
  background:var(--terra-pale)}
/* Le repli compte : la classe `kitaide` est posée par le script. Sans
   script, aucun « ? » n'apparaît — et l'aide reste donc VISIBLE, au
   lieu d'être cachée derrière un bouton qui n'existe pas. */
.kitaide .kitrow .kithelp{display:none}
.kitaide .kitrow.aide .kithelp{display:block}

/* ── LE SOMMAIRE DU KIT ──                                  (v14.7)
   Cent soixante-sept composants sur une page. Sans sommaire, vérifier
   qu'un composant existe demande de tout parcourir à la molette — et
   l'on finit par en réécrire un qui existait déjà. Il colle en haut :
   on cherche justement quand on est au milieu. */
.kitnav{position:sticky;top:0;z-index:20;margin-bottom:16px}
.kitnavl{display:flex;flex-wrap:wrap;gap:5px;padding:10px 14px}
.kitnavl a{padding:5px 11px;border-radius:20px;border:1px solid var(--ligne-2);
  background:#fff;font-size:12px;font-weight:600;color:var(--encre-2);text-decoration:none}
.kitnavl a:hover{border-color:var(--terra);color:var(--terra);background:var(--terra-pale)}

/* ═══ LE CHARGEMENT ═══                                    (v14.6.3)

   Un écran qui va chercher quelque chose sur le réseau doit le
   DIRE. Sans cela on presse deux fois, on croit que c'est cassé, ou
   l'on quitte la page pendant l'appel.

   Deux formes, une seule idée :
     · `.charge`  — une ligne : un rond qui tourne et ce qu'on
                    attend, en clair (« Régions d'Allemagne… »).
     · `.chargel` — des barres grises à la place du contenu à venir,
                    de la taille de ce qui arrive. La page ne saute
                    pas quand le contenu se pose.

   Ni l'un ni l'autre ne remplace un bouton : ils remplacent le VIDE
   entre le geste et sa réponse. */
.charge{display:flex;align-items:center;gap:10px;padding:12px 2px;
  font-size:12.5px;color:var(--muet)}
.chargeb{flex:none;width:16px;height:16px;border-radius:50%;
  border:2px solid var(--ligne);border-top-color:var(--terra);
  animation:chargetourne .8s linear infinite}
@keyframes chargetourne{to{transform:rotate(360deg)}}
.chargel{display:flex;flex-wrap:wrap;gap:7px;padding:2px 0}
.chargel i{display:block;height:30px;border-radius:20px;background:var(--surface-2);
  border:1px solid var(--ligne);animation:chargepulse 1.2s ease-in-out infinite}
.chargel i:nth-child(3n+1){width:104px}
.chargel i:nth-child(3n+2){width:148px;animation-delay:.15s}
.chargel i:nth-child(3n+3){width:82px;animation-delay:.3s}
@keyframes chargepulse{0%,100%{opacity:1}50%{opacity:.45}}
/* Un mouvement permanent fatigue : on le ralentit, on ne le retire
   pas — sinon plus rien ne dit que ça travaille. */
/* Un mouvement permanent fatigue : on le ralentit, on ne le retire
   pas — sinon plus rien ne dit que ça travaille. Le filet et les
   barres, eux, s'immobilisent : ils occupent déjà la place. */
@media (prefers-reduced-motion:reduce){
  .chargeb,.btn.occupe::after,.chip.occupe span::before,.chargevoile::after{animation-duration:2.4s}
  .chargel i{animation:none;opacity:.7}
  .chargefilet::after{animation:none;background-position:0 0;background-size:100% 100%;opacity:.5}
}
.charge.ko{color:var(--rouge)}
.charge.ko .chargeb{animation:none;border-color:var(--rouge-pale);border-top-color:var(--rouge)}

/* ── LE FILET ──                                            (v14.6.4)
   Un rafraîchissement d'ENSEMBLE : plusieurs endroits de la carte
   vont changer, aucun en particulier. Un rond posé quelque part
   désignerait un coupable arbitraire ; le filet court en haut de la
   carte et laisse tout le contenu lisible et cliquable.
   `.card` porte `overflow:hidden` : le filet se colle à `top:0`, pas
   au-dessus, sinon il est rogné et l'on ne voit rien. */
.chargefilet{position:relative}
.chargefilet::after{content:'';position:absolute;left:0;right:0;top:0;height:3px;z-index:4;
  background:linear-gradient(90deg,transparent,var(--terra),transparent);
  background-size:44% 100%;background-repeat:no-repeat;
  animation:chargeglisse 1.15s ease-in-out infinite;pointer-events:none}
@keyframes chargeglisse{0%{background-position:-45% 0}100%{background-position:145% 0}}

/* ── LE GESTE ATTEND LÀ OÙ IL A ÉTÉ FAIT ──                 (v14.6.4)
   Un bouton qui part chercher quelque chose ne se remplace pas par
   un rond ailleurs : il devient son propre chargement, SANS changer
   de largeur — sinon la rangée se réorganise sous le doigt et le
   bouton d'à côté vient se placer là où l'on allait cliquer.
   Le texte reste dans le flux (`color:transparent`) : c'est lui qui
   tient la largeur. `pointer-events:none` fait le reste — on ne
   clique pas deux fois. */
.btn.occupe{color:transparent;position:relative;pointer-events:none}
.btn.occupe::after{content:'';position:absolute;inset:0;margin:auto;width:14px;height:14px;
  border-radius:50%;border:2px solid rgba(255,255,255,.45);border-top-color:#fff;
  animation:chargetourne .7s linear infinite}
.btn:not(.p):not(.dp):not(.danger).occupe::after{border-color:var(--ligne);border-top-color:var(--terra)}

/* La pastille qu'on vient de cocher : le signe devient un rond le
   temps de l'aller-retour, à l'endroit exact du clic. Le masque est
   levé, sans quoi il découperait le rond (v14.72). */
.chip.occupe{pointer-events:none}
.chip.occupe span{opacity:.6}
.chip.occupe span::before{content:'';width:11px;height:11px;border-radius:50%;
  background:none;-webkit-mask:none;mask:none;opacity:1;
  border:2px solid var(--ligne-2);border-top-color:var(--terra);
  animation:chargetourne .7s linear infinite}

/* ── LE VOILE ──                                            (v14.6.4)
   Le seul cas où l'on fige : le bloc entier va être REMPLACÉ, et ce
   qu'on y lit est déjà faux. Partout ailleurs il est trop brutal —
   il éteint une zone pour un geste qui n'en concerne qu'une partie.
   Le parent doit porter `position:relative`. */
.chargevoile{position:relative}
.chargevoile::before{content:'';position:absolute;inset:0;z-index:2;border-radius:inherit;
  background:rgba(251,249,244,.72)}
.chargevoile::after{content:'';position:absolute;left:50%;top:50%;width:20px;height:20px;
  margin:-10px 0 0 -10px;border-radius:50%;border:2px solid var(--ligne);
  border-top-color:var(--terra);animation:chargetourne .8s linear infinite;z-index:3}

/* Choix des zones suivies */
.zonepick{display:flex;gap:7px;flex-wrap:wrap;align-items:center}

/* État du calendrier scolaire */
.vacetat{display:flex;align-items:center;gap:12px;flex-wrap:wrap;margin-top:14px;
  padding:10px 13px;border:1px solid var(--ligne);border-radius:10px;background:var(--surface-2)}
.vacetat span{flex:1;min-width:200px;font-size:12px;line-height:1.5}
.vacetat .ok{color:var(--vert);font-weight:600}
.vacetat .att{color:var(--encre-2)}

/* ── Les vacances d'ailleurs ──                             (v14.6)
   Un volet par pays : replié tant qu'aucune région n'est suivie,
   sinon vingt-six cantons suisses noieraient les quatre zones
   françaises. */
.vacp{border:1px solid var(--ligne);border-radius:10px;margin-top:8px;background:#fff}
.vacp[open]{background:var(--surface-2)}
.vacpt{display:flex;align-items:center;gap:10px;padding:9px 13px;cursor:pointer;
  font-size:13px;list-style:none}
.vacpt::-webkit-details-marker{display:none}
.vacpt::before{content:'';width:6px;height:6px;border-right:1.5px solid var(--muet);
  border-bottom:1.5px solid var(--muet);transform:rotate(-45deg);transition:transform .15s}
.vacp[open] .vacpt::before{transform:rotate(45deg)}
.vacpt span{margin-left:auto;color:var(--muet);font-size:12px;font-weight:500}
.vacz{padding:0 13px 13px}
.vacz .chip span{font-weight:500}

/* Les périodes saisies à la main : l'Angleterre, et les oublis. */
/* L'état d'une région : ce qu'elle porte, et quand elle sert. */
.vacpr{flex-direction:column;align-items:stretch;gap:6px}
.vacpr span{min-width:0}
.vacpr b{color:var(--encre);margin-right:4px}
.vacpr a{color:inherit;text-decoration:underline;text-underline-offset:2px}

/* Le choix d'un pays : une liste déroulante, pas six volets. */
.vacsel{display:flex;align-items:center;gap:10px;flex-wrap:wrap;margin-top:6px}
.vacsel select{max-width:260px}
.vacpan{border:1px solid var(--ligne);border-radius:10px;margin-top:8px;
  background:var(--surface-2);padding:10px 13px}
.vacpan h4{margin:0 0 8px;font-size:13px;display:flex;align-items:center;gap:8px}
.vacpan h4 b{font-weight:600}
.vacpan h4 button{margin-left:auto;background:none;border:0;color:var(--muet);
  font-size:12px;cursor:pointer;padding:2px 4px}
.vacpan h4 button:hover{color:var(--rouge);text-decoration:underline}
/* L'état d'une région tient DANS sa pastille : « Bavière · 12
   périodes ». Une colonne d'états à côté obligeait à faire le
   rapprochement de l'œil. */
.vacz2{display:flex;flex-wrap:wrap;gap:7px}
.vacz2 i{font-style:normal;opacity:.75;font-weight:500}

.vacml{margin-top:18px}
.vacmr{display:flex;align-items:center;gap:10px;flex-wrap:wrap;padding:8px 0;
  border-top:1px solid var(--ligne);font-size:12.5px}
.vacmr b{font-weight:600}
.vacmr span{color:var(--muet)}
.vacmr form{margin-left:auto}
.vacmr .fi{width:auto;min-width:120px}

/* Badge d'alerte du salarié, ancré dans le coin de sa cellule */
.pemp{position:relative}
.wemp.wcoin{position:absolute;top:4px;right:4px;z-index:4;padding:1px 5px;
  border-radius:20px;line-height:1.35;font-size:9.5px;gap:3px}
.wemp.wcoin svg{width:10px;height:10px}
/* Sur les lignes serrées, le badge ne doit pas chevaucher le total */
body.dens-dense .wemp.wcoin{top:2px;right:2px;font-size:9px;padding:0 4px}

/* Icône d'avertissement, en masque pour suivre la couleur du texte.
   Sur une seule ligne : une URL coupée par un antislash n'est pas
   interprétée de la même façon par tous les navigateurs. */
:root{--ico-warn:url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'><path d='M10.3 3.9 1.8 18a2 2 0 0 0 1.7 3h16.9a2 2 0 0 0 1.7-3L13.7 3.9a2 2 0 0 0-3.4 0z'/><path d='M12 9v4M12 17h.01'/></svg>")}

/* Colonnes horaires : rafales et orientation (v7.4) */
.mmh .rf{font-size:9.5px;color:var(--muet);font-weight:600;margin-top:1px}
.mmh .rf.fort{color:var(--rouge)}
.mmh .dd{display:flex;align-items:center;justify-content:center;gap:3px;font-size:9.5px;
  color:var(--muet);font-weight:600;margin-top:1px}
.mmh .dd .fl{display:inline-block;line-height:1;font-size:11px;color:var(--bleu)}
/* Pied de la modale météo */
.mmfoot{display:flex;flex-direction:column;gap:4px;padding:12px 18px;
  border-top:1px solid var(--ligne);background:var(--surface-2);font-size:11.5px;
  color:var(--muet);line-height:1.5}
.mmfoot a{color:var(--bleu);font-weight:600}
.mmfoot .pr{font-style:italic}

/* ═══ Menu Outils réorganisé (v7.5) ═══ */
.ddgrid{display:grid;grid-template-columns:repeat(3,1fr);gap:6px;margin-bottom:14px}
.ddtile{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:6px;
  padding:12px 6px;border:1px solid var(--ligne);border-radius:11px;background:#fff;
  font-size:11px;font-weight:600;color:var(--encre);text-align:center;line-height:1.2;
  font-family:var(--f-ui);cursor:pointer;text-decoration:none}
.ddtile:hover{border-color:var(--terra);background:var(--terra-pale);color:var(--terra-h)}
.ddtile svg{width:19px;height:19px;stroke:currentColor;fill:none;stroke-width:1.7}
/* Sections repliées : ce qu'on ouvre rarement ne doit pas allonger le menu */
.ddplus{border-top:1px solid var(--ligne);margin-top:4px}
.ddplus > summary{display:flex;align-items:center;gap:8px;padding:10px 2px;cursor:pointer;
  font-size:12px;font-weight:600;color:var(--encre-2);list-style:none;
  background:none;border:none;border-radius:0}
.ddplus[open] > summary{background:none;color:var(--encre)}
.ddplus summary::-webkit-details-marker{display:none}
.ddplus summary::after{content:'›';margin-left:auto;font-size:15px;color:var(--muet);
  transform:rotate(90deg);transition:transform .15s}
.ddplus[open] summary::after{transform:rotate(-90deg)}
.ddplus summary:hover{color:var(--terra-h)}
.ddplus summary .ic{width:14px;height:14px;stroke:currentColor;fill:none;stroke-width:1.8}
.ddplusin{padding:2px 0 10px}
/* Icône de copie sur l'en-tête du jour, révélée au survol */
.dcopie{position:absolute;top:6px;right:6px;width:24px;height:24px;border-radius:7px;
  border:1px solid var(--ligne);background:#fff;color:var(--muet);cursor:pointer;
  display:flex;align-items:center;justify-content:center;opacity:0;transition:opacity .12s;
  font-family:var(--f-ui);z-index:3}
.dcopie svg{width:12px;height:12px;stroke:currentColor;fill:none;stroke-width:1.9}
.pgh .dd{position:relative}
.pgh .dd:hover .dcopie,.dcopie:focus-visible{opacity:1}
.dcopie:hover{border-color:var(--terra);color:var(--terra-h);background:var(--terra-pale)}
/* Choix des jours de destination */
.cjjours{display:grid;grid-template-columns:repeat(7,1fr);gap:5px}
.cjj{display:flex;flex-direction:column;align-items:center;gap:2px;padding:8px 2px;
  border:1px solid var(--ligne);border-radius:9px;cursor:pointer;background:#fff}
.cjj input{position:absolute;opacity:0;pointer-events:none}
.cjj .j{font-size:9.5px;font-weight:700;text-transform:uppercase;color:var(--muet)}
.cjj .n{font-family:var(--f-titre);font-size:16px;font-weight:600;line-height:1}
.cjj:has(input:checked){border-color:var(--terra);background:var(--terra-pale)}
.cjj:has(input:checked) .n,.cjj:has(input:checked) .j{color:var(--terra-h)}
.cjj.off{opacity:.35;cursor:not-allowed;background:var(--surface-2)}
.radline{display:flex;align-items:flex-start;gap:10px;padding:9px 11px;border-radius:9px;
  cursor:pointer;font-size:12.5px}
.radline:hover{background:var(--surface-2)}
.radline input{margin-top:2px;accent-color:var(--terra);width:15px;height:15px;flex:none}
.radline b{display:block;font-weight:600}
.radline i{display:block;font-style:normal;font-size:11.5px;color:var(--muet);margin-top:1px}

/* Section dangereuse du menu Outils */
.ddplus.danger > summary{color:var(--rouge)}
.ddplus.danger > summary .ic{stroke:var(--rouge)}
.ddplus.danger[open] > summary{color:var(--rouge)}

/* ═══ Durée au survol d'un shift (v7.8) ═══
   Les horaires cèdent la place à la durée : même emplacement, une
   information de plus, aucun encombrement supplémentaire. */
.sh .hh,.favbar .favtag .hh{position:relative;display:block}
/* Les heures PRÉVUES se révèlent au survol, à la place des heures
   affichées : deux lignes de chiffres l'une sous l'autre feraient
   douter de celle qui compte. La piste emprunte la même mécanique
   depuis qu'elle porte le bloc soudé (v13.11) — sans cette règle,
   elle affichait les deux à la fois. */
.sh .hh .hd,.favbar .favtag .hh .hd,.jsh .hh .hd{display:none}
.sh:hover .hh .hv,.favbar .favtag:hover .hh .hv,.jsh:hover .hh .hv{display:none}
.sh:hover .hh .hd,.favbar .favtag:hover .hh .hd,.jsh:hover .hh .hd{display:inline}

/* ═══ Panneau de détail d'une absence ═══
   Reprend la mécanique du panneau d'alertes : bandeau de titre
   coloré, lignes libellé / valeur, motif cité. */
#apanel{position:fixed;z-index:70;width:min(330px,90vw);background:var(--carte);
  border:1px solid var(--ligne);border-radius:14px;box-shadow:var(--ombre-2);
  display:none;overflow:hidden}
#apanel.on{display:block}
.apt{display:flex;align-items:center;gap:8px;font-family:var(--f-titre);font-weight:600;
  font-size:13.5px;color:#fff;background:var(--encre-2);padding:11px 16px}
.apt i{font-style:normal;font-size:9.5px;font-weight:700;text-transform:uppercase;
  letter-spacing:.08em;background:rgba(255,255,255,.22);border-radius:20px;padding:2px 8px}
.apt.att{background:var(--jaune)}
/* L'icône du type dans le bandeau du panneau de survol : même
   pictogramme que sur le ruban, pour confirmer qu'on survole bien
   l'absence qu'on visait (v11.14). */
.apt .apti{display:flex;align-items:center;flex:none}
.apt .apti .ico{width:15px;height:15px;vertical-align:0}
.apl{padding:4px 0}
.apr{display:flex;gap:12px;padding:7px 16px;font-size:12px;align-items:baseline}
.apr b{flex:none;width:70px;font-weight:600;color:var(--muet);font-size:11px}
.apr span{flex:1;color:var(--encre);font-weight:500}
.apm{margin:6px 16px 4px;padding:9px 11px;background:var(--surface-2);border-radius:9px;
  font-size:12px;font-style:italic;color:var(--encre-2);line-height:1.5}
.apf{padding:9px 16px;border-top:1px solid var(--surface-2);font-size:11px;color:var(--muet)}
/* ── LA MÉTÉO DANS LE MÊME PANNEAU ──                        (v12.4)
   Le survol d'une heure emprunte les blocs de la FENÊTRE météo
   (.mmstats / .mmstat) : grande valeur, unité, mot en clair, rose des
   vents. La même donnée doit se lire de la même façon partout, et
   redessiner ici une variante en aurait fait une seconde à corriger.

   Trois retouches seulement, parce que le panneau est étroit là où la
   fenêtre est large : deux colonnes au lieu de quatre, un peu moins
   d'air, et le trait du bas retiré — il n'y a rien après lui. */
#apanel .mmstats{grid-template-columns:1fr 1fr;border-bottom:none}
#apanel .mmstat{padding:10px 14px;border-bottom:1px solid var(--surface-2)}
#apanel .mmstat:nth-child(2n){border-right:none}
/* L'orientation est seule sur sa rangée : un trait à sa droite
   séparerait d'une colonne vide, et un trait sous elle fermerait le
   panneau une deuxième fois. */
#apanel .mmstat:last-child{border-right:none;border-bottom:none}
#apanel .mmstat .v{font-size:17px;min-height:30px;align-items:center}
/* Le ciel n'a ni chiffre ni unité : son icône occupe la place de la
   valeur, et le libellé descend au commentaire. */
#apanel .mmstat .v .msvg{width:30px;height:30px}

/* ═══ Séparateurs d'équipe (v7.10) ═══
   Une bande fine entre deux équipes : on voit d'un coup d'œil qui
   travaille avec qui, sans avoir à lire chaque ligne. */
.eqsep{display:grid;grid-template-columns:var(--pl2c0,236px) 1fr;background:var(--surface-2);
  position:relative;
  border-top:1px solid var(--ligne-2);border-bottom:1px solid var(--ligne)}
.eqsep .eql{display:flex;align-items:center;gap:8px;padding:6px 14px}
.eqsep .ep{width:3px;height:13px;border-radius:2px;background:var(--terra);flex:none}
.eqsep b{font-size:11px;font-weight:700;text-transform:uppercase;letter-spacing:.09em;
  color:var(--encre)}
.eqsep .en{font-size:10.5px;color:var(--muet);font-weight:500}
.eqsep .eqt{display:flex;align-items:center;justify-content:flex-end;padding:6px 14px;
  font-family:var(--f-titre);font-size:12px;font-weight:600;color:var(--encre-2)}
/* Sans équipe : c'est un cas à régulariser, pas une équipe */
.eqsep.sans .ep{background:var(--ligne-2)}
.eqsep.sans b{color:var(--muet)}
/* Densité dense : la bande se resserre */
body.dens-dense .eqsep .eql,body.dens-dense .eqsep .eqt{padding:3px 12px}
body.dens-dense .eqsep b{font-size:10px}
/* Masquable depuis le menu Affichage */
body.sans-equipes .eqsep{display:none}

/* Séparateur d'équipe en vue Jour : une ligne pleine largeur dans
   la grille de quarts d'heure. */
.jeqsep{display:flex;align-items:center;gap:8px;padding:5px 14px;
  background:var(--surface-2);border-top:1px solid var(--ligne-2);
  border-bottom:1px solid var(--ligne);position:sticky;left:0}
.jeqsep .ep{width:3px;height:12px;border-radius:2px;background:var(--terra);flex:none}
.jeqsep b{font-size:10.5px;font-weight:700;text-transform:uppercase;letter-spacing:.09em;
  color:var(--encre)}
.jeqsep .en{font-size:10px;color:var(--muet);font-weight:500}
.jeqsep.sans .ep{background:var(--ligne-2)}
.jeqsep.sans b{color:var(--muet)}
/* L'effectif par équipe accompagne le séparateur : masquer l'un
   sans l'autre laisserait une ligne de chiffres orpheline. */
body.sans-equipes .jeqsep,body.sans-equipes .jeqe{display:none}
/* Séparateur d'équipe en frise */
.freqsep{display:flex;align-items:center;gap:8px;padding:5px 14px;margin:6px 0 2px;
  background:var(--surface-2);border-radius:7px;border:1px solid var(--ligne)}
.freqsep .ep{width:3px;height:12px;border-radius:2px;background:var(--terra);flex:none}
.freqsep b{font-size:10.5px;font-weight:700;text-transform:uppercase;letter-spacing:.09em}
.freqsep .en{font-size:10px;color:var(--muet);margin-left:auto}
.freqsep.sans .ep{background:var(--ligne-2)}
.freqsep.sans b{color:var(--muet)}
body.sans-equipes .freqsep{display:none}

/* Copie de journée : révélée au survol dans la frise aussi */
.frday .frl{position:relative}
.frday:hover .dcopie{opacity:1}

/* ═══ Barre supérieure enrichie (v7.12) ═══ */
.top{display:flex;align-items:center;gap:8px;position:relative}
.tsp{flex:1}
.tsep{width:1px;height:22px;background:var(--ligne);flex:none}
.tbtn{display:flex;align-items:center;gap:7px;height:34px;padding:0 11px;border-radius:10px;
  border:1px solid transparent;background:none;color:var(--encre-2);font-size:12.5px;
  font-weight:600;font-family:var(--f-ui);position:relative;flex:none}
.tbtn:hover{background:var(--surface-2);color:var(--encre)}
.tbtn svg{width:17px;height:17px;stroke:currentColor;fill:none;stroke-width:1.8}
.tbtn.tico{width:34px;padding:0;justify-content:center}
.tsearch{border-color:var(--ligne);background:var(--surface-2);color:var(--muet);
  min-width:190px;font-weight:500}
.tsearch:hover{border-color:var(--ligne-2)}
.tsearch kbd{margin-left:auto;font-family:var(--f-ui);font-size:10px;font-weight:600;
  background:#fff;border:1px solid var(--ligne);border-radius:4px;padding:1px 5px;color:var(--muet)}
.tpast{position:absolute;top:2px;right:2px;min-width:16px;height:16px;border-radius:20px;
  background:var(--rouge);color:#fff;font-size:9.5px;font-weight:700;display:flex;
  align-items:center;justify-content:center;padding:0 4px;border:2px solid var(--carte)}
.tpast.j{background:var(--jaune)}
/* Compte */
.tcompte{display:flex;align-items:center;gap:9px;height:38px;padding:0 7px 0 5px;
  border-radius:11px;border:1px solid transparent;background:none;font-family:var(--f-ui);flex:none}
.tcompte:hover{background:var(--surface-2)}
.tav{width:28px;height:28px;border-radius:50%;color:#fff;font-size:11px;font-weight:700;
  display:flex;align-items:center;justify-content:center;flex:none}
.tid{text-align:left;line-height:1.15}
.tid b{display:block;font-size:12.5px;font-weight:600;color:var(--encre)}
.tid span{display:block;font-size:10.5px;color:var(--muet)}
.tchev{width:13px;height:13px;stroke:var(--muet);fill:none;stroke-width:2}
@media(max-width:820px){.tid,.tsearch span,.tsearch kbd{display:none}
  .tsearch{min-width:0;width:34px;padding:0;justify-content:center}}
/* Panneaux */
.tpan{position:absolute;top:calc(100% + 6px);right:14px;width:min(348px,94vw);
  background:var(--carte);border:1px solid var(--ligne);border-radius:14px;
  box-shadow:var(--ombre-2);z-index:200;overflow:hidden;display:none}
.tpan.on{display:block}
.tpanh{display:flex;align-items:center;gap:9px;padding:12px 15px;border-bottom:1px solid var(--ligne)}
.tpanh .ic{width:16px;height:16px;stroke:var(--encre-2);fill:none;stroke-width:1.9}
.tpanh b{font-family:var(--f-titre);font-size:14px;font-weight:600}
.tlk{font-size:11.5px;color:var(--terra-h);font-weight:600;background:none;border:none;
  font-family:var(--f-ui);padding:0}
.tlk:hover{text-decoration:underline}
.tpanl{max-height:340px;overflow-y:auto}
.tpani{display:flex;gap:11px;padding:11px 15px;border-bottom:1px solid var(--surface-2);
  text-decoration:none;color:var(--encre);position:relative}
.tpani:hover{background:var(--surface-2)}
.tpani.neuf::before{content:'';position:absolute;left:6px;top:50%;transform:translateY(-50%);
  width:5px;height:5px;border-radius:50%;background:var(--terra)}
.tpic{width:30px;height:30px;border-radius:9px;display:flex;align-items:center;
  justify-content:center;flex:none}
.tpic svg{width:15px;height:15px;fill:none;stroke-width:1.9}
.tpic.att{background:var(--jaune-pale)}.tpic.att svg{stroke:var(--jaune)}
.tpic.inf{background:var(--bleu-pale)}.tpic.inf svg{stroke:var(--bleu)}
.tpic.ko{background:var(--rouge-pale)}.tpic.ko svg{stroke:var(--rouge)}
.tpic.ok{background:var(--vert-pale)}.tpic.ok svg{stroke:var(--vert)}
.tptx{flex:1;min-width:0}
.tptx b{display:block;font-size:12.5px;font-weight:600;line-height:1.3}
.tptx span{display:block;font-size:11.5px;color:var(--muet);margin-top:2px;line-height:1.4}
.tpq{font-size:10.5px;color:var(--muet);flex:none;white-space:nowrap}
.tpanv{display:flex;flex-direction:column;align-items:center;gap:8px;padding:28px 18px;
  font-size:12.5px;color:var(--muet)}
.tpanv svg{fill:none;stroke-width:1.8}
.tpanf{padding:9px 15px;background:var(--surface-2);border-top:1px solid var(--ligne)}
.tpanf a{display:block;text-align:center;border:1px solid var(--ligne-2);background:#fff;
  border-radius:9px;padding:7px;font-size:12px;font-weight:600;color:var(--encre);
  text-decoration:none}
.tpanf a:hover{border-color:var(--terra);color:var(--terra-h)}
/* Menu compte */
.tpan.tcpt{width:min(250px,92vw)}
.tmtete{padding:13px 15px;border-bottom:1px solid var(--ligne)}
.tmtete b{display:block;font-family:var(--f-titre);font-size:14px;font-weight:600}
.tmtete>span{display:block;font-size:11.5px;color:var(--muet);margin-top:1px;
  overflow:hidden;text-overflow:ellipsis}
.tmrole{display:inline-block!important;margin-top:6px;font-size:10px;font-weight:700;
  text-transform:uppercase;letter-spacing:.07em;background:var(--terra-pale);
  color:var(--terra-h)!important;border-radius:20px;padding:2px 8px}
.tmline{display:flex;align-items:center;gap:10px;padding:9px 15px;font-size:12.5px;
  color:var(--encre);text-decoration:none}
.tmline:hover{background:var(--surface-2)}
.tmline svg{width:15px;height:15px;stroke:var(--muet);fill:none;stroke-width:1.8;flex:none}
.tmline.dgr{color:var(--rouge)}
.tmline.dgr svg{stroke:var(--rouge)}
.tmsep{height:1px;background:var(--ligne);margin:5px 0}

/* ═══ Sélecteur de vue (v7.13) ═══
   Une liste déroulante au lieu de cinq boutons : la barre respire
   et la vue courante se lit sans compter les onglets. */
.vuesel{position:relative}
.vuesel > summary{display:inline-flex;align-items:center;gap:7px;list-style:none}
.vuesel > summary::-webkit-details-marker{display:none}
.vuesel > summary .vsl{flex:1;text-align:left}
.vuesel[open] > summary{background:var(--terra-pale);border-color:var(--terra);
  color:var(--terra-h)}
.vuepan{width:270px;left:0;right:auto;padding:6px;gap:2px}
.vuel{display:flex;align-items:center;gap:11px;padding:9px 10px;border-radius:9px;
  text-decoration:none;color:var(--encre)}
.vuel:hover{background:var(--surface-2)}
.vuel.on{background:var(--terra-pale)}
.vuel .vic{width:30px;height:30px;border-radius:9px;background:var(--surface-2);
  display:flex;align-items:center;justify-content:center;flex:none}
.vuel.on .vic{background:#fff}
.vuel .vic svg{width:15px;height:15px;stroke:var(--encre-2);fill:none;stroke-width:1.8}
.vuel.on .vic svg{stroke:var(--terra-h)}
.vuel .vtx{flex:1;min-width:0}
.vuel .vtx b{display:block;font-size:12.5px;font-weight:600;line-height:1.25}
.vuel.on .vtx b{color:var(--terra-h)}
.vuel .vtx i{display:block;font-style:normal;font-size:11px;color:var(--muet);margin-top:1px}
.vuel .vok svg{width:15px;height:15px;stroke:var(--terra);fill:none;stroke-width:2.4;flex:none}

/* Bouton d'ajout sur la piste de la frise : discret, révélé au
   survol, à droite pour ne pas recouvrir les shifts du matin. */
.frtrack{position:relative}
.frplus{position:absolute;top:50%;left:0;transform:translate(-50%,-50%);z-index:4;
  width:22px;height:22px;border-radius:7px;border:1px dashed var(--ligne-2);
  background:#fff;color:var(--muet);font-size:14px;line-height:1;cursor:pointer;
  opacity:0;transition:opacity .12s;font-family:var(--f-ui)}
.frtrack:hover .frplus,.frplus:focus-visible{opacity:1}
.frplus:hover{border-color:var(--terra);border-style:solid;color:var(--terra-h);
  background:var(--terra-pale)}
/* Vue Étiquettes : la case reçoit un dépôt comme celle des salariés */
.trow .pcell{position:relative}
.trow .pcell .plus{opacity:0}
.trow .pcell:hover .plus{opacity:1}

/* Bandeau d'événements de la vue Jour : une seule journée, donc
   une ligne d'étiquettes plutôt qu'une grille à sept colonnes. */
.jevts{display:flex;align-items:center;gap:9px;flex-wrap:wrap;padding:9px 15px;
  margin-bottom:11px;background:#FCFAF5;border:1px solid var(--ligne);border-radius:var(--r)}
.jevts .jel{display:flex;align-items:center;gap:7px;font-size:10px;font-weight:700;
  letter-spacing:.06em;text-transform:uppercase;color:var(--muet);flex:none}
.jevts .jel .ico{width:12px;height:12px;stroke:currentColor;fill:none;stroke-width:1.9}
.jevts .ev{white-space:nowrap}
.jevts .dnote{margin-left:auto}
body.sans-anniv.sans-feries.sans-vacances .jevts{display:none}

/* Largeur d'une heure : le seul réglage à toucher pour resserrer
   ou étirer la frise. */
.frcard{--frh:80px}
body.dens-dense .frcard{--frh:62px}
body.dens-lache .frcard{--frh:104px}

/* Vue Jour : repères de 5 minutes à l'intérieur de chaque quart
   d'heure, dessinés en CSS. Le quart et l'heure gardent leurs
   bordures existantes. */
.jcell{background-image:repeating-linear-gradient(to right,
  #FAF6EE 0 1px, transparent 1px 33.333%)}
.jcell.hors{background-image:none}

/* Vue Jour : cases plus larges, la lecture au quart d'heure était
   trop serrée. */
.jgrid{--jcol:34px}
body.dens-dense .jgrid{--jcol:26px}
body.dens-lache .jgrid{--jcol:44px}
/* Voile de pause sur un shift, à sa place réelle */
.jsh{position:relative}
/* ── LA PAUSE, VUE SUR LA FRISE ──                           (v14.18)
   Le voile blanc à 60 % se lisait comme un défaut d'éclairage, pas
   comme une absence du poste. Des hachures par-dessus, et le doute
   tombe : ce n'est pas un reflet, c'est un trou. */
.jsh .jpz{position:absolute;top:0;bottom:0;z-index:1;
  background:repeating-linear-gradient(-45deg,
    rgba(255,255,255,.82) 0 4px, rgba(255,255,255,.5) 4px 8px);
  border-left:1px dashed rgba(62,43,26,.4);border-right:1px dashed rgba(62,43,26,.4);
  pointer-events:none}
/* ── ET QUAND ELLE N'A PAS D'HEURE ──
   Elle ne peut pas se placer : on ne l'invente pas, on la NOMME. Une
   pastille, comme l'écart de pointage à côté — écrite en gris à 70 %
   d'opacité sous les heures, elle passait inaperçue. */
.jsh .pzp{position:sticky;left:calc(var(--jnoms) + 10px);z-index:2;
  display:inline-flex;align-items:center;gap:3px;width:fit-content;
  background:rgba(62,43,26,.07);border-radius:20px;padding:0 6px;
  font-size:9.5px;font-weight:700;color:var(--encre-2);white-space:nowrap}
.jsh .pzp svg{width:9px;height:9px;stroke:currentColor;fill:none;stroke-width:2;flex:none}
/* Le texte SUIT LE DÉFILEMENT à l'intérieur de son bloc.
   ATTENTION à l'offset : « left:0 » colle le texte au bord du
   conteneur, c'est-à-dire SOUS la colonne des noms qui y est
   figée — il restait donc invisible. L'offset vaut la largeur de
   cette colonne, plus une marge. */
.jgrid{--jnoms:230px}
.jsh .t,.jsh .h{position:sticky;left:calc(var(--jnoms) + 10px);z-index:2;
  align-self:flex-start;max-width:100%}
.jgrid .jabs .absin{position:sticky;left:calc(var(--jnoms) + 10px);display:flex;
  align-items:center;gap:8px;max-width:100%}
/* ══ LA MÉTÉO, HEURE PAR HEURE ══                          (v12.1)

   Une rangée en tête de chaque journée, alignée sur la grille des
   quarts d'heure : chaque icône couvre les quatre colonnes de son
   heure. C'est ce qui permet de lire que l'averse tombe PENDANT le
   service de 13 h.

   Elle est toujours rendue quand la donnée existe, et c'est une classe
   sur « body » qui la montre : le réglage ne coûte aucun aller-retour,
   et une page qui n'a pas encore lu la préférence s'affiche comme
   avant. L'état par défaut ne porte donc aucune classe.

   ── ELLE DÉPEND DE « MÉTÉO », ELLE NE LA DOUBLE PAS ──       (v12.4)
   Le menu portait un choix à trois branches dont l'une, « Aucune »,
   redisait ce que l'interrupteur « Météo » disait déjà juste
   au-dessus. Deux réglages pour une seule question finissent par se
   contredire à l'écran. Il n'en reste qu'un, et « sans-meteo » éteint
   tout : le bouton du jour comme la rangée horaire.

   Le fond est celui de l'en-tête des heures : la rangée appartient à
   la RÈGLE du temps, pas aux lignes de salariés. */
.jgrid .jmtolab,.jgrid .jmto,.jgrid .jmtot{display:none}
body.mto-heure:not(.sans-meteo) .jgrid .jmtolab{display:flex;background:var(--surface-2);
  font-size:9.5px;font-weight:700;text-transform:uppercase;letter-spacing:.05em;
  color:var(--muet);align-items:center}
body.mto-heure:not(.sans-meteo) .jgrid .jmto{display:flex;align-items:center;justify-content:center;gap:4px;
  container-type:inline-size;cursor:default;
  background:var(--surface-2);border-left:1px solid var(--ligne);
  border-bottom:1px solid var(--ligne);min-height:26px;padding:3px 0;overflow:hidden}
body.mto-heure:not(.sans-meteo) .jgrid .jmto:hover{background:var(--bleu-pale)}
body.mto-heure:not(.sans-meteo) .jgrid .jmtot{display:block;background:var(--surface-2);
  border-bottom:1px solid var(--ligne)}
.jgrid .jmto i{font-style:normal;font-size:9.5px;font-weight:700;color:var(--encre-2)}
/* La pluie, quand il y en a : deux caractères, dans le ton de l'eau.
   Une icône de nuage ne dit pas combien il tombe. */
.jgrid .jmto u{text-decoration:none;font-size:9px;font-weight:700;color:#3E6E8E}
/* Au zoom arrière, l'heure ne fait plus que 68 px : la température
   cède avant l'icône, qui est ce qu'on lit d'un coup d'œil. */
@container (max-width: 52px){ .jgrid .jmto i,.jgrid .jmto u{display:none} }
/* « Météo » éteint retire aussi le bouton du jour de la vue Jour : il
   n'était couvert par aucune règle avant la v12.4, et c'était le seul
   écran où la météo ne pouvait pas s'éteindre. « .jdmeteo » (le
   séparateur de la vue Semaine) est déjà pris plus bas. */
body.sans-meteo .jmeteo{display:none}
/* L'interrupteur « Heure par heure » n'a plus de sens quand la météo
   est éteinte : il reste lisible, mais il se dit inopérant plutôt que
   de laisser croire qu'on vient de régler quelque chose. */
body.sans-meteo .affmenu .mtohsw{opacity:.4;pointer-events:none}

/* ── UNE DEMI-JOURNÉE SE VOIT COMME UNE DEMI-JOURNÉE ──    (v12.1)
   La bande s'arrête maintenant à la bascule quand l'absence ne couvre
   qu'un matin ou qu'une après-midi. Sans repère, elle ressemblerait à
   une bande dont on aurait mal réglé la largeur : le trait interrompu
   dit « ce n'est pas toute la journée », comme le coin droit d'une
   bande coupée par le bord de la semaine dit « ça continue ». */
.jabs.jabspart{border-style:dashed}
/* Absence cliquable */
.jabs.cliq{cursor:pointer}
.jabs.cliq:hover{filter:brightness(.97)}

/* Ligne visée pendant un geste : c'est la LIGNE entière qui se
   marque, et elle se coupe en deux dans sa HAUTEUR — moitié haute
   pour déplacer, moitié basse pour dupliquer. La couleur dit
   laquelle est active, sans avoir à lire l'infobulle. */
.jgrid .jcell.jcible{position:relative}
.jgrid .jcell.jcible{box-shadow:inset 0 1px 0 var(--ligne-2),inset 0 -1px 0 var(--ligne-2)}
/* Le sélecteur Déplacer / Dupliquer est le MÊME qu'en vue
   Salariés, mais partagé dans la HAUTEUR puisque c'est une ligne
   qu'on vise. Il n'occupe que la moitié droite de la colonne des
   noms : le nom du salarié doit rester lisible — c'est lui qu'on
   vérifie avant de lâcher. */
/* ═══ Sélecteur Déplacer / Dupliquer (vues Jour et Frise) ═══
   Il couvre la PISTE du salarié visé, sur toute sa largeur, et se
   partage en DEUX BANDES HORIZONTALES : haut pour déplacer, bas
   pour dupliquer. C'est une ligne qu'on vise — le choix se fait
   donc en haut ou en bas de cette ligne, pas à gauche ou à droite.
   Il est rendu dans le HTML et masqué : le créer en JavaScript le
   rendait dépendant d'une portée et d'un ordre d'exécution. */
.jsplit{display:none;position:relative;z-index:9;pointer-events:none;
  flex-direction:column;gap:3px;padding:3px;overflow:clip}
/* La ligne visée GRANDIT pour que les deux libellés tiennent :
   des bandes de 12 px rognaient le texte, qui devenait invisible. */
.jgrid .jsplit.jcible{min-height:58px}
.frtrack .jsplit{position:absolute;inset:2px;z-index:9}
/* La classe est posée SUR le sélecteur lui-même, pas sur un
   parent : « .jcible > .jsplit » ne pouvait donc jamais
   correspondre. */
.jsplit.jcible,.jsplit.frcible{display:flex}
/* overflow:CLIP et non hidden : hidden crée un contexte de
   défilement, sur lequel les libellés sticky se calaient — ils ne
   suivaient donc jamais la fenêtre. C'est le même piège que pour
   le texte des shifts. */
.jsplit .ds-half{flex:1;display:flex;flex-direction:row;align-items:center;
  justify-content:flex-start;gap:8px;
  padding:0 14px;border:1.5px dashed var(--ligne-2);border-radius:7px;
  background:rgba(255,255,255,.95);font-size:11px;font-weight:700;color:var(--encre-2);
  min-height:24px;white-space:nowrap;overflow:clip}
/* Le libellé SUIT LE DÉFILEMENT : les bandes couvrent 24 heures,
   donc leur début se trouve loin à gauche, souvent hors écran.
   Sticky le retient au bord visible, après la colonne des noms. */
.jsplit .ds-half > *{position:sticky;left:calc(var(--jnoms, 230px) + 16px)}
.frtrack .jsplit .ds-half > *{left:calc(var(--frnoms, 200px) + 16px)}
.jsplit .ds-half span{max-width:none;overflow:visible;text-overflow:clip}
.jsplit .ds-half svg{width:14px;height:14px;stroke:currentColor;fill:none;
  stroke-width:1.9;flex:none}
.jsplit .ds-half.hot{border-style:solid;border-color:var(--terra);
  background:var(--terra-pale);color:var(--terra-h)}
.jsplit .ds-half[data-a="dup"].hot{border-color:var(--vert);
  background:var(--vert-pale);color:var(--vert)}
/* La ligne visée se marque discrètement : le sélecteur porte
   l'information, la couleur ne fait que la confirmer. */
.jgrid .jlab.jcible,.frrow .frl.frcible{background:var(--surface-2)}
.jgrid .jcell.jcible{background:var(--surface-2)}

/* v7.19.8 — Vue Jour.
   1. La colonne des noms passe AU-DESSUS du sélecteur : la bande
      Déplacer / Dupliquer couvre toute la journée et, une fois la
      grille défilée, son début glissait sous les noms et les
      recouvrait — on ne voyait plus qui l'on visait.
   2. Les libellés se placent au CENTRE de la piste visible (--cx
      est calculé par le geste) au lieu de se coller au bord gauche. */
.jgrid .jlab{z-index:21}
.jgrid .jsplit .ds-half{position:relative;justify-content:flex-start;padding:0}
.jgrid .jsplit .ds-half > .dsl{position:absolute;left:var(--cx,50%);top:50%;
  transform:translate(-50%,-50%);display:inline-flex;align-items:center;gap:8px;
  font:inherit;white-space:nowrap}
.jgrid .jsplit .ds-half > .dsl > *{position:static}

/* ═══ En-tête de planning (v7.16) ═══ */
/* Espaceurs de centrage : flex-basis à 0 pour qu'ils ne poussent
   personne à la ligne, et min-width nulle pour qu'ils se réduisent
   sur écran étroit. */
/* Espaceurs qui centrent le sélecteur de vue. En dessous de 1360 px
   la barre se replie : les espaceurs s'étiraient alors sur la
   première ligne et disloquaient les groupes — « Aujourd'hui » seul à
   droite, le reste renvoyé plus bas. On les neutralise dès que le
   repli commence (v7.89). */
.plsp{flex:1 1 0;min-width:0}
@media(max-width:1360px){
  .plsp{display:none}
  /* La barre se lit alors en deux groupes : navigation à gauche,
     actions à droite, chacun restant d'un seul tenant. */
  .plbar{row-gap:8px}
  .plbar .affmenu,
  .plbar .outmenu{margin-left:0}
  .plgauche,.plactions{display:flex;align-items:center;gap:10px;flex-wrap:wrap}
  .plactions{margin-left:auto}
}
/* Le sélecteur de vue prend la taille du sélecteur de date.
   .btn.sm (0,2,0) l'emportait sur .vuesel > summary (0,1,1) : il
   restait donc petit malgré cette règle. On cible les trois
   classes pour passer devant. */
.vuesel > summary.btn.sm{height:39px;padding:0 15px;font-size:13.5px;min-width:170px;
  border-radius:11px;font-weight:600}
.vuesel > summary.btn.sm svg:first-child{width:16px;height:16px}
.vuesel > summary .vsl{font-weight:600;font-size:13.5px}
/* Cadenas : l'état se lit sur l'icône, le clic le change. */
.cadenas{justify-content:flex-start;gap:9px}
.cadenas svg{stroke:var(--muet);fill:none;stroke-width:1.9}
.cadenas:hover svg{stroke:var(--encre)}
.cadenas.on{background:var(--vert-pale);border-color:#CFE0BE}
.cadenas.on svg{stroke:var(--vert)}
.cadenas.on:hover{background:#E4EFDC}
.plverrou{display:flex}
/* Le filtre d'étiquettes, désormais dans le menu Affichage */
.affmenu .filtres{margin:2px 0 4px}
.affmenu .smsel.w100{width:100%}

/* Effectif par équipe, sur la ligne du séparateur */
.jgrid .jeqe{background:var(--surface-2);border-top:1px solid var(--ligne-2);
  border-bottom:1px solid var(--ligne);border-left:1px solid rgba(224,213,192,.5);
  display:flex;align-items:center;justify-content:center;
  font-size:10px;font-weight:600;color:var(--muet);font-variant-numeric:tabular-nums}
.jgrid .jeqe.q0{border-left-color:var(--ligne-2)}
.jgrid .jeqe.hi{color:var(--terra-h);font-weight:700}
.jgrid .jeqe.jeqt{font-family:var(--f-titre);font-size:11px;color:var(--encre-2);
  border-left:1px solid var(--ligne)}
/* Le libellé d'équipe suit le défilement, comme les noms */
.jgrid .jeqsep{position:sticky;left:0;z-index:5}

/* Frise : le texte des shifts suit aussi le défilement. La colonne
   des noms y fait 200 px. */
.frscroll{--frnoms:200px}
.frbar .btg,.frbar .bhh{position:sticky;left:calc(var(--frnoms) + 10px);max-width:100%}
.frabs{overflow:clip}
.frabs .absin{position:sticky;left:calc(var(--frnoms) + 10px)}

/* Frise : piste visée pendant un geste, coupée en deux dans sa
   hauteur — haut pour déplacer, bas pour dupliquer. */
.frtrack.frcible.jmove{background-color:var(--terra-pale);
  box-shadow:inset 0 2px 0 var(--terra)}
.frtrack.frcible.jdup{background-color:var(--vert-pale);
  box-shadow:inset 0 -2px 0 var(--vert)}

/* Zoom et plage horaire dans le menu Affichage */
.zoomrow{display:flex;align-items:center;gap:9px;padding:6px 10px}
.zlab{font-size:12px;color:var(--encre-2);flex:1;white-space:nowrap}
.zbtns{display:flex;align-items:center;gap:5px;flex:none}
.zbtns .btn{width:28px;padding:0;justify-content:center;font-size:15px;line-height:1}
.zval{font-size:11.5px;font-weight:600;color:var(--encre);min-width:44px;text-align:center;
  font-variant-numeric:tabular-nums}
.plagerow{display:flex;align-items:center;gap:7px;padding:4px 10px 6px;flex-wrap:wrap}
.plagerow .zlab{flex:none}
.plagerow .fi.sm{width:96px;height:29px;font-size:12px;padding:0 8px}

/* Frise : la ligne visée grandit, comme en vue Jour */
.frrow:has(.jsplit.frcible){height:62px}
.frrow:has(.jsplit.frcible) .frl,.frrow:has(.jsplit.frcible) .frt{height:62px}

/* ═══ Vue Semaine (v7.20) — la vue Jour, sept fois ═══
   Le cadre défile dans les deux sens : les heures restent figées en
   haut, les noms à gauche, et le séparateur du jour courant se
   cale sous les heures. */
.jwrap.jsem{position:relative;overflow:auto;max-height:calc(100vh - 230px);min-height:360px}
.jgrid.jgsem .jh,.jgrid.jgsem .jt.jhead{position:sticky;top:0;z-index:22}
.jgrid.jgsem .jlab.jhead{top:0;z-index:24}
.jgrid.jgsem .jdaysep{position:sticky;top:33px;left:0;z-index:23;
  background:var(--encre);color:#fff;border-top:1px solid var(--encre);border-bottom:1px solid var(--encre);
  padding:0;min-height:34px;display:flex;align-items:center}
.jgrid.jgsem .jdaysep.we{background:#5A4636}
.jgrid.jgsem .jdaysep.today{background:var(--terra);border-color:var(--terra)}
/* Le contenu du séparateur suit le défilement horizontal : la
   bande couvre 24 heures, son début serait hors écran. */
.jgrid.jgsem .jdaysep .jdin{position:sticky;left:0;display:inline-flex;align-items:center;gap:10px;
  padding:6px 14px;max-width:100%;white-space:nowrap}
.jgrid.jgsem .jdaysep .jdn{font-family:var(--f-titre);font-size:14px;font-weight:700;color:#fff}
.jgrid.jgsem .jdaysep .jdm{font-size:11.5px;color:rgba(255,255,255,.7);margin-left:-6px}
.jgrid.jgsem .jdaysep .jdmeteo{display:inline-flex;align-items:center;gap:3px;font-size:11px;color:#fff}
.jgrid.jgsem .jdaysep .jdmeteo i{font-style:normal}
.jgrid.jgsem .jdaysep .jdtot{font-size:11px;font-weight:600;color:rgba(255,255,255,.85);
  font-family:var(--f-titre);padding-left:8px;border-left:1px solid rgba(255,255,255,.3)}
.jgrid.jgsem .jdaysep .dcopie{opacity:.55}
.jgrid.jgsem .jdaysep:hover .dcopie{opacity:1}
body.sans-meteo .jdmeteo,body.sans-feries .jdaysep .ferie,body.sans-anniv .jdaysep .anniv,
body.sans-vacances .jdaysep .vac,body.sans-notes .jdaysep .dnote{display:none}
/* Barre des jours : un raccourci vers chaque journée */
.jsemnav{display:flex;gap:6px;margin:0 0 12px}
.jsemnav .jsd{position:relative;display:flex;flex-direction:column;align-items:center;gap:1px;
  min-width:58px;padding:6px 10px;border:1px solid var(--ligne);border-radius:10px;background:var(--carte);
  cursor:pointer;font:inherit;color:var(--encre-2);line-height:1.1}
.jsemnav .jsd b{font-size:10.5px;text-transform:uppercase;letter-spacing:.06em;font-weight:700}
.jsemnav .jsd span{font-family:var(--f-titre);font-size:16px;font-weight:700;color:var(--encre)}
.jsemnav .jsd i{position:absolute;top:-6px;right:-6px;font-style:normal;font-size:10px;font-weight:700;
  background:var(--encre);color:#fff;border-radius:9px;padding:1px 6px}
.jsemnav .jsd.we{background:#F6F3EC}
.jsemnav .jsd.ferie span{color:var(--rouge)}
.jsemnav .jsd.today{border-color:var(--terra)}
.jsemnav .jsd.today span{color:var(--terra-h)}
.jsemnav .jsd.on{background:var(--encre);border-color:var(--encre);color:#fff}
.jsemnav .jsd.on span,.jsemnav .jsd.on b{color:#fff}
.jsemnav .jsd:hover:not(.on){border-color:var(--encre-2)}

/* v7.20.1 — Vue Jour : le bouton « + note » du bandeau Événements
   était invisible (révélé seulement au survol d'une case .dd du
   planning, qui n'existe pas ici). */
.jevts .dnote{width:auto;margin:0;border:1px solid var(--ligne);border-radius:20px;padding:3px 10px}
.jevts .dnote.add{opacity:1;color:var(--muet);border-style:dashed}
/* Badge d'alerte sur un shift de la grille horaire : à l'intérieur
   du bloc (overflow:clip y rognerait un badge débordant), et
   au-dessus du texte collant. */
.jgrid .jsh .wshift{position:absolute;top:4px;right:14px;margin:0;z-index:4}
/* v7.20.1 — Séparateur de jour (vue Semaine) : chaque repère est
   un élément en ligne, côte à côte. Les règles héritées du
   planning (copie en absolu, note pleine largeur, bande de
   vacances) se chevauchaient. */
.jgrid.jgsem .jdaysep .jdin{gap:8px}
.jgrid.jgsem .jdaysep .jdin > *{flex:none}
.jgrid.jgsem .jdaysep .dcopie{position:static;top:auto;right:auto;opacity:.85;margin-left:2px;
  background:rgba(255,255,255,.12);border-color:rgba(255,255,255,.35);color:#fff}
.jgrid.jgsem .jdaysep .dcopie:hover{opacity:1;background:#fff;color:var(--terra-h)}
.jgrid.jgsem .jdaysep .dnote{width:auto;margin:0;border:1px solid var(--ligne);border-radius:20px;
  padding:3px 10px;max-width:260px}
.jgrid.jgsem .jdaysep .dnote.add{opacity:1;color:rgba(255,255,255,.8);border-style:dashed;
  border-color:rgba(255,255,255,.45);background:none}
.jgrid.jgsem .jdaysep .dnote.add:hover{background:#fff;color:var(--encre)}
.jgrid.jgsem .jdaysep .ev{margin:0}
.jgrid.jgsem .jdaysep .ev.vac{border-radius:20px;min-height:auto;width:auto}
.jgrid.jgsem .jdaysep .jdtot{margin-left:4px}

/* v7.21 — Météo cliquable sur toutes les vues */
.jevts .jmeteo,.jgrid.jgsem .jdaysep .jdmeteo{border:none;background:none;cursor:pointer;
  padding:2px 6px;border-radius:8px;font:inherit;display:inline-flex;align-items:center;gap:4px}
.jevts .jmeteo{font-size:11px;font-weight:600;color:var(--encre-2)}
.jevts .jmeteo i{font-style:normal}
.jevts .jmeteo:hover{background:var(--surface-2)}
.jgrid.jgsem .jdaysep .jdmeteo:hover{background:rgba(255,255,255,.15)}
/* Barre des jours dans l'en-tête : compacte */
.plbar .jsemnav{margin:0;gap:3px}
.plbar .jsemnav .jsd{min-width:34px;padding:3px 4px;gap:0;border-radius:8px}
.plbar .jsemnav .jsd b{font-size:8px;letter-spacing:.02em}
.plbar .jsemnav .jsd span{font-size:12.5px}
.plbar .jsemnav .jsd i{display:none}
/* ── LA RÈGLE QUI ANNULAIT CELLE DE LA v11.96 ──           (v12.0)

   Elle disait « le sélecteur cède de la place à la barre des jours »,
   et fixait 300 px. Sa spécificité — (0,3,0) — bat celle de
   « .plbar .psel » (0,2,0), média-requête comprise : le correctif
   responsive de la v11.96 était donc SILENCIEUSEMENT ANNULÉ sur la
   seule vue qui en avait le plus besoin, celle qui porte en plus les
   sept jours (256 px).

   Mesuré à 1440 px : le sélecteur mesurait 300 au lieu de 210, la
   barre réclamait 1786 px pour 1292 disponibles, et se pliait en deux
   lignes dès 1440 — un portable 13 pouces.

   Deux règles écrites pour la même raison, dont la plus ancienne
   gagne : elle part. Le rétrécissement de la v11.96 la remplace, et il
   va plus loin.
   (Et l'on dit « établissement », jamais « parc ».) */
@media(min-width:1701px){
  /* Au-dessus du premier palier, le sélecteur vaut 360 et la barre
     des jours a quand même besoin de place. C'est le seul cas où
     l'ancienne règle avait raison — et le seul où elle n'entrait en
     concurrence avec rien. */
  body.vue-semaine .plbar .psel{width:min(300px,100%)}
}

/* ═══ v7.23 · Tiroir shift / absence — fiche en sections ═══
   Un résumé permanent en tête, des sections nommées, et les
   décisions courantes (créneau, pause) en pastilles plutôt qu'en
   champs. Les actions rares passent dans un menu, pour ne laisser
   qu'une action évidente en pied. */
/* « .dwr2 » ne réglait qu'une largeur : 500 px, soit une TROISIÈME
   valeur après les deux de « .dwr .panel ». Le tiroir du planning
   porte pourtant le plus de contenu de tous — deux colonnes de
   dates, sept pastilles de jours, les pauses, le justificatif. Il
   suit la largeur commune (v11.73). */
.dwrecap{display:flex;align-items:center;gap:11px;margin:12px 18px 0;padding:10px 13px;
  background:var(--surface-2);border:1px solid var(--ligne);border-radius:12px}
.dwrecap .avm{width:28px;height:28px;border-radius:50%;color:#fff;display:flex;align-items:center;
  justify-content:center;font-size:10px;font-weight:700;flex:none;background:var(--encre-2)}
.dwrecap .qq{min-width:0;flex:1}
.dwrecap .qq b{display:block;font-size:13.5px;font-weight:600;color:var(--encre);
  white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.dwrecap .qq i{display:block;font-style:normal;font-size:11.5px;color:var(--muet);
  white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.dwrecap .dd{text-align:right;flex:none}
.dwrecap .dd b{display:block;font-family:var(--f-titre);font-size:17px;font-weight:700;line-height:1;color:var(--encre)}
.dwrecap .dd i{font-style:normal;font-size:10.5px;color:var(--muet)}
.dwsect{padding:15px 0;border-bottom:1px solid var(--ligne)}
.dwsect:first-child{padding-top:4px}
.dwsect:last-of-type{border-bottom:none}
.dwsh{display:flex;align-items:baseline;gap:8px;margin-bottom:10px}
.dwsh b{font-size:10.5px;font-weight:700;letter-spacing:.09em;text-transform:uppercase;color:var(--encre)}
.dwsh i{font-style:normal;font-size:11.5px;color:var(--muet)}
/* ── UNE SECTION QUI NE SE SAISIT PAS ──                  (v11.14)
   Le cadre légal d'une absence se lit, il ne se modifie pas. Une
   section en tout point identique aux autres inviterait à essayer :
   on la teinte et on lui donne un cadenas, sans pour autant en faire
   un composant de plus. */
.dwsect.lecture{background:#FCF8F0;border:1px solid #EEE2CB;border-radius:var(--r);
  padding:13px 15px;margin:15px 0}
.dwsect.lecture .dwsh b{color:#8A6512}
.dwsect.lecture .dwsh{align-items:center}
.dwsect.lecture .dwsh .ico{width:13px;height:13px;color:#8A6512;flex:none}
.dwsect .rowf{margin-bottom:9px}
.dwsect .fl{display:block;font-size:11.5px;font-weight:600;color:var(--encre-2);margin-bottom:5px}
/* Horaires en gros : c'est la donnée qu'on relit le plus */
.qheures{display:flex;align-items:center;gap:8px;background:var(--surface-2);border:1px solid var(--ligne);
  border-radius:13px;padding:10px 13px;margin-top:10px}
.qheures input[type=time]{font-family:var(--f-titre);font-size:21px;font-weight:700;color:var(--encre);
  border:none;background:none;padding:0;width:auto;min-width:96px;max-width:150px;text-align:center;
  font-feature-settings:"tnum"}
.qheures input[type=time]:focus{outline:none;color:var(--terra-h)}
.qheures .fl{color:var(--muet);font-size:15px}
.qheures .dd{margin-left:auto;text-align:right}
.qheures .dd b{display:block;font-family:var(--f-titre);font-size:17px;font-weight:700;line-height:1}
.qheures .dd i{font-style:normal;font-size:10.5px;color:var(--muet)}
.qchips{display:flex;flex-wrap:wrap;gap:6px;margin-top:9px}
.qchip{border:1px solid var(--ligne-2);background:#fff;border-radius:20px;padding:5px 12px;
  font-family:var(--f-ui);font-size:11.5px;font-weight:600;color:var(--encre-2);cursor:pointer}
.qchip:hover{border-color:var(--muet)}
.qchip.on{background:var(--encre);border-color:var(--encre);color:#fff}
/* Les lignes de pause détaillées ne s'affichent qu'au besoin */
.dwsect .pauses:not(.ouvert){display:none}
.dwmore{border:none;background:none;font-family:var(--f-ui);font-size:12.5px;font-weight:600;
  color:var(--encre-2);cursor:pointer;padding:11px 0;display:flex;align-items:center;gap:7px;
  width:100%;border-top:1px solid var(--ligne)}
.dwmore span{transition:transform .15s;display:inline-block}
.dwmore.open span{transform:rotate(90deg)}
.dwextra{display:none;padding:2px 0 12px}
.dwextra.open{display:block}
/* Menu des actions rares, en pied */
.dwkeb{position:relative}
.dwkeb > .btn{flex:none;width:40px;padding:9px 0}
.dwkmenu{position:absolute;bottom:calc(100% + 6px);left:0;background:#fff;border:1px solid var(--ligne);
  border-radius:11px;box-shadow:var(--ombre-2);padding:5px;display:none;min-width:210px;z-index:5}
.dwkeb.open .dwkmenu{display:block}
.dwkmenu button{display:flex;width:100%;gap:9px;align-items:center;border:none;background:none;
  font-family:var(--f-ui);font-size:12.5px;font-weight:500;color:var(--encre);padding:9px 10px;
  border-radius:8px;cursor:pointer;text-align:left}
.dwkmenu button:hover{background:var(--surface-2)}
.dwkmenu button.d{color:var(--rouge)}

/* ═══ v7.23 · Vue Postes — la couverture d'une journée ═══
   Le fond de chaque quart d'heure porte l'information : tenu,
   doublé, ou trou pendant l'ouverture. On lit une ligne sans
   compter les blocs. */
.jgrid.jgpos .jh.ouv{background:#fff}
.jgrid.jgpos .jcell.ok{background:var(--vert-pale)}
.jgrid.jgpos .jcell.plus{background:var(--bleu-pale)}
.jgrid.jgpos .jcell.trou{background:var(--rouge-pale);box-shadow:inset 0 -2px 0 var(--rouge)}
.jgrid.jgpos .jcell.hors{background:var(--surface-2);background-image:none}
.jgrid.jgpos .jlab.jposte{gap:9px}
.jgrid.jgpos .jlab .pastille{width:10px;height:26px;border-radius:4px;flex:none}
/* Deux personnes sur le même poste à la même heure : on EMPILE
   plutôt que de superposer, et la ligne grandit d'autant (sa
   hauteur est posée par le serveur, qui seul connaît le nombre de
   piles). */
.jgrid.jgpos .jsh.jshp{align-self:start;height:26px;padding:3px 9px;
  margin-top:calc(5px + var(--pi,0) * 30px);margin-bottom:0;
  flex-direction:row;align-items:center;gap:8px}
.jgrid.jgpos .jsh.jshp .t{font-size:9px;flex:none}
.jgrid.jgpos .jsh.jshp .h{font-size:10.5px}
.jgrid.jgpos .jsh .t .conf{font-style:normal;font-weight:700;color:var(--rouge);
  background:var(--rouge-pale);border-radius:5px;padding:0 5px;margin-left:4px}
.jgrid.jgpos .jsh.jshna{border-style:dashed}
/* Liste des trous : chaque ligne est une action, pas un constat */
.trlist{display:flex;flex-direction:column}
.tritem{display:flex;align-items:center;gap:11px;padding:11px 16px;border:none;background:none;
  border-top:1px solid var(--ligne);font-family:var(--f-ui);font-size:13px;color:var(--encre);
  cursor:pointer;text-align:left;width:100%}
.tritem:first-child{border-top:none}
.tritem:hover{background:var(--surface-2)}
.tritem .pastille{width:9px;height:20px;border-radius:3px;flex:none}
.tritem b{font-weight:600;min-width:120px}
.tritem .hh{font-family:var(--f-titre);font-weight:700;color:var(--rouge)}
.tritem .du{font-size:11.5px;color:var(--muet)}
.tritem .go{margin-left:auto;font-size:11.5px;font-weight:700;color:var(--terra-h);
  border:1px solid var(--ligne-2);border-radius:20px;padding:3px 11px}
.tritem:hover .go{border-color:var(--terra);background:var(--terra-pale)}

/* ═══ v7.23 · Vue Temps réel — planning croisé aux pointages ═══ */
.trbar{display:flex;align-items:center;gap:22px;background:var(--carte);border:1px solid var(--ligne);
  border-radius:14px;padding:13px 18px;margin-bottom:14px;box-shadow:var(--ombre)}
.trh .thnow{font-family:var(--f-titre);font-size:30px;font-weight:700;line-height:1;display:block}
.trh .thd{font-size:11.5px;color:var(--muet);text-transform:capitalize}
.trkpi{display:flex;gap:26px;margin-left:8px}
.trkpi .k b{display:block;font-family:var(--f-titre);font-size:22px;font-weight:700;line-height:1.1}
.trkpi .k span{font-size:11px;color:var(--muet)}
.trkpi .k.ko b{color:var(--rouge)}
.trauto{margin-left:auto;display:flex;align-items:center;gap:7px;font-size:12px;color:var(--encre-2)}
.trlist2{display:flex;flex-direction:column}
.tri{display:flex;align-items:center;gap:12px;padding:11px 16px;border-top:1px solid var(--ligne)}
.tri:first-child{border-top:none}
/* La pastille de gauche porte l'état : on balaie la colonne sans
   lire les libellés. */
.tri .pt{width:7px;height:34px;border-radius:4px;background:var(--ligne-2);flex:none}
.tri.ok .pt{background:var(--vert)} .tri.at .pt{background:var(--jaune)}
.tri.ko .pt{background:var(--rouge)} .tri.pz .pt{background:var(--bleu)}
.tri.nx .pt{background:var(--ligne-2)} .tri.fi .pt{background:var(--muet)}
.tri.np .pt{background:var(--jaune)} .tri.ab .pt{background:var(--violet)}
.tri.na .pt{background:var(--terra)}
.tri.ko{background:var(--rouge-pale)}
.tri.at{background:var(--jaune-pale)}
.tri .avm{width:32px;height:32px;border-radius:50%;color:#fff;display:flex;align-items:center;
  justify-content:center;font-size:11px;font-weight:700;flex:none}
.tri .who{min-width:190px}
.tri .who b{display:block;font-size:13.5px;font-weight:600}
.tri .who .po{display:flex;align-items:center;gap:6px;font-size:11px;color:var(--muet)}
.tri .who .po i{width:8px;height:8px;border-radius:3px;display:block}
.tri .hr{min-width:190px}
.tri .hr b{font-family:var(--f-titre);font-size:13px;font-weight:700}
.tri .hr .pt2{display:block;font-size:10.5px;color:var(--muet)}
.tri .hr .jauge{display:block;height:4px;border-radius:3px;background:var(--ligne);margin-top:5px;overflow:hidden}
.tri .hr .jauge i{display:block;height:100%;background:var(--vert)}
.tri .et{margin-left:auto;display:flex;align-items:center;gap:8px}
.tri .et .badge{font-size:11px;font-weight:700;border-radius:20px;padding:3px 11px;
  background:var(--surface-2);color:var(--encre-2);white-space:nowrap}
.tri.ok .et .badge{background:var(--vert-pale);color:var(--vert)}
.tri.at .et .badge{background:#F6E9C8;color:var(--jaune)}
.tri.ko .et .badge{background:var(--rouge);color:#fff}
.tri.pz .et .badge{background:var(--bleu-pale);color:var(--bleu)}
.tri.ab .et .badge{background:var(--violet-pale);color:var(--violet)}
.tri.na .et .badge{background:var(--terra-pale);color:var(--terra-h)}
.tri .et .ret{font-size:11px;font-weight:700;color:var(--rouge)}
.tri .et .ret.nx{color:var(--muet);font-weight:600}
.tri .go{font-size:11.5px;font-weight:600;color:var(--encre-2);text-decoration:none;
  border:1px solid var(--ligne-2);border-radius:20px;padding:4px 12px}
.tri .go:hover{border-color:var(--terra);color:var(--terra-h)}

/* Sélections groupées du tiroir (v7.24) */
.dwsh .qmini{margin-left:auto;border:1px solid var(--ligne-2);background:#fff;border-radius:20px;
  padding:2px 9px;font-family:var(--f-ui);font-size:10.5px;font-weight:700;color:var(--encre-2);cursor:pointer}
.dwsh .qmini + .qmini{margin-left:4px}
.dwsh .qmini:hover{border-color:var(--terra);color:var(--terra-h)}

/* Modèles de saisie personnalisables (v7.25) : la pastille porte
   son crayon, révélé au survol — un mode « gestion » séparé
   obligerait à sortir du formulaire pour renommer un créneau. */
.qchips.gerable .qchip{position:relative;padding-right:12px}
.qchips.gerable .qchip .ed{position:absolute;top:-7px;right:-7px;width:17px;height:17px;border-radius:50%;
  background:#fff;border:1px solid var(--ligne-2);color:var(--encre-2);font-size:9px;font-style:normal;
  display:none;align-items:center;justify-content:center;line-height:1}
.qchips.gerable .qchip:hover .ed{display:flex}
.qchips.gerable .qchip .ed:hover{border-color:var(--terra);color:var(--terra-h);background:var(--terra-pale)}
.qchips.gerable .qchip.on .ed{background:#fff}
.qchip.add{border-style:dashed;font-weight:700;padding:5px 11px;color:var(--muet)}
.qchip.add:hover{border-color:var(--terra);color:var(--terra-h);border-style:solid}
.mdbox{width:min(460px,94vw);display:flex;flex-direction:column}
.mdh{display:flex;align-items:center;gap:10px;padding:15px 18px;border-bottom:1px solid var(--ligne)}
.mdh h3{font-family:var(--f-titre);font-size:16px;font-weight:600;margin:0;flex:1}
.mdb{padding:16px 18px}
.mdb .fl{display:block;font-size:11.5px;font-weight:600;color:var(--encre-2);margin-bottom:5px}
.mdb .f2{display:grid;grid-template-columns:1fr 1fr;gap:9px}
.mdf{display:flex;gap:8px;align-items:center;padding:13px 18px;border-top:1px solid var(--ligne);
  background:var(--surface-2)}

/* ═══ v7.25 · Vue Mois — le planning du mois, salarié par salarié ═══
   La colonne des noms et la ligne des dates restent figées ; les
   lundis portent un filet plus marqué, les week-ends une teinte.
   Deux réglages font varier l'encombrement des cases. */
.moisbar{display:flex;align-items:center;gap:10px;margin-bottom:12px}
.moisbar .mtitre{font-family:var(--f-titre);font-size:18px;font-weight:700;text-transform:capitalize;
  min-width:150px;text-align:center}
.moisbar .sp2{flex:1}
.moisbar .mopt{display:flex;align-items:center;gap:6px;font-size:12px;color:var(--encre-2)}
.moisbar .mstat{font-size:12.5px;color:var(--encre-2)}
.moisbar .mstat b{font-family:var(--f-titre);font-weight:700}
.mowrap{overflow:auto;max-height:calc(100vh - 250px)}
.mogrid{display:grid;min-width:max-content;position:relative}
.mogrid .monom{position:sticky;left:0;z-index:25;background:#fff;border-top:1px solid var(--ligne);
  display:flex;align-items:center;gap:9px;padding:6px 12px;min-width:0}
.mogrid .monom .avm{width:26px;height:26px;border-radius:50%;color:#fff;display:flex;align-items:center;
  justify-content:center;font-size:9.5px;font-weight:700;flex:none}
.mogrid .monom .n{font-size:12.5px;font-weight:600;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.mogrid .monom .c{font-size:10.5px;color:var(--muet);margin-left:auto;font-family:var(--f-titre);font-weight:700}
.mogrid .monom.mohd{position:sticky;top:0;z-index:32;background:var(--surface-2);border-top:none;
  border-bottom:1px solid var(--ligne);font-size:10.5px;font-weight:700;letter-spacing:.06em;
  text-transform:uppercase;color:var(--muet)}
.mogrid .mohs{position:sticky;top:0;z-index:22;background:var(--surface-2);border-bottom:1px solid var(--ligne);
  border-left:1px solid var(--ligne);padding:5px 0 6px;text-align:center}
.mogrid .mohs .sem{position:absolute;top:2px;left:3px;font-size:8.5px;font-weight:700;color:#fff;
  background:var(--encre);border-radius:4px;padding:0 4px}
.mogrid .mohs .jj{display:block;font-size:9.5px;font-weight:700;letter-spacing:.05em;
  text-transform:uppercase;color:var(--muet)}
.mogrid .mohs .nn{display:block;font-family:var(--f-titre);font-size:15px;font-weight:700;line-height:1.15}
.mogrid .mohs.we{background:#F4F0E7}
.mogrid .mohs.ferie .nn{color:var(--rouge)}
.mogrid .mohs.today .nn{background:var(--terra);color:#fff;border-radius:7px;display:inline-block;padding:0 6px}
.mogrid .mohs.lun,.mogrid .mocel.lun{border-left:1px solid var(--ligne-2)}
.mogrid .mohs.motot{background:var(--encre);color:#fff;border-left-color:var(--encre);z-index:23}
.mogrid .mohs.motot .jj{color:rgba(255,255,255,.7)}
.mogrid .mocel{border-left:1px solid var(--surface-2);border-top:1px solid var(--ligne);
  padding:3px;display:flex;flex-direction:column;gap:2px;min-height:44px}
.mogrid .mocel.we{background:#FBF8F2}
.mogrid .mocel.today{background:#FEF7F4}
.mogrid .mocel.horsc{background:repeating-linear-gradient(-45deg,#F6F3EC,#F6F3EC 5px,#FBF9F4 5px,#FBF9F4 10px)}
.mogrid .mocel.motot{position:sticky;right:0;z-index:21;background:var(--surface-2);
  border-left:1px solid var(--ligne);align-items:center;justify-content:center;gap:1px}
.mogrid .mocel.motot b{font-family:var(--f-titre);font-size:12.5px;font-weight:700}
.mogrid .mocel.motot .ec{font-size:10px;font-weight:700}
.mogrid .mocel.motot .ec.p{color:var(--vert)} .mogrid .mocel.motot .ec.m{color:var(--rouge)}
/* Un shift : ses deux heures, l'une sous l'autre — c'est ce qu'on
   lit dans une case de 62 px. Le poste et les horaires s'affichent
   ou se masquent selon les réglages de la barre. */
.mosh{border-radius:5px;padding:2px 4px;font-size:9.5px;font-weight:700;line-height:1.25;
  border-left:2.5px solid;cursor:pointer;font-family:var(--f-titre);overflow:hidden}
.mosh:hover{filter:brightness(.96)}
.mosh i{display:block;font-style:normal;opacity:.75;font-weight:600}
.mosh .po{display:none;font-size:8.5px;font-weight:700;text-transform:uppercase;letter-spacing:.03em;
  white-space:nowrap;overflow:hidden;text-overflow:ellipsis;opacity:.85}
.mosh.na{border-style:dashed;border-width:1px 1px 1px 2.5px}
.mogrid.avecp .mosh .po{display:block}
.mogrid.sansh .mosh .hd,.mogrid.sansh .mosh i{display:none}
.mogrid.sansh .mosh{min-height:9px;padding:4px}
.mogrid.sansh.avecp .mosh{min-height:0;padding:2px 4px}
/* ── LA LIGNE DU SALARIE EST UNE GRILLE A ELLE SEULE ──      (v14.16)
   L'absence s'ecrivait case par case : une semaine de conges faisait
   sept paves « Conges » a la suite, chacun repetant le meme mot et
   aucun ne disant la duree. C'est le geste de la v14.13 sur le
   planning, transpose au mois - une bande sur toute la periode.

   Pour porter une bande, il faut une ligne. Les cases etaient des
   enfants directs de la grande grille : elles sont maintenant
   groupees dans « .morow », qui reprend les colonnes de la grille par
   « subgrid » - memes largeurs, memes separations, aucun calcul en
   double. La bande occupe la premiere rangee de cette ligne, les
   cases la seconde ; c'est la mecanique de « .prow.avecabs ».

   La bande elle-meme est un « .absx » : le composant du planning, a
   l'identique. Deux ecrans qui montrent la meme absence doivent la
   dessiner de la meme facon. */
.mogrid .morow{grid-column:1/-1;display:grid;grid-template-columns:subgrid}
.mogrid .morow.avecabs{grid-template-rows:auto 1fr}
.mogrid .morow.avecabs > .monom{grid-row:1 / span 2}
.mogrid .morow.avecabs > .mocel{grid-row:2}
.mogrid .morow .absx{margin:3px 2px 0;min-height:17px;font-size:9.5px;padding:1px 7px}
.moplus{border:1px dashed var(--ligne-2);border-radius:5px;color:var(--muet);background:none;
  font-family:var(--f-ui);font-size:11px;cursor:pointer;padding:1px 0;opacity:0;transition:.12s;margin-top:auto}
.mocel:hover .moplus{opacity:1}
.moplus:hover{border-color:var(--terra);color:var(--terra-h);background:var(--terra-pale)}
/* Le séparateur occupe TOUTE la ligne (1/-1) : posé sur la seule
   colonne 1, il décalait toutes les cases suivantes d'un cran. Son
   contenu, lui, est figé à gauche. */
.mogrid .moeqsep{grid-column:1/-1;background:var(--surface-2);z-index:26;
  border-top:1px solid var(--ligne);border-bottom:1px solid var(--ligne);
  font-size:10px;font-weight:700;letter-spacing:.08em;text-transform:uppercase;color:var(--encre-2)}
.mogrid .moeqsep > span.in{position:sticky;left:0;display:inline-flex;align-items:center;gap:8px;
  padding:4px 12px}
.mogrid .moeqsep .ep{width:3px;height:11px;border-radius:2px;background:var(--terra);flex:none}
.mogrid .moeqsep.sans .ep{background:var(--ligne-2)}
body.sans-equipes .moeqsep{display:none}
/* Lignes de contexte : la journée, pas une personne */
.mogrid .monom.moctx,.mogrid .mocel.moctx{background:var(--surface-2);min-height:30px}
.mogrid .monom.moctx{font-size:11px;font-weight:600;color:var(--encre-2)}
.mogrid .mocel.moctx.today{background:#FBEFE9}
.evj{font-size:8.5px;font-weight:700;border-radius:5px;padding:2px 4px;line-height:1.2;
  white-space:nowrap;overflow:hidden;text-overflow:ellipsis;border:none;font-family:var(--f-ui);
  text-align:left;cursor:default}
.evj.fe{background:var(--rouge-pale);color:var(--rouge)}
.evj.an{background:var(--violet-pale);color:var(--violet)}
.evj.va{background:#E4EAF6;color:#3E5480}
.evj.va.t2{background:#EFE7F3;color:#6E4A6A} .evj.va.t3{background:#E7F0E4;color:#3E6029}
.evj.va.t4{background:#F8E9DF;color:#8C5A15}
.evj.no{background:var(--jaune-pale);color:var(--jaune);cursor:pointer}
.evj.noadd{background:none;border:1px dashed var(--ligne-2);color:var(--muet);cursor:pointer;
  opacity:0;transition:.12s;margin-top:auto}
.mocel:hover .evj.noadd{opacity:1}
body.sans-feries .evj.fe,body.sans-anniv .evj.an,body.sans-vacances .evj.va,
body.sans-notes .evj.no,body.sans-notes .evj.noadd{display:none}

/* ═══ v7.25 · Vue Présences — un mois sur une page ═══ */
.srcseg{display:flex;background:var(--surface-2);border:1px solid var(--ligne);border-radius:10px;padding:3px}
.srcseg a{padding:5px 14px;border-radius:8px;font-size:12px;font-weight:600;color:var(--encre-2);text-decoration:none}
.srcseg a.on{background:#fff;color:var(--encre);box-shadow:var(--ombre)}
.prwrap{overflow:auto;max-height:calc(100vh - 260px)}
.prgrid{display:grid;min-width:max-content}
.prgrid .prh{position:sticky;top:0;z-index:20;background:var(--surface-2);border-bottom:1px solid var(--ligne);
  text-align:center;padding:4px 0 5px}
.prgrid .prh .dd{display:block;font-family:var(--f-titre);font-size:12px;font-weight:700;line-height:1.1}
.prgrid .prh .jj{display:block;font-size:8.5px;color:var(--muet);text-transform:uppercase}
.prgrid .prh.we{background:#F4F0E7}
.prgrid .prh.today .dd{background:var(--terra);color:#fff;border-radius:6px}
.prgrid .prh.lun,.prgrid .prc.lun{border-left:1px solid var(--ligne-2)}
.prgrid .prn{position:sticky;left:0;z-index:25;background:#fff;padding:5px 12px;text-align:right;
  font-size:12px;border-top:1px solid var(--ligne);white-space:nowrap}
.prgrid .prn b{font-weight:700}
.prgrid .prn.prhd,.prgrid .prt.prhd{position:sticky;top:0;z-index:32;background:var(--encre);color:#fff;
  border-bottom:1px solid var(--encre);border-top:none;font-size:10px;font-weight:700;letter-spacing:.06em;
  text-transform:uppercase;text-align:center}
.prgrid .prn.prhd{text-align:right;z-index:33}
.prgrid .prc{border-top:1px solid #fff;border-left:1px solid #fff;height:26px;display:flex;
  align-items:center;justify-content:center;font-size:10.5px;font-weight:700;font-family:var(--f-titre)}
.prgrid .prc.vide{background:var(--surface-2)}
.prgrid .prc.vide.we{background:#F4F0E7}
.prgrid .prc.vide.horsc{background:repeating-linear-gradient(-45deg,#F1ECE1,#F1ECE1 3px,#FBF9F4 3px,#FBF9F4 6px)}
.prgrid .prc.trav{background:var(--vert);color:#fff}
.prgrid .prc.trav.l{background:#8FB27A}
.prgrid .prc.trav.h{background:#3F6B27}
.prgrid .prc.abs{font-size:9px;letter-spacing:.02em}
.prgrid .prc.abs.att{box-shadow:inset 0 0 0 2px #fff}
.prgrid .prt{position:sticky;right:0;z-index:24;background:var(--surface-2);border-left:1px solid var(--ligne);
  border-top:1px solid var(--ligne);display:flex;align-items:center;justify-content:center;gap:6px;
  font-family:var(--f-titre);font-size:11.5px;font-weight:700;padding:0 10px}
.prgrid .prt .ec{font-size:10px;font-weight:700}
.prgrid .prt .ec.p{color:var(--vert)} .prgrid .prt .ec.m{color:var(--rouge)}
.prgrid .preq{grid-column:1/-1;background:var(--surface-2);z-index:26;
  border-top:1px solid var(--ligne);border-bottom:1px solid var(--ligne);
  font-size:10px;font-weight:700;letter-spacing:.08em;text-transform:uppercase;color:var(--encre-2)}
.prgrid .preq > span.in{position:sticky;left:0;display:inline-flex;align-items:center;gap:8px;padding:3px 12px}
.prgrid .preq .ep{width:3px;height:11px;border-radius:2px;background:var(--terra);flex:none}
.prleg{display:flex;flex-wrap:wrap;gap:8px 18px;padding:12px 16px;border-top:1px solid var(--ligne);
  background:var(--surface-2)}
.prleg span{display:inline-flex;align-items:center;gap:7px;font-size:11.5px;color:var(--encre-2)}
.prleg i{width:13px;height:13px;border-radius:4px;display:block}
.prleg .plus{color:var(--muet);font-style:italic;margin-left:auto}

/* v7.26 — Sélecteur de dates commun : en vue Mois il propose les
   douze mois de l'année, et le bandeau propre à la vue ne porte
   plus que ses réglages. */
.wknav.wkmois .wkd{min-width:132px;text-transform:capitalize}
.dpg.dpg12{grid-template-columns:repeat(3,1fr);gap:6px;padding:10px}
.dpm{border:1px solid var(--ligne-2);background:#fff;border-radius:9px;padding:9px 4px;
  font-family:var(--f-ui);font-size:12px;font-weight:600;color:var(--encre-2);cursor:pointer;
  text-transform:capitalize}
.dpm:hover{border-color:var(--terra);color:var(--terra-h)}
.dpm.on{background:var(--encre);border-color:var(--encre);color:#fff}

/* ═══ v7.27 · Réglages du temps de travail ═══ */
.rgtabs{display:flex;gap:6px;margin:0 0 16px;flex-wrap:wrap}
.rgtab{display:inline-flex;align-items:center;gap:8px;padding:8px 14px;border:1px solid var(--ligne);
  background:var(--carte);border-radius:11px;text-decoration:none;color:var(--encre-2);
  font-size:13px;font-weight:600;box-shadow:var(--ombre)}
.rgtab .ico{width:15px;height:15px}
.rgtab:hover{border-color:var(--muet)}
.rgtab.on{background:var(--encre);border-color:var(--encre);color:#fff}
.duo{display:grid;grid-template-columns:minmax(0,1fr) 320px;gap:18px;align-items:start}
@media(max-width:1150px){.duo{grid-template-columns:1fr}}
.expl{background:var(--surface-2);border:1px solid var(--ligne);border-radius:14px;padding:15px 16px;
  font-size:12.5px;line-height:1.6;color:var(--encre-2);position:sticky;top:16px}
.expl h4{font-family:var(--f-titre);font-size:13px;font-weight:700;margin:0 0 9px;color:var(--encre)}
.expl p{margin:0 0 10px}
.expl .kv{display:flex;justify-content:space-between;gap:10px;padding:5px 0;border-bottom:1px solid var(--ligne)}
.expl .kv:last-of-type{border-bottom:none}
.expl .kv b{font-family:var(--f-titre);color:var(--encre);text-align:right}
/* Une période : ses paramètres se lisent d'un regard, sans ouvrir */
.rgper{display:flex;align-items:center;gap:14px;padding:13px 16px;border-top:1px solid var(--ligne);
  flex-wrap:wrap}
.rgper:first-of-type{border-top:none}
.rgper.encours{background:var(--terra-pale)}
.rgper.close{opacity:.55}
.rgper .pn{min-width:230px}
.rgper .pn b{font-family:var(--f-titre);font-size:14px;font-weight:700;margin-right:7px}
.rgper .pn .dd{display:block;font-size:11.5px;color:var(--muet);margin-top:2px}
.rgper .pk{display:flex;gap:20px;flex-wrap:wrap;flex:1}
.rgper .pk span{display:block}
.rgper .pk i{display:block;font-style:normal;font-size:10px;font-weight:700;letter-spacing:.06em;
  text-transform:uppercase;color:var(--muet)}
.rgper .pk b{font-family:var(--f-titre);font-size:13px;font-weight:700}
.rgper .pa{display:flex;gap:7px}

/* ═══ v7.28 · Liste des salariés : l'état, pas seulement l'identité ═══ */
.av-m.avet{position:relative}
.av-m.avet::after{content:'';position:absolute;right:-1px;bottom:-1px;width:10px;height:10px;
  border-radius:50%;border:2px solid #fff;background:var(--ligne-2)}
.av-m.avet.enposte::after{background:var(--vert)}
.av-m.avet.attendu::after{background:var(--jaune)}
.av-m.avet.absent::after{background:var(--violet)}
.av-m.avet.sorti::after{background:var(--rouge)}
.jaugel{height:5px;border-radius:3px;background:var(--ligne);overflow:hidden;min-width:74px;max-width:110px}
.jaugel i{display:block;height:100%;background:var(--vert)}
.jaugel i.wa{background:var(--jaune)} .jaugel i.ko{background:var(--rouge)}
/* Un point de vigilance mène là où on le règle : le libellé est un
   lien vers le bon onglet de la fiche. */
.vigc{display:inline-flex;align-items:center;gap:8px;text-decoration:none;max-width:230px}
.vigc .vgd{display:inline-flex;gap:3px;flex:none}
.vigc .vgd i{width:7px;height:7px;border-radius:50%;background:var(--jaune);display:block}
.vigc .vgd i.r{background:var(--rouge)}
.vigc .vgt{font-size:11.5px;font-weight:600;color:var(--jaune);line-height:1.35}
.vigc.r .vgt{color:var(--rouge)}
.vigc .vgt em{font-style:normal;font-weight:700;opacity:.7}
.vigc:hover .vgt{text-decoration:underline}

/* ═══ v7.28 · Fiche salarié : bandeau riche et onglets ═══ */
.band.bandx{display:block;padding:16px 18px}
.bandx .bl1{display:flex;gap:16px;align-items:flex-start;flex-wrap:wrap}
.bandx .avatar{position:relative}
.bandx .avatar.avet::after{content:'';position:absolute;right:0;bottom:0;width:13px;height:13px;
  border-radius:50%;border:2.5px solid #fff;background:var(--ligne-2)}
.bandx .avatar.avet.enposte::after{background:var(--vert)}
.bandx .avatar.avet.attendu::after{background:var(--jaune)}
.bandx .avatar.avet.absent::after{background:var(--violet)}
.bandx .avatar.avet.sorti::after{background:var(--rouge)}
.bandx .bid{min-width:210px}
.bandx .bnow{background:var(--surface-2);border:1px solid var(--ligne);border-radius:12px;
  padding:9px 13px;font-size:12px;min-width:250px}
.bandx .bnow b{display:block;font-family:var(--f-titre);font-size:13.5px;margin-bottom:2px}
.bandx .bnow span{color:var(--muet)}
.bandx .ba{margin-left:auto;display:flex;gap:8px;flex-wrap:wrap}
/* ═══ LE CHAMP EN LECTURE ═══                            (v11.15)
   Le kit ne portait que des champs de SAISIE — .fl, .fi, .fhelp.
   Or une fiche se lit dix fois pour une fois qu'on la modifie, et
   faute de composant, chaque écran réinventait sa paire
   libellé/valeur : .kvl ici, un tableau là, du texte brut ailleurs.

   Celui-ci reprend exactement le libellé de .fl et l'aide de
   .fhelp. Ce n'est donc pas un dessin de plus : c'est le pendant en
   lecture de ce qui existait en écriture, et il manquait. */
.champs{display:grid;gap:13px 18px;grid-template-columns:1fr}
.champs.c2{grid-template-columns:1fr 1fr}
.champs.c3{grid-template-columns:1fr 1fr 1fr}
.champs.c4{grid-template-columns:repeat(4,1fr)}
@media(max-width:900px){.champs.c3,.champs.c4{grid-template-columns:1fr 1fr}}
@media(max-width:560px){.champs.c2,.champs.c3,.champs.c4{grid-template-columns:1fr}}
.champ{min-width:0}
.champ .ck{font-size:10.5px;font-weight:700;letter-spacing:.06em;text-transform:uppercase;
  color:var(--muet);margin-bottom:2px;display:flex;align-items:center;gap:4px}
/* CORRECTIF v11.16 — c'était « display:flex » avec « gap:7px ».
   Une valeur n'est pas une rangée d'éléments, c'est du texte : avec
   flex, chaque balise inline devenait un item séparé de 7 px, et
   « 1<sup>er</sup> avril » s'affichait « 1 er avril ». Le flex ne
   servait qu'à aligner une icône ; on le fait à la main. */
.champ .cv{font-size:14px;font-weight:500;color:var(--encre);line-height:1.4;word-break:break-word;
  display:block}
.champ .cv .ico{width:14px;height:14px;color:var(--muet);vertical-align:-2px;margin-right:5px}
.champ .cv>.pill{margin-left:6px;vertical-align:1px}
.champ .cv.mono{font-family:ui-monospace,Menlo,monospace;font-size:12.5px}
/* Un champ vide se dit, il ne se laisse pas deviner : un blanc se
   confond avec un champ qu'on aurait oublié d'afficher. */
.champ .cv.vide{color:var(--muet);font-weight:400;font-style:italic}
.champ .ch2{font-size:11px;color:var(--muet);margin-top:3px;line-height:1.4}
/* L'intertitre d'un groupe de champs, dans une carte. */
.champt{font-size:10.5px;font-weight:700;letter-spacing:.08em;text-transform:uppercase;
  color:var(--terra);margin:0 0 11px}
.champt.sep{margin-top:18px;padding-top:16px;border-top:1px solid var(--ligne)}

/* ═══ LA DONNÉE SENSIBLE ═══                             (v11.15)
   Violet, comme la mobilité : il dit « accès restreint », pas
   « attention ». Le rouge et l'ambre servent déjà à alerter — s'ils
   servaient aussi à classer, ils n'alerteraient plus. */
.sensible{background:var(--violet-pale);border:1px solid #E4D2E0;border-radius:var(--r-sm);
  padding:12px 14px;margin-bottom:14px}
.sensible .st{font-size:10px;font-weight:700;letter-spacing:.07em;text-transform:uppercase;
  color:var(--violet);display:flex;align-items:center;gap:6px;margin-bottom:11px}
.sensible .st .ico{width:12px;height:12px}
.masque{font-family:ui-monospace,Menlo,monospace;letter-spacing:1px;color:var(--muet)}

/* ═══ LA LISTE DE COMPLÉTUDE ═══                         (v11.15)
   Ce qu'on attend d'un dossier, et ce qui y est. Trois états et
   trois seulement : présent, manquant, facultatif. Un quatrième
   obligerait à réfléchir avant de lire. */
.pieces{display:flex;flex-direction:column;gap:1px}
.piece{display:flex;align-items:center;gap:9px;font-size:12.5px;padding:3.5px 0;color:var(--encre-2)}
.piece .pb{width:15px;height:15px;border-radius:5px;flex:none;display:flex;align-items:center;
  justify-content:center;color:#fff;font-size:9px;font-weight:700}
.piece .pb .ico{width:10px;height:10px}
.piece .pb.ok{background:var(--vert)}
.piece .pb.no{background:var(--ligne-2)}
.piece .pb.ko{background:var(--rouge)}
.piece em{font-style:normal;margin-left:auto;font-size:10.5px;color:var(--muet);flex:none}
.piece b{color:var(--encre)}
/* L'anneau de complétude : une proportion se lit plus vite qu'un
   pourcentage écrit. */
.anneau{display:flex;align-items:center;gap:13px;margin-bottom:12px}
.anneau svg{transform:rotate(-90deg);flex:none}
.anneau .at b{font-family:var(--f-titre);font-size:17px;font-weight:700;display:block;line-height:1.1}
.anneau .at span{font-size:12px;color:var(--muet)}

/* La grille de l'onglet Identité : le dossier à gauche, ce qui parle
   du dossier lui-même à droite (v11.15). */
.dosgrid2{display:grid;grid-template-columns:1fr 330px;gap:16px;align-items:start}
@media(max-width:1080px){.dosgrid2{grid-template-columns:1fr}}

.bkeys{display:grid;grid-template-columns:repeat(auto-fit,minmax(132px,1fr));gap:3px 18px;
  margin-top:14px;padding-top:13px;border-top:1px solid var(--ligne)}
.bkeys .k i{display:block;font-style:normal;font-size:10px;font-weight:700;letter-spacing:.06em;
  text-transform:uppercase;color:var(--muet)}
.bkeys .k b{font-weight:600;font-size:12.5px}
.bkeys .k b.vk{color:var(--rouge)}
/* ═══ LES ONGLETS DANS L'EN-TÊTE DE FICHE ═══             (v11.15)
   Troisième dessin d'onglet, et le dernier : il ne remplace pas
   .tabs / .pgt, il répond à un autre besoin. Ceux-là posent une
   barre AU-DESSUS d'un contenu ; celui-ci vit DANS l'en-tête de
   fiche, sous le nom de la personne.

   Ce qu'on y gagne se mesure : une barre séparée coûte sa hauteur
   plus deux marges — une soixantaine de pixels avant le premier mot
   du dossier. Ici, la carte d'identité et la navigation ne font
   qu'un bloc, et le nom du salarié reste collé à ses onglets : on
   ne se demande jamais de qui on lit la fiche.

   D'où le soulignement plutôt que la pastille : sur un fond crème
   déjà encadré, une pastille blanche dans un cadre blanc ne se
   détache plus. Le filet terracotta, lui, se lit. */
.bandtabs{display:flex;gap:2px;margin:14px -18px -16px;padding:0 12px;
  border-top:1px solid var(--ligne);background:var(--surface-2);
  border-radius:0 0 var(--r) var(--r);overflow-x:auto;scrollbar-width:none}
.bandtabs::-webkit-scrollbar{display:none}
.bandtabs .ftab{border:0;background:none;border-radius:0;padding:11px 15px;
  border-bottom:2px solid transparent;font-size:13.5px;font-weight:600;color:var(--muet);
  white-space:nowrap;flex:none}
.bandtabs .ftab:hover{border-color:transparent;color:var(--encre);background:none}
.bandtabs .ftab.on{background:none;color:var(--encre);border-bottom-color:var(--terra)}
.bandtabs .ftab .n{background:var(--ligne);color:var(--encre-2)}
.bandtabs .ftab.on .n{background:var(--terra);color:#fff}
.bandtabs .ftab .n.al{background:var(--rouge);color:#fff}

.ftabs{display:flex;gap:5px;margin:14px 0;flex-wrap:wrap}
.ftab{display:inline-flex;align-items:center;gap:8px;padding:8px 14px;border:1px solid var(--ligne);
  background:var(--carte);border-radius:11px;font-family:var(--f-ui);font-size:12.5px;font-weight:600;
  color:var(--encre-2);cursor:pointer;box-shadow:var(--ombre)}
.ftab .n{font-size:10px;font-weight:700;background:var(--surface-2);border-radius:9px;padding:0 6px;color:var(--muet)}
.ftab .n.al{background:var(--rouge-pale);color:var(--rouge)}
.ftab:hover{border-color:var(--muet)}
.ftab.on{background:var(--encre);border-color:var(--encre);color:#fff}
.ftab.on .n{background:rgba(255,255,255,.2);color:#fff}
.dospane .pane{display:none}
.dospane .pane.on{display:block}
.apgrid{display:grid;grid-template-columns:minmax(0,1fr) 340px;gap:14px;align-items:start}
.g3s{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:14px;align-items:start}
@media(max-width:1150px){.apgrid,.g3s{grid-template-columns:1fr}}
.stat5{display:flex;gap:14px;padding:14px 16px;flex-wrap:wrap}
.stat5 .s5{flex:1;min-width:110px}
.stat5 .s5 b{display:block;font-family:var(--f-titre);font-size:21px;font-weight:700;line-height:1.1}
.stat5 .s5 b.p{color:var(--vert)} .stat5 .s5 b.m{color:var(--rouge)}
.stat5 .s5 span{display:block;font-size:11px;color:var(--muet)}
.stat5 .s5 .d{font-size:10.5px;color:var(--muet)}
.kvl{display:flex;justify-content:space-between;gap:12px;padding:9px 16px;border-bottom:1px solid var(--ligne);
  font-size:12.5px}
.kvl:last-child{border-bottom:none}
.kvl span{color:var(--encre-2)}
.kvl b{font-weight:600;text-align:right}
.kvl b.miss{color:var(--rouge)}
.vigl{display:flex;align-items:center;gap:11px;padding:11px 16px;border-bottom:1px solid var(--ligne)}
.vigl:last-child{border-bottom:none}
.vigl .ic{width:26px;height:26px;border-radius:8px;display:flex;align-items:center;justify-content:center;
  font-weight:700;flex:none;font-size:13px}
.vigl.r .ic{background:var(--rouge-pale);color:var(--rouge)}
.vigl.w .ic{background:var(--jaune-pale);color:var(--jaune)}
.vigl .tx{flex:1;font-size:12.5px;font-weight:600}
.semh{display:grid;grid-template-columns:repeat(7,1fr);gap:4px;padding:12px 16px 4px;font-size:9.5px;
  color:var(--muet);text-align:center;text-transform:uppercase;font-weight:700}
.semg{display:grid;grid-template-columns:repeat(7,1fr);gap:4px;padding:0 16px 14px}
.semg div{height:34px;border-radius:7px;display:flex;align-items:center;justify-content:center;
  font-family:var(--f-titre);font-size:11.5px;font-weight:700;background:var(--surface-2);color:var(--muet)}
.semg div.w{background:var(--vert-pale);color:var(--vert)}
.semg div.a{background:var(--violet-pale);color:var(--violet)}
.semg div.auj{box-shadow:inset 0 0 0 2px var(--terra)}
/* ── DEUX CRÉNEAUX LE MÊME JOUR ──                         (v11.78)
   « Indisponible le matin » ET « indisponible en soirée » le même
   lundi : la case s'allonge et les empile plutôt que de n'en montrer
   qu'un. Elle ne grandit QUE dans ce cas — une grille dont toutes les
   cases font deux lignes pour une seule qui en a besoin se lit moins
   bien. Modificateur, jamais objet : « .ind2 » n'existe pas seul. */
.semg div.ind2{height:auto;min-height:34px;flex-direction:column;gap:1px;
  padding:5px 3px;font-size:9.5px;line-height:1.25}

/* ═══ v7.29 · Autocomplétion d'adresse (BAN) ═══ */
.banbox{position:absolute;z-index:400;background:var(--carte);border:1px solid var(--ligne);
  border-radius:12px;box-shadow:var(--ombre-2);overflow:hidden;max-width:520px}
.banit{display:block;width:100%;text-align:left;border:none;background:none;padding:9px 13px;
  cursor:pointer;font-family:var(--f-ui);font-size:13px;color:var(--encre)}
.banit b{display:block;font-weight:600}
.banit span{font-size:11.5px;color:var(--muet)}
.banit:hover,.banit.on{background:var(--terra-pale)}
.banpied{padding:6px 13px;font-size:10.5px;color:var(--muet);background:var(--surface-2);
  border-top:1px solid var(--ligne)}
/* ═══ v7.29 · Formulaire de contrat : sections et unités ═══ */
.fsec2{font-size:10px;font-weight:700;letter-spacing:.09em;text-transform:uppercase;color:var(--muet);
  margin:18px 0 10px;padding-top:14px;border-top:1px solid var(--ligne)}
.fsec2:first-child{margin-top:0;padding-top:0;border-top:none}
.fbloc{background:var(--surface-2);border:1px solid var(--ligne);border-radius:12px;padding:12px 13px;
  margin-bottom:12px}
.fbloc .fg:last-child{margin-bottom:0}
.funit{position:relative;display:block}
.funit input{padding-right:30px;width:100%}
.funit span{position:absolute;right:11px;top:50%;transform:translateY(-50%);font-size:12px;color:var(--muet)}
.fhelp b.alr{color:var(--rouge)} .fhelp b.alw{color:var(--jaune)}

/* ═══ v7.29 · Hiérarchie de la fiche : le bloquant d'abord ═══ */
.alertefiche{display:flex;align-items:center;gap:13px;background:var(--rouge-pale);
  border:1px solid #EED6D7;border-left:4px solid var(--rouge);border-radius:12px;
  padding:12px 15px;margin-bottom:14px}
.alertefiche .ic{width:26px;height:26px;border-radius:50%;background:var(--rouge);color:#fff;
  display:flex;align-items:center;justify-content:center;font-weight:700;flex:none}
.alertefiche .tx{flex:1;font-size:12.5px;color:#8A2C31;line-height:1.5}
.alertefiche .tx b{display:block;font-family:var(--f-titre);font-size:13.5px;color:var(--rouge)}
.alertefiche .btn{background:#fff;border-color:#E3BFC1;color:var(--rouge);font-weight:700}
.alertefiche .btn:hover{background:var(--rouge);border-color:var(--rouge);color:#fff}
.ch.chko{background:var(--rouge-pale);border-bottom-color:#EED6D7}
.ch.chko h3{color:var(--rouge)}

/* ═══ v7.30 · Listes déroulantes avec recherche ═══
   Un <select> natif à 180 pays oblige à faire défiler ; ici on tape. */
.selr{position:relative}
.selrb{display:flex;align-items:center;gap:8px;width:100%;text-align:left;background:#fff;
  border:1px solid var(--ligne-2);border-radius:10px;padding:8px 11px;font-family:var(--f-ui);
  font-size:13px;color:var(--encre);cursor:pointer;min-height:38px}
.selrb:hover{border-color:var(--muet)}
.selrb .lbl{flex:1;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.selrb .car{color:var(--muet);font-size:12px}
.selrb.vide .lbl{color:var(--muet)}
.selrp{position:absolute;z-index:400;background:var(--carte);border:1px solid var(--ligne);
  border-radius:12px;box-shadow:var(--ombre-2);overflow:hidden;max-width:420px}
.selrs{padding:8px;border-bottom:1px solid var(--ligne);background:var(--surface-2)}
.selrs input{width:100%;font-family:var(--f-ui);font-size:13px;border:1px solid var(--ligne-2);
  border-radius:9px;padding:7px 10px;background:#fff}
.selrs input:focus{outline:none;border-color:var(--terra)}
.selrl{max-height:264px;overflow-y:auto}
.selro{display:flex;align-items:center;gap:8px;width:100%;text-align:left;border:none;background:none;
  padding:8px 13px;cursor:pointer;font-family:var(--f-ui);font-size:13px;color:var(--encre)}
.selro i{margin-left:auto;font-style:normal;color:var(--terra)}
.selro:hover,.selro.on{background:var(--terra-pale)}
.selro.sel{font-weight:600}
.selrv{padding:14px;text-align:center;color:var(--muet);font-size:12.5px}

/* ═══ v7.35 · Champ téléphone (forme B) ═══
   Un seul bloc : l'indicatif est un préfixe cliquable, pas un
   second champ. Le drapeau confirme le pays d'un coup d'œil. */
.telf{display:flex;align-items:stretch;border:1px solid var(--ligne-2);border-radius:10px;
  background:#fff;overflow:hidden}
.telf:focus-within{border-color:var(--terra)}
.telpfx{display:flex;align-items:center;gap:6px;padding:0 10px;background:var(--surface-2);
  border:none;border-right:1px solid var(--ligne);cursor:pointer;font-family:var(--f-ui);
  font-size:13px;color:var(--encre);white-space:nowrap}
.telpfx:hover{background:var(--terra-pale)}
.telpfx .dr{font-size:15px;line-height:1}
.telpfx .chv{font-size:10px;color:var(--muet)}
.telnum{flex:1;min-width:0;border:none;padding:9px 11px;font-family:var(--f-ui);font-size:13.5px;
  font-variant-numeric:tabular-nums;letter-spacing:.02em;background:none;color:var(--encre)}
.telnum:focus{outline:none}
.telnum.ko{background:#FFFDF6}
.telpop{position:absolute;z-index:400;width:266px;background:var(--carte);border:1px solid var(--ligne);
  border-radius:12px;box-shadow:var(--ombre-2);overflow:hidden}
.telpop .tr{padding:8px;border-bottom:1px solid var(--ligne);background:var(--surface-2)}
.telpop .tr input{width:100%;border:1px solid var(--ligne-2);border-radius:9px;padding:7px 10px;
  font-family:var(--f-ui);font-size:13px;background:#fff}
.telpop .tr input:focus{outline:none;border-color:var(--terra);box-shadow:0 0 0 3px var(--terra-pale)}
.telpop .tl{max-height:240px;overflow-y:auto}
.telpop .topt{display:flex;align-items:center;gap:9px;width:100%;border:none;background:none;
  padding:8px 12px;cursor:pointer;font-family:var(--f-ui);font-size:13px;text-align:left;color:var(--encre)}
.telpop .topt .ind{margin-left:auto;color:var(--muet);font-size:12px}
.telpop .topt:hover{background:var(--terra-pale)}
.telpop .topt.on{font-weight:600}
.telpop .tvide{padding:14px;text-align:center;color:var(--muet);font-size:12.5px}
.fi.ko{border-color:var(--jaune);box-shadow:0 0 0 3px var(--jaune-pale)}
.fhelp .alv{color:var(--vert);font-weight:600}
.fnir{display:flex;gap:8px;align-items:center}
.fnir .fi{flex:1;font-variant-numeric:tabular-nums;letter-spacing:.04em}
.fnir .btn.cache{display:none}

/* Bascule temps plein / temps partiel */
.segf{display:flex;background:var(--surface-2);border:1px solid var(--ligne);border-radius:10px;padding:3px}
.segf button{flex:1;border:none;background:none;font-family:var(--f-ui);font-weight:600;font-size:12.5px;
  color:var(--encre-2);padding:7px 10px;border-radius:8px;cursor:pointer}
.segf button.on{background:#fff;color:var(--encre);box-shadow:var(--ombre)}

/* ═══ v7.32 · Titres de section dans les formulaires ═══
   Un intertitre en petites capitales grises se confond avec une
   aide ; il faut un vrai titre pour découper un formulaire long. */
.ftitre{font-family:var(--f-titre);font-size:15px;font-weight:700;color:var(--encre);
  margin:22px 0 12px;padding-bottom:8px;border-bottom:2px solid var(--terra-pale);
  display:flex;align-items:center;gap:9px}
.ftitre::before{content:'';width:4px;height:16px;border-radius:2px;background:var(--terra);flex:none}
.pb > .ftitre:first-child,.estep > .ftitre:first-child{margin-top:0}
/* Bulle d'information : le détail d'un calcul, à la demande */
.bulle{display:inline-flex;align-items:center;justify-content:center;width:16px;height:16px;
  border-radius:50%;background:var(--surface-2);border:1px solid var(--ligne-2);color:var(--muet);
  font-size:10px;font-weight:700;cursor:help;position:relative;margin-left:5px}
.bulle:hover,.bulle:focus{background:var(--encre);border-color:var(--encre);color:#fff;outline:none}
.bulle .bt{position:absolute;bottom:calc(100% + 8px);left:50%;transform:translateX(-50%);
  width:290px;background:var(--encre);color:#fff;border-radius:10px;padding:10px 12px;font-size:11.5px;
  font-weight:400;line-height:1.55;box-shadow:var(--ombre-2);opacity:0;pointer-events:none;
  transition:opacity .12s;z-index:60;text-align:left}
.bulle:hover .bt,.bulle:focus .bt{opacity:1}
.bulle .bt::after{content:'';position:absolute;top:100%;left:50%;transform:translateX(-50%);
  border:6px solid transparent;border-top-color:var(--encre)}
/* v14.146 : sans place au-dessus, la bulle s'ouvre dessous. */
.bulle .bt.btbas{bottom:auto;top:calc(100% + 8px)}
.bulle .bt.btbas::after{top:auto;bottom:100%;border-top-color:transparent;border-bottom-color:var(--encre)}
/* v14.153 : la bulle n'hérite plus de son en-tête — une colonne en
   capitales l'écrivait en capitales, un bloc de tiroir aussi. Et elle
   sort de son cadre : footer.php la pose en position fixe, dans la
   fenêtre, là où rien ne la coupe. */
.bulle .bt,.dwr .blk .bulle .bt{text-transform:none;letter-spacing:normal;white-space:normal;
  font-style:normal;font-size:11.5px;font-weight:400;font-family:var(--f-ui);color:#fff;word-break:normal;margin:0}
.bulle .bt.btfx,.dwsh .bulle .bt.btfx{position:fixed;left:var(--fl, 0px);right:auto;top:var(--ft, 0px);bottom:auto;
  transform:none;max-width:calc(100vw - 16px)}
.bulle .bt.btfx::after,.dwsh .bulle .bt.btfx::after{left:var(--fa, 50%);right:auto;transform:translateX(-50%)}
.kithelp{font-size:12px;color:var(--encre-2);line-height:1.6;background:var(--surface-2);
  border:1px solid var(--ligne);border-radius:10px;padding:10px 12px}

/* ═══ v7.33 · Assistant d'avenant ═══ */
.avetapes{display:flex;gap:10px;margin-bottom:14px}
.avetapes span{flex:1;font-size:11.5px;font-weight:700;color:var(--muet);padding-bottom:7px;
  border-bottom:2px solid var(--ligne)}
.avetapes span.on{color:var(--terra-h);border-bottom-color:var(--terra)}
.legal2{display:flex;gap:11px;align-items:flex-start;border:1px solid #DED2E4;background:var(--violet-pale);
  color:#5C3F59;border-radius:12px;padding:12px 14px;font-size:12px;line-height:1.55;margin-bottom:6px}
.legal2 svg{width:17px;height:17px;flex:none;margin-top:1px}
.legal2 b{display:block;font-weight:700;margin-bottom:2px}
.legal2.bl{border-color:#D6DDEE;background:var(--bleu-pale);color:#3D4E7A}
.avport{display:grid;gap:9px}
.avp{display:flex;gap:11px;align-items:flex-start;border:1px solid var(--ligne-2);border-radius:12px;
  padding:11px 13px;cursor:pointer}
.avp:has(input:checked){border-color:var(--terra);box-shadow:0 0 0 3px var(--terra-pale)}
.avp input{margin-top:2px;accent-color:var(--terra)}
.avp b{display:block;font-size:13px;font-weight:600}
.avp i{font-style:normal;font-size:11.5px;color:var(--muet);line-height:1.5}
.avchamps{display:grid;gap:2px}
/* v11.16 — .avc redessinait la case à cocher du kit avec un autre
   survol et une autre coche. Elle ne porte plus que l'espacement de
   la liste ; le dessin vient de .chk, comme partout ailleurs. */
.avc{padding:9px 11px;border-radius:10px;align-items:center}
.avc:hover{background:var(--surface-2)}
.avbloc{margin-bottom:6px}
.avbloc .ftitre{font-size:13px;margin:16px 0 10px}

/* ═══ v7.33 · Choix et ordre des colonnes ═══ */
.colpop{position:absolute;z-index:300;width:280px;background:var(--carte);border:1px solid var(--ligne);
  border-radius:12px;box-shadow:var(--ombre-2);overflow:hidden}
.colpop .cph{display:flex;align-items:center;gap:10px;padding:11px 13px;border-bottom:1px solid var(--ligne);
  background:var(--surface-2);font-size:12.5px}
.colpop .cph b{flex:1;font-weight:600}
.colpop .cpl{max-height:320px;overflow-y:auto;padding:5px}
.cpi{display:flex;align-items:center;gap:9px;padding:7px 9px;border-radius:9px;cursor:grab;font-size:12.5px}
.cpi:hover{background:var(--surface-2)}
.cpi.drag{opacity:.4}
.cpi .poi{color:var(--ligne-2);font-size:12px;cursor:grab}
.colpop .cpf{padding:9px 13px;border-top:1px solid var(--ligne);font-size:11px;color:var(--muet);line-height:1.5}
.avchg{display:flex;align-items:center;gap:8px;font-size:11.5px;margin-top:5px;flex-wrap:wrap}
.avchg > span:first-child{color:var(--muet);min-width:150px}
.avchg b{font-weight:700}
.avchg b.old{color:var(--muet);text-decoration:line-through;font-weight:500}
.avchg .fl2{color:var(--ligne-2)}

/* ═══ v7.35 · Mode développeur ═══
   Rouge, partout : c'est un pouvoir sur toutes les organisations,
   il ne doit jamais se confondre avec un réglage client. */
:root{--dev:#B3261E}
.rail .lkdev,.rflyout .lkdev{color:var(--dev);font-weight:700}
.rail .lkdev .fic,.rflyout .lkdev .fic{color:var(--dev)}
.rail .lkdev.on,.rflyout .lkdev.on{background:#FBE9E7;color:var(--dev)}
.devbar{background:var(--dev);color:#fff;padding:9px 20px;display:flex;align-items:center;gap:12px;
  font-size:12.5px;border-radius:12px;margin-bottom:16px;flex-wrap:wrap}
.devbar b{font-family:var(--f-titre);font-weight:700}
.devbar .sp{flex:1}
.devbar .btn{background:rgba(255,255,255,.15);border:1px solid rgba(255,255,255,.35);color:#fff;
  border-radius:8px;padding:4px 11px;font-size:12px;font-weight:600;text-decoration:none}
.devbar .btn:hover{background:#fff;color:var(--dev)}
.devtabs{display:flex;gap:6px;margin-bottom:16px;flex-wrap:wrap}
.devtab{display:inline-flex;align-items:center;padding:8px 14px;border:1px solid var(--ligne);
  background:var(--carte);border-radius:11px;text-decoration:none;color:var(--encre-2);
  font-size:13px;font-weight:600;box-shadow:var(--ombre)}
.devtab:hover{border-color:var(--muet)}
.devtab.on{background:var(--dev);border-color:var(--dev);color:#fff}
.note.dv{background:#FBE9E7;color:#8E1D17;border:1px solid #F2C7C2;display:flex;gap:10px;
  align-items:flex-start;border-radius:11px;padding:11px 13px;font-size:12px;line-height:1.55;margin-bottom:14px}
.note.dv b{display:block;font-weight:700;margin-bottom:2px}
.btn.dv{background:var(--dev);border-color:var(--dev);color:#fff}
.btn.dv:hover{background:#8E1D17;border-color:#8E1D17}
.tA tr.sel td{background:var(--terra-pale)}
.socform{display:flex;gap:12px;align-items:flex-end;padding:14px 16px;border-bottom:1px solid var(--ligne);
  background:var(--surface-2);flex-wrap:wrap}
.socform .fg{margin:0;min-width:150px}
.hline2{display:flex;align-items:center;gap:12px;padding:11px 16px;border-bottom:1px solid var(--ligne);font-size:12.5px}
.hline2:last-child{border-bottom:none}
.hline2.fut{background:var(--jaune-pale)}
.hline2 .d{min-width:92px;font-family:var(--f-titre);font-weight:700;font-size:11.5px;color:var(--muet)}
.hline2 .c{flex:1}
.hline2 .c b{font-family:var(--f-titre);font-size:14px}
.hline2 .c i{font-style:normal;display:block;font-size:11.5px;color:var(--muet)}
.res{background:var(--encre);color:#fff;border-radius:12px;padding:14px 16px;font-size:13px;line-height:1.7;
  margin-top:12px}
.res b{font-family:var(--f-titre);font-size:19px;display:block}
.res .l{opacity:.75;font-size:11.5px;display:block}
.socgrid{display:grid;grid-template-columns:repeat(auto-fill,minmax(230px,1fr));gap:1px;background:var(--ligne)}
.socv{background:var(--carte);padding:11px 14px}
.socv i{display:block;font-style:normal;font-size:11px;color:var(--muet);margin-bottom:2px}
.socv b{font-family:var(--f-titre);font-size:15px}
.lede2{color:var(--encre-2);line-height:1.6;max-width:880px;margin:0 0 16px}

/* ═══ v7.36 · Préférences de notification ═══
   Un tableau : une ligne par événement, une colonne par canal. La
   forme dit tout de suite qu'on peut choisir moyen par moyen. */
.ntable{display:block}
.nth,.ntr{display:grid;grid-template-columns:minmax(0,1fr) repeat(4,100px);gap:0;align-items:center}
.nth{background:var(--surface-2);border-bottom:1px solid var(--ligne);padding:10px 16px}
.nth .nlbl{font-size:10px;font-weight:700;letter-spacing:.07em;text-transform:uppercase;color:var(--muet)}
.nth .ncan{text-align:center}
.nth .ncan b{display:block;font-size:11.5px;font-weight:700}
.nth .ncan i{display:block;font-style:normal;font-size:10px;color:var(--muet);line-height:1.35;margin-top:2px}
.ntr{padding:11px 16px;border-bottom:1px solid var(--ligne)}
.ntr:last-child{border-bottom:none}
.ntr:hover{background:var(--surface-2)}
.ntr .nlbl b{display:block;font-weight:600;font-size:13px}
.ntr .nlbl i{font-style:normal;font-size:11.5px;color:var(--muet)}
.ntr .ncan{display:flex;justify-content:center}
.ngrp{background:var(--surface-2);padding:7px 16px;font-size:10.5px;font-weight:700;letter-spacing:.07em;
  text-transform:uppercase;color:var(--encre-2);border-bottom:1px solid var(--ligne);
  border-top:1px solid var(--ligne)}
/* v14.253 : la catégorie et son interrupteur, au-dessus de ses lignes. */
.ngrp.ncat{display:flex;align-items:center;justify-content:space-between;gap:12px;padding:8px 16px}
.ntr.ncoupe{opacity:.4;pointer-events:none}
@media(max-width:760px){
  .nth{display:none}
  .ntr{grid-template-columns:1fr;gap:8px}
  .ntr .ncan{justify-content:flex-start}
}

/* ═══ v7.37 · Bandeau et rubrique développeur ═══
   Rouge et en haut de tout : une simulation invisible ferait croire
   à des bugs qui n'existent pas. */
.devband{position:sticky;top:0;z-index:900;background:var(--dev,#B3261E);color:#fff;
  display:flex;align-items:center;gap:12px;padding:8px 18px;font-size:12.5px}
.devband.sim{background:#8E1D17;box-shadow:inset 0 -3px 0 rgba(255,255,255,.35)}
.devband .ic{display:flex}
.devband .ic svg{width:16px;height:16px}
.devband b{font-family:var(--f-titre);font-weight:700;white-space:nowrap}
.devband .tx{opacity:.92;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.devband .sp{flex:1}
.devband .dbtn{background:rgba(255,255,255,.14);border:1px solid rgba(255,255,255,.4);color:#fff;
  border-radius:8px;padding:4px 11px;font-family:var(--f-ui);font-size:12px;font-weight:600;
  cursor:pointer;text-decoration:none;white-space:nowrap}
.devband .dbtn:hover{background:#fff;color:var(--dev,#B3261E)}
.devband .dbtn.plein{background:#fff;color:var(--dev,#B3261E)}
.devband .dbtn.plein:hover{background:rgba(255,255,255,.85)}
body.aveedev .rail{top:37px;height:calc(100vh - 37px)}
.devpop{text-transform:none;position:absolute;z-index:950;width:340px;background:var(--carte);border:1px solid var(--ligne);
  border-radius:14px;box-shadow:var(--ombre-2);overflow:hidden}
.devpop .dvh{padding:12px 15px;background:#FBE9E7;border-bottom:1px solid #F2C7C2;color:#8E1D17}
.devpop .dvh b{display:block;font-family:var(--f-titre);font-size:13.5px;text-transform:none}
.devpop .dvh span{font-size:11.5px;line-height:1.5;display:block;margin-top:3px}
.devpop .dvb{padding:14px 15px}
.devpop .dvb .fg{margin-bottom:11px}
.devpop .dvf{display:flex;gap:8px;justify-content:flex-end;padding:12px 15px;border-top:1px solid var(--ligne);
  background:var(--surface-2)}
.devpop .dbtn{border:1px solid var(--ligne-2);background:#fff;color:var(--encre);border-radius:9px;
  padding:7px 13px;font-family:var(--f-ui);font-size:12.5px;font-weight:600;cursor:pointer}
.devpop .dbtn.plein{background:var(--dev,#B3261E);border-color:var(--dev,#B3261E);color:#fff}
.rail .rit.ritdev{color:var(--dev,#B3261E)}
.rail .rit.ritdev svg{color:var(--dev,#B3261E)}
.rail .rit.ritdev.on{background:#FBE9E7;color:var(--dev,#B3261E)}

/* ═══ v7.38 · Organisations (mode dev) et centre d'aide ═══ */
.orgbloc{border-top:1px solid var(--ligne);padding:14px 16px}
.orgbloc.off{background:var(--surface-2);opacity:.72}
.orgh{display:flex;align-items:flex-start;gap:12px;flex-wrap:wrap}
.orgn{flex:1;min-width:220px}
.orgn b{font-family:var(--f-titre);font-size:15px;font-weight:700;margin-right:8px}
.orgn i{display:block;font-style:normal;font-size:11.5px;color:var(--muet);margin-top:3px}
.orga{display:flex;gap:7px}
.orgedit{display:flex;gap:8px;align-items:center;margin-top:10px}
.orgedit .fi{flex:1;max-width:340px}
.orget{display:flex;align-items:center;gap:11px;padding:10px 12px;margin-top:9px;
  background:var(--surface-2);border:1px solid var(--ligne);border-radius:11px}
.orget.encours{border-color:var(--dev,#B3261E);background:#FBE9E7}
.orget .ic{width:16px;height:16px;color:var(--muet);flex:none}
.orget .n{flex:1;font-size:13px;font-weight:600}
.orget .n i{display:block;font-style:normal;font-size:11.5px;font-weight:400;color:var(--muet)}
.simf{display:flex;gap:7px;align-items:center}
.simf .fi{width:150px}
.g2s{display:grid;grid-template-columns:repeat(auto-fit,minmax(320px,1fr));gap:14px;align-items:start}
.aidart{display:flex;align-items:center;gap:10px;padding:11px 16px;border-top:1px solid var(--ligne);font-size:12.5px}
.aidart .n{flex:1;min-width:0}
.aidart .n b{display:block;font-weight:600}
.aidart .n i{font-style:normal;font-size:11.5px;color:var(--muet)}
.aidlien{display:block;padding:12px 16px;border-top:1px solid var(--ligne);text-decoration:none;color:inherit}
.aidlien:first-of-type{border-top:none}
.aidlien:hover{background:var(--surface-2)}
.aidlien b{display:block;font-weight:600;font-size:13.5px;color:var(--terra-h)}
.aidlien i{font-style:normal;font-size:12px;color:var(--muet)}
/* .aidcorps : réécrit en v14.8, avec le centre d'aide (fin du fichier). */
/* L'attribut hidden perd contre un display:flex : on le rétablit,
   sinon les formulaires repliés s'affichent tous ouverts. */
.socform[hidden],.orgedit[hidden]{display:none}
/* ── LE TITRE DE GROUPE CHUCHOTE, ET IL COLLE ──            (v13.5)
   La v7.40 lui donnait le même poids qu'un titre de rubrique : 14 px
   gras foncé, une icône, un trait pleine largeur. L'entrée, elle,
   est en 13 px moyen gris — ce qu'on lisait d'abord était donc ce
   qu'on ne pouvait pas cliquer, et trois traits coupaient le panneau
   en trois petits menus.

   Il devient une étiquette : petites capitales, muette, sans icône
   (celle de l'entrée suffit à distinguer les lignes ; deux icônes de
   même famille l'une sur l'autre brouillent la hiérarchie au lieu de
   la poser) et sans trait — l'espace au-dessus sépare aussi bien.

   Et il COLLE : dans un panneau qui défile, savoir dans quel groupe
   on se trouve vaut plus qu'un trait. Les marges négatives le font
   saigner jusqu'aux bords du panneau, sinon les entrées défileraient
   dans les 8 px de marge, à côté de lui. */
.rfly .fgr{position:relative}
.rfly .ft.fgrp{position:sticky;top:0;z-index:2;background:var(--carte);
  display:block;font-family:inherit;font-size:10.5px;font-weight:700;letter-spacing:.07em;
  text-transform:uppercase;color:var(--muet);
  border:0;margin:0 -8px;padding:12px 20px 4px}
.rfly .fgr:first-child .ft.fgrp{padding-top:2px}
.rfly .ft.fgrp .fic{display:none}
/* Le premier lien d'un panneau respire sous le titre de rubrique ;
   dans un groupe, le titre a déjà posé cette respiration. */
.rfly .fgr .ft.fgrp + a{margin-top:1px}
.etnum{width:24px;height:24px;border-radius:50%;background:var(--dev,#B3261E);color:#fff;
  display:flex;align-items:center;justify-content:center;font-family:var(--f-titre);font-weight:700;
  font-size:12px;flex:none}

/* ═══ v7.41 · Formules d'abonnement ═══ */
.formules{display:grid;grid-template-columns:repeat(auto-fit,minmax(250px,1fr));gap:14px;padding:16px}
.form1{border:1px solid var(--ligne-2);border-radius:14px;padding:15px;background:#fff;display:flex;
  flex-direction:column}
.form1.brouil{background:var(--surface-2);border-style:dashed}
.form1 h4{font-family:var(--f-titre);font-size:16px;margin:0 0 3px;display:flex;align-items:center;gap:7px}
.form1 .sous{font-size:11.5px;color:var(--muet);min-height:32px;line-height:1.5}
.form1 .prix{font-family:var(--f-titre);font-size:26px;font-weight:700;margin:10px 0 0}
.form1 .prix span{font-size:12px;font-weight:600;color:var(--muet)}
.form1 .par{font-size:11.5px;color:var(--encre-2);margin-bottom:12px}
.form1 ul{margin:0 0 auto;padding:0;list-style:none;font-size:12px}
.form1 li{display:flex;gap:8px;align-items:flex-start;padding:4px 0;color:var(--encre-2)}
.form1 li .ic{color:var(--vert);font-weight:700;flex:none}
.form1 li .ic.opt{color:var(--jaune)}
.form1 .pied{margin-top:13px;padding-top:11px;border-top:1px solid var(--ligne);display:flex;gap:7px;
  align-items:center}
.simline{display:flex;align-items:center;gap:12px;padding:9px 0;font-size:13px;border-bottom:1px solid var(--ligne)}
.simline:last-child{border-bottom:none}
.simline > label:not(.sw){flex:1;color:var(--encre-2)}
.simline .fi{width:130px;text-align:right}
.simline select.fi{text-align:left}
/* Recherche d'entreprise */
.entsearch .entres,.entsearch .entetabs{border:1px solid var(--ligne);border-radius:12px;margin-top:9px;
  overflow:hidden;background:#fff}
.entsearch .entres:empty{display:none}
.enttitre{padding:9px 13px;background:var(--surface-2);border-bottom:1px solid var(--ligne);
  font-size:10px;font-weight:700;letter-spacing:.07em;text-transform:uppercase;color:var(--muet)}
.entitem{display:flex;gap:12px;align-items:flex-start;padding:11px 13px;border-top:1px solid var(--ligne);
  cursor:pointer}
.entitem:first-child{border-top:none}
.entitem:hover{background:var(--terra-pale)}
.entitem.sel{background:var(--terra-pale);box-shadow:inset 3px 0 0 var(--terra)}
.entitem .n{flex:1;min-width:0}
.entitem .n b{display:block;font-weight:600;display:flex;align-items:center;gap:7px;flex-wrap:wrap}
.entitem .n i{font-style:normal;font-size:11.5px;color:var(--muet);line-height:1.5}
.entbadge{font-size:10px;font-weight:700;border-radius:6px;padding:2px 7px;background:var(--surface-2);
  color:var(--muet);font-family:ui-monospace,monospace;flex:none}

/* ═══ v7.42 · Encarts d'information ═══
   La classe « note i » était employée dans dix écrans sans avoir
   jamais été définie : les encarts s'affichaient en texte brut, au
   milieu d'un formulaire, sans qu'on distingue l'explication du
   champ à remplir. */
.note{display:flex;gap:10px;align-items:flex-start;border-radius:11px;padding:11px 13px;
  font-size:12px;line-height:1.55;margin:0 0 14px}
.note > span:first-child{flex:none;font-size:14px;line-height:1.3;opacity:.85}
/* Le gras d'une note est un TITRE quand il ouvre le message, et une
   simple emphase partout ailleurs. La règle valait pour tous les
   « b » : une note qui insistait sur deux mots au milieu d'une
   phrase se retrouvait coupée en trois lignes (corrigé en v11.5). */
.note b{font-weight:700}
.note > span:last-child > b:first-child{display:block;margin-bottom:2px}
.note.i{background:var(--bleu-pale);color:#3D4E7A;border:1px solid #D6DDEE}
.note.w{background:var(--jaune-pale);color:#7A5410;border:1px solid #EEDFBB}
.note.k{background:var(--rouge-pale);color:#8A2C31;border:1px solid #EED6D7}
.note a{color:inherit;font-weight:600}

/* ═══ v7.43 · Barre d'étapes d'un parcours ═══
   Un formulaire long sans annonce se referme : les étapes disent
   d'emblée ce qu'il faudra fournir. */
.etapes{display:flex;gap:9px;margin-bottom:16px;flex-wrap:wrap}
.etape{flex:1;min-width:170px;background:var(--carte);border:1px solid var(--ligne);border-radius:12px;
  padding:11px 13px;font-size:12px;display:flex;gap:10px;align-items:center;box-shadow:var(--ombre)}
.etape.on{border-color:var(--dev,#B3261E);box-shadow:0 0 0 3px #FBE9E7}
.etape.fait{background:var(--vert-pale);border-color:#CFE0C1}
.etape .n{width:24px;height:24px;border-radius:50%;background:var(--surface-2);color:var(--muet);
  display:flex;align-items:center;justify-content:center;font-family:var(--f-titre);font-weight:700;
  font-size:12px;flex:none}
.etape.on .n{background:var(--dev,#B3261E);color:#fff}
.etape.fait .n{background:var(--vert);color:#fff}
.etape b{display:block;font-weight:600}
.etape i{font-style:normal;font-size:11px;color:var(--muet)}

/* ═══ v7.44 · Lignes de fonctionnalité d'une formule ═══
   Tout se règle sur la ligne : incluse, ou en supplément, et à quel
   prix. Un tableau où l'on lit sans cliquer. */
.modh,.modl{display:grid;grid-template-columns:minmax(0,1fr) 80px 190px 120px;gap:12px;align-items:center}
.modh{padding:0 0 8px;border-bottom:1px solid var(--ligne);font-size:10px;font-weight:700;
  letter-spacing:.07em;text-transform:uppercase;color:var(--muet)}
.modh .c{text-align:center}
.modl{padding:11px 0;border-bottom:1px solid var(--ligne)}
.modl:last-of-type{border-bottom:none}
.modl.socle{opacity:.72}
.modl.inclus .u,.modl.inclus .c:last-child{opacity:.4}
.modl .n b{font-weight:600;font-size:13px}
.modl .n i{display:block;font-style:normal;font-size:11.5px;color:var(--muet)}
.modl .c{display:flex;justify-content:center}
.modl .funit{width:100%}
@media(max-width:900px){
  .modh{display:none}
  .modl{grid-template-columns:1fr;gap:7px;padding:12px 0}
  .modl .c{justify-content:flex-start}
}

/* ═══ v7.45 · Changement d'abonnement daté ═══ */
.aboprev{display:flex;align-items:center;gap:11px;margin-top:10px;padding:10px 13px;
  background:var(--bleu-pale);border:1px solid #D6DDEE;border-radius:11px;font-size:12.5px;color:#3D4E7A}
.aboprev .ic{width:16px;height:16px;flex:none}
.aboform{display:flex;gap:12px;align-items:flex-end;flex-wrap:wrap;margin-top:12px;padding:13px;
  background:var(--surface-2);border:1px solid var(--ligne);border-radius:12px}
.aboform[hidden]{display:none}
.aboform .fg{margin:0;min-width:150px}

/* ═══ v7.48 · Borne de pointage ═══
   Écran mural : cibles larges, texte gros, contraste fort. On pointe
   avec des mains mouillées, en gants, à contre-jour. */
body.borne{margin:0;background:#F2EFE7;font-family:var(--f-ui);color:var(--encre);
  -webkit-user-select:none;user-select:none;overflow:hidden}
/* ═══ LA BORNE TIENT DANS L'ÉCRAN, ET ELLE DÉFILE ═══      (v14.38)

   Deux défauts, une seule cause.

   « Je ne peux pas défiler quand les shifts dépassent de la tablette »
   et « la colonne de gauche doit être de la hauteur disponible et non
   de la hauteur de l'app » sont le MÊME bug, vu de deux endroits.

   Un enfant de grille — comme un enfant de flex — porte
   « min-height:auto » par défaut : il ne descend JAMAIS sous la taille
   de son contenu. « .bapp » avait beau valoir 100vh, ses deux colonnes
   s'étiraient à la hauteur de ce qu'elles contenaient. Mesuré sur une
   tablette de 1024×768 avec vingt-neuf cartes : la colonne faisait
   1319 px de haut, et la dernière carte tombait 515 px SOUS le bas de
   l'écran. Comme « body » porte « overflow:hidden », elle était
   invisible et inatteignable : on ne pouvait ni la voir, ni la
   toucher, ni deviner qu'elle existait.

   Et « .bgrille » avait pourtant « overflow:auto » depuis toujours —
   sans effet, puisqu'elle avait la taille de son contenu : une zone
   qui fait la hauteur de ce qu'elle montre n'a rien à faire défiler.

   Trois « min-height:0 » réparent l'ensemble. Le reste tombe tout
   seul : la colonne se cale sur la hauteur de l'écran, sa zone médiane
   défile, son pied reste en vue, et la grille des cartes défile de son
   côté. */
.bapp{display:grid;grid-template-columns:320px 1fr;grid-template-rows:100%;
  height:100vh;height:100dvh;overflow:hidden}
.bside{background:#2C2418;color:#EFE9DC;padding:20px;display:flex;flex-direction:column;gap:14px;
  min-height:0;overflow:hidden}
.bhd{display:flex;align-items:center;justify-content:space-between}
.blogo{width:46px;height:46px;border-radius:12px;background:var(--terra);color:#fff;
  display:flex;align-items:center;justify-content:center;font-family:var(--f-titre);font-weight:700;font-size:16px}
.bhh{font-family:var(--f-titre);font-size:34px;font-weight:700;letter-spacing:-.02em}
.bcarte{background:rgba(255,255,255,.07);border-radius:14px;padding:15px}
.bcarte h4{font-family:var(--f-titre);font-size:16px;margin:0 0 10px}
.bli{display:flex;gap:10px;align-items:flex-start;font-size:12.5px;padding:6px 0;opacity:.92;line-height:1.45}
.bav{width:28px;height:28px;border-radius:50%;background:rgba(255,255,255,.14);flex:none;
  display:flex;align-items:center;justify-content:center;font-size:10.5px;font-weight:700}
/* Devenu un BOUTON en v14.36 : il recharge au clic. D'où la remise à
   zéro des styles de bouton, le curseur et le texte à gauche — un
   bouton centré se lirait comme une action, alors qu'il dit d'abord
   un état. */
.bstat{display:flex;gap:11px;align-items:center;background:rgba(85,128,59,.28);border-radius:12px;
  padding:11px 13px;font-size:12.5px;margin-top:auto;border:none;width:100%;
  text-align:left;color:inherit;font-family:var(--f-ui);cursor:pointer}
.bstat:hover{background:rgba(85,128,59,.4)}
.bstat.off{background:rgba(196,60,67,.3)}
.bstat.off:hover{background:rgba(196,60,67,.42)}
.bstat b{display:block}
.bstat i{font-style:normal;opacity:.8;font-size:11.5px;line-height:1.4}
.bstat .pt{width:10px;height:10px;border-radius:50%;background:#8FCB6B;flex:none}
.bstat.off .pt{background:#E88}
/* Le temps d'un rechargement demandé à la main : la pastille bat,
   sinon rien ne distingue « j'ai appuyé » de « il ne se passe rien ». */
.bstat.bstatwait .pt{animation:bstatbat .5s ease-in-out infinite}
@keyframes bstatbat{0%,100%{opacity:1;transform:scale(1)}50%{opacity:.35;transform:scale(.72)}}
.bpied{font-size:11px;opacity:.5;line-height:1.5}
.bmain{padding:20px;display:flex;flex-direction:column;gap:13px;min-width:0;
  min-height:0;overflow:hidden}
.bfiltres{display:flex;gap:9px;flex-wrap:wrap}
.bfil{border:none;background:#fff;border-radius:24px;padding:11px 18px;font-family:var(--f-ui);
  font-size:14px;font-weight:600;color:var(--encre-2);cursor:pointer;box-shadow:var(--ombre)}
.bfil span{opacity:.55;margin-left:4px}
.bfil.on{background:var(--encre);color:#fff}
.bfil.dr{background:#2C2418;color:#fff}
/* ═══ LA BARRE DE LA BORNE ═══                            (v14.36)
   Six filtres au lieu de quatre : « En poste » et « Terminés »
   manquaient, et sur une borne de fin de service ce sont les deux
   seules questions qu'on se pose.

   Un filtre à ZÉRO reste en place, pâli et inerte : le retirer
   ferait bouger la barre sous les doigts à chaque arrivée, et on
   appuierait sur le mauvais. */
.bfil.bfilvide{opacity:.42;pointer-events:none}
.bfil[disabled]{opacity:.35;pointer-events:none}
/* La bascule du planning n'est pas un filtre : elle ne restreint pas
   la liste, elle change ce qu'on regarde. D'où le trait, et la place
   à droite, avec les gestes. */
/* ── LA BASCULE « .bbasc » N'EXISTE PLUS ──                (v14.39)
   Elle vivait dans la rangée des gestes, à côté de « + Shift non
   planifié » : un bouton parmi sept pour changer de VUE. Les onglets
   « .bponglets » disent la même chose au bon rang, en haut, et ses
   règles sont parties avec elle plutôt que de rester à décorer une
   classe que plus personne ne pose. */
/* Le rang du bas : le champ prend la place, les gestes suivent. */
.brechrow{display:flex;gap:9px;align-items:stretch;flex-wrap:wrap}
/* `display:flex` l'emporte sur l'attribut `hidden` : sans cette
   ligne, la barre des gestes restait affichée sous le planning, et
   « + Shift non planifié » s'y lisait comme un geste du planning
   alors qu'il appartient à la liste (v14.39). */
.brechrow[hidden]{display:none}
.brechrow .brech{flex:1;min-width:200px;width:auto}
.brechrow .bfil{flex:none;white-space:nowrap}

/* ═══ LE PLANNING, EN VUE JOUR ═══                        (v14.39)

   « Fais quelque chose de ressemblant à la frise ou à la vue jour du
   vrai planning. » On reprend donc la grammaire de `jour.php` : la
   colonne des noms, l'en-tête des heures, l'effectif EN CHIFFRES, les
   blocs aux couleurs de leur étiquette avec la bordure gauche, le
   voile hachuré des pauses, et le repère de l'heure.

   Deux onglets de même rang remplacent la bascule discrète de la
   v14.36 : « on voit pas le planning » était juste — elle vivait en
   bas à droite, et il fallait savoir qu'elle existait.            */
/* Le repère de version, en pied de colonne : un dépannage, pas une
   information de service. Assez lisible pour être lu à voix haute au
   téléphone, assez discret pour ne pas se remarquer (v14.42). */
.bver{opacity:.55;font-variant-numeric:tabular-nums;letter-spacing:.02em}
/* L'état du lecteur qui ne peut PAS démarrer doit se distinguer de
   « Lecteur actif » : c'est une panne, pas un état. */
.bqrtx i.ko{color:#C4564E;opacity:1;font-weight:600}
body.borne.theme-clair .bqrtx i.ko{color:var(--rouge,#C4564E)}

/* ═══ LE LECTEUR DE BADGE QR ═══                          (v14.40)

   « C'est pas le salarié qui scanne le QR de la tablette, c'est la
   tablette qui scanne le badge du salarié. » D'où une caméra qui
   tourne, et non un bouton qui la démarre.

   L'aperçu est PETIT à dessein : il sert à se cadrer, pas à se
   regarder. Une caméra en grand sur une borne de hall filmerait les
   visiteurs toute la journée pour rien, et prendrait la place des
   cartes — qui restent l'écran.                                   */
.bqr{display:flex;align-items:center;gap:15px;margin-bottom:11px;padding:11px 13px;
  border-radius:14px;background:rgba(255,255,255,.06);border:1px solid rgba(255,255,255,.1)}
body.borne.theme-clair .bqr{background:var(--carte);border-color:var(--ligne)}
.bqrvue{position:relative;flex:none;width:132px;height:99px;border-radius:10px;overflow:hidden;
  background:#000}
.bqrvue video{width:100%;height:100%;object-fit:cover;display:block}
/* Un viseur, parce qu'une image de caméra sans cadre ne dit pas où
   tendre le badge : on le présente au centre, et le cadre le dit. */
.bqrviseur{position:absolute;inset:16% 20%;border:2px solid rgba(255,255,255,.72);
  border-radius:7px;pointer-events:none;box-shadow:0 0 0 999px rgba(0,0,0,.28)}
.bqrtx{min-width:0;display:flex;flex-direction:column;gap:3px}
.bqrtx b{font-family:var(--f-titre);font-size:17px;line-height:1.25}
/* L'état du lecteur : « Lecteur actif », ou la raison pour laquelle
   il ne l'est pas. Une caméra noire et muette se prend pour une
   panne de matériel, et quelqu'un finit par dévisser la tablette. */
.bqrtx i{font-style:normal;font-size:12.5px;opacity:.66;line-height:1.4}

.bponglets{display:inline-flex;gap:5px;background:rgba(255,255,255,.07);
  border-radius:26px;padding:4px;align-self:flex-start;flex:none}
.bponglets button{border:0;background:transparent;color:inherit;border-radius:22px;
  padding:10px 20px;font:600 14px/1 var(--f-ui);cursor:pointer;opacity:.6;
  display:inline-flex;align-items:center;gap:7px}
.bponglets button svg{width:17px;height:17px}
.bponglets button.on{background:#fff;color:var(--encre);opacity:1;box-shadow:var(--ombre)}
body.borne.theme-clair .bponglets{background:var(--surface-2);border:1px solid var(--ligne)}
body.borne.theme-clair .bponglets button.on{background:var(--encre);color:#fff}

.bplan{flex:1 1 auto;min-height:0;overflow:auto;display:flex;flex-direction:column;gap:11px;
  -webkit-overflow-scrolling:touch;overscroll-behavior:contain}
.bpjvue{min-width:0}
.bpjbar{display:flex;align-items:center;gap:10px;flex-wrap:wrap}
.bpjnav{display:flex;gap:5px;background:rgba(255,255,255,.07);border-radius:13px;padding:4px}
body.borne.theme-clair .bpjnav{background:var(--surface-2);border:1px solid var(--ligne)}
.bpjnav button{border:0;background:transparent;color:inherit;border-radius:10px;
  padding:9px 14px;font:600 13px/1.25 var(--f-ui);cursor:pointer;opacity:.72;
  display:flex;flex-direction:column;gap:2px;align-items:center}
.bpjnav button span{font-size:9.5px;opacity:.65;font-weight:500}
.bpjnav button.on{background:var(--terra);color:#fff;opacity:1}
.bpjnav button.off{opacity:.34}
.bpjpub{font:600 11px/1 var(--f-ui);border-radius:20px;padding:6px 11px;
  background:rgba(85,128,59,.28);color:#B8D69C}
.bpjpub.non{background:rgba(169,118,20,.3);color:#E9C579}
body.borne.theme-clair .bpjpub{background:var(--vert-pale);color:var(--vert);border:1px solid #CADCBB}
body.borne.theme-clair .bpjpub.non{background:var(--jaune-pale);color:var(--jaune);border-color:#EAD9AE}

/* ── « overflow:hidden » ET « sticky » NE COHABITENT PAS ──
                                                            (v14.41)
   La grille portait « overflow:hidden » pour que ses cellules soient
   coupées par les coins arrondis. Un ancêtre qui masque son
   débordement devient le conteneur de défilement de ses enfants
   collants : l'en-tête des heures « collait » donc à une boîte qui
   ne défile pas, c'est-à-dire à rien. On ne voyait plus les heures
   dès qu'on descendait dans la liste.

   On retire donc le masque, et on arrondit les CELLULES des coins.
   Le rayon coûte quatre règles ; le défilement, lui, valait la
   lecture de toute la grille. */
.bpjgrid{display:grid;background:rgba(255,255,255,.04);border:1px solid rgba(255,255,255,.1);
  border-radius:12px;min-width:0}
.bpjgrid > .bpjhead{border-top-left-radius:11px}
.bpjgrid > .bpjh:last-of-type{border-top-right-radius:11px}
.bpjgrid > *:last-child{border-bottom-right-radius:11px}
body.borne.theme-clair .bpjgrid{background:var(--carte);border-color:var(--ligne)}
.bpjlab{grid-column:1;border-top:1px solid rgba(255,255,255,.07);padding:6px 11px;
  display:flex;align-items:center;gap:9px;min-width:0}
body.borne.theme-clair .bpjlab{background:var(--carte);border-top-color:var(--surface-2)}
.bpjav{width:27px;height:27px;border-radius:50%;flex:none;overflow:hidden;color:#fff;
  display:flex;align-items:center;justify-content:center;font:700 9.5px/1 var(--f-ui)}
.bpjav img{width:100%;height:100%;object-fit:cover}
.bpjtx{min-width:0;display:flex;flex-direction:column}
.bpjtx b{font:600 12.5px/1.2 var(--f-ui);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.bpjtx i{font-style:normal;font-size:9.5px;opacity:.55;white-space:nowrap;overflow:hidden;
  text-overflow:ellipsis}
/* ── CE QU'ON GARDE SOUS LES YEUX ──                      (v14.41)
   « La barre d'horaire et d'équipe doit être en mode sticky, sinon
   on ne voit plus les heures. » Vingt lignes plus bas, un bloc posé
   au milieu de la frise ne veut plus rien dire : on ne sait plus à
   quelle heure il commence, ni de quelle équipe il est.

   Trois étages, et leurs hauteurs sont FIXES parce que les décalages
   du dessous s'y appuient : 34 px pour les heures, 24 px pour
   l'effectif — un étage qui grandirait ferait flotter les deux
   autres. */
.bpjhead,.bpjh{position:sticky;top:0;z-index:7;height:34px;box-sizing:border-box;
  /* OPAQUE, obligatoirement : un blanc translucide laisserait défiler
     les lignes derrière la barre. « --bfond » existe déjà pour cette
     raison exacte, ailleurs sur la borne. */
  background-color:var(--bfond);
  background-image:linear-gradient(rgba(255,255,255,.06),rgba(255,255,255,.06));
  border-bottom:1px solid rgba(255,255,255,.12);
  border-top:none;font:700 10px/1 var(--f-ui);letter-spacing:.05em;text-transform:uppercase;
  /* ── PAS D'« OPACITY » SUR UNE BARRE COLLANTE ──        (v14.41)
     « opacity » rend TOUT le bloc translucide, son fond compris : la
     barre restait bien en haut, et les lignes du planning défilaient
     visiblement au travers. On atténue donc le TEXTE, par sa
     couleur, et le fond reste plein. La même faute guettait les
     trois étages. */
  color:rgba(255,255,255,.62);padding:10px 11px;white-space:nowrap;overflow:hidden}
.bpjh{border-left:1px solid rgba(255,255,255,.12);padding:10px 0 9px 4px;letter-spacing:0}
body.borne.theme-clair .bpjhead,body.borne.theme-clair .bpjh{background-image:none;
  background-color:var(--surface-2);border-color:var(--ligne);color:var(--encre-2)}
/* L'effectif : un CHIFFRE par pas. Une barre oblige à comparer des
   hauteurs pour deviner un nombre qu'on peut lire — c'est la règle de
   la vue Jour, et elle vaut ici. */
.bpjeff,.bpjecs{position:sticky;top:34px;z-index:6;background-color:var(--bfond)}
.bpjeff{border-bottom:1px solid rgba(255,255,255,.12);border-top:none;box-sizing:border-box;
  font:600 11px/1 var(--f-ui);text-transform:none;letter-spacing:0;padding:8px 11px;
  color:rgba(255,255,255,.8);display:flex;align-items:center;height:24px}
/* La couleur du texte DOIT suivre le fond : en remplaçant l'opacité
   par une couleur claire, on écrit blanc sur blanc dès que le thème
   clair repeint le fond. */
body.borne.theme-clair .bpjeff{background-color:var(--carte);border-bottom-color:var(--ligne);
  color:var(--encre-2)}
body.borne.theme-clair .bpjecs{background-color:var(--carte)}
.bpjec{border-bottom:1px solid rgba(255,255,255,.12);border-left:1px solid rgba(255,255,255,.05);
  display:flex;align-items:center;justify-content:center;height:24px;box-sizing:border-box;
  font:600 10.5px/1 var(--f-ui);color:rgba(255,255,255,.55);font-variant-numeric:tabular-nums}
.bpjec.q0{border-left-color:rgba(255,255,255,.12)}
/* « background-image » et non « background » : le fond PLEIN des
   cases collantes vit sur « background-color », et un raccourci
   l'effacerait — la ligne redeviendrait transparente. */
.bpjec.hi{color:#fff;font-weight:700;
  background-image:linear-gradient(rgba(255,255,255,.09),rgba(255,255,255,.09))}
.bpjec.bas{font-weight:700;color:#E9C579;
  background-image:linear-gradient(rgba(169,118,20,.22),rgba(169,118,20,.22))}
body.borne.theme-clair .bpjec{border-color:var(--ligne);color:var(--muet)}
body.borne.theme-clair .bpjec.q0{border-left-color:var(--ligne)}
body.borne.theme-clair .bpjec.hi{background-image:none;background-color:var(--surface-2);color:var(--encre)}
body.borne.theme-clair .bpjec.bas{background-image:none;background-color:var(--jaune-pale);color:var(--jaune)}
.bpjcell{border-top:1px solid rgba(255,255,255,.05);border-left:1px solid rgba(255,255,255,.05)}
body.borne.theme-clair .bpjcell{border-color:var(--surface-2)}
.bpjcell.q0{border-left-color:rgba(255,255,255,.1)}
body.borne.theme-clair .bpjcell.q0{border-left-color:var(--ligne-2)}
.bpjsh{position:relative;margin:5px 1px;border-radius:9px;padding:4px 8px;overflow:hidden;
  border:1px solid rgba(62,43,26,.1);border-left-width:3px;display:flex;flex-direction:column;
  justify-content:center;z-index:2;min-width:0}
.bpjsh .t{font:700 8.5px/1.2 var(--f-ui);letter-spacing:.05em;text-transform:uppercase;
  opacity:.72;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.bpjsh .h{font:700 11px/1.3 var(--f-ui);white-space:nowrap;font-variant-numeric:tabular-nums}
.bpjpz{position:absolute;top:0;bottom:0;pointer-events:none;
  background:repeating-linear-gradient(-45deg,rgba(62,43,26,.17) 0 3px,transparent 3px 6px)}
/* Une pause ESTIMÉE au milieu du service se dessine plus légèrement
   que celle dont on connaît l'heure : la grille ne doit pas affirmer
   plus qu'elle ne sait (v14.41). */
.bpjpz.bpjest{background:repeating-linear-gradient(-45deg,rgba(62,43,26,.13) 0 2px,transparent 2px 7px)}
/* Le trait du bas : ce qui a été RÉELLEMENT pointé. Même idée que
   « prévu / pointé » sur la bulle, à l'échelle de la journée. */
.bpjdone{position:absolute;bottom:0;height:3px;background:currentColor;opacity:.85}
.bpjnow{background:var(--terra);width:2px;justify-self:start;margin-left:-1px;z-index:8;
  position:relative;pointer-events:none}
.bpjnow::before{content:'';position:absolute;top:-3px;left:-3px;width:8px;height:8px;
  border-radius:50%;background:var(--terra)}
/* ── LE SÉPARATEUR D'ÉQUIPE PORTE SON EFFECTIF ──          (v14.40)
   Il occupait toute la largeur pour n'y écrire qu'un nom. Il tient
   maintenant la première colonne, et les cases de la frise portent
   l'effectif de CETTE équipe, pas à pas — même règle et même
   comptage que le total du site. */
.bpjsep,.bpjeqc{position:sticky;top:58px;z-index:5;background-color:var(--bfond)}
.bpjsep{grid-column:1;border-top:1px solid rgba(255,255,255,.08);box-sizing:border-box;height:24px;
  border-bottom:1px solid rgba(255,255,255,.08);font:700 9.5px/1 var(--f-ui);letter-spacing:.06em;
  text-transform:uppercase;color:rgba(255,255,255,.62);padding:0 11px;
  display:flex;align-items:center}
body.borne.theme-clair .bpjsep{background-color:var(--carte);border-color:var(--ligne);
  color:var(--muet)}
body.borne.theme-clair .bpjeqc{background-color:var(--carte)}
/* ── LE MÊME CHIFFRE, LE MÊME STYLE ──                    (v14.41)
   Les cases d'équipe avaient leur propre allure — plus pâle, un
   autre fond. Sur une même grille, deux styles pour la même chose
   obligent à comprendre la différence avant de lire le nombre, et il
   n'y en avait aucune à comprendre : ce sont les mêmes personnes
   comptées de la même façon. Les cases d'équipe sont donc des
   « .bpjec », exactement. « .bpjeqc » ne sert plus qu'à les
   retrouver — il ne peint rien. */
.bpjvide{padding:44px 20px;text-align:center;opacity:.62;line-height:1.75;font-size:13px;
  background:rgba(255,255,255,.04);border-radius:12px}
.bpjvide b{display:block;font:600 16px/1.35 var(--f-titre);opacity:1;margin-bottom:6px}
body.borne.theme-clair .bpjvide{background:var(--carte);border:1px solid var(--ligne);
  color:var(--muet)}
.bpjleg{display:flex;gap:16px;flex-wrap:wrap;font-size:11px;opacity:.55;padding:2px}
.bpjleg i{display:inline-block;vertical-align:middle;margin-right:5px}
.bpjleg i.lgd{width:20px;height:3px;border-radius:2px;background:currentColor}
.bpjleg i.lgp{width:14px;height:9px;border-radius:2px;
  background:repeating-linear-gradient(-45deg,currentColor 0 2px,transparent 2px 5px)}
/* La pause ESTIMÉE : même hachure, plus pâle et plus espacée. Elle
   doit se distinguer de la pause horodatée sans crier — c'est une
   convention annoncée, pas une alerte. */
.bpjleg i.lgpe{width:14px;height:9px;border-radius:2px;opacity:.5;
  background:repeating-linear-gradient(-45deg,currentColor 0 1px,transparent 1px 5px)}
.bpjleg i.lgn{width:2px;height:11px;background:var(--terra)}
.bpjleg b{color:#E9C579}
body.borne.theme-clair .bpjleg b{color:var(--jaune)}

/* ═══ DEUX DENSITÉS ═══                                   (v14.38)

   La liste sert à deux choses opposées : chercher son nom pour
   pointer, et regarder où en est l'équipe. Un seul gabarit les
   servait mal toutes les deux.

   « GRANDE » — la borne du hall. De grands noms, l'état en clair,
   rien d'autre : ni poste, ni horaires, ni pointé. Celui qui vient
   pointer connaît son poste, et les horaires ne l'aident pas à se
   reconnaître dans une liste de quarante.

   « TABLEAU » — le local du personnel. Tout, resserré : trois cartes
   de front deviennent quatre ou cinq.                              */
/* ── PLUS PETITES QU'AU PREMIER JET ──                     (v14.39)
   Une carte plus grande n'est pas une carte plus lisible : elle est
   une carte de moins à l'écran, donc un défilement de plus. Sur une
   tablette de 1024, huit cartes « grandes » tiennent désormais sans
   défiler là où il n'en tenait que six. */
.bcdens-grande{grid-template-columns:repeat(auto-fill,minmax(236px,1fr))}
.bcdens-grande .bcart{flex-direction:row;align-items:center;gap:11px;
  padding:13px 15px 13px 12px;flex-wrap:wrap}
.bcdens-grande .bcet{order:1;flex-basis:100%;font-size:9.5px}
.bcdens-grande .bcqui{order:2;flex:1 1 100%;width:100%;gap:10px}
.bcdens-grande .bav3{width:44px;height:44px;font-size:14px}
.bcdens-grande .bcpr{font-size:18px}
.bcdens-grande .bcnf{font-size:12px}
.bcdens-grande .bcetq,.bcdens-grande .bchrs{display:none}
.bcdens-grande .bcact{order:3;flex-basis:100%;margin-top:0;font-size:12px}

.bcdens-tableau{grid-template-columns:repeat(auto-fill,minmax(202px,1fr))}
.bcdens-tableau .bcart{gap:4px;padding:10px 11px 10px 9px}
.bcdens-tableau .bcqui{gap:8px}
.bcdens-tableau .bav3{width:30px;height:30px;font-size:10.5px}
.bcdens-tableau .bcet{font-size:9px}
.bcdens-tableau .bcpr{font-size:13.5px}
.bcdens-tableau .bcnf{font-size:10.5px}
.bcdens-tableau .bck{font-size:9px}
.bcdens-tableau .bcv{font-size:11.5px}
.bcdens-tableau .bcetq{font-size:10.5px}
.bcdens-tableau .bcact{font-size:11.5px}
/* En densité tableau, un retardataire dit déjà trois fois la même
   chose : « En retard de 9h44 », « Pointé : rien depuis 07h00 », et
   « Arrivée attendue 07h00 ». Les deux premières suffisent — la
   troisième ne sert que là où les horaires sont masqués. */
.bcdens-tableau .bcart[data-retard="1"] .bcact{display:none}

/* ═══ POINTER SANS SHIFT ═══                              (v14.36)
   Le bouton ne faisait que placer le curseur dans un champ de
   recherche : il fallait savoir qu'il fallait taper, et taper juste,
   debout devant une tablette murale. Il ouvre la liste des noms. */
/* ── DES VISAGES, ET UNE SORTIE ──                         (v14.39)
   Une liste de quarante noms se parcourt trois fois plus vite avec
   les photos : on cherche un visage, pas une chaîne de caractères.
   Et la sortie passe EN HAUT, à côté du titre : « Annuler » sous une
   liste qui défile n'est pas une sortie, c'est une récompense. */
.bsslarge{justify-content:flex-start;max-width:780px;width:100%;margin:0 auto}
.bsshd{display:flex;align-items:center;gap:12px;width:100%}
.bsshd .tt{flex:1;text-align:left;min-width:0}
/* « .bsous » est bridé à 54 caractères pour rester lisible au centre
   d'un écran ; dans cette liste il court sur toute la largeur. */
.bsslarge .bsous{max-width:none;width:100%;text-align:left}
.bssret{flex:none;border:1px solid rgba(255,255,255,.24);background:transparent;color:inherit;
  border-radius:12px;padding:11px 16px;font:600 13.5px/1 var(--f-ui);cursor:pointer;
  display:flex;align-items:center;gap:8px}
.bssret:hover{background:rgba(255,255,255,.08)}
body.borne.theme-clair .bssret{border-color:var(--ligne-2);color:var(--encre-2)}
body.borne.theme-clair .bssret:hover{background:var(--surface-2)}
/* « avatar_html » pose le FOND en ligne, jamais la couleur du texte :
   chaque pastille doit donner la sienne, sinon les initiales restent
   en encre sombre sur un aplat sombre — illisibles. */
.bssav{width:36px;height:36px;border-radius:50%;flex:none;overflow:hidden;color:#fff;
  display:flex;align-items:center;justify-content:center;font:700 12px/1 var(--f-ui)}
.bssav img{width:100%;height:100%;object-fit:cover}
.bsstx{min-width:0;display:flex;flex-direction:column;justify-content:center}
/* « flex:0 1 auto » et non « flex:1 » : avec trois noms, une liste
   qui s'étire sur toute la hauteur repousse « Annuler » à huit cents
   pixels du dernier bouton. Elle prend sa taille, et ne défile que
   lorsqu'elle dépasse. */
.bssliste{width:100%;overflow:auto;flex:0 1 auto;min-height:0}
.bssh{font:700 11px/1 var(--f-ui);letter-spacing:.08em;text-transform:uppercase;
  opacity:.5;padding:16px 2px 7px;text-align:left}
/* 230 px et non 200 : « Marie-Claire N'GUYEN-DUPONT » se coupait,
   et un nom coupé sur un écran où l'on cherche le sien est un nom
   qu'on ne trouve pas. */
.bssgr{display:grid;grid-template-columns:repeat(auto-fill,minmax(230px,1fr));gap:8px}
.bssl{display:flex;flex-direction:row;align-items:center;gap:10px;border:none;
  background:rgba(255,255,255,.08);border-radius:12px;padding:10px 13px;cursor:pointer;
  font-family:var(--f-ui);color:inherit;text-align:left;min-width:0;width:100%}
.bssl:hover{background:rgba(255,255,255,.16)}
/* Le nom passe à la ligne plutôt que de se couper : sur un écran où
   chacun cherche le sien, « Marie-Claire N'GUYEN-DU… » ne se trouve
   pas. */
.bssn{font-size:15px;font-weight:600;max-width:100%;line-height:1.3}
.bsss{font-size:11.5px;opacity:.6}
.bssvide{padding:34px;text-align:center;opacity:.6}
/* La liste vient tout de suite après le titre, et le renoncement
   juste après elle : « Annuler » collé au bas d'un écran de 900 px
   n'est plus le même geste que « Annuler » sous la liste. */
.bsslarge .bssliste{margin-top:4px}
.bsslarge .blien{margin-top:16px;align-self:center}

/* ── LE THÈME CLAIR ──
   Les fonds de la borne sont des blancs TRANSPARENTS : posés sur le
   crème du thème clair, ils ne se voient pas. Chaque surface neuve
   doit donc dire sa version claire, sinon elle disparaît de moitié
   des bornes (v14.36). */
/* Les anciennes lignes « .bplanl » et leur pastille « .bplanp » ont
   disparu avec la liste plate du planning (v14.39) : le thème clair
   de la vue jour vit plus haut, avec les « .bpj* ». */
body.borne.theme-clair .bssl{background:#fff;border:1px solid var(--ligne)}
body.borne.theme-clair .bssl:hover{border-color:var(--terra);background:#fff}
.brech{width:100%;border:none;background:#fff;border-radius:13px;padding:13px 16px;font-family:var(--f-ui);
  font-size:15px;box-shadow:var(--ombre);color:var(--encre)}
.brech:focus{outline:2px solid var(--terra)}
.bliste{background:#fff;border-radius:16px;overflow-y:auto;box-shadow:var(--ombre);flex:1}
.bl{display:flex;align-items:center;gap:15px;padding:15px 18px;border-bottom:1px solid var(--ligne);
  width:100%;border-left:none;border-right:none;border-top:none;background:none;text-align:left;cursor:pointer}
.bl:last-child{border-bottom:none}
.bl:active{background:var(--terra-pale)}
.bav2{width:48px;height:48px;border-radius:50%;display:flex;align-items:center;justify-content:center;
  font-family:var(--f-titre);font-weight:700;color:#fff;font-size:15px;flex:none}
.bn{flex:1;min-width:0}
.bn b{display:block;font-size:16px;font-weight:600}
.bn i{font-style:normal;font-size:13px;color:var(--muet)}
.bet{font-size:13px;font-weight:700;border-radius:22px;padding:7px 14px;white-space:nowrap}
.bet.present{background:var(--vert-pale);color:var(--vert)}
.bet.pause{background:var(--jaune-pale);color:var(--jaune)}
.bet.fini{background:var(--surface-2);color:var(--muet)}
.bet.attendu{background:#fff;color:var(--encre-2);border:1px solid var(--ligne-2)}
.bet.retard{background:var(--rouge-pale);color:var(--rouge)}
.bleg{display:flex;gap:12px;font-size:12px;color:var(--muet)}
.bleg span:last-child{margin-left:auto}
.bvide{padding:40px;text-align:center;color:var(--muet);line-height:1.7}
/* Écrans plein cadre */
.bmodal{position:fixed;inset:0;background:rgba(44,36,24,.55);display:flex;align-items:center;
  justify-content:center;z-index:100}
.bmodal[hidden]{display:none}
.bmbox{background:#F2EFE7;border-radius:20px;width:min(880px,94vw);max-height:94vh;overflow:auto;
  box-shadow:var(--ombre-2)}
.bplein{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:18px;
  padding:38px 30px;text-align:center;position:relative}
.bplein h1{font-family:var(--f-titre);font-size:28px;font-weight:700;margin:0}
.bplein p{margin:0;color:var(--encre-2);max-width:560px;line-height:1.6;font-size:15px}
.bpetit{font-size:13px;color:var(--muet)}
/* Renommé « .bferm » : « .bx » est la case à cocher de TOUT le kit,
   et cette règle de la borne l'écrasait dans l'application entière —
   les cases se retrouvaient décalées de 14 px vers le bas, hors de
   leur libellé. Un nom de classe à deux lettres finit toujours par
   entrer en collision (v8.5). */
.bferm{position:absolute;top:14px;right:16px;width:42px;height:42px;border-radius:50%;
  border:1px solid var(--ligne-2);
  background:#fff;font-size:18px;cursor:pointer;color:var(--encre-2)}
.bpill{font-size:11.5px;font-weight:700;background:var(--surface-2);border:1px solid var(--ligne);
  border-radius:20px;padding:4px 12px;color:var(--muet)}
.bcode{font-family:ui-monospace,monospace;font-size:46px;font-weight:700;letter-spacing:.16em;
  background:#fff;border:2px dashed var(--ligne-2);border-radius:18px;padding:20px 32px}
.bpts{display:flex;gap:11px}
.bpts i{width:18px;height:18px;border-radius:50%;background:var(--ligne-2);display:block}
.bpts i.on{background:var(--encre)}
.bpav{display:grid;grid-template-columns:repeat(3,96px);gap:12px}
.bpav button{height:76px;border:1px solid var(--ligne-2);background:#fff;border-radius:16px;
  font-family:var(--f-titre);font-size:26px;font-weight:600;cursor:pointer;color:var(--encre)}
.bpav button:active{background:var(--terra-pale);border-color:var(--terra)}
.bpav button.eff,.bpav button.ann{font-family:var(--f-ui);font-size:14px;font-weight:600;color:var(--encre-2)}
.bgestes{display:grid;grid-template-columns:repeat(auto-fit,minmax(230px,1fr));gap:15px;width:100%;max-width:720px}
.bgeste{border:none;border-radius:18px;padding:26px 20px;font-family:var(--f-ui);cursor:pointer;text-align:left;
  box-shadow:var(--ombre)}
.bgeste b{display:block;font-family:var(--f-titre);font-size:20px;margin-bottom:4px}
.bgeste i{font-style:normal;font-size:13px;opacity:.88}
.bgeste.arr{background:var(--vert);color:#fff}
.bgeste.dep{background:var(--terra);color:#fff}
.bgeste.pau{background:var(--jaune);color:#fff}
.bgeste.rep{background:var(--bleu);color:#fff}
.bbtn{border:1px solid var(--ligne-2);background:#fff;border-radius:12px;padding:12px 22px;
  font-family:var(--f-ui);font-size:14px;font-weight:600;cursor:pointer;color:var(--encre)}
.bmotifs{display:flex;gap:10px;flex-wrap:wrap;justify-content:center;max-width:680px}
.bmotifs button{border:1px solid var(--ligne-2);background:#fff;border-radius:24px;padding:12px 18px;
  font-family:var(--f-ui);font-size:14px;cursor:pointer;color:var(--encre)}
.bmotifs button:active{border-color:var(--terra);color:var(--terra-h)}
.brond{width:104px;height:104px;border-radius:50%;background:var(--vert);color:#fff;
  display:flex;align-items:center;justify-content:center;font-size:48px}
@media(max-width:820px){
  .bapp{grid-template-columns:1fr}
  .bside{flex-direction:row;align-items:center;gap:14px;padding:12px 16px}
  /* En bandeau, la colonne n'a plus la place de raconter la journée :
     météo, note, événements et thème s'effacent, l'essentiel reste —
     l'heure et l'état de connexion (v9.5). */
  .bcarte,.bpied,.bside .bmeteo,.bside .bnote,.bside .bevts,.bthemebtn{display:none}
  .bstat{margin:0}
}
/* Réglages pointeuse */
.ptline{display:flex;align-items:center;gap:12px;padding:12px 16px;border-bottom:1px solid var(--ligne);font-size:12.5px}
.ptline:last-of-type{border-bottom:none}
.ptline.off{opacity:.6}
.ptline .tx{flex:1}
.ptline .tx b{display:block;font-weight:600}
.ptline .tx i{font-style:normal;font-size:11.5px;color:var(--muet)}
.ptedit{display:flex;gap:10px;align-items:center;flex-wrap:wrap;padding:12px 16px;background:var(--surface-2);
  border-bottom:1px solid var(--ligne)}
.ptedit[hidden]{display:none}
/* ── Cases à cocher en ligne ──
   « .chk » aligne sa case et son libellé par flex, mais dans une
   grille « .f2 » les items s'étiraient et la case se retrouvait
   séparée de son texte. On en fait des pastilles autonomes : chacune
   porte sa bordure, rien ne peut plus les disloquer (v8.5). */
.cases{display:flex;gap:8px;flex-wrap:wrap;align-items:flex-start}
.cases .chk{display:inline-flex;align-items:center;gap:8px;flex:0 0 auto;
  border:1px solid var(--ligne-2);border-radius:10px;padding:8px 12px;background:#fff;
  transition:border-color .12s,background .12s;max-width:100%}
.cases .chk:hover{border-color:var(--muet)}
.cases .chk:has(input:checked){border-color:var(--vert);background:var(--vert-pale,#EDF3E6)}
.cases .chk .bx{margin-top:0;position:relative;top:0;left:0}
.ligne2{display:flex;align-items:center;gap:12px;padding:11px 16px;border-bottom:1px solid var(--ligne);font-size:12.5px}
.ligne2:last-child{border-bottom:none}
.ligne2 .tx{flex:1}
.ligne2 .tx b{display:block;font-weight:600}
.ligne2 .tx i{font-style:normal;font-size:11.5px;color:var(--muet)}

/* ═══ v7.52 · Fenêtre de suppression définitive ═══
   Rouge, centrée, avec le compte de ce qui va disparaître. Un
   « êtes-vous sûr ? » se clique sans lire ; recopier huit caractères,
   non. */
.supmodal{position:fixed;inset:0;background:rgba(44,36,24,.55);display:flex;align-items:center;
  justify-content:center;z-index:960;padding:20px}
.supmodal[hidden]{display:none}
.supbox{background:var(--carte);border-radius:16px;width:min(560px,96vw);overflow:hidden;
  box-shadow:var(--ombre-2)}
.suph{display:flex;gap:12px;align-items:flex-start;padding:16px 18px;background:var(--rouge-pale);
  border-bottom:1px solid #EED6D7;color:#8A2C31}
.suph .ic{font-size:20px;line-height:1.2}
.suph b{display:block;font-family:var(--f-titre);font-size:15px}
.suph i{font-style:normal;font-size:12px;opacity:.85}
.supc{padding:16px 18px}
.supc p{margin:0 0 12px;font-size:13px;line-height:1.6;color:var(--encre-2)}
.supliste{background:var(--surface-2);border:1px solid var(--ligne);border-radius:10px;
  padding:11px 13px;font-size:12.5px;line-height:1.7;color:var(--encre-2);margin-bottom:14px}
.supf{display:flex;gap:9px;align-items:center;padding:13px 18px;border-top:1px solid var(--ligne);
  background:var(--surface-2)}
.btn.danger[disabled]{opacity:.45;cursor:not-allowed}

/* ═══ Bandeau d'environnement ═══
   Une PASTILLE centrée, pas une barre pleine largeur : elle doit se
   voir sans manger une ligne d'écran ni décaler la mise en page. */
.envband{position:fixed;top:0;left:50%;transform:translateX(-50%);z-index:940;
  display:inline-flex;align-items:center;gap:7px;padding:3px 13px 4px;
  border-radius:0 0 9px 9px;font-size:10.5px;font-weight:700;letter-spacing:.04em;
  text-transform:uppercase;color:#fff;box-shadow:0 2px 8px -2px rgba(0,0,0,.3);
  white-space:nowrap;pointer-events:none}
.envband.dev{background:#4A6FA5}
.envband.beta{background:#8A5E86}
.envband .pt,.envband .d{display:none}   /* la couleur et le mot suffisent */
.envband .v{opacity:.65;font-family:ui-monospace,monospace;font-weight:600;
  text-transform:none;letter-spacing:0}
@media(max-width:600px){.envband{font-size:9.5px;padding:2px 10px 3px}}
/* La pastille flotte : aucune règle de décalage n'est nécessaire. */
body.borne .envband{position:fixed;top:0}

/* ═══ v7.53 · Édition en place et tokens ═══ */
.orgedit2{margin-top:12px;padding:14px;background:var(--surface-2);border:1px solid var(--ligne);
  border-radius:12px}
.orgedit2[hidden]{display:none}
.orgedit2 .fg{margin-bottom:10px}
.tokneuf{background:var(--encre);color:#fff;border-radius:10px;padding:14px 16px;font-size:14px;
  word-break:break-all;-webkit-user-select:all;user-select:all}

/* ═══ v7.54 · Bandeau développeur sur les écrans réels ═══
   L'écran est celui du client ; le bandeau ajoute les outils, sans
   se confondre avec l'interface qu'il surplombe. */
.devbar{display:flex;align-items:center;gap:10px;flex-wrap:wrap;margin:0 0 16px;
  padding:9px 14px;background:var(--rouge-pale);border:1px solid #EED6D7;border-radius:12px;
  font-size:12px;color:#8A2C31}
.devbar .lbl{display:flex;align-items:center;gap:6px;font-weight:700;white-space:nowrap}
.devbar .ic{width:15px;height:15px}
.devbar .idt{background:#fff;border:1px solid #EED6D7;border-radius:7px;padding:3px 9px;
  font-size:11px;cursor:pointer;user-select:all}
.devbar .idt.copie{background:var(--vert-pale);border-color:#CFE0BF;color:var(--vert)}
.devbar .idt.copie::after{content:' ✓'}
.devbar .sp{flex:1}

/* ═══ v7.61 · Alerte de schéma ═══
   Une erreur de colonne manquante ne doit pas se lire comme une
   absence de données. Rouge, en tête, avec la commande à lancer. */
.dbalerte{background:var(--rouge-pale);border-bottom:1px solid #EED6D7;color:#8A2C31;
  padding:9px 18px;font-size:12.5px;display:flex;gap:12px;align-items:center;flex-wrap:wrap}
.dbalerte b{font-weight:700;white-space:nowrap}
.dbalerte span{opacity:.9}
.dbalerte .cmd{margin-left:auto;font-family:ui-monospace,monospace;font-size:11.5px;
  background:#fff;border:1px solid #EED6D7;border-radius:7px;padding:3px 9px;user-select:all}

/* ═══ v7.62 · Écrans d'authentification annexes ═══ */
.authpied{margin-top:14px;text-align:center;font-size:12.5px;color:var(--muet)}
.authpied a{color:var(--terra-h);text-decoration:none;font-weight:600}
.authpied a:hover{text-decoration:underline}
.code2fa{text-align:center;font-family:ui-monospace,SFMono-Regular,Menlo,monospace;
  font-size:26px;letter-spacing:.32em;padding:12px 10px}

/* ═══ v7.70 · Vider les données (mode développeur) ═══
   Chaque catégorie annonce son volume : une case « Pointages · 0 »
   se coche sans crainte, « Pointages · 1 240 » fait réfléchir. */
.vidliste{border:1px solid var(--ligne);border-radius:11px;overflow:hidden;margin-bottom:14px}
.vidcat{display:flex;align-items:flex-start;gap:10px;padding:11px 13px;cursor:pointer;
  border-bottom:1px solid var(--ligne);background:var(--carte)}
.vidcat:last-child{border-bottom:0}
.vidcat:hover{background:var(--surface-2)}
.vidcat.vide{opacity:.45;cursor:default}
.vidcat.vide:hover{background:var(--carte)}
.vidcat .txt{flex:1;min-width:0}
.vidcat .txt b{display:block;font-size:13px;font-weight:600;color:var(--encre)}
.vidcat .txt i{display:block;font-style:normal;font-size:11.5px;line-height:1.5;color:var(--muet);margin-top:2px}
.vidcat .n{font-family:ui-monospace,monospace;font-size:12px;font-weight:600;color:var(--encre-2);
  background:var(--surface-2);border:1px solid var(--ligne);border-radius:7px;padding:2px 8px;white-space:nowrap}
.vidcat.vide .n{background:transparent;border-color:transparent}

/* ═══ v7.72 · Dépôt d'image : on réutilise .drop du kit ═══
   Même bordure, même état « .over », mêmes couleurs. Seule
   l'icône est ajoutée — le kit n'en prévoyait pas. */
/* L'attribut « hidden » ne suffit pas : .drop impose display:block,
   qui l'emporte. On le rétablit explicitement. */
.drop[hidden]{display:none}
.drop .dico{display:block;margin:0 auto 9px;width:26px;height:26px;color:var(--muet)}
.drop .dico svg{width:26px;height:26px}
.drop:hover .dico,.drop.over .dico{color:var(--terra-h)}
.drop .dfile{display:none}

/* ═══ v7.73 · Photos et logos ═══
   L'image est affichée EN ENTIER et le cadre se déplace par-dessus :
   on peut donc sélectionner bord à bord. Un logo n'a pas de cadre du
   tout — le rogner reviendrait à mutiler une marque. */
.avphoto{padding:0!important;overflow:hidden;background:var(--surface-2)!important;
  display:inline-flex;flex:none;position:relative;color:transparent}
.avphoto>img{position:absolute;inset:0;width:100%;height:100%;object-fit:cover;display:block;
  border-radius:inherit}
.imgzone{display:flex;justify-content:center;margin:0 0 14px}
.imgwrap{position:relative;user-select:none;touch-action:none;
  background:var(--surface-2);border:1px solid var(--ligne);border-radius:10px;
  /* Le voile du cadre est une ombre de 9999px : sans confinement, il
     assombrissait toute la fenêtre, boutons compris, qui semblaient
     alors désactivés. */
  overflow:hidden;isolation:isolate}
.imgwrap img{display:block;width:100%;height:100%;object-fit:contain;pointer-events:none;
  border-radius:9px}
/* Le voile assombrit ce qui SORT du cadre : on voit d'un coup d'œil
   ce qui sera conservé. */
.imgcadre{position:absolute;cursor:move;box-shadow:0 0 0 9999px rgba(62,43,26,.45);
  outline:2px solid #fff;outline-offset:-1px}
.imgcadre::before{content:'';position:absolute;inset:0;
  background:linear-gradient(to right,transparent 33%,rgba(255,255,255,.35) 33%,
    rgba(255,255,255,.35) 33.4%,transparent 33.4%,transparent 66.6%,
    rgba(255,255,255,.35) 66.6%,rgba(255,255,255,.35) 67%,transparent 67%),
    linear-gradient(to bottom,transparent 33%,rgba(255,255,255,.35) 33%,
    rgba(255,255,255,.35) 33.4%,transparent 33.4%,transparent 66.6%,
    rgba(255,255,255,.35) 66.6%,rgba(255,255,255,.35) 67%,transparent 67%);
  pointer-events:none}
.imgcadre .p{position:absolute;width:16px;height:16px;background:#fff;border:2px solid var(--terra);
  border-radius:3px}
/* Les poignées sont À L'INTÉRIEUR du cadre : le conteneur est
   désormais confiné, et tout ce qui déborde serait rogné. */
.imgcadre .nw{left:-1px;top:-1px;cursor:nwse-resize}
.imgcadre .ne{right:-1px;top:-1px;cursor:nesw-resize}
.imgcadre .sw{left:-1px;bottom:-1px;cursor:nesw-resize}
.imgcadre .se{right:-1px;bottom:-1px;cursor:nwse-resize}
/* .avatar n'existait que dans .band et .fichehead : posé ailleurs —
   sur le profil — il n'avait ni taille ni forme. Base autonome, que
   les contextes existants continuent d'écraser. */
.avatar{width:38px;height:38px;border-radius:50%;color:#fff;display:inline-flex;
  align-items:center;justify-content:center;font-family:var(--f-titre);font-weight:600;
  font-size:15px;flex:none}

/* .avedit doit être le RÉFÉRENTIEL du crayon : sans
   position:relative, celui-ci se positionne par rapport à la page et
   part hors de l'écran. */
.avedit{position:relative;display:inline-flex;cursor:pointer;flex:none;vertical-align:middle}

/* .logoprev rogne son contenu — c'est voulu pour l'image, qui doit
   rester dans le cadre arrondi. Mais le crayon, lui, DOIT dépasser :
   on lève le rognage uniquement quand la pastille porte le bouton, et
   on redonne l'arrondi à l'image. */
.logoprev.avedit{overflow:visible}
.logoprev.avedit img{border-radius:11px}

.avedit .stylo{position:absolute;right:-3px;bottom:-3px;width:24px;height:24px;border-radius:50%;
  background:var(--carte);border:1px solid var(--ligne);display:flex;align-items:center;
  justify-content:center;box-shadow:var(--ombre-1);color:var(--encre-2);transition:all .15s}
.avedit .stylo .ico{width:12px;height:12px;vertical-align:0}
.avedit:hover .stylo{background:var(--terra);border-color:var(--terra);color:#fff}

/* ═══ v7.79 · Familles d'icônes d'étiquette ═══
   Un intitulé discret sépare les métiers : le regard trouve sa
   famille avant de choisir un pictogramme. */
.icfam{font-size:10.5px;font-weight:700;letter-spacing:.07em;text-transform:uppercase;
  color:var(--muet);margin:12px 0 5px}
.icfam:first-of-type{margin-top:8px}

/* ═══ v7.80 · Modèles de saisie (écran Planification) ═══
   Chaque modèle montre son contenu — horaires ou durée — plutôt que
   son seul nom : « Ouverture » ne dit pas à quelle heure. */
.msbloc{border-top:1px solid var(--ligne)}
.mshead{display:flex;align-items:center;gap:10px;padding:13px 18px 9px}
.mshead b{font-size:13.5px;font-weight:600;color:var(--encre)}
.mshead .msm{flex:1;font-size:11.5px;color:var(--muet)}
.mslist{display:flex;flex-wrap:wrap;gap:8px;padding:0 18px 12px}
.msitem{display:flex;flex-direction:column;align-items:flex-start;gap:1px;position:relative;
  border:1px solid var(--ligne-2);background:#fff;border-radius:11px;padding:9px 30px 9px 13px;
  cursor:pointer;text-align:left;transition:all .12s;min-width:132px}
.msitem:hover{border-color:var(--terra);background:var(--terra-pale)}
.msitem b{font-size:13px;font-weight:600;color:var(--encre)}
.msitem i{font-style:normal;font-size:11.5px;color:var(--muet)}
.msitem .mspen{position:absolute;right:10px;top:50%;transform:translateY(-50%);
  color:var(--muet);opacity:0;transition:opacity .12s}
.msitem:hover .mspen{opacity:1}
.msvide{padding:0 18px 12px;font-size:12.5px;color:var(--muet)}

/* ═══ v7.81 · Choix des jours dans un modèle ═══ */
.jselmod{display:flex;gap:6px;flex-wrap:wrap;margin-top:4px}
.jselmod label{flex:none}
/* Sept parts égales, quand les sept jours occupent une ligne à eux
   seuls : « L » est une lettre étroite et « D » une lettre large, et
   sept pastilles dimensionnées sur leur lettre ne tombent sur aucun
   bord commun. Dans une grille, elles doivent partager la largeur
   comme les colonnes la partagent.                        (v14.31) */
.jselmod.jsm7{display:grid;grid-template-columns:repeat(7,minmax(0,1fr));gap:6px}
.jselmod.jsm7 span{min-width:0}
.jselmod span{min-width:42px;padding:9px 6px;text-align:center;border:1px solid var(--ligne-2);
  border-radius:9px;background:#fff;font-size:12.5px;font-weight:600;color:var(--encre-2);
  display:block;cursor:pointer;transition:all .12s}
.jselmod input{position:absolute;opacity:0;width:0;height:0}
.jselmod input:checked+span{background:var(--terra);border-color:var(--terra);color:#fff}

/* ═══ v7.85 · Sélecteurs de date et d'heure ═══
   Le champ natif reste VISIBLE et saisissable au clavier : taper
   « 0930 » est plus rapide que de faire défiler deux colonnes quand
   on connaît l'heure. On masque seulement l'icône du navigateur, et
   la nôtre ouvre le sélecteur maison. */
/* ── L'ENVELOPPE NE DOIT RIEN IMPOSER ──                (v14.31)
   Elle était en « inline-flex ». Un élément en ligne prend la largeur
   de son contenu, et le contenu d'un champ de date est la largeur que
   le navigateur donne au format du pays : 137 px pour jj/mm/aaaa,
   105 px pour hh:mm. L'enveloppe imposait donc la seule chose qu'elle
   ne devait pas imposer — la largeur. Le champ n'occupait plus sa
   colonne, et rien ne tombait au même bord dans une grille ; trois
   écrans avaient déjà contourné le défaut chacun de son côté.

   « flex » de niveau bloc rend au champ son comportement nu : dans un
   parent en bloc il prend toute la largeur, comme le veut
   « .fi{width:100%} » ; dans un parent en flex ou en grille il reste
   un élément qui se dimensionne sur son contenu. */
.dtwrap{position:relative;display:flex;align-items:center;max-width:100%}
/* Le champ remplit son enveloppe sans descendre sous elle. La base
   « auto » respecte une largeur voulue ailleurs — la ligne d'horaires
   compacte du planning — avant de s'étirer. */
.dtwrap > input{flex:1 1 auto;min-width:0;padding-right:30px!important}
.perline .dtwrap{width:150px;flex:none}
.rowf .dtwrap{flex:1;min-width:0}
/* L'icône du navigateur disparaît : deux horloges côte à côte
   n'aideraient personne. */
.dtnatifvu::-webkit-calendar-picker-indicator{display:none;-webkit-appearance:none}
.dtnatifvu::-webkit-inner-spin-button{display:none}
.dtouvre{position:absolute;right:6px;top:50%;transform:translateY(-50%);width:22px;height:22px;
  border:0;background:transparent;padding:0;cursor:pointer;color:var(--muet);
  display:flex;align-items:center;justify-content:center;border-radius:6px}
.dtouvre svg{width:15px;height:15px}
.dtouvre:hover{color:var(--terra-h);background:var(--surface-2)}
/* Dans le bandeau d'horaires du tiroir, l'icône suit la typographie
   du champ. */
.qheures .dtouvre{right:2px}
.qheures .dtwrap > input{padding-right:26px!important}

.dtpop{position:fixed;inset:0;z-index:420}
.dtpop[hidden]{display:none}
.dtveil{position:absolute;inset:0}
.dtbox{position:absolute;background:#fff;border:1px solid var(--ligne);border-radius:13px;
  box-shadow:var(--ombre-2);overflow:hidden;width:236px}
.dthead{display:flex;border-bottom:1px solid var(--ligne);background:var(--surface-2)}
.dthead span{flex:1;text-align:center;padding:7px 0;font:700 10px/1 var(--f-ui);
  letter-spacing:.07em;text-transform:uppercase;color:var(--muet)}
.dtcols{display:flex;height:184px}
.dtcol{flex:1;overflow-y:auto;border-right:1px solid var(--ligne);scrollbar-width:thin}
.dtcol:last-child{border-right:0}
.dtcol button{display:block;width:100%;border:0;background:transparent;padding:9px 0;
  font-family:var(--f-ui);font-size:14px;color:var(--encre-2);cursor:pointer}
.dtcol button:hover{background:var(--surface-2)}
.dtcol button.on{background:var(--terra);color:#fff;font-weight:700}
.dtracc{display:flex;gap:5px;flex-wrap:wrap;padding:9px;border-top:1px solid var(--ligne)}
.dtracc button{border:1px solid var(--ligne-2);background:#fff;border-radius:8px;padding:5px 9px;
  font:600 12px/1 var(--f-ui);color:var(--encre-2);cursor:pointer}
.dtracc button:hover{border-color:var(--terra);color:var(--terra-h)}
.dtbox:has(.dtcal){width:272px}
.dth{display:flex;align-items:center;gap:8px;padding:10px 11px;border-bottom:1px solid var(--ligne)}
.dth b{flex:1;text-align:center;font-family:var(--f-titre);font-size:14px;font-weight:600;
  text-transform:capitalize}
.dth button{width:28px;height:28px;border:1px solid var(--ligne);border-radius:8px;background:#fff;
  font-size:15px;line-height:1;color:var(--encre-2);cursor:pointer}
.dtcal{display:grid;grid-template-columns:repeat(7,1fr);gap:2px;padding:9px}
.dtcal i{text-align:center;font:700 10px/1 var(--f-ui);color:var(--muet);padding:3px 0;font-style:normal}
.dtj{border:1px solid transparent;background:transparent;border-radius:8px;padding:7px 0;
  font:600 12.5px/1 var(--f-ui);color:var(--encre);cursor:pointer}
.dtj:hover{background:var(--surface-2)}
.dtj.auj{border-color:var(--ligne-2)}
.dtj.on{background:var(--terra);color:#fff;border-color:var(--terra)}

/* Légende d'une ligne du kit d'interface. */
.kitrow .kh{font-size:11.5px;color:var(--muet);line-height:1.55;margin-top:5px;flex-basis:100%}
.kitrow code{font-family:ui-monospace,monospace;font-size:11.5px;background:var(--surface-2);
  border:1px solid var(--ligne);border-radius:5px;padding:1px 4px}

/* ═══ v7.87 · Étoile « ajouter à la bibliothèque » ═══
   Posée près de la fermeture, discrète tant qu'on ne la survole pas :
   c'est une action occasionnelle, pas le geste principal. */
.dwfav{width:34px;height:34px;border:1px solid var(--ligne);border-radius:10px;background:#fff;
  color:var(--muet);display:flex;align-items:center;justify-content:center;cursor:pointer;
  flex:none;margin-right:6px;transition:all .12s}
.dwfav[hidden]{display:none}
.dwfav svg{width:16px;height:16px}
.dwfav:hover{color:var(--jaune-h,#8F6512);border-color:var(--jaune-h,#8F6512);background:var(--jaune-pale,#FCF3D8)}
/* Étoile remplie : ce shift est déjà dans la bibliothèque. */
.dwfav.on{color:#8F6512;border-color:#F4CB4B;background:#FCF3D8}
.dwfav.on svg{fill:#F4CB4B}
/* Le groupe d'actions se comporte comme un élément de la barre. */
.plactions{display:flex;align-items:center;gap:10px;flex-wrap:wrap}

/* ═══ v7.93 · Shift validé et sélection pour validation ═══
   Deux états seulement : validé ou non. La couleur de l'étiquette
   reste, le fond se soutient, le bord fonce, une coche pleine
   apparaît. Pas de pastille d'état à apprendre. */
/* Validé : les QUATRE côtés foncent, le gauche restant épais.
   Garder à gauche la teinte claire de l'étiquette le rendait
   invisible sur un fond de la même famille — un liseré bleu pâle sur
   un bleu pâle ne se voit pas (v7.99). Le poste reste identifié par
   le fond et par son nom ; c'est la validation qui a besoin d'être
   lisible d'un coup d'œil. */
.sh.shvalide{filter:saturate(1.4) brightness(.95);
  border-color:currentColor!important;
  border-width:1.5px;border-left-width:4px}

/* ── Shift EN COURS : pointé à l'entrée, pas encore à la sortie ──
   Un pointillé qui tourne dit « ce n'est pas fini » sans ajouter de
   texte dans une case déjà dense. */
/* ── Shift EN COURS ──
   Un liseré qui fait LE TOUR du shift. Le pointillé a disparu : deux
   signaux pour la même chose se concurrençaient, et le trait du bas
   seul ne se lisait pas comme « en cours » (v8.0).

   Technique : un dégradé conique tourne dans un pseudo-élément
   placé DERRIÈRE le contenu, et un masque ne laisse voir que la
   bordure. Aucun décalage de mise en page. */
.sh.shencours{position:relative;border-color:transparent;border-width:2px;border-left-width:3px}
.sh.shencours::before{content:'';position:absolute;inset:-2px;border-radius:9px;padding:2px;
  background:conic-gradient(from var(--ang,0deg),transparent 0deg,currentColor 60deg,
    transparent 130deg,transparent 360deg);
  -webkit-mask:linear-gradient(#000 0 0) content-box,linear-gradient(#000 0 0);
          mask:linear-gradient(#000 0 0) content-box,linear-gradient(#000 0 0);
  -webkit-mask-composite:xor;mask-composite:exclude;
  animation:shtour 2.4s linear infinite;pointer-events:none}
@property --ang{syntax:'<angle>';inherits:false;initial-value:0deg}
@keyframes shtour{to{--ang:360deg}}
/* Repli pour les navigateurs sans @property : un liseré fixe, qui
   dit au moins que le shift est particulier. */
@supports not (background:conic-gradient(from 0deg,red,blue)){
  .sh.shencours{border-color:currentColor;border-style:dashed}
  .sh.shencours::before{display:none}
}
@media (prefers-reduced-motion:reduce){
  .sh.shencours::before{animation:none;background:currentColor;opacity:.5}
}
.sh .shtick{position:absolute;right:5px;bottom:4px;width:15px;height:15px;border-radius:50%;
  background:currentColor;display:flex;align-items:center;justify-content:center;
  box-shadow:0 0 0 1.5px rgba(255,255,255,.65)}
.sh .shtick::before{content:'✓';color:#fff;font-size:9px;font-weight:700;line-height:1}

/* Écart au pointage : rouge si l'on a fait PLUS que prévu — c'est un
   coût —, vert si moins. La couleur porte le sens. */
/* Le MÊME composant sur une piste (v13.11) : un shift validé y
   porte ses heures retenues, et l'écart au prévu se dit exactement
   comme sur la carte. Un second jeu de règles pour le même objet
   finirait par en dire autre chose. */
.sh .dl, .jsh .dl{display:inline-block;font-size:9px;font-weight:700;padding:2px 5px;border-radius:4px;
  margin-left:4px;vertical-align:1px;letter-spacing:.02em}
.sh .dl.p, .jsh .dl.p{background:#BA3E45;color:#fff}
.sh .dl.m, .jsh .dl.m{background:#55773B;color:#fff}
/* Le chiffre vit dans un « <i> » — même gabarit que le segment du
   bloc soudé, qui en a besoin, lui, pour échapper au piège de
   « currentColor ». Une seule forme pour les deux (v12.7). */
.sh .dl > i, .jsh .dl > i{font-style:normal;color:inherit}

/* ═══ LE BLOC SOUDÉ D'UN SHIFT VALIDÉ ═══                    (v12.7)

   Les heures RETENUES et leur écart au prévu forment UN SEUL objet :
   ils partent en paie ensemble, et le bloc le dit. Il n'apparaît
   qu'au dernier état — celui où le nombre ne bougera plus. Tant
   qu'il n'y a pas de bloc, le chiffre est encore susceptible de
   changer.

   Un seul bord, un seul arrondi : « overflow:hidden » suffit à faire
   suivre les coins aux deux segments, il n'y a aucun rayon à
   recalculer de part et d'autre. */
.sh .shret,.jsh .shret{display:inline-flex;align-items:stretch;border-radius:6px;overflow:hidden;
  margin:1px 0;vertical-align:1px;max-width:100%;border:1.5px solid currentColor}
.sh .shret .shrh,.jsh .shret .shrh{padding:2px 7px;background:rgba(255,255,255,.85);
  display:flex;align-items:center;min-width:0}
/* Les heures cèdent quand la colonne rétrécit ; l'écart, JAMAIS.
   Un « +21mn » tronqué en « +2… » serait un chiffre faux à l'écran. */
.sh .shret .shrh > span,.jsh .shret .shrh > span{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
/* ── LE PIÈGE DE « currentColor » ──
   « background:currentColor » AVEC « color:#fff » dans la même règle
   donne un bloc blanc sur blanc : « currentColor » y vaut la couleur
   qu'on vient d'y poser. Le kit résout déjà cela pour « .shtick » —
   le fond sur le parent, la couleur du texte sur l'ENFANT. On copie.

   L'écart prend la couleur DU POSTE, et non un rouge ou un vert
   fixes : mesuré sur les 31 couleurs de la palette, huit d'entre
   elles (Rouge à 0,3° de teinte, Vert à 3,4°, Corail, Framboise,
   Terracotta, Rose, Prune, Orange) avalaient une pastille rouge ou
   verte. Le blanc sur le plein tient de 5,14:1 à 11,12:1 sur toute
   la palette — le seuil lisible est 4,5:1. */
.sh .shret .shre,.jsh .shret .shre{background:currentColor;padding:2px 7px;display:flex;
  align-items:center;flex:none}
.sh .shret .shre > i,.jsh .shret .shre > i{font-style:normal;color:#fff;font-size:10px;font-weight:800;
  letter-spacing:.02em;line-height:1}
/* ── LA COCHE ET L'ENCADRÉ SE COGNAIENT ──
   « .shtick » est posée en ABSOLU au coin bas-droit. Tant que la
   carte portait des heures nues, elle tombait dans le vide ; le bloc
   va jusqu'au bord, et elle se posait dessus — sur une colonne
   étroite, elle mangeait le chiffre de l'écart. Aucune carte isolée
   ne le montrait : il a fallu une grille à la largeur réelle.
   Le kit règle déjà le même cas pour la case à cocher d'un shift
   pointé (« .sh.shpointe{padding-right:26px} ») : on lui emprunte sa
   solution plutôt que d'en inventer une. */
.sh.shvalide{padding-right:24px}

/* ── LA PASTILLE CREUSE : « À VALIDER » ──                   (v13.6)
   Quatre états, et un seul appelait un geste sans porter la moindre
   marque : on le déduisait de la date. Même place et même taille que
   la coche — le regard cherche au même endroit — et c'est la FORME
   qui porte le sens : creuse, il reste à faire ; pleine, c'est fait.
   Le pointillé achève de dire « pas encore ».

   Pas de couleur propre : elle prend celle du poste, comme la coche.
   Un vert « validé » et un ambre « à valider » se seraient battus
   avec les 31 couleurs d'étiquettes, dont un vert et un ambre. */
.shring{width:15px;height:15px;border-radius:50%;border:1.5px dashed currentColor;
  opacity:.7;box-sizing:border-box;flex:none}
.sh.shavalider{padding-right:24px}

/* Case de sélection, à droite, révélée au survol et maintenue une
   fois cochée : sans elle, rien n'indique qu'un shift est
   sélectionnable pour la validation. */
.sh .shcocher{position:absolute;right:5px;top:5px;width:16px;height:16px;border-radius:5px;
  border:1.5px solid currentColor;background:rgba(255,255,255,.78);opacity:0;
  transition:opacity .12s;display:flex;align-items:center;justify-content:center}
.sh:hover .shcocher{opacity:.7}
.sh.shsel .shcocher,.sh:hover.shsel .shcocher{opacity:1;background:var(--terra);
  border-color:var(--terra)}
.sh.shsel .shcocher::before{content:'✓';color:#fff;font-size:10px;font-weight:700;line-height:1}
.sh.shpointe{padding-right:26px}
.selbar .bvalider{background:#55773B!important;border-color:#55773B!important}

/* ═══ v7.94 · Borne : salariés hors journée ═══
   Ils ne sont pas dans la liste du jour, mais restent joignables par
   la recherche — c'est ce que promettait le code sans le faire. */
/* Masquée par défaut, mais le filtre JS doit pouvoir la montrer :
   « display:none » en CSS l'emportait sur le style en ligne, et la
   recherche ne révélait rien. On utilise un attribut piloté. */
.bl.bhors[hidden]{display:none}
.bl.bhors .bn i{color:var(--muet)}
.bhorsinfo{margin:0 0 10px;padding:9px 12px;border-radius:10px;background:#FBEEDB;
  border:1px solid #EFD3A6;color:#8A5A17;font-size:13px;line-height:1.5}
.brech.brech-on{border-color:var(--terra);box-shadow:0 0 0 3px rgba(233,102,70,.14)}

/* ═══ v7.94 · Sélection pour validation ═══
   Dès qu'une case est cochée, TOUTES les cases apparaissent : sinon
   il faut survoler chaque shift pour deviner qu'il est
   sélectionnable. */
body.modesel .sh .shcocher{opacity:.7}
body.modesel .sh.shsel .shcocher{opacity:1}
/* La case rend le clic à elle seule : sans « pointer-events », un
   clic dessus ouvrait le tiroir de modification. */
.sh .shcocher{pointer-events:auto;cursor:pointer;z-index:4}
.jcocher{width:18px;height:18px;border-radius:5px;border:1.5px solid var(--ligne-2);
  background:#fff;cursor:pointer;flex:none;margin-left:6px;opacity:0;transition:opacity .12s;
  display:flex;align-items:center;justify-content:center;padding:0}
.dd:hover .jcocher,body.modesel .jcocher{opacity:.75}
.jcocher.on{opacity:1;background:var(--terra);border-color:var(--terra)}
.jcocher.on::before{content:'✓';color:#fff;font-size:11px;font-weight:700;line-height:1}
/* Second geste de validation : sans pointage, on valide au planifié.
   Teinte plus sobre — c'est l'exception, pas la routine. */
.selbar .bvalider2{background:rgba(255,255,255,.16)!important;
  border-color:rgba(255,255,255,.35)!important}

/* ═══ v7.97 · Borne : logo, secondes, dissociation ═══ */
.blogo.blogoimg{padding:0;overflow:hidden;background:#fff}
.blogo.blogoimg img{width:100%;height:100%;object-fit:contain;display:block}
.bhh small{font-size:.44em;font-weight:600;opacity:.55;margin-left:3px;vertical-align:top;
  letter-spacing:0}
.bdissoc{width:100%;border:1px solid rgba(255,255,255,.22);background:transparent;color:inherit;
  border-radius:10px;padding:9px 12px;font:600 12.5px/1 var(--f-ui);cursor:pointer;opacity:.55;
  transition:opacity .12s}
.bdissoc:hover{opacity:1;border-color:rgba(255,255,255,.4)}

/* Bouton de la barre pendant l'envoi : il dit qu'il a été pressé. */
.selbar button:active{transform:translateY(1px)}
.selbar button.encours{opacity:.7;cursor:progress}
/* Logo de borne plus grand : lisible à deux mètres. */
.bhd .blogo{width:64px;height:64px;font-size:20px}
.bhd .blogo.blogoimg{padding:5px}
/* Dévalider : rouge, et distinct du bouton de validation. */
.selbar .bdevalider{background:#BA3E45!important;border-color:#BA3E45!important}

/* « .btn{display:inline-flex} » l'emporte sur l'attribut hidden : un
   bouton masqué restait visible. Même piège que « .drop » en v7.72 —
   toute classe qui impose un display doit rendre hidden explicite. */
.btn[hidden],.qchip[hidden],.bfil[hidden]{display:none!important}

/* ═══ v8.0 · Bloc de validation dans le tiroir ═══ */
.valbloc{border:1px solid var(--ligne);border-radius:13px;background:var(--surface-2);
  padding:12px 14px;margin-bottom:14px}
.valbloc[hidden]{display:none!important}
.rappelp{display:flex;align-items:baseline;gap:9px;padding:8px 11px;background:var(--carte);
  border:1px solid var(--ligne);border-radius:10px;margin-bottom:11px;font-size:12.5px}
.rappelp span{font-size:10px;font-weight:700;letter-spacing:.06em;text-transform:uppercase;color:var(--muet)}
.rappelp i{font-style:normal;color:var(--muet);font-size:11.5px;margin-left:auto}
.frise{position:relative;padding-left:22px;margin-bottom:11px}
.frise:empty{display:none}
.frise::before{content:'';position:absolute;left:6px;top:8px;bottom:8px;width:2px;background:var(--ligne)}
.frev{position:relative;padding:6px 0;display:block}
.frev .frpt{position:absolute;left:-22px;top:11px;width:12px;height:12px;border-radius:50%;
  border:2.5px solid var(--carte)}
.frev .frpt.in{background:#55773B;box-shadow:0 0 0 1.5px #55773B}
.frev .frpt.out{background:#BA3E45;box-shadow:0 0 0 1.5px #BA3E45}
.frev .frpt.pa{background:var(--muet);box-shadow:0 0 0 1.5px var(--muet)}
.frevh{display:flex;align-items:center;gap:6px;flex-wrap:wrap}
.frevh b{font-size:14px;font-weight:700;font-family:var(--f-titre);min-width:46px}
.frevt{font-size:12px;font-weight:600;color:var(--encre-2)}
.prev{font-size:10.5px;color:var(--muet);background:var(--carte);border:1px solid var(--ligne);
  border-radius:5px;padding:2px 5px}
.frevn{margin-top:4px;background:var(--carte);border:1px solid var(--ligne);border-radius:9px;
  padding:6px 9px;font-size:11.5px;color:var(--encre-2);line-height:1.5}
.frevn .src{display:block;font-size:10px;color:var(--muet);margin-top:2px}
.frvide{font-size:12px;color:var(--muet);line-height:1.55;padding:2px 0 8px}
.bilanp{display:flex;align-items:baseline;gap:9px;padding:9px 11px;border:1px solid var(--ligne);
  border-radius:10px;background:var(--carte)}
.bilanp span:first-child{font-size:10px;font-weight:700;letter-spacing:.06em;
  text-transform:uppercase;color:var(--muet)}
.bilanp b{font-family:var(--f-titre);font-size:18px;font-weight:600;margin-left:auto}
.ecart-pos{background:#BA3E45;color:#fff;font-size:9.5px;font-weight:700;padding:2px 5px;border-radius:4px}
.ecart-neg{background:#55773B;color:#fff;font-size:9.5px;font-weight:700;padding:2px 5px;border-radius:4px}
.tracev{margin-top:10px;font-size:11.5px;color:var(--muet);font-style:italic}
.tracev[hidden]{display:none}
.tracev b{font-style:normal;color:var(--encre-2)}
/* Verrouillé : on le VOIT, on ne le devine pas. */
.dwform.verrouille .dwsect:not(.valbloc){opacity:.55}

/* ═══ v8.2 · Retard constaté, blocs figés ═══ */
.retardb{margin-top:11px;background:#FBEEDB;border:1px solid #EFD3A6;color:#8A5A17;
  border-radius:11px;padding:10px 12px;font-size:12.5px}
.retardb[hidden]{display:none!important}
.retardb b{display:block;margin-bottom:7px}
.retardb .rch{display:flex;gap:6px;flex-wrap:wrap}
.retardb .rch button{border:1px solid #E0C089;background:#fff;border-radius:8px;padding:5px 10px;
  font:600 11.5px/1 var(--f-ui);color:#8A5A17;cursor:pointer}
.retardb .rch button.on{background:#8A5A17;color:#fff;border-color:#8A5A17}
/* Bloc figé : un fait constaté ne se modifie pas. */
.dwsect.fige{opacity:.6;pointer-events:none}

/* ═══ v8.3 · Appairage saisi sur la borne ═══ */
.bappform{display:flex;gap:12px;justify-content:center;align-items:center;margin:22px 0 8px;
  flex-wrap:wrap}
.bappcode{font-family:var(--f-titre);font-size:38px;font-weight:700;letter-spacing:.14em;
  text-align:center;width:290px;padding:14px 10px;border:2px solid var(--ligne-2);
  border-radius:14px;background:#fff;text-transform:uppercase}
.bappcode:focus{outline:none;border-color:var(--terra);box-shadow:0 0 0 4px rgba(233,102,70,.16)}
.bapperr{background:#FBE7E8;border:1px solid #F0C9CB;color:#A8323A;border-radius:12px;
  padding:12px 16px;font-size:15px;margin:0 auto;max-width:520px}
/* Code d'appairage affiché dans ExpéRHia : il doit se lire depuis
   l'autre bout de la pièce, une tablette à la main. */
.codecard{border-color:var(--terra);box-shadow:0 0 0 3px rgba(233,102,70,.1)}
.codegros{font-family:var(--f-titre);font-size:44px;font-weight:700;letter-spacing:.16em;
  color:var(--terra-h);background:var(--terra-pale);border:1px solid #F0C4B4;
  border-radius:14px;padding:16px 20px;display:inline-block}

/* ═══ v8.4 · Fiche tablette et photo au pointage ═══ */
.ptcode{font-family:var(--f-titre);font-size:15px;font-weight:700;letter-spacing:.1em;
  background:var(--terra-pale);border:1px solid #F0C4B4;color:var(--terra-h);
  border-radius:8px;padding:5px 10px;white-space:nowrap}
.ptbloc{flex-basis:100%;padding-top:4px}
.ptbloc .fl{display:block;margin-bottom:5px}

/* Prise de photo sur la borne : plein écran, décompte lisible à deux
   mètres, aucun bouton — un déclencheur manuel se contourne en ne le
   touchant pas. */
.bphoto{position:fixed;inset:0;background:rgba(30,22,14,.94);z-index:600;display:flex;
  flex-direction:column;align-items:center;justify-content:center;gap:18px}
.bphoto[hidden]{display:none}
.bphoto video{width:min(72vw,520px);border-radius:18px;transform:scaleX(-1);background:#000}
.bphoto .bpc{font-family:var(--f-titre);font-size:96px;font-weight:700;color:#fff;line-height:1}
.bphoto .bpt{color:rgba(255,255,255,.85);font-size:17px;text-align:center;max-width:520px;
  line-height:1.5}
.bphoto .bpflash{position:absolute;inset:0;background:#fff;opacity:0;pointer-events:none}
.bphoto .bpflash.on{animation:bpflash .45s ease-out}
@keyframes bpflash{from{opacity:.85}to{opacity:0}}

/* ═══ v8.6 · Choix du mode d'identification ═══
   Deux pastilles larges, avec leur explication : le choix engage la
   manière dont on pointe, il mérite plus qu'un mot. */
.cases.modes{gap:10px}
.cases.modes .chk{align-items:flex-start;padding:12px 14px;max-width:340px}
.cases.modes .mtx{display:flex;flex-direction:column;gap:2px}
.cases.modes .mtx b{font-size:13px;font-weight:600}
.cases.modes .mtx i{font-style:normal;font-size:11.5px;color:var(--muet);line-height:1.45}
.cases.modes .chk .bx{margin-top:2px;border-radius:50%}

/* ═══ v8.6 · Signature au doigt ═══ */
.bsign{position:fixed;inset:0;background:rgba(30,22,14,.94);z-index:620;display:flex;
  align-items:center;justify-content:center;padding:20px}
.bsign[hidden]{display:none}
.bsigncard{background:#fff;border-radius:20px;padding:24px;max-width:760px;width:100%;
  text-align:center}
.bsigncard h2{font-family:var(--f-titre);font-size:24px;font-weight:600;margin:0 0 4px}
.bsigncard p{color:var(--muet);margin:0 0 16px;font-size:15px}
#bsigncv{width:100%;height:auto;max-height:46vh;border:2px dashed var(--ligne-2);
  border-radius:14px;background:var(--surface-2);touch-action:none;cursor:crosshair}
.bsignact{display:flex;gap:10px;justify-content:center;margin-top:16px;flex-wrap:wrap}
.bsignact .bbtn:disabled{opacity:.45;cursor:not-allowed}

/* ═══ LES POINTEUSES EN LIGNES ═══                        (v14.46)

   ── CE QUE LA GRILLE DE CARTES NE SAVAIT PAS FAIRE ──

   Trois cartes de hauteurs différentes ne se comparent pas. La seule
   question qu'on se pose en ouvrant cet écran — « est-ce que mes
   bornes tournent ? » — demande de lire UNE colonne, pas de parcourir
   des blocs. À trente bornes sur six sites, la grille devenait un mur.

   Et elle inversait la gravité : « Supprimer » était le bouton le
   plus voyant de chaque carte, pour le geste le plus rare, quand
   « Modifier » — le plus fréquent — venait en dernier. La ligne
   applique la règle du pied de tiroir : ce qu'on vient faire est
   visible, le reste vit dans un menu.

   Les colonnes sont fixes pour que tout s'aligne d'une ligne à
   l'autre ; seuls le nom et le périmètre respirent. */
.ptbar{display:flex;align-items:flex-start;gap:16px;margin:4px 0 16px;flex-wrap:wrap}
.pth{font-family:var(--f-titre);font-size:21px;font-weight:600;margin:0}
.ptsub{margin:4px 0 0;color:var(--muet);font-size:13px;max-width:62ch;line-height:1.5}
.ptbar .btn{margin-left:auto}

/* ── LA SANTÉ DU PARC ──
   La première question, répondue en premier, avant la liste. Chaque
   puce porte un NOMBRE et ce qu'il compte : « 1 silencieuse » se lit
   de loin, « en veille » ne dit rien. */
.ptsant{display:flex;gap:10px;flex-wrap:wrap;margin-bottom:16px}
.ptsp{display:inline-flex;align-items:center;gap:9px;background:var(--surface-2);
  border:1px solid var(--ligne);border-radius:11px;padding:9px 14px;min-width:0}
.ptsp b{font-family:var(--f-titre);font-size:19px;line-height:1;font-variant-numeric:tabular-nums}
.ptsp i{font-style:normal;font-size:12.5px;color:var(--encre-2);line-height:1.35}
.ptsp i span{display:block;font-size:11.5px;color:var(--muet)}
.ptsp.ok{background:var(--vert-pale);border-color:#CFDEC0}.ptsp.ok b{color:var(--vert)}
.ptsp.wa{background:var(--jaune-pale);border-color:#EAD9AE}.ptsp.wa b{color:var(--jaune)}
.ptsp.ko{background:var(--rouge-pale);border-color:#EED2D4}.ptsp.ko b{color:var(--rouge)}

.ptbar2{display:flex;gap:10px;align-items:center;flex-wrap:wrap;margin-bottom:18px}
.ptsrch{flex:1;min-width:210px;position:relative}
.ptsrch .fi{padding-left:35px}
.ptsrch .ico{position:absolute;left:11px;top:50%;transform:translateY(-50%);color:var(--muet)}

/* Un intertitre d'établissement, avec son filet : il sépare sans
   peser, et disparaît quand la recherche ne laisse qu'un site. */
.ptlg{font:700 11px/1 var(--f-ui);letter-spacing:.08em;text-transform:uppercase;color:var(--muet);
  margin:18px 0 9px;display:flex;align-items:center;gap:9px}
.ptlg:first-child{margin-top:0}
.ptlg::after{content:'';flex:1;height:1px;background:var(--ligne)}

.ptl{display:grid;grid-template-columns:13px minmax(170px,1.2fr) 150px 88px minmax(190px,1.5fr) auto;
  gap:14px;align-items:center;background:var(--carte);border:1px solid var(--ligne);
  border-radius:12px;padding:11px 15px;margin-bottom:8px}
.ptl:hover{border-color:var(--ligne-2);background:var(--surface-2)}
/* Une borne jamais installée n'est pas en panne : elle est À FAIRE.
   Le trait discontinu le dit sans ajouter de pastille. */
.ptl.neuve{border-style:dashed;border-color:var(--ligne-2);background:var(--surface-2)}
.ptl.off{opacity:.62}

.ptlet{width:9px;height:9px;border-radius:50%;justify-self:center}
.ptlet.v{background:var(--vert);box-shadow:0 0 0 3px var(--vert-pale)}
.ptlet.j{background:var(--jaune);box-shadow:0 0 0 3px var(--jaune-pale)}
.ptlet.r{background:var(--rouge);box-shadow:0 0 0 3px var(--rouge-pale)}
.ptlet.g{background:var(--ligne-2);box-shadow:0 0 0 3px var(--surface-2)}

.ptlnom{min-width:0}
.ptlnom b{display:block;font-family:var(--f-titre);font-size:15px;font-weight:600;line-height:1.25;
  white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.ptlnom i{font-style:normal;font-size:12px;color:var(--muet)}

/* ── L'ÉTAT DEVIENT UNE DATE ──
   « En veille » ne dit pas s'il faut aller voir ; « il y a 6 jours »
   le dit. La donnée existait depuis toujours (`derniere_vue`) et
   l'écran n'en montrait qu'une pastille vague. */
.ptlvue{font-size:12.5px;color:var(--muet);line-height:1.35}
.ptlvue b{display:block;font-weight:600;font-size:13px;color:var(--encre)}
.ptlvue.wa b{color:var(--jaune)}
.ptlvue.ko b{color:var(--rouge)}

/* Les pointages du jour : une borne vue il y a quatre minutes mais à
   zéro pointage à quinze heures n'est pas en panne — elle ne sert à
   personne. Ce n'est pas le même problème, et rien ne le disait. */
.ptlptg{text-align:right;font-variant-numeric:tabular-nums}
.ptlptg b{display:block;font-family:var(--f-titre);font-size:17px;font-weight:600;line-height:1}
.ptlptg i{font-style:normal;font-size:11.5px;color:var(--muet)}
.ptlptg.rien b{color:var(--ligne-2)}

.ptlmeta{display:flex;flex-wrap:wrap;gap:5px;min-width:0}
.ptlact{display:flex;gap:7px;align-items:center;justify-self:end;position:relative}

/* ── LE MENU DES GESTES RARES ──
   Renouveler l'identifiant, délier, supprimer : trois gestes qu'on
   fait une fois dans la vie d'un appareil. Ils ne méritent pas trois
   boutons sur chaque ligne. Supprimer y est en dernier et en rouge —
   l'ordre dit la gravité, comme au pied d'un tiroir. */
.ptlmenu{width:31px;height:31px;border:1px solid var(--ligne-2);background:var(--carte);
  border-radius:8px;cursor:pointer;color:var(--encre-2);font-size:15px;line-height:1;
  display:grid;place-items:center;flex:none}
.ptlmenu:hover{background:var(--surface-2);color:var(--encre)}
.ptmn{position:absolute;top:calc(100% + 5px);right:0;z-index:20;min-width:216px;
  background:var(--carte);border:1px solid var(--ligne-2);border-radius:11px;
  box-shadow:var(--ombre-2);padding:5px;display:flex;flex-direction:column}
.ptmn[hidden]{display:none}
.ptmn form{display:contents}
.ptmni{display:flex;align-items:center;gap:9px;width:100%;text-align:left;border:0;
  background:transparent;border-radius:8px;padding:8px 10px;font:600 13px var(--f-ui);
  color:var(--encre);cursor:pointer}
.ptmni:hover{background:var(--surface-2)}
.ptmni .ico{color:var(--muet)}
.ptmni span{flex:1;min-width:0}
/* L'identifiant se copie depuis le menu : il ne se renouvelle pas,
   alors il se lit là où on le cherche (v14.47). */
.ptmni code{font:700 12px/1 ui-monospace,SFMono-Regular,Menlo,monospace;letter-spacing:.08em;
  color:var(--encre-2);background:var(--surface-2);border:1px solid var(--ligne);
  border-radius:6px;padding:2px 6px;margin-left:4px}
.ptmni.dgr{color:var(--rouge)}
.ptmni.dgr:hover{background:var(--rouge-pale)}
.ptmni.dgr .ico{color:var(--rouge)}
.ptmnsep{height:1px;background:var(--ligne);margin:4px 6px}

/* Le code d'appairage n'est montré que là où il sert : sur une borne
   qui n'a jamais été vue. Ailleurs, il encombre une ligne avec une
   chaîne dont personne n'a plus besoin. */
.ptlcode{display:inline-flex;align-items:center;gap:8px;background:var(--jaune-pale);
  border:1px solid #EAD9AE;border-radius:9px;padding:4px 9px}
.ptlcode code{font:700 13px/1 ui-monospace,SFMono-Regular,Menlo,monospace;letter-spacing:.09em;
  color:var(--jaune)}
.ptcopy{border:0;background:transparent;color:var(--jaune);cursor:pointer;font-size:13px;
  padding:1px 3px;line-height:1}
.ptcopy:hover{color:var(--encre)}

@media(max-width:900px){
  .ptl{grid-template-columns:13px minmax(0,1fr) auto;row-gap:9px}
  .ptl > .ptlvue,.ptl > .ptlptg,.ptl > .ptlmeta{grid-column:2/-1}
  .ptlptg{text-align:left}
}

/* ═══ L'ARBRE DES ÉTABLISSEMENTS ═══                      (v14.35)
   Une pointeuse peut desservir plusieurs sites : son périmètre se
   coche dans un arbre — l'établissement, puis ses équipes en
   retrait. La branche s'éclaire quand le site est coché, et les
   équipes ne s'ouvrent qu'à ce moment-là : proposer de resserrer sur
   un site qu'on n'affiche pas n'a aucun sens. */
.ptarb{border:1px solid var(--ligne);border-radius:12px;overflow:hidden;background:var(--surface-2)}
.ptarbe{border-bottom:1px solid var(--ligne)}
.ptarbe:last-child{border-bottom:0}
.ptarbh{padding:11px 14px;margin:0;align-items:center}
.ptarbh b{font-size:13px}
.ptarbe.on{background:var(--carte)}
.ptarbq{display:none;padding:0 14px 12px 43px;gap:8px;flex-wrap:wrap}
.ptarbe.on .ptarbq{display:flex}
.ptarbq .chk{align-items:center;font-size:12.5px}

/* Les trois positions du pointage mobile, dans une cellule de
   tableau : trois boutons de MÊME taille — la règle vaut aussi ici —,
   et celui qui est en vigueur est plein et inerte (v14.37). */
.ptmob{display:flex;gap:5px;margin-top:6px}
.ptmob .btn{padding:3px 9px;font-size:11px}
.ptmob .btn[disabled]{opacity:1;cursor:default}

.ptvide{background:var(--carte);border:1px dashed var(--ligne-2);border-radius:14px;
  padding:38px 22px;text-align:center;display:flex;flex-direction:column;align-items:center;gap:8px}
.ptvide .ptvi{font-size:26px;opacity:.4}
.ptvide b{font-family:var(--f-titre);font-size:17px;font-weight:600}
.ptvide span{color:var(--muet);font-size:13px;max-width:44ch;line-height:1.5}
.ptvide .btn{margin-top:8px}
.ptnone{font-size:11.5px;color:var(--muet);font-style:italic}

/* ═══ v8.8 · Prise de photo : on VOIT qu'une photo se prend ═══ */
.bpcadre{position:relative;display:flex;align-items:center;justify-content:center;
  transition:transform .16s ease}
.bpcadre.declic{transform:scale(.94)}
.bpcoin{position:absolute;width:34px;height:34px;border:3px solid rgba(255,255,255,.85);
  border-radius:4px;pointer-events:none;transition:all .16s ease}
.bpcoin.ht{top:-8px;left:-8px;border-right:0;border-bottom:0}
.bpcoin.hd{top:-8px;right:-8px;border-left:0;border-bottom:0}
.bpcoin.bg{bottom:-8px;left:-8px;border-right:0;border-top:0}
.bpcoin.bd{bottom:-8px;right:-8px;border-left:0;border-top:0}
.bpcadre.declic .bpcoin{width:22px;height:22px}
.bpring{position:absolute;width:150px;height:150px;transform:rotate(-90deg);pointer-events:none}
.bprfond{fill:none;stroke:rgba(255,255,255,.18);stroke-width:6}
.bprjauge{fill:none;stroke:#fff;stroke-width:6;stroke-linecap:round;
  transition:stroke-dashoffset .8s linear}
.bphoto .bpc{position:absolute;font-family:var(--f-titre);font-size:66px;font-weight:700;
  color:#fff;line-height:1;text-shadow:0 2px 18px rgba(0,0,0,.5)}
.bphoto .bpc.pulse{animation:bppulse .8s ease-out}
@keyframes bppulse{from{transform:scale(1.5);opacity:.4}to{transform:scale(1);opacity:1}}
/* ── La photo prise s'affiche AU CENTRE ──
   Elle grandissait dans le coin en bas à droite pendant que le viseur
   vide restait au milieu : on regardait deux choses à la fois, et la
   plus importante — l'image qu'on vient de prendre — était la plus
   petite et la plus loin du regard. Elle prend maintenant la place du
   viseur, puis s'efface en fondu (v10.1). */
.bpvignette{position:absolute;top:50%;left:50%;width:0;height:0;border-radius:18px;
  transform:translate(-50%,-50%) scale(.9);object-fit:cover;opacity:0;
  transition:opacity .28s ease,transform .28s ease;border:3px solid rgba(255,255,255,.9);
  box-shadow:0 18px 50px -12px rgba(0,0,0,.7);z-index:2}
/* « min() » : sur une tablette de 8 pouces en paysage, une image de
   340 px déborderait sous le texte. */
.bpvignette.on{width:min(340px,52vh);height:min(340px,52vh);opacity:1;
  transform:translate(-50%,-50%) scale(1)}
/* Le fondu de sortie : l'image s'éloigne légèrement en s'effaçant,
   elle ne disparaît pas d'un coup. */
.bpvignette.part{opacity:0;transform:translate(-50%,-50%) scale(1.04)}
/* Pendant l'affichage, le viseur s'efface : deux cadres superposés
   feraient un empilement illisible. */
.bpcadre.montre > video,
.bpcadre.montre > .bpcoin,
.bpcadre.montre > .bpring{opacity:0;transition:opacity .2s ease}
/* Le viseur PREND LA TAILLE de l'image affichée : la photo est
   posée en absolu au centre de l'écran, et sans cette réservation
   de place le texte « Photo enregistrée » se retrouvait dessous,
   caché par l'image. */
.bpcadre.montre{width:min(340px,52vh);height:min(340px,52vh);transition:width .28s ease,height .28s ease}
@media (prefers-reduced-motion:reduce){
  .bpcadre,.bpcoin,.bprjauge,.bpvignette{transition:none}
  .bphoto .bpc.pulse{animation:none}
}

/* ═══ v8.9 · Justificatifs déployables ═══
   Le survol montre la pièce elle-même : signature, photo, position.
   Savoir qu'une signature existe ne sert à rien si on ne peut pas la
   regarder. */
/* Pastilles rangées côte à côte, sans émoji. */
.frevh .pj{background:var(--surface-2);border:1px solid var(--ligne);border-radius:20px;
  padding:2px 9px;font-size:10.5px;font-weight:600;color:var(--encre-2);white-space:nowrap}
.pj.pjm{opacity:.8}
.pj.pjv{position:relative;cursor:zoom-in}
.pj.pjv:hover{border-color:var(--terra);color:var(--terra-h)}
.pjbulle{position:absolute;bottom:calc(100% + 8px);left:50%;transform:translateX(-50%) scale(.94);
  background:#fff;border:1px solid var(--ligne);border-radius:12px;padding:6px;
  box-shadow:var(--ombre-2);opacity:0;pointer-events:none;transition:opacity .13s,transform .13s;
  z-index:30}
.pjbulle img{display:block;width:210px;height:auto;max-height:150px;object-fit:contain;
  border-radius:8px;background:var(--surface-2)}
.pjbulle.pjtxt{padding:8px 11px;font-size:11.5px;font-family:ui-monospace,monospace;
  white-space:nowrap;color:var(--encre-2)}
.pj.pjv:hover .pjbulle,.pj.pjv:focus-within .pjbulle{opacity:1;transform:translateX(-50%) scale(1)}

/* ═══ v8.9 · Focus des champs ═══
   L'anneau orange flou débordait des angles et changeait la forme du
   champ. Un liseré net, de la couleur du champ, suffit à dire où l'on
   écrit sans repeindre l'écran. */
/* Une bordure ORANGE, et rien d'autre. L'ombre portée épaississait
   le champ et brouillait ses angles ; la couleur de la charte suffit
   à dire où l'on écrit (v9.0). */
.fi:focus,.fi:focus-visible,
.pdur:focus-within,.telf:focus-within,.selrs input:focus,
input[type=time]:focus,input[type=date]:focus,input[type=number]:focus,
textarea:focus,select:focus{
  outline:none;
  border-color:var(--terra);
  box-shadow:none;
}
/* Ne PAS toucher au rayon : « inherit » prenait celui du parent et
   carrait les angles au focus — c'est précisément ce qu'on voulait
   corriger (v8.9). */

/* ═══ v8.9 · Simulation des heures retenues ═══ */
.simu{margin-top:14px;border:1px solid var(--ligne);border-radius:12px;overflow:hidden;
  background:var(--surface-2)}
.simuh{padding:10px 14px;font-size:12.5px;color:var(--encre-2);border-bottom:1px solid var(--ligne);
  background:var(--carte)}
.simug{display:grid;grid-template-columns:repeat(auto-fit,minmax(240px,1fr))}
.simuc{padding:12px 14px}
.simuc + .simuc{border-left:1px solid var(--ligne)}
.simut{font:700 10.5px/1 var(--f-ui);letter-spacing:.06em;text-transform:uppercase;
  color:var(--muet);margin-bottom:9px}
.simut i{font-style:normal;font-weight:500;text-transform:none;letter-spacing:0;opacity:.8}
.simul{display:flex;align-items:baseline;gap:10px;padding:5px 0;font-size:12.5px}
.simul span{color:var(--muet);flex:1}
.simul b{font-family:var(--f-titre);font-size:15px;font-weight:600}
.simup{padding:10px 14px;border-top:1px solid var(--ligne);background:var(--carte);
  font-size:12.5px;color:var(--encre-2)}
/* Service terminé sur la borne : visible, mais plus cliquable. */
.bl.bfini{opacity:.5;cursor:default;pointer-events:none}

/* ═══ Réglages d'affichage d'une pointeuse ═══            (v14.46)

   ── CE QUI EST PARTI, ET POURQUOI ──

   `.ptsh` doublait `.ftitre` — un intertitre en petites capitales
   grises se confond avec une aide, c'est écrit dans le kit. `.ptopt`,
   `.ptol` et `.ptsw` redessinaient l'interrupteur du kit, `.sw`, en
   quarante pixels plus large et d'un autre vert : deux composants qui
   se ressemblent sans se ressembler tout à fait. Le tiroir reprend
   les vrais.

   `.ptsous` reste : il n'a pas d'équivalent. Les sous-options de la
   météo et le délai de veille suivent leur interrupteur — un délai
   réglable sous une veille éteinte n'a aucun sens (v9.7). Il se cale
   maintenant sous une ligne de `.swliste`, d'où le retrait. */
.ptsous{padding:1px 0 2px 45px;margin:-4px 0 4px}
.ptsous[hidden]{display:none}

/* ═══ v9.1 · Borne : logo libre, météo en ligne, thème ═══ */
.blogoimg2{max-width:170px;max-height:52px;width:auto;height:auto;object-fit:contain;display:block}

/* Météo EN LIGNE : une colonne d'heures obligeait à lire de haut en
   bas ce qui se déroule de gauche à droite. */
.bmeteo{background:rgba(255,255,255,.05);border:1px solid rgba(255,255,255,.09);
  border-radius:14px;padding:12px}
.bmnow{display:flex;align-items:center;gap:11px}
.bmnow b{display:block;font-family:var(--f-titre);font-size:26px;font-weight:600;line-height:1}
.bmnow i{display:block;font-style:normal;font-size:11.5px;opacity:.7;line-height:1.4;margin-top:2px}
.bmi{display:flex;flex:none}
.bmh{display:flex;gap:5px;margin-top:11px}
.bmhc{flex:1;text-align:center;background:rgba(255,255,255,.05);border:1px solid transparent;
  border-radius:9px;padding:6px 2px;min-width:0}
.bmhc.pluie{border-color:rgba(110,155,200,.5);background:rgba(110,155,200,.16)}
.bmhc b{display:block;font-size:10px;font-weight:600;opacity:.6}
.bmhc span{display:flex;justify-content:center;margin:2px 0}
.bmhc i{display:block;font-style:normal;font-size:11.5px;font-weight:600}
.bmhc u{display:block;text-decoration:none;font-size:9.5px;opacity:.75}
.bmjour{display:flex;gap:12px;flex-wrap:wrap;margin-top:9px;font-size:11.5px;opacity:.8}

.bnote{background:rgba(233,162,59,.14);border:1px solid rgba(233,162,59,.35);border-radius:14px;
  padding:12px 14px}
.bnote b{display:block;font-size:10.5px;letter-spacing:.06em;text-transform:uppercase;
  opacity:.8;margin-bottom:4px}
.bnote span{display:block;font-size:13px;line-height:1.5}

/* ── Thème clair ──
   Une borne dans un hall vitré à midi et une borne de couloir à 22 h
   n'ont pas les mêmes contraintes. */
body.borne.theme-clair{background:#F2EFE7;color:var(--encre)}
/* La barre latérale fixait « color:#EFE9DC » : en thème clair, un
   texte crème sur fond blanc était invisible. On reprend la couleur
   ET tout ce qui en dépend (v9.1). */
body.borne.theme-clair .bside{background:#fff;color:var(--encre);
  border-right:1px solid var(--ligne)}
body.borne.theme-clair .bside h4,
body.borne.theme-clair .bhh,
body.borne.theme-clair .bmnow b,
body.borne.theme-clair .bmhc i,
body.borne.theme-clair .bnote span{color:var(--encre)}
body.borne.theme-clair .bmnow i,
body.borne.theme-clair .bmjour,
body.borne.theme-clair .bli{color:var(--encre-2)}
body.borne.theme-clair .bnote{background:var(--terra-pale);border-color:#F0C4B4;color:var(--terra-h)}
body.borne.theme-clair .bnote b{color:var(--terra-h)}
body.borne.theme-clair .bav{background:var(--surface-2);color:var(--encre-2)}
body.borne.theme-clair .bpied,
body.borne.theme-clair .bside small{color:var(--muet)}
body.borne.theme-clair .bcarte,
body.borne.theme-clair .bmeteo{background:var(--surface-2);border-color:var(--ligne)}
body.borne.theme-clair .bmhc{background:#fff;border-color:var(--ligne)}
body.borne.theme-clair .bmhc.pluie{background:#E7EEF6;border-color:#B7CBE0}
body.borne.theme-clair .bdissoc{border-color:var(--ligne-2);color:var(--encre-2)}

/* ═══ v9.2 · Thème sur la borne ═══
   (La météo « en bande » de cette version a vécu : elle est revenue
   dans la colonne en v9.5, la bande poussait la grille des noms vers
   le bas.)
   Le bouton de thème vit EN BAS de la colonne, avec une icône qui
   montre l'état — soleil, lune, cadran auto. En haut, il se lisait
   avant la date, comme s'il était le plus important de l'écran
   (v9.5). */
.bthemebtn{display:flex;align-items:center;justify-content:center;gap:8px;width:100%;
  border:1px solid rgba(255,255,255,.2);background:transparent;color:inherit;
  border-radius:11px;padding:10px 12px;font:600 12px/1 var(--f-ui);cursor:pointer;
  opacity:.75;transition:opacity .12s}
.bthemebtn:hover{opacity:1}
.bthemebtn .bico{width:16px;height:16px;flex:none;display:block}
body.borne.theme-clair .bthemebtn{border-color:var(--ligne-2);color:var(--encre-2)}

/* ═══ v9.2 · Le geste attendu sur chaque ligne ═══
   « Enregistrer mon arrivée », « Prendre ma pause » : la ligne dit
   ce qu'on vient faire, pas seulement qui l'on est. */
.bl .bgest{display:block;text-decoration:none;margin-top:3px;font-size:13px;font-weight:600;
  color:var(--or,#E9A23B)}
body.borne.theme-clair .bl .bgest{color:var(--terra-h)}
.bl.bfini .bgest{display:none}

/* ═══ v9.3 · Récapitulatif après pointage, événements ═══ */
.brecap{display:grid;grid-template-columns:repeat(auto-fit,minmax(140px,1fr));gap:11px;
  width:100%;max-width:680px;margin:6px 0}
.brc{background:rgba(255,255,255,.07);border:1px solid rgba(255,255,255,.12);
  border-radius:14px;padding:14px;text-align:left}
.brc b{display:block;font-family:var(--f-titre);font-size:24px;font-weight:600;line-height:1}
.brc i{display:block;font-style:normal;font-size:12px;opacity:.7;margin-top:3px;line-height:1.35}
.bnote2{max-width:680px;text-align:left}
body.borne.theme-clair .brc{background:var(--surface-2);border-color:var(--ligne)}

/* Événements du jour : une ligne de pastilles, sans emphase. */
.bevts{display:flex;gap:8px;flex-wrap:wrap;margin-bottom:12px}
.bevt{font-size:12.5px;padding:6px 13px;border-radius:20px;
  background:rgba(255,255,255,.07);border:1px solid rgba(255,255,255,.12)}
.bevt.anniv{background:rgba(233,162,59,.16);border-color:rgba(233,162,59,.4)}
.bevt.ferie{background:rgba(196,86,78,.16);border-color:rgba(196,86,78,.4)}
.bevt.vacances{background:rgba(108,151,76,.16);border-color:rgba(108,151,76,.4)}
body.borne.theme-clair .bevt{background:var(--surface-2);border-color:var(--ligne);color:var(--encre-2)}
body.borne.theme-clair .bevt.anniv{background:#FBF0DC;border-color:#EBD3A8;color:#8A5A17}
body.borne.theme-clair .bevt.ferie{background:#FBE7E8;border-color:#F0C9CB;color:#A8323A}
body.borne.theme-clair .bevt.vacances{background:#EDF3E6;border-color:#CBDBB9;color:#3F6127}

/* ═══ v9.3 · Écran de veille ═══ */
.bveille{position:fixed;inset:0;z-index:500;background:inherit;display:flex;
  flex-direction:column;align-items:center;justify-content:center;gap:18px;text-align:center;
  padding:24px}
.bveille[hidden]{display:none}
.bvlogo{max-width:220px;max-height:78px;width:auto;height:auto;object-fit:contain}
.bvh{font-family:var(--f-titre);font-size:clamp(64px,11vw,120px);font-weight:700;line-height:1}
.bvh small{font-size:.34em;opacity:.5;margin-left:5px;vertical-align:top}
.bvj{font-size:17px;opacity:.7;text-transform:capitalize}
.bvcartes{display:flex;gap:12px;flex-wrap:wrap;justify-content:center}
.bvc{min-width:132px;background:rgba(255,255,255,.07);border:1px solid rgba(255,255,255,.12);
  border-radius:14px;padding:14px 18px;text-align:left}
.bvc b{display:block;font-family:var(--f-titre);font-size:30px;font-weight:600;line-height:1}
.bvc i{display:block;font-style:normal;font-size:12.5px;opacity:.7;margin-top:3px}
.bvc.alerte{background:rgba(196,86,78,.16);border-color:rgba(196,86,78,.42)}
.bvnote{max-width:620px;font-size:15px;line-height:1.55;opacity:.8}
.bvtouch{font-size:14px;opacity:.5}
body.borne.theme-clair .bvc{background:var(--surface-2);border-color:var(--ligne)}
body.borne.theme-clair .bvc.alerte{background:#FBE7E8;border-color:#F0C9CB}

/* ═══ v9.4 · La borne en cartes ═══
   Une liste de lignes se lit de haut en bas, une par une. Une grille
   de cartes se balaie du regard : sur une borne où l'on passe en dix
   secondes, c'est ce qui compte. */
.btitre{font-family:var(--f-titre);font-size:26px;font-weight:600;margin:0 0 14px}

/* « min-height:0 » : sans lui, « flex:1 » ne peut pas rétrécir la
   grille sous la taille de ses cartes, et « overflow:auto » n'a rien
   à faire défiler (v14.38). L'inertie tactile est demandée
   explicitement : sur iPad, une zone qui défile sans élan se manipule
   comme une fenêtre, pas comme un écran. */
.bgrille{display:grid;grid-template-columns:repeat(auto-fill,minmax(210px,1fr));gap:12px;
  align-content:start;overflow-y:auto;overflow-x:hidden;flex:1 1 auto;min-height:0;padding:2px;
  -webkit-overflow-scrolling:touch;overscroll-behavior:contain}
/* ═══ LA BULLE DE SALARIÉ ═══                              (v14.38)

   « Manque de clarté sur qui a pointé, pas pointé, quand — je parle
   seulement de la bulle de salarié. »

   Trois défauts, et ils se tenaient :

     · TOUT PESAIT PAREIL. Six lignes de même poids, aucun point
       d'entrée : l'œil lisait de haut en bas comme un formulaire.
     · L'ÉTAT — la chose qu'on cherche — tenait dans une pastille de
       dix pixels, dans le coin, loin du nom. Il fallait décoder une
       couleur de mémoire.
     · « QUI A POINTÉ, PAS POINTÉ, QUAND » était réparti sur trois
       endroits qui ne se lisaient pas ensemble : l'horaire prévu, les
       pastilles de pointage, le prochain geste.

   La carte porte maintenant un filet d'état sur son bord gauche et le
   mot en toutes lettres ; la photo occupe sa propre colonne avec le
   prénom et le nom empilés à côté, centrés sur elle ; et le PRÉVU est
   suivi du POINTÉ, deux lignes alignées au pixel.                  */
.bcart{position:relative;display:flex;flex-direction:column;align-items:flex-start;gap:6px;
  background:rgba(255,255,255,.06);border:1px solid rgba(255,255,255,.12);border-radius:18px;
  border-left:5px solid rgba(255,255,255,.22);
  padding:15px 15px 15px 13px;cursor:pointer;text-align:left;font-family:inherit;color:inherit;
  transition:transform .13s,border-color .13s}
.bcart[data-etat=retard],.bcart[data-retard="1"]{border-left-color:#C4564E}
.bcart[data-etat=present]{border-left-color:#6C974C}
.bcart[data-etat=pause]{border-left-color:#E9A23B}
.bcart[data-etat=fini]{border-left-color:rgba(255,255,255,.18)}
.bcet{font:700 10px/1.25 var(--f-ui);letter-spacing:.08em;text-transform:uppercase;opacity:.62}
.bcart[data-retard="1"] .bcet{color:#E88A84;opacity:1}
.bcart[data-etat=present] .bcet{color:#8FCB6B;opacity:1}
.bcart[data-etat=pause] .bcet{color:#E9A23B;opacity:1}
/* La photo dans SA colonne, le nom empilé à côté et centré sur elle. */
.bcqui{display:flex;align-items:center;gap:11px;width:100%;min-width:0}
/* « flex:1 » ET « min-width:0 » : sans le premier le bloc garde sa
   largeur naturelle et le nom se coupe alors que la carte a de la
   place ; sans le second il refuse de se réduire quand elle n'en a
   pas. Il faut les deux. */
.bcid{flex:1 1 auto;min-width:0;display:flex;flex-direction:column;justify-content:center}
.bcpr{display:block;font-family:var(--f-titre);font-size:17px;font-weight:600;line-height:1.15;
  white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.bcnf{display:block;font-style:normal;font-size:12.5px;font-weight:600;letter-spacing:.02em;
  opacity:.7;line-height:1.25;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
/* Le prévu, et le réel juste dessous. Deux colonnes : le mot, la
   valeur. Chiffres à chasse fixe, pour que l'écart se voie sans se
   calculer. */
.bchrs{display:grid;grid-template-columns:auto 1fr;gap:1px 9px;width:100%;
  font-variant-numeric:tabular-nums;margin-top:1px}
.bck{font-style:normal;font:600 9.5px/1.6 var(--f-ui);letter-spacing:.05em;text-transform:uppercase;
  opacity:.5;align-self:center}
.bcv{font-family:var(--f-titre);font-size:13.5px;font-weight:600;line-height:1.35;
  display:flex;align-items:baseline;gap:5px;flex-wrap:wrap;min-width:0}
.bcv em{font-style:normal;opacity:.35;font-size:.9em}
.bcv u{text-decoration:none;font-family:var(--f-ui);font-weight:400;font-size:10.5px;opacity:.5}
.bcreel{color:#8FCB6B}
.bcreel.pz{color:#E9A23B}
.bcreel.gr{opacity:.65}
.bcreel.ko{color:#E88A84;font-family:var(--f-ui);font-size:12px}
/* Le survol ne teint QUE trois côtés : passer la bordure gauche en or
   effacerait la seule information que la carte donne de loin. */
.bcart:hover{transform:translateY(-2px);border-top-color:var(--or,#E9A23B);
  border-right-color:var(--or,#E9A23B);border-bottom-color:var(--or,#E9A23B)}
.bcart:active{transform:translateY(0)}
.bcart.bhors[hidden]{display:none}
.bcart.bfini{opacity:.45;cursor:default;pointer-events:none}
/* v14.255 : service terminé, nouvelle arrivée possible : la carte reste touchable. */
.bcart.bfini.brouv{pointer-events:auto;cursor:pointer;opacity:.6}

/* L'avatar occupe sa propre ligne, en tête de carte : à côté du nom
   il écrasait un nom long sur trois lignes (v9.4). */
.bav3{width:52px;height:52px;border-radius:50%;font-size:16px;font-weight:700;flex:none;
  display:flex;align-items:center;justify-content:center;overflow:hidden}
.bav3 img{width:100%;height:100%;object-fit:cover}
.bcnom{font-size:15px;font-weight:600;line-height:1.25}
.bchr{font-size:12px;opacity:.72;line-height:1.4}
.bcptg{font-size:11.5px;opacity:.55;line-height:1.4}
/* ── L'HEURE DU PROCHAIN GESTE ──                        (v14.36)
   « Arriver » ne disait pas quand. L'heure passe en chiffres, et le
   compte à rebours derrière, en plus discret : c'est l'heure qu'on
   compare à la pendule, le « dans 12 min » ne fait que confirmer. */
.bcact{display:flex;align-items:baseline;gap:6px;flex-wrap:wrap;
  font-size:13px;font-weight:600;color:var(--or,#E9A23B);margin-top:auto;padding-top:3px}
.bcact b{font-variant-numeric:tabular-nums}
.bcact i{font-style:normal;font-weight:500;opacity:.62;font-size:12px}
.bcart.bfini .bcact{color:inherit;opacity:.7;font-weight:500}

/* Pastille d'état : la couleur dit où en est la personne. */
.bpt2{position:absolute;top:14px;right:14px;width:10px;height:10px;border-radius:50%}
.bpt2.attendu{background:rgba(255,255,255,.3)}
.bpt2.present{background:#6C974C;box-shadow:0 0 0 4px rgba(108,151,76,.22)}
.bpt2.pause{background:#E9A23B;box-shadow:0 0 0 4px rgba(233,162,59,.22)}
.bpt2.retard{background:#C4564E;box-shadow:0 0 0 4px rgba(196,86,78,.22)}
.bpt2.fini{background:transparent;border:2px solid rgba(255,255,255,.3)}

body.borne.theme-clair .bcart{background:#fff;border-color:var(--ligne);
  border-left-color:var(--ligne-2)}
body.borne.theme-clair .bcart:hover{border-top-color:var(--terra);
  border-right-color:var(--terra);border-bottom-color:var(--terra)}
body.borne.theme-clair .bcart[data-etat=retard],
body.borne.theme-clair .bcart[data-retard="1"]{border-left-color:var(--rouge)}
body.borne.theme-clair .bcart[data-etat=present]{border-left-color:var(--vert)}
body.borne.theme-clair .bcart[data-etat=pause]{border-left-color:var(--jaune)}
body.borne.theme-clair .bcart[data-etat=fini]{border-left-color:var(--ligne-2)}
body.borne.theme-clair .bcart[data-retard="1"] .bcet{color:var(--rouge)}
body.borne.theme-clair .bcart[data-etat=present] .bcet{color:var(--vert)}
body.borne.theme-clair .bcart[data-etat=pause] .bcet{color:var(--jaune)}
body.borne.theme-clair .bcreel{color:var(--vert)}
body.borne.theme-clair .bcreel.pz{color:var(--jaune)}
body.borne.theme-clair .bcreel.ko{color:var(--rouge)}
body.borne.theme-clair .bcact{color:var(--terra-h)}
body.borne.theme-clair .bpt2.attendu{background:var(--ligne-2)}
body.borne.theme-clair .bpt2.fini{border-color:var(--ligne-2)}

/* ═══ v9.4 · Thème sombre, pour de bon ═══
   La borne était CLAIRE par défaut : mes règles « theme-sombre » ne
   repeignaient que ce que j'avais ajouté, et la zone principale
   restait crème. On reprend le fond, les cartes et les filtres. */
body.borne.theme-sombre{background:#1B140D;color:#F2EDE3}
body.borne.theme-sombre .bside{background:#2C2418;color:#EFE9DC;border-right:1px solid #40311F}
body.borne.theme-sombre .bmain{background:transparent}
body.borne.theme-sombre .btitre{color:#fff}
body.borne.theme-sombre .bfil{background:#2C2418;color:#DCCDB4}
body.borne.theme-sombre .bfil.on{background:#E9A23B;color:#231A0F}
body.borne.theme-sombre .bfil span{opacity:.6}
body.borne.theme-sombre .brech{background:#2C2418;border-color:#40311F;color:#F2EDE3}
body.borne.theme-sombre .brech::placeholder{color:#8C7B64}
body.borne.theme-sombre .bcarte{background:#2C2418;border-color:#40311F}
body.borne.theme-sombre .bleg{color:#8C7B64}
body.borne.theme-sombre .bvide{color:#8C7B64}

/* ═══ v9.5 · Le contexte du jour dans la colonne ═══
   Météo, note et événements quittent la zone principale, comme sur
   la maquette : la grille des noms remonte — elle est la raison
   d'être de la borne — et la colonne raconte la journée, du haut vers
   le bas : l'heure, les oublis, le ciel, la consigne, les
   anniversaires. */
/* La colonne ne défile pas elle-même : c'est « .bsmid » qui le fait.
   Sans quoi le bouton « Connectée » et le bouton de thème partiraient
   hors de vue dès qu'on ferait défiler la météo (v14.38). */
.bside{overflow:hidden}
.bside .bmeteo,.bside .bnote,.bside .bevts{flex:none}
.bside .bevts{margin-bottom:0}
/* En thème clair, la colonne est blanche et les blocs reprennent les
   surfaces du kit : les règles « theme-clair » de la v9.1 couvrent
   déjà .bmeteo, .bnote et .bevt. Rien à ajouter — les blocs étaient
   nés pour cette colonne avant leur détour en bande (v9.2). */

/* ═══════════════════════════════════════════════════════════════
   v9.6 · Les écrans du flux, dans le châssis de la borne
   Jusqu'ici, pointer faisait surgir une boîte crème par-dessus toute
   la borne : la colonne disparaissait, le thème sombre sautait, et
   l'on changeait visiblement d'application au milieu d'un geste. Les
   écrans occupent désormais la ZONE PRINCIPALE — la colonne reste,
   l'heure continue de battre. C'est le châssis des écrans 2 à 4 de
   la maquette.
   ═══════════════════════════════════════════════════════════════ */

/* Le fond de la borne, nommé : les écrans du flux doivent le
   reprendre exactement, sinon la grille des noms transparaît. */
body.borne{--bfond:#F2EFE7}
body.borne.theme-clair{--bfond:#F2EFE7}
body.borne.theme-sombre{--bfond:#1B140D}

.bmain{position:relative}
.bapp .bmodal{position:absolute;inset:0;z-index:40;background:var(--bfond);
  display:flex;align-items:stretch;justify-content:center;padding:0}
.bapp .bmodal[hidden]{display:none}
.bapp .bmbox{background:transparent;border-radius:0;width:100%;max-width:none;max-height:none;
  box-shadow:none;overflow:auto;display:flex;flex-direction:column}

/* ── La colonne pendant un pointage ──
   Elle se vide de la journée : la météo et les anniversaires ne sont
   plus le sujet, la personne l'est. */
body.borne.bflux .bcarte,
body.borne.bflux .bside .bmeteo,
body.borne.bflux .bside .bnote,
body.borne.bflux .bside .bevts,
body.borne.bflux .bbloc:not(.bctx),
body.borne.bflux .bstat,
body.borne.bflux .bthemebtn,
body.borne.bflux #fdissoc{display:none}

/* Bloc de colonne, forme unique : effectif, et contexte du flux. */
.bbloc{background:rgba(255,255,255,.07);border:1px solid rgba(255,255,255,.1);
  border-radius:12px;padding:12px 13px}
.bbloc[hidden]{display:none}
.bbloc b{display:block;font-size:12px;font-weight:600;margin-bottom:5px;opacity:.9}
.bbloc i{display:block;font-style:normal;font-size:11.5px;line-height:1.5;opacity:.62}
body.borne.theme-clair .bbloc{background:var(--surface-2);border-color:var(--ligne)}
body.borne.theme-clair .bbloc b{color:var(--encre)}
body.borne.theme-clair .bbloc i{color:var(--encre-2);opacity:1}

/* ── Écran centré d'une personne ── */
.bsolo{flex:1;display:flex;flex-direction:column;align-items:center;justify-content:center;
  gap:17px;text-align:center;padding:22px}
.bsolo h1{font-family:var(--f-titre);font-size:clamp(26px,3.1vw,34px);font-weight:600;margin:0}
.bsous{font-size:15px;line-height:1.6;max-width:54ch;margin:0;opacity:.74}
.bsolo .bpetit{margin:0;min-height:19px}

/* La grande pastille : photo si elle existe, initiales sinon. */
.bavg{width:96px;height:96px;border-radius:50%;flex:none;overflow:hidden;color:#fff;
  display:flex;align-items:center;justify-content:center;
  font:700 30px/1 var(--f-ui)}
.bavg img{width:100%;height:100%;object-fit:cover}

/* ── Les gestes, en gros ──
   La couleur dit la nature du geste : arriver et reprendre sont le
   travail (vert), partir est le seul qu'on ne défait pas (rouge), la
   pause n'engage rien (neutre). */
.bgros{display:flex;gap:14px;flex-wrap:wrap;justify-content:center;margin-top:2px}
.bgbtn{border:0;border-radius:20px;padding:24px 38px;min-width:250px;cursor:pointer;
  display:flex;flex-direction:column;gap:4px;align-items:center;font-family:var(--f-ui);
  transition:transform .13s,filter .13s}
.bgbtn b{display:block;font-family:var(--f-titre);font-size:22px;font-weight:600}
.bgbtn i{display:block;font-style:normal;font-size:12.5px;opacity:.82}
.bgbtn:hover{transform:translateY(-2px)}
.bgbtn:active{transform:translateY(0);filter:brightness(.94)}
.bgbtn.p{background:#6C974C;color:#fff}
.bgbtn.d{background:#C4564E;color:#fff}
.bgbtn.s{background:rgba(255,255,255,.07);color:inherit;border:1px solid rgba(255,255,255,.16)}
body.borne.theme-clair .bgbtn.p{background:var(--vert)}
body.borne.theme-clair .bgbtn.d{background:var(--rouge)}
body.borne.theme-clair .bgbtn.s{background:#fff;border-color:var(--ligne-2);color:var(--encre-2)}

/* Lien discret : « Continuer sans donner de motif ». Il ne doit
   surtout pas ressembler à un geste de pointage. */
.blien{background:none;border:0;color:inherit;opacity:.55;font-family:var(--f-ui);
  font-size:13.5px;cursor:pointer;text-decoration:underline;padding:6px 10px}
.blien:hover{opacity:.9}

/* ── L'ICÔNE DU GESTE ──                                   (v14.85)
   Au-dessus du mot, centrée comme lui : le bouton garde exactement
   la même largeur, et la rangée des gestes ne se réorganise pas. */
.bgbi{width:26px;height:26px;flex:0 0 auto;opacity:.92}

/* ── LE RETOUR ──                                          (v14.85)
   « Ce n'est pas moi » était un lien souligné de treize pixels sous
   un mur de boutons de cinquante : le seul chemin de sortie de
   l'écran, et son plus petit élément.

   Il est seul sur sa ligne — la règle d'or tient : jamais deux
   tailles de bouton côte à côte. Il reste secondaire par sa couleur,
   pas par sa taille : sortir d'un écran ouvert par erreur n'est pas
   un geste de pointage, mais ce n'est pas non plus un geste qu'on
   doit chercher. */
.bret{display:inline-flex;align-items:center;justify-content:center;gap:10px;
  border-radius:18px;padding:15px 30px;min-width:250px;cursor:pointer;
  background:rgba(255,255,255,.06);border:1px solid rgba(255,255,255,.16);color:inherit;
  font-family:var(--f-ui);font-size:16.5px;font-weight:600;margin-top:2px;
  transition:transform .13s,filter .13s}
.bret:hover{transform:translateY(-2px)}
.bret:active{transform:translateY(0);filter:brightness(.94)}
.bret .bgbi{width:21px;height:21px}
body.borne.theme-clair .bret{background:#fff;border-color:var(--ligne-2);color:var(--encre-2)}

/* Le décompte du retour automatique. Il bat à la seconde : un écran
   qui s'en va sans prévenir passe pour un plantage. */
.brdec{font-style:normal;font-variant-numeric:tabular-nums;
  min-width:25px;height:25px;border-radius:50%;
  display:inline-flex;align-items:center;justify-content:center;
  background:rgba(255,255,255,.14);font-size:13px;font-weight:600;opacity:.9}
body.borne.theme-clair .brdec{background:var(--fond-2)}
.brdec[hidden]{display:none}

/* ── Consigne : pause légale, note du jour ──
   Un filet vertical plutôt qu'un encadré complet : on la remarque
   sans qu'elle prenne le pas sur le geste. */
.bconsigne{display:flex;gap:12px;text-align:left;max-width:660px;padding:14px 16px;
  border-radius:14px;background:rgba(233,162,59,.13);border:1px solid rgba(233,162,59,.32)}
.bconsigne .pt{width:7px;border-radius:4px;background:#E9A23B;flex:none}
.bconsigne b{display:block;font-size:13px;font-weight:700;margin-bottom:3px}
.bconsigne span{font-size:12.8px;line-height:1.55}
body.borne.theme-clair .bconsigne{background:var(--jaune-pale);border-color:#E9D6A8;color:#7A5410}
body.borne.theme-clair .bconsigne .pt{background:var(--jaune)}

/* ── LES TÂCHES DU JOUR, SUR LA BORNE ──                  (v14.32)

   Sous la note du jour, à l'écran de confirmation : le seul moment où
   la personne est arrêtée devant la tablette.

   La cible fait 56 px de haut, et c'est la LIGNE ENTIÈRE qui coche —
   viser une pastille de treize pixels debout, à bout de bras, sur une
   tablette murale, ne marche pas. C'est l'inverse du site, où la
   pastille seule est cliquable parce qu'on a une souris.

   Pas de retour en arrière ici : une ligne verte ne réagit plus.
   Décocher est un geste de correction, il se fait dans
   l'application, où l'on voit qui avait coché et quand. */
.btk{width:100%;max-width:660px;margin-top:16px;text-align:left}
.btkh{font-size:11.5px;font-weight:700;letter-spacing:.05em;text-transform:uppercase;
  opacity:.62;margin-bottom:7px}
.btkl{display:flex;align-items:center;gap:12px;min-height:56px;padding:9px 14px;
  border-radius:14px;background:rgba(255,255,255,.05);border:1px solid rgba(255,255,255,.13);
  margin-bottom:7px;cursor:pointer;transition:background .12s,border-color .12s,opacity .18s}
.btkl:active{background:rgba(255,255,255,.11)}
.btkc{width:26px;height:26px;flex:none;border-radius:50%;position:relative;
  border:2px solid rgba(255,255,255,.5);transition:background .14s,border-color .14s}
.btkc::after{content:'';position:absolute;left:50%;top:48%;width:7px;height:13px;
  border:solid #fff;border-width:0 2.5px 2.5px 0;
  transform:translate(-50%,-56%) rotate(45deg) scale(.4);
  opacity:0;transition:opacity .14s,transform .14s}
.btkt{flex:1;min-width:0;font-size:14.5px;font-weight:600;line-height:1.35}
.btkq{font-size:12.5px;font-weight:600;opacity:.6;flex:none}
/* Ce qui explique pourquoi une ligne se comporte autrement : sans
   destinataire, ou à faire ailleurs. */
.btkp{font-size:11px;font-weight:600;opacity:.6;flex:none;padding:3px 8px;border-radius:7px;
  background:rgba(255,255,255,.09)}

.btkl.ok{background:rgba(74,124,89,.17);border-color:rgba(74,124,89,.45);cursor:default}
.btkl.ok .btkc{background:#4A7C59;border-color:#4A7C59}
.btkl.ok .btkc::after{opacity:1;transform:translate(-50%,-56%) rotate(45deg) scale(1)}
.btkl.ok .btkt{text-decoration:line-through;opacity:.68}

/* Une tâche qui demande un commentaire se montre, ne se coche pas :
   on ne remplit pas un champ de texte debout devant une tablette
   murale. La pastille devient un trait, et la ligne le dit. */
.btkl.mot{cursor:default;opacity:.72}
.btkl.mot .btkc{border-style:dashed}

.btkl.rate{border-color:var(--rouge);background:rgba(196,60,67,.16)}
.btkr{font-size:12px;opacity:.6;padding:4px 2px}

body.borne.theme-clair .btkl{background:#fff;border-color:var(--ligne-2)}
body.borne.theme-clair .btkl:active{background:var(--surface-2)}
body.borne.theme-clair .btkc{border-color:var(--ligne-2)}
body.borne.theme-clair .btkp{background:var(--surface-2)}
body.borne.theme-clair .btkl.ok{background:var(--vert-pale);border-color:#A9C6B0}

/* Sur une petite tablette, la colonne devient un bandeau et la place
   manque : les tâches restent, plus serrées. */
@media(max-height:680px){
  .btkl{min-height:48px;padding:7px 12px}
  .btkt{font-size:13.5px}
}

/* ── Le pavé numérique ──
   Trois colonnes de 86 px, touches de 76 px : on tape sans regarder.
   La dernière rangée garde une case vide pour que le « 0 » reste au
   centre — un pavé désaligné se tape de travers. */
.bapp .bpav{grid-template-columns:repeat(3,86px);gap:11px}
.bapp .bpav button{height:76px;border-radius:18px;background:rgba(255,255,255,.06);
  border:1px solid rgba(255,255,255,.14);color:inherit}
.bapp .bpav button:active{background:rgba(233,162,59,.2);border-color:#E9A23B}
.bapp .bpav button.vide{visibility:hidden;pointer-events:none}
.bapp .bpav button.eff{font-family:var(--f-titre);font-size:24px}
body.borne.theme-clair .bapp .bpav button{background:#fff;border-color:var(--ligne-2);color:var(--encre)}
body.borne.theme-clair .bapp .bpav button:active{background:var(--terra-pale);border-color:var(--terra)}
.bapp .bpts i{width:15px;height:15px;background:rgba(255,255,255,.2)}
.bapp .bpts i.on{background:#E9A23B}
body.borne.theme-clair .bapp .bpts i{background:var(--ligne-2)}
body.borne.theme-clair .bapp .bpts i.on{background:var(--terra)}

/* Motifs d'écart : des pastilles, dans le thème de la borne. */
.bapp .bmotifs button{background:rgba(255,255,255,.06);border-color:rgba(255,255,255,.16);
  color:inherit;font-size:14.5px;padding:13px 20px}
.bapp .bmotifs button:active{border-color:#E9A23B;color:#E9A23B}
body.borne.theme-clair .bapp .bmotifs button{background:#fff;border-color:var(--ligne-2);color:var(--encre)}
body.borne.theme-sombre .bpetit{color:#8C7B64}

/* ── Signature : la carte reprend le thème ──
   Une carte blanche au milieu d'une borne sombre éblouissait celui
   qui signe, la nuit, à trente centimètres de l'écran. */
.bsign{background:rgba(20,14,9,.92)}
.bsigncard{background:var(--bfond);border:1px solid rgba(255,255,255,.12);
  color:inherit;max-width:720px}
.bsigncard h2{font-size:26px}
.bsigncard p{color:inherit;opacity:.65}
/* ── La zone de signature reste du PAPIER, dans les deux thèmes ──
   Le trait est enregistré en encre sombre : c'est ainsi qu'il sera
   relu, plus tard, dans le tiroir de validation du planning. Sur un
   canevas sombre, on signait à l'encre invisible — et rien ne le
   disait avant l'enregistrement (v9.6). */
#bsigncv{border-color:var(--ligne-2);background:#FBF8F1}
body.borne.theme-clair .bsigncard{border-color:var(--ligne)}
body.borne.theme-clair #bsigncv{border-color:var(--ligne-2);background:var(--surface-2)}
.bapp .bsignact .bbtn{background:rgba(255,255,255,.06);border-color:rgba(255,255,255,.16);color:inherit}
.bapp .bsignact .bbtn.dr{background:#6C974C;border-color:#6C974C;color:#fff}
body.borne.theme-clair .bapp .bsignact .bbtn{background:#fff;border-color:var(--ligne-2);color:var(--encre)}
body.borne.theme-clair .bapp .bsignact .bbtn.dr{background:var(--vert);border-color:var(--vert);color:#fff}

/* La date, sous l'heure : elle appartient à l'horloge, pas à une
   carte d'alerte, et elle reste lisible pendant un pointage. */
/* Pas de « capitalize » : la date arrive déjà bien formée de PHP,
   et la règle transformait « 25 août » en « 25 Août ». */
.bjour{font-size:12.5px;opacity:.6;margin-top:-6px}
body.borne.theme-clair .bjour{color:var(--encre-2);opacity:1}

/* En mode flux, c'est le PIED qui tient le bas : « .bstat », qui
   jouait ce rôle avec son « margin-top:auto », est masqué. Sans
   cela, le nom du parc remontait se coller au bloc contextuel. */
body.borne.bflux .bpied{margin-top:auto}

/* En bandeau étroit, la colonne n'a plus de place pour le contexte. */
@media(max-width:820px){
  .bjour{display:none}
  .bbloc{display:none}
  .bgbtn{min-width:0;flex:1 1 220px;padding:20px 24px}
  .bapp .bpav{grid-template-columns:repeat(3,74px);gap:9px}
  .bapp .bpav button{height:66px}
}

/* ═══════════════════════════════════════════════════════════════
   v9.7 · La borne à l'échelle de son écran
   Tout était en pixels fixes, calibré sur un grand écran. Sur une
   tablette de 8 pouces — souvent moins de 1000 px de large en
   pixels CSS —, la colonne mangeait le tiers de l'écran, les cartes
   passaient à deux par ligne et la moitié des informations tombait
   sous le pli.

   Une poignée de variables portent maintenant l'échelle. Elles ont
   toutes un PLANCHER (lisible de près sur un petit écran) et un
   PLAFOND (la mise en page validée sur grand écran) : rien ne
   devient minuscule, rien ne s'étire indéfiniment.
   ═══════════════════════════════════════════════════════════════ */
body.borne{
  --side:clamp(198px, 21vw, 320px);
  --pad:clamp(11px, 1.35vw, 20px);
  --gap:clamp(7px, .95vw, 14px);
  --f-nom:clamp(12.5px, 1.12vw, 15px);
  --f-det:clamp(10.5px, .92vw, 12px);
  --f-act:clamp(11px, 1.02vw, 13px);
  --f-h:clamp(30px, 3.6vw, 46px);
  --av:clamp(38px, 3.9vw, 52px);
  /* ── « --carte » VOULAIT DIRE DEUX CHOSES ──          (v14.41)
     La palette définit « --carte:#FFFFFF » — la couleur d'une
     surface. La borne le redéfinissait ici en LARGEUR de carte.
     Conséquence invisible : partout sur la borne,
     « background:var(--carte) » résolvait une longueur, donc une
     valeur invalide, donc TRANSPARENT. Une douzaine de surfaces du
     thème clair — la colonne des noms du planning, la grille, les
     barres collantes — n'ont jamais rien peint, et la règle était
     pourtant écrite, lisible, et vérifiée par un banc qui ne
     regardait que son existence.

     La largeur s'appelle maintenant « --bcarte ». Elle ne sert plus
     qu'à un repli : les deux densités (v14.38) posent leur propre
     « grid-template-columns », et gagnent toujours. */
  --bcarte:clamp(146px, 15.5vw, 210px);
  --r-c:clamp(12px, 1.2vw, 18px);
}
/* Écran bas (tablette en paysage, barre de navigation) : on serre la
   verticale plutôt que l'horizontale — c'est elle qui manque. */
@media(max-height:720px){
  body.borne{--pad:clamp(9px,1.1vw,14px);--gap:clamp(6px,.8vw,10px);--f-h:clamp(26px,3vw,34px);
    --av:clamp(34px,3.4vw,44px)}
}

.bapp{grid-template-columns:var(--side) 1fr}
.bside{padding:var(--pad);gap:var(--gap)}
.bmain{padding:var(--pad);gap:var(--gap)}

/* ── Le bandeau : logo, heure, date — une ligne chacun ──
   Côte à côte, le logo bornait la largeur de l'horloge. Empilée,
   elle prend toute la colonne : c'est ce qu'on lit à deux mètres. */
.bhd{flex-direction:column;align-items:flex-start;gap:clamp(6px,.7vw,10px);
  justify-content:flex-start}
.bhh{font-size:var(--f-h);line-height:1}
.bhh small{font-size:.36em;opacity:.5;margin-left:4px;vertical-align:top;letter-spacing:0}
.bhd .bjour{margin-top:-2px}
.blogo{width:clamp(36px,3.6vw,46px);height:clamp(36px,3.6vw,46px);
  font-size:clamp(13px,1.25vw,16px)}
.blogoimg2{max-height:clamp(38px,4vw,52px)}

/* ── Météo : une heure par LIGNE ──
   En colonnes, chaque case s'empilait — heure, icône, température —
   et il fallait lire quatre petites colonnes verticales dans une
   bande de 280 px. En lignes, chaque heure est une phrase qu'on
   parcourt de gauche à droite. */
.bmeteo{padding:clamp(9px,1.05vw,13px)}
.bmnow b{font-size:clamp(20px,2vw,26px)}
.bmnow i{font-size:var(--f-det)}
.bmh{flex-direction:column;gap:3px;margin-top:10px}
.bmhc{display:flex;align-items:center;gap:9px;flex:none;text-align:left;
  padding:clamp(5px,.55vw,7px) clamp(7px,.8vw,10px);border-radius:8px;width:auto}
.bmhc b{font-size:var(--f-det);opacity:.6;width:3.1em;flex:none}
.bmhc span{margin:0;flex:none;display:flex;align-items:center}
.bmhc i{font-size:var(--f-det);font-weight:600}
/* La pluie se range à droite : c'est la seule valeur facultative de
   la ligne, elle ne doit pas décaler les autres. */
.bmhc u{margin-left:auto;font-size:calc(var(--f-det) - .5px);opacity:.75;text-align:right}
.bmjour{font-size:var(--f-det);gap:10px}

/* ── Événements : un par ligne, l'icône devant ──
   En pastilles côte à côte, « Anniversaire de Chloé » et « Vacances
   de la Toussaint » se coupaient au milieu d'un mot. */
.bevts{flex-direction:column;gap:5px}
.bevt{display:flex;align-items:center;gap:9px;border-radius:10px;
  padding:clamp(6px,.65vw,8px) clamp(9px,.95vw,12px);font-size:var(--f-det);line-height:1.35}
.bevi{width:16px;height:16px;flex:none;opacity:.85}

/* ── La liste : cartes, filtres, recherche ── */
.bgrille{grid-template-columns:repeat(auto-fill,minmax(var(--bcarte),1fr));gap:var(--gap)}
.bcart{padding:clamp(11px,1.15vw,16px);gap:clamp(5px,.55vw,7px);border-radius:var(--r-c)}
.bav3{width:var(--av);height:var(--av);font-size:calc(var(--av) * .31)}
.bcnom{font-size:var(--f-nom)}
.bchr{font-size:var(--f-det)}
.bcptg{font-size:calc(var(--f-det) - .5px)}
.bcact{font-size:var(--f-act)}
.bpt2{top:clamp(10px,1vw,14px);right:clamp(10px,1vw,14px)}
.bfil{font-size:var(--f-act);padding:clamp(8px,.85vw,11px) clamp(12px,1.4vw,18px)}
.brech{font-size:var(--f-nom);padding:clamp(9px,1vw,13px) clamp(11px,1.2vw,16px)}
.bleg{font-size:calc(var(--f-det) - .5px)}
.bbloc{padding:clamp(9px,1.05vw,13px)}
.bbloc b{font-size:var(--f-det)}
.bbloc i{font-size:calc(var(--f-det) - .5px)}
.bnote{padding:clamp(9px,1.05vw,13px) clamp(10px,1.15vw,15px)}
.bnote span{font-size:var(--f-det)}
.bcarte{padding:clamp(10px,1.15vw,15px)}
.bpied{font-size:calc(var(--f-det) - 1px)}
.bjour{font-size:var(--f-det)}
.bthemebtn,.bdissoc{padding:clamp(8px,.85vw,11px) 12px;font-size:var(--f-det)}

/* ── Les écrans du flux suivent la même échelle ── */
.bsolo{gap:clamp(11px,1.4vw,18px);padding:clamp(14px,1.6vw,22px)}
.bavg{width:clamp(64px,7vw,96px);height:clamp(64px,7vw,96px);
  font-size:clamp(21px,2.3vw,30px)}
.bsous{font-size:clamp(13px,1.15vw,15px)}
.bgbtn{padding:clamp(16px,1.9vw,24px) clamp(24px,3vw,38px);
  min-width:clamp(180px,21vw,250px);border-radius:var(--r-c)}
.bgbtn b{font-size:clamp(17px,1.7vw,22px)}
.bgbtn i{font-size:var(--f-det)}
.bgbi{width:clamp(21px,2.3vw,26px);height:clamp(21px,2.3vw,26px)}
.bret{padding:clamp(11px,1.3vw,15px) clamp(22px,3vw,30px);
  min-width:clamp(180px,21vw,250px);border-radius:var(--r-c);
  font-size:clamp(14px,1.35vw,16.5px)}
.bret .bgbi{width:clamp(17px,1.8vw,21px);height:clamp(17px,1.8vw,21px)}
.bconsigne{padding:clamp(10px,1.15vw,14px) clamp(12px,1.3vw,16px)}
.bconsigne span{font-size:var(--f-det)}
.brc{padding:clamp(10px,1.15vw,14px)}
.brc b{font-size:clamp(18px,1.9vw,24px)}
.brc i{font-size:var(--f-det)}
.bapp .bpav{grid-template-columns:repeat(3,clamp(64px,7vw,86px));gap:clamp(8px,.85vw,11px)}
.bapp .bpav button{height:clamp(56px,6.2vw,76px);border-radius:clamp(13px,1.4vw,18px);
  font-size:clamp(20px,2vw,26px)}
.bapp .bpts{gap:clamp(9px,1vw,12px)}
.bapp .bpts i{width:clamp(12px,1.2vw,15px);height:clamp(12px,1.2vw,15px)}
.bapp .bmotifs button{font-size:var(--f-nom);padding:clamp(10px,1.1vw,13px) clamp(14px,1.6vw,20px)}

/* ── Veille : elle vit sur toute la surface, elle peut respirer ── */
.bvh{font-size:clamp(56px,10vw,120px)}
.bvc{min-width:clamp(104px,11vw,132px);padding:clamp(10px,1.2vw,14px) clamp(12px,1.5vw,18px)}
.bvc b{font-size:clamp(22px,2.5vw,30px)}
.bvnote{font-size:clamp(13px,1.2vw,15px)}

/* ── Palier intermédiaire ──
   Sous 1100 px, la colonne coûte trop cher : on la resserre pour
   rendre une carte de plus par ligne à la grille. */
@media(max-width:1100px){
  body.borne{--side:clamp(180px,19vw,220px);--bcarte:clamp(142px,17vw,168px)}
  .bmhc u{display:none}
}

/* ── La borne n'est pas l'application ──
   « html{min-width:1024px} » est une décision de l'application, qui
   est desktop et l'assume. La borne vit sur une tablette murale :
   sous ce plancher, une tablette de 8 pouces devait défiler
   HORIZONTALEMENT pour voir la dernière colonne de noms. */
html.borne{min-width:0}

/* ── Colonne : le milieu défile, le bas reste ──
   La journée (météo, effectif, note, événements) dépasse la hauteur
   d'un écran de 8 pouces. Le bouton de thème et le nom du parc
   tombaient sous le pli, et rien ne disait qu'il fallait faire
   défiler. */
.bside{overflow:hidden}
.bsmid{flex:1 1 auto;min-height:0;overflow-y:auto;display:flex;flex-direction:column;
  gap:var(--gap);padding-bottom:2px;
  /* Le dernier bloc s'efface au ras du bord : un bloc coupé net se
     lit comme un défaut d'affichage, un bloc qui s'estompe dit qu'il
     y a la suite. Quand tout tient, la zone estompée est vide et
     personne ne la voit. */
  -webkit-mask-image:linear-gradient(#000 calc(100% - 16px), transparent);
  mask-image:linear-gradient(#000 calc(100% - 16px), transparent)}
.bsbas{flex:none;display:flex;flex-direction:column;gap:clamp(6px,.7vw,10px)}
/* Le « margin-top:auto » qui poussait l'état de connexion vers le bas
   n'a plus lieu d'être : c'est « .bsmid » qui prend la place libre. */
.bsbas .bstat{margin-top:0}
body.borne.bflux .bpied{margin-top:0}
/* En mode flux, le milieu ne contient plus que le bloc contextuel :
   il ne doit pas garder la hauteur de la journée qu'il vient de
   masquer. */
body.borne.bflux .bsmid{flex:0 0 auto}

/* Écran court : on rend une heure de météo plutôt que d'obliger à
   faire défiler pour voir la note du jour. */
@media(max-height:680px){
  .bmh .bmhc:nth-child(n+4){display:none}
}

/* Bandeau étroit : la colonne devient une barre, tout le contexte
   s'efface — y compris « Dissocier », qui n'a rien à faire à portée
   de pouce sur un écran réduit. */
@media(max-width:820px){
  /* À réaffirmer ICI : la règle « .bapp{grid-template-columns:var(--side) 1fr} »
     de la v9.7 vient plus loin dans la feuille et écrasait, à
     spécificité égale, le passage en pleine largeur de la v7.48. La
     colonne restait donc large de 180 px, et son contenu débordait. */
  .bapp{grid-template-columns:1fr;grid-template-rows:auto 1fr}
  .bside{flex-direction:row;align-items:center;overflow:hidden}
  .bsmid,#fdissoc{display:none}
  .bhd{flex-direction:row;align-items:baseline;gap:12px;flex:none}
  .bsbas{flex-direction:row;align-items:center;margin-left:auto;gap:10px}
  .bsbas .bpied{display:none}
}

/* ═══════════════════════════════════════════════════════════════
   v9.8 · Le bandeau centré, et la carte d'un shift
   ═══════════════════════════════════════════════════════════════ */

/* ── Bandeau centré ──
   Aligné à gauche, l'ensemble logo / heure / date pesait tout d'un
   côté de la colonne alors que rien ne venait équilibrer l'autre. */
.bhd{align-items:center;text-align:center}

/* La date reprend la typographie de l'heure et gagne en taille :
   c'est la seconde information de la borne, elle ne peut pas rester
   une mention de bas de page. Nettement plus petite que l'heure —
   sinon les deux se disputent le regard. */
.bhd .bjour{font-family:var(--f-titre);font-weight:600;
  font-size:clamp(14px,1.55vw,21px);opacity:.62;margin-top:0;line-height:1.15}
body.borne.theme-clair .bhd .bjour{color:var(--encre-2);opacity:.9}

/* ── L'étiquette du shift ──
   Une puce de la couleur choisie, l'icône du métier, le nom. Fondue
   dans la phrase grise des horaires, elle ne se distinguait pas —
   et son icône n'arrivait même pas jusqu'à la borne. */
.bcetq{display:flex;align-items:center;gap:6px;max-width:100%;min-width:0;color:var(--ec)}
.bcetq i{width:7px;height:7px;border-radius:50%;flex:none;background:currentColor}
.bcetq svg{width:13px;height:13px;flex:none;opacity:.85}
/* Sur fond clair, c'est la teinte franche du kit qui porte ; sur
   fond sombre, la pâle. L'inverse s'éteint dans les deux cas. */
body.borne.theme-clair .bcetq{color:var(--ec2)}
.bcetq b{font-size:var(--f-det);font-weight:600;opacity:.92;
  overflow:hidden;text-overflow:ellipsis;white-space:nowrap;min-width:0}

/* ── Les horaires prévus ──
   Chiffres alignés, dans la typographie des titres : ce sont eux
   qu'on vérifie d'un coup d'œil, pas la pause. */
.bch{display:flex;align-items:baseline;gap:6px;flex-wrap:wrap;
  font-family:var(--f-titre);font-variant-numeric:tabular-nums;line-height:1.25}
.bch b{font-size:clamp(13px,1.2vw,15.5px);font-weight:600}
.bch i{font-style:normal;opacity:.38;font-size:.92em}
.bch u{text-decoration:none;font-family:var(--f-ui);font-weight:400;
  font-size:calc(var(--f-det) - .5px);opacity:.5;flex-basis:100%}
.bcsans{font-size:var(--f-det);opacity:.5;font-style:italic}

/* ── Ce qui a été pointé ──
   En phrase, il fallait lire pour savoir où en était la personne.
   En pastilles colorées, on le voit. */
.bcptg{display:flex;flex-wrap:wrap;gap:4px}
.bcp{display:inline-flex;align-items:center;gap:5px;line-height:1.3;
  font-size:calc(var(--f-det) - .5px);font-weight:600;
  padding:2px 9px 2px 7px;border-radius:20px;
  background:rgba(255,255,255,.07);border:1px solid rgba(255,255,255,.09)}
.bcp::before{content:'';width:6px;height:6px;border-radius:50%;background:currentColor;flex:none}
.bcp.arrivee{color:#8FBF6B}
.bcp.depart{color:#DE9089}
.bcp.pause{color:#E9A23B}
body.borne.theme-clair .bcp{background:var(--surface-2);border-color:var(--ligne)}
body.borne.theme-clair .bcp.arrivee{color:var(--vert)}
body.borne.theme-clair .bcp.depart{color:var(--rouge)}
body.borne.theme-clair .bcp.pause{color:var(--jaune)}

/* Une journée finie ne réclame plus rien : ses pastilles s'éteignent
   avec le reste de la carte. */
.bcart.bfini .bcp{color:inherit;opacity:.75}

/* ═══ v10.0 · Motifs et notes de pointage ═══════════════════════
   Le motif était demandé au salarié devant la borne (« votre
   responsable le verra ») puis n'apparaissait sur aucun écran. Il se
   lit maintenant partout où l'on regarde un pointage.
   ═══════════════════════════════════════════════════════════════ */

/* ── Sur la borne : choisir un motif, et préciser ── */
.bmotifs button.on{border-color:#E9A23B;color:#E9A23B;background:rgba(233,162,59,.14)}
body.borne.theme-clair .bmotifs button.on{border-color:var(--terra);color:var(--terra-h);
  background:var(--terra-pale)}
.bnotein{width:min(560px,100%);border-radius:13px;padding:13px 16px;font-family:var(--f-ui);
  font-size:var(--f-nom);background:rgba(255,255,255,.06);color:inherit;
  border:1px solid rgba(255,255,255,.16)}
.bnotein::placeholder{opacity:.45;color:inherit}
.bnotein:focus{outline:2px solid #E9A23B;outline-offset:1px}
body.borne.theme-clair .bnotein{background:#fff;border-color:var(--ligne-2);color:var(--encre)}
/* Rien de choisi, rien d'écrit : on le signale sur place plutôt que
   de faire un aller-retour au serveur pour se faire redemander la
   même chose. */
@keyframes bmreq{0%,100%{transform:translateX(0)}25%{transform:translateX(-5px)}75%{transform:translateX(5px)}}
.bmreq{animation:bmreq .3s ease-in-out 2}

/* ── Dans le tiroir : motif et note se lisent différemment ──
   Le motif vient d'une liste, la note est écrite à la main. Les
   confondre reviendrait à prêter au salarié des mots qu'il n'a pas
   choisis. */
/* Le motif : une pastille, comme sur la pointeuse où il a été
   choisi. Sa forme dit sa provenance, aucune légende n'est
   nécessaire. */
.frevm{display:inline-block;margin-top:4px;font-style:normal;font-size:12px;font-weight:600;
  background:var(--carte);border:1px solid var(--ligne-2);border-radius:20px;
  padding:2px 11px;color:var(--encre-2)}

/* ── Sur la fiche des pointages ── */
.ptgnotes{max-width:340px}
.ptgn{display:flex;flex-wrap:wrap;align-items:baseline;gap:6px;padding:3px 0;font-size:12px;
  line-height:1.4}
.ptgn + .ptgn{border-top:1px solid var(--ligne)}
.ptgn b{font-family:ui-monospace,monospace;font-size:11px;color:var(--muet);flex:none}
.ptgm{background:var(--surface-2);border:1px solid var(--ligne);border-radius:20px;
  padding:1px 9px;font-weight:600;color:var(--encre-2)}
.ptgn i{font-style:italic;color:var(--encre-2)}

/* ═══════════════════════════════════════════════════════════════
   v10.2 · Le tiroir de VALIDATION, allégé
   Valider un shift et le planifier sont deux gestes différents, et
   le tiroir ne montrait que le second : créneaux types, pauses
   types, date modifiable, choix du salarié, étoile de bibliothèque,
   cinq boutons. Or la question tient en un mot — est-ce que je
   valide ? — et tout le reste éloignait d'elle.

   Ce qui disparaît en validation ne disparaît PAS de l'application :
   ce sont des outils de planification, ils restent là où l'on
   planifie.
   ═══════════════════════════════════════════════════════════════ */

/* La personne et le jour sont des FAITS : ils figurent dans le
   récapitulatif en tête, ils n'ont pas à être re-choisis. */
#f-edit.valmode #e_sect_qui,
#f-edit.valmode #e_row_date,
/* Créneaux types (« Journée », « Matin », « Ouverture »…) : ils
   servent à poser une prévision, jamais à corriger un relevé. */
#f-edit.valmode #e_chips_cren,
/* Pauses types : de même — la pause à saisir ici est celle qui a été
   PRISE, pas une durée standard. « Ajouter une pause » reste. */
#f-edit.valmode #e_chips_p,
/* Filet : tout raccourci de composition ajouté plus tard dans ce
   formulaire disparaît en validation sans qu'on ait à y penser.
   « #e_chips_h » était visé ici jusqu'en v10.7 alors que cet
   identifiant appartient au formulaire multiple : la règle ne
   désignait rien, et les créneaux types restaient à l'écran (v10.8). */
#f-edit.valmode .qchips{display:none}

/* Les sous-titres de section (« salarié affecté », « date et
   horaires »…) expliquent un formulaire qu'on ne remplit plus. Celui
   du déroulé réel reste : il dit ce qui sera retenu pour la paie. */
#f-edit.valmode .dwsect:not(.valbloc) .dwsh i{display:none}

/* ── La frise, resserrée ──
   Chaque note ou motif s'affichait dans une carte encadrée de pleine
   largeur : trois pointages et le tiroir doublait de hauteur, pour
   des textes qui font rarement six mots. Un filet à gauche suffit à
   les rattacher à leur pointage, et ils tiennent sur une ligne
   (v10.2). */
/* ── Ce que le salarié a dit, LISIBLE ──
   La note était plus petite que la légende qui l'expliquait. On
   retire la légende — personne n'a besoin qu'on lui dise d'où vient
   un texte — et la note reprend la taille du reste du tiroir. Les
   deux natures se distinguent par la FORME : le motif vient d'une
   liste, c'est une pastille ; la note est écrite à la main, elle est
   entre guillemets (v10.3). */
#f-edit.valmode .frevn{background:transparent;border:0;border-left:2px solid var(--ligne-2);
  border-radius:0;margin-top:4px;padding:1px 0 1px 10px;font-size:13px;
  color:var(--encre);line-height:1.45}
#f-edit.valmode .frev{padding:5px 0}
#f-edit.valmode .valbloc{padding:11px 12px;margin-bottom:12px}
#f-edit.valmode .rappelp,
#f-edit.valmode .frise{margin-bottom:9px}

/* Les sections d'un tiroir de validation sont trois fois moins
   nombreuses : elles peuvent se resserrer sans se toucher.
   « :not(.valbloc) » : le déroulé réel est une CARTE, avec son propre
   encadré — à spécificité égale cette règle lui reprenait son
   rembourrage horizontal, et son titre venait coller la bordure. */
#f-edit.valmode .dwsect:not(.valbloc){padding:12px 0}

/* ═══════════════════════════════════════════════════════════════
   v10.4 · Le relevé, et les deux interrupteurs
   La frise verticale doublait la hauteur du tiroir pour la même
   information. Un relevé se lit en lignes : arrivée, départ, pause,
   chacune avec son heure prévue en regard.
   ═══════════════════════════════════════════════════════════════ */
#f-edit .frise{padding-left:0;margin-bottom:10px}
#f-edit .frise::before{display:none}
.rl{display:flex;align-items:center;gap:8px;padding:5px 0;flex-wrap:wrap}
.rlp{font-size:10px;font-weight:700;letter-spacing:.05em;text-transform:uppercase;
  border-radius:5px;padding:2px 7px;flex:none;min-width:62px;text-align:center}
.rlp.in{background:#EDF3E6;color:#55773B;border:1px solid #CBDBB9}
.rlp.out{background:#FBE7E8;color:#BA3E45;border:1px solid #F0C9CB}
.rlp.pa{background:var(--surface-2);color:var(--muet);border:1px solid var(--ligne-2)}
.rl b{font-family:var(--f-titre);font-size:15px;font-weight:600;min-width:52px}
.rl .pj{background:var(--carte);border:1px solid var(--ligne);border-radius:20px;
  padding:2px 9px;font-size:10.5px;font-weight:600;color:var(--encre-2);white-space:nowrap}
/* La note du salarié, lisible, sur sa propre ligne. */
.rlnote{display:flex;flex-wrap:wrap;gap:8px;align-items:center;
  border-left:2px solid var(--ligne-2);padding:1px 0 1px 10px;margin:0 0 7px 4px}
.rltxt{font-size:13px;color:var(--encre);line-height:1.45}

/* ── Les deux interrupteurs ── */
.swliste{display:flex;flex-direction:column;gap:11px}
.swaide{font-size:12px;color:var(--muet);margin-top:8px;line-height:1.5}
#e_sect_retenu .sw{margin-top:2px}
#e_sect_retenu .sw[hidden]{display:none}

/* ── Le bloc d'absence ──
   Il n'apparaît que si personne n'est venu : un type d'absence, et
   la décision de la déduire ou non. Décalé vers la droite, il se lit
   comme une CONSÉQUENCE de l'interrupteur au-dessus, pas comme un
   réglage de plus au même niveau (v10.6). */
.absbloc{margin:11px 0 4px;padding:12px 13px;border-left:2px solid var(--ligne-2);
  background:var(--surface-2);border-radius:0 11px 11px 0;
  display:flex;flex-direction:column;gap:11px}
.absbloc[hidden]{display:none}
.absbloc .fg{margin:0}

/* ── LES PIÈCES D'UN ARRÊT, DANS LE TIROIR ──              (v11.70)
   Frère du formulaire d'absence, jamais son enfant : un dépôt de
   fichier demande son propre formulaire, et un formulaire ne
   s'imbrique pas dans un autre. */
/* Le retrait horizontal recopie celui de « .dwr .pb » : le bloc est
   HORS du formulaire, il n'en hérite donc pas, et sans cela il
   traverse le tiroir d'un bord à l'autre pendant que tout le reste
   est en retrait. */
.arretbloc{padding:15px 18px;border-top:1px solid var(--ligne);
  display:flex;flex-direction:column;gap:11px}
.arretbloc[hidden]{display:none}
/* Le formulaire d'absence occupe tout le tiroir (« .dwr .pb{flex:1} »).
   Quand le bloc des pièces s'ouvre en dessous, cette élasticité
   creuse un vide de deux cents pixels entre les deux. Le
   formulaire reprend donc sa taille naturelle — et seulement
   quand le bloc est là. */
.dwr .pb:has(~ .arretbloc:not([hidden])){flex:none}
.arretbloc .fg{margin:0}
/* L'état, sur la ligne du titre : ce qui manque se lit avant ce
   qu'on peut déposer. */
.arretmq{font-style:normal;font-size:11.5px;color:var(--muet)}
/* ── DEUX NOMS POUR DEUX FAMILLES ──                       (v11.87)
   « .att » porte AILLEURS une règle NUE — c'est un encadré à part
   entière, plus bas dans cette feuille. Tant que l'état vivait dans un
   « .dwsh », le contexte l'emportait ; descendu dans la ligne d'une
   période, il s'est mis à dessiner un bloc rose pleine largeur autour
   de « 1 attendu ». Le modificateur porte donc un nom qui n'appartient
   qu'à lui : c'est la leçon de la famille « .dr / .an / .dv ». */
.arretmq.mqko{color:var(--rouge);font-weight:600;background:none;padding:0;display:inline}
.arretmq.mqatt{color:var(--terra-h,var(--encre));font-weight:600;background:none;padding:0;display:inline}
.arretli{display:flex;align-items:baseline;gap:9px;
  padding:7px 0;border-bottom:1px dashed var(--ligne-2)}
.arretli:last-child{border-bottom:0}
.arretnat{font-size:12px;font-weight:700;color:var(--encre);flex:none}
.arretdt{font-style:normal;font-size:11.5px;color:var(--muet);
  flex:1 1 auto;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.arretlk{flex:none;font-size:11.5px;font-weight:600;color:var(--terra,var(--encre))}
.arretform{display:flex;flex-direction:column;gap:11px}
/* ── LE REGISTRE À L'ÉCRAN ──                              (v11.80)
   La ligne d'une période reprend « .docrow », le gabarit du classeur :
   une pièce d'arrêt EST une pièce du classeur, la dessiner autrement
   ferait croire à un autre objet.

   Trois modificateurs seulement, tous SCOPÉS — aucun n'existe seul,
   pour qu'aucun ne définisse par accident un objet qu'il ne fait que
   qualifier ailleurs. C'est la règle depuis « .dv » et « .an ». */
.dwr .docrow{padding:9px 0}
.dwr .docrow .btn.sm{flex:none;gap:6px}
.dwr .docrow .btn.sm .ico{width:14px;height:14px}
/* Une période ATTENDUE n'a pas de fichier : son badge est creux. */
.docic.arretvide{background:transparent;border-style:dashed;color:var(--muet)}
/* La pièce choisie au classeur, avant de valider. */
.dwr .docrow.prise{background:var(--vert-pale);border-radius:9px}
.dwr .docrow.prise .btn.sm{border-color:var(--vert);color:var(--vert)}
/* ── LA LISTE DU CLASSEUR DÉFILE CHEZ ELLE ──              (v11.80)
   On ORDONNE sans filtrer : un salarié qui a vingt pièces au dossier
   les voit toutes. Mais vingt lignes dans un tiroir poussent le pied
   hors de vue — la liste défile donc dans sa propre boîte, et le
   geste reste à sa place. */
#arret_cllist{max-height:272px;overflow-y:auto;
  border:1px solid var(--ligne-2);border-radius:10px;padding:0 11px}
/* Rien à proposer : l'onglet reste lisible mais s'efface. */
.tabs a.arretoff{opacity:.45}

/* ── LE REGISTRE : CE QUI EST RÉCLAMÉ ──                   (v11.76)
   Une période attendue tient sa place dans la chronologie, entre les
   pièces reçues. « à fournir » la distingue sans la sortir de la
   liste : deux listes séparées obligeraient à recomposer l'ordre des
   dates dans sa tête. */
.arretatt{flex:none;font-size:11px;font-weight:700;letter-spacing:.02em;
  color:var(--terra-h);background:var(--terra-pale);
  border-radius:5px;padding:2px 7px}
/* La période que le dépôt va remplir. Ce n'est pas un champ : on ne
   la choisit plus, on la lit. Même hauteur que le « .fi » d'à côté
   pour que les deux colonnes commencent au même endroit. */
.arretcib{min-height:36px;display:flex;align-items:center;
  font-size:12px;font-weight:600;color:var(--encre);
  padding:0 11px;border:1px dashed var(--ligne);border-radius:8px;
  background:var(--surface-2);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}

/* Personne n'est venu : le poste et la pause n'ont plus d'objet, les
   heures restent VISIBLES mais figées — elles disent ce qui était
   prévu, et ce n'est plus modifiable. */
/* Poste et pause disparaissent — ils n'ont plus d'objet. Les HEURES
   restent, figées : elles disent ce qui était prévu, et c'est
   précisément ce qui n'a pas eu lieu. Les retirer effacerait la
   raison d'être du shift. */
#f-edit.absent .dwsect:not(.valbloc):not(#e_sect_retenu):not(#e_sect_note):not(#e_sect_quand){display:none}
#f-edit.absent #e_sect_quand .qheures{opacity:.45;pointer-events:none}
#f-edit.absent #e_titre_quand{color:var(--muet)}
/* La note SURVIT : c'est justement quand personne n'est venu qu'on a
   quelque chose à écrire. */

/* ── Aucun contrôle de conformité actif ──
   Un bandeau rouge, pas jaune : ce n'est pas une préférence
   d'affichage, c'est un parc qui tourne sans aucune vérification
   légale. Il ne se ferme pas — il disparaît quand on réactive les
   contrôles (v10.5). */
.ctloff{display:flex;align-items:center;gap:10px;background:var(--rouge-pale);
  border:1px solid #F0C9CB;color:#8A2C31;border-radius:11px;padding:10px 13px;
  font-size:12.5px;margin:0 0 12px}
.ctloff .ico{width:16px;height:16px;flex:none}
.ctloff b{font-weight:700}
.ctloff .btn{margin-left:auto;flex:none}

/* ═══ v10.7 · Les marques d'un shift validé ═══════════════════════
   La coche de validation dit « c'est arrêté ». Elle ne dit pas
   qu'une RETENUE sur salaire a été décidée, ni que les heures
   retenues ne sont pas celles qui ont été pointées. Deux faits qui
   changent un bulletin de paie : ils méritent leur propre marque,
   lisible sans ouvrir le tiroir.

   Les icônes se rangent en ligne, la coche toujours en dernier —
   c'est elle qu'on cherche, les autres la qualifient. */
.sh .shmarq{position:absolute;right:5px;bottom:4px;display:flex;align-items:center;gap:3px}
.sh .shmarq .shtick{position:static}
.shm{width:15px;height:15px;border-radius:50%;flex:none;
  display:flex;align-items:center;justify-content:center;
  box-shadow:0 0 0 1.5px rgba(255,255,255,.65);cursor:help}
.shm svg{width:10px;height:10px;stroke-width:2.1}
/* Retenue sur salaire : rouge, comme tout ce qui retire de l'argent
   à quelqu'un dans cette application. */
.shm-eu{background:var(--rouge);color:#fff}
/* Validé à la main : neutre. Ce n'est ni bien ni mal — c'est un
   fait, et le survol en donne le détail. */
.shm-ma{background:var(--encre-2);color:#fff}
body.dens-dense .sh .shmarq{gap:2px}
body.dens-dense .shm{width:13px;height:13px}
body.dens-dense .shm svg{width:9px;height:9px}

/* ═══ v10.7 · Le fil du jour ═══════════════════════════════════════
   La journée se raconte de haut en bas, et la décision se prend LÀ
   OÙ est l'anomalie : l'interrupteur de décompte est posé sous
   l'arrivée en retard, pas relégué en bas de l'écran. On lit le
   problème et on tranche sans déplacer le regard. */
#f-edit .frise{padding-left:20px;margin:2px 0 10px;position:relative}
#f-edit .frise::before{display:block;content:'';position:absolute;left:5px;top:10px;bottom:10px;
  width:2px;background:var(--ligne)}
.fj{position:relative;padding:7px 0}
.fjp{position:absolute;left:-20px;top:12px;width:12px;height:12px;border-radius:50%;
  background:var(--ligne-2);border:2.5px solid var(--surface-2);box-shadow:0 0 0 1.5px var(--ligne-2)}
.fjp.in{background:#55773B;box-shadow:0 0 0 1.5px #55773B}
.fjp.out{background:#BA3E45;box-shadow:0 0 0 1.5px #BA3E45}
.fjko .fjp{background:#BA3E45;box-shadow:0 0 0 1.5px #BA3E45}
.fjh{display:flex;align-items:center;gap:7px;flex-wrap:wrap}
.fjh b{font-family:var(--f-titre);font-size:15px;font-weight:600;min-width:50px}
.fjt{font-size:12.5px;font-weight:600;color:var(--encre-2)}
/* Les pastilles de justificatif étaient stylées par « .frevh .pj » :
   le conteneur s'appelle « .fjh » depuis le passage au fil. */
.fjh .pj,.rl .pj{background:var(--carte);border:1px solid var(--ligne);border-radius:20px;
  padding:2px 9px;font-size:10.5px;font-weight:600;color:var(--encre-2);white-space:nowrap}
.fjbadge{font-size:10.5px;font-weight:700;color:#BA3E45;background:#FBE7E8;
  border:1px solid #F0C9CB;border-radius:20px;padding:2px 9px}
/* La décision, au contact du problème. */
.fjdec{margin-top:9px;padding:10px 12px;background:#FBEEDB;border:1px solid #EFD3A6;border-radius:10px}
.fjdec .sw{display:flex}
.fjdec .swl{color:#8A5A17}
.fjdec .sw[hidden]{display:none}

/* ═══ v10.9 · ÉMARGEMENT ═══════════════════════════════════════════
   Paie › Émargement : la journée de la borne relue avant la paie.
   Trois regards (le détail, les anomalies, la semaine) sur la même
   donnée, dans le même écran.

   Le principe visuel : une PREUVE appartient à un geste, pas à une
   ligne. Elle se pose donc à côté de l'heure qui la porte — et la
   photo se MONTRE au lieu de s'annoncer, parce qu'une pastille
   « il y a une photo » oblige à cliquer pour savoir s'il y a
   quelqu'un dessus. */

/* ── Onglets de la rubrique ── */
/* .pgt est défini avec .tabs plus haut : un seul composant. */

/* ── Barre de date et compteur ── */
.emf{display:flex;align-items:center;gap:10px;flex-wrap:wrap;margin-bottom:14px}
.emnav{display:inline-flex;align-items:center;gap:4px}
.emnav .btn{padding:7px 11px;min-width:34px;justify-content:center}
.emdate{display:inline-flex;align-items:center;gap:9px;background:var(--carte);
  border:1px solid var(--ligne-2);border-radius:9px;padding:8px 16px;font-size:14px;
  font-weight:600;font-variant-numeric:tabular-nums}
.emdate .ico{width:15px;height:15px;color:var(--muet)}
.emsp{flex:1}
.emreste{display:inline-flex;align-items:center;gap:8px;background:var(--bleu-pale);
  color:var(--bleu-fonce);border:1px solid var(--bleu);border-radius:99px;padding:6px 14px;
  font-size:13.5px;font-weight:600}
.emreste b{font-variant-numeric:tabular-nums;font-size:15px}
.emreste.zero{background:var(--vert-pale);color:var(--vert-fonce);border-color:var(--vert)}

/* ── Filtres d'état ── */
.emchips{display:flex;gap:7px;flex-wrap:wrap;margin-bottom:14px}
.emchip{border:1px solid var(--ligne-2);background:var(--carte);border-radius:99px;
  padding:5px 13px;font-size:13.5px;cursor:pointer;font-family:var(--f-ui);
  color:var(--encre-2);display:inline-flex;align-items:center;gap:7px}
.emchip:hover{border-color:var(--muet)}
.emchip.on{background:var(--encre);color:var(--fond);border-color:var(--encre)}
.emchip .n{font-variant-numeric:tabular-nums;opacity:.7;font-weight:700}

/* ── Barre de sélection ── */
.embar{display:flex;align-items:center;gap:14px;background:var(--surface-2);
  border:1px solid var(--ligne);border-radius:var(--r);padding:12px 16px;margin-bottom:12px;
  transition:background .15s,border-color .15s}
.embar.actif{background:var(--creme);border-color:var(--creme-fonce)}
.embar .txt{font-size:14px;color:var(--encre-2)}
.embar.actif .txt{color:var(--encre);font-weight:600}
.embar .sp{flex:1}
.embar .btn[disabled]{opacity:.45;cursor:not-allowed}

/* ── Le tableau ── */
.emwrap{background:var(--carte);border:1px solid var(--ligne);border-radius:var(--r);
  box-shadow:var(--ombre);overflow:hidden}
.emscroll{overflow-x:auto}
table.emt{width:100%;border-collapse:collapse;min-width:1080px}
.emt th{text-align:left;font-size:12.5px;font-weight:700;color:var(--encre-2);padding:12px;
  background:var(--surface-2);border-bottom:1px solid var(--ligne);white-space:nowrap;
  font-family:var(--f-ui)}
.emt th .aide{display:inline-grid;place-items:center;width:14px;height:14px;border-radius:50%;
  background:var(--encre);color:var(--fond);font-size:9px;font-weight:700;margin-left:5px;
  cursor:help;vertical-align:1px}
.emt td{padding:11px 12px;border-bottom:1px solid var(--surface-2);vertical-align:middle;
  font-size:13.5px}
.emt tbody tr:last-child td{border-bottom:0}
.emt tbody tr:hover{background:var(--surface-2)}
.emt tbody tr.sel,.emt tbody tr.sel:hover{background:var(--creme-40)}
.emt tbody tr.fait{opacity:.72}
.emt .cbc{width:44px;padding-left:16px}
.emt .cact{width:78px;text-align:right;padding-right:16px}
.emt .cact .btn{padding:5px 13px;font-size:13px}

.emcb{width:18px;height:18px;border:1.5px solid var(--ligne-2);border-radius:5px;
  background:var(--carte);cursor:pointer;display:grid;place-items:center;padding:0}
.emcb:hover{border-color:var(--muet)}
.emcb.on,.emcb.part{background:var(--encre);border-color:var(--encre)}
.emcb.on::after{content:'✓';color:var(--fond);font-size:11px;font-weight:700;line-height:1}
.emcb.part::after{content:'–';color:var(--fond);font-size:12px;font-weight:700;line-height:1}
.emcb[disabled]{opacity:.3;cursor:not-allowed}

.emqui{display:flex;align-items:center;gap:9px;min-width:0}
.emqui .avm{width:28px;height:28px;border-radius:50%;display:grid;place-items:center;
  color:#fff;font-size:11px;font-weight:700;flex:none}
.emqui .nn{min-width:0}
.emqui .nn b{display:block;font-weight:600;font-size:13.5px;white-space:nowrap}
.emqui .nn span{display:block;font-size:11.5px;color:var(--muet);white-space:nowrap}

.emh{font-variant-numeric:tabular-nums;white-space:nowrap}
.emh .p2{display:block;font-size:12px;color:var(--muet);margin-top:3px}
.emh .ko{color:var(--terra-fonce);font-weight:600}
.emvide{color:var(--muet);font-style:italic}
.emsrc{display:block;font-size:11.5px;color:var(--muet);margin-top:3px}
.emdur{font-family:var(--f-titre);font-weight:700;font-size:15px;font-variant-numeric:tabular-nums}
.emdur .ec{display:block;font-family:var(--f-ui);font-size:11.5px;font-weight:600;margin-top:2px}
.emdur .ec.plus{color:var(--vert-fonce)}
.emdur .ec.moins{color:var(--terra-fonce)}

/* ── Un geste et ses preuves ── */
.gst{display:flex;align-items:center;gap:8px;padding:2px 0;max-width:460px}
.gst + .gst{margin-top:5px}
.gp{width:9px;height:9px;border-radius:50%;flex:none}
.gp.a{background:var(--vert)}
.gp.d{background:var(--encre-2)}
.gp.man{background:var(--ligne-2);box-shadow:inset 0 0 0 1.5px var(--muet)}
.gh{font-variant-numeric:tabular-nums;font-weight:600;font-size:14px;min-width:48px}
.gh.ko{color:var(--terra-fonce)}
.gpr{font-size:11.5px;color:var(--muet);white-space:nowrap}
.gec{font-size:11px;font-weight:700;padding:1px 7px;border-radius:99px;white-space:nowrap;
  background:var(--surface-2);color:var(--muet)}
.gec.tard{background:var(--rouge-pale);color:var(--rouge-fonce)}
.gec.tot{background:var(--jaune-pale);color:var(--jaune-fonce)}
.gsp{flex:1;min-width:6px}

/* ═══ L'ÉMARGEMENT SUR UNE LIGNE ═══                       (v14.48)

   Un shift tenait sur trois rangs : une ligne de geste par pointage,
   chacune avec sa bande de preuves. Mesuré sur une journée réelle de
   quatorze shifts : 92 px la ligne, 1 300 px de tableau — on ne
   voyait jamais la journée entière.

   Ici l'heure, son point d'état, son écart et la note du salarié
   tiennent sur un rang ; « .p2 » n'apparaît que s'il y a une pause à
   dire. Les preuves partent dans leur colonne. 92 px → ~56 px. */
.emh .gh{display:inline;min-width:0;font-size:13.5px}
.gsep{color:var(--ligne-2);font-weight:400;margin:0 5px}
/* Le point d'état collé à son heure : vert dans la tolérance, jaune
   quand on a fait moins, terracotta quand on a fait plus. */
.emh .gp{display:inline-block;vertical-align:middle;margin:0 0 1px 5px;width:7px;height:7px}
.emh .gp.t{background:var(--rouge)}
.emh .gp.v{background:var(--jaune)}
/* L'écart contre chaque heure a été retiré en v14.50 : il se lit sous
   la DURÉE, qui est le chiffre qui part en paie. Le point d'état reste
   ici — lui seul dit lequel des deux gestes a dérivé. */
/* La pause, avec ses heures — elle ne se lisait que dans le total. */
.empz{font-variant-numeric:tabular-nums}
.empz.t{color:var(--jaune-fonce);font-weight:600}
.empz.ko{color:var(--terra-fonce);font-weight:600}
.empz + .empz{margin-left:10px}
/* La note du salarié, à côté de l'heure qu'elle explique. Bleue :
   un commentaire n'est pas une preuve, c'est lui qui s'explique. */
/* « .pv » est en « display:grid » : posée au milieu d'une phrase
   d'heures, la pastille cassait la ligne et rendait les 30 px qu'on
   venait de gagner. Elle passe en « inline-grid ». */
.pv.emcm{display:inline-grid;width:19px;height:19px;border-radius:6px;margin-left:6px;
  vertical-align:middle;border-color:#C9D3E8;background:var(--bleu-pale);
  color:var(--bleu);cursor:help}
.pv.emcm svg{width:11px;height:11px}
.pv.emcm:hover{border-color:var(--bleu);background:#DCE4F4;color:var(--bleu)}

/* La colonne Contrôle : les preuves des deux gestes côte à côte, un
   filet entre elles. On la lit à la verticale, et qui n'a laissé
   aucune trace se voit sans lire une heure. */
.cctl{white-space:nowrap;width:1%}
/* « .prv » est un flex : deux groupes à la suite s'empilaient, et la
   ligne reprenait les 30 px qu'on venait de lui retirer. Ils passent
   en ligne, séparés par un filet — arrivée à gauche, départ à
   droite, comme les deux heures juste avant. */
.cctl .prv{display:inline-flex;vertical-align:middle}
.cctl .prv + .prv{margin-left:9px;padding-left:9px;border-left:1px solid var(--ligne)}
/* Plus grandes : à 28 px on visait mal, et une photo de pointage de
   la taille d'une icône ne se regarde pas. */
.cctl .pv{width:32px;height:32px}
.cctl .pv svg{width:16px;height:16px}

/* La photo du salarié : « avatar_html() » rend « .avm.avphoto » avec
   son <img>. La pastille garde la taille et la place qu'elle a déjà
   dans « .emqui » ; il ne manquait que de quoi loger l'image. */
.emqui .avm.avphoto{background:var(--surface-2);overflow:hidden;padding:0}
.emqui .avm.avphoto img{width:100%;height:100%;object-fit:cover;display:block}

/* Les petites icônes. Une preuve présente reste NEUTRE : quarante
   pastilles terracotta sur un écran ne signalent plus rien. La
   couleur arrive au survol, quand on désigne. */
.prv{display:flex;gap:3px;align-items:center}
.pv{position:relative;width:28px;height:28px;border-radius:8px;border:1px solid var(--ligne);
  background:var(--carte);display:grid;place-items:center;color:var(--encre-2);cursor:pointer;
  padding:0;flex:none}
.pv svg{width:14px;height:14px}
.pv.plein{border-color:var(--ligne-2)}
.pv:hover{border-color:var(--terra);color:var(--terra-fonce);background:var(--terra-pale)}
.pv.off{border-style:dashed;border-color:var(--ligne);color:var(--ligne-2);cursor:default}
.pv.off:hover{background:var(--carte);border-color:var(--ligne);color:var(--ligne-2)}
.pv.img{padding:0;overflow:hidden;border-color:var(--ligne-2)}
.pv.img img{width:100%;height:100%;object-fit:cover;display:block}
.pv.img:hover{border-color:var(--terra);background:none}

/* La bulle qui montre la preuve. « emprv » et pas « pop » :
   app.css réserve déjà « .pop » à ses menus flottants, dont la
   règle « display:none » aurait empêché celle-ci de s'ouvrir. */
.emprv{position:fixed;z-index:90;width:250px;background:var(--carte);border:1px solid var(--ligne-2);
  border-radius:12px;box-shadow:var(--ombre-2);overflow:hidden;opacity:0;pointer-events:none;
  transform:translateY(5px);transition:opacity .13s,transform .13s}
.emprv.on{opacity:1;pointer-events:auto;transform:none}
.emprvh{display:flex;align-items:center;gap:8px;padding:9px 12px;background:var(--surface-2);
  border-bottom:1px solid var(--ligne);font-size:12.5px;font-weight:700}
.emprvh .qd{margin-left:auto;font-weight:500;color:var(--muet);font-variant-numeric:tabular-nums}
.emprvb{padding:12px}
.emprvb img{display:block;width:100%;border-radius:8px;background:var(--surface-2)}
.emprvb .tx{font-size:13.5px;line-height:1.5;color:var(--encre)}
.emprvb .lg{font-size:11.5px;color:var(--muet);margin-top:8px;line-height:1.45}
.emprvb .co{font-family:ui-monospace,Menlo,monospace;font-size:12px;color:var(--encre-2);
  background:var(--surface-2);border:1px solid var(--ligne);border-radius:7px;padding:6px 9px;
  margin-top:8px}

/* ── L'ADRESSE ET LA CARTE ──                             (v14.47)

   « 47.87341 · -3.96122 » ne dit rien à personne : on ne sait pas si
   c'est l'établissement, le domicile du salarié, ou l'autre bout du
   département. Le nom de la rue et un point sur une carte tranchent
   en une seconde — et c'est exactement ce qu'on vient chercher quand
   un horaire est contesté.

   La bulle s'élargit SEULEMENT quand elle porte une carte : 250 px
   suffisent à une photo de pointage, pas à une rue. */
.emprv:has(.cartez){width:300px}
.cartez{margin-top:9px}
.cartez .adr{font-size:12.5px;line-height:1.45;color:var(--encre);font-weight:600}
/* L'adresse remplace les coordonnées dans le regard, elle ne les
   remplace pas à l'écran : on garde les chiffres au-dessus, parce que
   ce sont EUX qui ont été mesurés. L'adresse en est la lecture. */
.cartim{display:block;width:100%;margin-top:8px;border-radius:9px;
  border:1px solid var(--ligne);background:var(--surface-2)}

/* ── Groupes par poste ── */
.grh td{background:var(--creme-40);border-bottom:1px solid var(--ligne);padding:9px 16px}
.grh .in{display:flex;align-items:center;gap:10px}
.grh b{font-family:var(--f-titre);font-size:13.5px;font-weight:700}
.grh .pt{width:8px;height:8px;border-radius:50%;flex:none}
.grh .n{font-size:12px;color:var(--muet);font-variant-numeric:tabular-nums}
.grh .sp{flex:1}
.grh button{border:1px solid var(--ligne-2);background:var(--carte);border-radius:99px;
  padding:3px 11px;font-size:12px;cursor:pointer;font-family:var(--f-ui);color:var(--encre-2)}
.grh button:hover{border-color:var(--muet);color:var(--encre)}

/* Légende des preuves */
.lgd{display:flex;flex-wrap:wrap;gap:6px 16px;padding:10px 16px;border-top:1px solid var(--ligne);
  background:var(--surface-2);font-size:12px;color:var(--muet);align-items:center}
.lgd span{display:inline-flex;align-items:center;gap:6px}
.lgd svg{width:13px;height:13px}

/* Les marques d'un shift validé, reprises du planning */
.emt .stm{display:inline-flex;gap:4px;margin-left:6px;vertical-align:-3px}
.emt .stm i{width:18px;height:18px;border-radius:50%;display:grid;place-items:center;
  font-style:normal;cursor:help}
.emt .stm i svg{width:11px;height:11px}
.emt .stm .m-eu{background:var(--rouge);color:#fff}
.emt .stm .m-ma{background:var(--encre-2);color:#fff}
.st{display:inline-flex;align-items:center;gap:6px;font-size:12px;font-weight:600;
  padding:4px 10px;border-radius:99px;white-space:nowrap}
.st-cours{background:var(--bleu-pale);color:var(--bleu-fonce)}
.st-traiter{background:var(--jaune-pale);color:var(--jaune-fonce)}
.st-val{background:var(--vert-pale);color:var(--vert-fonce)}
.st-ano{background:var(--rouge-pale);color:var(--rouge-fonce)}

/* ── Vue « À traiter » ── */
.atk{display:grid;grid-template-columns:repeat(4,1fr);gap:12px;margin-bottom:20px}
.atk .k{display:block;background:var(--carte);border:1px solid var(--ligne);
  border-radius:var(--r);padding:15px 16px;box-shadow:var(--ombre);
  border-left:3px solid var(--ligne-2);text-decoration:none;color:inherit}
.atk .k:hover{box-shadow:var(--ombre-2)}
.atk .k-dep{border-left-color:var(--rouge)}
.atk .k-orp{border-left-color:var(--violet)}
.atk .k-ec{border-left-color:var(--jaune)}
.atk .k-ok{border-left-color:var(--vert)}
.atk b{display:block;font-family:var(--f-titre);font-size:29px;font-weight:700;line-height:1;
  letter-spacing:-.02em;font-variant-numeric:tabular-nums}
.atk span{display:block;font-size:13px;color:var(--encre-2);margin-top:7px;line-height:1.35}
.atk em{display:block;font-style:normal;font-size:12px;color:var(--muet);margin-top:5px}

.atl{background:var(--carte);border:1px solid var(--ligne);border-radius:var(--r);
  box-shadow:var(--ombre);overflow:hidden;margin-bottom:14px;scroll-margin-top:80px}
.att{display:flex;align-items:center;gap:11px;padding:11px 16px;background:var(--surface-2);
  border-bottom:1px solid var(--ligne);flex-wrap:wrap}
.att .sp{flex:1}
.att .cnt{font-size:12.5px;color:var(--muet)}
/* ── L'ÉTIQUETTE D'UNE ANOMALIE DE POINTAGE ──           (v11.70.1)
   Elle s'appelait « .an », en règle NUE. Trois autres objets
   portaient ce nom : le libellé d'une bande d'absence au planning,
   celui de la vue Mois, et la pastille « anniversaire » d'un
   événement. Tous recevaient ses majuscules, ses 11,5 px et son
   fond arrondi sans les avoir demandés. */
.anomalie{display:inline-flex;align-items:center;gap:6px;font-size:11.5px;font-weight:700;
  letter-spacing:.04em;text-transform:uppercase;padding:3px 10px;border-radius:99px}
.anomalie i{width:6px;height:6px;border-radius:50%;background:currentColor}
.anomalie.an-dep{background:var(--rouge-pale);color:var(--rouge-fonce)}
.anomalie.an-orp{background:var(--violet-pale);color:var(--violet-fonce)}
.anomalie.an-ec{background:var(--jaune-pale);color:var(--jaune-fonce)}
.anomalie.an-ok{background:var(--vert-pale);color:var(--vert-fonce)}
.atr{display:grid;grid-template-columns:215px 1fr auto;gap:0 20px;align-items:center;
  padding:12px 16px;border-bottom:1px solid var(--surface-2)}
.atr:last-child{border-bottom:0}
.atr:hover{background:var(--surface-2)}
.atr .qq{font-size:13.5px;color:var(--encre-2);display:flex;flex-wrap:wrap;align-items:center;gap:8px}
.atr .qq b{color:var(--encre);font-weight:600;font-variant-numeric:tabular-nums}
.atr .qa{display:flex;gap:7px;justify-content:flex-end;align-items:center}
.atr .btn{padding:5px 12px;font-size:13px}

/* ── Vue « La semaine » ──
   « jday » et pas « jl » : « .jl » est la ligne du journal de
   semaine, en grille de cinq colonnes. */
.atj{display:grid;grid-template-columns:repeat(7,minmax(0,1fr));gap:11px;align-items:start}
@media(max-width:1180px){.atj{grid-template-columns:repeat(auto-fit,minmax(180px,1fr))}}
.jc{background:var(--carte);border:1px solid var(--ligne);border-radius:var(--r);
  box-shadow:var(--ombre);display:flex;flex-direction:column;overflow:hidden}
.jc.auj{border-color:var(--terra);box-shadow:0 0 0 2px var(--terra-pale),var(--ombre)}
.jc.net{opacity:.66}
.jch{padding:10px 12px;border-bottom:1px solid var(--ligne);display:flex;align-items:baseline;gap:6px}
.jch b{font-family:var(--f-titre);font-size:14px;font-weight:700}
.jch span{font-size:11.5px;color:var(--muet)}
.jcb{padding:10px 12px;display:flex;flex-direction:column;gap:8px;flex:1;min-height:52px}
.jday{display:flex;gap:8px;align-items:flex-start;font-size:12.5px;line-height:1.4}
.jday i{width:7px;height:7px;border-radius:50%;flex:none;margin-top:4px}
.jday.d i{background:var(--rouge)}
.jday.o i{background:var(--violet)}
.jday.e i{background:var(--jaune)}
.jday.v i{background:var(--bleu)}
.jday b{font-weight:600;display:block}
.jday span{color:var(--muet)}
.jcf{padding:9px 12px;border-top:1px solid var(--ligne);background:var(--surface-2)}
.jcf .btn{width:100%;justify-content:center;padding:6px;font-size:12.5px}
.jcok{padding:14px 12px;text-align:center;color:var(--vert-fonce);font-size:12.5px;font-weight:600}
.jvide{padding:14px 12px;text-align:center;color:var(--ligne-2);font-size:12.5px}

/* ── LE TIROIR ──

   Il s'appelait « .dr ». Deux lettres, et une règle de classe NUE
   dans une feuille de 543 Ko : tout ce qui portait « dr » quelque
   part dans son attribut class devenait un tiroir fixe, hors écran,
   à droite.

   Cinq sens différents cohabitaient : le tiroir, le brouillon du
   bouton « Publier », le « à droite » d'un filtre de borne, le
   bouton vert de la borne, et le DRAPEAU d'un sélecteur de pays.
   Quatre d'entre eux étaient cassés sans que personne fasse le
   lien — dont le bouton « Publier le planning », qui n'apparaissait
   plus du tout.

   Le tiroir porte donc un nom qui ne se confond avec rien (v11.66).
   Les autres restent des MODIFICATEURS : « .pubpill.brouillon » ne
   veut rien dire tout seul, et c'est très bien. */
/* ── LE VOILE DU TIROIR D'ÉMARGEMENT ──                  (v11.70.1)
   Il s'appelait « .dv », juste sous le commentaire qui raconte le
   défaut de « .dr » — et il en était un lui-même. « .btn dv » et
   « .note dv » désignent, sur les écrans de développement, le DEV :
   ces éléments devenaient donc un voile plein écran, transparent et
   intraversable. « Passer en BETA » et « Mise en production » ne se
   voyaient plus ni ne se cliquaient.
   Les douze autres tiroirs de l'application appellent leur voile
   « .dveil » ; celui-ci porte enfin un nom, lui aussi. */
.tiroirvoile{position:fixed;inset:0;background:rgba(62,43,26,.34);opacity:0;pointer-events:none;
  transition:opacity .18s;z-index:60}
.tiroirvoile.on{opacity:1;pointer-events:auto}
/* Le tiroir d'émargement suit la même largeur que les autres (v11.73). */
.tiroir{position:fixed;top:0;right:0;bottom:0;width:min(640px,96vw);background:var(--carte);
  border-left:1px solid var(--ligne);box-shadow:-16px 0 44px -22px rgba(62,43,26,.4);
  transform:translateX(102%);transition:transform .2s cubic-bezier(.3,.8,.4,1);z-index:61}
.tiroir.on{transform:none}
.tiroir form{height:100%;display:flex;flex-direction:column}
.drh{padding:17px 20px;border-bottom:1px solid var(--ligne);display:flex;align-items:flex-start;gap:12px}
.drh h3{font-family:var(--f-titre);font-size:19px;font-weight:700;margin:0;letter-spacing:-.015em}
.drh .sb{font-size:13px;color:var(--muet);margin-top:3px}
.drh .x{margin-left:auto;border:0;background:none;font-size:19px;color:var(--muet);cursor:pointer;
  line-height:1;padding:3px 6px;border-radius:7px}
.drh .x:hover{background:var(--surface-2);color:var(--encre)}
.drb{flex:1;overflow-y:auto;padding:18px 20px}
.drf{padding:14px 20px;border-top:1px solid var(--ligne);background:var(--surface-2);
  display:flex;gap:9px;align-items:center}
.drf .sp{flex:1}
.dsec{margin-bottom:20px}
.dsec > h4{font-family:var(--f-titre);font-size:13px;font-weight:700;letter-spacing:.03em;
  text-transform:uppercase;color:var(--muet);margin:0 0 10px}
/* Le fil réutilise celui du tiroir de planning (.fj, .fjh, .fjbadge,
   .fjdec) : un seul langage visuel pour une même chose. */
.tiroir .frise{padding-left:20px;position:relative}
.tiroir .frise::before{content:'';position:absolute;left:5px;top:10px;bottom:10px;width:2px;
  background:var(--ligne)}
.tiroir .fjprev{font-size:11.5px;color:var(--muet)}
.tiroir .fjnote{font-size:12.5px;color:var(--muet);font-style:italic;margin-top:3px}
.dret{display:grid;grid-template-columns:1fr 1fr;gap:10px}
.dret label{display:block;font-size:12px;color:var(--muet);margin-bottom:5px}
.dret input{width:100%;padding:8px 10px;border:1px solid var(--ligne-2);border-radius:9px;
  font:inherit;font-size:14px;font-variant-numeric:tabular-nums;background:var(--carte);
  color:var(--encre)}
.dsrc{background:var(--bleu-pale);border:1px solid var(--bleu);border-radius:10px;
  padding:11px 13px;font-size:13px;color:var(--bleu-fonce);margin-top:11px}
.dsrc b{display:block;margin-bottom:2px}

/* Bascule propre à l'émargement : « .sw » d'app.css est une case
   masquée avec une piste de 40 px, elle superposerait le libellé. */
.emsw{display:flex;align-items:flex-start;gap:11px;background:var(--surface-2);
  border:1px solid var(--ligne);border-radius:10px;padding:11px 13px;cursor:pointer}
.emsw + .emsw{margin-top:8px}
.emsw[hidden]{display:none}
.emswb{width:38px;height:22px;min-width:38px;border-radius:99px;background:var(--ligne-2);
  flex:none;position:relative;transition:background .15s;margin-top:1px}
.emswb::after{content:'';position:absolute;top:3px;left:3px;width:16px;height:16px;
  border-radius:50%;background:#fff;transition:transform .15s;box-shadow:0 1px 2px rgba(0,0,0,.2)}
.emsw.on .emswb{background:var(--terra)}
.emsw.on .emswb::after{transform:translateX(16px)}
.emswx{min-width:0}
.emswt{font-size:14px;font-weight:600;display:block;color:var(--encre)}
.emswl{font-size:12.5px;color:var(--muet);display:block;margin-top:2px;line-height:1.45}

/* Valider est VERT dans toute l'application : le terracotta est
   l'action principale d'un formulaire, pas une décision de paie. */
.btn.vert{background:#55773B;border-color:#55773B;color:#fff}
.btn.vert:hover:not([disabled]){background:#496630;border-color:#496630}

/* ═══ v11.0 · RECRUTEMENT ═══════════════════════════════════════════
   Le pipeline, le dossier plein écran, les réglages.

   Le principe : le DOSSIER est un écran à part entière, pas un
   tiroir. On lit un CV pendant qu'on écrit une réponse — trois
   colonnes qui ne bougent pas, et le document affiché ICI plutôt
   que dans un autre onglet où l'on perd le fil. */

/* ── L'entonnoir ── */
.r-ent{display:grid;grid-template-columns:repeat(6,1fr);gap:2px;background:var(--ligne);
  border:1px solid var(--ligne);border-radius:var(--r);overflow:hidden;margin-bottom:20px}
.r-ent .e{display:block;background:var(--carte);padding:13px 14px 15px;text-decoration:none;
  color:inherit;border-top:3px solid var(--ligne-2)}
.r-ent .e:hover{background:var(--surface-2)}
.r-ent b{display:block;font-family:var(--f-titre);font-size:25px;font-weight:700;line-height:1;
  font-variant-numeric:tabular-nums;letter-spacing:-.02em}
.r-ent span{display:block;font-size:12.5px;color:var(--encre-2);margin-top:6px}
.r-ent em{display:block;font-style:normal;font-size:11.5px;color:var(--muet);margin-top:4px}
@media(max-width:1280px){.r-ent{grid-template-columns:repeat(3,1fr)}}

/* ── Le pipeline ── */
.r-kb{display:grid;grid-template-columns:repeat(6,minmax(200px,1fr));gap:10px;align-items:start;
  overflow-x:auto;padding-bottom:8px}
.r-kc{background:var(--surface-2);border:1px solid var(--ligne);border-radius:var(--r);
  display:flex;flex-direction:column;min-height:110px}
.r-kch{padding:10px 12px;border-bottom:1px solid var(--ligne);display:flex;align-items:center;gap:8px}
.r-kch i{width:8px;height:8px;border-radius:50%;flex:none;font-style:normal}
.r-kch b{font-family:var(--f-titre);font-size:13px;font-weight:700}
.r-kch .n{margin-left:auto;font-size:12px;color:var(--muet);background:var(--carte);
  border:1px solid var(--ligne);border-radius:20px;padding:1px 8px;font-variant-numeric:tabular-nums}
.r-kcb{padding:9px;display:flex;flex-direction:column;gap:8px;flex:1}
.r-card{display:block;background:var(--carte);border:1px solid var(--ligne);border-radius:10px;
  padding:10px 11px;box-shadow:var(--ombre);text-decoration:none;color:inherit}
.r-card:hover{border-color:var(--muet);box-shadow:var(--ombre-2)}
.r-card .t{display:flex;align-items:center;gap:8px}
.r-av{border-radius:50%;display:grid;place-items:center;color:#fff;font-weight:700;flex:none}
.r-card .r-av{width:26px;height:26px;font-size:10px}
.r-card b{font-size:13.5px;font-weight:600;display:block;line-height:1.25}
.r-card .of{font-size:11.5px;color:var(--muet);display:block;margin-top:1px}
.r-card .m{display:flex;flex-wrap:wrap;gap:5px;margin-top:9px}
.r-vide{padding:18px 10px;text-align:center;color:var(--ligne-2);font-size:12.5px}

/* Micro-pastilles. Neutres par défaut : trente pastilles colorées
   sur un écran ne signalent plus rien. */
.r-mp{display:inline-block;font-size:10.5px;font-weight:700;padding:2px 7px;border-radius:20px;
  white-space:nowrap;background:var(--surface-2);color:var(--encre-2);border:1px solid var(--ligne)}
.r-mp.ok{background:var(--vert-pale);color:var(--vert-fonce);border-color:transparent}
.r-mp.no{background:var(--rouge-pale);color:var(--rouge-fonce);border-color:transparent}
.r-mp.j{background:var(--jaune-pale);color:var(--jaune-fonce);border-color:transparent}
.r-mp.b{background:var(--bleu-pale);color:var(--bleu-fonce);border-color:transparent}
.r-mp.blanc{background:var(--carte)}
.r-fbar{display:flex;gap:8px;flex-wrap:wrap;align-items:center;margin-bottom:14px}
.r-sp{flex:1}
.r-note{font-size:13px;color:var(--encre-2);line-height:1.6;margin:0 0 14px;max-width:78ch}

/* ── Le dossier ── */
.r-retour{display:inline-flex;align-items:center;gap:8px;font-size:13.5px;color:var(--encre-2);
  text-decoration:none;margin-bottom:12px}
.r-retour:hover{color:var(--terra-fonce)}
.r-retour svg{width:15px;height:15px}
.r-doss{display:grid;grid-template-columns:288px minmax(0,1fr) 372px;gap:14px;align-items:start;
  height:calc(100vh - 180px);min-height:580px}
@media(max-width:1500px){.r-doss{grid-template-columns:264px minmax(0,1fr) 340px}}
@media(max-width:1180px){.r-doss{grid-template-columns:1fr;height:auto}
  .r-doss .r-col{height:auto;max-height:none}}
.r-col{background:var(--carte);border:1px solid var(--ligne);border-radius:var(--r);
  box-shadow:var(--ombre);height:100%;display:flex;flex-direction:column;overflow:hidden}
.r-colb{overflow-y:auto;padding:16px 17px;flex:1}
.r-colh{padding:0 17px;border-bottom:1px solid var(--ligne);background:var(--surface-2);
  display:flex;align-items:center;gap:9px;min-height:44px}
.r-colh b{font-family:var(--f-titre);font-size:12.5px;font-weight:700;letter-spacing:.04em;
  text-transform:uppercase;color:var(--encre-2)}
.r-colf{padding:12px 17px;border-top:1px solid var(--ligne);background:var(--surface-2);
  display:flex;gap:8px;align-items:center;flex-wrap:wrap}
.r-colf .sp{flex:1}

.r-id{text-align:center;padding-bottom:15px;border-bottom:1px solid var(--ligne);margin-bottom:15px}
.r-id .r-av{width:64px;height:64px;font-size:22px;margin:0 auto 11px;font-family:var(--f-titre)}
.r-id h2{font-family:var(--f-titre);font-size:20px;font-weight:700;margin:0;letter-spacing:-.015em;
  line-height:1.2}
.r-id .po{font-size:13px;color:var(--encre-2);margin-top:4px}
.r-id .pa{font-size:12px;color:var(--muet);margin-top:2px}
.r-id .et{margin-top:10px}
.r-kv{display:grid;grid-template-columns:96px 1fr;gap:7px 12px;font-size:13px}
.r-kv dt{color:var(--muet)}
.r-kv dd{margin:0;word-break:break-word}
.r-bloc{margin-bottom:18px}
.r-bloc > h4{font-family:var(--f-titre);font-size:11.5px;font-weight:700;letter-spacing:.06em;
  text-transform:uppercase;color:var(--muet);margin:0 0 9px}
.r-rep{display:grid;grid-template-columns:1fr 1fr;gap:7px}
.r-rep > div{background:var(--surface-2);border:1px solid var(--ligne);border-radius:9px;padding:8px 10px}
.r-rep span{display:block;font-size:11px;color:var(--muet);line-height:1.3}
.r-rep b{display:block;font-size:13px;font-weight:600;margin-top:2px}

/* ── Le centre : documents, conversation, notes ── */
.r-ong{display:flex;gap:2px;align-self:stretch}
.r-ong a{display:inline-flex;align-items:center;gap:6px;font-size:13px;font-weight:600;
  color:var(--muet);padding:0 13px;text-decoration:none;border-bottom:2px solid transparent}
.r-ong a.on{color:var(--encre);border-bottom-color:var(--terra)}
.r-ong a:hover{color:var(--encre)}
.r-ong svg{width:14px;height:14px}
.r-ong .n{background:var(--terra);color:#fff;border-radius:20px;padding:0 6px;font-size:10.5px}

/* Le document, affiché ICI. Ouvrir un PDF dans un autre onglet fait
   perdre l'écran de décision — on revient, on ne sait plus où on en
   était. */
.r-pdf{flex:1;width:100%;border:0;background:var(--creux,#EFEAE0);min-height:0}
.r-vis{flex:1;background:var(--creux,#EFEAE0);overflow:auto;padding:20px;display:flex;
  flex-direction:column;align-items:center;justify-content:center;gap:16px}
.r-doc{max-width:100%;background:#fff;box-shadow:0 3px 18px -6px rgba(62,43,26,.35);border-radius:3px}
.r-rien{text-align:center;color:var(--muet);font-size:13.5px;display:flex;flex-direction:column;
  align-items:center;gap:9px}
.r-rien svg{width:34px;height:34px;opacity:.35}
.r-rien b{font-family:var(--f-titre);font-size:16px;color:var(--encre-2);display:block}
.r-vistb{display:flex;align-items:center;gap:8px;padding:9px 14px;border-top:1px solid var(--ligne);
  background:var(--surface-2);font-size:12.5px;color:var(--muet)}
.r-vistb .sp{flex:1}
.r-vistb .btn{padding:4px 11px;font-size:12.5px}
.r-vistb svg{width:14px;height:14px}

/* La conversation. Sortants à droite, entrants à gauche : la même
   grammaire que toutes les messageries, parce qu'elle se lit sans
   apprentissage. */
.r-conv{flex:1;overflow-y:auto;padding:18px;display:flex;flex-direction:column;gap:13px}
.r-msg{max-width:80%;border-radius:14px;padding:12px 15px;font-size:13.5px;line-height:1.55;
  white-space:pre-line;word-break:break-word}
.r-msg .qui{font-size:11.5px;font-weight:700;margin-bottom:6px;opacity:.75}
.r-msg .qd{font-size:11px;margin-top:8px;opacity:.6}
.r-out{align-self:flex-end;background:var(--encre);color:var(--fond);border-bottom-right-radius:4px}
.r-in{align-self:flex-start;background:var(--carte);border:1px solid var(--ligne-2);
  border-bottom-left-radius:4px;box-shadow:var(--ombre)}
.r-sys{align-self:center;max-width:90%;background:var(--surface-2);border:1px dashed var(--ligne-2);
  color:var(--muet);font-size:12px;text-align:center;border-radius:20px;padding:6px 14px;
  white-space:normal}
.r-msg .tpl{display:inline-block;background:rgba(255,255,255,.16);border-radius:20px;
  padding:1px 8px;font-size:10.5px}
.r-in .tpl{background:var(--bleu-pale);color:var(--bleu-fonce)}
.r-pj2{display:inline-flex;align-items:center;gap:6px;background:rgba(255,255,255,.14);
  border-radius:8px;padding:5px 9px;font-size:11.5px;margin-top:8px;text-decoration:none;color:inherit}
.r-in .r-pj2{background:var(--surface-2)}
.r-pj2 svg{width:13px;height:13px}
.r-msgbloc{background:var(--surface-2);border:1px solid var(--ligne);border-radius:10px;
  padding:12px 14px;font-size:13.5px;line-height:1.55;white-space:pre-line}
.r-notebloc{background:var(--creme-40);border:1px solid var(--creme-fonce);border-radius:10px;
  padding:11px 13px;font-size:13px;line-height:1.55;margin-bottom:9px}

/* ── Décider ── */
.r-dec{display:flex;flex-wrap:wrap;gap:6px;margin-bottom:14px}
.r-etb{display:inline-flex;align-items:center;gap:6px;border:1px solid var(--ligne-2);
  background:var(--carte);border-radius:99px;padding:6px 12px;font-size:12.5px;
  color:var(--encre-2);text-decoration:none}
.r-etb i{width:7px;height:7px;border-radius:50%;flex:none}
.r-etb:hover{border-color:var(--muet);color:var(--encre)}
.r-etb.on{background:var(--encre);color:var(--fond);border-color:var(--encre)}
.r-ch{width:100%;border:1px solid var(--ligne-2);border-radius:9px;padding:9px 11px;font:inherit;
  font-size:13.5px;background:var(--carte);color:var(--encre);font-family:var(--f-ui)}
textarea.r-ch{min-height:92px;resize:vertical;line-height:1.55}
.r-lab{display:block;font-size:11.5px;color:var(--muet);margin:0 0 5px}
.r-g2{display:grid;grid-template-columns:1fr 1fr;gap:9px}
.r-tplc{background:var(--surface-2);border:1px solid var(--ligne);border-radius:11px;padding:12px 13px}
.r-tplh{display:flex;align-items:center;gap:8px;margin-bottom:10px}
.r-tplh b{font-size:13px;font-weight:700}
.r-tplh .brevo{margin-left:auto;font-size:10.5px;font-weight:700;background:var(--bleu-pale);
  color:var(--bleu-fonce);border-radius:20px;padding:2px 8px}
.r-var{display:flex;flex-wrap:wrap;gap:5px;margin-top:9px}
.r-var span{font-family:ui-monospace,Menlo,monospace;font-size:10.5px;background:var(--carte);
  border:1px solid var(--ligne);border-radius:6px;padding:2px 6px;color:var(--encre-2)}
.r-var span.ko{border-color:var(--rouge);color:var(--rouge-fonce);background:var(--rouge-pale)}
.r-apercu{margin-top:10px;border:1px solid var(--ligne-2);border-radius:10px;overflow:hidden;
  background:#fff}
.r-apercu .b{padding:8px 11px;background:var(--surface-2);border-bottom:1px solid var(--ligne);
  font-size:11px;color:var(--muet);display:flex;align-items:center;gap:8px}
.r-apercu .b svg{width:13px;height:13px}
.r-apercu .c{padding:15px;font-size:12.5px;line-height:1.6;color:#2A2320}
/* L'aperçu vient de Brevo avec ses propres styles : isolé, sinon il
   déborde sur l'écran qui l'affiche. */
.r-apframe{display:block;width:100%;height:250px;border:0;background:#fff}

.r-sw{display:flex;align-items:flex-start;gap:10px;background:var(--carte);
  border:1px solid var(--ligne);border-radius:10px;padding:10px 12px;cursor:pointer;margin-top:9px}
.r-swb{width:36px;height:21px;min-width:36px;border-radius:99px;background:var(--ligne-2);flex:none;
  position:relative;transition:background .15s;margin-top:1px}
.r-swb::after{content:'';position:absolute;top:3px;left:3px;width:15px;height:15px;border-radius:50%;
  background:#fff;transition:transform .15s;box-shadow:0 1px 2px rgba(0,0,0,.2)}
/* La case est masquée sans être retirée du flux : elle reste
   focalisable au clavier, et c'est elle qui pilote l'apparence
   (v11.1 — la classe « on » écrite en dur mentait). */
.r-sw input[type=checkbox]{position:absolute;opacity:0;width:0;height:0;margin:0}
.r-sw:has(input:focus-visible) .r-swb{outline:2px solid var(--terra);outline-offset:2px}
.r-sw:has(input:checked) .r-swb,.r-sw.on .r-swb{background:var(--terra)}
.r-sw:has(input:checked) .r-swb::after,.r-sw.on .r-swb::after{transform:translateX(15px)}
.r-swt{font-size:13px;font-weight:600;display:block}
.r-swl{font-size:11.5px;color:var(--muet);display:block;margin-top:2px;line-height:1.4}
.r-emb{background:var(--vert-pale);border:1px solid var(--vert);border-radius:11px;padding:13px 14px}
.r-emb h5{font-family:var(--f-titre);font-size:14px;margin:0 0 6px;color:var(--vert-fonce)}
.r-emb p{font-size:12.5px;color:var(--vert-fonce);line-height:1.5;margin:0 0 10px;opacity:.9}
.r-emb .r-lab{color:var(--vert-fonce);opacity:.85}

/* Le fil des étapes */
.r-fil{position:relative;padding-left:20px}
.r-fil::before{content:'';position:absolute;left:4px;top:8px;bottom:8px;width:2px;background:var(--ligne)}
.r-ev{position:relative;padding:7px 0;font-size:12.5px}
.r-ev .pt{position:absolute;left:-20px;top:12px;width:10px;height:10px;border-radius:50%;
  background:var(--ligne-2);border:2px solid var(--carte);box-shadow:0 0 0 1.5px var(--ligne-2)}
.r-ev .h{color:var(--muet);font-size:11.5px}
.r-ev .a{font-weight:600;display:block;margin-top:1px;color:inherit}

/* ── Réglages ── */
.r-reg{display:grid;grid-template-columns:230px minmax(0,1fr);gap:18px;align-items:start}
@media(max-width:900px){.r-reg{grid-template-columns:1fr}}
.r-regnav{background:var(--carte);border:1px solid var(--ligne);border-radius:var(--r);
  box-shadow:var(--ombre);overflow:hidden}
.r-regnav a{display:flex;align-items:center;gap:10px;font-size:13.5px;padding:11px 14px;
  text-decoration:none;color:var(--encre-2);border-left:3px solid transparent}
.r-regnav a + a{border-top:1px solid var(--surface-2)}
.r-regnav a.on{background:var(--surface-2);color:var(--encre);font-weight:600;border-left-color:var(--terra)}
.r-regnav svg{width:15px;height:15px;opacity:.65}
.r-carte{background:var(--carte);border:1px solid var(--ligne);border-radius:var(--r);
  box-shadow:var(--ombre);margin-bottom:14px;overflow:hidden}
.r-carteh{padding:14px 17px;border-bottom:1px solid var(--ligne);display:flex;align-items:center;gap:10px}
.r-carteh h3{font-family:var(--f-titre);font-size:16px;font-weight:700;margin:0;letter-spacing:-.012em}
.r-carteh .sp{flex:1}
.r-carteb{padding:17px}
.r-tabl{width:100%;border-collapse:collapse}
.r-tabl th{text-align:left;font-size:12px;font-weight:700;color:var(--muet);padding:9px 12px;
  border-bottom:1px solid var(--ligne);white-space:nowrap}
.r-tabl td{padding:11px 12px;border-bottom:1px solid var(--surface-2);font-size:13.5px;
  vertical-align:middle}
.r-tabl tr:last-child td{border-bottom:0}
.r-tabl tbody tr:hover{background:var(--surface-2)}
.r-champ{margin-bottom:13px}
.r-champ label{display:block;font-size:12px;color:var(--muet);margin-bottom:5px}
.r-code{font-family:ui-monospace,Menlo,monospace;font-size:12px;background:var(--surface-2);
  border:1px solid var(--ligne);border-radius:8px;padding:9px 11px;color:var(--encre-2);
  overflow-x:auto;white-space:pre}
.r-danger{background:var(--rouge-pale);border:1px solid var(--rouge);border-radius:10px;
  padding:11px 13px;font-size:13px;color:var(--rouge-fonce);line-height:1.5}
.r-info{background:var(--bleu-pale);border:1px solid var(--bleu);border-radius:10px;
  padding:11px 13px;font-size:13px;color:var(--bleu-fonce);line-height:1.5}

/* Compléments v11.0 : les classes que les listes du recrutement
   attendaient et qui n'existaient nulle part. */
.lw{background:var(--carte);border:1px solid var(--ligne);border-radius:var(--r);
  box-shadow:var(--ombre);overflow:hidden}
.num{font-variant-numeric:tabular-nums}
/* Le remplissage d'une offre, compté depuis les embauches réelles
   et non déclaré à la main. */
.jauge{height:6px;background:var(--ligne);border-radius:20px;overflow:hidden;min-width:80px;
  margin-top:5px;max-width:120px}
.jauge i{display:block;height:100%;border-radius:20px;background:var(--vert)}
.jauge.court i{background:var(--jaune)}
.jauge.vide i{background:var(--rouge)}
/* Le pied de la colonne « Décider » tient sur une ligne : trois
   boutons pleine taille dans 340 px passaient à la ligne, et
   « Enregistrer » se retrouvait sous le reste. */
.r-colf .btn{padding:7px 12px;font-size:13px}
.r-colf .btn svg{width:14px;height:14px}
.r-kv{grid-template-columns:88px 1fr}
.r-kv dd{overflow-wrap:anywhere}

/* ═══════════════════════════════════════════════════════════════
   RÉGLAGES › EMPLOIS / MÉTIERS                          (v11.1)
   Le référentiel partagé par le recrutement, le contrat, le
   planning et la paie. Préfixe « e- » : il n'existait pas encore.
   ═══════════════════════════════════════════════════════════════ */

/* L'éditeur : le formulaire à gauche, l'annonce à droite.
   Écrire une fiche sans voir ce que le candidat lira, c'est écrire
   à l'aveugle. */
.e-edit{display:grid;grid-template-columns:minmax(0,1fr) 380px;gap:16px;align-items:start}
@media(max-width:1280px){.e-edit{grid-template-columns:1fr}}
.e-sticky{position:sticky;top:14px}

/* L'interrupteur « dans l'annonce » — le cœur du principe :
   une seule fiche, deux lectures. */
.e-sw{display:inline-flex;align-items:center;gap:8px;cursor:pointer;font-size:11.5px;
  color:var(--muet);font-family:var(--f-ui);white-space:nowrap;user-select:none}
.e-sw input{position:absolute;opacity:0;width:0;height:0}
.e-swb{width:32px;height:18px;border-radius:99px;background:var(--ligne-2);position:relative;
  flex:none;transition:background .14s}
.e-swb::after{content:'';position:absolute;top:2px;left:2px;width:14px;height:14px;border-radius:50%;
  background:#fff;transition:transform .14s;box-shadow:0 1px 2px rgba(0,0,0,.25)}
.e-sw input:checked ~ .e-swb{background:var(--vert)}
.e-sw input:checked ~ .e-swb::after{transform:translateX(14px)}
.e-sw input:checked ~ .e-swt{color:var(--vert-fonce);font-weight:600}
.e-sw input:focus-visible ~ .e-swb{outline:2px solid var(--terra);outline-offset:2px}
.e-swt{transition:color .14s}

/* Le catalogue */
.e-fam{margin-bottom:22px}
.e-famh{display:flex;align-items:baseline;gap:10px;margin-bottom:10px}
.e-famh h3{font-family:var(--f-titre);font-size:15px;margin:0;letter-spacing:-.01em}
.e-famh span{font-size:12px;color:var(--muet)}
.e-liste{display:grid;grid-template-columns:repeat(auto-fill,minmax(285px,1fr));gap:11px}
.e-carte{border:1px solid var(--ligne);background:var(--carte);border-radius:12px;padding:14px 15px;
  text-align:left;display:block;color:inherit;text-decoration:none;box-shadow:var(--ombre)}
.e-carte:hover{border-color:var(--muet)}
.e-carte .h{display:flex;align-items:center;gap:8px;margin-bottom:5px}
.e-carte .h i{width:9px;height:9px;border-radius:3px;flex:none}
.e-carte b{font-size:14px;font-weight:700;font-family:var(--f-titre)}
.e-carte .gen{font-size:11.5px;color:var(--muet);margin-bottom:7px}
.e-carte p{margin:0 0 9px;font-size:12.5px;color:var(--encre-2);line-height:1.45}
.e-carte .f{display:flex;flex-wrap:wrap;gap:5px}
.e-neuf{border-style:dashed;display:flex;flex-direction:column;align-items:center;
  justify-content:center;gap:4px;color:var(--muet);text-align:center;min-height:118px}

/* « Comment ça s'écrit » : la démonstration la plus courte de ce
   que les quatre noms servent à faire. */
.e-rendu{background:var(--surface-2);border:1px solid var(--ligne);border-radius:10px;
  padding:11px 13px;margin-top:9px;font-size:12.5px;line-height:1.7}
.e-rendu .l{display:flex;gap:9px;align-items:baseline}
.e-rendu .l .q{color:var(--muet);flex:none;width:140px;font-size:11.5px}
.e-rendu .l b{font-weight:600;overflow-wrap:anywhere}

/* Les compétences en trois familles */
.e-comps{display:grid;grid-template-columns:repeat(3,1fr);gap:12px}
@media(max-width:1000px){.e-comps{grid-template-columns:1fr}}
.e-col{border:1px solid var(--ligne);border-radius:11px;overflow:hidden;background:var(--surface-2)}
.e-colh{padding:9px 12px;border-bottom:1px solid var(--ligne);font-size:12px;font-weight:700;
  color:var(--encre-2);background:var(--carte)}
.e-colh small{display:block;font-weight:400;font-size:11px;color:var(--muet);margin-top:1px}
.e-colb{padding:10px 12px;display:flex;flex-direction:column;gap:6px}
.e-cl{display:flex;align-items:center;gap:7px;background:var(--carte);border:1px solid var(--ligne);
  border-radius:9px;padding:7px 9px;font-size:12.5px}
.e-cl .n{flex:1;line-height:1.35;min-width:0;overflow-wrap:anywhere}
.e-cl select{border:1px solid var(--ligne);border-radius:7px;padding:3px 5px;font-size:11px;
  font-family:var(--f-ui);background:var(--carte);color:var(--encre-2)}
.e-cl .re{color:var(--bleu);font-size:10px;font-weight:700}
.e-sugg{border-top:1px dashed var(--ligne-2);margin-top:2px;padding-top:9px}
.e-sugg .t{font-size:11px;color:var(--muet);margin-bottom:6px;display:flex;align-items:center;gap:5px}
.e-sugg .t svg{width:12px;height:12px}
.e-chips{display:flex;flex-wrap:wrap;gap:6px}
.e-pchip{display:inline-flex;align-items:center;gap:5px;border:1px dashed var(--ligne-2);
  background:none;border-radius:99px;padding:4px 10px;font-size:11.5px;cursor:pointer;
  font-family:var(--f-ui);color:var(--encre-2);text-align:left}
.e-pchip:hover{border-style:solid;border-color:var(--terra);color:var(--terra-h)}

/* L'étiquette du planning, choisie visuellement */
.e-etis{display:flex;flex-wrap:wrap;gap:7px}
.e-eti{display:inline-flex;align-items:center;gap:8px;border:1px solid var(--ligne-2);
  background:var(--carte);border-radius:99px;padding:6px 13px;font-size:13px;cursor:pointer;
  font-family:var(--f-ui);color:var(--encre-2)}
.e-eti i{width:10px;height:10px;border-radius:3px;flex:none}
.e-eti input{position:absolute;opacity:0;width:0;height:0}
.e-eti:has(input:checked){background:var(--encre);color:var(--fond);border-color:var(--encre)}
.e-eti:hover:not(:has(input:checked)){border-color:var(--muet)}

/* Les habilitations exigées */
.e-hl{display:flex;align-items:center;gap:10px;border:1px solid var(--ligne);border-radius:10px;
  padding:10px 12px;background:var(--carte);margin-bottom:7px;flex-wrap:wrap}
.e-hl .n{flex:1;min-width:150px;font-size:13.5px}
.e-hl .n small{display:block;color:var(--muet);font-size:11.5px}
.e-hl select{border:1px solid var(--ligne-2);border-radius:8px;padding:5px 8px;font-size:12.5px;
  font-family:var(--f-ui);background:var(--carte);color:var(--encre)}

/* La grille conventionnelle : d'où elle vient, quelle version,
   ce qui a été changé ici. */
.e-src{display:flex;border:1px solid var(--ligne);border-radius:var(--r);overflow:hidden;
  margin-bottom:14px;background:var(--carte);box-shadow:var(--ombre)}
.e-srcb{flex:1;padding:13px 15px;border-right:1px solid var(--ligne);font-size:13px;min-width:0}
.e-srcb:last-child{border-right:0}
.e-srcb .t{display:flex;align-items:center;gap:7px;font-size:11px;font-weight:700;
  letter-spacing:.06em;text-transform:uppercase;color:var(--muet);margin-bottom:5px}
.e-srcb .t svg{width:13px;height:13px}
.e-srcb b{font-family:var(--f-titre);font-size:15px;display:block;line-height:1.25}
.e-srcb span{font-size:11.5px;color:var(--muet);display:block;margin-top:2px;line-height:1.4}
@media(max-width:900px){.e-src{flex-direction:column}
  .e-srcb{border-right:0;border-bottom:1px solid var(--ligne)}}
.e-gtabl td.mt{font-variant-numeric:tabular-nums;white-space:nowrap}
.e-gtabl tr.sous{background:var(--rouge-pale)}
.e-gtabl tr.surch td:first-child{box-shadow:inset 3px 0 0 var(--terra)}
.e-gin{width:96px;border:1px solid var(--ligne-2);border-radius:7px;padding:5px 7px;font-size:12.5px;
  font-family:var(--f-ui);background:var(--carte);color:var(--encre);text-align:right}
.e-gin.mod{border-color:var(--terra);background:var(--terra-pale);font-weight:600}
.e-herit{color:var(--muet)}

/* L'historique daté : une grille n'est jamais écrasée. */
.e-histo{display:flex;flex-direction:column}
.e-hv{display:flex;gap:12px;padding:11px 0;border-bottom:1px solid var(--surface-2);
  align-items:flex-start}
.e-hv:last-child{border-bottom:0}
.e-hv .pt{width:11px;height:11px;border-radius:50%;flex:none;margin-top:5px;background:var(--ligne-2)}
.e-hv.actu .pt{background:var(--vert)}
.e-hv.futur .pt{background:var(--bleu);box-shadow:0 0 0 3px var(--bleu-pale)}
.e-hv .c{flex:1;font-size:13px;line-height:1.5;min-width:0}
.e-hv .c > b{display:block;font-size:13.5px;font-weight:600}
/* Un <b> à l'intérieur du sous-titre reste dans la phrase : sans
   cette précision, « programmée » partait à la ligne et coupait
   la phrase en trois. */
.e-hv .c span b{display:inline;font-weight:700}
.e-hv .c span{color:var(--muet);font-size:12px}

/* La fusion des intitulés en texte libre */
.e-fus{border:1px solid var(--ligne);border-radius:11px;background:var(--carte);padding:12px 14px;
  margin-bottom:9px}
.e-fus label{display:flex;align-items:center;gap:9px;font-size:13.5px;cursor:pointer}
.e-fus .n{flex:1}
/* L'étape sélectionnée dans l'entonnoir (v11.1) : sans marque, on
   ne sait pas pourquoi le tableau ne montre qu'une colonne. */
.r-ent .e.on{background:var(--surface-2);box-shadow:inset 0 -3px 0 var(--terra)}
.r-ent .e.on b{color:var(--terra-h)}
/* Une seule colonne quand le pipeline est filtré : elle ne doit pas
   s'étirer sur toute la largeur. */
.r-kb:has(.r-kc:only-child){grid-template-columns:minmax(260px,420px)}

/* ═══════════════════════════════════════════════════════════════
   CONVENTIONS COLLECTIVES — mode développeur            (v11.2)
   ═══════════════════════════════════════════════════════════════ */
.ccn-kpi{display:grid;grid-template-columns:repeat(5,1fr);gap:10px;margin-bottom:16px}
@media(max-width:900px){.ccn-kpi{grid-template-columns:repeat(2,1fr)}}
.ccn-kpi .k{background:var(--carte);border:1px solid var(--ligne);border-radius:var(--r);
  padding:12px 14px;box-shadow:var(--ombre)}
.ccn-kpi .k b{display:block;font-family:var(--f-titre);font-size:24px;font-weight:700;line-height:1.1;
  font-variant-numeric:tabular-nums;letter-spacing:-.02em}
.ccn-kpi .k span{display:block;font-size:11.5px;color:var(--muet);margin-top:3px;line-height:1.35}

/* Le titre de secteur, à l'intérieur d'une carte : il sépare sans
   faire une carte de plus. */
.ccn-sect{padding:11px 16px 7px;font-size:12px;font-weight:700;letter-spacing:.05em;
  text-transform:uppercase;color:var(--muet);border-top:1px solid var(--ligne);
  background:var(--surface-2);display:flex;align-items:center;gap:8px}
.ccn-sect span{font-weight:400;letter-spacing:0;text-transform:none;font-size:11.5px}

/* La tête d'une fiche de convention */
.ccn-tete{display:flex;gap:16px;align-items:flex-start;background:var(--carte);
  border:1px solid var(--ligne);border-radius:var(--r);padding:16px 18px;margin-bottom:16px;
  box-shadow:var(--ombre);flex-wrap:wrap}
.ccn-tete .i{font-family:var(--f-titre);font-size:22px;font-weight:700;background:var(--encre);
  color:var(--fond);border-radius:11px;padding:8px 13px;letter-spacing:-.02em;flex:none}
.ccn-tete .n{flex:1;min-width:220px}
.ccn-tete .n h2{font-family:var(--f-titre);font-size:20px;margin:0 0 3px;letter-spacing:-.015em;
  line-height:1.2}
.ccn-tete .n .m{font-size:12.5px;color:var(--muet);line-height:1.5}
.ccn-tete .a{display:flex;gap:8px;flex-wrap:wrap;align-items:center}

/* La barre d'action qui encadre les paramètres, en haut et en bas :
   quarante-neuf lignes, on ne remonte pas chercher le bouton. */
.ccn-bar{display:flex;gap:10px;align-items:center;flex-wrap:wrap;background:var(--carte);
  border:1px solid var(--ligne);border-radius:var(--r);padding:11px 15px;margin-bottom:14px;
  box-shadow:var(--ombre)}
.ccn-bar .l{flex:1;min-width:200px;font-size:12.5px;color:var(--encre-2);line-height:1.45}

/* Le tableau des paramètres : une ligne saisie se distingue d'une
   ligne laissée au code du travail. */
.ccn-p td{vertical-align:top}
.ccn-p tr.saisi{background:var(--surface-2)}
.ccn-p tr.saisi td:first-child{box-shadow:inset 3px 0 0 var(--terra)}
.ccn-p .fi{margin:0}
.ccn-mod{border-color:var(--terra) !important;background:var(--terra-pale) !important;font-weight:600}
.ccn-plus{color:var(--terra-h) !important}

/* Les colonnes attendues par un import */
.ccn-cols{display:flex;flex-wrap:wrap;gap:6px}
.ccn-cols span{font-family:ui-monospace,Menlo,monospace;font-size:11.5px;background:var(--surface-2);
  border:1px solid var(--ligne);border-radius:6px;padding:3px 9px;color:var(--encre-2)}
.ccn-cols span.req{background:var(--terra-pale);border-color:var(--terra);color:var(--terra-h);
  font-weight:700}
/* La ligne de secteur, à l'intérieur du tableau : elle découpe sans
   répéter l'en-tête dix fois. */
.ccn-sectr td{background:var(--surface-2);font-size:11.5px;font-weight:700;letter-spacing:.05em;
  text-transform:uppercase;color:var(--muet);padding:9px 12px !important;
  border-top:1px solid var(--ligne)}
.ccn-sectr td span{font-weight:400;letter-spacing:0;text-transform:none;opacity:.75}

/* ═══════════════════════════════════════════════════════════════
   LA SYNTHÈSE D'UNE CONVENTION                           (v11.3)
   Quatre écrans nouveaux : identité, barèmes, texte, publications.
   Tout est préfixé « ccn- » : app.css contient des sélecteurs nus
   (.bl, .art…) qu'une classe générique heurterait sans prévenir.
   ═══════════════════════════════════════════════════════════════ */

/* Une modale large : l'identité juridique a des champs de texte
   long, et 480 px les rendent illisibles. */
.modal-box.lg{width:min(760px,94vw)}

/* Les codes NAF du champ d'application. */
.ccn-naf{display:flex;flex-wrap:wrap;gap:6px;margin-top:5px}
.ccn-naf span{font-family:ui-monospace,Menlo,monospace;font-size:12px;background:var(--surface-2);
  border:1px solid var(--ligne);border-radius:6px;padding:3px 8px;color:var(--encre-2)}

/* Ce qui est EXCLU du champ se lit autrement que ce qui l'inclut :
   c'est souvent la partie qui tranche. */
.ccn-exclu{border-left:2px solid var(--ligne);padding-left:11px}

/* Le sélecteur de barème : onze pastilles, celles qui sont vides
   en retrait — l'état du travail se voit sans cliquer. */
.ccn-btabs{display:grid;grid-template-columns:repeat(auto-fill,minmax(160px,1fr));gap:7px;
  margin-bottom:14px}
.ccn-btabs a{display:block;background:var(--carte);border:1px solid var(--ligne);
  border-radius:10px;padding:9px 12px;text-decoration:none;color:var(--encre);
  transition:border-color .12s,background .12s}
.ccn-btabs a:hover{border-color:var(--terra)}
.ccn-btabs a b{display:block;font-size:13px;font-weight:600;line-height:1.3}
.ccn-btabs a span{display:block;font-size:11px;color:var(--muet);margin-top:2px}
.ccn-btabs a.vide{background:transparent;border-style:dashed}
.ccn-btabs a.vide b{color:var(--muet);font-weight:500}
.ccn-btabs a.on{background:var(--encre);border-color:var(--encre)}
.ccn-btabs a.on b,.ccn-btabs a.on span{color:#fff}
.ccn-btabs a.on span{opacity:.7}

/* Les articles rédigés, numérotés comme au dictionnaire. */
.ccn-txt .art{padding:12px 0;border-bottom:1px solid var(--surface-2)}
.ccn-txt .art:first-child{padding-top:0}
.ccn-txt .art:last-child{border-bottom:0;padding-bottom:0}
.ccn-txt .art.vise{background:var(--terra-pale);border-radius:10px;padding:12px 14px;
  box-shadow:inset 3px 0 0 var(--terra)}
.ccn-txt .art .h{display:flex;gap:9px;align-items:center;flex-wrap:wrap}
.ccn-txt .art .h .n{font-family:var(--f-titre);font-size:14px;font-weight:700;color:var(--terra);
  min-width:22px;font-variant-numeric:tabular-nums}
.ccn-txt .art .h b{font-size:14.5px;font-weight:600}
.ccn-txt .art .c{font-size:13.5px;line-height:1.6;color:var(--encre-2);margin-top:5px;
  padding-left:31px;max-width:76ch}
/* Une section standard non rédigée est cliquable : elle mène au
   formulaire. Sans cette règle elle prendrait la couleur des liens
   et cesserait de ressembler aux autres pastilles. */
a.r-mp{text-decoration:none;color:inherit}

/* Un texte qui n'est pas encore applicable ne se lit pas comme un
   texte en vigueur. */
.ccn-futur td{opacity:.62}
.ccn-futur td:first-child,.ccn-futur td:nth-child(2){opacity:1}

/* ═══════════════════════════════════════════════════════════════
   LES RÉGLAGES À QUATRE ÉTAGES                           (v11.4)
   Préfixe « rg- » : app.css contient des sélecteurs nus qu'une
   classe générique heurterait sans prévenir.
   ═══════════════════════════════════════════════════════════════ */

/* Un champ dont ce niveau a pris la main : le liseré dit d'un coup
   d'œil ce qui a été décidé ici, sans lire la colonne « source ». */
.rg-mod{border-color:var(--terra) !important;background:var(--terra-pale) !important;font-weight:600}

.rg-t td{vertical-align:top}
.rg-t .fi{margin:0}
.rg-t tr.saisi{background:var(--surface-2)}
.rg-t tr.saisi td:first-child{box-shadow:inset 3px 0 0 var(--terra)}

/* Une valeur de parc devenue inopérante parce que le réglage est
   passé au niveau entreprise. Ce n'est pas une erreur, mais il faut
   que ça se voie : quelqu'un l'avait saisie et croit qu'elle
   s'applique. */
.rg-alerte{color:var(--terra-h) !important;font-weight:600}

/* Les cases d'un réglage à choix multiples. Un <select multiple>
   est inutilisable sur un téléphone, et personne ne devine qu'il
   faut garder Ctrl enfoncé. */
.rg-multi{display:flex;flex-wrap:wrap;gap:5px 12px}
.rg-multi label{display:inline-flex;align-items:center;gap:6px;font-size:13px;cursor:pointer;
  color:var(--encre-2)}
.rg-multi input{accent-color:var(--terra);width:15px;height:15px;cursor:pointer}

/* ═══════════════════════════════════════════════════════════════
   NOUVEAUTÉS ET VERROUS DANS LE MENU                     (v11.5)
   Deux composants du kit, section 5.
   ═══════════════════════════════════════════════════════════════ */

/* ── L'étiquette de nouveauté ──
   Elle s'éteint seule : pleine 15 jours, pâle jusqu'à 45, puis le
   PHP ne la rend plus. Une étiquette « Nouveau » qui reste trois
   ans ne signale plus rien — elle devient un élément de décor. */
.neuf{margin-left:auto;font-size:10px;font-weight:700;letter-spacing:.02em;
  background:var(--terra-pale);color:var(--terra-h);padding:2px 8px;border-radius:20px;
  display:inline-flex;align-items:center;gap:5px;flex:none}
.neuf::before{content:'';width:5px;height:5px;border-radius:50%;background:var(--terra);
  animation:neufpouls 2.4s ease-in-out infinite}
.neuf.gris{background:var(--surface-2);color:var(--muet)}
.neuf.gris::before{background:var(--ligne-2);animation:none}
@keyframes neufpouls{0%,100%{opacity:1;transform:scale(1)}50%{opacity:.35;transform:scale(.75)}}
@media(prefers-reduced-motion:reduce){.neuf::before{animation:none}}

/* ── L'entrée verrouillée ──
   On ne masque pas ce qu'on ne vend pas : le client ne découvrirait
   jamais l'option. Elle reste à sa place, en gris, avec un cadenas
   qui n'est ni rouge ni barré — ce n'est pas une interdiction,
   c'est une invitation. */
.rfly a.verr{color:var(--muet)}
.rfly a.verr .fic{color:var(--ligne-2)}
.rfly a.verr:hover{background:var(--surface-2);color:var(--encre-2)}
.verr .cad,.cad{margin-left:auto;display:flex;align-items:center;flex:none}
.verr .cad .fic,.cad .fic{width:14px;height:14px;color:var(--muet)}
.rfly a.verr:hover .cad .fic{color:var(--terra)}

/* ═══════════════════════════════════════════════════════════════
   ABSENCES ET CONGÉS                                     (v11.5)
   Préfixe « ab- ». Les composants génériques — cartes, pastilles,
   interrupteurs, notes — viennent du kit sans être redéfinis.
   ═══════════════════════════════════════════════════════════════ */

.ab-head{display:grid;grid-template-columns:minmax(210px,1.5fr) 1.1fr 1.3fr 130px auto;gap:14px;
  padding:9px 18px;border-bottom:1px solid var(--ligne);font-size:10px;font-weight:700;
  letter-spacing:.07em;text-transform:uppercase;color:var(--muet);background:var(--surface-2)}
.ab-liste{display:flex;flex-direction:column}
.ab-l{display:grid;grid-template-columns:minmax(210px,1.5fr) 1.1fr 1.3fr 130px auto;gap:14px;
  align-items:center;padding:13px 18px;border-bottom:1px solid var(--surface-2)}
.ab-l:last-child{border-bottom:0}
.ab-l:hover{background:var(--surface-2)}
/* La ligne entière ouvre la fiche : le curseur doit le dire avant
   le clic, et « Modifier » se colore pour montrer où l'on va —
   sinon la ligne cliquable est une surprise (v11.13). */
.cliq{cursor:pointer}
tr.cliq:hover{background:var(--surface-2)}
.cliq:hover .btn.ghost{border-color:var(--terra);color:var(--terra)}
/* Le temps de l'aller-retour, la ligne ne répond plus : sans cela
   trois clics rapides envoient trois bascules qui se croisent. */
.ab-l.occupe{opacity:.55;pointer-events:none}
/* Un type désactivé reste lisible : on l'estompe sans l'effacer,
   parce qu'on doit pouvoir le retrouver pour le réactiver. */
.ab-l.off{opacity:.5}
.ab-nom{display:flex;align-items:center;gap:11px;min-width:0}
.ab-chip{width:34px;height:34px;border-radius:10px;display:flex;align-items:center;
  justify-content:center;flex:none}
.ab-chip .ico{width:17px;height:17px}
.ab-nom b{font-size:14px;font-weight:600;display:block;line-height:1.3}
.ab-nom .c{font-family:ui-monospace,Menlo,monospace;font-size:11px;color:var(--muet)}
.ab-col{display:flex;flex-direction:column;gap:3px;font-size:12.5px;color:var(--encre-2);min-width:0}
.ab-col .t{font-size:10px;font-weight:700;letter-spacing:.07em;text-transform:uppercase;color:var(--muet)}
.ab-manque{color:var(--terra-h) !important;font-weight:600}

/* ═══ LE SÉLECTEUR D'ABSENCE ═══════════════════════      (v11.13)
   Un <select> ne montre qu'une chaîne. Ici on veut la pastille de
   couleur, l'icône et la ligne qui dit ce que le type fait — sinon
   la couleur réglée avec soin ne sert à rien à l'instant précis où
   l'on choisit. Le champ natif reste dans le formulaire, caché par
   .apk-off ; ce qui suit n'est que sa façade. */
.apk-off{display:none !important}
.apk{position:relative}
.apk-b{width:100%;display:flex;align-items:center;gap:10px;text-align:left;cursor:pointer;
  background:var(--carte);border:1px solid var(--ligne-2);border-radius:var(--r-sm);
  padding:7px 10px;min-height:42px;color:var(--encre);font:inherit;transition:border-color .12s}
.apk-b:hover{border-color:var(--muet)}
.apk.on .apk-b{border-color:var(--terra);box-shadow:0 0 0 3px rgba(233,102,70,.13)}
.apk-v{display:flex;align-items:center;gap:10px;flex:1;min-width:0}
.apk-c{width:15px;height:15px;flex:none;color:var(--muet);transition:transform .15s}
.apk.on .apk-c{transform:rotate(180deg)}
.apk-ch{width:28px;height:28px;border-radius:9px;display:flex;align-items:center;
  justify-content:center;flex:none}
.apk-ch .ico{width:15px;height:15px}
.apk-t{display:flex;flex-direction:column;gap:1px;min-width:0}
.apk-t b{font-size:13.5px;font-weight:600;line-height:1.25;overflow:hidden;text-overflow:ellipsis;
  white-space:nowrap}
.apk-t i{font-style:normal;font-size:11px;color:var(--muet);line-height:1.3;overflow:hidden;
  text-overflow:ellipsis;white-space:nowrap}

.apk-p{position:absolute;z-index:70;left:0;right:0;top:calc(100% + 6px);background:var(--carte);
  border:1px solid var(--ligne);border-radius:var(--r);box-shadow:var(--ombre-2);overflow:hidden}
.apk-s{padding:9px 10px;border-bottom:1px solid var(--ligne);background:var(--surface-2)}
.apk-q{width:100%;border:1px solid var(--ligne-2);border-radius:8px;padding:6px 9px;
  font:inherit;font-size:12.5px;background:var(--carte);color:var(--encre)}
.apk-q:focus{outline:none;border-color:var(--terra)}
.apk-l{max-height:326px;overflow-y:auto;padding:5px}
.apk-g{font-size:10px;font-weight:700;letter-spacing:.08em;text-transform:uppercase;
  color:var(--muet);padding:9px 9px 5px}
.apk-o{width:100%;display:flex;align-items:center;gap:10px;text-align:left;cursor:pointer;
  background:none;border:0;border-radius:9px;padding:7px 9px;color:var(--encre);font:inherit}
.apk-o:hover{background:var(--surface-2)}
.apk-o.on{background:var(--surface-2)}
.apk-k{width:15px;height:15px;flex:none;color:var(--terra);opacity:0;margin-left:auto}
.apk-o.on .apk-k{opacity:1}
.apk-n{padding:16px;text-align:center;font-size:12.5px;color:var(--muet)}
/* Dans un tiroir ou une fenêtre modale, le panneau tomberait sous le
   pied : le JS mesure la place et le retourne au-dessus du bouton
   quand il n'y en a pas assez dessous. */
.apk-p.haut{top:auto;bottom:calc(100% + 6px)}

/* ── L'ÉTOILE DES FAVORIS ──                             (v11.12)
   Elle ne retire rien : elle range. Un type favori remonte en tête
   du menu de saisie du planning, devant les trente autres. D'où un
   bouton discret — creux tant qu'il est éteint, plein en ambre une
   fois posé — plutôt qu'un second interrupteur qui se confondrait
   avec celui de l'activation, juste à côté. */
.ab-fav{width:30px;height:30px;border-radius:9px;border:1px solid transparent;background:none;
  display:inline-flex;align-items:center;justify-content:center;flex:none;padding:0;
  color:var(--muet);cursor:pointer;transition:color .12s,background .12s,border-color .12s}
.ab-fav .ico{width:17px;height:17px}
.ab-fav:hover{background:var(--surface-2);border-color:var(--ligne);color:var(--encre-2)}
.ab-fav.on{color:#D9A021}
.ab-fav.on .ico{fill:currentColor}
.ab-fav.on:hover{background:rgba(217,160,33,.10);border-color:rgba(217,160,33,.30);color:#D9A021}
/* Sur un type éteint, l'étoile n'a pas d'objet : on la laisse en
   place pour que la colonne garde la même forme, mais inerte. */
.ab-fav.vide{opacity:.28;cursor:default}

/* La mention d'héritage : une valeur d'entreprise se signale, sinon
   on croit régler son parc. */
.ab-herit{display:inline-flex;align-items:center;gap:6px;font-size:11.5px;color:var(--muet)}
.ab-herit i{width:6px;height:6px;border-radius:50%;background:var(--vert);flex:none}

/* Le calcul d'exemple : montrer vaut mieux qu'expliquer. */
.ab-calc{border:1px solid var(--ligne);border-radius:10px;overflow:hidden;margin-top:12px}
.ab-calc>div{display:flex;justify-content:space-between;gap:12px;padding:10px 14px;
  border-bottom:1px solid var(--surface-2);font-size:13.5px}
.ab-calc>div:last-child{border-bottom:0}
.ab-calc .tot{background:var(--surface-2)}

/* Les jours fériés : trois états, un segment par jour. */
.ab-fer{display:grid;grid-template-columns:repeat(auto-fill,minmax(248px,1fr));gap:9px}
.ab-fer .fer{border:1px solid var(--ligne);border-radius:10px;padding:10px 12px;background:var(--carte)}
.ab-fer .fer.cle{border-color:var(--terra)}
.ab-fer .fer.local{border-style:dashed}
.ab-fer .fer>b{font-size:13.5px;font-weight:600;display:block;margin-bottom:6px}
.ab-fer .seg{display:flex;gap:2px;background:var(--surface-2);border-radius:8px;padding:3px}
.ab-fer .seg label{flex:1;cursor:pointer}
.ab-fer .seg input{position:absolute;opacity:0;pointer-events:none}
.ab-fer .seg label span{display:block;text-align:center;font-size:11.5px;font-weight:600;
  color:var(--encre-2);padding:5px 4px;border-radius:6px}
.ab-fer .seg label.on span{background:var(--carte);box-shadow:var(--ombre)}
.ab-fer .seg label.on.chome span{color:var(--vert)}
.ab-fer .seg label.on.trav span{color:var(--terra-h)}
.ab-fer .seg input:focus-visible + span{outline:2px solid var(--terra);outline-offset:1px}
.ab-fer .loc{display:block;font-size:10.5px;color:var(--muet);margin-top:6px;line-height:1.4}

/* La palette de couleurs d'un type. */

/* ── Le tiroir latéral ──
   Préféré à une modale : on modifie un type en gardant la liste
   sous les yeux, et le formulaire peut être long sans étouffer. */
@media(max-width:820px){
  .ab-l,.ab-head{grid-template-columns:1fr;gap:8px}
  .ab-head{display:none}
}

/* Fond hachuré des démonstrations du kit : il dit « ceci est un
   composant montré hors contexte », et non un élément de la page. */
.kitdemo{display:flex;gap:16px;flex-wrap:wrap;align-items:flex-start;padding:14px;
  background:repeating-linear-gradient(45deg,var(--surface-2),var(--surface-2) 9px,
    transparent 9px,transparent 18px);
  border:1px solid var(--ligne);border-radius:11px}
/* Le panneau volant montré dans le kit n'est pas fixe : il vit dans
   le flux de la page. Il faut aussi défaire ce qui le CACHE — il
   n'apparaît normalement qu'au survol du rail, par opacité et
   visibilité. Sans ces trois lignes, le kit affichait trois cadres
   hachurés parfaitement vides. */
.kitdemo .rfly{position:static !important;box-shadow:var(--ombre);
  opacity:1;visibility:visible;transform:none;pointer-events:auto}

/* ── Le calendrier des jours fériés ──                    (v11.6)
   Six traitements, la vraie date, et le jour de la semaine : un
   férié qui tombe un dimanche ne se règle pas comme un férié en
   pleine semaine de juillet. */
.fer-an{display:inline-flex;align-items:center;gap:8px}
.fer-an b{font-family:var(--f-titre);font-size:15px;min-width:44px;text-align:center}
.fer-t td{vertical-align:top}
.fer-t .fi.sm{margin:0}
.fer-t tr.fer-off td{opacity:.5}
.fer-t tr.fer-off .fi{opacity:1}
.fer-aide{max-width:34ch;line-height:1.45}

/* ── Le cadre légal d'un type d'absence ──                (v11.11)
   En lecture seule : ces valeurs viennent du socle et ne se
   négocient pas dans la fiche de l'établissement. La présentation
   dit « information » et non « formulaire » — pas de bordure de
   champ, pas de fond blanc. */
.ab-legal{display:flex;flex-direction:column;gap:1px;background:var(--ligne);
  border:1px solid var(--ligne);border-radius:11px;overflow:hidden;margin-bottom:4px}
.ab-lg{background:var(--surface-2);padding:9px 13px;display:grid;
  grid-template-columns:1fr auto;gap:2px 12px;align-items:baseline}
.ab-lg .t{font-size:12.5px;font-weight:600;color:var(--encre)}
.ab-lg .v{font-family:ui-monospace,monospace;font-size:12.5px;font-weight:700;color:var(--terra-h);
  text-align:right;white-space:nowrap}
.ab-lg .a{grid-column:1/-1;font-size:11.5px;color:var(--muet);line-height:1.45}
.ab-verrou{color:var(--jaune);display:flex;align-items:flex-start;gap:5px;line-height:1.45}
/* Le tableau des sous-motifs vit dans un tiroir de 580 px : sans
   largeur fixée, « Décès d'un enfant de moins de 25 ans » poussait
   la colonne des durées HORS du tiroir — la seule colonne qu'on
   vient y lire (v11.12). */
.ab-sm{width:100%;min-width:0;table-layout:fixed}
.ab-sm td{font-size:12.5px;white-space:normal;word-break:break-word}
.ab-sm td b{font-family:ui-monospace,monospace;color:var(--terra-h)}
.ab-sm th:last-child,.ab-sm td:last-child{text-align:right;white-space:nowrap}

/* ═══════════════════════════════════════════════════════════════
   LE CONTRAT                                             (v11.16)
   ═══════════════════════════════════════════════════════════════ */

/* ── LE CHAMP VERROUILLÉ ──
   Un contrat commencé et déclaré ne se réécrit pas : la durée, la
   rémunération, la qualification, le terme sont des CLAUSES, et il
   faut un avenant. Le dire dans un texte ne suffit pas — on
   l'essaie quand même, on se heurte à un refus, on s'énerve. Le
   verrou doit se voir AVANT le geste : champ grisé, libellé grisé,
   cadenas à côté du libellé. Ce n'est pas un composant de plus,
   c'est un « .fi » avec « disabled » et trois lignes de dessin. */
.fl.off{color:var(--muet)}
.fi.verr{background:var(--surface-2);color:var(--muet);border-color:var(--ligne)}
.fi.verr:focus{border-color:var(--ligne);box-shadow:none}
.cadn{color:var(--muet);display:inline-flex;vertical-align:-1px}
.cadn .ico{width:11px;height:11px}
/* Ce qui part au registre unique du personnel (R1221-26) : le dire
   explique pourquoi c'est verrouillé. */
.rup{font-size:10px;font-weight:700;letter-spacing:.05em;background:var(--surface-2);
  border:1px solid var(--ligne);border-radius:5px;padding:1px 5px;color:var(--muet);
  vertical-align:1px;font-family:var(--f-ui)}

/* ── LA RÉPARTITION HEBDOMADAIRE ──
   Obligatoire au contrat d'un temps partiel (L3123-6). Sept cases,
   jamais un champ libre : c'est la seule forme qui interdit
   d'écrire « du lundi au vendredi » et de croire que c'est écrit. */
.repj{display:grid;grid-template-columns:repeat(7,1fr);gap:5px;margin-top:10px}
/* CORRECTIF v11.16.3 — « .rj input » masquait AUSSI le champ de
   durée niché dans la case : il héritait de position:absolute et
   d'opacity 0, donc la tuile n'avait plus de surface cliquable et
   la case ne se cochait pas. On ne masque que la case elle-même. */
.rj{cursor:pointer;position:relative}
.rj>input[type=checkbox]{position:absolute;opacity:0;inset:0;width:100%;height:100%;
  margin:0;cursor:pointer;z-index:1}
.rj span{display:flex;flex-direction:column;align-items:center;gap:2px;border:1px solid var(--ligne-2);
  border-radius:9px;padding:7px 2px;font-size:11px;color:var(--muet);background:#fff}
.rj span b{font-size:12px;font-weight:700;color:var(--encre-2)}
.rj input:checked+span{border-color:var(--terra);background:var(--terra-pale);color:var(--terra-h)}
.rj input:checked+span b{color:var(--terra-h)}

/* ── AVANT → APRÈS ──
   Dans le tiroir d'avenant : l'ancienne valeur à côté de la
   nouvelle, au moment où on la remplace. Elle était déjà stockée,
   mais montrée seulement dans l'historique — c'est-à-dire trop
   tard pour éviter la faute de frappe. */
.avv{display:grid;grid-template-columns:1fr auto 1fr;grid-template-areas:"k k k" "o f n";
  gap:5px 10px;align-items:center;padding:9px 0}
.avv+.avv{border-top:1px solid var(--ligne)}
/* Même intitulé que .champ .ck : 10,5 px, 700, majuscules, gris. */
.avk{grid-area:k;font-size:10.5px;font-weight:700;letter-spacing:.06em;text-transform:uppercase;
  color:var(--muet)}
.avo{grid-area:o;font-size:13px;color:var(--muet);text-decoration:line-through}
.avfl{grid-area:f;color:var(--muet);display:flex}
.avfl .ico{width:15px;height:15px;transform:rotate(-90deg)}
.avn{grid-area:n}
.avn .fi{width:100%}

/* ═══ LA FRISE DU CONTRAT ═══                             (v11.16)
   Le seul dessin vraiment nouveau du lot : le kit n'avait rien pour
   raconter une durée. Une liste d'avenants dit CE QUI a changé ;
   elle ne dit pas QUAND, ni combien de temps, ni où l'on en est.

   Trois couches. Le RAIL porte la durée du travail à chaque
   instant — essai hachuré, régime normal en terracotta, période
   temporaire en violet. Les JALONS se répartissent au-dessus et
   au-dessous : sur sept mois de contrat, une fin d'essai et un
   avenant peuvent tomber à quinze jours l'un de l'autre, et deux
   étiquettes centrées se recouvriraient. Le CURSEUR dit
   aujourd'hui.

   Les jalons des extrémités se calent sur le bord au lieu d'être
   centrés : « Début » centré sur 0 % dépasse de la carte. */
.frz{position:relative;padding:2px 0}
.frjh,.frjb{position:relative;height:40px}
.frj{position:absolute;text-align:center;white-space:nowrap}
/* Même paire que .docrow : un titre en 12,5/600 et sa précision en
   11 px gris. On ne crée pas d'échelle pour la frise. */
.frj b{display:block;font-size:12.5px;font-weight:600;color:var(--encre);line-height:1.25}
.frj i{display:block;font-style:normal;font-size:11px;color:var(--muet)}
.frjh .frj{bottom:10px}
.frjb .frj{top:10px}
.frj::after{content:'';position:absolute;left:50%;width:1px;height:10px;background:var(--ligne-2)}
.frjh .frj::after{top:100%}
.frjb .frj::after{bottom:100%}
.frj.bord0::after{left:6px}
.frj.bord1::after{left:auto;right:6px}
.frj.jav b,.frj.jtmp b{color:var(--violet)}
.frj.jfin b{color:var(--terra-h)}
/* La pastille d'aujourd'hui reprend exactement .pill : 10 px,
   700, majuscules, arrondi 20. */
.frj.jauj b{background:var(--encre);color:#fff;border-radius:20px;padding:2px 9px;font-size:10px;
  font-weight:700;letter-spacing:.04em;text-transform:uppercase;display:inline-block}
/* Sa propre voie, juste sous le rail : dans la rangée des jalons
   elle recouvrait son voisin le jour où le contrat commence
   (v11.20.3). Le trait vient du rail au-dessus, elle n'en dessine
   donc pas un second. */
.frauj{position:relative;height:22px}
.frauj .frj{top:4px}
.frj.jauj::after{display:none}
.frr{position:relative;height:26px;border-radius:8px;background:var(--surface-2);overflow:hidden}
.frs{position:absolute;top:0;bottom:0;display:flex;align-items:center;justify-content:center;
  font-size:11px;font-weight:700;color:#fff;overflow:hidden}
.frs span{padding:0 4px;white-space:nowrap;text-overflow:ellipsis;overflow:hidden}
.frs.essai{background:repeating-linear-gradient(135deg,#D9C08A,#D9C08A 5px,#CFB27C 5px,#CFB27C 10px);
  color:#4A3818}
.frs.base{background:var(--terra)}
.frs.temp{background:var(--violet)}
.frs.futur{background:var(--ligne-2)}
.frd{position:absolute;top:0;bottom:0;width:2px;background:rgba(255,255,255,.7);
  transform:translateX(-1px)}
.fraj{position:absolute;top:40px;height:32px;width:2px;background:var(--encre);
  transform:translateX(-1px);z-index:3;border-radius:2px}
/* Sans contrat : le trou entre deux saisons se voit, il ne se
   devine pas. */
.frt{position:absolute;top:5px;bottom:5px;border:1px dashed var(--ligne-2);border-radius:7px;
  display:flex;align-items:center;justify-content:center;font-size:11px;color:var(--muet);
  overflow:hidden}
@media(max-width:700px){.frj i{display:none}.frjh,.frjb{height:30px}.fraj{top:30px}}

/* ── LA PILE DE MESSAGES ──
   Le toast était unique parce que « flash() » n'avait qu'une place.
   Maintenant qu'il y a une file, ils s'empilent — le plus récent en
   bas, contre le bord (v11.16). */
.toasts{position:fixed;bottom:20px;right:20px;z-index:80;display:flex;flex-direction:column;
  gap:8px;align-items:flex-end;max-width:min(400px,92vw);pointer-events:none}
.toasts .toast{position:static;bottom:auto;right:auto;max-width:100%}
/* Trois tons, pas deux : « enregistré » n'est pas « échoué », et une
   réserve — « ce CDD peut être requalifié en CDI » — n'est ni l'un
   ni l'autre : elle n'annule rien, elle prévient (v11.16). */
.toast.wa{background:var(--jaune);color:#fff}
/* Un segment verrouillé doit se voir comme un champ verrouillé :
   sinon on clique, rien ne bouge, et on croit à une panne (v11.16). */
.segf button:disabled,.demi input:disabled+span{opacity:.5;cursor:not-allowed}
/* La sortie : c'est le jalon qu'on vient lire quand un contrat s'est
   arrêté avant son terme (v11.16). */
.frj.jsor b{color:var(--rouge)}
/* La durée de chaque jour, dans la répartition : un champ minuscule
   sous le nom du jour, pas une ligne de plus (v11.16.2). */
/* La durée du jour reste au-dessus de la case, sinon on ne peut
   plus la saisir : la case couvre toute la tuile. */
.rj .rjh{position:relative;z-index:2;width:100%;border:0;background:none;text-align:center;
  font-size:12px;font-weight:700;color:var(--encre-2);font-family:var(--f-ui);padding:0;
  opacity:1;-moz-appearance:textfield}
/* CORRECTIF v11.18 — le champ de durée couvre le tiers bas de la
   tuile. Tant que le jour n'est pas coché il n'a rien à saisir, mais
   il captait quand même le clic : la tuile ne répondait que sur sa
   moitié haute. En passant la souris le long de la ligne, un jour se
   cochait et pas son voisin — selon la hauteur exacte du curseur.
   Désactivé, le champ ne reçoit plus rien : toute la tuile coche. */
.rj .rjh:disabled{color:var(--ligne-2);pointer-events:none}
.rj .rjh::-webkit-outer-spin-button,.rj .rjh::-webkit-inner-spin-button{-webkit-appearance:none;margin:0}
.rj input:checked+span .rjh{color:var(--terra-h)}
.rj .rjh:focus{outline:none}

/* ══════════════════════════════════════════════════════════════
   LA RÉMUNÉRATION ACCESSOIRE                          (v11.18)

   Presque rien de neuf : la ligne de rémunération est une .docrow,
   la même que les documents et les autres contrats — une icône, un
   titre, sa règle en dessous. Trois ajouts seulement.
   ══════════════════════════════════════════════════════════════ */

/* Une ligne de catalogue désactivée : même règle que .ab-l.off, on
   ne la répète pas, on la reprend. */
.docrow.off{opacity:.55}

/* ── LE TABLEAU DE RÉMUNÉRATION ──                     (v11.20)
   C'est « .tA », celui de l'onglet Temps. Il lui manquait une ligne
   de séparation de bloc et une pastille de couleur : rien d'autre.

   La v11.18 posait ici une tuile d'icône de 36 px par ligne et un
   montant sur deux chiffres. Les deux sont partis avec le calcul du
   mois — la fiche porte ce qui est ACCORDÉ, la paie calcule ce qui
   est VERSÉ. La tuile coûtait plus de hauteur qu'elle n'en faisait
   gagner en lecture ; la pastille de 8 px dit la même chose. */
.tA tr.sect td{background:var(--surface-2);font-size:10.5px;font-weight:700;letter-spacing:.06em;
  text-transform:uppercase;color:var(--terra);padding:7px 16px;
  border-bottom:1px solid var(--ligne)}
.tA tr.sect td i{font-style:normal;text-transform:none;letter-spacing:0;font-weight:500;
  color:var(--muet);margin-left:8px}
.tA tr.sect:hover td{background:var(--surface-2)}
.tA tr.tot td{font-weight:700;color:var(--encre);border-top:1px solid var(--ligne)}
.tA tr.tot td:first-child{text-align:right;font-weight:600;color:var(--muet);font-size:12px}
.pastille{display:inline-block;width:8px;height:8px;border-radius:50%;margin-right:9px;
  vertical-align:1px;flex:none}
.trem{min-width:720px}
.trem td{padding:9px 16px}
.trem b.mo{color:var(--jaune)}

/* ══════════════════════════════════════════════════════════════
   L'AVENANT COMME COUCHE DU CONTRAT                   (v11.21)

   Les avenants vivaient dans une carte séparée. Un avenant n'existe
   pas sans son contrat : le lire ailleurs oblige à faire le
   rapprochement de tête. Ils entrent dans la carte, en tableau .tA,
   et deux marques suffisent.

   « .tav » a été essayé d'abord — et c'est DÉJÀ l'avatar rond de
   28 px du kit, si bien que le tableau s'est affiché large de
   28 pixels. Troisième collision après .av et .repj : le nom est
   maintenant explicite, et le contrôle outillé.
   ══════════════════════════════════════════════════════════════ */

/* Le numéro de l'avenant. « L'avenant nº 2 » est ce que disent le
   juriste, le comptable et le salarié ; sans numéro on désigne par
   la date, et deux avenants du même mois se confondent. */
.avnum{display:inline-flex;align-items:center;justify-content:center;width:24px;height:24px;
  border-radius:50%;background:var(--violet-pale);color:var(--violet);
  font-size:12px;font-weight:700;flex:none}

/* La marque d'un champ dont la valeur vient d'un avenant. Le champ
   porte la valeur d'AUJOURD'HUI ; la pastille dit qui l'a posée. */
.champ.av-mod .cv{display:flex;align-items:center;gap:7px;flex-wrap:wrap}
.avtag{font-size:9.5px;font-weight:700;letter-spacing:.04em;text-transform:uppercase;
  background:var(--violet);color:#fff;border-radius:20px;padding:2px 7px;white-space:nowrap}

.tavenants{min-width:700px}
.tavenants td{padding:11px 16px;vertical-align:top}
/* Le contrat d'origine ferme la liste : c'est le point de départ,
   et la seule ligne qui ne se modifie pas. */
.tavenants tr.sect2 td{background:var(--surface-2);color:var(--muet)}
.tavenants tr.sect2 b{color:var(--encre-2)}

/* ══════════════════════════════════════════════════════════════
   LE CLASSEUR DES DOCUMENTS                          (v11.23)

   L'onglet Documents affichait une liste plate, filtrée par des
   pastilles grises, avec le nom du dossier écrit en petit en bout
   de ligne. Le rangement ne se voyait pas : il se lisait.

   Le classeur en fait un OBJET. Chaque rayon est un carreau
   vertical — icône en haut, nom en bas, du vide entre les deux —
   et le rayon ouvert déroule ses pièces juste en dessous, sans
   quitter la page.

   Une tuile HORIZONTALE a été essayée d'abord : pastille, nom,
   compteur et deux badges sur une seule ligne. Sept barres
   empilées, c'est-à-dire la même liste qu'avant avec des coins
   arrondis. C'est le vide qui rend l'icône lisible.

   Trois variables portent la couleur du catalogue, comme partout
   ailleurs : --cc le trait, --cb le bord, --cf le fond pâle.
   ══════════════════════════════════════════════════════════════ */

.clg{display:grid;grid-template-columns:repeat(auto-fill,minmax(178px,1fr));gap:11px;padding:16px}
.clt{position:relative;display:flex;flex-direction:column;background:#fff;
  border:1px solid var(--ligne);border-radius:12px;padding:15px 16px 14px;min-height:104px;
  cursor:pointer;overflow:hidden;text-align:left;font-family:inherit;
  transition:border-color .12s,box-shadow .12s,background .12s}
.clt:hover{border-color:var(--cc);box-shadow:0 1px 5px rgba(45,38,32,.09)}
.clt.on{border-color:var(--cc);background:var(--cf);box-shadow:inset 0 0 0 1px var(--cb)}
.clt:focus-visible{outline:2px solid var(--terra);outline-offset:2px}

/* Le bandeau : trois pixels en tête, comme une tranche de
   classeur. C'est lui qui porte la couleur, ce qui laisse l'icône
   en gris — donc lisible même quand deux rayons ont des icônes
   proches. L'icône dit QUOI, la couleur dit LEQUEL. */
.clbd{position:absolute;top:0;left:0;right:0;height:3px;background:var(--cc)}
.clh{display:flex;align-items:flex-start;gap:6px;color:var(--muet);margin-bottom:auto}
.cln{font-size:13px;font-weight:600;color:var(--encre);line-height:1.3;margin-top:14px}
.clm{font-size:11px;color:var(--muet);margin-top:3px}
.clvide{opacity:.6}
/* « à compléter » : le seul état du carreau qui demande une action.
   Il ne prend pas la couleur du rayon — un manque se lit pareil
   partout, sinon on le cherche. */
.clman{color:var(--jaune);font-weight:600}
.clv{display:inline-flex;color:var(--vert);opacity:.85}
.clal{width:7px;height:7px;border-radius:50%;flex:none;margin-top:4px}
.clal.wa{background:var(--jaune)}
.clal.ko{background:var(--rouge)}

/* « Toutes les pièces » n'est pas un rayon : pas de bandeau, pas de
   couleur de catalogue. Sans cette distinction on croit à un
   huitième dossier — et on cherche à le modifier. */
.clt.cltous{background:var(--surface-2);border-style:dashed}
.clt.cltous .clh{color:var(--muet)}
.clt.cltous.on{background:var(--surface-2);border-style:solid}

/* Le rayon ouvert, juste sous la grille. Il reprend la couleur du
   carreau : c'est ce qui fait le lien entre les deux sans flèche
   ni animation. */
.clo{border-top:1px solid var(--ligne)}
.cloh{display:flex;align-items:center;gap:9px;padding:11px 18px;background:var(--cf);
  border-bottom:1px solid var(--ligne);color:var(--cc);flex-wrap:wrap}
.cloh b{font-size:13px;color:var(--encre)}
.cloh .meta{color:var(--muet)}

/* La marque « ouvert au salarié / interne ». Elle sert au catalogue
   comme à la fiche : la question se pose devant la pièce, donc la
   réponse est devant la pièce. */
.dvis{display:inline-flex;align-items:center;gap:5px;font-size:9.5px;font-weight:700;
  letter-spacing:.03em;text-transform:uppercase;border-radius:20px;padding:3px 9px;
  white-space:nowrap}
.dvis.oui{background:var(--vert-pale);color:var(--vert)}
.dvis.non{background:var(--surface-2);color:var(--muet)}

/* Les deux flèches d'ordre du catalogue : deux formulaires collés,
   sans l'espacement que .docrow met entre ses enfants. */
.ordf{display:inline-flex;gap:2px}
.ordf form{display:inline}
.ordf .lk{padding:0 4px;font-size:14px;line-height:1}
.ordf .lk:disabled{opacity:.3;cursor:default}

/* ══════════════════════════════════════════════════════════════
   L'ATTRIBUT « hidden » CACHE VRAIMENT               (v11.23)

   Le navigateur ne pose `display:none` sur [hidden] que dans SA
   feuille de style, la moins prioritaire de toutes. Le moindre
   `display:flex` d'auteur l'écrase — donc `el.hidden = true` ne
   cachait rien sur .warnline, .clv, .docrow et tout ce qui est en
   flex. Le symptôme est déroutant : le JS est juste, la propriété
   passe bien à true, et l'élément reste à l'écran.

   Le kit contournait le problème DIX fois, une par composant :
   .valert[hidden], .histpop[hidden], .datepop[hidden],
   .socform[hidden], .aboform[hidden], .bmodal[hidden],
   .ptedit[hidden], .supmodal[hidden], .orgedit2[hidden],
   .drop[hidden]. Dix rustines pour une règle. Elles restent — elles
   ne gênent pas — mais on n'en écrira pas une onzième.
   ══════════════════════════════════════════════════════════════ */
[hidden]{display:none !important}

/* ══════════════════════════════════════════════════════════════
   LE MATRICULE DE PAIE                               (v11.24)
   Trois règles, pas un composant : le réglage réutilise .eopt et
   .dwsect, la saisie réutilise .fg. Il ne manquait qu'un exemple
   dans l'option, un cadre pour l'aperçu, et une ligne de formulaire.
   ══════════════════════════════════════════════════════════════ */
/* L'exemple collé au titre de l'option : « GNMN » en dit plus que
   trois lignes d'explication, à condition d'être VU en même temps
   que le titre. */
.eopt .t .matex{margin-left:8px;background:var(--surface-2);border-radius:4px;padding:1px 6px;
  font-size:11px;font-family:ui-monospace,Menlo,monospace;color:var(--muet);font-weight:600}

/* ══════════════════════════════════════════════════════════════
   LES MODÈLES DE DOCUMENTS                           (v11.25)

   L'éditeur est Jodit (assets/jodit.fat.min.*) — on ne redessine
   pas un moteur, on aligne ses bords sur le kit et on ajoute ce qui
   est à nous : la pastille de variable, le bloc conditionnel, le
   saut de page, l'en-tête logo.

   Ces quatre-là vivent DANS le contenu du modèle : ils doivent donc
   être stylés partout où ce contenu s'affiche — l'éditeur, et rien
   d'autre (le document généré emporte ses propres styles dans sa
   page autonome).
   ══════════════════════════════════════════════════════════════ */

/* La barre du modèle, au-dessus du moteur. */
.edtop{display:flex;align-items:center;gap:9px;flex-wrap:wrap;background:var(--carte);
  border:1px solid var(--ligne);border-radius:var(--r);padding:9px 14px;margin-bottom:10px}
.edtop input.fi{max-width:330px;border:1px solid transparent;background:none;
  font-size:14px;font-weight:600}
.edtop input.fi:hover,.edtop input.fi:focus{border-color:var(--ligne-2);background:#fff}
.edstat{font-size:11px;color:var(--muet)}
.mdlv{font-size:10px;font-weight:700;letter-spacing:.04em;text-transform:uppercase;
  background:var(--surface-2);color:var(--muet);border-radius:20px;padding:3px 9px;
  white-space:nowrap}

/* La grille : le moteur à gauche, les variables à droite. Le
   panneau se replie — c'est un écran de travail, la place est au
   document. */
.edwrap{display:grid;grid-template-columns:minmax(0,1fr) 280px;gap:10px;align-items:start}
.edwrap.replie{grid-template-columns:minmax(0,1fr) 34px}
@media(max-width:900px){.edwrap{grid-template-columns:1fr}.edside{display:none}}
.edmain{min-width:0}
.edside{background:var(--carte);border:1px solid var(--ligne);border-radius:var(--r);
  padding:12px;max-height:calc(100vh - 150px);overflow-y:auto;position:sticky;top:12px}
.edwrap.replie .edside{padding:6px;overflow:hidden}
.edwrap.replie .edside>*{display:none}
.edwrap.replie .edside .edrepli{display:flex}
.edrepli{display:flex;align-items:center;justify-content:center;width:100%;border:none;
  background:none;color:var(--muet);cursor:pointer;padding:4px;border-radius:6px;
  font-family:var(--f-ui);font-size:11px;gap:5px}
.edrepli:hover{background:var(--surface-2);color:var(--encre)}
.edpanh{font-size:12.5px;font-weight:700;color:var(--encre);margin-bottom:10px}
.edsearch{display:flex;align-items:center;gap:7px;background:var(--surface-2);
  border:1px solid var(--ligne-2);border-radius:9px;padding:6px 10px;margin-bottom:12px}
.edsearch input{border:none;outline:none;font-size:11.5px;flex:1;font-family:var(--f-ui);
  background:none;color:var(--encre)}
.vgh{display:flex;align-items:center;gap:6px;font-size:10px;font-weight:700;
  letter-spacing:.07em;text-transform:uppercase;color:var(--muet);margin:12px 0 6px}
.vgrid{display:grid;grid-template-columns:1fr;gap:4px}
.vitem{display:flex;align-items:center;gap:7px;background:#fff;border:1px solid var(--ligne);
  border-radius:8px;padding:6px 10px;font-size:11.5px;color:var(--encre);cursor:pointer;
  font-family:var(--f-ui);text-align:left}
.vitem .ico{opacity:.35;flex:none}
.vitem:hover{border-color:var(--violet);color:var(--violet)}

/* La pastille de variable — l'OBJET qui rend la fusion fiable. Un
   {{nom}} tapé se coupe en trois ; une pastille, jamais. */
.vchip{display:inline-flex;align-items:center;gap:4px;background:var(--violet-pale);
  color:var(--violet);border:1px solid #E3D2E0;border-radius:6px;padding:0 6px;
  font-size:.86em;font-weight:600;white-space:nowrap;vertical-align:baseline;
  line-height:1.7;cursor:default;user-select:all}
.vchip .ico{width:9px;height:9px;opacity:.65}
.vmiss{background:var(--rose-pale,#FDF2F3);color:var(--rouge);border:1px dashed var(--rouge);
  border-radius:6px;padding:0 7px;font-size:.86em;font-weight:700;white-space:nowrap}

/* Le bloc conditionnel : la condition en FRANÇAIS dans l'en-tête,
   choisie dans une liste fermée. Une syntaxe d'expressions serait
   plus puissante — et personne ne l'écrirait juste. */
.edcond{border:1px solid #D8CBE0;border-left:3px solid var(--violet);border-radius:8px;
  padding:0;margin:10px 0;background:#FBF8FB;overflow:hidden}
.edcondh{display:flex;align-items:center;gap:7px;font-size:11px;color:var(--violet);
  padding:7px 11px;border-bottom:1px dashed #E3D2E0}
.edcondh b{font-weight:600}
.edcondsel{font-size:11px;color:var(--violet);background:#fff;border:1px solid #E3D2E0;
  border-radius:6px;padding:2px 6px;font-weight:600;font-family:inherit}
.edcondx{margin-left:auto;border:none;background:none;color:var(--muet);cursor:pointer;
  font-size:14px;line-height:1;padding:2px 4px;border-radius:4px}
.edcondx:hover{background:#fff;color:var(--rouge)}
.edcondb{padding:9px 12px}
.edcondb p:last-child{margin-bottom:0}

/* Le saut de page — visible à l'édition, agissant à l'impression. */
.pgbrk{display:flex;align-items:center;gap:10px;margin:16px 0;user-select:none}
.pgbrk::before,.pgbrk::after{content:'';flex:1;border-top:2px dashed var(--ligne-2)}
.pgbrk span{font-size:9.5px;font-weight:700;letter-spacing:.06em;text-transform:uppercase;
  color:var(--muet)}

/* L'en-tête logo : un clic le pose, un clic le retire. */
.edlogo{display:flex;align-items:center;font-size:11px;color:var(--muet);cursor:pointer;
  border:1px dashed var(--ligne-2);border-radius:8px;padding:10px 13px;margin-bottom:18px}
.edlogo .avec{display:none;font-size:14px;color:var(--encre);letter-spacing:.05em}
.edlogo.avec{border-style:solid;background:var(--surface-2)}
.edlogo.avec .sans{display:none}
.edlogo.avec .avec{display:block}

/* Jodit, aligné sur le kit : bords, fonds, et la mise en page d'un
   contrat dans la zone d'écriture. */
.jodit-container:not(.jodit_inline){border:1px solid var(--ligne);border-radius:var(--r);
  background:var(--carte)}
.jodit-toolbar__box:not(:empty){background:var(--surface-2);
  border-radius:var(--r) var(--r) 0 0}
.jodit-wysiwyg{padding:34px clamp(24px,6vw,72px) 60px!important;font-family:var(--f-ui);
  font-size:13.5px;line-height:1.9;color:var(--encre)}
.jodit-wysiwyg h1{font-family:var(--f-tit);font-size:23px;margin:4px 0 14px}
.jodit-wysiwyg h2{font-family:var(--f-tit);font-size:15.5px;margin:20px 0 6px}
.jodit-wysiwyg h3{font-size:13.5px;font-weight:700;margin:14px 0 4px}
.jodit-wysiwyg p{margin:0 0 9px}
.jodit-wysiwyg table td,.jodit-wysiwyg table th{border:1px solid var(--ligne-2);
  padding:7px 10px;vertical-align:top;text-align:left}
.jodit-wysiwyg table th{background:var(--surface-2)}
.jodit-wysiwyg table.edsign td{border:none;padding:18px 10px 34px;width:50%}
.jodit-status-bar a.jodit-status-bar-link{display:none}

/* Le choix d'un salarié dans le tiroir aperçu / générer. */
.mdlpick{display:flex;align-items:center;gap:12px;width:100%;background:#fff;
  border:1px solid var(--ligne);border-radius:11px;padding:10px 13px;cursor:pointer;
  font-family:var(--f-ui);margin-bottom:7px}
.mdlpick:hover{border-color:var(--terra)}
.mdlpick .gav{width:34px;height:34px;border-radius:50%;background:var(--terra);color:#fff;
  display:inline-flex;align-items:center;justify-content:center;font-weight:700;
  font-size:12px;flex:none}
.mdlpick b{display:block;font-size:12.5px;color:var(--encre)}
.mdlpick i{display:block;font-size:10.5px;font-style:normal;color:var(--muet);margin-top:1px}

/* ═══ v11.27 · MODÈLE WORD À VARIABLES ═══
   La photographie du contenu d'un modèle Word natif : une feuille
   blanche, à l'échelle réduite, défilable. Ce n'est PAS un éditeur —
   c'est un aperçu figé, pris à l'import. */
.wpage{background:#fff;border:1px solid var(--ligne);border-radius:8px;
  padding:26px 30px;max-height:62vh;overflow:auto;font-family:Georgia,'Times New Roman',serif;
  font-size:12.5px;line-height:1.55;color:#1A1A1A}
.wpage h1{font-size:19px;margin:0 0 12px}
.wpage h2{font-size:15px;margin:16px 0 6px}
.wpage h3{font-size:13px;margin:12px 0 4px}
.wpage table{border-collapse:collapse;margin:8px 0;max-width:100%}
.wpage table td,.wpage table th{border:1px solid #C9C2B4;padding:5px 8px;vertical-align:top;
  text-align:left}
.wpage img{max-width:100%;height:auto}

/* ═══ v11.28 · LE PANNEAU DES VARIABLES À COPIER ═══
   Le pendant Word de la pastille-objet : ici on ne peut pas insérer
   un nœud dans un fichier qu'on n'ouvre pas — alors on donne le
   marqueur exact, au presse-papier, en un clic. */
.vcpan h4{font-family:var(--f-tit);font-size:16px;color:var(--encre);margin:18px 0 9px}
.vcpan h4:first-of-type{margin-top:14px}
.vgrid2{display:flex;flex-wrap:wrap;gap:7px}
.vcopy{display:inline-flex;align-items:center;gap:7px;background:var(--surface-2);
  border:1px solid transparent;border-radius:20px;padding:7px 13px;font-size:12px;
  color:var(--encre);cursor:pointer;font-family:var(--f-ui);text-align:left;
  transition:background .12s,color .12s}
.vcopy .ico{opacity:.4;flex:none}
.vcopy:hover{background:var(--violet-pale);color:var(--violet)}
.vcopy:hover .ico{opacity:.7}
.vcpret{background:var(--vert-pale);border-radius:var(--r);padding:16px 18px;margin-top:22px}
.vcpret h4{margin:0 0 12px}

/* ═══ v11.28 · L'ÉDITEUR EN PAGES A4 ═══
   Le moteur ne sait rien du format : c'est le CSS qui fait de sa
   zone éditable une feuille A4 posée sur un fond gris, avec un
   repère tous les 29,7 cm. L'en-tête et le pied sont NOS zones,
   déplacées par le script de part et d'autre de la feuille — à
   l'écran on lit une page, à l'impression ils se répètent. */
/* Jodit pose « .jodit-container .jodit-workplace .jodit-wysiwyg
   {height:100%;width:100%} » — trois classes. Il en faut donc quatre
   pour reprendre la main sur la largeur, sinon la feuille s'etale et
   le format A4 n'existe pas. Pas de !important : de la specificite
   honnete. */
.edmain .jodit-workplace{background:var(--surface-2);padding:18px 0;overflow:auto}
.edmain .jodit-container .jodit-workplace .jodit-wysiwyg{
  width:21cm;max-width:100%;height:auto;min-height:29.7cm;margin:0 auto;
  box-sizing:border-box;padding:1.4cm 2cm;background:#fff;
  background-image:repeating-linear-gradient(to bottom,transparent 0,transparent 29.6cm,
    var(--ligne-2) 29.6cm,var(--ligne-2) 29.7cm);
  background-origin:border-box;
  box-shadow:0 1px 4px rgba(45,38,32,.10);border-radius:2px}
.edmain .jodit-container{border-color:var(--ligne)}

/* Les deux bandes. Même largeur que la feuille, collées à elle. */
.edhf{background:var(--surface-2);padding:18px 0 0}
.edhf.bas{padding:0 0 4px}
.edhfin{width:21cm;max-width:100%;margin:0 auto}
.edhfl{display:flex;align-items:center;gap:6px;font-size:9.5px;font-weight:700;
  letter-spacing:.07em;text-transform:uppercase;color:var(--muet);padding:0 2px 5px}
.edhf.bas .edhfl{padding:5px 2px 0}
.edhfl span{font-weight:500;letter-spacing:0;text-transform:none;font-size:10px;opacity:.8}
.edhftb{display:flex;gap:2px;margin-left:auto}
.edhftb button{border:1px solid var(--ligne);background:#fff;border-radius:6px;
  width:23px;height:22px;font-size:11px;line-height:1;cursor:pointer;color:var(--encre);
  font-family:var(--f-ui);display:inline-flex;align-items:center;justify-content:center;
  padding:0}
.edhftb button:last-child{width:auto;padding:0 8px;font-size:10px}
.edhftb button:hover{border-color:var(--terra);color:var(--terra)}
.edhfc{background:#fff;border:1px dashed var(--ligne-2);box-sizing:border-box;
  padding:.55cm 2cm;min-height:1.5cm;font-size:11.5px;line-height:1.6;color:var(--encre);
  outline:none;box-shadow:0 1px 4px rgba(45,38,32,.06)}
.edhfc:focus{border-style:solid;border-color:var(--terra)}
.edhfc p{margin:0}
.edhfc img{max-height:44px;width:auto;vertical-align:middle}
.edhfc:empty::before{content:'Cliquez pour écrire l’en-tête — logo, dénomination, adresse…';
  color:var(--muet);font-size:11px}
.edhf.bas .edhfc:empty::before{content:'Cliquez pour écrire le pied de page — mentions, page…'}

/* ═══ v11.28.2 · LE CHOIX DU FICHIER À L'IMPORT ═══
   Le champ de fichier nu dit « Choose File / No file chosen » — en
   anglais, dans une police qui n'est pas la nôtre. On le cache
   derrière un bouton, et on affiche le nom choisi à côté. */
.impfile{display:flex;align-items:center;gap:10px;flex-wrap:wrap}
.impfn{font-size:12px;color:var(--muet);min-width:0;overflow:hidden;text-overflow:ellipsis;
  white-space:nowrap}

/* Un tiroir qui s'ouvre PAR-DESSUS un autre : le panneau des
   variables est appelé depuis le tiroir d'import, dont le voile
   mangeait les clics (v11.28.2). */
.dwr.dwrhaut{z-index:200}

/* Le relevé de schéma, replié : zéro poids visuel tant qu'on ne
   clique pas, et il ne s'affiche que quand la base est en retard. */
.schdiag{margin-top:10px;font-size:12px}
.schdiag summary{cursor:pointer;font-weight:600}
.schdiag>div{margin-top:7px;line-height:1.6}

/* ═══ v11.31 · LES DOSSIERS DE RANGEMENT DES MODÈLES ═══
   Une colonne de filtres, pas une arborescence : ranger ses modèles
   ne doit pas demander plus d'attention que les modèles eux-mêmes. */
.rangl{display:flex;align-items:center;gap:8px;padding:7px 10px;border-radius:9px;
  font-size:12.5px;color:var(--encre);text-decoration:none;margin-bottom:2px}
.rangl:hover{background:var(--surface-2)}
.rangl.on{background:var(--terra-pale,var(--surface-2));color:var(--terra);font-weight:600}
.rangl span{margin-left:auto;font-size:11px;color:var(--muet);font-weight:500}
.rangl.on span{color:var(--terra)}
.rangl button{border:none;background:none;padding:2px;cursor:pointer;color:var(--muet);
  display:none;line-height:0}
.rangl:hover button{display:inline-flex}
.rangl button:hover{color:var(--terra)}

/* ═══ v11.33 · LE RAIL DES VARIABLES ═══
   Le panneau de droite de l'onglet Modèles. Il ne s'ouvre pas, il est
   LÀ : on rédige son Word à côté, on pioche, on colle. Il se colle en
   haut et défile pour son compte — la liste des modèles peut être
   longue sans emporter le rail hors de l'écran.

   Le survol montre la VALEUR au lieu du libellé, pour les variables
   qui en ont une sans salarié (établissement, compte, global) : on ne
   promet pas « Nom de l'établissement », on montre « Expéria Parc ». */
.modrail{position:sticky;top:14px;max-height:calc(100vh - 28px);overflow:auto}
.modrail .fsec{padding-top:10px}
.vcopy .vsim{display:none;font-weight:600}
.vcopy.vsimok:hover .l{display:none}
.vcopy.vsimok:hover .vsim{display:inline}

/* ═══ v11.33 · LE DÉPÔT PAR GLISSER/DÉPOSER ═══
   Un champ de fichier nu dit « Choose File » en anglais. La zone dit
   ce qu'on peut y faire, et prend le fichier des deux façons. */
.dzon{border:1.5px dashed var(--ligne);border-radius:var(--r);background:var(--surface-2);
  padding:22px 18px;text-align:center;cursor:pointer;color:var(--muet);font-size:12.5px;
  transition:border-color .12s,background .12s,color .12s}
.dzon:hover{border-color:var(--terra);color:var(--encre)}
.dzon .ico{width:22px;height:22px;opacity:.45;margin-bottom:7px}
.dzon b{display:block;color:var(--encre);font-size:13px;margin-bottom:3px}
.dzon.dzok{border-color:var(--vert);border-style:solid;background:var(--vert-pale);
  color:var(--vert)}
.dzon.dzok .ico{opacity:.8}
/* Le fichier survole la zone : elle le dit avant qu'on lâche, sinon
   on ne sait pas si l'on vise juste.                      (v14.31) */
.dzon.dzsur{border-color:var(--terra);border-style:solid;background:var(--terra-pale);
  color:var(--encre)}

/* ═══ v11.34 · LE SWITCH DANS LA LIGNE ═══
   Ouvrir un dossier au salarié est le réglage qu'on change le plus
   souvent : il se pose dans la LISTE, pas au fond d'un tiroir. La
   ligne entière est cliquable — le formulaire arrête la propagation,
   sinon basculer le switch ouvrirait le tiroir en même temps. */
.dvsw{flex:none;margin:0}
.dvsw .sw{gap:7px}
.dvsw .swl{font-size:11.5px;font-weight:600}

/* ═══ v11.35 · LES CONDITIONS DANS LE RAIL ═══
   Distinguées des variables par la couleur, parce qu'elles ne se
   collent pas au même endroit : une variable se pose au milieu d'une
   phrase, une condition encadre des paragraphes. Le clic copie le
   squelette entier — ouverture, sinon, fermeture. */
.vcopy.vcond{background:var(--jaune-pale)}
.vcopy.vcond:hover{background:var(--jaune);color:#fff}
.vcopy.vcond:hover .ico{opacity:.9}

/* ═══ v11.36 · LA SYNTAXE, LÀ OÙ ELLE SE TAPE ═══
   Une liste de noms n'apprend pas une syntaxe. Le rail montre donc
   le squelette tel qu'il se tape, avec un vrai exemple — au-dessus
   des pastilles, parce qu'on lit avant de cliquer. */
.vaide{background:var(--surface-2);border-radius:var(--r);padding:12px 14px;
  margin:6px 0 12px;font-size:11.5px;line-height:1.55;color:var(--muet)}
.vaide p{margin:0 0 8px}
.vaide p:last-child{margin-bottom:0}
.vaide b{color:var(--encre)}
.vaide code{font-size:11px}
.vaide p.ko{color:var(--rouge)}
.vaide p.ko b{color:var(--rouge)}
.vsq{background:#fff;border:1px solid var(--ligne);border-radius:8px;
  padding:9px 11px;margin:0 0 9px;font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;
  font-size:11px;line-height:1.6;color:var(--encre);white-space:pre;overflow-x:auto}

/* ═══ v11.36 · LE CHEMIN CLIQUABLE ═══
   Le bandeau porte le chemin complet, chaque maillon cliquable sauf
   le dernier. Il remplace les boutons « retour » que chaque écran
   profond posait à sa façon — un bouton dit d'où l'on vient, un
   chemin dit où l'on EST. */
.crumb{display:flex;align-items:center;gap:5px;min-width:0}
.crumb b{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.crlk{color:var(--muet);text-decoration:none;white-space:nowrap;border-radius:6px;
  padding:2px 5px;margin:0 -5px;transition:background .12s,color .12s}
.crlk:hover{background:var(--surface-2);color:var(--encre)}
.crsep{display:inline-flex;color:var(--ligne-2,var(--ligne));flex:none}
.crsep .ico{width:13px;height:13px}
/* Sur un écran étroit, seul le dernier maillon compte : on est
   dessus, les autres se retrouvent par le rail. */
@media (max-width:900px){ .crumb a.crlk, .crumb .crsep{display:none} }

/* ═══ v11.37 · LES RÔLES ═══
   Aucune icône ici, et c'est la règle §3 : une image qui répète le
   libellé à côté d'elle ne dit rien de plus. Ce qu'un rôle a besoin
   de porter — le fait que ce soit CELUI-LÀ, reconnu de loin dans une
   liste — une couleur le porte mieux qu'un dessin, et sans prétendre
   signifier quelque chose. */

/* Le trait de couleur du rôle. 3px : assez pour se voir en balayant
   la liste, trop peu pour se lire comme un élément à cliquer. */
.rcol{width:3px;align-self:stretch;min-height:30px;border-radius:2px;flex:none}
.rcol.lg{width:4px;min-height:44px;border-radius:3px}

.rrow{display:flex;align-items:center;gap:12px;padding:11px 18px;
  border-bottom:1px solid var(--surface-2)}
.rrow:last-child{border-bottom:none}
.rrow .d1{font-weight:600;font-size:12.5px;color:var(--encre)}
.rrow .d2{font-size:11px;color:var(--muet);margin-top:1px}
.rrow form{display:flex}

/* L'en-tête de famille, dans la liste comme dans les permissions.
   Il porte son compte à droite : « 5 sur 9 » se lit d'un coup, et
   c'est la seule façon de repérer un module largement ouvert sans
   parcourir ses lignes. */
.rmod{display:flex;align-items:center;gap:8px;padding:9px 18px;
  background:var(--surface-2);border-bottom:1px solid var(--ligne);
  font-size:11px;font-weight:700;letter-spacing:.03em;color:var(--encre-2)}
.rmod .n{font-weight:500;letter-spacing:0;color:var(--muet)}

/* Une permission. Éteinte, elle s'efface — sans disparaître : on doit
   pouvoir la trouver pour l'allumer. */
.rperm{display:flex;align-items:center;gap:14px;padding:9px 18px;
  border-bottom:1px solid var(--surface-2);opacity:.55;transition:opacity .12s}
.rperm:last-child{border-bottom:none}
.rperm.on{opacity:1}
.rperm .d1{font-weight:600;font-size:12.5px;color:var(--encre)}
.rcode{font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;
  font-size:10px;color:var(--muet);margin-top:1px}

/* La portée : trois choix côte à côte, jamais un menu déroulant. Un
   menu cache deux réponses sur trois, et c'est justement leur
   comparaison qui fait la décision. */
.rpor{display:inline-flex;border:1px solid var(--ligne);border-radius:8px;
  overflow:hidden;flex:none;background:var(--carte)}
.rpor label{position:relative;cursor:pointer}
.rpor label+label{border-left:1px solid var(--ligne)}
.rpor input{position:absolute;opacity:0;width:0;height:0}
.rpor span{display:block;padding:5px 10px;font-size:11px;color:var(--muet);
  white-space:nowrap;transition:background .12s,color .12s}
.rpor label:hover span{background:var(--surface-2);color:var(--encre)}
.rpor label.on span{background:var(--terra-pale,var(--surface-2));color:var(--terra-h);font-weight:600}
.rpor input:disabled+span{cursor:default}
.rpor label:has(input:disabled){cursor:default}

.rmeta{font-size:11px;color:var(--muet);white-space:nowrap;flex:none}

/* ── v11.37.1 · CE QUE LA POSITION VEUT DIRE ──
   « ouvre les fiches de : Manager, Employé ». C'est une PHRASE, pas un
   identifiant : elle ne prend donc pas le chasse-fixe de .rcode, qui
   sert aux paie.montants et compagnie. Elle vit sous la description,
   plus discrète qu'elle — on la lit quand on cherche la hiérarchie,
   pas quand on cherche le rôle. */
.rvoit{font-size:10.5px;color:var(--muet);margin-top:2px;line-height:1.4}
.rvoit b{font-weight:600;color:var(--encre-2)}

/* ── v11.38 · LE SÉLECTEUR D'ORGANISATION ──
   Dans le menu du compte, et seulement quand il y en a plusieurs.
   Chaque ligne est un <button> dans son propre <form> : basculer
   d'organisation est une ÉCRITURE — la session se reconstruit — et
   une écriture ne se déclenche pas par un lien, qu'un navigateur ou
   un antivirus peut visiter tout seul. */
.tmtitre{padding:7px 15px 3px;font-size:10.5px;font-weight:700;letter-spacing:.04em;
  color:var(--muet);text-transform:uppercase}
.tmline form,.tcpt form{display:contents}
.tcpt form button.tmline{width:100%;border:0;background:none;font:inherit;text-align:left;
  cursor:pointer;font-size:12.5px}
/* La pastille tient la place de la coche de l'organisation courante :
   sans elle, les noms ne s'alignent pas et la liste se lit de
   travers. Ce n'est pas un ornement, c'est une gouttière. */
.tmpuce{width:15px;height:15px;flex:none}
.tmline.on{color:var(--encre);font-weight:600}
.tmline.on svg{stroke:var(--vert-h,var(--terra-h))}

/* ═══ v11.39 · LA LISTE ET LE TABLEAU DES RÔLES ═══
   La version précédente portait trois pavés d'explication. Ce qui
   reste dit la même chose sans les lire : un numéro, un nom coloré,
   un compte. */

/* Le numéro d'ordre. C'est LUI la hiérarchie : « 1 » ouvre tout ce
   qui suit, le dernier n'ouvre rien. */
.rord{width:20px;flex:none;text-align:center;font-size:11px;font-weight:700;
  color:var(--muet);font-variant-numeric:tabular-nums}

/* Le nom du rôle dans sa couleur. Pastille, pas trait : dans une
   liste courte on lit le nom, pas une bande de couleur à côté. */
.rbul{display:inline-flex;align-items:center;border:1px solid;border-radius:20px;
  padding:3px 11px;font-size:11.5px;font-weight:600;white-space:nowrap;flex:none}

/* ── Le tableau récapitulatif ── */
.rtab{width:100%;border-collapse:collapse;font-size:12px}
.rtab th,.rtab td{padding:7px 10px;text-align:center;border-bottom:1px solid var(--surface-2)}
.rtab thead th{padding-bottom:11px;vertical-align:bottom}
.rtab .rtl{text-align:left;font-weight:600;color:var(--encre);white-space:nowrap}
.rtab .rtl i{font-style:normal;font-weight:500;color:var(--muet);font-size:10.5px}
.rtab td{font-variant-numeric:tabular-nums;font-weight:600}
.rtab td i{font-style:normal;font-weight:400;color:var(--muet);font-size:10.5px}
/* Trois états, pas un dégradé : un contraste se lit plus vite qu'une
   nuance. Rien / une partie / tout. */
.rtab .rtz{color:var(--ligne-2,#CFC8BC);font-weight:400}
/* Une partie accordée : le chiffre suffit. Un fond gris ici
   dessinait un escalier de blocs d'une colonne à l'autre, qu'on
   lisait comme un motif avant de lire les nombres. */
.rtab .rtd{color:var(--encre-2)}
.rtab .rtp{color:var(--terra-h);background:var(--terra-pale)}
.rtab .rttot td{font-size:12.5px;border-top:1px solid var(--ligne)}
.rtab tbody tr:hover td,.rtab tbody tr:hover th{background:var(--surface-2)}

/* Un compte clos reste lisible sans attirer l'œil. */
.urow.sortie{opacity:.5}

/* ═══ v11.40 · TOUT VOIR ═══ */

/* Une ligne de formulaire : le champ et son bouton côte à côte. Un
   bouton sous un champ unique fait deux lignes pour un seul geste. */
.rlig{display:flex;align-items:center;gap:10px;flex-wrap:wrap}

/* Un écart avec le rôle. La ligne ne change pas de forme — c'est une
   autorisation comme les autres — elle porte juste sa marque. */
.rtag{font-size:10px;font-weight:700;letter-spacing:.03em;text-transform:uppercase;
  background:var(--jaune-pale);border:1px solid #EEDFBB;color:#7A5410;
  border-radius:6px;padding:2px 7px;white-space:nowrap;flex:none}
.rperm.ecart{background:linear-gradient(90deg,var(--jaune-pale) 0,transparent 220px)}

/* ── La grille exhaustive ──
   426 interrupteurs : chaque pixel compte, et les lignes doivent
   rester distinctes du regard sans bordure verticale. */
.rtab-x th.rtl{max-width:340px;white-space:normal;line-height:1.3}
.rtab-x th.rtl i{display:block;font-style:normal;font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;
  font-size:9.5px;color:var(--muet);margin-top:1px}
.rtab-x td{padding:5px 10px;white-space:nowrap}
.rtab-x tbody tr:nth-child(even of :not(.rtmod)) td{background:rgba(0,0,0,.012)}
/* L'en-tête de module traverse toute la ligne : il sépare sans ajouter
   de colonne. */
.rtab .rtmod th{background:var(--surface-2);border-bottom:1px solid var(--ligne);
  font-size:11px;font-weight:700;letter-spacing:.03em;color:var(--encre-2);padding:7px 10px}
/* La portée, sous l'interrupteur : « étab. » tient là où
   « Son établissement » demanderait trois fois la largeur. */
.rtpor{display:block;font-size:9px;color:var(--muet);margin-top:1px;letter-spacing:.02em}
/* Un interrupteur qui ne se clique pas ne doit pas s'annoncer
   cliquable : ni curseur, ni survol. */
.sw-ro{cursor:default}
.sw-ro:hover .swt{filter:none}

/* ── v11.41 · LE BOUTON DU DÉVELOPPEUR ──
   Pendant une simulation, l'application refuse au développeur ce
   qu'elle refuserait à la personne simulée. Ces boutons-là sont ceux
   qu'il garde malgré tout : le rouge dit « ceci n'appartient pas à ce
   que vous êtes en train de regarder ». Sans cette distinction, on
   croirait que l'utilisateur dispose du bouton — et une simulation qui
   ment là-dessus est pire que pas de simulation. */
.btn.dev{background:var(--rouge);border-color:var(--rouge);color:#fff;font-weight:600}
.btn.dev:hover{background:#A8323A;border-color:#A8323A}
.btn.dev svg{stroke:#fff}
/* La variante discrète, pour une barre déjà chargée : le contour
   suffit à la reconnaître. */
.btn.dev.creux{background:transparent;color:var(--rouge);border-color:var(--rouge)}
.btn.dev.creux:hover{background:var(--rouge-pale)}
.btn.dev.creux svg{stroke:var(--rouge)}
/* Un groupe de gestes réservés, posé au fil d'un écran. Le liseré
   gauche les rattache les uns aux autres sans encadrer toute la zone. */
.devz{display:flex;align-items:center;gap:8px;flex-wrap:wrap;
  border-left:3px solid var(--rouge);background:var(--rouge-pale);
  border-radius:0 10px 10px 0;padding:9px 13px;margin:12px 0}
.devz .dvl{font-size:10.5px;font-weight:700;letter-spacing:.04em;text-transform:uppercase;
  color:var(--rouge);white-space:nowrap;margin-right:2px}

/* ═══ v11.42 · LA NOTIFICATION, UNE SEULE ═══
   Il y en avait quatre : la pile rendue par l'en-tête (fond sombre),
   expToast() en pied de page (qui écrivait DANS la première de la
   pile), toast() du planning (sur un troisième élément), et les
   bandeaux .alert posés dans les pages. Quatre formes pour une seule
   phrase — « c'est enregistré » — et deux qui se corrompaient
   mutuellement.

   Une seule maintenant : carte blanche, pastille d'état, texte,
   croix, et une barre qui se vide. La barre n'est pas un ornement :
   sans elle, on ne sait pas si le message va rester ou partir, donc
   on le lit dans l'urgence ou on l'ignore. */

.notifs{position:fixed;bottom:20px;right:20px;z-index:120;display:flex;
  flex-direction:column;gap:10px;align-items:flex-end;
  width:min(420px,calc(100vw - 40px));pointer-events:none}

.notif{position:relative;display:flex;align-items:flex-start;gap:11px;
  width:100%;background:var(--carte);border:1px solid var(--ligne);
  border-radius:12px;padding:13px 14px 15px;box-shadow:var(--ombre-2);
  overflow:hidden;pointer-events:auto;
  opacity:0;transform:translateY(10px) scale(.98);
  transition:opacity .18s ease,transform .18s ease}
.notif.on{opacity:1;transform:none}
/* La sortie glisse vers la droite : elle se distingue de l'entrée,
   et on comprend qu'elle s'en va plutôt qu'elle clignote. */
.notif.part{opacity:0;transform:translateX(16px)}

.notif .nfic{flex:none;display:inline-flex;margin-top:1px}
.notif .nfic svg{width:17px;height:17px;fill:none;stroke-width:1.9}
.notif.ok .nfic svg{stroke:var(--vert,#55773b)}
.notif.ko .nfic svg{stroke:var(--rouge)}
.notif.wa .nfic svg{stroke:var(--jaune)}
.notif.in .nfic svg{stroke:var(--bleu)}

.nftx{flex:1;min-width:0;font-size:12.5px;line-height:1.45;color:var(--encre);
  overflow-wrap:anywhere}
.nftx b{font-weight:700}

.nfx{flex:none;width:20px;height:20px;border:0;background:none;cursor:pointer;
  color:var(--muet);font-size:15px;line-height:1;padding:0;border-radius:6px;
  display:inline-flex;align-items:center;justify-content:center}
.nfx:hover{background:var(--surface-2);color:var(--encre)}

/* La barre de décompte, à ras du bord bas. Le rail pâle montre le
   temps déjà écoulé — sans lui, la barre qui rétrécit ressemble à un
   chargement qui progresse, c'est-à-dire à l'inverse. */
.nfbar{position:absolute;left:0;right:0;bottom:0;height:3px;background:var(--surface-2)}
.nfbar i{display:block;height:100%;width:100%;transform-origin:left center;
  animation:nfvide linear forwards}
.notif.ok .nfbar i{background:var(--vert,#55773b)}
.notif.ko .nfbar i{background:var(--rouge)}
.notif.wa .nfbar i{background:var(--jaune)}
.notif.in .nfbar i{background:var(--bleu)}
@keyframes nfvide{from{transform:scaleX(1)}to{transform:scaleX(0)}}
/* Survol : on lit. Le décompte s'arrête, et le message avec. */
.notif:hover .nfbar i{animation-play-state:paused}

@media (max-width:640px){
  .notifs{left:16px;right:16px;bottom:16px;width:auto;align-items:stretch}
}

/* ═══ v11.44 · LA RECHERCHE QUI CHERCHE ═══
   C'était un bouton : il mettait le focus sur un champ de la page
   s'il en trouvait un, et redirigeait vers les salariés sinon. Il ne
   cherchait rien.

   C'est un champ, plus large et centré dans le bandeau, parce que
   c'est le geste qu'on fait le plus souvent après avoir ouvert un
   écran : y trouver quelqu'un. */

.rech{position:relative;display:flex;align-items:center;gap:9px;height:38px;
  padding:0 10px 0 12px;border-radius:11px;border:1px solid var(--ligne);
  background:var(--surface-2);flex:1;max-width:520px;min-width:180px;
  transition:border-color .12s,background .12s,box-shadow .12s}
.rech:focus-within{background:var(--carte);border-color:var(--terra);
  box-shadow:0 0 0 3px var(--terra-pale)}
.rech > svg{width:16px;height:16px;stroke:var(--muet);fill:none;stroke-width:1.9;flex:none}
.rech:focus-within > svg{stroke:var(--terra-h)}

.rqi{flex:1;min-width:0;border:0;background:none;font-family:var(--f-ui);
  font-size:12.5px;color:var(--encre);outline:none;padding:0}
.rqi::placeholder{color:var(--muet)}
/* La croix native de Chrome sur type=search : on garde la nôtre, une
   seule croix par champ. */
.rqi::-webkit-search-cancel-button{-webkit-appearance:none;appearance:none}
.rech kbd{font-family:var(--f-ui);font-size:10px;font-weight:600;background:var(--carte);
  border:1px solid var(--ligne);border-radius:4px;padding:1px 5px;color:var(--muet);flex:none}
.rech:focus-within kbd{display:none}

/* ── Les propositions ──
   Sous le champ, alignées sur lui. Elles ne s'ouvrent QUE s'il y a
   quelque chose à proposer : un panneau vide sous chaque frappe est
   un panneau qu'on apprend à ignorer. */
.rqbox{position:absolute;top:calc(100% + 6px);left:0;right:0;z-index:130;
  background:var(--carte);border:1px solid var(--ligne);border-radius:12px;
  box-shadow:var(--ombre-2);overflow:hidden;max-height:min(60vh,460px);overflow-y:auto}
.rqgrp{padding:7px 13px 4px;font-size:10.5px;font-weight:700;letter-spacing:.04em;
  text-transform:uppercase;color:var(--muet);background:var(--surface-2);
  border-bottom:1px solid var(--ligne)}
.rqres{display:flex;align-items:center;gap:10px;padding:9px 13px;width:100%;
  border:0;background:none;text-align:left;cursor:pointer;font-family:var(--f-ui);
  font-size:12.5px;color:var(--encre);text-decoration:none;
  border-bottom:1px solid var(--surface-2)}
.rqres:last-child{border-bottom:none}
.rqres:hover,.rqres.sel{background:var(--surface-2)}
.rqres svg{width:15px;height:15px;stroke:var(--muet);fill:none;stroke-width:1.8;flex:none}
.rqres .rqn{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.rqres .rqs{font-size:11px;color:var(--muet);white-space:nowrap;flex:none}

/* Le compte de ce qui reste après filtrage. Il apparaît DANS l'écran,
   là où le filtre agit — pas dans le champ : c'est le résultat qu'on
   regarde, pas la requête. */
.rqvide{padding:14px 18px;font-size:12.5px;color:var(--muet)}

@media (max-width:1100px){ .rech{max-width:260px} }
@media (max-width:760px){ .rech kbd{display:none} }

/* ═══ v11.45 · VÉRIFIER LES BULLETINS AVANT DE LES DISTRIBUER ═══

   L'écran d'analyse est le seul moment où l'on peut encore empêcher
   qu'un bulletin de salaire atterrisse chez un collègue. Il est donc
   organisé par ce qui DEMANDE une décision, pas par l'ordre des pages
   du PDF. */

/* Un bloc = une période lue sur les bulletins. « À reprendre » vient
   en premier et porte le liseré d'alerte : ce sont les seules lignes
   qui ne partiront pas si on ne les touche pas. */
.bulbloc{margin-top:14px;overflow:hidden}
.bulbloc.arep{border-color:var(--rouge);box-shadow:0 0 0 3px var(--rouge-pale)}
.bulbloc.arep>.ch{background:var(--rouge-pale)}
.bulglob{display:flex;align-items:center;gap:9px;flex-wrap:wrap}

/* Le rang de la page DANS LE LOT, pas le nom du fichier : c'est ce
   qu'affiche l'aperçu, et c'est ce qui permet de retrouver la page
   dans un PDF de quarante bulletins. */
.docic.bpage{font-size:10px;letter-spacing:0;background:var(--surface-2);color:var(--muet)}

/* Deux états qui appellent un geste, deux couleurs. Le liseré est à
   gauche : on lit une liste de haut en bas, la marque doit être là où
   l'œil commence. */
.docrow.dbl{box-shadow:inset 3px 0 0 var(--jaune);background:var(--jaune-pale)}
.docrow.orph{box-shadow:inset 3px 0 0 var(--rouge)}
/* Pas de fond sur la ligne : le bloc « À reprendre » est déjà teinté
   par son en-tête. Teinter aussi chaque ligne noierait les pastilles
   qui, elles, disent POURQUOI la page est là. */

/* Le choix binaire d'une ligne. Descendant direct de .ab-fer .seg
   (fériés), qui faisait la même chose mais scopé à un écran — celui-ci
   est générique, l'autre le rejoindra quand on y retouchera. */
.segr{display:flex;gap:2px;background:var(--surface-2);border:1px solid var(--ligne);
  border-radius:9px;padding:3px;flex:none}
.segr label{cursor:pointer;position:relative}
.segr input{position:absolute;opacity:0;pointer-events:none}
.segr label span{display:block;text-align:center;font-size:11.5px;font-weight:600;
  color:var(--muet);padding:5px 11px;border-radius:6px;white-space:nowrap}
.segr label.on span{background:var(--carte);box-shadow:var(--ombre);color:var(--encre)}
.segr label.on.rempl span{color:var(--terra-h)}
.segr label.on.ign span{color:var(--muet)}
.segr input:focus-visible + span{outline:2px solid var(--terra);outline-offset:1px}

/* La période saisie à la main : elle ne s'affiche QUE sur la ligne
   dont la période n'a pas été lue. Ailleurs, une pastille suffit —
   proposer un sélecteur partout inviterait à corriger ce qui est
   juste. */
.bulper{display:flex;gap:6px;flex:none}
.bulper .fi{width:auto;min-width:96px;padding-top:6px;padding-bottom:6px;font-size:12px}

.bulplus{padding:11px 18px;font-size:12px;color:var(--muet);background:var(--surface-2)}

/* ── LA HIÉRARCHIE DES GESTES ──

   Quatre poids, du plus engageant au plus anodin, et jamais deux
   gestes de portées différentes dans la même apparence :

     1. .btn.p      distribuer — le seul bouton qui écrit, une fois
     2. .btn.ghost.sm  trancher tout un bloc — « tout remplacer »
     3. .segr       trancher une ligne — l'état se lit sans cliquer
     4. .lkq        consulter — ça n'écrit rien, ça ne doit rien peser

   Avant, « tout remplacer » et « voir la page » étaient le même lien
   terra : le geste qui écrase trente bulletins avait le poids de
   celui qui en ouvre un. */
.lkq{font-size:11.5px;color:var(--muet);text-decoration:none;background:none;border:0;
  padding:2px 0;cursor:pointer;font-family:var(--f-ui);flex:none;white-space:nowrap}
.lkq + .lkq{margin-left:10px;padding-left:10px;border-left:1px solid var(--ligne)}
.lkq:hover{color:var(--terra-h);text-decoration:underline}

/* La nature d'un document et sa destination. Le rangement se règle
   ici, une fois pour toutes les pièces de cette nature — pas ligne
   par ligne : trente-deux fois le même choix n'est plus un choix. */
.docrow.bultyp .d1{font-size:13px}
.docrow.bultyp.off{opacity:1;background:var(--surface-2)}
.docrow.bultyp.off .d1,.docrow.bultyp.off .d2{color:var(--muet)}
.bulrang{width:auto;min-width:180px;padding-top:6px;padding-bottom:6px;font-size:12px;flex:none}

/* La barre de départ colle en bas : sur trente-huit bulletins, le
   bouton qui distribue ne doit pas être à quatre écrans de la ligne
   qu'on vient de régler. */
.bulbar{position:sticky;bottom:0;z-index:20;display:flex;align-items:center;gap:14px;
  flex-wrap:wrap;margin-top:14px;padding:13px 18px;background:var(--carte);
  border:1px solid var(--ligne);border-radius:14px;box-shadow:var(--ombre-2)}
.bulbar b{display:block;font-size:14px;font-family:var(--f-titre)}
.bulbar span{display:block;font-size:11.5px;color:var(--muet);margin-top:2px}
.bulbar .rr{margin-left:auto;display:flex;gap:9px}

/* Les fichiers déposés, sous la zone. La zone dit combien et combien
   ça pèse ; la liste dit lesquels — on a souvent déposé le mauvais
   mois, et le nom du fichier est le seul endroit où ça se voit. */
.bulfl{margin-top:9px;border:1px solid var(--ligne);border-radius:9px;overflow:hidden}
.bulfl>div{display:flex;align-items:center;gap:10px;padding:7px 12px;font-size:12px;
  border-bottom:1px solid var(--surface-2)}
.bulfl>div:last-child{border-bottom:none}
.bulfl span{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.bulfl i{font-style:normal;font-size:11px;color:var(--muet);flex:none}

@media (max-width:860px){
  .docrow.dbl,.docrow.orph{flex-wrap:wrap}
  .segr{margin-left:auto}
  .bulbar .rr{width:100%;margin-left:0}
}

/* ═══ v11.47 · LE GROUPE D'UN CONTRAT DANS UN RAYON ═══

   Un intertitre, pas un rayon. Il porte le liseré de son rayon (--cc,
   posé par le bloc ouvert) : le groupe appartient au rangement, il ne
   le remplace pas. Un carreau de plus dans la grille aurait dit
   l'inverse. */
.clgrp{display:flex;align-items:center;gap:10px;flex-wrap:wrap;
  padding:9px 18px;background:var(--surface-2);
  border-top:1px solid var(--ligne);border-bottom:1px solid var(--ligne);
  box-shadow:inset 3px 0 0 var(--cc,var(--muet))}
.clgrp b{font-size:12.5px;color:var(--encre)}
.clgrp .meta{font-size:11px;color:var(--muet)}
.clgrp.horscontrat{box-shadow:none;background:var(--carte)}
.clgrp.horscontrat b{color:var(--muet);font-weight:600}

/* ═══ v11.46 · PATIENTER, ET DIRE CE QU'ON ATTEND ═══

   Le découpage de quarante bulletins prend une dizaine de secondes.
   Sans rien à l'écran, on clique une deuxième fois — et on relance
   l'analyse en doublant l'attente.

   ── POURQUOI UNE BARRE INDÉTERMINÉE ──

   Une barre qui progresse de 0 à 100 % serait un mensonge : le serveur
   ne rend rien avant d'avoir fini, personne ne sait où il en est. La
   barre indéterminée dit la seule chose qu'on sache — « ça travaille
   encore » — et c'est justement l'information qui manque.

   Le TEXTE, lui, est précis : ce qu'on traite et combien. « Analyse en
   cours » tout seul ne dit pas si l'on a bien envoyé les trois
   fichiers. */
/* La barre indéterminée « .chg » est retirée (v14.7.1) : elle disait
   « ça travaille » comme le rond de .charge, avec un troisième jeu de
   classes. uiPatienter() garde son nom et son API, et rend du
   .charge — les trois écrans qui l'appellent n'ont pas bougé. */

/* Le détail d'une confirmation : ce qui part, ce qui ne part pas. Une
   phrase unique les mélangerait, et c'est exactement ce qu'on demande
   de distinguer avant de cliquer. */
.uimlig{margin-top:11px;border:1px solid var(--ligne);border-radius:9px;overflow:hidden}
.uimlig>div{display:flex;align-items:center;gap:10px;padding:8px 12px;font-size:12.5px;
  border-bottom:1px solid var(--surface-2)}
.uimlig>div:last-child{border-bottom:none}
.uimlig b{flex:none;min-width:26px;font-family:var(--f-titre);font-size:15px}
.uimlig .p{color:var(--vert)} .uimlig .m{color:var(--rouge)}

/* ═══ v11.48 · L'EXCEPTION DE VISIBILITÉ D'UNE PIÈCE ═══

   L'interrupteur vit DANS la ligne, comme celui d'un rayon (v11.34) :
   un réglage qu'on change souvent ne mérite pas d'ouvrir un tiroir.

   ── L'ÉCART SE MARQUE, L'ACCORD NE DIT RIEN ──

   Une pièce qui suit son rayon n'a rien à annoncer : son interrupteur
   est neutre. Une pièce qui le CONTREDIT porte un liseré et une
   mention — une exception qui ne se voit pas est une fuite qui attend
   son heure. Même principe que .rperm.ecart pour les autorisations. */
.dvi{display:flex;align-items:center;gap:7px;flex:none}
.dvi.ecart{padding:3px 8px 3px 7px;border-radius:8px;
  background:var(--jaune-pale);box-shadow:inset 2px 0 0 var(--jaune)}
.dvix{font-size:10.5px;font-weight:600;color:var(--jaune-txt);white-space:nowrap}
@media (max-width:860px){ .dvix{display:none} }

/* ═══ v11.51 · LA SIGNATURE ÉLECTRONIQUE ═══

   ── LE PLEIN ÉCRAN N'EST PAS UN EFFET ──

   Placer un champ de signature demande de VOIR la page. Un panneau
   latéral sur un écran qui garde son rail, son bandeau et son fil
   d'Ariane laisse au document une colonne où l'on ne lit rien — et on
   pose alors les cadres au jugé, ce qui donne une signature sur le
   paragraphe d'au-dessus.

   ── LA COUCHE : 100, PAS 400 ──

   Un plein écran est une couche de PAGE, pas la couche du dessus. À
   400 il passait au-dessus des modales (220) et des tiroirs (180) :
   « Ajouter un document » s'ouvrait DERRIÈRE lui — invisible,
   incliquable — et on croyait le bouton mort. La confirmation d'envoi
   subissait exactement le même sort.

   À 100 il couvre le rail (60), ses panneaux volants (59) et le
   bandeau, et laisse passer ce qui doit passer par-dessus : les
   notifications (120), les tiroirs, les modales, les sélecteurs de
   date (340). */
.sgfull{position:fixed;inset:0;z-index:100;background:var(--fond);display:flex;
  flex-direction:column}
.sgtop{display:flex;align-items:center;gap:12px;padding:12px 20px;background:var(--carte);
  border-bottom:1px solid var(--ligne);flex:none}
/* La barre d'attente a SON emplacement. Faire patienter sur le
   conteneur des boutons en remplaçait le contenu : les boutons
   revenaient sans leurs écouteurs, et le second clic ne faisait plus
   rien. C'est ce qui rendait « Envoyer en signature » muet. */
.sgbar{flex:none;width:190px}
.sgbar:empty{display:none}
.sgtop h2{font-family:var(--f-titre);font-size:17px;margin:0}
.sgtop .de{font-size:11px;color:var(--muet);font-weight:600}
.sgetape{font-size:11.5px;color:var(--muet);text-align:right;margin-right:8px}
.sgetape b{display:block;font-family:var(--f-titre);font-size:18px;color:var(--encre)}

/* Trois colonnes, trois questions : QUOI · OÙ · QUI. */
.sgbody{flex:1;min-height:0;display:grid;grid-template-columns:290px minmax(0,1fr) 380px}
.sgbody2{grid-template-columns:minmax(0,1fr) 380px}
.sgcol{border-right:1px solid var(--ligne);background:var(--carte);padding:16px;overflow-y:auto}
.sgpan{border-left:1px solid var(--ligne);background:var(--carte);padding:16px;overflow-y:auto}
.sgcolh{font-size:11px;font-weight:700;letter-spacing:.04em;text-transform:uppercase;
  color:var(--muet);margin-bottom:9px}
.sgcadre{width:100%;height:100%;border:0;background:var(--carte)}

/* ── LES PAGES ──
   De vraies pages, rendues depuis le PDF qui partira. L'image donne sa
   hauteur au cadre : une page paysage n'est pas une page A4, et lui
   imposer un rapport de 1/1,414 décalerait tous les champs. */
.sgpages{overflow-y:auto;padding:22px;background:var(--surface-2)}
.sgpg{position:relative;background:#fff;box-shadow:var(--ombre-2);border-radius:3px;
  width:100%;max-width:620px;margin:0 auto 18px;cursor:crosshair}
.sgimg{display:block;width:100%;border-radius:3px;user-select:none}
.sgpgh{max-width:620px;margin:0 auto 6px;font-family:var(--f-titre);font-size:11.5px;
  color:var(--encre-2)}
.pnum{position:absolute;right:10px;bottom:8px;font-size:9px;color:var(--muet);
  background:rgba(255,255,255,.85);border-radius:4px;padding:1px 5px}

/* ── UN CHAMP POSÉ ──
   La couleur est celle de son SIGNATAIRE, et elle suit le RANG : le
   premier signataire garde la même teinte d'une enveloppe à l'autre.
   Sans couleur par personne, un document à deux parties devient
   illisible dès le troisième champ — et « qui signe où » est
   justement la question qu'on se pose devant cet écran. */
.sgch{position:absolute;border:1.5px dashed var(--sc);background:var(--sp);border-radius:5px;
  padding:4px 6px;cursor:grab;display:flex;flex-direction:column;justify-content:center;
  overflow:hidden}
.sgch b{font-size:9px;color:var(--sc);font-family:var(--f-ui);line-height:1.25}
.sgch span{font-size:8px;color:var(--muet);line-height:1.3}
.sgch.sel{border-style:solid;box-shadow:0 0 0 3px var(--sp),0 0 0 4px var(--sc)}
.sgch.drag{cursor:grabbing;opacity:.85}
/* Le coin qui redimensionne. Un cadre de signature imposé est un cadre
   qui tombe sur le texte : la taille appartient au document. */
.sgpoi{position:absolute;right:-4px;bottom:-4px;width:11px;height:11px;border-radius:3px;
  background:var(--sc);border:2px solid #fff;cursor:nwse-resize;display:none}
.sgch.sel .sgpoi,.sgch:hover .sgpoi{display:block}

/* ── LA BOÎTE À OUTILS ── */
.sgqui{display:flex;flex-direction:column;gap:6px;margin-bottom:11px}
.sgquib{display:flex;align-items:center;gap:8px;padding:8px 11px;border-radius:9px;
  border:1.5px solid var(--ligne);background:var(--carte);cursor:pointer;
  font-family:var(--f-ui);font-size:12.5px;font-weight:600;color:var(--encre-2);text-align:left}
.sgquib i{width:11px;height:11px;border-radius:3px;background:var(--sc);flex:none}
.sgquib.on{border-color:var(--sc);background:var(--sp);color:var(--encre)}
.sgouts,.sgtailles{display:flex;flex-wrap:wrap;gap:6px}
.sgout{padding:7px 12px;border-radius:8px;border:1px solid var(--ligne);background:var(--carte);
  font-family:var(--f-ui);font-size:12px;font-weight:600;color:var(--muet);cursor:pointer}
.sgout.on{border-color:var(--terra);background:var(--terra-pale);color:var(--terra-h)}

/* ── LES DOCUMENTS ET LES SIGNATAIRES ── */
.sgdoc,.sgsig{display:flex;align-items:center;gap:9px;padding:9px 11px;
  border:1px solid var(--ligne);border-radius:10px;background:var(--carte);margin-bottom:7px}
.sgsig{box-shadow:inset 3px 0 0 var(--sc)}
.sgdoc .d1,.sgsig .d1{font-size:12px;font-weight:600;line-height:1.3}
.sgdoc .d2,.sgsig .d2{font-size:10.5px;color:var(--muet);line-height:1.35}
.sgdoc .sgord{flex:none;width:19px;height:19px;border-radius:6px;background:var(--surface-2);
  font-size:10px;font-weight:700;color:var(--muet);display:flex;align-items:center;
  justify-content:center}
.sgsig .sgord{flex:none;width:20px;height:20px;border-radius:50%;background:var(--sc);color:#fff;
  font-size:10.5px;font-weight:700;display:flex;align-items:center;justify-content:center}
.sgord.para{background:var(--surface-2);color:var(--muet)}
.sgrole{font-size:9.5px;font-weight:700;letter-spacing:.03em;text-transform:uppercase;
  color:var(--muet);flex:none}
.sgconv{color:var(--vert)}
.sgdocact{display:flex;align-items:center;gap:6px;flex:none}
.sgdocact .lkq{padding:2px 5px;border-radius:5px}
.sgdocact .lkq:disabled{opacity:.3;cursor:default}
.sgdocact .lkq+.lkq{margin-left:0;padding-left:5px;border-left:none}
.sgadd{border:1.5px dashed var(--ligne);border-radius:10px;background:none;padding:8px 11px;
  width:100%;text-align:left;font-family:var(--f-ui);font-size:12px;color:var(--muet);cursor:pointer}
.sgadd:hover{border-color:var(--terra);color:var(--terra-h)}

/* ── L'ÉTAT D'UNE ENVELOPPE ──
   Quatre teintes seulement : ce qui attend, ce qui a été ouvert, ce
   qui est fait, ce qui ne se fera pas. */
.sgetat{font-size:10.5px;font-weight:700;letter-spacing:.03em;text-transform:uppercase;
  padding:3px 9px;border-radius:20px;white-space:nowrap;flex:none;
  background:var(--surface-2);color:var(--muet)}
.sgetat.envoye{background:var(--jaune-pale);color:var(--jaune-txt)}
.sgetat.vu{background:#EDF0F7;color:var(--bleu-fonce)}
.sgetat.signe{background:var(--vert-pale);color:var(--vert)}
.sgetat.refuse{background:var(--rouge-pale);color:var(--rouge)}

/* Sous 1200 px la colonne des documents s'efface : entre voir la page
   et voir la liste, c'est la page qui décide de la qualité du travail. */
@media (max-width:1200px){
  .sgbody{grid-template-columns:minmax(0,1fr) 340px}
  .sgcol{display:none}
}

/* Le journal des échanges, lu à l'écran plutôt qu'en SSH (v11.51).
   Chasse fixe et défilement horizontal : une ligne de journal ne se
   replie pas sans devenir illisible. */
.sgdiag{margin-top:10px;padding:11px 13px;border-radius:9px;background:var(--surface-2);
  border:1px solid var(--ligne);font-family:ui-monospace,SFMono-Regular,Menlo,monospace;
  font-size:11px;line-height:1.7;color:var(--encre-2);white-space:pre;overflow-x:auto}


/* ═══ v11.52 · ALLÉGER ═══

   Le panneau de droite faisait QUATRE choses : les signataires, les
   outils, les réglages du champ choisi, et la destination du signé.
   Quatre sujets dans 380 pixels, séparés par quinze lignes d'aide.

   Il n'en fait plus que deux — QUI et QUOI — parce que ce sont les
   deux entre lesquels on fait l'aller-retour en posant des champs.
   Les réglages du champ suivent le CHAMP, et la destination tient
   sur une ligne. */

/* ── LA BARRE DU HAUT ──
   Le fil d'Ariane disait déjà où l'on est : le titre n'a pas à le
   répéter. Reste ce qu'on ne sait pas — pour qui, et combien. */
.sgtop{padding:10px 18px;gap:10px}
.sgtop h2{font-size:15.5px}
.sgtop .de{font-size:10.5px}
.sgetape{margin-right:4px}
.sgetape b{font-size:16px}

/* Ce qui manque avant d'envoyer : UNE ligne, à côté du bouton qu'elle
   empêche. Un pavé d'alerte à l'autre bout de l'écran se lit une fois
   puis devient du décor. */
.sgstop{display:flex;align-items:center;gap:7px;font-size:11.5px;color:var(--rouge);
  max-width:380px;min-width:0;flex:none;line-height:1.35}
.sgstop i{width:7px;height:7px;border-radius:50%;background:var(--rouge);flex:none}
/* UNE ligne : deux lignes de rouge poussent le compte et les boutons,
   et la barre du haut se met à sauter selon ce qui manque. */
.sgstop span{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}

/* ── LES COLONNES ──
   Un titre de section, et rien dessous. L'aide qui reste tient sur
   une ligne et ne se répète jamais. */
.sgcol,.sgpan{padding:14px}
.sgcolh{display:flex;align-items:center;gap:8px;font-size:10.5px;margin-bottom:8px}
.sgcolh span{font-weight:400;text-transform:none;letter-spacing:0;color:var(--muet);
  font-size:11px}
.sgcolh .rr{margin-left:auto;display:flex;gap:4px}

/* ── UN DOCUMENT ──
   Les gestes n'apparaissent qu'au survol : trois boutons visibles en
   permanence sur chaque ligne font une colonne de boutons, pas une
   liste de documents. */
.sgdoc{padding:7px 9px;margin-bottom:5px;gap:8px}
.sgdoc .d2{font-size:10px}

/* ── LES GESTES NE PRENNENT PAS LA PLACE DU NOM ──          (v11.52)
   Cachés par `opacity:0`, les trois boutons occupaient quand même
   leur largeur : « Son responsable hiérarchique » se lisait « Son
   responsable hiérar… » sur une ligne à moitié vide. Posés PAR-DESSUS
   la ligne, ils ne coûtent rien tant qu'on ne survole pas — et le nom
   ne saute pas quand on survole. */
.sgdoc,.sgsig{position:relative}
.sgdoc .sgdocact,.sgsig .sgdocact{position:absolute;right:8px;top:50%;
  transform:translateY(-50%);padding-left:14px;background:var(--carte);
  opacity:0;transition:opacity .12s}
.sgdoc:hover .sgdocact,.sgdoc:focus-within .sgdocact{opacity:1}
.sgadd{padding:7px 10px;font-size:11.5px}

/* ── UN SIGNATAIRE ──
   Dense. Le rôle est une pastille, l'adresse ne s'affiche QUE si elle
   manque — une valeur normale n'a rien à dire.

   ── ET C'EST LUI, LE SÉLECTEUR ──

   Le panneau listait les mêmes trois personnes DEUX fois : une fois
   pour dire qui signe, une fois pour choisir pour qui l'on pose. La
   liste fait les deux : on clique la personne, puis l'outil, puis la
   page — c'est le geste, dans l'ordre où on le fait. */
.sgsig{padding:7px 9px;margin-bottom:5px;gap:8px;cursor:pointer}
.sgsig.on{background:var(--sp);border-color:var(--sc)}
.sgsig.on .d1{color:var(--encre)}
.sgsig .d1{font-size:12px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.sgsig .d2{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.sgsig:hover .sgdocact,.sgsig:focus-within .sgdocact{opacity:1}
.sgsig.on .sgdocact{background:var(--sp)}
.sgmanque{color:var(--rouge);font-weight:700}

/* ═══ v11.53 · LE DOCUMENT DÉCLARE ═══

   Le catalogue de « parcours de signature » est retiré. Trois endroits
   disaient qui signe — le parcours, le modèle, le document — et ils se
   contredisaient. Reste ce que le document dit de lui-même : ses
   étiquettes de bas de page. */

/* ── OÙ LE SIGNÉ IRA ──
   Une ligne au bas du panneau, pas un pavé : la destination se décide
   une fois et ne se relit pas. (Emportée par erreur avec le bloc des
   parcours ; elle n'avait rien à voir avec eux.) */
.sgdest{margin-top:auto;padding-top:12px;border-top:1px solid var(--ligne);
  font-size:11.5px;color:var(--encre-2);line-height:1.7}
.sgdest select{width:auto;max-width:100%;border:none;background:var(--surface-2);
  border-radius:6px;padding:2px 22px 2px 7px;font-family:var(--f-ui);font-size:11.5px;
  font-weight:600;color:var(--encre);height:auto}

/* ── CE QUE LE DOCUMENT A DIT ──
   Une ligne en tête des signataires : d'où vient cette liste. Sans
   elle, on croirait que l'application a deviné — et on ne saurait pas
   où aller corriger. */
.sglu{display:flex;align-items:center;gap:8px;padding:8px 10px;border-radius:9px;
  background:var(--surface-2);border:1px solid var(--ligne);margin-bottom:9px;
  font-size:11.5px;color:var(--encre-2);line-height:1.35}
.sglu b{font-weight:600;color:var(--encre)}
.sglu .lkq{margin-left:auto;flex:none}
.sglu.muet{background:var(--jaune-pale);border-color:#EFDFB8;color:var(--jaune-txt)}

/* ── UN SIGNATAIRE PAS ENCORE DÉSIGNÉ ──
   L'étiquette est là, la personne non. La ligne garde sa place ET son
   rang : elle EXISTE, elle est seulement incomplète. Un emplacement
   vide qu'on cacherait ferait partir un contrat avec une personne de
   moins — et on le découvrirait en le relisant. */
.sgsig.sgnul{box-shadow:inset 3px 0 0 var(--ligne-2);border-style:dashed;
  background:var(--surface-2);cursor:default}
.sgsig.sgnul .sgord{background:var(--carte);color:var(--muet);
  box-shadow:inset 0 0 0 1.5px var(--ligne-2)}
.sgsig.sgnul .d1{color:var(--muet);font-weight:500;font-style:italic}
.sgsig.sgnul .d2{color:var(--encre-2)}
.sgsig.sgnul .d2 b{color:var(--encre);font-weight:600}
.sgdes{flex:none;padding:4px 10px;border-radius:7px;border:1px solid var(--terra);
  background:var(--terra-pale);color:var(--terra-h);font-family:var(--f-ui);
  font-size:11.5px;font-weight:600;cursor:pointer}
.sgdes:hover{background:var(--terra);color:#fff}

/* ── LA FENÊTRE DE DÉSIGNATION ──
   « L'employeur, c'est qui ? » se pose une fois par emplacement. Les
   gens du compte d'abord — ils ont déjà une adresse —, les salariés
   ensuite, et une saisie libre pour celui qui n'est ni l'un ni l'autre.

   La liste EST le geste : on clique la personne, c'est désigné. Pas de
   « choisir » puis « valider » pour une question à une réponse. */
.dsgrp{font-size:10.5px;font-weight:700;letter-spacing:.03em;text-transform:uppercase;
  color:var(--muet);margin:14px 0 6px}
.dsgrp:first-child{margin-top:0}
.dspers{display:flex;align-items:center;gap:10px;padding:8px 10px;border-radius:9px;
  border:1px solid transparent;cursor:pointer}
.dspers:hover{background:var(--surface-2);border-color:var(--ligne)}
.dspers .av{flex:none;width:28px;height:28px;border-radius:50%;background:var(--surface-2);
  border:1px solid var(--ligne);display:flex;align-items:center;justify-content:center;
  font-size:11px;font-weight:700;color:var(--encre-2)}
.dspers .n{font-size:12.5px;font-weight:600;line-height:1.3}
.dspers .m{font-size:10.5px;color:var(--muet)}
.dspers .q{margin-left:auto;font-size:10.5px;color:var(--muet);flex:none}

/* ── LE LOT ──
   Ce qui reste du parcours : un nom et une liste de modèles. Rien
   d'autre — le document dit déjà qui signe, où, et dans quel ordre,
   donc un lot ne peut contredire personne.

   Et il naît de l'usage : on coche, on garde la sélection sous un nom.
   Le catalogue de la v11.52 demandait de concevoir à l'avance, dans un
   écran de réglages, ce qu'on ne découvre qu'en travaillant — c'est
   pour ça qu'il est resté vide. */
.lotbar{display:flex;flex-wrap:wrap;align-items:center;gap:6px;margin-bottom:10px}
.lot{position:relative;display:inline-flex;align-items:center;gap:6px;padding:5px 10px;
  border-radius:20px;border:1px solid var(--ligne);background:var(--carte);
  font-family:var(--f-ui);font-size:11.5px;font-weight:600;color:var(--encre-2);
  cursor:pointer;white-space:nowrap}
.lot:hover{border-color:var(--ligne-2);background:var(--surface-2)}
.lot.on{border-color:var(--terra);background:var(--terra-pale);color:var(--terra-h)}
.lot .lotn{font-weight:400;color:var(--muet);font-size:10.5px}
.lot.on .lotn{color:var(--terra-h);opacity:.75}
.lotx{margin-left:2px;width:15px;height:15px;border-radius:50%;border:none;background:none;
  color:var(--muet);font-size:12px;line-height:1;cursor:pointer;opacity:0;flex:none}
.lot:hover .lotx{opacity:1}
.lotx:hover{background:var(--rouge-pale);color:var(--rouge)}

/* ── NAVIGUER DANS L'ENVELOPPE ──                          (v11.52)
   Les pages défilaient d'un bout à l'autre, tous documents confondus :
   pour atteindre la page 7 d'une enveloppe qui en compte douze, on
   faisait rouler la molette en espérant. Un bandeau les donne toutes,
   groupées par document, et dit lesquelles portent des champs. */
.sgnav{position:sticky;top:0;z-index:8;display:flex;align-items:center;gap:16px;
  flex-wrap:wrap;padding:9px 22px;background:var(--surface-2);
  border-bottom:1px solid var(--ligne);margin:-22px -22px 18px}
.sgnavd{display:flex;align-items:center;gap:6px;min-width:0}
.sgnavd>b{font-size:10.5px;font-weight:700;color:var(--muet);text-transform:uppercase;
  letter-spacing:.03em;white-space:nowrap;max-width:190px;overflow:hidden;
  text-overflow:ellipsis}
.sgpuce{position:relative;width:24px;height:24px;border-radius:7px;border:1px solid var(--ligne);
  background:var(--carte);font-family:var(--f-ui);font-size:11px;font-weight:700;
  color:var(--muet);cursor:pointer;flex:none}
.sgpuce.on{border-color:var(--terra);background:var(--terra-pale);color:var(--terra-h)}
.sgpuce i{position:absolute;right:-2px;top:-2px;width:7px;height:7px;border-radius:50%;
  background:var(--terra);border:1.5px solid var(--carte)}

/* ═══ LE SUIVI ═══

   La question n'est pas « quel est l'état ? » — la pastille le dit.
   C'est « qui a signé, quand, et qui attend-on ». Deux blocs : les
   gens, puis ce qui s'est passé. */
.sgsuiv{display:flex;align-items:center;gap:10px;padding:9px 0;
  border-bottom:1px solid var(--surface-2)}
.sgsuiv:last-child{border-bottom:none}
.sgrang{flex:none;width:22px;height:22px;border-radius:50%;display:flex;align-items:center;
  justify-content:center;font-size:10.5px;font-weight:700;background:var(--sc);color:#fff}
.sgrang.att{background:var(--surface-2);color:var(--muet);
  box-shadow:inset 0 0 0 1.5px var(--ligne)}
.sgqui2{flex:1;min-width:0}
.sgqui2 .n{font-size:12.5px;font-weight:600;line-height:1.35}
.sgqui2 .q{font-size:10.5px;color:var(--muet)}
.sgquand{font-size:11.5px;text-align:right;line-height:1.4;flex:none}
.sgquand b{display:block;font-weight:600}
.sgquand.fait b{color:var(--vert)}
.sgquand.tour b{color:var(--jaune-txt)}
.sgquand.rien{color:var(--muet)}
.sgquand small{color:var(--muet);font-size:10.5px}

/* La chronologie : un filet, des points, des heures. */
.sgchrono{position:relative;margin-top:4px;padding-left:20px}
.sgchrono:before{content:'';position:absolute;left:5px;top:6px;bottom:6px;width:1.5px;
  background:var(--ligne)}
.sgevt{position:relative;padding:6px 0;font-size:12px;line-height:1.5}
.sgevt:before{content:'';position:absolute;left:-19px;top:11px;width:9px;height:9px;
  border-radius:50%;background:var(--carte);box-shadow:inset 0 0 0 2px var(--ligne)}
.sgevt.fort:before{background:var(--vert);box-shadow:none}
.sgevt time{display:block;font-size:10.5px;color:var(--muet)}

/* ── LE PARCOURS, D'UN COUP D'ŒIL ──
   Trois lignes empilées disaient l'état de trois personnes ; elles ne
   disaient pas le CHEMIN. Un parcours est une suite : il se dessine
   comme une suite, et la question « où en est-on » se lit sans lire. */
.sgstep{display:flex;margin:6px 0 4px}
.sgetp{flex:1;position:relative;padding:26px 6px 0;text-align:center;min-width:0}
.sgetp:before{content:'';position:absolute;top:9px;left:0;right:50%;height:2px;
  background:var(--ligne)}
.sgetp:after{content:'';position:absolute;top:9px;left:50%;right:0;height:2px;
  background:var(--ligne)}
.sgetp:first-child:before,.sgetp:last-child:after{display:none}
.sgetp.fait:before,.sgetp.fait:after,.sgetp.tour:before{background:var(--vert)}
.sgetp .pt{position:absolute;top:0;left:50%;transform:translateX(-50%);width:20px;height:20px;
  border-radius:50%;background:var(--carte);border:2px solid var(--ligne);z-index:1;
  display:flex;align-items:center;justify-content:center;font-size:10px;font-weight:700;
  color:var(--muet)}
.sgetp.fait .pt{background:var(--vert);border-color:var(--vert);color:#fff}
.sgetp.tour .pt{border-color:var(--jaune);color:var(--jaune-txt);
  box-shadow:0 0 0 4px var(--jaune-pale)}
.sgetp .n{font-size:12px;font-weight:600;line-height:1.35;overflow:hidden;
  text-overflow:ellipsis;white-space:nowrap}
.sgetp .q{font-size:10.5px;color:var(--muet)}
.sgetp .e{font-size:11px;margin-top:3px;font-weight:600}
.sgetp.fait .e{color:var(--vert)}
.sgetp.tour .e{color:var(--jaune-txt)}
.sgetp.rien .e{color:var(--muet);font-weight:400}
.sgetp.refus:before,.sgetp.refus:after{background:var(--rouge)}
.sgetp.refus .pt{background:var(--rouge);border-color:var(--rouge);color:#fff}
.sgetp.refus .e{color:var(--rouge)}
.sgetp .e small{display:block;font-weight:400;color:var(--muet);font-size:10.5px}

/* ── ET TROIS RANGS D'ACTIONS ──                            (v11.52)
   Le plein occupe la largeur : c'est ce qu'on vient faire. Les creux
   se rangent côte à côte, plus petits. Le rouge est en bas, seul, et
   jamais collé au bouton d'à côté — « Annuler l'enveloppe » ne doit
   pas se cliquer à la place de « Relancer ». */
.sgcta{display:flex;flex-wrap:wrap;gap:7px}
.sgcta>*{flex:0 0 auto}

/* Les chiffres qui répondent avant qu'on lise : combien signé, depuis
   quand, jusqu'à quand. */
.sgcles{display:flex;gap:22px;padding:11px 0 13px;border-bottom:1px solid var(--ligne);
  margin-bottom:14px}
.sgcle .v{font-family:var(--f-titre);font-size:19px;line-height:1.15}
.sgcle .l{font-size:10.5px;color:var(--muet);text-transform:uppercase;letter-spacing:.03em}
.sgcle.urg .v{color:var(--jaune-txt)}

/* ═══ L'ATTENTE ═══
   Un Word converti en PDF prend cinq à quinze secondes. Sans rien à
   l'écran, on reclique — et on envoie deux fois. */
.sgwait{display:flex;align-items:center;gap:11px;padding:13px 15px;border-radius:11px;
  background:var(--surface-2);border:1px solid var(--ligne);margin-top:10px}
.sgwait .t{flex:1;font-size:12.5px;font-weight:600}
.sgwait .t small{display:block;font-weight:400;color:var(--muet);font-size:11px;margin-top:2px}
/* ── ON ATTEND, ET C'EST TOUT ──                            (v11.53)
   Un écran d'attente est un écran ENTIER, pas un coin d'un écran qu'on
   prétend utilisable. On affichait la préparation à moitié construite
   pendant que les documents se généraient : trois colonnes qui se
   remplissaient sous les yeux, des boutons grisés, une page qui
   apparaissait. On croyait l'écran cassé, et on rechargeait. */
.sgattente{flex:1;min-height:0;display:flex;align-items:center;justify-content:center;
  background:var(--surface-2)}
.sgatc{max-width:420px;text-align:center;padding:34px 30px;border-radius:16px;
  background:var(--carte);border:1px solid var(--ligne);box-shadow:var(--ombre-2)}
.sgatc .chargeb{margin:0 auto 16px}
.sgatc .t{font-family:var(--f-titre);font-size:17px;color:var(--encre)}
.sgatc .s{font-size:12.5px;color:var(--encre-2);margin-top:4px}
.sgatc .q{font-size:11.5px;color:var(--muet);line-height:1.5;margin-top:14px}
.chargeb.gros{width:30px;height:30px;border-width:3px;display:block}

/* La jauge dit ce qu'un compte ne dit pas : combien il reste. Cinq à
   quinze secondes par document — sans elle, on se demande si quelque
   chose tourne encore. */
.chargejauge{height:5px;border-radius:3px;background:var(--surface-2);overflow:hidden;
  margin-top:16px}
.chargejauge i{display:block;height:100%;border-radius:3px;background:var(--terra);
  transition:width .3s}

/* Le rond de la signature était le même que celui du chargement, sous
   un autre nom (v14.7.1) : c'est .chargeb, partout. */

/* ═══ v11.54 · LES TROIS NATURES D'ENVOI ═══

   « Faire signer » recouvrait trois gestes très différents :

   · UN SALARIÉ, un ou plusieurs documents. Le cas courant.
   · PLUSIEURS SALARIÉS, les mêmes documents — vingt contrats
     saisonniers. Chacun reçoit LE SIEN : le contrat est généré pour
     lui, donc vingt enveloppes.
   · UN DOCUMENT, plusieurs signataires. Un accord, un procès-verbal :
     un seul PDF, toutes les signatures dedans, une seule enveloppe.

   Trois cartes, pas un menu déroulant : ce sont trois GESTES, pas trois
   réglages, et on doit voir les trois avant de choisir. Un menu en
   cacherait deux sur trois, et le geste qu'on ne voit pas est un geste
   qui n'existe pas. */
.nat{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:9px;margin-bottom:16px}
.natc{text-align:left;padding:13px 14px;border-radius:12px;border:1px solid var(--ligne);
  background:var(--carte);cursor:pointer;font-family:var(--f-ui);display:flex;
  flex-direction:column;gap:5px}
.natc:hover{border-color:var(--ligne-2);background:var(--surface-2)}
.natc.on{border-color:var(--terra);background:var(--terra-pale);box-shadow:0 0 0 1px var(--terra)}
.natc .natn{font-size:12.5px;font-weight:700;color:var(--encre);line-height:1.3}
.natc.on .natn{color:var(--terra-h)}
.natc .natx{font-size:10.5px;color:var(--muet);line-height:1.45}
@media (max-width:640px){.nat{grid-template-columns:minmax(0,1fr)}}

/* ── UN DÉROULANT QUI PREND PLUSIEURS RÉPONSES ──
   Le kit avait déjà un déroulant avec recherche (.selr, v7.30) : pays,
   départements. Il ne prenait qu'UNE réponse.

   On n'en refait pas un second : .selrm se greffe sur le même, et le
   panneau, la recherche et les flèches du clavier restent ceux qu'on
   connaît. Une liste à cocher de trente salariés poussait « Continuer »
   hors de l'écran et obligeait à faire défiler pour savoir ce qu'on
   avait choisi ; un déroulant tient sur une ligne, et ce qui est choisi
   reste visible en jetons.

   Et ses lignes portent une pastille d'identité : vingt lignes de texte
   se relisent trois fois, vingt visages se balaient d'un coup d'œil. */
.selrm .selrb{flex-wrap:wrap;align-items:center;gap:5px;padding:6px 34px 6px 7px;
  position:relative;min-height:40px}
.selrm .selrb .car{position:absolute;right:11px;top:50%;transform:translateY(-50%)}
.selrm .selrb .lbl{flex:1 1 auto;display:flex;flex-wrap:wrap;gap:5px;white-space:normal;
  overflow:visible;min-width:60px}
.selrm .selrb.vide .lbl{display:block;padding:3px 4px}
.selrj{display:inline-flex;align-items:center;gap:6px;padding:3px 6px 3px 3px;
  border-radius:20px;background:var(--surface-2);border:1px solid var(--ligne);
  font-size:12px;color:var(--encre);max-width:100%}
.selrj .av-m{width:22px;height:22px;font-size:9px}
.selrj .nm{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.selrx{flex:none;width:15px;height:15px;border-radius:50%;display:flex;align-items:center;
  justify-content:center;color:var(--muet);font-size:10px;font-style:normal;font-weight:700;
  cursor:pointer}
.selrx:hover{background:var(--rouge-pale);color:var(--rouge)}
.selrt{display:flex;align-items:center;justify-content:space-between;gap:10px;
  padding:6px 13px;border-bottom:1px solid var(--ligne);font-size:11.5px;color:var(--muet)}
.selrq{flex:1;min-width:0}
.selro .selrq .r1,.selro .selrq .r2{display:block;white-space:nowrap;overflow:hidden;
  text-overflow:ellipsis}
.selro .selrq .r1{font-size:12.5px;font-weight:500}
.selro.sel .selrq .r1{font-weight:600}
.selro .selrq .r2{font-size:11px;margin-top:1px}
.selrm .selrl{max-height:236px}
.selrn{display:flex;align-items:center;justify-content:space-between;gap:10px;
  font-size:11.5px;color:var(--muet);margin-top:7px}
.selrn b{color:var(--encre);font-weight:600}

/* ── UNE PRÉPARATION QUI VAUT POUR TOUT LE MONDE ──
   Préparer vingt enveloppes identiques à la main serait absurde, et
   désigner vingt fois l'employeur encore plus. On prépare la PREMIÈRE,
   et le bandeau dit que ce qu'on fait là vaut pour les autres — sans
   quoi « Envoyer aux 4 » serait une surprise. */
.sglu.sgpour{background:var(--terra-pale);border-color:#F3CDBE;color:var(--terra-h)}
.sglu.sgpour b{color:var(--terra-h)}

/* ═══ v11.55 · MODULER ET LISSER NE SONT PAS LA MÊME CHOSE ═══

   Le lissage était une CASE À COCHER dans la modulation : on ne
   pouvait donc pas lisser sans moduler, alors que lisser les semaines
   d'un CDI à 35 h ne demande aucun accord d'entreprise.

   Deux cartes, comme les natures d'envoi de la v11.54 : ce sont deux
   régimes exclusifs, pas un régime et une option. Et le choix change
   la FORME de l'écran — une période lissée n'a ni volume, ni plafond,
   ni plancher : oui ou non, et c'est tout. */
.nat.nat2{grid-template-columns:repeat(2,minmax(0,1fr))}

/* ── TEMPS PLEIN ET TEMPS PARTIEL NE SE RÈGLENT PAS ENSEMBLE ──
   Un plafond de 44 h ne veut rien dire pour un contrat de 20 h.
   Chaque nature de contrat porte ses bornes, et se coupe entièrement
   si la période ne la concerne pas — le bloc reste VISIBLE mais
   fermé : on doit voir qu'on l'a exclue, pas le deviner à son
   absence. */
.tpc{border:1px solid var(--ligne);border-radius:12px;background:var(--carte);
  margin-bottom:9px;overflow:hidden}
.tpc.on{border-color:var(--ligne-2)}
.tpch{display:flex;align-items:center;gap:12px;padding:12px 15px}
.tpch .t{flex:1;min-width:0}
.tpch .t b{display:block;font-size:13px;font-weight:600;color:var(--encre)}
.tpch .t span{display:block;font-size:11.5px;color:var(--muet);margin-top:2px}
.tpcb{padding:13px 15px 14px;border-top:1px solid var(--ligne)}
.tpc:not(.on) .tpcb{display:none}

/* ── PERSONNALISER SALARIÉ PAR SALARIÉ ──
   Le tableau EST le geste : sortir une personne, lui donner un solde
   d'entrée, une date d'arrivée en cours de période. Ouvrir trente
   fiches pour ça, personne ne le fera — et c'est pour ça que
   personne ne le faisait. */
.mdsal{width:100%;border-collapse:collapse;min-width:880px}
.mdsal th{font-size:10.5px;font-weight:600;letter-spacing:.05em;text-transform:uppercase;
  color:var(--muet);text-align:left;padding:9px 12px;background:var(--surface-2);
  border-bottom:1px solid var(--ligne);white-space:nowrap}
.mdsal td{padding:8px 12px;border-bottom:1px solid var(--ligne);font-size:12.5px;
  vertical-align:middle}
.mdsal tr:last-child td{border-bottom:none}
.mdsal tr.hors td{background:var(--surface-2)}
.mdsal tr.hors .nomcell{color:var(--muet)}
.mdsal .nomcell{display:flex;align-items:center;gap:9px;font-weight:600;color:var(--encre)}
.mdsal .meta{font-size:11px;margin-top:2px}
.mdsal .fi{height:32px;padding:4px 8px;font-size:12.5px;text-align:right;width:78px}
.mdsal .fi.dt{width:136px;text-align:left}
.mdsal tr.hors .fi{opacity:.35;pointer-events:none}
/* L'unité vit DANS le champ : posée à côté, elle s'éloigne du chiffre
   dès que la colonne s'élargit, et on lit « 12 » puis « h » à dix
   centimètres l'un de l'autre. */
.mdsal .funit{width:94px}
.mdsal .funit input{width:100%;padding-right:24px;text-align:right}
.mdx{display:flex;align-items:center;gap:7px}
.mdx .meta{font-size:11px}

/* Le régime se lit sur la ligne, sans avoir à l'ouvrir. */
.regbad{display:inline-block;font-size:10.5px;font-weight:700;letter-spacing:.04em;
  text-transform:uppercase;padding:3px 8px;border-radius:6px;vertical-align:middle}
.regbad.mod{background:var(--terra-pale);color:var(--terra-h)}
.regbad.lis{background:var(--bleu-pale);color:var(--bleu)}

/* Une ligne de période dit d'abord QUI est concerné : c'est la
   question qu'on se pose, et l'ancien écran ne la traitait pas. */
.mdper{display:flex;align-items:center;gap:12px;padding:13px 16px;
  border-bottom:1px solid var(--ligne)}
.mdper:last-child{border-bottom:none}
.mdper .n{flex:1;min-width:0}
.mdper .n b{font-size:13.5px;font-weight:600;color:var(--encre)}
.mdper .n .d{font-size:11.5px;color:var(--muet);margin-top:3px;display:flex;
  flex-wrap:wrap;gap:4px 12px}
.mdper .k{display:flex;gap:18px;flex:none}
.mdper .k > div span{display:block;font-size:11px;color:var(--muet)}
.mdper .k > div b{display:block;font-size:13px;color:var(--encre);font-weight:600;margin-top:1px}
@media (max-width:900px){.mdper{flex-wrap:wrap}.mdper .k{order:3;width:100%}}

/* ═══ LA PAIE ═══                                          (v11.56)

   ── UNE PÉRIODE EST UN OBJET, PAS UN MOIS DANS UNE ADRESSE ──

   Une période est une LIGNE : un mois, des établissements, un verrou,
   et des fichiers produits. Elle se déplie pour montrer ses feuilles,
   une par établissement. */
.pyper{border:1px solid var(--ligne);border-radius:13px;background:var(--carte);
  margin-bottom:9px;overflow:hidden}
.pyperh{display:flex;align-items:center;gap:12px;padding:13px 15px;flex-wrap:wrap}
.pyperh .ck{flex:none;margin:0}
.pyperh .n{flex:1;min-width:180px}
.pyperh .n b{font-size:14px;font-weight:600;color:var(--encre)}
.pyperh .n .d{font-size:11.5px;color:var(--muet);margin-top:3px}
.pyperh .g{display:flex;gap:5px;flex-wrap:wrap;margin-top:5px}
.pyperh .k{display:flex;gap:18px;flex:none}
.pyperh .k > div span{display:block;font-size:11px;color:var(--muet)}
.pyperh .k > div b{display:block;font-size:13px;color:var(--encre);font-weight:600;margin-top:1px}
.pyper.ouvert{border-color:var(--ligne-2)}
.pyet{display:flex;gap:9px;padding:0 15px 14px;flex-wrap:wrap}
.pyper:not(.ouvert) .pyet{display:none}
.pyetc{flex:1;min-width:220px;display:flex;align-items:center;gap:10px;padding:10px 13px;
  border:1px solid var(--ligne);border-radius:11px;background:var(--surface-2);cursor:pointer;
  font-family:var(--f-ui);text-align:left;text-decoration:none}
.pyetc:hover{border-color:var(--terra);background:var(--terra-pale)}
.pyetc .t{flex:1;min-width:0}
.pyetc .t b{display:block;font-size:12.5px;font-weight:600;color:var(--encre)}
.pyetc .t span{display:block;font-size:11px;color:var(--muet);margin-top:2px}

/* La barre de sélection : elle ne s'allume que si l'on a coché. */
.pysel{display:flex;align-items:center;gap:12px;padding:9px 14px;border-radius:11px;
  background:var(--surface-2);border:1px solid var(--ligne);margin-bottom:11px;
  font-size:12.5px;color:var(--muet);flex-wrap:wrap}
.pysel.on{background:var(--terra-pale);border-color:#F3CDBE;color:var(--terra-h)}
.pysel b{color:var(--encre)}
.pysel.on b{color:var(--terra-h)}
.pysel label.chk{margin:0}

/* ── LES COLONNES SE GROUPENT ──
   « Compl. 10 % » et « Compl. 25 % » n'ont de sens que sous « Heures
   complémentaires ». Quinze colonnes à plat ne se lisent pas. */
.pytab{width:100%;border-collapse:collapse;min-width:1020px}
.pytab thead tr.g th{font-size:10.5px;font-weight:700;letter-spacing:.05em;
  text-transform:uppercase;color:var(--muet);padding:7px 12px;background:var(--surface-2);
  border-bottom:1px solid var(--ligne);text-align:center}
.pytab thead tr.g th.vide{background:none;border-bottom:none}
.pytab thead tr.c th{font-size:10.5px;font-weight:600;color:var(--muet);padding:8px 12px;
  background:var(--surface-2);border-bottom:1px solid var(--ligne);text-align:right;
  white-space:nowrap}
.pytab thead tr.c th:first-child{text-align:left}
.pytab td{padding:9px 12px;border-bottom:1px solid var(--ligne);font-size:12.5px;
  text-align:right;white-space:nowrap}
.pytab td:first-child{text-align:left}
.pytab tr:last-child td{border-bottom:none}
.pytab .sep{border-left:1px solid var(--ligne)}
.pytab .z{color:var(--ligne-2)}
.pytab .nomcell{display:flex;align-items:center;gap:9px;font-weight:600;color:var(--encre)}
.pytab .nomcell small{display:block;color:var(--muet);font-weight:600;font-size:11px}
.pytab tfoot td{background:var(--surface-2);font-weight:700;color:var(--encre);
  border-top:1px solid var(--ligne-2);border-bottom:none}
.pytab .fi{height:31px;width:82px;padding:4px 8px;font-size:12.5px;text-align:right}
.pytab .funit{width:92px;display:inline-block}
.pytab .funit input{width:100%;padding-right:24px;text-align:right}

/* ── LES FICHIERS PRODUITS ──
   Qui a exporté quoi, quand, pour quelle période. C'est ce qu'on
   cherche six mois plus tard, quand le cabinet dit ne rien avoir reçu. */
.pyfic{display:flex;align-items:center;gap:12px;padding:11px 15px;
  border-bottom:1px solid var(--ligne)}
.pyfic:last-child{border-bottom:none}
.pyfic .t{flex:1;min-width:0}
.pyfic .t b{display:block;font-size:12.5px;font-weight:600;color:var(--encre)}
.pyfic .t span{display:block;font-size:11px;color:var(--muet);margin-top:2px}

/* ── LE GABARIT D'EXPORT ──
   Choisir ses colonnes et leur ordre. Enregistré sous un nom, il
   devient l'export du cabinet — et il ne se re-règle plus. */
.pycol{display:flex;align-items:center;gap:11px;padding:9px 12px;border-radius:10px;
  border:1px solid var(--ligne);background:var(--carte);margin-bottom:6px}
.pycol .p{color:var(--muet);cursor:grab;font-size:13px;line-height:1;user-select:none}
.pycol .t{flex:1;min-width:0;font-size:12.5px;color:var(--encre)}
.pycol .t small{display:block;color:var(--muet);font-size:11px;margin-top:1px}
.pycol input.fi{height:31px;font-size:12.5px;max-width:210px}
.pycol.pris{opacity:.45}

.pymenu{position:absolute;right:0;top:calc(100% + 5px);z-index:80;min-width:250px;
  background:var(--carte);border:1px solid var(--ligne);border-radius:12px;
  box-shadow:var(--ombre-2);overflow:hidden;padding:5px}
.pymenu a,.pymenu button{display:block;width:100%;text-align:left;border:none;
  background:none;padding:9px 11px;border-radius:8px;font-family:var(--f-ui);font-size:12.5px;
  font-weight:600;color:var(--encre);cursor:pointer;line-height:1.35;text-decoration:none}
.pymenu a:hover,.pymenu button:hover{background:var(--terra-pale);color:var(--terra-h)}
.pymenu small{display:block;color:var(--muet);font-size:11px;font-weight:400;margin-top:2px}
.pymenu a:hover small,.pymenu button:hover small{color:var(--terra-h)}
.pymenu .sep{height:1px;background:var(--ligne);margin:5px 0}
@media (max-width:900px){.pyperh .k{order:3;width:100%}}

/* ── L'ACCÈS DIRECT À LA BASE ──                          (v11.61)
   Un tableau de base de données n'est pas un tableau de
   l'application : les colonnes sont nombreuses, les valeurs sont
   techniques, et on vient y CHERCHER quelque chose. D'où la police
   fixe partout, les lignes serrées, et l'en-tête qui reste en vue
   quand on descend. */
.bdw{max-height:600px;overflow:auto}
.bdt{min-width:100%;font-size:12px}
.bdt th{position:sticky;top:0;z-index:2;background:var(--carte);
  box-shadow:inset 0 -1px 0 var(--ligne);white-space:nowrap;padding:8px 11px}
.bdt td{padding:6px 11px;font-size:12px;white-space:nowrap;max-width:340px;
  overflow:hidden;text-overflow:ellipsis}
.bdth{color:var(--encre);text-decoration:none;display:block}
.bdth:hover{color:var(--terra)}
.bdth.on{color:var(--terra)}
.bdty{display:block;font-size:10px;font-weight:400;letter-spacing:0;
  text-transform:none;color:var(--muet);margin-top:1px}

/* Une case qui se clique le dit AVANT d'être cliquée : sans ce
   soulignement pointillé, l'utilisateur essaie au hasard. */
.bdc{cursor:text}
.bdc:hover{box-shadow:inset 0 0 0 1px var(--ligne)}
.bdc.bdro{cursor:default;color:var(--muet)}
.bdc.bdro:hover{box-shadow:none}
.bdnul{color:var(--muet);font-style:italic}
.bdt td.bdopen{max-width:none;white-space:normal;padding:4px 6px}
.bdc .fi{height:28px;font-size:12px;width:100%;min-width:210px}
.bdc textarea.fi{height:auto;min-width:380px}
.bdc.bdenc{opacity:.5}
.bdc.bdok{background:var(--vert-pale);box-shadow:inset 0 0 0 1px var(--vert)}
.bdc.bdko{background:var(--rouge-pale);box-shadow:inset 0 0 0 1px var(--rouge)}
.bdt tr.bdpart{opacity:0;transition:opacity .25s}

/* Le bouton de suppression est la PREMIÈRE colonne, et il ne part
   pas avec le défilement : une table à trente colonnes le mettrait
   sinon hors de vue, c'est-à-dire hors d'usage. */
.bdt .bdx{position:sticky;left:0;z-index:1;background:var(--carte);
  white-space:nowrap;box-shadow:1px 0 0 var(--ligne)}
.bdt th.bdx{z-index:3}
.bdt tr:hover .bdx{background:var(--surface-2)}

.bdlg{padding:9px 16px;font-size:12px;color:var(--muet);border-bottom:1px solid var(--ligne)}
.bdn{margin:0}
.bdn .fi{width:200px}
.bdp{display:flex;align-items:center;gap:11px;padding:11px 16px}
.bdsql{width:100%;min-height:74px;font-size:12.5px;border-radius:0;border-left:none;
  border-right:none}

/* ── L'AVERTISSEMENT DE SESSION ──                        (v11.65)
   En bas, pleine largeur, au-dessus de tout : ce n'est pas une
   information de plus dans la page, c'est quelque chose qui va
   arriver et qu'on peut encore empêcher. Il n'apparaît que deux
   minutes avant, et jamais autrement. */
.sxban{position:fixed;left:0;right:0;bottom:0;z-index:900;
  display:flex;align-items:center;gap:16px;flex-wrap:wrap;
  padding:13px 22px;background:var(--carte);
  border-top:2px solid var(--rouge);box-shadow:0 -6px 24px rgba(0,0,0,.10)}
.sxtxt{flex:1;min-width:220px;font-size:13.5px;color:var(--encre);font-weight:500}
.sxtxt b{font-variant-numeric:tabular-nums;color:var(--rouge)}
.sxact{display:flex;align-items:center;gap:9px}
@media (max-width:640px){.sxban{padding:11px 14px}.sxact{width:100%}
  .sxact .btn{flex:1;justify-content:center}}

/* ── LE COMPTEUR DE MODULATION ──                         (v11.67)
   Sur la ligne du salarié, sous son nom : trois caractères et une
   couleur. L'avance et le retard ne se lisent pas de la même façon
   — l'un est une réserve, l'autre une dette — et la couleur seule
   suffit à les distinguer d'un coup d'œil sur trente lignes. */
.modpil{display:inline-flex;align-items:center;gap:3px;margin-left:7px;
  font-size:10.5px;font-weight:700;letter-spacing:.01em;
  border-radius:20px;padding:1px 8px;white-space:nowrap;
  background:var(--surface-2);color:var(--muet);border:1px solid var(--ligne)}
.modpil.plus{background:var(--vert-pale);color:var(--vert);border-color:#D8E5C9}
.modpil.moins{background:var(--rouge-pale);color:var(--rouge);border-color:#EBD3D5}

/* Le détail, là où il y a la place de l'écrire : le tiroir et la
   fiche. Une ligne de planning n'a pas à porter une explication. */
.modbloc{margin:12px 0 4px;padding:13px 14px;border-radius:11px;
  background:var(--surface-2);border:1px solid var(--ligne)}
.modbloc .mt{display:flex;align-items:baseline;gap:9px;flex-wrap:wrap;margin-bottom:9px}
.modbloc .mt b{font-size:15px;font-family:var(--f-titre);letter-spacing:-.01em}
.modbloc .mt .mp{font-size:11.5px;color:var(--muet)}
.modbloc .mg{display:grid;grid-template-columns:repeat(auto-fit,minmax(112px,1fr));gap:9px}
.modbloc .mc{background:var(--carte);border:1px solid var(--ligne);border-radius:9px;padding:8px 10px}
.modbloc .mc span{display:block;font-size:10.5px;color:var(--muet);margin-bottom:2px}
.modbloc .mc b{font-size:14px;font-variant-numeric:tabular-nums}
.modbloc .mc.plus b{color:var(--vert)}
.modbloc .mc.moins b{color:var(--rouge)}
.modbloc .mph{margin-top:9px;font-size:12px;color:var(--encre-2);line-height:1.5}
/* D'où viennent les heures comptées : un compteur presque entièrement
   prévisionnel ne se lit pas comme un compteur presque entièrement
   pointé, et le dire évite qu'on lui fasse dire plus qu'il ne sait. */
.modbloc .msrc{margin-top:7px;font-size:11px;color:var(--muet)}

/* ══ LES JUSTIFICATIFS DEMANDÉS ══                        (v11.82)

   Une carte par pièce réclamée, dans le tiroir du type d'absence.
   Une LIGNE de tableau à six colonnes était le premier dessin : dans
   un tiroir de six cents pixels, « Employeur » y devenait « Emplc »
   et « Une par période » « Une par p ». Un menu qu'on ne peut pas
   lire ne se règle pas.

   Le papier occupe donc sa ligne — c'est lui qu'on cherche des yeux
   —, et les quatre réglages qui le qualifient se rangent dessous,
   avec chacun son intitulé. En dessous de 430 px ils passent à deux
   par rangée, sans média-requête : « auto-fit » suffit, et il obéit à
   la largeur du TIROIR, pas à celle de l'écran. */
.abrq{margin-top:9px;padding:11px 12px 12px;border:1px solid var(--ligne);
  border-radius:11px;background:var(--surface-2);
  display:grid;grid-template-columns:minmax(0,1fr) auto;gap:9px 10px;align-items:end}
.abrq .abrqd{min-width:0}
.abrq .abrqx{justify-self:end;white-space:nowrap;font-size:12px;padding-bottom:9px}
.abrql{grid-column:1/-1;display:grid;gap:9px 10px;
  grid-template-columns:repeat(auto-fit,minmax(122px,1fr))}
.abrql>div{min-width:0}
.abrq .fl{margin-bottom:3px}
.abrq .funit{margin:0}
/* Ce qui est fixé par la loi se lit, ne se saisit pas. Le même gris
   que « .fi:disabled » : un champ inerte doit ressembler à un champ
   inerte, pas à un champ qu'on aurait oublié de remplir. */
.abrq .fi.abro{display:flex;align-items:center;background:var(--carte);
  color:var(--muet);cursor:default;min-height:38px}
.abrqadd{white-space:nowrap}
/* ── CE QUI VIENT DE NOUS ──                              (v11.98)
   La classe existait depuis la v11.82 et ne dessinait rien : aucune
   ligne n'était verrouillée, `verrou` valait 0 partout. Le socle en
   pose désormais, et deux lignes qui ne se manipulent pas pareil ne
   peuvent pas se ressembler — sans quoi on cherche le bouton
   « Retirer » d'une ligne qui n'en a pas.

   Un liseré, pas un fond : la ligne reste lisible et ses champs
   réglables ; ce n'est pas une ligne éteinte, c'est une ligne qu'on ne
   retire pas. */
.abrq.abrqv{border-left:3px solid var(--ligne-2);padding-left:10px}

/* ══ DEUX BLOCS, DEUX LISTES DE TÂCHES ══                 (v11.82)

   Ce que le salarié doit fournir se RELANCE ; ce que l'entreprise
   doit produire se FAIT. Les mêler obligerait à lire le porteur
   ligne par ligne pour savoir de quoi on est responsable.

   Le bloc n'invente aucun dessin : ses lignes sont des « .docrow »,
   celles du classeur. Une pièce d'arrêt EST une pièce du classeur. */
.blocq{margin-top:11px}
.blocq+.blocq{margin-top:15px}
.blocqh{display:flex;align-items:center;gap:8px;flex-wrap:wrap;
  margin-bottom:5px;font-size:12px;color:var(--encre-2)}
.blocqc{margin-left:auto;font-size:11px;color:var(--muet);
  font-variant-numeric:tabular-nums}
/* Qui fournit : deux teintes, parce que ce sont deux responsabilités.
   Le salarié prend le crème du planning ; nous, le terracotta des
   gestes qui nous appartiennent. */
.porteurq{display:inline-flex;align-items:center;border-radius:20px;
  padding:1px 9px;font-size:10px;font-weight:700;letter-spacing:.05em;
  text-transform:uppercase;background:var(--surface-2);color:var(--muet);
  border:1px solid var(--ligne)}
.porteurq.emp{background:var(--terra-pale);color:var(--terra);border-color:#EBD9CB}

/* ══ LE CALCUL DES HEURES, SEMAINE PAR SEMAINE ══          (v11.85)

   Un SECOND NIVEAU du tiroir, pas une fenêtre par-dessus : une modale
   posée sur un tiroir empile deux voiles, et l'on ne sait plus ce
   qu'on ferme. Il glisse par-dessus le panneau, avec un « ← Retour »
   qui dit exactement ce qu'il fait. */
.dwr .panel > form.dwniv2{position:absolute;inset:0;z-index:4;background:var(--carte);
  display:flex;flex-direction:column;min-height:0}
.dwr .panel > form.dwniv2[hidden]{display:none}
.dwback{border:0;background:none;padding:0;font-family:var(--f-ui);font-size:12px;
  font-weight:600;color:var(--muet);cursor:pointer;display:inline-flex;align-items:center;gap:4px}
.dwback:hover{color:var(--terra-h)}
.dwback .ico{width:13px;height:13px}
/* Le bandeau reprend la couleur du type : on sait de quelle absence on
   parle sans relire son nom. */
.hbande{border-radius:10px;padding:11px 14px;margin-bottom:14px;
  background:var(--encre-2);color:#fff}
.hbande b{display:block;font-size:14.5px;font-family:var(--f-titre);font-weight:600}
.hbande span{font-size:11.5px;opacity:.85}

/* Six colonnes dans un tiroir de six cents pixels : elles tiennent
   parce qu'elles ne portent que des nombres. En dessous, la table
   défile SEULE — le panneau, lui, ne part jamais de travers. */
.semwrap{overflow-x:auto;margin:0 -2px}
.semt{border-collapse:collapse;width:100%;min-width:498px;font-size:12.5px}
.semt th{font-size:9.5px;letter-spacing:.06em;text-transform:uppercase;color:var(--muet);
  font-weight:800;padding:7px 6px;border-bottom:1px solid var(--ligne);text-align:right;
  white-space:nowrap;vertical-align:bottom}
.semt th:first-child,.semt td:first-child{text-align:left;padding-left:2px}
.semt td{padding:9px 6px;border-bottom:1px solid var(--ligne);text-align:right;
  font-variant-numeric:tabular-nums;vertical-align:middle;white-space:nowrap}
.semt tbody tr:last-child td{border-bottom:0}
.semt .sm1{display:block;font-weight:700}
.semt .sm2{font-size:10.5px;color:var(--muet)}
.semt tfoot td{border-top:2px solid var(--ligne);border-bottom:0;font-weight:700;padding-top:11px}
/* La case corrigée se voit : une correction invisible est une
   correction qu'on refait six mois plus tard sans savoir qu'elle
   existait. */
.semcor{width:72px;text-align:right;border:1px solid var(--ligne-2);background:var(--carte);
  border-radius:8px;padding:5px 7px;font-size:12.5px;font-weight:700;font-family:var(--f-ui);
  color:var(--encre);font-variant-numeric:tabular-nums}
.semcor:focus{outline:none;border-color:var(--terra)}
.semcor.touche{border-color:var(--terra);background:var(--terra-pale);color:var(--terra-h)}
.semu{font-size:10.5px;color:var(--muet);margin-left:3px}
.semreste{font-weight:700}
.semreste.moins{color:var(--rouge)}
.semreste.plus{color:var(--jaune)}
.semreste.zero{color:var(--vert)}

/* ══ LA CELLULE QUI OUVRE LE CALCUL ══                     (v11.85)
   Le champ libre corrigeait un total à l'aveugle. La cellule montre
   le chiffre, sa provenance, et ouvre le détail — elle REMPLACE le
   champ, elle ne s'ajoute pas à lui. */
.cellh{display:inline-flex;align-items:baseline;gap:8px;cursor:pointer;
  border:1px dashed var(--ligne-2);background:var(--carte);border-radius:9px;
  padding:8px 12px;font-family:var(--f-ui);text-align:left}
.cellh b{font-size:14.5px;font-weight:700;color:var(--encre);font-variant-numeric:tabular-nums}
.cellh span{font-size:11px;font-weight:600;color:var(--muet)}
.cellh:hover{border-color:var(--terra);border-style:solid;background:var(--terra-pale)}
.cellh:hover span{color:var(--terra-h)}

/* ══ LES PÉRIODES D'UN ARRÊT ══                            (v11.86)

   Un arrêt peut avoir des trous : chaque période est une ligne
   d'absence, et le planning en dessine une bande par période — ce qui
   est la vérité. Cette liste montre l'arrêt entier, depuis n'importe
   laquelle de ses bandes.

   ── UNE LIGNE = DATE + HEURE + JUSTIFICATIF ──          (v11.87)

   La v11.86 avait ajouté la liste sans rien retirer : les dates de la
   période ouverte étaient écrites dans la section « Quand », ses
   heures dans la section « Heures d'absence », ses papiers dans la
   section « Les justificatifs » — et la période elle-même une
   quatrième fois, dans la liste. Quatre endroits pour un seul objet,
   et deux totaux qui ne disaient pas le même nombre.

   La ligne porte donc les trois : ses dates, ses heures, son papier.
   Repliée, elle les résume ; dépliée, elle les ouvre. C'est la seule
   forme où corriger quelque chose ne demande pas de savoir d'abord
   de quelle période l'écran parlait. */
.perl{border:1px solid var(--ligne-2);border-radius:11px;background:var(--carte);
  margin-bottom:8px;overflow:hidden}
.perl:last-of-type{margin-bottom:0}
/* Celle qu'on regarde porte le liseré : sans lui, on ne sait plus
   laquelle des trois bandes on a ouverte. */
.perl.on{border-color:var(--terra);box-shadow:0 0 0 2px var(--terra-pale)}
.ligt{display:flex;align-items:center;gap:10px;padding:10px 12px;width:100%;
  background:transparent;border:0;text-align:left;font-family:var(--f-ui);
  color:var(--encre);cursor:pointer}
.ligt:hover{background:var(--surface-2)}
.perl.on .ligt{cursor:default}
.perl.on .ligt:hover{background:transparent}
.ligt .ligc{width:11px;flex:none;font-size:9px;color:var(--muet)}
.perl .d1{font-size:13px;font-weight:600;line-height:1.35}
.perl .d2{font-size:11.5px;color:var(--muet)}
.perl.on .d1{color:var(--terra-h)}
/* Ce que la période coûte, aligné à droite : deux nombres qu'on
   compare d'une ligne à l'autre sans les lire en entier. */
.ligh{flex:none;text-align:right;line-height:1.2;font-variant-numeric:tabular-nums}
.ligh b{display:block;font-size:13px;font-weight:700}
.ligh span{display:block;font-size:10.5px;font-weight:600;color:var(--muet)}
/* Le corps déplié. Le retrait de gauche aligne son contenu sur le
   texte de la tête, et non sur le numéro de rang. */
.ligb{padding:2px 12px 12px 45px;border-top:1px dashed var(--ligne)}
/* ── LE TITRE D'UN BLOC PEUT PORTER SON GESTE ──           (v12.6)
   « Relancer » vivait au pied du tiroir de l'absence, en petit bouton
   à côté d'un grand — ce que la règle d'or interdit. Il descend ici,
   au titre de la section qu'il concerne : c'est de ces justificatifs
   qu'il parle, et il y est seul sur sa ligne. La rangée devient donc
   une ligne flexible ; sans geste, elle se comporte exactement comme
   avant. */
.ligz{font-size:10px;letter-spacing:.08em;text-transform:uppercase;
  color:var(--muet);font-weight:800;margin:13px 0 7px;
  display:flex;align-items:center;min-height:22px}
.ligz > .btn{margin-left:auto;flex:none;letter-spacing:0;text-transform:none}
/* Le décompte à côté du titre garde sa casse : « 1 REÇU SUR 2
   ATTENDUS » en capitales se lit comme un cri. */
.ligz i{font-style:normal;font-weight:600;letter-spacing:0;text-transform:none;
  font-size:11.5px;margin-left:7px}
.ligb > .ligz:first-child{margin-top:11px}
.ligr{display:flex;align-items:center;gap:12px;margin-top:13px;padding-top:10px;
  border-top:1px solid var(--ligne)}
/* Ce qui détruit est rouge, dans la ligne comme au pied du tiroir :
   c'est le même geste, il ne change pas de couleur en changeant de
   place. */
.ligr .lkq{font-size:12.5px;font-weight:600;color:var(--rouge)}
.ligr .lkq:hover{color:#A32D34;text-decoration:underline}
/* ── LA PASTILLE DU PAPIER ──
   Elle se lit sans ouvrir : sur un arrêt à quatre prolongations, on
   voit d'un coup d'œil laquelle réclame un certificat. */
.ligj{font-size:10px;font-weight:800;border-radius:20px;padding:2px 9px;
  border:1px solid;flex:none;white-space:nowrap;
  background:var(--surface-2);border-color:var(--ligne-2);color:var(--muet)}
.ligj.ok{background:var(--vert-pale);border-color:#D7E3C8;color:#3F6129}
.ligj.att{background:var(--jaune-pale);border-color:#EDDCB4;color:#8A5F0F}
.ligj.ko{background:var(--rouge-pale);border-color:#EFCDCF;color:var(--rouge)}
/* ── LE TROU SE DESSINE OÙ IL EST ──
   Une phrase en bas de section disait qu'il existait ; entre les deux
   lignes, on voit lequel. */
.ligtr{display:flex;align-items:center;gap:9px;margin:8px 0;
  padding:7px 12px 7px 45px;font-size:11.5px;color:var(--jaune);
  background:var(--jaune-pale);border:1px dashed #EDDCB4;border-radius:10px}
.perrg{width:24px;height:24px;border-radius:7px;flex:none;
  display:flex;align-items:center;justify-content:center;
  font-size:10px;font-weight:800;color:var(--muet);
  background:var(--surface-2);border:1px solid var(--ligne)}
.perrg.on{background:var(--terra-pale);border-color:#EBD9CB;color:var(--terra-h)}
/* « Prolonger » n'est pas un bouton ordinaire : c'est une place vide
   qu'on vient remplir. Le trait discontinu le dit, comme la zone de
   dépôt d'un fichier. */
.abspp{width:100%;margin-top:11px;padding:9px 13px;
  border:1px dashed var(--ligne-2);background:var(--surface-2);border-radius:10px;
  font-family:var(--f-ui);font-size:12.5px;font-weight:600;color:var(--encre-2);
  cursor:pointer;display:flex;align-items:center;justify-content:center;gap:7px}
.abspp:hover{border-color:var(--terra);border-style:solid;color:var(--terra-h);
  background:var(--terra-pale)}
.abspp .ico{width:14px;height:14px}

/* ═══════════════════════════════════════════════════════════════
   LES ORGANISATIONS, CÔTÉ DÉVELOPPEUR                    (v11.94)

   La liste portait sept boutons par organisation, tous du même poids ;
   « Supprimer » y était le voisin d'une bascule réversible, peints de
   la même couleur. Une ligne dit maintenant l'essentiel, et tout ce
   qu'on FAIT vit dans la fiche.
   ═══════════════════════════════════════════════════════════════ */

/* ── Le filtre en tête de liste ── */
.orgfi{display:flex;align-items:center;gap:8px;padding:12px 18px;flex-wrap:wrap;
  border-bottom:1px solid var(--ligne)}
.orgfb{display:inline-flex;align-items:center;gap:6px;padding:5px 11px;border-radius:20px;
  font-size:12px;font-weight:600;color:var(--muet);text-decoration:none;
  border:1px solid var(--ligne);background:var(--carte)}
.orgfb b{color:var(--encre)}
.orgfb:hover{color:var(--encre)}
.orgfb.on{background:var(--surface-2);color:var(--encre)}

/* ── Une ligne par organisation ── */
.orgli{display:flex;align-items:center;gap:16px;padding:13px 18px;
  text-decoration:none;color:inherit;border-bottom:1px solid var(--ligne)}
.orgli:last-of-type{border-bottom:0}
.orgli:hover{background:var(--surface-2)}
.orgln{display:flex;align-items:center;gap:8px;flex-wrap:wrap;flex:1;min-width:0}
.orgln b{font-size:14px}
.orgln i{flex-basis:100%;font-style:normal;font-size:11.5px;color:var(--muet)}
.orglf{font-size:12px;color:var(--muet);white-space:nowrap}
.orglp{font-size:13px;font-weight:700;white-space:nowrap;min-width:104px;text-align:right}
.orglc{display:inline-flex;color:var(--muet)}
/* La sienne : un liseré, pas une couleur — elle n'est pas en alerte,
   elle est seulement celle à laquelle on est rattaché. */
.orgli.orglm{box-shadow:inset 3px 0 0 var(--muet)}
@media(max-width:720px){
  .orglf{display:none}
  .orglp{min-width:0}
}

/* ── La rangée de faits, en tête de fiche ──
   Elle répond à la seule question qu'on se pose avant un geste
   irréversible : combien ça pèse. Il fallait jusqu'ici ouvrir la
   fenêtre de suppression pour l'apprendre — donc être déjà engagé. */
.orgfa{display:grid;grid-template-columns:repeat(auto-fit,minmax(132px,1fr));gap:3px 18px;
  background:var(--carte);border:1px solid var(--ligne);border-radius:var(--r-md,12px);
  padding:13px 18px;margin-bottom:14px}
.orgfa .k i{display:block;font-style:normal;font-size:10px;font-weight:700;letter-spacing:.06em;
  text-transform:uppercase;color:var(--muet)}
.orgfa .k b{font-weight:600;font-size:12.5px}

/* ── Lignes de personnes : un compte, un salarié ── */
.orgk{display:flex;align-items:center;gap:10px;padding:10px 18px;
  border-top:1px solid var(--ligne)}
.orgkn{display:flex;flex-direction:column;flex:1;min-width:0}
.orgkn i{font-style:normal;font-size:11.5px;color:var(--muet)}
.orgk .btn{margin-left:auto}
.orgkv{padding:10px 18px;border-top:1px solid var(--ligne);font-size:12px;color:var(--muet)}

/* ── Un réglage et sa phrase ── */
.orgd{display:flex;align-items:center;gap:12px;padding:11px 18px;
  border-top:1px solid var(--ligne)}
.orgd > div{flex:1}
.orgd b{display:block;font-size:13px}
.orgd i{font-style:normal;font-size:11.5px;line-height:1.5;color:var(--muet)}

/* ── LA ZONE QUI DÉTRUIT ──
   Un cadre, pas un aplat : le rouge plein sur un tiers d'écran finit
   par ne plus rien vouloir dire, et il faut qu'il veuille encore dire
   quelque chose sur le dernier bouton. */
.orgz{border-color:#E4C9C6}
.orgz > .ch{background:#FBF2F1;border-bottom-color:#E4C9C6}
.orgz > .ch h3,.orgz > .ch .sico{color:#8E3B36}
.orgzr{padding:12px 18px;font-size:12.5px;line-height:1.55;color:#8E3B36;
  background:#FDF8F7;border-bottom:1px solid var(--ligne)}
.orgzr.orgzv{color:var(--muet);background:var(--surface-2)}
.orgzd{display:flex;flex-direction:column}
.orgzl{display:flex;align-items:center;gap:16px;padding:13px 18px;
  border-bottom:1px solid var(--ligne)}
.orgzl:last-child{border-bottom:0}
.orgzl > div{flex:1}
.orgzl b{display:block;font-size:13px;margin-bottom:2px}
.orgzl i{display:block;font-style:normal;font-size:11.5px;line-height:1.5;color:var(--muet)}
/* Fermé, mais PRÉSENT : il garde sa place, sinon le cadre se
   réorganise sous les yeux au moment où l'on suspend, et on ne
   comprend pas ce qui vient de s'ouvrir. */
.orgzx{opacity:.42;cursor:not-allowed}

/* ═══════════════════════════════════════════════════════════════
   L'INSCRIPTION EN QUATRE ÉTAPES                          (v11.95)

   Elle vit dans le volet d'authentification, comme la connexion : on
   ne change pas de maison entre la porte et l'entrée.
   ═══════════════════════════════════════════════════════════════ */

/* ── La barre d'étapes ──
   Elle NOMME les quatre étapes. « 2 sur 4 » ne dit pas ce qui reste à
   faire, donc ne rassure pas. */
.lpetp{display:flex;gap:6px;flex-wrap:wrap;margin-bottom:20px}
.lpetl{display:inline-flex;align-items:center;gap:7px;font-size:11.5px;font-weight:600;
  color:var(--muet);padding:6px 11px;border:1px solid var(--ligne);border-radius:20px;
  background:var(--carte)}
.lpetl i{display:inline-flex;align-items:center;justify-content:center;width:17px;height:17px;
  flex:none;border-radius:50%;background:var(--surface-2);font-style:normal;font-size:10px;
  font-weight:700}
.lpetl.on{border-color:var(--terra);color:var(--encre)}
.lpetl.on i{background:var(--terra);color:#fff}
.lpetl.fait i{background:var(--vert);color:#fff}
.lpetl i .ico{width:11px;height:11px}

/* ── La recherche Sirene ──
   Elle REMPLIT les champs, elle ne les remplace pas : si le service ne
   répond pas, la société se saisit à la main. */
.lpsir{display:flex;gap:8px}
.lpsir .fi{flex:1;min-width:0}
.lpsr{display:flex;flex-direction:column;gap:8px;margin:10px 0}
.lpsro{display:block;width:100%;text-align:left;background:var(--carte);cursor:pointer;
  border:1px solid var(--ligne);border-radius:var(--r-md,12px);padding:12px 14px;font:inherit;
  color:inherit}
.lpsro:hover{border-color:var(--terra)}
.lpsro.on{border-color:var(--terra);background:var(--surface-2);
  box-shadow:inset 3px 0 0 var(--terra)}
.lpsro b{display:block;font-size:13.5px;margin-bottom:3px}
.lpsro span{display:block;font-size:12px;color:var(--encre-2)}
.lpsro .lpsrm{font-size:11px;color:var(--muet);margin-top:3px}

/* Ce qu'on a déduit, dit avec la raison — annoncer une convention
   sans dire d'où elle vient, c'est demander de faire confiance à un
   choix qu'on n'a pas fait soi-même. */
.lpok{display:flex;gap:9px;align-items:flex-start;margin:12px 0;padding:11px 13px;
  background:var(--surface-2);border:1px solid var(--ligne);border-radius:var(--r-md,12px);
  font-size:12.5px;line-height:1.55;color:var(--encre-2)}
.lpok .ico{flex:none;margin-top:2px;color:var(--vert)}

/* La jauge dit la LONGUEUR, pas une « force » : compter les
   majuscules et les chiffres pousse à « Motdepasse1! », plus court à
   deviner qu'une phrase de quatre mots. */
.lpjauge{height:5px;border-radius:3px;background:var(--surface-2);overflow:hidden;margin:7px 0}
.lpjauge i{display:block;height:100%;width:0;background:var(--vert);transition:width .18s}

.lpcg{display:flex;gap:9px;align-items:flex-start;font-size:12.5px;line-height:1.55;
  color:var(--encre-2);margin:4px 0 14px}
.lpcg input{margin-top:2px;flex:none}

.lprow2{display:grid;grid-template-columns:1fr 1fr;gap:12px}
.lprg{display:flex;align-items:center;gap:10px}
.lprg .sp{flex:1}
@media(max-width:520px){.lprow2{grid-template-columns:1fr}}

/* ═══ LE BANDEAU D'ÉCHÉANCE ═══                            (v11.95)
   Même anatomie que le bandeau de simulation : collé en haut, une
   icône, une phrase, un bouton. Trois tons, et il ne se ferme pas —
   ce n'est pas une notification, c'est un compte à rebours. */
.abband{display:flex;align-items:center;gap:11px;padding:10px 18px;font-size:12.5px;
  background:var(--surface-2);color:var(--encre);border-bottom:1px solid var(--ligne)}
.abband.w{background:var(--jaune-pale);color:var(--jaune);border-bottom-color:transparent}
.abband.k{background:var(--rouge-pale);color:var(--rouge);border-bottom-color:transparent}
.abband .abic{display:flex}
.abband .abic .ico{width:16px;height:16px}
.abband b{font-family:var(--f-titre);font-weight:700;white-space:nowrap}
.abband .abtx{min-width:0}
.abband .sp{flex:1}
/* Le bouton plein nomme son fond ET son texte. Premier essai :
   « background:currentColor » — les deux tombaient sur la même
   couleur, et le bouton disparaissait. */
.abbtn{display:inline-flex;align-items:center;padding:5px 13px;border-radius:9px;font-size:12px;
  font-weight:600;text-decoration:none;white-space:nowrap;border:1px solid currentColor;
  color:inherit;background:transparent;cursor:pointer}
.abbtn.plein{border-color:transparent}
.abband .abbtn.plein{background:var(--encre);color:var(--carte)}
.abband.w .abbtn.plein{background:var(--jaune);color:#fff}
.abband.k .abbtn.plein{background:var(--rouge);color:#fff}
@media(max-width:720px){
  .abband{flex-wrap:wrap}
  .abband .sp{flex-basis:100%;height:0}
}

/* ═══════════════════════════════════════════════════════════════
   LA BARRE D'OUTILS DU PLANNING, À L'ÉTROIT           (v11.96)

   Mesuré à 1440 px, sur une zone utile de ~1296 px :

     sélecteur d'établissements   360 px
     navigation de date           271 px
     « Aujourd'hui »               91 px
     vue + actions                621 px
     ─────────────────────────────────────
     avec les écarts             1383 px  →  deux lignes

   La barre passait donc sur deux lignes dès 1440 px, sur TOUTES les
   vues — elle est partagée par `planning_entete.php`.

   On rend les 87 px qui manquent, dans cet ordre : le raccourci
   d'abord, puis la largeur du sélecteur. Aucun des deux ne retire
   quoi que ce soit — le retour à aujourd'hui vit aussi dans le
   sélecteur de dates, et un champ de recherche à 260 px reste un
   champ de recherche.
   ═══════════════════════════════════════════════════════════════ */
/* ── LE SEUIL ÉTAIT TROP BAS ──                            (v12.0)

   1500 px venait du calcul ci-dessus, fait sur la vue Salariés SEULE.
   Remesuré vue par vue, à pleine largeur, ce que chaque barre réclame :

     Semaine    1668 px      (elle porte en plus les sept jours)
     Salariés   1559 px
     Jour       1421 px
     Mois       1037 px

   Entre 1501 et 1668, aucune règle ne s'appliquait et Semaine comme
   Salariés se pliaient — dont un portable 13 pouces à 1512. Le premier
   palier part donc de 1700, au-dessus du pire cas. */
@media(max-width:1700px){
  /* Il part en premier parce qu'il ne coûte rien : le sélecteur de
     dates, juste à côté, propose déjà « Cette semaine ». */
  .plbar .pljour{display:none}
  /* 360 → 260 : le nom d'un établissement tient encore largement,
     et la liste déroulante, elle, garde sa propre largeur. */
  .plbar .psel{width:min(260px,100%)}
}
/* ── PUIS LES SEPT JOURS SE RESSERRENT ──
   Ils ne concernent que la vue Semaine, et c'est elle qui manque le
   plus de place. Resserrés, ils rendent 56 px et restent cliquables :
   on lit encore le quantième, qui est ce qu'on vise. */
@media(max-width:1500px){
  .plbar .jsemnav{gap:2px}
  .plbar .jsemnav .jsd{min-width:26px;padding:2px 3px}
  .plbar .jsemnav .jsd b{font-size:7.5px}
  .plbar .jsemnav .jsd span{font-size:11.5px}
}
/* ── PUIS ILS S'EFFACENT ──
   Sous 1400, même resserrés, leurs 200 px ne tiennent plus. Ils
   partent comme le raccourci « Aujourd'hui », et pour la même raison :
   le sélecteur de dates, juste à côté, permet déjà de choisir un jour.
   Le chemin ne ferme pas, il change de porte. */
@media(max-width:1400px){
  .plbar .jsemnav{display:none}
}
@media(max-width:1280px){
  .plbar .psel{width:min(210px,100%)}
}
/* En dessous, c'est le groupe « vue + actions » (621 px) qui décide :
   il ne se coupe pas, et deux lignes valent mieux qu'un bouton à
   demi lisible. On les sépare alors proprement — navigation à
   gauche, actions à droite — plutôt que de les laisser se disloquer. */

/* ═══ PUBLIER PAR ÉQUIPE ═══                               (v11.97)
   Une semaine publiée pour deux équipes sur cinq n'est ni un brouillon
   ni une semaine publiée : c'est un état de travail, et la pastille
   doit le dire — « Publiée » tout court laisserait croire que les cinq
   équipes ont reçu leur planning. */
.pubpill.pubpart{background:var(--vert-pale);color:var(--vert);border-style:dashed;
  border-color:var(--vert)}
.pubpill.pubpart svg{stroke:var(--vert)}

.pubeq{margin-top:16px;padding:13px 15px;background:var(--surface-2);
  border:1px solid var(--ligne);border-radius:var(--r-md,12px)}
.pubeqh{display:flex;align-items:center;gap:10px;font-size:12.5px;font-weight:700;
  margin-bottom:9px}
.pubeqh .lk{margin-left:auto;font-size:11.5px}
.pubeql{display:inline-flex;align-items:center;gap:7px;padding:5px 11px;margin:0 6px 6px 0;
  background:var(--carte);border:1px solid var(--ligne);border-radius:20px;
  font-size:12.5px;cursor:pointer}
.pubeql:has(input:checked){border-color:var(--terra);background:var(--terra-pale)}
.pubeq .fhelp{margin-top:4px}

/* Une semaine sans shift se publie : fermeture annuelle, intersaison,
   établissement à l'arrêt. Elle se signale, elle ne se refuse plus. */
.esem .n.vide{color:var(--muet);font-style:italic}

/* ═══════════════════════════════════════════════════════════════
   LA LIGNE DU SALARIÉ, ET CE QU'ELLE RACONTE AU SURVOL   (v13.0)

   La colonne de gauche portait un nom, trois nombres serrés et une
   pastille qui SORTAIT DU CADRE. Elle porte maintenant, de haut en
   bas : le nom, le poste, la forme de la semaine, les compteurs, et
   la modulation sur sa propre ligne. Tout ce qui demande une phrase
   est parti dans le panneau — une ligne de planning n'a pas la place
   d'expliquer, et n'a pas à l'avoir.
   ═══════════════════════════════════════════════════════════════ */

/* Le poste. La recherche du bandeau filtrait déjà dessus sans qu'il
   soit écrit nulle part (v11.44). */
.pemp .pposte{font-size:10.5px;color:var(--muet);font-weight:500;margin-top:1px;
  white-space:nowrap;overflow:hidden;text-overflow:ellipsis}

/* LA FORME DE LA SEMAINE — sept segments.
   « flex:1 » et non une largeur : la colonne fait 236 px au large et
   moins en dessous de 1180 px, et sept segments fixes déborderaient
   exactement là où la place manque. */
.semjauge{display:flex;gap:3px;margin:5px 0 2px}
.semsg{flex:1;height:6px;border-radius:2px;background:var(--surface-2);
  border:1px solid var(--ligne)}
.semsg.on{background:var(--terra);border-color:var(--terra)}
/* L'absence garde la trame : c'est le seul endroit du planning où
   deux états doivent se distinguer sur six pixels de haut, sans
   couleur de type disponible. */
.semsg.abs{background:repeating-linear-gradient(-45deg,#E7DFF4,#E7DFF4 3px,#F3EEFA 3px,#F3EEFA 6px);
  border-color:#D8CCEC}

/* LA MODULATION SUR SA LIGNE.
   Posée à la suite des compteurs, la pastille débordait de la
   colonne dès que l'écart passait l'heure. « margin-left » remis à
   zéro : celui de « .modpil » servait à l'écarter du texte qui la
   précédait, et il n'y a plus de texte devant elle. */
.cntmod{display:flex;align-items:center;gap:6px;margin-top:3px;min-width:0}
.cntmod .modpil{margin-left:0;min-width:0;overflow:hidden;text-overflow:ellipsis;cursor:default}
.cntmod .modpil svg{width:11px;height:11px;flex:none;stroke:currentColor;fill:none;stroke-width:2}
.modper{font-size:9.5px;color:var(--muet);font-weight:500;white-space:nowrap}

/* ── LE PANNEAU DU SALARIÉ ──
   Il hérite de « .wpanel » — position, ombre, ouverture — et n'en
   reprend que cela : ce qu'on lit ici est une grille de semaines,
   pas des lignes « libellé · valeur ». */
.spanel{width:330px}
.spanel .panh{padding:10px 14px;font-size:11.5px;font-weight:700;color:#fff;
  background:var(--encre);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.spanel .panb{padding:12px 14px 13px;max-height:70vh;overflow-y:auto}

/* Les deux cartouches de tête : ce qui reste à poser, et combien de
   jours sont déjà posés. C'est la seule chose qu'on lit vraiment
   vite, donc elle est en haut et en grand. */
.pandeux{display:flex;gap:8px}
.pancar{flex:1;background:var(--surface-2);border:1px solid var(--ligne);border-radius:10px;
  padding:8px 10px;text-align:center;min-width:0}
.pancar b{display:block;font-family:var(--f-titre);font-size:19px;font-weight:600;
  color:var(--encre);line-height:1.1}
.pancar span{font-size:9.5px;color:var(--muet);font-weight:600}
/* Le bleu du manque et le jaune du dépassement sont ceux de « .dlt »
   juste à côté, sur la ligne : deux codes couleur pour la même idée
   se contrediraient à trente centimètres l'un de l'autre. */
.pancar.manque{background:var(--bleu-pale);border-color:#D6DDEC}
.pancar.manque b{color:var(--bleu)}
.pancar.trop{background:var(--jaune-pale);border-color:#EBD9AC}
.pancar.trop b{color:var(--jaune)}

.pansec{font-size:9px;font-weight:700;letter-spacing:.06em;text-transform:uppercase;
  color:var(--muet);margin:13px 0 6px;padding-top:9px;border-top:1px solid var(--ligne)}
.pansec:first-child{margin-top:0;padding-top:0;border-top:none}

/* LA MATRICE DES QUATRE SEMAINES.
   Des barres à hauteur variable ont été essayées et retirées : sans
   échelle, on voyait qu'une semaine était plus basse qu'une autre
   sans savoir de combien, et il fallait de toute façon un chiffre.
   Ici la case dit seulement TRAVAILLÉ ou NON, et les chiffres sont
   à droite. */
.panmat{display:flex;flex-direction:column;gap:3px}
.panmr{display:grid;grid-template-columns:30px repeat(7,1fr) 46px 30px;gap:3px;align-items:center}
.panmr > span{font-size:9px;font-weight:700;color:var(--muet)}
.panmr > b{font-size:8.5px;font-weight:700;color:var(--muet);text-align:center}
.panmr > u{font-size:10px;font-weight:700;color:var(--encre);text-align:right;
  text-decoration:none;font-style:normal}
.panmr > em{font-size:9px;color:var(--muet);text-align:right;font-style:normal}
.panmr.ici > span,.panmr.ici > u{color:var(--terra-h)}
.panmc{height:13px;border-radius:3px;background:var(--surface-2);
  border:1px solid var(--ligne);display:block}
.panmc.on{background:var(--terra);border-color:var(--terra)}
.panmc.abs{background:repeating-linear-gradient(-45deg,#E7DFF4,#E7DFF4 3px,#F3EEFA 3px,#F3EEFA 6px);
  border-color:#D8CCEC}
.panpuce{font-size:11px;color:var(--encre-2);line-height:1.5;margin-top:8px}
.panpuce b{font-weight:700;color:var(--encre)}

/* LES SEPT CASES DE LA SEMAINE.
   Chacune porte la DURÉE RÉELLE du jour — retenue, pointée ou prévue,
   dans cet ordre — ou l'ABRÉVIATION de ce qui l'occupe. Un tiret
   quand il n'y a rien : « 0h00 » se lirait comme un constat alors
   qu'on ne sait rien. */
.panjs{display:grid;grid-template-columns:repeat(7,1fr);gap:4px;margin:2px 0 4px}
.panj{display:flex;flex-direction:column;align-items:center;gap:2px;
  background:var(--surface-2);border:1px solid var(--ligne);border-radius:8px;padding:5px 2px;
  font-size:11px;font-weight:700;color:var(--encre);min-width:0}
.panj > b{font-size:8px;font-weight:700;color:var(--muet);letter-spacing:.02em}
.panj.vide{color:var(--muet);opacity:.5}
/* Un jour à venir n'est pas un jour vide : on ne sait pas encore. */
.panj.fut{border-style:dashed}
/* L'abréviation prend la place d'une durée, pour que les sept cases
   restent d'aplomb quoi qu'elles portent. Sa couleur est celle du
   TYPE, réglée par l'établissement : un repos hebdomadaire vert et
   un arrêt maladie violet se distinguent sans qu'on ait eu à
   inventer deux catégories. */
.panabr{font-style:normal;font-size:10px;font-weight:800;letter-spacing:.03em}

.pandispo{display:flex;align-items:center;gap:7px;font-size:11.5px;color:var(--encre-2);
  padding:6px 0 0;line-height:1.4}
.pandispo svg{width:13px;height:13px;flex:none;stroke:var(--muet);fill:none;stroke-width:2}
.pandispo b{font-weight:700;color:var(--encre)}
/* La seule chose du panneau qui EMPÊCHE d'ajouter un jour : elle
   passe devant la modulation, qui n'empêche rien. */
.pandispo.att{color:var(--jaune)}
.pandispo.att svg{stroke:var(--jaune)}
.pandispo.att b{color:var(--jaune)}

/* Le panneau de la MODULATION : des lignes « libellé · valeur »,
   parce que c'est bien de cela qu'il s'agit — un compteur, son
   théorique, et l'écart entre les deux. Ce n'est pas la même
   question que la semaine, d'où un contenu et non un onglet de
   plus dans le panneau du salarié. */
.panl{display:flex;align-items:baseline;gap:10px;font-size:12px;padding:2.5px 0}
.panl > span{color:var(--muet);flex:1;min-width:0}
.panl > b{font-weight:700;color:var(--encre);white-space:nowrap}
.panl.fort{border-top:1px solid var(--ligne);margin-top:4px;padding-top:6px}
.panl > b.moins{color:var(--rouge)}
.panl > b.plus{color:var(--vert)}

/* ═══════════════════════════════════════════════════════════════
   L'EN-TÊTE D'UN JOUR TIENT SUR UNE LIGNE               (v13.1)

   « Quand météo activée et petit écran ça va à la ligne (car case à
   cocher, etc). »

   ── CE QUI A ÉTÉ MESURÉ ──

   La ligne demandait, côte à côte : la date (62 px de plancher,
   fixés par le mot « septembre »), la case à cocher (18 + 6 de
   marge), la météo (48 px), un span VIDE, et trois écarts de 8 px.

   À 1600 px de fenêtre cela tenait à 0,14 px près — et c'était
   déjà le span vide qui passait à la ligne. Dès 1440 px, la météo
   suivait : l'en-tête passait de 109 à 161 px. CINQUANTE-DEUX
   PIXELS de planning, perdus exactement sur les écrans qui en ont
   le moins.

   Et le repli n'était pas uniforme : à 1440 px, CINQ jours sur sept
   repliaient et les deux du week-end non — parce que la case à
   cocher n'existe que sur les journées passées ou en cours. C'est
   ce décalage qu'on voyait à l'écran sans pouvoir se l'expliquer.

   ── TROIS CORRECTIONS, ET AUCUNE N'EST UN RÉGLAGE ──

   1 · le span vide est parti du gabarit ;
   2 · la case à cocher quitte le flux (ci-dessous) ;
   3 · le mois s'abrège quand la colonne se serre (ci-dessous).

   MESURÉ APRÈS : 101 px, zéro repli, de 1600 jusqu'à 1024 px.
   ═══════════════════════════════════════════════════════════════ */

/* LES DEUX GESTES DU JOUR DANS LE MÊME COIN.
   « .jcocher » et « .dcopie » n'apparaissent qu'au survol de la
   journée ; la seconde était déjà en absolu dans le coin. La
   première réservait 24 px en permanence pour un bouton qu'on ne
   voit presque jamais — et c'est elle qui faisait replier cinq
   jours sur sept, puisqu'elle n'existe pas sur les jours à venir.
   « .pgh .dd » porte déjà « position:relative ». */
.pgh .dd .jcocher{position:absolute;top:7px;right:34px;margin-left:0;z-index:3}

/* LE MOIS S'ABRÈGE SELON LA COLONNE, PAS SELON LA FENÊTRE.
   Une requête de CONTENEUR et non de média : la barre latérale peut
   se replier, et deux fenêtres de même largeur n'ont alors pas la
   même colonne. C'est la colonne qui manque de place, c'est donc
   elle qu'on interroge.

   Le seuil : mesuré, une colonne de 140 px tient encore le mois
   long une fois la coche partie, 136 px non. 150 px laisse la marge
   qu'une police un peu plus large réclamerait. */
.pgh .dd{container-type:inline-size}
.pgh .dd .d3c{display:none}
@container (max-width:150px){
  .pgh .dd .d3l{display:none}
  .pgh .dd .d3c{display:inline}
  /* Le plancher suit le mot : « sept. » demande 30 px là où
     « septembre » en demandait 52. */
  .pgh .dd .dgauche{min-width:44px}
}

/* ═══════════════════════════════════════════════════════════════
   LA COLONNE DU JOUR NE S'INTERROMPT PLUS            (v13.2)

   « Quand égal au jour d'aujourd'hui le fond n'est pas orange
   partout. »

   ── POURQUOI ELLE S'INTERROMPAIT ──

   La teinte était posée CELLULE PAR CELLULE : « .dd.today »,
   « .pcell.today », « .fc.today », « .evcell.today ». Chaque famille
   de rangées devait s'en souvenir — et il en existait une qui ne
   pouvait pas s'en souvenir : « .eqsep », la rangée de séparation
   d'équipe, qui n'est pas une grille de sept jours mais un simple
   « libellé + total ». Elle n'a aucune case de jour à teinter.

   MESURÉ en balayant la colonne du jour de haut en bas : la teinte
   court de l'en-tête au pied, et s'arrête à chaque bandeau
   d'équipe — sur toute la largeur du planning, autant de fois qu'il
   y a d'équipes.

   ── LA CORRECTION ──

   L'indice du jour (0 à 6) vit sur « .pl2 », posé une fois par le
   gabarit. La bande se calcule alors à partir du MÊME gabarit de
   colonnes que les grilles : première colonne, puis sept parts
   égales. Toute rangée qui n'est pas une grille de jours peut
   désormais la tracer — celle-ci, et celles qu'on ajoutera.

   C'est aussi pourquoi « 236px » est devenu « --pl2c0 » : deux
   écritures de la même largeur finiraient par ne plus dire pareil,
   et la bande se décalerait sans qu'on comprenne pourquoi.
   ═══════════════════════════════════════════════════════════════ */
/* ── LA BANDE, SUR LA RANGÉE ET NON SUR LA CASE ──

   Elle est posée sur TOUTE rangée du planning, sans exception et
   sans que chacune ait à s'en souvenir. Les cases qui portent déjà
   leur propre teinte la recouvrent d'un ton identique ou plus
   soutenu ; celles qui n'en ont pas la laissent paraître.

   Deux endroits en avaient besoin, et le second ne se devinait pas :

     · « .eqsep », le bandeau d'équipe — il n'a pas de case de jour ;
     · « .prow.avecabs », la rangée qui porte une bande d'absence.
       Celle-là tient sur DEUX lignes de grille : les rubans en
       haut, les cases du jour en bas. « .pcell.today » ne teinte que
       la seconde, et la première restait blanche — sur toute la
       largeur, à chaque absence. C'est ce qu'on voyait sans pouvoir
       se l'expliquer : « l'absence n'est pas concernée ».

   « z-index:-1 » et non « 0 » : un pseudo-élément positionné à zéro
   passerait DEVANT le contenu des cases, et laverait d'orange les
   cartes de shift et le total de l'équipe. À -1, il se glisse entre
   le fond de la rangée et ce qu'elle porte. La rangée doit alors
   former un contexte d'empilement — d'où le « z-index:0 » sur elle —
   sinon la bande file derrière le fond du planning et disparaît. */
.pl2.aujsem > *{position:relative;z-index:0}
.pl2.aujsem > *::after{content:'';position:absolute;top:0;bottom:0;z-index:-1;
  pointer-events:none;background:var(--auj);
  left:calc(var(--pl2c0) + var(--auji) * (100% - var(--pl2c0)) / 7);
  width:calc((100% - var(--pl2c0)) / 7)}

/* ═══════════════════════════════════════════════════════════════
   LA CASE D'EN-TÊTE DIT LA SEMAINE                   (v13.2)

   Elle annonçait « Exploitation · 3 salariés ». Le mot était écrit
   en dur dans le gabarit et voulait dire « le personnel
   d'exploitation » : là où un établissement a une équipe de ce nom,
   on croyait lire un filtre — et le compte disait « 3 » sans dire
   pourquoi il n'y en avait pas cinq.

   Le total de la SEMAINE n'était affiché nulle part : le pied de
   grille donne les totaux du JOUR, colonne par colonne, et c'est la
   somme qu'on cherche en fin de saisie.
   ═══════════════════════════════════════════════════════════════ */
.pl2 .pgh .c0.c0sem{flex-direction:column;align-items:flex-start;justify-content:center;
  gap:5px;text-transform:none;letter-spacing:0}
.c0n{font-size:13px;font-weight:500;color:var(--encre-2);white-space:nowrap}
.c0n b{font-family:var(--f-titre);font-size:18px;font-weight:600;color:var(--encre);
  margin-right:3px}
.c0n i{font-style:normal;color:var(--muet)}
.c0f{display:flex;gap:6px;flex-wrap:wrap;align-items:center;min-width:0}
.c0vide{font-size:10.5px;font-weight:600;color:var(--muet);white-space:nowrap}

/* ── MES APPAREILS (profil) ──                              (v14.0)
   Les téléphones qui portent l'application mobile : une ligne par
   appareil, ses boutons à droite, les retirés en retrait. */
.mapl{display:flex;flex-direction:column}
.mapr{display:flex;align-items:center;gap:12px;padding:11px 0;border-top:1px solid var(--ligne)}
.mapr:first-child{border-top:0}
.mapr.off .mapt b{color:var(--muet);font-weight:500}
.mapt{flex:1;min-width:0}
.mapt b{display:block;font-size:13.5px;font-weight:600}
.mapt span{display:block;font-size:12px;color:var(--muet);margin-top:2px}
.mapf{display:flex;gap:6px;flex:none}

/* ── LE MOBILE, DANS LE KIT ──                              (v14.0)
   Un téléphone à côté de son mode d'emploi : l'application vit dans
   un cadre, avec sa propre feuille. */
.kitmob{display:grid;grid-template-columns:300px 1fr;gap:18px;align-items:start}
.kitmob iframe{width:300px;height:620px;border:10px solid #1c1714;border-radius:32px;background:var(--fond)}

/* ═══ v14.8 · LE CENTRE D'AIDE ═══════════════════════════════════
   aide.php n'a pas la mise en page de l'application : c'est un site
   à part, avec sa barre, ses rubriques, ses articles — et le même
   kit (boutons, pastilles, champs, cartes). Tout ce qui est à lui
   commence par « aid ». Le rendu d'un article (.aidcorps) sert
   aussi au « ? » de la barre (.aidvolet) et à l'aperçu de l'écran
   de rédaction : une seule feuille, trois endroits. */
.aidsite{min-height:100vh;display:flex;flex-direction:column;background:var(--fond)}
.aidhead{position:sticky;top:0;z-index:30;display:flex;align-items:center;gap:14px;padding:10px 24px;
  background:var(--carte);border-bottom:1px solid var(--ligne)}
.aidlogo{display:flex;align-items:center;gap:8px;font-family:var(--f-titre);font-weight:700;font-size:16px;
  color:var(--encre);text-decoration:none}
.aidlogo i{width:30px;height:30px;border-radius:9px;background:var(--terra);color:#fff;display:flex;align-items:center;
  justify-content:center;font-style:normal;font-size:12px}
.aidlogo small{color:var(--muet);font:500 11.5px var(--f-ui);margin-left:2px}
.aidmenu{display:flex;gap:2px;margin-left:14px}
.aidmenu a{padding:8px 12px;font-size:13px;font-weight:600;color:var(--encre-2);border-radius:8px;text-decoration:none}
.aidmenu a:hover{background:var(--surface-2);color:var(--encre)}
.aidmenu a.on{color:var(--terra);background:var(--terra-pale)}
.aidhead .aidrech{margin-left:auto}
.aidrech{position:relative;width:min(320px,40vw)}
.aidrech>svg{position:absolute;left:11px;top:10px;width:15px;height:15px;stroke:var(--muet);fill:none;stroke-width:2}
.aidrech .fi{padding-left:33px;padding-right:44px}
.aidrech kbd{position:absolute;right:9px;top:8px;background:var(--surface-2);border:1px solid var(--ligne);
  border-radius:5px;padding:1px 6px;font:600 10.5px ui-monospace,monospace;color:var(--muet)}
.aidres{position:absolute;top:calc(100% + 6px);left:0;right:0;background:var(--carte);border:1px solid var(--ligne-2);
  border-radius:12px;box-shadow:var(--ombre-2);z-index:40;overflow:hidden;text-align:left}
.aidres[hidden]{display:none}
.aidres .t{padding:8px 14px 5px;font-size:10.5px;font-weight:700;color:var(--muet);letter-spacing:.07em;text-transform:uppercase}
.aidres a{display:flex;gap:11px;padding:9px 14px;border-bottom:1px solid var(--ligne);text-decoration:none;color:inherit;
  font-size:12.5px;align-items:flex-start}
.aidres a:last-child{border-bottom:0}
.aidres a:hover,.aidres a.k{background:var(--surface-2)}
.aidres a b{display:block;font-weight:600}
.aidres a b mark,.aidres a span mark{background:var(--creme);color:inherit;border-radius:3px;padding:0 1px}
.aidres a span{color:var(--muet);font-size:11.5px;display:block}
.aidres a em{font-style:normal;font-size:10.5px;color:var(--terra);font-weight:600;white-space:nowrap;margin-left:auto;padding-top:2px}
.aidcompte{position:relative}
.aidcompte>button{display:flex;align-items:center;gap:8px;background:none;border:0;padding:3px;border-radius:20px;cursor:pointer}
.aidcompte .tpan{right:0}
.aidmain{flex:1;width:100%;max-width:1180px;margin:0 auto;padding:0 24px 40px;position:relative}
.aidprog{position:fixed;left:0;top:0;height:3px;background:var(--terra);width:0;z-index:35;transition:width .1s}
.aidfoot{border-top:1px solid var(--ligne);padding:16px 24px;display:flex;gap:22px;flex-wrap:wrap;font-size:12px;
  color:var(--muet);background:var(--surface-2)}
.aidfoot b{color:var(--encre-2);font-weight:600}
.aidfoot a{color:inherit;text-decoration:none}
.aidfoot a:hover{color:var(--terra)}
.aidfoot .d{margin-left:auto}
/* accueil */
.aidhero{padding:40px 0 28px;text-align:center}
.aidhero h1{font-family:var(--f-titre);font-size:30px;line-height:1.15;font-weight:700;margin:0 0 8px;letter-spacing:-.01em}
.aidhero p{color:var(--encre-2);font-size:14px;max-width:560px;margin:0 auto}
.aidhero .aidrech{width:min(620px,100%);margin:22px auto 0}
.aidhero .aidrech>svg{left:16px;top:15px;width:18px;height:18px}
.aidhero .aidrech .fi{padding:13px 16px 13px 44px;font-size:14.5px;border-radius:12px;box-shadow:var(--ombre-2)}
.aidhero .aidsug{margin-top:10px;font-size:12px;color:var(--muet)}
.aidhero .aidsug a{color:var(--terra);font-weight:600;text-decoration:none;margin:0 3px}
.aidhero .aidsug a:hover{text-decoration:underline}
.aidpg h2.sec{font-family:var(--f-titre);font-size:17px;font-weight:600;display:flex;align-items:baseline;gap:10px;margin:26px 0 12px}
.aidpg h2.sec span{font:500 12px var(--f-ui);color:var(--muet)}
.aidpg h2.sec a{margin-left:auto;font:600 12px var(--f-ui);color:var(--terra);text-decoration:none}
.aidgrid{display:grid;grid-template-columns:repeat(auto-fill,minmax(300px,1fr));gap:12px}
.aidrub{border:1px solid var(--ligne);border-radius:12px;padding:15px 16px;background:var(--carte);display:flex;gap:13px;
  align-items:flex-start;text-decoration:none;color:inherit;transition:border-color .15s,box-shadow .15s,transform .15s}
.aidrub:hover{border-color:var(--terra);box-shadow:var(--ombre-2);transform:translateY(-1px)}
.aidrub .ic{width:40px;height:40px;border-radius:11px;display:flex;align-items:center;justify-content:center;flex:none}
.aidrub .ic svg{width:20px;height:20px;fill:none;stroke:currentColor;stroke-width:1.9;stroke-linecap:round;stroke-linejoin:round}
.aidrub b{display:block;font-family:var(--f-titre);font-size:14.5px;font-weight:600;margin-bottom:3px}
.aidrub span{font-size:12px;color:var(--encre-2);line-height:1.5;display:block}
.aidrub em{display:block;margin-top:7px;font-style:normal;font-size:11px;color:var(--muet);font-weight:600}
/* une teinte par rubrique : l'icône la porte, le reste reste calme */
.aidtint.terra{background:var(--terra-pale);color:var(--terra)}
.aidtint.bleu{background:var(--bleu-pale);color:var(--bleu)}
.aidtint.vert{background:var(--vert-pale);color:var(--vert)}
.aidtint.jaune{background:var(--jaune-pale);color:var(--jaune)}
.aidtint.violet{background:var(--violet-pale);color:var(--violet)}
.aidlus{display:grid;grid-template-columns:repeat(auto-fill,minmax(360px,1fr));gap:10px}
.aidlu{display:flex;align-items:center;gap:11px;border:1px solid var(--ligne);border-radius:10px;padding:10px 13px;
  background:var(--carte);text-decoration:none;color:inherit}
.aidlu:hover{border-color:var(--terra);background:var(--terra-pale)}
.aidlu .n{width:26px;height:26px;border-radius:50%;display:flex;align-items:center;justify-content:center;flex:none;font:700 11px var(--f-ui)}
.aidlu .n svg{width:13px;height:13px;fill:none;stroke:currentColor;stroke-width:2}
.aidlu b{font-weight:600;font-size:13px;display:block}
.aidlu span{font-size:11.5px;color:var(--muet)}
.aidlu .g{margin-left:auto;color:var(--muet);font-size:11px;white-space:nowrap}
.aidnv{margin:10px 0 0;border:1px solid #F3C7B8;background:var(--terra-pale);border-radius:12px;padding:13px 16px;
  display:flex;align-items:center;gap:14px;flex-wrap:wrap}
.aidnv b{font-family:var(--f-titre);font-size:13.5px;font-weight:600;display:block}
.aidnv span{font-size:12.5px;color:var(--encre-2)}
.aidnv .btn{margin-left:auto}
/* rubrique, résultats */
.aidpg{padding:22px 0 10px}
.aidfil{font-size:12px;color:var(--muet);margin-bottom:12px;display:flex;gap:6px;align-items:center;flex-wrap:wrap}
.aidfil a{color:var(--terra);text-decoration:none}
.aidfil a:hover{text-decoration:underline}
.aidfil svg{width:12px;height:12px;stroke:var(--muet);fill:none;stroke-width:2}
.aidpg h1{font-family:var(--f-titre);font-size:23px;line-height:1.2;font-weight:700;margin:0 0 5px}
.aidpg .desc{color:var(--encre-2);font-size:13.5px;margin:0 0 18px;max-width:640px}
.aidsscat{margin:20px 0 8px;display:flex;align-items:baseline;gap:9px}
.aidsscat b{font-family:var(--f-titre);font-size:14px;font-weight:600}
.aidsscat span{font-size:11.5px;color:var(--muet)}
.aidliste{border:1px solid var(--ligne);border-radius:12px;overflow:hidden;background:var(--carte)}
.aidliste a{display:flex;align-items:center;gap:12px;padding:12px 15px;border-bottom:1px solid var(--ligne);text-decoration:none;
  color:inherit;font-size:13px}
.aidliste a:last-child{border-bottom:0}
.aidliste a:hover{background:var(--surface-2)}
.aidliste .ic{width:30px;height:30px;border-radius:8px;display:flex;align-items:center;justify-content:center;flex:none}
.aidliste .ic svg{width:15px;height:15px;fill:none;stroke:currentColor;stroke-width:2}
.aidliste b{font-weight:600;display:block}
.aidliste .r{color:var(--muet);font-size:11.5px;display:block;margin-top:1px}
.aidliste .g{margin-left:auto;color:var(--muet);font-size:11px;white-space:nowrap;display:flex;gap:8px;align-items:center}
.aidliste .g svg{width:12px;height:12px;stroke:currentColor;fill:none;stroke-width:2}
/* article */
.aidpage{display:grid;grid-template-columns:210px minmax(0,1fr) 200px;gap:0;margin:0 -24px;border-top:1px solid var(--ligne)}
.aidtoc{border-right:1px solid var(--ligne);padding:4px 16px 20px 24px;background:var(--surface-2);position:sticky;top:57px;
  align-self:start;max-height:calc(100vh - 57px);overflow:auto}
.aidtoc .t{font-size:10.5px;font-weight:600;color:var(--muet);letter-spacing:.07em;text-transform:uppercase;margin:16px 0 9px}
.aidtoc a{display:block;padding:5px 0 5px 10px;font-size:12px;color:var(--encre-2);text-decoration:none;border-left:2px solid var(--ligne);line-height:1.4}
.aidtoc a:hover{color:var(--encre)}
.aidtoc a.on{border-left-color:var(--terra);color:var(--terra);font-weight:600}
.aidtoc a.n3{padding-left:20px;font-size:11.5px}
.aidbody{padding:20px 30px 34px;min-width:0}
.aidbody h1{font-family:var(--f-titre);font-size:24px;line-height:1.2;font-weight:700;margin:0 0 8px;letter-spacing:-.01em}
.aidmeta{font-size:11.5px;color:var(--muet);margin-bottom:20px;display:flex;gap:10px;flex-wrap:wrap;align-items:center}
.aidmeta .aut{display:flex;align-items:center;gap:6px}
.aidmeta .aut i{width:20px;height:20px;border-radius:50%;background:var(--terra-pale);color:var(--terra);font:700 9px var(--f-ui);
  font-style:normal;display:flex;align-items:center;justify-content:center}
.aidside{padding:20px 18px 20px 16px;border-left:1px solid var(--ligne);font-size:12px}
.aidside .t{font-size:10.5px;font-weight:600;color:var(--muet);letter-spacing:.07em;text-transform:uppercase;margin:0 0 9px}
.aidside .t.b2{margin-top:18px}
.aidside .act{display:flex;flex-direction:column;gap:4px}
.aidside .act a,.aidside .act button{display:flex;align-items:center;gap:8px;background:none;border:1px solid transparent;border-radius:8px;
  padding:6px 8px;text-align:left;font:500 12px var(--f-ui);color:var(--encre-2);text-decoration:none;cursor:pointer}
.aidside .act a:hover,.aidside .act button:hover{background:var(--surface-2);color:var(--encre)}
.aidside .act svg{width:14px;height:14px;stroke:var(--muet);fill:none;stroke-width:2;flex:none}
.aidkv{display:flex;justify-content:space-between;gap:8px;padding:5px 0;border-bottom:1px solid var(--ligne)}
.aidkv:last-of-type{border-bottom:0}
.aidkv span{color:var(--muet)}
.aidkv b{font-weight:600;text-align:right}
/* le corps : le même sur le site, dans le volet, dans l'aperçu */
.aidcorps{font-size:13.5px;line-height:1.7;color:var(--encre-2);max-width:68ch}
.aidcorps h2{font-family:var(--f-titre);font-size:17px;line-height:1.3;font-weight:600;color:var(--encre);margin:26px 0 9px;scroll-margin-top:70px}
.aidcorps h3{font-family:var(--f-titre);font-size:14px;line-height:1.3;font-weight:600;color:var(--encre);margin:18px 0 6px;scroll-margin-top:70px}
.aidcorps h2:first-child,.aidcorps h3:first-child{margin-top:4px}
.aidcorps p{margin:0 0 11px}
.aidcorps ul{margin:0 0 12px;padding-left:20px}
.aidcorps li{margin-bottom:5px}
.aidcorps b{color:var(--encre)}
.aidcorps code{font:600 11.5px ui-monospace,monospace;background:var(--surface-2);border:1px solid var(--ligne);border-radius:5px;padding:1px 6px;color:var(--encre)}
.aidcorps a{color:var(--terra)}
.aidetapes{counter-reset:aidetape;margin:8px 0 14px}
.aidetape{display:flex;gap:13px;padding:10px 0;border-bottom:1px solid var(--ligne)}
.aidetape:last-child{border-bottom:0}
.aidetape::before{counter-increment:aidetape;content:counter(aidetape);width:26px;height:26px;border-radius:50%;background:var(--terra);
  color:#fff;font:700 12px var(--f-ui);display:flex;align-items:center;justify-content:center;flex:none;margin-top:1px}
.aidetape div{line-height:1.65}
.aidetape div b{display:block;color:var(--encre);margin-bottom:2px}
.aidfig{margin:12px 0 16px;max-width:640px}
.aidfig a{display:block;position:relative;border:1px solid var(--ligne);border-radius:12px;overflow:hidden;background:var(--carte);cursor:zoom-in}
.aidfig a:hover{box-shadow:var(--ombre-2)}
.aidfig img{display:block;width:100%;height:auto}
.aidfig a span{position:absolute;right:8px;top:8px;background:rgba(255,255,255,.92);border:1px solid var(--ligne);border-radius:7px;
  padding:3px 8px;font-size:10.5px;font-weight:600;color:var(--encre-2);opacity:0;transition:opacity .15s}
.aidfig a:hover span{opacity:1}
.aidfig figcaption{font-size:11.5px;color:var(--muet);margin-top:6px}
.aidvid{display:flex;gap:12px;align-items:center;margin:8px 0 14px;max-width:640px;border:1px solid var(--ligne);border-radius:12px;
  padding:12px 14px;background:var(--carte);text-decoration:none;color:inherit}
.aidvid:hover{border-color:var(--terra)}
.aidvid>svg{width:22px;height:22px;stroke:var(--terra);fill:none;stroke-width:1.8;flex:none}
.aidvid b{display:block;font-weight:600;font-size:13px;color:var(--encre)}
.aidvid i{font-style:normal;font-size:11.5px;color:var(--muet)}
.aidenc{border-left:3px solid var(--bleu);background:var(--bleu-pale);border-radius:0 10px 10px 0;padding:11px 14px;margin:4px 0 14px;
  font-size:13px;line-height:1.65;display:flex;flex-wrap:nowrap;gap:10px;color:var(--encre-2)}
.aidenc>svg{width:16px;height:16px;flex:none;margin-top:3px;stroke:var(--bleu);fill:none;stroke-width:2}
.aidenc.aidatt{border-color:var(--jaune);background:var(--jaune-pale)}
.aidenc.aidatt>svg{stroke:var(--jaune)}
.aidenc.aidok{border-color:var(--vert);background:var(--vert-pale)}
.aidenc.aidok>svg{stroke:var(--vert)}
.aidtab{width:100%;max-width:660px;border-collapse:separate;border-spacing:0;font-size:13px;margin:6px 0 14px;border:1px solid var(--ligne);border-radius:10px;overflow:hidden}
.aidtab th{background:var(--surface-2);text-align:left;padding:8px 12px;font:600 11px var(--f-ui);color:var(--muet);letter-spacing:.05em;
  text-transform:uppercase;border-bottom:1px solid var(--ligne)}
.aidtab td{padding:8px 12px;border-bottom:1px solid var(--ligne);vertical-align:top}
.aidtab tr:last-child td{border-bottom:0}
.aidfaq{border:1px solid var(--ligne);border-radius:12px;overflow:hidden;max-width:660px;margin-top:6px;background:var(--carte)}
.aidfaq details{border-bottom:1px solid var(--ligne)}
.aidfaq details:last-child{border-bottom:0}
.aidfaq summary{list-style:none;cursor:pointer;padding:12px 14px;font-size:13px;font-weight:600;color:var(--encre);display:flex;align-items:center;gap:10px}
.aidfaq summary::-webkit-details-marker{display:none}
.aidfaq summary:hover{background:var(--surface-2)}
.aidfaq summary svg{width:14px;height:14px;flex:none;stroke:var(--muet);fill:none;stroke-width:2;transition:transform .2s}
.aidfaq details[open] summary svg{transform:rotate(45deg);stroke:var(--terra)}
.aidfaq details>div{padding:0 14px 13px 38px;font-size:13px;line-height:1.65}
.aidvote{margin-top:26px;padding:16px 18px;border:1px solid var(--ligne);border-radius:12px;background:var(--surface-2);max-width:660px}
.aidvote b.q{font-family:var(--f-titre);font-size:14px;font-weight:600;display:block}
.aidvote .r{display:flex;gap:8px;margin-top:11px;flex-wrap:wrap}
.aidvote .r .btn.oui:hover{border-color:var(--vert);color:var(--vert);background:var(--vert-pale)}
.aidvote .r .btn.non:hover{border-color:var(--rouge);color:var(--rouge);background:var(--rouge-pale)}
.aidvote .st{margin-top:11px;font-size:11.5px;color:var(--muet);display:flex;align-items:center;gap:10px}
.aidbarre{flex:1;max-width:160px;height:5px;background:var(--ligne);border-radius:3px;overflow:hidden}
.aidbarre i{display:block;height:100%;background:var(--vert)}
.aidvote textarea{margin-top:10px;min-height:70px;resize:vertical}
.aidraisons{display:flex;gap:6px;flex-wrap:wrap;margin-top:10px}
.aidraisons label{border:1px solid var(--ligne-2);background:var(--carte);border-radius:20px;padding:5px 11px;font-size:12px;
  font-weight:600;color:var(--encre-2);cursor:pointer}
.aidraisons label:hover,.aidraisons label:has(:checked){border-color:var(--terra);color:var(--terra);background:var(--terra-pale)}
.aidraisons input{display:none}
.aidmerci{color:var(--vert);font-weight:600;font-size:13px;display:flex;align-items:center;gap:8px}
.aidmerci svg{width:16px;height:16px;stroke:currentColor;fill:none;stroke-width:2.2}
.aidlies{margin-top:22px;max-width:660px}
.aidlies .t{font-size:10.5px;font-weight:600;color:var(--muet);letter-spacing:.07em;text-transform:uppercase;margin-bottom:8px}
.aidlies a{display:flex;align-items:center;gap:10px;background:var(--carte);border:1px solid var(--ligne);border-radius:9px;padding:9px 12px;
  margin-bottom:6px;font-size:12.5px;font-weight:600;color:var(--encre-2);text-decoration:none}
.aidlies a:hover{border-color:var(--terra);color:var(--terra)}
.aidlies a svg{width:14px;height:14px;stroke:var(--muet);fill:none;stroke-width:2;flex:none}
.aidlies a small{margin-left:auto;color:var(--muet);font-weight:400;font-size:11px}
.aidnav{display:flex;gap:10px;margin-top:22px;max-width:660px}
.aidnav a{flex:1;background:var(--carte);border:1px solid var(--ligne);border-radius:10px;padding:10px 13px;text-decoration:none;color:inherit}
.aidnav a:hover{border-color:var(--terra)}
.aidnav a small{display:block;font-size:10.5px;color:var(--muet);text-transform:uppercase;letter-spacing:.06em;font-weight:600}
.aidnav a b{font-size:12.5px;font-weight:600}
.aidnav a.nx{text-align:right}
/* mises à jour */
.aidtl{max-width:820px}
.aidtle{display:grid;grid-template-columns:108px 1fr;gap:16px;padding:16px 0;border-top:1px solid var(--ligne)}
.aidtle .d{font-size:12px;color:var(--muet);padding-top:3px}
.aidtle .d b{display:block;color:var(--encre);font-family:var(--f-titre);font-size:13px;font-weight:600;margin-bottom:3px}
.aidtle h3{font-family:var(--f-titre);font-size:15.5px;line-height:1.3;font-weight:600;margin:0 0 6px;display:flex;align-items:center;gap:9px;flex-wrap:wrap}
.aidtle ul{margin:0 0 10px 18px;padding:0;font-size:13px;color:var(--encre-2);line-height:1.7}
.aidtle .ac{display:flex;gap:8px;flex-wrap:wrap}
/* la carte « à revoir » que voit le lecteur : honnête, pas alarmante */
.aidtag{display:inline-flex;align-items:center;gap:6px;font-size:11.5px;color:var(--jaune);background:var(--jaune-pale);border-radius:20px;padding:2px 9px;font-weight:600}
/* le « ? » de la barre : le volet à droite */
.aidvolet{position:fixed;top:0;right:0;bottom:0;width:min(420px,100vw);background:var(--carte);border-left:1px solid var(--ligne-2);
  box-shadow:-14px 0 40px -20px rgba(62,43,26,.35);transform:translateX(100%);transition:transform .25s ease;z-index:60;display:flex;flex-direction:column}
.aidvolet.on{transform:none}
.aidvolet .h{padding:12px 16px;border-bottom:1px solid var(--ligne);display:flex;align-items:center;gap:10px;background:var(--surface-2)}
.aidvolet .h svg{width:16px;height:16px;stroke:var(--encre-2);fill:none;stroke-width:2}
.aidvolet .h b{font-family:var(--f-titre);font-size:13px;font-weight:600}
.aidvolet .h .x{margin-left:auto;background:none;border:0;font-size:20px;color:var(--muet);line-height:1;cursor:pointer}
.aidvolet .c{padding:16px 18px;overflow:auto;flex:1}
.aidvolet .c .aidcorps{font-size:12.5px}
.aidvolet .c h1{font-family:var(--f-titre);font-size:17px;line-height:1.25;font-weight:700;margin:0 0 6px}
.aidvolet .f{border-top:1px solid var(--ligne);padding:10px 16px;display:flex;gap:8px;background:var(--surface-2)}
.aidvolet .liste{display:flex;flex-direction:column;gap:5px;margin-bottom:14px}
.aidvolet .liste a{display:flex;align-items:center;gap:9px;border:1px solid var(--ligne);border-radius:9px;padding:8px 11px;font-size:12.5px;
  font-weight:600;color:var(--encre-2);text-decoration:none;background:var(--carte);cursor:pointer}
.aidvolet .liste a:hover{border-color:var(--terra);color:var(--terra)}
.aidvolet .liste a svg{width:14px;height:14px;stroke:var(--muet);fill:none;stroke-width:2;flex:none}
.tbtn.aidq{font:700 13px var(--f-ui);position:relative}
.tbtn.aidq .tpast{background:var(--terra)}
@media(max-width:1080px){.aidpage{grid-template-columns:200px minmax(0,1fr)}.aidside{display:none}}
@media(max-width:820px){.aidpage{grid-template-columns:1fr}.aidtoc{display:none}.aidmenu{display:none}.aidhead .aidrech{width:180px}}

/* ═══ v14.9 · LE CHAT DU SUPPORT ═══════════════════════════════════
   Côté client, une bulle en bas à droite de chaque écran et un
   panneau (support_widget.php) ; côté support, la boîte de réception
   (support.php). Les deux montrent les mêmes messages, jamais les
   notes internes côté client. Préfixes : sc (client), sp (support). */
.scbulle{position:fixed;right:22px;bottom:22px;width:52px;height:52px;border-radius:50%;background:var(--terra);border:0;color:#fff;
  box-shadow:0 8px 22px -4px rgba(233,102,70,.55);display:flex;align-items:center;justify-content:center;z-index:70;cursor:pointer;transition:transform .15s}
.scbulle:hover{transform:scale(1.06)}
.scbulle svg{width:23px;height:23px;fill:none;stroke:#fff;stroke-width:2;stroke-linecap:round;stroke-linejoin:round}
.scbulle i{position:absolute;top:-3px;right:-3px;background:var(--rouge);color:#fff;font-style:normal;font-size:10px;font-weight:700;
  border-radius:20px;padding:1px 6px;border:2px solid var(--carte)}
.scbulle i[hidden]{display:none}
.scpan{position:fixed;right:22px;bottom:84px;width:min(370px,calc(100vw - 30px));background:var(--carte);border:1px solid var(--ligne-2);
  border-radius:16px;box-shadow:0 22px 56px -18px rgba(62,43,26,.45);overflow:hidden;z-index:70;display:none;flex-direction:column}
.scpan.on{display:flex;animation:scouvre .22s cubic-bezier(.2,.9,.3,1.2)}
@keyframes scouvre{from{opacity:0;transform:scale(.92) translateY(10px)}to{opacity:1;transform:none}}
.sch{background:var(--terra);color:#fff;padding:12px 14px;display:flex;gap:11px;align-items:center}
.sch .a{width:36px;height:36px;border-radius:50%;background:rgba(255,255,255,.22);display:flex;align-items:center;justify-content:center;
  font:700 12px var(--f-ui);position:relative;flex:none}
.sch .a small{position:absolute;right:-1px;bottom:-1px;width:10px;height:10px;border-radius:50%;background:#7BC96F;border:2px solid var(--terra)}
.sch .a small.off{background:var(--muet)}
.sch b{font-family:var(--f-titre);font-size:14px;font-weight:600;display:block;line-height:1.2}
.sch span{font-size:11.5px;opacity:.9}
.sch .x{margin-left:auto;background:rgba(255,255,255,.2);border:0;color:#fff;width:26px;height:26px;border-radius:50%;font-size:16px;line-height:1;cursor:pointer;flex:none}
.sctabs{display:flex;border-bottom:1px solid var(--ligne);background:var(--surface-2)}
.sctabs button{flex:1;background:none;border:0;padding:8px;font:600 11.5px var(--f-ui);color:var(--muet);border-bottom:2px solid transparent;cursor:pointer}
.sctabs button.on{color:var(--terra);border-bottom-color:var(--terra)}
.schors{background:var(--jaune-pale);color:var(--jaune);font-size:11.5px;padding:7px 13px;border-bottom:1px solid #E8D9AE;display:flex;gap:7px;align-items:flex-start;line-height:1.45}
.schors svg{width:14px;height:14px;flex:none;margin-top:2px;stroke:currentColor;fill:none;stroke-width:2}
.scfil{padding:13px;display:flex;flex-direction:column;gap:8px;height:300px;overflow:auto;background:var(--surface-2);scroll-behavior:smooth}
.scjour{text-align:center;font-size:10.5px;color:var(--muet);font-weight:600;letter-spacing:.05em;text-transform:uppercase;margin:4px 0}
.scmsg{max-width:84%;padding:9px 12px;border-radius:14px;font-size:12.5px;line-height:1.55;position:relative;animation:scmsgin .2s ease}
@keyframes scmsgin{from{opacity:0;transform:translateY(6px)}to{opacity:1;transform:none}}
.scmsg.client{background:var(--terra);color:#fff;align-self:flex-end;border-bottom-right-radius:4px}
.scmsg.client a{color:#fff}
.scmsg.support{background:var(--carte);border:1px solid var(--ligne);align-self:flex-start;border-bottom-left-radius:4px}
.scmsg.systeme{align-self:center;background:none;color:var(--muet);font-size:11px;text-align:center;max-width:92%;padding:2px}
.scmsg .q{display:block;font-size:10px;opacity:.7;margin-bottom:3px;font-weight:600}
.scmsg .h{display:block;font-size:10px;opacity:.6;margin-top:4px;text-align:right}
.sclien{display:flex;gap:9px;align-items:center;margin-top:8px;padding:8px 10px;border:1px solid var(--ligne);border-radius:9px;
  background:var(--surface-2);font-size:11.5px;font-weight:600;color:var(--terra);text-decoration:none}
.sclien:hover{background:var(--terra-pale);border-color:var(--terra)}
.sclien svg{width:16px;height:16px;flex:none;stroke:currentColor;fill:none;stroke-width:2}
.sclien span{display:block;font-weight:400;color:var(--muet);font-size:11px;margin-top:1px}
.sctape{align-self:flex-start;background:var(--carte);border:1px solid var(--ligne);border-radius:14px;padding:9px 12px;display:flex;gap:4px;border-bottom-left-radius:4px}
.sctape i{width:6px;height:6px;border-radius:50%;background:var(--muet);animation:scpt 1.2s infinite}
.sctape i:nth-child(2){animation-delay:.15s}.sctape i:nth-child(3){animation-delay:.3s}
@keyframes scpt{0%,60%,100%{opacity:.28;transform:translateY(0)}30%{opacity:1;transform:translateY(-2px)}}
.scdefl{padding:0 13px 8px;background:var(--surface-2)}
.scdefl:empty{display:none}
.scdefl>div{background:var(--carte);border:1px solid var(--ligne);border-radius:10px;padding:8px 10px;font-size:11.5px}
.scdefl b{display:block;font-size:10.5px;color:var(--muet);text-transform:uppercase;letter-spacing:.06em;margin-bottom:5px}
.scdefl a{display:block;padding:5px 4px;font-size:12px;color:var(--terra);font-weight:600;border-radius:6px;text-decoration:none}
.scdefl a:hover{background:var(--terra-pale)}
.scz{border-top:1px solid var(--ligne);padding:9px 11px;display:flex;gap:7px;align-items:flex-end;background:var(--carte)}
.scz textarea{flex:1;border:1px solid var(--ligne-2);border-radius:18px;padding:9px 13px;font:400 12.5px var(--f-ui);resize:none;min-height:38px;max-height:110px;background:var(--carte);color:var(--encre)}
.scz textarea:focus{outline:none;border-color:var(--terra);box-shadow:0 0 0 3px var(--terra-pale)}
.scz .env{background:var(--terra);border:0;color:#fff;width:36px;height:36px;border-radius:50%;flex:none;display:flex;align-items:center;justify-content:center;cursor:pointer;transition:transform .12s}
.scz .env:hover{transform:scale(1.06)}
.scz .env svg{width:16px;height:16px;fill:none;stroke:#fff;stroke-width:2.2;stroke-linecap:round;stroke-linejoin:round}
.scsatis{padding:14px;text-align:center;background:var(--surface-2);border-top:1px solid var(--ligne)}
.scsatis b{font-family:var(--f-titre);font-size:13px;font-weight:600;display:block;margin-bottom:8px}
.scsatis .et{display:flex;gap:4px;justify-content:center}
.scsatis .et button{background:none;border:0;font-size:22px;color:var(--ligne-2);transition:all .12s;line-height:1;cursor:pointer}
.scsatis .et button.on,.scsatis .et button:hover{color:#E9A73B;transform:scale(1.12)}
.schist{padding:10px 13px;height:300px;overflow:auto;background:var(--surface-2)}
.schist button{display:block;width:100%;text-align:left;background:var(--carte);border:1px solid var(--ligne);border-radius:10px;padding:9px 11px;margin-bottom:7px;cursor:pointer;font-family:var(--f-ui)}
.schist button b{font-size:12.5px;display:block;color:var(--encre)}
.schist button span{font-size:11px;color:var(--muet)}
.schist button i{float:right;font-style:normal;font-size:10.5px;font-weight:700;color:var(--vert)}
.schist .n{font-size:11px;color:var(--muet);padding:6px 2px;line-height:1.6}
@media print{.scbulle,.scpan{display:none!important}}

/* la console */
.spinbox{display:grid;grid-template-columns:290px minmax(0,1fr) 250px;min-height:calc(100vh - 140px);border:1px solid var(--ligne);border-radius:var(--r);overflow:hidden;background:var(--carte)}
.spl{border-right:1px solid var(--ligne);display:flex;flex-direction:column;min-width:0}
.spf{padding:10px 12px;border-bottom:1px solid var(--ligne);display:flex;gap:5px;flex-wrap:wrap;background:var(--surface-2)}
.spf button{border:1px solid var(--ligne-2);background:var(--carte);border-radius:20px;padding:4px 10px;font:600 11px var(--f-ui);color:var(--encre-2);cursor:pointer}
.spf button.on{border-color:var(--terra);color:var(--terra);background:var(--terra-pale)}
.spf .fi{margin-top:4px}
.spl .lst{flex:1;overflow:auto}
.spcv{padding:11px 13px;border-bottom:1px solid var(--ligne);cursor:pointer;border-left:3px solid transparent;transition:background .12s}
.spcv:hover{background:var(--surface-2)}
.spcv.on{background:var(--terra-pale);border-left-color:var(--terra)}
.spcv .l1{display:flex;align-items:center;gap:7px;margin-bottom:2px}
.spcv .l1 b{font-size:12.5px;font-weight:600;flex:1;min-width:0;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.spcv .l1 time{font-size:10.5px;color:var(--muet)}
.spcv .l1 i{font-style:normal;background:var(--terra);color:#fff;font-size:10px;font-weight:700;border-radius:20px;padding:0 6px}
.spcv .l2{font-size:11.5px;color:var(--muet);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.spcv .l3{display:flex;gap:5px;margin-top:5px;flex-wrap:wrap}
.spvide{padding:30px 16px;text-align:center;color:var(--muet);font-size:12.5px;line-height:1.6}
.spm{display:flex;flex-direction:column;min-width:0;position:relative;max-height:calc(100vh - 140px)}
.sph{padding:11px 16px;border-bottom:1px solid var(--ligne);display:flex;align-items:center;gap:10px;flex-wrap:wrap}
.sph>div:not(.tav){flex:1;min-width:180px}
.sph b{font-family:var(--f-titre);font-size:14px;font-weight:600}
.sph span{font-size:11.5px;color:var(--muet)}
.sph .a2{display:flex;gap:6px;flex-wrap:wrap;align-items:center}
.spchat{padding:16px;display:flex;flex-direction:column;gap:9px;flex:1;min-height:220px;overflow:auto;background:var(--surface-2);scroll-behavior:smooth}
.spmsg{max-width:76%;padding:9px 12px;border-radius:14px;font-size:12.5px;line-height:1.55;position:relative;animation:scmsgin .2s ease}
.spmsg.client{background:var(--carte);border:1px solid var(--ligne);align-self:flex-start;border-bottom-left-radius:4px}
.spmsg.support{background:var(--terra-pale);border:1px solid #F3C7B8;align-self:flex-end;border-bottom-right-radius:4px}
.spmsg.note{background:var(--jaune-pale);border:1px dashed #E8D9AE;align-self:flex-end;color:#6B4A0C}
.spmsg.note .q::after{content:' · note interne, invisible du client'}
.spmsg.systeme{align-self:center;background:none;color:var(--muet);font-size:11px;text-align:center;padding:2px}
.spmsg .q{display:block;font-size:10px;color:var(--muet);margin-bottom:3px;font-weight:600}
.spmsg .sclien{margin-top:7px;padding:7px 9px}
.sprep{border-top:1px solid var(--ligne);background:var(--surface-2);position:relative}
.sprep .out{display:flex;gap:5px;padding:8px 12px 0;flex-wrap:wrap}
.sprep .out button{border:1px solid var(--ligne-2);background:var(--carte);border-radius:7px;padding:4px 9px;font:600 11px var(--f-ui);color:var(--encre-2);display:inline-flex;align-items:center;gap:5px;cursor:pointer}
.sprep .out button:hover{border-color:var(--terra);color:var(--terra)}
.sprep .out button svg{width:12px;height:12px;fill:none;stroke:currentColor;stroke-width:2;stroke-linecap:round}
.sprep .out button.on{border-color:var(--jaune);color:var(--jaune);background:var(--jaune-pale)}
.sprep .z{padding:8px 12px 10px;display:flex;gap:8px;align-items:flex-end}
.sprep textarea{flex:1;border:1px solid var(--ligne-2);border-radius:10px;padding:9px 12px;font:400 12.5px var(--f-ui);resize:none;min-height:44px;max-height:140px;background:var(--carte);color:var(--encre)}
.sprep textarea:focus{outline:none;border-color:var(--terra);box-shadow:0 0 0 3px var(--terra-pale)}
.sprep textarea.note{background:var(--jaune-pale);border-color:#E8D9AE}
.spmac{position:absolute;bottom:66px;left:12px;right:12px;background:var(--carte);border:1px solid var(--ligne-2);border-radius:10px;box-shadow:var(--ombre-2);z-index:20;max-height:220px;overflow-y:auto}
.spmac[hidden]{display:none}
.spmac button{display:block;width:100%;text-align:left;background:none;border:0;border-bottom:1px solid var(--ligne);padding:8px 12px;font:400 12px var(--f-ui);color:var(--encre);cursor:pointer}
.spmac button:hover,.spmac button.k{background:var(--surface-2)}
.spmac button b{color:var(--terra);font-weight:700;margin-right:6px}
.spmac button span{color:var(--muet)}
.spr{border-left:1px solid var(--ligne);background:var(--surface-2);padding:14px 13px;font-size:12px;overflow:auto}
.spr .t{font-size:10.5px;font-weight:600;color:var(--muet);letter-spacing:.07em;text-transform:uppercase;margin:0 0 8px}
.spr .t.b2{margin-top:16px}
.spkv{display:flex;justify-content:space-between;gap:8px;padding:4px 0;border-bottom:1px solid var(--ligne)}
.spkv:last-of-type{border-bottom:0}
.spkv span{color:var(--muet);flex:none}
.spkv b{font-weight:600;text-align:right;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.spr .lus{font-size:11.5px;line-height:1.7;color:var(--encre-2)}
.spr .lus div{display:flex;gap:7px;align-items:baseline}
.spr .lus time{color:var(--muet);font-size:10.5px;min-width:40px;flex:none}
.spsug{display:block;width:100%;text-align:left;background:var(--carte);border:1px solid var(--ligne);border-radius:8px;padding:7px 9px;margin-bottom:5px;font:600 11.5px var(--f-ui);color:var(--encre-2);cursor:pointer}
.spsug:hover{border-color:var(--terra);color:var(--terra)}
.spsug small{display:block;font-weight:400;color:var(--muet);font-size:10.5px}
.spr .act{display:flex;flex-direction:column;gap:5px}
.spr .act .btn{justify-content:flex-start}
@media(max-width:1180px){.spinbox{grid-template-columns:260px minmax(0,1fr)}.spr{display:none}}
/* v14.9.1 — habillage : la pièce jointe, « vu », l'agent */
.scz .ic2{background:none;border:0;color:var(--muet);width:32px;height:32px;border-radius:50%;display:flex;align-items:center;justify-content:center;cursor:pointer;flex:none}
.scz .ic2:hover{background:var(--surface-2);color:var(--encre)}
.scz .ic2 svg{width:17px;height:17px;stroke:currentColor;fill:none;stroke-width:1.9}
.scimg{display:block;margin-top:8px;border-radius:9px;overflow:hidden;border:1px solid rgba(255,255,255,.35);max-width:240px}
.scimg img{display:block;width:100%;height:auto}
.scmsg.client.vu .h::after{content:' · vu'}
.spmsg.support.vu .q::after{content:' · vu par le client'}
.spmsg .scimg{border-color:var(--ligne)}
.sptape{align-self:flex-start;font-size:11.5px;color:var(--muet);display:flex;gap:8px;align-items:center}
.sptape i{width:6px;height:6px;border-radius:50%;background:var(--muet);animation:scpt 1.2s infinite}
.sptape i:nth-child(2){animation-delay:.15s}.sptape i:nth-child(3){animation-delay:.3s}
.spcv .att2{font-size:10.5px;font-weight:700;color:var(--rouge);display:inline-flex;align-items:center;gap:4px}
.spcv .att2::before{content:'';width:6px;height:6px;border-radius:50%;background:var(--rouge);animation:scbat 1.4s infinite}
@keyframes scbat{0%,100%{opacity:1}50%{opacity:.2}}
.spstat{display:grid;grid-template-columns:repeat(auto-fit,minmax(200px,1fr));gap:11px;margin-bottom:14px}
.spstat>div{background:var(--carte);border:1px solid var(--ligne);border-radius:12px;padding:13px 15px}
.spstat b{display:block;font-family:var(--f-titre);font-size:24px;line-height:1;font-weight:700}
.spstat span{display:block;font-size:11.5px;color:var(--muet);margin-top:5px}
.spstat .tr{font-size:11px;font-weight:600;margin-top:5px;display:inline-block;color:var(--encre-2)}
.spbarres{display:flex;gap:6px;align-items:flex-end;height:110px;padding:18px 15px 22px}
.spbarres div{flex:1;background:var(--terra-pale);border-radius:4px 4px 0 0;position:relative;min-height:2px}
.spbarres div:hover{background:var(--terra)}
.spbarres div span{position:absolute;bottom:-18px;left:0;right:0;text-align:center;font-size:9.5px;color:var(--muet)}
.spbarres div b{position:absolute;top:-16px;left:0;right:0;text-align:center;font-size:10px;color:var(--encre-2)}
.spli{display:flex;align-items:center;gap:10px;padding:9px 15px;border-bottom:1px solid var(--ligne);font-size:12.5px}
.spli:last-child{border-bottom:0}
.spli b{font-weight:600;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;flex:1}
.spli .g{margin-left:auto;color:var(--muet);font-size:11.5px;white-space:nowrap;display:flex;gap:8px;align-items:center}
.spli .bar{width:80px;height:5px;background:var(--ligne);border-radius:3px;overflow:hidden}
.spli .bar i{display:block;height:100%;background:var(--vert)}
.spli .bar i.ko{background:var(--rouge)}
.sphor{display:grid;grid-template-columns:110px 1fr 1fr;gap:8px 12px;align-items:center;font-size:12.5px}
.sphor .fi{padding:6px 9px}
.spmacl{display:grid;grid-template-columns:130px 1fr 34px;gap:8px;align-items:start;margin-bottom:8px}
.spmacl .fi{padding:7px 10px;font-size:12.5px}

/* ═══ EMBAUCHER QUELQU'UN ═══                                (v14.11)
   Un formulaire ordinaire dans une modale large : rien de propre à
   cet écran sinon le filet qui sépare la personne de son contrat, et
   la carte du récapitulatif.

   ── CE QUI A ÉTÉ RETIRÉ ──                                (v14.10)
   « .embt », « .col1/.col2 », « .embact », « .embajout » et la
   troisième largeur de modale « .modal-box.xl » habillaient une
   grille de sept colonnes, une ligne par personne, en champs de
   31 px. Elle est partie avec le lot : on embauche une personne à la
   fois, avec les champs de tout le monde. Deux largeurs de modale
   suffisent de nouveau. */
.embfilet{height:1px;background:var(--ligne);margin:18px 0}
.embrec{border:1px solid var(--ligne);border-radius:12px;overflow:hidden;margin-bottom:14px}
.embrec .docic{font-weight:700;letter-spacing:.06em}
.embrec2{grid-template-columns:1fr 1fr}
.embrec2 .blocq{margin-top:0}

/* ═══ LES TÂCHES ═══                                        (v14.29)

   La pastille est le seul élément de tout ce bloc qui compte
   vraiment : c'est elle qu'on vise, elle qu'on clique, et elle qui
   dit l'état. Ronde — la case carrée est un formulaire, le rond est
   un geste —, à gauche du titre, et de la même taille partout : dans
   la liste, dans la bande du planning, sur la borne.

   Ce qui est fait ne disparaît pas : il pâlit et se barre. Un
   élément qui s'efface fait douter d'avoir cliqué. */
.tkgrp{display:flex;align-items:center;gap:8px;font-size:11px;font-weight:700;
  letter-spacing:.1em;text-transform:uppercase;color:var(--muet);margin:20px 0 9px}
.tkgrp:first-of-type{margin-top:14px}
.tkgrp .n{background:var(--carte);border:1px solid var(--ligne);border-radius:20px;
  padding:1px 7px;font-size:10.5px;letter-spacing:0;color:var(--encre-2)}
.tkgrp.al{color:var(--rouge)}
.tkgrp.al .n{border-color:#EBC9CB;color:var(--rouge)}

.tkl{display:flex;flex-direction:column;gap:7px}
.tkli{display:flex;gap:11px;align-items:flex-start;background:var(--carte);
  border:1px solid var(--ligne);border-radius:11px;padding:11px 13px;
  transition:background .14s,border-color .14s,opacity .14s}
.tkli:hover{border-color:var(--ligne-2)}
.tkli.tkretard{border-color:#F0C9CB;background:#FFFCFC}
.tkli.tkfait{background:var(--surface-2);border-style:dashed}
.tkli.tkfait .tkti{color:var(--muet);text-decoration:line-through}
/* L'enregistrement a échoué : la pastille est revenue en arrière, et
   la ligne le dit deux secondes. Un geste qui ne prend pas sans le
   dire est pire qu'un geste refusé. */
.tkli.tkrate{border-color:var(--rouge);box-shadow:0 0 0 3px rgba(196,60,67,.12)}

/* ── LA COCHE EST DESSINÉE, PAS ÉCRITE ──                  (v14.30)
   Elle était le caractère « ✓ » : sa forme, son épaisseur et son
   centrage dépendaient alors de la police qui l'attrapait, et le
   résultat était lourd et posé de travers. Deux bordures et une
   rotation donnent un trait net, centré au pixel, qui suit la taille
   de la case sans jamais s'épaissir tout seul.

   Carré aux angles doux plutôt que rond : c'est une case qu'on
   coche. Le rond reste aux bandes du planning, où la case doit se
   distinguer de l'aplat qui la porte. */
.tkck{width:19px;height:19px;flex:none;margin-top:1px;border:1.6px solid var(--ligne-2);
  border-radius:6px;background:#fff;cursor:pointer;padding:0;position:relative;
  transition:background .13s,border-color .13s}
.tkck:hover:not(:disabled){border-color:var(--vert);background:var(--vert-pale)}
.tkck:disabled{cursor:default;opacity:.55}
.tkck.on{background:var(--vert);border-color:var(--vert)}
.tkck.on:hover:not(:disabled){background:var(--vert)}
.tkck::after{content:'';position:absolute;left:50%;top:48%;width:5px;height:9px;
  border:solid #fff;border-width:0 2px 2px 0;transform:translate(-50%,-56%) rotate(45deg) scale(.4);
  opacity:0;transition:opacity .12s,transform .12s}
.tkck.on::after{opacity:1;transform:translate(-50%,-56%) rotate(45deg) scale(1)}
.tkck.sm{width:15px;height:15px;margin:0;cursor:default;border-radius:5px}
.tkck.sm::after{width:4px;height:7px;border-width:0 1.7px 1.7px 0}

.tkc{flex:1;min-width:0}
/* Le titre est un BOUTON depuis la v14.33 : il ouvre l'historique.
   Il n'en a pas l'air — c'est un titre de ligne, pas une action — et
   ne se signale qu'au survol. Un bouton qui ressemble à un bouton
   dans chaque ligne d'une liste de soixante ferait un écran de
   boutons. */
.tkti{font-size:13.5px;font-weight:600;line-height:1.35;color:var(--encre);
  border:0;background:none;padding:0;margin:0;text-align:left;cursor:pointer;
  font-family:inherit;display:block;width:100%}
.tkti:hover{color:var(--terra-h);text-decoration:underline;text-underline-offset:2px}
.tkti:focus-visible{outline:2px solid var(--terra);outline-offset:2px;border-radius:4px}

/* ── L'HISTOIRE D'UNE CONSIGNE ──                         (v14.33)
   Une ligne par fois où elle est tombée. Le filet à gauche dit
   l'état sans mot : vert faite, rouge pas faite, rien pour ce qui
   n'est pas encore arrivé. */
.tkh{border:1px solid var(--ligne);border-radius:12px;padding:13px 15px;margin-bottom:14px;
  background:var(--surface-2)}
.tkhq{display:flex;align-items:baseline;gap:10px;flex-wrap:wrap;margin-bottom:7px}
.tkhq b{font-family:var(--f-titre);font-size:21px;font-weight:600;color:var(--encre)}
.tkhq span{font-size:12px;color:var(--muet)}
.tkhd{font-size:12.5px;color:var(--encre-2);line-height:1.5}
.tkh .tkhd + .tkhd{margin-top:3px}

.tkhl{display:grid;grid-template-columns:112px minmax(0,1fr);gap:12px;align-items:start;
  padding:9px 0 9px 11px;border-left:3px solid var(--ligne-2);margin-bottom:2px}
.tkhl.ok{border-left-color:var(--vert)}
.tkhl.retard{border-left-color:var(--rouge)}
.tkhl > .tkhd{padding-top:1px}
.tkhtx b{display:block;font-size:13px;font-weight:600;color:var(--encre)}
.tkhl.retard .tkhtx b{color:var(--rouge)}
.tkhtx > span{display:block;font-size:12.5px;color:var(--muet);margin-top:2px}
/* Le commentaire : ce pour quoi cet écran existe. Il se lit, il ne
   se devine pas — donc en encre pleine, pas en gris de légende. */
.tkhm{color:var(--encre-2)!important;background:#fff;border:1px solid var(--ligne);
  border-radius:9px;padding:7px 10px;margin-top:5px!important;line-height:1.5}
@media(max-width:560px){
  .tkhl{grid-template-columns:minmax(0,1fr);gap:2px}
}
.tkds{font-size:12px;color:var(--encre-2);margin-top:3px}
.tkmt{display:flex;flex-wrap:wrap;align-items:center;gap:7px;margin-top:5px;
  font-size:11.5px;color:var(--muet)}
.tkmt .h{font-weight:600;color:var(--encre-2)}
.tkqi{color:var(--muet)}
.tkfp{color:var(--vert);font-weight:600}
.tkmt .pill.rep{background:var(--surface-2);border:1px solid var(--ligne);color:var(--muet);
  font-weight:600;text-transform:none;letter-spacing:0}
.tksub{list-style:none;margin:8px 0 0;padding-left:11px;border-left:2px solid var(--ligne)}
.tksub li{display:flex;align-items:center;gap:8px;padding:3px 0;font-size:12.5px;color:var(--encre-2)}
.tkdr{flex:none;display:flex;gap:6px;align-items:center;opacity:0;transition:opacity .14s}
.tkli:hover .tkdr,.tkli:focus-within .tkdr{opacity:1}

.tkvide{display:flex;flex-direction:column;align-items:center;gap:9px;text-align:center;
  padding:38px 24px}
.tkvide b{font-family:var(--f-titre);font-size:15px}
.tkvide span{font-size:13px;color:var(--muet);max-width:420px;line-height:1.55}
.tkvide .tkvi{width:26px;height:26px;stroke:var(--ligne-2)}

/* ── Le tiroir de création ── */
.tkqui{display:flex;flex-wrap:wrap;gap:6px;align-items:center;min-height:42px;
  border:1px solid var(--ligne-2);border-radius:10px;padding:7px;background:#fff}
.tkqui.vide::before{content:'Personne pour l\'instant';font-size:12.5px;color:#BFB2A0;
  padding-left:4px}
.tktag{display:inline-flex;align-items:center;gap:6px;border-radius:8px;padding:4px 8px;
  font-size:12px;font-weight:600;background:var(--surface-2);color:var(--encre-2)}
.tktag.equipe{background:var(--bleu-pale);color:var(--bleu)}
.tktag.poste{background:var(--terra-pale);color:var(--terra-h)}
.tktag.salarie{background:var(--violet-pale);color:var(--violet)}
.tktag.presents,.tktag.ouvrant,.tktag.fermant{background:var(--jaune-pale);color:var(--jaune)}
.tktag .tkx{border:0;background:none;cursor:pointer;color:inherit;opacity:.55;font-size:14px;
  line-height:1;padding:0 1px}
.tktag .tkx:hover{opacity:1}

/* Quatre crans, quatre parts égales : « flex:1 » sur une base
   automatique donnait quatre largeurs de mot (v14.31). */
.tkseg{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:3px;
  background:var(--surface-2);border:1px solid var(--ligne);border-radius:10px;padding:3px}
.tkseg button{border:0;background:none;border-radius:7px;padding:7px 6px;
  font-size:12px;font-weight:600;color:var(--encre-2);cursor:pointer}
.tkseg button.on{background:var(--encre);color:#fff}

/* ── LES LISTES, DANS LA POP-UP ──                        (v14.31)
   Un nom, une palette, ce qu'on en fait : trois rangs, et non trois
   colonnes. Les huit teintes ne tiennent pas à côté d'un champ sans
   écraser l'un ou l'autre. */
.tklrow{display:grid;gap:9px;padding:12px 0;border-bottom:1px solid var(--surface-2)}
.tklrow:last-child{border-bottom:0}
.tklrow .swgrid{padding:0}
.tklrow .tklact{display:flex;gap:8px;justify-content:flex-end}
#tkLNew{border-bottom:0}

/* ── La bande du planning ──
   Une tâche par bande, sur les jours qu'elle couvre. Le compteur
   agrégé (« 3/4 ») a été écarté : il obligeait à ouvrir quelque
   chose pour savoir de quoi il parlait, et le geste d'un clic
   disparaissait derrière un tiroir. */
.pl2 .tkrow{border-top:1px solid var(--ligne);border-bottom:1px solid var(--ligne);
  background:#FCFAF5}
.pl2 .tkrow .tklab{display:flex;align-items:center;gap:7px;padding:5px 12px;
  font-size:10px;font-weight:700;letter-spacing:.06em;text-transform:uppercase;
  color:var(--muet);background:var(--surface-2)}
.pl2 .tkrow .tklab .ico{width:12px;height:12px;stroke:currentColor;fill:none;stroke-width:1.9}
.tkcell{display:flex;flex-direction:column;gap:3px;padding:4px;min-height:26px;
  border-left:1px solid var(--surface-2);min-width:0}
.tkcell.we{background:#FBF8F1}
.tkcell.today{background:var(--auj)}
.tbnd{display:flex;align-items:center;gap:6px;border-radius:5px;padding:3px 7px;
  font-size:10px;font-weight:600;line-height:1.3;min-width:0;
  background:var(--bleu);color:#fff}
.tbnd .tbti{overflow:hidden;white-space:nowrap;text-overflow:ellipsis}
.tbnd.retard{background:var(--rouge)}
.tbnd.faite{background:#BFCCEA;color:#42527F}
.tbnd.faite .tbti{text-decoration:line-through}
.tbnd .tkck{width:13px;height:13px;margin:0;background:transparent;border-radius:50%;
  border-width:1.5px;border-color:rgba(255,255,255,.85)}
.tbnd .tkck::after{width:3px;height:6px;border-width:0 1.6px 1.6px 0;border-color:#fff}
.tbnd .tkck.on{background:transparent}
.tbnd.faite .tkck{border-color:#42527F}
.tbnd.faite .tkck::after{border-color:#42527F}
/* Sur un aplat coloré, la case ne se remplit pas : c'est le trait
   qui apparaît. Un carré blanc plein sur du bleu ferait un trou. */
.tbnd .tkck:hover:not(:disabled){border-color:#fff;background:rgba(255,255,255,.18)}
/* Une tâche qui demande un commentaire ne se coche pas depuis une
   bande : la pastille laisse la place à trois points qui mènent à
   l'écran des tâches, où la question tient.            (v14.32) */
.tbmot{width:13px;height:13px;flex:none;display:flex;align-items:center;justify-content:center;
  border:1.5px dashed rgba(255,255,255,.85);border-radius:50%;color:#fff;
  font-size:9px;line-height:1;text-decoration:none;letter-spacing:-.5px}
.tbmot:hover{background:rgba(255,255,255,.22);border-style:solid}
.tbnd.faite .tbmot{border-color:#42527F;color:#42527F}
.tbsuite{display:block;padding:1px 7px;font-size:9.5px;color:var(--muet);
  text-decoration:none}
.tbsuite:hover{color:var(--terra-h)}

/* Masquable depuis le menu Affichage, comme les autres familles. */
body.sans-taches .tkrow{display:none}
/* Le retard répété : « non fait 21 fois depuis le 20 août ». Le
   nombre compte plus que la date de chacune (v14.29). */
.tkmanq{color:var(--rouge);font-weight:600}
/* Le sélecteur d'établissement de l'écran Tâches : 360 px le
   faisaient passer sur un second étage à côté de « Nouvelle tâche »,
   et la barre d'actions montait à deux lignes (v14.29.2). */
.tkselw{display:block}
.tkselw .psel{width:min(258px,100%)}

/* ═══ LES LISTES, LES COULEURS, L'AGENDA ═══                (v14.30)

   La couleur d'une tâche n'est pas un aplat : c'est un filet de deux
   pixels à gauche de la carte. Un fond teinté entrerait en
   concurrence avec les deux seuls états qui doivent se voir de loin
   — fait et en retard — et une liste « Rouge » ferait passer ses
   tâches pour des urgences. */
.tkfil{display:flex;flex-wrap:wrap;gap:6px;align-items:center;margin:14px 0 4px}
.tkfc{display:inline-flex;align-items:center;gap:6px;border:1px solid var(--ligne-2);
  background:var(--carte);border-radius:20px;padding:5px 12px;font-size:12px;font-weight:600;
  color:var(--encre-2);text-decoration:none;cursor:pointer}
.tkfc:hover{border-color:var(--muet);color:var(--encre)}
.tkfc.on{background:var(--encre);border-color:var(--encre);color:#fff}
.tkfc b{font-weight:700;opacity:.55;font-size:11px}
.tkfc .tkpt{width:8px;height:8px;border-radius:50%;background:var(--tkc,var(--ligne-2));
  display:block;flex:none}
.tkfadd{border-style:dashed;color:var(--muet)}

.tkli.tkcol{border-left:3px solid var(--tkc);padding-left:11px}
.tkli2{background:var(--surface-2);border:1px solid var(--ligne);border-radius:20px;
  padding:1px 8px;font-size:11px;font-weight:600;color:var(--encre-2)}
.tkech{display:inline-flex;align-items:center;gap:4px;font-weight:600;color:var(--encre-2)}
.tkech.urg{color:var(--rouge)}
.tkech .i{width:12px;height:12px;stroke:currentColor;fill:none;stroke-width:2}
.tkpj{display:inline-flex;align-items:center;gap:3px;color:var(--muet);font-weight:600}
.tkpj .i{width:12px;height:12px;stroke:currentColor;fill:none;stroke-width:2}

/* ── L'AGENDA ──
   Le mois pour voir la répartition, pas pour lire le détail : trois
   pastilles par jour, puis « +N ». Une case fait cent-cinquante
   pixels, et la quatrième ligne écrase la date. */
.tkagh{display:flex;align-items:center;gap:8px;margin:16px 0 10px}
.tkagh b{font-family:var(--f-titre);font-size:16px;font-weight:600;min-width:160px}
.tkagh .btn svg{width:14px;height:14px}
.tkcal{display:grid;grid-template-columns:repeat(7,1fr)}
.tkcth{padding:9px 8px;text-align:center;background:var(--surface-2);
  border-bottom:1px solid var(--ligne);font:600 10.5px/1 var(--f-ui);color:var(--muet);
  letter-spacing:.08em;text-transform:uppercase}
.tkcj{min-height:104px;padding:6px 7px;border-right:1px solid var(--ligne);
  border-bottom:1px solid var(--ligne);display:flex;flex-direction:column;gap:3px;min-width:0}
.tkcj:nth-child(7n){border-right:0}
.tkcj .d{font:600 12px var(--f-titre);color:var(--encre-2)}
.tkcj.hors{background:var(--surface-2)}
.tkcj.we{background:#FBF8F1}
.tkcj.auj{background:var(--terra-pale)}
.tkcj.auj .d{color:var(--terra-h)}
.tkcq{display:flex;align-items:center;gap:5px;border-radius:5px;padding:2px 6px;
  font-size:10.5px;font-weight:600;line-height:1.3;min-width:0;
  background:var(--surface-2);border:1px solid var(--ligne);color:var(--encre-2)}
.tkcqt{overflow:hidden;white-space:nowrap;text-overflow:ellipsis}
.tkcq.faite{background:var(--vert-pale);border-color:#CBDBB9;color:var(--vert)}
.tkcq.faite .tkcqt{text-decoration:line-through}
.tkcq.retard{background:var(--rouge-pale);border-color:#F0C9CB;color:var(--rouge)}
.tkcq .tkck{width:13px;height:13px;margin:0;border-radius:4px;border-width:1.4px}
.tkcq .tkck::after{width:3px;height:6px;border-width:0 1.5px 1.5px 0}
.tkcplus{font-size:10px;color:var(--muet);padding:0 6px}
.tkcleg{font-size:12px;color:var(--muet);margin-top:10px;max-width:720px}
/* Les pièces d'une tâche : le nom du fichier, pas un compteur. Un
   lien qui dit « 2 pièces » sans dire lesquelles n'aide personne. */
.tkpjl{display:flex;flex-wrap:wrap;gap:6px;margin-top:7px}
.tkpjc{display:inline-flex;align-items:center;gap:4px;background:var(--surface-2);
  border:1px solid var(--ligne);border-radius:7px;padding:3px 8px;font-size:11.5px}
.tkpjc a{display:inline-flex;align-items:center;gap:5px;color:var(--encre-2);
  text-decoration:none;font-weight:600;max-width:230px;overflow:hidden;
  white-space:nowrap;text-overflow:ellipsis}
.tkpjc a:hover{color:var(--terra-h)}
.tkpjc .i{width:12px;height:12px;stroke:currentColor;fill:none;stroke-width:2;flex:none}
.tkpjc form{display:inline-flex}
.tkpjc button{border:0;background:none;color:var(--muet);cursor:pointer;font-size:14px;
  line-height:1;padding:0 1px}
.tkpjc button:hover{color:var(--rouge)}
.tkpjf{display:inline-flex}
.tkpjf .btn svg{width:13px;height:13px}

/* ═══ L'ÉMARGEMENT SUR LA CARTE ═══                        (v14.49)
   Les pointages mobiles de la période, posés en SVG par-dessus un
   fond statique demandé une fois. Ce qui compte, c'est le rouge :
   les pointages hors du périmètre. Le vert est là pour dire que le
   reste va bien — petit et pâle, pour ne pas concurrencer. */
.cpgf{display:flex;align-items:center;gap:10px;flex-wrap:wrap;margin-bottom:14px}
.cpgf .emsp{flex:1}
.cpgk{font-size:12.5px;color:var(--muet);background:var(--carte);border:1px solid var(--ligne);
  border-radius:10px;padding:7px 12px;white-space:nowrap}
.cpgk b{font-family:var(--f-titre);font-size:16px;font-weight:700;color:var(--encre);margin-right:4px}
.cpgk.ko b{color:var(--rouge)}
.cpgk.ok b{color:var(--vert-fonce)}
.cpg{display:grid;grid-template-columns:auto minmax(0,1fr);gap:18px;align-items:start}
@media (max-width:1300px){.cpg{grid-template-columns:1fr}.cpgw{max-width:100%}}
.cpgw{position:relative;border-radius:10px;overflow:hidden;border:1px solid var(--ligne);
  background:#EEF0EA;flex:none}
.cpgm{display:block;max-width:100%;height:auto}
.cpgv{position:absolute;inset:0;width:100%;height:100%}
.cpgp{fill:rgba(163,69,39,.08);stroke:var(--terra);stroke-width:1.5;stroke-dasharray:5 4}
.cpge{fill:var(--terra);stroke:#fff;stroke-width:2}
.cpgl{font:600 10.5px var(--f-ui);fill:var(--encre-2);paint-order:stroke;stroke:#fff;stroke-width:3px;
  stroke-linejoin:round}
.cpgl.et{font-size:12px;font-weight:700;fill:var(--encre)}
.cpgo{fill:var(--vert);opacity:.55;stroke:#fff;stroke-width:1}
.cpgo.hors{fill:var(--rouge);opacity:.95;stroke-width:1.5;cursor:pointer}
.cpgo.hors text{font:600 10.5px var(--f-ui);fill:var(--rouge-fonce);paint-order:stroke;stroke:#fff;stroke-width:3px}
.cpgo.on{stroke:var(--encre);stroke-width:3}
.cpgb rect{fill:var(--encre-2);stroke:#fff;stroke-width:1.5}
.cpgb text{font:600 10.5px var(--f-ui);fill:var(--encre-2);paint-order:stroke;stroke:#fff;stroke-width:3px}
.cpgb.inc rect{fill:var(--muet);opacity:.6}
.cpgb.inc text{fill:var(--muet)}
.cpgr{cursor:pointer}
.cpgr.on td{background:var(--creme-40)}
.lgd .cpgo-l{width:10px;height:10px;border-radius:50%;background:var(--vert);opacity:.7;display:inline-block;
  vertical-align:middle;margin-right:5px}
.lgd .cpgo-l.hors{background:var(--rouge);opacity:1}
.lgd .cpgo-l.marge{background:var(--jaune);opacity:1}
.lgd .cpgb-l{width:12px;height:9px;border-radius:2px;background:var(--encre-2);display:inline-block;
  vertical-align:middle;margin-right:5px}
.cpg .emt{min-width:0}
.cpg .emt td{white-space:normal}

/* ═══ LA CARTE GLISSANTE ═══                               (v14.84)
   « Peut-on avoir la carte interactive et pas une photo ? » Leaflet
   et des tuiles OpenStreetMap, hébergés dans le dépôt : aucune clé,
   aucune facture au chargement, rien qui parte vers un tiers depuis
   le navigateur en dehors des tuiles. */
.cpgw2{width:760px;max-width:100%}
@media (max-width:1300px){.cpgw2{width:100%}}
.cpmap{width:100%;height:520px;background:#EEF0EA}
@media (max-width:900px){.cpmap{height:380px}}
/* L'image de secours occupe la place tant que le script n'a pas pris
   la main — et la garde s'il n'y arrive jamais. Un écran de contrôle
   qui devient blanc parce qu'une librairie manque serait pire que
   l'image fixe qu'on remplace. */
.cpfb{position:absolute;inset:0;display:grid;place-items:center;background:#EEF0EA}
.cpfb .cpgm{position:absolute;inset:0;width:100%;height:100%;object-fit:cover;opacity:.55}
.cpfbt{position:relative;font-size:12px;font-weight:600;color:var(--encre-2);
  background:rgba(255,255,255,.9);border-radius:20px;padding:5px 13px}
.cpsel{width:auto;height:34px;max-width:230px}

/* Les repères. Leaflet pose ses propres classes ; les nôtres ne
   décrivent que ce qu'on dessine dedans. */
.cpmk{background:none;border:none}
.cpmk .pt{display:block;border:2px solid #fff;box-shadow:0 1px 4px rgba(62,43,26,.4)}
.cpmk .et{position:absolute;left:50%;transform:translateX(-50%);white-space:nowrap;
  font:600 10.5px var(--f-ui);color:var(--encre-2);text-shadow:0 0 3px #fff,0 0 3px #fff,0 0 3px #fff}
.cpmk.site .pt{width:16px;height:16px;border-radius:50% 50% 50% 0;transform:rotate(-45deg);
  background:var(--terra);margin:5px}
.cpmk.site .et{top:26px;font-size:12px;font-weight:700;color:var(--encre)}
.cpmk.borne .pt{width:18px;height:14px;border-radius:3px;background:var(--encre-2);margin:2px}
.cpmk.borne .et{top:19px}
.cpmk.borne.inc .pt{background:var(--muet);opacity:.65}
.cpmk.borne.inc .et{color:var(--muet)}
/* Le périmètre et les points gardent les teintes de la version fixe :
   c'est la même lecture, sur un autre fond. */
.leaflet-container .cpgp{fill:var(--terra);fill-opacity:.07;stroke:var(--terra);
  stroke-width:1.5;stroke-dasharray:5 4}
.leaflet-container .cpgo{fill:var(--vert);fill-opacity:.55;stroke:#fff;stroke-width:1.5;
  stroke-opacity:1}
.leaflet-container .cpgo.hors{fill:var(--rouge);fill-opacity:.95;cursor:pointer}
.leaflet-container{font-family:var(--f-ui)}
.leaflet-popup-content-wrapper{border-radius:11px;box-shadow:0 8px 22px rgba(62,43,26,.22);
  border:1px solid var(--ligne)}
.leaflet-popup-content{margin:0;width:250px!important}
.cppop .ph{padding:9px 12px;border-bottom:1px solid var(--ligne)}
.cppop .ph b{display:block;font-family:var(--f-titre);font-size:13px;color:var(--encre)}
.cppop .ph span{display:block;font-size:11px;color:var(--muet);margin-top:1px}
.cppop .pb{padding:8px 12px;display:grid;grid-template-columns:auto 1fr;gap:3px 10px;font-size:11.5px}
.cppop .pb .k{color:var(--muet)}
.cppop .pb .v{font-weight:700;text-align:right;color:var(--encre)}
.cppop .pb .v.ko{color:var(--rouge)}
.cppop .pb .v.ad{font-weight:500;font-size:11px;line-height:1.35}
.cppop .pf{padding:7px 12px;border-top:1px solid var(--ligne);background:var(--surface-2)}
.cplgs:not(:empty){color:var(--jaune);font-weight:600}

/* ═══ LE POINTAGE PORTE UN VISAGE ═══                      (v14.95)

   « Plutôt un rond avec la photo qu'une puce. »

   Et un ROND, pas une goutte : la goutte a sa tête en haut et son
   ancre en bas, la photo y tombe toujours un peu à côté, quoi qu'on
   fasse. Le rond la centre par construction — un carré, et les deux
   anneaux posés en OMBRE autour plutôt qu'en bordure : rien à
   décaler, rien à recentrer.

   L'anneau de couleur porte le verdict ; l'anneau blanc détache le
   visage du fond, qu'il soit plan ou photo aérienne. */
.cppm{background:none;border:0}
.cppm .cpav{position:absolute;left:5px;top:5px;width:34px;height:34px;border-radius:50%;
  display:flex;align-items:center;justify-content:center;overflow:hidden;
  color:#fff;font-family:var(--f-titre);font-size:12px;font-weight:700;letter-spacing:.02em}
.cppm .cpav img{width:100%;height:100%;object-fit:cover;display:block}
.cppm.dedans .cpav{box-shadow:0 0 0 2.5px #6E9A4E,0 0 0 5px #fff,0 3px 9px rgba(40,28,16,.34)}
.cppm.hors .cpav{box-shadow:0 0 0 2.5px var(--rouge),0 0 0 5px #fff,0 3px 9px rgba(40,28,16,.34)}
/* Au-delà du périmètre mais dans la marge : ni vert franc, ni rouge.
   C'est un troisième état, et il en avait besoin d'une couleur. */
.cppm.marge .cpav{box-shadow:0 0 0 2.5px var(--jaune),0 0 0 5px #fff,0 3px 9px rgba(40,28,16,.34)}
.cppm.marge .cppte{border-top:11px solid var(--jaune)}
/* La pointe rend le point d'ancrage EXACT : sans elle, le marqueur
   serait centré sur la position, et deux pointages proches ne se
   distingueraient plus. */
.cppm .cppte{position:absolute;left:50%;top:44px;width:0;height:0;transform:translateX(-50%);
  border-left:6px solid transparent;border-right:6px solid transparent;
  filter:drop-shadow(0 2px 2px rgba(40,28,16,.28))}
.cppm.dedans .cppte{border-top:11px solid #6E9A4E}
.cppm.hors .cppte{border-top:11px solid var(--rouge)}
/* Quatre gestes à la même porte : le compte, pas quatre marqueurs. */
.cppm .cpn{position:absolute;right:-1px;top:-2px;background:var(--encre);color:#fff;
  border-radius:99px;min-width:20px;height:20px;padding:0 5px;display:flex;align-items:center;
  justify-content:center;font-family:var(--f-titre);font-size:10.5px;font-weight:700;
  box-shadow:0 0 0 2.5px #fff,0 1px 3px rgba(40,28,16,.3)}
.cppm:hover{z-index:600!important}
.cppm:hover .cpav{transform:scale(1.07)}
.cppm .cpav{transition:transform .13s cubic-bezier(.34,1.3,.64,1)}

/* La grappe : le nombre, et l'anneau qui dit la part de hors-périmètre.
   « 24 dont 5 dehors » se repère sans l'ouvrir. */
.cpgrap{background:none;border:0;cursor:pointer;filter:drop-shadow(0 4px 7px rgba(40,28,16,.28))}
.cpgrap span{position:absolute;inset:0;display:flex;flex-direction:column;align-items:center;
  justify-content:center;font-family:var(--f-titre);color:var(--encre);line-height:1}
.cpgrap span b{font-size:19px;letter-spacing:-.02em}
.cpgrap span i{font-style:normal;font-size:9px;font-weight:700;color:var(--rouge);margin-top:2px}
.cpgrap:hover{filter:drop-shadow(0 5px 10px rgba(40,28,16,.36))}

/* Le halo de précision : la marge annoncée par l'appareil, à
   l'échelle. Quand il touche le périmètre, on VOIT que l'écart ne
   prouve rien. */
.leaflet-container .cphalo{fill:var(--bleu);fill-opacity:.13;stroke:var(--bleu);
  stroke-width:1.4;stroke-opacity:.5;stroke-dasharray:4 4}

/* La bulle, refaite autour du visage et des gestes. */
.cppop .ph.cpvis{display:flex;align-items:center;gap:10px}
.cppop .ph.cpvis .cpav{width:32px;height:32px;border-radius:50%;flex:none;display:flex;
  align-items:center;justify-content:center;overflow:hidden;color:#fff;
  font-family:var(--f-titre);font-size:11.5px;font-weight:700}
.cppop .ph.cpvis .cpav img{width:100%;height:100%;object-fit:cover;display:block}
.cppop .cpges{padding:2px 12px 9px;display:flex;flex-direction:column;gap:3px;font-size:11.5px}
.cppop .cpges div{display:flex;align-items:center;gap:8px;color:var(--encre-2)}
.cppop .cpges i{width:6px;height:6px;border-radius:50%;background:var(--vert);flex:none}
.cppop .cpges b{margin-left:auto;font-variant-numeric:tabular-nums;color:var(--encre)}
/* Un écart plus petit que la marge de mesure n'accuse personne. */
.cppop .cpdoute{margin:8px 12px 2px;background:var(--jaune-pale);border:1px solid #E7CF94;
  border-radius:8px;padding:7px 10px;font-size:11px;line-height:1.45;color:#6B5310}
.emdur.att{color:var(--jaune)}

/* ═══ LA BORNE HORS LIGNE ═══                              (v14.84)
   La pastille dit l'état du réseau, ce bandeau dit le NOMBRE. Masqué
   tant que la file est vide : un compteur à zéro en permanence
   apprend à ne plus le regarder. */
.bfile{display:flex;align-items:center;gap:9px;margin-top:9px;padding:8px 11px;
  border-radius:10px;background:var(--jaune-pale);color:var(--jaune);font-size:12px;
  line-height:1.35;border:1px solid color-mix(in srgb,var(--jaune) 30%,transparent)}
.bfile[hidden]{display:none}
.bfile .n{flex:none;background:var(--jaune);color:#fff;border-radius:20px;padding:1px 9px;
  font-weight:700}
.bfile .t{font-weight:600}
/* Le mot qu'on lit juste après avoir pointé sans réseau. « Enregistré »
   tout court ferait croire que c'est parti. */
.bfilec{margin:14px auto 0;max-width:460px;border-radius:12px;padding:13px 16px;
  background:var(--jaune-pale);border:1px solid color-mix(in srgb,var(--jaune) 35%,transparent);
  text-align:left}
.bfilec b{display:block;font-family:var(--f-titre);font-size:15px;color:var(--jaune)}
.bfilec span{display:block;font-size:12.5px;color:var(--encre-2);margin-top:3px;line-height:1.45}
/* Les refusés à la synchronisation : rares, et il faut les voir. */
.bfilel{max-width:460px;margin:0 auto;text-align:left;display:flex;flex-direction:column;gap:7px}
.bfilel > div{border-radius:10px;padding:9px 12px;background:var(--rouge-pale);
  border:1px solid color-mix(in srgb,var(--rouge) 30%,transparent)}
.bfilel b{font-weight:700;color:var(--rouge)}
.bfilel i{font-style:normal;margin-left:7px;font-size:12px;color:var(--muet)}
.bfilel span{display:block;font-size:12.5px;color:var(--encre-2);margin-top:2px}

/* ═══ CONTRÔLE : UNE CASE PAR GESTE ═══                    (v14.49)
   La preuve la plus forte dans la case, le compte en coin, tout le
   reste dans la bulle « tout » — en images. */
.cctl .pv.emck{position:relative;overflow:visible}
.cctl .pv.emck.img{padding:0}
.cctl .pv.emck.img img{border-radius:7px}
.cctl .pv.emck.loin{border-color:var(--rouge);color:var(--rouge-fonce);background:var(--rouge-pale)}
.cctl .pv.emck.off2{border-style:dashed;color:var(--muet);cursor:pointer}
.emckb{position:absolute;top:-6px;right:-6px;min-width:16px;height:16px;padding:0 4px;border-radius:9px;
  background:var(--encre);color:#fff;font:700 9.5px/16px var(--f-ui);text-align:center;
  box-shadow:0 0 0 2px var(--carte);pointer-events:none}
/* Les blocs empilés « .emckx » de la v14.49 ont laissé la place à la
   fiche du geste (v14.50, plus bas) : les preuves y sont côte à côte,
   sans étiquette. */

/* ═══ LE COMMENTAIRE, SANS CADRE ═══                       (v14.49)
   Une bulle pleine, bleue, à la taille du texte, et le début du
   commentaire en clair. Remplace « .pv.emcm » de la v14.48. */
.emnote{display:inline-flex;align-items:center;gap:4px;margin-left:7px;vertical-align:middle;
  color:var(--bleu);cursor:pointer;max-width:190px;border:0;background:none;padding:0;
  font-family:var(--f-ui)}
.emnote svg{width:15px;height:15px;flex:none}
.emnote i{font-style:italic;font-weight:500;font-size:11.5px;color:var(--bleu);white-space:nowrap;
  overflow:hidden;text-overflow:ellipsis}
.emnote:hover i{text-decoration:underline;text-underline-offset:2px}

/* ═══ LA DÉCISION EN MOTS ═══                              (v14.49)
   Sous les heures retenues : ce qui est retiré de la paie, en rouge ;
   ce qui ne coûte rien, en gris (« .emsrc » du kit). */
.emret{display:block;font-size:11.5px;color:var(--rouge-fonce);margin-top:3px}
.emret b{font-weight:700}
.emabs{color:var(--rouge-fonce);font-weight:700}
/* Le pied du tableau d'émargement : ce que la journée pèse. */
.emt tfoot td{background:var(--creme-40);border-top:1px solid var(--ligne);padding:11px 12px;font-size:12.5px}
.emt tfoot .empied{text-align:right;color:var(--muet);font-weight:600}
.emt tfoot .empied2{color:var(--encre-2)}
.emt tfoot .np{color:var(--rouge-fonce);font-weight:600}
.emt tfoot .emdur{font-size:16px}

/* ═══ LA FICHE DU GESTE ═══                                (v14.50)

   La bulle de preuve mesurait 250 × 347 px : deux images de 226 px
   empilées dans une colonne étroite, deux étiquettes pour deux images
   qu'on reconnaît, et un titre — « Le geste » — qui ne disait ni qui
   ni quoi alors qu'elle recouvre la ligne qu'on venait de lire.

   Elle fait 420 px : les preuves CÔTE À CÔTE, l'en-tête qui nomme la
   personne, et une ligne de méta pour ce qui n'est pas une image. */
.emprv.bul,.emprv.bul:has(.cartez){width:420px}

/* ── L'EN-TÊTE QUI DIT QUI ── */
.emprvh.bulh{gap:10px;padding:10px 12px;align-items:center}
.bulh .avm{width:30px;height:30px;border-radius:50%;display:grid;place-items:center;
  color:#fff;font:700 11px/1 var(--f-ui);flex:none;overflow:hidden}
.bulh .avm img{width:100%;height:100%;object-fit:cover;display:block}
.bulq{min-width:0}
.bulq b{display:block;font-size:13.5px;font-weight:600;line-height:1.2;white-space:nowrap}
.bulq > span{display:block;font-size:11.5px;font-weight:500;color:var(--muet);
  font-variant-numeric:tabular-nums;margin-top:1px}
.bulq em{font-style:normal;font-weight:700;color:var(--vert-fonce)}
.bulq em.ko{color:var(--terra-fonce)}

/* ── LES PREUVES CÔTE À CÔTE ──
   Pas d'étiquette : une photo se reconnaît, une signature aussi. */
.bulg{display:grid;grid-template-columns:1fr 1fr;gap:10px}
.bulg figure{margin:0;min-width:0}
.bulg img{display:block;width:100%;border-radius:9px;border:1px solid var(--ligne);
  background:var(--surface-2);aspect-ratio:4/3;object-fit:cover}
.bulg figure.sig img{object-fit:contain;background:var(--creme-40)}
/* Une seule preuve prend toute la largeur ; la carte aussi, quand
   elle est la seule chose à montrer. */
.bulg:has(figure:only-child){grid-template-columns:1fr}
.bulg figure.cart .cartez{margin:0}

/* ── LA MÉTA, SUR UN RANG ──
   Où, à quelle distance, à quelle précision. Trois faits courts
   plutôt que trois paragraphes gris. */
.bulm{display:flex;gap:14px;flex-wrap:wrap;margin-top:11px;font-size:12px;color:var(--muet)}
.bulm span{display:inline-flex;align-items:center;gap:6px}
.bulm b{color:var(--encre);font-weight:600}
.bulm svg{width:14px;height:14px;flex:none;opacity:.7}
.bulm .loin,.bulm .loin b{color:var(--rouge-fonce);font-weight:600}
.bulm .loin svg{opacity:1}
/* L'adresse sous la méta quand la photo a déjà pris la place. */
.emprv.bul .cartez[data-mini]{margin-top:7px}
.emprv.bul .cartez[data-mini] .adr{font-weight:500;font-size:12px;color:var(--encre-2)}
.emprv.bul .emprvb > .tx{margin-top:10px;font-size:12.5px;color:var(--encre-2)}

/* ═══ LES INTÉGRATIONS ═══                               (v14.51.2)

   « Il faut vraiment aller à l'essentiel, tu affiches beaucoup trop
     de choses. »

   Le premier jet posait des cartes à trois étages, quatre onglets et
   des paragraphes d'explication. Ce qu'on vient faire est simple :
   voir ce qui est branché, allumer ou couper, coller deux
   identifiants. Tout le reste a été retiré.

   ── UNE LIGNE PAR OUTIL ── */
.itgli{display:flex;align-items:center;gap:13px;padding:14px 18px;
  border-bottom:1px solid var(--ligne)}
.itgli:last-child{border-bottom:0}
.itgli.gris{opacity:.55}
.itgli form{display:flex;align-items:center}
.itgk{width:36px;height:36px;border-radius:10px;display:grid;place-items:center;
  font-family:var(--f-titre);font-size:16px;font-weight:700;flex:none}
.itgx{flex:1;min-width:0;color:inherit;text-decoration:none}
.itgx b{display:block;font-family:var(--f-titre);font-size:14.5px;font-weight:700;line-height:1.25}
.itgx span{display:block;font-size:12.3px;color:var(--muet);margin-top:1px}
a.itgx:hover b{color:var(--terra-fonce)}

/* ── LA FENÊTRE DES ACCÈS ──                               (v14.53)
   Deux champs et UN bouton. Le test n'a plus de bouton à lui : il est
   passé dans « Enregistrer », qui éprouve d'abord et ne range que si
   ça répond. Ce qui reste ici n'est donc plus le résultat d'un test,
   mais une erreur quand il y en a une — sur une ligne, parce que ce
   n'est pas un paragraphe qu'on vient lire.

   Pendant l'appel : `.btn.occupe` et `.charge` du kit, tels quels. */
.itgres{display:flex;align-items:center;gap:8px;margin-top:4px;padding:9px 11px;
  border-radius:9px;font-size:12.8px;font-weight:600;background:var(--surface-2);color:var(--muet)}
.itgres.ok{background:var(--vert-pale);color:var(--vert)}
.itgres.ko{background:var(--rouge-pale);color:var(--rouge-fonce)}
.itgres svg{flex:none}
/* Les exploitations que le test a ramenées : des étiquettes, pas un
   tableau — on vérifie qu'on reconnaît ses sites, rien de plus. */
.itgvl{display:flex;flex-wrap:wrap;gap:6px;margin-top:8px}
.itgvl span{font-size:12px;background:var(--surface-2);border:1px solid var(--ligne);
  border-radius:7px;padding:4px 9px;color:var(--encre-2)}

/* ── LE MOMENT OÙ ÇA MARCHE ──                             (v14.53)
   Une fenêtre qui se referme sans rien dire laisse exactement le même
   écran qu'une fenêtre qu'on a annulée. Brancher un outil est le
   geste le plus incertain de tout le produit — on colle un secret
   qu'on ne relit pas dans un champ qui ne montre rien. Il faut donc
   qu'à la seconde où ça répond, l'écran le DISE, et nomme ce qu'il a
   reconnu : si les exploitations affichées sont les bonnes, plus
   aucun doute ne subsiste. Une seconde et demie, puis on passe à la
   suite tout seul. */
.itgok{display:flex;flex-direction:column;align-items:center;text-align:center;gap:7px;
  padding:32px 18px 36px}
.itgokr{width:54px;height:54px;border-radius:50%;background:var(--vert-pale);color:var(--vert);
  display:grid;place-items:center;flex:none;
  animation:itgokpop .4s cubic-bezier(.2,.9,.3,1.5) both}
.itgokr svg{width:28px;height:28px}
@keyframes itgokpop{from{opacity:0;transform:scale(.5)}to{opacity:1;transform:none}}
.itgok b{font-family:var(--f-titre);font-size:16px;font-weight:700}
.itgokd{font-size:12.8px;color:var(--muet)}
.itgok .itgvl{justify-content:center}
@media (prefers-reduced-motion:reduce){.itgokr{animation:none}}

/* ── LES ACCÈS RANGÉS ──                                   (v14.53)
   L'onglet « Accès » d'une intégration branchée : ce qu'on a donné,
   et rien de plus. Le token ne se relit jamais — quatre caractères
   suffisent à reconnaître LEQUEL on a collé. */
.itgacc{display:flex;flex-wrap:wrap;gap:12px 34px;padding:15px 18px}
.itgacc > div{display:flex;flex-direction:column;gap:2px;min-width:0}
.itgacc > div > span{font-size:11.3px;color:var(--muet);text-transform:uppercase;letter-spacing:.05em}
.itgacc > div > b{font-size:14px;font-weight:700;word-break:break-all}
.itgmask{font-variant-numeric:tabular-nums;letter-spacing:.06em}
.itgaccv{margin-top:0;padding:0 18px 15px}
.itgacce{margin:0 18px 15px;padding:9px 11px;border-radius:9px;
  background:var(--rouge-pale);color:var(--rouge-fonce);font-size:12.8px;font-weight:600}
/* Deux boutons de MÊME taille, aux deux bouts : celui qui défait à
   gauche, celui qu'on cherche à droite. */
.itgacf{display:flex;align-items:center;justify-content:space-between;gap:10px;
  padding:14px 18px;border-top:1px solid var(--ligne);background:var(--surface-2)}

/* ── LES ÉTAPES ──
   Numérotées, dans l'ordre où on les remplit. Elles n'existent qu'une
   fois la connexion faite. */
.itgetp{width:22px;height:22px;border-radius:50%;background:var(--encre);color:#fff;
  display:grid;place-items:center;font:700 11.5px/1 var(--f-ui);flex:none}
/* Le pied d'un tableau : le filet le sépare des lignes, sans quoi le
   bouton a l'air d'appartenir à la dernière. */
.itgpied{padding:14px 18px;border-top:1px solid var(--ligne);background:var(--surface-2)}
/* Les commandes d'un en-tête de carte : elles ne se coupent pas en
   deux, et « .fi » y fait sa taille au lieu de 100 % du conteneur. */
.itgbf{display:flex;align-items:center;gap:8px;flex-wrap:nowrap;flex:none}
.itgbf > *{flex:none}
.itgbf .fi{width:auto;min-width:130px}
/* Le journal est à un lien de distance : on ne le regarde que quand
   quelque chose ne marche pas. */
.itgpj{text-align:right;font-size:12.5px;margin-top:-6px}
.itgpj a{color:var(--muet)}
.itgpj a:hover{color:var(--terra-fonce)}
/* Un créneau suspendu chez eux reste affiché : il a été vendu, puis
   retiré, et c'est une information. */
.itgsusp td{opacity:.55;text-decoration:line-through}
.itgq{color:var(--muet);white-space:nowrap}
.itgdt{color:var(--encre-2);font-size:12.5px}
.itgms{color:var(--muet);font-size:11px;font-variant-numeric:tabular-nums}

/* ═══ LA BANDE DES ACTIVITÉS, SUR LE JOUR ═══              (v14.54)

   « Une ligne = un lieu. »

   Elle se pose DANS la grille du jour, sur la même échelle horaire
   que les shifts : c'est tout l'intérêt. On lit à la verticale
   « 44 présents » et, deux lignes plus bas, « 3 salariés ».

   ── LA COULEUR NE DIT PAS L'ACTIVITÉ ──

   Chez Qweekle chaque activité a la sienne. Ici la couleur a un sens
   fixe dans toute l'application : elle dit un ÉTAT. Un créneau est
   donc neutre, vert quand il est complet, effacé quand personne n'a
   réservé, hachuré quand il est annulé. L'activité se lit sur la
   ligne, où elle est écrite une fois.

   ── UN CRÉNEAU N'EST PAS UN SHIFT ──

   Il vient de chez eux : il ne se glisse pas, il ne s'ouvre pas. Plus
   bas qu'un shift, plus clair, et sans le bord gauche épais — celui-ci
   est une prise, et une prise qui ne prend rien est un mensonge. */
.jgrid .qwsep{background:var(--surface-2)}
.jgrid .qwsep .ep{background:var(--muet)}
.jgrid .jec.qwvide{background:var(--surface-2);border-bottom-color:var(--ligne)}
/* ── LA BANDE EN RUBAN ──                                (v14.63)

   26 px suffisaient tant que le créneau ne portait que deux nombres.
   Le liseré du type d'heure en prend 3 : il n'en restait que 21 pour
   les deux chiffres, et ça se sentait. 38 px — dont 32 de créneau —
   rendent les nombres EMPILABLES : le grand dit ce qui ARRIVE, le
   petit en dessous ce qui EST LÀ, et « 13 (20) » cesse de se lire
   comme un nombre à deux chiffres.

   Ça coûte 12 px par ligne, et le ruban les rend au centuple : une
   catégorie repliée, c'est une ligne au lieu de neuf. */
/* ── ET CE QUE CHAQUE LIGNE COÛTE ──                        (v14.76)
   38 px, c'était la hauteur d'une ligne de planning. Mais un créneau
   n'est pas un shift : il ne s'attrape pas, il ne se glisse pas, on
   ne vise que son clic. 34 px suffisent, et sur neuf lieux ça fait
   une ligne de salarié rendue. */
.jgrid .jcell.qwx{min-height:34px}
/* La v14.76 avait fait revenir « à associer » dans la ligne muette
   d'un lieu ; il en repart (v14.77) — sur une journée où rien n'est
   associé, c'était un avertissement sur chaque rangée pour un geste
   qui se fait une fois. Il se dit dans les réglages, et au survol. */
.jgrid .jlab.qwlieu{padding-top:2px;padding-bottom:2px;padding-left:34px;gap:8px}
.jgrid .jlab.qwlieu .col{display:flex;flex-direction:column;gap:0;min-width:0}
.jgrid .jlab.qwlieu .l1{display:flex;align-items:baseline;gap:6px;min-width:0}
.jgrid .jlab.qwlieu .n{font-size:12.5px;font-weight:600;line-height:1.2;
  white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.jgrid .jlab.qwlieu .qwcap{font-style:normal;font-size:10.5px;color:var(--muet);font-weight:600;flex:none}
.jgrid .jlab.qwlieu .c{display:block;font-size:10px;line-height:1.25;color:var(--muet);
  white-space:nowrap;overflow:hidden;text-overflow:ellipsis;min-width:0}
.jgrid .jlab.qwlieu .qwvig{width:20px;height:20px;border-radius:5px;font-size:9px}
.jgrid .qwp{width:7px;height:7px;border-radius:2px;background:var(--ligne-2);flex:none}

/* ── LA LIGNE D'UNE CATÉGORIE, QUI SE PLIE ── */
.jgrid .jlab.qwcat{padding:2px 14px;gap:7px;cursor:pointer;background:var(--surface-2);
  border-top:1px solid var(--ligne);user-select:none}
.jgrid .jlab.qwcat:hover{background:#F6F1E6}
.jgrid .jlab.qwcat .qwchev{width:15px;height:15px;flex:none;display:flex;align-items:center;
  justify-content:center;color:var(--muet);transition:transform .14s}
.jgrid .jlab.qwcat .qwchev .ico{width:13px;height:13px}
.jgrid .jlab.qwcat.qwplie .qwchev{transform:rotate(-90deg)}
.jgrid .jlab.qwcat .ep{width:3px;height:14px;border-radius:2px;background:var(--ligne-2);flex:none}
.jgrid .jlab.qwcat .n{font-size:11.5px;font-weight:700;letter-spacing:.02em;white-space:nowrap}
.jgrid .jlab.qwcat .m{font-size:10px;font-weight:600;color:var(--muet);white-space:nowrap;
  overflow:hidden;text-overflow:ellipsis;min-width:0}
.jgrid .jcell.qwcatc{background:var(--surface-2);border-top:1px solid var(--ligne)}
.jgrid .jt.qwcatt{background:var(--surface-2);border-top:1px solid var(--ligne);font-weight:700}
/* Une rangée dont tout est masqué retombe à zéro d'elle-même : la
   grille n'a pas de gabarit de rangées, elles se dimensionnent sur
   leur contenu. Rien à recalculer côté script.

   ── POURQUOI DEUX SÉLECTEURS ──                           (v14.65)
   Le premier ne suffisait pas. `.jgrid .qwcr` pose `display:flex`
   trois cents lignes plus bas, à poids égal : le dernier écrit
   gagnait, et replier une catégorie masquait son libellé, ses cases
   et son total — mais PAS ses créneaux, qui restaient posés sur une
   rangée retombée à zéro. C'est ce qu'on voyait sur la capture :
   l'accordéon se fermait et les pastilles s'empilaient par-dessus la
   rangée du dessus. Le second sélecteur pèse un cran de plus, et il
   n'y a plus de course à l'ordre d'écriture. */
.jgrid .qwoff2,.jgrid .qwx.qwoff2{display:none}

/* ── LA LÉGENDE DES TYPES D'HEURE ── */
.jgrid .jlab.qwleg{padding:5px 14px;font-size:10px;font-weight:700;letter-spacing:.06em;
  color:var(--muet);border-top:1px solid var(--ligne);background:var(--surface-2)}
.jgrid .jec.qwleg2{justify-content:flex-start;gap:15px;padding:0 12px;height:auto;min-height:26px;
  flex-wrap:wrap;border-top:1px solid var(--ligne);background:var(--surface-2);
  border-bottom:1px solid var(--ligne)}
.jgrid .jec.qwleg2 .i{display:flex;align-items:center;gap:6px;font-size:11px;font-weight:600;
  color:var(--encre-2)}
.jgrid .jec.qwleg2 .i i{width:15px;height:3px;border-radius:2px;flex:none}

/* ── LA BULLE DE SURVOL D'UN CRÉNEAU ──                   (v14.63)

   Elle vit hors de la grille — posée dedans, elle serait rognée par
   le défilement horizontal et compterait comme une rangée. Elle
   s'affiche ENTIÈRE tout de suite : tout vient des attributs du
   créneau, qui viennent eux-mêmes de la lecture déjà faite. Seules
   les réservations arrivent après, et elles se posent SANS faire
   bouger le reste. */
.qwbul{position:absolute;z-index:80;width:330px;background:var(--carte);
  border:1px solid var(--ligne);border-radius:var(--r);box-shadow:var(--ombre-2);
  overflow:hidden;pointer-events:none;font-size:14px}
.qwbul[hidden]{display:none}
.qwbul .bh{padding:10px 13px 9px;border-bottom:1px solid var(--ligne);display:flex;
  flex-direction:column;gap:4px}
.qwbul .bh .l1{display:flex;align-items:baseline;gap:8px;min-width:0}
.qwbul .bh .nm{font-family:var(--f-titre);font-size:14.5px;font-weight:700;line-height:1.15;
  white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.qwbul .bh .cap{font-size:11px;font-weight:600;color:var(--muet);flex:none}
.qwbul .bh .th{display:inline-flex;align-items:center;gap:6px;font-size:11px;font-weight:700;
  color:var(--encre-2);background:var(--surface-2);border-radius:5px;padding:2px 8px;align-self:flex-start}
.qwbul .bh .th i{width:8px;height:8px;border-radius:2px;flex:none}
.qwbul .bq{display:flex;align-items:baseline;gap:9px;padding:9px 13px;border-bottom:1px solid var(--surface-2)}
.qwbul .bq .hr{font-family:var(--f-titre);font-size:16px;font-weight:700;letter-spacing:-.01em}
.qwbul .bq .du{font-size:11px;color:var(--muet)}
.qwbul .bq .cv{margin-left:auto;font-size:10.5px;color:var(--encre-2);background:var(--surface-2);
  border-radius:6px;padding:3px 8px;font-weight:600;white-space:nowrap}
.qwbul .duo{display:grid;grid-template-columns:1fr 1fr;border-bottom:1px solid var(--surface-2)}
.qwbul .k{padding:8px 6px 9px;text-align:center;border-left:1px solid var(--surface-2)}
.qwbul .k:first-child{border-left:0}
.qwbul .k .lb{font-size:9.5px;font-weight:700;letter-spacing:.06em;color:var(--muet);
  display:block;margin-bottom:3px}
.qwbul .k .v{font-family:var(--f-titre);font-size:18px;font-weight:700;line-height:1}
.qwbul .k .sur{font-size:11px;font-weight:600;color:var(--muet)}
.qwbul .k .ja{display:block;height:3px;border-radius:2px;background:#EFE8DA;margin:6px 9px 0;overflow:hidden}
.qwbul .k .ja i{display:block;height:100%;border-radius:2px}
.qwbul .blk{padding:9px 13px;border-bottom:1px solid var(--surface-2)}
.qwbul .blk:last-child{border-bottom:0}
.qwbul .blk .t{font-size:9.5px;font-weight:700;letter-spacing:.07em;color:var(--muet);margin-bottom:7px}
.qwbul .blk .t .c{color:var(--encre-2)}
.qwbul .resas{display:flex;flex-direction:column;gap:6px}
.qwbul .resa{display:flex;align-items:center;gap:8px;font-size:12px}
.qwbul .resa .q{font-size:10.5px;font-weight:700;color:#fff;background:var(--bleu);border-radius:5px;
  padding:2px 7px;flex:none;font-variant-numeric:tabular-nums}
.qwbul .resa .n{font-weight:600;min-width:0;white-space:nowrap;overflow:hidden;
  text-overflow:ellipsis;flex:1 1 auto}
.qwbul .resa .e{font-size:10px;font-weight:700;border-radius:5px;padding:2px 7px;flex:none}
.qwbul .resa .e.pay{color:var(--vert);background:var(--vert-pale)}
.qwbul .resa .e.att{color:var(--jaune);background:var(--jaune-pale)}
.qwbul .plus{font-size:11px;font-weight:700;color:var(--terra-h);padding-top:1px}
.qwbul .sous{font-size:10.5px;color:var(--muet);margin-top:7px}
.qwbul .charge{display:flex;align-items:center;gap:8px;font-size:11.5px;color:var(--muet)}
.qwbul .charge .sp{width:13px;height:13px;border-radius:50%;border:2px solid var(--ligne-2);
  border-top-color:var(--terra);animation:qwspin .7s linear infinite}
@keyframes qwspin{to{transform:rotate(360deg)}}
.qwbul .neant{font-size:12px;color:var(--muet);font-style:italic}
.qwbul .neant.qwmuet{color:var(--rouge);font-style:normal;font-weight:600;font-size:11.5px}
.qwbul .qui{display:flex;flex-direction:column;gap:6px}
.qwbul .qui .p{display:flex;align-items:center;gap:9px}
.qwbul .qui .p .av{width:23px;height:23px;border-radius:50%;background:var(--bleu);color:#fff;
  display:flex;align-items:center;justify-content:center;font-size:9.5px;font-weight:700;flex:none}
.qwbul .qui .p .n{font-size:12.5px;font-weight:600;flex:1 1 auto;min-width:0;white-space:nowrap;
  overflow:hidden;text-overflow:ellipsis}
.qwbul .qui .p .h{font-size:11px;color:var(--muet);flex:none}
.qwbul .vide{display:flex;align-items:center;gap:8px;font-size:12px;font-weight:600;color:var(--rouge)}
.qwbul .ratio{display:flex;align-items:center;gap:7px;margin-top:8px;padding-top:8px;
  border-top:1px solid var(--surface-2)}
.qwbul .ratio .v{font-family:var(--f-titre);font-size:14.5px;font-weight:700}
.qwbul .ratio .x{font-size:11.5px;color:var(--encre-2)}
.qwbul .ratio .pill{margin-left:auto;font-size:10.5px;font-weight:700;border-radius:6px;padding:3px 8px}
.qwbul .ratio .pill.tendu{color:#fff;background:var(--rouge)}
.qwbul .ratio .pill.bon{color:var(--vert);background:var(--vert-pale)}
.qwbul .ratio .pill.large{color:var(--bleu);background:var(--bleu-pale)}

/* ── LE MENU D'UN CRÉNEAU, ET SON PANNEAU ──              (v14.64)

   Deux gestes seulement, et ils écrivent chez eux. « Dupliquer » et
   « Modification » de leur menu à eux sont leur métier : construire
   l'offre. Ici on est dans un planning de personnel — on ajuste ce
   qui existe. */
.qwmen{position:absolute;z-index:90;width:216px;background:var(--carte);
  border:1px solid var(--ligne);border-radius:10px;box-shadow:var(--ombre-2);
  overflow:hidden;padding:4px;font-size:14px}
.qwmen[hidden],.qwpan[hidden]{display:none}
.qwmen .tt{padding:7px 10px 5px;font-size:9.5px;font-weight:700;letter-spacing:.07em;color:var(--muet)}
.qwmen button{display:flex;align-items:center;gap:10px;padding:8px 10px;border-radius:7px;
  font-size:13px;font-weight:600;cursor:pointer;width:100%;border:0;background:none;
  color:var(--encre);font-family:inherit;text-align:left}
.qwmen button:hover:not(:disabled){background:var(--surface-2)}
.qwmen button:disabled{color:#C4B7A2;cursor:default}
.qwmen button.ko{color:var(--rouge)}
.qwmen button.va{color:var(--vert)}
.qwmen button.dis{color:var(--muet)}
.qwmen button svg{flex:none}
.qwmen .sep{height:1px;background:var(--ligne);margin:4px 6px}

.qwpan{position:absolute;z-index:92;width:340px;background:var(--carte);
  border:1px solid var(--ligne);border-radius:var(--r);box-shadow:var(--ombre-2);
  overflow:hidden;font-size:14px}
.qwpan .ph{padding:11px 14px;border-bottom:1px solid var(--ligne)}
.qwpan .ph .t{font-family:var(--f-titre);font-size:15px;font-weight:700;line-height:1.2;display:block}
.qwpan .ph .s{font-size:11.5px;color:var(--muet);margin-top:2px;display:block}
.qwpan .bd{padding:12px 14px;display:flex;flex-direction:column;gap:11px}
.qwpan .lig{display:flex;align-items:center;gap:10px}
.qwpan .lig .lb{flex:1 1 auto;min-width:0}
.qwpan .lig .lb b{display:block;font-size:12.5px;font-weight:600}
.qwpan .lig .lb i{display:block;font-style:normal;font-size:10.5px;color:var(--muet)}
.qwstp{display:flex;align-items:center;border:1px solid var(--ligne-2);border-radius:9px;
  overflow:hidden;flex:none;background:#fff}
.qwstp button{border:0;background:none;width:30px;height:32px;font-size:15px;color:var(--encre-2);
  cursor:pointer;font-family:inherit;line-height:1}
.qwstp button:hover{background:var(--surface-2)}
.qwstp input{width:48px;height:32px;border:0;text-align:center;font-family:var(--f-titre);
  font-size:15px;font-weight:700;color:var(--encre);font-variant-numeric:tabular-nums;
  border-left:1px solid var(--ligne);border-right:1px solid var(--ligne);background:#fff}
.qwpan .alerte{display:flex;gap:8px;background:var(--jaune-pale);border-radius:9px;padding:9px 11px;
  font-size:11.5px;color:#8A5F0E;line-height:1.5}
.qwpan .alerte svg{flex:none;margin-top:1px}
.qwpan .alerte.ko{background:var(--rouge-pale);color:var(--rouge)}
.qwpan .pf{display:flex;align-items:center;gap:9px;padding:11px 14px;border-top:1px solid var(--ligne);
  background:var(--surface-2)}
.qwpan .pf .x{font-size:11px;color:var(--muet);flex:1 1 auto}
/* Le curseur est la seule chose qui annonce qu'un créneau s'ouvre. Il
   est posé par le script, donc absent pour qui ne compose pas le
   planning : on ne montre pas une porte fermée. */
.jgrid .qwcr.qwclic{cursor:pointer}

/* Le créneau : deux nombres. Le grand, ce qui ARRIVE ; entre
   parenthèses, ce qui EST LÀ. La parenthèse ne s'écrit que si elle
   apprend quelque chose — « 20 (20) » dirait deux fois la même. */
/* ── LE CRÉNEAU : UN APLAT, ET UN LISERÉ ──               (v14.63)

   Plus de cadre. Un aplat PLEIN pour ce qui est vendu, rien du tout
   pour ce qui ne l'est pas — et sous les deux, sur 3 px, la couleur
   du type d'heure. Le trait au sol d'un créneau vide n'est donc pas
   décoratif : c'est son tarif, et c'est la seule chose qu'il ait à
   dire.

   `--qwth` est posée par le rendu, jamais en dur ici : le jour où
   l'on veut éteindre les types d'heure, une seule règle suffit. */
.jgrid .qwcr{position:relative;z-index:2;margin:3px 1px;border-radius:5px 5px 2px 2px;padding:0 4px;
  overflow:clip;background:var(--carte);min-width:0;cursor:default;
  border-bottom:3px solid var(--qwth,transparent);
  display:flex;flex-direction:column;align-items:center;justify-content:center;gap:1px;
  /* 32 px + 3 de marge faisaient 38 : la hauteur d'une ligne de
     planning, pour un objet qu'on ne glisse pas. Les deux nombres
     tiennent dans 28 (v14.76). */
  line-height:1;height:28px;font-variant-numeric:tabular-nums}
.jgrid .qwcr .g{font-size:12.5px;font-weight:700;line-height:1}
.jgrid .qwcr .p{font-size:9.5px;font-weight:600;line-height:1;opacity:.7}
.jgrid .qwcr .p::before{content:"("} .jgrid .qwcr .p::after{content:")"}
/* La ligne repliée d'une catégorie porte les mêmes nombres, un cran
   plus haut : c'est la ligne qu'on lit quand on ne déplie pas. */
.jgrid .qwcr.qwrub .g{font-size:13px}
/* ── LA COULEUR DIT LE REMPLISSAGE ──                       (v14.58)
   Vert dès qu'il y a une réservation, orange à la moitié, rouge quand
   c'est complet. L'ordre est celui-là : un créneau complet est rouge
   même s'il vient de passer la moitié. `qw_couleur()` en décide, et
   elle seule — deux endroits finiraient par ne plus dire pareil.
   Les couleurs du RATIO (plus bas) parlent d'effectif, pas de
   remplissage : elles restent dans leur pastille. */
/* ── OUVERT ET VIDE ──                              (v14.64, v14.65)

   « Les cases blanches sont vraiment différentes des vertes. »

   Elles l'étaient : une case blanche cerclée à côté d'un aplat vert,
   ce sont deux objets de familles différentes posés sur la même
   ligne, et l'œil s'arrête sur celui qui ne dit rien. La v14.64 avait
   ajouté ce cadre pour montrer où cliquer ; le prix était trop haut.

   Il ne reste donc QUE le zéro, en gris clair. Même gabarit, même
   place, même alignement que les nombres pleins — le vide est un
   nombre parmi les autres, simplement plus pâle. Ce qui montre où
   cliquer, c'est le curseur (.qwclic) et le survol.

   Le liseré du type d'heure ne descend pas ici : une ligne de couleur
   sous quarante cases vides fait une frise qui n'apprend rien. Le
   tarif n'apparaît que là où quelque chose est vendu. */
.jgrid .qwcr.rien{background:#F0EBE1;box-shadow:none;border-bottom-color:transparent}
.jgrid .qwcr.rien .g{color:#A2927A;font-weight:700;font-size:11.5px}
.jgrid .qwcr.rien .p{display:none}
.jgrid .qwcr.rien:hover{background:#E9E3D6}
.jgrid .qwcr.va{background:#DFEBD1;color:#3F5F2C}
.jgrid .qwcr.mi{background:#F6E3B4;color:#8A5F0E}
.jgrid .qwcr.plein{background:var(--rouge);color:#fff}
.jgrid .qwcr.plein .p{opacity:.82}
/* ── SUSPENDU ──                                           (v14.68)

   « Les créneaux suspendus doivent être gris hachurés, sans voir
     marqué dedans "annulé". »
   « On peut avoir du monde ou de la capacité, donc il faudra toujours
     afficher les valeurs dedans. »

   Le rose hachuré disait « incident » ; retirer un créneau de la vente
   est une DÉCISION, pas une panne. La trame grise ne se confond avec
   aucun autre état de la grille, et elle n'a pas besoin d'un mot : le
   libellé mangeait les trois quarts d'une case de trente pixels.

   Les nombres, eux, restent. Un créneau fermé garde ce qui avait été
   réservé avant, et ces gens-là se présenteront. */
.jgrid .qwcr.susp{background:repeating-linear-gradient(-45deg,
    #E6E0D2,#E6E0D2 3px,#F7F4ED 3px,#F7F4ED 8px);
  box-shadow:inset 0 0 0 1px #E0D8C7;border-bottom-color:transparent;color:#6E6152}
.jgrid .qwcr.susp .g{font-size:12.5px;font-weight:700;font-style:normal}
.jgrid .qwcr.susp .p{opacity:1;color:#8C7C64}

/* ── LA RÉSERVATION D'UN ESPACE PRIVATISÉ ──               (v14.58)
   Elle porte un NOM, donc elle s'écrit en ligne et non en colonne :
   « 8 » ne dit pas qui vient, et c'est le nom qu'on cherche sur la
   ligne du lodge. */
/* La barre d'une privatisation porte une pastille : elle se centre,
   là où les deux nombres d'un créneau s'alignent sur leur base. */
/* La privatisation porte un nom, donc elle se lit en ligne, et en
   aplat plein comme les autres : c'est le seul créneau où le nom EST
   l'information. */
.jgrid .qwcr.qwresa{flex-direction:row;align-items:center;gap:7px;padding:0 10px;
  justify-content:flex-start;background:var(--bleu);color:#fff}
.jgrid .qwcr.qwresa .nm{font-size:11.5px;font-weight:700;color:#fff;white-space:nowrap;
  overflow:hidden;text-overflow:ellipsis;min-width:0}
.jgrid .qwcr.qwresa .q{font-size:10.5px;font-weight:700;color:#fff;background:rgba(255,255,255,.22);
  border-radius:20px;padding:1px 7px;flex:none}
.jgrid .qwcr.qwresa .p{font-size:10px;color:#fff;opacity:.8;flex:none}
.jgrid .qwcr.qwresa .p::before,.jgrid .qwcr.qwresa .p::after{content:none}

/* ── LA VIGNETTE D'UN LIEU ──                              (v14.58)
   On reconnaît un lodge à sa photo avant de lire son nom. La photo se
   pose PAR-DESSUS une pastille à l'initiale : si leur serveur
   d'images ne répond pas, l'image s'efface et la pastille reste. Une
   case vide ferait croire à un défaut ; une pastille dit seulement
   que ce lieu n'a pas de photo. */
.qwvig{width:24px;height:24px;border-radius:6px;flex:none;position:relative;overflow:hidden;
  display:grid;place-items:center;color:#fff;font-size:10.5px;font-weight:700;
  font-family:var(--f-ui);border:1px solid rgba(62,43,26,.12)}
.qwvig img{position:absolute;inset:0;width:100%;height:100%;object-fit:cover;display:block}
.qwvig.sm{width:26px;height:26px;border-radius:7px}
.tA .nomcell .qwvig{flex:none}

/* Les deux courbes du parc, puis le verdict.
   « Arrivées » est le flux — accueillir, encaisser, équiper.
   « Présents » est le stock — surveiller. Ce ne sont ni la même
   heure, ni les mêmes gens qu'il faut avoir shiftés. */
.jgrid .jec.qwa{color:var(--encre-2)}
.jgrid .jec.qwa.hi{background:var(--jaune-pale);color:var(--jaune);font-weight:700}
.jgrid .jec.qwpr{color:var(--encre)}
.jgrid .jec.qwpr.hi{background:var(--terra-pale);color:var(--terra-h);font-weight:700}
.jgrid .jlab.qwrat{padding-left:26px}
/* Le seul chiffre qui demande une décision : on le colore, et rien
   d'autre autour. Deux lignes teintées pour la même alerte ne disent
   pas deux fois plus — elles se disputent le regard. */
.jgrid .jec.qwr{color:var(--muet)}
.jgrid .jec.qwr.bon{color:var(--vert)}
.jgrid .jec.qwr.large{background:var(--bleu-pale);color:var(--bleu)}
.jgrid .jec.qwr.tendu{background:var(--rouge-pale);color:var(--rouge);font-weight:700}

/* ── À QUI RÉPOND UN LIEU ──                               (v14.54)
   Une seule case, qui s'ouvre. Trois colonnes — équipes, positions,
   étiquettes — feraient trois listes vides à remplir pour chaque
   lieu ; repliée, la case montre ce qui est posé et rien d'autre.
   Elle s'ouvre d'elle-même quand elle est vide : c'est là qu'il y a
   quelque chose à faire. */
.qwass > summary{list-style:none;cursor:pointer;display:flex;align-items:center;gap:8px;
  padding:3px 0;font-size:12.5px}
.qwass > summary::-webkit-details-marker{display:none}
.qwass > summary::after{content:'›';margin-left:6px;font-size:15px;color:var(--muet);
  transform:rotate(90deg);transition:transform .15s}
.qwass[open] > summary::after{transform:rotate(-90deg)}
.qwass > summary:hover{color:var(--terra-fonce)}
.qwchips{display:flex;flex-wrap:wrap;gap:5px;min-width:0}
.qwchips i{display:inline-flex;align-items:center;gap:6px;font-style:normal;font-size:11.5px;
  font-weight:600;border-radius:20px;padding:3px 9px 3px 7px;background:var(--bleu-pale);
  border:1px solid #D5DCEC;color:var(--bleu)}
.qwchips i b{font-size:9px;font-weight:700;letter-spacing:.04em;text-transform:uppercase;
  opacity:.7;border-right:1px solid rgba(90,110,165,.3);padding-right:6px}
.qwrien{font-size:12px;color:var(--muet);font-style:italic}
.qwassin{padding:8px 0 2px;display:flex;flex-direction:column;gap:9px}
.qwfam > b{display:block;font-size:9.5px;font-weight:700;letter-spacing:.06em;
  text-transform:uppercase;color:var(--muet);margin-bottom:3px}
/* Deux mots à choisir, pas un écran de réglages. */
.qwch{gap:14px;padding:0}
.qwch .rad{font-size:12.5px}
/* Une catégorie que personne ne tient : le libellé dit quoi faire,
   la ligne reste muette. Une colonne de « ∞ » rouges crierait une
   panne là où il n'y a qu'un réglage à poser. */
.jgrid .jlab.qwrat.qwoff{color:var(--muet)}
.jgrid .jlab.qwrat .c{font-size:10px;color:var(--terra-fonce);margin-left:7px;font-weight:600}

/* ═══ LE RÉCAP DU JOUR, REPLIÉ ═══                         (v14.55)

   Replié par choix : la vue Jour a déjà un bandeau d'événements, une
   note, la météo, et une grille qui tient l'écran. Une sixième chose
   dépliée en permanence repousserait le planning sous la ligne de
   flottaison.

   Mais un chiffre replié est un chiffre qu'on ne regarde pas : le
   résumé porte LES DEUX nombres qui décident, et l'ouverture donne le
   reste. Replier ne doit pas vouloir dire cacher. */
.qwrec{background:var(--carte);border:1px solid var(--ligne);border-radius:var(--r);
  box-shadow:var(--ombre);margin-bottom:12px;overflow:hidden}
.qwrec > summary{list-style:none;cursor:pointer;display:flex;align-items:baseline;gap:8px;
  padding:10px 16px;font-size:12.5px;color:var(--encre-2);flex-wrap:wrap}
.qwrec > summary::-webkit-details-marker{display:none}
.qwrec > summary::after{content:'›';font-size:16px;color:var(--muet);margin-left:4px;
  transform:rotate(90deg);transition:transform .15s;align-self:center}
.qwrec[open] > summary::after{transform:rotate(-90deg)}
.qwrec > summary:hover{background:var(--surface-2)}
.qwrec > summary b{font-family:var(--f-titre);font-size:17px;font-weight:700;color:var(--encre);
  font-variant-numeric:tabular-nums}
.qwrk{font-size:9.5px;font-weight:700;letter-spacing:.06em;text-transform:uppercase;
  color:var(--muet);border:1px solid var(--ligne-2);border-radius:20px;padding:2px 8px;
  align-self:center}
.qwru{color:var(--encre-2)}
.qwrsep{width:1px;height:14px;background:var(--ligne);align-self:center;margin:0 4px}
.qwrd{margin-left:auto;font-size:11.5px;color:var(--muet);align-self:center}
.qwrin{display:flex;flex-wrap:wrap;border-top:1px solid var(--ligne)}
.qwrc{flex:1;min-width:150px;padding:11px 16px;border-left:1px solid var(--ligne)}
.qwrc:first-child{border-left:0}
.qwrc .k{display:block;font-size:10px;font-weight:700;letter-spacing:.05em;
  text-transform:uppercase;color:var(--muet);white-space:nowrap}
.qwrc .v{display:block;font-family:var(--f-titre);font-size:19px;font-weight:700;
  line-height:1.3;font-variant-numeric:tabular-nums}
.qwrc .s{display:block;font-size:11.5px;color:var(--encre-2)}
/* Un créneau ouvert que personne n'a réservé : c'est LUI qui dit
   qu'on a shifté pour rien, et il ne se voit nulle part ailleurs. */
.qwrc.qwrv{background:var(--surface-2)}
.qwrc.qwrv .v{color:var(--terra-fonce)}
.qwrp{display:flex;align-items:center;gap:12px;padding:9px 16px;border-top:1px solid var(--ligne);
  background:var(--surface-2);font-size:11.5px;color:var(--muet)}
.qwrp .lk{margin-left:auto}

/* ── LE COMPTE QWEEKLE D'UN SALARIÉ ──                     (v14.55)
   Créer est un geste — c'est donner un accès à la caisse. Entretenir
   n'en est pas un : les changements partent seuls. La carte dit donc
   l'état, jamais « pensez à mettre à jour ». */
.qcqw .qcb{padding:14px 16px}
.qcx{font-size:12.5px;color:var(--encre-2);line-height:1.6}
.qcx.sm{font-size:11.5px;color:var(--muet)}
.qcp{padding:0 16px 14px}
.qcf{display:flex;align-items:flex-end;gap:10px;flex-wrap:wrap;margin-top:11px}
.qcf .fl{display:block;font-size:10.5px;font-weight:700;letter-spacing:.04em;
  text-transform:uppercase;color:var(--muet);margin-bottom:3px}
.qcf .fi{min-width:170px}
.qcg{display:flex;flex-wrap:wrap;gap:12px 30px;padding:14px 16px}
.qcg > div{display:flex;flex-direction:column;gap:2px;min-width:0}
.qcg span{font-size:10.5px;font-weight:700;letter-spacing:.05em;text-transform:uppercase;
  color:var(--muet)}
.qcg b{font-size:13.5px;font-weight:600;word-break:break-word}
.qce{margin:0 16px 14px;padding:9px 11px;border-radius:9px;background:var(--rouge-pale);
  color:var(--rouge-fonce);font-size:12.5px;font-weight:600}

/* ═══ QWEEKLE SUR LES VUES SEMAINE ═══                     (v14.56)

   « Je ne vois pas la ligne dans le planning. »

   Elle n'y était pas : la bande ne vivait que sur la vue Jour, et le
   planning qu'on ouvre par défaut est une semaine en colonnes. Sept
   catégories fois sept jours ne se lisent plus ; ce qu'il faut ici,
   c'est UN nombre par journée. */
.qwrow .pemp.qwlab{display:flex;align-items:center;gap:7px;font-size:11.5px;font-weight:700;
  color:var(--muet)}
.qwlab .qwlx{font-weight:500;font-size:10.5px;opacity:.8}
.pcell.qwc{display:flex;align-items:center;justify-content:center;padding:5px 4px;min-height:54px}
.qwc .qwnul{color:var(--ligne-2);font-size:13px}
/* La case mène à la journée : c'est le seul endroit où le détail
   existe, et c'est là qu'on va quand un nombre surprend. */
.qwj{display:flex;flex-direction:column;align-items:center;gap:1px;width:100%;
  border-radius:8px;padding:4px 5px;border:1px solid transparent}
.qwj:hover{background:var(--surface-2);border-color:var(--ligne)}
.qwj b{font-family:var(--f-titre);font-size:15px;font-weight:700;line-height:1.1;
  font-variant-numeric:tabular-nums}
.qwp2{font-size:10px;color:var(--muet);white-space:nowrap}
.qwr2{font-size:10px;font-weight:700;border-radius:20px;padding:1px 6px;white-space:nowrap;
  color:var(--muet)}
.qwr2 i{font-style:normal;font-weight:600;opacity:.75}
.qwr2.bon{background:var(--vert-pale);color:var(--vert)}
.qwr2.large{background:var(--bleu-pale);color:var(--bleu)}
.qwr2.tendu{background:var(--rouge-pale);color:var(--rouge)}

/* ── LA FORME DE LA JOURNÉE ──                             (v14.78)
   « pic 92 à 18 h » ne dit pas si c'est une pointe d'une heure ou six
   heures pleines — or la première se couvre en décalant deux shifts,
   la seconde demande du monde toute la journée. Aucun nombre ne le
   disait ; seize points le disent.

   C'est une esquisse, pas un graphique : on n'y lit pas une valeur,
   on y voit une forme. D'où l'absence d'axe, de graduation et
   d'étiquette — tout cela suggérerait qu'on peut y mesurer quelque
   chose. Sa COULEUR porte le verdict : elle remplace la pastille
   plutôt que de s'y ajouter. */
.qwspk{display:block;width:100%;height:22px;color:var(--muet);overflow:hidden;line-height:0}
.qwspk svg{display:block;width:100%;height:22px}
.qwspk .a{fill:currentColor;opacity:.15}
.qwspk .t{fill:none;stroke:currentColor;stroke-width:1.6;stroke-linejoin:round;stroke-linecap:round}
.qwspk .c{fill:currentColor}
.qwspk.bon{color:var(--vert)}
.qwspk.large{color:var(--bleu)}
.qwspk.tendu{color:var(--rouge)}
.qwj.qwjc{gap:2px;padding-top:2px}
.qwln{display:flex;align-items:baseline;gap:5px;flex-wrap:wrap;justify-content:center;
  font-variant-numeric:tabular-nums}
.qwln i{font-style:normal;font-size:10px;color:var(--muet);white-space:nowrap}

/* ── LA BULLE DE LA RANGÉE ──                              (v14.78)
   L'infobulle du navigateur arrivait après une seconde, ne tenait pas
   trois lignes, ne se stylait pas et partait au moindre mouvement.
   Celle-ci reprend celle de la vue Jour — même délai, même pose. */
.qwsbul{position:absolute;z-index:120;width:316px;background:var(--carte);
  border:1px solid var(--ligne);border-radius:12px;box-shadow:0 10px 28px rgba(62,43,26,.15);
  overflow:hidden;pointer-events:none}
.qwsbul[hidden]{display:none}
.qwsbul .bh{padding:9px 12px;border-bottom:1px solid var(--ligne);
  display:flex;align-items:baseline;gap:8px}
.qwsbul .bh b{font-family:var(--f-titre);font-size:13.5px}
.qwsbul .bh span{margin-left:auto;font-size:11px;color:var(--muet);white-space:nowrap}
.qwsbul .bb{padding:10px 12px;display:flex;flex-direction:column;gap:9px}
.qwsbul .kv{display:grid;grid-template-columns:1fr auto;gap:3px 10px;font-size:12px}
.qwsbul .kv .k{color:var(--muet)}
.qwsbul .kv .v{font-weight:700;text-align:right;font-variant-numeric:tabular-nums}
.qwsbul .kv .v.bon{color:var(--vert)}
.qwsbul .kv .v.large{color:var(--bleu)}
.qwsbul .kv .v.tendu{color:var(--rouge)}
.qwsbul .lx{font-size:10px;color:var(--muet);letter-spacing:.05em;text-transform:uppercase;
  font-weight:700}
.qwsbul .lieu{display:flex;align-items:center;gap:8px;font-size:12px}
.qwsbul .lieu .n{flex:1 1 auto;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.qwsbul .lieu .q{flex:none;width:34px;text-align:right;font-weight:700;
  font-variant-numeric:tabular-nums}
/* La barre du détail par activité : elle se compare aux autres, le
   plus gros lieu fait la largeur. Elle n'a pas d'échelle affichée —
   le nombre est juste à côté. */
.qwbq{flex:none;width:78px;height:8px;border-radius:4px;background:var(--surface-2);
  overflow:hidden}
.qwbq i{display:block;height:100%;border-radius:4px;background:var(--terra)}

/* ── LES TROIS NOMBRES ET LA TENSION HEURE PAR HEURE ──    (v14.79)
   « Le côté RH : la moyenne par heure sur chaque heure, et on voit là
     où ça manque. » Ce qui arrive, ce qu'on a mis en face, et le
     rapport des deux — puis ce rapport heure par heure. */
.qwb3{display:grid;grid-template-columns:repeat(3,1fr);gap:7px}
.qwb3 > div{background:var(--surface-2);border-radius:9px;padding:6px 8px;min-width:0}
.qwb3 b{display:block;font-family:var(--f-titre);font-size:16px;line-height:1.1;
  font-variant-numeric:tabular-nums}
.qwb3 b.bon{color:var(--vert)}
.qwb3 b.large{color:var(--bleu)}
.qwb3 b.tendu{color:var(--rouge)}
.qwb3 span{display:block;font-size:9.5px;color:var(--muet);margin-top:2px;line-height:1.25}
.qwbg{display:block;width:100%;height:78px}
.qwbg rect.b{fill:var(--terra);opacity:.55}
.qwbg rect.h{fill:var(--rouge);opacity:.85}
.qwbg rect.v{fill:var(--rouge);opacity:.2}
.qwbg line.m{stroke:var(--encre-2);stroke-width:1.2;stroke-dasharray:4 3}
.qwbg text.x{font-size:8px;fill:var(--muet);text-anchor:middle}
.qwbg text.o{fill:var(--encre-2);text-anchor:end}
.qwbl{display:flex;flex-wrap:wrap;gap:4px 12px;font-size:10px;color:var(--muet)}
.qwbl i{display:inline-block;width:9px;height:9px;border-radius:3px;margin-right:5px;
  vertical-align:-1px}
.qwbl i.b{background:var(--terra);opacity:.55}
.qwbl i.h{background:var(--rouge);opacity:.85}
.qwbl i.m{height:0;width:12px;border-top:2px dashed var(--encre-2);border-radius:0;
  vertical-align:3px}
/* La phrase qui nomme l'heure à corriger — pas la journée à corriger. */
.qwbz{font-size:12px;border-radius:9px;padding:6px 10px;background:var(--rouge-pale);
  color:var(--rouge)}
.qwbz.ok{background:var(--vert-pale);color:#3F5F2C}
.qwbz.vide{background:var(--surface-2);color:var(--muet)}
.qwsbul .bf{padding:8px 12px;border-top:1px solid var(--ligne);background:var(--surface-2);
  font-size:11px;color:var(--muet)}
/* La vue Semaine a la grille horaire : une ligne, celle des présents,
   juste au-dessus de l'effectif, pour que les deux se lisent l'une
   sous l'autre. */
.jgrid .jlab.jeff.qwl1{padding:7px 14px}
.jgrid .jlab.qwl1 a{display:block;font-size:11px;font-weight:700;color:var(--muet)}
.jgrid .jlab.qwl1 a:hover{color:var(--terra-fonce)}
.jgrid .jlab.qwl1 .c{display:block;font-size:10px;font-weight:500;color:var(--muet);opacity:.8}

/* ── LE RÉCAP DE CE QUI CIRCULE ──                         (v14.56)
   « Un récap de tout ce qui est importé ou pas. » Ce qui ENTRE à
   gauche, ce qui SORT à droite — et il n'y a qu'une chose qui sorte. */
.qwbil{display:flex;flex-wrap:wrap;background:var(--carte);border:1px solid var(--ligne);
  border-radius:var(--r);box-shadow:var(--ombre);overflow:hidden}
.qwbil > div{flex:1;min-width:170px;padding:12px 16px;border-left:1px solid var(--ligne)}
.qwbil > div:first-child{border-left:0}
.qwbil .k{display:block;font-size:10px;font-weight:700;letter-spacing:.05em;
  text-transform:uppercase;color:var(--muet);white-space:nowrap}
.qwbil .v{display:block;font-family:var(--f-titre);font-size:19px;font-weight:700;line-height:1.3;
  font-variant-numeric:tabular-nums}
.qwbil .v i{font-style:normal;font-size:12.5px;font-weight:600;color:var(--muet)}
.qwbil .s{display:block;font-size:11.5px;color:var(--encre-2)}
.qwbil .qwbils{background:var(--surface-2)}
.qwfil{display:flex;flex-wrap:wrap;gap:7px;padding:11px 16px;border-bottom:1px solid var(--ligne)}
.qwml{display:block;font-size:11px;color:var(--muet)}
.qwid{font-family:var(--f-ui);font-size:12.5px;font-weight:600;background:var(--surface-2);
  border:1px solid var(--ligne);border-radius:7px;padding:2px 7px}
.qwex{font-size:12.5px;color:var(--encre-2)}
.qwq{font-size:12.5px;color:var(--muet);white-space:nowrap}
.qwpq{display:block;font-size:11px;color:var(--muet);margin-top:2px}
.qwpq.qwko{color:var(--rouge-fonce)}

/* ═══ DIRE POURQUOI IL N'Y A RIEN ═══                      (v14.57)

   « Je ne vois toujours rien nulle part ????? »

   Les trois rendus Qweekle du planning n'existaient que s'il y avait
   des données. La règle change : la rangée est là dès que
   l'intégration est branchée, et c'est le CONTENU qui varie — des
   nombres, ou la raison de leur absence avec le geste qui la lève.

   Cette bande occupe toute la largeur de la rangée, là où les sept
   cases seraient : une seule chose à lire quand il n'y a rien à
   comparer. */
.prow > .qwlire{grid-column:2 / -1;display:flex;align-items:center;gap:12px;
  padding:9px 14px;border-left:1px solid var(--surface-2);min-width:0;
  /* Un fond à elle : sinon la teinte du jour courant la coupe en deux
     et l'on croit à une case vide de plus. */
  background:var(--carte)}
.qwlire > b{font-size:12.5px;font-weight:600;color:var(--encre-2)}
.qwlire .lk{margin-left:auto}
.qwlire form{margin-left:auto}
.qwlire .qwlx{font-size:11.5px;color:var(--muet)}
/* Sur la vue Jour, le même objet prend la place du récap : un seul
   objet à cet endroit de l'écran, quoi qu'il dise. */
.qwlire.qwlt{background:var(--jaune-pale);border:1px solid var(--ligne);
  border-radius:var(--r);box-shadow:var(--ombre);margin-bottom:12px;padding:12px 16px}
/* « Lu et vide » n'est pas « pas lu » : un dimanche de novembre sans
   créneau est une information, une journée jamais interrogée non. */
.qwc .qwfer{font-size:11px;font-weight:600;color:var(--muet);background:var(--surface-2);
  border-radius:20px;padding:2px 9px}
/* La vue Semaine garde sa ligne même vide : sept lignes qui
   apparaissent et disparaissent feraient une grille qui saute. */
.jgrid .jlab.qwl1.qwl0 > span{display:block;font-size:11px;font-weight:700;color:var(--muet)}
.jgrid .jlab.qwl0{opacity:.55}
.jgrid .jec.qwl0c{background:var(--surface-2);opacity:.5}

/* ── LA VUE UTILISATEURS ──
   Un interrupteur en haut, un par ligne, et rien d'écrit qui ne
   serve : ces écrans sont regardés par nos clients. */
.qwbar{display:flex;align-items:center;gap:12px;padding:12px 16px;
  border-bottom:1px solid var(--ligne);flex-wrap:wrap}
.qwbar.b2{background:var(--surface-2)}
.qwbar .t{font-size:13.5px;font-weight:600}
.qwbar .t2{font-size:12.5px;font-weight:600;color:var(--encre-2)}
.qwbar .qwlx{margin-left:auto;font-size:11.5px;color:var(--muet)}
/* Un interrupteur de ligne est plus petit : trente à la suite, à la
   taille d'un réglage, feraient une colonne de feux tricolores. */
.sw.qwsw .swt{--swh:18px;--swp:2.5px;width:32px}
.sw.qwsw input:checked+.swt::after{transform:translateX(calc(32px - var(--swh)))}
.sw.qwswx{opacity:.3;cursor:default}
/* Une ligne qu'on a décidé de laisser tranquille s'efface — sans
   disparaître : on doit pouvoir la rallumer. */
.tA tr.qwmute > td{opacity:.55}
.tA tr.qwmute > td:first-child,
.tA tr.qwmute > td:nth-child(2){opacity:1}
/* Une liste de cent lignes se parcourt à la figure avant de se lire
   au nom. */
.qwsal{display:flex;align-items:center;gap:10px;min-width:0}
.qwsal .avm.qwph{width:30px;height:30px;border-radius:50%;color:#fff;flex:none;
  display:flex;align-items:center;justify-content:center;font-size:10.5px;font-weight:700;
  overflow:hidden}
.qwsal .avm.qwph img{width:100%;height:100%;object-fit:cover;display:block}
/* Établissement puis équipe : on vient chercher « mon monde de
   l'accueil à Bénodet ». */
.tA tr.qwgetab > td{background:var(--surface-2);font-family:var(--f-titre);font-size:13px;
  font-weight:700;padding:9px 12px}
.tA tr.qwgetab > td .n{font-family:var(--f-ui);font-size:11px;font-weight:600;color:var(--muet);
  margin-left:8px}
.tA tr.qwgeq > td{font-size:10.5px;font-weight:700;letter-spacing:.05em;
  text-transform:uppercase;color:var(--muet);padding:7px 12px}
.qwlie{display:inline-flex;align-items:center;gap:7px;font-size:12.5px}
.qwlie i{font-style:normal;font-size:10px;font-weight:700;letter-spacing:.04em;
  text-transform:uppercase;color:var(--vert);background:var(--vert-pale);
  border-radius:20px;padding:2px 7px}

/* ═══ CE QU'ON MONTRE DU PLANNING QWEEKLE ═══              (v14.58)
   Quatre emplacements, quatre interrupteurs, sur une seule bande —
   ils valent pour l'organisation, pas pour un lieu. */
.qwou{display:flex;flex-wrap:wrap;gap:10px;padding:12px 16px;border-bottom:1px solid var(--ligne)}
.qwou .sw{border:1px solid var(--ligne);border-radius:10px;padding:7px 12px;
  background:var(--surface-2)}
.qwou .sw .swl{font-size:12.5px}
/* Le rangement de la bande tenait ici sur une ligne, avec une
   infobulle pour toute explication. Il est passé aux deux pavés de
   `.qwexpl` (v14.75) : `.qwou.qwrang` et `.qwrl` n'ont plus d'écran,
   et une règle morte est une règle que quelqu'un recopiera. */
/* ── L'INTERRUPTEUR DU MENU AFFICHAGE ──                    (v14.58)
   « Dans Affichage de chaque planning, si intégration Qweekle,
     activer ou désactiver la ligne. »

   Chaque élément rendu par la bande, la rangée et la ligne porte
   `qwx` : une grille CSS n'accepte pas d'enveloppe, et masquer par
   des classes de structure (`.jcell`, `.jt`) emporterait la grille
   elle-même. Un marqueur, donc, et un seul sélecteur. */
body.sans-qweekle .qwx,
body.sans-qweekle .qwrow,
body.sans-qweekle .qwrec,
body.sans-qweekle .qwbul,
body.sans-qweekle .qwlire.qwlt{display:none !important}
/* La bulle de survol ne s'imprime pas : elle n'existe qu'au passage
   de la souris, et une feuille de papier n'en a jamais. */
@media print{.qwbul{display:none !important}}
/* L'exploitation à côté de l'établissement : c'est la correspondance
   qu'on vient vérifier, et elle ne se lisait nulle part (v14.58.4). */
.tA tr.qwgetab > td .v{font-family:var(--f-ui);font-size:11.5px;font-weight:600;
  color:var(--encre-2);margin-left:8px}

/* ═══════════════════════════════════════════════════════════════
   LES RÉGLAGES D'UNE INTÉGRATION                 (v14.68, v14.69)

   « La partie paramètres intégrations est vraiment nulle, fais une
     refonte complète. »
   « On ne souhaite pas avoir "1 Établissement", "2 Planning", mais un
     menu comme avant. »
   « ON UTILISE LES ÉLÉMENTS DU KIT INTERFACE. »

   La v14.68 avait redessiné la moitié de l'écran : des étapes
   numérotées à la place du menu, un « segment » à deux pavés au lieu
   du choix unique, des interrupteurs terracotta là où ceux du kit sont
   verts, des lignes de liste inventées alors que `.docrow` existe.

   Tout cela est retombé. Ce qui reste ici est ce que le kit n'a PAS,
   et rien d'autre — deux pièces, nommées, documentées dans `kit.php` :

     .itgetat   le bandeau d'état d'une intégration
     .itgdeux   la liste à deux volets

   Le menu, le sélecteur d'établissement, les lignes, les pastilles,
   les interrupteurs, le choix unique, les boutons, les tableaux : tout
   vient du catalogue.
   ═══════════════════════════════════════════════════════════════ */

/* ── LE BANDEAU D'ÉTAT ──
   Il remplace l'onglet « Accès », qui était une page pour cinq lignes
   qu'on ne relit jamais. */
.itgetat{display:flex;align-items:stretch;background:var(--carte);border:1px solid var(--ligne);
  border-radius:var(--r);margin-bottom:16px;overflow:hidden;flex-wrap:wrap;box-shadow:var(--ombre)}
.itgetat .id{display:flex;align-items:center;gap:12px;padding:13px 16px;flex:none}
.itgetat .lg{width:38px;height:38px;border-radius:11px;background:#1E2A3A;color:#fff;
  display:grid;place-items:center;font-family:var(--f-titre);font-size:15px;font-weight:700}
.itgetat .nm{display:flex;flex-direction:column;line-height:1.25}
.itgetat .nm b{font-family:var(--f-titre);font-size:15.5px}
.itgetat .nm span{font-size:11.5px;color:var(--muet)}
.itgetat .kv{display:flex;gap:24px;padding:13px 20px;border-left:1px solid var(--ligne);
  flex:1 1 auto;flex-wrap:wrap;min-width:0}
.itgetat .kv>div{display:flex;flex-direction:column;gap:3px;min-width:0}
.itgetat .kv b{font-size:13px;font-weight:700;white-space:nowrap}
/* Ce qui PROUVE une lecture : leur identifiant, qui ne peut pas venir
   de chez nous. Ou la raison de son absence (v14.72). */
.itgsub{display:block;font-style:normal;font-size:10px;font-weight:600;color:var(--muet);
  letter-spacing:.01em;margin-top:2px}
.itgsub.ko{color:var(--rouge)}
.itgetat .kv span{font-size:10px;font-weight:700;letter-spacing:.06em;text-transform:uppercase;
  color:var(--muet)}
.itgetat .ac{display:flex;gap:8px;align-items:center;padding:13px 16px;
  border-left:1px solid var(--ligne);flex:none}
.itgetat .ac form{display:contents}
.itgetat .er{flex:1 1 100%;padding:9px 16px;background:var(--rouge-pale);color:var(--rouge);
  font-size:12.5px;border-top:1px solid var(--ligne)}
/* Le menu et le sélecteur d'établissement sont des `.pgt` du kit ;
   seules leurs marges sont à nous. */
.pgt.itgmenu{margin-bottom:16px}
/* ── LA LIGNE QU'ON A ÉTEINTE ──                           (v14.73)
   L'interrupteur est la PREMIÈRE colonne : la question vient avant la
   réponse. Éteinte, la ligne n'a plus rien à dire — le nom s'efface,
   la liste déroulante disparaît (elle reste postée, sans quoi on
   perdrait la correspondance qu'on vient seulement de mettre en
   veille) et un tiret prend sa place. */
.itgrow .itgna{display:none;color:var(--muet)}
.itgrow.off .itgexp{display:none}
.itgrow.off .itgna{display:inline}
.itgrow.off .nomcell{color:var(--muet)}

/* Une liste déroulante, un état, et ce qui reste à faire (v14.71). */
.itgetb{padding:12px 18px;border-bottom:1px solid var(--ligne);background:var(--surface-2);
  display:flex;align-items:center;gap:12px;flex-wrap:wrap}
.itgetb .fl{margin:0}
.itgetb select.fi{max-width:340px;width:auto}
.itgetb .meta{margin-left:auto}

/* ── LE SÉLECTEUR QUI GOUVERNE L'ÉCRAN ──                  (v14.75)
   Il était DANS une carte, et le bloc du dessous annonçait « vaut pour
   toute l'organisation » : deux portées sur le même écran. Il passe
   au-dessus des cartes — tout ce qu'on lit en dessous concerne
   l'établissement nommé ici. */
.itgtete{display:flex;align-items:center;gap:12px;flex-wrap:wrap;padding:14px 18px;
  background:var(--carte);border:1px solid var(--ligne);border-radius:var(--r);margin-bottom:14px}
.itgtete .fl{margin:0}
.itgtete select.fi{max-width:340px;width:auto}
.itgtete .meta{margin-left:auto}

/* Un module d'une carte à plusieurs réglages : son titre, son
   contenu, un filet en dessous. */
.qwmod{padding:14px 18px;border-bottom:1px solid var(--ligne)}
.qwmod .mt{display:flex;align-items:baseline;gap:9px;flex-wrap:wrap;margin-bottom:10px}
.qwmod .mt b{font-size:12px;font-weight:700;letter-spacing:.04em;text-transform:uppercase}
.qwmod .mt span{font-size:11.5px;color:var(--muet)}
.qwmod .qwou{border-bottom:0;padding:0}
/* Ce qu'un réglage IMPLIQUE, quand il fait disparaître quelque
   chose : une ligne qui s'efface toute seule est le genre de silence
   qui fait chercher longtemps (v14.77). */
.qwmt{display:block;margin-top:9px;font-size:11.5px;color:var(--muet);line-height:1.55;max-width:74ch}
/* Un réglage chiffré qui peut légitimement rester vide (v14.78). */
.itgobj{display:flex;align-items:center;gap:10px;flex-wrap:wrap;margin-top:12px;
  padding-top:12px;border-top:1px dashed var(--ligne)}
.itgobj .fl{margin:0}
.itgobj .u{font-size:12px;color:var(--muet)}
.itgobj .qwmt{flex:1 1 100%}
.ch.itgsep{border-top:1px solid var(--ligne)}

/* ── UN CHOIX QUI SE MONTRE ──                              (v14.75)
   « Ajoute une explication à "sous chaque équipe" et "tout
     regrouper". »
   C'étaient deux libellés avec une infobulle ; personne ne survole une
   infobulle pour comprendre un réglage qu'il fait une fois. Deux
   pavés, un schéma du planning dans chacun, et ce que le choix
   implique écrit dessous. */
.qwexpl{display:grid;grid-template-columns:1fr 1fr;gap:10px}
.qwexpl > label{display:flex;flex-direction:column;gap:8px;border:1px solid var(--ligne);
  border-radius:12px;padding:12px 14px;cursor:pointer;background:var(--surface-2);transition:all .13s}
.qwexpl > label:hover{border-color:var(--muet)}
.qwexpl > label.on{border-color:var(--terra);background:var(--terra-pale)}
.qwexpl .rad{font-size:13px;font-weight:700}
.qwexpl .d{font-size:11.5px;color:var(--muet);line-height:1.55}
.qwexpl .d b{color:var(--encre-2);font-weight:600}
/* Le schéma : six lignes qui disent en une seconde ce qu'un
   paragraphe dit mal. Les teintes sont celles du planning — crème pour
   un bandeau d'équipe, bleu pour ce qui vient de chez eux. */
.qwsch{display:flex;flex-direction:column;gap:2px;background:var(--carte);
  border:1px solid var(--ligne);border-radius:8px;padding:7px}
.qwsch i{font-style:normal;font-size:10px;font-weight:700;letter-spacing:.04em;border-radius:4px;
  padding:3px 7px;display:block;text-transform:uppercase}
.qwsch i.eq{background:#E8E1D2;color:#6E5B47}
.qwsch i.qw{background:#DCE4F2;color:#4A5A8C;text-transform:none;letter-spacing:0}
.qwsch i.sa{background:transparent;color:var(--muet);font-weight:500;text-transform:none;
  letter-spacing:0;padding:2px 7px}
.qwsch i.qw.dec{margin-left:10px}
@media (max-width:760px){ .qwexpl{grid-template-columns:1fr} }

/* ── LA LISTE À DEUX VOLETS ──
   Le kit n'a pas de maître/détail : `.bapp` est la borne, plein écran
   et fond sombre. Les LIGNES, elles, sont des `.docrow` du kit — on
   n'ajoute que ce qui fait d'une ligne un choix : le curseur, le
   liseré de sélection, et le repli de ce qui est masqué. */
.itgdeux{display:grid;grid-template-columns:320px 1fr;min-height:400px}
.itglst{border-right:1px solid var(--ligne);background:var(--surface-2);display:flex;
  flex-direction:column;min-width:0}
.itglst .rch{padding:10px 12px;border-bottom:1px solid var(--ligne)}
.itglst .in{overflow:auto;flex:1 1 auto;max-height:470px}
.itglst .docrow{cursor:pointer;border-left:3px solid transparent;
  border-bottom:1px solid var(--ligne)}
.itglst .docrow:hover{background:#F4F0E7}
.itglst .docrow.on{background:var(--carte);border-left-color:var(--terra)}
.itglst .docrow.mute .qwvig,.itglst .docrow.mute .col{opacity:.42}
.itglst .docrow .col{flex:1 1 auto;min-width:0}
.itglst .docrow .d1,.itglst .docrow .d2{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.itglst .docrow .d2.wa{color:var(--jaune);font-weight:600}
.itglst .docrow .rr{margin-left:auto;flex:none}

.itgvol{display:none;flex-direction:column;min-width:0}
.itgvol.on{display:flex}
.itgdh{display:flex;align-items:center;gap:12px;padding:14px 18px;border-bottom:1px solid var(--ligne)}
.itgdh .col{flex:1 1 auto;min-width:0;display:flex;flex-direction:column;line-height:1.3}
.itgdh b{font-family:var(--f-titre);font-size:17px;font-weight:700}
.itgdh .s{font-size:11.5px;color:var(--muet)}
/* Des noms à nous, et pas `.bl` ni `.fl` : la feuille de style en a
   déjà — `.bl` est une ligne de borne, centrée, bordée et cliquable —
   et le volet en héritait sans que rien ne le dise (v14.68). */
.itgbd{padding:16px 18px;display:flex;flex-direction:column;gap:18px;align-items:flex-start;
  text-align:left}
.itgb{display:flex;flex-direction:column;gap:9px;width:100%}
.itgt{display:flex;align-items:baseline;gap:9px;flex-wrap:wrap}
.itgt b{font-size:12px;font-weight:700;letter-spacing:.04em;text-transform:uppercase}
.itgt span{font-size:11.5px;color:var(--muet)}
/* ── LA CONSÉQUENCE D'UN RÉGLAGE ──                        (v14.71)
   « Qui le tient », ça ne voulait rien dire. Ce qui le dit, c'est le
   résultat : « aujourd'hui, 3 salariés couvrent Accrobranche ». Vert
   quand c'est réglé, ambre quand il manque quelque chose — les deux
   teintes de `.pill`, au même endroit du vocabulaire. */
.itgcq{display:flex;gap:9px;align-items:flex-start;background:var(--vert-pale);
  border-radius:10px;padding:10px 12px;font-size:12.5px;line-height:1.55;color:#3F5F2C;width:100%}
.itgcq b{font-weight:700}
.itgcq .ic{flex:none;margin-top:1px;display:flex}
.itgcq .ic svg{width:16px;height:16px}
.itgcq .ic.wa,.itgcq.wa .ic.ok{display:none}
.itgcq.wa .ic.wa{display:flex}
.itgcq.wa{background:#FBF1DA;color:#8A5F0E}

/* L'aperçu de la journée, dans le volet : « ce qui est lu » n'a plus
   de carte à lui. Les couleurs sont celles de la bande — mêmes états,
   mêmes teintes, un seul vocabulaire. */
.itgapr{border:1px solid var(--ligne);border-radius:10px;overflow:hidden;background:var(--surface-2);
  width:100%}
.itgapr .at{padding:7px 12px;font-size:11px;font-weight:700;color:var(--muet);letter-spacing:.05em;
  text-transform:uppercase;border-bottom:1px solid var(--ligne);display:flex;gap:8px}
.itgapr .at span{margin-left:auto;text-transform:none;letter-spacing:0;font-weight:500}
.itgapr .ag{display:flex;flex-wrap:wrap;gap:3px;padding:10px 12px}
.itgapr .ag i{min-width:38px;height:26px;border-radius:5px;display:grid;place-items:center;
  font-size:11px;font-weight:700;font-style:normal;background:#F0EBE1;color:#A2927A;padding:0 5px}
.itgapr .ag i.v{background:#DFEBD1;color:#3F5F2C}
.itgapr .ag i.m{background:#F6E3B4;color:#8A5F0E}
.itgapr .ag i.p{background:var(--rouge);color:#fff}
.itgapr .ag i.s{background:repeating-linear-gradient(-45deg,
    #E6E0D2,#E6E0D2 3px,#F7F4ED 3px,#F7F4ED 8px);color:#6E6152}
.itgapr .nn{padding:12px;font-size:12px;color:var(--muet)}

/* ── LE PIED D'UNE CARTE QUI S'ENREGISTRE ──
   Une carte, un bouton, et une phrase qui dit ce qui a changé. */
.itgbar{display:flex;align-items:center;gap:12px;padding:11px 16px;background:var(--surface-2);
  border-top:1px solid var(--ligne)}
.itgbar .n{font-size:12.5px;color:var(--muet);flex:1 1 auto}
.itgbar .n b{color:var(--encre)}

@media (max-width:900px){
  .itgdeux{grid-template-columns:1fr}
  .itglst{border-right:0;border-bottom:1px solid var(--ligne)}
  .itglst .in{max-height:280px}
}

/* ═══════════════════════════════════════════════════════════════
   ZONES ET LIEUX                                          (v14.87)

   Un écran de tracé : la carte occupe la place, le tiroir se replie
   pendant qu'on dessine, et la liste répond à la carte. Tout ce qui
   suit est de la mise en forme — les décisions vivent dans
   `lib_zones.php` et `assets/zones.js`.
   ═══════════════════════════════════════════════════════════════ */

/* La carte de cet écran est plus haute que celle de l'émargement :
   on y travaille, on ne la consulte pas. Et elle est ÉLASTIQUE — la
   carte de l'émargement fait 760 px fixes et laisse le reste au
   tableau ; ici le tableau a quatre colonnes dont un bouton, et il
   se faisait couper. */
.zg{display:grid;grid-template-columns:minmax(0,1fr) minmax(380px,490px);gap:18px;align-items:start}
.zw{width:100%}
.zl{min-width:0;border:1px solid var(--ligne);border-radius:10px;overflow:hidden;background:var(--carte)}
/* `table.emt` porte « min-width:1080px » — c'est juste pour le grand
   tableau d'émargement, et c'est faux ici : la liste vit dans une
   colonne de cinq cents pixels, et tout ce qui dépassait était coupé
   par le cadre. Trois colonnes, dont deux qui savent revenir à la
   ligne. */
.zl .emt{margin:0;min-width:0;table-layout:fixed}
/* Les cellules d'émargement sont en « nowrap » — juste sur un tableau
   large, faux dans une colonne de cinq cents pixels. On le lève pour
   toute la descendance : le détail d'une zone tient sur deux lignes
   plutôt que de passer par-dessus la colonne voisine. */
.zl .emt td,.zl .emt th,.zl .emt td *{white-space:normal}
.zl .emt th:nth-child(2),.zl .emt td:nth-child(2){width:38%}
.zl .emt .cact{width:92px}
/* `.nn` empile son titre et sa précision — la règle vit sous
   « .emqui » ailleurs, et la colonne « Qui » n'a pas d'avatar. */
.zl .nn{display:block;min-width:0}
.zl .nn b{display:block;font-weight:600;line-height:1.3}
.zl .nn > span{display:block;font-size:12px;color:var(--muet);line-height:1.4;overflow-wrap:anywhere}
/* La pastille de dates et la description sont des enfants directs de
   « .nn » : sans ces deux lignes, la règle ci-dessus les passerait en
   bloc gris comme la ligne technique (v14.94). */
.zl .nn > .zdates{display:inline-flex;font-size:12px;color:var(--terra-fonce)}
.zl .nn > .zdesc{display:block;font-size:12px;color:var(--encre-2)}
.zl .emqui{display:flex;align-items:flex-start;gap:7px;min-width:0}
/* Sans « min-width:0 », un enfant de flex refuse de rétrécir sous la
   largeur de son texte : la ligne « cercle · 300 m · 17,6 km du site
   · 14/09 → 21/09 » débordait par-dessus la colonne d'à côté. */
.zl .emqui > .nn{flex:1 1 auto;min-width:0}
.zl .zpast{margin-top:5px}
#zmap{height:600px}
@media (max-width:1150px){
  .zg{grid-template-columns:1fr}
  #zmap{height:440px}
}
@media (max-width:900px){#zmap{height:380px}}

/* ── PENDANT LE TRACÉ ──
   Le tiroir se replie au lieu de se fermer : un formulaire fermé au
   milieu d'une saisie est une saisie perdue. Il laisse une lisière
   visible — on sait qu'il est là, et un clic dessus le ramène. */
/* ═══ LE BLOC CARTE ═══                                    (v14.90)

   « La procédure — ouvrir la carte pour créer — n'est pas terrible.
     Pourquoi ne pas afficher la carte dans le tiroir et avoir un
     bouton plein écran ? »

   La fenêtre séparée réglait un vrai problème — il fallait une sortie
   nommée — mais elle en créait un autre : trois écrans pour poser
   trois points. Le bloc vit donc DANS le tiroir, et le plein écran
   n'est plus qu'un agrandissement : le même bloc, déplacé. */
.zbloc{border:1px solid var(--ligne-2);border-radius:var(--r);overflow:hidden;
  background:var(--surface-2);display:flex;flex-direction:column}
.zbar{display:flex;align-items:center;gap:8px;padding:8px 9px;border-bottom:1px solid var(--ligne);
  background:var(--carte)}
.zbar .sp{flex:1}
.zseg2{display:flex;border:1px solid var(--ligne-2);border-radius:8px;overflow:hidden}
.zseg2 button{border:0;background:var(--carte);cursor:pointer;height:30px;padding:0 12px;
  font-family:var(--f-ui);font-size:12.5px;font-weight:600;color:var(--encre-2);
  display:inline-flex;align-items:center;gap:6px}
.zseg2 button + button{border-left:1px solid var(--ligne-2)}
.zseg2 button.on{background:var(--terra-pale);color:var(--terra-fonce)}
.zseg2 svg{width:15px;height:15px}
.zico{border:1px solid var(--ligne-2);background:var(--carte);border-radius:8px;height:30px;width:32px;
  display:inline-flex;align-items:center;justify-content:center;cursor:pointer;color:var(--encre-2);
  padding:0}
.zico svg{width:16px;height:16px}
.zico:hover:not(:disabled){background:var(--surface-2);color:var(--encre)}
.zico:disabled{opacity:.35;cursor:not-allowed}

/* Le rayon se TAPE aussi : tirer à la souris donne 118 ou 123, et
   quand on veut un chiffre rond on l'écrit. En mètres ou en
   kilomètres — un dépôt fait 120 m, une zone de chantier 2,5 km. */
.zray{display:flex;align-items:center;gap:8px;padding:8px 9px;background:var(--carte);
  border-bottom:1px solid var(--ligne)}
.zray[hidden]{display:none}
.zray label{font-size:12px;font-weight:600;color:var(--encre-2)}
.zray input{height:30px;width:100px;font-variant-numeric:tabular-nums}
.zunit{display:flex;border:1px solid var(--ligne-2);border-radius:8px;overflow:hidden}
.zunit button{border:0;background:var(--carte);cursor:pointer;height:30px;padding:0 10px;
  font-family:var(--f-ui);font-size:12.5px;font-weight:600;color:var(--muet)}
.zunit button + button{border-left:1px solid var(--ligne-2)}
.zunit button.on{background:var(--terra-pale);color:var(--terra-fonce)}

/* ── ALLER À UNE ADRESSE ──                               (v14.92)
   La liste tombe SUR la carte : elle ne pousse rien, et le bloc ne
   change pas de hauteur pendant qu'on tape. */
.zadr{position:relative;display:flex;align-items:center;gap:8px;padding:8px 9px;
  background:var(--carte);border-bottom:1px solid var(--ligne);z-index:5}
.zadr input{height:30px;flex:1;min-width:0}
.zadri{display:inline-flex;align-items:center;color:var(--muet)}
.zadri svg{width:16px;height:16px}
.zsug{position:absolute;left:9px;right:9px;top:44px;background:var(--carte);
  border:1px solid var(--ligne-2);border-radius:10px;overflow:hidden;z-index:6;
  box-shadow:0 10px 24px rgba(0,0,0,.14)}
.zsug[hidden]{display:none}
.zsugi{display:block;width:100%;text-align:left;border:0;background:none;cursor:pointer;
  padding:7px 11px;font-family:var(--f-ui);font-size:12.5px;color:var(--encre)}
.zsugi + .zsugi{border-top:1px solid var(--ligne)}
.zsugi small{display:block;font-size:11.5px;color:var(--muet)}
.zsugi:hover,.zsugi.on{background:var(--terra-pale)}
.zsugv{padding:7px 11px;font-size:12.5px;color:var(--muet)}
/* Le repère de l'adresse trouvée : il montre, il ne trace pas. */
.zpin{filter:drop-shadow(0 2px 3px rgba(0,0,0,.3))}

.zmapw{position:relative}
.zmap2{height:250px;background:#EEF0EA}
.zbloc.plein{flex:1;min-height:0;border:0;border-radius:0}
.zbloc.plein .zmapw{flex:1;min-height:0;display:flex}
.zbloc.plein .zmap2{height:auto;flex:1;min-height:0;width:100%}
/* Le tracé manquant se signale là où il manque. */
.zmapw.zreq{outline:2px solid var(--terra);outline-offset:-2px}

.zpied{display:flex;align-items:center;gap:9px;padding:8px 10px;background:var(--carte);
  border-top:1px solid var(--ligne);font-size:12.5px;color:var(--encre-2);flex-wrap:wrap}
.zpied .sp{flex:1}
.zkit{background:var(--terra-pale);color:var(--terra-fonce);border-radius:99px;padding:3px 11px;
  font-size:12px;font-weight:600;font-variant-numeric:tabular-nums;white-space:nowrap}
.zkit.vide{background:var(--surface-2);color:var(--muet);font-weight:400}
.zhint{font-size:12px;color:var(--muet);min-width:0}

/* ── LE CURSEUR DIT CE QUE LE CLIC VA FAIRE ──              (v14.90)

   « On a une main au lieu d'un clic sur la carte, c'est pas terrible. »

   Leaflet pose `cursor:grab` sur toute sa carte. C'est juste quand on
   la déplace, c'est faux quand on trace — et une main, sur un écran
   où l'on doit cliquer, dit exactement le contraire de ce qu'il faut
   faire. Le « !important » n'est pas un caprice : la règle de Leaflet
   est sur le conteneur lui-même, et la nôtre vient d'un ancêtre. */
.zmapw.ztrace .leaflet-container,
.zmapw.ztrace .leaflet-grab,
.zmapw.ztrace .leaflet-interactive{cursor:crosshair !important}
.zmapw.ztrace .leaflet-marker-icon.zpg{cursor:grab !important}
.zmapw.ztrace .leaflet-marker-icon.zpg:active{cursor:grabbing !important}
.zmapw.ztrace .leaflet-control,
.zmapw.ztrace .leaflet-control a{cursor:pointer !important}

/* ═══ LE PLEIN ÉCRAN ═══
   Une coque : le bloc vient s'y loger tel quel. Au-dessus de TOUT, et
   le chiffre n'est pas arbitraire — le voile du tiroir vit à 90, et
   les commandes de Leaflet montent à 800. */
.ztr{position:fixed;inset:0;z-index:1200;background:var(--fond);display:flex;flex-direction:column}
.ztr[hidden]{display:none}
body.zfige{overflow:hidden}
.ztrh{display:flex;align-items:center;gap:14px;padding:11px 18px;background:var(--carte);
  border-bottom:1px solid var(--ligne)}
.ztrh b{font-family:var(--f-titre);font-size:16px;font-weight:600;color:var(--encre)}
.ztrh .sp{flex:1}
.ztrh .btn svg{width:16px;height:16px}
.ztrslot{flex:1;min-height:0;display:flex;flex-direction:column}

/* ── L'ÉTIQUETTE D'UNE ZONE ──
   Posée au centre du tracé, sans fond : un cartouche de plus sur une
   carte déjà chargée ne s'y voit pas, il l'encombre. */
.zetq{pointer-events:none}
/* Un cran au-dessus du centre : c'est là que se pose le repère d'une
   pointeuse, et deux choses au même pixel n'en font plus qu'une. */
.zetq span{position:absolute;transform:translate(-50%,-165%);white-space:nowrap;
  font-family:var(--f-ui);font-size:12px;font-weight:600;color:#6B4468;
  text-shadow:0 0 4px #fff,0 0 4px #fff,0 0 4px #fff}
body.theme-sombre .zetq span{color:#D9BFD6;text-shadow:0 0 4px #1C1613,0 0 4px #1C1613}

/* La pointeuse posée sur une zone : un carré sombre, comme sur la
   carte d'émargement — c'est un objet, pas un événement. */
.zbor i{display:block;width:22px;height:22px;border-radius:7px;background:var(--encre);
  border:2px solid #fff;box-shadow:var(--ombre)}

/* ── LES POIGNÉES ──
   Pleines : un sommet. Creuses, au milieu d'une arête : un sommet à
   ajouter. La différence se voit sans légende. */
.zpg i{display:block;width:12px;height:12px;border-radius:50%;background:#fff;
  border:2px solid var(--terra);box-shadow:0 1px 3px rgba(62,43,26,.35)}
.zpg{cursor:grab}
/* Creuse : un sommet à naître. On la TIRE — le sommet apparaît sous
   le doigt et suit le mouvement —, ou on la clique pour le poser
   sans le déplacer. */
.zpg.creux i{width:11px;height:11px;background:rgba(255,255,255,.7);
  border-width:2px;border-color:rgba(233,102,70,.5);border-style:dashed}
.zpg.creux:hover i{background:#fff;border-style:solid;border-color:var(--terra)}
.zpg.creux{cursor:grab}
.zpg:active,.zpg.creux:active{cursor:grabbing}
/* Les zones voisines, dans la fenêtre de tracé : présentes pour se
   repérer, jamais assez fortes pour qu'on les confonde avec la sienne. */
.zetq.pale span{opacity:.6;font-weight:500}

/* ── LE PREMIER SOMMET EST UNE CIBLE ──                     (v14.89)
   « Fermez en cliquant sur le premier » ne veut rien dire tant qu'on
   ne voit pas lequel c'est : le tracé en cours n'affichait aucun
   sommet, seulement le trait. On cliquait, la forme ne se fermait
   jamais, et « Valider » restait éteint devant un polygone pourtant
   dessiné. */
.zpt1{cursor:pointer}
.leaflet-container .zpt1:hover{stroke-width:5}

/* ── LA BASCULE À DEUX CHOIX ──
   Nature, forme, cibles : trois fois le même objet, parce que c'est
   trois fois la même question. */
.zseg{display:flex;border:1px solid var(--ligne-2);border-radius:var(--r-sm);overflow:hidden;
  background:var(--carte)}
.zseg button{flex:1;border:0;background:var(--carte);cursor:pointer;padding:9px 8px;
  font-family:var(--f-ui);font-size:13px;font-weight:600;color:var(--encre-2);
  display:flex;flex-direction:column;align-items:center;gap:1px;line-height:1.25}
.zseg button + button{border-left:1px solid var(--ligne-2)}
.zseg button.on{background:var(--terra-pale);color:var(--terra-fonce)}
.zseg button i{font-style:normal;font-weight:400;font-size:11px;opacity:.75}
/* ── LE COMPTEUR EST À CÔTÉ, PAS DESSOUS ──                (v14.91)
   Les boutons de bascule empilent leur libellé et leur détail —
   « Lieu » au-dessus de « permanent ». Sur les cibles il n'y a pas de
   détail, il y a un NOMBRE : il se lit à côté du mot, pas sous lui. */
/* ── ET CENTRÉ DANS SON BOUTON ──                          (v14.93)
   « "Salariés" et "Équipes" doivent être centrés dans le menu. » Les
   boutons du segment cadrent leur contenu au centre partout ailleurs ;
   celui-ci, passé en ligne pour ramener le compteur à côté du mot,
   avait perdu son centrage horizontal en même temps. */
.zsegr button{flex-direction:row !important;align-items:center;
  justify-content:center;gap:0}
.zcnt{display:inline-flex;align-items:center;justify-content:center;min-width:18px;height:18px;
  padding:0 5px;border-radius:99px;background:var(--ligne-2);color:var(--encre-2);
  font-size:11px;font-weight:700;margin-left:5px}
.zseg button.on .zcnt{background:var(--violet);color:#fff}

/* ── LE RÉCAPITULATIF, ET LE RAPPEL DU TRACÉ ──
   Ils disent ce que la zone fera, et surtout ce qu'elle NE fera pas.
   Une zone dans le périmètre n'ouvre aucun droit ; une zone sans
   cible ne vise personne. Mieux vaut le lire avant d'enregistrer. */
.zrec{background:var(--surface-2);border:1px solid var(--ligne);border-radius:var(--r-sm);
  padding:11px 13px;font-size:13px;color:var(--encre-2);margin-top:8px;line-height:1.55}
.zrec b{color:var(--encre)}
.zrec.zvide2{color:var(--muet);font-style:italic}
.zrec.zreq{border-color:var(--terra);background:var(--terra-pale);color:var(--terra-fonce)}
.zvide{color:var(--jaune-fonce)}
.zact{margin-top:8px}

/* ── LES CASES ──
   Pleine largeur et cliquables sur toute la ligne : on coche une
   équipe avec le pouce sur une tablette, pas au pixel près. */
.zpan{margin-top:9px}
.zck{display:flex;align-items:center;gap:9px;padding:8px 10px;border:1px solid var(--ligne);
  border-radius:var(--r-sm);background:var(--carte);margin-bottom:6px;font-size:13.5px;cursor:pointer}
.zck:hover{border-color:var(--ligne-2);background:var(--surface-2)}
.zck input{position:absolute;opacity:0;width:0;height:0}
.zbx{width:17px;height:17px;border-radius:5px;border:1.5px solid var(--ligne-2);background:var(--carte);
  flex:none;position:relative}
/* ── LA COCHE, CENTRÉE POUR DE BON ──                      (v14.91)
   Elle était posée en pixels depuis le coin haut-gauche : à 17 px de
   case, avec une bordure d'un pixel et demi, elle tombait toujours un
   peu haut et un peu à gauche. On la centre, puis on la décale de la
   moitié de son propre débord — c'est de l'arithmétique, pas du
   réglage à l'œil. */
.zck input:checked ~ .zbx{background:var(--violet);border-color:var(--violet)}
.zck input:checked ~ .zbx::after{content:'';position:absolute;left:50%;top:50%;
  width:5px;height:9px;border:solid #fff;border-width:0 2px 2px 0;
  transform:translate(-50%,-58%) rotate(42deg)}
.zck input:indeterminate ~ .zbx{background:var(--violet);border-color:var(--violet)}
.zck input:indeterminate ~ .zbx::after{content:'';position:absolute;left:50%;top:50%;
  width:9px;height:0;border:0;border-top:2px solid #fff;transform:translate(-50%,-50%)}
.zck input:checked ~ b{color:var(--encre)}
.zck b{font-weight:600;color:var(--encre-2)}
.zck[hidden]{display:none}
.ztous{border-style:dashed}

/* ── UN SITE, PUIS SES ÉQUIPES ──                          (v14.93)

   « Tu remplaces "toutes les équipes" par un établissement, puis les
     équipes dessous. »

   Le site est le parent : il porte son nom en gras et la mention
   « tout le site ». Ses équipes sont en retrait de la largeur d'une
   case — le même retrait que l'arbre des pointeuses, pour que ce soit
   la même chose à l'œil.

   Coché, le site vaut pour tout le monde : ses équipes n'ajoutent
   plus rien, et elles se grisent. On ne les décoche pas — décocher le
   site doit rendre le choix d'avant. */
.zetg{border:1px solid var(--ligne);border-radius:var(--r-sm);background:var(--carte);
  margin-bottom:8px;overflow:hidden}
.zetg.ici{border-color:var(--ligne-2)}
.zetg .zetgh{margin:0;border:0;border-radius:0;background:var(--surface-2)}
.zetg .zetgq{padding:4px 10px 8px 34px}
.zetg .zetgq .zck{border:0;background:none;padding:5px 0;margin:0}
.zetg .zetgq .zck:hover b{color:var(--encre)}
.zetg.tout .zetgq{opacity:.45;pointer-events:none}
/* ── LES DATES SOUS LE NOM ──                              (v14.94)
   « Mettre les dates de missions sous le nom. » Elles étaient en bout
   de la ligne technique, derrière le rayon et la distance : une
   mission se lit par ses dates, pas par son rayon. */
.zdates{display:inline-flex;align-items:center;gap:5px;margin-top:3px;
  font-size:12px;font-weight:600;color:var(--terra-fonce);
  background:var(--terra-pale);border-radius:99px;padding:2px 9px;
  font-variant-numeric:tabular-nums;white-space:nowrap;align-self:flex-start}
.zdates .ico{width:12px;height:12px}
/* Ce qu'un nom ne dit pas : par où l'on entre, où est le parking. */
.zdesc{display:block;margin-top:3px;font-size:12px;color:var(--encre-2);
  line-height:1.45;max-width:52ch;white-space:normal}
.zopt{font-style:normal;font-weight:400;color:var(--muet);font-size:11px;margin-left:5px}
.zdescin{min-height:56px;resize:vertical;line-height:1.5;padding-top:8px}

/* ── LE FOND DE CARTE ──                                   (v14.94)
   « Ajouter le mode satellite à la carte. » Le sélecteur vit SUR la
   carte : c'est d'elle qu'il parle. Deux boutons de même hauteur —
   la règle d'or vaut aussi en surimpression. */
.zfond{display:flex;border:1px solid var(--ligne-2);border-radius:8px;overflow:hidden;
  box-shadow:0 1px 4px rgba(62,43,26,.22);background:var(--carte)}
.zfond button{border:0;background:var(--carte);cursor:pointer;height:28px;padding:0 11px;
  font-family:var(--f-ui);font-size:11.5px;font-weight:700;color:var(--encre-2)}
.zfond button + button{border-left:1px solid var(--ligne-2)}
.zfond button:hover{background:var(--surface-2)}
.zfond button.on{background:var(--encre);color:#fff}

.zsite{font-style:normal;font-size:11px;font-weight:600;color:var(--muet);
  background:var(--surface-2);border:1px solid var(--ligne);border-radius:99px;
  padding:1px 8px;margin-left:7px;white-space:nowrap}
.zetgh .zsite{margin-left:auto}
/* La pastille d'un salarié : on coche quelqu'un, pas une ligne de
   texte. `avatar_html()` rend soit la photo, soit les initiales. */
.zav{width:26px;height:26px;border-radius:50%;flex:none;display:inline-flex;
  align-items:center;justify-content:center;color:#fff;font-family:var(--f-titre);
  font-size:10.5px;font-weight:600;overflow:hidden;letter-spacing:.01em}
.zav img{width:100%;height:100%;object-fit:cover;display:block}
.zrech{margin-bottom:7px}
.zsals{max-height:260px;overflow-y:auto;padding-right:2px}

/* ── LA LISTE ──
   Les groupes se lisent comme des intertitres, pas comme des lignes :
   « Lieux · permanents » n'est pas une zone. */
.zgrp td{background:var(--surface-2);font-size:11px;font-weight:700;letter-spacing:.06em;
  text-transform:uppercase;color:var(--muet);padding:6px 12px}
.zrow.on td{background:var(--violet-pale)}
.zpast{width:9px;height:9px;border-radius:3px;background:var(--violet);flex:none;margin-right:2px}
.zrow[hidden],.zgrp[hidden]{display:none}

/* La légende reprend les trois couleurs de la carte, et rien de plus. */
.zlg{display:inline-block;width:11px;height:11px;border-radius:50%;margin-right:6px;vertical-align:-1px}
.zlg.per{background:#5A6EA5}
.zlg.zon{background:#8A5E86}
.zlg.bor{background:var(--encre);border-radius:3px}

/* Le lieu, dans la bulle d'un pointage : c'est lui qui explique
   qu'un point à trente-huit kilomètres soit vert. */
.cppop .v.znom{color:var(--violet);font-weight:600}

/* La pointeuse posée, sous le nom de sa zone : pas une colonne à elle,
   trois lignes sur quatre seraient vides. */
.ztb{display:inline-flex;align-items:center;gap:6px;margin-top:4px;font-size:11.5px;
  color:var(--encre-2);background:var(--surface-2);border:1px solid var(--ligne);
  border-radius:99px;padding:2px 10px 2px 8px;max-width:100%}
.ztb svg{width:13px;height:13px;flex:none;opacity:.7}

/* ═══ LA LIGNE « À TRAITER » DE LA FICHE SALARIÉ ═══        (v14.96)
   .hline2 donnait déjà la ligne datée — une date à gauche, un fait à
   droite. Il lui manquait trois choses pour porter ce qu'il y a à
   faire sur une personne.

   .chrl.ko — CE QUI EST EN RETARD reste au-dessus du repère du jour,
   en rouge, avec sa date d'origine : une DPAE oubliée le 1er avril se
   lit « 1er avril », pas dans un encart en haut de page.

   .chrauj — LE REPÈRE D'AUJOURD'HUI. Sans lui, le passé et l'avenir
   se ressemblent et la liste n'est plus qu'un tableau de dates.

   .chrx — la colonne des gestes, alignée d'une ligne à l'autre. Le
   bouton fait la chose ; il ne renvoie pas vers l'écran où elle est. */
.chrl{display:flex;align-items:center;gap:12px;padding:11px 18px;
  border-bottom:1px solid var(--surface-2);font-size:12.5px}
.chrl:last-child{border-bottom:none}
.chrl .d{min-width:96px;flex:none;font-family:var(--f-titre);font-weight:700;
  font-size:11.5px;color:var(--muet)}
.chrl .c{flex:1;min-width:0}
.chrl .c b{font-family:var(--f-titre);font-size:14px;font-weight:600;display:block}
.chrl .c i{font-style:normal;display:block;font-size:11.5px;color:var(--muet);margin-top:1px}
.chrl>.ico{width:15px;height:15px;color:var(--ligne-2);flex:none}
.chrl.ko{background:var(--rouge-pale)}
.chrl.ko>.ico,.chrl.ko .c b{color:var(--rouge)}
.chrl.ko .c i{color:#A86B6B}
.chrl.wa>.ico{color:var(--jaune)}
.chrl.fut .d{color:var(--encre-2)}
.chrx{margin-left:auto;display:flex;gap:8px;align-items:center;flex:none}
.chrauj{display:flex;align-items:center;gap:12px;padding:7px 18px;background:var(--encre)}
.chrauj b{font-family:var(--f-titre);font-size:11px;font-weight:700;letter-spacing:.08em;
  text-transform:uppercase;color:#fff}
.chrauj span{flex:1;height:1px;background:rgba(255,255,255,.28)}

/* ═══ LE NOMBRE À CÔTÉ DU TITRE ═══                      (v14.98)
   « 0 enregistrée » disait en toutes lettres, à droite, ce qu'un
   chiffre dit mieux à côté du titre. Une pastille neutre : ce n'est
   pas une alerte (celle-là reste .tbadge, terracotta). */
.chnb{display:inline-flex;align-items:center;justify-content:center;min-width:20px;height:20px;
  padding:0 6px;margin-left:8px;border-radius:20px;background:var(--surface-2);
  border:1px solid var(--ligne);font-family:var(--f-ui);font-size:11px;font-weight:700;
  color:var(--encre-2);vertical-align:2px}

/* ═══ LE JOURNAL DE LA FICHE, EN FIL ═══                   (v14.98)
   Un intertitre par jour (.clgrp.jjour), puis une ligne par fait :
   l'heure, l'icône de la catégorie, le fait et son détail, l'auteur.
   .jfil porte la recherche et les filtres au-dessus de la carte ;
   .jvue bascule entre le journal de la fiche et le journal technique. */
.jfil{display:flex;gap:10px;align-items:center;flex-wrap:wrap;margin-bottom:14px}
.jfil .fi{max-width:280px}
.jvue{display:none}
.jvue.on{display:block}
.jlig{display:flex;align-items:flex-start;gap:12px;padding:11px 18px;border-bottom:1px solid var(--surface-2)}
.jlig:last-child{border-bottom:none}
.jlig .h{width:44px;flex:none;font-size:11.5px;font-weight:600;color:var(--muet);padding-top:4px}
.jlig .sico{width:26px;height:26px;border-radius:8px;display:flex;align-items:center;justify-content:center;flex:none}
.jlig .sico .ico{width:14px;height:14px}
.jlig .c{flex:1;min-width:0}
.jlig .c b{display:block;font-size:13px;font-weight:600;color:var(--encre)}
.jlig .c i{display:block;font-style:normal;font-size:11.5px;color:var(--muet);margin-top:1px}
.jlig .q{font-size:11.5px;color:var(--muet);flex:none;padding-top:4px;text-align:right}
.jlig[hidden],.jjour[hidden]{display:none}
@media (max-width:640px){ .jlig .q{display:none} }

/* ═══ LE GROUPE DÉPLIABLE ═══                             (v14.98)
   Un <details> dans une carte : les autorisations d'un module, repliées
   derrière leur titre et leur compte. Le chevron tourne à l'ouverture.
   Natif — aucun script pour ouvrir, et le clavier fonctionne. */
.acc{border-bottom:1px solid var(--ligne)}
.acc:last-of-type{border-bottom:none}
.acc>summary{list-style:none;cursor:pointer;display:flex;align-items:center;gap:10px;padding:12px 18px}
.acc>summary::-webkit-details-marker{display:none}
.acc>summary:hover{background:var(--surface-2)}
.acc>summary .acch{flex:1;font-weight:600;font-size:13px;color:var(--encre)}
.acc>summary .meta{font-size:11.5px;color:var(--muet)}
.acc>summary .accb{width:15px;height:15px;color:var(--muet);transition:transform .15s;flex:none}
.acc[open]>summary .accb{transform:rotate(90deg)}
.acc[open]>summary{background:var(--surface-2);border-bottom:1px solid var(--ligne)}

/* ═══ LES DISPONIBILITÉS, JOUR PAR JOUR ═══               (v14.98)
   Le tiroir des disponibilités : le jour à gauche, le segment
   Disponible / Partiel / Indisponible à droite, et sous « Partiel »
   les créneaux d'indisponibilité, avec les préréglages de
   l'établissement (matin, après-midi, soirée). */
.dispj{display:grid;grid-template-columns:92px minmax(0,1fr);gap:12px;align-items:start;padding:11px 0;
  border-bottom:1px solid var(--surface-2)}
.dispj>b{font-size:13px;padding-top:6px}
.dispj .segr{display:inline-flex}
.dispc{display:flex;gap:8px;align-items:center;margin-top:8px}
.dispc .fi{width:120px}
.dispp{display:flex;gap:14px;flex-wrap:wrap;margin-top:8px}
.dispcr[hidden]{display:none}

/* ── LA LISTE DES SALARIÉS : FILTRES, ÉQUIPES, INVITATION ── (v14.100)
   Une seule hauteur sur la barre : le sélecteur d'établissements, le
   bouton Filtres, les étiquettes, le segment et l'engrenage font 37 px. */
.btn.ico1{width:37px;padding:0}
.btn.ico1 .ico{width:16px;height:16px}
.btn .fnb{margin-left:2px;font-size:10.5px;font-weight:700;background:var(--encre);color:#fff;border-radius:9px;padding:1px 6px}
.ftags{display:contents}
.ftag{display:inline-flex;align-items:center;gap:6px;height:37px;padding:0 6px 0 13px;border-radius:10px;
  border:1px solid var(--bleu);background:var(--bleu-pale);color:var(--bleu);font-size:12.5px;font-weight:600}
.ftag button{border:none;background:none;color:inherit;cursor:pointer;font-size:10px;padding:3px 6px;border-radius:50%}
.ftag button:hover{background:rgba(0,0,0,.07)}
.vuseg label span{padding:8px 12px}
.tA tr.fcache,.tA tbody.fcache{display:none}
.tA .invc{white-space:nowrap}
.tA .invc .btn .ico{width:13px;height:13px}
.tA .invc .lk{border:none;background:none;padding:0;font:inherit;font-weight:600;color:var(--terra-h)}
.telk{display:inline-flex;align-items:center;gap:6px;font-weight:600;color:var(--encre);white-space:nowrap;text-decoration:none}
.telk .ico{width:13px;height:13px;color:var(--muet)}
.telk:hover,.telk:hover .ico{color:var(--terra-h)}
.tA tr.eqlig td{background:var(--surface-2);padding:9px 16px;cursor:pointer;border-bottom:1px solid var(--ligne)}
.eqh{display:flex;align-items:center;gap:9px;font-size:13px}
.eqh .chv{width:14px;height:14px;color:var(--muet);transition:transform .15s}
.eqh .cnt{font-size:11px;font-weight:600;color:var(--muet);background:var(--carte);border:1px solid var(--ligne);border-radius:10px;padding:1px 7px}
.eqsg.ferme tr:not(.eqlig){display:none}
.eqsg.ferme .chv{transform:rotate(-90deg)}

/* ── LA PLANCHE D'ICÔNES ──                                (v14.101)
   Une icône posée par référence (<use>) n'a plus ses attributs de
   trait : ils sont ici, sous :where(), sans poids — une règle d'écran
   qui changeait la couleur ou l'épaisseur l'emporte comme avant. */
:where(svg[data-i]){fill:none;stroke:currentColor;stroke-width:1.75;stroke-linecap:round;stroke-linejoin:round}

/* ── LA LIGNE DE PIÈCE, ALLÉGÉE ──                          (v14.101) */
.docrow .docx{flex:1;min-width:0}
.lk.lkr{color:var(--rouge)}
/* Les pastilles du journal par catégorie : une classe au lieu d'un
   style répété sur chaque ligne (v14.101). */
.jlig .sico.jcat{background:var(--surface-2);color:var(--muet)}
.jlig .sico.jcat.contrat{background:var(--terra-pale);color:var(--terra)}
.jlig .sico.jcat.remuneration,.jlig .sico.jcat.absence{background:var(--bleu-pale);color:var(--bleu)}
.jlig .sico.jcat.document{background:var(--jaune-pale);color:var(--jaune)}
.jlig .sico.jcat.identite{background:var(--violet-pale);color:var(--violet)}
.jlig .sico.jcat.aptitude,.jlig .sico.jcat.temps{background:var(--vert-pale);color:var(--vert)}
.jlig .sico.jcat.acces{background:var(--surface-2);color:var(--encre-2)}
/* Trois styles que la fiche écrivait en ligne, des dizaines de fois
   (v14.101). */
.fx1{flex:1}
.dcont{display:contents}
svg.i14{width:14px!important;height:14px!important}
/* La question du kit, à la place de la fenêtre du navigateur (v14.101). */
.kconf .kcd{margin:0;font-size:13px;line-height:1.5;color:var(--encre-2)}
/* Enregistré sans recharger : la carte s'éclaire un instant (v14.101). */
.card.cenreg{animation:enreg13 1.4s ease}
@keyframes enreg13{0%{box-shadow:0 0 0 3px var(--vert)}100%{box-shadow:var(--ombre)}}
.warnline.dwbrouil{margin:0 0 14px}
@media (prefers-reduced-motion:reduce){.card.cenreg{animation:none}}

/* ── CHOISIR UN SALARIÉ ──                                  (v14.101)
   Le champ qui cherche : pastille, nom, poste, équipe. */
.csal{position:relative}
.csalf{display:flex;align-items:center;gap:9px;min-height:40px;border:1px solid var(--ligne-2);border-radius:10px;
  background:#fff;padding:0 10px 0 11px;cursor:text}
.csal.open .csalf,.csalf:focus-within{border-color:var(--terra);box-shadow:0 0 0 3px var(--terra-pale)}
.csalf .loupe{width:16px;height:16px;color:var(--muet);flex:none}
.csalf.pris .loupe{display:none}
.csalf.pris{padding-left:6px;cursor:pointer}
.csalq{flex:1;min-width:0;border:none;outline:none;font:inherit;font-size:13.5px;background:none;height:38px}
.csalid{display:flex;align-items:center;gap:9px;flex:1;min-width:0;padding:4px 0}
.csalid .t,.csalo .t{display:flex;flex-direction:column;min-width:0;line-height:1.25}
.csalid .t b,.csalo .t b{font-size:13px;font-weight:600;color:var(--encre);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.csalid .t span,.csalo .t span{font-size:11.5px;color:var(--muet);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.csalx{border:none;background:none;color:var(--muet);cursor:pointer;width:24px;height:24px;border-radius:50%;font-size:11px;flex:none}
.csalx:hover{background:var(--surface-2);color:var(--encre)}
.csalp{position:absolute;left:0;right:0;top:calc(100% + 5px);z-index:60;background:var(--carte);border:1px solid var(--ligne);
  border-radius:12px;box-shadow:var(--ombre-2);padding:6px;max-height:320px;overflow:auto}
.csalg{font-size:10.5px;font-weight:700;letter-spacing:.05em;text-transform:uppercase;color:var(--muet);padding:8px 9px 5px}
.csalo{display:flex;align-items:center;gap:10px;width:100%;border:none;background:none;text-align:left;padding:7px 9px;
  border-radius:9px;cursor:pointer;font:inherit}
.csalo:hover,.csalo.on{background:var(--terra-pale)}
.csalo mark{background:none;color:var(--terra-h);font-weight:700}
.csalv{padding:14px;text-align:center;color:var(--muet);font-size:12.5px}
.csalav{flex:none}
.csal.off .csalf{background:var(--surface-2);cursor:not-allowed;opacity:.75}
/* ═══ SALAIRE ET COÛT ═══                         (v14.102 · v14.103)
   Le module « Estimations de paie » : le bloc lié du tiroir, les
   tuiles de la fiche, le point d'exclamation, les réglages. */
.esb{border:1px solid var(--ligne);border-radius:12px;padding:14px 16px;background:var(--surface-2)}
.esbh{display:flex;align-items:center;gap:8px;margin-bottom:12px}
.esbh b{font-size:13.5px}
.estag{font-size:11px;color:var(--muet);font-weight:600}
.es4{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:10px}
.es4 .fg{margin-bottom:0}
.esb .fhelp{margin-top:6px}
.esb.esoff [data-est]{display:none}
.esb.esoff .es4{grid-template-columns:repeat(2,minmax(0,1fr))}
.fi.escalc{background:var(--carte)}
.fi.escalc[readonly]{background:var(--surface-2);color:var(--muet)}
.fi.esmaj{animation:esmaj .6s}
@keyframes esmaj{from{background:var(--vert-pale)}to{background:var(--carte)}}
.essc{display:flex;justify-content:space-between;align-items:baseline;gap:10px;margin-top:10px;padding:10px 12px;
  background:var(--carte);border:1px solid var(--ligne);border-radius:10px;font-size:12.5px}
.essc[hidden]{display:none}
.essc span{color:var(--encre-2);font-weight:600}
.essc b{font-family:var(--f-titre);font-size:17px;white-space:nowrap}
.esbr{display:flex;gap:2px;height:10px;margin:14px 0 8px}
.esbr i{display:block;border-radius:3px;min-width:4px}
.esbr .net,.esle .net{background:var(--vert)}
.esbr .sal,.esle .sal{background:var(--jaune)}
.esbr .pat,.esle .pat{background:var(--terra)}
.esle{display:flex;flex-wrap:wrap;gap:6px 16px;font-size:11.5px;color:var(--muet)}
.esle span{display:inline-flex;align-items:center;gap:6px}
.esle i{width:9px;height:9px;border-radius:3px;display:inline-block}
.esle b{color:var(--encre);font-weight:600}
.esfi{padding:0 18px 18px}
.esfi[hidden]{display:none}
.estu{display:grid;grid-template-columns:repeat(auto-fit,minmax(150px,1fr));gap:10px}
.estu>div{background:var(--carte);border:1px solid var(--ligne);border-radius:10px;padding:10px 12px;display:flex;flex-direction:column;min-width:0}
.estu span{font-size:11px;font-weight:600;color:var(--muet)}
.estu b{font-family:var(--f-titre);font-size:20px;font-weight:600;margin:3px 0 1px;white-space:nowrap}
.estu em{font-style:normal;font-size:11px;color:var(--muet)}
.estc{color:var(--muet)}
.estc:empty{display:none}
.estw{position:relative;display:inline-flex;align-items:center;justify-content:center;width:17px;height:17px;border-radius:50%;
  background:var(--jaune);color:#fff;font-size:11px;font-weight:800;cursor:help;flex:none;outline:none}
.estwb{position:absolute;left:50%;bottom:calc(100% + 8px);transform:translateX(-50%);width:280px;padding:10px 12px;border-radius:9px;
  background:var(--encre);color:#fff;font-size:12px;font-weight:500;line-height:1.45;text-align:left;
  box-shadow:0 8px 24px rgba(0,0,0,.2);display:none;pointer-events:none;z-index:20;white-space:normal}
.estwb::after{content:'';position:absolute;top:100%;left:50%;margin-left:-6px;border:6px solid transparent;border-top-color:var(--encre)}
.estw:hover .estwb,.estw:focus .estwb{display:block}
.estw.adr .estwb{left:auto;right:-8px;transform:none}
.estw.adr .estwb::after{left:auto;right:10px}
.esav{display:flex;gap:10px;align-items:flex-start;margin:0 18px 6px;padding:12px 15px;border-radius:var(--r);
  background:var(--jaune-pale);color:var(--jaune);font-size:13px;font-weight:500}
.esav .ico{width:16px;height:16px;flex:none;margin-top:1px}
.essec{font-size:10.5px;font-weight:700;letter-spacing:.05em;text-transform:uppercase;color:var(--muet);padding:16px 18px 6px}
.esrg{display:flex;align-items:center;gap:12px;font-size:12.5px;color:var(--encre-2)}
.esrg .pill{min-width:96px;justify-content:center}
@media (max-width:720px){.es4{grid-template-columns:repeat(2,minmax(0,1fr))}}

/* ═══ PAIE › COÛTS ET TRÉSORERIE ═══                       (v14.104) */
.ctf{display:flex;align-items:center;gap:12px;flex-wrap:wrap}
.ctsel{width:auto;height:34px;padding-top:0;padding-bottom:0}
.ctleg{padding:14px 18px 0}
.ctgw{position:relative;padding:4px 18px 14px}
.ctg{width:100%;height:auto;display:block}
.ctgl{stroke:var(--ligne);stroke-width:1}
.ctgy{font-size:10.5px;fill:var(--muet);text-anchor:end}
.ctx{font-size:11.5px;fill:var(--encre-2);text-anchor:middle;font-weight:600}
.ctv{font-size:10.5px;fill:var(--muet);text-anchor:middle;font-weight:600}
.cth{fill:transparent}
.ctb:hover .cth{fill:var(--surface-2)}
.ctb.auj .ctx{fill:var(--terra-h)}
.cts.net{fill:var(--vert)}.cts.ind_cp{fill:var(--bleu)}.cts.ind_prec{fill:var(--violet)}.cts.proj{fill:url(#cthach)}
.hachf{fill:var(--surface-2)}.hachl{stroke:var(--muet);stroke-width:2}
.ctd .cot{background:var(--terra)}
.esle .ind_cp{background:var(--bleu)}
.esle .ind_prec{background:var(--violet)}
.ctd .net{background:var(--vert)}
.esle .proj{background:repeating-linear-gradient(45deg,var(--muet) 0 1.5px,var(--surface-2) 1.5px 4px)}
.cttip{position:absolute;pointer-events:none;background:var(--encre);color:#fff;border-radius:9px;padding:9px 11px;font-size:12px;
  line-height:1.5;box-shadow:0 8px 24px rgba(0,0,0,.2);white-space:nowrap;z-index:5}
.cttip[hidden]{display:none}
.cttip b{display:block;margin-bottom:2px}
.ctm td{white-space:nowrap}
.ctm tr.auj td{background:var(--surface-2)}
.ctm tr.tot td{font-weight:700;border-top:1px solid var(--ligne)}
.ctpj{color:var(--muet)}
.ctg2{display:grid;grid-template-columns:1fr 1fr;gap:16px;align-items:start}
.ctg2>.card{margin-bottom:0}
.ctd{display:flex;align-items:center;gap:10px;padding:10px 18px;border-top:1px solid var(--ligne);font-size:13px}
.ctd:first-of-type{border-top:none}
.ctdd{width:62px;flex:none;font-weight:700;color:var(--encre-2);font-size:12px}
.ctd i{width:8px;height:8px;border-radius:3px;flex:none}
.ctdl{flex:1;min-width:0;color:var(--encre-2)}
.ctd b{white-space:nowrap}
.ctpart{display:inline-block;width:60px;height:6px;border-radius:3px;background:var(--surface-2);margin-right:8px;vertical-align:middle;overflow:hidden}
.ctpart i{display:block;height:100%;background:var(--terra)}
.ctex{display:flex;align-items:center;gap:8px;margin-top:14px;font-size:12.5px;color:var(--muet)}
.ctex .ico{width:15px;height:15px}
@media (max-width:900px){.ctg2{grid-template-columns:1fr}}
/* v14.106 · brut, net, charges, indemnités ; réalisé et prévu ; onglets */
.cttabs{margin:-6px 0 18px;max-width:720px}
.cts.sal_c{fill:var(--jaune)}.cts.pat{fill:var(--terra)}
.esle .sal_c{background:var(--jaune)}
.ctm-prevu .cts,.ctm-estime .cts{opacity:.4}
.ctm-encs .cts{opacity:.7}
.ctb{cursor:pointer}
.ctb.on .cth{fill:var(--surface-2)}
.ctb.on .ctx{fill:var(--terra-h)}
.ctbrut{stroke:var(--encre);stroke-width:2}
.ctprev{stroke:var(--encre);stroke-width:2;stroke-dasharray:3 2}
.esle .ctlbrut{height:2px;width:14px;border-radius:0;background:var(--encre)}
.esle .ctlprev{height:0;width:16px;border-radius:0;background:none;border-top:2px dashed var(--encre)}
.ctdms{padding:0 18px 16px}
.ctdm{display:none}
.ctdm.on{display:block}
.ctdmh{display:flex;align-items:center;gap:10px;margin-bottom:10px;flex-wrap:wrap}
.ctdmh b{font-size:14px}
.ctdmp{font-size:12px;color:var(--muet)}
.ctdt{display:grid;grid-template-columns:repeat(auto-fit,minmax(130px,1fr));gap:8px}
.ctdt>div{background:var(--surface-2);border:1px solid var(--ligne);border-top:3px solid var(--ligne);border-radius:10px;
  padding:10px 12px;display:flex;flex-direction:column;min-width:0}
.ctdt>div.net{border-top-color:var(--vert)}.ctdt>div.sal_c{border-top-color:var(--jaune)}.ctdt>div.pat{border-top-color:var(--terra)}
.ctdt>div.ind_cp{border-top-color:var(--bleu)}.ctdt>div.ind_prec{border-top-color:var(--violet)}.ctdt>div.proj{border-top-color:var(--muet)}
.ctdt>div.tot{background:var(--carte);border-top-color:var(--encre)}
/* v14.143 : avantages en nature, frais, rupture ; acomptes et avances à leur date. */
.cts.av_nat{fill:var(--bleu-fonce)}.cts.frais{fill:var(--brun)}.cts.ind_rup{fill:var(--violet-fonce)}
.esle .av_nat{background:var(--bleu-fonce)}.esle .frais{background:var(--brun)}.esle .ind_rup{background:var(--violet-fonce)}
.ctdt>div.av_nat{border-top-color:var(--bleu-fonce)}.ctdt>div.frais{border-top-color:var(--brun)}.ctdt>div.ind_rup{border-top-color:var(--violet-fonce)}
.ctd .acompte,.ctd .avance{background:var(--jaune)}
.esavec{margin-top:8px;font-size:12px;color:var(--muet);line-height:1.5}
.ctdt span{font-size:11px;font-weight:600;color:var(--muet)}
.ctdt b{font-family:var(--f-titre);font-size:17px;font-weight:600;margin:3px 0 1px;white-space:nowrap}
.ctdt em{font-style:normal;font-size:10.5px;color:var(--muet)}
.ctup{color:var(--terra-h);font-weight:700}
.ctdn{color:var(--vert);font-weight:700}
/* ═══ COÛTS ET TRÉSORERIE › SIMULATIONS ═══                (v14.106) */
.smfm{display:inline-flex;margin:0}
.smA{display:grid;grid-template-columns:400px minmax(0,1fr);gap:16px;align-items:start}
.smbuild{position:sticky;top:70px}
.smc{border-top:1px solid var(--ligne);padding:12px 18px}
.smc:first-of-type{border-top:none}
.smc.off{opacity:.55}
.smch{display:flex;align-items:center;gap:10px}
.smch b{font-size:13.5px}
.smli{width:28px;height:28px;border-radius:8px;background:var(--surface-2);display:flex;align-items:center;justify-content:center;flex:none;color:var(--encre-2)}
.smli .ico{width:15px;height:15px}
.smimp{font-weight:700;font-size:13px;color:var(--terra-h);white-space:nowrap}
.smfs{display:flex;flex-wrap:wrap;gap:4px 16px;margin:8px 0 0 38px}
.smf{display:flex;gap:6px;font-size:12px}.smf span{color:var(--muet)}.smf b{font-weight:600}
.smadd{border-top:1px solid var(--ligne);padding:12px 18px 16px;background:var(--surface-2)}
.smaddt{font-size:10.5px;font-weight:700;letter-spacing:.05em;text-transform:uppercase;color:var(--muet);margin-bottom:8px}
.smlev{display:grid;grid-template-columns:1fr;gap:6px}
.smlb{display:flex;align-items:center;gap:10px;text-align:left;border:1px solid var(--ligne);background:var(--carte);border-radius:10px;padding:8px 10px;cursor:pointer;font:inherit;color:inherit}
.smlb:hover{border-color:var(--terra)}
.smlb b{display:block;font-size:12.5px}.smlb em{display:block;font-style:normal;font-size:11px;color:var(--muet)}
.smres{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:12px;margin-bottom:16px}
.smres>div{background:var(--carte);border:1px solid var(--ligne);border-radius:var(--r);box-shadow:var(--ombre);padding:14px 16px;display:flex;flex-direction:column;min-width:0}
.smres span{font-size:11.5px;font-weight:600;color:var(--muet)}
.smres b{font-family:var(--f-titre);font-size:22px;font-weight:600;margin:4px 0 2px}
.smres em{font-style:normal;font-size:11.5px;color:var(--muet)}
.smres .up b{color:var(--terra-h)}
.cts.smb{fill:var(--vert);opacity:.8}.cts.smd{fill:var(--terra)}.cts.sme{fill:var(--vert-pale);stroke:var(--vert);stroke-dasharray:3 2}
.esle .smb{background:var(--vert);opacity:.8}.esle .smd{background:var(--terra)}.esle .sme{background:var(--vert-pale);border:1px dashed var(--vert)}
.smt td{white-space:nowrap}
.smnote{display:flex;gap:8px;align-items:center;padding:10px 18px;border-top:1px solid var(--ligne);font-size:12px;color:var(--jaune);background:var(--jaune-pale)}
.smnote .ico{width:15px;height:15px;flex:none}
.smseg{display:inline-flex}
.smrx{margin-right:auto}
@media (max-width:1100px){.smA{grid-template-columns:1fr}.smbuild{position:static}.smres{grid-template-columns:1fr 1fr}}
/* ═══ COÛTS ET TRÉSORERIE › BUDGET ═══                     (v14.108) */
.bgvue{display:inline-flex;margin:0 0 16px}
.kpi .k2.bgok{color:var(--vert)}.kpi .k2.bgko{color:var(--terra-h)}
.bgsA{display:flex;align-items:flex-end;gap:24px;flex-wrap:wrap;padding:16px 18px 6px}
.bgfA{display:flex;align-items:flex-end;gap:14px;flex-wrap:wrap}
.bgfA .fg{margin-bottom:0}
.bgfA .funit{width:200px}
.bgrep{display:inline-flex}
.bgde{display:flex;gap:10px;flex-wrap:wrap;margin-left:auto}
.bgfr{display:flex;align-items:center;gap:8px}
.bgfr .fl{margin:0;white-space:nowrap}
.bgpct{width:80px}
.bgsim{width:auto;max-width:220px}
.bgj{padding:14px 18px 18px}
.bgjb{display:flex;height:14px;border-radius:7px;background:var(--surface-2);overflow:hidden}
.bgjb i{display:block;height:100%}.bgjb i.f{background:var(--vert)}
.bgjb i.p,.bgjl i.p,.bgcons i.p{background:repeating-linear-gradient(45deg,var(--vert) 0 2px,var(--vert-pale) 2px 5px)}
.bgjl{display:flex;gap:16px;margin-top:9px;font-size:12px;color:var(--muet);flex-wrap:wrap}
.bgjl i{display:inline-block;width:9px;height:9px;border-radius:3px;margin-right:6px;vertical-align:-1px}
.bgjl i.f{background:var(--vert)}.bgjl i.m{background:var(--surface-2);border:1px solid var(--ligne)}
.bgin{display:inline-block;width:130px}.bgin input{text-align:right;height:32px}
.bgmini{display:block;height:6px;border-radius:3px;background:var(--surface-2);overflow:hidden}
.bgmini i{display:block;height:100%}.bgmini i.ok{background:var(--vert)}.bgmini i.ko{background:var(--terra)}
.bgeta td{background:var(--surface-2)}
.bgeq{padding-left:16px;color:var(--encre-2)}
.bgcons{display:flex;height:8px;border-radius:4px;background:var(--surface-2);overflow:hidden}
.bgcons i{display:block;height:100%}.bgcons i.f{background:var(--vert)}
.bgal{display:flex;align-items:center;gap:12px;padding:12px 18px;border-top:1px solid var(--ligne)}
.bgal:first-of-type{border-top:none}
.bgai{width:32px;height:32px;border-radius:9px;display:flex;align-items:center;justify-content:center;flex:none}
.bgai .ico{width:16px;height:16px}
.bgai.ok{background:var(--vert-pale);color:var(--vert)}.bgai.in{background:var(--bleu-pale);color:var(--bleu)}.bgai.ko{background:var(--rouge-pale);color:var(--rouge)}
/* v14.109 · la barre des filtres sous les onglets */
.ctbar{display:flex;align-items:center;gap:12px;flex-wrap:wrap;margin:-4px 0 18px}
/* v14.110 · le sélecteur établissements et équipes, en champ de tiroir */
.pselc{width:100%}
/* v14.111 · les contrôles des simulations : seuils d'effectif, minima */
.smwarn{display:inline-flex;align-items:center;justify-content:center;width:17px;height:17px;border-radius:50%;background:var(--rouge-pale);color:var(--rouge);
  font-size:11px;font-weight:800;margin-left:7px;vertical-align:1px;cursor:help}
.bgai.wa{background:var(--jaune-pale);color:var(--jaune)}
.eftl{stroke:var(--muet);stroke-width:1.2;stroke-dasharray:5 4}.eftl.on{stroke:var(--terra);stroke-width:1.6}
.esle .eftk{background:none;border-top:2px dashed var(--terra);height:0;border-radius:0}
.sfx{border-top:1px solid var(--ligne);padding:12px 18px}
.sfxh{display:flex;align-items:center;gap:10px;margin-bottom:6px}
.sfxh b{font-size:13.5px}
.sfxi{width:30px;height:30px;border-radius:9px;display:flex;align-items:center;justify-content:center;font-weight:800;font-size:12px;flex:none}
.sfxi.ok{background:var(--vert-pale);color:var(--vert)}.sfxi.wa{background:var(--jaune-pale);color:var(--jaune)}
.sfxi.in{background:var(--bleu-pale);color:var(--bleu)}.sfxi.gr{background:var(--surface-2);color:var(--muet)}
.sfxt{display:flex;gap:12px;justify-content:space-between;font-size:12.5px;padding:3px 0 3px 40px}
.sfxt span{color:var(--encre-2)}.sfxt b{white-space:nowrap}
/* v14.112 · le résultat en deux vues ; levier par levier */
.smvt{margin:0 0 16px}
.smlt{margin:14px 18px 4px}
.csc{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:10px;padding:14px 18px}
.ldtv{border:1px solid var(--ligne);border-radius:10px;padding:10px 12px;display:flex;flex-direction:column;min-width:0}
.ldtv span{font-size:11px;font-weight:600;color:var(--muet)}.ldtv b{font-family:var(--f-titre);font-size:18px;margin:2px 0}
.ldtv em{font-style:normal;font-size:11px;color:var(--muet);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.csc2{padding:4px 18px 16px}
.smdt{font-size:10.5px;font-weight:700;letter-spacing:.05em;text-transform:uppercase;color:var(--muet);margin-bottom:8px}
.ldts{border:1px solid var(--ligne);border-radius:10px;overflow:hidden}
.ldt{display:flex;justify-content:space-between;gap:12px;padding:8px 12px;border-top:1px solid var(--ligne);font-size:12.5px}
.ldt:first-child{border-top:none}.ldt span{color:var(--encre-2)}.ldt b{text-align:right}
.ldtn{display:flex;gap:8px;align-items:center;padding:8px 12px;background:var(--vert-pale);color:var(--vert);font-size:12px;font-weight:600}
.ldtn.ko{background:var(--rouge-pale);color:var(--rouge)}
.ldtn .ico{width:14px;height:14px}
.cscl{font-size:11px;font-weight:700;text-anchor:middle;fill:var(--encre)}
.cscb{stroke:var(--muet);stroke-dasharray:3 3}
@media (max-width:900px){.csc{grid-template-columns:1fr 1fr}}
/* v14.113 · la liste des simulations, et une simulation ouverte */
.sml{display:grid;grid-template-columns:repeat(auto-fill,minmax(320px,1fr));gap:12px;padding:16px 18px}
.smlc{border:1px solid var(--ligne);border-radius:12px;padding:14px;display:flex;flex-direction:column;gap:10px;background:var(--carte);min-width:0}
.smlh{display:flex;align-items:center;gap:8px}.smlh a{color:var(--encre);text-decoration:none;min-width:0}.smlh b{font-size:14.5px}
.smld{display:flex;flex-wrap:wrap;gap:5px}
.smtag{font-size:11px;font-weight:600;padding:3px 8px;border-radius:20px;background:var(--surface-2);color:var(--encre-2)}
.smlk{display:grid;grid-template-columns:1fr 1fr;gap:8px;border-top:1px solid var(--ligne);padding-top:8px}
.smlk div{display:flex;flex-direction:column}.smlk span{font-size:11px;font-weight:600;color:var(--muet)}.smlk b{font-family:var(--f-titre);font-size:17px}
.smlm{font-size:11.5px;color:var(--muet)}
.smBf{display:flex;gap:6px;align-items:center;margin-top:auto;flex-wrap:wrap}
.smst{display:inline-flex;align-items:center;gap:6px;font-size:12px;font-weight:600;margin-left:auto;cursor:pointer}
.smBn{border:1.5px dashed var(--ligne);border-radius:12px;background:none;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:6px;
  min-height:120px;color:var(--muet);font:inherit;font-size:12.5px;font-weight:600;cursor:pointer}
.smBn .ico{width:18px;height:18px}.smBn:hover{border-color:var(--terra);color:var(--terra-h)}
.smcmp th a{color:inherit;text-decoration:none}.smcmp td{white-space:normal}
.smh2{display:flex;align-items:center;gap:10px;margin:0 0 16px;flex-wrap:wrap}
.smh2 h1{font-family:var(--f-titre);font-size:24px;font-weight:600;margin:0;line-height:1.2}
.smhv{position:relative}
.smpop{position:absolute;right:0;top:calc(100% + 6px);z-index:30;background:var(--carte);border:1px solid var(--ligne);border-radius:12px;box-shadow:var(--ombre);padding:5px;min-width:170px}
.smpop form{margin:0}
.smpop button{display:flex;align-items:center;gap:9px;width:100%;border:none;background:none;border-radius:8px;padding:8px 10px;font:inherit;font-size:13px;color:var(--encre);cursor:pointer;text-align:left}
.smpop button:hover{background:var(--surface-2)}.smpop .ico{width:15px;height:15px}
.smps{display:flex;gap:10px;align-items:center;padding:14px 18px;flex-wrap:wrap;border-bottom:1px solid var(--ligne)}
.smps .rch{flex:1;min-width:220px}.smps select{width:auto}
.smrow{cursor:pointer}.smrow.on td{background:var(--terra-pale)}
.smpd{padding:0!important;background:var(--surface-2);white-space:normal!important}
.smpg{display:grid;grid-template-columns:minmax(0,1.1fr) minmax(0,1fr);gap:20px;padding:16px 18px}
.smpas{display:flex;flex-direction:column;gap:10px}
.smpa{display:flex;gap:10px;font-size:12.5px}
.smpa b{font-size:12.5px}.smpz{color:var(--muet);font-size:11.5px}
.smpk{width:22px;height:22px;border-radius:50%;background:var(--carte);border:1px solid var(--ligne);display:flex;align-items:center;justify-content:center;font-size:11px;font-weight:700;flex:none}
.smpb{display:flex;height:14px;border-radius:7px;overflow:hidden;margin-bottom:10px;background:var(--carte)}
.smpb i{display:block;height:100%}
.smpc{display:inline-block;width:9px;height:9px;border-radius:3px;margin-right:7px}
.smpb1{background:var(--vert)}.smpb2{background:#9BBF8A}.smpb3{background:var(--terra)}.smpb4{background:#F2A58E}.smpb5{background:var(--bleu)}
.smpd .ldts{background:var(--carte)}
@media (max-width:1100px){.smpg{grid-template-columns:1fr}}
/* v14.114 · le créateur, qui voit la simulation, l'historique */
.smav{display:inline-flex;align-items:center;justify-content:center;border-radius:50%;color:#fff;font-weight:700;flex:none;width:24px;height:24px;font-size:9.5px;overflow:hidden}
.smav img{width:100%;height:100%;object-fit:cover;display:block}
.smav30{width:30px;height:30px;font-size:11px}.smav20{width:20px;height:20px;font-size:8px}
.smavs{display:inline-flex;flex:none}.smavs .smav{border:2px solid var(--carte);margin-left:-7px}.smavs .smav:first-child{margin-left:0}
.smlh .fx1{min-width:0}
.smpar{font-size:12px;color:var(--muet);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;min-width:0}.smpar b{color:var(--encre);font-weight:600}
.smfoot{display:flex;align-items:center;gap:8px;border-top:1px solid var(--ligne);padding-top:10px;min-width:0}
.smvisp{display:inline-flex;align-items:center;gap:5px;font-size:11px;font-weight:700;padding:3px 9px;border-radius:20px;white-space:nowrap;flex:none}
.smvisp .ico{width:12px;height:12px}
.smvisp.gr{background:var(--surface-2);color:var(--encre-2)}.smvisp.in{background:var(--bleu-pale);color:var(--bleu)}.smvisp.ok{background:var(--vert-pale);color:var(--vert)}
.smcre{display:flex;align-items:center;gap:7px;font-size:12px;color:var(--muet);margin:-8px 0 16px;flex-wrap:wrap}.smcre b{color:var(--encre-2)}
.smcre .lk{font-size:12px}
.smpop .smrouge{color:var(--rouge)}
.smacc{display:flex;align-items:center;gap:10px;padding:9px 0;border-top:1px solid var(--ligne)}
.smacc b{display:block;font-size:13px}.smacc .fx1>span{display:block;font-size:11.5px;color:var(--muet)}.smaccn{font-size:13px}
.smacc .segr{flex:none}
.smown{border-top:none;background:var(--surface-2);border-radius:10px;padding:10px 12px;margin-bottom:14px}
.smhj{margin:14px 0 6px}
.smhi{display:flex;align-items:flex-start;gap:10px;padding:8px 0;font-size:12.5px}.smhi>span{color:var(--muet);font-size:11.5px;white-space:nowrap}

/* ── v14.115 · LES BULLETINS D'UNE PÉRIODE ──
   La ligne d'état sous le titre, le tableau par salarié (celui des
   feuilles de paie, .pytab) et ses repères : source, IBAN, taux. */
/* v14.134 : le nom du salarié est l'en-tête de sa ligne — il reste en
   place quand on lit les montants à droite. v14.135 : quand le
   tableau a défilé, la colonne figée porte l'ombre, sinon rien ne dit
   que les chiffres passent dessous. */
.tbcol{position:sticky;left:0;z-index:2;background:var(--carte)}
.pytab thead .tbcol{z-index:4;background:var(--surface-2)}
.pytab thead tr.g th.vide.tbcol{background:var(--carte)}
.pytab tfoot .tbcol{background:var(--surface-2)}
/* Une ombre portée ne se peint pas sur une cellule de tableau à
   bordures fusionnées : c'est un dégradé, collé au bord de la
   colonne, qui dit que les chiffres passent dessous. */
.scrollx.tbfx.tbfg .tbcol::after{content:"";position:absolute;top:0;bottom:0;right:-16px;width:16px;
  pointer-events:none;background:linear-gradient(to right, rgba(43,32,24,.13), rgba(43,32,24,0))}
.pfhc{font-size:12px;color:var(--muet)}
/* L'unité de la colonne d'absence : jours ou heures, en petit. */
.pfun{font-size:9.5px;font-weight:700;color:var(--ligne-2);margin-left:3px}
/* Les bandeaux d'équipe tiennent sur toute la largeur : leur texte, lui,
   reste à gauche quand on lit les montants. */
.rltab tr.eqlig .eqh{position:sticky;left:16px;width:max-content;max-width:100%}
.rltab tr.eqlig td{padding-left:16px}
.rltx{display:block;font-size:10.5px;color:var(--muet)}
.rlib{font-family:ui-monospace,monospace;font-size:11.5px;color:var(--encre-2)}
.rlsrc{display:inline-block;font-size:10.5px;font-weight:700;padding:2px 7px;border-radius:6px;text-decoration:none;margin-left:4px}
.rlsrc.dsn{background:var(--vert-pale);color:var(--vert)}.rlsrc.bul{background:var(--bleu-pale);color:var(--bleu)}
a.rlsrc.bul:hover{outline:1.5px solid currentColor}
.rlseg{display:inline-flex}

/* ── v14.117 · LE MOIS DE PAIE ET SES PÉRIODES ──
   Une carte par mois ; les périodes d'un mois coupé au dépliage ; un
   seul état (verrouillée · déverrouillée) et une pastille « où en
   est-on ». */
.pyvh{display:flex;align-items:center;gap:10px;margin:0 0 12px;flex-wrap:wrap}
.pyvh .pysel{margin:0;padding:6px 10px}.pyvh .pysel:not(.on){display:none}
.pyl{border:1px solid var(--ligne);border-radius:13px;background:var(--carte);margin-bottom:8px}

.pylr{display:flex;align-items:center;gap:12px;padding:13px 15px;flex-wrap:wrap}.pylr .ck,.pylp .ck{margin:0;flex:none}
.pylr .fx1{min-width:200px}
.pylr b{font-size:14px;font-weight:600;color:var(--encre)}
.pylr .d,.pylp .d{font-size:11.5px;color:var(--muet);margin-top:3px}
.pylr .d .ico,.pylp .d .ico{width:12px;height:12px;vertical-align:-2px;margin-right:4px}
.pill.pyzv::before{display:none}.pyzv .ico{width:11px;height:11px;margin-right:4px;vertical-align:-1px}
.pyvst{display:inline-flex;align-items:center;gap:5px;font-size:11.5px;font-weight:700;padding:4px 10px;border-radius:20px;white-space:nowrap}
.pyvst .ico{width:12px;height:12px}
.pyvst.ok{background:var(--vert-pale);color:var(--vert)}.pyvst.wa{background:var(--jaune-pale);color:var(--jaune)}
.pyvst.in{background:var(--bleu-pale);color:var(--bleu)}.pyvst.gr{background:var(--surface-2);color:var(--muet)}
.pylw{display:flex;align-items:center;gap:8px;padding:0 15px 12px 47px;font-size:12px;color:var(--jaune)}
.pylw .ico{width:13px;height:13px;flex:none}.pylw .lk{font-weight:600}
.pyls{border-top:1px solid var(--ligne);padding:8px 15px 10px}
.pyl:not(.ouvert) .pyls{display:none}
.pyls .pyet{padding:4px 0 2px}
.pyetc .t b .ico{width:13px;height:13px;vertical-align:-2px;margin-right:5px}
.pylp{display:flex;align-items:center;gap:12px;padding:10px 0;border-top:1px dashed var(--ligne)}.pylp:first-child{border-top:none}
.pylp b{font-size:13.5px;font-weight:600;color:var(--encre)}
.pyls .pylp + .pyet{padding:0 0 12px 30px}
.pyvmenu{position:relative}
.pymenu .pyvit{display:flex;gap:10px;align-items:flex-start}.pyvit>.ico{width:15px;height:15px;flex:none;margin-top:1px}
.pymenu .pyvdel{color:var(--rouge)}.pymenu button[disabled]{opacity:.45;cursor:not-allowed;background:none;color:var(--encre)}
.pymenu .pyvdel[disabled]{color:var(--rouge)}
.pyvmt{display:flex;align-items:center;gap:7px;font-size:10.5px;font-weight:700;letter-spacing:.05em;text-transform:uppercase;color:var(--muet);padding:6px 11px 2px}
.pyvmt .ico{width:12px;height:12px}
.pyvfix{display:flex;align-items:center;gap:8px;height:38px;padding:0 12px;border:1px solid var(--ligne);border-radius:10px;background:var(--surface-2);font-size:13px;color:var(--encre-2)}
.pyvfix .ico{width:13px;height:13px;color:var(--muet)}
.chip.pymx span{opacity:.5;cursor:not-allowed}
.pyvzone{display:flex;align-items:center;gap:12px;margin-top:18px;padding:12px 14px;border:1px solid #F0C9C4;border-radius:11px;background:var(--rouge-pale)}
.pyvzone div{flex:1;display:flex;flex-direction:column;gap:2px}.pyvzone b{font-size:13px;color:var(--rouge)}.pyvzone span{font-size:11.5px;color:var(--encre-2)}
.esav.pyvko{background:var(--rouge-pale);color:var(--rouge)}
.pyqi{width:34px;height:34px;border-radius:10px;background:var(--rouge-pale);color:var(--rouge);display:flex;align-items:center;justify-content:center;flex:none}
.pyqi .ico{width:17px;height:17px}.pyqi.in{background:var(--bleu-pale);color:var(--bleu)}
@media (max-width:760px){.pylr .pyvst{order:3}.pylw{padding-left:15px}}

/* ── v14.117 · LA FEUILLE D'UN ÉTABLISSEMENT ──
   Le sélecteur d'établissements, l'avancement, « À régler avant de
   verrouiller », le statut de chaque salarié, les champs qui
   s'enregistrent seuls, et la paie d'un salarié en entier. */
.pfe{display:flex;gap:4px;background:var(--surface-2);border:1px solid var(--ligne);border-radius:11px;padding:3px;flex-wrap:wrap}
.pfe a{display:inline-flex;align-items:center;gap:6px;padding:6px 11px;border-radius:8px;font-size:12px;font-weight:600;color:var(--muet);text-decoration:none}
.pfe a.on{background:var(--carte);color:var(--encre);box-shadow:var(--ombre)}.pfe .ico{width:13px;height:13px}
.pfh{display:flex;align-items:center;gap:10px;margin:-4px 0 14px;flex-wrap:wrap}
.pfk{display:flex;align-items:center;gap:8px;font-size:12px;color:var(--muet)}.pfk b{font-size:14px;color:var(--encre)}
.pfbar{width:140px;height:6px;border-radius:4px;background:var(--surface-2);overflow:hidden}.pfbar i{display:block;height:100%;background:var(--vert)}
.pftabs a .ico{width:14px;height:14px}
.pfs{width:20px;height:20px;border-radius:50%;display:inline-flex;align-items:center;justify-content:center;flex:none;border:1.5px dashed var(--ligne-2)}
.pfs .ico{width:12px;height:12px}
.pfs.ok{background:var(--vert);border:none;box-shadow:inset 0 0 0 4px var(--vert-pale)}.pfs.wa{background:var(--jaune-pale);color:var(--jaune);border:none}.pfs.ko{background:var(--rouge-pale);color:var(--rouge);border:none}
.pfnm{border:none;background:none;padding:0;font:inherit;font-weight:600;color:var(--encre);cursor:pointer;text-align:left}
.pfnm:hover{color:var(--terra-h);text-decoration:underline}
.pfx0{font-weight:600}.pfx0.ko{color:var(--rouge)}
.pytab tr.pfko td{background:#FDF4F2}
.pfin{width:96px}.pfin input::placeholder{color:var(--encre-2);opacity:.55}
.pfo input,.pfin.pfo input{border-color:var(--terra);background:var(--terra-pale);color:var(--terra-h);font-weight:700}
.pfc{display:flex;align-items:center;justify-content:flex-end;gap:3px;font-size:10.5px;color:var(--muet);margin:3px 0 0 auto;border:none;background:none;cursor:pointer;padding:0}
.pfc .ico{width:10px;height:10px}.pfc:hover{color:var(--terra-h)}
.pflg{display:flex;align-items:center;gap:16px;padding:12px 16px;border-top:1px solid var(--ligne);font-size:11.5px;color:var(--muet);flex-wrap:wrap}
.pflg span{display:inline-flex;align-items:center;gap:6px}.pflg .ico{width:12px;height:12px}
.pfo0{width:14px;height:10px;border-radius:3px;background:var(--terra-pale);border:1px solid var(--terra);display:inline-block}
/* v14.144 : des vraies valeurs. Calculé en encre, modifié en terra avec sa
   pastille, à saisir en jaune ; les absences en pastilles de famille ; une
   prime absente s'ajoute d'un clic. */
.pfin input{color:var(--encre);font-weight:600}
.pfin.pfo{position:relative}
.pfin.pfo::after{content:'';position:absolute;top:-3px;right:-3px;width:8px;height:8px;border-radius:50%;background:var(--terra);box-shadow:0 0 0 2px var(--carte)}
.pfin.pfsai input{border-color:var(--jaune);background:var(--jaune-pale)}
.pfin.pfsai input::placeholder{color:var(--jaune-txt);opacity:1}
.pfc{color:var(--terra-h);font-weight:600}.pfc s{color:var(--muet);font-weight:500;margin-right:2px}
.pfmod{font-size:12px;font-weight:600;color:var(--terra-h);background:var(--terra-pale);border:1px solid var(--terra);border-radius:999px;padding:2px 10px;margin-left:10px}
.pfmod[hidden]{display:none}
.pflk{min-width:24px;height:15px;border-radius:4px;border:1px solid var(--ligne);background:var(--carte);font-size:9px;font-style:normal;font-weight:700;
  color:var(--encre);display:inline-flex;align-items:center;justify-content:center;padding:0 3px}
.pflk.pfo0{position:relative;width:auto;height:15px;color:var(--terra-h)}
.pflk.pfo0::after{content:'';position:absolute;top:-3px;right:-3px;width:6px;height:6px;border-radius:50%;background:var(--terra)}
.pflk.pfsai{border-color:var(--jaune);background:var(--jaune-pale);color:var(--jaune-txt)}
.pfadd{display:inline-flex;align-items:center;justify-content:center;min-width:64px;height:32px;border-radius:8px;border:1px dashed transparent;
  color:var(--muet);font-size:12px;cursor:pointer;background:none;font-family:inherit}
tr:hover .pfadd{border-color:var(--ligne)}
.pfadd:hover{border-color:var(--terra)!important;color:var(--terra-h)}
.pfadd:hover span{display:none}.pfadd:hover::after{content:'+ Ajouter'}
.dwr .panel.pfpan{width:min(620px,96vw)}
.pfbody{padding:0!important}
.pfdh{display:flex;align-items:center;gap:12px;padding:16px 18px;border-bottom:1px solid var(--ligne)}
.pfdh .av-m{width:42px;height:42px;font-size:14px}
.pfdh b{display:block;font-size:16px;color:var(--encre)}.pfdh span{font-size:12px;color:var(--muet)}
.pfsec{padding:14px 18px;border-bottom:1px solid var(--ligne)}.pfsec:last-child{border-bottom:none}
.pfst{display:flex;align-items:center;gap:7px;font-size:11px;font-weight:700;letter-spacing:.05em;text-transform:uppercase;color:var(--muet);margin-bottom:10px}
.pfst .ico{width:13px;height:13px}
.pfg{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:10px 12px}.pfg .fg{margin:0}.pfg .pfin{width:100%}
.pfvide{font-size:12.5px;color:var(--muet)}
@media (max-width:760px){.pfg{grid-template-columns:1fr 1fr}}

/* ═══ v14.118 · PÉRIODES DE PAIE : RETOUCHES ═══════════════════ */
.pyfl{width:28px;height:28px;border:0;background:none;color:var(--muet);display:inline-flex;align-items:center;justify-content:center;cursor:pointer;flex:none;border-radius:8px;padding:0}
.pyfl:hover{color:var(--encre);background:var(--surface-2)}.pyfl .ico{width:16px;height:16px;transition:transform .15s}
.pyl.ouvert .pyfl .ico{transform:rotate(180deg)}
.pyfl0{width:28px;flex:none}
.pymlk{text-decoration:none;color:inherit;min-width:0;cursor:pointer}.pymlk:hover b{color:var(--terra-h)}
.pylp .pymlk{flex:1}.pylp .pyvst{flex:none}
.btn .pyexc{width:12px!important;height:12px!important;margin-left:1px;opacity:.7}
.pypg{display:flex;align-items:center;gap:12px;margin:14px 0 0;font-size:12px;color:var(--muet);flex-wrap:wrap}
.pypgl{font-size:11.5px}
.pypg .segr a{text-decoration:none}
.pypg .segr a span{display:block;text-align:center;font-size:11.5px;font-weight:600;color:var(--muet);padding:5px 11px;border-radius:6px}
.pypg .segr a.on span{background:var(--carte);box-shadow:var(--ombre);color:var(--encre)}
.pypgn{display:flex;gap:4px}
.pypgn a{min-width:30px;height:30px;border-radius:8px;border:1px solid var(--ligne);background:var(--carte);display:inline-flex;align-items:center;justify-content:center;font-size:12px;font-weight:600;color:var(--encre);text-decoration:none}
.pypgn a.on{background:var(--terra);border-color:var(--terra);color:#fff}.pypgn a.off{opacity:.4;pointer-events:none}.pypgn .ico{width:13px;height:13px}
.pyr270{transform:rotate(-90deg)}
.pfe1{display:inline-flex;align-items:center;gap:6px;font-size:12.5px;font-weight:600;color:var(--encre-2)}.pfe1 .ico{width:14px;height:14px;color:var(--muet)}
.pyvh .pysel.pyselt{display:flex;margin:0;padding:6px 12px}.pyselt:not(.on) .btn{display:none}
.pyselt #pyselx{cursor:default}
/* ═══ v14.119 · AUTRES ÉLÉMENTS ET ABSENCES ═══════════════════ */
.pfsrc{display:block;font-size:9.5px;font-weight:600;color:var(--muet);text-transform:none;letter-spacing:0;margin-top:2px}
.pfret{color:var(--rouge);font-weight:600;text-decoration:none;white-space:nowrap}.pfret:hover{text-decoration:underline}
.pfech{display:block;font-size:10.5px;color:var(--muet)}
.pfsal{display:flex;flex-wrap:wrap;gap:6px;margin-bottom:6px}
.pfsk{display:inline-flex;cursor:pointer}.pfsk input{position:absolute;opacity:0;pointer-events:none}
.pfsk span{font-size:12px;font-weight:600;padding:5px 10px;border-radius:999px;border:1px solid var(--ligne);background:var(--carte);color:var(--encre-2)}
.pfsk input:checked+span{background:var(--terra-pale);border-color:#F3CDBE;color:var(--terra-h)}
.pfsk input:focus-visible+span{outline:2px solid var(--terra);outline-offset:1px}
.pfskt{font-size:12px}
.pfab{border:0;background:none;padding:0;font:inherit;font-weight:600;color:var(--encre);cursor:pointer;border-bottom:1px dotted var(--muet);text-align:right}
.pfab[disabled]{cursor:default;border-bottom:0}
.pfab small{display:block;font-size:10px;font-weight:600;color:var(--jaune)}.pfab.at{border-bottom-color:var(--jaune)}
#dwr-abs .ldt .btn{margin-left:8px}
/* ═══ v14.122 · LE JOURNAL DE PAIE ═══════════════════════════ */
.rlsrc.jnl{background:var(--jaune-pale);color:var(--jaune)}
.rlw{display:block;font-size:10.5px;font-weight:600;color:var(--jaune);white-space:nowrap}
/* ═══ v14.123 · LES IMPORTS EN POP-UP ═══════════════════════════ */
.rlm .modal-box{max-width:520px}
.rlmi{width:34px;height:34px;border-radius:10px;background:var(--terra-pale);color:var(--terra-h);display:flex;align-items:center;justify-content:center;flex:none;margin-right:10px}
.rlmi .ico{width:17px;height:17px}
.rldz{display:block;cursor:pointer}
.rlm.rlrun .modal-veil{pointer-events:none}
.rlm.rlrun .mclose{opacity:.35;pointer-events:none}
.rldz.rlanim{pointer-events:none;background-image:linear-gradient(100deg,transparent 30%,rgba(255,255,255,.55) 50%,transparent 70%);background-size:200% 100%;animation:chargeglisse 1.3s linear infinite}
/* ═══ v14.124 · LES COÛTS PAYÉS ═════════════════════════════════ */
.ctnr{display:flex;align-items:center;gap:8px;margin:8px 0 0;padding:8px 12px;border-radius:10px;background:var(--jaune-pale);font-size:12.5px;color:#7A5410}
.ctnr .ico{width:14px;height:14px}.ctnr span{flex:1}
.ctwhy{display:block;font-size:10.5px;color:var(--muet);font-weight:500}
tr.ctnrr td{background:var(--jaune-pale)}
.ctback{margin:0 0 10px;font-size:12.5px}.ctback .ico{width:12px;height:12px;vertical-align:-2px}
/* ═══ v14.125 · IMPORT VÉRIFIÉ ET RATTACHEMENT ═══════════════════ */
.rlres{margin-top:12px}.rlres .charge{justify-content:flex-start}
.rldz.rlko{border-color:var(--rouge);border-style:solid;background:var(--rouge-pale)}
.rlwa{color:var(--jaune)!important}
tr.rlinc td{color:var(--muet)}tr.rlinc b{color:var(--encre-2)}
.rlratb{max-width:600px}
.rlrh{display:grid;grid-template-columns:1fr 18px 1.25fr;gap:10px;font-size:10.5px;font-weight:700;text-transform:uppercase;letter-spacing:.05em;color:var(--muet);padding:0 0 6px}
.rlr{display:grid;grid-template-columns:1fr 18px 1.25fr;gap:10px;align-items:center;padding:10px 0;border-top:1px solid var(--ligne)}
.rlrn b{display:block;font-size:13px}.rlrn span{font-size:11px;color:var(--muet)}
.rlra{width:14px;height:14px;color:var(--muet);transform:rotate(-90deg)}
.rlrc .fi{height:34px}.rlrc small{display:block;font-size:10.5px;margin-top:3px;color:var(--muet)}.rlrc small.ok{color:var(--vert)}.rlrc small.wa{color:var(--jaune)}
#m-rl-rat form{max-height:70vh;overflow:auto}

/* ═══ v14.126 · BUDGET ET RÉEL ═════════════════════════════════ */
.bgpa{fill:var(--vert)}.bges{fill:color-mix(in srgb,var(--jaune) 38%,var(--carte))}.bgpv{fill:var(--surface-2);stroke:var(--ligne)}
.esle .bgpa{background:var(--vert)}.esle .bges{background:color-mix(in srgb,var(--jaune) 38%,var(--carte))}.esle .bgpv{background:var(--surface-2);box-shadow:inset 0 0 0 1px var(--ligne)}
.bgbud{stroke:var(--encre);stroke-width:2.5;stroke-linecap:round}
.bgsp{display:grid;grid-template-columns:auto minmax(120px,260px) auto;align-items:center;gap:18px;margin:12px 16px 0;padding:10px 14px;border-radius:10px;background:var(--surface-2);font-size:13px}
.bgsp b{font-size:15px}.bgsl{font-size:12px;color:var(--muet)}
.bgspb{display:flex;height:8px;border-radius:5px;overflow:hidden;background:var(--carte)}
.bgspb i.pl,.bgsl i.pl{background:var(--jaune)}.bgspb i.pa,.bgsl i.pa{background:var(--bleu)}
.bgsl i{display:inline-block;width:8px;height:8px;border-radius:50%;margin:0 6px 0 12px}
.bgt6 .bgrd{display:inline-block;min-width:84px;margin-right:10px}.bgt6 .pill{min-width:56px;justify-content:center}
.bgdl{color:var(--muet);font-size:12.5px}.bgt6 tr.bgpvr td{color:var(--muet)}
.bgn{color:var(--encre-2);font-weight:600}
.bgcx{display:flex;align-items:center;gap:10px;font-size:12.5px;color:var(--muet);padding-bottom:12px;border-bottom:1px solid var(--ligne)}.bgcx b{font-size:15px}
.bgcas{display:flex;flex-direction:column}
.bgcg{font-size:10.5px;font-weight:800;letter-spacing:.08em;text-transform:uppercase;color:var(--muet);margin:14px 0 2px}
.bgcr{display:grid;grid-template-columns:170px 1fr 92px;align-items:center;gap:14px;padding:8px 0}
.bgcr.t{border-top:1px solid var(--ligne);margin-top:6px;padding-top:12px}
.bgcl b{display:block;font-size:13px}.bgcl small{display:block;font-size:11px;color:var(--muet);margin-top:2px;line-height:1.35}
.bgct{position:relative;height:14px;background:var(--surface-2);border-radius:7px}
.bgct i{position:absolute;top:0;bottom:0;border-radius:7px}
.bgct i.bud{box-shadow:inset 0 0 0 2px var(--encre)}.bgct i.es{background:color-mix(in srgb,var(--jaune) 38%,var(--carte))}.bgct i.pa{background:var(--vert)}
.bgct i.up{background:color-mix(in srgb,var(--rouge) 45%,var(--carte))}.bgct i.dn{background:color-mix(in srgb,var(--vert) 45%,var(--carte))}
.bgcv{text-align:right;font-size:13px}
@media (max-width:640px){.bgsp{grid-template-columns:1fr}.bgcr{grid-template-columns:1fr 70px}.bgct{grid-column:1/-1;order:3}}
.kpi .k1 .pill{width:fit-content}

/* ═══ v14.127 · LE MOIS EN COURS, LA PAIE QUI APPREND, LES ÉCARTS QUI REVIENNENT ═══ */
.bgcons.bgov2{box-shadow:inset -3px 0 0 var(--rouge)}
.bgenc{padding:14px 16px 12px}
.bgencl{display:flex;align-items:center;gap:10px;font-size:12.5px;color:var(--muet);flex-wrap:wrap}
.bgencn{font-size:20px}
.bgencj{position:relative;height:14px;margin:16px 0 8px;background:var(--surface-2);border-radius:7px}
.bgencj i{position:absolute;top:0;bottom:0}
.bgencj i.f{left:0;background:var(--vert);border-radius:7px 0 0 7px}
.bgencj i.r{background:repeating-linear-gradient(45deg,color-mix(in srgb,var(--jaune) 38%,var(--carte)) 0 5px,var(--jaune-pale) 5px 10px)}
.bgencj i.b{width:3px;top:-5px;bottom:-5px;background:var(--encre);border-radius:2px}
.bgencw{display:flex;gap:18px;flex-wrap:wrap}.bgencw i{display:inline-block;width:10px;height:10px;border-radius:3px;margin:0 6px 0 0;vertical-align:-1px}
.bgencw i.f{background:var(--vert)}.bgencw i.r{background:color-mix(in srgb,var(--jaune) 38%,var(--carte))}.bgencw i.b{width:3px;background:var(--encre)}
.bgal2{margin-top:10px;border-top:1px solid var(--ligne)}.bgal2 .bgcr{grid-template-columns:1fr 0 110px}
.ctap{padding:14px 16px 12px}
.ctaph{display:flex;align-items:center;gap:12px;flex-wrap:wrap}.ctseg{max-width:360px}
.ctaps{display:flex;gap:10px;flex-wrap:wrap;margin-top:14px}
.ctaps div{flex:1;min-width:110px;padding:9px 12px;border:1px solid var(--ligne);border-radius:10px}
.ctaps span{display:block;font-size:11.5px;color:var(--muet)}.ctaps b{font-size:15px}
.ctaps .ctapm{background:var(--surface-2);border-color:transparent}
.ctapl{font-size:12px;color:var(--muet);margin:10px 0 0}
.ctrc{display:inline-block;min-width:58px;padding:3px 8px;border-radius:7px;font-size:12px;font-weight:700;text-align:center;color:var(--muet)}
.ctrc.u1{background:var(--rouge-pale);color:var(--rouge)}.ctrc.u2{background:color-mix(in srgb,var(--rouge) 28%,var(--carte));color:var(--rouge)}.ctrc.u3{background:color-mix(in srgb,var(--rouge) 60%,var(--carte));color:#fff}
.ctrc.d1{background:var(--vert-pale);color:var(--vert)}.ctrc.d2{background:color-mix(in srgb,var(--vert) 28%,var(--carte));color:var(--vert)}.ctrc.d3{background:color-mix(in srgb,var(--vert) 60%,var(--carte));color:#fff}
.ctsm{font-size:12px;color:var(--muet)}

/* ═══ v14.128 → v14.130 · LA PAIE SAISIE DANS LE TABLEAU ═══ */
.rlsrc.man{background:var(--violet-pale);color:var(--violet)}
.pfac{display:flex;gap:8px;margin-left:12px}

/* ═══ v14.131 · PÉRIODES DE PAIE : LA LISTE ÉPURÉE ══════════════
   Le nom et les dates sur une ligne, qui est payé en gris, et les
   établissements en lignes simples au dépliage. */
.pylt{display:flex;align-items:baseline;gap:10px;flex-wrap:wrap}
.pyld{font-size:12px;color:var(--muet)}
.pylres{font-size:12px;color:var(--muet);white-space:nowrap}
.pyetb{width:166px;flex:none}
.pyl .pyls{padding:0 15px 8px 44px}
.pyl .pylp{border-top:1px solid var(--surface-2)}.pyl .pylp:first-child{border-top:none}
.pylp b{font-size:13px}
.pyetl{display:flex;flex-direction:column;padding:4px 0 6px}.pyetl.r{padding:0 0 10px 30px}
.pyetl a{display:flex;align-items:center;gap:8px;padding:7px 10px;border-radius:8px;text-decoration:none;color:var(--encre-2);font-size:12.5px}
.pyetl a:hover{background:var(--surface-2)}.pyetl a b{font-weight:600;color:var(--encre)}
.pyetl a em{font-style:normal;font-size:12px;font-weight:600;color:var(--terra-h);opacity:0}.pyetl a:hover em{opacity:1}
.pyetl .ico{width:13px;height:13px;color:var(--muet);flex:none}
@media (max-width:760px){.pyetb{display:none}.pylres{order:3}.pyl .pyls{padding-left:15px}.pyetl.r{padding-left:10px}}

/* ═══ v14.138 · CE QU'UNE ABSENCE VAUT, ET EN COMBIEN DE FOIS ═══
   .abun  — l'aperçu d'une ligne sous « Se compte en » (socle) ;
   .abnu  — un nombre et son unité choisie (jours, semaines, mois) ;
   .abreg — les règles « en plusieurs fois », en retrait ;
   .abref — la date de référence en tête des périodes (tiroir) ;
   .abdua — Du et Au sur une ligne, quand il n'y a pas de demi-journée ;
   .aberr — la règle qui ne tient pas, sous les dates. */
.abun{display:flex;align-items:baseline;justify-content:space-between;gap:12px;padding:9px 12px;margin:0 0 12px;
  border:1px dashed var(--ligne);border-radius:10px;background:var(--surface-2)}
.abun b{font-family:var(--f-mono,monospace);font-size:13px;white-space:nowrap}
.abnu{display:flex;gap:6px}
.abnu .fi:first-child{flex:1;min-width:0}
.abnu select.fi{width:104px;flex:none}
.abreg{border-left:3px solid var(--ligne);padding:2px 0 2px 14px;margin:0 0 14px}
.abreg[hidden],#ab-jt[hidden]{display:none}
.abref{display:flex;align-items:center;justify-content:space-between;gap:10px;margin:0 0 10px;flex-wrap:wrap}
.abref .fl{margin:0}
.abref .abrefc{display:flex;align-items:center;gap:12px}
.abref .dtwrap,.abref>.abrefc>.fi{width:170px;flex:none}
.abref[hidden]{display:none}
.abdua{display:flex;gap:14px}
.abdua .perline{flex:1;min-width:0;margin-bottom:0}
.abdua .perline .dtwrap{flex:1;width:auto;min-width:0}
.abdua .perline .dtwrap .fi,.abdua .perline>.fi{width:100%}
.aberr{font-size:11.5px;color:var(--rouge);margin:7px 0 2px 33px}
.aberr:empty{display:none}
.dwsh .bulle .bt{left:auto;right:-10px;transform:none}
.dwsh .bulle .bt::after{left:auto;right:14px;transform:none}

/* v14.139 · La fiche client d'un type d'absence se LIT : une valeur de
   texte n'a pas l'allure d'un chiffre de loi (monospace, terre cuite). */
.ab-lg .v.tx{font-family:inherit;font-weight:600;color:var(--encre);white-space:normal}

/* v14.140 · Un nombre suivi de son unité n'a pas de flèches : elles
   recouvraient « jours avant ». Une unité longue réserve sa place. */
.funit input[type=number]{-moz-appearance:textfield;appearance:textfield}
.funit input[type=number]::-webkit-outer-spin-button,
.funit input[type=number]::-webkit-inner-spin-button{-webkit-appearance:none;margin:0}
.funit.funlg input{padding-right:86px}

/* ── v14.145 · LA COLONNE DES SALARIÉS, ET LA SÉLECTION ──
   Le bouton de tri se pose dans l'en-tête « Salarié » de chaque
   tableau de la paie (footer.php) ; la colonne reste en place quand
   on lit à droite. Dans « Autres éléments », une case par salarié :
   la barre du bas agit sur les lignes cochées. */
.tbtri{border:1px solid var(--ligne);background:var(--carte);color:var(--muet);border-radius:6px;
  padding:1px 6px;margin-left:8px;font:700 9.5px var(--f-ui);letter-spacing:.02em;cursor:pointer;
  vertical-align:middle;white-space:nowrap;text-transform:none}
.tbtri:hover{border-color:var(--ligne-2);color:var(--encre)}
.tbtri.on{border-color:var(--terra);background:var(--terra-pale);color:var(--terra-h)}
.tA th.tbcol{z-index:4;background:var(--surface-2)}
.pfck{display:inline-flex;align-items:center;margin-right:8px;vertical-align:middle}
.pfselc{display:flex;align-items:center}
.pytab tr.pfon td{background:#FDF6F1}
.pytab tr.pfon td:first-child{box-shadow:inset 3px 0 0 var(--terra)}
.pfsb span,.pfsb button{white-space:nowrap}
.selbar[hidden]{display:none}
body:has(.dwr.open) .pfsb{display:none}
.pfseg{display:inline-flex}
.pfmts{display:grid;gap:8px}
.pfmt{display:flex;align-items:center;gap:12px;padding:8px 10px;border:1px solid var(--ligne);border-radius:10px;background:var(--carte)}
.pfmt .funit{width:130px;flex:none}
.pfmtn{display:flex;align-items:center;gap:10px;flex:1;min-width:0}
.pfmtn .av-m{width:28px;height:28px;font-size:10px}
.pfmtn b{display:block;font-size:13px}
.pfmtn small{display:block;font-size:11.5px;color:var(--muet)}

/* ── v14.146 · LA MUTUELLE, OUI OU NON ── */
.pytab td.pfmu{text-align:center}
/* v14.147 : une famille d'absences couvre vingt colonnes — son nom se lit
   au début du groupe, pas au milieu, hors de l'écran. */
.pytab thead tr.g th.pfgl{text-align:left;padding-left:14px}
.pytab td.pfgl,.pytab thead tr.c th.pfgl{text-align:left}
/* v14.147 : sous une absence corrigeable, ce qui attend encore d'être validé. */
.pfab.pfabd{display:block;margin:4px 0 0 auto;font-size:10.5px;color:var(--jaune-txt)}

/* ── v14.148 · LA PÉRIODE DE PAIE EN PLEINE LARGEUR ──
   Seuls les tableaux s'étirent : le titre, les onglets, le choix de
   l'établissement et les encarts sans tableau gardent la largeur
   habituelle, alignés sur le bord gauche des tableaux. */
body.pfwide .content{max-width:none}
body.pfwide .content > .pfh,
body.pfwide .content > .card:not(:has(.pytab)){max-width:1308px}
/* v14.153 : l'en-tête de la période prend toute la largeur — Exports et
   Verrouiller tout à droite, même quand la ligne se replie. */
body.pfwide .content > .vh > .pyvmenu{margin-left:auto}

/* ── v14.149 · HEURES OU DÉCIMALES, FÉRIÉS RÉGLÉS, SUIVI DE MODULATION ── */
.pfhmode{display:inline-flex}
.pffr{display:flex;flex-wrap:wrap;gap:8px 16px;padding:12px 18px;border-bottom:1px solid var(--ligne)}
.pffj{display:inline-flex;align-items:center;gap:7px;font-size:12.5px;color:var(--encre)}
.pffj b{font-weight:700}
.pfmbar{width:90px;margin-top:4px}
.pfmb{min-width:0}
.pfmb td,.pfmb th{padding:8px 10px}
.pfmb tr.pfmodin td{background:var(--terra-pale)}
.pfmb tr.pfmodcur td:first-child{box-shadow:inset 3px 0 0 var(--terra)}

/* ── v14.151 · LA PASTILLE EST LE BOUTON, ÉTAPE PAR ÉTAPE ──
   Dans un onglet, le rond au début de la ligne se clique : vert plein,
   vérifié ; un second clic retire. Au clavier, la ligne choisie est
   soulignée en jaune. L'onglet porte l'avancement de son étape. */
button.pfs{padding:0;background:var(--carte);cursor:pointer;font:inherit;color:inherit;transition:transform .1s,box-shadow .1s}
button.pfs.wa{background:var(--jaune-pale);color:var(--jaune)}
button.pfs.ko{background:var(--rouge-pale);color:var(--rouge)}
button.pfs.ok{background:var(--vert)}
button.pfs:hover,button.pfs:focus-visible{transform:scale(1.15);border-color:var(--vert);box-shadow:0 0 0 3px var(--vert-pale);outline:none}
button.pfs.ko:hover{box-shadow:0 0 0 3px var(--rouge-pale)}
button.pfs.ok:hover{box-shadow:inset 0 0 0 4px var(--vert-pale),0 0 0 3px var(--vert-pale)}
.pytab tr.pfok td{background:#F3F8EE}
.pytab tr.pfok td:first-child{box-shadow:inset 3px 0 0 var(--vert)}
.pytab tr.pffoc td{background:#FFF9EC}
.pytab tr.pffoc td:first-child{box-shadow:inset 3px 0 0 var(--jaune)}
.pytab tr.pffoc.pfok td{background:#EEF5E6}
.pfpop{position:absolute;z-index:120;width:290px;background:var(--encre);color:#fff;border-radius:10px;padding:10px 12px;
  font-size:12px;line-height:1.5;box-shadow:var(--ombre-2)}
.pfpop b{display:block;margin-bottom:4px}
.pfpa{display:flex;gap:6px;margin-top:9px;flex-wrap:wrap}
.pfpa button{border:1px solid rgba(255,255,255,.3);background:rgba(255,255,255,.1);color:#fff;border-radius:7px;padding:4px 9px;
  font:600 11.5px var(--f-ui);cursor:pointer}
.pfpa button:hover{background:rgba(255,255,255,.22)}
.pfet{display:inline-flex;align-items:center;gap:5px;margin-left:7px;font-size:10.5px;font-weight:700;border-radius:999px;padding:1px 7px;
  background:var(--surface-2);color:var(--muet);white-space:nowrap}
.pfet i{width:7px;height:7px;border-radius:50%;background:var(--ligne-2)}
.pfet.en{background:var(--terra-pale);color:var(--terra-h)}.pfet.en i{background:var(--terra)}
.pfet.ok{background:var(--vert-pale);color:var(--vert-fonce)}.pfet.ok i{background:var(--vert)}
/* v14.152 · v14.153 : le menu des étapes ne défile jamais et ne passe
   pas à la ligne. Il prend la largeur de ce qu'il porte ; ce qui ne
   tient pas se range dans « Plus », une liste qui se déroule. */
body.pfwide .content > .pftabs{width:fit-content;max-width:100%;flex-wrap:nowrap;overflow:visible}
.pftabs > a,.pftplus > a{flex:0 0 auto;padding:7px 11px;gap:6px;cursor:pointer}
.pftabs > a[hidden],.pftplus[hidden]{display:none}
.pftplus{flex:none;display:inline-flex}
.pftmenu .pyvit{align-items:center;justify-content:flex-start;gap:9px;padding:9px 11px;border-radius:8px;font-size:12.5px}
.pftmenu .pfet{margin-left:auto}
.pftabs .pfet{margin-left:4px}

/* ═══ v14.154 · BULLETINS ET VIREMENTS, AU PAS DES AUTRES ÉTAPES ═══
   Le bandeau des non reconnus, repliés en bas du tableau ; un montant
   se clique pour être corrigé, un montant tapé est orange ; le tiroir
   du salarié et celui du virement. */
#rl-zone .ch h3{white-space:nowrap}
.rltab .rlw{white-space:normal;max-width:140px;margin-left:auto}
.rltab td:last-child{white-space:normal;max-width:150px}
.rlban{margin:12px 18px 4px;align-items:center;background:var(--jaune-pale);color:#7A5410}
.rlban .ico{color:var(--jaune)}.rlban>span{flex:1}.rlban .btn{flex:none}
.rlincg.ferme tr.rlinc{display:none}
.rlincg tr.eqlig{cursor:pointer}
.rlincg .chv{transition:transform .15s}.rlincg.ferme .chv{transform:rotate(-90deg)}
.rltab td[data-rlc]{cursor:pointer}
.rltab td[data-rlc]:hover{background:var(--terra-pale)}
.rltape{color:var(--terra-h);font-weight:700}
.rltape::after{content:'';display:inline-block;width:6px;height:6px;border-radius:50%;background:var(--terra);margin-left:5px;vertical-align:middle}
.rlest{color:var(--muet);font-style:italic}
.rlsaisir{margin-left:8px;border:1px dashed var(--ligne-2);background:none;border-radius:7px;padding:3px 8px;font:600 11.5px var(--f-ui);color:var(--terra-h);cursor:pointer}
.rlsaisir:hover{border-color:var(--terra);background:var(--terra-pale)}
.rlav{width:38px;height:38px;font-size:13px;margin-right:12px;flex:none}
.rlder{display:block;font-size:10.5px;color:var(--muet);margin-top:4px}
#dwr-rl-sal .pfg .pfc{justify-content:flex-start;margin:4px 0 0}
#rs-raz{white-space:nowrap}
.rlvl{border:1px solid var(--ligne);border-radius:10px;overflow:hidden}
.rlvl>div{display:flex;align-items:center;gap:10px;padding:9px 12px;border-top:1px solid var(--ligne);font-size:12.5px}
.rlvl>div:first-child{border-top:none}.rlvl b{flex:1;font-weight:600}.rlvl .z b{color:var(--muet)}
.rlcpt{display:flex;flex-wrap:wrap;gap:4px 10px;align-items:baseline;border:1px solid var(--ligne);border-radius:10px;padding:10px 12px;background:var(--surface-2)}
.rlcpt span{font-size:12px;color:var(--muet);flex:1}
.rlfg{display:grid;gap:8px}
/* v14.155 : associer dans la pop-up d'import, avant d'importer. */
.rlass{margin-top:12px;max-height:42vh;overflow:auto}.rlass .fhelp{margin:0 0 8px}

/* ═══ v14.157 · D'OÙ VIENNENT LES HEURES ═══
   Une case d'heures complémentaires ou supplémentaires se lit semaine
   par semaine, au survol : le chiffre porte la bulle, souligné. */
.bulle.pfsem{display:inline;width:auto;height:auto;border:0;border-radius:0;background:none;margin:0;
  font:inherit;color:inherit;cursor:help;border-bottom:1px dotted var(--muet)}
.bulle.pfsem:hover,.bulle.pfsem:focus{background:none;color:var(--terra-h);border-bottom-color:var(--terra)}
.bulle.pfsem .bt{width:320px}

/* ═══ v14.159 · LA FIN DE LA MODULATION ═══
   Dans le suivi : la date de fin, les heures payées (corrigeables) et
   ce qui en sort. */
/* v14.160 · la fin de période de modulation, dans ses colonnes */
.pytab small.pfsa{display:block;margin-top:2px;font-size:11px;font-weight:600;color:var(--encre-2)}
.pytab td.pfmfin{background:var(--surface-2)}
.pytab .pfmav{color:var(--muet);font-weight:600}
.pytab .pfcor{display:block;margin:2px 0 0 auto;border:none;background:none;padding:0;font:600 11px var(--f-ui);color:var(--terra);cursor:pointer}
.pytab .pfcor:hover{text-decoration:underline}
/* v14.160 · le tiroir de la régularisation de la modulation */
.pfrgm{display:flex;align-items:center;justify-content:space-between;gap:12px;padding:8px 0;border-bottom:1px solid var(--ligne)}
.pfrgm > span{display:flex;flex-direction:column}.pfrgm small{color:var(--muet);font-size:11.5px}
.pfrgm > div{display:flex;align-items:center;gap:6px}.pfrgm .pfin{width:120px}
.pfrgm.pfrgt{border-bottom:none}
.pfrgc{list-style:none;margin:0;padding:0;font-size:12.5px}
.pfrgc li{display:flex;justify-content:space-between;gap:16px;padding:5px 0;border-bottom:1px dashed var(--ligne)}
.pfrgc li span{color:var(--encre-2)}.pfrgc li b{white-space:nowrap}
.pfrgr{margin-top:10px}.pfrgr li{border-bottom:none}.pfrgr li b{color:var(--vert-fonce)}.pfrgr li.z b,.pfrgr li.z span{color:var(--muet)}
/* Le fondu d'un tableau qui défile (mask-image) coupe tout ce qui est
   posé en fixe dedans : pendant qu'une bulle est ouverte, il s'efface. */
.scrollx:has(.bulle:hover),.scrollx:has(.bulle:focus){-webkit-mask-image:none!important;mask-image:none!important}

/* ── v14.160 · LES EN-TÊTES DE TABLEAU ──
   Moins « tableau » : la ligne des colonnes est un bandeau arrondi, les
   groupes au-dessus des pastilles. Sur une grande liste, le tableau
   défile dans sa carte et ses en-têtes restent en haut — le total en
   bas, le nom à gauche. */
.pytab,.tA{border-collapse:separate;border-spacing:0}
.card > .scrollx:has(> .pytab),.card > .scrollx:has(> .tA){margin:0 12px 12px}
.scrollx:has(> .pytab),.scrollx:has(> .tA){max-height:max(420px, calc(100vh - 200px));overflow:auto}
.scrollx > .pytab thead th,.scrollx > .tA thead th{position:sticky;top:0;z-index:3}
.scrollx > .pytab thead .tbcol,.scrollx > .tA thead .tbcol{z-index:5}
.pytab thead tr.g th{height:34px;box-sizing:border-box;white-space:nowrap;padding:3px 4px 4px;background:var(--carte);border-bottom:none}
.pytab thead tr.g th:not(.vide){background:var(--surface-2);border:3px solid var(--carte);border-radius:999px;box-shadow:inset 0 0 0 1px var(--ligne);padding:3px 10px}
.pytab thead tr.g th.vide,.pytab thead tr.g th.vide.tbcol{background:var(--carte)}
.scrollx > .pytab thead tr.g + tr th{top:34px}
.pytab thead tr.c th,.tA thead th{border-bottom:none}
.pytab thead tr.c th:first-child,.tA thead tr > th:first-child{border-radius:12px 0 0 12px}
.pytab thead tr.c th:last-child,.tA thead tr > th:last-child{border-radius:0 12px 12px 0}
.scrollx > .pytab tfoot td{position:sticky;bottom:0;z-index:3}
.scrollx > .pytab tfoot .tbcol{z-index:5}
.pytab tfoot td{border-top:none}
.pytab tfoot td:first-child{border-radius:12px 0 0 12px}
.pytab tfoot td:last-child{border-radius:0 12px 12px 0}
.pytab tbody tr:not([class]):hover td{background:var(--surface-2)}

/* ── v14.161 · LES TABLEAUX : TEINTES, BANDES, ZÉBRURES, DENSITÉ ──
   Chaque groupe de colonnes a sa teinte douce : sa pastille, un liseré
   au-dessus de ses colonnes, et — à partir du deuxième — une bande qui
   descend jusqu'au total. Une ligne sur deux est teintée, sans filet.
   Le groupe de chaque cellule (data-tg) est posé par le pied de page
   d'après les colspan de la ligne des groupes. Une ligne marquée
   (vérifiée, bloquante, sélectionnée) garde sa couleur. */
:root{--tg1:#EEF1F6;--tg1t:#5E6B84;--tg2:#F1EEF7;--tg2t:#6E5E8E;--tg3:#FBF1E4;--tg3t:#9A6B2E;--tg4:#FCEDE8;--tg4t:#B5553A;--tg5:#EAF2F4;--tg5t:#4F7784;--zebre:color-mix(in srgb,var(--surface-2) 55%,var(--carte))}
.pytab td{font-variant-numeric:tabular-nums}
.pytab thead tr.g th[data-tg]:not(.vide){box-shadow:none}
.pytab thead tr.g th[data-tg="1"]{background:var(--tg1);color:var(--tg1t)}
.pytab thead tr.c th[data-tg="1"]{box-shadow:inset 0 3px 0 var(--tg1t)}
.pytab thead tr.g th[data-tg="2"]{background:var(--tg2);color:var(--tg2t)}
.pytab thead tr.c th[data-tg="2"]{box-shadow:inset 0 3px 0 var(--tg2t)}
.pytab thead tr.g th[data-tg="3"]{background:var(--tg3);color:var(--tg3t)}
.pytab thead tr.c th[data-tg="3"]{box-shadow:inset 0 3px 0 var(--tg3t)}
.pytab thead tr.g th[data-tg="4"]{background:var(--tg4);color:var(--tg4t)}
.pytab thead tr.c th[data-tg="4"]{box-shadow:inset 0 3px 0 var(--tg4t)}
.pytab thead tr.g th[data-tg="5"]{background:var(--tg5);color:var(--tg5t)}
.pytab thead tr.c th[data-tg="5"]{box-shadow:inset 0 3px 0 var(--tg5t)}
/* Les zébrures : .pytab et .tA */
.pytab tbody td,.tA tbody td{border-bottom-color:transparent}
.pytab tbody tr:nth-child(even) td,.tA tbody tr:nth-child(even) td{background:var(--zebre)}
.tA tbody tr:hover td{background:var(--surface-2)}
.pytab tbody td:where([data-tg="2"]),.pytab tfoot td:where([data-tg="2"]){background:color-mix(in srgb,var(--tg2) 70%,var(--carte))}
.pytab tbody tr:nth-child(even) td:where([data-tg="2"]){background:color-mix(in srgb,var(--tg2) 70%,var(--surface-2))}
.pytab tbody td:where([data-tg="3"]),.pytab tfoot td:where([data-tg="3"]){background:color-mix(in srgb,var(--tg3) 70%,var(--carte))}
.pytab tbody tr:nth-child(even) td:where([data-tg="3"]){background:color-mix(in srgb,var(--tg3) 70%,var(--surface-2))}
.pytab tbody td:where([data-tg="4"]),.pytab tfoot td:where([data-tg="4"]){background:color-mix(in srgb,var(--tg4) 70%,var(--carte))}
.pytab tbody tr:nth-child(even) td:where([data-tg="4"]){background:color-mix(in srgb,var(--tg4) 70%,var(--surface-2))}
.pytab tbody td:where([data-tg="5"]),.pytab tfoot td:where([data-tg="5"]){background:color-mix(in srgb,var(--tg5) 70%,var(--carte))}
.pytab tbody tr:nth-child(even) td:where([data-tg="5"]){background:color-mix(in srgb,var(--tg5) 70%,var(--surface-2))}
/* La densité : confort (par défaut) ou compacte, au choix de chacun (html.tdcompact). */
.tdcompact .pytab td,.tdcompact .tA td{padding-top:5px;padding-bottom:5px}
.tdcompact .pytab .nomcell small{display:inline;margin-left:6px}
.tdcompact .pytab .nomcell > span:last-child{display:flex;align-items:baseline;flex-wrap:wrap}
.tdcompact .pytab .av-m,.tdcompact .tA .av-m{width:24px;height:24px;font-size:9.5px}
.tdcompact .pytab .fi{height:26px}
.tdcompact .pytab small.pfech,.tdcompact .pytab small.pfsrc{display:none}
.tdcompact .tA td .r2{display:inline;margin-left:6px}

/* ═══ v14.162 · LA MESSAGERIE ═══════════════════════════════════
   Trois colonnes dans une carte : la liste (mgl), le fil (mgfil), les
   détails (mgdet). Les bulles reprennent celles du chat du support :
   les miennes en terra pâle, les autres blanches. */
.rail .rit .rnb{position:absolute;top:5px;right:8px;background:var(--terra);color:#fff;font-style:normal;font-size:9.5px;font-weight:700;border-radius:8px;padding:0 5px;line-height:15px;border:1.5px solid var(--carte)}
.mgbox{display:grid;grid-template-columns:300px minmax(0,1fr) 270px;border:1px solid var(--ligne);border-radius:var(--r);overflow:hidden;background:var(--carte);height:calc(100vh - 104px);min-height:480px}
body.wide:has(.mgbox) .content{padding-bottom:20px}
.mgbox.sansdet{grid-template-columns:300px minmax(0,1fr)}
.mgl{border-right:1px solid var(--ligne);display:flex;flex-direction:column;min-width:0}
.mgl .spf{gap:5px}
.mgl .rech2{margin:10px 12px 0;display:flex;align-items:center;gap:7px;border:1px solid var(--ligne);border-radius:9px;padding:6px 10px;background:var(--surface-2);color:var(--muet)}
.mgl .rech2 input{border:0;background:none;outline:none;flex:1;min-width:0;font:400 12.5px var(--f-ui);color:var(--encre)}
.mgl .rech2 .ico{width:15px;height:15px;flex:none}
.mgl .lst{flex:1;overflow:auto}
.mgcv{display:flex;gap:10px;align-items:flex-start;width:100%;text-align:left;padding:10px 13px;border:0;border-bottom:1px solid var(--ligne);border-left:3px solid transparent;background:none;cursor:pointer;font-family:var(--f-ui)}
.mgcv:hover{background:var(--surface-2)}
.mgcv.on{background:var(--terra-pale);border-left-color:var(--terra)}
.mgcv .b{flex:1;min-width:0}
.mgcv .l1{display:flex;align-items:baseline;gap:6px}
.mgcv .l1 b{flex:1;min-width:0;font-size:12.5px;font-weight:600;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;color:var(--encre)}
.mgcv .l1 time{font-size:10.5px;color:var(--muet);flex:none}
.mgcv .l2{font-size:11.5px;color:var(--muet);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;display:flex;gap:6px;align-items:center}
.mgcv .l2 span{overflow:hidden;text-overflow:ellipsis}
.mgcv.unr .l2{color:var(--encre);font-weight:500}
.mgcv .u{margin-left:auto;flex:none;background:var(--terra);color:#fff;font-size:10px;font-weight:700;border-radius:20px;padding:0 6px;line-height:16px}
.mgbox .av-m.sq{border-radius:9px}.mgbox .av-m.sq .ico{width:16px;height:16px;stroke:#fff}
.mgbox .av-m.xs,.mgpop .av-m.xs{width:20px;height:20px;font-size:8.5px}
.mgbox .av-m.sm,.mgpop .av-m.sm{width:26px;height:26px;font-size:10px}
.mgfil{display:flex;flex-direction:column;min-width:0;background:var(--surface-2)}
.mgh{padding:10px 16px;border-bottom:1px solid var(--ligne);display:flex;align-items:center;gap:10px;background:var(--carte)}
.mgh .b{flex:1;min-width:0}
.mgh b{font-family:var(--f-titre);font-size:14px;font-weight:600;display:flex;align-items:center;gap:7px;flex-wrap:wrap}
.mgh span.sub{font-size:11.5px;color:var(--muet);display:block;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.mgmsgs{flex:1;overflow:auto;padding:0 20px 10px;display:flex;flex-direction:column}
/* v14.166 · le fil « bulles douces » : groupes, jour collant, nouveaux messages */
.mgbox{grid-template-rows:minmax(0,1fr)}
.mgjour{display:flex;flex-direction:column}
.mgday{position:sticky;top:0;z-index:3;align-self:center;margin:10px 0 6px;font-size:11px;font-weight:600;color:var(--muet);background:var(--carte);border:1px solid var(--ligne);border-radius:20px;padding:2px 11px;box-shadow:0 1px 3px rgba(0,0,0,.04)}
.mgnouv{display:flex;align-items:center;gap:10px;margin:12px 0 4px;font-size:11px;font-weight:700;color:var(--terra);text-transform:uppercase;letter-spacing:.05em}
.mgnouv:before,.mgnouv:after{content:'';flex:1;height:1px;background:var(--terra);opacity:.45}
.mgg{display:flex;gap:9px;margin-top:12px}
.mgg.me{flex-direction:row-reverse}
.mgga{width:30px;flex:none;display:flex;align-items:flex-end;padding-bottom:18px}
.mgbox .mgga .av-m{width:30px;height:30px;font-size:11px}
.mgg.me .mgga,.mgg.dir .mgga{display:none}
.mggc{display:flex;flex-direction:column;gap:2px;min-width:0;max-width:min(620px,80%)}
.mgg.me .mggc{align-items:flex-end}
.mggh{display:flex;gap:6px;align-items:baseline;font-size:12px;margin:0 0 2px 2px}
.mggh b{font-weight:600;color:var(--encre)}.mggh em{font-style:normal;color:var(--muet);font-size:11px}.mggh em.mgparti{font-style:italic}
.mggf{font-size:11px;color:var(--muet);display:flex;gap:4px;align-items:center;margin:2px 2px 0;flex-wrap:wrap}
.mgg.me .mggf{justify-content:flex-end}
.mggf .mgreads{margin:0;padding:0 2px}
.mgm{position:relative;display:flex;flex-direction:column;max-width:100%}
.mgg.me .mgm{align-items:flex-end}
.mgb{background:var(--carte);border:1px solid var(--ligne);border-radius:16px;padding:7px 12px;font-size:13px;line-height:1.5;position:relative;overflow-wrap:anywhere;max-width:100%}
.mgb p{margin:0}.mgb ul{margin:2px 0;padding-left:18px}.mgb strong{font-weight:700}
.mgb a{color:var(--terra-h);text-decoration:underline;text-underline-offset:2px}
.mgg:not(.me) .mgm:not(.pr) .mgb{border-top-left-radius:6px}
.mgg:not(.me) .mgm:not(.de) .mgb{border-bottom-left-radius:6px}
.mgg.me .mgb{background:var(--terra-pale);border-color:#F3C7B8}
.mgg.me .mgm:not(.pr) .mgb{border-top-right-radius:6px}
.mgg.me .mgm:not(.de) .mgb{border-bottom-right-radius:6px}
.mgm.hl .mgb{box-shadow:0 0 0 3px var(--terra)}
.mgmod{font-size:10.5px;color:var(--muet);font-style:italic;margin-left:6px}
.mgg:not(.me) .mgacts{left:0}.mgg.me .mgacts{right:0}
.mgm:hover > .mgacts{display:flex}
.mgbas{position:absolute;left:50%;transform:translateX(-50%);bottom:120px;z-index:8;display:flex;gap:6px;align-items:center;background:var(--carte);border:1px solid var(--ligne);border-radius:20px;box-shadow:var(--ombre-2);padding:5px 12px 5px 8px;font:600 12px var(--f-ui);color:var(--encre);cursor:pointer}
.mgbas .ico{width:15px;height:15px;color:var(--terra)}
.mglight{position:fixed;inset:0;z-index:300;background:rgba(20,16,12,.84);display:grid;place-items:center;cursor:zoom-out;padding:24px}
.mglight img{max-width:100%;max-height:100%;border-radius:10px;box-shadow:0 10px 40px rgba(0,0,0,.4)}
/* la grande zone d'écriture */
.mgebox{border:1px solid var(--ligne-2);border-radius:12px;background:var(--carte);display:flex;flex-direction:column;gap:6px;padding:8px 8px 6px 12px;transition:border-color .15s,box-shadow .15s}
.mgebox:focus-within{border-color:var(--terra);box-shadow:0 0 0 3px var(--terra-pale)}
.mgta{width:100%;resize:none;border:0;outline:0;background:none;font:400 13px/1.5 var(--f-ui);color:var(--encre);padding:2px 0 0;min-height:66px;max-height:230px}
.mgetb{display:flex;align-items:center;gap:4px}
.mgetb .btn.sm.ghost{padding:0 8px}
.mghint{font-size:10.5px;color:var(--muet);margin-right:4px}
.mgemo.mgemop{display:grid;grid-template-columns:repeat(8,32px)}
.mgemo.mgemop button{width:32px;height:32px;font-size:18px}
/* l'écran des signalements garde sa présentation en bulles simples */
.mgsgc .mgm{flex-direction:row;gap:8px;margin-top:10px}
.mgsgc .avs{width:26px;flex:none}
.mgsgc .col{display:flex;flex-direction:column;min-width:0}
.mgsgc .who{font-size:11.5px;font-weight:600;margin:0 0 2px 10px}
.mgsgc .who em{font-style:normal;font-weight:400;color:var(--muet);margin-left:5px}

.mgsys{align-self:center;font-size:11.5px;color:var(--muet);text-align:center;max-width:460px;margin:6px 0;display:flex;gap:6px;align-items:center}
.mgsys .ico{width:13px;height:13px;flex:none}
.mgb.del{font-style:italic;color:var(--muet)}
.mgq{display:block;text-align:left;border:0;border-left:3px solid var(--terra);background:rgba(120,90,60,.08);border-radius:6px;padding:4px 8px;margin:1px 0 5px;font:400 12px var(--f-ui);color:var(--muet);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:100%;cursor:pointer}
.mgq b{display:block;color:var(--encre);font-size:11.5px}
.mgph{display:block;border-radius:10px;max-width:320px;overflow:hidden;margin:2px 0 4px;background:var(--surface-2);border:0;padding:0;cursor:zoom-in}
.mgph img{display:block;width:100%;height:auto;max-height:320px;object-fit:cover}
.mgfic{display:flex;gap:10px;align-items:center;border:1px solid var(--ligne);background:var(--surface-2);border-radius:9px;padding:8px 10px;min-width:200px;max-width:100%;text-align:left;text-decoration:none;color:var(--encre);margin:2px 0 4px}
.mgfic .fi{width:32px;height:38px;border-radius:5px;background:var(--rouge-pale);color:var(--rouge);display:grid;place-items:center;font-size:9.5px;font-weight:700;flex:none}
.mgfic .fn{display:block;font-weight:600;font-size:12.5px}
.mgfic .fs{display:block;font-size:11px;color:var(--muet)}
.mgrcs{display:flex;gap:4px;flex-wrap:wrap;margin-top:-6px;padding:0 8px;position:relative;z-index:1}
.mgrc{background:var(--carte);border:1px solid var(--ligne);border-radius:12px;padding:0 7px;font-size:12px;line-height:21px;display:inline-flex;gap:4px;align-items:center;cursor:pointer;font-family:var(--f-ui)}
.mgrc b{font-weight:600;font-size:11px;color:var(--muet)}
.mgrc.mine{border-color:var(--terra);background:var(--terra-pale)}
.mgreads{font-size:11px;color:var(--muet);margin-top:3px;display:inline-flex;align-items:center;gap:5px;padding:1px 4px;border-radius:5px;border:0;background:none;cursor:pointer;font-family:var(--f-ui)}
button.mgreads:hover{background:var(--carte);color:var(--encre)}
.mgreads .stk{display:inline-flex}
.mgreads .stk .av-m{margin-left:-5px;border:1.5px solid var(--surface-2)}
.mgacts{position:absolute;top:-14px;display:none;background:var(--carte);border:1px solid var(--ligne);border-radius:9px;box-shadow:var(--ombre-2);padding:2px;gap:1px;z-index:5}
.mgacts button{width:28px;height:26px;border-radius:6px;display:grid;place-items:center;color:var(--muet);border:0;background:none;cursor:pointer}
.mgacts button:hover{background:var(--surface-2);color:var(--encre)}
.mgacts .ico{width:15px;height:15px}
.mgpop{position:fixed;z-index:120;background:var(--carte);border:1px solid var(--ligne);border-radius:11px;box-shadow:var(--ombre-2);padding:6px}
.mgpop .mgpt{font-size:10.5px;letter-spacing:.07em;text-transform:uppercase;color:var(--muet);margin:2px 4px 6px;font-weight:600}
.mgemo{display:flex;gap:2px}
.mgemo button{font-size:19px;width:34px;height:34px;border-radius:8px;border:0;background:none;cursor:pointer}
.mgemo button:hover{background:var(--surface-2);transform:scale(1.12)}
.mgmenu{min-width:190px;display:flex;flex-direction:column}
.mgmenu button{display:flex;gap:9px;align-items:center;padding:7px 9px;border-radius:7px;text-align:left;font:400 12.5px var(--f-ui);color:var(--encre);border:0;background:none;cursor:pointer}
.mgmenu button:hover{background:var(--surface-2)}
.mgmenu button.dng{color:var(--rouge)}
.mgmenu .ico{width:14px;height:14px}
.mgcomp{border-top:1px solid var(--ligne);background:var(--carte);padding:10px 14px 10px;display:flex;flex-direction:column;gap:7px}
.mgrbar{display:flex;align-items:center;gap:8px;background:var(--surface-2);border-left:3px solid var(--terra);border-radius:6px;padding:5px 8px;font-size:12px}
.mgrbar .x{flex:1;min-width:0;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;color:var(--muet)}
.mgrbar b{color:var(--encre)}
.mgpend{display:flex;gap:6px;flex-wrap:wrap}
.mgpf{display:flex;gap:7px;align-items:center;border:1px solid var(--ligne);border-radius:8px;padding:4px 6px 4px 4px;font-size:11.5px;max-width:260px;background:var(--surface-2)}
.mgpf .th{width:32px;height:32px;border-radius:6px;background:var(--carte);display:grid;place-items:center;overflow:hidden;flex:none;border:1px solid var(--ligne)}
.mgpf .th img{width:100%;height:100%;object-fit:cover}
.mgpf .nm{min-width:0}.mgpf .nm div{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;font-weight:600}
.mgpf .st{font-size:10.5px;color:var(--muet)}.mgpf .st.ok{color:var(--vert)}
.mgsec{display:flex;align-items:center;gap:6px;font-size:10.5px;color:var(--muet)}
.mgsec .ico{width:12px;height:12px}
.mgdet{border-left:1px solid var(--ligne);overflow:auto;background:var(--carte);padding:16px 14px;display:flex;flex-direction:column;gap:16px}
.mgdet h3{font-size:10.5px;letter-spacing:.07em;text-transform:uppercase;color:var(--muet);margin:0 0 7px;font-weight:600}
.mgdet .hd{display:flex;flex-direction:column;align-items:center;text-align:center;gap:6px}
.mgdet .hd .av-m{width:56px;height:56px;font-size:18px}
.mgdet .hd .n{font-family:var(--f-titre);font-weight:600;font-size:15px}
.mgmem .r{display:flex;gap:8px;align-items:center;padding:4px 2px;font-size:12.5px}
.mgmem .r .b{flex:1;min-width:0}.mgmem .r .b div:last-child{font-size:11px;color:var(--muet)}
.mgkv{display:flex;flex-direction:column;gap:6px;font-size:12px}
.mgkv div{display:flex;gap:8px;align-items:flex-start;color:var(--muet)}
.mgkv .ico{width:14px;height:14px;margin-top:2px;flex:none}
.mgaud{display:flex;flex-wrap:wrap;gap:6px}
.mgcb{display:inline-flex;align-items:center;gap:6px;background:var(--surface-2);border:1px solid var(--ligne);border-radius:20px;padding:3px 5px 3px 10px;font-size:12px}
.mgcb small{color:var(--muet);font-size:11px}
.mgcb button{width:18px;height:18px;border-radius:50%;display:grid;place-items:center;color:var(--muet);border:0;background:none;cursor:pointer}
.mgcb button:hover{background:var(--ligne)}.mgcb .ico{width:11px;height:11px}
.mgsgt{font-size:10.5px;font-weight:700;letter-spacing:.06em;text-transform:uppercase;color:var(--muet);padding:8px 14px 3px;background:var(--surface-2);position:sticky;top:0;display:flex;align-items:center;gap:6px;z-index:1}
.mgsgt .lk{font-size:10.5px;margin-left:auto;text-transform:none;letter-spacing:0}
/* v14.165 · le « + » dans la recherche, la fenêtre, gérer, sondage, hors service, signaler */
.mgl .rech2.mgsrc{padding-right:4px}
.mgcp{width:26px;height:26px;border-radius:7px;background:var(--terra);color:#fff;border:0;display:grid;place-items:center;cursor:pointer;flex:none}
.mgcp:hover{background:var(--terra-h)}
.mgl .rech2 .mgcp .ico{width:14px;height:14px}
.mgcv .l1 b .ico{width:12px;height:12px;color:var(--muet);vertical-align:-1px;margin-left:4px}
.av-m.mgparti{filter:grayscale(1);opacity:.7}
.mgfac{font-weight:400;color:var(--muet);margin-left:auto}
.modal-box.mgwin{width:min(840px,96vw);height:min(640px,92vh);display:flex;flex-direction:column;overflow:hidden}
.mgwb{display:grid;grid-template-columns:minmax(0,1fr) 290px;flex:1;min-height:0}
.mgwl{border-right:1px solid var(--ligne);display:flex;flex-direction:column;min-width:0;min-height:0}
.mgwl .tabs{margin:12px 14px 0;flex:none}
.mgwl .rech2{margin:10px 14px 0;display:flex;align-items:center;gap:7px;border:1px solid var(--ligne);border-radius:9px;padding:6px 10px;background:var(--surface-2);color:var(--muet)}
.mgwl .rech2 input{border:0;background:none;outline:none;flex:1;min-width:0;font:400 12.5px var(--f-ui);color:var(--encre)}
.mgwl .rech2 .ico{width:15px;height:15px;flex:none}
.mgpl{flex:1;overflow:auto;margin-top:8px}
.mgpick{display:flex;align-items:center;gap:10px;padding:7px 14px;cursor:pointer;border-bottom:1px solid var(--ligne)}
.mgpick:hover{background:var(--surface-2)}
.mgpick.on{background:var(--terra-pale)}
.mgpick.dis{cursor:default;opacity:.55}
.mgpick .chk{pointer-events:none}
.mgpick .b{flex:1;min-width:0}.mgpick .b b{display:block;font-size:12.5px;font-weight:600;color:var(--encre)}.mgpick .b small{display:block;font-size:11px;color:var(--muet)}
.mgpick .av-m.sm,.mgwin .av-m.sm{width:26px;height:26px;font-size:10px}
.mgpick .av-m.sq{border-radius:9px}.mgpick .av-m.sq .ico{width:15px;height:15px;stroke:#fff;color:#fff}
.mgwr{padding:14px 16px;display:flex;flex-direction:column;gap:12px;overflow:auto;background:var(--surface-2)}
.mgwr h3{font-size:10.5px;letter-spacing:.07em;text-transform:uppercase;color:var(--muet);margin:0 0 6px;font-weight:600}
.mgcnt{font-size:22px;font-weight:700;font-variant-numeric:tabular-nums;line-height:1.1}
.mgcnt small{font-size:12px;font-weight:500;color:var(--muet);display:block}
.mgwarn{display:flex;gap:7px;align-items:flex-start;font-size:12px;color:var(--bleu);background:var(--bleu-pale);border-radius:9px;padding:8px 10px}
.mgwarn .ico{width:14px;height:14px;margin-top:2px;flex:none}
.mgwin .cfoot{align-items:center}
.mgflag{font-size:10.5px;color:var(--muet);display:inline-flex;gap:4px;align-items:center;margin-top:2px}
.mgflag .ico{width:12px;height:12px}
.mgflag.sig{color:var(--rouge)}
.mgpoll{white-space:normal;display:flex;flex-direction:column;gap:5px;margin-top:2px;min-width:260px}
.mgpoll .fhelp{margin:0}
.mgpq{font-weight:600;display:flex;gap:6px;align-items:center}
.mgpq .ico{width:14px;height:14px;color:var(--terra)}
.mgpo{position:relative;border:1px solid var(--ligne);border-radius:8px;padding:6px 9px;text-align:left;overflow:hidden;display:flex;justify-content:space-between;gap:8px;font:400 12.5px var(--f-ui);background:var(--carte);cursor:pointer;color:var(--encre)}
.mgpo i{position:absolute;inset:0 auto 0 0;background:var(--terra-pale);z-index:0;transition:width .25s}
.mgpo span,.mgpo b{position:relative}.mgpo.mine{border-color:var(--terra)}.mgpo b{font-weight:600;color:var(--muet)}
.mgoff{display:flex;gap:7px;align-items:center;font-size:12px;color:var(--bleu);background:var(--bleu-pale);border-radius:8px;padding:6px 10px}
.mgoff .ico{width:14px;height:14px;flex:none}
.mgfil{position:relative}
.mgdrop{position:absolute;inset:8px;border:2px dashed var(--terra);border-radius:12px;background:rgba(255,245,240,.92);display:grid;place-items:center;z-index:40;font-weight:600;color:var(--terra-h);pointer-events:none;text-align:center}
.mgdrop .ico{width:26px;height:26px;display:block;margin:0 auto 6px}
.mgdet .hd .n{display:flex;gap:6px;align-items:center;justify-content:center}
.mgdet .hd .n .btn{padding:0 6px}
.mgren{display:flex;gap:6px;width:100%}
.mgren .fi{padding:5px 9px;font-size:12.5px}
.mgmemh{display:flex;align-items:center;gap:6px}
.mgmemh span{flex:1}
.mgmem .r .mgrm{opacity:0;padding:0 6px}
.mgmem .r:hover .mgrm,.mgmem .r .mgrm:focus{opacity:1}
.mgmem .r.parti{opacity:.6}
.mgmem .r .pw{font-size:10px;color:var(--muet);font-weight:600}
.mgmute .fi{width:100%}
.mgrule{background:var(--bleu-pale);color:var(--bleu);border-radius:9px;padding:8px 10px;font-size:12px;display:flex;flex-direction:column;gap:3px}
.mgrule b{color:var(--encre)}
.lk.mgquit{color:var(--rouge);display:inline-flex;gap:5px;align-items:center;background:none;border:0;padding:0}
.lk.mgquit .ico{width:14px;height:14px}
.mgpopt{display:flex;gap:6px;margin-bottom:6px}
.nnd{color:var(--muet);font-size:13px}
.mgsgk{margin-bottom:4px}
.mgsgc{background:var(--surface-2);border-radius:10px;padding:4px 12px 12px;margin:12px 0 8px}
.mgsgc .av-m.sm{width:26px;height:26px;font-size:10px}
.mgsgc .mgm.hl .mgb{box-shadow:0 0 0 2px var(--rouge)}
@media (max-width:760px){.mgwb{grid-template-columns:1fr;grid-template-rows:minmax(0,1fr) auto}.mgwl{border-right:0;border-bottom:1px solid var(--ligne)}.mgwr{max-height:38vh}}
.mgtoast{position:fixed;left:50%;bottom:22px;transform:translateX(-50%);background:var(--encre);color:#fff;padding:9px 14px;border-radius:9px;font-size:12.5px;z-index:960;box-shadow:0 10px 30px rgba(0,0,0,.2)}
@media (max-width:1100px){.mgbox{grid-template-columns:260px minmax(0,1fr)}.mgdet{display:none}}

/* ═══ MESSAGERIE, v14.168 ═══════════════════════════════════════
   Les lus en têtes, les messages de membres avec leur tête, qui écrit,
   l'épingle, « écrit… », plus tard, confirmer, @mentions, aperçus,
   mosaïques, chercher, sondages à clôture, les réglages. */
.mgbrl{color:var(--rouge);font-weight:600}
.mgnb{display:flex;gap:8px;align-items:center;margin:0 10px 8px;padding:8px 10px;border:1px solid var(--ligne);background:var(--surface-2);border-radius:10px;font-size:11.5px;color:var(--muet)}
.mgnb>.ico{width:16px;height:16px;color:var(--terra);flex:none}
.mgnb b{display:block;color:var(--encre);font-size:12px}
.mgnb .btn.sm.ghost{padding:0 6px}
.mgsys .av-m.xs{width:18px;height:18px;font-size:7.5px;flex:none}
.mgsys span{min-width:0}
.mgheads{display:inline-flex;align-items:center;gap:0}
.mgheads .av-m.xs{width:16px;height:16px;font-size:6.5px;margin-left:-3px;border:1.5px solid var(--carte)}
.mgheads .av-m.xs:first-child{margin-left:0}
.mgheads .plus{font-size:10.5px;color:var(--muet);margin-left:4px;font-weight:600}
.mgreads.mgheads{gap:0;padding:1px 2px}
.mgvus{font-weight:600}
.mgpin{display:flex;align-items:center;gap:4px;padding:6px 12px;border-bottom:1px solid var(--ligne);background:var(--surface-2)}
.mgpinb{flex:1;min-width:0;display:flex;gap:7px;align-items:center;border:0;background:none;text-align:left;cursor:pointer;font:400 12px var(--f-ui);color:var(--encre-2);padding:0}
.mgpinb .ico{width:14px;height:14px;color:var(--terra);flex:none}
.mgpinb b{color:var(--encre);font-weight:600;flex:none}
.mgpinb span{min-width:0;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.mgpin .btn.sm.ghost{padding:0 6px}
.mgsch{display:flex;align-items:center;gap:4px;padding:6px 12px;border-bottom:1px solid var(--ligne)}
.mgsch>.ico{width:15px;height:15px;color:var(--muet);flex:none}
.mgsch input{flex:1;border:0;outline:0;background:none;font:400 13px var(--f-ui);color:var(--encre);padding:4px 4px}
.mgchn{font-size:11.5px;color:var(--muet);white-space:nowrap}
.mgsch .btn.sm.ghost{padding:0 6px}
mark.mghit{background:#FBE7A6;color:inherit;border-radius:3px;padding:0 1px}
mark.mghit.on{background:#F2B544}
.mgtyping{display:flex;align-items:center;gap:6px;font-size:11.5px;color:var(--muet);margin:10px 0 2px 2px}
.mgtyping .av-m.xs{width:18px;height:18px;font-size:7.5px;margin-left:-4px;border:1.5px solid var(--carte)}
.mgtyping .av-m.xs:first-child{margin-left:0}
.mgdots{display:inline-flex;gap:3px;align-items:center;background:var(--carte);border:1px solid var(--ligne);border-radius:10px;padding:5px 7px}
.mgdots i{width:5px;height:5px;border-radius:50%;background:var(--muet);animation:mgdot 1.2s infinite}
.mgdots i:nth-child(2){animation-delay:.2s}.mgdots i:nth-child(3){animation-delay:.4s}
@keyframes mgdot{0%,60%,100%{opacity:.25}30%{opacity:1}}
.mgprog{display:flex;gap:10px;align-items:flex-start;align-self:flex-end;max-width:min(560px,85%);margin-top:12px;border:1px dashed var(--ligne-2);border-radius:14px;padding:8px 10px;background:var(--surface-2);font-size:12px;flex-wrap:wrap}
.mgprog>.ico{width:16px;height:16px;color:var(--terra);flex:none;margin-top:2px}
.mgprog .fx1{min-width:180px}
.mgprog .mgb{background:none;border:0;padding:2px 0 0}
.mgplt{font-size:11px;font-weight:600;color:var(--terra-h)}
.mgprog .lk{font-size:11.5px}
.mgmos{display:grid;gap:4px;padding:4px;max-width:360px}
.mgmos.n2{grid-template-columns:1fr 1fr}.mgmos.n3,.mgmos.n4{grid-template-columns:1fr 1fr}
.mgmos .mgph{margin:0;max-width:none}
.mgmos .mgph img{height:140px;max-height:none}
.mgmos.n3 .mgph:first-child{grid-column:1 / -1}
.mgpfin{display:flex;gap:5px;align-items:center;font-size:11.5px;color:var(--encre-2);margin:-1px 0 2px}
.mgpfin .ico{width:13px;height:13px;color:var(--muet)}
.mgpo .fx1{position:relative}
.mgpoh{position:relative;display:inline-flex}
.mgpoh .av-m.xs{width:16px;height:16px;font-size:6.5px;margin-left:-3px;border:1.5px solid var(--carte)}
.mgpoh .av-m.xs:first-child{margin-left:0}
.mgclos .mgpo{cursor:default;color:var(--encre-2)}
.mgclos .mgpo i{background:var(--surface-2)}
.mgclos .mgpo.gagne i{background:var(--terra-pale)}
.mgclos .mgpo.gagne .fx1{font-weight:700;color:var(--encre)}
.mgpied{display:flex;gap:8px;align-items:center;flex-wrap:wrap}
.mgpied .lk{font-size:11px;margin-left:auto}
.mgconf{display:flex;gap:6px;align-items:center;margin-top:6px;font-size:11.5px;color:var(--muet)}
.mgconf>.ico{width:14px;height:14px;color:var(--terra)}
.mgconf .mgreads{margin:0;padding:0;font-weight:600;color:var(--encre-2)}
.mgat{color:var(--terra-h);font-weight:600}
.mgap{display:flex;flex-direction:column;gap:1px;margin:6px 0 2px;padding:6px 9px;border-left:3px solid var(--bleu);background:rgba(61,110,143,.07);border-radius:6px;text-decoration:none!important;color:var(--encre);max-width:420px}
.mgap b{font-size:12.5px}.mgap span{font-size:11.5px;color:var(--encre-2)}.mgap small{font-size:10.5px;color:var(--muet)}
.mgro{display:flex;gap:10px;align-items:center;border:1px dashed var(--ligne-2);border-radius:12px;padding:12px 14px;font-size:12.5px;color:var(--encre-2);background:var(--surface-2)}
.mgro>.ico{width:18px;height:18px;color:var(--muet);flex:none}
.mgro b{color:var(--encre)}
.mgetb .btn.sm.ghost.mgconfb{background:var(--terra-pale);color:var(--terra-h)}
.mgtag{font-size:10px;font-weight:600;border-radius:9px;padding:1px 7px;white-space:nowrap;flex:none}
.mgtag.g{background:var(--terra-pale);color:var(--terra-h)}
.mgtag.ro{background:var(--surface-2);color:var(--encre-2);border:1px solid var(--ligne)}
.mgmenu button.on{font-weight:600}
.mgmenu button small{display:block;font-weight:400;font-size:11px;color:var(--muet)}
.mgmenu hr{border:0;border-top:1px solid var(--ligne);margin:4px 0;width:100%}
.mgrd{width:14px;height:14px;border-radius:50%;border:2px solid var(--ligne-2);flex:none;align-self:flex-start;margin-top:2px}
.mgmenu button.on .mgrd{border:4px solid var(--terra)}
.mgmenu .mgpt{margin:4px 8px 4px}
.mgqui .segr{display:flex}.mgqui .segr label{flex:1;justify-content:center}
.mgsuit .sw .swl{font-size:11.5px;line-height:1.35}
.mgptc{display:flex;gap:6px;align-items:center;padding:6px 8px 2px;border-top:1px solid var(--ligne);margin-top:4px}
.mgptc .fi{flex:1;min-width:0}
.mgmen .mgmenu button.on{background:var(--surface-2)}
.mgmen .av-m.xs{width:20px;height:20px;font-size:8px}
.mgpdt{display:flex;gap:8px;margin-top:8px}.mgpdt .fi{max-width:170px}
.mgwarnt{color:var(--rouge)}
.pbrow{display:flex;gap:10px;align-items:center}
/* v14.169 : la liste vide, au milieu, comme le kit. */
.mgl .lst.mglvide{display:flex;align-items:center;justify-content:center}
.mgvide{display:flex;flex-direction:column;align-items:center;max-width:250px}
.mgvide b{color:var(--encre);font-size:13.5px;font-weight:600}
.mgvsub{font-size:12px;margin-top:3px}
.mgvide .btn .ico{width:14px;height:14px}
/* v14.170 : une photo du fil a sa hauteur avant d'arriver. */
.mgph{width:260px;max-width:100%}
.mgph img{height:220px;max-height:none}
.mgmos .mgph{width:auto}
.mgmos .mgph img{height:140px}

/* ── v14.171 · la messagerie ──
   Une bulle reçue a la largeur de son texte, comme une bulle envoyée :
   la colonne ne l'étire plus sur la largeur du nom ou du pied. */
.mggc{align-items:flex-start}
.mgm{align-items:flex-start}
.mgg.me .mggc,.mgg.me .mgm{align-items:flex-end}
.mgmos{width:min(360px,100%)}
/* Une photo que le serveur refuse : la raison, à sa place. */
.mgko{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:3px;min-height:140px;padding:14px;color:var(--muet);font-size:12px;text-align:center;border:1px dashed var(--ligne);border-radius:10px;cursor:default}
.mgko b{font-weight:600;color:var(--encre-2)}
.mgko small{font-size:11px;overflow-wrap:anywhere}
.mgko .lk{font-size:11.5px;margin-top:2px}
/* Un message qui arrive, sur les autres pages. */
.mgalerte{position:fixed;top:14px;right:18px;z-index:950;display:flex;align-items:center;gap:6px;width:min(360px,calc(100vw - 32px));background:var(--carte);border:1px solid var(--ligne);border-radius:14px;box-shadow:var(--ombre-2);padding:10px 8px 10px 12px}
.mgalerte[hidden]{display:none}
.mgalerte.on{animation:mgalIn .25s ease-out}
@keyframes mgalIn{from{opacity:0;transform:translateY(-8px)}}
.mgalerte > a{display:flex;align-items:center;gap:10px;min-width:0;flex:1;color:inherit;text-decoration:none}
.mgalerte .av-m{width:34px;height:34px;flex:none;font-size:12px;position:relative}
.mgalt{display:flex;flex-direction:column;min-width:0;font-size:12.5px;line-height:1.35}
.mgalt b{font-weight:600;color:var(--encre);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.mgalt span{color:var(--encre-2);display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}
.mgalerte .mclose{flex:none;width:26px;height:26px;align-self:flex-start}

/* ── v14.174 · la messagerie, les outils ── */
/* La liste à cocher */
.mgck{white-space:normal;display:flex;flex-direction:column;gap:5px;margin-top:2px;min-width:300px}
.mgckq{font-weight:600;display:flex;gap:6px;align-items:center}.mgckq .ico{width:15px;height:15px;color:var(--terra)}
.mgcki{display:flex;gap:9px;align-items:center;border:1px solid var(--ligne);border-radius:9px;padding:6px 9px;font:400 12.5px var(--f-ui);cursor:pointer;background:var(--carte);color:var(--encre);text-align:left}
.mgcki:hover{border-color:var(--ligne-2)}.mgcki:disabled{opacity:.6}
.mgcki .bx{width:17px;height:17px;border-radius:5px;border:1.5px solid var(--ligne-2);display:grid;place-items:center;flex:none;font-style:normal}
.mgcki.on .bx{background:var(--terra);border-color:var(--terra);color:#fff}.mgcki .bx .ico{width:12px;height:12px;stroke-width:2.6}
.mgcki.on .fx1{color:var(--muet);text-decoration:line-through}
.mgcki small{display:inline-flex;gap:5px;align-items:center;font-size:11px;color:var(--muet);white-space:nowrap}
.mgckp{display:flex;gap:8px;align-items:center;margin:0!important}.mgckp .lk{margin-left:auto;font-size:11px}
.mgckad{display:flex;gap:6px}.mgckad .fi{flex:1}
/* Enregistré, rappel : sous le message, pour soi */
.mgmarq{display:flex;gap:8px;margin-top:3px;font-size:10.5px;color:var(--muet)}
.mgmarq span,.mgmarq button{display:inline-flex;gap:4px;align-items:center;border:0;background:none;padding:0;font:inherit;color:inherit}
.mgmarq button{color:var(--terra-h);cursor:pointer}.mgmarq .ico{width:12px;height:12px}
.mgg.me .mgmarq{justify-content:flex-end}
/* Bon retour */
.mgret{margin:10px 12px 0;border:1px solid #F3C7B8;background:var(--terra-pale);border-radius:12px;padding:10px 12px;display:flex;flex-direction:column;gap:5px;font-size:12px;color:var(--encre-2)}
.mgret .hd{display:flex;gap:7px;align-items:center}.mgret .hd .ico{width:16px;height:16px;color:var(--terra)}.mgret .hd b{flex:1;font-size:13px;color:var(--encre)}
.mgret button[data-rgo]{display:flex;gap:8px;align-items:center;border:0;background:var(--carte);border-radius:8px;padding:6px 8px;font:500 12px var(--f-ui);color:var(--encre);cursor:pointer;text-align:left}
.mgret button[data-rgo] .ico{width:14px;height:14px;color:var(--terra)}.mgret button[data-rgo] .ico:last-child{color:var(--muet);transform:rotate(-90deg)}
.mgret small{color:var(--muet);font-size:11px}
/* Enregistrés */
.spf button.mgenrf{display:inline-flex;gap:4px;align-items:center}.spf button.mgenrf .ico{width:12px;height:12px}
.mgenrh{background:var(--terra)!important;color:#fff}
.mgenr{padding:14px 18px!important;gap:8px;display:flex;flex-direction:column}
.mgenr h3{display:flex;gap:7px;align-items:center;font-size:11px;letter-spacing:.07em;text-transform:uppercase;color:var(--muet);margin:6px 0 2px;font-weight:600}.mgenr h3 .ico{width:14px;height:14px}
.mgenrr{display:flex;gap:12px;align-items:center;border:1px solid var(--ligne);border-radius:11px;padding:9px 12px;background:var(--carte);font-size:12.5px}
.mgenrr .q{font-weight:700;color:var(--terra-h);font-size:12px;min-width:110px}.mgenrr .fx1 b{display:block;font-weight:600}.mgenrr .fx1 span{font-size:11.5px;color:var(--muet)}
.mgenrm{display:flex;gap:10px;align-items:flex-start;border:1px solid var(--ligne);border-radius:11px;padding:10px 12px;background:var(--carte);cursor:pointer}
.mgenrm:hover{border-color:var(--ligne-2)}
.mgenrm .a{font-size:11.5px;color:var(--muet)}.mgenrm .a b{color:var(--encre)}.mgenrm p{margin:3px 0 0;font-size:13px;white-space:pre-wrap}
/* La galerie */
.mggal{display:grid;grid-template-columns:repeat(3,1fr);gap:4px}
.mggi{aspect-ratio:1;border-radius:8px;border:0;padding:0;overflow:hidden;background:var(--surface-2);cursor:zoom-in;display:grid;place-items:center}
.mggi img{width:100%;height:100%;object-fit:cover;display:block}
.mggi.vid{background:linear-gradient(135deg,#6f8fa6,#2f4a5c);color:#fff;cursor:pointer}.mggi.vid .ico{width:18px;height:18px;fill:#fff}
.mggd{display:flex;gap:8px;align-items:center;border:1px solid var(--ligne);border-radius:9px;padding:7px 9px;font:400 12px var(--f-ui);margin-top:6px;background:var(--carte);color:var(--encre);text-decoration:none;width:100%;cursor:pointer;text-align:left}
.mggd .ico{width:15px;height:15px;color:var(--terra)}.mggd .fx1{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.mggd small{color:var(--muet)}
/* Réponses rapides */
/* Le suivi d'un « À confirmer » */
.mgsvm{display:flex;gap:10px;align-items:flex-start;background:var(--surface-2);border-radius:11px;padding:10px 12px;margin:0 0 12px;font-size:12.5px}
.mgsvm .ico{width:16px;height:16px;color:var(--terra);flex:none;margin-top:2px}.mgsvm b{display:block;font-weight:600}.mgsvm span{font-size:11.5px;color:var(--muet)}
.mgsvk{display:grid;grid-template-columns:repeat(3,1fr);gap:8px;margin:0 0 12px}.mgsvk div{background:var(--surface-2);border-radius:10px;padding:8px 10px}
.mgsvk b{display:block;font-size:20px;color:var(--encre)}.mgsvk span{font-size:11px;color:var(--muet)}
#mgsv .spf{margin:0 0 6px;border-radius:10px}
.mgsvl .r{display:flex;gap:9px;align-items:center;padding:7px 2px;border-top:1px solid var(--ligne);font-size:12.5px}
.mgsvl .r .b{flex:1;min-width:0}.mgsvl .r .b div:last-child{font-size:11px;color:var(--muet)}
.mgsvl .r .q{font-size:11.5px;font-weight:600;color:var(--rouge)}.mgsvl .r.confirme .q{color:var(--vert)}.mgsvl .r.absent .q{color:#B07A1A}
.mgsvl .r .w{font-size:11px;color:var(--muet);width:140px;text-align:right}
/* v14.175 : le courriel de rattrapage, « après 2 h », dans la colonne Courriel. */
.ncan .ncour{width:auto;min-width:0;max-width:100%;font-size:11.5px;padding:3px 22px 3px 8px}

/* ── v14.175 · la messagerie et le planning ── */
/* Qui est en service */
.mgst{display:inline-flex;align-items:center;gap:4px;white-space:nowrap}.mgst i{width:7px;height:7px;border-radius:50%;background:var(--ligne-2);flex:none}
.mgst.service{color:var(--vert)}.mgst.service i{background:var(--vert)}.mgst.bientot i{background:#6A8FB0}.mgst.conge i{background:#E0A63A}
.mgh .sub .mgst.service{font-weight:600}
/* La conversation du jour */
.mgjr{font-size:9.5px;font-weight:600;border:1px solid var(--ligne-2);border-radius:8px;padding:0 5px;color:var(--muet);margin:0 auto 0 5px;white-space:nowrap;line-height:15px}
.mgdj{display:flex;gap:10px;align-items:flex-start;cursor:pointer;background:var(--surface-2);border-radius:10px;padding:10px 12px}.mgdj b{display:block;font-size:12.5px}.mgdj small{font-size:11.5px;color:var(--muet);line-height:1.45}
/* Écrire aux présents */
.mgplw{padding:12px 14px;display:flex;flex-direction:column;gap:8px}
.mgplw h3{font-size:10.5px;letter-spacing:.07em;text-transform:uppercase;color:var(--muet);margin:4px 0 0;font-weight:700}
.mgchips{display:flex;gap:6px;flex-wrap:wrap}
.mgchips button{border:1px solid var(--ligne);border-radius:14px;padding:3px 10px;font:500 12px var(--f-ui);background:var(--carte);color:var(--encre-2);cursor:pointer}
.mgchips button.on{border-color:var(--terra);background:var(--terra-pale);color:var(--terra-h);font-weight:600}
.mgplc{display:flex;gap:10px;align-items:center;background:var(--surface-2);border-radius:11px;padding:10px 12px;margin-top:4px}
.mgplc b{display:block;font-size:13px}.mgplc span{font-size:11.5px;color:var(--muet)}
/* L'échange de créneau */
.mgech{display:flex;flex-direction:column;gap:8px;min-width:300px;margin-top:2px;white-space:normal}
.mgechh{display:flex;gap:7px;align-items:center}.mgechh .ico{width:15px;height:15px;color:var(--terra)}
.mgechc{display:flex;gap:10px;align-items:center;border:1px solid var(--ligne);border-radius:10px;padding:8px 10px;background:var(--surface-2)}
.mgechc .j{display:flex;flex-direction:column;align-items:center;line-height:1.1;border-right:1px solid var(--ligne);padding-right:10px;min-width:40px}
.mgechc .j b{font-size:10px;color:var(--terra-h);letter-spacing:.05em}.mgechc .j span{font-size:18px;font-weight:700}.mgechc .j small{font-size:10px;color:var(--muet)}
.mgechc .fx1 b{display:block}.mgechc .fx1 span{font-size:11.5px;color:var(--muet)}
.mgecha{display:flex;gap:8px;align-items:center}
.mgechs{display:flex;gap:6px;align-items:center;font-size:12px;color:var(--encre-2);margin:0!important}.mgechs .ico{width:14px;height:14px}.mgechs.ok{color:var(--vert)}.mgechs .lk{margin-left:auto;font-size:11.5px}
.mgechl{display:flex;flex-direction:column;gap:6px;max-height:280px;overflow:auto;margin:0 0 12px}
.mgechi{display:flex;gap:12px;align-items:center;border:1px solid var(--ligne);border-radius:10px;padding:8px 12px;background:var(--carte);cursor:pointer;text-align:left;font:inherit;color:var(--encre)}
.mgechi.on{border-color:var(--terra);box-shadow:0 0 0 3px var(--terra-pale)}.mgechi.dis{opacity:.55;cursor:default}
.mgechi .j{font-size:12px;color:var(--encre-2);min-width:90px}.mgechi .j b{color:var(--terra-h);margin-right:4px}
.mgechi .fx1 b{display:block;font-size:13px}.mgechi .fx1 small{font-size:11.5px;color:var(--muet)}

/* ── v14.176 · les vocaux, les vidéos courtes ── */
.mgvoc{display:flex;align-items:center;gap:9px;min-width:250px;padding:2px 0}
.mgvpl{width:32px;height:32px;border-radius:50%;border:0;background:var(--terra);color:#fff;display:grid;place-items:center;flex:none;cursor:pointer}
.mgvpl .ico{width:14px;height:14px;fill:#fff;stroke:#fff}
.mgvon{display:flex;align-items:center;gap:2px;flex:1;height:26px;cursor:pointer}
.mgvon i{width:3px;border-radius:2px;background:var(--ligne-2);flex:none}.mgvon i.on{background:var(--terra)}
.mgvd{font-size:11px;color:var(--muet);min-width:28px;font-variant-numeric:tabular-nums}
.mgvit{border:1px solid var(--ligne);background:var(--carte);border-radius:8px;font:600 10.5px var(--f-ui);padding:2px 6px;color:var(--encre-2);cursor:pointer}
.mgvid{width:260px;max-width:100%;height:150px;border-radius:10px;border:0;background:linear-gradient(135deg,#6f8fa6,#2f4a5c);position:relative;display:grid;place-items:center;margin:2px 0 4px;cursor:pointer}
.mgvid .ico{width:42px;height:42px;padding:12px;border-radius:50%;background:rgba(255,255,255,.9);fill:var(--encre);stroke:var(--encre)}
.mgvid span{position:absolute;right:8px;bottom:6px;color:#fff;font-size:11px;font-weight:600;background:rgba(0,0,0,.4);border-radius:6px;padding:0 5px}
.mgvlight{cursor:default}.mgvlight video{max-width:100%;max-height:100%;border-radius:10px;background:#000}
.mgvch{color:#fff;font-size:14px}
.mgebox.mgrec{flex-direction:row;align-items:center;gap:10px;padding:10px 8px 10px 14px}
.mgrec b{color:var(--rouge);font-variant-numeric:tabular-nums;min-width:30px}
.mgrecp{width:9px;height:9px;border-radius:50%;background:var(--rouge);animation:mgrecp 1s infinite}
@keyframes mgrecp{50%{opacity:.25}}

/* ── v14.177 · les vocaux, suite ── */
.mgrlive{flex:1;min-width:0;display:flex;align-items:center;justify-content:flex-end;gap:2px;height:30px;overflow:hidden}
.mgrlive i{width:3px;border-radius:2px;background:var(--terra);flex:none}
.mgrmax{font-size:11px;color:var(--muet)}
.mgraide{font-size:11.5px;color:var(--muet);margin:6px 2px 0}
.mgrecon{flex:1;min-width:0;overflow:hidden}
.mgvoc{position:relative}
.mgvoc.neuf::before{content:"";position:absolute;left:-16px;top:50%;margin-top:-4px;width:8px;height:8px;border-radius:50%;background:var(--bleu,#5A6EA5)}
.mgvon{overflow:hidden}
.mgattv{opacity:.6}
.mgpart{display:flex;align-items:center;gap:6px;justify-content:flex-end;font-size:11.5px;color:var(--muet);margin:5px 4px 0}
.mgpart .lk{font-size:11.5px;font-weight:700}
.mgcd{width:16px;height:16px;flex:none}.mgcd svg{width:16px;height:16px;transform:rotate(-90deg)}
.mgcd circle{fill:none;stroke:var(--ligne-2);stroke-width:2.4}.mgcd circle.a{stroke:var(--terra);stroke-dasharray:50.3;animation:mgcd 3s linear forwards}
@keyframes mgcd{from{stroke-dashoffset:0}to{stroke-dashoffset:50.3}}
.mgacts button.dng{color:var(--rouge)}.mgacts button.dng:hover{background:var(--rouge-pale);color:var(--rouge)}

/* ── v14.177 · les réglages de la messagerie ── */

/* ── v14.178 · établissements et équipes en un arbre ── */
.mgtog{margin-left:auto;border:0;background:none;width:30px;height:30px;border-radius:8px;display:grid;place-items:center;color:var(--muet);cursor:pointer;flex:none}
.mgtog:hover{background:var(--carte)}.mgtog .ico{width:15px;height:15px;transform:rotate(-90deg);transition:transform .15s}.mgtog.ouv .ico{transform:none}
.mgsous{border-left:2px solid var(--ligne);margin-left:23px}
.mgsous .mgpick{padding-left:12px}
.mgsans{font-size:11px;color:var(--muet);padding:6px 14px 9px}
.mgpick .chk.mgmi .bx{background:linear-gradient(#fff,#fff) center/9px 2px no-repeat,var(--vert);border-color:var(--vert)}
.mgpick .chk.mgmi .bx::after{display:none}

/* ── v14.179 · les plus anciens ── */
.mgold{display:flex;justify-content:center;padding:4px 0 10px}.mgold .lk{display:inline-flex;align-items:center;gap:5px;font-size:12px}.mgold .ico{width:13px;height:13px}
.mgfe{display:inline-flex;align-items:center;gap:6px;font-size:12.5px;color:var(--muet);font-style:italic}.mgfe .ico{width:14px;height:14px}

/* ── v14.180 · chercher partout, transférer, l'aperçu des vidéos ── */
.mggqsec{display:flex;align-items:baseline;gap:6px;padding:10px 13px 5px;font:600 10.5px var(--f-ui);text-transform:uppercase;letter-spacing:.04em;color:var(--muet)}
.mggqsec span{text-transform:none;letter-spacing:0;font-weight:400}
.spf.mggqf{padding:6px 13px 8px;background:none;border-bottom:1px solid var(--ligne)}
.mgde{border:1px solid var(--ligne-2);background:var(--carte);border-radius:20px;padding:4px 8px;font:600 11px var(--f-ui);color:var(--encre-2);cursor:pointer;max-width:130px}
.mgde.on{border-color:var(--terra);color:var(--terra);background:var(--terra-pale)}
.mggqa{padding:10px 13px;margin:0}
.mgcv mark.mghit{padding:0}
.mgtr{display:flex;align-items:center;gap:5px;font-size:11px;color:var(--muet);font-style:italic;margin-bottom:3px}.mgtr .ico{width:12px;height:12px;flex:none}
.mgfwdap{border:1px solid var(--ligne);border-radius:10px;padding:8px 10px;background:var(--surface-2);margin-bottom:10px;font-size:12.5px}
.mgfwdap .mgtr{font-style:normal}
.mgfwdpj{display:flex;align-items:center;gap:6px;color:var(--encre-2);margin-bottom:2px}.mgfwdpj .ico{width:14px;height:14px}
.mgfwdx{display:-webkit-box;-webkit-line-clamp:3;-webkit-box-orient:vertical;overflow:hidden;white-space:pre-wrap}
.mgdest{max-height:290px;overflow:auto;border:1px solid var(--ligne);border-radius:10px;margin:8px 0 12px}
.mgdest .mggqsec{padding-top:8px}
.mgvid{background-size:cover;background-position:center}
.mggi.vid{position:relative}.mggi.vid img{position:absolute;inset:0}.mggi.vid .ico{position:relative;filter:drop-shadow(0 1px 2px rgba(0,0,0,.5))}
#mdl-trf .rech2{display:flex;align-items:center;gap:7px;border:1px solid var(--ligne);border-radius:9px;padding:6px 10px;background:var(--surface-2);color:var(--muet)}
#mdl-trf .rech2 input{border:0;background:none;outline:none;flex:1;min-width:0;font:400 12.5px var(--f-ui);color:var(--encre)}
#mdl-trf .rech2 .ico{width:15px;height:15px;flex:none}

/* ── v14.181 · le favori d'un sondage, non lu, masquer ── */
.mgpo.lead .fx1{font-weight:700}.mgpo.lead b{color:var(--terra-h)}
.mgg.me .mgpoll{background:var(--carte);border-radius:10px;padding:8px;margin:2px -4px}
.mgcv .l1{position:relative}
.mgcvm{display:none;place-items:center;width:22px;height:18px;border-radius:6px;color:var(--muet);flex:none;margin:-2px 0}
.mgcvm .ico{width:15px;height:15px}
.mgcvm:hover{background:var(--carte);color:var(--encre)}
.mgcv:hover .mgcvm,.mgcv:focus-within .mgcvm{display:inline-grid}
.mgcv:hover .l1 time,.mgcv:focus-within .l1 time{display:none}
.mgcv .u.mgcvpt{min-width:9px;width:9px;height:9px;padding:0;background:#2F6FD8}
.mgtoast .mgtoastb{margin-left:14px;border:0;background:none;color:#F6B89E;font:700 12.5px var(--f-ui);cursor:pointer;padding:0}

/* ── v14.182 · arrivé après la création ── */
.mgvoit{font-size:11.5px;color:var(--muet);background:var(--surface-2);border:1px solid var(--ligne);border-radius:12px;padding:3px 10px}

/* ── v14.183 · la couleur et l'icône d'un groupe (comme les étiquettes) ── */
.av-m.mgcav{border:1px solid}
.av-m.mgcav .ico{color:inherit;stroke:currentColor}
.mgappb{position:relative;border:0;background:none;padding:0;cursor:pointer;border-radius:12px}
.mgappp{position:absolute;right:-5px;bottom:-5px;width:22px;height:22px;border-radius:50%;background:var(--carte);border:1px solid var(--ligne);display:grid;place-items:center;box-shadow:0 2px 6px rgba(0,0,0,.12);color:var(--encre-2)}
.mgappp .ico{width:11px;height:11px}
.mgappb:hover .mgappp{color:var(--terra-h);border-color:var(--terra)}
.mgappv{display:flex;gap:12px;align-items:center;margin-bottom:14px}
.mgappv .av-m{width:48px;height:48px;border-radius:12px}.mgappv .av-m .ico{width:24px;height:24px}
.mgbox .av-m.sq.mgcav .ico,.mgpick .av-m.sq.mgcav .ico,.mgappv .av-m.sq.mgcav .ico{stroke:currentColor;color:inherit}
.mgdet .hd .av-m.mgcav{border-radius:14px}.mgdet .hd .av-m.mgcav .ico{width:26px;height:26px}
#mgappx{white-space:nowrap}

/* ── v14.184 · « Admin », « Lecteur » (teintes des étiquettes : ambre, ardoise) ── */
.mgtag.adm,.mgtag.lec{display:inline-flex;align-items:center;gap:3px;padding:1px 7px 1px 5px;border:1px solid}
.mgtag.adm{background:#FBEEDB;color:#8A5A17;border-color:#EFD3A6}
.mgtag.lec{background:#ECEDEF;color:#414A52;border-color:#D2D5DA}
.mgtag .ico{width:11px;height:11px}
.mgro.adm,.mgro.lec{border-style:solid}
.mgro.adm{background:#FBEEDB;border-color:#EFD3A6;color:#6B4A12}.mgro.adm>.ico{color:#8A5A17}
.mgro.lec{background:#ECEDEF;border-color:#D2D5DA;color:#414A52}.mgro.lec>.ico{color:#414A52}

/* ── v14.185 · les mentions protégées : un calque derrière la zone d'écriture ── */
.mgtaw{position:relative}
.mgcal{position:absolute;left:0;top:0;overflow:hidden;pointer-events:none;white-space:pre-wrap;overflow-wrap:break-word;word-break:normal;font:400 13px/1.5 var(--f-ui);color:var(--encre);padding:2px 0 0;box-sizing:border-box}
.mgcal b{font-weight:inherit;color:var(--terra-h);text-shadow:.35px 0 0 currentColor,-.35px 0 0 currentColor}
.mgta.mgtaz{position:relative;color:transparent;caret-color:var(--encre)}
.mgta.mgtaz::placeholder{color:var(--muet)}
.mgta.mgtaz::selection{color:transparent;background:rgba(233,102,70,.22)}

/* ── v14.187 · les réglages de la messagerie, une page ── */
.mgrpage{max-width:900px;display:flex;flex-direction:column;gap:14px}
#mgrsuite{display:flex;flex-direction:column;gap:14px}#mgrsuite[hidden]{display:none}
.mgretb{display:grid;grid-template-columns:190px minmax(0,1fr) minmax(0,1fr);gap:16px;padding:14px 18px;border-top:1px solid var(--ligne);align-items:start}
.mgretn{display:flex;gap:8px;align-items:center;padding-top:30px}.mgretn .ico{width:16px;height:16px;color:var(--muet);flex:none}.mgretn b{font-size:13px}
.mgretl{display:flex;justify-content:space-between;align-items:center;gap:8px;min-height:24px;margin-bottom:6px;font-size:12px;font-weight:600;color:var(--encre-2)}
.mgretl>span{display:inline-flex;gap:5px;align-items:center}
.mgretb .csal.mgrcs{width:100%;display:block;margin:0;padding:0}
.mgretb .csal.open{z-index:70}
.mgretm{font-size:11px;color:var(--muet);margin-top:5px}
@media (max-width:900px){.mgretb{grid-template-columns:1fr}.mgretn{padding-top:0}}
.mgrpage .card{overflow:visible}

/* v14.188 — planning sans salarié : le vide prend la largeur de la grille */
.plvide{border-bottom:1px solid var(--surface-2);padding:40px 16px}

/* v14.188 — photo prise à la caméra : aperçu carré, en miroir */
.imgcam{display:flex;justify-content:center;margin:0 0 14px}
.imgcam[hidden]{display:none}
.imgcam video{width:300px;height:300px;max-width:100%;object-fit:cover;display:block;
  border:1px solid var(--ligne);border-radius:10px;background:var(--surface-2);transform:scaleX(-1)}
.imgcamgo{display:flex;justify-content:center;margin:12px 0 0}
.imgcamgo[hidden]{display:none}

/* v14.189 — le calcul de la modulation : les réglages, et l'exemple à droite */
.mdcal{display:grid;grid-template-columns:minmax(0,1fr) 340px}
.mdcalr{padding:6px 16px 14px;min-width:0}
.mdt{font:700 10.5px var(--f-ui);letter-spacing:.06em;text-transform:uppercase;color:var(--muet);margin:14px 0 8px}
.mdcal .nat{margin-bottom:8px}
.mdrow{padding:10px 0;border-bottom:1px solid var(--ligne);gap:14px;align-items:center}
.mdrow:last-child{border-bottom:none}
.mdseg{flex:none}
.segr label.mdoff{opacity:.4;cursor:default}
.mdex{border-left:1px solid var(--ligne);background:var(--surface-2);padding:14px 16px;border-radius:0 0 var(--r) 0;min-width:0}
.mdexh{display:flex;align-items:baseline;gap:8px;margin-bottom:8px}
.mdexh span{font-size:11px;color:var(--muet)}
.mdexb{margin-top:14px}
.mdext{font:700 10.5px var(--f-ui);letter-spacing:.06em;text-transform:uppercase;color:var(--muet);margin-bottom:4px}
.mdexl{display:flex;justify-content:space-between;gap:10px;font-size:12px;padding:4px 0;color:var(--encre-2)}
.mdexl b{font-variant-numeric:tabular-nums;font-weight:600;color:var(--encre);white-space:nowrap}
.mdexl.moins b{color:var(--muet)}
.mdexl.sous{font-size:11px;color:var(--muet);padding-top:0}
.mdexl.sous b{font-weight:500;color:var(--muet)}
.mdexl.tot{border-top:1px solid var(--ligne-2);margin-top:4px;padding-top:7px;font-weight:700;color:var(--encre)}
.mdexl.tot b{font-weight:700}
.mdcpt{display:flex;justify-content:space-between;align-items:center;margin-top:14px;padding-top:12px;border-top:1px solid var(--ligne-2);font-weight:700;font-size:13px}
@media (max-width:1100px){.mdcal{grid-template-columns:1fr}.mdex{border-left:none;border-top:1px solid var(--ligne);border-radius:0 0 var(--r) var(--r)}}

/* v14.189 — les congés payés dans la paie */
.pytab .pfcpp{color:var(--vert);font-weight:600}
.pytab td.pfcpr{color:var(--muet)}
.pfrgc li.tot{font-weight:700;border-bottom:none;border-top:1px solid var(--ligne-2);margin-top:2px}
.pfrgc li.tot span{color:var(--encre)}
/* v14.189 — Confort / Compacte, à côté de « A → Z », de la même taille */
.tbtri + .tbdens{margin-left:4px}

/* ══ LES FICHES DE PRÉSENCE ══                               (v14.191)
   La fiche est une feuille : fond blanc, ombre de papier, les teintes de
   l'application. La mise en page est celle de la maquette validée — l'en-
   tête avec le logo, trois cases d'identité, le tableau jour par jour, les
   tuiles aux icônes de la paie, les cadres de signature. Le PDF (fp_pdf)
   dessine la même chose. */
.fpune{display:grid;grid-template-columns:minmax(0,1fr) 380px;gap:20px;align-items:start}
@media(max-width:1180px){.fpune{grid-template-columns:1fr}}
.fpa4{background:#fff;box-shadow:0 10px 40px rgba(62,43,26,.14);border-radius:4px;padding:36px 40px;font-size:12px;color:#2b2118;min-width:0}
.fph{display:flex;align-items:center;gap:16px;border-bottom:2px solid var(--encre);padding-bottom:14px}
.fplg{height:44px;max-width:180px;object-fit:contain;flex:none}
.fpnm{font:700 14px var(--f-titre);letter-spacing:.04em;flex:none}
.fpti{flex:1;padding-left:14px;border-left:1px solid var(--ligne-2);min-width:0}
.fpti b{display:block;font:700 19px var(--f-titre)}.fpti span{color:var(--encre-2)}
.fpet{text-align:right}.fpet b{display:block}.fpet span{color:var(--muet);font-size:11px}
.fpid{display:grid;grid-template-columns:repeat(3,1fr);gap:12px;margin:18px 0}
.fpid div{background:var(--surface-2);border-radius:8px;padding:10px 12px;min-width:0}
.fpid span{display:block;font-size:10px;text-transform:uppercase;letter-spacing:.06em;color:var(--muet);font-weight:700}
.fpid b{display:block;margin-top:3px;font-size:13px}.fpid i{font-style:normal;color:var(--muet);font-size:11px}
.fptb{width:100%;border-collapse:collapse}
.fptb th{text-align:left;font-size:10px;text-transform:uppercase;letter-spacing:.05em;color:var(--muet);border-bottom:1px solid var(--ligne-2);padding:7px 6px}
.fptb td{padding:8px 6px;border-bottom:1px solid var(--ligne);font-variant-numeric:tabular-nums;vertical-align:middle}
.fptb .rt{text-align:right;white-space:nowrap}
.fptb tr.fprp td{color:var(--muet)}.fptb tr.fprp td:nth-child(3){font-style:italic}
.fptb td.fpor{font-size:10.5px;color:var(--muet)}
.fptb tr.fpab td{padding-top:5px;padding-bottom:5px}
.fptb tr.fpsm td{background:var(--surface-2);font-size:10.5px;font-weight:700;text-transform:uppercase;letter-spacing:.05em;color:var(--encre-2);padding:5px 6px}
.fptb tr.fpsm td.rt{text-transform:none;letter-spacing:0;color:var(--encre);font:700 12px var(--f-titre)}
.fptb tfoot td{border-bottom:none;border-top:1.5px solid var(--encre);font-weight:700;padding-top:10px}
.fptb tfoot .rt b{font:700 15px var(--f-titre);color:var(--terra-h)}
.fpabs{display:flex;align-items:center;gap:7px;border-radius:6px;padding:5px 9px;font-weight:600;font-size:11.5px}
.fpabs .ico{width:14px;height:14px;flex:none}
.fpabs i{font-style:normal;font-weight:500;opacity:.8;margin-left:auto}
.fpabs.fpfe{background:var(--jaune-pale);color:var(--jaune-txt,var(--jaune))}
.fprc{display:grid;gap:10px;margin:18px 0 12px}
.fprc div{border:1px solid var(--ligne);border-radius:8px;padding:10px 12px;min-width:0}
.fprc span{display:flex;align-items:center;gap:5px;font-size:10.5px;color:var(--muet)}
.fprc span .ico{width:13px;height:13px;flex:none}
.fprc b{display:block;font:700 18px var(--f-titre);margin-top:3px}.fprc i{font-style:normal;font-size:10.5px;color:var(--muet)}
.fprc .bon b{color:var(--vert)}.fprc .fort b{color:var(--terra-h)}
.fpvl{font-size:11px;color:var(--encre-2);margin-bottom:16px}
.fpsg{display:grid;grid-template-columns:1fr 2fr;gap:12px}
.fpsg>div{border:1px solid var(--ligne-2);border-radius:8px;padding:10px 12px;min-height:96px}
.fpsg span{font-size:10.5px;color:var(--muet);font-weight:700;text-transform:uppercase;letter-spacing:.05em}
.fpsg b{display:block;margin-top:10px;font-size:14px}
.fpse{display:flex;align-items:center;gap:6px;font-style:normal;font-size:11px;color:var(--vert);margin-top:14px;font-weight:600}
.fpse .ico{width:16px;height:16px}
.fppd{margin-top:22px;padding-top:8px;font-size:9.5px;color:var(--muet);border-top:1px solid var(--ligne)}
/* La liste de l'émargement */
.fpcol{display:flex;flex-direction:column;gap:5px}.fpcol b{font-size:13px}
.fpnote{display:block;font-size:11.5px;color:var(--muet);margin-top:4px;max-width:280px}
.emt td .sgetat{display:inline-block}
.emt .cact .btn{white-space:nowrap}

/* ═══ POINTAGES (ex-émargement) ═══                        (v14.193)
   La frise des semaines, les preuves côte à côte, la signature en
   vignette, Voir et Valider sur chaque ligne. */
.sfr{margin:0 0 14px;padding:10px 14px}
.sfrg{display:grid;gap:5px 6px;align-items:center}
.sfrh{border-radius:8px;padding:4px 0;display:flex;flex-direction:column;align-items:center;gap:1px;
  color:var(--encre-2);text-decoration:none}
.sfrh b{font-size:12.5px;font-weight:700}
.sfrh i{font-style:normal;font-size:10.5px;color:var(--muet)}
.sfrh:hover{background:var(--surface-2)}
.sfrh.on{background:var(--encre);color:#fff}
.sfrh.on i{color:rgba(255,255,255,.7)}
.sfrl{font-size:11px;font-weight:700;letter-spacing:.05em;text-transform:uppercase;color:var(--muet)}
.sfrc{height:26px;border-radius:7px;display:flex;align-items:center;justify-content:center;
  font-size:12px;font-weight:700;font-variant-numeric:tabular-nums;text-decoration:none}
.sfrc .ico{width:14px;height:14px}
.sfrc.ok{background:var(--vert-pale);color:var(--vert-fonce)}
.sfrc.af,.sfrc.env{background:var(--jaune-pale);color:var(--jaune-fonce)}
.sfrc.sig{background:var(--bleu-pale);color:var(--bleu-fonce)}
.sfrc.ano,.sfrc.ref{background:var(--rouge-pale);color:var(--rouge-fonce)}
.sfrc.vide{background:var(--surface-2);color:var(--muet)}
a.sfrc:hover{filter:brightness(.96)}
.sfrc.sel{box-shadow:inset 0 0 0 1.5px var(--encre)}
.sfrlg{display:flex;gap:16px;flex-wrap:wrap;margin-top:9px;font-size:11.5px;color:var(--encre-2)}
.sfrlg span{display:inline-flex;align-items:center;gap:6px}
.sfrlg i.sfrc{width:14px;height:10px;border-radius:3px;display:inline-block}
.emf > .emchips{margin-bottom:0}
.cctl .prv:empty{min-width:32px}
.cctl .pv.emsig{width:52px;background:#fff}
.cctl .pv.emsig img{object-fit:contain;padding:3px 4px}
.emact{display:inline-flex;gap:6px}
.emt.sansctl .cctl,.emt.sansret .cret{display:none}
.emt tr.emavenir td{color:var(--muet)}
.grh .in .avm{width:22px;height:22px;border-radius:50%;font-size:9.5px;flex:none}
/* La fiche de présence : la signature de la pointeuse, à chaque geste. */
.fptb td.fpsgn{white-space:nowrap}
.fptb td.fpsgn img{width:54px;height:22px;object-fit:contain;vertical-align:middle}
.fptb td.fpsgn img + img{margin-left:6px}
.fptb td.fpsgn span{display:block}
.grh .in .avm:not(.avphoto){display:inline-grid;place-items:center;color:#fff;font-weight:700;line-height:1}
/* Sur un écran étroit, la frise défile au lieu d'écraser ses dix cases. */
@media (max-width:760px){.sfr{overflow-x:auto}.sfrg{min-width:620px}}

/* ═══ LA MARQUE : LOGO ET SIGLE ═══                        (v14.195)
   Des images déposées dans assets/images/marque/ (voir marque_img()).
   Hauteur fixée, largeur libre : le logo est un mot, le sigle un bloc
   plus haut que large. */
.mqlogo,.mqsigle{display:block;width:auto;max-width:100%}
.rail .rlogo.mqa{background:none;border-radius:0;box-shadow:none}
.rail .rlogo.mqa .mqsigle{height:44px}
.mqgate{height:48px;margin:0 auto 12px}
.authmq .mqauth{height:30px}
.mqfact{height:30px}
.bplein .mqborne{height:34px;margin:0 auto 18px}

.bmarque .mqlogo{height:18px;margin-bottom:8px;opacity:.85}
.bmarque .bmq-c{display:none}
body.borne.theme-clair .bmarque .bmq-c{display:block}
body.borne.theme-clair .bmarque .bmq-b{display:none}

/* ═══ v14.198 · Développeur › Offres ═══════════════════════════ */
.offgrp{font-size:11px;font-weight:700;letter-spacing:.07em;text-transform:uppercase;color:var(--muet);margin-bottom:4px}
.offmod{display:grid;grid-template-columns:minmax(0,1fr) auto 250px;gap:12px;align-items:center;padding:8px 0;border-top:1px solid var(--ligne)}
.offgrp+.offmod{border-top:0}
.offmod .n b{display:block;font-weight:600;font-size:13px}
.offmod .n i{display:block;font-style:normal;font-size:11.5px;color:var(--muet)}
.offmod .segr{margin:0}
.offsocle{font-size:11.5px;color:var(--muet);justify-self:start}
.offpx{display:flex;gap:6px;align-items:center;justify-content:flex-end}
.offpx[hidden]{display:none}
.offpx .funit{width:76px;flex:none}.offpx .funit input{min-width:0;width:100%}
.offpx select.fi{width:auto;min-width:0;max-width:130px}
.offap{border:1.5px solid var(--terra);border-radius:14px;padding:16px;display:grid;gap:3px;position:relative}
.offap em{position:absolute;top:-10px;left:14px;background:var(--terra);color:#fff;font-style:normal;font-size:10.5px;font-weight:700;border-radius:99px;padding:2px 9px}
.offap b{font-size:16px}
.offap span,.offap i,.offap small{font-size:12px;color:var(--muet);font-style:normal}
.offap strong{font-size:26px;margin-top:6px;font-family:'Bricolage Grotesque',sans-serif}
.offap ul{margin:8px 0 0;padding-left:18px;font-size:12.5px}
@media(max-width:900px){.offmod{grid-template-columns:1fr}.offpx{justify-content:flex-start}}

/* ══ v14.237 · la feuille de paie ══ */
/* Une ligne vérifiée l'emporte sur l'alternance des lignes et sur les colonnes teintées :
   `tr:nth-child(even) td` (0,2,3) passait devant `tr.pfok td` (0,2,2). */
.pytab tbody tr.pfok td,.pytab tbody tr.pfok:nth-child(even) td,.pytab tbody tr.pfok td[data-tg]{background:#F3F8EE}
.pytab tbody tr.pffoc.pfok td,.pytab tbody tr.pffoc.pfok:nth-child(even) td{background:#EEF5E6}
/* Le titre d'un groupe de colonnes suit le défilement, calé après la colonne figée. */
.tbfx > .pytab thead tr.g th > .pfgs{position:sticky;left:calc(var(--colfig, 0px) + 14px);display:inline-block}
.pytab thead tr.c th .pfsrc{display:block}
/* L'établissement au-dessus des étapes, avec son avancement. */
.pfhh{margin:0 0 10px}
.pfe a .pfen,.pfe1 .pfen{font-weight:500;color:var(--muet);margin-left:2px}
.pfe a .pfet,.pfe1 .pfet{margin-left:6px}
/* Les jours travaillés : un résultat, que le crayon ouvre. */
.pfjt{display:inline-grid;grid-template-columns:auto auto;align-items:center;justify-items:end;gap:2px 4px}
.pfjt .pfin{grid-row:1;grid-column:1}.pfjt .pfjtb{grid-row:1;grid-column:2}.pfjt .pfc{grid-row:2;grid-column:1 / -1}
.pfjt .pfin:not(.pfo) .fi:not(:focus){border-color:transparent;background:transparent;box-shadow:none;font-weight:700}
.pfjtb{border:0;background:none;padding:2px;color:var(--muet);cursor:pointer;opacity:.35;display:grid;place-items:center}
.pfjtb .ico{width:14px;height:14px}
.pytab tr:hover .pfjtb,.pfjtb:focus-visible{opacity:1}
/* Pendant qu'une étape se charge. */
#pfroot.pfcharge{opacity:.6;transition:opacity .15s .1s;pointer-events:none;cursor:progress}
/* Le contrat au survol du nom. */
#apanel.pfct .apt{background:var(--encre);color:#fff;font-weight:500}
#apanel.pfct .apr b{width:62px}

/* ══ v14.238 · la rémunération dans la paie ══ */
.pftp{font-size:10.5px;padding:1px 7px;margin-left:4px;vertical-align:1px}

/* ══ v14.239 · l'éditeur de modèles, en plein écran ══
   La coque est celle de la préparation d'une signature (.sgfull,
   .sgtop, .sgbody, .sgpages, .sgpan). Ce qui suit n'ajoute que ce qui
   est propre au document : la barre d'outils, les pages A4, le
   panneau. Les mesures des pages sont celles de Word (96 ppp). */
#me .sgtop .de{display:flex;gap:4px;align-items:center}
.meNom{display:block;border:0;background:none;font-family:var(--f-titre);font-size:15.5px;font-weight:700;
  color:var(--encre);padding:1px 4px;margin-left:-4px;width:100%;max-width:560px;outline:0;border-radius:6px}
.meNom:hover,.meNom:focus{background:var(--surface-2)}
.meEtat{display:flex;align-items:center;gap:8px;font-size:11.5px;color:var(--muet);margin-right:4px;white-space:nowrap}
.meEtat.ko{color:var(--rouge)}
/* La barre : une bande pleine largeur, centrée. */
.mebar{display:flex;align-items:center;justify-content:center;flex-wrap:wrap;gap:2px;padding:5px 18px;
  background:var(--carte);border-bottom:1px solid var(--ligne);flex:none;position:relative;z-index:3}
.meb{border:0;background:none;width:32px;height:32px;border-radius:8px;display:grid;place-items:center;
  color:var(--encre-2);cursor:pointer;font:600 15px Georgia,serif;flex:none}
.meb:hover,.meb.on{background:var(--surface-2)}.meb.on{color:var(--terra-h)}
.meb:disabled{opacity:.35;cursor:default}
.meb .ico{width:17px;height:17px}
.mebsep{width:1px;height:20px;background:var(--ligne);margin:0 5px;flex:none}
.mesel{height:32px;border:1px solid var(--ligne);background-color:var(--carte);border-radius:8px;padding:0 28px 0 10px;
  font:600 13px var(--f-ui);color:var(--encre);cursor:pointer;appearance:none;-webkit-appearance:none;
  background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 24 24' fill='none' stroke='%2398876F' stroke-width='2.5' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='m6 9 6 6 6-6'/%3E%3C/svg%3E");
  background-repeat:no-repeat;background-position:right 9px center}
.mebt{border:0;background:var(--surface-2);border-radius:8px;height:32px;padding:0 11px;font:600 13px var(--f-ui);
  color:var(--encre);display:inline-flex;align-items:center;gap:6px;margin-left:4px;cursor:pointer;flex:none}
.mebt:hover{background:var(--terra-pale)}
.mebt .ico{width:15px;height:15px;color:var(--terra)}
.mezoom{display:inline-flex;align-items:center;gap:2px;margin-left:8px;font-size:12px;color:var(--encre-2)}
.mezoom b{min-width:44px;text-align:center;font-weight:600}
/* Les menus de la barre et du haut. */
.mepop{position:absolute;z-index:40;background:var(--carte);border:1px solid var(--ligne);border-radius:12px;
  box-shadow:var(--ombre-2);padding:6px;min-width:230px;max-height:60vh;overflow-y:auto;font-family:var(--f-ui)}
.mepop[hidden]{display:none}
.mepop button{display:flex;align-items:center;gap:8px;width:100%;border:0;background:none;padding:7px 9px;
  border-radius:8px;font-size:13px;color:var(--encre);text-align:left;cursor:pointer}
.mepop button:hover,.mepop button.on{background:var(--terra-pale)}
.mepop button small{margin-left:auto;color:var(--muet);font-size:11px;white-space:nowrap}
.mepop button .ico{width:15px;height:15px;color:var(--muet);flex:none}
.mepop .mepoph{font-size:10.5px;font-weight:700;letter-spacing:.05em;text-transform:uppercase;color:var(--muet);padding:8px 9px 4px}
.mepop hr{border:0;border-top:1px solid var(--ligne);margin:4px 0}
.mepop .mepq{display:flex;align-items:center;gap:8px;border:1px solid var(--ligne-2);border-radius:9px;
  padding:0 9px;height:34px;margin:2px 2px 6px}
.mepop .mepq input{border:0;outline:0;font:inherit;font-size:13px;flex:1;background:none;min-width:0}
.mepop .mepq .ico{width:14px;height:14px;color:var(--muet)}
.mecoul{display:flex;gap:6px;padding:4px 9px 8px}
.mecoul button{width:22px;height:22px;padding:0;border-radius:50%;border:1px solid rgba(0,0,0,.1);flex:none}
/* ── Les pages ── */
.sgpages.mepg{padding:28px 0 80px;background:#E9E3D9;position:relative}
.mezw{margin:0 auto;position:relative}
.mefe{position:relative;width:794px;transform-origin:0 0}
.mesh{position:absolute;left:0;width:794px;height:1123px;background:#fff;
  box-shadow:0 1px 2px rgba(62,43,26,.08),0 8px 24px rgba(62,43,26,.10)}
.mehf{position:absolute;overflow:hidden;color:#444}
.mehf.clone{pointer-events:auto;cursor:text}
.mehf.clone .pgno,.mehf .pgno{white-space:nowrap}
.medoc{font-size:11pt;line-height:1.25;color:#1f1f1f;word-wrap:break-word}
.medoc:focus{outline:0}

.mehf.medoc:not(.clone):hover{outline:1px dashed var(--ligne-2);outline-offset:4px}
.mehf.medoc:focus{outline:1px dashed var(--terra);outline-offset:4px}
.mebd{position:absolute}
.medoc p{margin:0 0 6pt}
.medoc h1{font-size:17pt;font-weight:700;margin:12pt 0 6pt;line-height:1.2}
.medoc h2{font-size:13.5pt;font-weight:700;margin:12pt 0 6pt;line-height:1.2}
.medoc h3{font-size:12pt;font-weight:700;margin:12pt 0 6pt;line-height:1.2}
.medoc>:first-child,.medoc .edcondb>:first-child,.medoc .edconde>:first-child{margin-top:0}
.medoc ul,.medoc ol{margin:0 0 6pt;padding-left:26px}
.medoc table{border-collapse:collapse;width:100%;margin:0 0 6pt;table-layout:fixed}
.medoc td,.medoc th{border:1px solid #C9C2B4;padding:4px 6px;vertical-align:top;text-align:left}
.medoc th{background:#F6F3EC}
.medoc td>p:last-child,.medoc th>p:last-child{margin-bottom:0}
.medoc table.edsign td{border:0;padding:6px 8px 36px 0}
.medoc img{max-width:100%;height:auto}
.medoc a{color:inherit}
.medoc .vchip{display:inline;background:var(--terra-pale);color:var(--terra-h);border:0;border-radius:4px;
  padding:0 4px;font:600 .82em/1.5 var(--f-ui);white-space:nowrap;cursor:default;user-select:all}
.medoc .vchip.sel{box-shadow:0 0 0 2px var(--terra)}
.medoc .vchip[data-var^="signature_"],.medoc .vchip[data-var^="initials_"]{background:var(--bleu-pale);color:var(--bleu)}
.medoc .vchip.inc{background:var(--rouge-pale);color:var(--rouge)}
.medoc .vval{background:#EFF4E7;border-radius:3px;padding:0 1px}
.medoc .vmiss{display:inline;background:var(--jaune-pale);color:var(--jaune);border:1px dashed var(--jaune);
  border-radius:4px;padding:0 4px;font:600 .82em/1.5 var(--f-ui)}
.medoc .edcond{border:1.5px dashed #D9C9A8;border-left-width:1.5px;border-radius:8px;padding:4px 10px 4px;
  margin:4px 0 6pt;background:#FFFCF5;overflow:visible}
.medoc .edcondh{display:flex;align-items:center;gap:6px;font:600 11px var(--f-ui);color:var(--jaune);
  margin:0 0 4px;padding:0;border:0;user-select:none;cursor:default}
.medoc .edcondh .ico{width:13px;height:13px}
.medoc .edcondh b{font-weight:700;cursor:pointer;border-bottom:1px dotted currentColor}
.medoc .edcondh .mecx{margin-left:auto;display:flex;gap:4px}
.medoc .edcondh .mecx button{border:1px solid #E6D9BC;background:#fff;border-radius:5px;padding:0 6px;
  font:600 10.5px var(--f-ui);color:var(--jaune);cursor:pointer}
.medoc .edcondh .mecx button:hover{background:var(--jaune-pale)}
.medoc .edcondb{padding:0}
.medoc .edconde{border-top:1px dashed #E6D9BC;margin-top:4px;padding-top:4px}
.medoc .edconde::before{content:'Sinon';display:block;font:600 11px var(--f-ui);color:var(--jaune);margin-bottom:3px}
.medoc .edcondb>p:last-child,.medoc .edconde>p:last-child{margin-bottom:0}
.medoc .pgbrk{display:block;height:0;border-top:1.5px dashed #cbbfae;margin:14px 0;position:relative;user-select:none}
.medoc .pgbrk::before,.medoc .pgbrk::after{content:none}
.medoc .pgbrk span{position:absolute;left:50%;top:-8px;transform:translateX(-50%);background:#fff;
  font:600 9.5px var(--f-ui);letter-spacing:.05em;text-transform:uppercase;color:var(--muet);padding:0 6px}
.medoc .pgno{color:inherit}
.medoc.vide::before{content:attr(data-vide);position:absolute;color:#b9ad9e;pointer-events:none}
.medoc [data-mep]{transition:none}
/* Un bloc plus haut qu'une page : on le montre, il ne sera pas coupé à l'écran. */
.medoc .medeb{outline:2px solid var(--jaune-pale);outline-offset:2px}
/* La saisie « { » */
.meac{position:fixed;z-index:120;width:290px;background:var(--carte);border:1px solid var(--ligne);border-radius:12px;
  box-shadow:var(--ombre-2);padding:6px;font-family:var(--f-ui);max-height:300px;overflow-y:auto}
.meac[hidden]{display:none}
.meach{display:flex;align-items:center;gap:6px;padding:4px 8px 6px;font-size:11px;color:var(--muet)}
.meach .ico{width:13px;height:13px}
.meac button{display:flex;width:100%;justify-content:space-between;gap:8px;border:0;background:none;padding:6px 8px;
  border-radius:8px;font-size:12.5px;color:var(--encre);text-align:left;cursor:pointer}
.meac button.on{background:var(--terra-pale)}
.meac button small{color:var(--muet);font-size:11px;white-space:nowrap}
.meac .mevide{padding:6px 8px;font-size:12px;color:var(--muet)}
/* ── Le panneau ── */
.sgpan.mepan{padding:0;display:flex;flex-direction:column;overflow:hidden}
.metabs{display:flex;gap:4px;padding:6px;border-bottom:1px solid var(--ligne);background:var(--surface-2);flex:none}
.metabs button{flex:1;border:0;background:none;border-radius:8px;padding:7px 4px;font:600 12.5px var(--f-ui);
  color:var(--muet);cursor:pointer}
.metabs button.on{background:var(--carte);color:var(--encre);box-shadow:var(--ombre)}
.mepc{padding:12px 14px 30px;overflow-y:auto;flex:1}
.mepc[hidden]{display:none}
.meq{display:flex;align-items:center;gap:8px;border:1px solid var(--ligne-2);border-radius:10px;padding:0 10px;
  height:36px;background:var(--carte)}
.meq input{border:0;outline:0;font:inherit;font-size:13px;flex:1;background:none;min-width:0}
.meq .ico{width:15px;height:15px;color:var(--muet)}
.meg{border-bottom:1px solid var(--ligne);padding:8px 0}
.meg summary{display:flex;align-items:center;gap:8px;cursor:pointer;list-style:none;font-size:13px;font-weight:600}
.meg summary::-webkit-details-marker{display:none}
.meg summary .ico{width:15px;height:15px;color:var(--muet)}
.meg summary small{margin-left:auto;color:var(--muet);font-weight:500}
.megl{display:flex;flex-wrap:wrap;gap:5px;padding:8px 0 4px}
.mev{border:0;background:var(--terra-pale);color:var(--terra-h);border-radius:7px;padding:3px 8px;
  font:600 11.5px var(--f-ui);cursor:pointer;text-align:left}
.mev:hover{box-shadow:0 0 0 1.5px var(--terra)}
.mev.sig{background:var(--bleu-pale);color:var(--bleu)}.mev.sig:hover{box-shadow:0 0 0 1.5px var(--bleu)}
.mecd{display:inline-flex;align-items:center;gap:5px;border:1.5px dashed #D9C9A8;background:#FFFCF5;color:var(--jaune);
  border-radius:7px;padding:3px 8px;font:600 11.5px var(--f-ui);cursor:pointer;text-align:left}
.mecd .ico{width:12px;height:12px}
.mecd:hover{background:var(--jaune-pale)}
.megt{font-size:11px;font-weight:700;letter-spacing:.06em;text-transform:uppercase;color:var(--muet);margin:16px 0 6px}
.megt:first-child{margin-top:4px}
.merow{display:flex;align-items:center;justify-content:space-between;gap:10px;padding:8px 0;
  border-bottom:1px solid var(--ligne);font-size:13px}
.merow.col{flex-direction:column;align-items:stretch}
.merow span small{display:block;color:var(--muet);font-size:11.5px}
.merow .segr{align-self:flex-start}
.merow .fi{font-size:13px}
.meok{display:flex;gap:10px;align-items:center;border-radius:10px;padding:10px 12px;font-size:13px}
.meok.ok{background:var(--vert-pale);color:var(--vert-fonce)}.meok.ok .ico{color:var(--vert)}
.meok.wa{background:var(--jaune-pale);color:var(--jaune)}
.meok small{display:block;font-size:11.5px;opacity:.85}
.mectl{list-style:none;margin:10px 0 0;padding:0;display:grid;gap:8px;font-size:13px}
.mectl li{display:flex;gap:8px;align-items:flex-start}
.mectl li .ico{width:16px;height:16px;flex:none;margin-top:1px}
.mectl li.ok .ico{color:var(--vert)}.mectl li.wa .ico{color:var(--jaune)}.mectl li.ko .ico{color:var(--rouge)}
.mectl small{display:block;color:var(--muet);font-size:11.5px;margin-top:2px}
.mever{list-style:none;margin:0;padding:0;display:grid;gap:7px;font-size:12.5px}
.mever li{display:flex;gap:8px;align-items:center}
.mever li span{color:var(--muet);flex:1;min-width:0}
.mever li b{min-width:24px}
/* ── L'aperçu ── */
.mewho{display:flex;align-items:center;gap:8px;border:1px solid var(--ligne);border-radius:10px;padding:4px 10px 4px 5px;
  background:var(--carte);font:inherit;font-size:13px;color:var(--encre);cursor:pointer;text-align:left;margin-top:2px}
.mewho small{display:block;color:var(--muet);font-size:11.5px}
.mewho .ico{width:14px;height:14px;color:var(--muet)}
.mewho .meav{width:28px;height:28px;border-radius:50%;background:var(--terra);color:#fff;display:grid;place-items:center;
  font:700 11px var(--f-ui);flex:none}
#me .sgstop a{color:var(--terra-h);font-weight:600;white-space:nowrap}
#me .sgstop.wa{color:var(--jaune)}#me .sgstop.wa i{background:var(--jaune)}
.sgbody.meun{grid-template-columns:minmax(0,1fr)}
.mecharge{opacity:.55;transition:opacity .15s}
@media (max-width:1100px){#me .sgbody.sgbody2{grid-template-columns:minmax(0,1fr) 300px}}
#me [hidden]{display:none!important}
.mehf.clone{z-index:2}
.mebd{z-index:1}
/* La fenêtre « Nouveau modèle » */
.nmbox{width:min(720px,94vw)}
.nmchs{display:grid;grid-template-columns:1fr 1fr;gap:10px;margin-bottom:16px}
.nmch{display:flex;flex-direction:column;align-items:flex-start;gap:6px;text-align:left;border:1.5px solid var(--ligne);
  background:var(--carte);border-radius:14px;padding:14px;cursor:pointer;font-family:var(--f-ui);color:var(--encre)}
.nmch b{font-size:14px}.nmch small{font-size:12px;color:var(--muet);line-height:1.45}
.nmch:hover{border-color:var(--ligne-2)}
.nmch.on{border-color:var(--terra);box-shadow:0 0 0 3px var(--terra-pale)}
.nmci{width:34px;height:34px;border-radius:10px;background:var(--terra-pale);display:grid;place-items:center}
.nmci .ico{color:var(--terra)}
.nmmini{margin-bottom:0}.nmmini .nmch{padding:10px 12px;border-radius:12px}.nmmini .nmch b{font-size:13px}
.nmf{display:flex;align-items:center;gap:8px;margin-top:16px}
#me_manq .megt{margin-top:16px}
.medoc [contenteditable]:focus,.medoc [contenteditable]:focus-visible{outline:0}

/* ══ v14.240 · police, taille et couleurs dans la barre de l'éditeur ══ */
.mesel.medd{text-align:left;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;margin-left:4px}
.mesel.mefont{width:140px}
.mesel.metail{width:76px}
.meb.mecb{position:relative}
.mecb .mea{font:700 15px Georgia,serif;line-height:1;margin-top:-4px}
.mecb .ico{width:16px;height:16px;margin-top:-4px}
.mecb .mebarre{position:absolute;left:8px;right:8px;bottom:6px;height:3.5px;border-radius:2px;background:#1F1F1F}
.mecb .mebarre.vide{background:transparent!important;border:1px dashed var(--ligne-2);height:2px}
.meb.meal{width:44px;display:inline-flex;align-items:center;justify-content:center;gap:1px}
.meal .mechev{width:10px;height:10px;color:var(--muet)}
#me_body{position:relative}
#me_zoomz{position:absolute;right:396px;bottom:14px;z-index:6;margin:0;background:var(--carte);border:1px solid var(--ligne);
  border-radius:10px;padding:2px 4px;box-shadow:var(--ombre)}
@media (max-width:1100px){#me_zoomz{right:316px}}
.mepop .meadd{color:var(--terra-h);font-weight:600}.mepop .meadd .ico{color:var(--terra)}
.metin{display:flex;align-items:center;gap:6px;border:1px solid var(--ligne-2);border-radius:8px;padding:0 8px;height:32px;margin:2px 2px 6px}
.metin input{border:0;outline:0;width:40px;font:600 13px var(--f-ui);background:none}
.metin span{color:var(--muet);font-size:12px}
.metlist{max-height:300px;overflow-y:auto}
.mepop .metlist button{padding:5px 9px}
.mesws{display:grid;grid-template-columns:repeat(10,22px);gap:5px;justify-content:space-between;padding:4px 9px 6px}
.mesws.me2{padding-top:0;padding-bottom:4px}
.mepop .mesw{width:22px;height:22px;padding:0;border-radius:50%;border:1px solid rgba(0,0,0,.12);display:block}
.mepop .mesw:hover{background-color:inherit;transform:scale(1.1)}
.mepop .mesw.meplus{display:grid;place-items:center;background:var(--surface-2);border:1px dashed var(--ligne-2);color:var(--muet)}
.mepop .mesw.meplus .ico{width:13px;height:13px;color:var(--muet)}
.mecw{position:relative;display:block;width:22px;height:22px}
.mepop .mecwx{position:absolute;top:-6px;right:-6px;width:14px;height:14px;padding:0;border-radius:50%;background:var(--encre);
  color:#fff;font-size:10px;line-height:1;display:none;justify-content:center;align-items:center;border:0}
.mecw:hover .mecwx{display:flex}
.mepop .meauto i{width:16px;height:16px;border-radius:50%;flex:none;border:1px solid rgba(0,0,0,.12)}
.mepop .meauto .menone{background:linear-gradient(135deg,#fff 45%,#C43C43 45%,#C43C43 55%,#fff 55%)}
.mepick{border-top:1px solid var(--ligne);margin-top:6px;padding:10px 9px 4px}
.mesv{position:relative;height:120px;border-radius:8px;cursor:crosshair;touch-action:none}
.mehue{position:relative;height:12px;border-radius:6px;margin:10px 0;cursor:pointer;touch-action:none;
  background:linear-gradient(to right,red,#ff0,lime,cyan,blue,#f0f,red)}
.mesv i,.mehue i{position:absolute;width:14px;height:14px;border-radius:50%;border:2px solid #fff;
  box-shadow:0 0 0 1px rgba(0,0,0,.3);transform:translate(-50%,-50%);pointer-events:none}
.mehue i{top:50%}
.mehex{display:flex;gap:6px;align-items:center}
.mehex input{flex:1;min-width:0;height:32px;border:1px solid var(--ligne-2);border-radius:8px;padding:0 8px;font:600 13px var(--f-ui)}
.meprev{width:32px;height:32px;border-radius:8px;flex:none;border:1px solid rgba(0,0,0,.1)}
.mepop .mehex .btn{width:auto;flex:none;height:32px;padding:0 12px;justify-content:center;color:#fff}
.mepop .mehex .btn:hover{background:var(--terra-h)}
/* La fenêtre « Ajouter une police » */
.megf{position:absolute;inset:0;z-index:60}
.megf[hidden]{display:none}
.megfv{position:absolute;inset:0;background:rgba(43,32,24,.42)}
.megfb{position:absolute;left:50%;top:60px;transform:translateX(-50%);width:min(760px,92%);max-height:calc(100% - 100px);
  background:var(--carte);border-radius:18px;box-shadow:var(--ombre-2);display:flex;flex-direction:column}
.megfh{display:flex;align-items:flex-start;justify-content:space-between;padding:18px 20px 12px;border-bottom:1px solid var(--ligne)}
.megfh .de{font-size:11px;color:var(--muet);font-weight:600}
.megfh h2{margin:2px 0 0;font:700 18px var(--f-titre)}
.megfc{padding:14px 20px 18px;overflow:auto;min-height:0}
.megft{display:flex;gap:10px;align-items:center;margin-bottom:12px}
.megft .meq{flex:1}
.megfr{display:grid;grid-template-columns:170px minmax(0,1fr) auto;gap:14px;align-items:center;padding:10px 0;border-bottom:1px solid var(--ligne)}
.megfr b{display:block;font-size:15px}
.megfr small{color:var(--muet);font-size:11.5px}
.megfr p{margin:0;font-size:15px;color:var(--encre-2);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.megfl .mevide{padding:20px 0;color:var(--muet);font-size:13px}

/* ══ v14.241 · éditeur : Insérer, tableaux, listes, en-tête dans la page ══ */
/* Les listes */
.medoc ol>li::marker{content:counter(list-item) ". "}
.medoc ol ol>li::marker{content:counter(list-item, lower-alpha) ") "}
.medoc ol ol ol>li::marker{content:counter(list-item, lower-roman) ". "}
.medoc ol[data-num=paren]>li::marker{content:counter(list-item) ") "}
.medoc ol[data-num=lower-alpha]>li::marker{content:counter(list-item, lower-alpha) ". "}
.medoc ol[data-num=upper-alpha]>li::marker{content:counter(list-item, upper-alpha) ". "}
.medoc ol[data-num=upper-roman]>li::marker{content:counter(list-item, upper-roman) ". "}
.medoc ol[data-num=article]>li::marker{content:"Article " counter(list-item) " – "}
.medoc ol[data-num=article],.medoc ol[data-niveaux=article]{padding-left:0}
/* v14.242 : le numéro « Article 1 – » est DANS la ligne, jamais dans la marge */
.medoc ol[data-num=article]>li,.medoc ol[data-niveaux=article]>li{list-style-position:inside}
.medoc ol[data-num=article] ol>li::marker,.medoc ol[data-niveaux=article] ol>li::marker,
.medoc ol[data-niveaux=decimal] ol>li::marker{content:counters(list-item, ".") " "}
.medoc ol[data-niveaux=article]>li::marker{content:"Article " counter(list-item) "  "}
.medoc ol[data-niveaux=article] ol ol>li::marker{content:counter(list-item, lower-alpha) ") "}
.medoc ol[data-niveaux=decimal] ol{padding-left:34px}
.medoc ol[data-niveaux=alpha] ol>li::marker{content:counter(list-item, lower-alpha) ") "}
.medoc ol[data-niveaux=alpha] ol ol>li::marker{content:counter(list-item, lower-roman) ". "}
.medoc ul[data-puce=dash]>li::marker{content:"–  "}
.medoc ul[data-puce=circle]>li::marker{content:"○  "}
.medoc ul[data-puce=square]>li::marker{content:"■  ";font-size:.8em}
.medoc ul[data-puce=check]>li::marker{content:"✓  "}
.medoc ul[data-puce=arrow]>li::marker{content:"→  "}
/* Les sous-titres numérotés */
.medoc[data-numh2]{counter-reset:h2n}
.medoc[data-numh2] h2{counter-increment:h2n}
.medoc[data-numh2=article] h2::before{content:"Article " counter(h2n) " – "}
.medoc[data-numh2=decimal] h2::before{content:counter(h2n) ". "}
.medoc[data-numh2=roman] h2::before{content:counter(h2n, upper-roman) ". "}
/* La ligne horizontale */
.medoc hr{border:0;border-top:1px solid #8C8C8C;margin:8pt 0 10pt;height:0}
.medoc hr[data-trait=epais]{border-top:3px solid #595959}
.medoc hr[data-trait=pointille]{border-top:1.5px dashed #8C8C8C}
.medoc hr[data-trait=double]{border-top:3px double #595959}
/* Le saut de page : une étiquette en bout de page */
.medoc .pgbrk{border:0;margin:6px 0}
.medoc .pgbrk span{top:-9px;background:var(--surface-2);border:1px solid var(--ligne-2);border-radius:99px;padding:1px 10px;color:var(--encre-2)}
/* Les tableaux : bordures et épaisseur */
.medoc table[data-ep=moyen] td,.medoc table[data-ep=moyen] th{border-width:2px}
.medoc table[data-ep=epais] td,.medoc table[data-ep=epais] th{border-width:3px}
.medoc table[data-bord=ext]{border:1px solid #C9C2B4}
.medoc table[data-bord=ext][data-ep=moyen]{border-width:2px}.medoc table[data-bord=ext][data-ep=epais]{border-width:3px}
.medoc table[data-bord=ext] td,.medoc table[data-bord=ext] th{border-color:transparent;outline:1px dashed #eee;outline-offset:-1px}
.medoc table[data-bord=lignes] td,.medoc table[data-bord=lignes] th{border-left-color:transparent;border-right-color:transparent}
.medoc table[data-bord=aucune] td,.medoc table[data-bord=aucune] th{border-color:transparent;outline:1px dashed #e6e0d6;outline-offset:-1px}
.mebd.mecolrz,.medoc.mecolrz td,.medoc.mecolrz th{cursor:col-resize}
/* Les barres dans la page (tableau, en-tête et pied) */
.metbar,.mehfbar{position:absolute;z-index:9;display:flex;align-items:center;gap:2px;background:var(--carte);border:1px solid var(--ligne);
  border-radius:10px;padding:3px 4px;box-shadow:var(--ombre-2);font-family:var(--f-ui);white-space:nowrap}
.metbar[hidden],.mehfbar[hidden]{display:none}
.mehfl{font-size:10.5px;font-weight:700;letter-spacing:.05em;text-transform:uppercase;color:var(--muet);padding:0 8px 0 6px}
.metbar button,.mehfbar button{border:0;background:none;height:28px;padding:0 8px;border-radius:7px;font:600 12px var(--f-ui);color:var(--encre);
  display:inline-flex;align-items:center;gap:5px;cursor:pointer}
.metbar button .ico,.mehfbar button .ico{width:14px;height:14px;color:var(--muet)}
.metbar button .mechev{width:9px;height:9px;color:var(--muet)}
.metbar button:hover,.mehfbar button:hover{background:var(--surface-2)}
.metbar button.act{color:var(--terra-h)}.metbar button.act .ico{color:var(--terra)}
.mehfbar .mehfck i{width:12px;height:12px;border:1.5px solid var(--ligne-2);border-radius:3px;display:inline-block}
.mehfbar .mehfck.on i{background:var(--terra);border-color:var(--terra);box-shadow:inset 0 0 0 2px #fff}
.mehf.medoc.mehfon{outline:1px dashed var(--terra);outline-offset:4px}
/* Les bandes des pages 1 et 2 sont DANS la hauteur du corps : elles passent devant lui. */
.mehf:not(.clone){z-index:2}
.mehfplus{position:absolute;left:50%;transform:translateX(-50%);z-index:8;display:inline-flex;align-items:center;gap:5px;height:26px;padding:0 12px;
  border:1px dashed var(--ligne-2);border-radius:99px;background:var(--carte);font:600 12px var(--f-ui);color:var(--encre-2);cursor:pointer;
  opacity:.7;transition:opacity .15s}
.mehfplus:hover{opacity:1;border-color:var(--terra)}
.mehfplus[hidden]{display:none}
.mehfplus .ico{width:13px;height:13px;color:var(--terra)}
/* Le menu Insérer */
.meinsg{display:flex;gap:6px}
.meinsl{width:200px;flex:none}
.meinsp{flex:1;border-left:1px solid var(--ligne);padding-left:6px;min-width:0}
.mepop .meinsl button small .ico{width:13px;height:13px}
.megrid{display:grid;grid-template-columns:repeat(10,18px);gap:3px;padding:4px 9px 9px}
.megrid i{width:18px;height:18px;border:1px solid var(--ligne-2);border-radius:3px;background:var(--carte);cursor:pointer}
.megrid i.on{background:var(--terra-pale);border-color:var(--terra)}
.metrait{width:60px;height:0;flex:none;margin-right:4px}
/* Les formats de liste */
.mefmts{display:grid;grid-template-columns:repeat(3,1fr);gap:6px;padding:2px 9px 8px}
.mepop .mefmt{display:flex;flex-direction:column;align-items:flex-start;gap:3px;border:1.5px solid var(--ligne);border-radius:9px;padding:7px 8px;height:auto;width:auto}
.mepop .mefmt.on{border-color:var(--terra);background:var(--terra-pale)}
.mefmt i{display:flex;align-items:center;gap:5px;font-style:normal;font-size:10.5px;width:100%;white-space:nowrap}
.mefmt i::after{content:'';flex:1;height:3px;border-radius:2px;background:var(--ligne-2);min-width:8px}
.mefmt i b{font-weight:600;color:var(--encre-2)}
.mepop .meal.on,.meb.meal.on{background:var(--surface-2);color:var(--terra-h)}
.mesel.meins{width:auto;padding-right:28px;margin-left:6px}
.mesel.meins .ico{width:14px;height:14px;margin:-2px 4px 0 -2px;vertical-align:middle}
/* Les bordures, dans le menu */
.metbd{width:16px;height:16px;flex:none;position:relative}
.metbd-toutes{border:1.5px solid #555;background:linear-gradient(#555,#555) center/1.5px 100% no-repeat,linear-gradient(#555,#555) center/100% 1.5px no-repeat}
.metbd-ext{border:1.5px solid #555}
.metbd-lignes{background:linear-gradient(#555,#555) top/100% 1.5px no-repeat,linear-gradient(#555,#555) center/100% 1.5px no-repeat,linear-gradient(#555,#555) bottom/100% 1.5px no-repeat}
.metbd-aucune{border:1px dashed #ccc}
.mewarn .ico{width:15px;height:15px;color:var(--jaune)}
.mewarn .bt{width:240px;white-space:normal;font-weight:500;text-align:left}
.megfst{display:flex;align-items:center;gap:8px;font-size:12.5px;border-radius:9px;padding:7px 10px;margin:-2px 0 10px}
.megfst .ico{width:15px;height:15px}
.megfst.ok{background:var(--vert-pale);color:var(--vert-fonce)}.megfst.wa{background:var(--jaune-pale);color:var(--jaune)}
.megfplus{display:flex;justify-content:center;padding:14px 0 4px}

/* ══ v14.242 · éditeur : ligne d'en-tête et de pied, tabulations ══ */
.mehf.medoc:not(.clone):hover,.mehf.medoc:focus,.mehf.medoc.mehfon{outline:none}
.mehfsep{position:absolute;left:0;right:0;height:0;border-top:1px dashed #DDD3C6;z-index:1;pointer-events:none}
.mehfsep span{position:absolute;right:14px;top:-8px;font:700 9px var(--f-ui);letter-spacing:.06em;text-transform:uppercase;color:#B3A696;
  background:#fff;padding:0 6px;line-height:15px;white-space:nowrap}
.mehfsep.on{border-top-color:var(--terra)}
.mehfsep.on span{color:var(--terra-h)}
.medoc{tab-size:48px}
.medoc .edtab{white-space:pre}
.mehf .edtab{display:inline-block;height:1px;vertical-align:baseline}
.mehf p:has(.edtab),.mehf div:has(> .edtab){text-align:left!important}
.memarq .medoc .edtab{position:relative}
.memarq .medoc .edtab::before{content:'→';position:absolute;left:50%;top:50%;transform:translate(-50%,-50%);line-height:1;
  font-size:.8em;color:#A08F7B;pointer-events:none}
.memarq .mehf .edtab::before{top:auto;bottom:0;transform:translateX(-50%)}
.meregle{position:absolute;top:14px;height:10px;border-top:1px solid #D8CDBF;z-index:3;display:none;pointer-events:none;overflow:hidden}
.memarq .meregle{display:block}
.meregle i{position:absolute;top:0;width:0;height:6px;border-left:1px solid #B3A696}
.meregle i:first-child{height:9px;border-left-color:var(--terra)}
.memarql{display:flex;align-items:center;justify-content:space-between;gap:10px;padding:6px 9px;font-size:13px;font-weight:600;color:var(--encre);cursor:pointer}
.memarql .sw .swt{--swh:18px;width:32px}
.memarql .sw input:checked+.swt::after{transform:translateX(14px)}

/* ══ v14.243 · pointeuse : accueil, journée vide, sans logo ══ */
/* L'accueil d'une tablette neuve : une carte au centre, fond crème
   réchauffé de deux halos, sigle en filigrane, version en bas. */
.baso{position:fixed;inset:0;display:flex;align-items:center;justify-content:center;overflow:hidden;
  background:#F7F4ED;padding:24px;box-sizing:border-box}
.baso1,.baso2{position:absolute;border-radius:50%;pointer-events:none}
.baso1{width:620px;height:620px;left:-180px;top:-240px;background:radial-gradient(circle,#FCE0D5 0%,rgba(252,224,213,0) 68%)}
.baso2{width:700px;height:700px;right:-200px;bottom:-300px;background:radial-gradient(circle,#FFEDC4 0%,rgba(255,237,196,0) 68%)}
.basosg{position:absolute;height:120%;right:-6%;top:-10%;opacity:.05;pointer-events:none}
.basoc{position:relative;background:#fff;border:1px solid var(--ligne);border-radius:26px;padding:44px 56px 40px;
  text-align:center;box-shadow:0 30px 60px -30px rgba(62,43,26,.35);max-width:560px;box-sizing:border-box}
.basoc .basologo{height:46px;width:auto;display:block;margin:0 auto 30px}
.basoc h1{font:700 30px var(--f-titre);color:var(--encre);margin:0 0 22px;letter-spacing:-.01em}
.basoc .bapperr{margin:0 0 16px}
.basof{display:flex;gap:10px;justify-content:center;margin:0 0 18px}
.basocode{width:250px;height:60px;box-sizing:border-box;border:2px solid var(--ligne-2);border-radius:14px;background:#fff;
  text-align:center;font:700 28px var(--f-ui);letter-spacing:.18em;color:var(--encre);outline:none;padding:0 10px}
.basocode:focus{border-color:var(--terra);box-shadow:0 0 0 4px var(--terra-pale)}
.basocode::placeholder{color:#C9BDAC}
.basobtn{height:60px;padding:0 26px;border:0;border-radius:14px;background:var(--terra);color:#fff;
  font:700 17px var(--f-ui);cursor:pointer}
.basobtn:active{background:var(--terra-h)}
.basotxt{margin:0 auto;max-width:430px;font-size:15px;line-height:1.55;color:var(--encre-2)}
.basotxt b{color:var(--encre)}
.basover{position:absolute;left:0;right:0;bottom:22px;text-align:center;font-size:12.5px;color:var(--muet)}
@media (max-width:640px){.basoc{padding:32px 22px}.basof{flex-direction:column;align-items:center}.basocode{width:100%}}
/* La journée vide : l'état vide de l'application (.neant), à la
   taille d'une borne — une phrase grise sous l'icône pâle du sujet,
   au centre de l'écran. La recherche reste au-dessus. */
.bmain .bvide{position:absolute;inset:0;display:flex;flex-direction:column;align-items:center;justify-content:center;
  gap:14px;padding:0;font-size:20px;line-height:1.4;color:var(--muet);pointer-events:none}
.bmain .bvide[hidden],.bfiltres[hidden]{display:none}
.bvide .bvic,.bpjvide .bvic{width:44px;height:44px;stroke-width:1.4;opacity:.5;display:block}
.bpjvide{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:12px;
  padding:60px 20px;font-size:17px;line-height:1.4;opacity:1;color:var(--muet)}
body.borne.theme-sombre .bpjvide{color:#8C7B64}

/* ══ v14.244 · pointeuse : la veille sur le fond de l'accueil ══ */
/* Toujours claire, quel que soit le thème de la borne : c'est l'écran
   qu'on voit de loin, et celui de l'accueil d'une tablette neuve. */
body.borne .bveille{background:#F7F4ED;color:var(--encre);overflow:hidden}
.bveille > :not(.baso1):not(.baso2):not(.basosg){position:relative}
.bveille .bvlogo{max-width:340px;max-height:110px}
.bveille .bvmq{height:64px;max-height:none;width:auto}
body.borne .bveille .bvc{background:#fff;border-color:var(--ligne);box-shadow:0 12px 30px -20px rgba(62,43,26,.35)}
body.borne .bveille .bvc.alerte{background:#FBE7E8;border-color:#F0C9CB}

/* ══ v14.245 · pointeuse : les boutons noirs passent au corail ══ */
/* Comme « Associer » sur l'accueil : le filtre actif, l'onglet actif et
   « + Shift non planifié », dans les deux thèmes. */
body.borne .bfil.on,body.borne.theme-sombre .bfil.on,body.borne .bfil.dr,
body.borne .bponglets button.on,body.borne.theme-clair .bponglets button.on{background:var(--terra);color:#fff;border-color:var(--terra)}
body.borne .bfil.dr:active,body.borne .bfil.on:active{background:var(--terra-h)}
body.borne .bfil.on span,body.borne .bfil.dr span{color:#fff;opacity:.85}

/* ══ v14.247 · L'image sélectionnée, le recadrage ══ */
.medoc img{cursor:pointer}
.meimg{position:absolute;z-index:7;outline:2px solid var(--terra);pointer-events:none}
.meimg[hidden],.mecrop[hidden]{display:none}
.meimg i,.mecropf i{position:absolute;width:10px;height:10px;background:#fff;border:1.5px solid var(--terra);border-radius:2px;pointer-events:auto}
.meimg i[data-h=nw],.mecropf i[data-h=nw]{left:-6px;top:-6px;cursor:nwse-resize}
.meimg i[data-h=ne],.mecropf i[data-h=ne]{right:-6px;top:-6px;cursor:nesw-resize}
.meimg i[data-h=sw],.mecropf i[data-h=sw]{left:-6px;bottom:-6px;cursor:nesw-resize}
.meimg i[data-h=se],.mecropf i[data-h=se]{right:-6px;bottom:-6px;cursor:nwse-resize}
.meimg i[data-h=e]{right:-6px;top:calc(50% - 5px);cursor:ew-resize}
.meimg i[data-h=w]{left:-6px;top:calc(50% - 5px);cursor:ew-resize}
.meimgd{position:absolute;right:6px;bottom:6px;background:rgba(31,25,21,.82);color:#fff;font:600 10.5px var(--f-ui);
  padding:2px 7px;border-radius:99px;opacity:0;transition:opacity .15s;white-space:nowrap}
.meimg.glisse .meimgd{opacity:1}
.mecrop{position:absolute;z-index:7;overflow:hidden;cursor:default}
.mecropf{position:absolute;box-shadow:0 0 0 9999px rgba(31,25,21,.55);outline:1.5px solid #fff;cursor:move;
  background-image:linear-gradient(rgba(255,255,255,.45),rgba(255,255,255,.45)),linear-gradient(rgba(255,255,255,.45),rgba(255,255,255,.45)),
  linear-gradient(rgba(255,255,255,.45),rgba(255,255,255,.45)),linear-gradient(rgba(255,255,255,.45),rgba(255,255,255,.45));
  background-size:1px 100%,1px 100%,100% 1px,100% 1px;background-position:33.33% 0,66.66% 0,0 33.33%,0 66.66%;background-repeat:no-repeat}
.mecropf i{border-color:#fff;background:var(--terra);width:12px;height:12px}
/* Dans le cadre : au bord de l'image, une poignée dehors serait coupée. */
.mecropf i[data-h=nw]{left:0;top:0}.mecropf i[data-h=ne]{right:0;top:0}
.mecropf i[data-h=sw]{left:0;bottom:0}.mecropf i[data-h=se]{right:0;bottom:0}
.meibar{z-index:10}
.meibar .mebsep{height:18px;margin:0 3px}
.meibar button.meico{padding:0 6px}
.meibar button.act .ico{color:var(--terra)}
.meiseg{display:inline-flex;gap:2px;background:var(--surface-2);border:1px solid var(--ligne);border-radius:8px;padding:2px}
.meibar .meiseg button{height:22px;padding:0 9px;font-weight:600;color:var(--muet)}
.meibar .meiseg button.on{background:var(--carte);box-shadow:var(--ombre);color:var(--encre)}
.meibar button.meok{background:var(--terra);color:#fff}
.meibar button.meok:hover{background:var(--terra-h)}
.segr.dis{opacity:.45;pointer-events:none}

/* ══ v14.248 · champs de page, veille sombre, onglet Pointer ══ */
/* Le numéro et le nombre de pages : des variables, dessinées comme telles dans l'éditeur. */
#me_fe .pgno[data-pg]{background:var(--terra-pale);color:var(--terra-h);border-radius:4px;padding:0 3px;font-weight:600}
/* La pointeuse de la veille, sous le logo. */
.bveille .bvposte{display:inline-flex;align-items:center;gap:8px;padding:7px 16px;border-radius:99px;
  background:rgba(255,255,255,.75);border:1px solid var(--ligne);font:600 15px var(--f-ui);color:var(--encre-2)}
.bveille .bvposte .ico{width:17px;height:17px;color:var(--terra)}
.bveille .bvmq-b{display:none}
/* La veille suit le thème de la borne : en sombre, le fond sombre de la
   borne, deux halos chauds très bas, le sigle à peine visible. */
body.borne.theme-sombre .bveille{background:#1B140D;color:#F2EDE3}
body.borne.theme-sombre .bveille .baso1{background:radial-gradient(circle,rgba(233,102,70,.20) 0%,rgba(233,102,70,0) 68%)}
body.borne.theme-sombre .bveille .baso2{background:radial-gradient(circle,rgba(242,180,90,.13) 0%,rgba(242,180,90,0) 68%)}
body.borne.theme-sombre .bveille .basosg{opacity:.06;filter:grayscale(1) brightness(2.2)}
body.borne.theme-sombre .bveille .bvc{background:rgba(255,255,255,.06);border-color:rgba(255,255,255,.12);box-shadow:none}
body.borne.theme-sombre .bveille .bvc.alerte{background:rgba(214,92,99,.18);border-color:rgba(214,92,99,.4)}
body.borne.theme-sombre .bveille .bvposte{background:rgba(255,255,255,.06);border-color:rgba(255,255,255,.12);color:#D9CFBF}
/* Un logo d'établissement est pensé pour un fond clair : il garde sa plaque. */
body.borne.theme-sombre .bveille .bvetab{background:#F7F4ED;padding:14px 22px;border-radius:18px;box-sizing:content-box}
/* Le logo expéRHia : la version blanche si elle existe, sinon la couleur sur plaque claire. */
body.borne.theme-sombre .bveille .bvmq-b{display:block}
body.borne.theme-sombre .bveille .bvmq-c:has(+ .bvmq-b){display:none}
body.borne.theme-sombre .bveille .bvmq-c:not(:has(+ .bvmq-b)){background:#F7F4ED;padding:14px 22px;border-radius:18px;box-sizing:content-box}

/* ══ v14.249 · pointeuse : l'onglet « Tâches » ══ */
.bponglets .btkn{font-style:normal;font-size:12px;font-weight:700;min-width:20px;height:20px;padding:0 6px;border-radius:99px;
  display:inline-flex;align-items:center;justify-content:center;background:var(--terra-pale);color:var(--terra-h);margin-left:6px}
.bponglets .btkn[hidden]{display:none}
body.borne .bponglets button.on .btkn{background:rgba(255,255,255,.25);color:#fff}
body.borne.theme-sombre .bponglets .btkn{background:rgba(233,102,70,.2);color:#F29A80}
body.borne.theme-sombre .bponglets button.on .btkn{background:rgba(255,255,255,.25);color:#fff}
.btaches{position:relative;display:flex;flex-direction:column;gap:14px;flex:1;min-height:0}
.btaches[hidden]{display:none}
.btofils{display:flex;gap:8px;flex-wrap:wrap}
.btogs{flex:1;min-height:0;overflow:auto;display:flex;flex-direction:column;gap:18px;padding-bottom:90px}
.btog{display:flex;flex-direction:column;gap:8px}
.btogh{display:flex;align-items:center;gap:9px;font-size:13px;font-weight:700;letter-spacing:.04em;text-transform:uppercase;color:var(--muet);padding:0 4px}
.btogh i{width:10px;height:10px;border-radius:50%;background:var(--ligne-2);flex:none}
.btogh b{color:var(--encre-2)}
.btogh span{margin-left:auto;font-variant-numeric:tabular-nums;letter-spacing:0}
.btot{display:flex;align-items:center;gap:16px;width:100%;min-height:74px;padding:12px 18px;background:#fff;border:1px solid var(--ligne-2);
  border-radius:18px;cursor:pointer;text-align:left;font-family:var(--f-ui);color:var(--encre)}
.btot:active{border-color:var(--terra)}
.btoc{width:40px;height:40px;flex:none;border-radius:50%;border:2.5px solid var(--ligne-2);display:flex;align-items:center;justify-content:center}
.btoc .ico{width:22px;height:22px;color:#fff;opacity:0}
.btot.ok{background:transparent;border-style:dashed;cursor:default}
.btot.ok .btoc{background:#4A7C59;border-color:#4A7C59}.btot.ok .btoc .ico{opacity:1}
.btot.ok .btotx b{text-decoration:line-through;opacity:.6}
.btot.mot .btoc{border-style:dashed}
.btot.vient{border-color:#4A7C59;border-style:solid;box-shadow:0 0 0 3px #E3EFE6}
.btotx{flex:1;min-width:0;display:flex;flex-direction:column;gap:5px}
.btotx b{font-size:18px;font-weight:600;line-height:1.3}
.btosous{display:flex;flex-wrap:wrap;align-items:center;gap:6px 14px;font-size:13.5px;color:var(--muet)}
.btoh{display:inline-flex;align-items:center;gap:5px;font-weight:600;color:var(--encre-2)}
.btoh .ico,.btopj .ico{width:15px;height:15px}
.btopj{display:inline-flex;align-items:center;gap:3px}
.btofp{color:#4A7C59;font-weight:600}
.btoorph{font-size:12px;font-weight:700;padding:3px 9px;border-radius:99px;background:#FDF0E0;color:#A0621B}
.btoqui{display:inline-flex;align-items:center;gap:6px}
.btoqui i{font-style:normal}
.btoav{display:inline-flex}
.btoav .bssav{width:24px;height:24px;font-size:10px;line-height:24px;text-align:center}
.btoqui .btoav+.btoav{margin-left:-10px}
.btoqui .btoav+.btoav .bssav{box-shadow:0 0 0 2px #fff}
.btomotl{display:inline-flex;align-items:center;gap:6px;font-size:12.5px;font-weight:600;color:var(--muet);flex:none}
.btomotl .ico{width:15px;height:15px}
.btaches .btovide{position:absolute;inset:0}
.btosolo{gap:18px}
.btosolo h1{margin:0}
.btops{display:flex;gap:14px;flex-wrap:wrap;justify-content:center;max-width:760px}
.btop{width:170px;display:flex;flex-direction:column;align-items:center;gap:8px;padding:22px 12px 18px;background:#fff;
  border:1px solid var(--ligne-2);border-radius:20px;cursor:pointer;font-family:var(--f-ui);color:var(--encre)}
.btop:active{border-color:var(--terra)}
.btop .bavg{width:64px;height:64px;font-size:20px}
.btop b{font-size:18px}.btop i{font-style:normal;font-size:12px;font-weight:700;letter-spacing:.05em;color:var(--muet)}
.btop.off{opacity:.45;cursor:default}
.btop.off i{letter-spacing:0;font-weight:600}
.btomot{width:100%;max-width:560px;min-height:110px;resize:none;font-size:17px;line-height:1.45}
.btotoast{position:absolute;left:50%;bottom:18px;transform:translateX(-50%);display:flex;align-items:center;gap:12px;padding:14px 20px;
  border-radius:16px;background:#2F4F3A;color:#fff;font-size:14.5px;box-shadow:0 18px 40px -18px rgba(0,0,0,.5);white-space:nowrap;
  max-width:calc(100% - 20px);overflow:hidden;text-overflow:ellipsis;z-index:3}
.btotoast .ico{width:22px;height:22px;flex:none}
.btotoast b{margin-right:6px}
body.borne.theme-sombre .btot{background:#2C2418;border-color:rgba(255,255,255,.1);color:#F2EDE3}
body.borne.theme-sombre .btot.ok{background:transparent}
body.borne.theme-sombre .btot.vient{border-color:#8FC49C;box-shadow:0 0 0 3px rgba(143,196,156,.18)}
body.borne.theme-sombre .btogh b,body.borne.theme-sombre .btoh{color:#DCCDB4}
body.borne.theme-sombre .btosous,body.borne.theme-sombre .btogh,body.borne.theme-sombre .btomotl{color:#9C8D78}
body.borne.theme-sombre .btoc{border-color:rgba(255,255,255,.28)}
body.borne.theme-sombre .btoorph{background:rgba(233,162,59,.16);color:#F0B866}
body.borne.theme-sombre .btofp{color:#8FC49C}
body.borne.theme-sombre .btoqui .btoav+.btoav .bssav{box-shadow:0 0 0 2px #2C2418}
body.borne.theme-sombre .btop{background:#2C2418;border-color:rgba(255,255,255,.1);color:#F2EDE3}
@media (max-width:900px){.btot{min-height:64px;padding:10px 14px;gap:12px}.btotx b{font-size:16px}.btoc{width:34px;height:34px}}

/* ══ v14.250 · les variables de page, dans la barre de la bande ══ */
.mehfbar button.mehfvar{background:var(--terra-pale);color:var(--terra-h);margin:0 1px}
.mehfbar button.mehfvar .ico{color:var(--terra)}
.mehfbar button.mehfvar:hover{background:#F9DDD1}

/* ═══ v14.267 · Pointeuse : pas de case bleue au toucher ═══
   Chrome et le WebView d'Android dessinent un rectangle bleuté sur
   ce qu'on touche, et parfois un contour de focus sur le bouton qui
   reste « actif ». Sur une borne au doigt, c'est du bruit : chaque
   bouton a déjà son état appuyé. */
body.borne, body.borne *{-webkit-tap-highlight-color:transparent}
body.borne button:focus, body.borne a:focus, body.borne [role="button"]:focus,
body.borne input:focus:not([type="text"]):not([type="password"]):not([type="tel"]):not([type="number"]){outline:none}

/* ══ v14.268 · pointeuse : tâches en veille, réglages, hors ligne ══ */
/* Veille : ce qui reste à faire, en corail pâle. */
.bvc.tk{background:rgba(233,102,70,.16);border-color:rgba(233,102,70,.4)}
.bvc.tk b{color:#F08C70}
body.borne.theme-clair .bvc.tk,
body.borne .bveille .bvc.tk{background:#FCEDE7;border-color:#F4CDBF}
body.borne.theme-clair .bvc.tk b,
body.borne .bveille .bvc.tk b{color:var(--terra-h)}
body.borne.theme-sombre .bveille .bvc.tk{background:rgba(233,102,70,.16);border-color:rgba(233,102,70,.4)}
body.borne.theme-sombre .bveille .bvc.tk b{color:#F08C70}

/* Le thème et l'icône des réglages : une ligne, une hauteur. */
.bregl{display:flex;gap:8px;align-items:stretch}
.bregl .bthemebtn{flex:1;width:auto;min-width:0}
.bregbtn{flex:none;display:flex;align-items:center;justify-content:center;width:44px;padding:0;
  border:1px solid rgba(255,255,255,.2);background:transparent;color:inherit;border-radius:11px;
  cursor:pointer;opacity:.75;transition:opacity .12s}
.bregbtn:hover{opacity:1}
.bregbtn .ico{width:17px;height:17px}
body.borne.theme-clair .bregbtn{border-color:var(--ligne-2);color:var(--encre-2)}
body.borne.bflux .bregl{display:none}
@media(max-width:820px){ .bregl{display:none} }

/* Le panneau. */
.breg .bregkv{width:100%;max-width:480px;display:flex;flex-direction:column}
.breg .bregkv > div{display:flex;justify-content:space-between;gap:14px;padding:11px 2px;
  border-top:1px solid rgba(127,127,127,.22);font-size:15px}
.breg .bregkv > div:last-child{border-bottom:1px solid rgba(127,127,127,.22)}
.breg .bregkv span{opacity:.6}
.breg .bregkv b{font-weight:600;text-align:right}
.breg .bregacts{width:100%;max-width:480px;display:flex;flex-direction:column;gap:10px}
.breg .bregacts button{display:flex;align-items:center;gap:14px;text-align:left;width:100%;
  border:1px solid rgba(127,127,127,.28);background:rgba(127,127,127,.07);color:inherit;
  border-radius:14px;padding:14px 16px;font-family:var(--f-ui);cursor:pointer}
.breg .bregacts button .ico{width:22px;height:22px;flex:none}
.breg .bregacts b{display:block;font-size:16px;font-weight:600}
.breg .bregacts i{display:block;font-style:normal;font-size:12.5px;opacity:.65;margin-top:2px}
.breg .bregacts button.d{color:#D65C63;border-color:rgba(214,92,99,.45);background:rgba(214,92,99,.1)}
body.borne.theme-clair .breg .bregacts button.d{color:var(--rouge);border-color:#F1CACC;background:var(--rouge-pale)}

/* Émargement : ce que la pointeuse hors ligne a tranché. */
.anomalie.an-hl{background:var(--jaune-pale);color:var(--jaune-fonce)}
#s-hl .hlvu{margin-left:auto}
#s-hl .att .btn{padding:5px 12px;font-size:13px}

/* ═══ v15.1 · Planning › Analyse : chiffre d'affaires, heures, productivité ═══
   La fenêtre est celle de « Dupliquer la semaine » (.mmbox.etp), élargie ;
   les tuiles celles de Coûts et trésorerie (.kpis), le graphique aussi
   (.ctgw / .ctg). Seules les pièces propres à l'analyse sont ici. */
/* La barre d'outils est pleine à 1440 px : le libellé cède, l'icône reste. */
@media (max-width:1560px){.plana-l{display:none}#plAnaBtn{padding-left:10px;padding-right:10px}}
.mmbox.etp.caf-boite{width:min(1180px,96vw);max-height:92vh}
.mmbox.etp.caf-saisie{width:min(1080px,96vw)}
.mmbox.etp .caf-corps{display:grid;gap:16px;align-content:start;grid-auto-rows:max-content}
.caf-corps .kpis{margin-bottom:0}
.caf-corps .card{margin:0}
.caf-g2{display:grid;grid-template-columns:repeat(auto-fit,minmax(380px,1fr));gap:16px;align-items:start}
.caf-g2>.card{min-width:0}
@media (max-width:900px){.caf-corps .kpis{grid-template-columns:repeat(2,1fr)}}
.caf-pt{display:inline-block;width:10px;height:10px;border-radius:3px;vertical-align:-1px;margin:0 5px 0 10px}
.caf-pt:first-child{margin-left:0}
.caf-j{cursor:default}
.caf-j:hover .cth{fill:var(--surface-2)}
.tA tfoot tr.caf-tot td{font-weight:700;border-top:1px solid var(--ligne);background:var(--surface-2)}
.tA tr.caf-on td{background:var(--terra-pale)}
.tA td.caf-eqs{white-space:normal}
.tA tr.caf-titre td{background:var(--surface-2);font-size:11px;font-weight:700;letter-spacing:.06em;text-transform:uppercase;color:var(--encre-2);padding-top:8px;padding-bottom:8px}
.tA td.caf-sous{padding-left:28px}
.tA td.caf-man{background:var(--jaune-pale)}
.fi.caf-in{width:88px;height:32px;padding:0 8px;text-align:right;font-variant-numeric:tabular-nums}
.tA td.caf-man .fi.caf-in{border-color:var(--jaune)}
.mmbox.caf-saisie .tA td,.mmbox.caf-saisie .tA th{white-space:nowrap}
.tA tr.caf-parent td{background:var(--surface-2)}
.tA tr.caf-parent .nomcell{font-weight:700}
.tA tr.caf-parent .itgsub{display:block;font-weight:500}
.caf-chips{flex-wrap:wrap;align-items:center}
.caf-chips .fi.sm{width:auto;height:30px;padding-top:0;padding-bottom:0}
.caf-pad{padding:16px 18px}
.caf-g2 .tA{min-width:0}
/* Le tiroir d'une prime sur le CA (v15.1) */
.caf-paliers{display:flex;flex-direction:column;gap:8px}
.caf-pal{display:grid;grid-template-columns:minmax(0,1fr) minmax(0,1fr) auto;gap:8px;align-items:end}
.caf-pal .fg{margin:0}
.caf-palx{height:40px}
.tA td.caf-resume{background:var(--surface-2);white-space:normal;font-size:12px;color:var(--encre-2)}
.eopt.off{opacity:.55;cursor:not-allowed}

/* ═══ v15.1.21 · lot B ═══
   L'état du produit : un incident ou une maintenance en cours (bandeau_etat.php). On le ferme ;
   il revient à la mise à jour suivante. */
.bandetat{display:flex;align-items:center;gap:11px;padding:9px 18px;font-size:12.5px;background:var(--jaune-pale);color:var(--jaune);border-bottom:1px solid transparent}
.bandetat[hidden]{display:none}
.bandetat.pert{background:#FCEBDD;color:#A2541E}
.bandetat.panne{background:var(--rouge-pale);color:var(--rouge)}
.bandetat.info{background:var(--bleu-pale);color:var(--bleu)}
.bandetat>.ico,.bandetat>svg{width:16px;height:16px;flex:none}
.bandetat span{flex:1;min-width:0;color:var(--encre-2)}
.bandetat b{font-family:var(--f-titre);font-weight:700;color:var(--encre)}
.bandetat a{font-weight:600;color:inherit;text-decoration:underline;white-space:nowrap}
.bandetat .x{border:0;background:none;font-size:18px;line-height:1;color:inherit;cursor:pointer;padding:2px 6px;border-radius:7px}
.bandetat .x:hover{background:rgba(0,0,0,.06)}
/* Un article écrit en blocs dans le Cockpit (corps_html, le rendu du centre d'aide) dans le volet « ? » */
.aidcorps .etapes{counter-reset:aidetape;margin:8px 0 14px}
.aidcorps .etape{display:flex;gap:13px;padding:10px 0;border-bottom:1px solid var(--ligne)}
.aidcorps .etape:last-child{border-bottom:0}
.aidcorps .etape::before{counter-increment:aidetape;content:counter(aidetape);width:26px;height:26px;border-radius:50%;background:var(--terra);color:#fff;font:700 12px var(--f-ui);display:flex;align-items:center;justify-content:center;flex:none;margin-top:1px}
.aidcorps .etape>div>b{display:block;color:var(--encre);margin-bottom:2px}
.aidcorps .etape p{margin:0}
.aidcorps .enc{border-left:3px solid var(--bleu);background:var(--bleu-pale);border-radius:0 10px 10px 0;padding:11px 14px;margin:4px 0 14px;font-size:13px;line-height:1.65;display:flex;gap:10px;color:var(--encre-2)}
.aidcorps .enc>svg{width:16px;height:16px;flex:none;margin-top:3px;stroke:var(--bleu);fill:none;stroke-width:2}
.aidcorps .enc.attention{border-color:var(--jaune);background:var(--jaune-pale)}.aidcorps .enc.attention>svg{stroke:var(--jaune)}
.aidcorps .enc.astuce{border-color:var(--vert);background:var(--vert-pale)}.aidcorps .enc.astuce>svg{stroke:var(--vert)}
.aidcorps .enc b.et{display:block;color:var(--encre)}
.aidcorps h2 .ancre,.aidcorps h3 .ancre{display:none}
.aidcorps .tbl-d{overflow-x:auto;margin:6px 0 14px}
.aidcorps .tbl{width:100%;border-collapse:separate;border-spacing:0;font-size:13px;border:1px solid var(--ligne);border-radius:10px;overflow:hidden}
.aidcorps .tbl th{background:var(--surface-2);text-align:left;padding:8px 12px;font:600 11px var(--f-ui);color:var(--muet);letter-spacing:.05em;text-transform:uppercase;border-bottom:1px solid var(--ligne)}
.aidcorps .tbl td{padding:8px 12px;border-bottom:1px solid var(--ligne);vertical-align:top}
.aidcorps .tbl tr:last-child td{border-bottom:0}
.aidcorps .faq{border:1px solid var(--ligne);border-radius:12px;overflow:hidden;margin-top:6px;background:var(--carte)}
.aidcorps .faq details{border-bottom:1px solid var(--ligne)}.aidcorps .faq details:last-child{border-bottom:0}
.aidcorps .faq summary{cursor:pointer;padding:12px 14px;font-size:13px;font-weight:600;color:var(--encre)}
.aidcorps .faq p{padding:0 14px 12px;margin:0}
.aidcorps .appbtn{display:flex;gap:12px;align-items:center;margin:8px 0 14px;border:1px solid var(--ligne);border-radius:12px;padding:10px 12px;background:var(--carte);text-decoration:none;color:inherit}
.aidcorps .appbtn>svg{width:20px;height:20px;stroke:var(--terra);fill:none;stroke-width:1.8;flex:none}
.aidcorps .appbtn .t{flex:1;min-width:0;font-size:11.5px;color:var(--muet)}.aidcorps .appbtn .t b{display:block;font-size:13px;color:var(--encre)}
.aidcorps .appbtn .b{display:inline-flex;align-items:center;gap:5px;padding:5px 12px;border-radius:9px;background:var(--terra);color:#fff;font-size:12px;font-weight:600;text-decoration:none}
.aidcorps .appbtn .b svg{width:13px;height:13px;stroke:#fff;fill:none;stroke-width:2}
.aidcorps .aidcap a{font-size:12px}

/* ═══ v15.1.24 · L'AIDE DANS L'APPLICATION (lot C) ═══════════════════
   1 · la visite : un voile percé autour du repère (.gvoile) et une bulle
   (.gbulle), posés par assets/guide.js sur les éléments data-guide ;
   2 · le volet « ? » (.gvo) : l'incident en cours, revoir la visite, la
   recherche, les articles de l'écran pour ce rôle, le support. */
.gvoile{position:fixed;z-index:210;border-radius:12px;pointer-events:none;
  box-shadow:0 0 0 4000px rgba(31,25,21,.46),0 0 0 3px var(--terra);transition:left .25s ease,top .25s ease,width .25s ease,height .25s ease}
.gvoile.plein{left:50%!important;top:50%!important;width:0!important;height:0!important;box-shadow:0 0 0 4000px rgba(31,25,21,.46)}
.gbulle{position:fixed;z-index:211;width:min(320px,calc(100vw - 24px));background:var(--carte);color:var(--encre);border-radius:14px;
  box-shadow:0 18px 50px rgba(0,0,0,.25);padding:14px 16px;display:flex;flex-direction:column;gap:6px;transition:top .25s ease,left .25s ease}
.gbulle[hidden]{display:none}
.gbulle::before{content:"";position:absolute;width:12px;height:12px;background:inherit;transform:rotate(45deg);top:-6px;left:var(--fl,40px)}
.gbulle.dessus::before{top:auto;bottom:-6px}
.gbulle.centre,.gbulle.bas{left:50%!important;transform:translateX(-50%)}
.gbulle.centre{top:30%!important}
.gbulle.bas{top:auto!important;bottom:calc(12px + env(safe-area-inset-bottom,0px))}
.gbulle.centre::before,.gbulle.bas::before{display:none}
.gb-h{display:flex;align-items:center;font-size:11.5px;color:var(--muet);font-weight:600}
.gb-passer{margin-left:auto;border:0;background:none;color:var(--muet);font-size:11.5px;text-decoration:underline;cursor:pointer;padding:2px}
.gbulle b{font:600 15px var(--f-titre);color:var(--encre)}
.gbulle p{margin:0;font-size:13px;line-height:1.5;color:var(--encre-2)}
.gb-b{display:flex;align-items:center;gap:6px;margin-top:6px}
.gb-pts{display:flex;gap:4px;margin-right:auto}
.gb-pts i{width:6px;height:6px;border-radius:50%;background:var(--ligne-2)}
.gb-pts i.on{background:var(--terra);width:16px;border-radius:3px}
.gb-ab{border:0;border-radius:9px;padding:6px 12px;font-size:12.5px;font-weight:600;background:var(--terra);color:#fff;cursor:pointer;text-decoration:none}
.gb-ab.g{background:none;color:var(--encre-2)}
.gb-ab[hidden]{display:none}
@media (prefers-reduced-motion:reduce){.gvoile,.gbulle{transition:none}}
/* le volet « ? » */
.gvo{display:flex;flex-direction:column;gap:12px}
.gvo-inc{display:flex;gap:10px;border-radius:12px;padding:10px 12px;font-size:12.5px;background:var(--jaune-pale);color:var(--encre);text-decoration:none}
.gvo-inc.panne{background:var(--rouge-pale)}.gvo-inc.info{background:var(--bleu-pale)}
.gvo-inc svg{width:16px;height:16px;flex:none;margin-top:1px;fill:none;stroke:var(--jaune);stroke-width:2}
.gvo-inc.panne svg{stroke:var(--rouge)}.gvo-inc.info svg{stroke:var(--bleu)}
.gvo-inc b{display:block;font-size:13px}
.gvo-inc u{display:block;margin-top:2px;color:var(--encre-2)}
.gvo-visite{display:flex;align-items:center;gap:12px;border:1px solid var(--ligne-2);background:var(--terra-pale);border-radius:12px;padding:11px 14px;
  text-align:left;color:var(--encre);cursor:pointer;font:inherit}
.gvo-visite:hover{border-color:var(--terra)}
.gvo-visite svg{width:18px;height:18px;flex:none;fill:var(--terra)}
.gvo-visite b{display:block;font-size:13.5px}.gvo-visite small{display:block;font-size:12px;color:var(--encre-2)}
.gvo-ch{display:flex;align-items:center;gap:8px;border:1px solid var(--ligne-2);border-radius:10px;padding:7px 10px;background:var(--carte)}
.gvo-ch svg{width:15px;height:15px;fill:none;stroke:var(--muet);stroke-width:2;flex:none}
.gvo-ch input{border:0;outline:0;flex:1;min-width:0;background:none;font-size:13px;color:var(--encre)}
.gvo-res{display:flex;flex-direction:column;margin-top:6px;border:1px solid var(--ligne);border-radius:10px;overflow:hidden}
.gvo-res[hidden]{display:none}
.gvo-res a{display:block;padding:8px 11px;border-bottom:1px solid var(--ligne);font-size:13px;color:var(--encre);text-decoration:none}
.gvo-res a:last-child{border-bottom:0}.gvo-res a:hover{background:var(--surface-2)}
.gvo-res a span{display:block;font-size:11.5px;color:var(--muet)}
.gvo-res .gvo-vide{padding:8px 11px}
.gvo-et{font:700 10.5px var(--f-ui);letter-spacing:.07em;text-transform:uppercase;color:var(--muet);margin:4px 0 -4px}
.gvo-vide{font-size:12.5px;color:var(--muet);margin:0}
.gvo-arts{display:flex;flex-direction:column}
.gvo-art{border-bottom:1px solid var(--ligne)}
.gvo-art:last-child{border-bottom:0}
.gvo-art summary{display:flex;gap:10px;align-items:flex-start;padding:9px 0;font-size:13.5px;font-weight:600;color:var(--encre);cursor:pointer;list-style:none}
.gvo-art summary::-webkit-details-marker{display:none}
.gvo-art summary svg{width:15px;height:15px;flex:none;margin-top:2px;fill:none;stroke:var(--terra);stroke-width:2}
.gvo-art summary small{display:block;font-weight:400;color:var(--muet);font-size:12px}
.gvo-corps{padding:2px 0 12px 25px}
.gvo-ouvrir{display:inline-block;margin-top:6px;font-size:12.5px;font-weight:600;color:var(--terra);text-decoration:none}
.gvo-l{display:flex;flex-direction:column}
.gvo-l a,.gvo-l button{display:flex;gap:10px;align-items:center;padding:9px 0;border:0;border-bottom:1px solid var(--ligne);background:none;font:inherit;
  font-size:13.5px;font-weight:600;color:var(--encre);cursor:pointer;text-decoration:none;text-align:left}
.gvo-l>:last-child{border-bottom:0}
.gvo-l svg{width:15px;height:15px;fill:none;stroke:var(--terra);stroke-width:2}
