/* Extracted from index.html on 2026-07-18 (final branch) · single global stylesheet */

  :root, :root[data-theme="sky"] {
    /* ── sky · 浅天蓝主题（默认）· 冷白 + 浅天蓝主色 + 深墨蓝文字 · AA+ 对比 ── */
    --ink: #0d2540;
    --ink-soft: #38547a;
    --ink-mute: #6b7d9a;
    --ink-faint: #a0b0c8;
    --paper: #ffffff;
    --paper-warm: #f5f9ff;
    --paper-cool: #eaf1fa;
    --page-bg: #f0f6fc;
    --page-bg-dot: #d4e2f3;
    --page-bg-translucent: rgba(240, 246, 252, 0.92);
    --rule: #d0dee9;
    --rule-soft: #e5eef7;
    --vermilion: #2f7fd8;
    --vermilion-soft: #6ea9e8;
    --vermilion-bg: #eaf3fc;
    --gold: #c78e3a;
    --accent-bg: #eaf3fc;
    --teal: #2f7fd8;
    --teal-wash: #eaf3fc;
    --brand-deep: var(--ink);
    --brand: var(--vermilion);
    --brand-mid: var(--vermilion-soft);
    --brand-light: var(--vermilion-soft);
    --brand-pale: var(--rule);
    --brand-bg: var(--vermilion-bg);
    --aux-purple: var(--ink-soft);
    --aux-purple-soft: var(--ink-mute);
    --aux-purple-bg: var(--paper-warm);
    --aux-cyan: var(--vermilion);
    --aux-cyan-soft: var(--vermilion-soft);
    --aux-cyan-bg: var(--vermilion-bg);
    --grad-blue: linear-gradient(135deg, #f5f9ff 0%, #ffffff 100%);
    --grad-purple: linear-gradient(135deg, #f5f9ff 0%, #eaf1fa 100%);
    --grad-cyan: linear-gradient(135deg, #eaf3fc 0%, #ffffff 100%);
    --disc-life: var(--ink);
    --disc-neuro: var(--ink);
    --disc-chem: var(--ink);
    --disc-astro: var(--ink);
    --disc-earth: var(--ink);
    --disc-material: var(--ink);
    --disc-math: var(--ink);
    --disc-physics: var(--ink);
    --success: #2f8659;
    --success-bg: #e8f5ee;
    --warning: #b47b1e;
    --warning-bg: #fbf1de;
    --error: #c93838;
    --error-bg: #fbe8e8;
  }

  /* ── 主题：origin · 原始暖纸墨色版（0424 tokens） ── */
  :root[data-theme="origin"] {
    --ink: #1a2332;
    --ink-soft: #3a4556;
    --ink-mute: #7a8394;
    --ink-faint: #a8afbb;
    --paper: #fdfcf8;
    --paper-warm: #f7f4ec;
    --paper-cool: #fafaf7;
    --page-bg: #f5f1e8;
    --page-bg-dot: #d8d3c4;
    --page-bg-translucent: rgba(245, 241, 232, 0.9);
    --rule: #e8e4d9;
    --rule-soft: #efece3;
    --vermilion: #1661ab;
    --vermilion-soft: #5a8fc8;
    --vermilion-bg: #e9f0f9;
    --gold: #a8864b;
    --accent-bg: #ecf2f8;
    --teal: #1661ab;
    --teal-wash: #e9f0f9;
    --grad-blue: linear-gradient(135deg, #f7f4ec 0%, #fdfcf8 100%);
    --grad-purple: linear-gradient(135deg, #f7f4ec 0%, #fdfcf8 100%);
    --grad-cyan: linear-gradient(135deg, #e9f0f9 0%, #fdfcf8 100%);
    --success: #6b7a3a;
    --success-bg: #f1f3e8;
    --warning: #a8864b;
    --warning-bg: #f8f1e3;
    --error: #c03030;
    --error-bg: #fdeaea;
  }

  /* ── 主题：dark · 深色 v1（简版：中性深灰蓝 + 航天蓝提亮） ── */
  :root[data-theme="dark"] {
    --ink: #e8ecf3;
    --ink-soft: #b8c0ce;
    --ink-mute: #a0abbc;
    --ink-faint: #7d8593;
    --paper: #141a24;
    --paper-warm: #1a212d;
    --paper-cool: #10161f;
    --page-bg: #0a0e15;
    --page-bg-dot: #1e2635;
    --page-bg-translucent: rgba(10, 14, 21, 0.92);
    --rule: #2a3341;
    --rule-soft: #1e2632;
    --vermilion: #5aa9e6;
    --vermilion-soft: #7ebae8;
    --vermilion-bg: rgba(90, 169, 230, 0.14);
    --gold: #d4a961;
    --accent-bg: rgba(90, 169, 230, 0.12);
    --teal: #5aa9e6;
    --teal-wash: rgba(90, 169, 230, 0.12);
    --grad-blue: linear-gradient(135deg, #1a212d 0%, #141a24 100%);
    --grad-purple: linear-gradient(135deg, #1a212d 0%, #141a24 100%);
    --grad-cyan: linear-gradient(135deg, rgba(90,169,230,0.18) 0%, #141a24 100%);
    --success: #7bc36b;
    --success-bg: rgba(123, 195, 107, 0.14);
    --warning: #d4a961;
    --warning-bg: rgba(212, 169, 97, 0.14);
    --error: #e64848;
    --error-bg: rgba(230, 72, 72, 0.14);
  }

  /* ── 主题：dark2 · 航天蓝深色 v2（参考「手眼脑」深蓝紫 + 金黄） ── */
  :root[data-theme="dark2"] {
    --ink: #f4f7ff;
    --ink-soft: #c8d3ec;
    --ink-mute: #94a3c6;
    --ink-faint: #6a7ea3;
    --paper: #142347;
    --paper-warm: #1a2c58;
    --paper-cool: #0f1a3c;
    --page-bg: #060e26;
    --page-bg-dot: #1a2c5a;
    --page-bg-translucent: rgba(6, 14, 38, 0.92);
    --rule: #2a4380;
    --rule-soft: #1c3266;
    --vermilion: #5aa9ff;
    --vermilion-soft: #7bbfff;
    --vermilion-bg: rgba(90, 169, 255, 0.14);
    --gold: #f5c766;
    --accent-bg: rgba(90, 169, 255, 0.12);
    --teal: #5aa9ff;
    --teal-wash: rgba(90, 169, 255, 0.12);
    --grad-blue: linear-gradient(135deg, #1a2c58 0%, #142347 100%);
    --grad-purple: linear-gradient(135deg, #1a2c58 0%, #0f1a3c 100%);
    --grad-cyan: linear-gradient(135deg, rgba(90,169,255,0.22) 0%, #142347 100%);
    --success: #7bd88f;
    --success-bg: rgba(123, 216, 143, 0.14);
    --warning: #f5c766;
    --warning-bg: rgba(245, 199, 102, 0.14);
    --error: #ff6968;
    --error-bg: rgba(255, 105, 104, 0.14);
  }

  * { box-sizing: border-box; margin: 0; padding: 0; }

  html { scroll-behavior: smooth; }

  body {
    font-family: 'Inter', 'Noto Serif SC', -apple-system, sans-serif;
    color: var(--ink);
    background-color: var(--page-bg);
    /* 默认 (sky) · 极淡天蓝渐变 · 主题会覆盖 background-image */
    background-image:
      radial-gradient(ellipse 100% 80% at 50% -10%, rgba(90, 169, 255, 0.10) 0%, transparent 60%),
      radial-gradient(ellipse 80% 50% at 50% 110%, rgba(90, 169, 255, 0.05) 0%, transparent 55%);
    background-attachment: fixed;
    background-size: auto;
    line-height: 1.6;
    -webkit-font-smoothing: antialiased;
    font-size: 14px;
  }
  /* 主题级 body 渐变覆盖 */
  :root[data-theme="origin"] body { background-image: none; }
  :root[data-theme="dark"] body {
    background-image:
      radial-gradient(ellipse 100% 80% at 50% -10%, rgba(30, 50, 85, 0.55) 0%, transparent 60%),
      radial-gradient(ellipse 80% 50% at 50% 110%, rgba(90, 169, 230, 0.06) 0%, transparent 55%);
  }
  :root[data-theme="dark2"] body {
    background-image:
      radial-gradient(ellipse 100% 80% at 50% -10%, rgba(26, 44, 88, 0.55) 0%, transparent 60%),
      radial-gradient(ellipse 80% 60% at 50% 110%, rgba(90, 169, 255, 0.10) 0%, transparent 55%);
  }

  /* origin 主题：5 lib 页面恢复原始暖纸点阵背景 · dark/dark2/sky 保持纯色 */
  :root[data-theme="origin"] #pageTools.page.active,
  :root[data-theme="origin"] #pageSkills.page.active,
  :root[data-theme="origin"] #pageDevices.page.active,
  :root[data-theme="origin"] #pageKnowledge.page.active,
  :root[data-theme="origin"] #pageGraphLib.page.active {
    background:
      radial-gradient(circle, var(--page-bg-dot) 1px, transparent 1px) 0 0 / 24px 24px,
      var(--page-bg);
  }

  /* ── 主题切换器 · 集成到 sidebar-footer 内 · 挨着 avatar · 与其他 sidebar 图标一致 ── */
  .theme-switcher {
    position: relative;                /* 不再 fixed · 由 sidebar-footer flex 排位 */
    font-family: 'Inter', 'Noto Sans SC', -apple-system, sans-serif;
    flex-shrink: 0;
  }
  .theme-switcher-btn {
    width: 32px;
    height: 32px;
    padding: 0;
    display: inline-flex;
    align-items: center;
    justify-content: center;
    gap: 0;
    background: transparent;
    color: var(--ink-soft);
    border: 1px solid var(--rule);
    border-radius: 50%;                /* 圆形 · 呼应 avatar */
    font-size: 12px;
    cursor: pointer;
    box-shadow: none;
    transition: border-color .15s, color .15s, background .15s;
  }
  .theme-switcher-btn:hover {
    border-color: var(--vermilion);
    color: var(--vermilion);
    background: var(--vermilion-bg);
  }
  .theme-switcher-btn i { font-size: 15px; }
  .theme-switcher-label { display: none; }   /* icon-only · 悬停 title 显示文字 */
  .theme-switcher-panel {
    position: fixed;                   /* 绝对定位到视口 · 避免被 sidebar overflow:hidden 裁掉 · JS 计算位置 */
    min-width: 168px;
    background: var(--paper);
    border: 1px solid var(--rule);
    border-radius: 8px;
    padding: 6px;
    box-shadow: 0 6px 20px rgba(0, 0, 0, 0.18);
    display: none;
    flex-direction: column;
    gap: 2px;
    z-index: 200;
  }
  .theme-switcher.open .theme-switcher-panel { display: flex; }
  .ts-option {
    padding: 7px 12px;
    background: transparent;
    border: none;
    color: var(--ink);
    font-family: inherit;
    font-size: 12.5px;
    text-align: left;
    border-radius: 5px;
    cursor: pointer;
    transition: background .12s, color .12s;
    white-space: nowrap;
  }
  .ts-option:hover {
    background: var(--vermilion-bg);
    color: var(--vermilion);
  }
  .ts-option.active {
    background: var(--vermilion);
    color: #fff;
  }
  .ts-option.active:hover { color: #fff; }

  .serif { font-family: 'Cormorant Garamond', 'Noto Serif SC', serif; }
  .mono { font-family: 'JetBrains Mono', ui-monospace, monospace; font-size: 12px; }
  .cn-serif { font-family: 'Noto Serif SC', serif; }

  button, input, textarea { font-family: inherit; color: inherit; border: none; background: none; outline: none; }
  button { cursor: pointer; }

  /* ============ 通用顶部导航（0424 编辑版式） ============ */
  .topbar {
    height: 56px;
    padding: 0 24px;
    border-bottom: 1px solid var(--rule);
    display: flex;
    justify-content: space-between;
    align-items: center;
    background: var(--page-bg-translucent);
    backdrop-filter: blur(10px);
    -webkit-backdrop-filter: blur(10px);
    position: sticky;
    top: 0;
    z-index: 50;
  }

  .topbar-left { display: flex; align-items: center; gap: 24px; }
  .topbar-right { display: flex; align-items: center; gap: 12px; }

  /* 用户头像 hover 下拉菜单 */
  .user-menu-wrap {
    position: relative;
  }
  .user-menu {
    position: absolute;
    top: calc(100% + 6px);
    right: 0;
    min-width: 180px;
    background: var(--paper);
    border: 1px solid var(--rule);
    border-radius: 6px;
    padding: 6px;
    box-shadow: 0 8px 24px -6px rgba(0,0,0,0.12), 0 2px 6px -2px rgba(0,0,0,0.06);
    opacity: 0;
    pointer-events: none;
    transform: translateY(-4px);
    transition: opacity .18s ease, transform .18s ease;
    z-index: 100;
  }
  .user-menu.is-open {
    opacity: 1;
    pointer-events: auto;
    transform: translateY(0);
  }
  .user-menu-item {
    display: flex; align-items: center; justify-content: space-between;
    gap: 12px;
    padding: 8px 10px;
    border-radius: 4px;
    cursor: pointer;
    transition: background .15s;
    user-select: none;
  }
  .user-menu-item:hover { background: rgba(0,0,0,0.04); }

  /* 演示模式 toggle · 在 user-menu 内布局 */
  .demo-toggle {
    /* base 已被 .user-menu-item 包了大部分布局 */
  }
  .demo-toggle input[type="checkbox"] {
    position: absolute; opacity: 0; pointer-events: none;
    width: 0; height: 0;
  }
  .demo-toggle-switch {
    position: relative;
    width: 30px; height: 16px;
    background: rgba(0,0,0,0.18);
    border-radius: 8px;
    transition: background .2s;
    flex-shrink: 0;
  }
  .demo-toggle-knob {
    position: absolute;
    top: 2px; left: 2px;
    width: 12px; height: 12px;
    border-radius: 50%;
    background: #fff;
    box-shadow: 0 1px 2px rgba(0,0,0,0.15);
    transition: left .2s cubic-bezier(.22,.8,.26,1), background .2s;
  }
  .demo-toggle input:checked + .demo-toggle-switch {
    background: var(--vermilion);
  }
  .demo-toggle input:checked + .demo-toggle-switch .demo-toggle-knob {
    left: 16px;
  }
  .demo-toggle-label {
    font-family: 'Noto Serif SC', serif;
    font-size: 13px;
    color: var(--ink-soft);
    letter-spacing: 0.04em;
    transition: color .2s;
  }
  .demo-toggle input:checked ~ .demo-toggle-switch ~ .demo-toggle-label,
  .demo-toggle:has(input:checked) .demo-toggle-label {
    color: var(--vermilion);
    font-weight: 600;
  }

  /* ── 配置 按钮 · hover 弹出菜单（文献脉络梳理 / 知识库选择）── */
  .config-menu-wrap { position: relative; display: inline-flex; }
  #composerConfigBtn.active { background: var(--vermilion-bg); color: var(--vermilion); }
  .config-menu {
    position: absolute;
    bottom: calc(100% + 8px);
    left: 0;
    min-width: 208px;
    background: var(--paper);
    border: 1px solid var(--rule);
    border-radius: 8px;
    padding: 6px;
    box-shadow: 0 10px 28px -8px rgba(0,0,0,0.16), 0 2px 6px -2px rgba(0,0,0,0.07);
    opacity: 0;
    pointer-events: none;
    transform: translateY(4px);
    transition: opacity .18s ease, transform .18s ease;
    z-index: 100;
  }
  .config-menu.is-open { opacity: 1; pointer-events: auto; transform: translateY(0); }
  .config-menu-head {
    font-family: 'JetBrains Mono', monospace;
    font-size: 11px;
    letter-spacing: 0.16em;
    text-transform: uppercase;
    color: var(--ink-faint);
    padding: 6px 10px 8px;
  }
  .config-menu-item {
    display: flex; align-items: center; justify-content: space-between;
    gap: 16px;
    padding: 8px 10px;
    border-radius: 5px;
    cursor: pointer;
    transition: background .15s;
    user-select: none;
  }
  .config-menu-item:hover { background: rgba(0,0,0,0.04); }
  .cfg-toggle input[type="checkbox"] {
    position: absolute; opacity: 0; pointer-events: none; width: 0; height: 0;
  }
  .cfg-switch {
    position: relative;
    width: 30px; height: 16px;
    background: rgba(0,0,0,0.18);
    border-radius: 8px;
    transition: background .2s;
    flex-shrink: 0;
  }
  .cfg-knob {
    position: absolute;
    top: 2px; left: 2px;
    width: 12px; height: 12px;
    border-radius: 50%;
    background: #fff;
    box-shadow: 0 1px 2px rgba(0,0,0,0.15);
    transition: left .2s cubic-bezier(.22,.8,.26,1);
  }
  .cfg-toggle input:checked + .cfg-switch { background: var(--vermilion); }
  .cfg-toggle input:checked + .cfg-switch .cfg-knob { left: 16px; }
  .cfg-toggle-label {
    font-size: 13px;
    color: var(--ink-soft);
    transition: color .2s;
  }
  .cfg-toggle:has(input:checked) .cfg-toggle-label { color: var(--vermilion); font-weight: 600; }

  /* 演示模式字幕条 · 顶部浮层 · 透明底 · 居中 viewport 固定不跳跃
     橘色 #c97a3a 醒目又跟 paper 风格相合 */
  .demo-subtitle {
    position: fixed;
    top: 28px;
    left: 50%;
    transform: translate(-50%, -50%);
    z-index: 9999;
    background: transparent;
    border: none;
    box-shadow: none;
    display: inline-flex;
    align-items: baseline;
    gap: 12px;
    text-align: center;
    white-space: nowrap;
    pointer-events: none;
    opacity: 0;
    transition: opacity .28s ease;
  }
  .demo-subtitle.is-on {
    opacity: 1;
  }
  /* 步骤编号 · 橘色 #c97a3a · 跟文案统一暖色 */
  .demo-subtitle-num {
    font-family: 'JetBrains Mono', monospace;
    font-size: 18px;
    font-weight: 700;
    color: #c97a3a;
    letter-spacing: 0.08em;
    position: relative;
    top: -1px;
  }
  /* 步骤文案 · 橘色 #c97a3a 醒目 · 24px serif 800 + paper 色 text-shadow */
  .demo-subtitle-text {
    font-family: 'Noto Serif SC', serif;
    font-size: 24px;
    font-weight: 800;
    color: #c97a3a;
    letter-spacing: 0.06em;
    line-height: 1.3;
    text-shadow: 0 1px 0 var(--paper),
                 0 0 14px rgba(252,250,244,0.8);
  }
  .topbar-right .btn svg {
    width: 14px;
    height: 14px;
    stroke: currentColor;
    flex-shrink: 0;
  }
  .user-avatar {
    width: 32px;
    height: 32px;
    border-radius: 50%;
    display: inline-flex;
    align-items: center;
    justify-content: center;
    flex-shrink: 0;
    background: var(--ink);
    color: var(--paper);
    font-size: 13px;
    font-weight: 600;
    letter-spacing: 0.04em;
    border: 2px solid transparent;
    cursor: pointer;
    transition: border-color .15s, box-shadow .15s;
    font-family: 'Inter', sans-serif;
    padding: 0;
  }
  .user-avatar:hover {
    border-color: var(--vermilion);
    box-shadow: 0 0 0 3px var(--vermilion-bg);
  }
  .user-avatar svg {
    width: 16px;
    height: 16px;
    stroke: currentColor;
  }
  .result-push-btn {
    height: 30px;
    padding: 0 10px;
    justify-content: center;
    gap: 6px;
  }
  .result-push-btn svg {
    width: 14px;
    height: 14px;
    stroke: currentColor;
  }
  .result-push-btn.is-hidden {
    display: none;
  }

  .logo {
    display: flex;
    align-items: center;       /* 0529 · 与 icon 圆心对齐 */
    gap: 10px;
    cursor: pointer;
    user-select: none;
  }
  /* 0529 · 参考 aerospace_tenant_v2 · 圆形墨色徽标 + 十字准星 */
  .logo-icon {
    width: 28px;
    height: 28px;
    background: var(--ink);
    border-radius: 50%;
    position: relative;
    flex-shrink: 0;
    display: inline-block;
  }
  .logo-icon::before,
  .logo-icon::after {
    content: '';
    position: absolute;
    background: var(--page-bg);
  }
  .logo-icon::before {
    top: 50%; left: 4px; right: 4px;
    height: 1px;
    transform: translateY(-50%);
  }
  .logo-icon::after {
    left: 50%; top: 4px; bottom: 4px;
    width: 1px;
    transform: translateX(-50%);
  }
  .logo-mark {
    font-family: 'Noto Serif SC', serif;
    font-style: normal;
    font-size: 18px;
    font-weight: 500;
    color: var(--ink);
    letter-spacing: 2px;
  }
  .logo-mark em { color: var(--vermilion); font-style: normal; font-weight: 500; }
  .logo-tag {
    font-family: 'JetBrains Mono', monospace;
    font-size: 12px;
    color: var(--ink-mute);
    letter-spacing: 0.18em;
    text-transform: uppercase;
  }

  .breadcrumb {
    display: flex;
    align-items: center;
    gap: 10px;
    font-size: 13px;
    color: var(--ink-mute);
    font-family: 'JetBrains Mono', monospace;
  }
  .breadcrumb .sep { color: var(--ink-faint); }
  .breadcrumb .current { color: var(--ink); }

  .btn {
    padding: 7px 14px;
    border: 1px solid var(--rule);
    font-size: 13px;
    color: var(--ink-soft);
    border-radius: 2px;
    transition: all .15s;
    display: inline-flex;
    align-items: center;
    gap: 6px;
    background: var(--paper);
  }
  .btn:hover { border-color: var(--ink-soft); color: var(--ink); }
  .btn.btn-primary {
    background: var(--ink); color: var(--paper); border-color: var(--ink);
  }
  .btn.btn-primary:hover { background: var(--vermilion); border-color: var(--vermilion); }
  .btn.btn-ghost { border-color: transparent; background: transparent; }
  .btn.btn-ghost:hover { border-color: var(--rule); background: var(--paper-warm); }
  a.btn { text-decoration: none; }

  /* =================================== */
  /* =========== 页面切换容器 ============ */
  /* =================================== */
  .page { display: none; }
  .page.active { display: block; }
  /* 首页用 flex 列垂直居中：内容随屏自适应居中显示 */
  #pageHome.page.active {
    display: flex;
    flex-direction: column;
    justify-content: center;
    align-items: center;
    min-height: calc(100vh - 56px);
    position: relative;
    overflow: hidden;
  }

  /* 首页背景：极轻盈的点阵网格 · 已按需求隐藏（display:none 覆盖，保留规则作为文档） */
  #pageHome.page.active::before {
    content: "";
    display: none;
    position: absolute;
    inset: 0;
    pointer-events: none;
    z-index: 0;
    background-image: url("data:image/svg+xml;utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='40' height='40'%3E%3Ccircle cx='20' cy='20' r='1.5' fill='%23d1c299'/%3E%3C/svg%3E");
    background-size: 40px 40px;
    background-repeat: repeat;
    -webkit-mask-image: radial-gradient(ellipse 75% 65% at 30% 40%, rgba(0,0,0,0.95) 0%, rgba(0,0,0,0.35) 55%, rgba(0,0,0,0.7) 100%);
            mask-image: radial-gradient(ellipse 75% 65% at 30% 40%, rgba(0,0,0,0.95) 0%, rgba(0,0,0,0.35) 55%, rgba(0,0,0,0.7) 100%);
    -webkit-mask-size: 220% 220%;
            mask-size: 220% 220%;
    -webkit-mask-repeat: no-repeat;
            mask-repeat: no-repeat;
    opacity: 0.45;
    animation: homeDotWave 8s ease-in-out infinite;
  }

  @keyframes homeDotWave {
    0%   { -webkit-mask-position: 0% 100%;   mask-position: 0% 100%;   opacity: 0.30; }
    50%  { -webkit-mask-position: 100% 0%;   mask-position: 100% 0%;   opacity: 0.58; }
    100% { -webkit-mask-position: 0% 100%;   mask-position: 0% 100%;   opacity: 0.30; }
  }

  @media (prefers-reduced-motion: reduce) {
    #pageHome.page.active::before { animation: none; opacity: 0.45; }
  }

  /* ========================================= */
  /* ============ 页面一：首页 ================= */
  /* ========================================= */
  .home-wrap {
    width: 100%;
    padding: 60px 48px 32px;
    max-width: 1192px;
    margin: 0 auto;
    position: relative;
    z-index: 1;
  }

  .home-hero {
    text-align: center;
    margin-bottom: 40px;
    position: relative;
  }

  .home-eyebrow {
    font-family: 'JetBrains Mono', monospace;
    font-size: 12px;
    color: var(--vermilion);
    letter-spacing: 0.28em;
    text-transform: uppercase;
    margin-bottom: 20px;
    display: inline-flex;
    align-items: center;
    gap: 12px;
  }
  .home-eyebrow::before, .home-eyebrow::after {
    content: ""; width: 24px; height: 1px; background: var(--vermilion);
  }

  .home-title {
    font-family: 'Cormorant Garamond', 'Noto Serif SC', serif;
    font-size: 46px;
    font-weight: 700;
    line-height: 1.15;
    letter-spacing: -0.02em;
    margin-bottom: 18px;
  }
  .home-title em { font-style: italic; color: var(--vermilion); font-weight: 700; }

  .home-subtitle {
    font-family: 'Inter', 'Noto Sans SC', -apple-system, sans-serif;
    font-size: 16px;
    font-weight: 300;
    color: var(--ink-mute);
    line-height: 1.7;
    letter-spacing: 0.01em;
    max-width: 560px;
    margin: 0 auto;
  }

  /* -------- 对话输入框 -------- */
  .composer {
    max-width: 880px;
    margin: 0 auto 0;
    background: var(--paper);          /* 从硬编 #fff 改成主题 token · 深色主题下自动跟随 --paper 变深 */
    border: 1px solid var(--rule);
    border-radius: 4px;
    box-shadow: 0 2px 8px rgba(15,28,46,0.06), 0 0 0 1px rgba(26,79,140,0.04);
    transition: border-color .2s, box-shadow .2s;
  }
  .composer:focus-within {
    border-color: var(--vermilion);
    box-shadow: 0 2px 12px rgba(26,79,140,0.12), 0 0 0 3px rgba(26,79,140,0.08);
  }

  .mode-tabs {
    display: flex;
    align-items: center;
    padding: 10px 12px;
    border-bottom: 1px solid var(--rule-soft);
    gap: 4px;
    overflow-x: auto;
  }

  .mode-label {
    font-family: 'JetBrains Mono', monospace;
    font-size: 12px;
    letter-spacing: 0.18em;
    text-transform: uppercase;
    color: var(--ink-faint);
    padding: 0 10px 0 6px;
    border-right: 1px solid var(--rule);
    margin-right: 6px;
    white-space: nowrap;
  }

  .mode-tab {
    padding: 7px 14px;
    font-size: 13px;
    color: var(--ink-soft);
    border-radius: 4px;
    white-space: nowrap;
    display: inline-flex;
    align-items: center;
    gap: 6px;
    transition: all .15s;
    border: 1px solid transparent;
  }
  .mode-tab:hover { background: var(--paper-warm); }
  .mode-tab.active {
    background: var(--vermilion);
    color: #fff;
    border-color: var(--vermilion);
  }
  .mode-tab.active .mode-tab-icon { opacity: 0.9; }
  .mode-tab .mode-tab-icon {
    width: 14px; height: 14px;
    opacity: 0.6;
    flex-shrink: 0;
  }
  .mode-tab.collective.active {
    background: var(--vermilion); border-color: var(--vermilion);
  }

  .composer-body {
    padding: 20px 22px 16px;
  }

  .composer-input {
    width: 100%;
    min-height: 72px;
    max-height: 240px;       /* ~ 8 行后封顶，内部滚动 */
    padding-right: 6px;      /* 给文字与滚动条之间留呼吸 */
    font-size: 14px;
    line-height: 1.65;
    color: var(--ink);
    resize: none;
    background: transparent;
    font-family: 'Inter', 'Noto Serif SC', sans-serif;
    overflow-y: auto;
    transition: height .15s ease;
    /* Firefox 细滚动条 + 极淡灰 */
    scrollbar-width: thin;
    scrollbar-color: rgba(0,0,0,0.10) transparent;
  }
  .composer-input::placeholder { color: var(--ink-faint); font-style: normal; }
  /* Webkit 弱化滚动条 · 轨道 10px 但拇指视觉 4px（用 transparent border + background-clip 卡出对称 padding）
     · 默认极淡 0.08 几乎不抢戏 · hover textarea 提到 0.14 · 拇指直接 hover 0.25 准备拖拽 */
  .composer-input::-webkit-scrollbar { width: 10px; }
  .composer-input::-webkit-scrollbar-track { background: transparent; }
  .composer-input::-webkit-scrollbar-thumb {
    background-color: rgba(0,0,0,0.08);
    border-radius: 5px;
    border: 3px solid transparent;
    background-clip: padding-box;
    min-height: 28px;
    transition: background-color .2s;
  }
  .composer-input:hover::-webkit-scrollbar-thumb,
  .composer-input:focus::-webkit-scrollbar-thumb {
    background-color: rgba(0,0,0,0.14);
  }
  .composer-input::-webkit-scrollbar-thumb:hover {
    background-color: rgba(0,0,0,0.28);
  }
  .composer-input--filled {
    animation: inputFilled .8s ease-out;
  }
  @keyframes inputFilled {
    0%   { background: var(--vermilion-bg); }
    100% { background: transparent; }
  }

  .composer-footer {
    display: flex;
    justify-content: space-between;
    align-items: center;
    margin-top: 12px;
  }

  .composer-hint {
    font-family: 'JetBrains Mono', monospace;
    font-size: 12px;
    color: var(--ink-faint);
    letter-spacing: 0.08em;
  }

  .send-btn {
    padding: 8px 18px;
    background: var(--vermilion);
    color: #fff;
    font-size: 13px;
    border-radius: 2px;
    display: inline-flex;
    align-items: center;
    gap: 8px;
    transition: background .15s;
    font-weight: 500;
    letter-spacing: 0.03em;
  }
  .send-btn:hover { background: #1a50b8; }
  #composerSendBtn:hover { background: var(--ink); }
  .send-btn svg { width: 13px; height: 13px; }
  /* 空输入时置灰 · 由 _composerAutoGrow 同步 disabled 属性 */
  .send-btn:disabled,
  .send-btn[disabled] {
    background: var(--rule);
    color: var(--ink-faint);
    cursor: not-allowed;
    opacity: 0.7;
  }
  .send-btn:disabled:hover,
  .send-btn[disabled]:hover {
    background: var(--rule);
  }

  /* -------- 首页 · 领域快捷 Chip 行（输入框下方） -------- */
  .domain-chips-row {
    max-width: 820px;
    margin: 14px auto 0;
    display: flex;
    align-items: center;
    justify-content: center;
    flex-wrap: wrap;
    gap: 8px;
    padding: 0 2px;
  }

  /* 行标签：研究方向 · */
  .domain-chips-label {
    font-family: 'JetBrains Mono', monospace;
    font-size: 12px;
    letter-spacing: 0.15em;
    text-transform: uppercase;
    color: var(--ink-faint);
    flex-shrink: 0;
    margin-right: 4px;
    white-space: nowrap;
  }

  /* 方角卡片风格，区别于示例胶囊 */
  .domain-chip {
    display: inline-flex;
    align-items: center;
    gap: 7px;
    padding: 6px 13px 6px 10px;
    background: var(--paper-warm);
    border: 1px solid var(--rule);
    border-radius: 7px;
    font-size: 13px;
    color: var(--ink-soft);
    cursor: pointer;
    transition: all .18s;
    white-space: nowrap;
    user-select: none;
    box-shadow: 0 1px 2px rgba(26,35,50,0.04);
  }
  .domain-chip:hover {
    border-color: var(--vermilion-soft);
    color: var(--vermilion);
    background: var(--vermilion-bg);
    box-shadow: 0 2px 8px -2px rgba(26,79,140,0.15);
  }
  .domain-chip.active {
    background: var(--vermilion);
    color: #fff;
    border-color: var(--vermilion);
    box-shadow: 0 2px 8px -2px rgba(26,79,140,0.3);
  }
  .domain-chip svg {
    width: 14px; height: 14px;
    flex-shrink: 0;
    opacity: 0.55;
  }
  .domain-chip:hover svg { opacity: 0.85; }
  .domain-chip.active svg { opacity: 1; }

  /* 输入框内的模式标签 Badge */
  .composer-mode-badge {
    display: none;
    align-items: center;
    gap: 5px;
    margin-bottom: 10px;
    padding: 3px 8px 3px 8px;
    background: var(--vermilion-bg);
    border: 1px solid var(--vermilion-soft);
    border-radius: 20px;
    width: fit-content;
    animation: slideDown .18s ease-out;
  }
  .composer-mode-badge.visible { display: inline-flex; }
  .badge-icon { width: 13px; height: 13px; color: var(--vermilion); flex-shrink: 0; }
  .badge-label {
    font-size: 12px;
    color: var(--vermilion);
    font-weight: 500;
    letter-spacing: 0.02em;
  }
  .badge-cancel {
    width: 16px; height: 16px;
    display: flex; align-items: center; justify-content: center;
    border-radius: 50%;
    font-size: 14px; line-height: 1;
    color: var(--vermilion);
    cursor: pointer;
    margin-left: 1px;
    opacity: 0.7;
    transition: opacity .15s, background .15s;
  }
  .badge-cancel:hover { opacity: 1; background: rgba(26,79,140,0.15); }

  /* -------- 智能体概览（当选择单一智能体时显示，弱化版） -------- */
  .mode-hint {
    max-width: 820px;
    margin: 0 auto 72px;
    padding: 11px 16px;
    border: 1px solid var(--rule-soft);
    border-radius: 4px;
    background: var(--paper-cool);
    display: flex;
    gap: 12px;
    align-items: flex-start;
    animation: slideDown .25s ease-out;
  }
  @keyframes slideDown {
    from { opacity: 0; transform: translateY(-4px); }
    to { opacity: 1; transform: translateY(0); }
  }
  .mode-hint-title {
    font-family: 'JetBrains Mono', monospace;
    font-size: 12px;
    letter-spacing: 0.12em;
    text-transform: uppercase;
    color: var(--ink-mute);
    margin-bottom: 5px;
  }
  .mode-hint-desc {
    font-size: 12px;
    color: var(--ink-mute);
    line-height: 1.65;
  }
  .mode-hint-tags {
    display: flex;
    flex-wrap: wrap;
    gap: 4px;
    margin-top: 8px;
  }
  .mode-hint-tags span {
    font-family: 'JetBrains Mono', monospace;
    font-size: 12px;
    padding: 1px 7px;
    background: transparent;
    border: 1px solid var(--rule);
    color: var(--ink-faint);
    border-radius: 2px;
  }

  /* -------- 群体智能对话页场景选择器 -------- */
  .collective-picker {
    flex: 1;
    overflow-y: auto;
    padding: 28px 28px 16px;
    display: flex;
    flex-direction: column;
    gap: 20px;
    animation: slideDown .25s ease-out;
  }
  .cp-intro { }
  .cp-eyebrow {
    font-family: 'JetBrains Mono', monospace;
    font-size: 12px;
    letter-spacing: 0.18em;
    text-transform: uppercase;
    color: var(--vermilion);
    margin-bottom: 6px;
  }
  .cp-desc {
    font-size: 13px;
    color: var(--ink-mute);
    line-height: 1.65;
  }
  .cp-cards {
    display: grid;
    grid-template-columns: 1fr 1fr;
    gap: 16px;
    align-items: start;
  }
  .cp-card-wide {
    grid-column: span 2;
  }
  /* 计算模拟卡片内代码块 */
  .cp-step-code {
    display: block;
    margin-top: 3px;
    background: #1a2332;
    border-radius: 3px;
    padding: 5px 10px;
    font-family: 'JetBrains Mono', monospace;
    font-size: 12px;
    color: #a0f0a0;
    line-height: 1.6;
    white-space: pre;
    overflow-x: auto;
  }
  .cp-step-code .cli-prompt { color: var(--vermilion-soft); }
  .cp-step-code .cli-comment { color: #5a7a5a; }
  .cp-step-code .code-kw { color: #79b8ff; }
  .cp-step-code .code-str { color: #f0a0a0; }
  /* 阶段分隔线 */
  .cp-phase-divider {
    display: flex;
    align-items: center;
    gap: 10px;
    margin: 6px 0 4px;
  }
  .cp-phase-label {
    font-family: 'JetBrains Mono', monospace;
    font-size: 12px;
    letter-spacing: 0.12em;
    text-transform: uppercase;
    color: var(--ink-faint);
    white-space: nowrap;
  }
  .cp-phase-line {
    flex: 1;
    height: 1px;
    background: var(--rule);
  }
  .cp-card {
    border: 1px solid var(--rule);
    border-radius: 6px;
    overflow: hidden;
    background: var(--paper);
    cursor: pointer;
    transition: border-color .2s, box-shadow .2s, transform .15s;
  }
  .cp-card:hover {
    border-color: var(--vermilion);
    box-shadow: 0 4px 20px rgba(26,79,140,0.12);
    transform: translateY(-1px);
  }
  .cp-card.active {
    border-color: var(--vermilion);
    box-shadow: 0 0 0 2px rgba(26,79,140,0.18);
  }
  .cp-card-head {
    padding: 14px 16px 12px;
    border-bottom: 1px solid var(--rule-soft);
    display: flex;
    align-items: center;
    gap: 11px;
  }
  .cp-card-icon {
    width: 34px;
    height: 34px;
    border-radius: 6px;
    background: var(--vermilion-bg);
    border: 1px solid rgba(26,79,140,0.18);
    display: flex;
    align-items: center;
    justify-content: center;
    flex-shrink: 0;
  }
  .cp-card-icon svg { width: 16px; height: 16px; stroke: var(--vermilion); }
  .cp-card-title {
    font-family: 'Noto Serif SC', serif;
    font-size: 14px;
    font-weight: 600;
    color: var(--ink);
    margin-bottom: 2px;
    letter-spacing: 0.02em;
  }
  .cp-card-sub {
    font-family: 'JetBrains Mono', monospace;
    font-size: 12px;
    color: var(--ink-mute);
    letter-spacing: 0.06em;
  }
  .cp-card-badge {
    margin-left: auto;
    font-family: 'JetBrains Mono', monospace;
    font-size: 12px;
    padding: 2px 7px;
    background: var(--paper-warm);
    border: 1px solid var(--rule);
    color: var(--ink-mute);
    border-radius: 2px;
    white-space: nowrap;
    flex-shrink: 0;
  }
  .cp-workflow {
    padding: 12px 16px;
    display: flex;
    flex-direction: column;
    gap: 8px;
  }
  .cp-step {
    display: flex;
    align-items: baseline;
    gap: 7px;
    font-size: 12px;
    line-height: 1.5;
    padding: 3px 6px 3px 4px;
    border-radius: 4px;
    border-left: 2px solid transparent;
    margin-left: -6px;
    transition: background .15s, border-left-color .15s;
    cursor: default;
  }
  .cp-step:hover {
    background: var(--paper-warm);
    border-left-color: var(--ink-faint);
  }
  .cp-step.active {
    background: rgba(200,60,40,.06);
    border-left-color: var(--vermilion);
  }
  .cp-step.active .cp-step-num { color: var(--vermilion); }
  .cp-step.active .cp-step-label { color: var(--ink); }
  .cp-step-num {
    font-family: 'JetBrains Mono', monospace;
    font-size: 12px;
    color: var(--ink-faint);
    min-width: 18px;
    flex-shrink: 0;
  }
  .cp-step-type {
    font-family: 'JetBrains Mono', monospace;
    font-size: 12px;
    padding: 1px 5px;
    border-radius: 2px;
    text-transform: uppercase;
    letter-spacing: 0.05em;
    flex-shrink: 0;
  }
  .cp-step-type.llm  { background: #e6eeff; color: #2a4fd0; }
  .cp-step-type.mcp  { background: var(--aux-purple-bg); color: var(--aux-purple); }
  .cp-step-type.skill{ background: #e6f7f4; color: #167a68; }
  .cp-step-type.agent{ background: #fff4e8; color: #b05800; }
  .cp-step-type.cli  { background: #1a2338; color: #80eaa0; }
  .cp-step-label {
    color: var(--ink-soft);
    flex: 1;
  }
  .cp-step-label code {
    font-family: 'JetBrains Mono', monospace;
    font-size: 12px;
    background: var(--paper-warm);
    border: 1px solid var(--rule);
    padding: 0 4px;
    border-radius: 2px;
    color: var(--ink);
  }
  .cp-card-footer {
    padding: 9px 16px 12px;
    border-top: 1px solid var(--rule-soft);
    display: flex;
    align-items: center;
    justify-content: space-between;
  }
  .cp-tags {
    display: flex;
    gap: 5px;
  }
  .cp-tags span {
    font-family: 'JetBrains Mono', monospace;
    font-size: 12px;
    padding: 1px 6px;
    background: var(--paper-warm);
    border: 1px solid var(--rule);
    color: var(--ink-mute);
    border-radius: 2px;
  }
  .cp-launch {
    font-size: 12px;
    color: var(--vermilion);
    display: flex;
    align-items: center;
    gap: 4px;
    font-weight: 500;
  }
  .cp-launch svg { width: 11px; height: 11px; }
  .cp-experiment-summary {
    display: grid;
    grid-template-columns: repeat(3, minmax(0, 1fr));
    gap: 8px;
  }
  .cp-experiment-metric {
    border: 1px solid var(--rule-soft);
    background: var(--paper-warm);
    border-radius: 4px;
    padding: 9px 10px;
    min-width: 0;
  }
  .cp-experiment-metric .k {
    font-family: 'JetBrains Mono', monospace;
    font-size: 12px;
    letter-spacing: 0.08em;
    text-transform: uppercase;
    color: var(--ink-faint);
    margin-bottom: 4px;
  }
  .cp-experiment-metric .v {
    font-size: 13px;
    color: var(--ink);
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
  }
  .cp-experiment-progress {
    margin-top: 10px;
  }
  .cp-experiment-progress-row {
    display: flex;
    justify-content: space-between;
    font-family: 'JetBrains Mono', monospace;
    font-size: 12px;
    color: var(--ink-mute);
    margin-bottom: 6px;
  }
  .cp-experiment-progress-bar {
    height: 7px;
    border-radius: 999px;
    background: var(--rule-soft);
    overflow: hidden;
  }
  .cp-experiment-progress-fill {
    height: 100%;
    border-radius: inherit;
    background: var(--vermilion);
  }

  /* -------- 最近项目 -------- */
  .section-head {
    display: flex;
    justify-content: space-between;
    align-items: baseline;
    margin-bottom: 28px;
    padding-bottom: 16px;
    border-bottom: 1px solid var(--rule);
  }
  .section-head-left { display: flex; align-items: baseline; gap: 14px; }
  .section-num {
    font-family: 'Inter', sans-serif;
    font-style: normal;
    font-size: 12px;
    color: var(--vermilion);
    letter-spacing: 0.18em;
    text-transform: uppercase;
    font-weight: 500;
  }
  .section-title {
    font-family: 'Noto Serif SC', serif;
    font-size: 22px;
    font-weight: 600;
    color: var(--ink);
    letter-spacing: 0.02em;
  }
  .section-sub {
    font-size: 13px;
    color: var(--ink-mute);
    font-family: 'Inter', sans-serif;
    letter-spacing: 0.05em;
  }

  .project-grid {
    display: grid;
    grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));
    gap: 16px;
  }

  .project-card {
    border: 1px solid var(--rule);
    background: #fff;
    padding: 22px;
    border-radius: 3px;
    cursor: pointer;
    transition: all .2s ease;
    position: relative;
    display: flex;
    flex-direction: column;
    min-height: 180px;
  }
  .project-card:hover {
    border-color: var(--vermilion);
    transform: translateY(-1px);
    box-shadow: 0 8px 24px -12px rgba(26,79,140,0.18);
  }

  .project-card .domain-dot {
    position: absolute;
    top: 20px; right: 20px;
    width: 8px; height: 8px;
    border-radius: 50%;
    background: var(--brand);
  }
  .project-card .domain-dot.life     { background: var(--disc-life); }
  .project-card .domain-dot.neuro    { background: var(--disc-neuro); }
  .project-card .domain-dot.chem     { background: var(--disc-chem); }
  .project-card .domain-dot.astro    { background: var(--disc-astro); }
  .project-card .domain-dot.earth    { background: var(--disc-earth); }
  .project-card .domain-dot.material { background: var(--disc-material); }
  .project-card .domain-dot.math     { background: var(--disc-math); }
  .project-card .domain-dot.physics  { background: var(--disc-physics); }
  .project-card .domain-dot.matter   { background: var(--disc-material); }
  .project-card .domain-dot.autolab  { background: var(--brand-deep); }

  .project-domain {
    font-family: 'JetBrains Mono', monospace;
    font-size: 12px;
    letter-spacing: 0.2em;
    color: var(--ink-mute);
    text-transform: uppercase;
    margin-bottom: 10px;
  }

  .project-name {
    font-family: 'Noto Serif SC', serif;
    font-size: 16px;
    font-weight: 600;
    color: var(--ink);
    line-height: 1.35;
    margin-bottom: 6px;
    letter-spacing: 0.02em;
  }
  .project-desc {
    font-size: 13px;
    color: var(--ink-mute);
    line-height: 1.6;
    flex-grow: 1;
    margin-bottom: 16px;
  }

  .project-meta {
    display: flex;
    justify-content: space-between;
    align-items: center;
    padding-top: 14px;
    border-top: 1px solid var(--rule-soft);
    font-family: 'JetBrains Mono', monospace;
    font-size: 12px;
    color: var(--ink-faint);
    letter-spacing: 0.05em;
  }
  .project-meta .assets { display: flex; gap: 10px; }
  .project-meta .assets span { color: var(--ink-soft); }

  .project-card.new-project {
    background: var(--paper-warm);
    border-style: dashed;
    align-items: center;
    justify-content: center;
    text-align: center;
    color: var(--ink-mute);
  }
  .project-card.new-project:hover {
    background: var(--accent-bg);
    border-color: var(--vermilion);
    color: var(--vermilion);
  }
  .project-card.new-project .plus {
    font-family: 'Inter', sans-serif;
    font-size: 36px;
    font-weight: 200;
    line-height: 1;
    margin-bottom: 8px;
  }
  .project-card.new-project .label {
    font-family: 'Noto Serif SC', serif;
    font-style: normal;
    font-size: 14px;
    font-weight: 500;
    letter-spacing: 0.05em;
  }
  .project-card.new-project .sublabel {
    font-family: 'Inter', sans-serif;
    font-size: 12px;
    letter-spacing: 0.12em;
    margin-top: 4px;
  }


  /* =========================================== */
  /* ============ 页面二：对话页 ================ */
  /* =========================================== */
  .chat-wrap {
    --asset-preview-w: clamp(340px, 34vw, 520px);
    display: grid;
    grid-template-columns: 272px 1px minmax(420px, 1fr) 5px minmax(520px, 42vw);
    height: 100vh;
    height: 100dvh;
    width: 100%;
    overflow: hidden;
    transition: grid-template-columns 0.25s ease, width 0.25s ease;
  }
  .chat-wrap.asset-preview-open {
    width: calc(100% - var(--asset-preview-w));
  }
  .chat-wrap.asset-collapsed {
    grid-template-columns: 36px 1px minmax(420px, 1fr) 5px minmax(520px, 42vw);
  }
  .chat-wrap.workspace-collapsed {
    grid-template-columns: 272px 1px 1fr 0 36px;
  }
  .chat-wrap.asset-collapsed.workspace-collapsed {
    grid-template-columns: 36px 1px 1fr 0 36px;
  }

  /* 面板拖动分割线 */
  .panel-resize-handle {
    position: relative;
    z-index: 20;
    cursor: ew-resize;
    background: transparent;
    transition: background 0.15s;
    flex-shrink: 0;
    user-select: none;
  }
  .panel-resize-handle::after {
    content: '';
    position: absolute;
    top: 0; bottom: 0;
    left: 50%; transform: translateX(-50%);
    width: 1px;
    background: var(--rule);
    transition: width 0.15s, background 0.15s;
  }
  .panel-resize-handle:hover::after,
  .panel-resize-handle.dragging::after {
    width: 3px;
    background: var(--brand-mid);
  }
  #assetResizeHandle::after,
  #assetResizeHandle:hover::after,
  #assetResizeHandle.dragging::after {
    width: 1px;
  }
  .chat-wrap.asset-collapsed .panel-resize-handle:first-of-type,
  .chat-wrap.workspace-collapsed .panel-resize-handle:last-of-type {
    cursor: default;
    pointer-events: none;
  }
  .chat-wrap.workspace-collapsed #workspaceResizeHandle {
    display: none;
  }
  .chat-wrap.asset-collapsed .panel-resize-handle:first-of-type::after,
  .chat-wrap.workspace-collapsed .panel-resize-handle:last-of-type::after {
    background: var(--rule-soft);
    width: 1px;
  }

  /* ------- 左侧：资产空间 ------- */
  .asset-panel {
    background: var(--paper-cool);
    display: flex;
    flex-direction: column;
    overflow: hidden;
    transition: all 0.25s ease;
    position: relative;
  }

  .asset-header {
    padding: 10px 20px 10px;
    border-bottom: 1px solid var(--rule);
    display: flex;
    align-items: center;
    justify-content: space-between;
    flex-shrink: 0;
  }
  .asset-header-text { flex: 1; min-width: 0; }
  .asset-title {
    font-family: 'Noto Serif SC', serif;
    font-size: 14px;
    font-weight: 600;
    color: var(--ink);
    margin-bottom: 2px;
    letter-spacing: 0.02em;
  }
  .asset-subtitle {
    font-family: 'JetBrains Mono', monospace;
    font-size: 12px;
    color: var(--ink-mute);
    letter-spacing: 0.15em;
    text-transform: uppercase;
  }

  /* 折叠按钮 */
  .panel-collapse-btn {
    flex-shrink: 0;
    width: 22px;
    height: 22px;
    display: flex;
    align-items: center;
    justify-content: center;
    border-radius: 4px;
    color: var(--ink-mute);
    cursor: pointer;
    transition: background 0.15s, color 0.15s;
    margin-top: 2px;
  }
  .panel-collapse-btn:hover {
    background: var(--rule);
    color: var(--ink);
  }
  .panel-collapse-btn svg { width: 14px; height: 14px; }

  /* 折叠后的竖排标签条 */
  .panel-collapsed-strip {
    display: none;
    flex-direction: column;
    align-items: center;
    justify-content: center;
    width: 36px;          /* 显式宽度，与折叠态 grid track 对齐，避免 0 宽度 */
    min-width: 36px;
    max-width: 36px;
    flex-shrink: 0;
    height: 100%;
    cursor: pointer;
    gap: 10px;
    padding: 12px 0;
    box-sizing: border-box;
    overflow: visible;    /* 防止 36px 容器把垂直文字裁掉 */
  }
  .panel-collapsed-strip:hover { background: rgba(0,0,0,0.02); }
  .panel-collapsed-strip .strip-icon {
    color: var(--ink-mute);
    width: 16px;
    height: 16px;
    flex-shrink: 0;
  }
  .panel-collapsed-strip .strip-label {
    font-family: 'Noto Serif SC', serif;
    font-size: 13px;
    font-weight: 500;
    color: var(--ink-mute);
    writing-mode: vertical-rl;       /* 文字竖排 · 从上到下 */
    text-orientation: mixed;
    letter-spacing: 0.12em;
    white-space: nowrap;             /* 防换行 */
    flex-shrink: 0;
    line-height: 1.2;
  }

  /* 折叠状态下隐藏内容、展示竖条 */
  .asset-panel.collapsed .asset-header,
  .asset-panel.collapsed .asset-tabs,
  .asset-panel.collapsed .asset-content {
    display: none;
  }
  .asset-panel.collapsed .panel-collapsed-strip {
    display: flex;
  }

  .asset-tabs {
    display: flex;
    padding: 0 8px;
    border-bottom: 1px solid var(--rule);
    overflow-x: auto;
  }
  .asset-tab {
    padding: 12px 10px;
    font-size: 12px;
    color: var(--ink-mute);
    border-bottom: 2px solid transparent;
    margin-bottom: -1px;
    transition: all .15s;
    position: relative;
    white-space: nowrap;
  }
  .asset-tab:hover { color: var(--ink); }
  .asset-tab.active {
    color: var(--ink);
    border-bottom-color: var(--vermilion);
    font-weight: 500;
  }
  .asset-tab .count {
    font-family: 'JetBrains Mono', monospace;
    font-size: 12px;
    margin-left: 4px;
    color: var(--ink-faint);
  }

  .asset-content {
    flex: 1;
    overflow-y: auto;
    padding: 14px 16px;
  }

  .asset-section-label {
    font-family: 'JetBrains Mono', monospace;
    font-size: 12px;
    letter-spacing: 0.18em;
    text-transform: uppercase;
    color: var(--ink-faint);
    margin-bottom: 10px;
    display: flex;
    justify-content: space-between;
  }

  .asset-item {
    padding: 10px 12px;
    border-radius: 3px;
    margin-bottom: 4px;
    cursor: pointer;
    transition: background .15s;
    display: flex;
    align-items: flex-start;
    gap: 10px;
  }
  .asset-item:hover { background: var(--paper-warm); }
  .asset-item.active {
    background: var(--vermilion-bg);
    border-color: var(--vermilion-soft);
  }
  .asset-item-icon {
    width: 14px; height: 14px;
    color: var(--ink-mute);
    flex-shrink: 0;
    margin-top: 2px;
  }
  .asset-item-icon svg { width: 100%; height: 100%; stroke: currentColor; fill: none; stroke-width: 1.5; }
  .asset-item-main { flex: 1; min-width: 0; }
  .asset-item-name {
    font-size: 13px;
    color: var(--ink);
    line-height: 1.4;
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
  }
  .asset-item-meta {
    font-family: 'JetBrains Mono', monospace;
    font-size: 12px;
    color: var(--ink-mute);
    margin-top: 2px;
    letter-spacing: 0.03em;
  }

  .asset-add {
    width: 100%;
    padding: 10px 12px;
    border: 1px dashed var(--rule);
    border-radius: 3px;
    margin-top: 10px;
    font-family: 'JetBrains Mono', monospace;
    font-size: 12px;
    letter-spacing: 0.1em;
    text-transform: uppercase;
    color: var(--ink-mute);
    transition: all .15s;
    display: flex;
    align-items: center;
    justify-content: center;
    gap: 6px;
  }
  .asset-add:hover {
    border-color: var(--vermilion);
    color: var(--vermilion);
    border-style: solid;
  }

  /* ------- 中间：对话过程 ------- */
  .chat-panel {
    display: flex;
    flex-direction: column;
    overflow: hidden;
    background: var(--paper);
    position: relative;
  }

  .chat-header {
    padding: 0 20px;
    height: 38px;
    border-bottom: 1px solid var(--rule);
    display: flex;
    justify-content: space-between;
    align-items: center;
    flex-shrink: 0;
  }
  .chat-header-left {
    display: flex;
    align-items: center;
    gap: 8px;
    min-width: 0;
  }
  .chat-header-actions {
    display: flex;
    align-items: center;
    gap: 8px;
    flex-shrink: 0;
  }
  .chat-header .result-push-btn {
    height: 28px;
    padding: 0 9px;
  }
  .chat-canvas-toggle {
    display: none;
    width: 28px;
    height: 28px;
    align-items: center;
    justify-content: center;
    border: 1px solid var(--rule);
    border-radius: 4px;
    background: var(--paper);
    color: var(--ink-mute);
    cursor: pointer;
    transition: color .15s, border-color .15s, background .15s;
  }
  .chat-canvas-toggle i { font-size: 15px; }
  .chat-canvas-toggle:hover {
    color: var(--vermilion);
    border-color: var(--vermilion-soft);
    background: var(--vermilion-bg);
  }
  .chat-wrap[data-explore-mode="deduction"].canvas-collapsed .chat-canvas-toggle {
    display: inline-flex;
  }
  .chat-mode-badge {
    font-family: 'Noto Serif SC', serif;
    font-size: 12px;
    padding: 2px 8px;
    background: var(--vermilion-bg);
    border: 1px solid var(--vermilion-soft);
    color: var(--vermilion);
    letter-spacing: 0.06em;
    border-radius: 2px;
    flex-shrink: 0;
    line-height: 1.6;
    display: inline-flex;
    align-items: center;
    gap: 4px;
  }
  /* 专家引擎 + 人机交互 共用中性配色 · 视觉对齐 · 仅文案区分 ·
     base 样式保留给域徽章（蛋白质进化 · LIFE / 自动实验室）继续用霁蓝色 */
  .chat-mode-badge[data-mode="deduction"],
  .chat-mode-badge[data-mode="free"] {
    background: var(--paper-warm);
    border-color: var(--rule-soft);
    color: var(--ink-soft);
  }
  .chat-mode-badge[data-mode="deduction"]::before,
  .chat-mode-badge[data-mode="free"]::before {
    content: '';
    display: inline-block;
    width: 5px; height: 5px;
    border-radius: 50%;
    background: var(--ink-mute);
  }
  .chat-title {
    font-family: 'JetBrains Mono', monospace;
    font-size: 12px;
    font-weight: 400;
    color: var(--ink);
    letter-spacing: 0.02em;
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
  }
  /* 分隔点 */
  .chat-header-sep {
    width: 3px;
    height: 3px;
    border-radius: 50%;
    background: var(--ink-faint);
    flex-shrink: 0;
  }

  /* ===== Pipeline Bar（蛋白质进化 7 阶段流程条） ===== */
  .pipeline-bar {
    border-bottom: 1px solid var(--rule);
    background: var(--paper);
  }
  .pipeline-steps {
    display: flex;
    align-items: stretch;
  }
  .pipeline-step {
    flex: 1;
    padding: 7px 12px 8px;
    border-top: 2px solid var(--rule);
    cursor: pointer;
    transition: border-top-color .18s;
    display: flex;
    flex-direction: column;
    gap: 3px;
  }
  .pipeline-step + .pipeline-step {
    border-left: 1px solid var(--rule);
  }
  .pipeline-step:hover { border-top-color: var(--ink-soft); background: var(--paper-warm); }
  .pipeline-step.done  { border-top-color: var(--success); }
  .pipeline-step.active { border-top-color: var(--aux-cyan); background: rgba(42,180,224,.05); }
  .pipeline-step.waiting { border-top-color: var(--rule); }
  .pipeline-step.viewing {
    border-top-color: var(--aux-cyan);
    border-top-width: 3px;
    background: rgba(42,180,224,.09);
    box-shadow: inset 0 -2px 0 0 rgba(42,180,224,.15);
  }

  .pipeline-step-num {
    font-family: 'JetBrains Mono', monospace;
    font-size: 12px;
    letter-spacing: 0.06em;
    display: flex;
    align-items: center;
    gap: 4px;
    color: var(--ink-faint);
  }
  .pipeline-step.done   .pipeline-step-num { color: var(--success); }
  .pipeline-step.active .pipeline-step-num { color: var(--aux-cyan); }
  .pipeline-step.viewing .pipeline-step-num { color: var(--aux-cyan); }

  .pipeline-step-name {
    font-size: 12px;
    font-weight: 400;
    line-height: 1.2;
    color: var(--ink-mute);
  }
  .pipeline-step.done   .pipeline-step-name { color: var(--ink-soft); }
  .pipeline-step.active .pipeline-step-name { color: var(--ink); font-weight: 500; }
  .pipeline-step.viewing .pipeline-step-name { color: var(--ink); font-weight: 600; }

  .pipeline-step .state-dot {
    width: 4px; height: 4px; border-radius: 50%;
    display: inline-block; flex-shrink: 0;
  }
  .pipeline-step.done   .state-dot { background: var(--success); }
  .pipeline-step.active .state-dot { background: var(--aux-cyan); animation: pulse 1.6s infinite; }
  .pipeline-step.waiting .state-dot { background: var(--ink-faint); }
  .pipeline-step.viewing .state-dot { background: var(--aux-cyan); box-shadow: 0 0 0 3px rgba(42,180,224,.25); }

  /* 消息上的阶段归属 tag */
  .stage-tag {
    display: flex;
    align-items: center;
    gap: 6px;
    font-family: 'JetBrains Mono', monospace;
    font-size: 12px;
    padding: 2px 8px 2px 6px;
    background: var(--paper-warm);
    border: 1px solid var(--rule);
    color: var(--ink-soft);
    border-radius: 2px;
    letter-spacing: 0.08em;
    text-transform: uppercase;
    margin-bottom: 10px;
  }
  .stage-tag::before {
    content: "";
    width: 5px; height: 5px;
    border-radius: 50%;
    background: var(--vermilion);
  }

  /* 阶段快捷指令栏（输入框上方） */
  .stage-quickcmds {
    display: flex;
    gap: 6px;
    padding: 6px 10px;
    border-bottom: 1px solid var(--rule-soft);
    flex-wrap: wrap;
    align-items: center;
  }
  .quickcmd-label {
    font-family: 'JetBrains Mono', monospace;
    font-size: 12px;
    letter-spacing: 0.15em;
    color: var(--ink-faint);
    text-transform: uppercase;
    margin-right: 4px;
  }
  .quickcmd-btn {
    padding: 4px 10px;
    font-size: 12px;
    color: var(--ink-soft);
    background: var(--paper-warm);
    border: 1px solid var(--rule);
    border-radius: 3px;
    transition: all .15s;
    display: inline-flex;
    align-items: center;
    gap: 4px;
  }
  .quickcmd-btn:hover {
    border-color: var(--vermilion);
    color: var(--vermilion);
  }
  .quickcmd-btn .slash {
    font-family: 'JetBrains Mono', monospace;
    color: var(--vermilion);
    font-size: 12px;
  }

  /* 阶段产物卡片（嵌在 assistant 回复里） */
  .stage-artifact-card {
    border: 1px solid var(--rule);
    border-radius: 4px;
    margin: 14px 0;
    background: var(--paper);
    overflow: hidden;
  }
  .sa-card-head {
    padding: 10px 16px;
    background: var(--paper-warm);
    border-bottom: 1px solid var(--rule);
    display: flex;
    justify-content: space-between;
    align-items: center;
  }
  .sa-card-head-left {
    display: flex;
    align-items: center;
    gap: 10px;
  }
  .sa-card-stage {
    font-family: 'JetBrains Mono', monospace;
    font-size: 12px;
    color: var(--vermilion);
    letter-spacing: 0.15em;
    text-transform: uppercase;
  }
  .sa-card-title {
    font-family: 'Noto Serif SC', serif;
    font-size: 14px;
    font-weight: 600;
    color: var(--ink);
    letter-spacing: 0.02em;
  }
  .sa-card-action {
    font-family: 'JetBrains Mono', monospace;
    font-size: 12px;
    color: var(--ink-mute);
    letter-spacing: 0.1em;
    cursor: pointer;
    transition: color .15s;
    text-transform: uppercase;
  }
  .sa-card-action:hover { color: var(--vermilion); }
  .sa-card-body {
    padding: 14px 16px;
    font-size: 13px;
    line-height: 1.7;
    color: var(--ink-soft);
  }
  .sa-card-body .kv {
    display: grid;
    grid-template-columns: 100px 1fr;
    gap: 6px 14px;
    font-size: 13px;
    margin-top: 4px;
  }
  .sa-card-body .kv .k {
    font-family: 'JetBrains Mono', monospace;
    font-size: 12px;
    color: var(--ink-mute);
    letter-spacing: 0.1em;
    text-transform: uppercase;
    padding-top: 2px;
  }
  .sa-card-body .kv .v {
    color: var(--ink);
  }
  .sa-card-body .kv .v em {
    color: var(--vermilion);
    font-family: 'Noto Serif SC', serif;
    font-style: normal;
    font-weight: 600;
    font-size: 14px;
  }

  /* chat-main-area：包裹 deduction-canvas + chat-stream-col
     · chat-stream-col 内部纵向：chat-messages 在上 · chat-input-area 在下
     · free 模式：canvas hidden，chat-stream-col 占满
     · deduction 模式：chat-stream-col 左 (order:1) + canvas 右 (order:2) · DOM 顺序不动 · 仅 CSS order 调视觉位置
     · 输入栏自然跟在消息下方而不是横跨 canvas */
  .chat-main-area {
    flex: 1;
    min-height: 0;
    display: flex;
    flex-direction: row;
    overflow: hidden;
  }
  .chat-main-area > .deduction-canvas { display: none; }
  .chat-stream-col {
    flex: 1;
    min-width: 0;
    display: flex;
    flex-direction: column;
    overflow: hidden;
  }
  .chat-stream-col > .chat-messages { flex: 1; min-height: 0; }
  .chat-stream-col > .chat-input-area { flex: 0 0 auto; }

  .chat-wrap[data-explore-mode="deduction"] .chat-main-area > .deduction-canvas {
    display: flex;
    flex: 1.5;          /* canvas 占大头 */
    min-width: 0;
    order: 2;           /* 视觉右侧 */
    background: linear-gradient(180deg, var(--paper-warm) 0%, var(--paper) 100%);
    border-left: 1px solid var(--rule);
    overflow: auto;
  }
  .chat-wrap[data-explore-mode="deduction"] .chat-stream-col {
    flex: 1;
    min-width: 360px;
    order: 1;           /* 视觉左侧 */
  }
  .chat-wrap[data-explore-mode="deduction"].canvas-collapsed .chat-main-area > .deduction-canvas {
    display: none;
  }
  .chat-wrap[data-explore-mode="deduction"].canvas-collapsed .chat-stream-col {
    flex: 1 1 100%;
    min-width: 0;
  }

  .chat-messages {
    flex: 1;
    overflow-y: auto;
    padding: 32px 48px;
  }

  /* ════════════════════════════════════════════════════════════════
     专家引擎 · 思维画布（.deduction-canvas）
     5 层 grid tree · 节点 fancy 化 · SVG connector overlay
     ════════════════════════════════════════════════════════════════ */
  .deduction-canvas {
    flex-direction: column;
    cursor: grab;
  }
  .deduction-canvas.is-dragging {
    cursor: grabbing;
    user-select: none;
  }
  .deduction-canvas.is-dragging * {
    user-select: none !important;
    cursor: grabbing !important;
  }
  .deduction-canvas .dc-node,
  .deduction-canvas .dc-expand-all,
  .deduction-canvas .dc-expand-btn {
    cursor: pointer;
  }
  .dc-head {
    flex-shrink: 0;
    display: flex;
    align-items: center;
    gap: 14px;
    padding: 14px 24px 12px;
    border-bottom: 1px solid var(--rule-soft);
    background: rgba(255,255,255,0.72);
    backdrop-filter: blur(8px);
    -webkit-backdrop-filter: blur(8px);
    /* 双向 sticky · 垂直滚动时 pin top，横向 drag-pan 到 R2 时 pin left
       · width 100% 跟随 deduction-canvas viewport · 始终覆盖整个可见顶栏 */
    position: sticky;
    top: 0;
    left: 0;
    z-index: 5;
    width: 100%;
    box-sizing: border-box;
    transition: padding .22s ease;
  }
  /* 折叠态 · 默认收起左侧文字，padding 收紧；只保留 toggle + zoom + 全部展开
     展开时还原完整 head（带 eyebrow + title） */
  .dc-head.is-collapsed {
    padding: 6px 24px;
  }
  .dc-head.is-collapsed .dc-head-text {
    display: none;
  }
  /* head 折叠 toggle 按钮 · 左侧紧凑入口 */
  .dc-head-toggle {
    display: inline-flex;
    align-items: center;
    gap: 6px;
    padding: 4px 8px;
    background: transparent;
    border: none;
    cursor: pointer;
    font-family: 'JetBrains Mono', monospace;
    font-size: 12px;
    letter-spacing: 0.18em;
    color: var(--ink-mute);
    text-transform: uppercase;
    transition: color .15s;
    flex-shrink: 0;
  }
  .dc-head-toggle:hover { color: var(--vermilion); }
  .dc-head-toggle i {
    font-size: 13px;
    transition: transform .22s ease;
  }
  /* collapsed: chevron 朝右（▶）· expanded: chevron 朝下（▾） */
  .dc-head.is-collapsed .dc-head-toggle i { transform: rotate(-90deg); }
  /* 折叠态时让 toggle label 显示主标识 · 展开后变成 "折叠 ▾" 提示 */
  .dc-head.is-collapsed .dc-head-toggle .dc-head-toggle-label-collapsed { display: inline; }
  .dc-head.is-collapsed .dc-head-toggle .dc-head-toggle-label-expanded { display: none; }
  .dc-head .dc-head-toggle .dc-head-toggle-label-collapsed { display: none; }
  .dc-head .dc-head-toggle .dc-head-toggle-label-expanded { display: inline; }

  .dc-head-text {
    display: flex; flex-direction: column;
    gap: 2px;
    min-width: 0;
    flex: 1;
  }
  .dc-head .dc-eyebrow {
    font-family: 'JetBrains Mono', monospace;
    font-size: 12px;
    letter-spacing: 0.22em;
    color: var(--vermilion);
    text-transform: uppercase;
  }
  .dc-head .dc-title {
    font-family: 'Noto Serif SC', serif;
    font-size: 14px;
    font-weight: 600;
    color: var(--ink);
    letter-spacing: 0.04em;
  }
  /* 折叠时让 zoom group 和 全部展开按钮 推到右侧 · 整条 head 视觉紧凑 */
  .dc-head.is-collapsed .dc-head-toggle { margin-right: auto; }
  /* 一键展开 / 收起按钮 */
  .dc-expand-all {
    display: inline-flex; align-items: center; gap: 6px;
    padding: 5px 10px;
    font-family: 'JetBrains Mono', monospace;
    font-size: 12px;
    letter-spacing: 0.14em;
    color: var(--ink-mute);
    background: var(--paper);
    border: 1px solid var(--rule);
    border-radius: 3px;
    cursor: pointer;
    transition: color .15s, border-color .15s, background .15s;
    flex-shrink: 0;
  }
  .dc-expand-all i { font-size: 13px; }
  .dc-expand-all:hover {
    color: var(--vermilion);
    border-color: var(--vermilion-soft);
    background: var(--vermilion-bg);
  }
  .dc-expand-all[aria-pressed="true"] {
    color: var(--vermilion);
    border-color: var(--vermilion);
    background: var(--vermilion-bg);
  }
  .dc-canvas-collapse-btn {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    width: 28px;
    height: 24px;
    border: 1px solid var(--rule);
    border-radius: 3px;
    background: var(--paper);
    color: var(--ink-mute);
    cursor: pointer;
    transition: color .15s, border-color .15s, background .15s;
    flex-shrink: 0;
  }
  .dc-canvas-collapse-btn i { font-size: 15px; }
  .dc-canvas-collapse-btn:hover {
    color: var(--vermilion);
    border-color: var(--vermilion-soft);
    background: var(--vermilion-bg);
  }

  /* zoom 控制组（- · % · +） */
  .dc-zoom-group {
    display: inline-flex;
    align-items: stretch;
    border: 1px solid var(--rule);
    border-radius: 3px;
    background: var(--paper);
    overflow: hidden;
    flex-shrink: 0;
  }
  .dc-zoom-btn, .dc-zoom-display {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    height: 22px;
    padding: 0 8px;
    background: transparent;
    border: none;
    cursor: pointer;
    color: var(--ink-mute);
    font-family: 'JetBrains Mono', monospace;
    font-size: 12px;
    letter-spacing: 0.04em;
    transition: color .12s, background .12s;
  }
  .dc-zoom-btn i { font-size: 13px; }
  .dc-zoom-btn:hover, .dc-zoom-display:hover {
    color: var(--vermilion);
    background: var(--vermilion-bg);
  }
  .dc-zoom-display {
    min-width: 44px;
    border-left: 1px solid var(--rule);
    border-right: 1px solid var(--rule);
    font-weight: 600;
  }

  /* ─── 空态 · 画布没有节点 revealed 时显示
     · 自动隐藏：用 :has(.dc-node.is-revealed) 选择器在首个节点出现时收起
     · 视觉：抽象 6 节点 + 8 连线 SVG 插画（隐喻"问题 → 4 候选 → 收敛"的推演拓扑）
     · 动效：dots 错开 pulse · lines stroke-dashoffset 循环画
     · tip 文字伴随椭圆点循环动画 ─── */
  .dc-empty {
    position: absolute;
    inset: 0;
    display: flex;
    flex-direction: column;
    align-items: center;
    justify-content: center;
    gap: 18px;
    padding: 40px 24px;
    pointer-events: none;
    transition: opacity .35s ease, transform .35s ease;
  }
  .dc-tree-wrap:has(.dc-node.is-revealed) .dc-empty {
    opacity: 0;
    transform: translateY(-8px);
    pointer-events: none;
    /* 完全消失（避免占用空间影响 svg connector 计算） */
    visibility: hidden;
    transition: opacity .35s ease, transform .35s ease, visibility 0s linear .35s;
  }
  .dc-empty-illu {
    width: 140px; height: 92px;
    display: block;
    opacity: 0.85;
  }
  .dc-empty-dot {
    fill: var(--vermilion-soft);
    transform-origin: center;
    transform-box: fill-box;
    animation: dcEmptyDotPulse 2.4s ease-in-out infinite;
  }
  .dc-empty-dot-1 { animation-delay: 0s; }
  .dc-empty-dot-2 { animation-delay: 0.20s; }
  .dc-empty-dot-3 { animation-delay: 0.35s; }
  .dc-empty-dot-4 { animation-delay: 0.50s; }
  .dc-empty-dot-5 { animation-delay: 0.65s; }
  .dc-empty-dot-6 { animation-delay: 0.85s; }
  @keyframes dcEmptyDotPulse {
    0%, 100% { fill: var(--vermilion-soft); opacity: 0.55; }
    50%      { fill: var(--vermilion);      opacity: 1; }
  }
  .dc-empty-line {
    stroke: var(--vermilion-soft);
    stroke-width: 1.1;
    fill: none;
    stroke-dasharray: 80;
    stroke-dashoffset: 80;
    opacity: 0.45;
    animation: dcEmptyLineDraw 2.6s ease-in-out infinite;
  }
  .dc-empty-line-1 { animation-delay: 0.0s; }
  .dc-empty-line-2 { animation-delay: 0.1s; }
  .dc-empty-line-3 { animation-delay: 0.2s; }
  .dc-empty-line-4 { animation-delay: 0.3s; }
  .dc-empty-line-5 { animation-delay: 0.6s; }
  .dc-empty-line-6 { animation-delay: 0.7s; }
  .dc-empty-line-7 { animation-delay: 0.8s; }
  .dc-empty-line-8 { animation-delay: 0.9s; }
  @keyframes dcEmptyLineDraw {
    0%   { stroke-dashoffset: 80; opacity: 0; }
    35%  { stroke-dashoffset: 0;  opacity: 0.7; }
    75%  { stroke-dashoffset: 0;  opacity: 0.7; }
    100% { stroke-dashoffset: -80; opacity: 0; }
  }
  .dc-empty-tip {
    font-family: 'Noto Serif SC', serif;
    font-size: 13px;
    color: var(--ink-mute);
    letter-spacing: 0.06em;
    display: inline-flex; align-items: baseline; gap: 1px;
  }
  .dc-empty-ellipsis {
    display: inline-flex;
    margin-left: 2px;
    width: 1.5em;
  }
  .dc-empty-ellipsis span {
    color: var(--vermilion);
    font-weight: 600;
    opacity: 0;
    animation: dcEmptyDotCycle 1.5s steps(3, end) infinite;
  }
  .dc-empty-ellipsis span:nth-child(1) { animation-delay: 0s; }
  .dc-empty-ellipsis span:nth-child(2) { animation-delay: 0.25s; }
  .dc-empty-ellipsis span:nth-child(3) { animation-delay: 0.50s; }
  @keyframes dcEmptyDotCycle {
    0%, 80%, 100% { opacity: 0; }
    20%, 70%      { opacity: 1; }
  }
  .dc-empty-sub {
    font-family: 'JetBrains Mono', monospace;
    font-size: 12px;
    color: var(--ink-faint);
    letter-spacing: 0.06em;
    text-align: center;
  }

  /* tree 包裹层 · 提供 relative 作为 SVG 连接线的定位锚
     · padding-bottom 给到 80px · 让推荐方案 (exp 卡) 在滚到底部时有充足留白 */
  .dc-tree-wrap {
    position: relative;
    flex: 1;
    min-height: 0;
    padding: 32px 24px 80px;
    transform-origin: top left;  /* zoom-to-cursor 数学假设左上为原点 */
    transition: transform .2s ease;
  }
  /* dcTree · CSS Grid 布局 · 用 grid-template-areas 实现"水平对齐"
     · R1 默认单列 920px：所有 6 stage 自上而下
     · has-round-2 时双列 (920px 920px)：
         - R2 paramopt area 在 column 2、跟 R1 paramopt 同行（垂直对齐）
         - R2 wetlab area 在 column 2、跟 R1 wetlab 同行
         - column 2 上方（parse/research/paths/exp 对应行）留空 · 视觉上画布从下方扩展
     · 不在的 grid-area 元素不占空间 → R1 时 R2 stage 完全不显示 */
  .dc-tree {
    position: relative;
    z-index: 1;
    display: grid;
    /* R2 stages 直接串在 R1 后面（竖着 · 单列串行 · 提高可读性）
       · 原设计是 R2 放到 column 2 与 R1 同行水平并排，现改成 R2 stage 也放
         在 column 1，跟 R1 各阶段一起从上到下顺序展开
       · 未展示的 R2 stage 由 renderDeductionCanvas 决定是否输出 DOM，
         没输出 → grid-area 无内容 → 不占空间 */
    grid-template-columns: minmax(0, 1fr);
    grid-template-areas:
      "parse"
      "research"
      "paths"
      "exp"
      "paramopt"
      "wetlab"
      "paramopt-r2"
      "wetlab-r2"
      "final-deliverable"
      "emc-test";
    row-gap: 56px;
    column-gap: 0;
    padding-bottom: 40px;
  }
  /* 某轮 paramOpt 缺席时（例：超材料 R2 paramOpt=null）· 把 paramopt-r2 空行从 grid-template-areas 里挪掉
     · 消除空行带来的 56px 孤立 gap · 让 R2 wetlab 直接紧接 R1 wetlab（视觉更连贯 · 连线也短）
     · 由 renderDeductionCanvas 在渲染时决定是否给 .dc-tree 加 .no-paramopt-r2 · 保持其它场景 0 影响 */
  .dc-tree.no-paramopt-r2 {
    grid-template-areas:
      "parse"
      "research"
      "paths"
      "exp"
      "paramopt"
      "wetlab"
      "wetlab-r2"
      "final-deliverable"
      "emc-test";
  }
  .dc-tree.has-round-2 {
    /* R2 出现时不再横向扩宽（保持父容器宽度）· row-gap 56px 已经提供足够
       视觉分隔 · 反馈连线由 _drawDeductionConnectors 沿垂直方向绘制 */
    grid-template-columns: minmax(0, 1fr);
    column-gap: 0;
    padding-right: 0;
    width: 100%;
  }
  /* 给每个 stage 指定 grid-area · 没匹配 area 的 stage 会被 grid 自动隐藏（不占空间）*/
  .dc-stage[data-stage="parse"]        { grid-area: parse; }
  .dc-stage[data-stage="research"]     { grid-area: research; }
  .dc-stage[data-stage="paths"]        { grid-area: paths; }
  .dc-stage[data-stage="exp"]          { grid-area: exp; }
  .dc-stage[data-stage="paramopt"]     { grid-area: paramopt; }
  .dc-stage[data-stage="wetlab"]       { grid-area: wetlab; }
  .dc-stage[data-stage="final-deliverable"] {
    grid-area: final-deliverable;
    opacity: 0;
    transform: translateY(24px);
    min-width: 0;
    overflow: hidden;
    pointer-events: none;
    transition: opacity .5s cubic-bezier(0.22,0.61,0.36,1),
                transform .5s cubic-bezier(0.22,0.61,0.36,1);
  }
  /* has-final-deliverable · 通过 :has() 检测内层 .dc-node.is-revealed（由 reveal-map 触发）· 无需额外 tree class */
  .dc-stage[data-stage="final-deliverable"]:has(.dc-node.is-revealed) {
    opacity: 1;
    transform: translateY(0);
    overflow: visible;
    pointer-events: auto;
  }
  /* Stage 5 · 09 全尺寸样件电磁性能检测完成 · 视觉与 final-deliverable 对齐 · 独立 :has() 淡入 */
  .dc-stage[data-stage="emc-test"] {
    grid-area: emc-test;
    opacity: 0;
    transform: translateY(24px);
    min-width: 0;
    overflow: hidden;
    pointer-events: none;
    transition: opacity .5s cubic-bezier(0.22,0.61,0.36,1),
                transform .5s cubic-bezier(0.22,0.61,0.36,1);
  }
  .dc-stage[data-stage="emc-test"]:has(.dc-node.is-revealed) {
    opacity: 1;
    transform: translateY(0);
    overflow: visible;
    pointer-events: auto;
  }
  .dc-stage[data-stage="paramopt-r2"]  {
    grid-area: paramopt-r2;
    opacity: 0;
    transform: translateY(24px);
    min-width: 0;
    overflow: hidden;       /* 未激活时 · 防止内容溢出 */
    pointer-events: none;
    transition: opacity .5s cubic-bezier(0.22,0.61,0.36,1),
                transform .5s cubic-bezier(0.22,0.61,0.36,1);
  }
  .dc-stage[data-stage="wetlab-r2"]    {
    grid-area: wetlab-r2;
    opacity: 0;
    transform: translateY(24px);
    min-width: 0;
    overflow: hidden;
    pointer-events: none;
    transition: opacity .5s cubic-bezier(0.22,0.61,0.36,1),
                transform .5s cubic-bezier(0.22,0.61,0.36,1);
  }
  .dc-tree.has-round-2 .dc-stage[data-stage="paramopt-r2"],
  .dc-tree.has-round-2 .dc-stage[data-stage="wetlab-r2"] {
    opacity: 1;
    transform: translateY(0);
    overflow: visible;      /* R2 切到可见 · 恢复 overflow 让 box-shadow 等不被裁切 */
    pointer-events: auto;
  }
  /* 跨 stage 反馈连接线 · R(n).wetlab → R(n+1).paramOpt 虚线 + 标签 */
  .dc-conn-feedback {
    stroke-dasharray: 6 4;
    stroke-linecap: round;
    animation: dcFeedbackFlow 3s linear infinite;
    pointer-events: none;
  }
  @keyframes dcFeedbackFlow {
    to { stroke-dashoffset: -40; }
  }
  /* stage · 思维画布的"层"分组（需求解析 / 深度研究 / 路径规划与仿真 / 推荐方案）
     · 顶部挂一条 "01 · 名字 ─ ─ ─ ─" 眉标 + 横虚线，把层界标清楚
     · 内部 row 间距比 stage 间距小（同一层的 row 视觉上更紧凑） */
  .dc-stage {
    display: flex;
    flex-direction: column;
    gap: 18px;
  }
  /* 路径规划与仿真层 · 内部含两个 row（hyp + lane），需要给 hyp→path 连接线留空间 */
  .dc-stage[data-stage="paths"] {
    gap: 40px;
  }
  /* stage 内没有 revealed 节点时整体隐藏 · 自然涵盖两个场景：
     1) 空态（任何节点都没 revealed）→ 所有 stage 隐藏，眉标不抢戏
     2) 推演过程中（如刚跑完 dd-parse）→ 只有 parse stage 出现，后续 stage 等节点 reveal 时再浮现
     用 :has() 让 stage 显隐完全由内部节点 reveal 状态驱动，不需要任何 JS 介入 */
  .dc-stage:not(:has(.dc-node.is-revealed)) {
    display: none;
  }
  /* 眉标淡入用 animation（transition 在 display:none→flex 切换时不触发）
     · 0.15s delay 让眉标略晚于节点冒头，节奏跟节点 .is-revealed 的 0.45s transition 接上 */
  .dc-stage-head {
    animation: dcStageHeadFadeIn .5s cubic-bezier(0.22,0.61,0.36,1) .15s both;
  }
  @keyframes dcStageHeadFadeIn {
    from { opacity: 0; transform: translateY(-3px); }
    to   { opacity: 1; transform: translateY(0); }
  }
  .dc-stage-head {
    display: flex;
    align-items: center;
    gap: 10px;
    font-family: 'JetBrains Mono', monospace;
    font-size: 12px;
    letter-spacing: 0.16em;
    text-transform: uppercase;
    color: var(--ink-faint);
    user-select: none;
  }
  .dc-stage-idx {
    color: var(--vermilion);
    font-weight: 600;
  }
  .dc-stage-name {
    font-family: 'Noto Serif SC', serif;
    font-size: 12px;
    letter-spacing: 0.08em;
    text-transform: none;
    color: var(--ink-mute);
  }
  .dc-stage-rule {
    flex: 1;
    height: 0;
    border-top: 1px dashed var(--rule);
    opacity: 0.55;
  }
  .dc-connectors {
    position: absolute;
    inset: 32px 24px 80px;
    pointer-events: none;
    z-index: 0;
  }
  .dc-conn { transition: stroke-opacity .25s; }
  .dc-conn-rec {
    stroke-dasharray: 6 4;
    animation: dcFlow 1.8s linear infinite;
    filter: drop-shadow(0 0 4px rgba(22,97,171,0.35));
  }
  @keyframes dcFlow {
    to { stroke-dashoffset: -40; }
  }

  /* row · 按层分排 */
  .dc-row { display: grid; gap: 12px; }
  .dc-row-root     { grid-template-columns: minmax(0, 1fr); justify-items: center; }

  /* fast-mg v2 stage 专用 row · 只影响 [data-fmg-v2-stage] 内的行，其他场景 0 影响
     · lit: 3 路并行横排 · hyp: 单卡居中 · exp: v2 综合报告居中宽幅 */
  .fmg-v2-row-lit {
    grid-template-columns: repeat(3, minmax(0, 1fr));
    gap: 16px;
    max-width: 920px;
    margin: 0 auto;
    padding: 0 8px;
  }
  /* fast-mg v2 · 注入 research 卡的 detail 需要放宽 max-height 以容纳图集
     · 靠 data-reveal-id 前缀独占 · 不影响其它场景的 .dc-n-research */
  .dc-n-research[data-reveal-id^="fmg-v2-"].is-expanded .dc-card-detail {
    max-height: none;
    overflow: visible;
  }
  .fmg-v2-row-hyp {
    grid-template-columns: minmax(0, 1fr);
    max-width: 520px;
    margin: 0 auto;
    padding: 0 8px;
    justify-items: stretch;
  }
  .fmg-v2-row-exp {
    grid-template-columns: minmax(0, 1fr);
    max-width: 920px;
    margin: 0 auto;
    padding: 0 8px;
  }
  /* v2 divider stage · 只把说明段落居中约束 · stage-head 保持横贯留出朱红渐变分隔线 */
  .dc-stage[data-stage="fmg-v2-divider"] > div[style*="padding"] {
    max-width: 920px;
    margin: 0 auto;
  }
  /* v2 stage 头也居中约束（视觉上和下方 row 对齐）· 保留 stage-rule 满宽的视觉分隔 */
  .dc-stage[data-fmg-v2-stage="1"] .dc-stage-head {
    max-width: 920px;
    margin: 0 auto;
    width: 100%;
  }

  /* R1 综合方案下方的内嵌 composer · 只作用在 fast-mg 场景内 · 一次会话最多一次
     · 提示条 + textarea + 提交按钮 · Ctrl/⌘+Enter 快捷提交
     · 按钮点后 disabled + is-firing · textarea readOnly · 一次性动作 */
  .fmg-r2-composer {
    margin: 18px 0 4px;
    padding: 12px 14px 12px;
    border: 1px dashed var(--vermilion-soft);
    border-radius: 8px;
    background: linear-gradient(180deg, var(--vermilion-bg) 0%, transparent 100%);
    display: flex;
    flex-direction: column;
    gap: 10px;
  }
  .fmg-r2-hint {
    display: inline-flex;
    align-items: center;
    gap: 6px;
    font-size: 12px;
    color: var(--vermilion);
    font-weight: 500;
  }
  .fmg-r2-hint i { font-size: 14px; }
  .fmg-r2-input-row {
    display: flex;
    gap: 10px;
    align-items: flex-start;
  }
  .fmg-r2-textarea {
    flex: 1;
    min-height: 46px;
    max-height: 140px;
    padding: 8px 10px;
    border: 1px solid var(--rule);
    border-radius: 6px;
    background: var(--paper);
    color: var(--ink);
    font-family: inherit;
    font-size: 13px;
    line-height: 1.55;
    resize: vertical;
    outline: none;
    transition: border-color .15s;
  }
  .fmg-r2-textarea:focus { border-color: var(--vermilion); box-shadow: 0 0 0 2px var(--vermilion-bg); }
  .fmg-r2-textarea[readonly] { background: var(--paper-warm); color: var(--ink-mute); cursor: default; }
  .fmg-r2-submit {
    align-self: stretch;
    padding: 0 14px;
    height: auto;
    min-width: 100px;
    background: var(--vermilion);
    color: var(--paper);
    border: none;
    border-radius: 6px;
    font-size: 13px;
    font-weight: 600;
    cursor: pointer;
    display: inline-flex;
    align-items: center;
    justify-content: center;
    gap: 5px;
    transition: background .15s, transform .15s;
  }
  .fmg-r2-submit:hover:not(:disabled) { background: var(--ink); }
  .fmg-r2-submit:active:not(:disabled) { transform: translateY(1px); }
  .fmg-r2-submit i { font-size: 14px; }
  .fmg-r2-submit:disabled,
  .fmg-r2-submit.is-firing {
    opacity: 0.55;
    cursor: not-allowed;
  }
  .fmg-r2-submit.is-firing i { animation: fmgSpinR2 0.9s linear infinite; }
  @keyframes fmgSpinR2 {
    to { transform: rotate(360deg); }
  }
  .dc-row-research { grid-template-columns: minmax(0, 1fr); justify-items: center; }
  .dc-row-hyp      { grid-template-columns: repeat(4, 1fr); }
  /* lane 间距加大 · 让 4 个候选方向的分支视觉分离更清楚 */
  .dc-row-lanes { grid-template-columns: repeat(4, 1fr); gap: 24px; }
  /* exp 位置：放在右半区（cols 3-4），与第 4 候选方向 (H4) lane 对齐
     · 让"最终方案跟在选中的路径后面"显式于布局，连接线只画 sim-h4-p1 → exp */
  .dc-row-exp {
    display: grid;
    grid-template-columns: repeat(4, 1fr);
    gap: 24px;
  }
  .dc-row-exp > .dc-n-exp {
    grid-column: 3 / -1;
    width: 100%;
    max-width: 100%;
    justify-self: stretch;
  }
  /* 电催化场景 · 04+05 合并卡（4 配方内嵌）· 横跨全宽并居中，比 alloy 半幅版略宽 */
  .dc-row-exp.dc-row-exp--center {
    grid-template-columns: 1fr;
    justify-items: center;
  }
  .dc-row-exp.dc-row-exp--center > .dc-n-exp {
    grid-column: 1 / -1;
    width: 100%;
    max-width: 880px;
    justify-self: center;
  }
  /* 超材料场景 · 推荐干实验方案承载 3D 模型 / KPI / 工艺步骤 / 风险说明 · 04 exp 卡视觉基准
     · 卡宽 max 780px + 居中 · 保证画布两侧留出可见 margin · 跟 05-09 后续 stage 视觉对齐
     · 原方案 max 900px + justify-self:end 会在画布 <900px 时贴到最右侧、看着没居中 */
  .dc-row-exp.dc-row-exp--alloy-wide {
    grid-template-columns: 1fr;
    justify-items: center;
  }
  .dc-row-exp.dc-row-exp--alloy-wide > .dc-n-exp {
    grid-column: 1 / -1;
    width: 100%;
    max-width: 780px;
    justify-self: center;
  }


  /* lane · 每个 hypothesis 的两条 path+sim 横向并排（兄弟卡片）
     · 不再竖排堆叠（避免看起来像顺序），跟 4 个 hyp 在根下并排同构 */
  .dc-lane {
    display: grid;
    grid-template-columns: 1fr 1fr;
    gap: 8px;
    min-width: 0;
  }
  .dc-lane-pair {
    display: flex;
    flex-direction: column;
    gap: 6px;
    min-width: 0;
  }

  /* ════════════════════════════════════════════════════════════════
     compact 模式 · 路径 × 仿真合一张「真实工具调用」卡
     · 由 tree.compactPathSim 在渲染时给 .dc-row-lanes 加 --compact 修饰
     · lane 改单列 · 每个 lane 卡宽从 90px 翻倍到 190px+ · 解决 16 卡同行拥挤
     · 卡内分 design 段（path 标题 + 简述）+ run 段（method/mesh/runtime/output 4 chips）
     · 不动 alloy / electrocat / mgalloy 原 2×2 老布局
     ════════════════════════════════════════════════════════════════ */
  .dc-row-lanes--compact .dc-lane {
    display: flex;
    flex-direction: column;
    gap: 14px;
  }
  .dc-row-lanes--compact .dc-lane-pair {
    gap: 0;                                  /* 合一张卡 · 不再需要 pair 内的 6px 间隙 */
  }
  .dc-n-pair {
    padding: 11px 13px 12px;
    background: var(--paper);
    border: 1px solid var(--rule);
    border-radius: 4px;
  }
  .dc-n-pair:hover { border-color: var(--vermilion-soft); }
  .dc-n-pair.is-recommended {
    border-color: var(--vermilion-soft);
    background: rgba(22, 97, 171, 0.025);
  }
  .dc-n-pair.is-recommended .dc-card-tag { color: var(--vermilion); }
  /* compact 卡内：method/mesh/runtime/output 4 chip · 真实工具调用风 */
  .dc-n-pair-runinfo {
    display: grid;
    grid-template-columns: 1fr;
    gap: 4px;
    margin-top: 8px;
    padding-top: 8px;
    border-top: 1px dashed var(--rule-soft);
    font-family: 'JetBrains Mono', monospace;
    font-size: 11px;
    line-height: 1.5;
  }
  .dc-n-pair-runinfo .dc-n-pair-chip {
    display: grid;
    grid-template-columns: 60px 1fr;
    gap: 8px;
    color: var(--ink-soft);
  }
  .dc-n-pair-runinfo .dc-n-pair-chip em {
    color: var(--ink-faint);
    font-style: normal;
    font-size: 10px;
    letter-spacing: 0.12em;
    text-transform: uppercase;
    align-self: baseline;
  }
  .dc-n-pair-runinfo .dc-n-pair-chip strong {
    color: var(--ink);
    font-weight: 500;
    word-break: break-word;
  }
  .dc-n-pair.is-recommended .dc-n-pair-runinfo .dc-n-pair-chip strong { color: var(--vermilion); }

  /* 通用节点基底 · 默认隐藏，对话流跑到对应工具时再 .is-revealed 触发淡入 */
  .dc-node {
    position: relative;
    background: var(--paper);
    border: 1px solid var(--rule);
    border-radius: 4px;
    padding: 10px 12px 11px;
    transition: opacity .45s cubic-bezier(0.22,0.61,0.36,1),
                transform .45s cubic-bezier(0.22,0.61,0.36,1),
                box-shadow .2s, border-color .2s;
    opacity: 0;
    transform: translateY(8px);
    overflow: hidden;
    cursor: pointer;
    display: flex;
    flex-direction: column;
    gap: 4px;
  }
  /* head 行：[icon] [tag (small uppercase)] ... [expand chevron] */
  .dc-card-head {
    display: flex;
    align-items: center;
    gap: 6px;
    min-width: 0;
  }
  .dc-card-tag {
    font-family: 'JetBrains Mono', monospace;
    font-size: 12px;
    letter-spacing: 0.14em;
    color: var(--ink-faint);
    text-transform: uppercase;
    flex: 1;
    min-width: 0;
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
  }
  .dc-expand-btn {
    width: 18px; height: 18px;
    display: inline-flex; align-items: center; justify-content: center;
    border-radius: 3px;
    color: var(--ink-faint);
    transition: background .15s, color .15s, transform .25s;
    flex-shrink: 0;
    cursor: pointer;
  }
  .dc-expand-btn i { font-size: 13px; }
  .dc-expand-btn:hover { background: var(--paper-warm); color: var(--vermilion); }
  .dc-node.is-expanded .dc-expand-btn { transform: rotate(180deg); color: var(--vermilion); }

  /* title · summary · metrics · detail */
  .dc-card-title {
    font-family: 'Noto Serif SC', serif;
    font-size: 13px;
    font-weight: 600;
    color: var(--ink);
    line-height: 1.35;
    letter-spacing: 0.02em;
  }
  .dc-card-summary {
    font-size: 12px;
    color: var(--ink-soft);
    line-height: 1.5;
  }
  .dc-card-metrics {
    display: flex;
    flex-wrap: wrap;
    gap: 4px 8px;
    margin-top: 4px;
    font-family: 'JetBrains Mono', monospace;
    font-size: 12px;
    color: var(--ink-mute);
  }
  .dc-card-metrics span {
    display: inline-flex; align-items: baseline; gap: 4px;
  }
  .dc-card-metrics em {
    font-style: normal;
    color: var(--ink-faint);
    letter-spacing: 0.08em;
    text-transform: uppercase;
    font-size: 12px;
  }
  .dc-card-detail {
    max-height: 0;
    overflow: hidden;
    transition: max-height .35s cubic-bezier(0.22,0.61,0.36,1), margin-top .35s, padding-top .35s;
    margin-top: 0;
    padding-top: 0;
    border-top: 1px dashed transparent;
    font-size: 12px;
    color: var(--ink-soft);
    line-height: 1.55;
  }
  .dc-node.is-expanded .dc-card-detail {
    max-height: 600px;
    margin-top: 8px;
    padding-top: 8px;
    border-top-color: var(--rule-soft);
  }
  /* 方案(hyp)卡展开：详情较长(成分/热处理/预测/机制/优势/风险/依赖/图)时把 600px 天花板抬高，避免底部被 overflow:hidden 裁掉。
     只放宽上限——短内容卡的实际高度由内容决定、视觉几乎不变；其它场景 hyp 若也超 600px 一并修好。 */
  .dc-n-hyp.is-expanded .dc-card-detail {
    max-height: 2000px;
  }
  .dc-n-exp.is-expanded .dc-card-detail,
  .dc-n-param-opt.is-expanded .dc-card-detail {
    max-height: none;
    overflow: visible;
  }
  .dc-det-block { margin-bottom: 8px; }
  .dc-det-block:last-child { margin-bottom: 0; }
  .dc-det-h {
    font-family: 'JetBrains Mono', monospace;
    font-size: 12px;
    letter-spacing: 0.14em;
    color: var(--vermilion);
    text-transform: uppercase;
    margin-bottom: 4px;
  }
  .dc-card-detail ul, .dc-card-detail ol {
    margin: 0; padding-left: 18px;
  }
  .dc-card-detail li { margin-bottom: 3px; }
  .dc-card-detail p { margin: 0; }
  .dc-card-detail em { color: var(--ink); font-style: italic; }
  .dc-card-detail strong { color: var(--ink); font-weight: 600; }

  /* ════════════════════════════════════════════════════════════════
     dc-det-block--studio · 内嵌 ./aero-design-studio.html WebGL 流场工作台
     · 用在 h4 (Bowcutt ★) hub 详情卡 —— 把 3 个文字 dc-det-block 直接换成 iframe
     · 由于 hub 在 4 等列布局里单卡宽 ≈ 200px，iframe 在原 max-height 600 槽里挤瘪，
       展开时改用绝对定位浮层 (right:0 / top:100%)，扩到 880px 宽 540 高
     · 不动其他 3 个 hub 的布局，浮层带 vermilion 细描边贴近 winner 视觉语义
     ════════════════════════════════════════════════════════════════ */
  .dc-det-block--studio {
    margin: 0;
    display: flex;
    flex-direction: column;
    gap: 6px;
  }
  .dc-det-block--studio .dc-det-studio-head {
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: 12px;
  }
  .dc-det-block--studio .dc-det-studio-open {
    display: inline-flex;
    align-items: center;
    gap: 4px;
    font-family: 'JetBrains Mono', monospace;
    font-size: 11px;
    letter-spacing: 0.06em;
    color: var(--ink-mute);
    text-decoration: none;
    transition: color .15s;
  }
  .dc-det-block--studio .dc-det-studio-open:hover { color: var(--vermilion); }
  .dc-det-block--studio .dc-det-studio-open i { font-size: 13px; }
  .dc-det-block--studio .dc-det-studio-frame {
    width: 100%;
    height: 520px;                /* 浮层主体给足空间看流场粒子 · 配合下面 popout max-height 620 */
    border: 1px solid var(--rule-soft);
    border-radius: 3px;
    display: block;
    background: #0a0d12;          /* studio bg · 加载未就绪时同色防闪 */
  }

  /* h4 hub 展开时 · 详情区从卡内文本改为浮层 studio 显示 */
  .dc-n-hyp[data-hyp="h4"].is-expanded { z-index: 10; }
  .dc-n-hyp[data-hyp="h4"].is-expanded .dc-card-detail:has(.dc-det-block--studio) {
    position: absolute;
    right: 0;
    top: calc(100% + 6px);
    width: min(880px, calc(100vw - 60px));
    max-height: 620px;                              /* 加大以容纳 520 iframe + 标题 + 边距 */
    padding: 12px;
    background: var(--paper);
    border: 1px solid var(--vermilion-soft);
    border-radius: 4px;
    box-shadow: 0 12px 32px rgba(0, 0, 0, 0.10);
    margin-top: 0;
    border-top: 1px solid var(--vermilion-soft);   /* 覆盖 .is-expanded 默认 dashed */
    z-index: 11;
  }
  /* 窄屏兜底：iframe 高度收一点防挤出视区 */
  @media (max-width: 1024px) {
    .dc-n-hyp[data-hyp="h4"].is-expanded .dc-card-detail:has(.dc-det-block--studio) {
      width: min(640px, calc(100vw - 40px));
      max-height: 520px;
    }
    .dc-det-block--studio .dc-det-studio-frame { height: 420px; }
  }

  /* 节点点击高亮（联动 chat 流时的反馈）· 用伪元素，避免和 .dc-node 上的入场动画冲突 */
  .dc-node::after {
    content: '';
    position: absolute;
    inset: -2px;
    border-radius: inherit;
    pointer-events: none;
    box-shadow: 0 0 0 0 rgba(22,97,171,0);
  }
  @keyframes dcFlashKey {
    0%   { box-shadow: 0 0 0 0 rgba(22,97,171,0); }
    30%  { box-shadow: 0 0 0 4px rgba(22,97,171,0.28); }
    100% { box-shadow: 0 0 0 0 rgba(22,97,171,0); }
  }
  .dc-node.dc-flash::after { animation: dcFlashKey 1.2s ease-out; }
  /* 关键节点 focus 脉冲 · 用户触发的二轮 loop 跑完后，新卡片做整体刷新感的视觉信号
     · 比 dcFlashKey 强：12px ring + 双脉冲 + 2.4s 持续
     · 跟 scrollTo smooth 配套，构成"丝滑滚动 + 刷新 highlight" */
  .dc-node.dc-focus-pulse::after { animation: dcFocusPulse 2.4s cubic-bezier(0.22,0.61,0.36,1); }
  @keyframes dcFocusPulse {
    0%   { box-shadow: 0 0 0 0  rgba(22,97,171,0); }
    15%  { box-shadow: 0 0 0 12px rgba(22,97,171,0.30); }
    35%  { box-shadow: 0 0 0 6px  rgba(22,97,171,0.10); }
    55%  { box-shadow: 0 0 0 12px rgba(22,97,171,0.22); }
    75%  { box-shadow: 0 0 0 6px  rgba(22,97,171,0.06); }
    100% { box-shadow: 0 0 0 0  rgba(22,97,171,0); }
  }
  /* 揭示状态：对话流跑到对应工具时切换到 .is-revealed，淡入到位 */
  .dc-node.is-revealed {
    opacity: 1;
    transform: translateY(0);
  }
  /* 刚揭示的节点用 vermilion ring 闪一下，表示"此刻在对话流里发生了什么" */
  .dc-node.is-revealing::after {
    animation: dcRevealRing 1.2s ease-out;
  }
  @keyframes dcRevealRing {
    0%   { box-shadow: 0 0 0 0 rgba(22,97,171,0); }
    35%  { box-shadow: 0 0 0 4px rgba(22,97,171,0.30); }
    100% { box-shadow: 0 0 0 0 rgba(22,97,171,0); }
  }
  .dc-node:hover {
    transform: translateY(-2px);
    box-shadow: 0 8px 20px -10px rgba(26,35,50,0.35);
    border-color: var(--vermilion-soft);
  }
  /* icon 通用 · 默认中性色，只有 is-recommended 才用 vermilion */
  .dc-icon, .dc-icon-sm, .dc-icon-lg {
    flex-shrink: 0;
  }
  .dc-icon    { font-size: 16px; color: var(--ink-mute); }
  .dc-icon-sm { font-size: 13px; color: var(--ink-mute); }
  .dc-icon-lg { font-size: 18px; color: var(--vermilion); }   /* root/research/exp 用 */

  /* ─── 层级标识：靠 tag 颜色 + 图标颜色 + 微妙 bg tint · 不再用左侧色条 ─── */

  /* L1 · 根节点 */
  .dc-n-root {
    max-width: 720px;
    width: 100%;
    padding: 12px 16px 14px;
  }
  .dc-n-root .dc-card-tag   { color: var(--vermilion); }
  .dc-n-root .dc-card-title { font-size: 14px; }
  .dc-n-root .dc-icon-lg    { color: var(--vermilion); font-size: 16px; }

  /* L1.5 · 深度研究 / 知识图谱节点 · 跟 root / hyp 等主链路卡同白底，让主链路视觉统一 */
  .dc-n-research {
    max-width: 720px;
    width: 100%;
    padding: 12px 16px 14px;
  }
  .dc-n-research .dc-card-tag   { color: var(--vermilion); }
  .dc-n-research .dc-card-title { font-size: 13px; }
  .dc-n-research .dc-icon-lg    { color: var(--vermilion); font-size: 16px; }

  /* L2 · 假设节点 · 中性卡片 + 顶部小色点（4 个 hyp 用色点区分而不是大色块） */
  .dc-n-hyp {
    padding: 11px 13px 12px;
    background: var(--paper);
    border-color: var(--rule);
  }
  .dc-hyp-stripe { display: none; }
  .dc-n-hyp:hover { border-color: var(--vermilion-soft); }
  .dc-n-hyp .dc-card-tag { color: var(--ink-mute); }
  .dc-n-hyp .dc-icon     { color: var(--ink-mute); }
  /* 4 个 hyp 唯一的色彩差异：tag 前一个 6px 圆点（subtle 不抢戏） */
  .dc-n-hyp .dc-card-tag::before {
    content: '';
    display: inline-block;
    width: 6px; height: 6px;
    border-radius: 50%;
    background: var(--hyp-color, var(--ink-faint));
    margin-right: 6px;
    vertical-align: 1px;
  }
  /* 当 hyp 是推荐分支时（h4），整张卡用 vermilion 提示 */
  .dc-row-lanes .dc-lane[data-lane="h4"] ~ .dc-lane,
  .dc-n-hyp[data-hyp="h4"] {
    /* 第 4 个 hyp 默认就是推荐的，给一点 vermilion 提示 */
  }
  .dc-n-hyp[data-hyp="h4"] {
    border-color: var(--vermilion-soft);
    background: rgba(22,97,171,0.025);
  }
  .dc-n-hyp[data-hyp="h4"] .dc-card-tag { color: var(--vermilion); }
  .dc-n-hyp[data-hyp="h4"] .dc-icon { color: var(--vermilion); }
  /* 推荐方案节点 · 由 tree.recommendedKey 驱动（renderDeductionCanvas 加 is-recommended）· 通用、不再依赖硬编码 h4 · recKey 为空(电催化)不加此类 */
  .dc-n-hyp.is-recommended {
    border-color: var(--vermilion-soft);
    background: rgba(22,97,171,0.025);
  }
  .dc-n-hyp.is-recommended .dc-card-tag { color: var(--vermilion); }
  .dc-n-hyp.is-recommended .dc-icon { color: var(--vermilion); }

  /* L3 · 路径节点 · 默认中性，是推荐路径才用 vermilion · 跟 sim 同尺寸保持视觉和谐 */
  .dc-n-path {
    padding: 9px 10px;
    min-height: 72px;
  }
  .dc-n-path .dc-icon-sm      { color: var(--ink-mute); font-size: 12px; }
  .dc-n-path .dc-card-tag     { color: var(--ink-mute); opacity: 0.75; font-size: 12px; letter-spacing: 0.12em; }
  .dc-n-path .dc-card-title   { font-size: 12px; line-height: 1.3; }
  .dc-n-path .dc-card-summary { font-size: 12px; line-height: 1.4; }
  .dc-n-path .dc-card-metrics { display: none; }
  .dc-n-path.is-expanded .dc-card-metrics { display: flex; }
  .dc-n-path.is-recommended {
    background: rgba(22,97,171,0.04);
    border-color: var(--vermilion-soft);
  }
  .dc-n-path.is-recommended .dc-card-tag { color: var(--vermilion); opacity: 1; }
  .dc-n-path.is-recommended .dc-icon-sm  { color: var(--vermilion); }

  /* L4 · 仿真节点 · 跟 path 同尺寸（72px / 同 padding / 同字号） · 视觉一致 */
  .dc-n-sim {
    padding: 9px 10px;
    min-height: 72px;
  }
  .dc-n-sim .dc-icon-sm   { color: var(--ink-mute); font-size: 12px; }
  .dc-n-sim .dc-card-tag  { color: var(--ink-mute); opacity: 0.7; font-size: 12px; letter-spacing: 0.12em; }
  .dc-n-sim .dc-card-title {
    font-family: 'JetBrains Mono', monospace;
    font-size: 12px;
    letter-spacing: 0.01em;
    line-height: 1.3;
  }
  .dc-n-sim .dc-card-summary {
    font-family: 'JetBrains Mono', monospace;
    font-size: 12px;
    line-height: 1.4;
  }
  .dc-n-sim .dc-card-metrics { display: none; }
  .dc-n-sim.is-expanded .dc-card-metrics { display: flex; }
  .dc-n-sim.is-recommended {
    background: rgba(22,97,171,0.04);
    border-color: var(--vermilion-soft);
  }
  .dc-n-sim.is-recommended .dc-card-title,
  .dc-n-sim.is-recommended .dc-card-tag,
  .dc-n-sim.is-recommended .dc-icon-sm { color: var(--vermilion); opacity: 1; }

  /* L5 · 实验方案 · 推荐目的地，浅霁蓝 bg tint + vermilion accent（同色相，跟边框/文字一致） */
  .dc-n-exp {
    max-width: 760px;
    width: 100%;
    padding: 14px 18px 16px;
    background: rgba(22,97,171,0.05);
    border-color: var(--vermilion-soft);
  }
  /* 电催化合并卡：撑高 max-width，与 .dc-row-exp--center 配合居中 */
  .dc-row-exp--center > .dc-n-exp { max-width: 880px; }
  .dc-n-exp .dc-card-head { align-items: center; }
  .dc-n-exp .dc-icon-lg   { color: var(--vermilion); font-size: 18px; }
  .dc-n-exp .dc-card-tag  { color: var(--vermilion); font-size: 12px; letter-spacing: 0.18em; }
  .dc-n-exp .dc-card-title   { font-size: 14px; }
  .dc-n-exp .dc-card-summary { font-size: 12px; line-height: 1.6; }

  /* 推荐 badge · 单独 chip · 位于 head 右侧（旧的 dc-rec-flag 已删除） */
  .dc-exp-badge {
    font-family: 'JetBrains Mono', monospace;
    font-size: 12px;
    letter-spacing: 0.18em;
    padding: 3px 9px;
    background: var(--vermilion);
    color: var(--paper);
    border-radius: 2px;
    box-shadow: 0 4px 10px -4px rgba(22,97,171,0.55);
    margin-right: 4px;
  }
  /* 实验方案 · 特性 pills 行（材料 / 工艺 / 性能标签） */
  .dc-exp-pills {
    display: flex;
    flex-wrap: wrap;
    gap: 5px;
    margin-top: 10px;
  }
  .dc-exp-pills span {
    font-family: 'JetBrains Mono', monospace;
    font-size: 12px;
    letter-spacing: 0.04em;
    padding: 3px 8px;
    background: rgba(255,255,255,0.7);
    border: 1px solid var(--vermilion-soft);
    border-radius: 12px;
    color: var(--vermilion);
    white-space: nowrap;
  }

  /* 实验方案 · 预期 KPI 表格（exp 占右半区时，2 列更合适） */
  .dc-exp-kpi-grid {
    display: grid;
    grid-template-columns: repeat(2, 1fr);
    gap: 8px;
    margin-top: 12px;
  }
  .dc-exp-kpi-cell {
    padding: 8px 10px;
    background: rgba(255,255,255,0.55);
    border: 1px solid var(--rule);
    border-radius: 3px;
    font-family: 'JetBrains Mono', monospace;
  }
  .dc-exp-kpi-lbl {
    font-size: 12px;
    letter-spacing: 0.16em;
    color: var(--ink-faint);
    text-transform: uppercase;
  }
  .dc-exp-kpi-val {
    font-size: 13px;
    font-weight: 600;
    color: var(--vermilion);
    margin-top: 2px;
  }

  /* 实验方案 · 工艺步骤编号块 */
  .dc-exp-steps {
    list-style: none;
    padding: 0; margin: 0;
  }
  .dc-exp-steps li {
    display: flex;
    gap: 10px;
    padding: 6px 0;
    border-bottom: 1px dashed var(--rule-soft);
  }
  .dc-exp-steps li:last-child { border-bottom: none; }
  .dc-exp-step-n {
    font-family: 'JetBrains Mono', monospace;
    font-size: 12px;
    font-weight: 600;
    color: var(--vermilion);
    flex-shrink: 0;
    letter-spacing: 0.06em;
    background: var(--vermilion-bg);
    padding: 2px 6px;
    border-radius: 2px;
    height: fit-content;
  }
  .dc-exp-step-body {
    display: flex;
    flex-direction: column;
    gap: 2px;
    font-size: 12px;
    color: var(--ink-soft);
    line-height: 1.5;
  }
  .dc-exp-step-body strong {
    font-family: 'Noto Serif SC', serif;
    color: var(--ink);
    font-weight: 600;
  }

  /* L6 · 参数优化卡 · 跟 exp 卡同色相同视觉权重，作为湿实验前的精修环节
     · 每个 stage 内部 row 是 grid 4 列 · 卡占 cols 3-4（右半区）跟 exp 对齐
     · R1 和 R2 stage 内部 row 用同样的 CSS · 视觉上 R2 paramopt 也是其所在列的右半区 */
  .dc-row-paramopt {
    display: grid;
    grid-template-columns: repeat(4, 1fr);
    gap: 24px;
  }
  .dc-row-paramopt > .dc-n-param-opt {
    grid-column: 3 / -1;
    width: 100%;
    max-width: 100%;
    justify-self: stretch;
  }
  /* R2+ 的 paramopt stage 内部 · 卡占满该列全宽（不用 R1 的右半区对齐 exp 那套）
     · 让 R2.paramopt 中央 x = R2.wetlab 中央 x → 两卡垂直连线居中对齐 */
  .dc-stage[data-stage="paramopt-r2"] .dc-row-paramopt > .dc-n-param-opt,
  .dc-stage[data-stage="paramopt-r3"] .dc-row-paramopt > .dc-n-param-opt,
  .dc-stage[data-stage="paramopt-r4"] .dc-row-paramopt > .dc-n-param-opt {
    grid-column: 1 / -1;
  }
  /* 超材料 R1 参数优化 · 05 stage · 卡宽 780px + 居中 · 跟 04 exp / 06 wetlab 视觉一致
     · 原方案 900px + justify-self:end 会贴右侧 · 现居中 · R2+ paramopt-r2/r3/r4 仍走上面 grid-column:1/-1 全宽规则不受影响 */
  .dc-row-paramopt.dc-row-paramopt--alloy-wide {
    grid-template-columns: 1fr;
    justify-items: center;
  }
  .dc-row-paramopt.dc-row-paramopt--alloy-wide > .dc-n-param-opt {
    grid-column: 1 / -1;
    width: 100%;
    max-width: 780px;
    justify-self: center;
  }
  .dc-n-param-opt {
    max-width: 760px;
    width: 100%;
    padding: 14px 18px 16px;
    background: rgba(22,97,171,0.05);
    border-color: var(--vermilion-soft);
  }
  .dc-n-param-opt .dc-card-head { align-items: center; }
  .dc-n-param-opt .dc-icon-lg   { color: var(--vermilion); font-size: 18px; }
  .dc-n-param-opt .dc-card-tag  { color: var(--vermilion); font-size: 12px; letter-spacing: 0.18em; }
  .dc-n-param-opt .dc-card-title   { font-size: 14px; }
  .dc-n-param-opt .dc-card-summary { font-size: 12px; line-height: 1.6; }

  /* 参数证据表 · 4 列网格：参数 / 推荐值 / 区间 / 文献证据
     用在画布 .dc-n-param-opt 内 + agent-loop tool body (kind: stats) 内 · 同一套样式 */
  .dc-param-grid {
    margin-top: 12px;
    border-top: 1px solid var(--rule-soft);
  }
  .dc-param-grid-group {
    border-bottom: 1px solid var(--rule-soft);
    padding: 8px 0;
  }
  .dc-param-grid-group:last-child { border-bottom: none; }
  .dc-param-grid-grouphead {
    font-family: 'JetBrains Mono', monospace;
    font-size: 12px;
    letter-spacing: 0.16em;
    text-transform: uppercase;
    color: var(--vermilion);
    margin: 4px 0 6px;
  }
  .dc-param-row {
    display: grid;
    grid-template-columns: 92px 80px 90px 1fr;
    gap: 10px;
    padding: 5px 0;
    font-family: 'JetBrains Mono', monospace;
    font-size: 12px;
    line-height: 1.45;
    align-items: baseline;
  }
  .dc-param-row + .dc-param-row {
    border-top: 1px dashed var(--rule-soft);
  }
  .dc-param-name {
    color: var(--ink-soft);
    font-weight: 500;
  }
  .dc-param-val {
    color: var(--vermilion);
    font-weight: 600;
    font-size: 12px;
  }
  .dc-param-range {
    color: var(--ink-mute);
  }
  .dc-param-note {
    color: var(--ink);
    font-size: 12px;
    line-height: 1.55;
  }
  .dc-param-cite {
    display: block;
    color: var(--ink-mute);
    font-size: 12px;
    letter-spacing: 0.04em;
    margin-top: 3px;
    font-style: italic;
  }
  /* 末尾汇总条：recipe 文件名 + 关键统计 */
  .dc-param-recipe {
    margin-top: 12px;
    padding: 10px 12px;
    background: rgba(255,255,255,0.55);
    border: 1px solid var(--rule);
    border-radius: 3px;
    font-family: 'JetBrains Mono', monospace;
    font-size: 12px;
    color: var(--ink-soft);
    line-height: 1.6;
  }
  .dc-param-recipe code {
    background: var(--paper-warm);
    padding: 1px 5px;
    border-radius: 2px;
    color: var(--vermilion);
    font-size: 12px;
  }

  /* L7 · 湿实验验证卡 · 两轮共用 900px 上限 · 让 R1 / R2 wetlab 视觉对齐
     · R2 列本身已经固定 900px · R1 这边封顶 900px · 右对齐让右沿和上方 param-opt 卡右沿对齐
     · 不影响 paramopt / exp 等其它 stage 仍用 1fr 弹性宽度 */
  .dc-row-wetlab {
    display: flex;
    justify-content: flex-end;
  }
  /* 电催化 · 4 路并行湿实验卡（变体：parallel-recipes）·
     · 居中布局 + 更宽上限（4 列子卡需要呼吸空间），跟上方 dc-row-exp--center 视觉一致 */
  .dc-row-wetlab.dc-row-wetlab--center {
    justify-content: center;
  }
  .dc-row-wetlab.dc-row-wetlab--center .dc-n-wetlab {
    max-width: 1100px;
  }
  /* 超材料 · 06/07 湿实验卡居中 780px · 覆盖默认 flex-end · 与 04/05 alloy-wide 视觉对齐 */
  .dc-row-wetlab.dc-row-wetlab--alloy-wide {
    justify-content: center;
  }
  .dc-row-wetlab.dc-row-wetlab--alloy-wide .dc-n-wetlab {
    max-width: 780px;
  }
  /* Stage 4/5 · 08 全尺寸样件加工完成 / 09 全尺寸样件电磁性能检测完成 收官框图 · 单卡居中 780px
     · 只有超材料场景会用这两个 stage (finalDeliverable / emcTest tree 字段)，其它场景不 render → 零影响 */
  .dc-row.dc-row-final {
    display: flex;
    justify-content: center;
  }
  .dc-row.dc-row-final > .dc-node {
    width: 100%;
    max-width: 780px;
  }
  .dc-n-wetlab {
    width: 100%;
    max-width: 900px;
    padding: 14px 18px 16px;
    background: rgba(22,97,171,0.05);
    border-color: var(--vermilion-soft);
  }
  .dc-n-wetlab .dc-card-head { align-items: center; gap: 8px; }
  .dc-n-wetlab .dc-icon-lg   { color: var(--vermilion); font-size: 18px; }
  .dc-n-wetlab .dc-card-tag  { color: var(--vermilion); font-size: 12px; letter-spacing: 0.18em; }
  .dc-n-wetlab .dc-card-title   { font-size: 14px; }
  .dc-n-wetlab .dc-card-summary { font-size: 12px; line-height: 1.6; }
  /* 状态 badge · 两个并列，靠 data-state 切显隐 */
  .dc-wl-badge {
    display: none;
    font-family: 'JetBrains Mono', monospace;
    font-size: 12px;
    letter-spacing: 0.16em;
    padding: 3px 9px;
    border-radius: 2px;
    margin-right: 4px;
  }
  .dc-wl-badge-running {
    background: var(--vermilion);
    color: var(--paper);
  }
  .dc-wl-badge-running::before {
    content: '';
    display: inline-block;
    width: 5px; height: 5px;
    border-radius: 50%;
    background: #ff4848;
    margin-right: 6px;
    vertical-align: 1px;
    animation: dcWlPulse 1.4s ease-in-out infinite;
  }
  @keyframes dcWlPulse {
    0%, 100% { opacity: 0.5; }
    50%      { opacity: 1; }
  }
  .dc-wl-badge-done {
    background: var(--vermilion);
    color: #fff;
  }
  .dc-n-wetlab[data-state="running"] .dc-wl-badge-running { display: inline-flex; align-items: center; }
  .dc-n-wetlab[data-state="done"]    .dc-wl-badge-done    { display: inline-flex; align-items: center; }

  /* 湿实验实验室 tag · 位于 dc-card-head 右侧，标识本轮跑在哪个实验室
     · 用霁蓝细描边 + 微低饱和的实验室冷色背景，区别于 vermilion 状态 badge */
  .dc-wl-lab-tag {
    display: inline-flex;
    align-items: center;
    gap: 5px;
    font-family: 'JetBrains Mono', monospace;
    font-size: 12px;
    letter-spacing: 0.12em;
    padding: 3px 9px;
    border-radius: 2px;
    background: rgba(22,97,171,0.08);
    border: 1px solid var(--vermilion-soft);
    color: var(--vermilion);
    margin-right: 4px;
  }
  .dc-wl-lab-tag i { font-size: 13px; }

  /* ===== 派单弹窗 · 电催化 4 配方湿实验派发 ===== */
  .ec-dispatch-backdrop {
    display: none;
    position: fixed;
    inset: 0;
    background: rgba(26,35,50,0.35);
    backdrop-filter: blur(4px);
    z-index: 220;
    align-items: center;
    justify-content: center;
    padding: 20px;
  }
  .ec-dispatch-backdrop.open { display: flex; animation: fadeIn .2s; }
  .ec-dispatch-modal {
    width: 100%;
    max-width: 480px;
    background: var(--paper);
    border-radius: 8px;
    padding: 28px 32px 24px;
    box-shadow: 0 40px 80px -20px rgba(26,35,50,0.3);
  }
  .ec-dispatch-eyebrow {
    font-family: 'JetBrains Mono', monospace;
    font-size: 12px;
    letter-spacing: 0.18em;
    color: var(--vermilion);
    text-transform: uppercase;
    margin-bottom: 6px;
  }
  .ec-dispatch-title {
    font-family: 'Noto Serif SC', serif;
    font-size: 18px;
    font-weight: 700;
    color: var(--ink);
    margin-bottom: 4px;
    letter-spacing: 0.02em;
  }
  .ec-dispatch-sub {
    font-size: 12px;
    color: var(--ink-mute);
    line-height: 1.6;
    margin-bottom: 22px;
  }
  .ec-dispatch-field { margin-bottom: 16px; }
  .ec-dispatch-label {
    font-family: 'JetBrains Mono', monospace;
    font-size: 12px;
    letter-spacing: 0.16em;
    text-transform: uppercase;
    color: var(--ink-mute);
    display: block;
    margin-bottom: 6px;
  }
  .ec-dispatch-input,
  .ec-dispatch-select {
    box-sizing: border-box;
    width: 100%;
    height: 38px;
    padding: 0 12px;
    border: 1px solid var(--rule);
    border-radius: 3px;
    font-size: 13px;
    line-height: 36px;
    background: var(--paper);
    color: var(--ink);
    font-family: 'Inter', 'Noto Serif SC', sans-serif;
    transition: border-color .15s;
  }
  .ec-dispatch-select {
    /* 关掉浏览器默认下拉外观，再用 background-image 画一个统一的箭头
       · 不再受 macOS / Win 各自的 native 内边距影响，跟 input 完全对齐 */
    -webkit-appearance: none;
    -moz-appearance: none;
    appearance: none;
    padding-right: 32px;
    background-image: url("data:image/svg+xml;charset=UTF-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%237a8597' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M6 9l6 6 6-6'/%3E%3C/svg%3E");
    background-repeat: no-repeat;
    background-position: right 10px center;
    background-size: 14px 14px;
    cursor: pointer;
  }
  .ec-dispatch-input:focus,
  .ec-dispatch-select:focus {
    outline: none;
    border-color: var(--vermilion);
  }
  .ec-dispatch-actions {
    display: flex;
    justify-content: flex-end;
    gap: 8px;
    margin-top: 22px;
  }

  /* 两个 view 切换 · 默认两个都 display:none，只显示当前 state 对应的那个
     · 切换时由 dcWlFlip 动画做"执行中 → 完成"的丝滑流转感（opacity + translateY） */
  .dc-wl-view { display: none; margin-top: 10px; }
  .dc-n-wetlab[data-state="running"] .dc-wl-view-running { display: block; animation: dcWlFlip .55s cubic-bezier(0.22,0.61,0.36,1); }
  .dc-n-wetlab[data-state="done"]    .dc-wl-view-done    { display: block; animation: dcWlFlip .55s cubic-bezier(0.22,0.61,0.36,1); }
  @keyframes dcWlFlip {
    0%   { opacity: 0.25; transform: translateY(8px); filter: blur(2px); }
    40%  { opacity: 0.8;  transform: translateY(2px); filter: blur(0.4px); }
    100% { opacity: 1;    transform: translateY(0);   filter: blur(0); }
  }

  /* 两栏布局 · 内部任务流 DAG + 右侧监控/结果 */
  .dc-wl-cols {
    display: grid;
    grid-template-columns: minmax(0, 1fr) minmax(0, 1fr);
    gap: 16px;
    align-items: start;
  }
  .dc-wl-col-h {
    font-size: 12px;
    font-family: 'JetBrains Mono', monospace;
    color: var(--ink-mute);
    letter-spacing: 0.1em;
    text-transform: uppercase;
    margin-bottom: 8px;
  }
  /* 仅保留给 S21 mini chart 用 · 任务流不再用 SVG */
  .dc-wl-tasks-frame {
    background: var(--paper-cool);
    border: 1px solid var(--rule);
    border-radius: 6px;
    padding: 10px 8px;
  }

  /* 任务流 3-step DAG · 横向布局（独占一行），整体走霁蓝色谱
     · DONE   = 浅蓝底 + 深蓝边 + 深蓝字
     · RUNNING = 白底 + 深蓝 outline 2px + 呼吸光环 + active chip 实蓝
     · QUEUED = 浅灰底 + 灰边 + 灰字
     横排时不画 connector 竖线，用 ::before 水平 ▶ 箭头表达流向 */
  .dc-wl-flow {
    display: grid;
    grid-template-columns: 1fr auto 1fr auto 1fr;  /* 3 step + 2 arrow 槽 */
    gap: 0;
    align-items: stretch;
  }
  .dc-wl-step {
    position: relative;
    border-radius: 7px;
    padding: 26px 14px 14px;   /* top 给 head banner · 左右 14px 让 chips 不贴边 */
    border: 1.5px solid var(--rule);
    background: var(--paper);
    min-width: 0;
    /* flex column · 让 status pill 推到卡底，3 张卡 status 同基线 */
    display: flex;
    flex-direction: column;
  }
  .dc-wl-step.is-done {
    border-color: var(--vermilion);
    background: var(--vermilion-bg);
  }
  .dc-wl-step.is-running {
    border: 2px solid var(--vermilion);
    background: var(--paper);
    padding: 25.5px 13.5px 13.5px;   /* 补偿 2px 边框，让顶部对齐 */
  }
  .dc-wl-step.is-queued {
    border-color: var(--rule);
    background: var(--paper-cool);
    /* 不用 opacity 全局降，改用各元素直接降色（opacity 会让边框/文字都模糊） */
  }
  /* RUNNING 呼吸光环 · 整张卡有"在跑"的脉冲信号 */
  .dc-wl-step.is-running {
    box-shadow: 0 0 0 0 rgba(22,97,171, 0);
    animation: dcWlStepBreath 2s ease-in-out infinite;
  }
  @keyframes dcWlStepBreath {
    0%, 100% { box-shadow: 0 0 0 0  rgba(22,97,171, 0); }
    50%      { box-shadow: 0 0 0 5px rgba(22,97,171, 0.16); }
  }
  /* step 顶部 banner · 现在只放 "STEP N"，永不溢出；设备名移到下方独立行 */
  .dc-wl-step-head {
    position: absolute;
    top: 0; left: 0; right: 0;
    padding: 5px 10px;
    font-family: 'JetBrains Mono', monospace;
    font-size: 12px;
    letter-spacing: 0.22em;
    font-weight: 700;
    text-align: center;
    color: #fff;
    border-radius: 5.5px 5.5px 0 0;
    white-space: nowrap;
  }
  .dc-wl-step.is-done    .dc-wl-step-head { background: var(--vermilion); }
  .dc-wl-step.is-running .dc-wl-step-head { background: var(--vermilion); }
  .dc-wl-step.is-queued  .dc-wl-step-head { background: var(--rule); color: var(--ink-faint); }

  /* body 容器 · 让内容垂直填满，方便底部对齐 status */
  .dc-wl-step > .dc-wl-step-body {
    text-align: center;
    flex: 1;
    display: flex;
    flex-direction: column;
    min-width: 0;
  }
  /* 设备名 · banner 下方独立行，mono mute 不抢戏 */
  .dc-wl-step-device {
    font-family: 'JetBrains Mono', monospace;
    font-size: 12px;
    color: var(--ink-faint);
    letter-spacing: 0.04em;
    line-height: 1.4;
    word-break: break-word;
    margin-bottom: 8px;
  }
  .dc-wl-step.is-queued .dc-wl-step-device { color: var(--ink-faint); }

  .dc-wl-step-title {
    font-size: 12px;
    font-weight: 600;
    color: var(--ink);
    font-family: 'Noto Serif SC', serif;
  }
  .dc-wl-step.is-queued .dc-wl-step-title { color: var(--ink-mute); }
  .dc-wl-step-desc {
    font-size: 12px;
    color: var(--ink-mute);
    margin-top: 4px;
    font-family: 'JetBrains Mono', monospace;
    line-height: 1.45;
  }
  .dc-wl-step.is-queued .dc-wl-step-desc { color: var(--ink-faint); }
  /* chips · 改 grid 2×2 等宽，4 个 chip 整齐两行 */
  .dc-wl-step-chips {
    display: grid;
    grid-template-columns: 1fr 1fr;
    gap: 4px;
    margin-top: 10px;
  }
  .dc-wl-step-chips .chip {
    font-size: 12px;
    font-family: 'JetBrains Mono', monospace;
    padding: 3px 4px;
    border-radius: 3px;
    background: rgba(255,255,255,0.7);
    color: var(--ink-mute);
    border: 1px solid var(--rule-soft);
    text-align: center;
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
  }
  /* DONE 和 RUNNING 的 chip 共享霁蓝 tint · 阶梯感来自卡片 bg / 边框，不靠 chip 区分 */
  .dc-wl-step.is-done .dc-wl-step-chips .chip,
  .dc-wl-step.is-running .dc-wl-step-chips .chip {
    background: rgba(22,97,171, 0.10);
    color: var(--vermilion);
    border-color: rgba(22,97,171, 0.22);
  }
  /* RUNNING 当前 active 的子任务 · 实色蓝 chip 强调 */
  .dc-wl-step.is-running .dc-wl-step-chips .chip.is-active {
    background: var(--vermilion);
    color: #fff;
    border-color: var(--vermilion);
    font-weight: 600;
  }
  .dc-wl-step.is-queued .dc-wl-step-chips .chip {
    background: var(--paper-warm);
    color: var(--ink-faint);
    border-color: var(--rule-soft);
  }
  /* status pill · 三态都霁蓝色系，margin-top auto 把 pill 推到卡底
     · 3 张卡 status 同基线（即使 chips / extra 长度不同也对齐） */
  .dc-wl-step-status {
    display: inline-block;
    margin: 12px auto 0;
    padding: 4px 10px;
    border-radius: 3px;
    font-family: 'JetBrains Mono', monospace;
    font-size: 12px;
    font-weight: 600;
    align-self: center;
  }
  .dc-wl-step .dc-wl-step-status-wrap {
    margin-top: auto;       /* 把 status + extra 整体推到卡底 */
    padding-top: 8px;
  }
  .dc-wl-step.is-done .dc-wl-step-status    { background: rgba(22,97,171, 0.18); color: var(--vermilion); }
  .dc-wl-step.is-running .dc-wl-step-status { background: var(--vermilion); color: #fff; }
  .dc-wl-step.is-queued .dc-wl-step-status  { background: var(--paper-warm); color: var(--ink-faint); }
  .dc-wl-step-extra {
    margin-top: 4px;
    font-size: 12px;
    color: var(--ink-mute);
    font-family: 'JetBrains Mono', monospace;
  }
  /* 横向 connector · 水平 ▶ 箭头，颜色随上一 step 状态 */
  .dc-wl-step-connector {
    width: 26px;
    align-self: center;
    display: flex;
    align-items: center;
    justify-content: center;
    color: var(--rule);
    font-size: 14px;
    line-height: 1;
  }
  .dc-wl-step-connector::before { content: '▶'; }
  .dc-wl-step-connector.is-done    { color: var(--vermilion); }
  .dc-wl-step-connector.is-running { color: var(--vermilion); opacity: 0.55; }
  .dc-wl-step-connector.is-queued  { color: var(--rule); }

  /* 任务流单独占一行的外层容器 · 跟 .dc-wl-cols（视频+结果两列）平级 */
  .dc-wl-row-flow {
    margin-bottom: 14px;
  }
  /* DAG 图例 · 复用同一套色 */
  .dc-wl-legend {
    display: flex;
    gap: 12px;
    margin-top: 8px;
    padding-top: 8px;
    border-top: 1px solid var(--rule-soft);
    flex-wrap: wrap;
  }
  .dc-wl-legend-item {
    display: flex;
    align-items: center;
    gap: 4px;
    font-size: 12px;
    font-family: 'JetBrains Mono', monospace;
    color: var(--ink-mute);
  }
  .dc-wl-legend-swatch {
    width: 10px;
    height: 10px;
    border-radius: 2px;
  }

  /* 顶部 meta 横条 · 任务单号 / 状态 / 时长 */
  .dc-wl-meta {
    display: flex;
    align-items: center;
    gap: 10px;
    margin: 10px 0 6px;
    padding: 7px 11px;
    background: var(--paper-warm);
    border: 1px solid var(--rule);
    border-radius: 6px;
    font-family: 'JetBrains Mono', monospace;
    font-size: 12px;
    color: var(--ink-soft);
    letter-spacing: 0.05em;
  }
  .dc-wl-meta .dc-wl-meta-tag {
    color: var(--ink-faint);
    margin-left: auto;
  }

  /* 遥测 2×2 · 进度 bar · 设备板 复用现有 style，但放在画布内紧凑版 */
  .dc-wl-telemetry {
    display: grid;
    grid-template-columns: 1fr 1fr;
    gap: 5px;
    margin-bottom: 10px;
  }
  .dc-wl-telemetry-cell {
    background: var(--paper-warm);
    border: 1px solid var(--rule-soft);
    border-radius: 5px;
    padding: 7px 8px;
  }
  .dc-wl-telemetry-cell .lbl {
    display: flex;
    justify-content: space-between;
    align-items: center;
    margin-bottom: 4px;
  }
  .dc-wl-telemetry-cell .lbl span:first-child {
    font-size: 12px;
    font-family: 'JetBrains Mono', monospace;
    color: var(--ink-mute);
  }
  .dc-wl-telemetry-cell .lbl span:last-child {
    font-size: 12px;
    font-weight: 600;
    color: #2f8659;
  }
  .dc-wl-telemetry-cell .bar {
    height: 3px;
    background: var(--rule);
    border-radius: 2px;
    overflow: hidden;
  }
  .dc-wl-telemetry-cell .bar-fill {
    height: 3px;
    background: #2f8659;
    border-radius: 2px;
  }
  .dc-wl-telemetry-cell .target {
    font-size: 12px;
    color: var(--ink-faint);
    margin-top: 2px;
  }
  .dc-wl-progress-row {
    margin-bottom: 7px;
  }
  .dc-wl-progress-row-head {
    display: flex;
    justify-content: space-between;
    font-size: 12px;
    font-family: 'JetBrains Mono', monospace;
    margin-bottom: 3px;
    color: var(--ink-soft);
  }
  .dc-wl-progress-row .bar {
    height: 5px;
    background: var(--rule);
    border-radius: 3px;
    overflow: hidden;
  }
  .dc-wl-progress-row .bar-fill {
    height: 5px;
    border-radius: 3px;
  }
  .dc-wl-alert {
    margin-top: 8px;
    padding: 7px 10px;
    background: var(--vermilion-bg);
    border: 1px solid var(--rule);
    border-left: 3px solid var(--vermilion);
    border-radius: 4px;
  }
  .dc-wl-alert .head {
    font-family: 'JetBrains Mono', monospace;
    color: var(--vermilion);
    font-size: 12px;
    font-weight: 600;
    margin-bottom: 3px;
  }
  .dc-wl-alert .body {
    font-size: 12px;
    color: var(--ink-soft);
    line-height: 1.5;
  }

  /* 设备状态板 */
  .dc-wl-devices {
    margin-top: 14px;
    padding: 10px 0 0;
    border-top: 1px solid var(--rule);
  }
  .dc-wl-devices-chips {
    display: flex;
    flex-wrap: wrap;
    gap: 5px;
  }
  .dc-wl-device-chip {
    display: flex;
    align-items: center;
    gap: 4px;
    padding: 3px 7px;
    border-radius: 4px;
    background: var(--paper-warm);
    border: 1px solid var(--rule);
  }
  .dc-wl-device-chip.is-active {
    background: var(--vermilion-bg);
    border-color: var(--vermilion-soft);
  }
  .dc-wl-device-chip .dot {
    width: 5px; height: 5px;
    border-radius: 50%;
    background: #c4cad5;
  }
  .dc-wl-device-chip.is-active .dot {
    background: var(--vermilion);
    animation: pulse 1.4s infinite;
  }
  .dc-wl-device-chip .name {
    font-size: 12px;
    font-family: 'JetBrains Mono', monospace;
    color: var(--ink-mute);
  }
  .dc-wl-device-chip.is-active .name { color: var(--vermilion); }
  .dc-wl-device-chip .state {
    font-size: 12px;
    color: var(--ink-faint);
  }
  .dc-wl-device-chip.is-active .state { color: var(--vermilion-soft); }

  /* DONE view · 6 KPI 对比表 */
  .dc-wl-kpi-table {
    width: 100%;
    border-collapse: collapse;
    background: var(--paper);
    border: 1px solid var(--rule);
    border-radius: 4px;
    overflow: hidden;
  }
  .dc-wl-kpi-table th {
    padding: 7px 8px;
    text-align: left;
    font-size: 12px;
    font-family: 'JetBrains Mono', monospace;
    letter-spacing: 0.08em;
    text-transform: uppercase;
    color: var(--ink-mute);
    background: var(--paper-warm);
  }
  .dc-wl-kpi-table td {
    padding: 6px 8px;
    border-bottom: 1px dashed var(--rule-soft);
    font-family: 'JetBrains Mono', monospace;
    font-size: 12px;
    color: var(--ink-soft);
  }
  .dc-wl-kpi-table td:first-child {
    font-family: 'Noto Serif SC', serif;
    font-size: 12px;
    color: var(--ink);
  }
  .dc-wl-kpi-table td.meas { font-size: 12px; }
  .dc-wl-kpi-table td.warn { color: #c4622f; font-weight: 600; }
  .dc-wl-kpi-table td.verdict-ok   { color: #2f8659; font-weight: 600; }
  .dc-wl-kpi-table td.verdict-warn { color: #c4622f; font-weight: 600; }
  .dc-wl-kpi-foot {
    margin-top: 8px;
    display: flex;
    gap: 10px;
    flex-wrap: wrap;
    font-size: 12px;
    font-family: 'JetBrains Mono', monospace;
  }
  /* NRW 反演结果块 */
  .dc-wl-nrw {
    margin-top: 8px;
    background: var(--paper-warm);
    border: 1px solid var(--rule-soft);
    border-radius: 4px;
    padding: 8px 10px;
  }
  .dc-wl-nrw .head {
    font-size: 12px;
    font-family: 'JetBrains Mono', monospace;
    color: var(--ink-mute);
    letter-spacing: 0.1em;
    margin-bottom: 4px;
  }
  .dc-wl-nrw .body {
    display: flex;
    justify-content: space-around;
    font-family: 'JetBrains Mono', monospace;
    font-size: 12px;
    color: var(--ink-soft);
  }
  .dc-wl-nrw .body strong { color: var(--vermilion); }

  /* 窄屏：split 模式收回成单列 · order 仍生效：chat 在上，canvas 在下
     · canvas 用 border-top 作分隔线（朝向上方的 chat） */
  @media (max-width: 1100px) {
    .chat-wrap[data-explore-mode="deduction"] .chat-main-area {
      flex-direction: column;
    }
    .chat-wrap[data-explore-mode="deduction"] .chat-main-area > .deduction-canvas {
      flex: 0 0 56%;
      border-left: none;
      border-top: 1px solid var(--rule);
    }
  }

  .message {
    max-width: 760px;
    margin: 0 auto 36px;
  }

  .message-user {
    display: flex;
    justify-content: flex-end;
  }
  .message-user-bubble {
    max-width: 85%;
    padding: 14px 18px;
    background: var(--paper-warm);
    border: 1px solid var(--rule);
    border-radius: 4px;
    font-size: 14px;
    line-height: 1.7;
    color: var(--ink);
    white-space: pre-wrap;     /* 保留 query 中的换行（如野生型序列前的段落分隔） */
    overflow-wrap: anywhere;   /* 长无空格序列（蛋白质 / DNA）按字符断行，不撑破气泡 */
    word-break: break-word;
  }

  .message-assistant { display: block; }

  /* ---- 快问快答模式 · 普通对话气泡 ---- */
  .message.message-quick { display: block; margin-bottom: 24px; }
  .message-quick-bubble {
    max-width: 760px;
    padding: 6px 4px;
    font-size: 14px;
    line-height: 1.75;
    color: var(--ink);
    font-family: 'Noto Serif SC','Inter',sans-serif;
    white-space: normal;
  }
  .message-quick-bubble strong { font-weight: 600; }
  .message-quick-bubble em { font-style: italic; color: var(--ink-soft); }
  .message-quick-bubble code {
    font-family: 'JetBrains Mono', monospace;
    font-size: 13px;
    background: var(--paper-warm);
    color: var(--ink-soft);
    padding: 1px 5px;
    border-radius: 3px;
  }
  .quick-cursor {
    display: inline-block;
    width: 6px; height: 14px;
    background: var(--ink);
    margin-left: 2px;
    vertical-align: text-bottom;
    animation: quickBlink .9s steps(1) infinite;
  }
  @keyframes quickBlink { 50% { opacity: 0; } }

  /* 工具栏：快问快答开关 */
  .quick-toggle {
    display: inline-flex; align-items: center; gap: 4px;
    height: 24px; padding: 0 9px;
    border: 1px solid var(--rule);
    border-radius: 12px;
    background: var(--paper);
    font-size: 12px;
    color: var(--ink-mute);
    cursor: pointer;
    transition: background .15s, color .15s, border-color .15s;
    user-select: none;
  }
  .quick-toggle:hover { background: var(--paper-warm); color: var(--ink-soft); }
  .quick-toggle.active {
    background: var(--vermilion-bg);
    color: var(--vermilion);
    border-color: rgba(22,97,171,.4);
  }
  .quick-toggle i { font-size: 12px; }

  .message-thinking {
    background: var(--paper-cool);
    border: 1px solid var(--rule-soft);
    border-radius: 4px;
    margin-bottom: 16px;
    overflow: hidden;
  }

  .thinking-header {
    padding: 10px 16px;
    display: flex;
    justify-content: space-between;
    align-items: center;
    cursor: pointer;
    border-bottom: 1px solid transparent;
    transition: border-color .2s;
  }
  .message-thinking.expanded .thinking-header { border-bottom-color: var(--rule-soft); }

  .thinking-label {
    font-family: 'JetBrains Mono', monospace;
    font-size: 12px;
    letter-spacing: 0.2em;
    text-transform: uppercase;
    color: var(--ink-mute);
    display: flex;
    align-items: center;
    gap: 8px;
  }
  .thinking-label::before {
    content: "";
    display: inline-block;
    width: 6px; height: 6px;
    background: var(--vermilion);
    border-radius: 50%;
    animation: pulse 1.6s ease-in-out infinite;
  }
  .message-thinking.done .thinking-label::before {
    background: var(--success);
    animation: none;
  }
  @keyframes pulse {
    0%, 100% { opacity: 0.4; }
    50% { opacity: 1; }
  }

  .thinking-time {
    font-family: 'JetBrains Mono', monospace;
    font-size: 12px;
    color: var(--ink-faint);
    display: flex;
    align-items: center;
    gap: 10px;
  }
  .chevron {
    width: 10px; height: 10px;
    border-right: 1.5px solid var(--ink-mute);
    border-bottom: 1.5px solid var(--ink-mute);
    transform: rotate(45deg);
    transition: transform .2s;
  }
  .message-thinking.expanded .chevron { transform: rotate(-135deg); margin-top: 3px; }

  .thinking-body {
    padding: 0 16px;
    max-height: 0;
    overflow: hidden;
    transition: max-height .3s ease, padding .2s ease;
  }
  .message-thinking.expanded .thinking-body {
    padding: 12px 16px 14px;
    max-height: 800px;
  }

  .trace-line {
    display: grid;
    grid-template-columns: 20px 74px 1fr;
    gap: 10px;
    padding: 6px 0;
    font-size: 13px;
    line-height: 1.55;
    align-items: flex-start;
    border-bottom: 1px dashed var(--rule-soft);
  }
  .trace-line:last-child { border-bottom: none; }

  .trace-step {
    font-family: 'JetBrains Mono', monospace;
    font-size: 12px;
    color: var(--vermilion);
    letter-spacing: 0.05em;
    padding-top: 2px;
  }
  .trace-type {
    font-family: 'JetBrains Mono', monospace;
    font-size: 12px;
    color: var(--ink-soft);
    background: transparent;
    padding: 1px 5px;
    border-radius: 3px;
    border: 1px solid currentColor;
    letter-spacing: 0.06em;
    text-transform: uppercase;
    font-weight: 500;
    text-align: center;
    align-self: flex-start;
    margin-top: 2px;
    opacity: 0.65;
  }
  .trace-type.llm   { color: var(--aux-cyan); }
  .trace-type.agent { color: var(--disc-material); }
  .trace-type.skill { color: var(--disc-neuro); }
  .trace-type.mcp   { color: var(--disc-life); }
  .trace-type.cli   { color: var(--ink-soft); }
  .trace-text { color: var(--ink-soft); }
  .trace-text code {
    font-family: 'JetBrains Mono', monospace;
    font-size: 12px;
    background: var(--paper-warm);
    padding: 1px 5px;
    border-radius: 2px;
    color: var(--ink);
  }

  .message-response {
    font-size: 14px;
    line-height: 1.8;
    color: var(--ink);
  }
  .message-response p { margin-bottom: 12px; }
  .message-response p:last-child { margin-bottom: 0; }
  .message-response strong { font-weight: 600; color: var(--ink); }
  .message-response em {
    font-family: 'Noto Serif SC', serif;
    font-style: normal;
    font-weight: 600;
    color: var(--vermilion);
    font-size: 14px;
  }
  .message-response .callout {
    background: var(--accent-bg);
    border-left: 3px solid var(--vermilion);
    padding: 12px 16px;
    margin: 14px 0;
    font-family: 'Noto Serif SC', serif;
    font-size: 14px;
    font-style: normal;
    color: var(--ink);
  }
  .message-response ul { margin: 8px 0 12px 0; padding-left: 20px; }
  .message-response ul li { margin-bottom: 6px; }
  .message-response ul li::marker { color: var(--vermilion); }

  /* ===== 下一步行动 CTA（消息底部的醒目引导） ===== */
  .next-step-cta {
    margin-top: 20px;
    padding: 16px 18px;
    background: linear-gradient(180deg, var(--vermilion-bg) 0%, var(--paper) 100%);
    border: 1px solid var(--vermilion-soft);
    border-radius: 6px;
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    gap: 10px 14px;
    position: relative;
  }
  .next-step-cta::before {
    content: "";
    position: absolute;
    left: -1px; top: -1px; bottom: -1px;
    width: 3px;
    background: var(--vermilion);
    border-radius: 6px 0 0 6px;
  }
  .next-step-cta.done {
    background: var(--success-bg);
    border-color: var(--success);
    flex-direction: column;
    align-items: flex-start;
  }
  .next-step-cta.done::before { background: var(--success); }

  .next-step-label {
    font-family: 'JetBrains Mono', monospace;
    font-size: 12px;
    letter-spacing: 0.18em;
    text-transform: uppercase;
    color: var(--vermilion);
    margin-right: 4px;
    display: flex;
    align-items: center;
    gap: 8px;
  }
  .next-step-cta.done .next-step-label {
    color: var(--success);
    font-size: 12px;
  }
  .next-step-label::before {
    content: "▸";
    font-size: 12px;
    color: var(--vermilion);
  }
  .next-step-cta.done .next-step-label::before {
    content: "✓";
    color: var(--success);
  }
  .next-step-desc {
    font-size: 13px;
    color: var(--ink-soft);
    margin-bottom: 6px;
    line-height: 1.6;
  }

  .next-step-btn {
    padding: 8px 16px;
    font-size: 13px;
    color: var(--ink);
    background: var(--paper);
    border: 1px solid var(--rule);
    border-radius: 4px;
    cursor: pointer;
    font-family: inherit;
    transition: all .15s;
    letter-spacing: 0.02em;
    white-space: nowrap;
  }
  .next-step-btn:hover {
    border-color: var(--vermilion);
    color: var(--vermilion);
    transform: translateX(1px);
  }
  .next-step-btn.primary {
    background: var(--vermilion);
    color: var(--paper);
    border-color: var(--vermilion);
    font-weight: 500;
    box-shadow: 0 2px 6px -2px rgba(22, 97, 171, 0.4);
  }
  .next-step-btn.primary:hover {
    background: var(--ink);
    border-color: var(--ink);
    color: var(--paper);
    transform: translateX(2px);
    box-shadow: 0 4px 12px -2px rgba(22, 97, 171, 0.5);
  }

  .chat-input-area {
    padding: 10px 32px 14px;
    border-top: 1px solid var(--rule);
    background: var(--paper);
  }
  .chat-input-inner {
    max-width: 760px;
    margin: 0 auto;
    border: 1px solid var(--rule);
    border-radius: 6px;
    background: var(--paper);
    transition: border-color .2s, box-shadow .25s;
  }
  .chat-input-inner:focus-within { border-color: var(--ink-soft); }

  /* Collapsed: hide stage-quickcmds even when JS has set display:flex */
  .chat-input-area:not(:hover):not(:focus-within) .stage-quickcmds {
    display: none !important;
  }

  /* Main row: textarea + send button side-by-side */
  .chat-input-main-row {
    display: flex;
    align-items: flex-end;
    gap: 0;
  }

  .chat-input-textarea {
    flex: 1;
    padding: 8px 12px;
    /* 默认就展开; 内容变多自适应, 上限视口 1/3, 超出滚动 —— 用户明确说
       "不要 hover/focus 才展开", 输入行数增多适应性扩展。JS 侧还挂了 input
       监听把 el.style.height 顶到 scrollHeight, CSS 只兜个上下界。 */
    min-height: 44px;
    max-height: 33vh;
    font-size: 14px;
    line-height: 1.5;
    resize: none;
    overflow-y: auto;
  }
  .chat-input-textarea::placeholder { color: var(--ink-faint); font-style: normal; }

  /* Send button wrapper —— send-btn + 左侧中断小图标 */
  .chat-input-send-wrap {
    flex-shrink: 0;
    padding: 6px 8px 6px 0;
    display: flex;
    align-items: center;    /* 中断图标要和 send-btn 中线对齐 */
    gap: 6px;
  }

  /* Footer —— 默认就展开, 不再靠 hover/focus */
  .chat-input-footer {
    display: flex;
    justify-content: flex-start;
    align-items: center;
    gap: 8px;
    padding: 2px 12px 7px;
  }

  /* ------- 右侧：工作空间 ------- */
  .workspace-panel {
    background: var(--paper-cool);
    border-left: 1px solid var(--rule);
    display: flex;
    flex-direction: column;
    overflow: hidden;
    transition: all 0.25s ease;
    position: relative;
    min-width: 0;
  }
  .workspace-panel.collapsed {
    width: 36px;
    min-width: 36px;
    max-width: 36px;
    flex: 0 0 36px;
  }

  .ws-header {
    padding: 10px 22px 10px;
    border-bottom: 1px solid var(--rule);
    display: flex;
    align-items: center;
    justify-content: space-between;
    flex-shrink: 0;
  }
  .ws-header-text { flex: 1; min-width: 0; }
  .ws-title {
    font-family: 'Noto Serif SC', serif;
    font-size: 14px;
    font-weight: 600;
    color: var(--ink);
    margin-bottom: 2px;
    letter-spacing: 0.02em;
  }
  .ws-subtitle {
    font-family: 'Inter', sans-serif;
    font-size: 12px;
    color: var(--ink-mute);
    letter-spacing: 0.15em;
    text-transform: uppercase;
  }
  .ws-epigraph {
    margin-top: 10px;
    font-family: 'Inter', sans-serif;
    font-style: normal;
    font-size: 12px;
    color: var(--ink-mute);
    line-height: 1.55;
  }

  /* 折叠状态下隐藏内容、展示竖条 */
  .workspace-panel.collapsed .ws-header,
  .workspace-panel.collapsed .ws-content {
    display: none;
  }
  .workspace-panel.collapsed .panel-collapsed-strip {
    display: flex;
  }

  .ws-content {
    flex: 1;
    overflow: hidden;
    display: flex;
    padding: 0;
  }

  .ws-group { margin-bottom: 22px; }
  .ws-group-title {
    font-family: 'JetBrains Mono', monospace;
    font-size: 12px;
    letter-spacing: 0.2em;
    text-transform: uppercase;
    color: var(--ink-faint);
    margin-bottom: 10px;
    display: flex;
    justify-content: space-between;
  }

  .ws-file {
    background: var(--paper);
    border: 1px solid var(--rule);
    border-radius: 3px;
    padding: 12px 14px;
    margin-bottom: 8px;
    cursor: pointer;
    transition: all .15s;
    display: flex;
    gap: 10px;
    align-items: flex-start;
  }
  .ws-file:hover {
    border-color: var(--ink-soft);
    transform: translateX(-2px);
  }
  .ws-file-icon {
    width: 24px; height: 28px;
    border: 1px solid var(--rule);
    display: flex;
    align-items: center;
    justify-content: center;
    font-family: 'JetBrains Mono', monospace;
    font-size: 12px;
    color: var(--ink-mute);
    background: var(--paper-warm);
    flex-shrink: 0;
    text-transform: uppercase;
    letter-spacing: 0.02em;
    border-radius: 1px;
  }
  .ws-file-icon.code { background: #1a2332; color: var(--paper); border-color: #1a2332; }
  .ws-file-icon.data { background: var(--success-bg); color: var(--success); border-color: var(--success); }
  .ws-file-icon.plan { background: var(--vermilion-bg); color: var(--vermilion); border-color: var(--vermilion-soft); }

  .ws-file-info { flex: 1; min-width: 0; }
  .ws-file-name {
    font-size: 13px;
    color: var(--ink);
    margin-bottom: 3px;
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
  }
  .ws-file-meta {
    font-family: 'JetBrains Mono', monospace;
    font-size: 12px;
    color: var(--ink-mute);
    letter-spacing: 0.03em;
  }
  .ws-file-meta .time { color: var(--ink-faint); }
  .ws-empty {
    text-align: center;
    padding: 40px 20px;
    color: var(--ink-faint);
    font-family: 'Inter', sans-serif;
    font-style: normal;
    font-size: 13px;
  }

  /* ===== 工作空间两列布局：目录树 + 文件预览 ===== */
  .ws-tree-col {
    width: 170px;
    min-width: 170px;
    border-right: 1px solid var(--rule);
    overflow-y: hidden;
    flex-shrink: 0;
    background: var(--paper-cool);
    position: relative;
    transition: width 0.2s ease, min-width 0.2s ease;
    display: flex;
    flex-direction: column;
  }
  .ws-tree-inner {
    flex: 1;
    overflow-y: auto;
    padding: 8px 0 12px;
  }
  .ws-tree-col.tree-collapsed {
    width: 26px;
    min-width: 26px;
  }
  .ws-tree-col.tree-collapsed .ws-tree-inner { display: none; }
  .ws-tree-col.tree-collapsed .ws-tree-toggle-btn svg {
    transform: rotate(180deg);
  }
  .ws-tree-toggle-bar {
    flex-shrink: 0;
    display: flex;
    align-items: center;
    justify-content: space-between;
    padding: 4px 4px 0;
    min-height: 26px;
  }
  .ws-tree-title {
    font-size: 12px;
    font-weight: 600;
    color: var(--text-secondary, #8b8fa8);
    letter-spacing: 0.06em;
    text-transform: uppercase;
    padding-left: 4px;
    user-select: none;
  }
  .ws-tree-col.tree-collapsed .ws-tree-title {
    display: none;
  }
  .ws-tree-col.tree-collapsed .ws-tree-toggle-bar {
    justify-content: center;
    padding: 4px 0 0;
  }
  .ws-tree-toggle-btn {
    width: 18px;
    height: 18px;
    border-radius: 3px;
    display: flex;
    align-items: center;
    justify-content: center;
    cursor: pointer;
    color: var(--ink-faint);
    transition: background .15s, color .15s;
    flex-shrink: 0;
  }
  .ws-tree-toggle-btn:hover {
    background: var(--rule);
    color: var(--ink);
  }
  .ws-tree-toggle-btn svg { width: 11px; height: 11px; }
  .ws-tree-group { margin-bottom: 2px; }
  .ws-tree-folder {
    display: flex;
    align-items: center;
    gap: 4px;
    padding: 5px 8px 5px 10px;
    cursor: pointer;
    user-select: none;
    color: var(--ink-mute);
    transition: color .12s;
  }
  .ws-tree-folder:hover { color: var(--ink); }
  .ws-tree-folder-arrow {
    width: 10px; height: 10px;
    flex-shrink: 0;
    transition: transform 0.15s;
  }
  .ws-tree-folder-arrow.open { transform: rotate(90deg); }
  .ws-tree-folder-label {
    font-family: 'JetBrains Mono', monospace;
    font-size: 12px;
    letter-spacing: 0.08em;
    text-transform: uppercase;
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
    flex: 1;
    min-width: 0;
  }
  .ws-tree-files {}
  .ws-tree-file {
    display: flex;
    align-items: center;
    gap: 6px;
    padding: 3px 8px 3px 10px;
    cursor: pointer;
    font-size: 12px;
    color: var(--ink-soft);
    line-height: 1.35;
    border-left: 2px solid transparent;
    transition: background .1s, color .1s;
    overflow: hidden;
  }
  .ws-tree-file:hover {
    background: var(--paper-warm);
    color: var(--ink);
  }
  .ws-tree-file.active {
    background: var(--vermilion-bg);
    border-left-color: var(--vermilion);
    color: var(--vermilion);
  }
  .ws-tree-file-dot {
    width: 5px; height: 5px;
    border-radius: 1px;
    flex-shrink: 0;
  }
  .ws-tree-file-dot.code { background: var(--ink); }
  .ws-tree-file-dot.data { background: var(--success); }
  .ws-tree-file-dot.plan { background: var(--vermilion); }
  .ws-tree-file-name {
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
    flex: 1;
    min-width: 0;
  }
  .ws-tree-empty-stage {
    padding: 3px 8px 3px 22px;
    font-family: 'Inter', sans-serif;
    font-style: normal;
    font-size: 12px;
    color: var(--ink-faint);
  }

  /* ===== case_010 · Ant Design 风格工作空间树 + 可关闭标签页 ===== */
  .case-ws { display:flex; width:100%; min-width:0; height:100%; background:var(--paper); }
  .case-ws-tree { width:218px; min-width:218px; overflow:auto; padding:8px 0 14px; border-right:1px solid var(--rule); background:var(--paper-cool); }
  .case-ws-root, .case-ws-folder, .case-ws-file { display:flex; align-items:center; min-width:0; height:28px; padding:0 9px; color:var(--ink-soft); font-size:12px; line-height:1; user-select:none; }
  .case-ws-root { color:var(--ink); font-weight:600; }
  .case-ws-folder { cursor:pointer; }
  .case-ws-folder:hover, .case-ws-file:hover { background:var(--paper-warm); color:var(--ink); }
  .case-ws-file { width:100%; border:0; border-left:3px solid transparent; background:transparent; cursor:pointer; text-align:left; }
  .case-ws-file.active { color:var(--blue); background:rgba(61,143,166,.10); border-left-color:var(--blue); }
  .case-ws-switcher { width:16px; margin-right:2px; color:var(--ink-faint); font-size:12px; text-align:center; transition:transform .15s ease; }
  .case-ws-switcher.closed { transform:rotate(-90deg); }
  .case-ws-tree-icon { width:15px; margin-right:6px; color:var(--ink-mute); font-size:14px; flex:0 0 auto; }
  .case-ws-root .case-ws-tree-icon { color:var(--blue); }
  .case-ws-file-icon { width:15px; margin:0 6px 0 18px; color:var(--ink-faint); font-size:13px; flex:0 0 auto; }
  .case-ws-file-name { overflow:hidden; text-overflow:ellipsis; white-space:nowrap; flex:1; min-width:0; font-family:'JetBrains Mono',monospace; font-size:12px; }
  .case-ws-folder-count { margin-left:auto; color:var(--ink-faint); font:12px/1 'JetBrains Mono',monospace; }
  .case-ws-folder-files[hidden] { display:none; }
  .case-ws-main { flex:1; min-width:0; display:flex; flex-direction:column; overflow:hidden; }
  .case-ws-tabs { display:flex; align-items:flex-end; min-height:35px; overflow-x:auto; overflow-y:hidden; padding:0 8px; border-bottom:1px solid var(--rule); background:var(--paper-cool); }
  .case-ws-tab { display:inline-flex; align-items:center; gap:6px; height:34px; min-width:0; max-width:190px; padding:0 7px 0 9px; border:1px solid transparent; border-bottom:0; background:transparent; color:var(--ink-mute); cursor:pointer; font:12px/1 'JetBrains Mono',monospace; }
  .case-ws-tab:hover { color:var(--ink); background:var(--paper-warm); }
  .case-ws-tab.active { color:var(--ink); background:var(--paper); border-color:var(--rule); }
  .case-ws-tab-name { overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
  .case-ws-tab-close { display:inline-flex; align-items:center; justify-content:center; width:16px; height:16px; border:0; border-radius:2px; background:transparent; color:var(--ink-faint); cursor:pointer; font-size:13px; flex:0 0 auto; }
  .case-ws-tab-close:hover { color:var(--vermilion); background:var(--vermilion-bg); }
  .case-ws-view { flex:1; min-height:0; overflow:auto; padding:14px; }
  .case-ws-empty { height:100%; display:flex; flex-direction:column; align-items:center; justify-content:center; gap:8px; color:var(--ink-faint); text-align:center; font-size:12px; line-height:1.7; }
  .case-ws-empty i { font-size:24px; color:var(--rule); }
  .case-ws-file-head { display:flex; align-items:flex-start; justify-content:space-between; gap:10px; margin-bottom:12px; }
  .case-ws-file-title { color:var(--ink); font:600 13px/1.4 'JetBrains Mono',monospace; overflow-wrap:anywhere; }
  .case-ws-file-meta { margin-top:4px; color:var(--ink-faint); font:12px/1.45 'JetBrains Mono',monospace; overflow-wrap:anywhere; }
  .case-ws-file-kind { padding:3px 6px; border:1px solid var(--rule); border-radius:3px; color:var(--ink-mute); font:12px/1 'JetBrains Mono',monospace; }
  .case-ws-source { display:inline-flex; align-items:center; gap:4px; margin-bottom:12px; color:var(--blue); font:12px/1.4 'JetBrains Mono',monospace; text-decoration:none; overflow-wrap:anywhere; }
  .case-ws-source:hover { text-decoration:underline; }
  .case-ws-code { margin:0; padding:12px; border:1px solid var(--rule-soft); border-radius:3px; background:var(--paper-warm); color:var(--ink-soft); font:12px/1.7 'JetBrains Mono',monospace; white-space:pre-wrap; overflow-wrap:anywhere; }
  .case-ws-note { margin-top:10px; padding:9px 10px; border-left:3px solid var(--blue); background:rgba(61,143,166,.07); color:var(--ink-soft); font-size:12px; line-height:1.65; }
  .case-ws-table { width:100%; border-collapse:collapse; font:12px/1.5 'JetBrains Mono',monospace; }
  .case-ws-table th, .case-ws-table td { padding:6px 8px; border:1px solid var(--rule-soft); text-align:left; vertical-align:top; }
  .case-ws-table th { background:var(--paper-warm); color:var(--ink-mute); font-weight:600; }
  .case-ws-table td { color:var(--ink-soft); }
  @media (max-width:1100px) { .case-ws-tree { width:184px; min-width:184px; } }

  /* ===== 文件预览列 ===== */
  .ws-preview-col {
    flex: 1;
    min-width: 0;
    display: flex;
    flex-direction: column;
    overflow: hidden;
    background: var(--paper);
  }
  .ws-preview-empty {
    flex: 1;
    display: flex;
    flex-direction: column;
    align-items: center;
    justify-content: center;
    gap: 10px;
    color: var(--ink-faint);
    padding: 20px;
  }
  .ws-preview-empty-icon img {
    width: 64px;
    height: 64px;
    object-fit: contain;
    opacity: 0.6;
  }
  .ws-preview-empty-text {
    font-family: 'Inter', sans-serif;
    font-style: normal;
    font-size: 13px;
    text-align: center;
    line-height: 1.6;
  }
  /* 真实图片预览（PNG/JPG/SVG …） */
  .ws-preview-image-wrap {
    display: flex;
    align-items: center;
    justify-content: center;
    padding: 8px;
    background: var(--paper-warm);
    border: 1px solid var(--rule);
    border-radius: 3px;
  }
  .ws-preview-image-wrap img {
    max-width: 100%;
    height: auto;
    display: block;
  }
  .ws-preview-header {
    padding: 12px 14px 10px;
    border-bottom: 1px solid var(--rule);
    flex-shrink: 0;
    background: var(--paper-cool);
  }
  .ws-preview-filename {
    font-size: 12px;
    font-weight: 500;
    color: var(--ink);
    margin-bottom: 5px;
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
    font-family: 'JetBrains Mono', monospace;
  }
  .ws-preview-badges {
    display: flex;
    align-items: center;
    gap: 8px;
  }
  .ws-preview-badge {
    font-family: 'JetBrains Mono', monospace;
    font-size: 12px;
    letter-spacing: 0.1em;
    text-transform: uppercase;
    padding: 2px 6px;
    border-radius: 2px;
    flex-shrink: 0;
  }
  .ws-preview-badge.code { background: #1a2332; color: var(--paper); }
  .ws-preview-badge.data { background: var(--success-bg); color: var(--success); }
  .ws-preview-badge.plan { background: var(--vermilion-bg); color: var(--vermilion); }
  .ws-preview-meta {
    font-family: 'JetBrains Mono', monospace;
    font-size: 12px;
    color: var(--ink-faint);
    letter-spacing: 0.04em;
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
  }
  .ws-preview-body {
    flex: 1;
    overflow-y: auto;
    padding: 14px 16px;
  }
  .ws-preview-code {
    font-family: 'JetBrains Mono', monospace;
    font-size: 12px;
    line-height: 1.75;
    color: var(--ink-soft);
    white-space: pre-wrap;
    word-break: break-word;
    background: var(--paper-warm);
    border: 1px solid var(--rule);
    border-radius: 3px;
    padding: 12px 14px;
    margin: 0;
  }
  .ws-preview-text {
    font-family: 'Noto Serif SC', 'Inter', serif;
    font-size: 13px;
    line-height: 1.85;
    color: var(--ink-soft);
  }
  .ws-preview-text h3 {
    font-family: 'Noto Serif SC', serif;
    font-size: 14px;
    font-weight: 600;
    color: var(--ink);
    margin: 14px 0 5px;
  }
  .ws-preview-text h3:first-child { margin-top: 0; }
  .ws-preview-text p { margin-bottom: 8px; }
  .ws-preview-data-table {
    width: 100%;
    border-collapse: collapse;
    font-family: 'JetBrains Mono', monospace;
    font-size: 12px;
  }
  .ws-preview-data-table th {
    text-align: left;
    padding: 5px 8px;
    background: var(--paper-warm);
    border: 1px solid var(--rule);
    color: var(--ink-mute);
    letter-spacing: 0.05em;
    text-transform: uppercase;
    font-size: 12px;
  }
  .ws-preview-data-table td {
    padding: 4px 8px;
    border: 1px solid var(--rule-soft);
    color: var(--ink-soft);
    font-size: 12px;
  }
  .ws-preview-data-table tr:hover td { background: var(--paper-warm); }
  .ws-preview-svg-placeholder {
    display: flex;
    align-items: center;
    justify-content: center;
    height: 140px;
    background: var(--paper-warm);
    border-radius: 3px;
    border: 1px dashed var(--rule);
    flex-direction: column;
    gap: 8px;
    color: var(--ink-faint);
  }
  .ws-preview-svg-placeholder .svg-icon { font-size: 28px; opacity: 0.5; }
  .ws-preview-svg-label {
    font-family: 'JetBrains Mono', monospace;
    font-size: 12px;
    letter-spacing: 0.12em;
    text-transform: uppercase;
  }

  /* ── Python code editor (dark theme) ── */
  .ws-code-editor {
    background: #0d1117;
    border-radius: 6px;
    overflow: hidden;
    border: 1px solid #30363d;
    font-family: 'JetBrains Mono', monospace;
    font-size: 12px;
    line-height: 1.75;
  }
  .ws-code-editor-bar {
    background: #161b22;
    border-bottom: 1px solid #30363d;
    padding: 5px 12px;
    display: flex;
    align-items: center;
    gap: 6px;
  }
  .ws-code-editor-dot {
    width: 9px; height: 9px; border-radius: 50%;
  }
  .ws-code-editor-lang {
    font-family: 'JetBrains Mono', monospace;
    font-size: 12px;
    color: #8b949e;
    margin-left: auto;
    letter-spacing: 0.12em;
    text-transform: uppercase;
  }
  .ws-code-editor-body {
    display: flex;
    overflow-x: auto;
  }
  .ws-code-line-nums {
    padding: 10px 10px 10px 12px;
    color: #3b434f;
    text-align: right;
    user-select: none;
    flex-shrink: 0;
    border-right: 1px solid #21262d;
    min-width: 28px;
  }
  .ws-code-line-nums span { display: block; font-size: 12px; line-height: 1.75; }
  .ws-code-lines {
    padding: 10px 14px;
    flex: 1;
    white-space: pre;
    overflow-x: auto;
    color: #e6edf3;
  }
  .hl-kw  { color: #ff7b72; }
  .hl-fn  { color: #d2a8ff; }
  .hl-bi  { color: #79c0ff; }
  .hl-st  { color: #a5d6ff; }
  .hl-cm  { color: #8b949e; font-style: italic; }
  .hl-nu  { color: #f2cc60; }
  .hl-dc  { color: #ffa657; }
  .hl-cl  { color: #ffa657; }
  .hl-op  { color: #ff7b72; }
  .hl-self{ color: #e6edf3; font-style: italic; }

  /* ── FASTA protein sequence viewer ── */
  .ws-fasta-wrap {
    font-family: 'JetBrains Mono', monospace;
    font-size: 12px;
    line-height: 1.6;
  }
  .ws-fasta-hdr {
    color: #e07030;
    font-size: 12px;
    margin-bottom: 8px;
    word-break: break-all;
  }
  .ws-fasta-legend {
    display: flex;
    flex-wrap: wrap;
    gap: 4px 10px;
    margin-bottom: 10px;
    padding: 6px 10px;
    background: var(--paper-cool);
    border: 1px solid var(--rule);
    border-radius: 4px;
  }
  .ws-fasta-legend-item {
    display: flex;
    align-items: center;
    gap: 4px;
    font-size: 12px;
    color: var(--ink-soft);
  }
  .ws-fasta-legend-dot {
    width: 9px; height: 9px; border-radius: 2px; flex-shrink: 0;
  }
  .ws-fasta-seq {
    background: var(--paper-warm);
    border: 1px solid var(--rule);
    border-radius: 4px;
    padding: 10px 12px;
    display: flex;
    flex-direction: column;
    gap: 1px;
  }
  .ws-fasta-row {
    display: flex;
    align-items: baseline;
    gap: 6px;
  }
  .ws-fasta-pos {
    color: var(--ink-faint);
    font-size: 12px;
    min-width: 26px;
    text-align: right;
    user-select: none;
    flex-shrink: 0;
  }
  .ws-fasta-chunk { display: flex; gap: 0; }
  .ws-fasta-aa {
    width: 11px;
    text-align: center;
    font-size: 12px;
    font-weight: 700;
    border-radius: 1px;
    cursor: default;
  }
  .aa-H { color: #1a7a4a; background: #d4f5e2; }
  .aa-P { color: #1a58b0; background: #d0e8ff; }
  .aa-K { color: #b04000; background: #ffe0cc; }
  .aa-N { color: #781868; background: #f5d4f0; }
  .aa-S { color: #7a6800; background: #fff3cc; }
  .aa-A { color: var(--aux-purple); background: var(--aux-purple-bg); }
  .ws-fasta-stats {
    display: flex;
    gap: 12px;
    margin-top: 8px;
    font-size: 12px;
    color: var(--ink-faint);
    padding-top: 8px;
    border-top: 1px solid var(--rule);
  }
  /* ------- 右侧：独立内容展示区 ------- */
  .asset-preview-panel {
    position: fixed;
    top: 56px;
    right: 0;
    bottom: 0;
    width: var(--asset-preview-w);
    min-width: 0;
    z-index: 70;
    border-left: 1px solid var(--rule);
    background: var(--paper);
    display: none;
    flex-direction: column;
    overflow: hidden;
  }
  .chat-wrap.asset-preview-open .asset-preview-panel {
    display: flex;
  }
  .asset-preview-head {
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: 12px;
    padding: 13px 14px 11px;
    border-bottom: 1px solid var(--rule);
    background: var(--paper-cool);
  }
  .asset-preview-kicker {
    font-family: 'JetBrains Mono', monospace;
    font-size: 12px;
    letter-spacing: 0.14em;
    text-transform: uppercase;
    color: var(--ink-mute);
  }
  .asset-preview-title {
    margin-top: 4px;
    font-size: 14px;
    color: var(--ink);
    font-weight: 500;
    line-height: 1.3;
  }
  .asset-preview-head-actions {
    display: inline-flex;
    align-items: center;
    gap: 4px;
    flex-shrink: 0;
  }
  .asset-preview-download,
  .asset-preview-close {
    width: 26px;
    height: 26px;
    border: 1px solid transparent;
    border-radius: 2px;
    background: transparent;
    color: var(--ink-mute);
    display: inline-flex;
    align-items: center;
    justify-content: center;
    cursor: pointer;
  }
  .asset-preview-download:hover {
    color: var(--ink);
    border-color: var(--rule);
    background: var(--paper-warm);
  }
  .asset-preview-close:hover {
    color: var(--vermilion);
    border-color: var(--vermilion-soft);
    background: var(--vermilion-bg);
  }
  .asset-preview-download svg,
  .asset-preview-close svg {
    width: 13px;
    height: 13px;
    stroke: currentColor;
  }
  .asset-preview-body {
    flex: 1;
    min-height: 0;
    overflow-y: auto;
    padding: 16px;
  }
  .asset-preview-meta {
    color: var(--ink-soft);
    font-size: 12px;
    line-height: 1.65;
    margin-bottom: 16px;
  }
  .asset-preview-section {
    border-top: 1px solid var(--rule-soft);
    padding-top: 13px;
    margin-top: 13px;
  }
  .asset-preview-section-title {
    font-family: 'JetBrains Mono', monospace;
    font-size: 12px;
    letter-spacing: 0.12em;
    text-transform: uppercase;
    color: var(--ink-mute);
    margin-bottom: 8px;
  }
  .asset-preview-code {
    margin: 0;
    padding: 11px;
    border: 1px solid var(--rule-soft);
    background: var(--paper-warm);
    color: var(--ink-soft);
    font-family: 'JetBrains Mono', monospace;
    font-size: 12px;
    line-height: 1.65;
    white-space: pre-wrap;
    overflow: auto;
  }
  /* ===== 模态框：创建项目 ===== */
  .modal-backdrop {
    display: none;
    position: fixed;
    inset: 0;
    background: rgba(26, 35, 50, 0.35);
    backdrop-filter: blur(4px);
    z-index: 100;
    align-items: center;
    justify-content: center;
    padding: 20px;
  }
  .modal-backdrop.open { display: flex; animation: fadeIn .2s; }
  @keyframes fadeIn { from { opacity: 0; } to { opacity: 1; } }

  .modal {
    width: 100%;
    max-width: 520px;
    background: var(--paper);
    border-radius: 8px;
    padding: 36px 40px 32px;
    box-shadow: 0 40px 80px -20px rgba(26,35,50,0.3);
  }
  .modal-title {
    font-family: 'Noto Serif SC', serif;
    font-size: 24px;
    font-weight: 700;
    color: var(--ink);
    margin-bottom: 6px;
    letter-spacing: 0.02em;
  }
  .modal-title em { font-style: normal; font-weight: 700; color: var(--vermilion); }
  .modal-sub {
    font-size: 13px;
    color: var(--ink-mute);
    font-family: 'Inter', sans-serif;
    letter-spacing: 0.03em;
    margin-bottom: 28px;
  }

  .form-field { margin-bottom: 20px; }
  .form-label {
    font-family: 'JetBrains Mono', monospace;
    font-size: 12px;
    letter-spacing: 0.18em;
    text-transform: uppercase;
    color: var(--ink-mute);
    display: block;
    margin-bottom: 8px;
  }
  .form-input {
    width: 100%;
    padding: 10px 14px;
    border: 1px solid var(--rule);
    border-radius: 3px;
    font-size: 14px;
    background: var(--paper);
    transition: border-color .15s;
  }
  .form-input:focus { border-color: var(--ink-soft); }
  .form-textarea {
    width: 100%;
    padding: 10px 14px;
    border: 1px solid var(--rule);
    border-radius: 3px;
    font-size: 13px;
    min-height: 72px;
    resize: vertical;
    background: var(--paper);
    line-height: 1.6;
  }
  .form-textarea:focus { border-color: var(--ink-soft); }

  .domain-options {
    display: grid;
    grid-template-columns: repeat(2, 1fr);
    gap: 8px;
  }
  .domain-opt {
    padding: 10px 14px;
    border: 1px solid var(--rule);
    border-radius: 3px;
    font-size: 13px;
    color: var(--ink-soft);
    cursor: pointer;
    text-align: left;
    transition: all .15s;
    display: flex;
    align-items: center;
    gap: 10px;
  }
  .domain-opt:hover { border-color: var(--ink-soft); }
  .domain-opt.selected {
    border-color: var(--vermilion);
    background: var(--vermilion-bg);
    color: var(--vermilion);
  }
  .domain-opt .dot {
    width: 8px; height: 8px; border-radius: 50%; background: currentColor;
  }

  .modal-actions {
    display: flex;
    justify-content: flex-end;
    gap: 8px;
    margin-top: 28px;
  }

  /* ===== 项目创建成功提示 ===== */
  .toast {
    position: fixed;
    top: 76px;
    left: 50%;
    transform: translateX(-50%) translateY(-10px);
    background: var(--ink);
    color: var(--paper);
    padding: 12px 20px;
    border-radius: 4px;
    font-size: 13px;
    box-shadow: 0 10px 30px -10px rgba(26,35,50,0.4);
    opacity: 0;
    pointer-events: none;
    transition: opacity .25s, transform .25s;
    z-index: 200;
    display: flex;
    align-items: center;
    gap: 10px;
  }
  .toast.show { opacity: 1; transform: translateX(-50%) translateY(0); }
  .toast em {
    font-family: 'Inter', sans-serif;
    font-style: normal;
    font-weight: 600;
    color: var(--vermilion-soft);
    font-size: 13px;
  }

  /* ===== 科学可视化组件 ===== */
  .viz-block {
    margin: 14px 0 6px;
    border: 1px solid var(--rule);
    border-radius: 6px;
    overflow: hidden;
    background: var(--paper-cool);
  }
  .viz-header {
    padding: 7px 12px;
    background: var(--paper-warm);
    border-bottom: 1px solid var(--rule-soft);
    font-family: 'JetBrains Mono', monospace;
    font-size: 12px;
    letter-spacing: .12em;
    text-transform: uppercase;
    color: var(--ink-mute);
    display: flex;
    justify-content: space-between;
    align-items: center;
  }
  .viz-body {
    padding: 10px 12px 12px;
    overflow: visible;
  }
  .viz-legend {
    display: flex;
    gap: 14px;
    flex-wrap: wrap;
    margin-top: 8px;
    font-size: 12px;
    color: var(--ink-soft);
  }
  .viz-legend-item {
    display: flex;
    align-items: center;
    gap: 5px;
  }
  .viz-legend-dot {
    width: 10px; height: 10px;
    border-radius: 2px;
    flex-shrink: 0;
    display: inline-block;
  }

  /* 滚动条 */
  ::-webkit-scrollbar { width: 8px; height: 8px; }
  ::-webkit-scrollbar-track { background: transparent; }
  ::-webkit-scrollbar-thumb { background: var(--rule); border-radius: 4px; }
  ::-webkit-scrollbar-thumb:hover { background: var(--ink-faint); }

  /* -------- 快速示例行（所有模式公用） -------- */
  .examples-row {
    max-width: 820px;
    margin: 18px auto 12px;
    display: flex;
    align-items: center;
    flex-wrap: wrap;
    gap: 6px;
    padding: 0 2px;
    /* 默认隐藏，hover 输入区时渐入 */
    opacity: 0;
    pointer-events: none;
    transition: opacity .22s ease;
  }
  /* 当 mode-hint 不显示（collective）时自己撑起底部间距 */
  .examples-row.alone { margin-bottom: 56px; }

  /* 光标进入输入框时渐入；hover 示例行本身保持可见（防止点击前消失） */
  .composer:focus-within ~ .examples-row,
  .examples-row:hover {
    opacity: 1;
    pointer-events: auto;
  }
  .examples-label {
    font-family: 'JetBrains Mono', monospace;
    font-size: 12px;
    letter-spacing: 0.15em;
    text-transform: uppercase;
    color: var(--ink-faint);
    flex-shrink: 0;
    margin-right: 2px;
  }

  /* -------- .mode-examples (kept for fallback compatibility) -------- */
  .mode-example-chip {
    font-size: 12px;
    padding: 3px 11px;
    background: transparent;
    border: 1px solid var(--rule-soft);
    border-radius: 20px;          /* 保持胶囊形，与 domain-chip 方角区分 */
    color: var(--ink-mute);
    cursor: pointer;
    transition: all .15s;
    line-height: 1.6;
    text-align: left;
    font-style: normal;
  }
  .mode-example-chip:hover {
    border-color: var(--vermilion-soft);
    color: var(--vermilion);
    background: var(--vermilion-bg);
    font-style: normal;
  }

  /* -------- 首页演示场景（剧场模式三幕） -------- */
  /* 输入栏到卡片区之间留出舒适距离 */
  .demo-stage {
    max-width: 1080px;         /* 4 卡 1 行：容器加宽，超出 composer (880) 以让单卡 ≈ 250px */
    margin: 56px auto 0;
    padding: 0 12px;           /* 给左右各留一点 viewport-边缘留白 */
  }
  .demo-stage-head {
    text-align: center;
    margin-bottom: 32px;
  }
  .demo-stage-eyebrow {
    font-family: 'Cormorant Garamond', 'Noto Serif SC', serif;
    font-style: italic;
    font-size: 13px;
    color: var(--vermilion);
    letter-spacing: 0.12em;
    margin-bottom: 8px;
    display: inline-flex;
    align-items: center;
    gap: 14px;
  }
  .demo-stage-eyebrow::before,
  .demo-stage-eyebrow::after {
    content: '';
    width: 30px;
    height: 1px;
    background: var(--vermilion);
    opacity: 0.7;
  }
  .demo-stage-title {
    font-family: 'Cormorant Garamond', 'Noto Serif SC', serif;
    font-size: 19px;
    font-weight: 400;
    color: var(--ink);
    letter-spacing: 0.04em;
    line-height: 1.3;
    margin-bottom: 8px;
  }
  .demo-stage-title em {
    font-style: italic;
    color: var(--vermilion);
    font-weight: 500;
  }
  .demo-stage-sub {
    font-size: 13px;
    color: var(--ink-mute);
    line-height: 1.65;
    max-width: 580px;
    margin: 0 auto;
  }

  /* 4 张卡 1 行 · 横向条形（landscape strip）
     · 容器 1080 + gap 24 → 每张约 250px 宽 · 比 880px / 2×2 时单卡更宽 */
  .demo-stage-grid {
    display: grid;
    grid-template-columns: repeat(4, 1fr);
    gap: 24px;
  }
  .demo-stage-grid .demo-scene {
    min-height: 180px;
    padding: 16px 20px 14px;
  }
  .demo-stage-grid .demo-scene .demo-scene-watermark {
    width: 78px; height: 78px;
    right: 14px; bottom: 14px;
  }
  @media (max-width: 1100px) {
    /* 容器开始受 viewport 挤压：保持 4 列但收紧 gap & padding，避免内容回落到 880 档 */
    .demo-stage-grid { gap: 18px; }
    .demo-stage-grid .demo-scene { padding: 14px 16px 12px; }
    .demo-stage-grid .demo-scene .demo-scene-watermark { width: 68px; height: 68px; right: 10px; bottom: 10px; }
  }
  @media (max-width: 880px) {
    .demo-stage-grid { grid-template-columns: repeat(2, 1fr); gap: 28px; }
    .demo-stage-grid .demo-scene { min-height: 200px; padding: 20px 24px 18px; }
    .demo-stage-grid .demo-scene .demo-scene-watermark { width: 92px; height: 92px; right: 16px; bottom: 16px; }
  }
  @media (max-width: 560px) {
    .demo-stage-grid { grid-template-columns: 1fr; gap: 24px; }
    .demo-stage-grid .demo-scene { min-height: 180px; padding: 16px 18px 14px; }
  }

  .demo-scene {
    position: relative;
    background: var(--paper);
    border: 1px solid var(--rule);
    border-radius: 2px;
    padding: 16px 18px 14px;
    cursor: pointer;
    text-align: left;
    display: flex;
    flex-direction: column;
    transition: all .25s ease;
    overflow: hidden;
  }
  /* 背景轻微的纸纹（用 ::before 模拟米色斑点） */
  .demo-scene::before {
    content: '';
    position: absolute;
    inset: 0;
    background:
      radial-gradient(circle at 15% 20%, rgba(168,134,75,0.04) 0%, transparent 50%),
      radial-gradient(circle at 85% 80%, rgba(22,97,171,0.03) 0%, transparent 50%);
    pointer-events: none;
  }
  .demo-scene:hover {
    border-color: var(--ink-soft);
    transform: translateY(-2px);
    box-shadow: 0 6px 24px -8px rgba(26,35,50,0.12);
  }
  .demo-scene-frame {
    position: relative;
    z-index: 1;
    flex: 1;
  }
  /* 卡片主题水印：低饱和 vermilion，位于右下角，hover 时略微显形 */
  .demo-scene-watermark {
    position: absolute;
    right: 16px;
    bottom: 16px;
    width: 100px;
    height: 100px;
    color: var(--vermilion);
    opacity: 0.14;
    pointer-events: none;
    z-index: 0;
    transition: opacity .25s ease, transform .35s ease;
  }
  .demo-scene:hover .demo-scene-watermark {
    opacity: 0.26;
    transform: scale(1.06);
  }

  .demo-scene-act {
    font-family: 'JetBrains Mono', monospace;
    font-size: 12px;
    letter-spacing: 0.28em;
    text-transform: uppercase;
    color: var(--ink-faint);
    margin-bottom: 8px;
  }
  .demo-scene-num {
    display: none;
    position: absolute;
    top: -4px;
    right: -2px;
    font-family: 'Noto Serif SC', 'Songti SC', serif;
    font-size: 44px;
    font-weight: 400;
    color: var(--paper-warm);
    line-height: 1;
    user-select: none;
    transition: color .25s ease;
  }
  .demo-scene:hover .demo-scene-num {
    color: var(--vermilion-bg);
  }
  .demo-scene-latin {
    font-family: 'Cormorant Garamond', serif;
    font-style: italic;
    font-size: 12px;
    letter-spacing: 0.04em;
    color: var(--ink-faint);
    margin-bottom: 4px;
  }
  .demo-scene-h {
    font-family: 'Noto Serif SC', 'Songti SC', serif;
    font-size: 16px;
    font-weight: 500;
    color: var(--ink);
    letter-spacing: 0.06em;
    line-height: 1.3;
    margin-bottom: 9px;
    padding-bottom: 9px;
    border-bottom: 1px solid var(--rule-soft);
  }
  .demo-scene-desc {
    font-size: 13px;
    line-height: 1.7;
    color: var(--ink-mute);
    margin-bottom: 10px;
    /* 3 行高度：13 × 1.7 × 3 ≈ 66.3px，让 4 张卡片 tag 行水平对齐 */
    min-height: 67px;
    display: -webkit-box;
    -webkit-line-clamp: 3;
    -webkit-box-orient: vertical;
    overflow: hidden;
  }
  .demo-scene-tags {
    list-style: none;
    display: flex;
    flex-wrap: nowrap;         /* 0529 · 强制单行展示 · 3 个 tag 横向排列不换行 */
    column-gap: 4px;
    row-gap: 4px;
    margin: 0;
    padding: 0;
    width: 100%;
    overflow: hidden;          /* 父容器兜底防止溢出影响相邻卡片 */
  }
  .demo-scene-tags li {
    font-family: 'JetBrains Mono', monospace;
    font-size: 10px;           /* 11 → 10 · 配合 nowrap 让单卡更易装下 3 个 tag */
    letter-spacing: 0.02em;
    text-transform: uppercase;
    white-space: nowrap;       /* tag 内部文字不字符换行 */
    padding: 2px 5px;
    border: 1px solid var(--rule);
    color: var(--ink-mute);
    border-radius: 1px;
    background: var(--paper-warm);
    flex: 0 1 auto;            /* 等分剩余空间但允许内容自然宽度（避免裁剪长 tag）*/
    min-width: 0;
    text-overflow: ellipsis;
    overflow: hidden;
  }

  /* ===== 优秀案例 · 第二屏 ·（参考 aerospace_tenant_v2 .agent-card 风） ===== */
  .case-stage {
    margin: 64px 0 80px;
  }
  .case-stage-head {
    text-align: center;
    margin-bottom: 28px;
  }
  .case-stage-eyebrow {
    font-family: 'JetBrains Mono', monospace;
    font-size: 11px;
    letter-spacing: 0.32em;
    color: var(--vermilion);
    text-transform: uppercase;
    display: inline-flex;
    align-items: center;
    gap: 14px;
    margin-bottom: 14px;
  }
  .case-stage-eyebrow::before,
  .case-stage-eyebrow::after {
    content: ''; width: 28px; height: 1px; background: var(--vermilion-soft);
  }
  .case-stage-title {
    font-family: 'Noto Serif SC', serif;
    font-size: 28px;
    font-weight: 500;
    color: var(--ink);
    letter-spacing: 4px;
    margin: 0 0 10px;
  }
  .case-stage-title em { font-style: italic; color: var(--vermilion); font-weight: 500; }
  .case-stage-subtitle {
    font-size: 13px;
    color: var(--ink-mute);
    letter-spacing: 0.06em;
  }

  .case-stage-grid {
    display: grid;
    grid-template-columns: repeat(5, minmax(0, 1fr));
    gap: 18px;
  }
  @media (max-width: 1100px) {
    .case-stage-grid { grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 16px; }
  }
  @media (max-width: 720px) {
    .case-stage-grid { grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 14px; }
  }
  @media (max-width: 480px) {
    .case-stage-grid { grid-template-columns: 1fr; }
  }

  .case-card {
    background: var(--paper);
    border: 1px solid var(--rule);
    border-radius: 3px;
    overflow: hidden;
    cursor: pointer;
    transition: transform 0.35s cubic-bezier(0.2, 0.8, 0.2, 1),
                box-shadow 0.35s ease,
                border-color 0.25s ease;
    display: flex;
    flex-direction: column;
  }
  .case-card:hover {
    border-color: var(--vermilion);
    transform: translateY(-3px);
    box-shadow: 0 16px 32px -16px rgba(26, 35, 50, 0.18);
  }

  .case-visual {
    height: 108px;
    background: var(--paper-warm);
    border-bottom: 1px solid var(--rule);
    position: relative;
    overflow: hidden;
    color: var(--vermilion);
  }
  .case-visual svg {
    width: 100%;
    height: 100%;
    display: block;
  }
  .case-visual-tag {
    position: absolute;
    top: 10px;
    left: 12px;
    font-family: 'JetBrains Mono', monospace;
    font-size: 9px;
    color: var(--ink-mute);
    letter-spacing: 0.18em;
    z-index: 2;
  }
  .case-visual-num {
    position: absolute;
    top: 10px;
    right: 12px;
    font-family: 'Noto Serif SC', serif;
    font-size: 11px;
    color: var(--vermilion);
    letter-spacing: 0.18em;
    z-index: 2;
  }

  .case-body {
    padding: 14px 16px 16px;
    flex: 1;
    display: flex;
    flex-direction: column;
  }
  .case-name-row {
    display: flex;
    justify-content: space-between;
    align-items: baseline;
    margin-bottom: 6px;
    gap: 8px;
  }
  .case-name {
    font-family: 'Noto Serif SC', serif;
    font-size: 15px;
    font-weight: 500;
    color: var(--ink);
    line-height: 1.3;
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
    flex: 1;
    min-width: 0;
  }
  .case-org {
    font-family: 'JetBrains Mono', monospace;
    font-size: 9px;
    color: var(--ink-mute);
    letter-spacing: 0.12em;
    white-space: nowrap;
    flex-shrink: 0;
  }
  .case-desc {
    font-size: 12px;
    color: var(--ink-soft);
    line-height: 1.6;
    margin: 0 0 12px;
    display: -webkit-box;
    -webkit-line-clamp: 3;
    -webkit-box-orient: vertical;
    overflow: hidden;
    flex: 1;
  }
  .case-tags {
    display: flex;
    flex-wrap: wrap;
    gap: 4px;
    padding-top: 10px;
    border-top: 1px dashed var(--rule);
  }
  .case-tag {
    font-family: 'JetBrains Mono', monospace;
    font-size: 9px;
    color: var(--vermilion);
    background: var(--vermilion-bg);
    border: 1px solid var(--rule);
    border-radius: 2px;
    padding: 2px 6px;
    letter-spacing: 0.04em;
    white-space: nowrap;
  }

  .demo-stage-foot {
    margin-top: 20px;
    text-align: center;
    display: flex;
    justify-content: center;
    align-items: center;
    gap: 10px;
  }
  .demo-stage-foot-mark {
    color: var(--ink-faint);
    font-size: 13px;
  }
  .demo-stage-foot-cap {
    font-family: 'Noto Serif SC', serif;
    font-size: 12px;
    color: var(--ink-faint);
    letter-spacing: 0.12em;
  }

  /* -------- 首页任务示例：编辑式版面 -------- */
  .task-anthology {
    max-width: 880px;
    margin: 44px auto 60px;
    padding: 0 8px;
  }

  .anth-head {
    display: flex;
    align-items: center;
    gap: 18px;
    margin-bottom: 28px;
  }
  .anth-rule {
    flex: 1;
    height: 1px;
    background: linear-gradient(90deg, transparent, var(--rule) 30%, var(--rule) 70%, transparent);
  }
  .anth-head-text { text-align: center; flex-shrink: 0; }
  .anth-eyebrow {
    font-family: 'JetBrains Mono', ui-monospace, monospace;
    font-size: 12px;
    letter-spacing: 0.32em;
    text-transform: uppercase;
    color: var(--vermilion);
    margin-bottom: 6px;
  }
  .anth-title {
    font-family: 'Noto Serif SC', 'Songti SC', serif;
    font-size: 19px;
    font-weight: 500;
    color: var(--ink-soft);
    letter-spacing: 0.06em;
    line-height: 1.4;
  }
  .anth-title em {
    font-style: italic;
    color: var(--ink);
    font-weight: 500;
    font-family: 'Cormorant Garamond', 'Noto Serif SC', serif;
  }

  .anth-list {
    list-style: none;
    display: grid;
    grid-template-columns: repeat(3, 1fr);
    gap: 18px;
    padding: 0;
    margin: 0;
  }
  @media (max-width: 900px) {
    .anth-list { grid-template-columns: 1fr; }
  }

  .anth-piece {
    position: relative;
    background: var(--paper);
    border: 1px solid var(--rule);
    border-radius: 2px;
    padding: 16px 18px 14px;
    cursor: pointer;
    text-align: left;
    display: flex;
    flex-direction: column;
    transition: all .25s ease;
    overflow: hidden;
  }
  .anth-piece::before {
    content: '';
    position: absolute;
    inset: 0;
    background:
      radial-gradient(circle at 15% 20%, rgba(168,134,75,0.04) 0%, transparent 50%),
      radial-gradient(circle at 85% 80%, rgba(22,97,171,0.03) 0%, transparent 50%);
    pointer-events: none;
  }
  .anth-piece:hover {
    border-color: var(--ink-soft);
    transform: translateY(-2px);
    box-shadow: 0 6px 24px -8px rgba(26,35,50,0.12);
    background: var(--paper);
  }

  .anth-num {
    position: absolute;
    top: -4px;
    right: -2px;
    font-family: 'Noto Serif SC', 'Songti SC', serif;
    font-size: 44px;
    font-weight: 400;
    color: var(--paper-warm);
    line-height: 1;
    user-select: none;
    transition: color .25s ease;
  }
  .anth-piece:hover .anth-num { color: var(--vermilion-bg); }

  .anth-body { position: relative; z-index: 1; min-width: 0; }
  .anth-latin {
    font-family: 'Cormorant Garamond', serif;
    font-style: italic;
    font-size: 12px;
    letter-spacing: 0.04em;
    color: var(--ink-faint);
    margin-bottom: 4px;
  }
  .anth-h {
    font-family: 'Noto Serif SC', 'Songti SC', serif;
    font-size: 16px;
    font-weight: 500;
    color: var(--ink);
    letter-spacing: 0.06em;
    line-height: 1.3;
    margin-bottom: 9px;
    padding-bottom: 9px;
    border-bottom: 1px solid var(--rule-soft);
  }
  .anth-desc {
    font-size: 12px;
    line-height: 1.7;
    color: var(--ink-mute);
    letter-spacing: 0.01em;
    margin: 0;
  }

  /* 印章：保留 HTML 但视觉上隐藏，统一到三幕剧场卡片样式 */
  .anth-seal { display: none; }

  .anth-foot {
    margin-top: 22px;
    text-align: center;
    display: flex;
    align-items: center;
    justify-content: center;
    gap: 12px;
  }
  .anth-foot-mark {
    font-size: 14px;
    color: var(--ink-faint);
    line-height: 1;
  }
  .anth-foot-cap {
    font-family: 'Noto Serif SC', 'Songti SC', serif;
    font-size: 12px;
    color: var(--ink-faint);
    letter-spacing: 0.16em;
  }

  /* -------- 专家审阅：确认执行 CTA -------- */
  .exec-confirm-cta {
    margin-top: 12px;
    padding: 8px 12px;
    border: 1px solid var(--rule);
    border-radius: 4px;
    display: flex;
    align-items: center;
    gap: 10px;
  }
  .exec-confirm-tip {
    flex: 1;
    font-size: 12px;
    color: var(--ink-mute);
  }
  .exec-confirm-actions { display: flex; gap: 6px; align-items: center; flex-shrink: 0; }
  .exec-confirm-btn {
    padding: 4px 12px;
    background: var(--ink);
    color: var(--paper);
    border-radius: 3px;
    font-size: 12px;
    font-family: 'JetBrains Mono', monospace;
    letter-spacing: 0.03em;
    cursor: pointer;
    transition: opacity .15s;
    border: none;
    white-space: nowrap;
  }
  .exec-confirm-btn:hover { opacity: .75; }

  /* -------- AI 自动：自动执行 CTA -------- */
  .exec-auto-cta {
    margin-top: 14px;
    padding: 12px 16px;
    border: 1px solid var(--rule);
    border-left: 3px solid var(--vermilion);
    background: var(--vermilion-bg);
    border-radius: 4px;
    display: flex;
    align-items: center;
    gap: 12px;
  }
  .exec-auto-spinner {
    width: 15px;
    height: 15px;
    border: 2px solid rgba(26,79,140,0.2);
    border-top-color: var(--vermilion);
    border-radius: 50%;
    animation: spinCTA .75s linear infinite;
    flex-shrink: 0;
  }
  @keyframes spinCTA  { to { transform: rotate(360deg); } }
  @keyframes spin360  { to { transform: rotate(360deg); } }
  .exec-auto-text {
    font-size: 12px;
    color: var(--ink-soft);
    line-height: 1.55;
  }
  .exec-auto-text strong { color: var(--vermilion); }
  .exec-auto-text em { font-style: normal; color: var(--ink-mute); font-size: 12px; }

  /* -------- 对话页执行模式徽章 -------- */
  .chat-exec-badge {
    font-family: 'JetBrains Mono', monospace;
    font-size: 12px;
    letter-spacing: 0.1em;
    text-transform: uppercase;
    padding: 2px 7px;
    border-radius: 2px;
    background: #fffdf5;
    color: var(--gold);
    border: 1px solid #e8d9a0;
    flex-shrink: 0;
    line-height: 1.6;
  }
  .chat-exec-badge.auto {
    background: var(--vermilion-bg);
    color: var(--vermilion);
    border-color: var(--vermilion-soft);
  }

  /* ── 课题选择器（输入栏顶部） ── */
  .ctx-selector {
    display: flex;
    align-items: center;
    padding: 7px 14px 7px 16px;
    border-bottom: 1px solid var(--rule-soft);
    gap: 6px;
    position: relative;
    cursor: pointer;
    user-select: none;
    transition: background .15s;
    border-radius: 8px 8px 0 0;
  }
  .ctx-selector:hover { background: var(--paper-warm); }

  .ctx-selector-icon {
    width: 14px; height: 14px;
    color: var(--ink-faint);
    flex-shrink: 0;
  }
  .ctx-selector-label {
    font-family: 'JetBrains Mono', monospace;
    font-size: 12px;
    letter-spacing: 0.06em;
    color: var(--ink-mute);
    flex: 1;
  }
  .ctx-selector-label em {
    font-style: normal;
    color: var(--ink-soft);
    font-weight: 500;
  }
  .ctx-selector-arrow {
    width: 13px; height: 13px;
    color: var(--ink-faint);
    flex-shrink: 0;
    transition: transform .2s;
  }
  .ctx-selector.open .ctx-selector-arrow { transform: rotate(180deg); }

  /* 课题下拉浮层 */
  .ctx-dropdown {
    position: absolute;
    top: calc(100% + 4px);
    left: 0; right: 0;
    background: var(--paper);
    border: 1px solid var(--rule);
    border-radius: 8px;
    box-shadow: 0 10px 28px -6px rgba(26,35,50,0.14), 0 2px 6px -2px rgba(26,35,50,0.08);
    z-index: 300;
    overflow: hidden;
    animation: dropDown .15s ease-out;
  }
  @keyframes dropDown {
    from { opacity: 0; transform: translateY(-4px); }
    to   { opacity: 1; transform: translateY(0); }
  }
  .ctx-dropdown-header {
    padding: 8px 14px 6px;
    font-family: 'JetBrains Mono', monospace;
    font-size: 12px;
    letter-spacing: 0.18em;
    text-transform: uppercase;
    color: var(--ink-faint);
    border-bottom: 1px solid var(--rule-soft);
  }
  .ctx-option {
    display: flex;
    align-items: center;
    gap: 10px;
    padding: 9px 14px;
    cursor: pointer;
    transition: background .12s;
  }
  .ctx-option:hover { background: var(--paper-warm); }
  .ctx-option.selected { background: var(--vermilion-bg); }
  .ctx-option-dot {
    width: 7px; height: 7px;
    border-radius: 50%;
    flex-shrink: 0;
    background: var(--rule);
  }
  .ctx-option-dot.life     { background: var(--disc-life); }
  .ctx-option-dot.neuro    { background: var(--disc-neuro); }
  .ctx-option-dot.chem     { background: var(--disc-chem); }
  .ctx-option-dot.astro    { background: var(--disc-astro); }
  .ctx-option-dot.earth    { background: var(--disc-earth); }
  .ctx-option-dot.material { background: var(--disc-material); }
  .ctx-option-dot.math     { background: var(--disc-math); }
  .ctx-option-dot.physics  { background: var(--disc-physics); }
  .ctx-option-dot.matter   { background: var(--disc-material); }
  .ctx-option-dot.free     { background: var(--ink-faint); }
  .ctx-option-info { flex: 1; min-width: 0; }
  .ctx-option-name {
    font-size: 13px;
    color: var(--ink);
    white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
  }
  .ctx-option.selected .ctx-option-name { color: var(--vermilion); font-weight: 500; }
  .ctx-option-meta {
    font-family: 'JetBrains Mono', monospace;
    font-size: 12px;
    color: var(--ink-faint);
    letter-spacing: 0.05em;
    margin-top: 1px;
  }
  .ctx-option-check {
    width: 14px; height: 14px;
    color: var(--vermilion);
    flex-shrink: 0;
    opacity: 0;
  }
  .ctx-option.selected .ctx-option-check { opacity: 1; }

  /* ── 输入工具栏（上传 / 模型选择 / 技能） ── */
  .input-toolbar {
    display: flex;
    align-items: center;
    gap: 2px;
    flex-shrink: 0;
    position: relative;
  }

  .toolbar-icon-btn {
    width: 28px; height: 28px;
    display: flex; align-items: center; justify-content: center;
    border-radius: 5px;
    color: var(--ink-mute);
    transition: background .15s, color .15s;
    flex-shrink: 0;
  }
  .toolbar-icon-btn:hover { background: var(--paper-warm); color: var(--ink-soft); }
  .toolbar-icon-btn svg { width: 15px; height: 15px; }

  .toolbar-plus-btn {
    font-size: 18px;
    font-weight: 300;
    line-height: 1;
    color: var(--ink-mute);
    width: 26px; height: 26px;
  }

  .toolbar-sep {
    color: var(--rule);
    font-size: 14px;
    line-height: 1;
    user-select: none;
    pointer-events: none;
    margin: 0 1px;
  }

  .model-pill {
    display: inline-flex;
    align-items: center;
    gap: 4px;
    padding: 3px 8px 3px 6px;
    border-radius: 5px;
    font-size: 12px;
    font-family: 'JetBrains Mono', monospace;
    letter-spacing: 0.02em;
    color: var(--ink-mute);
    transition: background .15s, color .15s;
    white-space: nowrap;
  }
  .model-pill:hover { background: var(--paper-warm); color: var(--ink-soft); }
  .model-pill svg { flex-shrink: 0; }
  .model-pill .pill-arrow { width: 10px; height: 10px; opacity: 0.5; }

  /* 专家引擎开关 · 复用 .quick-toggle 同款 pill 样式 · 见 line ~3601
     差异（让它在 composer toolbar 里跟「上传文件」「选择模型」视觉一致）：
       · 未选中：bg + border 都透明 · 跟邻居的无边框 pill 同款 · 离 | 不会显拥挤
       · hover ：浅底 (paper-warm) · 跟 .toolbar-icon-btn / .model-pill hover 一致
       · active：vermilion-bg + vermilion-soft 边框 · 激活反馈保留 */
  #composerExpertToggle {
    background: transparent;
    border-color: transparent;
  }
  #composerExpertToggle:hover {
    background: var(--paper-warm);
    border-color: transparent;
  }
  #composerExpertToggle.active {
    background: var(--vermilion-bg);
    border-color: var(--vermilion-soft);
  }

  /* 推理模式段控件（深度认知 / 快速迭代） · 位于 composer 工具栏
     · 视觉上是圆角胶囊两段式：透明容器 + 段内高亮，避免与相邻 pill 重色
     · active 段：vermilion 淡底 + vermilion 前景；hover 段：paper-warm 弱底 */
  .iter-mode-toggle {
    display: inline-flex;
    align-items: stretch;
    height: 24px;
    padding: 2px;
    border: 1px solid var(--rule);
    border-radius: 12px;
    background: var(--paper);
    gap: 0;
    user-select: none;
  }
  .iter-mode-opt {
    display: inline-flex;
    align-items: center;
    gap: 4px;
    height: 100%;
    padding: 0 8px;
    background: transparent;
    border: none;
    border-radius: 9px;
    font-size: 11.5px;
    color: var(--ink-mute);
    cursor: pointer;
    transition: background .15s, color .15s;
  }
  .iter-mode-opt i { font-size: 12px; line-height: 1; }
  .iter-mode-opt:hover { color: var(--ink-soft); background: var(--paper-warm); }
  .iter-mode-opt.active {
    background: var(--vermilion-bg);
    color: var(--vermilion);
    font-weight: 600;
    box-shadow: 0 0 0 1px var(--vermilion-soft) inset;
  }
  .iter-mode-opt.active:hover { background: var(--vermilion-bg); }
  .iter-mode-opt[data-mode="fast"].active i {
    animation: iterBoltPulse 1.4s ease-in-out infinite;
  }
  @keyframes iterBoltPulse {
    0%, 100% { opacity: 1; transform: scale(1); }
    50%      { opacity: 0.55; transform: scale(1.12); }
  }

  /* 通用浮层下拉 */
  .input-dropdown {
    position: absolute;
    bottom: calc(100% + 6px);
    left: 0;
    min-width: 220px;
    /* 太长时自己滚 —— 之前 18 个模型顶到浏览器顶把 header/Auto 都挤出屏幕
       (用户明确报: "模型选择的框过长了, 上面的看不到")。
       max-height 用 vh 单位跟视口走; overflow-y:auto 让面板内部滚, 而不是
       整块顶穿视口。 */
    max-height: 60vh;
    overflow: hidden auto;
    background: var(--paper);
    border: 1px solid var(--rule);
    border-radius: 8px;
    box-shadow: 0 8px 24px -6px rgba(26,35,50,0.14), 0 2px 6px -2px rgba(26,35,50,0.08);
    z-index: 200;
    animation: dropUp .15s ease-out;
  }
  @keyframes dropUp {
    from { opacity: 0; transform: translateY(4px); }
    to   { opacity: 1; transform: translateY(0); }
  }
  .input-dropdown-header {
    position: sticky;      /* 面板滚动时 header 顶部不动, 用户滚到中间仍看得见提示 */
    top: 0;
    background: var(--paper);
    padding: 8px 12px 6px;
    font-family: 'JetBrains Mono', monospace;
    font-size: 12px;
    letter-spacing: 0.18em;
    text-transform: uppercase;
    color: var(--ink-faint);
    border-bottom: 1px solid var(--rule-soft);
  }

  /* 模型选项 */
  .model-option {
    display: flex;
    align-items: center;
    gap: 10px;
    padding: 8px 12px;
    cursor: pointer;
    transition: background .12s;
  }
  .model-option:hover { background: var(--paper-warm); }
  .model-option.selected { background: var(--vermilion-bg); }
  .model-option-icon {
    width: 22px; height: 22px;
    border-radius: 4px;
    background: var(--paper-warm);
    border: 1px solid var(--rule);
    display: flex; align-items: center; justify-content: center;
    flex-shrink: 0; font-size: 12px;
  }
  .model-option.selected .model-option-icon { background: var(--vermilion-bg); border-color: var(--vermilion-soft); }
  .model-option-info { flex: 1; min-width: 0; }
  .model-option-name {
    font-size: 13px;
    font-weight: 500;
    color: var(--ink);
    line-height: 1.3;
  }
  .model-option-tags {
    display: flex; gap: 4px; margin-top: 2px;
  }
  .model-tag {
    font-family: 'JetBrains Mono', monospace;
    font-size: 12px; letter-spacing: 0.06em;
    padding: 1px 5px;
    border-radius: 2px;
    background: var(--paper-warm);
    color: var(--ink-faint);
  }
  .model-option.selected .model-tag { background: rgba(26,79,140,0.1); color: var(--vermilion); }

  /* 探索模式 pill：与 model-pill 同尺寸 + 同色（color 沿用 var(--ink-mute) / hover var(--ink-soft)）
     · 标签字体改 Serif，更适合中文
     · 不另设强调色：deduction 状态由对话页头部 chat-mode-badge 单独承载 vermilion 视觉 */
  .mode-pill {
    font-family: 'Noto Serif SC', serif;
    font-size: 12px;
    letter-spacing: 0.04em;
  }
  /* pill 内图标卡槽：把 inline-flex 锁住 13×13 与其它 pill SVG 一致 */
  .mode-pill-icon {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    width: 13px; height: 13px;
    flex-shrink: 0;
    transition: transform .35s ease;
  }
  .mode-pill-icon svg { width: 13px; height: 13px; display: block; }
  .mode-pill:hover .mode-pill-icon { transform: rotate(8deg); }
  .mode-pill[data-mode="free"]:hover .mode-pill-icon { transform: rotate(16deg); }
  /* mode-dropdown 比 model-dropdown 略宽，给副标题留位 */
  .mode-dropdown { min-width: 260px; }
  .mode-option .model-option-icon {
    color: var(--vermilion);
  }
  .model-option-sub {
    font-family: 'Noto Serif SC', serif;
    font-size: 12px;
    color: var(--ink-faint);
    line-height: 1.35;
    margin-top: 2px;
    letter-spacing: 0.02em;
  }
  .model-option.selected .model-option-sub { color: var(--ink-soft); }

  /* 技能选项 */
  .skill-item {
    display: flex;
    align-items: center;
    gap: 9px;
    padding: 7px 12px;
    cursor: pointer;
    transition: background .12s;
  }
  .skill-item:hover { background: var(--paper-warm); }
  .skill-item-icon {
    width: 22px; height: 22px;
    display: flex; align-items: center; justify-content: center;
    flex-shrink: 0; color: var(--ink-mute);
  }
  .skill-item-icon svg { width: 13px; height: 13px; }
  .skill-item-name {
    font-size: 13px;
    color: var(--ink-soft);
  }
  .skill-item-desc {
    font-family: 'JetBrains Mono', monospace;
    font-size: 12px; color: var(--ink-faint); letter-spacing: 0.04em;
    margin-left: auto;
    flex-shrink: 0;
  }

  /* 已上传文件 chips */
  .attached-files {
    display: flex; flex-wrap: wrap; gap: 5px;
    padding: 6px 12px 0;
  }
  .attached-chip {
    display: inline-flex; align-items: center; gap: 5px;
    padding: 3px 8px;
    background: var(--paper-warm);
    border: 1px solid var(--rule);
    border-radius: 4px;
    font-size: 12px; color: var(--ink-soft);
    animation: slideDown .15s ease-out;
  }
  .attached-chip-remove {
    color: var(--ink-faint); font-size: 13px; line-height: 1;
    cursor: pointer; margin-left: 1px;
  }
  .attached-chip-remove:hover { color: var(--ink); }

  /* ── 执行模式开关（嵌入 composer footer） ── */
  /* ── 执行模式开关（弱化文字样式，左下角） ── */
  .exec-toggle {
    display: flex;
    align-items: center;
    gap: 0;
    flex-shrink: 0;
  }
  .exec-toggle-opt {
    padding: 2px 8px;
    font-family: 'JetBrains Mono', monospace;
    font-size: 12px;
    letter-spacing: .04em;
    color: var(--ink-faint);
    cursor: pointer;
    transition: color .15s;
    white-space: nowrap;
    background: none;
    border: none;
    line-height: 1.5;
  }
  .exec-toggle-opt:hover { color: var(--ink-mute); }
  .exec-toggle-opt.active { color: var(--ink-soft); }
  .exec-toggle-sep {
    color: var(--rule);
    font-size: 12px;
    user-select: none;
    pointer-events: none;
  }

  /* 响应式：简单处理 */
  @media (max-width: 1200px) {
    .chat-wrap { grid-template-columns: 240px 1px minmax(360px, 1fr) 5px 500px; }
    .chat-wrap.asset-collapsed { grid-template-columns: 36px 1px minmax(360px, 1fr) 5px 500px; }
    .chat-wrap.workspace-collapsed { grid-template-columns: 240px 1px 1fr 0 36px; }
    .chat-wrap.asset-collapsed.workspace-collapsed { grid-template-columns: 36px 1px 1fr 0 36px; }
  }
  @media (max-width: 900px) {
    .chat-wrap { grid-template-columns: 1fr; }
    .asset-panel, .workspace-panel { display: none; }
    .panel-resize-handle { display: none; }
    .home-wrap { padding: 40px 24px 60px; }
    .topbar { padding: 0 14px; }
    .topbar-left { gap: 12px; min-width: 0; }
    .topbar-right { gap: 8px; }
    .logo-tag { display: none; }
    .user-profile { width: 34px; }
    .topbar-right .btn { padding: 7px 10px; }
  }

  /* =========================================== */
  /* ============ 自动实验室模式组件 ============ */
  /* =========================================== */

  .mode-tab.autolab.active {
    background: var(--brand); border-color: var(--brand);
  }

  /* --- 视频流 Widget --- */
  .video-feed-widget {
    border: 1px solid var(--rule);
    border-radius: 6px;
    overflow: hidden;
    background: #0c1827;
    margin: 14px 0;
    position: relative;
  }
  .vf-header {
    padding: 7px 14px;
    background: rgba(0, 8, 22, 0.9);
    border-bottom: 1px solid rgba(255,255,255,0.07);
    display: flex;
    justify-content: space-between;
    align-items: center;
    font-family: 'JetBrains Mono', monospace;
    font-size: 12px;
    color: rgba(160, 200, 230, 0.65);
    letter-spacing: 0.12em;
    text-transform: uppercase;
  }
  .vf-live-badge {
    display: flex; align-items: center; gap: 5px;
    color: #ff4848; font-weight: 700; letter-spacing: 0.22em;
  }
  .vf-live-dot {
    width: 6px; height: 6px; border-radius: 50%;
    background: #ff4848;
    animation: vfBlink 1.1s ease-in-out infinite;
  }
  @keyframes vfBlink {
    0%, 100% { opacity: 1; }
    50% { opacity: 0.2; }
  }
  .vf-cam-id { color: rgba(100, 200, 255, 0.8); }
  .vf-body {
    position: relative;
    aspect-ratio: 16/9;
    background: #0c1827;
    overflow: hidden;
  }
  .vf-image {
    width: 100%; height: 100%;
    object-fit: cover; display: block;
    filter: brightness(0.88) saturate(1.15) contrast(1.05);
  }
  .vf-scanlines {
    position: absolute; inset: 0; pointer-events: none;
    background: repeating-linear-gradient(
      0deg, transparent, transparent 3px,
      rgba(0,0,0,0.07) 3px, rgba(0,0,0,0.07) 4px
    );
  }
  .vf-corners { position: absolute; inset: 0; pointer-events: none; }
  .vf-corner {
    position: absolute; width: 18px; height: 18px;
    border-color: rgba(0, 220, 200, 0.65); border-style: solid;
  }
  .vf-corner.tl { top: 10px; left: 10px; border-width: 2px 0 0 2px; }
  .vf-corner.tr { top: 10px; right: 10px; border-width: 2px 2px 0 0; }
  .vf-corner.bl { bottom: 10px; left: 10px; border-width: 0 0 2px 2px; }
  .vf-corner.br { bottom: 10px; right: 10px; border-width: 0 2px 2px 0; }
  .vf-overlay {
    position: absolute; inset: 0; pointer-events: none;
    background: linear-gradient(to bottom, rgba(0,10,25,0.15) 0%, transparent 30%, transparent 70%, rgba(0,10,25,0.3) 100%);
  }
  .vf-label {
    position: absolute;
    font-family: 'JetBrains Mono', monospace;
    font-size: 12px; letter-spacing: 0.1em;
    background: rgba(0,0,0,0.5); padding: 2px 6px; border-radius: 2px;
  }
  .vf-label.tl { top: 12px; left: 12px; color: rgba(0,230,210,0.85); }
  .vf-label.tr { top: 12px; right: 12px; color: rgba(255,200,80,0.85); }
  .vf-label.bl { bottom: 12px; left: 12px; color: rgba(0,230,210,0.75); }
  .vf-label.br { bottom: 12px; right: 12px; color: rgba(255,200,80,0.75); }
  .vf-crosshair {
    position: absolute; top: 50%; left: 50%;
    transform: translate(-50%, -50%);
    width: 36px; height: 36px; pointer-events: none;
    border: 1.5px solid rgba(0,220,200,0.45);
    border-radius: 50%;
    animation: vfPulse 2.4s ease-in-out infinite;
  }
  @keyframes vfPulse {
    0%, 100% { opacity: 0.7; transform: translate(-50%,-50%) scale(1); }
    50% { opacity: 0.2; transform: translate(-50%,-50%) scale(1.4); }
  }
  .vf-footer {
    display: flex; gap: 16px; align-items: center;
    padding: 7px 14px;
    background: rgba(0,8,22,0.9);
    border-top: 1px solid rgba(255,255,255,0.06);
    font-family: 'JetBrains Mono', monospace;
    font-size: 12px; color: rgba(160,200,230,0.6); letter-spacing: 0.08em;
  }
  .vf-status-item { display: flex; align-items: center; gap: 4px; }
  .vf-dot {
    width: 5px; height: 5px; border-radius: 50%;
  }
  .vf-dot.green  { background: #3dd68c; animation: vfBlink 2s 0.3s infinite; }
  .vf-dot.teal   { background: var(--brand-mid); animation: vfBlink 1.8s 0.8s infinite; }
  .vf-dot.yellow { background: #f0c040; }

  /* 超材料湿实验视频 · 完全对齐电催化 .dc-ec-wl-lab-video：
     video-feed-widget 本身就是 16:9 圆角视频容器，隐藏原监控 header/footer。 */
  .video-feed-widget.dc-alloy-video-widget {
    position: relative;
    aspect-ratio: 16/9;
    border-radius: 6px;
    overflow: hidden;
    background: #1a1a1a;
    border: 0;
    padding: 0;
    box-shadow: none;
  }
  .dc-alloy-video-widget .vf-header,
  .dc-alloy-video-widget .vf-footer { display: none; }
  .dc-alloy-video-widget .vf-body {
    position: absolute;
    inset: 0;
    aspect-ratio: auto;
    border-radius: 0;
    border: 0;
    background: #1a1a1a;
  }
  .dc-alloy-video-widget .vf-image {
    width: 100%;
    height: 100%;
    object-fit: cover;
    display: block;
    filter: none;
  }
  .dc-alloy-video-widget .vf-overlay,
  .dc-alloy-video-widget .vf-scanlines,
  .dc-alloy-video-widget .vf-corners,
  .dc-alloy-video-widget .vf-crosshair { display: none; }
  .dc-alloy-video-widget .vf-label {
    position: absolute;
    top: 8px;
    left: 8px;
    padding: 3px 8px;
    border-radius: 3px;
    font-size: 12px;
    font-family: 'JetBrains Mono', monospace;
    font-weight: 600;
    letter-spacing: 0.04em;
    background: rgba(22,97,171,0.18);
    color: #2f7fd8;
  }
  .dc-alloy-video-widget .vf-label.tr,
  .dc-alloy-video-widget .vf-label.bl,
  .dc-alloy-video-widget .vf-label.br { display: none; }
  .dc-alloy-video-widget .vf-body > .vf-fullscreen-btn {
    top: 8px;
    right: 8px;
  }
  .dc-alloy-video-stack {
    display: flex;
    flex-direction: column;
    gap: 8px;
  }
  .dc-alloy-video-progress {
    display: flex;
    flex-direction: column;
    gap: 4px;
  }
  .dc-alloy-video-progress .bar {
    height: 5px;
    background: rgba(0,0,0,0.06);
    border-radius: 3px;
    overflow: hidden;
  }
  .dc-alloy-video-progress .bar-fill {
    height: 100%;
    background: var(--vermilion);
    transition: width 600ms ease;
  }
  .dc-alloy-video-progress .meta {
    display: flex;
    justify-content: space-between;
    gap: 10px;
    font-size: 12px;
    color: var(--ink-mute);
    font-family: 'JetBrains Mono', monospace;
  }
  .dc-alloy-video-progress .dc-alloy-wl-pct {
    color: var(--vermilion);
    font-weight: 600;
    white-space: nowrap;
  }

  /* --- 数据流 Widget --- */
  .data-stream-panel {
    border: 1px solid var(--rule); border-radius: 6px;
    overflow: hidden; background: var(--paper-cool);
    margin: 14px 0;
  }
  .ds-header {
    padding: 8px 14px; background: var(--paper-warm);
    border-bottom: 1px solid var(--rule);
    display: flex; justify-content: space-between; align-items: center;
    font-family: 'JetBrains Mono', monospace;
    font-size: 12px; color: var(--ink-mute); letter-spacing: 0.12em;
    text-transform: uppercase;
  }
  .ds-header-badge {
    font-size: 12px; padding: 2px 7px;
    background: var(--vermilion-bg); border: 1px solid var(--vermilion-soft);
    color: var(--vermilion); border-radius: 2px;
    letter-spacing: 0.1em; text-transform: uppercase;
    display: flex; align-items: center; gap: 5px;
  }
  .ds-header-badge::before {
    content: ""; width: 5px; height: 5px; border-radius: 50%;
    background: var(--vermilion); animation: vfBlink 1s infinite;
  }
  .ds-body { padding: 8px 14px; max-height: 210px; overflow-y: auto; }
  .ds-packet {
    display: grid;
    grid-template-columns: 110px 1fr 80px 64px;
    gap: 8px; padding: 6px 0;
    border-bottom: 1px dashed var(--rule-soft);
    align-items: center; font-size: 12px;
    animation: dsSlideIn 0.35s ease-out;
  }
  .ds-packet:last-child { border-bottom: none; }
  @keyframes dsSlideIn {
    from { opacity: 0; transform: translateY(-7px); }
    to   { opacity: 1; transform: translateY(0); }
  }
  .ds-key {
    font-family: 'JetBrains Mono', monospace; font-size: 12px;
    color: var(--ink-mute); letter-spacing: 0.07em; text-transform: uppercase;
  }
  .ds-value {
    font-family: 'JetBrains Mono', monospace; font-size: 12px;
    color: var(--ink); font-weight: 500;
  }
  .ds-value.highlight { color: var(--vermilion); }
  .ds-value.good { color: var(--success); }
  .ds-time {
    font-family: 'JetBrains Mono', monospace; font-size: 12px;
    color: var(--ink-faint); text-align: right;
  }
  .ds-badge {
    font-size: 12px; padding: 2px 6px; border-radius: 2px;
    text-align: center; font-family: 'JetBrains Mono', monospace;
    letter-spacing: 0.08em; text-transform: uppercase;
  }
  .ds-badge.ok     { background: var(--success-bg); color: var(--success); border: 1px solid #b8ddb8; }
  .ds-badge.warn   { background: var(--warning-bg); color: var(--warning); border: 1px solid #e8d4a0; }
  .ds-badge.target { background: var(--vermilion-bg); color: var(--vermilion); border: 1px solid var(--vermilion-soft); }
  .ds-summary {
    padding: 10px 14px; border-top: 1px solid var(--rule);
    display: grid; grid-template-columns: repeat(4, 1fr);
    gap: 6px; background: var(--paper);
  }
  .ds-sum-item { text-align: center; padding: 4px 0; }
  .ds-sum-val {
    font-family: 'Noto Serif SC', serif; font-size: 22px;
    font-weight: 500; color: var(--ink);
    display: block; line-height: 1; margin-bottom: 4px;
  }
  .ds-sum-val.good      { color: var(--success); }
  .ds-sum-val.highlight { color: var(--vermilion); }
  .ds-sum-label {
    font-family: 'JetBrains Mono', monospace; font-size: 12px;
    color: var(--ink-mute); letter-spacing: 0.12em; text-transform: uppercase;
  }

  /* --- DAG 实验编排可视化 --- */
  .dag-container {
    border: 1px solid var(--rule); border-radius: 4px;
    padding: 14px 16px; background: var(--paper-cool);
    margin: 14px 0; overflow-x: auto;
  }
  .dag-header {
    display: flex; justify-content: space-between; align-items: baseline;
    margin-bottom: 14px;
  }
  .dag-title {
    font-family: 'JetBrains Mono', monospace; font-size: 12px;
    color: var(--ink-mute); letter-spacing: 0.15em; text-transform: uppercase;
  }
  .dag-meta { font-size: 12px; color: var(--ink-mute); }
  .dag-grid { display: flex; flex-direction: column; gap: 10px; }
  .dag-batch { display: flex; gap: 10px; align-items: flex-start; }
  .dag-batch-label {
    font-family: 'JetBrains Mono', monospace; font-size: 12px;
    color: var(--ink-faint); letter-spacing: 0.12em; text-transform: uppercase;
    width: 58px; flex-shrink: 0; padding-top: 6px;
  }
  .dag-batch-nodes { display: flex; flex-wrap: wrap; gap: 6px; flex: 1; }
  .dag-node {
    padding: 5px 10px; border: 1px solid var(--rule); border-radius: 3px;
    font-family: 'JetBrains Mono', monospace; font-size: 12px;
    color: var(--ink-soft); background: var(--paper);
    white-space: nowrap; display: flex; align-items: center; gap: 5px;
  }
  .dag-node.priority { border-color: var(--vermilion-soft); background: var(--vermilion-bg); color: var(--vermilion); }
  .dag-node.parallel { border-color: var(--aux-cyan-bg); background: #eef8fd; color: var(--aux-cyan); }
  .dag-node-dot { width: 5px; height: 5px; border-radius: 50%; background: currentColor; opacity: 0.7; }
  .dag-arrow {
    font-family: 'JetBrains Mono', monospace; font-size: 12px;
    color: var(--ink-faint); padding-left: 58px; margin: 1px 0;
  }
  .dag-stats {
    margin-top: 12px; padding-top: 10px; border-top: 1px solid var(--rule-soft);
    display: flex; gap: 20px; font-size: 12px; color: var(--ink-mute);
  }
  .dag-stats strong { color: var(--vermilion); }

  /* --- 设备状态卡片 --- */
  .equip-grid {
    display: grid; grid-template-columns: repeat(auto-fill, minmax(155px, 1fr));
    gap: 8px; margin: 12px 0;
  }
  .equip-card {
    border: 1px solid var(--rule); border-radius: 4px;
    padding: 10px 12px; background: var(--paper);
    transition: border-color .15s;
  }
  .equip-card:hover { border-color: var(--ink-soft); }
  .equip-card-head {
    display: flex; justify-content: space-between; align-items: flex-start;
    margin-bottom: 4px; gap: 6px;
  }
  .equip-name { font-size: 12px; color: var(--ink); font-weight: 500; line-height: 1.3; }
  .equip-badge {
    font-family: 'JetBrains Mono', monospace; font-size: 12px;
    padding: 1px 5px; border-radius: 2px; letter-spacing: 0.08em;
    text-transform: uppercase; white-space: nowrap; flex-shrink: 0;
  }
  .equip-badge.online  { background: var(--success-bg); color: var(--success); border: 1px solid #b8ddb8; }
  .equip-badge.busy    { background: var(--vermilion-bg); color: var(--vermilion); border: 1px solid var(--vermilion-soft); }
  .equip-badge.standby { background: var(--paper-warm); color: var(--ink-mute); border: 1px solid var(--rule); }
  .equip-meta {
    font-family: 'JetBrains Mono', monospace; font-size: 12px;
    color: var(--ink-faint); letter-spacing: 0.04em;
  }
  .equip-bar {
    margin-top: 7px; height: 3px; background: var(--rule); border-radius: 2px; overflow: hidden;
  }
  .equip-bar-fill {
    height: 100%; border-radius: 2px;
    background: var(--vermilion); transition: width 1.2s ease;
  }
  .equip-bar-fill.green { background: var(--success); }

  /* --- 自动实验室资产面板专属 tab 颜色 --- */
  .asset-tab[data-asset="equipment"].active,
  .asset-tab[data-asset="reagent"].active,
  .asset-tab[data-asset="protocol"].active,
  .asset-tab[data-asset="history"].active {
    border-bottom-color: var(--brand-deep);
    color: var(--ink);
  }

  /* =========================================== */
  /* ========= 页面一·五：项目中心 ============= */
  /* =========================================== */
  .project-hub-wrap {
    min-height: calc(100vh - 56px);
    max-width: 1160px;
    margin: 0 auto;
    padding: 48px 48px 80px;
  }

  .hub-hero {
    display: flex;
    justify-content: space-between;
    align-items: flex-start;
    margin-bottom: 40px;
    padding-bottom: 32px;
    border-bottom: 1px solid var(--rule);
    gap: 24px;
  }
  .hub-hero-left { flex: 1; min-width: 0; }
  .hub-domain-row {
    display: flex;
    align-items: center;
    gap: 10px;
    margin-bottom: 12px;
  }
  .hub-domain-dot {
    width: 8px; height: 8px;
    border-radius: 50%;
    background: var(--vermilion);
    flex-shrink: 0;
  }
  .hub-domain-dot.life     { background: var(--disc-life); }
  .hub-domain-dot.neuro    { background: var(--disc-neuro); }
  .hub-domain-dot.chem     { background: var(--disc-chem); }
  .hub-domain-dot.astro    { background: var(--disc-astro); }
  .hub-domain-dot.earth    { background: var(--disc-earth); }
  .hub-domain-dot.material { background: var(--disc-material); }
  .hub-domain-dot.math     { background: var(--disc-math); }
  .hub-domain-dot.physics  { background: var(--disc-physics); }
  .hub-domain-dot.matter   { background: var(--disc-material); }
  .hub-domain-dot.autolab  { background: var(--brand-deep); }
  .hub-domain-label {
    font-family: 'JetBrains Mono', monospace;
    font-size: 12px;
    letter-spacing: 0.22em;
    text-transform: uppercase;
    color: var(--ink-mute);
  }
  .hub-project-name {
    font-family: 'Noto Serif SC', serif;
    font-size: 28px;
    font-weight: 700;
    color: var(--ink);
    letter-spacing: 0.02em;
    line-height: 1.25;
    margin-bottom: 10px;
  }
  .hub-project-desc {
    font-size: 13px;
    color: var(--ink-mute);
    line-height: 1.65;
    max-width: 560px;
  }
  .hub-hero-stats {
    display: flex;
    flex-direction: column;
    gap: 8px;
    align-items: flex-end;
    flex-shrink: 0;
  }
  .hub-stat-row {
    display: flex;
    gap: 6px;
    flex-wrap: wrap;
    justify-content: flex-end;
  }
  .hub-stat-chip {
    font-family: 'JetBrains Mono', monospace;
    font-size: 12px;
    letter-spacing: 0.08em;
    padding: 3px 8px;
    border: 1px solid var(--rule);
    border-radius: 2px;
    color: var(--ink-soft);
    background: var(--paper-warm);
  }
  .hub-actions { display: flex; gap: 8px; margin-top: 12px; }

  /* Hub 标签页 */
  .hub-tabs {
    display: flex;
    justify-content: flex-start;
    align-items: flex-end;
    gap: 0;
    border-bottom: 1px solid var(--rule);
    margin-bottom: 28px;
  }
  .hub-tab {
    padding: 0 4px 14px;
    margin-right: 32px;
    font-family: 'Inter', 'Noto Serif SC', sans-serif;
    font-size: 14px;
    font-weight: 500;
    letter-spacing: 0.02em;
    color: var(--ink-faint);
    cursor: pointer;
    border: none;
    background: none;
    border-bottom: 2px solid transparent;
    margin-bottom: -1px;
    transition: color .2s, border-color .2s;
    display: inline-flex;
    align-items: center;
    gap: 8px;
    line-height: 1;
  }
  .hub-tab:hover { color: var(--ink-soft); }
  .hub-tab.active {
    color: var(--ink);
    border-bottom-color: var(--vermilion);
    font-style: normal;
    font-weight: 600;
  }
  .hub-tab-count {
    font-family: 'JetBrains Mono', monospace;
    font-style: normal;
    font-size: 12px;
    color: var(--ink-faint);
    letter-spacing: 0.04em;
    margin-left: 2px;
    align-self: flex-start;
    margin-top: 4px;
  }
  .hub-tab.active .hub-tab-count {
    color: var(--ink-mute);
  }

  /* 资产空间管理面板 */
  .hub-asset-wrap {
    display: flex;
    gap: 24px;
    align-items: flex-start;
  }
  .hub-asset-subtabs {
    display: flex;
    flex-direction: column;
    gap: 4px;
    width: 160px;
    flex-shrink: 0;
  }
  .hub-asset-subtab {
    display: flex;
    align-items: center;
    gap: 8px;
    padding: 9px 14px;
    border-radius: 4px;
    font-size: 13px;
    color: var(--ink-mute);
    cursor: pointer;
    transition: all .15s;
    text-align: left;
    border: 1px solid transparent;
  }
  .hub-asset-subtab svg {
    width: 14px; height: 14px;
    flex-shrink: 0;
    stroke: currentColor;
    fill: none;
  }
  .hub-asset-subtab:hover {
    background: var(--paper-warm);
    color: var(--ink);
  }
  .hub-asset-subtab.active {
    background: var(--paper-warm);
    border-color: var(--rule);
    color: var(--ink);
    font-weight: 500;
  }
  .hub-asset-subtab-count {
    margin-left: auto;
    font-family: 'JetBrains Mono', monospace;
    font-size: 12px;
    color: var(--ink-faint);
    background: var(--paper);
    border: 1px solid var(--rule);
    border-radius: 10px;
    padding: 1px 6px;
  }
  .hub-asset-subtab.active .hub-asset-subtab-count {
    background: var(--vermilion-bg);
    border-color: var(--vermilion-soft);
    color: var(--vermilion);
  }
  .hub-asset-list {
    flex: 1;
    min-width: 0;
    display: flex;
    flex-direction: column;
    gap: 6px;
  }
  .hub-asset-item {
    display: flex;
    align-items: flex-start;
    gap: 12px;
    padding: 14px 18px;
    border: 1px solid var(--rule);
    border-radius: 4px;
    background: var(--paper);
    transition: all .15s;
    cursor: default;
  }
  .hub-asset-item:hover {
    border-color: var(--ink-soft);
    background: var(--paper-warm);
  }
  .hub-asset-item-icon {
    width: 32px; height: 32px;
    border-radius: 4px;
    background: var(--paper-warm);
    border: 1px solid var(--rule);
    display: flex; align-items: center; justify-content: center;
    flex-shrink: 0;
    color: var(--ink-mute);
  }
  .hub-asset-item-icon svg {
    width: 14px; height: 14px;
    stroke: currentColor; fill: none; stroke-width: 1.5;
  }
  .hub-asset-item-body { flex: 1; min-width: 0; }
  .hub-asset-item-name {
    font-size: 13px;
    color: var(--ink);
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
    font-weight: 450;
  }
  .hub-asset-item-meta {
    font-size: 12px;
    color: var(--ink-faint);
    margin-top: 3px;
    font-family: 'JetBrains Mono', monospace;
  }
  .hub-asset-add-btn {
    display: flex;
    align-items: center;
    gap: 8px;
    padding: 10px 18px;
    border: 1px dashed var(--rule);
    border-radius: 4px;
    font-size: 12px;
    color: var(--ink-mute);
    cursor: pointer;
    transition: all .15s;
    margin-top: 4px;
  }
  .hub-asset-add-btn:hover {
    border-color: var(--ink-soft);
    color: var(--ink);
    background: var(--paper-warm);
  }

  /* 探索图谱卡片（嵌入资产面板） */
  .hub-graph-card {
    border: 1px solid var(--rule);
    border-radius: 4px;
    background: var(--paper);
    cursor: pointer;
    transition: all .18s;
    overflow: hidden;
  }
  .hub-graph-card:hover {
    border-color: var(--ink-soft);
    box-shadow: 0 6px 18px -8px rgba(26,35,50,0.15);
    transform: translateY(-1px);
  }
  .hub-graph-card-thumb {
    height: 110px;
    background: var(--paper-warm);
    border-bottom: 1px solid var(--rule);
    overflow: hidden;
  }
  .hub-graph-card-body {
    padding: 12px 16px 14px;
  }
  .hub-graph-card-title {
    font-family: 'Noto Serif SC', serif;
    font-size: 14px; font-weight: 500;
    color: var(--ink); margin-bottom: 5px; line-height: 1.3;
  }
  .hub-graph-card-meta {
    font-family: 'JetBrains Mono', monospace;
    font-size: 12px; color: var(--ink-faint);
    letter-spacing: 0.05em; display: flex; gap: 10px; flex-wrap: wrap;
    margin-bottom: 10px;
  }
  .hub-graph-open-btn {
    display: inline-flex;
    align-items: center;
    gap: 6px;
    padding: 5px 12px;
    border: 1px solid var(--rule);
    border-radius: 3px;
    font-size: 12px;
    color: var(--ink-soft);
    background: var(--paper-warm);
    cursor: pointer;
    transition: all .15s;
  }
  .hub-graph-open-btn:hover {
    border-color: var(--vermilion);
    color: var(--vermilion);
    background: var(--vermilion-bg);
  }

  /* 会话记录列表 */
  .session-list { display: flex; flex-direction: column; gap: 10px; }
  .session-card {
    border: 1px solid var(--rule);
    border-radius: 4px;
    padding: 18px 22px;
    background: var(--paper);
    cursor: pointer;
    transition: all .18s;
    display: flex;
    align-items: flex-start;
    gap: 18px;
    position: relative;
  }
  .session-card:hover {
    border-color: var(--vermilion);
    transform: translateX(2px);
    box-shadow: 0 4px 16px -8px rgba(26,79,140,0.12);
  }
  .session-card-icon {
    width: 36px; height: 36px;
    border-radius: 4px;
    background: var(--paper-warm);
    border: 1px solid var(--rule);
    display: flex; align-items: center; justify-content: center;
    flex-shrink: 0;
    color: var(--ink-mute);
  }
  .session-card-icon svg { width: 16px; height: 16px; }
  .session-card.active-session .session-card-icon {
    background: var(--vermilion-bg);
    border-color: var(--vermilion-soft);
    color: var(--vermilion);
  }
  .session-card-body { flex: 1; min-width: 0; }
  .session-card-title {
    font-family: 'Noto Serif SC', serif;
    font-size: 14px;
    font-weight: 600;
    color: var(--ink);
    margin-bottom: 5px;
    line-height: 1.35;
    letter-spacing: 0.02em;
  }
  .session-card-preview {
    font-size: 13px;
    color: var(--ink-mute);
    line-height: 1.5;
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
    max-width: 580px;
  }
  .session-card-meta {
    display: flex;
    gap: 14px;
    align-items: center;
    margin-top: 10px;
    font-family: 'JetBrains Mono', monospace;
    font-size: 12px;
    color: var(--ink-faint);
    letter-spacing: 0.05em;
  }
  .session-card-meta .badge {
    padding: 1.5px 7px;
    border-radius: 2px;
    font-size: 12px;
    letter-spacing: 0.1em;
    text-transform: uppercase;
  }
  .session-card-meta .badge.collective { background: var(--vermilion-bg); color: var(--vermilion); border: 1px solid var(--vermilion-soft); }
  .session-card-meta .badge.protein    { background: var(--success-bg); color: var(--success); border: 1px solid #b8ddb8; }
  .session-card-meta .badge.drug       { background: #f4f0fa; color: #7a4faa; border: 1px solid #d8c8ee; }
  .session-card-meta .badge.autolab    { background: #eef4fa; color: #1d3d5c; border: 1px solid #c0d8ee; }
  .session-card-meta .badge.earth      { background: #eef4f8; color: #3a6b8a; border: 1px solid #b8d4e8; }
  .session-card-meta .badge.catalysis,
  .session-card-meta .badge.materials  { background: #fdf8ee; color: var(--gold); border: 1px solid #e8d8a8; }
  .session-continue-arrow {
    position: absolute;
    right: 20px; top: 50%;
    transform: translateY(-50%);
    color: var(--ink-faint);
    transition: all .18s;
  }
  .session-card:hover .session-continue-arrow { color: var(--vermilion); transform: translateY(-50%) translateX(3px); }

  .session-new-card {
    border: 1px dashed var(--rule);
    border-radius: 4px;
    padding: 18px 22px;
    background: var(--paper-warm);
    cursor: pointer;
    transition: all .18s;
    display: flex;
    align-items: center;
    gap: 12px;
    color: var(--ink-mute);
  }
  .session-new-card:hover {
    border-color: var(--vermilion);
    color: var(--vermilion);
    background: var(--vermilion-bg);
  }
  .session-new-card .plus-icon {
    font-family: 'Noto Serif SC', serif;
    font-size: 24px; font-weight: 300; line-height: 1;
  }
  .session-new-card .new-label {
    font-family: 'Noto Serif SC', serif;
    font-style: normal; font-size: 14px; font-weight: 500;
  }
  .session-new-card .new-sub {
    font-family: 'JetBrains Mono', monospace;
    font-size: 12px; letter-spacing: 0.15em;
    margin-left: auto;
    opacity: 0.6;
  }

  /* 探索图谱网格 */
  .graph-grid {
    display: grid;
    grid-template-columns: repeat(auto-fill, minmax(220px, 1fr));
    gap: 14px;
  }
  .graph-card {
    border: 1px solid var(--rule);
    border-radius: 4px;
    background: var(--paper);
    cursor: pointer;
    transition: all .2s;
    overflow: hidden;
  }
  .graph-card:hover {
    border-color: var(--ink-soft);
    transform: translateY(-2px);
    box-shadow: 0 10px 28px -12px rgba(26,35,50,0.18);
  }
  .graph-card-thumb {
    height: 130px;
    background: var(--paper-warm);
    border-bottom: 1px solid var(--rule);
    display: flex; align-items: center; justify-content: center;
    overflow: hidden;
    position: relative;
  }
  .graph-card-body { padding: 14px 16px; }
  .graph-card-title {
    font-family: 'Noto Serif SC', serif;
    font-size: 14px; font-weight: 500;
    color: var(--ink); margin-bottom: 4px; line-height: 1.3;
  }
  .graph-card-meta {
    font-family: 'JetBrains Mono', monospace;
    font-size: 12px; color: var(--ink-faint);
    letter-spacing: 0.05em; display: flex; gap: 10px;
  }
  .graph-new-card {
    border: 1px dashed var(--rule);
    border-radius: 4px;
    background: var(--paper-warm);
    cursor: pointer;
    transition: all .2s;
    display: flex; flex-direction: column;
    align-items: center; justify-content: center;
    min-height: 200px;
    color: var(--ink-mute);
    text-align: center; padding: 24px;
  }
  .graph-new-card:hover {
    border-color: var(--vermilion);
    color: var(--vermilion);
    background: var(--vermilion-bg);
  }
  .graph-new-card .plus { font-family: 'Noto Serif SC', serif; font-size: 36px; font-weight: 300; margin-bottom: 8px; }
  .graph-new-card .label { font-family: 'Noto Serif SC', serif; font-style: normal; font-size: 14px; font-weight: 500; }
  .graph-new-card .sub { font-family: 'JetBrains Mono', monospace; font-size: 12px; letter-spacing: 0.15em; margin-top: 4px; opacity: 0.7; }

  /* =========================================== */
  /* ========= 探索图谱查看器 Modal ============= */
  /* =========================================== */
  .graph-viewer-backdrop {
    position: fixed; inset: 0;
    background: rgba(26,35,50,0.55);
    backdrop-filter: blur(4px);
    z-index: 200;
    display: none; align-items: center; justify-content: center;
  }
  .graph-viewer-backdrop.open { display: flex; }
  .graph-viewer {
    background: var(--paper);
    border-radius: 6px;
    width: 860px; max-width: 95vw;
    max-height: 88vh;
    display: flex; flex-direction: column;
    box-shadow: 0 24px 64px -20px rgba(26,35,50,0.35);
    overflow: hidden;
  }
  .graph-viewer-head {
    padding: 16px 24px;
    border-bottom: 1px solid var(--rule);
    display: flex; justify-content: space-between; align-items: center;
    background: var(--paper-warm);
  }
  .graph-viewer-title {
    font-family: 'Noto Serif SC', serif;
    font-size: 20px; font-weight: 500; color: var(--ink);
  }
  .graph-viewer-meta {
    font-family: 'JetBrains Mono', monospace;
    font-size: 12px; color: var(--ink-mute);
    letter-spacing: 0.08em; margin-top: 2px;
  }
  .graph-viewer-close {
    width: 32px; height: 32px;
    border-radius: 4px;
    border: 1px solid var(--rule);
    display: flex; align-items: center; justify-content: center;
    color: var(--ink-mute); transition: all .15s;
  }
  .graph-viewer-close:hover { border-color: var(--ink-soft); color: var(--ink); background: var(--paper-warm); }
  .graph-viewer-body {
    flex: 1; overflow: auto;
    padding: 24px;
    background: var(--paper-cool);
    display: flex; align-items: flex-start; gap: 24px;
  }
  .graph-svg-wrap {
    flex: 1; background: var(--paper);
    border: 1px solid var(--rule);
    border-radius: 4px;
    min-height: 380px;
    display: flex; align-items: center; justify-content: center;
    overflow: hidden; position: relative;
  }
  .graph-legend {
    width: 200px; flex-shrink: 0;
    display: flex; flex-direction: column; gap: 12px;
  }
  .graph-legend-title {
    font-family: 'JetBrains Mono', monospace;
    font-size: 12px; letter-spacing: 0.18em; text-transform: uppercase;
    color: var(--ink-mute); margin-bottom: 4px;
  }
  .legend-item {
    display: flex; align-items: center; gap: 8px;
    font-size: 12px; color: var(--ink-soft);
  }
  .legend-dot {
    width: 10px; height: 10px; border-radius: 50%; flex-shrink: 0;
  }
  .graph-stats-panel {
    display: flex; flex-direction: column; gap: 8px; margin-top: 8px;
  }
  .graph-stat-item {
    padding: 10px 14px;
    border: 1px solid var(--rule);
    border-radius: 3px;
    background: var(--paper);
  }
  .graph-stat-value {
    font-family: 'Noto Serif SC', serif;
    font-size: 22px; font-weight: 400;
    color: var(--vermilion); line-height: 1;
    margin-bottom: 2px;
  }
  .graph-stat-label {
    font-family: 'JetBrains Mono', monospace;
    font-size: 12px; color: var(--ink-mute);
    letter-spacing: 0.08em; text-transform: uppercase;
  }

  /* =========================================== */
  /* ======= 项目中心嵌入式输入框 =============== */
  /* =========================================== */
  .hub-composer {
    background: #fff;
    border: 1px solid var(--rule);
    border-radius: 3px;
    box-shadow: 0 2px 8px rgba(15,28,46,0.06);
    margin-bottom: 32px;
    transition: border-color .2s, box-shadow .2s;
  }
  .hub-composer:focus-within {
    border-color: var(--vermilion);
    box-shadow: 0 2px 12px rgba(26,79,140,0.1), 0 0 0 3px rgba(26,79,140,0.07);
  }
  .hub-composer-context {
    padding: 10px 16px 8px;
    border-bottom: 1px solid var(--rule-soft);
    display: flex;
    align-items: center;
    gap: 10px;
  }
  .hub-composer-ctx-dot {
    width: 7px; height: 7px; border-radius: 50%; flex-shrink: 0;
  }
  .hub-composer-ctx-dot.life { background: var(--success); }
  .hub-composer-ctx-dot.matter { background: var(--gold); }
  .hub-composer-ctx-dot.earth { background: #3a6b8a; }
  .hub-composer-ctx-dot.autolab { background: #1d3d5c; }
  .hub-composer-ctx-dot.ai { background: var(--vermilion); }
  .hub-composer-ctx-label {
    font-family: 'JetBrains Mono', monospace;
    font-size: 12px; letter-spacing: 0.14em; text-transform: uppercase;
    color: var(--ink-mute);
  }
  .hub-composer-ctx-mode {
    margin-left: auto;
    font-family: 'JetBrains Mono', monospace;
    font-size: 12px; letter-spacing: 0.1em; text-transform: uppercase;
    padding: 2px 8px; border-radius: 2px; border: 1px solid var(--rule);
    color: var(--ink-soft); background: var(--paper-warm);
  }
  .hub-composer-body {
    padding: 16px 18px 12px;
  }
  .hub-composer-textarea {
    width: 100%;
    min-height: 64px;
    max-height: 180px;
    font-size: 14px;
    line-height: 1.65;
    color: var(--ink);
    resize: none;
    background: transparent;
    font-family: 'Inter', 'Noto Serif SC', sans-serif;
  }
  .hub-composer-textarea::placeholder { color: var(--ink-faint); font-style: normal; }
  .hub-composer-footer {
    display: flex;
    justify-content: space-between;
    align-items: center;
    margin-top: 10px;
  }
  .hub-composer-hint {
    font-family: 'JetBrains Mono', monospace;
    font-size: 12px; color: var(--ink-faint); letter-spacing: 0.06em;
  }
  .hub-send-btn {
    padding: 7px 16px;
    background: var(--vermilion);
    color: #fff;
    font-size: 13px;
    border-radius: 2px;
    display: inline-flex;
    align-items: center;
    gap: 7px;
    transition: background .15s;
    font-weight: 500;
  }
  .hub-send-btn:hover { background: #1a50b8; }
  .hub-send-btn svg { width: 12px; height: 12px; }

  /* =========================================== */
  /* ======= 首页独立会话区 ===================== */
  /* =========================================== */
  .quick-sessions-section { margin-top: 56px; }

  .qs-list { display: flex; flex-direction: column; gap: 8px; margin-top: 16px; }
  .qs-card {
    display: flex;
    align-items: center;
    gap: 14px;
    padding: 14px 18px;
    border: 1px solid var(--rule);
    border-radius: 4px;
    background: var(--paper);
    cursor: pointer;
    transition: all .18s;
  }
  .qs-card:hover {
    border-color: var(--ink-soft);
    background: var(--paper-warm);
    transform: translateX(2px);
  }
  .qs-card-icon {
    width: 30px; height: 30px;
    border-radius: 3px;
    background: var(--paper-warm);
    border: 1px solid var(--rule);
    display: flex; align-items: center; justify-content: center;
    flex-shrink: 0; color: var(--ink-mute);
  }
  .qs-card-icon svg { width: 14px; height: 14px; }
  .qs-card-title {
    font-family: 'Noto Serif SC', serif;
    font-size: 14px; font-weight: 600; color: var(--ink);
    min-width: 0; flex: 1;
    white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
    letter-spacing: 0.02em;
  }
  .qs-card-preview {
    font-size: 12px; color: var(--ink-mute);
    white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
    max-width: 340px; flex-shrink: 0;
  }
  .qs-card-meta {
    display: flex; gap: 10px; align-items: center; flex-shrink: 0;
    font-family: 'JetBrains Mono', monospace; font-size: 12px;
    color: var(--ink-faint); letter-spacing: 0.05em;
  }
  .qs-card-meta .badge {
    padding: 1.5px 6px; border-radius: 2px;
    font-size: 12px; letter-spacing: 0.1em; text-transform: uppercase;
  }
  .qs-card-meta .badge.collective { background: var(--vermilion-bg); color: var(--vermilion); border: 1px solid var(--vermilion-soft); }
  .qs-card-meta .badge.protein    { background: var(--success-bg); color: var(--success); border: 1px solid #b8ddb8; }
  .qs-card-meta .badge.drug       { background: #f4f0fa; color: #7a4faa; border: 1px solid #d8c8ee; }
  .qs-card-meta .badge.autolab    { background: #eef4fa; color: #1d3d5c; border: 1px solid #c0d8ee; }
  .qs-archive-hint {
    font-family: 'JetBrains Mono', monospace;
    font-size: 12px; color: var(--ink-faint); letter-spacing: 0.06em;
    padding: 10px 0 0;
  }

  /* =========================================== */
  /* ======= 首页 · 最近观点推送 ================ */
  /* =========================================== */

  /* ======= 首页内容 Tab =================== */
  .home-tabs {
    display: flex;
    justify-content: flex-start;
    align-items: flex-end;
    gap: 0;
    border-bottom: 1px solid var(--rule);
    margin-top: 52px;
    margin-bottom: 0;
  }
  .home-tab {
    padding: 0 4px 14px;
    margin-right: 32px;
    font-family: 'Noto Serif SC', serif;
    font-size: 18px;
    font-weight: 400;
    letter-spacing: -0.01em;
    color: var(--ink-faint);
    cursor: pointer;
    border: none;
    background: none;
    border-bottom: 2px solid transparent;
    margin-bottom: -1px;
    transition: color .2s, border-color .2s;
    display: inline-flex;
    align-items: center;
    gap: 8px;
    line-height: 1;
  }
  .home-tab svg {
    width: 15px; height: 15px;
    flex-shrink: 0;
    opacity: 0.45;
    transition: opacity .2s;
    margin-bottom: 1px;
  }
  .home-tab:hover { color: var(--ink-soft); }
  .home-tab:hover svg { opacity: 0.7; }
  .home-tab.active {
    color: var(--ink);
    border-bottom-color: var(--vermilion);
    font-style: normal;
    font-weight: 600;
  }
  .home-tab.active svg {
    opacity: 0.9;
    stroke: var(--vermilion);
  }
  .home-tab-count {
    font-family: 'JetBrains Mono', monospace;
    font-style: normal;
    font-size: 12px;
    color: var(--ink-faint);
    letter-spacing: 0.04em;
    margin-left: 2px;
    align-self: flex-start;
    margin-top: 4px;
  }
  .home-tab.active .home-tab-count {
    color: var(--ink-mute);
  }

  .home-tab-panel { display: none; padding-top: 28px; }
  .home-tab-panel.active { display: block; }

  .vp-feed-section { margin-top: 0; }

  .vp-feed-grid {
    display: grid;
    grid-template-columns: 1fr 1fr;
    gap: 14px;
    margin-top: 16px;
  }
  @media (max-width: 860px) {
    .vp-feed-grid { grid-template-columns: 1fr; }
  }

  .vp-card {
    border: 1px solid var(--rule);
    border-radius: 6px;
    padding: 20px 22px 16px;
    background: var(--paper);
    display: flex;
    flex-direction: column;
    gap: 10px;
    cursor: pointer;
    transition: border-color .18s, box-shadow .18s, transform .18s;
    position: relative;
    overflow: hidden;
  }
  .vp-card::before {
    content: '';
    position: absolute;
    top: 0; left: 0; right: 0;
    height: 3px;
    background: linear-gradient(90deg, var(--vermilion), var(--vermilion-soft));
    opacity: 0;
    transition: opacity .18s;
  }
  .vp-card:hover {
    border-color: var(--vermilion-soft);
    box-shadow: 0 4px 20px rgba(26,79,140,.08);
    transform: translateY(-2px);
  }
  .vp-card:hover::before { opacity: 1; }

  /* 卡片顶行：领域 + 热度 badge + 日期 */
  .vp-card-top {
    display: flex; align-items: center; gap: 8px;
    font-family: 'JetBrains Mono', monospace;
    font-size: 12px; letter-spacing: 0.1em; text-transform: uppercase;
  }
  .vp-field-badge {
    padding: 2px 7px; border-radius: 2px;
    font-size: 12px; letter-spacing: 0.1em;
    border: 1px solid;
  }
  .vp-field-badge.protein  { background: var(--success-bg); color: var(--success); border-color: #b8ddb8; }
  .vp-field-badge.drug     { background: #f4f0fa; color: #7a4faa; border-color: #d8c8ee; }
  .vp-field-badge.autolab  { background: #eef4fa; color: #1d3d5c; border-color: #c0d8ee; }
  .vp-field-badge.collective { background: var(--vermilion-bg); color: var(--vermilion); border-color: var(--vermilion-soft); }
  .vp-field-badge.earth    { background: #f0f4e8; color: #3d5a1a; border-color: #c4d898; }
  .vp-field-badge.materials{ background: #faf0e8; color: #7a4a1a; border-color: #e8c898; }
  .vp-field-badge.catalysis{ background: #f0f0fa; color: #2a2a8a; border-color: #b8b8e8; }
  .vp-field-badge.neuro    { background: #faf0f4; color: #8a1a4a; border-color: #e8b8c8; }

  .vp-heat-badge {
    display: inline-flex; align-items: center; gap: 4px;
    padding: 2px 7px; border-radius: 2px;
    font-size: 12px; letter-spacing: 0.08em;
    font-family: 'JetBrains Mono', monospace;
  }
  .vp-heat-badge.trending { background: #fff3e8; color: #c05a10; border: 1px solid #f4c898; }
  .vp-heat-badge.hot      { background: #fef0f0; color: #b02020; border: 1px solid #f4b8b8; }
  .vp-heat-badge.rising   { background: #f0f4ff; color: #2a4a9a; border: 1px solid #b8c8f4; }
  .vp-heat-badge.stable   { background: var(--paper-warm); color: var(--ink-mute); border: 1px solid var(--rule); }
  .vp-heat-badge-dot {
    width: 5px; height: 5px; border-radius: 50%;
    flex-shrink: 0;
  }
  .vp-heat-badge.trending .vp-heat-badge-dot { background: #c05a10; }
  .vp-heat-badge.hot      .vp-heat-badge-dot { background: #b02020; animation: vp-pulse 1.2s ease-in-out infinite; }
  .vp-heat-badge.rising   .vp-heat-badge-dot { background: #2a4a9a; }
  .vp-heat-badge.stable   .vp-heat-badge-dot { background: var(--ink-faint); }

  @keyframes vp-pulse {
    0%, 100% { opacity: 1; transform: scale(1); }
    50%       { opacity: .5; transform: scale(1.3); }
  }

  .vp-card-date {
    margin-left: auto;
    font-family: 'JetBrains Mono', monospace;
    font-size: 12px; color: var(--ink-faint); letter-spacing: 0.06em;
  }

  /* 观点标题 */
  .vp-card-title {
    font-family: 'Noto Serif SC', serif;
    font-size: 16px; font-weight: 500; line-height: 1.4;
    color: var(--ink);
  }

  /* 核心论点 */
  .vp-card-thesis {
    font-size: 13px; color: var(--ink-soft);
    line-height: 1.65;
    display: -webkit-box;
    -webkit-line-clamp: 3;
    -webkit-box-orient: vertical;
    overflow: hidden;
  }

  /* 推送理由 */
  .vp-push-reason {
    display: inline-flex; align-items: center; gap: 5px;
    padding: 3px 9px; border-radius: 20px;
    background: var(--accent-bg);
    border: 1px solid var(--vermilion-soft);
    font-size: 12px; color: var(--vermilion);
    align-self: flex-start;
  }
  .vp-push-reason svg { width: 10px; height: 10px; flex-shrink: 0; }

  /* 热度条 */
  .vp-heat-row {
    display: flex; align-items: center; gap: 10px;
    margin-top: 2px;
  }
  .vp-heat-label {
    font-family: 'JetBrains Mono', monospace;
    font-size: 12px; color: var(--ink-mute); letter-spacing: 0.08em;
    white-space: nowrap; flex-shrink: 0;
  }
  .vp-heat-bar-wrap {
    flex: 1; height: 4px; border-radius: 2px;
    background: var(--rule-soft); overflow: hidden;
  }
  .vp-heat-bar-fill {
    height: 100%; border-radius: 2px;
    background: linear-gradient(90deg, #4a70c0 0%, #1e5aa8 40%, #e87c30 75%, #c03838 100%);
    transition: width .6s cubic-bezier(.16,1,.3,1);
  }
  .vp-heat-score {
    font-family: 'JetBrains Mono', monospace;
    font-size: 12px; font-weight: 500;
    color: var(--ink-soft); width: 26px; text-align: right; flex-shrink: 0;
  }
  .vp-heat-delta {
    font-family: 'JetBrains Mono', monospace;
    font-size: 12px; flex-shrink: 0;
    letter-spacing: 0.04em;
  }
  .vp-heat-delta.up   { color: #b02020; }
  .vp-heat-delta.down { color: var(--ink-faint); }
  .vp-heat-delta.flat { color: var(--ink-faint); }

  /* 底部 footer：作者 + 来源 + 操作 */
  .vp-card-footer {
    display: flex; align-items: center; gap: 10px;
    border-top: 1px solid var(--rule-soft); padding-top: 12px;
    margin-top: 4px;
  }
  .vp-author-info { flex: 1; min-width: 0; }
  .vp-author-name {
    font-size: 12px; color: var(--ink-soft); font-weight: 500;
    white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
  }
  .vp-source {
    font-family: 'JetBrains Mono', monospace;
    font-size: 12px; color: var(--ink-faint); letter-spacing: 0.04em;
    white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
  }
  .vp-action-btn {
    display: inline-flex; align-items: center; gap: 5px;
    padding: 5px 12px; border-radius: 3px;
    background: var(--vermilion); color: #fff;
    font-family: 'JetBrains Mono', monospace;
    font-size: 12px; letter-spacing: 0.08em;
    flex-shrink: 0; transition: background .15s;
    text-transform: uppercase;
  }
  .vp-action-btn:hover { background: #0a6e6a; }
  .vp-action-btn svg { width: 9px; height: 9px; }

  .vp-refresh-hint {
    font-family: 'JetBrains Mono', monospace;
    font-size: 12px; color: var(--ink-faint); letter-spacing: 0.06em;
    padding: 12px 0 0; display: flex; align-items: center; gap: 8px;
  }
  .vp-refresh-btn {
    color: var(--vermilion); cursor: pointer; text-decoration: underline;
    font-size: 12px; font-family: 'JetBrains Mono', monospace;
    background: none; border: none; letter-spacing: 0.06em;
  }
  .vp-refresh-btn:hover { color: #0a6e6a; }

  /* =========================================== */
  /* ========= 探索图谱独立页面 ================= */
  /* =========================================== */

  #pageGraph { display: none; flex-direction: column; height: 100vh; overflow: hidden; }
  #pageGraph.active { display: flex; }

  /* Toolbar */
  .graph-page-bar {
    height: 48px; flex-shrink: 0; padding: 0 20px;
    border-bottom: 1px solid var(--rule);
    display: flex; justify-content: space-between; align-items: center;
    background: var(--paper); z-index: 10;
  }
  .graph-page-bar-left { display: flex; align-items: center; gap: 14px; }
  .graph-page-bar-right { display: flex; align-items: center; gap: 10px; }
  .graph-back-btn {
    display: flex; align-items: center; gap: 6px;
    font-family: 'JetBrains Mono', monospace; font-size: 12px; letter-spacing: 0.06em;
    color: var(--ink-mute); padding: 5px 11px;
    border: 1px solid var(--rule); border-radius: 3px; transition: all .15s;
  }
  .graph-back-btn:hover { border-color: var(--ink-soft); color: var(--ink); background: var(--paper-warm); }
  .graph-back-btn svg { width: 12px; height: 12px; }

  /* 项目会话 · 实验卡片（对话页顶部固定卡片槽） */
  .experiment-card-slot {
    display: none;
    flex-shrink: 0;
    padding: 12px 22px 0;
    background: var(--paper);
  }
  .experiment-card-slot.open {
    display: block;
  }
  .experiment-card-slot .message-experiment-card {
    max-width: 760px;
    margin: 0 auto 10px;
  }
  .message-experiment-card {
    max-width: 760px;
    margin: 0 auto 18px;
  }
  .chat-experiment-card {
    border: 1px solid var(--rule);
    border-radius: 6px;
    background: linear-gradient(180deg, var(--paper) 0%, var(--paper-warm) 100%);
    padding: 14px 16px;
    box-shadow: 0 2px 14px rgba(29, 61, 92, 0.07);
  }
  .chat-experiment-card-head {
    display: flex;
    align-items: flex-start;
    justify-content: space-between;
    gap: 12px;
    margin-bottom: 12px;
  }
  .chat-experiment-card-title {
    font-family: 'Cormorant Garamond', 'Noto Serif SC', serif;
    font-size: 16px;
    font-weight: 600;
    color: var(--ink);
  }
  .chat-experiment-card-sub {
    font-family: 'JetBrains Mono', monospace;
    font-size: 12px;
    letter-spacing: 0.06em;
    text-transform: uppercase;
    color: var(--ink-mute);
    margin-top: 2px;
  }
  .chat-experiment-card-status {
    flex-shrink: 0;
    padding: 4px 8px;
    border-radius: 999px;
    border: 1px solid var(--vermilion-soft);
    background: var(--vermilion-bg);
    color: var(--vermilion);
    font-family: 'JetBrains Mono', monospace;
    font-size: 12px;
    letter-spacing: 0.08em;
    text-transform: uppercase;
  }
  .chat-experiment-card-metrics {
    display: grid;
    grid-template-columns: 0.72fr 1fr 0.72fr;
    gap: 8px;
    margin-bottom: 12px;
  }
  .chat-experiment-card-metric {
    border: 1px solid var(--rule-soft);
    background: rgba(255,255,255,0.55);
    border-radius: 4px;
    padding: 9px 10px;
    min-width: 0;
  }
  .chat-experiment-card-metric .k {
    font-family: 'JetBrains Mono', monospace;
    font-size: 12px;
    letter-spacing: 0.08em;
    text-transform: uppercase;
    color: var(--ink-mute);
    margin-bottom: 4px;
  }
  .chat-experiment-card-metric .v {
    font-size: 13px;
    line-height: 1.35;
    color: var(--ink);
    overflow-wrap: anywhere;
  }
  .chat-experiment-progress {
    margin-bottom: 10px;
  }
  .chat-experiment-progress-row {
    display: flex;
    justify-content: space-between;
    gap: 12px;
    margin-bottom: 6px;
    font-family: 'JetBrains Mono', monospace;
    font-size: 12px;
    letter-spacing: 0.05em;
    text-transform: uppercase;
    color: var(--ink-mute);
  }
  .chat-experiment-progress-bar {
    height: 6px;
    border-radius: 999px;
    overflow: hidden;
    background: var(--rule-soft);
  }
  .chat-experiment-progress-fill {
    height: 100%;
    border-radius: inherit;
    background: linear-gradient(90deg, var(--vermilion), var(--success));
  }
  .chat-experiment-checklist {
    display: grid;
    grid-template-columns: repeat(2, minmax(0, 1fr));
    gap: 6px 10px;
    margin: 0 0 12px;
    padding: 0;
    list-style: none;
  }
  .chat-experiment-checklist li {
    display: flex;
    align-items: flex-start;
    gap: 6px;
    min-width: 0;
    font-size: 12px;
    line-height: 1.45;
    color: var(--ink-soft);
  }
  .chat-experiment-checklist .mark {
    flex: 0 0 14px;
    height: 14px;
    border-radius: 50%;
    border: 1px solid var(--rule);
    margin-top: 1px;
    color: transparent;
    font-size: 12px;
    line-height: 12px;
    text-align: center;
  }
  .chat-experiment-checklist li.done .mark {
    border-color: var(--success);
    background: var(--success-bg);
    color: var(--success);
  }
  .chat-experiment-card-actions {
    display: flex;
    flex-wrap: wrap;
    gap: 8px;
  }
  .chat-experiment-card-btn {
    font-family: 'JetBrains Mono', monospace;
    font-size: 12px;
    letter-spacing: 0.08em;
    text-transform: uppercase;
    padding: 6px 12px;
    border-radius: 3px;
    border: 1px solid var(--rule);
    background: var(--paper);
    color: var(--ink-soft);
    cursor: pointer;
    transition: all .15s ease;
  }
  .chat-experiment-card-btn:hover {
    border-color: var(--vermilion-soft);
    color: var(--vermilion);
    background: var(--vermilion-bg);
  }
  .chat-experiment-card-btn.primary {
    border-color: var(--vermilion-soft);
    background: var(--vermilion);
    color: var(--paper);
  }
  .chat-experiment-card-btn.primary:hover {
    background: var(--ink);
    border-color: var(--ink);
    color: var(--paper);
  }
  @media (max-width: 720px) {
    .chat-experiment-card-metrics,
    .chat-experiment-checklist {
      grid-template-columns: 1fr;
    }
    .chat-experiment-card-head {
      flex-direction: column;
      align-items: flex-start;
    }
  }
  .graph-page-breadcrumb {
    display: flex; align-items: center; gap: 8px; font-size: 13px; color: var(--ink-mute);
  }
  .graph-page-breadcrumb .bc-sep { color: var(--ink-faint); margin: 0 2px; }
  .graph-page-breadcrumb .bc-project { font-size: 13px; }
  .graph-page-breadcrumb .bc-current {
    font-family: 'JetBrains Mono', monospace; font-size: 12px; letter-spacing: 0.06em; color: var(--ink);
  }
  .graph-type-filters { display: flex; align-items: center; gap: 3px; }
  .gtf-btn {
    padding: 3px 9px; border-radius: 2px; border: 1px solid var(--rule);
    font-family: 'JetBrains Mono', monospace; font-size: 12px; letter-spacing: 0.07em;
    color: var(--ink-mute); background: var(--paper); transition: all .12s;
  }
  .gtf-btn:hover { border-color: var(--ink-soft); color: var(--ink); }
  .gtf-btn.active { border-color: var(--vermilion); color: var(--vermilion); background: var(--vermilion-bg); }
  .graph-zoom-btns { display: flex; gap: 2px; }
  .graph-zoom-btn {
    width: 28px; height: 28px; border: 1px solid var(--rule); border-radius: 3px;
    font-family: 'JetBrains Mono', monospace; font-size: 13px; color: var(--ink-mute);
    display: flex; align-items: center; justify-content: center; transition: all .12s;
  }
  .graph-zoom-btn:hover { border-color: var(--ink-soft); color: var(--ink); background: var(--paper-warm); }
  .graph-zoom-btn.fit-btn { width: 36px; font-size: 12px; letter-spacing: 0.1em; }

  /* Body: sidebar + canvas + detail */
  .graph-page-body { flex: 1; display: flex; min-height: 0; overflow: hidden; }

  /* Left sidebar */
  .graph-page-sidebar {
    width: 215px; flex-shrink: 0; border-right: 1px solid var(--rule);
    background: var(--paper); overflow-y: auto; display: flex; flex-direction: column;
  }
  .gps-section { padding: 14px 15px 12px; }
  .gps-graph-title {
    font-family: 'Noto Serif SC', serif;
    font-size: 14px; font-weight: 500; color: var(--ink); line-height: 1.35; margin-bottom: 3px;
  }
  .gps-graph-subtitle {
    font-family: 'JetBrains Mono', monospace; font-size: 12px; letter-spacing: 0.16em;
    text-transform: uppercase; color: var(--vermilion); margin-bottom: 8px;
  }
  .gps-graph-desc { font-size: 12px; color: var(--ink-soft); line-height: 1.6; }
  .gps-divider { height: 1px; background: var(--rule); }
  .gps-label {
    font-family: 'JetBrains Mono', monospace; font-size: 12px; letter-spacing: 0.18em;
    text-transform: uppercase; color: var(--ink-mute); margin-bottom: 9px;
  }
  .gps-stats-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 7px; }
  .gps-stat {
    padding: 8px 9px; border: 1px solid var(--rule); border-radius: 3px; background: var(--paper-warm);
  }
  .gps-stat-val {
    font-family: 'Noto Serif SC', serif; font-size: 22px; font-weight: 400;
    color: var(--vermilion); line-height: 1;
  }
  .gps-stat-label {
    font-family: 'JetBrains Mono', monospace; font-size: 12px; color: var(--ink-mute);
    letter-spacing: 0.06em; text-transform: uppercase; margin-top: 2px;
  }
  .gps-legend { display: flex; flex-direction: column; gap: 7px; }
  .gps-legend-item { display: flex; align-items: center; gap: 7px; font-size: 12px; color: var(--ink-soft); }
  .gps-legend-dot { width: 8px; height: 8px; border-radius: 50%; flex-shrink: 0; }
  .gps-search {
    width: 100%; padding: 6px 9px; border: 1px solid var(--rule); border-radius: 3px;
    font-size: 12px; color: var(--ink); background: var(--paper-warm);
    font-family: 'Inter', sans-serif; transition: border-color .15s;
  }
  .gps-search:focus { border-color: var(--vermilion); outline: none; background: var(--paper); }
  .gps-search-results { margin-top: 6px; display: flex; flex-direction: column; gap: 2px; }
  .gps-search-item {
    padding: 4px 7px; border-radius: 3px; font-size: 12px; color: var(--ink-soft);
    cursor: pointer; display: flex; align-items: center; gap: 6px; transition: background .1s;
  }
  .gps-search-item:hover { background: var(--paper-warm); }
  .gps-search-dot { width: 6px; height: 6px; border-radius: 50%; flex-shrink: 0; }

  /* Canvas */
  .graph-page-canvas {
    flex: 1; position: relative; overflow: hidden; background: var(--paper-cool);
    background-image: radial-gradient(circle, #ddd9ce 1px, transparent 1px);
    background-size: 22px 22px;
  }
  #graphSvg { width: 100%; height: 100%; display: block; cursor: grab; user-select: none; }
  #graphSvg.is-grabbing { cursor: grabbing; }
  .g-node { cursor: pointer; }
  .g-node.dimmed circle.node-circle { opacity: 0.15; }
  .g-node.dimmed text.node-label { opacity: 0.15; }
  .g-node.selected circle.node-circle { filter: drop-shadow(0 0 7px rgba(26,79,140,0.6)); }
  .g-edge.dimmed line { opacity: 0.05; }
  .graph-node-tooltip {
    position: absolute; pointer-events: none; z-index: 20; background: var(--ink); color: var(--paper);
    border-radius: 4px; padding: 8px 12px; min-width: 130px;
    box-shadow: 0 8px 24px -8px rgba(26,35,50,0.45); font-family: 'Inter', sans-serif;
    display: none;
  }
  .gnt-label { font-size: 13px; font-weight: 500; margin-bottom: 2px; }
  .gnt-type { font-family: 'JetBrains Mono', monospace; font-size: 12px; letter-spacing: 0.12em; opacity: 0.6; text-transform: uppercase; }
  .gnt-connections { font-family: 'JetBrains Mono', monospace; font-size: 12px; margin-top: 4px; opacity: 0.75; }

  /* Right detail panel */
  .graph-detail-panel {
    width: 275px; flex-shrink: 0; border-left: 1px solid var(--rule);
    background: var(--paper); display: flex; flex-direction: column; overflow: hidden;
  }
  .gdp-empty {
    flex: 1; display: flex; flex-direction: column;
    align-items: center; justify-content: center; gap: 8px; color: var(--ink-faint);
  }
  .gdp-empty-icon { font-size: 26px; opacity: 0.45; font-family: 'Noto Serif SC', serif; }
  .gdp-empty-text {
    font-family: 'JetBrains Mono', monospace; font-size: 12px; letter-spacing: 0.1em;
    text-align: center; line-height: 1.9; text-transform: uppercase;
  }
  .gdp-content { flex: 1; display: flex; flex-direction: column; overflow: hidden; }
  .gdp-header {
    padding: 14px 15px 12px; border-bottom: 1px solid var(--rule); background: var(--paper-warm);
    flex-shrink: 0; display: flex; justify-content: space-between; align-items: flex-start; gap: 8px;
  }
  .gdp-type-badge {
    display: inline-block; font-family: 'JetBrains Mono', monospace; font-size: 12px;
    letter-spacing: 0.16em; text-transform: uppercase; padding: 2px 7px; border-radius: 2px; margin-bottom: 5px;
  }
  .gdp-title {
    font-family: 'Noto Serif SC', serif;
    font-size: 19px; font-weight: 500; color: var(--ink); line-height: 1.2;
  }
  .gdp-fullname { font-size: 12px; color: var(--ink-mute); margin-top: 3px; line-height: 1.45; }
  .gdp-close-btn {
    width: 24px; height: 24px; border-radius: 3px; border: 1px solid var(--rule); flex-shrink: 0;
    display: flex; align-items: center; justify-content: center; color: var(--ink-mute); transition: all .12s;
  }
  .gdp-close-btn:hover { border-color: var(--ink-soft); color: var(--ink); }
  .gdp-body { flex: 1; overflow-y: auto; padding: 13px 15px; display: flex; flex-direction: column; gap: 13px; }
  .gdp-section-label {
    font-family: 'JetBrains Mono', monospace; font-size: 12px; letter-spacing: 0.16em;
    text-transform: uppercase; color: var(--ink-mute); margin-bottom: 7px;
    display: flex; align-items: center; gap: 6px;
  }
  .gdp-section-label .cnt {
    background: var(--paper-warm); border: 1px solid var(--rule);
    border-radius: 8px; padding: 0 5px; font-size: 12px; color: var(--ink-mute);
  }
  .gdp-desc-text { font-size: 12px; color: var(--ink-soft); line-height: 1.68; }
  .gdp-evidence-list { display: flex; flex-direction: column; gap: 4px; }
  .gdp-evidence-item {
    padding: 4px 8px; font-family: 'JetBrains Mono', monospace; font-size: 12px; color: var(--ink-soft);
    border: 1px solid var(--rule); border-radius: 2px; background: var(--paper-warm);
  }
  .gdp-no-evidence {
    font-family: 'JetBrains Mono', monospace; font-size: 12px; color: var(--ink-faint); font-style: italic;
  }
  .gdp-connected-nodes { display: flex; flex-direction: column; gap: 4px; }
  .gdp-connected-item {
    display: flex; align-items: center; gap: 7px; padding: 5px 8px;
    border: 1px solid var(--rule); border-radius: 3px; cursor: pointer; transition: all .12s;
    font-size: 12px; color: var(--ink-soft);
  }
  .gdp-connected-item:hover { border-color: var(--vermilion); background: var(--vermilion-bg); color: var(--ink); }
  .gdp-connected-dot { width: 7px; height: 7px; border-radius: 50%; flex-shrink: 0; }
  .gdp-connected-name { flex: 1; font-size: 12px; min-width: 0; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
  .gdp-connected-rel { font-family: 'JetBrains Mono', monospace; font-size: 12px; color: var(--ink-faint); flex-shrink: 0; }

  /* Log section */
  .graph-log-section {
    height: 220px; flex-shrink: 0; border-top: 1px solid var(--rule);
    background: var(--paper); display: flex; flex-direction: column; overflow: hidden;
    transition: height .22s ease;
  }
  .graph-log-section.log-collapsed { height: 40px; }
  .graph-log-toolbar {
    height: 40px; flex-shrink: 0; padding: 0 16px;
    display: flex; align-items: center; gap: 12px;
    border-bottom: 1px solid var(--rule-soft); background: var(--paper-warm);
  }
  .graph-log-title-wrap {
    display: flex; align-items: center; gap: 7px; flex-shrink: 0;
    font-family: 'JetBrains Mono', monospace; font-size: 12px; letter-spacing: 0.12em;
    text-transform: uppercase; color: var(--ink-mute);
  }
  .graph-log-title-wrap svg { width: 12px; height: 12px; }
  .graph-log-filters { display: flex; gap: 3px; }
  .glf-btn {
    padding: 2px 8px; border-radius: 2px; border: 1px solid var(--rule);
    font-family: 'JetBrains Mono', monospace; font-size: 12px; letter-spacing: 0.07em;
    color: var(--ink-mute); background: var(--paper); transition: all .12s;
  }
  .glf-btn:hover { border-color: var(--ink-soft); color: var(--ink); }
  .glf-btn.active { border-color: var(--vermilion); color: var(--vermilion); background: var(--vermilion-bg); }
  .graph-log-collapse-btn {
    margin-left: auto; width: 24px; height: 24px; border-radius: 3px; border: 1px solid var(--rule);
    display: flex; align-items: center; justify-content: center; color: var(--ink-mute); flex-shrink: 0; transition: all .12s;
  }
  .graph-log-collapse-btn:hover { border-color: var(--ink-soft); color: var(--ink); }
  .graph-log-body {
    flex: 1; overflow-y: auto; padding: 5px 14px 8px; display: flex; flex-direction: column; gap: 1px;
  }
  .graph-log-entry {
    display: flex; align-items: flex-start; gap: 10px;
    padding: 4px 7px; border-radius: 3px; cursor: pointer; transition: background .1s;
  }
  .graph-log-entry:hover { background: var(--paper-warm); }
  .gle-time {
    font-family: 'JetBrains Mono', monospace; font-size: 12px; color: var(--ink-faint);
    flex-shrink: 0; padding-top: 2px; width: 52px;
  }
  .gle-icon {
    width: 17px; height: 17px; border-radius: 50%; display: flex; align-items: center; justify-content: center;
    font-size: 12px; flex-shrink: 0; margin-top: 2px; font-family: 'JetBrains Mono', monospace; font-weight: bold;
  }
  .gle-icon.query    { background: #eef4fa; color: #3a6b8a; }
  .gle-icon.action   { background: var(--rule-soft); color: var(--ink-mute); }
  .gle-icon.node_add { background: var(--vermilion-bg); color: var(--vermilion); }
  .gle-icon.edge_add { background: var(--success-bg); color: var(--success); }
  .gle-icon.insight  { background: #f4f0fa; color: #7a4faa; }
  .gle-content { flex: 1; min-width: 0; }
  .gle-text { font-size: 12px; color: var(--ink-soft); line-height: 1.5; }
  .gle-detail {
    display: none; margin-top: 5px; padding: 6px 9px; background: var(--paper-warm);
    border-radius: 3px; font-family: 'JetBrains Mono', monospace; font-size: 12px;
    color: var(--ink-mute); letter-spacing: 0.03em; line-height: 1.75;
    border: 1px solid var(--rule); word-break: break-all;
  }
  .graph-log-entry.log-expanded .gle-detail { display: block; }

  /* ============ Logo 导航触发按钮 ============ */
  .logo-area {
    display: flex;
    align-items: center;
    gap: 6px;
  }

  .logo-nav-btn {
    display: flex;
    align-items: center;
    justify-content: center;
    width: 26px;
    height: 26px;
    border-radius: 4px;
    color: var(--ink-faint);
    cursor: pointer;
    transition: all .15s;
    flex-shrink: 0;
    position: relative;
  }
  .logo-nav-btn:hover { background: var(--paper-warm); color: var(--ink-soft); }
  .logo-nav-btn.flyout-active { background: var(--paper-warm); color: var(--ink-soft); }
  .logo-nav-btn.drawer-open { background: var(--vermilion-bg); color: var(--vermilion); }

  /* ============ Hover 浮窗（轻量快速预览） ============ */
  .nav-flyout {
    position: fixed;
    top: 58px;
    left: 16px;
    width: 316px;
    background: #fff;
    border: 1px solid var(--rule);
    border-radius: 4px;
    box-shadow: 0 4px 6px -2px rgba(15,28,46,0.08), 0 20px 48px -8px rgba(15,28,46,0.18);
    z-index: 500;
    opacity: 0;
    transform: translateY(-8px) scale(0.98);
    pointer-events: none;
    transition: opacity .18s cubic-bezier(.4,0,.2,1), transform .18s cubic-bezier(.4,0,.2,1);
    display: flex;
    flex-direction: column;
    max-height: calc(100vh - 80px);
  }
  .nav-flyout.visible { opacity: 1; transform: translateY(0) scale(1); pointer-events: auto; }
  /* 抽屉打开时隐藏悬浮窗 */
  .nav-flyout.drawer-is-open { opacity: 0 !important; pointer-events: none !important; }

  /* ============ 侧边抽屉 ============ */
  .nav-drawer-backdrop {
    position: fixed;
    inset: 0;
    background: rgba(10,20,40,0.4);
    z-index: 600;
    opacity: 0;
    pointer-events: none;
    transition: opacity .24s;
    backdrop-filter: blur(3px);
    -webkit-backdrop-filter: blur(3px);
  }
  .nav-drawer-backdrop.open { opacity: 1; pointer-events: auto; }

  .nav-drawer {
    position: fixed;
    top: 0;
    left: 0;
    width: 340px;
    height: 100vh;
    background: #fff;
    border-right: 1px solid var(--rule);
    box-shadow: 8px 0 40px -8px rgba(10,20,46,0.22);
    z-index: 700;
    display: flex;
    flex-direction: column;
    transform: translateX(-100%);
    transition: transform .26s cubic-bezier(.4,0,.2,1);
  }
  .nav-drawer.open { transform: translateX(0); }

  .nav-drawer-head {
    height: 56px;
    padding: 0 16px;
    display: flex;
    align-items: center;
    justify-content: space-between;
    background: var(--paper);
    border-bottom: 1px solid var(--rule);
    flex-shrink: 0;
  }
  .nav-drawer-logo {
    display: flex;
    align-items: center;
    gap: 10px;
    cursor: pointer;
    user-select: none;
  }
  .nav-drawer-logo-mark {
    font-family: 'Noto Serif SC', serif;
    font-style: normal;
    font-size: 18px;
    font-weight: 500;
    color: var(--ink);
    letter-spacing: 2px;
  }
  .nav-drawer-logo-mark em { color: var(--vermilion); font-style: normal; font-weight: 500; }
  .nav-drawer-logo-tag {
    font-family: 'JetBrains Mono', monospace;
    font-size: 12px;
    color: var(--ink-mute);
    letter-spacing: 0.18em;
    text-transform: uppercase;
  }
  .nav-drawer-close {
    width: 28px;
    height: 28px;
    border-radius: 5px;
    display: flex;
    align-items: center;
    justify-content: center;
    color: var(--ink-mute);
    cursor: pointer;
    transition: all .12s;
    flex-shrink: 0;
  }
  .nav-drawer-close:hover { background: var(--paper-warm); color: var(--ink); }

  .nav-drawer-ctas {
    padding: 14px 16px 12px;
    display: flex;
    gap: 8px;
    border-bottom: 1px solid var(--rule-soft);
    flex-shrink: 0;
  }
  .nav-drawer-cta {
    flex: 1;
    display: flex;
    align-items: center;
    justify-content: center;
    gap: 7px;
    padding: 9px 12px;
    border-radius: 6px;
    font-size: 13px;
    font-weight: 500;
    cursor: pointer;
    transition: all .14s;
    border: none;
    font-family: 'Inter', sans-serif;
  }
  .nav-drawer-cta.primary { background: var(--ink); color: var(--paper); }
  .nav-drawer-cta.primary:hover { background: var(--vermilion); }
  .nav-drawer-cta.secondary { background: var(--paper-warm); color: var(--ink-soft); border: 1px solid var(--rule); }
  .nav-drawer-cta.secondary:hover { border-color: var(--ink-soft); color: var(--ink); }

  .nav-drawer-body {
    overflow-y: auto;
    flex: 1;
    padding: 4px 0 16px;
  }
  .nav-drawer-body::-webkit-scrollbar { width: 4px; }
  .nav-drawer-body::-webkit-scrollbar-track { background: transparent; }
  .nav-drawer-body::-webkit-scrollbar-thumb { background: var(--rule); border-radius: 2px; }

  /* ---- 共用子组件（flyout & drawer 共用） ---- */
  .nav-flyout-body {
    overflow-y: auto;
    flex: 1;
    padding: 6px 0 8px;
  }
  .nav-flyout-body::-webkit-scrollbar { width: 4px; }
  .nav-flyout-body::-webkit-scrollbar-track { background: transparent; }
  .nav-flyout-body::-webkit-scrollbar-thumb { background: var(--rule); border-radius: 2px; }

  .nav-flyout-header {
    padding: 14px 14px 12px;
    border-bottom: 1px solid var(--rule-soft);
    flex-shrink: 0;
  }
  .nav-flyout-new {
    width: 100%;
    display: flex;
    align-items: center;
    gap: 8px;
    padding: 10px 14px;
    background: var(--ink);
    color: var(--paper);
    border-radius: 6px;
    font-size: 13px;
    font-weight: 500;
    cursor: pointer;
    transition: background .15s;
    border: none;
    font-family: 'Inter', sans-serif;
  }
  .nav-flyout-new:hover { background: var(--vermilion); }
  .nav-flyout-new svg { flex-shrink: 0; opacity: 0.85; }

  /* ---- 导航菜单（与 home.html 侧边栏 .nav / .nav-item 一模一样）---- */
  .nav-menu {
    width: 100%;
    display: flex;
    flex-direction: column;
    gap: 2px;
  }
  .nav-menu-item {
    display: flex;
    align-items: center;
    gap: 10px;
    padding: 9px 12px;
    border-radius: 8px;
    color: var(--ink-soft);
    cursor: pointer;
    font-size: 13.5px;
    transition: background .15s, color .15s;
    user-select: none;
  }
  .nav-menu-item:hover { background: rgba(0,0,0,.035); color: var(--ink); }
  .nav-menu-item.active {
    background: #fff;
    color: var(--vermilion);
    box-shadow: 0 1px 2px rgba(22,97,171,.06), 0 0 0 1px rgba(22,97,171,.10);
    font-weight: 500;
  }
  .nav-menu-item svg { width: 16px; height: 16px; flex-shrink: 0; }
  .nav-menu-item span { white-space: nowrap; overflow: hidden; }

  .nav-sec-label {
    font-family: 'JetBrains Mono', monospace;
    font-size: 12px;
    letter-spacing: 0.22em;
    text-transform: uppercase;
    color: var(--ink-faint);
    padding: 10px 16px 5px;
    display: flex;
    align-items: center;
    gap: 8px;
  }
  .nav-sec-label::after {
    content: '';
    flex: 1;
    height: 1px;
    background: var(--rule-soft);
  }

  .nav-project-row {
    display: flex;
    align-items: center;
    gap: 10px;
    padding: 8px 14px;
    cursor: pointer;
    transition: background .1s;
  }
  .nav-project-row:hover { background: var(--paper-warm); }

  /* 新建项目行 */
  .nav-new-project-row {
    display: flex;
    align-items: center;
    gap: 10px;
    padding: 8px 14px;
    cursor: pointer;
    transition: background .1s;
    margin: 4px 10px 2px;
    border: 1.5px dashed var(--rule);
    border-radius: 6px;
  }
  .nav-new-project-row:hover {
    background: var(--vermilion-bg);
    border-color: var(--vermilion-soft);
  }
  .nav-new-project-row:hover .nav-new-project-label { color: var(--vermilion); }
  .nav-new-project-icon {
    width: 22px;
    height: 22px;
    border-radius: 4px;
    background: var(--paper-warm);
    display: flex;
    align-items: center;
    justify-content: center;
    flex-shrink: 0;
    color: var(--ink-mute);
    transition: all .1s;
  }
  .nav-new-project-row:hover .nav-new-project-icon {
    background: var(--vermilion-bg);
    color: var(--vermilion);
  }
  .nav-new-project-label {
    font-size: 13px;
    color: var(--ink-mute);
    transition: color .1s;
  }

  .nav-dot {
    width: 7px;
    height: 7px;
    border-radius: 50%;
    flex-shrink: 0;
  }
  .nav-dot.life    { background: var(--vermilion); }
  .nav-dot.matter  { background: var(--gold); }
  .nav-dot.earth   { background: var(--success); }
  .nav-dot.autolab { background: #7c6af7; }

  .nav-project-info { flex: 1; min-width: 0; }
  .nav-project-name {
    font-size: 13px;
    color: var(--ink);
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
    line-height: 1.35;
  }
  .nav-project-meta {
    font-family: 'JetBrains Mono', monospace;
    font-size: 12px;
    color: var(--ink-faint);
    margin-top: 1px;
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
  }
  .nav-chevron {
    color: var(--ink-faint);
    flex-shrink: 0;
    transition: color .12s, transform .12s;
  }
  .nav-project-row:hover .nav-chevron { color: var(--vermilion); transform: translateX(2px); }

  .nav-session-row {
    display: flex;
    align-items: flex-start;
    gap: 9px;
    padding: 7px 14px;
    cursor: pointer;
    transition: background .1s;
  }
  .nav-session-row:hover { background: var(--paper-warm); }

  .nav-session-icon {
    width: 22px;
    height: 22px;
    border-radius: 4px;
    background: var(--paper-warm);
    border: 1px solid var(--rule-soft);
    display: flex;
    align-items: center;
    justify-content: center;
    flex-shrink: 0;
    margin-top: 1px;
    color: var(--ink-mute);
  }
  .nav-session-info { flex: 1; min-width: 0; }
  .nav-session-title {
    font-size: 13px;
    color: var(--ink);
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
    line-height: 1.35;
  }
  .nav-session-meta {
    font-family: 'JetBrains Mono', monospace;
    font-size: 12px;
    color: var(--ink-faint);
    margin-top: 2px;
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
  }

  .nav-see-all {
    display: flex;
    align-items: center;
    gap: 5px;
    padding: 6px 14px 2px;
    font-family: 'JetBrains Mono', monospace;
    font-size: 12px;
    color: var(--vermilion);
    cursor: pointer;
    letter-spacing: 0.05em;
    transition: opacity .12s;
  }
  .nav-see-all:hover { opacity: 0.7; }

  /* ── Artifact fullscreen expand button ── */
  .sa-card-expand {
    width: 22px; height: 22px;
    border-radius: 4px;
    background: var(--paper-cool);
    border: 1px solid var(--rule);
    color: var(--ink-mute);
    display: inline-flex; align-items: center; justify-content: center;
    cursor: pointer;
    transition: background .15s, color .15s, border-color .15s;
    flex-shrink: 0;
    margin-left: 8px;
    padding: 0;
  }
  .sa-card-expand:hover {
    background: var(--vermilion-bg);
    color: var(--vermilion);
    border-color: var(--vermilion-soft);
  }
  .sa-card-head-right { display: flex; align-items: center; gap: 0; }

  /* ── Artifact fullscreen modal ── */
  /* ── Artifact Drawer ── */
  #artifactFsModal {
    display: none;
    position: fixed; inset: 0; z-index: 300;
    background: rgba(16,24,36,0.35);
    backdrop-filter: blur(2px);
  }
  #artifactFsModal.open { display: block; }
  @keyframes drawerSlideIn {
    from { transform: translateX(100%); opacity: 0.6; }
    to   { transform: translateX(0);    opacity: 1; }
  }
  @keyframes drawerSlideOut {
    from { transform: translateX(0); }
    to   { transform: translateX(100%); }
  }
  #artifactFsInner {
    position: absolute;
    top: 0; right: 0; bottom: 0;
    width: min(820px, 80vw);
    min-width: 360px;
    background: var(--paper);
    border-left: 1px solid var(--rule);
    box-shadow: -12px 0 48px rgba(0,0,0,0.14);
    overflow: hidden;
    display: flex; flex-direction: column;
    animation: drawerSlideIn .24s cubic-bezier(.32,.72,0,1);
  }
  #artifactFsResizeHandle {
    position: absolute;
    top: 0; left: 0; bottom: 0;
    width: 6px;
    cursor: ew-resize;
    z-index: 10;
    background: transparent;
    transition: background .15s;
    flex-shrink: 0;
  }
  #artifactFsResizeHandle:hover,
  #artifactFsResizeHandle.dragging {
    background: var(--vermilion-soft);
    opacity: 0.5;
  }
  #artifactFsHead {
    padding: 14px 20px;
    background: var(--paper-warm);
    border-bottom: 1px solid var(--rule);
    display: flex; justify-content: space-between; align-items: center;
    flex-shrink: 0;
  }
  #artifactFsHeadLeft { display: flex; align-items: center; gap: 12px; }
  #artifactFsStage {
    font-family: 'JetBrains Mono', monospace;
    font-size: 12px; color: var(--vermilion);
    letter-spacing: .15em; text-transform: uppercase;
  }
  #artifactFsTitle {
    font-family: 'Noto Serif SC', serif;
    font-size: 16px; font-weight: 500; color: var(--ink);
  }
  .artifact-fs-close {
    width: 28px; height: 28px; border-radius: 6px;
    background: var(--paper-cool); border: 1px solid var(--rule);
    color: var(--ink-mute); font-size: 14px;
    display: flex; align-items: center; justify-content: center;
    cursor: pointer; transition: background .15s, color .15s;
    flex-shrink: 0;
  }
  .artifact-fs-close:hover { background: var(--vermilion-bg); color: var(--vermilion); }
  #artifactFsBody {
    overflow-y: auto; padding: 20px 24px;
    font-size: 13px; line-height: 1.7; color: var(--ink-soft);
    flex: 1;
  }


  /* ============================================================
     智能会议室 — 会议管理（列表 / 新建 / 详情）
  ============================================================ */

  /* ── 会议管理头 ── */
  .meeting-mgmt-header {
    display: flex; align-items: center; justify-content: space-between;
    padding: 22px 0 16px;
    margin-bottom: 20px;
  }
  .meeting-mgmt-title {
    font-family: 'Noto Serif SC', serif;
    font-size: 22px; font-weight: 500; color: var(--ink);
    letter-spacing: -0.01em;
  }
  .meeting-mgmt-title-sub {
    font-family: 'JetBrains Mono', monospace;
    font-size: 12px; letter-spacing: .18em; text-transform: uppercase;
    color: var(--ink-faint); margin-top: 3px;
  }
  .btn-meeting-primary {
    display: inline-flex; align-items: center; gap: 7px;
    padding: 8px 18px; border-radius: 2px; font-size: 13px; font-weight: 500;
    background: var(--vermilion); color: #fff; border: 1px solid var(--vermilion);
    cursor: pointer; font-family: inherit; transition: background .15s;
    letter-spacing: .02em;
  }
  .btn-meeting-primary:hover { background: #1a50b8; border-color: #1a50b8; }
  .btn-meeting-ghost {
    display: inline-flex; align-items: center; gap: 6px;
    padding: 6px 14px; border-radius: 2px; font-size: 12px;
    background: var(--paper); color: var(--ink-mute); border: 1px solid var(--rule);
    cursor: pointer; font-family: inherit; transition: all .15s;
  }
  .btn-meeting-ghost:hover { color: var(--ink); border-color: var(--ink-soft); background: var(--paper-warm); }

  /* ── 统计行（横向条目，非网格卡片）── */
  .meeting-stats-row {
    display: flex; align-items: stretch; gap: 0;
    border: 1px solid var(--rule); border-radius: 3px;
    overflow: hidden; margin-bottom: 20px;
    background: #fff;
  }
  .meeting-stat-card {
    flex: 1; padding: 14px 18px; position: relative;
    border-right: 1px solid var(--rule-soft);
    display: flex; flex-direction: column; gap: 4px;
  }
  .meeting-stat-card:last-child { border-right: none; }
  .meeting-stat-card::before {
    content: ''; position: absolute; top: 0; left: 0; right: 0;
    height: 2px; background: var(--rule-soft);
    transition: background .2s;
  }
  .meeting-stat-card:first-child::before { background: var(--vermilion); }
  .meeting-stat-val {
    font-family: 'Inter', sans-serif;
    font-size: 26px; font-weight: 700; color: var(--ink);
    line-height: 1; letter-spacing: -0.01em;
  }
  .meeting-stat-lbl {
    font-family: 'JetBrains Mono', monospace;
    font-size: 12px; letter-spacing: .14em; text-transform: uppercase;
    color: var(--ink-faint);
  }

  /* ── 过滤栏 ── */
  .meeting-filter-bar {
    display: flex; align-items: center; gap: 10px;
    margin-bottom: 18px; flex-wrap: wrap;
  }
  .meeting-search-wrap {
    flex: 1; min-width: 180px;
    display: flex; align-items: center; gap: 8px;
    border: none; border-bottom: 1px solid var(--rule);
    background: transparent; padding: 6px 2px;
  }
  .meeting-search-wrap input {
    border: none; outline: none; background: none;
    font-size: 13px; color: var(--ink); flex: 1; font-family: inherit;
  }
  .meeting-search-wrap input::placeholder { color: var(--ink-faint); }
  .meeting-search-wrap svg { color: var(--ink-faint); flex-shrink: 0; }
  .meeting-filter-tabs { display: flex; gap: 2px; }
  .meeting-filter-tab {
    padding: 4px 12px; border-radius: 2px; font-size: 12px;
    border: 1px solid transparent; background: transparent;
    color: var(--ink-faint); cursor: pointer; font-family: inherit; transition: all .15s;
  }
  .meeting-filter-tab.active {
    background: var(--vermilion-bg); color: var(--vermilion);
    border-color: var(--vermilion-soft); font-weight: 500;
  }
  .meeting-filter-tab:hover:not(.active) { color: var(--ink-soft); background: var(--paper-cool); }

  /* ── 会议卡片网格 ── */
  .meeting-card-grid {
    display: grid; grid-template-columns: repeat(auto-fill,minmax(290px,1fr)); gap: 1px;
    background: var(--rule); border: 1px solid var(--rule); border-radius: 3px;
    overflow: hidden;
  }
  .meeting-card {
    background: #fff; padding: 18px 20px; cursor: pointer;
    transition: background .16s; animation: card-in .24s ease both;
    position: relative;
  }
  .meeting-card::before {
    content: ''; position: absolute; left: 0; top: 12px; bottom: 12px;
    width: 2px; background: transparent; transition: background .18s;
    border-radius: 0 1px 1px 0;
  }
  .meeting-card:hover { background: var(--paper-warm); }
  .meeting-card:hover::before { background: var(--vermilion); }
  @keyframes card-in { from { opacity:0; transform:translateY(6px); } to { opacity:1; transform:none; } }
  .meeting-card-top { display: flex; align-items: flex-start; justify-content: space-between; margin-bottom: 6px; }
  .meeting-card-title {
    font-family: 'Noto Serif SC', serif;
    font-size: 14px; font-weight: 600; color: var(--ink);
    line-height: 1.35; flex: 1; margin-right: 10px; letter-spacing: 0.02em;
  }
  .meeting-card-badge {
    font-size: 12px; padding: 2px 8px; border-radius: 10px; flex-shrink: 0;
    font-family: 'JetBrains Mono', monospace; letter-spacing: .06em;
    background: var(--teal-wash); color: var(--teal); border: 1px solid transparent;
  }
  .meeting-card-badge.recent {
    background: var(--vermilion-bg); color: var(--vermilion);
    border-color: rgba(26,79,140,.15);
  }
  .meeting-card-meta {
    font-family: 'JetBrains Mono', monospace;
    font-size: 12px; color: var(--ink-faint); letter-spacing: .04em;
    margin-bottom: 10px; display: flex; gap: 10px; flex-wrap: wrap;
  }
  .meeting-card-divider {
    height: 1px; background: var(--rule-soft); margin-bottom: 10px;
  }
  .meeting-card-summary {
    font-size: 13px; color: var(--ink-soft); line-height: 1.65;
    display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; overflow: hidden;
    font-family: 'Noto Serif SC', serif;
  }
  .meeting-card-footer { display: flex; gap: 5px; margin-top: 12px; flex-wrap: wrap; }
  .meeting-card-tag {
    font-size: 12px; padding: 2px 9px; border-radius: 10px;
    background: transparent; color: var(--ink-mute); border: 1px solid var(--rule-soft);
    font-family: 'JetBrains Mono', monospace; letter-spacing: .04em;
  }

  /* ── 会议详情视图头 ── */
  .meeting-detail-hdr {
    display: flex; align-items: center; gap: 10px;
    padding: 16px 0 14px; border-bottom: 1px solid var(--rule); margin-bottom: 20px;
  }
  .meeting-detail-title {
    font-family: 'Noto Serif SC', serif;
    font-size: 20px; font-weight: 600; color: var(--ink); flex: 1;
    letter-spacing: 0.02em; line-height: 1.3;
  }
  .meeting-detail-section { margin-bottom: 22px; }
  .meeting-detail-section-title {
    font-family: 'JetBrains Mono', monospace;
    font-size: 12px; letter-spacing: .2em; text-transform: uppercase;
    color: var(--ink-faint); margin-bottom: 10px;
  }
  .meeting-detail-insight-card {
    display: flex; gap: 12px; padding: 12px 14px; border-radius: 6px;
    background: var(--paper-warm); border: 1px solid var(--rule-soft);
    margin-bottom: 8px; border-left: 3px solid var(--vermilion);
  }
  .meeting-detail-insight-text { font-size: 13px; color: var(--ink-soft); line-height: 1.6; }

  /* ============================================================
     全屏会议模式 Overlay
  ============================================================ */
  .fs-meeting-overlay {
    position: fixed; inset: 0; z-index: 999;
    background: var(--paper);
    display: flex; flex-direction: column;
    opacity: 0; pointer-events: none;
    transform: translateY(20px);
    transition: opacity .32s cubic-bezier(.4,0,.2,1), transform .32s cubic-bezier(.4,0,.2,1);
  }
  .fs-meeting-overlay.open {
    opacity: 1; pointer-events: all; transform: translateY(0);
  }

  /* ── 顶部导航条 ── */
  .fs-topbar {
    height: 58px; flex-shrink: 0;
    display: flex; align-items: center; justify-content: space-between;
    padding: 0 24px;
    border-bottom: 1px solid var(--rule);
    background: var(--paper);
    gap: 20px;
    position: relative; z-index: 2;
  }
  .fs-topbar-left  { display: flex; align-items: center; gap: 14px; flex-shrink: 0; }
  .fs-topbar-center { flex: 1; display: flex; justify-content: center; align-items: center; }
  .fs-topbar-right  { display: flex; align-items: center; gap: 8px; flex-shrink: 0; }

  /* 返回按钮 */
  .fs-topbar-back {
    display: inline-flex; align-items: center; gap: 7px;
    padding: 6px 14px; border-radius: 4px; font-size: 13px; font-weight: 500;
    color: var(--ink-soft); background: var(--paper-warm);
    border: 1px solid var(--rule); cursor: pointer;
    transition: all .15s; font-family: inherit; white-space: nowrap;
  }
  .fs-topbar-back:hover { color: var(--ink); border-color: var(--ink-soft); background: var(--paper); box-shadow: 0 1px 6px -2px rgba(26,35,50,.12); }

  /* 项目 + 标题元信息 */
  .fs-topbar-meta { display: flex; flex-direction: column; gap: 3px; }
  .fs-topbar-meta-proj { display: flex; align-items: center; gap: 7px; }
  .fs-proj-label { font-family: 'JetBrains Mono',monospace; font-size: 12px; letter-spacing:.22em; text-transform:uppercase; color:var(--ink-faint); }
  .fs-proj-name  { font-family: 'JetBrains Mono',monospace; font-size: 12px; letter-spacing:.1em; text-transform:uppercase; color:var(--vermilion); font-weight:500; }
  .fs-topbar-meta-title { display: flex; align-items: center; gap: 9px; }

  /* 计时器块 */
  .fs-timer-block {
    display: flex; align-items: center; gap: 8px;
    padding: 5px 16px; border-radius: 4px;
    background: var(--paper-warm); border: 1px solid var(--rule);
  }

  .fs-sep { width: 1px; height: 28px; background: var(--rule); }

  .fs-rec-dot { width: 8px; height: 8px; border-radius: 50%; background: var(--ink-faint); flex-shrink: 0; transition: all .3s; }
  .fs-rec-dot.live {
    background: #e74c3c;
    box-shadow: 0 0 0 4px rgba(231,76,60,.18);
    animation: pulse-dot 1.4s ease-in-out infinite;
  }
  @keyframes pulse-dot {
    0%,100% { box-shadow:0 0 0 3px rgba(231,76,60,.18); }
    50%      { box-shadow:0 0 0 7px rgba(231,76,60,.06); }
  }
  .fs-meeting-title-input {
    font-family: 'Noto Serif SC', serif;
    font-size: 16px; font-weight: 400; color: var(--ink);
    background: none; border: none; outline: none; width: 340px; text-align: left;
  }
  .fs-meeting-title-input::placeholder { color: var(--ink-faint); }
  .fs-timer { font-family: 'JetBrains Mono',monospace; font-size: 13px; letter-spacing:.12em; color:var(--ink-faint); transition:color .3s; }
  .fs-timer.live { color: #e74c3c; }

  /* topbar 按钮 */
  .fs-btn { display: inline-flex; align-items: center; gap: 7px; padding: 7px 15px; border-radius: 4px; font-size: 13px; transition: all .15s; border: 1px solid; font-family: inherit; cursor: pointer; }
  .fs-btn-ghost { color:var(--ink-mute); border-color:var(--rule); background:var(--paper); }
  .fs-btn-ghost:hover { color:var(--ink); border-color:var(--ink-soft); background:var(--paper-warm); }
  .fs-btn-record-start { background:var(--vermilion); color:#fff; border-color:var(--vermilion); }
  .fs-btn-record-start:hover { opacity:.88; }
  .fs-btn-record-stop { background:#fff3f2; color:#c0392b; border-color:#f5c6c3; }
  .fs-btn-record-stop:hover { background:#ffe8e6; }
  .fs-btn-end { background:var(--paper-warm); color:var(--ink-mute); border-color:var(--rule); }
  .fs-btn-end:hover { background:#fff3f2; color:#c0392b; border-color:#f5c6c3; }

  /* ── 主体两列布局 ── */
  .fs-body { flex:1; min-height:0; display:grid; grid-template-columns:1fr 320px; overflow:hidden; }

  /* ── 左：声波 + 转录 ── */
  .fs-left { display:flex; flex-direction:column; border-right:1px solid var(--rule); overflow:hidden; }

  /* 声波区（深色保留） */
  .fs-wave-zone {
    flex-shrink: 0; height: 200px; position: relative;
    background: linear-gradient(180deg, #0b1220 0%, #060c18 100%);
    display: flex; align-items: center; justify-content: center;
    border-bottom: 1px solid rgba(255,255,255,.05); overflow: hidden;
  }
  .fs-wave-bg { position:absolute; inset:0; background:radial-gradient(ellipse 70% 80% at 50% 50%,rgba(26,79,140,.12) 0%,transparent 70%); pointer-events:none; }
  #fsMeetingWaveCanvas { position:absolute; inset:0; width:100%; height:100%; }
  .fs-wave-center { position:relative; z-index:2; text-align:center; pointer-events:none; }
  .fs-wave-status { font-family:'JetBrains Mono',monospace; font-size:12px; letter-spacing:.24em; text-transform:uppercase; color:rgba(255,255,255,.3); margin-bottom:6px; }
  .fs-wave-speaker { font-family:'Noto Serif SC',serif; font-size:22px; font-weight:400; color:rgba(255,255,255,.7); min-height:30px; transition:all .3s; }
  .fs-speakers-row { position:absolute; bottom:14px; left:0; right:0; display:flex; justify-content:center; gap:14px; z-index:3; }
  .fs-speaker-chip { display:inline-flex; align-items:center; gap:6px; padding:4px 12px; border-radius:20px; font-size:12px; color:rgba(255,255,255,.45); border:1px solid rgba(255,255,255,.09); background:rgba(255,255,255,.05); transition:all .25s; }
  .fs-speaker-chip.active { color:#fff; border-color:rgba(255,255,255,.28); background:rgba(255,255,255,.12); box-shadow:0 0 12px rgba(26,79,140,.25); }
  .fs-speaker-chip .fsc-dot { width:6px; height:6px; border-radius:50%; flex-shrink:0; }

  /* 转录区（浅色） */
  .fs-transcript-zone { flex:1; min-height:0; display:flex; flex-direction:column; overflow:hidden; background:var(--paper); }
  .fs-transcript-header { padding:10px 18px; border-bottom:1px solid var(--rule); background:var(--paper-cool); display:flex; align-items:center; justify-content:space-between; flex-shrink:0; }
  .fs-transcript-label { font-family:'JetBrains Mono',monospace; font-size:12px; letter-spacing:.2em; text-transform:uppercase; color:var(--ink-mute); display:flex; align-items:center; gap:8px; }
  .fs-live-badge { font-size:12px; padding:2px 7px; border-radius:10px; background:var(--vermilion); color:#fff; opacity:0; transition:opacity .3s; }
  .fs-live-badge.show { opacity:1; }
  .fs-clear-btn { font-size:12px; color:var(--ink-faint); background:none; border:none; cursor:pointer; padding:2px 6px; border-radius:3px; font-family:inherit; }
  .fs-clear-btn:hover { color:var(--ink-soft); background:var(--paper-warm); }
  .fs-transcript-body { flex:1; overflow-y:auto; padding:14px 18px; display:flex; flex-direction:column; gap:12px; scroll-behavior:smooth; }
  .fs-transcript-body::-webkit-scrollbar { width:4px; }
  .fs-transcript-body::-webkit-scrollbar-track { background:transparent; }
  .fs-transcript-body::-webkit-scrollbar-thumb { background:var(--rule); border-radius:2px; }
  .fs-transcript-empty { text-align:center; padding:40px 20px; color:var(--ink-faint); display:flex; flex-direction:column; align-items:center; gap:12px; }
  .fs-transcript-empty p { font-size:13px; line-height:1.7; }
  .fs-tline { display:flex; gap:10px; animation:slide-up .22s ease both; }
  @keyframes slide-up { from { opacity:0; transform:translateY(8px); } to { opacity:1; transform:none; } }
  .fs-tline-avatar { width:26px; height:26px; border-radius:50%; flex-shrink:0; display:flex; align-items:center; justify-content:center; font-size:12px; font-weight:600; color:#fff; margin-top:2px; }
  .fs-tline-body { flex:1; }
  .fs-tline-meta { display:flex; align-items:center; gap:8px; margin-bottom:3px; }
  .fs-tline-name { font-size:12px; font-weight:600; color:var(--ink-mute); }
  .fs-tline-time { font-family:'JetBrains Mono',monospace; font-size:12px; color:var(--ink-faint); }
  .fs-tline-text { font-size:13px; color:var(--ink); line-height:1.65; }
  .fs-typing-dots span { display:inline-block; width:4px; height:4px; border-radius:50%; background:var(--ink-faint); margin:0 1px; animation:typing-dot 1.2s infinite; }
  .fs-typing-dots span:nth-child(2) { animation-delay:.2s; }
  .fs-typing-dots span:nth-child(3) { animation-delay:.4s; }
  @keyframes typing-dot { 0%,60%,100%{transform:translateY(0);opacity:.4} 30%{transform:translateY(-4px);opacity:1} }

  /* ── 右：双面板 ── */
  .fs-right { display:flex; flex-direction:column; background:var(--paper-cool); overflow:hidden; }
  .fs-right-section { display:flex; flex-direction:column; flex:1; min-height:0; border-top:1px solid var(--rule); }
  .fs-right-section:first-child { border-top:none; }
  .fs-right-section-hdr {
    display:flex; align-items:center; justify-content:space-between;
    padding:10px 16px; border-bottom:1px solid var(--rule);
    background:var(--paper); flex-shrink:0;
  }
  .fs-right-section-hdr-left { display:flex; align-items:center; gap:8px; }
  .fs-right-section-title { font-family:'JetBrains Mono',monospace; font-size:12px; letter-spacing:.2em; text-transform:uppercase; color:var(--ink-mute); }
  .fs-right-section-badge { font-size:12px; padding:2px 7px; border-radius:10px; background:var(--paper-cool); color:var(--ink-faint); border:1px solid var(--rule-soft); transition:all .3s; }
  .fs-right-section-badge.live { background:var(--teal-wash); color:var(--teal); border-color:transparent; }
  .fs-right-section-count { font-family:'JetBrains Mono',monospace; font-size:12px; color:var(--ink-faint); font-weight:600; }
  .fs-right-section-body { flex:1; overflow-y:auto; padding:10px 12px; display:flex; flex-direction:column; gap:8px; }
  .fs-right-section-body::-webkit-scrollbar { width:3px; }
  .fs-right-section-body::-webkit-scrollbar-thumb { background:var(--rule); border-radius:2px; }
  .fs-section-empty { text-align:center; padding:28px 14px; color:var(--ink-faint); display:flex; flex-direction:column; align-items:center; gap:8px; }
  .fs-section-empty p { font-size:12px; line-height:1.7; }

  /* 洞察卡 */
  .fs-insight-card { padding:11px 13px; border-radius:6px; background:var(--paper); border:1px solid var(--rule-soft); border-left:3px solid var(--vermilion); animation:slide-up .22s ease both; }
  .fs-insight-card.decision { border-left-color: var(--vermilion); }
  .fs-insight-card.action   { border-left-color: var(--teal); }
  .fs-insight-card.data     { border-left-color: #7c6fe0; }
  .fs-insight-card.topic    { border-left-color: #e07030; }
  .fs-ic-top { display:flex; align-items:center; gap:8px; margin-bottom:6px; }
  .fs-ic-badge { font-size:12px; padding:2px 8px; border-radius:10px; font-weight:500; background:var(--paper-cool); color:var(--ink-faint); }
  .fs-ic-badge.decision { background:#fff3f2; color:var(--vermilion); }
  .fs-ic-badge.action   { background:var(--teal-wash); color:var(--teal); }
  .fs-ic-badge.data     { background:#f0eeff; color:#6c5ce7; }
  .fs-ic-badge.topic    { background:#fff8f0; color:#e07030; }
  .fs-ic-text { font-size:13px; color:var(--ink-soft); line-height:1.6; }

  /* 推荐卡 */
  .fs-rec-card { padding:11px 13px; border-radius:6px; background:var(--paper); border:1px solid var(--rule-soft); cursor:pointer; transition:all .15s; animation:slide-up .22s ease both; }
  .fs-rec-card:hover { border-color:var(--ink-soft); box-shadow:0 2px 10px -4px rgba(26,35,50,.1); }
  .fs-rec-top2 { display:flex; align-items:flex-start; justify-content:space-between; gap:8px; margin-bottom:5px; }
  .fs-rec-title2 { font-size:13px; font-weight:500; color:var(--ink); line-height:1.4; flex:1; }
  .fs-rec-badge { font-size:12px; padding:2px 7px; border-radius:10px; flex-shrink:0; background:var(--paper-cool); color:var(--ink-faint); border:1px solid var(--rule-soft); }
  .fs-rec-badge.paper   { background:#f0eeff; color:#6c5ce7; border-color:transparent; }
  .fs-rec-badge.hot     { background:#fff8f0; color:#e07030; border-color:transparent; }
  .fs-rec-badge.prev    { background:var(--teal-wash); color:var(--teal); border-color:transparent; }
  .fs-rec-badge.progress { background:#fff3f2; color:var(--vermilion); border-color:transparent; }
  .fs-rec-meta2 { font-size:12px; color:var(--ink-faint); margin-bottom:5px; }
  .fs-rec-reason2 { font-size:12px; color:var(--ink-faint); display:flex; align-items:flex-start; gap:5px; line-height:1.5; }
  .fs-rec-reason2 svg { width:11px; height:11px; flex-shrink:0; margin-top:2px; color:var(--teal); }

  /* ── 底部状态条 ── */
  .fs-statusbar { height:36px; flex-shrink:0; display:flex; align-items:center; justify-content:space-between; padding:0 20px; border-top:1px solid var(--rule); background:var(--paper-cool); }
  .fs-statusbar-left { display:flex; align-items:center; gap:16px; }
  .fs-statusbar-item { display:flex; align-items:center; gap:5px; font-family:'JetBrains Mono',monospace; font-size:12px; color:var(--ink-faint); }
  .fs-statusbar-item svg { width:11px; height:11px; }

  /* 摘要弹层内容样式（生成时注入） */
  .fs-summary-section-title {
    font-family:'JetBrains Mono',monospace; font-size:12px; letter-spacing:.2em;
    text-transform:uppercase; color:var(--ink-faint); margin-bottom:9px;
  }
  .fs-summary-item { display:flex; gap:10px; margin-bottom:6px; font-size:13px; color:var(--ink-soft); line-height:1.65; align-items:flex-start; }
  .fs-summary-dot { width:6px; height:6px; border-radius:50%; flex-shrink:0; margin-top:6px; }

  /* fs-bump 数字跳动动画 */
  @keyframes bump { 0%{transform:scale(1)} 40%{transform:scale(1.4)} 100%{transform:scale(1)} }
  .bumping { animation: bump .28s ease; }

*/

  /* ============================================================
     会议详情增强视图 — Tabs + AI报告 + 洞见 + 推荐 + 录音
  ============================================================ */

  /* ── 详情顶部操作条 ── */
  .mdetail-actions { display:flex; align-items:center; gap:8px; }

  /* ── 详情 Tabs ── */
  .mdetail-tabs {
    display:flex; gap:0; border-bottom:1px solid var(--rule);
    margin-bottom:22px; overflow-x:auto;
  }
  .mdetail-tabs::-webkit-scrollbar { display:none; }
  .mdetail-tab {
    padding:10px 20px; font-size:13px; color:var(--ink-mute); cursor:pointer;
    background:none; border:none; border-bottom:2px solid transparent;
    margin-bottom:-1px; font-family:inherit; white-space:nowrap;
    transition:color .15s, border-color .15s; display:flex; align-items:center; gap:6px;
  }
  .mdetail-tab:hover { color:var(--ink); }
  .mdetail-tab.active { color:var(--vermilion); border-bottom-color:var(--vermilion); font-weight:500; }
  .mdetail-tab svg { opacity:.7; }
  .mdetail-tab.active svg { opacity:1; }

  /* ── 通用 section 标题 ── */
  .md-section { margin-bottom:24px; }
  .md-section-title {
    font-family:'JetBrains Mono',monospace;
    font-size:12px; letter-spacing:.2em; text-transform:uppercase;
    color:var(--ink-faint); margin-bottom:13px;
    display:flex; align-items:center; gap:10px;
  }
  .md-section-title::after { content:''; flex:1; height:1px; background:var(--rule-soft); }

  /* ── AI 报告 — 指标卡 ── */
  .md-report-metrics { display:grid; grid-template-columns:repeat(4,1fr); gap:10px; margin-bottom:22px; }
  .md-metric-card {
    background:var(--paper-warm); border:1px solid var(--rule-soft);
    border-radius:7px; padding:15px 16px; text-align:center; position:relative; overflow:hidden;
  }
  .md-metric-card::before {
    content:''; position:absolute; inset:0; opacity:.06;
    background:linear-gradient(135deg,var(--vermilion) 0%,transparent 60%);
  }
  .md-metric-icon { font-size:20px; margin-bottom:6px; opacity:.8; }
  .md-metric-val { font-size:22px; font-weight:700; color:var(--ink); margin-bottom:3px; line-height:1; }
  .md-metric-lbl { font-size:12px; color:var(--ink-faint); }
  .md-metric-sub { font-size:12px; color:var(--vermilion); margin-top:4px; font-weight:500; }

  /* ── AI 报告 — 核心要点列表 ── */
  .md-keypoints-list { display:flex; flex-direction:column; gap:10px; }
  .md-keypoint-item {
    display:flex; align-items:flex-start; gap:13px;
    padding:13px 15px; border-radius:7px;
    background:var(--paper); border:1px solid var(--rule-soft);
    transition:border-color .15s, box-shadow .15s;
  }
  .md-keypoint-item:hover { border-color:var(--ink-soft); box-shadow:0 2px 10px -4px rgba(26,35,50,.08); }
  .md-kp-num {
    width:24px; height:24px; border-radius:50%; flex-shrink:0;
    background:var(--vermilion); color:#fff; font-size:12px; font-weight:700;
    display:flex; align-items:center; justify-content:center; margin-top:1px;
  }
  .md-kp-body { flex:1; }
  .md-kp-text { font-size:13px; color:var(--ink); line-height:1.65; margin-bottom:5px; }
  .md-kp-tags { display:flex; gap:5px; flex-wrap:wrap; }
  .md-kp-tag {
    font-size:12px; padding:2px 8px; border-radius:10px;
    background:var(--vermilion-bg); color:var(--vermilion);
    border:1px solid rgba(26,79,140,.18);
  }
  .md-kp-tag.blue { background:#f0eeff; color:#6c5ce7; border-color:rgba(108,92,231,.18); }
  .md-kp-tag.orange { background:#fff8f0; color:#e07030; border-color:rgba(224,112,48,.18); }

  /* ── AI 报告 — 发言人分布 ── */
  .md-speakers-grid { display:grid; grid-template-columns:repeat(4,1fr); gap:10px; }
  .md-speaker-card {
    padding:13px 12px; border-radius:7px;
    background:var(--paper-warm); border:1px solid var(--rule-soft); text-align:center;
  }
  .md-speaker-avatar {
    width:38px; height:38px; border-radius:50%; margin:0 auto 9px;
    display:flex; align-items:center; justify-content:center;
    font-size:14px; font-weight:700; color:#fff;
  }
  .md-speaker-name { font-size:12px; font-weight:600; color:var(--ink); margin-bottom:2px; }
  .md-speaker-role { font-size:12px; color:var(--ink-faint); margin-bottom:8px; }
  .md-speaker-bar { height:5px; background:var(--rule-soft); border-radius:3px; overflow:hidden; margin-bottom:5px; }
  .md-speaker-bar-fill { height:100%; border-radius:3px; }
  .md-speaker-pct { font-family:'JetBrains Mono',monospace; font-size:12px; color:var(--ink-mute); }

  /* ── AI 报告 — 进度/数据条 ── */
  .md-progress-list { display:flex; flex-direction:column; gap:12px; }
  .md-progress-row { }
  .md-progress-header { display:flex; justify-content:space-between; align-items:center; font-size:13px; margin-bottom:6px; }
  .md-progress-label { color:var(--ink-soft); }
  .md-progress-value { font-family:'JetBrains Mono',monospace; font-size:12px; color:var(--ink-mute); }
  .md-progress-track { height:7px; background:var(--rule-soft); border-radius:4px; overflow:hidden; }
  .md-progress-fill { height:100%; border-radius:4px; transition:width .7s cubic-bezier(.4,0,.2,1); }

  /* ── AI 报告 — 词云 ── */
  .md-keyword-cloud {
    display:flex; flex-wrap:wrap; gap:8px 10px; padding:16px;
    background:var(--paper-cool); border:1px solid var(--rule-soft); border-radius:7px;
  }
  .md-kw {
    padding:4px 12px; border-radius:12px; font-size:12px;
    cursor:default; transition:transform .15s, box-shadow .15s; line-height:1.4;
  }
  .md-kw:hover { transform:scale(1.08); box-shadow:0 2px 8px -3px rgba(26,35,50,.12); }
  .md-kw.sz3 { font-size:16px; font-weight:700; padding:5px 14px; }
  .md-kw.sz2 { font-size:14px; font-weight:600; padding:5px 13px; }
  .md-kw.sz1 { font-size:12px; }

  /* ── 关键洞见 — 简约版 ── */
  .md-insight-grid { display:flex; flex-direction:column; gap:0; border:1px solid var(--rule-soft); border-radius:8px; overflow:hidden; }
  .md-insight-card {
    padding:16px 20px;
    background:var(--paper);
    border-bottom:1px solid var(--rule-soft);
    position:relative;
    animation:card-in .2s ease both;
    transition:background .15s;
  }
  .md-insight-card:last-child { border-bottom:none; }
  .md-insight-card:hover { background:var(--paper-warm); }

  /* 顶部细色条取代左边框 */
  .md-insight-card::before {
    content:''; position:absolute; top:0; left:20px; right:20px; height:1px;
  }
  .md-insight-card:first-child::before { display:none; }
  .md-insight-card.decision { }
  .md-insight-card.action   { }
  .md-insight-card.data     { }
  .md-insight-card.topic    { }

  /* 类型标签行 */
  .md-insight-label-row {
    display:flex; align-items:center; justify-content:space-between;
    margin-bottom:7px;
  }
  .md-insight-type-label {
    font-family:'JetBrains Mono',monospace;
    font-size:12px; letter-spacing:.2em; text-transform:uppercase; font-weight:500;
  }
  .md-insight-type-label.decision { color:var(--vermilion); }
  .md-insight-type-label.action   { color:#1e5aa8; }
  .md-insight-type-label.data     { color:#7c6fe0; }
  .md-insight-type-label.topic    { color:#e07030; }
  .md-insight-meta-right {
    display:flex; align-items:center; gap:10px;
    font-family:'JetBrains Mono',monospace; font-size:12px; color:var(--ink-faint);
  }

  /* 主文本 */
  .md-insight-body {
    font-family:'Noto Serif SC',serif;
    font-size:13px; color:var(--ink); line-height:1.72;
  }

  /* ── 智能推荐 — 简约版 ── */
  .md-rec-list { display:flex; flex-direction:column; gap:0; border:1px solid var(--rule-soft); border-radius:8px; overflow:hidden; }
  .md-rec-card {
    padding:17px 20px;
    background:var(--paper);
    border-bottom:1px solid var(--rule-soft);
    cursor:pointer;
    transition:background .15s;
    animation:card-in .2s ease both;
    position:relative;
  }
  .md-rec-card:last-child { border-bottom:none; }
  .md-rec-card:hover { background:var(--paper-warm); }
  .md-rec-card:hover .md-rec-arrow { opacity:1; transform:translateX(0); }

  /* 顶行：类型标签 + 箭头 */
  .md-rec-type-row {
    display:flex; align-items:center; justify-content:space-between;
    margin-bottom:7px;
  }
  .md-rec-type-tag {
    font-family:'JetBrains Mono',monospace;
    font-size:12px; letter-spacing:.2em; text-transform:uppercase; font-weight:500;
  }
  .md-rec-type-tag.paper    { color:#7c6fe0; }
  .md-rec-type-tag.hot      { color:#e07030; }
  .md-rec-type-tag.prev     { color:#1e5aa8; }
  .md-rec-type-tag.progress { color:var(--vermilion); }
  .md-rec-arrow {
    opacity:0; transform:translateX(-4px);
    transition:opacity .15s, transform .15s; color:var(--ink-faint);
    display:flex; align-items:center;
  }

  /* 标题 */
  .md-rec-headline {
    font-family:'Noto Serif SC',serif;
    font-size:14px; font-weight:500; color:var(--ink);
    line-height:1.4; margin-bottom:6px; letter-spacing:-0.01em;
  }

  /* 来源元信息 */
  .md-rec-source {
    font-family:'JetBrains Mono',monospace;
    font-size:12px; letter-spacing:.04em; color:var(--ink-faint);
    margin-bottom:9px;
  }

  /* 推荐理由 — 纯文本，无嵌套框 */
  .md-rec-rationale {
    font-size:13px; color:var(--ink-mute); line-height:1.6;
    padding-top:9px; border-top:1px solid var(--rule-soft);
  }

  /* 历史关联链接 */
  .md-prev-meeting-link {
    display:inline-flex; align-items:center; gap:6px;
    margin-top:8px; font-size:12px; color:var(--vermilion);
    cursor:pointer; transition:opacity .15s;
    text-decoration:none;
  }
  .md-prev-meeting-link:hover { opacity:.75; }
  .md-prev-meeting-link svg { width:11px; height:11px; flex-shrink:0; }

  /* ── 原始录音 Tab ── */
  .md-audio-player {
    background:linear-gradient(135deg,#0b1220 0%,#0a1830 100%);
    border-radius:9px; padding:22px; margin-bottom:18px;
    border:1px solid rgba(255,255,255,.06); position:relative; overflow:hidden;
  }
  .md-audio-player::before {
    content:''; position:absolute; top:-40px; right:-40px;
    width:120px; height:120px; border-radius:50%;
    background:radial-gradient(circle,rgba(26,79,140,.2) 0%,transparent 70%);
    pointer-events:none;
  }
  .md-audio-title { font-size:14px; font-weight:500; color:rgba(255,255,255,.85); margin-bottom:3px; }
  .md-audio-meta { font-size:12px; color:rgba(255,255,255,.35); margin-bottom:18px; font-family:'JetBrains Mono',monospace; }
  .md-audio-waveform {
    height:52px; border-radius:5px; margin-bottom:16px;
    background:rgba(255,255,255,.03); display:flex; align-items:center;
    padding:0 10px; gap:2px; overflow:hidden;
  }
  .md-audio-bar {
    flex-shrink:0; border-radius:2px;
    background:linear-gradient(180deg,rgba(26,79,140,.8) 0%,rgba(26,79,140,.25) 100%);
  }
  .md-audio-bar.played { background:linear-gradient(180deg,rgba(26,79,140,1) 0%,rgba(26,79,140,.5) 100%); }
  .md-audio-controls { display:flex; align-items:center; gap:14px; }
  .md-audio-play {
    width:38px; height:38px; border-radius:50%;
    background:var(--vermilion); color:#fff; border:none; cursor:pointer;
    display:flex; align-items:center; justify-content:center; flex-shrink:0;
    transition:all .15s; position:relative; z-index:1;
  }
  .md-audio-play:hover { opacity:.88; transform:scale(1.06); }
  .md-audio-timeline { flex:1; display:flex; flex-direction:column; gap:6px; }
  .md-audio-progress-track {
    height:4px; background:rgba(255,255,255,.1); border-radius:2px; cursor:pointer; overflow:hidden;
  }
  .md-audio-progress-fill { height:100%; border-radius:2px; background:var(--vermilion); width:58%; }
  .md-audio-time { display:flex; justify-content:space-between; font-family:'JetBrains Mono',monospace; font-size:12px; color:rgba(255,255,255,.3); }
  .md-audio-extras { display:flex; align-items:center; gap:8px; }
  .md-audio-speed {
    padding:4px 11px; border-radius:10px; font-size:12px; font-family:'JetBrains Mono',monospace;
    background:rgba(255,255,255,.08); color:rgba(255,255,255,.45);
    border:1px solid rgba(255,255,255,.1); cursor:pointer;
  }
  .md-audio-btn-ghost {
    padding:5px 12px; border-radius:10px; font-size:12px; font-family:inherit;
    background:rgba(255,255,255,.06); color:rgba(255,255,255,.4);
    border:1px solid rgba(255,255,255,.1); cursor:pointer; display:flex; align-items:center; gap:5px;
  }

  /* ── AI 会议报告卡 ── */
  .md-report-card {
    border: 1px solid var(--rule-soft);
    border-radius: 10px;
    overflow: hidden;
    margin-bottom: 0;
  }

  /* 报告顶部 header（暖纸调） */
  .md-report-header {
    background: var(--paper-warm);
    padding: 22px 26px 18px;
    position: relative;
    overflow: hidden;
    border-bottom: 1px solid var(--rule-soft);
  }
  .md-report-header::before {
    content: '';
    position: absolute; top: 0; left: 0; right: 0;
    height: 3px;
    background: linear-gradient(90deg, var(--vermilion) 0%, var(--vermilion-soft) 60%, transparent 100%);
  }
  .md-report-header::after {
    content: '';
    position: absolute; top: 22px; right: 24px;
    width: 80px; height: 80px;
    background: radial-gradient(circle, rgba(26,79,140,.06) 0%, transparent 70%);
    pointer-events: none;
  }
  .md-report-ai-badge {
    display: inline-flex; align-items: center; gap: 6px;
    padding: 3px 10px; border-radius: 12px;
    background: var(--vermilion-bg);
    border: 1px solid rgba(26,79,140,.2);
    font-family: 'JetBrains Mono', monospace;
    font-size: 12px; letter-spacing: .18em; text-transform: uppercase;
    color: var(--vermilion); margin-bottom: 12px;
  }
  .md-report-ai-badge::before {
    content: ''; width: 5px; height: 5px; border-radius: 50%;
    background: var(--vermilion);
    box-shadow: 0 0 5px rgba(26,79,140,.5);
    animation: pulse-dot 1.8s ease-in-out infinite;
  }
  .md-report-title {
    font-family: 'Noto Serif SC', serif;
    font-size: 21px; font-weight: 500; color: var(--ink);
    line-height: 1.35; margin-bottom: 12px; letter-spacing: -0.01em;
  }
  .md-report-meta-row {
    display: flex; align-items: center; gap: 16px; flex-wrap: wrap;
  }
  .md-report-meta-item {
    display: flex; align-items: center; gap: 5px;
    font-family: 'JetBrains Mono', monospace;
    font-size: 12px; letter-spacing: .06em;
    color: var(--ink-faint);
  }
  .md-report-meta-item svg { opacity: .6; }

  /* 报告正文区域 */
  .md-report-body {
    background: var(--paper);
    padding: 22px 26px;
  }

  /* 执行摘要段落 */
  .md-report-exec-label {
    font-family: 'JetBrains Mono', monospace;
    font-size: 12px; letter-spacing: .22em; text-transform: uppercase;
    color: var(--vermilion); margin-bottom: 10px;
    display: flex; align-items: center; gap: 8px;
  }
  .md-report-exec-label::after {
    content: ''; flex: 1; height: 1px; background: var(--vermilion-bg);
  }
  .md-report-exec-text {
    font-size: 14px; color: var(--ink); line-height: 1.85;
    margin-bottom: 20px;
    font-family: 'Noto Serif SC', serif;
  }

  /* 快速统计条 */
  .md-report-stats {
    display: flex; align-items: stretch;
    gap: 0; background: var(--rule-soft);
    border-radius: 7px; overflow: hidden;
    border: 1px solid var(--rule-soft);
    margin-bottom: 22px;
  }
  .md-report-stat {
    flex: 1; background: var(--paper-cool);
    padding: 14px 18px; text-align: center;
    border-right: 1px solid var(--rule-soft);
    position: relative;
  }
  .md-report-stat:last-child { border-right: none; }
  .md-report-stat-val {
    font-family: 'Noto Serif SC', serif;
    font-size: 28px; font-weight: 500; line-height: 1;
    margin-bottom: 5px; letter-spacing: -0.02em;
  }
  .md-report-stat-lbl {
    font-family: 'JetBrains Mono', monospace;
    font-size: 12px; letter-spacing: .14em; text-transform: uppercase;
    color: var(--ink-faint);
  }

  /* 关键结论块 */
  .md-report-conclusions {
    display: flex; flex-direction: column; gap: 8px;
  }
  .md-report-conclusion {
    display: flex; align-items: flex-start; gap: 11px;
    padding: 11px 14px; border-radius: 6px;
    background: var(--paper-warm); border: 1px solid var(--rule-soft);
  }
  .md-report-conclusion-dot {
    width: 7px; height: 7px; border-radius: 50%; flex-shrink: 0; margin-top: 5px;
  }
  .md-report-conclusion-text {
    font-size: 13px; color: var(--ink-soft); line-height: 1.65;
  }

  /* 报告底部签名条 */
  .md-report-footer {
    padding: 11px 26px;
    background: var(--paper-warm);
    border-top: 1px solid var(--rule-soft);
    display: flex; align-items: center; justify-content: space-between;
  }
  .md-report-footer-left {
    display: flex; align-items: center; gap: 8px;
    font-family: 'JetBrains Mono', monospace;
    font-size: 12px; color: var(--ink-faint); letter-spacing: .06em;
  }
  .md-report-footer-right {
    display: flex; gap: 6px;
  }
  .md-report-footer-btn {
    display: inline-flex; align-items: center; gap: 5px;
    padding: 4px 11px; border-radius: 4px; font-size: 12px;
    font-family: inherit; cursor: pointer; transition: all .15s;
    border: 1px solid var(--rule); background: var(--paper); color: var(--ink-mute);
  }
  .md-report-footer-btn:hover { color: var(--ink); border-color: var(--ink-soft); }
  .md-report-footer-btn.primary {
    background: var(--vermilion); color: #fff; border-color: var(--vermilion);
  }
  .md-report-footer-btn.primary:hover { opacity: .88; }

  /* ── 行动跟进行 ── */
  .md-action-row {
    display:flex; align-items:flex-start; gap:14px;
    padding:13px 16px; border-radius:7px;
    background:var(--paper); border:1px solid var(--rule-soft);
    border-left:3px solid #1e5aa8; transition:box-shadow .15s;
  }
  .md-action-row:hover { box-shadow:0 2px 10px -4px rgba(26,35,50,.09); }
  .md-action-owner {
    display:flex; flex-direction:column; align-items:center; gap:5px;
    flex-shrink:0; width:48px;
  }
  .md-action-avatar {
    width:34px; height:34px; border-radius:50%;
    display:flex; align-items:center; justify-content:center;
    font-size:13px; font-weight:700; color:#fff; flex-shrink:0;
  }
  .md-action-name { font-size:12px; color:var(--ink-mute); text-align:center; line-height:1.3; white-space:nowrap; }
  .md-action-body { flex:1; }
  .md-action-text { font-size:13px; color:var(--ink); line-height:1.65; }
  .md-action-time { font-family:'JetBrains Mono',monospace; font-size:12px; color:var(--ink-faint); margin-top:5px; }

  /* ── 转录文本 ── */
  .md-transcript-header {
    display:flex; align-items:center; justify-content:space-between;
    margin-bottom:10px;
  }
  .md-transcript-search {
    display:flex; align-items:center; gap:7px; padding:5px 11px;
    border:1px solid var(--rule); border-radius:4px; background:var(--paper);
    font-size:12px; color:var(--ink-mute); flex:1; max-width:240px;
  }
  .md-transcript-search svg { width:11px; height:11px; flex-shrink:0; }
  .md-transcript-search input { border:none; outline:none; background:none; font-size:12px; color:var(--ink); font-family:inherit; flex:1; }
  .md-transcript-box {
    background:var(--paper-cool); border:1px solid var(--rule-soft); border-radius:7px;
    max-height:380px; overflow-y:auto; padding:4px 0;
  }
  .md-transcript-box::-webkit-scrollbar { width:4px; }
  .md-transcript-box::-webkit-scrollbar-thumb { background:var(--rule); border-radius:2px; }
  .md-tline {
    display:flex; gap:11px; padding:11px 15px;
    border-bottom:1px solid var(--rule-soft); transition:background .12s;
  }
  .md-tline:last-child { border-bottom:none; }
  .md-tline:hover { background:var(--paper-warm); }
  .md-tline-avatar {
    width:26px; height:26px; border-radius:50%; flex-shrink:0;
    display:flex; align-items:center; justify-content:center;
    font-size:12px; font-weight:700; color:#fff; margin-top:1px;
  }
  .md-tline-body { flex:1; }
  .md-tline-meta { display:flex; align-items:center; gap:8px; margin-bottom:4px; }
  .md-tline-name { font-size:12px; font-weight:600; }
  .md-tline-time { font-family:'JetBrains Mono',monospace; font-size:12px; color:var(--ink-faint); }
  .md-tline-text { font-size:13px; color:var(--ink-soft); line-height:1.65; }
  .md-tline-highlight { background:rgba(26,79,140,.12); border-radius:2px; padding:0 2px; }

  /* ============================================================ */
  /* ========== 剧场模式 · 蛋白质进化 演出组件 ================== */
  /* ============================================================ */

  /* ===== 左侧悬浮 plan 进度卡（全部完成后淡出） ===== */
  .scene-plan-strip {
    position: absolute;
    left: 18px;
    top: 54px;
    z-index: 10;
    margin: 0;
    padding: 12px 14px 11px;
    width: 196px;
    background: var(--paper);
    border: 1px solid var(--rule);
    border-radius: 3px;
    box-shadow: 0 6px 20px rgba(0,0,0,0.05);
    display: flex;
    flex-direction: column;
    gap: 9px;
    animation: stripFloatIn .4s ease-out;
    transition: opacity .45s ease, transform .45s ease;
    backdrop-filter: blur(2px);
  }
  .scene-plan-strip.is-complete {
    opacity: 0;
    transform: translateX(-12px);
    pointer-events: none;
  }
  @keyframes stripFloatIn {
    from { opacity: 0; transform: translateX(-12px); }
    to   { opacity: 1; transform: translateX(0); }
  }
  .strip-head {
    display: flex;
    align-items: baseline;
    justify-content: space-between;
    gap: 10px;
    padding-bottom: 8px;
    border-bottom: 1px solid var(--rule-soft);
  }
  .strip-eyebrow {
    font-family: 'JetBrains Mono', monospace;
    font-size: 12px;
    letter-spacing: 0.22em;
    text-transform: uppercase;
    color: var(--ink-faint);
    flex-shrink: 0;
  }
  .strip-progress {
    display: flex;
    align-items: center;
    gap: 12px;
    flex-shrink: 0;
  }
  .strip-num {
    font-family: 'Cormorant Garamond', serif;
    font-style: italic;
    font-size: 16px;
    color: var(--vermilion);
    letter-spacing: 0.04em;
    font-weight: 500;
    line-height: 1;
  }
  .strip-num small {
    font-size: 12px;
    color: var(--ink-faint);
    margin-left: 1px;
  }
  .strip-segs {
    display: flex;
    gap: 2px;
    align-items: flex-end;
    justify-content: space-between;
  }
  .strip-segs .seg {
    display: flex;
    flex-direction: column;
    align-items: center;
    gap: 3px;
    width: 12px;
  }
  .strip-segs .seg-dot {
    width: 4px;
    height: 4px;
    border-radius: 50%;
    background: transparent;
    border: 1px solid var(--rule-soft);
    box-sizing: border-box;
    transition: background .3s ease, border-color .3s ease, box-shadow .3s ease;
  }
  .strip-segs .seg-bar {
    width: 12px;
    height: 4px;
    background: var(--rule-soft);
    border-radius: 1px;
    transition: background .3s ease;
  }
  .strip-segs .seg.done .seg-dot {
    background: var(--ink);
    border-color: var(--ink);
  }
  .strip-segs .seg.done .seg-bar { background: var(--ink); }
  .strip-segs .seg.active .seg-dot {
    background: var(--vermilion);
    border-color: var(--vermilion);
    box-shadow: 0 0 0 3px rgba(224, 112, 48, 0.18);
    animation: stripDotPulse 1.4s ease-in-out infinite;
  }
  .strip-segs .seg.active .seg-bar {
    background: var(--vermilion);
    animation: stripPulse 1.4s ease-in-out infinite;
  }
  .strip-current {
    font-family: 'Noto Serif SC', sans-serif;
    font-size: 12px;
    color: var(--ink-soft);
    letter-spacing: 0.02em;
    line-height: 1.5;
    word-break: break-word;
  }
  .strip-current .arrow {
    color: var(--vermilion);
    margin-right: 6px;
  }
  .strip-current.done {
    color: var(--success);
  }
  @keyframes stripPulse {
    0%,100% { opacity: 1; }
    50%     { opacity: 0.5; }
  }
  @keyframes stripDotPulse {
    0%,100% { box-shadow: 0 0 0 3px rgba(224, 112, 48, 0.18); }
    50%     { box-shadow: 0 0 0 6px rgba(224, 112, 48, 0.04); }
  }

  /* ===== mol3d 卡片：序列面板 ===== */
  .scene-mol3d-seq {
    background: var(--paper-warm);
    border-top: 1px solid var(--rule-soft);
    padding: 12px 16px 14px;
  }
  .scene-mol3d-seq-head {
    display: flex; align-items: baseline; gap: 12px;
    margin-bottom: 8px;
  }
  .scene-mol3d-seq-eyebrow {
    font-family: 'JetBrains Mono', monospace;
    font-size: 12px;
    letter-spacing: 0.22em;
    text-transform: uppercase;
    color: var(--ink-faint);
  }
  .scene-mol3d-seq-meta {
    margin-left: auto;
    font-family: 'JetBrains Mono', monospace;
    font-size: 12px;
    color: var(--ink-mute);
    letter-spacing: 0.04em;
  }
  .scene-mol3d-seq-meta strong {
    color: var(--vermilion);
    font-weight: 500;
  }
  .scene-mol3d-seq-body {
    font-family: 'JetBrains Mono', monospace;
    font-size: 12px;
    line-height: 1.85;
    color: var(--ink);
    letter-spacing: 0.04em;
  }
  .seq-row {
    display: grid;
    grid-template-columns: 36px 1fr;
    gap: 12px;
    align-items: baseline;
    margin-bottom: 2px;
  }
  .seq-pos {
    text-align: right;
    font-size: 12px;
    color: var(--ink-faint);
    letter-spacing: 0.06em;
    padding-top: 1px;
  }
  .seq-chars {
    word-break: break-all;
    font-family: 'JetBrains Mono', monospace;
  }
  .seq-chars .mut {
    background: rgba(224, 112, 48, 0.20);
    color: #c25420;
    border-bottom: 1.5px solid #e07030;
    font-weight: 600;
    padding: 0 1px;
    border-radius: 1px;
    cursor: help;
  }
  .seq-chars .mut:hover {
    background: rgba(224, 112, 48, 0.40);
  }

  /* ===== 3D 蛋白结构渲染（3Dmol.js） ===== */
  .scene-mol3d {
    max-width: 760px; margin: 0 auto 22px;
    background: var(--paper);
    border: 1px solid var(--rule);
    overflow: hidden;
    animation: sceneFadeIn .35s ease-out;
  }
  .scene-mol3d-head {
    padding: 11px 16px;
    border-bottom: 1px solid var(--rule-soft);
    background: var(--paper-warm);
    display: flex; align-items: baseline; gap: 12px; flex-wrap: wrap;
  }
  .scene-mol3d-eyebrow {
    font-family: 'JetBrains Mono', monospace;
    font-size: 12px; letter-spacing: 0.2em;
    text-transform: uppercase; color: var(--vermilion);
  }
  .scene-mol3d-title {
    font-family: 'Noto Serif SC', serif;
    font-size: 13px; color: var(--ink);
    font-weight: 500; letter-spacing: 0.04em;
  }
  .scene-mol3d-meta {
    margin-left: auto;
    font-family: 'JetBrains Mono', monospace;
    font-size: 12px; color: var(--success);
    letter-spacing: 0.05em;
  }
  .scene-mol3d-stage {
    position: relative;
    background: #0e1620;
    overflow: hidden;
  }
  .scene-mol3d-canvas {
    width: 100%; height: 340px;
    position: relative;
  }
  .scene-mol3d-loading {
    position: absolute; inset: 0;
    display: flex; flex-direction: column;
    align-items: center; justify-content: center;
    gap: 10px; z-index: 1; pointer-events: none;
    color: rgba(255,255,255,.55);
    font-family: 'JetBrains Mono', monospace;
    font-size: 12px; letter-spacing: 0.1em;
  }
  .scene-mol3d-loading .spinner {
    width: 28px; height: 28px;
    border: 2px solid rgba(74,184,179,.25);
    border-top-color: var(--vermilion-soft);
    border-radius: 50%;
    animation: sceneSpin 1s linear infinite;
  }
  .scene-mol3d-tools {
    position: absolute; top: 10px; right: 10px;
    display: flex; flex-direction: column; gap: 5px; z-index: 10;
  }
  .scene-mol3d-tools button {
    width: 28px; height: 28px;
    border: 1px solid rgba(255,255,255,.18);
    background: rgba(0,0,0,.5);
    color: rgba(255,255,255,.8);
    cursor: pointer;
    font-size: 12px;
    display: flex; align-items: center; justify-content: center;
    border-radius: 1px;
    transition: all .15s;
  }
  .scene-mol3d-tools button:hover {
    border-color: var(--vermilion-soft);
    color: var(--vermilion-soft);
  }
  .scene-mol3d-legend {
    position: absolute; bottom: 10px; left: 10px;
    background: rgba(0,0,0,.55);
    border: 1px solid rgba(255,255,255,.1);
    border-radius: 1px;
    padding: 6px 10px;
    font-family: 'JetBrains Mono', monospace;
    font-size: 12px;
    color: rgba(255,255,255,.78);
    line-height: 1.7;
    z-index: 10;
  }
  .scene-mol3d-legend > div {
    display: flex; align-items: center; gap: 6px;
  }
  .scene-mol3d-legend .dot {
    display: inline-block; width: 9px; height: 9px;
    border-radius: 50%;
  }
  .scene-mol3d-legend .dot.grad {
    background: linear-gradient(135deg, #4400ff, #aa00ff, #ff4400);
  }
  .scene-mol3d-legend .dot.mut { background: #e07030; }
  .scene-mol3d-foot {
    padding: 8px 16px;
    border-top: 1px solid var(--rule-soft);
    font-family: 'JetBrains Mono', monospace;
    font-size: 12px;
    color: var(--ink-faint);
    display: flex; gap: 16px; flex-wrap: wrap;
    letter-spacing: 0.04em;
  }
  .scene-mol3d-foot .meta {
    margin-left: auto; color: var(--ink-mute);
  }

  /* ===== 思考轨迹（thinking traces） ===== */
  .scene-think {
    max-width: 760px;
    margin: 0 auto 18px;
    background: var(--paper-warm);
    border: 1px solid var(--rule);
    font-size: 13px;
    animation: sceneFadeIn .3s ease-out;
  }
  .scene-think-head {
    padding: 9px 14px;
    border-bottom: 1px solid transparent;
    display: flex; align-items: center; gap: 10px;
    cursor: pointer; user-select: none;
  }
  .scene-think.streaming .scene-think-head,
  .scene-think.expanded .scene-think-head {
    border-bottom-color: var(--rule-soft);
  }
  .scene-think-icon {
    width: 12px; height: 12px;
    position: relative; flex-shrink: 0;
  }
  .scene-think.streaming .scene-think-icon::after {
    content: '';
    position: absolute; inset: 0;
    border: 1.5px solid var(--rule);
    border-top-color: var(--vermilion);
    border-radius: 50%;
    animation: sceneSpin .9s linear infinite;
  }
  .scene-think.done .scene-think-icon::after {
    content: '';
    position: absolute; left: 4px; top: 0;
    width: 4px; height: 8px;
    border-right: 1.5px solid var(--vermilion);
    border-bottom: 1.5px solid var(--vermilion);
    transform: rotate(45deg);
  }
  .scene-think-label {
    font-family: 'Noto Serif SC', serif;
    font-size: 12px; color: var(--ink-soft);
    flex: 1;
  }
  .scene-think-time {
    font-family: 'JetBrains Mono', monospace;
    font-size: 12px; color: var(--ink-faint);
    letter-spacing: 0.06em;
  }
  .scene-think-chev {
    width: 8px; height: 8px;
    border-right: 1.2px solid var(--ink-faint);
    border-bottom: 1.2px solid var(--ink-faint);
    transform: rotate(-45deg);
    transition: transform .2s ease;
    margin-top: -3px;
  }
  .scene-think.streaming .scene-think-chev,
  .scene-think.expanded .scene-think-chev {
    transform: rotate(45deg) translate(2px, -2px);
  }
  .scene-think-body {
    padding: 8px 14px 10px;
    display: none;
  }
  .scene-think.streaming .scene-think-body,
  .scene-think.expanded .scene-think-body { display: block; }
  .scene-think-trace {
    display: grid;
    grid-template-columns: 22px 56px 1fr;
    gap: 10px;
    padding: 5px 0;
    font-size: 12px;
    line-height: 1.65;
    border-bottom: 1px dotted var(--rule-soft);
    animation: sceneFadeIn .25s ease-out;
  }
  .scene-think-trace:last-child { border-bottom: none; }
  .scene-think-trace .step {
    font-family: 'JetBrains Mono', monospace;
    font-size: 12px;
    color: var(--ink-faint);
    padding-top: 2px;
  }
  .scene-think-trace .type {
    font-family: 'JetBrains Mono', monospace;
    font-size: 12px; letter-spacing: 0.16em;
    text-transform: uppercase;
    color: var(--ink-mute);
    padding-top: 2px;
    text-align: right;
  }
  .scene-think-trace .type.llm  { color: var(--vermilion); }
  .scene-think-trace .type.tool { color: var(--gold); }
  .scene-think-trace .type.exec { color: var(--success); }
  .scene-think-trace .type.read { color: var(--ink-soft); }
  .scene-think-trace .text {
    color: var(--ink-soft);
    font-family: 'Noto Serif SC', 'Inter', sans-serif;
  }
  .scene-think-trace .text code {
    font-family: 'JetBrains Mono', monospace;
    font-size: 12px;
    background: var(--paper);
    padding: 1px 4px;
    border-radius: 1px;
  }

  /* ===== 代码执行块 ===== */
  .scene-code {
    max-width: 760px; margin: 0 auto 18px;
    background: #161e2c;
    color: #d8e0eb;
    border-radius: 2px;
    font-family: 'JetBrains Mono', monospace;
    font-size: 12px; line-height: 1.7;
    overflow: hidden;
    animation: sceneFadeIn .3s ease-out;
  }
  .scene-code-head {
    padding: 7px 14px;
    background: #0f1620;
    border-bottom: 1px solid #2a3548;
    display: flex; align-items: center; gap: 10px;
    font-size: 12px;
  }
  .scene-code-dot {
    width: 8px; height: 8px; border-radius: 50%;
    background: #f0a828;
    flex-shrink: 0;
  }
  .scene-code.done .scene-code-dot { background: #18b8a8; }
  .scene-code-lang {
    letter-spacing: 0.18em; text-transform: uppercase;
    color: #6a90c8; font-weight: 500;
  }
  .scene-code-fn {
    color: #88a0c0;
    font-size: 12px;
  }
  .scene-code-status {
    margin-left: auto;
    color: #8aa0c0;
    letter-spacing: 0.1em;
    font-size: 12px;
  }
  .scene-code.running .scene-code-status { color: #f0a828; }
  .scene-code.done .scene-code-status { color: #18b8a8; }
  .scene-code-body {
    padding: 12px 16px;
    white-space: pre;
    overflow-x: auto;
    max-height: 280px;
    overflow-y: auto;
    color: #d8e0eb;
  }
  .scene-code-body::-webkit-scrollbar { width: 6px; height: 6px; }
  .scene-code-body::-webkit-scrollbar-thumb { background: #2a3548; border-radius: 3px; }
  .scene-code .kw  { color: #c098f0; }
  .scene-code .str { color: #f0c878; }
  .scene-code .com { color: #5a708c; font-style: italic; }
  .scene-code .num { color: #88e0c8; }
  .scene-code .builtin { color: #f88a90; }

  /* ===== 观察输出块（terminal-style） ===== */
  .scene-obs {
    max-width: 760px; margin: 0 auto 18px;
    background: var(--paper);
    border: 1px solid var(--rule);
    border-left: 3px solid var(--success);
    font-family: 'JetBrains Mono', monospace;
    font-size: 12px; line-height: 1.75;
    overflow: hidden;
    animation: sceneFadeIn .3s ease-out;
  }
  .scene-obs-head {
    padding: 7px 14px;
    background: var(--paper-warm);
    border-bottom: 1px solid var(--rule-soft);
    font-size: 12px; letter-spacing: 0.2em;
    text-transform: uppercase;
    color: var(--ink-faint);
    display: flex; align-items: center; gap: 8px;
  }
  .scene-obs-head::before {
    content: '▸';
    color: var(--success);
    font-size: 12px;
  }
  .scene-obs-head-fn {
    color: var(--ink-mute);
    text-transform: none; letter-spacing: 0;
    font-size: 12px;
    margin-left: auto;
  }
  .scene-obs-body {
    padding: 11px 16px;
    color: var(--ink-soft);
    white-space: pre-wrap;
    max-height: 260px;
    overflow-y: auto;
  }
  .scene-obs-body::-webkit-scrollbar { width: 5px; }
  .scene-obs-body::-webkit-scrollbar-thumb { background: var(--rule); border-radius: 2px; }
  .scene-obs-body .ok    { color: var(--success); font-weight: 500; }
  .scene-obs-body .warn  { color: var(--warning); }
  .scene-obs-body .acc   { color: var(--vermilion); font-weight: 500; }
  .scene-obs-body .key   { color: var(--ink); font-weight: 500; }
  .scene-obs-body .dim   { color: var(--ink-faint); }
  .scene-obs-body .num   { color: var(--ink); font-weight: 500; }

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

  /* AI 流式输出文本（替代幕标） */
  .scene-say {
    max-width: 760px;
    margin: 0 auto 22px;
    font-family: 'Noto Serif SC', 'Inter', sans-serif;
    font-size: 14px;
    line-height: 1.85;
    color: var(--ink);
    letter-spacing: 0.01em;
    animation: sceneFadeIn .25s ease-out;
  }
  .scene-say-text { white-space: pre-wrap; }
  .scene-say strong {
    font-weight: 500;
    color: var(--ink);
    font-family: 'JetBrains Mono', monospace;
    font-size: 13px;
    letter-spacing: 0.02em;
    background: var(--vermilion-bg);
    padding: 1px 4px;
  }
  .scene-say em {
    font-style: italic;
    color: var(--vermilion);
    font-family: 'Cormorant Garamond', 'Noto Serif SC', serif;
    font-size: 14px;
  }
  .scene-say-cursor {
    display: inline-block;
    width: 7px; height: 16px;
    background: var(--ink);
    margin-left: 2px;
    vertical-align: -3px;
    animation: sceneBlink 1s step-end infinite;
  }
  .scene-say-cursor.done { display: none; }
  @keyframes sceneBlink {
    0%, 50%   { opacity: 1; }
    51%, 100% { opacity: 0; }
  }

  /* 进入剧场 ribbon — 用户消息后的一道狭条提示 */
  .scene-banner {
    max-width: 760px;
    margin: -8px auto 28px;
    padding: 9px 18px;
    background: var(--vermilion-bg);
    border-left: 2px solid var(--vermilion);
    display: flex; align-items: center; gap: 12px;
    font-size: 12px; color: var(--ink-soft);
    animation: sceneFadeIn .5s ease-out;
  }
  .scene-banner-mark {
    font-family: 'Cormorant Garamond', serif;
    font-style: italic; font-size: 13px;
    color: var(--vermilion); letter-spacing: 0.04em;
  }
  .scene-banner-text { flex: 1; font-family: 'Noto Serif SC', serif; }
  .scene-banner-skip {
    font-family: 'JetBrains Mono', monospace;
    font-size: 12px; letter-spacing: 0.15em;
    color: var(--ink-faint); cursor: pointer;
    padding: 3px 8px; border: 1px solid var(--rule);
    transition: all .15s;
    text-transform: uppercase;
  }
  .scene-banner-skip:hover { color: var(--ink); border-color: var(--ink-soft); }

  /* 幕间分割 — 两道 hairline 中间一段拉丁/中文标 */
  .scene-act {
    max-width: 760px;
    margin: 40px auto 28px;
    display: flex; align-items: center; gap: 18px;
    animation: sceneFadeIn .55s ease-out;
  }
  .scene-act-rule {
    flex: 1; height: 1px;
    background: linear-gradient(90deg, transparent, var(--rule) 30%, var(--rule) 70%, transparent);
  }
  .scene-act-text { text-align: center; flex-shrink: 0; }
  .scene-act-roman {
    font-family: 'Cormorant Garamond', serif;
    font-style: italic; font-size: 12px;
    color: var(--ink-faint); letter-spacing: 0.22em;
    text-transform: uppercase;
    margin-bottom: 3px;
  }
  .scene-act-cn {
    font-family: 'Noto Serif SC', serif;
    font-size: 16px; font-weight: 500;
    color: var(--ink); letter-spacing: 0.15em;
  }

  /* 计划清单（Plan checklist） */
  .scene-plan {
    max-width: 760px; margin: 0 auto 28px;
    background: var(--paper);
    border: 1px solid var(--rule);
    padding: 22px 26px;
    animation: sceneFadeIn .5s ease-out;
  }
  .scene-plan-head {
    padding-bottom: 14px;
    border-bottom: 1px solid var(--rule-soft);
    margin-bottom: 14px;
    display: flex; align-items: baseline; gap: 14px;
  }
  .scene-plan-eyebrow {
    font-family: 'JetBrains Mono', monospace;
    font-size: 12px; letter-spacing: 0.22em;
    text-transform: uppercase; color: var(--vermilion);
  }
  .scene-plan-title {
    font-family: 'Noto Serif SC', serif;
    font-size: 14px; font-weight: 500; color: var(--ink);
    letter-spacing: 0.06em;
  }
  .scene-plan-list { list-style: none; padding: 0; margin: 0; }
  .scene-plan-item {
    display: grid;
    grid-template-columns: 36px 18px 1fr;
    gap: 10px; align-items: baseline;
    padding: 7px 0;
    font-size: 13px; color: var(--ink-soft); line-height: 1.6;
    border-bottom: 1px dotted var(--rule-soft);
    transition: color .25s ease;
  }
  .scene-plan-item:last-child { border-bottom: none; }
  .scene-plan-item.done { color: var(--ink-mute); }
  .scene-plan-item.active {
    color: var(--ink); font-weight: 500;
    background: linear-gradient(90deg, var(--vermilion-bg) 0%, transparent 60%);
    margin: 0 -10px; padding: 7px 10px;
  }
  .scene-plan-num {
    font-family: 'Cormorant Garamond', serif;
    font-style: italic; color: var(--ink-faint);
    font-size: 14px;
  }
  .scene-plan-item.done .scene-plan-num,
  .scene-plan-item.active .scene-plan-num { color: var(--vermilion); }
  .scene-plan-mark {
    width: 12px; height: 12px;
    border: 1px solid var(--rule);
    display: inline-block; position: relative; top: 1px;
  }
  .scene-plan-item.done .scene-plan-mark {
    background: var(--ink); border-color: var(--ink);
  }
  .scene-plan-item.done .scene-plan-mark::after {
    content: ''; position: absolute;
    left: 2px; top: 0px; width: 4px; height: 7px;
    border-right: 1.5px solid var(--paper);
    border-bottom: 1.5px solid var(--paper);
    transform: rotate(45deg);
  }
  .scene-plan-item.active .scene-plan-mark {
    border-color: var(--vermilion);
    background:
      radial-gradient(circle, var(--vermilion) 35%, transparent 38%);
  }

  /* 工具调用 */
  .scene-tool {
    max-width: 760px; margin: 0 auto 28px;
    background: var(--paper);
    border: 1px solid var(--rule);
    border-left: 3px solid var(--ink-soft);
    font-family: 'JetBrains Mono', monospace;
    font-size: 12px; color: var(--ink-soft);
    animation: sceneFadeIn .5s ease-out;
  }
  .scene-tool-head {
    padding: 10px 16px;
    border-bottom: 1px solid var(--rule-soft);
    display: flex; align-items: center; gap: 10px;
    background: var(--paper-warm);
  }
  .scene-tool-icon {
    width: 8px; height: 8px; border-radius: 50%;
    background: var(--ink-faint);
    flex-shrink: 0;
  }
  .scene-tool.running .scene-tool-icon {
    background: var(--vermilion);
    box-shadow: 0 0 0 0 var(--vermilion);
    animation: scenePulse 1.4s ease-in-out infinite;
  }
  .scene-tool.done .scene-tool-icon { background: var(--success); }
  .scene-tool-name {
    font-size: 12px; letter-spacing: 0.08em;
    color: var(--ink); font-weight: 500;
  }
  .scene-tool-fn {
    font-size: 12px; color: var(--ink-mute);
    letter-spacing: 0;
  }
  .scene-tool-status {
    margin-left: auto;
    font-size: 12px; letter-spacing: 0.18em;
    text-transform: uppercase; color: var(--ink-faint);
  }
  .scene-tool.running .scene-tool-status { color: var(--vermilion); }
  .scene-tool.done .scene-tool-status { color: var(--success); }
  .scene-tool-args {
    padding: 12px 16px;
    border-bottom: 1px solid var(--rule-soft);
    color: var(--ink-mute);
    line-height: 1.7;
  }
  .scene-tool-args .arg-key { color: var(--ink-soft); }
  .scene-tool-args .arg-val { color: var(--ink); }
  .scene-tool-progress {
    padding: 10px 16px;
    color: var(--ink-soft);
    line-height: 1.6;
    font-family: 'Noto Serif SC', 'Inter', sans-serif;
    font-size: 13px;
  }
  .scene-tool-progress strong {
    color: var(--vermilion);
    font-family: 'JetBrains Mono', monospace;
    font-size: 12px; font-weight: 500;
    letter-spacing: 0.04em;
  }
  /* 收敛矩阵 */
  .scene-tool-matrix {
    display: grid;
    grid-template-columns: repeat(10, 1fr);
    gap: 4px;
    padding: 0 16px 14px;
  }
  .scene-tool-matrix .dot {
    width: 100%; aspect-ratio: 1;
    background: var(--paper-warm);
    border: 1px solid var(--rule-soft);
    transition: all .25s ease;
  }
  .scene-tool-matrix .dot.done {
    background: var(--ink);
    border-color: var(--ink);
  }
  .scene-tool-log-toggle {
    padding: 9px 16px;
    border-top: 1px solid var(--rule-soft);
    font-size: 12px; color: var(--ink-faint);
    letter-spacing: 0.14em; text-transform: uppercase;
    cursor: pointer;
    user-select: none;
  }
  .scene-tool-log-toggle:hover { color: var(--ink-soft); }
  .scene-tool-log {
    display: none;
    padding: 10px 16px 14px;
    font-size: 12px; color: var(--ink-mute);
    line-height: 1.65; max-height: 200px; overflow-y: auto;
    border-top: 1px dotted var(--rule);
    background: var(--paper-warm);
  }
  .scene-tool.expanded .scene-tool-log { display: block; }

  /* 序列卡 */
  .scene-seq-card {
    max-width: 760px; margin: 0 auto 28px;
    background: var(--paper);
    border: 1px solid var(--rule);
    animation: sceneFadeIn .55s ease-out;
  }
  .scene-seq-head {
    padding: 12px 18px;
    border-bottom: 1px solid var(--rule-soft);
    display: flex; align-items: baseline; gap: 14px;
    background: var(--paper-warm);
  }
  .scene-seq-rank {
    font-family: 'Cormorant Garamond', serif;
    font-style: italic; font-size: 14px;
    color: var(--vermilion); letter-spacing: 0.04em;
  }
  .scene-seq-metric {
    font-family: 'JetBrains Mono', monospace;
    font-size: 12px; color: var(--ink-soft);
  }
  .scene-seq-metric strong {
    color: var(--ink); font-weight: 500;
    font-size: 13px;
  }
  .scene-seq-len {
    margin-left: auto;
    font-family: 'JetBrains Mono', monospace;
    font-size: 12px; color: var(--ink-faint);
    letter-spacing: 0.12em;
  }
  .scene-seq-body {
    padding: 14px 18px;
    font-family: 'JetBrains Mono', monospace;
    font-size: 12px; line-height: 1.85;
    color: var(--ink); letter-spacing: 0.05em;
    word-break: break-all;
  }
  .scene-seq-label {
    display: block;
    font-family: 'Noto Serif SC', serif;
    font-size: 12px; color: var(--ink-faint);
    letter-spacing: 0.18em; margin-bottom: 4px;
  }
  .scene-seq-row {
    margin-bottom: 12px;
    padding-bottom: 12px;
    border-bottom: 1px dotted var(--rule-soft);
  }
  .scene-seq-row:last-child { border-bottom: none; margin-bottom: 0; padding-bottom: 0; }
  .scene-seq-mut {
    background: var(--vermilion-bg);
    color: var(--vermilion);
    border-bottom: 1px solid var(--vermilion);
    padding: 0 1px;
    font-weight: 500;
  }
  .scene-seq-foot {
    padding: 10px 18px;
    border-top: 1px solid var(--rule-soft);
    display: flex; align-items: center; gap: 14px;
    font-family: 'JetBrains Mono', monospace;
    font-size: 12px; color: var(--ink-mute);
    letter-spacing: 0.08em;
  }
  .scene-seq-foot strong {
    color: var(--vermilion); font-weight: 500;
  }

  /* 突变频率图 SVG */
  .scene-freq {
    max-width: 760px; margin: 0 auto 28px;
    background: var(--paper);
    border: 1px solid var(--rule);
    padding: 18px 18px 14px;
    animation: sceneFadeIn .55s ease-out;
  }
  .scene-freq-head {
    display: flex; align-items: baseline; gap: 12px;
    margin-bottom: 12px;
  }
  .scene-freq-eyebrow {
    font-family: 'JetBrains Mono', monospace;
    font-size: 12px; letter-spacing: 0.2em;
    text-transform: uppercase; color: var(--vermilion);
  }
  .scene-freq-title {
    font-family: 'Noto Serif SC', serif;
    font-size: 14px; color: var(--ink);
    letter-spacing: 0.06em;
  }
  .scene-freq-svg {
    width: 100%; height: 180px; display: block;
    background: var(--paper-warm);
  }
  .scene-freq-stats {
    display: flex; gap: 24px; margin-top: 12px;
    padding-top: 10px;
    border-top: 1px solid var(--rule-soft);
    font-size: 12px; color: var(--ink-mute);
  }
  .scene-freq-stats strong {
    font-family: 'Cormorant Garamond', serif;
    color: var(--vermilion);
    font-size: 16px; font-weight: 500;
    margin-right: 5px;
  }

  /* 突变库表 */
  .scene-lib {
    max-width: 760px; margin: 0 auto 28px;
    animation: sceneFadeIn .55s ease-out;
  }
  .scene-lib-head {
    margin-bottom: 10px;
    display: flex; align-items: baseline; gap: 12px;
  }
  .scene-lib-eyebrow {
    font-family: 'JetBrains Mono', monospace;
    font-size: 12px; letter-spacing: 0.2em;
    text-transform: uppercase; color: var(--vermilion);
  }
  .scene-lib-title {
    font-family: 'Noto Serif SC', serif;
    font-size: 14px; color: var(--ink);
  }
  .scene-lib-grid {
    display: grid;
    grid-template-columns: repeat(2, minmax(0, 1fr));
    gap: 0;
    border-top: 1px solid var(--rule);
    border-left: 1px solid var(--rule);
    background: var(--paper);
  }
  /* 窄容器降级：< 540px 时改单列，避免每格压缩到放不下 */
  @media (max-width: 540px) {
    .scene-lib-grid { grid-template-columns: 1fr; }
  }
  .scene-lib-row {
    display: grid;
    grid-template-columns: 60px minmax(0, 1fr) 84px;
    gap: 10px; align-items: center;
    padding: 9px 14px;
    border-bottom: 1px solid var(--rule-soft);
    border-right: 1px solid var(--rule-soft);
    font-size: 12px;
    min-width: 0;
  }
  .scene-lib-pos {
    font-family: 'JetBrains Mono', monospace;
    color: var(--ink-faint); font-size: 12px;
    letter-spacing: 0.06em;
    white-space: nowrap;
  }
  .scene-lib-mut {
    font-family: 'JetBrains Mono', monospace;
    color: var(--ink); font-size: 12px;
    letter-spacing: 0.04em;
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
    min-width: 0;
  }
  .scene-lib-mut .arrow {
    color: var(--ink-faint); margin: 0 4px;
  }
  .scene-lib-mut .target { color: var(--vermilion); font-weight: 500; }
  /* freq · mini 横条（vermilion 填充比例）+ 数值，比 10 个 dot 字符紧凑可靠 */
  .scene-lib-freq {
    display: flex; align-items: center; gap: 6px;
    min-width: 0;
  }
  .scene-lib-freq-bar {
    flex: 1 1 auto;
    height: 4px;
    background: rgba(0,0,0,0.06);
    border-radius: 2px;
    overflow: hidden;
    min-width: 0;
  }
  .scene-lib-freq-fill {
    height: 100%;
    background: var(--vermilion);
    border-radius: 2px;
  }
  .scene-lib-freq-val {
    flex: 0 0 auto;
    font-family: 'JetBrains Mono', monospace;
    font-size: 11px; color: var(--ink-mute);
    font-variant-numeric: tabular-nums;
  }
  /* 兼容：保留旧 dots 形态的 fallback 样式（防止其它地方还在用） */
  .scene-lib-freq .dots { letter-spacing: 1px; color: var(--ink); margin-right: 4px; font-size: 11px; }

  /* 结构阵列 */
  .scene-struct {
    max-width: 760px; margin: 0 auto 28px;
    animation: sceneFadeIn .55s ease-out;
  }
  .scene-struct-head {
    margin-bottom: 10px;
    display: flex; align-items: baseline; gap: 12px;
  }
  .scene-struct-eyebrow {
    font-family: 'JetBrains Mono', monospace;
    font-size: 12px; letter-spacing: 0.2em;
    text-transform: uppercase; color: var(--vermilion);
  }
  .scene-struct-title {
    font-family: 'Noto Serif SC', serif;
    font-size: 14px; color: var(--ink);
  }
  .scene-struct-grid {
    display: grid;
    grid-template-columns: repeat(5, 1fr);
    gap: 6px;
  }
  .scene-struct-cell {
    aspect-ratio: 1;
    background: var(--paper);
    border: 1px solid var(--rule);
    display: flex; flex-direction: column;
    align-items: center; justify-content: center;
    padding: 8px 4px;
    transition: all .2s ease;
    cursor: pointer;
  }
  .scene-struct-cell:hover {
    border-color: var(--ink-soft);
    background: var(--paper-warm);
  }
  .scene-struct-cell.wt {
    background: var(--vermilion-bg);
    border-color: var(--vermilion-soft);
  }
  .scene-struct-mini {
    width: 38px; height: 38px;
    margin-bottom: 6px;
    color: var(--ink-mute);
  }
  .scene-struct-cell.wt .scene-struct-mini { color: var(--vermilion); }
  .scene-struct-name {
    font-family: 'JetBrains Mono', monospace;
    font-size: 12px; color: var(--ink);
    letter-spacing: 0.04em;
    text-align: center;
  }
  .scene-struct-cell.wt .scene-struct-name { color: var(--vermilion); font-weight: 500; }
  .scene-struct-foot {
    margin-top: 10px;
    padding: 10px 14px;
    background: var(--paper-warm);
    border: 1px solid var(--rule-soft);
    font-size: 12px; color: var(--ink-mute);
    line-height: 1.7;
    font-family: 'Noto Serif SC', serif;
  }
  .scene-struct-foot strong { color: var(--ink); font-weight: 500; }

  /* ───── 结构预测 · 新版（hero 3D viewer + 22 选择卡）───── */
  .scene-struct-modelmeta {
    font-family: 'JetBrains Mono', monospace;
    font-size: 12px; color: var(--ink-faint);
    margin-left: auto;
  }
  .scene-struct-hero {
    display: grid;
    grid-template-columns: minmax(0, 1fr) 220px;
    gap: 12px;
    margin-bottom: 14px;
    background: var(--paper);
    border: 1px solid var(--rule);
    border-radius: 4px;
    overflow: hidden;
  }
  .scene-struct-hero-stage {
    position: relative;
    background: #0e1620;
    min-height: 320px;
  }
  .scene-struct-hero-canvas {
    width: 100%;
    height: 320px;
    position: relative;
  }
  .scene-struct-hero-tools {
    position: absolute; top: 8px; right: 8px;
    display: flex; flex-direction: column; gap: 4px;
    z-index: 4;
  }
  .scene-struct-hero-tools button {
    width: 26px; height: 26px;
    background: rgba(255,255,255,0.08);
    border: 1px solid rgba(255,255,255,0.15);
    border-radius: 3px;
    color: rgba(255,255,255,0.7);
    cursor: pointer;
    font-size: 12px; line-height: 1;
    transition: background .15s, color .15s;
  }
  .scene-struct-hero-tools button:hover {
    background: rgba(255,255,255,0.18);
    color: rgba(255,255,255,0.95);
  }
  .scene-struct-hero-info {
    padding: 14px 14px;
    background: var(--paper-cool);
    border-left: 1px solid var(--rule);
    display: flex; flex-direction: column; gap: 6px;
  }
  .scene-struct-hero-info .ssh-name {
    font-family: 'JetBrains Mono', monospace;
    font-size: 13px; font-weight: 600; color: var(--ink);
  }
  .scene-struct-hero-info .ssh-meta {
    font-family: 'JetBrains Mono', monospace;
    font-size: 12px; color: var(--ink-soft);
    line-height: 1.55;
  }
  .scene-struct-hero-info .ssh-hint {
    margin-top: auto;
    font-family: 'Inter', sans-serif;
    font-size: 12px; color: var(--ink-faint);
    line-height: 1.55;
    padding-top: 8px;
    border-top: 1px dashed var(--rule-soft);
  }

  .scene-struct-cards {
    display: grid;
    grid-template-columns: repeat(auto-fill, minmax(96px, 1fr));
    gap: 6px;
    margin-bottom: 10px;
  }
  .scene-struct-card {
    display: flex; flex-direction: column;
    align-items: stretch; justify-content: space-between;
    gap: 4px;
    padding: 8px 10px;
    background: var(--paper);
    border: 1px solid var(--rule);
    border-radius: 3px;
    cursor: pointer;
    transition: all .15s ease;
    font-family: 'JetBrains Mono', monospace;
    text-align: left;
    position: relative;
  }
  .scene-struct-card:hover {
    border-color: var(--ink-soft);
    background: var(--paper-warm);
    transform: translateY(-1px);
  }
  .scene-struct-card.selected {
    border-color: var(--vermilion);
    background: var(--vermilion-bg);
    box-shadow: 0 0 0 2px rgba(22,97,171,0.12);
  }
  .scene-struct-card .ssc-tag {
    align-self: flex-start;
    font-size: 12px; letter-spacing: 0.14em;
    padding: 1px 5px; border-radius: 2px;
    background: var(--vermilion); color: var(--paper);
    text-transform: uppercase;
  }
  .scene-struct-card .ssc-dot {
    width: 6px; height: 6px; border-radius: 50%;
    background: var(--ink-mute);
  }
  .scene-struct-card.tier-good .ssc-dot  { background: var(--success); }
  .scene-struct-card.tier-fair .ssc-dot  { background: var(--vermilion); }
  .scene-struct-card.tier-risk .ssc-dot  { background: #c93838; }
  .scene-struct-card .ssc-name {
    font-size: 12px; font-weight: 500; color: var(--ink);
    letter-spacing: 0.04em;
  }
  .scene-struct-card .ssc-plddt {
    font-size: 12px; color: var(--ink-faint);
    letter-spacing: 0.06em;
  }
  .scene-struct-card.wt .ssc-name { color: var(--vermilion); }
  .scene-struct-card.tier-risk { border-color: rgba(192,48,48,0.4); }
  .scene-struct-card.tier-risk .ssc-name { color: #b03030; }
  .scene-struct-card.tier-good { border-color: rgba(22,97,171,0.4); }

  /* 殿试榜（排行） */
  /* ===== 综合排名 · 简约科学风 ===== */
  .scene-rank {
    max-width: 760px; margin: 0 auto 22px;
    background: var(--paper);
    border: 1px solid var(--rule);
    border-radius: 4px;
    overflow: hidden;
    font-family: 'Inter','Noto Sans SC',sans-serif;
    animation: sceneFadeIn .45s ease-out;
  }
  .scene-rank-head {
    padding: 14px 20px 11px;
    border-bottom: 1px solid var(--rule-soft);
    background: var(--paper-cool);
  }
  .scene-rank-eyebrow {
    font-family: 'JetBrains Mono', monospace;
    font-size: 12px;
    letter-spacing: 0.18em;
    color: var(--ink-mute);
    text-transform: uppercase;
    margin-bottom: 3px;
  }
  .scene-rank-title {
    font-family: 'Noto Sans SC','Inter',sans-serif;
    font-size: 14px;
    font-weight: 500;
    color: var(--ink);
    letter-spacing: 0.02em;
  }
  .scene-rank-summary {
    padding: 9px 20px;
    background: var(--paper-cool);
    border-bottom: 1px solid var(--rule-soft);
    font-family: 'JetBrains Mono', monospace;
    font-size: 12px;
    color: var(--ink-soft);
    display: flex; align-items: center; gap: 12px;
    flex-wrap: wrap;
  }
  .scene-rank-summary strong { color: var(--ink); font-weight: 500; }
  .scene-rank-summary em { font-style: normal; font-weight: 600; }
  .scene-rank-summary em.tier-good { color: var(--success); }
  .scene-rank-summary em.tier-fair { color: var(--gold); }
  .scene-rank-summary em.tier-risk { color: var(--error); }
  .scene-rank-summary .dot { width: 3px; height: 3px; border-radius: 50%; background: var(--rule); }

  .scene-rank-table { padding: 0; }
  .scene-rank-header-row {
    display: grid;
    grid-template-columns: 36px 80px 50px 56px 1fr 70px;
    gap: 14px; align-items: center;
    padding: 8px 20px;
    font-family: 'JetBrains Mono', monospace;
    font-size: 12px;
    letter-spacing: 0.14em;
    text-transform: uppercase;
    color: var(--ink-faint);
    border-bottom: 1px solid var(--rule-soft);
  }
  .scene-rank-row {
    display: grid;
    grid-template-columns: 36px 80px 50px 56px 1fr 70px;
    gap: 14px; align-items: center;
    padding: 10px 20px;
    border-bottom: 1px solid var(--rule-soft);
    font-size: 13px;
    color: var(--ink);
    animation: sceneFadeIn .3s ease-out;
    animation-fill-mode: backwards;
  }
  .scene-rank-row:last-child { border-bottom: none; }
  .scene-rank-row .r-idx {
    font-family: 'JetBrains Mono', monospace;
    font-size: 12px;
    color: var(--ink-faint);
    text-align: right;
  }
  .scene-rank-row .r-name {
    font-family: 'JetBrains Mono', monospace;
    font-size: 13px;
    color: var(--ink);
    font-weight: 500;
  }
  .scene-rank-row.tier-good .r-name { color: var(--success); }
  .scene-rank-row .r-pos {
    font-family: 'JetBrains Mono', monospace;
    font-size: 12px;
    color: var(--ink-mute);
  }
  .scene-rank-row .r-score {
    font-family: 'JetBrains Mono', monospace;
    font-size: 14px;
    font-weight: 600;
    color: var(--ink);
    text-align: right;
    letter-spacing: -0.01em;
  }
  .scene-rank-row.tier-good .r-score { color: var(--success); }
  .scene-rank-row.tier-risk .r-score { color: var(--error); }
  .scene-rank-row .r-bar {
    height: 4px;
    background: var(--rule-soft);
    border-radius: 2px;
    overflow: hidden;
  }
  .scene-rank-row .r-bar-fill {
    height: 100%;
    background: var(--ink-mute);
    border-radius: 2px;
    transition: width .35s ease;
  }
  .scene-rank-row.tier-good .r-bar-fill { background: var(--success); }
  .scene-rank-row.tier-fair .r-bar-fill { background: var(--gold); }
  .scene-rank-row.tier-risk .r-bar-fill { background: var(--error); }
  .scene-rank-row .r-tier {
    font-family: 'JetBrains Mono', monospace;
    font-size: 12px;
    letter-spacing: 0.04em;
    padding: 3px 9px;
    border-radius: 10px;
    text-align: center;
    white-space: nowrap;
  }
  .scene-rank-row.tier-good .r-tier { background: var(--success-bg); color: var(--success); }
  .scene-rank-row.tier-fair .r-tier { background: var(--paper-warm); color: var(--ink-mute); }
  .scene-rank-row.tier-risk .r-tier { background: var(--error-bg);   color: var(--error); }

  /* ===== 综合分析 · 简约科学风 ===== */
  .scene-verdict {
    max-width: 760px; margin: 0 auto 22px;
    background: var(--paper);
    border: 1px solid var(--rule);
    border-radius: 4px;
    overflow: hidden;
    font-family: 'Inter','Noto Sans SC',sans-serif;
    animation: sceneFadeIn .45s ease-out;
  }
  .scene-verdict-head {
    padding: 14px 20px 11px;
    border-bottom: 1px solid var(--rule-soft);
    background: var(--paper-cool);
  }
  .scene-verdict-eyebrow {
    font-family: 'JetBrains Mono', monospace;
    font-size: 12px;
    letter-spacing: 0.18em;
    color: var(--ink-mute);
    text-transform: uppercase;
    margin-bottom: 3px;
  }
  .scene-verdict-title {
    font-family: 'Noto Sans SC','Inter',sans-serif;
    font-size: 14px;
    font-weight: 500;
    color: var(--ink);
    letter-spacing: 0.02em;
  }
  .scene-verdict-grid {
    display: grid;
    grid-template-columns: 200px 1fr;
    gap: 1px;
    background: var(--rule-soft);
  }
  .scene-verdict-score-box {
    background: var(--paper);
    padding: 18px 20px 18px;
  }
  .sv-score-label {
    font-family: 'JetBrains Mono', monospace;
    font-size: 12px;
    letter-spacing: 0.16em;
    color: var(--ink-mute);
    text-transform: uppercase;
    margin-bottom: 8px;
  }
  .sv-score-value {
    font-family: 'JetBrains Mono', monospace;
    font-size: 32px;
    font-weight: 600;
    color: var(--ink);
    line-height: 1;
    letter-spacing: -0.02em;
  }
  .sv-score-value small {
    font-size: 14px;
    font-weight: 400;
    color: var(--ink-faint);
    margin-left: 2px;
  }
  .scene-verdict-dist {
    background: var(--paper);
    padding: 14px 22px 16px;
  }
  .sv-dist-label {
    font-family: 'JetBrains Mono', monospace;
    font-size: 12px;
    letter-spacing: 0.16em;
    color: var(--ink-mute);
    text-transform: uppercase;
    margin-bottom: 10px;
  }
  .sv-dist-row {
    display: grid;
    grid-template-columns: repeat(3, 1fr);
    gap: 14px;
  }
  .sv-dist-cell {
    padding-left: 11px;
    border-left: 2px solid var(--rule);
  }
  .sv-dist-cell.tier-good { border-left-color: var(--success); }
  .sv-dist-cell.tier-fair { border-left-color: var(--gold); }
  .sv-dist-cell.tier-risk { border-left-color: var(--error); }
  .sv-dist-n {
    font-family: 'JetBrains Mono', monospace;
    font-size: 22px;
    font-weight: 600;
    color: var(--ink);
    line-height: 1;
    margin-bottom: 4px;
    letter-spacing: -0.01em;
  }
  .sv-dist-cell.tier-good .sv-dist-n { color: var(--success); }
  .sv-dist-cell.tier-fair .sv-dist-n { color: var(--gold); }
  .sv-dist-cell.tier-risk .sv-dist-n { color: var(--error); }
  .sv-dist-tag {
    font-family: 'JetBrains Mono', monospace;
    font-size: 12px;
    color: var(--ink-mute);
    letter-spacing: 0.04em;
  }
  .scene-verdict-notes {
    border-top: 1px solid var(--rule-soft);
  }
  .sv-note {
    display: flex;
    align-items: flex-start;
    gap: 12px;
    padding: 11px 20px;
  }
  .sv-note + .sv-note { border-top: 1px solid var(--rule-soft); }
  .sv-note-tag {
    font-family: 'JetBrains Mono', monospace;
    font-size: 12px;
    font-weight: 500;
    letter-spacing: 0.04em;
    padding: 2px 9px;
    border-radius: 10px;
    flex-shrink: 0;
    white-space: nowrap;
  }
  .sv-note.risk .sv-note-tag {
    background: var(--error-bg);
    color: var(--error);
  }
  .sv-note.tip .sv-note-tag {
    background: var(--success-bg);
    color: var(--success);
  }
  .sv-note-text {
    font-size: 13px;
    color: var(--ink-soft);
    line-height: 1.7;
  }
  .sv-note-text strong {
    font-family: 'JetBrains Mono', monospace;
    font-size: 12px;
    color: var(--ink);
    font-weight: 500;
    background: var(--paper-warm);
    padding: 1px 5px;
    border-radius: 2px;
  }

  /* =================================================================
     Agent Loop · 普通对话模式的执行链可视化
     spec: ThoughtChain ToolCallCard pattern
     ================================================================= */
  .agent-loop {
    width: 100%;
    max-width: 100%;
    margin: 0 0 18px;
    font-family: 'Inter','Noto Serif SC',sans-serif;
    font-size: 13px;
    color: var(--ink);
  }
  /* ---- toolbar ---- */
  .al-toolbar {
    display: flex; align-items: center; justify-content: space-between;
    gap: 12px;
    margin-bottom: 12px;
  }
  .al-toolbar-left { display: flex; align-items: center; gap: 8px; min-width: 0; }
  .al-toolbar-title {
    font-family: 'Noto Serif SC', serif;
    font-size: 13px; font-weight: 500;
    color: var(--ink);
    letter-spacing: 0.02em;
  }
  /* loading 中 · title 从左扫到右的 shimmer（仿 antd-x `blink:true` 但改成扫光感）
     原理：linear-gradient 高光窗口在 image 中央 33-67%，size 300% 让高光窗口窄于容器
     background-position 从 100% 滑到 0% → 高光从 container 左外扫入 → 中央 → 右外
     用 background-clip: text 让扫光只显示在文字像素上 · cycle 衔接处都是"全 ink 无高光"
     状态，所以循环无跳跃 · pill 切 success 后选择器失配 → 动画自动停 */
  .al-toolbar:has(.al-toolbar-pill.info) .al-toolbar-title {
    background-image: linear-gradient(
      90deg,
      var(--ink) 0%,
      var(--ink) 33%,
      var(--vermilion) 50%,
      var(--ink) 67%,
      var(--ink) 100%
    );
    background-size: 300% 100%;
    background-position: 100% 0;
    -webkit-background-clip: text;
    background-clip: text;
    -webkit-text-fill-color: transparent;
    color: transparent;
    animation: alTitleShimmer 2.4s linear infinite;
  }
  @keyframes alTitleShimmer {
    0%   { background-position: 100% 0; }   /* 高光在 container 左外 */
    100% { background-position: 0% 0; }     /* 高光扫到 container 右外 */
  }
  .al-toolbar-right { display: flex; gap: 4px; flex-shrink: 0; }
  .al-toolbar-btn {
    font-family: 'Inter', sans-serif;
    font-size: 12px;
    padding: 3px 9px;
    border-radius: 4px;
    border: 0.5px solid var(--rule);
    background: transparent;
    color: var(--ink-soft);
    cursor: pointer;
    transition: all .15s;
  }
  .al-toolbar-btn:hover {
    background: var(--paper-warm);
    color: var(--ink);
    border-color: var(--ink-mute);
  }

  /* ---- status pill ---- */
  .al-pill {
    display: inline-flex; align-items: center; gap: 4px;
    font-family: 'JetBrains Mono', monospace;
    font-size: 12px;
    font-weight: 500;
    padding: 2px 8px;
    border-radius: 11px;
    line-height: 1.55;
    white-space: nowrap;
  }
  .al-pill i { font-size: 12px; line-height: 1; }
  .al-pill.muted   { background: var(--paper-warm);   color: var(--ink-mute); }
  .al-pill.success { background: var(--vermilion-bg); color: var(--vermilion); }
  .al-pill.warning { background: var(--warning-bg);   color: var(--warning); }
  .al-pill.info    { background: var(--vermilion-bg); color: var(--vermilion); }
  .al-pill.danger  { background: var(--error-bg);     color: var(--error); }
  .al-pill.outline {
    background: transparent;
    color: var(--ink-soft);
    border: 0.5px solid var(--rule);
    font-weight: 400;
    font-family: 'JetBrains Mono', monospace;
  }
  /* icon-only 状态指示器：仅 icon，无背景、无文字 */
  .al-pill.icon-only {
    background: transparent;
    padding: 0;
    gap: 0;
    line-height: 1;
  }
  .al-pill.icon-only i { font-size: 13px; }
  .al-pill.icon-only.running { color: var(--vermilion); }
  .al-pill.icon-only.success { color: var(--success); }
  .al-pill.icon-only.error   { color: var(--error); }

  /* ---- Tool detail drawer（右侧抽屉） ---- */
  .tool-drawer {
    position: fixed;
    top: 0; right: 0; bottom: 0;
    width: 560px;
    max-width: 92vw;
    background: var(--paper);
    border-left: 1px solid var(--rule);
    box-shadow: -8px 0 24px rgba(0,0,0,0.06);
    transform: translateX(100%);
    transition: transform .25s ease;
    z-index: 1000;
    display: flex;
    flex-direction: column;
  }
  .tool-drawer.open { transform: translateX(0); }
  .tool-drawer-backdrop {
    position: fixed; inset: 0;
    background: rgba(0,0,0,0);
    pointer-events: none;
    transition: background .25s ease;
    z-index: 999;
  }
  .tool-drawer-backdrop.open {
    background: rgba(0,0,0,0.08);
    pointer-events: auto;
  }
  .tool-drawer-header {
    display: flex; align-items: center; gap: 8px;
    padding: 12px 14px;
    border-bottom: 1px solid var(--rule);
    flex-shrink: 0;
  }
  .tool-drawer-icon { font-size: 14px; color: var(--ink-mute); width: 16px; text-align: center; }
  .tool-drawer-title {
    flex: 1; min-width: 0;
    display: flex; align-items: center; gap: 6px;
    flex-wrap: wrap;
    font-size: 13px;
    font-weight: 500;
    color: var(--ink);
  }
  .tool-drawer-title code {
    font-family: 'JetBrains Mono', monospace;
    font-size: 12px;
    font-weight: 400;
    background: var(--paper-warm);
    color: var(--ink-soft);
    padding: 1px 6px;
    border-radius: 3px;
  }
  .tool-drawer-close {
    border: none; background: transparent;
    cursor: pointer; padding: 4px 6px;
    color: var(--ink-mute);
    display: inline-flex; align-items: center; justify-content: center;
    border-radius: 4px;
    transition: background .15s, color .15s;
  }
  .tool-drawer-close:hover { background: var(--paper-warm); color: var(--ink); }
  .tool-drawer-close i { font-size: 16px; }
  .tool-drawer-body {
    flex: 1;
    overflow: auto;
    padding: 14px 16px;
    background: var(--paper-warm);
  }
  /* drawer 内的 body 包裹层不需要外边框 / 圆角 */
  .tool-drawer-body .al-item-body {
    display: block !important;
    border: none;
    border-radius: 0;
    background: transparent;
  }
  /* 当前在 drawer 中打开的卡片：高亮 head */
  .al-item-head.drawer-active {
    background: var(--paper-warm);
    border-color: var(--ink-faint);
  }

  /* ─────────────────────────────────────────────────────────────────────
     蛋白质进化 · 全景摘要抽屉（Protein Summary Drawer · psd-）
     final 回复完成后自动弹出，整个解决过程压在两屏内
     ───────────────────────────────────────────────────────────────────── */
  .psd-backdrop {
    position: fixed; inset: 0;
    background: rgba(0,0,0,0);
    pointer-events: none;
    transition: background .3s ease;
    z-index: 1100;
  }
  .psd-backdrop.open {
    background: rgba(20,24,32,0.32);
    pointer-events: auto;
  }
  .psd-drawer {
    position: fixed;
    top: 0; right: 0; bottom: 0;
    width: 92vw; max-width: 1180px;
    background: var(--paper);
    border-left: 1px solid var(--rule);
    box-shadow: -16px 0 48px rgba(0,0,0,0.12);
    transform: translateX(102%);
    transition: transform .32s cubic-bezier(0.4, 0.0, 0.2, 1);
    z-index: 1101;
    display: flex; flex-direction: column;
    overflow: hidden;
  }
  .psd-drawer.open { transform: translateX(0); }
  .psd-header {
    flex-shrink: 0;
    display: flex; align-items: center; justify-content: space-between;
    gap: 16px;
    padding: 16px 22px;
    border-bottom: 1px solid var(--rule);
    background: var(--paper-cool);
  }
  .psd-header-left {
    display: flex; flex-direction: column; gap: 2px;
    min-width: 0;
  }
  .psd-eyebrow {
    font-family: 'JetBrains Mono', monospace;
    font-size: 12px; letter-spacing: 0.22em;
    text-transform: uppercase; color: var(--vermilion);
  }
  .psd-title {
    font-family: 'Noto Serif SC', serif;
    font-size: 16px; font-weight: 600; color: var(--ink);
    letter-spacing: 0.04em;
  }
  .psd-close {
    width: 32px; height: 32px;
    border: 1px solid var(--rule);
    background: var(--paper);
    border-radius: 4px; cursor: pointer;
    color: var(--ink-mute);
    display: inline-flex; align-items: center; justify-content: center;
    transition: all .15s;
  }
  .psd-close:hover { color: var(--vermilion); border-color: var(--vermilion-soft); background: var(--vermilion-bg); }
  .psd-close i { font-size: 16px; }

  .psd-body {
    flex: 1;
    overflow: auto;
    padding: 18px 22px 22px;
    background: var(--paper);
    display: flex; flex-direction: column; gap: 16px;
  }

  /* ─── Strip · 关键指标横条 ─── */
  .psd-strip {
    display: grid;
    grid-template-columns: repeat(6, 1fr);
    gap: 1px;
    background: var(--rule);
    border: 1px solid var(--rule);
    border-radius: 4px;
    overflow: hidden;
  }
  .psd-strip-cell {
    background: var(--paper-cool);
    padding: 10px 14px;
    display: flex; flex-direction: column; gap: 3px;
  }
  .psd-strip-label {
    font-family: 'JetBrains Mono', monospace;
    font-size: 12px; letter-spacing: 0.14em;
    color: var(--ink-mute); text-transform: uppercase;
  }
  .psd-strip-val {
    font-family: 'JetBrains Mono', monospace;
    font-size: 14px; font-weight: 600; color: var(--ink);
    line-height: 1.2;
  }
  .psd-strip-val small {
    font-size: 12px; font-weight: 400; color: var(--ink-faint);
    margin-left: 3px;
  }
  .psd-strip-val.accent { color: var(--vermilion); }
  .psd-strip-sub {
    font-family: 'JetBrains Mono', monospace;
    font-size: 12px; color: var(--ink-faint);
  }

  /* ─── 流程时间线 ─── */
  .psd-flow {
    border: 1px solid var(--rule);
    border-radius: 4px;
    padding: 14px 18px;
    background: var(--paper-cool);
  }
  .psd-flow-head {
    display: flex; align-items: center; gap: 10px;
    margin-bottom: 12px;
  }
  .psd-flow-eyebrow {
    font-family: 'JetBrains Mono', monospace;
    font-size: 12px; letter-spacing: 0.18em; color: var(--ink-mute);
    text-transform: uppercase;
  }
  .psd-flow-title {
    font-family: 'Noto Serif SC', serif;
    font-size: 13px; font-weight: 500; color: var(--ink);
  }
  .psd-flow-grid {
    display: grid;
    grid-template-columns: repeat(9, 1fr);
    gap: 4px;
    align-items: stretch;
  }
  .psd-step {
    background: var(--paper);
    border: 1px solid var(--rule);
    border-radius: 3px;
    padding: 8px 8px;
    display: flex; flex-direction: column; gap: 3px;
    position: relative;
  }
  .psd-step.done   { border-color: rgba(107,122,58,.6); background: rgba(107,122,58,.05); }
  .psd-step.flag   { border-color: var(--vermilion); background: var(--vermilion-bg); }
  .psd-step-num {
    font-family: 'JetBrains Mono', monospace;
    font-size: 12px; color: var(--ink-faint);
    letter-spacing: 0.12em;
  }
  .psd-step-name {
    font-size: 12px; color: var(--ink); font-weight: 500;
    line-height: 1.3;
  }
  .psd-step-meta {
    font-family: 'JetBrains Mono', monospace;
    font-size: 12px; color: var(--ink-mute);
    line-height: 1.4;
  }
  .psd-step.flag .psd-step-name { color: var(--vermilion); }

  /* ─── 四张要点卡 ─── */
  .psd-insights {
    display: grid;
    grid-template-columns: repeat(4, 1fr);
    gap: 12px;
  }
  .psd-card {
    border: 1px solid var(--rule);
    border-radius: 4px;
    padding: 12px 14px;
    background: var(--paper);
    display: flex; flex-direction: column; gap: 6px;
    position: relative;
  }
  .psd-card-eyebrow {
    font-family: 'JetBrains Mono', monospace;
    font-size: 12px; letter-spacing: 0.14em;
    color: var(--ink-mute); text-transform: uppercase;
  }
  .psd-card-title {
    font-family: 'Noto Serif SC', serif;
    font-size: 13px; font-weight: 600; color: var(--ink);
    line-height: 1.35;
  }
  .psd-card-stat {
    font-family: 'JetBrains Mono', monospace;
    font-size: 16px; font-weight: 600; color: var(--vermilion);
    line-height: 1.1;
  }
  .psd-card-stat small {
    font-size: 12px; font-weight: 400; color: var(--ink-faint);
    margin-left: 4px;
  }
  .psd-card-desc {
    font-size: 12px; color: var(--ink-soft);
    line-height: 1.55;
    margin-top: auto;
  }

  /* ─── 推荐 / 风险 双栏 ─── */
  .psd-verdict {
    display: grid;
    grid-template-columns: 1fr 1fr;
    gap: 14px;
  }
  .psd-verdict-block {
    border: 1px solid var(--rule);
    border-radius: 4px;
    padding: 12px 16px;
    background: var(--paper);
  }
  .psd-verdict-block.good { background: rgba(107,122,58,.04); border-color: rgba(107,122,58,.4); }
  .psd-verdict-block.risk { background: rgba(192,48,48,.04); border-color: rgba(192,48,48,.4); }
  .psd-verdict-eyebrow {
    font-family: 'JetBrains Mono', monospace;
    font-size: 12px; letter-spacing: 0.16em;
    text-transform: uppercase; color: var(--ink-mute);
    margin-bottom: 4px;
  }
  .psd-verdict-block.good .psd-verdict-eyebrow { color: var(--success); }
  .psd-verdict-block.risk .psd-verdict-eyebrow { color: #c93838; }
  .psd-verdict-title {
    font-family: 'JetBrains Mono', monospace;
    font-size: 14px; font-weight: 600; color: var(--ink);
    margin-bottom: 6px;
    letter-spacing: 0.02em;
  }
  .psd-verdict-desc {
    font-size: 12px; color: var(--ink-soft);
    line-height: 1.6;
  }
  .psd-verdict-desc em { color: var(--ink); font-style: italic; font-weight: 500; }

  /* ─── 下一步 CTA bar ─── */
  .psd-cta-bar {
    display: flex; gap: 10px; flex-wrap: wrap;
    padding-top: 4px;
    border-top: 1px dashed var(--rule);
    padding-top: 14px;
  }
  .psd-cta-bar-label {
    font-family: 'JetBrains Mono', monospace;
    font-size: 12px; letter-spacing: 0.14em;
    color: var(--ink-mute); text-transform: uppercase;
    align-self: center;
    margin-right: 4px;
  }
  .psd-cta {
    display: inline-flex; align-items: center; gap: 6px;
    padding: 8px 14px;
    border: 1px solid var(--rule);
    background: var(--paper);
    border-radius: 3px;
    font-size: 13px; color: var(--ink-soft);
    cursor: pointer;
    transition: all .15s;
    font-family: 'Inter','Noto Serif SC',sans-serif;
  }
  .psd-cta:hover {
    border-color: var(--ink-soft);
    color: var(--ink);
    background: var(--paper-warm);
  }
  .psd-cta.primary {
    background: var(--ink); color: var(--paper);
    border-color: var(--ink);
  }
  .psd-cta.primary:hover {
    background: var(--vermilion); border-color: var(--vermilion);
  }
  .psd-cta i { font-size: 13px; }

  /* ═══════════════════════════════════════════════════════════════════
     蛋白质进化 · 全流程总览推开式抽屉（.pf-sum-drawer + .pf-sum-*）
     · 抽屉占宽度让 chat 收窄（不是浮层）
     · 内部纵向单列：strip / 3D Hero / 6 步小卡 / 排名 / 推荐+风险 / CTA
     · 3D 结构是视觉中心，全宽 + 高度突出
     ═══════════════════════════════════════════════════════════════════ */
  .chat-wrap {
    --pf-sum-w: max(720px, 60vw);
  }
  /* 抽屉打开时 chat-wrap 整体收窄一份让出来；同时彻底隐藏 workspace 入口（panel + 5px handle） */
  .chat-wrap.pf-sum-open {
    width: calc(100% - var(--pf-sum-w));
  }
  .chat-wrap.pf-sum-open .workspace-panel,
  .chat-wrap.pf-sum-open #workspaceResizeHandle {
    display: none;
  }

  .pf-sum-drawer {
    position: fixed;
    top: 56px; right: 0; bottom: 0;
    width: var(--pf-sum-w, 760px);
    min-width: 0;
    z-index: 72;
    background: var(--paper-warm);   /* 比 chat-panel 的 paper 暖一档，与对话流形成视觉分区 */
    border-left: 1px solid var(--rule);
    box-shadow: -10px 0 32px rgba(0,0,0,0.08);
    display: none;
    flex-direction: column;
    overflow: hidden;
  }
  /* 只让显式带 .open 的抽屉出现 —— 多抽屉同存时（蛋白质 + 深度研究）不冲突 */
  .pf-sum-drawer.open { display: flex; animation: pfSumIn .42s cubic-bezier(0.2,0.0,0.2,1); }
  @keyframes pfSumIn {
    from { opacity: 0; transform: translateX(40px); }
    to   { opacity: 1; transform: translateX(0); }
  }

  .pf-sum-drawer-head {
    flex-shrink: 0;
    display: flex; align-items: center; justify-content: space-between;
    gap: 12px;
    padding: 14px 18px;
    border-bottom: 1px solid var(--rule);
    background: var(--paper);        /* 比 body(paper-warm) 浅一档 · 形成顶部标牌带 */
  }
  .pf-sum-drawer-head-text {
    display: flex; flex-direction: column; gap: 2px; min-width: 0;
  }
  .pf-sum-drawer-close {
    width: 32px; height: 32px;
    border: 1px solid var(--rule);
    background: var(--paper);
    border-radius: 4px; cursor: pointer;
    color: var(--ink-mute);
    display: inline-flex; align-items: center; justify-content: center;
    transition: all .15s;
  }
  .pf-sum-drawer-close:hover { color: var(--vermilion); border-color: var(--vermilion-soft); background: var(--vermilion-bg); }
  .pf-sum-drawer-close svg { width: 16px; height: 16px; }

  /* 抽屉左边缘 resize 手柄：拖动改宽度 */
  .pf-sum-resize-handle {
    position: absolute;
    top: 0; bottom: 0; left: 0;
    width: 5px;
    cursor: ew-resize;
    z-index: 4;
    background: transparent;
    transition: background .15s;
  }
  .pf-sum-resize-handle::after {
    content: '';
    position: absolute; top: 50%; left: 50%;
    transform: translate(-50%, -50%);
    width: 1px; height: 28px;
    background: var(--rule);
    transition: background .15s, width .15s;
  }
  .pf-sum-resize-handle:hover { background: rgba(190,52,40,0.06); }
  .pf-sum-resize-handle:hover::after,
  .pf-sum-resize-handle.dragging::after {
    background: var(--vermilion);
    width: 2px;
  }
  body.pf-sum-resizing { cursor: ew-resize; user-select: none; }
  body.pf-sum-resizing * { cursor: ew-resize !important; user-select: none !important; }

  .pf-sum-drawer-body {
    flex: 1;
    min-height: 0;
    overflow: auto;
    padding: 14px 18px 18px;
    display: flex; flex-direction: column; gap: 12px;
  }

  .pf-sum-eyebrow {
    font-family: 'JetBrains Mono', monospace;
    font-size: 12px; letter-spacing: 0.22em;
    color: var(--vermilion); text-transform: uppercase;
  }
  .pf-sum-title {
    font-family: 'Noto Serif SC', serif;
    font-size: 14px; font-weight: 600; color: var(--ink);
    letter-spacing: 0.04em;
  }

  /* ═══════ 新单屏布局：优化目标 / 3D Hero+右栏 / 过程信号灯 ═══════ */

  /* ─── 顶部·优化目标（突出版：eyebrow + 大标题 + 目标陈述 + 6 metric tiles） ─── */
  .pf-target {
    flex-shrink: 0;
    border: 1px solid var(--rule);
    border-radius: 4px;
    background: var(--paper-cool);
    padding: 14px 18px 12px;
    /* 左侧 vermilion 强调边 */
    border-left: 3px solid var(--vermilion);
    display: flex; flex-direction: column; gap: 8px;
  }
  .pf-target-head {
    display: flex; align-items: baseline; gap: 12px;
    flex-wrap: wrap;
  }
  .pf-target-eyebrow {
    font-family: 'JetBrains Mono', monospace;
    font-size: 12px; letter-spacing: 0.26em;
    color: var(--vermilion); text-transform: uppercase;
    font-weight: 600;
  }
  .pf-target-title {
    font-family: 'Noto Serif SC', serif;
    font-size: 16px; font-weight: 700; color: var(--ink);
    letter-spacing: 0.06em;
    line-height: 1.25;
  }
  .pf-target-stmt {
    font-size: 13px; color: var(--ink-soft);
    line-height: 1.7;
    margin: 0;
    max-width: 92ch;
  }
  .pf-target-stmt em {
    color: var(--vermilion);
    font-style: normal; font-weight: 600;
  }
  .pf-target-stmt strong {
    color: var(--ink);
    font-weight: 600;
  }
  /* ── 推荐序列：突变记号一行表示（WT + L76I·F82L·S146R·Y165F） ── */
  .pf-target-pick {
    display: flex; align-items: center; gap: 8px;
    flex-wrap: wrap;
    padding: 7px 10px;
    background: var(--paper);
    border: 1px solid var(--rule);
    border-radius: 3px;
    font-family: 'JetBrains Mono', monospace;
    font-size: 12px;
    color: var(--ink);
  }
  .pf-target-pick-label {
    color: var(--vermilion);
    font-weight: 600;
    letter-spacing: 0.08em;
    text-transform: uppercase;
    font-size: 11px;
  }
  .pf-target-pick-base {
    color: var(--ink-mute);
    letter-spacing: 0.06em;
  }
  .pf-target-pick-plus {
    color: var(--ink-faint);
    font-weight: 400;
  }
  .pf-target-pick-chips {
    display: inline-flex; gap: 4px; flex-wrap: wrap;
  }
  .pf-target-pick-chip {
    display: inline-flex; align-items: center;
    padding: 2px 7px;
    background: var(--mc, var(--vermilion));
    color: #fff;
    border-radius: 3px;
    font-weight: 600;
    font-size: 11.5px;
    letter-spacing: 0.04em;
  }
  .pf-target-pick-meta {
    margin-left: auto;
    color: var(--ink-mute);
    font-size: 11px;
    letter-spacing: 0.06em;
  }
  /* 6 个 metric tiles · 横向 */
  .pf-target-tiles {
    display: grid;
    grid-template-columns: repeat(6, minmax(0, 1fr));
    gap: 1px;
    margin-top: 4px;
    background: var(--rule);
    border: 1px solid var(--rule);
    border-radius: 3px;
    overflow: hidden;
  }
  .pf-target-tile {
    background: var(--paper);
    padding: 7px 12px 9px;
    display: flex; flex-direction: column; gap: 2px;
    min-width: 0;
  }
  .pf-target-tile .lbl {
    font-family: 'JetBrains Mono', monospace;
    font-size: 12px; letter-spacing: 0.14em;
    color: var(--ink-faint); text-transform: uppercase;
  }
  .pf-target-tile .val {
    font-family: 'JetBrains Mono', monospace;
    font-size: 13px; font-weight: 600; color: var(--ink);
    line-height: 1.15;
  }
  .pf-target-tile .val.accent { color: var(--vermilion); }
  .pf-target-tile .val small { font-size: 12px; font-weight: 400; color: var(--ink-faint); margin-left: 2px; }

  /* ─── 主体·3D Hero + 右栏结论（flex:1 抢余高，min 280 / 推荐 ~ 320-420 ） ─── */
  .pf-main {
    flex: 1 1 auto;
    min-height: 280px;
    display: grid;
    grid-template-columns: minmax(0, 1.6fr) minmax(280px, 1fr);
    gap: 12px;
    align-items: stretch;
  }
  .pf-hero {
    border: 1px solid var(--vermilion-soft);
    border-radius: 4px;
    padding: 10px 12px 12px;
    background: var(--paper-cool);
    display: flex; flex-direction: column; gap: 8px;
    box-shadow: 0 1px 0 rgba(190,52,40,.06), 0 12px 28px -18px rgba(190,52,40,.22);
  }
  .pf-hero-head {
    display: flex; align-items: center; gap: 8px;
    min-width: 0;
  }
  .pf-hero-head.clickable {
    cursor: pointer;
    padding: 4px 6px;
    margin: -4px -6px;
    border-radius: 3px;
    transition: background .15s;
  }
  .pf-hero-head.clickable:hover {
    background: rgba(190,52,40,.06);
  }
  .pf-hero-head.clickable:hover .pf-hero-go {
    opacity: 1; transform: translateX(2px) translateY(-2px);
  }
  .pf-hero-num {
    font-family: 'JetBrains Mono', monospace;
    font-size: 12px; letter-spacing: 0.14em;
    color: var(--paper); font-weight: 600;
    background: var(--vermilion);
    padding: 2px 6px; border-radius: 2px;
    flex-shrink: 0;
  }
  .pf-hero-code {
    font-family: 'JetBrains Mono', monospace;
    font-size: 12px;
    color: var(--vermilion);
    background: rgba(190,52,40,.08);
    padding: 2px 7px;
    border-radius: 2px;
    letter-spacing: 0.01em;
    flex-shrink: 0;
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
    min-width: 0;
  }
  .pf-hero-name {
    font-family: 'Noto Serif SC', serif;
    font-size: 13px; font-weight: 600; color: var(--ink);
    letter-spacing: 0.02em;
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
    min-width: 0;
  }
  .pf-hero-meta {
    margin-left: auto;
    font-family: 'JetBrains Mono', monospace;
    font-size: 12px; color: var(--ink-mute);
    flex-shrink: 0;
    white-space: nowrap;
  }
  .pf-hero-go {
    font-size: 14px;
    color: var(--vermilion);
    opacity: 0.55;
    transition: opacity .15s, transform .15s;
    flex-shrink: 0;
  }
  .pf-hero-3d {
    flex: 1;
    min-height: 240px;
    background: #0e1620;
    border-radius: 3px;
    position: relative;
    overflow: hidden;
  }

  /* 右栏：09 排名 + 推荐 + 风险（rank card 撑高） */
  .pf-side {
    display: flex; flex-direction: column; gap: 10px;
    min-width: 0;
  }
  .pf-side-card {
    border: 1px solid var(--rule);
    border-radius: 3px;
    padding: 9px 12px 11px;
    background: var(--paper);
    display: flex; flex-direction: column; gap: 6px;
  }
  /* 第一张（rank）撑满剩余高度 */
  .pf-side > .pf-side-card:first-child { flex: 1; min-height: 0; overflow: hidden; }
  .pf-side-card.good { background: rgba(107,122,58,.04); border-color: rgba(107,122,58,.4); }
  .pf-side-card.risk { background: rgba(192,48,48,.04); border-color: rgba(192,48,48,.4); }
  .pf-side-card-head {
    display: flex; align-items: baseline; gap: 6px;
  }
  .pf-side-num {
    font-family: 'JetBrains Mono', monospace;
    font-size: 12px; letter-spacing: 0.14em;
    color: var(--vermilion); font-weight: 600;
    background: var(--vermilion-bg);
    padding: 2px 5px; border-radius: 2px;
  }
  .pf-side-name {
    font-family: 'Noto Serif SC', serif;
    font-size: 13px; font-weight: 600; color: var(--ink);
  }
  .pf-side-meta {
    margin-left: auto;
    font-family: 'JetBrains Mono', monospace;
    font-size: 12px; color: var(--ink-faint);
  }
  .pf-side-card .pf-side-eyebrow {
    font-family: 'JetBrains Mono', monospace;
    font-size: 12px; letter-spacing: 0.14em;
    text-transform: uppercase;
    color: var(--ink-mute);
  }
  .pf-side-card.good .pf-side-eyebrow { color: var(--success); }
  .pf-side-card.risk .pf-side-eyebrow { color: #c93838; }
  .pf-side-title {
    font-family: 'JetBrains Mono', monospace;
    font-size: 13px; font-weight: 600; color: var(--ink);
    letter-spacing: 0.02em;
  }
  .pf-side-desc {
    font-size: 12px; color: var(--ink-soft); line-height: 1.55;
  }
  .pf-side-desc em { color: var(--ink); font-style: italic; font-weight: 500; }

  /* ring 卡片点击 → 滚到 chat 对应工具条后短暂闪烁高亮 */
  @keyframes pfTargetFlash {
    0%   { box-shadow: 0 0 0 0 rgba(190,52,40,0); background: var(--paper); }
    35%  { box-shadow: 0 0 0 6px rgba(190,52,40,0.18); background: var(--vermilion-bg); }
    100% { box-shadow: 0 0 0 0 rgba(190,52,40,0); background: var(--paper); }
  }
  .al-item-head.pf-target-flash {
    animation: pfTargetFlash 1.5s ease-out;
  }

  /* ─── 新版 Ring 布局：07 中心 hero，7 张小卡环绕（3×3 grid，按顺序绕一圈）─── */
  .pf-ring {
    flex: 1;
    min-height: 380px;
    display: grid;
    grid-template-columns: 1fr 1.6fr 1fr;
    grid-template-rows: 1fr 1.5fr 1fr;
    grid-template-areas:
      "c02 c03 c04"
      "c05 hero c06"
      "c08 c09 chint";
    gap: 10px;
  }
  .pf-ring > .pf-ring-cell.c02 { grid-area: c02; }
  .pf-ring > .pf-ring-cell.c03 { grid-area: c03; }
  .pf-ring > .pf-ring-cell.c04 { grid-area: c04; }
  .pf-ring > .pf-ring-cell.c05 { grid-area: c05; }
  .pf-ring > .pf-ring-cell.c06 { grid-area: c06; }
  .pf-ring > .pf-ring-cell.c08 { grid-area: c08; }
  .pf-ring > .pf-ring-cell.c09 { grid-area: c09; }
  .pf-ring > .pf-ring-hero { grid-area: hero; }
  .pf-ring > .pf-ring-chint { grid-area: chint; }

  /* 周围小卡：可点击跳到 chat 里对应工具条 */
  .pf-ring-cell {
    border: 1px solid var(--rule);
    border-radius: 3px;
    background: var(--paper);
    padding: 8px 10px 9px;
    display: flex; flex-direction: column; gap: 4px;
    min-width: 0; min-height: 0;
    cursor: pointer;
    transition: all .15s ease;
    overflow: hidden;
    position: relative;
  }
  .pf-ring-cell:hover {
    border-color: var(--vermilion);
    background: var(--vermilion-bg);
    transform: translateY(-1px);
    box-shadow: 0 4px 14px -6px rgba(190,52,40,0.22);
  }
  .pf-ring-cell.warn { border-color: rgba(192,48,48,.35); background: rgba(192,48,48,.04); }
  .pf-ring-cell.warn:hover { border-color: #c93838; }

  /* 中央 hero（07，不可点击） */
  .pf-ring-hero {
    border: 1px solid var(--vermilion-soft);
    border-radius: 4px;
    background: var(--paper-cool);
    padding: 10px 12px;
    display: flex; flex-direction: column; gap: 8px;
    box-shadow: 0 1px 0 rgba(190,52,40,.06), 0 14px 32px -20px rgba(190,52,40,.28);
    min-height: 0;
  }
  .pf-ring-hero .pf-hero-3d { flex: 1; min-height: 220px; }

  /* 右下角推荐指引（占第 9 格，与下方 Verdict 块形成阅读引导） */
  .pf-ring-chint {
    border: 1px dashed var(--rule-soft);
    border-radius: 3px;
    background: transparent;
    display: flex; flex-direction: column; align-items: center; justify-content: center;
    padding: 8px 12px;
    color: var(--ink-faint);
    font-family: 'JetBrains Mono', monospace;
    font-size: 12px;
    letter-spacing: 0.12em;
    text-align: center;
    line-height: 1.6;
    gap: 4px;
  }
  .pf-ring-chint .label { color: var(--vermilion); font-weight: 600; letter-spacing: 0.18em; }
  .pf-ring-chint .arrow { color: var(--vermilion); font-size: 16px; }

  /* ─── 旧的 steps strip 不再使用，保留 CSS 以防回滚 ─── */
  .pf-steps-strip {
    flex: 0 0 160px;
    display: grid;
    grid-template-columns: repeat(6, minmax(0, 1fr));
    gap: 6px;
  }
  .pf-stepm {
    border: 1px solid var(--rule);
    border-radius: 3px;
    background: var(--paper);
    padding: 8px 10px 9px;
    display: flex; flex-direction: column; gap: 5px;
    min-width: 0;
    min-height: 0;
    overflow: hidden;
  }
  .pf-stepm.warn { border-color: rgba(192,48,48,.35); background: rgba(192,48,48,.04); }
  /* 一行式 head：num + code + name 同一行（窄宽时 code 优先截断） */
  .pf-stepm-head {
    display: flex; align-items: center; gap: 6px;
    min-width: 0;
    overflow: hidden;
  }
  .pf-stepm-num {
    font-family: 'JetBrains Mono', monospace;
    font-size: 12px; letter-spacing: 0.12em;
    color: var(--vermilion); font-weight: 600;
    flex-shrink: 0;
  }
  .pf-stepm.warn .pf-stepm-num,
  .pf-ring-cell.warn .pf-stepm-num { color: #c93838; }
  .pf-stepm-code {
    font-family: 'JetBrains Mono', monospace;
    font-size: 12px;
    color: var(--vermilion);
    background: rgba(190,52,40,.06);
    padding: 1px 5px;
    border-radius: 2px;
    letter-spacing: 0.01em;
    min-width: 0;
    flex-shrink: 1;
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
  }
  .pf-stepm.warn .pf-stepm-code,
  .pf-ring-cell.warn .pf-stepm-code {
    color: #c93838; background: rgba(192,48,48,.08);
  }
  .pf-stepm-name {
    font-family: 'Noto Serif SC', serif;
    font-size: 12px; color: var(--ink); font-weight: 500;
    line-height: 1.2;
    min-width: 0;
    flex: 1;
    overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
  }
  .pf-stepm-viz {
    flex: 1; min-height: 80px;
    display: flex; align-items: center; justify-content: center;
    background: var(--paper-warm);
    border-radius: 2px;
    padding: 6px 8px;
    overflow: hidden;
    position: relative;
  }
  .pf-stepm-viz svg { width: 100%; height: 100%; max-height: 100%; display: block; }
  .pf-stepm-val {
    font-family: 'JetBrains Mono', monospace;
    font-size: 12px; color: var(--ink-soft);
    overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
  }
  .pf-stepm.warn .pf-stepm-val { color: #b03030; font-weight: 500; }

  /* mini viz · 02 序列（旧版，保留兼容） */
  .pf-mini-seq {
    font-family: 'JetBrains Mono', monospace;
    font-size: 12px; line-height: 1.3;
    color: var(--ink-soft);
    text-align: left;
    align-self: stretch;
    word-break: break-all;
    padding: 1px 2px;
  }
  .pf-mini-seq .aa-H { color: #1a7a4a; }
  .pf-mini-seq .aa-K { color: #b04000; }
  .pf-mini-seq .aa-N { color: #781868; }
  .pf-mini-seq .aa-P { color: #1a58b0; }
  .pf-mini-seq .fade { color: var(--ink-faint); }

  /* mini viz · 02 序列 v2 · FASTA-style 折行（30 aa/行 + 行号），宽高自适应 */
  .pf-mini-seq2 {
    width: 100%; height: 100%; align-self: stretch;
    display: flex; flex-direction: column;
    gap: 3px;
    padding: 2px 3px;
    font-family: 'JetBrains Mono', monospace;
    text-align: left;
    min-width: 0; min-height: 0;
    container-type: inline-size;
    overflow: hidden;
  }
  .pf-mini-seq2-hdr {
    font-size: clamp(8px, 1.6cqi, 9.5px);
    color: var(--vermilion);
    letter-spacing: 0.04em;
    white-space: nowrap;
    overflow: hidden; text-overflow: ellipsis;
    flex-shrink: 0;
  }
  .pf-mini-seq2-hdr strong { color: var(--ink); font-weight: 700; letter-spacing: 0.02em; }
  .pf-mini-seq2-body {
    color: var(--ink-soft);
    flex: 1;
    min-height: 0;
    overflow: hidden;
  }
  .pf-mini-seq2-body .aa-H { color: #1a7a4a; }
  .pf-mini-seq2-body .aa-K { color: #b04000; }
  .pf-mini-seq2-body .aa-N { color: #781868; }
  .pf-mini-seq2-body .aa-P { color: #1a58b0; }
  .pf-mini-seq2-body .fade { color: var(--ink-faint); padding: 0 2px; letter-spacing: 0.06em; }

  /* 多行 FASTA 网格 · 行号在左对齐右栏 aa 串 */
  .pf-seq-grid {
    display: flex;
    flex-direction: column;
    gap: 1px;
  }
  .pf-seq-row {
    display: grid;
    grid-template-columns: clamp(20px, 5cqi, 28px) 1fr;
    gap: 4px;
    align-items: baseline;
    line-height: 1.35;
    font-size: clamp(9px, 2.4cqi, 11.5px);
  }
  .pf-seq-num {
    color: var(--ink-faint);
    font-size: clamp(7.5px, 1.7cqi, 9px);
    text-align: right;
    letter-spacing: 0.02em;
  }
  .pf-seq-aa {
    color: var(--ink-soft);
    letter-spacing: 0.5px;
    word-break: break-all;
    white-space: normal;
  }
  .pf-seq-gap .pf-seq-aa { color: var(--ink-faint); letter-spacing: 0.16em; }
  .pf-seq-gap .pf-seq-num { color: var(--ink-faint); }

  /* mini viz · 03 sparkline v2 · 轴标签独立 HTML 不随 SVG 拉伸 */
  .pf-mini-spark2 {
    width: 100%; height: 100%; align-self: stretch;
    display: grid;
    grid-template-columns: 24px 1fr;
    grid-template-rows: 1fr auto;
    gap: 2px 5px;
    padding: 2px 2px 1px;
    font-family: 'JetBrains Mono', monospace;
    color: var(--ink-mute);
    min-width: 0; min-height: 0;
  }
  .pf-mini-spark2-y {
    display: flex; flex-direction: column; justify-content: space-between;
    align-items: flex-end;
    padding: 1px 0 2px;
    font-size: 12px;
    color: var(--ink-mute);
    line-height: 1;
  }
  .pf-mini-spark2-canvas {
    position: relative;
    min-width: 0; min-height: 0;
    border-left: 1px solid var(--rule);
    border-bottom: 1px solid var(--rule);
  }
  .pf-mini-spark2-canvas svg { width: 100%; height: 100%; }
  .pf-mini-spark2-end {
    position: absolute;
    transform: translate(-100%, -110%);
    padding: 0 3px;
    font-size: 12px;
    font-weight: 700;
    color: #2f7fd8;
    background: rgba(255,255,255,.85);
    border-radius: 2px;
    white-space: nowrap;
    pointer-events: none;
    line-height: 1.2;
  }
  .pf-mini-spark2-x {
    grid-column: 2;
    display: flex; justify-content: space-between; align-items: baseline;
    font-size: 12px;
    color: var(--ink-faint);
    line-height: 1;
  }
  .pf-mini-spark2-x .mid {
    color: var(--ink-mute);
    letter-spacing: 0.02em;
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
    padding: 0 4px;
  }

  /* mini viz · 04 突变 track（旧版保留） */
  .pf-mini-trk {
    width: 100%; height: 12px;
    position: relative;
    background: var(--paper); border: 1px solid var(--rule);
    border-radius: 2px;
  }
  .pf-mini-trk-tick {
    position: absolute; top: 2px; bottom: 2px;
    width: 1.2px;
    background: var(--vermilion);
  }

  /* mini viz · 04 突变 track v2 · N/C 端字母 + 关键位点标号（容器查询自适应） */
  .pf-mini-trk2 {
    width: 100%; height: 100%; align-self: stretch;
    display: flex; flex-direction: column;
    justify-content: center;
    gap: 4px;
    padding: 3px 2px;
    container-type: inline-size;
    min-width: 0;
  }
  .pf-trk2-axis {
    display: flex; align-items: center; gap: 6px;
  }
  .pf-trk2-end {
    font-family: 'JetBrains Mono', monospace;
    font-size: clamp(9px, 2.2cqi, 12px);
    font-weight: 700;
    color: var(--vermilion);
    width: clamp(8px, 2.4cqi, 12px);
    text-align: center;
    flex-shrink: 0;
    line-height: 1;
  }
  .pf-trk2-bar {
    flex: 1; min-width: 0;
    height: clamp(12px, 3.6cqi, 18px);
    position: relative;
    background: linear-gradient(to right, rgba(190,52,40,.04), rgba(190,52,40,.08), rgba(190,52,40,.04));
    border: 1px solid var(--rule);
    border-radius: 2px;
  }
  .pf-trk2-tick {
    position: absolute; top: 1px; bottom: 1px;
    width: 1.5px;
    background: var(--vermilion);
    box-shadow: 0 0 2px rgba(190,52,40,.35);
  }
  .pf-trk2-labels {
    position: relative;
    height: clamp(9px, 2.2cqi, 12px);
    margin-left: clamp(13px, 3cqi, 18px); margin-right: clamp(13px, 3cqi, 18px);
  }
  .pf-trk2-lbl {
    position: absolute; top: 0;
    transform: translateX(-50%);
    font-family: 'JetBrains Mono', monospace;
    font-size: clamp(7px, 1.8cqi, 9px);
    color: var(--ink-mute);
    white-space: nowrap;
    line-height: 1;
  }
  .pf-trk2-foot {
    font-family: 'JetBrains Mono', monospace;
    font-size: clamp(8px, 1.9cqi, 10px);
    color: var(--ink-mute);
    margin-top: 2px;
    white-space: nowrap;
    overflow: hidden; text-overflow: ellipsis;
  }
  .pf-trk2-foot strong { color: var(--vermilion); font-weight: 700; }

  /* mini viz · 06 chips */
  .pf-mini-lib {
    display: grid;
    grid-template-columns: repeat(4, 1fr);
    gap: 2px;
    width: 100%; align-self: stretch;
  }
  .pf-mini-lib-chip {
    padding: 2px 1px;
    border-radius: 1px;
    text-align: center;
    font-family: 'JetBrains Mono', monospace;
    font-size: 12px;
    background: var(--paper);
    border: 1px solid var(--rule);
    color: var(--ink-soft);
    line-height: 1.15;
    overflow: hidden;
  }
  .pf-mini-lib-chip.tier-good { background: rgba(22,97,171,.1); border-color: rgba(22,97,171,.5); color: var(--vermilion); }
  .pf-mini-lib-chip.tier-risk { background: rgba(192,48,48,.08); border-color: rgba(192,48,48,.4); color: #b03030; }

  /* mini viz · 08 七类相互作用信号灯 */
  .pf-mini-7way {
    display: grid;
    grid-template-columns: repeat(7, 1fr);
    gap: 3px;
    width: 100%; align-self: stretch;
  }
  .pf-mini-7way-cell {
    display: flex; flex-direction: column;
    align-items: center; justify-content: center;
    gap: 2px;
    padding: 2px 1px;
  }
  .pf-mini-7way-dot {
    width: 8px; height: 8px; border-radius: 50%;
    background: var(--ink-mute);
    flex-shrink: 0;
  }
  .pf-mini-7way-dot.good { background: var(--success); }
  .pf-mini-7way-dot.warn { background: var(--vermilion); }
  .pf-mini-7way-dot.risk { background: #c93838; }
  .pf-mini-7way-dot.na   { background: var(--ink-faint); opacity: 0.4; }
  .pf-mini-7way-lbl {
    font-family: 'JetBrains Mono', monospace;
    font-size: 12px; color: var(--ink-mute);
    letter-spacing: 0.04em;
    line-height: 1;
    text-align: center;
    overflow: hidden; text-overflow: ellipsis;
  }

  /* ═════ 深度研究总览 · mini viz（与 protein 同构，新增的几个 dr-* 样式） ═════ */
  .dr-hero-kg {
    width: 100%; height: 100%;
    display: flex; flex-direction: column;
    gap: 4px;
    min-width: 0; min-height: 0;
  }
  .dr-hero-kg > svg {
    flex: 1; min-height: 0;
    background: var(--paper);
    border-radius: 3px;
  }
  .dr-hero-legend {
    display: flex; flex-wrap: wrap; gap: 6px 10px;
    font-family: 'JetBrains Mono', monospace;
    font-size: 12px;
    color: var(--ink-soft);
    padding: 4px 2px 2px;
    line-height: 1.2;
    flex-shrink: 0;
  }
  .dr-hero-legend-item { display: inline-flex; align-items: center; gap: 4px; }
  .dr-hero-legend-item .dot {
    width: 8px; height: 8px; border-radius: 50%;
    flex-shrink: 0;
  }
  .dr-hero-legend-item .dot.gap {
    background: transparent;
    border: 1.4px dashed #c93838;
  }
  .dr-hero-legend-item.gap { color: #c93838; }

  /* 02 timeline bars */
  .dr-mini-years {
    width: 100%; height: 100%; align-self: stretch;
    display: flex; align-items: stretch;
    gap: 4px;
    padding: 4px 2px 2px;
    min-width: 0;
  }
  .dr-bar {
    flex: 1; min-width: 0;
    display: flex; flex-direction: column;
    align-items: center;
    justify-content: flex-end;
    gap: 2px;
    position: relative;
  }
  .dr-bar-fill {
    width: 70%;
    background: linear-gradient(to top, var(--vermilion), rgba(190,52,40,.45));
    border-radius: 2px 2px 0 0;
    min-height: 4px;
  }
  .dr-bar-n {
    position: absolute; top: 0;
    font-family: 'JetBrains Mono', monospace;
    font-size: 12px; color: var(--vermilion);
    font-weight: 700;
  }
  .dr-bar-x {
    font-family: 'JetBrains Mono', monospace;
    font-size: 12px; color: var(--ink-mute);
    line-height: 1;
  }

  /* 03 source chips */
  .dr-mini-srcs {
    width: 100%; height: 100%; align-self: stretch;
    display: flex; flex-direction: column;
    gap: 4px;
    padding: 2px;
    min-width: 0;
  }
  .dr-src-chip {
    display: flex; align-items: center; justify-content: space-between;
    gap: 6px;
    padding: 3px 6px;
    background: var(--paper-cool);
    border: 1px solid var(--rule);
    border-radius: 2px;
    font-family: 'JetBrains Mono', monospace;
  }
  .dr-src-chip .lbl { font-size: 12px; color: var(--ink-soft); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
  .dr-src-chip .n { font-size: 12px; color: var(--vermilion); font-weight: 700; flex-shrink: 0; }
  .dr-src-foot {
    font-family: 'JetBrains Mono', monospace;
    font-size: 12px;
    color: var(--ink-faint);
    margin-top: auto;
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
  }

  /* 04 read file chips */
  .dr-mini-reads {
    width: 100%; height: 100%; align-self: stretch;
    display: flex; flex-direction: column;
    gap: 2px;
    padding: 2px;
    min-width: 0;
    overflow: hidden;
  }
  .dr-file-chip {
    display: flex; flex-direction: column;
    padding: 2px 6px;
    background: var(--paper-cool);
    border-left: 2px solid var(--vermilion);
    border-radius: 1px;
    font-family: 'JetBrains Mono', monospace;
    line-height: 1.15;
    min-width: 0;
  }
  .dr-file-chip .n { font-size: 12px; color: var(--ink); font-weight: 600; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
  .dr-file-chip .s { font-size: 12px; color: var(--ink-faint); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }

  /* 05 KG stats */
  .dr-mini-kg-stats {
    width: 100%; height: 100%; align-self: stretch;
    display: flex; flex-direction: column;
    gap: 4px;
    padding: 2px;
    min-width: 0;
  }
  .dr-kg-stat {
    display: flex; flex-direction: column;
    gap: 1px;
    padding: 3px 5px;
    background: var(--paper-cool);
    border: 1px solid var(--rule);
    border-radius: 2px;
    font-family: 'JetBrains Mono', monospace;
    min-width: 0;
  }
  .dr-kg-stat .lbl {
    font-size: 12px; color: var(--ink-mute);
    letter-spacing: 0.12em;
  }
  .dr-kg-stat .val {
    font-size: 12px; color: var(--vermilion);
    font-weight: 700;
    line-height: 1.1;
  }
  .dr-kg-stat .sub {
    font-size: 12px; color: var(--ink-faint);
    line-height: 1.2;
    overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
  }

  /* 06 community bars */
  .dr-mini-comms {
    width: 100%; height: 100%; align-self: stretch;
    display: flex; flex-direction: column;
    gap: 2px;
    padding: 2px;
    min-width: 0;
    font-family: 'JetBrains Mono', monospace;
  }
  .dr-comm-row {
    display: flex; align-items: center; gap: 4px;
    font-size: 12px;
  }
  .dr-comm-lbl { color: var(--ink-soft); width: 32px; flex-shrink: 0; }
  .dr-comm-bar {
    flex: 1; height: 7px; min-width: 0;
    background: var(--paper-cool);
    border-radius: 2px;
    overflow: hidden;
  }
  .dr-comm-fill { height: 100%; min-width: 3px; border-radius: 2px; }
  .dr-comm-n { color: var(--ink-mute); width: 18px; text-align: right; flex-shrink: 0; }
  .dr-mini-comms-foot {
    margin-top: auto;
    padding-top: 2px;
    font-size: 12px;
    color: var(--ink-faint);
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
  }
  .dr-mini-comms-foot strong { color: var(--vermilion); font-weight: 700; }

  /* 08 gap chips */
  .dr-mini-gaps {
    width: 100%; height: 100%; align-self: stretch;
    display: grid;
    grid-template-columns: 1fr 1fr;
    gap: 3px;
    padding: 2px;
    min-width: 0;
  }
  .dr-gap-chip {
    display: flex; flex-direction: column;
    gap: 0px;
    padding: 3px 5px;
    background: rgba(192,48,48,.04);
    border: 1px dashed rgba(192,48,48,.4);
    border-radius: 2px;
    font-family: 'JetBrains Mono', monospace;
    overflow: hidden;
    min-width: 0;
  }
  .dr-gap-chip .lbl { font-size: 12px; color: #c93838; font-weight: 700; letter-spacing: 0.04em; }
  .dr-gap-chip .name { font-size: 12px; color: var(--ink); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
  .dr-gap-chip .meta { font-size: 12px; color: var(--ink-faint); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }

  /* 09 outputs */
  .dr-mini-outs {
    width: 100%; height: 100%; align-self: stretch;
    display: flex; flex-direction: column;
    gap: 3px;
    padding: 2px;
    min-width: 0;
  }
  .dr-out-chip {
    display: flex; align-items: center; gap: 6px;
    padding: 3px 6px;
    background: var(--paper-cool);
    border: 1px solid var(--rule);
    border-radius: 2px;
    font-family: 'JetBrains Mono', monospace;
    min-width: 0;
  }
  .dr-out-chip i {
    color: var(--vermilion);
    font-size: 13px;
    flex-shrink: 0;
  }
  .dr-out-chip > div { min-width: 0; overflow: hidden; flex: 1; }
  .dr-out-chip .n { font-size: 12px; color: var(--ink); font-weight: 600; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
  .dr-out-chip .s { font-size: 12px; color: var(--ink-faint); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }

  /* dr 抽屉 ring 整体样式调整 —— 把 hero 上 .pf-hero-3d 的最小高度收一些（因为是 SVG 而非 mol3d） */
  .dr-ring .pf-ring-hero .pf-hero-3d { min-height: 180px; padding: 6px; background: var(--paper-warm); }

  /* ─── 内部响应：drawer 窄宽度时降级 ─── */
  @media (max-width: 1400px) {
    .pf-main { grid-template-columns: minmax(0, 1.5fr) minmax(260px, 1fr); }
  }
  @media (max-width: 1000px) {
    .pf-main { grid-template-columns: 1fr; min-height: auto; }
    .pf-steps-strip { grid-template-columns: repeat(3, 1fr); flex: 0 0 auto; }
    .pf-target-tiles { grid-template-columns: repeat(3, 1fr); }
  }
  @media (max-width: 640px) {
    .pf-target-tiles { grid-template-columns: repeat(2, 1fr); }
    .pf-steps-strip { grid-template-columns: repeat(2, 1fr); }
  }

  /* （遗留）Strip ─ 旧的关键指标横条 */
  .pf-sum-strip {
    display: grid;
    grid-template-columns: repeat(6, 1fr);
    gap: 1px;
    background: var(--rule);
    border: 1px solid var(--rule);
    border-radius: 3px;
    overflow: hidden;
  }
  .pf-sum-strip-cell {
    background: var(--paper-cool);
    padding: 9px 12px;
    display: flex; flex-direction: column; gap: 2px;
  }
  .pf-sum-strip-label {
    font-family: 'JetBrains Mono', monospace;
    font-size: 12px; letter-spacing: 0.14em;
    color: var(--ink-mute); text-transform: uppercase;
  }
  .pf-sum-strip-val {
    font-family: 'JetBrains Mono', monospace;
    font-size: 13px; font-weight: 600; color: var(--ink);
  }
  .pf-sum-strip-val.accent { color: var(--vermilion); }
  .pf-sum-strip-val small {
    font-size: 12px; font-weight: 400; color: var(--ink-faint);
    margin-left: 3px;
  }
  .pf-sum-strip-sub {
    font-family: 'JetBrains Mono', monospace;
    font-size: 12px; color: var(--ink-faint);
  }

  /* Process steps grid ─ 02..09 共 8 张可视化卡（抽屉版 2 列）*/
  .pf-sum-steps {
    display: grid;
    grid-template-columns: repeat(2, 1fr);
    gap: 10px;
  }
  .pf-step {
    border: 1px solid var(--rule);
    border-radius: 3px;
    background: var(--paper);
    padding: 11px 12px 12px;
    display: flex; flex-direction: column; gap: 7px;
    min-height: 150px;
    position: relative;
  }
  .pf-step.span2 { grid-column: span 2; }

  /* 3D 结构卡：视觉中心 —— 全宽独占一行，明显加高 + 轻微强调边框 */
  .pf-step.is-3d {
    grid-column: 1 / -1;
    min-height: 420px;
    background: var(--paper-cool);
    border-color: var(--vermilion-soft);
    box-shadow: 0 1px 0 rgba(190,52,40,.06), 0 8px 24px -16px rgba(190,52,40,.18);
    padding: 12px 14px 14px;
  }
  .pf-step.is-3d .pf-step-name {
    color: var(--vermilion);
    font-size: 13px;
  }
  .pf-step.is-3d .pf-step-num {
    background: var(--vermilion);
    color: var(--paper);
  }
  .pf-step-head {
    display: flex; align-items: baseline; gap: 6px;
  }
  .pf-step-num {
    font-family: 'JetBrains Mono', monospace;
    font-size: 12px; letter-spacing: 0.14em;
    color: var(--vermilion); font-weight: 600;
    background: var(--vermilion-bg);
    padding: 1px 5px; border-radius: 2px;
  }
  .pf-step-name {
    font-family: 'Noto Serif SC', serif;
    font-size: 12px; font-weight: 600; color: var(--ink);
    letter-spacing: 0.02em;
  }
  .pf-step-meta {
    margin-left: auto;
    font-family: 'JetBrains Mono', monospace;
    font-size: 12px; color: var(--ink-faint);
  }
  .pf-step-viz {
    flex: 1; min-height: 0;
    display: flex; align-items: center; justify-content: center;
    background: var(--paper-warm);
    border-radius: 2px;
    padding: 8px 10px;
    position: relative;
    overflow: hidden;
  }
  .pf-step-viz svg { display: block; }
  .pf-step-note {
    font-size: 12px; color: var(--ink-mute);
    line-height: 1.5;
    font-family: 'JetBrains Mono', monospace;
  }
  .pf-step-note strong { color: var(--ink); font-weight: 600; }

  /* 02 · 序列预览 */
  .pf-seq {
    font-family: 'JetBrains Mono', monospace;
    font-size: 12px; line-height: 1.4;
    color: var(--ink-soft);
    word-break: break-all;
    text-align: left;
    align-self: stretch;
    padding: 4px;
  }
  .pf-seq .aa-H { color: #1a7a4a; }
  .pf-seq .aa-K { color: #b04000; }
  .pf-seq .aa-N { color: #781868; }
  .pf-seq .aa-P { color: #1a58b0; }
  .pf-seq .fade { color: var(--ink-faint); }

  /* 04 · 突变位置轨迹（219 长 bar + 22 个 tick） */
  .pf-trk {
    width: 100%; height: 28px;
    position: relative;
    background: var(--paper); border: 1px solid var(--rule);
    border-radius: 2px;
  }
  .pf-trk-tick {
    position: absolute; top: 4px; bottom: 4px;
    width: 1.5px;
    background: var(--vermilion);
  }
  .pf-trk-label {
    position: absolute; bottom: -14px;
    font-family: 'JetBrains Mono', monospace;
    font-size: 12px; color: var(--ink-faint);
    transform: translateX(-50%);
  }

  /* 06 · 单点库 chips */
  .pf-lib {
    display: grid;
    grid-template-columns: repeat(auto-fit, minmax(46px, 1fr));
    gap: 3px;
    align-self: stretch;
  }
  .pf-lib-chip {
    padding: 3px 4px;
    border-radius: 2px;
    text-align: center;
    font-family: 'JetBrains Mono', monospace;
    font-size: 12px;
    background: var(--paper); border: 1px solid var(--rule);
    color: var(--ink-soft);
  }
  .pf-lib-chip.tier-good { background: rgba(22,97,171,.1); border-color: rgba(22,97,171,.5); color: var(--vermilion); }
  .pf-lib-chip.tier-risk { background: rgba(192,48,48,.08); border-color: rgba(192,48,48,.4); color: #b03030; }

  /* 07 · mol3d 容器（hero） */
  .pf-3d {
    width: 100%; flex: 1; min-height: 340px;
    background: #0e1620;
    border-radius: 2px;
    position: relative;
    overflow: hidden;
  }
  .pf-3d-canvas { position: absolute; inset: 0; }
  .pf-3d-legend {
    position: absolute; bottom: 6px; left: 8px;
    font-family: 'JetBrains Mono', monospace;
    font-size: 12px; color: rgba(255,255,255,0.72);
    display: flex; gap: 10px;
  }
  .pf-3d-legend .dot {
    display: inline-block; width: 7px; height: 7px;
    border-radius: 50%;
    margin-right: 3px; vertical-align: middle;
  }
  .pf-3d-legend .dot.spec { background: linear-gradient(90deg,#3a6,#fc6); }
  .pf-3d-legend .dot.mut  { background: #e07030; }

  /* 08 · 7 类相互作用热图 */
  .pf-hm {
    width: 100%; align-self: stretch;
    display: grid; gap: 2px;
    font-family: 'JetBrains Mono', monospace;
    font-size: 12px;
  }
  .pf-hm-row { display: grid; grid-template-columns: 60px repeat(7, 1fr); gap: 2px; align-items: center; }
  .pf-hm-name { color: var(--ink-soft); padding-right: 4px; text-align: right; }
  .pf-hm-name.head { color: var(--ink-faint); font-size: 12px; }
  .pf-hm-cell {
    height: 16px; border-radius: 1px;
    display: flex; align-items: center; justify-content: center;
    font-size: 12px; color: rgba(255,255,255,0.85);
  }
  .pf-hm-cell.col-head { background: transparent; color: var(--ink-faint); font-size: 12px; letter-spacing: 0.06em; transform: rotate(-15deg); transform-origin: 50% 50%; height: 14px; }
  .pf-hm-cell.lv0 { background: rgba(22,97,171,.55); }   /* 有益 */
  .pf-hm-cell.lv1 { background: rgba(168,134,75,.55); }    /* 中性 */
  .pf-hm-cell.lv2 { background: rgba(192,48,48,.55); }      /* 有害 */
  .pf-hm-cell.lv3 { background: var(--paper); border:1px solid var(--rule); color: var(--ink-faint); }

  /* 09 · 综合排名柱图（紧凑 mini 版本：Top 5 + 推荐 tag） */
  .pf-rank-fill {
    flex: 1; min-height: 0;
    display: flex; flex-direction: column;
    gap: 3px;
    padding: 2px;
  }
  .pf-rank-fill .pf-rank-row {
    flex: 0 1 auto;
    min-height: 14px;
    margin-bottom: 0;
  }
  .pf-rank-row {
    display: grid;
    grid-template-columns: 42px 1fr 26px;
    gap: 5px; align-items: center;
    font-family: 'JetBrains Mono', monospace;
    font-size: 12px;
    padding: 1px 2px;
    border-radius: 2px;
    line-height: 1.2;
  }
  .pf-rank-row.is-top {
    grid-template-columns: 42px 1fr 26px;
    background: rgba(22,97,171,.08);
    box-shadow: inset 2px 0 0 var(--success);
    padding-left: 4px;
  }
  .pf-rank-row.is-top .pf-rank-name {
    color: var(--success); font-weight: 700;
  }
  .pf-rank-row.is-top .pf-rank-score {
    color: var(--success); font-weight: 700;
  }
  .pf-rank-row.is-top .pf-rank-tag {
    grid-column: 1 / -1;
    font-size: 12px;
    color: var(--success);
    letter-spacing: 0.06em;
    margin-top: 1px;
    text-align: left;
    padding-left: 2px;
  }
  .pf-rank-name { color: var(--ink); text-align: right; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
  .pf-rank-bar {
    height: 8px; min-width: 0;
    background: var(--paper-cool); border: 1px solid var(--rule);
    border-radius: 1px; position: relative; overflow: hidden;
  }
  .pf-rank-bar-fill { height: 100%; background: var(--vermilion); border-radius: 1px; }
  .pf-rank-bar-fill.tier-good { background: var(--success); }
  .pf-rank-bar-fill.tier-fair { background: var(--vermilion); opacity: 0.7; }
  .pf-rank-bar-fill.tier-risk { background: #c93838; opacity: 0.55; }
  .pf-rank-score { color: var(--ink); font-weight: 600; text-align: right; }
  .pf-rank-foot {
    margin-top: auto;
    font-size: 12px;
    color: var(--ink-faint);
    padding-top: 2px;
    overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
  }

  /* Verdict 双栏 + CTA */
  .pf-sum-verdict {
    display: grid;
    grid-template-columns: 1fr 1fr;
    gap: 12px;
  }
  .pf-sum-verdict-block {
    border: 1px solid var(--rule);
    border-radius: 3px;
    padding: 11px 14px;
  }
  .pf-sum-verdict-block.good { background: rgba(107,122,58,.04); border-color: rgba(107,122,58,.4); }
  .pf-sum-verdict-block.risk { background: rgba(192,48,48,.04); border-color: rgba(192,48,48,.4); }
  .pf-sum-verdict-eyebrow {
    font-family: 'JetBrains Mono', monospace;
    font-size: 12px; letter-spacing: 0.14em;
    text-transform: uppercase; margin-bottom: 4px;
  }
  .pf-sum-verdict-block.good .pf-sum-verdict-eyebrow { color: var(--success); }
  .pf-sum-verdict-block.risk .pf-sum-verdict-eyebrow { color: #c93838; }
  .pf-sum-verdict-title {
    font-family: 'JetBrains Mono', monospace;
    font-size: 13px; font-weight: 600; color: var(--ink);
    margin-bottom: 5px; letter-spacing: 0.02em;
  }
  .pf-sum-verdict-desc {
    font-size: 12px; color: var(--ink-soft); line-height: 1.6;
  }
  .pf-sum-verdict-desc em { color: var(--ink); font-style: italic; font-weight: 500; }

  .pf-sum-cta {
    display: flex; gap: 8px; flex-wrap: wrap;
    padding-top: 8px; border-top: 1px dashed var(--rule);
    align-items: center;
  }
  .pf-sum-cta-label {
    font-family: 'JetBrains Mono', monospace;
    font-size: 12px; letter-spacing: 0.14em;
    color: var(--ink-mute); text-transform: uppercase;
    margin-right: 4px;
  }
  .pf-sum-cta-btn {
    display: inline-flex; align-items: center; gap: 5px;
    padding: 6px 12px;
    border: 1px solid var(--rule);
    background: var(--paper);
    border-radius: 3px;
    font-size: 12px; color: var(--ink-soft);
    cursor: pointer;
    transition: all .15s;
    font-family: 'Inter','Noto Serif SC',sans-serif;
  }
  .pf-sum-cta-btn:hover {
    border-color: var(--ink-soft);
    color: var(--ink);
    background: var(--paper-warm);
  }
  .pf-sum-cta-btn.primary {
    background: var(--ink); color: var(--paper); border-color: var(--ink);
  }
  .pf-sum-cta-btn.primary:hover {
    background: var(--vermilion); border-color: var(--vermilion);
  }
  .pf-sum-cta-btn i { font-size: 12px; }

  /* ═════════════════════════════════════════════════════════
     有机反应条件优化 · 全流程总览抽屉内部样式（.or-sum-*）
     · 复用 .pf-sum-drawer 推开式 shell · 仅定义抽屉 body 内的内容样式
     · 三段渐进披露：反应式（hero）/ 参数空间 / 候选条件
     ═════════════════════════════════════════════════════════ */
  .or-sum-root { padding: 18px 22px 32px; }
  .or-sum-section { margin-bottom: 28px; transition: opacity .4s ease; }
  .or-sum-section.is-pending { opacity: 0.55; }
  .or-sum-section.is-revealing { animation: orSumFadeIn .5s ease both; }
  @keyframes orSumFadeIn {
    from { opacity: 0; transform: translateY(6px); }
    to   { opacity: 1; transform: translateY(0); }
  }
  .or-sum-h {
    font-family: 'Noto Serif SC', 'Songti SC', serif;
    font-size: 14px;
    font-weight: 500;
    color: var(--ink);
    letter-spacing: 0.04em;
    margin: 0 0 14px;
    padding-bottom: 9px;
    border-bottom: 1px solid var(--rule-soft);
    display: flex;
    align-items: center;
    gap: 10px;
  }
  /* 段号 chip · 与蛋白质 .pf-step-num 风格一致（mono 数字 + 浅底色方块）*/
  .or-sum-h-num {
    font-family: 'JetBrains Mono', monospace;
    font-size: 11px;
    font-weight: 600;
    letter-spacing: 0.14em;
    color: var(--vermilion);
    background: var(--vermilion-bg);
    border: 1px solid var(--vermilion-soft);
    padding: 2px 6px;
    border-radius: 2px;
    flex: 0 0 auto;
    font-style: normal;
  }
  .or-sum-h-eyebrow {
    margin-left: auto;
    font-family: 'JetBrains Mono', monospace;
    font-size: 9.5px;
    letter-spacing: 0.14em;
    color: var(--ink-faint);
    text-transform: uppercase;
    font-weight: 500;
  }
  .or-sum-pending {
    font-size: 12px;
    color: var(--ink-mute);
    font-style: italic;
    padding: 16px 18px;
    background: var(--paper-warm);
    border: 1px dashed var(--rule);
    border-radius: 2px;
    text-align: center;
  }
  .or-sum-pending i { margin-right: 6px; color: var(--ink-faint); }

  /* 优化目标提炼条（在抽屉头部下方 · or-input 解析完需求后即可见）*/
  .or-sum-goals-strip {
    flex-shrink: 0;
    display: flex;
    align-items: center;
    flex-wrap: wrap;
    gap: 6px 8px;
    padding: 9px 18px 11px;
    background: var(--paper-cool);   /* 夹在 head(paper) 与 body(paper-warm) 中间的过渡色 · chip 浮在浅底上更醒目 */
    border-bottom: 1px solid var(--rule-soft);
  }
  .or-sum-goals-label {
    font-family: 'Noto Serif SC', 'Songti SC', serif;
    font-size: 11.5px;
    font-weight: 500;
    color: var(--ink);
    letter-spacing: 0.04em;
    margin-right: 4px;
    flex: 0 0 auto;
  }
  .or-sum-goals-label::after {
    content: '：';
    color: var(--ink-mute);
  }
  .or-sum-goal-chip {
    font-family: 'JetBrains Mono', monospace;
    font-size: 10.5px;
    letter-spacing: 0.02em;
    padding: 2px 7px;
    border-radius: 2px;
    border: 1px solid var(--rule);
    background: var(--paper);
    color: var(--ink-soft);
    white-space: nowrap;
    flex: 0 0 auto;
  }
  .or-sum-goal-chip.primary {
    background: var(--vermilion-bg);
    color: var(--vermilion);
    border-color: var(--vermilion-soft);
    font-weight: 600;
  }

  /* —— ① 反应式区 —— */
  .or-rxn-scheme {
    background: var(--paper);   /* 比 drawer body(paper-warm) 浅一档 · 与 or-param-card / or-cand-table 同款"贴白纸"风格 */
    border: 1px solid var(--rule);
    border-radius: 3px;
    padding: 14px 12px 12px;
    display: flex;
    align-items: center;
    justify-content: center;
    gap: 4px;
    flex-wrap: nowrap;          /* 反应式必须在一行内 */
    overflow-x: auto;           /* 容器过窄时整体横向滚动，单个分子不被挤压 */
  }
  .or-rxn-mol {
    text-align: center;
    min-width: 116px;
    flex: 0 0 auto;             /* 不参与挤压 · 整组分子保持各自完整宽度 */
  }
  .or-rxn-mol svg {
    display: block;
    margin: 0 auto;
    width: 108px;               /* 显式收一档：双分子卡 108×90，产物分子卡按比例 */
    height: 90px;
  }
  .or-rxn-mol.is-product { min-width: 200px; }
  .or-rxn-mol.is-product svg { width: 196px; height: 90px; }
  .or-rxn-mol-name {
    margin-top: 5px;
    font-family: 'Noto Sans SC', sans-serif;
    font-size: 11px;
    color: var(--ink);
    font-weight: 500;
    line-height: 1.3;
  }
  .or-rxn-mol-role {
    font-family: 'JetBrains Mono', monospace;
    font-size: 9px;
    letter-spacing: 0.04em;
    color: var(--ink-faint);
    text-transform: uppercase;
    margin-top: 2px;
  }
  .or-rxn-mol-smiles {
    margin-top: 3px;
    font-family: 'JetBrains Mono', monospace;
    font-size: 9.5px;
    color: var(--ink-mute);
    word-break: break-all;
    line-height: 1.35;
  }
  .or-rxn-plus, .or-rxn-arrow {
    color: var(--ink-soft);
    flex: 0 0 auto;
  }
  /* 箭头+条件两行的中间柱 · 也强制不挤压 */
  .or-rxn-arrow-col {
    display: flex;
    flex-direction: column;
    align-items: center;
    padding: 0 4px;
    flex: 0 0 auto;
  }
  .or-rxn-arrow-label {
    font-family: 'JetBrains Mono', monospace;
    font-size: 10px;
    color: var(--vermilion);
    text-align: center;
    margin-top: 4px;
    letter-spacing: 0.02em;
    white-space: nowrap;        /* 条件标签不换行 · 与箭头同宽控制 */
  }
  .or-rxn-foot {
    margin-top: 12px;
    font-size: 11.5px;
    color: var(--ink-mute);
    line-height: 1.6;
    padding-left: 4px;
  }
  .or-rxn-foot strong { color: var(--ink); font-weight: 500; }

  /* —— ② 参数空间区 —— */
  .or-param-grid {
    display: grid;
    grid-template-columns: 1fr 1fr;
    gap: 12px;
  }
  .or-param-card {
    background: var(--paper);
    border: 1px solid var(--rule);
    border-radius: 3px;
    padding: 12px 14px 10px;
  }
  .or-param-card-h {
    display: flex;
    align-items: center;
    gap: 6px;
    font-family: 'Noto Sans SC', sans-serif;
    font-size: 12.5px;
    font-weight: 500;
    color: var(--ink);
    margin-bottom: 8px;
    padding-bottom: 6px;
    border-bottom: 1px solid var(--rule-soft);
  }
  .or-param-card-h i { color: var(--vermilion); font-size: 14px; }
  .or-param-card-h .dim-count {
    margin-left: auto;
    font-family: 'JetBrains Mono', monospace;
    font-size: 10px;
    color: var(--ink-faint);
    letter-spacing: 0.06em;
  }
  .or-param-cand {
    display: flex;
    align-items: flex-start;
    gap: 8px;
    padding: 4px 0;
    font-size: 11.5px;
    line-height: 1.45;
    color: var(--ink-mute);
  }
  .or-param-cand-tag {
    flex: 0 0 auto;
    font-family: 'JetBrains Mono', monospace;
    font-size: 10.5px;
    padding: 1px 6px;
    border-radius: 1px;
    border: 1px solid var(--rule);
    background: var(--paper-warm);
    color: var(--ink-soft);
    min-width: 76px;
    text-align: center;
    letter-spacing: 0.02em;
  }
  .or-param-cand.recommended .or-param-cand-tag {
    background: rgba(107,122,58,0.12);
    border-color: rgba(107,122,58,0.4);
    color: var(--success);
    font-weight: 500;
  }
  .or-param-cand.recommended .or-param-cand-note { color: var(--ink); }
  .or-param-cand.backup .or-param-cand-tag {
    background: rgba(22,97,171,0.06);
    border-color: rgba(22,97,171,0.25);
    color: var(--vermilion-soft);
  }
  .or-param-cand.baseline .or-param-cand-tag {
    background: var(--paper-warm);
    border-color: var(--rule);
    color: var(--ink-mute);
  }
  .or-param-cand.ruled-out .or-param-cand-tag {
    background: rgba(192,48,48,0.04);
    border-color: rgba(192,48,48,0.25);
    color: #c93838;
    text-decoration: line-through;
    text-decoration-color: rgba(192,48,48,0.5);
  }
  .or-param-cand.ruled-out .or-param-cand-note { color: var(--ink-faint); }
  .or-param-cand-note { flex: 1; font-size: 11px; color: var(--ink-mute); }

  /* 温度区间条 */
  .or-temp-bar {
    position: relative;
    height: 22px;
    background: linear-gradient(to right,
      rgba(168,134,75,.18) 0%,
      rgba(168,134,75,.18) 31%,
      rgba(107,122,58,.30) 31%,
      rgba(107,122,58,.30) 62%,
      rgba(192,48,48,.18) 62%,
      rgba(192,48,48,.18) 100%);
    border: 1px solid var(--rule);
    border-radius: 2px;
    margin: 6px 0 4px;
  }
  .or-temp-bar-mark {
    position: absolute;
    top: -3px;
    bottom: -3px;
    border-left: 1.5px dashed #c93838;
  }
  .or-temp-bar-mark::after {
    content: '50 °C';
    position: absolute;
    top: -16px;
    left: 50%;
    transform: translateX(-50%);
    font-family: 'JetBrains Mono', monospace;
    font-size: 9.5px;
    color: #c93838;
    white-space: nowrap;
  }
  .or-temp-legend {
    display: flex;
    justify-content: space-between;
    font-family: 'JetBrains Mono', monospace;
    font-size: 9.5px;
    color: var(--ink-mute);
    letter-spacing: 0.04em;
  }

  /* —— ③ 候选条件区 —— */
  .or-cand-table {
    width: 100%;
    border-collapse: collapse;
    font-size: 11.5px;
    background: var(--paper);
    border: 1px solid var(--rule);
  }
  .or-cand-table th {
    background: var(--paper-warm);
    color: var(--ink-soft);
    text-align: left;
    font-weight: 500;
    padding: 7px 8px;
    font-family: 'JetBrains Mono', monospace;
    font-size: 10px;
    letter-spacing: 0.08em;
    text-transform: uppercase;
    border-bottom: 1px solid var(--rule);
  }
  .or-cand-table td {
    padding: 8px;
    border-bottom: 1px solid var(--rule-soft);
    vertical-align: middle;
    color: var(--ink-mute);
  }
  .or-cand-table tr.zone-A td { background: rgba(107,122,58,0.04); }
  .or-cand-table tr.zone-B td { background: rgba(245,245,240,0.5); }
  .or-cand-table tr.zone-C td { background: rgba(168,134,75,0.04); }
  .or-cand-table tr.zone-D td { background: var(--paper); border-left: 2px dashed var(--rule); }
  .or-cand-well {
    font-family: 'JetBrains Mono', monospace;
    font-weight: 600;
    color: var(--ink);
    letter-spacing: 0.04em;
  }
  .or-cand-well .star {
    color: var(--vermilion);
    margin-left: 2px;
    font-size: 10px;
  }
  .or-cand-cond {
    color: var(--ink);
    font-family: 'Noto Sans SC', sans-serif;
    font-size: 11px;
    line-height: 1.5;
  }
  .or-cand-rationale {
    color: var(--ink-mute);
    font-size: 10.5px;
    font-style: italic;
    line-height: 1.4;
  }
  .or-cand-yield {
    min-width: 95px;
  }
  .or-cand-yield-bar {
    position: relative;
    height: 10px;
    background: var(--rule-soft);
    border-radius: 1px;
    overflow: hidden;
  }
  .or-cand-yield-fill {
    position: absolute;
    top: 0;
    bottom: 0;
    background: linear-gradient(to right, var(--success-bg), var(--success));
    border-right: 1.5px solid var(--success);
  }
  .or-cand-yield.low .or-cand-yield-fill {
    background: linear-gradient(to right, rgba(192,48,48,0.08), rgba(192,48,48,0.5));
    border-right-color: #c93838;
  }
  .or-cand-yield.mid .or-cand-yield-fill {
    background: linear-gradient(to right, rgba(168,134,75,0.12), rgba(168,134,75,0.7));
    border-right-color: var(--gold);
  }
  .or-cand-yield-label {
    font-family: 'JetBrains Mono', monospace;
    font-size: 9.5px;
    color: var(--ink-soft);
    margin-top: 2px;
    letter-spacing: 0.04em;
  }
  .or-cand-zone-legend {
    margin-top: 10px;
    display: flex;
    flex-wrap: wrap;
    gap: 12px;
    font-size: 10.5px;
    color: var(--ink-mute);
  }
  .or-cand-zone-legend .lz {
    display: inline-flex;
    align-items: center;
    gap: 5px;
  }
  .or-cand-zone-legend .lz::before {
    content: '';
    display: inline-block;
    width: 10px; height: 10px;
    border-radius: 1px;
    border: 1px solid var(--rule);
  }
  .or-cand-zone-legend .lz.la::before { background: rgba(107,122,58,0.18); }
  .or-cand-zone-legend .lz.lb::before { background: rgba(245,245,240,0.6); }
  .or-cand-zone-legend .lz.lc::before { background: rgba(168,134,75,0.14); }
  .or-cand-zone-legend .lz.ld::before { background: var(--paper); border-style: dashed; }

  /* ───── 对话流右下角 TOC 式抽屉锚点 ─────
     · 定位锚 = .chat-panel（chat 列）；right 偏移落在 chat 右边缘内，自然避开右侧 workspace
     · 条状 pill：1px 极淡边线 + paper-cool 微底；默认低存在感，hover 才提亮 vermilion */
  .chat-panel { position: relative; }
  .pf-sum-anchor {
    position: absolute;
    right: 24px;            /* 距 chat 列右缘 24px，留呼吸 */
    bottom: 128px;
    display: none;
    align-items: center;
    gap: 8px;
    height: 24px;
    padding: 0 10px 0 9px;
    border: 1px solid rgba(0,0,0,0.06);
    background: rgba(245,243,237,0.72);   /* paper-cool 半透明 */
    border-radius: 12px;
    cursor: pointer;
    color: var(--ink-mute);
    transition: color .15s, border-color .15s, background .15s, transform .18s, box-shadow .18s;
    z-index: 50;
    backdrop-filter: blur(4px);
    -webkit-backdrop-filter: blur(4px);
  }
  .pf-sum-anchor.visible {
    display: inline-flex;
    animation: pfAnchorIn .35s ease-out;
  }
  @keyframes pfAnchorIn {
    from { opacity: 0; transform: translateX(6px); }
    to   { opacity: 1; transform: translateX(0); }
  }
  .pf-sum-anchor:hover {
    color: var(--vermilion);
    border-color: rgba(190,52,40,0.30);
    background: var(--paper);
    transform: translateX(-2px);
    box-shadow: 0 3px 10px -4px rgba(190,52,40,0.15);
  }

  .pf-toc-bullet {
    width: 4px; height: 4px;
    border-radius: 50%;
    background: var(--ink-faint);
    flex-shrink: 0;
    transition: background .15s, width .15s, height .15s, box-shadow .15s;
  }
  .pf-sum-anchor:hover .pf-toc-bullet {
    background: var(--vermilion);
    width: 6px; height: 6px;
    box-shadow: 0 0 0 3px rgba(190,52,40,0.14);
  }

  .pf-toc-label {
    font-family: 'Noto Serif SC', serif;
    font-size: 12px;
    color: var(--ink-mute);
    letter-spacing: 0.04em;
    line-height: 1.2;
    white-space: nowrap;
    transition: color .15s;
  }
  .pf-sum-anchor:hover .pf-toc-label { color: var(--vermilion); }

  .pf-toc-go {
    display: inline-flex; align-items: center; justify-content: center;
    width: 10px; height: 10px;
    color: var(--vermilion);
    opacity: 0;
    transition: opacity .15s, transform .15s;
    flex-shrink: 0;
  }
  .pf-toc-go svg { width: 9px; height: 9px; display: block; }
  .pf-sum-anchor:hover .pf-toc-go {
    opacity: 0.85;
    transform: translate(1px, -1px);
  }

  /* hover tooltip · 抽屉内 tip 文案（仍保留，仅 hover 时浮出） */
  .pf-sum-anchor::after {
    content: attr(data-tip);
    position: absolute;
    right: calc(100% + 8px); top: 50%;
    transform: translateY(-50%) translateX(4px);
    padding: 4px 8px;
    background: var(--ink);
    color: var(--paper);
    font-family: 'JetBrains Mono', monospace;
    font-size: 12px;
    letter-spacing: 0.04em;
    border-radius: 2px;
    white-space: nowrap;
    opacity: 0;
    pointer-events: none;
    transition: opacity .2s ease .15s, transform .2s ease .15s;
  }
  .pf-sum-anchor:hover::after { opacity: 1; transform: translateY(-50%) translateX(0); }

  /* 滚动锚定到 Q&A 后短暂闪烁，复用 vermilion flash 风格 */
  @keyframes pfRoundFlash {
    0%   { box-shadow: 0 0 0 0 rgba(190,52,40,0); }
    40%  { box-shadow: 0 0 0 6px rgba(190,52,40,0.20); }
    100% { box-shadow: 0 0 0 0 rgba(190,52,40,0); }
  }
  .message-user.pf-round-flash .message-user-bubble {
    animation: pfRoundFlash 1.6s ease-out;
  }

  /* 自适应：默认 75vw，小屏放宽到 88-100vw 让出主体内容空间 */
  @media (max-width: 1100px) {
    .chat-wrap { --pf-sum-w: 88vw; }
  }
  @media (max-width: 768px) {
    .chat-wrap { --pf-sum-w: 100vw; }
  }

  /* ---- chain + spine ---- */
  .al-chain { display: flex; flex-direction: column; gap: 0; }

  .al-row {
    display: flex;
    gap: 0;
    position: relative;
    transition: opacity .25s ease;
  }
  .al-row.pending { opacity: 0.4; }

  .al-spine {
    width: 22px;
    flex-shrink: 0;
    display: flex;
    flex-direction: column;
    align-items: center;
    padding-top: 13px;
  }
  .al-row.is-think .al-spine { padding-top: 6px; }

  .al-spine-dot {
    width: 8px; height: 8px;
    border-radius: 50%;
    flex-shrink: 0;
    background: var(--paper);
    border: 1.5px solid var(--rule);
    box-sizing: border-box;
    z-index: 1;
    transition: all .25s ease;
  }
  .al-spine-dot.success { background: var(--vermilion); border-color: var(--vermilion); }
  .al-spine-dot.error   { background: var(--error);   border-color: var(--error); }
  .al-spine-dot.warning { background: var(--warning); border-color: var(--warning); }
  /* info / running · 实心蓝点 + 三维呼吸（opacity / scale / ring 同步脉动），
     跟 success 的"实心静止"自然区分 · running 在喘气，success 已落地 */
  .al-spine-dot.info,
  .al-spine-dot.running {
    background: var(--vermilion);
    border-color: var(--vermilion);
    animation: alDotBreath 1.6s ease-in-out infinite;
    transform-origin: center;
  }
  @keyframes alDotBreath {
    0%, 100% {
      opacity: 0.5;
      transform: scale(0.85);
      box-shadow: 0 0 0 0 rgba(22,97,171, 0);
    }
    50% {
      opacity: 1;
      transform: scale(1.12);
      box-shadow: 0 0 0 5px rgba(22,97,171, 0.18);
    }
  }
  /* Tabler loader-2 spin (Tabler 默认不自动旋转) */
  .al-pill i.ti-loader-2 { animation: alSpin 1s linear infinite; transform-origin: center; }
  @keyframes alSpin { to { transform: rotate(360deg); } }
  /* running head: 微微高亮 */
  .al-item-head.running {
    background: var(--vermilion-bg);
  }
  .al-item-head.running:hover {
    background: var(--vermilion-bg);
  }
  /* 新插入 row 的进入动效 — 自上而下平滑显现 */
  .al-just-in {
    animation: alSlideIn .35s ease-out;
  }
  @keyframes alSlideIn {
    from { opacity: 0; transform: translateY(-6px); }
    to   { opacity: 1; transform: translateY(0); }
  }

  .al-spine-line {
    width: 1px;
    background: var(--rule-soft);
    flex: 1;
    margin-top: 4px;
    min-height: 10px;
  }
  .al-row:last-of-type .al-spine-line { display: none; }

  /* ---- thinking step (left bar + italic text, no card) ---- */
  .al-think-body {
    flex: 1;
    min-width: 0;
    border-left: 2px solid var(--rule-soft);
    padding: 4px 12px;
    margin-bottom: 8px;
  }
  .al-think-body .al-think-text {
    font-size: 13px;
    color: var(--ink-mute);
    font-style: italic;
    line-height: 1.65;
    font-family: 'Noto Serif SC','Inter',sans-serif;
  }
  .al-think-body .al-think-text code {
    font-style: normal;
    font-family: 'JetBrains Mono', monospace;
    font-size: 12px;
    background: var(--paper-warm);
    padding: 1px 5px;
    border-radius: 3px;
    color: var(--ink-soft);
  }
  /* think 流式 markdown · 段落 / 列表 / 标题 紧凑 · 风格仍偏 italic 思考态 */
  .al-think-body .al-think-text p { margin: 4px 0; }
  .al-think-body .al-think-text strong { color: var(--ink); font-style: normal; }
  .al-think-body .al-think-text em { color: var(--ink-soft); }
  .al-think-body .al-think-text ul,
  .al-think-body .al-think-text ol { margin: 4px 0 4px 20px; padding: 0; font-style: normal; }
  .al-think-body .al-think-text li { margin-bottom: 2px; }
  .al-think-body .al-think-text h2,
  .al-think-body .al-think-text h3,
  .al-think-body .al-think-text h4 {
    font-size: 13px; font-weight: 600; font-style: normal;
    color: var(--ink); margin: 8px 0 4px;
    font-family: 'Inter','Noto Sans SC',sans-serif;
  }

  /* ───── final 区段 markdown 元素的统一样式 ─────
     已有 .al-final-body 容器样式（标题 / 段落由原有 al-final-* 控制），
     这里补 markdown 新增的 table / pre / blockquote / hr / del 等。
     同步覆盖 think 流式段也用到的这几个 block 元素 */
  .al-final-body .al-md-table,
  .al-think-body .al-md-table {
    width: 100%;
    border-collapse: collapse;
    margin: 10px 0;
    font-size: 12.5px;
    font-family: 'Inter','Noto Sans SC',sans-serif;
  }
  .al-final-body .al-md-table th,
  .al-final-body .al-md-table td,
  .al-think-body .al-md-table th,
  .al-think-body .al-md-table td {
    border: 1px solid var(--rule-soft);
    padding: 5px 9px;
    text-align: left;
    vertical-align: top;
  }
  .al-final-body .al-md-table th,
  .al-think-body .al-md-table th {
    background: var(--paper-warm);
    font-weight: 600;
    color: var(--ink);
    font-size: 12px;
    letter-spacing: 0.04em;
  }
  .al-final-body .al-md-pre,
  .al-think-body .al-md-pre {
    background: var(--paper-warm);
    border: 1px solid var(--rule-soft);
    border-radius: 4px;
    padding: 10px 12px;
    margin: 8px 0;
    overflow-x: auto;
    font-family: 'JetBrains Mono', monospace;
    font-size: 12px;
    line-height: 1.55;
    color: var(--ink-soft);
    font-style: normal;
  }
  .al-final-body .al-md-pre code,
  .al-think-body .al-md-pre code {
    background: transparent;
    padding: 0;
    border-radius: 0;
    font-size: 12px;
    font-family: inherit;
    color: inherit;
  }
  .al-final-body blockquote,
  .al-think-body blockquote {
    margin: 8px 0;
    padding: 4px 12px;
    border-left: 3px solid var(--vermilion-soft);
    background: rgba(196, 98, 47, 0.04);
    color: var(--ink-soft);
    font-style: italic;
  }
  .al-final-body blockquote p,
  .al-think-body blockquote p { margin: 2px 0; }
  .al-final-body hr,
  .al-think-body hr {
    border: 0;
    border-top: 1px dashed var(--rule);
    margin: 12px 0;
  }
  .al-final-body del,
  .al-think-body del { color: var(--ink-faint); }
  .al-final-body ol,
  .al-think-body ol { padding-left: 22px; }
  .al-final-body ol li,
  .al-think-body ol li { margin-bottom: 4px; }

  /* ───── ECharts plot 容器（make_plot 工具结果）───── */
  .al-plot-title {
    font-size: 12px;
    color: var(--ink-soft);
    font-weight: 500;
    margin-bottom: 6px;
    font-family: 'Inter','Noto Sans SC',sans-serif;
  }
  .al-plot-container {
    width: 100%;
    height: 320px;
    background: var(--paper);
    border: 1px solid var(--rule-soft);
    border-radius: 4px;
  }

  /* ───── KaTeX 数学块 ─────
     KaTeX 自带样式但在我们 al-body / al-think / al-final 容器里需要一些细化 */
  .katex-display {
    margin: 10px 0;
    overflow-x: auto;
    overflow-y: hidden;
  }
  .katex { font-size: 1.05em; }
  .al-think-body .katex { font-style: normal; }   /* think 段默认 italic · 公式回正 */
  .al-math-pending {
    font-family: 'JetBrains Mono', monospace;
    font-size: 12px;
    color: var(--ink-mute);
    background: var(--paper-warm);
    padding: 0 4px;
    border-radius: 2px;
  }
  .al-math-pending::before { content: '⟨'; opacity: 0.5; }
  .al-math-pending::after  { content: '⟩'; opacity: 0.5; }

  /* ---- ToolCallCard ---- */
  .al-item {
    flex: 1;
    min-width: 0;
    margin-bottom: 8px;
  }
  .al-item-head {
    display: flex;
    align-items: center;
    gap: 8px;
    padding: 7px 10px;
    border-radius: 6px;
    border: 0.5px solid var(--rule);
    background: var(--paper);
    cursor: pointer;
    user-select: none;
    transition: background .15s, border-color .15s;
  }
  .al-item-head:hover { background: var(--paper-warm); }
  .al-item-head.success { border-color: rgba(107,122,58,.4); }
  .al-item-head.error   { border-color: rgba(192,48,48,.4); }
  .al-item-head.warning { border-color: rgba(168,134,75,.4); }
  .al-item-head.info,
  .al-item-head.running { border-color: rgba(22,97,171,.4); }
  .al-item-head.open {
    border-radius: 6px 6px 0 0;
    border-bottom-color: transparent;
  }

  .al-item-icon {
    font-size: 14px;
    color: var(--ink-mute);
    width: 16px;
    flex-shrink: 0;
    line-height: 1;
    text-align: center;
  }
  .al-item-label {
    flex: 1;
    min-width: 0;
    display: flex;
    align-items: center;
    gap: 6px;
    flex-wrap: wrap;
    font-size: 13px;
    font-weight: 500;
    color: var(--ink);
  }
  .al-item-label code {
    font-family: 'JetBrains Mono', monospace;
    font-size: 12px;
    font-weight: 400;
    background: var(--paper-warm);
    color: var(--ink-soft);
    padding: 1px 6px;
    border-radius: 3px;
  }
  .al-item-desc {
    font-family: 'JetBrains Mono', monospace;
    font-size: 12px;
    color: var(--ink-mute);
    margin-left: auto;
    flex-shrink: 0;
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
    max-width: 50%;
  }
  .al-item-chev {
    width: 7px; height: 7px;
    border-right: 1.2px solid var(--ink-faint);
    border-bottom: 1.2px solid var(--ink-faint);
    transform: rotate(45deg);          /* 默认展开 → 向下 ▼ */
    transition: transform .2s ease;
    margin-left: 4px;
    flex-shrink: 0;
  }
  .al-item.collapsed .al-item-chev {
    transform: rotate(-45deg);          /* 折叠状态 → 向右 ▶ */
  }
  .al-item-head.no-body .al-item-chev { visibility: hidden; }

  /* 真后端 · tool running 占位 · 等 tool_result 来再换 */
  .al-tool-pending {
    display: inline-flex;
    align-items: center;
    gap: 6px;
    font-size: 12px;
    color: var(--ink-mute);
    font-style: italic;
    padding: 6px 2px;
  }
  .al-tool-pending code {
    font-style: normal;
    font-family: 'JetBrains Mono', monospace;
    font-size: 11.5px;
    background: var(--paper-warm);
    padding: 1px 6px;
    border-radius: 3px;
    color: var(--ink-soft);
  }
  .al-tool-pending .ti-spin {
    animation: alSpin 1.1s linear infinite;
    font-size: 13px;
  }
  @keyframes alSpin { to { transform: rotate(360deg); } }

  /* 默认展开内联展示工具输出 */
  .al-item-body {
    border: 0.5px solid var(--rule);
    border-top: none;
    border-radius: 0 0 6px 6px;
    background: var(--paper-warm);
    overflow: hidden;
    display: block;
  }
  .al-item.collapsed .al-item-body { display: none; }
  /* 展开态时头部下边消除圆角，与 body 拼接 */
  .al-item:not(.collapsed) .al-item-head {
    border-radius: 6px 6px 0 0;
    border-bottom-color: transparent;
  }
  /* 折叠态：完整闭合矩形（必须压过遗留 .open 的圆角设定） */
  .al-item.collapsed .al-item-head,
  .al-item.collapsed .al-item-head.open {
    border-radius: 6px;
    border-bottom-color: var(--rule);
  }
  /* 留作兼容：.open 仅在未折叠时起视觉作用 */
  .al-item:not(.collapsed) .al-item-head.open {
    border-radius: 6px 6px 0 0;
  }

  /* 工具栏右侧的折叠/展开全部按钮（极简、低调） */
  .al-toolbar-collapse {
    width: 20px;
    height: 20px;
    border: none;
    background: transparent;
    color: var(--ink-faint);
    cursor: pointer;
    padding: 0;
    display: inline-flex;
    align-items: center;
    justify-content: center;
    border-radius: 3px;
    transition: color .15s, background .15s;
    margin-left: auto;
  }
  .al-toolbar-collapse:hover {
    color: var(--ink-soft);
    background: var(--paper-warm);
  }
  .al-toolbar-collapse i { font-size: 14px; line-height: 1; }

  .al-body-sec {
    padding: 9px 12px;
    border-bottom: 0.5px solid var(--rule-soft);
    font-size: 12px;
    color: var(--ink-soft);
    line-height: 1.6;
  }
  .al-body-sec:last-child { border-bottom: none; }
  /* note kind 的 body 富文本元素 · 让 <ul>/<li>/<p>/<code>/<strong> 显示更整齐 */
  .al-body-sec > p { margin: 4px 0; }
  .al-body-sec > p:first-child { margin-top: 0; }
  .al-body-sec > p:last-child  { margin-bottom: 0; }
  .al-body-sec ul, .al-body-sec ol {
    margin: 6px 0;
    padding-left: 18px;
  }
  .al-body-sec li { margin: 3px 0; line-height: 1.55; }
  .al-body-sec code {
    background: var(--paper-warm);
    padding: 1px 5px;
    border-radius: 2px;
    font-family: 'JetBrains Mono', monospace;
    font-size: 12px;
    color: var(--vermilion);
  }
  .al-body-sec strong { color: var(--ink); font-weight: 600; }
  .al-body-sec em { color: var(--vermilion); font-style: normal; }
  .al-body-sec-label {
    font-family: 'JetBrains Mono', monospace;
    font-size: 12px;
    color: var(--ink-mute);
    letter-spacing: 0.12em;
    text-transform: uppercase;
    margin-bottom: 5px;
  }
  .al-body-mono {
    font-family: 'JetBrains Mono', monospace;
    font-size: 12px;
    color: var(--ink-soft);
  }

  /* ---- sub-list (merged tool, e.g., multiple read_file) ---- */
  .al-sub-item {
    display: flex;
    align-items: center;
    gap: 9px;
    padding: 6px 0;
    border-bottom: 0.5px solid var(--rule-soft);
  }
  .al-sub-item:last-child { border-bottom: none; }
  .al-sub-item:first-child { padding-top: 0; }
  .al-sub-dot {
    width: 6px; height: 6px;
    border-radius: 50%;
    flex-shrink: 0;
    background: var(--rule);
  }
  .al-sub-dot.success { background: var(--success); }
  .al-sub-dot.running { background: var(--vermilion); }
  .al-sub-dot.error   { background: var(--error); }
  .al-sub-info { flex: 1; min-width: 0; display: flex; align-items: baseline; gap: 8px; flex-wrap: wrap; }
  .al-sub-name {
    font-size: 12px;
    font-weight: 500;
    color: var(--ink);
  }
  .al-sub-path {
    font-family: 'JetBrains Mono', monospace;
    font-size: 12px;
    color: var(--ink-mute);
  }

  /* ---- bash terminal ---- */
  .al-bash {
    background: #141414;
    color: #d8d8d8;
    font-family: 'JetBrains Mono', monospace;
    font-size: 12px;
    line-height: 1.7;
    padding: 9px 12px;
    position: relative;
    overflow-x: auto;
  }
  .al-bash-time {
    position: absolute;
    top: 7px; right: 12px;
    color: #555;
    font-size: 12px;
  }
  .al-bash .t-cmd { color: #7ec8e3; }
  .al-bash .t-out { color: #888; }
  .al-bash .t-ok  { color: #6db66d; }
  .al-bash .t-err { color: #e88; }
  .al-bash > div { white-space: pre-wrap; }

  /* ---- confirm bar (dangerous bash) ---- */
  .al-confirm-bar {
    background: var(--warning-bg);
    border-top: 0.5px solid rgba(168,134,75,.35);
    padding: 9px 12px;
    display: flex;
    align-items: center;
    gap: 8px;
  }
  .al-confirm-warn {
    font-size: 12px;
    color: var(--warning);
    flex: 1;
    display: flex;
    align-items: center;
    gap: 5px;
  }
  .al-confirm-warn i { font-size: 13px; }
  .al-confirm-btn {
    font-family: 'Inter', sans-serif;
    font-size: 12px;
    padding: 4px 10px;
    border-radius: 4px;
    border: 0.5px solid var(--rule);
    background: var(--paper);
    color: var(--ink-soft);
    cursor: pointer;
    transition: all .15s;
  }
  .al-confirm-btn:hover { background: var(--paper-warm); color: var(--ink); }
  .al-confirm-btn.primary {
    background: var(--warning);
    border-color: var(--warning);
    color: var(--paper);
    font-weight: 500;
  }
  .al-confirm-btn.primary:hover { opacity: 0.9; }

  /* ---- diff view (edit_file) · 全黑 VSCode 风格 + Python 语法高亮 ----
     · 背景 #0a0a0a 接近全黑（用户要求）· 文字 #d4d4d4
     · 顶部 fake tab bar 模拟编辑器标签 · 三个 macOS 风格圆点
     · add 行：左侧绿色 stripe + 浅绿底 · del 行：红色 · ctx：灰色 */
  .al-diff {
    font-family: 'JetBrains Mono', 'SF Mono', 'Consolas', 'Monaco', monospace;
    font-size: 12px;
    line-height: 1.65;
    background: #0a0a0a;
    color: #d4d4d4;
    border: 1px solid #1a1a1a;
    border-radius: 5px;
    padding: 10px 0;
    overflow-x: auto;
    position: relative;
  }
  .al-diff::before {
    content: '';
    display: block;
    height: 8px;
    background:
      radial-gradient(circle at 14px 4px, #ff5f56 3px, transparent 3.5px),
      radial-gradient(circle at 30px 4px, #ffbd2e 3px, transparent 3.5px),
      radial-gradient(circle at 46px 4px, #27c93f 3px, transparent 3.5px),
      linear-gradient(to bottom, #161616 0, #161616 100%);
    border-bottom: 1px solid #1a1a1a;
    margin: -10px 0 8px;
  }
  .al-diff-line {
    display: block;
    padding: 0 16px;
    white-space: pre;
    min-height: 1.65em;
  }
  .al-diff-line:hover { background: rgba(255,255,255,0.025); }
  .al-diff-add {
    background: rgba(64,160,80,0.10);
    color: #d4d4d4;
    border-left: 3px solid #4a8a4a;
    padding-left: 13px;
  }
  .al-diff-del {
    background: rgba(220,70,70,0.10);
    color: #d4d4d4;
    border-left: 3px solid #b04040;
    padding-left: 13px;
  }
  .al-diff-ctx {
    color: #707070;
    padding-left: 16px;
  }

  /* ── Python 语法高亮 token 配色（VSCode Dark+ 同款） ── */
  .al-diff--py .hl-kw       { color: #569cd6; }       /* def / class / import / if / return 等 */
  .al-diff--py .hl-builtin  { color: #4ec9b0; }       /* print / len / range / self / cls 等 */
  .al-diff--py .hl-str      { color: #ce9178; }       /* "abc" / 'xyz' */
  .al-diff--py .hl-comment  { color: #6a9955; font-style: italic; }  /* # ... */
  .al-diff--py .hl-fn       { color: #dcdcaa; }       /* def 后的函数名 */
  .al-diff--py .hl-num      { color: #b5cea8; }       /* 数字 */
  .al-diff--py .hl-decorator{ color: #c586c0; }       /* @staticmethod 等 */

  /* 滚动条 · 暗色主题 */
  .al-diff::-webkit-scrollbar { height: 8px; }
  .al-diff::-webkit-scrollbar-track { background: #0a0a0a; }
  .al-diff::-webkit-scrollbar-thumb { background: #2a2a2a; border-radius: 4px; }
  .al-diff::-webkit-scrollbar-thumb:hover { background: #3a3a3a; }

  /* ---- grep matches ---- */
  .al-search-match {
    display: flex;
    gap: 9px;
    font-family: 'JetBrains Mono', monospace;
    font-size: 12px;
    color: var(--ink-soft);
    padding: 3px 0;
  }
  .al-search-file { color: var(--vermilion); }
  .al-search-more {
    font-size: 12px;
    color: var(--ink-mute);
    padding-top: 5px;
    font-family: 'JetBrains Mono', monospace;
  }

  /* ---- verify wrapper ---- */
  .al-verify {
    margin-bottom: 8px;
    border-left: 2px solid rgba(107,122,58,.5);
    padding-left: 12px;
    margin-left: 14px;
  }
  .al-verify-label {
    display: flex;
    align-items: center;
    gap: 5px;
    font-family: 'JetBrains Mono', monospace;
    font-size: 12px;
    font-weight: 500;
    color: var(--success);
    letter-spacing: 0.08em;
    text-transform: uppercase;
    margin-bottom: 8px;
  }
  .al-verify-label i { font-size: 12px; }
  /* verify 内部的 row 复用 .al-row 样式，但缩小 spine 区域 */
  .al-verify .al-row { gap: 0; }

  /* ---- final response ---- */
  .al-final {
    margin-top: 14px;
    padding-top: 14px;
    border-top: 0.5px solid var(--rule-soft);
  }
  .al-final-label {
    font-family: 'JetBrains Mono', monospace;
    font-size: 12px;
    font-weight: 500;
    color: var(--ink-mute);
    letter-spacing: 0.12em;
    text-transform: uppercase;
    margin-bottom: 7px;
  }
  .al-final-text {
    font-size: 14px;
    color: var(--ink);
    line-height: 1.75;
  }
  .al-final-text p {
    margin: 0 0 12px;
  }
  .al-final-text p:last-child { margin-bottom: 0; }
  .al-final-text code {
    font-family: 'JetBrains Mono', monospace;
    font-size: 12px;
    background: var(--paper-warm);
    color: var(--ink-soft);
    padding: 1px 6px;
    border-radius: 3px;
  }
  .al-final-text strong {
    font-weight: 500;
    color: var(--vermilion);
  }
  .al-final-text em {
    font-style: italic;
    color: var(--ink-soft);
  }

  /* 干实验方案 · 富内容 final summary（推演结论 / 设计参数 / KPI 表 / 风险 / 下一步） */
  .al-final-summary h4 {
    font-family: 'Noto Serif SC', serif;
    font-size: 13px;
    font-weight: 600;
    color: var(--vermilion);
    letter-spacing: 0.04em;
    margin: 18px 0 8px;
    padding-left: 10px;
    border-left: 3px solid var(--vermilion);
  }
  .al-final-summary h4:first-child { margin-top: 4px; }
  .al-final-summary p {
    font-size: 13px;
    line-height: 1.75;
    color: var(--ink-soft);
    margin: 0 0 10px;
  }
  .al-final-summary ul {
    margin: 6px 0 12px;
    padding-left: 22px;
    list-style: square;
  }
  .al-final-summary ul li {
    font-size: 13px;
    line-height: 1.7;
    color: var(--ink-soft);
    margin-bottom: 4px;
  }
  .al-final-summary code {
    font-family: 'JetBrains Mono', monospace;
    font-size: 12px;
    padding: 1px 5px;
    background: var(--paper-warm);
    border: 1px solid var(--rule);
    border-radius: 2px;
    color: var(--vermilion);
  }
  .al-final-summary strong { color: var(--ink); font-weight: 600; }
  .al-final-summary em { font-style: italic; color: var(--ink); }
  /* KPI 比对表格 */
  .al-final-summary .al-kpi-table {
    width: 100%;
    border-collapse: collapse;
    font-family: 'JetBrains Mono', monospace;
    font-size: 12px;
    margin: 8px 0 14px;
    background: var(--paper);
    border: 1px solid var(--rule);
  }
  .al-kpi-table thead th {
    background: var(--paper-cool);
    color: var(--ink-mute);
    font-weight: 500;
    text-align: left;
    padding: 7px 10px;
    border-bottom: 1px solid var(--rule);
    letter-spacing: 0.08em;
    font-size: 12px;
    text-transform: uppercase;
  }
  .al-kpi-table tbody td {
    padding: 6px 10px;
    border-bottom: 1px solid var(--rule-soft);
    color: var(--ink-soft);
  }
  .al-kpi-table tbody tr:last-child td { border-bottom: none; }
  .al-kpi-table tbody td strong { color: var(--ink); font-weight: 600; }
  .al-kpi-table tbody td.ok {
    color: var(--vermilion);
    font-weight: 600;
    letter-spacing: 0.04em;
  }

  /* ---- al-final · WT → 突变态 序列 diff 卡片 ---- */
  .al-mut-diff {
    margin-top: 16px;
    border: 1px solid var(--rule);
    border-radius: 4px;
    background: var(--paper);
    overflow: hidden;
  }
  .al-mut-diff-header {
    display: flex;
    align-items: baseline;
    justify-content: space-between;
    padding: 9px 14px;
    border-bottom: 1px solid var(--rule-soft);
    background: var(--paper-cool);
  }
  .al-mut-diff-header-title {
    font-family: 'Noto Serif SC', serif;
    font-size: 13px;
    font-weight: 600;
    color: var(--vermilion);
    letter-spacing: 0.04em;
  }
  .al-mut-diff-header-meta {
    font-family: 'JetBrains Mono', monospace;
    font-size: 11px;
    color: var(--ink-mute);
    letter-spacing: 0.06em;
  }
  .al-mut-diff-body {
    padding: 12px 14px 6px;
    display: flex;
    flex-direction: column;
    gap: 10px;
    overflow-x: auto;
  }
  .al-mut-diff-row {
    display: grid;
    grid-template-columns: 36px 1fr;
    gap: 10px;
    align-items: start;
  }
  .al-mut-diff-row.is-quiet { opacity: 0.78; }
  .al-mut-diff-pos {
    font-family: 'JetBrains Mono', monospace;
    font-size: 11px;
    color: var(--ink-mute);
    text-align: right;
    padding-top: 3px;
    user-select: none;
  }
  .al-mut-diff-lines {
    display: flex;
    flex-direction: column;
    gap: 2px;
    min-width: 0;
  }
  .al-mut-diff-line {
    display: flex;
    gap: 8px;
    align-items: center;
  }
  .al-mut-diff-tag {
    font-family: 'JetBrains Mono', monospace;
    font-size: 10px;
    letter-spacing: 0.06em;
    width: 30px;
    flex-shrink: 0;
    text-align: center;
    padding: 2px 4px;
    border-radius: 2px;
    background: var(--paper-warm);
    color: var(--ink-mute);
    user-select: none;
  }
  .al-mut-diff-tag.mut {
    background: var(--vermilion-bg);
    color: var(--vermilion);
    font-weight: 600;
  }
  .al-mut-diff-seq {
    font-family: 'JetBrains Mono', monospace;
    font-size: 12.5px;
    line-height: 1.55;
    color: var(--ink-soft);
    letter-spacing: 0;
    white-space: nowrap;
  }
  .al-mut-diff-cell {
    display: inline-block;
    width: 1ch;
    text-align: center;
    position: relative;
  }
  .al-mut-diff-cell.wt-changed {
    background: var(--paper-warm);
    color: var(--ink-mute);
    text-decoration: line-through;
    text-decoration-color: var(--mut-color, var(--vermilion));
    text-decoration-thickness: 1.5px;
    border-radius: 2px;
  }
  .al-mut-diff-cell.mut-new {
    color: #fff;
    font-weight: 600;
    border-radius: 2px;
    cursor: default;
  }
  .al-mut-diff-pills {
    display: flex;
    flex-wrap: wrap;
    gap: 6px;
    padding: 10px 14px 12px;
    border-top: 1px solid var(--rule-soft);
    background: var(--paper-warm);
  }
  .al-mut-diff-pill {
    display: inline-flex;
    align-items: center;
    gap: 6px;
    padding: 3px 9px 3px 7px;
    background: var(--paper);
    border: 1px solid var(--rule);
    border-radius: 11px;
    font-family: 'JetBrains Mono', monospace;
    font-size: 11px;
    color: var(--ink);
    cursor: default;
    transition: border-color .12s, background .12s;
  }
  .al-mut-diff-pill:hover {
    border-color: var(--ink-mute);
    background: var(--paper-cool);
  }
  .al-mut-diff-pill-dot {
    width: 7px; height: 7px;
    border-radius: 50%;
    flex-shrink: 0;
  }
  .al-mut-diff-pill-label {
    font-weight: 600;
    color: var(--ink);
  }
  .al-mut-diff-pill-score {
    color: var(--ink-mute);
    font-weight: 400;
  }

  /* ═══════════════════════════════════════════════════════════════
     pf-proc · 蛋白质场景"推理过程"模块（挂在 proteinFullSumDrawer 顶部）
     · 跟随剧本逐节滑入，AMIX 10 轮 / Top-10 / mut-diff / 频谱 / 库 / 排名 / 推荐
     ═══════════════════════════════════════════════════════════════ */
  .pf-sum-process-body { padding: 0; }
  .pf-sum-process-body:empty { display: none; }
  .pf-proc-host { background: linear-gradient(180deg, rgba(190,52,40,0.025) 0%, rgba(0,0,0,0) 220px); }

  /* ── 推理流程 preamble · 品牌蓝玻璃卡
     · 接近不透明 (95%) 品牌蓝底 · 避免半透与暖纸 body 的混浊
     · 玻璃质感靠内顶光泽 + 浅蓝浮影呈现，而非高透明 ── */
  .pf-preamble {
    margin: 14px 18px 14px;
    padding: 16px 20px 18px;
    background: rgba(233, 240, 249, 0.95);                    /* vermilion-bg @ 95% · 接近实色但保留 1px 玻璃感 */
    border: 1px solid rgba(22, 97, 171, 0.18);
    border-radius: 4px;
    backdrop-filter: blur(8px) saturate(1.2);
    -webkit-backdrop-filter: blur(8px) saturate(1.2);
    box-shadow:
      inset 0 1px 0 rgba(255, 255, 255, 0.75),                /* 顶部白光泽 · 玻璃质感 */
      0 2px 10px rgba(22, 97, 171, 0.08);                     /* 浅蓝浮影 · 与底色同 hue */
  }
  .pf-preamble-line {
    display: flex;
    align-items: baseline;
    gap: 10px;
    margin-bottom: 6px;
    line-height: 1.5;
  }
  .pf-preamble-line:last-of-type { margin-bottom: 8px; }
  /* 第一行（优化目标）= 主信息 · 加大字号形成"主→副→数据"三级层级 */
  .pf-preamble-line:first-of-type {
    margin-bottom: 8px;
    align-items: baseline;
  }
  .pf-preamble-line:first-of-type .pf-preamble-tag { font-size: 13px; }
  .pf-preamble-line:first-of-type .pf-preamble-val { font-size: 14.5px; line-height: 1.45; color: var(--ink); font-weight: 600; }
  .pf-preamble-tag {
    font-family: 'Noto Serif SC', 'Songti SC', serif;
    font-size: 11.5px;
    font-weight: 700;                      /* 加粗 · 与 body 普通文字形成清晰层级 */
    color: var(--ink);
    letter-spacing: 0.06em;
    flex: 0 0 auto;
  }
  .pf-preamble-tag::after {
    content: '：';
    color: var(--ink-mute);
  }
  .pf-preamble-val {
    font-size: 12px;
    color: var(--ink-soft);
    font-weight: 500;
    letter-spacing: 0.02em;
  }
  .pf-preamble-meta {
    font-family: 'JetBrains Mono', monospace;
    font-size: 10px;
    letter-spacing: 0.1em;
    color: var(--ink-faint);
    text-transform: uppercase;
    font-weight: 500;
  }
  /* 序列块 · 不再做独立卡，而是 preamble 内部的"数据段"
     · 取消单独底色与四边框，只保留顶部虚线分隔 + monospace 字体（保留数据语义）
     · 顶部虚线用中性 rgba ink，与新的中性 frosted glass preamble 不引入新 hue */
  .pf-preamble-seq {
    margin-top: 8px;
    padding-top: 8px;
    border-top: 1px dashed rgba(22, 97, 171, 0.22);
    font-family: 'JetBrains Mono', monospace;
    font-size: 11px;
    letter-spacing: 0.05em;
    color: var(--ink);
    line-height: 1.75;
    word-break: break-all;
    background: transparent;
  }

  /* ── 推理流程 sticky stepper · 7 步 · 数字徽章卡片风格
     · 背景全透明 · 借用抽屉 body 的暖纸作底
     · 保留 backdrop-filter blur 让滚动到下方的内容浮过 stepper 时维持可读性 ── */
  .pf-stepper {
    position: sticky;
    top: 0;
    z-index: 5;
    background: transparent;
    backdrop-filter: blur(6px);
    -webkit-backdrop-filter: blur(6px);
    border-bottom: 1px solid var(--rule-soft);
    padding: 14px 22px 14px;
  }
  .pf-stepper-list {
    display: flex;
    align-items: flex-start;
    list-style: none;
    margin: 0;
    padding: 0;
    gap: 0;
  }
  .pf-stepper-step {
    display: flex; flex-direction: column;
    align-items: center;
    gap: 7px;
    flex: 0 0 auto;
    min-width: 64px;
    position: relative;
    cursor: default;
  }
  /* 连接线 · 三态：pending / done / flowing */
  .pf-stepper-conn {
    flex: 1 1 auto;
    height: 2px;
    min-width: 18px;
    margin-top: 10px;                    /* 与 22px 徽章中心对齐 */
    background: rgba(0,0,0,0.1);
    border-radius: 1px;
    transition: background .35s ease;
    overflow: hidden;                    /* 给 flow shimmer 用 */
    position: relative;
  }
  .pf-stepper-conn.is-done {
    background: var(--vermilion);
  }
  /* flowing · 能量从左往右传 · linear-gradient + background-position shift */
  .pf-stepper-conn.is-flowing {
    background-image: linear-gradient(
      90deg,
      var(--vermilion) 0%,
      rgba(190,52,40,0.95) 35%,
      rgba(255,255,255,0.6) 50%,
      rgba(190,52,40,0.95) 65%,
      var(--vermilion) 100%
    );
    background-size: 220% 100%;
    background-color: var(--vermilion);
    animation: pfStepperFlow 1.6s linear infinite;
  }
  @keyframes pfStepperFlow {
    from { background-position: 100% 0; }
    to   { background-position: -100% 0; }
  }

  /* 占位但不可见：保持槽位让 7 个 step 位置完全固定 */
  .pf-stepper-step.is-hidden,
  .pf-stepper-conn.is-hidden {
    opacity: 0;
    visibility: hidden;
  }
  /* 渐进 reveal：新可见的 step / connector 入场动画 */
  .pf-stepper-step.is-appearing,
  .pf-stepper-conn.is-appearing {
    animation: pfStepperAppear .42s cubic-bezier(.22,.8,.26,1);
  }
  @keyframes pfStepperAppear {
    from { opacity: 0; transform: scale(0.7); }
    to   { opacity: 1; transform: scale(1); }
  }

  /* 数字徽章方块 · pending baseline */
  .pf-stepper-dot {
    width: 22px; height: 22px;
    border-radius: 3px;
    display: inline-flex; align-items: center; justify-content: center;
    background: var(--paper);
    border: 1.5px solid rgba(0,0,0,0.16);
    font-family: 'JetBrains Mono', monospace;
    font-size: 10.5px;
    font-weight: 600;
    color: var(--ink-faint);
    transition: all .25s cubic-bezier(.22,.8,.26,1);
    position: relative;
  }
  .pf-stepper-num { display: inline; line-height: 1; }

  .pf-stepper-label {
    font-family: 'Noto Serif SC', serif;
    font-size: 12px;
    color: var(--ink-faint);
    letter-spacing: 0.02em;
    white-space: nowrap;
    transition: color .25s, font-weight .25s;
    display: inline-flex; align-items: baseline; gap: 4px;
  }
  /* 标签前的两位数字序号 · 蒙板低存在感 · 跟随父态变色 */
  .pf-stepper-label-num {
    font-family: 'JetBrains Mono', monospace;
    font-size: 9.5px;
    color: var(--ink-faint);
    opacity: 0.7;
    letter-spacing: 0;
    transition: color .25s, opacity .25s;
  }
  .pf-stepper-step.is-active .pf-stepper-label-num,
  .pf-stepper-step.is-done .pf-stepper-label-num {
    color: inherit;
    opacity: 0.85;
  }

  /* active · vermilion 描边 + vermilion 数字 + 软 pulse 阴影 + 标签加粗 */
  .pf-stepper-step.is-active .pf-stepper-dot {
    background: var(--paper);
    border-color: var(--vermilion);
    color: var(--vermilion);
    box-shadow: 0 0 0 0 rgba(190,52,40,0.35);
    animation: pfStepperBadgePulse 1.6s ease-out infinite;
  }
  @keyframes pfStepperBadgePulse {
    0%   { box-shadow: 0 0 0 0 rgba(190,52,40,0.38); }
    70%  { box-shadow: 0 0 0 6px rgba(190,52,40,0); }
    100% { box-shadow: 0 0 0 0 rgba(190,52,40,0); }
  }
  .pf-stepper-step.is-active .pf-stepper-label {
    color: var(--vermilion);
    font-weight: 600;
  }

  /* done · 实心 vermilion 方块 + 白 ✓（数字隐藏） */
  .pf-stepper-step.is-done .pf-stepper-dot {
    background: var(--vermilion);
    border-color: var(--vermilion);
    color: transparent;     /* 数字不显示，被 ✓ 取代 */
  }
  .pf-stepper-step.is-done .pf-stepper-dot::before {
    content: '';
    position: absolute;
    inset: 0;
    background-image: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23fff' stroke-width='3.5' stroke-linecap='round' stroke-linejoin='round'><path d='M5 12l5 5 9-11'/></svg>");
    background-size: 13px 13px;
    background-repeat: no-repeat;
    background-position: center;
  }
  .pf-stepper-step.is-done .pf-stepper-label {
    color: var(--ink-soft);
  }


  .pf-proc-head {
    padding: 22px 28px 14px;
    border-bottom: 1px solid var(--rule-soft);
  }
  .pf-proc-head-eyebrow {
    display: inline-flex; align-items: center; gap: 7px;
    font-family: 'JetBrains Mono', monospace;
    font-size: 10.5px;
    letter-spacing: 0.12em;
    color: var(--vermilion);
    margin-bottom: 6px;
  }
  .pf-proc-live-dot {
    width: 7px; height: 7px; border-radius: 50%;
    background: var(--vermilion);
    box-shadow: 0 0 0 0 rgba(190,52,40,0.55);
    animation: pfProcPulse 1.4s infinite;
  }
  .pf-proc-live-dot.is-done {
    background: #2f8659;
    animation: none;
    box-shadow: 0 0 0 0 rgba(107,122,58,0.4);
  }
  @keyframes pfProcPulse {
    0%   { box-shadow: 0 0 0 0 rgba(190,52,40,0.55); }
    70%  { box-shadow: 0 0 0 6px rgba(190,52,40,0); }
    100% { box-shadow: 0 0 0 0 rgba(190,52,40,0); }
  }
  .pf-proc-head-title {
    font-family: 'Noto Serif SC', serif;
    font-size: 18px;
    font-weight: 600;
    color: var(--ink);
    letter-spacing: 0.02em;
    margin-bottom: 4px;
  }
  .pf-proc-head-meta {
    font-family: 'JetBrains Mono', monospace;
    font-size: 11.5px;
    color: var(--ink-mute);
    letter-spacing: 0.04em;
  }
  .pf-proc-phase-label::before { content: '› '; color: var(--ink-faint); }

  .pf-proc-section {
    padding: 14px 28px 18px;
    border-bottom: 1px dashed var(--rule-soft);
    opacity: 1;
    transition: opacity .35s ease, transform .35s ease, max-height .4s ease;
  }
  .pf-proc-section.is-hidden { display: none; }
  .pf-proc-section.is-in {
    animation: pfProcSecIn .42s cubic-bezier(.22,.8,.26,1);
  }
  @keyframes pfProcSecIn {
    from { opacity: 0; transform: translateY(8px); }
    to   { opacity: 1; transform: translateY(0); }
  }

  .pf-proc-section-head {
    display: flex; align-items: baseline; gap: 10px;
    margin-bottom: 10px;
  }
  .pf-proc-section-num {
    font-family: 'JetBrains Mono', monospace;
    font-size: 10px;
    color: var(--vermilion);
    background: var(--vermilion-bg);
    padding: 2px 6px;
    border-radius: 2px;
    letter-spacing: 0.08em;
    flex-shrink: 0;
  }
  .pf-proc-section-name {
    font-family: 'Noto Serif SC', serif;
    font-size: 13.5px;
    font-weight: 600;
    color: var(--ink-soft);
    flex: 1;
  }
  .pf-proc-section-side {
    font-family: 'JetBrains Mono', monospace;
    font-size: 11px;
    color: var(--ink-mute);
    letter-spacing: 0.03em;
  }
  .pf-proc-section-side strong { color: var(--ink-soft); font-weight: 600; }

  /* ── 01 · AMIX split 2 列 · 左序列 ┃ 右 3D viewer · 50/50 ── */
  .pf-proc-amix-split {
    display: grid;
    grid-template-columns: minmax(0, 1fr) minmax(0, 1fr);
    gap: 18px;
    align-items: start;
  }
  .pf-proc-amix-left {
    min-width: 0;
    display: flex; flex-direction: column;
    gap: 7px;
  }
  .pf-proc-amix-right {
    display: flex; flex-direction: column;
    gap: 8px;
    min-width: 0;
    /* 左列变高（含 mut-diff + freq subblock）时，3D viewer sticky 留在视区，
       方便用户在任意 cell click → 立即在 3D 中聚焦 */
    position: sticky;
    top: 72px;            /* 让出顶部 stepper (~70px) 高度 */
    align-self: start;
  }
  .pf-proc-3d-head {
    display: flex; align-items: baseline; justify-content: space-between;
    padding-bottom: 4px;
  }
  .pf-proc-3d-title {
    font-family: 'Noto Serif SC', serif;
    font-size: 12px;
    font-weight: 600;
    color: var(--ink-soft);
  }
  .pf-proc-3d-meta {
    font-family: 'JetBrains Mono', monospace;
    font-size: 10px;
    color: var(--ink-faint);
    letter-spacing: 0.04em;
  }
  .pf-proc-3d-viewer {
    position: relative;
    width: 100%;
    height: 420px;
    background: var(--paper-cool);   /* 素色：与抽屉整体暖米纸调匹配 · 取冷一档让 spectral 蛋白色更清晰 */
    border-radius: 4px;
    overflow: hidden;
    border: 1px solid var(--rule);
  }
  .pf-proc-3d-loading {
    position: absolute; inset: 0;
    display: flex; align-items: center; justify-content: center;
    color: var(--ink-mute);
    font-family: 'JetBrains Mono', monospace;
    font-size: 11px;
    letter-spacing: 0.06em;
    pointer-events: none;
  }
  /* 残基详情浮层 · 绝对定位贴在 viewer 内左下角 · 透明 frosted glass 风格 ·
     与右上角控制按钮 (top:8px right:8px) 错位，互不遮挡 */
  .pf-proc-3d-info {
    position: absolute;
    left: 10px;
    bottom: 10px;
    z-index: 2;
    max-width: calc(100% - 20px);   /* 左右各留 10px · 控制按钮在 top-right 不同 row 不冲突 */
    background: rgba(253,252,248,0.72);     /* paper @ 72% */
    border: 1px solid rgba(0,0,0,0.06);
    border-radius: 3px;
    padding: 6px 10px;
    display: flex; align-items: center;
    backdrop-filter: blur(8px);
    -webkit-backdrop-filter: blur(8px);
    transition: opacity .2s ease, background .2s ease;
  }
  /* 空态：低亮、压低存在感 · 详情态：满亮、强调聚焦的残基 */
  .pf-proc-3d-info[data-mode="empty"]  { opacity: 0.7;  background: rgba(253,252,248,0.55); }
  .pf-proc-3d-info[data-mode="detail"] { opacity: 1; }
  .pf-proc-3d-info[data-mode="empty"] .pf-proc-3d-detail { display: none; }
  .pf-proc-3d-info[data-mode="detail"] .pf-proc-3d-empty { display: none; }
  .pf-proc-3d-empty {
    font-family: 'JetBrains Mono', monospace;
    font-size: 10.5px;
    color: var(--ink-mute);
    letter-spacing: 0.04em;
    line-height: 1.45;
  }
  .pf-proc-3d-detail {
    display: flex; align-items: baseline; gap: 8px;
  }
  .pf-proc-3d-detail-main {
    display: flex; align-items: baseline; gap: 5px;
    font-family: 'JetBrains Mono', monospace;
  }
  .pf-proc-3d-pos {
    font-size: 13px; font-weight: 700;
    color: var(--ink);
  }
  .pf-proc-3d-arrow {
    color: var(--ink-faint);
    font-size: 11px;
  }
  .pf-proc-3d-mut {
    font-size: 13px; font-weight: 700;
    color: var(--vermilion);
    letter-spacing: 0.02em;
  }
  .pf-proc-3d-detail-meta {
    font-family: 'JetBrains Mono', monospace;
    font-size: 10px;
    color: var(--ink-mute);
    letter-spacing: 0.03em;
  }
  /* 深色主题适配 · 文字色 + 浮层底色翻转 */
  .pf-proc-3d-viewer.is-bg-dark .pf-proc-3d-info {
    background: rgba(20,28,40,0.55);
    border-color: rgba(255,255,255,0.12);
  }
  .pf-proc-3d-viewer.is-bg-dark .pf-proc-3d-info[data-mode="empty"]  { background: rgba(20,28,40,0.40); }
  .pf-proc-3d-viewer.is-bg-dark .pf-proc-3d-empty { color: rgba(255,255,255,0.55); }
  .pf-proc-3d-viewer.is-bg-dark .pf-proc-3d-pos   { color: rgba(255,255,255,0.92); }
  .pf-proc-3d-viewer.is-bg-dark .pf-proc-3d-arrow { color: rgba(255,255,255,0.5);  }
  .pf-proc-3d-viewer.is-bg-dark .pf-proc-3d-mut   { color: #ff9070; }              /* 深底下 vermilion 偏暗 · 换暖橙提对比 */
  .pf-proc-3d-viewer.is-bg-dark .pf-proc-3d-detail-meta { color: rgba(255,255,255,0.55); }
  /* 控制按钮叠在 viewer 内右上 · 默认低存在感 · hover 才提亮 · 适配素色底 */
  .pf-proc-3d-controls {
    position: absolute;
    top: 8px; right: 8px;
    display: flex; gap: 2px;
    z-index: 2;
    opacity: 0.6;
    transition: opacity .2s ease;
  }
  .pf-proc-3d-viewer:hover .pf-proc-3d-controls { opacity: 1; }
  .pf-proc-3d-btn {
    width: 24px; height: 24px;
    display: inline-flex; align-items: center; justify-content: center;
    background: rgba(253,252,248,0.7);   /* paper 半透 · 在素色底上自然融入 */
    border: 1px solid var(--rule);
    border-radius: 3px;
    color: var(--ink-soft);
    cursor: pointer;
    transition: all .15s ease;
    backdrop-filter: blur(4px);
    -webkit-backdrop-filter: blur(4px);
  }
  .pf-proc-3d-btn:hover {
    background: var(--paper);
    border-color: var(--vermilion-soft);
    color: var(--vermilion);
  }
  .pf-proc-3d-btn svg { width: 13px; height: 13px; }

  /* 主题按钮：默认显示月亮（点击后切到深色）· 切到深色后显示太阳（点击再切回浅色） */
  .pf-proc-3d-btn[data-3d-act="theme"] .theme-icon-sun { display: none; }

  /* 深色主题修饰：viewer 底色 + loading 文字 + 控制按钮全部翻成深底风格 */
  .pf-proc-3d-viewer.is-bg-dark {
    background: #0e1620;
    border-color: rgba(0,0,0,0.45);
  }
  .pf-proc-3d-viewer.is-bg-dark .pf-proc-3d-loading {
    color: rgba(255,255,255,0.55);
  }
  .pf-proc-3d-viewer.is-bg-dark .pf-proc-3d-btn {
    background: rgba(255,255,255,0.06);
    border-color: rgba(255,255,255,0.1);
    color: rgba(255,255,255,0.75);
  }
  .pf-proc-3d-viewer.is-bg-dark .pf-proc-3d-btn:hover {
    background: rgba(255,255,255,0.18);
    border-color: rgba(255,255,255,0.28);
    color: #fff;
  }
  .pf-proc-3d-viewer.is-bg-dark .pf-proc-3d-btn[data-3d-act="theme"] .theme-icon-moon { display: none; }
  .pf-proc-3d-viewer.is-bg-dark .pf-proc-3d-btn[data-3d-act="theme"] .theme-icon-sun  { display: block; }

  /* legend 提示尾巴 */
  .pf-proc-legend-hint {
    margin-left: auto;
    font-family: 'JetBrains Mono', monospace;
    font-size: 10px;
    color: var(--ink-faint);
    letter-spacing: 0.05em;
  }

  /* cell focused 高亮：vermilion outline · 适用 WT 序列 cell / mut-diff col / freq bar */
  .pf-proc-seq-char,
  .pf-proc-col[data-pos],
  .pf-proc-freq-bar[data-pos] {
    cursor: pointer;
  }
  .pf-proc-seq-char.is-focused,
  .pf-proc-col.is-focused .pf-proc-cell-mut,
  .pf-proc-freq-bar.is-focused {
    outline: 2px solid var(--vermilion);
    outline-offset: 1px;
    z-index: 2;
  }

  /* 窄屏兜底：抽屉 < 720px 时改纵向，3D 在序列下方 */
  @media (max-width: 720px) {
    .pf-proc-amix-split {
      grid-template-columns: 1fr;
    }
    .pf-proc-amix-right {
      position: static;     /* 纵向时不需要 sticky */
    }
    .pf-proc-3d-viewer { height: 300px; }
  }

  /* ── 01 · AMIX 在 WT 序列上的采样可视化 ── */
  .pf-proc-amix-stats {
    display: flex; flex-wrap: wrap; gap: 14px;
    padding: 4px 0 8px;
    font-family: 'JetBrains Mono', monospace;
    font-size: 11px;
    color: var(--ink-mute);
    letter-spacing: 0.03em;
  }
  .pf-proc-amix-stat strong {
    color: var(--ink-soft);
    font-weight: 600;
    font-variant-numeric: tabular-nums;
    margin-left: 3px;
  }
  .pf-proc-amix-stat .pf-amix-val { color: var(--vermilion); }
  .pf-proc-amix-tline {
    display: flex; align-items: center; gap: 0;
    padding: 6px 2px 10px;
  }
  .pf-proc-amix-tldot {
    width: 8px; height: 8px; border-radius: 50%;
    background: rgba(0,0,0,0.14);
    flex-shrink: 0;
    transition: all .25s ease;
  }
  .pf-proc-amix-tldot.is-running {
    background: var(--vermilion);
    transform: scale(1.45);
    box-shadow: 0 0 0 4px rgba(190,52,40,0.18);
    animation: pfTlPulse 1.4s infinite;
  }
  @keyframes pfTlPulse {
    0%   { box-shadow: 0 0 0 0 rgba(190,52,40,0.45); }
    70%  { box-shadow: 0 0 0 6px rgba(190,52,40,0); }
    100% { box-shadow: 0 0 0 0 rgba(190,52,40,0); }
  }
  .pf-proc-amix-tldot.is-done {
    background: var(--vermilion);
    opacity: 0.55;
  }
  .pf-proc-amix-tldot.is-best {
    background: var(--vermilion);
    opacity: 1;
    box-shadow: 0 0 0 3px rgba(190,52,40,0.2);
  }
  .pf-proc-amix-tlbar {
    flex: 1;
    height: 1px;
    background: rgba(0,0,0,0.1);
    margin: 0 6px;
  }

  /* WT 序列网格（60 残基/行 × 4 行） */
  .pf-proc-seq-grid {
    background: var(--paper);
    border: 1px solid var(--rule-soft);
    border-radius: 3px;
    padding: 8px 10px;
    overflow-x: auto;
    font-family: 'JetBrains Mono', monospace;
    line-height: 1.55;
  }
  .pf-proc-seq-line {
    display: flex; align-items: baseline;
    white-space: nowrap;
  }
  .pf-proc-seq-num {
    width: 36px;
    padding-right: 10px;
    text-align: right;
    color: var(--ink-faint);
    font-size: 9.5px;
    flex-shrink: 0;
    user-select: none;
  }
  /* row 用 flex 拉伸 + 每 cell 等分 → 在左列宽度内最大块度铺满，cell 不再固定 1ch */
  .pf-proc-seq-row {
    display: flex;
    flex: 1 1 auto;
    min-width: 0;
    gap: 1px;
  }
  .pf-proc-seq-char {
    flex: 1 1 0;
    min-width: 0;
    max-width: 22px;            /* 末行 cell 数少时不至于撑得过宽 */
    text-align: center;
    font-size: 13px;
    color: var(--ink-mute);
    position: relative;
    border-radius: 2px;
    line-height: 1.6;
    transition: color .25s, background .25s, transform .2s;
  }
  /* 每 10 个字一组的细分隔 */
  .pf-proc-seq-char:nth-child(10n) { margin-right: 3px; }

  .pf-proc-seq-char.is-sampled {
    color: var(--vermilion);
    background: rgba(190,52,40,0.18);
    animation: pfSeqSample .5s ease-out;
  }
  @keyframes pfSeqSample {
    0%   { background: rgba(190,52,40,0.55); transform: scale(1.25); }
    100% { background: rgba(190,52,40,0.18); transform: scale(1); }
  }
  .pf-proc-seq-char.is-locked {
    color: #fff;
    background: var(--mut-color, var(--vermilion));
    font-weight: 700;
    animation: pfSeqLock .55s cubic-bezier(.22,.8,.26,1);
  }
  @keyframes pfSeqLock {
    0%   { transform: scale(1.4); box-shadow: 0 0 0 0 rgba(190,52,40,0.6); }
    60%  { box-shadow: 0 0 0 5px rgba(190,52,40,0); }
    100% { transform: scale(1); box-shadow: none; }
  }

  /* legend */
  .pf-proc-seq-legend {
    display: flex; gap: 14px;
    margin-top: 8px;
    font-family: 'JetBrains Mono', monospace;
    font-size: 10.5px;
    color: var(--ink-faint);
  }
  .pf-proc-legend-item { display: inline-flex; align-items: center; gap: 5px; }
  .pf-proc-legend-swatch {
    width: 12px; height: 12px; border-radius: 2px;
    display: inline-block;
  }
  .pf-proc-legend-swatch.is-sample { background: rgba(190,52,40,0.22); }
  .pf-proc-legend-swatch.is-locked { background: var(--vermilion); }

  /* AMIX 节内的 Top-10 子块 · 视觉分隔但同节 */
  .pf-proc-subblock {
    margin-top: 16px;
    padding-top: 14px;
    border-top: 1px dashed var(--rule-soft);
  }
  .pf-proc-subblock.is-hidden { display: none; }
  .pf-proc-subblock.is-in { animation: pfProcSecIn .42s cubic-bezier(.22,.8,.26,1); }
  .pf-proc-subblock-head {
    display: flex; align-items: baseline; gap: 8px;
    margin-bottom: 8px;
  }
  .pf-proc-subblock-dot {
    width: 6px; height: 6px; border-radius: 50%;
    background: var(--vermilion);
    flex-shrink: 0;
    margin-right: 2px;
  }
  /* 小 A / B 序号标签（合并节内的子段标识） */
  .pf-proc-subblock-tag {
    display: inline-flex; align-items: center; justify-content: center;
    width: 16px; height: 16px;
    font-family: 'JetBrains Mono', monospace;
    font-size: 9.5px;
    font-weight: 700;
    color: var(--vermilion);
    background: var(--vermilion-bg);
    border-radius: 2px;
    letter-spacing: 0;
    flex-shrink: 0;
  }
  .pf-proc-subblock-name-row {
    display: flex; align-items: center; gap: 8px;
    margin-bottom: 8px;
    font-family: 'Noto Serif SC', serif;
    font-size: 12px;
    color: var(--ink-mute);
  }
  .pf-proc-subblock-name {
    font-family: 'Noto Serif SC', serif;
    font-size: 12.5px;
    font-weight: 600;
    color: var(--ink-soft);
    flex: 1;
  }
  .pf-proc-subblock-side {
    font-family: 'JetBrains Mono', monospace;
    font-size: 10.5px;
    color: var(--ink-mute);
    letter-spacing: 0.03em;
  }

  /* 横向并排：02 + 03 同节 split */
  .pf-proc-section-row { padding-top: 16px; padding-bottom: 18px; }
  .pf-proc-split {
    display: grid;
    grid-template-columns: 1fr 1fr;
    gap: 22px;
  }
  .pf-proc-half {
    min-width: 0;             /* 让 overflow scroll 起作用 */
  }
  .pf-proc-half.is-hidden { visibility: hidden; }
  .pf-proc-half.is-in {
    animation: pfProcSecIn .42s cubic-bezier(.22,.8,.26,1);
  }
  /* split 内 mut-diff cell 缩到 18px 适应窄列 */
  .pf-proc-half .pf-proc-col,
  .pf-proc-amix-left .pf-proc-subblock[data-sec="mutdiff"] .pf-proc-col { width: 19px; }
  .pf-proc-half .pf-proc-cell,
  .pf-proc-amix-left .pf-proc-subblock[data-sec="mutdiff"] .pf-proc-cell { width: 17px; height: 17px; font-size: 11.5px; }
  .pf-proc-half .pf-proc-cell-pos,
  .pf-proc-amix-left .pf-proc-subblock[data-sec="mutdiff"] .pf-proc-cell-pos { font-size: 8.5px; }
  /* split 内 freq bars 整体缩矮（mut-diff & rank pills 的 split 半子，已废用） */
  .pf-proc-half .pf-proc-freq-bars { height: 70px; gap: 1.5px; }
  .pf-proc-half .pf-proc-freq-bar { width: 6px; }
  .pf-proc-half .pf-proc-freq-pos { font-size: 7.5px; }

  /* amix-left 内 mut-diff · 22 cells 按 flex 等分撑满左列，不滚动 */
  .pf-proc-amix-left .pf-proc-subblock[data-sec="mutdiff"] .pf-proc-grid {
    gap: 2px;
    overflow: hidden;
  }
  .pf-proc-amix-left .pf-proc-subblock[data-sec="mutdiff"] .pf-proc-col {
    flex: 1 1 0;
    min-width: 0;
    width: auto;
  }
  .pf-proc-amix-left .pf-proc-subblock[data-sec="mutdiff"] .pf-proc-cell {
    width: 100%;
    max-width: 22px;        /* cell 不撑得过宽 */
    height: 18px;
    font-size: 11.5px;
  }
  .pf-proc-amix-left .pf-proc-subblock[data-sec="mutdiff"] .pf-proc-cell-pos {
    font-size: 8.5px;
  }

  /* amix-left 内 freq bars · 41 个柱子按 flex 等分宽度铺满容器，不滚动 */
  .pf-proc-amix-left .pf-proc-subblock[data-sec="freq"] .pf-proc-freq-bars {
    height: 70px;
    gap: 2px;
    overflow: hidden;
  }
  .pf-proc-amix-left .pf-proc-subblock[data-sec="freq"] .pf-proc-freq-bar {
    flex: 1 1 0;
    width: auto;
    min-width: 0;
  }
  .pf-proc-amix-left .pf-proc-subblock[data-sec="freq"] .pf-proc-freq-pos {
    font-size: 7.5px;
  }
  /* 窄屏兜底：< 560px 时 split 改成纵向 */
  @media (max-width: 560px) {
    .pf-proc-split { grid-template-columns: 1fr; gap: 16px; }
  }

  /* ── 02 · Top-10 候选 · 219 横条 + 突变 dot ── */
  .pf-proc-top10-ruler {
    position: relative;
    height: 14px;
    margin: 4px 0 6px 130px;     /* 130px 让出 meta 列 */
    font-family: 'JetBrains Mono', monospace;
    font-size: 9px;
    color: var(--ink-faint);
  }
  .pf-proc-top10-ruler span {
    position: absolute;
    top: 0;
    transform: translateX(-50%);
  }
  .pf-proc-top10-stack {
    display: flex; flex-direction: column; gap: 4px;
  }
  .pf-proc-top10-strip {
    display: flex; align-items: center; gap: 8px;
    opacity: 0;
    transform: translateY(4px);
    transition: opacity .3s ease, transform .3s ease;
  }
  .pf-proc-top10-strip.is-in { opacity: 1; transform: translateY(0); }
  .pf-proc-top10-meta {
    width: 122px;
    display: flex; gap: 6px; align-items: baseline;
    font-family: 'JetBrains Mono', monospace;
    font-size: 10.5px;
    color: var(--ink-mute);
    flex-shrink: 0;
    white-space: nowrap;
  }
  .pf-proc-top10-rank { font-weight: 600; color: var(--ink-soft); }
  .pf-proc-top10-score { font-variant-numeric: tabular-nums; color: var(--ink-mute); }
  .pf-proc-top10-mut { color: var(--ink-faint); font-size: 9.5px; }
  .pf-proc-top10-strip.is-best .pf-proc-top10-rank { color: var(--vermilion); }
  .pf-proc-top10-strip.is-best .pf-proc-top10-score { color: var(--vermilion); font-weight: 600; }

  .pf-proc-top10-track {
    flex: 1;
    position: relative;
    height: 14px;
    background: rgba(0,0,0,0.04);
    border-radius: 2px;
    overflow: hidden;
  }
  .pf-proc-top10-strip.is-best .pf-proc-top10-track {
    background: rgba(190,52,40,0.06);
    border: 1px solid rgba(190,52,40,0.22);
    height: 16px;
  }
  .pf-proc-top10-dot {
    position: absolute;
    width: 3px;
    height: 100%;
    top: 0;
    border-radius: 1px;
    background: var(--vermilion);
    transform-origin: center;
    animation: pfTopDotIn .35s cubic-bezier(.22,.8,.26,1);
  }
  @keyframes pfTopDotIn {
    from { opacity: 0; transform: scaleY(0.3); }
    to   { opacity: 1; transform: scaleY(1); }
  }
  .pf-proc-top10-strip.is-best .pf-proc-top10-dot {
    width: 4px;
    box-shadow: 0 0 4px -1px rgba(190,52,40,0.5);
  }

  /* ── 03 · Top-1 vs WT 突变格栅 ── */
  .pf-proc-grid {
    display: flex; gap: 5px;
    overflow-x: auto;
    overflow-y: hidden;
    padding-bottom: 6px;
    scrollbar-width: thin;
  }
  .pf-proc-grid::-webkit-scrollbar { height: 5px; }
  .pf-proc-grid::-webkit-scrollbar-thumb { background: rgba(0,0,0,0.12); border-radius: 2px; }
  .pf-proc-col {
    display: flex; flex-direction: column; align-items: center;
    gap: 2px;
    flex-shrink: 0;
    width: 22px;
    transition: opacity .3s, width .35s, margin .35s;
  }
  .pf-proc-col.dimmed { opacity: 0.3; }
  .pf-proc-cell-pos {
    font-family: 'JetBrains Mono', monospace;
    font-size: 9px;
    color: var(--ink-faint);
    margin-bottom: 1px;
    user-select: none;
  }
  .pf-proc-cell {
    display: flex; align-items: center; justify-content: center;
    width: 20px; height: 20px;
    font-family: 'JetBrains Mono', monospace;
    font-size: 13px;
    line-height: 1;
    border-radius: 3px;
  }
  .pf-proc-cell-wt {
    color: var(--ink-mute);
    background: rgba(0,0,0,0.04);
  }
  .pf-proc-cell-mut {
    color: var(--ink-faint);
    background: rgba(0,0,0,0.03);
    font-weight: 600;
    position: relative;
    transition: color .3s, background .3s, box-shadow .25s;
  }
  .pf-proc-cell-mut.cycling {
    color: var(--vermilion);
    background: rgba(190,52,40,0.06);
  }
  .pf-proc-cell-mut.settled {
    color: #fff;
    background: var(--mut-color, var(--vermilion));
    animation: pfProcLock .42s ease-out;
  }
  @keyframes pfProcLock {
    0%   { box-shadow: 0 0 0 0 rgba(190,52,40,0.55); transform: scale(1.12); }
    50%  { box-shadow: 0 0 0 5px rgba(190,52,40,0); }
    100% { box-shadow: 0 0 0 0 rgba(190,52,40,0); transform: scale(1); }
  }
  .pf-proc-cell-mut.risk::after {
    content: '!';
    position: absolute;
    top: -4px; right: -4px;
    width: 11px; height: 11px;
    background: #c93838;
    color: #fff;
    font-size: 8px;
    font-weight: 700;
    line-height: 11px;
    text-align: center;
    border-radius: 50%;
    box-shadow: 0 0 0 1.5px var(--paper);
  }
  .pf-proc-cell-mut.recommend {
    box-shadow: 0 0 0 2px var(--vermilion), 0 0 10px -1px rgba(190,52,40,0.45);
  }

  /* ── 04 · 频率筛选条形图 ── */
  .pf-proc-freq-bars {
    display: flex; align-items: flex-end; gap: 2px;
    height: 88px;
    padding-top: 6px;
    border-bottom: 1px solid var(--rule-soft);
    overflow-x: auto;
  }
  .pf-proc-freq-bar {
    flex: 0 0 auto;
    width: 8px;
    height: 100%;
    display: flex; flex-direction: column; justify-content: flex-end;
    align-items: center;
    position: relative;
    transition: opacity .5s ease;
  }
  .pf-proc-freq-fill {
    width: 100%;
    background: var(--ink-mute);
    border-radius: 1px 1px 0 0;
    transition: height .6s cubic-bezier(.22,.8,.26,1);
  }
  .pf-proc-freq-bar.is-high .pf-proc-freq-fill { background: var(--vermilion); }
  .pf-proc-freq-pos {
    font-family: 'JetBrains Mono', monospace;
    font-size: 8px;
    color: var(--ink-faint);
    margin-top: 2px;
    transform: rotate(-60deg);
    transform-origin: top center;
    height: 16px;
    line-height: 1;
    white-space: nowrap;
  }
  .pf-proc-freq-bar.is-dimmed { opacity: 0.15; }
  .pf-proc-freq-bar.is-dimmed .pf-proc-freq-pos { opacity: 0; }
  .pf-proc-freq-bar.is-high { z-index: 1; }

  /* 02 节 · A/B 合并为单列 · lib-grid 全宽 · 评分附着到每个 chip */
  .pf-proc-libsplit {
    display: block;
  }
  .pf-proc-libsplit-half { min-width: 0; }
  .pf-proc-libsplit-half[data-sec="rank"] { display: none; }   /* B 半边已并入 A，DOM 保留但不渲染 */

  /* ── 05 · 突变库（位点 × targets） ── */
  .pf-proc-lib-grid {
    display: grid;
    /* split 后左列窄，min 改小让 cell 能放 2 列 */
    grid-template-columns: repeat(auto-fill, minmax(86px, 1fr));
    gap: 6px 8px;
  }
  .pf-proc-lib-pos {
    border: 1px solid var(--rule-soft);
    border-radius: 4px;
    padding: 7px 9px 8px;
    background: var(--paper);
    opacity: 0;
    transform: translateY(6px);
    transition: opacity .3s, transform .3s, border-color .3s, background .3s;
  }
  .pf-proc-lib-pos.is-in { opacity: 1; transform: translateY(0); }
  .pf-proc-lib-pos.is-risk {
    border-color: rgba(192,48,48,0.4);
    background: rgba(192,48,48,0.04);
  }
  .pf-proc-lib-pos.is-risk::after {
    content: '⚠';
    position: absolute;
    margin-left: -16px;
    color: #c93838;
    font-size: 10px;
  }
  .pf-proc-lib-pos-head {
    display: inline-flex; align-items: baseline; gap: 2px;
    font-family: 'JetBrains Mono', monospace;
    font-size: 11px;
    color: var(--ink-soft);
    margin-bottom: 5px;
  }
  .pf-proc-lib-pos-wt { color: var(--ink-mute); }
  .pf-proc-lib-pos-num { color: var(--ink); font-weight: 600; }
  .pf-proc-lib-pos-arrow { color: var(--ink-faint); margin-left: 4px; }
  .pf-proc-lib-targets { display: flex; gap: 4px 5px; flex-wrap: wrap; }
  .pf-proc-lib-target {
    position: relative;
    display: inline-flex; align-items: center; justify-content: center; gap: 3px;
    padding: 0 4px 0 5px;
    min-width: 22px; height: 18px;
    background: rgba(0,0,0,0.03);
    color: var(--ink-faint);
    font-family: 'JetBrains Mono', monospace;
    font-size: 11px;
    font-weight: 600;
    border-radius: 3px;
    opacity: 0;
    transform: scale(0.85);
    transition: all .25s cubic-bezier(.22,.8,.26,1);
  }
  .pf-proc-lib-target.is-on {
    opacity: 1;
    transform: scale(1);
    background: var(--mc, var(--vermilion));
    color: #fff;
  }
  .pf-proc-lib-target-letter { line-height: 1; }
  /* 评分数字 · 默认隐藏 · 随 _attachLibScores 才显现 · 9px 小字附在 letter 右侧 */
  .pf-proc-lib-target-score {
    font-size: 8.5px;
    font-weight: 500;
    line-height: 1;
    opacity: 0.85;
    letter-spacing: -0.02em;
    display: none;
  }
  .pf-proc-lib-target.has-score .pf-proc-lib-target-score { display: inline-block; }
  /* tier 修饰 · 仅在评分附着后生效 */
  .pf-proc-lib-target.is-mid  { opacity: 0.85; }
  .pf-proc-lib-target.is-low  { opacity: 0.55; }
  .pf-proc-lib-target.is-low.is-on {
    background: rgba(0,0,0,0.05);
    color: var(--ink-mute);
  }
  /* 推荐组合标记 · 右上角小星 */
  .pf-proc-lib-target.is-star::after {
    content: '★';
    position: absolute;
    top: -6px; right: -5px;
    width: 11px; height: 11px;
    display: flex; align-items: center; justify-content: center;
    font-size: 8.5px;
    color: var(--vermilion);
    background: var(--paper);
    border: 1px solid rgba(190,52,40,0.35);
    border-radius: 50%;
    line-height: 1;
    z-index: 2;
  }

  /* ── 06 · 综合评分 pills ── */
  .pf-proc-rank-pills {
    display: flex; flex-wrap: wrap; gap: 6px;
  }
  .pf-proc-rank-pill {
    display: inline-flex; align-items: center; gap: 6px;
    padding: 4px 9px 4px 7px;
    background: var(--paper);
    border: 1px solid var(--rule);
    border-radius: 12px;
    font-family: 'JetBrains Mono', monospace;
    font-size: 11px;
    color: var(--ink-soft);
    opacity: 0;
    transform: translateY(4px);
    transition: opacity .3s, transform .3s, border-color .3s, background .3s, opacity .3s;
  }
  .pf-proc-rank-pill.is-in { opacity: 1; transform: translateY(0); }
  .pf-proc-rank-pill-dot { width: 7px; height: 7px; border-radius: 50%; }
  .pf-proc-rank-pill-label { font-weight: 600; }
  .pf-proc-rank-pill-score { color: var(--ink-mute); }
  .pf-proc-rank-pill.is-high {
    border-color: var(--vermilion);
    background: var(--vermilion-bg);
  }
  .pf-proc-rank-pill.is-mid { border-color: rgba(0,0,0,0.12); }
  .pf-proc-rank-pill.is-low { opacity: 0.55; }
  .pf-proc-rank-pill.is-recommend {
    border-color: var(--vermilion);
    box-shadow: 0 0 0 2px rgba(190,52,40,0.12);
  }
  .pf-proc-rank-pill.is-risk {
    opacity: 0.35;
    text-decoration: line-through;
    text-decoration-color: rgba(0,0,0,0.4);
  }

  /* ── 推荐 / 风险 · 单张玻璃卡 · 风格与 pf-preamble 同源 ──
     · 外层 .pf-proc-verdict-row = 玻璃卡容器（推荐与不建议合并到一张卡）
     · 内层 .pf-proc-verdict-line 不再各自独立卡，只是卡内的行
     · 两行之间用品牌蓝虚线分隔（与 pf-preamble-seq 的虚线同一规则）*/
  .pf-proc-verdict-row {
    display: flex; flex-direction: column;
    gap: 0;
    padding: 14px 18px 16px;
    background: rgba(233, 240, 249, 0.95);
    border: 1px solid rgba(22, 97, 171, 0.18);
    border-radius: 4px;
    backdrop-filter: blur(8px) saturate(1.2);
    -webkit-backdrop-filter: blur(8px) saturate(1.2);
    box-shadow:
      inset 0 1px 0 rgba(255, 255, 255, 0.75),
      0 2px 10px rgba(22, 97, 171, 0.08);
  }
  .pf-proc-verdict-line {
    display: flex; align-items: center; flex-wrap: wrap;
    gap: 6px 10px;
    padding: 6px 0;
    background: transparent;       /* 取消独立 bg */
    border: none;                  /* 取消独立 border */
    border-radius: 0;
    box-shadow: none;
  }
  /* 两行之间用品牌蓝虚线分隔 · 与 pf-preamble-seq 同一规则 */
  .pf-proc-verdict-line + .pf-proc-verdict-line {
    border-top: 1px dashed rgba(22, 97, 171, 0.22);
    margin-top: 4px;
    padding-top: 10px;
  }
  /* 推荐 / 不建议的"行级降权"改用文字色实现（玻璃卡内不再需要 row-level opacity） */
  .pf-proc-verdict-line.is-risk { opacity: 1; }
  .pf-proc-verdict-icon {
    font-size: 14px; color: var(--vermilion);
    line-height: 1; flex-shrink: 0;
  }
  .pf-proc-verdict-line.is-risk .pf-proc-verdict-icon {
    color: #c93838; font-size: 12px;
  }
  .pf-proc-verdict-label {
    font-family: 'Noto Serif SC', serif;
    font-size: 13px; font-weight: 700;
    color: var(--vermilion);
    letter-spacing: 0.02em;
    margin-right: 2px; flex-shrink: 0;
  }
  .pf-proc-verdict-line.is-risk .pf-proc-verdict-label {
    font-size: 12px; font-weight: 500; color: var(--ink-mute);
  }
  .pf-proc-verdict-chips {
    display: flex; gap: 4px; flex-wrap: wrap;
  }
  .pf-proc-verdict-chip {
    font-family: 'JetBrains Mono', monospace;
    font-size: 10.5px; font-weight: 600;
    padding: 2px 7px; border-radius: 3px;
    letter-spacing: 0.04em; line-height: 1.4;
  }
  .pf-proc-verdict-chip.is-rec { background: var(--vermilion); color: #fff; }
  .pf-proc-verdict-chip.is-risk {
    background: rgba(192,48,48,0.08);
    color: rgba(192,48,48,0.7);
    text-decoration: line-through;
    text-decoration-color: rgba(192,48,48,0.45);
  }
  .pf-proc-verdict-meta {
    font-family: 'JetBrains Mono', monospace;
    font-size: 10.5px; color: var(--ink-mute);
    letter-spacing: 0.03em; margin-left: auto;
  }
  .pf-proc-verdict-line.is-rec .pf-proc-verdict-meta {
    color: var(--vermilion); font-weight: 600;
  }
  @media (max-width: 520px) {
    .pf-proc-verdict-meta { margin-left: 0; width: 100%; }
  }

  .pf-proc-divider {
    height: 1px;
    margin: 0 28px;
    background: linear-gradient(90deg, transparent 0%, var(--rule) 30%, var(--rule) 70%, transparent 100%);
  }
  /* ---- final response · hover 操作栏 ---- */
  .al-actions {
    margin-top: 12px;
    display: flex;
    gap: 2px;
    opacity: 0;
    transition: opacity .15s ease;
  }
  .al-final:hover .al-actions,
  .al-actions:focus-within,
  .al-final.is-latest .al-actions {
    opacity: 1;
  }
  .al-action-btn {
    width: 26px; height: 26px;
    display: inline-flex; align-items: center; justify-content: center;
    border: none;
    background: transparent;
    color: var(--ink-mute);
    border-radius: 4px;
    cursor: pointer;
    transition: background .12s, color .12s;
    padding: 0;
  }
  .al-action-btn i { font-size: 14px; line-height: 1; }
  .al-action-btn:hover {
    background: var(--paper-warm);
    color: var(--ink);
  }
  .al-action-btn.active {
    color: var(--vermilion);
  }
  .al-action-btn.active:hover {
    color: var(--vermilion);
    background: var(--vermilion-bg, rgba(190,52,40,0.08));
  }
  .al-action-btn[data-act="dislike"].active {
    color: var(--ink-soft);
  }
  .al-action-sep {
    width: 1px;
    margin: 4px 4px;
    background: var(--rule-soft);
  }

  /* stats 块（数据科学风：metric tiles），用于 KG / 任何结构化指标输出 */
  .al-stats { padding: 14px 16px; }
  .al-stats-grid {
    display: grid;
    grid-template-columns: repeat(auto-fit, minmax(160px, 1fr));
    gap: 16px;
  }
  .al-stat {
    padding-left: 11px;
    border-left: 2px solid var(--rule);
  }
  .al-stat.accent { border-left-color: var(--vermilion); }
  .al-stat.success { border-left-color: var(--success); }
  .al-stat-label {
    font-family: 'JetBrains Mono', monospace;
    font-size: 12px;
    letter-spacing: 0.14em;
    color: var(--ink-mute);
    text-transform: uppercase;
    margin-bottom: 5px;
  }
  .al-stat-val {
    font-family: 'JetBrains Mono', monospace;
    font-size: 18px;
    font-weight: 600;
    color: var(--ink);
    line-height: 1;
    letter-spacing: -0.01em;
    margin-bottom: 5px;
  }
  .al-stat-val small {
    font-size: 12px;
    font-weight: 400;
    color: var(--ink-faint);
    margin-left: 3px;
  }
  .al-stat-sub {
    font-family: 'JetBrains Mono', monospace;
    font-size: 12px;
    color: var(--ink-mute);
    line-height: 1.55;
  }

  /* Knowledge-Graph 可视化（SVG + legend + 交互） */
  .al-kg-wrap { padding: 4px 0 0; position: relative; }
  .al-kg-svg {
    width: 100%;
    height: auto;
    display: block;
    background: var(--paper);
    cursor: default;
  }
  /* 节点 hover：放大 + 描边 */
  .al-kg-svg circle[data-kind="node"] {
    cursor: pointer;
    transition: stroke-width .12s ease;
  }
  .al-kg-svg circle.al-kg-hovered {
    stroke: var(--ink);
    stroke-width: 1.8;
  }
  /* gap marker hover */
  .al-kg-svg g[data-kind="gap"] { cursor: pointer; }
  .al-kg-svg g[data-kind="gap"]:hover circle {
    stroke-width: 1.8;
    opacity: 1;
  }
  /* 社区隐藏态（点 legend chip 关掉某个社区） */
  .al-kg-svg.hide-c0 [data-ci="0"] { opacity: 0.08 !important; }
  .al-kg-svg.hide-c1 [data-ci="1"] { opacity: 0.08 !important; }
  .al-kg-svg.hide-c2 [data-ci="2"] { opacity: 0.08 !important; }
  .al-kg-svg.hide-c3 [data-ci="3"] { opacity: 0.08 !important; }
  .al-kg-svg.hide-c4 [data-ci="4"] { opacity: 0.08 !important; }

  /* 悬浮 tooltip */
  .al-kg-tooltip {
    position: absolute;
    z-index: 10;
    background: var(--ink);
    color: var(--paper);
    padding: 7px 11px;
    border-radius: 4px;
    font-family: 'JetBrains Mono', monospace;
    font-size: 12px;
    line-height: 1.55;
    pointer-events: none;
    box-shadow: 0 3px 10px rgba(0,0,0,0.18);
    max-width: 280px;
    opacity: 0;
    transform: translateY(2px);
    transition: opacity .12s ease, transform .12s ease;
  }
  .al-kg-tooltip.on { opacity: 1; transform: translateY(0); }
  .al-kg-tooltip strong {
    color: #fff;
    font-weight: 600;
  }
  .al-kg-tooltip .t-tag {
    display: inline-block;
    font-size: 12px;
    letter-spacing: 0.1em;
    padding: 1px 5px;
    border-radius: 8px;
    background: rgba(255,255,255,0.14);
    color: rgba(255,255,255,0.85);
    margin-right: 4px;
  }
  .al-kg-tooltip .t-tag.gap {
    background: rgba(255,150,150,0.22);
    color: #ffb3b3;
  }
  .al-kg-tooltip .t-row {
    font-size: 12px;
    color: rgba(255,255,255,0.7);
    margin-top: 3px;
  }
  .al-kg-tooltip .t-q {
    font-size: 12px;
    color: rgba(255,200,200,0.85);
    font-style: italic;
    margin-top: 5px;
    border-top: 1px dashed rgba(255,255,255,0.18);
    padding-top: 5px;
  }

  /* legend chip 可点击切换 */
  .al-kg-legend-item[data-ci] {
    cursor: pointer;
    user-select: none;
    transition: opacity .15s ease;
  }
  .al-kg-legend-item[data-ci]:hover { color: var(--ink); }
  .al-kg-legend-item.al-off {
    opacity: 0.35;
  }
  .al-kg-legend-item.al-off .dot {
    filter: grayscale(0.7);
  }
  /* 小工具栏（reset） */
  .al-kg-tools {
    display: flex;
    justify-content: flex-end;
    gap: 6px;
    padding: 0 4px 8px;
  }
  .al-kg-tools button {
    font-family: 'JetBrains Mono', monospace;
    font-size: 12px;
    padding: 3px 9px;
    border-radius: 3px;
    background: var(--paper);
    border: 0.5px solid var(--rule);
    color: var(--ink-mute);
    cursor: pointer;
    transition: all .15s ease;
  }
  .al-kg-tools button:hover {
    background: var(--paper-warm);
    color: var(--ink);
    border-color: var(--ink-mute);
  }
  .al-kg-legend {
    display: flex;
    flex-wrap: wrap;
    gap: 10px 18px;
    padding: 10px 4px 2px;
    border-top: 1px solid var(--rule-soft);
    margin-top: 6px;
  }
  .al-kg-legend-item {
    display: inline-flex;
    align-items: center;
    gap: 6px;
    font-family: 'JetBrains Mono', monospace;
    font-size: 12px;
    color: var(--ink-soft);
  }
  .al-kg-legend-item .dot {
    width: 8px;
    height: 8px;
    border-radius: 50%;
    flex-shrink: 0;
  }
  .al-kg-legend-item .dot.gap {
    background: transparent;
    border: 1px dashed var(--error);
  }
  .al-kg-legend-item em {
    font-style: normal;
    color: var(--ink);
    font-weight: 600;
    margin-left: 2px;
  }
  .al-kg-legend-item.gap { color: var(--error); }

  /* 嵌入式 rich card（seq / mol3d / freq / lib / struct / rank / verdict） */
  .al-embed { padding: 12px; background: var(--paper); }
  .al-embed > .scene-seq-card,
  .al-embed > .scene-mol3d,
  .al-embed > .scene-freq,
  .al-embed > .scene-lib,
  .al-embed > .scene-struct,
  .al-embed > .scene-rank,
  .al-embed > .scene-verdict {
    max-width: 100% !important;
    margin: 0 !important;
  }
  /* mol3d 在 agent-loop 内部时压缩高度 */
  .al-embed > .scene-mol3d .scene-mol3d-canvas { height: 280px; }
  /* struct hero viewer 在 agent-loop 内部时压缩布局 */
  .al-embed > .scene-struct .scene-struct-hero-canvas { height: 260px; }
  .al-embed > .scene-struct .scene-struct-hero-stage { min-height: 260px; }
  .al-embed > .scene-struct .scene-struct-hero { grid-template-columns: minmax(0, 1fr) 180px; }

  /* 最终回复下方：继续追问 chips */
  .al-followups {
    margin-top: 16px;
    padding-top: 14px;
    border-top: 1px dashed var(--rule-soft);
    animation: alSlideIn .35s ease-out;
  }
  .al-followups-label {
    font-family: 'JetBrains Mono', monospace;
    font-size: 12px;
    color: var(--ink-mute);
    letter-spacing: 0.14em;
    text-transform: uppercase;
    margin-bottom: 9px;
    display: flex; align-items: center; gap: 6px;
  }
  .al-followups-label i { font-size: 12px; color: var(--vermilion); }
  .al-followup-chips { display: flex; flex-wrap: wrap; gap: 8px; }
  .al-chip {
    display: inline-flex;
    align-items: center;
    gap: 6px;
    padding: 7px 13px;
    border: 0.5px solid var(--rule);
    border-radius: 16px;
    background: var(--paper);
    color: var(--ink-soft);
    font-size: 13px;
    line-height: 1.4;
    cursor: pointer;
    transition: all .15s;
    font-family: 'Inter','Noto Serif SC',sans-serif;
  }
  .al-chip:hover {
    border-color: var(--vermilion);
    color: var(--vermilion);
    background: var(--vermilion-bg);
    transform: translateY(-1px);
  }
  .al-chip i { font-size: 13px; }
  .al-chip.primary {
    border-color: var(--ink);
    background: var(--ink);
    color: var(--paper);
    font-weight: 500;
  }
  .al-chip.primary:hover {
    background: var(--vermilion);
    border-color: var(--vermilion);
    color: var(--paper);
  }

  /* ══ STEP / IGES 仿真结构嵌入卡（iframe 装入 fishbone-viewer） ══ */
  .scene-stp {
    border: 1px solid var(--rule);
    border-radius: 4px;
    background: var(--paper);
    overflow: hidden;
    display: flex;
    flex-direction: column;
  }
  .scene-stp-head {
    display: flex;
    align-items: flex-start;
    justify-content: space-between;
    gap: 16px;
    padding: 10px 14px;
    background: var(--paper-cool);
    border-bottom: 1px solid var(--rule);
  }
  .scene-stp-head-left {
    display: flex; flex-direction: column; gap: 2px;
    min-width: 0;
  }
  .scene-stp-eyebrow {
    font-family: 'JetBrains Mono', monospace;
    font-size: 12px;
    letter-spacing: 0.2em;
    color: var(--vermilion);
    text-transform: uppercase;
  }
  .scene-stp-title {
    font-family: 'Noto Serif SC', serif;
    font-size: 13px;
    font-weight: 600;
    color: var(--ink);
    letter-spacing: 0.02em;
  }
  .scene-stp-meta {
    display: flex;
    flex-wrap: wrap;
    gap: 4px 10px;
    font-family: 'JetBrains Mono', monospace;
    font-size: 12px;
    color: var(--ink-mute);
    align-items: baseline;
    justify-content: flex-end;
    max-width: 60%;
  }
  .scene-stp-meta span {
    display: inline-flex; align-items: baseline; gap: 4px;
  }
  .scene-stp-meta em {
    font-style: normal;
    color: var(--ink-faint);
    letter-spacing: 0.1em;
    text-transform: uppercase;
    font-size: 12px;
  }
  .scene-stp-frame {
    position: relative;
    background: #0a0c10;        /* viewer 的内部底色 · 避免加载时白屏闪现 */
    min-height: 280px;
  }
  .scene-stp-frame iframe {
    position: absolute;
    inset: 0;
    width: 100%;
    height: 100%;
    border: 0;
    display: block;
  }
  .scene-stp-foot {
    display: flex;
    align-items: center;
    gap: 12px;
    flex-wrap: wrap;
    padding: 8px 14px;
    border-top: 1px solid var(--rule);
    background: var(--paper-warm);
    font-family: 'JetBrains Mono', monospace;
    font-size: 12px;
    color: var(--ink-mute);
  }
  .scene-stp-file {
    display: inline-flex; align-items: center; gap: 5px;
    color: var(--ink-soft);
    flex: 1;
    min-width: 0;
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
  }
  .scene-stp-file i { color: var(--vermilion); }
  .scene-stp-action {
    display: inline-flex; align-items: center; gap: 4px;
    padding: 4px 8px;
    color: var(--ink-mute);
    border: 1px solid var(--rule);
    border-radius: 3px;
    text-decoration: none;
    transition: color .15s, border-color .15s, background .15s;
  }
  .scene-stp-action:hover {
    color: var(--vermilion);
    border-color: var(--vermilion-soft);
    background: var(--paper);
  }
  .scene-stp-action i { font-size: 12px; }

  /* 湿实验入口 CTA */
  .scene-wetlab {
    max-width: 760px; margin: 0 auto 28px;
    border: 1px solid var(--ink);
    background: var(--paper);
    padding: 22px 26px;
    position: relative;
    animation: sceneFadeIn .6s ease-out;
  }
  .scene-wetlab::before {
    content: ''; position: absolute;
    inset: 4px; border: 1px solid var(--rule);
    pointer-events: none;
  }
  .scene-wetlab-head {
    position: relative; z-index: 1;
    padding-bottom: 12px;
    margin-bottom: 14px;
    border-bottom: 1px solid var(--rule-soft);
  }
  .scene-wetlab-eyebrow {
    font-family: 'JetBrains Mono', monospace;
    font-size: 12px; letter-spacing: 0.22em;
    text-transform: uppercase; color: var(--vermilion);
    margin-bottom: 5px;
  }
  .scene-wetlab-title {
    font-family: 'Noto Serif SC', serif;
    font-size: 16px; font-weight: 500;
    color: var(--ink); letter-spacing: 0.08em;
  }
  .scene-wetlab-body {
    position: relative; z-index: 1;
    font-size: 13px; color: var(--ink-soft);
    line-height: 1.75;
    margin-bottom: 16px;
  }
  .scene-wetlab-body strong {
    font-family: 'JetBrains Mono', monospace;
    font-size: 12px;
    color: var(--vermilion);
  }
  .scene-wetlab-meta {
    display: flex; gap: 18px;
    margin-bottom: 16px;
    font-family: 'JetBrains Mono', monospace;
    font-size: 12px; color: var(--ink-faint);
    letter-spacing: 0.1em;
    position: relative; z-index: 1;
  }
  .scene-wetlab-meta strong {
    color: var(--ink); font-weight: 500;
  }
  .scene-wetlab-actions {
    display: flex; gap: 12px;
    position: relative; z-index: 1;
  }
  .scene-wetlab-btn {
    padding: 9px 18px;
    border: 1px solid var(--rule);
    background: var(--paper);
    color: var(--ink-soft);
    font-family: 'Noto Serif SC', serif;
    font-size: 13px;
    letter-spacing: 0.1em;
    cursor: pointer;
    transition: all .15s;
  }
  .scene-wetlab-btn:hover {
    border-color: var(--ink-soft);
    color: var(--ink);
  }
  .scene-wetlab-btn.primary {
    background: var(--ink);
    color: var(--paper);
    border-color: var(--ink);
  }
  .scene-wetlab-btn.primary:hover {
    background: var(--vermilion);
    border-color: var(--vermilion);
  }

  /* 共用动画 */
  @keyframes sceneFadeIn {
    from { opacity: 0; transform: translateY(6px); }
    to   { opacity: 1; transform: translateY(0); }
  }
  @keyframes scenePulse {
    0%   { box-shadow: 0 0 0 0 var(--vermilion); }
    50%  { box-shadow: 0 0 0 5px var(--vermilion-bg); }
    100% { box-shadow: 0 0 0 0 transparent; }
  }

  /* ============================================================
     视觉优化覆盖（0518）
       1) 重要按钮：默认 ink，hover vermilion（蓝）
       2) 仅大标题保留衬线；小标题与正文用无衬线
       3) 弱化 header 的「实验入口」
       4) 统一输入框 / 卡片等大线框圆角
     ============================================================ */

  /* ── 字体 · 仅大标题保留衬线 ─────────────────── */
  .home-title,
  .home-title em {
    font-family: 'Cormorant Garamond', 'Noto Serif SC', serif !important;
  }
  /* 0529 · logo 改用 Noto Serif SC（aerospace_tenant_v2 风），不再强制 Cormorant */
  .logo-mark,
  .logo-mark em,
  .nav-drawer-logo-mark,
  .nav-drawer-logo-mark em {
    font-family: 'Noto Serif SC', 'Source Han Serif SC', 'Songti SC', serif !important;
  }

  /* ── 较小衬线声明全部转为无衬线 ──────────────── */
  .serif:not(.home-title):not(.logo-mark):not(.nav-drawer-logo-mark),
  .cn-serif,
  .cp-card-title,
  .section-title,
  .project-name,
  .project-card.new-project .label,
  .asset-title,
  .panel-collapsed-strip .strip-label,
  .chat-mode-badge,
  .sa-card-title,
  .sa-card-body .kv .v em,
  .dc-head .dc-title,
  .dc-empty-tip,
  .dc-stage-name,
  .dc-card-title,
  .dc-exp-step-body strong,
  .dc-wl-kpi-table td:first-child,
  .message-response em,
  .ws-title,
  .ws-preview-text,
  .ws-preview-text h3,
  .modal-title,
  .demo-stage-eyebrow,
  .demo-stage-title,
  .demo-stage-title em,
  .demo-stage-foot-cap,
  .demo-scene-latin,
  .demo-scene-h,
  .demo-scene-num,
  .anth-title,
  .anth-title em,
  .anth-num,
  .anth-latin,
  .anth-h,
  .anth-foot-cap,
  .mode-pill,
  .model-option-sub,
  .ds-sum-val,
  .hub-project-name,
  .hub-graph-card-title,
  .session-card-title,
  .session-new-card .plus-icon,
  .session-new-card .new-label,
  .graph-card-title,
  .graph-new-card .plus,
  .graph-new-card .label,
  .graph-viewer-title,
  .graph-stat-value,
  .qs-card-title,
  .vp-card-title,
  .chat-experiment-card-title,
  .gps-graph-title,
  .gps-stat-val,
  .gdp-empty-icon,
  .gdp-title,
  #artifactFsTitle,
  .meeting-mgmt-title,
  .meeting-card-title,
  .meeting-card-summary,
  .meeting-detail-title,
  .fs-meeting-title-input,
  .fs-wave-speaker,
  .md-insight-body,
  .md-rec-headline,
  .md-report-title,
  .md-report-section-title,
  .md-report-stat-val,
  .strip-num,
  .strip-current,
  .scene-mol3d-title,
  .scene-think-label,
  .scene-say em,
  .scene-banner-mark,
  .scene-banner-text,
  .scene-act-roman,
  .scene-act-cn,
  .scene-plan-num,
  .scene-plan-title,
  .scene-seq-rank,
  .scene-seq-name,
  .scene-freq-stats strong,
  .scene-freq-title,
  .scene-lib-title,
  .scene-struct-title,
  .scene-stp-title,
  .scene-wetlab-title,
  .scene-wetlab-desc,
  .al-toolbar-title,
  .al-final-summary h4,
  .psd-title,
  .psd-flow-title,
  .psd-card-title,
  .pf-sum-title,
  .pf-target-title,
  .pf-hero-name,
  .pf-side-name,
  .pf-stepm-name,
  .pf-step-name,
  .pf-toc-label {
    font-family: 'Inter', 'Noto Sans SC', -apple-system, BlinkMacSystemFont,
                 "Segoe UI", "PingFang SC", "Hiragino Sans GB",
                 "Microsoft YaHei", sans-serif !important;
    letter-spacing: 0.01em;
  }

  /* 让小衬线里的 italic em 也回归正常字形 */
  .demo-stage-title em,
  .anth-title em,
  .scene-say em,
  .message-response em,
  .sa-card-body .kv .v em {
    font-style: normal !important;
  }

  /* ── 重要按钮：默认 ink，hover vermilion ─────── */
  .btn.btn-primary,
  .send-btn,
  #composerSendBtn,
  .nav-drawer-cta.primary {
    background: var(--ink) !important;
    color: var(--paper) !important;
    border: 1px solid var(--ink) !important;
    border-radius: 4px !important;
    transition: background .18s ease, border-color .18s ease,
                color .18s ease, box-shadow .18s ease !important;
  }
  .btn.btn-primary:hover,
  .send-btn:hover,
  #composerSendBtn:hover,
  .nav-drawer-cta.primary:hover {
    background: #0d4683 !important;        /* 比主色 #2f7fd8 深一阶 */
    border-color: #0d4683 !important;
    color: #fff !important;
  }
  .send-btn:disabled,
  .send-btn[disabled],
  #composerSendBtn:disabled,
  #composerSendBtn[disabled] {
    background: var(--rule) !important;
    color: var(--ink-faint) !important;
    border-color: var(--rule) !important;
  }

  /* ── 弱化 Header「实验入口」───────────────── */
  .topbar-right > a.btn.btn-primary {
    background: transparent !important;
    color: var(--ink-mute) !important;
    border: 1px solid var(--rule) !important;
    font-weight: 400 !important;
    font-size: 12px !important;
    padding: 6px 12px !important;
    border-radius: 4px !important;
    box-shadow: none !important;
    letter-spacing: 0.02em;
  }
  .topbar-right > a.btn.btn-primary:hover {
    background: var(--paper-warm) !important;
    color: var(--ink-soft) !important;
    border-color: var(--rule-soft) !important;
  }
  .topbar-right > a.btn.btn-primary svg {
    opacity: 0.65;
    width: 13px;
    height: 13px;
  }

  /* ── 统一输入框 / 卡片等大线框圆角（10px）──── */
  .composer,
  .composer-input,
  input[type="text"],
  input[type="search"],
  input[type="email"],
  input[type="number"],
  input[type="password"],
  input[type="url"],
  input[type="tel"],
  textarea,
  select,
  .card,
  .panel,
  .modal,
  .modal-card,
  .ws-card,
  .sb-card,
  .cp-card,
  .sa-card,
  .dc-card,
  .qs-card,
  .vp-card,
  .chat-experiment-card,
  .session-card,
  .graph-card,
  .psd-card,
  .demo-scene,
  .scene-wetlab,
  .scene-mol3d,
  .scene-lib,
  .scene-struct,
  .scene-stp,
  .scene-freq,
  .scene-seq,
  .exec-panel,
  .nav-drawer,
  .anth-piece,
  .meeting-card,
  .dc-exp-step,
  .session-new-card,
  .graph-new-card,
  .project-card,
  .hub-project-card,
  .hub-graph-card,
  .pf-target,
  .pf-sum,
  .pf-hero,
  .pf-side,
  .pf-stepm,
  .pf-step {
    border-radius: 8px !important;
  }
  .composer { border-radius: 8px !important; }

  /* ===== 场景模式 tabs（输入框上方 · 胶囊分段控件）===== */
  .composer-tabs-row {
    max-width: 880px;
    margin: 0 auto 12px;
    text-align: center;
  }
  .composer-tabs {
    display: inline-flex;
    align-items: center;
    gap: 2px;
    padding: 4px;
    background: var(--paper-warm);
    border: 1px solid var(--rule);
    border-radius: 999px;
    max-width: 100%;
  }
  .composer-tab {
    display: inline-flex;
    align-items: center;
    gap: 6px;
    padding: 7px 16px;
    border-radius: 999px;
    font-size: 13px;
    font-weight: 500;
    color: var(--ink-mute);
    background: transparent;
    border: none;
    cursor: pointer;
    white-space: nowrap;
    user-select: none;
    transition: background .15s, color .15s;
  }
  .composer-tab:hover { color: var(--ink-soft); }
  .composer-tab.active {
    background: var(--ink);
    color: var(--paper);
  }
  .composer-tab svg { width: 14px; height: 14px; flex-shrink: 0; }

  /* 大按钮 / Primary 容器 圆角统一 4px（保留小标签徽章原值） */
  .btn,
  .btn.btn-primary,
  .btn.btn-ghost,
  .send-btn,
  #composerSendBtn,
  .nav-drawer-cta,
  .toolbar-icon-btn,
  .quickcmd-btn,
  .attached-files .attached-nav,
  button.btn,
  a.btn {
    border-radius: 4px !important;
  }
  /* 圆形头像保留圆形 */
  .user-avatar { border-radius: 50% !important; }

  /* ── 对话页输入框微调 ────────────────────── */

  /* 1) 占位符与「发送」文字水平对齐：
        改用 align-items:center 让 textarea 与按钮以视觉中线对齐，
        同时显式 line-height 20 + 上下 padding 8，使单行 36px 精准居中 */
  .chat-input-main-row {
    align-items: center !important;
  }
  .chat-input-textarea {
    padding-top: 8px !important;
    padding-bottom: 8px !important;
    line-height: 20px !important;
  }

  /* 2) 激活状态：与首页 composer 一致的深蓝描边 + 蓝色外发光 */
  .chat-input-inner:focus-within {
    border-color: var(--vermilion) !important;
    box-shadow: 0 2px 12px rgba(26,79,140,0.12),
                0 0 0 3px rgba(26,79,140,0.08) !important;
  }

  /* 3) 默认未输入内容时，发送按钮置灰禁用 */
  .chat-input-textarea:placeholder-shown
    + .chat-input-send-wrap .send-btn,
  .chat-input-textarea:placeholder-shown
    ~ .chat-input-send-wrap .send-btn {
    background: var(--rule) !important;
    color: var(--ink-faint) !important;
    border-color: var(--rule) !important;
    cursor: not-allowed !important;
    opacity: 0.7 !important;
    pointer-events: none;
  }

  /* ── 附件 chip 横向单行 + 箭头滚动 ──────────── */
  .attached-files {
    flex-wrap: nowrap !important;
    align-items: center !important;
    gap: 4px !important;
  }
  .attached-files .attached-strip {
    flex: 1;
    min-width: 0;
    display: flex;
    flex-wrap: nowrap;
    gap: 5px;
    overflow-x: auto;
    scroll-behavior: smooth;
    scrollbar-width: none;        /* Firefox */
  }
  .attached-files .attached-strip::-webkit-scrollbar { display: none; }
  .attached-files .attached-chip {
    flex-shrink: 0;
    white-space: nowrap;
    max-width: 220px;
  }
  .attached-files .attached-chip > span:not(.attached-chip-remove) {
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
  }
  .attached-files .attached-nav {
    flex-shrink: 0;
    width: 20px;
    height: 22px;
    border: 1px solid var(--rule);
    background: var(--paper);
    border-radius: 4px;
    display: flex;
    align-items: center;
    justify-content: center;
    color: var(--ink-mute);
    cursor: pointer;
    padding: 0;
    transition: opacity .15s, color .15s, border-color .15s, background .15s;
  }
  .attached-files .attached-nav:hover {
    color: var(--ink);
    border-color: var(--ink-soft);
    background: var(--paper-warm);
  }
  .attached-files .attached-nav[data-disabled="true"] {
    opacity: 0.3;
    pointer-events: none;
  }
  .attached-files .attached-nav[data-hidden="true"] {
    display: none;
  }

  /* ── 首页卡片 · 标题衬线 + 前置 icon / tag 无衬线 ── */
  .demo-scene-h {
    display: flex !important;
    align-items: center;
    gap: 8px;
    font-family: 'Noto Serif SC', 'Songti SC', serif !important;
    letter-spacing: 0.06em !important;
  }
  .demo-scene-icon {
    width: 18px;
    height: 18px;
    flex-shrink: 0;
    color: var(--vermilion);
    stroke: currentColor;
    fill: none;
    stroke-width: 1.6;
    stroke-linecap: round;
    stroke-linejoin: round;
  }
  .demo-scene-tags li {
    font-family: 'Inter', 'Noto Sans SC', -apple-system,
                 "Segoe UI", "PingFang SC", "Microsoft YaHei",
                 sans-serif !important;
  }

  /* ── 输入框占位符 + 发送按钮 强制无衬线 ─────── */
  .composer-input,
  .chat-input-textarea,
  #composerSendBtn,
  .send-btn {
    font-family: 'Inter', 'Noto Sans SC', -apple-system,
                 BlinkMacSystemFont, "Segoe UI", "PingFang SC",
                 "Hiragino Sans GB", "Microsoft YaHei",
                 sans-serif !important;
  }
  .composer-input::placeholder,
  .chat-input-textarea::placeholder {
    font-family: 'Inter', 'Noto Sans SC', -apple-system,
                 BlinkMacSystemFont, "Segoe UI", "PingFang SC",
                 "Hiragino Sans GB", "Microsoft YaHei",
                 sans-serif !important;
    font-style: normal !important;
  }

  /* 对话页输入框外框圆角与首页 composer / 卡片统一 */
  .chat-input-inner {
    border-radius: 8px !important;
  }

  /* 卡片描述文字 · 与输入框占位符使用同一无衬线字体栈 */
  .demo-scene-desc {
    font-family: 'Inter', 'Noto Sans SC', -apple-system,
                 BlinkMacSystemFont, "Segoe UI", "PingFang SC",
                 "Hiragino Sans GB", "Microsoft YaHei",
                 sans-serif !important;
  }

  /* 对话气泡 · 用户输入与模型回复正文统一无衬线 */
  .message-user-bubble,
  .message-quick-bubble,
  .message-quick-bubble em,
  .message-quick-bubble strong,
  .message-response,
  .message-response p,
  .message-response li,
  .message-response strong,
  .message-response em,
  .message-response .callout {
    font-family: 'Inter', 'Noto Sans SC', -apple-system,
                 BlinkMacSystemFont, "Segoe UI", "PingFang SC",
                 "Hiragino Sans GB", "Microsoft YaHei",
                 sans-serif !important;
    font-style: normal !important;
  }
  /* 等宽字体仍保留：行内 code / 序列等 */
  .message-quick-bubble code,
  .message-response code {
    font-family: 'JetBrains Mono', ui-monospace, monospace !important;
  }

  /* 进一步：覆盖更多模型回复 / 场景叙事容器，强制无衬线 */
  .scene-say,
  .scene-say em,
  .scene-say strong,
  .scene-banner-text,
  .al-final,
  .al-final p,
  .al-final li,
  .al-final em,
  .al-final strong,
  .al-final-text,
  .al-final-text p,
  .al-final-text li,
  .al-final-text em,
  .al-final-text strong,
  .al-body-sec,
  .al-body-sec p,
  .al-body-sec li,
  .al-body-sec em,
  .al-body-sec strong {
    font-family: 'Inter', 'Noto Sans SC', -apple-system,
                 BlinkMacSystemFont, "Segoe UI", "PingFang SC",
                 "Hiragino Sans GB", "Microsoft YaHei",
                 sans-serif !important;
    font-style: normal !important;
  }
  /* 行内 code 仍保留等宽 */
  .scene-say code,
  .al-final code,
  .al-final-text code,
  .al-body-sec code {
    font-family: 'JetBrains Mono', ui-monospace, monospace !important;
  }

  /* ── 模型回复 summary 入口 · 改为圆形图标按钮，并由 JS 动态垂直跟随对应回复 ── */
  .pf-sum-anchor {
    width: 32px !important;
    height: 32px !important;
    padding: 0 !important;
    border-radius: 50% !important;
    justify-content: center !important;
    gap: 0 !important;
    background: var(--paper) !important;
    border: 1px solid var(--rule) !important;
    box-shadow: 0 2px 6px -1px rgba(0,0,0,0.06) !important;
    right: 8px !important;       /* 紧贴 chat-panel 右缘 8px */
  }
  /* chat 内容区右内边距加宽到 80px，让所有模型回复元素（气泡 / chips / callout 等）
     的右边界统一在距 chat-panel 右缘 80px 处；icon 左缘距右缘 40px → 精确 40px 间距 */
  .chat-messages {
    padding-right: 80px !important;
  }
  .pf-sum-anchor:hover {
    border-color: var(--vermilion) !important;
    color: var(--vermilion) !important;
    transform: translateY(-1px);
  }
  .pf-toc-bullet,
  .pf-toc-label,
  .pf-toc-go { display: none !important; }
  .pf-toc-icon {
    width: 16px;
    height: 16px;
    color: var(--ink-mute);
    transition: color .15s;
  }
  .pf-sum-anchor:hover .pf-toc-icon { color: var(--vermilion); }

  /* ── 步骤锚点连接线：实线 → 点状虚线（点 ×2、间距 ×2） ── */
  .al-spine-line {
    width: 2px !important;
    background: none !important;
    background-color: transparent !important;
    background-image: linear-gradient(to bottom,
                                      var(--rule-soft) 0,
                                      var(--rule-soft) 2px,
                                      transparent 2px,
                                      transparent 5px) !important;
    background-size: 2px 5px !important;
    background-repeat: repeat-y !important;
    border-left: none !important;
  }

  /* ── 首页「深度研究」卡片隐藏，剩余 4 张卡片改为 1 行 4 列布局 ── */
  .demo-scene[data-theme="deep"] { display: none !important; }
  .demo-stage-grid { grid-template-columns: repeat(4, 1fr) !important; }
  @media (max-width: 880px) {
    .demo-stage-grid { grid-template-columns: repeat(2, 1fr) !important; }
  }
  @media (max-width: 560px) {
    .demo-stage-grid { grid-template-columns: 1fr !important; }
  }

  /* Header「实验入口」按钮文字 · 非衬线 */
  .topbar-right > a.btn.btn-primary {
    font-family: 'Inter', 'Noto Sans SC', -apple-system,
                 BlinkMacSystemFont, "Segoe UI", "PingFang SC",
                 "Hiragino Sans GB", "Microsoft YaHei",
                 sans-serif !important;
  }

  /* ──「继续探索」首项 chip 弱化：蓝色线框 + 蓝字，与其他选项一致的轮廓形式 ── */
  .al-chip.primary {
    background: var(--paper) !important;
    border: 1px solid var(--vermilion) !important;
    color: var(--vermilion) !important;
    font-weight: 500 !important;
  }
  .al-chip.primary:hover {
    background: var(--vermilion-bg) !important;
    border-color: var(--vermilion) !important;
    color: var(--vermilion) !important;
  }

  /* ── 右侧面板底部「下一步」首项弱化（与 .al-chip.primary 保持一致语言） ── */
  .psd-cta.primary,
  .pf-sum-cta-btn.primary {
    background: var(--paper) !important;
    border: 1px solid var(--vermilion) !important;
    color: var(--vermilion) !important;
  }
  .psd-cta.primary:hover,
  .pf-sum-cta-btn.primary:hover {
    background: var(--vermilion-bg) !important;
    border-color: var(--vermilion) !important;
    color: var(--vermilion) !important;
  }

  /* =====================================================
     ↓ 全局左侧导航（复用 home.html 侧栏视觉，1:1 同款）
     仅保留：新建对话 / 科学工具
     ===================================================== */

  /* 局部 token：sidebar / avatar-popup（默认 sky） */
  .sidebar,
  .avatar-popup {
    --bg-soft: #dbe7f5;
    --paper: #ffffff;
    --ink: #0d2540;
    --ink-soft: #38547a;
    --muted: #6b7d9a;
    --muted-2: #a0b0c8;
    --line: #b8ccdf;
    --line-soft: #d0dee9;
    --accent: #2f7fd8;
    --accent-soft: #6ea9e8;
    --notification: #c93838;
    --sans: "Noto Sans SC", -apple-system, BlinkMacSystemFont, "Helvetica Neue", sans-serif;
    --serif: "Noto Serif SC", "Songti SC", "Source Han Serif SC", serif;
    --display: "Cormorant Garamond", "Noto Serif SC", serif;
    --mono: "JetBrains Mono", "SF Mono", Menlo, monospace;
  }
  :root[data-theme="origin"] .sidebar,
  :root[data-theme="origin"] .avatar-popup {
    --bg-soft: #f0ebdb; --paper: #faf7ee; --ink: #1a2438; --ink-soft: #3a4663;
    --muted: #8a8676; --muted-2: #b8b3a1;
    --line: #e4dec9; --line-soft: #ece6d3;
    --accent: #2c4a7a; --accent-soft: #5a7fb5; --notification: #d8513e;
  }
  :root[data-theme="dark"] .sidebar,
  :root[data-theme="dark"] .avatar-popup {
    --bg-soft: #10161f; --paper: #141a24; --ink: #e8ecf3; --ink-soft: #b8c0ce;
    --muted: #a0abbc; --muted-2: #7d8593;
    --line: #2a3341; --line-soft: #1e2632;
    --accent: #5aa9e6; --accent-soft: #7ebae8; --notification: #e64848;
  }
  :root[data-theme="dark2"] .sidebar,
  :root[data-theme="dark2"] .avatar-popup {
    --bg-soft: #0f1a3c; --paper: #142347; --ink: #f4f7ff; --ink-soft: #c8d3ec;
    --muted: #94a3c6; --muted-2: #6a7ea3;
    --line: #2a4380; --line-soft: #1c3266;
    --accent: #5aa9ff; --accent-soft: #7bbfff; --notification: #ff6968;
  }

  /* 让全局内容向右让位 232px 给侧栏 */
  body { padding-left: 232px; transition: padding-left .25s cubic-bezier(.2,.7,.3,1); }
  body.sidebar-collapsed { padding-left: 68px; }

  /* 侧栏外壳 */
  .sidebar{
    position: fixed;
    left: 0;
    top: 0;
    width: 232px;
    height: 100vh;
    background: var(--bg-soft);
    border-right: 1px solid var(--line);
    box-shadow: 2px 0 8px -3px rgba(15, 42, 90, 0.08);
    display: flex;
    flex-direction: column;
    padding: 18px 14px 14px;
    overflow: hidden;
    font-family: var(--sans);
    color: var(--ink);
    font-size: 14px;
    z-index: 60;
    transition: width .25s cubic-bezier(.2,.7,.3,1), padding .25s cubic-bezier(.2,.7,.3,1);
  }
  body.sidebar-collapsed .sidebar{ width: 68px; padding: 18px 10px 14px; }

  /* 品牌区 */
  .sidebar .brand{
    display: flex;
    align-items: center;
    justify-content: space-between;
    padding: 4px 6px 18px;
  }
  body.sidebar-collapsed .sidebar .brand{
    flex-direction: column;
    align-items: center;
    gap: 12px;
    padding: 4px 0 16px;
  }
  .sidebar .brand-left{
    display: flex;
    align-items: center;
    gap: 8px;
    min-width: 0;
    border: 0;
    background: transparent;
    padding: 0;
    cursor: pointer;
    text-align: left;
  }
  .sidebar .brand-left:focus-visible{
    outline: 1px solid var(--accent-soft);
    outline-offset: 4px;
    border-radius: 6px;
  }
  .sidebar .mascot{
    width: 44px;
    height: 44px;
    flex-shrink: 0;
    background: url('../src/logo.png') center / contain no-repeat;
    position: relative;
  }
  /* 旧十字 pseudo 图案 · 用 Logo 图后不再显示 */
  .sidebar .mascot::before,
  .sidebar .mascot::after{
    content: none;
  }
  .sidebar .brand-name{
    font-family: var(--serif);
    font-weight: 700;
    font-size: 18px;
    letter-spacing: 0.3px;
    color: var(--ink);
    white-space: nowrap;
  }
  .sidebar .brand-name em{
    color: var(--accent);
    font-style: normal;
  }
  body.sidebar-collapsed .sidebar .brand-name{ display: none; }

  .sidebar .sidebar-collapse{
    width: 28px; height: 28px;
    border-radius: 6px;
    display: grid;
    place-items: center;
    color: var(--muted);
    cursor: pointer;
    transition: background .2s, color .2s;
    background: transparent;
    border: none;
  }
  .sidebar .sidebar-collapse:hover{ background: rgba(0,0,0,.05); color: var(--ink); }
  .sidebar .sidebar-collapse svg{ width: 18px; height: 18px; }
  .sidebar .sidebar-collapse .ico-expand{ display: none; }
  body.sidebar-collapsed .sidebar .sidebar-collapse .ico-collapse{ display: none; }
  body.sidebar-collapsed .sidebar .sidebar-collapse .ico-expand{ display: block; }

  /* 导航 */
  .sidebar .nav{
    display: flex;
    flex-direction: column;
    gap: 2px;
  }
  .sidebar .nav-item{
    display: flex;
    align-items: center;
    gap: 10px;
    padding: 9px 12px;
    border-radius: 8px;
    color: var(--ink-soft);
    cursor: pointer;
    font-size: 13.5px;
    transition: background .15s, color .15s;
    user-select: none;
  }
  .sidebar .nav-item:hover{ background: rgba(0,0,0,.035); color: var(--ink); }
  .sidebar .nav-item.active{
    background: #fff;
    color: var(--accent);
    box-shadow: 0 1px 2px rgba(44,74,122,.04), 0 0 0 1px rgba(44,74,122,.08);
    font-weight: 500;
  }
  .sidebar .nav-item svg{ width: 16px; height: 16px; flex-shrink: 0; }
  .sidebar .nav-item span{ white-space: nowrap; overflow: hidden; }
  body.sidebar-collapsed .sidebar .nav-item{ justify-content: center; padding: 9px 0; }
  body.sidebar-collapsed .sidebar .nav-item span{ display: none; }

  .sidebar .nav-divider{
    height: 1px;
    background: var(--line-soft);
    margin: 10px 10px;
    opacity: .8;
  }
  body.sidebar-collapsed .sidebar .nav-divider{ margin: 10px 6px; }

  .sidebar .nav-section-title{
    display: flex;
    align-items: center;
    gap: 10px;
    padding: 8px 12px 6px;
    color: var(--muted);
    font-size: 13px;
  }
  .sidebar .nav-section-title svg{ width: 16px; height: 16px; flex-shrink: 0; }
  .sidebar .nav-section-title span{ white-space: nowrap; overflow: hidden; }
  body.sidebar-collapsed .sidebar .nav-section-title{ justify-content: center; padding: 8px 0 4px; }
  body.sidebar-collapsed .sidebar .nav-section-title span{ display: none; }

  .sidebar .history{
    flex: 1;
    overflow-y: auto;
    display: flex;
    flex-direction: column;
    gap: 1px;
    margin-bottom: 10px;
    scrollbar-width: thin;
    scrollbar-color: var(--line) transparent;
  }
  .sidebar .history::-webkit-scrollbar{ width: 4px; }
  .sidebar .history::-webkit-scrollbar-thumb{ background: var(--line); border-radius: 4px; }

  .sidebar .history-item{
    padding: 7px 12px;
    color: var(--ink-soft);
    font-size: 12.5px;
    border-radius: 6px;
    cursor: pointer;
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
    transition: background .15s;
  }
  .sidebar .history-item:hover{ background: rgba(0,0,0,.035); }
  .sidebar .history-more{
    padding: 8px 12px;
    color: var(--ink);
    font-size: 12.5px;
    font-weight: 500;
    cursor: pointer;
    border-radius: 6px;
  }
  .sidebar .history-more:hover{ background: rgba(0,0,0,.035); }
  body.sidebar-collapsed .sidebar .history-item,
  body.sidebar-collapsed .sidebar .history-more{ display: none; }

  .sidebar .sidebar-footer{
    border-top: 1px solid var(--line);
    padding-top: 12px;
    display: flex;
    align-items: center;
    gap: 8px;
  }
  body.sidebar-collapsed .sidebar .sidebar-footer{
    flex-direction: column;
    align-items: center;
    gap: 8px;
    padding-top: 12px;
  }
  .sidebar .footer-spacer{ flex: 1; }
  body.sidebar-collapsed .sidebar .footer-spacer{ display: none; }

  .sidebar .avatar{
    width: 32px; height: 32px;
    border-radius: 50%;
    background: #1a2438;
    color: #f5f1e6;
    display: grid;
    place-items: center;
    font-weight: 500;
    font-size: 13px;
    font-family: var(--display);
    cursor: pointer;
  }
  .sidebar .avatar-wrap{
    position: relative;
    display: flex;
    align-items: center;
  }
  body.sidebar-collapsed .sidebar .avatar-wrap{ order: 99; margin-top: 4px; }

  /* 头像 hover 浮层 */
  .avatar-popup{
    position: fixed;
    width: 268px;
    background: var(--paper);
    border: 1px solid var(--line);
    border-radius: 14px;
    box-shadow:
      0 30px 60px -20px rgba(15,30,60,.18),
      0 12px 24px -16px rgba(0,0,0,.10);
    padding: 22px 0 8px;
    opacity: 0;
    visibility: hidden;
    transform: translateX(-6px);
    transition: opacity .18s ease, visibility .18s ease, transform .18s ease;
    z-index: 9999;
    pointer-events: none;
    color: var(--ink);
    font-family: var(--sans);
  }
  .avatar-popup.is-visible{
    opacity: 1;
    visibility: visible;
    transform: translateX(0);
    pointer-events: auto;
  }
  .avatar-popup::before{
    content: '';
    position: absolute;
    left: -6px;
    width: 12px; height: 12px;
    background: var(--paper);
    border-left: 1px solid var(--line);
    border-bottom: 1px solid var(--line);
    transform: rotate(45deg);
  }
  .avatar-popup[data-dir="up"]::before{ bottom: 18px; top: auto; }
  .avatar-popup[data-dir="down"]::before{ top: 18px; bottom: auto; }

  .avatar-popup-head{
    display: flex;
    flex-direction: column;
    align-items: center;
    padding: 6px 20px 18px;
  }
  .avatar-popup-avatar{
    width: 60px; height: 60px;
    border-radius: 50%;
    background: #1a2438;
    color: #f5f1e6;
    display: grid;
    place-items: center;
    font-family: var(--display);
    font-weight: 700;
    font-size: 22px;
    margin-bottom: 12px;
    box-shadow: 0 4px 12px -4px rgba(0,0,0,.25);
  }
  .avatar-popup-name{
    font-family: var(--sans);
    font-size: 15px;
    font-weight: 600;
    color: var(--ink);
    letter-spacing: 0.01em;
  }
  .avatar-popup-menu{ border-top: 1px solid var(--line); }
  .avatar-popup-item{
    display: flex;
    align-items: center;
    gap: 14px;
    padding: 13px 22px;
    color: var(--ink-soft);
    text-decoration: none;
    font-family: var(--sans);
    font-size: 13.5px;
    border-bottom: 1px solid var(--line);
    transition: background .15s, color .15s;
    cursor: pointer;
  }
  .avatar-popup-item:last-child{ border-bottom: none; }
  .avatar-popup-item:hover{
    background: var(--bg-soft);
    color: var(--ink);
  }
  .avatar-popup-item .api-icon{
    width: 17px; height: 17px;
    color: var(--muted);
    flex-shrink: 0;
    transition: color .15s;
  }
  .avatar-popup-item:hover .api-icon{ color: var(--ink-soft); }
  .avatar-popup-item .api-label{ flex: 1; }
  .avatar-popup-item .api-chev{
    width: 14px; height: 14px;
    color: var(--muted-2);
    flex-shrink: 0;
  }
  .avatar-popup-item.is-group-end{
    border-bottom: 1px solid var(--line);
    box-shadow: 0 4px 0 var(--bg-soft);
  }
  .avatar-popup-item.is-logout{ color: var(--ink-soft); }
  .avatar-popup-item.is-logout:hover{ color: #c66648; }
  .avatar-popup-item.is-logout:hover .api-icon{ color: #c66648; }

  .sidebar .footer-icon{
    width: 28px; height: 28px;
    border-radius: 6px;
    display: grid;
    place-items: center;
    color: var(--muted);
    cursor: pointer;
    position: relative;
    transition: background .15s, color .15s;
    background: transparent;
    border: none;
  }
  .sidebar .footer-icon:hover{ background: rgba(0,0,0,.04); color: var(--ink); }
  .sidebar .footer-icon svg{ width: 16px; height: 16px; }
  .sidebar .footer-icon-lang{
    background: transparent;
    border: none;
    display: inline-flex;
    align-items: center;
    justify-content: center;
    line-height: 1;
    user-select: none;
    transition: background .15s, color .15s, transform .25s;
  }
  .sidebar .footer-icon-lang .lang-cn{
    font-family: var(--serif);
    font-size: 14px;
    font-weight: 700;
  }
  .sidebar .footer-icon-lang .lang-en{
    font-family: var(--mono);
    font-size: 9.5px;
    font-weight: 700;
    margin-left: -1px;
    position: relative;
    top: -3px;
  }
  .sidebar .footer-icon-lang[data-lang="en"] .lang-cn{
    font-size: 9.5px;
    font-family: var(--mono);
    font-weight: 700;
    order: 2;
    margin-left: -1px;
    position: relative;
    top: -3px;
  }
  .sidebar .footer-icon-lang[data-lang="en"] .lang-en{
    font-family: var(--serif);
    font-size: 14px;
    order: 1;
    margin-left: 0;
    top: 0;
  }
  .sidebar .footer-icon-lang:active{ transform: scale(0.92); }
  .sidebar .badge{
    position: absolute;
    top: -2px; right: -2px;
    min-width: 14px; height: 14px;
    border-radius: 50%;
    background: var(--notification);
    color: #fff;
    font-size: 9px;
    font-weight: 600;
    display: grid;
    place-items: center;
    padding: 0 3px;
    border: 1.5px solid var(--bg-soft);
  }

  @media (max-width: 860px){
    body{ padding-left: 64px; }
    .sidebar{ width: 64px; padding: 18px 8px 14px; }
    .sidebar .brand-name,
    .sidebar .nav-item span,
    .sidebar .history,
    .sidebar .nav-section-title span,
    .sidebar .sidebar-collapse{ display: none; }
    .sidebar .nav-item{ justify-content: center; padding: 9px; }
  }

  /* =====================================================
     ↓ 工具库 (#pageTools) + 技能库 (#pageSkills)
     视觉与 home.html 科学工具 1:1（MCP 卡 / Skill 卡 / 双轴筛选 / Sort）
     局部 token 与 home.html 完全一致，避免污染全局
     ===================================================== */
  #pageTools, #pageSkills{
    --bg-soft: #eaf1fa;
    --paper: #ffffff;
    --ink: #0d2540;
    --ink-soft: #38547a;
    --muted: #6b7d9a;
    --muted-2: #a0b0c8;
    --line: #d0dee9;
    --line-soft: #e5eef7;
    --accent: #2f7fd8;
    --accent-soft: #6ea9e8;
    --sans: "Noto Sans SC", -apple-system, BlinkMacSystemFont, "Helvetica Neue", sans-serif;
    --serif: "Noto Serif SC", "Songti SC", "Source Han Serif SC", serif;
    --display: "Cormorant Garamond", "Noto Serif SC", serif;
    --mono: "JetBrains Mono", "SF Mono", Menlo, monospace;
  }
  :root[data-theme="origin"] #pageTools, :root[data-theme="origin"] #pageSkills {
    --bg-soft: #f0ebdb; --paper: #faf7ee; --ink: #1a2438; --ink-soft: #3a4663;
    --muted: #8a8676; --muted-2: #b8b3a1;
    --line: #e4dec9; --line-soft: #ece6d3;
    --accent: #2c4a7a; --accent-soft: #5a7fb5;
  }
  :root[data-theme="dark"] #pageTools, :root[data-theme="dark"] #pageSkills {
    --bg-soft: #10161f; --paper: #141a24; --ink: #e8ecf3; --ink-soft: #b8c0ce;
    --muted: #a0abbc; --muted-2: #7d8593;
    --line: #2a3341; --line-soft: #1e2632;
    --accent: #5aa9e6; --accent-soft: #7ebae8;
  }
  :root[data-theme="dark2"] #pageTools, :root[data-theme="dark2"] #pageSkills {
    --bg-soft: #0f1a3c; --paper: #142347; --ink: #f4f7ff; --ink-soft: #c8d3ec;
    --muted: #94a3c6; --muted-2: #6a7ea3;
    --line: #2a4380; --line-soft: #1c3266;
    --accent: #5aa9ff; --accent-soft: #7bbfff;
  }
  #pageTools.page.active,
  #pageSkills.page.active{
    display: block;
    background: var(--page-bg);
    min-height: calc(100vh - 56px);
    padding: 40px 56px 56px;
    font-family: var(--sans);
    color: var(--ink);
  }
  @media (max-width: 720px){
    #pageTools.page.active,
    #pageSkills.page.active{ padding: 24px 18px 40px; }
  }

  #pageTools .apps-view,
  #pageSkills .apps-view{
    width: 100%;
    max-width: 1280px;
    margin: 0 auto;
  }

  /* Header */
  #pageTools .apps-header,
  #pageSkills .apps-header{
    display: flex;
    align-items: flex-end;
    justify-content: space-between;
    margin-bottom: 28px;
    gap: 24px;
    flex-wrap: wrap;
  }
  #pageTools .apps-eyebrow,
  #pageSkills .apps-eyebrow{
    font-family: var(--display);
    font-size: 12px;
    letter-spacing: 0.32em;
    color: var(--accent);
    text-transform: uppercase;
    margin-bottom: 8px;
  }
  #pageTools .apps-title,
  #pageSkills .apps-title{
    font-family: var(--serif);
    font-weight: 700;
    font-size: 30px;
    color: var(--ink);
    letter-spacing: 0.02em;
    margin: 0;
  }
  #pageTools .apps-title em,
  #pageSkills .apps-title em{
    color: var(--accent);
    font-style: italic;
    font-weight: 500;
  }
  #pageTools .apps-head-meta,
  #pageSkills .apps-head-meta{
    font-size: 13px;
    color: var(--muted);
    margin-top: 6px;
    letter-spacing: 0.02em;
  }
  #pageTools .apps-search,
  #pageSkills .apps-search{
    display: flex;
    align-items: center;
    gap: 8px;
    background: var(--paper);
    border: 1px solid var(--line);
    border-radius: 999px;
    padding: 9px 16px;
    width: 300px;
    max-width: 100%;
    color: var(--muted);
    transition: border-color .2s, box-shadow .2s;
  }
  #pageTools .apps-search:focus-within,
  #pageSkills .apps-search:focus-within{
    border-color: var(--accent-soft);
    box-shadow: 0 0 0 4px rgba(60,106,168,.06);
  }
  #pageTools .apps-search svg,
  #pageSkills .apps-search svg{ width: 14px; height: 14px; flex-shrink: 0; }
  #pageTools .apps-search input,
  #pageSkills .apps-search input{
    flex: 1; min-width: 0;
    border: none; outline: none; background: transparent;
    font-family: var(--sans); font-size: 13px; color: var(--ink);
  }
  #pageTools .apps-search input::placeholder,
  #pageSkills .apps-search input::placeholder{ color: var(--muted-2); }

  /* 双轴筛选 */
  #pageTools .apps-tags,
  #pageSkills .apps-tags{ margin-bottom: 28px; }
  #pageTools .tag-row,
  #pageSkills .tag-row{
    display: flex;
    flex-wrap: wrap;
    gap: 8px;
    align-items: center;
  }
  #pageTools .tag-row.secondary,
  #pageSkills .tag-row.secondary{ margin-top: 12px; }
  #pageTools .tag-row-label,
  #pageSkills .tag-row-label{
    font-size: 13px;
    color: var(--muted);
    letter-spacing: 0.04em;
    margin-right: 12px;
    font-family: var(--sans);
    font-weight: 500;
    flex-shrink: 0;
  }
  #pageTools .tag-chip,
  #pageSkills .tag-chip{
    display: inline-flex;
    align-items: center;
    gap: 6px;
    padding: 7px 14px 7px 11px;
    border-radius: 999px;
    font-size: 13px;
    color: var(--ink-soft);
    background: var(--paper);
    border: 1px solid var(--line);
    cursor: pointer;
    transition: all .18s ease;
    user-select: none;
    font-family: var(--sans);
  }
  #pageTools .tag-chip svg,
  #pageSkills .tag-chip svg{ width: 13px; height: 13px; opacity: .68; transition: opacity .18s; }
  #pageTools .tag-chip:hover,
  #pageSkills .tag-chip:hover{ background: var(--bg-soft); border-color: var(--muted-2); color: var(--ink); }
  #pageTools .tag-chip.active,
  #pageSkills .tag-chip.active{
    color: #fff;
    background: var(--vermilion);
    border-color: var(--vermilion);
  }
  #pageTools .tag-chip.active svg,
  #pageSkills .tag-chip.active svg{ opacity: 1; }
  #pageTools .tag-chip-sec,
  #pageSkills .tag-chip-sec{
    display: inline-flex;
    align-items: center;
    gap: 6px;
    padding: 6px 12px 6px 10px;
    border-radius: 6px;
    font-size: 12.5px;
    color: var(--muted);
    background: transparent;
    border: 1px solid transparent;
    cursor: pointer;
    transition: all .15s;
    user-select: none;
    font-family: var(--sans);
  }
  #pageTools .tag-chip-sec svg,
  #pageSkills .tag-chip-sec svg{ width: 12px; height: 12px; opacity: .65; transition: opacity .15s; }
  #pageTools .tag-chip-sec:hover,
  #pageSkills .tag-chip-sec:hover{ color: var(--ink); background: var(--bg-soft); }
  #pageTools .tag-chip-sec.active,
  #pageSkills .tag-chip-sec.active{
    color: var(--ink);
    background: var(--bg-soft);
    font-weight: 500;
  }

  /* Sort bar */
  #pageTools .tools-toolbar,
  #pageSkills .tools-toolbar{
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: 16px;
    flex-wrap: wrap;
    margin-bottom: 22px;
    padding-bottom: 14px;
    border-bottom: 1px solid var(--line);
  }
  #pageTools .tools-toolbar-left,
  #pageSkills .tools-toolbar-left{
    display: inline-flex;
    align-items: center;
    gap: 16px;
    font-family: var(--sans);
  }
  #pageTools .toolbar-count,
  #pageSkills .toolbar-count{
    font-family: var(--mono);
    font-size: 12px;
    color: var(--muted);
    letter-spacing: 0.04em;
  }
  #pageTools .toolbar-count strong,
  #pageSkills .toolbar-count strong{
    font-family: var(--display);
    font-style: italic;
    color: var(--ink);
    font-size: 15px;
    font-weight: 700;
    margin: 0 3px;
  }
  #pageTools .tools-sort,
  #pageSkills .tools-sort{
    display: inline-flex;
    align-items: center;
    gap: 10px;
  }
  #pageTools .tools-sort-label,
  #pageSkills .tools-sort-label{
    font-family: var(--mono);
    font-size: 10.5px;
    letter-spacing: 0.18em;
    color: var(--muted);
    text-transform: uppercase;
  }
  #pageTools .tools-sort-group,
  #pageSkills .tools-sort-group{
    display: inline-flex;
    gap: 2px;
    background: var(--bg-soft);
    border: 1px solid var(--line);
    border-radius: 999px;
    padding: 3px;
  }
  #pageTools .tools-sort-btn,
  #pageSkills .tools-sort-btn{
    display: inline-flex;
    align-items: center;
    gap: 5px;
    padding: 6px 13px;
    background: transparent;
    border: none;
    border-radius: 999px;
    color: var(--muted);
    font-family: var(--sans);
    font-size: 12px;
    font-weight: 600;
    cursor: pointer;
    transition: all .2s ease;
    white-space: nowrap;
  }
  #pageTools .tools-sort-btn svg,
  #pageSkills .tools-sort-btn svg{ width: 12px; height: 12px; }
  #pageTools .tools-sort-btn:hover:not(.is-active),
  #pageSkills .tools-sort-btn:hover:not(.is-active){ color: var(--ink); }
  #pageTools .tools-sort-btn.is-active,
  #pageSkills .tools-sort-btn.is-active{
    background: var(--ink);
    color: var(--paper);
    box-shadow: 0 4px 10px -5px rgba(0,0,0,.35);
  }

  /* 空态 */
  #pageTools .grid-empty,
  #pageSkills .grid-empty{
    text-align: center;
    padding: 60px 20px;
    color: var(--muted);
    font-family: var(--sans);
    font-size: 14px;
    background: var(--paper);
    border: 1px dashed var(--line);
    border-radius: 12px;
  }

  /* ===== MCP 卡片（工具库） ===== */
  #pageTools .mcp-grid{
    display: grid;
    grid-template-columns: repeat(4, 1fr);
    gap: 16px;
  }
  @media (max-width: 1200px){ #pageTools .mcp-grid{ grid-template-columns: repeat(3, 1fr); } }
  @media (max-width: 900px){  #pageTools .mcp-grid{ grid-template-columns: repeat(2, 1fr); } }
  @media (max-width: 600px){  #pageTools .mcp-grid{ grid-template-columns: 1fr; } }
  #pageTools .mcp-card{
    background: var(--paper);
    border: 1px solid var(--line);
    border-radius: 12px;
    padding: 16px 16px 14px;
    cursor: pointer;
    position: relative;
    display: flex;
    flex-direction: column;
    gap: 11px;
    transition: transform .25s ease, box-shadow .25s ease, border-color .25s;
    overflow: hidden;
    min-height: 196px;
  }
  #pageTools .mcp-card:hover{
    transform: translateY(-3px);
    border-color: var(--muted-2);
    box-shadow: 0 16px 30px -18px rgba(40,80,120,.28);
  }
  #pageTools .mcp-card-top{
    display: flex;
    align-items: center;
    gap: 11px;
  }
  #pageTools .mcp-icon-block{
    width: 38px; height: 38px;
    border-radius: 9px;
    background: linear-gradient(135deg, #5b9dc8, #2c6585);
    display: grid;
    place-items: center;
    flex-shrink: 0;
    color: #fff;
    box-shadow: 0 4px 10px -4px rgba(44, 101, 133, .35);
  }
  #pageTools .mcp-icon-block svg{ width: 20px; height: 20px; }
  #pageTools .mcp-icon-block[data-cat="database"]{ background: linear-gradient(135deg, #5b9dc8, #2c6585); }
  #pageTools .mcp-icon-block[data-cat="search"]{   background: linear-gradient(135deg, #8a73c4, #4d3b8a); }
  #pageTools .mcp-icon-block[data-cat="compute"]{  background: linear-gradient(135deg, #6db89a, #3a7e5c); }
  #pageTools .mcp-icon-block[data-cat="model"]{    background: linear-gradient(135deg, #d18568, #a04e30); }
  #pageTools .mcp-icon-block[data-cat="sim"]{      background: linear-gradient(135deg, #d8a566, #a0703a); }
  #pageTools .mcp-icon-block[data-cat="knowledge"]{background: linear-gradient(135deg, #7c9dc4, #5675a8); }
  #pageTools .mcp-title-block{
    flex: 1;
    min-width: 0;
    display: flex;
    flex-direction: column;
    gap: 3px;
  }
  #pageTools .mcp-card-name{
    font-family: var(--serif);
    font-size: 15.5px;
    font-weight: 700;
    color: var(--ink);
    line-height: 1.3;
    letter-spacing: -0.005em;
    margin: 0;
  }
  #pageTools .mcp-card-pkg{
    font-family: var(--mono);
    font-size: 10.5px;
    color: var(--muted);
    letter-spacing: 0.02em;
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
  }
  #pageTools .mcp-desc{
    font-size: 12px;
    color: var(--ink-soft);
    line-height: 1.6;
    display: -webkit-box;
    -webkit-line-clamp: 2;
    -webkit-box-orient: vertical;
    overflow: hidden;
    margin: 0;
  }
  #pageTools .mcp-card-tags{
    display: flex;
    gap: 5px;
    flex-wrap: wrap;
  }
  #pageTools .mcp-card-tag{
    font-size: 10.5px;
    padding: 2px 8px;
    border-radius: 4px;
    background: var(--bg-soft);
    color: var(--ink-soft);
    letter-spacing: 0.02em;
    font-family: var(--sans);
  }
  #pageTools .mcp-card-tag.primary{
    background: rgba(44,101,133,.1);
    color: #2c6585;
    font-weight: 600;
  }
  #pageTools .mcp-card-meta{
    margin-top: auto;
    padding-top: 10px;
    border-top: 1px dashed var(--line);
    display: flex;
    align-items: center;
    justify-content: space-between;
    font-family: var(--mono);
    font-size: 10px;
    color: var(--muted);
  }
  #pageTools .mcp-card-meta .author{
    display: flex;
    align-items: center;
    gap: 6px;
    color: var(--ink-soft);
    min-width: 0;
  }
  #pageTools .mcp-card-meta .org-avatar{
    width: 18px; height: 18px;
    border-radius: 50%;
    background: linear-gradient(135deg, #2c6585, #7ab3c8);
    color: #fff;
    display: grid;
    place-items: center;
    font-size: 9px;
    font-weight: 700;
    font-family: var(--display);
    flex-shrink: 0;
    letter-spacing: 0;
  }
  #pageTools .mcp-card-meta .org-avatar[data-tone="casc"]{ background: linear-gradient(135deg, #c34141, #8a2222); }
  #pageTools .mcp-card-meta .org-avatar[data-tone="casic"]{ background: linear-gradient(135deg, #2c6585, #5b9dc8); }
  #pageTools .mcp-card-meta .org-avatar[data-tone="avic"]{ background: linear-gradient(135deg, #3a7e5c, #6db89a); }
  #pageTools .mcp-card-meta .org-avatar[data-tone="buaa"]{ background: linear-gradient(135deg, #4d3b8a, #8a73c4); }
  #pageTools .mcp-card-meta .org-avatar[data-tone="nuaa"]{ background: linear-gradient(135deg, #a04e30, #d18568); }
  #pageTools .mcp-card-meta .org-avatar[data-tone="cnsa"]{ background: linear-gradient(135deg, #5e3814, #a0703a); }
  #pageTools .mcp-card-meta .org-avatar[data-tone="calt"]{ background: linear-gradient(135deg, #1a2438, #3a4663); }
  #pageTools .mcp-card-meta .org-avatar[data-tone="sast"]{ background: linear-gradient(135deg, #5675a8, #7c9dc4); }
  #pageTools .mcp-card-meta .handle{
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
    font-size: 10px;
    letter-spacing: 0;
  }
  #pageTools .mcp-card-meta .stats{
    display: flex;
    gap: 10px;
    flex-shrink: 0;
  }
  #pageTools .mcp-card-meta .stat{
    display: inline-flex;
    align-items: center;
    gap: 3px;
  }
  #pageTools .mcp-card-meta .stat svg{ width: 9px; height: 9px; opacity: .65; }

  /* ===== Skill 卡片（技能库） ===== */
  #pageSkills .skill-grid{
    display: grid;
    grid-template-columns: repeat(2, 1fr);
    gap: 18px;
  }
  @media (max-width: 900px){ #pageSkills .skill-grid{ grid-template-columns: 1fr; } }
  #pageSkills .skill-card{
    background:
      radial-gradient(ellipse 50% 110% at 0% 50%, rgba(255,228,180,.28), transparent 55%),
      var(--paper);
    border: 1px solid var(--line);
    border-radius: 12px;
    padding: 18px 22px 14px;
    cursor: pointer;
    position: relative;
    display: grid;
    grid-template-columns: 56px 1fr auto;
    grid-template-rows: auto auto auto auto;
    column-gap: 16px;
    row-gap: 10px;
    transition: transform .25s ease, box-shadow .25s ease, border-color .25s;
    overflow: hidden;
  }
  #pageSkills .skill-card:hover{
    transform: translateY(-3px);
    border-color: #d8a566;
    box-shadow: 0 18px 32px -20px rgba(176,123,58,.32);
  }
  #pageSkills .skill-icon{
    grid-column: 1;
    grid-row: 1;
    width: 56px; height: 56px;
    border-radius: 13px;
    background: linear-gradient(135deg, #f7d695 0%, #b07b3a 100%);
    display: grid;
    place-items: center;
    color: #fff;
    box-shadow: 0 10px 18px -8px rgba(176,123,58,.5);
    align-self: start;
  }
  #pageSkills .skill-icon svg{ width: 28px; height: 28px; }
  #pageSkills .skill-name-block{
    grid-column: 2;
    grid-row: 1;
    display: flex;
    flex-direction: column;
    justify-content: center;
    gap: 4px;
    min-width: 0;
    min-height: 56px;
    align-self: center;
  }
  #pageSkills .skill-name{
    font-family: var(--serif);
    font-size: 19px;
    font-weight: 700;
    color: var(--ink);
    line-height: 1.2;
    letter-spacing: 0.01em;
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
    margin: 0;
  }
  #pageSkills .skill-name-en{
    font-family: var(--mono);
    font-size: 11px;
    color: var(--muted);
    letter-spacing: 0.04em;
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
  }
  #pageSkills .skill-level{
    grid-column: 3;
    grid-row: 1;
    align-self: start;
    justify-self: end;
    display: inline-flex;
    align-items: center;
    gap: 4px;
    padding: 3px 10px;
    background: linear-gradient(135deg, #f7d695, #d8a566);
    color: #5e3814;
    border-radius: 999px;
    font-family: var(--display);
    font-weight: 700;
    font-size: 11px;
    letter-spacing: 0.08em;
    box-shadow: 0 4px 10px -4px rgba(176,123,58,.4);
  }
  #pageSkills .skill-level::before{ content: '✦'; font-size: 9px; }
  #pageSkills .skill-desc{
    grid-column: 1 / -1;
    grid-row: 2;
    font-size: 13px;
    color: var(--ink-soft);
    line-height: 1.6;
    display: -webkit-box;
    -webkit-line-clamp: 2;
    -webkit-box-orient: vertical;
    overflow: hidden;
    margin: 2px 0 0;
  }
  #pageSkills .skill-tags{
    grid-column: 1 / -1;
    grid-row: 3;
    display: flex;
    gap: 6px;
    flex-wrap: wrap;
  }
  #pageSkills .skill-tag{
    font-size: 11px;
    padding: 3px 9px;
    background: var(--bg-soft);
    color: var(--ink-soft);
    border-radius: 4px;
    font-family: var(--sans);
  }
  #pageSkills .skill-meta{
    grid-column: 1 / -1;
    grid-row: 4;
    display: flex;
    align-items: center;
    justify-content: space-between;
    padding-top: 10px;
    margin-top: 4px;
    border-top: 1px dashed var(--line);
    font-family: var(--mono);
    font-size: 11px;
    color: var(--muted);
  }
  #pageSkills .skill-author{
    display: flex;
    align-items: center;
    gap: 7px;
    color: var(--ink-soft);
    min-width: 0;
  }
  #pageSkills .skill-author .org-avatar{
    width: 20px; height: 20px;
    border-radius: 50%;
    background: linear-gradient(135deg, #b07b3a, #f7d695);
    color: #fff;
    display: grid;
    place-items: center;
    font-size: 9px;
    font-weight: 700;
    font-family: var(--display);
    flex-shrink: 0;
  }
  #pageSkills .skill-author .org-avatar[data-tone="casc"]{ background: linear-gradient(135deg, #c34141, #8a2222); }
  #pageSkills .skill-author .org-avatar[data-tone="casic"]{ background: linear-gradient(135deg, #2c6585, #5b9dc8); }
  #pageSkills .skill-author .org-avatar[data-tone="avic"]{ background: linear-gradient(135deg, #3a7e5c, #6db89a); }
  #pageSkills .skill-author .org-avatar[data-tone="buaa"]{ background: linear-gradient(135deg, #4d3b8a, #8a73c4); }
  #pageSkills .skill-author .org-avatar[data-tone="nuaa"]{ background: linear-gradient(135deg, #a04e30, #d18568); }
  #pageSkills .skill-author .org-avatar[data-tone="cnsa"]{ background: linear-gradient(135deg, #5e3814, #a0703a); }
  #pageSkills .skill-author .org-avatar[data-tone="calt"]{ background: linear-gradient(135deg, #1a2438, #3a4663); }
  #pageSkills .skill-author .org-avatar[data-tone="sast"]{ background: linear-gradient(135deg, #5675a8, #7c9dc4); }
  #pageSkills .skill-author .handle{
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
  }
  #pageSkills .skill-stats{
    display: flex;
    gap: 12px;
    flex-shrink: 0;
  }
  #pageSkills .skill-stats .stat{
    display: inline-flex;
    align-items: center;
    gap: 4px;
  }
  #pageSkills .skill-stats svg{ width: 11px; height: 11px; opacity: .7; }

  /* ── 技能类型徽章 · 工具技能变体（领域技能沿用上面那条暖金规则） ── */
  #pageSkills .skill-level[data-type="tool"]{
    background: linear-gradient(135deg, #5b9dc8, #2c6585);
    color: #fff;
    box-shadow: 0 4px 10px -4px rgba(44,101,133,.45);
  }

  /* ── 研制环节分段标题（横跨整行网格） ── */
  #pageSkills .skill-section-head{
    grid-column: 1 / -1;
    display: flex;
    align-items: center;
    gap: 9px;
    margin: 14px 0 -2px;
  }
  #pageSkills .skill-grid > .skill-section-head:first-child{ margin-top: 0; }
  #pageSkills .skill-section-badge{
    display: grid;
    place-items: center;
    min-width: 22px; height: 22px;
    padding: 0 5px;
    border-radius: 6px;
    background: linear-gradient(135deg, #f7d695, #d8a566);
    color: #5e3814;
    font-family: var(--display);
    font-size: 12px;
    font-weight: 700;
    flex-shrink: 0;
  }
  #pageSkills .skill-section-title{
    font-family: var(--serif);
    font-size: 15px;
    font-weight: 700;
    color: var(--ink);
    letter-spacing: 0.02em;
    flex-shrink: 0;
  }
  #pageSkills .skill-section-count{
    font-family: var(--mono);
    font-size: 11px;
    color: var(--muted);
    padding: 1px 7px;
    border: 1px solid var(--line);
    border-radius: 999px;
    flex-shrink: 0;
  }
  #pageSkills .skill-section-rule{
    flex: 1;
    height: 1px;
    background: linear-gradient(to right, var(--line), transparent);
  }

  /* ── 领域 chip 上的数量徽章（chip 由数据生成，带计数） ── */
  #pageSkills .tag-chip-num{
    margin-left: 6px;
    padding: 0 5px;
    border-radius: 999px;
    background: rgba(0,0,0,.07);
    font-family: var(--mono);
    font-size: 10px;
    line-height: 15px;
  }
  #pageSkills .tag-chip.active .tag-chip-num{ background: rgba(255,255,255,.25); }

  /* ── 「演示数据（后端未连接 · 重试）」里的重试链接 ── */
  #pageSkills .skill-retry{
    color: var(--vermilion);
    text-decoration: underline;
    text-underline-offset: 2px;
    cursor: pointer;
  }
  #pageSkills .skill-retry:hover{ opacity: .75; }

  /* ── 技能库分页条（后端技能量大，卡片分页铺） ── */
  #pageSkills .skill-pager{
    display: flex;
    align-items: center;
    flex-wrap: wrap;
    gap: 6px;
    margin-top: 22px;
    padding-top: 16px;
    border-top: 1px dashed var(--line);
  }
  #pageSkills .skill-pager[hidden]{ display: none; }
  #pageSkills .skill-pager-btn{
    min-width: 32px;
    height: 30px;
    padding: 0 9px;
    border: 1px solid var(--line);
    border-radius: 6px;
    background: var(--paper);
    color: var(--ink-soft);
    font-family: var(--mono);
    font-size: 12px;
    cursor: pointer;
    transition: border-color .2s, color .2s, background .2s;
  }
  #pageSkills .skill-pager-btn:hover:not(:disabled){
    border-color: #d8a566;
    color: var(--ink);
  }
  #pageSkills .skill-pager-btn.is-active{
    background: linear-gradient(135deg, #f7d695, #d8a566);
    border-color: #d8a566;
    color: #5e3814;
    font-weight: 700;
  }
  #pageSkills .skill-pager-btn:disabled{
    opacity: .4;
    cursor: default;
  }
  #pageSkills .skill-pager-gap{
    color: var(--muted);
    font-family: var(--mono);
    font-size: 12px;
    padding: 0 2px;
  }
  #pageSkills .skill-pager-info{
    margin-left: auto;
    color: var(--muted);
    font-family: var(--mono);
    font-size: 11.5px;
  }

  /* =====================================================
     ↓ 设备库 (#pageDevices)
     与 工具库 / 技能库 同款 token + 筛选 + 排序
     卡片：16:9 顶部封面 + 状态徽章 + 紧凑信息密度
     ===================================================== */
  #pageDevices{
    --bg-soft: #eaf1fa;
    --paper: #ffffff;
    --ink: #0d2540;
    --ink-soft: #38547a;
    --muted: #6b7d9a;
    --muted-2: #a0b0c8;
    --line: #d0dee9;
    --line-soft: #e5eef7;
    --accent: #2f7fd8;
    --accent-soft: #6ea9e8;
    /* 设备主题：钢铁深绿 + 暖铜辅色，与工具库蓝/技能库金做区分 */
    --device-deep: #2a4d35;
    --device-mid:  #4a7d5b;
    --device-soft: #8db3a0;
    --device-bg:   rgba(74,125,91,.10);
    --status-online:#4a7d5b;
    --status-maint: #b07b3a;
    --status-queue: #2c4a7a;
    --sans: "Noto Sans SC", -apple-system, BlinkMacSystemFont, "Helvetica Neue", sans-serif;
    --serif: "Noto Serif SC", "Songti SC", "Source Han Serif SC", serif;
    --display: "Cormorant Garamond", "Noto Serif SC", serif;
    --mono: "JetBrains Mono", "SF Mono", Menlo, monospace;
  }
  :root[data-theme="origin"] #pageDevices {
    --bg-soft: #f0ebdb; --paper: #faf7ee; --ink: #1a2438; --ink-soft: #3a4663;
    --muted: #8a8676; --muted-2: #b8b3a1;
    --line: #e4dec9; --line-soft: #ece6d3;
    --accent: #2c4a7a; --accent-soft: #5a7fb5;
    --device-deep: #2a4d35; --device-mid: #4a7d5b; --device-soft: #8db3a0;
    --device-bg: rgba(74,125,91,.10);
    --status-online: #4a7d5b; --status-maint: #b07b3a; --status-queue: #2c4a7a;
  }
  :root[data-theme="dark"] #pageDevices {
    --bg-soft: #10161f; --paper: #141a24; --ink: #e8ecf3; --ink-soft: #b8c0ce;
    --muted: #a0abbc; --muted-2: #7d8593;
    --line: #2a3341; --line-soft: #1e2632;
    --accent: #5aa9e6; --accent-soft: #7ebae8;
    --device-deep: #3c8560; --device-mid: #4a7d5b; --device-soft: #8db3a0;
    --device-bg: rgba(74,125,91,.16);
    --status-online: #7bc36b; --status-maint: #d4a961; --status-queue: #5aa9e6;
  }
  :root[data-theme="dark2"] #pageDevices {
    --bg-soft: #0f1a3c; --paper: #142347; --ink: #f4f7ff; --ink-soft: #c8d3ec;
    --muted: #94a3c6; --muted-2: #6a7ea3;
    --line: #2a4380; --line-soft: #1c3266;
    --accent: #5aa9ff; --accent-soft: #7bbfff;
    --device-deep: #4a8560; --device-mid: #5aa675; --device-soft: #7dc796;
    --device-bg: rgba(90,166,117,.16);
    --status-online: #7bd88f; --status-maint: #f5c766; --status-queue: #5aa9ff;
  }
  #pageDevices.page.active{
    display: block;
    background: var(--page-bg);
    min-height: calc(100vh - 56px);
    padding: 40px 56px 56px;
    font-family: var(--sans);
    color: var(--ink);
  }
  @media (max-width: 720px){ #pageDevices.page.active{ padding: 24px 18px 40px; } }

  #pageDevices .apps-view{
    width: 100%;
    max-width: 1280px;
    margin: 0 auto;
  }
  #pageDevices .apps-header{
    display: flex; align-items: flex-end; justify-content: space-between;
    margin-bottom: 28px; gap: 24px; flex-wrap: wrap;
  }
  #pageDevices .apps-eyebrow{
    font-family: var(--display); font-size: 12px;
    letter-spacing: 0.32em; color: var(--device-deep);
    text-transform: uppercase; margin-bottom: 8px;
  }
  #pageDevices .apps-title{
    font-family: var(--serif); font-weight: 700;
    font-size: 30px; color: var(--ink); letter-spacing: 0.02em; margin: 0;
  }
  #pageDevices .apps-title em{
    color: var(--device-deep); font-style: italic; font-weight: 500;
  }
  #pageDevices .apps-head-meta{
    font-size: 13px; color: var(--muted); margin-top: 6px; letter-spacing: 0.02em;
  }
  #pageDevices .apps-search{
    display: flex; align-items: center; gap: 8px;
    background: var(--paper); border: 1px solid var(--line);
    border-radius: 999px; padding: 9px 16px;
    width: 300px; max-width: 100%;
    color: var(--muted);
    transition: border-color .2s, box-shadow .2s;
  }
  #pageDevices .apps-search:focus-within{
    border-color: var(--device-soft);
    box-shadow: 0 0 0 4px rgba(74,125,91,.10);
  }
  #pageDevices .apps-search svg{ width: 14px; height: 14px; flex-shrink: 0; }
  #pageDevices .apps-search input{
    flex: 1; min-width: 0;
    border: none; outline: none; background: transparent;
    font-family: var(--sans); font-size: 13px; color: var(--ink);
  }
  #pageDevices .apps-search input::placeholder{ color: var(--muted-2); }

  /* 双轴筛选 */
  #pageDevices .apps-tags{ margin-bottom: 28px; }
  #pageDevices .tag-row{ display: flex; flex-wrap: wrap; gap: 8px; align-items: center; }
  #pageDevices .tag-row.secondary{ margin-top: 12px; }
  #pageDevices .tag-row-label{
    font-size: 13px; color: var(--muted);
    letter-spacing: 0.04em; margin-right: 12px;
    font-family: var(--sans); font-weight: 500; flex-shrink: 0;
  }
  #pageDevices .tag-chip{
    display: inline-flex; align-items: center; gap: 6px;
    padding: 7px 14px 7px 11px; border-radius: 999px;
    font-size: 13px; color: var(--ink-soft);
    background: var(--paper); border: 1px solid var(--line);
    cursor: pointer; transition: all .18s ease; user-select: none;
    font-family: var(--sans);
  }
  #pageDevices .tag-chip svg{ width: 13px; height: 13px; opacity: .68; transition: opacity .18s; }
  #pageDevices .tag-chip:hover{ background: var(--bg-soft); border-color: var(--muted-2); color: var(--ink); }
  #pageDevices .tag-chip.active{ color: #fff; background: var(--vermilion); border-color: var(--vermilion); }
  #pageDevices .tag-chip.active svg{ opacity: 1; }
  #pageDevices .tag-chip-sec{
    display: inline-flex; align-items: center; gap: 6px;
    padding: 6px 12px 6px 10px; border-radius: 6px;
    font-size: 12.5px; color: var(--muted);
    background: transparent; border: 1px solid transparent;
    cursor: pointer; transition: all .15s; user-select: none;
    font-family: var(--sans);
  }
  #pageDevices .tag-chip-sec svg{ width: 11px; height: 11px; opacity: .65; transition: opacity .15s; }
  #pageDevices .tag-chip-sec:hover{ color: var(--ink); background: var(--bg-soft); }
  #pageDevices .tag-chip-sec.active{ color: var(--ink); background: var(--bg-soft); font-weight: 500; }
  #pageDevices .tag-chip-sec .status-dot{
    width: 8px; height: 8px; border-radius: 50%; display: inline-block;
  }
  #pageDevices .tag-chip-sec[data-status="online"] .status-dot{ background: var(--status-online); }
  #pageDevices .tag-chip-sec[data-status="maint"]  .status-dot{ background: var(--status-maint); }
  #pageDevices .tag-chip-sec[data-status="queue"]  .status-dot{ background: var(--status-queue); }

  /* Sort */
  #pageDevices .tools-toolbar{
    display: flex; align-items: center; justify-content: space-between;
    gap: 16px; flex-wrap: wrap;
    margin-bottom: 22px; padding-bottom: 14px;
    border-bottom: 1px solid var(--line);
  }
  #pageDevices .tools-toolbar-left{
    display: inline-flex; align-items: center; gap: 16px;
    font-family: var(--sans);
  }
  #pageDevices .toolbar-count{
    font-family: var(--mono); font-size: 12px;
    color: var(--muted); letter-spacing: 0.04em;
  }
  #pageDevices .toolbar-count strong{
    font-family: var(--display); font-style: italic;
    color: var(--ink); font-size: 15px; font-weight: 700; margin: 0 3px;
  }
  #pageDevices .tools-sort{ display: inline-flex; align-items: center; gap: 10px; }
  #pageDevices .tools-sort-label{
    font-family: var(--mono); font-size: 10.5px;
    letter-spacing: 0.18em; color: var(--muted); text-transform: uppercase;
  }
  #pageDevices .tools-sort-group{
    display: inline-flex; gap: 2px;
    background: var(--bg-soft); border: 1px solid var(--line);
    border-radius: 999px; padding: 3px;
  }
  #pageDevices .tools-sort-btn{
    display: inline-flex; align-items: center; gap: 5px;
    padding: 6px 13px; background: transparent; border: none;
    border-radius: 999px; color: var(--muted);
    font-family: var(--sans); font-size: 12px; font-weight: 600;
    cursor: pointer; transition: all .2s ease; white-space: nowrap;
  }
  #pageDevices .tools-sort-btn svg{ width: 12px; height: 12px; }
  #pageDevices .tools-sort-btn:hover:not(.is-active){ color: var(--ink); }
  #pageDevices .tools-sort-btn.is-active{
    background: var(--ink); color: var(--paper);
    box-shadow: 0 4px 10px -5px rgba(0,0,0,.35);
  }

  #pageDevices .grid-empty{
    text-align: center; padding: 60px 20px;
    color: var(--muted); font-family: var(--sans); font-size: 14px;
    background: var(--paper); border: 1px dashed var(--line); border-radius: 12px;
  }

  /* ===== Device 卡片网格 ===== */
  #pageDevices .device-grid{
    display: grid;
    grid-template-columns: repeat(3, 1fr);
    gap: 18px;
  }
  @media (max-width: 1200px){ #pageDevices .device-grid{ grid-template-columns: repeat(2, 1fr); } }
  @media (max-width: 720px){  #pageDevices .device-grid{ grid-template-columns: 1fr; } }

  #pageDevices .device-card{
    background: var(--paper);
    border: 1px solid var(--line);
    border-radius: 14px;
    overflow: hidden;
    cursor: pointer;
    display: flex; flex-direction: column;
    transition: transform .25s ease, box-shadow .25s ease, border-color .25s;
    min-height: 380px;
  }
  #pageDevices .device-card:hover{
    transform: translateY(-3px);
    border-color: var(--device-soft);
    box-shadow: 0 18px 32px -20px rgba(42,77,53,.35);
  }

  /* 顶部封面 16:9 + 状态徽章 + 设备分类标识 */
  #pageDevices .device-cover{
    position: relative;
    aspect-ratio: 16 / 9;
    background: linear-gradient(135deg, #d4cfb8 0%, #b8b09a 100%);
    overflow: hidden;
    border-bottom: 1px solid var(--line);
  }
  #pageDevices .device-cover img{
    width: 100%; height: 100%;
    object-fit: cover; object-position: center;
    display: block;
    transition: transform .5s cubic-bezier(.2,.7,.3,1);
  }
  #pageDevices .device-card:hover .device-cover img{ transform: scale(1.04); }
  /* 封面渐变蒙层（提升状态徽章可读性） */
  #pageDevices .device-cover::after{
    content: '';
    position: absolute; inset: 0;
    background: linear-gradient(180deg, rgba(20,30,40,.18) 0%, transparent 30%, transparent 60%, rgba(20,30,40,.32) 100%);
    pointer-events: none;
  }

  /* 状态徽章 · 右上 */
  #pageDevices .device-status{
    position: absolute; top: 10px; right: 10px;
    display: inline-flex; align-items: center; gap: 5px;
    padding: 4px 10px 4px 8px;
    background: rgba(255,255,255,.92);
    backdrop-filter: blur(6px); -webkit-backdrop-filter: blur(6px);
    border-radius: 999px;
    font-family: var(--sans);
    font-size: 11px; font-weight: 600;
    color: var(--ink-soft);
    box-shadow: 0 2px 6px rgba(20,30,40,.18);
    z-index: 2;
  }
  #pageDevices .device-status .dot{
    width: 6px; height: 6px; border-radius: 50%;
    box-shadow: 0 0 0 2px rgba(255,255,255,.65);
  }
  #pageDevices .device-status[data-status="online"]{ color: var(--status-online); }
  #pageDevices .device-status[data-status="online"] .dot{ background: var(--status-online); animation: deviceStatusPulse 1.8s ease-in-out infinite; }
  #pageDevices .device-status[data-status="maint"]{ color: var(--status-maint); }
  #pageDevices .device-status[data-status="maint"]  .dot{ background: var(--status-maint); }
  #pageDevices .device-status[data-status="queue"]{ color: var(--status-queue); }
  #pageDevices .device-status[data-status="queue"]  .dot{ background: var(--status-queue); }
  @keyframes deviceStatusPulse{
    0%,100%{ opacity: 1; transform: scale(1); }
    50%    { opacity: .65; transform: scale(.86); }
  }

  /* 左下：设备分类小标识 */
  #pageDevices .device-kind{
    position: absolute; left: 10px; bottom: 10px;
    display: inline-flex; align-items: center; gap: 5px;
    padding: 3px 9px;
    background: rgba(255,255,255,.92);
    border-radius: 4px;
    font-family: var(--mono);
    font-size: 10px; font-weight: 600;
    color: var(--device-deep);
    letter-spacing: 0.04em;
    z-index: 2;
  }

  /* 卡片下半部分 */
  #pageDevices .device-body{
    padding: 14px 16px 14px;
    display: flex; flex-direction: column; gap: 9px;
    flex: 1;
  }
  #pageDevices .device-title-row{
    display: flex; align-items: flex-start; gap: 10px;
  }
  #pageDevices .device-title-block{
    flex: 1; min-width: 0;
    display: flex; flex-direction: column; gap: 3px;
  }
  #pageDevices .device-name{
    font-family: var(--serif);
    font-size: 16px; font-weight: 700;
    color: var(--ink); line-height: 1.3;
    margin: 0;
  }
  #pageDevices .device-model{
    font-family: var(--mono);
    font-size: 10.5px;
    color: var(--muted);
    letter-spacing: 0.04em;
    overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
  }

  #pageDevices .device-desc{
    font-size: 12.5px;
    color: var(--ink-soft);
    line-height: 1.6;
    display: -webkit-box;
    -webkit-line-clamp: 2;
    -webkit-box-orient: vertical;
    overflow: hidden;
    margin: 0;
  }

  /* 关键指标行 */
  #pageDevices .device-specs{
    display: grid;
    grid-template-columns: 1fr 1fr;
    gap: 6px 14px;
    padding: 8px 10px;
    background: var(--device-bg);
    border-radius: 6px;
    font-family: var(--mono);
  }
  #pageDevices .device-spec{
    display: flex; flex-direction: column; gap: 1px;
    min-width: 0;
  }
  #pageDevices .device-spec-label{
    font-size: 9.5px;
    color: var(--muted);
    letter-spacing: 0.06em;
    text-transform: uppercase;
  }
  #pageDevices .device-spec-value{
    font-family: var(--display);
    font-size: 14px;
    font-weight: 700;
    color: var(--device-deep);
    letter-spacing: 0.01em;
    overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
  }

  /* tags */
  #pageDevices .device-tags{
    display: flex; gap: 5px; flex-wrap: wrap;
  }
  #pageDevices .device-tag{
    font-size: 10.5px;
    padding: 2px 8px;
    border-radius: 4px;
    background: var(--bg-soft);
    color: var(--ink-soft);
    font-family: var(--sans);
    letter-spacing: 0.02em;
  }
  #pageDevices .device-tag.primary{
    background: var(--device-bg);
    color: var(--device-deep);
    font-weight: 600;
  }

  /* 底部 meta：机构 + 调度指标 */
  #pageDevices .device-meta{
    margin-top: auto;
    padding-top: 10px;
    border-top: 1px dashed var(--line);
    display: flex; align-items: center; justify-content: space-between;
    font-family: var(--mono);
    font-size: 10px;
    color: var(--muted);
  }
  #pageDevices .device-meta .author{
    display: flex; align-items: center; gap: 6px;
    color: var(--ink-soft); min-width: 0;
  }
  #pageDevices .device-meta .org-avatar{
    width: 20px; height: 20px;
    border-radius: 50%;
    background: linear-gradient(135deg, var(--device-mid), var(--device-deep));
    color: #fff;
    display: grid; place-items: center;
    font-size: 9px; font-weight: 700;
    font-family: var(--display);
    flex-shrink: 0;
  }
  #pageDevices .device-meta .org-avatar[data-tone="calt"]{ background: linear-gradient(135deg, #1a2438, #3a4663); }
  #pageDevices .device-meta .org-avatar[data-tone="casc"]{ background: linear-gradient(135deg, #c34141, #8a2222); }
  #pageDevices .device-meta .org-avatar[data-tone="avic"]{ background: linear-gradient(135deg, #3a7e5c, #6db89a); }
  #pageDevices .device-meta .org-avatar[data-tone="buaa"]{ background: linear-gradient(135deg, #4d3b8a, #8a73c4); }
  #pageDevices .device-meta .org-avatar[data-tone="nuaa"]{ background: linear-gradient(135deg, #a04e30, #d18568); }
  #pageDevices .device-meta .org-avatar[data-tone="cnsa"]{ background: linear-gradient(135deg, #5e3814, #a0703a); }
  #pageDevices .device-meta .org-avatar[data-tone="sast"]{ background: linear-gradient(135deg, #5675a8, #7c9dc4); }
  #pageDevices .device-meta .org-avatar[data-tone="cardc"]{ background: linear-gradient(135deg, #2c4a7a, #5a7fb5); }
  #pageDevices .device-meta .handle{
    overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
    font-size: 10px;
  }
  #pageDevices .device-meta .stats{ display: flex; gap: 10px; flex-shrink: 0; }
  #pageDevices .device-meta .stat{
    display: inline-flex; align-items: center; gap: 3px;
  }
  #pageDevices .device-meta .stat svg{ width: 9px; height: 9px; opacity: .65; }

  /* =====================================================
     ↓ 科学知识库 (#pageKnowledge)
     与首页 4 场景卡呼应：每张知识库卡片右下角嵌同款场景水印
     5 个场景色（超材料紫 / 合金铜 / 气动青 / 涡轮橙 / 通用钢蓝）
     ===================================================== */
  #pageKnowledge{
    --bg-soft: #eaf1fa;
    --paper: #ffffff;
    --ink: #0d2540;
    --ink-soft: #38547a;
    --muted: #6b7d9a;
    --muted-2: #a0b0c8;
    --line: #d0dee9;
    --line-soft: #e5eef7;
    --accent: #2f7fd8;
    --accent-soft: #6ea9e8;
    --sc-meta:    #6d5fb5;
    --sc-meta-bg: rgba(109,95,181,.10);
    --sc-alloy:   #b07b3a;
    --sc-alloy-bg:rgba(176,123,58,.10);
    --sc-aero:    #3d8fa6;
    --sc-aero-bg: rgba(61,143,166,.10);
    --sc-turbine: #c47715;
    --sc-turbine-bg: rgba(196,119,21,.10);
    --sc-general: #5675a8;
    --sc-general-bg: rgba(86,117,168,.10);
    --sans: "Noto Sans SC", -apple-system, BlinkMacSystemFont, "Helvetica Neue", sans-serif;
    --serif: "Noto Serif SC", "Songti SC", "Source Han Serif SC", serif;
    --display: "Cormorant Garamond", "Noto Serif SC", serif;
    --mono: "JetBrains Mono", "SF Mono", Menlo, monospace;
  }
  :root[data-theme="origin"] #pageKnowledge {
    --bg-soft: #f0ebdb; --paper: #faf7ee; --ink: #1a2438; --ink-soft: #3a4663;
    --muted: #8a8676; --muted-2: #b8b3a1;
    --line: #e4dec9; --line-soft: #ece6d3;
    --accent: #2c4a7a; --accent-soft: #5a7fb5;
  }
  :root[data-theme="dark"] #pageKnowledge {
    --bg-soft: #10161f; --paper: #141a24; --ink: #e8ecf3; --ink-soft: #b8c0ce;
    --muted: #a0abbc; --muted-2: #7d8593;
    --line: #2a3341; --line-soft: #1e2632;
    --accent: #5aa9e6; --accent-soft: #7ebae8;
    --sc-meta: #a798e6; --sc-meta-bg: rgba(167,152,230,.16);
    --sc-alloy: #d4a961; --sc-alloy-bg: rgba(212,169,97,.16);
    --sc-aero: #6dc0d6; --sc-aero-bg: rgba(109,192,214,.16);
    --sc-turbine: #ffb573; --sc-turbine-bg: rgba(255,181,115,.16);
    --sc-general: #7ba3d8; --sc-general-bg: rgba(123,163,216,.16);
  }
  :root[data-theme="dark2"] #pageKnowledge {
    --bg-soft: #0f1a3c; --paper: #142347; --ink: #f4f7ff; --ink-soft: #c8d3ec;
    --muted: #94a3c6; --muted-2: #6a7ea3;
    --line: #2a4380; --line-soft: #1c3266;
    --accent: #5aa9ff; --accent-soft: #7bbfff;
    --sc-meta: #a798e6; --sc-meta-bg: rgba(167,152,230,.16);
    --sc-alloy: #f5c766; --sc-alloy-bg: rgba(245,199,102,.16);
    --sc-aero: #6dc0d6; --sc-aero-bg: rgba(109,192,214,.16);
    --sc-turbine: #e8a04a; --sc-turbine-bg: rgba(232,160,74,.16);
    --sc-general: #7ba3d8; --sc-general-bg: rgba(123,163,216,.16);
  }
  #pageKnowledge.page.active{
    display: block;
    background: var(--page-bg);
    min-height: calc(100vh - 56px);
    padding: 40px 56px 56px;
    font-family: var(--sans);
    color: var(--ink);
  }
  @media (max-width: 720px){ #pageKnowledge.page.active{ padding: 24px 18px 40px; } }

  #pageKnowledge .apps-view{ width: 100%; max-width: 1280px; margin: 0 auto; }

  #pageKnowledge .apps-header{
    display: flex; align-items: flex-end; justify-content: space-between;
    margin-bottom: 28px; gap: 24px; flex-wrap: wrap;
  }
  #pageKnowledge .apps-eyebrow{
    font-family: var(--display); font-size: 12px;
    letter-spacing: 0.32em; color: var(--accent);
    text-transform: uppercase; margin-bottom: 8px;
  }
  #pageKnowledge .apps-title{
    font-family: var(--serif); font-weight: 700;
    font-size: 30px; color: var(--ink); letter-spacing: 0.02em; margin: 0;
  }
  #pageKnowledge .apps-title em{
    color: var(--accent); font-style: italic; font-weight: 500;
  }
  #pageKnowledge .apps-head-meta{
    font-size: 13px; color: var(--muted); margin-top: 6px; letter-spacing: 0.02em;
  }
  #pageKnowledge .apps-search{
    display: flex; align-items: center; gap: 8px;
    background: var(--paper); border: 1px solid var(--line);
    border-radius: 999px; padding: 9px 16px;
    width: 300px; max-width: 100%;
    color: var(--muted);
    transition: border-color .2s, box-shadow .2s;
  }
  #pageKnowledge .apps-search:focus-within{
    border-color: var(--accent-soft);
    box-shadow: 0 0 0 4px rgba(60,106,168,.06);
  }
  #pageKnowledge .apps-search svg{ width: 14px; height: 14px; flex-shrink: 0; }
  #pageKnowledge .apps-search input{
    flex: 1; min-width: 0;
    border: none; outline: none; background: transparent;
    font-family: var(--sans); font-size: 13px; color: var(--ink);
  }
  #pageKnowledge .apps-search input::placeholder{ color: var(--muted-2); }

  #pageKnowledge .apps-tags{ margin-bottom: 28px; }
  #pageKnowledge .tag-row{ display: flex; flex-wrap: wrap; gap: 8px; align-items: center; }
  #pageKnowledge .tag-row.secondary{ margin-top: 12px; }
  #pageKnowledge .tag-row-label{
    font-size: 13px; color: var(--muted);
    letter-spacing: 0.04em; margin-right: 12px;
    font-family: var(--sans); font-weight: 500; flex-shrink: 0;
  }
  #pageKnowledge .tag-chip{
    display: inline-flex; align-items: center; gap: 8px;
    padding: 7px 14px 7px 11px; border-radius: 999px;
    font-size: 13px; color: var(--ink-soft);
    background: var(--paper); border: 1px solid var(--line);
    cursor: pointer; transition: all .18s ease; user-select: none;
    font-family: var(--sans);
  }
  #pageKnowledge .tag-chip svg{ width: 13px; height: 13px; opacity: .68; transition: opacity .18s; }
  #pageKnowledge .tag-chip .sc-dot{
    width: 9px; height: 9px; border-radius: 50%; display: inline-block;
  }
  #pageKnowledge .tag-chip[data-scenario="meta"]    .sc-dot{ background: var(--sc-meta); }
  #pageKnowledge .tag-chip[data-scenario="alloy"]   .sc-dot{ background: var(--sc-alloy); }
  #pageKnowledge .tag-chip[data-scenario="aero"]    .sc-dot{ background: var(--sc-aero); }
  #pageKnowledge .tag-chip[data-scenario="turbine"] .sc-dot{ background: var(--sc-turbine); }
  #pageKnowledge .tag-chip[data-scenario="general"] .sc-dot{ background: var(--sc-general); }
  /* 场景 chip icon 配色（与各场景主题色一致，替代原色点）*/
  #pageKnowledge .tag-chip[data-scenario="meta"]    svg{ color: var(--sc-meta); }
  #pageKnowledge .tag-chip[data-scenario="alloy"]   svg{ color: var(--sc-alloy); }
  #pageKnowledge .tag-chip[data-scenario="aero"]    svg{ color: var(--sc-aero); }
  #pageKnowledge .tag-chip[data-scenario="turbine"] svg{ color: var(--sc-turbine); }
  #pageKnowledge .tag-chip[data-scenario="general"] svg{ color: var(--sc-general); }
  #pageKnowledge .tag-chip:hover{ background: var(--bg-soft); border-color: var(--muted-2); color: var(--ink); }
  #pageKnowledge .tag-chip.active{ color: #fff; background: var(--vermilion); border-color: var(--vermilion); }
  #pageKnowledge .tag-chip.active svg{ opacity: 1; color: #fff; }
  #pageKnowledge .tag-chip.active .sc-dot{ box-shadow: 0 0 0 2px rgba(255,255,255,.32); }

  #pageKnowledge .tag-chip-sec{
    display: inline-flex; align-items: center; gap: 6px;
    padding: 6px 12px 6px 10px; border-radius: 6px;
    font-size: 12.5px; color: var(--muted);
    background: transparent; border: 1px solid transparent;
    cursor: pointer; transition: all .15s; user-select: none;
    font-family: var(--sans);
  }
  #pageKnowledge .tag-chip-sec svg{ width: 12px; height: 12px; opacity: .65; transition: opacity .15s; }
  #pageKnowledge .tag-chip-sec:hover{ color: var(--ink); background: var(--bg-soft); }
  #pageKnowledge .tag-chip-sec.active{ color: var(--ink); background: var(--bg-soft); font-weight: 500; }

  #pageKnowledge .tools-toolbar{
    display: flex; align-items: center; justify-content: space-between;
    gap: 16px; flex-wrap: wrap;
    margin-bottom: 22px; padding-bottom: 14px;
    border-bottom: 1px solid var(--line);
  }
  #pageKnowledge .tools-toolbar-left{ display: inline-flex; align-items: center; gap: 16px; font-family: var(--sans); }
  #pageKnowledge .toolbar-count{
    font-family: var(--mono); font-size: 12px;
    color: var(--muted); letter-spacing: 0.04em;
  }
  #pageKnowledge .toolbar-count strong{
    font-family: var(--display); font-style: italic;
    color: var(--ink); font-size: 15px; font-weight: 700; margin: 0 3px;
  }
  #pageKnowledge .tools-sort{ display: inline-flex; align-items: center; gap: 10px; }
  #pageKnowledge .tools-sort-label{
    font-family: var(--mono); font-size: 10.5px;
    letter-spacing: 0.18em; color: var(--muted); text-transform: uppercase;
  }
  #pageKnowledge .tools-sort-group{
    display: inline-flex; gap: 2px;
    background: var(--bg-soft); border: 1px solid var(--line);
    border-radius: 999px; padding: 3px;
  }
  #pageKnowledge .tools-sort-btn{
    display: inline-flex; align-items: center; gap: 5px;
    padding: 6px 13px; background: transparent; border: none;
    border-radius: 999px; color: var(--muted);
    font-family: var(--sans); font-size: 12px; font-weight: 600;
    cursor: pointer; transition: all .2s ease; white-space: nowrap;
  }
  #pageKnowledge .tools-sort-btn svg{ width: 12px; height: 12px; }
  #pageKnowledge .tools-sort-btn:hover:not(.is-active){ color: var(--ink); }
  #pageKnowledge .tools-sort-btn.is-active{
    background: var(--ink); color: var(--paper);
    box-shadow: 0 4px 10px -5px rgba(0,0,0,.35);
  }

  #pageKnowledge .grid-empty{
    text-align: center; padding: 60px 20px;
    color: var(--muted); font-family: var(--sans); font-size: 14px;
    background: var(--paper); border: 1px dashed var(--line); border-radius: 12px;
  }

  /* ===== KB 卡片网格 ===== */
  #pageKnowledge .kb-grid{
    display: grid;
    grid-template-columns: repeat(3, 1fr);
    gap: 18px;
  }
  @media (max-width: 1200px){ #pageKnowledge .kb-grid{ grid-template-columns: repeat(2, 1fr); } }
  @media (max-width: 720px){  #pageKnowledge .kb-grid{ grid-template-columns: 1fr; } }

  #pageKnowledge .kb-card{
    position: relative;
    background: var(--paper);
    border: 1px solid var(--line);
    border-left: none;
    border-radius: 12px;
    padding: 16px 18px 14px 22px;
    cursor: pointer;
    display: flex; flex-direction: column;
    gap: 11px;
    transition: transform .25s ease, box-shadow .25s ease, border-color .25s;
    overflow: hidden;
    min-height: 280px;
  }
  #pageKnowledge .kb-card::before{
    content: '';
    position: absolute;
    left: 0; top: 0; bottom: 0;
    width: 6px;
    background: var(--sc-general);
  }
  #pageKnowledge .kb-card[data-scenario="meta"]::before{    background: var(--sc-meta); }
  #pageKnowledge .kb-card[data-scenario="alloy"]::before{   background: var(--sc-alloy); }
  #pageKnowledge .kb-card[data-scenario="aero"]::before{    background: var(--sc-aero); }
  #pageKnowledge .kb-card[data-scenario="turbine"]::before{ background: var(--sc-turbine); }

  #pageKnowledge .kb-card:hover{
    transform: translateY(-3px);
    border-color: var(--muted-2);
    box-shadow: 0 18px 32px -20px rgba(40,55,80,.25);
  }

  #pageKnowledge .kb-watermark{
    position: absolute;
    right: 14px; bottom: 12px;
    width: 96px; height: 96px;
    pointer-events: none;
    z-index: 0;
    opacity: .12;
    transition: opacity .25s ease, transform .35s ease;
    color: var(--sc-general);
  }
  #pageKnowledge .kb-card:hover .kb-watermark{ opacity: .22; transform: scale(1.06); }
  #pageKnowledge .kb-card[data-scenario="meta"]    .kb-watermark{ color: var(--sc-meta); }
  #pageKnowledge .kb-card[data-scenario="alloy"]   .kb-watermark{ color: var(--sc-alloy); }
  #pageKnowledge .kb-card[data-scenario="aero"]    .kb-watermark{ color: var(--sc-aero); }
  #pageKnowledge .kb-card[data-scenario="turbine"] .kb-watermark{ color: var(--sc-turbine); }

  #pageKnowledge .kb-top{
    position: relative; z-index: 1;
    display: flex; align-items: flex-start; gap: 11px;
  }
  #pageKnowledge .kb-icon-block{
    width: 38px; height: 38px;
    border-radius: 9px;
    background: linear-gradient(135deg, #7c9dc4, #5675a8);
    display: grid; place-items: center;
    flex-shrink: 0; color: #fff;
    box-shadow: 0 4px 10px -4px rgba(40,55,80,.35);
  }
  #pageKnowledge .kb-card[data-scenario="meta"]    .kb-icon-block{ background: linear-gradient(135deg, #8a73c4, #4d3b8a); box-shadow: 0 4px 10px -4px rgba(109,95,181,.35); }
  #pageKnowledge .kb-card[data-scenario="alloy"]   .kb-icon-block{ background: linear-gradient(135deg, #d8a566, #8a5a20); box-shadow: 0 4px 10px -4px rgba(176,123,58,.35); }
  #pageKnowledge .kb-card[data-scenario="aero"]    .kb-icon-block{ background: linear-gradient(135deg, #5fb8d0, #2a6478); box-shadow: 0 4px 10px -4px rgba(61,143,166,.35); }
  #pageKnowledge .kb-card[data-scenario="turbine"] .kb-icon-block{ background: linear-gradient(135deg, #e09a3e, #8a4f00); box-shadow: 0 4px 10px -4px rgba(196,119,21,.35); }
  #pageKnowledge .kb-icon-block svg{ width: 20px; height: 20px; }

  #pageKnowledge .kb-title-block{
    flex: 1; min-width: 0;
    display: flex; flex-direction: column; gap: 3px;
  }
  #pageKnowledge .kb-name{
    font-family: var(--serif);
    font-size: 15.5px; font-weight: 700;
    color: var(--ink); line-height: 1.3;
    margin: 0;
  }
  #pageKnowledge .kb-alias{
    font-family: var(--mono);
    font-size: 10.5px;
    color: var(--muted);
    letter-spacing: 0.04em;
    overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
  }

  #pageKnowledge .kb-badge{
    display: inline-flex; align-items: center; gap: 4px;
    padding: 4px 9px;
    background: var(--sc-general-bg);
    color: var(--sc-general);
    border-radius: 999px;
    font-family: var(--display);
    font-weight: 700;
    font-size: 12.5px;
    letter-spacing: 0.02em;
    flex-shrink: 0;
    white-space: nowrap;
  }
  #pageKnowledge .kb-card[data-scenario="meta"]    .kb-badge{ background: var(--sc-meta-bg);    color: var(--sc-meta); }
  #pageKnowledge .kb-card[data-scenario="alloy"]   .kb-badge{ background: var(--sc-alloy-bg);   color: var(--sc-alloy); }
  #pageKnowledge .kb-card[data-scenario="aero"]    .kb-badge{ background: var(--sc-aero-bg);    color: var(--sc-aero); }
  #pageKnowledge .kb-card[data-scenario="turbine"] .kb-badge{ background: var(--sc-turbine-bg); color: var(--sc-turbine); }
  #pageKnowledge .kb-badge svg{ width: 11px; height: 11px; opacity: .85; }

  #pageKnowledge .kb-desc{
    position: relative; z-index: 1;
    font-size: 12.5px;
    color: var(--ink-soft);
    line-height: 1.6;
    display: -webkit-box;
    -webkit-line-clamp: 2;
    -webkit-box-orient: vertical;
    overflow: hidden;
    margin: 0;
  }

  #pageKnowledge .kb-metrics{
    position: relative; z-index: 1;
    display: grid;
    grid-template-columns: repeat(4, 1fr);
    gap: 0;
    background: var(--bg-soft);
    border-radius: 6px;
    overflow: hidden;
    border: 1px solid var(--line-soft);
  }
  #pageKnowledge .kb-metric{
    padding: 7px 8px;
    text-align: center;
    border-right: 1px solid var(--line-soft);
    display: flex; flex-direction: column; gap: 1px;
    min-width: 0;
  }
  #pageKnowledge .kb-metric:last-child{ border-right: none; }
  #pageKnowledge .kb-metric-value{
    font-family: var(--display);
    font-size: 14px;
    font-weight: 700;
    color: var(--ink);
    line-height: 1.1;
    overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
  }
  #pageKnowledge .kb-metric-label{
    font-family: var(--mono);
    font-size: 9px;
    color: var(--muted);
    letter-spacing: 0.04em;
    text-transform: uppercase;
  }

  #pageKnowledge .kb-tags{
    position: relative; z-index: 1;
    display: flex; gap: 5px; flex-wrap: wrap;
  }
  #pageKnowledge .kb-tag{
    font-size: 10.5px;
    padding: 2px 8px;
    border-radius: 4px;
    background: var(--bg-soft);
    color: var(--ink-soft);
    letter-spacing: 0.02em;
    font-family: var(--sans);
  }
  #pageKnowledge .kb-tag.primary{ font-weight: 600; }
  #pageKnowledge .kb-card[data-scenario="meta"]    .kb-tag.primary{ background: var(--sc-meta-bg);    color: var(--sc-meta); }
  #pageKnowledge .kb-card[data-scenario="alloy"]   .kb-tag.primary{ background: var(--sc-alloy-bg);   color: var(--sc-alloy); }
  #pageKnowledge .kb-card[data-scenario="aero"]    .kb-tag.primary{ background: var(--sc-aero-bg);    color: var(--sc-aero); }
  #pageKnowledge .kb-card[data-scenario="turbine"] .kb-tag.primary{ background: var(--sc-turbine-bg); color: var(--sc-turbine); }
  #pageKnowledge .kb-card[data-scenario="general"] .kb-tag.primary{ background: var(--sc-general-bg); color: var(--sc-general); }

  #pageKnowledge .kb-meta{
    position: relative; z-index: 1;
    margin-top: auto;
    padding-top: 10px;
    border-top: 1px dashed var(--line);
    display: flex; align-items: center; justify-content: space-between;
    font-family: var(--mono);
    font-size: 10px;
    color: var(--muted);
  }
  #pageKnowledge .kb-meta .author{
    display: flex; align-items: center; gap: 6px;
    color: var(--ink-soft); min-width: 0;
  }
  #pageKnowledge .kb-meta .org-avatar{
    width: 18px; height: 18px;
    border-radius: 50%;
    background: linear-gradient(135deg, #4a5680, #2a3550);
    color: #fff;
    display: grid; place-items: center;
    font-size: 8px; font-weight: 700;
    font-family: var(--display);
    flex-shrink: 0;
  }
  #pageKnowledge .kb-meta .org-avatar[data-tone="calt"]{ background: linear-gradient(135deg, #1a2438, #3a4663); }
  #pageKnowledge .kb-meta .org-avatar[data-tone="casc"]{ background: linear-gradient(135deg, #c34141, #8a2222); }
  #pageKnowledge .kb-meta .org-avatar[data-tone="avic"]{ background: linear-gradient(135deg, #3a7e5c, #6db89a); }
  #pageKnowledge .kb-meta .org-avatar[data-tone="buaa"]{ background: linear-gradient(135deg, #4d3b8a, #8a73c4); }
  #pageKnowledge .kb-meta .org-avatar[data-tone="nuaa"]{ background: linear-gradient(135deg, #a04e30, #d18568); }
  #pageKnowledge .kb-meta .org-avatar[data-tone="cnsa"]{ background: linear-gradient(135deg, #5e3814, #a0703a); }
  #pageKnowledge .kb-meta .org-avatar[data-tone="sast"]{ background: linear-gradient(135deg, #5675a8, #7c9dc4); }
  #pageKnowledge .kb-meta .org-avatar[data-tone="cardc"]{ background: linear-gradient(135deg, #2c4a7a, #5a7fb5); }
  #pageKnowledge .kb-meta .handle{
    overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
    font-size: 10px;
  }
  #pageKnowledge .kb-meta .stats{ display: flex; gap: 10px; flex-shrink: 0; }
  #pageKnowledge .kb-meta .stat{ display: inline-flex; align-items: center; gap: 3px; }
  #pageKnowledge .kb-meta .stat svg{ width: 9px; height: 9px; opacity: .65; }
  #pageKnowledge .kb-meta .version{
    font-family: var(--mono);
    color: var(--muted-2);
    font-size: 9.5px;
    letter-spacing: 0.04em;
  }

  /* =====================================================
     ↓ 科学图谱库 (#pageGraphLib)
     每张卡顶部内嵌 mini 拓扑预览 SVG；按场景给不同拓扑
     ===================================================== */
  #pageGraphLib{
    --bg-soft: #eaf1fa;
    --paper: #ffffff;
    --ink: #0d2540;
    --ink-soft: #38547a;
    --muted: #6b7d9a;
    --muted-2: #a0b0c8;
    --line: #d0dee9;
    --line-soft: #e5eef7;
    --accent: #2f7fd8;
    --accent-soft: #6ea9e8;
    --sc-meta:    #6d5fb5;
    --sc-meta-bg: rgba(109,95,181,.10);
    --sc-alloy:   #b07b3a;
    --sc-alloy-bg:rgba(176,123,58,.10);
    --sc-aero:    #3d8fa6;
    --sc-aero-bg: rgba(61,143,166,.10);
    --sc-turbine: #c47715;
    --sc-turbine-bg: rgba(196,119,21,.10);
    --sc-general: #5675a8;
    --sc-general-bg: rgba(86,117,168,.10);
    --sans: "Noto Sans SC", -apple-system, BlinkMacSystemFont, "Helvetica Neue", sans-serif;
    --serif: "Noto Serif SC", "Songti SC", "Source Han Serif SC", serif;
    --display: "Cormorant Garamond", "Noto Serif SC", serif;
    --mono: "JetBrains Mono", "SF Mono", Menlo, monospace;
  }
  :root[data-theme="origin"] #pageGraphLib {
    --bg-soft: #f0ebdb; --paper: #faf7ee; --ink: #1a2438; --ink-soft: #3a4663;
    --muted: #8a8676; --muted-2: #b8b3a1;
    --line: #e4dec9; --line-soft: #ece6d3;
    --accent: #2c4a7a; --accent-soft: #5a7fb5;
  }
  :root[data-theme="dark"] #pageGraphLib {
    --bg-soft: #10161f; --paper: #141a24; --ink: #e8ecf3; --ink-soft: #b8c0ce;
    --muted: #a0abbc; --muted-2: #7d8593;
    --line: #2a3341; --line-soft: #1e2632;
    --accent: #5aa9e6; --accent-soft: #7ebae8;
    --sc-meta: #a798e6; --sc-meta-bg: rgba(167,152,230,.16);
    --sc-alloy: #d4a961; --sc-alloy-bg: rgba(212,169,97,.16);
    --sc-aero: #6dc0d6; --sc-aero-bg: rgba(109,192,214,.16);
    --sc-turbine: #ffb573; --sc-turbine-bg: rgba(255,181,115,.16);
    --sc-general: #7ba3d8; --sc-general-bg: rgba(123,163,216,.16);
  }
  :root[data-theme="dark2"] #pageGraphLib {
    --bg-soft: #0f1a3c; --paper: #142347; --ink: #f4f7ff; --ink-soft: #c8d3ec;
    --muted: #94a3c6; --muted-2: #6a7ea3;
    --line: #2a4380; --line-soft: #1c3266;
    --accent: #5aa9ff; --accent-soft: #7bbfff;
    --sc-meta: #a798e6; --sc-meta-bg: rgba(167,152,230,.16);
    --sc-alloy: #f5c766; --sc-alloy-bg: rgba(245,199,102,.16);
    --sc-aero: #6dc0d6; --sc-aero-bg: rgba(109,192,214,.16);
    --sc-turbine: #e8a04a; --sc-turbine-bg: rgba(232,160,74,.16);
    --sc-general: #7ba3d8; --sc-general-bg: rgba(123,163,216,.16);
  }
  #pageGraphLib.page.active{
    display: block;
    background: var(--page-bg);
    min-height: calc(100vh - 56px);
    padding: 40px 56px 56px;
    font-family: var(--sans);
    color: var(--ink);
  }
  @media (max-width: 720px){ #pageGraphLib.page.active{ padding: 24px 18px 40px; } }

  #pageGraphLib .apps-view{ width: 100%; max-width: 1280px; margin: 0 auto; }

  #pageGraphLib .apps-header{
    display: flex; align-items: flex-end; justify-content: space-between;
    margin-bottom: 28px; gap: 24px; flex-wrap: wrap;
  }
  #pageGraphLib .apps-eyebrow{
    font-family: var(--display); font-size: 12px;
    letter-spacing: 0.32em; color: var(--accent);
    text-transform: uppercase; margin-bottom: 8px;
  }
  #pageGraphLib .apps-title{
    font-family: var(--serif); font-weight: 700;
    font-size: 30px; color: var(--ink); letter-spacing: 0.02em; margin: 0;
  }
  #pageGraphLib .apps-title em{
    color: var(--accent); font-style: italic; font-weight: 500;
  }
  #pageGraphLib .apps-head-meta{
    font-size: 13px; color: var(--muted); margin-top: 6px; letter-spacing: 0.02em;
  }
  #pageGraphLib .apps-search{
    display: flex; align-items: center; gap: 8px;
    background: var(--paper); border: 1px solid var(--line);
    border-radius: 999px; padding: 9px 16px;
    width: 300px; max-width: 100%;
    color: var(--muted);
    transition: border-color .2s, box-shadow .2s;
  }
  #pageGraphLib .apps-search:focus-within{
    border-color: var(--accent-soft);
    box-shadow: 0 0 0 4px rgba(60,106,168,.06);
  }
  #pageGraphLib .apps-search svg{ width: 14px; height: 14px; flex-shrink: 0; }
  #pageGraphLib .apps-search input{
    flex: 1; min-width: 0;
    border: none; outline: none; background: transparent;
    font-family: var(--sans); font-size: 13px; color: var(--ink);
  }
  #pageGraphLib .apps-search input::placeholder{ color: var(--muted-2); }

  #pageGraphLib .apps-tags{ margin-bottom: 28px; }
  #pageGraphLib .tag-row{ display: flex; flex-wrap: wrap; gap: 8px; align-items: center; }
  #pageGraphLib .tag-row.secondary{ margin-top: 12px; }
  #pageGraphLib .tag-row-label{
    font-size: 13px; color: var(--muted);
    letter-spacing: 0.04em; margin-right: 12px;
    font-family: var(--sans); font-weight: 500; flex-shrink: 0;
  }
  #pageGraphLib .tag-chip{
    display: inline-flex; align-items: center; gap: 8px;
    padding: 7px 14px 7px 11px; border-radius: 999px;
    font-size: 13px; color: var(--ink-soft);
    background: var(--paper); border: 1px solid var(--line);
    cursor: pointer; transition: all .18s ease; user-select: none;
    font-family: var(--sans);
  }
  #pageGraphLib .tag-chip svg{ width: 13px; height: 13px; opacity: .68; transition: opacity .18s; }
  #pageGraphLib .tag-chip .sc-dot{
    width: 9px; height: 9px; border-radius: 50%; display: inline-block;
  }
  #pageGraphLib .tag-chip[data-scenario="meta"]    .sc-dot{ background: var(--sc-meta); }
  #pageGraphLib .tag-chip[data-scenario="alloy"]   .sc-dot{ background: var(--sc-alloy); }
  #pageGraphLib .tag-chip[data-scenario="aero"]    .sc-dot{ background: var(--sc-aero); }
  #pageGraphLib .tag-chip[data-scenario="turbine"] .sc-dot{ background: var(--sc-turbine); }
  #pageGraphLib .tag-chip[data-scenario="general"] .sc-dot{ background: var(--sc-general); }
  /* 场景 chip icon 配色（与各场景主题色一致，替代原色点）*/
  #pageGraphLib .tag-chip[data-scenario="meta"]    svg{ color: var(--sc-meta); }
  #pageGraphLib .tag-chip[data-scenario="alloy"]   svg{ color: var(--sc-alloy); }
  #pageGraphLib .tag-chip[data-scenario="aero"]    svg{ color: var(--sc-aero); }
  #pageGraphLib .tag-chip[data-scenario="turbine"] svg{ color: var(--sc-turbine); }
  #pageGraphLib .tag-chip[data-scenario="general"] svg{ color: var(--sc-general); }
  #pageGraphLib .tag-chip:hover{ background: var(--bg-soft); border-color: var(--muted-2); color: var(--ink); }
  #pageGraphLib .tag-chip.active{ color: #fff; background: var(--vermilion); border-color: var(--vermilion); }
  #pageGraphLib .tag-chip.active svg{ opacity: 1; color: #fff; }
  #pageGraphLib .tag-chip.active .sc-dot{ box-shadow: 0 0 0 2px rgba(255,255,255,.32); }

  #pageGraphLib .tag-chip-sec{
    display: inline-flex; align-items: center; gap: 6px;
    padding: 6px 12px 6px 10px; border-radius: 6px;
    font-size: 12.5px; color: var(--muted);
    background: transparent; border: 1px solid transparent;
    cursor: pointer; transition: all .15s; user-select: none;
    font-family: var(--sans);
  }
  #pageGraphLib .tag-chip-sec svg{ width: 12px; height: 12px; opacity: .65; transition: opacity .15s; }
  #pageGraphLib .tag-chip-sec:hover{ color: var(--ink); background: var(--bg-soft); }
  #pageGraphLib .tag-chip-sec.active{ color: var(--ink); background: var(--bg-soft); font-weight: 500; }

  #pageGraphLib .tools-toolbar{
    display: flex; align-items: center; justify-content: space-between;
    gap: 16px; flex-wrap: wrap;
    margin-bottom: 22px; padding-bottom: 14px;
    border-bottom: 1px solid var(--line);
  }
  #pageGraphLib .tools-toolbar-left{ display: inline-flex; align-items: center; gap: 16px; font-family: var(--sans); }
  #pageGraphLib .toolbar-count{
    font-family: var(--mono); font-size: 12px;
    color: var(--muted); letter-spacing: 0.04em;
  }
  #pageGraphLib .toolbar-count strong{
    font-family: var(--display); font-style: italic;
    color: var(--ink); font-size: 15px; font-weight: 700; margin: 0 3px;
  }
  #pageGraphLib .tools-sort{ display: inline-flex; align-items: center; gap: 10px; }
  #pageGraphLib .tools-sort-label{
    font-family: var(--mono); font-size: 10.5px;
    letter-spacing: 0.18em; color: var(--muted); text-transform: uppercase;
  }
  #pageGraphLib .tools-sort-group{
    display: inline-flex; gap: 2px;
    background: var(--bg-soft); border: 1px solid var(--line);
    border-radius: 999px; padding: 3px;
  }
  #pageGraphLib .tools-sort-btn{
    display: inline-flex; align-items: center; gap: 5px;
    padding: 6px 13px; background: transparent; border: none;
    border-radius: 999px; color: var(--muted);
    font-family: var(--sans); font-size: 12px; font-weight: 600;
    cursor: pointer; transition: all .2s ease; white-space: nowrap;
  }
  #pageGraphLib .tools-sort-btn svg{ width: 12px; height: 12px; }
  #pageGraphLib .tools-sort-btn:hover:not(.is-active){ color: var(--ink); }
  #pageGraphLib .tools-sort-btn.is-active{
    background: var(--ink); color: var(--paper);
    box-shadow: 0 4px 10px -5px rgba(0,0,0,.35);
  }

  #pageGraphLib .grid-empty{
    text-align: center; padding: 60px 20px;
    color: var(--muted); font-family: var(--sans); font-size: 14px;
    background: var(--paper); border: 1px dashed var(--line); border-radius: 12px;
  }

  /* ===== KG 卡片网格 ===== */
  #pageGraphLib .kg-grid{
    display: grid;
    grid-template-columns: repeat(3, 1fr);
    gap: 18px;
  }
  @media (max-width: 1200px){ #pageGraphLib .kg-grid{ grid-template-columns: repeat(2, 1fr); } }
  @media (max-width: 720px){  #pageGraphLib .kg-grid{ grid-template-columns: 1fr; } }

  #pageGraphLib .kg-card{
    background: var(--paper);
    border: 1px solid var(--line);
    border-radius: 14px;
    overflow: hidden;
    cursor: pointer;
    display: flex; flex-direction: column;
    transition: transform .25s ease, box-shadow .25s ease, border-color .25s;
    min-height: 380px;
  }
  #pageGraphLib .kg-card:hover{
    transform: translateY(-3px);
    border-color: var(--muted-2);
    box-shadow: 0 18px 32px -20px rgba(40,55,80,.28);
  }

  /* 顶部 mini 拓扑预览 · 132px 高 */
  #pageGraphLib .kg-preview{
    position: relative;
    height: 132px;
    background:
      linear-gradient(180deg, rgba(255,255,255,.4) 0%, rgba(0,0,0,.02) 100%),
      var(--paper);
    border-bottom: 1px solid var(--line);
    overflow: hidden;
  }
  #pageGraphLib .kg-card[data-scenario="meta"]    .kg-preview{ background: linear-gradient(180deg, rgba(109,95,181,.08) 0%, rgba(109,95,181,.02) 100%), var(--paper); }
  #pageGraphLib .kg-card[data-scenario="alloy"]   .kg-preview{ background: linear-gradient(180deg, rgba(176,123,58,.08) 0%, rgba(176,123,58,.02) 100%), var(--paper); }
  #pageGraphLib .kg-card[data-scenario="aero"]    .kg-preview{ background: linear-gradient(180deg, rgba(61,143,166,.08) 0%, rgba(61,143,166,.02) 100%), var(--paper); }
  #pageGraphLib .kg-card[data-scenario="turbine"] .kg-preview{ background: linear-gradient(180deg, rgba(196,119,21,.08) 0%, rgba(196,119,21,.02) 100%), var(--paper); }
  #pageGraphLib .kg-card[data-scenario="general"] .kg-preview{ background: linear-gradient(180deg, rgba(86,117,168,.08) 0%, rgba(86,117,168,.02) 100%), var(--paper); }

  /* 预览底 grid 纹理（贴近 KG 可视化感） */
  #pageGraphLib .kg-preview::before{
    content: '';
    position: absolute; inset: 0;
    background-image:
      linear-gradient(rgba(40,55,80,.04) 1px, transparent 1px),
      linear-gradient(90deg, rgba(40,55,80,.04) 1px, transparent 1px);
    background-size: 18px 18px;
    pointer-events: none;
  }

  #pageGraphLib .kg-graph{
    position: relative;
    width: 100%; height: 100%;
    z-index: 1;
    color: var(--sc-general);
  }
  #pageGraphLib .kg-card[data-scenario="meta"]    .kg-graph{ color: var(--sc-meta); }
  #pageGraphLib .kg-card[data-scenario="alloy"]   .kg-graph{ color: var(--sc-alloy); }
  #pageGraphLib .kg-card[data-scenario="aero"]    .kg-graph{ color: var(--sc-aero); }
  #pageGraphLib .kg-card[data-scenario="turbine"] .kg-graph{ color: var(--sc-turbine); }
  #pageGraphLib .kg-graph .kg-edge{
    stroke: currentColor;
    opacity: 0.55;
    fill: none;
    stroke-linecap: round;
  }
  #pageGraphLib .kg-graph .kg-edge.weak{ opacity: 0.28; }
  #pageGraphLib .kg-graph .kg-node{
    fill: currentColor;
    stroke: var(--paper);
    stroke-width: 1.2;
  }
  #pageGraphLib .kg-graph .kg-node.hub{ stroke-width: 1.6; }
  #pageGraphLib .kg-card:hover .kg-graph{ animation: kgPulse 1.6s ease-in-out infinite; }
  @keyframes kgPulse{
    0%,100%{ opacity: 1; }
    50%    { opacity: .82; }
  }

  /* 头条徽章 · 右上角 */
  #pageGraphLib .kg-badge{
    position: absolute; right: 10px; top: 10px;
    display: inline-flex; align-items: center; gap: 4px;
    padding: 4px 9px;
    background: rgba(255,255,255,.92);
    backdrop-filter: blur(6px); -webkit-backdrop-filter: blur(6px);
    border-radius: 999px;
    font-family: var(--display);
    font-weight: 700;
    font-size: 12.5px;
    letter-spacing: 0.02em;
    color: var(--ink);
    box-shadow: 0 2px 6px rgba(20,30,40,.10);
    z-index: 2;
  }
  #pageGraphLib .kg-badge svg{ width: 11px; height: 11px; opacity: .8; }
  #pageGraphLib .kg-card[data-scenario="meta"]    .kg-badge{ color: var(--sc-meta); }
  #pageGraphLib .kg-card[data-scenario="alloy"]   .kg-badge{ color: var(--sc-alloy); }
  #pageGraphLib .kg-card[data-scenario="aero"]    .kg-badge{ color: var(--sc-aero); }
  #pageGraphLib .kg-card[data-scenario="turbine"] .kg-badge{ color: var(--sc-turbine); }
  #pageGraphLib .kg-card[data-scenario="general"] .kg-badge{ color: var(--sc-general); }

  /* 左下：图谱类型小标识 */
  #pageGraphLib .kg-type-pill{
    position: absolute; left: 10px; bottom: 10px;
    display: inline-flex; align-items: center; gap: 5px;
    padding: 3px 9px;
    background: rgba(255,255,255,.92);
    border-radius: 4px;
    font-family: var(--mono);
    font-size: 10px; font-weight: 600;
    letter-spacing: 0.04em;
    color: var(--ink-soft);
    z-index: 2;
  }

  /* 卡片主体 */
  #pageGraphLib .kg-body{
    padding: 14px 16px 14px;
    display: flex; flex-direction: column; gap: 9px;
    flex: 1;
  }
  #pageGraphLib .kg-title-block{
    display: flex; flex-direction: column; gap: 3px;
  }
  #pageGraphLib .kg-name{
    font-family: var(--serif);
    font-size: 16px; font-weight: 700;
    color: var(--ink); line-height: 1.3;
    margin: 0;
  }
  #pageGraphLib .kg-alias{
    font-family: var(--mono);
    font-size: 10.5px;
    color: var(--muted);
    letter-spacing: 0.04em;
    overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
  }

  #pageGraphLib .kg-desc{
    font-size: 12.5px;
    color: var(--ink-soft);
    line-height: 1.6;
    display: -webkit-box;
    -webkit-line-clamp: 2;
    -webkit-box-orient: vertical;
    overflow: hidden;
    margin: 0;
    transition: -webkit-line-clamp .18s;
  }
  /* 悬停卡片：描述从 2 行展开为完整多行 */
  #pageGraphLib .kg-card:hover .kg-desc{
    -webkit-line-clamp: unset;
    overflow: visible;
  }

  #pageGraphLib .kg-metrics{
    display: grid;
    grid-template-columns: repeat(4, 1fr);
    gap: 0;
    background: var(--bg-soft);
    border-radius: 6px;
    overflow: hidden;
    border: 1px solid var(--line-soft);
  }
  #pageGraphLib .kg-metric{
    padding: 7px 6px;
    text-align: center;
    border-right: 1px solid var(--line-soft);
    display: flex; flex-direction: column; gap: 1px;
    min-width: 0;
  }
  #pageGraphLib .kg-metric:last-child{ border-right: none; }
  #pageGraphLib .kg-metric-value{
    font-family: var(--display);
    font-size: 14px;
    font-weight: 700;
    color: var(--ink);
    line-height: 1.1;
    overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
  }
  #pageGraphLib .kg-metric-label{
    font-family: var(--mono);
    font-size: 9px;
    color: var(--muted);
    letter-spacing: 0.04em;
    text-transform: uppercase;
  }

  #pageGraphLib .kg-tags{
    display: flex; gap: 5px; flex-wrap: wrap;
  }
  #pageGraphLib .kg-tag{
    font-size: 10.5px;
    padding: 2px 8px;
    border-radius: 4px;
    background: var(--bg-soft);
    color: var(--ink-soft);
    letter-spacing: 0.02em;
    font-family: var(--sans);
  }
  #pageGraphLib .kg-tag.primary{ font-weight: 600; }
  #pageGraphLib .kg-card[data-scenario="meta"]    .kg-tag.primary{ background: var(--sc-meta-bg);    color: var(--sc-meta); }
  #pageGraphLib .kg-card[data-scenario="alloy"]   .kg-tag.primary{ background: var(--sc-alloy-bg);   color: var(--sc-alloy); }
  #pageGraphLib .kg-card[data-scenario="aero"]    .kg-tag.primary{ background: var(--sc-aero-bg);    color: var(--sc-aero); }
  #pageGraphLib .kg-card[data-scenario="turbine"] .kg-tag.primary{ background: var(--sc-turbine-bg); color: var(--sc-turbine); }
  #pageGraphLib .kg-card[data-scenario="general"] .kg-tag.primary{ background: var(--sc-general-bg); color: var(--sc-general); }

  #pageGraphLib .kg-meta{
    margin-top: auto;
    padding-top: 10px;
    border-top: 1px dashed var(--line);
    display: flex; align-items: center; justify-content: space-between;
    font-family: var(--mono);
    font-size: 10px;
    color: var(--muted);
  }
  #pageGraphLib .kg-meta .author{
    display: flex; align-items: center; gap: 6px;
    color: var(--ink-soft); min-width: 0;
  }
  #pageGraphLib .kg-meta .org-avatar{
    width: 18px; height: 18px;
    border-radius: 50%;
    background: linear-gradient(135deg, #4a5680, #2a3550);
    color: #fff;
    display: grid; place-items: center;
    font-size: 8px; font-weight: 700;
    font-family: var(--display);
    flex-shrink: 0;
  }
  #pageGraphLib .kg-meta .org-avatar[data-tone="calt"]{ background: linear-gradient(135deg, #1a2438, #3a4663); }
  #pageGraphLib .kg-meta .org-avatar[data-tone="casc"]{ background: linear-gradient(135deg, #c34141, #8a2222); }
  #pageGraphLib .kg-meta .org-avatar[data-tone="avic"]{ background: linear-gradient(135deg, #3a7e5c, #6db89a); }
  #pageGraphLib .kg-meta .org-avatar[data-tone="buaa"]{ background: linear-gradient(135deg, #4d3b8a, #8a73c4); }
  #pageGraphLib .kg-meta .org-avatar[data-tone="nuaa"]{ background: linear-gradient(135deg, #a04e30, #d18568); }
  #pageGraphLib .kg-meta .org-avatar[data-tone="cnsa"]{ background: linear-gradient(135deg, #5e3814, #a0703a); }
  #pageGraphLib .kg-meta .org-avatar[data-tone="sast"]{ background: linear-gradient(135deg, #5675a8, #7c9dc4); }
  #pageGraphLib .kg-meta .org-avatar[data-tone="cardc"]{ background: linear-gradient(135deg, #2c4a7a, #5a7fb5); }
  #pageGraphLib .kg-meta .handle{
    overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
    font-size: 10px;
  }
  #pageGraphLib .kg-meta .stats{ display: flex; gap: 10px; flex-shrink: 0; }
  #pageGraphLib .kg-meta .stat{ display: inline-flex; align-items: center; gap: 3px; }
  #pageGraphLib .kg-meta .stat svg{ width: 9px; height: 9px; opacity: .65; }
  #pageGraphLib .kg-meta .version{
    font-family: var(--mono);
    color: var(--muted-2);
    font-size: 9.5px;
    letter-spacing: 0.04em;
  }

  /* =====================================================
     ↓ Tab 切换骨架屏（5 个 library page 通用）
     参考 home.html .view-skeleton + .is-loading 机制
     每次切到 KB / KG / 工具 / 技能 / 设备 库时短暂展示 ~420ms
     ===================================================== */
  @keyframes spaceSkelShimmer {
    0%   { background-position: -240% 0; }
    100% { background-position: 240% 0; }
  }
  .sk-bar, .sk-circle{
    background: linear-gradient(90deg, rgba(60,40,20,.05) 0%, rgba(60,40,20,.13) 50%, rgba(60,40,20,.05) 100%);
    background-size: 200% 100%;
    animation: spaceSkelShimmer 1.5s ease-in-out infinite;
    border-radius: 4px;
  }
  .sk-circle{ border-radius: 50%; }

  .page > .view-skel{
    display: none;
    width: 100%;
    max-width: 1280px;
    margin: 0 auto;
    padding: 40px 56px 56px;
    box-sizing: border-box;
    position: absolute;
    left: 0; right: 0; top: 0;
  }
  @media (max-width: 720px){
    .page > .view-skel{ padding: 24px 18px 40px; }
  }
  .page.is-loading{ position: relative; }
  .page.is-loading > .view-skel{ display: block; }
  .page.is-loading > .apps-view{
    opacity: 0;
    pointer-events: none;
  }
  .page > .apps-view{
    transition: opacity .32s ease;
  }

  .view-skel .sk-view-head{
    display: flex;
    align-items: flex-end;
    justify-content: space-between;
    gap: 24px;
    flex-wrap: wrap;
    margin-bottom: 28px;
  }
  .view-skel .sk-head-left{ display: flex; flex-direction: column; gap: 10px; }
  .view-skel .sk-eyebrow{ width: 220px; height: 10px; }
  .view-skel .sk-title-bar{ width: 180px; height: 28px; }
  .view-skel .sk-meta{ width: 380px; max-width: 60vw; height: 11px; }
  .view-skel .sk-search{ width: 300px; height: 38px; border-radius: 999px; }

  .view-skel .sk-tag-row{
    display: flex;
    align-items: center;
    flex-wrap: wrap;
    gap: 8px;
    margin-bottom: 12px;
  }
  .view-skel .sk-tag-row:last-of-type{ margin-bottom: 22px; }
  .view-skel .sk-tag-label{ width: 64px; height: 12px; margin-right: 6px; }
  .view-skel .sk-chip{
    width: 84px; height: 30px;
    border-radius: 999px;
  }
  .view-skel .sk-chip.sm{
    width: 76px; height: 26px;
    border-radius: 6px;
  }

  .view-skel .sk-toolbar{
    display: flex;
    justify-content: space-between;
    align-items: center;
    padding-bottom: 14px;
    margin-bottom: 22px;
    border-bottom: 1px solid var(--rule);
  }
  .view-skel .sk-count{ width: 150px; height: 14px; }
  .view-skel .sk-sort{ width: 200px; height: 30px; border-radius: 999px; }

  .view-skel .sk-grid-4{
    display: grid;
    grid-template-columns: repeat(4, 1fr);
    gap: 16px;
  }
  .view-skel .sk-grid-3{
    display: grid;
    grid-template-columns: repeat(3, 1fr);
    gap: 18px;
  }
  .view-skel .sk-grid-2{
    display: grid;
    grid-template-columns: repeat(2, 1fr);
    gap: 18px;
  }
  @media (max-width: 1200px){
    .view-skel .sk-grid-4{ grid-template-columns: repeat(3, 1fr); }
    .view-skel .sk-grid-3{ grid-template-columns: repeat(2, 1fr); }
  }
  @media (max-width: 900px){
    .view-skel .sk-grid-4{ grid-template-columns: repeat(2, 1fr); }
    .view-skel .sk-grid-2{ grid-template-columns: 1fr; }
  }
  @media (max-width: 720px){
    .view-skel .sk-grid-3{ grid-template-columns: 1fr; }
  }

  /* —— 卡片：compact (Tools) —— */
  .view-skel .sk-card{
    background: var(--paper);
    border: 1px solid var(--rule);
    border-radius: 12px;
    padding: 16px;
    display: flex;
    flex-direction: column;
    gap: 10px;
  }
  .view-skel .sk-card.compact{ min-height: 196px; }
  .view-skel .sk-card .sk-card-top{
    display: flex;
    align-items: center;
    gap: 11px;
  }
  .view-skel .sk-card .sk-icon-block{
    width: 38px; height: 38px;
    border-radius: 9px;
    flex-shrink: 0;
  }
  .view-skel .sk-card .sk-card-name-block{
    flex: 1;
    display: flex;
    flex-direction: column;
    gap: 5px;
  }
  .view-skel .sk-card .sk-card-name{ width: 80%; height: 14px; }
  .view-skel .sk-card .sk-card-pkg{ width: 60%; height: 8px; }
  .view-skel .sk-card .sk-desc-line{ width: 100%; height: 9px; }
  .view-skel .sk-card .sk-desc-line.short{ width: 72%; }
  .view-skel .sk-card .sk-tags-row{
    display: flex;
    gap: 6px;
    margin-top: 2px;
  }
  .view-skel .sk-card .sk-mini-chip{
    width: 50px; height: 16px;
    border-radius: 4px;
  }
  .view-skel .sk-card .sk-foot{
    margin-top: auto;
    padding-top: 10px;
    border-top: 1px dashed var(--rule);
    display: flex;
    align-items: center;
    gap: 8px;
  }
  .view-skel .sk-card .sk-foot .sk-mini-circle{
    width: 18px; height: 18px;
    flex-shrink: 0;
  }
  .view-skel .sk-card .sk-foot .sk-foot-name{
    flex: 1;
    height: 10px;
    max-width: 110px;
  }
  .view-skel .sk-card .sk-foot .sk-foot-stat{
    width: 36px; height: 10px;
  }

  /* —— 卡片：horizontal (Skills) —— */
  .view-skel .sk-card.horizontal{
    min-height: 170px;
    padding: 18px 22px 14px;
    display: grid;
    grid-template-columns: 56px 1fr auto;
    grid-template-rows: auto auto auto auto;
    column-gap: 16px;
    row-gap: 10px;
  }
  .view-skel .sk-card.horizontal .sk-big-icon{
    width: 56px; height: 56px;
    border-radius: 13px;
    grid-column: 1;
    grid-row: 1;
  }
  .view-skel .sk-card.horizontal .sk-name-block{
    grid-column: 2;
    grid-row: 1;
    align-self: center;
    display: flex;
    flex-direction: column;
    gap: 6px;
  }
  .view-skel .sk-card.horizontal .sk-name-block .sk-bar:first-child{
    width: 70%; height: 16px;
  }
  .view-skel .sk-card.horizontal .sk-name-block .sk-bar:last-child{
    width: 45%; height: 10px;
  }
  .view-skel .sk-card.horizontal .sk-level{
    grid-column: 3;
    grid-row: 1;
    justify-self: end;
    width: 48px; height: 22px;
    border-radius: 999px;
  }
  .view-skel .sk-card.horizontal .sk-h-desc{
    grid-column: 1 / -1;
    grid-row: 2;
    display: flex;
    flex-direction: column;
    gap: 6px;
  }
  .view-skel .sk-card.horizontal .sk-h-tags{
    grid-column: 1 / -1;
    grid-row: 3;
    display: flex;
    gap: 6px;
  }
  .view-skel .sk-card.horizontal .sk-h-foot{
    grid-column: 1 / -1;
    grid-row: 4;
    padding-top: 10px;
    border-top: 1px dashed var(--rule);
    display: flex;
    align-items: center;
    gap: 8px;
  }

  /* —— 卡片：cover-top (Devices) —— */
  .view-skel .sk-card.cover-top{
    padding: 0;
    min-height: 380px;
    border-radius: 14px;
    overflow: hidden;
  }
  .view-skel .sk-card.cover-top .sk-cover{
    width: 100%;
    aspect-ratio: 16 / 9;
    border-radius: 0;
    border-bottom: 1px solid var(--rule);
    background:
      linear-gradient(135deg, rgba(60,40,20,.10) 0%, rgba(60,40,20,.16) 100%);
  }
  .view-skel .sk-card.cover-top .sk-cover-body{
    padding: 14px 16px;
    display: flex;
    flex-direction: column;
    gap: 9px;
    flex: 1;
  }
  .view-skel .sk-card.cover-top .sk-specs{
    display: grid;
    grid-template-columns: 1fr 1fr;
    gap: 6px 14px;
    padding: 8px 10px;
    border-radius: 6px;
    background: var(--bg-soft);
  }
  .view-skel .sk-card.cover-top .sk-specs .sk-bar{ height: 14px; }

  /* —— 卡片：spine-left (Knowledge) —— */
  .view-skel .sk-card.spine-left{
    position: relative;
    padding: 16px 18px 14px 22px;
    border-left: none;
    min-height: 280px;
  }
  .view-skel .sk-card.spine-left::before{
    content: '';
    position: absolute;
    left: 0; top: 0; bottom: 0;
    width: 6px;
    background: linear-gradient(180deg, rgba(60,40,20,.18) 0%, rgba(60,40,20,.08) 100%);
  }
  .view-skel .sk-card.spine-left .sk-metrics{
    display: grid;
    grid-template-columns: repeat(4, 1fr);
    gap: 0;
    background: var(--bg-soft);
    border: 1px solid var(--rule);
    border-radius: 6px;
    overflow: hidden;
  }
  .view-skel .sk-card.spine-left .sk-metrics > div{
    padding: 8px 6px;
    border-right: 1px solid var(--rule);
    display: flex;
    flex-direction: column;
    gap: 4px;
    align-items: center;
  }
  .view-skel .sk-card.spine-left .sk-metrics > div:last-child{ border-right: none; }
  .view-skel .sk-card.spine-left .sk-metrics .sk-bar{ width: 70%; height: 14px; }
  .view-skel .sk-card.spine-left .sk-metrics .sk-bar.small{ width: 50%; height: 8px; }

  /* —— 卡片：preview-top (Graphs / KG) —— */
  .view-skel .sk-card.preview-top{
    padding: 0;
    min-height: 380px;
    border-radius: 14px;
    overflow: hidden;
  }
  .view-skel .sk-card.preview-top .sk-graph-preview{
    position: relative;
    height: 132px;
    border-bottom: 1px solid var(--rule);
    background:
      linear-gradient(90deg, rgba(60,40,20,.05) 0%, rgba(60,40,20,.13) 50%, rgba(60,40,20,.05) 100%);
    background-size: 200% 100%;
    animation: spaceSkelShimmer 1.5s ease-in-out infinite;
  }
  .view-skel .sk-card.preview-top .sk-graph-preview::before{
    content: '';
    position: absolute; inset: 0;
    background-image:
      linear-gradient(rgba(40,55,80,.06) 1px, transparent 1px),
      linear-gradient(90deg, rgba(40,55,80,.06) 1px, transparent 1px);
    background-size: 18px 18px;
    pointer-events: none;
  }
  .view-skel .sk-card.preview-top .sk-preview-body{
    padding: 14px 16px;
    display: flex;
    flex-direction: column;
    gap: 9px;
    flex: 1;
  }

