/* ev-base.css : socle (ancien <head>) — genere le 2026-09-03T21:40:22.437Z
   Concatenation, dans l'ordre exact du document, de 18 sources.
   Ne pas editer a la main sans relancer le harnais de non-regression. */

/* =============== evcx-css =============== */
/* AGENTS DESIGN — toast-critique : hiérarchie d'erreur plus marquée */
  .toast.error,.toast.critique,.toast.danger{background:linear-gradient(135deg,#7f1d1d,#dc2626)!important;color:#fff!important;border-left:4px solid #fef2f2!important;box-shadow:0 12px 32px rgba(220,38,38,.35)!important;font-weight:700}
  .toast.success{border-left:4px solid #10b981}

  /* AGENTS DESIGN — skeleton placeholder */
  .skeleton{position:relative;overflow:hidden;background:linear-gradient(90deg,#f1f5f9 0%,#e2e8f0 50%,#f1f5f9 100%);background-size:200% 100%;animation:agents-skel 1.2s ease-in-out infinite;border-radius:8px;min-height:14px}
  @keyframes agents-skel{0%{background-position:200% 0}100%{background-position:-200% 0}}

  /* AGENTS DESIGN — scrollbar fine moderne */
  *{scrollbar-width:thin;scrollbar-color:#94a3b8 transparent}
  *::-webkit-scrollbar{width:10px;height:10px}
  *::-webkit-scrollbar-thumb{background:#94a3b8;border-radius:8px}
  *::-webkit-scrollbar-thumb:hover{background:#64748b}
  *::-webkit-scrollbar-track{background:transparent}

/* Espace Client — navigation (barre latérale PC + barre du bas mobile) */
.evcx-side{display:flex;align-items:center;gap:11px;width:100%;background:none;border:0;border-radius:10px;padding:11px 12px;font-family:inherit;font-size:13px;font-weight:600;color:#475569;cursor:pointer;text-align:left}
.evcx-side:hover{background:#F8FAFC;color:#2D5A60}
.evcx-side.evcx-navactive{background:#2D5A60;color:#fff;font-weight:800}
.evcx-side .evcx-ic{font-size:16px;flex-shrink:0}
.evcx-sub{display:flex;align-items:center;gap:11px;width:100%;background:none;border:0;border-radius:10px;padding:9px 12px;font-family:inherit;font-size:11.5px;font-weight:600;color:#94A3B8;cursor:pointer;text-align:left}
.evcx-sub:hover{background:#F8FAFC;color:#2D5A60}
.evcx-sub .evcx-ic{font-size:15px;flex-shrink:0}
.evcx-bn{flex:1;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:2px;background:none;border:0;padding:7px 2px;font-family:inherit;cursor:pointer;color:#94A3B8}
.evcx-bn .evcx-ic{font-size:19px;line-height:1}
.evcx-bn .evcx-lb{font-size:9.5px;font-weight:700}
.evcx-bn.evcx-navactive{color:#2D5A60}
/* Pointage & Présence — chips de filtre */
.evp-chip,.evp-dchip{background:#fff;border:1px solid #E2E8F0;border-radius:999px;padding:6px 14px;font-size:12.5px;font-weight:600;color:#64748B;cursor:pointer;font-family:inherit}
.evp-chip:hover,.evp-dchip:hover{border-color:#2D5A60;color:#2D5A60}
.evp-chip.evp-chip-on,.evp-dchip.evp-chip-on{background:#2D5A60;border-color:#2D5A60;color:#fff}
.evp-row:hover td{background:#F8FAFC}
/* ── Espace Client — Bento Grid premium (style dashboard SaaS) ──
   .evh-wrap  : conteneur centré, plafonné à 1400px, padding 24px → 40px (lg).
   .evh-bento : 1 colonne en mobile ; dès 1024px (lg) → 3 colonnes —
                gauche col-span-1 (Portefeuille+Stats), droite col-span-2 (Comment ça marche).
   .evh-cmgrid: les 2 explications — 1 colonne, puis 2 colonnes dès 768px (md). */
.evh-wrap{width:100%;max-width:1400px;margin:0 auto;padding:24px;box-sizing:border-box;display:flex;flex-direction:column;gap:32px}
.evh-bento{display:grid;grid-template-columns:1fr;gap:24px;width:100%}
.evh-left{display:flex;flex-direction:column;gap:24px;width:100%;min-width:0}
.evh-cmgrid{display:grid;grid-template-columns:1fr;gap:32px;align-items:start}
@media (min-width:768px){ .evh-cmgrid{grid-template-columns:1fr 1fr} }
@media (min-width:1024px){
  .evh-wrap{padding:40px}
  .evh-bento{grid-template-columns:repeat(3,1fr);align-items:start}
  .evh-left{grid-column:span 1}
  .evh-right{grid-column:span 2;min-width:0}
}
/* Espace Client — le header mobile (#mb-mobile-header) occupe sa hauteur dans
   le <main> flex ; on retire le min-height:100% des pages pour que le calcul
   flex reste exact (header + page = hauteur du <main>, sans débordement). */
#mb-p-app main > .pg.on{min-height:0}
/* Pointage — barre d'action (boutons Entrée/Sortie) + point de présence clignotant */
.evp-actbtn{background:#fff;border:1px solid #E2E8F0;border-radius:9px;padding:9px 13px;font-size:12.5px;font-weight:700;color:#64748B;cursor:pointer;font-family:inherit;white-space:nowrap}
.evp-actbtn:hover{border-color:#2D5A60;color:#2D5A60}
.evp-actbtn.evp-act-on{background:#2D5A60;border-color:#2D5A60;color:#fff}
@keyframes evpPulse{0%,100%{opacity:1}50%{opacity:.25}}
.evp-livedot{display:inline-block;width:8px;height:8px;border-radius:50%;background:#10B981;animation:evpPulse 1.3s ease-in-out infinite}
/* Pointage Self-Service — boutons employé, overlay PIN, pavé numérique */
.evp-staff{display:flex;flex-direction:column;align-items:center;gap:9px;background:#fff;border:1px solid #E2E8F0;border-radius:16px;padding:18px 14px;cursor:pointer;font-family:inherit;text-align:center;transition:border-color .12s,box-shadow .12s,transform .07s}
.evp-staff:hover{border-color:#2D5A60;box-shadow:0 4px 14px rgba(45,90,96,.13)}
.evp-staff:active{transform:scale(.98)}
.evp-staff[disabled]{cursor:not-allowed;opacity:.65}
.evp-staff[disabled]:hover{border-color:#E2E8F0;box-shadow:none}
.evp-ov{position:fixed;inset:0;background:rgba(15,23,42,.55);display:flex;align-items:center;justify-content:center;z-index:99999;padding:16px;box-sizing:border-box}
.evp-kp{display:grid;grid-template-columns:repeat(3,1fr);gap:10px}
.evp-kpkey{background:#F8FAFC;border:1px solid #E2E8F0;border-radius:12px;padding:15px 0;font-size:22px;font-weight:700;color:#1F2937;cursor:pointer;font-family:inherit;transition:background .1s,transform .06s}
.evp-kpkey:hover{background:#EEF2F4;border-color:#2D5A60}
.evp-kpkey:active{transform:scale(.95);background:#E2E8F0}
.evp-kpkey.evp-kp-blank{visibility:hidden;cursor:default}
.evp-dot{width:16px;height:16px;border-radius:50%;border:2px solid #2D5A60;box-sizing:border-box;transition:background .12s}
.evp-dot.on{background:#2D5A60}

/* =============== bloc-en-ligne =============== */
/* ══════════════════════════════════════════════════════════════════
   EspaceVirtuel PRO — Design System v5 ABSOLUTE
   Target quality: Linear / Vercel / Stripe / Apple Design Awards
   Vanilla CSS, zero framework. System fonts only.
   Preserves every existing ID, class and CSS variable.
══════════════════════════════════════════════════════════════════ */


/* ─── 0 · RESET ─── */
*,*::before,*::after{box-sizing:border-box;margin:0;padding:0;-webkit-tap-highlight-color:transparent}
html,body{height:100%;overflow:hidden}
/* Pages de connexion — déverrouillage du défilement.
   Le verrou html,body{overflow:hidden} (nécessaire au shell de l'app) empêche
   de scroller jusqu'au bouton « Se connecter » sur petit écran ou clavier
   ouvert. On rétablit le défilement vertical UNIQUEMENT quand une page d'auth
   (#p-auth ou #p-login) est affichée. */
html:has(#p-auth.on),html:has(#p-login.on),
body:has(#p-auth.on),body:has(#p-login.on){
  overflow-y:auto !important;
  height:auto !important;
  -webkit-overflow-scrolling:touch;
}
html{scroll-behavior:smooth;font-size:15px;-webkit-text-size-adjust:100%;text-size-adjust:100%}
body{
  font-family:-apple-system,BlinkMacSystemFont,"SF Pro Display","SF Pro Text","Segoe UI Variable","Segoe UI",system-ui,"Helvetica Neue",Roboto,"Inter var",sans-serif;
  font-feature-settings:"cv09","cv11","ss01","tnum";
  -webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;
  line-height:1.55;letter-spacing:-.005em;
  background:var(--c0);color:var(--tx);
  text-rendering:optimizeLegibility;
  font-variant-numeric:tabular-nums;
  overscroll-behavior:none;
}
img,svg{display:block;max-width:100%;height:auto}
button,input,textarea,select{font:inherit;color:inherit}
:where(a){color:var(--acc);text-decoration:none}
:where(a):hover{text-decoration:underline;text-decoration-color:color-mix(in oklch,var(--acc) 50%,transparent);text-underline-offset:2px}


/* ─── 1 · DESIGN TOKENS ─── */
:root{
  /* Base surfaces — Slate Pro (sober dark) */
  --c0:#111827;
  --c1:#1F2937;
  --c2:#1F2937;
  --c3:#374151;
  --card:#1F2937;
  --card-2:#374151;
  --bdr:rgba(255,255,255,.07);
  --bdr2:rgba(255,255,255,.035);
  --bdr3:rgba(255,255,255,.14);


  /* Accents (semantic — JS uses these verbatim) */
  --acc:#2D5A60;
  --acc-2:#3C7178;
  --acc-ink:#ffffff;
  --grn:#10B981;
  --grn-2:#34D399;
  --grn-ink:#022c1e;
  --red:#EF4444;
  --red-2:#F87171;
  --org:#F59E0B;
  --org-2:#FBBF24;
  --blu:#2D5A60;


  /* Admin state colors */
  --gn:#0f8c5a;
  --rd:#a82850;
  --or:#a66700;
  --dr:#6b1525;


  /* Text */
  --tx:#F9FAFB;
  --tx2:#9CA3AF;
  --tx3:#6B7280;


  /* Radii */
  --r:16px;
  --r2:12px;
  --r3:8px;
  --r-pill:999px;


  /* Shadows */
  --sh1:0 1px 2px rgba(0,0,0,.5),0 0 0 1px var(--bdr2);
  --sh2:0 4px 16px rgba(0,0,0,.4),0 1px 3px rgba(0,0,0,.5);
  --sh3:0 24px 60px -16px rgba(0,0,0,.7),0 8px 24px rgba(0,0,0,.4);
  --sh-glow-a:0 0 0 1px color-mix(in oklch,var(--acc) 35%,transparent),0 8px 32px -8px color-mix(in oklch,var(--acc) 50%,transparent);
  --sh-glow-g:0 0 0 1px color-mix(in oklch,var(--grn) 35%,transparent),0 8px 32px -8px color-mix(in oklch,var(--grn) 50%,transparent);
  --sh-inset-hl:inset 0 1px 0 rgba(255,255,255,.08);


  --ring:0 0 0 3px color-mix(in oklch,var(--acc) 30%,transparent),0 0 0 1px var(--acc);


  /* Spacing scale */
  --sp1:4px;--sp2:8px;--sp3:12px;--sp4:16px;--sp5:20px;--sp6:24px;--sp7:32px;--sp8:40px;--sp9:56px;


  /* Type scale */
  --fs-xs:11px;--fs-sm:12px;--fs-md:14px;--fs-lg:16px;--fs-xl:18px;--fs-2xl:22px;--fs-3xl:28px;--fs-4xl:36px;--fs-5xl:48px;--fs-hero:64px;


  /* Density multiplier */
  --density:1;


  /* Motion */
  --e-out:cubic-bezier(.22,1,.36,1);
  --e-bounce:cubic-bezier(.34,1.56,.64,1);
  --e-std:cubic-bezier(.4,0,.2,1);
  --t-fast:140ms var(--e-std);
  --t-med:240ms var(--e-out);
  --t-slow:400ms var(--e-out);


  /* Gradients (brand) */
  --grad-brand:linear-gradient(135deg,var(--acc) 0%,var(--grn) 100%);
  --grad-brand-soft:linear-gradient(135deg,color-mix(in oklch,var(--acc) 25%,transparent),color-mix(in oklch,var(--grn) 20%,transparent));
  --grad-warm:linear-gradient(135deg,var(--org) 0%,var(--red) 100%);
  --grad-text:linear-gradient(135deg,var(--tx) 0%,color-mix(in oklch,var(--acc-2) 70%,var(--tx)) 100%);
  --grad-text-br:linear-gradient(135deg,var(--acc-2) 0%,var(--grn) 100%);
}


/* ─── 2 · THEME LIGHT (Pro & Clean) ─── */
html[data-theme="light"]{
  --c0:#FFFFFF;
  --c1:#FFFFFF;
  --c2:#F9FAFB;
  --c3:#F3F4F6;
  --card:#FFFFFF;
  --card-2:#F9FAFB;
  --bdr:rgba(31,41,55,.10);
  --bdr2:rgba(31,41,55,.05);
  --bdr3:rgba(31,41,55,.18);
  --acc:#2D5A60;
  --acc-2:#2D5A60;
  --acc-ink:#FFFFFF;
  --grn:#059669;
  --grn-2:#10B981;
  --grn-ink:#ffffff;
  --red:#DC2626;
  --red-2:#EF4444;
  --org:#D97706;
  --org-2:#F59E0B;
  --blu:#2D5A60;
  --gn:#15803d;--rd:#b91c1c;--or:#92400e;--dr:#7f1d1d;
  --tx:#1F2937;
  --tx2:#6B7280;
  --tx3:#9CA3AF;
  /* Aplatir les dégradés (look Pro & Clean) */
  --grad-brand:#2D5A60;
  --grad-brand-soft:#EFF6FF;
  --grad-warm:#F59E0B;
  --grad-text:#1F2937;
  --grad-text-br:#2D5A60;
  /* Supprimer les effets glow en mode clair */
  --sh-glow-a:0 0 0 1px rgba(37,99,235,.20),0 4px 12px -4px rgba(37,99,235,.15);
  --sh-glow-g:0 0 0 1px rgba(5,150,105,.20),0 4px 12px -4px rgba(5,150,105,.15);
  --sh1:0 1px 2px rgba(20,22,50,.06),0 0 0 1px var(--bdr);
  --sh2:0 4px 14px rgba(20,22,50,.07),0 1px 3px rgba(20,22,50,.04);
  --sh3:0 24px 56px -16px rgba(20,22,50,.18),0 6px 20px rgba(20,22,50,.06);
  --sh-inset-hl:inset 0 1px 0 rgba(255,255,255,.7);
}
html[data-theme="light"] body{background:var(--c0);color:var(--tx)}


/* ─── 3 · APP BACKGROUND — subtle ambient gradients ─── */
body::before{
  content:"";
  position:fixed;inset:0;pointer-events:none;z-index:-2;
  background:
    radial-gradient(ellipse 80% 50% at 50% -10%,color-mix(in oklch,var(--acc) 12%,transparent),transparent 55%),
    radial-gradient(ellipse 60% 40% at 100% 100%,color-mix(in oklch,var(--grn) 6%,transparent),transparent 50%),
    radial-gradient(ellipse 50% 40% at 0% 80%,color-mix(in oklch,var(--acc) 5%,transparent),transparent 50%);
}
body::after{
  content:"";position:fixed;inset:0;pointer-events:none;z-index:-1;
  background:
    radial-gradient(circle at 1px 1px,var(--bdr2) 1px,transparent 0);
  background-size:40px 40px;
  opacity:.4;
  mask-image:radial-gradient(ellipse 80% 60% at 50% 50%,#000 30%,transparent 90%);
  -webkit-mask-image:radial-gradient(ellipse 80% 60% at 50% 50%,#000 30%,transparent 90%);
}
html[data-theme="light"] body::after{opacity:.6}


/* ─── 4 · SCROLLBAR + SELECTION ─── */
::-webkit-scrollbar{width:10px;height:10px}
::-webkit-scrollbar-track{background:transparent}
::-webkit-scrollbar-thumb{background:var(--bdr3);border-radius:var(--r-pill);border:2px solid transparent;background-clip:padding-box;transition:background var(--t-fast)}
::-webkit-scrollbar-thumb:hover{background:var(--acc);background-clip:padding-box;border:2px solid transparent}
*{scrollbar-width:thin;scrollbar-color:var(--bdr3) transparent}
::selection{background:color-mix(in oklch,var(--acc) 45%,transparent);color:var(--tx)}


/* ─── 5 · APP SHELL ─── */
#app,#mb-p-app,#mode-membre,#mode-admin{height:100%;display:flex;flex-direction:column}
#mode-admin{display:none;flex-direction:column}
#mode-admin.on{display:flex}
#mode-membre.off{display:none}


.pg{display:none;flex:1;flex-direction:column;overflow:hidden;min-height:0}
.pg.on{display:flex;animation:pgIn 300ms var(--e-out)}
@keyframes pgIn{
  from{opacity:0;transform:translateY(8px) scale(.998);filter:blur(2px)}
  to{opacity:1;transform:none;filter:none}
}


/* ─── 6 · TOP BAR (.tb) ─── */
.tb{
  position:relative;flex-shrink:0;z-index:5;
  display:flex;align-items:center;justify-content:space-between;
  padding:0 var(--sp4);
  height:calc(56px * var(--density));
  background:color-mix(in oklch,var(--card) 75%,transparent);
  -webkit-backdrop-filter:blur(24px) saturate(180%);
  backdrop-filter:blur(24px) saturate(180%);
  border-bottom:1px solid var(--bdr);
}
.tb::before{
  content:"";position:absolute;inset:0;z-index:-1;
  background:linear-gradient(180deg,color-mix(in oklch,var(--acc) 3%,transparent),transparent);
  pointer-events:none;
}
.tbl{display:flex;align-items:center;gap:var(--sp3);min-width:0}
.tb-t{font-size:var(--fs-md);font-weight:700;letter-spacing:-.012em;color:var(--tx);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.tb-s{font-size:var(--fs-xs);color:var(--tx2);font-weight:500;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.tbr{display:flex;align-items:center;gap:var(--sp1)}


#clk{
  font-size:var(--fs-sm);font-weight:600;color:var(--acc);
  font-variant-numeric:tabular-nums;letter-spacing:.015em;
  padding:5px 10px;border-radius:var(--r3);
  background:color-mix(in oklch,var(--acc) 10%,transparent);
  border:1px solid color-mix(in oklch,var(--acc) 18%,transparent);
  min-width:62px;text-align:center;
}
.ib{
  background:transparent;border:0;cursor:pointer;
  font-size:15px;padding:8px;color:var(--tx2);border-radius:var(--r3);
  transition:background var(--t-fast),color var(--t-fast),transform var(--t-fast);
  width:36px;height:36px;display:inline-flex;align-items:center;justify-content:center;
}
.ib:hover{background:var(--c2);color:var(--tx)}
.ib:active{transform:scale(.94)}
#sync-dot{
  width:8px;height:8px;border-radius:50%;background:var(--grn);
  box-shadow:0 0 10px color-mix(in oklch,var(--grn) 70%,transparent),0 0 0 0 color-mix(in oklch,var(--grn) 50%,transparent);
  transition:all var(--t-med);margin-right:4px;flex-shrink:0;
  animation:syncPulse 2.2s ease-in-out infinite;
}
@keyframes syncPulse{
  0%,100%{box-shadow:0 0 10px color-mix(in oklch,var(--grn) 70%,transparent),0 0 0 0 color-mix(in oklch,var(--grn) 40%,transparent)}
  50%{box-shadow:0 0 12px color-mix(in oklch,var(--grn) 80%,transparent),0 0 0 6px color-mix(in oklch,var(--grn) 0%,transparent)}
}
#sync-dot.off{background:var(--red);animation:none;box-shadow:0 0 8px color-mix(in oklch,var(--red) 60%,transparent)}


.av{
  width:36px;height:36px;border-radius:50%;
  background:var(--grad-brand);
  display:flex;align-items:center;justify-content:center;
  font-size:14px;font-weight:700;color:#fff;flex-shrink:0;
  letter-spacing:.02em;
  box-shadow:0 0 0 2px var(--card),0 0 0 3px color-mix(in oklch,var(--acc) 30%,transparent),0 4px 14px -4px color-mix(in oklch,var(--acc) 50%,transparent);
}


/* ─── 7 · BOTTOM NAV (mobile) → SIDEBAR (desktop, handled in breakpoints) ─── */
.bn{
  flex-shrink:0;z-index:5;
  display:flex;
  padding:4px 4px calc(4px + env(safe-area-inset-bottom));
  background:color-mix(in oklch,var(--card) 78%,transparent);
  -webkit-backdrop-filter:blur(24px) saturate(180%);
  backdrop-filter:blur(24px) saturate(180%);
  border-top:1px solid var(--bdr);
}
.ni{
  flex:1;display:flex;flex-direction:column;align-items:center;justify-content:center;
  padding:8px 4px 6px;gap:2px;cursor:pointer;
  color:var(--tx2);font-size:10px;font-weight:600;letter-spacing:.01em;
  border:0;background:none;
  position:relative;min-height:54px;border-radius:var(--r2);
  transition:color var(--t-fast);
  font-family:inherit;
}
.ni .ic{font-size:20px;transition:transform var(--t-med) var(--e-bounce)}
.ni:hover{color:var(--tx)}
.ni.on{color:var(--acc)}
.ni.on .ic{transform:scale(1.12) translateY(-1px)}
.ni.on::before{
  content:"";position:absolute;inset:2px 10px;
  background:color-mix(in oklch,var(--acc) 12%,transparent);
  border-radius:var(--r2);z-index:-1;
}
.ni.on::after{
  content:"";position:absolute;top:2px;left:50%;
  width:22px;height:3px;background:var(--acc);
  border-radius:0 0 3px 3px;transform:translateX(-50%);
  box-shadow:0 0 10px color-mix(in oklch,var(--acc) 60%,transparent);
}
/* Bouton Déconnexion (en-tête, à côté de l'horloge) */
.ib.hdr-logout{
  display:inline-flex;align-items:center;gap:6px;
  color:var(--red) !important;font-weight:600;font-size:13px;
  padding:0 10px;border-radius:var(--r2);
  background:color-mix(in oklch,var(--red) 8%,transparent);
  border:1px solid color-mix(in oklch,var(--red) 25%,transparent);
  width:auto;height:34px;white-space:nowrap;
}
.ib.hdr-logout:hover{
  background:color-mix(in oklch,var(--red) 16%,transparent);
  border-color:color-mix(in oklch,var(--red) 40%,transparent);
}
@media (max-width:520px){
  .ib.hdr-logout .hdr-logout-lb{display:none}
  .ib.hdr-logout{padding:0 8px}
}

/* Bouton Déconnexion (rouge pro, ne s'active jamais) */
#ni-logout{color:var(--red) !important;font-weight:600}
#ni-logout:hover{background:color-mix(in oklch,var(--red) 10%,transparent);border-radius:var(--r2)}
#ni-logout.on{color:var(--red) !important}
#ni-logout.on::before,#ni-logout.on::after{display:none !important}
/* Desktop ≥1024px : épingler le bouton Déconnexion en bas du menu de gauche */
@media (min-width:1024px){
  #app > #p-app > .bn #ni-logout{
    margin-top:auto;
    border-top:1px solid var(--bdr);
    padding-top:var(--sp3);
    margin-bottom:var(--sp2);
  }
  #app > #p-app > .bn #ni-logout:hover{
    background:color-mix(in oklch,var(--red) 8%,transparent) !important;
    color:var(--red) !important;
  }
}
.nbdg{
  position:absolute;top:4px;right:calc(50% - 22px);
  min-width:18px;height:18px;
  background:var(--red);color:#fff;
  border-radius:var(--r-pill);font-size:10px;font-weight:700;
  display:none;align-items:center;justify-content:center;
  padding:0 5px;box-shadow:0 0 0 2px var(--card),0 2px 6px color-mix(in oklch,var(--red) 50%,transparent);
  line-height:1;
}
.nbdg.on{display:flex;animation:bdgPop 300ms var(--e-bounce)}
@keyframes bdgPop{from{transform:scale(0)}to{transform:scale(1)}}


/* ─── 8 · SCROLL AREA ─── */
.scrl{
  flex:1;overflow-y:auto;
  padding:var(--sp4);
  display:flex;flex-direction:column;gap:var(--sp3);
  min-height:0;
  -webkit-overflow-scrolling:touch;
  overscroll-behavior:contain;
  scroll-padding-top:16px;
  scroll-behavior:smooth;
}


/* ─── 9 · CARDS (.cd) ─── */
.cd{
  background:var(--card);
  border:1px solid var(--bdr);
  border-radius:var(--r);
  padding:var(--sp4);
  box-shadow:var(--sh1);
  transition:border-color var(--t-med),box-shadow var(--t-med),transform var(--t-med),background var(--t-med);
  position:relative;
}
.cd:hover{border-color:var(--bdr3)}
.cd-h{
  font-size:var(--fs-xs);font-weight:700;
  color:var(--tx2);
  text-transform:uppercase;letter-spacing:.12em;
  margin-bottom:var(--sp3);
  display:flex;align-items:center;gap:var(--sp2);
}
.cr{
  display:flex;justify-content:space-between;align-items:center;
  padding:var(--sp2) 0;
  border-bottom:1px solid var(--bdr);
  font-size:var(--fs-md);gap:var(--sp3);
}
.cr:last-child{border-bottom:0}


/* ─── 10 · KPI ─── */
.k2{display:grid;grid-template-columns:1fr 1fr;gap:var(--sp2)}
.kc{
  background:var(--c2);
  border:1px solid var(--bdr);
  border-radius:14px;
  padding:18px 20px;
  position:relative;overflow:hidden;
  transition:border-color var(--t-med),transform var(--t-med),box-shadow var(--t-med);
  box-shadow:0 1px 3px rgba(15,23,42,.05);
}
.kc::before{
  content:"";position:absolute;inset:0;
  background:linear-gradient(135deg,color-mix(in oklch,var(--acc) 4%,transparent),transparent 60%);
  pointer-events:none;
}
.kc:hover{border-color:var(--bdr3);transform:translateY(-1px);box-shadow:0 6px 18px rgba(15,23,42,.10)}
.kl{
  font-size:11px;color:var(--tx2);
  margin-bottom:8px;font-weight:800;
  text-transform:uppercase;letter-spacing:.06em;
  position:relative;
}
.kv{
  font-size:28px;font-weight:900;
  font-variant-numeric:tabular-nums;
  letter-spacing:-.02em;line-height:1.05;
  color:var(--tx);position:relative;
}
.kv.g{color:var(--grn);text-shadow:0 0 24px color-mix(in oklch,var(--grn) 25%,transparent)}
.kv.b{color:var(--acc);text-shadow:0 0 24px color-mix(in oklch,var(--acc) 25%,transparent)}
.kv.r{color:var(--red);text-shadow:0 0 24px color-mix(in oklch,var(--red) 25%,transparent)}
.kv.o{color:var(--org);text-shadow:0 0 24px color-mix(in oklch,var(--org) 25%,transparent)}


/* ─── 11 · SESSION CARDS (plan liste) ─── */
.sc{
  background:var(--card);
  border:1px solid var(--bdr);
  border-radius:var(--r);
  padding:var(--sp3);
  border-left:3px solid var(--grn);
  box-shadow:var(--sh1);
  transition:transform var(--t-med),box-shadow var(--t-med),border-color var(--t-med);
  position:relative;
}
.sc:hover{transform:translateY(-1px);box-shadow:var(--sh2)}
.sc.w{border-left-color:var(--org);background:color-mix(in oklch,var(--org) 4%,var(--card))}
.sc.a{border-left-color:var(--red);background:color-mix(in oklch,var(--red) 5%,var(--card));animation:scAlert 2s ease-in-out infinite}
@keyframes scAlert{
  0%,100%{box-shadow:var(--sh1),0 0 0 0 color-mix(in oklch,var(--red) 35%,transparent)}
  50%{box-shadow:var(--sh1),0 0 0 10px color-mix(in oklch,var(--red) 0%,transparent)}
}
.sh2{display:flex;justify-content:space-between;align-items:flex-start;gap:var(--sp2);margin-bottom:var(--sp2)}
.sn{font-size:var(--fs-md);font-weight:700;color:var(--tx);letter-spacing:-.01em}
.sp{font-size:var(--fs-lg);font-weight:800;color:var(--grn);white-space:nowrap;font-variant-numeric:tabular-nums;letter-spacing:-.015em}
.tgs{display:flex;flex-wrap:wrap;gap:4px;margin-bottom:var(--sp2)}
.tg{
  background:var(--c2);border:1px solid var(--bdr);
  border-radius:var(--r3);padding:3px 9px;
  font-size:var(--fs-xs);color:var(--tx2);font-weight:600;
  letter-spacing:.01em;line-height:1.4;
}
.tg.r{background:color-mix(in oklch,var(--red) 12%,var(--c2));border-color:color-mix(in oklch,var(--red) 25%,transparent);color:var(--red)}
.tg.o{background:color-mix(in oklch,var(--org) 12%,var(--c2));border-color:color-mix(in oklch,var(--org) 25%,transparent);color:var(--org)}


/* ─── 12 · BOUTONS ─── */
.btn{
  width:100%;min-height:44px;
  padding:12px var(--sp4);
  border-radius:var(--r2);border:0;
  font-size:var(--fs-md);font-weight:600;
  font-family:inherit;letter-spacing:-.005em;
  cursor:pointer;
  display:inline-flex;align-items:center;justify-content:center;gap:8px;
  transition:transform var(--t-fast),box-shadow var(--t-med),filter var(--t-fast),opacity var(--t-fast),background var(--t-med);
  position:relative;overflow:hidden;
  isolation:isolate;
  box-shadow:var(--sh1);
  white-space:nowrap;
}
.btn::before{
  content:"";position:absolute;inset:0;
  background:linear-gradient(180deg,rgba(255,255,255,.15),transparent 50%);
  pointer-events:none;opacity:.7;
  border-radius:inherit;
}
.btn:active:not(:disabled){transform:translateY(1px) scale(.99)}
.btn:disabled{opacity:.4;cursor:not-allowed;filter:grayscale(.4)}


.ba{
  background:var(--acc);color:#fff;
  box-shadow:var(--sh-inset-hl),0 1px 2px rgba(0,0,0,.3),0 6px 18px -4px color-mix(in oklch,var(--acc) 55%,transparent);
}
.ba:hover:not(:disabled){
  filter:brightness(1.1);
  box-shadow:var(--sh-inset-hl),0 1px 2px rgba(0,0,0,.3),0 10px 28px -4px color-mix(in oklch,var(--acc) 65%,transparent);
  transform:translateY(-1px);
}
.bg{
  background:var(--grn);color:var(--grn-ink);
  box-shadow:var(--sh-inset-hl),0 1px 2px rgba(0,0,0,.3),0 6px 18px -4px color-mix(in oklch,var(--grn) 50%,transparent);
}
.bg:hover:not(:disabled){filter:brightness(1.08);transform:translateY(-1px)}
.br{
  background:var(--red);color:#fff;
  box-shadow:var(--sh-inset-hl),0 1px 2px rgba(0,0,0,.3),0 6px 18px -4px color-mix(in oklch,var(--red) 50%,transparent);
}
.br:hover:not(:disabled){filter:brightness(1.08);transform:translateY(-1px)}
.bo{
  background:var(--org);color:#1a0f00;
  box-shadow:var(--sh-inset-hl),0 1px 2px rgba(0,0,0,.2),0 6px 18px -4px color-mix(in oklch,var(--org) 50%,transparent);
}
.bo:hover:not(:disabled){filter:brightness(1.06);transform:translateY(-1px)}
.bd{
  background:color-mix(in oklch,var(--red) 30%,var(--card));color:#fff;
  border:1px solid color-mix(in oklch,var(--red) 55%,transparent);
}
.bd:hover:not(:disabled){background:color-mix(in oklch,var(--red) 45%,var(--card))}
.bgh{
  background:var(--c2);color:var(--tx);
  border:1px solid var(--bdr);
  box-shadow:var(--sh1);
}
.bgh:hover:not(:disabled){background:var(--c3);border-color:var(--bdr3);transform:translateY(-1px)}


/* ─── 13 · FORMS ─── */
.fg{display:flex;flex-direction:column;gap:6px}
.fl{
  font-size:var(--fs-xs);font-weight:600;
  color:var(--tx2);
  text-transform:uppercase;letter-spacing:.08em;
}
.fi,.fta{
  width:100%;
  padding:12px 14px;
  background:var(--c2);
  border:1px solid var(--bdr);
  border-radius:var(--r2);
  color:var(--tx);
  font-size:16px;
  font-family:inherit;
  outline:none;
  transition:border-color var(--t-fast),background var(--t-fast),box-shadow var(--t-fast);
  line-height:1.45;min-height:44px;
}
.fta{resize:vertical;min-height:88px;line-height:1.55}
.fi:hover:not(:focus),.fta:hover:not(:focus){border-color:var(--bdr3)}
.fi:focus,.fta:focus{border-color:var(--acc);background:var(--c1);box-shadow:var(--ring)}
.fi::placeholder,.fta::placeholder{color:var(--tx3)}
select.fi{
  appearance:none;-webkit-appearance:none;
  background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='8' viewBox='0 0 12 8'%3E%3Cpath fill='%239999b3' d='M6 8L0 0h12z'/%3E%3C/svg%3E");
  background-repeat:no-repeat;background-position:right 14px center;background-size:10px;
  padding-right:36px;cursor:pointer;
}
input[type="checkbox"],input[type="radio"]{accent-color:var(--acc);width:18px;height:18px}
.pw-strength{height:4px;background:var(--c2);border-radius:2px;overflow:hidden;margin-top:4px}
#pw-strength-bar{height:100%;width:0;transition:width var(--t-med),background var(--t-med);border-radius:2px}


/* ─── 14 · AUTH MEMBRE (#p-auth) ─── */
#p-auth{
  overflow-y:auto;
  align-items:center;justify-content:center;
  padding:var(--sp6) var(--sp4) var(--sp8);
  min-height:100vh;
  background:
    radial-gradient(ellipse 80% 60% at 20% 10%,color-mix(in oklch,var(--acc) 22%,transparent),transparent 55%),
    radial-gradient(ellipse 60% 50% at 90% 100%,color-mix(in oklch,var(--grn) 14%,transparent),transparent 55%),
    radial-gradient(ellipse 50% 40% at 50% 50%,color-mix(in oklch,var(--acc) 5%,transparent),transparent 70%),
    var(--c0);
  position:relative;
}
#p-auth::before{
  content:"";position:absolute;inset:0;pointer-events:none;
  background:
    radial-gradient(circle at 1px 1px,var(--bdr2) 1px,transparent 0);
  background-size:36px 36px;opacity:.5;
  mask-image:radial-gradient(ellipse 80% 60% at 50% 50%,#000 20%,transparent 80%);
  -webkit-mask-image:radial-gradient(ellipse 80% 60% at 50% 50%,#000 20%,transparent 80%);
}
.aw{
  width:100%;max-width:440px;margin:auto;
  display:flex;flex-direction:column;gap:var(--sp4);
  position:relative;z-index:1;
}
.ahero{text-align:center;padding:var(--sp4) 0 var(--sp2)}
.ahero .hi{
  font-size:60px;display:block;margin-bottom:var(--sp3);line-height:1;
  filter:drop-shadow(0 0 32px color-mix(in oklch,var(--acc) 60%,transparent)) drop-shadow(0 0 64px color-mix(in oklch,var(--grn) 30%,transparent));
  animation:heroFloat 5s ease-in-out infinite;
}
@keyframes heroFloat{0%,100%{transform:translateY(0) rotate(-1deg)}50%{transform:translateY(-6px) rotate(1deg)}}
.ahero h1{
  font-size:var(--fs-3xl);font-weight:800;
  letter-spacing:-.03em;line-height:1.1;
  background:var(--grad-text);
  -webkit-background-clip:text;background-clip:text;-webkit-text-fill-color:transparent;
}
.ahero p{font-size:var(--fs-md);color:var(--tx2);margin-top:6px;line-height:1.5}


.atabs{
  display:flex;
  background:color-mix(in oklch,var(--c2) 80%,transparent);
  -webkit-backdrop-filter:blur(12px);backdrop-filter:blur(12px);
  border:1px solid var(--bdr);
  border-radius:var(--r2);padding:4px;gap:4px;
  box-shadow:var(--sh1);
}
.atab{
  flex:1;padding:12px 8px;text-align:center;
  font-size:var(--fs-sm);font-weight:600;
  color:var(--tx2);cursor:pointer;
  border-radius:var(--r3);
  transition:color var(--t-med),background var(--t-med),box-shadow var(--t-med);
  min-height:40px;display:flex;align-items:center;justify-content:center;
}
.atab:hover:not(.on){color:var(--tx);background:color-mix(in oklch,var(--c2) 50%,transparent)}
.atab.on{
  background:var(--acc);color:#fff;
  box-shadow:var(--sh-inset-hl),0 2px 10px -2px color-mix(in oklch,var(--acc) 60%,transparent);
}


.acard{
  background:color-mix(in oklch,var(--card) 90%,transparent);
  -webkit-backdrop-filter:blur(16px) saturate(150%);
  backdrop-filter:blur(16px) saturate(150%);
  border:1px solid var(--bdr);
  border-radius:var(--r);
  padding:var(--sp5);
  display:flex;flex-direction:column;gap:var(--sp3);
  box-shadow:var(--sh2),inset 0 1px 0 rgba(255,255,255,.04);
}


.aerr,.aok,.lerr{
  padding:10px 14px;border-radius:var(--r2);
  font-size:var(--fs-sm);font-weight:500;
  text-align:center;display:none;line-height:1.45;
  animation:fadeIn 240ms var(--e-out);
}
@keyframes fadeIn{from{opacity:0;transform:translateY(-4px)}to{opacity:1;transform:none}}
.aerr,.lerr{
  background:color-mix(in oklch,var(--red) 12%,var(--c2));
  color:var(--red-2);
  border:1px solid color-mix(in oklch,var(--red) 30%,transparent);
}
.aok{
  background:color-mix(in oklch,var(--grn) 12%,var(--c2));
  color:var(--grn);
  border:1px solid color-mix(in oklch,var(--grn) 30%,transparent);
}


/* ─── 15 · LOGIN ADMIN (#p-login) ─── */
#p-login{
  overflow-y:auto;align-items:center;justify-content:center;
  padding:var(--sp5) var(--sp4) var(--sp6);
  min-height:100vh;
  background:
    radial-gradient(ellipse 70% 50% at 20% 0%,color-mix(in oklch,var(--acc) 22%,transparent),transparent 60%),
    radial-gradient(ellipse 50% 40% at 80% 100%,color-mix(in oklch,var(--grn) 10%,transparent),transparent 55%),
    var(--c0);
  position:relative;
}
.lw{width:100%;max-width:420px;margin:auto;display:flex;flex-direction:column;gap:var(--sp4);position:relative;z-index:1}
.lhero{text-align:center;padding:var(--sp2) 0}
.lhero .hi{
  font-size:54px;display:block;margin-bottom:var(--sp3);
  filter:drop-shadow(0 0 26px color-mix(in oklch,var(--acc) 60%,transparent));
  animation:heroFloat 5s ease-in-out infinite;
}
.lhero h2{
  font-size:var(--fs-3xl);font-weight:800;letter-spacing:-.025em;
  background:var(--grad-text);
  -webkit-background-clip:text;background-clip:text;-webkit-text-fill-color:transparent;
  margin:0;
}
.lhero p{font-size:var(--fs-sm);color:var(--tx2);margin-top:4px}
.slbl{
  font-size:var(--fs-xs);font-weight:700;color:var(--tx2);
  text-transform:uppercase;letter-spacing:.1em;margin-bottom:10px;
}
.og{display:grid;grid-template-columns:1fr 1fr;gap:8px}
.ob{
  padding:14px 10px;border-radius:var(--r2);
  border:1px solid var(--bdr);
  background:color-mix(in oklch,var(--card) 85%,transparent);
  -webkit-backdrop-filter:blur(10px);backdrop-filter:blur(10px);
  cursor:pointer;text-align:center;
  transition:border-color var(--t-med),background var(--t-med),transform var(--t-fast),box-shadow var(--t-med);
  color:var(--tx);min-height:84px;
  display:flex;flex-direction:column;align-items:center;justify-content:center;gap:2px;
}
.ob:hover{border-color:var(--bdr3);background:var(--c2);transform:translateY(-1px)}
.ob:active{transform:scale(.98)}
.ob.sel{
  border-color:var(--acc);
  background:color-mix(in oklch,var(--acc) 14%,var(--card));
  box-shadow:var(--sh-glow-a);
}
.ob .ic{font-size:24px;display:block;margin-bottom:4px}
.ob .nm{font-size:var(--fs-sm);font-weight:700;color:var(--tx)}
.ob .rl{font-size:10px;color:var(--tx2);margin-top:2px;text-transform:uppercase;letter-spacing:.05em}


/* PIN pad */
.pw{
  background:color-mix(in oklch,var(--card) 92%,transparent);
  -webkit-backdrop-filter:blur(16px);backdrop-filter:blur(16px);
  border:1px solid var(--bdr);
  border-radius:var(--r);
  padding:var(--sp5);
  box-shadow:var(--sh2);
}
.pdots{display:flex;justify-content:center;gap:14px;height:44px;align-items:center;margin-bottom:var(--sp4)}
.dot{
  width:14px;height:14px;border-radius:50%;
  border:2px solid var(--bdr3);
  transition:all var(--t-fast);background:transparent;
}
.dot.on{
  background:var(--acc);border-color:var(--acc);
  box-shadow:0 0 14px color-mix(in oklch,var(--acc) 70%,transparent);
  animation:pinPop 300ms var(--e-bounce);
}
@keyframes pinPop{0%{transform:scale(0)}60%{transform:scale(1.25)}100%{transform:scale(1)}}
.pp{display:grid;grid-template-columns:repeat(3,1fr);gap:8px}
.pk{
  height:58px;
  border-radius:var(--r2);
  border:1px solid var(--bdr);
  background:var(--c2);
  color:var(--tx);
  font-size:22px;font-weight:600;font-family:inherit;
  cursor:pointer;
  display:flex;align-items:center;justify-content:center;
  transition:background var(--t-fast),transform var(--t-fast),border-color var(--t-fast),box-shadow var(--t-fast);
}
.pk:hover{background:var(--c3);border-color:var(--bdr3)}
.pk:active{transform:scale(.93);background:color-mix(in oklch,var(--acc) 20%,var(--c3));box-shadow:0 0 16px color-mix(in oklch,var(--acc) 30%,transparent) inset}
.pk.d{color:var(--red)}
.pk.ok{color:var(--grn)}


/* ─── 16 · TABS ADMIN ─── */
.tabs{
  display:flex;
  background:var(--c1);
  border-bottom:1px solid var(--bdr);
  flex-shrink:0;
  padding:0 var(--sp3);gap:4px;
  overflow-x:auto;
  -webkit-overflow-scrolling:touch;
  scrollbar-width:none;
}
.tabs::-webkit-scrollbar{display:none}
.tab{
  flex:1;min-width:max-content;
  padding:13px 12px;text-align:center;
  font-size:var(--fs-xs);font-weight:600;
  color:var(--tx2);cursor:pointer;
  border-bottom:2px solid transparent;
  text-transform:uppercase;letter-spacing:.06em;
  transition:color var(--t-fast),border-color var(--t-fast);
  min-height:44px;
  display:flex;align-items:center;justify-content:center;gap:6px;
  white-space:nowrap;
}
.tab:hover{color:var(--tx)}
.tab.on{color:var(--acc);border-bottom-color:var(--acc)}
.tc{display:none;flex:1;flex-direction:column;overflow:hidden;min-height:0}
.tc.on{display:flex}


/* ─── 17 · PLAN DE SALLE (#pg-pln) — Light Theme, vue claire & lumineuse ─── */
/* Palette claire scopée à la page Plan (n'affecte pas le reste de l'app) */
#pg-pln{
  --nfloor:#FFFFFF;
  --nfloor2:#F8FAFC;
  --ncard:#FFFFFF;
  --pcyan:#06B6D4;
  --pred:#EF4444;
  --porange:#F59E0B;
  --pgray:#94A3B8;
  --ntx:#0F172A;
  --ntx2:#64748B;
}
.pw2{flex:1;overflow:auto;padding:0;background:#FFFFFF}
#pg-pln{background:#FFFFFF}
#pg-pln .ps{
  background:#FFFFFF;
  border-bottom:1px solid #E2E8F0;
  color:var(--ntx);
}
#pg-pln .ps > div:first-child{color:#0891B2;text-shadow:none}
#pg-pln .ps > div:nth-child(2){color:#DC2626;text-shadow:none}
#pg-pln .ps > div:nth-child(3){color:#D97706;text-shadow:none}
#pg-pln .pl{
  background:#FFFFFF;
  border-top:1px solid #E2E8F0;
  color:var(--ntx2);
}
#pg-pln .lgi{color:var(--ntx2)}

/* Grille du plan — disposition INCHANGÉE (tableau PLAN, 8 colonnes × N lignes) */
/* Défilement du Plan — méthode DÉTERMINISTE : on n'attend plus aucune hauteur
   de la chaîne flex parente (elle ne propage pas de hauteur définie de façon
   fiable). La page Plan est ancrée directement à la hauteur réelle de l'écran
   (100dvh) moins la barre du haut (~56px) et la barre de navigation du bas
   (~64px). .pw2 occupe le reste, a donc une hauteur bornée, et défile à la
   molette comme n'importe quel conteneur scrollable standard. */
#pg-pln.pg.on{flex:0 0 auto;height:calc(100dvh - 120px);max-height:calc(100dvh - 120px);min-height:0}
#pg-pln .ps{flex-shrink:0}
#pg-pln .pw2{flex:1 1 auto;min-height:0;overflow:auto;-webkit-overflow-scrolling:touch;padding:22px;background:#F8FAFC}
.pg-grid{
  display:grid;
  grid-template-columns:repeat(8,minmax(72px,1fr));
  gap:16px;
  min-width:620px;
  max-width:1100px;
  margin:0 auto;
}
.pc{
  aspect-ratio:1;min-height:64px;
  border-radius:16px;
  position:relative;overflow:hidden;
  cursor:pointer;
  background:var(--rgb-bg,#FFFFFF);
  color:var(--rgb-color,#06B6D4);
  border:3px solid var(--rgb-color,#06B6D4);
  --rgb-color:#06B6D4;
  --rgb-bg:#FFFFFF;
  --rgb-glow:rgba(6,182,212,.45);
  box-shadow:0 4px 12px -4px rgba(15,23,42,.12), 0 0 16px var(--rgb-glow);
  transition:transform .14s, box-shadow .25s, border-color .25s, background-color .25s;
}
.pc:hover:not(.h):not(.s){
  transform:translateY(-3px) scale(1.03);
  box-shadow:0 14px 24px -6px rgba(15,23,42,.18), 0 0 26px var(--rgb-glow);
}
.pc:active:not(.h):not(.s){transform:scale(.97)}
.pc svg.pc-svg{
  position:absolute;inset:0;
  width:100%;height:100%;
  display:block;
  pointer-events:none;
  /* Ombre portée : détache l'icône (chaise/écran) du fond coloré de la carte */
  filter:drop-shadow(0 1px 2px rgba(15,23,42,.32));
}
.pc .pc-lbl{
  position:absolute;left:0;right:0;bottom:5px;
  font-size:13px;font-weight:800;color:#0F172A;text-align:center;
  letter-spacing:.2px;line-height:1.15;pointer-events:none;
  /* Halo blanc : garde le nom/numéro lisible par-dessus les images chaises/écrans */
  text-shadow:0 0 3px #fff,0 0 3px #fff,0 1px 2px #fff,0 -1px 2px #fff,1px 0 2px #fff,-1px 0 2px #fff;
}
.pc .pc-timer{
  position:absolute;top:4px;left:0;right:0;
  font-size:11px;font-weight:900;color:#0F172A;
  text-align:center;font-variant-numeric:tabular-nums;
  pointer-events:none;
  text-shadow:0 0 3px #fff,0 0 3px #fff,0 1px 2px #fff;
}
/* v260 — Montant DH live (sous le timer) dans chaque cellule occupée. */
.pc .pc-amt{
  position:absolute;top:20px;left:0;right:0;
  font-size:13px;font-weight:900;color:#15803D;
  text-align:center;font-variant-numeric:tabular-nums;
  pointer-events:none;
  text-shadow:0 0 3px #fff,0 0 3px #fff,0 1px 2px #fff;
  z-index:2;
}
.pc.s-warn .pc-amt, .pc.s-alerte .pc-amt{ color:#B91C1C; }
.pc.s-pause .pc-amt{ color:#92400E; }
.pc .pc-reason{
  position:absolute;top:4px;left:0;right:0;
  font-size:8px;font-style:italic;color:var(--rgb-color);
  text-align:center;pointer-events:none;
  padding:0 2px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;
}
/* Code couleur par catégorie de poste (lueur + bordure) — état libre.
   Les états dynamiques ci-dessous (occupé/warn/alerte/attente) restent prioritaires. */
.pc.fam-ps5{--rgb-bg:#CFFAFE;--rgb-color:#06B6D4;--rgb-glow:rgba(6,182,212,.55)}        /* PS5 : fond cyan clair      */
.pc.fam-ps4{--rgb-bg:#E0E7FF;--rgb-color:#4F46E5;--rgb-glow:rgba(79,70,229,.55)}        /* PS4 : fond indigo clair    */
.pc.fam-vip{--rgb-bg:#FEF3C7;--rgb-color:#F59E0B;--rgb-glow:rgba(245,158,11,.55)}       /* VIP : fond doré clair      */
.pc.fam-ping-pong{--rgb-bg:#D1FAE5;--rgb-color:#10B981;--rgb-glow:rgba(16,185,129,.55)}/* Ping-pong : fond vert menthe */
.pc.fam-volant{--rgb-bg:#FEE2E2;--rgb-color:#EF4444;--rgb-glow:rgba(239,68,68,.55)}     /* Volant : fond rouge clair  */
/* Poste DISPONIBLE → toujours VERT émeraude, quelle que soit la console.
   Placé après les couleurs de famille pour les neutraliser sur les postes libres. */
.pc.s-libre{--rgb-bg:#ECFDF5;--rgb-color:#10B981;--rgb-glow:rgba(16,185,129,.45)}
/* États dynamiques (prioritaires sur la famille) — occupé : TOUJOURS rouge,
   jusqu'à la validation de la Sortie. s-warn (≥1h) repassé en rouge pour ne
   jamais quitter le code couleur « occupé ». s-alerte (≥2h) reste rouge soutenu.
   FIX 2026-05-21 : les états d'occupation REDÉFINISSENT --rgb-bg, sinon le
   fond retombait à la couleur de famille (VIP=#FEF3C7 jaune, PS5=cyan…) après
   un cycle Pause→Reprise, donnant l'illusion que le poste « reste jaune ». */
.pc.s-occupe{--rgb-bg:#FEE2E2;--rgb-color:#EF4444;--rgb-glow:rgba(239,68,68,.45);animation:pcPulse 2.6s ease-in-out infinite}
.pc.s-warn{--rgb-bg:#FEE2E2;--rgb-color:#EF4444;--rgb-glow:rgba(239,68,68,.45);animation:pcPulse 2.6s ease-in-out infinite}
.pc.s-alerte{--rgb-bg:#FECACA;--rgb-color:#DC2626;--rgb-glow:rgba(220,38,38,.55);animation:pcPulseAlert 1.4s ease-in-out infinite}
.pc.s-attente{--rgb-bg:#FEF3C7;--rgb-color:#F59E0B;--rgb-glow:rgba(245,158,11,.48)}
/* État PAUSE — poste figé temporairement (5 min max). Orange clignotant pour
   ressortir d'un coup d'œil sur le Plan. */
.pc.s-pause{--rgb-bg:#FEF3C7;--rgb-color:#F59E0B;--rgb-glow:rgba(245,158,11,.55);animation:pcPulsePause 1.1s ease-in-out infinite}
/* Badge FUSION (2026-07-28) — signale, sur la cellule Plan du poste CIBLE,
   le montant des additions fusionnées venues d'autres postes. Posé en haut à
   GAUCHE pour ne jamais chevaucher .pc-pause-badge (haut à droite). */
.pc-fusion-badge{
  position:absolute;top:4px;left:4px;
  background:#F97316;color:#fff;
  font-size:9px;font-weight:800;letter-spacing:.3px;
  padding:2px 6px;border-radius:8px;
  z-index:3;pointer-events:none;
  max-width:calc(100% - 40px);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;
  box-shadow:0 2px 4px rgba(249,115,22,.45);
}
.pc-pause-badge{
  position:absolute;top:4px;right:4px;
  background:#F59E0B;color:#fff;
  font-size:9px;font-weight:800;letter-spacing:.4px;
  padding:2px 6px;border-radius:8px;
  animation:pcPulsePause 1.1s ease-in-out infinite;
  z-index:3;pointer-events:none;
  box-shadow:0 2px 4px rgba(245,158,11,.4);
}
@keyframes pcPulse{
  0%,100%{box-shadow:0 4px 12px -4px rgba(15,23,42,.10),0 0 16px var(--rgb-glow)}
  50%    {box-shadow:0 4px 12px -4px rgba(15,23,42,.10),0 0 30px var(--rgb-glow)}
}
@keyframes pcPulseAlert{
  0%,100%{box-shadow:0 4px 12px -4px rgba(15,23,42,.12),0 0 18px var(--rgb-glow)}
  50%    {box-shadow:0 4px 12px -4px rgba(15,23,42,.12),0 0 38px var(--rgb-glow)}
}
@keyframes pcPulsePause{
  0%,100%{box-shadow:0 4px 12px -4px rgba(15,23,42,.10),0 0 16px var(--rgb-glow);opacity:1}
  50%    {box-shadow:0 4px 12px -4px rgba(15,23,42,.10),0 0 32px var(--rgb-glow);opacity:.78}
}
/* Carte session en pause (rendu liste — cf. SC.cls=='p') */
.sc.p{border-color:#F59E0B;background:linear-gradient(180deg,#FFFBEB,#FFFFFF)}
/* Cellules statiques (WC, Frigo, Caisse, Table, Trotinette) — gris neutre */
.pc.s{
  background:#F8FAFC;
  border:1.5px solid #E2E8F0;
  color:#94A3B8;
  box-shadow:0 2px 6px -2px rgba(15,23,42,.06);
  cursor:default;
  --rgb-color:#94A3B8;
  --rgb-glow:rgba(148,163,184,.20);
}
.pc.s:hover{transform:none}
.pc.s .pc-lbl{color:#64748B}
/* Cellule titre */
.pc.h{
  aspect-ratio:auto;min-height:40px;
  background:#FFFFFF;
  border:1px solid #E2E8F0;
  border-radius:16px;
  display:flex;align-items:center;justify-content:center;
  color:#0F172A;font-size:13px;font-weight:800;
  letter-spacing:5px;
  cursor:default;box-shadow:0 2px 6px -2px rgba(15,23,42,.05);
}
.pc.h:hover{transform:none}
/* ── Plan de salle : cellules de poste en flux normal, taille fixe garantie ──
   Carré 100×100 stable. Aucun position:absolute ni marge négative sur les postes :
   ils ne peuvent ni se chevaucher ni s'empiler, et restent visibles à 100% sans survol. */
#pg-g .pc{position:relative;float:none;margin:0;aspect-ratio:auto;width:100px;height:100px;flex:0 0 100px;box-sizing:border-box}


.pl{
  display:flex;flex-wrap:wrap;gap:10px var(--sp3);
  padding:10px var(--sp3);
  border-top:1px solid var(--bdr);
  flex-shrink:0;background:var(--card);
}
.lgi{display:flex;align-items:center;gap:6px;font-size:var(--fs-xs);color:var(--tx2);font-weight:500}
.lgd{width:10px;height:10px;border-radius:3px;flex-shrink:0}
.ps{
  display:flex;gap:var(--sp4);
  padding:12px var(--sp4);
  background:var(--c1);
  border-bottom:1px solid var(--bdr);
  flex-shrink:0;
  font-size:var(--fs-sm);font-weight:600;
  align-items:center;font-variant-numeric:tabular-nums;
}
.ps > div:first-child{color:var(--grn)}
.ps > div:nth-child(2){color:var(--red)}
.ps > div:nth-child(3){color:var(--org)}


/* ─── 18 · GRILLE POSTES (modals) ─── */
.pg2{display:grid;grid-template-columns:repeat(5,1fr);gap:6px}
.pbt{
  padding:11px 4px;
  border-radius:var(--r3);border:1px solid var(--bdr);
  background:var(--c2);color:var(--tx);
  font-size:var(--fs-sm);font-weight:600;font-family:inherit;
  cursor:pointer;
  transition:border-color var(--t-fast),background var(--t-fast),transform var(--t-fast);
  text-align:center;min-height:40px;
}
.pbt:hover{border-color:var(--bdr3);background:var(--c3)}
.pbt.sel{background:var(--acc);border-color:var(--acc);color:#fff;box-shadow:var(--sh-inset-hl),0 2px 8px -2px color-mix(in oklch,var(--acc) 50%,transparent)}
.pbt.occ{
  background:color-mix(in oklch,var(--red) 15%,var(--c2));
  border-color:color-mix(in oklch,var(--red) 40%,transparent);
  color:var(--red-2);cursor:not-allowed;opacity:.7;
}
/* FUSION DE SESSIONS (2026-07-28) — un poste OCCUPÉ reste cliquable dans la
   modale Transfert : le clic ne « déplace » pas la session mais FUSIONNE son
   addition sur la session déjà en cours du poste cible. Code couleur orange
   pour le distinguer sans ambiguïté du vert « poste libre ». */
.pbt.fus{
  background:color-mix(in oklch,var(--org) 16%,var(--c2));
  border-color:color-mix(in oklch,var(--org) 55%,transparent);
  color:var(--org);cursor:pointer;opacity:1;
  display:flex;flex-direction:column;align-items:center;justify-content:center;gap:2px;line-height:1.15;
}
.pbt.fus:hover{background:color-mix(in oklch,var(--org) 28%,var(--c2));border-color:var(--org)}
.pbt.fus.sel{background:var(--org);border-color:var(--org);color:#fff;box-shadow:0 2px 10px -2px color-mix(in oklch,var(--org) 60%,transparent)}
.pbt.fus .fus-sub{font-size:9.5px;font-weight:800;opacity:.92;letter-spacing:.02em}
.tp-grp-hd{
  display:flex;align-items:center;gap:6px;
  font-size:11px;font-weight:800;letter-spacing:.04em;text-transform:uppercase;
  margin:10px 0 5px;color:var(--tx2);
}
.tp-grp-hd .tp-grp-cnt{font-weight:700;opacity:.75;text-transform:none;letter-spacing:0}


/* ─── 19 · MODALS ─── */
.ov{
  position:fixed;inset:0;
  background:color-mix(in oklch,#000 70%,transparent);
  -webkit-backdrop-filter:blur(12px);backdrop-filter:blur(12px);
  z-index:500;display:none;
  align-items:flex-end;justify-content:center;padding:0;
  animation:ovIn 240ms var(--e-out);
}
.ov.on{display:flex}
@keyframes ovIn{from{opacity:0}to{opacity:1}}
.md{
  background:color-mix(in oklch,var(--card) 95%,transparent);
  -webkit-backdrop-filter:blur(20px);backdrop-filter:blur(20px);
  border:1px solid var(--bdr);border-bottom:0;
  border-radius:22px 22px 0 0;
  padding:var(--sp5);
  width:100%;max-width:560px;
  display:flex;flex-direction:column;gap:var(--sp3);
  max-height:92vh;overflow-y:auto;
  box-shadow:0 -24px 64px rgba(0,0,0,.5),inset 0 1px 0 rgba(255,255,255,.05);
  animation:mdSlide 320ms var(--e-bounce);
  position:relative;
}
@keyframes mdSlide{from{transform:translateY(100%)}to{transform:translateY(0)}}
.md > div[style*="width:32px"]{
  background:var(--bdr3) !important;
  width:40px !important;height:4px !important;
  margin:0 auto var(--sp2) !important;
  border-radius:var(--r-pill) !important;
}
.mdt{font-size:var(--fs-xl);font-weight:700;text-align:center;letter-spacing:-.02em;color:var(--tx);line-height:1.3}
.mdi{font-size:var(--fs-sm);color:var(--tx2);text-align:center;line-height:1.55}
.mdb{display:flex;gap:8px;margin-top:4px}


/* Modal paiement plein écran */
#m-pay{
  position:fixed;inset:0;background:var(--c0);z-index:9000;
  display:none;flex-direction:column;overflow-y:auto;
}
#m-pay.on{display:flex;animation:pgIn 300ms var(--e-out)}
@keyframes evInvPulse{0%,100%{box-shadow:0 2px 8px rgba(245,158,11,.22)}50%{box-shadow:0 2px 18px rgba(245,158,11,.55)}}
.pay-top{
  background:
    radial-gradient(ellipse 70% 60% at 50% 100%,color-mix(in oklch,var(--grn) 28%,transparent),transparent 60%),
    linear-gradient(180deg,color-mix(in oklch,var(--grn) 12%,var(--c1)),var(--c1));
  padding:var(--sp6) var(--sp4);flex-shrink:0;
  border-bottom:1px solid color-mix(in oklch,var(--grn) 40%,transparent);
  text-align:center;
}


/* Amount boxes */
.amt-box{
  background:var(--c2);border:1px solid var(--bdr);
  border-radius:var(--r);padding:var(--sp4);
  display:flex;flex-direction:column;gap:10px;
}
.amt-row{display:flex;justify-content:space-between;align-items:center;gap:8px}
.amt-lbl{font-size:var(--fs-sm);color:var(--tx2);font-weight:500}
.amt-v{font-size:var(--fs-lg);font-weight:700;font-variant-numeric:tabular-nums;letter-spacing:-.01em}
.amt-v.sub{font-size:var(--fs-sm);color:var(--tx2);font-weight:500}
.amt-v.rem{font-size:var(--fs-md);color:var(--org);font-weight:600}
.err-line{
  font-size:var(--fs-xs);color:var(--red);
  background:color-mix(in oklch,var(--red) 12%,transparent);
  border-radius:var(--r3);padding:7px 11px;display:none;
  border:1px solid color-mix(in oklch,var(--red) 25%,transparent);
  animation:fadeIn 200ms var(--e-out);
}


/* Boxes info/success/warn */
.bx-ok,.bx-w,.bx-i{border-radius:var(--r2);padding:12px var(--sp3);font-size:var(--fs-sm);line-height:1.5}
.bx-ok{
  background:color-mix(in oklch,var(--grn) 10%,var(--card));
  border:1px solid color-mix(in oklch,var(--grn) 30%,transparent);
  color:var(--grn);
}
.bx-w{
  background:color-mix(in oklch,var(--org) 10%,var(--card));
  border:1px solid color-mix(in oklch,var(--org) 30%,transparent);
  color:var(--org);
}
.bx-i{
  background:var(--c2);border:1px solid var(--bdr);color:var(--tx2);
}
.bx-hero{
  background:
    radial-gradient(ellipse 80% 60% at 50% 0%,color-mix(in oklch,var(--acc) 22%,transparent),transparent 60%),
    linear-gradient(135deg,var(--c2),var(--card));
  border:1px solid color-mix(in oklch,var(--acc) 30%,transparent);
  border-radius:var(--r);padding:var(--sp5);text-align:center;
  box-shadow:var(--sh2),inset 0 1px 0 rgba(255,255,255,.04);
}
.bh-am{
  font-size:var(--fs-4xl);font-weight:800;color:var(--grn);
  margin:6px 0;font-variant-numeric:tabular-nums;letter-spacing:-.025em;line-height:1;
  text-shadow:0 0 32px color-mix(in oklch,var(--grn) 30%,transparent);
}
.bh-lb{font-size:var(--fs-sm);color:var(--tx2);font-weight:500}
.bh-sb{font-size:var(--fs-md);color:var(--tx);margin-top:4px}


/* Histogram */
/* 2026-05-26 — Refonte sombre des progress bars (Rapport / Bilan / Heures pointe).
   Avant : `.hl color:var(--tx2)` invisible sur fond clair forcé, `.hb bg:var(--c2)`
   piste pâle peu visible. Maintenant : label slate-200, piste slate-800 distincte. */
.hbar{display:flex;flex-direction:column;gap:8px}
.hr2{display:flex;align-items:center;gap:10px;font-size:var(--fs-sm)}
.hl{width:80px;color:#E2E8F0;font-weight:700;text-transform:capitalize;font-size:13px}
.hb{flex:1;background:#1E293B;border:1px solid #334155;border-radius:999px;height:10px;overflow:hidden}
.hf{
  height:100%;
  background:linear-gradient(90deg,var(--acc) 0%,var(--acc-2) 50%,var(--grn) 100%);
  border-radius:var(--r-pill);
  transition:width .7s var(--e-out);
  box-shadow:0 0 10px color-mix(in oklch,var(--acc) 40%,transparent);
}
.hv{min-width:60px;text-align:right;font-weight:900;font-size:14px;font-variant-numeric:tabular-nums;color:#34D399}


/* 2026-05-26 — Refonte sombre .tg2/.tc2/.tp/.tpr/.td (grilles produits) */
.tg2{display:grid;grid-template-columns:1fr 1fr;gap:8px}
.tc2{background:#020617;border:1px solid #1E293B;border-radius:10px;padding:11px;text-align:center}
.tp{font-size:11px;font-weight:800;color:#94A3B8;text-transform:uppercase;letter-spacing:.06em}
.tpr{font-size:15px;font-weight:900;color:#34D399;margin-top:4px;font-variant-numeric:tabular-nums}
.td{font-size:11px;color:#CBD5E1;font-weight:600;margin-top:3px}


/* 2026-05-26 — Refonte sombre .opb (cartes opérateurs / staff stats) */
.opb{
  background:#020617;border:1px solid #1E293B;border-left:4px solid #22D3EE;
  border-radius:12px;padding:12px 14px;display:flex;justify-content:space-between;
  align-items:center;gap:10px;color:#FFFFFF;
}
.opca{font-size:18px;font-weight:900;color:#34D399;font-variant-numeric:tabular-nums;letter-spacing:-.015em}


.trg{display:grid;grid-template-columns:1fr 1fr;gap:8px}
.trb{
  padding:14px;border-radius:var(--r2);
  border:1px solid var(--bdr);background:var(--card);
  cursor:pointer;text-align:center;
  transition:border-color var(--t-med),background var(--t-med),transform var(--t-fast);
  min-height:60px;
}
.trb:hover{border-color:var(--bdr3);transform:translateY(-1px)}
.trb.sel{border-color:var(--blu);background:color-mix(in oklch,var(--blu) 12%,var(--card));box-shadow:0 0 0 1px color-mix(in oklch,var(--blu) 40%,transparent)}


/* Tables */
.tbl2{width:100%;border-collapse:collapse;font-size:var(--fs-sm)}
.tbl2 th{
  background:var(--c2);padding:9px;text-align:left;
  color:var(--tx2);font-size:var(--fs-xs);
  text-transform:uppercase;letter-spacing:.06em;font-weight:600;
  border-bottom:1px solid var(--bdr);position:sticky;top:0;
}
.tbl2 td{padding:10px 9px;border-bottom:1px solid var(--bdr)}
.tbl2 tr:last-child td{border-bottom:0}
.tbl2 tr:hover td{background:color-mix(in oklch,var(--acc) 5%,transparent)}
.tbl2 .n{text-align:right;font-weight:600;color:var(--grn);font-variant-numeric:tabular-nums}


.hi-item{padding:11px 0;border-bottom:1px solid var(--bdr);font-size:var(--fs-md)}
.hi-item:last-child{border-bottom:0}


/* ─── 20 · STARS ─── */
.stars{display:flex;gap:10px;justify-content:center;padding:6px 0}
.star{
  font-size:38px;cursor:pointer;
  transition:transform 280ms var(--e-bounce),filter var(--t-fast),opacity var(--t-fast);
  filter:grayscale(1);opacity:.35;color:#ffc840;user-select:none;line-height:1;
}
.star:hover:not(.on){opacity:.6;transform:scale(1.08)}
.star.on{
  filter:drop-shadow(0 3px 12px rgba(255,200,64,.55)) drop-shadow(0 0 20px rgba(255,200,64,.25));
  opacity:1;transform:scale(1.1);
}


/* ─── 21 · CHAT ─── */
.chat-area{
  flex:1;overflow-y:auto;
  padding:var(--sp3);
  display:flex;flex-direction:column;gap:6px;
  -webkit-overflow-scrolling:touch;
}
.msg-out,.msg-in{
  max-width:78%;padding:10px 14px;font-size:var(--fs-sm);
  line-height:1.5;
  animation:msgIn 280ms var(--e-bounce);
  word-wrap:break-word;position:relative;
}
@keyframes msgIn{from{opacity:0;transform:translateY(6px) scale(.96)}to{opacity:1;transform:none}}
.msg-out{
  align-self:flex-end;background:var(--acc);color:#fff;
  border-radius:18px 18px 4px 18px;
  box-shadow:0 2px 8px rgba(0,0,0,.2),var(--sh-inset-hl);
}
.msg-in{
  align-self:flex-start;background:var(--c2);border:1px solid var(--bdr);
  color:var(--tx);border-radius:18px 18px 18px 4px;
}
.msg-time{font-size:10px;opacity:.7;margin-top:4px;letter-spacing:.02em}
.msg-audio{
  display:flex;align-items:center;gap:10px;
  padding:10px 14px;background:var(--c2);border:1px solid var(--bdr);
  border-radius:18px 18px 18px 4px;cursor:pointer;
  transition:background var(--t-fast);
}
.msg-audio:hover{background:var(--c3)}
.msg-audio-out{background:var(--acc);border-color:var(--acc);color:#fff}
.rec-btn{
  width:46px;height:46px;border-radius:50%;
  border:0;cursor:pointer;
  display:flex;align-items:center;justify-content:center;
  font-size:18px;transition:all var(--t-fast);flex-shrink:0;
}
.rec-btn.idle{background:var(--c2);border:1px solid var(--bdr);color:var(--tx)}
.rec-btn.idle:hover{background:var(--c3)}
.rec-btn.recording{background:var(--red);color:#fff;animation:recPulse 1s infinite}
@keyframes recPulse{
  0%,100%{box-shadow:0 0 0 0 color-mix(in oklch,var(--red) 50%,transparent)}
  50%{box-shadow:0 0 0 14px color-mix(in oklch,var(--red) 0%,transparent)}
}


/* ─── 22 · QR ─── */
.qr-wrap{display:flex;flex-direction:column;align-items:center;gap:var(--sp3);text-align:center;padding:var(--sp4) 0}
.qr-code-big{
  font-size:24px;font-weight:700;
  font-family:"SF Mono",Menlo,Consolas,"Courier New",monospace;
  color:var(--acc);letter-spacing:4px;
  background:
    linear-gradient(135deg,color-mix(in oklch,var(--acc) 12%,transparent),color-mix(in oklch,var(--grn) 8%,transparent)),
    var(--c2);
  border:1px dashed color-mix(in oklch,var(--acc) 40%,transparent);
  padding:16px 24px;border-radius:var(--r2);
  display:inline-block;margin:4px auto;
  box-shadow:inset 0 1px 2px rgba(0,0,0,.25),0 2px 10px color-mix(in oklch,var(--acc) 15%,transparent);
  cursor:pointer;transition:transform var(--t-fast),background var(--t-fast);
}
.qr-code-big:hover{transform:scale(1.02)}


/* ─── 23 · EMPTY / LOADING ─── */
.emp{
  display:flex;flex-direction:column;align-items:center;gap:10px;
  padding:var(--sp8) var(--sp4);
  color:var(--tx2);font-size:var(--fs-sm);text-align:center;line-height:1.55;
}
.emp .ei,.emp > span:first-child{font-size:40px;opacity:.55;margin-bottom:6px;display:block}
.lds{display:flex;align-items:center;justify-content:center;gap:10px;padding:var(--sp6);color:var(--tx2);font-size:var(--fs-sm)}
.spn{
  width:18px;height:18px;
  border:2px solid var(--bdr);border-top-color:var(--acc);
  border-radius:50%;animation:rot .7s linear infinite;
}
@keyframes rot{to{transform:rotate(360deg)}}


/* Skeleton */
.sk{
  background:linear-gradient(90deg,var(--c2) 25%,var(--c3) 50%,var(--c2) 75%);
  background-size:200% 100%;
  animation:skl 1.4s ease-in-out infinite;
  border-radius:var(--r3);
}
@keyframes skl{0%{background-position:200% 0}100%{background-position:-200% 0}}
.sk-kpi{display:grid;grid-template-columns:1fr 1fr;gap:8px}
.sk-box{height:72px;border-radius:var(--r2)}
.sk-line{height:14px;border-radius:4px;margin-bottom:8px}
.sk-line.sm{height:11px;width:60%}
.sk-card{background:var(--card);border:1px solid var(--bdr);border-radius:var(--r);padding:var(--sp4);margin-bottom:8px}


/* ─── 24 · TOAST ─── */
#toast,#mb-toast{
  position:fixed;bottom:calc(78px + env(safe-area-inset-bottom));left:50%;
  transform:translateX(-50%) translateY(14px);
  background:color-mix(in oklch,var(--card) 90%,transparent);
  -webkit-backdrop-filter:blur(16px);backdrop-filter:blur(16px);
  color:var(--tx);
  padding:11px 20px;border-radius:var(--r-pill);
  font-size:var(--fs-sm);font-weight:500;
  z-index:9999;opacity:0;
  transition:opacity var(--t-med),transform var(--t-med);
  pointer-events:none;white-space:nowrap;max-width:92vw;
  border:1px solid var(--bdr);box-shadow:var(--sh3);
}
#toast.on,#mb-toast.on{opacity:1;transform:translateX(-50%) translateY(0)}


/* ─── 25 · OFFLINE BADGE ─── */
#offline-badge{
  position:fixed;top:56px;left:0;right:0;
  background:linear-gradient(90deg,var(--red),color-mix(in oklch,var(--red) 65%,#000));
  color:#fff;text-align:center;
  font-size:var(--fs-xs);font-weight:600;
  padding:8px;z-index:999;display:none;
  letter-spacing:.02em;
  animation:slideDown var(--t-med) ease;
  box-shadow:0 2px 14px color-mix(in oklch,var(--red) 40%,transparent);
}
@keyframes slideDown{from{transform:translateY(-100%)}to{transform:none}}


/* ─── 26 · FLOATING CHROME ─── */
#admin-btn{
  position:fixed;top:10px;right:10px;z-index:9999;
  /* Contraste WCAG AA : couleur claircie + opacite fond renforcee */
  background:color-mix(in oklch,var(--acc) 30%,transparent);
  -webkit-backdrop-filter:blur(10px);backdrop-filter:blur(10px);
  border:1px solid color-mix(in oklch,var(--acc) 50%,transparent);
  color:#b9b3ff;
  font-size:11px;font-weight:700;
  padding:7px 12px;border-radius:var(--r-pill);
  cursor:pointer;letter-spacing:.05em;text-transform:uppercase;
  transition:all var(--t-med);font-family:inherit;
}
#admin-btn:hover,#admin-btn:focus-visible{
  background:color-mix(in oklch,var(--acc) 45%,transparent);
  color:#ffffff;
  transform:translateY(-1px);
}
#theme-toggle{
  position:fixed;top:10px;left:10px;z-index:9998;
  width:38px;height:38px;border-radius:50%;
  background:color-mix(in oklch,var(--acc) 14%,transparent);
  -webkit-backdrop-filter:blur(10px);backdrop-filter:blur(10px);
  border:1px solid color-mix(in oklch,var(--acc) 28%,transparent);
  color:var(--acc);
  font-size:17px;cursor:pointer;
  display:flex;align-items:center;justify-content:center;
  transition:all var(--t-med);
}
#theme-toggle:hover{transform:scale(1.06) rotate(15deg);background:color-mix(in oklch,var(--acc) 22%,transparent)}


#ev-wa-fab{
  position:fixed;right:16px;bottom:calc(82px + env(safe-area-inset-bottom));
  z-index:9994;width:54px;height:54px;border-radius:50%;
  background:#25d366;color:#fff;border:0;cursor:pointer;
  box-shadow:0 8px 24px rgba(37,211,102,.5),inset 0 1px 0 rgba(255,255,255,.3);
  display:flex;align-items:center;justify-content:center;
  font-size:26px;transition:transform var(--t-fast),box-shadow var(--t-med);
}
#ev-wa-fab:hover{transform:scale(1.06);box-shadow:0 12px 30px rgba(37,211,102,.7),inset 0 1px 0 rgba(255,255,255,.3)}
#ev-wa-fab:active{transform:scale(.94)}


#ev-smart-banner{
  position:fixed;top:0;left:0;right:0;z-index:9996;
  background:linear-gradient(135deg,var(--grn),var(--acc));
  color:#fff;padding:10px var(--sp3);
  display:none;align-items:center;gap:10px;
  box-shadow:0 4px 20px rgba(0,0,0,.3);
  animation:slideDown var(--t-med) ease-out;
  font-size:var(--fs-sm);
}
#ev-smart-banner.show{display:flex}
#ev-smart-banner img{width:36px;height:36px;border-radius:9px;flex-shrink:0;box-shadow:0 2px 8px rgba(0,0,0,.3)}
.sb-txt{flex:1;line-height:1.35;min-width:0}
.sb-title{font-weight:700;font-size:var(--fs-md)}
.sb-sub{opacity:.92;font-size:var(--fs-xs)}
.sb-btn{
  background:#fff;color:var(--acc);
  border:0;border-radius:var(--r-pill);
  padding:8px 14px;font-size:var(--fs-xs);font-weight:700;
  cursor:pointer;text-decoration:none;white-space:nowrap;
  transition:transform var(--t-fast);
}
.sb-btn:hover{transform:scale(1.04)}
.sb-close{background:none;border:0;color:#fff;font-size:20px;cursor:pointer;opacity:.85;padding:0 4px;line-height:1}


/* ─── 27 · PTR ─── */
.ptr-bar{
  position:absolute;top:0;left:0;right:0;height:3px;
  background:var(--grad-brand);
  transform:scaleX(0);transform-origin:left;
  transition:transform .3s;z-index:10;border-radius:0 3px 3px 0;
  box-shadow:0 0 10px color-mix(in oklch,var(--acc) 50%,transparent);
}
.ptr-ic{
  position:absolute;top:8px;left:50%;transform:translateX(-50%) rotate(0deg);
  font-size:18px;opacity:0;
  transition:opacity var(--t-fast),transform .3s;
  pointer-events:none;z-index:10;color:var(--acc);
}
.ptr-ic.show{opacity:1}
.ptr-ic.ready{animation:ptrSpin .6s linear infinite}
@keyframes ptrSpin{to{transform:translateX(-50%) rotate(360deg)}}


/* ─── 28 · MEMBRE HOME — HERO POINTS (.mb-hero) ─── */
.mb-hero{
  position:relative;overflow:hidden;
  padding:var(--sp7) var(--sp5) !important;
  border-radius:var(--r) !important;
  background:
    radial-gradient(ellipse 80% 60% at 50% 0%,color-mix(in oklch,var(--acc) 32%,transparent),transparent 62%),
    linear-gradient(135deg,color-mix(in oklch,var(--acc) 20%,var(--c1)) 0%,var(--c1) 55%,var(--card) 100%) !important;
  border:1px solid color-mix(in oklch,var(--acc) 38%,transparent) !important;
  box-shadow:
    0 24px 68px -22px color-mix(in oklch,var(--acc) 45%,transparent),
    inset 0 1px 0 rgba(255,255,255,.08) !important;
}
.mb-hero::before{
  content:"";position:absolute;inset:0;
  background:radial-gradient(circle at 20% 30%,color-mix(in oklch,var(--grn) 18%,transparent),transparent 50%);
  pointer-events:none;
}
.mb-hero::after{
  content:"";position:absolute;top:-40%;right:-20%;
  width:380px;height:380px;
  background:radial-gradient(circle,color-mix(in oklch,var(--acc) 28%,transparent) 0%,transparent 70%);
  pointer-events:none;filter:blur(50px);
  animation:mbGlow 8s ease-in-out infinite alternate;
}
@keyframes mbGlow{0%{transform:translate(0,0) scale(1)}100%{transform:translate(-30px,24px) scale(1.2)}}
.mb-hero-content{position:relative;z-index:1;text-align:center}
.mb-hero-label{
  font-size:var(--fs-xs);text-transform:uppercase;letter-spacing:.14em;
  color:var(--tx2);font-weight:600;margin-bottom:var(--sp2);
}
.mb-hero-pts{
  font-size:var(--fs-hero);font-weight:900;line-height:1;
  background:var(--grad-text-br);
  -webkit-background-clip:text;background-clip:text;-webkit-text-fill-color:transparent;
  letter-spacing:-.045em;margin:4px 0;
  font-variant-numeric:tabular-nums;
  filter:drop-shadow(0 4px 24px color-mix(in oklch,var(--acc) 30%,transparent));
  animation:heroShimmer 1s ease-out;
}
@keyframes heroShimmer{from{opacity:0;transform:scale(.9)}to{opacity:1;transform:scale(1)}}
.mb-hero-dh{
  font-size:var(--fs-md);font-weight:600;color:var(--grn);
  margin-bottom:var(--sp4);
  display:inline-flex;align-items:center;gap:6px;
  padding:6px 14px;
  background:color-mix(in oklch,var(--grn) 14%,transparent);
  border-radius:var(--r-pill);
  border:1px solid color-mix(in oklch,var(--grn) 28%,transparent);
  font-variant-numeric:tabular-nums;
  box-shadow:0 0 20px color-mix(in oklch,var(--grn) 20%,transparent);
}
.mb-hero-bar{
  background:rgba(255,255,255,.08);border-radius:var(--r-pill);
  height:10px;overflow:hidden;margin:var(--sp4) 0 10px;
  box-shadow:inset 0 1px 2px rgba(0,0,0,.3);
}
.mb-hero-bar > div{
  height:100%;
  background:linear-gradient(90deg,var(--acc) 0%,var(--acc-2) 50%,var(--grn) 100%);
  border-radius:var(--r-pill);
  transition:width .9s var(--e-out);
  box-shadow:0 0 16px color-mix(in oklch,var(--acc) 60%,transparent);
}
.mb-hero-meta{font-size:var(--fs-sm);color:var(--tx2);margin-top:6px}
.mb-hero-reward{
  display:inline-block;margin-top:var(--sp3);
  padding:8px 18px;
  background:linear-gradient(135deg,color-mix(in oklch,var(--org) 22%,transparent),color-mix(in oklch,var(--grn) 14%,transparent));
  border:1px solid color-mix(in oklch,var(--org) 38%,transparent);
  border-radius:var(--r-pill);
  font-size:var(--fs-sm);font-weight:600;color:var(--org);
  box-shadow:0 4px 14px color-mix(in oklch,var(--org) 20%,transparent);
}


/* ─── 29 · MEMBRE CARDS (.mb-half/.mb-full/.mb-card-title/.mb-row) ─── */
.mb-half,.mb-full{
  padding:var(--sp5) !important;border-radius:var(--r) !important;
  border:1px solid var(--bdr) !important;
  background:var(--card) !important;
  box-shadow:var(--sh1);
  transition:transform var(--t-med),border-color var(--t-med),box-shadow var(--t-med);
  position:relative;overflow:hidden;
}
.mb-half::before,.mb-full::before{
  content:"";position:absolute;inset:0;
  background:linear-gradient(135deg,color-mix(in oklch,var(--acc) 4%,transparent),transparent 50%);
  pointer-events:none;
}
.mb-half:hover,.mb-full:hover{
  transform:translateY(-2px);
  border-color:color-mix(in oklch,var(--acc) 28%,var(--bdr3)) !important;
  box-shadow:var(--sh2),0 10px 30px -12px color-mix(in oklch,var(--acc) 30%,transparent);
}
.mb-card-title{
  display:flex;align-items:center;gap:10px;
  font-size:var(--fs-xs);text-transform:uppercase;letter-spacing:.12em;
  font-weight:700;color:var(--tx2);margin-bottom:var(--sp4);
  padding-bottom:var(--sp3);
  border-bottom:1px solid var(--bdr);
  position:relative;
}
.mb-card-title .ic{
  width:32px;height:32px;border-radius:10px;
  display:inline-flex;align-items:center;justify-content:center;
  font-size:16px;
  background:linear-gradient(135deg,color-mix(in oklch,var(--acc) 22%,transparent),color-mix(in oklch,var(--grn) 10%,transparent));
  border:1px solid color-mix(in oklch,var(--acc) 30%,transparent);
  box-shadow:0 2px 10px color-mix(in oklch,var(--acc) 20%,transparent),inset 0 1px 0 rgba(255,255,255,.1);
}
.mb-row{
  display:flex;justify-content:space-between;align-items:center;
  padding:10px 0;font-size:var(--fs-md);
  border-bottom:1px dashed var(--bdr);gap:var(--sp3);
  position:relative;
}
.mb-row:last-child{border-bottom:0}
.mb-row .l{color:var(--tx2);font-size:var(--fs-sm)}
.mb-row .r{font-weight:600;color:var(--tx);font-variant-numeric:tabular-nums}
.mb-row .r.acc{color:var(--acc)}
.mb-row .r.grn{color:var(--grn)}


/* KPI tiles membre */
.mb-kpi-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:8px;margin-top:var(--sp2);position:relative}
.mb-kpi-tile{
  text-align:center;padding:var(--sp4) 10px;border-radius:var(--r2);
  background:var(--c2);border:1px solid var(--bdr);
  transition:border-color var(--t-fast),transform var(--t-fast),background var(--t-fast);
  position:relative;overflow:hidden;
}
.mb-kpi-tile::before{
  content:"";position:absolute;inset:0;
  background:linear-gradient(135deg,color-mix(in oklch,var(--acc) 5%,transparent),transparent 70%);
  pointer-events:none;
}
.mb-kpi-tile:hover{border-color:color-mix(in oklch,var(--acc) 30%,var(--bdr3));transform:translateY(-2px);background:var(--c3)}
.mb-kpi-val{
  font-size:var(--fs-2xl);font-weight:800;line-height:1;
  letter-spacing:-.025em;margin-bottom:6px;
  font-variant-numeric:tabular-nums;color:var(--tx);position:relative;
}
.mb-kpi-val.acc{color:var(--acc);text-shadow:0 0 20px color-mix(in oklch,var(--acc) 30%,transparent)}
.mb-kpi-val.grn{color:var(--grn);text-shadow:0 0 20px color-mix(in oklch,var(--grn) 30%,transparent)}
.mb-kpi-val.org{color:var(--org);text-shadow:0 0 20px color-mix(in oklch,var(--org) 30%,transparent)}
.mb-kpi-lbl{
  font-size:10px;text-transform:uppercase;letter-spacing:.1em;
  color:var(--tx2);font-weight:600;position:relative;
}


/* CTA banner */
.mb-cta{
  position:relative;overflow:hidden;
  padding:var(--sp6) var(--sp5) !important;border-radius:var(--r) !important;
  text-align:center;
  background:
    radial-gradient(ellipse 70% 60% at 50% 0%,color-mix(in oklch,var(--acc) 24%,transparent),transparent 60%),
    linear-gradient(135deg,var(--c1),var(--card)) !important;
  border:1px solid color-mix(in oklch,var(--acc) 32%,transparent) !important;
  box-shadow:0 4px 20px -8px color-mix(in oklch,var(--acc) 25%,transparent);
}
.mb-cta-ic{font-size:34px;margin-bottom:6px;position:relative;z-index:1;filter:drop-shadow(0 4px 12px color-mix(in oklch,var(--acc) 40%,transparent))}
.mb-cta-title{font-size:var(--fs-lg);font-weight:700;color:var(--tx);margin-bottom:6px;position:relative;z-index:1;letter-spacing:-.015em}
.mb-cta-desc{font-size:var(--fs-sm);color:var(--tx2);line-height:1.55;margin-bottom:var(--sp4);max-width:520px;margin-left:auto;margin-right:auto;position:relative;z-index:1}
.mb-cta > .btn{max-width:280px;margin:0 auto;display:inline-flex !important;position:relative;z-index:1}


/* Parrainage */
.mb-parr{
  padding:var(--sp6) var(--sp5) !important;border-radius:var(--r) !important;
  background:
    radial-gradient(ellipse 60% 40% at 0% 0%,color-mix(in oklch,var(--org) 22%,transparent),transparent 60%),
    linear-gradient(135deg,color-mix(in oklch,var(--org) 8%,var(--c1)) 0%,var(--card) 100%) !important;
  border:1px solid color-mix(in oklch,var(--org) 32%,transparent) !important;
  position:relative;overflow:hidden;
}
.mb-parr::before{
  content:"";position:absolute;top:-30%;right:-20%;width:300px;height:300px;
  background:radial-gradient(circle,color-mix(in oklch,var(--org) 18%,transparent),transparent 70%);
  filter:blur(40px);pointer-events:none;
}
.mb-parr-title{color:var(--org) !important}
.mb-parr-title .ic{
  background:linear-gradient(135deg,color-mix(in oklch,var(--org) 28%,transparent),color-mix(in oklch,var(--org) 10%,transparent)) !important;
  border-color:color-mix(in oklch,var(--org) 42%,transparent) !important;
  box-shadow:0 2px 10px color-mix(in oklch,var(--org) 20%,transparent),inset 0 1px 0 rgba(255,255,255,.1) !important;
}
.mb-parr-link{
  background:var(--c2);
  border:1px dashed color-mix(in oklch,var(--org) 38%,transparent);
  border-radius:var(--r2);padding:12px 14px;margin:var(--sp3) 0;
  font-family:"SF Mono",Menlo,Consolas,monospace;font-size:var(--fs-sm);
  color:var(--org);word-break:break-all;
  box-shadow:inset 0 1px 2px rgba(0,0,0,.2);
}
.mb-parr-btns{display:grid;grid-template-columns:1fr 1fr;gap:8px;margin-bottom:var(--sp4)}
.mb-parr-bar{
  background:var(--c2);border-radius:var(--r-pill);
  height:10px;overflow:hidden;margin:var(--sp4) 0 var(--sp2);
  box-shadow:inset 0 1px 2px rgba(0,0,0,.3);
}
.mb-parr-bar > div{
  height:100%;
  background:linear-gradient(90deg,var(--org),#ffd566,var(--grn));
  border-radius:var(--r-pill);transition:width .9s var(--e-out);
  box-shadow:0 0 10px color-mix(in oklch,var(--org) 40%,transparent);
}
.mb-parr-progress{font-size:var(--fs-xs);color:var(--tx2);text-align:center;font-weight:500}


.mb-qr-code{
  display:inline-block;padding:12px 22px;
  background:
    linear-gradient(135deg,color-mix(in oklch,var(--acc) 14%,transparent),color-mix(in oklch,var(--grn) 8%,transparent)),
    var(--c2);
  border:1px dashed color-mix(in oklch,var(--acc) 42%,transparent);
  border-radius:var(--r2);
  font-family:"SF Mono",Menlo,Consolas,monospace;
  font-size:var(--fs-md);font-weight:700;color:var(--acc);
  letter-spacing:.18em;cursor:pointer;
  transition:all var(--t-fast);
  box-shadow:inset 0 1px 2px rgba(0,0,0,.2);
}
.mb-qr-code:hover{background:var(--c3);transform:scale(1.02)}
.mb-actions{display:grid;grid-template-columns:1fr 1fr;gap:8px;margin-top:var(--sp4)}
.mb-actions > .btn.full-w{grid-column:1/-1}


/* ─── 30 · ONBOARDING overlay ─── */
.ev-onb-ov,#ev-onb-overlay{
  position:fixed;inset:0;z-index:9997;
  background:color-mix(in oklch,#000 82%,transparent);
  -webkit-backdrop-filter:blur(16px);backdrop-filter:blur(16px);
  display:none;align-items:center;justify-content:center;padding:var(--sp4);
}
.ev-onb-card{
  width:100%;max-width:420px;
  background:var(--card);
  border:1px solid var(--bdr);
  border-radius:var(--r);padding:var(--sp6);
  text-align:center;box-shadow:var(--sh3);
  display:flex;flex-direction:column;gap:var(--sp3);
}
.ev-onb-ico{font-size:56px;line-height:1;filter:drop-shadow(0 0 20px color-mix(in oklch,var(--acc) 50%,transparent))}
.ev-onb-title{font-size:var(--fs-xl);font-weight:700;letter-spacing:-.015em;color:var(--tx)}
.ev-onb-txt{font-size:var(--fs-md);color:var(--tx2);line-height:1.55}
.ev-onb-dots{display:flex;justify-content:center;gap:6px;padding:4px 0}
.ev-onb-dot{width:7px;height:7px;border-radius:50%;background:var(--bdr3);transition:background var(--t-fast),transform var(--t-fast)}
.ev-onb-dot.on{background:var(--acc);transform:scale(1.3)}


/* Offline full page */
#ev-offline-full{
  position:fixed;inset:0;z-index:9998;
  background:var(--c0);display:none;
  flex-direction:column;align-items:center;justify-content:center;
  padding:var(--sp4);text-align:center;gap:var(--sp3);
}
.ev-offline-ico{font-size:64px;opacity:.6}
.ev-offline-t{font-size:var(--fs-xl);font-weight:700;color:var(--tx)}
.ev-offline-p{font-size:var(--fs-md);color:var(--tx2);max-width:400px;line-height:1.55}
.ev-offline-btn{margin-top:var(--sp3)}


/* Pin admin box */
.admin-pin-box{
  background:var(--card);border:1px solid var(--bdr);
  border-radius:var(--r);padding:var(--sp6) var(--sp5);
  width:90%;max-width:340px;
  display:flex;flex-direction:column;gap:var(--sp3);
  text-align:center;box-shadow:var(--sh3);
}


/* ─── 31 · FOCUS VISIBLE ─── */
:focus-visible{outline:2px solid var(--acc);outline-offset:2px;border-radius:4px}
button:focus-visible,.btn:focus-visible,.ni:focus-visible,.atab:focus-visible,.pk:focus-visible,.ob:focus-visible,.pbt:focus-visible,.ib:focus-visible{outline:none;box-shadow:var(--ring)}
:focus:not(:focus-visible){outline:none}


/* ─── 32 · TWEAKS PANEL ─── */
#tweaks-panel{
  position:fixed;right:20px;bottom:20px;z-index:10000;
  background:color-mix(in oklch,var(--card) 94%,transparent);
  -webkit-backdrop-filter:blur(24px) saturate(180%);backdrop-filter:blur(24px) saturate(180%);
  border:1px solid var(--bdr3);border-radius:var(--r);
  box-shadow:var(--sh3);padding:var(--sp4);
  width:300px;display:none;flex-direction:column;gap:var(--sp3);
  font-size:var(--fs-sm);max-height:80vh;overflow-y:auto;
  animation:twIn 260ms var(--e-bounce);
}
@keyframes twIn{from{opacity:0;transform:translateY(10px) scale(.96)}to{opacity:1;transform:none}}
#tweaks-panel.on{display:flex}
#tweaks-panel h3{
  font-size:var(--fs-sm);font-weight:700;
  text-transform:uppercase;letter-spacing:.1em;
  color:var(--tx2);margin-bottom:2px;
  display:flex;align-items:center;justify-content:space-between;
}
.tw-row{display:flex;flex-direction:column;gap:6px}
#tweaks-panel label{font-size:var(--fs-xs);color:var(--tx2);font-weight:500}
#tweaks-panel input[type="range"]{width:100%;accent-color:var(--acc);height:24px}
.tw-swatches{display:flex;gap:6px;flex-wrap:wrap}
.tw-sw{
  width:30px;height:30px;border-radius:var(--r3);
  border:2px solid transparent;cursor:pointer;
  transition:transform var(--t-fast),border-color var(--t-fast);
  box-shadow:0 2px 8px rgba(0,0,0,.3),inset 0 1px 0 rgba(255,255,255,.15);
}
.tw-sw:hover{transform:scale(1.12)}
.tw-sw.on{border-color:var(--tx);transform:scale(1.08)}
.tw-close{
  background:none;border:0;color:var(--tx2);
  font-size:18px;cursor:pointer;padding:0;line-height:1;
  width:24px;height:24px;display:flex;align-items:center;justify-content:center;border-radius:6px;
  transition:color var(--t-fast),background var(--t-fast);
}
.tw-close:hover{color:var(--tx);background:var(--c2)}
.tw-seg{display:flex;gap:4px;background:var(--c2);padding:3px;border-radius:var(--r3);border:1px solid var(--bdr)}
.tw-seg button{
  flex:1;padding:7px 8px;border:0;background:transparent;
  color:var(--tx2);font-size:var(--fs-xs);font-weight:600;
  cursor:pointer;border-radius:5px;font-family:inherit;
  transition:all var(--t-fast);
  min-height:30px;
}
.tw-seg button:hover:not(.on){color:var(--tx)}
.tw-seg button.on{background:var(--acc);color:#fff;box-shadow:0 2px 6px -2px color-mix(in oklch,var(--acc) 50%,transparent)}


#tweaks-toggle{
  position:fixed;right:20px;bottom:calc(140px + env(safe-area-inset-bottom));
  z-index:9995;width:44px;height:44px;border-radius:50%;
  background:color-mix(in oklch,var(--acc) 16%,transparent);
  -webkit-backdrop-filter:blur(12px);backdrop-filter:blur(12px);
  border:1px solid color-mix(in oklch,var(--acc) 32%,transparent);
  color:var(--acc);font-size:18px;cursor:pointer;
  display:flex;align-items:center;justify-content:center;
  box-shadow:var(--sh2);transition:transform var(--t-fast),background var(--t-med);
}
#tweaks-toggle:hover{transform:scale(1.06) rotate(20deg);background:color-mix(in oklch,var(--acc) 26%,transparent)}


/* ─── 33 · RESPONSIVE ─── */


/* Ultra-compact ≤374 (iPhone SE) */
@media (max-width:374px){
  :root{
    --fs-hero:52px;--fs-4xl:30px;--fs-3xl:24px;
    --sp4:12px;--sp5:16px;--sp6:20px;--sp7:24px;
  }
  .scrl{padding:var(--sp3)}
  .tb{padding:0 var(--sp3);height:52px}
  .mb-hero{padding:var(--sp6) var(--sp4) !important}
  .mb-kpi-grid{grid-template-columns:repeat(3,1fr);gap:6px}
  .mb-kpi-val{font-size:var(--fs-xl)}
  .cd{padding:var(--sp4)}
  .pdots{gap:10px}
  .pk{height:52px;font-size:20px}
  .qr-code-big{font-size:20px;letter-spacing:3px;padding:14px 18px}
  .ahero h1{font-size:var(--fs-2xl)}
  .md{padding:var(--sp4)}
  .mdt{font-size:var(--fs-lg)}
  .og{gap:6px}
  .ob{padding:10px 6px;min-height:72px}
  .ob .nm{font-size:var(--fs-xs)}
  .btn{padding:11px var(--sp3);font-size:var(--fs-sm)}
}


/* Tablette ≥768 */
@media (min-width:768px){
  :root{--density:1.02}
  .scrl{padding:var(--sp5)}
  .cd{padding:var(--sp5)}
  .k2{gap:var(--sp3)}
  .kv{font-size:var(--fs-3xl)}
  .mdt{font-size:var(--fs-xl)}
  .ahero h1{font-size:var(--fs-4xl)}
  .ahero .hi{font-size:68px}
  .pk{height:62px;font-size:24px}
  .btn{padding:13px var(--sp4);font-size:var(--fs-md)}
  .pg-grid{grid-template-columns:repeat(8,minmax(72px,1fr))}
  .pc{font-size:12px;min-height:68px}
  .pg2{grid-template-columns:repeat(6,1fr)}
  .mb-hero-pts{font-size:var(--fs-hero)}
}


/* Desktop ≥1024 */
@media (min-width:1024px){
  html,body{overflow:auto}
  :root{--density:1.05}


  #app,#mb-p-app{
    /* Full-width : occupe toute la largeur de l'écran, plus de centrage avec marges vides. */
    width:100%;max-width:none;margin:0;min-height:100vh;
    display:grid;
    grid-template-columns:240px 1fr;
    grid-template-rows:auto 1fr;
    grid-template-areas:"tb tb" "bn main";
  }
  #app > .tb,#mb-p-app > .tb{
    grid-area:tb;position:sticky;top:0;z-index:10;
    padding:0 var(--sp6);height:64px;
  }
  #app > div[style*="flex:1"],#mb-p-app > div[style*="flex:1"]{
    grid-area:main;overflow:hidden;min-height:0;
    padding:var(--sp3) var(--sp5) var(--sp5);
  }
  #app > .bn,#mb-p-app > .bn{
    grid-area:bn;flex-direction:column;
    border-top:0;border-right:1px solid var(--bdr);
    padding:var(--sp3) var(--sp2);gap:2px;
    position:sticky;top:64px;
    height:calc(100vh - 64px);overflow-y:auto;
    background:var(--c1);
  }
  #app > .bn .ni,#mb-p-app > .bn .ni{
    flex:0 0 auto;flex-direction:row;justify-content:flex-start;
    padding:11px var(--sp3);gap:var(--sp3);
    font-size:var(--fs-md);font-weight:500;
    text-transform:none;letter-spacing:0;min-height:44px;
    border-radius:var(--r2);color:var(--tx2);
  }
  #app > .bn .ni .ic,#mb-p-app > .bn .ni .ic{font-size:18px;margin:0}
  #app > .bn .ni:hover,#mb-p-app > .bn .ni:hover{background:var(--c2);color:var(--tx)}
  #app > .bn .ni.on,#mb-p-app > .bn .ni.on{
    background:color-mix(in oklch,var(--acc) 14%,transparent);
    color:var(--acc);
    box-shadow:inset 0 0 0 1px color-mix(in oklch,var(--acc) 25%,transparent);
  }
  #app > .bn .ni.on::before,#app > .bn .ni.on::after,
  #mb-p-app > .bn .ni.on::before,#mb-p-app > .bn .ni.on::after{display:none}
  #app > .bn .ni .nbdg,#mb-p-app > .bn .ni .nbdg{position:static;margin-left:auto}


  /* Auth/login fill whole screen (no sidebar) */
  body:has(#p-auth.on) #mb-p-app,
  body:has(#p-login.on) #app{display:flex;flex-direction:column;max-width:none}
  body:has(#p-auth.on) #mb-p-app > .tb,
  body:has(#p-auth.on) #mb-p-app > .bn,
  body:has(#p-login.on) #app > .tb,
  body:has(#p-login.on) #app > .bn{display:none !important}


  /* Admin grids — full-width, plus de cap à 1200px. */
  #s-acc,#s-fin,#s-eq,#s-ano,#s-rp,#s-env,#s-hist,#s-msg,#s-ctrl,#s-audit,#mb-s-hist{
    display:grid !important;
    grid-template-columns:repeat(auto-fit,minmax(360px,1fr)) !important;
    gap:var(--sp4) !important;
    align-content:start;
    width:100%;max-width:none;margin:0;
  }
  /* Pages Clients & Équipe : structure verticale stricte (cartes → barre → tableau),
     pleine largeur. */
  #s-mbrs,#s-eqp{
    display:flex !important;flex-direction:column !important;gap:24px !important;
    align-content:stretch;width:100%;max-width:none;margin:0;
  }
  #s-acc > .cd:first-of-type,
  #s-fin > .cd:first-of-type,
  #s-rp > .cd:first-of-type,
  #s-env > .cd:first-of-type,
  #s-ctrl > .cd:first-of-type,
  #s-audit > .cd:first-of-type{grid-column:1/-1}
  #s-acc .k2,#s-fin .k2,#s-rp .k2{grid-template-columns:repeat(4,1fr) !important}
  .kv{font-size:var(--fs-3xl)}
  .kc{padding:var(--sp4)}


  /* Membre home 12-col */
  #s-home{
    display:grid !important;
    grid-template-columns:repeat(12,1fr) !important;
    gap:var(--sp5) !important;
    max-width:1100px;margin:0 auto;width:100%;
  }
  #s-home > .mb-hero,
  #s-home > .mb-full,
  #s-home > .mb-cta,
  #s-home > .mb-parr,
  #s-home > div[style*="linear-gradient"],
  #s-home > .cd:not(.mb-half){grid-column:1/-1 !important}
  #s-home > .mb-half{grid-column:span 6 !important}


  #pg-chat{max-width:900px;margin:0 auto;width:100%}
  #pg-caisseop .scrl,#pg-css .scrl,#pg-qr .scrl,#s-qr,#ct-srt .scrl,#s-srt{
    max-width:720px !important;margin:0 auto !important;
  }
  #p-auth,#p-login{align-items:center;justify-content:center}
  .aw{max-width:460px}
  .lw{max-width:440px}


  .pg-grid{grid-template-columns:repeat(8,minmax(72px,1fr));gap:16px}
  .pc{min-height:84px;font-size:13px;border-radius:var(--r2)}
  .pd2{font-size:11px}


  .ov{align-items:center !important;padding:var(--sp4)}
  .md{
    max-width:640px !important;
    border-radius:22px !important;border-bottom:1px solid var(--bdr) !important;
    padding:var(--sp6) !important;
    animation:mdFade 300ms var(--e-out);
  }
  @keyframes mdFade{from{opacity:0;transform:scale(.96) translateY(8px)}to{opacity:1;transform:none}}
  .mdt{font-size:var(--fs-2xl)}


  #ev-wa-fab{right:24px;bottom:24px}
  #admin-btn{top:14px;right:20px}
  #theme-toggle{top:14px;right:80px;left:auto}
  #tweaks-toggle{right:24px;bottom:92px}
  #ev-smart-banner{max-width:520px;left:50%;transform:translateX(-50%);border-radius:0 0 16px 16px}


  .cd:hover{transform:translateY(-1px);box-shadow:var(--sh2)}
  .btn:not(:disabled):hover{transform:translateY(-1px)}
}


/* Large desktop ≥1440 */
@media (min-width:1440px){
  :root{--fs-hero:72px;--sp5:24px;--sp6:32px}
  .pg-grid{grid-template-columns:repeat(8,minmax(72px,1fr))}
  .pc{min-height:96px;font-size:14px}
  /* Full-width strict — pas de cap à 1500px. */
  #app,#mb-p-app{max-width:none;width:100%}
}


/* XL / 4K ≥1920 */
@media (min-width:1920px){
  :root{--fs-hero:80px;--fs-4xl:42px}
  /* Full-width strict — pas de cap à 1500px ni grilles capées. */
  #app,#mb-p-app{max-width:none;width:100%}
  #s-acc,#s-fin,#s-env,#s-rp{grid-template-columns:repeat(auto-fit,minmax(400px,1fr)) !important;max-width:none}
  #s-home{max-width:none}
}


/* Landscape phones */
@media (max-height:500px) and (orientation:landscape){
  .ahero{padding:2px 0}
  .ahero .hi{font-size:36px;margin-bottom:2px;animation:none}
  .ahero h1{font-size:var(--fs-xl)}
  .acard{padding:var(--sp3)}
  .fg{gap:3px}
  .tb{height:48px}
  .bn{padding:2px 4px env(safe-area-inset-bottom)}
}


/* Print */
@media print{
  body{background:#fff;color:#000}
  body::before,body::after{display:none}
  #theme-toggle,#admin-btn,.bn,.tb,#toast,#mb-toast,#ev-wa-fab,#ev-smart-banner,#tweaks-toggle,#tweaks-panel{display:none !important}
  .cd,.md{box-shadow:none;border:1px solid #ccc}
}


/* Reduced motion */
@media (prefers-reduced-motion:reduce){
  *,*::before,*::after{
    animation-duration:.01ms !important;
    animation-iteration-count:1 !important;
    transition-duration:.01ms !important;
    scroll-behavior:auto !important;
  }
}




/* ══════════════════════════════════════════════════════════════════
   v7 · FIXES FINALS — zero empty space, perfect responsive
══════════════════════════════════════════════════════════════════ */


/* Base hauteur réelle avec viewport units modernes — fini les zones vides iOS */
html,body{min-height:100vh;min-height:100dvh;min-height:100svh}
html{height:100%}
body{min-height:100dvh;position:relative}
#app,#mb-app,#mode-membre,#mode-admin{min-height:100dvh}
#mode-admin.on,#mode-membre:not(.off){min-height:100dvh}


/* Les "pg" actives doivent remplir tout le conteneur — pas de blanc sous les écrans courts */
.pg{min-height:0}
.pg.on{min-height:100%;flex:1 1 auto;display:flex;flex-direction:column}
.pg.on .scrl{flex:1 1 auto;min-height:0}


/* Backgrounds de sécurité pour qu'aucune zone n'apparaisse en noir brut */
html::before{
  content:"";position:fixed;inset:0;z-index:-1;pointer-events:none;
  background:
    radial-gradient(ellipse 80% 60% at 15% 0%, color-mix(in oklch, var(--acc) 18%, transparent), transparent 60%),
    radial-gradient(ellipse 70% 60% at 90% 100%, color-mix(in oklch, var(--grn) 10%, transparent), transparent 60%),
    var(--c0);
}
html[data-theme="light"]::before{
  background:
    radial-gradient(ellipse 80% 60% at 15% 0%, rgba(124,111,255,.10), transparent 60%),
    radial-gradient(ellipse 70% 60% at 90% 100%, rgba(0,166,118,.08), transparent 60%),
    var(--c0);
}


/* Scroll containers — pas de double scroll, pas de gap en bas */
.scrl{
  overflow-y:auto;overflow-x:hidden;
  overscroll-behavior:contain;
  -webkit-overflow-scrolling:touch;
  padding-bottom:calc(24px + env(safe-area-inset-bottom));
}


/* Top bar — toujours collée, hauteur stable */
.tb{position:sticky;top:0;z-index:50;flex-shrink:0}


/* Bottom nav mobile — safe-area + pas de gap */
@media (max-width:1023px){
  .bn{
    position:sticky;bottom:0;z-index:50;flex-shrink:0;
    padding-bottom:env(safe-area-inset-bottom);
  }
  .scrl{padding-bottom:24px}
}


/* Desktop sidebar — pleine hauteur, pas de gap en bas */
@media (min-width:1024px){
  #mb-p-app.on .bn,
  #mode-admin.on .bn{
    top:0 !important;bottom:0 !important;height:100dvh !important;
    overflow-y:auto;overscroll-behavior:contain;
    padding-bottom:24px !important;
  }
  /* Le container app prend toute la hauteur viewport pour éviter trou en bas */
  #mb-p-app.on,#mode-admin.on #app{min-height:100dvh}
  #mb-p-app.on > div,#mode-admin.on #app > div{min-height:0}
}


/* Auth pages — centrage vertical parfait, zéro gap */
#p-auth.on,#p-login.on{
  min-height:100dvh !important;
  height:auto !important;
  display:flex !important;
  flex-direction:column;
  justify-content:center;
  align-items:center;
  /* Grosse marge basse : le bouton « Se connecter » reste atteignable au
     scroll, jamais coupé par la barre du navigateur mobile ni le clavier. */
  padding:max(24px,env(safe-area-inset-top)) 16px max(96px,calc(env(safe-area-inset-bottom) + 80px));
}
@media (max-height:700px){
  #p-auth.on,#p-login.on{justify-content:flex-start}
}


/* Modales — pas de scroll double, hauteur safe */
.ov.on{overflow-y:auto;padding:env(safe-area-inset-top) 0 env(safe-area-inset-bottom)}
.md{max-height:calc(100dvh - 32px);overscroll-behavior:contain}
@media (min-width:1024px){.md{max-height:calc(100dvh - 64px)}}


/* Chat area — prend toute la hauteur dispo sans déborder */
#pg-chat.on{display:flex;flex-direction:column;min-height:0;flex:1 1 auto}
.chat-area{flex:1 1 auto;min-height:0;overflow-y:auto;overscroll-behavior:contain}


/* Responsive 320px — tout doit passer */
@media (max-width:374px){
  html{font-size:14px}
  .scrl{padding:12px 10px calc(16px + env(safe-area-inset-bottom))}
  .cd,.mb-half,.mb-full,.mb-hero,.mb-cta,.mb-parr{padding:16px !important;border-radius:14px !important}
  .mb-hero{padding:20px 16px !important}
  .mb-hero-pts{font-size:52px !important;letter-spacing:-1.5px !important}
  .k2{gap:6px}
  .kc{padding:10px}
  .kv{font-size:20px !important}
  .btn{padding:12px 14px !important;font-size:13px !important}
  .fi,.fta{padding:12px !important;font-size:15px !important}
  .ahero .hi{font-size:52px !important}
  .ahero h1{font-size:24px !important}
  .ahero p{font-size:13px !important}
  .atab{padding:11px 8px !important;font-size:13px !important}
  .mb-parr-btns{grid-template-columns:1fr !important}
  .mb-actions{grid-template-columns:1fr !important}
  .pg-grid{grid-template-columns:repeat(8,minmax(72px,1fr)) !important}
  .pg2{grid-template-columns:repeat(3,1fr) !important}
  .tb{height:48px;padding:0 10px}
  .ni{padding:6px 2px 4px !important;font-size:8px !important}
  .ni .ic{font-size:18px !important}
}


/* 375-427 (mobile standard) — typo un chouia réduite */
@media (min-width:375px) and (max-width:427px){
  .mb-hero-pts{font-size:60px !important}
  .ahero h1{font-size:28px !important}
}


/* Tablette 768-1023 — 2 colonnes sur le home membre */
@media (min-width:768px) and (max-width:1023px){
  #s-home{
    display:grid !important;
    grid-template-columns:repeat(2,1fr) !important;
    gap:16px !important;
    align-content:start;
  }
  #s-home > .mb-hero,
  #s-home > .mb-full,
  #s-home > .mb-cta,
  #s-home > .mb-parr{grid-column:1/-1 !important}
  #s-home > .cd:has(.btn){grid-column:1/-1 !important}
  .k2{grid-template-columns:repeat(3,1fr) !important}
  .pg-grid{grid-template-columns:repeat(8,minmax(72px,1fr)) !important}
}


/* Desktop 1024-1439 — aération ajustée, plus de cap de largeur. */
@media (min-width:1024px) and (max-width:1439px){
  .scrl{padding:28px 32px !important;max-width:none !important}
  #s-home{gap:20px !important}
}


/* Ultra-wide 1920+ — padding plus généreux, full-width. */
@media (min-width:1920px){
  .scrl{max-width:none !important;padding:40px 64px !important}
  #s-home{max-width:none !important}
}


/* 2560+ — full-width avec padding adapté. */
@media (min-width:2560px){
  .scrl{max-width:none !important}
  html{font-size:16px}
}


/* Landscape court — éviter que l'auth soit écrasée */
@media (max-height:500px) and (orientation:landscape){
  .ahero{display:none}
  #p-auth.on,#p-login.on{padding:12px}
  .acard{padding:14px !important;gap:10px !important}
  .fi,.fta{padding:9px 12px !important;min-height:38px}
  .btn{padding:10px !important;min-height:38px}
}


/* Empty states — occupent l'espace vertical */
.emp{flex:1;justify-content:center;min-height:200px}


/* Loading states — occupent aussi */
.lds{flex:1;min-height:120px}


/* Images cassées — pas de zone blanche */
img{background:var(--c2)}
img[alt=""]:not([src]){display:none}


/* Inputs autofill — pas de jaune moche */
input:-webkit-autofill,input:-webkit-autofill:hover,input:-webkit-autofill:focus,
textarea:-webkit-autofill,select:-webkit-autofill{
  -webkit-background-clip:text;
  -webkit-text-fill-color:var(--tx) !important;
  caret-color:var(--tx) !important;
  -webkit-box-shadow:0 0 0 1000px var(--c2) inset !important;
  transition:background-color 5000s;
}


/* Grabber uniforme sur modales slide-up mobile */
@media (max-width:1023px){
  .md::before{
    content:"";display:block;width:36px;height:4px;
    background:var(--bdr3);border-radius:999px;
    margin:-8px auto 12px;flex-shrink:0;
  }
}


/* Anti-FOUC — pas de flash blanc au chargement */
body{animation:bootIn .25s ease-out}
@keyframes bootIn{from{opacity:.01}to{opacity:1}}


/* Liens et boutons — cible tactile min 44px Apple HIG partout */
button,.btn,.ni,.atab,.pk,.ob,[onclick]{min-height:44px}
.ni,.atab{min-height:48px}
.star{min-width:44px;min-height:44px;display:inline-flex;align-items:center;justify-content:center}


/* Plan de salle — jamais de cells qui débordent */
.pg-grid{overflow:visible;width:100%}
.pc{min-width:0;overflow:hidden;text-overflow:ellipsis}


/* Éviter overflow horizontal global */
body,#app,#mb-app,#mode-membre,#mode-admin{overflow-x:hidden;max-width:100vw}


/* Textes longs — wrap intelligent */
.sn,.tb-t,.mdt,.mb-card-title,.mb-hero-label{text-wrap:balance;word-break:break-word;overflow-wrap:anywhere}
.mb-parr-link,.qr-code-big{word-break:break-all;overflow-wrap:anywhere}


/* Focus visible uniforme clavier seulement */
:focus-visible{outline:2px solid var(--acc);outline-offset:2px;border-radius:6px}
:focus:not(:focus-visible){outline:none}


/* Tweaks panel — mobile safe */
@media (max-width:480px){
  #tweaks-panel{
    width:calc(100vw - 24px) !important;
    right:12px !important;left:12px !important;
    max-width:none !important;
  }
}


/* Smart banner + WA FAB — coexistence sans overlap */
@media (max-width:1023px){
  #ev-wa-fab{bottom:calc(78px + env(safe-area-inset-bottom)) !important}
  body.has-smart-banner .tb{margin-top:56px}
}
@media (min-width:1024px){
  #ev-wa-fab{bottom:24px !important;right:24px !important}
}


/* Toast — toujours au-dessus de tout, jamais coupé */
#toast,#mb-toast{z-index:10000;bottom:calc(80px + env(safe-area-inset-bottom))}
@media (min-width:1024px){#toast,#mb-toast{bottom:32px}}


/* Sécurité : tout ce qui est invisible (display:none) ne doit PAS occuper d'espace */
[hidden],.pg:not(.on),#form-signup[style*="none"],#form-login[style*="none"]{display:none !important}


/* Card vide protection — si innerHTML vide, hauteur zéro */
.cd:empty,.mb-half:empty,.mb-full:empty{display:none}


/* Light theme — corrections finales */
html[data-theme="light"]{
  --c0:#f7f8fd;
  --c1:#ffffff;
  --c2:#eef0f8;
  --c3:#e4e7f2;
  --card:#ffffff;
  --card-2:#f7f8fd;
  --bdr:rgba(30,30,60,.1);
  --bdr2:rgba(30,30,60,.05);
  --bdr3:rgba(30,30,60,.2);
  --tx:#1a1a30;
  --tx2:#5a5a7a;
  --tx3:#8a8aa5;
}
html[data-theme="light"] body{background:#f7f8fd;color:#1a1a30}
html[data-theme="light"] .tb,
html[data-theme="light"] .bn{background:rgba(255,255,255,.85) !important;border-color:rgba(30,30,60,.08) !important}
html[data-theme="light"] .md,
html[data-theme="light"] .cd{background:#ffffff !important;border-color:rgba(30,30,60,.1) !important}
html[data-theme="light"] .fi,
html[data-theme="light"] .fta{background:#ffffff !important;border-color:rgba(30,30,60,.15) !important;color:#1a1a30 !important}
html[data-theme="light"] .kv{
  background:linear-gradient(135deg,#1a1a30 0%,#5a4fd8 100%) !important;
  -webkit-background-clip:text;background-clip:text;-webkit-text-fill-color:transparent !important;
}


/* Conteneurs flex-column ne doivent jamais laisser espace en bas */
#mb-p-app.on,#app{display:flex;flex-direction:column}
#mb-p-app.on > *,#mode-admin.on #app > *{flex-shrink:0}
#mode-admin.on #app > div:has(.pg.on){flex:1 1 auto;min-height:0;display:flex;flex-direction:column}


/* ─── DESKTOP FIX ≥1024 : réparation grille admin (sidebar 240px + main) ─── */
/* La media query 1024 existante (l.1663) cible #app > .tb / .bn / div[flex:1],
   mais côté admin ces éléments sont enfants de #p-app, pas de #app.
   On ajoute donc des sélecteurs descendants spécifiques sans toucher à l'existant. */
@media (min-width:1024px){
  #app > #p-app.pg.on{
    display:grid !important;
    grid-template-columns:240px 1fr;
    grid-template-rows:auto 1fr;
    grid-template-areas:"tb tb" "bn main";
    width:100%;height:100%;overflow:hidden;flex:none;
  }
  #app > #p-app > .tb{
    grid-area:tb;padding:0 var(--sp6);height:64px;
  }
  #app > #p-app > div[style*="flex:1"]{
    grid-area:main;overflow:hidden;min-height:0;
    padding:var(--sp3) var(--sp5) var(--sp5);
  }
  #app > #p-app > .bn{
    grid-area:bn;flex-direction:column;
    border-top:0;border-right:1px solid #0F172A;       /* slate-900 — refonte 2026-05-26 */
    padding:var(--sp3) var(--sp2);gap:2px;
    height:calc(100vh - 64px);overflow-y:auto;
    background:#020617;                                  /* slate-950 — fond uniforme sombre */
  }
  #app > #p-app > .bn .ni{
    flex:0 0 auto;flex-direction:row;justify-content:flex-start;
    padding:11px var(--sp3);gap:var(--sp3);
    font-size:var(--fs-md);font-weight:500;
    text-transform:none;letter-spacing:0;min-height:44px;
    border-radius:var(--r2);color:#CBD5E1;               /* slate-300 inactif */
  }
  #app > #p-app > .bn .ni .ic{font-size:18px;margin:0}
  #app > #p-app > .bn .ni:hover{background:rgba(15,23,42,.60);color:#FFFFFF}
  #app > #p-app > .bn .ni.on{
    background:#0F172A;                                  /* slate-900 — pilule active */
    color:#22D3EE;                                       /* cyan-400 — texte actif néon */
    border:1px solid #1E293B;
    box-shadow:0 4px 10px rgba(0,0,0,.45),0 0 14px rgba(34,211,238,.18);
  }
  #app > #p-app > .bn .ni.on::before,
  #app > #p-app > .bn .ni.on::after{display:none}
  #app > #p-app > .bn .ni .nbdg{position:static;margin-left:auto}
}

/* Tap targets minimum 44x44 (a11y mobile) — footer / help links */
.footer-link,
.help-link,
.wa-footer{
  display:inline-flex;
  align-items:center;
  min-height:44px;
  padding:10px 12px;
  box-sizing:border-box;
}

/* Skip link — visible uniquement au focus clavier (a11y, WCAG 2.4.1) */
.skip-link{
  position:absolute;
  left:-9999px;
  top:0;
  background:#7c6fff;
  color:#fff;
  padding:10px 16px;
  z-index:99999;
  border-radius:0 0 8px 0;
  font-weight:700;
  text-decoration:none;
  font-size:14px;
}
.skip-link:focus{ left:0 }

/* Utilitaire : cacher visuellement mais lisible par lecteur d'ecran */
.visually-hidden{
  position:absolute !important;
  width:1px;
  height:1px;
  padding:0;
  margin:-1px;
  overflow:hidden;
  clip:rect(0,0,0,0);
  white-space:nowrap;
  border:0;
}

/* Filet a11y : indication de focus systematique (defense en plus) */
:where(button, a, input, select, textarea, [tabindex="0"]):focus-visible{
  outline:2px solid #7c6fff;
  outline-offset:2px;
}

/* Hint visuel sous "Code PIN" quand op + mode sont prets (anim subtile) */
.cp-hint{
  color:var(--acc); font-size:13px; text-align:center;
  margin:6px 0 10px; font-weight:600;
  animation:cpHintPulse 1.5s ease-in-out infinite;
}
@keyframes cpHintPulse{ 0%,100%{opacity:1} 50%{opacity:.55} }
@media (prefers-reduced-motion: reduce){ .cp-hint{ animation:none } }

/* Profil/operator login screen — layout mobile compact (≤480px de large) */
@media (max-width: 480px){
  #p-login .lhero{ padding:6px 0 !important; }
  #p-login .lhero .hi{ font-size:32px !important; }
  #p-login .lhero h2{ font-size:22px !important; margin:2px 0 !important; }
  #p-login .lhero p{ font-size:12px !important; margin-top:2px !important; }
  #p-login .slbl{ font-size:11px !important; margin:4px 0 6px !important; }
  /* Cards profil : 2 colonnes serrees, plus compact */
  #p-login .og{ gap:6px !important; }
  #p-login .ob{ padding:8px 6px !important; }
  #p-login .ob .ic{ font-size:20px !important; margin-bottom:2px !important; }
  #p-login .ob .nm{ font-size:13px !important; }
  #p-login .ob .rl{ font-size:9px !important; margin-top:1px !important; }
  /* Section mode (3 boutons sur 1 ligne) */
  #role-choice{ margin-top:4px; }
  #role-choice > div[style*="grid"]{ gap:5px !important; }
  /* Keypad PIN : touches plus basses pour rentrer dans le viewport */
  #p-login .pw{ padding:14px !important; }
  #p-login .pdots{ height:32px !important; gap:10px !important; margin-bottom:10px !important; }
  #p-login .pp{ gap:6px !important; }
  #p-login .pk{ height:46px !important; font-size:18px !important; }
}

/* Tres petit ecran (paysage smartphone, iPhone SE paysage) */
@media (max-height: 600px) and (max-width: 800px){
  #p-login .lhero{ padding:0 !important; }
  #p-login .lhero .hi{ font-size:24px !important; }
  #p-login .lhero h2{ font-size:16px !important; }
  #p-login .lhero p{ display:none !important; }
  #p-login .ob{ padding:6px 4px !important; }
  #p-login .pw{ padding:10px !important; }
  #p-login .pdots{ height:24px !important; margin-bottom:6px !important; }
  #p-login .pk{ height:40px !important; font-size:16px !important; }
}

/* Modal PIN admin — fix overflow viewport mobile (≤640px de hauteur) */
/* Les inline-style sont fortes : on utilise !important et des selecteurs precis */
@media (max-height: 640px){
  #m-admin-pin > .pin-panel{
    gap:8px !important;
    padding:12px 16px !important;
  }
  #m-admin-pin .pin-panel button{
    height:42px !important;
    min-height:42px !important;
  }
  #m-admin-pin h2{
    font-size:13px !important;
    margin:0 !important;
  }
  #m-admin-pin .pin-panel > div[aria-hidden="true"]{
    font-size:20px !important;
    margin-bottom:0 !important;
  }
}
@media (max-height: 480px){
  #m-admin-pin > .pin-panel{
    gap:4px !important;
    padding:8px 12px !important;
  }
  #m-admin-pin .pin-panel button{
    height:36px !important;
    min-height:36px !important;
    font-size:14px !important;
  }
  #m-admin-pin h2{ font-size:12px !important; }
  /* Cache l'icone cadenas decorative */
  #m-admin-pin .pin-panel > div[aria-hidden="true"]{ display:none !important; }
}

/* Toasts — notifications pop-up empilées en bas à droite (fonction showToast).
   Fond blanc, bordure colorée + liseré gauche épais, icône, disparition auto. */
#toast-container{
  position:fixed;
  bottom:max(16px,env(safe-area-inset-bottom)); right:16px;
  z-index:99999;
  display:flex; flex-direction:column; gap:8px;
  pointer-events:none;
  max-width:min(360px,calc(100vw - 32px));
}
.toast{
  display:flex; align-items:center; gap:10px;
  padding:13px 15px; border-radius:10px;
  background:#fff;
  border:1px solid #e2e8f0; border-left-width:4px;
  box-shadow:0 10px 28px rgba(15,23,42,.18);
  font-size:13.5px; font-weight:600; line-height:1.4;
  opacity:0; transform:translateX(24px);
  transition:opacity .25s ease, transform .25s ease;
  pointer-events:auto;
}
.toast.show{ opacity:1; transform:translateX(0); }
.toast-ic{ font-size:16px; flex-shrink:0; line-height:1 }
.toast--success{ border-color:#10b981; color:#047857 }
.toast--error  { border-color:#ef4444; color:#dc2626 }
.toast--warn   { border-color:#f59e0b; color:#b45309 }
.toast--info   { border-color:#3b82f6; color:#1d4ed8 }


/* ══════════════════════════════════════════════════════════════════
   SOFT UI · AIRY REDESIGN — surcouche purement visuelle
   N'ajoute QUE du style : aucun ID, classe ni markup modifié.
   → Scripts PowerShell & logique de données : 100% intacts.
══════════════════════════════════════════════════════════════════ */

/* ─── Jetons : surfaces claires, bordures fines, rayons généreux ─── */
html[data-theme="light"]{
  --c0:#F3F4F6;          /* fond de page — gris très clair */
  --c1:#FFFFFF;
  --c2:#F1F5F9;
  --c3:#E2E8F0;
  --card:#FFFFFF;        /* cartes : blanc pur */
  --card-2:#F3F4F6;
  --bdr:#E2E8F0;         /* bordures fines */
  --bdr2:#F1F5F9;
  --bdr3:#D8DFE8;
  --acc:#2D5A60;         /* Teal profond — boutons, accents, en-têtes */
  --acc-2:#3C7178;       /* Teal clair — survols */
  --blu:#2D5A60;
  --grad-brand:#2D5A60;
  --tx:#1F2937;          /* texte — noir charbon */
  --tx2:#64748B;
  --tx3:#94A3B8;
  --r:12px;              /* rayons sobres */
  --r2:12px;
  --r3:10px;
  --sh1:0 1px 2px rgba(15,23,42,.04);
  --sh2:0 10px 15px -3px rgba(0,0,0,.05),0 4px 6px -4px rgba(0,0,0,.05);
  --sh3:0 24px 48px -12px rgba(15,23,42,.16),0 8px 20px -10px rgba(15,23,42,.08);
}

/* Fond plat & subtil — on retire grain et halos colorés */
html[data-theme="light"]::before{background:#F3F4F6 !important}
body::before,body::after{display:none !important}
/* Typographie Inter + valeurs KPI en charbon (sans dégradé) */
body{font-family:"Inter",system-ui,-apple-system,"Segoe UI",Roboto,sans-serif}
html[data-theme="light"] .kv{background:none !important;background-clip:border-box !important;-webkit-text-fill-color:currentColor !important}

/* ─── Conteneurs & cartes — Airy ─── */
.scrl{gap:16px}
.cd{
  border-radius:12px;
  padding:24px;
  box-shadow:0 10px 15px -3px rgba(0,0,0,.05),0 4px 6px -4px rgba(0,0,0,.04);
}
html[data-theme="light"] .cd{border-color:#E2E8F0 !important}
.cd-h{margin-bottom:14px;color:var(--acc)}
.kc{border-radius:12px;padding:18px;background:#FFFFFF;border-color:#E2E8F0}
.kc::before{display:none}

/* ─── Boutons — flat & soft ─── */
.btn{border-radius:12px}
.btn::before{display:none}
.btn.ba{box-shadow:0 6px 16px -6px rgba(45,90,96,.40)}
.btn.bg{box-shadow:0 6px 16px -6px rgba(5,150,105,.40)}
.btn.bgh{background:#FFFFFF;border:1px solid #E2E8F0;color:#334155;box-shadow:0 1px 2px rgba(15,23,42,.04)}
.btn.bgh:hover:not(:disabled){background:#F8FAFC;border-color:#CBD5E1;box-shadow:0 6px 14px -6px rgba(15,23,42,.12)}
/* Sortie / Clôture → variante Soft rouge + lueur au survol */
.btn.br,.btn.bd{background:#FEE2E2;color:#DC2626;border:1px solid #FECACA;box-shadow:none}
.btn.br:hover:not(:disabled),.btn.bd:hover:not(:disabled){
  background:#FECACA;border-color:#FCA5A5;filter:none;transform:translateY(-1px);
  box-shadow:0 0 0 4px rgba(220,38,38,.12),0 8px 18px -8px rgba(220,38,38,.35);
}
/* Clôture Manager / Transfert → variante Soft orange + lueur */
.btn.bo{background:#FFF7ED;color:#C2410C;border:1px solid #FBE0BE;box-shadow:none}
.btn.bo:hover:not(:disabled){
  background:#FFEFD9;border-color:#F6CB8E;filter:none;transform:translateY(-1px);
  box-shadow:0 0 0 4px rgba(234,88,12,.10),0 8px 18px -8px rgba(234,88,12,.30);
}
/* Bouton Déconnexion → Soft UI rouge clair */
.ib.hdr-logout,#ni-logout{background:#FEE2E2 !important;color:#DC2626 !important;border:1px solid #FECACA !important}
.ib.hdr-logout:hover,#ni-logout:hover{background:#FECACA !important;color:#DC2626 !important}

/* Pastilles d'info → pills arrondies */
.tg{border-radius:999px;padding:4px 11px}

/* ─── Cartes Postes (.sc) ─── */
.sc{
  border:1px solid #E2E8F0;border-left:1px solid #E2E8F0;
  border-radius:12px;padding:20px;
  box-shadow:0 10px 15px -3px rgba(0,0,0,.05),0 4px 6px -4px rgba(0,0,0,.04);
}
.sc.w{border-color:#FDE8C4;background:#FFFBF3}
.sc.a{border-color:#FBD0D0;background:#FEF5F5}
.sc .sn{font-size:16px;font-weight:700}
/* Montant → pastille verte douce */
.sc .sp{background:#ECFDF5;color:#059669;padding:6px 13px;border-radius:999px;font-size:14px;font-weight:800}
/* Timer imposant & central */
.sc .tgs{justify-content:center;gap:6px;margin-top:12px}
.sc .tg:has([id^="ld-"]){
  order:-1;width:100%;
  display:flex;flex-direction:column;align-items:center;gap:2px;
  background:#F8FAFC;border:1px solid #E2E8F0;border-radius:16px;
  padding:16px 12px;margin-bottom:4px;font-size:0;
}
.sc .tg:has([id^="ld-"])::before{
  content:"TEMPS ÉCOULÉ";
  font-size:10px;font-weight:700;letter-spacing:.14em;color:#94A3B8;
}
.sc .tg:has([id^="ld-"]) [id^="ld-"]{
  font-size:clamp(28px,5.2vw,34px);font-weight:800;line-height:1.05;
  color:#0F172A;letter-spacing:-.02em;font-variant-numeric:tabular-nums;
}
.sc.w .tg:has([id^="ld-"]){background:#FFFBEB;border-color:#FDE8C4}
.sc.a .tg:has([id^="ld-"]){background:#FEF2F2;border-color:#FBD0D0}
/* Timer toujours en gris ardoise — l'état reste signalé par la carte */
.sc.w .tg:has([id^="ld-"]) [id^="ld-"],.sc.a .tg:has([id^="ld-"]) [id^="ld-"]{color:#0F172A}

/* ─── Champs ─── */
.fi,.fta{border-radius:14px}
html[data-theme="light"] .fi,html[data-theme="light"] .fta{background:#F8FAFC !important;border-color:#E2E8F0 !important}
html[data-theme="light"] .fi:focus,html[data-theme="light"] .fta:focus{background:#FFFFFF !important;border-color:var(--acc) !important}

/* ─── Tableaux de données (Membres) — lignes hautes, typo Inter/System UI ─── */
.tbl2{font-family:"Inter",system-ui,-apple-system,"Segoe UI",sans-serif}
.tbl2 th{background:#F8FAFC;padding:14px 16px;font-size:11px;letter-spacing:.07em;color:#64748B;border-bottom:1px solid #E2E8F0}
/* color: indispensable — sans couleur explicite, le texte des cellules hérite
   d'une teinte claire et devient invisible sur le fond blanc forcé plus bas. */
.tbl2 td{padding:16px;border-bottom:1px solid #F1F5F9;color:#334155}
.tbl2 tr:hover td{background:#F8FAFC}
/* Badges d'état → pills arrondies */
.tbl2 td span[style*="border-radius:10px"]{border-radius:999px !important;padding:6px 12px !important;font-size:11px !important;letter-spacing:.02em}
/* Boutons d'action de ligne */
.tbl2 td button[style*="border-radius:6px"]{border-radius:10px !important;padding:7px 11px !important}
/* Recherche / filtre membres */
#mbrs-search,#mbrs-filter{border-radius:12px !important;border:1px solid #E2E8F0 !important;background:#F8FAFC !important;padding:11px 14px !important}

/* ─── Layout pages Clients & Équipe — cartes stats → barre → tableau ───
   Structure verticale dans .scrl : (1) grille de cartes en haut,
   (2) barre filtres/recherche, (3) tableau pleine largeur en bas. */
.mbrs-stats{
  display:grid;grid-template-columns:1fr;gap:14px;width:100%;
}
@media (min-width:640px){ .mbrs-stats{grid-template-columns:repeat(2,1fr)} }
@media (min-width:1024px){ .mbrs-stats{grid-template-columns:repeat(4,1fr)} }
.mbrs-stat{
  background:#fff;border:1px solid #E2E8F0;border-radius:12px;
  padding:14px 16px;display:flex;flex-direction:column;gap:4px;
  box-shadow:0 1px 2px rgba(15,23,42,.04);
}
.mbrs-stat-lbl{font-size:11px;color:#64748B;font-weight:600;letter-spacing:.02em}
.mbrs-stat-val{font-size:22px;font-weight:800;color:#0F172A;line-height:1.1}

.mbrs-bar{
  display:flex;flex-wrap:wrap;align-items:center;gap:10px;width:100%;
}
.mbrs-bar .mbrs-search{flex:1 1 280px;min-width:220px}
.mbrs-bar .mbrs-filter{flex:0 0 auto;min-width:140px}
.mbrs-refresh,.mbrs-export{
  flex:0 0 auto;border:1px solid #E2E8F0;background:#F8FAFC;
  border-radius:12px;padding:10px 14px;font-size:12px;font-weight:600;
  color:#0F172A;cursor:pointer;white-space:nowrap;
}
.mbrs-refresh:hover,.mbrs-export:hover{background:#EEF2F7}
.mbrs-export{background:#0F172A;color:#fff;border-color:#0F172A}
.mbrs-export:hover{background:#1E293B}

.mbrs-table-wrap{
  width:100%;background:#fff;border:1px solid #E2E8F0;border-radius:14px;
  box-shadow:0 1px 2px rgba(15,23,42,.04);overflow-x:auto;
}
.mbrs-table{
  width:100%;min-width:760px;border-collapse:collapse;
  font-family:"Inter",system-ui,-apple-system,"Segoe UI",sans-serif;
}
.mbrs-table thead th{
  background:#F8FAFC;padding:14px 16px;font-size:11px;letter-spacing:.07em;
  color:#64748B;font-weight:700;text-transform:uppercase;
  border-bottom:1px solid #E2E8F0;text-align:left;white-space:nowrap;
}
.mbrs-table tbody td{
  padding:14px 16px;border-bottom:1px solid #F1F5F9;color:#334155;
  font-size:13px;vertical-align:middle;
}
.mbrs-table tbody tr:hover td{background:#F8FAFC}
.mbrs-table tbody tr:last-child td{border-bottom:none}

/* ─── Sidebar & navigation (desktop) — refonte sombre 2026-05-26 ─── */
@media (min-width:1024px){
  #s-acc,#s-fin,#s-eq,#s-ano,#s-rp,#s-env,#s-hist,#s-mbrs,#s-msg,#s-ctrl,#s-audit,#mb-s-hist{gap:24px !important}
  .bn{padding:16px 12px !important}
  .bn .ni{border-radius:12px !important;margin-bottom:2px;font-weight:500}
  .bn .ni .ic{filter:none;opacity:.85;transition:filter .2s,opacity .2s}
  .bn .ni:hover .ic,.bn .ni.on .ic{filter:none;opacity:1}
  .bn .ni:hover{background:rgba(15,23,42,.60) !important;color:#FFFFFF !important}
  .bn .ni.on{background:#0F172A !important;color:#22D3EE !important;box-shadow:0 4px 10px rgba(0,0,0,.45),0 0 14px rgba(34,211,238,.18) !important;font-weight:800}
  /* Indicateur vertical néon cyan */
  .bn .ni.on::before{
    content:"" !important;display:block !important;
    position:absolute;left:0;top:50%;transform:translateY(-50%);
    width:3px;height:22px;border-radius:0 4px 4px 0;background:#22D3EE;
    box-shadow:0 0 10px rgba(34,211,238,.55);
  }
  .bn .ni.on::after{display:none !important}
}

/* ─── Harmonie complète — modales · onglets · hero · toast ─── */
/* Modales : voile translucide doux + carte blanche très arrondie */
.ov{background:rgba(15,23,42,.45) !important;-webkit-backdrop-filter:blur(6px);backdrop-filter:blur(6px)}
.md{
  border-radius:24px 24px 0 0;border:1px solid #E2E8F0;border-bottom:0;
  padding:28px;box-shadow:0 -18px 48px -12px rgba(15,23,42,.22);
}
.mdt{font-weight:800;letter-spacing:-.02em}
@media (min-width:1024px){
  .md{
    border-radius:24px !important;border-bottom:1px solid #E2E8F0 !important;
    box-shadow:0 24px 48px -12px rgba(15,23,42,.20) !important;
  }
}

/* Onglets : segment actif en pilule douce (cohérent avec la sidebar) */
.tabs{gap:6px;padding:8px 12px;border-bottom:1px solid #E2E8F0}
.tab{border-bottom:0 !important;border-radius:999px;transition:background .15s,color .15s}
.tab:hover:not(.on){background:#F1F5F9}
.tab.on{background:#E6EFEF;color:#2D5A60}

/* Bloc hero (CA / bilan) : carte blanche épurée, sans halo coloré */
.bx-hero{
  background:#FFFFFF !important;border:1px solid #E2E8F0 !important;
  border-radius:20px;
  box-shadow:0 10px 15px -3px rgba(0,0,0,.05),0 4px 6px -4px rgba(0,0,0,.04) !important;
}
.bh-am{text-shadow:none}

/* Toast : coins arrondis & ombre douce */
.toast{border-radius:14px;box-shadow:0 12px 28px -8px rgba(15,23,42,.28)}

/* ─── Widget « Fin de service » — intégré dans la sidebar (affichage vertical) ─── */
#fs-bar{
  flex-shrink:0;
  display:flex;flex-direction:column;gap:5px;
  margin:8px 4px 4px;
  padding:10px;
  background:#FFFFFF;
  border:1px solid var(--bdr);
  border-radius:10px;
  box-shadow:0 2px 6px -3px rgba(15,23,42,.10);
  font-size:11px;
}
#fs-bar .fs-ttl{
  font-size:10px;font-weight:800;color:#0F172A;
  text-transform:uppercase;letter-spacing:.03em;
  padding-bottom:5px;border-bottom:1px solid var(--bdr);
}
#fs-bar .fs-seg{
  display:flex;align-items:center;justify-content:space-between;gap:8px;
  color:var(--tx2);font-weight:600;line-height:1.3;
}
#fs-bar .fs-lbl{color:var(--tx2);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
#fs-bar .fs-seg b{color:#0F172A;font-weight:800;font-variant-numeric:tabular-nums;white-space:nowrap}
#fs-bar #fs-enc,#fs-bar #fs-cours,#fs-bar #fs-tot{color:var(--grn)}
#fs-bar .fs-seg.fs-total{border-top:1px solid var(--bdr);padding-top:6px;margin-top:1px}
#fs-bar .fs-seg.fs-total b{font-size:13px}
/* Pas de sidebar sur mobile : le widget n'apparaît qu'en vue desktop */
@media (max-width:1023px){#fs-bar{display:none}}

/* ─── Page AUDIT — tableau pleine largeur, colonne « Détail » élargie ─── */
#s-audit{grid-template-columns:1fr !important}
#s-audit .cd{overflow-x:auto}
#s-audit .tbl2 th:nth-child(4),#s-audit .tbl2 td:nth-child(4){width:52%}
#s-audit .tbl2 td:nth-child(4){white-space:normal;word-break:break-word;line-height:1.5}

/* ─── Page CONTRÔLE — colonne unique : pas d'espace vide, tableaux adaptés ─── */
#s-ctrl{grid-template-columns:1fr !important}

/* ════════════════════════════════════════════════════════════════
   FORÇAGE SOFT UI — NEUTRALISÉ v281 (2026-05-24)
   Ce bloc était la cause du thème « moitié clair / moitié sombre » :
   il forçait body+cartes+boutons en LIGHT et écrasait toute couche
   sombre ultérieure. Désactivé (toutes les règles commentées) ;
   la surcouche `ev-darkfix-v281` en fin de body s'occupe désormais
   du dark global.
════════════════════════════════════════════════════════════════ */
/*
html,body,html[data-theme="light"] body{background:#F8FAFC !important}
html::before,html[data-theme="light"]::before{background:#F8FAFC !important}
body::before,body::after{display:none !important}
.cd,.kc,.sc,.sc.w,.sc.a,.acard,.md,.bx-hero,.opb,.amt-box,.tc2,.trb,
#fs-bar,.tbl2,.tbl2 td,.tbl2 th,
html[data-theme="light"] .cd,html[data-theme="light"] .md{background:#FFFFFF !important}

[style*="linear-gradient(135deg,#"]{background:#FFFFFF !important;border-color:#E2E8F0 !important}
[style*="linear-gradient(135deg,#"] [style*="color:#fff"],
[style*="linear-gradient(135deg,#"] [style*="color:#FFF"],
[style*="linear-gradient(135deg,#"] [style*="color:white"]{color:#0F172A !important}
[style*="#ff3cac"],[style*="#ff3b6e"],[style*="#ec4899"]{border-color:#E2E8F0 !important}

.btn.ba,.btn.bg,.btn.br,.btn.bo,.btn.bd{
  background:#1F4E4A !important;color:#FFFFFF !important;
  border:1px solid #1F4E4A !important;box-shadow:none !important;
}
.btn.ba *,.btn.bg *,.btn.br *,.btn.bo *,.btn.bd *{color:#FFFFFF !important}

[id^="ld-"],.pc-timer,.kv,.cd-h,.mdt,.sn{
  color:#0F172A !important;-webkit-text-fill-color:#0F172A !important;
  background:none !important;text-shadow:none !important;
}
*/

/* ─── Tableau de bord directeur — cartes tendance + bar chart 7 jours ─── */
.tbd-trends{
  display:grid;grid-template-columns:1fr;gap:12px;margin-bottom:14px;width:100%;
  font-family:"Inter",system-ui,-apple-system,"Segoe UI",sans-serif;
}
/* Force ces blocs à occuper la pleine largeur dans la grille admin de #s-acc
   (auto-fit columns 360px+). Sans ça, ils se retrouveraient dans des colonnes
   étroites côte à côte avec d'autres .cd et écraseraient le chart. */
#s-acc > .tbd-trends,
#s-acc > .tbd-chart-wrap{grid-column:1/-1}
@media (min-width:640px){ .tbd-trends{grid-template-columns:repeat(2,1fr)} }
@media (min-width:1024px){ .tbd-trends{grid-template-columns:repeat(4,1fr)} }
.tbd-card{
  background:#fff;border:1px solid #E2E8F0;border-radius:14px;padding:16px;
  display:flex;flex-direction:column;gap:6px;
  box-shadow:0 1px 3px rgba(15,23,42,.05);
}
.tbd-card-label{font-size:11px;color:#64748B;font-weight:700;letter-spacing:.04em;text-transform:uppercase}
.tbd-card-value{font-size:26px;font-weight:900;color:#0F172A;line-height:1.1;font-variant-numeric:tabular-nums}
.tbd-card-suffix{font-size:14px;font-weight:700;color:#64748B;margin-left:4px}
.tbd-trend{
  display:inline-flex;align-items:center;gap:4px;align-self:flex-start;
  padding:4px 10px;border-radius:999px;font-size:11px;font-weight:800;line-height:1;
}
.tbd-trend.up{background:#DCFCE7;color:#166534}
.tbd-trend.dn{background:#FEE2E2;color:#991B1B}
.tbd-trend.zero{background:#F1F5F9;color:#475569}
.tbd-trend-sub{font-size:12px;color:#CBD5E1;font-weight:600;margin-top:2px}

.tbd-chart-wrap{
  background:#fff;border:1px solid #E2E8F0;border-radius:14px;
  padding:18px 16px 14px;margin-bottom:14px;
  box-shadow:0 1px 3px rgba(15,23,42,.05);
}
.tbd-chart-title{
  font-size:14px;font-weight:800;color:#0F172A;margin-bottom:14px;
  display:flex;align-items:baseline;justify-content:space-between;gap:10px;flex-wrap:wrap;
}
.tbd-chart-sub{font-size:11px;color:#64748B;font-weight:600}
.tbd-chart{
  display:grid;grid-template-columns:repeat(7,1fr);gap:8px;
  align-items:end;height:180px;padding-bottom:4px;
}
.tbd-chart-col{
  display:flex;flex-direction:column;align-items:center;justify-content:flex-end;
  height:100%;position:relative;
}
.tbd-chart-bar{
  width:74%;min-height:3px;
  background:linear-gradient(180deg,#2D5A60 0%,#1F4145 100%);
  border-radius:6px 6px 0 0;
  position:relative;transition:height .4s ease-out;
}
.tbd-chart-bar.today{background:linear-gradient(180deg,#10B981 0%,#047857 100%)}
.tbd-chart-bar-val{
  position:absolute;top:-18px;left:50%;transform:translateX(-50%);
  font-size:9px;font-weight:800;color:#0F172A;white-space:nowrap;
  font-variant-numeric:tabular-nums;
}
.tbd-chart-labels{
  display:grid;grid-template-columns:repeat(7,1fr);gap:8px;margin-top:6px;
}
.tbd-chart-label{text-align:center;font-size:10px;color:#64748B;font-weight:600}
.tbd-chart-label.today{color:#047857;font-weight:800}

/* ─── i18n : sélecteur de langue + ajustements RTL ─── */
.lang-picker{
  display:inline-flex;gap:4px;align-items:center;flex-shrink:0;
  font-family:"Inter",system-ui,-apple-system,"Segoe UI",sans-serif;
}
.lang-picker button{
  background:transparent;border:1px solid #E2E8F0;border-radius:6px;
  padding:5px 9px;font-size:11px;font-weight:700;color:#64748B;
  cursor:pointer;font-family:inherit;line-height:1;white-space:nowrap;
  transition:background .15s,color .15s,border-color .15s;
}
.lang-picker button:hover:not(.lang-active){background:#F1F5F9;color:#0F172A}
.lang-picker button.lang-active{background:#2D5A60;color:#fff;border-color:#2D5A60}
/* Inversion subtile en mode RTL pour l'ordre des boutons du picker */
html[dir="rtl"] .lang-picker{flex-direction:row-reverse}
/* Police arabe légèrement plus généreuse pour la lisibilité */
html[lang="ar"] body,html[lang="ar-MA"] body{
  font-family:"Cairo","Tajawal","Segoe UI",system-ui,-apple-system,sans-serif;
}

/* ═══════════════════════════════════════════════════════════════
   FAB PASSATION — bouton flottant TOUJOURS VISIBLE
   Visible UNIQUEMENT lorsqu'un staff est connecté (body.in-app, posé par
   startApp). Aucune autre condition. Position fixed pour ne dépendre ni de
   la sidebar (cachée sur mobile) ni du scroll du contenu de page.
═══════════════════════════════════════════════════════════════ */
#fab-passation{ display:none; }
body.in-app #fab-passation,
body:has(#p-app.on) #fab-passation{
  display:inline-flex;
  align-items:center;
  gap:8px;
  position:fixed;
  right:16px;
  bottom:calc(20px + env(safe-area-inset-bottom,0px));
  z-index:90;
  padding:13px 18px;
  border-radius:999px;
  background:linear-gradient(135deg,#0891B2,#0E7490);
  color:#FFFFFF;
  border:0;
  font-family:inherit;
  font-size:13px;
  font-weight:800;
  letter-spacing:.2px;
  cursor:pointer;
  box-shadow:0 8px 24px rgba(8,145,178,.45),0 2px 6px rgba(0,0,0,.15);
  transition:transform .15s ease, box-shadow .15s ease;
}
body.in-app #fab-passation:hover,
body:has(#p-app.on) #fab-passation:hover{
  transform:translateY(-2px);
  box-shadow:0 12px 28px rgba(8,145,178,.55),0 4px 10px rgba(0,0,0,.18);
}
body.in-app #fab-passation:active,
body:has(#p-app.on) #fab-passation:active{ transform:translateY(0); }

/* Le Directeur ne possède pas de sessions à transférer — on cache la
   Passation pour son rôle uniquement. Classe `role-director` posée par
   _routePostLogin/startApp lorsque S.role==='superadmin'. */
body.role-director #fab-passation{ display:none !important; }

/* Sur mobile : décalage vertical pour ne PAS recouvrir la bottom-nav (qui
   fait ~60px + safe-area). Le FAB reste à droite, accessible au pouce. */
@media (max-width:1023px){
  body.in-app #fab-passation,
  body:has(#p-app.on) #fab-passation{
    bottom:calc(80px + env(safe-area-inset-bottom,0px));
    padding:12px 16px;
    font-size:12px;
  }
}

/* ═══════════════════════════════════════════════════════════════
   BI DASHBOARD DIRECTEUR — performance équipe + rétention + alertes
   Composants CSS-only (pas de Chart.js / pas de SVG dynamique). Rendus
   par renderAcc lorsque isAdmin === true. Esprit Light Gaming : fond
   blanc, bordures slate, accent vert émeraude pour CA / cyan pour volume.
═══════════════════════════════════════════════════════════════ */
.bi-grid{
  display:grid;grid-template-columns:1fr 1fr;gap:10px;margin:10px 0 14px;
}
@media (max-width:680px){ .bi-grid{ grid-template-columns:1fr; } }
.bi-card{
  background:#FFFFFF;border:1px solid #E2E8F0;border-radius:14px;
  padding:14px 16px;box-shadow:0 4px 12px rgba(15,23,42,.05);
}
.bi-card-h{
  font-size:11px;font-weight:800;color:#475569;letter-spacing:.4px;
  text-transform:uppercase;margin-bottom:10px;display:flex;justify-content:space-between;align-items:center;
}
.bi-card-h .bi-sub{ font-size:10px;color:#94A3B8;font-weight:600;text-transform:none;letter-spacing:0; }

/* Barres horizontales — opérateur perf */
.bi-bar-row{
  display:grid;grid-template-columns:90px 1fr 70px;
  gap:8px;align-items:center;margin-bottom:6px;font-size:11px;
}
.bi-bar-name{ font-weight:700;color:#0F172A;overflow:hidden;text-overflow:ellipsis;white-space:nowrap; }
.bi-bar-track{
  height:14px;background:#F1F5F9;border-radius:7px;overflow:hidden;position:relative;
}
.bi-bar-fill{
  height:100%;border-radius:7px;transition:width .6s var(--e-out,cubic-bezier(.4,0,.2,1));
}
.bi-bar-fill.ca   { background:linear-gradient(90deg,#10B981,#059669); }
.bi-bar-fill.vol  { background:linear-gradient(90deg,#06B6D4,#0891B2); }
.bi-bar-val{ font-weight:800;color:#0F172A;text-align:right;font-variant-numeric:tabular-nums; }
.bi-bar-val.ca   { color:#059669; }
.bi-bar-val.vol  { color:#0891B2; }
.bi-empty{ font-size:11px;color:#94A3B8;text-align:center;padding:14px 0; }

/* Donut rétention — conic-gradient pur CSS · refonte sombre 2026-05-26 :
   - Arc filled : emerald-500 (sémantique succès, OK pour bord/jauge)
   - Arc unfilled : slate-800 (visible mais discret sur slate-900)
   - Disque central : slate-900 (au lieu de blanc) → texte blanc enfin lisible
   - Label container : forcé en blanc */
.bi-donut-wrap{ display:flex;align-items:center;gap:14px; }
.bi-donut{
  width:108px;height:108px;border-radius:50%;flex-shrink:0;
  background:conic-gradient(#10B981 var(--pct,0%),#1E293B 0);
  position:relative;
  box-shadow:0 0 0 1px #334155 inset,0 4px 12px rgba(0,0,0,.40);
}
.bi-donut::after{
  content:"";position:absolute;inset:12px;background:#0F172A;border-radius:50%;
  box-shadow:0 0 0 1px #1E293B inset;
}
.bi-donut-label{
  position:absolute;inset:0;display:flex;flex-direction:column;align-items:center;justify-content:center;
  z-index:1;font-weight:900;color:#FFFFFF;
}
.bi-donut-pct{ font-size:22px;line-height:1;color:#FFFFFF; }
.bi-donut-sub{ font-size:9px;color:#CBD5E1;font-weight:600;text-transform:uppercase;letter-spacing:.5px;margin-top:2px; }
.bi-donut-legend{ flex:1;display:flex;flex-direction:column;gap:6px;font-size:12px; }
.bi-donut-legend .ll{ display:flex;align-items:center;gap:8px; }
.bi-donut-legend .ll .dot{ width:10px;height:10px;border-radius:50%; }
.bi-donut-legend .ll .dot.green{ background:#10B981; }
.bi-donut-legend .ll .dot.grey{ background:#CBD5E1; }
.bi-donut-legend .ll b{ color:#FFFFFF;font-weight:900;font-size:14px; }    /* Refonte 2026-05-26 — blanc pur (était slate-900) */
.bi-donut-legend .ll span{ color:#E2E8F0;font-size:13px;font-weight:600; }  /* Refonte 2026-05-26 — slate-200 (était 64748B) */

/* Panel alertes — rouge à gauche, liste discrète */
/* Refonte 2026-05-26 — thème sombre unifié, conteneurs slate-900, texte
   blanc partout. Sémantique alerte/succès via le BORD coloré + accent
   sur le titre (rose-400 si alerte / emerald-300 si succès). */
.bi-alert-card{
  background:#0F172A;border:1px solid #1E293B;border-left:4px solid #EF4444;
  border-radius:14px;padding:14px 16px;margin:0 0 14px;
  box-shadow:0 6px 18px rgba(0,0,0,.40),0 0 0 1px rgba(239,68,68,.10) inset;
  color:#FFFFFF;
}
.bi-alert-card.warn{ border-color:#1E293B;border-left-color:#10B981; box-shadow:0 6px 18px rgba(0,0,0,.40),0 0 0 1px rgba(16,185,129,.10) inset; }
.bi-alert-h{
  font-size:12px;font-weight:900;color:#FB7185;margin-bottom:9px;       /* rose-400 — titre alerte */
  text-transform:uppercase;letter-spacing:.06em;
  display:flex;justify-content:space-between;align-items:center;
}
.bi-alert-h span:last-child{ color:#CBD5E1;font-size:11px;font-weight:700;text-transform:none;letter-spacing:0; }
.bi-alert-card.warn .bi-alert-h{ color:#6EE7B7; }                       /* emerald-300 — succès */
.bi-alert-row{
  display:grid;grid-template-columns:60px 1fr auto;gap:8px;align-items:center;
  padding:8px 0;border-top:1px dashed #334155;font-size:12px;
}
.bi-alert-row:first-of-type{ border-top:0; }
.bi-alert-row .t{ color:#CBD5E1;font-variant-numeric:tabular-nums;font-weight:600; }
.bi-alert-row .l{ color:#FFFFFF;font-weight:600;overflow:hidden;text-overflow:ellipsis;white-space:nowrap; }
.bi-alert-row .v{ color:#FECACA;font-weight:800;font-variant-numeric:tabular-nums; }     /* rouge clair lisible */
.bi-alert-card.warn .bi-alert-row .v{ color:#FCD34D; }                                  /* amber clair lisible */
.bi-alert-empty{
  font-size:13px;color:#6EE7B7;font-weight:800;text-align:center;
  padding:11px 14px;margin-top:4px;
  background:rgba(6,78,59,.30);border:1px solid rgba(16,185,129,.35);border-radius:10px;
}

/* ═══════════════════════════════════════════════════════════════
   BOTTOM NAV PRO — quick-access mobile (≤1023px) avec badge live
   Triple sélecteur d'affichage pour compat large :
   (1) body:has(#p-app.on)         — Chrome 105+/Safari 15.4+
   (2) body.in-app                  — fallback JS (toggle au goP)
   (3) #p-app.on ~ #pro-bottom-nav  — fallback CSS pur (sibling)
   Sans ces fallbacks, les navigateurs anciens (MIUI Browser, Chrome <105
   sur Xiaomi Redmi Note 11, etc.) ignorent silencieusement la règle :has()
   et la barre reste invisible.
═══════════════════════════════════════════════════════════════ */
/* RÈGLE INCONDITIONNELLE — La nav s'affiche dès qu'elle contient des items.
   AUCUNE dépendance à `body.in-app`, `body:has(...)`, ou `~ combinator`.
   `_renderProBottomNav` met innerHTML='' tant qu'il n'y a pas de S.role
   (donc sur la page login la nav est vide → masquée par :empty).
   Dès qu'un staff est connecté, items injectés → :not(:empty) match → visible.
   Compatible 100% des navigateurs (`:not(:empty)` est CSS3, supporté dès IE9). */
#pro-bottom-nav{ display:none; }
@media (max-width:1023px){
  #pro-bottom-nav:not(:empty){
    display:flex !important;
    position:fixed;bottom:0;left:0;right:0;z-index:1000;
    padding:0 4px env(safe-area-inset-bottom,8px);
    background:rgba(11,15,26,.95);
    backdrop-filter:blur(12px);
    -webkit-backdrop-filter:blur(12px);
    border-top:1px solid rgba(51,65,85,.5);
    box-shadow:0 -6px 24px rgba(0,0,0,.4);
  }
  /* Marge basse sur #p-app : appliquée dès que #p-app a la classe `on`,
     sans :has() ni body class. */
  #p-app.on{ padding-bottom:calc(96px + env(safe-area-inset-bottom,0px)); }
  /* QA 2026-05-27 — Quand m-srt (Enregistrer Sortie) est ouvert, la bottom-nav
     (z:1000) recouvrait le bouton Fermer du footer .mdb (.ov a z:500). Symptôme :
     opérateurs mobiles tapaient dans la nav au lieu du Fermer → modale "ne se ferme pas".
     On masque la bottom-nav tant qu'une .ov.on est visible (m-srt OR autre modale). */
  body:has(.ov.on) #pro-bottom-nav:not(:empty){ display:none !important; }
}
#pro-bottom-nav .pbn-item{
  flex:1;display:flex;flex-direction:column;align-items:center;justify-content:center;
  gap:3px;min-height:60px;
  background:transparent;border:0;
  color:#94A3B8;font-size:10px;font-weight:600;
  position:relative;cursor:pointer;font-family:inherit;
  padding:8px 4px;
  transition:color .15s, background .15s;
}
#pro-bottom-nav .pbn-item:hover{ color:#F1F5F9; background:rgba(51,65,85,.3); }
#pro-bottom-nav .pbn-item.on{
  color:#22D3EE;
  text-shadow:0 0 10px rgba(34,211,238,.5);
}
#pro-bottom-nav .pbn-ic{ font-size:22px;line-height:1; }
#pro-bottom-nav .pbn-lb{ white-space:nowrap;line-height:1.1; }
#pro-bottom-nav .pbn-badge{
  position:absolute;top:4px;right:calc(50% - 22px);
  min-width:18px;height:18px;padding:0 5px;border-radius:999px;
  background:#EF4444;color:#fff;
  font-size:10px;font-weight:800;line-height:18px;text-align:center;
  box-shadow:0 0 12px rgba(239,68,68,.7),0 0 0 2px rgba(11,15,26,.95);
  animation:pbnBadgePulse 1.6s ease-in-out infinite;
  z-index:1;
}
@keyframes pbnBadgePulse{
  0%,100%{ transform:scale(1); box-shadow:0 0 0 0 rgba(239,68,68,.7),0 0 0 2px rgba(11,15,26,.95); }
  50%{ transform:scale(1.08); box-shadow:0 0 0 8px rgba(239,68,68,0),0 0 0 2px rgba(11,15,26,.95); }
}

/* ═══════════════════════════════════════════════════════════════
   RESPONSIVE MOBILE — Hamburger drawer pour la sidebar pro
═══════════════════════════════════════════════════════════════ */

/* Bouton hamburger — caché en desktop, visible mobile */
.bn-toggle{
  display:none;
  background:rgba(30,41,59,.7);
  border:1px solid rgba(51,65,85,.6);
  color:#F1F5F9;
  font-size:18px;line-height:1;
  padding:8px 11px;border-radius:10px;
  cursor:pointer;margin-right:6px;
  transition:all .15s;
  flex-shrink:0;
}
.bn-toggle:hover{ background:rgba(51,65,85,.9); }

/* Overlay backdrop — caché par défaut, visible quand le drawer est ouvert */
#bn-overlay{
  position:fixed;inset:0;z-index:90;
  background:rgba(0,0,0,.6);
  backdrop-filter:blur(4px);
  opacity:0;pointer-events:none;
  transition:opacity .25s ease;
}
body.bn-open #bn-overlay{ opacity:1;pointer-events:auto; }

/* Mobile : drawer pour la sidebar pro */
@media (max-width:1023px){
  .bn-toggle{ display:inline-flex;align-items:center;justify-content:center; }
  /* La sidebar pro devient un drawer slide depuis la gauche */
  #p-app > .bn{
    position:fixed !important;
    top:0;left:-300px;bottom:0;
    width:280px;max-width:85vw;
    z-index:100;
    flex-direction:column !important;
    align-items:stretch !important;
    padding:18px 12px env(safe-area-inset-bottom) !important;
    gap:6px !important;
    overflow-y:auto;
    background:rgba(11,15,26,.97) !important;
    backdrop-filter:blur(14px);
    border-right:1px solid rgba(51,65,85,.5) !important;
    box-shadow:6px 0 32px rgba(0,0,0,.5);
    transition:left .28s ease;
  }
  body.bn-open #p-app > .bn{ left:0; }
  /* Items en pleine largeur dans le drawer, plus gros tap targets */
  #p-app > .bn .ni{
    flex:0 0 auto !important;
    flex-direction:row !important;
    justify-content:flex-start !important;
    width:100%;padding:13px 14px !important;
    font-size:14px !important;font-weight:600 !important;
    border-radius:10px;
    min-height:48px;
  }
  #p-app > .bn .ni .ic{ font-size:18px !important;margin-right:10px; }
  /* Le bandeau Fin de service dans la sidebar prend la pleine largeur */
  #p-app > .bn #fs-bar{ width:100%;margin-top:auto; }
}
@media (min-width:1024px){
  /* En desktop : drawer comportement neutralisé, sidebar normale via grid */
  #p-app > .bn{ position:sticky !important;left:auto !important; }
  body.bn-open #bn-overlay{ opacity:0;pointer-events:none; }
}

/* ═══════════════════════════════════════════════════════════════
   THÈME LIGHT GAMING / CLEAN E-SPORT
   Fond clair (slate-50), cartes blanches avec ombres légères,
   accents néon cyan/emerald pour l'esprit E-sport. Scopé pro + auth.
═══════════════════════════════════════════════════════════════ */

/* Fond global pro + pages auth — gris très clair avec halos très subtils */
body:has(#p-app.on),
body:has(#p-auth.on),
body:has(#p-login.on){
  background:#F8FAFC !important;
  color:#475569 !important;
}
body:has(#p-app.on)::before,
body:has(#p-auth.on)::before,
body:has(#p-login.on)::before{
  content:"";position:fixed;inset:0;pointer-events:none;z-index:-1;
  background:
    radial-gradient(circle at 12% 18%,rgba(6,182,212,.05),transparent 42%),
    radial-gradient(circle at 88% 82%,rgba(168,85,247,.03),transparent 42%);
}

/* ─── Header (.tb) — refonte sombre unifiée 2026-06-12 ──────────────────
   BUG corrigé : ce bloc était resté en thème CLAIR (fond #FFFFFF) alors que
   la sidebar .bn juste en dessous avait été passée en sombre le 2026-05-26.
   Sa forte spécificité (body:has(#p-app.on) #p-app .tb + !important = 2 IDs)
   battait toutes les surcouches dark (v304/v305) → header blanc, texte
   blanc-sur-blanc illisible. Repassé en bleu nuit, cohérent avec .bn. */
body:has(#p-app.on) #p-app .tb{
  background:#0F172A !important;
  border-bottom:1px solid #1E293B !important;
  box-shadow:0 1px 3px rgba(0,0,0,.5);
}
body:has(#p-app.on) #p-app .tb .tb-t,
body:has(#p-app.on) #p-app .tb #clk{ color:#F1F5F9 !important; }
body:has(#p-app.on) #p-app .tb .tb-s,
body:has(#p-app.on) #p-app .tb #tb-s{ color:#94A3B8 !important; }
body:has(#p-app.on) #p-app .tb .ib{
  background:#1E293B !important;
  border:1px solid #334155 !important;
  color:#CBD5E1 !important;
}
body:has(#p-app.on) #p-app .tb .ib:hover{
  background:#334155 !important;color:#FFFFFF !important;
}
body:has(#p-app.on) #p-app .tb .hdr-logout{
  background:#3F1D1D !important;
  border:1px solid #7F1D1D !important;
  color:#FCA5A5 !important;
}

/* ─── Sidebar (.bn) — refonte sombre unifiée 2026-05-26 ─────────────────
   AVANT : conteneur blanc + items slate-500 + actif cyan glow → texte
   illisible dès qu'un sous-thème assombrissait le fond.
   APRÈS : conteneur slate-950, bord slate-900, items slate-300, hover
   blanc sur fond slate-900/60, actif cyan-400 sur fond slate-900 avec
   bord-droit cyan néon. Cohérent avec Unified Dark v304. */
body:has(#p-app.on) #p-app .bn{
  background:#020617 !important;
  border-right:1px solid #0F172A !important;
  box-shadow:1px 0 3px rgba(0,0,0,.55) !important;
}
body:has(#p-app.on) #p-app .bn .ni{
  color:#CBD5E1 !important;
  -webkit-text-fill-color:#CBD5E1 !important;
  background:transparent !important;
  font-weight:600 !important;
  transition:all .15s;
}
body:has(#p-app.on) #p-app .bn .ni:hover{
  color:#FFFFFF !important;
  -webkit-text-fill-color:#FFFFFF !important;
  background:rgba(15,23,42,.60) !important;
}
body:has(#p-app.on) #p-app .bn .ni.on{
  color:#22D3EE !important;
  -webkit-text-fill-color:#22D3EE !important;
  background:#0F172A !important;
  border:1px solid #1E293B !important;
  border-right:4px solid #22D3EE !important;
  box-shadow:0 4px 10px rgba(0,0,0,.45),0 0 14px rgba(34,211,238,.18) !important;
  font-weight:800 !important;
}
body:has(#p-app.on) #p-app .bn .ni .ic{ opacity:1 !important; filter:none !important; }
@media (max-width:1023px){
  body:has(#p-app.on) #p-app > .bn{ background:#020617 !important; }
  body:has(#p-app.on) #p-app > .bn .ni.on{
    border-right:0 !important;
    border-left:4px solid #22D3EE !important;
  }
}

/* ─── Cards (.cd, .kc) — refonte sombre GLOBALE 2026-05-26 ───────────
   AVANT : ce bloc forçait `bg:#FFFFFF !important` partout → cause racine
   des "blinding white cards" sur Dashboard, Caisse Op, Rapport, Historique,
   Validations, Enveloppes, Messages, etc. Tous les overrides per-page
   tentaient de battre cette règle au cas par cas. APRÈS : la règle de
   base est elle-même sombre — Unified Dark Mode appliqué au SOURCE.
   Les pages qui ont besoin d'un styling spécifique conservent leurs
   overrides per-page (qui n'ont plus à lutter, juste à raffiner). */
body:has(#p-app.on) #p-app .cd,
body:has(#p-app.on) #p-app .kc{
  background:#0F172A !important;
  border:1px solid #1E293B !important;
  color:#F1F5F9 !important;
  -webkit-text-fill-color:#F1F5F9 !important;
  box-shadow:0 6px 18px rgba(0,0,0,.40) !important;
  border-radius:14px !important;
}
body:has(#p-app.on) #p-app .cd-h{
  color:#E2E8F0 !important;
  -webkit-text-fill-color:#E2E8F0 !important;
  border-bottom:1px solid #334155 !important;
  font-weight:900 !important;
}
body:has(#p-app.on) #p-app .kl{
  color:#94A3B8 !important;
  -webkit-text-fill-color:#94A3B8 !important;
}
body:has(#p-app.on) #p-app .kv{ color:#1E293B !important; }
body:has(#p-app.on) #p-app .kv.g{ color:#059669 !important; }
body:has(#p-app.on) #p-app .kv.b{ color:#0891B2 !important; }
body:has(#p-app.on) #p-app .kv.r{ color:#DC2626 !important; }
body:has(#p-app.on) #p-app .kv.o{ color:#D97706 !important; }

/* ─── Buttons — glow néon léger en hover ─── */
body:has(#p-app.on) #p-app .btn.bg{
  background:linear-gradient(135deg,#06B6D4 0%,#0891B2 100%) !important;
  color:#fff !important;border:0 !important;
  box-shadow:0 4px 14px rgba(6,182,212,.30) !important;
  transition:all .18s !important;
}
body:has(#p-app.on) #p-app .btn.bg:hover:not(:disabled){
  box-shadow:0 6px 22px rgba(6,182,212,.45) !important;
  transform:translateY(-1px);
}
body:has(#p-app.on) #p-app .btn.ba{
  background:linear-gradient(135deg,#8B5CF6 0%,#7C3AED 100%) !important;
  color:#fff !important;border:0 !important;
  box-shadow:0 4px 14px rgba(139,92,246,.30) !important;
}
body:has(#p-app.on) #p-app .btn.ba:hover:not(:disabled){
  box-shadow:0 6px 22px rgba(139,92,246,.45) !important;
  transform:translateY(-1px);
}
body:has(#p-app.on) #p-app .btn.bgh{
  background:#F1F5F9 !important;
  color:#1E293B !important;
  border:1px solid #E2E8F0 !important;
}
body:has(#p-app.on) #p-app .btn.bgh:hover:not(:disabled){
  background:#E2E8F0 !important;
  border-color:#CBD5E1 !important;
}
body:has(#p-app.on) #p-app .btn.br{
  background:linear-gradient(135deg,#EF4444 0%,#DC2626 100%) !important;
  color:#fff !important;border:0 !important;
  box-shadow:0 4px 14px rgba(239,68,68,.30) !important;
}
body:has(#p-app.on) #p-app .btn.bo{
  background:#FFFBEB !important;
  color:#92400E !important;
  border:1px solid #FCD34D !important;
}
body:has(#p-app.on) #p-app .btn.bo:hover:not(:disabled){
  background:#FEF3C7 !important;
}

/* ─── Inputs ─── */
body:has(#p-app.on) #p-app input.fi,
body:has(#p-app.on) #p-app select.fi,
body:has(#p-app.on) #p-app textarea.fta{
  background:#F8FAFC !important;
  border:1px solid #E2E8F0 !important;
  color:#0F172A !important;
}
body:has(#p-app.on) #p-app input.fi:focus,
body:has(#p-app.on) #p-app select.fi:focus,
body:has(#p-app.on) #p-app textarea.fta:focus{
  background:#FFFFFF !important;
  border-color:#06B6D4 !important;
  box-shadow:0 0 0 3px rgba(6,182,212,.15) !important;
  outline:0;
}
body:has(#p-app.on) #p-app .fl{ color:#94A3B8 !important; font-weight:600 }

/* ─── Modals ─── */
body:has(#p-app.on) .ov{
  background:rgba(15,23,42,.45) !important;
  backdrop-filter:blur(4px);
}
body:has(#p-app.on) .md{
  background:#FFFFFF !important;
  border:1px solid #E2E8F0 !important;
  color:#1E293B !important;
  box-shadow:0 24px 64px rgba(15,23,42,.20) !important;
}
body:has(#p-app.on) .mdt{ color:#1E293B !important; }

/* Amount box modal Sortie — refonte sombre 2026-05-26
   AVANT : fond #F8FAFC (gris quasi-blanc) avec labels slate-500 → invisible
   après dark catch-all. APRÈS : slate-900 + bord slate-800 + texte clair. */
body:has(#p-app.on) .amt-box{
  background:#0F172A !important;
  border:1px solid #1E293B !important;
  border-radius:12px !important;
  padding:14px 16px !important;
  margin:14px 0 !important;
}
body:has(#p-app.on) .amt-lbl{
  color:#CBD5E1 !important;
  -webkit-text-fill-color:#CBD5E1 !important;
  font-weight:600 !important;
}
body:has(#p-app.on) .amt-v{
  color:#FFFFFF !important;
  -webkit-text-fill-color:#FFFFFF !important;
}
body:has(#p-app.on) .amt-v.sub{
  color:#CBD5E1 !important;
  -webkit-text-fill-color:#CBD5E1 !important;
  font-weight:500 !important;
}
body:has(#p-app.on) #m-tarif{
  color:#34D399 !important;
  -webkit-text-fill-color:#34D399 !important;
  font-weight:900 !important;
}
/* Le bloc m-enc input + son label */
body:has(#p-app.on) .amt-box .fl{
  color:#FCD34D !important;
  -webkit-text-fill-color:#FCD34D !important;
  font-weight:800 !important;
  text-transform:uppercase !important;
  letter-spacing:.06em !important;
  font-size:12px !important;
  margin-bottom:6px !important;
  display:block !important;
}
body:has(#p-app.on) #m-enc{
  background:#020617 !important;
  color:#FFFFFF !important;
  -webkit-text-fill-color:#FFFFFF !important;
  border:2px solid #334155 !important;
  font-weight:900 !important;
  color-scheme:dark !important;
}
body:has(#p-app.on) #m-enc:focus{
  border-color:#22D3EE !important;
  box-shadow:0 0 0 3px rgba(34,211,238,.20) !important;
}
body:has(#p-app.on) #m-enc-help{
  color:#94A3B8 !important;
  -webkit-text-fill-color:#94A3B8 !important;
  font-style:italic !important;
}
/* Bouton Effacer — variante danger discrète sur fond sombre */
body:has(#p-app.on) #m-enc-clear{
  background:rgba(127,29,29,.45) !important;
  border:1px solid #EF4444 !important;
  color:#FECACA !important;
  -webkit-text-fill-color:#FECACA !important;
}

/* ─── Tables Clients / Équipe — refonte sombre 2026-05-26 ────────────
   Conteneur slate-900, header slate-950 uppercase, zébrage alternant
   slate-900 / slate-950, hover slate-800 semi-transparent. Texte courant
   en blanc (cellule) avec sous-info en slate-400. */
body:has(#p-app.on) #p-app .mbrs-table-wrap{
  background:#0F172A !important;
  border:1px solid #1E293B !important;
  box-shadow:0 6px 18px rgba(0,0,0,.40) !important;
}
body:has(#p-app.on) #p-app .mbrs-table{ background:transparent !important; }
body:has(#p-app.on) #p-app .mbrs-table thead th{
  background:#020617 !important;
  color:#FFFFFF !important;
  -webkit-text-fill-color:#FFFFFF !important;
  font-weight:800 !important;
  text-transform:uppercase !important;
  letter-spacing:.10em !important;
  font-size:11px !important;
  border-bottom:1px solid #1E293B !important;
  padding:16px 16px !important;
  text-align:left !important;
}
body:has(#p-app.on) #p-app .mbrs-table tbody td{
  border-bottom:1px solid #1E293B !important;
  color:#FFFFFF !important;
  -webkit-text-fill-color:#FFFFFF !important;
  padding:14px 16px !important;
}
/* Zébrage alternant — slate-900 pair / slate-950 impair */
body:has(#p-app.on) #p-app .mbrs-table tbody tr:nth-child(even) td{
  background:#0F172A !important;
}
body:has(#p-app.on) #p-app .mbrs-table tbody tr:nth-child(odd) td{
  background:#020617 !important;
}
body:has(#p-app.on) #p-app .mbrs-table tbody tr:hover td{
  background:rgba(30,41,59,.85) !important;            /* slate-800/85 */
  transition:background .15s ease-out;
}
body:has(#p-app.on) #p-app .mbrs-table tbody tr:last-child td{
  border-bottom:0 !important;
}
body:has(#p-app.on) #p-app .mbrs-stat{
  background:#FFFFFF !important;
  border:1px solid #E2E8F0 !important;
  box-shadow:0 1px 3px rgba(15,23,42,.04) !important;
}
body:has(#p-app.on) #p-app .mbrs-stat-lbl{ color:#64748B !important; }
body:has(#p-app.on) #p-app .mbrs-stat-val{ color:#0F172A !important; }
/* Refonte 2026-05-26 — barre recherche / filtre en thème sombre uniforme.
   Conteneur slate-900, inputs slate-800, placeholder slate-400 lisible,
   dropdown options en color-scheme dark pour le natif. */
body:has(#p-app.on) #p-app .mbrs-bar{
  background:#0F172A !important;
  border:1px solid #1E293B !important;
  padding:10px 12px !important;
  border-radius:12px !important;
}
body:has(#p-app.on) #mbrs-search,
body:has(#p-app.on) #mbrs-filter{
  background:#1E293B !important;
  border:1px solid #334155 !important;
  color:#FFFFFF !important;
  -webkit-text-fill-color:#FFFFFF !important;
  color-scheme:dark;
  font-weight:600 !important;
}
body:has(#p-app.on) #mbrs-search::placeholder{
  color:#94A3B8 !important;
  -webkit-text-fill-color:#94A3B8 !important;
  opacity:1 !important;
  font-weight:500 !important;
}
body:has(#p-app.on) #mbrs-search:focus,
body:has(#p-app.on) #mbrs-filter:focus{
  border-color:#22D3EE !important;
  outline:none !important;
  box-shadow:0 0 0 3px rgba(34,211,238,.20) !important;
}
/* <option> du <select> — Chrome/Firefox les rendent sur fond OS sinon */
body:has(#p-app.on) #mbrs-filter option{
  background:#0F172A !important;
  color:#FFFFFF !important;
}

/* ─── Tableau de bord trends — refonte sombre 2026-05-26 ──────────────
   AVANT : `.tbd-card bg:#FFFFFF + color:#0F172A` → texte noir invisible
   sur fond darkifié. APRÈS : slate-900 + texte blanc forcé.
   Le bouton « Faire le comptage » utilise `.cd` (déjà patché sur #s-acc)
   ou inline-style ; ici on couvre `.tbd-card` + `.tbd-chart-wrap`. */
body:has(#p-app.on) #p-app .tbd-card,
body:has(#p-app.on) #p-app .tbd-chart-wrap{
  background:#0F172A !important;
  border:1px solid #1E293B !important;
  border-left:4px solid #22D3EE !important;
  box-shadow:0 6px 18px rgba(0,0,0,.40) !important;
  border-radius:14px !important;
  padding:18px !important;
}
body:has(#p-app.on) #p-app .tbd-card-label{
  color:#94A3B8 !important;
  -webkit-text-fill-color:#94A3B8 !important;
  font-weight:800 !important;
  text-transform:uppercase !important;
  letter-spacing:.08em !important;
  margin-bottom:8px !important;
}
body:has(#p-app.on) #p-app .tbd-card-value{
  color:#FFFFFF !important;
  -webkit-text-fill-color:#FFFFFF !important;
  font-weight:900 !important;
  font-size:32px !important;
  font-variant-numeric:tabular-nums !important;
}
body:has(#p-app.on) #p-app .tbd-card-suffix{
  color:#CBD5E1 !important;
  -webkit-text-fill-color:#CBD5E1 !important;
  font-weight:800 !important;
  margin-left:6px !important;
}
body:has(#p-app.on) #p-app .tbd-trend-sub{
  color:#94A3B8 !important;
  -webkit-text-fill-color:#94A3B8 !important;
  font-weight:600 !important;
  font-size:12px !important;
  margin-top:4px !important;
}
body:has(#p-app.on) #p-app .tbd-trend.up{
  background:rgba(6,78,59,.45) !important;
  color:#34D399 !important;
  -webkit-text-fill-color:#34D399 !important;
  border:1px solid rgba(16,185,129,.45) !important;
}
body:has(#p-app.on) #p-app .tbd-trend.dn{
  background:rgba(127,29,29,.45) !important;
  color:#FB7185 !important;
  -webkit-text-fill-color:#FB7185 !important;
  border:1px solid rgba(244,63,94,.45) !important;
}
body:has(#p-app.on) #p-app .tbd-trend.zero{
  background:rgba(30,41,59,.70) !important;
  color:#CBD5E1 !important;
  -webkit-text-fill-color:#CBD5E1 !important;
  border:1px solid #334155 !important;
}
body:has(#p-app.on) #p-app .tbd-chart-title{
  color:#FFFFFF !important;
  -webkit-text-fill-color:#FFFFFF !important;
  font-weight:900 !important;
}
body:has(#p-app.on) #p-app .tbd-chart-bar{
  background:linear-gradient(180deg,#06B6D4 0%,#0891B2 100%) !important;
  box-shadow:0 2px 8px rgba(6,182,212,.25);
}
body:has(#p-app.on) #p-app .tbd-chart-bar.today{
  background:linear-gradient(180deg,#10B981 0%,#047857 100%) !important;
  box-shadow:0 2px 10px rgba(16,185,129,.35);
}
body:has(#p-app.on) #p-app .tbd-chart-bar-val{ color:#1E293B !important; }
body:has(#p-app.on) #p-app .tbd-chart-label{ color:#64748B !important; }
body:has(#p-app.on) #p-app .tbd-chart-label.today{ color:#059669 !important; }

/* ─── Lang picker pro ─── */
body:has(#p-app.on) #p-app .lang-picker button{
  background:#FFFFFF !important;
  border:1px solid #E2E8F0 !important;
  color:#475569 !important;
}
body:has(#p-app.on) #p-app .lang-picker button.lang-active{
  background:linear-gradient(135deg,#06B6D4,#0891B2) !important;
  color:#FFFFFF !important;border-color:#0891B2 !important;
  box-shadow:0 2px 10px rgba(6,182,212,.25);
}

/* Status dot pulse (vert émeraude) */
@keyframes lightPulseGrn{
  0%,100%{box-shadow:0 0 0 0 rgba(16,185,129,.55)}
  50%{box-shadow:0 0 0 6px rgba(16,185,129,0)}
}
body:has(#p-app.on) #p-app .mbrs-dot{
  width:8px;height:8px;border-radius:50%;display:inline-block;margin-left:6px;
}
body:has(#p-app.on) #p-app .mbrs-dot[style*="grn"]{
  animation:lightPulseGrn 1.8s ease-in-out infinite;
}

/* ─── Tags ─── */
body:has(#p-app.on) #p-app .tg{
  background:#F1F5F9 !important;
  color:#475569 !important;
  border:1px solid #E2E8F0;
}
body:has(#p-app.on) #p-app .tg.r{
  background:#FEE2E2 !important;color:#B91C1C !important;border-color:#FCA5A5;
}
body:has(#p-app.on) #p-app .tg.o{
  background:#FEF3C7 !important;color:#92400E !important;border-color:#FCD34D;
}

/* ─── Liste opérateurs (.opb) — refonte sombre 2026-05-26 ─── */
body:has(#p-app.on) #p-app .opb{
  background:#020617 !important;
  border:1px solid #1E293B !important;
  border-left:4px solid #22D3EE !important;
  color:#FFFFFF !important;
  -webkit-text-fill-color:#FFFFFF !important;
  box-shadow:0 4px 12px rgba(0,0,0,.40);
  border-radius:12px !important;
  padding:12px 14px !important;
}
body:has(#p-app.on) #p-app .opb [style*="font-weight:700;font-size:12px"],
body:has(#p-app.on) #p-app .opb [style*="font-weight:700;font-size:13px"]{
  color:#FFFFFF !important;
  -webkit-text-fill-color:#FFFFFF !important;
}
body:has(#p-app.on) #p-app .opb [style*="color:var(--tx2)" i]{
  color:#94A3B8 !important;
  -webkit-text-fill-color:#94A3B8 !important;
}
body:has(#p-app.on) #p-app .opb .opca{
  color:#34D399 !important;
  -webkit-text-fill-color:#34D399 !important;
  font-weight:900 !important;
}

/* ─── Progress bars CA par produit / Heures de pointe (.hbar) — 2026-05-26 ─── */
body:has(#p-app.on) #p-app .hbar{ background:transparent !important; }
body:has(#p-app.on) #p-app .hl{
  color:#E2E8F0 !important;
  -webkit-text-fill-color:#E2E8F0 !important;
  font-weight:700 !important;
  text-transform:capitalize !important;
}
body:has(#p-app.on) #p-app .hb{
  background:#1E293B !important;
  border:1px solid #334155 !important;
  box-shadow:none !important;
}
body:has(#p-app.on) #p-app .hv{
  color:#34D399 !important;
  -webkit-text-fill-color:#34D399 !important;
  font-weight:900 !important;
}

/* ─── Grilles produits (.tg2 / .tc2) — 2026-05-26 ─── */
body:has(#p-app.on) #p-app .tc2{
  background:#020617 !important;
  border:1px solid #1E293B !important;
  color:#FFFFFF !important;
  -webkit-text-fill-color:#FFFFFF !important;
}
body:has(#p-app.on) #p-app .tp{
  color:#94A3B8 !important;
  -webkit-text-fill-color:#94A3B8 !important;
}
body:has(#p-app.on) #p-app .tpr{
  color:#34D399 !important;
  -webkit-text-fill-color:#34D399 !important;
}
body:has(#p-app.on) #p-app .td{
  color:#CBD5E1 !important;
  -webkit-text-fill-color:#CBD5E1 !important;
}

/* ─── Page Historique (#s-hist) — refonte sombre stricte 2026-05-26 ────
   AVANT : 8-30 cartes empilées (`<div class="cd">`) avec inline-styles
   bourrés de `color:#020617`, `color:#0F172A`, `background:#F8FAFC`, etc.
   Tous invisibles en thème sombre. APRÈS : surcharge globale `#s-hist`
   pour forcer les fonds en slate-900/950 et tous les textes en clair. */
html body:has(#p-app.on) #s-hist .cd,
body:has(#p-app.on) #s-hist .cd,
#s-hist .cd{
  background:#0F172A !important;
  border:1px solid #1E293B !important;
  border-radius:14px !important;
  padding:18px !important;
  box-shadow:0 6px 18px rgba(0,0,0,.40) !important;
  margin-bottom:14px !important;
  color:#FFFFFF !important;
  -webkit-text-fill-color:#FFFFFF !important;
}
/* Titre date « 📅 Aujourd'hui 26/05/2026 » : forcé blanc (était #020617) */
html body:has(#p-app.on) #s-hist .cd [style*="color:#020617" i],
body:has(#p-app.on) #s-hist .cd [style*="color:#020617" i],
#s-hist .cd [style*="color:#020617" i]{
  color:#FFFFFF !important;
  -webkit-text-fill-color:#FFFFFF !important;
}
/* Texte slate-foncé legacy (`#0F172A`, `#1E293B`, `#0369A1` summary détails) → texte clair */
html body:has(#p-app.on) #s-hist .cd [style*="color:#0F172A" i],
#s-hist .cd [style*="color:#0F172A" i],
html body:has(#p-app.on) #s-hist .cd [style*="color:#1E293B" i],
#s-hist .cd [style*="color:#1E293B" i]{
  color:#E2E8F0 !important;
  -webkit-text-fill-color:#E2E8F0 !important;
}
html body:has(#p-app.on) #s-hist .cd [style*="color:#0369A1" i],
#s-hist .cd [style*="color:#0369A1" i]{
  color:#22D3EE !important;
  -webkit-text-fill-color:#22D3EE !important;
}
/* Métadonnées slate-mid (`#475569`, `#64748B`, var(--tx2)) → slate-400 */
html body:has(#p-app.on) #s-hist .cd [style*="color:#475569" i],
#s-hist .cd [style*="color:#475569" i],
html body:has(#p-app.on) #s-hist .cd [style*="color:#64748B" i],
#s-hist .cd [style*="color:#64748B" i],
html body:has(#p-app.on) #s-hist .cd [style*="color:var(--tx2)" i],
#s-hist .cd [style*="color:var(--tx2)" i]{
  color:#94A3B8 !important;
  -webkit-text-fill-color:#94A3B8 !important;
}
/* Encadrés clairs (#F8FAFC, #FFFFFF imbriqués) → slate-950 */
html body:has(#p-app.on) #s-hist .cd [style*="background:#F8FAFC" i],
#s-hist .cd [style*="background:#F8FAFC" i]{
  background:#020617 !important;
  border-color:#1E293B !important;
}
/* Le bandeau intra-poste « 🎮 PS5 — Poste 1 » : déjà sombre (#0F172A) — OK */
/* Séparateurs lignes (#F1F5F9, #E2E8F0) → slate-700 */
html body:has(#p-app.on) #s-hist .cd [style*="border-top:1px solid #F1F5F9" i],
#s-hist .cd [style*="border-top:1px solid #F1F5F9" i],
html body:has(#p-app.on) #s-hist .cd [style*="border:1px solid #E2E8F0" i],
#s-hist .cd [style*="border:1px solid #E2E8F0" i]{
  border-color:rgba(51,65,85,.50) !important;
}
/* Bouton Audit Directeur (#0F172A bg) — déjà sombre, force le contraste */
html body:has(#p-app.on) #s-hist .cd button[style*="background:#0F172A" i],
#s-hist .cd button[style*="background:#0F172A" i]{
  background:rgba(8,47,73,.45) !important;
  border:1px solid #22D3EE !important;
  color:#67E8F9 !important;
  -webkit-text-fill-color:#67E8F9 !important;
}
/* Badges remise (jaune pâle / rose pâle) → variantes sombres lisibles */
html body:has(#p-app.on) #s-hist .cd [style*="background:#FEF3C7" i],
#s-hist .cd [style*="background:#FEF3C7" i]{
  background:rgba(69,26,3,.55) !important;
  color:#FCD34D !important;
  -webkit-text-fill-color:#FCD34D !important;
  border:1px solid rgba(245,158,11,.40) !important;
}
html body:has(#p-app.on) #s-hist .cd [style*="background:#FEE2E2" i],
#s-hist .cd [style*="background:#FEE2E2" i]{
  background:rgba(127,29,29,.55) !important;
  color:#FECACA !important;
  -webkit-text-fill-color:#FECACA !important;
  border:1px solid rgba(244,63,94,.40) !important;
}
/* Statuts enveloppe (var(--grn)/--acc/--red/--org) → variantes claires forcées */
html body:has(#p-app.on) #s-hist .cd [style*="color:var(--grn)" i],
#s-hist .cd [style*="color:var(--grn)" i]{
  color:#34D399 !important;
  -webkit-text-fill-color:#34D399 !important;
}
html body:has(#p-app.on) #s-hist .cd [style*="color:var(--acc)" i],
#s-hist .cd [style*="color:var(--acc)" i]{
  color:#22D3EE !important;
  -webkit-text-fill-color:#22D3EE !important;
}
html body:has(#p-app.on) #s-hist .cd [style*="color:var(--red)" i],
#s-hist .cd [style*="color:var(--red)" i]{
  color:#FB7185 !important;
  -webkit-text-fill-color:#FB7185 !important;
}
html body:has(#p-app.on) #s-hist .cd [style*="color:var(--org)" i],
#s-hist .cd [style*="color:var(--org)" i]{
  color:#FCD34D !important;
  -webkit-text-fill-color:#FCD34D !important;
}
/* Borders var(--bdr) → slate-700 */
html body:has(#p-app.on) #s-hist .cd [style*="border-top:1px solid var(--bdr)" i],
#s-hist .cd [style*="border-top:1px solid var(--bdr)" i]{
  border-color:rgba(51,65,85,.50) !important;
}

/* ─── Page Rapport (#s-rp) — refonte sombre stricte 2026-05-26 ─────────
   AVANT : les 4 cartes (Export, CA produit, CA opérateurs, Heures pointe)
   héritaient de `.cd` (bg-white legacy). APRÈS : forçage cascade `#s-rp .cd`
   en thème sombre uniforme + textes blancs/slate, tracking, ombres. */
html body:has(#p-app.on) #s-rp .cd,
body:has(#p-app.on) #s-rp .cd,
#s-rp .cd{
  background:#0F172A !important;
  border:1px solid #1E293B !important;
  border-radius:14px !important;
  padding:18px !important;
  box-shadow:0 6px 18px rgba(0,0,0,.40) !important;
  color:#FFFFFF !important;
  -webkit-text-fill-color:#FFFFFF !important;
}
html body:has(#p-app.on) #s-rp .cd .cd-h,
body:has(#p-app.on) #s-rp .cd .cd-h,
#s-rp .cd .cd-h{
  color:#E2E8F0 !important;
  -webkit-text-fill-color:#E2E8F0 !important;
  font-weight:900 !important;
  font-size:13px !important;
  text-transform:uppercase !important;
  letter-spacing:.08em !important;
  margin-bottom:14px !important;
  border-bottom:1px solid #334155 !important;
  padding-bottom:8px !important;
}
/* Row classique .cr (remises) — cassette slate-950 */
html body:has(#p-app.on) #s-rp .cd .cr,
body:has(#p-app.on) #s-rp .cd .cr,
#s-rp .cd .cr{
  background:transparent !important;
  border-bottom:1px solid rgba(51,65,85,.50) !important;
  padding:10px 0 !important;
  color:#FFFFFF !important;
}
html body:has(#p-app.on) #s-rp .cd .cr b,
#s-rp .cd .cr b{
  color:#FFFFFF !important;
  -webkit-text-fill-color:#FFFFFF !important;
}
/* Bouton « 📄 Exporter PDF / HTML » dans #s-rp — clair sur sombre */
html body:has(#p-app.on) #s-rp .btn.bo,
body:has(#p-app.on) #s-rp .btn.bo,
#s-rp .btn.bo{
  background:rgba(8,47,73,.45) !important;
  border:1px solid #22D3EE !important;
  color:#67E8F9 !important;
  -webkit-text-fill-color:#67E8F9 !important;
  font-weight:800 !important;
  padding:11px 18px !important;
  border-radius:10px !important;
  margin-bottom:14px !important;
}
html body:has(#p-app.on) #s-rp .btn.bo:hover,
#s-rp .btn.bo:hover{
  background:rgba(8,47,73,.70) !important;
  color:#FFFFFF !important;
  -webkit-text-fill-color:#FFFFFF !important;
}
/* Hero RAPPORT — déjà sombre mais force la cohérence */
html body:has(#p-app.on) #s-rp .bx-hero,
#s-rp .bx-hero{
  background:linear-gradient(135deg,#0F172A,#020617) !important;
  border:1px solid #1E293B !important;
  border-radius:14px !important;
  padding:24px 20px !important;
  margin-bottom:14px !important;
  color:#FFFFFF !important;
  box-shadow:0 6px 18px rgba(0,0,0,.45) !important;
}
html body:has(#p-app.on) #s-rp .bh-lb,
#s-rp .bh-lb{
  color:#22D3EE !important;
  -webkit-text-fill-color:#22D3EE !important;
  font-size:11px !important;
  font-weight:900 !important;
  text-transform:uppercase !important;
  letter-spacing:.10em !important;
}
html body:has(#p-app.on) #s-rp .bh-am,
#s-rp .bh-am{
  color:#FFFFFF !important;
  -webkit-text-fill-color:#FFFFFF !important;
  font-size:38px !important;
  font-weight:900 !important;
  font-variant-numeric:tabular-nums !important;
  margin:6px 0 4px !important;
  line-height:1 !important;
}
html body:has(#p-app.on) #s-rp .bh-sb,
#s-rp .bh-sb{
  color:#CBD5E1 !important;
  -webkit-text-fill-color:#CBD5E1 !important;
  font-size:13px !important;
  font-weight:600 !important;
}

/* ─── Cartes sessions (.sc) — refonte sombre 2026-05-26
   AVANT : background:#FFFFFF + color:#0F172A → invisible quand v304 darkifie.
   APRÈS : slate-900 + texte blanc, accents sémantiques via bord-gauche conservés
   (emerald default / amber warn / red alert / amber paused). */
body:has(#p-app.on) #p-app .sc{
  background:#0F172A !important;                                  /* slate-900 */
  border:1px solid #1E293B !important;                            /* slate-800 */
  border-left:4px solid #10B981 !important;                       /* emerald accent */
  color:#FFFFFF !important;
  border-radius:14px !important;
  padding:16px !important;
  box-shadow:0 6px 18px rgba(0,0,0,.40) !important;
}
body:has(#p-app.on) #p-app .sc:hover{
  box-shadow:0 8px 24px rgba(0,0,0,.55),0 0 0 1px rgba(34,211,238,.18) inset !important;
}
body:has(#p-app.on) #p-app .sc.w{
  background:#0F172A !important;
  border-color:#1E293B !important;
  border-left:4px solid #F59E0B !important;                       /* amber-500 warn */
  box-shadow:0 6px 18px rgba(245,158,11,.20) !important;
}
body:has(#p-app.on) #p-app .sc.a{
  background:#0F172A !important;
  border-color:#1E293B !important;
  border-left:4px solid #EF4444 !important;                       /* red-500 alert */
  box-shadow:0 6px 22px rgba(239,68,68,.30),0 0 18px rgba(239,68,68,.18) inset !important;
}
body:has(#p-app.on) #p-app .sc.p{
  background:#0F172A !important;
  border-color:#1E293B !important;
  border-left:4px solid #F59E0B !important;
}
/* Titre poste « PS5 — P.2 » */
body:has(#p-app.on) #p-app .sc .sn{
  color:#E2E8F0 !important;                                       /* slate-200 — silver */
  -webkit-text-fill-color:#E2E8F0 !important;
  font-weight:800 !important;
  font-size:14px !important;
  letter-spacing:.02em !important;
}
/* Pastille montant accumulé « 14 DH » */
body:has(#p-app.on) #p-app .sc .sp{
  background:#020617 !important;                                  /* slate-950 — pop */
  color:#34D399 !important;                                       /* emerald-400 */
  -webkit-text-fill-color:#34D399 !important;
  border:1px solid #1E293B !important;
  padding:5px 14px !important;
  border-radius:999px !important;
  font-size:13px !important;
  font-weight:900 !important;
}
/* Tags secondaires (heure entrée, badge pause) */
body:has(#p-app.on) #p-app .sc .tg{
  background:#1E293B !important;
  color:#CBD5E1 !important;
  -webkit-text-fill-color:#CBD5E1 !important;
  border:1px solid #334155 !important;
  border-radius:8px !important;
  padding:4px 10px !important;
}
/* Bloc TIMER central (« TEMPS ÉCOULÉ » + chrono) */
body:has(#p-app.on) #p-app .sc .tg:has([id^="ld-"]){
  background:#020617 !important;                                  /* slate-950 — fond timer */
  border:1px solid #1E293B !important;
  border-radius:14px !important;
  padding:14px 12px !important;
  display:block !important;
  text-align:center !important;
}
body:has(#p-app.on) #p-app .sc .tg:has([id^="ld-"])::before{
  content:"TEMPS ÉCOULÉ" !important;
  display:block !important;
  color:#94A3B8 !important;                                       /* slate-400 */
  -webkit-text-fill-color:#94A3B8 !important;
  font-size:10px !important;
  font-weight:800 !important;
  text-transform:uppercase !important;
  letter-spacing:.10em !important;
  margin-bottom:6px !important;
}
body:has(#p-app.on) #p-app .sc .tg:has([id^="ld-"]) [id^="ld-"]{
  color:#FFFFFF !important;                                       /* blanc pur — chrono */
  -webkit-text-fill-color:#FFFFFF !important;
  font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace !important;
  font-weight:900 !important;
  font-size:30px !important;
  letter-spacing:.12em !important;
  text-shadow:0 2px 8px rgba(255,255,255,.10) !important;
  display:block !important;
}
/* Variantes warning/alert — timer prend la teinte de l'état */
body:has(#p-app.on) #p-app .sc.w .tg:has([id^="ld-"]) [id^="ld-"]{
  color:#FCD34D !important;                                       /* amber-300 — warn */
  -webkit-text-fill-color:#FCD34D !important;
  text-shadow:0 2px 8px rgba(252,211,77,.20) !important;
}
body:has(#p-app.on) #p-app .sc.a .tg:has([id^="ld-"]) [id^="ld-"]{
  color:#FCA5A5 !important;                                       /* red-300 — alert */
  -webkit-text-fill-color:#FCA5A5 !important;
  text-shadow:0 2px 10px rgba(239,68,68,.30) !important;
}
/* Boutons d'action Pause / Clôturer — accents néon thème sombre */
body:has(#p-app.on) #p-app .sc .btn.bo,
body:has(#p-app.on) #p-app .sc .btn.bgh{
  background:#020617 !important;
  color:#FCD34D !important;
  -webkit-text-fill-color:#FCD34D !important;
  border:1px solid rgba(245,158,11,.40) !important;
  border-radius:10px !important;
  font-weight:800 !important;
}
body:has(#p-app.on) #p-app .sc .btn.bo:hover,
body:has(#p-app.on) #p-app .sc .btn.bgh:hover{
  background:rgba(120,53,15,.40) !important;
  color:#FCD34D !important;
}
body:has(#p-app.on) #p-app .sc .btn.br{
  background:#E11D48 !important;                                  /* rose-600 */
  color:#FFFFFF !important;
  -webkit-text-fill-color:#FFFFFF !important;
  border:1px solid #E11D48 !important;
  border-radius:10px !important;
  font-weight:800 !important;
}
body:has(#p-app.on) #p-app .sc .btn.br:hover{
  background:#BE123C !important;                                  /* rose-700 */
}
body:has(#p-app.on) #p-app .sc .btn.bg{
  background:#10B981 !important;
  color:#FFFFFF !important;
  -webkit-text-fill-color:#FFFFFF !important;
  border:1px solid #10B981 !important;
  border-radius:10px !important;
  font-weight:800 !important;
}
body:has(#p-app.on) #p-app .sc .btn.bg:hover{
  background:#059669 !important;
}

/* ─── Plan postes ─── */
body:has(#p-app.on) #p-app .pc.s-libre{
  background:#ECFDF5 !important;
  border:1px solid #6EE7B7 !important;
}
body:has(#p-app.on) #p-app .pc.s-occupe,
body:has(#p-app.on) #p-app .pc.s-warn,
body:has(#p-app.on) #p-app .pc.s-alerte{
  background:#FEF2F2 !important;
  border:1px solid #FCA5A5 !important;
}
body:has(#p-app.on) #p-app .pc-lbl,
body:has(#p-app.on) #p-app .pc-timer{ color:#0F172A !important; }

/* ─── Fin de service ─── */
body:has(#p-app.on) #p-app #fs-bar{
  background:#FFFFFF !important;
  border:1px solid #E2E8F0 !important;
  box-shadow:0 1px 3px rgba(15,23,42,.04);
}
body:has(#p-app.on) #p-app .fs-ttl,
body:has(#p-app.on) #p-app .fs-lbl{ color:#64748B !important; }
body:has(#p-app.on) #p-app #fs-op,
body:has(#p-app.on) #p-app #fs-enc,
body:has(#p-app.on) #p-app #fs-cours,
body:has(#p-app.on) #p-app #fs-tot{ color:#0F172A !important; }
body:has(#p-app.on) #p-app .fs-total{ color:#0891B2 !important; }

/* ─── Toast ─── */
body:has(#p-app.on) #toast-container .toast{
  background:#FFFFFF !important;
  color:#1E293B !important;
  border:1px solid #E2E8F0;
  box-shadow:0 12px 36px rgba(15,23,42,.15);
}

/* Hamburger button — sombre 2026-06-12 (était clair → icône invisible sur le
   header désormais sombre). */
.bn-toggle{
  background:#1E293B;
  border:1px solid #334155;
  color:#F1F5F9;
}
.bn-toggle:hover{ background:#334155; }

/* Bottom nav pro mobile — refonte sombre 2026-06-12 (était fond blanc
   rgba(255,255,255,.96) → « barre blanche tout en bas » sur mobile).
   Sélecteur inconditionnel cohérent avec la règle d'affichage principale
   (:not(:empty), zéro dépendance JS). */
@media (max-width:1023px){
  #pro-bottom-nav:not(:empty){
    background:#0B0F19 !important;
    border-top:1px solid #1E293B !important;
    box-shadow:0 -4px 16px rgba(0,0,0,.55);
  }
}
#pro-bottom-nav .pbn-item{ color:#94A3B8; }
#pro-bottom-nav .pbn-item:hover{ color:#F1F5F9; background:rgba(51,65,85,.35); }
#pro-bottom-nav .pbn-item.on{ color:#22D3EE; text-shadow:none; }

/* ═══════════════════════════════════════════════════════════════
   PAGE AUTH (login membre + choix mode opérateur) — LIGHT GAMING
═══════════════════════════════════════════════════════════════ */
body:has(#p-auth.on) .ahero h1,
body:has(#p-auth.on) .ahero h2,
body:has(#p-login.on) .lhero h2{ color:#0F172A !important; }
body:has(#p-auth.on) .ahero p,
body:has(#p-login.on) .lhero p{ color:#64748B !important; }
body:has(#p-auth.on) .acard,
body:has(#p-login.on) .acard{
  background:#FFFFFF !important;
  border:1px solid #E2E8F0 !important;
  box-shadow:0 4px 16px rgba(15,23,42,.06),0 1px 3px rgba(15,23,42,.04) !important;
  color:#1E293B !important;
}
body:has(#p-auth.on) .atabs{
  background:#F1F5F9 !important;
  border:1px solid #E2E8F0 !important;
}
body:has(#p-auth.on) .atab{ color:#475569 !important; background:transparent !important; }
body:has(#p-auth.on) .atab:hover:not(.on){ color:#0F172A !important; background:#E2E8F0 !important; }
body:has(#p-auth.on) .atab.on{
  background:#FFFFFF !important;
  color:#0891B2 !important;
  box-shadow:0 1px 3px rgba(15,23,42,.08);
  font-weight:700;
}
body:has(#p-auth.on) .fi,
body:has(#p-auth.on) input.fi,
body:has(#p-login.on) input.fi{
  background:#F8FAFC !important;
  border:1px solid #E2E8F0 !important;
  color:#0F172A !important;
}
body:has(#p-auth.on) .fi:focus,
body:has(#p-login.on) input.fi:focus{
  background:#FFFFFF !important;
  border-color:#06B6D4 !important;
  box-shadow:0 0 0 3px rgba(6,182,212,.15) !important;
}
body:has(#p-auth.on) .fl{ color:#475569 !important; }
body:has(#p-auth.on) .btn.ba,
body:has(#p-auth.on) #b-login,
body:has(#p-auth.on) #b-signup{
  background:linear-gradient(135deg,#0891B2 0%,#0E7490 100%) !important;
  color:#fff !important;border:0 !important;
  box-shadow:0 4px 14px rgba(6,182,212,.30) !important;
}
body:has(#p-auth.on) .btn.ba:hover:not(:disabled),
body:has(#p-auth.on) #b-login:hover:not(:disabled),
body:has(#p-auth.on) #b-signup:hover:not(:disabled){
  background:linear-gradient(135deg,#06B6D4 0%,#0891B2 100%) !important;
  box-shadow:0 6px 22px rgba(6,182,212,.45) !important;
  transform:translateY(-1px);
}
body:has(#p-auth.on) .aerr,
body:has(#p-login.on) .lerr{
  background:#FEE2E2 !important;color:#B91C1C !important;
  border:1px solid #FCA5A5 !important;
}
body:has(#p-auth.on) .aok{
  background:#D1FAE5 !important;color:#047857 !important;
  border:1px solid #6EE7B7 !important;
}
body:has(#p-auth.on) .footer-link{ color:#64748B !important; }
body:has(#p-auth.on) .wa-footer{ color:#16A34A !important; }

/* Bannière Fidélité — léger gradient cyan en haut */
body:has(#p-auth.on) #ev-promo-card{
  background:linear-gradient(135deg,#FFFFFF 0%,#F0FDFA 100%) !important;
  border:1px solid #99F6E4 !important;
  box-shadow:0 4px 14px rgba(6,182,212,.08) !important;
}
body:has(#p-auth.on) #ev-promo-card > div:first-child{ color:#0F766E !important; }
body:has(#p-auth.on) #ev-promo-card .tw-text-emerald-500,
body:has(#p-auth.on) #ev-promo-card span[style*="color:#10B981"]{
  color:#059669 !important;font-weight:800 !important;
}

/* Choix mode opérateur (#p-login .ob) */
body:has(#p-login.on) .ob{
  background:#FFFFFF !important;
  border:1px solid #E2E8F0 !important;
  color:#475569 !important;
  box-shadow:0 1px 3px rgba(15,23,42,.05);
}
body:has(#p-login.on) .ob:hover{
  background:#F8FAFC !important;
  border-color:#06B6D4 !important;
  box-shadow:0 4px 14px rgba(6,182,212,.12);
  transform:translateY(-2px);
}
body:has(#p-login.on) .ob.on,
body:has(#p-login.on) .ob.sel,
body:has(#p-login.on) .ob.selected{
  background:linear-gradient(135deg,#ECFEFF 0%,#CFFAFE 100%) !important;
  border-color:#06B6D4 !important;
  color:#0E7490 !important;
  box-shadow:0 4px 14px rgba(6,182,212,.20);
}
body:has(#p-login.on) .ob .nm{ color:inherit !important; }
body:has(#p-login.on) .ob .rl{ color:#94A3B8 !important; }

/* ─── DASHBOARD DIRECTEUR — Tabs + scroll bulletproof ───────────────────
   2026-05-21 : ajout des onglets internes pour fragmenter le contenu BI
   (vue générale / équipe & shifts / sécurité & audit) + filet de sécurité
   sur le scroll vertical de la zone Accueil (qui a beaucoup grandi). */
#s-acc{ overflow-y:auto !important; overflow-x:hidden; min-height:0 !important; -webkit-overflow-scrolling:touch }
.acc-tabs{
  position:sticky;top:0;z-index:5;
  display:flex;gap:6px;flex-wrap:wrap;
  background:#FFFFFF;border:1px solid #CBD5E1;border-radius:12px;
  padding:6px;margin:0 0 14px;
  box-shadow:0 2px 8px rgba(15,23,42,.06);
}
.acc-tab{
  flex:1 1 auto;min-width:120px;
  padding:10px 14px;border:0;background:transparent;
  border-radius:8px;cursor:pointer;
  font:inherit;font-size:13px;font-weight:700;color:#475569;
  display:inline-flex;align-items:center;justify-content:center;gap:6px;
  white-space:nowrap;transition:all .15s;
}
.acc-tab:hover{ background:#F1F5F9;color:#0F172A }
.acc-tab.on{ background:#0F172A;color:#FFFFFF;box-shadow:0 4px 12px rgba(15,23,42,.25) }
.acc-tab .acc-tab-badge{
  background:#DC2626;color:#FFFFFF;font-weight:900;font-size:10px;
  padding:1px 7px;border-radius:999px;
}
.acc-tab.on .acc-tab-badge{ background:#FFFFFF;color:#0F172A }
.acc-panel{ display:none }
.acc-panel.on{ display:block;animation:accFade .18s ease }
@keyframes accFade{ from{opacity:0;transform:translateY(4px)} to{opacity:1;transform:translateY(0)} }

/* =============== /css/main.v2.css?v=13-darkfinal =============== */
/* ════════════════════════════════════════════════════════════════
   main.v2.css — Thème SOMBRE NATIF (v283, 2026-05-24)
   ────────────────────────────────────────────────────────────────
   Conversion à la SOURCE : le sombre est désormais le thème par
   défaut, sans dépendre de html[data-theme="light"]. Les anciennes
   règles claires (fond #F8FAFC, texte #0F172A, bordures #E5E7EB)
   sont remplacées par la palette dark gaming.

   PALETTE :
     fond global   #0A0E17 (deep space)
     surface 1     #0F1623 (sidebar, top-bar)
     surface 2     #131C2E (cartes)
     surface 3     #1A2336 (cartes secondaires, hover)
     surface 4     #1B2740 (table headers, KPI accent)
     bordure       #2B3A5A (visible sur dark, AAA)
     bord faible   #1E2A44 (séparateurs internes)
     texte 1       #FFFFFF / #F1F5F9 (17.6–19.3:1)
     texte 2       #E2E8F0 (15.7:1)
     texte 3       #CBD5E1 (13:1) — plafond bas
     accent brand  #1F4E4A / #2D5A60 (teal historique, conservé pour
                   les boutons d'action — texte blanc 14:1+ dessus)
     accent néon   #22D3EE (cyan AAA 10.7:1)
     accent néon 2 #A855F7 (violet, highlights)

   IMPORTANT : seules les COULEURS sont modifiées. Tout le layout
   (grids, padding, font-size, @media) et la règle v252 « DÉBLOCAGE
   GLOBAL DU SCROLL SOURIS » sont PRÉSERVÉS À L'IDENTIQUE.

   Chargé APRÈS le CSS inline d'index.html. Cette feuille définit le
   thème natif ; les surcouches `ev-gaming-dark-v280`, `ev-darkfix-v281`,
   `ev-contrast-v282` restent en place comme filets de sécurité pour
   les couleurs encore présentes dans le markup inline.
════════════════════════════════════════════════════════════════ */

/* 1 · Jetons couleur — Gaming Dark natif (sans dépendance à data-theme).
   On cible :root + toutes les variantes data-theme connues pour neutraliser
   l'ancien scope `html[data-theme="light"]` sans le supprimer (back-compat). */
:root,
html,
html[data-theme],
html[data-theme="light"],
html[data-theme="dark"]{
  --c0:#0A0E17 !important;
  --c1:#0F1623 !important;
  --c2:#131C2E !important;
  --c3:#1A2336 !important;
  --card:#131C2E !important;
  --card-2:#1A2336 !important;
  --acc:#22D3EE !important;
  --acc-2:#67E8F9 !important;
  --acc-ink:#04141C !important;
  --blu:#22D3EE !important;
  --grad-brand:linear-gradient(135deg,#22D3EE 0%,#A855F7 100%) !important;
  --tx:#FFFFFF !important;
  --tx2:#E2E8F0 !important;
  --tx3:#CBD5E1 !important;
  --bdr:#2B3A5A !important;
  --bdr2:#1E2A44 !important;
  --bdr3:#2B3A5A !important;
}

/* 2 · Arrière-plan : sombre profond, plus aucun fond clair en source */
html,body,
html[data-theme="light"] body,
html[data-theme="dark"] body{
  background:#0A0E17 !important;color:#F1F5F9 !important;
}
html::before,
html[data-theme="light"]::before,
html[data-theme="dark"]::before{
  background:#0A0E17 !important;background-image:none !important;
}
body::before,body::after{display:none !important}

/* 3 · États actifs (navigation, indicateur, onglets admin) */
.bn .ni.on{background:rgba(34,211,238,.16) !important;color:#FFFFFF !important}
.bn .ni.on::before{background:#22D3EE !important}
.tab.on{background:rgba(34,211,238,.16) !important;color:#22D3EE !important}
.tab:hover:not(.on){background:rgba(255,255,255,.04) !important;color:#FFFFFF !important}

/* 4 · Onglets « Se connecter / S'inscrire » : actif Teal · inactif sombre */
.atab.on{background:#1F4E4A !important;color:#FFFFFF !important;border-color:#1F4E4A !important}
.atab:not(.on){background:#131C2E !important;color:#CBD5E1 !important;border:1px solid #2B3A5A !important}

/* 5 · Boutons principaux → Teal #1F4E4A (brand historique) sur dark */
.btn.ba,.btn.bg,.btn.br,.btn.bo,.btn.bd{
  background:#1F4E4A !important;color:#FFFFFF !important;
  border:1px solid #1F4E4A !important;
}
.btn.ba:hover,.btn.bg:hover,.btn.br:hover,.btn.bo:hover,.btn.bd:hover{
  background:#2D5A60 !important;border-color:#2D5A60 !important;
}

/* 6 · Filet anti-bleu vif : tout fond bleu vif codé en dur → Cyan néon */
[style*="background:#3b82f6"],[style*="background:#3B82F6"],
[style*="background:#2563eb"],[style*="background:#2563EB"],
[style*="background:#60a5fa"],[style*="background:#60A5FA"],
[style*="background:#1d4ed8"],[style*="background:#1D4ED8"]{
  background:#22D3EE !important;color:#04141C !important;
}

/* 7 · Dégradés résiduels inline → aplatis en surface sombre */
[style*="linear-gradient(135deg,#"]{background:#131C2E !important;border-color:#2B3A5A !important;color:#F1F5F9 !important}

/* ════════════════════════════════════════════════════════════════
   8 · Page Membres — data-table dark (LAYOUT INCHANGÉ)
════════════════════════════════════════════════════════════════ */
/* Header de stats — 4 cartes compactes sur une ligne */
#s-mbrs .mbrs-stats{display:grid;grid-template-columns:repeat(4,1fr);gap:10px;margin-bottom:14px}
#s-mbrs .mbrs-stat{background:#131C2E;border:1px solid #2B3A5A;border-radius:10px;padding:10px 13px}
#s-mbrs .mbrs-stat-lbl{font-size:11px;color:#CBD5E1;font-weight:600;white-space:nowrap}
#s-mbrs .mbrs-stat-val{font-size:21px;font-weight:800;color:#FFFFFF;font-variant-numeric:tabular-nums;line-height:1.1;margin-top:3px}
@media (max-width:560px){#s-mbrs .mbrs-stats{grid-template-columns:repeat(2,1fr)}}

/* Barre recherche (gauche) + filtre + export (droite) */
#s-mbrs .mbrs-bar{display:flex;align-items:center;gap:10px;flex-wrap:wrap;margin-bottom:10px}
#s-mbrs .mbrs-search{flex:1;min-width:200px;padding:9px 13px;background:#0A0E17;border:1px solid #2B3A5A;border-radius:8px;font-size:14px;font-family:inherit;color:#FFFFFF;outline:none}
#s-mbrs .mbrs-search:focus{border-color:#22D3EE;box-shadow:0 0 0 3px rgba(34,211,238,.22)}
#s-mbrs .mbrs-search::placeholder{color:#94A3B8;opacity:1}
#s-mbrs .mbrs-filter{padding:9px 12px;background:#0A0E17;border:1px solid #2B3A5A;border-radius:8px;font-size:13px;font-family:inherit;color:#FFFFFF;cursor:pointer;outline:none}
#s-mbrs .mbrs-refresh{background:#131C2E;border:1px solid #2B3A5A;border-radius:8px;padding:8px 12px;font-size:14px;cursor:pointer;color:#F1F5F9}
#s-mbrs .mbrs-refresh:hover{border-color:#22D3EE;color:#22D3EE}
#s-mbrs .mbrs-export{margin-left:auto;background:#22D3EE;color:#04141C;border:1px solid #22D3EE;border-radius:8px;padding:9px 16px;font-size:13px;font-weight:700;font-family:inherit;cursor:pointer;white-space:nowrap}
#s-mbrs .mbrs-export:hover{background:#67E8F9;border-color:#67E8F9}

/* Data-table : surface sombre, bordures #2B3A5A, en-tête legèrement plus clair */
#s-mbrs .mbrs-table-wrap,#s-env .mbrs-table-wrap{background:#131C2E;border:1px solid #2B3A5A;border-radius:12px;overflow:hidden;overflow-x:auto}
#s-mbrs table.mbrs-table,#s-env table.mbrs-table{width:100%;border-collapse:collapse;background:transparent;font-family:"Inter",system-ui,-apple-system,"Segoe UI",sans-serif}
#s-mbrs .mbrs-table th,#s-env .mbrs-table th{background:#1B2740;color:#CBD5E1;font-size:11px;font-weight:700;text-transform:uppercase;letter-spacing:.04em;padding:11px 14px;text-align:left;border-bottom:1px solid #2B3A5A;white-space:nowrap}
#s-mbrs .mbrs-table td,#s-env .mbrs-table td{padding:12px 14px;border-bottom:1px solid #1E2A44;font-size:13px;color:#F1F5F9;vertical-align:middle}
#s-mbrs .mbrs-table tbody tr:last-child td,#s-env .mbrs-table tbody tr:last-child td{border-bottom:0}
#s-mbrs .mbrs-table tbody tr:hover td,#s-env .mbrs-table tbody tr:hover td{background:rgba(34,211,238,.07)}
/* Refonte 2026-05-26 — meilleure densité texte secondaire + boutons aérés */
#s-mbrs .mbrs-qr,#s-env .mbrs-qr{font-size:12px;color:#94A3B8;font-family:ui-monospace,monospace;margin-top:5px;letter-spacing:.02em;font-weight:500}
#s-mbrs .mbrs-email,#s-env .mbrs-email{font-size:12px;color:#CBD5E1;max-width:210px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
#s-mbrs .mbrs-dot,#s-env .mbrs-dot{display:inline-block;width:8px;height:8px;border-radius:50%;vertical-align:middle;margin-left:5px}
#s-mbrs .mbrs-act,#s-env .mbrs-act{background:#1E293B;border:1px solid #334155;border-radius:8px;padding:7px 12px;font-size:12px;font-weight:700;cursor:pointer;margin:3px 4px;font-family:inherit;color:#F1F5F9;transition:all .15s}
#s-mbrs .mbrs-act:hover,#s-env .mbrs-act:hover{border-color:#22D3EE;color:#22D3EE;background:rgba(34,211,238,.10)}
#s-mbrs .mbrs-act-edit,#s-env .mbrs-act-edit{border-color:#22D3EE;color:#22D3EE}

/* ════════════════════════════════════════════════════════════════
   9 · Tableau de bord (Dashboard) — Dark, scopé à #s-acc
════════════════════════════════════════════════════════════════ */
/* Fond de page transparent — laisser le fond global #0A0E17 transparaître */
#pg-acc,#s-acc{background:transparent !important}
/* Widgets & cartes (Manager, CA, Actifs, postes PS4/VIP) → surface sombre, ombre profonde, coins 16px */
#s-acc .cd,#s-acc .kc,#s-acc .sc{
  background:#131C2E !important;
  border:1px solid #2B3A5A !important;
  border-radius:16px !important;
  box-shadow:0 4px 15px rgba(0,0,0,0.40) !important;
}
/* Boutons d'action → Bleu-Vert foncé #1F4E4A, texte blanc (brand préservé) */
#s-acc .btn.ba,#s-acc .btn.bg,#s-acc .btn.br,#s-acc .btn.bo,#s-acc .btn.bd{
  background:#1F4E4A !important;color:#FFFFFF !important;border:1px solid #1F4E4A !important;
}
#s-acc .btn.ba *,#s-acc .btn.bg *,#s-acc .btn.br *,#s-acc .btn.bo *,#s-acc .btn.bd *{color:#FFFFFF !important}
/* Compteurs géants & titres → BLANC franc (au lieu de l'ancien #0F172A invisible sur dark) */
#s-acc .kv,#s-acc .cd-h,#s-acc .sn,
#s-acc .sc .tg:has([id^="ld-"]) [id^="ld-"]{color:#FFFFFF !important;-webkit-text-fill-color:#FFFFFF !important}
/* Structure : cartes des postes bien espacées, alignées, sans chevauchement */
@media (min-width:1024px){#s-acc{gap:24px !important}}

/* ════════════════════════════════════════════════════════════════
   10 · Tableau de bord Direction (#mobile-dashboard) — Dark
════════════════════════════════════════════════════════════════ */
#mobile-dashboard{color:#F1F5F9}
/* Rangée de statistiques — grille 4 colonnes */
#mobile-dashboard .md-stats{
  display:grid;grid-template-columns:repeat(4,1fr);gap:14px;margin-bottom:14px;
}
#mobile-dashboard .md-stat{
  background:#131C2E;border:1px solid #2B3A5A;border-radius:16px;
  box-shadow:0 4px 15px rgba(0,0,0,0.40);padding:14px 16px;
}
#mobile-dashboard .md-stat-lbl{
  font-size:10.5px;color:#CBD5E1;text-transform:uppercase;letter-spacing:.05em;
}
#mobile-dashboard .md-stat-val{
  font-size:27px;font-weight:900;line-height:1.1;margin-top:5px;
  font-variant-numeric:tabular-nums;color:#FFFFFF;
}
#mobile-dashboard .md-stat-sub{font-size:10.5px;color:#CBD5E1;margin-top:2px}
/* Actions rapides — 4 boutons Bleu-Vert foncé */
#mobile-dashboard .md-actions{display:grid;grid-template-columns:repeat(4,1fr);gap:8px}
#mobile-dashboard .md-act{
  background:#1F4E4A;color:#FFFFFF;border:1px solid #1F4E4A;
  padding:11px 10px;border-radius:10px;font-size:11.5px;font-weight:700;
  font-family:inherit;cursor:pointer;
}
#mobile-dashboard .md-act:hover{background:#2D5A60}
/* Grille des machines — compacte, 4-5 par ligne */
#mobile-dashboard .md-machines{
  display:grid;grid-template-columns:repeat(auto-fill,minmax(210px,1fr));gap:10px;
}
#mobile-dashboard .md-machine{
  background:#1A2336;border:1px solid #2B3A5A;border-radius:12px;padding:10px 12px;color:#F1F5F9;
}
/* Barre de navigation basse — sombre, centrée */
#mobile-dashboard .md-navbar{
  position:fixed;bottom:0;left:0;right:0;
  background:#0F1623;border-top:1px solid #2B3A5A;
  display:grid;grid-template-columns:repeat(4,1fr);gap:6px;
  padding:8px 16px;z-index:99999;max-width:1400px;margin:0 auto;
}
/* Responsive : on réduit le nombre de colonnes sur écran étroit */
@media (max-width:1100px){
  #mobile-dashboard .md-stats,#mobile-dashboard .md-actions{grid-template-columns:repeat(2,1fr)}
}
@media (max-width:560px){
  #mobile-dashboard .md-stats,#mobile-dashboard .md-actions{grid-template-columns:1fr}
}

/* ════════════════════════════════════════════════════════════════
   13 · Page Contrôle (#s-ctrl) — rangement géométrique
   LAYOUT 100% PRÉSERVÉ. Aucune règle de couleur dans ce bloc.
════════════════════════════════════════════════════════════════ */
#s-ctrl{
  display:grid !important;
  grid-template-columns:1fr !important;
  gap:16px !important;
  align-content:start;
}
/* Carte « Contrôle Global » : 1re ligne, espace réservé en haut pour le bouton */
#s-ctrl > div:first-child{
  grid-row:1;grid-column:1;
  padding-top:58px !important;
}
/* Les 4 statistiques globales s'étalent sur toute la largeur de la carte */
#s-ctrl > div:first-child > div[style*="grid-template-columns:1fr 1fr"]{
  grid-template-columns:repeat(4,1fr) !important;
}
/* Bouton « Actualiser » : placé dans la même cellule que la carte Globale,
   ancré en haut à droite — il ne crée plus de conteneur vide dans le flux. */
#s-ctrl > .btn.bgh{
  grid-row:1;grid-column:1;
  justify-self:end;align-self:start;
  margin:16px 16px 0 0 !important;
  width:auto !important;max-width:none !important;
  min-height:0 !important;z-index:4;
}
@media (max-width:720px){
  #s-ctrl > div:first-child > div[style*="grid-template-columns:1fr 1fr"]{
    grid-template-columns:1fr 1fr !important;
  }
  #s-ctrl > div:first-child{padding-top:54px !important}
  #s-ctrl > .btn.bgh{margin:12px 12px 0 0 !important}
}

/* ════════════════════════════════════════════════════════════════
   14 · Page Audit (#s-audit) — espacement & colonnes du tableau
   LAYOUT 100% PRÉSERVÉ. Aucune règle de couleur dans ce bloc.
════════════════════════════════════════════════════════════════ */
/* Cartes Watchdog + Log d'audit : marges internes généreuses */
#s-audit .cd{padding:24px 26px !important}
#s-audit .cd-h{margin-bottom:16px}
/* Tableau du log : cellules aérées, texte lisible */
#s-audit .tbl2 th,#s-audit .tbl2 td{padding:13px 16px !important}
#s-audit .tbl2 td{font-size:11px !important;line-height:1.5}
/* Colonnes équilibrées : Date | Action | Par | Détail */
#s-audit .tbl2 th:nth-child(1),#s-audit .tbl2 td:nth-child(1){width:17%}
#s-audit .tbl2 th:nth-child(2),#s-audit .tbl2 td:nth-child(2){width:19%}
#s-audit .tbl2 th:nth-child(3),#s-audit .tbl2 td:nth-child(3){width:16%}
#s-audit .tbl2 th:nth-child(4),#s-audit .tbl2 td:nth-child(4){
  width:48%;white-space:normal;word-break:break-word;line-height:1.55;
}
@media (max-width:720px){
  #s-audit .cd{padding:16px 16px !important}
  #s-audit .tbl2 th,#s-audit .tbl2 td{padding:10px 11px !important}
}

/* ════════════════════════════════════════════════════════════════
   15 · Tableau de bord (#s-acc) — compactage
   S'applique aux DEUX vues de la page Accueil : Manager ET Opérateur
   (même fonction renderAcc). Couleurs traitées plus haut (section 9).
   LAYOUT 100% PRÉSERVÉ — paddings, polices et largeur des colonnes.
════════════════════════════════════════════════════════════════ */
/* Grille : colonnes étroites → 4-5 cartes machines par ligne, gap réduit */
#s-acc{
  grid-template-columns:repeat(auto-fill,minmax(220px,1fr)) !important;
  gap:10px !important;
}
/* Tout bloc large (héro, grille KPI, cartes .cd, bandeaux, en-tête)
   occupe la pleine largeur ; seules les cartes machines .sc se répartissent. */
#s-acc > *{grid-column:1 / -1 !important}
#s-acc > .sc{grid-column:auto !important}

/* — Widgets du haut — */
/* Carte héro : padding et gros montant nettement réduits */
#s-acc > div:first-child{padding:11px 14px !important;margin-bottom:0 !important}
#s-acc > div:first-child > div[data-count]{font-size:21px !important;margin:1px 0 !important}
/* Cartes KPI (CA clôturé, Argent en cours, Machines actives…) compactes */
#s-acc .kc{padding:9px 11px !important}
#s-acc .kl{font-size:9.5px !important;margin-bottom:3px !important}
/* Compteurs KPI : police fortement réduite */
#s-acc .kv{font-size:17px !important}

/* — Cartes machines / sessions actives — */
#s-acc .sc{padding:9px 11px !important}
#s-acc .sc .sn{font-size:12.5px !important}
#s-acc .sc .tgs{margin-top:6px !important;gap:4px !important}
/* Pastilles d'info — dont le compteur « Temps écoulé » (id ld-*) */
#s-acc .sc .tg{font-size:10px !important;padding:3px 7px !important}
/* Montant DH de la carte machine : pastille compacte */
#s-acc .sc .sp{font-size:11.5px !important;padding:4px 9px !important}
/* Boutons d'action (Sortie, Transférer…) compacts */
#s-acc .sc .btn{padding:7px 10px !important;font-size:11px !important;min-height:0 !important}

/* ════════════════════════════════════════════════════════════════
   v252 — DÉBLOCAGE GLOBAL DU SCROLL SOURIS (urgent directeur 2026-05-22)
   PRÉSERVÉ INTÉGRALEMENT — NE PAS TOUCHER.
   Le shell app posait html,body{overflow:hidden;height:100%} → la roulette
   souris était bloquée sur certaines vues. Override radical avec !important
   pour rétablir le scroll natif sur toute l'application.
   Redondance : un bloc identique est aussi injecté en fin de <body>
   dans index.html (ev-scroll-unlock-v252) pour pallier un éventuel
   échec de chargement de ce fichier.
════════════════════════════════════════════════════════════════ */
html, body {
  overflow-y: auto !important;
  overflow-x: hidden !important;
  height: auto !important;
}
/* Containers app-shell qui pourraient clipper le scroll body en restant
   en height:100% — on les laisse grandir en hauteur tout en gardant
   l'écran rempli au minimum (fond, padding cohérent). */
#app, #mb-p-app, #mb-app, #mode-membre, #mode-admin {
  height: auto !important;
  min-height: 100dvh !important;
}

/* =============== /css/ev-homepage-v300.css?v=300-darkfinal =============== */
/* ============================================================
   EspaceVirtuel PRO — Homepage Refresh v300
   ------------------------------------------------------------
   Crée le : 2026-05-25
   Portée  : UNIQUEMENT la page d'accueil publique (#p-auth)
             + écrans transverses : skip-link, toasts, 404, loading.
   Stratégie : surcouche cumulative, ZÉRO retrait des règles
   précédentes (v280→v291). On scope avec :
       body:has(#p-auth.on)  → home publique
       body.ev-home-on       → fallback set en JS si :has() KO
   Sécurité : pas de !important sauf pour neutraliser inline-styles
   legacy hérités (background:#FFFFFF;color:#0F172A…).
   ============================================================ */

/* ───────────────────────────────────────────────────────────
   §1  TYPOGRAPHIE + FONT-DISPLAY SWAP
   ─────────────────────────────────────────────────────────── */


:root{
  --evh-font-display: "Space Grotesk", "Inter", system-ui, sans-serif;
  --evh-font-body:    "Inter", system-ui, -apple-system, "Segoe UI", sans-serif;
  --evh-bg:           #0A0A12;
  --evh-surface-1:    #14141F;
  --evh-surface-2:    #1B1B2A;
  --evh-border:       rgba(255,255,255,.08);
  --evh-border-hi:    rgba(255,255,255,.16);
  --evh-text:         #F1F5F9;
  --evh-text-dim:     #CBD5E1;
  --evh-text-mute:    #94A3B8;
  --evh-cyan:         #22D3EE;
  --evh-cyan-soft:    rgba(34,211,238,.12);
  --evh-cyan-glow:    rgba(34,211,238,.40);
  --evh-violet:       #A855F7;
  --evh-violet-soft:  rgba(168,85,247,.12);
  --evh-grad:         linear-gradient(135deg,#22D3EE 0%,#A855F7 100%);
  --evh-grad-radial:  radial-gradient(ellipse 80% 60% at 20% 30%,rgba(34,211,238,.10) 0%,transparent 60%),
                      radial-gradient(ellipse 70% 50% at 90% 80%,rgba(168,85,247,.12) 0%,transparent 60%);
  --evh-radius:       14px;
  --evh-radius-lg:    20px;
}

/* ───────────────────────────────────────────────────────────
   §2  GLOBAL — SKIP-LINK + FOCUS VISIBLE + REDUCED-MOTION
   ─────────────────────────────────────────────────────────── */
.skip-link{
  position:absolute;left:-9999px;top:0;background:var(--evh-cyan);color:#0A0A12;
  padding:10px 16px;font-weight:700;z-index:99999;border-radius:0 0 8px 0;
}
.skip-link:focus{ left:0 !important }

/* Focus cyan visible partout (override navigateur grisâtre) */
body:has(#p-auth.on) :is(a,button,input,select,textarea,[tabindex]):focus-visible{
  outline:2px solid var(--evh-cyan) !important;
  outline-offset:2px;
  border-radius:6px;
  box-shadow:0 0 0 4px rgba(34,211,238,.20);
}

@media (prefers-reduced-motion: reduce){
  *,*::before,*::after{
    animation-duration:.001ms !important;
    animation-iteration-count:1 !important;
    transition-duration:.001ms !important;
    scroll-behavior:auto !important;
  }
}

/* ───────────────────────────────────────────────────────────
   §3  HOME — FOND + LAYOUT SPLIT-SCREEN HERO (≥1024px)
   ─────────────────────────────────────────────────────────── */
body:has(#p-auth.on){
  background:var(--evh-bg) !important;
  color:var(--evh-text);
  font-family:var(--evh-font-body);
  min-height:100vh;
}
body:has(#p-auth.on)::before{
  content:"";position:fixed;inset:0;pointer-events:none;z-index:0;
  background:var(--evh-grad-radial);
}
body:has(#p-auth.on)::after{
  content:"";position:fixed;inset:0;pointer-events:none;z-index:0;opacity:.04;
  background-image:
    linear-gradient(to right,rgba(34,211,238,.4) 1px,transparent 1px),
    linear-gradient(to bottom,rgba(34,211,238,.4) 1px,transparent 1px);
  background-size:48px 48px;
  mask-image:radial-gradient(ellipse 70% 60% at 50% 40%,#000 0%,transparent 70%);
}

/* Header fixé en haut, footer en bas, hero centré */
#p-auth{
  position:relative;z-index:1;
  min-height:100vh;
  padding:88px 16px 64px;
  box-sizing:border-box;
}
#p-auth .aw{ max-width:1280px;margin:0 auto;width:100%; }

/* DESKTOP : split-screen */
@media (min-width:1024px){
  #p-auth .aw{
    display:grid;
    grid-template-columns:minmax(0,3fr) minmax(420px,2fr);
    gap:56px;
    align-items:start;
  }
  /* Hero marketing à gauche */
  #p-auth .ahero,
  #p-auth #ev-promo-card,
  #p-auth .ev-reassur,
  #p-auth .ev-howitworks,
  #p-auth .ev-testimonials,
  #p-auth .ev-partners{ grid-column:1; }
  /* Auth (tabs + forms + footer-link bar) à droite, sticky */
  #p-auth .atabs,
  #p-auth #form-login,
  #p-auth #form-signup,
  #p-auth > .aw > div:last-child{ grid-column:2; }
  #p-auth .atabs{ position:sticky;top:88px; }
}

/* ───────────────────────────────────────────────────────────
   §4  HERO — TITRE GRADIENT + BASELINE + FEATURES
   ─────────────────────────────────────────────────────────── */
#p-auth .ahero{
  text-align:left;margin-bottom:32px;
}
#p-auth .ahero .hi{
  display:inline-flex;align-items:center;justify-content:center;
  width:64px;height:64px;border-radius:16px;
  background:var(--evh-grad);font-size:34px;
  box-shadow:0 8px 32px rgba(34,211,238,.30);
  margin-bottom:20px;
}
#p-auth .ahero h1{
  font-family:var(--evh-font-display);
  font-size:clamp(36px,5.5vw,68px);
  font-weight:700;line-height:1.05;letter-spacing:-.03em;
  margin:0 0 14px;
  background:var(--evh-grad);
  -webkit-background-clip:text;background-clip:text;
  -webkit-text-fill-color:transparent;
}
#p-auth .ahero p{
  font-size:clamp(15px,1.6vw,19px);
  color:var(--evh-text-dim);
  line-height:1.55;max-width:560px;margin:0;
}
/* 3 features clés injectées en JS */
.ev-features{
  display:grid;grid-template-columns:1fr;gap:14px;margin:28px 0 0;
}
@media (min-width:640px){ .ev-features{ grid-template-columns:repeat(3,1fr); gap:18px; } }
.ev-feature{
  display:flex;align-items:flex-start;gap:12px;
  padding:14px;border-radius:12px;
  background:rgba(255,255,255,.03);
  border:1px solid var(--evh-border);
  transition:transform .15s ease-out,border-color .15s ease-out,box-shadow .15s ease-out;
}
.ev-feature:hover{
  transform:translateY(-2px);
  border-color:var(--evh-cyan-glow);
  box-shadow:0 8px 24px rgba(34,211,238,.10);
}
.ev-feature__ico{
  display:flex;align-items:center;justify-content:center;
  width:38px;height:38px;border-radius:10px;flex-shrink:0;
  background:var(--evh-cyan-soft);color:var(--evh-cyan);
}
.ev-feature__ico svg{ width:20px;height:20px; }
.ev-feature__t{ font-weight:700;font-size:14px;color:var(--evh-text);margin:0 0 3px; }
.ev-feature__d{ font-size:12px;color:var(--evh-text-mute);margin:0;line-height:1.45; }

/* ───────────────────────────────────────────────────────────
   §5  REFONTE TRIO CARDS — Fidélité / Cashback / Parrainage
   on neutralise le legacy `#ev-promo-card` (fond blanc / vert /
   lavande) et on REMPLACE par 3 vraies cards homogènes injectées
   en JS dans #ev-promo-card.
   ─────────────────────────────────────────────────────────── */
body:has(#p-auth.on) #ev-promo-card{
  background:transparent !important;
  border:0 !important;
  padding:0 !important;
  color:var(--evh-text) !important;
  margin-bottom:36px;
}
body:has(#p-auth.on) #ev-promo-card > div[style*="font-weight:800"]{
  /* Titre légacy "Programme de Fidélité EspaceVirtuel" -> on le retravaille */
  color:var(--evh-text) !important;
  font-family:var(--evh-font-display);
  font-size:22px !important;font-weight:700 !important;
  letter-spacing:-.02em;text-align:left !important;
  margin:0 0 18px !important;
}
/* Tous les blocs internes legacy sont cachés : le JS injecte un trio v300 */
body:has(#p-auth.on) #ev-promo-card > div.tw-flex,
body:has(#p-auth.on) #ev-promo-card > div.tw-flex + div,
body:has(#p-auth.on) #ev-promo-card > hr,
body:has(#p-auth.on) #ev-promo-card > #ev-parrainage-card{
  display:none !important;
}
/* Le trio v300 rendu par JS */
.ev-trio{
  display:grid;grid-template-columns:1fr;gap:16px;
}
@media (min-width:768px){ .ev-trio{ grid-template-columns:repeat(3,1fr);gap:18px; } }
.ev-card{
  position:relative;display:flex;flex-direction:column;
  background:var(--evh-surface-1);
  border:1px solid var(--evh-border);
  border-radius:var(--evh-radius);
  padding:22px 20px;
  transition:transform .18s ease-out,border-color .18s ease-out,box-shadow .18s ease-out;
}
.ev-card:hover{
  transform:translateY(-3px);
  border-color:var(--evh-cyan-glow);
  box-shadow:0 16px 48px -12px rgba(34,211,238,.18),0 4px 14px rgba(0,0,0,.30);
}
.ev-card__ico{
  display:flex;align-items:center;justify-content:center;
  width:48px;height:48px;border-radius:14px;margin-bottom:14px;
  background:var(--evh-cyan-soft);color:var(--evh-cyan);
}
.ev-card__ico--violet{ background:var(--evh-violet-soft);color:var(--evh-violet); }
.ev-card__ico svg{ width:24px;height:24px; }
.ev-card__t{ font-size:13px;font-weight:600;color:var(--evh-text-mute);text-transform:uppercase;letter-spacing:.06em;margin:0 0 6px; }
.ev-card__big{
  font-family:var(--evh-font-display);
  font-size:clamp(32px,4vw,44px);font-weight:800;line-height:1;letter-spacing:-.02em;
  background:var(--evh-grad);
  -webkit-background-clip:text;background-clip:text;-webkit-text-fill-color:transparent;
  margin:0 0 10px;
}
.ev-card__d{ font-size:13px;color:var(--evh-text-dim);line-height:1.55;margin:0 0 14px; }
.ev-card__cta{
  margin-top:auto;display:inline-flex;align-items:center;gap:6px;
  font-size:12px;font-weight:600;color:var(--evh-cyan);text-decoration:none;
}
.ev-card__cta:hover{ text-decoration:underline; }

/* ───────────────────────────────────────────────────────────
   §6  FORMULAIRES LOGIN / SIGNUP — refonte
   ─────────────────────────────────────────────────────────── */
/* Tabs avec underline animée */
body:has(#p-auth.on) .atabs{
  display:flex;gap:0;position:relative;
  background:var(--evh-surface-1);
  border:1px solid var(--evh-border);
  border-radius:12px;padding:4px;margin-bottom:18px;
}
body:has(#p-auth.on) .atab{
  flex:1;text-align:center;padding:11px 14px;cursor:pointer;
  font-size:14px;font-weight:600;color:var(--evh-text-mute);
  border-radius:8px;transition:color .2s ease-out;position:relative;
}
body:has(#p-auth.on) .atab.on{
  color:var(--evh-text);
  background:linear-gradient(180deg,rgba(34,211,238,.10),rgba(34,211,238,.04));
  box-shadow:inset 0 0 0 1px rgba(34,211,238,.30);
}
body:has(#p-auth.on) .atab:not(.on):hover{ color:var(--evh-text-dim); }

/* Cards de formulaire */
body:has(#p-auth.on) .acard{
  background:var(--evh-surface-1) !important;
  border:1px solid var(--evh-border) !important;
  border-radius:var(--evh-radius-lg);
  padding:24px !important;
  backdrop-filter:blur(8px);
  -webkit-backdrop-filter:blur(8px);
  color:var(--evh-text) !important;
}
@media (min-width:1024px){
  body:has(#p-auth.on) .acard{
    padding:28px !important;
    box-shadow:0 24px 60px -20px rgba(0,0,0,.50);
  }
}
body:has(#p-auth.on) .fg{ margin-bottom:14px;position:relative; }
body:has(#p-auth.on) .fl{
  display:block;font-size:12px;font-weight:600;color:var(--evh-text-dim);
  margin-bottom:6px;letter-spacing:.01em;
}
body:has(#p-auth.on) .fi{
  width:100%;box-sizing:border-box;
  height:46px;
  background:var(--evh-surface-2) !important;
  border:1px solid var(--evh-border-hi) !important;
  border-radius:10px;
  color:var(--evh-text) !important;
  font-size:14px;padding:0 14px 0 40px;
  transition:border-color .15s,box-shadow .15s,background-color .15s;
}
body:has(#p-auth.on) .fi::placeholder{ color:var(--evh-text-mute);opacity:.7; }
body:has(#p-auth.on) .fi:focus{
  outline:none;
  border-color:var(--evh-cyan) !important;
  box-shadow:0 0 0 3px rgba(34,211,238,.18);
  background:rgba(34,211,238,.04) !important;
}
/* Bouton submit */
body:has(#p-auth.on) .btn.ba{
  width:100%;height:48px;
  display:inline-flex;align-items:center;justify-content:center;gap:8px;
  font-size:15px;font-weight:700;letter-spacing:.01em;
  background:var(--evh-grad) !important;
  color:#0A0A12 !important;
  border:0;border-radius:12px;cursor:pointer;
  transition:transform .15s ease-out,box-shadow .15s ease-out,filter .15s;
  box-shadow:0 8px 24px -6px rgba(34,211,238,.40);
  position:relative;
}
body:has(#p-auth.on) .btn.ba:hover{
  transform:translateY(-1px) scale(1.01);
  box-shadow:0 12px 32px -8px rgba(34,211,238,.55);
  filter:brightness(1.05);
}
body:has(#p-auth.on) .btn.ba:active{ transform:translateY(0) scale(.98); }
body:has(#p-auth.on) .btn.ba[disabled],
body:has(#p-auth.on) .btn.ba.is-loading{ opacity:.7;cursor:wait; }
body:has(#p-auth.on) .btn.ba.is-loading::after{
  content:"";display:inline-block;width:16px;height:16px;
  border:2px solid rgba(10,10,18,.30);border-top-color:#0A0A12;
  border-radius:50%;animation:evhSpin .7s linear infinite;
}
@keyframes evhSpin{ to{ transform:rotate(360deg); } }

/* Eye toggle */
body:has(#p-auth.on) .pw-eye{
  color:var(--evh-text-mute) !important;
  opacity:.85 !important;
  transition:color .15s,opacity .15s;
}
body:has(#p-auth.on) .pw-eye:hover{ color:var(--evh-cyan) !important;opacity:1 !important; }

/* Erreurs / OK */
body:has(#p-auth.on) .aerr{
  color:#FCA5A5;background:rgba(239,68,68,.08);
  border:1px solid rgba(239,68,68,.30);border-radius:8px;
  padding:8px 12px;font-size:12px;margin-top:10px;min-height:0;
}
body:has(#p-auth.on) .aerr:empty{ display:none; }
body:has(#p-auth.on) .aok{
  color:#86EFAC;background:rgba(34,197,94,.08);
  border:1px solid rgba(34,197,94,.30);border-radius:8px;
  padding:8px 12px;font-size:12px;margin-top:10px;
}
body:has(#p-auth.on) .aok:empty{ display:none; }

/* Inline validation */
.ev-inline-err{
  font-size:11px;color:#FCA5A5;margin-top:4px;
  display:none;
}
.ev-inline-err.on{ display:block; }

/* ───────────────────────────────────────────────────────────
   §7  HEADER fixe + burger mobile (injecté JS dans body)
   ─────────────────────────────────────────────────────────── */
.ev-header{
  position:fixed;top:0;left:0;right:0;z-index:1000;
  display:flex;align-items:center;justify-content:space-between;
  padding:14px 24px;
  background:rgba(10,10,18,.55);
  backdrop-filter:blur(14px) saturate(150%);
  -webkit-backdrop-filter:blur(14px) saturate(150%);
  border-bottom:1px solid transparent;
  transition:background-color .25s,border-color .25s;
}
.ev-header.is-scrolled{
  background:rgba(10,10,18,.85);
  border-bottom-color:var(--evh-border);
}
.ev-header__brand{
  display:inline-flex;align-items:center;gap:10px;
  color:var(--evh-text);text-decoration:none;font-weight:700;
}
.ev-header__brand-mono{
  width:32px;height:32px;border-radius:9px;
  background:var(--evh-grad);
  display:inline-flex;align-items:center;justify-content:center;
  color:#0A0A12;font-weight:900;font-size:14px;letter-spacing:-.02em;
  box-shadow:0 4px 14px rgba(34,211,238,.30);
}
.ev-header__name{ font-family:var(--evh-font-display);font-size:16px;letter-spacing:-.01em; }
.ev-header__nav{ display:none; }
@media (min-width:900px){
  .ev-header__nav{ display:flex;gap:6px; }
  .ev-header__nav a{
    padding:8px 14px;border-radius:8px;font-size:13px;font-weight:500;
    color:var(--evh-text-dim);text-decoration:none;
    transition:color .15s,background-color .15s;
  }
  .ev-header__nav a:hover{ color:var(--evh-text);background:rgba(255,255,255,.05); }
}
.ev-header__cta{
  display:none;align-items:center;gap:6px;
  padding:8px 16px;height:36px;
  border-radius:9px;background:var(--evh-cyan-soft);
  color:var(--evh-cyan);border:1px solid var(--evh-cyan-glow);
  font-size:13px;font-weight:600;cursor:pointer;text-decoration:none;
}
@media (min-width:900px){ .ev-header__cta{ display:inline-flex; } }
.ev-header__cta:hover{ background:rgba(34,211,238,.18); }
.ev-burger{
  display:inline-flex;align-items:center;justify-content:center;
  width:40px;height:40px;border-radius:10px;
  background:rgba(255,255,255,.05);border:1px solid var(--evh-border);
  color:var(--evh-text);cursor:pointer;
}
@media (min-width:900px){ .ev-burger{ display:none; } }
.ev-burger svg{ width:20px;height:20px; }

/* Drawer mobile */
.ev-drawer{
  position:fixed;inset:0;z-index:1100;display:none;
  background:rgba(10,10,18,.85);backdrop-filter:blur(8px);
}
.ev-drawer.on{ display:flex;flex-direction:column; }
.ev-drawer__panel{
  margin:62px 16px 16px;background:var(--evh-surface-1);
  border:1px solid var(--evh-border);border-radius:16px;padding:12px;
  animation:evhSlideDown .25s ease-out;
}
.ev-drawer a{
  display:flex;align-items:center;gap:10px;padding:14px 12px;
  color:var(--evh-text-dim);text-decoration:none;font-size:14px;font-weight:500;
  border-radius:10px;
}
.ev-drawer a:hover{ background:rgba(255,255,255,.05);color:var(--evh-text); }
@keyframes evhSlideDown{ from{ opacity:0;transform:translateY(-8px); } to{ opacity:1;transform:none; } }

/* ───────────────────────────────────────────────────────────
   §8  FOOTER 4 colonnes
   ─────────────────────────────────────────────────────────── */
.ev-footer{
  position:relative;z-index:1;margin-top:80px;padding:48px 24px 32px;
  border-top:1px solid var(--evh-border);
  background:linear-gradient(180deg,transparent 0%,rgba(0,0,0,.30) 100%);
}
.ev-footer__inner{ max-width:1280px;margin:0 auto; }
.ev-footer__top{
  display:flex;align-items:center;gap:14px;margin-bottom:32px;
}
.ev-footer__brand{ font-family:var(--evh-font-display);font-size:18px;font-weight:700; }
.ev-footer__tagline{ color:var(--evh-text-mute);font-size:13px; }
.ev-footer__cols{
  display:grid;grid-template-columns:1fr;gap:24px;margin-bottom:32px;
}
@media (min-width:720px){ .ev-footer__cols{ grid-template-columns:repeat(2,1fr); } }
@media (min-width:1024px){ .ev-footer__cols{ grid-template-columns:repeat(4,1fr);gap:48px; } }
.ev-footer__col h5{
  font-size:11px;font-weight:700;color:var(--evh-text);
  text-transform:uppercase;letter-spacing:.10em;margin:0 0 14px;
}
.ev-footer__col ul{ list-style:none;padding:0;margin:0; }
.ev-footer__col li{ margin-bottom:10px; }
.ev-footer__col a{
  color:var(--evh-text-mute);text-decoration:none;font-size:13px;
  display:inline-flex;align-items:center;gap:8px;
  transition:color .15s;
}
.ev-footer__col a:hover{ color:var(--evh-cyan); }
.ev-footer__social{ display:flex;gap:10px; }
.ev-footer__social a{
  width:36px;height:36px;border-radius:10px;
  background:var(--evh-surface-1);border:1px solid var(--evh-border);
  display:inline-flex;align-items:center;justify-content:center;
}
.ev-footer__social a:hover{ border-color:var(--evh-cyan-glow);color:var(--evh-cyan); }
.ev-footer__copyright{
  text-align:center;padding-top:24px;border-top:1px solid var(--evh-border);
  color:var(--evh-text-mute);font-size:12px;
}

/* ───────────────────────────────────────────────────────────
   §9  RÉASSURANCE — Stats / How-it-works / Témoignages / Partners
   ─────────────────────────────────────────────────────────── */
/* Section heading */
.ev-section-h{
  font-family:var(--evh-font-display);
  font-size:clamp(22px,3vw,30px);font-weight:700;line-height:1.2;
  letter-spacing:-.02em;color:var(--evh-text);margin:48px 0 8px;
}
.ev-section-sub{
  color:var(--evh-text-mute);font-size:14px;margin:0 0 24px;line-height:1.55;
}

/* Stats bar */
.ev-stats{
  display:grid;grid-template-columns:repeat(2,1fr);gap:14px;
  background:var(--evh-surface-1);border:1px solid var(--evh-border);
  border-radius:var(--evh-radius-lg);padding:24px;margin:32px 0 0;
}
@media (min-width:768px){ .ev-stats{ grid-template-columns:repeat(4,1fr);padding:32px; } }
.ev-stat{ text-align:center; }
.ev-stat__n{
  font-family:var(--evh-font-display);
  font-size:clamp(28px,3.5vw,40px);font-weight:800;line-height:1;
  background:var(--evh-grad);
  -webkit-background-clip:text;background-clip:text;-webkit-text-fill-color:transparent;
  letter-spacing:-.02em;
  font-variant-numeric:tabular-nums;
}
.ev-stat__l{ font-size:12px;color:var(--evh-text-mute);margin-top:6px;line-height:1.4; }
.ev-stat__ph{ color:#FCD34D;font-size:10px;display:block;margin-top:4px;font-weight:600; }

/* How it works */
.ev-howitworks{ display:grid;grid-template-columns:1fr;gap:18px;margin-top:24px; }
@media (min-width:768px){ .ev-howitworks{ grid-template-columns:repeat(3,1fr); } }
.ev-step{
  position:relative;background:var(--evh-surface-1);border:1px solid var(--evh-border);
  border-radius:var(--evh-radius);padding:22px;
}
.ev-step__n{
  position:absolute;top:14px;right:14px;
  font-family:var(--evh-font-display);font-size:38px;font-weight:800;line-height:1;
  color:rgba(255,255,255,.06);
}
.ev-step__ico{
  width:48px;height:48px;border-radius:14px;
  background:var(--evh-cyan-soft);color:var(--evh-cyan);
  display:flex;align-items:center;justify-content:center;margin-bottom:14px;
}
.ev-step__ico svg{ width:24px;height:24px; }
.ev-step__t{ font-size:15px;font-weight:700;color:var(--evh-text);margin:0 0 6px; }
.ev-step__d{ font-size:13px;color:var(--evh-text-dim);line-height:1.55;margin:0; }

/* Testimonials */
.ev-testimonials{ display:grid;grid-template-columns:1fr;gap:18px;margin-top:24px; }
@media (min-width:768px){ .ev-testimonials{ grid-template-columns:repeat(3,1fr); } }
.ev-testim{
  background:var(--evh-surface-1);border:1px solid var(--evh-border);
  border-radius:var(--evh-radius);padding:22px;display:flex;flex-direction:column;
}
.ev-testim__quote{
  color:var(--evh-text);font-size:14px;line-height:1.6;margin:0 0 16px;
  flex:1;font-style:italic;
}
.ev-testim__quote::before{ content:"« ";color:var(--evh-cyan);font-weight:700; }
.ev-testim__quote::after{ content:" »";color:var(--evh-cyan);font-weight:700; }
.ev-testim__a{ display:flex;align-items:center;gap:12px; }
.ev-testim__av{
  width:40px;height:40px;border-radius:50%;
  background:var(--evh-grad);
  display:flex;align-items:center;justify-content:center;
  color:#0A0A12;font-weight:800;font-size:14px;
  font-family:var(--evh-font-display);
}
.ev-testim__nm{ font-size:13px;font-weight:700;color:var(--evh-text);margin:0; }
.ev-testim__ct{ font-size:11px;color:var(--evh-text-mute);margin:0; }
.ev-placeholder-flag{
  display:inline-block;font-size:9px;font-weight:700;
  background:rgba(252,211,77,.15);color:#FCD34D;
  border:1px solid rgba(252,211,77,.40);
  padding:2px 6px;border-radius:4px;letter-spacing:.06em;text-transform:uppercase;
  margin-bottom:10px;
}

/* Partners */
.ev-partners{
  display:flex;flex-wrap:wrap;gap:16px;align-items:center;justify-content:center;
  margin:24px 0 0;padding:24px;
  background:var(--evh-surface-1);border:1px solid var(--evh-border);
  border-radius:var(--evh-radius-lg);
  opacity:.78;
}
.ev-partner{
  display:inline-flex;align-items:center;gap:8px;
  height:42px;padding:0 18px;
  background:var(--evh-surface-2);border:1px dashed var(--evh-border-hi);
  border-radius:10px;color:var(--evh-text-mute);font-size:12px;font-weight:600;
}
.ev-partner svg{ width:18px;height:18px; }

/* ───────────────────────────────────────────────────────────
   §10  TOASTS
   ─────────────────────────────────────────────────────────── */
.ev-toasts{
  position:fixed;bottom:24px;right:24px;z-index:9999;
  display:flex;flex-direction:column;gap:10px;
  max-width:360px;pointer-events:none;
}
.ev-toast{
  pointer-events:auto;
  background:var(--evh-surface-1);border:1px solid var(--evh-border-hi);
  border-radius:12px;padding:14px 16px;
  display:flex;align-items:flex-start;gap:10px;
  box-shadow:0 16px 48px -16px rgba(0,0,0,.60);
  animation:evhSlideInRight .25s ease-out;
  color:var(--evh-text);font-size:13px;line-height:1.4;
}
.ev-toast.is-ok   { border-left:3px solid #22C55E; }
.ev-toast.is-err  { border-left:3px solid #EF4444; }
.ev-toast.is-warn { border-left:3px solid #F59E0B; }
.ev-toast.is-info { border-left:3px solid var(--evh-cyan); }
@keyframes evhSlideInRight{
  from{ opacity:0;transform:translateX(24px); }
  to  { opacity:1;transform:none; }
}
.ev-toast__x{
  background:none;border:0;color:var(--evh-text-mute);cursor:pointer;
  font-size:16px;line-height:1;padding:2px;
}

/* ───────────────────────────────────────────────────────────
   §11  ANIMATIONS — fade-up / hover lift
   ─────────────────────────────────────────────────────────── */
.ev-fadeup{ opacity:0;transform:translateY(16px);transition:opacity .55s ease-out,transform .55s ease-out; }
.ev-fadeup.is-in{ opacity:1;transform:none; }

/* ───────────────────────────────────────────────────────────
   §12  LOADING SCREEN GLOBAL (boot)
   ─────────────────────────────────────────────────────────── */
.ev-boot{
  position:fixed;inset:0;z-index:99999;
  background:#0A0A12;
  display:flex;flex-direction:column;align-items:center;justify-content:center;gap:24px;
  transition:opacity .35s ease-out;
}
.ev-boot.is-out{ opacity:0;pointer-events:none; }
.ev-boot__mono{
  width:88px;height:88px;border-radius:24px;
  background:var(--evh-grad);
  display:flex;align-items:center;justify-content:center;
  color:#0A0A12;font-family:var(--evh-font-display);font-weight:900;font-size:38px;
  letter-spacing:-.04em;
  box-shadow:0 0 0 0 rgba(34,211,238,.4);
  animation:evhBootPulse 1.6s ease-in-out infinite;
  position:relative;
}
.ev-boot__mono::after{
  content:"";position:absolute;inset:-8px;border-radius:30px;
  border:2px solid transparent;border-top-color:var(--evh-cyan);
  animation:evhBootSpin 1.2s linear infinite;
}
@keyframes evhBootPulse{
  0%,100%{ box-shadow:0 0 0 0 rgba(34,211,238,.45); }
  50%    { box-shadow:0 0 0 18px rgba(34,211,238,0); }
}
@keyframes evhBootSpin{ to{ transform:rotate(360deg); } }
.ev-boot__lbl{ color:var(--evh-text-mute);font-size:13px;letter-spacing:.04em; }

/* ───────────────────────────────────────────────────────────
   §13  RESPONSIVE — sanity checks
   ─────────────────────────────────────────────────────────── */
body:has(#p-auth.on),
body:has(#p-auth.on) *{ box-sizing:border-box; }
body:has(#p-auth.on) img{ max-width:100%;height:auto; }

@media (max-width:1023px){
  #p-auth{ padding:80px 16px 48px; }
  #p-auth .ahero{ text-align:center; }
  #p-auth .ahero .hi{ margin-left:auto;margin-right:auto; }
  #p-auth .ahero p{ margin-left:auto;margin-right:auto; }
}
@media (max-width:480px){
  #p-auth{ padding:72px 12px 40px; }
  #p-auth .ahero .hi{ width:54px;height:54px;font-size:28px; }
  body:has(#p-auth.on) .acard{ padding:18px !important; }
}

/* Empêche tout overflow horizontal sur la home */
body:has(#p-auth.on){ overflow-x:hidden; }

/* =============== /css/ev-director-readability-pro-v302.css?v=302-darkfinal =============== */
/* ═══════════════════════════════════════════════════════════════════════════
   ev-director-readability-pro-v302.css  —  2026-05-25
   ───────────────────────────────────────────────────────────────────────────
   COMPLÉMENTAIRE à ev-readability-v290 / v290c (inline dans index.html).
   Cible : pages Manager / Director ("session directeur"), où le Directeur
   constate que la typo reste trop petite et le contraste insuffisant.

   PRINCIPES
   ─────────
   • Minimum typo 16px partout (td, labels, inputs, listes).
   • Section headings & KPI titles → 18-20px, font-weight 800-900.
   • KPI values → 28-32px, font-weight 900, tabular-nums, blanc pur.
   • Contraste foolproof :
     – Sur fond sombre → texte #FFFFFF (main) / #F1F5F9 (secondary).
     – Sur fond clair (cartes blanches) → texte #020617 (main) / #334155 (sec).
   • Audit logs : padding vertical 14-16px, font 16px, texte slate-100.
   • Charts (axes / labels) : forcer #FFFFFF (souvent invisibles black-on-black).
   • Listes clients / équipe : nom 18px semibold, email 16px slate-200.

   STRATÉGIE
   ─────────
   • Surcouche externe (pas d'inline) pour faciliter futurs ajustements.
   • !important systématique pour battre les styles inline injectés par app.js.
   • Sélecteurs ciblés sur #s-* / #pg-* admin pages → ne touche pas l'opérateur.
   ═══════════════════════════════════════════════════════════════════════════ */


/* ─── 0. SCOPE ROOT — toutes les pages admin "session directeur" ──────── */
:root {
  --ev-text-base:        16px;
  --ev-text-lg:          18px;
  --ev-text-xl:          20px;
  --ev-text-2xl:         24px;
  --ev-text-3xl:         30px;

  --ev-text-on-dark-1:   #FFFFFF;
  --ev-text-on-dark-2:   #F1F5F9;
  --ev-text-on-dark-3:   #CBD5E1;

  --ev-text-on-light-1:  #020617;
  --ev-text-on-light-2:  #1E293B;
  --ev-text-on-light-3:  #334155;

  --ev-row-pad-y:        14px;
}

/* Liste des pages directeur/manager — utilisé pour scope */
#s-acc, #s-mbrs, #s-eqp, #s-pln, #s-msg, #s-env, #s-envhist, #s-fin,
#s-hist, #s-rp, #s-ctrl, #s-stock, #s-pointage, #s-audit,
#s-caissectrl, #s-caisseRpt, #s-monservice, #s-caisseAlerts,
#pg-acc, #pg-mbrs, #pg-eqp, #pg-pln, #pg-msg, #pg-env, #pg-envhist,
#pg-fin, #pg-audit, #pg-caissectrl, #pg-caisseRpt, #pg-monservice,
#pg-caisseAlerts, #pg-staff, #pg-tarifs, #pg-depenses {
  font-size: var(--ev-text-base) !important;
  line-height: 1.55 !important;
  color: var(--ev-text-on-dark-2) !important;
}


/* ═══════════════════════════════════════════════════════════════════════
   §1. TYPO DE BASE — paragraphes, labels, valeurs simples
   ─────────────────────────────────────────────────────── */

/* Texte courant dans toutes les pages directeur */
[id^="s-"] p,
[id^="s-"] li,
[id^="s-"] label,
[id^="s-"] .fl,
[id^="s-"] .lb,
[id^="s-"] .k,
[id^="s-"] .bd,
[id^="pg-"] p,
[id^="pg-"] li,
[id^="pg-"] label,
[id^="pg-"] .fl,
[id^="pg-"] .lb {
  font-size: var(--ev-text-base) !important;
  line-height: 1.55 !important;
}

/* Inputs / textarea / select — palette + typo confort */
[id^="s-"] input,
[id^="s-"] textarea,
[id^="s-"] select,
[id^="pg-"] input,
[id^="pg-"] textarea,
[id^="pg-"] select,
[id^="s-"] .fi,
[id^="s-"] .fta,
[id^="pg-"] .fi,
[id^="pg-"] .fta {
  font-size: var(--ev-text-base) !important;
  line-height: 1.4 !important;
  padding: 10px 12px !important;
}


/* ═══════════════════════════════════════════════════════════════════════
   §2. SECTION HEADINGS & KPI TITLES — text-lg/text-xl + font-extrabold
   ──────────────────────────────────────────────────────────────────── */

[id^="s-"] h1, [id^="pg-"] h1 {
  font-size: 28px !important;
  font-weight: 900 !important;
  letter-spacing: -0.01em !important;
  color: var(--ev-text-on-dark-1) !important;
}
[id^="s-"] h2, [id^="pg-"] h2 {
  font-size: 22px !important;
  font-weight: 800 !important;
  color: var(--ev-text-on-dark-1) !important;
}
[id^="s-"] h3, [id^="pg-"] h3 {
  font-size: var(--ev-text-xl) !important;   /* 20px */
  font-weight: 800 !important;
  color: var(--ev-text-on-dark-1) !important;
}
[id^="s-"] h4, [id^="pg-"] h4 {
  font-size: var(--ev-text-lg) !important;   /* 18px */
  font-weight: 800 !important;
  color: var(--ev-text-on-dark-1) !important;
}


/* ═══════════════════════════════════════════════════════════════════════
   §3. KPI VALUES — chiffres ronds 24-30px, blanc pur, font-black, tabular
   ─────────────────────────────────────────────────────────────────────── */

[id^="s-"] div[style*="font-size:22px" i],
[id^="s-"] div[style*="font-size:24px" i],
[id^="s-"] div[style*="font-size:26px" i],
[id^="s-"] div[style*="font-size:28px" i],
[id^="s-"] div[style*="font-size:30px" i],
[id^="s-"] div[style*="font-size:32px" i],
[id^="s-"] div[style*="font-size:36px" i],
[id^="s-"] div[style*="font-size:40px" i],
[id^="s-"] div[style*="font-size:48px" i],
[id^="pg-"] div[style*="font-size:22px" i],
[id^="pg-"] div[style*="font-size:24px" i],
[id^="pg-"] div[style*="font-size:28px" i],
[id^="pg-"] div[style*="font-size:30px" i],
[id^="pg-"] div[style*="font-size:36px" i] {
  font-size: var(--ev-text-3xl) !important;  /* min 30px */
  font-weight: 900 !important;
  font-variant-numeric: tabular-nums !important;
  letter-spacing: -0.02em !important;
  line-height: 1.1 !important;
}

/* Si parent est card claire (bg blanc/slate-50), force le NOIR */
[style*="background:#FFFFFF" i] div[style*="font-size:22px" i],
[style*="background:#FFFFFF" i] div[style*="font-size:24px" i],
[style*="background:#FFFFFF" i] div[style*="font-size:28px" i],
[style*="background:#FFFFFF" i] div[style*="font-size:30px" i],
[style*="background:#FFFFFF" i] div[style*="font-size:36px" i],
[style*="background:#fff" i]    div[style*="font-size:22px" i],
[style*="background:#fff" i]    div[style*="font-size:24px" i],
[style*="background:#fff" i]    div[style*="font-size:28px" i],
[style*="background:#fff" i]    div[style*="font-size:30px" i],
[style*="background:#fff" i]    div[style*="font-size:36px" i],
[style*="background:#F8FAFC" i] div[style*="font-size:22px" i],
[style*="background:#F8FAFC" i] div[style*="font-size:24px" i],
[style*="background:#F8FAFC" i] div[style*="font-size:28px" i],
[style*="background:#F8FAFC" i] div[style*="font-size:30px" i],
[style*="background:#F1F5F9" i] div[style*="font-size:24px" i],
[style*="background:#F1F5F9" i] div[style*="font-size:30px" i] {
  color: var(--ev-text-on-light-1) !important;  /* slate-950 / quasi noir */
}

/* Sinon (fond sombre par défaut), force le BLANC pur */
[id^="s-"]:not([style*="background:#FFFFFF" i]):not([style*="background:#fff" i]):not([style*="background:#F8FAFC" i]) div[style*="font-size:22px" i],
[id^="s-"]:not([style*="background:#FFFFFF" i]):not([style*="background:#fff" i]):not([style*="background:#F8FAFC" i]) div[style*="font-size:28px" i],
[id^="s-"]:not([style*="background:#FFFFFF" i]):not([style*="background:#fff" i]):not([style*="background:#F8FAFC" i]) div[style*="font-size:30px" i],
[id^="s-"]:not([style*="background:#FFFFFF" i]):not([style*="background:#fff" i]):not([style*="background:#F8FAFC" i]) div[style*="font-size:36px" i] {
  color: var(--ev-text-on-dark-1) !important;   /* blanc pur */
}


/* ═══════════════════════════════════════════════════════════════════════
   §4. AUDIT LOGS / TABLES SYSTÈME — 16px, padding row généreux
   ─────────────────────────────────────────────────────────── */

#s-audit table, #pg-audit table,
#s-caissectrl table, #pg-caissectrl table,
#s-caisseRpt table, #pg-caisseRpt table,
#s-caisseAlerts table, #pg-caisseAlerts table,
#s-monservice table, #pg-monservice table {
  font-size: var(--ev-text-base) !important;
  width: 100% !important;
}

#s-audit table td, #pg-audit table td,
#s-caissectrl table td, #pg-caissectrl table td,
#s-caisseRpt table td, #pg-caisseRpt table td,
#s-caisseAlerts table td, #pg-caisseAlerts table td,
#s-monservice table td, #pg-monservice table td {
  font-size: var(--ev-text-base) !important;
  padding: var(--ev-row-pad-y) 14px !important;   /* py-4-ish */
  color: var(--ev-text-on-dark-2) !important;
  vertical-align: middle !important;
  border-bottom: 1px solid rgba(51, 65, 85, 0.45) !important;
}

#s-audit table th, #pg-audit table th,
#s-caissectrl table th, #pg-caissectrl table th,
#s-caisseRpt table th, #pg-caisseRpt table th,
#s-caisseAlerts table th, #pg-caisseAlerts table th,
#s-monservice table th, #pg-monservice table th {
  font-size: 14px !important;
  padding: 12px 14px !important;
  background: #1E293B !important;
  color: #F1F5F9 !important;
  font-weight: 900 !important;
  text-transform: uppercase;
  letter-spacing: 0.05em !important;
  border-bottom: 2px solid #475569 !important;
  position: sticky;
  top: 0;
  z-index: 2;
}

/* Catch inline font-size < 14px dans les td audit (cas Date/User pills) */
#s-audit td[style*="font-size:10px" i],
#s-audit td[style*="font-size:11px" i],
#s-audit td[style*="font-size:12px" i],
#s-audit td[style*="font-size:13px" i],
#pg-audit td[style*="font-size:10px" i],
#pg-audit td[style*="font-size:11px" i],
#pg-audit td[style*="font-size:12px" i],
#pg-audit td[style*="font-size:13px" i] {
  font-size: 15px !important;
}

/* Pills / badges dans audit : texte un poil plus gros */
#s-audit td span[style*="border-radius" i],
#s-audit td span[style*="background" i],
#pg-audit td span[style*="border-radius" i] {
  font-size: 13.5px !important;
  font-weight: 700 !important;
  padding: 3px 8px !important;
}

/* Toutes les tables admin (catch-all) → typo 16px aussi */
[id^="s-"] table:not(.t-mini) td,
[id^="pg-"] table:not(.t-mini) td {
  font-size: var(--ev-text-base) !important;
}

/* Zebra striping subtle (par-dessus v290 §8 plus discret) */
[id^="s-"] table:not(.t-mini) tr:nth-child(even) td {
  background: rgba(15, 23, 42, 0.55) !important;
}


/* ═══════════════════════════════════════════════════════════════════════
   §5. KPI CARDS DASHBOARD (Top 4 cards) — fond clair → texte NOIR
   ────────────────────────────────────────────────────────────── */

/* Toute card avec bg blanc/slate-50 dans pages directeur force noir partout */
#s-acc   [style*="background:#FFFFFF" i] *:not(svg):not(path),
#s-acc   [style*="background:#fff" i]    *:not(svg):not(path),
#s-acc   [style*="background:#F8FAFC" i] *:not(svg):not(path),
#s-acc   [style*="background:#F1F5F9" i] *:not(svg):not(path),
#pg-acc  [style*="background:#FFFFFF" i] *:not(svg):not(path),
#pg-acc  [style*="background:#fff" i]    *:not(svg):not(path),
#pg-acc  [style*="background:#F8FAFC" i] *:not(svg):not(path) {
  color: var(--ev-text-on-light-1) !important;
}

/* La card elle-même (avec bg clair) + border + shadow pour intégration */
#s-acc  [style*="background:#FFFFFF" i],
#s-acc  [style*="background:#fff" i],
#s-acc  [style*="background:#F8FAFC" i],
#pg-acc [style*="background:#FFFFFF" i],
#pg-acc [style*="background:#fff" i],
#pg-acc [style*="background:#F8FAFC" i] {
  color: var(--ev-text-on-light-1) !important;
  border: 1px solid #CBD5E1 !important;
  box-shadow: 0 8px 24px -8px rgba(0, 0, 0, 0.45),
              0 2px 6px rgba(15, 23, 42, 0.25) !important;
}

/* Labels secondaires (10-13px) sur card claire → slate-700 lisible */
#s-acc  [style*="background:#FFFFFF" i] [style*="font-size:10px" i],
#s-acc  [style*="background:#FFFFFF" i] [style*="font-size:11px" i],
#s-acc  [style*="background:#FFFFFF" i] [style*="font-size:12px" i],
#s-acc  [style*="background:#FFFFFF" i] [style*="font-size:13px" i],
#s-acc  [style*="background:#fff" i]    [style*="font-size:10px" i],
#s-acc  [style*="background:#fff" i]    [style*="font-size:11px" i],
#s-acc  [style*="background:#fff" i]    [style*="font-size:12px" i],
#s-acc  [style*="background:#fff" i]    [style*="font-size:13px" i],
#s-acc  [style*="background:#F8FAFC" i] [style*="font-size:10px" i],
#s-acc  [style*="background:#F8FAFC" i] [style*="font-size:12px" i] {
  font-size: 14px !important;
  color: var(--ev-text-on-light-3) !important;  /* slate-700 */
  font-weight: 700 !important;
  letter-spacing: 0.03em !important;
  text-transform: uppercase;
}


/* ═══════════════════════════════════════════════════════════════════════
   §6. CLIENTS / OPÉRATEUR LISTS — nom 18px semibold, email 16px slate-200
   ────────────────────────────────────────────────────────────────────── */

/* Tables Clients (#s-mbrs) / Équipe (#s-eqp) / Staff */
#s-mbrs table td, #pg-mbrs table td,
#s-eqp  table td, #pg-eqp  table td,
#pg-staff table td {
  font-size: var(--ev-text-base) !important;
  padding: 12px 14px !important;
  color: var(--ev-text-on-dark-2) !important;
  vertical-align: middle !important;
}

/* Première colonne (souvent le nom) → 18px semibold blanc */
#s-mbrs table td:first-child,
#s-eqp  table td:first-child,
#s-mbrs table td:nth-child(2),     /* parfois avatar puis nom */
#s-eqp  table td:nth-child(2),
#pg-mbrs table td:first-child,
#pg-eqp  table td:first-child,
#pg-staff table td:first-child {
  font-size: var(--ev-text-lg) !important;   /* 18px */
  font-weight: 700 !important;
  color: var(--ev-text-on-dark-1) !important;
}

/* Email / phone / secondary info → font 16px slate-100 */
#s-mbrs table td a[href^="mailto" i],
#s-mbrs table td a[href^="tel" i],
#s-eqp  table td a[href^="mailto" i],
#pg-mbrs table td a[href^="mailto" i] {
  font-size: var(--ev-text-base) !important;
  color: #F1F5F9 !important;
  text-decoration: none !important;
  border-bottom: 1px dashed rgba(241, 245, 249, 0.35) !important;
}

/* Badges rôles (Manager/Director/Operator) — pill plus lisible */
#s-eqp [style*="border-radius" i][style*="background" i],
#pg-staff [style*="border-radius" i][style*="background" i] {
  font-size: 13px !important;
  font-weight: 800 !important;
  padding: 4px 10px !important;
  letter-spacing: 0.04em !important;
  text-transform: uppercase;
}


/* ═══════════════════════════════════════════════════════════════════════
   §7. CHARTS — axes / data labels — souvent invisibles (noir sur noir)
   ──────────────────────────────────────────────────────────────────── */

/* Tous textes SVG dans pages directeur → blanc pur par défaut */
[id^="s-"] svg text,
[id^="pg-"] svg text {
  fill: var(--ev-text-on-dark-1) !important;
  font-size: 13px !important;
  font-weight: 700 !important;
}

/* Axis lines / gridlines → slate-600 (visible mais discret) */
[id^="s-"] svg line[stroke="#000" i],
[id^="s-"] svg line[stroke="#0F172A" i],
[id^="s-"] svg line[stroke="#1F2937" i],
[id^="s-"] svg path[stroke="#000" i],
[id^="s-"] svg path[stroke="#0F172A" i] {
  stroke: #475569 !important;
}

/* Bar chart CSS (cf. fbGetDashboardTrends) : axes & labels en blanc */
#s-acc div[style*="font-size:9px" i],
#s-acc div[style*="font-size:10px" i]:not([style*="background" i]) {
  color: var(--ev-text-on-dark-2) !important;
  font-size: 12px !important;
  font-weight: 700 !important;
}


/* ═══════════════════════════════════════════════════════════════════════
   §8. BUTTONS dans pages directeur — typo 15-16px lisible
   ──────────────────────────────────────────────────────── */

[id^="s-"] button,
[id^="pg-"] button,
[id^="s-"] .ib,
[id^="pg-"] .ib {
  font-size: 15px !important;
  font-weight: 700 !important;
  letter-spacing: 0.01em !important;
}

[id^="s-"] button.btn-primary,
[id^="s-"] button[style*="background:#06B6D4" i],
[id^="s-"] button[style*="background:#0E7490" i],
[id^="s-"] button[style*="background:#1F4E4A" i] {
  font-size: var(--ev-text-base) !important;
  font-weight: 800 !important;
}


/* ═══════════════════════════════════════════════════════════════════════
   §9. MESSAGE BUBBLES (page Messages) — bg clair → texte sombre
   ──────────────────────────────────────────────────────────── */

#s-msg [style*="background:#FFFFFF" i],
#s-msg [style*="background:#fff" i],
#s-msg [style*="background:#F8FAFC" i],
#s-msg [style*="background:#F1F5F9" i],
#s-msg [style*="background:#E0E7FF" i],
#s-msg [style*="background:#DBEAFE" i],
#s-msg [style*="background:#DCFCE7" i] {
  color: var(--ev-text-on-light-1) !important;
  font-size: var(--ev-text-base) !important;
  border: 1px solid rgba(15, 23, 42, 0.08) !important;
  box-shadow: 0 2px 8px rgba(15, 23, 42, 0.25) !important;
}
#s-msg [style*="background:#FFFFFF" i] *,
#s-msg [style*="background:#fff" i]    *,
#s-msg [style*="background:#F8FAFC" i] *,
#s-msg [style*="background:#F1F5F9" i] * {
  color: var(--ev-text-on-light-1) !important;
}


/* ═══════════════════════════════════════════════════════════════════════
   §10. RESPONSIVE — tablette/mobile : ne pas écraser, mais garder ≥16px
   ──────────────────────────────────────────────────────────────────── */

@media (max-width: 768px) {
  [id^="s-"], [id^="pg-"] {
    font-size: var(--ev-text-base) !important;
  }
  [id^="s-"] table td, [id^="pg-"] table td {
    font-size: 15px !important;
    padding: 11px 9px !important;
  }
  [id^="s-"] div[style*="font-size:30px" i],
  [id^="s-"] div[style*="font-size:36px" i] {
    font-size: var(--ev-text-2xl) !important;   /* 24px mobile */
  }
}


/* ═══════════════════════════════════════════════════════════════════════
   §11. BACKSTOP — éléments avec inline color < AAA contrast
   ─────────────────────────────────────────────────────────
   Ces couleurs étaient utilisées dans app.js pour des "secondary text"
   mais sur fond sombre elles deviennent invisibles. On les remap.
*/

[id^="s-"]  [style*="color:#6B7280" i],
[id^="pg-"] [style*="color:#6B7280" i],
[id^="s-"]  [style*="color:#9CA3AF" i],
[id^="pg-"] [style*="color:#9CA3AF" i],
[id^="s-"]  [style*="color:#D1D5DB" i],
[id^="pg-"] [style*="color:#D1D5DB" i] {
  color: var(--ev-text-on-dark-3) !important;   /* #CBD5E1 — lisible AAA */
}


/* ═══════════════════════════════════════════════════════════════════════
   §12. SIDEBAR / DRAWER — typo nav 16px (l'opérateur garde sa nav compacte)
   ────────────────────────────────────────────────────────────────────── */

body.role-director #pro-nav .nav-item,
body.role-director #pro-nav a,
body.role-manager  #pro-nav .nav-item,
body.role-manager  #pro-nav a {
  font-size: var(--ev-text-base) !important;
  font-weight: 700 !important;
  padding: 11px 14px !important;
}

/* ═══════════════════════════════════════════════════════════════════════
   §KPI. Cartes Tableau de bord — fond BLANC, texte NOIR PUR
   ───────────────────────────────────────────────────────────────────────
   Les .tbd-card sont délibérément blanches (#FFFFFF) au-dessus du thème
   sombre global, pour contraster comme des "tuiles KPI premium". Mais
   plusieurs surcouches v283/v290/v290c forcent .tbd-card-label,
   .tbd-card-suffix et .tbd-trend-sub à #CBD5E1 (slate-300) — pensé pour
   fond sombre, et donc INVISIBLE sur fond blanc.

   Cette section bat ces règles avec une spécificité supérieure
   (.tbd-card .X au lieu de .X seul) pour rester valide partout où les
   cartes apparaissent (dashboard directeur + autres pages).
   Texte = slate-950 (#020617) ≈ noir pur, font-weight 800 minimum. */

.tbd-card .tbd-card-label,
.tbd-trends .tbd-card-label,
body:has(#p-app.on) #p-app .tbd-card .tbd-card-label {
  color: #020617 !important;
  font-weight: 800 !important;
  font-size: 12px !important;
}

.tbd-card .tbd-card-suffix,
.tbd-trends .tbd-card-suffix,
body:has(#p-app.on) #p-app .tbd-card .tbd-card-suffix {
  color: #020617 !important;
  font-weight: 800 !important;
}

.tbd-card .tbd-card-value,
.tbd-trends .tbd-card-value,
body:has(#p-app.on) #p-app .tbd-card .tbd-card-value {
  color: #020617 !important;
  font-weight: 900 !important;
}

.tbd-card .tbd-trend-sub,
.tbd-trends .tbd-trend-sub,
body:has(#p-app.on) #p-app .tbd-card .tbd-trend-sub {
  color: #020617 !important;
  font-weight: 800 !important;
  font-size: 12px !important;
  margin-top: 4px !important;
}

/* Trio "CA Brut / Dépenses / Bénéfice Net" injecté inline par app.js trio() —
   on a déjà retiré var(--tx2) dans le HTML inline ; ce bloc fait office de
   garde-fou si une autre surcouche venait à repeindre les span enfants. */
.tbd-card > div > span,
.tbd-card > div > b {
  /* Pas de color forcée ici — laisse l'inline style décider (rouge pour
     Dépenses, vert pour Bénéfice Net), on ne casse pas la sémantique. */
}

/* Fin du fichier — ev-director-readability-pro-v302.css */

/* =============== /css/ev-auth-column-v303.css?v=303-darkfinal-20260831wide =============== */
/* ═══════════════════════════════════════════════════════════════════════════
   ev-auth-column-v303.css  —  2026-05-25
   ───────────────────────────────────────────────────────────────────────────
   Demande Directeur : la page d'authentification (#p-auth) doit s'afficher
   en COLONNE UNIQUE CENTRÉE — identique mobile & desktop. Le split-screen
   v300 (hero à gauche, formulaire sticky à droite) éparpille les éléments
   sur grand écran. On simplifie pour revenir à la lecture verticale stricte.

   ORDRE FINAL ATTENDU (de haut en bas, dans le bloc central) :
     1. Hero        — 🎮 icône + "EspaceVirtuel PRO" + sous-titre
     2. Encadré SOMBRE  — "Programme de Fidélité EspaceVirtuel" (legacy)
     3. Encadré CLAIR   — "Programme de Parrainage !" (legacy)
     4. Tabs        — [Se connecter] [S'inscrire]
     5. Formulaire  — Identifiant / Mot de passe / bouton Se connecter

   On NEUTRALISE :
     • la grille @media (min-width:1024px) du v300
     • le sticky top:88px du formulaire
     • les sections v300 injectées en JS qui surchargent la page
       (.ev-features, .ev-trio, .ev-reassur, .ev-howitworks,
        .ev-testimonials, .ev-partners)

   On RESTAURE :
     • le contenu legacy de #ev-promo-card (caché par v300)
     • le bloc #ev-parrainage-card

   On RECOLORE :
     • #ev-promo-card → fond sombre + texte clair (was: #FFFFFF/#0F172A)
     • #ev-parrainage-card → conserve fond clair, force texte slate-900 pour
       contraste demandé
   ═══════════════════════════════════════════════════════════════════════════ */


/* ─── 1. CONTENEUR PARENT — page entière, fond sombre, contenu centré ─── */
body:has(#p-auth.on) #p-auth {
  display: flex !important;
  flex-direction: column !important;
  align-items: center !important;
  justify-content: flex-start !important;
  padding: 88px 16px 64px !important;
  width: 100% !important;
  box-sizing: border-box !important;
}

/* ─── 2. BLOC CENTRAL UNIQUE — colonne avec max-width strict ─────────── */
/* On bat la règle .aw { max-width:1280px } du v300 + on supprime la grille. */
body:has(#p-auth.on) #p-auth .aw {
  display: flex !important;
  flex-direction: column !important;
  gap: 24px !important;
  width: 100% !important;
  max-width: 448px !important;   /* ≈ Tailwind max-w-md */
  margin: 0 auto !important;
  grid-template-columns: none !important; /* casse la grille v300 */
  align-items: stretch !important;
}
@media (min-width: 768px) {
  body:has(#p-auth.on) #p-auth .aw {
    max-width: 512px !important;  /* ≈ Tailwind max-w-lg sur desktop */
  }
}

/* ─── 3. KILL SPLIT-SCREEN DESKTOP v300 ─────────────────────────────────
   Le v300 plaçait `.atabs`, `#form-login`, `#form-signup` en grid-column:2
   avec position:sticky. On force tout en colonne 1, statique. */
@media (min-width: 1024px) {
  body:has(#p-auth.on) #p-auth .aw {
    display: flex !important;
    max-width: 680px !important;
    grid-template-columns: none !important;
    gap: 24px !important;
  }
  body:has(#p-auth.on) #p-auth .ahero,
  body:has(#p-auth.on) #p-auth #ev-promo-card,
  body:has(#p-auth.on) #p-auth .atabs,
  body:has(#p-auth.on) #p-auth #form-login,
  body:has(#p-auth.on) #p-auth #form-signup,
  body:has(#p-auth.on) #p-auth > .aw > div:last-child {
    grid-column: auto !important;
    position: static !important;
    top: auto !important;
  }
}

/* ─── 4. HIDE — sections v300 NON demandées par le Directeur ────────── */
body:has(#p-auth.on) .ev-features,
body:has(#p-auth.on) .ev-trio,
body:has(#p-auth.on) .ev-reassur,
body:has(#p-auth.on) .ev-howitworks,
body:has(#p-auth.on) .ev-testimonials,
body:has(#p-auth.on) .ev-partners,
body:has(#p-auth.on) #p-auth .ev-features,
body:has(#p-auth.on) #p-auth .ev-trio,
body:has(#p-auth.on) #p-auth .ev-reassur,
body:has(#p-auth.on) #p-auth .ev-howitworks,
body:has(#p-auth.on) #p-auth .ev-testimonials,
body:has(#p-auth.on) #p-auth .ev-partners {
  display: none !important;
}

/* ─── 5. RESHOW — contenu legacy de #ev-promo-card et #ev-parrainage-card
   v300 §5 avait caché ces blocs (`display:none !important`) pour les
   remplacer par le trio. On annule ici.
   ⚠️ v300 JS renomme l'ID de #ev-promo-card → #programme après boot
   (ev-homepage-v300.js l.180). On dual-cible les deux IDs partout. */
body:has(#p-auth.on) #p-auth #ev-promo-card > div.tw-flex,
body:has(#p-auth.on) #p-auth #ev-promo-card > div.tw-flex + div,
body:has(#p-auth.on) #p-auth #ev-promo-card > #ev-parrainage-card,
body:has(#p-auth.on) #p-auth #programme > div.tw-flex,
body:has(#p-auth.on) #p-auth #programme > div.tw-flex + div,
body:has(#p-auth.on) #p-auth #programme > #ev-parrainage-card {
  display: flex !important;
}
body:has(#p-auth.on) #p-auth #ev-promo-card > hr,
body:has(#p-auth.on) #p-auth #programme > hr {
  display: block !important;
}

/* ─── 6. ENCADRÉ SOMBRE — #ev-promo-card / #programme (Programme de Fidélité)
   v300 le neutralisait en background:transparent. Inline = bg blanc.
   Le Directeur veut un fond SOMBRE avec texte clair. */
body:has(#p-auth.on) #p-auth #ev-promo-card,
body:has(#p-auth.on) #p-auth #programme {
  background: #131C2E !important;
  border: 1px solid rgba(34,211,238,.18) !important;
  border-radius: 16px !important;
  padding: 20px !important;
  color: #F1F5F9 !important;
  margin: 0 !important;
  width: 100% !important;
  text-align: left !important;
}
/* Titre "🎮 Programme de Fidélité EspaceVirtuel" — était teal foncé sur blanc */
body:has(#p-auth.on) #p-auth #ev-promo-card > div[style*="font-weight:800"],
body:has(#p-auth.on) #p-auth #programme > div[style*="font-weight:800"] {
  color: #5EEAD4 !important;          /* teal clair sur fond sombre */
  background: transparent !important;
  text-align: center !important;
  font-size: 16px !important;
  margin-bottom: 14px !important;
}
/* Boîte interne (coffre + offre) — était fond gris pâle slate-50 */
body:has(#p-auth.on) #p-auth #ev-promo-card .tw-bg-slate-50,
body:has(#p-auth.on) #p-auth #programme .tw-bg-slate-50 {
  background: rgba(255,255,255,.04) !important;
  border: 1px solid rgba(255,255,255,.06) !important;
}
/* Tous les textes inline qui étaient slate-* foncés sur blanc → clair sur sombre */
body:has(#p-auth.on) #p-auth #ev-promo-card [style*="color:#475569"],
body:has(#p-auth.on) #p-auth #ev-promo-card [style*="color:#334155"],
body:has(#p-auth.on) #p-auth #programme [style*="color:#475569"],
body:has(#p-auth.on) #p-auth #programme [style*="color:#334155"] {
  color: #CBD5E1 !important;
}
body:has(#p-auth.on) #p-auth #ev-promo-card [style*="color:#0F172A"],
body:has(#p-auth.on) #p-auth #programme [style*="color:#0F172A"] {
  color: #F8FAFC !important;
}
/* "+2 DH" et "10 DH" en vert — on garde le vert mais on l'éclaircit */
body:has(#p-auth.on) #p-auth #ev-promo-card [style*="color:#047857"],
body:has(#p-auth.on) #p-auth #programme [style*="color:#047857"] {
  color: #34D399 !important;
}
/* Ligne hr de séparation interne — était slate-200 */
body:has(#p-auth.on) #p-auth #ev-promo-card > hr,
body:has(#p-auth.on) #p-auth #programme > hr {
  border-top: 1px solid rgba(255,255,255,.08) !important;
}

/* ─── 7. ENCADRÉ CLAIR — #ev-parrainage-card (Programme de Parrainage) ─
   Reste sur fond lavande clair (#FAF5FF) ; texte forcé slate-900 pour
   contraste demandé. */
body:has(#p-auth.on) #p-auth #ev-parrainage-card {
  background: #FAF5FF !important;
  border: 1px solid #A855F7 !important;
  border-radius: 12px !important;
  padding: 14px !important;
  align-items: flex-start !important;
  gap: 12px !important;
  margin-top: 16px !important;
}
body:has(#p-auth.on) #p-auth #ev-parrainage-card h4 {
  color: #6D28D9 !important;
  font-size: 14px !important;
  font-weight: 800 !important;
  margin: 0 !important;
}
body:has(#p-auth.on) #p-auth #ev-parrainage-card p {
  color: #0F172A !important;        /* ≈ text-slate-900 demandé */
  font-size: 13px !important;
  font-weight: 500 !important;
  margin: 4px 0 0 !important;
  line-height: 1.55 !important;
}
body:has(#p-auth.on) #p-auth #ev-parrainage-card p span[style*="color:#0F766E"] {
  color: #0F766E !important;        /* "4 DH" reste teal */
  font-weight: 800 !important;
}

/* ─── 8. HERO — centré (v300 le mettait text-align:left pour le split) ─ */
body:has(#p-auth.on) #p-auth .ahero {
  text-align: center !important;
  margin-bottom: 8px !important;
}
body:has(#p-auth.on) #p-auth .ahero .hi {
  display: inline-flex !important;
  margin: 0 auto 16px !important;
}
body:has(#p-auth.on) #p-auth .ahero h1 {
  text-align: center !important;
  margin: 0 0 10px !important;
}
body:has(#p-auth.on) #p-auth .ahero p {
  text-align: center !important;
  margin: 0 auto !important;
  max-width: 100% !important;
}

/* ─── 9. TABS — pleine largeur du bloc, alignés en ligne ────────────── */
body:has(#p-auth.on) #p-auth .atabs {
  width: 100% !important;
  display: flex !important;
  margin: 0 !important;
}

/* ─── 10. FORMS — pleine largeur du bloc ────────────────────────────── */
body:has(#p-auth.on) #p-auth #form-login,
body:has(#p-auth.on) #p-auth #form-signup {
  width: 100% !important;
  margin: 0 !important;
}

/* Fin du fichier — ev-auth-column-v303.css */

/* =============== /css/ev-unified-dark-v304.css?v=304-darkfinal-20260525-1740 =============== */
/* ═══════════════════════════════════════════════════════════════════════════
   ev-unified-dark-v304.css  —  2026-05-25
   ───────────────────────────────────────────────────────────────────────────
   DIRECTIVE FINALE DIRECTEUR : 100% DARK UNIFIÉ — PLUS AUCUN FOND BLANC
   ───────────────────────────────────────────────────────────────────────────
   Cette surcouche élimine définitivement la dualité clair/sombre :
     • Tous les fonds blancs (#FFF, #FFFFFF) inline ou en classe → fond sombre.
     • Tout le texte sur fond sombre → blanc pur ou slate-300 (libellés).
     • Les couleurs ne servent QUE pour fonctionnel (badges, états, boutons).

   STRATÉGIE
   ─────────
   • Catch-alls sur attribute selectors [style*="background:#FFFFFF"] etc.
     pour neutraliser les ~230 fonds blancs inline du legacy.
   • Surcharge des classes Tailwind tw-bg-white, tw-bg-slate-50,
     tw-text-slate-* foncés, etc.
   • Sélecteurs ciblés sur composants nommés (KPI, fin service, parrainage)
     pour battre les overlays précédents (v283 white KPI, v303 light
     parrainage). v304 charge en DERNIER → gagne la cascade.

   PALETTE DARK UNIFIÉE
   ────────────────────
     Surface primaire   : #0A0E17  (fond page)
     Surface élevée 1   : #131C2E  (cards, encarts)
     Surface élevée 2   : #1E293B  (interactifs, hovers)
     Bordure neutre     : rgba(255,255,255,.08)
     Bordure accent     : rgba(34,211,238,.25)  cyan néon

     Texte principal    : #FFFFFF  (blanc pur, headings, montants, valeurs)
     Texte secondaire   : #CBD5E1  (slate-300, libellés, descriptions)
     Texte tertiaire    : #94A3B8  (slate-400, méta, timestamps)

     Accent succès      : #10F0A1 / #34D399  (vert vif)
     Accent danger      : #F87171              (rouge clair)
     Accent warning     : #FBBF24              (ambre)
     Accent info        : #22D3EE              (cyan)
     Accent violet      : #C084FC
   ═══════════════════════════════════════════════════════════════════════════ */


/* ═══════════════════════════════════════════════════════════════════════
   §1. CATCH-ALL — FONDS BLANCS INLINE → SOMBRE
   ───────────────────────────────────────────────────────────────────────
   Cible les 230+ occurrences d'inline style="background:#FFFFFF" ou
   variantes. On utilise [style*="..." i] case-insensitive. */

[style*="background:#fff" i],
[style*="background:#FFF" i],
[style*="background:#ffffff" i],
[style*="background:#FFFFFF" i],
[style*="background-color:#fff" i],
[style*="background-color:#ffffff" i],
[style*="background: #fff" i],
[style*="background: #ffffff" i],
[style*="background:white" i],
[style*="background: white" i] {
  background: #131C2E !important;
  color: #F1F5F9 !important;
  border-color: rgba(255,255,255,.08) !important;
}

/* Classes Tailwind blanches souvent utilisées */
.tw-bg-white,
.tw-bg-slate-50,
.tw-bg-gray-50,
.tw-bg-gray-100,
.tw-bg-slate-100,
.bg-white {
  background: #131C2E !important;
  color: #F1F5F9 !important;
}


/* ═══════════════════════════════════════════════════════════════════════
   §2. CATCH-ALL — TEXTES SOMBRES SUR FOND SOMBRE → CLAIR
   ───────────────────────────────────────────────────────────────────────
   Tous les color:#0F172A (slate-900), #1F2937 (gray-800), #020617
   (slate-950), #1E293B (slate-800) en inline → blanc pur. */

[style*="color:#0F172A" i],
[style*="color:#0f172a" i],
[style*="color:#020617" i],
[style*="color:#1F2937" i],
[style*="color:#1f2937" i],
[style*="color:#1E293B" i],
[style*="color:#1e293b" i],
[style*="color:#111827" i],
[style*="color:#0B1220" i],
[style*="color:#0b1220" i],
[style*="color:#000000" i],
[style*="color:#000" i],
[style*="color:black" i] {
  color: #FFFFFF !important;
}

/* Gris foncés (slate-600/700) → slate-300 pour rester lisible */
[style*="color:#334155" i],
[style*="color:#475569" i],
[style*="color:#3F3F46" i],
[style*="color:#52525B" i] {
  color: #CBD5E1 !important;
}

/* Gris moyens (slate-500) → slate-400 */
[style*="color:#64748B" i],
[style*="color:#64748b" i],
[style*="color:#71717A" i],
[style*="color:#6B7280" i],
[style*="color:#6b7280" i] {
  color: #94A3B8 !important;
}

/* Tailwind text-slate-* foncés */
.tw-text-slate-900,
.tw-text-slate-800,
.tw-text-gray-900,
.tw-text-gray-800,
.tw-text-zinc-900,
.tw-text-black {
  color: #FFFFFF !important;
}
.tw-text-slate-700,
.tw-text-slate-600,
.tw-text-gray-700,
.tw-text-gray-600 {
  color: #CBD5E1 !important;
}
.tw-text-slate-500,
.tw-text-slate-400,
.tw-text-gray-500 {
  color: #94A3B8 !important;
}


/* ═══════════════════════════════════════════════════════════════════════
   §3. CARTES KPI DASHBOARD — .tbd-card (les 4 du haut)
   ───────────────────────────────────────────────────────────────────────
   Annule v283 (qui les forçait à background:#FFFFFF !important) et v302
   (qui forçait textes black). Spécificité maximale avec body:has() +
   #p-app + .tbd-card. */

body:has(#p-app.on) #p-app .tbd-card,
body:has(#p-app.on) #p-app .tbd-chart-wrap,
.tbd-card,
.tbd-chart-wrap {
  background: #131C2E !important;
  border: 1px solid rgba(255,255,255,.08) !important;
  border-left: 4px solid #22D3EE !important;
  box-shadow: 0 4px 14px rgba(0,0,0,.45) !important;
  color: #F1F5F9 !important;
}

body:has(#p-app.on) #p-app .tbd-card-label,
.tbd-card-label {
  color: #CBD5E1 !important;
  font-weight: 700 !important;
  font-size: 12px !important;
}

body:has(#p-app.on) #p-app .tbd-card-value,
.tbd-card-value {
  color: #FFFFFF !important;
  font-weight: 900 !important;
}

body:has(#p-app.on) #p-app .tbd-card-suffix,
.tbd-card-suffix {
  color: #CBD5E1 !important;
  font-weight: 700 !important;
}

body:has(#p-app.on) #p-app .tbd-trend-sub,
.tbd-trend-sub {
  color: #CBD5E1 !important;
  font-weight: 500 !important;
  font-size: 12px !important;
}

/* Bar chart — labels et valeurs en blanc */
body:has(#p-app.on) #p-app .tbd-chart-title,
.tbd-chart-title {
  color: #FFFFFF !important;
  font-weight: 800 !important;
}
body:has(#p-app.on) #p-app .tbd-chart-sub,
.tbd-chart-sub {
  color: #94A3B8 !important;
}
body:has(#p-app.on) #p-app .tbd-chart-label,
.tbd-chart-label {
  color: #FFFFFF !important;
  font-weight: 600 !important;
}
body:has(#p-app.on) #p-app .tbd-chart-bar-val,
.tbd-chart-bar-val {
  color: #FFFFFF !important;
  font-weight: 700 !important;
}

/* Trio CA Brut / Dépenses / Bénéfice Net (rendu inline par app.js trio()) —
   On laisse l'inline app.js gérer (déjà ajusté en clair). Catch-all §2
   protège si une variante slate-foncée traîne. */


/* ═══════════════════════════════════════════════════════════════════════
   §4. BADGES — TROIS VARIANTES VERT / ORANGE / ROUGE
   ───────────────────────────────────────────────────────────────────────
   Conserve la sémantique mais en mode dark : fond translucide néon + bord
   subtil + texte vif. Selon le pattern Tailwind demandé par le Directeur :
   text-emerald-400 bg-emerald-950/50 border border-emerald-500/30. */

.tbd-trend.up,
body:has(#p-app.on) #p-app .tbd-trend.up,
.tw-bg-emerald-950\/50,
.ev-badge-success {
  background: rgba(6,78,59,.50) !important;     /* emerald-950 / 50 */
  border: 1px solid rgba(16,185,129,.30) !important;
  color: #34D399 !important;                    /* emerald-400 */
}
.tbd-trend.dn,
body:has(#p-app.on) #p-app .tbd-trend.dn,
.tw-bg-red-950\/50,
.ev-badge-danger {
  background: rgba(69,10,10,.50) !important;    /* red-950 / 50 */
  border: 1px solid rgba(239,68,68,.30) !important;
  color: #F87171 !important;                    /* red-400 */
}
.tbd-trend.zero,
body:has(#p-app.on) #p-app .tbd-trend.zero,
.ev-badge-warning {
  background: rgba(69,26,3,.50) !important;     /* amber-950 / 50 */
  border: 1px solid rgba(245,158,11,.30) !important;
  color: #FBBF24 !important;                    /* amber-400 */
}


/* ═══════════════════════════════════════════════════════════════════════
   §5. PAGE D'AUTH — Encadré Parrainage repasse en SOMBRE
   ───────────────────────────────────────────────────────────────────────
   Bat v303 qui le voulait clair (#FAF5FF + texte slate-900). Le Directeur
   a tranché : tous les encarts sombres. Texte blanc, accent violet. */

body:has(#p-auth.on) #p-auth #ev-parrainage-card {
  background: #1E1B2E !important;             /* slate-800 violet-ish */
  border: 1px solid #6D28D9 !important;
  border-radius: 12px !important;
}
body:has(#p-auth.on) #p-auth #ev-parrainage-card h4 {
  color: #C084FC !important;                  /* violet-400, lisible sur sombre */
  font-weight: 800 !important;
}
body:has(#p-auth.on) #p-auth #ev-parrainage-card p {
  color: #FFFFFF !important;
  font-weight: 500 !important;
}
body:has(#p-auth.on) #p-auth #ev-parrainage-card p span[style*="color:#0F766E"] {
  color: #34D399 !important;                  /* "4 DH" repasse en vert vif */
  font-weight: 900 !important;
}


/* ═══════════════════════════════════════════════════════════════════════
   §6. TABLEAUX — fond sombre, texte clair, bordures discrètes
   ───────────────────────────────────────────────────────────────────── */

table:not(.no-dark),
.tbl2,
.mbrs-table,
.tbl,
.lst-table {
  background: transparent !important;
  color: #F1F5F9 !important;
}
table:not(.no-dark) thead th,
.tbl2 thead th,
.mbrs-table thead th,
table:not(.no-dark) th {
  background: #1E293B !important;
  color: #FFFFFF !important;
  font-weight: 800 !important;
  border-bottom: 1px solid rgba(255,255,255,.10) !important;
}
table:not(.no-dark) tbody td,
.tbl2 tbody td,
.mbrs-table tbody td,
table:not(.no-dark) td {
  background: transparent !important;
  color: #F1F5F9 !important;
  border-top: 1px solid rgba(255,255,255,.06) !important;
}
table:not(.no-dark) tbody tr:hover td,
.tbl2 tbody tr:hover td {
  background: rgba(255,255,255,.03) !important;
}


/* ═══════════════════════════════════════════════════════════════════════
   §7. CARDS GÉNÉRIQUES — .cd, .acard, .ev-card, .bi-card, .kpi-card
   ───────────────────────────────────────────────────────────────────── */

.cd, .acard, .ev-card, .bi-card, .kpi-card, .stat-card, .mbrs-card {
  background: #131C2E !important;
  border: 1px solid rgba(255,255,255,.08) !important;
  color: #F1F5F9 !important;
}
.cd-h, .ev-card-h, .bi-card-h, .kpi-card-h, .acard-h, .tbd-card-h {
  color: #FFFFFF !important;
  font-weight: 800 !important;
}


/* ═══════════════════════════════════════════════════════════════════════
   §8. FIN DE SERVICE — m-fs / pg-fin / blocs Fin Service
   ───────────────────────────────────────────────────────────────────── */

#m-fs, #pg-fin, .fs-card, .fs-bar, .fs-seg, .fs-block {
  background: #131C2E !important;
  color: #F1F5F9 !important;
  border-color: rgba(255,255,255,.08) !important;
}
#m-fs .fs-ttl, #m-fs .fs-lbl, #pg-fin .fs-ttl {
  color: #FFFFFF !important;
  font-weight: 800 !important;
}
.fs-seg b {
  color: #FFFFFF !important;
  font-weight: 900 !important;
}


/* ═══════════════════════════════════════════════════════════════════════
   §9. PROTECTION FINALE — body & html toujours sombres
   ───────────────────────────────────────────────────────────────────── */

html, body {
  background: #0A0E17 !important;
  color: #F1F5F9 !important;
}

/* Override inline body style si quelqu'un essaie de re-imposer du clair */
body[style*="background:#fff" i],
body[style*="background:#FFFFFF" i],
body[style*="background-color:#fff" i] {
  background: #0A0E17 !important;
}

/* ═══════════════════════════════════════════════════════════════════════
   §10. HEADER CTA — TOGGLE LOGIN ↔ LOGOUT selon état d'auth
   ───────────────────────────────────────────────────────────────────────
   Le bouton "Se connecter" du header v300 (.ev-header__cta) restait
   affiché même quand l'utilisateur était dans l'app (#p-app.on).
   2 boutons sont désormais injectés (cf. ev-homepage-v300.js l.93-94 +
   drawer l.106-107) :
     • .ev-header__cta--login     "Se connecter"  (link)
     • .ev-header__cta--logout    "Déconnexion"   (button)
   CSS toggle : un seul visible à la fois selon body:has(#p-app.on).
   ─────────────────────────────────────────────────────────────────────── */

/* Par défaut (page d'accueil / login) : Login visible, Logout caché */
.ev-header__cta--logout,
.ev-drawer__cta--logout {
  display: none;
}

/* Quand l'utilisateur est dans l'app (#p-app.on OR body.in-app) :
   on inverse — Login disparaît, Logout apparaît.
   body.in-app est la classe redondante posée par app.js l.5734 — fallback
   pour les navigateurs sans :has() (Safari < 15.4, Firefox < 121). */
body:has(#p-app.on) .ev-header__cta--login,
body:has(#p-app.on) .ev-drawer__cta--login,
body.in-app .ev-header__cta--login,
body.in-app .ev-drawer__cta--login {
  display: none !important;
}
/* Desktop (≥900px) : header logout visible ; mobile : caché (le drawer le porte) */
@media (min-width: 900px) {
  body:has(#p-app.on) .ev-header__cta--logout,
  body.in-app .ev-header__cta--logout {
    display: inline-flex !important;
  }
}
body:has(#p-app.on) .ev-drawer__cta--logout,
body.in-app .ev-drawer__cta--logout {
  display: block !important;
}

/* Styling rouge unifié — pattern badge danger v304 §4 (Tailwind original :
   bg-red-950/40 text-red-400 border-red-500/30) */
.ev-header__cta--logout {
  align-items: center;
  gap: 8px;
  padding: 8px 16px;
  border-radius: 8px;
  font-size: 14px;
  font-weight: 800;
  letter-spacing: .01em;
  cursor: pointer;
  font-family: inherit;
  background: rgba(69,10,10,.40) !important;   /* red-950 / 40 */
  color: #F87171 !important;                    /* red-400 */
  border: 1px solid rgba(239,68,68,.30) !important;
  transition: background .15s ease-out, transform .12s ease-out, box-shadow .15s ease-out;
}
.ev-header__cta--logout:hover {
  background: rgba(127,29,29,.55) !important;   /* red-900 / 55 */
  border-color: rgba(239,68,68,.50) !important;
  box-shadow: 0 0 0 3px rgba(239,68,68,.10);
}
.ev-header__cta--logout:active {
  transform: scale(.97);
}
.ev-header__cta--logout:focus-visible {
  outline: 2px solid #F87171;
  outline-offset: 2px;
}

/* Drawer mobile : version pleine largeur */
.ev-drawer__cta--logout {
  width: 100%;
  margin-top: 12px;
  padding: 12px 16px;
  border-radius: 10px;
  font-size: 15px;
  font-weight: 800;
  text-align: center;
  cursor: pointer;
  font-family: inherit;
  background: rgba(69,10,10,.40) !important;
  color: #F87171 !important;
  border: 1px solid rgba(239,68,68,.30) !important;
}
.ev-drawer__cta--logout:hover {
  background: rgba(127,29,29,.55) !important;
}

/* Sur grand écran, le burger doit aussi disparaître si on est dans l'app —
   le menu mobile n'a pas de sens hors home publique. */
@media (min-width: 900px) {
  body:has(#p-app.on) .ev-burger,
  body.in-app .ev-burger {
    display: none !important;
  }
}

/* ═══════════════════════════════════════════════════════════════════════
   §11. NEUTRALISATION DU BOOT SCREEN v300
   ───────────────────────────────────────────────────────────────────────
   `.ev-boot` (z-index 99999, position:fixed, plein écran, pointer-events
   par défaut activés) bloquait la page chez certains utilisateurs quand
   son `dismiss()` ne tirait pas. La fonction `initBootScreen()` a été
   commentée dans ev-homepage-v300.js, ce CSS est un filet de sécurité
   pour neutraliser toute occurrence résiduelle (cache stale, autre script
   qui l'aurait recréée, etc.). */

.ev-boot,
#ev-boot {
  display: none !important;
  pointer-events: none !important;
  visibility: hidden !important;
  opacity: 0 !important;
  z-index: -1 !important;
}

/* ═══════════════════════════════════════════════════════════════════════
   §12. ONGLETS ACCUEIL DIRECTEUR — .acc-tabs / .acc-tab
   ───────────────────────────────────────────────────────────────────────
   Le bandeau d'onglets "Vue générale" / "Équipe & Shifts" / "Sécurité"
   avait un fond blanc `#FFFFFF` + bord `#CBD5E1` (index.html l.3828).
   Directeur veut ce bandeau sombre, onglet actif clairement contrasté. */

.acc-tabs {
  background: #0F172A !important;           /* slate-900 */
  border: 1px solid #1E293B !important;     /* slate-800 */
  box-shadow: 0 4px 12px rgba(0,0,0,.30) !important;
}
.acc-tab {
  color: #CBD5E1 !important;                /* slate-300 — libellé inactif */
  background: transparent !important;
  font-weight: 700 !important;
}
.acc-tab:hover {
  background: rgba(255,255,255,.04) !important;
  color: #FFFFFF !important;
}
.acc-tab.on {
  background: #1E293B !important;           /* slate-800 */
  color: #FFFFFF !important;
  font-weight: 800 !important;
  border: 1px solid #334155 !important;     /* slate-700 */
  box-shadow: 0 4px 12px rgba(0,0,0,.45),
              inset 0 1px 0 rgba(255,255,255,.06) !important;
}
.acc-tab .acc-tab-badge {
  background: #DC2626 !important;
  color: #FFFFFF !important;
}
.acc-tab.on .acc-tab-badge {
  background: #FFFFFF !important;
  color: #DC2626 !important;
}

/* Pareil pour les autres patterns d'onglets (.tabs/.tab, .atabs/.atab,
   .tab2/.t2 etc.) — uniformiser le rendu dark. */
.tabs,
.atabs {
  background: #0F172A !important;
  border: 1px solid #1E293B !important;
}
.tab,
.atab {
  color: #CBD5E1 !important;
  background: transparent !important;
  font-weight: 700 !important;
}
.tab:hover,
.atab:hover {
  background: rgba(255,255,255,.04) !important;
  color: #FFFFFF !important;
}
.tab.on,
.atab.on {
  background: #1E293B !important;
  color: #FFFFFF !important;
  font-weight: 800 !important;
  border: 1px solid #334155 !important;
}


/* ═══════════════════════════════════════════════════════════════════════
   §13. BARRES DE PROGRESSION / STATS PUNCHY — .bi-bar-* + génériques
   ───────────────────────────────────────────────────────────────────────
   Fonds sombres + barres saturées (emerald / amber / indigo / cyan).
   Valeurs et labels en blanc pur. */

.bi-bar-row {
  background: transparent !important;
}
.bi-bar-name {
  color: #FFFFFF !important;
  font-weight: 800 !important;
}
.bi-bar-track {
  background: #1E293B !important;           /* slate-800 = rail */
  border-radius: 999px !important;
  overflow: hidden !important;
}
.bi-bar-fill {
  /* Override le linear-gradient cyan→violet de v283 par défaut emerald */
  background: linear-gradient(90deg, #10B981 0%, #059669 100%) !important;
  box-shadow: 0 0 12px rgba(16,185,129,.40) !important;
  border-radius: 999px !important;
}
.bi-bar-fill.ca,
.bi-bar-fill.benef,
.bi-bar-fill.success {
  background: linear-gradient(90deg, #10B981 0%, #059669 100%) !important; /* emerald */
  box-shadow: 0 0 12px rgba(16,185,129,.40) !important;
}
.bi-bar-fill.vol,
.bi-bar-fill.info {
  background: linear-gradient(90deg, #6366F1 0%, #4F46E5 100%) !important; /* indigo */
  box-shadow: 0 0 12px rgba(99,102,241,.40) !important;
}
.bi-bar-fill.warning,
.bi-bar-fill.amber {
  background: linear-gradient(90deg, #F59E0B 0%, #D97706 100%) !important; /* amber */
  box-shadow: 0 0 12px rgba(245,158,11,.40) !important;
}
.bi-bar-fill.danger,
.bi-bar-fill.red {
  background: linear-gradient(90deg, #EF4444 0%, #DC2626 100%) !important; /* red */
  box-shadow: 0 0 12px rgba(239,68,68,.40) !important;
}
.bi-bar-val {
  color: #FFFFFF !important;
  font-weight: 900 !important;
  font-variant-numeric: tabular-nums !important;
}
.bi-bar-val.ca   { color: #34D399 !important; }   /* emerald-400 */
.bi-bar-val.vol  { color: #818CF8 !important; }   /* indigo-400 */


/* ═══════════════════════════════════════════════════════════════════════
   §14. TABLES — zébrage strict slate-900 / slate-800-rgba + headers strong
   ─────────────────────────────────────────────────────────────────────── */

table:not(.no-dark),
.tbl2,
.mbrs-table,
.tbl,
.lst-table {
  background: transparent !important;
  color: #F1F5F9 !important;
  border-collapse: separate !important;
  border-spacing: 0 !important;
}
table:not(.no-dark) thead th,
.tbl2 thead th,
.mbrs-table thead th,
table:not(.no-dark) th,
.tbl2 th {
  background: #1E293B !important;           /* slate-800 */
  color: #FFFFFF !important;
  font-weight: 800 !important;
  text-transform: uppercase !important;
  letter-spacing: .05em !important;
  font-size: 12px !important;
  padding: 12px 14px !important;
  border-bottom: 2px solid #334155 !important;
}
/* Zébrage : ligne impaire slate-900, ligne paire slate-800 transparent */
table:not(.no-dark) tbody tr:nth-child(odd) td,
.tbl2 tbody tr:nth-child(odd) td,
.mbrs-table tbody tr:nth-child(odd) td {
  background: #0F172A !important;           /* slate-900 */
  color: #F1F5F9 !important;
}
table:not(.no-dark) tbody tr:nth-child(even) td,
.tbl2 tbody tr:nth-child(even) td,
.mbrs-table tbody tr:nth-child(even) td {
  background: rgba(30,41,59,.50) !important; /* slate-800 / 50 */
  color: #F1F5F9 !important;
}
table:not(.no-dark) tbody td,
.tbl2 tbody td,
.mbrs-table tbody td {
  padding: 11px 14px !important;
  border-top: 1px solid rgba(255,255,255,.04) !important;
}
/* Hover ligne entière */
table:not(.no-dark) tbody tr:hover td,
.tbl2 tbody tr:hover td,
.mbrs-table tbody tr:hover td {
  background: rgba(51,65,85,.60) !important; /* slate-700 / 60 */
}
/* `<b>` ou `<strong>` dans une cellule = chiffre clé → blanc pur */
table:not(.no-dark) tbody td b,
table:not(.no-dark) tbody td strong,
.tbl2 tbody td b,
.mbrs-table tbody td b {
  color: #FFFFFF !important;
  font-weight: 900 !important;
}


/* ═══════════════════════════════════════════════════════════════════════
   §15. INPUTS — recherche & formulaires DARK STRICT
   ───────────────────────────────────────────────────────────────────────
   Force fond slate-800, texte blanc, placeholder slate-400, bord slate-700.
   Pattern Tailwind original demandé : bg-slate-800 text-white
   placeholder-slate-400 border-slate-700. */

input[type="text"],
input[type="email"],
input[type="password"],
input[type="number"],
input[type="tel"],
input[type="search"],
input[type="date"],
input[type="time"],
input[type="url"],
select,
textarea,
.fi,
.fta,
.mbrs-search {
  background: #1E293B !important;           /* slate-800 */
  color: #FFFFFF !important;
  border: 1px solid #334155 !important;     /* slate-700 */
  font-weight: 600 !important;
}
input::placeholder,
textarea::placeholder,
.fi::placeholder,
.fta::placeholder,
.mbrs-search::placeholder {
  color: #94A3B8 !important;                /* slate-400 */
  font-weight: 500 !important;
  opacity: 1 !important;
}
input:focus,
select:focus,
textarea:focus,
.fi:focus,
.fta:focus,
.mbrs-search:focus {
  background: #1E293B !important;
  color: #FFFFFF !important;
  border-color: #22D3EE !important;         /* cyan-400 focus ring */
  outline: none !important;
  box-shadow: 0 0 0 3px rgba(34,211,238,.20) !important;
}
/* Autofill (Chrome blue / yellow) → on force dark */
input:-webkit-autofill,
input:-webkit-autofill:hover,
input:-webkit-autofill:focus {
  -webkit-text-fill-color: #FFFFFF !important;
  -webkit-box-shadow: 0 0 0 1000px #1E293B inset !important;
  caret-color: #FFFFFF !important;
  transition: background-color 5000s ease-in-out 0s;
}


/* ═══════════════════════════════════════════════════════════════════════
   §16. RACINE — fond global slate-950
   ─────────────────────────────────────────────────────────────────────── */

html, body, #app, #root, .pg, .page-root {
  background: #020617 !important;           /* slate-950 — racine demandée */
}
/* Mais les conteneurs scrollables restent légèrement plus clairs pour
   créer une hiérarchie visuelle : page = slate-950, cards = slate-900. */
.scrl, .scrollable, main, .main-content {
  background: transparent !important;
}

/* ═══════════════════════════════════════════════════════════════════════
   §17. PAGE PLAN (#pg-pln) — éradication des fonds blancs résiduels
   ───────────────────────────────────────────────────────────────────────
   Les règles d'origine (index.html l.956-982) posaient background:#FFFFFF
   sur 4 éléments imbriqués :
     • #pg-pln           (page Plan elle-même)
     • #pg-pln .pw2      (wrapper interne scrollable)
     • #pg-pln .ps       (bandeau TOP — compteurs Libres/Occupés/En attente)
     • #pg-pln .pl       (bandeau BOTTOM — légende couleurs <1h/1-2h/>2h)
   Spécificité v304 augmentée pour battre l'inline. */

#pg-pln,
body:has(#p-app.on) #pg-pln {
  background: #020617 !important;           /* slate-950 — page racine */
}
#pg-pln .pw2,
body:has(#p-app.on) #pg-pln .pw2 {
  background: transparent !important;       /* laisse traverser le slate-950 */
}

/* Bandeau status TOP — Libres (cyan) / Occupés (rouge) / En attente (ambre) */
#pg-pln .ps,
body:has(#p-app.on) #pg-pln .ps {
  background: #0F172A !important;           /* slate-900 */
  color: #FFFFFF !important;
  border-bottom: 1px solid #1E293B !important;  /* slate-800 */
  padding: 12px 16px !important;
  font-weight: 700 !important;
}
/* Sémantique des compteurs : on conserve les accents cyan/rouge/ambre
   mais on les éclaircit pour bien contraster sur fond sombre. */
#pg-pln .ps > div:first-child,
body:has(#p-app.on) #pg-pln .ps > div:first-child {
  color: #22D3EE !important;                /* cyan-400 — Libres */
  text-shadow: 0 0 8px rgba(34,211,238,.30) !important;
}
#pg-pln .ps > div:nth-child(2),
body:has(#p-app.on) #pg-pln .ps > div:nth-child(2) {
  color: #F87171 !important;                /* red-400 — Occupés */
  text-shadow: 0 0 8px rgba(248,113,113,.30) !important;
}
#pg-pln .ps > div:nth-child(3),
body:has(#p-app.on) #pg-pln .ps > div:nth-child(3) {
  color: #FBBF24 !important;                /* amber-400 — En attente */
  text-shadow: 0 0 8px rgba(251,191,36,.30) !important;
}
/* Compteurs numériques (<span id="ps-l/o/a">) → blanc pur, plus visibles */
#pg-pln .ps span[id^="ps-"] {
  color: #FFFFFF !important;
  font-weight: 900 !important;
  font-variant-numeric: tabular-nums !important;
}

/* Bandeau légende BOTTOM — Libre / <1h / 1-2h / >2h */
#pg-pln .pl,
body:has(#p-app.on) #pg-pln .pl {
  background: #0F172A !important;           /* slate-900 */
  color: #E2E8F0 !important;                /* slate-200 — Directeur demande ce ton précis */
  border-top: 1px solid #1E293B !important;
  padding: 12px 16px !important;
  font-weight: 600 !important;
}
#pg-pln .lgi,
body:has(#p-app.on) #pg-pln .lgi {
  color: #E2E8F0 !important;                /* items légende */
  font-weight: 600 !important;
}


/* ═══════════════════════════════════════════════════════════════════════
   §18. PAGE FIN SERVICE (#pg-fin / #s-fin) — toutes les colonnes en sombre
   ───────────────────────────────────────────────────────────────────────
   Page Fin Service contient des sous-cartes (.cd) ACTIVES/TERMINÉES/etc.
   On force la racine en slate-950, les sous-blocs slate-900, sessions
   slate-800 avec bord slate-700 comme demandé. */

#pg-fin,
#s-fin,
body:has(#p-app.on) #pg-fin,
body:has(#p-app.on) #s-fin {
  background: #020617 !important;           /* slate-950 */
  color: #F1F5F9 !important;
}
#pg-fin .cd,
#s-fin .cd,
body:has(#p-app.on) #pg-fin .cd,
body:has(#p-app.on) #s-fin .cd {
  background: #0F172A !important;           /* slate-900 — colonnes */
  border: 1px solid #1E293B !important;
  color: #F1F5F9 !important;
}
#pg-fin .cd-h,
#s-fin .cd-h,
body:has(#p-app.on) #pg-fin .cd-h,
body:has(#p-app.on) #s-fin .cd-h {
  color: #FFFFFF !important;                /* titres "ACTIVES (6)" etc. */
  font-weight: 800 !important;
  text-transform: uppercase !important;
  letter-spacing: .05em !important;
}
/* Sous-cartes session à l'intérieur (PS4 — P.8, etc.) — pattern .sc / .sc-card / .ev-session */
#pg-fin .sc,
#pg-fin .sc-card,
#pg-fin .ev-session,
#pg-fin .session-card,
#s-fin .sc,
#s-fin .sc-card,
#s-fin .ev-session,
#s-fin .session-card {
  background: #1E293B !important;           /* slate-800 */
  border: 1px solid #334155 !important;     /* slate-700 */
  border-radius: 10px !important;
  color: #FFFFFF !important;
}
#pg-fin .sc .ttl,
#pg-fin .sc-card .ttl,
#pg-fin .sc b,
#pg-fin .sc-card b,
#s-fin .sc .ttl,
#s-fin .sc-card .ttl,
#s-fin .sc b,
#s-fin .sc-card b {
  color: #FFFFFF !important;
  font-weight: 800 !important;
}
/* Minuteurs / chronos / temps écoulé dans les sessions */
#pg-fin .timer,
#pg-fin .chrono,
#pg-fin .elapsed,
#s-fin .timer,
#s-fin .chrono,
#s-fin .elapsed {
  color: #FFFFFF !important;
  font-weight: 800 !important;
  font-variant-numeric: tabular-nums !important;
}


/* ═══════════════════════════════════════════════════════════════════════
   §19. MINI CARTE FLOTTANTE #fs-bar — Fin de Service bottom-left
   ───────────────────────────────────────────────────────────────────────
   Le `#fs-bar` (Opérateur / Encaissé / Wallet / En cours / Total) a déjà
   été partiellement traité par v283/v284, mais il restait des textes
   inline `color:#0F172A` invisibles sur fond sombre. On verrouille. */

#fs-bar,
body:has(#p-app.on) #fs-bar {
  background: #020617 !important;           /* slate-950 — racine */
  border: 1px solid #1E293B !important;     /* slate-800 */
  border-radius: 14px !important;
  box-shadow: 0 12px 32px rgba(0,0,0,.55),
              inset 0 1px 0 rgba(255,255,255,.04) !important;
  padding: 14px !important;
}
#fs-bar .fs-ttl,
body:has(#p-app.on) #fs-bar .fs-ttl {
  color: #FFFFFF !important;
  font-weight: 800 !important;
  text-transform: uppercase !important;
  letter-spacing: .04em !important;
}
#fs-bar .fs-lbl,
body:has(#p-app.on) #fs-bar .fs-lbl {
  color: #CBD5E1 !important;                /* slate-300 — libellés */
  font-weight: 600 !important;
}
#fs-bar .fs-seg,
body:has(#p-app.on) #fs-bar .fs-seg {
  color: #FFFFFF !important;                /* parent par défaut */
}
#fs-bar .fs-seg b,
body:has(#p-app.on) #fs-bar .fs-seg b {
  color: #FFFFFF !important;                /* TOUS les chiffres en blanc */
  font-weight: 900 !important;
  font-variant-numeric: tabular-nums !important;
}
/* Total final en accent vert pour saillir */
#fs-bar .fs-total b,
#fs-bar #fs-tot,
body:has(#p-app.on) #fs-bar .fs-total b,
body:has(#p-app.on) #fs-bar #fs-tot {
  color: #10F0A1 !important;                /* vert néon */
  font-weight: 900 !important;
  font-size: 14px !important;
}
/* Encaissé / En cours en vert plus léger */
#fs-bar #fs-enc,
#fs-bar #fs-cours,
body:has(#p-app.on) #fs-bar #fs-enc,
body:has(#p-app.on) #fs-bar #fs-cours {
  color: #34D399 !important;                /* emerald-400 */
  font-weight: 800 !important;
}
/* Wallet en cyan pour le distinguer du cash */
#fs-bar #fs-wallet,
body:has(#p-app.on) #fs-bar #fs-wallet {
  color: #22D3EE !important;                /* cyan-400 */
  font-weight: 800 !important;
}
/* Border-top du Total (était #E2E8F0 clair) */
#fs-bar .fs-seg.fs-total,
body:has(#p-app.on) #fs-bar .fs-seg.fs-total {
  border-top: 1px solid #1E293B !important; /* slate-800 */
  padding-top: 8px !important;
  margin-top: 4px !important;
}

/* ═══════════════════════════════════════════════════════════════════════
   §20. CARTES KPI OPÉRATEUR (.kc/.kl/.kv) — les 6 du dashboard opérateur
   ───────────────────────────────────────────────────────────────────────
   Pattern : <div class="kc"><div class="kl">💰 Mon CA</div>
              <div class="kv g">24 DH</div></div>
   Distinctes des .tbd-card (§3). Définies index.html l.564-594. */

.kc,
body:has(#p-app.on) .kc {
  background: #0F172A !important;             /* slate-900 */
  border: 1px solid #1E293B !important;       /* slate-800 */
  border-radius: 12px !important;
  padding: 14px 16px !important;
  box-shadow: 0 4px 12px rgba(0,0,0,.30),
              inset 0 1px 0 rgba(255,255,255,.04) !important;
}
.kc:hover,
body:has(#p-app.on) .kc:hover {
  border-color: #334155 !important;
  transform: translateY(-2px) !important;
  box-shadow: 0 8px 20px rgba(0,0,0,.50),
              inset 0 1px 0 rgba(255,255,255,.06) !important;
}
.kl,
body:has(#p-app.on) .kl {
  color: #94A3B8 !important;                  /* slate-400 — label */
  font-weight: 800 !important;
  text-transform: uppercase !important;
  letter-spacing: .07em !important;
  font-size: 11px !important;
}
.kv,
body:has(#p-app.on) .kv {
  color: #FFFFFF !important;                  /* blanc par défaut */
  font-weight: 900 !important;
  font-variant-numeric: tabular-nums !important;
}
/* Variantes sémantiques colorées — text-shadow garde le glow néon */
.kv.g,
body:has(#p-app.on) .kv.g {
  color: #34D399 !important;                  /* emerald-400 — vert positif */
  text-shadow: 0 0 24px rgba(52,211,153,.30) !important;
}
.kv.b,
body:has(#p-app.on) .kv.b {
  color: #22D3EE !important;                  /* cyan-400 — info */
  text-shadow: 0 0 24px rgba(34,211,238,.30) !important;
}
.kv.r,
body:has(#p-app.on) .kv.r {
  color: #F87171 !important;                  /* red-400 — alerte */
  text-shadow: 0 0 24px rgba(248,113,113,.30) !important;
}
.kv.o,
body:has(#p-app.on) .kv.o {
  color: #FBBF24 !important;                  /* amber-400 — warning */
  text-shadow: 0 0 24px rgba(251,191,36,.30) !important;
}


/* ═══════════════════════════════════════════════════════════════════════
   §21. CARTES SESSIONS ACTIVES (.sc) — PS4 — P.13, PS5 — P.2, etc.
   ───────────────────────────────────────────────────────────────────────
   Pattern actuel index.html l.2731-2760 : fond NON défini par défaut
   (transparent → page) MAIS variantes .sc.w (warning) et .sc.a (alerte)
   forcent des fonds pastel clairs. Pastille prix .sc .sp en vert pâle.
   Timer .sc .tg:has([id^="ld-"]) sur fond gris pâle.
   → On dark-ifie tout avec couleurs vives sur fonds sombres. */

.sc,
body:has(#p-app.on) .sc {
  background: #1E293B !important;             /* slate-800 — Directeur demande */
  border: 1px solid rgba(51,65,85,.60) !important;  /* slate-700/60 */
  border-radius: 12px !important;
  padding: 14px 16px !important;
  box-shadow: 0 4px 12px rgba(0,0,0,.35) !important;
}
/* Warning (>1h) et Alert (>2h) — on garde la sémantique via bord saturé */
.sc.w,
body:has(#p-app.on) .sc.w {
  background: #1E293B !important;
  border-color: #F59E0B !important;           /* amber-500 */
  box-shadow: 0 4px 12px rgba(245,158,11,.20),
              inset 0 1px 0 rgba(245,158,11,.10) !important;
}
.sc.a,
body:has(#p-app.on) .sc.a {
  background: #1E293B !important;
  border-color: #EF4444 !important;           /* red-500 */
  box-shadow: 0 4px 12px rgba(239,68,68,.25),
              inset 0 1px 0 rgba(239,68,68,.10) !important;
}
/* Titre poste "PS4 — P.13" */
.sc .sn,
body:has(#p-app.on) .sc .sn,
body:has(#p-app.on) #p-app .sc .sn {
  color: #CBD5E1 !important;                  /* slate-300 — Directeur demande */
  font-weight: 800 !important;
  font-size: 14px !important;
}
/* Pastille prix "17 DH" — capsule emerald dark */
.sc .sp,
body:has(#p-app.on) .sc .sp,
body:has(#p-app.on) #p-app .sc .sp {
  background: rgba(6,78,59,.80) !important;   /* emerald-950 / 80 */
  color: #34D399 !important;                  /* emerald-400 */
  border: 1px solid rgba(16,185,129,.30) !important; /* emerald-500/30 */
  padding: 5px 12px !important;
  border-radius: 999px !important;
  font-size: 12px !important;
  font-weight: 800 !important;
}
/* Timer central (TEMPS ÉCOULÉ "01:06:26") */
.sc .tg:has([id^="ld-"]),
body:has(#p-app.on) .sc .tg:has([id^="ld-"]) {
  background: #0F172A !important;             /* slate-900 — fond timer */
  border: 1px solid #334155 !important;       /* slate-700 */
  border-radius: 14px !important;
  padding: 16px 12px !important;
}
.sc .tg:has([id^="ld-"])::before,
body:has(#p-app.on) .sc .tg:has([id^="ld-"])::before {
  color: #94A3B8 !important;                  /* slate-400 — "TEMPS ÉCOULÉ" */
  font-weight: 800 !important;
}
.sc .tg:has([id^="ld-"]) [id^="ld-"],
body:has(#p-app.on) .sc .tg:has([id^="ld-"]) [id^="ld-"],
body:has(#p-app.on) #p-app .sc .tg:has([id^="ld-"]) [id^="ld-"] {
  color: #FFFFFF !important;                  /* blanc pur pour le chrono */
  font-weight: 900 !important;
  text-shadow: 0 0 12px rgba(34,211,238,.20) !important;  /* glow cyan léger */
}
/* Variantes warning/alert — timer prend la teinte de l'état */
.sc.w .tg:has([id^="ld-"]),
body:has(#p-app.on) .sc.w .tg:has([id^="ld-"]) {
  background: rgba(69,26,3,.50) !important;   /* amber-950/50 */
  border-color: rgba(245,158,11,.40) !important;
}
.sc.a .tg:has([id^="ld-"]),
body:has(#p-app.on) .sc.a .tg:has([id^="ld-"]) {
  background: rgba(69,10,10,.50) !important;  /* red-950/50 */
  border-color: rgba(239,68,68,.40) !important;
}
.sc.w .tg:has([id^="ld-"]) [id^="ld-"],
body:has(#p-app.on) .sc.w .tg:has([id^="ld-"]) [id^="ld-"] {
  color: #FBBF24 !important;                  /* amber-400 — timer warning */
}
.sc.a .tg:has([id^="ld-"]) [id^="ld-"],
body:has(#p-app.on) .sc.a .tg:has([id^="ld-"]) [id^="ld-"] {
  color: #F87171 !important;                  /* red-400 — timer alerte */
}
/* Tags annexes (heure d'entrée, badge pause) */
.sc .tg,
body:has(#p-app.on) .sc .tg {
  background: rgba(15,23,42,.60) !important;
  color: #CBD5E1 !important;
  border: 1px solid rgba(255,255,255,.06) !important;
}

/* ═══════════════════════════════════════════════════════════════════════
   §22. CHARTS SVG — labels, axes, text en blanc pur
   ───────────────────────────────────────────────────────────────────────
   Les charts (CSS bar chart `.tbd-chart`, et tout SVG inline ayant `<text>`
   pour axes/labels) doivent avoir leurs textes en blanc pour rester
   lisibles sur le fond slate-950. CSS `fill` cible les éléments SVG. */

svg text,
svg tspan,
svg .axis,
svg .axis text,
svg .legend,
svg .legend text,
svg .label,
svg .chart-label,
svg .data-label {
  fill: #FFFFFF !important;
  color: #FFFFFF !important;
  font-weight: 700 !important;
  font-family: inherit !important;
}
/* Lignes d'axes / grilles → slate-700 discrètes */
svg .axis line,
svg .axis path,
svg .grid line,
svg .gridline,
svg line.grid {
  stroke: #334155 !important;                /* slate-700 */
  stroke-opacity: .60 !important;
}
/* Tick labels (les valeurs sur les axes) */
svg .tick text,
svg g.tick text,
svg .axis .tick text {
  fill: #CBD5E1 !important;                  /* slate-300 — secondaires */
  font-weight: 600 !important;
}
/* Legend swatches — laisser leur fill brand intact (couleurs sémantiques),
   mais leur texte en slate-200 par défaut. */
svg .legend-item text,
svg .legend text {
  fill: #E2E8F0 !important;                  /* slate-200 */
  font-weight: 600 !important;
}

/* Bar chart CSS .tbd-chart — déjà couvert §3 mais on verrouille les valeurs */
.tbd-chart-bar-val {
  color: #FFFFFF !important;
  font-weight: 800 !important;
  text-shadow: 0 1px 2px rgba(0,0,0,.45) !important;
}

/* ═══════════════════════════════════════════════════════════════════════
   §23. PAGE FIN SERVICE — boutons .btn.bgh + carte hero .bx-hero
   ───────────────────────────────────────────────────────────────────────
   Les boutons "🔄 Actualiser" et "📥 Export CSV" (rendus app.js l.9531-9532
   en flex:1 chacun) ont le style `.btn.bgh{background:#FFFFFF}` défini
   index.html l.2709 dans le style block 160-3851. v283/v290 ont des
   overrides scope `body:has(#p-app.on)` (l.3427, 6005…). Sans le scope
   ça reste blanc → c'est ce que le Directeur voit comme "2 colonnes
   géantes blanches" sur la page Fin Service.

   v304 ajoute des règles SANS scope :has() pour être actif partout. */

.btn.bgh,
button.bgh,
body:has(#p-app.on) .btn.bgh,
body:has(#p-app.on) #p-app .btn.bgh {
  background: #1E293B !important;             /* slate-800 */
  border: 1px solid #334155 !important;       /* slate-700 */
  color: #FFFFFF !important;
  font-weight: 800 !important;
  box-shadow: 0 4px 12px rgba(0,0,0,.25) !important;
  transition: background .15s, border-color .15s, transform .12s !important;
}
.btn.bgh:hover:not(:disabled),
button.bgh:hover:not(:disabled),
body:has(#p-app.on) .btn.bgh:hover:not(:disabled) {
  background: rgba(34,211,238,.10) !important;
  border-color: #22D3EE !important;           /* cyan-400 highlight */
  color: #22D3EE !important;
}
.btn.bgh:active:not(:disabled) {
  transform: scale(.97) !important;
}

/* Carte HERO Fin Service .bx-hero (le bloc "88 DH" à gauche du Directeur) */
.bx-hero,
body:has(#p-app.on) .bx-hero,
body:has(#p-app.on) #p-app .bx-hero {
  background: #0F172A !important;             /* slate-900 */
  border: 1px solid #1E293B !important;       /* slate-800 */
  border-left: 4px solid #10B981 !important;  /* emerald-500 accent */
  border-radius: 14px !important;
  padding: 18px 20px !important;
  box-shadow: 0 8px 24px rgba(0,0,0,.40),
              inset 0 1px 0 rgba(255,255,255,.04) !important;
  color: #F1F5F9 !important;
}
/* Libellé "💰 CA — date" */
.bx-hero .bh-lb,
body:has(#p-app.on) .bx-hero .bh-lb {
  color: #94A3B8 !important;                  /* slate-400 — métadonnée */
  font-weight: 700 !important;
  font-size: 12px !important;
  text-transform: uppercase !important;
  letter-spacing: .06em !important;
}
/* Le BIG montant "88 DH" — blanc pur 900 avec glow vert subtil */
.bx-hero .bh-am,
body:has(#p-app.on) .bx-hero .bh-am {
  color: #FFFFFF !important;
  font-weight: 900 !important;
  font-size: 36px !important;
  letter-spacing: -.02em !important;
  font-variant-numeric: tabular-nums !important;
  text-shadow: 0 0 24px rgba(16,185,129,.25) !important;
  margin: 6px 0 4px !important;
}
/* Sous-titre "✅ X terminées · ⏳ Y active(s)" */
.bx-hero .bh-sb,
body:has(#p-app.on) .bx-hero .bh-sb {
  color: #E2E8F0 !important;                  /* slate-200 — secondaire visible */
  font-weight: 600 !important;
  font-size: 13px !important;
  margin-top: 4px !important;
}

/* Carte "Actives (X)" — header avec couleur ambre conservée */
#pg-fin .cd-h[style*="color:var(--org)"],
#s-fin .cd-h[style*="color:var(--org)"],
body:has(#p-app.on) #pg-fin .cd-h,
body:has(#p-app.on) #s-fin .cd-h {
  color: #FBBF24 !important;                  /* amber-400 pour "Actives (X)" */
  font-weight: 800 !important;
  text-transform: uppercase !important;
  letter-spacing: .05em !important;
}
/* Override quand il s'agit d'un .cd-h générique (sans style ambre) */
#pg-fin .cd .cd-h,
#s-fin .cd .cd-h {
  color: #FFFFFF !important;                  /* autres en-têtes en blanc */
}
/* "Par produit" header (vert) */
#pg-fin .cd-h:not([style*="color"]),
#s-fin .cd-h:not([style*="color"]) {
  color: #FFFFFF !important;
}

/* Cartes produit .tc2 (📦 Par produit) — slate-800 */
.tc2,
body:has(#p-app.on) .tc2 {
  background: #1E293B !important;
  border: 1px solid #334155 !important;
  border-radius: 10px !important;
  padding: 10px 12px !important;
  color: #F1F5F9 !important;
}
.tc2 .tp {
  color: #CBD5E1 !important;                  /* nom produit */
  font-weight: 700 !important;
}
.tc2 .tpr {
  color: #34D399 !important;                  /* prix emerald-400 */
  font-weight: 900 !important;
  font-variant-numeric: tabular-nums !important;
}
.tc2 .td {
  color: #94A3B8 !important;
  font-weight: 600 !important;
  font-size: 11px !important;
}

/* ═══════════════════════════════════════════════════════════════════════
   §24. PAGE CLIENTS — .mbrs-bar parent + #mbrs-search input + filtres
   ───────────────────────────────────────────────────────────────────────
   index.html l.3517-3520 force `.mbrs-bar { background:#FFFFFF }` et
   l.3521-3526 force `#mbrs-search { background:#F8FAFC; color:#0F172A }`
   dans #p-app — d'où "rien à voir l'écriture" rapporté par le Directeur.
   v304 bat avec spécificité supérieure (ajout d'un sélecteur element). */

/* Conteneur de la barre Clients — fond transparent (page slate-950 visible) */
body:has(#p-app.on) #p-app div.mbrs-bar,
body.in-app div.mbrs-bar,
div.mbrs-bar {
  background: transparent !important;
  border: 0 !important;
  padding: 8px 0 !important;
}

/* Input recherche Clients — spécificité (1,2,1) qui bat l.3521 (1,1,1) */
body:has(#p-app.on) input#mbrs-search,
body:has(#p-app.on) input#mbrs-filter,
body.in-app input#mbrs-search,
body.in-app input#mbrs-filter,
input#mbrs-search,
input#mbrs-filter {
  background: #1E293B !important;             /* slate-800 */
  color: #FFFFFF !important;                  /* texte blanc */
  border: 1px solid #334155 !important;       /* slate-700 */
  padding: 11px 14px !important;
  border-radius: 12px !important;
  font-size: 14px !important;
  font-weight: 600 !important;
  outline: none !important;
}
input#mbrs-search:focus,
input#mbrs-filter:focus {
  border-color: #22D3EE !important;
  box-shadow: 0 0 0 3px rgba(34,211,238,.20) !important;
}
input#mbrs-search::placeholder,
input#mbrs-filter::placeholder {
  color: #94A3B8 !important;                  /* slate-400 placeholder */
  font-weight: 500 !important;
  opacity: 1 !important;
}

/* Labels de stats KPI Clients */
body:has(#p-app.on) #p-app .mbrs-stat-lbl,
body.in-app .mbrs-stat-lbl,
.mbrs-stat-lbl {
  color: #94A3B8 !important;                  /* slate-400 */
  font-weight: 700 !important;
}
body:has(#p-app.on) #p-app .mbrs-stat-val,
body.in-app .mbrs-stat-val,
.mbrs-stat-val {
  color: #FFFFFF !important;                  /* blanc pur valeurs */
  font-weight: 900 !important;
  font-variant-numeric: tabular-nums !important;
}

/* Boutons refresh / export — slate-800 */
.mbrs-refresh,
.mbrs-export,
body:has(#p-app.on) .mbrs-refresh,
body:has(#p-app.on) .mbrs-export {
  background: #1E293B !important;
  color: #FFFFFF !important;
  border: 1px solid #334155 !important;
  font-weight: 800 !important;
}
.mbrs-export,
body:has(#p-app.on) .mbrs-export {
  background: #22D3EE !important;             /* cyan accent pour Export */
  color: #04141C !important;
  border-color: #22D3EE !important;
}
.mbrs-export:hover,
body:has(#p-app.on) .mbrs-export:hover {
  background: #67E8F9 !important;             /* cyan-300 hover */
}

/* ═══════════════════════════════════════════════════════════════════════
   §25. PAGE PLAN — cellules postes .pc (PS4-1, PS5-3, etc.)
   ───────────────────────────────────────────────────────────────────────
   Les cellules postes (index.html l.991-1071) ont :
     • fonds pastel clairs (`#CFFAFE`, `#FEE2E2`, `#FEF3C7`, etc.) selon
       famille ET état → mauvaises sur thème sombre
     • textes `color:#0F172A` (slate-900) + text-shadow blanc → illisible
       et halo blanc choquant sur dark
   Solution : fonds slate-900 partout, BORDS gardent leur couleur famille
   saturée (cyan PS5, indigo PS4, amber VIP, etc.), GLOWs saturés
   conservés, textes en BLANC avec shadow noire pour profondeur. */

/* Base .pc — fond slate-900 unique, bord+glow gardent les CSS vars */
.pc,
body:has(#p-app.on) .pc,
body:has(#p-app.on) #p-app .pc {
  background: #0F172A !important;             /* slate-900 — fond uniforme */
  /* on garde --rgb-color (bord) et --rgb-glow (shadow) tels que définis
     par les classes .pc.fam-* et .pc.s-* — ce sont les couleurs vives. */
  color: #FFFFFF !important;
}

/* Override pour les variantes famille — bgs pastel → slate-900 */
.pc.fam-ps5,
.pc.fam-ps4,
.pc.fam-vip,
.pc.fam-ping-pong,
.pc.fam-volant {
  --rgb-bg: #0F172A !important;
}

/* Override pour les variantes état — bgs pastel → slate-900 + on garde
   color saturé pour le bord et glow */
.pc.s-libre   { --rgb-bg: #0F172A !important; }
.pc.s-occupe  { --rgb-bg: #0F172A !important; }
.pc.s-warn    { --rgb-bg: #0F172A !important; }
.pc.s-alerte  { --rgb-bg: #0F172A !important; }
.pc.s-attente { --rgb-bg: #0F172A !important; }
.pc.s-pause   { --rgb-bg: #0F172A !important; }
.pc.s         { --rgb-bg: #1E293B !important; opacity:.6 !important; } /* postes libres "fantômes" */

/* Bord plus saillant — 2px au lieu de 3px pour ne pas dominer */
.pc,
body:has(#p-app.on) .pc {
  border-width: 2px !important;
  box-shadow: 0 4px 14px rgba(0,0,0,.45),
              0 0 18px var(--rgb-glow) !important;
}

/* Texte du nom poste (.pc-lbl PS4-1) — blanc avec shadow noire profonde */
.pc .pc-lbl,
body:has(#p-app.on) .pc .pc-lbl {
  color: #FFFFFF !important;
  font-weight: 900 !important;
  text-shadow: 0 1px 3px rgba(0,0,0,.85),
               0 0 8px rgba(0,0,0,.65) !important;
  font-size: 14px !important;
  letter-spacing: .04em !important;
}

/* Timer (00:45:12) — blanc avec shadow */
.pc .pc-timer,
body:has(#p-app.on) .pc .pc-timer {
  color: #FFFFFF !important;
  font-weight: 900 !important;
  text-shadow: 0 1px 3px rgba(0,0,0,.85),
               0 0 6px rgba(0,0,0,.55) !important;
  font-size: 12px !important;
}

/* Montant DH (sous le timer) — saturé selon l'état */
.pc .pc-amt,
body:has(#p-app.on) .pc .pc-amt {
  color: #34D399 !important;                  /* emerald-400 par défaut */
  font-weight: 900 !important;
  text-shadow: 0 1px 3px rgba(0,0,0,.85),
               0 0 6px rgba(0,0,0,.55) !important;
  font-size: 13px !important;
}
.pc.s-warn .pc-amt,
.pc.s-alerte .pc-amt,
body:has(#p-app.on) .pc.s-warn .pc-amt,
body:has(#p-app.on) .pc.s-alerte .pc-amt {
  color: #F87171 !important;                  /* red-400 — warn/alerte */
}
.pc.s-pause .pc-amt,
body:has(#p-app.on) .pc.s-pause .pc-amt {
  color: #FBBF24 !important;                  /* amber-400 — pause */
}

/* Raison (.pc-reason — petit texte italique) */
.pc .pc-reason,
body:has(#p-app.on) .pc .pc-reason {
  color: var(--rgb-color, #22D3EE) !important;
  text-shadow: 0 1px 2px rgba(0,0,0,.65) !important;
  font-weight: 700 !important;
}

/* Icône SVG chaise/écran — filter drop-shadow plus prononcé */
.pc svg.pc-svg,
body:has(#p-app.on) .pc svg.pc-svg {
  filter: drop-shadow(0 2px 4px rgba(0,0,0,.65))
          drop-shadow(0 0 6px var(--rgb-glow)) !important;
}

/* État libre (.s-libre) — opacité légère du fond + bord cyan/emerald */
.pc.s-libre {
  --rgb-color: #10B981 !important;            /* emerald-500 — vert vif libre */
  --rgb-glow: rgba(16,185,129,.50) !important;
}
.pc.s-occupe,
.pc.s-warn {
  --rgb-color: #EF4444 !important;            /* red-500 */
  --rgb-glow: rgba(239,68,68,.55) !important;
}
.pc.s-alerte {
  --rgb-color: #DC2626 !important;            /* red-600 saturé */
  --rgb-glow: rgba(220,38,38,.65) !important;
}
.pc.s-attente,
.pc.s-pause {
  --rgb-color: #F59E0B !important;            /* amber-500 */
  --rgb-glow: rgba(245,158,11,.55) !important;
}

/* Modal mini "pbt" (postes dans modales sélection) — refonte sombre aussi */
.pbt,
body:has(#p-app.on) .pbt {
  background: #1E293B !important;             /* slate-800 */
  border: 1px solid #334155 !important;
  color: #FFFFFF !important;
  font-weight: 700 !important;
}
.pbt:hover,
body:has(#p-app.on) .pbt:hover {
  background: #334155 !important;             /* slate-700 hover */
  border-color: #22D3EE !important;
  color: #22D3EE !important;
}
.pbt.sel,
body:has(#p-app.on) .pbt.sel {
  background: #22D3EE !important;             /* cyan-400 actif */
  border-color: #22D3EE !important;
  color: #04141C !important;
  box-shadow: 0 4px 14px rgba(34,211,238,.40) !important;
}
.pbt.occ,
body:has(#p-app.on) .pbt.occ {
  background: rgba(69,10,10,.50) !important;  /* red-950/50 occupé */
  border-color: #EF4444 !important;
  color: #F87171 !important;
  opacity: .65 !important;
}

/* ═══════════════════════════════════════════════════════════════════════
   §26. SIDEBAR GAUCHE CLIENT (mb-p-app) — <aside tw-bg-white>
   ───────────────────────────────────────────────────────────────────────
   Sidebar desktop ≥1024px (index.html l.4375) — `<aside class="tw-bg-white">`
   avec wrapper interne `tw-bg-[#F8FAFC]` + textes `tw-text-[#1F2937]`
   et `tw-text-[#64748B]`. Tailwind utilities arbitraires en `tw-bg-[#...]`
   ne sont pas couvertes par mon §1 (qui ne cible que les classes
   nommées comme `tw-bg-white`). On les cible via [class*="tw-bg-["]. */

/* Sidebar racine */
aside.tw-bg-white,
aside[class*="tw-bg-white"] {
  background: #0F172A !important;             /* slate-900 */
  border-right: 1px solid #1E293B !important; /* slate-800 */
  color: #F1F5F9 !important;
}

/* Wrapper "avatar + nom + solde" — était tw-bg-[#F8FAFC] (slate-50) */
aside .tw-bg-\[\#F8FAFC\],
aside [class*="tw-bg-[#F8FAFC]"],
aside [class*="tw-bg-[#F1F5F9]"],
aside [class*="tw-bg-[#FFFFFF]"] {
  background: #1E293B !important;             /* slate-800 */
  border: 1px solid #334155 !important;       /* slate-700 */
  color: #F1F5F9 !important;
}

/* Texte nom client (tb-nm) et solde (tb-pts) — étaient slate-900/slate-500 */
aside #tb-nm,
aside [class*="tw-text-[#1F2937]"],
aside [class*="tw-text-[#0F172A]"],
aside [class*="tw-text-[#111827]"],
aside [class*="tw-text-[#1E293B]"] {
  color: #FFFFFF !important;
  font-weight: 800 !important;
}
aside #tb-pts,
aside [class*="tw-text-[#64748B]"],
aside [class*="tw-text-[#475569]"],
aside [class*="tw-text-[#94A3B8]"] {
  color: #34D399 !important;                  /* emerald-400 pour le solde */
  font-weight: 700 !important;
}

/* Logo "🎮 EspaceVirtuel" en haut — était teal foncé invisible */
aside [class*="tw-text-[#2D5A60]"] {
  color: #22D3EE !important;                  /* cyan-400 — brand sur dark */
  font-weight: 800 !important;
}

/* Bordures internes — slate-700 */
aside [class*="tw-border-[#E2E8F0]"],
aside [class*="tw-border-[#CBD5E1]"] {
  border-color: #334155 !important;
}

/* Boutons de navigation .evcx-side (Accueil, QR, Historique, Contact) */
.evcx-side,
aside .evcx-side {
  background: transparent !important;
  color: #CBD5E1 !important;                  /* slate-300 par défaut */
  border: 0 !important;
  padding: 11px 14px !important;
  border-radius: 10px !important;
  font-weight: 700 !important;
  font-size: 14px !important;
  display: flex !important;
  align-items: center !important;
  gap: 12px !important;
  width: 100% !important;
  text-align: left !important;
  cursor: pointer !important;
  font-family: inherit !important;
  transition: background .15s, color .15s !important;
}
.evcx-side:hover,
aside .evcx-side:hover {
  background: rgba(34,211,238,.08) !important;
  color: #FFFFFF !important;
}
.evcx-side.evcx-navactive,
aside .evcx-side.evcx-navactive {
  background: linear-gradient(90deg, rgba(34,211,238,.18), rgba(34,211,238,.04)) !important;
  color: #FFFFFF !important;
  font-weight: 800 !important;
  box-shadow: inset 3px 0 0 #22D3EE !important;
}
.evcx-ic,
aside .evcx-ic {
  font-size: 18px !important;
  flex-shrink: 0 !important;
}

/* Sous-boutons en bas (Mot de passe / Mes données / Déconnexion) */
.evcx-sub,
aside .evcx-sub {
  background: transparent !important;
  color: #94A3B8 !important;                  /* slate-400 — secondaires */
  border: 0 !important;
  padding: 10px 14px !important;
  border-radius: 8px !important;
  font-weight: 600 !important;
  font-size: 13px !important;
  display: flex !important;
  align-items: center !important;
  gap: 10px !important;
  width: 100% !important;
  text-align: left !important;
  cursor: pointer !important;
  font-family: inherit !important;
  transition: background .15s, color .15s !important;
}
.evcx-sub:hover,
aside .evcx-sub:hover {
  background: rgba(255,255,255,.04) !important;
  color: #FFFFFF !important;
}
/* Bouton Déconnexion en rouge */
.evcx-sub[onclick*="doLogout"],
aside .evcx-sub[onclick*="doLogout"] {
  color: #F87171 !important;                  /* red-400 */
}
.evcx-sub[onclick*="doLogout"]:hover,
aside .evcx-sub[onclick*="doLogout"]:hover {
  background: rgba(69,10,10,.40) !important;
  color: #FCA5A5 !important;
}

/* Header mobile (#mb-mobile-header) qui apparaît < 1024px — fond white inline */
header#mb-mobile-header,
#mb-mobile-header {
  background: #0F172A !important;             /* slate-900 */
  border-bottom: 1px solid #1E293B !important;
  color: #FFFFFF !important;
}
header#mb-mobile-header > div:first-child,
#mb-mobile-header [style*="color:#1e293b"] {
  color: #FFFFFF !important;
  font-weight: 800 !important;
}

/* Wrapper main container — était tw-bg-slate-50 light */
div.tw-flex.tw-bg-slate-50,
div[class*="tw-bg-slate-50"] {
  background: #020617 !important;             /* slate-950 — racine page */
}

/* ═══════════════════════════════════════════════════════════════════════
   §27. PAGE CLIENTS — 4 cartes KPI .mbrs-stat (Total/Actifs/Solde/CA)
   ───────────────────────────────────────────────────────────────────────
   index.html l.3510-3516 force `.mbrs-stat { background:#FFFFFF }` +
   `.mbrs-stat-val { color:#0F172A }` avec spécificité (2,1,1) dans
   #p-app. v304 §24 ne ciblait que les enfants — j'ai oublié le
   conteneur, d'où chiffres blancs invisibles sur fond blanc.
   Cette section bat avec même spécificité (source order favorise v304). */

body:has(#p-app.on) #p-app .mbrs-stat,
body.in-app .mbrs-stat,
.mbrs-stat {
  background: #0F172A !important;             /* slate-900 */
  border: 1px solid #1E293B !important;       /* slate-800 */
  border-radius: 12px !important;
  padding: 16px 18px !important;
  box-shadow: 0 4px 12px rgba(0,0,0,.30),
              inset 0 1px 0 rgba(255,255,255,.04) !important;
  color: #F1F5F9 !important;
}
body:has(#p-app.on) #p-app .mbrs-stat:hover,
.mbrs-stat:hover {
  border-color: #334155 !important;
  transform: translateY(-2px) !important;
  box-shadow: 0 8px 20px rgba(0,0,0,.45) !important;
}

/* Label "Total clients" / "Actifs" / "Solde global" / "CA cumulé" */
body:has(#p-app.on) #p-app .mbrs-stat-lbl,
body.in-app .mbrs-stat-lbl,
.mbrs-stat-lbl {
  color: #CBD5E1 !important;                  /* slate-300 — Directeur demande */
  font-weight: 700 !important;
  font-size: 11px !important;
  text-transform: uppercase !important;
  letter-spacing: .08em !important;
  margin-bottom: 6px !important;
}

/* Valeurs "118" / "1290 DH" / etc. — blanc pur 900 */
body:has(#p-app.on) #p-app .mbrs-stat-val,
body.in-app .mbrs-stat-val,
.mbrs-stat-val {
  color: #FFFFFF !important;
  font-weight: 900 !important;
  font-size: 24px !important;
  line-height: 1.1 !important;
  font-variant-numeric: tabular-nums !important;
  letter-spacing: -.02em !important;
}

/* Variante teintée pour stat positive / négative si présente */
.mbrs-stat.is-positive .mbrs-stat-val,
.mbrs-stat.is-good .mbrs-stat-val {
  color: #34D399 !important;                  /* emerald-400 */
  text-shadow: 0 0 20px rgba(52,211,153,.30) !important;
}
.mbrs-stat.is-warning .mbrs-stat-val {
  color: #FBBF24 !important;                  /* amber-400 */
}
.mbrs-stat.is-danger .mbrs-stat-val {
  color: #F87171 !important;                  /* red-400 */
}

/* Conteneur des 4 cartes .mbrs-stats — grille slate-950 transparent */
body:has(#p-app.on) #p-app .mbrs-stats,
.mbrs-stats {
  background: transparent !important;
  padding: 8px 0 12px !important;
}

/* Cartes .mbrs-card (rangées Clients vue mobile/grille) si présentes */
body:has(#p-app.on) #p-app .mbrs-card,
.mbrs-card {
  background: #0F172A !important;
  border: 1px solid #1E293B !important;
  color: #F1F5F9 !important;
}

/* Filtres "Tous / Actifs récents / Inactifs" — boutons probables */
body:has(#p-app.on) #p-app .mbrs-filter,
.mbrs-filter {
  background: #1E293B !important;
  color: #FFFFFF !important;
  border: 1px solid #334155 !important;
}

/* ───────────────────────────────────────────────────────────────────────────
   §50. BUG 7 FIX (2026-05-26) — CONTRASTE CONSOLES / SESSIONS
   ───────────────────────────────────────────────────────────────────────────
   index.html (l. ~3639/3671 et voisins) contient encore des règles LEGACY du
   thème clair de la forme :
     body:has(#p-app.on) #p-app .pc-lbl { color:#0F172A !important; }
     body:has(#p-app.on) #p-app .sc .sn { color:#0F172A !important; }
     body:has(#p-app.on) #p-app .sc .tg:has([id^="ld-"]) [id^="ld-"] {
       color:#0F172A !important; -webkit-text-fill-color:#0F172A !important;
     }
   Ces sélecteurs ont la spécificité (0,3,2) — ils battent §21/§25 (0,2,2/0,3,2)
   et imposent du texte slate-900 sur fond slate-900 → texte noir sur noir,
   illisible (compteurs et tarifs des cartes consoles "PS4 — P.13", etc.).
   On enchâsse les overrides dans `html` (spécificité 0,0,1 supplémentaire)
   pour atteindre (0,3,3) et gagner sur (0,3,2) du legacy.

   PALETTE STRICTEMENT THÈME SOMBRE (feedback Directeur 2026-05-26) :
     • Texte courant : #FFFFFF (principal) / #F1F5F9 / #CBD5E1 (secondaires)
     • PAS de couleurs vives (emerald/amber/red) sur le texte — la sémantique
       d'état (warn/alerte/pause) passe par le BORD et le GLOW de la cellule,
       pas par la couleur du texte. */
html body:has(#p-app.on) #p-app .pc .pc-lbl,
html body:has(#p-app.on) #p-app .pc .pc-timer,
html body:has(#p-app.on) #p-app .pc .pc-amt {
  color: #FFFFFF !important;
  -webkit-text-fill-color: #FFFFFF !important;
  text-shadow: 0 1px 3px rgba(0,0,0,.85), 0 0 8px rgba(0,0,0,.55) !important;
  font-weight: 900 !important;
  filter: none !important;            /* anti-blur défensif */
  opacity: 1 !important;
}
/* États warn / alerte / pause : on garde un texte clair lisible.
   La distinction visuelle se fait via le bord coloré et le glow déjà gérés
   par §25 (lignes 1442-1460), pas via la couleur du texte. */
html body:has(#p-app.on) #p-app .pc.s-warn .pc-amt,
html body:has(#p-app.on) #p-app .pc.s-alerte .pc-amt,
html body:has(#p-app.on) #p-app .pc.s-pause .pc-amt {
  color: #FFFFFF !important;
  -webkit-text-fill-color: #FFFFFF !important;
}
/* Postes libres "fantômes" (.pc.s sans état actif) — texte slate atténué */
html body:has(#p-app.on) #p-app .pc.s .pc-lbl {
  color: #CBD5E1 !important;
  -webkit-text-fill-color: #CBD5E1 !important;
}

/* Cartes sessions actives .sc (PS4 — P.13, PS5 — P.2…) — titre + pastille prix
   + timer central. Tout en blanc/slate, pas d'emerald, pas d'amber, pas de red. */
html body:has(#p-app.on) #p-app .sc .sn {
  color: #F1F5F9 !important;
  -webkit-text-fill-color: #F1F5F9 !important;
  filter: none !important;
}
/* Pastille prix : pas de teinte verte ni jaune — on garde le badge en
   slate-800 avec texte blanc. Le bord conserve un léger glow neutre. */
html body:has(#p-app.on) #p-app .sc .sp {
  background: #1E293B !important;
  color: #FFFFFF !important;
  -webkit-text-fill-color: #FFFFFF !important;
  border: 1px solid #334155 !important;
}
html body:has(#p-app.on) #p-app .sc .tg:has([id^="ld-"]) [id^="ld-"],
html body:has(#p-app.on) #p-app .sc.w .tg:has([id^="ld-"]) [id^="ld-"],
html body:has(#p-app.on) #p-app .sc.a .tg:has([id^="ld-"]) [id^="ld-"] {
  color: #FFFFFF !important;
  -webkit-text-fill-color: #FFFFFF !important;
  filter: none !important;
}

/* ───────────────────────────────────────────────────────────────────────────
   §51. MODAL DÉTAIL DES DÉPENSES (#m-dep-detail) — 2026-05-26
   ───────────────────────────────────────────────────────────────────────────
   Le modal contient des logs/textes libres saisis par l'opérateur (commande
   en darija, justificatif…). Texte STRICTEMENT BLANC sur slate-950 partout —
   on neutralise toute règle de coloration héritée qui pousserait du violet
   ou du bleu foncé (var(--tx2), syntax highlighters, etc.). Aucun fond clair. */
html body:has(#p-app.on) #m-dep-detail .md,
#m-dep-detail .md {
  background: #0F172A !important;
  border: 1px solid #1E293B !important;
  color: #FFFFFF !important;
}
html body:has(#p-app.on) #m-dep-detail .mdt,
#m-dep-detail .mdt {
  color: #FFFFFF !important;
  -webkit-text-fill-color: #FFFFFF !important;
}
html body:has(#p-app.on) #m-dep-detail #m-dep-detail-head,
#m-dep-detail #m-dep-detail-head {
  background: #020617 !important;
  border: 1px solid #1E293B !important;
  color: #FFFFFF !important;
}
html body:has(#p-app.on) #m-dep-detail #m-dep-detail-list,
html body:has(#p-app.on) #m-dep-detail #m-dep-detail-list *,
#m-dep-detail #m-dep-detail-list,
#m-dep-detail #m-dep-detail-list * {
  color: #FFFFFF !important;
  -webkit-text-fill-color: #FFFFFF !important;
}
/* Anti syntax-highlight : neutralise toute coloration de spans tokens
   éventuelle (au cas où un plugin tierce injecterait des tokens colorés). */
#m-dep-detail [class*="hljs"],
#m-dep-detail [class*="token"],
#m-dep-detail code,
#m-dep-detail pre {
  color: #FFFFFF !important;
  -webkit-text-fill-color: #FFFFFF !important;
  background: transparent !important;
  filter: none !important;
}

/* ───────────────────────────────────────────────────────────────────────────
   §52. INPUTS DATE / TIME / DATETIME — color-scheme dark 2026-05-26
   ───────────────────────────────────────────────────────────────────────────
   Chrome/Safari/Firefox utilisent leur palette par défaut (texte noir, icône
   calendrier sombre) pour le rendu natif des contrôles `<input type=date>` —
   ignorés par les règles `color:` classiques. La solution est `color-scheme`
   qui bascule TOUTES les UI natives (texte JJ/MM/AAAA, icône, spinner, picker
   overlay) en mode sombre. On l'applique globalement, en filet de sécurité. */
html body:has(#p-app.on) input[type="date"],
html body:has(#p-app.on) input[type="datetime-local"],
html body:has(#p-app.on) input[type="time"],
html body:has(#p-app.on) input[type="month"],
html body:has(#p-app.on) input[type="week"],
input[type="date"],
input[type="datetime-local"],
input[type="time"],
input[type="month"],
input[type="week"] {
  color-scheme: dark !important;
  color: #FFFFFF !important;
  -webkit-text-fill-color: #FFFFFF !important;
  background: #0F172A !important;
  border-color: #334155 !important;
}
/* Icône calendrier WebKit en blanc (par défaut elle est sombre) */
html body:has(#p-app.on) input[type="date"]::-webkit-calendar-picker-indicator,
html body:has(#p-app.on) input[type="datetime-local"]::-webkit-calendar-picker-indicator,
html body:has(#p-app.on) input[type="time"]::-webkit-calendar-picker-indicator,
input[type="date"]::-webkit-calendar-picker-indicator,
input[type="datetime-local"]::-webkit-calendar-picker-indicator,
input[type="time"]::-webkit-calendar-picker-indicator {
  filter: invert(1) opacity(.9) !important;
  cursor: pointer !important;
}
/* Texte interne JJ/MM/AAAA — WebKit utilise un pseudo-element dédié */
html body:has(#p-app.on) input[type="date"]::-webkit-datetime-edit,
html body:has(#p-app.on) input[type="datetime-local"]::-webkit-datetime-edit,
html body:has(#p-app.on) input[type="time"]::-webkit-datetime-edit,
input[type="date"]::-webkit-datetime-edit,
input[type="datetime-local"]::-webkit-datetime-edit,
input[type="time"]::-webkit-datetime-edit {
  color: #FFFFFF !important;
  -webkit-text-fill-color: #FFFFFF !important;
}
html body:has(#p-app.on) input[type="date"]::-webkit-datetime-edit-fields-wrapper,
input[type="date"]::-webkit-datetime-edit-fields-wrapper {
  color: #FFFFFF !important;
}
html body:has(#p-app.on) input[type="date"]::-webkit-datetime-edit-text,
html body:has(#p-app.on) input[type="date"]::-webkit-datetime-edit-month-field,
html body:has(#p-app.on) input[type="date"]::-webkit-datetime-edit-day-field,
html body:has(#p-app.on) input[type="date"]::-webkit-datetime-edit-year-field,
input[type="date"]::-webkit-datetime-edit-text,
input[type="date"]::-webkit-datetime-edit-month-field,
input[type="date"]::-webkit-datetime-edit-day-field,
input[type="date"]::-webkit-datetime-edit-year-field {
  color: #FFFFFF !important;
  -webkit-text-fill-color: #FFFFFF !important;
}
/* Placeholder texte (champ vide) en slate-400 */
html body:has(#p-app.on) input[type="date"]::placeholder,
input[type="date"]::placeholder {
  color: #94A3B8 !important;
  -webkit-text-fill-color: #94A3B8 !important;
}

/* ───────────────────────────────────────────────────────────────────────────
   §53. TABLE CLIENTS — boutons d'action inline 2026-05-26
   ───────────────────────────────────────────────────────────────────────────
   Les boutons rendus par voirMembreDetail / validerCINMembre / etc. ont
   un `style="background:#ECFDF5"` (vert pâle) ou `background:#FEF2F2` (rose
   pâle) inline. v304 catch-all les passe en sombre → texte initialement
   en couleur saturée (047857, B91C1C…) reste lisible MAIS sur fond sombre
   parfois trop terne. On force ici une variante "alpha sur slate-800" pour
   chaque action, avec texte en variante claire (300/400) bien lisible. */
html body:has(#p-app.on) #s-mbrs .mbrs-act,
#s-mbrs .mbrs-act {
  background: #1E293B !important;
  border: 1px solid #334155 !important;
  color: #F1F5F9 !important;
  -webkit-text-fill-color: #F1F5F9 !important;
}
/* Variante "Valider CIN" — vert succès */
html body:has(#p-app.on) #s-mbrs .mbrs-act[style*="ECFDF5" i],
html body:has(#p-app.on) #s-mbrs .mbrs-act[style*="#10B981" i],
html body:has(#p-app.on) #s-mbrs .mbrs-act[style*="047857" i] {
  background: rgba(6,78,59,.45) !important;
  border-color: #10B981 !important;
  color: #6EE7B7 !important;
  -webkit-text-fill-color: #6EE7B7 !important;
}
/* Variante "M.D.P Oublié" — cyan info */
html body:has(#p-app.on) #s-mbrs .mbrs-act[style*="0EA5E9" i],
html body:has(#p-app.on) #s-mbrs .mbrs-act[style*="0369A1" i] {
  background: rgba(8,47,73,.45) !important;
  border-color: #22D3EE !important;
  color: #67E8F9 !important;
  -webkit-text-fill-color: #67E8F9 !important;
}
/* Variante "Supprimer" — rouge danger */
html body:has(#p-app.on) #s-mbrs .mbrs-act[style*="FCA5A5" i],
html body:has(#p-app.on) #s-mbrs .mbrs-act[style*="FEF2F2" i],
html body:has(#p-app.on) #s-mbrs .mbrs-act[style*="B91C1C" i] {
  background: rgba(127,29,29,.40) !important;
  border-color: #EF4444 !important;
  color: #FECACA !important;
  -webkit-text-fill-color: #FECACA !important;
}

/* Fin du fichier — ev-unified-dark-v304.css */

/* =============== /css/ev-global-polish-v305.css?v=305-polish-20260526 =============== */
/* ═══════════════════════════════════════════════════════════════════════════
   ev-global-polish-v305.css  —  2026-05-26
   ───────────────────────────────────────────────────────────────────────────
   POLISH GLOBAL : UNIFIED DARK MODE PREMIUM SAAS
   ───────────────────────────────────────────────────────────────────────────
   Directive Directeur : « heta desgin yewli zin » → design moderne, premium,
   visuellement cohérent et reposant pour les yeux.

   STRATÉGIE
   ─────────
   • Palette de profondeur (3 niveaux) : slate-950 (app bg), slate-900
     (cards), slate-800 (interactive hover) — un seul look partout.
   • Textes : blanc / slate-200 (principal), slate-400 (secondaire),
     slate-500 (tertiaire). Plus rien de plus sombre.
   • Accents sémantiques : emerald-400 (succès), rose-500 (alerte),
     cyan-400 (interactif/focus). Les neons criards sont remplacés par
     des saturations sombres + bord coloré + glow doux.
   • Hover : `transform:scale(1.02)` + `transition:.18s ease-out` partout
     pour un toucher "premium". Ombres deep (shadow-lg + black/40), zéro
     drop-shadow criard.

   Chargé EN DERNIER (après v300/v302/v303/v304) → cascade gagnante par
   ordre, sans `!important` excessif sauf si nécessaire pour battre
   l'inline-style legacy.
═══════════════════════════════════════════════════════════════════════════ */


/* ═══════════════════════════════════════════════════════════════════════════
   §1. APP BACKGROUND — slate-950 partout
═══════════════════════════════════════════════════════════════════════════ */
html body:has(#p-app.on),
body:has(#p-app.on) {
  background: #020617 !important;          /* slate-950 — fond app */
}
html body:has(#p-app.on) #p-app,
body:has(#p-app.on) #p-app {
  background: #020617 !important;
}
/* Surfaces principales (sidebar, header, content area) */
html body:has(#p-app.on) .tb,
html body:has(#p-app.on) .tbr,
body:has(#p-app.on) .tb,
body:has(#p-app.on) .tbr {
  background: #020617 !important;
  border-bottom: 1px solid #1E293B !important;
}


/* ═══════════════════════════════════════════════════════════════════════════
   §2. CARDS — slate-900 + bord slate-800 + ombre deep
═══════════════════════════════════════════════════════════════════════════ */
html body:has(#p-app.on) .cd,
html body:has(#p-app.on) .kc,
html body:has(#p-app.on) .acard,
html body:has(#p-app.on) .bi-card,
html body:has(#p-app.on) .tbd-card,
html body:has(#p-app.on) .tbd-chart-wrap,
html body:has(#p-app.on) .ev-card,
html body:has(#p-app.on) .kpi-card,
html body:has(#p-app.on) .stat-card,
html body:has(#p-app.on) .mbrs-card,
html body:has(#p-app.on) .mbrs-stat,
html body:has(#p-app.on) .ns-step1,
html body:has(#p-app.on) .ns-step2,
html body:has(#p-app.on) .ns-step3,
html body:has(#p-app.on) .bx-hero,
html body:has(#p-app.on) .amt-box,
html body:has(#p-app.on) .opb,
html body:has(#p-app.on) .trb,
html body:has(#p-app.on) .mbrs-table-wrap {
  background: #0F172A !important;          /* slate-900 */
  border: 1px solid #1E293B !important;    /* slate-800 */
  color: #F1F5F9 !important;               /* slate-100 default text */
  border-radius: 14px !important;
  box-shadow: 0 8px 24px rgba(0,0,0,.45),
              0 2px 6px rgba(0,0,0,.30) !important;  /* deep shadow */
  transition: box-shadow .20s ease-out, border-color .20s ease-out;
}
/* Hover des cards "cliquables" — subtle lift */
html body:has(#p-app.on) .sc[onclick],
html body:has(#p-app.on) .cd[onclick],
html body:has(#p-app.on) .pc[onclick],
html body:has(#p-app.on) .opb[onclick],
html body:has(#p-app.on) .bi-card[onclick] {
  cursor: pointer;
}
html body:has(#p-app.on) .sc[onclick]:hover,
html body:has(#p-app.on) .cd[onclick]:hover,
html body:has(#p-app.on) .pc[onclick]:hover,
html body:has(#p-app.on) .opb[onclick]:hover,
html body:has(#p-app.on) .bi-card[onclick]:hover {
  border-color: #334155 !important;
  box-shadow: 0 12px 32px rgba(0,0,0,.55),
              0 4px 10px rgba(0,0,0,.40),
              0 0 0 1px rgba(34,211,238,.12) inset !important;
  transform: translateY(-1px);
}


/* ═══════════════════════════════════════════════════════════════════════════
   §3. TEXTE — hiérarchie 3 niveaux
═══════════════════════════════════════════════════════════════════════════ */
html body:has(#p-app.on) .cd .cd-h,
html body:has(#p-app.on) .acard .acard-h,
html body:has(#p-app.on) .bi-card-h,
html body:has(#p-app.on) .tbd-card-h,
html body:has(#p-app.on) .ev-card-h,
html body:has(#p-app.on) .mbrs-stat-val {
  color: #E2E8F0 !important;               /* slate-200 — titres */
  -webkit-text-fill-color: #E2E8F0 !important;
  font-weight: 900 !important;
}
/* Texte secondaire (tx2, labels métadonnées) */
html body:has(#p-app.on) [style*="color:var(--tx2)" i],
html body:has(#p-app.on) [style*="color: var(--tx2)" i] {
  color: #94A3B8 !important;               /* slate-400 */
  -webkit-text-fill-color: #94A3B8 !important;
}
/* Texte tertiaire (tx3) */
html body:has(#p-app.on) [style*="color:var(--tx3)" i],
html body:has(#p-app.on) [style*="color: var(--tx3)" i] {
  color: #64748B !important;               /* slate-500 */
  -webkit-text-fill-color: #64748B !important;
}


/* ═══════════════════════════════════════════════════════════════════════════
   §4. BOUTONS — interaction premium
═══════════════════════════════════════════════════════════════════════════ */
html body:has(#p-app.on) .btn,
html body:has(#p-app.on) button.btn {
  transition: all .18s ease-out !important;
  border-radius: 10px !important;
  font-weight: 800 !important;
  letter-spacing: .02em !important;
}
/* Hover lift subtil (cards et boutons) */
html body:has(#p-app.on) .btn:hover:not(:disabled):not([disabled]) {
  transform: translateY(-1px);
}
html body:has(#p-app.on) .btn:active:not(:disabled):not([disabled]) {
  transform: translateY(0) scale(.98);
}
/* Primary action — emerald success */
html body:has(#p-app.on) .btn.bg,
html body:has(#p-app.on) .btn.ba {
  background: linear-gradient(180deg, #059669, #047857) !important;
  border: 1px solid #10B981 !important;
  color: #FFFFFF !important;
  -webkit-text-fill-color: #FFFFFF !important;
  box-shadow: 0 6px 16px rgba(5,150,105,.25),
              0 2px 4px rgba(0,0,0,.20) !important;
}
html body:has(#p-app.on) .btn.bg:hover:not(:disabled):not([disabled]),
html body:has(#p-app.on) .btn.ba:hover:not(:disabled):not([disabled]) {
  background: linear-gradient(180deg, #10B981, #059669) !important;
  box-shadow: 0 10px 24px rgba(5,150,105,.35),
              0 3px 6px rgba(0,0,0,.25) !important;
}
/* Danger — rose */
html body:has(#p-app.on) .btn.br {
  background: linear-gradient(180deg, #E11D48, #BE123C) !important;
  border: 1px solid #F43F5E !important;
  color: #FFFFFF !important;
  -webkit-text-fill-color: #FFFFFF !important;
  box-shadow: 0 6px 16px rgba(225,29,72,.25),
              0 2px 4px rgba(0,0,0,.20) !important;
}
html body:has(#p-app.on) .btn.br:hover:not(:disabled):not([disabled]) {
  background: linear-gradient(180deg, #F43F5E, #E11D48) !important;
  box-shadow: 0 10px 24px rgba(225,29,72,.35),
              0 3px 6px rgba(0,0,0,.25) !important;
}
/* Secondary / ghost — slate neutre */
html body:has(#p-app.on) .btn.bgh {
  background: rgba(30,41,59,.65) !important;       /* slate-800/65 */
  border: 1px solid #334155 !important;            /* slate-700 */
  color: #E2E8F0 !important;
  -webkit-text-fill-color: #E2E8F0 !important;
  box-shadow: 0 2px 6px rgba(0,0,0,.20) !important;
}
html body:has(#p-app.on) .btn.bgh:hover:not(:disabled):not([disabled]) {
  background: rgba(30,41,59,.95) !important;
  border-color: #475569 !important;
  color: #FFFFFF !important;
  -webkit-text-fill-color: #FFFFFF !important;
}
/* Warning — amber */
html body:has(#p-app.on) .btn.bo {
  background: linear-gradient(180deg, #D97706, #B45309) !important;
  border: 1px solid #F59E0B !important;
  color: #FFFFFF !important;
  -webkit-text-fill-color: #FFFFFF !important;
  box-shadow: 0 6px 16px rgba(245,158,11,.25),
              0 2px 4px rgba(0,0,0,.20) !important;
}
html body:has(#p-app.on) .btn.bo:hover:not(:disabled):not([disabled]) {
  background: linear-gradient(180deg, #F59E0B, #D97706) !important;
  box-shadow: 0 10px 24px rgba(245,158,11,.35),
              0 3px 6px rgba(0,0,0,.25) !important;
}
/* Disabled — état clair mais accessible */
html body:has(#p-app.on) .btn:disabled,
html body:has(#p-app.on) .btn[disabled],
html body:has(#p-app.on) button:disabled,
html body:has(#p-app.on) button[disabled] {
  opacity: .55 !important;
  cursor: not-allowed !important;
  transform: none !important;
  box-shadow: none !important;
}


/* ═══════════════════════════════════════════════════════════════════════════
   §5. INPUTS — fond slate-950 + bord slate-700 + focus cyan-400
═══════════════════════════════════════════════════════════════════════════ */
html body:has(#p-app.on) input.fi,
html body:has(#p-app.on) select.fi,
html body:has(#p-app.on) textarea.fta {
  background: #020617 !important;          /* slate-950 */
  border: 1px solid #334155 !important;    /* slate-700 */
  color: #FFFFFF !important;
  -webkit-text-fill-color: #FFFFFF !important;
  border-radius: 10px !important;
  transition: border-color .15s ease-out, box-shadow .15s ease-out;
}
html body:has(#p-app.on) input.fi:focus,
html body:has(#p-app.on) select.fi:focus,
html body:has(#p-app.on) textarea.fta:focus {
  border-color: #22D3EE !important;        /* cyan-400 */
  outline: none !important;
  box-shadow: 0 0 0 3px rgba(34,211,238,.18) !important;
}
html body:has(#p-app.on) input.fi::placeholder,
html body:has(#p-app.on) textarea.fta::placeholder {
  color: #64748B !important;               /* slate-500 */
  -webkit-text-fill-color: #64748B !important;
}


/* ═══════════════════════════════════════════════════════════════════════════
   §6. DIVIDERS & BORDERS — slate-800 par défaut, 700/50 pour subtle
═══════════════════════════════════════════════════════════════════════════ */
html body:has(#p-app.on) hr,
html body:has(#p-app.on) [style*="border-top:1px solid var(--bdr)" i],
html body:has(#p-app.on) [style*="border-bottom:1px solid var(--bdr)" i] {
  border-color: rgba(51,65,85,.50) !important;  /* slate-700/50 */
}


/* ═══════════════════════════════════════════════════════════════════════════
   §7. SCROLLBARS — palette dark cohérente (Chromium/Webkit)
═══════════════════════════════════════════════════════════════════════════ */
html body:has(#p-app.on) ::-webkit-scrollbar {
  width: 10px; height: 10px;
}
html body:has(#p-app.on) ::-webkit-scrollbar-track {
  background: #0F172A;
}
html body:has(#p-app.on) ::-webkit-scrollbar-thumb {
  background: #334155;
  border-radius: 5px;
  border: 2px solid #0F172A;
}
html body:has(#p-app.on) ::-webkit-scrollbar-thumb:hover {
  background: #475569;
}
/* Firefox */
html body:has(#p-app.on) {
  scrollbar-color: #334155 #0F172A;
  scrollbar-width: thin;
}


/* ═══════════════════════════════════════════════════════════════════════════
   §8. SUPPRESSION DES NÉONS CRIARDS — remplace par ombres deep
═══════════════════════════════════════════════════════════════════════════ */
/* Anti-glow excessif : règle générale qui réduit les box-shadow > 18px à
   des valeurs raisonnables (sans casser les boutons sémantiques). */
html body:has(#p-app.on) .ni.on::before,
html body:has(#p-app.on) .ni.on::after {
  box-shadow: 0 0 8px rgba(34,211,238,.40) !important;  /* glow doux */
}


/* ═══════════════════════════════════════════════════════════════════════════
   §9. MODALES — fond sombre + ombre deep + backdrop
═══════════════════════════════════════════════════════════════════════════ */
html body:has(#p-app.on) .ov {
  background: rgba(2,6,23,.78) !important;          /* slate-950/78 */
  -webkit-backdrop-filter: blur(8px);
  backdrop-filter: blur(8px);
}
html body:has(#p-app.on) .md {
  background: #0F172A !important;
  border: 1px solid #1E293B !important;
  color: #F1F5F9 !important;
  box-shadow: 0 24px 64px rgba(0,0,0,.65),
              0 8px 16px rgba(0,0,0,.40) !important;
  border-radius: 18px !important;
}


/* ═══════════════════════════════════════════════════════════════════════════
   §10. ANTI bg-white & bg-gray-* (catch-all FINAL pour l'app)
═══════════════════════════════════════════════════════════════════════════ */
html body:has(#p-app.on) #p-app [style*="background:#FFFFFF" i]:not(.ev-allow-white):not(input):not(button):not(select):not(textarea),
html body:has(#p-app.on) #p-app [style*="background:#fff" i]:not(.ev-allow-white):not(input):not(button):not(select):not(textarea),
html body:has(#p-app.on) #p-app [style*="background: #FFFFFF" i]:not(.ev-allow-white):not(input):not(button):not(select):not(textarea),
html body:has(#p-app.on) #p-app [style*="background-color:#FFFFFF" i]:not(.ev-allow-white):not(input):not(button):not(select):not(textarea),
html body:has(#p-app.on) #p-app [style*="background-color:#fff" i]:not(.ev-allow-white):not(input):not(button):not(select):not(textarea) {
  background: #0F172A !important;          /* slate-900 */
  border-color: #1E293B !important;
}
/* Backgrounds gris pâle (#F8FAFC, #F1F5F9, #E2E8F0 utilisés comme bg) → slate-950 */
html body:has(#p-app.on) #p-app [style*="background:#F8FAFC" i]:not(input):not(button):not(select):not(textarea),
html body:has(#p-app.on) #p-app [style*="background:#F1F5F9" i]:not(input):not(button):not(select):not(textarea),
html body:has(#p-app.on) #p-app [style*="background:#FAFAFA" i]:not(input):not(button):not(select):not(textarea) {
  background: #020617 !important;
  border-color: #1E293B !important;
}


/* ═══════════════════════════════════════════════════════════════════════════
   §11. TYPO — tabular-nums sur tous les montants pour stabilité visuelle
═══════════════════════════════════════════════════════════════════════════ */
html body:has(#p-app.on) [class*="amt"],
html body:has(#p-app.on) [class*="-amt"],
html body:has(#p-app.on) .kv,
html body:has(#p-app.on) .opca,
html body:has(#p-app.on) .tbd-card-value,
html body:has(#p-app.on) .bh-am,
html body:has(#p-app.on) .mbrs-stat-val {
  font-variant-numeric: tabular-nums !important;
}


/* ═══════════════════════════════════════════════════════════════════════════
   §12. EXTENSION 2026-05-26 — Couverture Tailwind classes + hover scale
═══════════════════════════════════════════════════════════════════════════ */

/* Classes Tailwind directes : `bg-white`, `tw-bg-white`, `bg-gray-50`,
   `bg-slate-50` — au cas où elles seraient utilisées en plus des inline
   styles. Forcées en slate-900 sur l'app authentifiée. */
html body:has(#p-app.on) #p-app .bg-white,
html body:has(#p-app.on) #p-app .tw-bg-white,
html body:has(#p-app.on) #p-app .bg-gray-50,
html body:has(#p-app.on) #p-app .tw-bg-gray-50,
html body:has(#p-app.on) #p-app .bg-gray-100,
html body:has(#p-app.on) #p-app .tw-bg-gray-100,
html body:has(#p-app.on) #p-app .bg-slate-50,
html body:has(#p-app.on) #p-app .tw-bg-slate-50,
html body:has(#p-app.on) #p-app .bg-slate-100,
html body:has(#p-app.on) #p-app .tw-bg-slate-100 {
  background: #0F172A !important;
  border-color: #1E293B !important;
}
html body:has(#p-app.on) #p-app .text-gray-900,
html body:has(#p-app.on) #p-app .tw-text-gray-900,
html body:has(#p-app.on) #p-app .text-slate-900,
html body:has(#p-app.on) #p-app .tw-text-slate-900,
html body:has(#p-app.on) #p-app .text-black,
html body:has(#p-app.on) #p-app .tw-text-black {
  color: #F1F5F9 !important;
  -webkit-text-fill-color: #F1F5F9 !important;
}

/* Hover scale [1.02] explicite sur les boutons d'action primaires et
   cards cliquables (vient s'ajouter au translateY-1 existant pour donner
   un toucher "premium SaaS" plus marqué). */
html body:has(#p-app.on) .btn.bg:hover:not(:disabled):not([disabled]),
html body:has(#p-app.on) .btn.ba:hover:not(:disabled):not([disabled]),
html body:has(#p-app.on) .btn.br:hover:not(:disabled):not([disabled]),
html body:has(#p-app.on) .btn.bo:hover:not(:disabled):not([disabled]) {
  transform: translateY(-1px) scale(1.02);
}
html body:has(#p-app.on) .btn.bg:active:not(:disabled):not([disabled]),
html body:has(#p-app.on) .btn.ba:active:not(:disabled):not([disabled]),
html body:has(#p-app.on) .btn.br:active:not(:disabled):not([disabled]),
html body:has(#p-app.on) .btn.bo:active:not(:disabled):not([disabled]) {
  transform: translateY(0) scale(.97);
}

/* Cards primaires (cd, bi-card, tbd-card, ev-card) — hover-scale subtil
   sur les containers cliquables. Le `:where()` baisse la spécificité
   pour ne pas écraser des hovers spécifiques d'autres composants. */
html body:has(#p-app.on) :where(.sc, .opb, .mbrs-card, .ev-card)[onclick]:hover {
  transform: translateY(-2px) scale(1.01);
  border-color: #475569 !important;          /* slate-600 — bord plus marqué au hover */
}

/* Focus-visible — anneau cyan-400 cohérent sur tout élément interactif
   (boutons, liens, inputs). Améliore la navigation clavier sans
   sacrifier le look. */
html body:has(#p-app.on) button:focus-visible,
html body:has(#p-app.on) a:focus-visible,
html body:has(#p-app.on) [role="button"]:focus-visible,
html body:has(#p-app.on) [tabindex]:focus-visible {
  outline: none !important;
  box-shadow: 0 0 0 3px rgba(34,211,238,.40),
              0 0 0 1px #22D3EE !important;
  border-radius: 10px;
}

/* ═══════════════════════════════════════════════════════════════════════════
   §13. EXTENSION — Surfaces interactives secondaires (tabs, pills, badges)
═══════════════════════════════════════════════════════════════════════════ */

/* Tabs / segmented controls — slate-800 inactif, cyan-400 actif. */
html body:has(#p-app.on) .atab,
html body:has(#p-app.on) .tab:not(.on) {
  background: rgba(30,41,59,.40) !important;
  color: #CBD5E1 !important;
  -webkit-text-fill-color: #CBD5E1 !important;
  border: 1px solid #334155 !important;
  transition: all .18s ease-out !important;
}
html body:has(#p-app.on) .atab:hover:not(.on),
html body:has(#p-app.on) .tab:not(.on):hover {
  background: rgba(30,41,59,.70) !important;
  color: #FFFFFF !important;
  -webkit-text-fill-color: #FFFFFF !important;
}
html body:has(#p-app.on) .atab.on,
html body:has(#p-app.on) .tab.on {
  background: #0F172A !important;
  color: #22D3EE !important;
  -webkit-text-fill-color: #22D3EE !important;
  border: 1px solid #22D3EE !important;
  box-shadow: 0 0 0 1px rgba(34,211,238,.20) inset !important;
}


/* ═══════════════════════════════════════════════════════════════════════════
   §14. EXTENSION — Animation Page Mount (smooth fade-in)
═══════════════════════════════════════════════════════════════════════════ */

@keyframes evPolishFadeIn {
  from { opacity: 0; transform: translateY(6px); }
  to   { opacity: 1; transform: translateY(0); }
}
html body:has(#p-app.on) .scrl > .cd,
html body:has(#p-app.on) .scrl > .bi-card,
html body:has(#p-app.on) .scrl > .tbd-card,
html body:has(#p-app.on) .scrl > .acard {
  animation: evPolishFadeIn .28s ease-out both;
}
/* Respecter prefers-reduced-motion */
@media (prefers-reduced-motion: reduce) {
  html body:has(#p-app.on) * {
    animation-duration: .01s !important;
    transition-duration: .01s !important;
  }
}


/* Fin du fichier — ev-global-polish-v305.css */

/* =============== /css/ev-pro-polish-v306.css?v=306-pro-20260530 =============== */
/* ═══════════════════════════════════════════════════════════════════════════
   ev-pro-polish-v306.css  —  2026-05-30
   ───────────────────────────────────────────────────────────────────────────
   POLISH PRO v306 — finition « professionnelle + ergonomique »
   ───────────────────────────────────────────────────────────────────────────
   Directive Directeur : rendre les fonctions déjà présentables plus
   professionnelles et plus esthétiques, SANS toucher au métier (CSS only).

   Chargé EN DERNIER (après v305) → gagne la cascade par ordre.
   Aucune règle ne touche la logique JS ni les valeurs métier.

   Palette verrouillée (cf. unified-dark-v304 / no-fancy-colors) :
     fonds   #020617 / #0F172A / #1E293B
     texte   #FFFFFF / #F1F5F9 / #CBD5E1 / #94A3B8   (jamais plus sombre)
     accent  cyan #22D3EE (interactif/focus) — vif réservé aux bords/glow
   ═══════════════════════════════════════════════════════════════════════════ */


/* ═══════════════════════════════════════════════════════════════════════════
   §1. NAV LATÉRALE (desktop) — fin des restes thème CLAIR
   ───────────────────────────────────────────────────────────────────────────
   Bug réel : .evcx-side gardait texte #475569 (illisible sur #020617),
   hover #F8FAFC (flash BLANC), actif teal #2D5A60 hors-palette.
   → texte lisible, hover sombre, état actif barre d'accent cyan = look SaaS.
═══════════════════════════════════════════════════════════════════════════ */
body:has(#p-app.on) .evcx-side,
body:has(#p-app.on) .evcx-sub {
  color: #CBD5E1 !important;            /* slate-300 — lisible */
  -webkit-text-fill-color: #CBD5E1 !important;
  letter-spacing: .01em;
  transition: background .16s ease-out, color .16s ease-out,
              box-shadow .16s ease-out !important;
}
body:has(#p-app.on) .evcx-side:hover,
body:has(#p-app.on) .evcx-sub:hover {
  background: rgba(30,41,59,.70) !important;   /* slate-800/70, plus de blanc */
  color: #FFFFFF !important;
  -webkit-text-fill-color: #FFFFFF !important;
}
body:has(#p-app.on) .evcx-side:hover .evcx-ic,
body:has(#p-app.on) .evcx-side.evcx-navactive .evcx-ic {
  opacity: 1;
}
/* État actif — surface slate-800 + barre d'accent cyan à gauche + label blanc */
body:has(#p-app.on) .evcx-side.evcx-navactive,
body:has(#p-app.on) .evcx-sub.evcx-navactive {
  background: rgba(34,211,238,.10) !important;
  color: #FFFFFF !important;
  -webkit-text-fill-color: #FFFFFF !important;
  font-weight: 800 !important;
  box-shadow: inset 3px 0 0 0 #22D3EE,
              0 1px 3px rgba(0,0,0,.30) !important;
}
/* Icône légèrement atténuée au repos pour la hiérarchie */
body:has(#p-app.on) .evcx-side .evcx-ic { opacity: .82; transition: opacity .16s; }


/* ═══════════════════════════════════════════════════════════════════════════
   §2. BOTTOM NAV (mobile) — actif cyan + indicateur haut
═══════════════════════════════════════════════════════════════════════════ */
body:has(#p-app.on) .evcx-bn {
  color: #94A3B8 !important;
  -webkit-text-fill-color: #94A3B8 !important;
  transition: color .16s ease-out !important;
  position: relative;
}
body:has(#p-app.on) .evcx-bn.evcx-navactive {
  color: #22D3EE !important;
  -webkit-text-fill-color: #22D3EE !important;
}
/* Petit trait indicateur au-dessus de l'item actif */
body:has(#p-app.on) .evcx-bn.evcx-navactive::before {
  content: "";
  position: absolute;
  top: 0; left: 50%; transform: translateX(-50%);
  width: 26px; height: 3px; border-radius: 0 0 3px 3px;
  background: #22D3EE;
  box-shadow: 0 0 8px rgba(34,211,238,.55);
}
body:has(#p-app.on) .evcx-bn:active { transform: scale(.94); }


/* ═══════════════════════════════════════════════════════════════════════════
   §3. TABLES DE DONNÉES (.tbl2) — Clients / Équipe / Rapports / Caisse PRO
   ───────────────────────────────────────────────────────────────────────────
   En-tête sticky OPAQUE (sinon les lignes transparaissent au scroll),
   hover de ligne plus net, 1ʳᵉ colonne mise en valeur, chiffres tabulaires.
═══════════════════════════════════════════════════════════════════════════ */
body:has(#p-app.on) .tbl2 th {
  background: #1E293B !important;        /* slate-800 opaque — fix scroll */
  color: #CBD5E1 !important;
  -webkit-text-fill-color: #CBD5E1 !important;
  font-weight: 800 !important;
  letter-spacing: .06em !important;
  border-bottom: 1px solid #334155 !important;
  z-index: 2;
  white-space: nowrap;
}
body:has(#p-app.on) .tbl2 td {
  border-bottom: 1px solid rgba(51,65,85,.45) !important;  /* slate-700/45 */
  color: #E2E8F0 !important;
}
/* Zebra douce + hover de ligne net (remplace le 5% trop discret) */
body:has(#p-app.on) .tbl2 tbody tr:nth-child(even) td {
  background: rgba(30,41,59,.28);
}
body:has(#p-app.on) .tbl2 tbody tr:hover td {
  background: rgba(34,211,238,.08) !important;
}
/* 1ʳᵉ colonne (nom/identité) plus présente */
body:has(#p-app.on) .tbl2 tbody td:first-child {
  color: #FFFFFF !important;
  font-weight: 600;
}
/* Tous les nombres en chiffres tabulaires pour l'alignement vertical */
body:has(#p-app.on) .tbl2 td,
body:has(#p-app.on) .tbl2 th { font-variant-numeric: tabular-nums; }


/* ═══════════════════════════════════════════════════════════════════════════
   §4. FORMULAIRES — labels micro-typo + champ requis + espacement
═══════════════════════════════════════════════════════════════════════════ */
body:has(#p-app.on) .fg { gap: 7px !important; }
body:has(#p-app.on) .fl {
  font-size: 11.5px !important;
  font-weight: 700 !important;
  letter-spacing: .05em !important;
  text-transform: uppercase;
  color: #94A3B8 !important;
  -webkit-text-fill-color: #94A3B8 !important;
}
/* Astérisque rouge discret pour les libellés requis (classe .req) */
body:has(#p-app.on) .fl.req::after,
body:has(#p-app.on) .fl[data-req]::after {
  content: " *";
  color: #F43F5E;
  -webkit-text-fill-color: #F43F5E;
  font-weight: 800;
}


/* ═══════════════════════════════════════════════════════════════════════════
   §5. ÉTATS VIDES (.emp) — centrés, posés, lisibles
═══════════════════════════════════════════════════════════════════════════ */
body:has(#p-app.on) .emp {
  display: flex; flex-direction: column;
  align-items: center; justify-content: center;
  text-align: center;
  color: #94A3B8 !important;
  -webkit-text-fill-color: #94A3B8 !important;
  gap: 8px; padding: 28px 16px;
}
body:has(#p-app.on) .emp .ei,
body:has(#p-app.on) .emp > span:first-child {
  font-size: 42px !important;
  opacity: .42 !important;
  filter: grayscale(.2);
}


/* ═══════════════════════════════════════════════════════════════════════════
   §6. TOASTS — entrée souple + barre sémantique cohérente
═══════════════════════════════════════════════════════════════════════════ */
#toast, #mb-toast {
  border-radius: 12px !important;
  box-shadow: 0 16px 40px rgba(0,0,0,.50), 0 4px 10px rgba(0,0,0,.30) !important;
  font-weight: 700 !important;
  letter-spacing: .01em;
  border-left: 4px solid #22D3EE;        /* info par défaut */
}
.toast.success, #toast.success, #mb-toast.success { border-left-color: #10B981 !important; }
.toast.error, .toast.critique, .toast.danger,
#toast.error, #mb-toast.error { border-left-color: #F43F5E !important; }
.toast.warn, .toast.warning, #toast.warn { border-left-color: #F59E0B !important; }


/* ═══════════════════════════════════════════════════════════════════════════
   §7. TITRES — en-têtes de carte et de modale homogènes
═══════════════════════════════════════════════════════════════════════════ */
body:has(#p-app.on) .cd-h {
  letter-spacing: -.01em;
  font-weight: 900 !important;
}
/* Filet de séparation sous le titre de modale pour structurer le contenu */
body:has(#p-app.on) .mdt {
  padding-bottom: 12px;
  border-bottom: 1px solid rgba(51,65,85,.45);
  margin-bottom: 4px;
}
/* Footer de modale : léger filet haut pour décoller les actions du contenu */
body:has(#p-app.on) .mdb {
  padding-top: 12px;
  border-top: 1px solid rgba(51,65,85,.40);
}


/* ═══════════════════════════════════════════════════════════════════════════
   §8. PILLS / TAGS (.tg) — rendu net et homogène
═══════════════════════════════════════════════════════════════════════════ */
body:has(#p-app.on) .tg {
  font-weight: 700 !important;
  letter-spacing: .02em;
  font-variant-numeric: tabular-nums;
  border-radius: 999px !important;
}


/* ═══════════════════════════════════════════════════════════════════════════
   §9. DÉTAILS — sélection texte + liens cohérents avec l'accent
═══════════════════════════════════════════════════════════════════════════ */
body:has(#p-app.on) ::selection {
  background: rgba(34,211,238,.30);
  color: #FFFFFF;
}
body:has(#p-app.on) #p-app a:not(.btn) {
  color: #38BDF8;                        /* sky-400 — lien lisible */
  text-underline-offset: 2px;
}
body:has(#p-app.on) #p-app a:not(.btn):hover { color: #7DD3FC; }


/* ═══════════════════════════════════════════════════════════════════════════
   §10. ACCESSIBILITÉ MOUVEMENT — respect prefers-reduced-motion
═══════════════════════════════════════════════════════════════════════════ */
@media (prefers-reduced-motion: reduce) {
  body:has(#p-app.on) .evcx-side,
  body:has(#p-app.on) .evcx-bn,
  body:has(#p-app.on) .evcx-bn.evcx-navactive::before {
    transition: none !important;
    animation: none !important;
  }
}

/* Fin du fichier — ev-pro-polish-v306.css */

/* =============== /css/ev-pro-polish-v307.css?v=307-pro-20260530 =============== */
/* ═══════════════════════════════════════════════════════════════════════════
   ev-pro-polish-v307.css  —  2026-05-30
   ───────────────────────────────────────────────────────────────────────────
   FINITION PRO v307 — netteté typographique + cohérence, PORTÉE GLOBALE.
   ───────────────────────────────────────────────────────────────────────────
   Audit complet 2026-05-30 : données saines, 0 endpoint/bouton mort. Ce volet
   ne touche QUE l'esthétique (CSS), zéro logique métier.

   Différence avec v305/v306 (scopés `body:has(#p-app.on)` = app staff) :
   v307 s'applique AUSSI à l'espace client (PWA membre) et à l'accueil, pour une
   identité visuelle homogène et premium partout.

   Chargé EN DERNIER → gagne la cascade.
   ═══════════════════════════════════════════════════════════════════════════ */


/* ═══════════════════════════════════════════════════════════════════════════
   §1. NETTETÉ TYPOGRAPHIQUE GLOBALE — rendu crisp « app native »
   ═══════════════════════════════════════════════════════════════════════════ */
html, body {
  -webkit-font-smoothing: antialiased;
  -moz-osx-font-smoothing: grayscale;
  text-rendering: optimizeLegibility;
}
/* Titres : interlettrage resserré pour un rendu pro (sans toucher la taille). */
h1, h2, h3, .cd-h, .mdt, .acard-h, .bi-card-h, .tbd-card-h {
  text-rendering: optimizeLegibility;
  letter-spacing: -.01em;
}


/* ═══════════════════════════════════════════════════════════════════════════
   §2. MONTANTS — chiffres tabulaires + ligatures off PARTOUT (app + client)
   ───────────────────────────────────────────────────────────────────────────
   Stabilise l'alignement vertical des montants (les colonnes de DH ne
   « dansent » plus quand les chiffres changent). Couvre aussi l'espace client.
   ═══════════════════════════════════════════════════════════════════════════ */
.kv, .kpi-val, .kpi, .opca, .tbd-card-value, .bh-am,
.mbrs-stat-val, .tbl2 td, .tbl2 th,
[class*="amt"], [class*="-amt"], [class*="solde"], [class*="-mont"],
.ev-money, .mb-solde, .mb-pts, #tb-pts {
  font-variant-numeric: tabular-nums;
  font-feature-settings: "tnum" 1;
}


/* ═══════════════════════════════════════════════════════════════════════════
   §3. CONFORT DE LECTURE — corps de texte & interlignage
   ═══════════════════════════════════════════════════════════════════════════ */
body { line-height: 1.5; }
/* Empêche les débordements de mots longs (emails, codes) qui cassent les cartes. */
.cd, .md, .bi-card, .acard, .tbd-card, .ev-card,
.cr, .hi-item, td, .bx-i, .bx-w, .bx-ok, .bx-e, .bx-s {
  overflow-wrap: anywhere;
  word-break: break-word;
}


/* ═══════════════════════════════════════════════════════════════════════════
   §4. INTERACTION TACTILE — cibles confortables (mobile pro)
   ───────────────────────────────────────────────────────────────────────────
   Retire le flash bleu de tap sur mobile + garantit des zones cliquables
   confortables sur les boutons d'action (≥ 40px), sans changer leur style.
   ═══════════════════════════════════════════════════════════════════════════ */
* { -webkit-tap-highlight-color: rgba(34,211,238,.18); }
button, .btn, [role="button"], .evcx-side, .evcx-bn, .pc[onclick] {
  -webkit-touch-callout: none;
  touch-action: manipulation;            /* supprime le délai de 300ms */
}
@media (pointer: coarse) {
  .btn, button.btn { min-height: 40px; }
}


/* ═══════════════════════════════════════════════════════════════════════════
   §5. IMAGES & MÉDIAS — jamais de débordement, rendu net
   ═══════════════════════════════════════════════════════════════════════════ */
img, svg, canvas { max-width: 100%; }
img { height: auto; }


/* ═══════════════════════════════════════════════════════════════════════════
   §6. COHÉRENCE DES ANGLES — rayon homogène sur les surfaces principales
   (uniquement dans l'app staff pour ne pas perturber l'accueil/PWA client)
   ═══════════════════════════════════════════════════════════════════════════ */
body:has(#p-app.on) .bx-i,
body:has(#p-app.on) .bx-w,
body:has(#p-app.on) .bx-ok,
body:has(#p-app.on) .bx-e,
body:has(#p-app.on) .bx-s {
  border-radius: 12px !important;
}
/* Pills de statut (.tg) : padding homogène + ne se compriment pas. */
body:has(#p-app.on) .tg {
  padding: 4px 11px !important;
  white-space: nowrap;
  display: inline-flex;
  align-items: center;
  gap: 5px;
}


/* ═══════════════════════════════════════════════════════════════════════════
   §7. SCROLL FLUIDE + ancrage (UX pro), respect reduced-motion
   ═══════════════════════════════════════════════════════════════════════════ */
@media (prefers-reduced-motion: no-preference) {
  .scrl, .pw2 { scroll-behavior: smooth; }
}


/* ═══════════════════════════════════════════════════════════════════════════
   §8. SÉLECTION DE TEXTE — cohérente sur toute l'app (pas seulement #p-app)
   ═══════════════════════════════════════════════════════════════════════════ */
::selection { background: rgba(34,211,238,.28); }


/* Fin du fichier — ev-pro-polish-v307.css */

/* =============== /css/ev-client-dark-v308.css?v=308b-clientdark-20260530 =============== */
/* ═══════════════════════════════════════════════════════════════════════════
   ev-client-dark-v308.css  —  2026-05-30
   ───────────────────────────────────────────────────────────────────────────
   ESPACE CLIENT (PWA membre) → THÈME SOMBRE PREMIUM
   ───────────────────────────────────────────────────────────────────────────
   Décision Directeur : harmoniser l'espace client (#mb-p-app) avec le sombre
   premium de l'app staff. CSS-only, réversible (retirer le <link>).

   PORTÉE STRICTE : tout est scopé sous #mb-p-app / #mode-membre → ne peut PAS
   toucher l'app staff (body:has(#p-app.on)) ni l'accueil public (#p-auth).

   Palette (alignée v304/v305) :
     fonds   #020617 (app) · #0F172A (cartes/sidebar) · #1E293B (interactif)
     texte   #FFFFFF / #F1F5F9 / #CBD5E1 / #94A3B8   (jamais plus sombre)
     accent  cyan #22D3EE (interactif) ; vert/rouge = badges/bords uniquement
   ═══════════════════════════════════════════════════════════════════════════ */


/* ═══════════════════════════════════════════════════════════════════════════
   §1. COQUE — fonds sombres (shell, main, home, conteneurs clairs en dur)
   ═══════════════════════════════════════════════════════════════════════════ */
#mode-membre, #mb-app, #mb-p-app { background: #020617 !important; }
#mb-p-app .mb-shell,
#mb-p-app .mb-main,
#mb-p-app .mb-home,
#mb-p-app #s-home,
#mb-p-app [class*="tw-bg-slate-50"] {
  background: #020617 !important;
}
/* Catch-all : tout fond clair en dur (inline) dans l'espace client → slate-950 */
#mb-p-app [style*="background:#F8FAFC" i],
#mb-p-app [style*="background:#FAFAFA" i],
#mb-p-app [style*="background-color:#F8FAFC" i] {
  background: #020617 !important;
}


/* ═══════════════════════════════════════════════════════════════════════════
   §2. SIDEBAR (PC) + HEADER MOBILE — surfaces slate-900, bordure slate-800
   ═══════════════════════════════════════════════════════════════════════════ */
#mb-p-app aside,
#mb-p-app .mb-sidebar {
  background: #0F172A !important;
  border-right: 1px solid #1E293B !important;
}
#mb-p-app #mb-mobile-header,
#mb-p-app header[id="mb-mobile-header"] {
  background: #0F172A !important;
  border-bottom: 1px solid #1E293B !important;
}
/* Brand + libellés header → clair */
#mb-p-app [class*="tw-text-[#2D5A60]"],
#mb-p-app .mb-brand { color: #F1F5F9 !important; -webkit-text-fill-color:#F1F5F9 !important; }
/* Carte « utilisateur » (avatar + nom + solde) dans la sidebar */
#mb-p-app [class*="tw-bg-[#F8FAFC]"],
#mb-p-app .mb-user {
  background: #131C2E !important;
  border: 1px solid #1E293B !important;
}
/* Avatar : on garde un disque d'accent (teal → cyan brand) lisible */
#mb-p-app #tb-av {
  background: linear-gradient(135deg,#155E63,#0E7490) !important;
  color: #FFFFFF !important;
}


/* ═══════════════════════════════════════════════════════════════════════════
   §3. NAVIGATION (.evcx-side / .evcx-sub) — même look que l'app staff (v306)
   ───────────────────────────────────────────────────────────────────────────
   La base (index.html l.103) est en thème clair ; on la repeint ici pour
   l'espace membre, avec barre d'accent cyan sur l'item actif.
   ═══════════════════════════════════════════════════════════════════════════ */
#mb-p-app .evcx-side,
#mb-p-app .evcx-sub {
  color: #CBD5E1 !important;
  -webkit-text-fill-color: #CBD5E1 !important;
  transition: background .16s ease-out, color .16s ease-out, box-shadow .16s ease-out !important;
}
#mb-p-app .evcx-side:hover,
#mb-p-app .evcx-sub:hover {
  background: rgba(30,41,59,.70) !important;
  color: #FFFFFF !important;
  -webkit-text-fill-color: #FFFFFF !important;
}
#mb-p-app .evcx-side.evcx-navactive {
  background: rgba(34,211,238,.10) !important;
  color: #FFFFFF !important;
  -webkit-text-fill-color: #FFFFFF !important;
  font-weight: 800 !important;
  box-shadow: inset 3px 0 0 0 #22D3EE, 0 1px 3px rgba(0,0,0,.30) !important;
}


/* ═══════════════════════════════════════════════════════════════════════════
   §4. CARTES — surfaces slate-900 + bord slate-800 + ombre deep
   ═══════════════════════════════════════════════════════════════════════════ */
#mb-p-app .cd,
#mb-p-app .mb-card,
#mb-p-app .mb-cards > *,
#mb-p-app [style*="background:#FFFFFF" i]:not(input):not(button):not(select):not(textarea),
#mb-p-app [style*="background:#fff" i]:not(input):not(button):not(select):not(textarea),
#mb-p-app [style*="background-color:#FFFFFF" i]:not(input):not(button):not(select):not(textarea),
#mb-p-app [style*="background-color:#fff" i]:not(input):not(button):not(select):not(textarea) {
  background: #0F172A !important;
  border-color: #1E293B !important;
  color: #F1F5F9 !important;
  box-shadow: 0 8px 24px rgba(0,0,0,.45), 0 2px 6px rgba(0,0,0,.30) !important;
}
/* Petits fonds gris pâle (#F1F5F9) utilisés comme séparateurs/lignes → slate-800 */
#mb-p-app [style*="background:#F1F5F9" i]:not(input):not(button):not(select):not(textarea),
#mb-p-app [style*="background-color:#F1F5F9" i]:not(input):not(button):not(select):not(textarea) {
  background: #1E293B !important;
}
/* Bordures claires en dur → slate-800 */
#mb-p-app [style*="border:1px solid #E2E8F0" i],
#mb-p-app [style*="border-bottom:1px solid #F1F5F9" i],
#mb-p-app [style*="border-top:1px solid #F1F5F9" i],
#mb-p-app [style*="border-bottom:1px solid #e2e8f0" i] {
  border-color: #1E293B !important;
}


/* ═══════════════════════════════════════════════════════════════════════════
   §5. TEXTE — niveaux de gris clairs (catch-all sur les sombres en dur)
   ═══════════════════════════════════════════════════════════════════════════ */
#mb-p-app [style*="color:#1F2937" i],
#mb-p-app [style*="color:#1f2937" i],
#mb-p-app [style*="color:#1e293b" i],
#mb-p-app [style*="color:#0F172A" i],
#mb-p-app [style*="color:#334155" i],
#mb-p-app [class*="tw-text-[#1F2937]"] {
  color: #F1F5F9 !important; -webkit-text-fill-color:#F1F5F9 !important;
}
#mb-p-app [style*="color:#475569" i],
#mb-p-app [style*="color:#64748B" i],
#mb-p-app [style*="color:#64748b" i],
#mb-p-app [class*="tw-text-[#64748B]"],
#mb-p-app .mb-user-bal {
  color: #94A3B8 !important; -webkit-text-fill-color:#94A3B8 !important;
}
/* #94A3B8 déjà clair : on le garde tel quel (lisible sur sombre). */


/* ═══════════════════════════════════════════════════════════════════════════
   §6. SÉMANTIQUE crédit / débit / déconnexion
   ───────────────────────────────────────────────────────────────────────────
   Règle projet : le `color:` du texte reste en gris clair ; le vert/rouge ne
   vit que sur les badges (pills, alpha) et les bords. On retravaille donc les
   pastilles de l'historique portefeuille et on éclaircit les montants.
   ═══════════════════════════════════════════════════════════════════════════ */
/* Montants verts (#10B981/#047857) utilisés en texte → blanc (lisible sombre) */
#mb-p-app [style*="color:#10B981" i],
#mb-p-app [style*="color:#10b981" i],
#mb-p-app [style*="color:#047857" i] {
  color: #FFFFFF !important; -webkit-text-fill-color:#FFFFFF !important;
}
/* Pastille « Cashback » (fond vert clair #D1FAE5 / texte #047857) → badge sombre */
#mb-p-app [style*="background:#D1FAE5" i] {
  background: rgba(16,185,129,.18) !important;
  color: #6EE7B7 !important; -webkit-text-fill-color:#6EE7B7 !important;
}
/* Pastille « Utilisation » (fond #F1F5F9 / texte #475569) déjà couverte §4/§5 :
   bg slate-800, on force juste un texte lisible. */
#mb-p-app span[style*="background:#F1F5F9" i] {
  color: #CBD5E1 !important; -webkit-text-fill-color:#CBD5E1 !important;
}
/* Bouton/lien déconnexion (rouge #EF4444) : on le garde rouge mais on l'éclaircit
   pour le contraste sur fond sombre (action sémantique, sur un bouton). */
#mb-p-app [style*="color:#ef4444" i],
#mb-p-app [style*="color:#EF4444" i] {
  color: #F87171 !important; -webkit-text-fill-color:#F87171 !important;
}


/* ═══════════════════════════════════════════════════════════════════════════
   §7. INPUTS / TEXTAREA — fond sombre, focus cyan (chat, formulaires client)
   ═══════════════════════════════════════════════════════════════════════════ */
#mb-p-app input:not([type="checkbox"]):not([type="radio"]),
#mb-p-app select,
#mb-p-app textarea {
  background: #020617 !important;
  border: 1px solid #334155 !important;
  color: #FFFFFF !important;
  -webkit-text-fill-color: #FFFFFF !important;
  color-scheme: dark;
}
#mb-p-app input:focus, #mb-p-app select:focus, #mb-p-app textarea:focus {
  border-color: #22D3EE !important;
  box-shadow: 0 0 0 3px rgba(34,211,238,.18) !important;
  outline: none !important;
}
#mb-p-app input::placeholder, #mb-p-app textarea::placeholder {
  color: #64748B !important; -webkit-text-fill-color:#64748B !important;
}


/* ═══════════════════════════════════════════════════════════════════════════
   §8. TABLES (historique portefeuille) — en-tête + lignes sombres
   ═══════════════════════════════════════════════════════════════════════════ */
#mb-p-app table { color: #E2E8F0 !important; }
#mb-p-app th { background:#1E293B !important; color:#CBD5E1 !important; -webkit-text-fill-color:#CBD5E1 !important; }
#mb-p-app td { border-color: rgba(51,65,85,.45) !important; }


/* ═══════════════════════════════════════════════════════════════════════════
   §9. SCROLLBARS sombres + sélection cyan (cohérence avec l'app staff)
   ═══════════════════════════════════════════════════════════════════════════ */
#mb-p-app ::-webkit-scrollbar { width:10px; height:10px; }
#mb-p-app ::-webkit-scrollbar-track { background:#0F172A; }
#mb-p-app ::-webkit-scrollbar-thumb { background:#334155; border-radius:5px; border:2px solid #0F172A; }
#mb-p-app ::-webkit-scrollbar-thumb:hover { background:#475569; }
#mb-p-app { scrollbar-color:#334155 #0F172A; scrollbar-width:thin; }


/* Fin du fichier — ev-client-dark-v308.css */

/* =============== /css/ev-director-darkcards-v309.css?v=313-fidelity-middle-20260612 =============== */
/* ═══════════════════════════════════════════════════════════════════════════
   ev-director-darkcards-v309.css  —  2026-06-11
   ───────────────────────────────────────────────────────────────────────────
   OBJET : finir le thème sombre unifié (v304) sur TOUT l'espace STAFF
   (Directeur + Manager + Opérateur). v304 neutralise le blanc pur
   (#FFFFFF / #fff / white) mais PAS les fonds pastel clairs
   (#FFF7ED orange, #EFF4FF bleu, #ECFDF5 vert, #FEF2F2 rouge, #F1F5F9 gris…)
   injectés en inline par app.js. Sur les dashboards staff ces cartes
   ressortaient en clair = taches blanches sur fond #0A0E17.

   STRATÉGIE
   ─────────
   • SCOPE = `body.in-app` → ajoutée UNIQUEMENT dans startApp() (app.js l.6354),
     c.-à-d. pour le staff (director/manager/operator). L'espace CLIENT/membre
     passe par mbStartApp() qui n'ajoute JAMAIS `in-app` → volontairement clair,
     jamais touché. (2026-06-11 : élargi de body.role-director à body.in-app
     pour couvrir Manager + Opérateur en plus du Directeur.)
   • On ne modifie QUE le background + la bordure (on darkise la surface et on
     garde une bordure accent qui PRÉSERVE le sens : vert=ok, rouge=alerte,
     orange=à valider, bleu=info). Les chiffres colorés (CA vert, écart rouge)
     restent intacts ; le texte gris foncé est déjà relevé par v290/v302.
   • !important systématique pour battre les inline styles d'app.js.
   ═══════════════════════════════════════════════════════════════════════════ */

/* ─── Surfaces NEUTRES (gris/blanc cassé) → carte sombre standard ─────────── */
body.in-app [style*="background:#F8FAFC" i],
body.in-app [style*="background: #F8FAFC" i],
body.in-app [style*="background:#F1F5F9" i],
body.in-app [style*="background: #F1F5F9" i],
body.in-app [style*="background:#F9FAFB" i],
body.in-app [style*="background:#F3F4F6" i],
body.in-app [style*="background:#E2E8F0" i]{
  background:#131C2E !important;
  border-color:#2A3A52 !important;
}

/* ─── VERT (succès / OK) → fond sombre + accent vert ─────────────────────── */
body.in-app [style*="background:#ECFDF5" i],
body.in-app [style*="background: #ECFDF5" i],
body.in-app [style*="background:#DCFCE7" i],
body.in-app [style*="background:#F0FDF4" i],
body.in-app [style*="background:#D1FAE5" i]{
  background:#13241D !important;
  border-color:rgba(16,185,129,.38) !important;
}

/* ─── ROUGE (alerte / écart) → fond sombre + accent rouge ────────────────── */
body.in-app [style*="background:#FEF2F2" i],
body.in-app [style*="background: #FEF2F2" i],
body.in-app [style*="background:#FEE2E2" i],
body.in-app [style*="background:#FECACA" i],
body.in-app [style*="background:#FFF1F2" i]{
  background:#241619 !important;
  border-color:rgba(239,68,68,.40) !important;
}

/* ─── ORANGE / AMBRE (à valider / attention) → fond sombre + accent ambre ── */
body.in-app [style*="background:#FFF7ED" i],
body.in-app [style*="background: #FFF7ED" i],
body.in-app [style*="background:#FFFBEB" i],
body.in-app [style*="background:#FEF3C7" i],
body.in-app [style*="background:#FFEDD5" i],
body.in-app [style*="background:#FEFCE8" i]{
  background:#241E12 !important;
  border-color:rgba(245,158,11,.40) !important;
}

/* ─── BLEU (info / à confirmer) → fond sombre + accent bleu ───────────────── */
body.in-app [style*="background:#EFF4FF" i],
body.in-app [style*="background: #EFF4FF" i],
body.in-app [style*="background:#EFF6FF" i],
body.in-app [style*="background:#F0F9FF" i],
body.in-app [style*="background:#E0F2FE" i],
body.in-app [style*="background:#EEF2FF" i]{
  background:#13202F !important;
  border-color:rgba(59,130,246,.40) !important;
}

/* ─── Bordures pastel résiduelles (quand le fond a déjà été pris ailleurs) ── */
body.in-app [style*="border:1px solid #FED7AA" i],
body.in-app [style*="border:1px solid #FDE68A" i],
body.in-app [style*="border:1px solid #FEF08A" i]{ border-color:rgba(245,158,11,.40) !important; }
body.in-app [style*="border:1px solid #BFD7FE" i],
body.in-app [style*="border:1px solid #BAE6FD" i],
body.in-app [style*="border:1px solid #93C5FD" i]{ border-color:rgba(59,130,246,.40) !important; }
body.in-app [style*="border:1px solid #FCA5A5" i],
body.in-app [style*="border:1px solid #FECACA" i]{ border-color:rgba(239,68,68,.40) !important; }
body.in-app [style*="border:1px solid #BBF7D0" i],
body.in-app [style*="border:1px solid #A7F3D0" i],
body.in-app [style*="border:1px solid #86EFAC" i]{ border-color:rgba(16,185,129,.38) !important; }
body.in-app [style*="border:1px solid #E2E8F0" i],
body.in-app [style*="border:1px solid #CBD5E1" i],
body.in-app [style*="border:1px solid #E5E7EB" i]{ border-color:#2A3A52 !important; }

/* ─── Séparateurs de section dans la sidebar Directeur (NADM {sep}) ───────── */
.ni-sep{
  font-size:10px !important;
  font-weight:800 !important;
  letter-spacing:.09em !important;
  text-transform:uppercase !important;
  color:#94A3B8 !important;
  padding:15px 12px 5px !important;
  margin-top:4px !important;
  border-top:1px solid #1E293B !important;
  user-select:none;
  pointer-events:none;
}
.ni-sep:first-child{
  border-top:0 !important;
  margin-top:0 !important;
  padding-top:2px !important;
}

/* ─── Indicateur de MODE en tête de sidebar Opérateur (Solo/Salle/Caisse) ─── */
.mode-indic{
  display:flex;
  align-items:center;
  gap:6px;
  font-size:11px !important;
  font-weight:700 !important;
  letter-spacing:.03em;
  color:#CBD5E1 !important;
  background:#0F1626 !important;
  border:1px solid #2A3A52 !important;
  border-left:3px solid #22D3EE !important;
  border-radius:8px !important;
  padding:8px 11px !important;
  margin:0 0 10px !important;
}
.mode-indic b{ color:#FFFFFF !important; font-weight:800 !important; }

/* ─── Inputs/selects clairs des barres de filtre (pages staff) ────────────── */
body.in-app [style*="background:#FFFFFF" i] input,
body.in-app [style*="background:#FFFFFF" i] select,
body.in-app input[style*="background:#FFFFFF" i],
body.in-app select[style*="background:#FFFFFF" i]{
  background:#0F1626 !important;
  border-color:#2A3A52 !important;
  color:#F1F5F9 !important;
  color-scheme:dark;
}

/* ═══════════════════════════════════════════════════════════════════════
   2026-06-12 — NETTOYAGE INTERFACE STAFF (focus caisse, anti-bug d'affichage)
   ───────────────────────────────────────────────────────────────────────
   BUG : le header marketing v300 (.ev-header, position:fixed, translucide avec
   backdrop-blur) se superposait à la barre d'outils NATIVE de l'app (.tb : ☰
   menu, marque, horloge, langue, 🚪 Déconnexion, 🔔, ↻). Résultat : deux
   en-têtes empilés + un flou fantôme au centre.
   FIX : la barre native .tb porte déjà TOUT (dont le logout) → on masque
   entièrement le header marketing + son drawer pour le staff connecté.
   Couvre :has() (navigateurs récents) ET body.in-app (fallback Safari<15.4). */
body:has(#p-app.on) .ev-header,
body.in-app .ev-header,
body:has(#p-app.on) .ev-drawer,
body.in-app .ev-drawer,
body:has(#p-app.on) .ev-burger,
body.in-app .ev-burger{
  display:none !important;
}

/* ═══════════════════════════════════════════════════════════════════════
   2026-06-12 (bis) — ORDRE D'ORIGINE RÉTABLI (directive Directeur « te9elb »)
   ───────────────────────────────────────────────────────────────────────
   Le Directeur veut l'ordre visuel d'origine : Logo → Programme de Fidélité
   /Parrainage → Formulaire de connexion (tabs + login) tout en bas.
   On ANNULE le « connexion en premier » : le bloc fidélité (#programme)
   repasse JUSTE sous le titre (order:2), tabs+formulaire descendent en bas.
   Trade-off assumé : le staff doit scroller la pub avant le login.
   `.aw` est déjà flex-column → purement visuel via `order`, aucun DOM/JS touché. */
#p-auth .aw{ display:flex; flex-direction:column; }
#p-auth .aw > #hero{ order:1; }
#p-auth .aw > #programme{ order:2; margin-top:8px; }
#p-auth .aw > .atabs{ order:3; }
#p-auth .aw > #form-login,
#p-auth .aw > #form-signup{ order:4; }
/* dernier enfant = liens footer (Politique / Support / copyright) → tout en bas */
#p-auth .aw > *:last-child{ order:5; }

/* ═══════════════════════════════════════════════════════════════════════
   2026-06-12 — NETTOYAGE PAGE DE CONNEXION (décision Directeur : minimum
   essentiel pour que l'agent se connecte sans bruit).
   ───────────────────────────────────────────────────────────────────────
   On retire les liens MORTS et le marketing redondant :
   · header → on garde le LOGO seul ; on masque la nav (Accueil/Programme/
     Partenaires dont #partenaires n'existe PAS = lien mort), le CTA
     « Se connecter » (redondant, le formulaire est juste en dessous) et le
     burger (plus de menu à ouvrir).
   · footer géant 4 colonnes → masqué en entier (Partenaires = lien mort,
     3 icônes réseaux = href vides/morts, le reste fait doublon). La ligne
     discrète sous le formulaire (Politique · Support WhatsApp · email)
     suffit comme bas de page.
   Purement visuel / réversible — aucun élément supprimé du DOM. */
.ev-header__nav,
.ev-header__cta--login,
.ev-burger{ display:none !important; }
/* footer marketing : inutile sur une page dont le seul but est se connecter */
.ev-footer{ display:none !important; }

/* =============== /css/ev-director-cash-control-v314.css?v=319-scroll-direction-parent-20260831 =============== */
#pg-caisseRpt.on{display:flex!important;flex-direction:column!important;min-height:0!important;height:auto!important;max-height:none!important;overflow:visible!important}
#pg-caisseRpt.on>#s-caisseRpt{display:flex!important;flex:1 1 auto!important;flex-direction:column!important;min-height:0!important;height:auto!important;max-height:none!important;overflow-x:hidden!important;overflow-y:visible!important;overscroll-behavior-y:auto!important;touch-action:pan-y!important;-webkit-overflow-scrolling:touch}
@media(min-width:1024px){#pg-caisseRpt.on{height:100%!important;max-height:100%!important;overflow:hidden!important}#pg-caisseRpt.on>#s-caisseRpt{height:100%!important;max-height:100%!important;overflow-y:auto!important}}
#dcc{--d-bg:#0b1220;--d-card:#121c2d;--d-line:#26354d;--d-text:#f8fafc;--d-muted:#9fb0c7;--d-red:#fb7185;--d-amber:#fbbf24;--d-green:#34d399;margin:0 0 22px;color:var(--d-text);font-family:inherit}
#dcc *{box-sizing:border-box}
.dcc-hero{display:flex;justify-content:space-between;gap:20px;align-items:flex-start;padding:22px;border:1px solid #334155;border-radius:18px;background:linear-gradient(135deg,#111c30,#17233a);box-shadow:0 16px 35px rgba(0,0,0,.22)}
.dcc-eyebrow{font-size:10px;font-weight:900;letter-spacing:.14em;color:#67e8f9;margin-bottom:6px}
.dcc-hero h2{margin:0;color:#fff;font-size:24px;line-height:1.2}.dcc-hero p{margin:7px 0 0;color:#cbd5e1;font-size:13px;font-weight:600}
.dcc-hero-actions{display:flex;gap:8px;flex-wrap:wrap}.dcc-hero-actions button,.dcc-shortcuts button,.dcc-quality button,.dcc-periods button{border:1px solid #3b4b63;background:#1d2a40;color:#f8fafc;border-radius:9px;padding:9px 12px;font-weight:800;cursor:pointer}
.dcc-kpis{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:10px;margin:12px 0}.dcc-kpi{padding:14px;border-radius:14px;border:1px solid var(--d-line);background:var(--d-card)}
.dcc-kpi.red{border-left:4px solid var(--d-red)}.dcc-kpi.amber{border-left:4px solid var(--d-amber)}.dcc-kpi.green{border-left:4px solid var(--d-green)}
.dcc-kpi-label{font-size:11px;color:var(--d-muted);font-weight:900;text-transform:uppercase;letter-spacing:.04em}.dcc-kpi-value{font-size:24px;font-weight:950;margin:4px 0;color:#fff;font-variant-numeric:tabular-nums}.dcc-kpi-sub{font-size:11px;color:#94a3b8}
.dcc-quality{display:flex;justify-content:space-between;align-items:center;gap:12px;border-radius:12px;padding:12px 14px;margin:10px 0}.dcc-quality.warn{background:#3b2508;border:1px solid #92400e}.dcc-quality.ok{background:#052e2b;border:1px solid #047857}.dcc-quality b{display:block;color:#fff}.dcc-quality span{display:block;color:#dbeafe;font-size:11px;margin-top:3px}
.dcc-shortcuts{display:flex;gap:7px;align-items:center;flex-wrap:wrap;margin:10px 0;color:#94a3b8;font-size:11px;font-weight:800}.dcc-shortcuts button{padding:7px 10px}
.dcc-filters{display:grid;grid-template-columns:1.6fr 1fr 1fr 1.2fr;gap:8px;background:#101827;border:1px solid var(--d-line);border-radius:13px;padding:10px;margin:12px 0 18px}
.dcc-filters select,.dcc-filters input{min-width:0;background:#0b1220;color:#f8fafc;border:1px solid #334155;border-radius:9px;padding:9px 10px;font-weight:700;outline:none}.dcc-periods{display:flex;gap:5px;flex-wrap:wrap}.dcc-periods button{padding:8px 9px}.dcc-periods button.on{background:#0e7490;border-color:#22d3ee}
.dcc-section-head{display:flex;justify-content:space-between;align-items:end;margin:20px 0 9px}.dcc-section-head h3{margin:0;color:#fff;font-size:18px}.dcc-section-head p{margin:3px 0 0;color:#94a3b8;font-size:11px}
.dcc-alerts{display:grid;gap:8px}.dcc-alert{display:grid;grid-template-columns:minmax(0,1fr) 170px;background:#121c2d;border:1px solid #26354d;border-left:5px solid #64748b;border-radius:13px;overflow:hidden}.dcc-alert.critical{border-left-color:#f43f5e}.dcc-alert.warning{border-left-color:#f59e0b}.dcc-alert.info{border-left-color:#38bdf8}.dcc-alert.treated{opacity:.62}
.dcc-alert-main{padding:13px 15px}.dcc-alert-top{display:flex;gap:7px;align-items:center;flex-wrap:wrap}.dcc-sev,.dcc-cat{border-radius:999px;padding:3px 8px;font-size:9px;font-weight:900;text-transform:uppercase}.dcc-alert.critical .dcc-sev{background:#7f1d1d;color:#fecdd3}.dcc-alert.warning .dcc-sev{background:#78350f;color:#fde68a}.dcc-alert.info .dcc-sev{background:#0c4a6e;color:#bae6fd}.dcc-cat{background:#26354d;color:#cbd5e1}.dcc-date{margin-left:auto;color:#7f8fa5;font-size:10px}
.dcc-alert h4{margin:8px 0 3px;color:#fff;font-size:14px}.dcc-alert p{margin:0;color:#cbd5e1;font-size:12px;line-height:1.45}.dcc-action{margin-top:8px;color:#a5f3fc;font-size:11px;font-weight:700}
.dcc-alert-side{border-left:1px solid #26354d;padding:12px;display:flex;flex-direction:column;align-items:flex-end;justify-content:center}.dcc-person{font-weight:900;color:#fff}.dcc-amount{font-size:19px;font-weight:950;color:#f8fafc;margin:3px 0}.dcc-count{font-size:10px;color:#94a3b8}.dcc-alert-side button{margin-top:8px;background:#243149;border:1px solid #475569;color:#fff;border-radius:8px;padding:7px 10px;font-weight:800;cursor:pointer}
.dcc-employees{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:10px}.dcc-employee{background:#121c2d;border:1px solid #26354d;border-top:4px solid #34d399;border-radius:14px;padding:14px}.dcc-employee.watch{border-top-color:#fbbf24}.dcc-employee.high{border-top-color:#fb7185}.dcc-employee-head{display:flex;justify-content:space-between;align-items:center}.dcc-employee h4{margin:0;color:#fff;font-size:16px}.dcc-employee-head span{display:block;color:#94a3b8;font-size:10px;margin-top:2px}.dcc-score{font-size:24px;font-weight:950;color:#fff}.dcc-score small{font-size:10px;color:#94a3b8}.dcc-metrics{display:grid;grid-template-columns:1fr 1fr;gap:6px;margin-top:11px}.dcc-metrics span{background:#0d1625;border:1px solid #243149;border-radius:8px;padding:7px;color:#94a3b8;font-size:10px}.dcc-metrics b{display:block;color:#f8fafc;font-size:11px;margin-top:2px}
.dcc-table-wrap{overflow:auto;border:1px solid #26354d;border-radius:13px;max-height:500px}.dcc-table{width:100%;border-collapse:collapse;background:#111a2a}.dcc-table th{position:sticky;top:0;background:#1d2a40;color:#cbd5e1;text-align:left;font-size:10px;padding:10px;z-index:1}.dcc-table td{padding:9px 10px;border-top:1px solid #26354d;color:#e2e8f0;font-size:11px}.dcc-table .hot{color:#fca5a5;font-weight:900}
.dcc-empty,.dcc-loading,.dcc-error{padding:24px;text-align:center;background:#121c2d;border:1px solid #26354d;border-radius:13px;color:#cbd5e1}.dcc-error{border-color:#be123c;color:#fecdd3}.dcc-error button{margin-left:8px}
.dcc-modal{position:fixed;inset:0;z-index:20000;background:rgba(2,6,23,.82);display:flex;align-items:flex-start;justify-content:center;padding:12px;overflow-y:auto;overscroll-behavior:contain;touch-action:pan-y;-webkit-overflow-scrolling:touch}.dcc-modal-card{position:relative;width:min(520px,100%);max-height:calc(var(--dcc-visible-height,100dvh) - 24px);margin:auto 0;overflow-y:auto;overscroll-behavior:contain;-webkit-overflow-scrolling:touch;background:#111b2d;border:1px solid #475569;border-radius:16px;padding:20px;color:#fff;box-shadow:0 30px 80px rgba(0,0,0,.5)}.dcc-modal-card h3{margin:0 0 10px}.dcc-modal-card p{font-size:12px;color:#cbd5e1;line-height:1.5}.dcc-modal-card label{display:block;color:#94a3b8;font-size:11px;font-weight:900;margin:11px 0 5px}.dcc-modal-card select,.dcc-modal-card textarea{width:100%;background:#0b1220;border:1px solid #475569;color:#fff;border-radius:9px;padding:10px;font-family:inherit}.dcc-modal-card textarea{min-height:110px;resize:vertical}.dcc-close{position:absolute;right:12px;top:10px;background:transparent;border:0;color:#cbd5e1;font-size:24px;cursor:pointer}.dcc-save{width:100%;margin-top:12px;background:#0e7490;border:1px solid #22d3ee;color:#fff;border-radius:10px;padding:11px;font-weight:900;cursor:pointer}
@media(max-width:900px){.dcc-kpis{grid-template-columns:repeat(2,minmax(0,1fr))}.dcc-filters{grid-template-columns:1fr 1fr}.dcc-employees{grid-template-columns:1fr}}
@media(max-width:600px){.dcc-hero{display:block}.dcc-hero-actions{margin-top:12px}.dcc-kpis{grid-template-columns:1fr 1fr}.dcc-kpi{padding:11px}.dcc-kpi-value{font-size:18px}.dcc-filters{grid-template-columns:1fr}.dcc-alert{grid-template-columns:1fr}.dcc-alert-side{border-left:0;border-top:1px solid #26354d;align-items:flex-start}.dcc-metrics{grid-template-columns:1fr 1fr}}
@media print{body *{visibility:hidden!important}#dcc,#dcc *{visibility:visible!important}#dcc{position:absolute;left:0;top:0;width:100%;color:#000}.dcc-hero-actions,.dcc-filters,.dcc-shortcuts,.dcc-alert-side button{display:none!important}.dcc-alert,.dcc-employee,.dcc-kpi{break-inside:avoid;background:#fff!important;color:#000!important}}

/* =============== /css/ev-envelope-director-pro.css?v=20260901-2235 =============== */
.ev-env-pro{max-width:1480px;margin:0 auto;padding:4px 2px 36px;color:#e5e7eb}.ev-env-hero{display:flex;align-items:flex-start;justify-content:space-between;gap:24px;padding:24px 26px;margin-bottom:14px;border:1px solid #263244;border-radius:16px;background:linear-gradient(135deg,#111c2e,#0b1220 70%);box-shadow:0 12px 28px #02061766}.ev-env-kicker,.ev-env-day-label{font-size:10px;letter-spacing:.14em;font-weight:900;color:#7dd3fc}.ev-env-hero h1{margin:7px 0 5px;font-size:clamp(24px,3vw,36px);letter-spacing:-.03em;color:#f8fafc}.ev-env-hero p{margin:0;color:#94a3b8;font-size:13px}.ev-env-refresh{border:1px solid #38bdf8;background:#082f49;color:#bae6fd;border-radius:9px;padding:10px 15px;font-weight:900;cursor:pointer}.ev-env-kpis{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:10px;margin-bottom:14px}.ev-env-kpi{min-height:102px;padding:15px 16px;border:1px solid #273449;border-top:3px solid #64748b;border-radius:12px;background:#0f172a}.ev-env-kpi span,.ev-env-kpi small{display:block;color:#94a3b8;font-size:11px;font-weight:800}.ev-env-kpi strong{display:block;margin:8px 0 4px;color:#f8fafc;font-size:30px;line-height:1;font-variant-numeric:tabular-nums}.ev-env-kpi-alert{border-top-color:#60a5fa}.ev-env-kpi-warn{border-top-color:#fbbf24}.ev-env-kpi-ok{border-top-color:#34d399}.ev-env-kpi-neutral{border-top-color:#a78bfa}.ev-env-rule{padding:16px 18px;margin-bottom:14px;border:1px solid #29445e;border-radius:12px;background:#0b2031}.ev-env-rule-title{margin-bottom:10px;color:#e0f2fe;font-size:11px;font-weight:900;letter-spacing:.1em;text-transform:uppercase}.ev-env-steps{display:flex;align-items:center;gap:10px;flex-wrap:wrap;color:#cbd5e1;font-size:12px;font-weight:800}.ev-env-steps b{display:inline-grid;place-items:center;width:22px;height:22px;margin-right:5px;border-radius:50%;background:#164e63;color:#a5f3fc;font-size:10px}.ev-env-steps i{color:#38bdf8;font-style:normal}.ev-env-rule p{margin:10px 0 0;color:#7dd3fc;font-size:11px}.ev-env-toolbar{display:flex;align-items:flex-end;gap:10px;flex-wrap:wrap;padding:11px 13px;margin-bottom:18px;border:1px solid #263244;border-radius:11px;background:#080f1b}.ev-env-toolbar label{display:flex;flex-direction:column;gap:5px;color:#94a3b8;font-size:10px;font-weight:900;text-transform:uppercase;letter-spacing:.06em}.ev-env-toolbar input,.ev-env-toolbar select{min-width:145px;padding:9px 10px;border:1px solid #334155;border-radius:8px;background:#111c2e;color:#f8fafc;font:inherit;font-size:12px;text-transform:none;letter-spacing:normal}.ev-env-search input{min-width:210px}.ev-env-toolbar-count{margin-left:auto;padding:10px 2px;color:#64748b;font-size:11px;font-weight:800}.ev-env-day{margin-bottom:22px}.ev-env-day-head{display:flex;align-items:end;justify-content:space-between;gap:12px;margin-bottom:9px;padding:0 2px 8px;border-bottom:1px solid #263244}.ev-env-day-head h2{margin:5px 0 0;color:#f8fafc;font-size:18px;letter-spacing:-.02em}.ev-env-day-count{color:#94a3b8;font-size:11px;font-weight:800}.ev-env-list{display:grid;grid-template-columns:repeat(auto-fit,minmax(min(100%,390px),1fr));gap:10px}.ev-env-card{padding:15px;border:1px solid #293548;border-left:4px solid #64748b;border-radius:12px;background:#0f172a;box-shadow:0 6px 16px #02061755}.ev-env-tone-info{border-left-color:#60a5fa}.ev-env-tone-warn{border-left-color:#fbbf24}.ev-env-tone-ok{border-left-color:#34d399}.ev-env-tone-danger{border-left-color:#fb7185}.ev-env-tone-history{border-left-color:#a78bfa}.ev-env-card-head{display:flex;justify-content:space-between;align-items:flex-start;gap:12px}.ev-env-card h3{margin:0;color:#f8fafc;font-size:15px}.ev-env-meta{margin-top:4px;color:#64748b;font-size:11px;font-weight:700}.ev-env-status{padding:5px 8px;border:1px solid currentColor;border-radius:999px;color:#cbd5e1;font-size:10px;font-weight:900;text-align:right}.ev-env-tone-info .ev-env-status{color:#93c5fd}.ev-env-tone-warn .ev-env-status{color:#fcd34d}.ev-env-tone-ok .ev-env-status{color:#6ee7b7}.ev-env-tone-danger .ev-env-status{color:#fda4af}.ev-env-tone-history .ev-env-status{color:#c4b5fd}.ev-env-progress{display:flex;align-items:center;gap:5px;margin:14px 0 12px}.ev-env-dot{width:9px;height:9px;border:2px solid #475569;border-radius:50%;background:#0f172a}.ev-env-dot.done{border-color:#34d399;background:#34d399}.ev-env-line{width:28px;height:2px;background:#334155}.ev-env-line.done{background:#34d399}.ev-env-progress-label{margin-left:3px;color:#94a3b8;font-size:10px;font-weight:800}.ev-env-masked{padding:13px;border:1px dashed #475569;border-radius:9px;background:#0b1220}.ev-env-masked strong{display:block;color:#fcd34d;font-size:12px}.ev-env-masked span{display:block;margin-top:4px;color:#94a3b8;font-size:11px}.ev-env-amount,.ev-env-historical{display:flex;align-items:baseline;justify-content:space-between;gap:12px;padding:11px 12px;border-radius:9px;background:#071b16}.ev-env-amount span,.ev-env-historical span{color:#a7f3d0;font-size:11px;font-weight:800}.ev-env-amount strong,.ev-env-historical strong{color:#6ee7b7;font-size:22px;font-variant-numeric:tabular-nums}.ev-env-historical{background:#17132b}.ev-env-historical span,.ev-env-historical strong{color:#c4b5fd}.ev-env-checks{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:1px;margin-top:8px;border:1px solid #273449;border-radius:8px;overflow:hidden}.ev-env-checks div{padding:8px;background:#111c2e}.ev-env-checks span,.ev-env-checks b{display:block}.ev-env-checks span{color:#64748b;font-size:10px;font-weight:800}.ev-env-checks b{margin-top:3px;color:#e2e8f0;font-size:12px}.ev-env-proof{margin-top:8px;padding:9px 10px;border-radius:8px;font-size:11px;font-weight:800}.ev-env-proof-ok{background:#052e24;color:#86efac}.ev-env-proof-warn{background:#3a2508;color:#fde68a}.ev-env-details{margin-top:8px;color:#cbd5e1;font-size:11px}.ev-env-details summary{cursor:pointer;color:#7dd3fc;font-weight:800}.ev-env-denoms{display:flex;gap:5px;flex-wrap:wrap;margin-top:8px}.ev-env-denom{padding:5px 7px;border:1px solid #334155;border-radius:6px;background:#111c2e;color:#cbd5e1}.ev-env-denom b{color:#f8fafc}.ev-env-block{margin-top:8px;padding:10px;border-radius:8px;font-size:11px;line-height:1.45}.ev-env-block-danger{border:1px solid #7f1d1d;background:#450a0a;color:#fecaca}.ev-env-block-warning{border:1px solid #92400e;background:#451a03;color:#fde68a}.ev-env-actions{display:flex;gap:7px;flex-wrap:wrap;margin-top:8px}.ev-env-btn{flex:1;min-width:145px;padding:9px 10px;border-radius:8px;font-size:11px;font-weight:900;cursor:pointer}.ev-env-btn-primary{border:1px solid #34d399;background:#047857;color:#ecfdf5}.ev-env-btn-secondary{border:1px solid #64748b;background:#1e293b;color:#e2e8f0}.ev-env-btn-warn{border:1px solid #f59e0b;background:#92400e;color:#fff7ed}.ev-env-empty,.ev-env-loading{padding:35px 18px;border:1px solid #263244;border-radius:12px;background:#0f172a;text-align:center;color:#cbd5e1}.ev-env-empty strong,.ev-env-empty span{display:block}.ev-env-empty span{margin-top:6px;color:#64748b;font-size:12px}.ev-env-muted{color:#64748b}@media(max-width:800px){.ev-env-kpis{grid-template-columns:repeat(2,minmax(0,1fr))}.ev-env-hero{padding:19px;flex-direction:column}.ev-env-refresh{width:100%}.ev-env-toolbar-count{width:100%;margin-left:0}.ev-env-steps{gap:7px}.ev-env-steps i{display:none}}@media(max-width:520px){.ev-env-pro{padding:0 0 24px}.ev-env-kpis{gap:7px}.ev-env-kpi{min-height:90px;padding:12px}.ev-env-kpi strong{font-size:25px}.ev-env-kpi small{font-size:10px}.ev-env-rule{padding:13px}.ev-env-toolbar label,.ev-env-toolbar input,.ev-env-toolbar select,.ev-env-search input{width:100%;min-width:0;box-sizing:border-box}.ev-env-card-head{display:block}.ev-env-status{display:inline-block;margin-top:8px;text-align:left}.ev-env-progress-label{font-size:9px}.ev-env-checks{grid-template-columns:1fr}.ev-env-btn{min-width:100%}}
.ev-env-proof-info{background:#082f49;color:#bae6fd}.ev-env-visible{padding-top:1px}
.ev-env-pro{display:block!important;width:100%!important;max-width:none!important;min-width:0!important;grid-column:1/-1!important;box-sizing:border-box!important}.ev-env-pro *{box-sizing:border-box}.ev-env-hero{display:flex!important;width:100%!important}.ev-env-kpis{display:grid!important;grid-template-columns:repeat(4,minmax(0,1fr))!important;width:100%!important}.ev-env-toolbar{display:flex!important;width:100%!important}.ev-env-steps{display:flex!important}.ev-env-list{display:grid!important;grid-template-columns:repeat(auto-fit,minmax(min(100%,390px),1fr))!important;width:100%!important}.ev-env-card{display:block!important;width:auto!important;min-width:0!important}.ev-env-kpi{display:block!important;min-width:0!important}.ev-env-checks{display:grid!important}.ev-env-actions{display:flex!important}@media(max-width:800px){.ev-env-kpis{grid-template-columns:repeat(2,minmax(0,1fr))!important}}@media(max-width:520px){.ev-env-kpis{grid-template-columns:repeat(2,minmax(0,1fr))!important}.ev-env-toolbar{display:grid!important}.ev-env-hero{align-items:flex-start!important}}
.ev-visible-overlay{position:fixed;inset:0;z-index:13000;display:flex;align-items:center;justify-content:center;padding:16px;overflow:auto;background:rgba(2,6,23,.88)}.ev-visible-dialog{width:min(980px,100%);max-height:calc(100vh - 32px);overflow:auto;padding:22px;border:1px solid #475569;border-radius:16px;background:#0f172a;color:#e2e8f0;box-shadow:0 24px 80px #000b}.ev-visible-loading{color:#bae6fd;text-align:center}.ev-visible-head{display:flex;justify-content:space-between;gap:18px}.ev-visible-kicker{color:#7dd3fc;font-size:10px;font-weight:900;letter-spacing:.14em}.ev-visible-head h2{margin:7px 0 4px;color:#f8fafc;font-size:22px}.ev-visible-head p{margin:0;color:#94a3b8;font-size:12px}.ev-visible-close{width:36px;height:36px;border:1px solid #475569;border-radius:8px;background:#1e293b;color:#f8fafc;font-size:22px;cursor:pointer}.ev-visible-source{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:7px;margin:18px 0 10px}.ev-visible-source div{padding:10px;border:1px solid #334155;border-radius:8px;background:#111c2e}.ev-visible-source span,.ev-visible-live span{display:block;color:#94a3b8;font-size:10px;font-weight:800}.ev-visible-source strong{display:block;margin-top:5px;color:#f8fafc;font-size:15px}.ev-visible-live{display:grid;grid-template-columns:1fr 1fr;gap:8px;padding:13px;border:1px solid #0e7490;border-radius:10px;background:#082f49}.ev-visible-live strong{display:block;margin-top:4px;color:#fcd34d;font-size:25px;font-variant-numeric:tabular-nums}.ev-visible-live p{grid-column:1/-1;margin:2px 0 0;color:#bae6fd;font-size:11px;font-weight:800}.ev-visible-table-wrap{margin-top:12px;border:1px solid #334155;border-radius:9px;overflow:auto}.ev-visible-table{width:100%;border-collapse:collapse;font-size:12px}.ev-visible-table th{padding:9px;background:#1e293b;color:#94a3b8;text-align:left;font-size:10px;letter-spacing:.06em;text-transform:uppercase}.ev-visible-table td{padding:7px 9px;border-top:1px solid #263244;background:#0b1220}.ev-visible-table input{width:80px;box-sizing:border-box;padding:7px;border:1px solid #475569;border-radius:6px;background:#111c2e;color:#f8fafc;font:inherit;text-align:right}.ev-visible-table td:last-child{font-weight:900}.ev-visible-ok{color:#86efac!important}.ev-visible-bad{color:#fda4af!important}.ev-visible-composition-note{margin-top:8px;color:#94a3b8;font-size:11px}.ev-visible-fields{display:grid;grid-template-columns:1fr 1fr;gap:10px;margin-top:12px}.ev-visible-field{display:block;margin-top:12px;color:#cbd5e1;font-size:11px;font-weight:800}.ev-visible-field input,.ev-visible-field textarea{display:block;width:100%;box-sizing:border-box;margin-top:5px;padding:9px;border:1px solid #475569;border-radius:7px;background:#020617;color:#f8fafc;font:inherit}.ev-visible-field textarea{min-height:64px;resize:vertical}.ev-visible-check{display:flex;align-items:center;gap:8px;min-height:40px;margin-top:12px;padding:8px;border:1px solid #334155;border-radius:7px;background:#111c2e;color:#e2e8f0;font-size:11px;font-weight:800}.ev-visible-check input{accent-color:#10b981}.ev-visible-empty{margin-top:9px}.ev-visible-result{display:none;margin-top:12px;padding:10px;border-radius:8px;font-size:12px;font-weight:800}.ev-visible-success{display:block;background:#052e24;color:#bbf7d0}.ev-visible-error{display:block;background:#450a0a;color:#fecaca}.ev-visible-actions{display:flex;justify-content:flex-end;gap:8px;margin-top:15px}.ev-visible-actions button,.ev-visible-error button{padding:10px 14px;border-radius:8px;font:inherit;font-size:12px;font-weight:900;cursor:pointer}.ev-visible-primary{border:1px solid #34d399;background:#047857;color:#ecfdf5}.ev-visible-secondary{border:1px solid #64748b;background:#1e293b;color:#e2e8f0}@media(max-width:680px){.ev-visible-dialog{padding:15px}.ev-visible-source{grid-template-columns:repeat(2,minmax(0,1fr))}.ev-visible-fields{grid-template-columns:1fr}.ev-visible-live strong{font-size:20px}.ev-visible-actions{flex-direction:column-reverse}.ev-visible-actions button{width:100%}}

/* =============== /css/ev-director-simple-v320.css?v=327-simple-direction-20260831 =============== */
/* Espace Direction : une seule zone de défilement et une présentation sobre. */
body.role-director{
  --dir-bg:#0b1220;
  --dir-panel:#111b2e;
  --dir-panel-2:#172238;
  --dir-border:#2a3a55;
  --dir-text:#f8fafc;
  --dir-muted:#aebbd0;
  --dir-accent:#38bdf8;
  --dir-radius:14px;
  background:var(--dir-bg)!important;
}

body.role-director,
body.role-director #mode-admin,
body.role-director #app,
body.role-director #p-app{
  height:100vh!important;
  height:100dvh!important;
  min-height:0!important;
  overflow:hidden!important;
}

body.role-director #mode-admin.on{display:block!important}
body.role-director #app{display:flex!important;flex-direction:column!important}
body.role-director #p-app.on{display:flex!important;flex:1 1 auto!important;flex-direction:column!important;min-height:0!important}
body.role-director #p-app>.tb{flex:0 0 64px!important}
body.role-director #p-app>.dir-main,
body.role-director #p-app>div[style*="flex:1"]{
  flex:1 1 auto!important;
  min-height:0!important;
  overflow:hidden!important;
  padding:0!important;
}
body.role-director #p-app .pg.on{
  display:flex!important;
  flex:1 1 auto!important;
  flex-direction:column!important;
  width:100%!important;
  height:100%!important;
  min-height:0!important;
  max-height:none!important;
  overflow:hidden!important;
}
body.role-director #p-app .pg.on>.scrl{
  display:block!important;
  flex:1 1 auto!important;
  width:100%!important;
  height:100%!important;
  min-height:0!important;
  max-height:none!important;
  overflow-x:hidden!important;
  overflow-y:auto!important;
  overscroll-behavior-y:contain!important;
  touch-action:pan-y!important;
  scrollbar-gutter:stable;
  -webkit-overflow-scrolling:touch;
  padding:20px!important;
  padding-bottom:calc(92px + env(safe-area-inset-bottom))!important;
}
body.role-director #p-app .pg.on>.scrl>*{
  width:100%;
  max-width:2100px;
  margin-left:auto!important;
  margin-right:auto!important;
}

body.role-director .tb{
  background:#101a2c!important;
  border-bottom:1px solid var(--dir-border)!important;
  box-shadow:none!important;
}
body.role-director .tb-t{font-size:16px!important;font-weight:800!important;color:var(--dir-text)!important}
body.role-director .tb-s{font-size:12px!important;color:var(--dir-muted)!important}
body.role-director .ib,
body.role-director .lang-picker button{
  border-color:var(--dir-border)!important;
  background:var(--dir-panel)!important;
  color:var(--dir-text)!important;
  box-shadow:none!important;
}

body.role-director .acc-tabs{
  position:sticky!important;
  top:0!important;
  z-index:20!important;
  display:grid!important;
  grid-template-columns:repeat(3,minmax(0,1fr))!important;
  gap:8px!important;
  padding:8px!important;
  margin:0 0 18px!important;
  background:rgba(11,18,32,.96)!important;
  border:1px solid var(--dir-border)!important;
  border-radius:var(--dir-radius)!important;
  box-shadow:0 8px 24px rgba(0,0,0,.18)!important;
  backdrop-filter:blur(12px);
}
body.role-director .acc-tab{
  min-width:0!important;
  min-height:46px!important;
  padding:10px 12px!important;
  border:1px solid transparent!important;
  border-radius:10px!important;
  color:var(--dir-muted)!important;
  font-size:14px!important;
  font-weight:750!important;
}
body.role-director .acc-tab:hover{background:var(--dir-panel-2)!important;color:var(--dir-text)!important}
body.role-director .acc-tab.on{
  background:#e8f7ff!important;
  border-color:#b9e6fa!important;
  color:#082f49!important;
  box-shadow:none!important;
}

body.role-director :is(.cd,.kc,.bi-card,.dcc-card,.dcc-alert,.dcc-table-wrap){
  background:var(--dir-panel)!important;
  border:1px solid var(--dir-border)!important;
  border-radius:var(--dir-radius)!important;
  box-shadow:0 8px 24px rgba(0,0,0,.14)!important;
}
body.role-director :is(.cd,.bi-card,.dcc-card){padding:18px!important}
body.role-director :is(.cd-h,.bi-card-h,.dcc-title){
  color:var(--dir-text)!important;
  font-size:15px!important;
  font-weight:800!important;
  letter-spacing:0!important;
  text-transform:none!important;
}
body.role-director :is(.bi-sub,.kl,.dcc-sub,.cr){color:var(--dir-muted)!important}
body.role-director .kl{font-size:12px!important;text-transform:none!important;letter-spacing:.01em!important}
body.role-director .kv{font-size:30px!important;line-height:1.15!important}
body.role-director .bi-grid{gap:14px!important}
body.role-director button{font-family:inherit}
body.role-director :is(.btn,.dcc-btn,.dcc-save){min-height:44px!important;border-radius:10px!important;box-shadow:none!important}
body.role-director table{font-size:13px!important}
body.role-director table th{font-size:12px!important;text-transform:none!important;letter-spacing:0!important}
body.role-director table td,body.role-director table th{padding:12px!important}

@media (min-width:1440px){
  body.role-director #p-app.on{grid-template-columns:260px minmax(0,1fr)!important}
  body.role-director #p-app .pg.on>.scrl{padding:32px 40px 56px!important}
  body.role-director .bn .ni{font-size:15px!important;padding:13px 14px!important}
  body.role-director .tb-t{font-size:18px!important}
  body.role-director .tb-s{font-size:13px!important}
  body.role-director .acc-tab{font-size:16px!important;min-height:50px!important}
  body.role-director :is(.cd-h,.bi-card-h,.dcc-title){font-size:17px!important}
  body.role-director :is(.bi-sub,.kl,.dcc-sub,.cr){font-size:13px!important}
  body.role-director table{font-size:15px!important}
  body.role-director table th{font-size:13px!important}
  body.role-director table td,body.role-director table th{padding:14px 16px!important}
  body.role-director :is(.btn,.dcc-btn,.dcc-save){font-size:14px!important;padding:11px 15px!important}
}

@media (min-width:1024px){
  body.role-director #p-app.on{
    display:grid!important;
    grid-template-columns:224px minmax(0,1fr)!important;
    grid-template-rows:64px minmax(0,1fr)!important;
    grid-template-areas:"top top" "side content"!important;
  }
  body.role-director #p-app>.tb{grid-area:top!important}
  body.role-director #p-app>.bn{
    grid-area:side!important;
    position:static!important;
    height:auto!important;
    min-height:0!important;
    overflow-y:auto!important;
    padding:14px 10px!important;
    background:#0d1627!important;
    border-right:1px solid var(--dir-border)!important;
  }
  body.role-director #p-app>.dir-main,
  body.role-director #p-app>div[style*="flex:1"]{grid-area:content!important}
  body.role-director #p-app .pg.on>.scrl{padding:28px 32px 48px!important}
  body.role-director .bn .ni{min-height:44px!important;border-radius:9px!important;font-size:13px!important}
  body.role-director .bn .ni.on{background:#17304a!important;color:#7dd3fc!important;border:1px solid #28577a!important;box-shadow:none!important}
}

@media (max-width:767px){
  body.role-director #p-app>.tb{flex-basis:58px!important;height:58px!important;padding:0 10px!important}
  body.role-director .tb .tbr{gap:4px!important}
  body.role-director .tb .lang-picker{display:none!important}
  body.role-director .hdr-logout-lb{display:none!important}
  body.role-director #ev-sound-btn,
  body.role-director .tbr>.ib:last-child{display:none!important}
  body.role-director #p-app .pg.on>.scrl{overflow-x:auto!important;padding:12px 12px calc(88px + env(safe-area-inset-bottom))!important}
  body.role-director .acc-tabs{position:static!important;grid-template-columns:1fr!important;gap:5px!important;padding:6px!important}
  body.role-director .acc-tab{justify-content:flex-start!important;min-height:42px!important}
  body.role-director :is(.cd,.bi-card,.dcc-card){padding:14px!important}
  body.role-director .bi-grid{grid-template-columns:1fr!important}
  body.role-director .kv{font-size:26px!important}
  body.role-director #pro-bottom-nav:not(:empty){height:68px!important;background:#101a2c!important;border-top:1px solid var(--dir-border)!important}
  body.role-director .scrl table{min-width:760px!important}
  body.role-director .scrl:has(table){scrollbar-color:#38bdf8 #172238;scrollbar-width:thin}
  body.role-director .scrl:has(table)::before{
    content:"Glissez le tableau vers la gauche pour voir la suite";
    display:block;
    position:sticky;
    left:0;
    width:max-content;
    max-width:calc(100vw - 24px);
    margin:0 0 10px!important;
    padding:8px 10px;
    border:1px solid #28577a;
    border-radius:9px;
    background:#102a43;
    color:#d9f2ff;
    font-size:12px;
    font-weight:700;
  }
  body.role-director #s-env{overflow-x:hidden!important}
  body.role-director #s-env::before{display:none!important}
  body.role-director #s-env table{display:block!important;min-width:0!important;width:100%!important;background:transparent!important}
  body.role-director #s-env table thead{display:none!important}
  body.role-director #s-env table tbody{display:grid!important;gap:12px!important}
  body.role-director #s-env table tr{
    display:block!important;
    overflow:hidden!important;
    border:1px solid var(--dir-border)!important;
    border-radius:13px!important;
    background:var(--dir-panel)!important;
    box-shadow:0 6px 18px rgba(0,0,0,.14)!important;
  }
  body.role-director #s-env table td{
    display:grid!important;
    grid-template-columns:110px minmax(0,1fr)!important;
    gap:10px!important;
    align-items:center!important;
    width:100%!important;
    min-height:42px!important;
    padding:9px 12px!important;
    border:0!important;
    border-bottom:1px solid rgba(42,58,85,.65)!important;
    font-size:14px!important;
    text-align:left!important;
  }
  body.role-director #s-env table td:last-child{border-bottom:0!important}
  body.role-director #s-env table td:nth-child(7),
  body.role-director #s-env table td:nth-child(7)>*{background:transparent!important}
  body.role-director #s-env table td::before{color:var(--dir-muted);font-size:11px;font-weight:800;text-transform:uppercase;letter-spacing:.04em}
  body.role-director #s-env table td:nth-child(1)::before{content:"Date"}
  body.role-director #s-env table td:nth-child(2)::before{content:"Opérateur"}
  body.role-director #s-env table td:nth-child(3)::before{content:"Encaissé"}
  body.role-director #s-env table td:nth-child(4)::before{content:"Dépenses"}
  body.role-director #s-env table td:nth-child(5)::before{content:"Attendu"}
  body.role-director #s-env table td:nth-child(6)::before{content:"État"}
  body.role-director #s-env table td:nth-child(7)::before{content:"Note"}
  body.role-director #s-env table td:nth-child(8)::before{content:"Choix"}
  body.role-director #s-env table td:last-child>div,
  body.role-director #s-env table td:last-child{row-gap:8px!important}
  body.role-director #s-env table td:last-child button{width:100%!important;margin:3px 0!important}

  body.role-director #s-mbrs .mbrs-table-wrap{overflow:visible!important;border:0!important;background:transparent!important}
  body.role-director #s-mbrs::before{display:none!important}
  body.role-director #s-mbrs .mbrs-table{display:block!important;min-width:0!important;width:100%!important;background:transparent!important}
  body.role-director #s-mbrs .mbrs-table thead{display:none!important}
  body.role-director #s-mbrs .mbrs-table tbody{display:grid!important;gap:12px!important}
  body.role-director #s-mbrs .mbrs-table tr{
    display:block!important;
    overflow:hidden!important;
    border:1px solid var(--dir-border)!important;
    border-radius:13px!important;
    background:var(--dir-panel)!important;
    box-shadow:0 6px 18px rgba(0,0,0,.14)!important;
  }
  body.role-director #s-mbrs .mbrs-table td{
    display:grid!important;
    grid-template-columns:105px minmax(0,1fr)!important;
    gap:10px!important;
    align-items:center!important;
    width:100%!important;
    min-height:44px!important;
    padding:10px 12px!important;
    border:0!important;
    border-bottom:1px solid rgba(42,58,85,.65)!important;
    font-size:14px!important;
    text-align:left!important;
    white-space:normal!important;
  }
  body.role-director #s-mbrs .mbrs-table td::before{color:var(--dir-muted);font-size:11px;font-weight:800;text-transform:uppercase;letter-spacing:.04em}
  body.role-director #s-mbrs .mbrs-table td:nth-child(1)::before{content:"Client"}
  body.role-director #s-mbrs .mbrs-table td:nth-child(2)::before{content:"Code caisse"}
  body.role-director #s-mbrs .mbrs-table td:nth-child(3)::before{content:"Solde"}
  body.role-director #s-mbrs .mbrs-table td:nth-child(4)::before{content:"Activité"}
  body.role-director #s-mbrs .mbrs-table td:nth-child(5),
  body.role-director #s-mbrs .mbrs-table td:nth-child(6){display:none!important}
  body.role-director #s-mbrs .mbrs-table td:nth-child(7){display:flex!important;flex-wrap:wrap!important;gap:8px!important;border-bottom:0!important}
  body.role-director #s-mbrs .mbrs-table td:nth-child(7)::before{content:"Choix";flex:0 0 100%}
  body.role-director #s-mbrs .mbrs-table td:nth-child(7) button{flex:1 1 140px!important;min-height:44px!important;margin:0!important}
}

/* =============== /css/ev-landing-pro-v321.css?v=322-activites-20260902 =============== */
/* ============================================================
   EspaceVirtuel PRO — Accueil professionnel v321
   ------------------------------------------------------------
   Créé le : 2026-08-31 (Claude)
   Portée  : UNIQUEMENT la page publique #p-auth (accueil + connexion
             + inscription + OTP + pied de page).
   Stratégie : surcouche cumulative chargée EN DERNIER, zéro retrait.
   Le markup de la carte fidélité a été réécrit (classes evl-*) :
   les vieilles règles v290/v300/v303 ciblant les styles inline
   legacy ne matchent plus, on repart proprement.
   Décision Directeur respectée (v303) : COLONNE UNIQUE CENTRÉE,
   identique mobile et desktop.
   ============================================================ */

/* ─── 1. FOND DE PAGE — profondeur subtile, pas de bruit ─── */
body:has(#p-auth.on){
  background:
    radial-gradient(ellipse 90% 55% at 15% -5%, rgba(34,211,238,.09) 0%, transparent 55%),
    radial-gradient(ellipse 75% 55% at 100% 100%, rgba(168,85,247,.10) 0%, transparent 55%),
    #07070E !important;
}
#p-auth.on{
  padding: 84px 16px 48px !important;
}
#p-auth .aw{
  max-width: 460px !important;
  width: 100% !important;
  margin: 0 auto !important;
  display: flex !important;
  flex-direction: column !important;
  gap: 22px !important;
}
/* neutralise les marges legacy internes pour laisser le gap gérer */
#p-auth .aw > * { margin-top: 0 !important; margin-bottom: 0 !important; }

/* ─── 2. HERO — identité claire, hiérarchie nette ─── */
#p-auth .ahero{
  text-align: center !important;
  padding: 8px 0 0 !important;
}
#p-auth .ahero .hi{
  display: inline-flex !important;
  align-items: center !important;
  justify-content: center !important;
  width: 68px !important; height: 68px !important;
  border-radius: 19px !important;
  background: linear-gradient(135deg,#22D3EE 0%,#6366F1 55%,#A855F7 100%) !important;
  box-shadow: 0 10px 34px rgba(34,211,238,.28), inset 0 1px 0 rgba(255,255,255,.35) !important;
  font-size: 34px !important;
  margin: 0 auto 16px !important;
}
#p-auth .ahero .hi svg{ width:36px; height:36px; display:block }
#p-auth .ahero h1{
  font-family: "Space Grotesk","Inter",system-ui,sans-serif !important;
  font-size: 30px !important;
  font-weight: 700 !important;
  letter-spacing: -.02em !important;
  margin: 0 0 8px !important;
  background: linear-gradient(100deg,#F1F5F9 20%,#22D3EE 60%,#A855F7 100%);
  -webkit-background-clip: text !important;
  background-clip: text !important;
  color: transparent !important;
  -webkit-text-fill-color: transparent !important;
}
#p-auth .ahero p{
  font-size: 14.5px !important;
  color: #94A3B8 !important;
  -webkit-text-fill-color: #94A3B8 !important;
  margin: 0 auto !important;
  max-width: 320px !important;
  line-height: 1.5 !important;
}

/* ─── 3. CARTES — surface commune ─── */
#p-auth .evl-card,
#p-auth #ev-promo-card{
  background: linear-gradient(180deg,#13131F 0%,#101019 100%) !important;
  border: 1px solid rgba(255,255,255,.09) !important;
  border-radius: 20px !important;
  padding: 22px !important;
  box-shadow: 0 18px 48px rgba(0,0,0,.42) !important;
  color: #E2E8F0 !important;
  text-align: left !important;
}

/* ─── 4. BANDEAU PROMO (dynamique via /ev/config/promo.json) ─── */
#p-auth .evl-promo{
  display: flex !important;
  align-items: center !important;
  gap: 12px !important;
  background: linear-gradient(90deg,rgba(34,211,238,.13) 0%,rgba(168,85,247,.13) 100%) !important;
  border: 1px solid rgba(34,211,238,.35) !important;
  border-radius: 13px !important;
  padding: 12px 14px !important;
  margin-bottom: 18px !important;
}
#p-auth .evl-promo-ico{
  flex: 0 0 auto !important;
  font-size: 24px !important;
  line-height: 1 !important;
}
#p-auth .evl-promo-title{
  font-size: 14px !important;
  font-weight: 800 !important;
  color: #F1F5F9 !important;
  -webkit-text-fill-color: #F1F5F9 !important;
  letter-spacing: -.01em !important;
  line-height: 1.35 !important;
}
#p-auth .evl-promo-sub{
  font-size: 12px !important;
  color: #A5B4CB !important;
  -webkit-text-fill-color: #A5B4CB !important;
  margin-top: 2px !important;
  line-height: 1.45 !important;
}

/* ─── 5. EN-TÊTE DE LA CARTE FIDÉLITÉ ─── */
#p-auth .evl-kicker{
  font-size: 11px !important;
  font-weight: 800 !important;
  text-transform: uppercase !important;
  letter-spacing: .12em !important;
  color: #22D3EE !important;
  -webkit-text-fill-color: #22D3EE !important;
  margin-bottom: 6px !important;
}
#p-auth .evl-title{
  font-family: "Space Grotesk","Inter",system-ui,sans-serif !important;
  font-size: 19px !important;
  font-weight: 700 !important;
  color: #F8FAFC !important;
  -webkit-text-fill-color: #F8FAFC !important;
  letter-spacing: -.015em !important;
  line-height: 1.3 !important;
  margin: 0 0 16px !important;
}

/* ─── 6. LIGNES D'AVANTAGES ─── */
#p-auth .evl-benefits{
  display: flex !important;
  flex-direction: column !important;
  gap: 14px !important;
}
#p-auth .evl-row{
  display: flex !important;
  align-items: flex-start !important;
  gap: 13px !important;
}
#p-auth .evl-ico{
  flex: 0 0 auto !important;
  display: inline-flex !important;
  align-items: center !important;
  justify-content: center !important;
  width: 38px !important; height: 38px !important;
  border-radius: 11px !important;
  border: 1px solid transparent !important;
}
#p-auth .evl-ico svg{ width:19px; height:19px; display:block }
#p-auth .evl-ico-cyan  { background: rgba(34,211,238,.12) !important;  border-color: rgba(34,211,238,.28) !important;  color:#22D3EE !important }
#p-auth .evl-ico-violet{ background: rgba(168,85,247,.12) !important;  border-color: rgba(168,85,247,.28) !important;  color:#C084FC !important }
#p-auth .evl-ico-green { background: rgba(16,185,129,.12) !important;  border-color: rgba(16,185,129,.28) !important;  color:#34D399 !important }
#p-auth .evl-ico-amber { background: rgba(245,158,11,.12) !important;  border-color: rgba(245,158,11,.30) !important;  color:#FBBF24 !important }
#p-auth .evl-bt{
  font-size: 13.5px !important;
  font-weight: 700 !important;
  color: #F1F5F9 !important;
  -webkit-text-fill-color: #F1F5F9 !important;
  letter-spacing: -.01em !important;
  line-height: 1.35 !important;
}
#p-auth .evl-bd{
  font-size: 12.5px !important;
  color: #94A3B8 !important;
  -webkit-text-fill-color: #94A3B8 !important;
  line-height: 1.5 !important;
  margin-top: 2px !important;
}
#p-auth .evl-bd b{ color:#34D399 !important; -webkit-text-fill-color:#34D399 !important; font-weight:800 !important }

/* ─── 7. ONGLETS Se connecter / S'inscrire ─── */
#p-auth .atabs{
  display: flex !important;
  gap: 4px !important;
  background: #10101A !important;
  border: 1px solid rgba(255,255,255,.09) !important;
  border-radius: 14px !important;
  padding: 4px !important;
  box-shadow: none !important;
}
#p-auth .atab{
  flex: 1 !important;
  text-align: center !important;
  padding: 11px 8px !important;
  border-radius: 10px !important;
  font-size: 13.5px !important;
  font-weight: 700 !important;
  color: #94A3B8 !important;
  -webkit-text-fill-color: #94A3B8 !important;
  background: transparent !important;
  border: 0 !important;
  cursor: pointer !important;
  transition: color .15s ease, background .15s ease !important;
  letter-spacing: -.01em !important;
}
#p-auth .atab:hover{ color:#E2E8F0 !important; -webkit-text-fill-color:#E2E8F0 !important }
#p-auth .atab.on{
  background: linear-gradient(135deg,#22D3EE 0%,#0EA5E9 100%) !important;
  color: #04121A !important;
  -webkit-text-fill-color: #04121A !important;
  box-shadow: 0 4px 16px rgba(34,211,238,.35) !important;
}

/* ─── 8. FORMULAIRES (connexion, inscription, OTP) ─── */
#p-auth form.acard{
  background: linear-gradient(180deg,#13131F 0%,#101019 100%) !important;
  border: 1px solid rgba(255,255,255,.09) !important;
  border-radius: 20px !important;
  padding: 22px !important;
  box-shadow: 0 18px 48px rgba(0,0,0,.42) !important;
}
#p-auth .fl{
  font-size: 11.5px !important;
  font-weight: 700 !important;
  text-transform: uppercase !important;
  letter-spacing: .07em !important;
  color: #A5B4CB !important;
  -webkit-text-fill-color: #A5B4CB !important;
  margin-bottom: 7px !important;
  display: block !important;
}
#p-auth .fi{
  width: 100% !important;
  box-sizing: border-box !important;
  background: #0B0B14 !important;
  border: 1.5px solid rgba(255,255,255,.11) !important;
  border-radius: 12px !important;
  color: #F1F5F9 !important;
  -webkit-text-fill-color: #F1F5F9 !important;
  font-size: 14.5px !important;
  padding: 13px 14px !important;
  transition: border-color .15s ease, box-shadow .15s ease !important;
  color-scheme: dark;
}
#p-auth .fi::placeholder{ color:#5B6B84 !important; -webkit-text-fill-color:#5B6B84 !important }
#p-auth .fi:focus{
  outline: none !important;
  border-color: #22D3EE !important;
  box-shadow: 0 0 0 3px rgba(34,211,238,.18) !important;
}
#p-auth .fg{ margin-bottom: 15px !important }
#p-auth .btn.ba{
  width: 100% !important;
  background: linear-gradient(135deg,#22D3EE 0%,#0EA5E9 100%) !important;
  color: #04121A !important;
  -webkit-text-fill-color: #04121A !important;
  border: 0 !important;
  border-radius: 12px !important;
  font-size: 15px !important;
  font-weight: 800 !important;
  letter-spacing: -.01em !important;
  padding: 14px !important;
  cursor: pointer !important;
  box-shadow: 0 8px 24px rgba(34,211,238,.30) !important;
  transition: transform .12s ease, box-shadow .12s ease, filter .12s ease !important;
}
#p-auth .btn.ba:hover{ filter: brightness(1.07) !important; box-shadow: 0 10px 30px rgba(34,211,238,.40) !important }
#p-auth .btn.ba:active{ transform: translateY(1px) scale(.995) !important }
#p-auth .aerr{ font-size:12.5px !important; }
/* jauge de solidité du mot de passe : rail discret */
#p-auth #pw-strength{ background:#1B2436 !important; }

/* ─── 9. PIED DE PAGE ─── */
#p-auth .evl-footer{
  text-align: center !important;
  padding: 4px 10px 0 !important;
}
#p-auth .evl-footer-links{
  display: flex !important;
  flex-wrap: wrap !important;
  justify-content: center !important;
  gap: 6px 18px !important;
}
#p-auth .evl-footer a{
  font-size: 12px !important;
  color: #94A3B8 !important;
  -webkit-text-fill-color: #94A3B8 !important;
  text-decoration: none !important;
  border-bottom: 0 !important;
  transition: color .15s ease !important;
}
#p-auth .evl-footer a:hover{ color:#22D3EE !important; -webkit-text-fill-color:#22D3EE !important }
#p-auth .evl-footer a.wa-footer{ color:#4ADE80 !important; -webkit-text-fill-color:#4ADE80 !important }
#p-auth .evl-footer a.wa-footer:hover{ color:#86EFAC !important; -webkit-text-fill-color:#86EFAC !important }
#p-auth .evl-copy{
  margin-top: 12px !important;
  font-size: 10.5px !important;
  color: #5B6B84 !important;
  -webkit-text-fill-color: #5B6B84 !important;
  font-weight: 500 !important;
}

/* ─── 10. ENTRÉE EN DOUCEUR (respect reduced-motion) ─── */
@media (prefers-reduced-motion: no-preference){
  #p-auth.on .aw > *{
    animation: evlIn .45s cubic-bezier(.22,.9,.3,1) both;
  }
  #p-auth.on .aw > *:nth-child(2){ animation-delay:.05s }
  #p-auth.on .aw > *:nth-child(3){ animation-delay:.10s }
  #p-auth.on .aw > *:nth-child(4){ animation-delay:.14s }
  #p-auth.on .aw > *:nth-child(5){ animation-delay:.18s }
  #p-auth.on .aw > *:nth-child(6){ animation-delay:.22s }
  @keyframes evlIn{
    from{ opacity:0; transform: translateY(10px) }
    to{ opacity:1; transform: none }
  }
}

/* ─── 11. MOBILE ─── */
@media (max-width: 430px){
  #p-auth.on{ padding: 76px 12px 40px !important }
  #p-auth .evl-card, #p-auth #ev-promo-card, #p-auth form.acard{ padding: 18px !important; border-radius: 17px !important }
  #p-auth .ahero h1{ font-size: 26px !important }
  #p-auth .ahero .hi{ width:60px !important; height:60px !important }
  #p-auth .ahero .hi svg{ width:31px; height:31px }
}

/* ─── 12. ACTIVITÉS MISES EN AVANT ─── */
#p-auth .ev-products-home{
  margin: 14px 0 18px;
  padding: 20px;
  border: 1px solid rgba(148,163,184,.20);
  border-radius: 20px;
  background: linear-gradient(145deg,rgba(15,23,42,.98),rgba(17,32,52,.96));
  box-shadow: 0 12px 30px rgba(2,8,23,.22);
}
#p-auth .ev-products-head{display:flex;align-items:flex-start;justify-content:space-between;gap:14px;margin-bottom:16px}
#p-auth .ev-products-kicker{font-size:11px;font-weight:800;letter-spacing:.08em;text-transform:uppercase;color:#67E8F9}
#p-auth .ev-products-head h2{margin:5px 0 3px;font-size:24px;line-height:1.15;color:#F8FAFC;letter-spacing:-.02em}
#p-auth .ev-products-head h2 span{font-size:15px;font-weight:700;color:#CBD5E1;letter-spacing:0}
#p-auth .ev-products-head p{margin:0;color:#94A3B8;font-size:12px;line-height:1.45}
#p-auth .ev-products-badge{display:grid;place-items:center;width:42px;height:42px;flex:0 0 42px;border-radius:14px;background:rgba(34,211,238,.14);font-size:23px}
#p-auth .ev-products-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:10px}
#p-auth .ev-product-card{display:flex;align-items:center;gap:11px;min-height:92px;padding:13px;border-radius:15px;border:1px solid rgba(255,255,255,.10);background:rgba(30,41,59,.72);box-sizing:border-box;transition:transform .15s ease,border-color .15s ease,background .15s ease}
#p-auth .ev-product-card:hover{transform:translateY(-2px);border-color:rgba(103,232,249,.55);background:rgba(30,41,59,.95)}
#p-auth .ev-product-icon{display:grid;place-items:center;width:42px;height:42px;flex:0 0 42px;border-radius:13px;background:rgba(255,255,255,.10);font-size:23px}
#p-auth .ev-product-card h3{margin:0;color:#F8FAFC;font-size:13px;line-height:1.2}
#p-auth .ev-product-card p{margin:3px 0 2px;color:#A5F3FC;font-size:12px;font-weight:700;line-height:1.25}
#p-auth .ev-product-card span{display:block;color:#94A3B8;font-size:10px;line-height:1.25}
#p-auth .ev-product-ps5 .ev-product-icon{background:rgba(59,130,246,.20)}
#p-auth .ev-product-ps4 .ev-product-icon{background:rgba(168,85,247,.20)}
#p-auth .ev-product-wheel .ev-product-icon{background:rgba(249,115,22,.20)}
#p-auth .ev-product-ping .ev-product-icon{background:rgba(16,185,129,.20)}
@media (max-width: 430px){
  #p-auth .ev-products-home{padding:16px;margin:12px 0 16px}
  #p-auth .ev-products-head h2{font-size:21px}
  #p-auth .ev-products-head h2 span{font-size:13px}
  #p-auth .ev-product-card{min-height:88px;padding:11px;gap:9px}
  #p-auth .ev-product-icon{width:36px;height:36px;flex-basis:36px;font-size:20px}
  #p-auth .ev-product-card h3{font-size:12px}
  #p-auth .ev-product-card p{font-size:11px}
}

/* =============== /css/ev-auth-login-first-v322.css?v=322-login-first-20260903 =============== */
/* ═══════════════════════════════════════════════════════════════════════
   2026-09-03 — LE FORMULAIRE DE CONNEXION REVIENT EN HAUT (décision Direction)
   ───────────────────────────────────────────────────────────────────────
   Constat mesuré sur https://vrespace.com/ (téléphone 390×844) : le champ
   « Identifiant » était à 1373 px du haut, soit 1,6 écran de défilement avant
   de pouvoir se connecter. Le personnel (Manager et opérateurs) passe par ce
   même formulaire à chaque prise de poste.

   ANNULE ET REMPLACE la directive « te9elb » du 12 juin 2026 inscrite dans
   ev-director-darkcards-v309.css (« ordre d'origine : Logo → Fidélité →
   connexion tout en bas, trade-off assumé : le staff doit scroller la pub »).
   La Direction a tranché l'inverse le 3 septembre 2026. Ne pas rétablir
   l'ancien ordre sans une nouvelle décision écrite.

   Nouvel ordre visuel :
     1. Logo + titre        2. Onglets Se connecter / S'inscrire
     3. Formulaires         4. Nos activités (« Choisis ton jeu »)
     5. Programme de fidélité                    9. Liens de bas de page

   Au passage : la section « Nos activités », ajoutée le 2 septembre, n'avait
   AUCUN ordre défini. Elle valait donc order:0 et remontait au-dessus même du
   logo — ce qui n'était voulu par personne. Elle a maintenant sa place.

   `.aw` est déjà en flex-column : tout est visuel, aucun HTML ni JS déplacé.
   ═══════════════════════════════════════════════════════════════════════ */

#p-auth .aw{ display:flex; flex-direction:column; }

#p-auth .aw > #hero{ order:1 !important; }
#p-auth .aw > .atabs{ order:2 !important; margin-top:18px; }
#p-auth .aw > #form-login,
#p-auth .aw > #form-signup,
#p-auth .aw > #form-otp{ order:3 !important; }
#p-auth .aw > .ev-products-home{ order:4 !important; margin-top:22px; }
#p-auth .aw > #programme{ order:5 !important; margin-top:16px; }
#p-auth .aw > .evl-footer,
#p-auth .aw > *:last-child{ order:9 !important; }

/* Les onglets deviennent atteignables au clavier : anneau de focus visible
   (ils restent des <div role="tab" tabindex="0">, cf. index.html). */
#p-auth .atab:focus-visible{
  outline:2px solid #22D3EE;
  outline-offset:2px;
  border-radius:10px;
}

/* =============== ev-audit-stability-fix =============== */
/* Audit 2026-09-03 : éviter que la page publique déplace ses cartes
     pendant le chargement. Les interactions de l'espace connecté restent
     inchangées. */
  body:has(#p-auth.on) #p-auth .aw > *,
  body:has(#p-auth.on) #p-auth #hero,
  body:has(#p-auth.on) #p-auth #programme,
  body:has(#p-auth.on) #p-auth .ev-products-home {
    animation: none !important;
    transition: none !important;
  }
  body:has(#p-auth.on) #p-auth .aw > * * {
    transition: none !important;
  }
