/* ============================================================
   Relay — one design system. Change a token here, it changes everywhere.
   ============================================================ */
:root{
  /* color */
  --ink:#0A0C12; --surface:#111621; --surface-2:#161C29; --line:#222B3B;
  --text:#EAEDF5; --muted:#8E98AD; --faint:#5C6678;
  --accent:#7C7AFF; --accent-2:#9D8BFF; --accent-ink:#0A0C12;
  /* status */
  --st-blocked:#5C6678; --st-ready:#E0B341; --st-running:#5A8DEE;
  --st-verifying:#A06CD5; --st-done:#36B37E; --st-failed:#F0506E;
  /* type */
  --font-display:'Space Grotesk', system-ui, sans-serif;
  --font-body:'Inter', system-ui, -apple-system, sans-serif;
  /* spacing scale (8px base) */
  --s1:4px; --s2:8px; --s3:12px; --s4:16px; --s5:24px; --s6:32px; --s7:48px; --s8:64px; --s9:96px;
  /* radius / shadow / width */
  --r1:8px; --r2:12px; --r3:18px; --rpill:999px;
  --shadow:0 10px 40px -12px rgba(0,0,0,.6);
  --maxw:1120px;
  color-scheme:dark;
}
*{box-sizing:border-box}
html,body{margin:0;padding:0}
body{
  background:radial-gradient(1200px 600px at 70% -10%, #161a2b 0%, var(--ink) 55%) fixed;
  color:var(--text); font-family:var(--font-body); font-size:15px; line-height:1.55;
  -webkit-font-smoothing:antialiased; min-height:100vh; display:flex; flex-direction:column;
}
a{color:inherit; text-decoration:none}
h1,h2,h3{font-family:var(--font-display); font-weight:600; line-height:1.1; margin:0; letter-spacing:-.01em}
h1{font-size:clamp(30px,5vw,52px)} h2{font-size:26px} h3{font-size:17px}
p{margin:0} .muted{color:var(--muted)} .faint{color:var(--faint)}

/* ---- layout primitives ---- */
.container{width:100%; max-width:var(--maxw); margin:0 auto; padding:0 var(--s5)}
.section{padding:var(--s8) 0}
.stack{display:flex; flex-direction:column}
.row{display:flex; align-items:center; gap:var(--s3)}

/* ---- nav ---- */
.nav{
  position:sticky; top:0; z-index:50; display:flex; align-items:center; gap:var(--s5);
  padding:var(--s3) var(--s5); border-bottom:1px solid var(--line);
  background:rgba(10,12,18,.72); backdrop-filter:blur(12px);
}
.brand{display:flex; align-items:center; gap:var(--s2); font-family:var(--font-display); font-weight:700; font-size:18px; color:var(--text)}
.brand svg{color:var(--accent)}
.nav-links{display:flex; align-items:center; gap:var(--s2); margin-left:auto}
.nav-links a{padding:var(--s2) var(--s3); border-radius:var(--r1); color:var(--muted); font-weight:500; font-size:14px; white-space:nowrap}
.nav-links a:hover{color:var(--text); background:var(--surface)}
.nav-links a.active{color:var(--text); background:var(--surface-2)}
.nav-links a.btn{color:var(--accent-ink)}
.nav-toggle{display:none; margin-left:auto; background:transparent; border:1px solid var(--line); color:var(--text); border-radius:var(--r1); padding:6px 8px; cursor:pointer; line-height:0}

/* mobile nav: hamburger -> dropdown */
@media(max-width:720px){
  .nav{gap:var(--s3); padding:var(--s3) var(--s4)}
  .nav-toggle{display:inline-flex; align-items:center}
  .nav-links{position:absolute; top:100%; left:0; right:0; margin:0; flex-direction:column; align-items:stretch;
    gap:4px; padding:var(--s3) var(--s4) var(--s4); background:var(--surface); border-bottom:1px solid var(--line);
    box-shadow:var(--shadow); display:none}
  .nav-links.open{display:flex}
  .nav-links a{padding:var(--s3); font-size:15px}
  .nav-links a.btn{justify-content:center; margin-top:var(--s2)}
}

/* ---- buttons / inputs ---- */
.btn{
  display:inline-flex; align-items:center; gap:var(--s2); cursor:pointer; border:0;
  font-family:var(--font-body); font-weight:600; font-size:15px;
  background:var(--accent); color:var(--accent-ink); padding:var(--s3) var(--s5);
  border-radius:var(--rpill); transition:transform .08s ease, filter .15s ease;
}
.btn:hover{filter:brightness(1.08)} .btn:active{transform:translateY(1px)}
.btn-sm{padding:var(--s2) var(--s4); font-size:14px}
.btn-ghost{background:transparent; color:var(--text); border:1px solid var(--line)}
.btn-ghost:hover{background:var(--surface)}
.input{
  width:100%; background:var(--surface); border:1px solid var(--line); color:var(--text);
  font:inherit; padding:var(--s4) var(--s4); border-radius:var(--r2); outline:none;
}
.input:focus{border-color:var(--accent); box-shadow:0 0 0 3px rgba(124,122,255,.18)}

/* ---- cards ---- */
.card{background:var(--surface); border:1px solid var(--line); border-radius:var(--r3); padding:var(--s5)}
.grid{display:grid; gap:var(--s4)}
@media(min-width:720px){ .grid-3{grid-template-columns:repeat(3,1fr)} .grid-2{grid-template-columns:repeat(2,1fr)} }

/* ---- pills / status ---- */
.pill{display:inline-flex; align-items:center; gap:6px; font-size:12px; font-weight:600;
  padding:3px 10px; border-radius:var(--rpill); background:var(--surface-2); color:var(--muted)}
.dot{width:8px; height:8px; border-radius:3px; display:inline-block}
.s-blocked{background:var(--st-blocked)} .s-ready{background:var(--st-ready)} .s-running{background:var(--st-running)}
.s-verifying{background:var(--st-verifying)} .s-done{background:var(--st-done)} .s-failed{background:var(--st-failed)}

/* ---- hero ---- */
.hero{padding:var(--s8) 0 var(--s6)}
.eyebrow{display:inline-flex; align-items:center; gap:var(--s2); font-size:13px; font-weight:600;
  color:var(--accent-2); background:rgba(124,122,255,.10); border:1px solid rgba(124,122,255,.25);
  padding:5px 12px; border-radius:var(--rpill); margin-bottom:var(--s4)}
.hero p.lead{font-size:18px; color:var(--muted); max-width:60ch; margin-top:var(--s4)}
.brief-bar{display:flex; gap:var(--s3); margin-top:var(--s6); max-width:760px}
.brief-bar .input{flex:1}
@media(max-width:620px){ .brief-bar{flex-direction:column} }

/* ---- board ---- */
.board-head{display:flex; align-items:center; gap:var(--s4); flex-wrap:wrap; margin:var(--s6) 0 var(--s3)}
.board-head h3{font-size:15px; color:var(--muted); font-family:var(--font-body); font-weight:500}
.legend{display:flex; gap:var(--s4); flex-wrap:wrap; margin-left:auto; font-size:12px; color:var(--muted)}
.legend span{display:inline-flex; align-items:center; gap:6px}
#net{height:560px; background:var(--surface); border:1px solid var(--line); border-radius:var(--r3)}
.count{font-variant-numeric:tabular-nums; color:var(--st-done); font-weight:600}

/* ---- project cards ---- */
.proj{display:block; transition:border-color .15s ease, transform .08s ease}
.proj:hover{border-color:var(--accent); transform:translateY(-2px)}
.proj .brief{font-family:var(--font-display); font-weight:600; font-size:18px; margin-bottom:var(--s3)}
.bar{height:6px; border-radius:var(--rpill); background:var(--surface-2); overflow:hidden; margin-top:var(--s4)}
.bar > i{display:block; height:100%; background:var(--st-done); border-radius:var(--rpill)}

/* ---- about / prose ---- */
.prose{max-width:70ch}
.prose h2{margin-top:var(--s7); margin-bottom:var(--s3)}
.prose p{color:var(--muted); margin-bottom:var(--s4)}
.steps{counter-reset:s; display:grid; gap:var(--s4); margin-top:var(--s5)}
.step{display:flex; gap:var(--s4); align-items:flex-start}
.step::before{counter-increment:s; content:counter(s); flex:none; width:34px; height:34px; border-radius:var(--r1);
  display:grid; place-items:center; font-family:var(--font-display); font-weight:700;
  background:var(--surface-2); color:var(--accent-2); border:1px solid var(--line)}
.step b{display:block; color:var(--text); font-family:var(--font-display)}

/* ---- footer ---- */
.foot{margin-top:auto; border-top:1px solid var(--line); padding:var(--s5);
  display:flex; gap:var(--s4); justify-content:space-between; flex-wrap:wrap; font-size:13px; color:var(--muted)}
.empty{color:var(--muted); padding:var(--s7); text-align:center; border:1px dashed var(--line); border-radius:var(--r3)}

/* ---- KPI strip ---- */
.kpis{display:grid; grid-template-columns:repeat(2,1fr); gap:var(--s3); margin:var(--s2) 0 var(--s4)}
@media(min-width:680px){ .kpis{grid-template-columns:repeat(4,1fr)} }
@media(min-width:1000px){ .kpis{grid-template-columns:repeat(8,1fr)} }
.kpi{background:var(--surface); border:1px solid var(--line); border-radius:var(--r2); padding:var(--s3) var(--s3); border-top:2px solid var(--line)}
.kpi-label{font-size:11px; color:var(--muted); text-transform:uppercase; letter-spacing:.04em}
.kpi-value{font-family:var(--font-display); font-weight:700; font-size:21px; margin:3px 0 1px; font-variant-numeric:tabular-nums}
.kpi-sub{font-size:11px; color:var(--faint)}
.kpi.tone-good{border-top-color:var(--st-done)} .kpi.tone-warn{border-top-color:var(--st-ready)}
.kpi.tone-bad{border-top-color:var(--st-failed)} .kpi.tone-neutral{border-top-color:var(--accent)}
.hint{font-size:12px; color:var(--faint); margin:0 0 var(--s2)}

/* ---- ARC I · operator funnel strip (home page, operator-only) ----
   Phone-first: a single flex row that wraps. Each chip is deliberately compact —
   the strip should feel like a dashboard glance, not a full KPI section.
   Re-uses the kpi-label / kpi-value / kpi-sub tokens for consistency. */
.funnel-strip{display:flex; flex-wrap:wrap; gap:var(--s3); margin:var(--s3) 0 var(--s5); padding:var(--s3) var(--s4); background:var(--surface); border:1px solid var(--line); border-radius:var(--r2); border-left:3px solid var(--accent)}
.funnel-chip{flex:1 1 120px; min-width:110px}
.funnel-chip .kpi-value{font-size:17px}

/* ---- T34 · performance panel (operator-only, home page) ----
   Rendered below the funnel strip, same compact card treatment.
   .perf-panel-head: a flex row with label + build-time stat.
   .perf-mix: a wrapping row of .dlv-badge chips (reuses existing dlv-badge styles).
   Phone-first: both rows wrap naturally; min-width 0 prevents overflow on tiny viewports. */
.perf-panel{margin:0 0 var(--s4); padding:var(--s3) var(--s4); background:var(--surface); border:1px solid var(--line); border-radius:var(--r2); border-left:3px solid #5A8DEE}
.perf-panel-head{display:flex; flex-wrap:wrap; align-items:center; gap:var(--s2); margin-bottom:var(--s2); font-size:13px}
.perf-mix{display:flex; flex-wrap:wrap; gap:var(--s2)}

/* ---- KPI mini on project cards ---- */
.kpi-mini{display:flex; gap:var(--s4); margin-top:var(--s4); font-size:12px; color:var(--muted)}
.kpi-mini b{color:var(--text); font-variant-numeric:tabular-nums}
.kpi-mini .warn b{color:var(--st-ready)}

/* ---- output drawer (the human bridge) ---- */
.drawer{position:fixed; top:0; right:0; height:100vh; width:min(560px,94vw); z-index:100;
  background:var(--surface-2); border-left:1px solid var(--line); box-shadow:var(--shadow);
  transform:translateX(102%); transition:transform .22s cubic-bezier(.2,.7,.2,1);
  padding:var(--s5); overflow-y:auto}
.drawer.open{transform:translateX(0)}
.drawer-head{display:flex; align-items:center; justify-content:space-between; margin-bottom:var(--s4)}
.drawer .x{background:var(--surface); border:1px solid var(--line); color:var(--muted); cursor:pointer;
  width:34px; height:34px; border-radius:var(--r1); font-size:14px}
.drawer .x:hover{color:var(--text)}
.drawer-title{font-size:20px; margin-bottom:4px}
.output{white-space:pre-wrap; word-break:break-word; font-family:ui-monospace,'SF Mono',Menlo,monospace;
  font-size:13px; line-height:1.6; color:var(--text); background:var(--ink); border:1px solid var(--line);
  border-radius:var(--r2); padding:var(--s4); margin:0}
code{font-family:ui-monospace,Menlo,monospace; background:var(--surface); padding:1px 6px; border-radius:6px; font-size:12px}

/* ============ deliverable-first IA ============ */
.hero.compact{padding:48px 0 20px}
.hero.compact h1{font-size:clamp(28px,4.4vw,42px)}

/* preview-image site cards (Home) */
.pcard{padding:0;overflow:hidden;cursor:pointer;transition:border-color .15s ease,transform .08s ease}
.pcard:hover{border-color:var(--accent);transform:translateY(-2px)}
.thumb{aspect-ratio:16/10;background:var(--surface-2);position:relative}
.thumb img{width:100%;height:100%;object-fit:cover;object-position:top;display:block}
.thumb.noimg{background:linear-gradient(135deg,#161C29,#0E121C)}
.thumb.noimg::after{content:"no preview";position:absolute;inset:0;display:grid;place-items:center;color:var(--faint);font-size:13px}
.pcard-body{padding:16px 18px 18px}

/* project workspace header + tabs */
.phead{display:flex;align-items:center;gap:16px;flex-wrap:wrap;padding-top:32px}
.back{color:var(--muted);font-size:13px;white-space:nowrap}
.back:hover{color:var(--text)}
.ptitle{font-size:24px;margin:0;flex:1;min-width:240px;font-family:var(--font-display)}
.pill.big{font-size:13px;padding:5px 13px}
.tabs{margin:20px 0 26px;border-bottom:1px solid var(--line);gap:4px}
.tabs a{border-radius:8px 8px 0 0;margin-bottom:-1px;border-bottom:2px solid transparent}
.tabs a.active{background:transparent;color:var(--text);border-bottom-color:var(--accent)}

/* the hero: faux-browser frame + iframe */
.frame{background:var(--surface);border:1px solid var(--line);border-radius:var(--r3);overflow:hidden;box-shadow:var(--shadow)}
.frame-bar{display:flex;align-items:center;gap:12px;padding:9px 14px;border-bottom:1px solid var(--line);background:var(--surface-2)}
.frame-bar .dots{display:flex;gap:6px}
.frame-bar .dots i{width:10px;height:10px;border-radius:50%;background:var(--line);display:block}
.addr{font-size:12px;color:var(--muted);font-family:ui-monospace,Menlo,monospace}
.frame iframe{width:100%;height:70vh;border:0;background:#fff;display:block}
.actionbar{display:flex;align-items:center;gap:10px;margin-top:16px;flex-wrap:wrap}

/* building narration */
.progress{padding:28px}
.phasefeed{margin-top:22px;display:flex;flex-direction:column;gap:11px}
.phase{display:flex;align-items:center;gap:11px;color:var(--muted);font-size:15px}
.phase .mk{width:20px;text-align:center;font-weight:700}
.phase.done{color:var(--text)} .phase.done .mk{color:var(--st-done)}
.phase.run{color:var(--text)} .phase.run .mk{color:var(--st-running)}
.phase.pend .mk{color:var(--faint)}
.howbuilt{display:inline-block;margin-top:18px;font-size:13px}
.howbuilt:hover{color:var(--text)}

/* files list */
.filerow{display:flex;align-items:center;gap:14px;padding:13px 18px;margin-bottom:10px;cursor:pointer}
.filerow:hover{border-color:var(--accent)}
.fname{flex:1;font-size:14px}

/* resolution toast */
.toast{position:fixed;top:auto;bottom:32px;left:50%;transform:translateX(-50%) translateY(18px);opacity:0;transition:.3s ease;z-index:200;pointer-events:none}
.toast.show{opacity:1;transform:translateX(-50%) translateY(0)}
.toast .pill{font-size:14px;padding:9px 16px;background:var(--surface-2);box-shadow:var(--shadow)}

/* ============ mobile polish (phone-first) ============ */
@media(max-width:720px){
  .container{padding:0 16px}
  .hero{padding:40px 0 24px} .hero.compact{padding:32px 0 16px}
  .hero p.lead{font-size:16px}
  .phead{padding-top:20px; gap:8px; flex-direction:column; align-items:flex-start}
  .ptitle{font-size:20px; min-width:0; order:-1}
  .tabs{overflow-x:auto; -webkit-overflow-scrolling:touch; flex-wrap:nowrap; scrollbar-width:none}
  .tabs::-webkit-scrollbar{display:none}
  .tabs a{white-space:nowrap}
  .frame iframe{height:62vh}
  .actionbar{gap:8px}
  .actionbar .btn, .actionbar .btn-ghost{flex:1; justify-content:center}
  #net{height:60vh}
  .drawer{width:100vw}
  .foot{flex-direction:column; gap:6px}
  .kpis{grid-template-columns:repeat(2,1fr)}
}

/* ============ roadmap timeline ============ */
.rm-legend{display:flex;gap:18px;margin:20px 0 6px;font-size:13px;color:var(--muted);flex-wrap:wrap}
.rm-legend span{display:inline-flex;align-items:center;gap:7px}
.rm-dot{width:10px;height:10px;border-radius:50%;display:inline-block}
.rm-dot.done{background:var(--st-done)} .rm-dot.prog{background:var(--accent)} .rm-dot.next{background:var(--faint)}
.timeline{list-style:none;margin:28px 0 0;padding:0;position:relative}
.timeline::before{content:"";position:absolute;left:23px;top:10px;bottom:24px;width:2px;background:linear-gradient(var(--st-done),var(--accent) 60%,var(--line))}
.tl-item{position:relative;padding:0 0 16px 66px}
.tl-node{position:absolute;left:0;top:2px;width:48px;height:48px;border-radius:50%;display:grid;place-items:center;
  font-family:var(--font-display);font-weight:700;font-size:14px;background:var(--surface-2);border:2px solid var(--line);color:var(--muted)}
.tl-item.done .tl-node{border-color:var(--st-done);color:var(--st-done)}
.tl-item.progress .tl-node{border-color:var(--accent);color:var(--accent-2);box-shadow:0 0 0 4px rgba(124,122,255,.12)}
.tl-card{padding:16px 20px}
.tl-title{font-size:18px}
.rm-tag{font-size:12px;font-weight:600;padding:4px 11px;border-radius:var(--rpill);white-space:nowrap;align-self:flex-start}
.rm-tag.done{background:rgba(54,179,126,.14);color:var(--st-done)}
.rm-tag.prog{background:rgba(124,122,255,.16);color:var(--accent-2)}
.rm-tag.next{background:var(--surface-2);color:var(--muted)}
@media(max-width:720px){ .tl-item{padding-left:56px} .timeline::before{left:19px} .tl-node{width:40px;height:40px;font-size:12px} }

/* ============ review & verdicts ============ */
.rv-banner{display:flex;flex-wrap:wrap;align-items:center;gap:24px;margin:28px 0 8px;padding:22px 24px;
  background:linear-gradient(120deg,rgba(54,179,126,.10),rgba(124,122,255,.07));border:1px solid var(--line);border-radius:var(--r3)}
.rv-stat{display:flex;flex-direction:column;gap:3px}
.rv-num{font-family:var(--font-display);font-weight:700;font-size:28px;color:var(--st-done);line-height:1;font-variant-numeric:tabular-nums}
.rv-cap{font-size:12px;color:var(--muted)}
.rv-decision{margin-top:22px;padding:18px 22px;border:1px solid var(--line);border-left:3px solid var(--accent);border-radius:var(--r2);background:var(--surface)}
.rv-decision h3{font-size:16px;margin-bottom:8px}
.rv-h{margin-top:44px;display:flex;align-items:center;gap:12px}
.rv-count{font-family:var(--font-body);font-size:13px;font-weight:600;padding:2px 11px;border-radius:var(--rpill)}
.rv-count.done{background:rgba(54,179,126,.14);color:var(--st-done)}
.rv-count.defer{background:var(--surface-2);color:var(--muted)}
.rv-list{display:grid;gap:14px;margin-top:18px}
@media(min-width:760px){ .rv-list{grid-template-columns:repeat(2,1fr)} }
.rv-card{padding:18px 20px}
.rv-card.done{border-left:3px solid var(--st-done)}
.rv-card.defer{border-left:3px solid var(--st-ready)}
.rv-title{font-size:16px;line-height:1.25}
.rv-fix{margin-top:12px;font-size:13.5px;color:var(--text);border-top:1px dashed var(--line);padding-top:11px}
.rv-fix span{font-weight:700;margin-right:7px}
.rv-fix.done span{color:var(--st-done)} .rv-fix.defer span{color:var(--st-ready)}
.sev{font-size:11px;font-weight:700;letter-spacing:.03em;text-transform:uppercase;padding:3px 9px;border-radius:var(--rpill);white-space:nowrap;align-self:flex-start}
.sev-critical{background:rgba(240,80,110,.16);color:var(--st-failed)}
.sev-high{background:rgba(224,132,62,.18);color:#E0843E}
.sev-medium{background:rgba(90,141,238,.16);color:var(--st-running)}
.sev-low{background:var(--surface-2);color:var(--muted)}
.sev-cross{background:rgba(160,108,213,.16);color:var(--st-verifying)}

/* ============ CMS editor ============ */
.pagechips{display:flex;gap:8px;overflow-x:auto;padding:2px 0 14px;-webkit-overflow-scrolling:touch;scrollbar-width:none}
.pagechips::-webkit-scrollbar{display:none}
.chip{flex:none;background:var(--surface);border:1px solid var(--line);color:var(--muted);border-radius:var(--rpill);padding:8px 15px;font:inherit;font-size:14px;cursor:pointer;white-space:nowrap}
.chip.on{background:var(--surface-2);color:var(--text);border-color:var(--accent)}
.dotpip{display:inline-block;width:6px;height:6px;border-radius:50%;background:var(--st-ready);margin-left:6px;vertical-align:middle}
.editor-block{background:var(--surface);border:1px solid var(--line);border-radius:var(--r2);padding:12px 14px;margin-bottom:12px}
.editor-block.ro{opacity:.55}
.eb-label{font-size:11px;text-transform:uppercase;letter-spacing:.04em;color:var(--muted);margin-bottom:7px;display:flex;justify-content:space-between;align-items:center;gap:8px}
.eb-saved{font-size:11px;text-transform:none;letter-spacing:0;color:var(--st-done)}
.eb-saved.err{color:var(--st-failed)}
.eb-input{width:100%;background:var(--ink);border:1px solid var(--line);color:var(--text);font:inherit;font-size:15px;line-height:1.5;border-radius:var(--r1);padding:10px 12px;resize:none;outline:none;display:block}
.eb-input:focus{border-color:var(--accent);box-shadow:0 0 0 3px rgba(124,122,255,.15)}
.eb-ro{font-size:14px;color:var(--muted);white-space:pre-wrap}
.editor-actionbar{position:sticky;bottom:0;display:flex;align-items:center;gap:12px;justify-content:space-between;margin-top:6px;padding:14px 0 18px;background:linear-gradient(transparent,var(--ink) 35%)}
.editor-actionbar .btn{flex:none}
#editstate{font-size:13px}

/* ---- visual QA tab ---- */
.qa-head{display:flex;align-items:center;gap:12px;flex-wrap:wrap;margin:4px 0 16px}
.qa-overall{display:inline-flex;align-items:center;gap:6px;padding:8px 14px;border-radius:var(--r2);border:1px solid var(--line);background:var(--surface);font-size:14px;margin-bottom:16px}
.qa-overall b{font-family:var(--font-display);font-size:18px}
.qa-overall.tone-good{border-color:var(--st-done)} .qa-overall.tone-warn{border-color:var(--st-ready)} .qa-overall.tone-bad{border-color:var(--st-failed)}
.qa-grid{display:grid;gap:14px;grid-template-columns:1fr}
@media(min-width:760px){ .qa-grid{grid-template-columns:repeat(2,1fr)} }
.qa-card{background:var(--surface);border:1px solid var(--line);border-radius:var(--r2);padding:12px}
.qa-shotwrap{display:block;max-height:380px;overflow:hidden;border-radius:var(--r1);border:1px solid var(--line);background:#fff}
.qa-shotwrap img{width:100%;display:block}
.qa-meta{display:flex;align-items:center;justify-content:space-between;margin-top:10px}
.qa-score{font-family:var(--font-display);font-weight:700;font-size:15px;padding:2px 10px;border-radius:var(--rpill)}
.qa-score.tone-good{background:rgba(54,179,126,.16);color:var(--st-done)}
.qa-score.tone-warn{background:rgba(224,179,65,.16);color:var(--st-ready)}
.qa-score.tone-bad{background:rgba(240,80,110,.16);color:var(--st-failed)}
.qa-issues{margin:10px 0 2px;padding-left:18px;font-size:13px;color:var(--muted);display:flex;flex-direction:column;gap:5px}

/* ============ docs · visual system map ============ */
.pipe{display:flex;flex-direction:column;gap:8px;margin-top:20px;max-width:760px}
.pipe-node{background:var(--surface);border:1px solid var(--line);border-left:3px solid var(--accent);border-radius:var(--r2);padding:14px 18px}
.pipe-node h3{font-size:16px;margin-bottom:2px}
.pipe-n{display:inline-grid;place-items:center;width:24px;height:24px;border-radius:50%;background:var(--surface-2);color:var(--accent-2);font-family:var(--font-display);font-weight:700;font-size:12px;float:right}
.pipe-arrow{color:var(--faint);text-align:center;font-size:14px;line-height:1}
.layer-grid{display:grid;gap:12px;margin-top:18px;grid-template-columns:1fr}
@media(min-width:640px){ .layer-grid{grid-template-columns:repeat(3,1fr)} }
.layer{padding:16px 18px}
.layer.ok{border-left:3px solid var(--st-done)} .layer.wip{border-left:3px solid var(--st-ready)}
.lay-badge{font-size:11px;font-weight:700;padding:2px 8px;border-radius:var(--rpill)}
.lay-badge.ok{background:rgba(54,179,126,.14);color:var(--st-done)} .lay-badge.wip{background:rgba(224,179,65,.16);color:var(--st-ready)}
a.card.rv-card{display:block} a.card.rv-card:hover{border-color:var(--accent)}

/* ============ T11 · capability chain + T13 · deliverable badge + T20 · reason banner ============
   Phone-first: compact, inline, wraps naturally on narrow screens.
   WHY colours are inline on .dlv-badge: each badge must reflect ITS deliverable's colour token,
   not a shared class — avoids a class-per-deliverable explosion in the CSS. */

/* T13 · deliverable badge (home card + project header) */
.dlv-badge{
  display:inline-flex; align-items:center; font-size:11px; font-weight:700;
  padding:2px 8px; border-radius:var(--rpill); letter-spacing:.02em; white-space:nowrap;
  text-transform:uppercase;
}

/* T13 · meta row in project header: badge + stack + wall-clock on one line */
.proj-meta-row{
  display:flex; align-items:center; gap:8px; flex-wrap:wrap; width:100%; margin-top:4px;
}

/* T13 · filter bar on home Ready section */
.dlv-filter-bar{ display:flex; gap:6px; flex-wrap:wrap; }
.dlv-filter-btn{
  background:var(--surface); border:1px solid var(--line); color:var(--muted);
  border-radius:var(--rpill); padding:4px 12px; font:inherit; font-size:13px; font-weight:500;
  cursor:pointer; white-space:nowrap; transition:border-color .12s, color .12s;
}
.dlv-filter-btn:hover{ border-color:var(--accent); color:var(--text); }
/* on = active filter: use the deliverable's own colour (via --dlv-col CSS var set inline) or accent */
.dlv-filter-btn.on{
  background:color-mix(in srgb, var(--dlv-col, var(--accent)) 15%, transparent);
  border-color:var(--dlv-col, var(--accent));
  color:var(--dlv-col, var(--accent-2));
}

/* T20 · chainReason reasoning banner — one line, below the phead, above tabs.
   WHY not inside phead: phead is a flex row; the banner needs to span full width like a subtitle. */
.chain-reason-banner{
  display:flex; align-items:flex-start; gap:8px; margin:8px 0 4px;
  font-size:13px; color:var(--muted); line-height:1.45;
  border-left:3px solid var(--accent-2); padding:6px 12px;
  background:rgba(124,122,255,.06); border-radius:0 var(--r1) var(--r1) 0;
  max-width:860px;
}
.chain-reason-icon{ flex:none; font-size:14px; color:var(--accent-2); }
@media(max-width:720px){ .chain-reason-banner{ font-size:12px; } }

/* T11 · capability chain: a flex row of small tags */
.chain-row{
  display:flex; flex-wrap:wrap; gap:5px; margin:4px 0 8px;
}
.cap-tag{
  font-size:11px; font-weight:600; padding:2px 9px; border-radius:var(--rpill);
  background:rgba(90,141,238,.12); color:var(--st-running); border:1px solid rgba(90,141,238,.22);
  white-space:nowrap; letter-spacing:.02em;
}

/* PROJECT CHAT — phone-first: the session list stacks above the thread on small screens */
@media (max-width: 720px) {
  .chatwrap { grid-template-columns: 1fr !important; }
  .chatwrap > div:first-child { display: flex; gap: 6px; overflow-x: auto; padding-bottom: 6px; }
  .chatwrap > div:first-child #newsess { width: auto !important; white-space: nowrap; margin-bottom: 0 !important; }
  .chatwrap #sesslist { display: flex; gap: 6px; }
  .chatwrap #sesslist > div { white-space: nowrap; margin-bottom: 0 !important; max-width: 160px; overflow: hidden; text-overflow: ellipsis; }
}

/* ============================================================
   WORKSPACE (#/w/<id>) — Manus-style three-pane layout
   Desktop ≥900px: left rail | center chat | right preview
   Mobile  <900px: segmented tab + hamburger rail drawer
   ============================================================ */

/* Full-height shell — hides global nav padding so panes fill the viewport */
.ws-shell{
  display:flex; flex-direction:column; height:calc(100vh - 49px); overflow:hidden;
}

/* Three-pane row */
.ws-body{
  display:flex; flex:1; overflow:hidden; min-height:0;
}

/* LEFT RAIL */
.ws-rail{
  width:240px; flex:none; display:flex; flex-direction:column; gap:0;
  border-right:1px solid var(--line); background:var(--surface); overflow-y:auto;
  padding:var(--s4) var(--s3); transition:transform .22s cubic-bezier(.2,.7,.2,1);
}
.ws-rail-back{
  display:flex; align-items:center; gap:6px; font-size:13px; color:var(--muted);
  padding:var(--s2) var(--s2); border-radius:var(--r1); margin-bottom:var(--s3);
}
.ws-rail-back:hover{ color:var(--text); background:var(--surface-2); }
.ws-rail-title{
  font-family:var(--font-display); font-weight:600; font-size:15px; color:var(--text);
  padding:0 var(--s2); margin-bottom:var(--s2); line-height:1.3;
}
.ws-new-chat{
  width:100%; margin-bottom:var(--s3); justify-content:center;
  font-size:14px; padding:var(--s2) var(--s3);
}
.ws-sess-list{ display:flex; flex-direction:column; gap:3px; }
.ws-sess-item{
  padding:var(--s2) var(--s3); border-radius:var(--r1); cursor:pointer;
  font-size:13px; color:var(--muted); transition:background .1s, color .1s;
  border:1px solid transparent;
}
.ws-sess-item:hover{ background:var(--surface-2); color:var(--text); }
.ws-sess-item.active{ background:var(--surface-2); color:var(--text); border-color:var(--line); }
.ws-sess-item-title{ font-weight:500; white-space:nowrap; overflow:hidden; text-overflow:ellipsis; }
.ws-sess-item-time{ font-size:11px; color:var(--faint); margin-top:1px; }
.ws-sess-empty{ font-size:13px; color:var(--faint); padding:var(--s3) var(--s2); }

/* CENTER CHAT PANE */
.ws-chat{
  flex:1; min-width:0; display:flex; flex-direction:column; overflow:hidden;
  background:var(--ink);
}
.ws-thread{
  flex:1; min-height:0; overflow-y:auto; padding:var(--s5) var(--s5) var(--s3);
  display:flex; flex-direction:column; gap:var(--s3);
}
.ws-bubble-user{
  align-self:flex-end; max-width:78%; padding:var(--s3) var(--s4);
  background:var(--accent); color:var(--accent-ink); border-radius:14px 14px 4px 14px;
  font-size:14px; line-height:1.5; white-space:pre-wrap; word-break:break-word;
}
.ws-bubble-relay{
  align-self:flex-start; max-width:78%; padding:var(--s3) var(--s4);
  background:var(--surface); color:var(--text); border-radius:14px 14px 14px 4px;
  border:1px solid var(--line); font-size:14px; line-height:1.5; white-space:pre-wrap; word-break:break-word;
}
.ws-bubble-system{
  align-self:flex-start; max-width:85%; padding:var(--s3) var(--s4);
  background:rgba(124,122,255,.08); color:var(--muted); border-radius:var(--r2);
  border:1px solid rgba(124,122,255,.18); font-size:13px; line-height:1.5; white-space:pre-wrap; word-break:break-word;
}
.ws-typing{
  align-self:flex-start; font-size:12px; color:var(--faint);
  padding:var(--s2) var(--s4); display:flex; align-items:center; gap:6px;
}
.ws-typing-dot{
  width:6px; height:6px; border-radius:50%; background:var(--faint);
  animation:ws-pulse 1.2s ease-in-out infinite;
}
.ws-typing-dot:nth-child(2){ animation-delay:.2s; }
.ws-typing-dot:nth-child(3){ animation-delay:.4s; }
@keyframes ws-pulse{ 0%,80%,100%{opacity:.3} 40%{opacity:1} }

/* Composer */
.ws-composer{
  border-top:1px solid var(--line); padding:var(--s3) var(--s4); background:var(--surface);
  display:flex; gap:var(--s2); align-items:flex-end;
}
.ws-composer-input{
  flex:1; background:var(--ink); border:1px solid var(--line); color:var(--text);
  font:inherit; font-size:14px; border-radius:var(--r2); padding:var(--s3) var(--s4);
  outline:none; resize:none; min-height:38px; max-height:140px; line-height:1.45;
  overflow-y:auto;
}
.ws-composer-input:focus{ border-color:var(--accent); box-shadow:0 0 0 3px rgba(124,122,255,.18); }
.ws-composer-send{
  flex:none; align-self:flex-end; padding:var(--s2) var(--s4); font-size:14px;
}

/* RIGHT PREVIEW PANE */
.ws-preview{
  width:45%; flex:none; border-left:1px solid var(--line); display:flex;
  flex-direction:column; overflow:hidden; background:var(--surface);
}
.ws-preview-bar{
  padding:var(--s2) var(--s3); border-bottom:1px solid var(--line); background:var(--surface-2);
  display:flex; align-items:center; gap:var(--s2); flex-wrap:wrap;
}
.ws-preview-addr{
  flex:1; min-width:0; font-family:ui-monospace,Menlo,monospace; font-size:12px;
  color:var(--muted); white-space:nowrap; overflow:hidden; text-overflow:ellipsis;
}
.ws-device-toggle{ display:flex; gap:4px; }
.ws-device-btn{
  background:var(--surface); border:1px solid var(--line); color:var(--muted);
  border-radius:var(--r1); padding:3px 9px; font:inherit; font-size:12px; cursor:pointer;
  transition:background .1s, color .1s, border-color .1s;
}
.ws-device-btn.on{ background:var(--surface-2); color:var(--text); border-color:var(--accent); }
.ws-preview-open{ font-size:12px; white-space:nowrap; }
.ws-iframe-wrap{
  flex:1; overflow:hidden; display:flex; justify-content:center; align-items:flex-start;
  background:var(--ink); padding:0; position:relative;
}
.ws-iframe-wrap.phone-mode{ padding:var(--s3) 0; }
.ws-iframe{
  width:100%; height:100%; border:0; display:block; background:#fff;
  transition:width .2s ease;
}
.ws-iframe-wrap.phone-mode .ws-iframe{ width:390px; border-left:1px solid var(--line); border-right:1px solid var(--line); }

/* Build progress (shown while building / no liveUrl) */
.ws-build-progress{
  flex:1; padding:var(--s5); overflow-y:auto; display:flex; flex-direction:column; gap:var(--s4);
}
.ws-build-bar{ height:6px; border-radius:var(--rpill); background:var(--surface-2); overflow:hidden; }
.ws-build-bar > i{ display:block; height:100%; background:var(--st-running); border-radius:var(--rpill); transition:width .4s ease; }
.ws-build-tasks{ display:flex; flex-direction:column; gap:var(--s2); }
.ws-task-row{ display:flex; align-items:center; gap:var(--s2); font-size:13px; color:var(--muted); }
.ws-task-row.done{ color:var(--text); }
.ws-task-row.run{ color:var(--text); }
.ws-task-dot{ width:8px; height:8px; border-radius:50%; flex:none; }
.ws-task-dot.done{ background:var(--st-done); }
.ws-task-dot.run{ background:var(--st-running); }
.ws-task-dot.pend{ background:var(--faint); }
.ws-chain-reason{ font-size:12px; color:var(--faint); padding:var(--s2) var(--s3); border-left:2px solid var(--line); }

/* The mobile-only preview tab DUPLICATES .ws-preview for the collapsed Chat/Preview tab layout
   (<900px). It MUST be hidden on desktop or it renders as a phantom 4th column that squeezes the
   chat pane out entirely (live-caught 2026-07-07). Base = hidden; mobile shows .ws-preview-tab.visible. */
.ws-preview-tab{ display:none; }

/* ---- MOBILE workspace (<900px) ---- */
@media(max-width:899px){
  .ws-preview{ display:none; width:0; border:none; }
  .ws-rail{ display:none; position:fixed; top:0; left:0; bottom:0; z-index:60; width:280px;
    transform:translateX(-100%); box-shadow:var(--shadow); }
  .ws-rail.open{ display:flex; transform:translateX(0); }
  .ws-rail-overlay{ display:none; position:fixed; inset:0; z-index:59; background:rgba(0,0,0,.4); }
  .ws-rail-overlay.open{ display:block; }
  .ws-mobile-bar{
    display:flex; align-items:center; padding:var(--s2) var(--s3); border-bottom:1px solid var(--line);
    background:var(--surface); gap:var(--s2);
  }
  .ws-hamburger{
    background:transparent; border:1px solid var(--line); color:var(--muted);
    border-radius:var(--r1); padding:5px 7px; cursor:pointer; line-height:0;
  }
  .ws-hamburger:hover{ color:var(--text); }
  .ws-seg{
    display:flex; flex:1; gap:4px; background:var(--surface-2); border-radius:var(--rpill); padding:3px;
  }
  .ws-seg-btn{
    flex:1; text-align:center; padding:5px 12px; border-radius:var(--rpill); font-size:13px; font-weight:600;
    background:transparent; border:none; color:var(--muted); cursor:pointer; transition:background .1s, color .1s;
  }
  .ws-seg-btn.on{ background:var(--surface); color:var(--text); }
  .ws-preview-tab{
    flex:1; min-width:0; display:none; flex-direction:column; overflow:hidden; background:var(--surface);
  }
  .ws-preview-tab.visible{ display:flex; }
  .ws-preview-tab .ws-preview-bar{ flex-shrink:0; }
  .ws-preview-tab .ws-iframe-wrap{ flex:1; }
  .ws-chat.hidden-mobile{ display:none; }
}
@media(min-width:900px){
  .ws-mobile-bar{ display:none; }
  .ws-rail-overlay{ display:none !important; }
}
