:root{--bg:#f4f6f9;--panel:#fff;--text:#1c2430;--muted:#667085;--line:#e3e8ef;--accent:#1769e0;--accent-t:#fff;
--ok:#12805c;--warn:#b7791f;--bad:#c0392b;--c1:#1769e0;--c2:#e5484d;--c3:#12a594;--c4:#f5a524;--side:#111a2b;--side-t:#c8d1e0}
@media(prefers-color-scheme:dark){:root{--bg:#0e131c;--panel:#161d2a;--text:#e6ebf3;--muted:#8a96a8;--line:#263044;
--accent:#4c8dff;--ok:#3ecf9b;--warn:#f5b84a;--bad:#ff6b63;--c1:#4c8dff;--c2:#ff6b63;--c3:#3ecf9b;--c4:#f5b84a;--side:#0a0f18}}
*{box-sizing:border-box}
body{margin:0;font:14px/1.45 system-ui,-apple-system,"Segoe UI",sans-serif;background:var(--bg);color:var(--text)}
.hidden{display:none!important}
h1{font-size:20px;margin:0 0 4px}h2{font-size:15px;margin:0 0 10px}
#app{display:flex;min-height:100vh}
aside{width:210px;background:var(--side);color:var(--side-t);display:flex;flex-direction:column;position:sticky;top:0;height:100vh;flex:none}
.brand{padding:18px 16px;font-weight:600;font-size:16px;color:#fff}.brand small{display:block;font-weight:400;color:#7d8aa0;font-size:11px}
nav{flex:1}nav a{display:block;padding:9px 16px;color:var(--side-t);text-decoration:none;border-left:3px solid transparent}
nav a:hover{background:#ffffff10}nav a.on{background:#ffffff18;color:#fff;border-left-color:var(--accent)}
.side-foot{padding:12px 16px;font-size:12px;display:flex;justify-content:space-between;align-items:center}
main{flex:1;padding:22px 28px;min-width:0;max-width:1400px}
.head{display:flex;justify-content:space-between;align-items:center;gap:12px;margin-bottom:16px;flex-wrap:wrap}
.card{background:var(--panel);border:1px solid var(--line);border-radius:10px;padding:16px;margin-bottom:16px}
.grid{display:grid;gap:14px}.g2{grid-template-columns:repeat(auto-fit,minmax(380px,1fr))}
.kpis{grid-template-columns:repeat(auto-fit,minmax(150px,1fr));margin-bottom:16px}
.kpi{background:var(--panel);border:1px solid var(--line);border-radius:10px;padding:12px 14px}
.kpi b{display:block;font-size:22px;margin-top:2px}.kpi span{color:var(--muted);font-size:12px}
table{width:100%;border-collapse:collapse}th,td{text-align:left;padding:7px 10px;border-bottom:1px solid var(--line);vertical-align:middle}
th{color:var(--muted);font-weight:500;font-size:12px;white-space:nowrap}td.n,th.n{text-align:right;font-variant-numeric:tabular-nums}
tr:hover td{background:color-mix(in srgb,var(--accent) 5%,transparent)}
.tw{overflow-x:auto}
input,select,textarea,button{font:inherit;color:inherit}
input,select,textarea{background:var(--bg);border:1px solid var(--line);border-radius:6px;padding:6px 9px;width:100%}
input:focus,select:focus,textarea:focus{outline:2px solid color-mix(in srgb,var(--accent) 40%,transparent);border-color:var(--accent)}
label{display:block;font-size:12px;color:var(--muted);margin-bottom:10px}label input,label select,label textarea{margin-top:3px;color:var(--text);font-size:14px}
button{border:1px solid var(--line);background:var(--panel);border-radius:6px;padding:6px 12px;cursor:pointer}
button:hover{border-color:var(--accent)}button.primary{background:var(--accent);color:var(--accent-t);border-color:var(--accent)}
button.danger{color:var(--bad)}button.link{border:0;background:none;color:var(--side-t);padding:0;text-decoration:underline}
button.sm{padding:2px 8px;font-size:12px}
.row{display:flex;gap:8px;align-items:center;flex-wrap:wrap}.row>*{width:auto}
.form2{display:grid;grid-template-columns:1fr 1fr;gap:0 12px}
.pill{display:inline-block;padding:1px 8px;border-radius:99px;font-size:12px;background:var(--line)}
.pill.ok{background:color-mix(in srgb,var(--ok) 18%,transparent);color:var(--ok)}
.pill.bad{background:color-mix(in srgb,var(--bad) 18%,transparent);color:var(--bad)}
.pill.warn{background:color-mix(in srgb,var(--warn) 18%,transparent);color:var(--warn)}
.muted{color:var(--muted)}.err{color:var(--bad);min-height:18px;margin-bottom:8px}
.mono{font-family:ui-monospace,Menlo,Consolas,monospace;font-size:12.5px}
pre.mono{background:var(--bg);border:1px solid var(--line);border-radius:6px;padding:10px;overflow:auto;max-height:420px;margin:0;white-space:pre-wrap;word-break:break-all}
.bar{height:6px;background:var(--line);border-radius:3px;min-width:60px}.bar i{display:block;height:100%;background:var(--c1);border-radius:3px}
dialog{border:1px solid var(--line);border-radius:12px;background:var(--panel);color:var(--text);padding:20px;width:min(560px,94vw)}
dialog::backdrop{background:#0008}dialog .actions{display:flex;justify-content:flex-end;gap:8px;margin-top:12px}
.login{display:flex;min-height:100vh;align-items:center;justify-content:center}.login-card{width:340px}
#toast{position:fixed;right:20px;bottom:20px;display:flex;flex-direction:column;gap:8px;z-index:9}
#toast div{background:var(--text);color:var(--bg);padding:9px 14px;border-radius:8px;box-shadow:0 4px 14px #0004}
svg.chart{width:100%;height:auto;display:block}svg.chart text{fill:var(--muted);font-size:11px}
svg.chart .grid{stroke:var(--line);stroke-width:1}.legend{display:flex;gap:14px;font-size:12px;color:var(--muted);margin-top:6px;flex-wrap:wrap}
.legend i{display:inline-block;width:10px;height:10px;border-radius:2px;margin-right:5px}
.tip{position:fixed;pointer-events:none;background:var(--text);color:var(--bg);padding:5px 9px;border-radius:6px;font-size:12px;z-index:20;white-space:pre}
.vars{display:flex;flex-wrap:wrap;gap:4px 12px;max-height:150px;overflow:auto;border:1px solid var(--line);border-radius:6px;padding:8px}
.vars label{margin:0;display:flex;gap:5px;align-items:center;color:var(--text);font-size:12.5px}.vars input{width:auto;margin:0}
@media(max-width:800px){#app{flex-direction:column}aside{width:auto;height:auto;position:static}nav{display:flex;overflow-x:auto}main{padding:14px}.form2{grid-template-columns:1fr}}

#map{height:560px;border-radius:10px;border:1px solid var(--line);background:var(--bg);z-index:0}
.maptools{display:flex;gap:10px;align-items:end;flex-wrap:wrap}.maptools label{margin:0;display:flex;flex-direction:column}.maptools select,.maptools input{width:auto}
.maptime{display:flex;gap:12px;align-items:center;margin:10px 0}.maptime input[type=range]{flex:1;padding:0}
.legendbar{width:240px;height:12px;border-radius:3px;border:1px solid var(--line)}
.mapinfo{position:absolute;right:10px;top:10px;z-index:500;background:var(--panel);border:1px solid var(--line);border-radius:6px;padding:4px 9px;font-size:12px;min-width:120px;pointer-events:none}
.notice{background:color-mix(in srgb,var(--warn) 14%,transparent);border:1px solid color-mix(in srgb,var(--warn) 40%,transparent);border-radius:6px;padding:8px 10px;margin-top:10px;font-size:13px}
.checker{background-color:#fff;background-image:linear-gradient(45deg,#d8d8d8 25%,transparent 25%,transparent 75%,#d8d8d8 75%),linear-gradient(45deg,#d8d8d8 25%,transparent 25%,transparent 75%,#d8d8d8 75%);background-size:16px 16px;background-position:0 0,8px 8px}
.layerbar{display:flex;gap:6px;flex-wrap:wrap;margin-bottom:10px}.layerbar button.on{background:var(--accent);color:var(--accent-t);border-color:var(--accent)}.layerbar button:disabled{opacity:.45;cursor:not-allowed}
.city{background:none;border:0}.citylabel{position:absolute;transform:translate(-50%,-50%);white-space:nowrap;background:#ffffffe6;color:#111;border-radius:10px;padding:1px 7px;font:600 11px/1.5 system-ui,sans-serif;box-shadow:0 0 0 1px #00000026,0 1px 3px #0003}
.citylabel b{font-weight:700}
#map.pale .leaflet-tile-pane{filter:grayscale(.9) brightness(1.1) contrast(.88)}
#map.offline{background:#dbe7f1}
.ctry span{position:absolute;transform:translate(-50%,-50%);white-space:nowrap;color:#6b7686;font:600 10px/1 system-ui,sans-serif;letter-spacing:.08em;text-transform:uppercase;text-shadow:0 0 3px #fff,0 0 3px #fff}

.msearch{position:relative;margin:0 0 8px;max-width:420px}
.msearch input{width:100%}
#mHits{position:absolute;z-index:1000;left:0;right:0;top:100%;margin:2px 0 0;padding:0;list-style:none;background:var(--panel);border:1px solid var(--line);border-radius:8px;box-shadow:0 6px 18px rgba(0,0,0,.18);max-height:280px;overflow:auto}
#mHits li{padding:6px 10px;cursor:pointer}
#mHits li[data-i]:hover{background:var(--line)}
#mHits.hidden{display:none}
