/* ============================================================================
 * 创归思伴学 · 三站工作台外壳（station-shell.css）
 * ------------------------------------------------------------
 * 与错题本同一套三栏骨架与主题令牌：左 AI 协作面板（AiSidePanel 渲染）/
 * 中主业务区（顶部横排五环节导航）/ 右看板栏（只读）。
 *
 * 约束：① 顶部通栏 56px；② 三栏各自独立滚动，禁止整页滚动；
 *      ③ 双主题只换 CSS 变量，DOM 不变；④ 响应式三档降级。
 * ============================================================================ */

/* ---------- 主题令牌（与错题本 / AiSidePanel 共用命名，保证组件零改动） ---------- */
:root{
  --color-primary:#7F4AE0;
  --color-primary-soft:rgba(127,74,224,.12);
  --color-bg-page:#F7F9FC;
  --color-bg-card:#FFFFFF;
  --color-surface-2:#F1F3F9;
  --color-text-main:#2D3748;
  --color-text-sub:#718096;
  --color-success:#28a77c;
  --color-warning:#e69c4f;
  --color-disable:#909399;
  --color-line:#E6E9F2;
  --shell-ink-3:#8A90A2;
  --shell-radius:14px;
  --shell-shadow:0 2px 10px rgba(24,18,60,.06);

  /* —— AiSidePanel 兼容别名（2026-09-19）：组件只认错题本页面的旧令牌名
     （--card/--ink/--accent/--shell-line 等），本页此前未定义 → 组件落到
     浅色字面量兜底，暗色下左栏不变色。这里把旧名映射到本页 --color-* 令牌，
     经 var() 间接引用，html[data-theme=dark] 切换时自动跟随。组件零改动。 —— */
  --card:var(--color-bg-card);
  --shell-surface:var(--color-bg-card);
  --shell-surface-2:var(--color-surface-2);
  --ink:var(--color-text-main);
  --muted:var(--color-text-sub);
  --line:var(--color-line);
  --shell-line:var(--color-line);
  --accent:var(--color-primary);
  --ok:var(--color-success);
  --shell-brand:linear-gradient(135deg,#6D5EFC,#28C2C8);
  --shell-shadow-1:var(--shell-shadow);
}
html[data-theme="dark"]{
  --color-primary:#7F4AE0;
  --color-primary-soft:rgba(127,74,224,.22);
  --color-bg-page:#1F1D2E;
  --color-bg-card:#2A283C;
  --color-surface-2:#332F49;
  --color-text-main:#F5F3FF;
  --color-text-sub:#B8B2D8;
  --color-success:#7CD9A8;
  --color-warning:#FFB572;
  --color-disable:#6B6885;
  --color-line:#3A3652;
  --shell-ink-3:#8B85AD;
  --shell-shadow:0 2px 12px rgba(0,0,0,.28);
}

*{box-sizing:border-box}
html,body{height:100%}
body{
  margin:0;background:var(--color-bg-page);color:var(--color-text-main);
  font-family:-apple-system,BlinkMacSystemFont,"PingFang SC","Microsoft YaHei",sans-serif;
  overflow:hidden;                      /* 禁止整页滚动：各栏独立滚 */
}

/* ---------- 顶部通栏 56px ---------- */
.st-top{
  height:56px;display:grid;grid-template-columns:1fr auto 1fr;align-items:center;gap:12px;padding:0 16px;
  background:var(--color-bg-card);border-bottom:1px solid var(--color-line);
  position:relative;z-index:20}
.st-brand{display:flex;align-items:center;justify-self:end;gap:9px;font-weight:900;font-size:15px;letter-spacing:.2px}
/* [批38] 品牌位 logo：原「归」字渐变方块 → 项目实际公仔（小伴 v5）。
   底改浅紫 #F0EBFF（与坞内 .st-dock-av 同源）：公仔是浅紫毛球、边缘带半透明发丝，
   压深彩渐变底上会被吃掉显脏；同色系浅底才干净。暗色对应 #332F49。 */
.st-logo{
  width:36px;height:36px;border-radius:12px;display:grid;place-items:center;flex:0 0 auto;
  background:#F0EBFF;box-shadow:0 2px 8px rgba(109,94,252,.20)}
/* 88%：公仔原图带透明边距（内容仅占 79% 宽），再小就只剩 24px、细节发虚；再大则发丝顶到块边 */
.st-logo img{display:block;width:88%;height:88%;object-fit:contain}
html[data-theme="dark"] .st-logo{background:#332F49;box-shadow:0 2px 8px rgba(0,0,0,.38)}
.st-brand-sub{color:var(--color-text-sub);font-weight:600;font-size:12.5px}

/* 三站 Tab：统一品牌紫选中态，禁止彩虹色 */
/* [批39 2026-09-23] PM 定稿：品牌右移、紧贴三站 Tab，两者成「左侧一簇」；Tab 仍严格居中页面轴。
   实现由「flex + Tab 绝对定位 left:50%/translateX(-50%)」改为「grid 1fr auto 1fr」：
   ① 顶栏三列（品牌 / Tab / 学科+主题），Tab 落 auto 列、左右各一个 1fr ⇒ 两 1fr 等宽时
      Tab 中心恒 = 页面中心；不必再写 left:50% + translateX，也不受站名文字长度影响；
   ② 品牌列 justify-self:end ⇒ 品牌右沿恒落在 Tab 左沿左侧 12px（即栅格 gap），
      无需给品牌写死宽度，也不出现 calc(50% - Npx) 这类随站名漂移的魔法数；
   ③ 600px 以上同样成立（1fr 被压窄时品牌先到 min-content），Tab 仍居中、不与学科选择器重叠
      ⇒ 原「≤1120px 退回贴品牌」的 media query 已无必要，删除。 */
.st-tabs{display:flex;gap:4px;align-items:center}
.st-tab{
  appearance:none;border:0;background:transparent;cursor:pointer;
  padding:9px 13px 10px;font-size:13.5px;font-weight:700;color:var(--color-text-sub);
  border-bottom:3px solid transparent;border-radius:8px 8px 0 0;transition:.16s}
.st-tab:hover{color:var(--color-text-main);background:var(--color-surface-2)}
.st-tab.on{color:var(--color-primary);border-bottom-color:var(--color-primary);background:var(--color-primary-soft)}

.st-top-r{justify-self:end;display:flex;align-items:center;gap:10px}
.st-subj{
  appearance:none;border:1px solid var(--color-line);background:var(--color-bg-card);
  color:var(--color-text-main);border-radius:9px;padding:6px 10px;font-size:12.5px;font-weight:700;cursor:pointer}
.st-theme{
  appearance:none;border:1px solid var(--color-line);background:var(--color-bg-card);
  color:var(--color-text-main);border-radius:9px;width:32px;height:30px;cursor:pointer;font-size:14px}

/* ---------- 学习流骨架（R20）----------
   参照 错题本 / 思维健身房 / 学习页：内容带 + **底部固定小伴坞**（+ 可选右进度栏）。
   grid 区域：main = 内容带 / rail = 右进度栏 / dock = 底部坞（跨两列）。
   ❗已移除「左 AI 290px 栏」（原 .st-ai / .st-ai-mount / .is-collapsed）——
     保留 .is-collapsed 只会让后来者误以为还有可折叠的左栏。 */
.st-body{
  height:calc(100vh - 56px);display:grid;
  /* [批37] 右栏不再吃中栏宽度：中栏跨满整宽、右栏落进「右侧留白」
     ⇒ 880 的对话列落在**页面正中央**，与 思维健身房 #/screen 同一条视觉轴
     （实测改前对话列中心 546 / 页面中心 720 ⇒ 偏左 174px，正是 PM 说的「没居中」）。 */
  --st-main-max:860px;                                  /* [2026-09-26] 对齐错题本 .eb-mid：860+312 整块，不是几何居中 */
  --st-rail:312px;                                       /* [2026-09-26] 固定右栏，紧挨主对话区；整体居中，不再贴浏览器最右 */
  /* [批37] 本页已不再加载 ai-side-panel.js ⇒ .ai-side-panel 上的 --asp-* 令牌不会注入本页，
     而坞内输入行 / 气泡 / 主推动作仍在用 var(--asp-*) ⇒ 全部解析失败（实测 AI 气泡底色 = 透明）。
     这里按 ai-side-panel.css 的规格真源在本页补一套同名令牌，本页自此不依赖那个组件。 */
  --asp-surface:#FFFFFF;--asp-surface-2:#F0EBFF;--asp-ink:#221838;--asp-muted:#6B6382;
  --asp-line:#E7DEFB;--asp-brand-solid:#7F4AE0;--asp-on-brand:#ffffff;--asp-brand-ink:#7F4AE0;
  grid-template-columns:minmax(0,var(--st-main-max)) var(--st-rail);
  grid-template-rows:minmax(0,1fr);
  grid-template-areas:"main rail";                        /* [2026-10-08] dock 已 fixed 底部通栏，不再占 grid 行 */
  justify-content:center;                                 /* [2026-09-26] 主区+右栏整体在视口居中 */
  padding:0 24px 120px;                                   /* [2026-10-08] 底部给 fixed dock 留出 120px 空间 */
  transition:grid-template-columns .18s ease}
html[data-theme="dark"] .st-body{
  --asp-surface:#2A2540;--asp-surface-2:#2D2748;--asp-ink:#ECE9F6;--asp-muted:#9A93B5;
  --asp-line:#3A3164;--asp-brand-solid:#7A55E8;--asp-on-brand:#ffffff;--asp-brand-ink:#B79BFF}
/* [批37] 取景台打开时，中栏跨满是错的 —— 会把它右沿 280px 塞到右栏底下（iframe 被压住）。
   此时退回两栏：右栏之外全归取景台（实测改前 iframe 右沿 1440 > 右栏左沿 1160）。 */
.st-body:has(.st-main.is-ka){grid-template-areas:"main rail"}
/* [2026-09-26] 对齐错题本（真源 web/error-book/chat.html 的 .eb-mid）：
   两个屏不做几何居中，而是让「主对话区 860 + 右栏 312」这整块整体左移 ——
   宽屏（>=1280）时 padding-left 由 24px 提到 336px，右侧只留 24px。
   实测错题本 1920 下：主栏 x=530 w=860、右栏 x=1390 right=1702（右边距 218）、左留白 530。
   效果即 PM 第一轮三条要求：右栏紧贴对话框（间距 0）、不贴浏览器最右、整体看着居中舒适。
   ⚠ 本块必须排在 @media (max-width:1359px) 之前 —— 媒体查询不提升特异性，同特异性下靠后者胜。
   ⚠ 单位不可省：写成 (min-width:1280) 会被浏览器静默忽略（上一版就栽在这）。 */
@media (min-width:1280px){
  .st-body{padding-left:336px}
}

/* 断点取 1360 而不是 1400：1366 笔记本的右侧留白 243px 仍放得下右栏内容，让它也居中；
   只有 <1360（留白 <240）才退回两栏（右栏 348 常驻、对话列在中栏内居中）。 */
@media (max-width:1359px){
  .st-body{grid-template-areas:"main rail"}
  .st-side{grid-area:rail}
  /* [2026-10-08] dock 已 fixed 底部通栏，这里不再需要对齐 dock 内容轴。 */
}
.st-body.is-narrow{grid-template-columns:minmax(0,1fr)}   /* <1200：隐藏右进度栏 */
.st-body.is-narrow .st-side{display:none}

/* 中：内容带（唯一滚动区交给 .st-band，见下） */
.st-main{grid-area:main;display:flex;flex-direction:column;min-width:0;overflow:hidden}

/* [批37] 顶部五环节横排条 .st-steps 已按 PM 意见删除（规则一并撤掉，避免留死代码）。
   下方 .st-step* 保留：<1200 的迷你流程条 .st-mini-steps 复用同一套芯片样式。 */
.st-step{
  flex:1 1 0;min-width:0;text-align:left;appearance:none;cursor:pointer;
  border:1px solid var(--color-line);background:var(--color-bg-card);border-radius:11px;
  padding:8px 10px;display:flex;flex-direction:column;gap:2px;transition:.16s}
.st-step:hover{border-color:var(--color-primary);transform:translateY(-1px)}
.st-step .sn{font-size:10.5px;font-weight:800;color:var(--color-disable);display:flex;align-items:center;gap:5px}
.st-step .st{font-size:13px;font-weight:900;color:var(--color-text-sub);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.st-step .sd{font-size:11px;color:var(--color-text-sub);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.st-step.done{border-color:var(--color-success);background:color-mix(in srgb,var(--color-success) 10%,transparent)}
.st-step.done .sn,.st-step.done .st{color:var(--color-success)}
.st-step.cur{border-color:var(--color-primary);background:var(--color-primary-soft);box-shadow:0 0 0 2px var(--color-primary-soft)}
.st-step.cur .sn,.st-step.cur .st{color:var(--color-primary)}

/* ===================== [中改 2026-09-23] 对话主轴 + 引导条 + 意图入口 =====================
   形态对齐 错题本 chat.html：对话是阅读主线，坞只负责「说话」。
   ⚠️ 引导条刻意**不做 sticky**：底色是半透明渐变，滚动时下层气泡会从它背后透出来
      （实测截图上就是横在引导卡下面的一道紫条）。「我在第几环」改由右栏五环节轨道 + 本引导条给出
      —— 顶部那条横排五环节条已按 PM 意见删除。 */
/* [中改] 右栏窄，5 列学情指标会压成逐字竖排 —— 收成 2 列 */
.st-side .st-stats{grid-template-columns:repeat(2,minmax(0,1fr));gap:8px}
/* [批37] 指标子行「学情中枢 · 掌握度 · 全科」在 280 右栏里会折在「全科」中间：
   只允许在「 · 」这些空格处换行（keep-all），不再从词中间劈开。 */
.st-side .st-stats .st-stat .s{word-break:keep-all}
.st-side .st-stats .st-stat .l{white-space:normal;font-size:10.5px;line-height:1.4;letter-spacing:-.1px}
.st-side .st-stats .st-stat{padding:10px 9px}   /* [批37] 右栏 280 后「掌握度已记录知识点」会折在词中间，收紧内边距与标签字号 */

.st-conv{flex:1 1 auto;min-height:0;overflow-y:auto;overflow-x:hidden}
.st-conv-in{max-width:860px;margin:0 auto;padding:14px 20px 26px;display:flex;flex-direction:column;gap:12px}
.st-guide{
  border:1px solid var(--color-line);border-left:4px solid var(--color-primary);
  background:linear-gradient(120deg,var(--color-primary-soft),transparent 70%);
  border-radius:12px;padding:10px 13px;flex:none}
.st-guide b{display:block;font-size:13.5px;font-weight:900;margin-bottom:3px}
.st-guide span{display:block;font-size:12.5px;line-height:1.7;color:var(--color-text-sub)}
.st-guide .st-guide-red{margin-top:6px;font-size:11.5px;color:var(--color-text-main);font-weight:700}
.st-guide + .stb{margin-top:2px}
/* [批37] 气泡口径**逐值对齐思维健身房**（.gym-canvas .bubble-xl）：AI #F0EBFF 浅紫底 / 用户 #7F4AE0
   实紫底压白字，圆角 16 + 内侧小角 4，字号 14 / 行高 1.65，宽上限 min(760px,88%)。 */
/* [R34] bubble appearance moved to .stbub-* inner layer */
.st-conv .stb{max-width:min(860px,92%);display:flex;gap:10px}
.st-conv .stb .st-inline-rflow{width:100%}
.st-conv .stb:has(.st-inline-rflow){max-width:100%;width:100%}
.st-inline-rflow iframe{min-height:420px}
/* [R47] 内嵌卡撑满对话泡：stbub-body 是 flex 项，max-content 会被 iframe 默认固有宽
   300px 拽窄（实测气泡 800px 里卡只有 ~310px，空文字 pill 也同宽）——显式撑满，不靠运气。 */
.st-conv .stb:has(.st-inline-rflow) .stbub-body{flex:1 1 auto;width:100%;min-width:0}
.st-conv .stb.ai{align-self:flex-start}
.st-conv .stb.me{align-self:flex-end;margin-left:auto}
html[data-theme="dark"] .st-conv .stb.ai{align-self:flex-start}
html[data-theme="dark"] .st-conv .stb.me{align-self:flex-end;margin-left:auto}
/* [R34] inner bubble parts: avatar + name + text (aligned with error-book/chat.html) */
.stbub-ava{width:30px;height:30px;flex:0 0 auto;border-radius:50%;background:#f5f2fc}
.stbub-body{display:flex;flex-direction:column;gap:8px;min-width:0;max-width:100%}
.stbub-name{font-size:11px;color:#6f6880}
.stbub-text{background:#ffffff;border:1px solid #e1d8f4;box-shadow:0 2px 10px rgba(109,94,252,.11),0 1px 2px rgba(109,94,252,.06);
  padding:10px 13px;border-radius:14px;border-top-left-radius:4px;font-size:14px;line-height:1.6;
  white-space:pre-wrap;word-break:break-word;overflow-wrap:anywhere;color:#221838}
.stb.me .stbub-text{background:#7F4AE0;color:#fff;border-color:#7F4AE0;box-shadow:0 2px 8px rgba(127,74,224,.25);
  border-radius:14px;border-top-left-radius:14px;border-top-right-radius:4px}
html[data-theme="dark"] .stbub-ava{background:#211c33}
html[data-theme="dark"] .stbub-name{color:#a79fc4}
html[data-theme="dark"] .stbub-text{background:#211c33;border-color:#352d52;color:#ECE8F7}
html[data-theme="dark"] .stb.me .stbub-text{background:#7A55E8;color:#fff;border-color:#7A55E8;box-shadow:0 2px 8px rgba(0,0,0,.4)}

/* ============ [批40 2026-09-23] 意图入口行：从顶栏下方迁进底坞（输入行上方） ============
   位置与观感同时对齐「思维健身房」#/screen 的底栏（.gym-quick / .asp-chip）：
   chips 行在上、输入行在下，两者同一条 880 轴、左对齐 ⇒ 三站底栏与学习流家族同构。
   ⚠️ 令牌来源（[批41] 更正旧注释）：本页**确实加载**了 ai-side-panel.css，但它的 --asp-*
      挂在该文件的 `.ai-side-panel` 类作用域上，而本页没有这个节点 ⇒ 令牌不会注入。
      所以由 `.st-body`（见上）与 `.st-dock` 各补一份同名令牌，两个容器都在其上 ⇒
      坞内与中栏的 asp 组件都能解析；chips 直接用 asp 令牌，与全站 .asp-chip 同一套观感。
   字号/内边距逐值对齐 ai-side-panel.css 的 .asp-chip（12px / 5px 12px / 999px）。 */
/* [批72 · B档] 入口行的容器样式已随渲染一起抽到 station-funcs.css（真源唯一）：
     .st-intents / .ichip 都在那里，本页与思伴聊屋共用。此处不再留副本。 */

/* 业务内容区：滚动交给外层 .st-band（**唯一滚动区**，避免双滚动条打架）；
   内容带自身居中限宽（1040 ≈ 错题本 834 与学习页 880 的量级），超宽屏上眼睛不用长途扫视。 */
.st-band{flex:1 1 auto;min-height:0;display:flex;flex-direction:column;overflow-y:auto;overflow-x:hidden}
/* [中改] band 从「中栏内容带」搬进右栏：滚动区仍在它身上，只是变窄了 */
.st-work{width:100%;padding:12px 13px 13px}   /* [中改] 已在 348 右栏内，不再需要 1040 限宽 */
.st-cards{display:flex;flex-direction:column;gap:10px;width:100%;padding:0 13px 14px}
.st-main.is-ka .st-conv{display:none}
/* [批40] 意图行已搬进底坞（不在 .st-main 内）⇒ 选择器改从 .st-body 侧命中；
   语义不变：知识开门采集面板打开时，收起这行跨页跳转入口（「去别处」标签已删）。 */
.st-body:has(.st-main.is-ka) .st-intents{display:none}
.st-slogan{
  background:linear-gradient(120deg,var(--color-primary-soft),transparent 70%);
  border:1px solid var(--color-line);border-left:4px solid var(--color-primary);
  border-radius:12px;padding:11px 14px;margin-bottom:12px}
.st-slogan b{display:block;font-size:14.5px;color:var(--color-text-main);letter-spacing:.2px}
.st-slogan span{font-size:12px;color:var(--color-text-sub)}

/* 学情数据卡片 */
.st-stats{display:grid;grid-template-columns:repeat(5,minmax(0,1fr));gap:10px;margin-bottom:12px}
.st-stat{background:var(--color-bg-card);border:1px solid var(--color-line);border-radius:12px;padding:11px 12px;box-shadow:var(--shell-shadow)}
.st-stat .v{font-size:20px;font-weight:900;line-height:1.1;color:var(--color-text-main)}
.st-stat.warn .v{color:var(--color-warning)}
.st-stat .l{font-size:11.5px;color:var(--color-text-sub);margin-top:3px;font-weight:700}
.st-stat .s{font-size:10.5px;color:var(--color-disable);margin-top:2px}

/* 通用卡片 + Top3 差异化模块 */
.st-card{background:var(--color-bg-card);border:1px solid var(--color-line);border-radius:12px;padding:13px 14px;margin-bottom:12px;box-shadow:var(--shell-shadow)}
.st-card h3{margin:0 0 4px;font-size:14px;font-weight:900;display:flex;align-items:center;gap:8px;flex-wrap:wrap}
.st-card .th{font-size:12px;color:var(--color-text-sub);margin-bottom:10px}
.st-top-item{
  display:flex;align-items:center;gap:10px;padding:9px 11px;border:1px solid var(--color-line);
  border-radius:10px;margin-bottom:8px;background:var(--color-surface-2)}
.st-top-item .n{flex:1 1 auto;min-width:0;font-size:13px;font-weight:700;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.st-top-item .tag{font-size:11px;font-weight:800;color:var(--color-warning);background:color-mix(in srgb,var(--color-warning) 16%,transparent);padding:3px 8px;border-radius:99px;white-space:nowrap}

/* 环节业务卡 */
.st-step-card .ch{font-size:14.5px;font-weight:900;margin-bottom:6px}
.st-step-card .cb{font-size:13px;line-height:1.75;color:var(--color-text-sub)}
.st-step-card .cb b{color:var(--color-text-main)}
.st-fam{margin-top:9px;padding:9px 11px;border-radius:10px;background:var(--color-primary-soft);
  border-left:3px solid var(--color-primary);font-size:12.5px;color:var(--color-text-main);line-height:1.7}

/* [批72 · B档] .st-funcs / .fchip / .st-entries / .st-entry 已抽到 station-funcs.css
     （渲染与样式成对共用；本页只留本页专属的 dark 覆盖，见 <head>）。 */

/* 底部行动条 */
.st-actions{display:flex;align-items:center;gap:9px;margin-top:14px;flex-wrap:wrap}
.st-btn{
  appearance:none;border:0;cursor:pointer;background:var(--color-primary);color:#fff;
  font-size:13px;font-weight:800;border-radius:11px;padding:10px 18px;transition:.16s}
.st-btn:hover{filter:brightness(1.08)}
.st-btn.ghost{background:var(--color-bg-card);color:var(--color-text-sub);border:1px solid var(--color-line)}
/* [stuck 环思路采集 T0] 落账之后那句「说清你的思路」——**永远可忽略**，不给任何催促感。
   · 卡片化、留白大、边框弱：它是收尾的一句附录，不是第二道关卡。
   · 文案里出现「可选」「直接收工也行」是刻意的：R1 不施压要能被看见。 */
.st-thought{margin-top:16px;padding:14px 16px;border:1px solid var(--color-line);border-radius:12px;
  background:var(--color-bg-card)}
.st-thought .th-t{font-size:13.5px;font-weight:700;color:var(--color-text)}
.st-thought .th-h{margin-top:5px;font-size:12.5px;line-height:1.6;color:var(--color-text-sub)}
.st-thought .th-in{
  width:100%;margin-top:10px;padding:10px 12px;
  font:inherit;font-size:13px;line-height:1.6;
  color:var(--color-text);background:var(--color-bg);
  border:1px solid var(--color-line);border-radius:10px;resize:vertical}
.st-thought .th-in:focus{outline:none;border-color:currentColor;opacity:.55}
.st-thought .th-acts{margin-top:10px;display:flex;align-items:center;gap:9px;flex-wrap:wrap}

/* 诚实降级提示（学情接口异常时如实呈现，绝不谎报成功） */
.st-honest{
  display:none;margin-top:10px;border-radius:11px;padding:10px 12px;font-size:12.5px;line-height:1.7;
  background:color-mix(in srgb,var(--color-warning) 14%,transparent);
  border:1px solid var(--color-warning);color:var(--color-text-main)}
.st-honest.on{display:block}

/* 交棒卡（第⑤环：只推荐、不自动跳转） */
.st-handoff{margin-top:12px;border-radius:12px;padding:13px 14px;border:1px solid var(--color-primary);
  background:var(--color-primary-soft)}
.st-handoff .hh{font-size:14px;font-weight:900;color:var(--color-primary);margin-bottom:5px}
.st-handoff .hp{font-size:12.5px;color:var(--color-text-sub);line-height:1.7}
.st-handoff .hb{margin-top:10px;display:flex;gap:8px;flex-wrap:wrap}
.st-handoff .note{font-size:11.5px;color:var(--color-disable);margin-top:8px}

/* 右：看板栏（只读） */
/* [中改] 右栏外壳：上半 = 五环节轨道，下半 = 工作区（原内容带） */
.st-side{
  grid-area:1 / 2 / 2 / 3;   /* [批37] 落在第 2 列（=右侧留白），不占中栏宽度 */
  border-left:1px solid var(--color-line);background:var(--color-bg-card);
  display:flex;flex-direction:column;min-height:0;overflow:hidden}
.st-kanban{padding:13px;overflow-y:auto;flex:none}   /* [R24] 右栏只剩看板，不再限 46% 高 */
.st-kanban:empty{display:none}
.st-kanban h4{margin:0 0 9px;font-size:13px;font-weight:900}
.st-kb-row{display:flex;justify-content:space-between;align-items:baseline;padding:7px 0;border-bottom:1px dashed var(--color-line);font-size:12.5px}
.st-kb-row .k{color:var(--color-text-sub)}
.st-kb-row .v{font-weight:900;font-size:15px;color:var(--color-primary)}
.st-kb-rank{margin-top:10px}
.st-kb-rank .ri{padding:8px 0;border-bottom:1px dashed var(--color-line)}
.st-kb-rank .rn{font-size:12.5px;font-weight:800}
.st-kb-rank .rv{font-size:11.5px;color:var(--color-text-sub);margin-top:2px}
.st-kb-fold{margin-top:11px}
.st-kb-fold summary{font-size:11.5px;color:var(--color-text-sub);cursor:pointer;font-weight:700}
.st-kb-fold p{font-size:11.5px;line-height:1.7;color:var(--color-text-sub);margin:7px 0 0}

/* 移动端流程条（<1200 时看板隐藏、流程状态迁到主区顶部） */
.st-mini-steps{display:none;gap:6px;padding:9px max(14px, calc((100% - 1040px) / 2));background:var(--color-surface-2);border-bottom:1px solid var(--color-line);flex:none}
.st-body.is-narrow .st-mini-steps{display:flex}

/* ============ [2026-09-19] 中栏内联采集面板：知识开门 · 原地放大 ============
   需求：不跳页、原地放大、宽度不足则把右看板完全收起。
   实现：面板作为 .st-main 的第二个 flex 子项占满剩余高度；打开时隐藏流程卡区
        （避免双滚动条抢戏），流程导航条保留在上方，学生始终知道自己在第几环。 */
.st-ka{flex:1 1 auto;min-height:0;display:flex;flex-direction:column;
  background:var(--color-bg-card);border-top:1px solid var(--color-line);
  transform-origin:top center;animation:st-ka-grow .18s ease both}
.st-ka[hidden]{display:none}
@keyframes st-ka-grow{from{opacity:.4;transform:scaleY(.96)}to{opacity:1;transform:none}}
@media (prefers-reduced-motion:reduce){ .st-ka{animation:none} }
.st-ka .ka-hd{display:flex;align-items:center;gap:9px;padding:9px 14px;flex:none;flex-wrap:wrap;
  border-bottom:1px solid var(--color-line)}
.st-ka .ka-dot{width:8px;height:8px;border-radius:50%;flex:none;
  background:var(--color-success);box-shadow:0 0 0 4px color-mix(in srgb,var(--color-success) 22%,transparent)}
.st-ka .ka-hd b{font-size:13.5px;font-weight:900}
.st-ka .ka-sub{font-size:11.5px;color:var(--color-text-sub)}
.st-ka .ka-warn{font-size:11px;font-weight:800;color:var(--color-warning);
  background:color-mix(in srgb,var(--color-warning) 16%,transparent);border-radius:99px;padding:3px 9px}
.st-ka .ka-x{margin-left:auto;appearance:none;cursor:pointer;font-family:inherit;
  border:1px solid var(--color-line);background:var(--color-bg-card);color:var(--color-text-sub);
  font-size:12px;font-weight:800;border-radius:9px;padding:6px 12px;transition:.16s}
.st-ka .ka-x:hover{border-color:var(--color-primary);color:var(--color-primary)}
.st-ka .ka-bd{flex:1 1 auto;min-height:0;padding:10px;background:var(--color-surface-2)}
.st-ka iframe{display:block;width:100%;height:100%;border:0;border-radius:12px;background:#fff}

/* 打开采集面板：流程卡区让位给取景台（左栏 AI 对话区与五环节导航都保留） */
/* [中改] .st-work 已搬到右栏，不再需要随 is-ka 隐藏 */

/* 宽度不足：右看板**完全收起**（260px → 0），不做变窄、不留残影；
   看板作为辅助信息让位于采集主任务，收起时在面板头部如实说明。 */
.st-body.is-ka-tight{grid-template-columns:minmax(0,1fr) 0}
.st-body.is-ka-tight .st-side{display:none}

/* 「本次采集」条：知识开门扫完回来后的真实凭据（有就显示，没有就不显示、不编） */
.st-kashot{display:flex;align-items:center;gap:11px;margin-bottom:12px;padding:10px 12px;
  background:var(--color-bg-card);border:1px solid var(--color-primary);border-radius:12px;
  box-shadow:var(--shell-shadow)}
.st-kashot img{width:76px;height:57px;object-fit:cover;border-radius:9px;flex:none;
  border:1px solid var(--color-line);background:#fff}
.st-kashot .kt{flex:1 1 auto;min-width:0;display:flex;flex-direction:column;gap:2px}
.st-kashot .kt b{font-size:12.5px;font-weight:900}
.st-kashot .kt span{font-size:11.5px;color:var(--color-text-sub);line-height:1.6}

/* 原地动作入口（<button> 复用 .st-entry 视觉）+ 旁边的小字说明 */
button.st-entry{appearance:none;border:0;cursor:pointer;font-family:inherit}
.st-entry-note{font-size:11px;color:var(--color-disable);align-self:center}

/* [R23] 错题选择内联卡片：定位环点「就先修这个」后展开的具体题目 */
.st-err-pick{display:flex;flex-direction:column;gap:8px;margin-top:10px}
.st-err-item{display:flex;align-items:center;justify-content:space-between;width:100%;
  padding:10px 12px;border-radius:12px;border:1px solid var(--color-line);
  background:var(--color-bg-card);color:var(--color-text-main);font-size:14px;text-align:left;
  transition:background .15s,border-color .15s}
.st-err-item:hover{border-color:var(--color-primary);background:var(--color-primary-soft)}
.st-err-stem{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.st-err-act{flex:none;margin-left:12px;color:var(--color-primary);font-weight:600}

/* [R24] 工作卡住进对话流：铺满对话流宽度；功能卡同样住对话流尾部 */
.st-conv .st-work{padding:0;width:100%;max-width:100%}
.st-cards{display:flex;flex-direction:column;gap:10px}

/* ---------- 响应式 ---------- */
/* 注：[2026-09-19] 1200~1400 的「左栏自动收起」改由 JS 同步落 is-collapsed 类驱动
   （见 station-shell.js syncResponsive），不再用 media query 硬压列宽 ——
   原因是 media query 压窄了列、AiSidePanel 组件却仍按展开态渲染，文字会被 64px 裁切溢出。
   现在列宽只有一个真源：.is-collapsed / .is-narrow 类。 */
/* [批41] 右栏在此隐藏、中栏回到全宽 ⇒ 撤销上面的让位（否则坞内容会被推得偏左 348px）。
   必须写在本块（源码顺序在 1359 块之后、同特异性）才能覆盖。 */
@media (max-width:1200px){ .st-body{grid-template-columns:minmax(0,1fr);padding:0 0 120px} .st-side{display:none} .st-mini-steps{display:flex} }
@media (max-width:900px){
  .st-stats{grid-template-columns:repeat(2,minmax(0,1fr))}
  .st-body{grid-template-columns:minmax(0,1fr)}
  .st-dock-t span{display:none}   /* 窄屏：只留坞头角色行（如「小伴 · 同桌」），隐藏这句提示，不挤输入行 */
}
/* ============================================================================
 * [2026-09-22 · R17 三站学习流] 新增样式
 * ----------------------------------------------------------------------------
 * ① 右屏五环节学习流轨道：复用公共组件 web/common/flow-rail/flow-rail.js。
 *    该组件自带 .ebflow-rail 系列 CSS，但它假定宿主页已有 .ebstep 基样式
 *    （错题本 index.html:88 自带 `border:1px solid var(--line);background:#fff`），
 *    本页没有 ⇒ 在这里补齐**同名基样式**，不改公共组件（跨页复用不破）。
 * ② 对话流内功能卡片 .st-flowcard（T6）：令牌与左栏 .asp-* 同源，双主题自适应。
 * ③ 诚实态：未接通显示「—」的弱化数字 / 空态说明 / 已接通绿条。
 * ========================================================================== */

/* 组件依赖的品牌令牌：本页原本没有 ⇒ 补上后 已完成(实色) / 进行中(虚线动画) / hover 才会上色。
   --k-ink 刻意写成 var 引用，暗色主题切 --color-text-main 时自动跟随（否则深底深字看不清）。 */
:root{
  --eb-brand:var(--color-primary);
  --eb-brand-d:#5A4BE0;
  --eb-brand-l:var(--color-primary-soft);
  --k-ink:var(--color-text-main);
}

.ebflow-rail{background:var(--color-bg-card);border:1px solid var(--color-line);border-radius:14px;
  margin:0 0 12px}
.ebflow-rail .ebflow-top b{font-size:13px;font-weight:900;color:var(--color-text-main)}
.ebflow-rail .ebflow-prog{font-size:11px;font-weight:800;color:var(--color-primary);
  background:var(--color-primary-soft);padding:2px 9px;border-radius:20px}
.ebflow-rail .ebstep{
  border:1px solid var(--color-line);border-radius:12px;background:var(--color-bg-card);
  color:var(--color-text-main);font-family:inherit;font-size:13px;text-align:left;appearance:none}
.ebflow-rail .ebstep em{font-size:12.5px}
.ebflow-rail .ebstep small{font-size:10.5px;line-height:1.3}
.ebflow-rail .ebstep-no{font-size:12px}
.ebflow-rail .ebstep.is-push em::after{font-size:9.5px;line-height:15px}
.st-kb-note{font-size:11px;color:var(--color-disable);line-height:1.7;margin-top:10px}
.st-kb-rank-t{font-size:11.5px;font-weight:900;color:var(--color-text-sub);margin-bottom:4px}

/* 未接通：「—」弱化成灰，与真实数字一眼可分（不谎报学情） */
.st-stat .v.none,.st-kb-row .v.none{color:var(--color-disable)}
.st-focus-none{font-size:12px;line-height:1.75;color:var(--color-text-sub);
  background:var(--color-surface-2);border:1px dashed var(--color-line);border-radius:10px;padding:9px 11px}
.st-marknote{font-size:12px;font-weight:800;color:var(--color-success);margin-top:8px}

/* [R21] 定位环：已标的项高亮 + "自己写一个点"的兜底落点 + 置灰原因提示 */
.st-top-item.is-on{border-color:var(--color-primary);background:var(--color-primary-soft)}
.st-top-item.is-on .n{color:var(--color-primary)}
.st-locate-self{margin-top:10px;padding:10px 11px;border:1px dashed var(--color-line);
  border-radius:12px;background:var(--color-surface-2)}
.st-locate-self .sh{font-size:12px;font-weight:800;color:var(--color-text-main);margin-bottom:7px}
.st-locate-self .sr{display:flex;gap:8px;align-items:center;flex-wrap:wrap}
.st-locate-self .si{flex:1 1 200px;min-width:0;font-family:inherit;font-size:13px;color:var(--color-text-main);
  background:var(--color-bg-card);border:1px solid var(--color-line);border-radius:10px;padding:9px 11px}
.st-locate-self .si:focus{outline:0;border-color:var(--color-primary);box-shadow:0 0 0 3px var(--color-primary-soft)}
.st-gate-tip{font-size:11.5px;line-height:1.7;color:var(--color-disable);margin-top:7px}
.st-card.is-flash{border-color:var(--color-primary);box-shadow:0 0 0 3px var(--color-primary-soft)}

/* 可点的功能 pill（T6）：其余 fchip 仍是不可点的能力标签 —— 视觉必须一眼可分 */
.fchip.is-open{appearance:none;font-family:inherit;cursor:pointer;color:var(--color-primary);
  background:var(--color-primary-soft);border-color:var(--color-primary)}
.fchip.is-open .fchip-go{font-size:10px;font-weight:800;opacity:.75}
.fchip.is-open:hover{filter:brightness(1.05)}

/* <a> 复用 .st-btn 视觉（卡片动作是真链接，不是按钮） */
a.st-btn{display:inline-flex;align-items:center;justify-content:center;gap:4px;text-decoration:none}

/* 诚实提示 · 已接通态（绿）—— 与「未接通」（警示色）明确区分 */
.st-honest.is-ok{background:color-mix(in srgb,var(--color-success) 12%,transparent);
  border-color:var(--color-success)}
.st-honest .hb{margin-top:9px}

/* [批72 · B档] .st-flowcard 系列已抽到 station-funcs.css。 */


/* ============================================================================
 * [R20 2026-09-22] 底部「小伴坞」—— 学习流家族的招牌（本页此前缺的就是它）
 * ----------------------------------------------------------------------------
 * 三处同源先例：错题本 #ebDock / 思维健身房 .gym-composer / 学习页 #calibDock。
 * 共同形态 = 内容带 + **底部固定坞**（坞内：小伴的话 + 快捷引导 + 输入行）。
 *
 * 实现纪律：
 *   ① **复用 ai-side-panel.css 的 .asp-* 类名**（输入行 / chips / 发送），不另造皮肤 ⇒ 与全站观感同源；
 *      但令牌 --asp-* 的真源是 .ai-side-panel 选择器，坞不在其内 ⇒ 这里必须自带一份（浅色 + 暗色）。
 *   ② 对话按 state.log **全量重建**（见 station-shell.js renderDockLog）⇒ 从构造上保证
 *      「全页只有一个动作条」，不再依赖组件 setActions 的"只清最新气泡"语义。
 * ========================================================================== */
.st-dock{
  position:fixed;left:0;bottom:0;width:100%;z-index:30;
  background:var(--color-bg-card);border-top:1px solid var(--color-line);
  box-shadow:0 -8px 22px -18px rgba(34,24,56,.35);
  /* —— 坞内 .asp-* 令牌（真源见 ai-side-panel.css:22 .ai-side-panel）—— */
  --asp-bg:#FFFFFF;--asp-surface:#FFFFFF;--asp-surface-2:#F0EBFF;
  /* [批41] --asp-line/--asp-track 由 #E7DEFB 修为 #EAE4F6：逐值对齐参照物 ——
     desktop.css:4649 的 .gym-composer 块（思维健身房底栏）即取 #EAE4F6。
     该令牌决定坞内输入框/胶囊的静态描边（.asp-input{border:1px solid var(--asp-track)}）。 */
  --asp-ink:#221838;--asp-muted:#665E85;--asp-line:#EAE4F6;--asp-track:#EAE4F6;
  --asp-brand-solid:#7F4AE0;--asp-brand-ink:#7F4AE0;--asp-on-brand:#FFFFFF;
  --asp-pad:16px;
  /* [2026-10-08] 底栏固定底部并铺满视口：背景条 100% 通栏，内部内容限宽 860px 居中。
     不用 grid breakout（某些浏览器对 grid item 的 100vw 处理不一致），直接 fixed 最稳。 */}
html[data-theme="dark"] .st-dock{
  --asp-bg:#332F49;--asp-surface:#2A283C;--asp-surface-2:#332F49;
  --asp-ink:var(--color-text-main);--asp-muted:var(--color-text-sub);
  --asp-line:var(--color-line);--asp-track:var(--color-line);
  /* [批40] 品牌三令牌必须在本块内显式覆盖：深色坞若不写，会继承浅色块里的
     --asp-brand-ink:#7F4AE0 ⇒ 紫字压 #332F49 深底（实测对比度 ≈2.0，坞内 chips
     文字几乎看不见）。取值对齐思维健身房底栏的暗色口径（desktop.css 的
     [data-theme=dark] .gym-composer）：#C9B6FF 字 / #7A55E8 填充。 */
  --asp-brand-solid:#7A55E8;--asp-brand-ink:#C9B6FF;--asp-on-brand:#FFFFFF;
}
/* [2026-10-08] 底栏背景铺满，但内容保持 860px 居中（与对话列同宽），不拉伸。 */
.st-dock-in{max-width:860px;margin:0 auto;padding:10px 20px 12px}

/* 坞头：小伴方章 + 一句"我在"（与学习页同语言；不用 emoji 图标 —— 本机缺字形） */
.st-dock-head{display:none}   /* [中改] 对话升中栏后坞只留输入行；角色与红线提示改由对话顶部引导条承载 */
.st-dock-av{
  width:26px;height:26px;border-radius:9px;flex:none;
  background:#F0EBFF url("../../assets/mascot/mascot-v5-3d-base-transparent.png") center/78% no-repeat}
html[data-theme="dark"] .st-dock-av{background-color:#332F49}
.st-dock-t{min-width:0;display:flex;align-items:baseline;gap:8px;flex-wrap:wrap}
.st-dock-t b{font-size:13px;font-weight:900}
.st-dock-t span{font-size:11.5px;color:var(--color-text-sub)}

/* 坞内对话：限高可滚（不抢内容带的高度），空则整块不占位 */
.st-dock-log{max-height:min(26vh,190px);overflow-y:auto;display:flex;flex-direction:column;gap:8px}
.st-dock-log:empty{display:none}
.stb{
  max-width:min(860px,88%);border-radius:12px;padding:8px 11px;
  font-size:12.5px;line-height:1.7;white-space:pre-wrap;word-break:break-word}
.stb.ai{align-self:flex-start;background:var(--asp-surface-2);color:var(--asp-ink);border:1px solid var(--asp-line)}
.stb.me{align-self:flex-end;background:var(--asp-brand-solid);color:var(--asp-on-brand)}

/* 主推动作（「继续 →」/「交棒 →」）：由 renderDockLog 挂在**最新一条小伴气泡**里 ⇒ 恒一条。
   用 <button>（驱动本地状态机），不用 <a>（不是跳页）。 */
.st-acts{display:flex;gap:8px;flex-wrap:wrap;margin-top:9px}
/* [R28-3] 后端 propose 落点（听讲解 / 练一练 / 某个真实入口）：挂在动作区里，
   点它走后端给的 route。无 route 的演示卡在函数里就被丢掉，绝不渲染成死按钮。
   ⚠️ hover 必须显式接管 background —— page.css:58 有无作用域的全局 button:hover
   （特异 0,1,1），不接管会被刷成深紫（这个坑 R20/R21 已踩过两次）。 */
.st-propose{width:100%;margin-top:9px;padding:8px 10px;border-radius:10px;
  background:var(--asp-surface-2,#F0EBFF);border:1px solid var(--asp-line,#E7DEFB)}
.st-propose-t{font-size:12.5px;font-weight:800;color:var(--asp-brand-ink,#6D5EFC);margin-bottom:3px}
.st-propose-r{font-size:11.5px;line-height:1.5;color:var(--asp-ink);opacity:.78;margin-bottom:6px}
.st-acts .st-btn.go{background:var(--asp-brand-solid,#6D5EFC);color:#fff;
  border-color:var(--asp-brand-solid,#6D5EFC)}
.st-acts .st-btn.go:hover{background:#5848e0;color:#fff;border-color:#5848e0}
.st-acts .st-btn.go:active{opacity:.9}
/* [R27-2] 进度标志（动作区）：走过 / 现在 / 还没到
   · is-done 只代表「走到过」，不代表「过关了」（过关要有真实信号，不凭流程位置编）;
   · hover 用后代选择器压住全站 button:hover 的通用规则。 */
.st-prog{display:flex;flex-wrap:wrap;align-items:center;gap:7px;width:100%;margin-top:8px}
.st-prog-pill{font-size:11px;font-weight:800;color:var(--asp-on-brand,#fff);
  background:var(--asp-brand-solid,#6D5EFC);border-radius:99px;padding:3px 9px}
.st-prog-track{display:inline-flex;flex-wrap:wrap;align-items:center;gap:5px}
.st-prog-dot{font-style:normal;font-size:11px;padding:2px 8px;border-radius:99px;
  border:1px solid var(--color-line,#E3E3EA);color:var(--color-disable,#9A9AA8);
  background:var(--color-bg-card,#fff)}
.st-prog-dot.is-done{border-style:solid;color:var(--asp-brand-ink,#6D5EFC);
  background:var(--asp-surface-2,#F0EBFF);border-color:var(--asp-line,#E7DEFB)}
.st-prog-dot.is-now{border:2px solid var(--asp-brand-solid,#6D5EFC);
  color:var(--asp-brand-ink,#6D5EFC);font-weight:800}
.st-prog-restart{appearance:none;border:1px dashed var(--asp-line,#E7DEFB);cursor:pointer;
  font-family:inherit;font-size:11px;font-weight:700;
  color:var(--asp-brand-ink,#6D5EFC);background:var(--asp-surface-2,#F0EBFF);
  border-radius:99px;padding:3px 10px}
.st-prog .st-prog-restart:hover,.st-prog .st-prog-restart:active{
  background:var(--asp-brand-solid,#6D5EFC);color:var(--asp-on-brand,#fff);
  border-color:var(--asp-brand-solid,#6D5EFC)}
.st-act{
  appearance:none;border:0;cursor:pointer;font-family:inherit;
  background:var(--asp-brand-solid);color:var(--asp-on-brand);
  font-size:12.5px;font-weight:800;border-radius:11px;padding:8px 16px;transition:.16s}
.st-act:hover{filter:brightness(1.08);transform:translateY(-1px)}
/* [R21] 定位未做时的置灰态。
   · :hover / :active 必须**显式接管**（双类选择器，压住上面那条 .st-act:hover，
     否则灰按钮一点就亮一下，看着像还能点）；
   · 禁用理由写在按钮旁边，不能只靠颜色 —— 颜色对色弱学生是无效的。 */
.st-act.is-off,.st-act:disabled{background:var(--color-bg-card);color:var(--color-disable);
  border:1px dashed var(--color-line);cursor:not-allowed}
.st-act.is-off:hover,.st-act.is-off:active,.st-act:disabled:hover,.st-act:disabled:active{
  filter:none;transform:none;cursor:not-allowed}
.st-act-tip{width:100%;font-size:11.5px;line-height:1.7;color:var(--color-disable);margin-top:6px}
.st-btn.is-off,.st-btn:disabled{background:var(--color-bg-card);color:var(--color-disable);
  border:1px dashed var(--color-line);cursor:not-allowed}
.st-btn.is-off:hover,.st-btn:disabled:hover{filter:none}

/* 快捷引导 chips：复用 .asp-chip；hover 必须**显式接管背景**（双类选择器，避免被组件级
   .asp-chip:hover 的置灰/换色规则盖掉品牌色） */
.st-dock-quick{display:none}   /* [中改] 快捷引导跟着对话走，见 actsHtml */
.st-dock-quick:empty{display:none}
.st-dock-quick .asp-chip:hover,
.st-dock-quick .asp-chip:active{
  background:var(--asp-brand-solid);color:var(--asp-on-brand);border-color:var(--asp-brand-solid)}

/* 输入行（尺寸对齐「输入框 40 高 / 圆角胶囊」，与学习页底栏同一档） */
.st-dock .asp-input-row{gap:8px;align-items:center}
.st-dock .asp-input{min-height:40px;font-size:14px;border-radius:20px;padding:0 16px}
/* [批42] 坞内按钮观感逐值对齐思维健身房底栏（参照物 = desktop.css .gym-composer）：
   ① 静态粉投影 0 6px 14px -8px rgba(226,83,143,.6)：参照物上它来自 page.css:56 的
      无作用域 button 规则（本页不加载 page.css）⇒ 在坞内**显式声明**，刻意不放开全页
      （全站 button 全局规则正是历史上抢底色事故的来源，批40/41 的 hover 显式接管同理）。
   ② 🔊 小伴朗读钮（.st-voice，加在 #stDockVoice 上）对齐 .gym-voice：方角 10px /
      白底 muted 字，hover 变浅紫底品牌字，开（.is-on）实心紫 + 外圈光晕 ——
      与「只看文字」态一眼可辨（desktop.css:4678 口径；颜色用本页 --asp-* 令牌，
      暗色自动落到 #2A283C/#332F49 那套，无暴露浅色残留）。
   ③ 发送 hover 由 brightness(1.06) 改为阴影抬升（desktop.css:4673 口径）：
      brightness 会把品牌紫洗亮成「按下感」，阴影 + 微抬升才是参照物的悬停反馈。 */
.st-dock .asp-mic,.st-dock .asp-send{box-shadow:0 6px 14px -8px rgba(226,83,143,.6)}
.st-dock .asp-mic{width:38px;height:38px;font-size:15px;border-radius:999px}
.st-dock .asp-mic.is-on{background:var(--asp-brand-solid);color:var(--asp-on-brand);border-color:var(--asp-brand-solid)}
.st-dock .st-voice{border-radius:10px;background:var(--asp-surface);color:var(--asp-muted)}
.st-dock .st-voice:hover{background:var(--asp-surface-2);color:var(--asp-brand-ink);border-color:var(--asp-line)}
/* is-on 写完整规则且排在 :hover 之后（同特异性下源顺序定胜负）：
   实测若只补 box-shadow、实心紫底仍靠前面 .asp-mic.is-on，悬停开着的按钮会被
   :hover 抢回浅紫底 —— 观感等同「没开」。desktop.css:4687 的 .gym-voice.is-on 同序。 */
.st-dock .st-voice.is-on,.st-dock .st-voice[aria-pressed="true"]{
  background:var(--asp-brand-solid);color:var(--asp-on-brand);border-color:var(--asp-brand-solid);
  box-shadow:0 0 0 4px rgba(127,74,224,.16)}
.st-dock .asp-send{min-height:40px;padding:0 20px;border-radius:999px}
.st-dock .asp-send:hover,
.st-dock .asp-send:active{filter:none;box-shadow:0 6px 16px -10px rgba(127,74,224,.8);transform:translateY(-1px)}
/* ============================================================================
 * [R22 2026-09-26] 「今天该复习 / 复习队列」清单：数字必须落成看得见的条目
 * ========================================================================== */
.st-due-row{
  display:flex;align-items:center;gap:10px;padding:9px 0;border-bottom:1px dashed var(--color-line);
}
.st-due-row:last-child{border-bottom:none}
.st-due-row .dn{flex:1 1 auto;min-width:0;font-size:13px;font-weight:800;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.st-due-row .dt{flex:0 0 auto;font-size:11px;font-weight:700;color:var(--color-text-sub);padding:3px 8px;border-radius:99px;white-space:nowrap}
.st-due-row .st-btn{flex:0 0 auto;padding:5px 11px;font-size:12px}
.st-due-more{font-size:12px;color:var(--color-text-sub);padding:9px 0 2px;display:flex;align-items:center;gap:8px}
.st-queue{border-color:var(--color-line)}
.st-kb-row.is-link{cursor:pointer}
.st-kb-row.is-link .k{color:var(--color-primary)}
.st-kb-row.is-link:hover .v{color:var(--color-primary-d,var(--color-primary))}
.st-due-row.is-nolabel .dn{font-size:11.5px;font-weight:600;color:var(--color-text-sub)}
.st-due-row.is-nolabel .dt{background:transparent;border:1px dashed var(--color-line)}

/* [R25] 互动课件直取卡：课件 chips + 换「拍照出卡」的次入口（内嵌课件框复用 .st-inline-rflow） */
.st-cw-chips{display:flex;flex-wrap:wrap;gap:8px;margin:0 0 10px}
.st-cw-chip{border:1.5px solid var(--color-line);background:var(--color-bg-card);color:var(--color-text-main);
  border-radius:999px;padding:7px 14px;font-size:13px;font-weight:700;cursor:pointer;font-family:inherit;
  transition:border-color .15s,background .15s}
.st-cw-chip:hover{border-color:var(--color-primary)}
.st-cw-chip.on{background:var(--color-primary);border-color:var(--color-primary);color:#fff}
.st-cw-alt{margin-top:10px;text-align:center}
/* [R35] long lecture title segmented highlight */
.st-title-seg{display:inline;color:#6D5EFC;font-weight:900}
/* 讲义卡头是深紫背景，同品牌紫会溶进去 ⇒ 用高光金做区分 */
.st-lec-head .st-title-seg{color:#FFE175}
html[data-theme="dark"] .st-title-seg{color:#a99bff}
html[data-theme="dark"] .st-lec-head .st-title-seg{color:#FFE175}

/* [R36] 流内讲义卡：此前 DOM 已生成但 CSS 缺失，导致「收起」按钮视觉上无响应 */
.st-lec-card{margin:12px 0 4px;border-radius:16px;border:1px solid rgba(109,94,252,.20);
  background:linear-gradient(180deg,rgba(109,94,252,.06),rgba(40,194,200,.03));
  box-shadow:0 8px 24px rgba(80,70,160,.10);overflow:hidden}
.st-lec-head{display:flex;align-items:center;gap:8px;padding:10px 13px;
  background:linear-gradient(90deg,#5B3BDB,#7C5CF5 52%,#6D5EFC);
  border-bottom:1px solid rgba(255,255,255,.14)}
.st-lec-card.is-collapsed .st-lec-head{border-bottom:none}
.st-lec-kicker{flex:0 0 auto;font-size:12px;font-weight:700;color:#fff;letter-spacing:.2px;
  background:rgba(255,255,255,.16);padding:3px 9px;border-radius:999px}
.st-lec-title{flex:1 1 auto;min-width:0;font-size:13.5px;font-weight:700;color:#fff;
  overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.st-lec-meta{flex:0 0 auto;font-size:12px;color:rgba(255,255,255,.82)}
.st-lec-toggle{flex:0 0 auto;font-size:12px;font-weight:600;color:#6D5EFC;background:#fff;
  border:0;border-radius:999px;padding:4px 12px;cursor:pointer;box-shadow:0 2px 6px rgba(0,0,0,.12)}
.st-lec-toggle:hover{background:#F0EBFF}
.st-lec-body{padding:12px 13px 14px;background:var(--color-bg-card)}
.st-lec-card.is-collapsed .st-lec-body{display:none}
.st-lec-go{display:inline-flex;align-items:center;gap:6px;font-size:13px;font-weight:700;color:#fff;
  background:linear-gradient(90deg,#6D5EFC,#28C2C8);border:0;border-radius:999px;padding:9px 16px;
  cursor:pointer;box-shadow:0 6px 14px -6px rgba(109,94,252,.45)}
.st-lec-go:hover{transform:translateY(-1px);box-shadow:0 8px 18px -6px rgba(109,94,252,.55)}
.st-lec-fail{margin-top:10px;padding:10px 12px;border-radius:10px;background:#FFF0F0;border:1px solid #FFD1D1;
  color:#B93636;font-size:12.5px;line-height:1.55}
html[data-theme="dark"] .st-lec-card{background:linear-gradient(180deg,rgba(201,182,255,.06),rgba(40,194,200,.04));
  border-color:rgba(201,182,255,.22);box-shadow:0 8px 24px rgba(0,0,0,.30)}
html[data-theme="dark"] .st-lec-head{background:linear-gradient(90deg,#4A3AB8,#5D4BD6 52%,#5B4AE0);
  border-bottom-color:rgba(255,255,255,.10)}
html[data-theme="dark"] .st-lec-kicker{background:rgba(255,255,255,.12);color:#fff}
html[data-theme="dark"] .st-lec-meta{color:rgba(255,255,255,.78)}
html[data-theme="dark"] .st-lec-toggle{color:#C9B6FF;background:#2A283C}
html[data-theme="dark"] .st-lec-toggle:hover{background:#332F49}
html[data-theme="dark"] .st-lec-body{background:var(--color-bg-card)}
html[data-theme="dark"] .st-lec-fail{background:#3A2228;border-color:#6B3A3A;color:#FF9E9E}

/* [R37] 对话流内嵌真判分练习 iframe */
.st-calib-host{margin:14px 0 18px;border:1px solid rgba(109,94,252,.22);border-radius:18px;overflow:hidden;background:#fff;box-shadow:0 8px 24px rgba(109,94,252,.10)}
.st-calib-hd{display:flex;align-items:center;justify-content:space-between;padding:12px 16px;background:linear-gradient(90deg,#6D5EFC,#8B7DFD);color:#fff}
.st-calib-hd b{font-size:14px;font-weight:600}
.st-calib-close{padding:4px 12px;font-size:12px;color:#fff;background:rgba(255,255,255,.18);border:1px solid rgba(255,255,255,.30);border-radius:999px;cursor:pointer;transition:.15s}
.st-calib-close:hover{background:rgba(255,255,255,.28)}
html[data-theme="dark"] .st-calib-host{background:#1E1B2E;border-color:rgba(201,182,255,.25);box-shadow:0 8px 24px rgba(0,0,0,.35)}
html[data-theme="dark"] .st-calib-hd{background:linear-gradient(90deg,#4A3AB8,#5D4BD6)}
html[data-theme="dark"] .st-calib-close{background:rgba(255,255,255,.10);border-color:rgba(255,255,255,.22)}
html[data-theme="dark"] .st-calib-close:hover{background:rgba(255,255,255,.18)}
@media (max-width:600px){.st-calib-host{margin:10px 0 14px;border-radius:14px}}

/* [R42] 底栏工具钮（📎📷✍️🎤）：逐值对齐错题本 .eb-dock-ico
   —— 38x38 / 圆角 999px / 浅紫填充 #F0EBFF / 描边 #EAE4F6 / 品牌字 / 粉投影。 */
.st-dock .st-tool{width:38px;height:38px;flex:0 0 auto;font-size:15px;border-radius:999px;
  background:var(--asp-surface-2,#F0EBFF);color:var(--asp-brand-ink,#7F4AE0);
  border:1px solid var(--asp-line,#EAE4F6);cursor:pointer;font-family:inherit;
  box-shadow:0 6px 14px -8px rgba(226,83,143,.6);
  transition:background .18s ease,border-color .18s ease,box-shadow .18s ease}
.st-dock .st-tool:hover{background:var(--asp-bg,#FFFFFF);box-shadow:0 8px 18px -8px rgba(226,83,143,.6)}
/* is-on 排在 :hover 后（源顺序定胜负）：录音/开态实心紫不被 hover 抢回 */
.st-dock .st-tool.is-on{background:var(--asp-brand-solid);color:var(--asp-on-brand);border-color:var(--asp-brand-solid)}
html[data-theme="dark"] .st-dock .st-tool{color:#C9B6FF}
/* [R42] 底栏色带与错题本 .eb-dock 同值：亮档描边 #EAE4F6 / 暗档 #3A3164（贯穿左右的全宽带） */
.st-dock{border-top-color:#EAE4F6}
html[data-theme="dark"] .st-dock{border-top-color:#3A3164}
/* [R42] 待发附件预览条（对齐思伴聊屋 _screenAttachPreviewHtml 的同语言） */
.st-attach{display:flex;align-items:center;gap:8px;margin:0 0 8px}
.st-attach[hidden]{display:none}
.st-attach-thumb{width:44px;height:44px;flex:0 0 auto;object-fit:cover;border-radius:10px;
  border:1px solid var(--asp-line,#EAE4F6);background:#fff}
.st-attach-doc{width:44px;height:44px;flex:0 0 auto;display:grid;place-items:center;font-size:20px;
  border-radius:10px;border:1px solid var(--asp-line,#EAE4F6);background:var(--asp-surface-2,#F0EBFF)}
.st-attach-name{font-size:12px;font-weight:600;color:var(--asp-ink,#221838);
  overflow:hidden;text-overflow:ellipsis;white-space:nowrap;max-width:320px}
.st-attach-x{flex:0 0 auto;width:22px;height:22px;border-radius:999px;cursor:pointer;
  border:1px solid var(--asp-line,#EAE4F6);background:var(--asp-surface-2,#F0EBFF);
  color:var(--asp-ink,#221838);font-size:13px;line-height:1;padding:0;font-family:inherit}
.st-attach-x:hover{background:var(--asp-brand-solid,#7F4AE0);color:#fff;border-color:var(--asp-brand-solid,#7F4AE0)}
/* [R42] 拍照 / 手写模态（语言对齐 app.js .mm-* 与错题本 .eb-sk-*） */
.st-mm-overlay{position:fixed;inset:0;background:rgba(15,18,28,.6);z-index:9999;
  display:flex;align-items:center;justify-content:center}
.st-mm-panel{background:var(--color-bg-card,#fff);border-radius:16px;padding:14px;
  box-shadow:0 20px 60px rgba(0,0,0,.35);max-width:min(940px,94vw)}
.st-mm-hd{display:flex;align-items:center;justify-content:space-between;gap:10px;margin:0 0 10px;
  font-size:13px;font-weight:700;color:var(--asp-ink,#221838)}
.st-mm-x{flex:0 0 auto;width:26px;height:26px;border-radius:999px;cursor:pointer;border:1px solid var(--asp-line,#EAE4F6);
  background:var(--asp-surface-2,#F0EBFF);color:var(--asp-ink,#221838);font-size:15px;line-height:1;padding:0;font-family:inherit}
.st-mm-x:hover{background:var(--asp-brand-solid,#7F4AE0);color:#fff;border-color:var(--asp-brand-solid,#7F4AE0)}
.st-mm-video{display:block;width:min(880px,90vw);max-height:62vh;border-radius:10px;background:#000}
.st-sk-canvas{display:block;width:min(880px,90vw);height:auto;aspect-ratio:900/560;background:#fff;
  border:1px solid rgba(127,74,224,.28);border-radius:10px;touch-action:none;cursor:crosshair}
.st-mm-bar{display:flex;justify-content:flex-end;gap:8px;margin-top:10px}
.st-mm-btn{border:1px solid var(--asp-line,#EAE4F6);background:var(--asp-surface-2,#F0EBFF);
  color:var(--asp-ink,#221838);border-radius:999px;padding:7px 16px;font-size:12.5px;font-weight:700;
  cursor:pointer;font-family:inherit;transition:.15s}
.st-mm-btn:hover{background:var(--asp-bg,#fff)}
.st-mm-btn.pri{border-color:var(--asp-brand-solid,#7F4AE0);background:var(--asp-brand-solid,#7F4AE0);color:#fff;
  box-shadow:0 6px 16px -10px rgba(127,74,224,.8)}
.st-mm-btn.pri:hover{transform:translateY(-1px)}
html[data-theme="dark"] .st-mm-panel{background:#2A283C}
html[data-theme="dark"] .st-mm-hd,html[data-theme="dark"] .st-attach-name{color:#F5F3FF}
html[data-theme="dark"] .st-mm-btn{background:#332F49;color:#F5F3FF;border-color:#3A3164}
html[data-theme="dark"] .st-mm-btn.pri{background:#7A55E8;border-color:#7A55E8;color:#fff}
html[data-theme="dark"] .st-sk-canvas{border-color:rgba(201,182,255,.30)}

/* [R46 首屏减负] 中栏学情单行条：替代原 5 卡横排（同一批数字右栏看板常驻，不重复铺卡） */
.st-statline{display:flex;flex-wrap:wrap;gap:4px 16px;align-items:baseline;
  border:1px solid var(--color-line);background:var(--color-bg-card);border-radius:11px;padding:8px 13px}
.st-statline .sti{display:inline-flex;align-items:baseline;gap:5px;font-size:12px;color:var(--color-text-sub)}
.st-statline .sti i{font-style:normal}
.st-statline .sti b{font-size:14.5px;color:var(--color-text-main)}
.st-statline .sti.warn b{color:#B45309}
/* [R46] 进入环焦点清单折叠条：默认只亮第一条 */
.st-focus-more{margin-top:2px}
.st-focus-more summary{cursor:pointer;list-style:none;display:inline-flex;align-items:center;
  font-size:12.5px;color:var(--color-primary);user-select:none;padding:3px 0}
.st-focus-more summary::-webkit-details-marker{display:none}
.st-focus-more[open] summary{margin-bottom:6px}
/* [R46] 接通回执一行化 */
.st-honest.is-ok{padding:7px 12px;font-size:12px;line-height:1.5}
