/* ═══════════════════════════════════════════
   APP WORLD — DARK THEME DESIGN SYSTEM
   BUILD: 2026-04-23-dashboard-polish
   ═══════════════════════════════════════════ */

/* ═══════════════════════════════════════════
   MC-CELL — efflora UsageModeCard, verbatim port
   ═══════════════════════════════════════════
   Source: SaaS2AI/web/src/pages/marketing/LandingPage.tsx
           function UsageModeCard (lines 678-832)
           accent variant "amber"

   Self-contained. Does not inherit anything from legacy .ob-step* classes.
   Layout wrapper (.ob-steps 4-col grid) and text content are App World's.

   Line-by-line trace of each rule:
     .mc-cell           — the <div className="um-tilt-card"> wrapper at line 739-758
     .mc-cell__glow     — the <div aria-hidden> "Top accent glow bleed" at line 760-766
     .mc-cell__body     — the <div style={{padding: '28px 28px 22px'}}> header at line 769
     .mc-cell__pill     — the mode pill div at line 771-786
     .mc-cell__pill-*   — the three <span>s inside the pill (line 783-785)
     .mc-cell__title    — the <h3> at line 789-795
     .mc-cell__desc     — the <p> at line 798-802
     .mc-status-pill    — port of efflora .dashboard-status-badge (tokens.css)
     .mc-cta            — port of efflora .dashboard-primary-btn (tokens.css)
   ═══════════════════════════════════════════ */

/* Current-step zone — NO card material.
 *
 * New direction (per user proposal): .ob becomes the single outer card that
 * contains all 4 steps as zones. The current-step "cell" is just a zone
 * inside that card, structurally identical to done/locked zones — same
 * transparent bg, no border, no shadow, no radius. State is signalled by
 * content density alone: amber circle + "当前步骤" label + status + desc
 * + CTA. No nested card, no competing material.
 *
 * This resolves:
 *   1. card-in-card visual — only .ob is a card now
 *   2. sibling-vs-current cell size mismatch — no sibling card to compare
 *   3. mint→amber gradient ribbon — not needed; colored circles alone carry
 *      state, with a neutral hairline between them */
/* Current chip — selected-state with 360° amber halo bloom.
 *
 * Layered box-shadow recipe (top → bottom of stack):
 *   1. Inset top highlight — chip catches light from above
 *   2. Inset bottom edge — subtle depth
 *   3. Hairline lit border (spread 0, blur 0, .25 alpha) — thin amber
 *      outline showing the chip edge is catching halo light from its own
 *      bloom
 *   4. Tight inner halo (24px blur, +2px spread, .38) — bright amber
 *      ring immediately around the chip
 *   5. Medium halo (48px blur, +6px spread, .22) — softer spread
 *   6. Atmospheric glow (80px blur, 0 spread, .12) — wide wash
 *   7. Dark drop shadow — grounds the chip onto the plate
 *
 * The positive spread values (+2, +6) on halos are what make them reach
 * visibly OUTWARD as a halo — zero-spread shadows only blur at the edge,
 * they don't extend away from the element. */
.mc-cell {
  position: relative;
  z-index: 2;
  border-radius: 16px;
  overflow: hidden;
  background: linear-gradient(180deg,
    rgba(12,12,12,.65) 0%,
    rgba(8,8,8,.72) 100%);
  backdrop-filter: blur(12px) saturate(1.2);
  -webkit-backdrop-filter: blur(12px) saturate(1.2);
  box-shadow:
    inset 0 1px 0 rgba(255,248,235,.14),
    0 0 22px 0 rgba(255,248,235,.36),
    0 4px 16px -4px rgba(0,0,0,.45);
  transition: background .3s, box-shadow .3s;
}

/* Specular highlight stripe — a thin warm-white line across the top of
 * the Current chip, like light reflecting off a smooth glass edge. Only
 * on Current chip to emphasize its "featured glass" quality; Done/Locked
 * stay simpler. */
.mc-cell::after {
  content: '';
  position: absolute;
  top: 0;
  left: 14%;
  right: 14%;
  height: 1px;
  background: linear-gradient(90deg,
    transparent,
    rgba(255,248,235,.38) 50%,
    transparent);
  pointer-events: none;
  z-index: 3;
}

/* Internal top-catching highlight + subtle breathing animation.
 * Animation pulses opacity 72-100% over 4s so the internal glow feels
 * alive (like iOS selected-button micro-pulse), while the external halo
 * on .mc-cell stays static — creates "ambient env steady, subject alive"
 * visual contrast that signals the chip is an interactive focal point. */
/* Top-accent glow bleed — verbatim port of Efflora's qs-step top glow
 * (source: SaaS2AI/web/src/pages/marketing/LandingPage.tsx:432-436).
 * Fixed 80px height linear gradient from top edge → transparent. NOT a
 * full-chip wash — confined height prevents the fog problem. Creates
 * "light entering from above" 3D effect: brightest where light "hits
 * first" at the top, fades as it "travels into" the chip. */
.mc-cell__glow {
  position: absolute;
  top: -1px;
  left: 0;
  right: 0;
  height: 80px;
  pointer-events: none;
  z-index: 0;
  background: linear-gradient(180deg,
    rgba(255,248,235,.08) 0%,
    transparent 100%);
}

/* Body container — carries the internal padding now that the zone itself
 * has its own background + shadow. Left-aligned to match done/locked zones. */
.mc-cell__body {
  position: relative;
  z-index: 1;
  padding: 18px 18px 20px;
  display: flex;
  flex-direction: column;
  align-items: flex-start;
  text-align: left;
}

/* Circle pseudo-element removed — zone material + zone-num carry state now. */
.mc-cell__body::before { content: none; }

/* Label "当前步骤" below the amber indicator circle. The "STEP N" prefix and
 * "·" separator are now redundant with the number inside the circle above,
 * so they're hidden; only the plain-language label is shown, styled as a
 * small amber mono kicker for rhythm parity with sibling cells' "步骤 N ·
 * 已完成" labels. */
/* Pill + status row — kicker "当前步骤" and status indicator sit on one
 * line at the chip header. Row gap handles the spacing between them so
 * .mc-cell__pill and .mc-status-pill inside don't need their own
 * margin-bottom. */
.mc-head-row {
  display: flex;
  align-items: center;
  gap: 10px;
  flex-wrap: wrap;
  margin-bottom: 10px;
}
.mc-head-row .mc-cell__pill,
.mc-head-row .mc-status-pill {
  margin-bottom: 0;
}

.mc-cell__pill {
  display: inline-flex;
  align-items: center;
  gap: 6px;
  font-family: 'IBM Plex Mono', monospace;
  font-size: 10px;
  font-weight: 600;
  letter-spacing: .14em;
  color: rgba(255,255,255,.82);
  text-transform: uppercase;
  margin-bottom: 10px;
}
.mc-cell__pill-prefix,
.mc-cell__pill-sep { display: none; }
/* .mc-cell__pill-label inherits the kicker treatment from .mc-cell__pill —
 * do NOT override text-transform / letter-spacing / font-family here. */

/* lines 789-795: h3 title */
.mc-cell__title {
  font-size: clamp(17px, 2vw, 20px);
  font-weight: 700;
  letter-spacing: -.025em;
  color: var(--text-primary);
  margin: 0 0 8px;
  line-height: 1.3;
  font-family: var(--font);
}

/* lines 798-802: p description */
.mc-cell__desc {
  font-size: 12.5px;
  color: var(--text-body);
  line-height: 1.65;
  margin: 0 0 14px;
  font-weight: 500;  /* CJK prose compensation, App World convention */
  max-width: 36ch;
}

/* Bullet-list variant of the description — rendered when the i18n entry is a
   list instead of a string. Tight cards in the 4-col grid become unreadable
   with paragraphs, so each operational fact gets its own line. Morandi-gold
   middle-dot marker keeps the list consistent with the card's accent palette
   (no default • — reads too heavy). */
.mc-cell__bullets {
  list-style: none;
  margin: 0 0 14px;
  padding: 0;
  font-size: 12.5px;
  color: var(--text-body);
  line-height: 1.65;
  font-weight: 500;
  max-width: 36ch;
}
.mc-cell__bullets li {
  position: relative;
  padding: 2px 0 2px 14px;
}
.mc-cell__bullets li::before {
  content: "·";
  position: absolute;
  left: 2px;
  top: 2px;
  font-weight: 700;
  color: rgba(200,169,110,.62);
}
.mc-cell__bullets code {
  padding: 0 4px;
  border-radius: 4px;
  background: rgba(255,255,255,.06);
  border: 1px solid rgba(255,255,255,.08);
  font-family: 'IBM Plex Mono', monospace;
  font-size: .92em;
}

/* Status indicator — pill treatment removed per design feedback: the cell already
   has two rounded elements (STEP chip + CTA pill); a third chip felt crowded.
   Now a plain inline dot + text, no background, no border. */
.mc-status-pill {
  display: inline-flex;
  align-items: center;
  gap: 8px;
  font-size: 11.5px;
  font-weight: 500;
  margin-bottom: 10px;
}
.mc-status-pill--pending {
  color: #f2b5b5;
}
.mc-status-pill--ok {
  color: var(--accent-mint);
}
.mc-status-dot {
  width: 6px;
  height: 6px;
  border-radius: 999px;
  background: currentColor;
  box-shadow: 0 0 8px currentColor;
  flex-shrink: 0;
}
.mc-status-pill--pending .mc-status-dot {
  animation: mc-pulse 2s ease-in-out infinite;
}
@keyframes mc-pulse {
  0%, 100% { opacity: 1; }
  50%      { opacity: .4; }
}

/* CTA — verbatim port of Efflora Run's hero glass pill button
 * (src/pages/marketing/LandingPage.tsx:370-386 + styles/tokens.css:1357-1364).
 * Full-pill radius (980px), translucent white diagonal gradient, backdrop
 * blur + saturate + brightness boost, glass border with brighter top edge.
 * Matches the whole-card liquid-glass aesthetic — a solid white button
 * here was reading as too brand-assertive against the dark chip material. */
.mc-cta {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  padding: 8px 18px;
  font-size: 12px;
  font-weight: 500;
  letter-spacing: -.01em;
  border-radius: 980px;
  color: rgba(255,255,255,.92);
  background: linear-gradient(135deg,
    rgba(255,255,255,.10) 0%,
    rgba(255,255,255,.04) 50%,
    rgba(255,255,255,.08) 100%);
  backdrop-filter: saturate(180%) blur(20px) brightness(1.05);
  -webkit-backdrop-filter: saturate(180%) blur(20px) brightness(1.05);
  border: 1px solid rgba(255,255,255,.15);
  border-top-color: rgba(255,255,255,.28);
  box-shadow:
    0 2px 12px rgba(0,0,0,.25),
    inset 0 1px 1px rgba(255,255,255,.12),
    inset 0 -1px 1px rgba(0,0,0,.08);
  transition: all .2s cubic-bezier(.16,1,.3,1);
  text-decoration: none;
  position: relative;
  overflow: hidden;
}

/* Button shine-sweep — verbatim port of Efflora Run's .cta-primary-btn
 * shimmer (source: SaaS2AI/web/src/styles/tokens.css:1332-1355).
 * Single-direction sweep via snap-back keyframe trick (52%→53% instantly
 * jumps from +260% back to -160% so the light always travels L→R, never
 * reverses). 5s cycle: 0-28% idle, 28-52% sweep, 53-100% idle. */
.mc-cta::before {
  content: '';
  position: absolute;
  inset: 0;
  background: linear-gradient(108deg,
    transparent 35%,
    rgba(255,255,255,.18) 50%,
    transparent 65%);
  transform: translateX(-160%);
  animation: btn-shimmer 5s ease-in-out infinite;
  pointer-events: none;
}
@keyframes btn-shimmer {
  0%, 28%   { transform: translateX(-160%); }
  52%       { transform: translateX(260%); }
  53%, 100% { transform: translateX(-160%); }
}
@media (prefers-reduced-motion: reduce) {
  .mc-cta::before { animation: none; display: none; }
}
.mc-cta:hover {
  background: linear-gradient(135deg,
    rgba(255,255,255,.15) 0%,
    rgba(255,255,255,.07) 50%,
    rgba(255,255,255,.12) 100%);
  border-color: rgba(255,255,255,.22);
  border-top-color: rgba(255,255,255,.36);
  box-shadow:
    0 4px 20px rgba(0,0,0,.3),
    inset 0 1px 1px rgba(255,255,255,.16),
    inset 0 -1px 1px rgba(0,0,0,.08);
  transform: translateY(-1px);
}

/* ═══════════════════════════════════════════
   End of MC-CELL block
   ═══════════════════════════════════════════ */

/* ═══════════════════════════════════════════════════════════════════
   DESIGN TOKENS — Tier 1 per DESIGN_SYSTEM.md (verbatim).
   Source: /Users/jenniedali/Documents/SaaS2AI/web/DESIGN_SYSTEM.md §Tier 1
   Do not edit these values. Aliases for App World legacy names are below.
   ═══════════════════════════════════════════════════════════════════ */
:root {
  /* ── Tier 1 — surfaces ── */
  --bg:           #0a0a0a;
  --bg-elevated:  #121214;
  --bg-container: #17171a;
  /* Modal surface — 4-tier luminance hierarchy（参 Linear / Material 3 dark
   * mode pattern）：base → panel → hover → selected。每档 8 RGB，纯中性。
   * 选中 = 再上一档 surface elevation，**不靠 glow/border 颜色**。 */
  --bg-modal:           #1a1a1a;  /* 26 — modal base */
  --bg-modal-panel:     #282828;  /* 40 — 默认卡片 */
  --bg-modal-hover:     #303030;  /* 48 — hover */
  --bg-modal-selected:  #383838;  /* 56 — selected（再亮一档） */
  --border-modal:        rgba(255,255,255,.16);
  --border-modal-strong: rgba(255,255,255,.24);

  --surface:       rgba(255,255,255,.04);
  --surface-2:     rgba(255,255,255,.06);
  --surface-hover: rgba(255,255,255,.09);

  --border:        rgba(255,255,255,.10);
  --border-top:    rgba(255,255,255,.16);
  --border-strong: rgba(255,255,255,.22);

  /* ── Tier 1 — text (neutral, never warm) ── */
  --text-primary:   #FAFAFA;
  --text-body:      #D4D4D7;
  --text-secondary: #A1A1A6;
  --text-muted:     #71717A;
  --text-disabled:  rgba(250,250,250,0.30);

  /* ── Tier 1 — accent (warm amber, primary) ── */
  --accent:        #C8A96E;
  --accent-dim:    rgba(200,169,110,.6);
  --accent-bg:     rgba(200,169,110,.08);
  --accent-border: rgba(200,169,110,.22);

  /* ── Tier 1 — support (mint, success & docs nav only) ── */
  --morandi-mint: #7BBFA6;

  /* ── Tier 1 — narrow-context (do NOT use for CTAs/borders/hovers) ── */
  --accent-purple:        #a78bfa;              /* Efflora MODE B purple */
  --accent-purple-bg:     rgba(167,139,250,.08);
  --accent-purple-border: rgba(167,139,250,.22);
  --accent-blue:   #78B4FF;    /* docs/code only */
  --accent-teal:   #5eead4;
  --accent-rose:   #f9a8d4;

  /* ── Tier 1 — radius (buttons/inputs). Cards 16px, glass 22px inline. ── */
  --radius: 0.625rem;

  /* ── Tier 1 — font stacks ── */
  --font-display-latin:
    "Geist Variable", "Geist", "SF Pro Display", "Inter",
    -apple-system, BlinkMacSystemFont, "Segoe UI",
    "Helvetica Neue", Arial, sans-serif;
  --font-display-cjk:
    "SF Pro SC", "PingFang SC", "Hiragino Sans GB",
    "Noto Sans SC", "Source Han Sans SC",
    "Microsoft YaHei", sans-serif;

  /* ═══════════════════════════════════════════════════════════════════
     App World legacy aliases (do NOT reference in new code).
     Maintained so pre-existing rules that use --text, --warm, --bg-raised
     keep working without a codebase-wide sweep.
     ═══════════════════════════════════════════════════════════════════ */

  /* Surfaces */
  --bg-raised:       var(--surface);
  --bg-raised-2:     var(--surface-2);
  --bg-raised-hover: var(--surface-hover);

  /* Text */
  --text:   var(--text-primary);
  --text-2: var(--text-secondary);
  --text-3: var(--text-muted);

  /* Borders */
  --border-hover: rgba(255,255,255,.24);

  /* Warm (legacy amber aliases) */
  --warm:          var(--accent);
  --warm-dim:      rgba(200,169,110,.4);
  --warm-bg:       var(--accent-bg);
  --warm-fade:     rgba(200,169,110,.25);
  --warm-contrast: rgba(0,0,0,.72);
  --accent-contrast: #1a1204;

  /* Mint legacy alias — canonical is --morandi-mint */
  --accent-mint:        var(--morandi-mint);
  --accent-mint-bg:     rgba(123,191,166,.12);
  --accent-mint-border: rgba(123,191,166,.22);

  /* Blue/teal/rose narrow-context (docs & code only per spec) */
  --accent-blue-bg:     rgba(120,180,255,.08);
  --accent-blue-border: rgba(120,180,255,.2);

  /* Semantic — success ties to mint per spec Tier 3 status badge */
  --success:     var(--morandi-mint);
  --success-bg:  rgba(123,191,166,.12);
  --warning:     #C8A96E;
  --warning-bg:  rgba(200,169,110,.12);
  --danger:      #e8b0a9;

  /* Shadows — spec anti-pattern 5: shadows always black, low alpha.
     Amber/colored glows REMOVED (previous --accent-glow deleted). */
  --shadow:       0 18px 42px rgba(0,0,0,.22);
  --shadow-soft:  0 4px 16px rgba(0,0,0,.16);
  --shadow-md:    0 8px 28px rgba(0,0,0,.22);
  --shadow-inset: inset 0 1px 0 rgba(255,255,255,.05);
  --shadow-panel:
    0 1px 2px rgba(0,0,0,.12),
    0 4px 16px rgba(0,0,0,.16),
    inset 0 1px 1px rgba(255,255,255,.05),
    inset 0 -1px 1px rgba(0,0,0,.08);
  --shadow-card-elevated:
    0 18px 42px rgba(0,0,0,.22),
    inset 0 1px 0 rgba(255,255,255,.05);
  --highlight: rgba(255,255,255,.1);

  /* Material gradients (Tier 2.2 / 2.3 recipe fragments) */
  --material-gradient:      linear-gradient(180deg, rgba(255,255,255,.065) 0%, rgba(255,255,255,.026) 18%, rgba(255,255,255,.018) 100%);
  --material-gradient-soft: linear-gradient(180deg, rgba(255,255,255,.035) 0%, rgba(255,255,255,.012) 100%);

  /* Radius scale (only --radius is spec-canonical; scale kept for legacy) */
  --radius-sm: 8px;
  --radius-md: 12px;
  --radius-lg: 20px;
  --radius-xl: 24px;

  /* Motion — spec mandates this curve for hover/reveal at 210-320ms */
  --ease-out-quart: cubic-bezier(.16, 1, .3, 1);

  /* Font legacy aliases — spec html uses Inter-first; --font-display prefers Geist */
  --font:         'Inter', 'Noto Sans SC', -apple-system, BlinkMacSystemFont, 'PingFang SC', 'Hiragino Sans GB', 'Microsoft YaHei', sans-serif;
  --font-display: var(--font-display-latin);
  --mono:         'IBM Plex Mono', 'SF Mono', Menlo, monospace;

  /* Generic aliases */
  --muted: var(--text-secondary);
  --paper: var(--surface);
  --paper-alt: var(--surface-2);
  --paper-strong: var(--surface);
  --line: var(--border);
  --line-strong: var(--border-strong);
  --accent-3: rgba(255,255,255,.08);
}

/* ═══════════════════════════════════════════
   LIGHT THEME OVERRIDES
   ═══════════════════════════════════════════ */

[data-theme="light"] {
  /* Pure white + grayscale. Amber exclusively reserved for Current chip
   * (halo + fill). Everywhere else uses neutral zinc: kickers, progress,
   * sidebar, active states, links all grayscale. Dark-mode amber branding
   * doesn't carry over to light mode — a clean white + gray palette with
   * a single amber focal point reads more premium (Linear/Vercel/Raycast). */
  --bg: #ffffff;               /* pure white */
  --bg-raised: #ffffff;
  --bg-raised-2: #f4f4f5;      /* zinc-100 */
  --bg-raised-hover: #e4e4e7;
  --surface: #f4f4f5;
  --surface-hover: #e4e4e7;

  /* Text — neutral zinc scale, solid colors, high-contrast.
   *   #09090b on #f8f8fa = ~20:1  (AAA)
   *   #27272a on #f8f8fa = ~13:1  (AAA)
   *   #52525b on #f8f8fa = ~7:1   (AAA)
   *   #71717a on #f8f8fa = ~4.5:1 (AA body)
   *   #a1a1aa on #f8f8fa = ~2.7:1 (decorative) */
  --text: #09090b;
  --text-primary: #09090b;
  --text-secondary: #52525b;
  --text-2: #52525b;
  --text-3: #71717a;
  --text-body: #27272a;
  --text-muted: #a1a1aa;

  /* Cool neutral borders */
  --border: #e4e4e7;           /* zinc-200 */
  --border-strong: #d4d4d8;   /* zinc-300 */
  --border-hover: #a1a1aa;    /* zinc-400 */

  /* Amber accent — deepened for better contrast on white backgrounds.
   * On dark bg #C8A96E reads golden; on white it's too pale, so text
   * uses a darker #a8884c while fill backgrounds keep the lighter .12
   * alpha of the original tone. */
  --accent: #a8884c;
  --accent-dim: rgba(168,136,76,.72);
  --accent-bg: rgba(200,169,110,.12);
  --accent-border: rgba(200,169,110,.30);
  --accent-contrast: #ffffff;

  --warm: #92400e;
  --warm-dim: #c2410c;
  --warm-bg: #fed7aa;
  --warm-fade: #fdba74;
  --warm-contrast: #ffffff;

  --success: #5d9a7e;          /* deeper mint — reads on white */
  --success-bg: rgba(123,191,166,.14);
  --warning: #a8884c;
  --warning-bg: rgba(200,169,110,.16);
  --danger: #c97a6f;            /* deeper coral */

  /* Shadows — neutral cool, aligns with zinc palette. */
  --shadow: 0 4px 24px rgba(0,0,0,.06);
  --shadow-soft: 0 2px 12px rgba(0,0,0,.04);
  --shadow-md: 0 4px 16px rgba(0,0,0,.08);
  --shadow-inset: inset 0 1px 1px rgba(0,0,0,.03);
  --highlight: rgba(0,0,0,.05);
}

/* Light theme panel override */
[data-theme="light"] .panel {
  border: 1px solid #e5e7eb;
  border-top-color: #d1d5db;
  background: #ffffff;
  box-shadow:
    0 1px 3px rgba(0,0,0,.06),
    0 1px 2px rgba(0,0,0,.04);
}

[data-theme="light"] .panel::before {
  background: linear-gradient(90deg, transparent, rgba(0,0,0,.02) 30%, rgba(0,0,0,.03) 50%, rgba(0,0,0,.02) 70%, transparent);
}

[data-theme="light"] .panel.subtle {
  background: #f9fafb;
  border-color: #e5e7eb;
  border-top-color: #d1d5db;
}

[data-theme="light"] .panel h2 {
  color: #111827;
}

[data-theme="light"] .panel-header h2 {
  color: #111827;
}

/* Light theme heatmap table override */
[data-theme="light"] .heatmap-table thead th {
  border-bottom: 1px solid #e5e7eb;
  color: #6b7280;
}

[data-theme="light"] .heatmap-row:hover {
  background: #f9fafb;
}

[data-theme="light"] .heatmap-row td {
  border-top: 1px solid #f3f4f6;
}

[data-theme="light"] .hm-fail {
  color: #d1d5db;
}

[data-theme="light"] .heatmap-task-name strong {
  color: #111827;
}

[data-theme="light"] .hm-pass {
  color: #f59e0b;
}

/* Unified table borders for light theme */
[data-theme="light"] .table-wrap {
  border-color: #e5e7eb;
}

[data-theme="light"] th,
[data-theme="light"] td {
  border-bottom-color: #f3f4f6;
}

/* Benchmark tables light theme */
[data-theme="light"] .breakdown-table,
[data-theme="light"] .leaderboard-table,
[data-theme="light"] .heatmap-table {
  border-color: #e5e7eb;
}

[data-theme="light"] .breakdown-table thead,
[data-theme="light"] .leaderboard-table thead th,
[data-theme="light"] .heatmap-table thead th {
  background: #f9fafb;
  color: #6b7280;
  border-bottom-color: #e5e7eb;
}

[data-theme="light"] .breakdown-table tbody tr:hover,
[data-theme="light"] .leaderboard-table tbody tr:hover,
[data-theme="light"] .heatmap-row:hover {
  background: #f9fafb;
}

[data-theme="light"] .breakdown-table tbody tr:not(:last-child) td,
[data-theme="light"] .leaderboard-table td,
[data-theme="light"] .heatmap-row td {
  border-bottom-color: #f3f4f6;
}

[data-theme="light"] .breakdown-agent-col,
[data-theme="light"] .breakdown-agent-cell {
  background: #f9fafb;
  border-right-color: #e5e7eb;
}

[data-theme="light"] .breakdown-table tbody tr:hover .breakdown-agent-cell {
  background: #f9fafb;
}

[data-theme="light"] .breakdown-agent-cell strong,
[data-theme="light"] .leaderboard-table td strong {
  color: #111827;
}

[data-theme="light"] .agent-org,
[data-theme="light"] .leaderboard-table td .subtle-text {
  color: #6b7280;
}

[data-theme="light"] .breakdown-overall-col,
[data-theme="light"] .breakdown-overall-cell {
  background: #fef6e8 !important;
  color: #92400e;
}

[data-theme="light"] .score-value {
  color: #111827;
}

/* Difficulty badges light theme */
[data-theme="light"] .diff-easy,
[data-theme="light"] .diff-low {
  color: #15803d;
  background: #f0f4f0;
  border-color: rgba(22, 101, 52, 0.2);
}

[data-theme="light"] .diff-medium {
  color: #c2410c;
  background: #ffe9d6;
  border-color: rgba(194, 65, 12, 0.2);
}

[data-theme="light"] .diff-hard,
[data-theme="light"] .diff-high {
  color: #4b5563;
  background: #f5f5f5;
  border-color: rgba(0, 0, 0, 0.12);
}

/* Task Catalog badges - light theme (stronger contrast) */
[data-theme="light"] .difficulty-badge.diff-low {
  color: #15803d;
  background: #dcfce7;
  border-color: rgba(22, 101, 52, 0.28);
}
[data-theme="light"] .difficulty-badge.diff-medium {
  color: #c2410c;
  background: #ffedd5;
  border-color: rgba(194, 65, 12, 0.28);
}
[data-theme="light"] .difficulty-badge.diff-high {
  color: #b91c1c;
  background: #fee2e2;
  border-color: rgba(185, 28, 28, 0.28);
}
[data-theme="light"] .rl-badge {
  color: #1d4ed8;
  background: rgba(37, 99, 235, 0.12);
  border-color: rgba(37, 99, 235, 0.3);
}
[data-theme="light"] .eval-only-badge {
  color: #475569;
  background: #f1f5f9;
  border-color: #cbd5e1;
}

* { box-sizing: border-box; }

/* ── Base typography & body — verbatim from DESIGN_SYSTEM.md §Tier 1 ──
 * html font-family is Inter-first (CJK via Noto Sans SC); display usages
 * opt into Geist via var(--font-display-latin). Body tokens copied exactly
 * from spec: line-height 1.6, text-body color, antialiased, optimizeLegibility. */
html {
  scroll-behavior: smooth;
  font-family: 'Inter', 'Noto Sans SC', -apple-system, BlinkMacSystemFont, 'PingFang SC', 'Microsoft YaHei', sans-serif;
}

body {
  margin: 0;
  background: var(--bg);
  color: var(--text-body);
  line-height: 1.6;
  -webkit-font-smoothing: antialiased;
  -moz-osx-font-smoothing: grayscale;
  text-rendering: optimizeLegibility;
}

/* CJK at 400 reads lighter than Latin on dark — bump paragraphs to 500 (spec §Tier 1). */
p { font-weight: 500; }

/* Heading rhythm — spec mandates weight 600 + letter-spacing -.02em. */
h1, h2, h3, h4, h5, h6 {
  font-weight: 600;
  letter-spacing: -0.02em;
  color: var(--text-primary);
}
h1 { letter-spacing: -.035em; }

a { color: inherit; text-decoration: none; }
img { display: block; max-width: 100%; }
button, input, select, textarea { font: inherit; color: inherit; }

/* Grain overlay removed — DESIGN_SYSTEM.md §2.1 specifies a fixed dot pattern
 * (now on .console-shell::before) as the only page texture. Layering grain on
 * top of the dot pattern was an App-World-era addition not in the spec. */

/* ── THEME TOGGLE — chip pill for settings row action slot.
 * Previously full-width sidebar button; moved to settings page. */
.theme-toggle {
  display: inline-flex;
  align-items: center;
  gap: 8px;
  padding: 7px 14px;
  border-radius: 999px;
  background: linear-gradient(135deg, rgba(255,255,255,.06) 0%, rgba(255,255,255,.02) 50%, rgba(255,255,255,.05) 100%);
  backdrop-filter: blur(12px);
  -webkit-backdrop-filter: blur(12px);
  border: 1px solid rgba(255,255,255,.10);
  border-top-color: rgba(255,255,255,.16);
  color: var(--text-secondary);
  font-size: .82rem;
  font-weight: 500;
  cursor: pointer;
  transition: background .15s ease, border-color .15s ease, color .15s ease;
  box-shadow: inset 0 1px 0 rgba(255,255,255,.04);
}
.theme-toggle:hover {
  background: linear-gradient(135deg, rgba(255,255,255,.10) 0%, rgba(255,255,255,.04) 50%, rgba(255,255,255,.08) 100%);
  border-color: rgba(255,255,255,.18);
  color: var(--text-primary);
}
.theme-toggle .theme-icon {
  flex-shrink: 0;
  transition: transform .2s ease;
}
.theme-toggle:hover .theme-icon {
  transform: rotate(15deg);
}
.theme-toggle-text {
  text-align: left;
}

/* ── LAYOUT ── */

/* ── Console shell — §2.1b Utility/Console surface ──
 * Archetype B: background steps back so content reads first.
 * Linear gradient only — no amber radial, no mint radial (spec §2.1b).
 * Warm breath baked into top of gradient: barely perceptible at .05.
 * Dot pattern: 30px grid, .04 alpha, tighter 60%/50% mask, opacity .22
 * (§2.1b params — dimmer/tighter than the hero recipe).
 * overflow-x: clip (not overflow: hidden) preserves the sticky sidebar. */
.console-shell {
  min-height: 100vh;
  display: grid;
  grid-template-columns: 260px minmax(0, 1fr);
  position: relative;
  overflow-x: clip;
  background:
    /* Top-right amber atmospheric anchor — Efflora brand warmth */
    radial-gradient(ellipse 800px 600px at 85% 12%,
      rgba(200,169,110,.05) 0%, transparent 70%),
    /* Mid-right atmospheric warmth */
    radial-gradient(ellipse 900px 700px at 72% 48%,
      rgba(200,169,110,.03) 0%, transparent 75%),
    /* Bottom-left counter anchor */
    radial-gradient(ellipse 700px 500px at 18% 82%,
      rgba(200,169,110,.035) 0%, transparent 72%),
    /* Top warm breath */
    linear-gradient(180deg, rgba(200,169,110,.045) 0%, transparent 320px),
    /* Base dark gradient */
    linear-gradient(180deg, #0b0c11 0%, #0a0b10 30%, #08090d 100%);
}
.console-shell::before {
  content: '';
  position: fixed;
  inset: 0;
  pointer-events: none;
  z-index: 0;
  background-image: radial-gradient(circle, rgba(255,255,255,.04) 1px,
                                             transparent 1px);
  background-size: 30px 30px;
  mask-image:         radial-gradient(ellipse 60% 50% at 50% 38%, black 0%, transparent 70%);
  -webkit-mask-image: radial-gradient(ellipse 60% 50% at 50% 38%, black 0%, transparent 70%);
  opacity: .22;
}
.console-shell > * { position: relative; z-index: 1; }

[data-theme="light"] .console-shell {
  background: var(--bg);
}
[data-theme="light"] .console-shell::before { display: none; }

.page-shell {
  min-width: 0;
  padding: 24px 28px 40px;
}

/* ── SIDEBAR ── */

.sidebar {
  position: sticky;
  top: 0;
  align-self: start;
  height: 100vh;
  padding: 16px 12px;
  border-right: 1px solid rgba(255,255,255,.08);
  background:
    linear-gradient(180deg, rgba(255,255,255,.07) 0%, rgba(255,255,255,.03) 15%, rgba(255,255,255,.018) 100%);
  backdrop-filter: blur(20px) saturate(160%);
  -webkit-backdrop-filter: blur(20px) saturate(160%);
  box-shadow: inset -1px 0 0 rgba(255,255,255,.03);
  overflow-y: auto;
}

.sidebar-inner {
  height: 100%;
  display: flex;
  flex-direction: column;
  gap: 12px;
}

.brand {
  display: flex;
  gap: 12px;
  align-items: center;
  padding: 12px;
  border-radius: var(--radius-md);
  transition: background .15s;
}
.brand:hover { background: var(--surface); }

/* Cream-on-dark "brand plaque" — white tile + black silhouette,
   like a metal nameplate. High contrast against dark sidebar. */
.brand-logo-tile {
  position: relative;
  width: 44px;
  height: 44px;
  border-radius: 22%;
  flex-shrink: 0;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  overflow: hidden;
  background:
    linear-gradient(180deg, #ffffff 0%, #f4ead8 100%);
  box-shadow:
    inset 0 1px 0 rgba(255,255,255,.95),
    inset 0 -1px 0 rgba(140,108,68,.18),
    0 4px 14px rgba(0,0,0,.45),
    0 1px 0 rgba(232,200,138,.1);
}
.brand-logo-tile::before {
  content: '';
  position: absolute; inset: 0;
  border-radius: inherit;
  border: 1px solid rgba(200,169,110,.5);
  pointer-events: none;
}
.brand-logo-tile::after {
  content: '';
  position: absolute; inset: 0;
  border-radius: inherit;
  background: radial-gradient(120% 60% at 30% 0%, rgba(255,255,255,.6), transparent 60%);
  pointer-events: none;
}

.brand-logo {
  position: relative;
  z-index: 1;
  width: 80%;
  height: 80%;
  object-fit: contain;
}

.brand-name {
  font-size: .92rem;
  font-weight: 700;
}

.brand-sub {
  color: var(--text-3);
  font-size: .72rem;
  font-family: var(--mono);
}

/* Workspace card — Tier 2.3 panel recipe (bg + border + 4-layer shadow).
 * Sidebar-scoped; radius 16px per spec; no hover lift (sidebar cards are
 * static, unlike main-content panels). */
.workspace-card {
  padding: 14px;
  background: linear-gradient(180deg, rgba(255,255,255,.035) 0%,
                                       rgba(255,255,255,.012) 100%);
  border: 1px solid rgba(255,255,255,.10);
  border-top-color: rgba(255,255,255,.16);
  border-radius: 16px;
  box-shadow:
    0 1px 2px rgba(0,0,0,.12),
    0 4px 16px rgba(0,0,0,.16),
    inset 0 1px 1px rgba(255,255,255,.05),
    inset 0 -1px 1px rgba(0,0,0,.08);
  position: relative;
  overflow: hidden;
}
.workspace-card::before {
  content: '';
  position: absolute;
  inset: 0 0 auto;
  height: 70px;
  pointer-events: none;
  background: linear-gradient(180deg, rgba(255,255,255,.045) 0%, transparent 100%);
}
.workspace-card > * { position: relative; z-index: 1; }
.workspace-card h2 {
  margin: 0 0 6px;
  font-size: .88rem;
}
.workspace-card p {
  margin: 0 0 10px;
  color: var(--text-2);
  font-size: .82rem;
  line-height: 1.5;
}

/* Sidebar captions — use the Tier 2.6 kicker spec (10px / .14em / .58 / 600). */
.workspace-label,
.nav-caption {
  display: inline-flex;
  align-items: center;
  gap: 6px;
  font-family: 'IBM Plex Mono', monospace;
  font-size: 10px;
  font-weight: 600;
  letter-spacing: .14em;
  text-transform: uppercase;
  color: rgba(200,169,110,.72);
}
.console-kicker {
  display: inline-flex;
  align-items: center;
  gap: 6px;
  font-family: 'IBM Plex Mono', monospace;
  font-size: 10px;
  font-weight: 600;
  letter-spacing: .14em;
  text-transform: uppercase;
  color: rgba(200,169,110,.58);
}

.workspace-meta {
  color: var(--text-3);
  font-size: .78rem;
}

.nav-caption { padding: 0 12px; margin-top: 4px; }

/* Progress rail */
.progress-rail {
  width: 100%;
  height: 6px;
  border-radius: 999px;
  overflow: hidden;
  background: rgba(255,255,255,.06);
  margin: 0 0 8px;
}
.progress-rail span {
  display: block;
  height: 100%;
  border-radius: 999px;
  background: linear-gradient(90deg, rgba(200,169,110,.4) 0%, #C8A96E 100%);
}

/* Navigation */
.side-nav { display: grid; gap: 2px; }

.side-link {
  display: flex;
  align-items: center;
  gap: 10px;
  width: 100%;
  padding: 11px 12px;
  border-radius: 14px;
  color: var(--text-secondary);
  font-size: .88rem;
  border: 1px solid transparent;
  transition: color .2s, background .2s, border-color .2s, transform .2s var(--ease-out-quart);
}
.side-link:hover {
  color: var(--text-primary);
  background: rgba(255,255,255,.045);
  border-color: rgba(255,255,255,.06);
  transform: translateX(2px);
}
.side-link.active {
  color: var(--text-primary);
  background: linear-gradient(180deg, rgba(200,169,110,.12) 0%, rgba(255,255,255,.055) 100%);
  border-color: rgba(200,169,110,.22);
  box-shadow:
    inset 0 1px 0 rgba(255,255,255,.05),
    0 10px 22px rgba(0,0,0,.16);
}
.side-icon {
  display: flex;
  align-items: center;
  flex-shrink: 0;
  opacity: .55;
  transition: opacity .15s;
}
.side-link:hover .side-icon { opacity: .75; }
.side-link.active .side-icon { opacity: .9; }

/* Sidebar note */
.sidebar-note {
  padding: 14px;
  border: 1px solid var(--border);
  border-radius: var(--radius-md);
  background: var(--surface);
}
.sidebar-note strong {
  display: block;
  margin-bottom: 4px;
  font-size: .88rem;
}
.sidebar-note p {
  margin: 0;
  color: var(--text-3);
  font-size: .78rem;
  line-height: 1.5;
}

/* Sidebar footer */
.sidebar-footer {
  margin-top: auto;
}

.user-card {
  padding: 12px;
  border: 1px solid rgba(255,255,255,.06);
  border-top-color: rgba(255,255,255,.10);
  border-radius: var(--radius-md);
  /* Near-opaque dark well — the sidebar's bg has a bright white top
     gradient (rgba(255,255,255,.07) at top); if this card were translucent,
     that brightness would bleed up into the logout button's backdrop-
     filter sample and read as a near-white pill. High alpha blocks that. */
  background: rgba(12,12,16,.92);
  display: flex;
  flex-direction: column;
  gap: 2px;
}

.user-name  { font-weight: 600; font-size: .82rem; }
.user-email { color: var(--text-3); font-size: .72rem; margin-bottom: 6px; }

/* Verbatim material port of .mc-cta (efflora hero glass pill) — same
 * translucent diagonal gradient, backdrop saturate+blur+brightness,
 * double-border with brighter top edge, layered shadow. Shimmer ::before
 * intentionally omitted: logout is a ghost action and should not draw
 * attention the way a primary CTA does. */
.user-logout-btn {
  align-self: stretch;
  padding: 8px 18px;
  border-radius: 980px;
  color: rgba(255,255,255,.92);
  /* Unified with .mc-cta recipe (translucent diagonal white gradient +
     backdrop saturate+blur+brightness + double border + layered shadow).
     Safe to use saturate(180%) here because .user-card's darkened well
     gives backdrop-filter a controlled neutral tone to sample. */
  background: linear-gradient(135deg,
    rgba(255,255,255,.10) 0%,
    rgba(255,255,255,.04) 50%,
    rgba(255,255,255,.08) 100%);
  backdrop-filter: saturate(180%) blur(20px) brightness(1.05);
  -webkit-backdrop-filter: saturate(180%) blur(20px) brightness(1.05);
  border: 1px solid rgba(255,255,255,.15);
  border-top-color: rgba(255,255,255,.28);
  box-shadow:
    0 2px 12px rgba(0,0,0,.25),
    inset 0 1px 1px rgba(255,255,255,.12),
    inset 0 -1px 1px rgba(0,0,0,.08);
  font-size: .78rem;
  font-weight: 500;
  font-family: var(--font);
  cursor: pointer;
  text-align: center;
  transition: all .2s cubic-bezier(.16,1,.3,1);
}
.user-logout-btn:hover {
  background: linear-gradient(135deg,
    rgba(255,255,255,.15) 0%,
    rgba(255,255,255,.07) 50%,
    rgba(255,255,255,.12) 100%);
  border-color: rgba(255,255,255,.22);
  border-top-color: rgba(255,255,255,.36);
  color: rgba(255,255,255,.98);
  box-shadow:
    0 4px 20px rgba(0,0,0,.3),
    inset 0 1px 1px rgba(255,255,255,.16),
    inset 0 -1px 1px rgba(0,0,0,.08);
}

/* ── TOPBAR ── */

.console-topbar {
  max-width: 1200px;
  margin: 0 auto 20px;
  display: flex;
  justify-content: space-between;
  align-items: center;
  gap: 16px;
  padding: 4px 0 0;
}

.console-heading {
  font-size: 1.15rem;
  font-weight: 700;
  font-family: var(--font-display);
}

.topbar-actions,
.hero-actions,
.button-row,
.panel-header,
.page-header,
.filter-bar,
.tab-row {
  display: flex;
  gap: 10px;
  align-items: center;
  flex-wrap: wrap;
}

.panel-header,
.page-header {
  justify-content: space-between;
}

/* ── CONTENT SHELL ── */

.content-shell {
  max-width: 1200px;
  margin: 0 auto;
  display: grid;
  gap: 20px;
  width: 100%;
}

/* ── BUTTONS ── */

/* rotating border glow — from efflora */
@property --border-angle {
  syntax: '<angle>';
  initial-value: 0deg;
  inherits: false;
}
@keyframes rotateBorder {
  to { --border-angle: 360deg; }
}

.primary-button,
.training-button,
.secondary-button,
.icon-button,
.tab-button {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  border-radius: var(--radius-sm);
  padding: 9px 16px;
  font-size: .88rem;
  font-weight: 500;
  cursor: pointer;
  transition: all .4s cubic-bezier(.16,1,.3,1);
  text-decoration: none;
  position: relative;
  overflow: hidden;
}

/* Primary button — verbatim port of DESIGN_SYSTEM.md §2.5 (.btn-primary).
 * Spec: solid #FAFAFA (text-primary) with #0a0a0f text. Amber is reserved for
 * ghost/secondary (see .secondary-button). Any glass-white treatment is spec
 * anti-pattern here. */
.primary-button {
  background: #FAFAFA;
  color: #0a0a0f;
  font-weight: 600;
  letter-spacing: -.01em;
  border: none;
}
.primary-button::before { display: none; }
.primary-button:hover {
  opacity: .92;
  transform: translateY(-1px);
  box-shadow: 0 6px 20px rgba(0,0,0,.4);
}
.primary-button:active { transform: translateY(0); }

/* Page-hero primary — frosted-glass pill, verbatim material port of efflora's
 * landing-page hero CTA (.hero-glass-btn). Source: SaaS2AI/web/src/pages/
 * marketing/LandingPage.tsx inline styles + tokens.css .hero-glass-btn hover.
 * Scoped to .page-hero so the global §2.5 white primary stays untouched. */
.page-hero .primary-button {
  padding: 8px 18px;
  border-radius: 980px;
  font-size: 13px;
  font-weight: 500;
  letter-spacing: -.01em;
  color: rgba(255,255,255,.92);
  /* White glass sheen over a translucent neutral base. The neutral layer
     sits between the backdrop sample and the white highlight, muting the
     amber that would otherwise bleed through the hero's top-right glow.
     backdrop-filter uses saturate(0%) to desaturate whatever does come
     through, so the button reads neutral like efflora's "Try it now". */
  background:
    linear-gradient(135deg, rgba(255,255,255,.12) 0%, rgba(255,255,255,.05) 50%, rgba(255,255,255,.10) 100%),
    linear-gradient(180deg, rgba(24,24,28,.62), rgba(24,24,28,.62));
  backdrop-filter: saturate(0%) blur(20px) brightness(1.05);
  -webkit-backdrop-filter: saturate(0%) blur(20px) brightness(1.05);
  border: 1px solid rgba(255,255,255,.15);
  border-top-color: rgba(255,255,255,.28);
  box-shadow:
    0 2px 12px rgba(0,0,0,.25),
    inset 0 1px 1px rgba(255,255,255,.12),
    inset 0 -1px 1px rgba(0,0,0,.08);
  transition: all .2s cubic-bezier(.16,1,.3,1);
}
.page-hero .primary-button:hover {
  background:
    linear-gradient(135deg, rgba(255,255,255,.18) 0%, rgba(255,255,255,.08) 50%, rgba(255,255,255,.15) 100%),
    linear-gradient(180deg, rgba(28,28,32,.62), rgba(28,28,32,.62));
  border-color: rgba(255,255,255,.22);
  border-top-color: rgba(255,255,255,.36);
  color: rgba(255,255,255,.98);
  opacity: 1;
  transform: translateY(-1px);
  box-shadow:
    0 4px 20px rgba(0,0,0,.3),
    inset 0 1px 1px rgba(255,255,255,.16),
    inset 0 -1px 1px rgba(0,0,0,.08);
}
/* Shimmer sweep — override the global .primary-button::before{display:none} */
.page-hero .primary-button::before {
  content: '';
  display: block;
  position: absolute;
  inset: 0;
  background: linear-gradient(108deg,
    transparent 35%,
    rgba(255,255,255,.18) 50%,
    transparent 65%);
  transform: translateX(-160%);
  animation: hero-btn-shimmer 5s ease-in-out infinite;
  pointer-events: none;
}
@keyframes hero-btn-shimmer {
  0%, 28%   { transform: translateX(-160%); }
  52%       { transform: translateX(260%); }
  53%, 100% { transform: translateX(-160%); }
}

/* Light theme — opaque white base blocks the hero card's blue tint */
[data-theme="light"] .page-hero .primary-button {
  color: rgba(15,23,42,.92);
  background:
    linear-gradient(135deg,
      rgba(0,0,0,.06) 0%,
      rgba(0,0,0,.02) 50%,
      rgba(0,0,0,.05) 100%),
    #ffffff;
  border: 1px solid rgba(0,0,0,.10);
  border-top-color: rgba(0,0,0,.16);
  box-shadow:
    0 2px 12px rgba(0,0,0,.08),
    inset 0 1px 1px rgba(255,255,255,.7),
    inset 0 -1px 1px rgba(0,0,0,.04);
}
[data-theme="light"] .page-hero .primary-button:hover {
  background:
    linear-gradient(135deg,
      rgba(0,0,0,.10) 0%,
      rgba(0,0,0,.04) 50%,
      rgba(0,0,0,.08) 100%),
    #fafafa;
  border-color: rgba(0,0,0,.16);
  border-top-color: rgba(0,0,0,.22);
  color: rgba(15,23,42,1);
}
[data-theme="light"] .page-hero .primary-button::before {
  background: linear-gradient(108deg,
    transparent 35%,
    rgba(255,255,255,.5) 50%,
    transparent 65%);
}

/* disabled button (grayed out with tooltip) */
.primary-button:disabled,
.primary-button.disabled-hint,
.training-button:disabled,
.training-button.disabled-hint,
.secondary-button:disabled,
.secondary-button.disabled-hint {
  opacity: 0.55;
  cursor: not-allowed;
  pointer-events: auto;
  transform: none;
  box-shadow: none;
}
.primary-button:disabled:hover,
.primary-button.disabled-hint:hover,
.training-button:disabled:hover,
.training-button.disabled-hint:hover,
.secondary-button:disabled:hover,
.secondary-button.disabled-hint:hover {
  transform: none;
  box-shadow: none;
  filter: none;
  background: transparent;
  color: var(--text-2);
}

/* training = glass accent, violet tint (mirrors primary-button pattern) */
.training-button {
  background: linear-gradient(180deg, rgba(167,139,250,.13) 0%, rgba(167,139,250,.04) 100%);
  border: 1px solid rgba(167,139,250,.2);
  border-top-color: rgba(167,139,250,.32);
  color: rgba(167,139,250,.95);
  font-weight: 600;
  box-shadow:
    0 1px 2px rgba(0,0,0,.12),
    0 4px 12px rgba(0,0,0,.14),
    inset 0 1px 1px rgba(255,255,255,.08),
    inset 0 -1px 1px rgba(0,0,0,.1);
}
.training-button::before {
  content: '';
  position: absolute; top: 0; left: 15%; right: 15%; height: 1px;
  background: linear-gradient(90deg, transparent, rgba(167,139,250,.45) 50%, transparent);
  pointer-events: none;
}
.training-button:hover {
  background: linear-gradient(180deg, rgba(167,139,250,.2) 0%, rgba(167,139,250,.08) 100%);
  border-color: rgba(167,139,250,.32);
  border-top-color: rgba(167,139,250,.48);
  transform: translateY(-1px);
  /* Purple box-shadow layer removed — spec anti-pattern 5 (shadows are always
   * black, never colored). */
  box-shadow:
    0 2px 4px rgba(0,0,0,.15),
    0 8px 24px rgba(0,0,0,.2),
    inset 0 1px 2px rgba(255,255,255,.12),
    inset 0 -1px 2px rgba(0,0,0,.1);
}
.training-button:active { transform: translateY(0); }

/* Secondary = amber ghost — verbatim port of DESIGN_SYSTEM.md §2.5 (.btn-ghost).
 * Spec: subtle amber-tinted gradient bg, amber text, amber border. Translates
 * the Tier 1 accent into a second-priority CTA that pairs with solid-white
 * .primary-button. */
.secondary-button {
  background: linear-gradient(180deg, rgba(200,169,110,.1) 0%, rgba(200,169,110,.04) 100%);
  color: var(--accent);
  border: 1px solid var(--accent-border);
  font-weight: 500;
}
.secondary-button:hover {
  background: linear-gradient(180deg, rgba(200,169,110,.16) 0%, rgba(200,169,110,.07) 100%);
  border-color: rgba(200,169,110,.38);
  transform: translateY(-1px);
}

.icon-button {
  background: transparent;
  border: none;
  padding: 6px 8px;
  font-size: 1.1rem;
  color: var(--text-2);
}
.icon-button:hover { color: var(--text); }

/* ── PANELS & CARDS ── */

/* Panel — verbatim port of DESIGN_SYSTEM.md §2.3.
 * Lighter-weight card recipe (vs §2.2 glass-panel): 2-stop gradient + 4-layer
 * shadow. Hover picks up amber in the border, lifts 1px. */
.panel {
  padding: 24px;
  background: linear-gradient(180deg, rgba(255,255,255,.035) 0%,
                                       rgba(255,255,255,.012) 100%);
  border: 1px solid rgba(255,255,255,.10);
  border-top-color: rgba(255,255,255,.16);
  border-radius: 16px;
  box-shadow:
    0 1px 2px rgba(0,0,0,.12),
    0 4px 16px rgba(0,0,0,.16),
    inset 0 1px 1px rgba(255,255,255,.05),
    inset 0 -1px 1px rgba(0,0,0,.08);
  position: relative;
  overflow: hidden;
  transition: border-color .2s, box-shadow .2s, transform .2s var(--ease-out-quart);
}
.panel:hover {
  border-color: rgba(200,169,110,.12);
  border-top-color: rgba(200,169,110,.18);
  transform: translateY(-1px);
}
.panel > * { position: relative; z-index: 1; }
.panel.subtle {
  background: rgba(255,255,255,.025);
  border-color: rgba(255,255,255,.05);
  border-top-color: rgba(255,255,255,.07);
}
/* Highlight accent — amber per spec (anti-pattern 1: no new accent colors;
 * the previous blue highlight violated the spec). */
.panel.highlight,
.emphasis-card,
.spotlight-panel {
  border-color: var(--accent-border);
  border-top-color: rgba(200,169,110,.34);
}

/* List card — a .panel that contains a flat list/table flush to its edges,
 * not a nested card. Strips the inner .table-wrap's border/radius and
 * makes the <table> transparent so rows read as a simple list. Material
 * verbatim from efflora .dashboard-card / .dashboard-table (see
 * SaaS2AI/web/src/styles/tokens.css lines 269-316). */
.panel.panel-list {
  padding: 0;
}
.panel.panel-list:hover {
  border-color: rgba(255,255,255,.10);
  border-top-color: rgba(255,255,255,.16);
  transform: none;
}
/* Panel header inside panel-list: align with first/last cell padding (24px)
   so the section title sits in the same vertical line as the body cells,
   and the count badge has breathing room from the right edge. */
.panel.panel-list > .panel-header {
  padding: 18px 24px 14px;
}
.panel.panel-list > .table-wrap {
  border: 0;
  border-radius: 0;
  overflow: visible;
}
.panel.panel-list table {
  background: transparent;
}
.panel.panel-list thead tr {
  background: linear-gradient(180deg, rgba(200,169,110,.09) 0%, rgba(200,169,110,.04) 100%);
  border-bottom: 1px solid rgba(200,169,110,.18);
}
.panel.panel-list th {
  position: static;
  padding: 14px 24px;
  text-align: center;
  font-family: inherit;
  font-size: .92rem;
  font-weight: 700;
  letter-spacing: -.01em;
  text-transform: none;
  color: var(--text-primary);
  background: transparent;
  border-bottom: none;
}
.panel.panel-list td {
  padding: 16px 24px;
  font-size: .875rem;
  text-align: center;
  color: var(--text-body);
  border-bottom: 1px solid rgba(255,255,255,.05);
  vertical-align: middle;
}
/* First column holds a labeled item (name + subtitle + tag), not a
   metric — left-align so it reads as an anchor, not a centered number. */
.panel.panel-list th:first-child,
.panel.panel-list td:first-child {
  text-align: left;
}
.panel.panel-list tbody tr {
  transition: background-color .12s ease;
}
.panel.panel-list tbody tr:hover {
  background: rgba(255,255,255,.025);
}
.panel.panel-list tbody tr:last-child td {
  border-bottom: none;
}
/* Whole-row clickable: stronger affordance + reactive text on hover */
.panel.panel-list tbody tr[data-row-link] {
  cursor: pointer;
}
.panel.panel-list tbody tr[data-row-link]:hover {
  background: rgba(255,255,255,.055);
}
.panel.panel-list tbody tr[data-row-link]:hover .cell-name-primary a {
  color: var(--accent);
}
.panel.panel-list tbody tr[data-row-link]:hover .cell-id-secondary {
  color: var(--text-2);
}
.panel.panel-list tbody tr[data-row-link]:hover .table-action-link {
  text-decoration: underline;
}
[data-theme="light"] .panel.panel-list tbody tr[data-row-link]:hover {
  background: rgba(37,99,235,.07);
}
[data-theme="light"] .panel.panel-list thead tr {
  background: linear-gradient(180deg, rgba(37,99,235,.08) 0%, rgba(37,99,235,.03) 100%);
  border-bottom-color: rgba(37,99,235,.18);
}
[data-theme="light"] .panel.panel-list td {
  border-bottom-color: #f3f4f6;
}
[data-theme="light"] .panel.panel-list tbody tr:hover {
  background: rgba(37,99,235,.04);
}

.panel-divider {
  height: 1px;
  background: rgba(255,255,255,.05);
  margin: 16px 0;
}

.onboarding-inline {
  display: flex;
  justify-content: space-between;
  align-items: center;
  gap: 16px;
  padding: 16px 20px;
  border: 1px solid rgba(255,255,255,.07);
  border-radius: var(--radius);
  background: rgba(255,255,255,.03);
}

/* ── PAGE HERO ──
 * Verbatim port of efflora .docs-callout (SaaS2AI/web/src/styles/tokens.css
 * lines 955-966). Subtle warm tint at top-right, neutral glass body, neutral
 * borders, black shadow — per DESIGN_SYSTEM §anti-pattern 1/5 no amber glow,
 * no amber-tinted shadow. Layout properties preserved from the app_world
 * version (flex row + button on the right). */
.page-hero {
  display: flex;
  justify-content: space-between;
  align-items: center;
  gap: 16px;
  padding: 22px 28px;
  border-radius: var(--radius);
  background:
    radial-gradient(circle at top right, rgba(200,169,110,.22) 0%, transparent 42%),
    radial-gradient(circle at bottom left, rgba(123,191,166,.04) 0%, transparent 22%),
    linear-gradient(180deg, rgba(255,255,255,.08) 0%, rgba(255,255,255,.03) 100%);
  border: 1px solid rgba(255,255,255,.08);
  border-top-color: rgba(255,255,255,.14);
  box-shadow:
    inset 0 1px 0 rgba(255,255,255,.05),
    0 18px 38px rgba(0,0,0,.18);
  position: relative;
  overflow: hidden;
  isolation: isolate;
}

/* Light theme — amber accent (was legacy blue, migrated to Efflora brand) */
[data-theme="light"] .page-hero {
  background:
    radial-gradient(circle at top right, rgba(200,169,110,.12) 0%, transparent 32%),
    linear-gradient(180deg, rgba(255,255,255,1) 0%, rgba(255,255,255,.85) 100%);
  border-color: rgba(0,0,0,.08);
  border-top-color: rgba(200,169,110,.22);
  box-shadow:
    inset 0 1px 0 rgba(255,255,255,1),
    0 8px 22px -8px rgba(0,0,0,.10);
}

.page-hero h1,
.detail-hero h1 {
  margin: 0;
  font-family: var(--font-display);
  font-size: clamp(1.6rem, 3vw, 2.4rem);
  font-weight: 700;
  line-height: 1.1;
  letter-spacing: -.02em;
}

.page-hero p,
.detail-hero p {
  max-width: 56ch;
  margin: 10px 0 0;
  color: var(--text-2);
  font-size: .92rem;
  line-height: 1.6;
}

.detail-hero {
  padding: 24px;
  border: 1px solid var(--border);
  border-radius: var(--radius);
  background: var(--bg-raised);
  position: relative;
  overflow: hidden;
}
.detail-hero::after {
  content: "";
  position: absolute;
  inset: auto -40px -60px auto;
  width: 180px;
  height: 180px;
  border-radius: 50%;
  background: radial-gradient(circle, rgba(120,180,255,.06), transparent 70%);
  pointer-events: none;
}

.callout-card {
  padding: 20px;
  border: 1px solid var(--accent-border);
  border-radius: var(--radius);
  background: var(--accent-bg);
  position: relative;
  overflow: hidden;
}

/* ── EYEBROW / LABELS ── */

.eyebrow {
  display: inline-flex;
  margin-bottom: 10px;
  padding: 5px 10px;
  border-radius: 999px;
  background: var(--accent-bg);
  color: var(--accent);
  font-size: .72rem;
  font-weight: 600;
  font-family: var(--mono);
  text-transform: uppercase;
  letter-spacing: .1em;
}

.subtle-text,
.catalog-metadata {
  color: var(--text-2);
  font-size: .88rem;
  line-height: 1.55;
}

/* ── GRIDS ── */

.metric-grid,
.card-grid,
.scene-grid,
.steps-grid,
.detail-grid,
.leaderboard-preview-grid,
.quick-actions-grid {
  display: grid;
  gap: 16px;
}
.metric-grid { grid-template-columns: repeat(auto-fit, minmax(160px, 1fr)); }
.card-grid,
.leaderboard-preview-grid,
.quick-actions-grid { grid-template-columns: repeat(auto-fit, minmax(240px, 1fr)); }
.scene-grid { grid-template-columns: repeat(auto-fit, minmax(180px, 1fr)); }
.scene-grid.compact { grid-template-columns: repeat(auto-fit, minmax(260px, 1fr)); }
.steps-grid { grid-template-columns: repeat(auto-fit, minmax(220px, 1fr)); }
.detail-grid { grid-template-columns: repeat(auto-fit, minmax(300px, 1fr)); }
.grid-2 { display: grid; grid-template-columns: repeat(auto-fit, minmax(260px, 1fr)); }

/* Metric card */
.metric-card {
  padding: 20px 18px;
  min-height: 130px;
  display: flex;
  flex-direction: column;
  justify-content: center;
  align-items: center;
  text-align: center;
  border: 1px solid var(--border);
  border-radius: var(--radius-md);
  background: var(--bg-raised);
  gap: 6px;
}

.metric-value {
  font-size: clamp(1.8rem, 3vw, 2.4rem);
  font-weight: 800;
  letter-spacing: -.04em;
  font-family: var(--font-display);
  line-height: 1;
}

.metric-label {
  color: var(--text);
  font-size: 0.875rem;
  font-weight: 600;
  line-height: 1.3;
}

.metric-sublabel {
  color: var(--text-2);
  font-size: 0.75rem;
  line-height: 1.4;
  max-width: 100%;
}
.metric-grid.compact { grid-template-columns: repeat(4, 1fr); gap: 12px; }
.metric-grid.compact .metric-card { min-height: auto; padding: 14px 16px; }
.metric-grid.compact .metric-value { font-size: 1.6rem; }

/* Catalog card */
.catalog-card {
  padding: 22px;
  border: 1px solid var(--border);
  border-radius: var(--radius);
  background: var(--bg-raised);
  transition: border-color .15s, transform .15s;
}
.catalog-card:hover {
  border-color: var(--border-strong);
  transform: translateY(-2px);
}
.catalog-card h2 {
  margin: 6px 0 8px;
  font-size: 1.15rem;
}
.catalog-card p {
  margin: 0 0 12px;
  color: var(--text-2);
  line-height: 1.6;
  font-size: .9rem;
}

.card-meta {
  color: var(--warm);
  font-size: .72rem;
  font-family: var(--mono);
  text-transform: uppercase;
  letter-spacing: .08em;
}

.goal-card { background: var(--bg-raised); }

/* ── DASHBOARD ── */

.dash > section { margin-bottom: 24px; }
.dash > section:last-child { margin-bottom: 0; }

.dash-top {
  display: flex;
  align-items: center;
  justify-content: space-between;
  margin-bottom: 4px;
}
/* Display heading — uses var(--font-display-latin) (Geist first per spec
 * §Tier 1) with CJK fallback via the stack. Spec §2.7 display numerals:
 * weight 760, letter-spacing -.045em. Applied here at weight 720 to keep
 * CJK chars visually stable (760 on PingFang can look chunky for Hanzi). */
.dash-greeting h1 {
  margin: 0 0 12px;
  color: var(--text-primary);
  font-family: var(--font-display-latin);
  font-size: clamp(2.15rem, 4vw, 2.95rem);
  line-height: 1.02;
  font-weight: 720;
  letter-spacing: -.045em;
  font-kerning: normal;
  font-synthesis: none;
}
/* ── .dash-greeting-sub — verbatim port of efflora .dashboard-page-subtitle ──
 * Source: tokens.css :: .dashboard-page-subtitle
 *   max-width 920; color text-body; font-size 16; line-height 1.85; letter-spacing -.01 */
.dash-greeting-sub {
  margin: 0;
  max-width: 920px;
  color: var(--text-body);
  font-size: 16px;
  line-height: 1.85;
  letter-spacing: -.01em;
}

/* Kicker / eyebrow — verbatim port of DESIGN_SYSTEM.md §2.6.
 * Spec: 10px IBM Plex Mono, .14em tracking, uppercase, amber at .58 alpha,
 * weight 600. "The single most distinctive typographic element." */
.page-kicker {
  margin: 0 0 12px;
  color: rgba(200,169,110,.72);
  font-family: 'IBM Plex Mono', 'Noto Sans SC', monospace;
  font-size: 12px;
  font-weight: 600;
  letter-spacing: .08em;
  text-transform: uppercase;
  line-height: 1;
}

/* ── ONBOARDING ──
 * Single outer card holding all 4 step zones — verbatim port of
 * DESIGN_SYSTEM.md §2.2 glass-panel recipe (3-stop .075/.03/.02 gradient
 * + backdrop-filter saturate(170%) blur(22px) + 5-layer shadow + 22px
 * radius). Why glass-panel and NOT §2.3 panel: the page shell is noisy
 * by spec (§2.1 mandates warm amber radial + mint radial + dot pattern),
 * and §2.3 panel's .035 alpha bg lets that noise show through, reading
 * as "dirty" on the card interior. Glass-panel's backdrop-filter blur
 * physically smears the bg dots/radials into a uniform frosted surface
 * behind the card, so the card interior is clean regardless of what's
 * behind it. Spec's own semantic for this tier is "cards that need to
 * blur the bg behind them" — exactly our case.
 *
 * This is still the ONLY card in the stepper. The inner 4 cells are flat
 * zones with no material of their own. */
/* Outer module — atmospheric radial backdrop. A soft amber wash anchored
 * near the Current chip (60-62% X, 55% Y) bleeds into the module backdrop,
 * so the Current chip's own halo feels like it "illuminates the whole
 * module", not like an isolated glowing element. Neutral .05 white base
 * provides the mild brightness lift against dashboard bg. Not a card —
 * still just a color region, but now with warmth + directionality tied
 * to the design's amber accent story. */
.ob {
  padding: 20px 24px 24px;
  background:
    /* Bottom-right warm-white corner halo */
    radial-gradient(ellipse 35% 65% at 100% 100%,
      rgba(255,248,235,.07) 0%,
      transparent 65%),
    /* Top-left amber corner halo */
    radial-gradient(ellipse 35% 65% at 0% 0%,
      rgba(200,169,110,.07) 0%,
      transparent 65%),
    /* §2.3 base panel gradient */
    linear-gradient(180deg,
      rgba(255,255,255,.035) 0%,
      rgba(255,255,255,.012) 100%);
  border-radius: 18px;
  box-shadow: 0 8px 28px -10px rgba(0,0,0,.4);
  position: relative;
  overflow: hidden;
}
.ob > * { position: relative; z-index: 1; }
/* Top-LEFT corner arc — 80×80 box，仅 top + left 1px amber border + radial mask
 * 平滑衰减，与卡圆角同步。 */
.ob::before {
  content: '';
  position: absolute;
  top: 0; left: 0;
  width: 160px; height: 160px;
  box-sizing: border-box;
  border-top: 1px solid rgba(200,169,110,.55);
  border-left: 1px solid rgba(200,169,110,.55);
  border-top-left-radius: 18px;
  pointer-events: none;
  z-index: 0;
  mask-image: radial-gradient(circle at 0% 0%,
    rgba(0,0,0,1)    0%,
    rgba(0,0,0,.92) 12%,
    rgba(0,0,0,.72) 28%,
    rgba(0,0,0,.48) 45%,
    rgba(0,0,0,.26) 62%,
    rgba(0,0,0,.10) 80%,
    transparent     100%);
  -webkit-mask-image: radial-gradient(circle at 0% 0%,
    rgba(0,0,0,1)    0%,
    rgba(0,0,0,.92) 12%,
    rgba(0,0,0,.72) 28%,
    rgba(0,0,0,.48) 45%,
    rgba(0,0,0,.26) 62%,
    rgba(0,0,0,.10) 80%,
    transparent     100%);
}
/* Bottom-RIGHT corner arc — mirror，warm-white */
.ob::after {
  content: '';
  position: absolute;
  bottom: 0; right: 0;
  width: 160px; height: 160px;
  box-sizing: border-box;
  border-bottom: 1px solid rgba(255,248,235,.45);
  border-right: 1px solid rgba(255,248,235,.45);
  border-bottom-right-radius: 18px;
  pointer-events: none;
  z-index: 0;
  mask-image: radial-gradient(circle at 100% 100%,
    rgba(0,0,0,1)    0%,
    rgba(0,0,0,.92) 12%,
    rgba(0,0,0,.72) 28%,
    rgba(0,0,0,.48) 45%,
    rgba(0,0,0,.26) 62%,
    rgba(0,0,0,.10) 80%,
    transparent     100%);
  -webkit-mask-image: radial-gradient(circle at 100% 100%,
    rgba(0,0,0,1)    0%,
    rgba(0,0,0,.92) 12%,
    rgba(0,0,0,.72) 28%,
    rgba(0,0,0,.48) 45%,
    rgba(0,0,0,.26) 62%,
    rgba(0,0,0,.10) 80%,
    transparent     100%);
}
/* Removed: rotating amber conic-gradient border. It was App World's own pre-efflora
 * decoration (the bright arc swept around the card every 10s, which showed up as a
 * mysterious vertical amber streak whenever it crossed the top edge — especially
 * jarring now that the current step already has its own static amber top accent).
 * efflora's UsageModeCard has no such animation; stay static. */
@property --ob-glow-angle {
  syntax: "<angle>";
  initial-value: 0deg;
  inherits: false;
}
@keyframes ob-glow-spin {
  to { --ob-glow-angle: 360deg; }
}
@keyframes ob-pulse {
  0%   { border-color: var(--warm-dim); }
  70%  { border-color: var(--warm-fade); }
  100% { border-color: var(--border); }
}
.ob.ob-spotlight { animation: ob-pulse 1.8s ease-out 2; }

/* Card-internal header row — no divider line. The 4 zones below (with their
 * 3D shadow-carved boundaries) already establish structural separation;
 * a horizontal line would duplicate that signal and flatten the depth. */
.ob-header {
  display: flex;
  align-items: center;
  justify-content: space-between;
  padding: 0 2px;
  margin-bottom: 18px;
}
.ob-title-row {
  display: flex;
  align-items: center;
  gap: 7px;
}
.ob-icon { display: none; }
.ob-title-row h2 {
  margin: 0;
  font-size: .68rem;
  font-weight: 600;
  color: rgba(200,169,110,.72);
  letter-spacing: .14em;
  text-transform: uppercase;
  font-family: 'IBM Plex Mono', monospace;
}
.ob-progress {
  display: flex;
  align-items: center;
  gap: 10px;
}
.ob-progress-text {
  font-family: 'IBM Plex Mono', monospace;
  font-size: 11px;
  letter-spacing: .08em;
  color: rgba(200,169,110,.72);
}
.ob-progress-rail {
  width: 120px;
  height: 2px;
  background: rgba(255,255,255,.08);
  border-radius: 999px;
  overflow: hidden;
}
.ob-progress-rail span {
  display: block;
  height: 100%;
  background: linear-gradient(90deg, rgba(200,169,110,.4) 0%, #C8A96E 100%);
  border-radius: 999px;
  transition: width .4s cubic-bezier(.16,1,.3,1);
}

/* ── Steps: 4 raised chips with rounded corners ──
 * Each chip is an independent rounded block; the ACTIVE chip is identified
 * by an omnidirectional amber halo (layered bloom). Inactive chips (Done /
 * Locked) differ only by subtle fill + slight drop shadow — no pit shadows,
 * no carved-in zones. Reference: iOS/macOS selected-state buttons where a
 * single glowing element in a row of flat rounded blocks signals focus. */
.ob-steps {
  display: grid;
  grid-template-columns: repeat(4, 1fr);
  gap: 6px;
  align-items: stretch;
  position: relative;
}
.ob-line { display: none; }

/* Chip base — independent rounded block, raised slightly off the plate.
 * All chips share this shape / padding / alignment; state classes below
 * only adjust the material (fill + shadow strength). */
.ob-step {
  display: flex;
  flex-direction: column;
  align-items: flex-start;
  text-align: left;
  padding: 18px 18px 20px;
  text-decoration: none;
  color: var(--text);
  position: relative;
  isolation: isolate;
  border-radius: 16px;
  transition: background .3s, box-shadow .3s;
}

/* Rim-light pseudo — renders a directional amber inset shadow on the chip
 * edge that faces the Current (.mc-cell) chip. Adjacency selectors below
 * activate different rims based on each chip's position relative to the
 * current one (left neighbor = right rim, right neighbor = left rim,
 * farther = weaker rim). This simulates radiosity: each chip "catches
 * light on its near side" instead of being passively painted by the
 * current chip's bloom. */
.ob-step::before {
  content: '';
  position: absolute;
  inset: 0;
  pointer-events: none;
  border-radius: inherit;
  z-index: 0;
  box-shadow: none;
  transition: box-shadow .3s;
}
.ob-step > * {
  position: relative;
  z-index: 1;
}

/* Left neighbor of current — right edge facing current gets subtle rim.
 * Tightened from prior version (.36/22px → .22/12px) — strong rim was
 * washing a large area of the neighbor chip, creating the impression
 * that the whole row was glowing. Now only a narrow edge catches light. */
.ob-step:has(+ .mc-cell)::before {
  box-shadow: inset -2px 0 12px -3px rgba(255,248,235,.22);
}
/* Right neighbor — mirrored */
.mc-cell + .ob-step::before {
  box-shadow: inset 2px 0 12px -3px rgba(255,248,235,.22);
}
/* 2-positions-away rim rules REMOVED — distance falloff at 2 positions
 * is unrealistic for a small glow; the weak rim was still visible on
 * Step 1 (left-of-step-3) and Step 5 (right-of-step-3 if it existed),
 * contributing to the "whole row is foggy" feel. Only immediate
 * neighbors get rim now. */

/* Done (已完成) — translucent dark chip. Alpha lowered .82→.55 so the plate
 * warmth bleeds through, giving the chip a "translucent glass" quality
 * (通透感) rather than an opaque block. Same simplification as the metric
 * card: removed the heavy 10px drop and the bottom inset dark — those
 * were "grounded/weighted" signals that killed translucency. Only the
 * thin ground-kiss + top highlight remain. */
.ob-step.is-done {
  background: linear-gradient(180deg,
    rgba(12,12,12,.55) 0%,
    rgba(8,8,8,.65) 100%);
  box-shadow:
    inset 0 1px 0 rgba(255,255,255,.06),
    0 1px 2px rgba(0,0,0,.2);
}

/* Locked (未开启) — slightly deeper fill than Done, still translucent. */
.ob-step.is-locked {
  background: linear-gradient(180deg,
    rgba(7,7,7,.65) 0%,
    rgba(4,4,4,.75) 100%);
  box-shadow:
    inset 0 1px 0 rgba(255,255,255,.03),
    0 1px 2px rgba(0,0,0,.18);
}

/* Legacy: .ob-step-indicator wrapper is still in the DOM for backward-
 * compat with any non-dashboard templates — just lay it out flat since the
 * circle it used to contain is now hidden. */
.ob-step-indicator {
  display: contents;
}

/* Circles gone — state is carried by the zone material and the zone-num
 * numeral at top, not by a redundant indicator pill. */
.ob-check,
.ob-check.current { display: none; }

/* ── Zone-num ─────────────────────────────────────────────────
 * "步骤N" label at the top of each zone, colored by state. Chinese falls
 * back to Noto Sans SC, numeric renders in IBM Plex Mono with tabular
 * figures. Utilitarian size — sits above the kicker as a small but clear
 * "which step" tag, not a stylized display numeral. */
.zone-num {
  font-family: 'IBM Plex Mono', 'Noto Sans SC', 'Inter', monospace;
  font-size: 13px;
  font-weight: 500;
  letter-spacing: -.005em;
  line-height: 1;
  margin-bottom: 12px;
  font-variant-numeric: tabular-nums;
}
.zone-num--done   { color: rgba(255,255,255,.55); }
.zone-num--active { color: rgba(200,169,110,.95); }
.zone-num--locked { color: rgba(255,255,255,.28); }

/* Kicker-step — brand-signature small-cap mono label for stepper states.
 * Shared base for "步骤 N · 已完成" (done) and "步骤 N" (locked); the current
 * step's kicker lives on .mc-cell__pill further up. Done = mint, active = amber,
 * locked = dim — state lives in the label color, not in a separate treatment. */
.ob-step-label,
.kicker-step {
  font-family: 'IBM Plex Mono', monospace;
  font-size: 10px;
  letter-spacing: .14em;
  text-transform: uppercase;
  font-weight: 600;
  line-height: 1;
  margin-bottom: 10px;
}
.kicker-step--done   { color: rgba(255,255,255,.55); }
.kicker-step--active { color: rgba(200,169,110,.82); }
.kicker-step--locked { color: rgba(255,255,255,.30); }

/* State icon prefixes — tiny inline glyph differentiates Done vs Locked
 * beyond just alpha, so the two states are at-a-glance distinguishable
 * even without reading text. Mint check for Done (completion = success),
 * neutral en-dash for Locked (not yet engaged). */
.kicker-step--done::before {
  content: '✓';
  color: rgba(123,191,166,.72);
  font-weight: 700;
  margin-right: 6px;
  font-family: system-ui, -apple-system, sans-serif;
}
.kicker-step--locked::before {
  content: '–';
  color: rgba(255,255,255,.28);
  margin-right: 6px;
  font-weight: 500;
}
.kicker-step .dot    { opacity: .5; margin: 0 .4em; }
.ob-step-label.current-label { color: var(--accent); font-weight: 600; }

.ob-step-body { display: flex; flex-direction: column; }
.ob-step-body strong {
  display: block;
  font-size: 14px;
  font-weight: 500;
  color: var(--text-primary);
  line-height: 1.4;
  margin: 0;
  letter-spacing: -.01em;
}
.ob-step.is-locked .ob-step-body strong {
  color: rgba(255,255,255,.55);
}
.ob-step-body small {
  display: block;
  font-size: .75rem;
  color: var(--text-3);
  line-height: 1.45;
  margin-top: 6px;
}

/* ── Done: readable, green check conveys state ── */
.ob-step.is-done .ob-step-body strong {
  color: var(--text-2);
  font-weight: 400;
}

/* ═══════════════════════════════════════════════════════════════════
   Current step: verbatim port of efflora UsageModeCard (MODE A card)
   Source: SaaS2AI/web/src/pages/marketing/LandingPage.tsx :: UsageModeCard
           (lines 678-832, accent=amber variant)
   Layout (4-column grid, center-aligned) preserved from App World's original.
   ═══════════════════════════════════════════════════════════════════ */

/* ── Current step: efflora QuickStartStep/UsageModeCard material ──
 * Verbatim ports from SaaS2AI/web/src/pages/marketing/LandingPage.tsx:
 * - background, border, borderTopWidth:2, borderTopColor, boxShadow, overflow (line 418-428)
 * - ::before glow bleed (line 432-435) — but with top:0 instead of -1 to prevent
 *   overflow-clip leakage (App World's .ob-step.is-current sits inside a translucent
 *   parent, unlike efflora's card which sits on solid page bg).
 * - backdrop-filter deliberately omitted — suspected source of the vertical amber
 *   streak when combined with translucent parent + overflow:hidden + negative inset.
 */
/* Deleted: all .ob-step.is-current overrides. Current step cell now renders as
 * a new .mc-cell--current component (defined further below). See dashboard.html. */
.ob-step.ob-step-nolink { cursor: default; }

/* ── Locked: softer, not invisible ── */
.ob-step.is-locked { pointer-events: none; }
.ob-step.is-locked .ob-step-body strong {
  font-size: .8rem;
  font-weight: 400;
  color: var(--text-3);
}

/* Deleted: .ob-cta — replaced by .mc-cta (see .mc-* block below). */

/* ═══════════════════════════════════════════
   ONBOARDING v2 (unused — reserved for potential future restructure)
   ═══════════════════════════════════════════ */

/* ── Compact horizontal progress rail ── */
.ob-rail {
  list-style: none;
  margin: 0;
  padding: 18px 24px 8px;
  display: flex;
  align-items: center;
  gap: 14px;
  border-bottom: 1px solid rgba(255,255,255,.05);
}
.ob-rail-step {
  display: inline-flex;
  align-items: center;
  gap: 10px;
  padding: 8px 14px 8px 10px;
  border-radius: 999px;
  font-size: .82rem;
  line-height: 1;
  border: 1px solid transparent;
  transition: color .2s, background .2s, border-color .2s;
  white-space: nowrap;
}
.ob-rail-step + .ob-rail-step::before {
  content: '';
  display: block;
  width: 20px;
  height: 1px;
  background: linear-gradient(90deg, rgba(255,255,255,.12), rgba(255,255,255,.04));
  margin-right: 4px;
  flex-shrink: 0;
}
.ob-rail-num {
  width: 20px;
  height: 20px;
  display: inline-grid;
  place-items: center;
  border-radius: 999px;
  font-size: 11px;
  font-weight: 600;
  font-family: var(--mono);
  flex-shrink: 0;
}
.ob-rail-step.is-done {
  color: var(--text-secondary);
}
.ob-rail-step.is-done .ob-rail-num {
  background: rgba(123,191,166,.14);
  color: var(--accent-mint);
  border: 1px solid rgba(123,191,166,.3);
}
.ob-rail-step.is-current {
  color: var(--text-primary);
  background: rgba(200,169,110,.08);
  border-color: rgba(200,169,110,.22);
  box-shadow: inset 0 1px 0 rgba(255,255,255,.04);
}
.ob-rail-step.is-current .ob-rail-num {
  background: linear-gradient(180deg, rgba(200,169,110,.9) 0%, rgba(180,149,92,.9) 100%);
  color: #1a1204;
  box-shadow: 0 1px 2px rgba(0,0,0,.2), inset 0 1px 0 rgba(255,255,255,.2);
}
.ob-rail-step.is-locked {
  color: var(--text-muted);
  opacity: .55;
}
.ob-rail-step.is-locked .ob-rail-num {
  background: transparent;
  color: var(--text-muted);
  border: 1px solid rgba(255,255,255,.1);
}

/* ── Hero card: rich, full-width, one step only ── */
.ob-hero {
  padding: 32px 32px 28px;
  position: relative;
}
.ob-hero-badge {
  display: inline-flex;
  align-items: center;
  gap: 8px;
  padding: 6px 12px 6px 10px;
  border-radius: 999px;
  background: rgba(200,169,110,.12);
  border: 1px solid rgba(200,169,110,.24);
  font-family: var(--mono);
  font-size: 11px;
  font-weight: 500;
  letter-spacing: .06em;
  text-transform: uppercase;
  color: rgba(247,236,212,.88);
  margin-bottom: 18px;
}
.ob-hero-badge-num {
  color: rgba(247,236,212,.98);
  font-weight: 600;
}
.ob-hero-badge-sep {
  color: rgba(200,169,110,.5);
}
.ob-hero-badge-label {
  color: rgba(247,236,212,.74);
  letter-spacing: .08em;
}
.ob-hero-title {
  margin: 0 0 10px;
  font-size: clamp(1.5rem, 2.4vw, 1.85rem);
  font-weight: 680;
  letter-spacing: -.035em;
  line-height: 1.15;
  color: var(--text-primary);
  font-family: var(--font);
}
.ob-hero-desc {
  margin: 0 0 22px;
  max-width: 720px;
  color: var(--text-body);
  font-size: 15px;
  line-height: 1.75;
  font-weight: 500;
  letter-spacing: -.005em;
}
.ob-inline-code {
  padding: 1px 6px;
  border-radius: 5px;
  background: rgba(200,169,110,.1);
  border: 1px solid rgba(200,169,110,.2);
  color: rgba(247,236,212,.92);
  font-family: var(--mono);
  font-size: .9em;
}

/* Feature list with green checks */
.ob-hero-features {
  list-style: none;
  margin: 0 0 22px;
  padding: 0;
  display: flex;
  flex-direction: column;
  gap: 10px;
}
.ob-hero-features li {
  display: flex;
  align-items: flex-start;
  gap: 10px;
  color: var(--text-body);
  font-size: 14px;
  line-height: 1.6;
}
.ob-check-icon {
  width: 18px;
  height: 18px;
  display: inline-grid;
  place-items: center;
  flex-shrink: 0;
  border-radius: 999px;
  background: rgba(123,191,166,.12);
  color: var(--accent-mint);
  font-size: 10px;
  font-weight: 700;
  line-height: 1;
  border: 1px solid rgba(123,191,166,.22);
}

/* Deleted: .ob-conn-* — replaced by .mc-status-pill (see .mc-* block). */

/* ── Inline terminal code block ── */
.ob-code-card {
  margin-bottom: 24px;
  border-radius: 14px;
  overflow: hidden;
  border: 1px solid rgba(255,255,255,.08);
  background:
    linear-gradient(180deg, rgba(0,0,0,.34) 0%, rgba(0,0,0,.44) 100%);
  box-shadow:
    inset 0 1px 0 rgba(255,255,255,.04),
    0 12px 28px rgba(0,0,0,.28);
}
.ob-code-header {
  display: flex;
  align-items: center;
  gap: 12px;
  padding: 10px 14px;
  border-bottom: 1px solid rgba(255,255,255,.06);
  background: rgba(255,255,255,.02);
}
.ob-code-dots {
  display: inline-flex;
  gap: 6px;
  flex-shrink: 0;
}
.ob-dot {
  width: 11px;
  height: 11px;
  border-radius: 999px;
  display: inline-block;
  box-shadow: inset 0 1px 1px rgba(255,255,255,.15), inset 0 -1px 1px rgba(0,0,0,.2);
}
.ob-dot-r { background: #ff5f57; }
.ob-dot-y { background: #febc2e; }
.ob-dot-g { background: #28c840; }
.ob-code-title {
  color: var(--text-muted);
  font-family: var(--mono);
  font-size: 11px;
  letter-spacing: .02em;
}
.ob-code-body {
  margin: 0;
  padding: 16px 18px;
  overflow-x: auto;
  font-family: var(--mono);
  font-size: 12.5px;
  line-height: 1.7;
  color: var(--text-body);
  white-space: pre;
}
.ob-code-line { display: block; }
.ob-code-prompt {
  color: var(--text-muted);
  margin-right: 8px;
  user-select: none;
}
.ob-code-string {
  color: rgba(247,236,212,.84);
}
.ob-code-arg {
  color: var(--accent);
}
.ob-code-plus {
  color: var(--accent);
  margin-right: 6px;
}
.ob-code-check {
  color: var(--accent-mint);
  margin-right: 6px;
  font-weight: 700;
}
.ob-code-id {
  color: var(--accent-mint);
}

/* ── Hero CTA (amber glass pill) ── */
.ob-hero-cta {
  display: inline-flex;
  align-items: center;
  gap: 8px;
  padding: 10px 20px;
  border-radius: 999px;
  background: linear-gradient(180deg, rgba(200,169,110,.22) 0%, rgba(200,169,110,.12) 100%);
  border: 1px solid rgba(200,169,110,.3);
  border-top-color: rgba(200,169,110,.46);
  color: rgba(247,236,212,.96);
  font-size: 14px;
  font-weight: 600;
  letter-spacing: -.01em;
  text-decoration: none;
  transition: transform .2s var(--ease-out-quart), border-color .2s, box-shadow .2s, background .2s;
  box-shadow:
    0 1px 2px rgba(0,0,0,.16),
    0 10px 22px rgba(0,0,0,.2),
    inset 0 1px 0 rgba(255,255,255,.06);
}
.ob-hero-cta svg {
  transition: transform .2s var(--ease-out-quart);
}
.ob-hero-cta:hover {
  background: linear-gradient(180deg, rgba(200,169,110,.3) 0%, rgba(200,169,110,.16) 100%);
  border-color: rgba(200,169,110,.42);
  border-top-color: rgba(200,169,110,.6);
  transform: translateY(-1px);
  box-shadow:
    0 0 0 3px rgba(200,169,110,.08),
    0 2px 4px rgba(0,0,0,.18),
    0 12px 28px rgba(0,0,0,.22),
    inset 0 1px 0 rgba(255,255,255,.08);
}
.ob-hero-cta:hover svg {
  transform: translateX(2px);
}

@media (max-width: 720px) {
  .ob-rail {
    overflow-x: auto;
    padding: 14px 18px 6px;
  }
  .ob-rail-step + .ob-rail-step::before { width: 12px; }
  .ob-hero { padding: 24px 20px 22px; }
  .ob-hero-title { font-size: 1.4rem; }
}

/* Metrics row */
.dash-metrics {
  display: grid;
  grid-template-columns: repeat(4, 1fr);
  gap: 12px;
}
/* ── .dash-metric — verbatim port of efflora .dashboard-summary-card ──
 * Source: SaaS2AI/web/src/styles/tokens.css:455-463
 *   padding 20; border-radius 22; bg 2-stop .06→.025; border .08; border-top .12
 *   box-shadow: inset 0 1px 0 .04, 0 16px 34px .16
 * Note: efflora has NO hover on summary-card (cards are static). Same here —
 * user feedback previously rejected amber hover glow as "yellow haloing". */
/* Metric card — verbatim port of Efflora's AppLogoCard recipe
 * (LandingPage.tsx:1971-1981). Lighter than Tier 2.3 .panel: no heavy outer
 * drop, no bottom inset dark. Only a thin ground kiss + top highlight, so
 * the card reads as "translucent floating" instead of "grounded/weighted".
 * This is the "通透" quality — same material language, just less shadow. */
.dash-metric {
  padding: 20px;
  border-radius: 16px;
  background: linear-gradient(180deg, rgba(255,255,255,.05) 0%,
                                       rgba(255,255,255,.018) 100%);
  border: 1px solid rgba(255,255,255,.11);
  border-top-color: rgba(255,255,255,.17);
  box-shadow:
    0 1px 2px rgba(0,0,0,.12),
    inset 0 1px 1px rgba(255,255,255,.06);
  position: relative;
}
/* Metric label — Tier 2.6 kicker spec (10px / .14em / .65 / 600).
 * Color is overridden per-position below to give each metric a distinct
 * morandi-muted accent. Section kickers stay amber; only in-card labels
 * vary, so the overall palette feels richer without becoming "rainbow". */
.dash-metric-lbl {
  display: block;
  color: rgba(200,169,110,.65);
  font-family: 'IBM Plex Mono', monospace;
  font-size: 10px;
  font-weight: 600;
  letter-spacing: .14em;
  text-transform: uppercase;
  margin-bottom: 10px;
  line-height: 1;
}
/* Per-metric morandi accents:
 *   1) 活跃环境 — mint (alive/active)
 *   2) 评测次数 — soft blue (data/count)
 *   3) 训练次数 — soft coral (effort/training)
 *   4) 最近成功率 — amber (achievement, keeps brand accent) */
.dash-metric:nth-child(1) .dash-metric-lbl { color: rgba(123,191,166,.72); }
.dash-metric:nth-child(2) .dash-metric-lbl { color: rgba(140,180,220,.72); }
.dash-metric:nth-child(3) .dash-metric-lbl { color: rgba(220,160,152,.72); }
.dash-metric:nth-child(4) .dash-metric-lbl { color: rgba(175,195,155,.72); }
/* Metric value — Tier 2.7 display numeral recipe (weight 760, -.045em tracking,
 * font-kerning normal, font-synthesis none). Tabular-nums so columns align. */
.dash-metric-val {
  display: block;
  font-family: var(--font-display-latin);
  font-size: clamp(30px, 3vw, 40px);
  font-weight: 760;
  letter-spacing: -.045em;
  line-height: 1;
  color: var(--text-primary);
  font-variant-numeric: tabular-nums;
  font-kerning: normal;
  font-synthesis: none;
}

/* Section kicker — Tier 2.6 kicker spec (10px / .14em / .58 / weight 600).
 * Used between dashboard modules (METRICS / QUICK ACTIONS / RECENT ACTIVITY). */
.dash-section-kicker {
  margin: 28px 2px 14px;
  color: rgba(200,169,110,.72);
  font-family: 'IBM Plex Mono', 'Noto Sans SC', monospace;
  font-size: 12px;
  font-weight: 600;
  letter-spacing: .08em;
  text-transform: uppercase;
  line-height: 1;
}
/* First kicker in the dash flow tightens its top margin */
.dash > .dash-section-kicker:first-of-type {
  margin-top: 20px;
}

/* Section row — kicker + inline action chips on a single line. Used when a
   section has section-level actions (e.g. RECENT ACTIVITY → 新建评测/新建训练). */
.dash-section-row {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 12px;
  margin: 28px 2px 14px;
}
.dash-section-row .dash-section-kicker {
  margin: 0;
}
.dash-section-actions {
  display: inline-flex;
  gap: 8px;
}

/* Chip action — section-level action pill. Material matches .filter-tab.active
   (white text on faint amber→white gradient with amber border) so action chips,
   filter chips, and nav chips all read as one family. */
.chip-action,
.chip-action:link,
.chip-action:visited,
.chip-action:active {
  display: inline-flex;
  align-items: center;
  padding: 6px 14px;
  border-radius: 980px;
  font-size: 0.82rem;
  font-weight: 500;
  color: var(--text-primary);
  background: linear-gradient(180deg, rgba(200,169,110,.12) 0%, rgba(255,255,255,.055) 100%);
  border: 1px solid rgba(200,169,110,.22);
  text-decoration: none;
  white-space: nowrap;
  transition: background .15s ease, border-color .15s ease, transform .15s ease;
  box-shadow:
    inset 0 1px 0 rgba(255,255,255,.05),
    0 10px 22px rgba(0,0,0,.16);
}
.chip-action:hover {
  background: linear-gradient(180deg, rgba(200,169,110,.18) 0%, rgba(255,255,255,.08) 100%);
  border-color: rgba(200,169,110,.32);
  transform: translateY(-1px);
}

/* Quick actions */
.dash-actions {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
  gap: 12px;
}
/* ── .dash-action-card — verbatim port of efflora .docs-nav-card ──
 * Source: SaaS2AI/web/src/styles/tokens.css:899-919
 *   padding 22px 20px; border-radius 20; bg 2-stop .06→.022; border .08; border-top .13
 *   transition: transform .22s cubic-bezier(.16,1,.3,1), border-color .2s, box-shadow .2s
 *   shadow: inset 0 1px 0 .04, 0 14px 30px .16
 *   hover: translateY(-3px), border-color amber .22, 0 0 0 3px amber .06, deep shadow
 * efflora's .docs-nav-card is a block; App World's action card is horizontal
 * (icon + text + link). Material is ported verbatim; layout (flex row) kept. */
/* Action card — Tier 2.3 panel recipe. Hover follows spec: amber picks up in
 * border, translateY(-1px) lift. Previous colored amber box-shadow ring on
 * hover (0 0 0 3px amber .06) removed — spec anti-pattern 5. */
.dash-action-card {
  display: flex;
  align-items: center;
  gap: 12px;
  padding: 22px 20px;
  border-radius: 16px;
  background: linear-gradient(180deg, rgba(255,255,255,.05) 0%,
                                       rgba(255,255,255,.018) 100%);
  border: 1px solid rgba(255,255,255,.11);
  border-top-color: rgba(255,255,255,.17);
  box-shadow:
    0 1px 2px rgba(0,0,0,.12),
    inset 0 1px 1px rgba(255,255,255,.06);
  transition: transform .22s cubic-bezier(.16,1,.3,1),
              border-color .2s,
              box-shadow .2s;
  position: relative;
}
.dash-action-card:hover {
  transform: translateY(-1px);
  border-color: rgba(200,169,110,.12);
  border-top-color: rgba(200,169,110,.18);
}
/* Clean icon tile — no colored background or border. Transparent tile,
 * only the SVG stroke carries color per action. This is the premium
 * pattern used by Linear/Stripe/Vercel: icon accent as a restrained
 * single-color signal, not a "colored chip / sticker". */
.dash-action-icon {
  flex-shrink: 0;
  width: 36px; height: 36px;
  display: grid; place-items: center;
  border-radius: 8px;
  background: transparent;
  color: var(--text-2);
}
/* Per-action SVG color only. No tile fill, no border. Alpha pushed to
 * .8 for strong presence without a background to contain it. */
.dash-action-card:nth-child(1) .dash-action-icon { color: rgba(140,180,220,.8); }
.dash-action-card:nth-child(2) .dash-action-icon { color: rgba(200,169,110,.8); }
.dash-action-card:nth-child(3) .dash-action-icon { color: rgba(123,191,166,.8); }
.dash-action-card:nth-child(4) .dash-action-icon { color: rgba(167,139,250,.85); }
.dash-action-card strong {
  display: block;
  font-size: .88rem;
}
.dash-action-card small {
  display: block;
  color: var(--text-3);
  font-size: .76rem;
  margin-top: 1px;
}
.dash-action-link {
  margin-left: auto;
  flex-shrink: 0;
  font-size: .78rem;
  color: var(--accent);
  text-decoration: none;
  font-weight: 500;
}
.dash-action-link:hover { text-decoration: underline; }
/* Per-action link color — matches the icon color of the same card, so
 * icon + action link form a unified color pair per card. Replaces the
 * default amber so the whole row isn't monotone yellow. */
.dash-action-card:nth-child(1) .dash-action-link { color: rgba(140,180,220,.85); }
.dash-action-card:nth-child(2) .dash-action-link { color: rgba(200,169,110,.85); }
.dash-action-card:nth-child(3) .dash-action-link { color: rgba(123,191,166,.85); }
.dash-action-card:nth-child(4) .dash-action-link { color: rgba(167,139,250,.9); }

/* Scene card */
.scene-card {
  padding: 18px;
  border: 1px solid var(--border);
  border-radius: var(--radius-md);
  background: var(--bg-raised);
  transition: border-color .15s;
}
.scene-card:hover { border-color: var(--border-strong); }
.scene-icon, .app-icon-large { font-size: 1.6rem; }
.scene-name { font-weight: 700; font-size: .92rem; margin-top: 6px; }
.scene-meta { color: var(--text-3); font-size: .82rem; }

/* Step card */
.step-card {
  padding: 18px;
  border: 1px solid var(--border);
  border-radius: var(--radius-md);
  background: var(--bg-raised);
}

/* Logo wall */
.logo-wall {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(140px, 1fr));
  gap: 12px;
  margin-top: 14px;
}
.logo-card {
  padding: 16px;
  min-height: 100px;
  display: grid;
  align-content: space-between;
  border: 1px solid var(--border);
  border-radius: var(--radius-md);
  background: var(--bg-raised);
}
.logo-icon { font-size: 1.6rem; }
.logo-name { font-weight: 700; font-size: .88rem; }
.logo-meta { color: var(--text-3); font-size: .8rem; }

/* ── LEADERBOARD ── */

.leaderboard-card {
  position: relative;
  padding: 22px;
  border-radius: var(--radius);
  background: linear-gradient(180deg, #1a1d23 0%, #14171c 100%);
  border: 1px solid rgba(255,255,255,.1);
  box-shadow:
    0 1px 0 rgba(255,255,255,.08) inset,
    0 -1px 0 rgba(0,0,0,.4) inset,
    0 2px 4px rgba(0,0,0,.4),
    0 12px 32px rgba(0,0,0,.35);
  transition: transform .2s cubic-bezier(.32,.72,0,1), box-shadow .2s cubic-bezier(.32,.72,0,1), border-color .2s ease;
}
.leaderboard-card:hover {
  transform: translateY(-3px);
  border-color: rgba(255,255,255,.2);
  box-shadow:
    0 1px 0 rgba(255,255,255,.12) inset,
    0 -1px 0 rgba(0,0,0,.4) inset,
    0 4px 8px rgba(0,0,0,.5),
    0 20px 40px rgba(0,0,0,.5);
}

/* 贪吃蛇流光边框 - 沿着卡片边缘流动的细线
   参考：Linear/Vercel/Stripe 的 premium motion UI */
.leaderboard-card::before {
  content: "";
  position: absolute;
  inset: 0;
  border-radius: inherit;
  padding: 1.5px;
  background: conic-gradient(from var(--glow-angle, 0deg),
    transparent 88%,
    rgba(200,220,255,.35) 93%,
    #ffffff 97%,
    rgba(200,220,255,.35) 100%);
  -webkit-mask: linear-gradient(#fff 0 0) content-box, linear-gradient(#fff 0 0);
  -webkit-mask-composite: xor;
  mask-composite: exclude;
  animation: glowSpin 8s cubic-bezier(0.4, 0, 0.2, 1) infinite;
  pointer-events: none;
  z-index: 1;
}

/* #1 Gold - 金牌（保留金色底色 + 金色外部辉光） */
.leaderboard-card.rank-1 {
  background: linear-gradient(180deg, rgba(251,191,36,.1) 0%, #14171c 60%);
  border: 1.5px solid rgba(251,191,36,.4);
  box-shadow:
    0 1px 0 rgba(255,255,255,.1) inset,
    0 -1px 0 rgba(0,0,0,.4) inset,
    0 2px 4px rgba(0,0,0,.4),
    0 12px 32px rgba(0,0,0,.4),
    0 0 32px rgba(251,191,36,.12);
}
.leaderboard-card.rank-1:hover {
  border-color: rgba(251,191,36,.55);
  box-shadow:
    0 1px 0 rgba(255,255,255,.14) inset,
    0 -1px 0 rgba(0,0,0,.4) inset,
    0 4px 8px rgba(0,0,0,.5),
    0 20px 40px rgba(0,0,0,.5),
    0 0 48px rgba(251,191,36,.2);
}
.leaderboard-card.rank-1 .leaderboard-rank { color: #FBBF24; }
.leaderboard-card.rank-1 .leaderboard-score {
  background: linear-gradient(135deg, #FBBF24, #F59E0B);
  -webkit-background-clip: text;
  background-clip: text;
  -webkit-text-fill-color: transparent;
}

/* #2 Silver - 银牌 */
.leaderboard-card.rank-2 {
  background: linear-gradient(180deg, rgba(148,163,184,.08) 0%, #14171c 60%);
  border-color: rgba(148,163,184,.28);
}
.leaderboard-card.rank-2 .leaderboard-rank { color: #CBD5E1; }
.leaderboard-card.rank-2 .leaderboard-score {
  background: linear-gradient(135deg, #CBD5E1, #94A3B8);
  -webkit-background-clip: text;
  background-clip: text;
  -webkit-text-fill-color: transparent;
}

/* #3 Bronze - 铜牌 */
.leaderboard-card.rank-3 {
  background: linear-gradient(180deg, rgba(217,119,6,.08) 0%, #14171c 60%);
  border-color: rgba(217,119,6,.28);
}
.leaderboard-card.rank-3 .leaderboard-rank { color: #F59E0B; }
.leaderboard-card.rank-3 .leaderboard-score {
  background: linear-gradient(135deg, #F59E0B, #D97706);
  -webkit-background-clip: text;
  background-clip: text;
  -webkit-text-fill-color: transparent;
}

/* 错开动画起始角度，三张卡流光不同步，视觉更丰富（同一白色但节奏错开） */
.leaderboard-card.rank-1::before { animation-delay: 0s; }
.leaderboard-card.rank-2::before { animation-delay: -2.67s; }
.leaderboard-card.rank-3::before { animation-delay: -5.33s; }
.leaderboard-card h2 {
  color: #ffffff;
}
.leaderboard-card .subtle-text,
.leaderboard-card .leaderboard-meta,
.leaderboard-card .leaderboard-tagline {
  color: rgba(255,255,255,.6);
}

/* ── LEADERBOARD CARDS: 浅色主题覆盖 ── */
[data-theme="light"] .leaderboard-card {
  background: #ffffff;
  border: 1px solid rgba(0,0,0,.08);
  box-shadow:
    0 1px 3px rgba(0,0,0,.06),
    0 1px 2px rgba(0,0,0,.04),
    inset 0 1px 0 rgba(255,255,255,.8),
    inset 0 -1px 0 rgba(0,0,0,.04);
}
[data-theme="light"] .leaderboard-card::before {
  display: none;
}
[data-theme="light"] .leaderboard-card:hover {
  box-shadow:
    0 4px 8px rgba(0,0,0,.1),
    0 2px 4px rgba(0,0,0,.06),
    inset 0 1px 0 rgba(255,255,255,.9),
    inset 0 -1px 0 rgba(0,0,0,.06);
  border-color: rgba(0,0,0,.12);
}
[data-theme="light"] .leaderboard-card.rank-1 {
  background: #fff9e6;
  border: 1.5px solid rgba(245,158,11,.3);
  box-shadow:
    0 2px 6px rgba(245,158,11,.12),
    0 1px 3px rgba(245,158,11,.08),
    inset 0 1px 0 rgba(255,255,255,.9),
    inset 0 -1px 0 rgba(245,158,11,.1);
}
[data-theme="light"] .leaderboard-card.rank-1:hover {
  box-shadow:
    0 6px 12px rgba(245,158,11,.18),
    0 3px 6px rgba(245,158,11,.12),
    inset 0 1px 0 rgba(255,255,255,.95),
    inset 0 -1px 0 rgba(245,158,11,.15);
  border-color: rgba(245,158,11,.4);
}
[data-theme="light"] .leaderboard-card.rank-2 {
  background: #f5f5f5;
  border-color: rgba(100,116,139,.18);
}
[data-theme="light"] .leaderboard-card.rank-2 .leaderboard-rank { color: #64748B; }
[data-theme="light"] .leaderboard-card.rank-2 .leaderboard-score {
  background: linear-gradient(135deg, #64748B, #94A3B8);
  -webkit-background-clip: text;
  background-clip: text;
  -webkit-text-fill-color: transparent;
}
[data-theme="light"] .leaderboard-card.rank-3 {
  background: #fef6e8;
  border-color: rgba(180,83,9,.2);
}
[data-theme="light"] .leaderboard-card.rank-3 .leaderboard-rank { color: #B45309; }
[data-theme="light"] .leaderboard-card.rank-3 .leaderboard-score {
  background: linear-gradient(135deg, #B45309, #D97706);
  -webkit-background-clip: text;
  background-clip: text;
  -webkit-text-fill-color: transparent;
}
[data-theme="light"] .leaderboard-card h2 { color: #1f2937; }
[data-theme="light"] .leaderboard-card .subtle-text,
[data-theme="light"] .leaderboard-card .leaderboard-meta,
[data-theme="light"] .leaderboard-card .leaderboard-tagline {
  color: #6b7280;
}

.leaderboard-card-top {
  display: flex;
  align-items: center;
  justify-content: space-between;
  margin-bottom: 4px;
}

.leaderboard-rank {
  font-size: .72rem;
  font-weight: 600;
  font-family: var(--mono);
  letter-spacing: .1em;
  text-transform: uppercase;
  color: var(--accent-dim);
}

.leaderboard-score-row {
  display: flex;
  align-items: baseline;
  gap: 10px;
  margin: 14px 0 8px;
}

.leaderboard-score {
  font-size: clamp(2rem, 4vw, 3.2rem);
  line-height: 1;
  font-weight: 800;
  letter-spacing: -.05em;
  font-family: var(--font-display);
  background: linear-gradient(135deg, #78B4FF, #B4D8FF);
  -webkit-background-clip: text;
  -webkit-text-fill-color: transparent;
  background-clip: text;
}

.leaderboard-meta { color: var(--text-3); font-size: .82rem; font-family: var(--mono); }
.leaderboard-tagline { margin: 10px 0 0; color: var(--text-2); line-height: 1.55; font-size: .88rem; }

/* Compact task dots (inline in Agent cell) */
/* Inline pass bar in leaderboard */
.inline-pass-bar {
  height: 6px;
  background: #e5e7eb;
  border-radius: 3px;
  overflow: hidden;
  margin-bottom: 6px;
}

.inline-pass-fill {
  height: 100%;
  background: linear-gradient(90deg, #f59e0b, #fbbf24);
  border-radius: 3px;
  transition: width 0.3s ease;
}

.inline-pass-label {
  display: flex;
  align-items: baseline;
  gap: 6px;
  font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif;
  font-variant-numeric: tabular-nums;
}

.inline-pass-label strong {
  font-size: 0.9375rem;
  font-weight: 700;
  color: #111827;
}

.inline-pass-count {
  font-size: 0.75rem;
  color: #9ca3af;
  font-weight: 500;
}

.benchmark-hero { margin-bottom: 0; }
.benchmark-notes { gap: 8px; }
.benchmark-sidecopy { margin-top: 14px; line-height: 1.6; color: var(--text-2); }

/* ── BENCHMARK: KEY INSIGHTS BAR ── */

.benchmark-insights {
  display: flex;
  align-items: center;
  gap: 10px;
  padding: 14px 20px;
  background: rgba(255,255,255,.03);
  backdrop-filter: blur(16px);
  -webkit-backdrop-filter: blur(16px);
  border: 1px solid rgba(255,255,255,.07);
  border-radius: var(--radius-md);
  font-size: .85rem;
  color: var(--text-2);
  flex-wrap: wrap;
  box-shadow: inset 0 1px 0 rgba(255,255,255,.04);
}
.benchmark-insights strong {
  color: var(--text);
  font-weight: 700;
}
.insight-sep {
  width: 1px;
  height: 16px;
  background: rgba(255,255,255,.1);
  flex-shrink: 0;
}

/* ── BENCHMARK: 6-COLUMN STATS (glass cards) ── */

.benchmark-stats {
  grid-template-columns: repeat(6, 1fr);
}
.benchmark-stats .metric-card {
  background: rgba(255,255,255,.03);
  backdrop-filter: blur(16px);
  -webkit-backdrop-filter: blur(16px);
  border: 1px solid rgba(255,255,255,.07);
  box-shadow: inset 0 1px 0 rgba(255,255,255,.05), 0 4px 16px rgba(0,0,0,.15);
  transition: transform .15s ease, box-shadow .15s ease, background .15s ease;
}
.benchmark-stats .metric-card:hover {
  transform: translateY(-2px);
  background: rgba(255,255,255,.05);
  box-shadow: inset 0 1px 0 rgba(255,255,255,.08), 0 8px 24px rgba(0,0,0,.25);
}
.benchmark-stats .metric-card:nth-child(1) .metric-value { color: #78B4FF; text-shadow: 0 0 20px rgba(120,180,255,.25); }
.benchmark-stats .metric-card:nth-child(2) .metric-value { color: #10b981; text-shadow: 0 0 20px rgba(16,185,129,.25); }
.benchmark-stats .metric-card:nth-child(3) .metric-value { color: #A78BFA; text-shadow: 0 0 20px rgba(167,139,250,.25); }
.benchmark-stats .metric-card:nth-child(4) .metric-value { color: #FBBF24; text-shadow: 0 0 20px rgba(251,191,36,.25); }
.benchmark-stats .metric-card:nth-child(5) .metric-value { color: #2DD4BF; text-shadow: 0 0 20px rgba(45,212,191,.25); }
.benchmark-stats .metric-card:nth-child(6) .metric-value { color: #F472B6; text-shadow: 0 0 20px rgba(244,114,182,.25); }

@media (max-width: 960px) {
  .benchmark-stats { grid-template-columns: repeat(3, 1fr); }
}

/* ── BENCHMARK: 7-COLUMN STATS RIBBON (podium colors + 3D effect) ── */

.benchmark-stats-enhanced {
  grid-template-columns: repeat(7, 1fr);
  gap: 16px;
}

.benchmark-stats-enhanced .metric-card {
  position: relative;
  background: linear-gradient(180deg, #1a1d23 0%, #14171c 100%);
  border: 1px solid rgba(255, 255, 255, 0.1);
  box-shadow:
    0 1px 0 rgba(255, 255, 255, 0.08) inset,
    0 -1px 0 rgba(0, 0, 0, 0.4) inset,
    0 2px 4px rgba(0, 0, 0, 0.4),
    0 12px 32px rgba(0, 0, 0, 0.35);
  transition: transform .2s cubic-bezier(.32,.72,0,1), box-shadow .2s cubic-bezier(.32,.72,0,1), border-color .2s ease;
}

.benchmark-stats-enhanced .metric-card:hover {
  transform: translateY(-2px);
  border-color: rgba(255, 255, 255, 0.2);
  box-shadow:
    0 1px 0 rgba(255, 255, 255, 0.12) inset,
    0 -1px 0 rgba(0, 0, 0, 0.4) inset,
    0 4px 8px rgba(0, 0, 0, 0.5),
    0 20px 40px rgba(0, 0, 0, 0.5);
}

/* 7 cards - 深色主题（默认）
   策略：深色实色底（不透明）+ 顶部色调 accent bar + 清晰边框定义 + 立体阴影
   参考 Linear/Vercel/Stripe 的 premium dark 风格 */

/* 顶部 2px 色条作为 accent indicator */
.benchmark-stats-enhanced .metric-card::before {
  content: "";
  position: absolute;
  top: 0;
  left: 0;
  right: 0;
  height: 2px;
  border-radius: var(--radius-md) var(--radius-md) 0 0;
  opacity: 0.8;
}

.benchmark-stats-enhanced .metric-card:nth-child(1) {
  background: linear-gradient(180deg, rgba(200, 169, 110, 0.08) 0%, #14171c 60%);
  border-color: rgba(200, 169, 110, 0.25);
}
.benchmark-stats-enhanced .metric-card:nth-child(1)::before {
  background: linear-gradient(90deg, transparent, #C8A96E, transparent);
}

.benchmark-stats-enhanced .metric-card:nth-child(2) {
  background: linear-gradient(180deg, rgba(251, 146, 60, 0.08) 0%, #14171c 60%);
  border-color: rgba(251, 146, 60, 0.25);
}
.benchmark-stats-enhanced .metric-card:nth-child(2)::before {
  background: linear-gradient(90deg, transparent, #fb923c, transparent);
}

.benchmark-stats-enhanced .metric-card:nth-child(3) {
  background: linear-gradient(180deg, rgba(120, 180, 255, 0.08) 0%, #14171c 60%);
  border-color: rgba(120, 180, 255, 0.25);
}
.benchmark-stats-enhanced .metric-card:nth-child(3)::before {
  background: linear-gradient(90deg, transparent, #78B4FF, transparent);
}

.benchmark-stats-enhanced .metric-card:nth-child(4) {
  background: linear-gradient(180deg, rgba(74, 222, 128, 0.08) 0%, #14171c 60%);
  border-color: rgba(74, 222, 128, 0.25);
}
.benchmark-stats-enhanced .metric-card:nth-child(4)::before {
  background: linear-gradient(90deg, transparent, #4ade80, transparent);
}

.benchmark-stats-enhanced .metric-card:nth-child(5) {
  background: linear-gradient(180deg, rgba(251, 191, 36, 0.12) 0%, #14171c 60%);
  border: 1.5px solid rgba(251, 191, 36, 0.45);
  box-shadow:
    0 1px 0 rgba(255, 255, 255, 0.1) inset,
    0 -1px 0 rgba(0, 0, 0, 0.4) inset,
    0 2px 4px rgba(0, 0, 0, 0.4),
    0 12px 32px rgba(0, 0, 0, 0.4),
    0 0 24px rgba(251, 191, 36, 0.1);
}
.benchmark-stats-enhanced .metric-card:nth-child(5)::before {
  background: linear-gradient(90deg, transparent, #fbbf24, transparent);
  opacity: 1;
  height: 2.5px;
}

.benchmark-stats-enhanced .metric-card:nth-child(6) {
  background: linear-gradient(180deg, rgba(255, 255, 255, 0.06) 0%, #14171c 60%);
  border-color: rgba(255, 255, 255, 0.15);
}
.benchmark-stats-enhanced .metric-card:nth-child(6)::before {
  background: linear-gradient(90deg, transparent, rgba(255, 255, 255, 0.6), transparent);
}

.benchmark-stats-enhanced .metric-card:nth-child(7) {
  background: linear-gradient(180deg, rgba(214, 211, 209, 0.06) 0%, #14171c 60%);
  border-color: rgba(214, 211, 209, 0.2);
}
.benchmark-stats-enhanced .metric-card:nth-child(7)::before {
  background: linear-gradient(90deg, transparent, #d6d3d1, transparent);
}

/* Highlight card (最佳表现) - 金色辉光突出 */
.benchmark-stats-enhanced .metric-card.metric-highlight {
  background: linear-gradient(180deg, rgba(251, 191, 36, 0.12) 0%, #14171c 60%);
  border: 1.5px solid rgba(251, 191, 36, 0.45);
  box-shadow:
    0 1px 0 rgba(255, 255, 255, 0.14) inset,
    0 -1px 0 rgba(0, 0, 0, 0.4) inset,
    0 2px 4px rgba(0, 0, 0, 0.4),
    0 12px 32px rgba(0, 0, 0, 0.4),
    0 0 32px rgba(251, 191, 36, 0.15);
}

.benchmark-stats-enhanced .metric-card.metric-highlight:hover {
  border-color: rgba(251, 191, 36, 0.6);
  box-shadow:
    0 1px 0 rgba(255, 255, 255, 0.18) inset,
    0 -1px 0 rgba(0, 0, 0, 0.4) inset,
    0 4px 8px rgba(0, 0, 0, 0.5),
    0 20px 40px rgba(0, 0, 0, 0.5),
    0 0 48px rgba(251, 191, 36, 0.22);
}

/* Enhanced stats card text colors - 深色主题 */
.benchmark-stats-enhanced .metric-value {
  color: #ffffff;
  font-weight: 600;
}

.benchmark-stats-enhanced .metric-label {
  color: rgba(255, 255, 255, 0.72);
  font-weight: 500;
}

.benchmark-stats-enhanced .metric-sublabel {
  color: rgba(255, 255, 255, 0.5);
}

/* Individual card value colors for visual distinction - 深色主题 */
.benchmark-stats-enhanced .metric-card:nth-child(1) .metric-value {
  color: #C8A96E;
}

.benchmark-stats-enhanced .metric-card:nth-child(2) .metric-value {
  color: #fb923c;
}

.benchmark-stats-enhanced .metric-card:nth-child(3) .metric-value {
  color: #78B4FF;
}

.benchmark-stats-enhanced .metric-card:nth-child(4) .metric-value {
  color: #4ade80;
}

.benchmark-stats-enhanced .metric-card:nth-child(5) .metric-value {
  color: #fbbf24;
}

.benchmark-stats-enhanced .metric-card:nth-child(6) .metric-value {
  color: rgba(255, 255, 255, 0.85);
}

.benchmark-stats-enhanced .metric-card:nth-child(7) .metric-value {
  color: #d6d3d1;
}

/* ── BENCHMARK STATS: 浅色主题覆盖 ── */
[data-theme="light"] .benchmark-stats-enhanced .metric-card::before {
  display: none;
}

[data-theme="light"] .benchmark-stats-enhanced .metric-card {
  background: #ffffff;
  border: 1px solid rgba(0, 0, 0, 0.08);
  box-shadow:
    0 1px 3px rgba(0, 0, 0, 0.06),
    0 1px 2px rgba(0, 0, 0, 0.04),
    inset 0 1px 0 rgba(255, 255, 255, 0.8),
    inset 0 -1px 0 rgba(0, 0, 0, 0.04);
}

[data-theme="light"] .benchmark-stats-enhanced .metric-card:hover {
  box-shadow:
    0 4px 8px rgba(0, 0, 0, 0.1),
    0 2px 4px rgba(0, 0, 0, 0.06),
    inset 0 1px 0 rgba(255, 255, 255, 0.9),
    inset 0 -1px 0 rgba(0, 0, 0, 0.06);
  border-color: rgba(0, 0, 0, 0.12);
}

[data-theme="light"] .benchmark-stats-enhanced .metric-card:nth-child(1) {
  background: #fef6e8;
  border-color: rgba(146, 64, 14, 0.15);
}
[data-theme="light"] .benchmark-stats-enhanced .metric-card:nth-child(2) {
  background: #ffe9d6;
  border-color: rgba(194, 65, 12, 0.15);
}
[data-theme="light"] .benchmark-stats-enhanced .metric-card:nth-child(3) {
  background: #e8eef5;
  border-color: rgba(37, 99, 235, 0.15);
}
[data-theme="light"] .benchmark-stats-enhanced .metric-card:nth-child(4) {
  background: #f0f4f0;
  border-color: rgba(22, 101, 52, 0.15);
}
[data-theme="light"] .benchmark-stats-enhanced .metric-card:nth-child(5) {
  background: #fff9e6;
  border: 1.5px solid rgba(245, 158, 11, 0.3);
}
[data-theme="light"] .benchmark-stats-enhanced .metric-card:nth-child(6) {
  background: #f5f5f5;
  border-color: rgba(0, 0, 0, 0.08);
}
[data-theme="light"] .benchmark-stats-enhanced .metric-card:nth-child(7) {
  background: #faf8f3;
  border-color: rgba(120, 113, 108, 0.15);
}

[data-theme="light"] .benchmark-stats-enhanced .metric-card.metric-highlight {
  background: #fff9e6;
  border: 1.5px solid rgba(245, 158, 11, 0.3);
  box-shadow:
    0 2px 6px rgba(245, 158, 11, 0.12),
    0 1px 3px rgba(245, 158, 11, 0.08),
    inset 0 1px 0 rgba(255, 255, 255, 0.9),
    inset 0 -1px 0 rgba(245, 158, 11, 0.1);
}
[data-theme="light"] .benchmark-stats-enhanced .metric-card.metric-highlight:hover {
  box-shadow:
    0 6px 12px rgba(245, 158, 11, 0.18),
    0 3px 6px rgba(245, 158, 11, 0.12),
    inset 0 1px 0 rgba(255, 255, 255, 0.95),
    inset 0 -1px 0 rgba(245, 158, 11, 0.15);
  border-color: rgba(245, 158, 11, 0.4);
}

[data-theme="light"] .benchmark-stats-enhanced .metric-value { color: #1f2937; }
[data-theme="light"] .benchmark-stats-enhanced .metric-label { color: #374151; }
[data-theme="light"] .benchmark-stats-enhanced .metric-sublabel { color: #6b7280; }

[data-theme="light"] .benchmark-stats-enhanced .metric-card:nth-child(1) .metric-value { color: #92400e; }
[data-theme="light"] .benchmark-stats-enhanced .metric-card:nth-child(2) .metric-value { color: #c2410c; }
[data-theme="light"] .benchmark-stats-enhanced .metric-card:nth-child(3) .metric-value { color: #1e40af; }
[data-theme="light"] .benchmark-stats-enhanced .metric-card:nth-child(4) .metric-value { color: #15803d; }
[data-theme="light"] .benchmark-stats-enhanced .metric-card:nth-child(5) .metric-value { color: #d97706; }
[data-theme="light"] .benchmark-stats-enhanced .metric-card:nth-child(6) .metric-value { color: #4b5563; }
[data-theme="light"] .benchmark-stats-enhanced .metric-card:nth-child(7) .metric-value { color: #78716c; }

@media (max-width: 1200px) {
  .benchmark-stats-enhanced {
    grid-template-columns: repeat(4, 1fr);
  }
}

@media (max-width: 960px) {
  .benchmark-stats-enhanced {
    grid-template-columns: repeat(3, 1fr);
  }
}

@media (max-width: 640px) {
  .benchmark-stats-enhanced {
    grid-template-columns: repeat(2, 1fr);
  }
}

/* ── BENCHMARK: TREND INDICATORS ── */

.trend {
  display: inline-flex;
  align-items: center;
  gap: 3px;
  font-size: 0.8125rem;
  font-weight: 600;
  font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif;
  font-variant-numeric: tabular-nums;
  padding: 4px 8px;
  border-radius: 5px;
  border: 1px solid;
}

/* 上涨 - 绿色 (重点色) */
.trend-up {
  color: #10b981;
  background: rgba(16, 185, 129, 0.08);
  border-color: rgba(16, 185, 129, 0.2);
}

/* 下降 - 红色 (重点色) */
.trend-down {
  color: #ef4444;
  background: rgba(239, 68, 68, 0.08);
  border-color: rgba(239, 68, 68, 0.2);
}
.trend-neutral {
  color: var(--text-3);
  background: var(--surface);
}

/* ── BENCHMARK: PASS BAR (progress) ── */

.pass-bar {
  position: relative;
  height: 22px;
  background: var(--surface);
  border-radius: 6px;
  overflow: hidden;
  margin: 8px 0;
}
.pass-bar-fill {
  height: 100%;
  background: linear-gradient(90deg, rgba(120,180,255,.25), rgba(120,180,255,.4));
  border-radius: 6px;
  transition: width .3s ease;
}
.rank-1 .pass-bar-fill { background: linear-gradient(90deg, rgba(251,191,36,.2), rgba(251,191,36,.45)); }
.rank-2 .pass-bar-fill { background: linear-gradient(90deg, rgba(148,163,184,.2), rgba(148,163,184,.4)); }
.rank-3 .pass-bar-fill { background: linear-gradient(90deg, rgba(217,119,6,.2), rgba(217,119,6,.4)); }
.pass-bar-label {
  position: absolute;
  right: 8px;
  top: 50%;
  transform: translateY(-50%);
  font-size: .72rem;
  font-weight: 600;
  font-family: var(--mono);
  color: var(--text-2);
}

/* ── BENCHMARK: SCORE CELL HEATMAP ── */

.score-cell {
  background: rgba(16, 185, 129, calc(var(--score-pct, 0) * 0.002));
  font-family: var(--mono);
  color: #10b981;
}
.score-cell strong { font-size: 1rem; }
.rank-cell {
  font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif;
  font-weight: 700;
  font-size: 0.9375rem;
  font-variant-numeric: tabular-nums;
}

/* Rank colors in table */
tr:nth-child(1) > .rank-cell {
  color: #d97706;
  font-size: 1.0625rem;
}
tr:nth-child(2) > .rank-cell {
  color: #94a3b8;
  font-size: 1rem;
}
tr:nth-child(3) > .rank-cell {
  color: #ca8a04;
}
tr:nth-child(n+4) > .rank-cell {
  color: #6b7280;
  font-weight: 600;
}

/* ── BENCHMARK: HEATMAP TABLE ── */

.heatmap-table {
  text-align: center;
  border-collapse: separate;
  border-spacing: 0;
  border: 1px solid var(--border);
  border-radius: 8px;
  overflow: hidden;
}
.heatmap-table thead th {
  font-size: 0.75rem;
  font-weight: 600;
  text-transform: none;
  letter-spacing: 0.02em;
  color: var(--text-2);
  padding: 12px 16px;
  border-bottom: 1px solid var(--border-strong);
  position: sticky;
  top: 0;
  background: var(--surface);
  z-index: 1;
}
.heatmap-table td:first-child,
.heatmap-table th:first-child {
  text-align: left;
}
.heatmap-task-col { width: 20%; }
.heatmap-diff-col { width: 8%; }
.heatmap-agent-col {
  font-size: .7rem;
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
  max-width: 0;
}
.heatmap-rate-col { width: 16%; }

/* Row styling */
.heatmap-row {
  transition: background 0.1s ease;
}
.heatmap-row:hover {
  background: var(--surface-hover);
}
.heatmap-row td {
  padding: 10px 8px;
  border-bottom: 1px solid var(--border);
}
.heatmap-row:last-child td {
  border-bottom: none;
}

/* Task name */
.heatmap-task-name {
  font-size: .82rem;
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
  max-width: 180px;
}

/* Difficulty tags */
.heatmap-diff-cell { text-align: center; }
.diff-tag,
.diff-badge {
  display: inline-block;
  padding: 3px 10px;
  border-radius: 5px;
  font-size: 0.6875rem;
  font-weight: 600;
  letter-spacing: 0.02em;
  text-transform: uppercase;
  border: 1px solid;
}

/* 简单 - 暗绿色 */
.diff-easy,
.diff-low {
  color: #4ade80;
  background: rgba(74, 222, 128, 0.12);
  border-color: rgba(74, 222, 128, 0.2);
}

/* 中等 - 暗橙色 */
.diff-medium {
  color: #fb923c;
  background: rgba(251, 146, 60, 0.12);
  border-color: rgba(251, 146, 60, 0.2);
}

/* 困难 - 暗灰色 */
.diff-hard,
.diff-high {
  color: #a1a1aa;
  background: rgba(161, 161, 170, 0.12);
  border-color: rgba(161, 161, 170, 0.2);
}

/* Pass/fail cells */
.heatmap-cell {
  font-size: 1rem;
  padding: 6px 4px;
}
.hm-icon { line-height: 1; }
.hm-pass {
  color: #f59e0b;
}
.hm-fail {
  color: rgba(255,255,255,.15);
}

/* Rate cell */
.heatmap-rate-cell {
  text-align: left;
  padding-left: 10px;
}
.heatmap-rate-row {
  display: flex;
  align-items: baseline;
  gap: 6px;
  margin-bottom: 4px;
}
.heatmap-rate-pct {
  font-size: .85rem;
  font-weight: 700;
  font-family: var(--mono);
  color: var(--text-1);
}
.heatmap-rate-count {
  font-size: .7rem;
  color: var(--text-2);
  font-family: var(--mono);
}
.heatmap-rate-bar {
  height: 6px;
  background: #e5e7eb;
  border-radius: 3px;
  overflow: hidden;
}
.heatmap-rate-fill {
  height: 100%;
  background: linear-gradient(90deg, #f59e0b, #fbbf24);
  border-radius: 3px;
  transition: width .3s ease;
}

/* ── CHIPS ── */

.chip-row, .choice-list {
  display: flex;
  flex-wrap: wrap;
  gap: 8px;
}

.chip {
  padding: 7px 12px;
  border-radius: 999px;
  border: 1px solid var(--border);
  background: var(--surface);
  color: var(--text-2);
  font-size: .82rem;
}

.choice-item {
  display: inline-flex;
  align-items: center;
  gap: 10px;
  padding: 10px 14px;
  border-radius: var(--radius-sm);
  border: 1px solid var(--border);
  background: var(--bg-raised);
  color: var(--text);
}
.choice-item.linkish { text-decoration: none; }
.choice-item.is-complete {
  border-color: rgba(16,185,129,.2);
  background: rgba(16,185,129,.06);
}
.choice-item small {
  display: block;
  margin-top: 3px;
  color: var(--text-3);
  font-size: .8rem;
  line-height: 1.4;
}

.checkmark {
  width: 26px;
  height: 26px;
  border-radius: 50%;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  flex: 0 0 auto;
  font-size: .82rem;
  font-weight: 700;
  background: var(--accent-bg);
  color: var(--accent);
}

.onboarding-list { display: grid; gap: 10px; }

/* ── STATUS PILLS ── */

.status-pill {
  display: inline-flex;
  align-items: center;
  gap: 6px;
  padding: 5px 11px;
  border-radius: 999px;
  font-size: 0.6875rem;
  font-weight: 600;
  font-family: var(--font);
  letter-spacing: 0.04em;
  text-transform: uppercase;
  border: 1px solid;
  white-space: nowrap;
}

/* Verified - 深色主题：亮绿文字 + 半透明绿背景 */
.status-pill.good {
  color: #4ade80;
  background: rgba(74, 222, 128, 0.1);
  border-color: rgba(74, 222, 128, 0.25);
}

/* Public Repro - 深色主题：亮灰文字 + 半透明白背景 */
.status-pill.neutral {
  color: rgba(255, 255, 255, 0.7);
  background: rgba(255, 255, 255, 0.05);
  border-color: rgba(255, 255, 255, 0.12);
}

/* Community - 深色主题：亮橙文字 + 半透明橙背景 */
.status-pill.warm {
  color: #fb923c;
  background: rgba(251, 146, 60, 0.1);
  border-color: rgba(251, 146, 60, 0.25);
}

/* 浅色主题覆盖 */
[data-theme="light"] .status-pill.good {
  color: #15803d;
  background: #f0f4f0;
  border-color: rgba(22, 101, 52, 0.2);
}
[data-theme="light"] .status-pill.neutral {
  color: #4b5563;
  background: #f5f5f5;
  border-color: rgba(0, 0, 0, 0.12);
}
[data-theme="light"] .status-pill.warm {
  color: #c2410c;
  background: #ffe9d6;
  border-color: rgba(194, 65, 12, 0.2);
}

/* ── TABLE ── */

.table-wrap {
  overflow: auto;
  border: 1px solid var(--border);
  border-radius: var(--radius-md);
}
table {
  width: 100%;
  border-collapse: collapse;
  background: var(--bg-raised);
  table-layout: fixed;
}
td { overflow: hidden; text-overflow: ellipsis; }
th, td {
  padding: 12px 14px;
  text-align: left;
  border-bottom: 1px solid var(--border);
  vertical-align: top;
}
th {
  position: sticky;
  top: 0;
  z-index: 1;
  background: rgba(255,255,255,.04);
  color: var(--text-3);
  font-size: .78rem;
  font-weight: 600;
  font-family: var(--mono);
  text-transform: uppercase;
  letter-spacing: .05em;
}

.leaderboard-table {
  font-variant-numeric: tabular-nums;
  border: 1px solid var(--border);
  border-radius: 8px;
  border-collapse: separate;
  border-spacing: 0;
  overflow: hidden;
}

.leaderboard-table thead th {
  background: var(--surface);
  color: var(--text-2);
  font-size: 0.75rem;
  font-weight: 600;
  letter-spacing: 0.02em;
  text-transform: none;
  padding: 12px 16px;
  font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif;
  border-bottom: 1px solid var(--border-strong);
}

.leaderboard-table tbody tr {
  transition: background-color 0.1s ease;
}

.leaderboard-table tbody tr:hover {
  background: var(--surface-hover);
}

.leaderboard-table td {
  vertical-align: middle;
  padding: 14px 16px;
  font-size: 0.875rem;
  line-height: 1.5;
  border-bottom: 1px solid var(--border);
}

.leaderboard-table tbody tr:last-child td {
  border-bottom: none;
}

.leaderboard-table td strong {
  font-size: 0.9375rem;
  font-weight: 600;
  color: var(--text);
  display: block;
  margin-bottom: 2px;
}

.leaderboard-table td .subtle-text {
  font-size: 0.8125rem;
  color: var(--text-2);
  line-height: 1.4;
}

.matrix-row td { padding-top: 0; }
.task-matrix { display: flex; gap: 6px; flex-wrap: wrap; padding-bottom: 8px; }
.task-cell {
  display: inline-flex;
  align-items: center;
  padding: 6px 10px;
  border-radius: 999px;
  font-size: .8rem;
  border: 1px solid var(--border);
  background: var(--surface);
}
.task-cell.passed { background: var(--accent-bg); border-color: var(--accent-border); }
.task-cell.failed { background: var(--warning-bg); border-color: rgba(245,158,11,.18); }

/* ── FORMS ── */

.filter-bar {
  padding: 14px 16px;
  border-radius: var(--radius-md);
  border: 1px solid var(--border);
  background: var(--surface);
}
.filter-bar input,
.filter-bar select,
.stack-form input,
.stack-form select,
.stack-form textarea {
  min-height: 42px;
  padding: 10px 12px;
  border-radius: var(--radius-sm);
  border: 1px solid var(--border-strong);
  background: var(--bg-raised);
  color: var(--text);
}
.filter-bar input::placeholder,
.stack-form input::placeholder { color: var(--text-3); }
.filter-bar input:focus,
.stack-form input:focus,
.stack-form select:focus {
  outline: none;
  border-color: var(--accent);
  box-shadow: 0 0 0 2px rgba(120,180,255,.15);
}

.stack-form { display: grid; gap: 14px; }
.stack-form label { display: grid; gap: 6px; }
.stack-form span { color: var(--text-2); font-size: .88rem; }
.inline-form { display: inline-flex; }

/* ── CODE BLOCK ── */

.code-block {
  margin: 0;
  padding: 18px;
  border-radius: var(--radius-md);
  background: rgba(0,0,0,.4);
  border: 1px solid var(--border);
  color: rgba(255,255,255,.85);
  overflow: auto;
  white-space: pre-wrap;
  font-family: var(--mono);
  font-size: .86rem;
  line-height: 1.6;
}

/* ── MODAL ── */

.modal {
  width: min(900px, calc(100vw - 28px));
  padding: 0;
  border: 1px solid var(--border);
  border-radius: var(--radius);
  background: #111118;
  box-shadow: 0 24px 80px rgba(0,0,0,.5);
  color: var(--text);
}
.modal::backdrop { background: rgba(0,0,0,.6); }
.modal-close-row { display: flex; justify-content: flex-end; padding: 14px; }
.modal-body { padding: 0 24px 24px; }

/* ── TABS ── */

.tab-button {
  color: var(--text-3);
  background: transparent;
  font-size: .86rem;
}
.tab-button.active {
  color: var(--text);
  background: var(--accent-bg);
}
.tab-panel { display: none; }
.tab-panel.active { display: block; }

/* ── AUTH ── */

.auth-shell {
  min-height: 100vh;
  display: flex;
  align-items: center;
  justify-content: center;
  padding: 40px 24px;
}
.auth-center {
  width: 100%;
  max-width: 400px;
}
.auth-brand {
  display: flex;
  align-items: center;
  gap: 10px;
  margin-bottom: 32px;
  justify-content: center;
}
.auth-brand-mark {
  width: 36px; height: 36px;
  display: grid; place-items: center;
  background: var(--accent);
  color: #000;
  font-weight: 700;
  font-size: .8rem;
  font-family: var(--mono);
  border-radius: 8px;
  letter-spacing: .04em;
}
.auth-brand-name {
  font-size: 1.1rem;
  font-weight: 600;
  color: var(--text);
  letter-spacing: -.01em;
}
.auth-card {
  padding: 32px;
  border: 1px solid var(--border);
  border-radius: var(--radius);
  background: var(--bg-raised);
  backdrop-filter: blur(12px);
}
.auth-card h1 {
  margin: 0;
  font-size: 1.5rem;
  font-weight: 700;
  letter-spacing: -.02em;
  color: var(--text);
}
.auth-subtitle {
  margin: 8px 0 0;
  color: var(--text-2);
  font-size: .88rem;
  line-height: 1.55;
}
.auth-form {
  margin-top: 24px;
  display: flex;
  flex-direction: column;
  gap: 16px;
}
.auth-field {
  display: flex;
  flex-direction: column;
  gap: 6px;
}
.auth-field label {
  font-size: .78rem;
  font-weight: 500;
  color: var(--text-2);
  text-transform: uppercase;
  letter-spacing: .06em;
  font-family: var(--mono);
}
.auth-field input,
.auth-field select {
  padding: 10px 12px;
  border: 1px solid var(--border);
  border-radius: 8px;
  background: rgba(255,255,255,.04);
  color: var(--text);
  font-size: .92rem;
  font-family: var(--font);
  transition: border-color .15s, box-shadow .15s;
}
.auth-field input:focus,
.auth-field select:focus {
  outline: none;
  border-color: var(--accent);
  box-shadow: 0 0 0 3px rgba(120,180,255,.12);
}
.auth-field input::placeholder {
  color: var(--text-3);
}
/* Google login button */
.auth-google {
  width: 100%;
  padding: 12px 20px;
  background: #fff;
  color: #1f1f1f;
  border: none;
  border-radius: 8px;
  font-size: .92rem;
  font-weight: 500;
  font-family: var(--font);
  cursor: pointer;
  display: flex;
  align-items: center;
  justify-content: center;
  gap: 10px;
  transition: background .15s, box-shadow .15s, transform .1s;
  box-shadow: 0 1px 3px rgba(0,0,0,.3);
}
.auth-google:hover {
  background: #f2f2f2;
  box-shadow: 0 2px 6px rgba(0,0,0,.4);
}
.auth-google:active { transform: scale(.98); }
.auth-google svg { flex-shrink: 0; }

/* Divider */
.auth-divider {
  display: flex;
  align-items: center;
  gap: 14px;
  margin: 20px 0;
  color: var(--text-3);
  font-size: .76rem;
}
.auth-divider::before,
.auth-divider::after {
  content: '';
  flex: 1;
  height: 1px;
  background: var(--border);
}

/* Email fallback submit */
.auth-email-submit {
  width: 100%;
  margin-top: 4px;
  padding: 11px 20px;
  background: transparent;
  color: var(--text);
  border: 1px solid var(--border);
  border-radius: 8px;
  font-size: .88rem;
  font-weight: 500;
  font-family: var(--font);
  cursor: pointer;
  transition: border-color .15s, background .15s, transform .1s;
}
.auth-email-submit:hover {
  border-color: var(--border-strong);
  background: rgba(255,255,255,.04);
}
.auth-email-submit:active { transform: scale(.98); }

/* Terms */
.auth-terms {
  margin-top: 20px;
  text-align: center;
  font-size: .72rem;
  color: var(--text-3);
}
.auth-terms a {
  color: var(--text-2);
  text-decoration: underline;
  text-underline-offset: 2px;
}
.callout-card h2 {
  margin: 0;
  font-size: 1.2rem;
  font-weight: 700;
}

/* ── GUIDE BAR (onboarding inline) ── */

.guide-bar {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 16px;
  padding: 12px 20px;
  margin-bottom: 20px;
  border: 1px solid var(--accent-border);
  border-radius: var(--radius-md);
  background: linear-gradient(135deg, rgba(120,180,255,.08) 0%, rgba(120,180,255,.03) 100%);
}

.guide-bar.guide-bar-hint {
  border-color: var(--border);
  background: var(--bg-raised);
}

.guide-bar-left {
  display: flex;
  align-items: center;
  gap: 12px;
  flex-wrap: wrap;
  min-width: 0;
}

.guide-bar-badge {
  display: inline-block;
  padding: 2px 10px;
  font-size: .7rem;
  font-weight: 600;
  font-family: var(--mono);
  text-transform: uppercase;
  letter-spacing: .06em;
  color: var(--accent);
  background: var(--accent-bg);
  border: 1px solid var(--accent-border);
  border-radius: 999px;
  white-space: nowrap;
}

.guide-bar-hint .guide-bar-badge {
  color: var(--text-3);
  background: rgba(255,255,255,.04);
  border-color: var(--border);
}

.guide-bar-left strong {
  font-size: .92rem;
  white-space: nowrap;
}

.guide-bar-desc {
  color: var(--text-2);
  font-size: .84rem;
}

.guide-bar-right {
  flex-shrink: 0;
}

.guide-bar-progress {
  width: 80px;
  height: 4px;
  border-radius: 999px;
  overflow: hidden;
  background: rgba(255,255,255,.06);
}
.guide-bar-progress span {
  display: block;
  height: 100%;
  border-radius: 999px;
  background: var(--accent);
  transition: width .4s ease;
}

.guide-bar-link {
  font-size: .84rem;
  font-weight: 600;
  color: var(--accent);
  white-space: nowrap;
  transition: opacity .15s;
}
.guide-bar-link:hover { opacity: .8; }

/* ── SETUP / ONBOARDING PAGE ── */

.setup-shell {
  max-width: 720px;
  margin: 0 auto;
}

.setup-header {
  text-align: center;
  padding: 20px 0 28px;
}

.setup-badge {
  display: inline-block;
  padding: 4px 14px;
  font-size: .72rem;
  font-weight: 600;
  text-transform: uppercase;
  letter-spacing: .1em;
  font-family: var(--mono);
  color: var(--accent);
  border: 1px solid var(--accent-border);
  border-radius: 999px;
  background: var(--accent-bg);
  margin-bottom: 14px;
}

.setup-header h1 {
  margin: 0 0 8px;
  font-size: 1.6rem;
  font-weight: 700;
  font-family: var(--font-display);
}

.setup-sub {
  margin: 0 0 20px;
  color: var(--text-2);
  font-size: .92rem;
}

.setup-progress-bar {
  width: 200px;
  height: 6px;
  border-radius: 999px;
  overflow: hidden;
  background: rgba(255,255,255,.06);
  margin: 0 auto 8px;
}
.setup-progress-bar span {
  display: block;
  height: 100%;
  border-radius: 999px;
  background: linear-gradient(90deg, var(--accent) 0%, rgba(120,180,255,.5) 100%);
  transition: width .4s ease;
}

.setup-progress-text {
  color: var(--text-3);
  font-size: .78rem;
  font-family: var(--mono);
}

/* Steps */
.setup-steps {
  display: grid;
  gap: 16px;
}

.setup-step {
  display: grid;
  grid-template-columns: 48px 1fr;
  gap: 16px;
  padding: 24px;
  border: 1px solid var(--border);
  border-radius: var(--radius);
  background: var(--bg-raised);
  transition: border-color .2s, background .2s;
}

.setup-step.is-active {
  border-color: var(--accent-border);
  background: linear-gradient(135deg, rgba(120,180,255,.06) 0%, rgba(120,180,255,.02) 100%);
  box-shadow: 0 0 0 1px rgba(120,180,255,.08);
}

.setup-step.is-done {
  opacity: .6;
}

.setup-step.is-locked {
  opacity: .35;
  pointer-events: none;
}

.setup-step-num {
  display: flex;
  justify-content: center;
  padding-top: 2px;
}

.setup-num {
  width: 32px;
  height: 32px;
  border-radius: 50%;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  font-size: .82rem;
  font-weight: 700;
  font-family: var(--mono);
  color: var(--text-3);
  border: 1.5px solid var(--border-strong);
}

.setup-step.is-active .setup-num {
  color: #fff;
  background: var(--accent);
  border-color: var(--accent);
  box-shadow: 0 0 0 4px rgba(120,180,255,.2);
}

.setup-check {
  width: 32px;
  height: 32px;
  border-radius: 50%;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  font-size: .82rem;
  color: var(--bg);
  background: var(--success);
}

.setup-step-content p {
  margin: 4px 0 0;
  color: var(--text-2);
  font-size: .88rem;
  line-height: 1.5;
}

.setup-step-title {
  display: flex;
  align-items: center;
  gap: 10px;
}

.setup-step-title strong {
  font-size: 1rem;
}

/* Inline actions */
.setup-inline-action {
  margin-top: 16px;
}

.setup-key-form {
  display: flex;
  gap: 10px;
  align-items: center;
}

.setup-key-form input[type="text"] {
  flex: 1;
  padding: 10px 14px;
  background: var(--bg);
  border: 1px solid var(--border-strong);
  border-radius: var(--radius-sm);
  font-size: .88rem;
  transition: border-color .15s;
}
.setup-key-form input[type="text"]:focus {
  outline: none;
  border-color: var(--accent);
}

/* Result blocks */
.setup-result {
  margin-top: 14px;
  padding: 14px;
  border-radius: var(--radius-sm);
  background: var(--bg);
  border: 1px solid var(--border);
}

.setup-result-label {
  font-size: .78rem;
  font-weight: 600;
  color: var(--text-3);
  font-family: var(--mono);
  text-transform: uppercase;
  letter-spacing: .06em;
  margin-bottom: 8px;
}

.setup-key-item {
  font-size: .88rem;
  color: var(--text-2);
  padding: 4px 0;
}
.setup-key-item code {
  font-family: var(--mono);
  color: var(--text-3);
}

.setup-copyable {
  display: flex;
  align-items: center;
  gap: 10px;
  padding: 10px 14px;
  background: rgba(255,255,255,.03);
  border: 1px solid var(--border);
  border-radius: var(--radius-sm);
}
.setup-copyable code {
  flex: 1;
  font-family: var(--mono);
  font-size: .82rem;
  word-break: break-all;
  color: var(--accent);
}
.copy-btn {
  padding: 4px 12px;
  font-size: .78rem;
  font-family: var(--mono);
  color: var(--accent);
  background: var(--accent-bg);
  border: 1px solid var(--accent-border);
  border-radius: var(--radius-sm);
  cursor: pointer;
  transition: background .15s;
}
.copy-btn:hover { background: rgba(120,180,255,.15); }

/* Code block */
.setup-code-block {
  border: 1px solid var(--border);
  border-radius: var(--radius-sm);
  overflow: hidden;
  background: var(--bg);
}
.setup-code-block pre {
  margin: 0;
  padding: 16px;
  font-family: var(--mono);
  font-size: .8rem;
  line-height: 1.6;
  color: var(--text-2);
  white-space: pre-wrap;
  word-break: break-word;
  max-height: 280px;
  overflow-y: auto;
}
.setup-copy-form {
  display: flex;
  justify-content: flex-end;
  padding: 8px 12px;
  border-top: 1px solid var(--border);
  background: rgba(255,255,255,.02);
}

/* Terminal mock */
.setup-terminal {
  border: 1px solid var(--border);
  border-radius: var(--radius-sm);
  overflow: hidden;
  background: #0d0d12;
}
.setup-terminal-bar {
  display: flex;
  align-items: center;
  gap: 6px;
  padding: 10px 14px;
  background: rgba(255,255,255,.04);
  border-bottom: 1px solid var(--border);
}
.setup-terminal-dot {
  width: 8px;
  height: 8px;
  border-radius: 50%;
  background: rgba(255,255,255,.12);
}
.setup-terminal-title {
  margin-left: 8px;
  font-size: .72rem;
  font-family: var(--mono);
  color: var(--text-3);
}
.setup-terminal-body {
  margin: 0;
  padding: 14px 16px;
  font-family: var(--mono);
  font-size: .82rem;
  line-height: 1.7;
  color: var(--success);
}

.setup-hint {
  margin: 10px 0 0;
  font-size: .82rem;
  color: var(--text-3);
  line-height: 1.5;
}
.setup-hint code {
  font-family: var(--mono);
  color: var(--warm);
  font-size: .78rem;
}

/* Completion */
.setup-complete {
  text-align: center;
  padding: 40px 24px;
  margin-top: 24px;
  border: 1px solid rgba(16,185,129,.2);
  border-radius: var(--radius);
  background: var(--success-bg);
}
.setup-complete-icon {
  font-size: 2rem;
  display: block;
  margin-bottom: 12px;
}
.setup-complete h2 {
  margin: 0 0 8px;
  font-size: 1.2rem;
  color: var(--success);
}
.setup-complete p {
  margin: 0 0 20px;
  color: var(--text-2);
  font-size: .92rem;
}

/* ── MISC ── */

.section { padding-top: 10px; }
.section-heading { margin-bottom: 14px; }
.section-heading h2 {
  margin: 6px 0 0;
  font-family: var(--font-display);
  font-size: 1.3rem;
  font-weight: 700;
}

.hero {
  max-width: 1200px;
  margin: 0 auto;
  display: grid;
  grid-template-columns: minmax(0, 1.08fr) minmax(300px, 0.92fr);
  gap: 20px;
}
.hero-copy, .hero-panel {
  padding: 24px;
  border: 1px solid var(--border);
  border-radius: var(--radius);
  background: var(--bg-raised);
}
.hero-copy.compact { padding: 22px; }
.hero h1, .hero-copy h1 {
  margin: 0;
  font-size: clamp(1.8rem, 3.5vw, 3rem);
  font-family: var(--font-display);
  line-height: 1;
  letter-spacing: -.03em;
  font-weight: 700;
}
.hero p, .hero-copy p {
  max-width: 56ch;
  margin: 12px 0 0;
  color: var(--text-2);
  font-size: .92rem;
  line-height: 1.6;
}

.dashboard-hero {
  display: grid;
  grid-template-columns: minmax(0, 1.1fr) minmax(300px, 0.9fr);
  gap: 20px;
}

.back-link {
  display: inline-flex;
  align-items: center;
  gap: 4px;
  margin-bottom: 8px;
  margin-left: -8px;           /* 视觉左缘对齐内容主体（让 padding 不让按钮看起来"挪位置"） */
  padding: 5px 10px 5px 8px;
  color: var(--text-secondary); /* 从 text-3 (muted) 升到 secondary，可读性立刻清晰 */
  font-size: .88rem;
  border-radius: 6px;
  transition: color .15s, background .15s;
}
.back-link:hover {
  color: var(--text);
  background: rgba(255,255,255,.05);   /* hover 微高光，给"是个按钮"的明确反馈 */
}

.empty-state {
  padding: 28px;
  text-align: center;
  color: var(--text-3);
}

.selection-summary { color: var(--text-3); }

.plain-list { margin: 0; padding-left: 20px; color: var(--text-2); }
.plain-list.ordered { display: grid; gap: 6px; }
.compact-list { display: grid; gap: 8px; }

.steps-list { display: grid; gap: 12px; }
.step-card.replay {
  display: grid;
  grid-template-columns: 160px 1fr;
  gap: 16px;
  align-items: center;
}
.step-shot img {
  width: 100%;
  border-radius: var(--radius-md);
  border: 1px solid var(--border);
}
.step-title { font-weight: 700; margin-bottom: 4px; }

.app-card { text-align: left; }

/* ── RESPONSIVE — Drawer pattern ──
 * Below 1024px, sidebar is hidden-by-default off-canvas drawer. A
 * hamburger button in the content area (visible at this breakpoint
 * only) toggles .sidebar-open on .console-shell; the class drives
 * sidebar slide-in + backdrop fade. Click outside, ESC, or nav link
 * clicks close it (see base.html JS). */
@media (max-width: 1024px) {
  .console-shell {
    grid-template-columns: 1fr;
  }
  .sidebar {
    position: fixed;
    top: 0;
    left: 0;
    width: 260px;
    height: 100vh;
    z-index: 200;
    transform: translateX(-100%);
    transition: transform .3s cubic-bezier(.16,1,.3,1);
    border-right: 1px solid rgba(255,255,255,.08);
    border-bottom: none;
    box-shadow: 8px 0 32px -8px rgba(0,0,0,.5);
  }
  .console-shell.sidebar-open .sidebar {
    transform: translateX(0);
  }
  /* Backdrop overlay when drawer is open. Fades in/out with .sidebar-open. */
  .console-shell::after {
    content: '';
    position: fixed;
    inset: 0;
    z-index: 180;
    background: rgba(0,0,0,.55);
    opacity: 0;
    pointer-events: none;
    transition: opacity .3s;
  }
  .console-shell.sidebar-open::after {
    opacity: 1;
    pointer-events: auto;
  }
  /* Hamburger toggle — hidden on wide viewports (default), shown here. */
  .sidebar-toggle { display: inline-flex; }
  .hero, .dashboard-hero, .auth-layout { grid-template-columns: 1fr; }
}

/* Hamburger button — floating top-left of content area, only rendered
 * visible at narrow widths via the @media above. */
.sidebar-toggle {
  display: none;
  position: fixed;
  top: 14px;
  left: 14px;
  z-index: 210;
  width: 40px;
  height: 40px;
  align-items: center;
  justify-content: center;
  background: rgba(255,255,255,.05);
  border: 1px solid rgba(255,255,255,.10);
  border-radius: 10px;
  color: rgba(255,255,255,.85);
  cursor: pointer;
  backdrop-filter: blur(12px);
  -webkit-backdrop-filter: blur(12px);
  transition: background .2s, border-color .2s;
}
.sidebar-toggle:hover {
  background: rgba(255,255,255,.08);
  border-color: rgba(255,255,255,.18);
}
.sidebar-toggle svg {
  width: 18px;
  height: 18px;
  stroke: currentColor;
  stroke-width: 1.8;
  fill: none;
}

@media (max-width: 820px) {
  .page-shell { padding: 16px 14px 28px; }
  .hero-copy, .hero-panel, .auth-card, .callout-card, .detail-hero, .page-hero { padding: 18px; }
  .console-topbar, .page-hero, .panel-header { align-items: flex-start; }
  .step-card.replay { grid-template-columns: 1fr; }
}

/* ═══ LANDING PAGE DARK (kept for marketing-shell if ever used) ═══ */

.marketing-shell .page-shell { padding: 0; }

.aurora {
  position: fixed; inset: 0; z-index: 0;
  pointer-events: none; overflow: hidden;
}
.aurora-blob {
  position: absolute; border-radius: 50%;
  filter: blur(140px);
  animation: aurora-in 2s ease forwards; opacity: 0;
}
.aurora-blob-1 {
  width: 60vw; height: 60vw;
  background: rgba(80,140,255,.1);
  top: -20%; left: -15%;
  animation: aurora-in 2s ease forwards, aurora-drift-1 20s ease-in-out infinite alternate;
}
.aurora-blob-2 {
  width: 50vw; height: 50vw;
  background: rgba(60,200,220,.07);
  bottom: -25%; right: -15%;
  animation: aurora-in 2s ease forwards, aurora-drift-2 25s ease-in-out infinite alternate;
  animation-delay: -8s;
}
.aurora-blob-3 {
  width: 40vw; height: 40vw;
  background: rgba(120,100,255,.05);
  top: 40%; left: 50%;
  animation: aurora-in 2s ease forwards, aurora-drift-3 18s ease-in-out infinite alternate;
  animation-delay: -4s;
}
@keyframes aurora-in { to { opacity: 1; } }
@keyframes aurora-drift-1 { 0% { transform: translate(0,0) scale(1); } 100% { transform: translate(8vw,6vh) scale(1.15); } }
@keyframes aurora-drift-2 { 0% { transform: translate(0,0) scale(1); } 100% { transform: translate(-6vw,-8vh) scale(1.1); } }
@keyframes aurora-drift-3 { 0% { transform: translate(0,0) scale(1); } 100% { transform: translate(5vw,-5vh) scale(1.2); } }

.reveal {
  opacity: 0; transform: translateY(32px);
  transition: opacity .8s cubic-bezier(.16,1,.3,1), transform .8s cubic-bezier(.16,1,.3,1);
}
.reveal.visible { opacity: 1; transform: translateY(0); }
.delay-1 { transition-delay: .1s; }
.delay-2 { transition-delay: .2s; }
.delay-3 { transition-delay: .3s; }
.delay-4 { transition-delay: .4s; }

/* ═══ LANDING PAGE — landing-* classes ═══ */

.marketing-shell {
  display: block;
  position: relative;
  z-index: 1;
  overflow-x: hidden;
}

/* Hero */
.landing-hero {
  max-width: 900px;
  margin: 0 auto;
  padding: 100px 28px 40px;
  text-align: center;
}
.landing-hero-inner {
  display: flex;
  flex-direction: column;
  align-items: center;
}

/* Label / eyebrow */
.landing-label {
  display: inline-flex;
  margin-bottom: 14px;
  padding: 5px 12px;
  border-radius: 999px;
  background: var(--accent-bg);
  color: var(--accent);
  font-size: .72rem;
  font-weight: 600;
  font-family: var(--mono);
  text-transform: uppercase;
  letter-spacing: .1em;
}
.landing-label-sm {
  color: var(--warm);
  font-size: .72rem;
  font-family: var(--mono);
  text-transform: uppercase;
  letter-spacing: .08em;
}

/* Typography */
.landing-h1 {
  margin: 0;
  font-size: clamp(2rem, 4.5vw, 3.2rem);
  font-family: var(--font-display);
  font-weight: 700;
  line-height: 1.15;
  letter-spacing: -.03em;
}
.landing-h2 {
  margin: 6px 0 0;
  font-family: var(--font-display);
  font-size: 1.5rem;
  font-weight: 700;
  letter-spacing: -.02em;
}
.landing-sub {
  max-width: 56ch;
  margin: 16px 0 0;
  color: var(--text-2);
  font-size: .95rem;
  line-height: 1.7;
}

/* Actions */
.landing-actions {
  display: flex;
  gap: 12px;
  align-items: center;
  flex-wrap: wrap;
  justify-content: center;
  margin-top: 28px;
}
.landing-btn-primary {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  border-radius: var(--radius-sm);
  padding: 11px 24px;
  font-size: .92rem;
  font-weight: 600;
  cursor: pointer;
  text-decoration: none;
  position: relative;
  overflow: hidden;
  transition: all .4s cubic-bezier(.16,1,.3,1);
  background: linear-gradient(180deg, rgba(120,180,255,.13) 0%, rgba(120,180,255,.04) 100%);
  border: 1px solid rgba(120,180,255,.2);
  border-top-color: rgba(120,180,255,.32);
  color: rgba(120,180,255,.95);
  box-shadow:
    0 1px 2px rgba(0,0,0,.12),
    0 4px 12px rgba(0,0,0,.14),
    inset 0 1px 1px rgba(255,255,255,.08),
    inset 0 -1px 1px rgba(0,0,0,.1);
}
.landing-btn-primary::before {
  content: '';
  position: absolute; top: 0; left: 15%; right: 15%; height: 1px;
  background: linear-gradient(90deg, transparent, rgba(120,180,255,.45) 50%, transparent);
  pointer-events: none;
}
.landing-btn-primary:hover {
  background: linear-gradient(180deg, rgba(120,180,255,.2) 0%, rgba(120,180,255,.08) 100%);
  border-color: rgba(120,180,255,.32);
  border-top-color: rgba(120,180,255,.48);
  transform: translateY(-1px);
  box-shadow:
    0 2px 4px rgba(0,0,0,.15),
    0 8px 24px rgba(0,0,0,.2),
    0 12px 36px rgba(120,180,255,.07),
    inset 0 1px 2px rgba(255,255,255,.12),
    inset 0 -1px 2px rgba(0,0,0,.1);
}
.landing-btn-primary:active { transform: translateY(0); }

.landing-btn-ghost {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  border-radius: var(--radius-sm);
  padding: 9px 16px;
  font-size: .88rem;
  font-weight: 500;
  cursor: pointer;
  text-decoration: none;
  transition: all .4s cubic-bezier(.16,1,.3,1);
  color: var(--text-2);
  background: transparent;
  border: 1px solid rgba(255,255,255,.1);
}
.landing-btn-ghost:hover {
  color: var(--text);
  border-color: rgba(255,255,255,.18);
  background: rgba(255,255,255,.04);
}

/* Metrics row */
.landing-metrics {
  display: grid;
  grid-template-columns: repeat(4, 1fr);
  gap: 16px;
  max-width: 720px;
  margin: 36px auto 0;
  text-align: center;
}
.landing-metric {
  padding: 18px 12px;
  border: 1px solid var(--border);
  border-radius: var(--radius-md);
  background: var(--bg-raised);
  display: flex;
  flex-direction: column;
  align-items: center;
}
.landing-metric-val {
  font-size: clamp(1.6rem, 3vw, 2.2rem);
  font-weight: 800;
  letter-spacing: -.04em;
  font-family: var(--font-display);
}
.landing-metric-lbl {
  color: var(--text-3);
  font-size: .82rem;
  margin-top: 4px;
}

/* Chips */
.landing-chips {
  display: flex;
  flex-wrap: wrap;
  gap: 8px;
  justify-content: center;
  max-width: 900px;
  margin: 28px auto 0;
}
.landing-chip {
  padding: 7px 12px;
  border-radius: 999px;
  border: 1px solid var(--border);
  background: var(--surface);
  color: var(--text-2);
  font-size: .82rem;
}

/* Sections */
.landing-section {
  max-width: 900px;
  margin: 0 auto;
  padding: 48px 28px 0;
}
.landing-sec-head {
  margin-bottom: 20px;
  text-align: center;
}
.landing-sec-sub {
  color: var(--text-2);
  font-size: .9rem;
  margin: 8px 0 0;
  line-height: 1.55;
}

/* Glass card (shared) */
.glass-card {
  padding: 22px;
  border: 1px solid var(--border);
  border-radius: var(--radius);
  background: var(--bg-raised);
  transition: border-color .15s, transform .15s;
}
.glass-card:hover {
  border-color: var(--border-strong);
  transform: translateY(-2px);
}

/* App wall */
.landing-app-wall {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(140px, 1fr));
  gap: 12px;
}
.landing-app-card {
  padding: 16px;
  min-height: 100px;
  display: grid;
  align-content: space-between;
  text-align: left;
}
.landing-app-icon { font-size: 1.6rem; }
.landing-app-name { font-weight: 700; font-size: .88rem; margin-top: 6px; }
.landing-app-meta { color: var(--text-3); font-size: .8rem; }

/* Goals / use-case cards */
.landing-goals {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(240px, 1fr));
  gap: 16px;
}
.landing-goal-card {
  display: flex;
  flex-direction: column;
  gap: 10px;
  text-align: left;
}
.landing-goal-card p {
  margin: 0;
  color: var(--text-2);
  line-height: 1.6;
  font-size: .9rem;
}
.landing-goal-head h3 {
  margin: 4px 0 0;
  font-size: 1.1rem;
}

/* Leaderboard */
.landing-leaderboard {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(240px, 1fr));
  gap: 16px;
}
.landing-rank-card { text-align: left; }
.landing-rank-card h3 { margin: 8px 0 4px; font-size: 1.1rem; }
.landing-rank-card.rank-gold {
  background: linear-gradient(160deg, rgba(120,180,255,.08) 0%, var(--bg-raised) 100%);
  border-color: var(--accent-border);
}
.landing-rank-badge {
  font-size: .72rem;
  font-weight: 600;
  font-family: var(--mono);
  letter-spacing: .1em;
  text-transform: uppercase;
  color: var(--accent-dim);
}
.landing-rank-org {
  color: var(--text-2);
  font-size: .85rem;
  margin: 0;
}
.landing-rank-score {
  margin: 14px 0 8px;
  font-size: clamp(2rem, 4vw, 3.2rem);
  line-height: 1;
  font-weight: 800;
  letter-spacing: -.05em;
  font-family: var(--font-display);
  background: linear-gradient(135deg, #78B4FF, #B4D8FF);
  -webkit-background-clip: text;
  -webkit-text-fill-color: transparent;
  background-clip: text;
}
.landing-rank-stats {
  color: var(--text-3);
  font-size: .82rem;
  font-family: var(--mono);
}
.landing-rank-tag {
  margin: 10px 0 0;
  color: var(--text-2);
  line-height: 1.55;
  font-size: .88rem;
}
.landing-cta-row {
  text-align: center;
  margin-top: 20px;
}

/* Scenes */
.landing-scene-grid {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
  gap: 12px;
}
.landing-scene-card {
  display: flex;
  align-items: center;
  gap: 14px;
  padding: 16px 18px;
  text-align: left;
}
.landing-scene-icon { font-size: 1.6rem; flex-shrink: 0; }
.landing-scene-name { font-weight: 700; font-size: .92rem; }
.landing-scene-meta { color: var(--text-3); font-size: .82rem; margin-top: 2px; }

/* Quick start steps */
.landing-steps {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(220px, 1fr));
  gap: 16px;
}
.landing-step {
  display: flex;
  align-items: flex-start;
  gap: 16px;
  text-align: left;
}
.landing-step h3 { margin: 0 0 4px; font-size: 1rem; }
.landing-step p { margin: 0; color: var(--text-2); font-size: .88rem; line-height: 1.55; }
.landing-step-num {
  flex-shrink: 0;
  width: 32px;
  height: 32px;
  display: flex;
  align-items: center;
  justify-content: center;
  border-radius: 50%;
  background: var(--accent-bg);
  color: var(--accent);
  font-size: .82rem;
  font-weight: 700;
  font-family: var(--mono);
}

/* Footer */
.landing-footer {
  max-width: 900px;
  margin: 0 auto;
  padding: 48px 28px 40px;
  text-align: center;
}
.landing-footer-inner {
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: 4px;
  padding-top: 20px;
  border-top: 1px solid var(--border);
}
.landing-footer-brand {
  font-weight: 700;
  font-size: .92rem;
  font-family: var(--font-display);
}
.landing-footer-copy {
  color: var(--text-3);
  font-size: .82rem;
}

/* Landing responsive */
@media (max-width: 820px) {
  .landing-hero { padding: 60px 18px 28px; }
  .landing-metrics { grid-template-columns: repeat(2, 1fr); }
  .landing-section { padding: 36px 18px 0; }
  .landing-goals,
  .landing-leaderboard { grid-template-columns: 1fr; }
  .landing-steps { grid-template-columns: 1fr; }
}

/* ── SIDEBAR QUICK START ── */
/* Diagonal corner lighting — two light sources hitting the card at opposite
 * corners. Top-left: amber halo (qs-card identity). Bottom-right: warm-white
 * halo (mirrors .mc-cell's warm-white specular tint, ties to step3 visually).
 * Hairlines are also directional — top hairline brightest at left, bottom
 * hairline brightest at right — reinforcing the diagonal light direction. */
.qs-card {
  gap: 0;
  padding: 13px 14px 14px;
  border-color: rgba(200,169,110,.2);
  background:
    /* Bottom-right warm-white corner halo */
    radial-gradient(ellipse 70% 60% at 100% 100%,
      rgba(255,248,235,.10) 0%,
      transparent 60%),
    /* Top-left amber corner halo */
    radial-gradient(ellipse 70% 60% at 0% 0%,
      rgba(200,169,110,.10) 0%,
      transparent 60%),
    /* Faint amber base wash — keeps card's warm identity in the middle */
    linear-gradient(180deg,
      rgba(200,169,110,.02) 0%,
      rgba(255,255,255,.005) 100%);
  position: relative;
  overflow: hidden;
}
/* Top-LEFT corner arc — 85×85 box anchored at top-left with only top + left
 * 1px borders and matching corner radius. Radial mask centered AT the corner
 * (0% 0%) so visibility falls off equally with distance from the corner —
 * mimics a real light source at the corner radiating outward, instead of a
 * diagonal slice. Multi-stop ease-out makes the fade feel natural. */
.qs-card::before {
  content: '';
  position: absolute;
  top: 0; left: 0;
  width: 85px; height: 85px;
  box-sizing: border-box;
  border-top: 1px solid rgba(200,169,110,.75);
  border-left: 1px solid rgba(200,169,110,.75);
  border-top-left-radius: 16px;
  pointer-events: none;
  mask-image: radial-gradient(circle at 0% 0%,
    rgba(0,0,0,1)    0%,
    rgba(0,0,0,.92) 12%,
    rgba(0,0,0,.72) 28%,
    rgba(0,0,0,.48) 45%,
    rgba(0,0,0,.26) 62%,
    rgba(0,0,0,.10) 80%,
    transparent     100%);
  -webkit-mask-image: radial-gradient(circle at 0% 0%,
    rgba(0,0,0,1)    0%,
    rgba(0,0,0,.92) 12%,
    rgba(0,0,0,.72) 28%,
    rgba(0,0,0,.48) 45%,
    rgba(0,0,0,.26) 62%,
    rgba(0,0,0,.10) 80%,
    transparent     100%);
}
/* Bottom-RIGHT corner arc — mirror of ::before, warm-white, radial mask
 * centered at 100% 100% (bottom-right of the pseudo, which is the parent's
 * bottom-right corner). */
.qs-card::after {
  content: '';
  position: absolute;
  bottom: 0; right: 0;
  width: 85px; height: 85px;
  box-sizing: border-box;
  border-bottom: 1px solid rgba(255,248,235,.62);
  border-right: 1px solid rgba(255,248,235,.62);
  border-bottom-right-radius: 16px;
  pointer-events: none;
  mask-image: radial-gradient(circle at 100% 100%,
    rgba(0,0,0,1)    0%,
    rgba(0,0,0,.92) 12%,
    rgba(0,0,0,.72) 28%,
    rgba(0,0,0,.48) 45%,
    rgba(0,0,0,.26) 62%,
    rgba(0,0,0,.10) 80%,
    transparent     100%);
  -webkit-mask-image: radial-gradient(circle at 100% 100%,
    rgba(0,0,0,1)    0%,
    rgba(0,0,0,.92) 12%,
    rgba(0,0,0,.72) 28%,
    rgba(0,0,0,.48) 45%,
    rgba(0,0,0,.26) 62%,
    rgba(0,0,0,.10) 80%,
    transparent     100%);
}
.qs-head {
  display: flex;
  align-items: center;
  justify-content: space-between;
  margin-bottom: 8px;
}
.qs-fraction {
  font-size: .65rem;
  font-family: 'IBM Plex Mono', monospace;
  color: rgba(200,169,110,.72);
  letter-spacing: .08em;
}
/* progress-rail already has margin-bottom: 8px */
.qs-current {
  display: flex;
  flex-direction: column;
  gap: 3px;
  padding: 9px 0 8px;
  background: none;
  border: none;
  border-top: 1px solid rgba(200,169,110,.1);
  border-radius: 0;
  margin: 4px 0 0;
}
.qs-step-num {
  font-size: .58rem;
  font-family: 'IBM Plex Mono', monospace;
  text-transform: uppercase;
  letter-spacing: .14em;
  color: rgba(200,169,110,.72);
  font-weight: 600;
}
.qs-step-row {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 8px;
}
.qs-step-name {
  font-size: .82rem;
  font-weight: 500;
  color: var(--text);
  line-height: 1.3;
}
.qs-continue {
  display: inline-flex;
  align-items: center;
  gap: 2px;
  font-size: .72rem;
  font-weight: 600;
  color: rgba(200,169,110,.82);
  text-decoration: none;
  white-space: nowrap;
  flex-shrink: 0;
  transition: color .15s;
}
.qs-continue:hover { color: rgba(200,169,110,1); }

/* ── ONBOARDING BULLET POINTS ── */
.ob-bullets {
  list-style: none;
  padding: 0;
  margin: 8px 0 6px;
  display: flex;
  flex-direction: column;
  gap: 5px;
}
.ob-bullets li {
  font-size: .78rem;
  color: var(--text-2);
  line-height: 1.4;
  padding-left: 4px;
}
.ob-bullets li code {
  font-family: var(--mono);
  font-size: .75rem;
  background: rgba(120,180,255,.12);
  padding: 1px 5px;
  border-radius: 4px;
  color: var(--accent);
}
.ob-hint {
  font-size: .74rem;
  color: var(--text-3);
  margin: 6px 0 4px;
  padding: 6px 8px;
  border-left: 2px solid rgba(120,180,255,.3);
  line-height: 1.4;
}

/* 步骤3/4：不带整体 href 的当前步骤 */
.ob-step-nolink {
  cursor: default;
}
.ob-step-nolink:hover {
  background: transparent;
}
.ob-step-nolink .ob-cta {
  display: inline-block;
  text-decoration: none;
}

/* Deleted: second copy of .ob-conn-* — status pill now lives under .mc-status-pill
 * in the .mc-* component block. The JS polling hook on .ob-conn-status is kept
 * as an HTML alias class (for script targeting) but carries no styles. */

/* ── RUN DETAIL 示例代码 ── */
.panel-header-row {
  display: flex;
  align-items: baseline;
  gap: 12px;
  margin-bottom: 12px;
}
.panel-header-row h2 { margin: 0; }
.code-block-wrap {
  position: relative;
}
.code-block {
  background: var(--bg-2, #111118);
  border: 1px solid var(--border);
  border-radius: 8px;
  padding: 16px;
  font-family: var(--mono);
  font-size: .78rem;
  line-height: 1.6;
  color: var(--text-2);
  overflow-x: auto;
  white-space: pre;
  margin: 0;
}
.copy-btn {
  position: absolute;
  top: 10px;
  right: 10px;
  padding: 5px 12px;
  background: rgba(120,180,255,.15);
  border: 1px solid rgba(120,180,255,.25);
  border-radius: 6px;
  color: var(--accent);
  font-size: .75rem;
  font-family: var(--mono);
  cursor: pointer;
  transition: background .15s;
}
.copy-btn:hover { background: rgba(120,180,255,.25); }
.copy-btn.copied { color: var(--success); border-color: var(--success); }

/* ── 表格操作链接 —— 同时支持 <a> 和 <button>（任务详情用 button） ── */
.table-action-link {
  font-size: .78rem;
  color: var(--accent);
  text-decoration: none;
  font-family: var(--mono);
  white-space: nowrap;
  background: transparent;
  border: 0;
  padding: 0;
  cursor: pointer;
}
.table-action-link:hover { text-decoration: underline; }

/* run_detail 任务结果表格 —— 当前展开详情的行视觉高亮（左竖条 + bg 微提） */
[data-task-result-row].is-detail-active {
  background: rgba(200,169,110,.05);
  position: relative;
}
[data-task-result-row].is-detail-active::before {
  content: "";
  position: absolute;
  left: 0; top: 0; bottom: 0;
  width: 2px;
  background: var(--accent);
}
[data-task-result-row].is-detail-active .table-action-link {
  color: #fff;
}

/* Faceted Search Modal Layout */
.faceted-modal-layout {
  display: grid;
  grid-template-columns: 240px minmax(0, 1fr) 360px;
  gap: 24px;
  min-height: 600px;
  max-height: calc(100vh - 160px);
}

/* Two-Column Modal Layout (simplified) */
.two-column-modal-layout {
  display: grid;
  grid-template-columns: 240px minmax(0, 1fr);
  gap: 24px;
  min-height: 600px;
  max-height: calc(100vh - 160px);
}

.main-content-panel {
  display: flex;
  flex-direction: column;
  gap: 18px;
  overflow-y: auto;
}

.selection-summary {
  display: flex;
  flex-direction: column;
  gap: 10px;
  margin-bottom: 16px;
}

.summary-header {
  display: flex;
  justify-content: space-between;
  align-items: center;
}

.summary-header h3 {
  margin: 0;
  font-size: 0.85rem;
  font-weight: 600;
  color: var(--muted);
  text-transform: uppercase;
  letter-spacing: 0.05em;
}

.selected-tasks-list {
  display: flex;
  flex-wrap: wrap;
  gap: 8px;
  max-height: 120px;
  overflow-y: auto;
  align-content: flex-start;
}

/* 当chips数量较多时，滚动条样式优化 */
.selected-tasks-list::-webkit-scrollbar {
  width: 6px;
  height: 6px;
}

.selected-tasks-list::-webkit-scrollbar-track {
  background: rgba(0, 0, 0, 0.05);
  border-radius: 3px;
}

.selected-tasks-list::-webkit-scrollbar-thumb {
  background: rgba(0, 0, 0, 0.2);
  border-radius: 3px;
}

.selected-tasks-list::-webkit-scrollbar-thumb:hover {
  background: rgba(0, 0, 0, 0.3);
}

.selected-task-chip {
  display: inline-flex;
  align-items: center;
  gap: 6px;
  padding: 6px 8px 6px 12px;
  border-radius: 16px;
  background: rgba(14, 95, 88, 0.1);
  border: 1px solid rgba(14, 95, 88, 0.2);
  font-family: var(--mono);
  font-size: 0.85rem;
  color: var(--text);
  transition: all 0.2s ease;
  max-width: 100%;
}

.selected-task-chip:hover {
  background: rgba(14, 95, 88, 0.15);
  border-color: rgba(14, 95, 88, 0.3);
}

.selected-task-chip .chip-text {
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
}

.selected-task-chip .chip-remove {
  flex-shrink: 0;
  width: 18px;
  height: 18px;
  display: flex;
  align-items: center;
  justify-content: center;
  border-radius: 50%;
  background: rgba(14, 95, 88, 0.15);
  border: none;
  color: var(--text);
  font-size: 14px;
  line-height: 1;
  cursor: pointer;
  transition: all 0.15s ease;
  padding: 0;
}

.selected-task-chip .chip-remove:hover {
  background: rgba(197, 48, 48, 0.2);
  color: #c53030;
}

.empty-selection-hint {
  padding: 4px 0;
  color: var(--muted);
  font-size: 0.9rem;
}

.empty-selection-hint p {
  margin: 0;
}

.modal-footer {
  margin-top: auto;
  padding-top: 16px;
  border-top: 1px solid var(--line);
  display: flex;
  flex-direction: column;
  gap: 12px;
}

.info-note {
  padding: 12px 16px;
  background: rgba(255, 107, 53, 0.08);
  border-radius: var(--radius-md);
  border-left: 3px solid var(--accent);
}

.filter-sidebar {
  border-right: 1px solid var(--line);
  padding-right: 24px;
  overflow-y: auto;
}

.filter-group {
  margin-bottom: 28px;
}

.filter-group-title {
  font-size: 0.76rem;
  font-weight: 700;
  text-transform: uppercase;
  letter-spacing: 0.1em;
  color: #82542a;
  margin-bottom: 14px;
  display: flex;
  align-items: center;
  gap: 8px;
}

.filter-options {
  display: grid;
  gap: 10px;
}

.filter-option {
  display: flex;
  align-items: center;
  gap: 10px;
  padding: 8px 12px;
  border-radius: 12px;
  cursor: pointer;
  transition: background 120ms ease;
}

.filter-option:hover {
  background: rgba(14, 95, 88, 0.06);
}

.filter-option input[type="checkbox"] {
  width: 18px;
  height: 18px;
  cursor: pointer;
}

.filter-option-label {
  flex: 1;
  font-size: 0.95rem;
  cursor: pointer;
  user-select: none;
}

.filter-count {
  color: var(--muted);
  font-size: 0.86rem;
}

.task-results-panel {
  display: flex;
  flex-direction: column;
  gap: 18px;
  overflow-y: auto;
}

.code-preview-panel {
  display: flex;
  flex-direction: column;
  border-left: 1px solid var(--line);
  padding-left: 24px;
  overflow-y: auto;
}

.active-filters {
  display: flex;
  flex-wrap: wrap;
  gap: 8px;
  padding-bottom: 16px;
  border-bottom: 1px solid var(--line);
}

.filter-chip {
  display: inline-flex;
  align-items: center;
  gap: 6px;
  padding: 6px 12px;
  border-radius: 999px;
  background: rgba(14, 95, 88, 0.12);
  color: var(--text);
  font-size: 0.86rem;
  font-weight: 600;
}

.filter-chip button {
  background: none;
  border: none;
  color: var(--accent);
  font-size: 1.1rem;
  cursor: pointer;
  padding: 0;
  margin-left: 2px;
  opacity: 0.7;
  transition: opacity 120ms ease;
}

.filter-chip button:hover {
  opacity: 1;
}

.clear-all-filters {
  display: inline-flex;
  align-items: center;
  gap: 6px;
  padding: 6px 12px;
  border-radius: 999px;
  background: transparent;
  color: var(--muted);
  font-size: 0.86rem;
  border: 1px solid var(--line);
  cursor: pointer;
  transition: all 120ms ease;
}

.clear-all-filters:hover {
  background: rgba(197, 117, 55, 0.08);
  color: var(--warning);
  border-color: var(--warning);
}

.task-list {
  display: grid;
  gap: 12px;
}

.task-item {
  display: flex;
  align-items: flex-start;
  gap: 14px;
  padding: 16px;
  border: 1px solid var(--line);
  border-radius: var(--radius-md);
  background: var(--paper);
  transition: all 120ms ease;
  cursor: pointer;
}

.task-item:hover {
  border-color: var(--accent);
  box-shadow: 0 8px 20px rgba(14, 95, 88, 0.12);
  transform: translateY(-1px);
}

.task-item.selected {
  border-color: var(--accent);
  background: rgba(14, 95, 88, 0.05);
}

.task-checkbox {
  width: 20px;
  height: 20px;
  margin-top: 2px;
  cursor: pointer;
  flex-shrink: 0;
}

.task-info {
  flex: 1;
  min-width: 0;
}

.task-id {
  font-weight: 700;
  font-size: 1.05rem;
  margin-bottom: 6px;
}

.task-meta {
  display: flex;
  flex-wrap: wrap;
  gap: 8px;
  margin-bottom: 8px;
}

.task-tag {
  display: inline-flex;
  align-items: center;
  padding: 4px 10px;
  border-radius: 8px;
  font-size: 0.8rem;
  font-weight: 600;
  background: rgba(99, 88, 74, 0.08);
  color: var(--muted);
}

.task-tag.scene {
  background: rgba(14, 95, 88, 0.1);
  color: var(--accent);
}

.task-tag.difficulty-low {
  background: rgba(14, 127, 102, 0.12);
  color: var(--success);
}

.task-tag.difficulty-medium {
  background: rgba(197, 117, 55, 0.12);
  color: var(--warning);
}

.task-tag.difficulty-high {
  background: rgba(180, 55, 55, 0.12);
  color: #b43737;
}

.task-apps {
  color: var(--muted);
  font-size: 0.9rem;
}

.code-preview-section {
  display: flex;
  flex-direction: column;
  gap: 16px;
  flex: 1;
}

.code-preview-header {
  display: flex;
  justify-content: space-between;
  align-items: center;
  margin-bottom: 16px;
}

.code-preview-title {
  font-size: 0.76rem;
  font-weight: 700;
  text-transform: uppercase;
  letter-spacing: 0.1em;
  color: #82542a;
}

.code-preview-block {
  position: relative;
  margin-bottom: 16px;
}

/* Task Summary Panel */
.task-summary-section {
  display: flex;
  flex-direction: column;
  gap: 16px;
  flex: 1;
}

.summary-header {
  display: flex;
  justify-content: space-between;
  align-items: center;
  padding-bottom: 12px;
  border-bottom: 1px solid var(--line);
}

.summary-header h3 {
  margin: 0;
  font-size: 1rem;
  font-weight: 700;
}

.task-count-badge {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  min-width: 28px;
  height: 28px;
  padding: 0 10px;
  border-radius: 999px;
  background: var(--accent);
  color: white;
  font-size: 0.9rem;
  font-weight: 700;
}


.info-note {
  padding: 12px 16px;
  border-radius: 12px;
  background: rgba(14, 95, 88, 0.06);
  border-left: 3px solid var(--accent);
}

.info-note p {
  margin: 0;
}

.no-results-state {
  padding: 60px 24px;
  text-align: center;
  color: var(--muted);
}

.no-results-state h3 {
  font-size: 1.2rem;
  margin-bottom: 8px;
  color: var(--text);
}

.empty-filter-state {
  padding: 120px 24px;
  text-align: center;
  color: var(--muted);
}

.empty-filter-state h3 {
  font-size: 1.3rem;
  margin-bottom: 12px;
  color: var(--text);
}

/* Run Detail - Quickstart Card */
.quickstart-card {
  background: linear-gradient(135deg, rgba(255, 107, 53, 0.08) 0%, rgba(255, 107, 53, 0.03) 100%);
  border-left: 4px solid var(--accent);
}

.quickstart-header {
  display: flex;
  gap: 18px;
  align-items: flex-start;
}

.quickstart-icon {
  font-size: 2.5rem;
  flex-shrink: 0;
  line-height: 1;
}

.quickstart-header h2 {
  margin: 0 0 8px 0;
  font-size: 1.5rem;
  color: var(--text);
}

/* Code Panel */
.code-panel {
  border: 2px solid var(--line);
  background: var(--paper);
}

.code-panel .panel-header {
  background: rgba(14, 95, 88, 0.03);
  border-bottom: 1px solid var(--line);
}

.code-panel .panel-header h3 {
  margin: 0;
  font-size: 1.1rem;
  font-weight: 600;
}

.code-hints {
  padding: 18px;
  background: rgba(255, 252, 246, 0.5);
  border-top: 1px solid var(--line);
  display: grid;
  gap: 12px;
}

.hint-item {
  display: flex;
  gap: 12px;
  align-items: flex-start;
  font-size: 0.95rem;
}

.hint-label {
  font-weight: 600;
  color: var(--accent);
  flex-shrink: 0;
}

.hint-text {
  color: var(--text);
}

.hint-text code {
  padding: 2px 6px;
  background: rgba(14, 95, 88, 0.1);
  border-radius: 4px;
  font-family: var(--mono);
  font-size: 0.9em;
  color: var(--accent);
}

.hint-text a {
  color: var(--accent);
  text-decoration: underline;
}

/* Waiting Panel */
.waiting-panel {
  background: var(--paper-alt);
  border: 1px dashed var(--line);
}

.waiting-state {
  text-align: center;
  padding: 60px 24px;
}

.waiting-icon {
  font-size: 3rem;
  margin-bottom: 16px;
  animation: pulse 2s ease-in-out infinite;
}

@keyframes pulse {
  0%, 100% { opacity: 1; }
  50% { opacity: 0.5; }
}

.waiting-state h3 {
  margin: 0 0 12px 0;
  font-size: 1.3rem;
  color: var(--text);
}

.waiting-meta {
  margin-top: 24px;
  display: flex;
  gap: 24px;
  justify-content: center;
  font-size: 0.9rem;
  color: var(--muted);
}

.waiting-meta code {
  padding: 2px 6px;
  background: rgba(14, 95, 88, 0.08);
  border-radius: 4px;
  font-family: var(--mono);
  color: var(--accent);
}

/* Status Badge Row */
.status-badge-row {
  display: flex;
  gap: 12px;
  align-items: center;
}

.status-pill {
  display: inline-flex;
  align-items: center;
  gap: 6px;
  padding: 6px 14px;
  border-radius: 20px;
  font-size: 0.9rem;
  font-weight: 600;
  border: 1px solid transparent;
}

.status-pill.pending {
  background: rgba(197, 117, 55, 0.1);
  color: var(--warning);
  border-color: rgba(197, 117, 55, 0.2);
}

.status-pill.running {
  background: rgba(66, 153, 225, 0.1);
  color: #4299e1;
  border-color: rgba(66, 153, 225, 0.2);
  animation: pulse-running 1.5s ease-in-out infinite;
}

@keyframes pulse-running {
  0%, 100% { opacity: 1; }
  50% { opacity: 0.7; }
}

.status-pill.success {
  background: rgba(14, 95, 88, 0.1);
  color: var(--accent);
  border-color: rgba(14, 95, 88, 0.2);
}

.secondary-button.small,
.primary-button.small {
  padding: 6px 12px;
  font-size: 0.85rem;
  min-height: auto;
}

/* Settings-page chrome buttons — match sibling .theme-toggle / .filter-tab on
 * the same page (neutral white-glass pill), not the global amber-ghost
 * .secondary-button used elsewhere on the site. Settings rows host chrome
 * controls (toggles / selectors / manage links), not primary CTAs — design
 * system §2.1b: utility pages step back, content reads first. Scope is locked
 * to .settings-row-actions so action CTAs in run_detail / etc. stay amber
 * ghost. */
.settings-row-actions .secondary-button.small {
  background:
    linear-gradient(135deg,
      rgba(255,255,255,.06) 0%,
      rgba(255,255,255,.02) 50%,
      rgba(255,255,255,.05) 100%);
  backdrop-filter: blur(12px);
  -webkit-backdrop-filter: blur(12px);
  border: 1px solid rgba(255,255,255,.10);
  border-top-color: rgba(255,255,255,.16);
  color: var(--text-secondary);
  border-radius: 999px;
  font-weight: 500;
  box-shadow: inset 0 1px 0 rgba(255,255,255,.04);
}
.settings-row-actions .secondary-button.small:hover {
  background:
    linear-gradient(135deg,
      rgba(255,255,255,.10) 0%,
      rgba(255,255,255,.04) 50%,
      rgba(255,255,255,.08) 100%);
  border-color: rgba(255,255,255,.18);
  color: var(--text-primary);
  transform: translateY(-1px);
}

@media (max-width: 960px) {
  .faceted-modal-layout {
    grid-template-columns: 1fr;
    grid-template-rows: auto auto 1fr;
  }

  .two-column-modal-layout {
    grid-template-columns: 1fr;
    grid-template-rows: auto 1fr;
  }

  .filter-sidebar {
    border-right: 0;
    border-bottom: 1px solid var(--line);
    padding-right: 0;
    padding-bottom: 24px;
    max-height: 240px;
  }

  .code-preview-panel {
    border-left: 0;
    border-top: 1px solid var(--line);
    padding-left: 0;
    padding-top: 24px;
    max-height: 400px;
  }
}

/* ═══════════════════════════════════════════════
   Replay Viewer — Split Panel Step Replay
   ═══════════════════════════════════════════════ */

.replay-section {
  padding: 0;
  overflow: hidden;
}

/* ── Task Banner (top) ── */
.replay-task-banner {
  padding: 24px 28px;
  border-bottom: 1px solid var(--border);
  background: linear-gradient(180deg, var(--surface) 0%, transparent 100%);
}
.replay-task-head {
  display: flex;
  align-items: center;
  gap: 10px;
  margin-bottom: 8px;
  flex-wrap: wrap;
}
.replay-task-chip {
  font-family: var(--mono);
  font-size: .64rem;
  font-weight: 700;
  letter-spacing: .08em;
  color: var(--accent);
  background: var(--accent-bg);
  border: 1px solid var(--accent-border);
  padding: 3px 8px;
  border-radius: 4px;
}
.replay-task-title {
  margin: 0;
  font-size: 1.1rem;
  font-weight: 600;
  letter-spacing: -.02em;
  color: var(--text);
}
.replay-scene-tag {
  font-size: .72rem;
  color: var(--text-2);
  background: var(--surface);
  border: 1px solid var(--border);
  padding: 3px 10px;
  border-radius: 999px;
}
.replay-task-desc {
  margin: 0 0 14px 0;
  font-size: .84rem;
  line-height: 1.55;
  color: var(--text-2);
  max-width: 780px;
}
.replay-task-stats {
  display: flex;
  align-items: center;
  gap: 28px;
  flex-wrap: wrap;
}
.replay-stat {
  display: flex;
  flex-direction: column;
  gap: 3px;
  min-width: 0;
}
.replay-stat-label {
  font-size: .68rem;
  font-family: var(--mono);
  letter-spacing: .04em;
  text-transform: uppercase;
  color: var(--text-3);
}
.replay-stat-value {
  font-size: .88rem;
  font-weight: 600;
  color: var(--text);
  letter-spacing: -.01em;
}
.replay-stat-model .replay-stat-value {
  font-weight: 500;
  font-size: .82rem;
  color: var(--text-2);
  max-width: 280px;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}

/* ── Split layout ── */
.replay-split {
  display: grid;
  grid-template-columns: 320px 1fr;
  min-height: 560px;
}

/* ── Sidebar ── */
.replay-sidebar {
  display: flex;
  flex-direction: column;
  border-right: 1px solid var(--border);
  background: var(--surface);
  max-height: 720px;
}
.replay-sidebar-head {
  display: flex;
  align-items: center;
  justify-content: space-between;
  padding: 14px 18px;
  border-bottom: 1px solid var(--border);
  flex-shrink: 0;
}
.replay-sidebar-title {
  font-size: .78rem;
  font-weight: 600;
  color: var(--text);
  letter-spacing: -.01em;
}
.replay-sidebar-counter {
  font-family: var(--mono);
  font-size: .7rem;
  color: var(--accent);
  background: var(--accent-bg);
  border: 1px solid var(--accent-border);
  padding: 2px 9px;
  border-radius: 999px;
  font-weight: 600;
}

/* ── Steps Timeline ── */
.replay-steps {
  list-style: none;
  margin: 0;
  padding: 8px 0;
  flex: 1;
  overflow-y: auto;
  scroll-behavior: smooth;
}
.replay-steps::-webkit-scrollbar { width: 6px; }
.replay-steps::-webkit-scrollbar-track { background: transparent; }
.replay-steps::-webkit-scrollbar-thumb { background: var(--border-strong); border-radius: 3px; }

.replay-step {
  position: relative;
  padding: 0 6px;
}
.replay-step.has-line::before {
  content: "";
  position: absolute;
  left: 28px;
  top: 40px;
  bottom: -2px;
  width: 1.5px;
  background: var(--border);
  z-index: 0;
}
.replay-step.has-line:has(.replay-step-btn.active)::before {
  background: linear-gradient(180deg, var(--accent) 0%, var(--border) 100%);
}

.replay-step-btn {
  position: relative;
  display: flex;
  align-items: flex-start;
  gap: 12px;
  width: 100%;
  padding: 10px 12px;
  border: 1px solid transparent;
  border-radius: 8px;
  background: transparent;
  cursor: pointer;
  text-align: left;
  transition: all .15s cubic-bezier(.32,.72,0,1);
  z-index: 1;
}
.replay-step-btn:hover {
  background: var(--bg-raised);
  border-color: var(--border);
}
.replay-step-btn.active {
  background: var(--accent-bg);
  border-color: var(--accent-border);
}

.replay-step-marker {
  position: relative;
  flex-shrink: 0;
  width: 22px;
  height: 22px;
  display: grid;
  place-items: center;
  border-radius: 50%;
  background: var(--bg-raised);
  border: 1.5px solid var(--border-strong);
  margin-top: 1px;
  transition: all .2s cubic-bezier(.32,.72,0,1);
}
.replay-step-btn.active .replay-step-marker {
  background: var(--accent);
  border-color: var(--accent);
  box-shadow: 0 0 0 3px var(--accent-bg);
}
.replay-step-dot { display: none; }
.replay-step-num {
  font-family: var(--mono);
  font-size: .65rem;
  font-weight: 700;
  color: var(--text-3);
  line-height: 1;
}
.replay-step-btn.active .replay-step-num { color: #fff; }

/* Init pseudo-step: env reset placeholder, not a real action step. */
.replay-step-init .replay-step-marker {
  border-style: dashed;
  background: transparent;
}
.replay-step-init .replay-step-num {
  font-size: .58rem;
  letter-spacing: .02em;
}
.replay-step-init .replay-step-action { color: var(--text-2); font-style: italic; }

.replay-step-body {
  flex: 1;
  min-width: 0;
  display: flex;
  flex-direction: column;
  gap: 3px;
}
.replay-step-action {
  font-size: .8rem;
  font-weight: 500;
  color: var(--text);
  line-height: 1.4;
  letter-spacing: -.01em;
  display: -webkit-box;
  -webkit-line-clamp: 2;
  -webkit-box-orient: vertical;
  overflow: hidden;
  word-break: break-word;
}
.replay-step-btn.active .replay-step-action {
  color: var(--text);
  font-weight: 600;
}
.replay-step-meta {
  display: flex;
  align-items: center;
  gap: 10px;
  font-size: .68rem;
  font-family: var(--mono);
  color: var(--text-3);
}
.replay-step-delta {
  color: var(--success);
  font-weight: 600;
}
.replay-step-ts { opacity: .7; }

/* ── Sidebar Footer (play controls) ── */
.replay-sidebar-foot {
  display: flex;
  align-items: center;
  gap: 10px;
  padding: 12px 14px;
  border-top: 1px solid var(--border);
  background: var(--bg-raised);
  flex-shrink: 0;
}
.replay-play-btn {
  display: inline-flex;
  align-items: center;
  gap: 6px;
  padding: 6px 12px;
  border-radius: 6px;
  border: 1px solid var(--border);
  background: var(--surface);
  color: var(--text-2);
  font-size: .72rem;
  font-weight: 500;
  font-family: var(--font);
  cursor: pointer;
  transition: all .15s cubic-bezier(.32,.72,0,1);
  flex-shrink: 0;
}
.replay-play-btn:hover {
  background: var(--surface-hover);
  border-color: var(--border-hover);
  color: var(--text);
}
.replay-play-btn:active { transform: scale(.97); }
.replay-play-btn.playing {
  border-color: var(--accent-border);
  background: var(--accent-bg);
  color: var(--accent);
}
.replay-play-btn.playing .play-icon { display: none; }
.replay-play-btn.playing .pause-icon { display: inline; }

.replay-progress {
  flex: 1;
  height: 3px;
  background: var(--border);
  border-radius: 2px;
  overflow: hidden;
}
.replay-progress-fill {
  height: 100%;
  background: linear-gradient(90deg, var(--accent), rgba(120,180,255,.6));
  border-radius: 2px;
  width: 0%;
  transition: width .35s cubic-bezier(.32,.72,0,1);
}
[data-theme="light"] .replay-progress-fill {
  background: linear-gradient(90deg, var(--accent), rgba(37,99,235,.5));
}

/* ── Main area (right) ── */
.replay-main {
  display: flex;
  flex-direction: column;
  padding: 24px;
  gap: 16px;
  min-width: 0;
}

/* ── Stage ── */
.replay-stage {
  position: relative;
  flex: 1;
  display: flex;
  align-items: center;
  justify-content: center;
  min-height: 420px;
  padding: 12px;
}
/* ══════════════════════════════════════════════════════════════════════════
   Sandbox shells — three platforms share `.filmstrip-canvas.replay-canvas`,
   the actual chrome is selected by [data-platform="android|windows|web"].
   ══════════════════════════════════════════════════════════════════════════ */

/* ── Shared base ── */
.filmstrip-canvas.replay-canvas {
  position: relative;
  display: flex;
  flex-direction: column;
  width: 100%;
  transition: box-shadow .3s cubic-bezier(.32,.72,0,1), transform .3s cubic-bezier(.32,.72,0,1);
  cursor: pointer;
}
.replay-stage:hover .filmstrip-canvas.replay-canvas {
  transform: translateY(-2px);
}

/* By default hide all chrome — each platform un-hides the one it needs */
.filmstrip-canvas.replay-canvas .replay-chrome { display: none; }

/* The screen always fills the remaining space below any chrome */
.replay-screen {
  position: relative;
  flex: 1;
  min-height: 0;
  width: 100%;
  overflow: hidden;
  background: #000;
}

/* ══════════════════════════════════════════════════════════════════════════
   Android phone — brushed-metal frame, lens punch-hole, side hardware
   ══════════════════════════════════════════════════════════════════════════ */
.filmstrip-canvas.replay-canvas:is([data-platform="android"], [data-platform="web-mobile"]) {
  /* Canvas height = padding + chrome (if any) + screen.
     Screen carries the aspect-ratio so the screenshot fills it exactly. */
  width: 100%;
  max-width: 270px;
  padding: 8px 7px 10px;
  border-radius: 12px;
  /* Polished aluminum: warm-cool double diagonal sweep */
  background:
    linear-gradient(135deg,
      #e6e9ee 0%,
      #c4c8cf 18%,
      #d8dce2 32%,
      #9ca0a7 52%,
      #babec4 70%,
      #7e8289 86%,
      #aaadb3 100%);
  box-shadow:
    /* outer rim glint */
    inset 0 0 0 1px rgba(255,255,255,.55),
    inset 0 1px 0 rgba(255,255,255,.85),
    inset 0 -1px 0 rgba(0,0,0,.18),
    /* sharp seam */
    0 0 0 1px rgba(0,0,0,.45),
    /* layered drop shadow */
    0 4px 12px rgba(0,0,0,.18),
    0 18px 40px rgba(0,0,0,.32),
    0 36px 72px rgba(0,0,0,.22);
}
.replay-stage:hover .filmstrip-canvas.replay-canvas:is([data-platform="android"], [data-platform="web-mobile"]) {
  box-shadow:
    inset 0 0 0 1px rgba(255,255,255,.6),
    inset 0 1px 0 rgba(255,255,255,.92),
    inset 0 -1px 0 rgba(0,0,0,.18),
    0 0 0 1px rgba(0,0,0,.45),
    0 6px 16px rgba(0,0,0,.2),
    0 26px 56px rgba(0,0,0,.36),
    0 44px 84px rgba(0,0,0,.24);
}
/* Slim gesture pill (Android 10+ navigation) */
.filmstrip-canvas.replay-canvas:is([data-platform="android"], [data-platform="web-mobile"])::after {
  content: '';
  position: absolute;
  bottom: 6px;
  left: 50%;
  transform: translateX(-50%);
  width: 96px;
  height: 3.5px;
  border-radius: 2px;
  background: linear-gradient(180deg, rgba(255,255,255,.92), rgba(220,224,230,.7));
  box-shadow:
    inset 0 .5px 0 rgba(255,255,255,.95),
    0 1px 2px rgba(0,0,0,.3);
  z-index: 5;
  pointer-events: none;
}
.filmstrip-canvas.replay-canvas:is([data-platform="android"], [data-platform="web-mobile"]) .replay-screen {
  aspect-ratio: 9 / 20;
  flex: none;
  border-radius: 0;
  box-shadow:
    /* inner black bezel separates screen from silver frame */
    0 0 0 2px #050608,
    inset 0 0 0 .5px rgba(255,255,255,.06);
}
/* Side hardware: volume rocker (up + down) and power, on the right edge */
.filmstrip-canvas.replay-canvas:is([data-platform="android"], [data-platform="web-mobile"]) .android-chrome {
  display: block;
  position: absolute;
  inset: 0;
  pointer-events: none;
  z-index: 2;
}
.filmstrip-canvas.replay-canvas:is([data-platform="android"], [data-platform="web-mobile"]) .android-vol-up,
.filmstrip-canvas.replay-canvas:is([data-platform="android"], [data-platform="web-mobile"]) .android-vol-down,
.filmstrip-canvas.replay-canvas:is([data-platform="android"], [data-platform="web-mobile"]) .android-power {
  position: absolute;
  right: -1.5px;
  width: 3px;
  border-radius: 1.5px 0 0 1.5px;
  background: linear-gradient(90deg,
    rgba(0,0,0,.45) 0%,
    rgba(50,55,62,.85) 40%,
    rgba(110,116,124,.95) 100%);
  box-shadow:
    inset -.5px 0 0 rgba(255,255,255,.25),
    inset .5px 0 0 rgba(0,0,0,.5);
}
.filmstrip-canvas.replay-canvas:is([data-platform="android"], [data-platform="web-mobile"]) .android-vol-up   { top: 22%; height: 36px; }
.filmstrip-canvas.replay-canvas:is([data-platform="android"], [data-platform="web-mobile"]) .android-vol-down { top: 30%; height: 36px; }
.filmstrip-canvas.replay-canvas:is([data-platform="android"], [data-platform="web-mobile"]) .android-power    { top: 40%; height: 50px; }
/* Side hardware: stronger contrast on the silver frame */
.filmstrip-canvas.replay-canvas:is([data-platform="android"], [data-platform="web-mobile"]) .android-vol-up,
.filmstrip-canvas.replay-canvas:is([data-platform="android"], [data-platform="web-mobile"]) .android-vol-down,
.filmstrip-canvas.replay-canvas:is([data-platform="android"], [data-platform="web-mobile"]) .android-power {
  width: 4px;
  background: linear-gradient(90deg,
    rgba(0,0,0,.55) 0%,
    rgba(38,42,48,.95) 35%,
    rgba(85,90,97,1) 75%,
    rgba(140,144,150,1) 100%);
  box-shadow:
    inset -.5px 0 0 rgba(255,255,255,.35),
    inset .5px 0 0 rgba(0,0,0,.6),
    -.5px 0 1px rgba(0,0,0,.45);
}

/* Android in-screen status bar (time + signal/wifi/battery) */
.replay-screen .android-statusbar { display: none; }
.replay-screen .android-glare { display: none; }
/* Soft glass glare on the screen — top-right diagonal sheen */
.filmstrip-canvas.replay-canvas:is([data-platform="android"], [data-platform="web-mobile"]) .android-glare {
  display: block;
  position: absolute;
  inset: 0;
  pointer-events: none;
  z-index: 3;
  background:
    linear-gradient(135deg,
      rgba(255,255,255,.05) 0%,
      rgba(255,255,255,0) 32%,
      rgba(255,255,255,0) 68%,
      rgba(255,255,255,.025) 100%);
  mix-blend-mode: screen;
}

/* ══════════════════════════════════════════════════════════════════════════
   Android-only overrides — match real Android emulator capture (1080×2400 = 9/20)
   so the screenshot fits the screen with no top/bottom crop.
   web-mobile keeps the shared 9/19.5 layout above.
   ══════════════════════════════════════════════════════════════════════════ */

/* ══════════════════════════════════════════════════════════════════════════
   Web-mobile only — mobile browser address bar (sits at the very top of the
   screen). Phone outer shell is shared with Android.
   ══════════════════════════════════════════════════════════════════════════ */
.filmstrip-canvas .mweb-bar { display: none; }
.filmstrip-canvas.replay-canvas[data-platform="web-mobile"] .mweb-bar {
  display: flex;
  align-items: center;
  gap: 6px;
  flex: none;
  height: 36px;
  padding: 0 8px;
  background: linear-gradient(180deg, #f7f7f8 0%, #ececee 100%);
  border-bottom: 1px solid rgba(0,0,0,.08);
  font-family: -apple-system, "SF Pro Text", "Segoe UI", system-ui, sans-serif;
  color: rgba(0,0,0,.78);
  font-size: 11px;
}
.filmstrip-canvas.replay-canvas[data-platform="web-mobile"] .mweb-back,
.filmstrip-canvas.replay-canvas[data-platform="web-mobile"] .mweb-menu {
  width: 26px;
  height: 26px;
  border-radius: 6px;
  display: flex;
  align-items: center;
  justify-content: center;
  color: rgba(0,0,0,.7);
  flex-shrink: 0;
}
.filmstrip-canvas.replay-canvas[data-platform="web-mobile"] .mweb-url {
  flex: 1;
  display: flex;
  align-items: center;
  gap: 6px;
  height: 28px;
  padding: 0 10px;
  border-radius: 8px;
  background: rgba(0,0,0,.06);
  min-width: 0;
}
.filmstrip-canvas.replay-canvas[data-platform="web-mobile"] .mweb-lock {
  color: rgba(0,0,0,.5);
  flex-shrink: 0;
}
.filmstrip-canvas.replay-canvas[data-platform="web-mobile"] .mweb-domain {
  flex: 1;
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
  font-size: 11.5px;
  color: rgba(0,0,0,.78);
  font-feature-settings: "tnum";
  text-align: center;
}
.filmstrip-canvas.replay-canvas[data-platform="web-mobile"] .mweb-reload {
  color: rgba(0,0,0,.55);
  flex-shrink: 0;
}

/* ══════════════════════════════════════════════════════════════════════════
   Large-screen base (windows + web 共享尺寸/阴影)
   ══════════════════════════════════════════════════════════════════════════ */
.filmstrip-canvas.replay-canvas[data-platform="windows"],
.filmstrip-canvas.replay-canvas[data-platform="web-desktop"] {
  /* Canvas height = chrome + screen. Screen is the 16:9 capture. */
  width: 100%;
  max-width: 820px;
  border-radius: 11px;
  overflow: hidden;
  box-shadow:
    inset 0 0 0 .5px rgba(255,255,255,.06),
    0 0 0 1px rgba(0,0,0,.55),
    0 4px 14px rgba(0,0,0,.22),
    0 18px 44px rgba(0,0,0,.32),
    0 36px 80px rgba(0,0,0,.26);
}
.replay-stage:hover .filmstrip-canvas.replay-canvas[data-platform="windows"],
.replay-stage:hover .filmstrip-canvas.replay-canvas[data-platform="web-desktop"] {
  box-shadow:
    inset 0 0 0 .5px rgba(255,255,255,.08),
    0 0 0 1px rgba(0,0,0,.55),
    0 6px 18px rgba(0,0,0,.24),
    0 26px 60px rgba(0,0,0,.36),
    0 44px 92px rgba(0,0,0,.28);
}

/* ══════════════════════════════════════════════════════════════════════════
   Windows 11 window chrome — Mica title bar + app icon
   ══════════════════════════════════════════════════════════════════════════ */
.filmstrip-canvas.replay-canvas[data-platform="windows"] {
  background: #1c1c1c;
}
.filmstrip-canvas.replay-canvas[data-platform="windows"] .win-chrome {
  display: flex;
  flex-direction: column;
  font-family: "Segoe UI Variable", "Segoe UI", system-ui, -apple-system, sans-serif;
  flex-shrink: 0;
  position: relative;
}
.filmstrip-canvas.replay-canvas[data-platform="windows"] .win-chrome::before {
  /* highlight along the very top edge */
  content: '';
  position: absolute;
  top: 0; left: 0; right: 0;
  height: 1px;
  background: linear-gradient(90deg, transparent, rgba(255,255,255,.08) 50%, transparent);
  pointer-events: none;
  z-index: 2;
}
.filmstrip-canvas.replay-canvas[data-platform="windows"] .win-titlebar {
  display: flex;
  align-items: center;
  height: 36px;
  padding-left: 12px;
  /* Mica-like subtle vertical gradient */
  background: linear-gradient(180deg,
    rgba(255,255,255,.04) 0%,
    rgba(255,255,255,0) 60%),
    #2a2a2a;
  border-bottom: 1px solid rgba(255,255,255,.06);
}
.filmstrip-canvas.replay-canvas[data-platform="windows"] .win-toolbar {
  display: flex;
  align-items: center;
  height: 38px;
  padding: 0 10px;
  gap: 2px;
  background: #252525;
  border-bottom: 1px solid rgba(255,255,255,.05);
  color: rgba(255,255,255,.85);
}
.filmstrip-canvas.replay-canvas[data-platform="windows"] .win-tool-btn {
  width: 32px;
  height: 28px;
  display: flex;
  align-items: center;
  justify-content: center;
  border-radius: 4px;
  color: rgba(255,255,255,.78);
  transition: background .12s ease;
}
.filmstrip-canvas.replay-canvas[data-platform="windows"] .win-tool-btn:hover {
  background: rgba(255,255,255,.06);
  color: rgba(255,255,255,.95);
}
.filmstrip-canvas.replay-canvas[data-platform="windows"] .win-tool-divider {
  width: 1px;
  height: 18px;
  background: rgba(255,255,255,.08);
  margin: 0 6px;
}
.filmstrip-canvas.replay-canvas[data-platform="windows"] .win-tool-search {
  flex: 1;
  display: flex;
  align-items: center;
  gap: 7px;
  height: 28px;
  padding: 0 10px;
  margin-left: 6px;
  border-radius: 4px;
  background: #1a1a1a;
  border: 1px solid rgba(255,255,255,.06);
  color: rgba(255,255,255,.5);
  font-size: 11.5px;
  min-width: 0;
}
.filmstrip-canvas.replay-canvas[data-platform="windows"] .win-tool-search-text {
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
}
.filmstrip-canvas.replay-canvas[data-platform="windows"] .win-app-icon {
  width: 16px;
  height: 16px;
  border-radius: 3px;
  margin-right: 10px;
  background:
    linear-gradient(135deg, #4a90e2 0%, #7b61ff 60%, #c160ff 100%);
  box-shadow:
    inset 0 0 0 .5px rgba(255,255,255,.4),
    inset 0 1px 0 rgba(255,255,255,.4),
    0 1px 2px rgba(0,0,0,.3);
  flex-shrink: 0;
}
.filmstrip-canvas.replay-canvas[data-platform="windows"] .win-title {
  flex: 1;
  font-size: 12px;
  color: rgba(255,255,255,.78);
  letter-spacing: 0;
  font-weight: 400;
  user-select: none;
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
}
.filmstrip-canvas.replay-canvas[data-platform="windows"] .win-controls {
  display: flex;
  height: 100%;
  margin-left: 8px;
}
.filmstrip-canvas.replay-canvas[data-platform="windows"] .win-control {
  width: 46px;
  height: 100%;
  display: flex;
  align-items: center;
  justify-content: center;
  color: rgba(255,255,255,.78);
  transition: background .12s ease;
}
.filmstrip-canvas.replay-canvas[data-platform="windows"] .win-control:hover {
  background: rgba(255,255,255,.06);
}
.filmstrip-canvas.replay-canvas[data-platform="windows"] .win-control.win-close:hover {
  background: #c42b1c;
  color: #fff;
}
.filmstrip-canvas.replay-canvas[data-platform="windows"] .replay-screen {
  aspect-ratio: 16 / 9;
  flex: none;
  border-radius: 0;
  background: #1a1a1a;
}

/* Light theme override (Win 11 light mode) */
[data-theme="light"] .filmstrip-canvas.replay-canvas[data-platform="windows"] {
  background: #f3f3f3;
}
[data-theme="light"] .filmstrip-canvas.replay-canvas[data-platform="windows"] .win-titlebar {
  background: linear-gradient(180deg,
    rgba(255,255,255,.6) 0%,
    rgba(255,255,255,0) 70%),
    #f3f3f3;
  border-bottom-color: rgba(0,0,0,.08);
}
[data-theme="light"] .filmstrip-canvas.replay-canvas[data-platform="windows"] .win-chrome::before {
  background: linear-gradient(90deg, transparent, rgba(0,0,0,.05) 50%, transparent);
}
[data-theme="light"] .filmstrip-canvas.replay-canvas[data-platform="windows"] .win-title {
  color: rgba(0,0,0,.78);
}
[data-theme="light"] .filmstrip-canvas.replay-canvas[data-platform="windows"] .win-control {
  color: rgba(0,0,0,.7);
}
[data-theme="light"] .filmstrip-canvas.replay-canvas[data-platform="windows"] .win-control:hover {
  background: rgba(0,0,0,.05);
}
[data-theme="light"] .filmstrip-canvas.replay-canvas[data-platform="windows"] .win-toolbar {
  background: #fafafa;
  border-bottom-color: rgba(0,0,0,.08);
  color: rgba(0,0,0,.78);
}
[data-theme="light"] .filmstrip-canvas.replay-canvas[data-platform="windows"] .win-tool-btn {
  color: rgba(0,0,0,.7);
}
[data-theme="light"] .filmstrip-canvas.replay-canvas[data-platform="windows"] .win-tool-btn:hover {
  background: rgba(0,0,0,.05);
  color: rgba(0,0,0,.95);
}
[data-theme="light"] .filmstrip-canvas.replay-canvas[data-platform="windows"] .win-tool-divider {
  background: rgba(0,0,0,.08);
}
[data-theme="light"] .filmstrip-canvas.replay-canvas[data-platform="windows"] .win-tool-search {
  background: #fff;
  border-color: rgba(0,0,0,.08);
  color: rgba(0,0,0,.5);
}
[data-theme="light"] .filmstrip-canvas.replay-canvas[data-platform="windows"] .replay-screen {
  background: #fff;
}

/* ══════════════════════════════════════════════════════════════════════════
   Web browser chrome — Chrome-style tabs (curved bottom on active) +
   URL bar with right-side actions (downloads / overflow / profile)
   ══════════════════════════════════════════════════════════════════════════ */
.filmstrip-canvas.replay-canvas[data-platform="web-desktop"] {
  background: #1f1f1f;
}
.filmstrip-canvas.replay-canvas[data-platform="web-desktop"] .web-chrome {
  display: flex;
  flex-direction: column;
  flex-shrink: 0;
  font-family: -apple-system, "Segoe UI", system-ui, sans-serif;
}
.filmstrip-canvas.replay-canvas[data-platform="web-desktop"] .web-chrome-row {
  display: flex;
  align-items: center;
}
.filmstrip-canvas.replay-canvas[data-platform="web-desktop"] .web-chrome-tabs-row {
  height: 38px;
  padding: 0 12px;
  gap: 12px;
  background: #2f2f2f;
  position: relative;
}
.filmstrip-canvas.replay-canvas[data-platform="web-desktop"] .web-traffic {
  display: flex;
  align-items: center;
  gap: 7px;
  flex-shrink: 0;
  padding-right: 4px;
}
.filmstrip-canvas.replay-canvas[data-platform="web-desktop"] .web-dot {
  width: 11px;
  height: 11px;
  border-radius: 50%;
  display: inline-block;
  box-shadow:
    inset 0 0 0 .5px rgba(0,0,0,.15),
    inset 0 1px 0 rgba(255,255,255,.2);
}
.filmstrip-canvas.replay-canvas[data-platform="web-desktop"] .web-dot-close { background: #ff5f57; }
.filmstrip-canvas.replay-canvas[data-platform="web-desktop"] .web-dot-min   { background: #febc2e; }
.filmstrip-canvas.replay-canvas[data-platform="web-desktop"] .web-dot-max   { background: #28c840; }
.filmstrip-canvas.replay-canvas[data-platform="web-desktop"] .web-tabs {
  display: flex;
  align-items: flex-end;
  height: 100%;
  flex: 1;
  min-width: 0;
  gap: 4px;
}
.filmstrip-canvas.replay-canvas[data-platform="web-desktop"] .web-tab {
  display: flex;
  align-items: center;
  gap: 8px;
  height: 30px;
  padding: 0 12px 0 13px;
  border-radius: 9px 9px 0 0;
  font-size: 11.5px;
  color: rgba(255,255,255,.92);
  max-width: 220px;
  min-width: 0;
  position: relative;
}
.filmstrip-canvas.replay-canvas[data-platform="web-desktop"] .web-tab.web-tab-active {
  background: #1f1f1f;
  box-shadow:
    inset 0 1px 0 rgba(255,255,255,.05),
    inset 1px 0 0 rgba(255,255,255,.04),
    inset -1px 0 0 rgba(255,255,255,.04);
}
/* Chrome-style curved tab corners that flow into the URL row */
.filmstrip-canvas.replay-canvas[data-platform="web-desktop"] .web-tab.web-tab-active::before,
.filmstrip-canvas.replay-canvas[data-platform="web-desktop"] .web-tab.web-tab-active::after {
  content: '';
  position: absolute;
  bottom: 0;
  width: 8px;
  height: 8px;
  background: #1f1f1f;
  pointer-events: none;
}
.filmstrip-canvas.replay-canvas[data-platform="web-desktop"] .web-tab.web-tab-active::before {
  left: -8px;
  border-bottom-right-radius: 8px;
  box-shadow: 2px 2px 0 #1f1f1f;
}
.filmstrip-canvas.replay-canvas[data-platform="web-desktop"] .web-tab.web-tab-active::after {
  right: -8px;
  border-bottom-left-radius: 8px;
  box-shadow: -2px 2px 0 #1f1f1f;
}
.filmstrip-canvas.replay-canvas[data-platform="web-desktop"] .web-tab-favicon {
  width: 14px;
  height: 14px;
  border-radius: 3px;
  background: linear-gradient(135deg, #4a90e2 0%, #7b61ff 60%, #c160ff 100%);
  box-shadow:
    inset 0 0 0 .5px rgba(255,255,255,.4),
    inset 0 1px 0 rgba(255,255,255,.4);
  flex-shrink: 0;
}
.filmstrip-canvas.replay-canvas[data-platform="web-desktop"] .web-tab-title {
  font-size: 11.5px;
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
  letter-spacing: 0;
  flex: 1;
  min-width: 0;
}
.filmstrip-canvas.replay-canvas[data-platform="web-desktop"] .web-tab-close {
  width: 16px;
  height: 16px;
  border-radius: 50%;
  display: flex;
  align-items: center;
  justify-content: center;
  color: rgba(255,255,255,.55);
  flex-shrink: 0;
}
.filmstrip-canvas.replay-canvas[data-platform="web-desktop"] .web-tab-close:hover {
  background: rgba(255,255,255,.1);
  color: rgba(255,255,255,.9);
}
.filmstrip-canvas.replay-canvas[data-platform="web-desktop"] .web-tab-new {
  width: 26px;
  height: 26px;
  border-radius: 50%;
  display: flex;
  align-items: center;
  justify-content: center;
  color: rgba(255,255,255,.55);
  flex-shrink: 0;
}
.filmstrip-canvas.replay-canvas[data-platform="web-desktop"] .web-tab-new:hover {
  background: rgba(255,255,255,.06);
  color: rgba(255,255,255,.85);
}
.filmstrip-canvas.replay-canvas[data-platform="web-desktop"] .web-chrome-url-row {
  height: 40px;
  padding: 0 12px;
  gap: 10px;
  background: #1f1f1f;
}
.filmstrip-canvas.replay-canvas[data-platform="web-desktop"] .web-nav-buttons {
  display: flex;
  align-items: center;
  gap: 4px;
  color: rgba(255,255,255,.65);
  flex-shrink: 0;
}
.filmstrip-canvas.replay-canvas[data-platform="web-desktop"] .web-nav-buttons svg {
  width: 28px;
  height: 28px;
  padding: 8px;
  border-radius: 50%;
  box-sizing: border-box;
}
.filmstrip-canvas.replay-canvas[data-platform="web-desktop"] .web-nav-buttons svg:hover {
  background: rgba(255,255,255,.06);
  color: rgba(255,255,255,.95);
}
.filmstrip-canvas.replay-canvas[data-platform="web-desktop"] .web-url-bar {
  flex: 1;
  display: flex;
  align-items: center;
  gap: 9px;
  height: 28px;
  padding: 0 14px;
  border-radius: 14px;
  background: #313131;
  color: rgba(255,255,255,.85);
  font-size: 12px;
  min-width: 0;
  box-shadow: inset 0 0 0 .5px rgba(255,255,255,.04);
}
.filmstrip-canvas.replay-canvas[data-platform="web-desktop"] .web-url-text {
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
  letter-spacing: 0;
  font-feature-settings: "tnum";
}
.filmstrip-canvas.replay-canvas[data-platform="web-desktop"] .web-actions {
  display: flex;
  align-items: center;
  gap: 4px;
  flex-shrink: 0;
}
.filmstrip-canvas.replay-canvas[data-platform="web-desktop"] .web-action-btn {
  width: 28px;
  height: 28px;
  border-radius: 50%;
  display: flex;
  align-items: center;
  justify-content: center;
  color: rgba(255,255,255,.65);
}
.filmstrip-canvas.replay-canvas[data-platform="web-desktop"] .web-action-btn:hover {
  background: rgba(255,255,255,.06);
  color: rgba(255,255,255,.95);
}
.filmstrip-canvas.replay-canvas[data-platform="web-desktop"] .web-profile {
  width: 24px;
  height: 24px;
  margin-left: 4px;
  border-radius: 50%;
  display: flex;
  align-items: center;
  justify-content: center;
  font-size: 11px;
  font-weight: 600;
  color: #fff;
  background: linear-gradient(135deg, #5b8def 0%, #8a6dff 100%);
  box-shadow:
    inset 0 0 0 .5px rgba(255,255,255,.25),
    inset 0 1px 0 rgba(255,255,255,.25);
}
.filmstrip-canvas.replay-canvas[data-platform="web-desktop"] .replay-screen {
  aspect-ratio: 16 / 9;
  flex: none;
  border-radius: 0;
  background: #fff;
}


/* Light theme — Chrome light mode */
[data-theme="light"] .filmstrip-canvas.replay-canvas[data-platform="web-desktop"] {
  background: #ffffff;
}
[data-theme="light"] .filmstrip-canvas.replay-canvas[data-platform="web-desktop"] .web-chrome-tabs-row {
  background: #dee1e6;
}
[data-theme="light"] .filmstrip-canvas.replay-canvas[data-platform="web-desktop"] .web-tab {
  color: rgba(0,0,0,.82);
}
[data-theme="light"] .filmstrip-canvas.replay-canvas[data-platform="web-desktop"] .web-tab.web-tab-active {
  background: #ffffff;
  box-shadow: inset 0 1px 0 rgba(255,255,255,.6);
}
[data-theme="light"] .filmstrip-canvas.replay-canvas[data-platform="web-desktop"] .web-tab.web-tab-active::before,
[data-theme="light"] .filmstrip-canvas.replay-canvas[data-platform="web-desktop"] .web-tab.web-tab-active::after {
  background: #ffffff;
}
[data-theme="light"] .filmstrip-canvas.replay-canvas[data-platform="web-desktop"] .web-tab.web-tab-active::before {
  box-shadow: 2px 2px 0 #ffffff;
}
[data-theme="light"] .filmstrip-canvas.replay-canvas[data-platform="web-desktop"] .web-tab.web-tab-active::after {
  box-shadow: -2px 2px 0 #ffffff;
}
[data-theme="light"] .filmstrip-canvas.replay-canvas[data-platform="web-desktop"] .web-tab-close {
  color: rgba(0,0,0,.5);
}
[data-theme="light"] .filmstrip-canvas.replay-canvas[data-platform="web-desktop"] .web-tab-close:hover {
  background: rgba(0,0,0,.08);
  color: rgba(0,0,0,.85);
}
[data-theme="light"] .filmstrip-canvas.replay-canvas[data-platform="web-desktop"] .web-tab-new {
  color: rgba(0,0,0,.5);
}
[data-theme="light"] .filmstrip-canvas.replay-canvas[data-platform="web-desktop"] .web-tab-new:hover {
  background: rgba(0,0,0,.06);
  color: rgba(0,0,0,.85);
}
[data-theme="light"] .filmstrip-canvas.replay-canvas[data-platform="web-desktop"] .web-chrome-url-row {
  background: #ffffff;
}
[data-theme="light"] .filmstrip-canvas.replay-canvas[data-platform="web-desktop"] .web-nav-buttons {
  color: rgba(0,0,0,.6);
}
[data-theme="light"] .filmstrip-canvas.replay-canvas[data-platform="web-desktop"] .web-nav-buttons svg:hover {
  background: rgba(0,0,0,.06);
  color: rgba(0,0,0,.9);
}
[data-theme="light"] .filmstrip-canvas.replay-canvas[data-platform="web-desktop"] .web-url-bar {
  background: #f1f3f4;
  color: rgba(0,0,0,.78);
  box-shadow: inset 0 0 0 .5px rgba(0,0,0,.04);
}
[data-theme="light"] .filmstrip-canvas.replay-canvas[data-platform="web-desktop"] .web-action-btn {
  color: rgba(0,0,0,.6);
}
[data-theme="light"] .filmstrip-canvas.replay-canvas[data-platform="web-desktop"] .web-action-btn:hover {
  background: rgba(0,0,0,.06);
  color: rgba(0,0,0,.9);
}
[data-theme="light"] .filmstrip-canvas.replay-canvas[data-platform="web-desktop"] .replay-screen {
  background: #fff;
}

.filmstrip-img {
  position: absolute;
  inset: 0;
  width: 100%;
  height: 100%;
  /* Use contain so the full screenshot is visible — the phone-frame
   * aspect-ratio (~9:19.5 for iPhone chrome) rarely matches the emulator's
   * real screenshot aspect (9:16 for 720×1280 Redroid, 9:20 for newer
   * phones). Cover would crop status bar / FAB from the edges. Black
   * letterbox bars on the unused axis blend with the replay-screen
   * background so the framing still reads as a phone. */
  object-fit: contain;
  object-position: center;
  background: #000;
  opacity: 0;
  transition: opacity .35s cubic-bezier(.32,.72,0,1);
  pointer-events: none;
}
.filmstrip-img.active {
  opacity: 1;
  pointer-events: auto;
}

/* ── Stage Nav arrows ── */
.replay-nav {
  position: absolute;
  top: 50%;
  transform: translateY(-50%);
  z-index: 2;
  display: grid;
  place-items: center;
  width: 40px;
  height: 40px;
  border-radius: 50%;
  border: 1px solid rgba(255,255,255,.12);
  background: rgba(0,0,0,.4);
  backdrop-filter: blur(12px);
  -webkit-backdrop-filter: blur(12px);
  color: rgba(255,255,255,.85);
  cursor: pointer;
  transition: all .2s cubic-bezier(.32,.72,0,1);
  opacity: 0;
}
.replay-prev { left: 12px; }
.replay-next { right: 12px; }
.replay-stage:hover .replay-nav { opacity: 1; }
.replay-nav:hover:not(:disabled) {
  background: rgba(0,0,0,.6);
  border-color: rgba(255,255,255,.2);
  color: #fff;
  transform: translateY(-50%) scale(1.08);
}
.replay-nav:active:not(:disabled) {
  transform: translateY(-50%) scale(.95);
}
.replay-nav:disabled {
  opacity: 0 !important;
  cursor: not-allowed;
  pointer-events: none;
}
.replay-stage:hover .replay-nav:disabled {
  opacity: .15 !important;
  pointer-events: auto;
}

[data-theme="light"] .replay-nav {
  background: rgba(255,255,255,.75);
  border-color: rgba(0,0,0,.08);
  color: rgba(0,0,0,.6);
}
[data-theme="light"] .replay-nav:hover:not(:disabled) {
  background: rgba(255,255,255,.92);
  border-color: rgba(0,0,0,.12);
  color: rgba(0,0,0,.85);
}

/* ── Metadata bar (below stage) ── */
.replay-meta-bar {
  position: relative;
  min-height: 64px;
}
.replay-meta-card {
  display: none;
  grid-template-columns: 88px 1fr 120px 120px;
  gap: 0;
  padding: 14px 0;
  background: var(--bg-raised);
  border: 1px solid var(--border);
  border-radius: 10px;
  animation: replayMetaIn .3s cubic-bezier(.32,.72,0,1);
}
.replay-meta-card.active { display: grid; }

@keyframes replayMetaIn {
  from { opacity: 0; transform: translateY(4px); }
  to { opacity: 1; transform: translateY(0); }
}

.replay-meta-item {
  display: flex;
  flex-direction: column;
  gap: 4px;
  padding: 0 18px;
  border-right: 1px solid var(--border);
  min-width: 0;
}
.replay-meta-item:last-child { border-right: none; }
.replay-meta-label {
  font-size: .66rem;
  font-family: var(--mono);
  letter-spacing: .04em;
  text-transform: uppercase;
  color: var(--text-3);
}
.replay-meta-value {
  font-size: .82rem;
  font-weight: 500;
  color: var(--text);
  letter-spacing: -.01em;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}
.replay-meta-item-action .replay-meta-value {
  white-space: normal;
  overflow: visible;
  text-overflow: clip;
  display: -webkit-box;
  -webkit-line-clamp: 2;
  -webkit-box-orient: vertical;
}
.replay-meta-reward {
  color: var(--success);
  font-weight: 600;
  font-family: var(--mono);
}

/* ── Keyboard hint bar ── */
.replay-kbd-hint {
  display: flex;
  align-items: center;
  justify-content: flex-end;
  gap: 18px;
  padding: 0 4px;
  font-size: .7rem;
  color: var(--text-3);
  opacity: .75;
}
.replay-kbd-group {
  display: inline-flex;
  align-items: center;
  gap: 6px;
}
.replay-kbd {
  display: inline-grid;
  place-items: center;
  min-width: 20px;
  height: 20px;
  padding: 0 6px;
  font-family: var(--mono);
  font-size: .68rem;
  font-weight: 600;
  color: var(--text-2);
  background: var(--bg-raised);
  border: 1px solid var(--border);
  border-bottom-width: 2px;
  border-radius: 4px;
  line-height: 1;
}

/* ── Responsive ── */
@media (max-width: 1024px) {
  .replay-split {
    grid-template-columns: 1fr;
  }
  .replay-sidebar {
    border-right: none;
    border-bottom: 1px solid var(--border);
    max-height: 320px;
  }
  .filmstrip-canvas.replay-canvas { max-width: 280px; }
}
@media (max-width: 820px) {
  .replay-task-banner { padding: 18px 20px; }
  .replay-task-stats { gap: 18px; }
  .replay-main { padding: 16px; }
  .replay-stage { min-height: 360px; padding: 8px; }
  .filmstrip-canvas.replay-canvas:is([data-platform="android"], [data-platform="web-mobile"]) { max-height: 400px; max-width: 240px; }
  .replay-meta-card { grid-template-columns: 1fr 1fr; }
  .replay-meta-item { border-right: none; padding: 4px 14px; }
  .replay-meta-item:nth-child(odd) { border-right: 1px solid var(--border); }
  .replay-kbd-hint { display: none; }
  .replay-nav { opacity: 1; width: 34px; height: 34px; }
  /* Narrow viewport: collapse Win toolbar (drop secondary buttons + search becomes icon-only) */
  .filmstrip-canvas.replay-canvas[data-platform="windows"] .win-tool-btn:nth-child(n+4),
  .filmstrip-canvas.replay-canvas[data-platform="windows"] .win-tool-divider {
    display: none;
  }
  .filmstrip-canvas.replay-canvas[data-platform="windows"] .win-tool-search-text { display: none; }
  .filmstrip-canvas.replay-canvas[data-platform="windows"] .win-tool-search { flex: 0 0 auto; padding: 0 8px; }
  /* Narrow viewport: drop Web's downloads/menu actions, keep profile only */
  .filmstrip-canvas.replay-canvas[data-platform="web-desktop"] .web-action-btn { display: none; }
  .filmstrip-canvas.replay-canvas[data-platform="web-desktop"] .web-tab-new { display: none; }
}

/* Phone shells stay aspect-ratio-driven on very narrow viewports (≤360px) —
   drop the max-height clamp so width sets the size and height scales naturally. */
@media (max-width: 360px) {
  .filmstrip-canvas.replay-canvas:is([data-platform="android"], [data-platform="web-mobile"]) {
    max-height: none;
    max-width: 100%;
  }
}

/* Screenshot load failure — overlay a quiet "无截图" placeholder so a broken
   image link doesn't read as broken CSS. */
.filmstrip-img.is-broken {
  opacity: 0;
}
.replay-screen:has(.filmstrip-img.active.is-broken)::after {
  content: '无截图';
  position: absolute;
  inset: 0;
  display: flex;
  align-items: center;
  justify-content: center;
  background: #0a0a0a;
  color: rgba(255,255,255,.5);
  font-size: 12px;
  letter-spacing: .04em;
  z-index: 2;
}

/* Legacy step styles (backward compat) */
.steps-list { display: grid; gap: 14px; }
.step-card.replay {
  display: grid;
  grid-template-columns: 180px 1fr;
  gap: 18px;
  align-items: center;
}
.step-shot img {
  width: 100%;
  border-radius: 18px;
  border: 1px solid var(--line);
}
.step-title { font-weight: 700; margin-bottom: 6px; }

.benchmark-notes {
  gap: 10px;
}

.benchmark-sidecopy {
  margin-top: 18px;
  line-height: 1.65;
}

/* Duplicate of the drawer pattern above — removed. The single responsive
 * block earlier in the file now handles all narrow-viewport sidebar
 * behavior (hidden-by-default drawer + hamburger toggle). */

@media (max-width: 820px) {
  .marketing-shell .page-shell,
  .page-shell {
    padding: 18px 16px 32px;
  }

  .hero-copy,
  .hero-panel,
  .auth-card,
  .callout-card,
  .detail-hero,
  .page-hero {
    padding: 22px;
  }

  .console-topbar,
  .page-hero,
  .panel-header {
    align-items: flex-start;
  }

  .step-card.replay {
    grid-template-columns: 1fr;
  }
}

/* ═══════════════════════════════════════════
   MODAL TWO-STEP FLOW
   ═══════════════════════════════════════════ */

/* Widen modal for Step 2 code display */
.modal.modal-step2-wide {
  width: min(680px, calc(100vw - 28px));
}

/* Step 2 content layout */
.step2-content {
  display: flex;
  flex-direction: column;
  gap: 24px;
}

/* Success header with checkmark */
.step2-success-header {
  display: flex;
  align-items: flex-start;
  gap: 16px;
}

.success-checkmark svg {
  display: block;
}

.success-checkmark .checkmark-path {
  stroke-dasharray: 24;
  stroke-dashoffset: 24;
  transition: none;
}

.success-checkmark.animate .checkmark-path {
  animation: drawCheck 0.4s ease-out 0.15s forwards;
}

.success-checkmark.animate svg circle {
  animation: scaleCircle 0.3s ease-out forwards;
}

@keyframes drawCheck {
  to { stroke-dashoffset: 0; }
}

@keyframes scaleCircle {
  0% { transform: scale(0.8); opacity: 0.5; }
  60% { transform: scale(1.05); }
  100% { transform: scale(1); opacity: 1; }
}

.step2-title {
  margin: 0;
  font-size: 1.15rem;
  font-weight: 700;
  letter-spacing: -0.01em;
}

/* Code panel in Step 2 */
.step2-code-panel {
  border: 1px solid var(--border);
  border-radius: var(--radius-md);
  background: rgba(0,0,0,.25);
  overflow: hidden;
}

.step2-code-header {
  display: flex;
  justify-content: space-between;
  align-items: center;
  padding: 6px 10px 6px 16px;
  background: rgba(255,255,255,.02);
}

.step2-copy-icon-btn {
  display: flex;
  align-items: center;
  gap: 4px;
  background: none;
  border: none;
  cursor: pointer;
  color: var(--text-3);
  padding: 5px 7px;
  border-radius: var(--radius-sm);
  transition: color .15s, background .15s;
}
.step2-copy-icon-btn:hover {
  color: var(--text);
  background: rgba(255,255,255,.06);
}
.step2-copy-icon-btn [data-copy-text] {
  font-size: 0.72rem;
}

.step2-code-label {
  font-size: 0.78rem;
  font-weight: 600;
  color: var(--text-3);
  font-family: var(--mono);
  text-transform: uppercase;
  letter-spacing: 0.05em;
}

.step2-code-block {
  margin: 0;
  padding: 18px 20px;
  border: none;
  border-radius: 0;
  background: transparent;
  font-size: 0.84rem;
  line-height: 1.7;
  max-height: 220px;                              /* 320→220：缩短，避免跟上下挤 */
  overflow-y: auto;
}
/* 自定义滚动条 — 跟 modal dark 调一致，不用浏览器默认那种亮灰条 */
.step2-code-block::-webkit-scrollbar { width: 8px; }
.step2-code-block::-webkit-scrollbar-track { background: transparent; }
.step2-code-block::-webkit-scrollbar-thumb {
  background: rgba(255,255,255,.10);
  border-radius: 4px;
}
.step2-code-block::-webkit-scrollbar-thumb:hover {
  background: rgba(255,255,255,.18);
}
.step2-code-block { scrollbar-width: thin; scrollbar-color: rgba(255,255,255,.10) transparent; }

/* Quick step hints in Step 2 */
.step2-hints {
  display: flex;
  flex-direction: column;
  gap: 10px;
  padding: 16px;
  border: 1px solid var(--border);
  border-radius: var(--radius-md);
  background: var(--bg-raised);
}

.step2-hints .hint-item {
  display: flex;
  align-items: center;
  gap: 12px;
  font-size: 0.88rem;
}

.step2-hints .hint-label {
  width: 22px;
  height: 22px;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  border-radius: 50%;
  background: var(--accent-bg);
  color: var(--accent);
  font-size: 0.72rem;
  font-weight: 700;
  flex-shrink: 0;
}

.step2-hints .hint-text {
  color: var(--text-2);
}

.step2-hints .hint-text code {
  background: rgba(255,255,255,.06);
  padding: 2px 6px;
  border-radius: 4px;
  font-family: var(--mono);
  font-size: 0.82rem;
}

.step2-hints .hint-text a {
  color: var(--accent);
  text-decoration: underline;
  text-underline-offset: 2px;
}

/* Button loading spinner */
.btn-spinner {
  display: inline-block;
  width: 16px;
  height: 16px;
  border: 2px solid rgba(255,255,255,.25);
  border-top-color: #fff;
  border-radius: 50%;
  animation: btnSpin 0.6s linear infinite;
  vertical-align: middle;
  margin-right: 6px;
}

@keyframes btnSpin {
  to { transform: rotate(360deg); }
}

/* ═══════════════════════════════════════════
   COLLAPSIBLE PANEL (details/summary)
   ═══════════════════════════════════════════ */

.collapsible-panel {
  border: 1px solid var(--border);
  border-radius: var(--radius);
  background: var(--bg-raised);
  overflow: hidden;
}

.collapsible-header {
  display: flex;
  justify-content: space-between;
  align-items: center;
  padding: 16px 24px;
  cursor: pointer;
  user-select: none;
  list-style: none;
  transition: background 0.15s;
}

.collapsible-header:hover {
  background: var(--surface-hover);
}

.collapsible-header::-webkit-details-marker,
.collapsible-header::marker {
  display: none;
  content: "";
}

.collapsible-title {
  font-size: 0.95rem;
  font-weight: 600;
}

.collapsible-hint {
  font-size: 0.78rem;
  color: var(--text-3);
  font-family: var(--mono);
}

.collapsible-panel[open] .collapsible-hint { display: none; }

.collapsible-body {
  padding: 0 24px 24px;
  display: flex;
  flex-direction: column;
  gap: 16px;
}

.collapsible-body .panel-header {
  padding: 0;
  margin: 0;
}

.collapsible-body .code-block {
  margin: 0;
}

.collapsible-body .code-hints {
  display: flex;
  flex-direction: column;
  gap: 8px;
  padding: 14px 16px;
  border: 1px solid var(--border);
  border-radius: var(--radius-sm);
  background: rgba(255,255,255,.02);
}

.collapsible-body .code-hints .hint-item {
  display: flex;
  align-items: center;
  gap: 10px;
  font-size: 0.86rem;
  color: var(--text-2);
}

.collapsible-body .code-hints .hint-label {
  flex-shrink: 0;
}

.collapsible-body .code-hints code {
  background: rgba(255,255,255,.06);
  padding: 2px 6px;
  border-radius: 4px;
  font-family: var(--mono);
  font-size: 0.82rem;
}

.collapsible-body .code-hints a {
  color: var(--accent);
  text-decoration: underline;
  text-underline-offset: 2px;
}

/* ── Settings: API Key list ── */
.modal-narrow {
  position: relative;
}

.modal-narrow .modal-close-row {
  position: absolute;
  top: 0;
  right: 0;
  padding: 10px;
}

.modal-narrow .modal-body {
  padding-top: 24px;
}

.api-key-list {
  display: flex;
  flex-direction: column;
  gap: 0;
  margin-top: 16px;
}

.api-key-row {
  display: flex;
  align-items: center;
  justify-content: space-between;
  padding: 10px 0;
  border-bottom: 1px solid var(--border);
}

.api-key-row:last-child { border-bottom: none; }

.api-key-info {
  display: flex;
  align-items: center;
  gap: 12px;
}

.api-key-name {
  font-size: 0.9rem;
  color: var(--text);
}

.api-key-prefix {
  font-family: var(--mono);
  font-size: 0.8rem;
  color: var(--text-2);
  background: rgba(255,255,255,.05);
  padding: 2px 8px;
  border-radius: 4px;
  letter-spacing: 0.02em;
}

.api-key-actions {
  display: flex;
  align-items: center;
  gap: 12px;
}

/* ── Settings: Key reveal panel ── */
.key-reveal-panel {
  border: 1px solid var(--border);
  border-radius: var(--radius-sm);
  overflow: hidden;
  background: rgba(255,255,255,.03);
}

.key-reveal-row {
  display: flex;
  align-items: center;
  gap: 10px;
  padding: 12px 14px;
}

.key-token-display {
  flex: 1;
  font-family: var(--mono);
  font-size: 0.84rem;
  color: var(--text);
  word-break: break-all;
  overflow-wrap: anywhere;
  user-select: all;
}

/* ── Settings page layout ── */
.settings-shell {
  display: block !important;
}

.settings-layout {
  max-width: 744px;
  padding: 16px 24px 48px;
}

/* ── Settings usage grid (Stripe / Linear style) ── */
.settings-usage-grid {
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  border: 1px solid var(--border);
  border-radius: var(--radius-md);
  background: var(--bg-raised);
  overflow: hidden;
}

.settings-usage-item {
  padding: 18px 22px;
  border-right: 1px solid var(--border);
}

.settings-usage-item:last-child {
  border-right: none;
}

.settings-usage-label {
  font-size: 0.8125rem;
  color: var(--text-2);
  margin-bottom: 10px;
  font-weight: 400;
}

.settings-usage-value {
  font-size: 1.75rem;
  font-weight: 500;
  color: var(--text);
  line-height: 1;
  font-variant-numeric: tabular-nums;
  letter-spacing: -0.015em;
}

.settings-usage-unit {
  font-size: 0.875rem;
  font-weight: 400;
  color: var(--text-2);
  margin-left: 4px;
  letter-spacing: 0;
}

@media (max-width: 640px) {
  .settings-usage-grid {
    grid-template-columns: 1fr;
  }
  .settings-usage-item {
    border-right: none;
    border-bottom: 1px solid var(--border);
  }
  .settings-usage-item:last-child {
    border-bottom: none;
  }
}

.settings-section {
  padding: 0;
}

.settings-row {
  display: flex;
  align-items: flex-start;
  justify-content: space-between;
  gap: 24px;
}

.settings-row-actions {
  display: flex;
  align-items: center;
  gap: 8px;
  flex-shrink: 0;
}

.settings-section-title {
  font-size: 0.9rem;
  font-weight: 600;
  color: var(--text);
  margin: 0 0 4px;
}

.settings-divider {
  border: none;
  border-top: 1px solid var(--border);
  margin: 28px 0;
}

.settings-field-group {
  display: flex;
  flex-direction: column;
}

.settings-field {
  display: flex;
  align-items: center;
  justify-content: space-between;
  padding: 9px 0;
  border-bottom: 1px solid var(--border);
}

.settings-field:last-child { border-bottom: none; }

.settings-field-label {
  font-size: 0.875rem;
  color: var(--text-2);
}

.settings-field-value {
  font-size: 0.875rem;
  color: var(--text);
}

.settings-form {
  display: flex;
  align-items: center;
  gap: 10px;
}

.settings-select {
  flex: 1;
  background: var(--bg-2);
  border: 1px solid var(--border);
  border-radius: var(--radius-sm);
  color: var(--text);
  padding: 8px 10px;
  font-size: 0.875rem;
}

.key-count-badge {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  min-width: 18px;
  height: 18px;
  padding: 0 5px;
  background: rgba(255,255,255,.10);
  border: 1px solid rgba(255,255,255,.14);
  color: var(--text-secondary);
  border-radius: 9px;
  font-size: 0.75rem;
  font-weight: 500;
  margin-left: 6px;
}

.modal-narrow {
  width: min(480px, calc(100vw - 28px)) !important;
}

/* ═══════════════════════════════════════════
   ENVIRONMENT PAGE — V1 IMPROVEMENTS
   ═══════════════════════════════════════════ */

/* ── Status badges — verbatim port of efflora .dashboard-status-badge
   (SaaS2AI/web/src/styles/tokens.css lines 328-346). Pill chip with
   alpha-tinted bg + alpha border — the alpha wrapper contextualizes
   the color as a "state chip" so saturated mint/amber don't read as
   raw green/yellow text on dark cells. No dot, no glow. */
.status-badge {
  display: inline-flex;
  align-items: center;
  padding: 4px 10px;
  border-radius: 999px;
  font-size: 12px;
  font-weight: 600;
  border: 1px solid transparent;
  background: rgba(255,255,255,.05);
  color: var(--text-secondary);
}
.status-badge.status-active,
.status-badge.status-completed {
  color: var(--success);
  background: rgba(123,191,166,.12);
  border-color: rgba(123,191,166,.22);
}
/* 三家"进行中/等待"共享同一套琥珀 (warning) tint, 跟 completed 的薄荷绿
   tint 是镜像设计 — alpha .12 内填 + alpha .22 边框 + 状态色文字, 形状/字号
   完全一致, 切换状态时只换色, 视觉语言统一。 */
.status-badge.status-creating,
.status-badge.status-running,
.status-badge.status-pending {
  color: var(--warning);
  background: rgba(200,169,110,.12);
  border-color: rgba(200,169,110,.22);
}
.status-badge.status-released {
  color: var(--text-secondary);
  background: rgba(255,255,255,.05);
  border-color: rgba(255,255,255,.08);
}
/* failed / error / unreachable — 真正的执行失败用红粉 (danger) tint。
   原本只覆盖了 .status-error, 模板里 status_class 会把 "failed" /
   "unreachable" 直接拼成 .status-failed / .status-unreachable, 没有匹配的
   规则会回退到 base .status-badge 的灰填充, 跟 completed/pending 风格脱节。
   把三者绑成一组, 行为统一。 */
.status-badge.status-error,
.status-badge.status-failed,
.status-badge.status-unreachable {
  color: var(--danger);
  background: rgba(232,176,169,.12);
  border-color: rgba(232,176,169,.26);
}

/* ── Inline filter tabs — pill shell scaled for a small inline control
   (nav-pill's heavy shadow/double-border/sheen read as overdone at
   this scale). Active state ported verbatim from efflora
   .dashboard-nav-link-active (tokens.css lines 193-200): white text
   on a faintly warm-tinted chip — amber lives in the bg gradient +
   border, never in the text. */
.filter-tabs {
  display: inline-flex;
  gap: 2px;
  padding: 4px;
  background: linear-gradient(135deg, rgba(255,255,255,.055) 0%, rgba(255,255,255,.02) 50%, rgba(255,255,255,.04) 100%);
  backdrop-filter: blur(12px);
  -webkit-backdrop-filter: blur(12px);
  border: 1px solid rgba(255,255,255,.08);
  border-top-color: rgba(255,255,255,.14);
  border-radius: 980px;
  box-shadow: inset 0 1px 0 rgba(255,255,255,.04);
  width: fit-content;
}
.filter-tab {
  padding: 6px 14px;
  border-radius: 980px;
  font-size: 0.82rem;
  color: var(--text-2);
  text-decoration: none;
  transition: color .15s ease, background .15s ease, border-color .15s ease;
  border: 1px solid transparent;
  background: transparent;
  cursor: pointer;
  white-space: nowrap;
}
.filter-tab:hover {
  color: var(--text-primary);
  background: rgba(255,255,255,.04);
}
.filter-tab.active {
  color: var(--text-primary);
  background: linear-gradient(180deg, rgba(200,169,110,.12) 0%, rgba(255,255,255,.055) 100%);
  border-color: rgba(200,169,110,.22);
  box-shadow:
    inset 0 1px 0 rgba(255,255,255,.05),
    0 10px 22px rgba(0,0,0,.16);
  font-weight: 500;
}

/* ── Disabled button popover ── */
.disabled-button-wrap {
  position: relative;
  display: inline-block;
}
.disabled-popover {
  display: none;
  position: absolute;
  top: calc(100% + 8px);
  right: 0;
  background: var(--bg-raised-2);
  border: 1px solid var(--border-strong);
  border-radius: var(--radius-sm);
  padding: 12px 16px;
  font-size: 0.82rem;
  color: var(--text-2);
  width: 240px;
  box-shadow: var(--shadow);
  z-index: 10;
  line-height: 1.5;
}
.disabled-popover::before {
  content: "";
  position: absolute;
  top: -5px;
  right: 20px;
  width: 8px;
  height: 8px;
  background: var(--bg-raised-2);
  border-left: 1px solid var(--border-strong);
  border-top: 1px solid var(--border-strong);
  transform: rotate(45deg);
}
.disabled-button-wrap:hover .disabled-popover,
.disabled-button-wrap:focus-within .disabled-popover {
  display: block;
}

/* ── Table: name-first cell ── */
.cell-name-primary {
  font-weight: 500;
  color: var(--text);
}
.cell-name-primary a {
  color: var(--text);
  text-decoration: none;
}
.cell-name-primary a:hover {
  color: var(--accent);
}
.cell-id-secondary {
  font-size: 0.78rem;
  color: var(--text-3);
  font-family: var(--mono);
  margin-top: 2px;
}

/* ── Relative timestamp ── */
.timestamp {
  color: var(--text-2);
  font-size: 0.82rem;
}

/* ── Table section header ── */
.table-section-header {
  display: flex;
  align-items: center;
  justify-content: space-between;
  margin-bottom: 10px;
}
.table-section-header h2 {
  font-size: 1rem;
  font-weight: 500;
}
.table-count {
  font-size: 0.82rem;
  color: var(--text-3);
}

/* ── Resource summary (combined apps + tasks) ── */
.resource-summary {
  display: flex;
  flex-direction: column;
  gap: 20px;
  padding: 0 24px 24px;
}
.resource-group {
  display: flex;
  align-items: baseline;
  gap: 16px;
}
.resource-group-label {
  font-size: 0.78rem;
  font-weight: 600;
  color: var(--text-3);
  text-transform: uppercase;
  letter-spacing: 0.04em;
  min-width: 80px;
  flex-shrink: 0;
}

/* ── Snake border section (thin line tracing the border) ── */
.glow-border-section {
  position: relative;
}
.glow-border-section::before {
  content: "";
  position: absolute;
  inset: 0;
  border-radius: inherit;
  padding: 1.5px;
  background: conic-gradient(
    from var(--glow-angle, 0deg),
    transparent 90%,
    rgba(200,169,110,.3) 94%,
    rgba(200,169,110,.9) 98%,
    rgba(200,169,110,.3) 100%
  );
  -webkit-mask: linear-gradient(#fff 0 0) content-box, linear-gradient(#fff 0 0);
  -webkit-mask-composite: xor;
  mask-composite: exclude;
  animation: glowSpin 8s cubic-bezier(0.4, 0, 0.2, 1) infinite;
  pointer-events: none;
}

@property --glow-angle {
  syntax: "<angle>";
  initial-value: 0deg;
  inherits: false;
}
@keyframes glowSpin {
  to { --glow-angle: 360deg; }
}

/* ── Run dialog (新建测评/训练) ── */
/* ═══════════════════════════════════════════
   RUN DIALOG — REDESIGNED
   ═══════════════════════════════════════════ */

/* Result dialog — launch 成功后单独弹出，不跟 wizard 混。尺寸更紧凑。 */
.result-dialog {
  width: min(880px, 92vw);
  max-height: min(620px, 92vh);
  overflow: hidden;
  border-radius: 20px;
  background: var(--bg-modal);
  border: 1px solid var(--border-modal);
  border-top-color: var(--border-modal-strong);
  box-shadow:
    0 32px 80px rgba(0,0,0,.55),
    0 12px 32px rgba(0,0,0,.32),
    inset 0 1px 0 rgba(255,255,255,.06);
}
.result-dialog .modal-body {
  display: flex;
  flex-direction: column;
  height: min(620px, 92vh);
  padding: 0;
  overflow: hidden;
}

/* Code panel & hints scoped overrides — 用 solid 实色替代原全局 rgba 透明叠
 * 加，去掉"雾蒙蒙"感觉。3 层 luminance hierarchy（**全部 R=G=B 纯中性**，
 * 避免任何冷/暖偏色）：
 *   modal bg #1a1a1a → code panel #161616 (carved in) → hints #222222 (raised) */
.result-dialog .step2-code-panel {
  background: #161616;                          /* 纯中性，下沉 4 RGB */
  border: 1px solid rgba(255,255,255,.10);
  border-radius: 12px;
}
.result-dialog .step2-code-header {
  background: rgba(255,255,255,.03);
  border-bottom: 1px solid rgba(255,255,255,.06);
  padding: 10px 14px 10px 18px;
}
.result-dialog .step2-hints {
  background: #222222;                          /* 纯中性，抬起 8 RGB */
  border: 1px solid rgba(255,255,255,.10);
  border-radius: 12px;
  padding: 18px 20px;
}

.run-dialog {
  width: min(1200px, 92vw);
  max-height: min(820px, 94vh);              /* 820→720，内容 fit 后底部不再大片留空 */
  overflow: hidden;
  border-radius: 20px;
  /* 方案 A — 直接换更亮的 base 色（Linear / Vercel modal 同档），
   * 不再用"在暗底上叠半透明白"的写法。 */
  background: var(--bg-modal);
  border: 1px solid var(--border-modal);
  border-top-color: var(--border-modal-strong);
  box-shadow:
    0 32px 80px rgba(0,0,0,.55),
    0 12px 32px rgba(0,0,0,.32),
    inset 0 1px 0 rgba(255,255,255,.06);
}

.run-dialog .modal-body {
  display: flex;
  flex-direction: column;
  height: min(820px, 94vh);
  padding: 0;
  overflow: hidden;
}

.run-dialog .modal-step {
  display: flex;
  flex-direction: column;
  flex: 1;
  min-height: 0;
  overflow: hidden;
}

.run-picker {
  display: flex;
  flex-direction: column;
  flex: 1;
  min-height: 0;
  overflow: hidden;
}

/* ── Header ── */
.run-dialog-head {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 16px;
  padding: 22px 28px 0;                   /* 横向 28px，跟 stepper / step body / foot 对齐 */
  flex-shrink: 0;
  /* no border-bottom — 让 spacing 单独负责分区 */
}
[data-modal-step="2"] .run-dialog-head {
  border-bottom: none;
}

.run-dialog-title-row {
  display: flex;
  align-items: baseline;
  gap: 10px;
}

.run-dialog-title {
  font-size: 0.96rem;
  font-weight: 600;
  color: var(--text);
  letter-spacing: -0.01em;
}

.run-dialog-hint {
  font-size: 0.78rem;
  color: var(--text-3);
}

/* ── Three-column layout ── */
.run-columns {
  display: grid;
  grid-template-columns: 150px 188px 1fr;     /* 与 .run-col-header 同宽 */
  flex: 1;
  min-height: 0;
}

/* ── Scene column (sidebar feel) ── */
.run-scene-col {
  display: flex;
  flex-direction: column;
  min-height: 0;
  border-right: 1px solid rgba(255,255,255,.06);
}

.run-scene-list {
  flex: 1;
  overflow-y: auto;
  padding: 6px 0;
  background: rgba(255,255,255,.015);
}

.run-scene-item {
  display: flex;
  align-items: center;
  justify-content: space-between;
  padding: 9px 14px;
  cursor: pointer;
  transition: background .12s;
  gap: 6px;
  position: relative;
}
.run-scene-item:hover { background: rgba(255,255,255,.04); }

.run-scene-item.active {
  background: linear-gradient(90deg, rgba(255,255,255,.16) 0%, rgba(255,255,255,.05) 100%);
}

.run-scene-item.run-scene-empty {
  opacity: 0.3;
  cursor: default;
  pointer-events: none;
}

.run-scene-name {
  font-size: 0.82rem;
  color: var(--text-2);
  flex: 1;
  min-width: 0;
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
}
.run-scene-item.active .run-scene-name {
  color: var(--accent);
  font-weight: 500;
}

.run-scene-count {
  font-size: 0.7rem;
  color: var(--text-3);
  flex-shrink: 0;
  background: rgba(255,255,255,.05);
  padding: 1px 5px;
  border-radius: 99px;
  min-width: 18px;
  text-align: center;
}
.run-scene-item.active .run-scene-count {
  background: rgba(255,255,255,.12);
  color: rgba(255,255,255,.90);
}

/* ── App column ── */
.run-app-col {
  display: flex;
  flex-direction: column;
  min-height: 0;
  border-right: 1px solid rgba(255,255,255,.06);
}

/* ── Task column ── */
.run-task-col {
  display: flex;
  flex-direction: column;
  min-height: 0;
}

/* ── Unified column header row ── */
.run-col-header {
  display: grid;
  grid-template-columns: 150px 188px 1fr;     /* scene 112 → 150，给英文 locale "Scene"等留余地 */
  border-bottom: 1px solid rgba(255,255,255,.07);
  flex-shrink: 0;
}
.run-col-header-cell {
  display: flex;
  align-items: center;
  justify-content: space-between;
  padding: 11px 14px;
  font-size: 0.78rem;                         /* 0.65 → 0.78rem，可读 */
  font-weight: 600;                           /* 500 → 600 */
  letter-spacing: 0.04em;
  text-transform: none;                       /* 取消 uppercase 让中文显示自然 */
  color: var(--text);                         /* text-3 → text 主白 */
}
.run-col-header-cell:not(:last-child) {
  border-right: 1px solid rgba(255,255,255,.06);
}
.run-col-header-title {
  font-size: 0.78rem;
  font-weight: 600;
  letter-spacing: 0.04em;
  text-transform: none;
  color: var(--text);
  opacity: 1;                                 /* .6 → 1，不再 dim */
}

.run-col-select-all-label {
  display: flex;
  align-items: center;
  gap: 5px;
  cursor: pointer;
  font-size: 0.68rem;
  font-weight: 400;
  letter-spacing: 0;
  text-transform: none;
  color: var(--text-3);
  user-select: none;
  transition: color .12s;
}
.run-col-select-all-label:hover { color: var(--accent); }

/* ── App list ── */
.run-app-list {
  flex: 1;
  overflow-y: auto;
  padding: 6px 0;
  scrollbar-gutter: stable;
}

.run-app-item {
  display: flex;
  align-items: center;
  padding: 9px 14px;
  cursor: pointer;
  transition: background .12s;
  position: relative;
}
.run-app-item:hover { background: rgba(255,255,255,.04); }

.run-app-item.active {
  background: linear-gradient(90deg, rgba(255,255,255,.15) 0%, rgba(255,255,255,.04) 100%);
}

/* App checkbox */
.run-app-check {
  margin-right: 9px;
  flex-shrink: 0;
}

.run-app-name {
  font-size: 0.85rem;
  color: var(--text-2);
  font-weight: 400;
  transition: color .12s;
}
.run-app-item.active .run-app-name {
  color: var(--text);
  font-weight: 500;
}

/* ── Task panel ── */
.run-task-scroll {
  flex: 1;
  overflow-y: auto;
  padding: 6px 0;
  scrollbar-gutter: stable;
}

.run-task-empty {
  padding: 12px 0;
  pointer-events: none;
}

.run-task-skeleton {
  height: 28px;
  margin: 4px 14px;
  border-radius: 6px;
  background: rgba(255,255,255,.04);
  animation: shimmer 1.6s ease-in-out infinite;
}
@keyframes shimmer {
  0%, 100% { opacity: 0.4; }
  50%       { opacity: 0.18; }
}

.run-task-row {
  display: flex;
  align-items: center;
  gap: 10px;
  padding: 9px 14px;
  cursor: pointer;
  transition: background .12s;
  position: relative;
}
.run-task-row:hover { background: rgba(255,255,255,.04); }

/* ── Custom checkbox (shared: app + task) ── */
.run-task-check {
  appearance: none;
  -webkit-appearance: none;
  width: 15px;
  height: 15px;
  min-width: 15px;
  border: 1.5px solid rgba(255,255,255,.18);
  border-radius: 4px;
  background: rgba(255,255,255,.04);
  cursor: pointer;
  position: relative;
  transition: border-color .15s, background .15s, box-shadow .15s;
  flex-shrink: 0;
}
.run-task-check:hover {
  border-color: rgba(120,180,255,.5);
  background: rgba(120,180,255,.06);
}
.run-task-check:checked {
  background: var(--accent);
  border-color: var(--accent);
  box-shadow: 0 0 0 3px rgba(120,180,255,.18), 0 1px 3px rgba(0,0,0,.3);
}
.run-task-check:checked::after {
  content: '';
  position: absolute;
  top: 50%;
  left: 50%;
  width: 8px;
  height: 4.5px;
  border-left: 1.5px solid #0a0a0f;
  border-bottom: 1.5px solid #0a0a0f;
  transform: translate(-50%, -65%) rotate(-45deg);
}
.run-task-check:indeterminate {
  background: rgba(120,180,255,.35);
  border-color: rgba(120,180,255,.6);
}
.run-task-check:indeterminate::after {
  content: '';
  position: absolute;
  top: 50%; left: 50%;
  width: 7px; height: 1.5px;
  background: var(--text);
  transform: translate(-50%, -50%);
  border: none;
}

.run-task-name {
  font-family: var(--mono);
  font-size: 0.79rem;
  color: var(--text);
  flex: 1;
  min-width: 0;
}

/* New 2-line layout: 主行展示中文 description, 副行展示 task_id (mono, muted) */
.run-task-meta {
  display: flex;
  flex-direction: column;
  gap: 2px;
  flex: 1;
  min-width: 0;
}
.run-task-desc {
  font-size: 0.83rem;
  color: var(--text);
  line-height: 1.35;
  overflow: hidden;
  text-overflow: ellipsis;
  display: -webkit-box;
  -webkit-line-clamp: 2;
  -webkit-box-orient: vertical;
  word-break: break-word;
}
.run-task-id {
  font-family: var(--mono);
  font-size: 0.68rem;
  color: var(--text-3);
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
}

.run-task-tags {
  display: flex;
  align-items: center;
  gap: 8px;
  flex-shrink: 0;
}

/* ── 单表格布局：任务(含 apps 副行) | 描述 | 难度(含 type tag) ── */
.run-task-table {
  flex: 1;
  min-height: 0;
  display: flex;
  flex-direction: column;
}
.run-task-header,
.run-task-row {
  display: grid;
  grid-template-columns: minmax(320px, 1.5fr) minmax(220px, 1.2fr) minmax(110px, 130px);
  gap: 24px;
  padding: 12px 18px;
}
.run-task-header {
  align-items: center;
  border-bottom: 1px solid rgba(255,255,255,.08);
  color: var(--text);
  font-weight: 600;
  font-size: 0.78rem;
  flex-shrink: 0;
}
.run-task-header-apps { text-align: left; }
.run-task-header-tags { text-align: right; }
.run-task-header-task {
  display: flex;
  align-items: center;
  gap: 10px;
  cursor: pointer;
  font: inherit;
}
.run-task-list {
  flex: 1;
  min-height: 0;
  overflow-y: auto;
}
.run-task-row {
  cursor: pointer;
  align-items: start;                  /* 任务列 stack 后顶部对齐更整齐 */
  transition: background .12s;
  border-bottom: 1px solid rgba(255,255,255,.04);
}
.run-task-row:hover { background: rgba(255,255,255,.03); }

/* 选中态 —— 行底色微提 + 左边 2px 琥珀竖条
 * 滚动后回看也能一眼定位"我选了哪些任务"。 */
.run-task-row {
  position: relative;                        /* anchor for ::before bar */
}
.run-task-row::before {
  content: "";
  position: absolute;
  left: 0; top: 0; bottom: 0;
  width: 2px;
  background: var(--accent);                 /* amber */
  opacity: 0;
  transition: opacity .15s;
}
.run-task-row:has(.run-task-check:checked) {
  background: rgba(200,169,110,.05);
}
.run-task-row:has(.run-task-check:checked):hover {
  background: rgba(200,169,110,.07);
}
.run-task-row:has(.run-task-check:checked)::before {
  opacity: 1;
}

/* 任务列：name + 描述副行竖排 */
.run-task-cell-task {
  display: flex;
  flex-direction: column;
  gap: 6px;
  min-width: 0;
}
.run-task-name-row {
  display: flex;
  align-items: center;
  gap: 10px;
  min-width: 0;
}
/* 描述副行 —— 灰色正文，与 task name 视觉对齐（避开 checkbox 26px） */
.run-task-desc-line {
  padding-left: 26px;
  font-size: .80rem;
  color: var(--text-secondary);
  line-height: 1.45;
  display: -webkit-box;
  -webkit-line-clamp: 2;
  -webkit-box-orient: vertical;
  overflow: hidden;
}

/* 应用列 —— flex-wrap chips，"+N more" popover 的 anchor */
.run-task-cell-apps {
  display: flex;
  flex-wrap: wrap;
  align-content: flex-start;           /* 多行 wrap 时贴顶 */
  gap: 6px;
  min-width: 0;
  position: relative;
  padding-top: 2px;                    /* 视觉与 task name baseline 对齐 */
}

.run-task-cell-tags {
  display: flex;
  align-items: center;
  gap: 8px;
  justify-content: flex-end;
  align-self: center;
}

/* App 小 chip（任务行内 apps 列） */
.run-task-app-chip {
  display: inline-flex;
  align-items: center;
  font-family: 'IBM Plex Mono', monospace;
  font-size: 11.5px;
  font-weight: 500;
  padding: 3px 9px;
  border-radius: 999px;
  color: rgba(255,255,255,.78);
  background: rgba(255,255,255,.05);
  border: 1px solid rgba(255,255,255,.10);
  white-space: nowrap;
}
/* "+N" more 按钮（apps 多于 5 个时） */
.run-task-app-more {
  display: inline-flex;
  align-items: center;
  font-family: 'IBM Plex Mono', monospace;
  font-size: 11.5px;
  font-weight: 600;
  padding: 3px 9px;
  border-radius: 999px;
  background: transparent;
  color: rgba(255,255,255,.55);
  border: 1px solid rgba(255,255,255,.14);
  cursor: pointer;
  transition: color .12s, background .12s, border-color .12s;
}
.run-task-app-more:hover {
  color: var(--text);
  background: rgba(255,255,255,.05);
  border-color: rgba(255,255,255,.20);
}
.run-task-app-more[aria-expanded="true"] {
  color: var(--text);
  background: rgba(200,169,110,.10);
  border-color: rgba(200,169,110,.40);
}

/* "+N more" 浮层：点击 +N 按钮后从右下方弹出，列出当前 task 的全部 app chip。
 * 用 position:fixed 挂到 body 上，避免被 .run-task-list 的 overflow-y 截断。 */
.run-task-app-popover {
  position: fixed;
  z-index: 1100;                       /* 高于 dialog backdrop */
  display: flex;
  flex-wrap: wrap;
  gap: 6px;
  max-width: 320px;
  padding: 10px;
  background: #303030;
  border: 1px solid rgba(255,255,255,.10);
  border-radius: 10px;
  box-shadow: 0 12px 32px rgba(0,0,0,.40), 0 2px 8px rgba(0,0,0,.30);
  animation: appMorePop .14s cubic-bezier(.16,1,.3,1);
}
@keyframes appMorePop {
  from { opacity: 0; transform: translateY(-4px); }
  to   { opacity: 1; transform: translateY(0); }
}

/* 灰显的"无任务"场景 chip（仍可见但不可点） */
.custom-filter-chip.is-empty,
.custom-filter-chip:disabled {
  opacity: .32;
  background: transparent;
  border-color: rgba(255,255,255,.10);
  cursor: not-allowed;
}
.custom-filter-chip.is-empty:hover,
.custom-filter-chip:disabled:hover {
  background: transparent;
  border-color: rgba(255,255,255,.10);
}

/* ── 任务行 chip 统一基底（type tag + difficulty tag 共用同款胶囊形态） ──
 * 同一字号、同一 padding、同一 border-radius，让两个 chip 视觉是一家。
 * 同时覆盖 .pack-task-row（pack detail 展开里的迷你表格），
 * 让 filter↔result 闭环跨「自定义筛选」「pack 详情预览」两个 surface。 */
.task-type-tag,
.run-task-row .task-tag,
.pack-task-row .task-tag {
  display: inline-flex;
  align-items: center;
  font-family: 'IBM Plex Mono', monospace;
  font-size: 11.5px;
  font-weight: 600;
  letter-spacing: .04em;
  padding: 3px 10px;
  border-radius: 999px;
  white-space: nowrap;
  border: 1px solid;
  line-height: 1.4;
}

/* type tag 多步骤 = 中性灰（保留） */
.task-type-tag {
  background: rgba(255,255,255,.05);
  color: rgba(255,255,255,.72);
  border-color: rgba(255,255,255,.10);
}

/* 表格难度 tag 三档上色 —— 与 filter chip 同色系，形成 filter↔result 闭环
 * alpha pattern: .10 bg / .26 border / .92 text
 * 同时覆盖 .pack-task-row（pack 详情展开里的 mini table），保证两边色系完全一致。 */
.run-task-row .task-tag.difficulty-low,
.pack-task-row .task-tag.difficulty-low {
  background: rgba(123,191,166,.10);
  color: rgba(123,191,166,.92);
  border-color: rgba(123,191,166,.26);
}
.run-task-row .task-tag.difficulty-medium,
.pack-task-row .task-tag.difficulty-medium {
  background: rgba(200,169,110,.10);
  color: rgba(200,169,110,.92);
  border-color: rgba(200,169,110,.26);
}
.run-task-row .task-tag.difficulty-high,
.pack-task-row .task-tag.difficulty-high {
  background: rgba(217,142,142,.10);
  color: rgba(217,142,142,.92);
  border-color: rgba(217,142,142,.28);
}

/* ── 类型 tag 色相区分 —— 低饱和度，统一 alpha pattern (.08 bg / .24 border /
 *    .82 text)，warm-dark palette 下读起来像"染了 hue 的灰"，不抢戏。 ── */

/* 创建 = 薄荷（success / 新增 语义） */
.task-type-tag.tt-create {
  background: rgba(123,191,166,.08);
  border-color: rgba(123,191,166,.24);
  color: rgba(123,191,166,.85);
}
/* 编辑 = 琥珀（modify / 主 accent） */
.task-type-tag.tt-edit {
  background: rgba(200,169,110,.10);
  border-color: rgba(200,169,110,.26);
  color: rgba(200,169,110,.92);
}
/* 删除 = desaturated rose（destructive 但 subtle，不像 #FF4D4F 那种警告红） */
.task-type-tag.tt-delete {
  background: rgba(217,142,142,.08);
  border-color: rgba(217,142,142,.24);
  color: rgba(217,142,142,.86);
}
/* 搜索 = cool slate-blue（信息/查询语义） */
.task-type-tag.tt-search {
  background: rgba(139,169,199,.08);
  border-color: rgba(139,169,199,.24);
  color: rgba(139,169,199,.86);
}

.detail-link-btn {
  display: inline-flex;
  align-items: center;
  gap: 6px;
}

/* ── Footer ── */
.run-dialog-foot {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 12px;
  padding: 16px 28px 22px;
  flex-shrink: 0;
  /* no border-top — 跟 wiz-step-foot 一致，spacing 自己分区 */
}

.run-foot-chips {
  display: flex;
  align-items: center;
  gap: 5px;
  flex-wrap: nowrap;
  flex: 1;
  min-width: 0;
  overflow: hidden;
}

.run-foot-placeholder {
  font-size: 0.8rem;
  color: var(--text-3);
}

.run-foot-right {
  display: flex;
  align-items: center;
  gap: 10px;
  flex-shrink: 0;
}

.run-foot-chips .selected-task-chip {
  padding: 2px 5px 2px 8px;
  font-size: 0.74rem;
  flex-shrink: 0;
}

.run-foot-chips .selected-task-chip .chip-remove {
  width: 13px;
  height: 13px;
  font-size: 10px;
}

/* ═══════════════════════════════════════════
   CATALOG PAGES — Task Zoo & App Zoo
   ═══════════════════════════════════════════ */

/* ── Hero stats ── */
.hero-stats {
  display: flex;
  align-items: center;
  gap: 12px;
  flex-shrink: 0;
}
.hero-stat {
  font-size: 0.85rem;
  color: var(--text-2);
}
.hero-stat strong {
  color: var(--text);
  font-size: 1.1rem;
  font-weight: 600;
}
.hero-stat-sep {
  width: 1px;
  height: 16px;
  background: var(--border);
}

/* ── Sidebar + Grid layout ── */
.catalog-layout {
  display: grid;
  grid-template-columns: 240px minmax(0, 1fr);
  gap: 24px;
  align-items: start;
}
@media (max-width: 860px) {
  .catalog-layout { grid-template-columns: 1fr; }
  .catalog-sidebar { display: none; }
}

/* ── Filter Sidebar ── */
.catalog-sidebar {
  position: sticky;
  top: 24px;
  display: flex;
  flex-direction: column;
  gap: 4px;
  background: var(--bg-raised);
  border: 1px solid var(--border);
  border-radius: var(--radius-md);
  padding: 16px;
}
.sidebar-search input {
  width: 100%;
  background: var(--bg-raised-2);
  border: 1px solid var(--border);
  border-radius: var(--radius-sm);
  color: var(--text);
  padding: 8px 12px;
  font-size: 0.84rem;
  outline: none;
  transition: border-color 120ms;
}
.sidebar-search input:focus {
  border-color: var(--accent);
}
.sidebar-search input::placeholder {
  color: var(--text-3);
}
.filter-group {
  padding-top: 12px;
  border-top: 1px solid var(--border);
  margin-top: 8px;
}
.filter-group:first-of-type {
  margin-top: 4px;
}
.filter-group-title {
  font-size: 0.72rem;
  font-weight: 600;
  color: var(--text-3);
  text-transform: uppercase;
  letter-spacing: 0.06em;
  margin: 0 0 8px;
}
.filter-checkbox {
  display: flex;
  align-items: center;
  gap: 8px;
  padding: 4px 0;
  font-size: 0.84rem;
  color: var(--text-2);
  cursor: pointer;
  transition: color 100ms;
}
.filter-checkbox:hover { color: var(--text); }
.filter-checkbox input[type="checkbox"] {
  accent-color: var(--accent);
  width: 14px;
  height: 14px;
  flex-shrink: 0;
}
.filter-count {
  margin-left: auto;
  font-size: 0.75rem;
  color: var(--text-3);
}
.sidebar-clear {
  margin-top: 12px;
  background: none;
  border: none;
  color: var(--accent);
  font-size: 0.8rem;
  cursor: pointer;
  padding: 6px 0;
  text-align: left;
}
.sidebar-clear:hover { text-decoration: underline; }

/* ── Task Catalog filter rows ── */

.tc-scene-row,
.tc-task-row {
  display: flex;
  align-items: center;
  flex-wrap: wrap;
  gap: 6px;
}
.tc-scene-row { margin-bottom: 10px; }
.tc-task-row  { margin-bottom: 20px; }

.tc-row-label {
  font-size: .78rem;
  font-weight: 600;
  color: var(--text-2);
  white-space: nowrap;
  margin-right: 8px;
  text-transform: none;
  letter-spacing: .01em;
}

.tc-search {
  background: var(--surface);
  border: 1px solid var(--border);
  border-radius: var(--radius-sm);
  color: var(--text);
  font-size: .82rem;
  font-family: var(--font);
  padding: 5px 12px;
  outline: none;
  width: 140px;
  transition: border-color .15s, background .15s;
}
.tc-search::placeholder { color: var(--text-3); }
.tc-search:hover { background: var(--surface-hover, var(--surface)); border-color: var(--border-strong, var(--border)); }
.tc-search:focus { border-color: var(--accent); background: var(--bg-raised); }

.tc-filter-divider {
  width: 1px;
  height: 16px;
  background: var(--border-strong, var(--border));
  flex-shrink: 0;
  margin: 0 6px;
}

/* Chip groups */
.tc-chip-group {
  display: flex;
  align-items: center;
  gap: 6px;
  flex-wrap: wrap;
}

/* Base chip: subtle default, clear hover, strong active */
.tc-chip {
  display: inline-flex;
  align-items: center;
  padding: 5px 12px;
  border-radius: 6px;
  font-size: .82rem;
  font-weight: 500;
  font-family: var(--font);
  cursor: pointer;
  user-select: none;
  border: 1px solid var(--border);
  background: var(--surface);
  color: var(--text-2);
  transition: background .12s, color .12s, border-color .12s;
  white-space: nowrap;
}
.tc-chip:hover {
  background: var(--bg-raised);
  color: var(--text);
  border-color: var(--border-strong, var(--border));
}
.tc-chip.active {
  background: var(--accent-bg);
  color: var(--accent);
  border-color: var(--accent-border);
  font-weight: 600;
}

/* Difficulty chips: semantic colors when active */
.tc-chip.tc-diff-low.active {
  background: rgba(74, 222, 128, .14);
  color: #4ade80;
  border-color: rgba(74, 222, 128, .28);
}
.tc-chip.tc-diff-medium.active {
  background: rgba(251, 146, 60, .14);
  color: #fb923c;
  border-color: rgba(251, 146, 60, .28);
}
.tc-chip.tc-diff-high.active {
  background: rgba(248, 113, 113, .14);
  color: #fca5a5;
  border-color: rgba(248, 113, 113, .28);
}
[data-theme="light"] .tc-chip.tc-diff-low.active {
  background: #dcfce7;
  color: #15803d;
  border-color: rgba(22, 101, 52, .25);
}
[data-theme="light"] .tc-chip.tc-diff-medium.active {
  background: #ffedd5;
  color: #c2410c;
  border-color: rgba(194, 65, 12, .25);
}
[data-theme="light"] .tc-chip.tc-diff-high.active {
  background: #fee2e2;
  color: #b91c1c;
  border-color: rgba(185, 28, 28, .25);
}

.tc-chip-empty {
  background: transparent;
  border-color: transparent;
  color: var(--text-2);
  cursor: default;
  pointer-events: none;
}
[data-theme="light"] .tc-chip-empty {
  color: rgba(0, 0, 0, .5);
}


/* Results count + sort */
.tc-results-count { font-size: .78rem; color: var(--text-2); white-space: nowrap; font-weight: 500; }
.tc-sort {
  background: var(--surface);
  border: 1px solid var(--border);
  border-radius: var(--radius-sm);
  color: var(--text-2);
  font-size: .78rem;
  font-family: var(--font);
  padding: 4px 8px;
  cursor: pointer;
  outline: none;
  transition: border-color .15s;
}
.tc-sort:hover { border-color: var(--border-strong, var(--border)); color: var(--text); }

/* App row */
.tc-app-strip {
  display: flex;
  align-items: center;
  gap: 6px;
  flex-wrap: wrap;
  margin-bottom: 10px;
}

/* ── Difficulty dots & badges ── */
.difficulty-dot {
  width: 8px;
  height: 8px;
  border-radius: 50%;
  flex-shrink: 0;
}
/* Catalog card chips — shared pill recipe, per-semantic morandi color.
   Base material (size / shape / padding / weight) identical across all
   chip types; only color family differs by semantic. All color families
   are from the spec's sanctioned palette (mint / amber / muted rose).
   Matches status-badge + filter-tab.active + chip-action pill family. */
.difficulty-badge,
.rl-badge {
  display: inline-flex;
  align-items: center;
  padding: 3px 10px;
  border-radius: 999px;
  font-size: 0.72rem;
  font-weight: 500;
  letter-spacing: 0.02em;
  border: 1px solid transparent;
  white-space: nowrap;
}
.difficulty-badge.diff-low {
  color: var(--morandi-mint);
  background: rgba(123,191,166,.12);
  border-color: rgba(123,191,166,.22);
}
.difficulty-badge.diff-medium {
  color: var(--accent);
  background: rgba(200,169,110,.12);
  border-color: rgba(200,169,110,.22);
}
.difficulty-badge.diff-high {
  color: #e8b0a9;
  background: rgba(232,176,169,.12);
  border-color: rgba(232,176,169,.26);
}
.difficulty-dot.diff-low    { background: var(--morandi-mint); }
.difficulty-dot.diff-medium { background: var(--accent); }
.difficulty-dot.diff-high   { background: #e8b0a9; }

/* RL — hollow amber pill: same color family as diff-medium but transparent
   fill, so a task with both "Medium" + "RL" chips reads as two distinct
   tags (filled vs. outlined) rather than two identical amber blobs. */
.rl-badge {
  color: var(--accent);
  background: transparent;
  border-color: rgba(200,169,110,.4);
}
.eval-only-badge {
  display: inline-flex;
  align-items: center;
  padding: 3px 10px;
  border-radius: 6px;
  font-size: 0.72rem;
  font-weight: 600;
  color: var(--text-2);
  background: var(--surface-hover);
  border: 1px solid var(--border-strong);
  letter-spacing: 0.02em;
}

/* ── Results header ── */
.catalog-results-header {
  display: flex;
  align-items: center;
  justify-content: space-between;
  margin-bottom: 16px;
}
.results-count {
  font-size: 0.84rem;
  color: var(--text-3);
}
.catalog-sort {
  background: var(--bg-raised);
  border: 1px solid var(--border);
  border-radius: var(--radius-sm);
  color: var(--text-2);
  padding: 6px 12px;
  font-size: 0.82rem;
}

/* ── Card grid ── */
.catalog-grid {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));
  gap: 16px;
}
.catalog-card-link {
  text-decoration: none;
  color: inherit;
  display: block;
  border-radius: var(--radius-md);
  transition: transform 120ms ease, box-shadow 120ms ease;
}
.catalog-card-link:hover {
  transform: translateY(-2px);
  box-shadow: 0 8px 24px rgba(0,0,0,.3);
}
.catalog-card {
  background: var(--bg-raised);
  border: 1px solid var(--border);
  border-radius: var(--radius-md);
  padding: 20px;
  display: flex;
  flex-direction: column;
  gap: 10px;
  height: 100%;
  transition: border-color 120ms;
}
.catalog-card-link:hover .catalog-card {
  border-color: var(--border-hover);
}
.card-top-row {
  display: flex;
  align-items: center;
  gap: 8px;
}
.card-title {
  font-size: 1.05rem;
  font-weight: 600;
  color: var(--text);
  margin: 0;
  line-height: 1.3;
}
.card-desc {
  font-size: 0.84rem;
  color: var(--text-2);
  line-height: 1.5;
  margin: 0;
  display: -webkit-box;
  -webkit-line-clamp: 2;
  -webkit-box-orient: vertical;
  overflow: hidden;
}
.card-footer {
  margin-top: auto;
  padding-top: 8px;
}
.card-chips {
  display: flex;
  flex-wrap: wrap;
  gap: 6px;
}
/* Neutral card chip — shares the base pill recipe with .difficulty-badge
   / .rl-badge, but uses the neutral white-alpha family (for non-semantic
   labels: scene name, app name, platform, task count). */
.card-chip {
  display: inline-flex;
  align-items: center;
  padding: 3px 10px;
  border-radius: 999px;
  font-size: 0.72rem;
  font-weight: 500;
  letter-spacing: 0.02em;
  color: var(--text-secondary);
  background: rgba(255,255,255,.05);
  border: 1px solid rgba(255,255,255,.10);
  white-space: nowrap;
}

/* ── Empty state ── */
.catalog-empty {
  text-align: center;
  padding: 64px 24px;
}
.catalog-empty .empty-icon {
  font-size: 2.4rem;
  margin-bottom: 12px;
}
.catalog-empty h3 {
  font-size: 1.1rem;
  color: var(--text);
  margin: 0 0 8px;
}


/* ── Detail page two-column layout ── */
.detail-two-col {
  display: grid;
  grid-template-columns: minmax(0, 1fr) 280px;
  gap: 24px;
  align-items: start;
}
@media (max-width: 860px) {
  .detail-two-col { grid-template-columns: 1fr; }
}
.detail-main { display: flex; flex-direction: column; gap: 20px; }
.detail-side { position: sticky; top: 24px; }
.detail-actions { padding: 0 24px 24px; }
.hero-badges {
  display: flex;
  align-items: center;
  gap: 8px;
  flex-wrap: wrap;
  flex-shrink: 0;
}
.app-detail-icon {
  font-size: 2.4rem;
  line-height: 1;
  margin-bottom: 4px;
}

/* ── Detail info rows ── */
.detail-info-list {
  display: flex;
  flex-direction: column;
  padding: 0 24px 24px;
}
.detail-info-row {
  display: flex;
  align-items: center;
  justify-content: space-between;
  padding: 10px 0;
  border-bottom: 1px solid var(--border);
  gap: 16px;
}
.detail-info-row:last-child { border-bottom: none; }
.detail-info-label {
  font-size: 0.84rem;
  color: var(--text-3);
  flex-shrink: 0;
}
.detail-info-value {
  font-size: 0.84rem;
  color: var(--text);
  text-align: right;
}
.detail-info-value code {
  font-family: var(--mono);
  font-size: 0.8rem;
  background: var(--bg-raised-2);
  padding: 2px 8px;
  border-radius: 4px;
}

/* ── Breadcrumb ── */
.breadcrumb {
  display: flex;
  align-items: center;
  gap: 8px;
  font-size: 0.82rem;
  margin-bottom: 16px;
}
.breadcrumb a {
  color: var(--text-2);
  text-decoration: none;
}
.breadcrumb a:hover { color: var(--accent); }
.breadcrumb-sep { color: var(--text-3); }
.breadcrumb-current { color: var(--text); font-weight: 500; }

/* ── Task detail page ── */
.task-hero-panel { padding: 32px; }
.task-hero-top {
  display: flex;
  align-items: flex-start;
  justify-content: space-between;
  gap: 16px;
  flex-wrap: wrap;
}
.task-hero-title { font-size: 1.6rem; font-weight: 700; margin: 0; }
.task-hero-desc {
  margin: 12px 0 0;
  color: var(--text-2);
  font-size: 0.92rem;
  line-height: 1.6;
}
.task-hero-actions {
  display: flex;
  gap: 10px;
  margin-top: 24px;
}
.task-hero-actions .primary-button,
.task-hero-actions .training-button,
.task-hero-actions .secondary-button {
  padding: 10px 24px;
  text-align: center;
}

/* ── Copyable row (Task ID, Goal Template) ── */
.copyable-row {
  display: inline-flex;
  align-items: center;
  gap: 8px;
}
.copyable-row .copy-btn {
  position: static;
  background: var(--bg-raised-2);
  border: 1px solid var(--border);
  color: var(--text-2);
  font-size: 0.7rem;
  font-weight: 500;
  padding: 2px 8px;
  border-radius: 4px;
  cursor: pointer;
  transition: all 120ms ease;
  font-family: var(--font-body);
  white-space: nowrap;
}
.copyable-row .copy-btn:hover {
  color: var(--text);
  border-color: var(--border-hover);
  background: var(--bg-raised-hover);
}

/* ── Related Tasks grid ── */
.related-tasks-grid {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(240px, 1fr));
  gap: 14px;
  padding: 0 24px 24px;
}
.related-task-card {
  display: flex;
  flex-direction: column;
  gap: 8px;
  padding: 18px;
  border: 1px solid var(--border);
  border-radius: var(--radius-md, 10px);
  background: var(--bg-raised);
  text-decoration: none;
  color: var(--text);
  transition: all 150ms ease;
}
.related-task-card:hover {
  border-color: var(--border-hover);
  background: var(--bg-raised-hover);
  transform: translateY(-2px);
  box-shadow: 0 6px 20px rgba(0,0,0,.2);
}
.related-task-badges {
  display: flex;
  gap: 6px;
}
.related-task-name {
  font-size: 0.95rem;
  font-weight: 600;
  margin: 0;
}
.related-task-desc {
  font-size: 0.8rem;
  color: var(--text-2);
  margin: 0;
  line-height: 1.5;
  display: -webkit-box;
  -webkit-line-clamp: 2;
  -webkit-box-orient: vertical;
  overflow: hidden;
}
.related-task-meta {
  display: flex;
  gap: 6px;
  flex-wrap: wrap;
  margin-top: auto;
}

/* ══════════════════════════════════════════
   RELEASE ENVIRONMENT: TOAST & ANIMATIONS
   ══════════════════════════════════════════ */

/* ── Toast 通知容器 ── */
.toast-container {
  position: fixed;
  bottom: 24px;
  right: 24px;
  z-index: 10000;
  display: flex;
  flex-direction: column;
  gap: 12px;
  pointer-events: none;
}

/* ── Toast 样式 ── */
.toast {
  display: flex;
  align-items: center;
  gap: 10px;
  padding: 14px 20px;
  background: var(--bg-raised-2);
  border: 1px solid var(--border-strong);
  border-radius: var(--radius-md);
  box-shadow: 0 8px 24px rgba(0,0,0,.4), 0 0 0 1px rgba(255,255,255,.05);
  font-size: 0.9rem;
  font-weight: 500;
  min-width: 280px;
  pointer-events: auto;
  opacity: 0;
  transform: translateX(400px);
  transition: all 300ms cubic-bezier(0.4, 0, 0.2, 1);
}

.toast.toast-show {
  opacity: 1;
  transform: translateX(0);
}

/* ── Toast 类型 ── */
.toast-success {
  background: linear-gradient(135deg, rgba(16,185,129,.12) 0%, rgba(16,185,129,.05) 100%);
  border-color: rgba(16,185,129,.3);
  color: #10b981;
}

.toast-error {
  background: linear-gradient(135deg, rgba(248,113,113,.12) 0%, rgba(248,113,113,.05) 100%);
  border-color: rgba(248,113,113,.3);
  color: #f87171;
}

.toast-icon {
  display: flex;
  align-items: center;
  justify-content: center;
  width: 20px;
  height: 20px;
  border-radius: 50%;
  font-size: 0.75rem;
  font-weight: 700;
  flex-shrink: 0;
}

.toast-success .toast-icon {
  background: rgba(16,185,129,.2);
  color: #10b981;
}

.toast-error .toast-icon {
  background: rgba(248,113,113,.2);
  color: #f87171;
}

/* ── 按钮 Spinner ── */
.btn-spinner {
  display: inline-block;
  width: 14px;
  height: 14px;
  border: 2px solid rgba(255,255,255,.25);
  border-top-color: #fff;
  border-radius: 50%;
  animation: spin 0.6s linear infinite;
}

@keyframes spin {
  to { transform: rotate(360deg); }
}

/* ── Danger 按钮样式增强 ── */
.primary-button[style*="--danger"] {
  background: linear-gradient(135deg, var(--danger) 0%, #dc2626 100%);
  border-color: var(--danger);
}

.primary-button[style*="--danger"]:hover {
  background: linear-gradient(135deg, #dc2626 0%, #b91c1c 100%);
  box-shadow: 0 4px 16px rgba(248,113,113,.3);
}

/* ── 确认对话框微调 ── */
.modal-narrow h2 {
  color: var(--text);
  font-weight: 600;
}

/* ── Danger 按钮（红色警告样式） ── */
.danger-button {
  background: linear-gradient(135deg, #f87171 0%, #dc2626 100%) !important;
  border: 1px solid rgba(248,113,113,.4) !important;
  color: #fff !important;
}

.danger-button:hover:not(:disabled) {
  background: linear-gradient(135deg, #dc2626 0%, #b91c1c 100%) !important;
  border-color: rgba(220,38,38,.6) !important;
  box-shadow: 0 4px 16px rgba(248,113,113,.4) !important;
}

.danger-button:disabled {
  opacity: 0.6;
  cursor: not-allowed;
}

/* ── INVITE CODE GATE ── */
.invite-overlay {
  position: fixed;
  inset: 0;
  z-index: 9999;
  display: none;
  align-items: center;
  justify-content: center;
  background: rgba(0,0,0,.72);
  backdrop-filter: blur(6px);
  -webkit-backdrop-filter: blur(6px);
  animation: invite-in .25s ease;
}
.invite-overlay-out {
  animation: invite-out .35s ease forwards;
}
@keyframes invite-in {
  from { opacity: 0; }
  to   { opacity: 1; }
}
@keyframes invite-out {
  from { opacity: 1; }
  to   { opacity: 0; }
}
/* Invite modal — verbatim port of DESIGN_SYSTEM.md §2.2 glass-panel recipe.
 * 3-stop gradient + backdrop-filter (saturate 170% / blur 22px / brightness
 * 1.03) + .11 border with .20 top highlight + 5-layer shadow + 22px radius.
 * This is the "lifted glass" treatment reserved for modals and auth cards. */
.invite-modal {
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: 12px;
  width: min(400px, calc(100vw - 40px));
  padding: 36px 32px 32px;
  position: relative;
  background: linear-gradient(180deg, rgba(255,255,255,.075) 0%,
                                       rgba(255,255,255,.03)  22%,
                                       rgba(255,255,255,.02)  100%);
  backdrop-filter:         saturate(170%) blur(22px) brightness(1.03);
  -webkit-backdrop-filter: saturate(170%) blur(22px) brightness(1.03);
  border: 1px solid rgba(255,255,255,.11);
  border-top-color: rgba(255,255,255,.2);
  border-radius: 22px;
  box-shadow:
    0 0 0 0.5px rgba(255,255,255,.05),
    0 22px 64px rgba(0,0,0,.42),
    0 8px 24px  rgba(0,0,0,.24),
    inset 0 1px 1px rgba(255,255,255,.09),
    inset 0 -1px 1px rgba(0,0,0,.12);
  animation: invite-modal-in .3s cubic-bezier(.16,1,.3,1);
}
/* Specular highlight stripe (spec §2.2) — the thin bright line across the
 * top of the card that makes it look "lit". */
.invite-modal::after {
  content: '';
  position: absolute;
  top: -1px; left: 18%; right: 18%; height: 1px;
  pointer-events: none;
  background: linear-gradient(90deg,
    transparent,
    rgba(200,169,110,.12) 24%,
    rgba(255,255,255,.35)  50%,
    rgba(200,169,110,.12) 76%,
    transparent);
}
@keyframes invite-modal-in {
  from { opacity: 0; transform: translateY(12px) scale(.97); }
  to   { opacity: 1; transform: translateY(0) scale(1); }
}
.invite-badge {
  font-size: .6rem;
  font-family: var(--mono);
  font-weight: 600;
  letter-spacing: .12em;
  text-transform: uppercase;
  color: rgba(200,169,110,.9);
  background: rgba(200,169,110,.1);
  border: 1px solid rgba(200,169,110,.2);
  padding: 3px 10px;
  border-radius: 999px;
}
.invite-title {
  margin: 0;
  font-size: 1.15rem;
  font-weight: 600;
  color: rgba(255,255,255,.92);
  text-align: center;
}
.invite-desc {
  margin: 0;
  font-size: .82rem;
  color: rgba(255,255,255,.45);
  text-align: center;
  line-height: 1.6;
}
.invite-input {
  width: 100%;
  box-sizing: border-box;
  padding: 10px 14px;
  background: rgba(255,255,255,.05);
  border: 1px solid rgba(255,255,255,.1);
  border-radius: 8px;
  color: rgba(255,255,255,.88);
  font-size: .88rem;
  font-family: var(--mono);
  letter-spacing: .06em;
  outline: none;
  transition: border-color .15s;
  text-align: center;
}
.invite-input:focus {
  border-color: rgba(120,180,255,.35);
  box-shadow: 0 0 0 3px rgba(120,180,255,.08);
}
.invite-input-error {
  border-color: rgba(255,100,100,.45) !important;
}
.invite-hint {
  margin: -4px 0 0;
  font-size: .75rem;
  color: rgba(255,100,100,.7);
}
.invite-btn {
  width: 100%;
  margin-top: 4px;
  padding: 10px;
  position: relative;
  overflow: hidden;
  background: linear-gradient(180deg, rgba(120,180,255,.13) 0%, rgba(120,180,255,.04) 100%);
  border: 1px solid rgba(120,180,255,.2);
  border-top-color: rgba(120,180,255,.32);
  border-radius: 8px;
  color: rgba(120,180,255,.95);
  font-size: .88rem;
  font-weight: 600;
  cursor: pointer;
  transition: all .2s cubic-bezier(.16,1,.3,1);
  box-shadow: 0 1px 2px rgba(0,0,0,.12), inset 0 1px 1px rgba(255,255,255,.08);
}
.invite-btn::before {
  content: '';
  position: absolute;
  top: 0; left: 15%; right: 15%; height: 1px;
  background: linear-gradient(90deg, transparent, rgba(120,180,255,.45) 50%, transparent);
  pointer-events: none;
}
.invite-btn:hover {
  background: linear-gradient(180deg, rgba(120,180,255,.2) 0%, rgba(120,180,255,.08) 100%);
  border-color: rgba(120,180,255,.32);
  border-top-color: rgba(120,180,255,.48);
  transform: translateY(-1px);
  box-shadow: 0 4px 16px rgba(0,0,0,.2), 0 8px 24px rgba(120,180,255,.07), inset 0 1px 2px rgba(255,255,255,.12);
}

/* ── BENCHMARK: PERFORMANCE BREAKDOWN TABLES ── */

.breakdown-table-wrap {
  overflow-x: auto;
  margin: 24px 0;
  -webkit-overflow-scrolling: touch;
}

.breakdown-table {
  width: 100%;
  border-collapse: separate;
  border-spacing: 0;
  border: 1px solid var(--border);
  border-radius: 8px;
  overflow: hidden;
  font-variant-numeric: tabular-nums;
  table-layout: auto;
}

.breakdown-table thead {
  background: var(--surface);
}

.breakdown-table thead th {
  padding: 12px 16px;
  text-align: center;
  font-size: 0.75rem;
  font-weight: 600;
  color: var(--text);
  border-bottom: 1px solid var(--border-strong);
  white-space: nowrap;
  line-height: 1.4;
  letter-spacing: 0.02em;
  text-transform: none;
}

.breakdown-agent-col {
  text-align: left !important;
  min-width: 220px;
  max-width: 220px;
  width: 220px;
  position: sticky;
  left: 0;
  background: var(--surface);
  z-index: 20;
  box-shadow: 2px 0 4px rgba(0, 0, 0, 0.08);
}

.breakdown-overall-col {
  min-width: 90px;
  max-width: 90px;
  width: 90px;
  background: var(--warm-bg) !important;
  font-weight: 700;
  position: sticky;
  left: 220px;
  z-index: 15;
}

.breakdown-scene-col,
.breakdown-diff-col {
  min-width: 90px;
  max-width: 90px;
  width: 90px;
}

.breakdown-scene-col .scene-icon {
  display: inline-block;
  font-size: 0.875rem;
  margin-right: 2px;
  vertical-align: middle;
}

.breakdown-table tbody tr {
  transition: background-color 0.1s ease;
}

.breakdown-table tbody tr:hover {
  background: var(--surface-hover);
}

.breakdown-table tbody tr:not(:last-child) td {
  border-bottom: 1px solid var(--border);
}

.breakdown-agent-cell {
  padding: 12px 16px;
  text-align: left;
  position: sticky;
  left: 0;
  background: var(--bg-raised);
  z-index: 15;
  border-right: 1px solid var(--border);
  box-shadow: 2px 0 4px rgba(0, 0, 0, 0.08);
}

.breakdown-table tbody tr:hover .breakdown-agent-cell {
  background: var(--surface-hover);
}

.breakdown-agent-cell strong {
  display: block;
  font-size: 0.875rem;
  font-weight: 600;
  color: var(--text);
  margin-bottom: 3px;
  line-height: 1.4;
}

.agent-org {
  font-size: 0.75rem;
  color: var(--text-2);
  line-height: 1.4;
}

.breakdown-score-cell {
  padding: 8px 10px;
  text-align: center;
  vertical-align: middle;
  font-variant-numeric: tabular-nums;
}

.breakdown-overall-cell {
  background: var(--warm-bg);
  font-size: 0.9375rem;
  font-weight: 700;
  color: var(--warm);
  position: sticky;
  left: 220px;
  z-index: 10;
  box-shadow: 2px 0 4px rgba(0, 0, 0, 0.08);
}

.score-value {
  font-size: 0.8125rem;
  font-weight: 600;
  color: var(--text);
  margin-bottom: 1px;
  line-height: 1.3;
}

.score-detail {
  font-size: 0.625rem;
  color: var(--text-3);
  line-height: 1.2;
}

/* Simplified color scheme - only highlight 100%
   深色主题: 普通格子透明(继承行背景), 100%格子用金色半透明 */
.breakdown-score-cell[data-score] {
  background: transparent;
}

.breakdown-score-cell[data-score="100"] {
  background: rgba(251, 191, 36, 0.1);
}

.breakdown-score-cell[data-score="100"] .score-value {
  color: #fbbf24;
  font-weight: 700;
}

.breakdown-empty {
  color: var(--text-3);
  font-size: 1rem;
  font-weight: 300;
}

/* 浅色主题覆盖 */
[data-theme="light"] .breakdown-score-cell[data-score] {
  background: #ffffff;
}
[data-theme="light"] .breakdown-score-cell[data-score="100"] {
  background: #fef6e8;
}
[data-theme="light"] .breakdown-score-cell[data-score="100"] .score-value {
  color: #92400e;
  font-weight: 700;
}
[data-theme="light"] .breakdown-empty {
  color: #d1d5db;
}
[data-theme="light"] .score-detail {
  color: #9ca3af;
}

/* Compact variant for difficulty table */
.breakdown-table-compact {
  max-width: 900px;
}

.breakdown-table-compact .breakdown-agent-col {
  min-width: 220px;
}

.breakdown-table-compact .breakdown-diff-col {
  min-width: 90px;
}

/* ── Unified table with higher information density ── */

.breakdown-table-unified thead tr:first-child th {
  border-bottom: 1px solid var(--border);
  padding-bottom: 8px;
}

.breakdown-table-unified thead tr:last-child th {
  padding-top: 8px;
  padding-bottom: 8px;
}

.breakdown-category-header {
  background: rgba(120, 180, 255, 0.06);
  color: var(--text);
  font-size: 0.75rem;
  font-weight: 700;
  text-transform: uppercase;
  letter-spacing: 0.03em;
  padding: 10px 12px;
  border-bottom: 1px solid var(--border-strong);
  z-index: 10;
  position: relative;
}

[data-theme="light"] .breakdown-category-header {
  background: #e8eef5;
  color: #1f2937;
  border-bottom: 1px solid #d1d5db;
}

/* ═══════════════════════════════════════════════════════════════════
   LIGHT MODE — Warm paper design
   ═══════════════════════════════════════════════════════════════════
   Palette philosophy: this is NOT dark-mode inverted. It's a warm paper
   theme designed for light mode specifically:
   - Base: warm off-white (cream-biased), not cold gray
   - Cards: pure white on the cream base (floating "paper cards")
   - Sidebar: slightly deeper cream (reads as a "panel" of the document)
   - Text: warm dark #2a2823, not cold slate
   - Shadows: warm-toned rgba(30,25,18, ...) not gray
   - Amber: #a8884c for text (darker for contrast on white), brand
     amber .12 for fills (same as dark mode)
   - Morandi accents (mint/blue/coral/sage/violet) stay the same —
     they work on both themes, being muted to begin with. */

/* ── Page substrate ── */

/* Console shell — clean cool bg, NO amber atmospheric wash (light mode
 * gets its ambient warmth from the Current chip halo, not the bg). */
[data-theme="light"] .console-shell {
  background: var(--bg);
}
[data-theme="light"] .console-shell::before { display: none; }

/* ── Sidebar — cool gray panel, distinct from page bg ── */

[data-theme="light"] .sidebar {
  background: #f4f4f5;                           /* zinc-100 */
  border-right: 1px solid #e4e4e7;              /* zinc-200 */
  backdrop-filter: none;
  -webkit-backdrop-filter: none;
  box-shadow: none;
}
[data-theme="light"] .brand-name { color: #09090b; }
[data-theme="light"] .brand-sub  { color: #71717a; }
[data-theme="light"] .brand-logo-tile {
  background:
    linear-gradient(180deg, #ffffff 0%, #f4ead8 100%);
  box-shadow:
    inset 0 1px 0 rgba(255,255,255,.95),
    inset 0 -1px 0 rgba(140,108,68,.18),
    0 2px 8px rgba(140,108,68,.22);
}
[data-theme="light"] .brand-logo-tile::before { border-color: rgba(180,140,90,.45); }
[data-theme="light"] .brand-logo { opacity: 1; filter: none; }
[data-theme="light"] .nav-caption { color: #71717a; }          /* neutral gray, no amber */
[data-theme="light"] .side-link { color: #3f3f46; }
[data-theme="light"] .side-link:hover {
  background: #e4e4e7;                          /* zinc-200 */
  color: #09090b;
  border-color: transparent;
}
[data-theme="light"] .side-link.active {
  background: #ffffff;                          /* white chip on gray sidebar */
  color: #09090b;
  border-color: #e4e4e7;
  box-shadow:
    inset 0 1px 0 rgba(255,255,255,1),
    0 1px 3px rgba(0,0,0,.06),
    0 2px 8px rgba(0,0,0,.04);
}
[data-theme="light"] .side-icon { opacity: .65; }

/* Sidebar QS mini-card */
[data-theme="light"] .qs-card {
  background: linear-gradient(180deg, rgba(200,169,110,.08) 0%, rgba(255,255,255,.4) 100%);
  border: 1px solid rgba(200,169,110,.28);
}
[data-theme="light"] .qs-card::before {
  background: linear-gradient(90deg, transparent, rgba(200,169,110,.6) 50%, transparent);
}
/* Sidebar QS card — neutral gray, not amber */
[data-theme="light"] .qs-card {
  background: #ffffff;
  border: 1px solid #e4e4e7;
}
[data-theme="light"] .qs-card::before { display: none; }       /* no amber top stripe */
[data-theme="light"] .progress-rail { background: #e4e4e7; }
[data-theme="light"] .progress-rail span {
  background: linear-gradient(90deg, #27272a 0%, #09090b 100%);  /* black progress, not amber */
}
[data-theme="light"] .qs-step-num { color: #71717a; }           /* gray kicker */
[data-theme="light"] .qs-step-name { color: #09090b; }
[data-theme="light"] .qs-fraction { color: #71717a; }
[data-theme="light"] .workspace-label { color: #71717a; }       /* gray kicker */
[data-theme="light"] .qs-continue { color: #09090b; font-weight: 600; }
[data-theme="light"] .qs-continue:hover { color: #3f3f46; }

/* Sidebar user footer */
[data-theme="light"] .user-card {
  background: #ffffff;
  border: 1px solid #e4e4e7;
}
[data-theme="light"] .user-name  { color: #09090b; }
[data-theme="light"] .user-email { color: #71717a; }
[data-theme="light"] .user-logout-btn {
  background: #fafafa;
  color: #09090b;
  border: 1px solid #d4d4d8;
}
[data-theme="light"] .user-logout-btn:hover {
  background: #f4f4f5;
  border-color: #a1a1aa;
}

/* Hamburger (narrow-viewport drawer toggle) */
[data-theme="light"] .sidebar-toggle {
  background: rgba(255,255,255,.92);
  border: 1px solid #d4d4d8;
  color: #09090b;
}
[data-theme="light"] .sidebar-toggle:hover {
  background: #ffffff;
  border-color: #a1a1aa;
}

/* ── Typography ── */

[data-theme="light"] .dash-greeting h1 { color: #09090b; }
[data-theme="light"] .dash-greeting-sub { color: #52525b; }
[data-theme="light"] .page-hero h1,
[data-theme="light"] .page-hero-title,
[data-theme="light"] .dashboard-hero h1,
[data-theme="light"] .panel-header h1,
[data-theme="light"] .panel-header h2 { color: #09090b; }
[data-theme="light"] .page-hero p,
[data-theme="light"] .dashboard-hero p { color: #52525b; }
[data-theme="light"] .page-kicker,
[data-theme="light"] .dash-section-kicker { color: #71717a; }  /* gray kicker */

/* ── Quick Start module (.ob) ── */

/* OUTER FRAME — very subtle lavender tint, ~95% white. The purple is a
 * HINT not a wash. Reference images (user's 64/65) have this "almost
 * white with a whisper of lavender" quality that I over-saturated before.
 * Radial alphas dropped 3-4x, base gradient dropped to near-white. */
[data-theme="light"] .ob {
  background:
    radial-gradient(ellipse at 22% 15%, rgba(167,139,250,.10) 0%, transparent 50%),
    radial-gradient(ellipse at 85% 55%, rgba(167,139,250,.07) 0%, transparent 55%),
    radial-gradient(ellipse at 50% 100%, rgba(167,139,250,.06) 0%, transparent 60%),
    linear-gradient(135deg, #fafaff 0%, #f6f4fc 50%, #f8f6fd 100%);
  border: 1px solid rgba(167,139,250,.14);
  box-shadow:
    inset 0 1px 0 rgba(255,255,255,.8),
    0 1px 2px rgba(0,0,0,.03),
    0 10px 28px -14px rgba(167,139,250,.15);
}
/* Quick Start module header — gray kicker + black progress (no amber) */
[data-theme="light"] .ob-title-row h2 { color: #71717a; }
[data-theme="light"] .ob-progress-text { color: #71717a; }
[data-theme="light"] .ob-progress-rail { background: #e4e4e7; }
[data-theme="light"] .ob-progress-rail span {
  background: linear-gradient(90deg, #27272a 0%, #09090b 100%);
}

/* Done chip — MORE TRANSPARENT so lavender frame dominates. In light
 * mode, non-current chips should recede; focus belongs to Current.
 * Lower fill alpha + softer border + faded text below makes Done chips
 * read as "done, quiet background" not "equally prominent card". */
[data-theme="light"] .ob-step.is-done {
  background: rgba(255,255,255,.38);
  backdrop-filter: blur(16px) saturate(1.4);
  -webkit-backdrop-filter: blur(16px) saturate(1.4);
  border: 1px solid rgba(255,255,255,.55);
  box-shadow:
    inset 0 1px 0 rgba(255,255,255,.7);
}
/* Locked chip — even more transparent, most faded (not-yet-available) */
[data-theme="light"] .ob-step.is-locked {
  background: rgba(255,255,255,.18);
  backdrop-filter: blur(12px) saturate(1.2);
  -webkit-backdrop-filter: blur(12px) saturate(1.2);
  border: 1px solid rgba(255,255,255,.32);
  box-shadow:
    inset 0 1px 0 rgba(255,255,255,.5);
}
/* Current chip — solid WHITE floating above the purple frame.
 * Key insight: on a purple bg, SOLID white is the maximum contrast =
 * strongest focal signal. Other chips are translucent (let purple show
 * through). This chip is opaque = "I'm the brightest thing here". Matches
 * the reference "Customer Analytics" row in user's image 65. Full liquid
 * glass material: gradient fill, backdrop-filter for blur behind, triple-
 * layer purple halo for selected glow, inset highlight + drop shadow. */
[data-theme="light"] .mc-cell {
  background: linear-gradient(180deg, #ffffff 0%, #fdfcff 100%);
  backdrop-filter: blur(20px) saturate(1.5);
  -webkit-backdrop-filter: blur(20px) saturate(1.5);
  /* Uniform thin border — slightly purple-tinted, no top-color override
   * (was causing the hard white band at chip top). */
  border: 1px solid rgba(200,190,235,.55);
  box-shadow:
    inset 0 -1px 0 rgba(167,139,250,.06),
    /* Halo — only blurred layers (no hard 0-blur ring which rendered as
     * a visible double-border outline). White inner, lavender outer. */
    0 0 24px 0 rgba(250,248,255,.85),
    0 0 48px 12px rgba(235,228,255,.40),
    /* Neutral drop shadow */
    0 8px 24px -6px rgba(0,0,0,.14),
    0 2px 6px rgba(0,0,0,.06);
}
/* Internal glow — subtle purple top sheen for "glass being lit" feel */
[data-theme="light"] .mc-cell__glow {
  background: linear-gradient(180deg,
    rgba(167,139,250,.08) 0%,
    transparent 100%);
}
/* Specular highlight — HIDDEN in light mode. The stripe is a dark-mode
 * technique (bright line on dark bg = contrast glint). On light/purple
 * bg it just stacks with the top border + inset highlight to form an
 * awkward hard white band. Light mode's focus signal comes from the
 * halo + border + drop shadow, no stripe needed. */
[data-theme="light"] .mc-cell::after {
  display: none;
}

/* Rim lights on neighbors — disabled in light mode (neighbors are already
 * translucent showing the purple bg, adding rim would double-tint) */
[data-theme="light"] .ob-step:has(+ .mc-cell)::before { box-shadow: none; }
[data-theme="light"] .mc-cell + .ob-step::before { box-shadow: none; }

/* Chip text — non-current chips faded significantly so Current pops.
 * Done text sits around 40-55% brightness of Current; Locked around
 * 25-35%. Creates clear 3-tier visual hierarchy per image reference. */
[data-theme="light"] .zone-num--done   { color: #71717a; }     /* was #27272a, now dimmer */
[data-theme="light"] .zone-num--active { color: #6b4dd4; }     /* stays bright purple */
[data-theme="light"] .zone-num--locked { color: #c4c4c9; }     /* even fainter */
[data-theme="light"] .kicker-step--done   { color: #a1a1aa; }  /* was #52525b */
[data-theme="light"] .kicker-step--locked { color: #c4c4c9; }
[data-theme="light"] .kicker-step--done::before   { color: #a1c7b5; }  /* faded mint check */
[data-theme="light"] .kicker-step--locked::before { color: #c4c4c9; }
[data-theme="light"] .ob-step.is-done .ob-step-body strong { color: #71717a; }  /* was #09090b → much dimmer */
[data-theme="light"] .ob-step.is-locked .ob-step-body strong { color: #a1a1aa; }
[data-theme="light"] .mc-cell__pill { color: #6b4dd4; }       /* darker purple for contrast on light lavender bg */
[data-theme="light"] .mc-cell__title { color: #09090b; }
[data-theme="light"] .mc-cell__desc  { color: #27272a; }
[data-theme="light"] .mc-cell__bullets { color: #27272a; }
[data-theme="light"] .mc-cell__bullets li::before { color: rgba(200,169,110,.85); }
[data-theme="light"] .mc-cell__bullets code {
  background: rgba(0,0,0,.04);
  border-color: rgba(0,0,0,.08);
}

/* CTA glass pill — dark-background premium feel for contrast even in light mode */
[data-theme="light"] .mc-cta {
  color: #fafafa;
  background: linear-gradient(135deg,
    #1a1a1e 0%,
    #0f0f13 50%,
    #18181b 100%);
  border-color: rgba(0,0,0,.30);
  border-top-color: rgba(255,255,255,.06);
  box-shadow:
    0 2px 12px rgba(0,0,0,.18),
    inset 0 1px 1px rgba(255,255,255,.10),
    inset 0 -1px 1px rgba(0,0,0,.30);
}
[data-theme="light"] .mc-cta:hover {
  background: linear-gradient(135deg, #252529 0%, #18181b 50%, #1f1f23 100%);
  border-color: rgba(0,0,0,.45);
  transform: translateY(-1px);
}
[data-theme="light"] .mc-cta::before {
  background: linear-gradient(108deg, transparent 35%, rgba(255,255,255,.14) 50%, transparent 65%);
}

/* ── Metric + Action cards ── */

[data-theme="light"] .dash-metric,
[data-theme="light"] .dash-action-card {
  background: #ffffff;
  border: 1px solid #e4e4e7;                    /* zinc-200 */
  border-top-color: #e4e4e7;
  box-shadow:
    0 1px 2px rgba(0,0,0,.04),
    inset 0 1px 0 rgba(255,255,255,1);
}
[data-theme="light"] .dash-metric-val { color: #09090b; }
[data-theme="light"] .dash-action-card strong { color: #09090b; }
[data-theme="light"] .dash-action-card small { color: #52525b; }
[data-theme="light"] .dash-action-icon { color: #52525b; }

/* Boost metric label alphas from .72 → .92 (morandi colors need more
 * alpha on white bg than on dark to maintain perceived brightness). */
[data-theme="light"] .dash-metric:nth-child(1) .dash-metric-lbl { color: rgba(93,154,126,.95); }
[data-theme="light"] .dash-metric:nth-child(2) .dash-metric-lbl { color: rgba(100,150,200,.95); }
[data-theme="light"] .dash-metric:nth-child(3) .dash-metric-lbl { color: rgba(201,122,111,.95); }
[data-theme="light"] .dash-metric:nth-child(4) .dash-metric-lbl { color: rgba(135,165,115,.95); }

/* Action card icons get the same alpha boost for light-mode readability */
[data-theme="light"] .dash-action-card:nth-child(1) .dash-action-icon { color: rgba(100,150,200,.95); }
[data-theme="light"] .dash-action-card:nth-child(2) .dash-action-icon { color: rgba(168,136,76,.95); }
[data-theme="light"] .dash-action-card:nth-child(3) .dash-action-icon { color: rgba(93,154,126,.95); }
[data-theme="light"] .dash-action-card:nth-child(4) .dash-action-icon { color: rgba(139,107,245,.95); }

[data-theme="light"] .dash-action-card:nth-child(1) .dash-action-link { color: rgba(100,150,200,.95); }
[data-theme="light"] .dash-action-card:nth-child(2) .dash-action-link { color: rgba(168,136,76,.95); }
[data-theme="light"] .dash-action-card:nth-child(3) .dash-action-link { color: rgba(93,154,126,.95); }
[data-theme="light"] .dash-action-card:nth-child(4) .dash-action-link { color: rgba(139,107,245,.95); }

/* ── Activity section + table ── */

[data-theme="light"] .dash-activity-header h2 { color: #09090b; }
[data-theme="light"] .dash-activity {
  background: #ffffff;
  border: 1px solid #e4e4e7;
  border-radius: 12px;
}
[data-theme="light"] table { background: #ffffff; }
[data-theme="light"] th {
  background: #f4f4f5;                          /* zinc-100 */
  color: #52525b;
}
[data-theme="light"] td { color: #27272a; }
[data-theme="light"] th,
[data-theme="light"] td { border-bottom-color: #e4e4e7; }
[data-theme="light"] .table-wrap { border-color: #e4e4e7; }

/* ── Buttons ── */

[data-theme="light"] .secondary-button,
[data-theme="light"] .training-button {
  background: #ffffff;
  color: #09090b;
  border: 1px solid #d4d4d8;                    /* zinc-300 */
}
[data-theme="light"] .secondary-button:hover,
[data-theme="light"] .training-button:hover {
  background: #f4f4f5;
  border-color: #a1a1aa;                        /* zinc-400 */
}

/* Neutral status pill (EVAL / RL badges) */
[data-theme="light"] .status-pill.neutral {
  background: #f4f4f5;
  color: #27272a;
  border: 1px solid #e4e4e7;
}

.breakdown-table-unified .breakdown-scene-col,
.breakdown-table-unified .breakdown-diff-col {
  min-width: 90px;
  max-width: 90px;
  width: 90px;
  font-size: 0.75rem;
  padding: 10px 8px;
  font-weight: 600;
}

.breakdown-table-unified .breakdown-scene-col .scene-icon {
  font-size: 0.875rem;
  margin-right: 2px;
  vertical-align: middle;
}

.breakdown-compact {
  padding: 8px 10px;
}

.breakdown-compact .score-value {
  font-size: 0.875rem;
  font-weight: 600;
  margin-bottom: 2px;
}

.breakdown-compact .score-detail {
  font-size: 0.6875rem;
}

/* ═══════════════════════════════════════════════════════════════════════════
   RUN WIZARD — 5-step flow (1=平台 / 2=Task scope / 3=Exec / 4=Review / 5=SDK)
   Lives inside #create-run-dialog. Stepper语言沿用 dashboard zone-num 配色，
   组件风格沿用站内既有 token：filter-tab、glass pill、§2.3 panel.
   ═══════════════════════════════════════════════════════════════════════════ */

/* ── Stepper：4-segment bar + label ──
 * 来源：搜索结果建议的"thin segmented progress bar with contextual labels"
 * pattern（Walmart / Monarch 等用），替代传统"圆+连线"那种"线条堆砌"造型。
 *
 * Each step = 一根 2px 短 bar + 一行 mono label。无圆、无连线、无横分隔线。
 * 已走过的段 amber 实色，未到的段中性灰；progress bar 自己就告诉你在哪。 */
.wizard-stepper {
  display: grid;
  grid-template-columns: repeat(3, 1fr);          /* 4→3：去掉执行配置那一步 */
  column-gap: 16px;
  padding: 22px 28px 18px;
  flex-shrink: 0;
}
.wiz-step {
  display: flex;
  flex-direction: column;
  align-items: stretch;
  gap: 12px;                                     /* bar→label 的 gap 也增加 */
  flex: none;
}
.wiz-step::before {
  content: '';
  height: 3px;                                   /* 2→3，更"实体"，不再像悬浮线 */
  border-radius: 2px;
  background: rgba(255,255,255,.08);
  transition: background .3s;
}
.wiz-step.is-done::before,
.wiz-step.is-active::before {
  background: var(--accent);                     /* 已走过 / 当前 = amber 实色 */
}

/* Hide legacy circle + line elements（HTML 兼容性保留 DOM，CSS 隐藏） */
.wiz-step-circle { display: none; }
.wiz-step-line   { display: none; }

/* Label —— mono kicker 风格，状态影响颜色 */
.wiz-step-label {
  font-family: 'IBM Plex Mono', monospace;
  font-size: 10px;
  letter-spacing: .14em;
  text-transform: uppercase;
  font-weight: 600;
  white-space: nowrap;
  transition: color .25s;
  display: block;
  text-align: left;
}
.wiz-step.is-locked .wiz-step-label {
  color: rgba(255,255,255,.36);
}
.wiz-step.is-active .wiz-step-label {
  color: var(--accent);                          /* 当前步骤 amber 标签 */
}
.wiz-step.is-done .wiz-step-label {
  color: rgba(255,255,255,.55);                  /* 已走过：灰，比 locked 略亮 */
}

/* ── Step body (shared inner layout per step) ── */
.run-dialog .modal-step {
  display: flex;
  flex-direction: column;
  flex: 1;
  min-height: 0;
  overflow: hidden;
}
.wiz-step-body {
  flex: 1;
  min-height: 0;
  overflow-y: auto;
  padding: 26px 28px 20px;
}
/* Display-grade title — premium dark modal 用更大字号 + 更深 tracking 建立
 * 视觉重心。Geist 在中文混排里读 weight 600 + tracking -.025 偏冷峻。 */
.wiz-step-title {
  font-size: 1.5rem;                           /* 24px display */
  font-weight: 600;
  margin: 0 0 8px;
  color: var(--text);
  letter-spacing: -0.025em;
  line-height: 1.25;
}
.wiz-step-subtitle {
  font-size: 0.86rem;
  color: var(--text-3);
  margin: 0 0 24px;
  line-height: 1.6;
  max-width: 640px;                            /* 限宽，避免在 1200 modal 里拉太长 */
}
.wiz-step-foot {
  display: flex;
  justify-content: space-between;
  align-items: center;
  padding: 16px 28px 22px;
  flex-shrink: 0;
  gap: 12px;
  /* no border-top —— spacing 自己负责分区 */
}

/* ── Wizard navigation buttons ──
 * Next 走 settings 页 .theme-toggle / .filter-tab 同款 chrome glass pill：
 * 中性玻璃底 + 999px 胶囊 + backdrop-filter blur。归到"chrome 控件"家族，
 * 不再走 amber 实色（那个太"动作 CTA"，跟 instrument-grade modal 调性
 * 不合）。Back 保持透明 ghost，2 级 hierarchy 自然形成。 */
.wiz-nav-next {
  display: inline-flex;
  align-items: center;
  gap: 9px;
  padding: 9px 20px;
  border-radius: 999px;
  background:
    linear-gradient(135deg,
      rgba(255,255,255,.12) 0%,
      rgba(255,255,255,.05) 50%,
      rgba(255,255,255,.10) 100%);
  backdrop-filter: blur(12px);
  -webkit-backdrop-filter: blur(12px);
  border: 1px solid rgba(255,255,255,.18);
  border-top-color: rgba(255,255,255,.32);             /* 顶边强化，光从上来 */
  color: var(--text);                                  /* 主色文字，可点感清楚 */
  font-size: 0.86rem;
  font-weight: 500;
  cursor: pointer;
  transition: background .15s, border-color .15s, transform .2s cubic-bezier(.16,1,.3,1), box-shadow .15s;
  font-family: inherit;
  /* 顶部 1px 内 specular highlight（光打在金属边）+ 外 drop shadow（浮起） */
  box-shadow:
    inset 0 1px 0 rgba(255,255,255,.14),
    0 4px 12px rgba(0,0,0,.22);
}
.wiz-nav-next:hover {
  background:
    linear-gradient(135deg,
      rgba(255,255,255,.18) 0%,
      rgba(255,255,255,.08) 50%,
      rgba(255,255,255,.14) 100%);
  border-color: rgba(255,255,255,.28);
  border-top-color: rgba(255,255,255,.45);
  transform: translateY(-1px);
  box-shadow:
    inset 0 1px 0 rgba(255,255,255,.20),
    0 6px 18px rgba(0,0,0,.28);
}
.wiz-nav-next:active {
  transform: translateY(0);
  box-shadow:
    inset 0 1px 0 rgba(255,255,255,.10),
    0 2px 8px rgba(0,0,0,.20);
}
.wiz-nav-next:disabled {
  opacity: .35;
  cursor: not-allowed;
  transform: none;
  box-shadow: inset 0 1px 0 rgba(255,255,255,.06);
}
/* Wizard nav 按钮 SVG 默认隐藏（"下一步""发布任务"等按钮要纯文字胶囊） */
.wiz-nav-next svg { display: none; }
/* 但 result-dialog 里的"前往详情页"按钮要保留前置 copy/share icon */
.result-dialog .wiz-nav-next svg {
  display: inline-block;
  width: 14px; height: 14px;
  flex-shrink: 0;
  opacity: .85;
}

.wiz-nav-back {
  display: inline-flex;
  align-items: center;
  gap: 6px;
  padding: 10px 14px 10px 10px;
  border-radius: 8px;
  background: transparent;
  color: var(--text);                  /* secondary → primary 白，跟"下一步"按钮文字同档 */
  font-size: 0.86rem;
  font-weight: 500;
  border: none;
  cursor: pointer;
  transition: color .15s, background .15s;
  font-family: inherit;
}
.wiz-nav-back:hover {
  background: rgba(255,255,255,.05);
}
.wiz-nav-back svg {
  width: 14px; height: 14px;
  flex-shrink: 0;
  opacity: .85;
  transition: transform .2s cubic-bezier(.16,1,.3,1);
}
.wiz-nav-back:hover svg {
  transform: translateX(-2px);          /* hover 时小箭头往左移一点，给"返回"方向感 */
  opacity: 1;
}

/* ── STEP 1: Platform picker ── */
/* 2×2 grid 给每张 surface card 更多空间。每卡含 Lucide icon + 名称 + 一句描述
 * + meta。Selected state 复用 nav-link active 的琥珀渐变 + 边框。 */
.surface-grid {
  display: grid;
  grid-template-columns: repeat(2, 1fr);
  gap: 16px;
}
/* Instrument-grade card — neutral warm panel, no decoration on body.
 * Index number in top-right corner gives "data record" feel. Selected =
 * amber border + LED corner indicator only. Amber never fills surface. */
.surface-card {
  position: relative;
  background: var(--bg-modal-panel);
  border: 1px solid rgba(255,255,255,.08);
  border-radius: 14px;
  padding: 22px 22px 20px;
  cursor: pointer;
  transition: border-color .15s, background .15s, transform .2s cubic-bezier(.16,1,.3,1);
  display: flex;
  flex-direction: column;
  min-height: 180px;
  text-align: left;
}
.surface-card:hover {
  background: var(--bg-modal-hover);
  border-color: rgba(255,255,255,.18);
  transform: translateY(-1px);
}
/* Selected — border beam 旋转 + 卡片呼吸渐变同 4s 周期：
 *   - beam: 4s linear，刚性的旋转扫过
 *   - breathe: 4s ease-in-out，有机的吸气-呼气节奏
 * 两个动画时长一致但 timing function 不同 —— 视觉上 beam 是"机械扫描"，
 * 呼吸是"生命迹象"。共同表达"selected 卡片是活的"。 */
/* Selected — 卡片内 + 卡片边 双动效联动：
 *   - 外圈 (::before): conic-gradient beam 旋转扫过 perimeter
 *   - 内圈 (background): radial-gradient 小光晕，中心位置由 sin/cos
 *     从 --beam-angle 计算 → 跟着 beam 的 peak 同步在卡内"流转"
 * 父元素持有动画一次，::before 通过 @property inherits 自动继承同一时钟。
 * 320deg = beam peak 在 conic 里的 stop 位置，保证内外光"同相位"。 */
/* Selected —— amber wash 在卡身上呼吸（linear-gradient 同色起止 =
 * 整张卡均匀填充，alpha 从 --card-breath 取，GPU 合成）。
 * 5s ease-in-out，不与 beam 4s 同步，保持各自节奏。 */
.surface-card.is-selected {
  background:
    linear-gradient(rgba(200,169,110, var(--card-breath)),
                    rgba(200,169,110, var(--card-breath))),
    var(--bg-modal-panel);
  border-color: rgba(200,169,110,.22);
  overflow: hidden;
  animation:
    pack-beam-rotate 4s linear infinite,
    card-breathe    5s ease-in-out infinite;
}
.surface-card.is-selected::before {
  content: '';
  position: absolute;
  inset: 0;
  border-radius: inherit;
  padding: 1px;
  background: conic-gradient(
    from var(--beam-angle),
    transparent 0deg,
    transparent 250deg,
    rgba(200,169,110,.5) 285deg,
    rgba(255,248,235,1)  320deg,
    rgba(200,169,110,.5) 355deg,
    transparent 360deg);
  -webkit-mask:
    linear-gradient(#000 0 0) content-box,
    linear-gradient(#000 0 0);
  -webkit-mask-composite: xor;
  mask:
    linear-gradient(#000 0 0) content-box,
    linear-gradient(#000 0 0);
  mask-composite: exclude;
  pointer-events: none;
}
.surface-card.is-selected::after {
  content: none;
}
/* hover 不重写 background — animation 帧的 background-color 自然继续，
 * 否则会跟 keyframes 抢同一属性导致跳帧 */
/* LED 状态指示 —— 小方块仪表灯，仅在 enabled card 上出现。
 * 未选中：灰色 idle 灯，已选中：琥珀通电状态。 */
.surface-led {
  position: absolute;
  top: 14px; right: 14px;
  width: 8px; height: 8px;
  border-radius: 2px;
  background: rgba(255,255,255,.08);
  border: 1px solid rgba(255,255,255,.14);
  transition: all .2s;
}
.surface-card.is-disabled .surface-led { display: none; }   /* 禁用卡用 Soon badge 表达状态，不重叠 */
.surface-card.is-selected .surface-led {
  background: var(--accent);
  border-color: var(--accent);
  box-shadow: 0 0 8px rgba(200,169,110,.55);     /* tiny LED glow，scoped 到 8×8 范围 */
}
/* Mono index — 卡左下角小标号，selected 时变琥珀，未选时灰；
 * 给卡片"数据记录" feel，不再像普通卡片。 */
.surface-index {
  position: absolute;
  bottom: 14px; right: 16px;
  font-family: 'IBM Plex Mono', monospace;
  font-size: 9.5px;
  letter-spacing: .14em;
  color: rgba(255,255,255,.30);
  font-weight: 600;
  transition: color .2s;
}
.surface-card.is-selected .surface-index {
  color: rgba(200,169,110,.72);
}
.surface-card.is-disabled {
  opacity: .55;                                  /* .42→.55，"在场但不可用"，不该完全消失 */
  cursor: not-allowed;
}
.surface-card.is-disabled:hover {
  transform: none;
  border-color: rgba(255,255,255,.10);
  border-top-color: rgba(255,255,255,.16);
}
.surface-icon {
  width: 26px; height: 26px;
  color: var(--text-secondary);
  opacity: .72;
  margin-bottom: 16px;
  flex-shrink: 0;
}
.surface-card.is-selected .surface-icon {
  color: var(--accent);
  opacity: 1;
}
/* 卡片内 typography hierarchy — 三档明显的 weight + size 跳动：
 *   name = 17px 650 weight display
 *   desc = 12.5px text-3 line-height 1.55
 *   meta = 11.5px mono with strong number prominence */
.surface-name {
  font-size: 17px;
  font-weight: 600;
  color: var(--text);
  margin: 0 0 6px;
  letter-spacing: -.015em;
  line-height: 1.3;
}
.surface-desc {
  font-size: 12.5px;
  color: var(--text-3);
  line-height: 1.55;
  margin: 0 0 auto;
  padding-bottom: 16px;
}
.surface-meta {
  font-size: 11.5px;
  color: var(--text-secondary);
  font-family: 'IBM Plex Mono', monospace;
  letter-spacing: .04em;
}
.surface-meta strong {
  color: var(--text);
  font-weight: 700;
  font-family: 'Geist Variable', 'Geist', 'Inter', sans-serif;
  font-size: 13px;
  letter-spacing: -.02em;
  margin-right: 2px;
}
.surface-badge {
  position: absolute;
  top: 10px; right: 10px;
  font-family: 'IBM Plex Mono', monospace;
  font-size: 9px;
  font-weight: 600;
  letter-spacing: .12em;
  text-transform: uppercase;
  padding: 2px 7px;
  border-radius: 999px;
  background: rgba(255,255,255,.08);
  color: rgba(255,255,255,.55);
  border: 1px solid rgba(255,255,255,.10);
}

/* ── STEP 2: Task scope (tabs) ── */
.scope-tabs {
  display: flex;
  gap: 28px;                                /* 间距 28px，跟 underline 风格匹配 */
  padding: 0 26px;
  margin: 14px 0 14px;
  flex-shrink: 0;
}
/* Underline tabs（替代 pill）—— chip 没有 horizontal padding 也没有 bg pill，
 * 文字始终在容器 content-left。active 状态用底部 2px amber 下划线指示，
 * 永远不会跑出 content edge → 跟下方"难度"label 和卡片左缘完美对齐。 */
.scope-tab {
  padding: 8px 0 6px;
  background: transparent;
  border: none;
  border-bottom: 2px solid transparent;
  border-radius: 0;
  color: var(--text-2);
  font-size: .82rem;
  cursor: pointer;
  white-space: nowrap;
  transition: color .15s, border-color .15s;
  font-family: inherit;
}
.scope-tab:hover { color: var(--text-primary); }
.scope-tab.is-active {
  color: var(--text-primary);
  border-bottom-color: var(--accent);       /* amber 下划线作为 active 指示 */
  font-weight: 500;
}
.scope-panel {
  flex: 1;
  min-height: 0;
  overflow-y: auto;
  padding: 0 26px 16px;
}
.scope-panel[hidden] { display: none; }

/* Custom tab 维度 filter panel — 难度 + 场景 共用一个面板，
 * 中间用 1px 分割线分隔；保留之前的 panel 视觉，让两类 chip 视为一组。 */
.custom-filter-panel {
  background: rgba(255,255,255,.025);
  border: 1px solid rgba(255,255,255,.06);
  border-radius: 10px;
  margin-bottom: 12px;
  overflow: hidden;                     /* 让 row hover 不溢出圆角 */
}
.custom-filter-row {
  display: flex;
  align-items: center;
  gap: 16px;
  padding: 10px 14px;
}
.custom-filter-row + .custom-filter-row {
  border-top: 1px solid rgba(255,255,255,.06);
}

/* 单行场景兼容（外部如果还在用 .custom-filter-bar 直挂的旧标记） */
.custom-filter-bar {
  display: flex;
  align-items: center;
  gap: 16px;
  padding: 10px 14px;
  background: rgba(255,255,255,.025);
  border: 1px solid rgba(255,255,255,.06);
  border-radius: 10px;
  margin-bottom: 10px;
}
.custom-filter-label {
  font-size: .85rem;
  color: var(--text-primary);          /* 之前 secondary，太弱 */
  font-weight: 600;
  flex-shrink: 0;
  min-width: 56px;                     /* 两行 label 视觉对齐（"难度"/"场景"） */
}
.custom-filter-chips {
  display: flex;
  gap: 8px;
  flex-wrap: wrap;
}
.custom-filter-chip {
  display: inline-flex;
  align-items: center;
  padding: 5px 12px;                   /* 细长 pill：5/12 比 6/14 收紧 */
  border-radius: 999px;
  font-size: .82rem;
  line-height: 1.2;                    /* 跟 svg/count 同步收紧，让两行 chip 等高 */
  color: var(--text-primary);
  background: rgba(255,255,255,.04);
  border: 1px solid rgba(255,255,255,.16);
  cursor: pointer;
  white-space: nowrap;
  transition: color .15s, background .15s, border-color .15s, transform .12s;
  font-family: inherit;
}
.custom-filter-chip:hover {
  background: rgba(255,255,255,.08);
  border-color: rgba(255,255,255,.26);
}
.custom-filter-chip.is-active {
  color: #fff;
  background: linear-gradient(180deg, rgba(200,169,110,.20) 0%, rgba(200,169,110,.10) 100%);
  border-color: rgba(200,169,110,.55);
  box-shadow: inset 0 1px 0 rgba(255,255,255,.08), 0 0 0 1px rgba(200,169,110,.18);
  font-weight: 500;
}

/* ── 难度 chip ──
 * 未选中：全部走默认中性白（跟 base custom-filter-chip 一样，不上色）
 * 选中：在中性 chip 之上换成对应等级的色（mint / amber / rose），形成强对比 */

.custom-filter-chip.diff-low.is-active {
  color: rgba(123,191,166,1);
  background: linear-gradient(180deg, rgba(123,191,166,.22) 0%, rgba(123,191,166,.10) 100%);
  border-color: rgba(123,191,166,.60);
  box-shadow: inset 0 1px 0 rgba(255,255,255,.08), 0 0 0 1px rgba(123,191,166,.22);
}
.custom-filter-chip.diff-medium.is-active {
  color: rgba(200,169,110,1);
  background: linear-gradient(180deg, rgba(200,169,110,.22) 0%, rgba(200,169,110,.10) 100%);
  border-color: rgba(200,169,110,.60);
  box-shadow: inset 0 1px 0 rgba(255,255,255,.08), 0 0 0 1px rgba(200,169,110,.22);
}
.custom-filter-chip.diff-high.is-active {
  color: rgba(217,142,142,1);
  background: linear-gradient(180deg, rgba(217,142,142,.20) 0%, rgba(217,142,142,.08) 100%);
  border-color: rgba(217,142,142,.60);
  box-shadow: inset 0 1px 0 rgba(255,255,255,.08), 0 0 0 1px rgba(217,142,142,.22);
}

/* ── 场景 chip：lucide icon + count ──
 * 三者都是 flex 子项，靠 align-items: center（base 已设）保证中线对齐。
 * count 不再走背景胶囊，跟 icon/文字同色，仅靠字号小一档 + opacity .55 做层级。
 * SVG 显式 display:block 去掉 inline baseline 偏移。 */
.custom-filter-chip.scene-chip {
  gap: 6px;
  /* 字号、字重跟难度 chip 保持一致（base .82rem / active 500），
   * 差异化交给 icon + count，不靠字号制造层级。 */
}
/* 全局有 .scene-name { font-weight:700; font-size:.92rem } 是 scene 卡片用的，
 * 跟 chip 内的 span 撞类名。这里强制还原继承自 chip。 */
.custom-filter-chip.scene-chip .scene-name {
  font-weight: inherit;
  font-size: inherit;
  margin-top: 0;
}
.custom-filter-chip.scene-chip svg {
  width: 12px;
  height: 12px;
  opacity: .70;
  flex-shrink: 0;
  display: block;
  transition: opacity .15s;
}
.custom-filter-chip.scene-chip:hover svg { opacity: .92; }
.custom-filter-chip.scene-chip.is-active svg { opacity: 1; }
.custom-filter-chip.scene-chip .scene-count {
  font-size: .74rem;                   /* 仅 count 比 name 小半号，做局部层级 */
  color: inherit;
  opacity: .55;
  font-variant-numeric: tabular-nums;
  margin-left: 1px;
  transition: opacity .15s;
}
.custom-filter-chip.scene-chip:hover .scene-count { opacity: .80; }
.custom-filter-chip.scene-chip.is-active .scene-count { opacity: .90; }

/* Pack list inside Task Pack tab */
.pack-list {
  display: flex;
  flex-direction: column;
  gap: 8px;
}
.pack-row {
  position: relative;
  background: var(--bg-modal-panel);
  border: 1px solid rgba(255,255,255,.08);
  border-radius: 12px;
  padding: 16px 20px;
  cursor: pointer;
  transition: border-color .15s, background .15s, transform .2s cubic-bezier(.16,1,.3,1);
  display: grid;
  grid-template-columns: 1fr auto;        /* name | 详情按钮（meta 落到下一行 col 1） */
  gap: 6px 16px;
  align-items: center;         /* name 与按钮中线对齐 */
  text-align: left;            /* 覆盖 <button> 默认 text-align: center（兼容历史） */
  font-family: inherit;
  color: inherit;
  overflow: hidden;            /* clip corner-arc pseudos to rounded corner */
}
.pack-row:hover {
  background: var(--bg-modal-hover);
  border-color: rgba(255,255,255,.18);
  transform: translateY(-1px);
}
/* Pack row selected — 旋转光带（border beam）。
 * 原理：conic-gradient（沿 --beam-angle 旋转）+ mask-composite exclude
 * 把渐变裁剪到 1px 的 border 环上。@property --beam-angle 是角度平滑插值
 * 必需（CSS 普通变量无法 interpolate angle 类型）。
 *
 * 同 Aceternity UI / Magic UI 的 border-beam 实现，是现代 dark UI 的
 * 标准 selected 信号 pattern。一道琥珀光"环绕"卡片一周，给静态卡注入活气。 */
/* Pack row selected — 同 surface-card 的内外联动思路。
 * 行较扁，glow 半径调小到 70px，刚好"在 row 高度里走一圈"的尺度。 */
.pack-row.is-selected {
  background:
    linear-gradient(rgba(200,169,110, var(--card-breath)),
                    rgba(200,169,110, var(--card-breath))),
    var(--bg-modal-panel);
  border-color: rgba(200,169,110,.22);
  animation:
    pack-beam-rotate 4s linear infinite,
    card-breathe    5s ease-in-out infinite;
}
.pack-row.is-selected::before {
  content: '';
  position: absolute;
  inset: 0;
  border-radius: inherit;
  padding: 1px;
  background: conic-gradient(
    from var(--beam-angle),
    transparent 0deg,
    transparent 250deg,
    rgba(200,169,110,.5) 285deg,
    rgba(255,248,235,1)  320deg,
    rgba(200,169,110,.5) 355deg,
    transparent 360deg);
  -webkit-mask:
    linear-gradient(#000 0 0) content-box,
    linear-gradient(#000 0 0);
  -webkit-mask-composite: xor;
  mask:
    linear-gradient(#000 0 0) content-box,
    linear-gradient(#000 0 0);
  mask-composite: exclude;
  pointer-events: none;
}
.pack-row.is-selected::after {
  content: none;
}
/* hover 不重写 background，让 keyframes 自然继续 */

/* 展开任务列表时压制 selected 的琥珀 wash + 旋转 beam ——
 * 用户此刻是在读 task list，amber breathing 干扰可读性。
 * 选中状态保留为：纯静态琥珀边框，不带动画。 */
.pack-row.is-selected:has(.pack-row-detail.is-open) {
  background: var(--bg-modal-panel);
  border-color: rgba(200,169,110,.32);
  animation: none;
}
.pack-row.is-selected:has(.pack-row-detail.is-open)::before {
  display: none;
}

/* --beam-angle 作为"卡片内 + 卡片边"两个动效的共享角度时钟。
 * inherits: true 让 ::before 自动继承父元素的动画值，不需要在伪元素上单独
 * 写 animation —— 父元素动画一次，beam 和 inner glow 完美同步。 */
@property --beam-angle {
  syntax: "<angle>";
  initial-value: 0deg;
  inherits: true;
}
@keyframes pack-beam-rotate {
  to { --beam-angle: 360deg; }
}
/* 卡片呼吸 —— @property 注册的 number alpha，让 browser GPU 在 compositor
 * 层面 lerp 数值（不是 CSSOM 重算），帧间最丝滑。amber wash 全卡均匀覆盖
 * （linear-gradient 同色起止 = uniform fill，无 spot 无 falloff 边界）。
 * 5s ease-in-out，不与 beam 4s 同周期 → 自然各跑各的节奏。 */
@property --card-breath {
  syntax: "<number>";
  initial-value: 0.02;
  inherits: false;
}
@keyframes card-breathe {
  0%, 100% { --card-breath: 0.015; }
  50%      { --card-breath: 0.035; }
}
.pack-row-name {
  font-size: 14px;
  font-weight: 600;
  color: var(--text);
  letter-spacing: -.005em;
}
.pack-row-meta {
  grid-column: 1;                          /* 落在 col 1（按钮 row 1 col 2，meta row 2 col 1） */
  font-size: 12px;                         /* 13 → 12，从"卡片头"降到"name 下属说明" */
  font-family: 'IBM Plex Mono', monospace;
  color: var(--text-secondary);            /* primary → secondary，name 是主，meta 是辅 */
  letter-spacing: .02em;
  white-space: nowrap;
  margin-top: 2px;
}
.pack-row-meta strong {
  color: var(--text);                      /* 数字保持加粗作为重点 */
  font-weight: 700;
  font-family: 'Geist Variable', 'Geist', 'Inter', sans-serif;
  font-size: 13px;
  letter-spacing: -.01em;
  margin-right: 2px;
}
.pack-row-desc {
  grid-column: 1;                          /* 只占 col 1；col 2 留给跨行的"查看任务"按钮 */
  font-size: 12.5px;
  color: var(--text-3);
  line-height: 1.55;
  margin: 4px 0 0;
}

/* ── Pack detail：行内展开按钮 + 折叠面板 ──
 * 按钮 = chrome 玻璃胶囊（同 settings/utility 类，跟主选 CTA 区分开）。
 * 面板用 grid-template-rows 0fr → 1fr 平滑展开（现代浏览器都支持），
 * 内层 .pack-row-detail-inner 处理实际滚动条 + 限高。 */
.pack-row-detail-btn {
  display: inline-flex;
  align-items: center;
  gap: 7px;                           /* 5 → 7，文字与 chevron 之间松一档 */
  padding: 8px 16px;                  /* 5/11 → 8/16，"查看任务"四个字不再被挤 */
  border-radius: 999px;
  background: rgba(255,255,255,.07);
  border: 1px solid rgba(255,255,255,.20);
  color: var(--text-primary);
  font-size: .82rem;                  /* .78 → .82，跟 filter chip 同档可读 */
  font-weight: 500;
  line-height: 1.2;
  font-family: inherit;
  cursor: pointer;
  white-space: nowrap;
  /* 跨 name + meta + desc 三行，align-self center 让按钮在整个描述块视觉中线居中
   * （之前只跨 1-2 行，desc 多行时按钮显得"卡在顶"）。 */
  grid-column: 2;
  grid-row: 1 / 4;
  align-self: center;
  justify-self: end;
  transition: color .15s, background .15s, border-color .15s;
}
.pack-row-detail-btn:hover {
  background: rgba(255,255,255,.12);
  border-color: rgba(255,255,255,.32);
  color: #fff;
}
.pack-row-detail-btn svg {
  width: 12px;
  height: 12px;
  display: block;
  transition: transform .25s cubic-bezier(.16,1,.3,1);
}
.pack-row-detail-btn[aria-expanded="true"] svg { transform: rotate(180deg); }
.pack-row-detail-btn[aria-expanded="true"] {
  color: #fff;
  background: rgba(255,255,255,.12);
  border-color: rgba(255,255,255,.32);
}

/* 折叠面板 —— grid-template-rows 0fr → 1fr 平滑动画
 * 注意 .pack-row 自带 overflow:hidden，所以 panel 关闭时 0 高度自然不可见。
 * 打开时 inner 接管滚动（max-height + overflow-y auto）。 */
.pack-row-detail {
  grid-column: 1 / -1;
  display: grid;
  grid-template-rows: 0fr;
  transition: grid-template-rows .3s cubic-bezier(.16,1,.3,1),
              margin-top       .3s cubic-bezier(.16,1,.3,1);
  margin-top: 0;
}
.pack-row-detail.is-open {
  grid-template-rows: 1fr;
  margin-top: 12px;
}
.pack-row-detail-inner {
  overflow: hidden;
  min-height: 0;                 /* 让 grid row 的 0fr 真正崩塌到 0 */
}
.pack-row-detail.is-open .pack-row-detail-inner {
  max-height: 320px;
  overflow-y: auto;
  padding-top: 12px;
  border-top: 1px solid rgba(255,255,255,.06);
}

/* ── Pack 内任务行（read-only mini table，无 checkbox） ── */
.pack-task-list { display: flex; flex-direction: column; }
.pack-task-row {
  display: grid;
  grid-template-columns: minmax(220px, 1.4fr) minmax(180px, 1.2fr) minmax(80px, 100px);
  gap: 16px;
  padding: 10px 4px;
  align-items: start;
  border-bottom: 1px solid rgba(255,255,255,.04);
}
.pack-task-row:last-child { border-bottom: none; }
.pack-task-cell-task {
  display: flex;
  flex-direction: column;
  gap: 4px;
  min-width: 0;
}
.pack-task-name {
  font-family: 'IBM Plex Mono', monospace;
  font-size: 12.5px;
  color: var(--text);
  font-weight: 500;
}
.pack-task-desc {
  font-size: 11.5px;
  color: var(--text-3);
  line-height: 1.5;
  display: -webkit-box;
  -webkit-line-clamp: 2;
  -webkit-box-orient: vertical;
  overflow: hidden;
}
.pack-task-cell-apps {
  display: flex;
  flex-wrap: wrap;
  align-content: flex-start;
  gap: 5px;
  padding-top: 1px;
}
.pack-task-cell-tags {
  display: flex;
  align-items: center;
  justify-content: flex-end;
  align-self: center;
}
.pack-task-app-rest {
  display: inline-flex;
  align-items: center;
  font-family: 'IBM Plex Mono', monospace;
  font-size: 11px;
  font-weight: 600;
  padding: 2px 8px;
  border-radius: 999px;
  color: rgba(255,255,255,.55);
  background: transparent;
  border: 1px solid rgba(255,255,255,.14);
}

/* ── STEP 3: Execution config form ── */
.exec-form {
  display: flex;
  flex-direction: column;
  gap: 16px;
}
.exec-row {
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: 14px;
}
.exec-field {
  display: flex;
  flex-direction: column;
  gap: 6px;
}
.exec-label {
  font-family: 'IBM Plex Mono', monospace;
  font-size: 10px;
  letter-spacing: .14em;
  text-transform: uppercase;
  color: rgba(200,169,110,.72);
  font-weight: 600;
}
.exec-input,
.exec-select {
  width: 100%;
  background: var(--bg-modal-panel);
  border: 1px solid rgba(255,255,255,.10);
  border-radius: 8px;
  padding: 9px 12px;
  font-size: .88rem;
  color: var(--text);
  font-family: inherit;
  transition: border-color .15s, background .15s;
}
.exec-input::placeholder {
  color: var(--text-3);
}
.exec-input:focus,
.exec-select:focus {
  outline: none;
  border-color: var(--accent);
  background: var(--bg-modal-hover);
}
.exec-select {
  appearance: none;
  -webkit-appearance: none;
  background-image:
    linear-gradient(180deg, rgba(255,255,255,.04), rgba(255,255,255,.015)),
    url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 24 24' fill='none' stroke='%23A1A1A6' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='6 9 12 15 18 9'%3E%3C/polyline%3E%3C/svg%3E");
  background-repeat: no-repeat;
  background-position: right 12px center;
  background-size: auto, 12px;
  padding-right: 32px;
}
.exec-select option:disabled {
  color: var(--text-3);
}
.exec-hint {
  font-size: 11px;
  color: var(--text-3);
  margin: 4px 0 0;
}

/* ── STEP 4: Review summary ── */
.review-card {
  background: var(--bg-modal-panel);
  border: 1px solid rgba(255,255,255,.08);
  border-radius: 14px;
  padding: 6px 22px;                        /* 行间距由 .launch-brief-row 自己控制 */
  display: flex;
  flex-direction: column;
  margin-bottom: 16px;                      /* 跟下面 review-stats 拉开 */
}

/* ── Launch brief — Step 3 (确认 & 启动) 单一信息卡设计 ──
 * 设计语言：mission-control launch readout / 启动清单。
 * 单卡布局，垂直居中在 step body 里，避免之前"上面挤、下面空"的问题。
 * 三段：(1) mint status marker 徽章 (2) Geist display title + mono subtitle
 * (3) 3-column instrument-panel 风格 stats 带细分隔线。 */
.wiz-step-body--centered {
  display: flex;
  flex-direction: column;
  justify-content: center;
  /* 不 align-items: center —— 让内部 content 全宽 stretch，方块/详情行才铺得开 */
}
.wiz-step-body--centered > .step-content {
  width: 100%;
  max-width: 760px;
  margin: 0 auto;                /* 自身水平居中 */
  display: flex;
  flex-direction: column;
  gap: 18px;
}
.launch-brief {
  width: 100%;
  max-width: 720px;
  background: var(--bg-modal-panel);
  border: 1px solid rgba(255,255,255,.08);
  border-radius: 18px;
  padding: 36px 44px 32px;
  display: flex;
  flex-direction: column;
  gap: 28px;
  position: relative;
  overflow: hidden;
}
/* 微暖 corner ambient — 给"准备启动"一点暖意，不抢主信息 */
.launch-brief::before {
  content: '';
  position: absolute;
  top: 0; right: 0;
  width: 320px; height: 320px;
  pointer-events: none;
  background: radial-gradient(circle at 100% 0%,
    rgba(200,169,110,.06) 0%,
    transparent 55%);
}
.launch-brief > * { position: relative; z-index: 1; }

/* Status marker — mint 信号灯，"环境就绪"的语义指示 */
.launch-brief-marker {
  display: inline-flex;
  align-items: center;
  gap: 8px;
  align-self: flex-start;
  padding: 5px 11px 5px 9px;
  border-radius: 999px;
  background: rgba(123,191,166,.08);
  border: 1px solid rgba(123,191,166,.22);
  font-family: 'IBM Plex Mono', monospace;
  font-size: 10px;
  letter-spacing: .14em;
  text-transform: uppercase;
  font-weight: 600;
  color: rgba(123,191,166,.85);
}
.launch-brief-marker-dot {
  width: 6px; height: 6px;
  border-radius: 50%;
  background: rgba(123,191,166,.85);
  box-shadow: 0 0 6px rgba(123,191,166,.55);
}

/* Detail rows — 标题 + 内容明确成对，让用户清楚看到平台 / 任务范围具体选了什么。
 * Grid 2 列：左 mono kicker label，右 Geist 600 weight value。
 * 行间用 .08 alpha 细线分隔（"data record" 风格）。 */
.launch-brief-details {
  display: flex;
  flex-direction: column;
}
.launch-brief-row {
  display: grid;
  grid-template-columns: 140px 1fr;
  gap: 24px;
  padding: 14px 0;
  align-items: center;
  border-bottom: 1px solid rgba(255,255,255,.06);
}
.launch-brief-row:last-child { border-bottom: none; }
.launch-brief-row-label {
  font-family: 'IBM Plex Mono', monospace;
  font-size: 10px;
  letter-spacing: .14em;
  text-transform: uppercase;
  font-weight: 600;
  color: rgba(255,255,255,.50);
}
.launch-brief-row-value {
  font-family: 'Geist Variable', 'Geist', 'Inter', sans-serif;
  font-size: 16px;
  font-weight: 500;
  color: var(--text);
  letter-spacing: -.01em;
}
.launch-brief-row-value-tag {
  display: inline-block;
  margin-left: 10px;
  padding: 2px 8px;
  border-radius: 999px;
  background: rgba(200,169,110,.10);
  border: 1px solid rgba(200,169,110,.22);
  font-family: 'IBM Plex Mono', monospace;
  font-size: 10px;
  letter-spacing: .12em;
  text-transform: uppercase;
  color: rgba(200,169,110,.85);
  font-weight: 600;
  vertical-align: middle;
}

/* Stats grid — 3 列大号 Geist 数字 + 小 mono label，instrument-panel 风格 */
.launch-brief-stats {
  display: grid;
  grid-template-columns: 1fr auto 1fr auto 1fr;
  gap: 32px;
  align-items: center;
  padding-top: 24px;
  border-top: 1px solid rgba(255,255,255,.08);
}
.launch-brief-stat {
  display: flex;
  flex-direction: column;
  gap: 8px;
}
.launch-brief-stat-num {
  font-family: 'Geist Variable', 'Geist', 'Inter', sans-serif;
  font-size: 26px;
  font-weight: 700;
  letter-spacing: -.03em;
  color: var(--text);
  line-height: 1;
}
.launch-brief-stat-label {
  font-family: 'IBM Plex Mono', monospace;
  font-size: 10px;
  letter-spacing: .14em;
  text-transform: uppercase;
  font-weight: 600;
  color: rgba(255,255,255,.45);
}
.launch-brief-stat-divider {
  width: 1px;
  height: 36px;
  background: rgba(255,255,255,.08);
}
.review-item {
  display: flex;
  flex-direction: column;
  gap: 4px;
  min-width: 0;
}
.review-label {
  font-family: 'IBM Plex Mono', monospace;
  font-size: 10px;
  letter-spacing: .14em;
  text-transform: uppercase;
  color: rgba(200,169,110,.72);
  font-weight: 600;
}
.review-value {
  font-size: .92rem;
  color: var(--text);
  font-weight: 500;
  word-break: break-all;
  line-height: 1.4;
}
.review-value-muted {
  color: var(--text-secondary);
  font-weight: 400;
}
.review-stats {
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  gap: 14px;
}
.review-stat {
  background: var(--bg-modal-panel);
  border: 1px solid rgba(255,255,255,.08);
  border-radius: 14px;
  padding: 20px 22px;                       /* 12 14 → 20 22，方块更厚实 */
  text-align: left;
}
.review-stat-label {
  font-family: 'IBM Plex Mono', monospace;
  font-size: 10px;
  letter-spacing: .14em;
  text-transform: uppercase;
  color: rgba(255,255,255,.50);             /* 中性 mono kicker，跟 launch-brief row 一致 */
  font-weight: 600;
  margin-bottom: 12px;                      /* 6 → 12 拉开 */
}
.review-stat-value {
  font-size: 1.75rem;                       /* 1.4 → 1.75rem display 化 */
  font-weight: 700;
  color: var(--text);
  font-family: 'Geist Variable', 'Geist', 'Inter', sans-serif;
  letter-spacing: -.03em;
  line-height: 1;
}
.review-stat-unit {
  font-size: .82rem;
  color: var(--text-secondary);
  font-weight: 400;
  margin-left: 3px;
}
