[hidden]{display:none!important}:root{--ink:#07111d;--surface:#0b1826;--line:#1e3345;--muted:#87a0b2;--text:#eaf7ff;--cyan:#23e5df;--red:#ff5864;--gold:#ffc65a}*{box-sizing:border-box}html,body,.app-shell{height:100%;margin:0;overflow:hidden}body{background:var(--ink);color:var(--text);font:13px/1.4 Inter,"Microsoft YaHei",system-ui,sans-serif}.app-shell{display:flex;flex-direction:column}.topbar{height:58px;flex:0 0 58px;display:flex;align-items:center;gap:18px;padding:0 16px;border-bottom:1px solid var(--line);background:#091521;z-index:3}.brand{display:flex;align-items:center;gap:9px;min-width:165px}.brand-mark{display:grid;place-items:center;width:25px;height:25px;color:#041015;font-weight:900;background:var(--cyan);clip-path:polygon(0 0,100% 0,100% 68%,68% 100%,0 100%)}.brand b{display:block;letter-spacing:.16em;font-size:12px}.brand span:not(.brand-mark){display:block;color:var(--muted);font-size:10px;letter-spacing:.08em}.top-status{display:flex;align-items:center;gap:8px;color:var(--muted);flex:1}.badge{font-size:11px;padding:3px 7px;border:1px solid #365064;color:#aac3d2;background:#102334}.badge.ok{border-color:#298d88;color:#69f5e7}.badge.offline{border-color:#91424c;color:#ff929b}.badge.stale{border-color:#8a723b;color:#ffd879}.badge.source.demo{border-color:#725a28;color:#ffc65a}.badge.source.live{border-color:#21857f;color:#64f7e8}.badge.source.live-preview{border-color:#21857f;color:#64f7e8}.header-actions{display:flex;gap:8px}.button,.icon-button,.map-controls button{border:1px solid #315064;background:#102233;color:var(--text);font:inherit;padding:7px 10px;cursor:pointer}.button{border-color:#249f9a;color:#8dfffa}.icon-button{display:block}.button:hover,.icon-button:hover,.map-controls button:hover{background:#17344a}.workspace{position:relative;min-height:0;flex:1;display:flex}.side-panel{width:250px;flex:0 0 250px;padding:18px 15px;background:var(--surface);border-right:1px solid var(--line);overflow:auto;transition:margin .18s ease}.panel-closed .side-panel{margin-left:-250px}.panel-title{display:flex;align-items:start;justify-content:space-between;padding-bottom:16px;border-bottom:1px solid var(--line)}.eyebrow{display:block;color:var(--muted);font-size:10px;letter-spacing:.12em}.panel-title strong{font-size:15px}.viewer-count{color:var(--muted);font-size:11px;padding-top:3px}.notice{display:grid;gap:4px;margin:14px 0;padding:10px;border-left:2px solid #41657e;background:#0d2131;color:#c3d5df}.notice strong{font-size:12px}.notice span{font-size:11px;color:var(--muted)}.notice.demo,.notice.stale{border-color:var(--gold)}.notice.offline{border-color:var(--red)}.notice.ok{border-color:var(--cyan)}.filter-section{padding:4px 0 14px;border-bottom:1px solid var(--line)}h2{font-size:11px;text-transform:uppercase;letter-spacing:.12em;color:var(--muted);margin:10px 0}.filter{display:flex;align-items:center;gap:9px;padding:6px 0;cursor:pointer}.filter input{accent-color:var(--cyan)}.dot,.marker{display:inline-block;width:10px;height:10px;border-radius:50%}.dot.self,.marker.self{background:var(--cyan)}.dot.enemy,.marker.enemy{background:var(--red)}.dot.bot,.marker.bot{background:var(--gold)}.marker{width:12px;height:12px;border:2px solid #eaf7ff;box-shadow:0 0 0 3px #07111dbb}.marker.occluded{background:transparent!important;border-style:dashed;opacity:.8}.meta{padding:10px 0;border-bottom:1px solid var(--line)}.meta div{display:flex;justify-content:space-between;padding:5px 0}.meta span{color:var(--muted)}.meta b{font-weight:500}.calibration{margin-top:14px;padding:10px;background:#18202a;border:1px solid #4e4b3b;color:#e6d7a2}.calibration span{display:block;color:#b9ae88;font-size:11px;margin-top:4px}.privacy{font-size:11px;color:var(--muted);margin:14px 0}.attribution{margin:8px 0 0;color:#638195;font-size:10px}.attribution a{color:#8fbac9;text-decoration:none}.attribution a:hover{text-decoration:underline}.map-region{position:relative;min-width:0;flex:1;background:#08131e}.leaflet-container{height:100%;width:100%;background:#08131e;font:inherit}.map-hud{position:absolute;z-index:500;top:12px;left:12px;display:flex;gap:9px;pointer-events:none}.map-hud span{padding:5px 7px;background:#08131ecc;border:1px solid #365064;color:#b6d0dd;font-size:11px}.map-hud span:first-child{color:#eaf7ff}.map-controls{position:absolute;z-index:500;right:10px;bottom:18px}.map-controls button{font-size:11px;background:#091a29e8}.toast{position:fixed;z-index:1000;right:16px;bottom:16px;padding:9px 12px;background:#18384c;border:1px solid var(--cyan);color:#aafffa;transform:translateY(70px);opacity:0;transition:.18s}.toast.show{transform:translateY(0);opacity:1}.leaflet-control-zoom{margin-top:54px!important}.leaflet-control-zoom a{background:#0a1a28!important;color:#d9f6ff!important;border-color:#29475e!important}.leaflet-control-zoom a:hover{background:#17344a!important}@media(max-width:650px){.topbar{height:52px;flex-basis:52px;padding:0 10px;gap:8px}.brand{min-width:auto}.brand>div span{display:none}.top-status{gap:5px;overflow:hidden}.header-actions .button{display:none}.icon-button{display:block}.side-panel{position:absolute;z-index:700;top:0;bottom:0;width:min(276px,84vw);flex-basis:auto;box-shadow:8px 0 24px #0008}.panel-closed .side-panel{margin-left:calc(-1 * min(276px,84vw))}.map-hud{top:9px;left:9px}.map-controls{bottom:10px;right:8px}.toast{right:10px;bottom:10px}}@media(prefers-reduced-motion:reduce){*{transition:none!important}}
.calibration-tools{margin-top:12px;color:#9eb8c8;font-size:11px}.calibration-tools summary{cursor:pointer;color:#b9dde6}.calibration-tools output{display:block;overflow-wrap:anywhere;padding:6px 0;color:#8dfffa}button:focus-visible,a:focus-visible,summary:focus-visible,input:focus-visible{outline:2px solid #23e5df;outline-offset:3px}

.panel-closed .side-panel{visibility:hidden;pointer-events:none}.map-hud .calibration-tag{color:#e6d7a2;border-color:#665c39}

.zoom-tools{margin:12px 0}.zoom-tools button{font:inherit;font-size:11px;color:#b9dde6;background:#102233;border:1px solid #315064;padding:6px;margin:0 4px 4px 0;cursor:pointer}.zoom-tools button:disabled{opacity:.5;cursor:wait}.zoom-tools output{display:block;color:#d5c792;font-size:11px;overflow-wrap:anywhere}

.map-entity-marker{display:flex;align-items:center;justify-content:center}
.follow-section{padding:4px 0 12px;border-bottom:1px solid var(--line)}.select-label{display:block;color:var(--muted);font-size:11px;margin:4px 0}.follow-section select{width:100%;padding:7px;background:#0d2131;color:var(--text);border:1px solid #315064;font:inherit}.follow-actions{display:flex;gap:6px;margin-top:7px}.follow-actions button{font:inherit;font-size:11px;padding:6px 8px;border:1px solid #315064;background:#102233;color:#b9dde6;cursor:pointer}.follow-section output{display:block;margin-top:6px;color:#a4c2d0;font-size:10px;overflow-wrap:anywhere}.follow-section #followStatus{color:#8dfffa}.marker.teammate{background:#7fa9ff}.marker.vehicle{border-radius:2px;background:#a789ff}.marker.airdrop{border-radius:1px;background:#f4b75a}.marker.selected{box-shadow:0 0 0 3px #fff,0 0 0 5px #23e5df}.heading-arrow{position:absolute;left:3px;top:-10px;width:0;height:0;border-left:3px solid transparent;border-right:3px solid transparent;border-bottom:7px solid #eaf7ff;transform-origin:3px 16px}.map-controls{display:flex;flex-direction:column;align-items:flex-end;gap:5px}.zoom-label{padding:4px 6px;background:#091a29e8;color:#b6d0dd;font-size:10px}.zoom-label output{color:#8dfffa}.map-controls input{width:126px;accent-color:#23e5df}.zoom-quick{display:flex;gap:3px}.zoom-quick button{padding:3px 4px;font-size:9px}@media(max-width:650px){.map-controls input{width:110px}.follow-section select{min-height:34px}}

.marker.cached{background:transparent!important;border-color:#8b98a3!important;border-style:dashed;opacity:.78;box-shadow:0 0 0 3px #07111dbb}.marker.cached .heading-arrow{border-bottom-color:#8b98a3}


.heading-arrow.heading-cached{opacity:.55;filter:grayscale(1)}.marker.cached .heading-arrow:not(.heading-cached){border-bottom-color:#eaf7ff;opacity:1}
.marker.cached.selected{opacity:1;background:#5d6b78!important;border-color:#fff!important;box-shadow:0 0 0 3px #fff,0 0 0 5px #23e5df}
.marker.self::after{content:"我";position:absolute;left:50%;top:16px;transform:translateX(-50%);white-space:nowrap;font-size:10px;line-height:15px;padding:0 4px;background:#07111de8;color:#eaf7ff;border:1px solid #5d7989}
.marker.self.cached::after{content:"我 · 最后位置";color:#bac6cf}

