:root{color-scheme:light;--blue-700:#165d9a;--blue-800:#104a7d;--blue-100:#edf3fa;--slate-50:#f6f7f9;--slate-100:#f8f9fb;--slate-300:#e2e6ec;--slate-600:#657286;--slate-900:#253142;--bg:var(--slate-50);--panel:#fff;--raised:var(--slate-100);--line:var(--slate-300);--text:var(--slate-900);--muted:var(--slate-600);--accent:var(--blue-700);--selected:var(--blue-100);--danger:#b42336;--danger-bg:#fff0f2;--success:#147358;--warning:#a55a00;--button-bg:var(--panel);--input-bg:var(--panel);--focus:#165d9a;--ease-out:cubic-bezier(.23,1,.32,1);font:16px/1.5 "Segoe UI",system-ui,"Microsoft YaHei",sans-serif;background:var(--bg);color:var(--text)}
*{box-sizing:border-box}html{-webkit-tap-highlight-color:transparent;-webkit-text-size-adjust:100%}body{margin:0}button,input,select,textarea{font:inherit}button,a,summary{touch-action:manipulation}button{min-height:44px;padding:.55rem 1rem;border:1px solid var(--line);border-radius:9px;background:var(--button-bg);color:var(--text);cursor:pointer;user-select:none;transition:background-color 140ms ease-out,border-color 140ms ease-out}button:active{background:var(--selected);border-color:var(--accent)}button:disabled{opacity:.55;cursor:default}button.primary{background:var(--blue-700);border-color:var(--blue-700);color:#fff;font-weight:600}button.primary:active{background:var(--blue-800)}button.danger{border-color:#e4a6b0;color:var(--danger);background:var(--danger-bg)}a{color:var(--accent);text-underline-offset:3px}input,select,textarea{width:100%;min-height:44px;border:1px solid var(--line);border-radius:8px;padding:.6rem .8rem;background:var(--input-bg);color:var(--text)}input::placeholder,textarea::placeholder{color:var(--muted);opacity:1}input[type=checkbox]{width:20px;min-height:20px;accent-color:var(--blue-700);flex-shrink:0}label{display:grid;gap:.4rem;margin:.9rem 0;color:var(--muted);font-size:.9rem;font-weight:500}:focus-visible{outline:3px solid var(--focus);outline-offset:3px}h1,h2,h3{line-height:1.3;letter-spacing:-.02em;color:var(--text)}h1{font-size:1.6rem;margin:0 0 .7rem}h2{font-size:1.2rem}h3{font-size:1rem}p{margin:.7rem 0}small,.muted{color:var(--muted)}small{font-size:.8rem}code,.numeric,td{font-variant-numeric:tabular-nums}code,.numeric{overflow-wrap:anywhere}
header{padding:1rem max(1.25rem,env(safe-area-inset-left));border-bottom:1px solid var(--line);display:flex;gap:1rem;align-items:center;background:var(--panel);min-height:76px}header strong{margin-right:auto}.brand{display:flex;gap:.7rem;align-items:center;letter-spacing:-.02em}.brand img{width:36px;height:36px;object-fit:contain}main{max-width:1440px;margin:auto;padding:1.75rem}.panel{border:1px solid var(--line);border-radius:14px;background:var(--panel);padding:1.4rem;min-width:0}.login{max-width:460px;margin:5svh auto;padding:2rem;box-shadow:0 12px 36px #152c430a}.login .primary{width:100%;margin-top:.7rem}.login>p{font-size:.9rem}.login details{margin-top:1rem;color:var(--muted);font-size:.875rem}summary{cursor:pointer;min-height:44px;display:list-item;padding:.65rem 0}.layout{display:grid;grid-template-columns:205px minmax(0,1fr);gap:1.5rem}nav{display:flex;flex-direction:column;gap:.35rem}nav button{text-align:left;border-color:transparent;background:transparent}nav button[aria-current=page]{background:var(--selected);border-color:#b8d2ec;color:var(--accent);font-weight:600}.toolbar{display:flex;gap:.6rem;align-items:center;flex-wrap:wrap;margin:1.2rem 0}.toolbar input{width:280px;max-width:100%}.grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(200px,1fr));gap:1rem}.metric{padding:1.15rem;border:1px solid var(--line);border-radius:10px;background:var(--raised);color:var(--muted)}.metric b{display:block;font-size:1.9rem;font-variant-numeric:tabular-nums;color:var(--text);margin-top:.3rem}.table-wrap{overflow:auto;overscroll-behavior:contain}table{border-collapse:collapse;width:100%;font-size:.875rem}th,td{text-align:left;padding:.85rem .75rem;border-bottom:1px solid var(--line);vertical-align:top;overflow-wrap:anywhere}th{color:var(--muted);background:var(--raised);font-weight:600;white-space:nowrap}td button{font-size:.85rem;margin:.2rem;min-height:44px;padding:.45rem .7rem}.badge{display:inline-block;padding:.25rem .65rem;background:var(--selected);border:1px solid #b8d2ec;border-radius:7px;color:var(--accent);font-size:.85rem}#notice{white-space:pre-wrap;border:1px solid #b8d2ec;background:var(--selected);color:var(--accent);padding:.9rem 1rem;border-radius:9px;margin:0 0 1.25rem}#notice[data-error=true]{border-color:#e4a6b0;background:var(--danger-bg);color:var(--danger)}[hidden]{display:none!important}dialog{width:620px;max-width:94vw;max-height:90dvh;border:1px solid var(--line);border-radius:14px;background:var(--panel);color:var(--text);padding:1.5rem}dialog::backdrop{background:#0f1c2b75}.dialog-actions{display:flex;gap:.6rem;justify-content:flex-end;margin-top:1.25rem;flex-wrap:wrap}.permissions{display:grid;grid-template-columns:repeat(2,minmax(0,1fr))}.permissions label{display:flex;align-items:center;gap:.6rem;min-height:44px;margin:.35rem 0}.secret{white-space:pre-wrap;word-break:break-all;max-height:300px;overflow:auto;background:var(--raised);border:1px solid var(--line);border-radius:8px;padding:1rem}
.guest-shell{color-scheme:dark;--bg:#0f1c2b;--panel:#18293d;--raised:#21354d;--line:#354a62;--text:#e3edf8;--muted:#a7bbd1;--accent:#86c3fa;--selected:#214066;--button-bg:var(--raised);--input-bg:#0f1c2b;--focus:#86c3fa;height:100dvh;display:flex;flex-direction:column;overscroll-behavior:none;background:var(--bg);color:var(--text)}.guest-shell .brand img{filter:brightness(1.8)}.guest-shell main{flex:1;min-height:0;max-width:none;width:100%;padding:.85rem;display:grid;grid-template-columns:minmax(0,1fr) 310px;gap:.85rem}.guest-shell .badge{background:var(--selected);border-color:var(--line);color:var(--accent)}.guest-shell .badge[data-tone=success]{background:#123a33;border-color:#357561;color:#97e2ba}.guest-shell .badge[data-tone=warning]{background:#40361f;border-color:#88713d;color:#f0d694}.guest-shell .badge[data-tone=danger]{background:#412532;border-color:#935264;color:#ffc4cc}.map-panel{min-height:300px;position:relative;border:1px solid var(--line);border-radius:12px;overflow:hidden;background:#0f1c2b}canvas{width:100%;height:100%;display:block;touch-action:none}.map-tools{position:absolute;bottom:1rem;left:1rem;display:flex;gap:.5rem}.map-notice{position:absolute;left:1rem;right:1rem;top:1rem;text-align:center;background:var(--panel);border:1px solid var(--line);border-radius:8px;padding:.7rem;pointer-events:none}.roster{overflow:auto;overscroll-behavior:contain}.roster h2{margin-top:0}.roster button{display:block;width:100%;text-align:left;margin:.4rem 0;padding:.7rem;overflow-wrap:anywhere}.roster button[aria-pressed=true]{background:var(--selected);border-color:var(--accent)}.roster img{width:28px;height:28px;object-fit:contain;vertical-align:middle;margin-right:.5rem}.filters{display:flex;gap:.3rem .9rem;flex-wrap:wrap}.filters label{display:flex;align-items:center;font-size:.85rem;min-height:44px;margin:.25rem 0}.canvas-caption{position:absolute;bottom:1.1rem;right:1rem;color:#d4e2f2;background:#0f1c2bde;border-radius:6px;padding:.3rem .5rem;font-size:.75rem;pointer-events:none}
@media(hover:hover) and (pointer:fine){button:hover{background:var(--selected);border-color:#9ebbd8}button.primary:hover{background:var(--blue-800);border-color:var(--blue-800)}button.danger:hover{background:#ffe0e6;border-color:var(--danger)}tbody tr:hover{background:var(--raised)}}
@media(prefers-contrast:more){:root{--muted:#324b65;--line:#788da4}.guest-shell{--muted:#d0dfed;--line:#91a9c2}}@media(prefers-reduced-motion:reduce){button{transition:none}}
@media(max-width:780px){header{flex-wrap:wrap;padding:.75rem 1rem;padding-top:calc(.75rem + env(safe-area-inset-top));gap:.65rem}.brand{font-size:.95rem}main{padding:1rem}.login{margin:2svh auto;padding:1.5rem}.layout{grid-template-columns:1fr;gap:.85rem}nav{flex-direction:row;overflow:auto;padding-bottom:.5rem;overscroll-behavior:contain}nav button{white-space:nowrap}.guest-shell main{grid-template-columns:1fr;grid-template-rows:minmax(280px,1fr) 180px;padding-bottom:calc(.85rem + env(safe-area-inset-bottom))}.guest-shell header{min-height:0}.permissions{grid-template-columns:1fr}.panel{padding:1rem}.login{padding:1.5rem}.guest-shell .roster h2{font-size:1rem;margin-bottom:.5rem}}
@media(max-width:700px){.canvas-caption{bottom:4.7rem;left:1rem;right:auto}}
/* Keep financial values readable; table scroll stays inside the content panel. */
input,select,textarea{font-size:1rem}.table-wrap table{min-width:760px}.table-wrap:focus-visible{outline-offset:2px}
@media(max-width:780px){.table-wrap::before{content:'横向滑动查看完整表格';display:block;position:sticky;left:0;width:fit-content;color:var(--muted);font-size:.8rem;padding:0 0 .65rem}}


input,select,textarea{border-color:var(--control-line,#7c93aa)}.guest-shell{--control-line:#536f8c}
.roster-toggle,.roster .roster-close,.controls-toggle,.mobile-observation-tools{display:none}
.roster-heading{display:flex;align-items:center;justify-content:space-between;gap:.5rem;margin-bottom:.5rem}.roster-heading h2{margin:0}
/* Phone adapts the existing desktop radar HUD: map, floating tools, optional observers.
   Desktop layout and default fit remain unchanged. */
@media(max-width:780px){
 .guest-shell{position:fixed;inset:0;display:block;overflow:hidden}
 .guest-shell main{position:absolute;inset:0;display:block;width:100%;height:100%;padding:0;overflow:hidden}
 .guest-shell .map-panel{width:100%;height:100%;min-height:0;border:0;border-radius:0}
 .guest-shell header{position:absolute;z-index:4;top:calc(12px + env(safe-area-inset-top));left:calc(12px + env(safe-area-inset-left));right:calc(12px + env(safe-area-inset-right));display:flex;flex-wrap:wrap;align-items:center;gap:6px;padding:0;min-height:0;background:none;border:0;pointer-events:none}
 .guest-shell header>*{pointer-events:auto}.guest-shell header strong{margin:0}
 .guest-shell .brand{background:var(--panel);border:1px solid var(--line);border-radius:9px;padding:7px 10px;min-height:44px;font-size:.9rem}.guest-shell .brand img{width:28px;height:28px}
 .guest-shell #counts{position:fixed;bottom:calc(70px + env(safe-area-inset-bottom));left:12px;background:var(--panel);border:1px solid var(--line);border-radius:8px;padding:7px 10px;font-size:.8rem}
 .guest-shell .mobile-observation-tools{position:absolute;z-index:4;right:12px;top:112px;display:flex;gap:6px}
 .guest-shell .mobile-observation-tools button{background:var(--panel);min-width:64px}
 .guest-shell .roster{position:absolute;z-index:5;top:166px;bottom:80px;right:calc(12px + env(safe-area-inset-right));width:min(320px,calc(100% - 24px));height:auto;box-shadow:0 8px 32px #0006;visibility:hidden;transform:translateX(calc(100% + 2rem));transition:transform 180ms var(--ease-out),visibility 180ms}
 .guest-shell .roster.is-open{visibility:visible;transform:translateX(0)}
 .guest-shell .roster .roster-close{display:inline-block;width:44px;min-width:44px;flex-shrink:0;margin:0;padding:.3rem;text-align:center;font-size:1.5rem}
 .guest-shell .roster input{font-size:16px}
 .guest-shell .map-tools{z-index:3;left:calc(12px + env(safe-area-inset-left));bottom:calc(12px + env(safe-area-inset-bottom))}
 .guest-shell .canvas-caption{display:none}
 .guest-shell .map-notice{z-index:2;top:166px;left:12px;right:12px;background:#18293deb}
 .guest-shell .controls-toggle{display:block;position:absolute;z-index:6;right:calc(12px + env(safe-area-inset-right));bottom:calc(12px + env(safe-area-inset-bottom));background:#18293ded;color:#e3edf8;border-color:#536f8c;padding:.55rem .7rem}
 .guest-shell.controls-collapsed header,.guest-shell.controls-collapsed .map-tools,.guest-shell.controls-collapsed .mobile-observation-tools{visibility:hidden;pointer-events:none}
 .guest-shell.controls-collapsed .roster{visibility:hidden;pointer-events:none}
}
@media(max-width:780px) and (max-height:550px){.guest-shell .roster{top:70px;bottom:66px}.guest-shell .mobile-observation-tools{top:12px}.guest-shell header{right:160px}.guest-shell .map-notice{top:70px}}
@media(prefers-reduced-motion:reduce){.guest-shell .roster{transition:none}}
