:root{--c-bg: hsl(200, 18%, 7%);--c-surface: hsl(200, 16%, 10%);--c-surface-2: hsl(200, 15%, 14%);--c-surface-3: hsl(200, 14%, 19%);--c-border: hsl(200, 14%, 26%);--c-border-bright: hsl(184, 40%, 42%);--c-accent: hsl(178, 74%, 47%);--c-accent-dim: hsl(178, 40%, 26%);--c-green: var(--c-accent);--c-green-dim: var(--c-accent-dim);--c-green-glow: hsl(178, 74%, 47%);--c-friend: hsl(210, 100%, 62%);--c-hostile: hsl(0, 100%, 65%);--c-neutral: hsl(149, 69%, 55%);--c-unknown: hsl(46, 100%, 62%);--c-amber: hsl(38, 100%, 58%);--c-red: hsl(0, 85%, 63%);--c-cyan: hsl(184, 100%, 52%);--c-blue: hsl(210, 100%, 62%);--c-text: hsl(195, 22%, 95%);--c-text-dim: hsl(195, 14%, 74%);--c-text-muted: hsl(195, 10%, 54%);--font-mono: ui-monospace, "Cascadia Mono", "SF Mono", Menlo, Consolas, "Liberation Mono", monospace;--font-hud: system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", sans-serif;--font-body: system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", sans-serif;--nav-h: 48px;--status-h: 28px;--sidebar-w: 300px;--panel-radius: 4px;--glow-green: 0 0 10px hsl(178, 74%, 47% / .35);--glow-red: 0 0 10px hsl(0, 85%, 63% / .45);--transition: .15s ease}[data-nvg=true]{--c-bg: hsl(120, 100%, 2%);--c-surface: hsl(120, 100%, 3%);--c-surface-2: hsl(120, 100%, 4%);--c-surface-3: hsl(120, 100%, 6%);--c-border: hsl(120, 80%, 14%);--c-border-bright: hsl(120, 80%, 22%);--c-accent: hsl(120, 100%, 50%);--c-accent-dim: hsl(120, 80%, 30%);--c-green: hsl(120, 100%, 50%);--c-green-dim: hsl(120, 80%, 30%);--c-text: hsl(120, 100%, 80%);--c-text-dim: hsl(120, 70%, 58%);--c-text-muted: hsl(120, 50%, 38%);--c-amber: hsl(120, 100%, 60%);--c-red: hsl(120, 90%, 55%);--c-cyan: hsl(120, 100%, 65%);--c-blue: hsl(120, 80%, 60%);--c-friend: hsl(120, 100%, 70%);--c-hostile: hsl(120, 100%, 85%);--c-neutral: hsl(120, 90%, 60%);--c-unknown: hsl(120, 100%, 75%);--glow-green: 0 0 12px hsl(120, 100%, 50% / .5);filter:saturate(0) sepia(1) hue-rotate(80deg) saturate(4) brightness(.85)}*,*:before,*:after{box-sizing:border-box;margin:0;padding:0}html,body,#root{height:100%;width:100%;overflow:hidden}body{background:var(--c-bg);color:var(--c-text);font-family:var(--font-body);font-size:13px;line-height:1.5;-webkit-font-smoothing:antialiased}.app-shell{display:grid;grid-template-rows:var(--nav-h) 1fr var(--status-h);grid-template-columns:1fr;height:100%}.app-main{display:flex;overflow:hidden;position:relative}.nav{display:flex;align-items:center;gap:0;background:var(--c-surface);border-bottom:1px solid var(--c-border);padding:0 12px;z-index:100}.nav-brand{font-family:var(--font-hud);font-size:18px;font-weight:700;letter-spacing:.15em;color:var(--c-green);text-shadow:var(--glow-green);margin-right:24px;-webkit-user-select:none;user-select:none}.nav-brand span{color:var(--c-text-dim);font-size:11px;font-family:var(--font-mono);font-weight:400;letter-spacing:.05em;margin-left:8px}.nav-tabs{display:flex;gap:2px;flex:1}.nav-tab{background:none;border:none;border-bottom:2px solid transparent;color:var(--c-text-dim);font-family:var(--font-hud);font-size:13px;font-weight:600;letter-spacing:.08em;padding:0 16px;height:var(--nav-h);cursor:pointer;transition:color var(--transition),border-color var(--transition);text-transform:uppercase}.nav-tab:hover{color:var(--c-text)}.nav-tab.active{color:var(--c-green);border-bottom-color:var(--c-green);text-shadow:var(--glow-green)}.nav-controls{display:flex;align-items:center;gap:8px;margin-left:auto}.nvg-btn{background:var(--c-surface-2);border:1px solid var(--c-border);border-radius:3px;color:var(--c-text-dim);font-family:var(--font-mono);font-size:11px;letter-spacing:.1em;padding:4px 10px;cursor:pointer;transition:all var(--transition)}.nvg-btn:hover{border-color:var(--c-green);color:var(--c-green)}.nvg-btn.active{background:var(--c-green-dim);border-color:var(--c-green);color:var(--c-green);box-shadow:var(--glow-green)}.logout-btn{background:none;border:1px solid var(--c-border);border-radius:3px;color:var(--c-text-muted);font-size:11px;padding:4px 10px;cursor:pointer;transition:all var(--transition)}.logout-btn:hover{border-color:var(--c-red);color:var(--c-red)}.status-bar{display:flex;align-items:center;gap:16px;background:var(--c-surface);border-top:1px solid var(--c-border);padding:0 12px;font-family:var(--font-mono);font-size:11px;color:var(--c-text-muted)}.status-dot{width:6px;height:6px;border-radius:50%;display:inline-block;margin-right:5px}.status-dot.connected{background:var(--c-green);box-shadow:var(--glow-green);animation:pulse 2s ease-in-out infinite}.status-dot.connecting{background:var(--c-amber)}.status-dot.disconnected,.status-dot.error{background:var(--c-red)}@keyframes pulse{0%,to{opacity:1}50%{opacity:.4}}.status-time{margin-left:auto;color:var(--c-text-dim);font-size:11px}.map-container{flex:1;position:relative;overflow:hidden}.map-canvas{position:absolute;top:0;right:0;bottom:0;left:0}.maplibregl-ctrl-attrib,.maplibregl-ctrl-logo{display:none!important}.maplibregl-ctrl-group{background:var(--c-surface);border:1px solid var(--c-border);border-radius:var(--panel-radius);box-shadow:none}.maplibregl-ctrl-group button{width:30px;height:30px}.maplibregl-ctrl-group button+button{border-top:1px solid var(--c-border)}.maplibregl-ctrl-group button .maplibregl-ctrl-icon{filter:invert(88%) sepia(8%) saturate(360%) hue-rotate(150deg)}.maplibregl-ctrl-group button:hover{background:var(--c-surface-2)}.maplibregl-ctrl-scale{background:#0f1315b8;border:1px solid var(--c-border);border-top:none;color:var(--c-text-dim);font-family:var(--font-mono);font-size:10px;padding:1px 5px}.map-tools{position:absolute;top:10px;left:10px;display:flex;align-items:flex-start;gap:8px;z-index:5;pointer-events:none}.map-tools>*{pointer-events:auto}.tool-column{display:flex;flex-direction:column;gap:4px}.tool-btn{width:46px;height:34px;background:#151b1eeb;border:1px solid var(--c-border);border-radius:var(--panel-radius);color:var(--c-text-dim);font-family:var(--font-mono);font-size:11px;letter-spacing:.04em;cursor:pointer;transition:var(--transition)}.tool-btn:hover{color:var(--c-text);border-color:var(--c-border-bright)}.tool-btn.active{color:var(--c-bg);background:var(--c-accent);border-color:var(--c-accent);font-weight:700}.tool-btn:focus-visible{outline:2px solid var(--c-accent);outline-offset:1px}.tool-panel{background:#151b1ef7;border:1px solid var(--c-border);border-radius:var(--panel-radius);padding:8px;min-width:260px;max-height:calc(100vh - var(--nav-h) - var(--status-h) - 40px);overflow-y:auto;box-shadow:0 8px 24px #0406078c}.tool-panel-head{font-family:var(--font-mono);font-size:10px;letter-spacing:.12em;color:var(--c-accent);margin-bottom:6px}.tool-panel-empty{color:var(--c-text-dim);font-size:12px}.source-group+.source-group{margin-top:8px}.source-group-name{font-family:var(--font-mono);font-size:10px;color:var(--c-text-muted);letter-spacing:.08em;margin:4px 0 3px}.source-option{display:block;width:100%;text-align:left;background:transparent;border:1px solid transparent;border-radius:3px;padding:5px 6px;cursor:pointer;color:var(--c-text)}.source-option:hover{background:var(--c-surface-2)}.source-option.active{border-color:var(--c-accent);background:#285d5b59}.source-option:focus-visible{outline:2px solid var(--c-accent);outline-offset:1px}.source-name{display:flex;align-items:center;gap:6px;font-size:13px}.source-desc{display:block;font-size:11px;color:var(--c-text-dim);margin-top:1px}.source-ok,.source-warn{font-family:var(--font-mono);font-size:9px;letter-spacing:.06em;padding:1px 4px;border-radius:2px}.source-ok{color:var(--c-accent);border:1px solid var(--c-accent-dim)}.source-warn{color:var(--c-amber);border:1px solid hsl(38 60% 30%)}.goto-panel{min-width:300px}.goto-input{width:100%;background:var(--c-bg);border:1px solid var(--c-border);border-radius:3px;color:var(--c-text);padding:6px 8px;font-size:12px}.goto-input:focus{outline:none;border-color:var(--c-accent)}.goto-bad{color:var(--c-amber);font-size:11px;margin-top:4px}.goto-submit{margin-top:6px;width:100%;background:var(--c-accent);color:var(--c-bg);border:0;border-radius:3px;padding:6px;font-family:var(--font-mono);font-weight:700;cursor:pointer}.range-readout{background:#151b1ef2;border:1px solid var(--c-border);border-radius:var(--panel-radius);padding:6px 8px;min-width:170px}.range-head{display:flex;justify-content:space-between;gap:10px;font-size:10px;letter-spacing:.1em;color:var(--c-accent);margin-bottom:4px}.range-head button{background:none;border:0;color:var(--c-text-muted);font-family:var(--font-mono);font-size:10px;cursor:pointer}.range-head button:hover{color:var(--c-text)}.range-leg{display:flex;justify-content:space-between;gap:12px;font-size:12px;color:var(--c-text)}.range-bearing{color:var(--c-text-dim)}.map-notice{position:absolute;top:10px;left:50%;transform:translate(-50%);max-width:520px;background:#151b1ef5;border:1px solid var(--c-amber);border-radius:var(--panel-radius);padding:8px 12px;font-size:12px;color:var(--c-text-dim);display:flex;flex-direction:column;gap:3px;z-index:4}.map-notice strong{color:var(--c-amber);font-size:12px}.map-notice code{font-family:var(--font-mono);color:var(--c-text)}.map-readout{position:absolute;right:10px;bottom:10px;display:flex;align-items:center;gap:12px;background:#0f1315e0;border:1px solid var(--c-border);border-radius:var(--panel-radius);padding:4px 10px;font-size:11px;color:var(--c-text);z-index:4;max-width:calc(100% - 20px);flex-wrap:wrap}.readout-grid{color:var(--c-accent);letter-spacing:.04em}.readout-attrib{font-size:10px}.map-hint{position:absolute;bottom:10px;left:50%;transform:translate(-50%);background:#1fd1cb29;border:1px solid var(--c-accent-dim);border-radius:var(--panel-radius);padding:3px 10px;font-size:11px;color:var(--c-accent);z-index:4}.unit-marker{position:relative;display:flex;flex-direction:column;align-items:center;cursor:pointer;--unit-color: var(--c-friend)}.unit-svg{width:34px;height:34px;overflow:visible}.unit-frame{fill:#0f1315c7;stroke:var(--unit-color);stroke-width:2.4}.unit-glyph,.unit-heading{fill:var(--unit-color)}.unit-label{margin-top:-3px;font-family:var(--font-mono);font-size:11px;line-height:1.2;color:var(--c-text);text-shadow:0 0 3px hsl(200 30% 2%),0 0 6px hsl(200 30% 2%);white-space:nowrap;pointer-events:none}.unit-marker.signed .unit-frame{filter:drop-shadow(0 0 3px var(--unit-color))}.unit-marker.stale{opacity:.42}.unit-marker.stale .unit-label{color:var(--c-text-dim)}.sidebar{width:var(--sidebar-w);background:var(--c-surface);border-left:1px solid var(--c-border);display:flex;flex-direction:column;overflow:hidden;transition:width var(--transition);flex-shrink:0}.sidebar.collapsed{width:0;border-left:none}.sidebar-header{display:flex;align-items:center;justify-content:space-between;padding:8px 12px;border-bottom:1px solid var(--c-border);background:var(--c-surface-2)}.sidebar-title{font-family:var(--font-hud);font-size:12px;font-weight:700;letter-spacing:.12em;text-transform:uppercase;color:var(--c-green)}.sidebar-close{background:none;border:none;color:var(--c-text-muted);cursor:pointer;font-size:16px;line-height:1;padding:2px 4px}.sidebar-close:hover{color:var(--c-text)}.unit-list{flex:1;overflow-y:auto;padding:4px 0}.unit-item{display:flex;align-items:center;gap:10px;padding:7px 12px;cursor:pointer;border-bottom:1px solid var(--c-border);transition:background var(--transition)}.unit-item:hover{background:var(--c-surface-2)}.unit-item.stale{opacity:.4}.unit-dot{width:10px;height:10px;border-radius:50%;flex-shrink:0;border:1px solid rgba(255,255,255,.2)}.unit-callsign{font-family:var(--font-mono);font-size:12px;color:var(--c-text);flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.unit-meta{font-family:var(--font-mono);font-size:10px;color:var(--c-text-muted)}.unit-battery{font-size:10px;font-family:var(--font-mono);color:var(--c-text-dim)}.unit-battery.low{color:var(--c-red)}.unit-battery.med{color:var(--c-amber)}.chat-panel{display:flex;flex-direction:column;height:100%}.chat-messages{flex:1;overflow-y:auto;padding:8px;display:flex;flex-direction:column;gap:6px}.chat-msg{background:var(--c-surface-2);border:1px solid var(--c-border);border-radius:var(--panel-radius);padding:6px 8px}.chat-msg-header{display:flex;justify-content:space-between;margin-bottom:3px}.chat-callsign{font-family:var(--font-mono);font-size:11px;font-weight:600;color:var(--c-green)}.chat-time{font-family:var(--font-mono);font-size:10px;color:var(--c-text-muted)}.chat-text{font-size:12px;color:var(--c-text);word-break:break-word}.chat-input-row{display:flex;gap:6px;padding:8px;border-top:1px solid var(--c-border);background:var(--c-surface-2)}.chat-input{flex:1;background:var(--c-bg);border:1px solid var(--c-border);border-radius:var(--panel-radius);color:var(--c-text);font-family:var(--font-mono);font-size:12px;padding:6px 8px;outline:none;transition:border-color var(--transition)}.chat-input:focus{border-color:var(--c-green)}.chat-send{background:var(--c-green-dim);border:1px solid var(--c-green);border-radius:var(--panel-radius);color:var(--c-green);font-family:var(--font-mono);font-size:11px;padding:6px 12px;cursor:pointer;transition:all var(--transition)}.chat-send:hover{background:var(--c-green);color:var(--c-bg)}.ptt-panel{display:flex;flex-direction:column;gap:12px;padding:12px;height:100%;overflow-y:auto}.ptt-sessions{display:flex;flex-direction:column;gap:6px}.ptt-session{background:var(--c-surface-2);border:1px solid var(--c-border);border-radius:var(--panel-radius);padding:8px 10px;display:flex;align-items:center;gap:10px}.ptt-session.transmitting{border-color:var(--c-red);box-shadow:var(--glow-red)}.ptt-on-air{background:var(--c-red);color:#fff;font-family:var(--font-mono);font-size:9px;font-weight:700;letter-spacing:.1em;padding:2px 6px;border-radius:2px;animation:blink .8s step-end infinite}@keyframes blink{50%{opacity:0}}.ptt-key-btn{width:100%;padding:20px;background:var(--c-surface-2);border:2px solid var(--c-border-bright);border-radius:8px;color:var(--c-text);font-family:var(--font-hud);font-size:20px;font-weight:700;letter-spacing:.1em;cursor:pointer;transition:all .1s ease;-webkit-user-select:none;user-select:none}.ptt-key-btn:active,.ptt-key-btn.keyed{background:var(--c-red);border-color:var(--c-red);color:#fff;box-shadow:var(--glow-red);transform:scale(.97)}.mission-panel{padding:12px;display:flex;flex-direction:column;gap:8px;height:100%;overflow-y:auto}.mission-card{background:var(--c-surface-2);border:1px solid var(--c-border);border-radius:var(--panel-radius);padding:10px 12px;transition:border-color var(--transition)}.mission-card:hover{border-color:var(--c-border-bright)}.mission-name{font-family:var(--font-hud);font-size:14px;font-weight:600;color:var(--c-green);margin-bottom:2px}.mission-desc{font-size:12px;color:var(--c-text-dim)}.mission-meta{font-family:var(--font-mono);font-size:10px;color:var(--c-text-muted);margin-top:4px}.login-screen{display:flex;align-items:center;justify-content:center;height:100%;background:var(--c-bg);background-image:repeating-linear-gradient(0deg,transparent,transparent 39px,var(--c-border) 40px),repeating-linear-gradient(90deg,transparent,transparent 39px,var(--c-border) 40px)}.login-card{background:var(--c-surface);border:1px solid var(--c-border-bright);border-radius:6px;padding:40px 48px;min-width:360px;box-shadow:0 0 40px hsl(142,72%,10% / .8)}.login-logo{text-align:center;margin-bottom:32px}.login-logo h1{font-family:var(--font-hud);font-size:32px;font-weight:700;letter-spacing:.2em;color:var(--c-green);text-shadow:var(--glow-green)}.login-logo p{font-family:var(--font-mono);font-size:10px;color:var(--c-text-muted);letter-spacing:.08em;margin-top:4px}.login-form{display:flex;flex-direction:column;gap:16px}.form-group{display:flex;flex-direction:column;gap:4px}.form-label{font-family:var(--font-mono);font-size:10px;letter-spacing:.1em;text-transform:uppercase;color:var(--c-text-dim)}.form-input{background:var(--c-bg);border:1px solid var(--c-border);border-radius:var(--panel-radius);color:var(--c-text);font-family:var(--font-mono);font-size:14px;padding:10px 12px;outline:none;transition:border-color var(--transition);width:100%}.form-input:focus{border-color:var(--c-green);box-shadow:var(--glow-green)}.login-submit{background:var(--c-green-dim);border:1px solid var(--c-green);border-radius:var(--panel-radius);color:var(--c-green);font-family:var(--font-hud);font-size:16px;font-weight:700;letter-spacing:.15em;padding:12px;cursor:pointer;text-transform:uppercase;transition:all var(--transition);margin-top:8px}.login-submit:hover{background:var(--c-green);color:var(--c-bg);box-shadow:var(--glow-green)}.login-submit:disabled{opacity:.5;cursor:not-allowed}.login-error{background:#310c0c;border:1px solid var(--c-red);border-radius:var(--panel-radius);color:var(--c-red);font-family:var(--font-mono);font-size:11px;padding:8px 12px}.maplibregl-popup-content{background:var(--c-surface)!important;border:1px solid var(--c-border-bright)!important;border-radius:var(--panel-radius)!important;padding:10px 12px!important;color:var(--c-text)!important;font-family:var(--font-mono)!important;font-size:11px!important;box-shadow:0 4px 16px #0009!important;min-width:180px!important}.maplibregl-popup-tip{border-top-color:var(--c-border-bright)!important}.popup-callsign{font-family:var(--font-hud);font-size:15px;font-weight:700;color:var(--c-green);margin-bottom:6px}.popup-row{display:flex;justify-content:space-between;gap:16px;color:var(--c-text-dim);margin-top:2px}.popup-label{color:var(--c-text-muted)}.popup-val{color:var(--c-text);font-weight:600}.map-toggle{position:absolute;z-index:10;display:flex;gap:6px}.map-toggle.left{top:12px;left:12px}.map-toggle.right{top:12px;right:12px}.map-btn{background:var(--c-surface);border:1px solid var(--c-border);border-radius:var(--panel-radius);color:var(--c-text-dim);font-family:var(--font-hud);font-size:12px;font-weight:600;letter-spacing:.08em;padding:6px 12px;cursor:pointer;transition:all var(--transition);-webkit-backdrop-filter:blur(4px);backdrop-filter:blur(4px)}.map-btn:hover{border-color:var(--c-green);color:var(--c-green)}.map-btn.active{border-color:var(--c-green);color:var(--c-green);background:var(--c-green-dim)}::-webkit-scrollbar{width:4px;height:4px}::-webkit-scrollbar-track{background:var(--c-bg)}::-webkit-scrollbar-thumb{background:var(--c-border-bright);border-radius:2px}::-webkit-scrollbar-thumb:hover{background:var(--c-green-dim)}.mono{font-family:var(--font-mono)}.hud{font-family:var(--font-hud)}.green{color:var(--c-green)}.dim{color:var(--c-text-dim)}.muted{color:var(--c-text-muted)}
