:root{
  --bg:#eef2f7;--card:#fff;--card2:#f7f9fc;--text:#14213d;--muted:#5b6b84;--line:#dfe5ee;
  --brand:#0b2545;--brand2:#13315c;--accent:#1d6fe0;--accent-soft:#e3eefc;
  --ok:#14915a;--warn:#d98a00;--bad:#d64045;--shadow:0 1px 2px rgba(16,24,40,.06),0 4px 14px rgba(16,24,40,.06);
  --radius:14px;
}
@media (prefers-color-scheme:dark){:root{
  --bg:#0b1220;--card:#121a2b;--card2:#162036;--text:#e7edf7;--muted:#93a1b8;--line:#24304a;
  --brand:#08182f;--brand2:#0f2444;--accent:#5aa2ff;--accent-soft:#16294a;
  --ok:#37c47f;--warn:#f0ad3c;--bad:#ff6b70;--shadow:0 1px 2px rgba(0,0,0,.3),0 6px 18px rgba(0,0,0,.25);
}}
*{box-sizing:border-box}
html,body{margin:0}
body{font:14px/1.5 Inter,system-ui,-apple-system,"Segoe UI",Roboto,sans-serif;background:var(--bg);color:var(--text);-webkit-font-smoothing:antialiased}
a{color:var(--accent);text-decoration:none}
.hidden{display:none!important}
h1{font-size:22px;margin:0 0 4px}
h2{font-size:16px;margin:0}
h3{font-size:14px;margin:0}
small,.muted{color:var(--muted)}

/* top bar */
.topbar{position:sticky;top:0;z-index:20;display:flex;align-items:center;gap:16px;padding:10px 20px;
  background:linear-gradient(90deg,var(--brand),var(--brand2));color:#fff;box-shadow:0 2px 10px rgba(0,0,0,.15)}
.brand{display:flex;align-items:center;gap:10px;color:#fff;flex:none}
.brand b{display:block;font-size:15px;letter-spacing:.3px}
.brand small{display:block;color:#9fc3ff;font-size:11px;margin-top:-3px;letter-spacing:.6px;text-transform:uppercase}
.logo{width:30px;height:30px;border-radius:8px;display:inline-block;flex:none;background:radial-gradient(circle at 30% 30%,#7fd0ff,#1d6fe0)}
.brand.big{justify-content:center;margin-bottom:18px;color:var(--text)}
.brand.big small{color:var(--muted)}
.brand.big .logo{width:40px;height:40px}
nav{display:flex;gap:4px;flex:1;overflow-x:auto;scrollbar-width:none}
nav::-webkit-scrollbar{display:none}
nav a{color:#c9d8ef;padding:7px 12px;border-radius:9px;white-space:nowrap;font-weight:500}
nav a:hover{background:rgba(255,255,255,.08);color:#fff}
nav a.active{background:rgba(255,255,255,.16);color:#fff}
nav .sep{width:1px;background:rgba(255,255,255,.18);margin:6px 6px}
.top-right{display:flex;align-items:center;gap:6px;flex:none}
.topbar .btn.ghost{color:#dbe7fb;border-color:transparent;background:rgba(255,255,255,.06)}
.topbar .btn.ghost:hover{background:rgba(255,255,255,.14)}
.avatar{width:26px;height:26px;border-radius:50%;background:#66c2ff;color:#0b2545;display:inline-grid;place-items:center;font-weight:700;font-size:12px}
.usermenu{position:relative}
.menu{position:absolute;right:0;top:calc(100% + 6px);background:var(--card);color:var(--text);border:1px solid var(--line);
  border-radius:12px;box-shadow:var(--shadow);min-width:210px;padding:6px;z-index:30}
.menu-head{padding:8px 10px;border-bottom:1px solid var(--line);margin-bottom:4px}
.menu-head small{display:block}
.menu button{display:block;width:100%;text-align:left;background:none;border:0;padding:8px 10px;border-radius:8px;font:inherit;color:inherit;cursor:pointer}
.menu button:hover{background:var(--card2)}
.spin svg{animation:spin 1s linear infinite}
@keyframes spin{to{transform:rotate(360deg)}}

main{max-width:1440px;margin:0 auto;padding:22px 20px 60px}
.pagehead{display:flex;flex-wrap:wrap;justify-content:space-between;align-items:end;gap:12px;margin-bottom:18px}
.alert{background:#fff4e5;color:#7a4b00;border-bottom:1px solid #f3d19c;padding:8px 20px;font-size:13px}
@media (prefers-color-scheme:dark){.alert{background:#3a2a0b;color:#ffd58a;border-color:#5a4316}}

/* controls */
.btn{display:inline-flex;align-items:center;gap:6px;font:inherit;font-weight:500;padding:7px 12px;border-radius:9px;
  border:1px solid var(--line);background:var(--card);color:var(--text);cursor:pointer;white-space:nowrap}
.btn:hover{border-color:var(--accent)}
.btn.primary{background:var(--accent);border-color:var(--accent);color:#fff}
.btn.danger{color:var(--bad)}
.btn.small{padding:4px 9px;font-size:12px}
.btn.wide{width:100%;justify-content:center;padding:10px}
.btn:disabled{opacity:.5;cursor:default}
input,select,textarea{font:inherit;color:var(--text);background:var(--card);border:1px solid var(--line);border-radius:9px;padding:7px 10px;min-width:0}
input:focus,select:focus{outline:2px solid var(--accent-soft);border-color:var(--accent)}
input[type=checkbox]{width:17px;height:17px;accent-color:var(--accent)}
label{display:flex;flex-direction:column;gap:4px;font-size:12px;color:var(--muted);font-weight:500}
.controls{display:flex;flex-wrap:wrap;gap:10px;align-items:end}
.seg{display:inline-flex;background:var(--card);border:1px solid var(--line);border-radius:10px;padding:3px;gap:2px;flex-wrap:wrap}
.seg button{border:0;background:none;font:inherit;padding:5px 10px;border-radius:7px;color:var(--muted);cursor:pointer}
.seg button.on{background:var(--accent);color:#fff}
.search{min-width:220px}

/* cards */
.card{background:var(--card);border:1px solid var(--line);border-radius:var(--radius);box-shadow:var(--shadow);padding:16px 18px}
.card+.card{margin-top:16px}
.kpis{display:grid;grid-template-columns:repeat(auto-fit,minmax(190px,1fr));gap:14px;margin-bottom:18px}
.kpi{padding:14px 16px}
.kpi .v{font-size:24px;font-weight:700;margin-top:2px}
.kpi .s{font-size:12px;color:var(--muted)}
.grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(340px,1fr));gap:16px}
.vcard{cursor:pointer;transition:transform .12s,box-shadow .12s;display:flex;flex-direction:column;gap:12px}
.vcard:hover{transform:translateY(-2px);box-shadow:0 8px 26px rgba(16,24,40,.12)}
.vtop{display:flex;justify-content:space-between;align-items:start;gap:8px}
.vtop h2{font-size:17px}
.status{display:inline-flex;align-items:center;gap:6px;font-size:12px;color:var(--muted);white-space:nowrap}
.dot{width:9px;height:9px;border-radius:50%;display:inline-block;flex:none;background:var(--muted)}
.dot.on{background:var(--ok);box-shadow:0 0 0 3px color-mix(in srgb,var(--ok) 20%,transparent)}
.dot.off{background:var(--bad)}
.src{display:flex;flex-direction:column;gap:5px}
.src-head{display:flex;justify-content:space-between;gap:8px;font-size:13px}
.src-head b{display:flex;align-items:center;gap:7px}
.src-meta{display:flex;justify-content:space-between;flex-wrap:wrap;gap:4px 10px;font-size:12px;color:var(--muted)}
.bar{height:9px;background:var(--card2);border:1px solid var(--line);border-radius:6px;overflow:hidden;position:relative}
.bar i{display:block;height:100%;border-radius:6px;background:var(--ok)}
.bar i.warn{background:var(--warn)}.bar i.bad{background:var(--bad)}
.bar .proj{position:absolute;top:0;bottom:0;width:2px;background:var(--text);opacity:.35}
.pill{display:inline-block;font-size:11px;padding:1px 8px;border-radius:20px;background:var(--card2);border:1px solid var(--line);color:var(--muted);white-space:nowrap}
.pill.ok{color:var(--ok);border-color:currentColor}.pill.bad{color:var(--bad);border-color:currentColor}.pill.warn{color:var(--warn);border-color:currentColor}
.pill.blue{color:var(--accent);border-color:currentColor}
.empty{color:var(--muted);text-align:center;padding:40px 10px}
.chartwrap{position:relative;height:300px}
.srcgrid{display:grid;grid-template-columns:repeat(auto-fill,minmax(280px,1fr));gap:14px;margin-bottom:16px}
.big-num{font-size:26px;font-weight:700}
.kv{display:grid;grid-template-columns:auto 1fr;gap:3px 12px;font-size:12px;margin-top:8px}
.kv span:nth-child(odd){color:var(--muted)}

/* tables */
.scroll{overflow-x:auto;-webkit-overflow-scrolling:touch}
.tbl{width:100%;border-collapse:collapse;font-size:13px}
.tbl th,.tbl td{padding:9px 10px;border-bottom:1px solid var(--line);text-align:left;vertical-align:middle}
.tbl th{font-size:11px;text-transform:uppercase;letter-spacing:.4px;color:var(--muted);font-weight:600;white-space:nowrap}
.tbl td.num,.tbl th.num{text-align:right;white-space:nowrap;font-variant-numeric:tabular-nums}
.tbl tr.total td{font-weight:700;border-top:2px solid var(--line)}
.tbl tbody tr:hover{background:var(--card2)}
.tbl input:not([type=checkbox]){width:100%}
.tbl .inp-s{width:70px!important}
.tbl .inp-m{width:110px!important}

/* login */
.login{min-height:100vh;display:grid;place-items:center;padding:20px;background:radial-gradient(1200px 600px at 20% -10%,#1d6fe0 0,transparent 60%),linear-gradient(160deg,#0b2545,#13315c 60%,#0b1220)}
.login-card{width:100%;max-width:370px;background:var(--card);border-radius:18px;padding:28px;box-shadow:0 20px 60px rgba(0,0,0,.35);display:flex;flex-direction:column;gap:14px}
.login-card input{padding:10px 12px}
.err{color:var(--bad);font-size:13px;min-height:18px}

/* dialog */
dialog{border:0;border-radius:16px;padding:0;background:var(--card);color:var(--text);box-shadow:0 30px 80px rgba(0,0,0,.35);width:min(620px,calc(100vw - 24px));max-height:calc(100vh - 40px)}
dialog::backdrop{background:rgba(5,12,25,.55)}
dialog form{display:flex;flex-direction:column;max-height:calc(100vh - 40px)}
.dlg-head{padding:16px 20px;border-bottom:1px solid var(--line);display:flex;justify-content:space-between;align-items:center}
.dlg-body{padding:16px 20px;overflow:auto;display:flex;flex-direction:column;gap:12px}
.dlg-foot{padding:12px 20px;border-top:1px solid var(--line);display:flex;justify-content:flex-end;gap:8px;flex-wrap:wrap}
.row2{display:grid;grid-template-columns:1fr 1fr;gap:12px}
.checklist{border:1px solid var(--line);border-radius:10px;max-height:260px;overflow:auto;padding:6px}
.checklist label{flex-direction:row;align-items:center;gap:8px;color:var(--text);font-weight:400;font-size:13px;padding:5px 6px;border-radius:7px}
.checklist label:hover{background:var(--card2)}
.hint{font-size:12px;color:var(--muted);background:var(--card2);border-radius:9px;padding:8px 10px}

.toast{position:fixed;bottom:20px;left:50%;transform:translateX(-50%);background:#14213d;color:#fff;padding:10px 16px;border-radius:10px;box-shadow:var(--shadow);z-index:50;font-size:13px;max-width:90vw}
.toast.bad{background:var(--bad)}

@media (max-width:900px){
  .topbar{flex-wrap:wrap;padding:8px 12px;gap:8px}
  nav{order:3;flex-basis:100%}
  .hide-sm{display:none}
  main{padding:16px 12px 50px}
  .grid{grid-template-columns:1fr}
}
@media (max-width:560px){
  .row2{grid-template-columns:1fr}
  .kpis{grid-template-columns:1fr 1fr}
  .kpi .v{font-size:19px}
  .chartwrap{height:240px}
  .search{min-width:0;width:100%}
  .controls>*{flex:1 1 auto}
  .brand small{display:none}
}
.planf{display:flex;gap:6px;align-items:center;flex-wrap:nowrap;white-space:nowrap}
dialog .planf{flex-wrap:wrap}

/* source filter chips */
.srcbar{display:flex;flex-wrap:wrap;gap:6px;align-items:center;margin:-4px 0 16px}
.srcbar>.muted{font-size:12px;font-weight:600;margin-right:4px}
.chip{display:inline-flex;align-items:center;gap:6px;font:inherit;font-size:13px;padding:5px 11px;border-radius:20px;border:1px solid var(--line);background:var(--card);color:var(--text);cursor:pointer;transition:all .12s}
.chip:hover{border-color:var(--c,var(--accent))}
.chip.on{background:var(--c,var(--accent));border-color:var(--c,var(--accent));color:#fff}
.chip.on .dot{background:#fff!important}

/* date range slider */
.rangebox{display:flex;flex-direction:column;gap:12px;margin-bottom:14px}
.slider{position:relative;height:46px;padding:0 9px}
.slider .track{position:absolute;left:9px;right:9px;top:13px;height:6px;border-radius:4px;background:var(--card2);border:1px solid var(--line)}
.slider .sel{position:absolute;top:-1px;bottom:-1px;background:var(--accent);border-radius:4px}
.slider input[type=range]{position:absolute;left:0;right:0;top:4px;width:100%;margin:0;background:none;border:0;padding:0;pointer-events:none;-webkit-appearance:none;appearance:none;height:24px}
.slider input[type=range]:focus{outline:none}
.slider input[type=range]::-webkit-slider-thumb{-webkit-appearance:none;pointer-events:auto;width:20px;height:20px;border-radius:50%;background:#fff;border:3px solid var(--accent);box-shadow:0 1px 4px rgba(0,0,0,.25);cursor:grab}
.slider input[type=range]::-moz-range-thumb{pointer-events:auto;width:16px;height:16px;border-radius:50%;background:#fff;border:3px solid var(--accent);cursor:grab}
.slider input[type=range]::-webkit-slider-runnable-track{background:none}
.slider input[type=range]::-moz-range-track{background:none}
.slabels{position:absolute;left:0;right:0;top:30px;display:flex;justify-content:space-between;font-size:12px;font-weight:600}

/* source matrix */
.matrix td,.matrix th{text-align:center}
.matrix td:first-child,.matrix th:first-child{text-align:left}
.mcell.edit{cursor:pointer}
.mcell.edit:hover{background:var(--accent-soft)}
.mcell.off{opacity:.45;text-decoration:line-through}
.legend{display:flex;flex-wrap:wrap;gap:6px 16px;font-size:12px;margin-top:8px}
