/* Layout: one laptop screen = header + KPI cards + castle (the wall is the bar-chart race). Details and the WAF comparison scroll below. Committed dark scene. */
:root{
  --bg:#0b0f14;--panel:#121923;--line:#1f2a38;--text:#d5dde8;--dim:#7d8b9e;
  --green:#3ddc84;--red:#ff4d5e;--amber:#e0b341;--accent:#4cc9f0;--gold:#e8bd6a;--ai:#b18cff;
  --display:'Cinzel',Georgia,serif;
  color-scheme:dark;
}
*{box-sizing:border-box}
[hidden]{display:none!important}
html{scroll-behavior:smooth}
body{margin:0;background:var(--bg);color:var(--text);font:14px/1.4 system-ui,-apple-system,"Segoe UI",sans-serif}
.stage{height:100vh;height:100svh;min-height:560px;display:flex;flex-direction:column}
header{position:sticky;top:env(safe-area-inset-top,0px);z-index:5;background:var(--bg);display:flex;flex-wrap:wrap;gap:8px 20px;align-items:center;padding:8px 16px;border-bottom:1px solid var(--line)}
h1{margin:0;font-family:var(--display);font-size:20px;letter-spacing:.04em;color:var(--gold)}
h1 span{font-family:system-ui,-apple-system,"Segoe UI",sans-serif;color:var(--dim);font-weight:400;font-size:13px;letter-spacing:.02em;margin-left:8px}
.controls{display:flex;gap:8px;align-items:center;color:var(--dim)}
.controls label{display:flex;gap:6px;align-items:center}
button,select{background:var(--panel);color:var(--text);border:1px solid var(--line);border-radius:4px;padding:5px 12px;font:inherit;cursor:pointer}
button:hover{border-color:var(--accent)}
button:focus-visible,select:focus-visible,a:focus-visible{outline:2px solid var(--gold);outline-offset:2px}
.wave-pill{font-size:12px;padding:3px 10px;border-radius:999px;border:1px solid rgba(232,189,106,.35);color:var(--gold);white-space:nowrap}
.counter{margin-left:auto;font-family:ui-monospace,Menlo,Consolas,monospace;color:var(--accent);font-variant-numeric:tabular-nums}
.progress{height:3px;background:var(--line);flex:none}#bar{height:100%;width:0;background:var(--accent)}

/* KPI cards */
.kpirow{flex:none;display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:10px;padding:10px 16px}
.kcard{background:var(--panel);border:1px solid var(--line);border-radius:10px;padding:8px 14px;min-width:0}
.kl{font-size:11px;text-transform:uppercase;letter-spacing:.1em;color:var(--dim)}
.kv{font-size:30px;font-weight:700;line-height:1.15;font-variant-numeric:tabular-nums}
.kv .of{font-size:15px;font-weight:400;color:var(--dim)}
.ks{font-size:12px;color:var(--dim);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}

/* siege */
#siege{position:relative;flex:1;min-height:360px;overflow:hidden;border-top:1px solid var(--line);background:#0a1026}
#castle{position:absolute;inset:0;width:100%;height:100%;display:block}
.chips{position:absolute;top:12px;left:16px;display:flex;gap:8px;flex-wrap:wrap}
.chip{display:flex;flex-direction:column;align-items:center;min-width:64px;padding:5px 10px;border-radius:8px;background:rgba(6,9,20,.6);border:1px solid rgba(232,189,106,.25);font-variant-numeric:tabular-nums}
.chip b{font-family:var(--display);font-size:18px;line-height:1;color:var(--text)}
.chip span{font-size:9.5px;letter-spacing:.12em;text-transform:uppercase;color:var(--dim);margin-top:3px}
.chip.good b{color:var(--green)}.chip.bad b{color:var(--red)}
.legend{position:absolute;left:16px;bottom:12px;font-size:11px;line-height:1.7;background:rgba(6,9,20,.7);border:1px solid rgba(232,189,106,.25);border-radius:6px;padding:5px 10px;max-width:55%}
.dot{display:inline-block;width:9px;height:9px;border-radius:2px;margin-right:6px;vertical-align:middle}
.dot.good{background:var(--green)}.dot.bad{background:var(--red)}
.legend .lg-dim{opacity:.6}
.jump{position:absolute;right:16px;bottom:12px;font-size:12px;color:var(--gold);text-decoration:none;background:rgba(6,9,20,.7);border:1px solid rgba(232,189,106,.25);border-radius:6px;padding:5px 10px}
.jump:hover{border-color:var(--gold)}

/* the wall: bar-chart race lanes */
#lanes{position:absolute;pointer-events:none}
.lane{position:absolute;left:0;right:0;top:0;height:var(--lane-h,24px);display:grid;grid-template-columns:30px 176px 1fr 34px 14px;align-items:center;gap:6px;padding:0 6px;
  font-size:clamp(10px,calc(var(--lane-h,24px) * .46),13px);border-radius:4px;transition:transform .45s cubic-bezier(.3,.7,.3,1)}
.lane::before{content:"";position:absolute;inset:2px 0;border-radius:4px;background:rgba(8,11,24,.55)}
.lane>*{position:relative}
.lane .rk{color:var(--gold);font-weight:700;font-variant-numeric:tabular-nums;text-align:right}
.lane .nm{color:#e6ebf3;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.lane .nm em{font-style:normal;font-size:.72em;font-weight:700;letter-spacing:.06em;color:#1a1030;background:var(--ai);border-radius:3px;padding:0 4px;margin-left:4px;vertical-align:1px}
.lane .track{height:calc(var(--lane-h,24px) * .5);background:rgba(255,255,255,.05);border-radius:3px;overflow:hidden}
.lane .fill{display:block;height:100%;width:0;border-radius:3px;transition:width .35s ease-out}
.lane .ct{font-weight:700;font-variant-numeric:tabular-nums;text-align:right}
.lane .mv{font-size:.8em}
.lane.rising .mv::after{content:"\25B2";color:var(--green)}
.lane.falling .mv::after{content:"\25BC";color:var(--red)}
.lane.zero .nm,.lane.zero .ct{opacity:.45}
.lane.hit::before{animation:hit .6s ease-out}
.lane.hit-fa::before{animation:hitfa .9s ease-out}
@keyframes hit{0%{background:rgba(255,77,94,.55)}100%{background:rgba(8,11,24,.55)}}
@keyframes hitfa{0%{background:rgba(224,179,65,.6)}100%{background:rgba(8,11,24,.55)}}

/* wave banner */
#wave-banner{position:absolute;left:29%;top:38%;transform:translate(-50%,-50%);text-align:center;background:rgba(10,8,26,.88);border:1px solid var(--ai);border-radius:12px;padding:16px 28px;box-shadow:0 0 40px rgba(177,140,255,.25);animation:wb .5s ease-out}
.wb-k{font-size:12px;letter-spacing:.2em;text-transform:uppercase;color:var(--ai)}
.wb-t{font-family:var(--display);font-size:24px;color:var(--gold);margin:4px 0}
.wb-s{font-size:12.5px;color:var(--dim)}
@keyframes wb{from{opacity:0;transform:translate(-50%,-40%)}to{opacity:1;transform:translate(-50%,-50%)}}

#done{position:absolute;inset:0;display:flex;align-items:center;justify-content:center;background:rgba(6,9,20,.72);padding:16px}
#done .card{max-width:460px;text-align:center;background:var(--panel);border:1px solid rgba(232,189,106,.3);border-radius:12px;padding:22px 24px}
#done h2{font-family:var(--display);color:var(--gold);font-size:22px;margin:0 0 8px;text-transform:none;letter-spacing:.02em}
#done p{margin:6px 0;font-size:14px}
#done a{color:var(--accent)}
#done .num{font-weight:600;color:var(--green)}#done .num.r{color:var(--red)}#done .num.a{color:var(--amber)}

/* analytics */
main{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:12px;padding:12px 16px 24px;scroll-margin-top:60px}
#p-acc{grid-column:1/-1}
.panel{background:var(--panel);border:1px solid var(--line);border-radius:6px;padding:12px;min-width:0}
h2{margin:0 0 8px;font-size:12px;text-transform:uppercase;letter-spacing:1px;color:var(--dim)}
h2 small{text-transform:none;letter-spacing:0;margin-left:6px;opacity:.7}
.scroll{height:340px;overflow:hidden;font-family:ui-monospace,Menlo,Consolas,monospace;font-size:12px}
.tile{display:flex;gap:8px;padding:2px 6px;border-left:3px solid;margin-bottom:2px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;background:#0e141c}
.tile.allow{border-color:var(--green)}.tile.block{border-color:var(--red);background:#2a1218}.tile.error{border-color:var(--amber)}
.tile .m{width:52px;color:var(--dim);flex:none}.tile .p{overflow:hidden;text-overflow:ellipsis}
.flag{padding:6px 8px;border-left:3px solid var(--red);background:#2a1218;margin-bottom:4px;white-space:normal}
.flag b{color:var(--red)}.flag .c{color:var(--accent);float:right}.flag .r{color:var(--dim);display:block}
.flag .p{word-break:break-all}
.empty{color:var(--dim);font-family:inherit}
.note{margin:0 0 10px;padding:8px 10px;border:1px solid var(--line);border-left:3px solid var(--gold);border-radius:4px;background:#0e141c;color:var(--text);font-size:12.5px}
.wavesum{margin:0 0 10px;font-size:12.5px;color:var(--dim);line-height:1.7}.wavesum b{color:var(--text)}
.bycat{margin:10px 0 0;font-size:12px;color:var(--dim);line-height:1.7}.bycat b{color:var(--text)}
.kpis{display:grid;grid-template-columns:repeat(auto-fit,minmax(130px,1fr));gap:8px}
.kpi{background:#0e141c;border:1px solid var(--line);border-radius:4px;padding:8px}
.kpi .v{font-size:20px;font-weight:600;font-variant-numeric:tabular-nums}.kpi .l{color:var(--dim);font-size:11px}
.g{color:var(--green)}.r{color:var(--red)}.a{color:var(--amber)}.x{color:var(--accent)}
.cm{display:grid;grid-template-columns:auto 1fr 1fr;gap:4px;margin:10px 0;text-align:center}
.cm div{padding:8px;border-radius:4px;background:#0e141c}.cm .h{color:var(--dim);font-size:11px;background:none}
.cm .v{font-size:22px;font-weight:600;font-variant-numeric:tabular-nums}.cm small{display:block;font-size:11px;color:var(--dim)}
@media(max-width:800px){main{grid-template-columns:1fr}.counter{margin-left:0}.scroll{height:260px}.kv{font-size:22px}.ks{white-space:normal}.lane{grid-template-columns:24px 104px 1fr 28px 12px;gap:4px}}
@media(max-width:520px){h1 span{display:block;margin-left:0}.kpirow{gap:6px;padding:8px}.kcard{padding:6px 8px}.kl{font-size:9.5px}.legend{display:none}.chip{min-width:52px;padding:3px 6px}.lane{grid-template-columns:84px 1fr 24px}.lane .rk,.lane .mv{display:none}.chips{display:none}#wave-banner{left:50%;padding:12px 16px}.wb-t{font-size:18px}}
@media(prefers-reduced-motion:reduce){html{scroll-behavior:auto}.lane,.lane .fill{transition:none}.lane.hit::before,.lane.hit-fa::before,#wave-banner{animation:none}}

/* semantic comparison section */
#semantic{border-top:1px solid var(--line);background:#0a0e13}
.sem-inner{max-width:1000px;margin:0 auto;padding:26px 16px 40px}
.sem-h{font-family:var(--display);color:var(--gold);font-size:22px;margin:0 0 8px;text-transform:none;letter-spacing:.02em}
.sem-lede{color:var(--dim);max-width:74ch;margin:0 0 18px}.sem-lede b{color:var(--text)}
#semantic .cols{display:grid;grid-template-columns:1fr 1fr;gap:14px}
#semantic .cmpcard{background:var(--panel);border:1px solid var(--line);border-radius:10px;padding:18px;min-width:0}
#semantic .cmpcard h4{font-family:var(--display);font-size:17px;margin:0 0 2px;text-transform:none;letter-spacing:.02em;color:var(--text)}
#semantic .cmpcard .sub{color:var(--dim);font-size:12.5px;margin:0 0 12px}
#semantic .big{font-size:42px;font-weight:700;font-variant-numeric:tabular-nums;line-height:1}
#semantic .big.miss{color:var(--red)}#semantic .big.win{color:var(--green)}
#semantic .of{color:var(--dim);font-size:15px;font-weight:400}
#semantic .cap{color:var(--dim);font-size:12px;text-transform:uppercase;letter-spacing:.08em;margin-top:4px}
#semantic .mini{display:flex;gap:18px;margin-top:12px}.sem-inner .mini b{font-variant-numeric:tabular-nums}
#semantic .mini .k{color:var(--dim);font-size:11px;text-transform:uppercase;letter-spacing:.06em}
#semantic .verdict{margin-top:12px;font-size:13px;padding:8px 10px;border-radius:6px;border-left:3px solid}
#semantic .verdict.bad{background:#2a1218;border-color:var(--red)}
#semantic .verdict.good{background:#0e2018;border-color:var(--green)}
.sem-sub{font-size:12px;text-transform:uppercase;letter-spacing:1px;color:var(--dim);margin:26px 0 8px}
#sem-ex{width:100%;border-collapse:collapse;font-size:13px}
#sem-ex th,#sem-ex td{text-align:left;padding:8px 10px;border-bottom:1px solid var(--line);vertical-align:top}
#sem-ex th{color:var(--dim);font-weight:600;font-size:11px;text-transform:uppercase;letter-spacing:.06em}
#sem-ex .cat{color:var(--accent);font-size:11px;white-space:nowrap}
#sem-ex .tag{display:inline-block;padding:2px 8px;border-radius:999px;font-size:11px;font-weight:600}
#sem-ex .tag.allowed{background:#2a1218;color:#ff8a95}#sem-ex .tag.blocked{background:#0e2018;color:#7ee2a8}
.sem-note{margin-top:18px;font-size:13.5px;line-height:1.6;color:var(--text);background:var(--panel);border:1px solid var(--line);border-left:3px solid var(--gold);border-radius:8px;padding:12px 14px}
.sem-note b{color:var(--gold)}
@media(max-width:640px){#semantic .cols{grid-template-columns:1fr}}
