/* ============================================================
   达观 IFAS 交付工作台 · 工作台外壳皮肤（浅色多彩，2026-09-24 改版）
   ------------------------------------------------------------
   上一版是「深色控制台 + 极光玻璃」，判词：太暗、不好看、不时尚。
   这一版照用户给的参考屏重做，四条硬规矩：
     · 页底冷灰白 #F3F5F9，卡片纯白 —— 层次靠 1px 浅线 + 柔影，不靠压黑；
     · 彩色只上小元素（序号徽标 / 图标砖 / 数字 / 色点 / 选中块），大面恒白；
     · 8 色数据色板按序号轮转（.h-1…8 + D.hue(i)），同组第 N 个取第 N 色；
     · 圆角放大到 10/14/18，阴影低透明大扩散 —— 不再用 backdrop 玻璃与外发光。
   所有取值都在 tokens.css；本文件不定义颜色字面量，只除品牌块那一处双色渐变。
   ============================================================ */

/* 页面之间的过渡（跨文档 View Transitions）＋ 工作台内切 Tab 的过渡。
   完整说明见 theme.css 同一段；两份皮肤各带一份才能覆盖全站。 */
@view-transition { navigation: auto; }

::view-transition-old(root) {
  animation: vt-out 160ms cubic-bezier(.4, 0, 1, 1) both;
}
::view-transition-new(root) {
  animation: vt-in 300ms cubic-bezier(.22, .8, .28, 1) both;
}
@keyframes vt-out { to { opacity: 0; transform: translateY(-5px); } }
@keyframes vt-in { from { opacity: 0; transform: translateY(9px); } }

/* 切 Tab 时只让内容区过渡，顶栏与背景纹丝不动 —— 三个面板同一时刻
   只有一个在渲染，共用这个名字正好让新旧内容对位淡入淡出。 */
.cx-panel { view-transition-name: cx-panel; }
::view-transition-old(cx-panel) { animation: vt-out 130ms cubic-bezier(.4, 0, 1, 1) both; }
::view-transition-new(cx-panel) { animation: vt-in 260ms cubic-bezier(.22, .8, .28, 1) both; }

@media (prefers-reduced-motion: reduce) {
  ::view-transition-old(root), ::view-transition-new(root),
  ::view-transition-old(cx-panel), ::view-transition-new(cx-panel) { animation: none; }
}

/* ---------------- 基础 ---------------- */
* { box-sizing: border-box; }
html { background: var(--bg); }
body {
  margin: 0; background: var(--bg); color: var(--text-primary);
  font-family: var(--font-ui); font-size: var(--fs-body); line-height: 1.6;
  -webkit-font-smoothing: antialiased;
}
a { color: inherit; text-decoration: none; }
button, input { font-family: inherit; font-size: inherit; color: inherit; }
button { background: none; border: 0; cursor: pointer; }
svg { display: block; }
:focus-visible { outline: none; box-shadow: 0 0 0 3px var(--accent-ring); border-radius: var(--radius-sm); }

/* ---------------- 背景：两团极淡的冷色光晕（只做层次，不抢内容） ----------------
   深色版靠极光撑气质，浅色版不能这么干 —— 这里把透明度压到 .08 上下，
   作用是让页底不是死板一张，而不是让人看见"有块颜色"。 */
.cx-aurora { position: fixed; inset: 0; z-index: 0; pointer-events: none; overflow: hidden; }
.cx-aurora i { position: absolute; border-radius: 50%; filter: blur(90px); }
.cx-aurora .b1 { width: 620px; height: 620px; left: -160px; top: -220px; background: radial-gradient(circle, rgba(79,70,229,.10), rgba(79,70,229,0) 70%); }
.cx-aurora .b2 { width: 760px; height: 760px; right: -220px; top: -260px; background: radial-gradient(circle, rgba(14,165,233,.09), rgba(14,165,233,0) 70%); }
.cx-aurora .b3 { width: 800px; height: 800px; left: 34%; bottom: -380px; background: radial-gradient(circle, rgba(168,85,247,.07), rgba(168,85,247,0) 70%); }

.cx-page { position: relative; z-index: 1; min-height: 100vh; }

/* ---------------- 顶栏 ---------------- */
.cx-bar {
  position: sticky; top: 0; z-index: 30;
  border-bottom: 1px solid var(--border);
  background: rgba(255, 255, 255, .82);
  -webkit-backdrop-filter: blur(14px) saturate(1.6); backdrop-filter: blur(14px) saturate(1.6);
}
@supports not ((backdrop-filter: blur(1px)) or (-webkit-backdrop-filter: blur(1px))) {
  .cx-bar { background: #FFFFFF; }
}
.cx-bar-inner { max-width: 1180px; margin: 0 auto; display: flex; align-items: center; gap: var(--space-5); padding: 0 var(--space-6); height: var(--bar-h); }

.cx-brand { display: flex; align-items: center; gap: 10px; flex: none; }
/* 全站唯一一处双色渐变：品牌小方块。尺寸 28px，落在"小元素可以带色"那一档 */
.cx-brand-mark {
  width: 28px; height: 28px; border-radius: 9px; flex: 0 0 28px;
  display: flex; align-items: center; justify-content: center;
  background: linear-gradient(135deg, var(--accent), var(--accent-2)); color: #FFFFFF;
  box-shadow: var(--accent-glow);
}
.cx-brand-mark svg { width: 15px; height: 15px; }
.cx-brand-name { font-size: 14.5px; font-weight: var(--fw-title); letter-spacing: .1px; }

/* Tab = 分段控件：浅灰轨道 + 白色选中块，选中块带影、字用强调色。
   （参考图右侧「今天 / 最近」那一组就是它） */
.cx-tabs { display: inline-flex; gap: 2px; flex: none; padding: 3px; background: #EDF0F5; border-radius: 999px; }
.cx-tab {
  position: relative; padding: 6px 16px; border-radius: 999px;
  font-size: 13.5px; font-weight: 500; color: var(--text-secondary); transition: .16s;
}
.cx-tab:hover { color: var(--text-primary); }
.cx-tab.is-on {
  color: var(--accent); background: #FFFFFF; font-weight: 600;
  box-shadow: 0 1px 2px rgba(16, 24, 40, .06), 0 4px 12px -6px rgba(16, 24, 40, .18);
}
/* 内页（规则梳理 / 产品文档）拿 .cx-tabs 当面包屑用：只有一枚静态标签，
   没有可选项 —— 那就不能带分段控件的灰轨道，否则读成一个"没选完的控件"。 */
.cx-tabs:not([role="tablist"]) { background: none; padding: 0; }
.cx-tabs:not([role="tablist"]) .cx-tab { padding-left: 0; font-weight: 600; color: var(--text-primary); }
.cx-who { margin-left: auto; flex: none; display: flex; align-items: center; gap: 10px; font-size: 12.5px; color: var(--text-secondary); }
.cx-who a { color: var(--text-tertiary); border-bottom: 1px solid var(--border-strong); }
.cx-who a:hover { color: var(--accent); border-color: var(--accent); }
.cx-perm { color: var(--h); background: var(--h-soft); border: 1px solid var(--h-line); padding: 2px 9px; border-radius: 999px; font-size: 11.5px; font-weight: 500; }

/* ---------------- 主体与区块头 ---------------- */
.cx-main { max-width: 1180px; margin: 0 auto; padding: var(--space-8) var(--space-6) 96px; }
.cx-panel[hidden] { display: none; }
.cx-sec { margin-bottom: 30px; }
.cx-sec-head { display: flex; align-items: center; gap: var(--space-3); margin-bottom: var(--space-4); flex-wrap: wrap; }
.cx-sec-title { font-size: var(--fs-title); font-weight: var(--fw-title); }
.cx-sec-note { font-size: var(--fs-caption); color: var(--text-tertiary); }
/* 计数数字上色：参考图里「253 只」那种读法 —— 一个加粗的同色数字就够撑起焦点 */
.cx-count { font-family: var(--font-mono); font-size: 14px; font-weight: 700; color: var(--h); margin-right: 2px; }
/* 区块序号徽标：参考图「01 时间分布」那一枚。彩色只上这颗 26px 的小方块 */
.cx-sec-badge {
  flex: none; width: 26px; height: 26px; border-radius: 8px;
  display: inline-flex; align-items: center; justify-content: center;
  background: var(--h); color: #FFFFFF;
  font-family: var(--font-mono); font-size: 12px; font-weight: 700; letter-spacing: -.2px;
  box-shadow: 0 4px 10px -5px var(--h);
}
/* 区块头右侧动作区（原来叫 .gd-act，名字沿用，位置从指引卡里挪到了通用头） */
.cx-sec-tail { margin-left: auto; display: flex; align-items: center; gap: var(--space-2); }

/* ---------------- 新人指引：整页第一块，展开即六站 ---------------- */
.gd {
  border: 1px solid var(--border); border-radius: var(--radius-lg);
  background: var(--card); box-shadow: var(--sh-1);
  padding: 18px 20px;
}
.gd-head { display: flex; align-items: center; gap: var(--space-3); flex-wrap: wrap; }
.gd-title { font-size: var(--fs-title); font-weight: var(--fw-title); }
.gd-sub { font-size: var(--fs-caption); color: var(--text-tertiary); }
.gd-act { margin-left: auto; display: flex; gap: var(--space-2); }
.gd-rail { display: flex; align-items: flex-start; gap: 0; margin-top: 18px; overflow-x: auto; padding-bottom: 4px; }
.gd-stop { flex: 1 1 0; min-width: 132px; position: relative; padding-right: 12px; }
/* 序号点： tint 底 + 同色数字 + 同色描边；第一站实心。六站各取一色 = 参考图那排柱子的读法 */
.gd-dot {
  width: 28px; height: 28px; border-radius: 50%; display: flex; align-items: center; justify-content: center;
  font-family: var(--font-mono); font-size: 12.5px; font-weight: 700;
  background: var(--h-soft); border: 1px solid var(--h-line); color: var(--h);
}
.gd-stop.is-first .gd-dot { background: var(--h); border-color: var(--h); color: #FFFFFF; box-shadow: 0 4px 10px -5px var(--h); }
.gd-stop::after { content: ""; position: absolute; left: 28px; right: 0; top: 14px; height: 1px; background: var(--border); }
.gd-stop:last-child::after { display: none; }
.gd-name { display: block; margin-top: 10px; font-size: 13.5px; font-weight: 500; color: var(--text-primary); }
.gd-desc { display: block; margin-top: 4px; font-size: var(--fs-label); color: var(--text-tertiary); line-height: 1.6; padding-right: 8px; }

/* ---------------- 问答：可用 ---------------- */
.ask {
  border: 1px solid var(--border); border-radius: var(--radius-lg); padding: 18px 20px;
  background: var(--card); box-shadow: var(--sh-1);
}
.ask-row { display: flex; gap: var(--space-2); }
.ask-in {
  flex: 1; height: 42px; padding: 0 16px; border-radius: 999px;
  border: 1px solid var(--border-strong); background: #FFFFFF; color: var(--text-primary);
}
.ask-in::placeholder { color: var(--text-placeholder); }
.ask-in:focus { outline: none; border-color: var(--accent); box-shadow: 0 0 0 3px var(--accent-ring); }
.ask-go {
  height: 42px; padding: 0 22px; border-radius: 999px; font-size: 14px; font-weight: 600;
  background: var(--accent); color: var(--accent-fg); box-shadow: var(--accent-glow);
  transition: .16s;
}
.ask-go:hover { background: var(--accent-hover); box-shadow: 0 10px 22px -10px rgba(79, 70, 229, .7); }
.ask-go:active { background: var(--accent-active); }
.ask-go:disabled { opacity: .5; cursor: not-allowed; box-shadow: none; }
.ask-out { margin-top: 14px; }
/* 多轮问答：一轮一段往下接，不再问第二句就把第一句冲掉 */
.ask-turn + .ask-turn { margin-top: 18px; padding-top: 18px; border-top: 1px solid var(--border); }
.ask-q { font-size: var(--fs-body); color: var(--text-secondary); margin-bottom: 8px; }
.ask-q::before { content: '问 · '; color: var(--text-tertiary); }
/* 新建项目表单默认收起：.composer 的 display:flex 会盖掉 [hidden] 自带的 display:none */
#pw-form[hidden] { display: none; }

/* ---------------- 问答：一整屏的对话应用 ----------------
   高度钉在视口上，不跟文档流走：对话流自己滚，输入区常驻底部。
   （之前它随内容长高 —— 空态时上面一小条白框、输入框漂在页面正中，视口一变就散。）
   body.cx-ask-mode 由 console.js applyTab() 挂上，只在这个 Tab 生效，别的页照旧按文档流排。 */
body.cx-ask-mode .cx-main { padding-bottom: var(--space-6); }
body.cx-ask-mode .cx-sec { margin-bottom: 0; }

.qa-wrap {
  display: grid; grid-template-columns: 232px minmax(0, 1fr); gap: 22px;
  align-items: stretch;
  /* 视口 − 顶栏 − .cx-main 的上下内边距 = 对话区可用高；dvh 跟着手机地址栏收放 */
  height: calc(100vh - var(--bar-h) - var(--space-8) - var(--space-6));
  height: calc(100dvh - var(--bar-h) - var(--space-8) - var(--space-6));
  min-height: 400px;
}

/* 左栏：新对话 + 历史列表。自己滚，不参与页面滚 */
.qa-side { display: flex; flex-direction: column; min-height: 0; border-right: 1px solid var(--border); padding-right: 16px; }
.qa-new { flex: none; width: 100%; height: 34px; margin-bottom: 14px; }
.qa-side-t { flex: none; margin-bottom: 8px; }
.qa-list { flex: 1 1 auto; min-height: 0; display: flex; flex-direction: column; gap: 2px; overflow-y: auto; }
.qa-item {
  flex: none; display: flex; justify-content: space-between; align-items: baseline; gap: 8px;
  padding: 8px 10px; border-radius: var(--radius-sm); text-decoration: none;
  color: var(--text-secondary); font-size: var(--fs-caption);
}
.qa-item:hover { background: var(--bg-hover); }
.qa-item.is-on { background: var(--accent-tint); color: var(--accent); font-weight: 500; }
.qa-item-t { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.qa-item-d { flex: none; color: var(--text-tertiary); font-size: var(--fs-label); }

/* 右栏：对话流吃掉全部剩余高度，输入槽固定在它下面 */
.qa-main { min-width: 0; min-height: 0; display: flex; flex-direction: column; }
.qa-flow {
  flex: 1 1 auto; min-height: 0; overflow-y: auto;
  display: flex; flex-direction: column;
  background: var(--card); border: 1px solid var(--border);
  border-radius: var(--radius-lg); box-shadow: var(--sh-1);
  padding: 8px 0;
}
.qa-flow > * { flex: none; }
/* 空态撑满剩余高度并居中 —— 不再出现「一小条白框 + 下面一大片空」 */
.qa-flow .cx-empty {
  flex: 1 1 auto; display: flex; align-items: center; justify-content: center;
  border: 0; border-radius: 0; background: none; box-shadow: none; padding: 24px;
}
/* 底部输入槽：白卡 + 落影，读作「悬浮在底部的固定输入区」。
   sticky 是道保险：万一这一屏被撑到要滚页面，它也贴住视口底边不跑掉 */
.qa-dock {
  position: sticky; bottom: 0; flex: none; z-index: 5;
  display: flex; align-items: center; gap: var(--space-2);
  margin-top: 12px; padding: 10px 12px;
  background: var(--card); border: 1px solid var(--border);
  border-radius: var(--radius-md); box-shadow: var(--sh-2);
}
.qa-dock .input { flex: 1 1 auto; min-width: 0; height: 40px; padding: 0 16px; border-radius: 999px; }
.qa-dock .btn { flex: none; height: 40px; padding: 0 20px; border-radius: 999px; }
.qa-wait { color: var(--text-tertiary); }

/* 窄屏：左右两栏改上下两段，历史会话塌成一行横滑胶囊（竖列会把对话区挤没） */
@media (max-width: 820px) {
  body.cx-ask-mode .cx-main { padding: 22px 16px var(--space-4); }
  .qa-wrap {
    /* 两行：历史条按内容高，对话区吃剩下的全部 —— 不然 auto 行会被拉伸留出空带 */
    grid-template-columns: minmax(0, 1fr); grid-template-rows: auto minmax(0, 1fr); gap: 12px;
    height: calc(100vh - var(--bar-h) - 22px - var(--space-4));
    height: calc(100dvh - var(--bar-h) - 22px - var(--space-4));
    min-height: 340px;
  }
  .qa-side {
    flex-direction: row; align-items: center; gap: 8px;
    border-right: 0; padding-right: 0; padding-bottom: 10px;
    border-bottom: 1px solid var(--border);
  }
  .qa-new { width: auto; height: 32px; margin-bottom: 0; padding: 0 16px; }
  .qa-side-t { display: none; }
  .qa-list { flex-direction: row; gap: 6px; overflow-x: auto; overflow-y: hidden; }
  .qa-item { border: 1px solid var(--border); background: #FFFFFF; }
  .qa-item-t { max-width: 150px; }
  .qa-item-d { display: none; }
  .qa-dock { margin-top: 10px; }
}
.ask-hint { font-size: var(--fs-caption); color: var(--text-tertiary); }
.ask-hint.bad { color: var(--warn); }
/* 模型答复：这是问答真正要交付的东西，给足行距，别跟提示文案一个分量 */
.ask-ans {
  font-size: 14px; line-height: 1.85; color: var(--text-primary);
  padding: 14px 16px; border-radius: var(--radius-md);
  background: var(--bg-subtle); border: 1px solid var(--border);
}
.ask-src { display: flex; flex-wrap: wrap; align-items: center; gap: 8px; margin-top: 12px; }
.ask-src-t { font-size: var(--fs-label); color: var(--text-tertiary); }
/* 引用胶囊：本体可点（开预览弹层），右侧一格小图标直接下载。
   只拿到标题、拿不到 id 的那条用 is-plain —— 不动、不响应悬停，免得看着能点却没反应。 */
.ask-cit {
  display: inline-flex; align-items: stretch;
  font-size: var(--fs-label); border-radius: 999px;
  border: 1px solid var(--border-strong); color: var(--text-secondary);
  background: #FFFFFF;
}
.ask-cit.is-plain {
  display: inline-block; padding: 3px 10px; max-width: 260px;
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}
.ask-cit.is-open { max-width: 300px; overflow: hidden; }
.ask-cit.is-open:hover { border-color: var(--accent); }
.ask-cit-n {
  min-width: 0; padding: 3px 9px 3px 11px;
  font: inherit; font-size: var(--fs-label); color: inherit;
  background: none; border: 0; cursor: pointer;
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}
.ask-cit.is-open:hover .ask-cit-n { color: var(--accent); }
.ask-cit-dl {
  flex: none; display: inline-flex; align-items: center;
  padding: 0 9px 0 8px; border-left: 1px solid var(--border-strong);
  color: var(--text-tertiary);
}
.ask-cit-dl:hover { color: var(--accent); background: var(--bg-subtle); }
.ask-meta { margin-top: 12px; font-size: var(--fs-label); color: var(--text-tertiary); }
.ref-row { display: flex; align-items: center; gap: 10px; padding: 9px 0; border-bottom: 1px solid var(--border); font-size: 13.5px; }
.ref-row:last-child { border-bottom: 0; }
.ref-row i { width: 5px; height: 5px; border-radius: 50%; background: var(--h); flex: none; }
.ref-row .rt { flex: 1; min-width: 0; }
.ref-row .rk { font-size: var(--fs-label); color: var(--text-tertiary); font-family: var(--font-mono); }

/* ---------------- 工具入口：卡片网格 ---------------- */
.cx-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(272px, 1fr)); gap: var(--space-3); }
.cx-tool {
  display: flex; align-items: flex-start; gap: 12px; padding: 16px;
  border: 1px solid var(--border); border-radius: var(--radius-md);
  background: var(--card); box-shadow: var(--sh-1);
  transition: .16s;
}
.cx-tool:hover {
  border-color: var(--h-line); box-shadow: var(--sh-2);
  transform: translateY(-2px);
}
/* 图标砖：彩色落点。tint 底 + 同色线性图标，按 .h-N 轮转 */
.cx-tool-ic {
  flex: none; width: 36px; height: 36px; border-radius: 11px;
  display: inline-flex; align-items: center; justify-content: center;
  color: var(--h); background: var(--h-soft); border: 1px solid var(--h-line);
}
.cx-tool-body { min-width: 0; display: block; }
.cx-tool-name { display: flex; align-items: center; gap: 8px; font-size: 14.5px; font-weight: 600; }
.cx-tool-desc { display: block; font-size: 12.5px; color: var(--text-secondary); margin-top: 4px; line-height: 1.6; }
.cx-chip { flex: none; font-size: 11px; font-weight: 500; color: var(--text-tertiary); background: var(--bg-subtle); border: 1px solid var(--border); border-radius: 999px; padding: 1px 8px; }

/* ---------------- 专家团：三列卡片（9 条通栏太累） ---------------- */
.cx-cat { font-size: var(--fs-label); font-weight: 600; color: var(--text-tertiary); letter-spacing: .06em; margin: 18px 0 10px; }
.cx-cat:first-child { margin-top: 0; }
.cx-teams { display: grid; grid-template-columns: repeat(auto-fill, minmax(330px, 1fr)); gap: var(--space-3); }
.cx-team {
  display: flex; align-items: center; gap: 12px; padding: 14px 16px;
  border: 1px solid var(--border); border-radius: var(--radius-md);
  background: var(--card); box-shadow: var(--sh-1);
  transition: .16s;
}
.cx-team:hover { border-color: var(--h-line); box-shadow: var(--sh-2); transform: translateY(-2px); }
.cx-team-main { flex: 1; min-width: 0; display: block; }
.cx-team-name { display: block; font-size: 14px; font-weight: 600; }
.cx-team-sub { display: block; font-size: 12px; color: var(--text-tertiary); margin-top: 2px; }
.cx-team-meta { flex: none; display: flex; flex-direction: column; align-items: flex-end; gap: 5px; }
.cx-team-nums { font-family: var(--font-mono); font-size: 11.5px; color: var(--text-tertiary); }
.cx-badge { font-size: 11px; padding: 1px 9px; border-radius: 999px; border: 1px solid var(--border-strong); color: var(--text-secondary); background: #FFFFFF; }
.cx-badge.is-todo { color: var(--h); border-color: var(--h-line); background: var(--h-soft); }

/* ---------------- 项目卡 ---------------- */
.cx-projects { display: grid; grid-template-columns: repeat(auto-fill, minmax(320px, 1fr)); gap: var(--space-3); }
.cx-proj {
  display: flex; align-items: flex-start; gap: 12px; padding: 16px;
  border: 1px solid var(--border); border-radius: var(--radius-md);
  background: var(--card); box-shadow: var(--sh-1);
  transition: .16s;
}
.cx-proj:hover { border-color: var(--h-line); box-shadow: var(--sh-2); transform: translateY(-2px); }
/* 项目首字砖：参考图 KPI 卡左上那枚彩色图标位，换成项目首字 */
.cx-proj-ic {
  flex: none; width: 36px; height: 36px; border-radius: 11px;
  display: inline-flex; align-items: center; justify-content: center;
  font-size: 15px; font-weight: 600; color: var(--h);
  background: var(--h-soft); border: 1px solid var(--h-line);
}
.cx-proj-body { flex: 1; min-width: 0; display: block; }
.cx-proj-name { display: block; font-size: 15px; font-weight: 600; }
.cx-proj-desc { display: block; font-size: 12.5px; color: var(--text-secondary); margin-top: 5px; line-height: 1.6; }
.cx-proj-foot { display: flex; align-items: center; justify-content: space-between; margin-top: 12px; }
.cx-proj-meta { font-family: var(--font-mono); font-size: 11.5px; color: var(--text-tertiary); }
.cx-stack { display: flex; }
.cx-av { width: 24px; height: 24px; border-radius: 50%; margin-left: -7px; display: inline-flex; align-items: center; justify-content: center; font-size: 10.5px; font-weight: 500; color: var(--text-secondary); background: #FFFFFF; border: 1px solid var(--border-strong); }
.cx-av:first-child { margin-left: 0; }

/* 空态：实线浅底。原来用虚线框，会被读成「拖放区 / 没填完」（用户点过这条） */
.cx-empty {
  padding: 30px 24px; text-align: center; color: var(--text-tertiary); font-size: var(--fs-caption);
  border: 1px solid var(--border); border-radius: var(--radius-md);
  background: var(--bg-subtle);
}

/* ---------------- 规则梳理专家团：上传区 / 材料 / 流水线 ---------------- */
.drop {
  width: 100%; display: flex; flex-direction: column; align-items: center; gap: 6px;
  padding: 28px 20px; border: 1px dashed var(--border-strong); border-radius: var(--radius-lg);
  background: var(--bg-subtle); color: var(--text-secondary); cursor: pointer; transition: .16s;
}
.drop:hover { border-color: var(--accent); background: var(--accent-tint-weak); color: var(--text-primary); }
.drop b { font-size: 15.5px; font-weight: 600; color: var(--text-primary); }
.drop span { font-size: var(--fs-caption); }
.drop.is-busy { opacity: .6; pointer-events: none; }
.job-log { margin-top: 14px; display: flex; flex-direction: column; gap: 7px; }
.job-log p { margin: 0; font-size: var(--fs-caption); color: var(--text-secondary); }
.job-log p.bad { color: var(--warn); }
.mat {
  display: flex; align-items: center; gap: 12px; padding: 12px 14px;
  border: 1px solid var(--border); border-radius: var(--radius-md);
  background: var(--card); box-shadow: var(--sh-1);
}
.mat + .mat { margin-top: 8px; }
.mat .n { flex: 1; min-width: 0; font-size: 14.5px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.mat .c { font-family: var(--font-mono); font-size: 12px; color: var(--text-tertiary); }
/* .mat 现在也当行链接用（项目资料里点开文件/进文件夹），所以要把 a 的默认样式收回来 */
a.mat { color: inherit; text-decoration: none; cursor: pointer; transition: .14s; }
a.mat:hover { border-color: var(--h-line); background: var(--h-soft); box-shadow: var(--sh-2); }
/* 项目资料：面包屑与加载提示 */
.fx-trail { display: flex; flex-wrap: wrap; align-items: center; gap: 6px; margin: 4px 0 14px; font-size: 12.5px; }
.fx-crumb { color: var(--accent); text-decoration: none; cursor: pointer; font-weight: 500; }
.fx-crumb:hover { text-decoration: underline; }
.fx-sep { color: var(--text-placeholder); }
.fx-here { color: var(--text-secondary); }
.fx-hint { padding: 14px 16px; font-size: 13px; color: var(--text-tertiary); }
/* 目录骨架行：等网络时先给一排「长得像列表」的灰条。
   只用中性灰、不上强调色 —— 它表示「还没到」，不该抢真正的焦点。 */
.sk { display: flex; flex-direction: column; gap: 8px; padding: 2px 0; }
.sk-row { display: flex; align-items: center; gap: 12px; padding: 12px 14px; border: 1px solid var(--border); border-radius: var(--radius-md); }
.sk-row > span { display: block; border-radius: 999px; background: linear-gradient(90deg, #EEF1F6 25%, #F7F9FC 50%, #EEF1F6 75%); background-size: 240% 100%; animation: sk-slide 1.25s linear infinite; }
.sk-ic { width: 30px; height: 30px; flex: none; border-radius: 9px; }
.sk-line { height: 12px; }
.sk-tag { height: 10px; width: 44px; margin-left: auto; flex: none; }
@keyframes sk-slide { from { background-position: 120% 0; } to { background-position: -20% 0; } }
@media (prefers-reduced-motion: reduce) { .sk-row > span { animation: none; } }
.pf-more { display: block; margin: 10px auto 0; height: 32px; padding: 0 18px; font-size: 13px; }
/* 项目资料：面包屑与上传按钮同一行，窄屏自动折行；上传结果跟在下面一条 */
.pf-bar { display: flex; align-items: center; justify-content: space-between; gap: 12px; flex-wrap: wrap; margin-bottom: 14px; }
.pf-bar .fx-trail { margin: 0; }
.pf-said { padding: 12px 14px; margin-bottom: 10px; font-size: 13px; color: var(--ok); background: var(--tst-done-bg); border: 1px solid var(--tst-done-dot); border-radius: var(--radius-sm); }
.step-tag { font-size: 12px; padding: 1px 9px; border-radius: 999px; border: 1px solid var(--border-strong); color: var(--text-tertiary); background: #FFFFFF; }
.step-tag.on { color: var(--ok); border-color: var(--tst-done-dot); background: var(--tst-done-bg); }

/* ---------------- 先上的那一个专家团（作业型） ---------------- */
.jt {
  position: relative; overflow: hidden;
  border: 1px solid var(--c1-line); border-radius: var(--radius-lg); padding: 20px;
  background: linear-gradient(180deg, var(--accent-tint-weak), var(--card) 62%);
  box-shadow: var(--sh-1);
}
/* 顶上一条 3px 双色线：整页只有这一处「缎带」，用来标"这是主推的那一个" */
.jt::before { content: ""; position: absolute; left: 0; right: 0; top: 0; height: 3px; background: linear-gradient(90deg, var(--accent), var(--accent-2)); }
.jt-head { display: flex; align-items: center; gap: 10px; flex-wrap: wrap; }
.jt-name { font-size: 17px; font-weight: var(--fw-title); letter-spacing: .1px; }
.jt-hot {
  font-size: 11.5px; font-weight: 600; padding: 2px 10px; border-radius: 999px;
  background: var(--c7); color: #FFFFFF; box-shadow: 0 4px 10px -5px var(--c7);
}
.jt-owner { font-size: 12px; color: var(--text-tertiary); }
.jt-cta { margin-left: auto; height: 34px; line-height: 34px; padding: 0 18px; font-size: 13.5px; }
.jt-desc { margin-top: 9px; font-size: 13.5px; color: var(--text-secondary); max-width: 780px; line-height: 1.7; }
.jt-kv { display: flex; gap: 26px; margin-top: 15px; flex-wrap: wrap; }
.jt-kv span { display: flex; flex-direction: column; gap: 2px; }
.jt-kv i { font-style: normal; font-size: 11.5px; color: var(--text-tertiary); }
.jt-kv b { font-weight: 600; font-size: 13.5px; }
.jt-rail { margin-top: 18px; }
.jt-note { margin-top: 12px; font-size: 12.5px; color: var(--text-tertiary); }

@media (max-width: 820px) {
  .cx-brand-name { display: none; }
  .cx-main { padding: 22px 16px 80px; }
  .gd-rail { flex-wrap: wrap; }
  .gd-stop { flex: 1 1 45%; margin-bottom: 12px; }
  .gd-stop::after { display: none; }
}

/* ---------------- IFAS 产品综合文档：正文预览 ---------------- */
.doc {
  margin: 0; padding: 18px 20px; max-height: 60vh; overflow: auto;
  border: 1px solid var(--border); border-radius: var(--radius-md);
  background: var(--card); color: var(--text-secondary); box-shadow: var(--sh-1);
  font-family: var(--font-mono); font-size: 13px; line-height: 1.75;
  white-space: pre-wrap; word-break: break-word;
}

/* ---------------- 规则梳理结果 ---------------- */
.run { border: 1px solid var(--border); border-radius: var(--radius-md); background: var(--card); box-shadow: var(--sh-1); padding: 16px 18px; }
.run + .run { margin-top: 12px; }
.run-head { display: flex; align-items: baseline; gap: 12px; flex-wrap: wrap; }
.run-title { font-size: 15.5px; font-weight: 600; }
.run-meta { font-family: var(--font-mono); font-size: 12px; color: var(--text-tertiary); }
.run-cat { margin-top: 6px; font-size: 13px; color: var(--text-secondary); display: flex; align-items: center; gap: 8px; flex-wrap: wrap; }
.run-exp { margin-top: 14px; padding-top: 12px; border-top: 1px solid var(--border); }
.run-exp-name { font-size: 14.5px; font-weight: 600; color: var(--h); }
.run-why { margin-left: 10px; font-size: 12px; font-weight: 400; color: var(--text-tertiary); }
.run-rules { margin: 8px 0 0; padding-left: 20px; }
.run-rules li { font-size: 13.5px; color: var(--text-secondary); line-height: 1.75; margin-bottom: 4px; }
.run-src { display: block; font-size: 12px; color: var(--text-tertiary); }
.run-orch { margin-top: 14px; padding-top: 12px; border-top: 1px solid var(--border); font-size: 13.5px; color: var(--text-secondary); }
.run-orch b { color: var(--text-primary); font-weight: 600; margin-right: 8px; }

/* ---------------- 项目工作区：对话区自成一屏，输入框常驻底部 ----------------
   这一屏以前整张卡跟着内容长高，对话一多输入框就被顶到屏幕外（用户 2026-09-24 报的）。
   现在高度由 console.js 的 pwFit() 量出来贴到 .pw-flow 上 —— 上面那几行（面包屑、项目名、
   Tab 条）会随内容与折行变，写死 calc 一定算不准。有了确定高度，对话流自己滚、输入区恒贴底边。 */
.pw-flow { display: flex; flex-direction: column; min-height: 0; }
.pw-flow .convo { flex: 1 1 auto; min-height: 0; }
.pw-flow .convo-body { padding-bottom: var(--space-4); }
.pw-flow .convo-foot { position: relative; flex: none; }

/* 「回到最新」：往上翻过历史之后，一键落回最后一条。
   绝对定位贴住输入区上沿 —— 不占文档流，所以输入区那行有没有「正在传…」都不影响它 */
.pw-jump {
  position: absolute; right: 16px; bottom: 100%; margin-bottom: 10px; z-index: 4;
  display: inline-flex; align-items: center; gap: 6px;
  height: 32px; padding: 0 14px; border-radius: 999px;
  font: inherit; font-size: var(--fs-label); cursor: pointer;
  color: var(--accent); background: var(--card);
  border: 1px solid var(--border-strong); box-shadow: var(--sh-2);
}
.pw-jump:hover { background: var(--accent-tint); border-color: var(--accent); }
.pw-jump[hidden] { display: none; }

/* 投料按钮：与输入框同高，站在输入框左边 —— 不跟主按钮抢注意力 */
.composer .btn-ico {
  flex: none; width: 38px; height: 36px;
  display: inline-flex; align-items: center; justify-content: center;
  border: 1px solid var(--border-strong); border-radius: var(--radius-sm);
  background: #FFFFFF; color: var(--text-secondary); cursor: pointer;
}
.composer .btn-ico:hover { border-color: var(--accent); color: var(--accent); }
.composer .btn-ico[disabled] { opacity: .5; cursor: default; }
.pw-up-note { font-size: var(--fs-label); color: var(--text-tertiary); margin-bottom: 8px; }
.pw-up-note.bad { color: var(--warn); }

/* ============================================================
   规则梳理（任务制）—— 建任务 / 我的任务 / 任务详情 / 专家团卡片
   ============================================================ */
.job-form { display: flex; flex-direction: column; gap: 12px; }
.job-field { display: flex; flex-direction: column; gap: 6px; }
.job-field > span { font-size: var(--fs-caption); color: var(--text-tertiary); }
.job-input {
  width: 100%; box-sizing: border-box; padding: 11px 13px;
  border: 1px solid var(--border-strong); border-radius: var(--radius-md);
  background: #FFFFFF; color: var(--text-primary);
  font-size: 14px; font-family: inherit;
}
textarea.job-input { resize: vertical; line-height: 1.6; }
.job-input::placeholder { color: var(--text-placeholder); }
.job-input:focus { outline: none; border-color: var(--accent); box-shadow: 0 0 0 3px var(--accent-ring); }
.job-actions { display: flex; align-items: center; gap: 12px; flex-wrap: wrap; }
.job-hint { font-size: var(--fs-caption); color: var(--text-tertiary); }
.job-code-row { display: flex; gap: 10px; margin-top: 14px; }
.job-code-row .job-input { max-width: 260px; font-family: var(--font-mono); letter-spacing: 1px; text-transform: uppercase; }
.job-prog { margin-top: 10px; font-family: var(--font-mono); font-size: 12px; color: var(--accent); }

.job-card {
  border: 1px solid var(--border); border-radius: var(--radius-md);
  background: var(--card); box-shadow: var(--sh-1); padding: 13px 16px; cursor: pointer;
  transition: .14s;
}
.job-card + .job-card { margin-top: 8px; }
.job-card:hover { border-color: var(--h-line); box-shadow: var(--sh-2); }
.job-card.is-on { border-color: var(--accent); background: var(--accent-tint-weak); box-shadow: 0 0 0 3px var(--accent-ring); }
.job-card-h { display: flex; align-items: baseline; gap: 12px; flex-wrap: wrap; }
.job-card-t { font-size: 15px; font-weight: 600; }
.job-card-code { font-family: var(--font-mono); font-size: 12px; color: var(--accent); letter-spacing: 1px; }
.job-card-at { font-family: var(--font-mono); font-size: 12px; color: var(--text-tertiary); margin-left: auto; }
.job-card-m { display: flex; align-items: center; gap: 14px; flex-wrap: wrap; margin-top: 7px; font-size: var(--fs-caption); color: var(--text-secondary); }
.job-card-m .ok { color: var(--ok); font-weight: 500; }
.job-card-m .muted, .muted { color: var(--text-tertiary); }
.bad, .job-card-m .bad { color: var(--warn); }

.job-mats-head { margin-top: 16px; font-size: var(--fs-caption); color: var(--text-tertiary); }
.job-mats { display: flex; flex-wrap: wrap; gap: 8px; margin-top: 10px; }
.job-mat {
  display: inline-flex; align-items: center; gap: 8px; max-width: 100%;
  padding: 7px 11px; border: 1px solid var(--border); border-radius: var(--radius-sm);
  background: var(--bg-subtle); font-size: 13px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}
.job-mat i { font-family: var(--font-mono); font-style: normal; font-size: 11.5px; color: var(--text-tertiary); }
.job-mat.is-bad { border-color: var(--c7-line); background: var(--c7-soft); color: var(--danger); }

.job-result { margin-top: 18px; }
/* 汇总建议：整块唯一一处 tint 底，配左缘一条同色竖条 ——「这是结论」的形 */
.job-reco {
  border: 1px solid var(--c1-line); border-left: 3px solid var(--h);
  border-radius: var(--radius-md);
  background: linear-gradient(180deg, var(--h-soft), var(--card));
  padding: 15px 18px; font-size: 14px; box-shadow: var(--sh-1);
}
.job-reco b { font-size: 15.5px; color: var(--text-primary); font-weight: var(--fw-title); }
.job-reco p { margin: 8px 0 0; font-size: 13.5px; color: var(--text-secondary); line-height: 1.7; }

.team-card {
  margin-top: 14px; border: 1px solid var(--border); border-radius: var(--radius-md);
  background: var(--card); box-shadow: var(--sh-1); padding: 16px 18px;
}
.team-h { display: flex; align-items: baseline; gap: 12px; flex-wrap: wrap; }
.team-name { font-size: 15.5px; font-weight: 600; }
.team-core { font-size: 13px; color: var(--text-secondary); }
.team-cplx {
  font-size: 12px; padding: 2px 10px; border-radius: 99px; font-weight: 500;
  border: 1px solid var(--h-line); color: var(--h); background: var(--h-soft);
}
.team-h .btn-link { margin-left: auto; }
.team-meta { margin-top: 6px; font-size: 13px; color: var(--text-tertiary); line-height: 1.7; }
.team-orch {
  margin-top: 12px; padding: 12px 14px; border-radius: var(--radius-sm);
  background: var(--bg-subtle); border: 1px solid var(--border);
  font-size: 13.5px; color: var(--text-secondary);
}
.team-orch b { display: block; color: var(--text-primary); font-weight: 600; margin-bottom: 6px; }
.team-orch p { margin: 0; line-height: 1.75; }
.team-orch.muted { color: var(--text-tertiary); }
.team-skills { margin-top: 12px; }
.team-skill { border-top: 1px solid var(--border); padding: 10px 0 2px; }
.team-skill summary { display: flex; align-items: baseline; gap: 10px; cursor: pointer; font-size: 14px; }
.team-skill summary b { font-weight: 600; }
.team-skill summary span { font-family: var(--font-mono); font-size: 12px; color: var(--accent); }
.team-skill summary i { font-style: normal; font-size: 12px; color: var(--text-tertiary); }
.team-skill ol { margin: 10px 0 0; padding-left: 22px; }
.team-skill ol li { font-size: 13.5px; color: var(--text-secondary); line-height: 1.75; margin-bottom: 5px; }

/* ==================== 附件预览弹层 ====================
   预览在弹层里就地渲染（File Viewer），所以弹层只负责「一张能装文档的框」。
   整站已是浅色，弹层与文档渲染同色，不再需要特例。 */
.pv-mask {
  position: fixed; inset: 0; z-index: 200;
  display: flex; align-items: center; justify-content: center;
  padding: 28px; background: rgba(16, 24, 40, .42);
  -webkit-backdrop-filter: blur(4px); backdrop-filter: blur(4px);
}
.pv-card {
  display: flex; flex-direction: column;
  width: 100%; max-width: 1180px; height: 88vh;
  background: var(--card); border: 1px solid var(--border);
  border-radius: var(--radius-lg); overflow: hidden;
  box-shadow: var(--sh-3);
}
.pv-bar {
  display: flex; align-items: center; gap: 12px; flex: none;
  padding: 10px 14px; border-bottom: 1px solid var(--border); background: var(--bg-subtle);
}
.pv-name { flex: 1; min-width: 0; font-size: 14px; font-weight: 500; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.pv-act {
  flex: none; font: inherit; font-size: 13px; line-height: 1;
  padding: 7px 14px; border-radius: var(--radius-sm);
  border: 1px solid var(--border-strong); background: #FFFFFF;
  color: var(--text-secondary); text-decoration: none; cursor: pointer;
}
.pv-act:hover { border-color: var(--accent); color: var(--accent); }
/* 字节取不到时「下载」是死链，置灰并说明，别让人点了下到一段 JSON */
.pv-act.is-off { color: var(--text-tertiary); border-color: var(--border); cursor: default; }
.pv-act.is-off:hover { border-color: var(--border); color: var(--text-tertiary); }
.pv-stage { position: relative; flex: 1; min-height: 0; background: #FFFFFF; }
.pv-host { height: 100%; }
.pv-said {
  position: absolute; inset: 0; display: flex; align-items: center; justify-content: center;
  font-size: 13px; color: var(--text-tertiary); background: #FFFFFF;
}
.pv-fail { padding: 32px 28px; color: var(--danger); font-size: 13.5px; line-height: 1.9; }
.pv-fail p { margin: 0 0 6px; }
.pv-fail-hint { color: var(--text-tertiary); font-size: 12.5px; }
@media (max-width: 800px) {
  .pv-mask { padding: 10px; }
  .pv-card { height: 94vh; }
}
