:root{
  --bg:#07111f; --bg2:#0b1a2e; --panel:rgba(10,24,43,.88); --panel2:rgba(14,32,56,.92);
  --line:rgba(96,165,250,.18); --line2:rgba(96,165,250,.35);
  --txt:#dbe7f5; --muted:#8aa4c2; --dim:#5f7795;
  --cy:#38bdf8; --cy2:#7dd3fc; --green:#34d399; --amber:#fbbf24; --red:#f87171; --violet:#a78bfa; --orange:#fb923c;
  --font:"Microsoft YaHei","微软雅黑","PingFang SC","Noto Sans CJK SC",system-ui,sans-serif;
  --mono:"JetBrains Mono",Consolas,"Courier New",monospace;
}
*{box-sizing:border-box;margin:0;padding:0}
html,body{height:100%;background:var(--bg);color:var(--txt);font:13px/1.55 var(--font);overflow:hidden}
a{color:var(--cy2);text-decoration:none}

/* 顶栏 */
#top{position:fixed;left:0;right:0;top:0;height:56px;z-index:1000;display:flex;align-items:center;gap:14px;padding:0 16px;
  background:linear-gradient(180deg,rgba(7,17,31,.98),rgba(7,17,31,.82));border-bottom:1px solid var(--line2);backdrop-filter:blur(8px)}
#top .logo{height:30px;filter:drop-shadow(0 0 6px rgba(56,189,248,.35))}
#top h1{font-size:18px;font-weight:700;letter-spacing:1px;color:#fff}
#top h1 small{display:block;font-size:11px;font-weight:400;color:var(--muted);letter-spacing:2px;margin-top:-1px}
#top .spacer{flex:1}
#top .tag{font-size:11px;color:var(--cy2);border:1px solid var(--line2);border-radius:4px;padding:2px 8px;background:rgba(56,189,248,.08)}
#top .clock{font-family:var(--mono);font-size:14px;color:#fff;letter-spacing:1px}
#fresh{display:flex;gap:10px;font-size:11px;color:var(--muted)}
#fresh span i{display:inline-block;width:7px;height:7px;border-radius:50%;background:var(--green);margin-right:4px;box-shadow:0 0 6px var(--green)}
#fresh span.stale i{background:var(--amber);box-shadow:0 0 6px var(--amber)}
#fresh span.none i{background:var(--dim);box-shadow:none}

/* 左导航 */
#nav{position:fixed;left:0;top:56px;bottom:0;width:84px;z-index:900;background:var(--panel);border-right:1px solid var(--line);display:flex;flex-direction:column;align-items:stretch;padding-top:10px}
#nav button{background:transparent;border:0;color:var(--muted);padding:12px 4px 10px;cursor:pointer;font:inherit;display:flex;flex-direction:column;align-items:center;gap:6px;border-left:3px solid transparent;transition:.15s}
#nav button svg{width:24px;height:24px;stroke:currentColor;fill:none;stroke-width:1.7;stroke-linecap:round;stroke-linejoin:round}
#nav button span{font-size:12px;letter-spacing:1px}
#nav button:hover{color:var(--txt);background:rgba(56,189,248,.06)}
#nav button.active{color:var(--cy2);background:linear-gradient(90deg,rgba(56,189,248,.16),transparent);border-left-color:var(--cy)}
#nav .foot{margin-top:auto;padding:10px 6px;font-size:10px;color:var(--dim);text-align:center;line-height:1.4}

/* 地图 */
#map{position:fixed;left:84px;top:56px;right:420px;bottom:0;background:#05101c}
.leaflet-container{font-family:var(--font);background:#05101c}
.leaflet-control-attribution{background:rgba(7,17,31,.7)!important;color:var(--dim)!important;font-size:10px}
.leaflet-control-attribution a{color:var(--dim)!important}
.leaflet-popup-content-wrapper{background:var(--panel2);color:var(--txt);border:1px solid var(--line2);border-radius:8px;box-shadow:0 8px 30px rgba(0,0,0,.5)}
.leaflet-popup-tip{background:var(--panel2)}
.leaflet-popup-content{margin:10px 14px;font-size:12px;line-height:1.6}
.leaflet-popup-content b{color:#fff}
.leaflet-popup-content .k{color:var(--muted)}
.leaflet-tooltip{background:rgba(7,17,31,.85);color:#fff;border:1px solid var(--line2);border-radius:4px;font-size:11px;padding:2px 6px;box-shadow:none}
.leaflet-tooltip-top:before,.leaflet-tooltip-bottom:before,.leaflet-tooltip-left:before,.leaflet-tooltip-right:before{border-color:transparent}
.city-label{background:transparent;border:0;color:#e2f0ff;font-size:12px;font-weight:600;text-shadow:0 0 4px #000,0 0 8px #000,0 1px 2px #000;box-shadow:none;padding:0}
.city-label.small{font-size:11px;font-weight:500;color:#cfe3fb}
.lake-label{background:transparent;border:0;color:#9fd8ff;font-size:13px;font-style:italic;letter-spacing:2px;text-shadow:0 0 6px #000,0 0 10px #000;box-shadow:none}
.scenic-icon{width:22px;height:22px;border-radius:50%;background:radial-gradient(circle at 35% 35%,#fde68a,#f59e0b 60%,#b45309);border:2px solid #fff;box-shadow:0 0 8px rgba(251,191,36,.8);display:flex;align-items:center;justify-content:center;font-size:11px;color:#3a1d00;font-weight:800}

/* 地图上的浮层 */
#layers{position:absolute;left:12px;top:12px;z-index:700;display:flex;flex-direction:column;gap:6px;max-width:260px}
#layers .grp{background:var(--panel);border:1px solid var(--line);border-radius:8px;padding:8px 10px;backdrop-filter:blur(6px)}
#layers .grp h4{font-size:11px;color:var(--muted);font-weight:500;letter-spacing:1px;margin-bottom:6px}
.chip{display:inline-flex;align-items:center;gap:6px;margin:2px 4px 2px 0;padding:4px 9px;border-radius:14px;border:1px solid var(--line2);background:rgba(56,189,248,.06);color:var(--txt);font-size:11.5px;cursor:pointer;user-select:none;transition:.15s}
.chip:hover{background:rgba(56,189,248,.14)}
.chip.on{background:rgba(56,189,248,.28);border-color:var(--cy);color:#fff;box-shadow:0 0 0 1px rgba(56,189,248,.25) inset}
.chip i{width:8px;height:8px;border-radius:2px;background:var(--cy);display:inline-block}
.chip.sat i{background:#e5e7eb}.chip.fire i{background:var(--red)}.chip.aq i{background:var(--green)}.chip.no2 i{background:var(--violet)}.chip.aod i{background:var(--amber)}
.chip.water i{background:#1e90ff}.chip.ndci i{background:linear-gradient(90deg,#22c55e,#eab308,#ef4444)}.chip.cloud i{background:#cbd5e1}.chip.rain i{background:#60a5fa}
.chip.ndvi i{background:linear-gradient(90deg,#8b5a2b,#facc15,#15803d)}.chip.night i{background:#fde68a}.chip.lst i{background:linear-gradient(90deg,#3b82f6,#ef4444)}.chip.rgb i{background:#94a3b8}
.chip.dis{opacity:.45;pointer-events:none}
#legend{position:absolute;left:12px;bottom:24px;z-index:700;background:var(--panel);border:1px solid var(--line);border-radius:8px;padding:8px 12px;font-size:11px;color:var(--muted);max-width:300px;backdrop-filter:blur(6px)}
#legend b{color:var(--txt);font-weight:600}
#legend .row{display:flex;align-items:center;gap:6px;margin-top:3px}
#legend .sw{width:14px;height:10px;border-radius:2px;display:inline-block}
#legend .bar{height:8px;width:150px;border-radius:3px;display:inline-block}
#basemap{position:absolute;right:12px;top:12px;z-index:700;background:var(--panel);border:1px solid var(--line);border-radius:8px;padding:6px 8px;backdrop-filter:blur(6px);display:flex;gap:4px}
#basemap button{background:transparent;border:1px solid transparent;color:var(--muted);font:inherit;font-size:11px;padding:3px 8px;border-radius:5px;cursor:pointer}
#basemap button.on{color:#fff;background:rgba(56,189,248,.22);border-color:var(--cy)}
#toast{position:absolute;left:50%;top:14px;transform:translateX(-50%);z-index:800;background:rgba(7,17,31,.9);border:1px solid var(--line2);color:#fff;padding:6px 14px;border-radius:20px;font-size:12px;display:none}

/* 右面板 */
#side{position:fixed;right:0;top:56px;bottom:0;width:420px;z-index:900;background:var(--panel);border-left:1px solid var(--line);overflow-y:auto;padding:14px 14px 30px;backdrop-filter:blur(8px)}
#side::-webkit-scrollbar{width:6px}#side::-webkit-scrollbar-thumb{background:rgba(96,165,250,.25);border-radius:3px}
.mod-title{display:flex;align-items:baseline;gap:10px;margin-bottom:4px}
.mod-title h2{font-size:17px;color:#fff;font-weight:700;letter-spacing:1px}
.mod-title .sub{font-size:11px;color:var(--muted)}
.intro{font-size:12px;color:var(--muted);margin:4px 0 12px;line-height:1.6}
.card{background:rgba(14,32,56,.7);border:1px solid var(--line);border-radius:10px;padding:11px 13px;margin-bottom:10px}
.card h3{font-size:12.5px;color:var(--cy2);font-weight:600;letter-spacing:1px;margin-bottom:8px;display:flex;align-items:center;justify-content:space-between}
.card h3 .src{font-size:10px;color:var(--dim);font-weight:400;letter-spacing:0}
.badge{display:inline-block;font-size:10px;padding:1px 6px;border-radius:3px;border:1px solid;line-height:1.5;margin-left:6px;vertical-align:middle}
.badge.live{color:var(--green);border-color:rgba(52,211,153,.5);background:rgba(52,211,153,.08)}
.badge.sat{color:var(--cy2);border-color:rgba(56,189,248,.5);background:rgba(56,189,248,.08)}
.badge.stat{color:var(--amber);border-color:rgba(251,191,36,.5);background:rgba(251,191,36,.08)}
.badge.demo{color:var(--violet);border-color:rgba(167,139,250,.5);background:rgba(167,139,250,.08)}
.kpis{display:grid;grid-template-columns:repeat(3,1fr);gap:8px}
.kpis.two{grid-template-columns:repeat(2,1fr)}
.kpi{background:linear-gradient(160deg,rgba(56,189,248,.10),rgba(56,189,248,.02));border:1px solid var(--line);border-radius:8px;padding:8px 9px;min-height:58px}
.kpi .v{font-family:var(--mono);font-size:20px;font-weight:700;color:#fff;letter-spacing:-.5px;line-height:1.1;text-shadow:0 0 12px rgba(56,189,248,.45)}
.kpi .v small{font-size:11px;color:var(--cy2);margin-left:2px;font-family:var(--font);font-weight:500}
.kpi .l{font-size:10.5px;color:var(--muted);margin-top:3px;line-height:1.3}
.kpi.g .v{text-shadow:0 0 12px rgba(52,211,153,.5)}.kpi.a .v{text-shadow:0 0 12px rgba(251,191,36,.5)}.kpi.r .v{text-shadow:0 0 12px rgba(248,113,113,.5)}
.chart{width:100%;height:170px}
.chart.tall{height:210px}
.list{list-style:none}
.list li{display:flex;align-items:center;gap:8px;padding:5px 6px;border-radius:6px;cursor:pointer;border-bottom:1px dashed rgba(96,165,250,.12)}
.list li:hover{background:rgba(56,189,248,.08)}
.list li.on{background:rgba(56,189,248,.14)}
.list .n{flex:1;color:var(--txt)}
.list .m{color:var(--muted);font-size:11px}
.list .v{font-family:var(--mono);color:#fff;min-width:42px;text-align:right}
.pill{display:inline-block;min-width:44px;text-align:center;padding:1px 6px;border-radius:4px;font-size:11px;color:#0b1a2e;font-weight:700}
.warn-list li{display:block;cursor:default}
.warn-list .t{font-size:12px;color:var(--txt);line-height:1.4}
.warn-list .d{font-size:10.5px;color:var(--dim)}
.lv-red{background:#ef4444;color:#fff}.lv-orange{background:#f97316;color:#fff}.lv-yellow{background:#facc15}.lv-blue{background:#60a5fa;color:#fff}
.btns{display:flex;gap:6px;flex-wrap:wrap;margin:6px 0}
.btn{background:rgba(56,189,248,.08);border:1px solid var(--line2);color:var(--txt);font:inherit;font-size:12px;padding:5px 10px;border-radius:6px;cursor:pointer}
.btn:hover{background:rgba(56,189,248,.18)}.btn.on{background:rgba(56,189,248,.3);border-color:var(--cy);color:#fff}
.btn.sm{font-size:11px;padding:3px 8px}
.cap{display:grid;grid-template-columns:1fr 1fr;gap:8px}
.cap .c{background:rgba(14,32,56,.7);border:1px solid var(--line);border-radius:8px;padding:9px 10px;cursor:pointer;transition:.15s}
.cap .c:hover{border-color:var(--cy);background:rgba(56,189,248,.1)}
.cap .c b{display:block;color:#fff;font-size:13px;margin-bottom:3px}
.cap .c span{font-size:11px;color:var(--muted);line-height:1.45;display:block}
.note{font-size:11px;color:var(--dim);line-height:1.5;margin-top:6px}
.note b{color:var(--muted)}
table.tb{width:100%;border-collapse:collapse;font-size:11.5px}
table.tb th{color:var(--muted);font-weight:500;text-align:left;padding:4px 5px;border-bottom:1px solid var(--line2)}
table.tb td{padding:4px 5px;border-bottom:1px dashed rgba(96,165,250,.12);color:var(--txt)}
table.tb td.num{font-family:var(--mono);text-align:right}
.flow{display:flex;align-items:stretch;gap:0;margin:6px 0}
.flow .s{flex:1;background:rgba(56,189,248,.08);border:1px solid var(--line);padding:6px 4px;text-align:center;font-size:11px;color:var(--txt);position:relative}
.flow .s b{display:block;color:#fff;font-size:12px}
.flow .s+.s{margin-left:10px}.flow .s+.s:before{content:"›";position:absolute;left:-10px;top:50%;transform:translateY(-55%);color:var(--cy);font-size:16px}
.prog{height:6px;background:rgba(96,165,250,.15);border-radius:3px;overflow:hidden;margin:3px 0 6px}
.prog i{display:block;height:100%;background:linear-gradient(90deg,var(--cy),var(--green));border-radius:3px}
.src-foot{font-size:10px;color:var(--dim);margin-top:10px;line-height:1.5;border-top:1px dashed var(--line);padding-top:6px}
@media (max-width:1200px){#side{width:360px}#map{right:360px}}
