/* viveQ Secure Control · consola web */
:root{--bg:#050b14;--bg2:#08111f;--panel:#0b1728;--panel2:#0f2038;--line:#1b3150;--line2:#26436b;--tx:#e6f1ff;--mut:#8aa4c4;--cy:#22d3ee;--bl:#3b82f6;--gr:#10b981;--am:#f59e0b;--rd:#ef4444;--vi:#a78bfa;--or:#f97316;
--mono:ui-monospace,SFMono-Regular,Menlo,Consolas,"Liberation Mono",monospace;--sans:system-ui,-apple-system,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif}
*{box-sizing:border-box;margin:0;padding:0}
[hidden]{display:none!important}
html{color-scheme:dark}
body{background:var(--bg);color:var(--tx);font:14px/1.45 var(--sans);min-height:100vh;overflow-x:hidden}
body::before{content:"";position:fixed;inset:0;pointer-events:none;z-index:0;background:
 linear-gradient(rgba(34,211,238,.035) 1px,transparent 1px) 0 0/44px 44px,linear-gradient(90deg,rgba(34,211,238,.035) 1px,transparent 1px) 0 0/44px 44px,
 radial-gradient(1200px 600px at 80% -10%,rgba(59,130,246,.14),transparent 60%),radial-gradient(900px 500px at -10% 110%,rgba(16,185,129,.08),transparent 60%)}
button,input,select,textarea{font:inherit;color:inherit}
button{cursor:pointer}
a{color:var(--cy)}
.mono{font-family:var(--mono)}
.mut{color:var(--mut)}
.sr{position:absolute;left:-9999px}
svg.ic{width:1.15em;height:1.15em;fill:none;stroke:currentColor;stroke-width:1.8;stroke-linecap:round;stroke-linejoin:round;vertical-align:-.2em;flex:none}

/* ── Login ── */
#login{position:fixed;inset:0;z-index:100;background:var(--bg);display:grid;place-items:center;padding:16px;overflow:auto}
#login::after{content:"";position:absolute;inset:0;background:repeating-linear-gradient(0deg,rgba(0,0,0,.18) 0 1px,transparent 1px 3px);pointer-events:none}
.lg{width:min(960px,100%);display:grid;grid-template-columns:1.1fr 1fr;gap:0;border:1px solid var(--line2);border-radius:18px;background:linear-gradient(160deg,rgba(15,32,56,.92),rgba(7,15,28,.96));box-shadow:0 0 0 1px rgba(34,211,238,.08),0 30px 90px rgba(0,0,0,.6),0 0 80px rgba(34,211,238,.07);overflow:hidden;position:relative;z-index:1}
.lg-l{padding:34px;border-right:1px solid var(--line);position:relative;min-height:420px}
.lg-r{padding:34px;display:flex;flex-direction:column;gap:14px}
.boot{font:12px/1.7 var(--mono);color:#7fe9ff;margin-top:22px;min-height:190px;white-space:pre-wrap}
.boot .ok{color:var(--gr)}.boot .wr{color:var(--am)}
.cur{display:inline-block;width:.6em;height:1em;background:var(--cy);vertical-align:-.12em;animation:blink 1s steps(1) infinite}
.logo{display:flex;align-items:center;gap:12px}
.logo svg{width:46px;height:46px;flex:none;filter:drop-shadow(0 0 10px rgba(34,211,238,.45))}
.logo b{font-size:26px;letter-spacing:-.5px;font-weight:800}.logo b i{color:var(--cy);font-style:normal}
.logo small{display:block;font:600 10px var(--mono);letter-spacing:.28em;color:var(--mut);margin-top:2px}
.cls{display:inline-flex;gap:8px;align-items:center;font:700 11px var(--mono);letter-spacing:.14em;color:var(--am);border:1px solid rgba(245,158,11,.45);background:rgba(245,158,11,.08);padding:5px 10px;border-radius:6px}
.cls::before{content:"";width:8px;height:8px;border-radius:50%;background:var(--am);animation:blink 1.2s steps(1) infinite}
.roles{display:grid;gap:8px}
.role{display:flex;gap:12px;align-items:center;text-align:left;border:1px solid var(--line);background:rgba(11,23,40,.8);border-radius:10px;padding:10px 12px;transition:.2s}
.role:hover,.role.on{border-color:var(--cy);background:rgba(34,211,238,.08);box-shadow:0 0 0 1px rgba(34,211,238,.25) inset}
.role b{display:block;font-size:14px}.role span{font-size:12px;color:var(--mut)}
.role .ic{font-size:20px;color:var(--cy)}
.field{display:grid;gap:5px}
.field label{font:600 11px var(--mono);letter-spacing:.12em;color:var(--mut);text-transform:uppercase}
.inp{width:100%;background:#071221;border:1px solid var(--line2);border-radius:9px;padding:10px 12px;outline:none;transition:.15s}
.inp:focus{border-color:var(--cy);box-shadow:0 0 0 3px rgba(34,211,238,.15)}
select.inp{appearance:none;background-image:linear-gradient(45deg,transparent 50%,var(--mut) 50%),linear-gradient(135deg,var(--mut) 50%,transparent 50%);background-position:calc(100% - 17px) 55%,calc(100% - 12px) 55%;background-size:5px 5px;background-repeat:no-repeat;padding-right:30px}
.btn{display:inline-flex;align-items:center;gap:8px;justify-content:center;border:1px solid var(--line2);background:var(--panel2);border-radius:9px;padding:9px 14px;font-weight:600;transition:.15s;white-space:nowrap}
.btn:hover:not(:disabled){border-color:var(--cy);box-shadow:0 0 18px rgba(34,211,238,.18)}
.btn:disabled{opacity:.4;cursor:not-allowed}
.btn.pri{background:linear-gradient(180deg,#0ea5c6,#0b7f9c);border-color:#22d3ee;color:#02131a}
.btn.dng{background:rgba(239,68,68,.14);border-color:rgba(239,68,68,.6);color:#ffb4b4}
.btn.dng:hover:not(:disabled){box-shadow:0 0 22px rgba(239,68,68,.35)}
.btn.ok{background:rgba(16,185,129,.14);border-color:rgba(16,185,129,.55);color:#9df0cf}
.btn.sm{padding:5px 9px;font-size:12px;border-radius:7px}
.btn.ghost{background:transparent}

/* ── Shell ── */
.shell{position:relative;z-index:1;display:grid;grid-template-columns:240px 1fr;min-height:100vh}
.side{background:linear-gradient(180deg,rgba(8,17,31,.96),rgba(5,11,20,.98));border-right:1px solid var(--line);padding:16px 12px;display:flex;flex-direction:column;gap:6px;position:sticky;top:0;height:100vh;overflow:auto;z-index:20}
.side .logo{padding:4px 8px 14px}
.nav{display:flex;align-items:center;gap:11px;padding:10px 12px;border-radius:10px;color:var(--mut);border:1px solid transparent;background:none;text-align:left;width:100%;position:relative}
.nav:hover{color:var(--tx);background:rgba(34,211,238,.05)}
.nav.on{color:#fff;background:linear-gradient(90deg,rgba(34,211,238,.16),rgba(34,211,238,.02));border-color:rgba(34,211,238,.35)}
.nav.on::before{content:"";position:absolute;left:-12px;top:20%;bottom:20%;width:3px;border-radius:3px;background:var(--cy);box-shadow:0 0 10px var(--cy)}
.nav .bdg{margin-left:auto;font:700 11px var(--mono);background:var(--rd);color:#fff;border-radius:99px;padding:1px 7px;animation:pulseBg 1.2s infinite}
.side .grp{font:700 10px var(--mono);letter-spacing:.2em;color:#5d7aa0;padding:12px 12px 4px}
.side .foot{margin-top:auto;font:11px var(--mono);color:#5d7aa0;padding:10px}
.main{min-width:0;display:flex;flex-direction:column}
.top{display:flex;align-items:center;gap:12px;padding:10px 20px;border-bottom:1px solid var(--line);background:rgba(5,11,20,.82);backdrop-filter:blur(8px);position:sticky;top:0;z-index:15;flex-wrap:wrap}
.top h1{font-size:17px;font-weight:700;letter-spacing:.02em}
.top .sp{flex:1}
.chip{display:inline-flex;align-items:center;gap:6px;font:600 11px var(--mono);letter-spacing:.06em;border:1px solid var(--line2);border-radius:99px;padding:4px 10px;background:rgba(15,32,56,.7);white-space:nowrap}
.chip.g{color:#7ee7b8;border-color:rgba(16,185,129,.5)}.chip.a{color:#fcd38a;border-color:rgba(245,158,11,.5)}.chip.r{color:#ffb0b0;border-color:rgba(239,68,68,.6)}.chip.c{color:#8defff;border-color:rgba(34,211,238,.5)}.chip.v{color:#cdbdff;border-color:rgba(167,139,250,.5)}
.dot{width:8px;height:8px;border-radius:50%;background:var(--gr);box-shadow:0 0 8px currentColor;display:inline-block}
.dot.r{background:var(--rd);animation:blink .8s steps(1) infinite}.dot.a{background:var(--am)}
.hamb{display:none}
.banner{display:none;align-items:center;gap:12px;padding:9px 20px;font-weight:700;letter-spacing:.06em;color:#fff;background:repeating-linear-gradient(-45deg,#7f1d1d 0 14px,#b91c1c 14px 28px);background-size:200% 100%;animation:hazard 2s linear infinite;border-bottom:1px solid #ef4444;z-index:14;font-family:var(--mono);font-size:12px}
.banner.on{display:flex}
.ticker{background:#030812;border-bottom:1px solid var(--line);font:11px var(--mono);color:#59789e;padding:5px 20px;white-space:nowrap;overflow:hidden;letter-spacing:.1em}
.ticker span{display:inline-block;animation:marq 38s linear infinite;padding-left:100%}
.view{padding:20px;display:grid;gap:16px;position:relative;align-content:start}
.view::after{content:attr(data-wm);position:fixed;right:10px;bottom:6px;font:10px var(--mono);color:rgba(138,164,196,.28);letter-spacing:.12em;pointer-events:none;z-index:3}
.grid{display:grid;gap:16px}
.g4{grid-template-columns:repeat(auto-fit,minmax(200px,1fr))}
.g2{grid-template-columns:repeat(auto-fit,minmax(340px,1fr))}
.g3{grid-template-columns:repeat(auto-fit,minmax(280px,1fr))}
.card{background:linear-gradient(180deg,rgba(15,32,56,.78),rgba(10,22,38,.88));border:1px solid var(--line);border-radius:14px;padding:16px;position:relative;min-width:0}
.card h3{font:700 12px var(--mono);letter-spacing:.16em;text-transform:uppercase;color:#8fb2da;margin-bottom:12px;display:flex;gap:8px;align-items:center}
.card h3 .r{margin-left:auto;display:flex;gap:6px;align-items:center}
.card.sens{border-color:rgba(245,158,11,.45);box-shadow:0 0 0 1px rgba(245,158,11,.1) inset}
.card.sens::before{content:"ZONA SENSIBLE · SOLO PERSONAL AUTORIZADO";position:absolute;top:-1px;left:16px;transform:translateY(-50%);font:700 9px var(--mono);letter-spacing:.18em;color:#1a1100;background:repeating-linear-gradient(-45deg,#f59e0b 0 8px,#fbbf24 8px 16px);padding:2px 10px;border-radius:4px}
.card.crit{border-color:rgba(239,68,68,.55)}
.kpi{display:flex;flex-direction:column;gap:2px;overflow:hidden}
.kpi .v{font:800 34px/1 var(--mono);letter-spacing:-.02em}
.kpi .l{font:600 11px var(--mono);letter-spacing:.14em;color:var(--mut);text-transform:uppercase}
.kpi .s{font-size:12px;color:var(--mut)}
.kpi::after{content:"";position:absolute;right:-30px;top:-30px;width:110px;height:110px;border-radius:50%;background:radial-gradient(circle,var(--k,rgba(34,211,238,.18)),transparent 70%)}
.bar{height:7px;background:#0a1626;border-radius:9px;overflow:hidden;border:1px solid var(--line)}
.bar i{display:block;height:100%;border-radius:9px;background:linear-gradient(90deg,var(--cy),var(--bl));transition:width .8s}
.bar.g i{background:linear-gradient(90deg,#059669,#34d399)}.bar.a i{background:linear-gradient(90deg,#d97706,#fbbf24)}.bar.r i{background:linear-gradient(90deg,#dc2626,#f87171)}
table{width:100%;border-collapse:collapse;font-size:13px}
th{font:700 10px var(--mono);letter-spacing:.14em;text-transform:uppercase;color:#6f8db3;text-align:left;padding:8px 10px;border-bottom:1px solid var(--line);white-space:nowrap}
td{padding:9px 10px;border-bottom:1px solid rgba(27,49,80,.6);vertical-align:top}
tr:hover td{background:rgba(34,211,238,.03)}
.tw{overflow-x:auto;-webkit-overflow-scrolling:touch}
.tag{font:700 10px var(--mono);letter-spacing:.08em;padding:2px 8px;border-radius:5px;border:1px solid;display:inline-block;white-space:nowrap}
.t-ACCESO,.t-ok{color:#7ee7b8;border-color:rgba(16,185,129,.5);background:rgba(16,185,129,.08)}
.t-SALIDA{color:#8defff;border-color:rgba(34,211,238,.45);background:rgba(34,211,238,.06)}
.t-DENEGADO,.t-ALARMA,.t-rd{color:#ffb0b0;border-color:rgba(239,68,68,.55);background:rgba(239,68,68,.1)}
.t-PARQUEO{color:#9cc2ff;border-color:rgba(59,130,246,.5);background:rgba(59,130,246,.08)}
.t-TURNO{color:#cdbdff;border-color:rgba(167,139,250,.5);background:rgba(167,139,250,.08)}
.t-CONSULTA,.t-am{color:#fcd38a;border-color:rgba(245,158,11,.5);background:rgba(245,158,11,.08)}
.t-SISTEMA{color:#9fb3cf;border-color:rgba(138,164,196,.4)}
.feed{display:grid;gap:6px;max-height:420px;overflow:auto}
.fi{display:grid;grid-template-columns:62px 82px 1fr;gap:10px;align-items:start;padding:7px 8px;border-radius:8px;background:rgba(7,18,33,.7);border:1px solid rgba(27,49,80,.7);animation:rise .5s both;font-size:12.5px}
.fi time{font:11px var(--mono);color:var(--mut);padding-top:2px}
.hash{font:10px var(--mono);color:#4f7096;word-break:break-all}
.sev{display:inline-block;width:9px;height:9px;border-radius:50%}
.sev1{background:var(--cy)}.sev2{background:var(--am)}.sev3{background:#fb923c}.sev4{background:var(--rd);box-shadow:0 0 10px var(--rd)}
.empty{color:var(--mut);padding:18px;text-align:center;border:1px dashed var(--line2);border-radius:10px}
.row{display:flex;gap:10px;align-items:center;flex-wrap:wrap}
.split{display:grid;grid-template-columns:minmax(0,1fr) 340px;gap:16px}
.hline{height:1px;background:var(--line);margin:12px 0}
.kv{display:grid;grid-template-columns:130px 1fr;gap:6px 12px;font-size:13px}
.kv dt{color:var(--mut);font:600 11px var(--mono);letter-spacing:.1em;text-transform:uppercase;padding-top:2px}
.kv dd{min-width:0;word-break:break-word}
.alert-hdr{display:flex;align-items:center;gap:10px}

/* ── Alarmas ── */
.alm{display:grid;grid-template-columns:auto 1fr auto;gap:12px;align-items:center;padding:12px;border-radius:12px;border:1px solid var(--line);background:rgba(7,18,33,.8);margin-bottom:8px}
.alm.act{border-color:var(--rd);animation:glowRed 1.4s ease-in-out infinite;background:rgba(127,29,29,.18)}
.alm.rec{border-color:rgba(245,158,11,.5)}
.alm.res{opacity:.55}
.alm .big{width:42px;height:42px;border-radius:50%;display:grid;place-items:center;background:rgba(239,68,68,.15);color:#ff9a9a;font-size:20px}
.alm.act .big{animation:ripple 1.4s infinite}
.alm .acts{display:flex;gap:6px;flex-wrap:wrap}
.glitch{position:relative;animation:glitch 3s infinite}

/* ── Mapa ── */
.mapwrap{display:grid;grid-template-columns:205px minmax(0,1fr) 300px;gap:14px;align-items:start}
.mapwrap .lv small{display:none}.mapwrap .lv{padding:8px 9px;grid-template-columns:30px 1fr auto;gap:8px}.mapwrap .lv .n{width:30px;height:30px;font-size:14px}
.stack{display:grid;gap:8px}
.lv{display:grid;grid-template-columns:34px 1fr auto;min-width:0;gap:10px;align-items:center;padding:10px;border-radius:10px;border:1px solid var(--line);background:rgba(11,23,40,.85);text-align:left;transition:.2s;position:relative;overflow:hidden;transform:perspective(600px) rotateX(0)}
.lv:hover{border-color:var(--cy)}
.lv.on{border-color:var(--cy);background:rgba(34,211,238,.1);box-shadow:0 0 22px rgba(34,211,238,.15)}
.lv .n{font:800 15px var(--mono);flex:none;width:34px;height:34px;display:grid;place-items:center;border-radius:8px;border:1px solid var(--line2);background:#071221}
.lv small{display:block;font-size:11px;color:var(--mut);line-height:1.2}
.lv.al{border-color:var(--rd);animation:glowRed 1.2s infinite}
.lv.al .n{background:var(--rd);color:#fff;border-color:var(--rd)}
.lv .mini{position:absolute;left:0;bottom:0;height:3px;background:var(--cy);transition:width .8s}
.lv.al .mini{background:var(--rd)}
.plan{background:radial-gradient(800px 400px at 50% 0,rgba(34,211,238,.06),transparent),#050d19;border:1px solid var(--line2);border-radius:14px;overflow:hidden;position:relative}
.plan svg{display:block;width:100%;height:auto}
.plan .head{display:flex;justify-content:space-between;gap:10px;align-items:center;padding:10px 14px;border-bottom:1px solid var(--line);flex-wrap:wrap}
.zr{cursor:pointer;transition:filter .2s}
.zr:hover{filter:brightness(1.35)}
.zr .box{stroke-width:1.5;transition:fill .6s,stroke .3s}
.zr.sel .box{stroke:#fff;stroke-width:2.5}
.zr.alm .box{stroke:var(--rd);stroke-width:3;animation:zpulse 1s infinite}
.zr.lock .box{stroke:var(--or);stroke-dasharray:6 4;animation:dash 1s linear infinite}
.zl{font:700 13px var(--sans);fill:#e6f1ff;pointer-events:none;paint-order:stroke;stroke:#050b14;stroke-width:3px}
.zs{font:600 12px var(--mono);fill:#a9c4e4;pointer-events:none;paint-order:stroke;stroke:#050b14;stroke-width:3px}
.pd{fill:#bdf3ff;opacity:.85;animation:drift 6s ease-in-out infinite alternate}
.scan{animation:scanx 6s linear infinite;mix-blend-mode:screen}
.cam{fill:var(--cy);animation:blink 2s steps(1) infinite}
.rip{fill:none;stroke:var(--rd);stroke-width:2;transform-box:fill-box;transform-origin:center;animation:ripSvg 1.6s ease-out infinite}
.legend{display:flex;gap:14px;flex-wrap:wrap;font-size:12px;color:var(--mut);padding:10px 14px;border-top:1px solid var(--line)}
.legend i{display:inline-block;width:12px;height:12px;border-radius:3px;margin-right:6px;vertical-align:-2px}

/* ── Perfiles ── */
.plist{display:grid;gap:8px;max-height:640px;overflow:auto;padding-right:2px}
.pi{display:grid;grid-template-columns:44px 1fr auto;gap:10px;align-items:center;padding:10px;border-radius:11px;border:1px solid var(--line);background:rgba(7,18,33,.8);text-align:left;width:100%}
.pi:hover{border-color:var(--cy)}.pi.on{border-color:var(--cy);background:rgba(34,211,238,.08)}
.hex{width:44px;height:48px;display:grid;place-items:center;font:800 15px var(--mono);clip-path:polygon(50% 0,100% 25%,100% 75%,50% 100%,0 75%,0 25%);background:linear-gradient(145deg,#0e7490,#1d4ed8);color:#fff}
.hex.big{width:84px;height:92px;font-size:28px}
.hex.blk{background:linear-gradient(145deg,#991b1b,#ef4444)}
.uid{font:800 22px var(--mono);letter-spacing:.06em;color:var(--cy);text-shadow:0 0 14px rgba(34,211,238,.45)}
.mask{font-family:var(--mono);letter-spacing:.04em}
.rev{display:inline-flex;align-items:center;gap:5px;color:var(--am);background:none;border:none;font-size:12px;margin-left:8px;text-decoration:underline dotted}
.chips{display:flex;gap:6px;flex-wrap:wrap}
.zc{font-size:11px;padding:3px 8px;border-radius:6px;border:1px solid var(--line2);background:#071221}
.zc.s1{border-color:rgba(34,211,238,.4)}.zc.s2{border-color:rgba(59,130,246,.5)}.zc.s3{border-color:rgba(167,139,250,.6);color:#d8ccff}.zc.s4{border-color:rgba(244,63,94,.6);color:#ffc0cb}
.graph{width:100%;height:auto;background:radial-gradient(circle at 50% 50%,rgba(34,211,238,.08),transparent 60%);border-radius:12px;border:1px solid var(--line)}
.graph .ln{stroke:var(--cy);stroke-width:1.4;stroke-dasharray:5 5;opacity:.7;animation:dash 1.2s linear infinite}
.graph .nd{fill:#0b1a2f;stroke:var(--line2);stroke-width:1.5}
.graph text{font:600 11px var(--mono);fill:#cfe6ff;text-anchor:middle}
.graph text.k{font-size:9px;fill:#6f8db3;letter-spacing:.12em}
.tl{position:relative;padding-left:22px;display:grid;gap:10px}
.tl::before{content:"";position:absolute;left:6px;top:4px;bottom:4px;width:2px;background:linear-gradient(var(--cy),transparent)}
.tl .ev{position:relative;font-size:13px}
.tl .ev::before{content:"";position:absolute;left:-21px;top:5px;width:10px;height:10px;border-radius:50%;background:var(--bg);border:2px solid var(--cy)}
.tl .ev.d::before{border-color:var(--rd);background:var(--rd)}
.tl .ev time{font:11px var(--mono);color:var(--mut);margin-right:8px}

/* ── Accesos / lector ── */
.reader{display:grid;gap:12px}
.res{border-radius:14px;padding:18px;border:2px solid var(--line2);text-align:center;min-height:150px;display:grid;place-items:center;align-content:center;gap:6px;transition:.3s;background:rgba(7,18,33,.7)}
.res.ok{border-color:var(--gr);background:rgba(16,185,129,.1);box-shadow:0 0 40px rgba(16,185,129,.2) inset}
.res.no{border-color:var(--rd);background:rgba(239,68,68,.12);box-shadow:0 0 40px rgba(239,68,68,.25) inset;animation:shake .4s}
.res b{font:800 22px var(--mono);letter-spacing:.08em}
.methods{display:flex;gap:6px;flex-wrap:wrap}
.mth{border:1px solid var(--line2);background:#071221;border-radius:8px;padding:7px 11px;font-size:12px;color:var(--mut)}
.mth.on{border-color:var(--cy);color:#fff;background:rgba(34,211,238,.12)}

/* ── Parqueadero ── */
.slots{display:grid;grid-template-columns:repeat(10,1fr);gap:6px}
.sl{aspect-ratio:1.5;border-radius:7px;border:1px solid var(--line);background:#071221;font:600 10px var(--mono);color:#53708f;display:grid;place-items:center;position:relative;padding:0;transition:.2s}
.sl.oc{background:rgba(16,185,129,.16);border-color:rgba(16,185,129,.6);color:#a7f3d0}
.sl.un{background:rgba(245,158,11,.16);border-color:var(--am);color:#fde68a;animation:pulseBorder 1.4s infinite}
.sl:hover{transform:scale(1.08);z-index:2;border-color:var(--cy)}
.sl small{display:block;font-size:8px;opacity:.8}

/* ── Turnos ── */
.tcard{display:grid;gap:10px}
.now{font:800 40px/1 var(--mono);color:var(--cy);text-shadow:0 0 18px rgba(34,211,238,.4);letter-spacing:.04em}
.tq{display:flex;gap:6px;flex-wrap:wrap}
.tk{font:700 12px var(--mono);border:1px solid var(--line2);border-radius:7px;padding:4px 8px;background:#071221}

/* ── Modal / toast ── */
.ov{position:fixed;inset:0;z-index:60;background:rgba(2,6,12,.78);backdrop-filter:blur(4px);display:grid;place-items:center;padding:16px;animation:fade .2s}
.modal{width:min(560px,100%);max-height:92vh;overflow:auto;background:linear-gradient(180deg,#0e1f37,#0a1626);border:1px solid var(--line2);border-radius:16px;padding:20px;box-shadow:0 30px 90px rgba(0,0,0,.7);display:grid;gap:12px}
.modal h2{font-size:18px}
.toasts{position:fixed;right:14px;bottom:14px;z-index:90;display:grid;gap:8px;max-width:min(380px,calc(100vw - 28px))}
.toast{background:#0b1c33;border:1px solid var(--cy);border-left-width:4px;border-radius:10px;padding:10px 14px;box-shadow:0 10px 40px rgba(0,0,0,.5);animation:rise .3s both;font-size:13px}
.toast.r{border-color:var(--rd)}.toast.a{border-color:var(--am)}.toast.g{border-color:var(--gr)}
.lockscreen{position:fixed;inset:0;z-index:95;background:rgba(3,8,16,.96);display:none;place-items:center;text-align:center;backdrop-filter:blur(10px)}
.lockscreen.on{display:grid}

/* ── animaciones ── */
@keyframes blink{50%{opacity:.15}}
@keyframes rise{from{opacity:0;transform:translateY(8px)}to{opacity:1;transform:none}}
@keyframes fade{from{opacity:0}}
@keyframes marq{to{transform:translateX(-100%)}}
@keyframes hazard{to{background-position:200% 0}}
@keyframes glowRed{0%,100%{box-shadow:0 0 0 0 rgba(239,68,68,.0)}50%{box-shadow:0 0 26px 2px rgba(239,68,68,.45)}}
@keyframes pulseBg{50%{background:#7f1d1d}}
@keyframes pulseBorder{50%{border-color:#78350f}}
@keyframes ripple{0%{box-shadow:0 0 0 0 rgba(239,68,68,.6)}100%{box-shadow:0 0 0 18px rgba(239,68,68,0)}}
@keyframes ripSvg{0%{transform:scale(.4);opacity:.9}100%{transform:scale(1.5);opacity:0}}
@keyframes zpulse{50%{stroke-opacity:.25}}
@keyframes dash{to{stroke-dashoffset:-20}}
@keyframes scanx{from{transform:translateX(-120px)}to{transform:translateX(1000px)}}
@keyframes drift{from{transform:translate(0,0)}to{transform:translate(9px,-7px)}}
@keyframes shake{25%{transform:translateX(-8px)}75%{transform:translateX(8px)}}
@keyframes glitch{0%,92%,100%{transform:none;text-shadow:none}93%{transform:translate(-2px,1px);text-shadow:2px 0 #f43f5e,-2px 0 #22d3ee}95%{transform:translate(2px,-1px);text-shadow:-2px 0 #f43f5e,2px 0 #22d3ee}97%{transform:none}}
body.evac{--cy:#ff6b6b}
body.evac .top{border-bottom-color:var(--rd);animation:glowRed 1.2s infinite}

/* ── responsive ── */
@media(max-width:1280px){.mapwrap{grid-template-columns:210px minmax(0,1fr)}.mapwrap>.side-info{grid-column:1/-1}}
@media(max-width:1180px){.split{grid-template-columns:1fr}}
@media(max-width:900px){.mapwrap{grid-template-columns:minmax(0,1fr)}.stack{grid-template-columns:repeat(auto-fit,minmax(150px,1fr))}.lv small{display:none}}
@media(max-width:900px){
 .shell{grid-template-columns:1fr}
 .side{position:fixed;left:0;top:0;width:262px;transform:translateX(-102%);transition:.25s;box-shadow:20px 0 60px rgba(0,0,0,.6)}
 .side.open{transform:none}
 .hamb{display:inline-flex}
 .lg{grid-template-columns:1fr}.lg-l{border-right:none;border-bottom:1px solid var(--line);min-height:0;padding:22px}.lg-r{padding:22px}.boot{min-height:120px}
 .view{padding:12px}.top{padding:8px 12px}
 .slots{grid-template-columns:repeat(5,1fr)}
 .kv{grid-template-columns:100px 1fr}
 .fi{grid-template-columns:54px 1fr}.fi .tag{grid-column:2;justify-self:start}.fi>:last-child{grid-column:1/-1}
 .g2{grid-template-columns:1fr}
}
@media(max-width:700px){.plan{overflow-x:auto}.plan svg{min-width:720px}}
@media(prefers-reduced-motion:reduce){*{animation-duration:.01ms!important;animation-iteration-count:1!important}}

/* ── Mapa estilo centro de control (celdas + 3D) ── */
.zr .box{transition:fill .5s,stroke .3s}
.pin{animation:pinb 1s ease-in-out infinite;transform-box:fill-box;transform-origin:center}
@keyframes pinb{50%{transform:scale(1.18)}}
.stage{perspective:1400px;padding:30px 12px 40px;overflow:hidden}
.slab{border:1px solid rgba(34,211,238,.55);border-radius:12px;background:#050d19;transition:transform .6s cubic-bezier(.2,.8,.2,1);transform-origin:50% 60%;box-shadow:0 0 0 1px rgba(34,211,238,.08)}
.slab svg{display:block;width:100%;height:auto;border-radius:12px}
.slab.tilt{transform:rotateX(40deg) scale(1);box-shadow:0 1px 0 #0a4a6e,0 2px 0 #0a4a6e,0 3px 0 #0a4a6e,0 4px 0 #0a4a6e,0 5px 0 #09405f,0 6px 0 #09405f,0 7px 0 #09405f,0 8px 0 #08365a,0 9px 0 #08365a,0 10px 0 #072f4c,0 11px 0 #072f4c,0 12px 0 #062741,0 40px 60px rgba(34,211,238,.2),0 0 40px rgba(34,211,238,.18)}
.plan.alert{animation:glowRed 1.8s ease-in-out infinite;border-color:rgba(239,68,68,.6)}
.plan.alert::after{content:"";position:absolute;inset:0;pointer-events:none;background:radial-gradient(ellipse at 50% 60%,rgba(239,68,68,.16),transparent 65%)}
.mtool{display:flex;gap:8px;align-items:center;flex-wrap:wrap;padding:10px 14px;border-top:1px solid var(--line)}
.mtool .sp{flex:1}
.seg{display:inline-flex;border:1px solid var(--line2);border-radius:10px;overflow:hidden}
.seg button,.tg{background:#071221;border:none;padding:7px 12px;font-size:12.5px;color:var(--mut);font-weight:600}
.seg button+button{border-left:1px solid var(--line2)}
.seg button.on{background:rgba(34,211,238,.18);color:#fff}
.tg{border:1px solid var(--line2);border-radius:9px}.tg.on{color:#fff;border-color:var(--cy);background:rgba(34,211,238,.12)}
.zlist{display:grid;gap:6px;max-height:300px;overflow:auto}
.zrow{display:grid;grid-template-columns:8px 1fr auto;gap:10px;align-items:center;text-align:left;padding:8px 10px;border-radius:9px;border:1px solid var(--line);background:rgba(7,18,33,.85);font-size:13px}
.zrow:hover,.zrow.on{border-color:var(--cy);background:rgba(34,211,238,.08)}
.pill{font:700 11px var(--mono);padding:2px 9px;border-radius:6px;min-width:52px;text-align:center}
.pill.g{background:rgba(16,185,129,.22);color:#6ee7b7}.pill.a{background:rgba(245,158,11,.25);color:#fcd34d}.pill.r{background:#dc2626;color:#fff;animation:blink 1s steps(1) infinite}.pill.v{background:rgba(167,139,250,.22);color:#d8ccff}
.bwrap{perspective:2200px;height:560px;overflow:hidden;position:relative}
.bstage{position:absolute;left:50%;top:235px;width:470px;height:254px;margin-left:-235px;transform-style:preserve-3d;transform:rotateX(62deg) rotateZ(-38deg);transition:transform .6s}
.fl{position:absolute;inset:0;border:2px solid rgba(34,211,238,.7);border-radius:10px;background:rgba(5,13,25,.82);cursor:pointer;box-shadow:0 0 0 1px rgba(34,211,238,.1),0 6px 0 #08365a,0 18px 30px rgba(0,0,0,.5);transition:.25s}
.fl svg{display:block;width:100%;height:100%;border-radius:8px}
.fl:hover,.fl.on{border-color:#fff;filter:brightness(1.3)}
.fl.al{border-color:#ef4444;box-shadow:0 0 30px rgba(239,68,68,.55),0 6px 0 #7f1d1d}
.fl-t{position:absolute;left:12px;bottom:8px;font:600 19px var(--mono);color:#cfe6ff;white-space:nowrap;background:rgba(5,13,25,.85);padding:3px 8px;border-radius:6px;border:1px solid var(--line2);pointer-events:none}
.fl-t b{color:var(--cy)}
.fl.al .fl-t{color:#ffb0b0;border-color:#ef4444}
@media(max-width:900px){.stage{padding:10px 0 14px}.bwrap{height:440px}.bstage{width:330px;height:178px;margin-left:-165px;top:170px}.fl-t{font-size:13px}.mapwrap .lv small{display:none}}
