:root{
  --bg:#0c0a12; --bg-glow:rgba(124,92,255,.16); --panel:#141019; --panel2:#1b1626;
  --ink:#f4f1f9; --mist:#ada4be; --faint:#938aa6; --line:#241f30; --line2:#322b42;
  --acc:#7c5cff; --acc-soft:#9b82ff; --acc-dim:#5a3fd6; --acc-ink:#0c0814; --acc-wash:rgba(124,92,255,.12);
  --ok:#52c993; --ok-wash:rgba(82,201,147,.13); --warn:#e0a23f; --red:#e85c4f;
  --serif:"Fraunces",Georgia,serif; --sans:"Figtree",system-ui,-apple-system,Segoe UI,Roboto,sans-serif;
  --mono:"JetBrains Mono",ui-monospace,Menlo,monospace;
  --r-sm:9px;--r-md:13px;--r-lg:17px;
  --e1:0 1px 0 rgba(255,255,255,.03), 0 8px 22px -14px rgba(0,0,0,.7);
  --e2:0 24px 50px -22px rgba(0,0,0,.75); --glow:0 0 0 1px var(--acc-wash), 0 14px 40px -14px rgba(124,92,255,.5);
}
*{box-sizing:border-box}
html{scroll-behavior:smooth}
body{margin:0;background:radial-gradient(1200px 720px at 80% -12%,var(--bg-glow),transparent 60%),
    radial-gradient(900px 600px at -5% 110%,rgba(58,160,180,.08),transparent 55%),var(--bg);
  color:var(--ink);font:16px/1.65 var(--sans);-webkit-font-smoothing:antialiased}
a{color:var(--acc-soft);text-decoration:none}a:hover{text-decoration:underline}
/* keyboard focus — visible ring for keyboard users only (not mouse) */
a:focus-visible,button:focus-visible,input:focus-visible,[tabindex]:focus-visible{
  outline:2px solid var(--acc-soft);outline-offset:2px;border-radius:4px}
.wrap{max-width:1080px;margin:0 auto;padding:0 22px}
/* nav */
.topbar{position:sticky;top:0;z-index:50;display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;gap:8px 16px;
  padding:11px 22px;background:rgba(12,10,18,.78);backdrop-filter:saturate(140%) blur(10px);border-bottom:1px solid var(--line)}
.logo{display:flex;align-items:center;gap:10px;text-decoration:none;color:var(--ink)}
.logo img{border-radius:8px;display:block}
.logo span{font:600 1.12rem/1 var(--serif);letter-spacing:.02em}
.logo:hover{text-decoration:none}
.nav{display:flex;flex-wrap:wrap;gap:2px;align-items:center}
.nav a{font-size:.85rem;color:var(--mist);text-decoration:none;padding:6px 11px;border-radius:999px;white-space:nowrap}
.nav a:hover{color:var(--ink);background:rgba(255,255,255,.04);text-decoration:none}
.nav a.active{color:var(--ink);background:var(--acc-wash);box-shadow:inset 0 0 0 1px var(--line2)}
.mark{font-weight:600;letter-spacing:.34em;font-size:.72rem;color:var(--mist);text-transform:uppercase}
h1{font:600 clamp(2.2rem,6.4vw,4rem)/1.05 var(--serif);letter-spacing:-.02em;margin:.32em 0 .34em;
  font-variation-settings:'opsz' 144;text-wrap:balance}
h1 .on{color:var(--acc-soft)}
h2{font:600 clamp(1.45rem,3.3vw,2.15rem)/1.13 var(--serif);letter-spacing:-.015em;margin:0 0 .5em;text-wrap:balance}
h3{font:600 1.04rem/1.3 var(--sans);margin:0 0 .3em}
.lede{font-size:clamp(1.04rem,2.3vw,1.22rem);color:#d8d1e6;max-width:48ch}
section{padding:clamp(58px,8vw,104px) 0;position:relative;border-top:0}
section::before{content:"";position:absolute;top:0;left:50%;transform:translateX(-50%);
  width:min(1080px,92%);height:1px;background:linear-gradient(90deg,transparent,var(--line2) 20%,rgba(124,92,255,.32) 50%,var(--line2) 80%,transparent)}
.hero::before,.pagehead+section::before{display:none}
.pagehead{padding:60px 0 6px}
.pagehead h1{font:600 clamp(1.9rem,5.2vw,3.1rem)/1.06 var(--serif);letter-spacing:-.02em;margin:0 0 .35em}
.pagehead+section{border-top:none}
.muted{color:var(--mist)} .faint{color:var(--faint)}
.morelinks{display:flex;flex-wrap:wrap;gap:10px;margin-top:8px}
.morelinks a{font-size:.9rem;color:var(--acc-soft);border:1px solid var(--line2);border-radius:999px;padding:7px 14px;text-decoration:none}
.morelinks a:hover{border-color:var(--acc);color:#fff;text-decoration:none}
.pill{display:inline-flex;align-items:center;gap:7px;font-size:.76rem;color:var(--mist);
  border:1px solid var(--line2);border-radius:999px;padding:5px 13px;margin-bottom:18px;background:rgba(255,255,255,.015)}
.livedot{width:7px;height:7px;border-radius:50%;background:var(--ok);box-shadow:0 0 0 0 rgba(82,201,147,.6);animation:pulse 2.2s infinite}
@keyframes pulse{0%{box-shadow:0 0 0 0 rgba(82,201,147,.5)}70%{box-shadow:0 0 0 9px rgba(82,201,147,0)}100%{box-shadow:0 0 0 0 rgba(82,201,147,0)}}
.cta{display:inline-flex;align-items:center;gap:8px;margin-top:10px;border:0;cursor:pointer;
  background:linear-gradient(180deg,var(--acc-soft),var(--acc-dim));color:#fff;border-radius:var(--r-md);
  padding:12px 20px;font:600 .98rem var(--sans);box-shadow:var(--glow);transition:transform .18s,box-shadow .18s}
.cta:hover{transform:translateY(-1px);text-decoration:none;box-shadow:0 0 0 1px var(--acc-wash),0 18px 48px -12px rgba(124,92,255,.7)}
/* hero */
.hero{position:relative;overflow:hidden;border-top:none;padding:60px 0 34px}
.hero-art{position:absolute;inset:0;z-index:0;opacity:.82}
.hero-art canvas,.playart canvas{position:absolute;inset:0;width:100%;height:100%;display:block}
.hero::after{content:"";position:absolute;inset:0;z-index:1;pointer-events:none;
  background:linear-gradient(90deg,rgba(11,9,18,.92) 0%,rgba(11,9,18,.66) 36%,rgba(11,9,18,.16) 64%,transparent 84%),
    linear-gradient(0deg,var(--bg) 1%,transparent 26%)}
.hero .wrap{position:relative;z-index:2}
@media(max-width:640px){
  .hero{padding:66px 0 38px}
  .hero-art{opacity:.58}
  .navcta{display:none}
  .nav{gap:2px}.nav a{padding:10px 12px;font-size:.82rem;min-height:40px;display:inline-flex;align-items:center}   /* ≥40px tap targets */
  footer a{display:inline-block;padding:8px 8px}
  .morelinks a{padding:9px 14px}
  .composer input{font-size:16px}        /* ≥16px stops iOS auto-zoom-on-focus of the primary mobile CTA */
  .has-ga::after{display:none}        /* drop the sheen repaint on mobile; keep the GPU drift */
  /* mobile text is full-width — darken more evenly (top+bottom) instead of left-weighted */
  .hero::after{background:linear-gradient(180deg,rgba(11,9,18,.5) 0%,rgba(11,9,18,.3) 38%,rgba(11,9,18,.62) 78%,var(--bg) 100%)}
}
@keyframes heroDrift{from{transform:scale(1.04) translateY(0)}to{transform:scale(1.12) translate(-1.5%,-2%)}}
@keyframes gaFlow{to{transform:rotate(360deg)}}
.reshuffle{margin-left:12px;font:inherit;font-size:.82rem;color:var(--mist);background:none;border:1px solid var(--line2);
  border-radius:999px;padding:5px 12px;cursor:pointer;vertical-align:middle}.reshuffle:hover{border-color:var(--acc);color:#fff}
/* cards */
.grid{display:grid;gap:16px}
@media(min-width:760px){.cols2{grid-template-columns:1fr 1fr}.cols3{grid-template-columns:repeat(3,1fr)}}
.card{background:var(--panel);border:1px solid var(--line);border-radius:var(--r-md);padding:18px 20px;
  box-shadow:var(--e1);transition:transform .2s,border-color .2s}
.card:hover{transform:translateY(-2px);border-color:var(--line2)}
.card p{margin:.3em 0 0;color:#cdc4dd;font-size:.95rem}
.k{color:var(--acc-soft);font-weight:600;font-family:var(--mono);font-size:.84em}
/* assistant */
.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap;border:0}
.assistant{display:grid;gap:18px}
@media(min-width:900px){.assistant{grid-template-columns:1.4fr 1fr}.assistant.is-empty{align-items:start}}   /* only the EMPTY chat hugs its content; once populated, columns stretch to equal height so the trace tracks the chat (not a short panel floating beside a tall chat) */
@media(max-width:899px){.chat{min-height:340px}}   /* mobile: chat leads (was trace-first — an empty panel above the input); the per-turn receipt pill carries the governance link */
.assistant.is-empty .chat{min-height:auto}          /* empty state hugs its content — no dead vertical band */
.assistant.is-empty .log{flex:0 0 auto}
.chat{background:var(--panel);border:1px solid var(--line);border-radius:var(--r-lg);display:flex;
  flex-direction:column;min-height:460px;overflow:hidden;box-shadow:var(--e2)}
.chat .head{display:flex;align-items:center;gap:10px;padding:13px 16px;border-bottom:1px solid var(--line);background:var(--panel2)}
.chat .head img{width:30px;height:30px;border-radius:50%}
.chat .head b{font-size:.92rem}.chat .head span{font-size:.76rem;color:var(--mist)}
.log{flex:1;overflow-y:auto;padding:18px;display:flex;flex-direction:column;gap:13px}
.msg{max-width:88%;padding:10px 13px;border-radius:13px;font-size:.95rem;animation:msgin .32s ease both}
@keyframes msgin{from{opacity:0;transform:translateY(7px)}to{opacity:1;transform:none}}
.msg.user{align-self:flex-end;background:linear-gradient(180deg,#2c2440,#251e36);border:1px solid #38304e}
.msg.bot{align-self:flex-start;background:var(--panel2);border:1px solid var(--line)}
.msg.bot ul,.msg.bot ol{margin:.4em 0;padding-left:1.25em}.msg.bot li{margin:.15em 0}
.msg.bot strong{color:#fff}.msg.bot p{margin:.35em 0}
.msg.bot .mh{margin:.55em 0 .15em;font-size:.96rem}
.msg.bot code{font-family:var(--mono);font-size:.85em;background:#0f0c16;border:1px solid var(--line2);border-radius:5px;padding:1px 5px}
.msg.bot a{color:var(--acc-soft)}
.msg.bot .diagram{margin:.75em 0;color:var(--faint);font-size:.85rem}
.msg.bot .diagram.done{background:var(--panel);border:1px solid var(--line2);border-radius:12px;padding:11px;box-shadow:0 8px 22px rgba(0,0,0,.20);cursor:zoom-in;transition:border-color .15s ease,box-shadow .15s ease}
/* light: white node-cards need a tinted plate to read (dark's --panel is already darker than the nodes) */
:root[data-theme="light"] .msg.bot .diagram.done{background:var(--panel2)}
@media(hover:hover){.msg.bot .diagram.done:hover{border-color:var(--acc);box-shadow:var(--glow)}.msg.bot .diagram.done:hover .diagcap{color:var(--acc-soft)}}
.msg.bot .diagram.done:focus{outline:none}
.msg.bot .diagram.done:focus-visible{outline:2px solid var(--acc-soft);outline-offset:2px}
.msg.bot .diagimg{max-width:100%;max-height:60vh;height:auto;display:block;margin-inline:auto;border-radius:8px}
.msg.bot .diagcap{display:flex;align-items:center;justify-content:center;gap:6px;margin-top:9px;font-size:.72rem;color:var(--mist);letter-spacing:.03em;user-select:none;font-weight:600}
.msg.bot .diagcode{font-family:var(--mono);font-size:.8rem;white-space:pre-wrap;background:var(--panel2);border:1px solid var(--line2);color:var(--ink);border-radius:8px;padding:10px 12px;overflow-x:auto;margin:.4em 0}
/* mobile: a diagram earns the full bubble width + breaks slightly out of the padding so it isn't a tiny strip */
@media(max-width:640px){.msg.bot:has(.diagram){max-width:100%}.msg.bot .diagram.done{margin-left:-9px;margin-right:-9px;padding:10px}}
/* tap-to-enlarge overlay: crisp vector fill on a focused scrim */
.diag-zoom{position:fixed;inset:0;z-index:2000;display:flex;align-items:center;justify-content:center;cursor:zoom-out;background:rgba(8,6,14,.86);-webkit-backdrop-filter:blur(6px) saturate(120%);backdrop-filter:blur(6px) saturate(120%);opacity:0;transition:opacity .18s ease}
.diag-zoom.in{opacity:1}
.diag-zoom .diag-scroll{max-width:96vw;max-height:90vh;overflow:auto;display:flex;border-radius:12px;box-shadow:0 24px 70px rgba(0,0,0,.6);overscroll-behavior:contain;-webkit-overflow-scrolling:touch}
.diag-zoom .diag-scroll img{margin:auto;display:block;border-radius:12px;background:var(--panel2);cursor:zoom-out}
.diag-zoom .x{position:absolute;top:14px;right:16px;width:40px;height:40px;border-radius:50%;border:1px solid var(--line);background:var(--panel2);color:var(--ink);font-size:18px;line-height:1;display:flex;align-items:center;justify-content:center;cursor:pointer}
.diag-zoom .x:hover{background:var(--panel)}
/* fluid streaming — each word materialises (fade + rise + de-blur), a caret trails the live edge */
.msg.bot.streaming{min-height:1.15em}
.msg.bot .w{display:inline-block;opacity:0;transform:translateY(.34em);filter:blur(2.6px);
  transition:opacity .42s ease,transform .42s cubic-bezier(.2,.75,.2,1),filter .42s ease}
.msg.bot .w.in{opacity:1;transform:none;filter:blur(0)}
.caret{display:inline-block;width:.42em;height:1em;vertical-align:text-bottom;border-radius:2px;margin:0 1px -1px;
  background:linear-gradient(180deg,var(--acc-soft),var(--acc));box-shadow:0 0 8px rgba(124,92,255,.6);animation:caretPulse 1.05s ease-in-out infinite}
@keyframes caretPulse{0%,100%{opacity:.2}50%{opacity:.95}}
@media (prefers-reduced-motion: reduce){.msg.bot .w{transition:none;opacity:1;filter:none;transform:none}.caret{animation:none}}
.msg.sys{align-self:center;color:var(--mist);font-size:.82rem;border:1px dashed var(--line2);background:none;padding:6px 12px}
.chips{display:flex;flex-wrap:wrap;gap:8px;padding:0 16px 12px}
.chip{font-family:inherit;font-size:.82rem;line-height:1.2;color:#d2cadf;background:#221c30;border:1px solid var(--line2);border-radius:999px;padding:6px 11px;cursor:pointer;transition:.15s}
.chip:hover{border-color:var(--acc);color:#fff}
.chip:focus-visible{outline:2px solid var(--acc-soft);outline-offset:2px}
.chips.used{display:none}                            /* onboarding only — hide once a conversation is under way */
.turnreceipt{align-self:flex-start;max-width:92%;font:600 .74rem/1.35 var(--sans);border-radius:8px;padding:5px 10px;margin:-4px 0 0;display:inline-flex;gap:6px;align-items:center;animation:msgin .32s ease both}
.turnreceipt.ok{color:var(--ok);background:var(--ok-wash);border:1px solid rgba(82,201,147,.28)}
.turnreceipt.amber{color:var(--warn);background:rgba(224,162,63,.12);border:1px solid rgba(224,162,63,.3)}
.turnreceipt.red{color:var(--red);background:rgba(232,92,79,.13);border:1px solid rgba(232,92,79,.34)}
@media(min-width:900px){.turnreceipt{display:none}}   /* desktop: the trace panel is right there; the pill is mobile-only */
.composer{display:flex;gap:8px;border-top:1px solid var(--line);padding:12px;background:var(--panel2)}
.composer input{flex:1;background:#0f0c16;border:1px solid var(--line2);border-radius:10px;color:var(--ink);padding:11px 13px;font:inherit;font-size:.95rem}
.composer input:focus{outline:none;border-color:var(--acc);box-shadow:0 0 0 3px var(--acc-wash)}
.composer button{background:linear-gradient(180deg,var(--acc-soft),var(--acc-dim));color:#fff;border:0;border-radius:10px;padding:0 16px;font:600 .95rem var(--sans);cursor:pointer}
.composer button:disabled{opacity:.5;cursor:default}
/* trace */
.trace{background:linear-gradient(180deg,#16111f,#110d1a);border:1px solid var(--line);border-radius:var(--r-lg);padding:18px 18px 9px;box-shadow:var(--e1)}
.trace h3{font-size:.74rem;letter-spacing:.14em;text-transform:uppercase;color:var(--mist);margin-bottom:2px}
.trace .sub{font-size:.81rem;color:var(--faint);margin:0 0 10px}
.govcanvas{width:100%;height:104px;display:block;margin:0 0 12px;border-radius:10px;
  background:radial-gradient(120% 140% at 50% 0%,rgba(124,92,255,.07),transparent 70%),#100c18;border:1px solid var(--line)}
.row{display:flex;gap:11px;align-items:flex-start;padding:11px 0;border-top:1px solid var(--line)}
.row:first-of-type{border-top:none}
.dot{width:8px;height:8px;border-radius:50%;margin-top:6px;flex:none;background:#39334c;transition:.3s}
.row.ok .dot{background:var(--ok);--ping:rgba(82,201,147,.6);box-shadow:0 0 9px rgba(82,201,147,.7);animation:ping .5s ease}
.row.amber .dot{background:var(--warn);--ping:rgba(224,162,63,.7);box-shadow:0 0 9px rgba(224,162,63,.75);animation:ping .5s ease}
.row.red .dot{background:var(--red);--ping:rgba(232,92,79,.75);box-shadow:0 0 10px rgba(232,92,79,.85);animation:ping .5s ease}
.row.pending .dot{background:var(--acc-soft);box-shadow:0 0 10px var(--acc-wash);animation:pulse 1.4s ease infinite}
.row.red .val{color:#ffd9d2}.row.amber .val{color:#ffe6bd}
.tracefoot{font-family:var(--mono);font-size:.71rem;color:var(--faint);padding:11px 0 4px;border-top:1px solid var(--line);margin-top:7px;word-break:break-all}
@keyframes ping{0%{box-shadow:0 0 0 0 var(--ping,rgba(124,92,255,.6))}100%{box-shadow:0 0 0 7px transparent}}   /* ring colour follows the row's status (was hardcoded green — flashed green on refused rows) */
.row .lab{font-size:.72rem;letter-spacing:.07em;text-transform:uppercase;color:var(--faint)}
.row .val{font-size:.92rem;color:var(--ink);font-family:var(--mono);font-variant-numeric:tabular-nums}
.row .val .m{color:var(--mist);font-size:.82rem;font-family:var(--sans)}
.breach{margin-top:20px;display:grid;gap:12px}
.bcard{border:1px solid var(--line);border-radius:var(--r-md);padding:14px 16px;background:var(--panel)}
.bcard.ok{border-color:rgba(82,201,147,.4)}.bcard.red{border-color:rgba(232,92,79,.5);background:linear-gradient(180deg,#1c1320,var(--panel))}
.bcard.amber{border-color:rgba(224,162,63,.5);background:linear-gradient(180deg,#1d1810,var(--panel))}
.govctl{display:flex;flex-wrap:wrap;gap:14px;align-items:center;margin-top:18px}
.ksw{font-size:.85rem;color:var(--mist);display:inline-flex;align-items:center;gap:8px}
.kstoggle{font:600 .8rem var(--mono);color:var(--mist);background:#1b1626;border:1px solid var(--line2);border-radius:999px;padding:5px 14px;cursor:pointer;min-width:54px}
.kstoggle.on{background:var(--red);color:#fff;border-color:var(--red);box-shadow:0 0 12px rgba(232,92,79,.5)}
.gbtns{display:flex;gap:10px;margin-top:12px}
.gbtn{font:600 .9rem var(--sans);border:0;border-radius:9px;padding:9px 16px;cursor:pointer}
.gbtn.ok{background:var(--ok);color:#04130c}.gbtn.no{background:#2a2230;color:#e7dff5;border:1px solid var(--line2)}
.bcard .bh{font-weight:600;font-size:.95rem;margin-bottom:6px}
.bcard .bm{font-family:var(--mono);font-size:.78rem;color:var(--mist);margin-bottom:8px;word-break:break-word}
.bcard .bm code{color:var(--acc-soft)}
.bcard .bv{font-family:var(--mono);font-size:.88rem;color:#e7dff5}
.bcard .blocked{color:var(--red);font-weight:600}
.envelope{font-size:.85rem;font-family:var(--mono)}
.envelope .cap{display:inline-block;background:var(--acc-wash);border:1px solid var(--line2);border-radius:999px;padding:2px 9px;margin:1px 2px;color:#d6cfe6;font-size:.78rem}
.envelope .none{color:var(--ok)}
/* capability envelope, folded into the trace panel */
.trace .envelope{margin:2px 0 12px;border-top:1px solid var(--line);padding-top:13px}
.envtitle{font-family:var(--sans);font-size:.7rem;letter-spacing:.12em;text-transform:uppercase;color:var(--mist);margin-bottom:9px}
.envrow{display:flex;align-items:center;gap:8px;margin:5px 0;flex-wrap:wrap}
.envk{color:var(--faint);width:58px;flex:none}
.envnote{font-family:var(--sans);font-size:.8rem;color:var(--mist);margin-top:10px}
.scores{display:grid;gap:14px;margin-top:22px;grid-template-columns:1fr}
@media(min-width:680px){.scores{grid-template-columns:repeat(5,1fr)}}
.score{background:var(--panel);border:1px solid var(--line);border-radius:var(--r-md);padding:16px 14px;box-shadow:var(--e1)}
.score b{display:block;font:600 1.7rem/1 var(--serif);color:var(--acc-soft);letter-spacing:-.01em}
.score span{display:block;font-size:.82rem;color:#cdc4dd;margin-top:6px}
.score i{display:block;font-size:.76rem;color:var(--faint);margin-top:8px;font-style:normal;border-top:1px dashed var(--line2);padding-top:7px}
.play{margin-top:20px}
.play input{width:100%;max-width:420px;background:#0f0c16;border:1px solid var(--line2);border-radius:10px;color:var(--ink);padding:12px 14px;font:inherit;font-size:1rem}
.play input:focus{outline:none;border-color:var(--acc);box-shadow:0 0 0 3px var(--acc-wash)}
.playctrls{display:flex;flex-wrap:wrap;gap:9px 16px;align-items:center;margin-top:14px}
.ctlgrp{display:inline-flex;flex-wrap:wrap;align-items:center;gap:6px}
.ctlgrp b{font:600 .68rem var(--mono);text-transform:uppercase;letter-spacing:.1em;color:var(--faint);margin-right:1px}
.ctl{font:600 .8rem var(--sans);color:var(--mist);background:#1b1626;border:1px solid var(--line2);border-radius:999px;padding:6px 12px;cursor:pointer;transition:.15s}
.ctl:hover{border-color:var(--acc);color:#fff}
.ctl.on{background:var(--acc-wash);color:#fff;border-color:var(--acc)}
.ctl.resh{margin-left:auto}
.playgrid{display:grid;gap:16px;margin-top:18px;align-items:center}
@media(min-width:680px){.playgrid{grid-template-columns:1.6fr auto}}
.playart{position:relative;border:1px solid var(--line);border-radius:var(--r-md);overflow:hidden;background:#15123a;aspect-ratio:3/1}
.playart svg{position:static!important;inset:auto!important;width:100%!important;height:100%!important;display:block;animation:none!important}
.playmeta{display:flex;align-items:center;gap:12px}
.playmeta img{border-radius:10px;background:#15123a;border:1px solid var(--line)}
.camp{margin-top:18px;display:grid;gap:12px}
.camp input{width:100%;max-width:560px;background:#0f0c16;border:1px solid var(--line2);border-radius:10px;color:var(--ink);padding:12px 14px;font:inherit;font-size:1rem}
.camp input:focus{outline:none;border-color:var(--acc);box-shadow:0 0 0 3px var(--acc-wash)}
.campout{display:grid;gap:16px;margin-top:8px;grid-template-columns:1fr}
@media(min-width:760px){.campout{grid-template-columns:repeat(3,1fr)}}
.casset{border:1px solid var(--line);border-radius:var(--r-md);overflow:hidden;background:var(--panel);box-shadow:var(--e1)}
.casset .art{height:280px;display:flex;align-items:center;justify-content:center;background:#0e0a16;overflow:hidden}
.casset .art svg{height:100%;width:auto;max-width:100%;display:block}
.cfoot{display:flex;justify-content:space-between;align-items:center;padding:9px 13px;font-size:.78rem;color:var(--mist)}
.cfoot a{color:var(--acc-soft);text-decoration:none;border:1px solid var(--line2);border-radius:999px;padding:3px 10px}
.cfoot a:hover{border-color:var(--acc);color:#fff;text-decoration:none}
.gallery{display:grid;gap:16px;margin-top:22px;grid-template-columns:1fr}
@media(min-width:680px){.gallery{grid-template-columns:1fr 1fr}}
@media(min-width:980px){.gallery{grid-template-columns:1fr 1fr 1fr}}
.gcard{display:block;border:1px solid var(--line);border-radius:var(--r-md);overflow:hidden;background:var(--panel);text-decoration:none;color:var(--ink);box-shadow:var(--e1);transition:transform .2s,border-color .2s}
.gcard:hover{transform:translateY(-3px);border-color:var(--acc);text-decoration:none}
.gcard img{width:100%;aspect-ratio:1200/630;object-fit:cover;display:block;background:#15123a}
.gmeta{padding:12px 14px}.gmeta b{display:block;font-size:.98rem}
.gmeta span{display:block;font-size:.8rem;color:var(--mist);margin-top:3px;text-transform:capitalize}
.evalout{margin-top:18px;display:grid;gap:10px}
.escore{font:600 1.35rem var(--serif);color:var(--acc-soft)}
.ecase{border:1px solid var(--line);border-radius:var(--r-md);padding:12px 14px;background:var(--panel)}
.ecase.ok{border-color:rgba(82,201,147,.35)}.ecase.no{border-color:rgba(232,92,79,.5)}
.ecase .eh{font-size:.95rem}
.ecase .ecat{font-size:.68rem;text-transform:uppercase;letter-spacing:.08em;color:var(--faint);border:1px solid var(--line2);border-radius:999px;padding:1px 8px;margin-left:6px}
.ecase .ec{font-size:.8rem;color:var(--mist);margin-top:5px}
.ecase .ed{font-family:var(--mono);font-size:.79rem;color:#cdc4dd;margin-top:5px;word-break:break-word}
footer{padding:50px 0 72px;border-top:1px solid var(--line);color:var(--mist);font-size:.92rem}
footer a{color:#d2cadf}
/* structured footer / sitemap — Runware-inspired legibility + IA, honest content (real surfaces only) */
footer .foot-cols{display:grid;grid-template-columns:repeat(4,1fr);gap:34px 28px;margin-bottom:42px}
footer .foot-col{display:flex;flex-direction:column;align-items:flex-start;gap:9px}
footer .foot-label{font-size:.72rem;letter-spacing:.14em;text-transform:uppercase;color:var(--faint);font-weight:600;margin-bottom:3px}
footer .foot-col a{color:var(--mist);padding:3px 0;font-size:.95rem;text-decoration:none;transition:color .15s}
footer .foot-col a:hover{color:var(--ink);text-decoration:none}
footer .foot-colophon{border-top:1px solid var(--line);padding-top:24px;line-height:1.7}
@media(max-width:720px){footer .foot-cols{grid-template-columns:1fr 1fr;gap:28px 18px}}
@media(max-width:430px){footer .foot-cols{grid-template-columns:1fr}}
/* nav CTA */
.navcta{margin-left:8px;background:linear-gradient(180deg,var(--acc-soft),var(--acc-dim));color:#fff!important;
  border-radius:999px;padding:7px 15px;font-weight:600;box-shadow:var(--glow);white-space:nowrap}
.navcta:hover{color:#fff;text-decoration:none;transform:translateY(-1px)}
/* two-column section: narrative left, a visual / live panel right */
.split{display:grid;gap:26px;align-items:start}
@media(min-width:900px){.split{grid-template-columns:1.05fr .95fr;gap:48px;align-items:center}.split.top{align-items:start}}
.vizpanel{position:relative;border:1px solid var(--line);border-radius:var(--r-lg);background:
  radial-gradient(120% 120% at 80% 0%,rgba(124,92,255,.08),transparent 60%),var(--panel);
  box-shadow:var(--e1);padding:18px;min-height:230px;display:flex;flex-direction:column;justify-content:center}
.vizpanel .vhint{color:var(--mist);font-size:.86rem;text-align:center;line-height:1.55;padding:6px}
.vhint .vrow{display:flex;align-items:center;justify-content:center;gap:9px;margin-bottom:14px;flex-wrap:wrap}
.vhint .vnode{border:1px solid var(--line2);border-radius:8px;padding:6px 11px;font-family:var(--mono);font-size:.76rem;color:#cdc4dd;background:#1b1626}
.vhint .vnode.b{border-color:var(--acc-dim);color:#fff;box-shadow:inset 0 0 0 1px var(--acc-wash)}
.vhint .vlink{color:var(--faint);font-family:var(--mono);font-size:.72rem;white-space:nowrap}
.vhint b{color:var(--acc-soft)}
/* the demo output, once it renders, shouldn't keep the centred placeholder layout */
.vizpanel .breach:not(:has(.vhint)),.vizpanel .evalout:not(:has(.vhint)){align-self:stretch}
/* scroll reveal */
.reveal{opacity:0;transform:translateY(20px);transition:opacity .7s ease,transform .7s cubic-bezier(.2,.7,.2,1)}
.reveal.in{opacity:1;transform:none}
/* secondary / ghost CTA + button rows */
.cta.ghost{background:transparent;color:var(--acc-soft);box-shadow:inset 0 0 0 1px var(--line2)}
.cta.ghost:hover{box-shadow:inset 0 0 0 1px var(--acc);color:#fff}
.ctarow{display:flex;flex-wrap:wrap;gap:12px;margin-top:8px}
/* closing CTA */
.closer{background:radial-gradient(900px 400px at 50% 120%,rgba(124,92,255,.12),transparent 70%)}
.closer h2{max-width:18ch}
/* generative backdrops — every card/panel gets its own bespoke flow-field art, seeded from its content,
   slowly animated like liquid gold: a viscous drift of the still + a slow golden sheen sweeping across */
.has-ga{--gap:.32;position:relative;isolation:isolate;overflow:hidden}
.chat.has-ga,.trace.has-ga{--gap:.22}
.closer.has-ga{--gap:.55}
/* two phase-shifted constellation frames crossfading → a gently breathing network (nodes glide, lines reconnect) */
.has-ga::before{content:"";position:absolute;inset:-12%;z-index:-2;pointer-events:none;
  background:center/cover no-repeat;mix-blend-mode:screen;background-image:var(--ga);animation:gaSwirlA 16s ease-in-out infinite}
/* dropped the ::after crossfade twin + blanket will-change (a permanent compositor layer on every card — a memory/layer anti-pattern) */
.has-ga>*{position:relative}
@keyframes gaSwirlA{
  0%,100%{opacity:var(--gap);transform:rotate(-1deg) scale(1.05)}
  50%{opacity:calc(var(--gap)*0.12);transform:rotate(1deg) scale(1.09)}}
@keyframes gaSwirlB{
  0%,100%{opacity:calc(var(--gap)*0.12);transform:rotate(1deg) scale(1.08)}
  50%{opacity:var(--gap);transform:rotate(-1deg) scale(1.04)}}
/* larger panels run a LIVE constellation canvas behind their content */
.ga-live-host{position:relative;isolation:isolate;overflow:hidden}
.ga-live{position:absolute;inset:0;width:100%;height:100%;z-index:-1;display:block;
  opacity:.28;mix-blend-mode:screen;pointer-events:none}   /* dropped a per-frame drop-shadow GPU blur (recomputed every frame, x4-5 live canvases) — the glow now comes from the baked sprite halo inside the canvas */
.ga-live-host>*:not(.ga-live){position:relative}
.chat.ga-live-host>.ga-live,.trace.ga-live-host>.ga-live{opacity:.18}
.closer.ga-live-host>.ga-live{opacity:.46}
@media (prefers-reduced-motion: reduce){*{animation:none!important;transition:none!important}.reveal{opacity:1;transform:none}}

/* verify-it-live link row (replaces the dead GitHub CTA) */
.verify{text-align:center;font-size:.95rem;color:var(--faint);line-height:2}
.verify a{color:var(--acc-soft);white-space:nowrap}
.verify a:hover{color:var(--acc)}

/* attack-rack framing label above the chips */
.chiplabel{font-size:.8rem;color:var(--faint);margin:8px 2px 4px}

/* the-actual-policy code block on prove.html */
.mechanism{grid-column:1/-1;max-width:min(1080px,92%);margin:26px auto 0}   /* prove-2: span both split cols so the SQL isn't clipped in a half-width cell */
.mechlabel{font-size:.85rem;color:var(--faint);margin:0 0 8px}
.mechanism pre{font:12.5px/1.7 var(--mono);background:var(--panel);border:1px solid var(--line);
  border-radius:var(--r-md);padding:16px 18px;overflow-x:auto;color:var(--mist);white-space:pre;margin:0}

/* anatomy-of-a-turn pipeline (problem.html) — legend for the live GovViz trace */
.pipeline{display:flex;flex-wrap:wrap;gap:9px;margin-top:20px}
.pstage{flex:1 1 150px;min-width:142px;background:var(--panel);border:1px solid var(--line);
  border-radius:var(--r-md);padding:12px 13px;position:relative;box-shadow:var(--e1)}
.pstage b{display:block;font:600 .82rem/1 var(--mono);color:var(--acc-soft);letter-spacing:.03em;margin-bottom:7px}
.pstage span{display:block;font-size:.82rem;color:#cdc4dd;line-height:1.42}
.pstage i{display:block;font-size:.74rem;color:var(--faint);font-style:normal;margin-top:8px;
  border-top:1px dashed var(--line2);padding-top:7px}
.pstage:not(:last-child)::after{content:"→";position:absolute;right:-11px;top:22px;color:var(--acc-dim);font-size:.9rem;z-index:1}
@media(max-width:640px){.pstage:not(:last-child)::after{display:none}}

/* persistent governance verdict under the trace canvas (the "receipt") */
.verdict{font:600 .82rem/1.4 var(--sans);border-radius:8px;padding:8px 11px;margin:10px 0 2px;display:none}
.verdict:not(:empty){display:block}
.verdict.ok{color:var(--ok);background:var(--ok-wash);border:1px solid rgba(82,201,147,.28)}
.verdict.amber{color:var(--warn);background:rgba(224,162,63,.12);border:1px solid rgba(224,162,63,.3)}
.verdict.red{color:var(--red);background:rgba(232,92,79,.13);border:1px solid rgba(232,92,79,.34)}
.verdict.hint{color:var(--mist);background:rgba(255,255,255,.02);border:1px solid var(--line);font-weight:500}  /* pre-turn teaser; renderTrace swaps in the real ok/amber/red receipt */

/* mobile: let .split grid items shrink so a wide <pre>/canvas can't force the column past the viewport */
.split>*{min-width:0}
@media(max-width:640px){
  .split{gap:20px}
  .mechanism pre{font-size:11px;padding:13px 14px}
}

/* ==================== LIGHT THEME (data-theme="light") ==================== */
:root[data-theme="light"]{
  --bg:#f6f4fb; --bg-glow:rgba(124,92,255,.10); --panel:#ffffff; --panel2:#f1edfa;
  --ink:#17131f; --mist:#57506b; --faint:#635c78; --line:#e7e2f2; --line2:#d7cfe8;
  --acc:#6b4dff; --acc-soft:#5a3fd6; --acc-dim:#7c5cff; --acc-ink:#ffffff; --acc-wash:rgba(124,92,255,.10);
  --ok:#1a9f6b; --ok-wash:rgba(26,159,107,.12); --warn:#b0761d; --red:#d64435;
  --e1:0 1px 0 rgba(20,10,40,.03), 0 8px 22px -14px rgba(20,10,40,.16);
  --e2:0 24px 50px -22px rgba(20,10,40,.20);
  --glow:0 0 0 1px var(--acc-wash), 0 14px 40px -16px rgba(124,92,255,.32);
}
:root[data-theme="light"] .topbar{background:rgba(255,255,255,.74)}
:root[data-theme="light"] .nav a:hover{background:rgba(20,10,40,.05)}
:root[data-theme="light"] .nav a:not(.active){color:#463f57}                                 /* nav-1: darker inactive labels on the pale header (active pill untouched) */
:root[data-theme="light"] .vhint .vnode{background:var(--panel2);border-color:var(--line2)}   /* prove-1: chips were dark #1b1626 boxes on the white viz panel */
:root[data-theme="light"] .vhint .vnode.b{background:var(--acc-wash);color:var(--ink)}         /* prove-1: + the highlighted chip's #fff text was invisible on light */
:root[data-theme="light"] .pill{background:rgba(20,10,40,.02)}
/* Hero runs full-bleed opaque generative art — keep it a dark stage with light text in Stage 1 (Stage 2 turns the art itself light). */
:root[data-theme="light"] .v-hero{--ink:#f4f1f9;--mist:#ada4be;--faint:#938aa6;--line:#241f30;--line2:#322b42;--panel:#141019;--panel2:#1b1626;--acc-soft:#9b82ff;color:#f4f1f9}
/* theme toggle (injected into .nav by boot.js) */
.themetog{font:inherit;font-size:.82rem;line-height:1;color:var(--mist);background:none;border:1px solid var(--line2);border-radius:999px;padding:6px 11px;cursor:pointer;white-space:nowrap}
.themetog:hover{color:var(--ink);border-color:var(--acc)}

/* --- light-theme fixes: readable prose + neutralize dark-tuned animated overlays (Stage 1) --- */
:root[data-theme="light"] .lede{color:#3e3854}
:root[data-theme="light"] .card p,:root[data-theme="light"] .chip,:root[data-theme="light"] .envelope .cap,
:root[data-theme="light"] .score span,:root[data-theme="light"] .ecase .ed,:root[data-theme="light"] .vhint .vnode,
:root[data-theme="light"] .pstage span,:root[data-theme="light"] .bcard .bv{color:var(--mist)}
:root[data-theme="light"] footer a{color:var(--acc-soft)}
:root[data-theme="light"] .grain{opacity:0}
:root[data-theme="light"] .has-ga::before{mix-blend-mode:multiply;opacity:.72}   /* light: tile is white-ground + purple nodes (genart light path) — multiply shows only the nodes */
:root[data-theme="light"] .ga-live{mix-blend-mode:multiply}   /* light: the constellation renders theme-aware (light bg + purple nodes); multiply shows it as a subtle darkening (screen washes out on light) */
:root[data-theme="light"] .chat.ga-live-host>.ga-live,:root[data-theme="light"] .trace.ga-live-host>.ga-live{opacity:.28}   /* multiply reads subtler than dark's screen — a touch more presence, still legibility-safe */
:root[data-theme="light"] body.stage-live::after{display:none}

/* hero: a LIGHT section in light mode — no dark island, no dark→light scroll boundary (Stage 2 adds light art) */
:root[data-theme="light"] .v-hero{--ink:#17131f;--mist:#57506b;--faint:#635c78;--line:#e7e2f2;--line2:#d7cfe8;--panel:#ffffff;--panel2:#f1edfa;--acc-soft:#5a3fd6;color:#17131f}
:root[data-theme="light"] .v-hero-grad{display:none}
:root[data-theme="light"] .v-hero .lede{color:#3e3854}

/* card sub-headings / descriptions: solid readable dark on light (were #cdc4dd, washed out) */
:root[data-theme="light"] .gap-tile span,:root[data-theme="light"] .card p{color:#463f57}

/* anatomy step descriptions + teaser-card paragraphs (inherit the dark-mode lavender) → readable dark on light */
:root[data-theme="light"] .an-node span,:root[data-theme="light"] .an-node code,
:root[data-theme="light"] .bt-p,:root[data-theme="light"] .an-node i{color:#463f57}

/* Stage 2: the hero art is now theme-aware — show it in light (lower opacity for text legibility over the light network) */
:root[data-theme="light"] .hero-art{display:block;opacity:.6}
/* homepage hero (.hero, NOT the subpages' .v-hero): its ::after was a hardcoded DARK gradient — light it so the
   hero isn't a dark island and the (dark) lede stays readable. The homepage keeps its generative art in light. */
:root[data-theme="light"] .hero::after{background:linear-gradient(180deg,rgba(246,244,251,.45) 0%,rgba(246,244,251,.22) 38%,rgba(246,244,251,.6) 78%,var(--bg) 100%)}
/* homepage assistant composer: the input had a hardcoded dark #0f0c16 fill — white on light so it isn't a dark box */
:root[data-theme="light"] .composer input{background:#fff;border-color:#d7cfe8}
/* Studio page (light): the play/campaign inputs, the control pills and the asset tiles were dark-tuned — they read as unreadable black boxes on the pale theme (same class of bug as .composer input) */
:root[data-theme="light"] .play input,:root[data-theme="light"] .camp input{background:#fff;border-color:#d7cfe8}
:root[data-theme="light"] .ctl{background:var(--panel2)}                       /* was #1b1626 — a black pill on a white page; mist text already reads on panel2 */
:root[data-theme="light"] .ctl:hover{color:var(--acc)}                        /* base hover sets #fff — invisible on the now-pale pill */
:root[data-theme="light"] .ctl.on{background:var(--acc);color:#fff}           /* base is acc-wash + #fff = white-on-near-white; solid accent fill reads as clearly selected */
:root[data-theme="light"] .casset .art{background:var(--panel2)}              /* campaign asset letterbox was near-black #0e0a16 */
:root[data-theme="light"] .cfoot a:hover{color:var(--acc)}                    /* base hover #fff invisible on the light card */

/* Stage 2: light-mode console chrome (trace panel, govcanvas, hero-status, chips) */
:root[data-theme="light"] .trace{background:linear-gradient(180deg,#faf8ff,#ece6f8);border-color:#d8cfee;box-shadow:0 10px 30px -18px rgba(20,10,40,.22)}
/* chat bubbles: the user bubble + bot strong/code were hardcoded DARK → unreadable in light mode */
:root[data-theme="light"] .msg.user{background:linear-gradient(180deg,#e2d5f8,#d3c2f2);border-color:#c4b3e8;color:var(--ink)}
:root[data-theme="light"] .msg.bot strong{color:var(--ink)}
:root[data-theme="light"] .msg.bot code{background:#efeafa;border-color:#d7cfe8;color:#463f57}
:root[data-theme="light"] .govcanvas{background:radial-gradient(120% 140% at 50% 0%,rgba(124,92,255,.12),transparent 70%),#e7e0f5;border-color:#d8cfee}
:root[data-theme="light"] .hero-status{background:rgba(255,255,255,.9);box-shadow:0 12px 34px -18px rgba(20,10,40,.28)}
:root[data-theme="light"] .chip{background:#efeafa;color:#463f57}
:root[data-theme="light"] .dot{background:#c9c0e0}
