/* cybdash v2 — plain CSS, no framework. Drop into /static/css/dash.css */
:root{
--bg:#08090b;--bg-1:#0b0d10;--bg-2:#0f1216;--bg-3:#14181d;--bg-4:#1a1f25;
--line:#191d23;--line-2:#232931;
--fg:#e8eef4;--fg-2:#9aa4ae;--fg-3:#646d77;--fg-4:#3f474f;
--crit:#ff4d4d;--kev:#ff2d88;--zero:#b388ff;--poc:#3ee37a;--lab:#5ac8fa;
--malw:#f1d23a;--apt:#ff9f40;--news:#8fa6c4;--chain:#7fd6c0;--trend:#aab3bc;
--ok:#3ee37a;--warn:#ff9f40;--err:#ff4d4d;
--mono:"JetBrains Mono","IBM Plex Mono",ui-monospace,SFMono-Regular,Menlo,monospace;
--row:22px;--hd:44px;--t0:128px;--t2:104px;--st:24px;--rail:22px;
}
*{box-sizing:border-box}
html,body{margin:0;height:100%;overflow:hidden;background:var(--bg);color:var(--fg);font-family:var(--mono);font-size:11.5px;line-height:1.45;-webkit-font-smoothing:antialiased;font-variant-ligatures:none}
a{color:inherit;text-decoration:none}
a:hover{color:var(--fg)}
button{font:inherit;color:inherit;background:none;border:0;padding:0;cursor:pointer}

/* ── shell ─────────────────────────────────────────────── */
.dash{height:100%;display:flex;flex-direction:column;min-width:0}

/* ── header: identity + collected-but-unshown counters ── */
.hd{height:var(--hd);flex:0 0 auto;display:flex;align-items:center;justify-content:space-between;gap:24px;padding:0 12px;background:var(--bg-1);border-bottom:1px solid var(--line-2)}
.hd-l{display:flex;align-items:center;gap:20px;min-width:0}
.logo{font-size:19px;font-weight:600;letter-spacing:-.01em;line-height:1;white-space:nowrap}
.logo b{color:var(--lab);font-weight:600}
.logo i{color:var(--fg);font-style:normal}
.hd-meta{font-size:10px;color:var(--fg-3);letter-spacing:.06em;line-height:1.35;white-space:nowrap}
.hd-meta .live{display:inline-flex;align-items:center;gap:5px;color:var(--poc)}
.dot{width:5px;height:5px;border-radius:50%;background:currentColor;flex:0 0 auto}
.dot.pulse{animation:dotpulse 2.4s ease-in-out infinite}
@keyframes dotpulse{0%,100%{opacity:1}50%{opacity:.35}}

/* counters — IOC / Threats / infocon get header space, not a zone */
.ctr{display:flex;align-items:stretch;gap:0;flex:0 0 auto}
.ctr-i{display:flex;flex-direction:column;justify-content:center;gap:1px;padding:0 14px;border-left:1px solid var(--line)}
.ctr-i:last-child{padding-right:2px}
.ctr-k{font-size:9px;letter-spacing:.14em;color:var(--fg-4);text-transform:uppercase;white-space:nowrap}
.ctr-v{font-size:14px;line-height:1;color:var(--fg);font-weight:500;white-space:nowrap}
.ctr-v small{font-size:9px;color:var(--fg-3);letter-spacing:.06em;margin-left:3px}
.ctr-v.green{color:var(--poc)}.ctr-v.amber{color:var(--apt)}.ctr-v.red{color:var(--crit)}

/* ── tier 0: decide-now band ────────────────────────────── */
.t0{height:var(--t0);flex:0 0 auto;display:flex;border-bottom:1px solid var(--line-2);min-height:0}
.t0>.zone{flex:1 1 0;min-width:0}
.t0>.zone+.zone{border-left:1px solid var(--line)}
.t0 .z-patch{flex:1.15 1 0}

/* ── tier 1: the reading floor ─────────────────────────── */
.t1{flex:1 1 auto;display:flex;min-height:0}
.t1>.col{flex:1 1 0;display:flex;flex-direction:column;min-width:0;min-height:0}
.t1>.col+.col,.t1>.zone+.zone{border-left:1px solid var(--line)}
.t1 .col-patch{flex:1.7 1 0}
.t1 .col-adv{flex:1.1 1 0}
.col>.zone{flex:1 1 0;min-height:0}
.col>.zone+.zone{border-top:1px solid var(--line)}

/* ── tier 2: background band ───────────────────────────── */
.t2{height:var(--t2);flex:0 0 auto;display:flex;min-height:0}
.t2>.zone{flex:1 1 0;min-width:0}
.t2>.zone+.zone{border-left:1px solid var(--line)}
.t2 .z-pulse{flex:1.5 1 0}

/* ── status ────────────────────────────────────────────── */
.st{height:var(--st);flex:0 0 auto;display:flex;align-items:center;justify-content:space-between;gap:16px;padding:0 12px;background:var(--bg-1);border-top:1px solid var(--line-2);font-size:10px;color:var(--fg-3);letter-spacing:.06em;white-space:nowrap;overflow:hidden}
.st b{color:var(--fg-2);font-weight:400}
.st .sep{color:var(--fg-4);margin:0 8px}
.st-recon{color:var(--err)}
.st-keys span{color:var(--fg-2)}

/* ── zone ──────────────────────────────────────────────── */
.zone{display:flex;flex-direction:column;min-height:0;background:var(--bg);overflow:hidden}
.z-rail{height:var(--rail);flex:0 0 auto;display:flex;align-items:center;gap:8px;padding:0 8px 0 0;background:var(--bg-2);border-bottom:1px solid var(--line);font-size:10px;letter-spacing:.12em;white-space:nowrap}
.z-name{display:flex;align-items:center;gap:6px;min-width:0}
.z-name::before{content:"▍";font-size:12px;color:var(--zc,var(--fg-3));margin-left:-1px}
.z-name span{color:var(--fg);text-transform:uppercase}
.z-n{color:var(--fg-3);letter-spacing:.06em}
.z-n em{font-style:normal;color:var(--zc,var(--fg-2))}
.z-new{color:var(--zc);letter-spacing:.06em;animation:fadeout 8s 1s forwards}
@keyframes fadeout{to{opacity:0}}
.z-sp{flex:1 1 auto;min-width:8px}
.z-note{color:var(--fg-4);letter-spacing:.06em}
.z-src{display:inline-flex;align-items:center;gap:4px;color:var(--fg-4)}
.z-src .dot{background:var(--ok)}
.zone.is-error .z-src .dot{background:var(--err)}
.zone.is-error .z-src{color:var(--err)}
.z-body{flex:1 1 auto;min-height:0;overflow-y:auto;overflow-x:hidden;position:relative;scrollbar-width:thin}

/* zone accent colors */
.z-patch{--zc:var(--crit)}.z-brief{--zc:var(--lab)}.z-news{--zc:var(--news)}
.z-exp{--zc:var(--poc)}.z-labs{--zc:var(--lab)}.z-apt{--zc:var(--apt)}
.z-ran{--zc:var(--malw)}.z-pulse{--zc:var(--trend)}.z-trends{--zc:var(--trend)}
.z-chains{--zc:var(--chain)}

/* ── filter chips — live in the rail, cost zero height ── */
.chips{display:flex;gap:4px}
.chip{font-size:9px;letter-spacing:.1em;padding:1px 6px;border:1px solid var(--line-2);color:var(--fg-3);line-height:1.5;text-transform:uppercase}
.chip:hover{border-color:var(--fg-4);color:var(--fg-2)}
.chip[aria-pressed=true]{background:var(--zc);border-color:var(--zc);color:#07090b;font-weight:500}

/* ── rows ──────────────────────────────────────────────── */
.rows{display:flex;flex-direction:column}
.row{display:grid;align-items:center;gap:8px;height:var(--row);padding:0 8px;border-bottom:1px solid rgba(255,255,255,.028);position:relative;cursor:pointer;overflow:hidden}
.row::before{content:"";position:absolute;left:0;top:0;bottom:0;width:2px;background:var(--zc);opacity:0;transition:opacity .1s}
.row:hover{background:var(--bg-3)}
.row:hover::before{opacity:1}
.row:focus-visible{outline:1px dotted var(--fg-2);outline-offset:-1px;background:var(--bg-3)}
.row:hover .go{opacity:1}
.go{opacity:0;color:var(--fg-3);font-size:10px;transition:opacity .1s}
.row.is-new::before{opacity:1;animation:newfade 5s 1.5s forwards}
@keyframes newfade{to{opacity:0}}
.t{color:var(--fg-4);font-variant-numeric:tabular-nums;white-space:nowrap}
.ttl{color:var(--fg-2);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;min-width:0}
.row:hover .ttl{color:var(--fg)}
.src{color:var(--fg-4);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;text-align:right}
.tags{color:var(--fg-4);white-space:nowrap;overflow:hidden;font-size:10px}
.g{font-size:10px;color:var(--zc);white-space:nowrap}

/* badges */
.b{font-size:9px;letter-spacing:.08em;padding:0 4px;border:1px solid currentColor;line-height:1.55;white-space:nowrap}
.b-kev{color:var(--kev)}.b-poc{color:var(--poc)}.b-zero{color:var(--zero)}
.b-crit{color:var(--crit)}.b-itw{color:var(--kev)}
.bs{display:flex;gap:3px}

/* ── PATCH NOW rows ────────────────────────────────────── */
.z-patch .row{grid-template-columns:118px 42px 46px auto 1fr 30px 10px}
.rk{color:var(--fg-4);text-align:right;font-variant-numeric:tabular-nums}
.cve{color:var(--fg);font-weight:500;letter-spacing:.01em}
.epss{color:var(--crit);text-align:right;font-variant-numeric:tabular-nums;font-weight:500}
.ebar{height:3px;background:var(--bg-4);position:relative;overflow:hidden}
.ebar i{position:absolute;left:0;top:0;bottom:0;background:var(--crit);display:block}
.prod{color:var(--fg-3);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.due{color:var(--fg-4);text-align:right;font-size:10px;overflow:hidden;white-space:nowrap}
.due.due-soon{color:var(--warn)}
.due.due-over{color:var(--err);font-weight:600}
.z-patch .row:first-child .cve{color:var(--crit)}

/* ── DAY BRIEF ─────────────────────────────────────────── */
.z-brief .row{grid-template-columns:10px 1fr 10px;height:20px}
.z-brief .bul{color:var(--lab)}
.z-brief .ttl{color:var(--fg-2)}

/* ── NEWS ──────────────────────────────────────────────── */
.z-news .row{grid-template-columns:38px 14px 1fr 96px 10px}
.z-news .g{color:var(--news)}
.z-news .row[data-kind=adv] .g{color:var(--crit)}
.z-news .row[data-kind=res] .g{color:var(--lab)}
.z-news .row[data-kind=soc] .g{color:var(--zero)}

/* ── EXPLOITS / LABS ───────────────────────────────────── */
.z-exp .row,.z-labs .row,.z-adv .row{grid-template-columns:38px 1fr auto 10px}
.z-exp .stars{color:var(--fg-4);font-size:10px;white-space:nowrap}

/* ── APT / RANSOM ──────────────────────────────────────── */
.z-apt .row{grid-template-columns:74px 22px 1fr 54px 10px}
.grp{color:var(--apt);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.cmp{color:var(--fg-2);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;min-width:0}
.cc{color:var(--fg-4);font-size:10px}
.per{color:var(--fg-4);text-align:right;font-size:10px;white-space:nowrap}
.z-ran .row{grid-template-columns:14px 1fr 78px 44px 10px}
.z-ran .vic{color:var(--fg-2);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.z-ran .gang{color:var(--malw);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:10px}
.sub{height:18px;display:flex;align-items:center;gap:6px;padding:0 8px;background:var(--bg-1);border-top:1px solid var(--line);border-bottom:1px solid var(--line);font-size:9px;letter-spacing:.12em;color:var(--fg-4);text-transform:uppercase}
.sub b{color:var(--malw);font-weight:400}

/* ── PULSE ─────────────────────────────────────────────── */
.pulse-wrap{display:flex;gap:14px;padding:8px 10px;height:100%;align-items:stretch}
.bars{flex:1 1 auto;display:flex;align-items:flex-end;gap:2px;min-width:0}
.bars i{flex:1 1 0;background:var(--poc);min-height:2px;display:block}
.bars i.m{background:var(--apt)}.bars i.h{background:var(--crit)}
.bars-x{display:flex;justify-content:space-between;font-size:9px;color:var(--fg-4);letter-spacing:.06em;margin-top:4px}
.pulse-col{display:flex;flex-direction:column;min-width:0;flex:1 1 auto}
.watch{flex:0 0 auto;width:150px;display:flex;flex-direction:column;gap:1px;border-left:1px solid var(--line);padding-left:12px}
.watch-r{display:flex;justify-content:space-between;gap:6px;font-size:10px}
.watch-r span:first-child{color:var(--fg-3);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.watch-r b{font-weight:400;color:var(--fg-2);font-variant-numeric:tabular-nums}
.watch-r.hot b{color:var(--crit)}

/* ── TRENDS ────────────────────────────────────────────── */
.tri{display:grid;grid-template-columns:repeat(3,1fr);gap:0;height:100%}
.tri>div{padding:6px 10px;min-width:0}
.tri>div+div{border-left:1px solid var(--line)}
.tri h4{margin:0 0 4px;font-size:9px;letter-spacing:.14em;color:var(--fg-4);font-weight:400;text-transform:uppercase}
.tri ol{margin:0;padding:0;list-style:none;display:flex;flex-direction:column;gap:1px}
.tri li{display:flex;gap:6px;font-size:10px;color:var(--fg-2);overflow:hidden;white-space:nowrap}
.tri li em{font-style:normal;color:var(--fg-4);font-variant-numeric:tabular-nums;flex:0 0 auto}
.tri li span{overflow:hidden;text-overflow:ellipsis}

/* ── CHAINS ────────────────────────────────────────────── */
.chains{padding:6px 10px;display:flex;flex-direction:column;gap:2px;height:100%;overflow:hidden}
.chain{display:flex;align-items:center;gap:5px;font-size:10px;color:var(--fg-3);white-space:nowrap;overflow:hidden}
.chain b{color:var(--chain);font-weight:400;flex:0 0 auto}
.chain i{color:var(--fg-4);font-style:normal;flex:0 0 auto}
.chain u{text-decoration:none;color:var(--fg-2);overflow:hidden;text-overflow:ellipsis}

/* ── empty / error states ──────────────────────────────── */
.zone.is-empty{flex:0 0 auto}
.zone.is-empty .z-body,.zone.is-error .z-body{display:flex;align-items:center;justify-content:center;min-height:44px;padding:8px}
.msg{text-align:center;font-size:10px;letter-spacing:.08em;color:var(--fg-4);line-height:1.7}
.msg b{display:block;color:var(--fg-3);font-weight:400}
.msg.err b{color:var(--err)}
.msg .rule{color:var(--line-2)}

/* ── tooltip ───────────────────────────────────────────── */
.tip{position:fixed;z-index:60;max-width:440px;background:var(--bg-3);border:1px solid var(--line-2);padding:9px 11px;font-size:11px;line-height:1.5;color:var(--fg-2);pointer-events:none;opacity:0;transition:opacity .1s;box-shadow:0 8px 24px rgba(0,0,0,.55)}
.tip.on{opacity:1}
.tip h5{margin:0 0 5px;font-size:11.5px;font-weight:500;color:var(--fg);line-height:1.4;text-wrap:pretty}
.tip .ai{color:var(--fg-2);text-wrap:pretty}
.tip .ai::before{content:"∷ llm  ";color:var(--fg-4);letter-spacing:.1em;font-size:9px}
.tip .ft{margin-top:6px;padding-top:5px;border-top:1px dashed var(--line-2);font-size:9.5px;color:var(--fg-4);letter-spacing:.06em;display:flex;gap:8px;justify-content:space-between}

/* ── 1920 : exploits + labs unstack into own columns ───── */
@media (min-width:1700px){
  :root{--row:22px}
  .t1 .col-el{display:contents}
  .t1 .col-el>.zone{flex:1 1 0;min-width:0;border-left:1px solid var(--line);border-top:0}
  .t1 .col-patch{flex:1.7 1 0}
}

/* ── narrow desktop / tablet ────────────────────────────── */
@media (max-width:1099px){
  .t1{flex-wrap:wrap}
  .t1>.col{flex:1 1 50%;min-height:50%}
  .ctr-i:nth-child(n+4){display:none}
  .t2 .z-chains{display:none}
}
@media (max-width:719px){
  html,body{overflow:auto;overflow-x:hidden;font-size:12px}
  :root{--row:40px;--t0:auto;--t2:auto}
  .dash{height:auto;min-height:100%}
  .t0,.t1,.t2{display:block;height:auto}
  .t1>.col{display:block}
  .col>.zone{flex:none;height:auto;min-height:0}
  .zone{overflow:visible}
  .t0>.zone+.zone,.t1>.col+.col,.t2>.zone+.zone{border-left:0;border-top:1px solid var(--line)}
  .t1>.col{min-height:0}
  .col>.zone+.zone{border-top:1px solid var(--line)}
  .z-body{overflow:visible}
  /* header: counters scroll sideways instead of hiding */
  .hd{height:auto;flex-wrap:wrap;gap:10px;padding:10px 12px}
  .ctr{width:100%;overflow-x:auto;scrollbar-width:none}
  .ctr::-webkit-scrollbar{display:none}
  .ctr-i{flex:0 0 auto;padding:2px 12px;min-width:96px}
  .ctr-i:first-child{border-left:0;padding-left:0}
  .ctr-i:nth-child(n+4){display:flex}
  .logo{font-size:17px}
  /* rows: 40px touch targets, extra columns dropped */
  .row{height:auto!important;min-height:var(--row);padding:8px}
  .go{opacity:1;color:var(--fg-4)}
  .z-patch .row{grid-template-columns:1fr 46px auto 44px 10px}
  .z-patch .ebar,.z-patch .prod{display:none}
  .z-news .row{grid-template-columns:38px 14px 1fr 10px}
  .z-news .src{display:none}
  .z-exp .row,.z-labs .row,.z-adv .row{grid-template-columns:38px 1fr 10px}
  .z-exp .stars,.z-labs .stars{display:none}
  .z-apt .row{grid-template-columns:76px 1fr 10px}
  .z-apt .cc,.z-apt .per{display:none}
  .z-ran .row{grid-template-columns:14px 1fr 76px 10px}
  .z-ran .per{display:none}
  .z-rail{height:26px;font-size:10.5px}
  .chips{gap:5px}.chip{padding:3px 8px}
  .pulse-wrap{padding:10px}
  .watch{display:none}
  .tri{grid-template-columns:1fr}
  .tri>div+div{border-left:0;border-top:1px solid var(--line)}
  .st{height:auto;flex-wrap:wrap;padding:8px 12px;gap:6px}
  .st-keys{display:none}
  .tip{max-width:calc(100vw - 24px)}
}
@media (prefers-reduced-motion:reduce){*{animation:none!important;transition:none!important}}
