/* Tokens tomados del modo oscuro de hexcala.cl (src/styles/global.css).
   fg-subtle está ajustado a mano para contraste AA sobre estos fondos: si se
   agrega una superficie nueva, hay que revalidarlo antes de usarlo.
   El ámbar no pertenece a la identidad; queda solo como color de alerta. */
:root{--bg:#0b1220;--panel:#131c2e;--panel2:#0a111e;--line:#1e293b;--line-soft:#172033;
--text:#f1f5f9;--muted:#94a3b8;--subtle:#7d8ba1;
--brand:#60a5fa;--brand-strong:#2563eb;--cyan:#22d3ee;--blue:#60a5fa;
--green:#34d399;--amber:#fbbf24;--red:#fb7185;
--sidebar:368px;--shadow:0 22px 60px rgba(0,0,0,.45)}
*{box-sizing:border-box}html,body{margin:0;width:100%;height:100%;font-family:'Instrument Sans',ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,"Segoe UI",sans-serif;background:var(--bg);color:var(--text)}button,input,select{font:inherit}.hidden{display:none!important}
.app-body{overflow:hidden}.app-shell{display:grid;grid-template-columns:var(--sidebar) 1fr;height:100vh;min-height:620px;background:radial-gradient(circle at 70% 40%,#0a1824 0,#050a11 55%)}
.sidebar{position:relative;z-index:20;height:100vh;background:linear-gradient(180deg,rgba(8,17,27,.97),rgba(5,12,19,.98));border-right:1px solid var(--line);display:flex;flex-direction:column;box-shadow:12px 0 30px rgba(0,0,0,.18)}
.sidebar-head{padding:19px 20px 15px;border-bottom:1px solid var(--line);display:flex;align-items:center;justify-content:space-between}.brand-row{display:flex;align-items:center;gap:11px}.brand-row strong{display:block;font-size:13px;letter-spacing:.12em}.brand-row span{display:block;margin-top:2px;font-size:8px;letter-spacing:.22em;color:var(--muted)}.live-pill{border:1px solid rgba(101,230,164,.22);background:rgba(101,230,164,.07);padding:7px 9px;border-radius:999px;color:var(--green);font-size:8px;font-weight:800;letter-spacing:.08em}.live-pill i{display:inline-block;width:6px;height:6px;border-radius:50%;background:var(--green);margin-right:5px;box-shadow:0 0 10px var(--green)}
.nav-tabs{display:grid;grid-template-columns:repeat(4,1fr);padding:8px 10px;border-bottom:1px solid var(--line);gap:4px}.nav-tab{border:0;background:transparent;color:var(--muted);border-radius:9px;padding:8px 4px 7px;cursor:pointer;transition:.2s}.nav-tab span{display:block;font-size:15px;line-height:15px}.nav-tab b{display:block;font-size:9px;margin-top:5px;font-weight:700;letter-spacing:.03em}.nav-tab:hover{background:#0e1c28;color:var(--text)}.nav-tab.active{background:#102230;color:var(--cyan)}
.panes{flex:1;min-height:0;overflow:hidden}.pane{display:none;height:100%;overflow-y:auto;padding:18px 17px 22px;scrollbar-width:thin;scrollbar-color:#1c3547 transparent}.pane.active{display:block}.section-title{display:flex;align-items:center;justify-content:space-between;color:#bcd1df;font-size:11px;font-weight:800;letter-spacing:.07em;text-transform:uppercase;margin-bottom:12px}.top-gap{margin-top:24px}.icon-button,.text-button{border:0;background:transparent;color:var(--cyan);cursor:pointer}.icon-button{width:28px;height:28px;border:1px solid var(--line);border-radius:8px}.text-button{font-size:9px;text-transform:uppercase;letter-spacing:.04em}.preset-row{display:grid;grid-template-columns:1fr 1fr;gap:7px;margin-bottom:11px}.preset{background:#0b1924;color:#a8bdcc;border:1px solid #173044;border-radius:8px;padding:8px 6px;font-size:10px;cursor:pointer}.preset:hover{border-color:#2f667c;color:#eaffff}.coord-grid{display:grid;grid-template-columns:1fr 1fr;gap:8px}.coord-grid label,.field-label{display:block;color:var(--muted);font-size:9px;text-transform:uppercase;letter-spacing:.06em;margin-bottom:9px}.coord-grid input,.field-label input,.field-label select,.search-form input,.search-form select{width:100%;margin-top:5px;background:#06101a;color:var(--text);border:1px solid #173044;border-radius:8px;padding:9px 10px;outline:none;font-size:11px}.coord-grid input:focus,.field-label input:focus,.field-label select:focus,.search-form input:focus,.search-form select:focus{border-color:#3a7185;box-shadow:0 0 0 3px rgba(78,230,223,.06)}.primary-button{width:100%;border:0;border-radius:9px;padding:10px 12px;background:linear-gradient(90deg,#22b9b3,#367cf2);color:white;font-size:11px;font-weight:800;cursor:pointer;box-shadow:0 8px 22px rgba(54,124,242,.15)}.primary-button:hover{filter:brightness(1.08)}.hint-box{margin-top:11px;border:1px solid #173044;background:#091722;border-radius:10px;padding:10px 11px}.hint-box strong{font-size:10px;color:#cfe4f0;display:block}.hint-box span{font-size:9px;color:var(--muted);display:block;margin-top:3px;line-height:1.4}.toggle-row{display:flex;align-items:center;justify-content:space-between;border-bottom:1px solid rgba(27,45,59,.7);padding:9px 1px;color:#a7bdcb;font-size:10px}.toggle-row input{position:absolute;opacity:0;width:0;height:0}.toggle-row i{width:28px;height:16px;border-radius:20px;background:#182934;position:relative;transition:.2s}.toggle-row i:after{content:"";position:absolute;width:10px;height:10px;border-radius:50%;background:#6e8190;top:3px;left:3px;transition:.2s}.toggle-row input:checked+i{background:rgba(78,230,223,.24)}.toggle-row input:checked+i:after{left:15px;background:var(--cyan);box-shadow:0 0 8px rgba(78,230,223,.5)}
.sidebar-foot{padding:10px 17px;border-top:1px solid var(--line);display:flex;justify-content:space-between;font-size:9px;color:var(--subtle)}.sidebar-foot a{color:#6f8fa4;text-decoration:none}.sidebar-foot a:hover{color:#fff}.pane-copy{font-size:10px;line-height:1.55;color:var(--muted);margin:0 0 14px}.search-form{display:grid;gap:8px}.search-form input,.search-form select{margin:0}.search-status{font-size:9px;color:var(--muted);min-height:16px;margin:10px 0}.mini-filter-row{display:flex;gap:5px;margin-bottom:10px}.mini-filter{border:1px solid #183144;background:#09151f;color:#6f8799;border-radius:999px;padding:5px 8px;font-size:9px;cursor:pointer}.mini-filter.active{color:var(--cyan);border-color:#2f667c;background:#0d232d}.count-chip{background:#102633;color:var(--cyan);border-radius:999px;padding:3px 7px;font-size:9px}.aircraft-list{display:flex;flex-direction:column;gap:6px}.aircraft-card{border:1px solid #142a39;background:linear-gradient(145deg,#0a1721,#08131d);border-radius:10px;padding:10px 11px;cursor:pointer;transition:.18s}.aircraft-card:hover,.aircraft-card.selected{border-color:#2b6476;transform:translateY(-1px);background:#0c1c28}.aircraft-card.selected{box-shadow:inset 3px 0 0 var(--cyan)}.aircraft-card-head{display:flex;justify-content:space-between;align-items:center;gap:10px}.aircraft-card-head strong{font-size:12px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.aircraft-card-head span{font-size:9px;color:var(--cyan)}.aircraft-card-meta{display:grid;grid-template-columns:1fr 1fr 1fr;gap:6px;margin-top:7px}.aircraft-card-meta div{font-size:8px;color:var(--subtle)}.aircraft-card-meta b{display:block;color:#b5c9d6;font-size:9px;margin-top:2px;font-weight:600}.alert-text{color:var(--red)!important}.empty-state{text-align:center;padding:65px 22px;color:var(--muted)}.empty-state div{font-size:28px;color:#55788f;margin-bottom:10px}.empty-state strong{display:block;font-size:12px;color:#b0c5d2}.empty-state span{display:block;font-size:10px;line-height:1.5;margin-top:6px}.selected-detail .hero{border:1px solid #1a3c4c;background:radial-gradient(circle at 20% 0,rgba(78,230,223,.1),transparent 55%),#091722;border-radius:12px;padding:14px}.selected-detail .hero small{color:var(--cyan);font-size:9px;letter-spacing:.08em}.selected-detail .hero h2{margin:5px 0 1px;font-size:22px}.selected-detail .hero p{margin:0;color:var(--muted);font-size:10px}.detail-grid{display:grid;grid-template-columns:1fr 1fr;gap:7px;margin-top:10px}.detail-cell{border:1px solid #142a39;background:#08131c;border-radius:9px;padding:9px}.detail-cell span{display:block;color:var(--subtle);font-size:8px;text-transform:uppercase;letter-spacing:.06em}.detail-cell strong{display:block;font-size:12px;margin-top:4px;color:#dceaf2}.detail-section{margin-top:15px}.detail-section h3{font-size:9px;text-transform:uppercase;letter-spacing:.08em;color:#718b9c;margin:0 0 7px}.data-note{border-left:2px solid var(--amber);background:rgba(240,195,107,.06);padding:8px 9px;font-size:9px;color:#9da9ad;line-height:1.45;margin-top:12px}
.globe-stage{position:relative;min-width:0;overflow:hidden;background:radial-gradient(circle at 50% 42%,#0c2130 0,#06101a 37%,#03070c 76%)}#globe{position:absolute;inset:0}#globe canvas{display:block;width:100%;height:100%;outline:none}.top-hud{position:absolute;z-index:5;top:18px;left:20px;display:flex;border:1px solid rgba(38,67,84,.7);background:rgba(5,13,21,.68);backdrop-filter:blur(12px);border-radius:11px;overflow:hidden;box-shadow:var(--shadow)}.hud-stat{padding:9px 16px;border-right:1px solid #1b2d3b;min-width:82px}.hud-stat:last-child{border:0}.hud-stat span{font-size:7px;color:var(--subtle);letter-spacing:.12em;font-weight:800}.hud-stat strong{display:block;font-size:16px;margin-top:1px}.hud-stat.alert strong{color:var(--red)}.view-toolbar{position:absolute;z-index:5;right:18px;top:18px;display:flex;gap:7px}.view-toolbar button{width:36px;height:36px;border:1px solid rgba(38,67,84,.8);background:rgba(5,13,21,.72);backdrop-filter:blur(10px);color:#9fb6c6;border-radius:9px;cursor:pointer;font-size:15px}.view-toolbar button.active,.view-toolbar button:hover{color:var(--cyan);border-color:#2b6378}.loading-badge{position:absolute;z-index:6;top:77px;left:20px;border:1px solid #1f4152;background:rgba(6,17,27,.86);padding:7px 10px;border-radius:999px;color:#8ea6b6;font-size:9px;display:flex;align-items:center;gap:7px;transition:.2s}.loading-badge.hidden{opacity:0;pointer-events:none}.loading-badge i{width:7px;height:7px;border-radius:50%;background:var(--cyan);box-shadow:0 0 11px var(--cyan);animation:pulse 1s infinite}.bottom-hud{position:absolute;z-index:5;left:20px;right:20px;bottom:17px;display:flex;justify-content:space-between;gap:14px;color:var(--subtle);font-size:9px;pointer-events:none}.bottom-hud>div{display:flex;gap:7px;align-items:center;background:rgba(5,13,21,.72);border:1px solid rgba(38,67,84,.6);backdrop-filter:blur(10px);padding:7px 10px;border-radius:9px}.bottom-hud b{color:#abc2d0}.status-dot{width:6px;height:6px;border-radius:50%;background:var(--green);box-shadow:0 0 8px var(--green)}.toast{position:absolute;z-index:10;right:18px;bottom:60px;max-width:320px;background:#0c1922;border:1px solid #254456;border-radius:10px;padding:10px 12px;color:#bcd0dc;font-size:10px;box-shadow:var(--shadow);opacity:0;transform:translateY(8px);pointer-events:none;transition:.25s}.toast.show{opacity:1;transform:translateY(0)}.toast.error{border-color:rgba(255,107,115,.5);color:#ffd0d3}
.login-body{min-height:100vh;min-height:100dvh;overflow-x:hidden;background:radial-gradient(circle at 70% 48%,#0c2b3b 0,#07111b 33%,#03070c 75%)}.login-shell{position:relative;overflow:hidden;width:100%;min-height:100vh;min-height:100dvh;display:grid;grid-template-columns:minmax(300px,470px) 1fr;align-items:center;max-width:1200px;margin:auto;padding:clamp(16px,4vw,40px);padding-bottom:calc(clamp(16px,4vw,40px) + 42px)}.login-card{position:relative;z-index:2;background:rgba(7,17,27,.78);backdrop-filter:blur(16px);border:1px solid #1b3443;border-radius:22px;padding:clamp(22px,5vw,38px);box-shadow:0 40px 100px rgba(0,0,0,.38)}.login-card .eyebrow{margin-top:22px;color:var(--cyan);font-size:9px;letter-spacing:.16em;font-weight:800}.login-card h1{font-size:clamp(25px,6.5vw,38px);line-height:1.02;margin:11px 0 14px;letter-spacing:-.035em}.login-card>p{font-size:12px;line-height:1.65;color:#8299a9;max-width:360px}.login-form{display:grid;gap:12px;margin-top:24px}.login-form label{font-size:9px;color:#7d95a5;text-transform:uppercase;letter-spacing:.08em}.login-form input{width:100%;margin-top:6px;background:#06101a;border:1px solid #1b3443;color:white;border-radius:10px;padding:12px;outline:none}.login-form input:focus{border-color:#37798d}.login-form button{margin-top:4px;border:0;border-radius:10px;padding:13px 15px;text-align:left;background:linear-gradient(90deg,#21bcb6,#3b7af2);color:white;font-weight:800;cursor:pointer}.login-form button span{float:right}.login-card small{display:block;margin-top:18px;color:var(--subtle);font-size:9px}.login-error{padding:9px 11px;border:1px solid rgba(255,107,115,.35);background:rgba(255,107,115,.08);color:#ffadb2;border-radius:9px;font-size:10px;margin-top:13px}.login-orbit{position:relative;width:min(620px,52vw);aspect-ratio:1;border-radius:50%;margin-left:-20px;background:radial-gradient(circle at 37% 32%,#173d52,#0b2231 45%,#06111b 68%);box-shadow:inset -60px -40px 100px rgba(0,0,0,.5),0 0 80px rgba(78,230,223,.08)}.login-orbit:before,.login-orbit:after{content:"";position:absolute;inset:-9%;border:1px solid rgba(78,230,223,.11);border-radius:50%;transform:rotate(17deg) scaleY(.35)}.login-orbit:after{inset:-22%;transform:rotate(-28deg) scaleY(.42);border-color:rgba(74,140,255,.1)}.login-orbit i{position:absolute;width:7px;height:7px;border-radius:50%;background:var(--cyan);box-shadow:0 0 15px var(--cyan)}.login-orbit i:nth-child(2){left:11%;top:45%}.login-orbit i:nth-child(3){right:6%;top:41%}.login-orbit i:nth-child(4){left:44%;bottom:9%}
@keyframes pulse{50%{opacity:.35;transform:scale(.75)}}
@media(max-width:900px){:root{--sidebar:320px}.top-hud{left:12px;top:12px}.hud-stat{padding:8px 10px;min-width:65px}.login-shell{grid-template-columns:1fr;padding:20px}.login-card{max-width:480px;margin:auto}.login-orbit{position:absolute;top:50%;right:-28%;transform:translateY(-50%);opacity:.28;width:min(78vw,420px);margin-left:0}}
@media(max-width:700px){.app-shell{display:block}.sidebar{position:absolute;width:100%;height:48vh;bottom:0;top:auto;border-right:0;border-top:1px solid var(--line)}.sidebar-head{display:none}.globe-stage{height:52vh}.panes{height:calc(48vh - 88px)}.top-hud{transform:scale(.85);transform-origin:top left}.view-toolbar{top:10px;right:10px}.bottom-hud{left:8px;right:8px;bottom:7px}.bottom-hud>div:last-child{display:none}.nav-tabs{padding:5px 8px}.sidebar-foot{padding:6px 12px}}
/* MapLibre: match the console chrome instead of the library's light default. */
#globe .maplibregl-map{width:100%;height:100%}
#globe .maplibregl-canvas{outline:none}
/* Airport popups are scoped to the authenticated map, so other MapLibre views retain their own chrome. */
#globe .maplibregl-popup-content{position:relative;min-width:250px;padding:18px;background:#09131f;color:#e5f1f8;border:1px solid #285167;border-radius:14px;box-shadow:0 22px 50px rgba(0,0,0,.58);font:inherit}
#globe .maplibregl-popup-tip{border-color:transparent}
#globe .maplibregl-popup-anchor-top .maplibregl-popup-tip{border-bottom-color:#09131f}
#globe .maplibregl-popup-anchor-bottom .maplibregl-popup-tip{border-top-color:#09131f}
#globe .maplibregl-popup-anchor-left .maplibregl-popup-tip{border-right-color:#09131f}
#globe .maplibregl-popup-anchor-right .maplibregl-popup-tip{border-left-color:#09131f}
#globe .maplibregl-popup-anchor-top-left .maplibregl-popup-tip,#globe .maplibregl-popup-anchor-top-right .maplibregl-popup-tip{border-bottom-color:#09131f}
#globe .maplibregl-popup-anchor-bottom-left .maplibregl-popup-tip,#globe .maplibregl-popup-anchor-bottom-right .maplibregl-popup-tip{border-top-color:#09131f}
#globe .maplibregl-popup-close-button{width:40px;height:40px;border:0;border-radius:0 14px 0 10px;background:transparent;color:#dcecf5;font-size:22px;line-height:40px;cursor:pointer}
#globe .maplibregl-popup-close-button:hover{background:#13293a;color:#fff}
#globe .maplibregl-popup-close-button:focus-visible{outline:2px solid #67e8f9;outline-offset:-4px}
.airport-popup-card{display:grid;gap:7px}.airport-popup-service{width:max-content;padding:4px 7px;border-radius:999px;font-size:9px;font-weight:800;letter-spacing:.06em;text-transform:uppercase}.airport-popup-service.scheduled{background:#08364a;color:#a5f3fc;border:1px solid #22d3ee}.airport-popup-service.other{background:#28291f;color:#fde68a;border:1px solid #a47b32}.airport-popup-name{margin:1px 26px 0 0;color:#f8fcff;font-size:16px;line-height:1.2}.airport-popup-location,.airport-popup-type,.airport-popup-elevation{margin:0;color:#b9cedb;font-size:11px;line-height:1.45}.airport-popup-type{color:#7dd3fc;font-weight:700}.airport-popup-elevation{padding-top:6px;border-top:1px solid #1d3a4b}.airport-popup-codes{display:flex;flex-wrap:wrap;gap:6px;margin:3px 0 1px}.airport-popup-code{display:flex;gap:4px;align-items:center;padding:4px 6px;border:1px solid #23465a;border-radius:6px;background:#0d1d2a}.airport-popup-code dt{color:#8aa6b7;font-size:8px;font-weight:800}.airport-popup-code dd{margin:0;color:#e5f1f8;font-family:'JetBrains Mono','IBM Plex Mono',ui-monospace,monospace;font-size:10px;font-weight:700}
/* Panel de capas */
.layers-panel{position:absolute;z-index:8;top:62px;right:18px;width:232px;padding:13px;border:1px solid rgba(38,67,84,.85);background:rgba(6,15,24,.94);backdrop-filter:blur(16px);border-radius:13px;box-shadow:0 22px 50px rgba(0,0,0,.55)}
.layers-panel.hidden{display:none}
/* Panel colapsable. En escritorio se anima la columna de la grilla: --sidebar a 0
   deja el mapa a pantalla completa sin sacar la barra del DOM, asi el estado de
   los formularios y del scroll sobrevive al colapso. overflow:hidden evita que el
   contenido se desborde sobre el mapa durante la transicion. */
.app-shell{transition:grid-template-columns .22s ease}
.sidebar{overflow:hidden}
body.panel-off{--sidebar:0px}
body.panel-off .sidebar{border-right-width:0}
/* Solo #panelToggle: layersToggle tambien lleva aria-expanded y un selector por
   atributo suelto lo dejaria encendido de forma permanente. */
#panelToggle[aria-expanded="false"]{color:var(--cyan);border-color:#2b6378}
.velo{position:fixed;inset:0;z-index:50;background:rgba(3,9,15,.55);opacity:0;pointer-events:none;transition:opacity .22s ease}
.layers-group+.layers-group{margin-top:14px;padding-top:13px;border-top:1px solid #16303f}
.layers-group h4{margin:0 0 9px;font-size:8px;letter-spacing:.14em;text-transform:uppercase;color:var(--subtle);font-weight:800}
.basemap-list{display:flex;flex-wrap:wrap;gap:6px}
.basemap-chip{padding:7px 11px;border:1px solid #1f4053;background:rgba(9,22,33,.8);color:#9fb6c6;border-radius:8px;cursor:pointer;font:inherit;font-size:10px;transition:.15s}
.basemap-chip:hover{border-color:#2b6378;color:#cfe4ef}
.basemap-chip.active{border-color:var(--cyan);color:var(--cyan);background:rgba(78,230,223,.1)}
.layer-row{display:flex;align-items:center;gap:9px;padding:7px 2px;cursor:pointer;font-size:10px;color:#a9c0ce;user-select:none}
.layer-row input{position:absolute;opacity:0;width:0;height:0}
.layer-row i{flex:0 0 auto;width:15px;height:15px;border:1px solid #2a4d60;border-radius:4px;background:#08131d;position:relative;transition:.15s}
.layer-row input:checked+i{background:var(--cyan);border-color:var(--cyan)}
.layer-row input:checked+i:after{content:"";position:absolute;left:4px;top:1px;width:4px;height:8px;border:solid #04121a;border-width:0 2px 2px 0;transform:rotate(42deg)}
.layer-row input:focus-visible+i{box-shadow:0 0 0 3px rgba(78,230,223,.3)}
.layer-row:hover{color:#d6e8f2}
/* El botón de ubicación late mientras el GPS responde: puede tardar segundos. */
#locateMe.busy{color:var(--brand);border-color:var(--brand);animation:pulse 1s infinite}
.maplibregl-ctrl-group{background:rgba(5,13,21,.78)!important;border:1px solid rgba(38,67,84,.8)!important;border-radius:9px!important;overflow:hidden;backdrop-filter:blur(10px)}
.maplibregl-ctrl-group button+button{border-top:1px solid rgba(38,67,84,.6)!important}
.maplibregl-ctrl-group button .maplibregl-ctrl-icon{filter:invert(78%) sepia(12%) saturate(420%) hue-rotate(158deg) brightness(92%)}
.maplibregl-ctrl-group button:hover{background:rgba(43,99,120,.35)!important}
.maplibregl-ctrl-scale{background:rgba(5,13,21,.7)!important;border-color:rgba(38,67,84,.8)!important;color:#8ea6b6!important;font-size:9px!important;border-radius:5px}
.maplibregl-ctrl-attrib{background:rgba(5,13,21,.72)!important;border-radius:8px 0 0 0}
.maplibregl-ctrl-attrib a{color:#7f97a8!important}
.maplibregl-ctrl-attrib-button{filter:invert(80%)}
.maplibregl-ctrl-bottom-right{z-index:6;margin-bottom:34px}
/* Logout is a POST now, so it is a button that must read as the old link did. */
.logout-form{display:inline}
.logout-form button{background:none;border:0;padding:0;font:inherit;color:inherit;cursor:pointer;text-decoration:underline}
.logout-form button:hover{color:var(--cyan)}
/* Marca HEXCALA */
.brand-logo{display:block;height:34px;width:auto;margin-bottom:22px}
.brand-row{display:flex;align-items:center;gap:11px;text-decoration:none;color:inherit}
.brand-row img{height:26px;width:auto;opacity:.95;flex:0 0 auto}
.brand-row:hover img{opacity:1}
.brand-row>div{display:flex;flex-direction:column;line-height:1.15;border-left:1px solid var(--line);padding-left:11px}
.brand-row strong{font-size:12px;letter-spacing:.02em;color:var(--text)}
.brand-row span{font-size:8px;letter-spacing:.11em;text-transform:uppercase;color:var(--subtle)}
/* Etiqueta que separa los grupos de accesos rápidos */
.preset-label{margin:12px 0 6px;font-size:8px;letter-spacing:.14em;text-transform:uppercase;color:var(--subtle);font-weight:800}
.preset-label:first-of-type{margin-top:0}
.access-note{display:block;margin-top:18px;color:var(--subtle);font-size:9px;line-height:1.6}
.access-note a{color:var(--brand)}
/* La dedicatoria: se lee si la buscas, no compite con nada. */
.dedication{margin:0;padding:9px 18px 13px;font-size:8.5px;letter-spacing:.05em;color:var(--subtle);text-align:center;border-top:1px solid var(--line-soft)}
.dedication b{color:#b87a8e;font-weight:400}
.login-foot{position:fixed;left:0;right:0;bottom:0;padding:14px;text-align:center;font-size:9px;letter-spacing:.05em;color:var(--subtle);pointer-events:none}
.login-foot b{color:#b87a8e;font-weight:400}
.login-preview-shell{display:block;max-width:none;padding:0}.public-globe{position:fixed;inset:0;z-index:0}.login-preview-shell .login-card{position:relative;z-index:2;width:min(470px,calc(100% - 80px));margin:clamp(16px,4vw,40px)}.public-preview-status{position:fixed;z-index:3;left:40px;bottom:48px;color:var(--muted);font-size:11px}.preview-panel-toggle,.preview-panel-close{display:none}
.list-trailer{margin:8px 2px 2px;padding:9px 11px;border:1px dashed var(--line);border-radius:9px;color:var(--subtle);font-size:9px;line-height:1.5;text-align:center}
.emergency-list{margin-bottom:16px;padding:11px;border:1px solid rgba(251,113,133,.55);border-radius:10px;background:rgba(127,29,29,.14)}.emergency-row{display:grid;gap:3px;width:100%;padding:9px;text-align:left;border:1px solid rgba(251,113,133,.3);border-radius:8px;background:rgba(8,20,30,.7);color:var(--text);cursor:pointer}.emergency-row span,.emergency-row small{color:#fecdd3;font-size:9px}
/* Igual que en hexcala.cl: la mono es solo para números y códigos, nunca prosa. */
.hud-stat strong,.aircraft-card-meta b,.detail-cell strong,.count-chip,.route-port b,#listCount{
  font-family:'JetBrains Mono','IBM Plex Mono',ui-monospace,SFMono-Regular,monospace;
  font-feature-settings:"tnum" 1}
#alertSummary{appearance:none;border:0;border-right:1px solid #1b2d3b;background:transparent;color:inherit;font:inherit;text-align:left}#alertSummary:last-child{border-right:0}#alertSummary:not(:disabled){cursor:pointer}#alertSummary:not(:disabled):hover{background:rgba(251,113,133,.08)}#alertSummary:disabled{opacity:1;cursor:default}#alertSummary:focus{outline:0}#alertSummary:focus-visible{outline:2px solid var(--brand);outline-offset:-2px}.view-toolbar{z-index:7}
/* adsbdb enrichment: photo and scheduled route */
/* adsbdb only serves ~200px thumbnails (url_photo 404s), so show them at native
   size on a backdrop instead of upscaling them into mush. */
.ac-photo{margin:12px 0 0;border:1px solid #1b3443;border-radius:11px;overflow:hidden;background:#0a1620}
.ac-photo.hidden{display:none}
.ac-photo img{display:block;width:100%;height:auto;margin:0;border-radius:11px 11px 0 0}
.ac-photo figcaption{padding:4px 9px 7px;font-size:8px;color:var(--subtle);letter-spacing:.04em}
.route-block{margin-top:12px;border:1px solid #1b3443;border-radius:11px;padding:11px 12px;background:rgba(8,20,30,.6)}
.route-block.has-route{border-color:#245065}
.route-pending{font-size:10px;color:var(--subtle)}
.route-head{font-size:9px;letter-spacing:.1em;text-transform:uppercase;color:var(--cyan);font-weight:800}
.route-legs{display:grid;grid-template-columns:1fr auto 1fr;gap:9px;align-items:center;margin:9px 0 7px}
.route-port b{display:block;font-size:17px;letter-spacing:-.02em;color:#dcebf4}
.route-port span{display:block;font-size:9px;line-height:1.35}
.route-port .port-place{color:#a9c2d2;font-weight:700;margin-top:3px}
.route-port .port-name{color:var(--subtle);margin-top:1px}
.route-arrow{color:var(--cyan);font-size:15px}
.route-block small{font-size:8px;color:var(--subtle)}
/* Estado del trayecto. Tres colores porque son tres cosas distintas: se encontró,
   no existe, o no se pudo consultar. Mezclarlas fue la queja original. */
.track-status{margin-top:8px;padding:8px 11px;border-radius:9px;font-size:9px;line-height:1.5;border:1px solid var(--line);background:rgba(8,20,30,.5);color:var(--muted)}
.track-status.pending{color:var(--subtle);font-style:italic}
.track-status.ok{border-color:#245065;color:#a9c2d2}
.track-status.empty{border-style:dashed;color:var(--subtle)}
.track-status.error{border-color:rgba(251,113,133,.4);color:#fca5b5}
/* This is a separate user-selected arrival alert; transponder emergencies retain
   their existing amber/red map and list treatment. */
.alert-status{margin-top:7px;padding:8px 10px;border:1px solid var(--line);border-radius:8px;background:rgba(8,20,30,.5);color:var(--muted);font-size:9px;line-height:1.45}
.alert-status[data-state="active"]{border-color:rgba(52,211,153,.4);color:#a7f3d0}
.alert-status[data-state="degraded"]{border-color:rgba(251,113,133,.45);color:#fecdd3}
/* Public entry: the map is a real desktop column, not a background behind the form. */
.login-preview-shell{display:grid;grid-template-columns:minmax(380px,440px) minmax(0,1fr);grid-template-rows:minmax(100vh,100dvh);max-width:none;min-height:100vh;min-height:100dvh;padding:0;align-items:stretch}
.public-preview-stage{position:relative;grid-column:2;grid-row:1;min-width:0;min-height:100vh;min-height:100dvh;overflow:hidden}
.public-globe{position:absolute;inset:0;z-index:0}
.login-preview-shell .login-card{grid-column:1;grid-row:1;align-self:center;width:auto;margin:0;padding:clamp(40px,4vw,48px);border-radius:0;min-height:100vh;min-height:100dvh;overflow-y:auto}
.public-preview-status{position:absolute;z-index:7;left:20px;bottom:calc(18px + env(safe-area-inset-bottom));max-width:calc(100% - 40px);padding:7px 10px;border:1px solid rgba(38,67,84,.6);border-radius:9px;background:rgba(5,13,21,.72);backdrop-filter:blur(10px);color:var(--muted);font-size:11px;pointer-events:none}
.public-preview-status[data-map-health="failed"]{color:#ffadb2;border-color:rgba(255,107,115,.35)}
.public-locate-me{position:absolute;z-index:8;left:20px;bottom:68px;min-height:44px;padding:10px 14px;border:1px solid rgba(38,67,84,.7);border-radius:9px;background:rgba(5,13,21,.76);backdrop-filter:blur(10px);color:var(--text);cursor:pointer}
.preview-panel-toggle,.preview-panel-close,.preview-panel-backdrop{display:none}
.public-preview-brand,.public-mobile-dedication{display:none}.public-access-banner{position:absolute;z-index:7;top:20px;right:20px;display:flex;align-items:center;gap:9px;padding:8px 10px;border:1px solid rgba(38,67,84,.7);border-radius:10px;background:rgba(5,13,21,.76);backdrop-filter:blur(10px);color:var(--muted);font-size:10px}.public-access-request{padding:6px 8px;border:1px solid rgba(148,163,184,.28);border-radius:7px;color:#708295;background:rgba(148,163,184,.07);cursor:not-allowed;user-select:none}
/* The dedication is a single element in the identity flow, never a fixed mobile overlay. */
.login-preview-shell .login-foot{position:static;width:auto;margin:18px 0 0;padding:16px 0 0;border-top:1px solid var(--line-soft);text-align:left;pointer-events:auto}
@media(min-width:901px){.login-preview-shell .login-card{border-right:1px solid var(--line)}}
@media(min-width:701px) and (max-width:900px){.login-preview-shell{display:block;min-height:100vh;min-height:100dvh}.public-preview-stage{position:fixed;inset:0;min-height:100dvh}.login-preview-shell .login-card{position:relative;z-index:8;width:min(440px,calc(100% - 40px));min-height:0;margin:20px;padding:32px;max-height:calc(100dvh - 40px);border-radius:20px}.public-preview-status{left:20px;bottom:18px}.login-foot{z-index:9}}
/* Cached facts are optional enrichment, so filters stay compact until the local
   snapshot provides values. They are authenticated-console controls only. */
.fact-filter-group{display:grid;grid-template-columns:1fr 1fr;gap:0 8px;margin:11px 0 3px;padding:10px 10px 2px;border:1px solid var(--line);border-radius:9px;background:rgba(8,20,30,.42)}
.fact-filter-group legend{padding:0 4px;color:var(--subtle);font-size:8px;font-weight:800;letter-spacing:.1em;text-transform:uppercase}
.fact-filter-group .field-label{margin-bottom:8px}
/* Marca de ayuda: discreta, pero suficiente para invitar a pasar el cursor. */
.detail-cell .help{display:inline-flex;align-items:center;justify-content:center;width:11px;height:11px;margin-left:3px;border:1px solid var(--line);border-radius:50%;font-size:7px;font-style:normal;color:var(--subtle);vertical-align:middle}
.detail-cell[title]{cursor:help}
.detail-cell[title]:hover .help{border-color:var(--brand);color:var(--brand)}
/* Foco visible de verdad. El box-shadow anterior tenía alpha .06: invisible. */
.coord-grid input:focus,.field-label input:focus,.field-label select:focus,.search-form input:focus,.search-form select:focus{box-shadow:0 0 0 3px rgba(96,165,250,.35)}
button:focus-visible,a:focus-visible,select:focus-visible,input:focus-visible,.aircraft-card:focus-visible{outline:2px solid var(--brand);outline-offset:2px}
.aircraft-card:focus-visible{border-radius:10px}
/* Phone: the toolbar gained a select, and MapLibre's own controls land on top of
   the bottom HUD at this height. */
@media(max-width:700px){
  /* 40px is the smallest comfortable touch target; the old 32px buttons were a
     desktop size shrunk further, which is exactly backwards for a phone. */
   .view-toolbar{top:calc(10px + env(safe-area-inset-top));right:calc(10px + env(safe-area-inset-right));z-index:7;flex-direction:column;flex-wrap:nowrap;align-items:flex-end;gap:6px}
   .view-toolbar button{width:40px;height:40px;flex:0 0 40px;font-size:15px}
  /* The panel becomes a bottom sheet: reachable with a thumb, not up in a corner. */
  /* position:fixed y z-index por encima de la barra lateral (z-index 20). Antes
     era absolute dentro de .globe-stage, que mide 52vh, y quedaba tapado. */
  .layers-panel{position:fixed;top:auto;left:0;right:0;bottom:0;width:auto;z-index:60;border-radius:16px 16px 0 0;border-left:0;border-right:0;border-bottom:0;padding:16px 16px calc(16px + env(safe-area-inset-bottom));max-height:70vh;overflow-y:auto;box-shadow:0 -18px 50px rgba(0,0,0,.6)}
  /* La barra lateral se repliega mientras el menu esta abierto, y vuelve al
     cerrarlo. Asi el panel no compite con la informacion del avion. */
  .sidebar{transition:transform .22s ease}
  body.layers-open .sidebar{transform:translateY(100%)}
  /* Colapsado en telefono: la hoja baja y el mapa se queda con toda la pantalla.
     Mismo gesto que el panel de capas, asi el movimiento se siente uno solo. */
  body.panel-off .sidebar{transform:translateY(100%)}
  body.panel-off .globe-stage{height:100vh;height:100dvh}
  body.layers-open .velo{opacity:1;pointer-events:auto}
  .layers-group h4{font-size:9px}
  .basemap-chip{padding:10px 13px;font-size:11px}
  .layer-row{padding:11px 2px;font-size:11px}
  .layer-row i{width:19px;height:19px}
  .layer-row input:checked+i:after{left:6px;top:2px;width:5px;height:10px}
  .maplibregl-ctrl-bottom-right{margin-bottom:4px;transform:scale(.8);transform-origin:bottom right}
  .maplibregl-ctrl-attrib{font-size:7px}
  .maplibregl-ctrl-attrib-inner{max-width:52vw;display:inline-block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;vertical-align:bottom}
  .route-legs{gap:6px}
  .route-port b{font-size:15px}
  .route-port span{font-size:8px}
  /* iOS Safari hace zoom automático al enfocar cualquier campo con fuente menor
     a 16px, y después no vuelve solo. La alternativa sería maximum-scale=1 en el
     viewport, que además le prohíbe al usuario hacer zoom a mano: peor remedio. */
  .coord-grid input,.field-label input,.field-label select,.search-form input,.search-form select,#quickFilter{font-size:16px}
  .icon-button{width:40px;height:40px}
  .mini-filter{padding:10px 12px;font-size:11px}
  /* El HUD y la barra de herramientas se pisaban entre x≈172 y x≈250 en 360px. */
   .top-hud{flex-wrap:wrap;max-width:60vw}
   .hud-stat{min-width:48px;padding:7px 9px}
  .login-preview-shell{display:block;position:relative;width:100%;height:100dvh;min-height:100dvh;padding:0}
  .public-preview-stage{position:fixed;inset:0;min-height:100dvh;height:100dvh}.public-globe{position:absolute;inset:0}
  .login-preview-shell .login-card{display:none;position:fixed;z-index:30;inset:auto 12px 0;width:auto;min-height:0;max-height:min(72dvh,calc(100dvh - 24px));margin:0;padding:28px 20px calc(24px + env(safe-area-inset-bottom));overflow-y:auto;scrollbar-width:thin;scrollbar-color:#315062 transparent;border:1px solid var(--line);border-bottom:0;border-radius:18px 18px 0 0;transform:translateY(24px);opacity:0;transition:transform .2s ease,opacity .2s ease}
  .login-preview-shell .login-card::-webkit-scrollbar{width:7px}.login-preview-shell .login-card::-webkit-scrollbar-track{background:transparent}.login-preview-shell .login-card::-webkit-scrollbar-thumb{background:#315062;border:2px solid rgba(7,17,27,.78);border-radius:999px}.login-preview-shell .login-card::-webkit-scrollbar-thumb:hover{background:#4b7188}
  .login-preview-shell .login-card.is-open,.login-requested .login-card{display:block;transform:translateY(0);opacity:1}.login-preview-shell .login-card[hidden]{display:none}.login-preview-shell .login-card[role="dialog"]{display:block}
  .preview-panel-toggle{display:flex;align-items:center;justify-content:center;position:fixed;z-index:12;right:calc(16px + env(safe-area-inset-right));top:calc(16px + env(safe-area-inset-top));min-width:44px;min-height:44px;border:1px solid var(--line);border-radius:9px;background:rgba(5,13,21,.85);color:var(--text);padding:11px 14px;text-decoration:none}
  .preview-panel-close{display:flex;align-items:center;justify-content:center;width:100%;min-height:44px;margin-top:14px;border:1px solid var(--line);border-radius:9px;background:transparent;color:var(--muted);padding:10px;text-decoration:none}
  .preview-panel-backdrop{display:block;position:fixed;z-index:20;inset:0;background:rgba(3,9,15,.58);opacity:0;pointer-events:none;transition:opacity .2s ease}.login-preview-shell.sheet-open .preview-panel-backdrop{opacity:1;pointer-events:auto}.login-preview-shell.sheet-open .preview-panel-toggle{visibility:hidden}
  .login-preview-shell .login-foot{position:static;margin:18px 0 0;padding:16px 0 0;text-align:center}.login-preview-shell.sheet-open .login-foot{visibility:visible}
}
/* Public globe mobile zones: header, status, invitation, dedication, attribution. */
@media(max-width:700px){
  .public-preview-stage{background:radial-gradient(circle at 50% 42%,#0c2130 0,#06101a 42%,#02070c 78%)}
  .public-preview-brand{display:block;position:fixed;z-index:12;left:calc(12px + env(safe-area-inset-left));top:calc(16px + env(safe-area-inset-top));line-height:0}.public-preview-brand img{width:104px;height:auto}
   .public-preview-status{position:fixed;z-index:8;left:calc(12px + env(safe-area-inset-left));right:calc(12px + env(safe-area-inset-right));top:calc(68px + env(safe-area-inset-top));bottom:auto;max-width:none;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;pointer-events:none}
   .public-locate-me{position:fixed;z-index:12;left:calc(12px + env(safe-area-inset-left));bottom:calc(124px + env(safe-area-inset-bottom));min-height:44px}
  .public-access-banner{position:fixed;z-index:8;top:auto;left:calc(12px + env(safe-area-inset-left));right:calc(12px + env(safe-area-inset-right));bottom:calc(62px + env(safe-area-inset-bottom));justify-content:space-between;min-height:38px}
  .public-mobile-dedication{display:block;position:fixed;z-index:8;left:calc(12px + env(safe-area-inset-left));right:calc(12px + env(safe-area-inset-right));bottom:calc(31px + env(safe-area-inset-bottom));margin:0;text-align:center;color:var(--subtle);font-size:8.5px;letter-spacing:.05em;pointer-events:none}.public-mobile-dedication b{color:#b87a8e;font-weight:400}
  #publicGlobe .maplibregl-ctrl-bottom-right{margin:0;transform:none}#publicGlobe .maplibregl-ctrl-bottom-right .maplibregl-ctrl-group{transform:translateY(calc(-116px - env(safe-area-inset-bottom)))}
   .login-preview-shell.sheet-open .public-preview-brand,.login-preview-shell.sheet-open .public-access-banner,.login-preview-shell.sheet-open .public-mobile-dedication{visibility:hidden}
   .login-preview-shell.sheet-open .public-locate-me{visibility:hidden}
}
@media(prefers-reduced-motion:reduce){.login-preview-shell .login-card,.preview-panel-backdrop{transition:none}}
