:root{
 --bg:#0d1117;--panel:#161b22;--panel2:#1c232d;--line:#263041;
 --txt:#e6edf3;--muted:#8b949e;--accent:#3d7eff;--danger:#e5484d;--ok:#3fb950;--warn:#e3b341;
 --orange:#ff6a00;--bleu:#2f7bff;--rouge:#ff3b30;--vert:#22c55e;--jaune:#eab308;
}
*{box-sizing:border-box}
body{margin:0;padding:0 14px 40px;background:var(--bg);color:var(--txt);
 font:15px/1.45 -apple-system,'Segoe UI',Roboto,Arial,sans-serif}
.fwver{text-align:center;color:var(--muted);font-size:11px;padding:18px 0 4px;opacity:.6}
h1{font-size:19px;margin:18px 0 4px}
h2{font-size:13px;letter-spacing:.08em;text-transform:uppercase;color:var(--muted);margin:22px 0 10px}
a{color:inherit;text-decoration:none}
.muted{color:var(--muted);font-size:13px}
.mono{font-family:ui-monospace,SFMono-Regular,Consolas,monospace;letter-spacing:.02em}
.hidden{display:none!important}

/* --- navigation --- */
nav{display:flex;gap:6px;padding:12px 0;overflow-x:auto}
nav a{flex:1;text-align:center;white-space:nowrap;padding:9px 12px;border-radius:9px;
 background:var(--panel);color:var(--muted);font-size:13px;font-weight:600;border:1px solid transparent}
nav a.on{background:var(--accent);color:#fff}
/* L'etat de connexion doit sauter aux yeux, jamais se confondre avec
   un onglet ordinaire : c'est precisement ce qui creait l'illusion. */
nav a.navauth{flex:none;font-weight:800}
nav a.navauth.in{background:rgba(227,179,65,.16);color:var(--warn);border-color:rgba(227,179,65,.4)}
nav a.navauth.out{background:rgba(63,185,80,.14);color:var(--ok);border-color:rgba(63,185,80,.35)}

/* --- pastilles de vue, page client (Supervision/Resultats/Equipes
   reunies sur une seule page - 4septvicies) : bascule interne, pas de
   navigation, donc pas de rechargement entre les trois. --- */
.vtabs{display:flex;flex-wrap:wrap;gap:6px;margin:14px 0}
/* Ligne cle/valeur (2.18.0) : utilisee par la bulle "Reseau utilise".
   Le libelle a gauche en gris, la valeur a droite, un filet entre
   deux. Pas de tableau : a 400 px de large un tableau force une
   barre de defilement horizontale, la ou un flex se replie. */
.l{display:flex;justify-content:space-between;gap:10px;padding:5px 0;
   border-bottom:1px solid var(--line);font-size:13px}
.l:last-child{border-bottom:0}
.l span:first-child{color:var(--muted);white-space:nowrap}
.l span:last-child{text-align:right;min-width:0}
.pt{display:inline-block;padding:2px 9px;border-radius:99px;font-size:12px;font-weight:700}
.pt.ok{background:rgba(63,185,80,.16);color:var(--ok)}
.pt.at{background:rgba(227,179,65,.16);color:var(--warn)}
.pt.no{background:rgba(229,72,77,.14);color:var(--danger)}
.vtabs.suite{margin-top:-8px}
.vtab{flex:1;text-align:center;padding:10px 8px;border-radius:10px;background:var(--panel);
 color:var(--muted);font-weight:700;font-size:13px;cursor:pointer;border:1px solid var(--line);
 -webkit-user-select:none;user-select:none}
.vtab.on{background:var(--accent);color:#fff;border-color:transparent}

/* --- bandeau d'etat colle en haut --- */
.bar{position:sticky;top:0;z-index:9;display:flex;align-items:center;gap:12px;
 background:var(--panel);border:1px solid var(--line);border-radius:14px;padding:14px;margin-bottom:14px}
.bar .grow{flex:1;min-width:0}
.pill{display:inline-block;padding:3px 10px;border-radius:99px;font-size:11px;font-weight:700;letter-spacing:.06em}
.pill.run{background:rgba(63,185,80,.16);color:var(--ok)}
.pill.wait{background:rgba(227,179,65,.16);color:var(--warn)}
.pill.done{background:rgba(139,148,158,.16);color:var(--muted)}
.timer{font-size:38px;font-weight:800;font-variant-numeric:tabular-nums;letter-spacing:-1px}
.timer.low{color:var(--danger)}

/* --- boutons --- */
button,.btn{font:inherit;font-weight:600;border:none;border-radius:10px;padding:11px 16px;
 background:var(--accent);color:#fff;cursor:pointer}
button:active{transform:scale(.97)}
.btn-lg{padding:14px 22px;font-size:16px}
.btn-danger{background:var(--danger)}
.btn-ghost{background:var(--panel2);color:var(--txt);border:1px solid var(--line)}
.btn-sm{padding:7px 11px;font-size:13px}

/* --- blocs --- */
section{background:var(--panel);border:1px solid var(--line);border-radius:14px;padding:14px;margin-bottom:14px}
section h2{margin-top:0}
.alert{display:flex;gap:10px;align-items:center;background:rgba(229,72,77,.12);
 border:1px solid rgba(229,72,77,.4);color:#ffb4b4;border-radius:12px;padding:11px 14px;margin-bottom:14px;font-size:14px}

/* --- appel d'avant-partie : pastilles de couleur et effectifs --- */
/* Trois colonnes : avec cinq equipes, ca fait deux lignes sans avoir a
   couper la liste a la main - et ca reste juste si le nombre d'equipes
   change un jour. */
.cpads{display:grid;grid-template-columns:repeat(3,1fr);gap:8px;margin-bottom:12px}
.cpad{border-radius:12px;padding:12px 6px 9px;text-align:center;line-height:1;
 border:3px solid transparent;opacity:.42;cursor:pointer;
 -webkit-user-select:none;user-select:none;transition:opacity .15s}
.cpad.on{opacity:1;border-color:#fff}
.cpad .cn{font-size:30px;font-weight:800;font-variant-numeric:tabular-nums}
.cpad .ct{font-size:11px;font-weight:800;letter-spacing:.07em;margin-top:6px;opacity:.9}
.cpad .ck{font-size:9.5px;font-weight:700;margin-top:5px;opacity:.7}
/* 6e bulle NOUVEL APPEL (2.74.0) : meme boite que les couleurs, pleine
   opacite puisqu'elle n'est jamais "selectionnee". L'icone occupe la
   hauteur du chiffre des autres bulles, pour que les six restent
   alignees. Au clic : l'icone fait un tour et la bulle entiere
   s'illumine d'un anneau qui s'efface. */
.cpad.crenew{opacity:1;background:#2a3140;color:#e6edf3;border-color:#3d4656}
.cpad.crenew svg{display:block;margin:0 auto;width:30px;height:30px}
.cpad.crenew.tourne svg{animation:crenTour .75s cubic-bezier(.45,0,.2,1)}
.cpad.crenew.tourne{animation:crenAnneau .75s ease-out}
@keyframes crenTour{from{transform:rotate(0)}to{transform:rotate(360deg)}}
@keyframes crenAnneau{0%{box-shadow:0 0 0 0 rgba(230,237,243,.55)}
 100%{box-shadow:0 0 0 14px rgba(230,237,243,0)}}
.apnotice{background:rgba(63,185,80,.1);border:1px solid rgba(63,185,80,.4);
 border-radius:12px;padding:10px 13px;margin-bottom:12px;font-size:12.5px;color:#bfe9c8}
.apbal{display:flex;align-items:center;gap:10px;flex-wrap:wrap;border-radius:12px;
 padding:10px 13px;margin-bottom:12px;background:var(--panel);border:1px solid var(--line)}
.apbal:empty{display:none}
.apbal.ok{border-color:rgba(63,185,80,.45)}
.apbal.near{border-color:rgba(227,179,65,.45)}
.apbal.off{border-color:rgba(229,72,77,.5)}
.apblb{font-size:10px;font-weight:800;letter-spacing:.07em;color:var(--muted)}
.apbv{flex:1;font-size:13px;font-weight:700}
.apbal.ok .apbv{color:var(--ok)}
.apbal.near .apbv{color:var(--warn)}
.apbal.off .apbv{color:var(--danger)}
.apbd{display:flex;gap:5px}

/* --- rangee TEAM (Supervision, organisateur et joueurs) ---
   Meme geometrie que .modes/.mode juste au-dessus : une pastille
   d'intitule, puis une bulle par equipe engagee. */
/* Une seule ligne, sur n'importe quel telephone. Les tailles sont en
   clamp() : elles se resserrent d'elles-memes quand l'ecran est etroit
   plutot que de faire deborder ou retomber les bulles a la ligne. Au
   dela de trois equipes engagees sur un tres petit ecran, la rangee
   defile horizontalement - mieux qu'une pile illisible. */
.tmrow{display:flex;gap:6px;margin-bottom:12px;align-items:stretch;
 overflow-x:auto;-webkit-overflow-scrolling:touch;scrollbar-width:none}
.tmrow::-webkit-scrollbar{display:none}
.tmrow:empty{display:none}
.tmlb{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:3px;
 flex:0 0 auto;padding:0 clamp(8px,3vw,14px);border-radius:12px;
 background:var(--panel);border:2px solid var(--line);
 color:var(--muted);font-weight:800;font-size:clamp(9px,2.6vw,11px);letter-spacing:.06em}
.tmec{font-size:clamp(8px,2.2vw,9px);font-weight:700;letter-spacing:.02em;color:var(--warn);
 background:rgba(227,179,65,.16);border-radius:99px;padding:1px 6px;white-space:nowrap}
.tmpad{flex:1 1 0;min-width:70px;border-radius:12px;padding:8px 5px;text-align:center;
 line-height:1;border:2px solid transparent}
.tmn{font-size:clamp(18px,5.5vw,24px);font-weight:800;font-variant-numeric:tabular-nums}
.tmt{font-size:clamp(8.5px,2.5vw,10px);font-weight:800;letter-spacing:.06em;margin-top:5px;
 opacity:.9;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.tmm{font-size:clamp(8px,2.3vw,9.5px);font-weight:700;margin-top:6px;padding-top:5px;
 border-top:1px solid rgba(0,0,0,.22);opacity:.85;
 white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.tmm.off{opacity:.55;font-weight:600}
.tmnone{flex:1 1 0;min-width:0;display:flex;align-items:center;border-radius:12px;background:var(--panel);
 border:2px dashed var(--line);color:var(--muted);font-size:clamp(10px,3vw,11.5px);
 padding:9px 12px;line-height:1.25}

/* --- suivi de l'appel : qui a repasse son badge --- */
.callbox{background:var(--panel);border:1px solid var(--line);border-radius:12px;
 padding:11px 13px;margin-bottom:12px}
.callbox.done{border-color:rgba(63,185,80,.45);background:rgba(63,185,80,.08)}
.callhead{display:flex;align-items:baseline;justify-content:space-between;gap:10px}
.calllb{font-size:10.5px;font-weight:800;letter-spacing:.07em;color:var(--muted)}
.callnum{font-size:12px;color:var(--muted);font-variant-numeric:tabular-nums}
.callnum b{font-size:17px;color:var(--txt)}
.callbox.done .callnum b{color:var(--ok)}
.calltrack{height:8px;border-radius:99px;background:var(--panel2);overflow:hidden;margin-top:7px}
.callfill{display:block;height:100%;border-radius:99px;background:var(--warn);transition:width .4s}
.callbox.done .callfill{background:var(--ok)}
.callmiss{margin-top:8px;font-size:12px;line-height:1.9}
.misspad{display:inline-flex;align-items:center;gap:5px;background:var(--panel2);
 border:1px solid var(--line);border-radius:99px;padding:2px 9px;margin:0 4px 0 0;
 font-size:11.5px;color:var(--txt)}
tr.unconf td{opacity:.55}

/* --- jauges de stockage (Score > Configuration) + alerte Supervision --- */
.sto{display:flex;flex-direction:column;gap:4px;padding:9px 0;border-bottom:1px solid var(--line)}
.sto:last-child{border-bottom:none}
.sto .stohead{display:flex;align-items:baseline;justify-content:space-between;gap:10px}
.sto .stolb{font-size:13px;font-weight:700}
.sto .stoval{font-size:12px;color:var(--muted);font-variant-numeric:tabular-nums}
.sto .stotrack{height:9px;border-radius:99px;background:var(--panel2);overflow:hidden}
.sto .stofill{height:100%;border-radius:99px;background:var(--ok);transition:width .4s}
.sto.w1 .stofill{background:var(--warn)}
.sto.w2 .stofill{background:var(--danger)}
.sto.w1 .stoval{color:var(--warn)}
.sto.w2 .stoval{color:var(--danger);font-weight:700}
.stobar{display:flex;align-items:center;justify-content:space-between;gap:10px;
 border-radius:12px;padding:9px 13px;margin-bottom:12px;font-size:13px;font-weight:700;
 border:1px solid transparent}
.stobar.w1{background:rgba(227,179,65,.14);border-color:rgba(227,179,65,.45);color:var(--warn)}
/* Respiration DOUCE (0.75 au creux, pas 0.45 comme .pulsing) : ce
   bandeau doit attirer l'oeil sans jamais devenir illisible - il reste
   affiche tant que le probleme dure, contrairement a un compte a
   rebours qu'on ne regarde que quelques secondes. */
.stobar.w2{background:rgba(229,72,77,.16);border-color:rgba(229,72,77,.55);color:#ffc4c4;
 animation:stobreathe 1.8s infinite}
@keyframes stobreathe{0%,100%{opacity:1}50%{opacity:.78}}
.stobar .stopct{font-size:16px;font-variant-numeric:tabular-nums}

/* --- classement equipes --- */
.team{display:flex;align-items:center;gap:10px;padding:7px 0}
.team .rk{width:18px;color:var(--muted);font-size:12px;font-weight:700}
.team .nm{width:74px;font-weight:700;font-size:13px}
.team .track{flex:1;height:10px;border-radius:99px;background:var(--panel2);overflow:hidden}
.team .fill{height:100%;border-radius:99px;transition:width .4s}
.team .val{width:78px;text-align:right;font-size:13px;font-variant-numeric:tabular-nums;color:var(--muted)}

/* --- partie suspendue --- */
body.paused .ref{background:linear-gradient(180deg,#2a2416,#1a1710);
 border-color:rgba(227,179,65,.45)}
body.paused .timer,body.paused .ref .big{opacity:.55}
.winbox{display:flex;align-items:center;gap:12px;background:rgba(63,185,80,.12);
 border:1px solid rgba(63,185,80,.45);border-radius:14px;padding:14px 16px;margin-bottom:14px}
.winbox .wt{font-size:24px;font-weight:800;letter-spacing:-.5px}
.winbox .wr{font-size:13px;color:var(--muted)}
.tile .sub{font-size:10px;opacity:.75;margin-top:4px;font-weight:600}

/* --- cartes d'objectif (Demolition, VIP) --- */
/* LES CARTES D'OBJECTIF EN GRILLE (2.87.3). Medecins, bases, VIP et
   Demolition ne prennent plus une ligne chacun : ils se rangent cote a
   cote, autant qu'il en tient. Sur une tablette a l'horizontale, les
   deux medecins et les deux bases tiennent sur UNE ligne ; sur un
   telephone (moins de 480 px utiles) on revient a une carte par ligne,
   parce qu'une carte plus etroite que 230 px coupe ses barres. */
#obj{display:grid;grid-template-columns:repeat(auto-fill,minmax(230px,1fr));gap:10px;margin-bottom:10px}
#obj:empty{display:none}
#obj>.obj{margin-bottom:0;min-width:0}
/* TELEPHONE (2.87.4) : deux cartes par ligne quand meme, en version
   compacte - titre et etat passent l'un sous l'autre, l'etiquette
   passe au-dessus de sa barre, textes et marges plus petits. */
@media(max-width:559px){
 #obj{grid-template-columns:repeat(2,minmax(0,1fr));gap:7px}
 #obj>.obj{padding:9px 9px;border-radius:11px}
 #obj .ohead{flex-wrap:wrap;gap:2px 6px;margin-bottom:5px}
 #obj .og{font-size:9.5px;letter-spacing:.04em}
 #obj .ost{flex-basis:100%;font-size:12.5px}
 #obj .otm{font-size:15px}
 #obj .otag{font-size:9.5px;padding:1px 6px}
 #obj .oline{flex-wrap:wrap;gap:3px;margin-top:4px}
 #obj .olb{min-width:0;flex-basis:100%;font-size:10.5px}
 #obj .otrack{height:6px}
 #obj .oinfo{font-size:10.5px;margin-top:5px;overflow-wrap:anywhere}
 #obj .chk-due{font-size:10.5px;padding:6px 7px;gap:4px}
 #obj .chk-due b{font-size:14px}
 #obj .btn-lg{padding:9px 6px;font-size:12px;margin-top:7px!important}
}
/* TABLETTE (2.87.4) : deux colonnes cote a cote, cartes en dessous.
   Une colonne droite sans rien a montrer (ni bombe, ni bornes) se
   retire, et la gauche prend toute la largeur (:has, navigateurs
   recents ; sans lui, la moitie droite reste simplement vide). */
@media(min-width:900px){
 #vsup{display:flex;flex-wrap:wrap;column-gap:14px;align-items:flex-start}
 #vsup>*{flex:0 0 100%;min-width:0}
 #vsup>.supcol{flex:1 1 0}
 #stoAlert{order:0}
 #supGauche{order:1}
 #supDroite{order:2}
 #obj{order:3}
 #vsup>.hidden{display:none}
 #supDroite:not(:has(>:not(.hidden))){display:none}
}
.obj{border-radius:14px;padding:13px 15px;margin-bottom:10px;border:1px solid var(--line);
 background:var(--panel);--oc:var(--muted)}
.obj.run{--oc:var(--warn);border-color:rgba(227,179,65,.4);background:rgba(227,179,65,.09)}
.obj.ok{--oc:var(--ok);border-color:rgba(63,185,80,.4);background:rgba(63,185,80,.09)}
.obj.ko{--oc:var(--danger);border-color:rgba(229,72,77,.45);background:rgba(229,72,77,.09)}
.obj .ohead{display:flex;align-items:baseline;gap:10px;margin-bottom:9px}
.obj .og{font-size:11px;font-weight:800;letter-spacing:.08em;color:var(--oc)}
.obj .ost{flex:1;font-size:14px;font-weight:700;overflow:hidden;
 text-overflow:ellipsis;white-space:nowrap}
.obj .otm{font-size:20px;font-weight:800;font-variant-numeric:tabular-nums;color:var(--oc)}
.obj .otm.low{color:var(--danger);animation:pulse 1s infinite}
.obj .oline{display:flex;align-items:center;gap:10px;margin-top:6px}
.obj .olb{font-size:12px;color:var(--muted);min-width:112px}
.obj .otrack{flex:1;height:8px;border-radius:99px;background:rgba(0,0,0,.3);overflow:hidden}
.obj .ofill{display:block;height:100%;background:var(--oc);border-radius:99px;transition:width .4s}
.obj .otag{font-size:11px;font-weight:700;padding:2px 9px;border-radius:99px;white-space:nowrap}
.obj .otag.y{background:rgba(63,185,80,.16);color:var(--ok)}
.obj .otag.n{background:rgba(139,148,158,.16);color:var(--muted)}
.obj .oinfo{font-size:12px;color:var(--muted);margin-top:9px;min-height:1em}

/* --- controle de possession en attente --- */
.chk-due{display:flex;align-items:center;justify-content:space-between;gap:10px;
 background:var(--danger);color:#fff;border-radius:10px;padding:9px 12px;margin-bottom:10px;
 font-size:12px;font-weight:700;letter-spacing:.03em;animation:pulse 1s infinite}
.chk-due b{font-size:19px;font-variant-numeric:tabular-nums}

/* --- parcours ordonne du VIP --- */
.route{display:flex;flex-direction:column;gap:6px;margin-top:8px}
.rstep{display:flex;align-items:center;gap:10px;padding:9px 12px;border-radius:10px;
 background:var(--panel2);border:1px solid var(--line)}
.rstep .rn{width:22px;height:22px;flex:none;border-radius:50%;background:var(--accent);
 color:#fff;font-size:12px;font-weight:800;display:flex;align-items:center;justify-content:center}
.rstep .rnm{flex:1;font-weight:600;font-size:14px}

/* --- bandeau bombe sur la supervision --- */
.bombstrip{display:flex;flex-wrap:wrap;align-items:center;gap:10px 12px;border-radius:14px;padding:12px 14px;
 margin-bottom:14px;border:1px solid var(--line);background:var(--panel)}
.bombstrip .lb{font-size:12px;font-weight:800;letter-spacing:.06em}
.bombstrip .tm{font-size:26px;font-weight:800;font-variant-numeric:tabular-nums;margin-left:auto}
.bombstrip .in{font-size:12px;opacity:.8;width:100%;order:3}
.bombstrip .acts{display:flex;gap:8px;width:100%;order:4}
.bombstrip .acts .bigbtn{flex:1 1 0;min-width:0}
.bombstrip.armed{background:rgba(227,179,65,.14);border-color:rgba(227,179,65,.45);color:var(--warn)}
.bombstrip.crit{background:rgba(229,72,77,.16);border-color:rgba(229,72,77,.5);color:#ff9b9b;
 animation:pulse 1s infinite}
.bombstrip.safe{background:rgba(63,185,80,.13);border-color:rgba(63,185,80,.4);color:var(--ok)}

/* --- barre d'arbitre --- */
/* Grille explicite : le chrono ne peut plus chevaucher l'etat ni les
   boutons, quelle que soit la largeur de l'ecran. */
.ref{display:grid;gap:10px;background:linear-gradient(180deg,#1b2230,#151a22);
 border:1px solid var(--line);border-radius:16px;padding:16px;margin-bottom:12px;
 cursor:pointer;-webkit-user-select:none;user-select:none}
/* Page client (lecture seule) : meme carte TEMPS DE JEU que sur la
   Supervision de l'organisateur, mais elle ne declenche plus rien au
   clic (voir PAGE_CLIENT) - curseur normal pour ne pas le laisser croire. */
.ref.refview{cursor:default}
.ref .refhead{display:flex;align-items:center;gap:10px;flex-wrap:wrap}
/* Badge chronometre, a cote de la pastille de phase : meme convention
   V/! que les pastilles de jeu (.chk), mais couleurs de la carte plutot
   que d'une pastille de jeu independante - la carte entiere fait office
   de bouton depuis 4quinvicies, plus besoin d'une pastille a part. */
.chronobtn{margin-left:auto;background:transparent;border:1px solid rgba(255,255,255,.25);
  color:inherit;border-radius:10px;padding:6px 8px;line-height:0;cursor:pointer}
.chronobtn.on{border-color:#4a90d9;color:#4a90d9}
.chronobtn.armed{border-color:var(--warn);color:var(--warn)}
.chronobadge{display:inline-flex;align-items:center;gap:6px;
 background:rgba(61,126,255,.16);color:var(--accent)}
.chronobadge.armed{background:rgba(227,179,65,.16);color:var(--warn)}
.chronobadge.armed .chk{background:var(--warn);color:#241c00}
.ref .lbl{font-size:11px;letter-spacing:.1em;color:var(--muted);font-weight:700}
.ref .big{font-size:52px;line-height:1;font-weight:800;font-variant-numeric:tabular-nums;
 letter-spacing:-2px}
.ref .big.low{color:var(--danger)}
.ref .refsub{font-size:13px}
.ref .refacts{display:flex;gap:8px}
.ref .refacts button{flex:1;padding:15px 12px;font-size:15px}
@media(min-width:560px){
  .ref{grid-template-columns:1fr auto;align-items:center}
  .ref .refhead{grid-column:1}
  .ref .big{grid-column:2;grid-row:1/3;text-align:right;font-size:60px}
  .ref .refsub{grid-column:1}
  .ref .refacts{grid-column:1/3}
}

/* --- boutons pleine largeur, utilisables avec des gants --- */
.bigbtn{flex:1;min-width:100px;padding:16px 10px;border-radius:12px;border:1px solid var(--line);
 background:var(--panel2);color:var(--txt);font-size:13px;font-weight:800;letter-spacing:.03em;
 cursor:pointer;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.bigbtn.danger{background:var(--danger);color:#fff;border-color:transparent}
.bigbtn.on{border-color:var(--ok);color:var(--ok)}
.bigbtn:active{transform:scale(.97)}

/* --- question posee quand un objectif est atteint --- */
.askbox{background:rgba(227,179,65,.13);border:1px solid rgba(227,179,65,.5);
 border-radius:14px;padding:14px;margin-bottom:14px}
.askbox .aq{font-size:15px;font-weight:700;color:var(--warn);margin-bottom:12px}
.askbox .ab{display:flex;gap:8px;flex-wrap:wrap}
.askbox .ab button{flex:1;min-width:140px;padding:15px}
/* Page client (lecture seule) : la question s'affiche, mais sans les
   boutons de decision - reserves a l'organisateur. */
.askbox .aqinfo{font-size:13px;color:var(--warn);opacity:.85}
.modes{display:flex;gap:8px;margin-bottom:8px}
.modes.row2{margin-bottom:6px}
.mode{flex:1;display:flex;align-items:center;justify-content:center;gap:6px;padding:12px 6px;min-width:0;
 border-radius:12px;background:var(--panel);border:2px solid var(--line);color:var(--muted);
 font-weight:700;font-size:12px;cursor:pointer;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;
 -webkit-user-select:none;user-select:none}
.mode.on{border-color:var(--accent);color:var(--txt);background:var(--panel2)}
.mode.on.armed{border-color:var(--warn);background:rgba(227,179,65,.13);color:var(--warn)}
.mode.on.armed .chk{background:var(--warn);color:#241c00}
.mode.soon{opacity:.4;cursor:default;border-style:dashed}
/* Pastilles du bip de reperage (1.9.31) : gris eteint, vert allume.
   Volontairement une couleur DIFFERENTE de celle des pastilles de jeu
   de la Supervision (bleu = jeu actif, orange = victoire armee) : ces
   bulles-ci ne disent pas si le jeu tourne, elles disent si le bip est
   autorise pendant ce jeu. Deux questions, deux couleurs - sinon on
   croit lire un etat de partie. */
.mode.bcn.on{border-color:var(--ok);color:var(--ok);background:rgba(63,185,80,.12)}
/* Sous-titre d'une pastille de jeu : sert a la pastille MEDECIN, qui a
   une SOURCE de soins a preciser (boitiers, bases, les deux) et pas
   seulement un etat. Une deuxieme ligne plutot qu'un libelle a
   rallonge, qui deborderait sur un telephone etroit. */
.mode .msrc{display:block;width:100%;font-size:9px;font-weight:700;
 letter-spacing:.02em;opacity:.8;margin-top:3px;text-transform:none}
.mode:has(.msrc){flex-wrap:wrap;line-height:1.15}
/* Page client (lecture seule) : memes pastilles de jeu que sur la
   Supervision de l'organisateur, mais sans gestionnaire de clic - le
   curseur doit le dire, sinon on croirait pouvoir cliquer. */
.mode.ro{cursor:default}
.chk{display:inline-flex;align-items:center;justify-content:center;width:18px;height:18px;
 border-radius:50%;background:var(--ok);color:#07230f;font-size:12px;font-weight:900}

/* --- paves a pictogramme --- */
.iconpads{display:flex;gap:8px;flex-wrap:wrap}

/* --- programme de la journee (2.1.0) ---
   Deux colonnes cote a cote des qu'il y a la place, empilees sur un
   telephone tenu a la verticale : sur le terrain on lit le programme
   plus souvent qu'on ne le modifie. */
/* 2.88.4 : minmax(0,1fr) et non 1fr. Une colonne « 1fr » ne descend pas
   sous la largeur de son contenu le plus large : sur un telephone de
   320 px, la Bibliotheque poussait la page 47 px trop a droite (mesure). */
.jrcols{display:grid;gap:14px;margin-top:16px;grid-template-columns:minmax(0,1fr)}
@media(min-width:760px){.jrcols{grid-template-columns:minmax(0,1fr) minmax(0,1fr)}}
.jrcol{background:var(--panel);border:1px solid var(--line);border-radius:12px;padding:14px}
.jrhead{display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;gap:6px 10px;margin-bottom:6px}
.jrmini{padding:5px 10px;font-size:12px}
.jrlist{display:grid;gap:8px;margin-top:12px;min-height:60px}
/* La colonne du programme s'eclaire quand on survole avec un creneau
   en main : sans ce retour, on ne sait pas si le geste va aboutir. */
.jrcol.survol{outline:2px dashed var(--accent);outline-offset:3px}

.jrcard{background:var(--panel2);border:1px solid var(--line);border-radius:10px;
  padding:10px 10px 10px 6px;display:flex;align-items:center;gap:8px;touch-action:manipulation}
.jrcard.pause{background:rgba(227,179,65,.10);border-color:rgba(227,179,65,.35)}
.jrcard.vole{opacity:.35}
.jrpoig{width:22px;height:34px;flex:none;display:grid;place-items:center;cursor:grab;
  color:var(--muted);touch-action:none;-webkit-user-select:none;user-select:none}
.jrpoig:active{cursor:grabbing}
.jrmain{flex:1;min-width:0;display:grid;gap:2px}
.jrtitre{font-weight:700;font-size:14px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.jrsub{font-size:11.5px;color:var(--muted);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
/* Assez large pour "13:15" comme pour "01:15 PM" : le format depend de
   la langue du telephone, pas de nous. Un champ tronque afficherait
   "01:0" et l'organisateur croirait a un bug. */
.jrh{width:92px;flex:none;font-size:13px;padding:6px 4px;text-align:center}
.jracts{display:flex;gap:4px;flex:none}
.jrb{width:30px;height:30px;border-radius:8px;border:1px solid var(--line);
  background:var(--panel);color:var(--txt);font-size:13px;display:grid;place-items:center;
  cursor:pointer;padding:0}
.jrb:hover{border-color:var(--accent)}
/* 2.88.4 : telephone tres etroit (moins de 380 px, ex. 320 px). Une carte
   du programme alignait poignee + heure (92 px) + 5 boutons (166 px) sur
   une ligne : 31 px de trop (mesure). En dessous de 380 px, le titre garde
   la premiere ligne, l'heure et les boutons passent sur la seconde. */
@media(max-width:379px){
  .jrcard{flex-wrap:wrap;row-gap:6px}
  .jrmain{flex:1 1 calc(100% - 40px)}
  .jracts{margin-left:auto}
  .jrb{width:28px;height:28px}
}
.jrb.rouge{color:var(--danger)}
.jrfant{position:fixed;z-index:60;pointer-events:none;opacity:.92;
  box-shadow:0 10px 26px rgba(0,0,0,.5)}

/* La bulle : un seul element reutilise, positionne sous l'icone touchee. */
.jrbulle{position:fixed;z-index:70;max-width:min(340px,88vw);background:var(--panel2);
  border:1px solid var(--line);border-radius:12px;padding:12px 14px;font-size:12.5px;
  line-height:1.5;box-shadow:0 14px 34px rgba(0,0,0,.55)}
.jrbulle h4{margin:0 0 8px;font-size:13px}
.jrbulle dl{margin:0;display:grid;grid-template-columns:auto 1fr;gap:3px 10px}
.jrbulle dt{color:var(--muted)}
.jrbulle dd{margin:0}
.jrbulle .fermer{float:right;color:var(--muted);cursor:pointer;margin:-4px -4px 0 8px;padding:4px}
.jrpuce{display:inline-block;width:9px;height:9px;border-radius:50%;margin-right:5px}

/* --- mesure d'antenne (1.9.38) : trois chiffres cote a cote ---
   Trois colonnes egales meme sur un telephone : ces valeurs se
   comparent d'un coup d'oeil, les empiler les rendrait illisibles. */
.antgrid{display:grid;grid-template-columns:repeat(3,1fr);gap:8px;margin-top:10px}
.antbox{background:var(--panel2);border:1px solid var(--line);border-radius:10px;
 padding:12px 8px;text-align:center}
.antval{font-size:22px;font-weight:800;line-height:1.1}
.antlab{font-size:11px;color:var(--muted);margin-top:4px}
.ipad{flex:1 1 96px;min-width:96px;display:flex;flex-direction:column;align-items:center;gap:7px;
 padding:14px 8px;border-radius:12px;background:var(--panel2);border:2px solid transparent;
 color:var(--muted);font-size:12px;font-weight:700;cursor:pointer;text-align:center}
.ipad.on{border-color:var(--accent);color:var(--txt)}
.ipad .duo{display:flex;align-items:center;gap:4px}
.ipad .duo .sep{font-size:16px;opacity:.6}

/* --- selecteur de joueurs replie par equipe --- */
.plist{margin-top:8px;display:grid;gap:6px;grid-template-columns:repeat(auto-fill,minmax(148px,1fr))}
.ulimit{background:#3a2a12;border:1px solid #6b4a1c;border-radius:9px;
  padding:8px 10px;margin:8px 0;font-size:12px;line-height:1.4}
.ulimit .btn-sm{margin-left:6px}
.pcount{display:block;font-size:10px;opacity:.85;margin-top:3px}

/* --- paves de selection multiple --- */
.pads{display:flex;gap:8px;flex-wrap:wrap}
/* Selecteurs d'equipe (Enrolement, Badges, Appel) : grille de trois
   colonnes plutot qu'un flex qui etire la derniere bulle sur toute la
   largeur. Cinq equipes tombent donc en 3 + 2, six (avec "TOUS") en
   3 + 3 - et les trois pastilles se ressemblent enfin. Les autres
   usages de .pads (choix de joueur, d'equipe dans les regles de jeu)
   gardent le flex : leur nombre d'elements est variable. */
.pads.g3{display:grid;grid-template-columns:repeat(3,1fr)}
.pads.g3 .pad{min-width:0}
.pad{flex:1 1 92px;min-width:92px;padding:15px 8px;border-radius:12px;text-align:center;
 font-weight:800;font-size:13px;letter-spacing:.04em;border:2px solid transparent;
 opacity:.38;cursor:pointer;-webkit-user-select:none;user-select:none;transition:opacity .15s}
.pad.on{opacity:1;border-color:#fff}
.pad.plain{background:var(--panel2);color:var(--txt)}
.pad.plain.on{border-color:var(--accent)}
.badgelist{display:grid;gap:6px;grid-template-columns:repeat(auto-fill,minmax(148px,1fr))}
.bpad{display:flex;align-items:center;gap:8px;padding:10px;border-radius:10px;font-size:13px;
 background:var(--panel2);border:2px solid transparent;cursor:pointer;opacity:.5}
.bpad.on{border-color:var(--accent);opacity:1}

/* --- tuiles des equipes en jeu --- */
.tiles{display:grid;gap:8px;grid-template-columns:repeat(auto-fit,minmax(88px,1fr));margin-bottom:16px}
.tile{border-radius:12px;padding:13px 8px;text-align:center;line-height:1}
.tile .n{font-size:30px;font-weight:800}
.tile .t{font-size:11px;font-weight:700;letter-spacing:.07em;margin-top:6px;opacity:.85}

/* --- cartes points : la couleur remplit toute la carte --- */
.grid{display:grid;gap:9px;grid-template-columns:repeat(2,minmax(0,1fr))}
@media(min-width:660px){.grid{grid-template-columns:repeat(auto-fill,minmax(200px,1fr))}}
.pt{border-radius:14px;padding:13px;min-height:106px;background:var(--panel2);
 border:1px solid var(--line);transition:background .3s,opacity .3s}
.pt.held{border-color:transparent}
/* Selection multi-points (Supervision, hors partie uniquement) */
.pt.selectable{cursor:pointer}
.pt.psel{box-shadow:0 0 0 3px var(--accent) inset}
.pt.pexcl{opacity:.4}
.pt .nm{font-size:14px;font-weight:700;overflow:hidden;text-overflow:ellipsis;
 white-space:nowrap;display:flex;align-items:center;gap:5px}
.pt .conn{flex:none;display:inline-flex;align-items:center;gap:3px;color:currentColor}
.pt .rssi{font-size:10px;font-weight:600;opacity:.75;font-variant-numeric:tabular-nums;white-space:nowrap}
.pt .ow{font-size:22px;font-weight:800;letter-spacing:-.5px;margin-top:5px;
 overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.pt .sc{font-size:12px;opacity:.75;font-variant-numeric:tabular-nums;margin-top:2px}
.cap{margin-top:12px}
.cap .lbl{font-size:11px;font-weight:700;letter-spacing:.04em;margin-bottom:5px}
.cap .track{height:7px;border-radius:99px;background:rgba(0,0,0,.3);overflow:hidden}
.cap .fill{height:100%;transition:width .3s}
@keyframes pulse{0%,100%{opacity:1}50%{opacity:.45}}
.pulsing{animation:pulse 1s infinite}
/* --- CA TOURNE, DONC CA TRAVAILLE (2.54.0) ---
   Une page qui ne bouge pas et une page bloquee se ressemblent
   trop. Rotation pure CSS : pas d'image a charger, et elle
   s'arrete d'elle-meme des que la classe disparait. */
@keyframes vtourne{to{transform:rotate(360deg)}}
.tourne{display:inline-block;animation:vtourne 1.1s linear infinite}
.tag{font-size:10px;font-weight:700;letter-spacing:.05em;padding:2px 7px;border-radius:99px;white-space:nowrap}
.tag.on{background:rgba(63,185,80,.15);color:var(--ok)}
.tag.off{background:rgba(229,72,77,.15);color:var(--danger)}

/* --- test de communication (Score > Configuration > Communication) --- */
.ctgroup{font-size:12px;font-weight:700;letter-spacing:.04em;text-transform:uppercase;
 color:var(--muted);margin:16px 0 6px}
.ctgroup:first-child{margin-top:0}
.ctrow{display:flex;align-items:center;gap:8px;padding:8px 0;border-top:1px solid var(--line)}
.ctname{flex:1;font-size:14px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.ctres{font-size:12px;white-space:nowrap}

/* --- tableaux & formulaires --- */
table{width:100%;border-collapse:collapse;font-size:14px}
th{text-align:left;font-size:11px;letter-spacing:.05em;text-transform:uppercase;color:var(--muted);padding:6px 8px}
td{padding:8px;border-top:1px solid var(--line);vertical-align:middle}
input,select{width:100%;padding:10px;border-radius:9px;border:1px solid var(--line);
 background:#0d1117;color:var(--txt);font:inherit}
label{display:block;font-size:13px;color:var(--muted);margin:12px 0 5px}
/* BAREME FIGE (2.87.5) : Score > Jeux se lit, ne se modifie plus. Les
   champs en lecture seule gardent leur valeur bien lisible (pas le gris
   pale du navigateur), mais perdent leur cadre de saisie. */
.fige{background:rgba(61,126,255,.10);border:1px solid rgba(61,126,255,.35);border-radius:12px;
 padding:10px 12px;margin:0 0 14px;font-size:13px;line-height:1.45}
.fige b{display:block;color:var(--txt);margin-bottom:2px}
.fige .muted{display:block;margin-top:4px;font-size:12px}
#vresCfg input[type=number][readonly],#vresCfg select:disabled{background:transparent;border-color:transparent;
 color:var(--txt);opacity:1;-webkit-text-fill-color:var(--txt);padding-left:0;font-weight:700;cursor:default}
#vresCfg select:disabled{-webkit-appearance:none;appearance:none}
.row{display:flex;gap:8px;align-items:center;flex-wrap:wrap}
.dot{width:11px;height:11px;border-radius:50%;flex:none;background:var(--c,#39424f)}
.teambtn{display:block;width:100%;padding:18px;font-size:17px;font-weight:800;border-radius:12px;
 margin-bottom:8px;color:#fff;opacity:.45;border:2px solid transparent}
.teambtn.on{opacity:1;border-color:#fff}
/* Choix de l'equipe d'une base (Enrolement > Modules) : sous le champ
   du nom, jamais a cote - la place manque sur un telephone. Tant
   qu'aucune equipe n'est choisie, le champ se signale : une base sans
   couleur ne soigne personne. */
/* Identite d'un boitier : adresse au-dessus, etat en dessous. Les deux
   tiennent alors dans une colonne etroite sans ecraser le champ du nom. */
.modid .mono{font-size:11px;letter-spacing:0;word-break:break-all;line-height:1.25}
.modid .tag{margin-top:5px;display:inline-block}
.teamIn{margin-top:6px}
.teamIn.vide{border-color:rgba(229,72,77,.55);color:#ffb4b4}
.big{font-size:26px;font-weight:800}
