/* ── RESET ── */
*{margin:0;padding:0;box-sizing:border-box}
:root{
  --bg:#06080f;--surf:#0d1117;--bdr:#1e2733;
  --acc:#00e5ff;--grn:#00e096;--yel:#ffcc00;--red:#ff3d71;
  --txt:#c9d1d9;--mut:#4a5568;
  --mono:'Share Tech Mono',monospace;--sans:'Rajdhani',sans-serif;
}
html,body{width:100%;height:100%;overflow:hidden;background:var(--bg);color:var(--txt);font-family:var(--sans);overscroll-behavior:none}
::-webkit-scrollbar{width:3px}::-webkit-scrollbar-thumb{background:var(--bdr)}

/* ── SHELL — header fijo + body que llena el resto ── */
#shell{position:fixed;inset:0;width:100%;height:100%;height:100dvh;min-height:0;display:flex;flex-direction:column;overflow:hidden}
#topbar{height:48px;flex-shrink:0;display:flex;align-items:center;justify-content:space-between;
  padding:0 14px;background:var(--surf);border-bottom:1px solid var(--bdr);gap:12px}
#topbar-left{display:flex;align-items:center;gap:14px;min-width:0}
#top-routes{display:flex;align-items:center;gap:8px;flex-wrap:wrap}
.route-link{border:none;background:transparent;color:var(--mut);font-family:var(--mono);font-size:10px;letter-spacing:2px;cursor:pointer;padding:4px 0;text-decoration:none}
.route-link.on{color:var(--acc);text-shadow:0 0 10px rgba(0,229,255,.35)}
.route-link:hover{color:var(--txt)}
#tabbar{height:38px;flex-shrink:0;display:flex;background:var(--surf);border-bottom:1px solid var(--bdr)}
#body{flex:1;overflow:hidden;display:flex;min-height:0}
#route-options,#route-physics,#route-maps,#route-registro,#route-estadisticas,#route-reportes,#route-botarena,#route-datos,#route-updates{display:none;flex:1 1 0;width:100%;min-height:0;overflow-x:hidden;overflow-y:auto;-webkit-overflow-scrolling:touch;overscroll-behavior-y:contain;touch-action:pan-y;background:var(--bg);padding:12px 12px calc(28px + env(safe-area-inset-bottom))}
#route-options.on,#route-physics.on,#route-maps.on,#route-registro.on,#route-estadisticas.on,#route-reportes.on,#route-botarena.on,#route-datos.on,#route-updates.on{display:flex}
#options-wrap,#physics-wrap,#estadisticas-wrap,#reportes-wrap,#datos-wrap{width:min(900px,100%);margin:0 auto;display:flex;flex-direction:column;gap:10px;flex:0 0 auto;padding-bottom:8px}
#physics-home-btn{width:100%;padding:12px 14px;font-size:15px;letter-spacing:2px}
#physics-route-hd,#options-route-hd{padding:4px 2px 0;font-family:var(--mono);font-size:10px;letter-spacing:3px;color:var(--mut)}
#physics-route-sub,#options-route-sub,.route-page-sub{padding:0 2px 6px;font-size:12px;color:var(--txt)}
.route-page-hd{padding:4px 2px 0;font-family:var(--mono);font-size:10px;letter-spacing:3px;color:var(--mut)}
.data-overview-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(150px,1fr));gap:8px}
.data-kpi{border:1px solid var(--bdr);border-radius:6px;background:#0a0f16;padding:9px 10px;min-width:0}
.data-kpi .k{font-family:var(--mono);font-size:9px;letter-spacing:2px;color:var(--mut);margin-bottom:4px}
.data-kpi .v{font-family:var(--mono);font-size:16px;color:#fff;word-break:break-word}
.data-kpi .sub{font-family:var(--mono);font-size:9px;color:var(--mut);margin-top:3px}
.activity-canvas-wrap{position:relative;width:100%;height:250px;border:1px solid var(--bdr);border-radius:6px;background:#080d14;overflow:hidden}
#server-activity-canvas{display:block;width:100%;height:100%}
.data-range-row{display:flex;gap:6px;flex-wrap:wrap}
.data-range-btn.on{border-color:var(--acc);color:var(--acc);background:rgba(0,229,255,.1)}
.data-player-row,.data-archive-row{display:grid;grid-template-columns:44px minmax(0,1fr) 110px 130px;gap:8px;align-items:center;padding:8px 9px;border:1px solid var(--bdr);border-radius:6px;background:#0a0f16;font-family:var(--mono);font-size:10px}
.data-player-name{color:#fff;font-size:11px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.data-player-meta{color:var(--mut);font-size:9px}
.data-rank{color:var(--acc);font-size:12px;text-align:center}
.data-archive-row{grid-template-columns:minmax(0,1fr) 100px 150px auto}
@media(max-width:620px){.activity-canvas-wrap{height:210px}.data-player-row{grid-template-columns:34px minmax(0,1fr);}.data-player-row .data-player-entries,.data-player-row .data-player-time{grid-column:2}.data-archive-row{grid-template-columns:minmax(0,1fr) auto}.data-archive-row .data-archive-size,.data-archive-row .data-archive-date{grid-column:1}}

/* ── TABS ── */
.tab{flex:1;border:none;background:transparent;color:var(--mut);font-family:var(--mono);
  font-size:10px;letter-spacing:2px;cursor:pointer;border-bottom:2px solid transparent;transition:.15s}
.tab.on{color:var(--acc);border-bottom-color:var(--acc)}

/* ── PANELS ── */
/* Cada panel ocupa todo el body */
.pane{display:none}
.pane.on{display:flex;flex-direction:column;width:100%;height:100%;min-height:0}
#pane-control{overflow-y:auto;padding:10px;gap:8px}
#pane-chat{flex-direction:column;overflow-y:auto;overflow-x:hidden}
#pane-players{overflow-y:auto;padding:10px;gap:6px}

@media(min-width:1120px){
  #tabbar{display:none}
  #body{gap:1px;background:var(--bdr)}
  .pane{display:flex;flex-direction:column;width:auto;height:100%;min-height:0}
  #pane-control{width:265px;flex-shrink:0}
  #pane-chat{flex:1.75;min-width:620px}
  #pane-players{width:220px;flex-shrink:0}
  #route-options,#route-physics,#route-maps,#route-registro,#route-estadisticas,#route-reportes,#route-botarena,#route-datos,#route-updates{padding:16px 18px}
}
@media(max-width:1119px){
  #topbar{height:auto;min-height:48px;padding-top:6px;padding-bottom:6px;align-items:flex-start}
  #topbar-left{flex-direction:column;align-items:flex-start;gap:6px}
  #top-routes{gap:12px}
}
@media(min-width:1120px){
  #pane-chat{overflow-x:hidden;overflow-y:auto}
}
@media(max-width:620px){
  #scoreboard{display:grid!important;grid-template-columns:auto minmax(0,1fr)!important;grid-template-areas:"score clock" "actions actions";row-gap:7px!important;padding:7px 8px!important}
  #scoreboard>div:nth-child(1){grid-area:score}
  #scoreboard>div:nth-child(2){grid-area:clock}
  #scoreboard>div:nth-child(3){grid-area:actions;width:100%;display:grid!important;grid-template-columns:repeat(4,minmax(0,1fr));gap:5px!important}
  #scoreboard>div:nth-child(3) .btn{width:100%;min-width:0;padding-left:4px;padding-right:4px}
}

/* ── CHAT específico: log + mensajes + input con alturas absolutas ── */
#chat-log-hd{height:36px;flex-shrink:0;display:flex;align-items:center;justify-content:space-between;
  padding:0 10px;border-bottom:1px solid var(--bdr);cursor:pointer;
  font-family:var(--mono);font-size:9px;letter-spacing:3px;color:var(--mut)}
#chat-log-body{flex:0 1 auto;min-height:0;overflow:hidden;transition:height .2s;border-bottom:1px solid var(--bdr)}
#chat-log-inner{height:100%;max-height:220px;overflow-y:auto;overscroll-behavior:contain;padding:4px 8px}
#pane-chat{min-height:0}
#chat-hd{height:36px;flex-shrink:0;display:flex;align-items:center;justify-content:space-between;
  padding:0 10px;border-bottom:1px solid var(--bdr);
  font-family:var(--mono);font-size:9px;letter-spacing:3px;color:var(--mut)}
/* 2.5.106: el chat se achica con la ventana (antes min 260 px sin encogerse: la barra para hablar quedaba afuera
   y los últimos mensajes debajo del borde, sin rueda que los alcance). */
#chat-msgs{flex:1 1 0;overflow-y:auto;overscroll-behavior:contain;padding:8px;display:flex;flex-direction:column;gap:3px;min-height:140px}
#chat-inp{height:46px;flex-shrink:0;display:flex;align-items:center;gap:6px;
  padding:0 8px;border-top:1px solid var(--bdr);background:var(--surf)}
#chat-inp input{flex:1}
.token-wrap{position:relative;display:flex;align-items:center}
.token-wrap input{padding-right:42px}
#inp-token::placeholder{-webkit-user-select:none;user-select:none;pointer-events:none}
.token-clear{position:absolute;right:6px;top:50%;transform:translateY(-50%);border:none;background:linear-gradient(90deg, rgba(10,15,22,0) 0%, #0a0f16 35%, #0a0f16 100%);color:var(--mut);cursor:pointer;font-size:16px;line-height:1;padding:0 8px;height:24px;display:flex;align-items:center;border-radius:4px}
.token-clear:hover{color:var(--red)}
.token-clear.hidden{display:none}

/* ── BLOQUES DE CONTROL ── */
.sec{border:1px solid var(--bdr);border-radius:6px;overflow:hidden;flex-shrink:0}
.sec-hd{padding:6px 10px;background:#0a0f16;font-size:9px;letter-spacing:3px;
  color:var(--mut);font-family:var(--mono);border-bottom:1px solid var(--bdr);
  display:flex;align-items:center;justify-content:space-between;cursor:default}
.sec-hd.click{cursor:pointer}
.sec-body{padding:10px;display:flex;flex-direction:column;gap:7px}

/* ── INPUTS ── */
input[type=text],input[type=password],input[type=number]{
  width:100%;background:#0a0f16;border:1px solid var(--bdr);border-radius:4px;
  padding:6px 10px;color:var(--txt);font-family:var(--mono);font-size:12px;outline:none}
input:focus{border-color:var(--acc)}
select{width:100%;background:#0a0f16;border:1px solid var(--bdr);border-radius:4px;
  padding:6px 10px;color:var(--txt);font-family:var(--mono);font-size:12px;outline:none;cursor:pointer}

/* ── BOTONES ── */
.btn{padding:6px 12px;border-radius:4px;border:1px solid;font-family:var(--sans);
  font-size:12px;font-weight:700;letter-spacing:1px;cursor:pointer;transition:.15s;
  display:inline-flex;align-items:center;justify-content:center;gap:5px;white-space:nowrap;flex-shrink:0}
.btn:disabled{opacity:.3;cursor:not-allowed}
.g{border-color:var(--grn);color:var(--grn);background:rgba(0,224,150,.07)}
.g:hover:not(:disabled){background:rgba(0,224,150,.18)}
.r{border-color:var(--red);color:var(--red);background:rgba(255,61,113,.07)}
.r:hover:not(:disabled){background:rgba(255,61,113,.18)}
.b{border-color:var(--acc);color:var(--acc);background:rgba(0,229,255,.07)}
.b:hover:not(:disabled){background:rgba(0,229,255,.18)}
.y{border-color:var(--yel);color:var(--yel);background:rgba(255,204,0,.07)}
.y:hover:not(:disabled){background:rgba(255,204,0,.18)}
.ghost{border-color:var(--bdr);color:var(--mut);background:transparent}
.ghost:hover:not(:disabled){border-color:var(--txt);color:var(--txt)}
.sm{padding:4px 8px;font-size:11px}
.full{width:100%}
.row{display:flex;gap:6px}

/* ── TOGGLES ── */
.tog-row{display:flex;align-items:center;justify-content:space-between;padding:4px 0;gap:8px}
.tog-lbl{font-size:12px;font-weight:700;letter-spacing:1px}
.tog-desc{font-size:10px;color:var(--mut);font-family:var(--mono)}
.tog{position:relative;width:38px;height:21px;flex-shrink:0}
.tog input{position:absolute;opacity:0;width:100%;height:100%;cursor:pointer;margin:0;z-index:1}
.tog-tr{position:absolute;inset:0;border-radius:11px;border:1px solid var(--bdr);background:#0a0f16;pointer-events:none;transition:.2s}
.tog-tr::after{content:'';position:absolute;width:15px;height:15px;border-radius:50%;
  background:var(--mut);top:2px;left:2px;transition:.2s}
.tog input:checked~.tog-tr{border-color:var(--grn);background:rgba(0,224,150,.15)}
.tog input:checked~.tog-tr::after{transform:translateX(17px);background:var(--grn);box-shadow:0 0 6px var(--grn)}
.tog input:disabled~.tog-tr{opacity:.4}

/* ── LOG ── */
.ll{font-size:10px;font-family:var(--mono);line-height:1.6;display:flex;gap:6px}
.lt{color:var(--mut);flex-shrink:0;font-size:9px}
.lm{flex:1;word-break:break-word}
.lm.error{color:var(--red)}.lm.link{color:var(--grn);font-weight:700}
.lm.join{color:#4fc3f7}.lm.leave{color:var(--mut)}.lm.game{color:var(--yel)}
.lm.chat{color:var(--txt)}.lm.system,.lm.info{color:var(--mut)}

/* ── CHAT MSGS ── */
.cm{font-size:12px;font-family:var(--mono);line-height:1.5;word-break:break-word}
.ct{color:var(--mut);margin-right:5px;font-size:10px}
.cn{margin-right:4px;font-weight:700}.cn.p{color:var(--acc)}.cn.s{color:var(--yel)}

/* ── PLAYERS ── */
.pr{border:1px solid var(--bdr);border-radius:6px;background:#0a0f16;overflow:hidden;flex-shrink:0}
.pr-main{display:flex;align-items:center;gap:8px;padding:8px 10px}
.pr.t1 .pr-main{border-left:3px solid #4fc3f7}
.pr.t2 .pr-main{border-left:3px solid #ef5350}
.pr.t0 .pr-main{border-left:3px solid var(--mut)}
.pr-name{font-size:13px;font-weight:700;display:flex;align-items:center;gap:4px}
.pr-meta{font-size:10px;color:var(--mut);font-family:var(--mono);margin-top:2px;display:flex;gap:6px;flex-wrap:wrap}
.pr-btns{display:flex;gap:3px;flex-shrink:0}
.pr-menu{border-top:1px solid var(--bdr);padding:8px;display:flex;flex-direction:column;gap:6px}
.pr-menu-btns{display:flex;flex-wrap:wrap;gap:5px}
.pr-phy{display:flex;flex-direction:column;gap:5px;padding-top:6px;border-top:1px solid var(--bdr)}
.pr-phy .row{align-items:center;gap:6px}
.pr-phy .lbl{font-size:10px;font-family:var(--mono);color:var(--mut);width:90px;flex-shrink:0}
.ping{color:var(--grn)}.ping.hi{color:var(--yel)}.ping.bad{color:var(--red)}

/* ── MISC ── */
.rl{padding:7px 10px;background:rgba(0,224,150,.07);border:1px solid rgba(0,224,150,.2);
  border-radius:4px;font-family:var(--mono);font-size:11px;word-break:break-all}
.rl a{color:var(--grn);text-decoration:none}
.flash{padding:7px 10px;border-radius:4px;font-size:11px;font-family:var(--mono);
  border:1px solid;text-align:center;flex-shrink:0}
.flash.ok{border-color:var(--grn);color:var(--grn);background:rgba(0,224,150,.07)}
.flash.err{border-color:var(--red);color:var(--red);background:rgba(255,61,113,.07)}
.lock-note{padding:8px 10px;border:1px solid rgba(255,204,0,.35);background:rgba(255,204,0,.08);border-radius:4px;color:var(--yel);font-size:10px;font-family:var(--mono);line-height:1.45}
.empty{color:var(--mut);font-size:11px;font-family:var(--mono);text-align:center;padding:14px}
.pill{display:flex;align-items:center;gap:5px;padding:3px 10px;border-radius:20px;
  border:1px solid;font-size:9px;letter-spacing:2px;font-family:var(--mono)}
.pill.on{border-color:var(--grn);color:var(--grn)}.pill.off{border-color:var(--red);color:var(--red)}
.dot{width:5px;height:5px;border-radius:50%}
.dot.on{background:var(--grn);box-shadow:0 0 8px var(--grn);animation:blink 2s infinite}
.dot.off{background:var(--red)}
@keyframes blink{0%,100%{opacity:1}50%{opacity:.3}}

/* Métricas */
.metrics-grid{display:grid;grid-template-columns:1fr 1fr;gap:6px}
.metric{background:#0a0f16;border:1px solid var(--bdr);border-radius:5px;padding:8px 10px}
.metric-label{font-size:8px;letter-spacing:2px;color:var(--mut);font-family:var(--mono);margin-bottom:4px}
.metric-val{font-size:17px;font-weight:700;font-family:var(--mono);line-height:1}
.metric-sub{font-size:9px;color:var(--mut);font-family:var(--mono);margin-top:2px}
.bar-wrap{background:#0a0f16;border-radius:3px;height:5px;margin-top:6px;overflow:hidden}
.bar{height:5px;border-radius:3px;transition:width .8s ease}
.bar.cpu{background:var(--acc)}
.bar.mem{background:var(--grn)}
.bar.sys{background:var(--yel)}
.metric.warn .metric-val{color:var(--yel)}
.metric.crit .metric-val{color:var(--red)}
.uplz{border:1px dashed var(--bdr);border-radius:6px;padding:10px;text-align:center;
  cursor:pointer;font-size:11px;color:var(--mut);font-family:var(--mono)}
.uplz:hover{border-color:var(--acc);color:var(--acc)}
.sub{font-size:9px;letter-spacing:2px;color:var(--mut);font-family:var(--mono);padding:4px 0 2px}
.fl{display:flex;align-items:center;gap:6px}
.fl .lbl{font-size:10px;font-family:var(--mono);color:var(--mut);width:105px;flex-shrink:0}

.config-two-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:10px}

.manual-two-grid{display:grid;grid-template-columns:minmax(0,1fr) 280px;gap:10px;align-items:start}
.map-preview-card{border:1px solid var(--bdr);border-radius:8px;background:#0a0f16;padding:10px;display:flex;flex-direction:column;gap:8px;min-height:100%}
.map-preview-stage{min-height:320px;border:1px solid var(--bdr);border-radius:8px;overflow:hidden;background:linear-gradient(180deg,#0a1320,#07101a);display:flex;align-items:center;justify-content:center}
.map-preview-stage svg{display:block;width:100%;height:320px}
.map-preview-empty{padding:16px;text-align:center;font-size:11px;line-height:1.5;color:var(--mut);font-family:var(--mono)}
.map-preview-title{font-size:12px;font-weight:700;color:var(--txt)}
.map-preview-meta{font-size:10px;line-height:1.55;color:var(--txt);font-family:var(--mono);display:flex;flex-direction:column;gap:4px}
.map-preview-chip-row{display:flex;flex-wrap:wrap;gap:5px}
.map-preview-chip{padding:3px 6px;border:1px solid var(--bdr);border-radius:999px;background:#081018;color:var(--acc);font-size:9px;letter-spacing:1px;font-family:var(--mono)}
@media (max-width: 980px){
  .manual-two-grid{grid-template-columns:1fr}
  .map-preview-stage,.map-preview-stage svg{height:260px;min-height:260px}
}
.config-card{border:1px solid var(--bdr);border-radius:8px;background:#0a0f16;padding:10px;display:flex;flex-direction:column;gap:8px}
.limit-two-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:10px}
.limit-span-two{grid-column:1 / -1}
.ready-pill{display:inline-flex;align-items:center;justify-content:center;min-width:58px;padding:8px 10px;border:1px solid var(--bdr);border-radius:8px;background:#0a0f16;color:var(--acc);font-family:var(--mono);font-size:18px;font-weight:900}
.mode-hint{font-size:10px;color:var(--txt);font-family:var(--mono);line-height:1.4;border:1px solid var(--bdr);border-radius:6px;padding:8px;background:#0a0f16}
@media (max-width: 900px){
  .config-two-grid,.limit-two-grid{grid-template-columns:1fr}
  .limit-span-two{grid-column:auto}
}


#registro-wrap{display:flex;flex-direction:column;gap:12px;width:min(1100px,100%);margin:0 auto}
#registro-grid{display:grid;grid-template-columns:1.2fr .9fr;gap:12px;min-height:0}
.reg-card{border:1px solid var(--bdr);border-radius:8px;background:#0a0f16;padding:12px;display:flex;flex-direction:column;gap:10px;min-height:0}
.reg-card-hd{font-family:var(--mono);font-size:11px;letter-spacing:2px;color:var(--acc)}
.reg-muted{font-size:10px;color:var(--mut);font-family:var(--mono)}
/* En pantallas bajas la fila del grid se comprimía y la lista (que es el contenido real) se
   quedaba en 0 px mientras el paginador se escapaba de la tarjeta y caía encima de la tarjeta
   siguiente, quedando imposible de clickear. La lista es lo que puede encogerse, con un piso; el
   paginador nunca encoge; la tarjeta no deja escapar nada y el grid no achica sus filas por
   debajo del contenido mínimo, así que la página scrollea en vez de superponerse. */
#registro-grid{grid-auto-rows:minmax(min-content,auto)}
.reg-card{overflow:hidden}
#replay-list,#player-registry-list{display:flex;flex-direction:column;gap:8px;flex:1 1 auto;min-height:80px;overflow:auto}
.replay-pager{flex:0 0 auto}
.replay-item,.registry-item{border:1px solid var(--bdr);border-radius:6px;background:#0d131d;padding:10px;display:flex;flex-direction:column;gap:5px}
.replay-row,.registry-row{display:flex;justify-content:space-between;gap:10px;align-items:center}
.replay-name,.registry-name{font-family:var(--mono);font-size:11px;color:var(--txt);word-break:break-word}
.replay-meta,.registry-meta{font-family:var(--mono);font-size:10px;color:var(--mut);line-height:1.45;word-break:break-word}
.replay-pager{display:flex;justify-content:center;align-items:center;gap:6px;flex-wrap:wrap}
.replay-pager .btn{min-width:34px}
.reg-empty{padding:12px;border:1px dashed var(--bdr);border-radius:6px;font-family:var(--mono);font-size:10px;color:var(--mut);text-align:center}
@media (max-width: 980px){#registro-grid{grid-template-columns:1fr}}

#updates-wrap{width:min(900px,100%);margin:0 auto;display:flex;flex-direction:column;gap:12px;flex:0 0 auto;padding-bottom:8px}
.update-drop{border:1px dashed var(--bdr);border-radius:8px;background:#0a0f16;padding:24px 16px;text-align:center;display:flex;flex-direction:column;gap:8px;cursor:pointer;transition:.15s}
.update-file-input,.file-input-hidden{position:absolute!important;width:1px!important;height:1px!important;padding:0!important;margin:-1px!important;overflow:hidden!important;clip:rect(0,0,0,0)!important;white-space:nowrap!important;border:0!important;opacity:0!important}
.update-choose-btn{min-height:44px;cursor:pointer;-webkit-tap-highlight-color:transparent;touch-action:manipulation}
.update-drop:hover,.update-drop.drag{border-color:var(--acc);background:rgba(0,229,255,.05)}
.update-file-name{font-family:var(--mono);font-size:11px;color:var(--txt);word-break:break-word}
.update-status{border:1px solid var(--bdr);border-radius:8px;background:#0a0f16;padding:12px;display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:8px}
.update-kv{border:1px solid var(--bdr);border-radius:6px;background:#0d131d;padding:9px}
.update-k{font-family:var(--mono);font-size:8px;letter-spacing:2px;color:var(--mut);margin-bottom:4px}
.update-v{font-family:var(--mono);font-size:12px;color:var(--txt);word-break:break-word}
.update-note{font-family:var(--mono);font-size:10px;line-height:1.55;color:var(--mut)}
.update-note.warn{color:var(--yel);border:1px solid rgba(255,204,0,.35);background:rgba(255,204,0,.07);border-radius:6px;padding:9px}
.update-note.err{color:var(--red)}
.update-note.ok{color:var(--grn)}
.update-diagnostic{display:none;border:1px solid rgba(255,61,90,.55);border-radius:8px;background:#160b0d;padding:12px;gap:10px;flex-direction:column}
.update-diagnostic.on{display:flex}
.update-diagnostic-title{font-family:var(--mono);font-size:11px;letter-spacing:1.6px;color:var(--red);font-weight:900}
.update-diagnostic-meta{font-family:var(--mono);font-size:9px;line-height:1.55;color:var(--mut)}
.update-diagnostic-pre{margin:0;max-height:360px;overflow:auto;white-space:pre-wrap;word-break:break-word;border:1px solid var(--bdr);border-radius:6px;background:#080c12;padding:10px;font-family:var(--mono);font-size:9px;line-height:1.55;color:var(--txt)}
.update-diagnostic-actions{display:flex;gap:8px;flex-wrap:wrap}
@media(max-width:650px){.update-status{grid-template-columns:1fr}}

/* 2.3.10 · worker de analytics / mantenimiento */
.data-worker-status{border:1px solid var(--bdr);background:#0b1016;padding:10px 12px;display:flex;flex-direction:column;gap:9px}
.data-worker-head{display:flex;align-items:flex-start;justify-content:space-between;gap:10px;flex-wrap:wrap}
.data-worker-title{font-family:var(--mono);font-size:10px;letter-spacing:1.7px;color:var(--acc)}
.data-worker-sub,.data-worker-note{font-family:var(--mono);font-size:9px;line-height:1.45;color:var(--mut);margin-top:3px}
.data-worker-state{font-family:var(--mono);font-size:10px;letter-spacing:1px;white-space:nowrap}
.data-worker-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(145px,1fr));gap:7px}
.data-worker-grid>div{border:1px solid var(--bdr);background:#080c11;padding:7px 8px;min-width:0}
.data-worker-grid span{display:block;font-family:var(--mono);font-size:8px;letter-spacing:1px;color:var(--mut);margin-bottom:3px}
.data-worker-grid strong{display:block;font-family:var(--mono);font-size:10px;color:var(--txt);font-weight:500;overflow-wrap:anywhere}

/* 2.3.11 · credenciales admin de sala y admins persistentes */
.admin-key-result{border:1px solid var(--bdr);border-radius:6px;background:#090d14;padding:8px;display:flex;flex-direction:column;gap:6px}
.admin-key-label{font-family:var(--mono);font-size:8px;letter-spacing:1.6px;color:var(--acc)}
.admin-key-row{display:flex;gap:6px;align-items:center}
.admin-key-row input{flex:1;min-width:0;font-family:var(--mono);font-size:11px;letter-spacing:.6px}
.admin-key-divider{height:1px;background:var(--bdr);margin:2px 0}
.registry-admin-actions{display:flex;align-items:center;justify-content:flex-end;gap:6px;flex-wrap:wrap}
.registry-admin-badge{font-family:var(--mono);font-size:8px;letter-spacing:1px;color:var(--grn);border:1px solid rgba(0,224,150,.35);border-radius:999px;padding:3px 6px;background:rgba(0,224,150,.07)}
.registry-admin-btn{white-space:nowrap}
@media(max-width:520px){.admin-key-row{align-items:stretch;flex-direction:column}.registry-row{align-items:flex-start}.registry-admin-actions{justify-content:flex-start}}

/* 2.3.12 · supervisor: estado actual separado del historial JJRS */

/* 2.3.54 · administración móvil/PWA */
@media (max-width:700px){
  .layout,.main-grid,.control-grid{grid-template-columns:1fr!important;}
  .sidebar{position:static!important;width:100%!important;}
  .btn{min-height:44px} .btn.sm{min-height:44px}
  .row{flex-wrap:wrap}.row>.btn,.row>.inp,.row>select{min-width:120px}
  .metrics-grid{grid-template-columns:repeat(2,minmax(0,1fr))!important}
  #datos-wrap,#updates-wrap{padding:8px!important}
}
@media (max-width:430px){.metrics-grid{grid-template-columns:1fr!important}.route-page-hd{font-size:22px!important}}

/* 2.3.56: aviso persistente cuando una actualización requiere sincronizar PM2/supervisor. */
.update-restart-banner{margin:8px 10px 0;padding:9px 12px;border:1px solid var(--red);border-radius:6px;background:#19090d;color:#ff8ca8;font-family:var(--mono);font-size:10px;font-weight:900;line-height:1.45;letter-spacing:.3px;box-shadow:0 0 16px rgba(255,61,113,.12)}


/* MAP LAB 2.3.62 */
#maps-wrap{width:100%;max-width:1480px;margin:0 auto;display:flex;flex-direction:column;gap:10px;min-width:0}
.maplab-source-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:10px}
.maplab-source-card{display:flex;flex-direction:column;gap:8px;min-width:0}
.maplab-card-title{font-family:var(--mono);font-size:10px;letter-spacing:2px;color:var(--acc);font-weight:700}
.maplab-row{display:flex;gap:6px;align-items:center;min-width:0}
.maplab-row select{flex:1;min-width:0}
.maplab-help{font-family:var(--mono);font-size:9px;line-height:1.55;color:var(--mut)}
.maplab-help code{color:var(--txt)}
.maplab-drop{border:1px dashed var(--bdr);border-radius:7px;min-height:56px;display:flex;align-items:center;justify-content:center;text-align:center;padding:9px;color:var(--mut);font-family:var(--mono);font-size:10px;cursor:pointer;background:#090e15;transition:border-color .15s,background .15s,color .15s}
.maplab-drop.drag{border-color:var(--acc);color:var(--acc);background:rgba(0,229,255,.05)}
.maplab-status{border:1px solid var(--bdr);border-radius:7px;background:#090e15;padding:8px 10px;font-family:var(--mono);font-size:10px;color:var(--mut);line-height:1.45}
.maplab-status.ok{border-color:rgba(73,214,142,.45);color:var(--grn)}
.maplab-status.err{border-color:rgba(255,61,113,.55);color:var(--red);background:rgba(255,61,113,.05)}
.maplab-toolbar{display:flex;gap:8px;align-items:center;justify-content:space-between;flex-wrap:wrap;padding:8px}
.maplab-toolbar-group{display:flex;gap:5px;align-items:center;flex-wrap:wrap}
.maplab-mode.on{box-shadow:0 0 0 1px rgba(0,229,255,.25) inset}
.maplab-layers{display:flex;gap:10px;align-items:center;flex-wrap:wrap;padding:9px}
.maplab-layers .maplab-card-title{width:100%}
.maplab-layers label{display:flex;gap:6px;align-items:center;font-family:var(--mono);font-size:10px;color:var(--txt);min-height:28px}
.maplab-layers input{accent-color:var(--acc)}
.maplab-main-grid{display:grid;grid-template-columns:minmax(0,1fr) minmax(260px,330px);gap:10px;align-items:start;min-width:0}
.maplab-canvas-card{display:flex;flex-direction:column;gap:8px;min-width:0;padding:9px}
.maplab-canvas-head{display:flex;align-items:center;justify-content:space-between;gap:10px;min-width:0}
.maplab-title{font-size:13px;font-weight:700;color:var(--txt);word-break:break-word}
.maplab-file-label{font-family:var(--mono);font-size:9px;color:var(--mut);word-break:break-all;margin-top:2px}
.maplab-zoom-label{font-family:var(--mono);font-size:10px;color:var(--acc);white-space:nowrap}
.maplab-canvas-wrap{position:relative;width:100%;min-height:520px;border:1px solid var(--bdr);border-radius:8px;overflow:hidden;background:#0f1218;touch-action:none;user-select:none}
#maplab-canvas{display:block;width:100%;height:520px;cursor:grab;background:#0f1218}
#maplab-canvas.dragging{cursor:grabbing}
.maplab-coords{position:absolute;right:8px;bottom:8px;border:1px solid rgba(255,255,255,.12);background:rgba(4,8,12,.75);border-radius:5px;padding:4px 6px;color:#e8edf3;font:9px var(--mono);pointer-events:none}
.maplab-side{display:flex;flex-direction:column;gap:10px;min-width:0}
.maplab-side>.card{display:flex;flex-direction:column;gap:8px;min-width:0}
.maplab-summary{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:5px}
.maplab-stat{border:1px solid var(--bdr);border-radius:6px;padding:6px;background:#090e15;min-width:0}
.maplab-stat-k{font-family:var(--mono);font-size:8px;letter-spacing:1px;color:var(--mut)}
.maplab-stat-v{font-family:var(--mono);font-size:12px;color:var(--txt);margin-top:2px;word-break:break-word}
.maplab-validation{display:flex;flex-direction:column;gap:5px;font-family:var(--mono);font-size:9px;line-height:1.45}
.maplab-valid-ok{color:var(--grn)}
.maplab-valid-warn{color:var(--yel);border-left:2px solid var(--yel);padding-left:6px}
.maplab-valid-err{color:var(--red);border-left:2px solid var(--red);padding-left:6px}
.maplab-object{margin:0;max-height:260px;overflow:auto;border:1px solid var(--bdr);border-radius:6px;background:#070b10;padding:8px;color:#c9d1d9;font:9px/1.5 var(--mono);white-space:pre-wrap;word-break:break-word}
.maplab-physics-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:10px}
@media(max-width:980px){.maplab-main-grid{grid-template-columns:1fr}.maplab-side{display:grid;grid-template-columns:repeat(3,minmax(0,1fr))}.maplab-canvas-wrap{min-height:440px}#maplab-canvas{height:440px}}
@media(max-width:720px){.maplab-source-grid,.maplab-physics-grid{grid-template-columns:1fr}.maplab-side{grid-template-columns:1fr}.maplab-toolbar{align-items:stretch}.maplab-toolbar-group{width:100%}.maplab-toolbar-group .btn{flex:1}.maplab-canvas-wrap{min-height:360px}#maplab-canvas{height:360px}.maplab-row{flex-wrap:wrap}.maplab-row select{flex-basis:100%}}
@media(max-width:430px){.maplab-canvas-wrap{min-height:300px}#maplab-canvas{height:300px}.maplab-summary{grid-template-columns:1fr 1fr}}

/* Bot Arena Lab 2.5.5 */
.ba-switch-line{display:flex;align-items:center;gap:7px;min-height:32px;color:var(--txt);font-size:11px;font-family:var(--mono)}
.ba-switch-line input{width:18px;height:18px;accent-color:var(--acc)}
.ba-queue-builder{display:grid;grid-template-columns:minmax(170px,1fr) minmax(170px,1fr) minmax(180px,230px) auto;gap:10px;align-items:end}
.ba-queue-field{display:flex;flex-direction:column;gap:6px;min-width:0}
.ba-queue-field>span{font-size:10px;font-family:var(--mono);color:var(--mut);letter-spacing:.5px}
.ba-queue-field select,.ba-queue-field input{width:100%;min-width:0;box-sizing:border-box}
.ba-repeat-field input{font-size:15px;font-weight:700;text-align:center;min-height:34px;border-color:var(--yellow)}
@media (max-width:760px){.ba-queue-builder{grid-template-columns:1fr 1fr}.ba-repeat-field{grid-column:1/-1}.ba-queue-builder>#ba-q-add{grid-column:1/-1;width:100%}}

.ba-analysis-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(170px,1fr));gap:10px}.ba-fixed-value{font-family:var(--mono);font-size:12px;color:var(--txt);padding:8px 10px;border:1px solid var(--line);border-radius:7px;background:rgba(255,255,255,.03)}.ba-analysis-live{display:grid;grid-template-columns:repeat(auto-fit,minmax(130px,1fr));gap:8px}.ba-analysis-live>div{padding:9px;border:1px solid var(--line);border-radius:8px;background:rgba(0,0,0,.12)}.ba-analysis-live span{display:block;font-size:9px;color:var(--mut);text-transform:uppercase;letter-spacing:1px}.ba-analysis-live strong{display:block;margin-top:4px;font-family:var(--mono);font-size:15px;color:var(--acc)}#ba-analysis-timer{font-size:22px;color:var(--yellow)}
.training-live-admin{margin-top:10px}.training-live-list{display:grid;gap:8px}.training-live-row{display:grid;grid-template-columns:minmax(130px,1fr) auto;gap:8px;align-items:center;border:1px solid var(--bdr);background:#080c11;padding:9px}.training-live-row>div:first-child{display:grid;gap:3px}.training-live-row strong{font-size:11px}.training-live-row span,.training-live-stats{font-family:var(--mono);font-size:9px;color:var(--mut)}.training-live-controls{grid-column:1/-1;display:flex;gap:7px;align-items:center}.training-live-controls .btn{width:auto;min-height:30px;padding:5px 8px;font-size:9px}.training-live-controls select,.training-access-row select{min-width:150px;min-height:30px;background:#0b1118;color:var(--txt);border:1px solid var(--bdr);font-family:var(--mono);font-size:9px}.training-access-row{display:flex;align-items:center;justify-content:space-between;gap:8px;border:1px dashed var(--bdr);padding:7px 9px;font-family:var(--mono);font-size:9px;color:var(--mut)}.training-live-empty{padding:10px}@media(max-width:680px){.training-live-row{grid-template-columns:1fr}.training-live-controls,.training-access-row{flex-direction:column;align-items:stretch}.training-live-controls .btn,.training-live-controls select,.training-access-row select{width:100%}}
