/* ================================================================
   Workshop v2 — sub-view stylesheet
   Always-dark editorial theme (independent of desktop's P5 dual-theme).
   All classes are .wsv2-* prefixed to avoid clash with desktop.css.

   Embedded mode (preferred): #workshop-v2-view inside desktop.html as
   .dt-view. Standalone /workshop-v2 page uses .wsv2-shell wrapper (legacy,
   to be removed in P7).
   ================================================================ */

/* ─── embedded sub-view layout ─── */
/* When inside desktop.html, #workshop-v2-view is a .dt-view (display:none by default,
   .active → display:block). Force absolute fill so .wsv2-screens (absolute inset:0)
   has a positioned ancestor and renders full-bleed inside .dt-content. */
#workshop-v2-view {
  position: absolute;
  inset: 0;
  background: var(--wsv2-bg);
  color: var(--wsv2-ink);
  font-family: var(--wsv2-sans);
  overflow: hidden;
}
/* .dt-view default is display:none; .active opens it */

/* All wsv2-* tokens & box-sizing reset are scoped to this view to keep desktop's
   global cascade clean. Standalone page still gets globals via .wsv2-shell rules below.
   `:where()` zeroes the selector's specificity so individual .wsv2-on / .wsv2-set
   rules (class-level) can override these resets without needing #workshop-v2-view
   prefix every rule. */
#workshop-v2-view, #workshop-v2-view *, #workshop-v2-view *::before, #workshop-v2-view *::after {
  box-sizing: border-box;
}
:where(#workshop-v2-view) button { font: inherit; cursor: pointer; background: none; border: none; color: inherit; border-radius: 0; }
:where(#workshop-v2-view) input,
:where(#workshop-v2-view) textarea,
:where(#workshop-v2-view) select {
  font: inherit; color: inherit; background: none; border: none; outline: none; border-radius: 0;
}
:where(#workshop-v2-view) a { color: inherit; text-decoration: none; }

/* ─── standalone page legacy reset (only applies when .wsv2-shell wrapper is present) ─── */

/* Standalone /workshop-v2 page reset — scoped to .wsv2-shell to avoid polluting
   desktop.html's global cascade when this stylesheet is shared across both modes.
   When P7 deletes the standalone route this whole block can go. */
.wsv2-shell, .wsv2-shell *{box-sizing:border-box;margin:0;padding:0}

:root {
  --wsv2-bg:#0c0d10;
  --wsv2-bg-1:#15171c;
  --wsv2-bg-2:#1c1e25;
  --wsv2-bg-3:#272a32;
  --wsv2-line:#2c2f37;
  --wsv2-line-2:#1f2229;
  --wsv2-ink:#f4eee2;
  --wsv2-ink-2:#a7a89e;
  --wsv2-ink-3:#62646b;
  --wsv2-red:#e63946;
  --wsv2-red-2:#b71d2a;
  --wsv2-red-3:#5f1d24;
  --wsv2-gold:#f5b53d;
  --wsv2-ok:#7ec578;
  --wsv2-display:'Oswald',Impact,sans-serif;
  --wsv2-serif:'Shippori Mincho','Noto Serif JP',serif;
  --wsv2-mono:'JetBrains Mono',ui-monospace,monospace;
  --wsv2-sans:'Inter',system-ui,sans-serif;
}

/* Light theme — remap wsv2 surfaces to P5 light tokens so embedded #workshop-v2-view
   follows the desktop dual-theme switch. Brand red/gold/ok/red-3 stay unchanged.
   Note: this only re-points tokens; the hardcoded #0a0b0e / #000 backgrounds
   below need their own light overrides further down. */
[data-theme="light"] {
  --wsv2-bg:        var(--p5-black);          /* page bg */
  --wsv2-bg-1:      var(--p5-card);           /* slightly elevated panel */
  --wsv2-bg-2:      var(--p5-input-bg);       /* deeper panel / hover */
  --wsv2-bg-3:      var(--p5-frame);          /* deepest / progress track */
  --wsv2-line:      var(--p5-border);
  --wsv2-line-2:    var(--p5-border);
  --wsv2-ink:       var(--p5-text);
  --wsv2-ink-2:     var(--p5-text-secondary);
  --wsv2-ink-3:     var(--p5-muted);
}

/* Standalone-mode body styles (only when .wsv2-shell wrapper is present). */
.wsv2-shell{font-family:var(--wsv2-sans);background:var(--wsv2-bg);color:var(--wsv2-ink);-webkit-font-smoothing:antialiased}
.wsv2-shell *{scrollbar-width:thin;scrollbar-color:#272a32 transparent}
.wsv2-shell *::-webkit-scrollbar{width:6px;height:6px}
.wsv2-shell *::-webkit-scrollbar-track{background:transparent}
.wsv2-shell *::-webkit-scrollbar-thumb{background:#272a32}
.wsv2-shell *::-webkit-scrollbar-thumb:hover{background:var(--wsv2-red)}
.wsv2-shell button{font:inherit;cursor:pointer;background:none;border:none;color:inherit;border-radius:0}
.wsv2-shell input,.wsv2-shell textarea,.wsv2-shell select{font:inherit;color:inherit;background:none;border:none;outline:none;border-radius:0}
.wsv2-shell a{color:inherit;text-decoration:none}

/* ============ SHELL ============ */
.wsv2-shell{display:grid;grid-template-rows:54px 1fr;grid-template-columns:60px 1fr;height:100vh}

/* TOP */
.wsv2-top{grid-column:1/-1;background:#000;border-bottom:2px solid var(--wsv2-red);display:flex;align-items:stretch;position:relative}
.wsv2-top::after{content:'';position:absolute;left:0;right:0;bottom:-2px;height:2px;background:repeating-linear-gradient(90deg,var(--wsv2-red) 0 14px,#000 14px 18px)}
.wsv2-lg{width:60px;background:var(--wsv2-red);display:grid;place-items:center;color:#000;font-family:var(--wsv2-display);font-weight:700;font-size:22px;font-style:italic;border-right:2px solid #000}
.wsv2-crumb{display:flex;align-items:center;gap:14px;padding:0 22px;font-family:var(--wsv2-mono);font-size:11px;letter-spacing:.14em;text-transform:uppercase;color:var(--wsv2-ink-3);border-right:1px solid var(--wsv2-line)}
.wsv2-crumb .wsv2-cur{color:var(--wsv2-red);font-weight:700}
.wsv2-crumb .wsv2-sep{color:var(--wsv2-line)}
.wsv2-spc{flex:1}
.wsv2-top-rt{display:flex;align-items:stretch}
.wsv2-top-rt > *{padding:0 14px;display:flex;align-items:center;gap:6px;font-family:var(--wsv2-mono);font-size:11px;letter-spacing:.08em;border-left:1px solid var(--wsv2-line)}
.wsv2-top-rt .wsv2-cr b{color:var(--wsv2-gold);font-weight:800;font-family:var(--wsv2-display);font-size:13px}
.wsv2-top-rt .wsv2-max{background:var(--wsv2-gold);color:#000;font-family:var(--wsv2-display);font-weight:800;font-size:13px;letter-spacing:.14em;padding:0 14px}
.wsv2-top-rt .wsv2-user{background:var(--wsv2-red);color:#000;padding:0 14px}
.wsv2-top-rt .wsv2-user svg{width:14px;height:14px}

/* SIDE */
.wsv2-side{grid-row:2;grid-column:1;background:#000;border-right:1px solid var(--wsv2-line);display:flex;flex-direction:column;align-items:center;padding:10px 0;gap:4px}
.wsv2-side a{width:42px;height:42px;display:grid;place-items:center;color:var(--wsv2-ink-3);position:relative}
.wsv2-side a:hover{color:var(--wsv2-red)}
.wsv2-side a.wsv2-active{color:var(--wsv2-red)}
.wsv2-side a.wsv2-active::before{content:'';position:absolute;left:0;top:6px;bottom:6px;width:2px;background:var(--wsv2-red)}
.wsv2-side a svg{width:18px;height:18px;stroke-width:1.6}
.wsv2-side-spacer{flex:1}

/* MAIN */
.wsv2-main{grid-row:2;grid-column:2;overflow:hidden;position:relative;background:var(--wsv2-bg)}

/* SCREENS */
.wsv2-screens{position:absolute;inset:0;overflow:hidden}
.wsv2-screen{position:absolute;inset:0;display:none;overflow-y:auto}
.wsv2-screen.wsv2-on{display:block}

/* ============ S1 · LIST ============ */
.wsv2-list-pg{padding:24px 28px 80px}
.wsv2-list-head{display:flex;align-items:flex-end;justify-content:space-between;margin-bottom:22px;padding-bottom:14px;border-bottom:1px solid var(--wsv2-line);position:relative}
.wsv2-list-head::before{content:'';position:absolute;left:0;bottom:-1px;width:140px;height:2px;background:var(--wsv2-red)}
.wsv2-list-head h1{font-family:var(--wsv2-display);font-weight:600;font-size:30px;letter-spacing:.04em;text-transform:uppercase;line-height:1}
.wsv2-list-head h1 em{font-family:var(--wsv2-serif);font-size:14px;color:var(--wsv2-red);font-weight:700;font-style:normal;margin-left:10px;letter-spacing:.08em}
.wsv2-list-sub{font-family:var(--wsv2-mono);font-size:10px;color:var(--wsv2-ink-3);letter-spacing:.1em;margin-top:8px;text-transform:uppercase}
.wsv2-list-sub b{color:var(--wsv2-red)}
.wsv2-list-filter{display:flex;border:1px solid var(--wsv2-line)}
.wsv2-list-filter button{padding:8px 14px;font-family:var(--wsv2-mono);font-size:10px;letter-spacing:.1em;color:var(--wsv2-ink-3);text-transform:uppercase;border-right:1px solid var(--wsv2-line)}
.wsv2-list-filter button:last-child{border-right:none}
.wsv2-list-filter button.wsv2-on{background:var(--wsv2-red);color:#000;font-weight:700}

.wsv2-proj-grid{display:grid;grid-template-columns:repeat(4, minmax(0, 1fr));gap:14px}
@media (max-width:1100px){.wsv2-proj-grid{grid-template-columns:repeat(3, minmax(0, 1fr))}}
@media (max-width:820px){.wsv2-proj-grid{grid-template-columns:repeat(2, minmax(0, 1fr))}}
@media (max-width:560px){.wsv2-proj-grid{grid-template-columns:1fr}}

/* hero start-card — single big input, replaces "+" card */
.wsv2-start-hero{grid-column:1/-1;border:1px solid var(--wsv2-line);background:linear-gradient(145deg,var(--wsv2-bg-1) 0%,#15161c 100%);padding:28px 32px;display:grid;grid-template-columns:auto 1fr;gap:24px;align-items:center;position:relative;overflow:hidden;margin-bottom:8px}
/* 上方已是 .wsv2-list-head 的 140px 红 accent，hero 自己不再画顶部红线（避免双线） */
.wsv2-start-hero::after{content:'';position:absolute;bottom:0;right:0;width:80px;height:2px;background:var(--wsv2-gold)}
.wsv2-start-lhs{display:flex;flex-direction:column;gap:4px}
.wsv2-start-tag{font-family:var(--wsv2-mono);font-size:9.5px;letter-spacing:.18em;color:var(--wsv2-red);text-transform:uppercase;font-weight:700}
.wsv2-start-lhs h2{font-family:var(--wsv2-display);font-weight:600;font-size:22px;letter-spacing:.03em;text-transform:uppercase;line-height:1}
.wsv2-start-lhs h2 em{font-family:var(--wsv2-serif);font-size:13px;color:var(--wsv2-gold);font-style:normal;font-weight:700;margin-left:6px;letter-spacing:.08em}

.wsv2-input-wrap{display:flex;align-items:center;border:1px solid var(--wsv2-line);background:#0a0b0e;height:52px}
.wsv2-input-wrap:focus-within{border-color:var(--wsv2-red)}
.wsv2-input-wrap input{flex:1;height:100%;padding:0 16px;font-size:14px;color:var(--wsv2-ink);font-family:var(--wsv2-sans)}
.wsv2-input-wrap input::placeholder{color:var(--wsv2-ink-3)}
.wsv2-go-btn{height:100%;padding:0 22px;background:var(--wsv2-red);color:#000;font-family:var(--wsv2-display);font-weight:800;font-size:13px;letter-spacing:.12em;text-transform:uppercase;display:inline-flex;align-items:center;gap:8px}
.wsv2-go-btn:hover{background:var(--wsv2-gold)}
.wsv2-go-btn svg{width:11px;height:11px}

.wsv2-proj-card{border:1px solid var(--wsv2-line);background:var(--wsv2-bg-1);cursor:pointer;position:relative;overflow:hidden;transition:border-color .15s}
.wsv2-proj-card:hover{border-color:var(--wsv2-red)}
.wsv2-poster{aspect-ratio:16/10;position:relative;overflow:hidden}
.wsv2-poster .wsv2-poster-ic{position:absolute;inset:0;display:grid;place-items:center;color:rgba(255,255,255,.3)}
.wsv2-poster .wsv2-poster-ic svg{width:46px;height:46px;stroke-width:1.2}
.wsv2-badge{position:absolute;top:10px;left:10px;font-family:var(--wsv2-mono);font-size:9px;padding:2px 6px;background:var(--wsv2-red);color:#000;font-weight:800;letter-spacing:.08em}
.wsv2-badge-gold{background:var(--wsv2-gold)}
.wsv2-card-info{padding:12px;border-top:1px solid var(--wsv2-line);position:relative}
.wsv2-card-info::before{content:'';position:absolute;top:-1px;left:0;width:30px;height:1px;background:var(--wsv2-red)}
.wsv2-card-info h4{font-family:var(--wsv2-display);font-weight:600;font-size:13px;letter-spacing:.02em;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.wsv2-card-info p{font-size:11px;color:var(--wsv2-ink-3);line-height:1.5;margin-top:4px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}

/* gradient posters */
.wsv2-g1{background:linear-gradient(135deg,#1a0a14,#5a1024 50%,#a02a3a)}
.wsv2-g2{background:linear-gradient(135deg,#0a0f16,#2a3240 50%,#f5b53d 110%)}
.wsv2-g3{background:linear-gradient(135deg,#3a1a2e,#8c2a5a 50%,#f08aab)}
.wsv2-g4{background:linear-gradient(135deg,#1a0e2e,#4a1a6a 50%,#a560d0)}
.wsv2-g5{background:linear-gradient(135deg,#12120f,#2a2a1e 40%,#746c42)}
.wsv2-g6{background:linear-gradient(135deg,#161a1e,#394552 55%,#7a8795)}

/* ============ S2 · DEFINE ============ */
.wsv2-create-pg{padding:0;height:100%;display:flex;flex-direction:column;position:relative;overflow:hidden}
.wsv2-create-pg::before{content:'';position:absolute;top:0;left:0;right:0;height:340px;background:radial-gradient(ellipse 800px 340px at 50% 0%,rgba(230,57,70,.15),transparent 70%);pointer-events:none}

/* Top nav bar — matches .md-stepper visual: 44px height, BACK with right-side separator, no outer border */
.wsv2-create-back{height:44px;display:flex;align-items:stretch;background:var(--wsv2-bg-1);border-bottom:1px solid var(--wsv2-line);flex-shrink:0;z-index:2;position:relative;overflow:visible}
.wsv2-create-back button{display:inline-flex;align-items:center;gap:8px;padding:0 18px;border:0;border-right:1px solid var(--wsv2-line);background:transparent;font-family:var(--wsv2-display);font-size:13px;letter-spacing:.12em;color:var(--wsv2-ink-2);text-transform:uppercase;cursor:pointer;font-weight:700;transition:background .15s ease,color .15s ease}
.wsv2-create-back button:hover{background:var(--wsv2-bg-2);color:var(--wsv2-red)}
.wsv2-create-back button svg{width:12px;height:12px}
.wsv2-create-ti{display:inline-flex;align-items:center;padding:0 18px;font-family:var(--wsv2-display);font-weight:700;font-size:15px;letter-spacing:.12em;text-transform:uppercase;color:var(--wsv2-red)}
.wsv2-create-ti em{font-family:var(--wsv2-serif);font-size:13px;color:var(--wsv2-ink-3);font-style:normal;font-weight:600;margin-left:10px;letter-spacing:.08em;text-transform:none}

/* Template top nav — reuses .wsv2-create-back chrome but with template name center + SHARE button right */
.wsv2-tpl-nav .wsv2-tpl-name{display:inline-flex;align-items:center;padding:0 0 0 20px;font-family:var(--wsv2-display);font-weight:700;font-size:15px;letter-spacing:.12em;text-transform:uppercase;color:var(--wsv2-ink);flex:1;overflow:hidden;white-space:nowrap;text-overflow:ellipsis;min-width:0}
.wsv2-create-back button.wsv2-tpl-share{margin-left:auto;border:0;border-left:1px solid var(--wsv2-line);border-right:0}

.wsv2-create-stage{flex:1;overflow-y:auto;padding:69px 0 60px;position:relative;z-index:1;min-height:0}
.wsv2-create-inner{max-width:760px;margin:0 auto;padding:0 24px}

/* mode switch */
/* Mode tabs — embedded in stage flow (was absolute-floating, 2026-05-06 reverted per user feedback "should sink into page, not float fixed at top"). */
.wsv2-mode-seg-wrap{display:flex;justify-content:center;margin:0 0 28px}
.wsv2-mode-seg{display:inline-flex;align-items:stretch;border:1px solid var(--wsv2-line);background:rgba(17,18,24,.92);box-shadow:0 12px 32px rgba(0,0,0,.42)}
.wsv2-mode-seg button{padding:0 18px;height:44px;font-family:var(--wsv2-mono);font-size:10px;letter-spacing:.14em;color:var(--wsv2-ink-3);text-transform:uppercase;display:inline-flex;align-items:center;gap:6px;border:0;border-left:1px solid var(--wsv2-line);background:transparent;cursor:pointer;font-weight:700;transition:background .15s ease,color .15s ease}
.wsv2-mode-seg button:first-child{border-left:0}
.wsv2-mode-seg .wsv2-mode-num{font-family:var(--wsv2-display);font-weight:800;font-size:10px;color:var(--wsv2-ink-3);letter-spacing:.04em}
.wsv2-mode-seg .wsv2-mode-meta{font-size:8px;color:var(--wsv2-ink-3);letter-spacing:.12em;font-family:var(--wsv2-mono);margin-left:2px}
.wsv2-mode-seg button:hover:not(.wsv2-disabled):not(.wsv2-on){background:var(--wsv2-bg-2);color:var(--wsv2-ink)}
.wsv2-mode-seg button.wsv2-on{background:var(--wsv2-red);color:#000}
.wsv2-mode-seg button.wsv2-on .wsv2-mode-num,
.wsv2-mode-seg button.wsv2-on .wsv2-mode-meta{color:#000}
.wsv2-mode-seg button.wsv2-disabled{opacity:.4;cursor:not-allowed}

.wsv2-brief{text-align:center;margin-top:25px;margin-bottom:36px}
.wsv2-kicker{font-family:var(--wsv2-mono);font-size:10px;letter-spacing:.24em;color:var(--wsv2-red);text-transform:uppercase;margin-bottom:14px;font-weight:700}
.wsv2-kicker::before{content:'⌨ ';color:var(--wsv2-ink-3);margin-right:4px}
.wsv2-brief h1{font-family:var(--wsv2-display);font-weight:600;font-size:42px;letter-spacing:.01em;text-transform:uppercase;line-height:1.05;text-wrap:balance}
.wsv2-brief h1 em{font-family:var(--wsv2-serif);color:var(--wsv2-red);font-style:normal;font-size:32px}
.wsv2-sub{font-size:14px;color:var(--wsv2-ink-2);margin-top:14px;line-height:1.6;max-width:540px;margin-left:auto;margin-right:auto;text-wrap:pretty}

.wsv2-composer{position:relative;border:1px solid var(--wsv2-red);background:var(--wsv2-bg-1);padding:2px;margin-bottom:18px;box-shadow:0 0 0 1px var(--wsv2-red-3),0 0 40px rgba(230,57,70,.12)}
.wsv2-composer::before{content:'01 · INTENT';position:absolute;top:-9px;left:14px;font-family:var(--wsv2-mono);font-size:9px;letter-spacing:.16em;background:#000;padding:2px 8px;color:var(--wsv2-red);font-weight:700}
.wsv2-composer-body{padding:18px 18px 14px;background:#0a0b0e;position:relative;overflow:hidden}
.wsv2-composer.wsv2-composer-uploading .wsv2-composer-body::after{content:'';position:absolute;inset:0;background:rgba(10,11,14,.54);backdrop-filter:blur(8px);-webkit-backdrop-filter:blur(8px);z-index:2;pointer-events:none}
.wsv2-composer.wsv2-composer-uploading .wsv2-composer-body::before{content:'';position:absolute;left:50%;top:50%;width:34px;height:34px;margin:-17px 0 0 -17px;border-radius:50%;border:3px solid rgba(230,57,70,.18);border-top-color:var(--wsv2-red);animation:wsv2RefSpin .8s linear infinite;z-index:3;pointer-events:none}
.wsv2-composer textarea{width:100%;min-height:100px;font-size:15px;line-height:1.6;color:var(--wsv2-ink);font-family:var(--wsv2-sans);resize:none}
.wsv2-composer textarea::placeholder{color:var(--wsv2-ink-3)}
.wsv2-composer-bottom{display:flex;align-items:center;gap:10px;padding:8px 14px;background:#0a0b0e;border-top:1px solid var(--wsv2-line-2)}
.wsv2-icobtn{width:30px;height:30px;display:grid;place-items:center;color:var(--wsv2-ink-3);border:1px solid var(--wsv2-line)}
.wsv2-icobtn:hover{border-color:var(--wsv2-red);color:var(--wsv2-red)}
.wsv2-icobtn svg{width:13px;height:13px}
.wsv2-hint{font-family:var(--wsv2-mono);font-size:9.5px;letter-spacing:.1em;color:var(--wsv2-ink-3);text-transform:uppercase}
.wsv2-hint b{color:var(--wsv2-gold)}
.wsv2-send-btn{margin-left:auto;padding:8px 18px;background:var(--wsv2-red);color:#000;font-family:var(--wsv2-display);font-weight:800;font-size:13px;letter-spacing:.14em;text-transform:uppercase;display:inline-flex;align-items:center;gap:8px}
.wsv2-send-btn:hover{background:var(--wsv2-gold)}
.wsv2-send-btn:disabled{opacity:.55;cursor:not-allowed;filter:saturate(.65)}
.wsv2-send-btn:disabled:hover{background:var(--wsv2-red)}
.wsv2-send-btn svg{width:11px;height:11px}

/* Reference image slots — inline flat squares in composer-bottom row, 0-2 images, START → END.
   Hint above (flex:1) pushes slots+BUILD IT to the right; gap:10px provides spacing. */
.wsv2-ref-slots{display:flex;gap:8px;align-items:center}
.wsv2-ref-slots:empty{display:none}
.wsv2-ref-card{position:relative;width:44px;height:44px;border:1px solid var(--wsv2-red);background:#000;flex-shrink:0;animation:wsv2RefIn .25s ease both}
.wsv2-ref-card img{width:100%;height:100%;object-fit:cover;display:block}
.wsv2-ref-card-label{position:absolute;bottom:0;left:0;right:0;padding:6px 2px 2px;background:linear-gradient(to top,rgba(0,0,0,.85) 0%,transparent 100%);font-family:var(--wsv2-mono);font-size:7px;letter-spacing:.08em;color:#fff;text-align:center;font-weight:700;line-height:1;pointer-events:none}
/* Loading placeholder — shown while CDN upload is in flight (~7-8s). */
.wsv2-ref-card.wsv2-ref-card-loading{display:flex;align-items:center;justify-content:center;border-color:rgba(230,57,70,.22);background:rgba(10,11,14,.46);backdrop-filter:blur(8px);-webkit-backdrop-filter:blur(8px)}
.wsv2-ref-card.wsv2-ref-card-loading .wsv2-ref-card-label{display:none}
.wsv2-ref-card-spinner{width:24px;height:24px;border:3px solid rgba(230,57,70,.18);border-top-color:var(--wsv2-red);border-radius:50%;animation:wsv2RefSpin .8s linear infinite}
@keyframes wsv2RefSpin{to{transform:rotate(360deg)}}
/* Close button — 20×20 with proper centering (box-sizing + line-height:0 fix svg drift) */
.wsv2-ref-card-x{position:absolute;top:-7px;right:-7px;width:20px;height:20px;background:var(--wsv2-red);border:1.5px solid #000;color:#fff;cursor:pointer;display:flex;align-items:center;justify-content:center;padding:0;line-height:0;box-sizing:border-box;z-index:4;transition:background .2s ease}
.wsv2-ref-card-x svg{width:10px;height:10px;display:block}
.wsv2-ref-card-x:hover{background:var(--wsv2-gold)}
@keyframes wsv2RefIn{0%{opacity:0;transform:scale(.4)}100%{opacity:1;transform:scale(1)}}

.wsv2-examples{display:flex;flex-direction:column;gap:8px;margin-top:14px}
.wsv2-examples-head{display:flex;align-items:center;justify-content:space-between;gap:12px;margin-bottom:2px}
.wsv2-examples-lab{font-family:var(--wsv2-mono);font-size:9.5px;letter-spacing:.18em;color:var(--wsv2-ink-3);text-transform:uppercase}
.wsv2-examples-shuffle{padding:4px 10px;font-family:var(--wsv2-mono);font-size:9.5px;letter-spacing:.18em;color:var(--wsv2-ink-3);text-transform:uppercase;border:1px solid var(--wsv2-line);background:transparent;cursor:pointer;transition:color .12s,border-color .12s}
.wsv2-examples-shuffle:hover{color:var(--wsv2-red);border-color:var(--wsv2-red)}
.wsv2-examples-row{display:flex;flex-wrap:wrap;gap:6px}
.wsv2-examples-row button{padding:7px 12px;font-size:12px;color:var(--wsv2-ink-2);border:1px solid var(--wsv2-line);background:var(--wsv2-bg-1);text-align:left}
.wsv2-examples-row button:hover{border-color:var(--wsv2-red);color:var(--wsv2-ink)}
.wsv2-examples-row button em{color:var(--wsv2-red);font-style:normal;font-weight:700;margin-right:5px;font-family:var(--wsv2-mono);font-size:10px}

.wsv2-gc-panel{margin-top:22px;border-top:1px solid var(--wsv2-line);padding-top:18px}
.wsv2-gc-panel[hidden]{display:none}
.wsv2-gc-head{display:flex;align-items:center;gap:14px;margin-bottom:12px}
.wsv2-gc-title{font-family:var(--wsv2-mono);font-size:10px;letter-spacing:.18em;color:var(--wsv2-red);text-transform:uppercase;font-weight:800}
.wsv2-gc-desc{font-size:12px;color:var(--wsv2-ink-3);line-height:1.5;margin-top:4px}
.wsv2-gc-dry{margin-left:auto;height:34px;padding:0 14px;border:1px solid var(--wsv2-red);color:var(--wsv2-red);font-family:var(--wsv2-display);font-weight:800;font-size:11px;letter-spacing:.13em;text-transform:uppercase;display:inline-flex;align-items:center;gap:7px}
.wsv2-gc-dry:hover{background:var(--wsv2-red);color:#000}
.wsv2-gc-dry:disabled{opacity:.5;cursor:not-allowed}
/* ============ SKILL FLOW DIAGRAM (S2 Define hero, mental-model viz) ============
   Build once (steps 1-2, gray) → Run many (steps 3-4, red loop). Dashed red arc
   underneath visualizes "REPEAT WITH NEW VARS". Reuses wsv2 tokens, no new colors.
*/
.wsv2-skill-flow{margin:14px auto 22px;max-width:760px;display:flex;flex-direction:column;gap:8px;position:relative}

/* Top zone labels — left half "ONE-TIME" (gray) | right half "← RUN MANY TIMES" (red) */
.wsv2-skill-flow-zones{display:grid;grid-template-columns:1fr 1fr;gap:14px;font-family:var(--wsv2-mono);font-size:9px;letter-spacing:.16em;text-transform:uppercase;font-weight:700;padding:0 6px}
.wsv2-skill-flow-zone{display:flex;align-items:center;gap:10px;min-width:0}
.wsv2-skill-flow-zone.is-once{color:var(--wsv2-ink-3)}
.wsv2-skill-flow-zone.is-loop{color:var(--wsv2-red);flex-direction:row-reverse}
.wsv2-skill-flow-zone .line{flex:1;height:1px;background:currentColor;opacity:.4}
.wsv2-skill-flow-zone.is-loop .line{opacity:.6}
.wsv2-skill-flow-zone .txt{white-space:nowrap}
.wsv2-skill-flow-zone .zone-arr{width:14px;height:14px;flex-shrink:0}

/* 4 step cards + 3 forward arrows in a single grid row */
.wsv2-skill-flow-row{display:grid;grid-template-columns:1fr 22px 1fr 22px 1fr 22px 1fr;gap:6px;align-items:stretch}

.wsv2-skill-step{display:flex;flex-direction:column;align-items:center;gap:6px;padding:14px 10px 12px;border:1px solid var(--wsv2-line);background:var(--wsv2-bg-1);text-align:center;min-height:104px;position:relative;font-family:var(--wsv2-sans)}
.wsv2-skill-step.is-once{border-color:var(--wsv2-line);color:var(--wsv2-ink-3)}
.wsv2-skill-step.is-loop{border-color:var(--wsv2-red);background:linear-gradient(180deg,var(--wsv2-bg-1) 0%,rgba(230,57,70,.05) 100%);box-shadow:inset 0 0 0 1px rgba(230,57,70,.18),0 0 18px -6px rgba(230,57,70,.18)}

.wsv2-skill-step-ic{display:inline-flex;align-items:center;justify-content:center;width:32px;height:32px;color:inherit}
.wsv2-skill-step.is-once .wsv2-skill-step-ic{color:var(--wsv2-ink-3)}
.wsv2-skill-step.is-loop .wsv2-skill-step-ic{color:var(--wsv2-red)}
.wsv2-skill-step-ic svg{width:24px;height:24px;display:block}

.wsv2-skill-step-ti{font-family:var(--wsv2-display);font-weight:700;font-size:13px;letter-spacing:.12em;text-transform:uppercase;color:var(--wsv2-ink)}
.wsv2-skill-step.is-once .wsv2-skill-step-ti{color:var(--wsv2-ink-2)}
.wsv2-skill-step.is-loop .wsv2-skill-step-ti{color:var(--wsv2-red)}

.wsv2-skill-step-d{font-family:var(--wsv2-mono);font-size:9px;letter-spacing:.06em;color:var(--wsv2-ink-3);line-height:1.4;text-transform:uppercase}

/* Forward arrows between steps */
.wsv2-skill-flow-arr{display:inline-flex;align-items:center;justify-content:center;color:var(--wsv2-ink-3)}
.wsv2-skill-flow-arr.is-once{color:var(--wsv2-ink-3)}
.wsv2-skill-flow-arr.is-bridge{color:var(--wsv2-red)}        /* the BUILD → FILL handoff: emphasized red */
.wsv2-skill-flow-arr.is-loop{color:var(--wsv2-red)}
.wsv2-skill-flow-arr svg{width:18px;height:18px}
.wsv2-skill-flow-arr.is-bridge svg{width:20px;height:20px;filter:drop-shadow(0 0 4px rgba(230,57,70,.5))}

/* Bottom dashed red arc — "REPEAT WITH NEW VARS" loop from RESULTS back to FILL·RUN */
.wsv2-skill-flow-loop{height:38px;position:relative;color:var(--wsv2-red);margin-top:-2px}
.wsv2-skill-flow-loop .loop-arc{position:absolute;left:0;right:0;top:0;width:100%;height:36px;display:block}
.wsv2-skill-flow-loop-tag{position:absolute;left:50%;top:18px;transform:translateX(-50%);font-family:var(--wsv2-mono);font-size:9px;letter-spacing:.16em;color:var(--wsv2-red);text-transform:uppercase;font-weight:700;background:var(--wsv2-bg);padding:2px 10px;white-space:nowrap;border:1px solid rgba(230,57,70,.35)}

/* Responsive — narrow viewport: 2×2 grid, hide horizontal arrows / zones / loop arc */
@media (max-width:720px){
  .wsv2-skill-flow-zones,
  .wsv2-skill-flow-arr,
  .wsv2-skill-flow-loop{display:none}
  .wsv2-skill-flow-row{grid-template-columns:1fr 1fr;gap:6px}
  .wsv2-skill-step{min-height:88px}
}

/* — Skill-flow popover (2026-05-02 v2): position:fixed floating card with backdrop (frosted glass).
   JS sets top/left to anchor below the i button. hover or focus = show; click = toggle pin (sticky);
   click backdrop / × / ESC = close. Doesn't affect document flow at all. */
.wsv2-brief{position:relative}
/* Flow popover trigger is intentionally limited to the i control, not the full subtitle line. */
.wsv2-sub{padding:6px 0}
.wsv2-flow-info{display:inline-flex;align-items:center;justify-content:center;width:18px;height:18px;background:var(--wsv2-red);color:#fff;border:0;font-family:var(--wsv2-serif);font-style:italic;font-weight:700;font-size:12px;line-height:1;cursor:help;margin-right:8px;padding:0;vertical-align:-2px;transition:background .15s;position:relative}
.wsv2-flow-info:hover,.wsv2-flow-info:focus-visible{background:var(--wsv2-red-2);outline:0}
/* Invisible hit-area extension on the i button (30×30 hot zone, visual remains 18×18). */
.wsv2-flow-info::before{content:'';position:absolute;inset:-6px;background:transparent}

/* Backdrop — full-screen frosted glass, hidden by default */
.wsv2-flow-backdrop{position:fixed;inset:0;z-index:1499;background:rgba(8,9,11,.45);backdrop-filter:blur(8px) saturate(120%);-webkit-backdrop-filter:blur(8px) saturate(120%);opacity:0;pointer-events:none;transition:opacity .2s ease;visibility:hidden}
.wsv2-flow-backdrop.is-on{opacity:1;pointer-events:auto;visibility:visible}

/* Popover — fixed, JS sets top/left. NO translateY animation (hit-test stays stable, no flicker).
   Only opacity transitions; visibility flips instantly with is-on. */
.wsv2-skill-flow.wsv2-skill-flow-pop{position:fixed;top:120px;left:50%;width:min(760px,calc(100vw - 32px));max-width:760px;margin:0;padding:22px 24px 18px;background:var(--wsv2-bg-1);border:1px solid var(--wsv2-line);box-shadow:0 32px 80px rgba(0,0,0,.7),0 0 0 1px rgba(230,57,70,.12);z-index:1500;opacity:0;pointer-events:none;visibility:hidden;transform:translateX(-50%);transition:opacity .18s ease,visibility 0s linear .18s}
.wsv2-skill-flow.wsv2-skill-flow-pop.is-on{opacity:1;pointer-events:auto;visibility:visible;transition-delay:0s}
.wsv2-skill-flow.wsv2-skill-flow-pop::before{content:'';position:absolute;top:-7px;left:var(--wsv2-flow-arr-x,50%);width:12px;height:12px;background:var(--wsv2-bg-1);border-top:1px solid var(--wsv2-line);border-left:1px solid var(--wsv2-line);transform:translateX(-50%) rotate(45deg);z-index:1}
/* Invisible hover bridge — extends popover hit-zone upward to cover the gap to the i button.
   Larger height (28px) gives 14px+ extra cushion against jitter on slow mouse moves. */
.wsv2-skill-flow.wsv2-skill-flow-pop::after{content:'';position:absolute;top:-28px;left:0;right:0;height:28px;background:transparent;pointer-events:auto}

/* Close button (real button, replaces old ::after) — top-right corner, click to dismiss */
.wsv2-flow-pop-close{position:absolute;top:8px;right:8px;width:28px;height:28px;background:transparent;border:0;color:var(--wsv2-ink-3);cursor:pointer;display:inline-flex;align-items:center;justify-content:center;padding:0;transition:color .15s,background .15s;z-index:1}
.wsv2-flow-pop-close:hover{color:var(--wsv2-red);background:var(--wsv2-bg-2)}
.wsv2-flow-pop-close svg{width:16px;height:16px}

@media (max-width:720px){
  .wsv2-skill-flow.wsv2-skill-flow-pop{width:calc(100vw - 24px);padding:18px 16px 14px}
}

/* — 6 direction cards (3-col grid, AUTO is default ✦RECOMMENDED) — */
.wsv2-gc-cardgrid{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:8px;margin:14px 0 10px}
.wsv2-gc-card{display:flex;flex-direction:column;align-items:flex-start;gap:6px;padding:14px;border:1px solid var(--wsv2-line);background:var(--wsv2-bg-1);text-align:left;cursor:pointer;transition:border-color .15s,background .15s;position:relative;min-height:108px;font-family:var(--wsv2-sans)}
.wsv2-gc-card:hover{border-color:var(--wsv2-red-3)}
.wsv2-gc-card.wsv2-on{border-color:var(--wsv2-red);background:rgba(230,57,70,.06)}
.wsv2-gc-card-rec{position:absolute;top:6px;right:6px;font-family:var(--wsv2-mono);font-size:8px;letter-spacing:.1em;color:var(--wsv2-gold);font-weight:700;padding:2px 5px;border:1px solid var(--wsv2-gold);background:rgba(245,181,61,.06);text-transform:uppercase}
.wsv2-gc-card-ic{display:inline-flex;align-items:center;justify-content:center;width:28px;height:28px;color:var(--wsv2-red)}
.wsv2-gc-card-ic svg{width:24px;height:24px;display:block}
.wsv2-gc-card.wsv2-on .wsv2-gc-card-ic{color:var(--wsv2-red)}
.wsv2-gc-card-ti{font-family:var(--wsv2-display);font-weight:600;font-size:14px;letter-spacing:.06em;text-transform:uppercase;color:var(--wsv2-ink)}
.wsv2-gc-card.wsv2-on .wsv2-gc-card-ti{color:var(--wsv2-red)}
.wsv2-gc-card-d{font-family:var(--wsv2-mono);font-size:9.5px;line-height:1.5;color:var(--wsv2-ink-3);letter-spacing:.04em;text-transform:none;margin-top:auto}

/* — Shared sub-panel (only one block visible at a time) — */
.wsv2-gc-sub{padding:14px;border:1px solid var(--wsv2-line);background:var(--wsv2-bg-2);min-height:60px;display:flex;flex-direction:column;gap:14px}
.wsv2-gc-sub-block{display:flex;flex-direction:column;gap:14px}
.wsv2-gc-sub-block[hidden]{display:none}
.wsv2-gc-sub-block p{font-family:var(--wsv2-sans);font-size:12.5px;line-height:1.6;color:var(--wsv2-ink-2);margin:0}
.wsv2-gc-sub-row{display:flex;align-items:center;gap:14px;flex-wrap:wrap}
.wsv2-gc-sub-lab{flex-shrink:0;width:84px;font-family:var(--wsv2-mono);font-size:9.5px;letter-spacing:.14em;color:var(--wsv2-red);text-transform:uppercase;font-weight:700}

/* — 15 platforms grid (4-col × ~4 rows, icon + label per cell) — */
.wsv2-gc-platforms{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:6px;flex:1;min-width:0}
.wsv2-gc-platforms button{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:6px;padding:10px 6px;border:1px solid var(--wsv2-line);background:var(--wsv2-bg-1);font-family:var(--wsv2-mono);font-size:9.5px;color:var(--wsv2-ink-2);text-transform:uppercase;letter-spacing:.06em;cursor:pointer;font-weight:700;min-height:62px;transition:border-color .12s,color .12s,background .12s}
.wsv2-gc-platforms button:hover{border-color:var(--wsv2-red-3);color:var(--wsv2-ink)}
.wsv2-gc-platforms button.wsv2-on{background:var(--wsv2-red);color:#000;border-color:var(--wsv2-red)}
.wsv2-gc-platform-ic{display:inline-flex;align-items:center;justify-content:center;width:22px;height:22px;color:inherit}
.wsv2-gc-platform-ic svg{width:20px;height:20px;display:block}
.wsv2-gc-platform-n{display:block;line-height:1;letter-spacing:.06em;font-size:9px;text-align:center;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:100%}
@media (max-width:820px){
  .wsv2-gc-platforms{grid-template-columns:repeat(3,minmax(0,1fr))}
}

/* — Segmented control (length / grid / videoModel) — */
.wsv2-gc-seg{display:inline-flex;border:1px solid var(--wsv2-line);background:var(--wsv2-bg-1);flex-wrap:wrap}
.wsv2-gc-seg button{padding:7px 12px;border:0;border-right:1px solid var(--wsv2-line);background:transparent;font-family:var(--wsv2-mono);font-size:9.5px;letter-spacing:.1em;color:var(--wsv2-ink-3);text-transform:uppercase;font-weight:700;cursor:pointer}
.wsv2-gc-seg button:last-child{border-right:0}
.wsv2-gc-seg button:hover{background:var(--wsv2-bg-2);color:var(--wsv2-ink-2)}
.wsv2-gc-seg button.wsv2-on{background:var(--wsv2-red);color:#000}
.wsv2-gc-web-policy{margin-top:10px;padding:12px 14px;border:1px solid var(--wsv2-line);background:var(--wsv2-bg-2);display:flex;flex-direction:column;gap:10px}
.wsv2-gc-web-hint{font-family:var(--wsv2-sans);font-size:12px;line-height:1.5;color:var(--wsv2-ink-3)}

/* — Duration slider — */
.wsv2-gc-duration{flex:1;display:flex;align-items:center;gap:12px;min-width:200px}
.wsv2-gc-duration input[type="range"]{flex:1;-webkit-appearance:none;appearance:none;height:3px;background:var(--wsv2-line);outline:none}
.wsv2-gc-duration input[type="range"]::-webkit-slider-thumb{-webkit-appearance:none;appearance:none;width:14px;height:14px;background:var(--wsv2-red);cursor:pointer;border-radius:0}
.wsv2-gc-duration input[type="range"]::-moz-range-thumb{width:14px;height:14px;background:var(--wsv2-red);cursor:pointer;border:0;border-radius:0}
.wsv2-gc-dur-v{font-family:var(--wsv2-display);font-weight:700;font-size:13px;color:var(--wsv2-gold);min-width:42px;text-align:right;letter-spacing:.04em}

/* — Estimate row — */
.wsv2-gc-est{padding:10px 14px;border:1px solid var(--wsv2-line);background:#0a0b0e;display:flex;align-items:center;gap:14px;font-family:var(--wsv2-mono);font-size:10px;letter-spacing:.08em;text-transform:uppercase;margin-top:10px}
.wsv2-gc-est-lab{color:var(--wsv2-red);font-weight:700;letter-spacing:.14em}
.wsv2-gc-est-v{color:var(--wsv2-gold);font-family:var(--wsv2-display);font-size:13px;font-weight:700;letter-spacing:.04em}

.wsv2-adv{margin-top:22px;border-top:1px dashed var(--wsv2-line);padding-top:14px}
.wsv2-adv-tog{display:flex;align-items:center;gap:8px;font-family:var(--wsv2-mono);font-size:10.5px;letter-spacing:.14em;text-transform:uppercase;color:var(--wsv2-ink-3);cursor:pointer;user-select:none}
.wsv2-adv-tog:hover{color:var(--wsv2-red)}
.wsv2-adv-arrow{display:inline-block;transition:transform .15s;width:0;height:0;border-left:5px solid transparent;border-right:5px solid transparent;border-top:5px solid currentColor}
.wsv2-adv.wsv2-open .wsv2-adv-arrow{transform:rotate(180deg)}
.wsv2-adv-note{margin-left:auto;color:var(--wsv2-ink-3)}
.wsv2-adv-body{display:none;margin-top:14px;grid-template-columns:repeat(3, minmax(0, 1fr));gap:8px}
.wsv2-adv.wsv2-open .wsv2-adv-body{display:grid}
.wsv2-adv-field{border:1px solid var(--wsv2-line);background:var(--wsv2-bg-1);padding:8px 12px}
.wsv2-adv-field label{font-family:var(--wsv2-mono);font-size:9px;letter-spacing:.14em;color:var(--wsv2-ink-3);text-transform:uppercase;display:block;margin-bottom:4px}
.wsv2-adv-val{font-size:12px;color:var(--wsv2-ink);display:flex;align-items:center;gap:6px}
.wsv2-adv-val svg{width:9px;height:9px;color:var(--wsv2-ink-3);margin-left:auto}
/* Custom dropdown — visual ref: .dt-model-dropdown (Quick Generate). Native <select> kept as hidden state holder. */
.wsv2-dd{position:relative;width:100%}
.wsv2-dd-btn{display:flex;align-items:center;gap:8px;width:100%;padding:0;background:transparent;border:0;font-family:var(--wsv2-sans);font-size:12px;color:var(--wsv2-ink);cursor:pointer;text-align:left}
.wsv2-dd-btn:disabled{cursor:default;opacity:.85}
.wsv2-dd-label{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.wsv2-dd-caret{width:9px;height:9px;color:var(--wsv2-ink-3);transition:transform .2s ease;flex-shrink:0}
.wsv2-dd.wsv2-dd-open .wsv2-dd-caret{transform:rotate(180deg);color:var(--wsv2-red)}
.wsv2-dd.wsv2-dd-open .wsv2-dd-label{color:var(--wsv2-red)}
.wsv2-dd-menu{position:absolute;top:calc(100% + 10px);left:-13px;right:-13px;background:var(--wsv2-bg-1);border:1px solid var(--wsv2-line);z-index:100;max-height:280px;overflow-y:auto;box-shadow:0 14px 32px rgba(0,0,0,.7)}
.wsv2-dd-menu[hidden]{display:none !important}
.wsv2-dd-item{display:flex;align-items:center;padding:10px 14px;font-size:12px;color:var(--wsv2-ink-2);cursor:pointer;font-family:var(--wsv2-sans);transition:background .12s ease,color .12s ease;letter-spacing:.02em}
.wsv2-dd-item:hover{background:rgba(230,57,70,.14);color:var(--wsv2-ink)}
.wsv2-dd-item.active{background:var(--wsv2-red);color:#000;font-weight:700}
.wsv2-dd-item.active:hover{background:var(--wsv2-red);color:#000}

/* ============ S3 · BUILDING ============ */
.wsv2-gen-pg{padding:0;height:100%;display:flex;flex-direction:column;position:relative;overflow:hidden}
.wsv2-gen-pg::before{content:'';position:absolute;inset:0;background:radial-gradient(ellipse 1000px 600px at 50% 50%,rgba(230,57,70,.12),transparent 70%);pointer-events:none}
.wsv2-gen-stage{flex:1;display:flex;align-items:center;justify-content:center;position:relative;overflow:hidden;padding:24px;min-height:0}
.wsv2-gen-card{width:100%;max-width:780px;border:1px solid var(--wsv2-red);background:var(--wsv2-bg-1);position:relative;overflow:hidden}
.wsv2-gen-card::before{content:'';position:absolute;top:-1px;left:0;right:0;height:1px;background:linear-gradient(90deg,var(--wsv2-red) 0%,var(--wsv2-red) 60%,transparent 60%);animation:wsv2Scanline 2.4s linear infinite}
@keyframes wsv2Scanline{0%{transform:translateX(-100%)}100%{transform:translateX(100%)}}
.wsv2-gen-ph{padding:14px 18px;border-bottom:1px solid var(--wsv2-line);display:flex;align-items:center;gap:12px;background:#000}
.wsv2-gen-dot{width:8px;height:8px;background:var(--wsv2-red);animation:wsv2Blink 1s infinite}
@keyframes wsv2Blink{50%{opacity:.3}}
.wsv2-gen-ti{font-family:var(--wsv2-display);font-size:15px;letter-spacing:.14em;text-transform:uppercase;color:var(--wsv2-red);font-weight:700}
.wsv2-gen-ti em{display:none}
.wsv2-gen-pct{margin-left:auto;font-family:var(--wsv2-display);font-size:20px;color:var(--wsv2-gold);font-weight:700;letter-spacing:.04em}

.wsv2-gen-body{padding:30px 36px;max-height:60vh;overflow-y:auto}
.wsv2-echo{margin-bottom:18px;padding-left:24px;position:relative}
.wsv2-echo::before{content:'';position:absolute;left:0;top:8px;width:14px;height:1px;background:var(--wsv2-red)}
.wsv2-echo.wsv2-done::before{background:var(--wsv2-ok)}
.wsv2-echo.wsv2-now::before{width:14px;height:14px;background:var(--wsv2-red);top:2px;animation:wsv2Pulse 1.2s infinite}
.wsv2-echo.wsv2-next::before{background:var(--wsv2-ink-3);opacity:.4}
.wsv2-echo.wsv2-fail::before{width:14px;height:14px;background:var(--wsv2-red);box-shadow:0 0 0 3px rgba(230,57,70,.25);top:2px}
.wsv2-echo.wsv2-fail .wsv2-echo-lb{color:var(--wsv2-red)}
.wsv2-echo.wsv2-fail .wsv2-echo-tx{color:var(--wsv2-ink-2)}
@keyframes wsv2Pulse{0%,100%{box-shadow:0 0 0 0 var(--wsv2-red)}50%{box-shadow:0 0 0 6px rgba(230,57,70,.2)}}
.wsv2-echo-lb{font-family:var(--wsv2-mono);font-size:13px;letter-spacing:.12em;color:var(--wsv2-ink-3);text-transform:uppercase;margin-bottom:6px;font-weight:600}
.wsv2-echo.wsv2-now .wsv2-echo-lb{color:var(--wsv2-red)}
.wsv2-echo.wsv2-done .wsv2-echo-lb{color:var(--wsv2-ok)}
.wsv2-echo-tx{font-size:15px;line-height:1.6;color:var(--wsv2-ink-2)}
.wsv2-echo.wsv2-now .wsv2-echo-tx{color:var(--wsv2-ink)}
.wsv2-echo-tx em{color:var(--wsv2-red);font-style:normal;font-weight:600}
.wsv2-echo.wsv2-next .wsv2-echo-tx{color:var(--wsv2-ink-3);opacity:.4}
.wsv2-echo-preview{margin-top:8px;display:inline-block;padding:7px 11px;border:1px solid var(--wsv2-line);font-family:var(--wsv2-mono);font-size:12.5px;color:var(--wsv2-ink-2);background:var(--wsv2-bg-2)}
.wsv2-echo-preview b{color:var(--wsv2-gold)}

.wsv2-gen-pf{padding:14px 18px;border-top:1px solid var(--wsv2-line);background:#000;display:flex;align-items:center;gap:14px}
.wsv2-gen-meta{font-family:var(--wsv2-mono);font-size:12px;color:var(--wsv2-ink-3);letter-spacing:.1em;text-transform:uppercase}
.wsv2-gen-meta b{color:var(--wsv2-ink)}
.wsv2-gen-bar{flex:1;height:3px;background:var(--wsv2-bg-3);position:relative;overflow:hidden}
.wsv2-gen-fill{position:absolute;top:0;bottom:0;left:0;width:62%;background:linear-gradient(90deg,var(--wsv2-red) 0%,var(--wsv2-gold) 100%);transition:width .4s}
.wsv2-gen-cancel{font-family:var(--wsv2-mono);font-size:12px;color:var(--wsv2-ink-3);letter-spacing:.1em;text-transform:uppercase;padding:6px 12px;border:1px solid var(--wsv2-line);cursor:pointer}
.wsv2-gen-cancel:hover{border-color:var(--wsv2-red);color:var(--wsv2-red)}
.wsv2-gen-skip{font-family:var(--wsv2-display);font-weight:800;font-size:12px;letter-spacing:.14em;text-transform:uppercase;padding:7px 16px;background:var(--wsv2-red);color:#000}
.wsv2-gen-skip:hover{background:var(--wsv2-gold)}

/* ============ S4 · TEMPLATE ============ */
/* grid-template-rows 必须跟实际 in-flow 子元素数量对齐：wsv2-tpl-pg 直接子只有 nav + body + cta
   （loading absolute 不占 flow）。原 "auto auto 1fr auto"(4 行) 让 body 错位塞到 row 2 auto，
   1fr 空着吃 254px = 黑色空白带。改 3 行：nav(auto) / body(1fr) / cta(auto)。 */
/* pg 只剩 head + body 两行 — cta 已经移进 body grid（"cta" area），
   不再作为 pg 的独立第 3 行。这样 output / hist 两列能跨满 body 全高，
   消除了原本 cta 右侧那块 grid 空格在 light 模式下露出的浅米空白带。 */
.wsv2-tpl-pg{display:grid;grid-template-columns:minmax(0,1fr);grid-template-rows:auto 1fr;height:100%;overflow:hidden;background:var(--wsv2-bg);min-height:0;min-width:0;position:relative}

.wsv2-tpl-head{padding:14px 24px 12px;border-bottom:1px solid var(--wsv2-line);background:var(--wsv2-bg-1);display:flex;align-items:center;gap:14px;flex-shrink:0;position:relative}
.wsv2-tpl-head::after{content:'';position:absolute;left:0;bottom:-1px;width:140px;height:2px;background:var(--wsv2-red)}
.wsv2-tpl-back{padding:5px 9px;border:1px solid var(--wsv2-line);font-family:var(--wsv2-mono);font-size:10px;letter-spacing:.1em;color:var(--wsv2-ink-2);text-transform:uppercase;display:inline-flex;align-items:center;gap:5px}
.wsv2-tpl-back:hover{border-color:var(--wsv2-red);color:var(--wsv2-red)}
.wsv2-tpl-ti{display:flex;align-items:center;gap:10px;min-width:0;flex:1}
.wsv2-tpl-pl{padding:1px 6px;background:var(--wsv2-red);color:#000;font-family:var(--wsv2-mono);font-size:9px;font-weight:800;letter-spacing:.12em}
.wsv2-tpl-ti h2{font-family:var(--wsv2-display);font-weight:600;font-size:17px;letter-spacing:.04em;text-transform:uppercase;line-height:1;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.wsv2-tpl-ti h2 em{font-family:var(--wsv2-serif);font-style:normal;color:var(--wsv2-gold);font-weight:700;font-size:14px;margin-left:4px}
.wsv2-tpl-meta{font-family:var(--wsv2-mono);font-size:9.5px;letter-spacing:.1em;color:var(--wsv2-ink-3);text-transform:uppercase;flex-shrink:0}
.wsv2-tpl-meta b{color:var(--wsv2-red);font-weight:700}
.wsv2-tpl-acts{display:flex;gap:5px;flex-shrink:0}
.wsv2-tpl-acts button{padding:5px 9px;border:1px solid var(--wsv2-line);font-family:var(--wsv2-mono);font-size:9.5px;letter-spacing:.1em;color:var(--wsv2-ink-2);text-transform:uppercase;display:inline-flex;align-items:center;gap:5px}
.wsv2-tpl-acts button:hover{border-color:var(--wsv2-red);color:var(--wsv2-red)}
.wsv2-tpl-acts button svg{width:10px;height:10px}

/* History column (right) — vertical scroll, newest first. Each tile is a horizontal row: thumb | seq+date+prompt */
.wsv2-tpl-hist{grid-area:hist;display:flex;flex-direction:column;background:var(--wsv2-bg-1);border-left:1px solid var(--wsv2-line);overflow:hidden;min-height:0}
.wsv2-tpl-hist-lb{padding:14px 16px;border-bottom:1px solid var(--wsv2-line);font-family:var(--wsv2-mono);font-size:9px;letter-spacing:.14em;color:var(--wsv2-ink-3);text-transform:uppercase;font-weight:700;flex-shrink:0;background:#0a0b0e}
.wsv2-tpl-hist-lb b{color:var(--wsv2-red);font-family:var(--wsv2-display);font-size:11px;margin-left:2px}
.wsv2-tpl-hist-list{flex:1;overflow-y:auto;padding:8px;display:flex;flex-direction:column;gap:6px;min-height:0;scrollbar-width:thin}
.wsv2-tpl-hist-list:empty::after{content:'NO HISTORY YET';display:block;text-align:center;padding:18px 6px;font-family:var(--wsv2-mono);font-size:9px;letter-spacing:.14em;color:var(--wsv2-ink-3);opacity:.5}
.wsv2-htile{display:flex;align-items:stretch;gap:10px;padding:8px;border:1px solid var(--wsv2-line);background:var(--wsv2-bg-1);cursor:pointer;transition:all .15s;flex-shrink:0}
.wsv2-htile:hover{border-color:var(--wsv2-red);background:rgba(230,57,70,.04)}
.wsv2-htile.wsv2-cur{border-color:var(--wsv2-red);background:rgba(230,57,70,.06)}
.wsv2-htile-running{border-color:rgba(230,57,70,.55);background:linear-gradient(90deg,rgba(230,57,70,.12),rgba(230,57,70,.02))}
.wsv2-htile-th{width:64px;height:64px;flex-shrink:0;background:#000;border:1px solid var(--wsv2-line);overflow:hidden;display:grid;place-items:center}
.wsv2-htile-video .wsv2-htile-th{width:112px;height:68px}
.wsv2-htile-th img{width:100%;height:100%;object-fit:cover;display:block}
.wsv2-htile-th video{width:100%;height:100%;object-fit:cover;display:block;background:#000}
.wsv2-htile-spinner{width:22px;height:22px;border-radius:50%;border:3px solid rgba(230,57,70,.2);border-top-color:var(--wsv2-red);animation:wsv2RefSpin .8s linear infinite}
.wsv2-htile-info{display:flex;flex-direction:column;gap:2px;min-width:0;flex:1;justify-content:center}
.wsv2-htile-row{display:flex;align-items:baseline;gap:6px;line-height:1}
.wsv2-htile-num{font-family:var(--wsv2-display);font-size:12px;color:var(--wsv2-red);font-weight:800;letter-spacing:.04em}
.wsv2-htile-when{font-family:var(--wsv2-mono);font-size:8.5px;color:var(--wsv2-ink-3);letter-spacing:.06em;text-transform:uppercase}
.wsv2-htile-prompt{font-size:10.5px;color:var(--wsv2-ink-2);font-family:var(--wsv2-sans);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;line-height:1.2;margin-top:2px}

/* body 用 grid-template-areas 把 cta 嵌进来：col1 上半放 input、下半放 cta；
   output 跨 row 1+2 延伸到底；hist 跨 row 1+2 延伸到底。原本 pg 第 3 行 cta 右侧
   的空 grid 区域不再存在，light 模式不再露出浅米空白带。 */
.wsv2-tpl-body{display:grid;grid-template-columns:380px 1fr 260px;grid-template-rows:1fr auto;grid-template-areas:"input output hist" "cta output hist";overflow:hidden;min-height:0;position:relative}
/* input 列加 background — 让容器在大屏上视觉显形（之前继承父级 #0c0d10 跟中列 #0a0b0e 几乎同色，
   黑成一片用户以为"没撑开"）。跟 hist 列 wsv2-bg-1 同色，左右对称 */
.wsv2-tpl-input{grid-area:input;padding:22px 24px;overflow-y:auto;border-right:1px solid var(--wsv2-line);background:var(--wsv2-bg-1);display:flex;flex-direction:column;gap:14px;min-height:0}

.wsv2-tpl-hint{font-family:var(--wsv2-mono);font-size:9.5px;letter-spacing:.12em;color:var(--wsv2-ink-3);text-transform:uppercase;display:flex;align-items:center;gap:6px;margin-bottom:-4px}
.wsv2-tpl-hint::before{content:'';width:14px;height:1px;background:var(--wsv2-red)}
.wsv2-tpl-hint b{color:var(--wsv2-red);font-weight:700}

/* Template summary — italic quote with gold left bar; 3-line clamp + SHOW MORE toggle */
.wsv2-tpl-summary-block{padding:6px 14px;border-left:2px solid var(--wsv2-gold);display:flex;flex-direction:column;gap:6px}
.wsv2-tpl-summary-block[hidden]{display:none}
.wsv2-tpl-summary-text{font-family:var(--wsv2-serif);font-style:italic;font-size:13px;color:var(--wsv2-ink-2);line-height:1.55;display:-webkit-box;-webkit-line-clamp:3;-webkit-box-orient:vertical;overflow:hidden;word-break:break-word}
.wsv2-tpl-summary-block.expanded .wsv2-tpl-summary-text{-webkit-line-clamp:unset;display:block;overflow:visible}
.wsv2-tpl-summary-toggle{align-self:flex-start;background:transparent;border:0;padding:0;cursor:pointer;font-family:var(--wsv2-mono);font-size:9.5px;letter-spacing:.14em;color:var(--wsv2-red);text-transform:uppercase;font-weight:700;transition:color .15s ease}
.wsv2-tpl-summary-toggle:hover{color:var(--wsv2-gold)}
.wsv2-tpl-summary-toggle[hidden]{display:none}

.wsv2-tpl-lab{font-family:var(--wsv2-mono);font-size:10px;letter-spacing:.16em;color:var(--wsv2-red);text-transform:uppercase;font-weight:700;display:flex;align-items:center;gap:6px;margin-bottom:6px}
.wsv2-req{color:var(--wsv2-red)}
.wsv2-tpl-prompt-box textarea{width:100%;min-height:120px;padding:14px;background:#0a0b0e;border:1px solid var(--wsv2-red);color:var(--wsv2-ink);font-size:14px;line-height:1.55;resize:none;font-family:var(--wsv2-sans)}
.wsv2-tpl-prompt-box textarea:focus{box-shadow:0 0 0 1px var(--wsv2-red)}
.wsv2-tpl-recent{display:flex;flex-wrap:wrap;gap:5px;margin-top:8px}
.wsv2-tpl-recent-lb{font-family:var(--wsv2-mono);font-size:9px;letter-spacing:.12em;color:var(--wsv2-ink-3);text-transform:uppercase;align-self:center;margin-right:2px}
.wsv2-tpl-recent button{padding:4px 9px;font-size:11px;color:var(--wsv2-ink-2);border:1px solid var(--wsv2-line);background:var(--wsv2-bg-1);font-family:var(--wsv2-mono);letter-spacing:.02em;white-space:nowrap}
.wsv2-tpl-recent button:hover{border-color:var(--wsv2-red);color:var(--wsv2-red)}

/* Knobs container — vertical stack, each entry has external red label + dropdown box */
.wsv2-tpl-knobs{display:flex;flex-direction:column;gap:14px;margin-top:6px}
.wsv2-kfld{display:flex;flex-direction:column;gap:6px}
.wsv2-kfld-lab{font-family:var(--wsv2-mono);font-size:10.5px;color:var(--wsv2-red);letter-spacing:.14em;text-transform:uppercase;font-weight:700;display:flex;align-items:center;gap:6px;line-height:1}
.wsv2-kfld-lab .wsv2-req{color:var(--wsv2-red);font-size:8px}
/* Dropdown box — single row value + caret on the right; click anywhere on box opens menu */
.wsv2-kchip{position:relative;padding:10px 32px 10px 14px;border:1px solid var(--wsv2-line);background:var(--wsv2-bg-1);font-family:var(--wsv2-sans);cursor:pointer;display:flex;align-items:center;color:var(--wsv2-ink);min-width:0}
.wsv2-kchip:hover{border-color:var(--wsv2-red)}
.wsv2-kchip-v{font-size:12px;color:var(--wsv2-ink);font-weight:500;line-height:1.3;letter-spacing:.02em;white-space:normal;word-break:break-word;flex:1;font-family:var(--wsv2-mono);text-transform:uppercase}
.wsv2-kchip-car{position:absolute;top:50%;right:12px;transform:translateY(-50%);color:var(--wsv2-ink-3);font-size:10px;line-height:1;transition:color .15s ease}
.wsv2-kchip:hover .wsv2-kchip-car{color:var(--wsv2-red)}
.wsv2-kchip.wsv2-kchip-open{border-color:var(--wsv2-red);background:rgba(230,57,70,.06);z-index:10}
.wsv2-kchip.wsv2-kchip-open .wsv2-kchip-car{color:var(--wsv2-red);transform:translateY(-50%) rotate(180deg)}
.wsv2-kchip.wsv2-set{border-color:var(--wsv2-red);background:rgba(230,57,70,.06)}
.wsv2-kchip-upload{border-style:dashed;color:var(--wsv2-ink-3);padding:10px 14px}
.wsv2-kchip-upload .wsv2-kchip-v{flex:0 1 auto}
.wsv2-kchip-style{border-color:var(--wsv2-red);border-style:dashed;min-height:46px}
.wsv2-kchip-style .wsv2-kchip-v{text-transform:none;font-family:var(--wsv2-sans);font-size:15px;font-weight:600;letter-spacing:0}
.wsv2-kchip-number{padding:7px 8px;gap:8px;cursor:default}
.wsv2-kchip-number:hover{border-color:var(--wsv2-line)}
.wsv2-kchip-num-input{min-width:0;flex:1;height:30px;border:0;background:transparent;color:var(--wsv2-ink);font-family:var(--wsv2-mono);font-size:14px;font-weight:700;text-align:center;outline:none}
/* Free-text chip — replaces the misleading "▾ -" dropdown look for slots without enumerated options. */
.wsv2-kchip-text{padding:0;cursor:text;align-items:stretch}
.wsv2-kchip-text:hover{border-color:var(--wsv2-red)}
.wsv2-kchip-text-input{min-width:0;width:100%;border:0;background:transparent;color:var(--wsv2-ink);font-family:var(--wsv2-sans);font-size:13px;line-height:1.4;outline:none;padding:10px 14px;resize:none}
.wsv2-kchip-text-input::placeholder{color:var(--wsv2-ink-3);font-family:var(--wsv2-mono);font-size:12px;text-transform:uppercase;letter-spacing:.02em}
textarea.wsv2-kchip-text-input{resize:vertical;min-height:48px}
.wsv2-num-step{width:30px;height:30px;border:1px solid var(--wsv2-line);background:transparent;color:var(--wsv2-ink-2);font-family:var(--wsv2-mono);font-size:16px;font-weight:700;line-height:1;cursor:pointer}
.wsv2-num-step:hover{border-color:var(--wsv2-red);color:var(--wsv2-red)}
.wsv2-kchip-fixed{cursor:default;padding-right:14px;background:rgba(255,255,255,.02)}
.wsv2-kchip-fixed:hover{border-color:var(--wsv2-line)}
.wsv2-style-pick-ico{width:20px;height:20px;display:inline-flex;align-items:center;justify-content:center;margin-right:10px;font-size:0;line-height:1;color:var(--wsv2-ink-2)}
.wsv2-style-pick-ico svg{width:19px;height:19px;display:block}
.wsv2-style-pick-ico::before{content:'';width:18px;height:18px;display:block;background:currentColor;mask:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Crect x='3' y='5' width='18' height='14' rx='1.5'/%3E%3Ccircle cx='8' cy='10' r='1.4'/%3E%3Cpath d='M21 15l-5-5L6 19'/%3E%3C/svg%3E") center/contain no-repeat}
.wsv2-style-pick-ico svg + *{display:none}
.wsv2-runtime-ref-strip{display:flex;gap:8px;flex-wrap:wrap;margin-top:8px}
.wsv2-runtime-ref-thumb{position:relative;width:58px;height:58px;border:1px solid var(--wsv2-red);background:#000;overflow:visible}
.wsv2-runtime-ref-thumb img{width:100%;height:100%;object-fit:cover;display:block}
.wsv2-runtime-ref-thumb em{position:absolute;left:0;bottom:0;min-width:15px;height:15px;padding-top:1px;background:rgba(0,0,0,.78);color:var(--wsv2-gold);font-family:var(--wsv2-mono);font-size:9px;font-style:normal;text-align:center;line-height:14px}
.wsv2-runtime-ref-thumb button{position:absolute;top:-7px;right:-7px;width:18px;height:18px;border:1px solid #000;background:var(--wsv2-red);color:#fff;display:flex;align-items:center;justify-content:center;padding:0;line-height:1;cursor:pointer;font-size:14px}
.wsv2-runtime-ref-thumb button:hover{background:var(--wsv2-gold);color:#000}
.wsv2-runtime-ref-thumb-loading{display:flex;align-items:center;justify-content:center;border-style:dashed;background:var(--wsv2-bg-1)}
/* Dropdown menu — anchored under chip box; renders chip's options on click. */
.wsv2-kchip-menu{position:absolute;top:calc(100% + 6px);left:0;min-width:100%;max-width:340px;background:var(--wsv2-bg-1);border:1px solid var(--wsv2-line);z-index:50;max-height:260px;overflow-y:auto;box-shadow:0 14px 32px rgba(0,0,0,.7);scrollbar-width:thin}
.wsv2-kchip-mitem{padding:9px 13px;font-family:var(--wsv2-sans);font-size:11.5px;letter-spacing:.02em;color:var(--wsv2-ink-2);cursor:pointer;transition:background .12s ease,color .12s ease;line-height:1.3;text-transform:none}
.wsv2-kchip-mitem:hover{background:rgba(230,57,70,.14);color:var(--wsv2-ink)}
.wsv2-kchip-mitem.active{background:var(--wsv2-red);color:#000;font-weight:700}
.wsv2-kchip-mitem.active:hover{background:var(--wsv2-red);color:#000}
.wsv2-kchip-upload:hover{color:var(--wsv2-red);border-color:var(--wsv2-red)}

.wsv2-style-picker{position:fixed;inset:0;z-index:10040;background:rgba(0,0,0,.82);display:flex;align-items:center;justify-content:center;padding:28px}
.wsv2-style-picker[hidden]{display:none}
.wsv2-style-panel{width:min(1240px,92vw);height:min(820px,86vh);background:var(--wsv2-bg-1);border:1px solid var(--wsv2-line);display:flex;flex-direction:column;box-shadow:0 24px 70px rgba(0,0,0,.65)}
.wsv2-style-head{height:58px;border-bottom:1px solid var(--wsv2-line);display:flex;align-items:center;justify-content:space-between;padding:0 18px 0 20px;color:var(--wsv2-ink-1)}
.wsv2-style-head h3{margin:0;font-family:var(--wsv2-sans);font-size:18px;font-weight:700;letter-spacing:0;color:var(--wsv2-ink-1)}
.wsv2-style-head > div{display:flex;gap:10px;align-items:center}
.wsv2-style-head button{border:1px solid var(--wsv2-line);background:transparent;color:var(--wsv2-ink-2);font-family:var(--wsv2-sans);font-size:14px;letter-spacing:0;font-weight:500;padding:10px 18px;cursor:pointer}
.wsv2-style-head .wsv2-style-x{width:42px;padding:10px 0;font-size:20px;line-height:1}
.wsv2-style-head button:hover{border-color:var(--wsv2-red);color:var(--wsv2-red)}
.wsv2-style-grid{flex:1;overflow:auto;padding:26px 30px;display:grid;grid-template-columns:repeat(4,minmax(190px,1fr));gap:28px}
.wsv2-style-card{display:flex;flex-direction:column;min-height:360px;width:100%;border:2px solid var(--wsv2-line);background:var(--wsv2-bg);padding:0;cursor:pointer;position:relative;overflow:hidden;text-align:left}
.wsv2-style-card:hover,.wsv2-style-card.selected{border-color:var(--wsv2-red);box-shadow:0 0 0 2px rgba(230,57,70,.18)}
.wsv2-style-card .style-card-visual{display:block;position:relative;aspect-ratio:3/4;background:var(--wsv2-bg-2);overflow:hidden;min-height:260px}
.wsv2-style-card .style-hero-img{opacity:1;position:absolute;inset:0;width:100%;height:100%;object-fit:cover;display:block;background:var(--wsv2-bg-2)}
.wsv2-style-card .wsv2-style-fallback{position:absolute;inset:0;display:grid;place-items:center;background:linear-gradient(135deg,#15151c,#302033);font-family:var(--wsv2-mono);font-size:10px;letter-spacing:.12em;color:var(--wsv2-ink-3);text-transform:uppercase}
.wsv2-style-card .style-name{font-size:13px;font-weight:650;letter-spacing:0}
.wsv2-style-card .comic-v2-scene-peek{bottom:36px;right:8px;width:96px}
.wsv2-style-card:hover .comic-v2-scene-peek{width:132px}
.wsv2-style-card.selected::before{display:none}
.wsv2-style-visual{display:block;position:relative;aspect-ratio:3/4;background:#000;overflow:hidden}
.wsv2-style-visual > img{width:100%;height:100%;object-fit:cover;display:block}
.wsv2-style-card-empty{width:100%;height:100%;background:linear-gradient(135deg,#15151c,#302033)}
.wsv2-style-mini{position:absolute;right:8px;bottom:40px;width:70px;height:52px;border:2px solid rgba(0,0,0,.75);box-shadow:0 4px 14px rgba(0,0,0,.55);overflow:hidden;background:#000}
.wsv2-style-mini img{width:100%;height:100%;object-fit:cover;display:block}
.wsv2-style-visual::after{content:'';position:absolute;left:0;right:0;bottom:0;height:44%;background:linear-gradient(to top,rgba(0,0,0,.82),transparent);pointer-events:none}
.wsv2-style-visual i{position:absolute;left:12px;right:12px;bottom:12px;z-index:2;font-style:normal;font-family:var(--wsv2-sans);font-size:13px;font-weight:750;line-height:1.25;color:#fff;text-align:left;text-shadow:0 1px 5px rgba(0,0,0,.8)}
.wsv2-style-card.selected::before{content:'✓';position:absolute;right:8px;top:8px;width:24px;height:24px;background:var(--wsv2-red);color:#fff;z-index:3;display:grid;place-items:center;font-weight:800}
.wsv2-style-empty{grid-column:1/-1;color:var(--wsv2-ink-3);font-family:var(--wsv2-mono);padding:30px;text-align:center}

.wsv2-tpl-adv{margin-top:4px;border-top:1px solid var(--wsv2-line);padding-top:12px}
.wsv2-tpl-adv summary{font-family:var(--wsv2-mono);font-size:10px;letter-spacing:.14em;color:var(--wsv2-ink-3);text-transform:uppercase;font-weight:700;cursor:pointer;list-style:none;display:flex;align-items:center;gap:6px}
.wsv2-tpl-adv summary::-webkit-details-marker{display:none}
.wsv2-tpl-adv summary::before{content:'▸';font-size:10px;color:var(--wsv2-red)}
.wsv2-tpl-adv[open] summary::before{content:'▾'}
.wsv2-tpl-adv summary:hover{color:var(--wsv2-red)}
.wsv2-tpl-adv-body{padding-top:10px;display:grid;grid-template-columns:1fr 1fr;gap:8px}
.wsv2-tpl-adv-fld label{font-family:var(--wsv2-mono);font-size:9px;letter-spacing:.1em;color:var(--wsv2-ink-3);text-transform:uppercase;font-weight:600;display:block;margin-bottom:4px}
.wsv2-tpl-adv-fld select{width:100%;padding:7px 10px;background:var(--wsv2-bg-1);border:1px solid var(--wsv2-line);color:var(--wsv2-ink);font-size:11.5px;font-family:var(--wsv2-sans);height:30px;-webkit-appearance:none;appearance:none}
.wsv2-tpl-adv-fld select:focus{border-color:var(--wsv2-red)}


/* RIGHT: state-driven canvas */
.wsv2-tpl-output{grid-area:output;padding:24px 28px;overflow-y:auto;background:#0a0b0e;display:flex;flex-direction:column;align-items:center;justify-content:center;position:relative;min-height:0}
/* result state 内容垂直居中（UI feedback 2026-04-30 — 用户偏好让生成结果在中间列居中而非贴顶，
   因为大图本身视觉重心在中央，贴顶会让下方留大片空白）。默认 .wsv2-tpl-output 已经是 center，
   不需要 result 状态特别覆盖。*/
.wsv2-tpl-output::before{content:'';position:absolute;inset:0;background:radial-gradient(ellipse 700px 500px at 50% 50%,rgba(230,57,70,.06),transparent 70%);pointer-events:none}
.wsv2-tpl-output > *{position:relative;z-index:1}

/* state 容器 max-width 不能太小卡死 art／actionbar；result:1200 让 actionbar 等组件撑大有气势，
   art 自己单独限 max-width:920 在容器内居中。 */
.wsv2-tpl-state{width:100%;max-width:560px;display:none}
.wsv2-tpl-pg[data-state="empty"] .wsv2-tpl-state-empty{display:flex;flex-direction:column;align-items:center;text-align:center;gap:18px}
.wsv2-tpl-pg[data-state="running"] .wsv2-tpl-state-running{display:flex;flex-direction:column;align-items:center;gap:16px;width:100%;max-width:560px}
.wsv2-tpl-pg[data-state="result"] .wsv2-tpl-state-result{display:flex;flex-direction:column;align-items:center;gap:12px;width:100%;max-width:1200px}

/* placeholder：max-height 用 vh 响应式 + max-width 限制；中等屏幕 ~520，大屏（1080+ 高）能撑到 ~640，避免占位过小。 */
.wsv2-tpl-placeholder{width:100%;max-width:560px;aspect-ratio:2/3;border:1.5px dashed var(--wsv2-red-3);background:linear-gradient(135deg,rgba(58,26,74,.4),rgba(160,32,240,.2));display:grid;place-items:center;position:relative;overflow:hidden;max-height:min(640px,calc(100vh - 320px))}
.wsv2-tpl-placeholder::before{content:'';position:absolute;inset:0;background:repeating-linear-gradient(45deg,transparent 0,transparent 20px,rgba(245,181,61,.04) 20px,rgba(245,181,61,.04) 21px)}
.wsv2-tpl-placeholder-stack{position:relative;z-index:1;display:flex;flex-direction:column;align-items:center;gap:14px}
.wsv2-tpl-placeholder-stack svg{width:54px;height:54px;color:var(--wsv2-red);opacity:.6}
.wsv2-tpl-placeholder-t1{font-family:var(--wsv2-display);font-weight:700;font-size:16px;letter-spacing:.16em;color:var(--wsv2-red);text-transform:uppercase}
.wsv2-tpl-placeholder-t2{font-family:var(--wsv2-mono);font-size:10px;letter-spacing:.12em;color:var(--wsv2-ink-3);text-transform:uppercase;max-width:280px;line-height:1.5}
.wsv2-tpl-est-row{display:flex;gap:24px;font-family:var(--wsv2-mono);font-size:10px;letter-spacing:.1em;color:var(--wsv2-ink-3);text-transform:uppercase}
.wsv2-tpl-state-empty .wsv2-tpl-est-row{display:none}
.wsv2-tpl-est-v{color:var(--wsv2-red);font-family:var(--wsv2-display);font-size:14px;font-weight:700;margin-left:5px}

.wsv2-tpl-render-frame{width:220px;aspect-ratio:1;background:transparent;position:relative;overflow:visible;border:0;max-height:none;display:flex;align-items:center;justify-content:center;flex-direction:column;gap:14px}
.wsv2-tpl-render-frame::before{content:'';width:48px;height:48px;border-radius:50%;border:4px solid rgba(230,57,70,.18);border-top-color:var(--wsv2-red);animation:wsv2RefSpin .8s linear infinite}
.wsv2-tpl-render-frame::after{content:attr(data-render-text);font-family:var(--wsv2-mono);font-size:11px;letter-spacing:.1em;color:var(--wsv2-ink-2);text-transform:uppercase;text-align:center;line-height:1.45}
.wsv2-tpl-grid-overlay{position:absolute;inset:8px;border:1px dashed var(--wsv2-red);display:grid;grid-template-columns:repeat(4, minmax(0, 1fr));grid-template-rows:repeat(4, minmax(0, 1fr));gap:4px;padding:8px}
.wsv2-tpl-grid-overlay > div:nth-child(odd){background:rgba(245,181,61,.08)}
.wsv2-tpl-grid-overlay > div:nth-child(3n){background:rgba(230,57,70,.12)}
.wsv2-tpl-scan{position:absolute;left:0;right:0;height:2px;background:var(--wsv2-red);box-shadow:0 0 18px var(--wsv2-red);animation:wsv2ScanY 2.4s ease-in-out infinite alternate}
@keyframes wsv2ScanY{from{top:10%}to{top:88%}}
.wsv2-tpl-pct-tag{position:absolute;left:8px;top:8px;font-family:var(--wsv2-mono);font-size:9px;letter-spacing:.14em;color:var(--wsv2-gold);text-transform:uppercase;background:rgba(0,0,0,.7);padding:3px 6px;font-weight:700}
.wsv2-tpl-grid-overlay,.wsv2-tpl-scan,.wsv2-tpl-pct-tag{display:none}

.wsv2-tpl-progress{width:100%;display:flex;align-items:center;gap:10px;font-family:var(--wsv2-mono);font-size:9.5px;letter-spacing:.1em;color:var(--wsv2-ink-3);text-transform:uppercase}
.wsv2-tpl-progress-bar{flex:1;height:4px;background:var(--wsv2-bg-2);position:relative;overflow:hidden}
.wsv2-tpl-progress-fill{position:absolute;inset:0 32% 0 0;background:linear-gradient(90deg,var(--wsv2-red),var(--wsv2-gold))}
.wsv2-tpl-progress b{color:var(--wsv2-red);font-family:var(--wsv2-display);font-size:11px;font-weight:700}
.wsv2-tpl-narration{width:100%;display:flex;flex-direction:column;gap:4px;padding:10px 14px;background:var(--wsv2-bg-1);border:1px solid var(--wsv2-line);font-family:var(--wsv2-mono);font-size:10.5px;color:var(--wsv2-ink-2);letter-spacing:.02em}
.wsv2-tpl-narration-step{display:flex;align-items:center;gap:8px}
.wsv2-tpl-narration-ic{color:var(--wsv2-ok);font-weight:800;width:14px}
.wsv2-tpl-narration-step.wsv2-now .wsv2-tpl-narration-ic{color:var(--wsv2-red)}
.wsv2-tpl-narration-step.wsv2-next .wsv2-tpl-narration-ic{color:var(--wsv2-ink-3)}
.wsv2-tpl-narration-step.wsv2-next{color:var(--wsv2-ink-3)}
.wsv2-tpl-narration{display:none}

/* Result-art container — clean black frame; img/video fills it via object-fit:contain.
   Aspect-ratio left flexible (no fixed 2/3) so portrait/landscape both fit.
   art 不限 max-width 让其跟随 .wsv2-tpl-state-result 的 1200px 上限充分利用大屏，
   max-height: min(720, calc(100vh - 240)) 给图片更多垂直空间（UI feedback 2026-04-30）。*/
.wsv2-tpl-result-art{width:100%;background:#000;border:1px solid var(--wsv2-line);position:relative;overflow:hidden;display:flex;align-items:center;justify-content:center;min-height:260px;max-height:min(720px,calc(100vh - 240px))}
.wsv2-tpl-result-art .wsv2-tpl-result-img,.wsv2-tpl-result-art .wsv2-tpl-result-vid{transition:opacity .15s ease}
.wsv2-tpl-result-art.wsv2-art-loading .wsv2-tpl-result-img,.wsv2-tpl-result-art.wsv2-art-loading .wsv2-tpl-result-vid{opacity:.4}
.wsv2-tpl-result-art.wsv2-art-loading::before{content:'';position:absolute;top:50%;left:50%;width:36px;height:36px;margin:-18px 0 0 -18px;border:3px solid rgba(230,57,70,.18);border-top-color:var(--wsv2-red);border-radius:50%;animation:wsv2RefSpin .8s linear infinite;z-index:3;pointer-events:none}
/* img/vid 自身 background 留 transparent，让 .wsv2-tpl-result-art 父容器的颜色显出来
   （dark 主题父 #000 / light 主题父 var(--p5-frame) 浅米）。否则 object-fit:contain 留白
   被 img 自己的 #000 背景覆盖，light 主题图片两侧仍显黑色。2026-05-07 sxy fix。*/
.wsv2-tpl-result-img,.wsv2-tpl-result-vid{display:block;width:100%;height:100%;max-height:min(720px,calc(100vh - 240px));object-fit:contain;background:transparent}
.wsv2-tpl-result-text{position:absolute;inset:14px;overflow:auto;padding:14px;font-family:var(--wsv2-mono);font-size:11px;line-height:1.55;color:var(--wsv2-ink-2);white-space:pre-wrap;background:rgba(0,0,0,.5)}
.wsv2-tpl-result-footer{position:absolute;left:8px;bottom:8px;font-family:var(--wsv2-mono);font-size:8.5px;letter-spacing:.16em;color:var(--wsv2-gold);text-transform:uppercase;background:rgba(0,0,0,.7);padding:3px 7px;font-weight:700;pointer-events:none;z-index:2}
.wsv2-tpl-result-footer:empty{display:none}
.wsv2-tpl-result-footer b{color:var(--wsv2-red)}
.wsv2-result-tools{position:absolute;right:10px;top:10px;display:flex;gap:7px;z-index:3}
.wsv2-result-tools button{width:45px;height:45px;border:1px solid rgba(255,255,255,.2);background:rgba(0,0,0,.72);color:var(--wsv2-ink-1);display:grid;place-items:center;cursor:pointer}
.wsv2-result-tools button:hover{border-color:var(--wsv2-red);color:var(--wsv2-red);background:rgba(0,0,0,.86)}
.wsv2-result-tools button.active{border-color:var(--wsv2-red);color:var(--wsv2-red);background:rgba(230,57,70,.18)}
.wsv2-result-tools svg{width:23px;height:23px}
.wsv2-result-strip{width:100%;display:flex;gap:6px;overflow-x:auto;padding:0;min-height:52px}
.wsv2-result-strip:empty{display:none}
/* Per-run candidates strip (Midjourney returns 4 per call; hidden when run has only 1 result). */
.wsv2-tpl-candidates{width:100%;display:flex;gap:6px;overflow-x:auto;padding:0}
.wsv2-tpl-candidates[hidden]{display:none}
.wsv2-tpl-cand{width:72px;height:72px;flex:0 0 72px;border:1px solid var(--wsv2-line);background:#000;padding:0;cursor:pointer;overflow:hidden;position:relative;display:block}
.wsv2-tpl-cand:hover,.wsv2-tpl-cand.wsv2-cur{border-color:var(--wsv2-red)}
.wsv2-tpl-cand img,.wsv2-tpl-cand video{width:100%;height:100%;object-fit:cover;display:block}
.wsv2-rthumb{width:52px;height:52px;flex:0 0 52px;border:1px solid var(--wsv2-line);background:#000;display:grid;place-items:center;overflow:hidden;cursor:pointer;position:relative}
.wsv2-rthumb-video{width:124px;height:70px;flex-basis:124px}
.wsv2-rthumb:hover,.wsv2-rthumb.wsv2-cur{border-color:var(--wsv2-red)}
.wsv2-rthumb img{width:100%;height:100%;object-fit:cover;display:block}
.wsv2-rthumb video{width:100%;height:100%;object-fit:cover;display:block;background:#000}
.wsv2-rthumb span{position:absolute;left:3px;bottom:2px;font-family:var(--wsv2-mono);font-size:8px;color:var(--wsv2-gold);background:rgba(0,0,0,.65);padding:1px 3px}
.wsv2-result-actionbar{width:100%;display:grid;grid-template-columns:repeat(5,minmax(0,1fr));gap:8px}
.wsv2-result-actionbar button{height:38px;border:1px solid var(--wsv2-line);background:var(--wsv2-bg-1);color:var(--wsv2-ink-2);font-family:var(--wsv2-mono);font-size:9.5px;letter-spacing:.08em;font-weight:800;display:inline-flex;align-items:center;justify-content:center;gap:6px;cursor:pointer;white-space:nowrap}
.wsv2-result-actionbar button:hover{border-color:var(--wsv2-red);color:var(--wsv2-red)}
.wsv2-result-actionbar button.active{border-color:var(--wsv2-red);background:rgba(230,57,70,.14);color:var(--wsv2-red)}
.wsv2-result-actionbar button.danger:hover{background:rgba(230,57,70,.16)}
.wsv2-result-actionbar svg{width:15px;height:15px;flex:0 0 auto}

.wsv2-tpl-result-actions{width:100%;display:flex;gap:6px}
.wsv2-tpl-result-actions button{flex:1;padding:9px;font-family:var(--wsv2-mono);font-size:10px;letter-spacing:.12em;text-transform:uppercase;font-weight:700;border:1px solid var(--wsv2-line);background:var(--wsv2-bg-1);color:var(--wsv2-ink-2);display:inline-flex;align-items:center;justify-content:center;gap:5px}
.wsv2-tpl-result-actions button:hover{border-color:var(--wsv2-red);color:var(--wsv2-red)}
.wsv2-tpl-result-actions button svg{width:11px;height:11px}

/* cta 占 body grid 的 "cta" area（col 1 row 2），宽度由 col 1 的 380px 自动约束，
   不需要再写 width:380；border-right 也不需要（右侧紧贴 output 列，由 output 自身可视化）。
   sxy 00a8f35 的设计意图保留：cta 只在 input 列下方，不跨全屏底栏。 */
.wsv2-tpl-cta{grid-area:cta;padding:12px 24px;border-top:1px solid var(--wsv2-line);background:var(--wsv2-bg-1);display:flex;align-items:center;justify-content:center;gap:14px;flex-shrink:0}
.wsv2-tpl-modelhint{display:inline-flex;align-items:center;gap:6px;font-family:var(--wsv2-mono);font-size:10px;letter-spacing:.08em;text-transform:uppercase;color:rgba(255,255,255,.6);position:relative;cursor:default}
.wsv2-tpl-modelhint-q{display:inline-flex;align-items:center;justify-content:center;width:16px;height:16px;background:var(--wsv2-red);color:#fff;font-family:var(--wsv2-serif);font-style:italic;font-weight:700;font-size:11px;line-height:1;cursor:help;outline:0;flex:0 0 auto}
.wsv2-tpl-modelhint-q:hover,.wsv2-tpl-modelhint-q:focus-visible{background:var(--wsv2-red-2,#ff6b6b)}
.wsv2-tpl-modelhint-lab{white-space:nowrap}
.wsv2-tpl-modelhint-pop{display:none;position:absolute;bottom:calc(100% + 8px);left:0;width:300px;padding:12px 14px;background:var(--wsv2-bg-2,#1a0f1d);border:1px solid var(--wsv2-red);color:var(--wsv2-fg,#f0e5e7);font-family:var(--wsv2-sans);font-size:12px;font-weight:400;line-height:1.55;letter-spacing:0;text-transform:none;text-align:left;z-index:30;box-shadow:0 6px 20px rgba(0,0,0,.45)}
.wsv2-tpl-modelhint-pop strong{display:block;color:var(--wsv2-red);font-family:var(--wsv2-display);font-size:11px;letter-spacing:.1em;text-transform:uppercase;margin-bottom:6px}
.wsv2-tpl-modelhint-pop ul{margin:0;padding-left:18px}
.wsv2-tpl-modelhint-pop li{margin:3px 0}
.wsv2-tpl-modelhint-pop p{margin:8px 0 0;color:rgba(255,255,255,.7);font-size:11px}
.wsv2-tpl-modelhint:hover .wsv2-tpl-modelhint-pop,.wsv2-tpl-modelhint:focus-within .wsv2-tpl-modelhint-pop{display:block}
.wsv2-tpl-summary{display:none}
.wsv2-tpl-summary b{color:var(--wsv2-red);font-family:var(--wsv2-display);font-size:13px;font-weight:700}
.wsv2-tpl-run-btn{height:38px;padding:0 22px;background:var(--wsv2-red);color:#000;font-family:var(--wsv2-display);font-weight:800;font-size:14px;letter-spacing:.14em;text-transform:uppercase;display:inline-flex;align-items:center;gap:8px}
.wsv2-tpl-run-btn:hover{background:var(--wsv2-gold)}
/* 防抖 lock 视觉：disabled / wsv2-busy / wsv2-is-submitting 状态置灰 + not-allowed
   两套 class 并存：JS runBtn 用 wsv2-busy（rules-global pattern #253），
   tpl GENERATE/dryRun 等老接口用 wsv2-is-submitting，CSS 选择器列表里都列出。 */
.wsv2-tpl-run-btn:disabled,.wsv2-tpl-run-btn.wsv2-busy,.wsv2-tpl-run-btn.wsv2-is-submitting{opacity:.5;cursor:not-allowed;pointer-events:none}
.wsv2-tpl-run-btn:disabled:hover,.wsv2-tpl-run-btn.wsv2-busy:hover,.wsv2-tpl-run-btn.wsv2-is-submitting:hover{background:var(--wsv2-red)}
/* 价格标签 — RUN 按钮内追加显示扣费金额（跟 V1 .btn-price 同范式：纯透明度，无底色） */
.wsv2-tpl-run-price{margin-left:6px;font-family:var(--wsv2-mono);font-size:11px;font-weight:700;letter-spacing:.06em;opacity:.8}
.wsv2-tpl-run-price s{opacity:.6;margin-right:4px}
.wsv2-tpl-run-btn.wsv2-cancel .wsv2-tpl-run-price{display:none}
.wsv2-tpl-run-btn svg{width:12px;height:12px}
.wsv2-tpl-run-btn.wsv2-cancel{background:var(--wsv2-bg-2);color:var(--wsv2-ink);border:1px solid var(--wsv2-red)}
.wsv2-tpl-run-btn.wsv2-cancel:hover{background:var(--wsv2-red);color:#000}
/* Locked state — image/video upstream API call already burned $$$, cancel
   would not refund. Greyed + non-red border. pointer-events:auto keeps the
   native title tooltip discoverable on hover. */
.wsv2-tpl-run-btn.wsv2-cancel.wsv2-cancel-locked,
.wsv2-tpl-run-btn.wsv2-cancel.wsv2-cancel-locked:hover{
  background:var(--wsv2-bg-2);color:var(--wsv2-muted, #6b6b6b);
  border-color:var(--wsv2-muted, #6b6b6b);opacity:.55;
  cursor:not-allowed;pointer-events:auto;
}
/* result/running state：cta 保持 in-flow（grid row 3 auto，占据底部高度），不再 absolute 浮起。
   原 absolute 浮按钮在小屏 / 内容长时会覆盖 input 列底部表单（高品质等选项被遮挡），
   in-flow 模式按钮自然 push 内容上去。RUN 按钮尺寸稍大保留视觉差异。 */
.wsv2-tpl-pg[data-state="result"] .wsv2-tpl-run-btn{height:42px;min-width:166px;padding:0 22px;box-shadow:0 6px 18px rgba(0,0,0,.25)}
.wsv2-tpl-pg[data-state="running"] .wsv2-tpl-run-btn{height:42px;min-width:166px;padding:0 22px;box-shadow:0 6px 18px rgba(0,0,0,.25);background:var(--wsv2-bg-2);color:var(--wsv2-ink);border:1px solid var(--wsv2-red)}
.wsv2-tpl-loading{position:absolute;left:0;right:0;top:44px;bottom:0;background:rgba(10,10,14,.86);backdrop-filter:blur(3px);-webkit-backdrop-filter:blur(3px);display:flex;flex-direction:column;align-items:center;justify-content:center;gap:14px;z-index:10030;pointer-events:auto;animation:wsv2TplLoadingFadeIn .14s ease-out}
.wsv2-tpl-loading[hidden]{display:none}
.wsv2-tpl-loading-ring{width:34px;height:34px;border-radius:50%;border:3px solid rgba(230,57,70,.18);border-top-color:var(--wsv2-red);animation:wsv2RefSpin .8s linear infinite}
.wsv2-tpl-loading-text{font-family:var(--wsv2-mono);font-size:11px;letter-spacing:.12em;color:rgba(255,255,255,.78);text-transform:uppercase}
.wsv2-tpl-pg.wsv2-loading .wsv2-tpl-body,
.wsv2-tpl-pg.wsv2-loading .wsv2-tpl-cta{visibility:hidden}
.wsv2-gc-tpl-pg.wsv2-loading .wsv2-gc-input,
.wsv2-gc-tpl-pg.wsv2-loading .wsv2-gc-board,
.wsv2-gc-tpl-pg.wsv2-loading .wsv2-gc-side{visibility:hidden}
@keyframes wsv2TplLoadingFadeIn{from{opacity:0}to{opacity:1}}
.wsv2-prompt-modal,.wsv2-lightbox{position:fixed;inset:0;z-index:9999;background:rgba(0,0,0,.78);display:grid;place-items:center;padding:28px}
.wsv2-lightbox-loading{width:56px;height:56px;border-radius:50%;border:4px solid rgba(255,255,255,.18);border-top-color:var(--wsv2-red);animation:wsv2RefSpin .8s linear infinite}
.wsv2-lightbox-loading[hidden]{display:none}
.wsv2-prompt-modal[hidden],.wsv2-lightbox[hidden]{display:none}
.wsv2-prompt-panel{width:min(760px,92vw);height:min(620px,86vh);background:var(--wsv2-bg-1);border:1px solid var(--wsv2-line);display:flex;flex-direction:column}
.wsv2-share-panel{width:min(520px,92vw);height:auto;max-height:86vh}
.wsv2-prompt-head{height:48px;border-bottom:1px solid var(--wsv2-line);display:flex;align-items:center;justify-content:space-between;padding:0 14px;font-family:var(--wsv2-display);font-size:13px;letter-spacing:.12em;color:var(--wsv2-ink-1)}
.wsv2-prompt-head button,.wsv2-prompt-actions button{border:1px solid var(--wsv2-line);background:transparent;color:var(--wsv2-ink-2);font-family:var(--wsv2-mono);font-size:10px;letter-spacing:.1em;font-weight:700;padding:8px 12px;cursor:pointer}
.wsv2-prompt-head button:hover,.wsv2-prompt-actions button:hover{border-color:var(--wsv2-red);color:var(--wsv2-red)}
.wsv2-prompt-panel textarea{flex:1;margin:14px;background:#08090b;border:1px solid var(--wsv2-line);color:var(--wsv2-ink-1);font-family:var(--wsv2-mono);font-size:12px;line-height:1.6;padding:14px;resize:none;outline:none}
.wsv2-prompt-panel textarea:focus{border-color:var(--wsv2-red)}
.wsv2-prompt-actions{height:58px;border-top:1px solid var(--wsv2-line);display:flex;align-items:center;justify-content:flex-end;gap:8px;padding:0 14px}
.wsv2-prompt-actions .wsv2-primary{background:var(--wsv2-red);border-color:var(--wsv2-red);color:#050507}
.wsv2-prompt-actions .wsv2-primary:hover{background:var(--wsv2-red);border-color:var(--wsv2-red);color:#fff}
.wsv2-prompt-actions button:disabled{opacity:.55;cursor:not-allowed}
.wsv2-prompt-actions .wsv2-primary.wsv2-is-loading{position:relative;color:#fff;pointer-events:none;opacity:.78;padding-left:34px}
.wsv2-prompt-actions .wsv2-primary.wsv2-is-loading::before{content:'';position:absolute;left:12px;top:50%;width:12px;height:12px;margin-top:-6px;border-radius:50%;border:2px solid rgba(255,255,255,.28);border-top-color:#fff;animation:wsv2RefSpin .75s linear infinite}
.wsv2-share-body{display:grid;gap:12px;padding:16px;overflow:auto}
.wsv2-share-body label{display:grid;gap:6px;color:var(--wsv2-red);font-family:var(--wsv2-mono);font-size:9px;font-weight:800;letter-spacing:.14em;text-transform:uppercase}
.wsv2-share-body input,.wsv2-share-body textarea{width:100%;border:1px solid var(--wsv2-line);background:#08090b;color:var(--wsv2-ink);padding:9px 10px;font-family:var(--wsv2-sans);font-size:12px;line-height:1.45;outline:none;resize:vertical}
.wsv2-share-body input:focus,.wsv2-share-body textarea:focus{border-color:var(--wsv2-red)}
.wsv2-share-body p{margin:0;color:var(--wsv2-ink-3);font-family:var(--wsv2-sans);font-size:12px;line-height:1.45}
.wsv2-share-avatar-row{display:flex;align-items:center;gap:12px;min-width:0}
.wsv2-share-avatar-preview{position:relative;width:54px;height:54px;flex:0 0 54px;border:1px solid var(--wsv2-line);background:var(--wsv2-bg);color:var(--wsv2-ink-3);display:grid;place-items:center;overflow:hidden;border-radius:50%;padding:0}
.wsv2-share-avatar-preview:hover{border-color:var(--wsv2-red);color:var(--wsv2-red)}
.wsv2-share-avatar-preview:disabled{opacity:.65;cursor:wait}
.wsv2-share-avatar-preview img{width:100%;height:100%;object-fit:cover;display:block;border-radius:50%}
.wsv2-share-avatar-preview img[hidden],.wsv2-share-avatar-preview svg[hidden]{display:none}
.wsv2-share-avatar-preview svg{width:28px;height:28px;display:block}
.wsv2-share-avatar-preview .wsv2-ref-card-spinner{position:absolute;width:22px;height:22px}
.wsv2-share-avatar-preview.has-image .wsv2-ref-card-spinner{background:var(--wsv2-bg)}
.wsv2-share-avatar-upload{height:34px;padding:0 12px;border:1px solid var(--wsv2-line);background:var(--wsv2-bg-1);color:var(--wsv2-ink-2);font-family:var(--wsv2-mono);font-size:10px;font-weight:800;letter-spacing:.1em;text-transform:uppercase}
.wsv2-share-avatar-upload:hover{border-color:var(--wsv2-red);color:var(--wsv2-red)}
.wsv2-share-avatar-upload:disabled{opacity:.55;cursor:wait}

/* GroupCombo DAG review gate — shown before PE generation / charging begins */
.wsv2-gc-review-modal{position:fixed;inset:0;z-index:10050;background:rgba(0,0,0,.82);display:grid;place-items:center;padding:28px}
.wsv2-gc-review-panel{width:min(900px,94vw);max-height:min(820px,90vh);background:var(--wsv2-bg-1);border:1px solid var(--wsv2-red);box-shadow:0 28px 80px rgba(0,0,0,.68);display:flex;flex-direction:column;min-height:0}
.wsv2-gc-review-head{flex:0 0 auto;display:flex;align-items:flex-start;justify-content:space-between;gap:18px;padding:22px 24px 18px;border-bottom:1px solid var(--wsv2-line);background:var(--wsv2-bg-2)}
.wsv2-gc-review-head .eyebrow{display:block;font-family:var(--wsv2-mono);font-size:9px;letter-spacing:.18em;color:var(--wsv2-gold);text-transform:uppercase;font-weight:800;margin-bottom:8px}
.wsv2-gc-review-head h3{margin:0;font-family:var(--wsv2-display);font-size:24px;line-height:1.1;letter-spacing:.08em;color:var(--wsv2-red);text-transform:uppercase}
.wsv2-gc-review-head p{margin:8px 0 0;color:var(--wsv2-ink-3);font-family:var(--wsv2-sans);font-size:12px;line-height:1.55;max-width:600px}
.wsv2-gc-review-head .x{width:34px;height:34px;border:1px solid var(--wsv2-line);background:transparent;color:var(--wsv2-ink-3);font-family:var(--wsv2-display);font-size:20px;line-height:1;cursor:pointer}
.wsv2-gc-review-head .x:hover{border-color:var(--wsv2-red);color:var(--wsv2-red)}
.wsv2-gc-review-dr0{flex:0 0 auto;padding:14px 24px 12px;border-bottom:1px solid var(--wsv2-line);background:#0a0b0e;display:flex;flex-direction:column;gap:8px}
.wsv2-gc-review-dr0-summary{margin:0;font-family:var(--wsv2-sans);font-size:13px;line-height:1.55;color:var(--wsv2-ink);max-width:760px}
.wsv2-gc-review-dr0-recipe{display:flex;align-items:center;gap:10px;flex-wrap:wrap}
.wsv2-gc-review-dr0-recipe .lbl{font-family:var(--wsv2-mono);font-size:9px;letter-spacing:.16em;color:var(--wsv2-ink-3);text-transform:uppercase;font-weight:700}
.wsv2-gc-review-dr0-recipe code{font-family:var(--wsv2-mono);font-size:11px;letter-spacing:.04em;color:var(--wsv2-gold);background:transparent;padding:2px 8px;border:1px solid var(--wsv2-line)}
.wsv2-gc-review-dr0-recipe .conf{font-family:var(--wsv2-mono);font-size:10px;font-weight:700;letter-spacing:.06em;padding:2px 7px;border:1px solid var(--wsv2-line)}
.wsv2-gc-review-dr0-recipe .conf.is-high{color:#86efac;border-color:#22c55e44}
.wsv2-gc-review-dr0-recipe .conf.is-mid{color:var(--wsv2-gold);border-color:#eab30844}
.wsv2-gc-review-dr0-recipe .conf.is-low{color:#fda4af;border-color:#fb718544}
.wsv2-gc-review-dr0-images{display:flex;flex-wrap:wrap;gap:8px}
.wsv2-gc-review-dr0-images .chip{display:inline-flex;align-items:center;gap:8px;padding:4px 10px 4px 4px;border:1px solid var(--wsv2-line);background:#0d0f14}
.wsv2-gc-review-dr0-images .chip img{width:28px;height:28px;object-fit:cover;border:1px solid var(--wsv2-line)}
.wsv2-gc-review-dr0-images .chip span{font-family:var(--wsv2-mono);font-size:10px;letter-spacing:.04em;color:var(--wsv2-ink-2)}
.wsv2-gc-review-dr0-images .chip b{color:var(--wsv2-gold);margin-right:4px}
.wsv2-gc-review-dr0-conflict{padding:8px 12px;border:1px solid #fb718555;background:#fb71851a;color:#fda4af;font-family:var(--wsv2-mono);font-size:10.5px;letter-spacing:.04em}
.wsv2-gc-review-metrics{flex:0 0 auto;display:grid;grid-template-columns:repeat(3,minmax(0,1fr));border-bottom:1px solid var(--wsv2-line);background:#0a0b0e}
.wsv2-gc-review-metrics span{padding:12px 14px;border-right:1px solid var(--wsv2-line);font-family:var(--wsv2-mono);font-size:9.5px;letter-spacing:.12em;color:var(--wsv2-ink-3);text-transform:uppercase;font-weight:700}
.wsv2-gc-review-metrics span:last-child{border-right:0}
.wsv2-gc-review-metrics b{font-family:var(--wsv2-display);font-size:18px;color:var(--wsv2-gold);letter-spacing:.04em;margin-right:7px}
.wsv2-gc-review-flow{flex:1;min-height:0;overflow:auto;padding:18px 24px 8px;display:flex;flex-direction:column;gap:8px;scrollbar-gutter:stable}
.wsv2-gc-review-node{position:relative;display:grid;grid-template-columns:34px 42px minmax(0,1fr) auto;align-items:center;gap:12px;min-height:68px;padding:12px 14px;border:1px solid var(--wsv2-line);background:var(--wsv2-bg-1)}
.wsv2-gc-review-node:not(:last-child)::after{content:'';position:absolute;left:50px;bottom:-9px;width:1px;height:9px;background:var(--wsv2-line)}
.wsv2-gc-review-node .ord{font-family:var(--wsv2-display);font-size:13px;color:var(--wsv2-gold);font-weight:800;letter-spacing:.05em}
.wsv2-gc-review-node .ico{width:42px;height:42px;border:1px solid var(--wsv2-line);display:flex;align-items:center;justify-content:center;color:var(--wsv2-red);background:var(--wsv2-bg-2)}
.wsv2-gc-review-node .ico svg{width:22px;height:22px;display:block}
.wsv2-gc-review-node .txt{min-width:0;display:flex;flex-direction:column;gap:4px}
.wsv2-gc-review-node .txt b{font-family:var(--wsv2-display);font-size:15px;letter-spacing:.06em;color:var(--wsv2-ink);text-transform:uppercase;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.wsv2-gc-review-node .txt em{font-style:normal;color:var(--wsv2-ink-3);font-size:11.5px;line-height:1.45;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}
.wsv2-gc-review-node .meta{font-family:var(--wsv2-mono);font-size:9px;letter-spacing:.08em;color:var(--wsv2-ink-3);text-transform:uppercase;max-width:260px;text-align:right;line-height:1.45}
.wsv2-gc-review-node.is-internal{border-style:dashed;opacity:.76}
.wsv2-gc-review-node.is-video{border-color:rgba(245,181,61,.5);background:linear-gradient(90deg,rgba(245,181,61,.06),transparent)}
.wsv2-gc-review-node.is-output{border-color:var(--wsv2-red);background:rgba(230,57,70,.06)}
.wsv2-gc-review-web{flex:0 0 auto;margin:0 24px 10px;padding:10px 12px;border:1px solid var(--wsv2-line);background:var(--wsv2-bg-2);display:grid;grid-template-columns:auto auto minmax(0,1fr);align-items:center;gap:10px;font-family:var(--wsv2-mono);font-size:9.5px;letter-spacing:.08em;text-transform:uppercase;color:var(--wsv2-ink-3)}
.wsv2-gc-review-web .lab{color:var(--wsv2-red);font-weight:800;letter-spacing:.14em}
.wsv2-gc-review-web b{font-family:var(--wsv2-display);font-size:13px;letter-spacing:.08em;color:var(--wsv2-ink-2)}
.wsv2-gc-review-web em{min-width:0;font-style:normal;line-height:1.45;text-transform:none;letter-spacing:.04em}
.wsv2-gc-review-web.is-on{border-color:var(--wsv2-gold)}
.wsv2-gc-review-web.is-on b{color:var(--wsv2-gold)}
.wsv2-gc-review-note{flex:0 0 auto;margin:0 24px 16px;padding:10px 12px;border:1px solid var(--wsv2-line);font-family:var(--wsv2-mono);font-size:9.5px;line-height:1.55;letter-spacing:.06em;color:var(--wsv2-ink-3);text-transform:uppercase;background:#0a0b0e}
.wsv2-gc-review-actions{flex:0 0 auto;padding:14px 24px;border-top:1px solid var(--wsv2-line);display:flex;align-items:center;justify-content:flex-end;gap:10px;background:var(--wsv2-bg-2)}
.wsv2-gc-review-actions button{height:38px;padding:0 18px;border:1px solid var(--wsv2-line);background:transparent;color:var(--wsv2-ink-2);font-family:var(--wsv2-display);font-size:13px;letter-spacing:.12em;text-transform:uppercase;font-weight:800;cursor:pointer;display:inline-flex;align-items:center;justify-content:center}
.wsv2-gc-review-actions button:hover{border-color:var(--wsv2-red);color:var(--wsv2-red)}
.wsv2-gc-review-actions button.primary{min-width:190px;background:var(--wsv2-red);border-color:var(--wsv2-red);color:#050507}
.wsv2-gc-review-actions button.primary:hover{background:var(--wsv2-red-2);border-color:var(--wsv2-red-2);color:#050507}

/* ===== DR0 Demand Review Modal (Phase C of DR0 redesign) ===== */
/* Sibling of wsv2-gc-review-modal — sits BEFORE plan-review in BUILD flow */
.wsv2-dr0-review-modal{position:fixed;inset:0;z-index:10060;background:rgba(0,0,0,.85);display:grid;place-items:center;padding:28px}
.wsv2-dr0-review-panel{width:min(900px,94vw);max-height:min(820px,90vh);background:var(--wsv2-bg-1);border:1px solid var(--wsv2-red);box-shadow:0 28px 80px rgba(0,0,0,.7);display:flex;flex-direction:column;min-height:0}
.wsv2-dr0-review-head{flex:0 0 auto;display:flex;align-items:flex-start;justify-content:space-between;gap:18px;padding:22px 24px 18px;border-bottom:1px solid var(--wsv2-line);background:var(--wsv2-bg-2)}
.wsv2-dr0-review-head .eyebrow{display:block;font-family:var(--wsv2-mono);font-size:9px;letter-spacing:.18em;color:var(--wsv2-gold);text-transform:uppercase;font-weight:800;margin-bottom:8px}
.wsv2-dr0-review-head h3{margin:0;font-family:var(--wsv2-sans);font-size:14px;line-height:1.55;color:var(--wsv2-ink);font-weight:500;max-height:7.5em;overflow:hidden;display:-webkit-box;-webkit-line-clamp:5;-webkit-box-orient:vertical}
.wsv2-dr0-review-head p{margin:8px 0 0;color:var(--wsv2-ink-3);font-family:var(--wsv2-sans);font-size:12px;line-height:1.55;max-width:600px}
.wsv2-dr0-review-head .x{flex-shrink:0;width:36px;height:36px;border:1px solid var(--wsv2-ink-3);background:var(--wsv2-bg-1);color:var(--wsv2-ink);font-family:var(--wsv2-display);font-size:22px;line-height:1;cursor:pointer;display:inline-flex;align-items:center;justify-content:center;font-weight:700}
.wsv2-dr0-review-head .x:hover{border-color:var(--wsv2-red);background:var(--wsv2-red);color:#050507}
.wsv2-dr0-review-body{flex:1;min-height:0;overflow:auto;padding:18px 24px;display:flex;flex-direction:column;gap:18px;scrollbar-gutter:stable}
.wsv2-dr0-conflict{padding:10px 12px;border:1px solid var(--wsv2-gold);background:rgba(245,181,61,.08);color:var(--wsv2-gold);font-family:var(--wsv2-sans);font-size:12px;line-height:1.55}
.wsv2-dr0-images{display:flex;flex-direction:column;gap:10px}
.wsv2-dr0-image-row{display:grid;grid-template-columns:88px minmax(0,1fr);gap:14px;padding:12px;border:1px solid var(--wsv2-line);background:var(--wsv2-bg-2)}
.wsv2-dr0-image-row img{width:88px;height:88px;object-fit:cover;border:1px solid var(--wsv2-line);display:block}
.wsv2-dr0-image-row .ph{width:88px;height:88px;display:grid;place-items:center;border:1px solid var(--wsv2-line);color:var(--wsv2-ink-3);font-family:var(--wsv2-mono);font-size:9px}
.wsv2-dr0-image-row .info{display:flex;flex-direction:column;gap:6px;min-width:0}
.wsv2-dr0-image-row .role{font-family:var(--wsv2-mono);font-size:11px;letter-spacing:.08em;color:var(--wsv2-red);text-transform:uppercase;font-weight:700}
.wsv2-dr0-image-row .role b{color:var(--wsv2-gold);margin-right:6px}
.wsv2-dr0-image-row .vision{font-family:var(--wsv2-sans);font-size:12px;line-height:1.55;color:var(--wsv2-ink-2);display:-webkit-box;-webkit-line-clamp:3;-webkit-box-orient:vertical;overflow:hidden}
.wsv2-dr0-image-row .feats{display:flex;flex-wrap:wrap;gap:6px}
.wsv2-dr0-image-row .feats span{padding:2px 8px;border:1px solid var(--wsv2-line);font-family:var(--wsv2-mono);font-size:9.5px;letter-spacing:.06em;color:var(--wsv2-ink-3);text-transform:uppercase;background:var(--wsv2-bg-1)}
.wsv2-dr0-pipeline{display:flex;flex-direction:column;gap:12px}
.wsv2-dr0-pipeline .hd{display:flex;align-items:center;gap:10px;flex-wrap:wrap}
.wsv2-dr0-pipeline .hd .lbl{font-family:var(--wsv2-mono);font-size:9.5px;letter-spacing:.12em;color:var(--wsv2-ink-3);text-transform:uppercase;font-weight:700}
.wsv2-dr0-pipeline .hd .recipe{padding:4px 10px;border:1px solid var(--wsv2-red);background:rgba(230,57,70,.08);color:var(--wsv2-red);font-family:var(--wsv2-mono);font-size:11px;letter-spacing:.04em;font-weight:700;text-transform:uppercase}
.wsv2-dr0-pipeline .hd .conf{margin-left:auto;padding:4px 10px;border:1px solid var(--wsv2-line);font-family:var(--wsv2-mono);font-size:10px;letter-spacing:.06em;color:var(--wsv2-ink-3);font-weight:700}
.wsv2-dr0-pipeline .hd .conf.is-high{border-color:#4ade80;color:#4ade80}
.wsv2-dr0-pipeline .hd .conf.is-mid{border-color:var(--wsv2-gold);color:var(--wsv2-gold)}
.wsv2-dr0-pipeline .hd .conf.is-low{border-color:var(--wsv2-red);color:var(--wsv2-red)}
.wsv2-dr0-pipeline .rationale{margin:0;font-family:var(--wsv2-sans);font-size:13px;line-height:1.6;color:var(--wsv2-ink-2)}
.wsv2-dr0-steps{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:8px}
.wsv2-dr0-steps .step{position:relative;display:grid;grid-template-columns:38px minmax(0,1fr);gap:12px;align-items:center;padding:10px 12px;border:1px solid var(--wsv2-line);background:var(--wsv2-bg-2)}
.wsv2-dr0-steps .step:not(:last-child)::after{content:'';position:absolute;left:27px;bottom:-9px;width:1px;height:9px;background:var(--wsv2-line)}
.wsv2-dr0-steps .step .ord{font-family:var(--wsv2-display);font-size:13px;color:var(--wsv2-gold);font-weight:800;letter-spacing:.05em}
.wsv2-dr0-steps .step .title{display:flex;flex-direction:column;gap:3px;min-width:0}
.wsv2-dr0-steps .step .title b{font-family:var(--wsv2-display);font-size:14px;letter-spacing:.04em;color:var(--wsv2-ink)}
.wsv2-dr0-steps .step .title em{font-style:normal;font-family:var(--wsv2-sans);font-size:12px;line-height:1.5;color:var(--wsv2-ink-3)}
.wsv2-dr0-steps .step.is-image{border-left:3px solid var(--wsv2-red)}
.wsv2-dr0-steps .step.is-video{border-left:3px solid var(--wsv2-gold)}
.wsv2-dr0-steps .step.is-text{border-left:3px solid var(--wsv2-ink-3)}
.wsv2-dr0-know{padding:10px 12px;border:1px solid var(--wsv2-line);background:#0a0b0e}
.wsv2-dr0-know summary{font-family:var(--wsv2-mono);font-size:10px;letter-spacing:.12em;color:var(--wsv2-ink-3);text-transform:uppercase;cursor:pointer;list-style:none}
.wsv2-dr0-know summary::-webkit-details-marker{display:none}
.wsv2-dr0-know summary::before{content:'▸ ';color:var(--wsv2-red)}
.wsv2-dr0-know[open] summary::before{content:'▾ '}
.wsv2-dr0-know summary:hover{color:var(--wsv2-red)}
.wsv2-dr0-know ul{margin:10px 0 0;padding:0;list-style:none;display:flex;flex-direction:column;gap:4px}
.wsv2-dr0-know li{font-family:var(--wsv2-mono);font-size:10px;line-height:1.5;color:var(--wsv2-ink-3);word-break:break-all}
.wsv2-dr0-know li code{color:var(--wsv2-ink-2);background:transparent;padding:0;font-family:inherit}
.wsv2-dr0-review-actions{flex:0 0 auto;padding:14px 24px;border-top:1px solid var(--wsv2-line);display:flex;align-items:center;justify-content:flex-end;gap:10px;background:var(--wsv2-bg-2)}
.wsv2-dr0-review-actions button{height:38px;padding:0 18px;border:1px solid var(--wsv2-line);background:transparent;color:var(--wsv2-ink-2);font-family:var(--wsv2-display);font-size:13px;letter-spacing:.12em;text-transform:uppercase;font-weight:800;cursor:pointer;display:inline-flex;align-items:center;justify-content:center}
.wsv2-dr0-review-actions button:hover{border-color:var(--wsv2-red);color:var(--wsv2-red)}
.wsv2-dr0-review-actions button.primary{min-width:200px;background:var(--wsv2-red);border-color:var(--wsv2-red);color:#050507}
.wsv2-dr0-review-actions button.primary:hover{background:var(--wsv2-red-2);border-color:var(--wsv2-red-2);color:#050507}
@media (max-width:720px){
  .wsv2-dr0-review-modal{padding:12px}
  .wsv2-dr0-review-panel{width:100%;max-height:92vh}
  .wsv2-dr0-review-head{padding:16px}
  .wsv2-dr0-review-head h3{font-size:17px}
  .wsv2-dr0-review-body{padding:14px;gap:14px}
  .wsv2-dr0-image-row{grid-template-columns:64px minmax(0,1fr)}
  .wsv2-dr0-image-row img,.wsv2-dr0-image-row .ph{width:64px;height:64px}
  .wsv2-dr0-review-actions{padding:12px;flex-direction:column}
  .wsv2-dr0-review-actions button{width:100%}
}
.wsv2-lightbox img,.wsv2-lightbox video{max-width:96vw;max-height:92vh;object-fit:contain;background:#000}
.wsv2-lightbox-close{position:fixed;right:18px;top:16px;border:1px solid rgba(255,255,255,.24);background:rgba(0,0,0,.72);color:#fff;font-family:var(--wsv2-mono);font-size:10px;letter-spacing:.1em;padding:9px 12px;cursor:pointer;z-index:1}
.wsv2-lightbox-close:hover{border-color:var(--wsv2-red);color:var(--wsv2-red)}
.wsv2-lightbox-download{position:fixed;right:94px;top:16px;border:1px solid rgba(255,255,255,.24);background:rgba(0,0,0,.72);color:#fff;font-family:var(--wsv2-mono);font-size:10px;letter-spacing:.1em;text-transform:uppercase;padding:9px 12px;cursor:pointer;z-index:1}
.wsv2-lightbox-download:hover{border-color:var(--wsv2-red);color:var(--wsv2-red)}

/* ================================================================
   ============ S5 · GC TPL — GroupCombo Template Landing ============
   Phase 0 skeleton (2026-05-02). 4-state machine
   (empty / running / preview / result), 2-col body (input | board).
   Reuses wsv2-* tokens — no new colors.
   ================================================================ */

.wsv2-gc-tpl-pg{padding:0;height:100%;display:grid;grid-template-columns:380px minmax(0,1fr) 320px;grid-template-rows:44px minmax(0,1fr);position:relative;overflow:hidden}
.wsv2-gc-tpl-pg > .wsv2-tpl-nav{grid-column:1;grid-row:1;border-right:1px solid var(--wsv2-line);min-width:0}
.wsv2-gc-tpl-body{display:contents}
.wsv2-gc-input{grid-column:1;grid-row:2;padding:22px 24px;overflow-y:auto;scrollbar-gutter:stable;border-right:1px solid var(--wsv2-line);display:flex;flex-direction:column;gap:14px;min-height:0;background:var(--wsv2-bg-1)}
.wsv2-gc-board{grid-column:2;grid-row:1 / span 2;padding:24px 28px;overflow-y:auto;scrollbar-gutter:stable;background:#0a0b0e;display:flex;flex-direction:column;position:relative;min-height:0}
.wsv2-gc-board::before{content:'';position:absolute;inset:0;background:radial-gradient(ellipse 700px 500px at 50% 50%,rgba(230,57,70,.06),transparent 70%);pointer-events:none}
.wsv2-gc-board > *{position:relative;z-index:1}
.wsv2-gc-side{grid-column:3;grid-row:1 / span 2;border-left:1px solid var(--wsv2-line);background:#0a0b0e;display:flex;flex-direction:column;min-height:0;overflow:hidden}
.wsv2-gc-side-top{height:44px;border-bottom:1px solid var(--wsv2-line);display:flex;align-items:center;justify-content:flex-end;gap:8px;padding:0 12px;background:var(--wsv2-bg-1);flex:0 0 auto}
.wsv2-gc-side-top .wsv2-gc-meta-pill{margin:0}
.wsv2-gc-side-top .wsv2-tpl-share{height:24px;padding:0 9px;border:1px solid var(--wsv2-line);background:transparent;color:var(--wsv2-ink-2);font-family:var(--wsv2-mono);font-size:9px;letter-spacing:.12em;text-transform:uppercase;font-weight:700;display:inline-flex;align-items:center;gap:6px;cursor:pointer}
.wsv2-gc-side-top .wsv2-tpl-share:hover{border-color:var(--wsv2-red);color:var(--wsv2-red)}
.wsv2-gc-side-top .wsv2-tpl-share svg{width:13px;height:13px}
.wsv2-gc-creator-card{border-bottom:1px solid var(--wsv2-line);background:var(--wsv2-bg-0);padding:10px 12px}
.wsv2-gc-creator-head{width:100%;border:1px solid var(--wsv2-line);background:var(--wsv2-bg-1);color:var(--wsv2-ink);height:30px;padding:0 9px;display:flex;align-items:center;justify-content:space-between;gap:8px;font-family:var(--wsv2-mono);font-size:9px;font-weight:800;letter-spacing:.1em;text-transform:uppercase;cursor:pointer}
.wsv2-gc-creator-head:hover{border-color:var(--wsv2-red);color:var(--wsv2-red)}
.wsv2-gc-creator-head span:last-child{max-width:145px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:var(--wsv2-ink-3);letter-spacing:.04em}
.wsv2-gc-creator-body{margin-top:8px;display:grid;gap:8px}
.wsv2-gc-creator-body label{display:grid;gap:4px;color:var(--wsv2-red);font-family:var(--wsv2-mono);font-size:9px;font-weight:800;letter-spacing:.14em;text-transform:uppercase}
.wsv2-gc-creator-body input,.wsv2-gc-creator-body textarea{width:100%;border:1px solid var(--wsv2-line);background:var(--wsv2-bg-1);color:var(--wsv2-ink);padding:8px 9px;font-family:var(--wsv2-sans);font-size:12px;line-height:1.35;outline:none;resize:vertical}
.wsv2-gc-creator-body input:focus,.wsv2-gc-creator-body textarea:focus{border-color:var(--wsv2-red)}
.wsv2-gc-creator-body button{height:28px;border:1px solid var(--wsv2-red);background:transparent;color:var(--wsv2-red);font-family:var(--wsv2-mono);font-size:10px;font-weight:800;letter-spacing:.12em;text-transform:uppercase;cursor:pointer}
.wsv2-gc-creator-body button:hover{background:var(--wsv2-red);color:#fff}
.wsv2-gc-side-history{flex:1;min-height:0;overflow-y:auto;scrollbar-gutter:stable;padding:14px 12px 18px}
.wsv2-gc-side-cta{position:sticky;bottom:0;z-index:3;flex:0 0 auto;border-top:1px solid var(--wsv2-line);padding:12px;background:var(--wsv2-bg-1);display:flex;align-items:center;justify-content:stretch}
.wsv2-gc-side-cta .wsv2-tpl-run-btn{width:100%;justify-content:center}

/* state machine — only one visible at a time */
.wsv2-gc-board-state{display:none;flex-direction:column;gap:18px;flex:1;min-height:0}
.wsv2-gc-tpl-pg[data-state="empty"]    .wsv2-gc-state-empty,
.wsv2-gc-tpl-pg[data-state="running"]  .wsv2-gc-state-running,
.wsv2-gc-tpl-pg[data-state="preview"]  .wsv2-gc-state-result,
.wsv2-gc-tpl-pg[data-state="result"]   .wsv2-gc-state-result{display:flex}

/* — empty — */
.wsv2-gc-state-empty{align-items:center;justify-content:center}
.wsv2-gc-empty-frame{width:min(720px,86%);min-height:360px;padding:56px 42px;border:1px dashed var(--wsv2-line);text-align:center;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:22px;background:rgba(28,30,37,.28)}
.wsv2-gc-empty-frame svg{width:120px;height:120px;color:var(--wsv2-ink-3);opacity:.36}
.wsv2-gc-empty-frame h3{font-family:var(--wsv2-display);font-weight:600;font-size:32px;letter-spacing:.08em;color:var(--wsv2-red);text-transform:uppercase;margin:0}
.wsv2-gc-empty-frame p{font-family:var(--wsv2-mono);font-size:14px;letter-spacing:.06em;color:var(--wsv2-ink-3);max-width:520px;line-height:1.55;margin:0}
.wsv2-gc-empty-slots{display:none}

/* — running — */
.wsv2-gc-state-running{justify-content:flex-start;padding-top:16px;box-sizing:border-box}
.wsv2-gc-bn-head{display:flex;align-items:center;gap:14px;padding:14px 16px;border:1px solid var(--wsv2-line);background:var(--wsv2-bg-1);font-family:var(--wsv2-mono);font-size:11px;letter-spacing:.1em;text-transform:uppercase;color:var(--wsv2-ink-3)}
.wsv2-gc-bn-head .ord{color:var(--wsv2-red);font-family:var(--wsv2-display);font-weight:700;font-size:13px}
.wsv2-gc-bn-head .nm{flex:1;color:var(--wsv2-ink-2);text-transform:none;letter-spacing:0}
.wsv2-gc-bn-head .dur{color:var(--wsv2-gold);font-weight:800}
.wsv2-gc-bn-stage{display:block;flex:0 0 auto;min-height:0}
.wsv2-gc-bn-spinner{display:none}
.wsv2-gc-bn-narration{font-family:var(--wsv2-mono);font-size:11px;letter-spacing:.06em;color:var(--wsv2-ink-2);text-align:center;line-height:1.6;max-width:300px}
.wsv2-gc-bn-slots{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:10px;min-height:0;overflow:visible}

/* — result — 4-tab pane */
.wsv2-gc-result-tabs{display:flex;align-items:stretch;border:1px solid var(--wsv2-line);border-bottom:0;background:var(--wsv2-bg-1)}
.wsv2-gc-result-tabs button{padding:10px 16px;border:0;border-right:1px solid var(--wsv2-line);background:transparent;font-family:var(--wsv2-mono);font-size:10px;letter-spacing:.12em;color:var(--wsv2-ink-3);text-transform:uppercase;font-weight:700;cursor:pointer;transition:background .15s,color .15s;display:inline-flex;align-items:center;gap:6px}
.wsv2-gc-result-tabs button:hover{background:var(--wsv2-bg-2);color:var(--wsv2-ink-2)}
.wsv2-gc-result-tabs button.wsv2-on{background:var(--wsv2-red);color:#000}
.wsv2-gc-result-tabs button .cnt{color:var(--wsv2-gold);font-family:var(--wsv2-display);font-weight:700;font-size:11px;min-width:0}
.wsv2-gc-result-tabs button.wsv2-on .cnt{color:#000}
.wsv2-gc-result-tabs button .cnt:empty{display:none}
.wsv2-gc-result-tabs .wsv2-gc-result-fullscreen{margin-left:auto;border-left:1px solid var(--wsv2-line);border-right:0;padding:0 12px;color:var(--wsv2-ink-3)}
.wsv2-gc-result-tabs .wsv2-gc-result-fullscreen:hover{background:var(--wsv2-bg-2);color:var(--wsv2-red)}
.wsv2-gc-result-tabs .wsv2-gc-result-fullscreen svg{width:14px;height:14px}
.wsv2-gc-result-pane{display:none;border:1px solid var(--wsv2-line);background:var(--wsv2-bg-1);padding:18px;flex:1;overflow:auto;min-height:300px}
.wsv2-gc-result-pane.wsv2-on{display:block}

/* CTA running-only — only the cancel button uses this class now (status row removed) */
.wsv2-gc-running-only{display:none}
.wsv2-gc-tpl-pg[data-state="running"] .wsv2-gc-running-only{display:inline-flex;align-items:center;gap:4px}
.wsv2-gc-tpl-pg[data-state="running"] #wsv2GcRunBtn{display:none}
.wsv2-gc-tpl-pg:not([data-state="running"]) #wsv2GcCancelBtn{display:none}
/* Inline cost on the RUN button (replaces the old EST/COST/BAL summary row).
   Inherits parent button color (#000 on red, ink on bg-2) — gold (#f5b53d) on
   red (#e63946) was ~1.97:1 contrast, illegible. Low-balance state uses white
   to stay visible on the red button (was red-on-red, invisible). */
.wsv2-gc-run-cost{font-family:var(--wsv2-mono);font-size:11px;letter-spacing:.06em;color:inherit;opacity:.85;font-weight:700;margin-left:2px}
.wsv2-gc-run-cost:empty{display:none}
.wsv2-gc-run-cost.wsv2-gc-run-cost-low{color:#fff;opacity:1}

/* template name pill in nav (matches use-meta-pill in mock) */
.wsv2-gc-meta-pill{display:inline-flex;align-items:center;height:24px;margin:auto 0 auto 10px;padding:0 8px;border:1px solid var(--wsv2-line);font-family:var(--wsv2-mono);font-size:9px;letter-spacing:.12em;color:var(--wsv2-ink-2);text-transform:uppercase;gap:4px;background:var(--wsv2-bg-2)}
.wsv2-gc-meta-pill.gold{border-color:var(--wsv2-gold);color:var(--wsv2-gold)}
.wsv2-gc-meta-pill b{font-family:var(--wsv2-display);font-weight:700;color:var(--wsv2-ink);font-size:11px}
.wsv2-gc-meta-pill.gold b{color:var(--wsv2-gold)}

/* — input column — Camika hint + topic + chips + struct */
.wsv2-gc-camika{display:flex;align-items:flex-start;gap:8px;padding:8px 10px;background:var(--wsv2-bg-2);border-left:2px solid var(--wsv2-red);font-family:var(--wsv2-mono);font-size:9px;letter-spacing:.12em;text-transform:uppercase;color:var(--wsv2-ink-3)}
.wsv2-gc-camika .ck{color:var(--wsv2-red);font-weight:800;flex-shrink:0;line-height:1.55}
.wsv2-gc-camika .cx{flex:1;min-width:0;line-height:1.55}
/* SKILL summary (LLM-generated) — sentence case + 3-line clamp */
.wsv2-gc-camika .cx.wsv2-gc-camika-summary{font-family:var(--wsv2-sans);font-size:11px;letter-spacing:.01em;text-transform:none;color:var(--wsv2-ink-2);display:-webkit-box;-webkit-line-clamp:3;-webkit-box-orient:vertical;overflow:hidden;text-overflow:ellipsis}
.wsv2-gc-topic .wsv2-tpl-lab{font-family:var(--wsv2-mono);font-size:9.5px;letter-spacing:.14em;text-transform:uppercase;font-weight:700;color:var(--wsv2-ink-2);margin-bottom:6px;display:flex;align-items:center;gap:6px}
.wsv2-gc-topic .wsv2-req{color:var(--wsv2-red);font-size:10px}
.wsv2-gc-topic textarea{width:100%;min-height:120px;padding:14px;background:#0a0b0e;border:1px solid var(--wsv2-red);color:var(--wsv2-ink);font-size:14px;line-height:1.55;resize:none;font-family:var(--wsv2-sans)}
.wsv2-gc-topic textarea:focus{box-shadow:0 0 0 1px var(--wsv2-red)}
.wsv2-gc-input > *{flex:0 0 auto}
.wsv2-gc-summary-block{margin-bottom:0}
.wsv2-gc-chips{display:flex;flex-direction:column;gap:14px;min-height:0;flex:0 0 auto}
.wsv2-gc-chips:empty{display:none}

/* Per-run reference image upload — visual parity with single-tpl ref slots */
.wsv2-gc-ref{display:flex;flex-direction:column;gap:0}
.wsv2-gc-ref[hidden]{display:none}
.wsv2-gc-ref .wsv2-kchip-upload{width:100%;text-align:left}
.wsv2-gc-ref .wsv2-kchip-upload:focus-visible{outline:0;border-color:var(--wsv2-red);color:var(--wsv2-red)}
.wsv2-gc-ref-file{position:absolute;width:1px;height:1px;opacity:0;pointer-events:none;clip:rect(0 0 0 0);clip-path:inset(50%)}
.wsv2-gc-ref-head{display:flex;align-items:center;gap:10px}
.wsv2-gc-ref-head .wsv2-tpl-lab{flex:1;margin:0}

.wsv2-gc-adv{display:block;margin-top:4px;border-top:1px solid var(--wsv2-line);padding-top:12px;outline:0}
.wsv2-gc-adv[hidden]{display:none}
.wsv2-gc-adv-summary{width:100%;display:flex;align-items:center;gap:6px;padding:0;background:transparent;border:0;color:var(--wsv2-ink-3);font-family:var(--wsv2-mono);font-size:10px;letter-spacing:.14em;text-transform:uppercase;font-weight:700;cursor:pointer;text-align:left}
.wsv2-gc-adv-summary::before{content:'▸';font-size:10px;color:var(--wsv2-red)}
.wsv2-gc-adv[data-open="true"] .wsv2-gc-adv-summary::before{content:'▾'}
.wsv2-gc-adv-summary:hover{color:var(--wsv2-red)}
.wsv2-gc-adv-body[hidden]{display:none!important}
.wsv2-gc-adv-body{display:grid;grid-template-columns:1fr;gap:14px;padding-top:16px;align-items:start;overflow:visible}
.wsv2-gc-adv-body .wsv2-kfld{min-width:0;gap:8px}
.wsv2-gc-adv-body .wsv2-kfld-lab{min-height:0;line-height:1.2;white-space:normal;overflow:visible;text-overflow:clip;align-items:flex-start}
.wsv2-gc-adv-body .wsv2-kchip{min-height:48px}
.wsv2-gc-adv-card{border:1px solid var(--wsv2-line);background:var(--wsv2-bg-1);padding:12px;display:flex;flex-direction:column;gap:12px}
.wsv2-gc-adv-card-head{font-family:var(--wsv2-display);font-size:12px;letter-spacing:.14em;color:var(--wsv2-red);font-weight:700;text-transform:uppercase}
.wsv2-gc-adv-card-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:12px}
.wsv2-gc-adv-card-grid .wsv2-kfld{margin:0}
.wsv2-gc-struct{display:none!important}

/* — chip (k/v/ca + swatch + upload variants) — */
.wsv2-gc-chip{width:100%;display:grid;grid-template-columns:minmax(92px,.48fr) minmax(0,1fr) 12px;align-items:center;gap:10px;padding:9px 10px;border:1px solid var(--wsv2-line);border-left:2px solid var(--wsv2-line);background:var(--wsv2-bg-1);font-size:11.5px;color:var(--wsv2-ink-2);cursor:pointer;transition:border-color .12s,color .12s,background .12s;font-family:var(--wsv2-sans);text-align:left;min-width:0}
.wsv2-gc-chip:hover{border-color:var(--wsv2-red-3);color:var(--wsv2-ink)}
.wsv2-gc-chip.wsv2-set{border-left-color:var(--wsv2-red);color:var(--wsv2-ink);background:var(--wsv2-bg-2)}
.wsv2-gc-chip.wsv2-empty{color:var(--wsv2-ink-3)}
.wsv2-gc-chip .k{font-family:var(--wsv2-mono);font-size:9px;letter-spacing:.1em;color:var(--wsv2-ink-3);text-transform:uppercase;font-weight:700}
.wsv2-gc-chip.wsv2-set .k{color:var(--wsv2-red)}
.wsv2-gc-chip .v{font-family:var(--wsv2-display);font-weight:600;letter-spacing:.02em;font-size:11.5px;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.wsv2-gc-chip.wsv2-empty .v{font-family:var(--wsv2-mono);font-size:10px;color:var(--wsv2-ink-3)}
.wsv2-gc-chip .ca{width:0;height:0;border-left:3.5px solid transparent;border-right:3.5px solid transparent;border-top:4px solid currentColor;opacity:.5;justify-self:end}
.wsv2-gc-chip.swatch::before{display:none}
.wsv2-gc-chip.upload .v{font-family:var(--wsv2-mono);font-size:10px;color:var(--wsv2-gold);letter-spacing:.06em}
.wsv2-gc-chip.upload .k{color:var(--wsv2-gold)}

/* — struct OUTPUT slot-row — */
.wsv2-gc-struct .wsv2-gc-slot-row{display:grid;grid-template-columns:24px auto 1fr auto;gap:7px;align-items:center;padding:6px 9px;border:1px solid var(--wsv2-line);background:var(--wsv2-bg-1);font-family:var(--wsv2-mono);font-size:11px;cursor:default}
.wsv2-gc-struct .wsv2-gc-slot-row .ord{font-family:var(--wsv2-display);font-size:11px;color:var(--wsv2-ink-3);font-weight:800;text-align:center}
.wsv2-gc-struct .wsv2-gc-slot-row .nm{color:var(--wsv2-ink);font-weight:600;letter-spacing:.04em;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-family:var(--wsv2-mono)}
.wsv2-gc-struct .wsv2-gc-slot-row .nm small{color:var(--wsv2-ink-3);margin-left:6px;font-size:9px;letter-spacing:.08em;text-transform:uppercase}
.wsv2-gc-struct .wsv2-gc-slot-row .pe-pill{padding:2px 5px;background:var(--wsv2-red);color:#000;font-size:9px;font-weight:800;letter-spacing:.06em;font-family:var(--wsv2-mono)}
.wsv2-gc-struct .wsv2-gc-slot-row .pe-pill.tx{background:var(--wsv2-gold)}
.wsv2-gc-struct .wsv2-gc-slot-row .pe-pill.up{background:var(--wsv2-bg-3);color:var(--wsv2-ink-2)}
.wsv2-gc-struct .wsv2-gc-slot-row .cr{color:var(--wsv2-gold);font-family:var(--wsv2-display);font-size:11px;font-weight:700}
.wsv2-gc-struct .wsv2-gc-slot-row .cr:empty{color:var(--wsv2-ink-3)}
.wsv2-gc-struct .wsv2-gc-slot-row .cr:empty::before{content:'—'}

/* — empty slot strip (board EMPTY state, 4-col grid) — */
.wsv2-gc-empty-slots{display:none}
.wsv2-gc-empty-slots:empty{display:none}
.wsv2-gc-empty-slots .es{padding:10px 12px;border:1px solid var(--wsv2-line);background:var(--wsv2-bg-1);display:flex;flex-direction:column;gap:3px;min-width:0}
.wsv2-gc-empty-slots .es .o{font-family:var(--wsv2-display);font-size:11px;font-weight:800;color:var(--wsv2-gold);letter-spacing:.06em}
.wsv2-gc-empty-slots .es .n{font-family:var(--wsv2-mono);font-size:11px;color:var(--wsv2-ink);font-weight:600;letter-spacing:.02em;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.wsv2-gc-empty-slots .es .t{font-family:var(--wsv2-mono);font-size:8.5px;color:var(--wsv2-ink-3);letter-spacing:.12em;text-transform:uppercase}
@media (max-width:820px){
  .wsv2-gc-empty-slots{grid-template-columns:repeat(2,minmax(0,1fr))}
  /* H5: running 阶段 4 张进度卡（DONE/RUNNING/QUEUED…）desktop 4 列在窄屏下被挤到溢出，
     与 empty-slots 同步改 2 列，每列宽度足以完整展示 STEP / 状态 / 百分比。 */
  .wsv2-gc-bn-slots{grid-template-columns:repeat(2,minmax(0,1fr))}
}
/* OUTPUT card — collapsed by default via <details>, click summary to expand */
details.wsv2-gc-struct{padding:0;background:var(--wsv2-bg-2);border:1px solid var(--wsv2-line)}
details.wsv2-gc-struct > summary{padding:10px 14px;font-family:var(--wsv2-mono);font-size:10px;letter-spacing:.12em;text-transform:uppercase;color:var(--wsv2-ink-2);font-weight:700;display:flex;align-items:center;gap:8px;cursor:pointer;list-style:none}
details.wsv2-gc-struct > summary::-webkit-details-marker,
details.wsv2-gc-struct > summary::marker{display:none}
details.wsv2-gc-struct > summary:hover{background:rgba(230,57,70,.04)}
details.wsv2-gc-struct .wsv2-gc-struct-arr{color:var(--wsv2-red);transition:transform .18s ease;display:inline-block;width:10px}
details.wsv2-gc-struct[open] .wsv2-gc-struct-arr{transform:rotate(90deg)}
details.wsv2-gc-struct > summary b{font-family:var(--wsv2-display);color:var(--wsv2-red);font-size:12px}
details.wsv2-gc-struct > #wsv2GcStructList{padding:0 14px 14px;display:flex;flex-direction:column;gap:6px}
.wsv2-gc-struct-cnt{margin-left:auto;color:var(--wsv2-ink-3);font-weight:600;font-size:9px;letter-spacing:.1em}
.wsv2-gc-struct-cnt b{color:var(--wsv2-gold);font-family:var(--wsv2-display);font-size:11px;margin:0 2px}

/* — chip popover editor (Phase 2) — */
.wsv2-gc-chip-pop{position:fixed;z-index:12000;min-width:240px;max-width:340px;background:var(--wsv2-bg-1);border:1px solid var(--wsv2-red);box-shadow:0 12px 40px rgba(0,0,0,.6);display:flex;flex-direction:column}
.wsv2-gc-chip-pop[hidden]{display:none}
.wsv2-gc-chip-pop-head{padding:8px 12px;border-bottom:1px solid var(--wsv2-line);font-family:var(--wsv2-mono);font-size:9.5px;letter-spacing:.16em;color:var(--wsv2-red);text-transform:uppercase;font-weight:700;background:#0a0b0e}
.wsv2-gc-chip-pop-body{padding:10px 12px;display:flex;flex-direction:column;gap:8px}
.wsv2-gc-chip-pop-body input,
.wsv2-gc-chip-pop-body textarea,
.wsv2-gc-chip-pop-body select{width:100%;padding:8px 10px;background:#0a0b0e;border:1px solid var(--wsv2-line);color:var(--wsv2-ink);font-family:var(--wsv2-sans);font-size:13px;outline:none;resize:vertical}
.wsv2-gc-chip-pop-body input:focus,
.wsv2-gc-chip-pop-body textarea:focus,
.wsv2-gc-chip-pop-body select:focus{border-color:var(--wsv2-red)}
.wsv2-gc-chip-pop-body textarea{min-height:84px;font-family:var(--wsv2-mono);font-size:12px;line-height:1.55}
.wsv2-gc-chip-pop-body select{font-family:var(--wsv2-mono);font-size:12px;-webkit-appearance:none;appearance:none;background:#0a0b0e url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23a7a89e' stroke-width='2'><path d='m6 9 6 6 6-6'/></svg>") no-repeat right 8px center;background-size:14px;padding-right:30px}
/* Select-type chip popover: dropdown menu (visual parity with single-tpl wsv2-dd) */
.wsv2-gc-chip-pop-body-menu{padding:0}
.wsv2-gc-chip-pop-menu{display:flex;flex-direction:column;max-height:280px;overflow-y:auto;background:var(--wsv2-bg-1)}
.wsv2-gc-chip-pop-menu .wsv2-dd-item{display:flex;align-items:center;padding:10px 14px;font-size:12px;color:var(--wsv2-ink-2);cursor:pointer;font-family:var(--wsv2-sans);letter-spacing:.02em;background:transparent;border:0;text-align:left;width:100%;transition:background .12s ease,color .12s ease}
.wsv2-gc-chip-pop-menu .wsv2-dd-item:hover{background:rgba(230,57,70,.14);color:var(--wsv2-ink)}
.wsv2-gc-chip-pop-menu .wsv2-dd-item.active{background:var(--wsv2-red);color:#000;font-weight:700}
.wsv2-gc-chip-pop-menu .wsv2-dd-item.active:hover{background:var(--wsv2-red);color:#000}
.wsv2-gc-chip-pop-actions{padding:8px 12px;border-top:1px solid var(--wsv2-line);display:flex;justify-content:flex-end;gap:6px;background:#0a0b0e}
.wsv2-gc-chip-pop-actions button{padding:6px 14px;font-family:var(--wsv2-mono);font-size:10px;letter-spacing:.1em;text-transform:uppercase;font-weight:700;border:1px solid var(--wsv2-line);background:transparent;color:var(--wsv2-ink-2);cursor:pointer}
.wsv2-gc-chip-pop-actions button:hover{border-color:var(--wsv2-red);color:var(--wsv2-red)}
.wsv2-gc-chip-pop-actions button.wsv2-primary{background:var(--wsv2-red);color:#000;border-color:var(--wsv2-red)}
.wsv2-gc-chip-pop-actions button.wsv2-primary:hover{background:var(--wsv2-gold);border-color:var(--wsv2-gold);color:#000}

/* — chip popover image grid + upload — */
.wsv2-gc-chip-pop-imgs{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:6px}
.wsv2-gc-chip-pop-imgs:empty{display:none}
.wsv2-gc-chip-pop-img{position:relative;aspect-ratio:1;border:1px solid var(--wsv2-line);background:#000;overflow:hidden}
.wsv2-gc-chip-pop-img img{width:100%;height:100%;object-fit:cover;display:block}
.wsv2-gc-chip-pop-img button{position:absolute;top:2px;right:2px;width:18px;height:18px;border:1px solid rgba(255,255,255,.4);background:rgba(0,0,0,.7);color:#fff;font-size:11px;line-height:1;padding:0;cursor:pointer;display:flex;align-items:center;justify-content:center}
.wsv2-gc-chip-pop-img button:hover{background:var(--wsv2-red);border-color:var(--wsv2-red)}
.wsv2-gc-chip-pop-up{padding:10px 12px;border:1px dashed var(--wsv2-line);background:transparent;font-family:var(--wsv2-mono);font-size:10px;letter-spacing:.1em;color:var(--wsv2-ink-3);text-transform:uppercase;text-align:center;cursor:pointer;width:100%}
.wsv2-gc-chip-pop-up:hover{border-color:var(--wsv2-red);color:var(--wsv2-red)}

/* — running state — slot card (per-slot progress, mirrors design ref bn-card) — */
.wsv2-gc-bn-slots .wsv2-gc-bn-card{position:relative;min-height:126px;padding:16px 18px;border:1px solid var(--wsv2-line);background:var(--wsv2-bg-1);display:flex;flex-direction:column;justify-content:space-between;gap:12px;font-family:var(--wsv2-mono);min-width:0}
.wsv2-gc-bn-slots .wsv2-gc-bn-card.is-now{border-color:var(--wsv2-red);background:rgba(230,57,70,.06)}
.wsv2-gc-bn-slots .wsv2-gc-bn-card.is-done{border-color:var(--wsv2-ok);background:rgba(126,197,120,.05)}
.wsv2-gc-bn-slots .wsv2-gc-bn-card.is-failure{border-color:var(--wsv2-red);background:rgba(230,57,70,.12)}
.wsv2-gc-bn-slots .wsv2-gc-bn-card .r1{display:grid;grid-template-columns:auto minmax(0,1fr) auto;align-items:center;gap:10px;font-size:10.5px}
.wsv2-gc-bn-slots .wsv2-gc-bn-card .o{font-family:var(--wsv2-display);font-weight:800;color:var(--wsv2-ink-3);font-size:14px;letter-spacing:.04em}
.wsv2-gc-bn-slots .wsv2-gc-bn-card.is-done .o,
.wsv2-gc-bn-slots .wsv2-gc-bn-card.is-now .o{color:var(--wsv2-gold)}
.wsv2-gc-bn-slots .wsv2-gc-bn-card .n{color:var(--wsv2-ink);font-weight:600;letter-spacing:.02em;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.wsv2-gc-bn-slots .wsv2-gc-bn-card .st{color:var(--wsv2-ink-3);font-size:9px;letter-spacing:.08em;text-transform:uppercase;white-space:nowrap}
.wsv2-gc-bn-slots .wsv2-gc-bn-card.is-done .st{color:var(--wsv2-ok)}
.wsv2-gc-bn-slots .wsv2-gc-bn-card.is-now .st{color:var(--wsv2-red)}
.wsv2-gc-bn-slots .wsv2-gc-bn-card.is-failure .st{color:var(--wsv2-red)}
.wsv2-gc-bn-slots .wsv2-gc-bn-card .meta{display:flex;align-items:center;justify-content:space-between;gap:8px;color:var(--wsv2-ink-3);font-size:9px;letter-spacing:.08em;text-transform:uppercase}
.wsv2-gc-bn-slots .wsv2-gc-bn-card .pct{font-family:var(--wsv2-display);font-size:16px;font-weight:800;color:var(--wsv2-gold);letter-spacing:.02em}
.wsv2-gc-bn-slots .wsv2-gc-bn-card .bar{height:6px;background:var(--wsv2-bg-3);position:relative;overflow:hidden}
.wsv2-gc-bn-slots .wsv2-gc-bn-card .bar > i{position:absolute;inset:0;background:linear-gradient(90deg,var(--wsv2-red),var(--wsv2-gold));width:0;transition:width .25s ease}
.wsv2-gc-bn-slots .wsv2-gc-run-preview{position:absolute;left:50%;bottom:calc(100% + 10px);width:220px;height:140px;transform:translateX(-50%) translateY(4px);opacity:0;pointer-events:none;z-index:20;border:1px solid var(--wsv2-ok);background:var(--wsv2-bg);box-shadow:0 18px 46px rgba(0,0,0,.72);transition:opacity .12s ease,transform .12s ease}
.wsv2-gc-bn-slots .wsv2-gc-run-preview::after{content:'';position:absolute;left:50%;bottom:-6px;width:10px;height:10px;transform:translateX(-50%) rotate(45deg);background:var(--wsv2-bg);border-right:1px solid var(--wsv2-ok);border-bottom:1px solid var(--wsv2-ok)}
.wsv2-gc-bn-slots .wsv2-gc-run-preview img,
.wsv2-gc-bn-slots .wsv2-gc-run-preview video{width:100%;height:100%;object-fit:cover;display:block}
.wsv2-gc-bn-slots .wsv2-gc-bn-card.is-done:hover .wsv2-gc-run-preview{opacity:1;transform:translateX(-50%) translateY(0)}

/* — empty slot strip — when running, mirror progress (overrides Phase 1 base) — */
.wsv2-gc-empty-slots .es.is-now{border-color:var(--wsv2-red);background:rgba(230,57,70,.06)}
.wsv2-gc-empty-slots .es.is-done{border-color:var(--wsv2-ok);background:rgba(126,197,120,.05)}
.wsv2-gc-empty-slots .es.is-done .o{color:var(--wsv2-ok)}
.wsv2-gc-empty-slots .es.is-failure{border-color:var(--wsv2-red);background:rgba(230,57,70,.12)}

/* — 4-tab pane content — landing iframe — */
.wsv2-gc-landing-frame{width:100%;height:100%;min-height:540px;border:1px solid var(--wsv2-line);background:#fff;display:block}
.wsv2-gc-landing-empty{padding:48px 24px;text-align:center;display:flex;flex-direction:column;align-items:center;gap:10px;color:var(--wsv2-ink-3)}
.wsv2-gc-landing-empty h3{font-family:var(--wsv2-display);font-size:14px;letter-spacing:.1em;text-transform:uppercase;color:var(--wsv2-red);margin:0}
.wsv2-gc-landing-empty p{font-family:var(--wsv2-mono);font-size:10px;letter-spacing:.06em;line-height:1.6;max-width:380px;margin:0}

/* — 4-tab — raw slots — 2-col grid of raw-card — */
.wsv2-gc-raw-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:12px}
@media (max-width:820px){.wsv2-gc-raw-grid{grid-template-columns:1fr}}
.wsv2-gc-raw-card{border:1px solid var(--wsv2-line);background:#0a0b0e;display:flex;flex-direction:column;min-width:0}
.wsv2-gc-raw-card .h{padding:8px 10px;border-bottom:1px solid var(--wsv2-line);background:var(--wsv2-bg-1);display:flex;align-items:center;gap:7px;font-family:var(--wsv2-mono);font-size:10px;letter-spacing:.06em;text-transform:uppercase;font-weight:700}
.wsv2-gc-raw-card .h .ord{color:var(--wsv2-gold);font-family:var(--wsv2-display);font-size:11px;font-weight:800}
.wsv2-gc-raw-card .h .nm{color:var(--wsv2-ink);font-weight:700;letter-spacing:.04em}
.wsv2-gc-raw-card .h .meta{color:var(--wsv2-ink-3);font-weight:500;letter-spacing:.06em;margin-left:auto;text-transform:uppercase}
.wsv2-gc-raw-card .h .copy{padding:3px 7px;border:1px solid var(--wsv2-line);font-size:9px;cursor:pointer;color:var(--wsv2-ink-3);font-weight:700}
.wsv2-gc-raw-card .h .copy:hover{border-color:var(--wsv2-red);color:var(--wsv2-red)}
.wsv2-gc-raw-card .b{padding:12px;font-family:var(--wsv2-sans);font-size:12.5px;line-height:1.65;color:var(--wsv2-ink-2);max-height:340px;overflow:auto}
.wsv2-gc-raw-card .b.img{padding:0;background:#000;display:grid;place-items:center;max-height:none;position:relative}
.wsv2-gc-raw-card .b.img img,.wsv2-gc-raw-card .b.img video{width:100%;height:auto;max-height:340px;object-fit:contain;display:block;cursor:zoom-in}
.wsv2-gc-raw-card .b.media-grid{padding:8px;display:grid;grid-template-columns:repeat(3,1fr);gap:6px;max-height:none}
.wsv2-gc-raw-card .b.media-grid > .m{aspect-ratio:1;background:var(--wsv2-bg-2);position:relative;overflow:hidden}
.wsv2-gc-raw-card .b.media-grid > .m img,.wsv2-gc-raw-card .b.media-grid > .m video{width:100%;height:100%;object-fit:cover;display:block;cursor:zoom-in}
.wsv2-gc-raw-card .b.media-grid > .m .lab{position:absolute;left:4px;bottom:4px;font-family:var(--wsv2-mono);font-size:8px;color:#fff;background:rgba(0,0,0,.55);padding:1px 4px;letter-spacing:.06em}
.wsv2-gc-cover-btn{position:absolute;right:6px;bottom:6px;z-index:2;height:22px;padding:0 8px;border:1px solid rgba(255,202,74,.72);background:rgba(0,0,0,.68);color:var(--wsv2-gold);font-family:var(--wsv2-mono);font-size:8px;font-weight:800;letter-spacing:.1em;text-transform:uppercase;cursor:pointer}
.wsv2-gc-cover-btn:hover{border-color:var(--wsv2-red);color:#fff;background:var(--wsv2-red)}
.wsv2-gc-raw-card .b.media-grid > .m .wsv2-gc-cover-btn{right:4px;bottom:4px;height:18px;padding:0 5px;font-size:7px}
.wsv2-gc-raw-card .b.media-grid > .m .lab + .wsv2-gc-cover-btn{bottom:23px}
.wsv2-gc-raw-card .b strong{color:var(--wsv2-ink)}
.wsv2-gc-raw-card .b em{color:var(--wsv2-red);font-style:normal;font-weight:600}

/* 2026-05-22:失败 / 取消 group 占位符 — 替代之前空 `<div class="b"></div>` 让用户能看出"这一格出过事"。
   flex:1 让 .b 占满 .wsv2-gc-raw-card 剩余高度(grid 邻居把卡撑高时,占位垂直居中) */
.wsv2-gc-raw-card .b.wsv2-gc-placeholder{flex:1;padding:28px 16px;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:8px;background:#0a0b0e;text-align:center;min-height:160px;max-height:none;overflow:visible}
.wsv2-gc-raw-card .b.wsv2-gc-placeholder .ic{font-size:30px;line-height:1;font-weight:300}
.wsv2-gc-raw-card .b.wsv2-gc-placeholder.is-failure .ic{color:var(--wsv2-red)}
.wsv2-gc-raw-card .b.wsv2-gc-placeholder.is-cancelled .ic{color:var(--wsv2-ink-3)}
.wsv2-gc-raw-card .b.wsv2-gc-placeholder .st{font-family:var(--wsv2-mono);font-size:10.5px;font-weight:700;letter-spacing:.14em;text-transform:uppercase}
.wsv2-gc-raw-card .b.wsv2-gc-placeholder.is-failure .st{color:var(--wsv2-red)}
.wsv2-gc-raw-card .b.wsv2-gc-placeholder.is-cancelled .st{color:var(--wsv2-ink-3)}
.wsv2-gc-raw-card .b.wsv2-gc-placeholder .rs{font-family:var(--wsv2-sans);font-size:11.5px;color:var(--wsv2-ink-3);max-width:320px;line-height:1.5;word-break:break-word}
.wsv2-gc-placeholder-retry{margin-top:4px;padding:6px 14px;border:1px solid var(--wsv2-red);background:transparent;color:var(--wsv2-red);font-family:var(--wsv2-mono);font-size:10px;font-weight:700;letter-spacing:.12em;text-transform:uppercase;cursor:pointer}
.wsv2-gc-placeholder-retry:hover{background:var(--wsv2-red);color:#fff}

/* — RAW tab — version history bar (sql/227 versioning).
   Mirrors dt-manga-drama .md-video-line-history — horizontal row of small v_N
   buttons, current version highlighted red. Click instantly restores via
   POST /api/combo/.../group/:groupId/restore (no popup). */
.wsv2-gc-versions-bar{display:flex;align-items:center;gap:5px;flex-wrap:wrap;padding:7px 10px;border-top:1px solid var(--wsv2-line);background:var(--wsv2-bg-1)}
.wsv2-gc-versions-bar .lab{font-family:var(--wsv2-mono);font-size:9.5px;color:var(--wsv2-ink-3);text-transform:uppercase;letter-spacing:.08em;margin-right:2px}
.wsv2-gc-ver-btn{min-width:36px;padding:4px 8px;background:transparent;border:1px solid var(--wsv2-line);color:var(--wsv2-ink-2);font-family:var(--wsv2-mono);font-size:10px;font-weight:700;letter-spacing:.04em;cursor:pointer;text-transform:uppercase;transition:border-color .15s,color .15s,background .15s}
.wsv2-gc-ver-btn:hover{border-color:var(--wsv2-red);color:var(--wsv2-red)}
.wsv2-gc-ver-btn.is-current{border-color:var(--wsv2-red);background:var(--wsv2-red);color:#fff;cursor:default}
.wsv2-gc-ver-btn.is-current:hover{background:var(--wsv2-red)}

/* — 4-tab — prompt blocks — */
.wsv2-gc-prompt-block{border:1px solid var(--wsv2-line);background:#0a0b0e;margin-bottom:12px;display:flex;flex-direction:column}
.wsv2-gc-prompt-block .ph{padding:8px 10px;border-bottom:1px solid var(--wsv2-line);background:var(--wsv2-bg-1);display:flex;align-items:center;gap:7px;font-family:var(--wsv2-mono);font-size:10px;letter-spacing:.06em;text-transform:uppercase;font-weight:700}
.wsv2-gc-prompt-block .ph .ord{color:var(--wsv2-gold);font-family:var(--wsv2-display);font-size:11px;font-weight:800}
.wsv2-gc-prompt-block .ph .nm{color:var(--wsv2-ink);font-weight:700;letter-spacing:.04em}
.wsv2-gc-prompt-block .ph .model{color:var(--wsv2-ink-3);font-weight:500;letter-spacing:.06em}
.wsv2-gc-prompt-block .ph .tk{margin-left:auto;color:var(--wsv2-ink-3);font-size:9px;font-weight:600}
.wsv2-gc-prompt-block .ph .tk b{color:var(--wsv2-red);font-family:var(--wsv2-display);font-size:11px;margin:0 2px;font-weight:700}
.wsv2-gc-prompt-block .body{padding:0;display:flex;flex-direction:column;gap:6px}
.wsv2-gc-prompt-block textarea.wsv2-gc-prompt-ta{width:100%;padding:12px 14px;background:transparent;border:0;border-bottom:1px solid var(--wsv2-line);color:var(--wsv2-ink-2);font-family:var(--wsv2-mono);font-size:11.5px;line-height:1.6;resize:vertical;min-height:120px;outline:none}
.wsv2-gc-prompt-block textarea.wsv2-gc-prompt-ta:focus{background:rgba(230,57,70,.04)}
.wsv2-gc-prompt-block textarea.wsv2-gc-prompt-ta:last-child{border-bottom:0}
.wsv2-gc-prompt-block .wsv2-gc-prompt-foot{padding:8px 10px;border-top:1px solid var(--wsv2-line);display:flex;justify-content:flex-end;background:var(--wsv2-bg-1)}
.wsv2-gc-prompt-block .wsv2-gc-prompt-foot button{padding:6px 12px;font-family:var(--wsv2-mono);font-size:9.5px;letter-spacing:.1em;text-transform:uppercase;font-weight:700;border:1px solid var(--wsv2-line);background:transparent;color:var(--wsv2-ink-2);cursor:pointer}
.wsv2-gc-prompt-block .wsv2-gc-prompt-foot button:hover{border-color:var(--wsv2-red);color:var(--wsv2-red)}

/* — 4-tab — history cards — big stack — */
.wsv2-gc-hist-list{display:flex;flex-direction:column;gap:10px}
.wsv2-gc-hist-list:empty::after{content:'NO RUNS YET';display:block;text-align:center;padding:24px;font-family:var(--wsv2-mono);font-size:10px;letter-spacing:.14em;color:var(--wsv2-ink-3)}
.wsv2-gc-hist-card{display:grid;grid-template-columns:80px 1fr auto;gap:14px;align-items:center;padding:12px;border:1px solid var(--wsv2-line);background:var(--wsv2-bg-1);cursor:pointer;transition:border-color .15s}
.wsv2-gc-hist-card:hover{border-color:var(--wsv2-red)}
.wsv2-gc-hist-card.is-cur{border-color:var(--wsv2-gold);background:linear-gradient(90deg,rgba(245,181,61,.08),transparent)}
.wsv2-gc-hist-card .th{width:80px;height:60px;background:var(--wsv2-bg-3);border:1px solid var(--wsv2-line);overflow:hidden;flex-shrink:0;background-size:cover;background-position:center}
.wsv2-gc-hist-card .th.wsv2-gc-th-fallback{background-size:140% 140%;background-position:center;border-color:rgba(245,181,61,.32)}
.wsv2-gc-hist-card .th.wsv2-gc-th-g1{background-image:linear-gradient(135deg,#1a0a14,#5a1024 52%,#a02a3a)}
.wsv2-gc-hist-card .th.wsv2-gc-th-g2{background-image:linear-gradient(135deg,#0a0f16,#2a3240 48%,#f5b53d 115%)}
.wsv2-gc-hist-card .th.wsv2-gc-th-g3{background-image:linear-gradient(135deg,#101823,#185a7a 48%,#7ee0c6)}
.wsv2-gc-hist-card .th.wsv2-gc-th-g4{background-image:linear-gradient(135deg,#1a0e2e,#4a1a6a 50%,#a560d0)}
.wsv2-gc-hist-card .th.wsv2-gc-th-g5{background-image:linear-gradient(135deg,#12120f,#2f2a1e 42%,#d7a846)}
.wsv2-gc-hist-card .th.wsv2-gc-th-g6{background-image:linear-gradient(135deg,#101315,#31414c 50%,#8fb4c8)}
.wsv2-gc-hist-card .info{display:flex;flex-direction:column;gap:4px;min-width:0;overflow:hidden}
.wsv2-gc-hist-card .info .ti{font-family:var(--wsv2-display);font-size:13px;color:var(--wsv2-ink);font-weight:600;letter-spacing:.02em;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.wsv2-gc-hist-card .info .ti em{color:var(--wsv2-red);font-style:normal;font-family:var(--wsv2-mono);font-size:10px;font-weight:700;margin-right:6px;letter-spacing:.06em}
.wsv2-gc-hist-card .info .desc{font-family:var(--wsv2-sans);font-size:11.5px;color:var(--wsv2-ink-3);line-height:1.5;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}
.wsv2-gc-hist-card .info .meta{display:flex;gap:10px;font-family:var(--wsv2-mono);font-size:9px;color:var(--wsv2-ink-3);letter-spacing:.08em;text-transform:uppercase;flex-wrap:wrap}
.wsv2-gc-hist-card .info .meta .cur-tag{color:var(--wsv2-gold);font-weight:700}
.wsv2-gc-hist-card .right{display:flex;flex-direction:column;align-items:flex-end;gap:4px}
.wsv2-gc-hist-card .st{padding:3px 7px;font-family:var(--wsv2-mono);font-size:9px;letter-spacing:.06em;text-transform:uppercase;font-weight:700}
.wsv2-gc-hist-card .st.is-success{color:var(--wsv2-ok);border:1px solid rgba(126,197,120,.4)}
.wsv2-gc-hist-card .st.is-partial{color:var(--wsv2-gold);border:1px solid var(--wsv2-gold)}
.wsv2-gc-hist-card .st.is-failure{color:var(--wsv2-red);border:1px solid var(--wsv2-red)}
.wsv2-gc-hist-card .st.is-running{color:var(--wsv2-gold);border:1px solid var(--wsv2-gold)}
.wsv2-gc-hist-card .share{height:23px;padding:0 7px;border:1px solid var(--wsv2-red);background:rgba(230,57,70,.16);color:var(--wsv2-red);display:inline-flex;align-items:center;gap:5px;font-family:var(--wsv2-mono);font-size:8px;font-weight:800;letter-spacing:.08em;text-transform:uppercase;cursor:pointer}
.wsv2-gc-hist-card .share:hover{background:var(--wsv2-red);border-color:var(--wsv2-red);color:#050507}
.wsv2-gc-hist-card .share svg{width:12px;height:12px}
.wsv2-gc-hist-card .del{padding:3px 7px;border:1px solid transparent;background:transparent;color:var(--wsv2-ink-3);font-size:14px;line-height:1;cursor:pointer}
.wsv2-gc-hist-card .del:hover{border-color:var(--wsv2-red);color:var(--wsv2-red)}
.wsv2-gc-side-history .wsv2-gc-hist-list{gap:8px}
.wsv2-gc-side-history .wsv2-gc-hist-card{grid-template-columns:54px 1fr;gap:10px;padding:9px;align-items:center}
.wsv2-gc-side-history .wsv2-gc-hist-card .th{width:54px;height:42px}
.wsv2-gc-side-history .wsv2-gc-hist-card .info{min-width:0}
.wsv2-gc-side-history .wsv2-gc-hist-card .info .ti{font-size:10px;line-height:1.25}
.wsv2-gc-side-history .wsv2-gc-hist-card .info .desc{display:none}
.wsv2-gc-side-history .wsv2-gc-hist-card .info .meta{font-size:8px;margin-top:4px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.wsv2-gc-side-history .wsv2-gc-hist-card .right{grid-column:1/-1;display:flex;flex-direction:row;align-items:center;justify-content:flex-start;gap:5px;border-top:1px solid var(--wsv2-line);padding-top:6px;margin-top:2px}
.wsv2-gc-side-history .wsv2-gc-hist-card .st{font-size:8px}
.wsv2-gc-side-history .wsv2-gc-hist-card .del{margin-left:auto;padding:2px 6px}

/* — landing lightbox iframe — reuses #wsv2Lightbox container — */
.wsv2-lightbox iframe.wsv2-gc-lightbox-frame{width:96vw;height:92vh;background:#fff;border:0}

/* H5 GC — minimal stack */
@media (max-width: 820px){
  /* H5 GC pg 同 SOLO 处理 —— overflow:auto 裁 dropdown menu，改 visible 让整页随 .dt-content 滚 */
  .wsv2-gc-tpl-pg{display:flex;flex-direction:column;overflow:visible;height:auto;min-height:100%}
  .wsv2-gc-tpl-pg > .wsv2-tpl-nav{flex:0 0 44px;border-right:0}
  .wsv2-gc-tpl-body{display:contents}
  .wsv2-gc-input{border-right:0;border-bottom:1px solid var(--wsv2-line);padding:14px;overflow:visible}
  .wsv2-gc-board{padding:16px 14px;overflow:visible;min-height:520px}
  /* H5 GC empty 状态同 SOLO 处理（详见 .wsv2-tpl-pg empty 注释）——
     520px 紫色板挤掉 input 区控件，empty 时直接 hide */
  .wsv2-gc-tpl-pg[data-state="empty"] .wsv2-gc-board{display:none}
  .wsv2-gc-side{border-left:0;border-top:1px solid var(--wsv2-line);min-height:360px}
  .wsv2-gc-state-running{padding-top:24px}
  .wsv2-gc-bn-stage{grid-template-columns:1fr}
  .wsv2-gc-result-tabs{overflow-x:auto}
  .wsv2-gc-result-tabs button{flex:0 0 auto}
  .wsv2-gc-hist-card{grid-template-columns:60px 1fr}
  .wsv2-gc-hist-card .right{display:none}
  /* H5 GC review modal — switch from internal-flex (PC: head/footer 固定 + flow 内 scroll)
     to whole-modal scroll：mobile 上 panel max-height + flow:overflow:auto 容易出
     "5 节点只看到 1 个、捏不动"——双层滚动手势冲突 + 92vh 容纳不下所有 fixed 段时
     flex 算法把 flow 压到 ~70px 仅露 1 节点。改成整个 modal 自身 overflow:auto，
     panel 自然 content-height，所有节点 inline 渲染随页面滚。 */
  .wsv2-gc-review-modal{padding:8px;place-items:start center;overflow-y:auto;-webkit-overflow-scrolling:touch}
  /* Panel：content-height（不限高），底部留 actions 高度的空间避免 sticky 操作栏遮内容 */
  .wsv2-gc-review-panel{width:100%;max-height:none;padding-bottom:96px}
  .wsv2-gc-review-head{padding:16px}
  .wsv2-gc-review-head h3{font-size:18px}
  .wsv2-gc-review-head p{font-size:11px;-webkit-line-clamp:3;display:-webkit-box;-webkit-box-orient:vertical;overflow:hidden}
  .wsv2-gc-review-dr0-summary{font-size:12px;-webkit-line-clamp:4;display:-webkit-box;-webkit-box-orient:vertical;overflow:hidden}
  /* metrics：3 列横排（原 H5 1fr 堆叠 3 行 ~210px 太占地，3 列 ~70px） */
  .wsv2-gc-review-metrics{grid-template-columns:repeat(3,minmax(0,1fr))}
  .wsv2-gc-review-metrics span{padding:10px 8px;font-size:8.5px;letter-spacing:.06em;border-right:1px solid var(--wsv2-line);border-bottom:0}
  .wsv2-gc-review-metrics span:last-child{border-right:0}
  .wsv2-gc-review-metrics b{font-size:16px;display:block;margin-right:0;margin-bottom:2px}
  .wsv2-gc-review-flow{padding:14px;overflow:visible;flex:0 0 auto}
  .wsv2-gc-review-node{grid-template-columns:28px 36px minmax(0,1fr);align-items:flex-start;min-height:auto;padding:10px 12px}
  .wsv2-gc-review-node .meta{grid-column:3;max-width:none;text-align:left;margin-top:4px}
  /* Actions sticky 到 modal 视口底部 — 多节点时不用滚到底也能点确认；
     position:sticky 配 modal overflow:auto 形成 sticky containing block */
  .wsv2-gc-review-actions{padding:12px 14px max(12px,env(safe-area-inset-bottom));flex-direction:column;position:sticky;bottom:0;z-index:5;background:var(--wsv2-bg-2);box-shadow:0 -2px 12px rgba(0,0,0,.55)}
  .wsv2-gc-review-actions button{width:100%;justify-content:center}
  /* H5: RUN COMBO 浮底 — 让用户填完 input 不必翻到 .wsv2-gc-side 末尾才能看到/点到。
     bottom:56px 避开底部 nav（.dt-sidebar H5 高 56）；padding-bottom 给 history 留缓冲防最后一行被遮。 */
  #workshop-v2-view .wsv2-gc-side-cta{
    position:fixed;left:0;right:0;bottom:56px;
    z-index:50;border-top:1px solid var(--wsv2-line);
    padding:10px 14px;background:var(--wsv2-bg-1);
  }
  .wsv2-gc-side-history{padding-bottom:80px}
}

/* ============ TOAST ============ */
.wsv2-toast{position:fixed;left:50%;top:calc(var(--header-height, 48px) + 16px);transform:translateX(-50%) translateY(-8px);background:#000;color:var(--wsv2-ink);border:1px solid var(--wsv2-red);padding:10px 18px;font-family:var(--wsv2-mono);font-size:12px;letter-spacing:.08em;text-transform:uppercase;box-shadow:0 6px 24px rgba(0,0,0,.5);opacity:0;pointer-events:none;transition:opacity .2s, transform .2s;z-index:200}
.wsv2-toast.wsv2-show{opacity:1;transform:translateX(-50%) translateY(0)}

/* ============ H5 RESPONSIVE ============ */
@media (max-width: 820px){
  body{font-size:14px}
  .wsv2-top{height:48px}
  .wsv2-side{display:none}
  .wsv2-shell{grid-template-columns:1fr}
  .wsv2-main{grid-row:2;grid-column:1}
  .wsv2-lg{width:48px;font-size:18px}
  .wsv2-crumb{padding:0 12px;font-size:10px;gap:8px}
  .wsv2-top-rt{font-size:10px}
  .wsv2-top-rt > *{padding:0 10px}

  .wsv2-list-pg{padding:14px}
  .wsv2-start-hero{grid-template-columns:1fr;gap:12px;padding:16px}

  .wsv2-create-stage{padding:69px 14px 32px}
  .wsv2-create-inner{padding:0}
  .wsv2-brief h1{font-size:24px}
  .wsv2-composer textarea{font-size:14px}
  .wsv2-mode-seg button{padding:9px 14px;font-size:10px}
  .wsv2-gc-grid{grid-template-columns:1fr}
  .wsv2-gc-head{align-items:stretch;flex-direction:column}
  .wsv2-gc-dry{margin-left:0;justify-content:center}
  .wsv2-gc-model-row{align-items:flex-start;flex-direction:column}
  .wsv2-gc-model-row b{margin-left:0;white-space:normal}
  /* H5: segmented control 全部改成 native <select> 下拉。
     原 segmented buttons 在 H5 上 4-个等宽会截成"4 · ..."不可读；列表纵向又占空间。
     用 select 紧凑且系统级原生体验。enhance 由 wsv2MobileEnhanceAllSegs() 在
     wsv2InitView 时跑（JS 自动在每个 .wsv2-gc-seg 后插入 sibling select）。 */
  .wsv2-gc-sub-row{align-items:center}
  #workshop-v2-view .wsv2-gc-seg{display:none !important}
  .wsv2-gc-seg-mobile{
    flex:1;min-width:0;width:100%;min-height:40px;
    padding:9px 12px;font-size:13px;
    background:var(--wsv2-bg-1);color:var(--wsv2-ink);
    border:1px solid var(--wsv2-line);
    font-family:var(--wsv2-mono);font-weight:600;
    cursor:pointer;
  }
  .wsv2-gc-seg-mobile:focus{outline:none;border-color:var(--wsv2-red)}

  /* mobile pg 只有 head + body 两行（cta 已并入 body grid，跟 desktop 同结构）
     H5 改 overflow visible + height auto —— 解决 .wsv2-kchip-menu (dropdown) 被父链裁切的 bug：
     PC 端 .wsv2-tpl-pg overflow:hidden + .wsv2-tpl-input overflow-y:auto 让 input 列内独立滚动；
     H5 单列堆叠下，dropdown menu (absolute 子) 被 input 的 overflow 裁掉只剩顶部红条，用户看不到 16:9/9:16/4:3 选项。
     H5 改父链 overflow visible，让 dropdown 自由溢出，整页随 .dt-content scroll container 滚动。 */
  .wsv2-tpl-pg{grid-template-rows:auto auto;height:auto;min-height:100%;overflow:visible}
  .wsv2-tpl-input{overflow:visible}
  .wsv2-tpl-hist{overflow:visible}
  .wsv2-tpl-head{padding:10px 14px;flex-wrap:wrap;gap:8px}
  .wsv2-tpl-ti h2{font-size:14px}
  .wsv2-tpl-meta{display:none}
  .wsv2-tpl-acts button{padding:5px 7px;font-size:9px}
  .wsv2-tpl-acts button span{display:none}
  .wsv2-tpl-hist{padding:8px 14px}
  /* mobile：1 列堆叠 input → output → hist → cta，覆写 desktop 的 areas 矩阵 */
  .wsv2-tpl-body{grid-template-columns:1fr;grid-template-rows:auto auto auto auto;grid-template-areas:"input" "output" "hist" "cta";overflow:visible}
  .wsv2-tpl-input{border-right:0;border-bottom:1px solid var(--wsv2-line);padding:16px 14px;gap:12px}
  .wsv2-tpl-prompt-box textarea{min-height:88px;font-size:15px}
  .wsv2-tpl-output{padding:18px 14px;min-height:340px}
  .wsv2-tpl-pg[data-state="result"] .wsv2-tpl-output{padding-top:28px}
  /* H5 empty 状态隐藏 OUTPUT 占位 ——
     PC 端是 [input | output | hist] 三栏，empty 时 placeholder 维持视觉平衡是合理的；
     H5 是单列堆叠，"准备生成"占位 340×340 紫色斜线大块会把 input 区的 knobs/advanced 控件挤到屏幕外，
     用户反馈"想选择东西就都选择不了"。
     参考 ChatGPT/Claude/Notion AI mobile —— 执行前不留预览占位，输入填完即点提交即可。
     state 切 running / result 时 output 自然恢复显示。 */
  .wsv2-tpl-pg[data-state="empty"] .wsv2-tpl-output{display:none}
  .wsv2-tpl-state{max-width:none}
  .wsv2-tpl-placeholder,.wsv2-tpl-render-frame{aspect-ratio:1;max-height:340px}
  .wsv2-tpl-result-art{min-height:240px;max-height:340px}
  .wsv2-tpl-result-img,.wsv2-tpl-result-vid{max-height:340px}
  .wsv2-result-tools button{width:40px;height:40px}
  .wsv2-result-tools svg{width:20px;height:20px}
  .wsv2-result-actionbar{grid-template-columns:repeat(2,minmax(0,1fr))}
  /* mobile：cta 退回全宽 flex（大屏是 width:380 只占 input 列，mobile 1 列布局要撑满） */
  .wsv2-tpl-cta{display:flex;width:auto;border-right:0;justify-content:flex-end;padding:10px 14px;flex-wrap:wrap;gap:8px}
  .wsv2-tpl-summary{font-size:9px;gap:10px;flex-wrap:wrap}
  .wsv2-tpl-run-btn{flex:1;min-width:140px;height:42px;font-size:13px}
  .wsv2-tpl-pg[data-state="result"] .wsv2-tpl-cta{right:14px;bottom:14px;width:auto;transform:none}
  .wsv2-tpl-pg[data-state="result"] .wsv2-tpl-run-btn{flex:0 0 auto;min-width:142px}
  .wsv2-tpl-pg[data-state="running"] .wsv2-tpl-cta{right:14px;bottom:14px;width:auto;transform:none}
  .wsv2-tpl-pg[data-state="running"] .wsv2-tpl-run-btn{flex:0 0 auto;min-width:142px}
  .wsv2-prompt-modal,.wsv2-lightbox{padding:12px}
  .wsv2-prompt-panel{height:82vh}
}

/* ============================================================
 * Flow 1.0 — 03 FLOW mode + flow-builder screen
 * ============================================================ */

/* Mode-seg padding tightened to fit 3 buttons */
.wsv2-mode-seg button{padding:0 12px}
@media (max-width:1133px){
  .wsv2-mode-seg button{padding:0 10px;font-size:9px}
}

/* Flow page layout */
.wsv2-flow-pg{
  display:flex;flex-direction:column;height:100%;
  background:var(--p5-card,#0d1018);color:var(--p5-text,#e0e0e0);
}
.wsv2-flow-back{
  display:flex;align-items:center;gap:14px;
  padding:10px 18px;border-bottom:1px solid var(--p5-border,#252830);
  background:var(--p5-bg,#0a0d14);flex-shrink:0;
}
.wsv2-flow-back button{
  display:inline-flex;align-items:center;gap:6px;
  background:transparent;border:1px solid var(--p5-border,#252830);
  color:var(--p5-text-secondary,#9ba1ac);
  padding:5px 10px;font-size:11px;font-weight:600;
  cursor:pointer;border-radius:0;
}
.wsv2-flow-back button:hover{border-color:var(--p5-red,#e63946);color:var(--p5-red,#e63946)}
.wsv2-flow-back button svg{width:13px;height:13px}
.wsv2-flow-title{font-size:13px;font-weight:700;letter-spacing:1.2px;flex:1}
.wsv2-flow-status{
  font-size:9px;font-weight:700;letter-spacing:1.5px;
  padding:3px 8px;background:var(--p5-input-bg,#161922);
  color:var(--p5-text-secondary,#9ba1ac);
  border:1px solid var(--p5-border,#252830);
}
.wsv2-flow-status[data-status="derived"]{color:var(--p5-red,#e63946);border-color:var(--p5-red,#e63946)}

.wsv2-flow-body{
  flex:1;display:grid;grid-template-columns:minmax(0,1fr) 1px minmax(0,1.2fr);
  min-height:0;
}
.wsv2-flow-body::before{content:'';grid-column:2;background:var(--p5-border,#252830)}

/* Left: chat panel */
.wsv2-flow-chat{display:flex;flex-direction:column;min-height:0;min-width:0;background:var(--p5-card,#0d1018)}
.wsv2-flow-chat-log{flex:1;overflow-y:auto;padding:18px;display:flex;flex-direction:column;gap:12px}
.wsv2-flow-chat-empty{
  margin:auto;text-align:center;color:var(--p5-muted,#666);
  font-size:11px;letter-spacing:0.5px;line-height:1.6;max-width:320px;
}
.wsv2-flow-chat-msg{
  padding:10px 12px;font-size:12px;line-height:1.6;
  border-left:2px solid transparent;white-space:pre-wrap;word-break:break-word;
}
.wsv2-flow-chat-msg-user{
  background:var(--p5-input-bg,#161922);
  border-left-color:var(--p5-text-secondary,#9ba1ac);
  color:var(--p5-text,#e0e0e0);
}
.wsv2-flow-chat-msg-assistant{
  background:transparent;
  border-left-color:var(--p5-red,#e63946);
  color:var(--p5-text,#e0e0e0);
}
.wsv2-flow-chat-msg-meta{
  font-size:9px;font-weight:700;letter-spacing:1.5px;
  color:var(--p5-muted,#666);margin-bottom:4px;
}
.wsv2-flow-chat-msg-assistant .wsv2-flow-chat-msg-meta{color:var(--p5-red,#e63946)}

.wsv2-flow-chat-composer{
  flex-shrink:0;border-top:1px solid var(--p5-border,#252830);
  padding:12px;background:var(--p5-bg,#0a0d14);
  display:flex;flex-direction:column;gap:8px;
}
.wsv2-flow-chat-composer textarea{
  width:100%;border:1px solid var(--p5-border,#252830);
  background:var(--p5-input-bg,#161922);color:var(--p5-text,#e0e0e0);
  padding:10px;font-size:12px;font-family:inherit;line-height:1.5;
  resize:vertical;border-radius:0;
}
.wsv2-flow-chat-composer textarea:focus{outline:none;border-color:var(--p5-red,#e63946)}
.wsv2-flow-chat-composer button{
  align-self:flex-end;padding:7px 18px;font-size:11px;font-weight:700;
  letter-spacing:1.2px;background:var(--p5-red,#e63946);
  color:#fff;border:none;cursor:pointer;border-radius:0;
}
.wsv2-flow-chat-composer button:disabled{opacity:0.5;cursor:not-allowed}

/* Right: DAG panel */
.wsv2-flow-dag{display:flex;flex-direction:column;min-height:0;min-width:0;background:var(--p5-bg,#0a0d14);overflow-y:auto}
.wsv2-flow-dag-empty{margin:auto;text-align:center;color:var(--p5-muted,#666);font-size:11px;letter-spacing:0.5px;padding:20px}
.wsv2-flow-dag-canvas{padding:18px;display:flex;flex-direction:column;gap:14px}
.wsv2-flow-dag-meta{display:flex;flex-direction:column;gap:6px;padding-bottom:12px;border-bottom:1px solid var(--p5-border,#252830)}
.wsv2-flow-dag-scenario{font-size:9px;font-weight:700;letter-spacing:1.5px;color:var(--p5-red,#e63946)}
.wsv2-flow-dag-rationale{font-size:11px;line-height:1.6;color:var(--p5-text-secondary,#9ba1ac)}

.wsv2-flow-dag-nodes{display:flex;flex-direction:column;gap:8px}
.wsv2-flow-dag-node{
  display:grid;grid-template-columns:32px 1fr auto;gap:10px;align-items:center;
  padding:10px 12px;background:var(--p5-card,#0d1018);
  border:1px solid var(--p5-border,#252830);
  cursor:pointer;border-radius:0;
}
.wsv2-flow-dag-node:hover{border-color:var(--p5-red,#e63946)}
.wsv2-flow-dag-node-idx{font-size:13px;font-weight:700;letter-spacing:1px;color:var(--p5-red,#e63946);text-align:center}
.wsv2-flow-dag-node-info{display:flex;flex-direction:column;gap:3px;min-width:0}
.wsv2-flow-dag-node-title{font-size:12px;font-weight:600;color:var(--p5-text,#e0e0e0);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.wsv2-flow-dag-node-detail{font-size:9px;letter-spacing:0.5px;color:var(--p5-muted,#666);display:flex;gap:8px;flex-wrap:wrap}
.wsv2-flow-dag-node-tag{padding:1px 5px;background:var(--p5-input-bg,#161922);color:var(--p5-text-secondary,#9ba1ac)}
.wsv2-flow-dag-node-tag-loop{color:var(--p5-red,#e63946);border:1px solid var(--p5-red,#e63946)}
.wsv2-flow-dag-node-edit{font-size:9px;font-weight:700;letter-spacing:1.5px;color:var(--p5-text-secondary,#9ba1ac);padding:4px 8px;border:1px solid var(--p5-border,#252830)}
.wsv2-flow-dag-node:hover .wsv2-flow-dag-node-edit{color:var(--p5-red,#e63946);border-color:var(--p5-red,#e63946)}

/* Node-edit popover (centered modal) */
.wsv2-flow-node-pop{
  position:fixed;top:50%;left:50%;transform:translate(-50%,-50%);
  z-index:1100;width:90%;max-width:480px;
  background:var(--p5-card,#0d1018);border:1px solid var(--p5-border,#252830);
  display:flex;flex-direction:column;
}
.wsv2-flow-node-pop[hidden]{display:none}
.wsv2-flow-node-pop-head{
  display:flex;align-items:center;justify-content:space-between;
  padding:10px 14px;border-bottom:1px solid var(--p5-border,#252830);
  background:var(--p5-bg,#0a0d14);
}
.wsv2-flow-node-pop-title{font-size:11px;font-weight:700;letter-spacing:1.2px;color:var(--p5-text,#e0e0e0)}
.wsv2-flow-node-pop-head button{background:transparent;border:1px solid var(--p5-border,#252830);color:var(--p5-text-secondary,#9ba1ac);padding:4px 9px;font-size:9px;font-weight:700;cursor:pointer;border-radius:0}
.wsv2-flow-node-pop-body{padding:14px;display:flex;flex-direction:column;gap:10px}
.wsv2-flow-node-pop-row{display:flex;flex-direction:column;gap:4px}
.wsv2-flow-node-pop-row label{font-size:9px;font-weight:700;letter-spacing:1px;color:var(--p5-muted,#666)}
.wsv2-flow-node-pop-row input,.wsv2-flow-node-pop-row select{width:100%;padding:7px 10px;font-size:12px;background:var(--p5-input-bg,#161922);color:var(--p5-text,#e0e0e0);border:1px solid var(--p5-border,#252830);border-radius:0}
.wsv2-flow-node-pop-actions{display:flex;gap:8px;justify-content:flex-end;padding:10px 14px;border-top:1px solid var(--p5-border,#252830);background:var(--p5-bg,#0a0d14)}
.wsv2-flow-node-pop-actions button{padding:5px 14px;font-size:10px;font-weight:700;letter-spacing:1px;border-radius:0;cursor:pointer;background:transparent;border:1px solid var(--p5-border,#252830);color:var(--p5-text-secondary,#9ba1ac)}
.wsv2-flow-node-pop-actions button.wsv2-primary{background:var(--p5-red,#e63946);color:#fff;border-color:var(--p5-red,#e63946)}

/* DAG actions bar (RUN button + meta) */
.wsv2-flow-dag-actions{display:flex;align-items:center;gap:14px;padding:8px 0;border-bottom:1px solid var(--p5-border,#252830);margin-bottom:6px}
.wsv2-flow-dag-actions button{padding:6px 18px;font-size:11px;font-weight:700;letter-spacing:1.5px;border-radius:0;cursor:pointer;background:var(--p5-red,#e63946);color:#fff;border:none}
.wsv2-flow-dag-actions button[hidden]{display:none}
.wsv2-flow-dag-actions button:disabled{opacity:0.5;cursor:not-allowed}
.wsv2-flow-run-meta{font-size:10px;letter-spacing:0.5px;color:var(--p5-text-secondary,#9ba1ac)}

/* Node card refactor: head + result block */
.wsv2-flow-dag-node{flex-direction:column;align-items:stretch;display:flex;padding:0}
.wsv2-flow-dag-node-head{display:grid;grid-template-columns:32px 1fr auto;gap:10px;align-items:center;padding:10px 12px;cursor:pointer}
.wsv2-flow-dag-node-head:hover{background:rgba(230,57,70,0.05)}

/* Run-status colors */
.wsv2-flow-dag-node-running{border-color:var(--p5-yellow,#f5c518)}
.wsv2-flow-dag-node-running .wsv2-flow-dag-node-idx{color:var(--p5-yellow,#f5c518)}
.wsv2-flow-dag-node-done{border-color:var(--p5-red,#e63946)}
.wsv2-flow-dag-node-failed{border-color:var(--p5-red,#e63946);background:rgba(230,57,70,0.06)}

/* Run badge */
.wsv2-flow-dag-node-run-badge{font-size:8px;font-weight:700;letter-spacing:1px;padding:1px 5px;margin-left:6px;border:1px solid currentColor}
.wsv2-flow-dag-node-run-pending{color:var(--p5-muted,#666)}
.wsv2-flow-dag-node-run-running{color:var(--p5-yellow,#f5c518)}
.wsv2-flow-dag-node-run-done{color:var(--p5-red,#e63946)}
.wsv2-flow-dag-node-run-failed{color:#fff;background:var(--p5-red,#e63946);border-color:var(--p5-red,#e63946)}

/* Run result block */
.wsv2-flow-dag-node-result{padding:0 12px 12px 54px;font-size:11px;color:var(--p5-text-secondary,#9ba1ac)}
.wsv2-flow-dag-node-result-failed{color:var(--p5-red,#e63946);font-size:11px;padding:6px 12px 10px 54px;border-top:1px dashed var(--p5-red,#e63946)}
.wsv2-flow-dag-node-text{
  background:var(--p5-input-bg,#161922);padding:8px 10px;
  font-size:11px;line-height:1.6;color:var(--p5-text,#e0e0e0);
  font-family:'Noto Sans SC',ui-monospace,monospace;white-space:pre-wrap;
  max-height:240px;overflow-y:auto;border-radius:0;margin:0;
}
.wsv2-flow-dag-node-imgs{display:grid;grid-template-columns:repeat(auto-fill,minmax(110px,1fr));gap:6px}
.wsv2-flow-dag-node-imgs img{width:100%;height:110px;object-fit:cover;border:1px solid var(--p5-border,#252830);background:var(--p5-input-bg,#161922);cursor:zoom-in}
.wsv2-flow-dag-node-vids{display:grid;grid-template-columns:repeat(auto-fill,minmax(220px,1fr));gap:6px}
.wsv2-flow-dag-node-vids video{width:100%;max-height:200px;background:#000;border:1px solid var(--p5-border,#252830)}
.wsv2-flow-tool-stub{font-size:10px;letter-spacing:0.5px;color:var(--p5-muted,#666);margin-bottom:6px;font-style:italic}
.wsv2-flow-tool-line{font-size:11px;line-height:1.6;padding:3px 0;border-bottom:1px dashed var(--p5-border,#252830)}
.wsv2-flow-tool-line b{color:var(--p5-red,#e63946);font-weight:700}

/* H5 / mobile: stack chat above DAG */
@media (max-width:768px){
  .wsv2-flow-body{grid-template-columns:1fr;grid-template-rows:50% 1px 50%}
  .wsv2-flow-body::before{grid-column:1;grid-row:2;width:auto;height:1px}
  .wsv2-flow-dag-node-result{padding-left:12px}
  /* create 屏（"创作"tab landing）无 BACK — 底部 nav 已是平级切换；
     子屏（gen/tpl/...）BACK 仍显，回 create（见 wsv2GoBack）。 */
  #workshop-v2-view .wsv2-screen[data-screen="create"] .wsv2-create-back{display:none}
}

/* ============================================================
   Light theme overrides for hardcoded #0a0b0e / #000 backgrounds
   that the wsv2 token remap above can't reach. Scoped to the
   embedded #workshop-v2-view so the standalone .wsv2-shell page
   (always-dark, P7 deprecation candidate) stays unchanged.
   ============================================================ */
[data-theme="light"] #workshop-v2-view .wsv2-composer-body,
[data-theme="light"] #workshop-v2-view .wsv2-composer-bottom,
[data-theme="light"] #workshop-v2-view .wsv2-tpl-prompt-box textarea,
[data-theme="light"] #workshop-v2-view .wsv2-tpl-hist-lb {
  background: var(--p5-input-bg);
}
/* "01 · INTENT" floating label sits over the red border — its bg must match
   the surrounding page so the border-line cleanly tucks under it. */
[data-theme="light"] #workshop-v2-view .wsv2-composer::before {
  background: var(--p5-black);
}
/* S3 BUILDING card chrome (header strip + footer with progress bar) — was
   pure #000 to read as a "console". In light it should be a slightly
   recessed card surface, still distinct from the body. */
[data-theme="light"] #workshop-v2-view .wsv2-gen-ph,
[data-theme="light"] #workshop-v2-view .wsv2-gen-pf {
  background: var(--p5-input-bg);
}
/* S4 middle col — `.wsv2-tpl-output` 硬编码 #0a0b0e 在 light 模式下变成大片黑色 canvas
   跟两边白色 input/hist col 撕裂。按"暗 canvas"语义在 light 下用稍深米 input-bg
   做"轻陷下"感（input/hist 白 → 中列稍深米 → 视觉层次保留）；result-art 框跟着
   再深一档 frame，给图像一点"画框"感而不是纯白嵌入纯白。 */
[data-theme="light"] #workshop-v2-view .wsv2-tpl-output {
  background: var(--p5-input-bg);
}
[data-theme="light"] #workshop-v2-view .wsv2-tpl-result-art {
  background: var(--p5-frame);
}
/* GroupCombo template page (gc-tpl screen) — same #0a0b0e pattern as single
   skill above. Center board / right-side history rail / prompt block / chip
   popover header all need flipping. The topic textarea sits in the white
   input column and should read as a card (white) for hierarchy. */
[data-theme="light"] #workshop-v2-view .wsv2-gc-board,
[data-theme="light"] #workshop-v2-view .wsv2-gc-side,
[data-theme="light"] #workshop-v2-view .wsv2-gc-prompt-block,
[data-theme="light"] #workshop-v2-view .wsv2-gc-chip-pop-head {
  background: var(--p5-input-bg);
}
[data-theme="light"] #workshop-v2-view .wsv2-gc-topic textarea {
  background: var(--p5-card);
}
/* Prompt modal — textarea 硬编码 #08090b 黑底 + 浅色 ink-1 文字，light 模式下文字几乎看不见。
   面板本身用 token 已对，textarea 单独覆盖白底 + 深字。 */
[data-theme="light"] .wsv2-prompt-panel textarea {
  background: var(--p5-input-bg);
  color: var(--p5-text);
}
/* 图片右上角 zoom / download 工具按钮 — 硬编码 rgba(0,0,0,.72) 在 light 模式与浅米色画框
   对比不足，且 icon 是 currentColor=ink-1（light 下变深字），整体灰糊一团看不清。
   light 下改纯白底 + 深字 + 深边 + 微阴影"浮"在 frame 浅米画框上，确保对比度。
   2026-05-07 sxy supplement: 配合 .wsv2-tpl-result-img background 改 transparent 让父
   art 颜色显出后，画框是浅米色，按钮必须更高对比度才不被吃掉。 */
[data-theme="light"] #workshop-v2-view .wsv2-result-tools button {
  background: var(--p5-card);
  border-color: var(--p5-border);
  color: var(--p5-text);
  box-shadow: 0 2px 8px rgba(0,0,0,.12);
}
[data-theme="light"] #workshop-v2-view .wsv2-result-tools button:hover {
  background: #fff;
  border-color: var(--wsv2-red);
  color: var(--wsv2-red);
  box-shadow: 0 2px 12px rgba(230,57,70,.25);
}
/* tpl loading overlay — 硬编码 rgba(10,10,14,.86) 黑底 + rgba(255,255,255,.78) 白字
   在 light 主题下变成"浅米色页面 + 黑色大遮罩 + 白字" 完全撕裂。light 下改浅米
   半透明 + 深字。同时覆盖 GroupCombo 的 #wsv2GcTplLoading（共用同 class）。
   2026-05-07 sxy fix。*/
[data-theme="light"] #workshop-v2-view .wsv2-tpl-loading {
  background: rgba(248,245,240,.86);
}
[data-theme="light"] #workshop-v2-view .wsv2-tpl-loading-text {
  color: var(--p5-text-secondary);
}
/* wsv2-toast — 硬编码 background:#000 + var(--wsv2-ink) 文字。light 主题下黑底
   tooltip 飘在浅米页面上不协调,改白底 + 深字 + 保留红边框 + 加阴影"浮"在背景上。
   2026-05-07 sxy fix。*/
[data-theme="light"] .wsv2-toast {
  background: var(--p5-card);
  color: var(--p5-text);
  box-shadow: 0 6px 24px rgba(0,0,0,.18);
}

/* ====================================================================
   2026-05-21 Seedance fallback 弹框决策 — chip + modal
   ==================================================================== */

/* Awaiting / cancelled card states (extend wsv2-gc-bn-card) */
.wsv2-gc-bn-slots .wsv2-gc-bn-card.is-awaiting{border-color:#ff9b3f;background:rgba(255,155,63,.08)}
.wsv2-gc-bn-slots .wsv2-gc-bn-card.is-awaiting .st{color:#ff9b3f}
.wsv2-gc-bn-slots .wsv2-gc-bn-card.is-cancelled{border-color:var(--wsv2-line);background:rgba(120,120,120,.06);opacity:.7}
.wsv2-gc-bn-slots .wsv2-gc-bn-card.is-cancelled .st{color:var(--wsv2-ink-3)}

/* In-card chip (awaiting / cancelled message + REVIEW button) */
.wsv2-gc-fb-chip{
  display:flex;align-items:center;gap:8px;
  margin-top:6px;padding:6px 8px;
  border:1px solid #ff9b3f;background:rgba(255,155,63,.1);
  font-family:var(--wsv2-mono);font-size:11px;line-height:1.3;color:var(--wsv2-ink);
}
.wsv2-gc-fb-chip.is-cancelled{border-color:var(--wsv2-line);background:rgba(120,120,120,.08);color:var(--wsv2-ink-3)}
.wsv2-gc-fb-chip-icon{font-size:13px}
.wsv2-gc-fb-chip-msg{flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;letter-spacing:.02em}
.wsv2-gc-fb-chip-time{font-family:var(--wsv2-display);font-weight:800;color:#ff9b3f;letter-spacing:.04em}
.wsv2-gc-fb-chip-btn{
  border:1px solid #ff9b3f;background:#ff9b3f;color:#fff;
  font-family:var(--wsv2-mono);font-size:10px;font-weight:700;letter-spacing:.08em;
  padding:4px 10px;cursor:pointer;text-transform:uppercase;
  transition:background .15s;
}
.wsv2-gc-fb-chip-btn:hover{background:#e6852d}

/* Modal */
.wsv2-gc-fb-overlay{
  position:fixed;inset:0;z-index:9000;
  display:flex;align-items:center;justify-content:center;
  background:rgba(0,0,0,.5);
  padding:20px;
}
.wsv2-gc-fb-modal{
  position:relative;
  width:100%;max-width:520px;max-height:90vh;overflow-y:auto;
  background:var(--wsv2-bg-1);border:1px solid var(--wsv2-line);
  font-family:var(--wsv2-mono);color:var(--wsv2-ink);
}
.wsv2-gc-fb-modal .wsv2-modal-x{
  position:absolute;top:8px;right:8px;
  width:28px;height:28px;
  background:transparent;border:none;color:var(--wsv2-ink-3);
  font-size:22px;line-height:1;cursor:pointer;
  display:flex;align-items:center;justify-content:center;
}
.wsv2-gc-fb-modal .wsv2-modal-x:hover{color:var(--wsv2-ink)}
.wsv2-gc-fb-head{
  padding:18px 22px 12px;border-bottom:1px solid var(--wsv2-line);
}
.wsv2-gc-fb-head h3{
  margin:0 0 6px;font-family:var(--wsv2-display);font-size:16px;font-weight:800;letter-spacing:.02em;
  color:#ff9b3f;
}
.wsv2-gc-fb-countdown{font-size:11px;color:var(--wsv2-ink-3);letter-spacing:.04em}
.wsv2-gc-fb-countdown #wsv2GcFbModalRemain{color:#ff9b3f;font-weight:700;font-family:var(--wsv2-display)}
.wsv2-gc-fb-body{padding:14px 22px;display:flex;flex-direction:column;gap:10px}
.wsv2-gc-fb-row{display:flex;gap:8px;font-size:12.5px;line-height:1.5}
.wsv2-gc-fb-row-k{color:var(--wsv2-ink-3);min-width:60px;flex-shrink:0;letter-spacing:.04em}
.wsv2-gc-fb-row-v{color:var(--wsv2-ink);flex:1}
.wsv2-gc-fb-refunded .wsv2-gc-fb-row-v{color:var(--wsv2-ok);font-weight:700}
.wsv2-gc-fb-options{display:flex;flex-direction:column;gap:8px;margin-top:6px}
.wsv2-gc-fb-option{
  border:1px solid var(--wsv2-line);padding:10px 12px;
  background:var(--wsv2-bg-0);
}
.wsv2-gc-fb-option h4{
  margin:0 0 6px;font-size:12.5px;font-weight:700;letter-spacing:.02em;color:var(--wsv2-ink);
  font-family:var(--wsv2-mono);text-transform:none;
}
.wsv2-gc-fb-option p{margin:0;font-size:11.5px;color:var(--wsv2-ink-2);line-height:1.45}
.wsv2-gc-fb-option ul{margin:0;padding-left:18px;font-size:11.5px;color:var(--wsv2-ink-2);line-height:1.5}
.wsv2-gc-fb-option ul li{margin:2px 0}
.wsv2-gc-fb-insufficient{
  margin-top:4px;padding:8px 10px;
  border:1px solid var(--wsv2-red);background:rgba(230,57,70,.08);
  color:var(--wsv2-red);font-size:11.5px;font-weight:600;letter-spacing:.02em;
}
.wsv2-gc-fb-foot{
  padding:12px 22px;border-top:1px solid var(--wsv2-line);
  display:flex;gap:10px;justify-content:flex-end;
}
.wsv2-gc-fb-foot .wsv2-btn{
  flex:1;max-width:200px;
  padding:10px 14px;
  font-family:var(--wsv2-mono);font-size:11px;font-weight:700;letter-spacing:.08em;text-transform:uppercase;
  border:1px solid var(--wsv2-line);cursor:pointer;
  transition:background .15s,border-color .15s,color .15s;
}
.wsv2-gc-fb-foot .wsv2-btn-ghost{background:transparent;color:var(--wsv2-ink-2)}
.wsv2-gc-fb-foot .wsv2-btn-ghost:hover:not(:disabled){border-color:var(--wsv2-ink-2);color:var(--wsv2-ink)}
.wsv2-gc-fb-foot .wsv2-btn-primary{background:var(--wsv2-red);border-color:var(--wsv2-red);color:#fff}
.wsv2-gc-fb-foot .wsv2-btn-primary:hover:not(:disabled){background:#c92e3a;border-color:#c92e3a}
.wsv2-gc-fb-foot .wsv2-btn:disabled{opacity:.45;cursor:not-allowed}

/* Light theme tweaks */
[data-theme="light"] .wsv2-gc-fb-modal{background:#fff}
[data-theme="light"] .wsv2-gc-fb-option{background:#fafafa}

/* Mobile */
@media (max-width: 640px) {
  .wsv2-gc-fb-overlay{padding:12px}
  .wsv2-gc-fb-modal{max-width:100%;max-height:95vh}
  .wsv2-gc-fb-head{padding:14px 16px 10px}
  .wsv2-gc-fb-body{padding:12px 16px}
  .wsv2-gc-fb-foot{padding:10px 16px;flex-direction:column-reverse}
  .wsv2-gc-fb-foot .wsv2-btn{max-width:none}
  .wsv2-gc-fb-chip{flex-wrap:wrap}
}
