
  :root{
    --bg:#eef1f6; --phone:#0f1422; --card:#ffffff; --ink:#1c2333; --muted:#646D87;
    --brand:#3a6df0; --brand-soft:#eaf0ff; --brand-text:#2A61EF; --ok:#e8555a; --good:#1fa971; --good-text:#157A52;
    --line:#e5eaf3; --warn:#f0a13a; --warn-text:#A3610D; --purple:#7a4df0;
    /* v7.46h：对决条「我 / 同学」双色（用户 2026-09-26 图 3 指定）。
       ★ 单独开 token，不去动 --brand —— --brand 是全站主色（按钮/导航/chip/进度条
         都吃它），改它＝全站换肤，超出「只调配色」的范围。 */
    --vs-me:#1E3A6E; --vs-op:#8FB0E0;
  }
  /* v6.8：老师/主任/网管查看学生讲题记录时的「这是谁」标识——
     姓名 + 年级班级徽标 + 学校学号行 + 详情页身份卡 */
  .rec-main .rec-who{margin-left:6px;font-size:12px;font-weight:500;color:var(--brand-text);background:var(--brand-soft);border-radius:99px;padding:1px 8px;vertical-align:2px;white-space:nowrap}
  .rec-main .rec-loc{font-size:13px;color:var(--ink);opacity:.75;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
  .rec-who-card{margin:0 0 10px;padding:10px 12px;border-radius:12px;background:var(--brand-soft);border:1px solid #d6e2ff}
  /* v6.25：登录页那行「已自动填好上次登录的信息…」已按用户要求删除，元素一并移除。
     自动回填本身**保留**：打开页面时表单里已经是上次的账号/姓名/身份/年级/学校/班级，
     用户直接点「登 录」即可。（v6.25-APPLIED）*/
  /* v6.9：薄弱维度在 AI 未给细化点评时，退化为内置「练法方向」，不再输出无信息占位文案 */
  .fb-line.fb-tip{color:#6b7590}
  .fb-line.fb-tip .fb-k{color:var(--muted)}
  .rec-who-card .rw-nm{font-size:16px;font-weight:700;color:var(--ink)}
  .rec-who-card .rw-l{font-size:13px;color:var(--muted);margin-top:2px}
  *{margin:0;padding:0;box-sizing:border-box;-webkit-tap-highlight-color:transparent}
  body{font-family:"PingFang SC","Microsoft YaHei",system-ui,sans-serif;background:#fff;color:var(--ink);line-height:1.55;display:flex;justify-content:center;min-height:100vh}

  /* 全屏白底：去掉手机黑框，让内容真正铺满 */
  .phone{width:100%;max-width:100%;min-height:100vh;background:#fff;border-radius:0;padding:0;box-shadow:none;position:relative;margin:0;overflow:visible}
  .screen-wrap{width:100%;min-height:100vh;background:#fff;border-radius:0;overflow:visible;position:relative;display:flex;flex-direction:column}
  .statusbar{display:none}
  .statusbar .dots{display:flex;gap:4px}
  .statusbar .dots i{width:6px;height:6px;border-radius:50%;background:#fff;opacity:.85;display:block}

  /* top bar：退出放在第一行 */
  /* v6.31 修订（用户 09-14）：顶栏第一行恢复「N倍」双圆标（logo.png / 20px，与线上一致）；
     favicon 换成**紧裁到圆边、圆外全透明**的静态单 N 圆标，标签栏里看是一个圆而不是白方块。 */
  /* v7.347：顶栏拆成「左一块 / 右一块」，中间还给内容（用户 2026-10-28 原话：「上面那一行可以分开…
     中间是空的嘛，左边是 N 倍思维训练，右边是分享本站和我的，那就两边分开就好了」）。
     原来是一整条白底横栏 sticky 钉顶 —— 看 PDF 时它正好横压在课本顶上，白底还把内容盖掉一条。
     改法：整条**不再画背景/底边框**（透明，只留轻微的高度），品牌与右侧按钮各自成为半透明胶囊，
     左右两块之间的空隙完全透空 —— 视觉上不再是「一条横杠」，内容顶上那一条也回来了。 */
  .top-bar{flex:0 0 auto;background:transparent;padding:6px 10px;border-bottom:0;display:flex;align-items:center;justify-content:space-between;gap:8px;position:sticky;top:0;z-index:20}
  /* v7.347：品牌做成左侧独立胶囊（原来是一整条白底通栏里的一段文字，撑满整条宽度） */
  .top-bar .brand{font-size:15px;font-weight:700;color:var(--ink);display:flex;align-items:center;gap:6px;min-width:0;flex:0 1 auto;background:rgba(255,255,255,.88);-webkit-backdrop-filter:blur(8px);backdrop-filter:blur(8px);border:1px solid var(--line);border-radius:99px;padding:3px 12px 3px 8px;box-shadow:0 2px 8px rgba(20,30,60,.06)}
  .top-bar .brand img{height:20px;width:auto;flex:0 0 auto;display:block}
  .top-bar .brand span{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
  .top-bar .exit-btn{flex:0 0 auto;border:1px solid var(--line);background:#fff;color:var(--muted);font-size:13px;padding:5px 12px;border-radius:99px;cursor:pointer}
  .top-bar .exit-btn:hover{color:var(--brand-text);border-color:var(--brand-text)}

  /* scroll area: 模仿微信长对话，让内容自然撑开，避免内嵌滚动条。
     v6.15：导航改成 sticky 后自己占位，这里不再需要为它预留 90~120px 的死白，
     只留一点呼吸感（原来那块留白在宽屏上正好把内容顶到导航底下）。 */
  .scroll{flex:1 1 auto;overflow:visible;padding:14px 14px 18px}
  .card{background:var(--card);border:1px solid var(--line);border-radius:16px;padding:12px;margin-bottom:12px}
  .card h3{font-size:16px;margin-bottom:8px}
  .muted{color:var(--muted);font-size:14px}
  .btn{display:block;width:100%;border:none;background:var(--brand);color:#fff;font-size:15px;font-weight:600;padding:13px;border-radius:12px;cursor:pointer;text-align:center}
  .btn.ghost{background:#fff;color:var(--brand-text);border:1px solid var(--brand)}
  .btn.soft{background:var(--brand-soft);color:var(--brand-text)}
  .btn:disabled{opacity:.45;cursor:not-allowed}
  .btn + .btn{margin-top:10px}

  /* bottom nav */
  /* v6.13：底部导航要常驻可见。此前是 position:absolute，定位基准是整页容器
     （.phone/.screen-wrap 都是 min-height:100vh 且 overflow:visible），只要页面内容比一屏高
     （讲题页有拍照框、首页有雷达图），导航就被推到页面最底部、手机上要滑到底才看得见，
     用户感受就是「底部导航整个都没了」。
     v6.15：再由 fixed 改 sticky —— fixed 是「脱层」的，不占布局空间，宽屏下会拉成一条
     1420px 的长横杠压在页面内容上：讲题页的「提交诊断并纠偏」按钮正好落在导航下面被整条盖住，
     用户报「电脑端讲题按钮没有了」（截图确认：按钮 y=836，导航占 828~890）。
     sticky 同时满足两件事：① 滚动时始终吸在视口底部（常驻可见）；② 它自己占住布局空间，
     文档末尾的内容永远不会被盖住（fixed 时代靠 .scroll 的 padding-bottom 硬留白，留不准就挡）。
     再补 width/max-width 居中：宽屏不再拉成长杠，手机上仍是左右各留 10px 的悬浮圆角条。
     bottom 用 calc 留出 iPhone 安全区（Home Indicator），避免被手势条压住。 */
  /* v7.347：底部导航压扁 + 收窄（用户原话「底下这个导航栏太宽了，可以再低一点」）。
     高 62→46px、圆角 18→14px、下外边距 10→8px、限宽 920→680px（宽屏上不再拉成一条长杠）。
     ★ 只动几何，不动结构与键位：data-tab / .nav5 / .nav6 字号档全部照旧。 */
  .nav{flex:0 0 auto;position:sticky;bottom:calc(8px + env(safe-area-inset-bottom,0px));height:46px;width:calc(100% - 20px);max-width:680px;margin:0 auto 8px;background:var(--card);border:1px solid var(--line);border-radius:14px;display:flex;align-items:center;justify-content:space-around;box-shadow:0 -4px 20px rgba(20,30,60,.06);z-index:80}
  /* v7.347：按钮同步收一档（图标 18→16px、gap 2→1px），配合导航整体压扁 */
  .nav button{border:none;background:none;display:flex;flex-direction:column;align-items:center;gap:1px;color:var(--muted);font-size:12.5px;cursor:pointer;flex:1 1 0;min-width:0;padding:0 2px}
  .nav button .ic{font-size:16px}
  .nav button.on{color:var(--brand-text);font-weight:600}
  /* v7.47：解题地图「未开放」时的置灰态（学生）。★ 只降视觉分量，不隐藏、不移除 —— 
     本项目口径：没权限要**看得出来是「不够格」而不是「没这功能」**（§8-42）。
     · color 压到 --muted 再叠 55% 不透明度 → 明显比旁边三项浅；
     · ★ cursor 保持 pointer、**不写 not-allowed** —— 实测（playwright actionable 检查
       会因 not-allowed 判定元素不可交互）not-allowed 会让「点击 → toast 说明原因」
       这条反馈链在某些环境下整个失灵。本项目要的是「能点、点了告诉你为什么不行」，
       不是「点了没反应」。这也是置灰不隐藏的初衷。
     ★ 不能只靠 color：`.on` 类会给 --brand-text，若学生当前恰好在 map 页高亮，
       必须让置灰态**压过** .on（所以放在 .on 之后 + 更高特异性）。 */
  .nav button.nav-locked,
  .nav button.nav-locked.on{color:var(--muted);opacity:.55;font-weight:400}
  .nav button.nav-locked .ic{filter:grayscale(1)}
  /* v7.63：5 项导航收字号档（.nav.nav5，老师 / 教研室登录时挂）——
     v7.44 首创、v7.47 撤掉，v7.63 随「沙盘按角色显隐 + AI 出题进导航」重新启用。
     5 项挤在一行时 13px/18px 会顶，收一档：字号 12px、图标 16px；间距不动（8px 基线内）。 */
  .nav.nav5 button{font-size:12px}
  .nav.nav5 button .ic{font-size:16px}
  /* v7.73：6 项导航收字号档（.nav.nav6，静态挂在 #nav 上）——
     「看书」进导航后全员 6 项。5 项档（12px/16px）再收一档：字号 11.5px、图标 15px。
     按钮仍是 flex:1 1 0 均分，375px 宽度下每项约 59px，11.5px 四字短名可容。 */
  .nav.nav6 button,.nav.nav5 button{font-size:11.5px}
  .nav.nav6 button .ic,.nav.nav5 button .ic{font-size:15px}
  /* v6.15：导航限宽居中后，页面内容会从导航两侧「露出来」（看起来像错位）。
     加一层固定在视口底部的白色渐变遮罩，把这一条带统一淡出，视觉上就是一个
     底部工具条；手机上同样受益（内容在工具条下方渐隐，而不是被硬切一刀）。
     用 fixed 伪元素（position:sticky 不会成为 fixed 的包含块，所以它相对视口定位）；
     z-index:-1 落在导航自己的层叠上下文里 → 必在页面内容之上、导航之下。 */
  .nav:before{content:'';position:fixed;left:0;right:0;bottom:0;height:calc(70px + env(safe-area-inset-bottom,0px));background:linear-gradient(180deg,rgba(255,255,255,0) 0%,#fff 45%,#fff 100%);pointer-events:none;z-index:-1}

  .hidden{display:none!important}

  /* chips */
  .chips{display:flex;gap:8px;flex-wrap:wrap;margin-bottom:10px}
  .chip{border:1px solid var(--line);background:#f6f8fb;color:var(--muted);font-size:14px;padding:6px 12px;border-radius:99px;cursor:pointer}
  /* v6.31：科目选择改成下拉框（10 科时 chips 在手机上要占两三行）。容器不再用 .chips 的 flex 换行。 */
  .subj-pick{display:flex;align-items:center;gap:10px;flex-wrap:wrap;margin-bottom:10px}
  .subj-select{flex:1 1 190px;min-width:150px;font-size:16px;padding:10px 12px;border:1px solid var(--line);border-radius:12px;background:#fff;color:var(--ink);appearance:none;-webkit-appearance:none;background-image:linear-gradient(45deg,transparent 50%,var(--muted) 50%),linear-gradient(135deg,var(--muted) 50%,transparent 50%);background-position:calc(100% - 18px) 52%,calc(100% - 12px) 52%;background-size:6px 6px,6px 6px;background-repeat:no-repeat;padding-right:38px}
  .subj-hint{font-size:13px;color:var(--muted)}
  .chip.on{background:var(--brand);color:#fff;border-color:var(--brand-text)}

  /* explain flow */
  .field{margin-bottom:12px}
  .field label{font-size:14px;color:var(--muted);display:block;margin-bottom:6px}
  .field.row{display:flex;align-items:center;gap:8px;margin-bottom:10px}
  .field.row label{flex:0 0 auto;margin-bottom:0;white-space:nowrap;font-size:14px;min-width:3em}
  .field.row input,.field.row select{flex:1 1 auto;min-width:0}
  textarea{width:100%;border:1px solid var(--line);border-radius:12px;padding:12px;font:inherit;font-size:16px;resize:vertical;min-height:88px;background:#fbfcfe}
  .cam{border:2px dashed var(--line);border-radius:14px;height:150px;display:flex;flex-direction:column;align-items:center;justify-content:center;color:var(--muted);cursor:pointer;background:#fbfcfe;position:relative;overflow:hidden}
  .cam .big{font-size:30px}
  .cam img{position:absolute;inset:0;width:100%;height:100%;object-fit:cover}
  /* v6.30：有图时预览框按「图片自身比例」自适应 —— 竖长的手拍题不再被 cover 裁掉两头，
     学生上传完能看全整道题，也才知道自己拍得清不清楚。 */
  .cam.has-img{height:auto;border-style:solid;background:#fff}
  .cam.has-img img{position:static;width:100%;height:auto;max-height:min(58vh,520px);object-fit:contain;display:block}
  .cam.has-img .big,.cam.has-img .muted{display:none}
  /* ===== v6.56：题目图「✂️ 裁剪 / ⟲ 旋转」=====
     用户原话：「增加一个截图工具…方便 AI 来聚焦，然后把它识别一下，包括题干和图」。
     ★ #camBox 是 <label> 包着 file input：按钮必须 preventDefault + stopPropagation，
       否则一点就弹出「选择文件」——这条必须真浏览器验，光写代码不算数。 */
  .cam-tools{position:absolute;right:6px;bottom:6px;z-index:3;display:none;gap:6px;flex-wrap:wrap;
    justify-content:flex-end}
  .cam.has-img .cam-tools{display:flex}
  .cam-tool{display:inline-flex;align-items:center;gap:4px;background:rgba(255,255,255,.94);
    border:1px solid var(--line);color:var(--fg);border-radius:14px;padding:4px 10px;
    font-size:12.5px;line-height:1.6;cursor:pointer;box-shadow:0 1px 4px rgba(0,0,0,.10);
    font-family:inherit}
  .cam-tool:active{background:#eef3ff}
  /* 裁剪层：全屏；选框用 box-shadow 把框外压暗（不用四个遮罩 div，少一半代码） */
    /* v6.56：z-index 给到 1000000 —— 站内最大是 99999（弹层）+ 本地调试横幅 999999，
     模态层必须压过全站一切；原来写 9998，被 top-bar / 横幅盖住，按钮点不到。 */
  .cr-mask{position:fixed;inset:0;z-index:1000000;background:#0b1220;display:flex;flex-direction:column;
    -webkit-user-select:none;user-select:none}
  .cr-bar{display:flex;align-items:center;gap:8px;padding:10px 12px;color:#eaf0ff;font-size:14px;
    flex:0 0 auto;flex-wrap:wrap}
  .cr-bar .cr-t{flex:1 1 auto;font-weight:600;min-width:110px}
  .cr-b{background:rgba(255,255,255,.12);border:1px solid rgba(255,255,255,.28);color:#eaf0ff;
    border-radius:12px;padding:6px 12px;font-size:13.5px;font-family:inherit;cursor:pointer}
  .cr-b.cr-ok{background:#2f6df0;border-color:#2f6df0;color:#fff;font-weight:600}
  .cr-stage{flex:1 1 auto;position:relative;overflow:hidden;touch-action:none;margin:0 12px;
    border-radius:12px;background:#111a2c}
  .cr-img{position:absolute;left:0;top:0;pointer-events:none}
  .cr-sel{position:absolute;left:0;top:0;border:2px solid #4c8dff;
    box-shadow:0 0 0 9999px rgba(6,10,20,.62);cursor:move;touch-action:none}
  .cr-sel i{position:absolute;width:26px;height:26px;border:2px solid #4c8dff;background:#fff;
    border-radius:50%;box-sizing:border-box}
  .cr-sel i[data-h="nw"]{left:-13px;top:-13px;cursor:nwse-resize}
  .cr-sel i[data-h="ne"]{right:-13px;top:-13px;cursor:nesw-resize}
  .cr-sel i[data-h="sw"]{left:-13px;bottom:-13px;cursor:nesw-resize}
  .cr-sel i[data-h="se"]{right:-13px;bottom:-13px;cursor:nwse-resize}
  .cr-hint{flex:0 0 auto;padding:10px 14px calc(14px + env(safe-area-inset-bottom,0px));
    color:#aebbd0;font-size:12.5px;line-height:1.65;text-align:center}
  .cam input{display:none}
/* v6.39：上传的是 PDF / Word 时，预览框里显示文件名 —— 它不是图片，套不了 .cam img 那套样式 */
.cam .cam-doc{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:6px;
  width:100%;padding:16px;box-sizing:border-box;text-align:center;color:#2b3a55;
  font-size:15px;font-weight:600;word-break:break-all}
.cam .cam-doc .cd-ic{font-size:32px;line-height:1}
.cam .cam-doc .cd-sub{font-weight:400;font-size:12.5px;color:#7b8798}
/* v6.39：公式工具栏 + 实时预览 —— 学生用 $...$ 写式子，边打边看排版效果，
   不用盯着 \frac{1}{x-1} 这种源码猜自己写对没有。渲染复用 OCR 那套本地 KaTeX。
   v6.40：手机上原来会折成「插入公式 + 行内/独立/分数」一行、「根号/上标/角度」又一行，
   第 2 行没有标签、看着像走错位了。改成横向单行可滑动：标签固定，按钮排一行。
   （不换行而是滑动：手机上 6 个按钮 + 标签本来就放不下，换行反而更乱。） */
.math-bar{display:flex;flex-wrap:nowrap;gap:6px;align-items:center;margin-top:8px;
  overflow-x:auto;-webkit-overflow-scrolling:touch;scrollbar-width:none;padding-bottom:2px}
.math-bar::-webkit-scrollbar{display:none}
.math-bar .mb-t{font-size:12.5px;color:#7b8798;flex:0 0 auto;white-space:nowrap}
.math-bar .mb-btn{border:1px solid var(--line);background:#f7f9fc;color:#33475f;border-radius:999px;
  padding:4px 9px;font:inherit;font-size:12.5px;cursor:pointer;line-height:1.5;
  flex:0 0 auto;white-space:nowrap}
.math-bar .mb-btn:hover{background:#eef3fa;border-color:#b9cbe0}
.math-prev{margin-top:8px;border:1px dashed var(--line);border-radius:12px;padding:10px 12px;background:#fbfdff}
.math-prev .mp-t{font-size:12px;color:#7b8798;margin-bottom:6px}
.math-prev .mp-b{font-size:16px;line-height:1.75;color:#1c2b3a;word-break:break-word;overflow-x:auto}
.math-prev .math-blk{margin:6px 0;text-align:center}
/* v6.57：长公式（正解卡里点积展开一行 60+ 字符）会顶出卡片、把页面撑宽，
   右边界外全看不见 —— 手机上就是「公式断在半截」，跟「解答不全」是同一类观感。
   KaTeX 的 .katex-display 是 nowrap（不能破行），所以只能给它一个横向滚动：
   不裁切、不撑破卡片，用户能自己划。 */
.math-blk{max-width:100%;overflow-x:auto;overflow-y:hidden}
.katex-display{max-width:100%;overflow-x:auto;overflow-y:hidden}
/* 正解卡里的长推导改左对齐：居中会把开头裁到可视区左边，而且滚不回去 */
.tl-ref .katex-display>.katex{text-align:left}
/* v6.61：正解卡排版压缩 —— 用户原话「段间距太大，浪费很多空间」。三个来源一起压：
   ① KaTeX 独立公式自带 margin:1em 0 → 压成 3px；② 独立公式行 .math-blk → 2px；
   ③ 空行在 app.js 里不再渲染成整行 &nbsp;，改成一个 5px 小间距（.math-gap）。 */
.tl-ref .katex-display{margin:3px 0}
.tl-ref .math-blk{margin:2px 0}
.math-gap{display:block;height:5px;line-height:0}
.math-prev .math-inl .katex{font-size:1.05em}
.math-prev .math-fallback{font-size:13px}

  /* scorebars (保留样式，结果区改用紧凑数字网格) */
  .bar{margin:8px 0}
  .bar .top{display:flex;justify-content:space-between;font-size:15px;margin-bottom:3px}
  .bar .top b{font-weight:600}
  .bar .track{height:8px;background:var(--line);border-radius:99px;overflow:hidden}
  .bar .fill{height:100%;border-radius:99px;background:var(--brand);transition:width .5s}
  .bar.low .fill{background:var(--warn)}

  /* 七维紧凑数字网格（替代进度条，省空间） */
  .dim-grid{display:grid;grid-template-columns:repeat(4,1fr);gap:8px;margin-top:8px}
  .dim-cell{background:#f6f8fb;border:1px solid var(--line);border-radius:12px;padding:9px 2px;text-align:center}
  .dim-cell .l{font-size:14px;color:var(--muted)}
  .dim-cell .v{font-size:21px;font-weight:700;margin-top:2px;line-height:1.1}
  .dim-cell.ok .v{color:var(--good-text)}
  .dim-cell.low .v{color:var(--warn-text)}

  /* 等级 / 称号徽章 + 情绪价值 */
  .level-badge{margin-top:10px;font-size:15px;line-height:1.8}
  .level-badge .lv{display:inline-block;background:var(--brand);color:#fff;border-radius:99px;padding:3px 12px;font-weight:600;margin-right:6px}
  .level-badge .tt{color:var(--ink);font-weight:600}
  .level-badge .av{color:var(--muted);font-size:14px;margin-left:4px}
  /* ===== v6.33：思维诊断报告（四处落点共用同一套样式）=====
     ① 首页摘要 .diag-mini   ② 结果页每题一评（同一个 .diag-mini）
     ③ 独立「诊断」页 .diag-* ④ 老师看板阶段分布（复用 .diag-chip）
     口径：三阶段判定与权重表**只在 diagnosis.py 一处**，前端只负责画。 */
  .diag-mini{margin-top:10px;padding:10px 12px;background:#f4f8ff;border:1px solid #d8e6fb;border-radius:12px;font-size:14px;line-height:1.65;color:var(--ink)}
  .diag-mini .dm-stage{display:inline-block;background:var(--brand);color:#fff;border-radius:99px;padding:2px 10px;font-size:13px;font-weight:600;margin-right:6px}
  .diag-mini .dm-num{font-weight:800;color:var(--brand-text);font-size:16px}
  .diag-mini .dm-avg{color:var(--muted);font-size:13px}
  .diag-mini .dm-focus{color:#1a5fb4;font-weight:600}
  .diag-mini .dm-go{display:inline-block;margin-top:6px;font-size:13px;color:var(--brand-text);font-weight:600;cursor:pointer}
  .diag-mini .dm-load{color:var(--muted);font-size:13px}
  .diag-head{display:flex;align-items:center;gap:8px;flex-wrap:wrap;margin-bottom:4px}
  .diag-chip{display:inline-block;border-radius:99px;padding:3px 11px;font-size:13px;font-weight:600;background:#eef3fb;color:#4a5568;border:1px solid var(--line)}
  .diag-chip.on{background:var(--brand);color:#fff;border-color:var(--brand-text)}
  .diag-chip.done{background:#f0fbf6;color:var(--good-text);border-color:#cdeedd}
  .diag-big{font-size:34px;font-weight:800;color:var(--brand-text);line-height:1.1}
  .diag-big small{font-size:14px;font-weight:500;color:var(--muted);margin-left:6px}
  .diag-meter{height:8px;border-radius:99px;background:#eef1f6;overflow:hidden;margin:7px 0 2px}
  .diag-meter i{display:block;height:100%;background:var(--brand)}
  .diag-sec{margin-top:14px}
  .diag-sec h4{font-size:15px;margin:0 0 6px;color:var(--ink)}
  .diag-focus{border:1px solid var(--line);border-radius:12px;padding:10px 12px;margin-bottom:8px;background:#fff}
  .diag-focus .df-top{display:flex;align-items:baseline;gap:8px;flex-wrap:wrap}
  .diag-focus .df-name{font-weight:700;font-size:15px}
  .diag-focus .df-score{font-weight:800;color:var(--brand-text)}
  .diag-focus .df-w{font-size:12.5px;color:var(--muted)}
  .diag-focus .df-issue{font-size:13.5px;color:#8a5a20;margin-top:4px}
  .diag-focus .df-gold{font-size:13px;color:var(--muted);margin-top:4px;line-height:1.6}
  .diag-ol{margin:6px 0 0;padding-left:20px;font-size:14px;line-height:1.7}
  .diag-ol li{margin-bottom:5px}
  .diag-next{font-size:13.5px;color:#1a5fb4;background:#f4f8ff;border:1px solid #d8e6fb;border-radius:10px;padding:8px 11px;margin-top:8px;line-height:1.65}
  .diag-reason{font-size:13.5px;color:var(--muted);line-height:1.7;margin-top:6px}
  .diag-rep{border:1px solid var(--line);border-radius:12px;padding:11px 12px;margin-bottom:9px;background:#fff}
  .diag-rep.me{border-color:#bcd6f5;background:#f7fbff}
  .diag-rep .dr-top{display:flex;align-items:baseline;gap:8px;flex-wrap:wrap}
  .diag-rep .dr-code{font-weight:700;font-size:15px}
  .diag-rep .dr-score{margin-left:auto;font-weight:800;color:var(--brand-text);font-size:17px}
  .diag-rep .dr-meta{font-size:12.5px;color:var(--muted);margin-top:3px}
  .diag-rep .dr-dims{display:flex;flex-wrap:wrap;gap:4px;margin-top:6px}
  .diag-rep .dr-dims span{font-size:10px;padding:2px 6px;border-radius:99px;background:#f6f8fb;border:1px solid var(--line);color:var(--muted)}
  .enc-box{background:linear-gradient(180deg,#fff7f0,#fdeee4);border:1px solid #f3d3bd;border-radius:12px;padding:11px 12px;margin-bottom:10px;font-size:15px;line-height:1.7;color:#7a4a25}
  /* 首页版本号角标 */
  .ver-tag{font-size:11px;color:var(--muted);border:0.5px solid var(--line);border-radius:10px;padding:2px 8px;white-space:nowrap;flex-shrink:0}
  /* v6.4 周训练 */
  .wp-week-row{display:flex;gap:8px;align-items:center}
  .wp-week-row .btn{padding:7px 12px;font-size:13px;flex:1}
  .wp-week-cur{font-size:15px;font-weight:600;white-space:nowrap;padding:0 4px}
  .wp-class-row{display:flex;gap:8px}
  .wp-class-row input{flex:1;border:1px solid var(--line);border-radius:10px;padding:9px 10px;font:inherit;font-size:14px;background:#fbfcfe;min-width:0}
  .wp-day-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(280px,1fr));gap:10px;margin-top:10px}
  .wp-day-card{border:0.5px solid var(--line);border-radius:12px;padding:10px 12px;background:#fbfcfe}
  .wp-day-card.today{border-color:var(--brand-text);box-shadow:0 0 0 1.5px rgba(24,95,165,.15)}
  .wp-day-head{display:flex;justify-content:space-between;align-items:center;margin-bottom:8px}
  .wp-day-head b{font-size:15px}
  .wp-day-head .dt{font-size:12px;color:var(--muted)}
  .wp-day-card label{display:block;font-size:12px;color:var(--muted);margin:7px 0 3px}
  .wp-day-card input,.wp-day-card select,.wp-day-card textarea{width:100%;box-sizing:border-box;border:1px solid var(--line);border-radius:9px;padding:7px 9px;font:inherit;font-size:14px;background:#fff}
  .wp-dp-box{margin-top:10px}
  .wp-dp-box textarea{width:100%;box-sizing:border-box;border:1px solid var(--line);border-radius:10px;padding:9px 11px;font:inherit;font-size:14px;background:#fff;min-height:64px}
  .wp-prog-row{display:flex;align-items:center;gap:8px;margin:8px 0}
  .wp-prog-row .lbl{width:44px;font-size:13px;color:var(--ink);flex-shrink:0}
  .wp-prog-row .bar{flex:1;height:10px;background:#eef2f7;border-radius:99px;overflow:hidden}
  .wp-prog-row .bar i{display:block;height:100%;background:linear-gradient(90deg,#185FA5,#4E9BD8);border-radius:99px;transition:width .4s}
  .wp-prog-row .pct{width:42px;text-align:right;font-size:13px;color:var(--muted);flex-shrink:0}
  .wp-stu-table{width:100%;border-collapse:collapse;font-size:13px;margin-top:6px}
  .wp-stu-table th,.wp-stu-table td{padding:7px 6px;text-align:center;border-bottom:0.5px solid var(--line)}
  .wp-stu-table th{color:var(--muted);font-weight:500;font-size:12px}
  .wp-stu-table td.nm{text-align:left;font-weight:500}
  .wp-stu-table .ok{color:#0F6E56;font-weight:600}
  .wp-stu-table .miss{color:#C7CCD4}
  .wp-ov-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(140px,1fr));gap:10px;margin:8px 0}
  .wp-ov-item{border:0.5px solid var(--line);border-radius:12px;padding:10px 12px;text-align:center;background:#fbfcfe}
  .wp-ov-item .v{font-size:22px;font-weight:700;color:var(--brand-text)}
  .wp-ov-item .k{font-size:12px;color:var(--muted);margin-top:2px}
  .wp-dim-row{display:flex;align-items:center;gap:8px;margin:7px 0;font-size:13px}
  .wp-dim-row .dl{width:36px;flex-shrink:0}
  .wp-dim-row .bar{flex:1;height:9px;background:#eef2f7;border-radius:99px;overflow:hidden}
  .wp-dim-row .bar i{display:block;height:100%;background:#4E9BD8;border-radius:99px}
  .wp-dim-row .bar i.plan{background:#C9D6E4;height:5px;margin-top:2px}
  .wp-dim-row .dv{width:30px;text-align:right;color:var(--muted)}
  .wp-task-line{display:flex;gap:8px;align-items:flex-start;margin:6px 0;font-size:14px;line-height:1.6}
  .wp-task-line .tag{flex-shrink:0;background:var(--brand);color:#fff;border-radius:8px;padding:2px 8px;font-size:12px;white-space:nowrap;margin-top:2px}
  .wp-done-badge{display:inline-block;border-radius:99px;padding:3px 12px;font-size:13px;font-weight:600;margin-top:6px}
  .wp-done-badge.done{background:#E3F2EC;color:#0F6E56}
  .wp-done-badge.todo{background:#FFF4E5;color:#99420A}
  /* v6.5：题目区 / 学生计划 / 示范版本角标 */
  .wp-pimgs{display:flex;flex-wrap:wrap;gap:6px;margin-top:4px}
  .wp-pimg-wrap{position:relative;display:inline-block}
  .wp-pimg{width:72px;height:72px;object-fit:cover;border:0.5px solid var(--line);border-radius:8px;display:block;cursor:zoom-in}
  .wp-pimg-del{position:absolute;top:-7px;right:-7px;width:18px;height:18px;border-radius:50%;background:#e5484d;color:#fff;font-size:12px;line-height:18px;text-align:center;cursor:pointer;font-weight:700}
  .wp-pbtns{display:flex;gap:6px;margin-top:6px}
  .wp-pbtns .btn{flex:1;font-size:13px;padding:6px 8px}
  .wp-follow-row{display:flex;gap:6px;margin:8px 0 2px}
  .wp-follow-row .btn{flex:1;font-size:13px}
  .wp-teacher-ref{margin-top:10px;border:0.5px solid var(--line);border-radius:10px;padding:8px 10px;background:#fbfcfe}
  .wp-teacher-ref summary{font-size:13px;color:var(--muted);cursor:pointer}
  .wp-teacher-ref table{margin-top:8px}
  .ex-src-badge{font-size:12px;border-radius:10px;padding:5px 10px;margin-bottom:10px;background:#f2f3f5;color:#5a6478}
  .ex-src-badge.cls{background:#E8F7EE;color:#177a3d}
  .ex-src-badge.glb{background:#EEF2FF;color:#3a5bd9}

  /* 反馈卡：每维度一行，关键词加粗顶头，文字紧跟其后，充分利用宽度 */
  .fb-dim{margin:8px 0;border:1px solid var(--line);border-radius:12px;padding:10px 12px;background:#fbfcfe}
  .fb-dim.fb-weak{border-color:#f3d3bd;background:#fffaf6}
  .fb-dim.fb-reach{border-color:#d6e9d9;background:#f7fcf6}
  .fb-head{display:flex;justify-content:space-between;align-items:center;margin-bottom:5px}
  .fb-head .fb-label{font-weight:700;font-size:15px;color:#3d4761}
  .fb-head .fb-score{font-weight:800;font-size:17px}
  /* v7.05：这一维在当前测评版本下的类型 —— 实测 / 推断 / 估算。
     不标出来，三个版本在界面上长得一模一样，选了等于没选。 */
  .fb-kind{margin-left:6px;font-size:11px;font-weight:600;padding:1px 7px;border-radius:999px;
    border:1px solid #dfe3ea;color:#7a8296;background:#f5f7fa;line-height:1.7}
  .fb-kind.k-inf{border-color:#d6e4ff;background:#eef4ff;color:#3a6df0}
  .fb-kind.k-est{border-color:#ffe0b3;background:#fff6e6;color:#a06400}
  /* v7.05：三个测评版本的下拉，与地图那排圆按钮同一视觉语言，别做成另起一行的表单控件。
     v7.07：只留一处 —— 记录详情「我的讲解」标题行（v7.05 的地图 / 讲题页两处已撤）。 */
  /* v7.07：挂在「我的讲解」标题行**右侧紧贴标题**，而不是被 space-between 甩到最右端 ——
     它是这一段讲解的评判档位，跟标题挨着才看得出是归属关系。 */
  .tl-prof{display:inline-flex;align-items:center;gap:5px;margin-right:auto;
    font-size:12.5px;white-space:nowrap}
  .tl-prof .muted{font-size:12.5px}
  .prof-sel{font-size:12px;padding:3px 8px;border-radius:999px;border:1px solid #d8e0f0;
    background:#fff;color:#3d4761;cursor:pointer;line-height:1.7;outline:none}
  .prof-sel:hover{border-color:var(--brand-text,#3b6ef5);color:var(--brand-text,#3b6ef5)}
  .mm-sel{font-size:12px;padding:3px 8px;border-radius:999px;border:1px solid #d8e0f0;
    background:#fff;color:#3d4761;cursor:pointer;line-height:1.7;outline:none}
  .mm-sel:hover{border-color:var(--brand-text,#3b6ef5);color:var(--brand-text,#3b6ef5)}
  .prof-row .muted{white-space:nowrap}
  .fb-line{display:block;margin:5px 0;font-size:15px;line-height:1.65;color:#3d4761;word-break:break-word}
  .fb-line .fb-k{display:inline;font-weight:700;color:var(--ink);font-size:15px;background:none;padding:0}
  .fb-line .fb-v{display:inline;color:#3d4761}
  .fb-line.fb-empty{color:var(--muted);font-style:italic}
  /* v6.80：维度卡上的「💬 聊一聊」—— 蓝底白字，一眼看得见「这张卡能跟 AI 聊」。
     以前只有「点卡片空白处能弹」，而卡里最显眼的「💬 回一句」是**改分**入口、
     会被委托跳过，用户点了没反应就以为功能没做。 */
  .mk-dim-btn{display:inline-block;margin:2px 0 0;border:1px solid #3a6df0;background:#3a6df0;
    color:#fff;border-radius:8px;padding:3px 10px;font-size:12px;line-height:1.6;
    font-weight:600;cursor:pointer;box-shadow:0 1px 3px rgba(58,109,240,.28)}
  .mk-dim-btn:hover{background:#2f5ede;border-color:#2f5ede}
  .mk-dim-btn:active{transform:translateY(1px)}
  /* 重练按钮 tooltip */
  .rebtn{position:relative}
  .rebtn[data-tip]:hover::after{content:attr(data-tip);position:absolute;left:50%;bottom:110%;transform:translateX(-50%);background:#3d4761;color:#fff;padding:5px 9px;border-radius:6px;font-size:13px;white-space:nowrap;pointer-events:none;z-index:9}

  /* 老师/主任看板 */
  .board-empty{color:var(--muted);font-size:14px;text-align:center;padding:26px 10px}
  .board-loading{color:var(--muted);font-size:14px;text-align:center;padding:20px 10px}
  .stu-card{margin-bottom:10px;border:1px solid var(--line);border-radius:12px;padding:12px;background:#fff}
  .stu-card .row{display:flex;justify-content:space-between;align-items:center;margin-bottom:6px}
  .stu-card .nm{font-weight:700;font-size:15px}
  .stu-card .sc{font-size:13px;color:var(--muted)}
  .stu-card .subs{display:flex;flex-wrap:wrap;gap:6px;margin-top:8px}
  .stu-card .subs span{font-size:12px;padding:3px 8px;border-radius:99px;background:#f1f3f7;color:#5a657f}
  .stu-card .mini{height:6px;background:var(--line);border-radius:99px;overflow:hidden;margin-top:8px}
  .stu-card .mini i{display:block;height:100%;background:var(--brand);border-radius:99px}
  .class-card{margin-bottom:10px;border:1px solid var(--line);border-radius:12px;padding:12px;background:#fff}
  .class-card .row{display:flex;justify-content:space-between;align-items:center;margin-bottom:8px}
  .class-card .nm{font-weight:700;font-size:15px}
  .class-card .sc{font-size:13px;color:var(--muted)}
  .class-card .count{font-size:13px;color:var(--muted)}
  .class-radar{width:100%;max-width:260px;height:auto;margin:0 auto;display:block}

  /* 讲题前查类似题 */
  .sim-toggle{width:100%;border:1px dashed var(--brand);background:#f6f8fb;color:var(--brand-text);font-size:15px;padding:10px;border-radius:10px;cursor:pointer;font-weight:600}
  .sim-toggle:hover{background:#eef3ff}
  .sim-panel{margin-top:10px}
  .sim-row{border:1px solid var(--line);border-radius:10px;padding:9px 11px;margin-bottom:8px;background:#fff}
  .sim-row .top{display:flex;justify-content:space-between;gap:8px;font-size:15px;color:#3d4761;margin-bottom:4px}
  .sim-row .meta{font-size:13px;color:var(--muted);margin:2px 0 6px}
  .sim-row .caps{display:flex;flex-wrap:wrap;gap:4px}
  .sim-row .caps span{font-size:13px;padding:2px 7px;border-radius:99px;background:#f1f3f7;color:#5a657f}
  .sim-row .caps span.weak{background:#fde5cf;color:#a35d10}
  .sim-row .act{display:flex;gap:6px;margin-top:7px}
  .sim-row .act button{flex:1;border:1px solid var(--brand);background:#fff;color:var(--brand-text);font-size:14px;padding:6px 10px;border-radius:8px;cursor:pointer}
  .sim-row .act button.primary{background:var(--brand);color:#fff}
  .sim-empty{color:var(--muted);font-size:14px;text-align:center;padding:18px 8px}

  /* v6.42：模拟上传题目（老师 / 教研室 / 网管）。
     ★ 类名必须与上面「讲题前查类似题」的 .sim-* 分开 —— 那批类名已被占用，
       复用会让两套互不相关的样式互相串（铁律 5）。 */
  .simq-toggle{width:100%;margin-top:10px;border:1px dashed var(--brand);background:#f6f8fb;color:var(--brand-text);font-size:15px;padding:10px;border-radius:10px;cursor:pointer;font-weight:600}
  .simq-toggle:hover{background:#eef3ff}
  /* v6.42：登录页版本号后面的「内部身份已解锁 / 收起」小字 */
  .staff-hint{margin-left:8px;font-size:12px;color:var(--brand-text);border:1px solid var(--line);border-radius:99px;padding:1px 8px;cursor:pointer}
  /* v6.43：单题上传 · 标准化解析 + 分层递进引导 */
  .mind-parse{display:flex;flex-direction:column;gap:9px}
  .mind-skel,.mind-err{padding:12px 14px;border-radius:10px;font-size:14px;line-height:1.7}
  .mind-skel{background:#f4f7ff;color:#3a5a86;border:1px dashed #b9cdf0}
  .mind-err{background:#fff4f4;color:#a33;border:1px solid #f3c9c9}
  .mind-sec{border:1px solid var(--line,#e6e9f0);border-radius:10px;padding:9px 11px;background:#fbfcff}
  .mind-sec-h{font-size:13px;font-weight:700;color:var(--brand-text,#3b6ef5);margin-bottom:5px}
  .mind-sec-b{font-size:14px;line-height:1.75;color:#333;white-space:pre-wrap}
  .mind-chips{display:flex;flex-wrap:wrap;gap:6px}
  .mind-chip{background:#eef3ff;color:#2a4a86;border:1px solid #d3e0fb;border-radius:999px;padding:3px 10px;font-size:13px;line-height:1.6}
  /* ---- v6.85：每个已知条件 / 所求后面那枚「（广度联想）」---- */
  .mind-chips-bl{display:block;gap:0}
  .mind-cw{margin:0 0 7px}
  .mind-cw:last-child{margin-bottom:0}
  .mind-bl{display:inline-block;margin-left:6px;padding:2px 7px;font-size:12px;line-height:1.5;
    color:var(--brand-text,#3b6ef5);background:#fff;border:1px solid #c9d8fb;border-radius:999px;cursor:pointer}
  .mind-bl:hover{background:#eef3ff}
  .mind-bl.on{background:var(--brand,#3b6ef5);color:#fff;border-color:var(--brand-text,#3b6ef5)}
  .mind-blbox{margin:6px 0 2px;padding:9px 11px;background:#fff;border:1px solid #dfe6f5;
    border-radius:10px;box-shadow:0 1px 4px rgba(30,50,90,.06)}
  .bl-src{font-size:12px;color:#6a7288;line-height:1.6;margin-bottom:6px}
  .bl-src .bl-sec{color:#8a90a6}
  .bl-load{font-size:13px;color:#3a5a86;line-height:1.7}
  .bl-load-s{font-size:12px;color:#8a90a6}
  .bl-err{font-size:13px;color:#a33;line-height:1.7}
  .bl-list{margin:0;padding:0;list-style:none}
  .bl-list li{display:flex;gap:6px;font-size:13px;line-height:1.7;color:#333;padding:2px 0}
  .bl-list li.bl-secrow{display:block;font-size:12px;font-weight:700;color:#2a4a86;margin:7px 0 2px}
  .bl-tag{flex:0 0 auto;font-size:11px;line-height:1.7;padding:0 6px;border-radius:6px;background:#eef1f7;color:#5f6a80}
  .bl-tag.c-g{background:#e7f3ec;color:#0f6e56}
  .bl-tag.c-r{background:#fdf0e6;color:#854f0b}
  .bl-tag.c-w{background:#e8f0fe;color:#2a4a86}
  .bl-tag.c-a{background:#f3ecfb;color:#6a3fb5}
  /* v6.89：联想正文开始排公式了 —— 长公式是 nowrap，不设这条会把卡片撑宽、
     右半截跑到可视区外面（和「显示不全」是同一类观感）*/
  .bl-txt{flex:1 1 auto;min-width:0;max-width:100%;overflow-x:auto;overflow-y:hidden}
  .bl-txt .katex-display{max-width:100%;overflow-x:auto;overflow-y:hidden;margin:.3em 0}
  .bl-txt .katex-display>.katex{text-align:left}
  /* v7.18：验算去掉的那几条 —— 说清卡在哪 */
  .bl-bad{margin-top:6px;padding:5px 9px;border-radius:8px;background:#fdf2f0;
    border:1px solid #f3d3cd;font-size:11.5px;color:#a8442f;line-height:1.7}
  .bl-badu{margin:3px 0 0;padding-left:14px;list-style:none;color:#8a7b7a}
  .bl-foot{margin-top:8px;display:flex;gap:8px}
  .bl-more,.bl-close{font-size:12px;padding:3px 9px;border-radius:999px;border:1px solid #d8e0f0;
    background:#fff;color:#5f6a80;cursor:pointer}
  /* ---- v6.86：记录详情里的「题目解析」卡（老记录补做识别）---- */
  .rec-mind{margin:10px 0 0;border:1px solid var(--line,#e6e9f0);border-radius:12px;padding:10px 12px;background:#fbfcff}
  .rec-mind-h{font-size:14px;font-weight:700;color:var(--brand-text,#3b6ef5);margin-bottom:8px}
  .rec-mind-s{display:block;font-size:12px;font-weight:400;color:#8a90a6;margin-top:2px;line-height:1.6}
  /* ---- v7.02：① 记录详情「🔄 重算」---- */
  .rec-redo{float:right;margin-left:8px;font-size:12px;font-weight:400;padding:3px 10px;border-radius:999px;
    border:1px solid #c9d8fb;background:#fff;color:#2a4a86;cursor:pointer;line-height:1.7}
  .rec-redo:hover{background:var(--brand,#3b6ef5);border-color:var(--brand-text,#3b6ef5);color:#fff}
  .rec-redo:disabled{opacity:.6;cursor:default;background:#f2f4f8;color:#8a90a6;border-color:#dfe3ea}
  /* ---- v7.02：② 识别题意可编辑 ---- */
  .mp-bar{display:flex;flex-wrap:wrap;gap:8px;align-items:center;margin:0 0 8px}
  .mp-edit{font-size:12px;padding:3px 10px;border-radius:999px;border:1px solid #c9d8fb;
    background:#fff;color:#2a4a86;cursor:pointer;line-height:1.7}
  .mp-edit:hover{background:var(--brand,#3b6ef5);border-color:var(--brand-text,#3b6ef5);color:#fff}
  .mp-bar-s{font-size:12px;color:#8a90a6;line-height:1.6}
  /* 编辑态：阅读视图整块让位，只留表单（用类控制，不用 hidden —— hidden 会被
     类选择器上的 display 盖掉，本项目踩过） */
  .mind-parse.is-editing > *:not(.mp-form){display:none!important}
  .mp-form{border:1px solid #c9d8fb;border-radius:10px;background:#f7f9ff;padding:10px 12px}
  .mp-fld{margin-bottom:10px}
  .mp-fld>b{display:block;font-size:13px;color:#2a4a86;margin-bottom:4px}
  .mp-h{display:block;font-size:12px;font-weight:400;color:#8a90a6;margin:2px 0 4px}
  .mp-ta{width:100%;box-sizing:border-box;border:1px solid #d8e0f0;border-radius:8px;padding:7px 9px;
    font-size:13px;line-height:1.7;color:#333;background:#fff;resize:vertical;font-family:inherit}
  .mp-ta:focus{outline:none;border-color:var(--brand-text,#3b6ef5);box-shadow:0 0 0 3px rgba(59,110,245,.12)}
  .mp-act{display:flex;flex-wrap:wrap;gap:8px;align-items:center}
  .mp-act .btn{padding:4px 14px;font-size:13px}
  .mp-tip{font-size:12px;color:#2e7d52}
  .mp-note{margin-top:8px;font-size:12px;color:#8a90a6;line-height:1.7}
  /* ---- v6.87：联想编号（地图靠编号认人：这条联想出自哪个条件的第几条）---- */
  .mc-no{display:inline-block;min-width:22px;margin-right:5px;padding:0 5px;border-radius:6px;
    background:var(--brand,#3b6ef5);color:#fff;font-size:11px;font-weight:700;text-align:center;line-height:1.7}
  .bl-list li{position:relative}
  .bl-no{display:inline-block;margin:0 5px 0 2px;padding:0 4px;border-radius:5px;
    background:#eef3ff;color:#2a4a86;font-size:11px;font-style:normal;font-weight:700;line-height:1.7}
  /* v6.91：被启发式打分剪掉（＜4 分）的联想，就地打标 —— 「先不联想」的意思摆在列表里 */
  .bl-low{opacity:.55}
  .bl-low .bl-no{background:#f2f2f2;color:#9a6b00}
  .bl-low .bl-no::after{content:' · 低权重';font-weight:400;color:#b8860b}
  .mm-btn.mm-lowb.on{background:#fff4e0;border-color:#e0a030;color:#a06400}
  .bl-arch{margin:6px 0 2px;padding:5px 9px;border-radius:8px;background:#f2fbf4;border:1px solid #cfe9d7;
    font-size:12px;color:#357a4a;line-height:1.7}
  .bl-arch-s{display:block;font-size:11px;color:#6d8f7a}
  /* ---- v6.87：解题地图 ---- */
  .mind-mmwrap{margin-top:10px}
  .mind-mm{font-size:13px;padding:6px 14px;border-radius:999px;border:1px solid #c9d8fb;
    background:linear-gradient(180deg,#f6f9ff,#eaf1ff);color:#2a4a86;cursor:pointer;font-weight:700}
  .mind-mm:hover{border-color:var(--brand-text,#3b6ef5);color:var(--brand-text,#3b6ef5)}
  .mind-mmbox{margin-top:10px;border:1px solid #dfe6f5;border-radius:12px;background:#fff;padding:10px 12px}
  /* v7.13：标题与按钮整体放大一号 —— 用户原话「按钮要醒目一点，稍微大点」。
     原来 12px/3px 10px 的圆按钮挤在标题行里，主按钮（全屏看地图）一眼扫不到。 */
  .mm-head{display:flex;align-items:center;flex-wrap:wrap;gap:8px;font-size:16px;font-weight:700;
    color:#2a4a86;margin-bottom:6px}
  .mm-btn{font-size:13px;padding:6px 14px;border-radius:999px;border:1px solid #d8e0f0;
    background:#fff;color:#5f6a80;cursor:pointer;line-height:1.7}
  .mm-btn:hover{border-color:var(--brand-text,#3b6ef5);color:var(--brand-text,#3b6ef5)}
  .mm-v2.on,.mm-v3.on{background:var(--brand,#3b6ef5);border-color:var(--brand-text,#3b6ef5);color:#fff}
  .mm-sep{width:1px;height:20px;background:#e2e7f2;margin:0 3px}
  .mm-zv{min-width:52px;text-align:center;font-variant-numeric:tabular-nums}
  .mm-close{margin-left:auto}
  /* v6.89：全屏做成主按钮 + 图上常驻悬浮按钮 —— 用户翻到地图时只看见图，角落里的「⛶」等于不存在 */
  .mm-btn.primary{background:var(--brand,#3b6ef5);border-color:var(--brand-text,#3b6ef5);color:#fff;
    font-weight:700;font-size:14px;padding:7px 18px;box-shadow:0 2px 8px rgba(59,110,245,.28)}
  .mm-btn.primary:hover{filter:brightness(1.08);color:#fff}
  /* v7.13：加已知 / 加未知 —— 也是常用动作，做成描边实心一点，别混在一排灰按钮里 */
  .mm-btn.mm-addc,.mm-btn.mm-addg{font-weight:700;color:#2a4a86;border-color:#bcd0f7;
    background:linear-gradient(180deg,#f6f9ff,#eaf1ff)}
  .mm-btn.mm-addc:hover,.mm-btn.mm-addg:hover{border-color:var(--brand-text,#3b6ef5)}
  .mm-wrap{position:relative}
  .mm-fsfab{position:absolute;right:10px;bottom:10px;z-index:6;width:38px;height:38px;border-radius:50%;
    border:1px solid #c9d8fb;background:rgba(255,255,255,.95);color:#2a4a86;font-size:17px;line-height:1;
    cursor:pointer;box-shadow:0 4px 14px rgba(30,50,110,.22)}
  .mm-fsfab:hover{background:var(--brand,#3b6ef5);color:#fff;border-color:var(--brand-text,#3b6ef5)}
  /* v7.48 需求④「外部滑动场景增加按钮提示，避免用户操作困惑」——
     左下角常驻一枚手势说明角标（**放左下**是因为右下角已经被 ⛶ 全屏悬浮按钮占着）。
     它同时回答「画布归画布、页面归页面」：非全屏时告诉学生「在盘上滑 = 页面滚」，
     进全屏后换成「单指拖画布」，两句话不一样才不至于误导。纯提示，不吃点击。 */
  .mm-gest{position:absolute;left:10px;bottom:10px;z-index:5;max-width:calc(100% - 66px);
    padding:5px 11px;border-radius:999px;background:rgba(255,255,255,.93);
    border:1px solid #dfe6f2;box-shadow:0 2px 8px rgba(24,39,75,.08);
    font-size:11.5px;font-weight:600;color:#5b6b8c;line-height:1.3;
    pointer-events:none;user-select:none;-webkit-user-select:none;
    white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
  .mind-mmbox.is-fs .mm-gest,.mind-mmbox.mm-fake-fs .mm-gest{color:#2a4a86;border-color:#c9d8fb}
  @media (max-width:420px){.mm-gest{font-size:11px;padding:4px 9px}}
  .mm-tip{font-size:12px;color:#8a90a6;line-height:1.6;margin:0 0 6px}
  .mm-tip b{color:#2a4a86}
  /* v6.92：存盘标记 —— 让学生知道「这份盘已经存住了，下次点开不用再等十几秒」 */
  .mm-saved{font-size:11px;color:#2e7d52;background:#eaf7ef;border:1px solid #bfe3cd;
    border-radius:999px;padding:1px 8px;line-height:1.7}
  .mm-saved.on{font-weight:700}
  .mm-resetb.show{border-color:#f0a020;color:#a06a1e;background:#fff8ec}
  .mind-mm.has-saved{background:linear-gradient(180deg,#eefaf3,#e2f5ea);border-color:#bfe3cd;color:#2e7d52}
  /* v6.88：🎯 先走哪条 —— 优先组合卡（放在复盘小结之前：先给方向，再看细节）*/
  .mm-prio{margin:0 0 8px;border:1px solid #f2d8a8;border-radius:10px;background:#fffdf6;padding:8px 10px}
  .mm-prio-h{font-size:13px;font-weight:700;color:#a06a1e;margin-bottom:5px}
  .mm-prio-1{display:flex;align-items:baseline;gap:8px;font-size:13px;line-height:1.7;color:#333}
  .mm-prio-1 b{flex:0 0 auto;background:#f0a020;color:#fff;border-radius:999px;padding:1px 8px;font-size:11px}
  .mm-prio-no{font-weight:700;color:#c2402f}
  .mm-prio-w{color:#6b7285;font-size:12px}
  .mm-prio-cs{margin-top:6px;display:flex;flex-direction:column;gap:5px}
  .mm-prio-c{display:flex;align-items:flex-start;gap:8px;flex-wrap:wrap;font-size:13px;line-height:1.7;
    padding:5px 8px;border:1px solid #ecd9b6;border-radius:8px;background:#fff;cursor:pointer}
  .mm-prio-c:hover{border-color:#f0a020}
  .mm-prio-c.on{border-color:#f0a020;background:#fff6e3}
  .mm-prio-rk{flex:0 0 18px;height:18px;line-height:18px;text-align:center;border-radius:50%;
    background:#f0a020;color:#fff;font-size:11px;font-weight:700}
  .mm-prio-nos{font-weight:700;color:#2a4a86}
  .mm-prio-w2{flex:1 1 100%;color:#8a90a6;font-size:12px}
  .mm-prio-rule{float:right;font-weight:400;font-size:11px;color:#a3aab8}
  .mm-prio-sec{margin-top:7px}
  .mm-prio-sec>b{display:block;font-size:12px;color:#a06a1e;margin-bottom:3px}
  .mm-prio-subs{display:flex;flex-wrap:wrap;gap:5px}
  .mm-prio-sub{display:inline-flex;align-items:center;gap:5px;font-size:12px;color:#5f6a80;
    background:#fff;border:1px solid #e6d3ab;border-radius:999px;padding:2px 9px}
  .mm-prio-sub i{font-style:normal;width:16px;height:16px;line-height:16px;text-align:center;
    border-radius:50%;background:#f0a020;color:#fff;font-size:10px;font-weight:700}
  .mm-prio-sc{flex:0 0 auto;font-size:12px;font-weight:700;color:#c2402f;background:#fff2e2;
    border-radius:999px;padding:0 8px}
  .mm-prio-ps{display:flex;flex-wrap:wrap;gap:4px}
  .mm-prio-p{font-size:11px;border-radius:6px;padding:0 6px;line-height:1.7}
  .mm-prio-p.plus{background:#f2fbf4;color:#357a4a}
  .mm-prio-p.minus{background:#fdf1f0;color:#b4452f}
  .mm-prio-path{display:flex;flex-direction:column;gap:5px}
  .mm-prio-pa{display:flex;align-items:flex-start;gap:7px;flex-wrap:wrap;font-size:13px;line-height:1.7;
    padding:5px 8px;border:1px solid #ecd9b6;border-radius:8px;background:#fff;cursor:pointer}
  .mm-prio-pa:hover,.mm-prio-pa.on{border-color:#f0a020;background:#fff6e3}
  .mm-prio-rk2{flex:0 0 18px;height:18px;line-height:18px;text-align:center;border-radius:50%;
    background:#e8892f;color:#fff;font-size:11px;font-weight:700}
  .mm-prio-ar{color:#c9a227;font-weight:700}
  .mm-prio-to{font-weight:700;color:#2a4a86}
  .mm-prio-pk{display:flex;flex-wrap:wrap;gap:5px}
  .mm-prio-pki{font-size:11px;color:#8a90a6;background:#f6f7fa;border:1px dashed #dfe3ea;
    border-radius:8px;padding:2px 8px}
  .mm-prio-pki b{color:#6b7285;margin-right:4px}
  .mm-prio-bk{margin-top:6px;font-size:12px;color:#7a8296;line-height:1.7}
  .mm-prio-bk b{background:#eef1f7;border-radius:999px;padding:1px 8px;margin-right:6px;
    color:#5f6a80;font-size:11px}
  .mm-prio-s{margin-top:5px;font-size:11px;color:#a3aab8}
  .mm-sum{font-size:13px;line-height:1.8;color:#333;background:#fffaf0;border:1px solid #f0dcb4;
    border-radius:8px;padding:7px 10px;margin-bottom:8px}
  /* v6.88：舞台可拖可滚（原来只有 overflow-x，且三维被裁死）—— 上下左右都给出来 */
  /* v7.16：scrollbar-gutter:stable —— 滚动条**出不出现都占同一格**，于是
     舞台 clientWidth 恒定。否则「画布放大到超出高度 → 竖向滚动条出现 → 舞台窄 15px
     → 自动适应缩小 → 高度刚好够 → 滚动条消失 → 舞台又宽回去 → 再放大」会无限来回，
     宏观上就是用户说的「全屏后不停的在抖」。
     ★ v7.48 备忘：这条 `scrollbar-gutter:stable` 声明在 v7.23 就已**一起退役**了
     （overflow:hidden 下舞台永远不出滚动条 → 抖动的输入端根本不存在了，
       留着它反而白占 15px 槽位）。所以别照着这段旧注释去把它加回来 ——
     真机复验：offsetWidth === clientWidth，槽位为 0（见 _v748_mm_gest.js ④-B4b）。 */
  /* v7.23：overflow 改 hidden —— 画布现在**永远比舞台大**（按平移量四边动态长边，
     见 mmSvgBox），滚动条永远会被撑出来；看画布外面的世界统一走平移（mmPanLimit
     的下限已按内容尺寸放宽，最远的边也够得着），滚动条彻底退役。 */
  /* v7.48 需求④：原来这里还写着一句 `overscroll-behavior:contain` —— 那正是用户报的
     「手指在画布上滑，页面纹丝不动」的根因：overflow:hidden 已经让舞台自己滚不了，
     contain 又把往父级的滚动链切断 → 变成一个**手势黑洞**（自己没得滚，也不让页面滚）。
     改成 `touch-action:pan-y` 的默认链式行为：**非全屏时手指在画布上滑动，页面照常上下滚**
     （全屏那套另开，见 .mind-mmbox.is-fs 的 touch-action:none）。 */
  .mm-stage{overflow:hidden;cursor:grab;max-height:66vh;touch-action:pan-y;
    background:repeating-linear-gradient(90deg,#fafbff 0 39px,#f4f6fd 39px 40px)}
  .mm-stage.grabbing{cursor:grabbing}
  /* v7.14：平移层 —— 拖画布/左右按钮挪的是这一层（transform），不再靠 stage.scrollLeft
     （画布被 mmSvgBox 铺到正好等于舞台，滚动余量恒为 0，拖了等于没拖）。 */
  .mm-pan{transform-origin:0 0;will-change:transform}
  .mm-svg{display:block}
  /* v6.95 ①：得分小牌子挂在联想节点右侧 —— 有了它，那张「按分数排序」的清单就不必再占半屏 */
  .mm-sc rect{fill:#eef3ff;stroke:#c9d8fb}
  .mm-sc text{font-size:10px;font-weight:700;fill:#2a4a86}
  .mm-sc.hi rect{fill:#e8f7ec;stroke:#3f9b62}
  .mm-sc.hi text{fill:#256b41}
  .mm-sc.mid rect{fill:#fff6e6;stroke:#f0c983}
  .mm-sc.mid text{fill:#8a5a10}
  .mm-sc.lo rect{fill:#fdeceb;stroke:#e8a9a0}
  .mm-sc.lo text{fill:#a3352a}
  /* v6.95 ②：节点收缩（收起后 chip 虚线框，联想下盘）+ 选路卡收起态 */
  .mm-n.is-fold .mm-r{stroke-dasharray:4 3}  .mm-prio.min .mm-prio-sec{display:none}
  .mm-prio-open{font-weight:400;font-size:12px;color:#a06a1e;margin-left:8px}
  .mm-prio-h[data-mmact]{cursor:pointer}
  /* v6.95 ③：联想接龙（命 / 进度 / 得分 / 提示 / 排行榜）*/
  .mm-game{display:none;margin:6px 0 8px;padding:7px 10px;border:1px solid #dbe3f5;border-radius:10px;
    background:#f7f9ff;font-size:13px;line-height:1.9}
  .mm-game.on{display:block}
  .mm-game.over{background:#fffaf0;border-color:#f0c983}
  .mm-game b{color:#2a4a86}
  .mm-g-tip{color:#7a8296;font-size:12px;margin-left:8px}
  .mm-btn.mm-gbtn{margin-left:6px}
  .mm-glive{color:#c2402f;font-weight:700;letter-spacing:2px}
  .mm-gsc{font-weight:700;color:#185fa5}
  .mm-n.g-ok .mm-r{fill:#e8f7ec;stroke:#3f9b62;stroke-width:2.4}
  .mm-n.g-hint .mm-r{stroke:#f0a020;stroke-width:3.2}
  @keyframes mmAlarm{0%,100%{opacity:1}50%{opacity:.2}}
  .mm-n.g-bad .mm-r{fill:#fdeceb;stroke:#c2402f;stroke-width:2.6;animation:mmAlarm .45s 2}
  .mm-e.g-chain{stroke:#3f9b62;stroke-width:3.4;fill:none}
  .mm-gboard{margin-top:6px;font-size:12px;color:#5f6a80}
  .mm-gboard b{display:block;color:#5f6a80;margin-bottom:2px}
  .mm-gb-r{display:flex;gap:8px;padding:2px 0;border-top:1px dashed #e6ebf6}
  .mm-gb-r.me{color:#c2402f;font-weight:700}
  .mm-gb-i{width:16px;color:#8a90a6}
  .mm-gb-n{flex:1 1 auto;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
  .mm-gb-s{font-weight:700;color:#185fa5}
  /* v6.95 ④：收尾对照正解（你的链 / 正解的链 / 正解每一步）*/
  .mm-gans{margin-top:6px;border-top:1px dashed #e6ebf6;padding-top:6px}
  .mm-gans b.ok{color:#256b41}
  .mm-gans b.no{color:#a3352a}
  .mm-gline{display:flex;flex-wrap:wrap;gap:4px;align-items:center;margin:4px 0}
  .mm-gline i{font-style:normal;color:#8a90a6;font-size:12px;flex:0 0 74px}
  .mm-gseq{display:inline-block;padding:1px 7px;border-radius:999px;border:1px solid #dfe3ea;
    background:#fff;font-size:12px}
  .mm-gseq.ok{background:#e8f7ec;border-color:#3f9b62;color:#256b41}
  .mm-gseq.no{background:#fdeceb;border-color:#e8a9a0;color:#a3352a;text-decoration:line-through}
  .mm-gseq.key{background:#eef3ff;border-color:#9db4ef;color:#2a4a86}
  .mm-gseq.miss{background:#f6f7fa;color:#a3aab8}
  .mm-gar{color:#c9a227}
  .mm-gsteps{margin-top:4px}
  .mm-gsteps i{font-style:normal;display:block;color:#8a90a6;font-size:12px;margin-bottom:2px}
  .mm-gst{display:flex;gap:6px;align-items:flex-start;font-size:12px;line-height:1.7;padding:2px 0}
  .mm-gst b{flex:0 0 18px;height:18px;line-height:18px;text-align:center;border-radius:50%;
    background:var(--brand,#3b6ef5);color:#fff;font-size:11px}
  .mm-gst-t{font-weight:700;color:#2a4a86;flex:0 0 auto}
  .mm-guses{flex:0 0 auto;color:#c2402f;font-weight:700}
  .mm-ghow{color:#7a8296;flex:1 1 auto;min-width:0}
  .mm-e.g-key{stroke:#185fa5}
  /* v6.99：连线 / 删线 的操作引导条 —— 学生原话「不知道怎么连」，进状态就常驻这一行 */
  .mm-howto{margin:6px 0 8px;padding:7px 10px;border:1px solid #bcd0f7;border-radius:10px;
    background:#eef4ff;color:#274a86;font-size:13px;line-height:1.85}
  .mm-howto[hidden]{display:none!important}
  .mm-howto b{color:#185fa5}
  .mm-gwarn{font-weight:700;color:#c2402f}
  /* v6.99：走错满 10 步的询问条（「要不要重来」—— 不重来就继续） */
  .mm-gask{margin-top:4px;padding:5px 8px;border:1px dashed #f0c983;border-radius:8px;
    background:#fff8ea;color:#8a5a10;font-size:12.5px;display:flex;flex-wrap:wrap;
    gap:6px;align-items:center}
  .mm-btn.mm-askb{font-size:12px;padding:3px 9px}
  /* v6.99：规则浮窗（跟原题浮窗同一套壳） */
  .mm-r-b{font-size:13.5px;line-height:1.9;color:#41506e}
  .mm-r-b ol{margin:4px 0 10px;padding-left:20px}
  .mm-r-b li{margin-bottom:3px}
  .mm-r-b b{color:#274a86}
  .mm-r-t{font-weight:700;color:#274a86;margin:8px 0 3px}
  /* v6.97：原题浮窗 —— 地图（含全屏）里点「📄 原题」弹出；按住标题栏可拖 */
  .mm-qpop{position:absolute;top:54px;right:14px;z-index:60;width:min(600px,92%);
    max-height:calc(100% - 72px);display:flex;flex-direction:column;background:#fff;
    border:1px solid #d9e1f2;border-radius:12px;box-shadow:0 14px 40px rgba(20,30,60,.22);overflow:hidden}
  .mm-q-h{flex:0 0 auto;display:flex;align-items:center;justify-content:space-between;
    padding:9px 12px;background:#eef3fd;color:#274a86;font-weight:700;cursor:grab;
    user-select:none;-webkit-user-select:none;touch-action:none}
  .mm-q-b{flex:1 1 auto;overflow:auto;padding:10px 12px}
  .mm-q-b img{display:block;max-width:100%;margin:0 0 10px;border-radius:8px;border:1px solid #e3e8f4}
  .mm-q-i{color:#41506e;font-size:14px;line-height:1.75;margin-bottom:8px}
  .mm-q-t{font-weight:700;color:#274a86;margin:8px 0 4px}
  .mm-q-b ol{margin:0 0 6px;padding-left:20px;color:#41506e;font-size:14px;line-height:1.75}
  .mm-q-none{color:#8a93a8;font-size:14px}
  .mm-q-x{border:none;background:#fff;color:#41506e;border-radius:8px;padding:4px 9px;cursor:pointer}
  /* v6.88：⛶ 全屏（真全屏 API + 不支持时铺满窗口的退化浮层，同一套样式）*/
  .mind-mmbox:fullscreen,.mind-mmbox:-webkit-full-screen,.mind-mmbox.mm-fake-fs{
    /* v6.96：z-index 9999 → 100000 —— tl-pop（联想浮窗）是 99999，退化全屏被它压住
       （用户原话「地图全屏以后，浮窗仍然可以在地图的上面」）。仍低于相机层 1000000。 */
    position:fixed;inset:0;z-index:100000;margin:0;border:0;border-radius:0;padding:14px 18px;
    background:#fff;overflow:hidden;display:flex;flex-direction:column;box-sizing:border-box}
  .mind-mmbox:fullscreen .mm-stage,.mind-mmbox:-webkit-full-screen .mm-stage,
  .mind-mmbox.mm-fake-fs .mm-stage{flex:1 1 auto;min-height:0;max-height:none}
  .mind-mmbox:fullscreen .mm-steps,.mind-mmbox:-webkit-full-screen .mm-steps,
  .mind-mmbox.mm-fake-fs .mm-steps{flex:0 1 auto;overflow:auto}
  /* v6.89b 原为「全屏就是看盘 —— 文字块全部让位」（选路卡一张 1052px，把舞台挤到只剩 646）。
     v7.08 口径反过来：**全屏 = 全盘画布，复盘区间要显示出来**；藏起来的是联想画布（play）。
     故这条改挂 .mm-play —— play 只发生在内嵌态（见 mmDraw 的 !inFs 判断），
     真全屏一律是 full 视图，复盘区间照常显示。留 is-fs 前缀只是给「play 也能进全屏」兜底。*/
  /* v7.12：全屏现在就是「放大后的联想画布」，.mm-sum 只藏在**画布里**那一份 ——
     「💡 思路说明」浮层里的总结（.mm-note .mm-sum）必须照常能看，不能被一起藏掉。*/
  .mind-mmbox.is-fs.mm-play .mm-tip,.mind-mmbox.is-fs.mm-play .mm-prio,
  .mind-mmbox.is-fs.mm-play .mm-stage .mm-sum,.mind-mmbox.is-fs.mm-play .mm-steps,
  .mind-mmbox.is-fs.mm-play .mm-unused{display:none}
  /* v7.08b：文字块在全屏里重新出现，必须限高 + 内部滚动 —— 否则 v6.89b 那个
     「舞台被挤没、下半截看不到」的坑原样复发。舞台保底 46vh，文字块各不超过 26vh。*/
  .mind-mmbox.is-fs:not(.mm-play) .mm-prio-wrap,
  .mind-mmbox.is-fs:not(.mm-play) .mm-sum,
  .mind-mmbox.is-fs:not(.mm-play) .mm-steps,
  .mind-mmbox.is-fs:not(.mm-play) .mm-unused{
    flex:0 1 auto;min-height:0;max-height:26vh;overflow:auto}
  .mind-mmbox.is-fs:not(.mm-play) .mm-stage{min-height:46vh}
  /* v6.97：接龙进行中藏答案线索 —— 正解步骤卡（uses 直接写着每步用哪条联想）、
     选路卡（最优路径）、搁置卡全部不让看；结束（对照正解）后自动恢复 */
  .mind-mmbox.is-play .mm-steps,.mind-mmbox.is-play .mm-prio,
  .mind-mmbox.is-play .mm-sum,.mind-mmbox.is-play .mm-unused{display:none}
  .mind-mmbox.is-fs .mm-head{flex:0 0 auto}
  .mind-mmbox.is-fs .mm-wrap{flex:1 1 auto;min-height:0;display:flex}
  .mind-mmbox.is-fs .mm-stage{flex:1 1 auto;min-height:0;max-height:none}
  /* v7.48 需求④：全屏时**归我们接管手势** —— touch-action:none 让浏览器完全不插手指南，
     于是单指拖动可以真正平移画布（原来 .mm-stage 的 overflow:hidden + overscroll-behavior:contain
     把手指事件整段吃掉，手机全屏下画布纹丝不动，就是用户报的那条）。
     非全屏**不加**这条 —— 那边要留着让页面能滚。 */
  .mind-mmbox.is-fs .mm-stage,.mind-mmbox.mm-fake-fs .mm-stage{touch-action:none}
  /* v7.00：全屏短盘垂直居中 —— mmFitZ 全屏只按宽度放大（高的盘让它上下滚），
     但又矮又宽的盘（如 rid 739，H≈340）撑满宽度后下面空出一大条，
     学生原话「下半部分都是空白的，没有节点」。auto 外边距：盘比舞台矮 → 上下均分居中；
     盘比舞台高 → auto 边距归零，仍从顶上开始正常滚动，两不误。 */
  .mind-mmbox.is-fs .mm-stage{display:flex;flex-direction:column}
  /* flex:0 0 auto —— 不许 flex 把 svg 压扁（压扁就永不溢出，高盘滚动条消失） */
  .mind-mmbox.is-fs .mm-stage .mm-svg{margin:0;flex:0 0 auto;align-self:flex-start}
  .mm-e{fill:none;stroke-width:1.6}
  .mm-e.e-own{stroke:#cdd6e8}
  .mm-e.e-use{stroke:#e8892f;stroke-width:2.6}
  .mm-e.e-chain{stroke:#8fa4d8;stroke-width:2.2;stroke-dasharray:5 4}
  .mm-e.e-goal{stroke:#c2402f;stroke-width:2.4}
  .mm-e.dim{opacity:.13}
  /* v6.98：学生自己连的线（蓝，方向不限）+ 一条透明粗线专门用来点中删除 */
  .mm-e.e-mine{stroke:#185fa5;stroke-width:2.6}
  /* v7.26：🤖 自动画 —— 按答案自动铺的路线（橙色虚线），跟学生手连的蓝线、AI 讲解的红线三分 */
  .mm-e.e-auto{stroke:#c07a17;stroke-width:2.4;stroke-dasharray:7 4}
  .mm-e.e-hit{stroke:rgba(0,0,0,0);stroke-width:16;pointer-events:stroke}
  .mind-mmbox.is-del .mm-e.e-hit{stroke:rgba(192,64,47,.20);cursor:crosshair}
  .mind-mmbox.is-link .mm-n{cursor:crosshair}
  .mm-e.mm-rubber{stroke:#f0a020;stroke-width:2.6;stroke-dasharray:6 4;pointer-events:none}
  .mm-btn.mm-linkb.on,.mm-btn.mm-delb.on{background:var(--brand,#3b6ef5);border-color:var(--brand-text,#3b6ef5);color:#fff}
  /* v6.92：节点可拖 —— 学生要「移动以后才能看清关系」，抓手光标要给到位 */
  .mm-n{cursor:grab}
  .mm-n:active{cursor:grabbing}
  /* v7.00：拖动防选字 —— 原来 pointerdown 里 preventDefault，把 click 也一起吞了
     （节点全变死点击：连线连不上、收起没反应）。防选字改在这里做，click 才能活着。 */
  .mm-n,.mm-n text{-webkit-user-select:none;user-select:none}
  .mm-n.dim,.mm3-n.dim{opacity:.22}
  /* v6.88：优先档位上盘（1 首选 / 2 可试 / 3 基本用不上）—— 只用描边表达，
     不用 opacity：opacity 会和「点一步其余淡出」的 .dim 抢优先级，把淡出效果吃掉。 */
  .mm-n.p1 .mm-r{stroke:#f0a020;stroke-width:2.4}
  .mm-n.p2 .mm-r{stroke:#9db4ef}
  .mm-n.p3 .mm-r{stroke:#dfe3ea;stroke-dasharray:4 3}
  .mm-n.p-first .mm-r{stroke:#e8892f;stroke-width:3.2}
  .mm3-n.p1{border-color:#f0a020;box-shadow:0 6px 14px rgba(240,160,32,.3)}
  .mm3-n.p2{border-color:#9db4ef}
  .mm3-n.p3{border-color:#dfe3ea;border-style:dashed}
  .mm3-n.p-first{border-color:#e8892f;outline:2px solid #f7d9ae;
    box-shadow:0 8px 18px rgba(232,137,47,.35)}
  .mm-r{fill:#eef3ff;stroke:#c9d8fb}
  .mm-n.n-cond .mm-r{fill:#dbe6ff;stroke:#9db4ef}
  .mm-n.n-goal .mm-r{fill:#f3ecff;stroke:#c4b0f2}
  .mm-n.n-item .mm-r,.mm3-n.n-item .mm-r{fill:#fff6e6;stroke:#f0c983}
  /* v6.89b：未用到的联想**不许靠「变淡」来区分** —— 原来 #9aa2b2 灰字配浅底，
     盘上一片糊，用户原话「只有加深的才看得到，后面很多联想看不到」。
     改成白底 + 清晰边框 + 正常深度的字，只用边框样式区分用没用上。*/
  .mm-n.n-item.nu .mm-r{fill:#fff;stroke:#c9d3e4}
  .mm-n.n-step .mm-r{fill:var(--brand,#3b6ef5);stroke:#2b57cf}
  .mm-n.n-step .mm-t{fill:#fff;font-weight:700}
  .mm-no{font-size:11px;font-weight:700;fill:#2a4a86}
  .mm-n.n-item.nu .mm-no{fill:#5f6a80}
  .mm-t{font-size:12px;fill:#333}
  .mm-b{font-weight:700}   /* v6.99：量宽用的加粗探针（蓝色步骤节点是粗体） */
  .mm-n.n-item.nu .mm-t{fill:#3f4757}
  .mm-steps{margin-top:10px;display:flex;flex-direction:column;gap:6px}
  .mm-step{display:flex;align-items:flex-start;gap:8px;font-size:13px;line-height:1.7;padding:5px 8px;
    border-radius:8px;border:1px solid #e6ebf6;background:#fbfcff;cursor:pointer}
  .mm-step.on{border-color:var(--brand-text,#3b6ef5);background:#f2f6ff}
  .mm-step b{flex:0 0 20px;height:20px;line-height:20px;text-align:center;border-radius:50%;
    background:var(--brand,#3b6ef5);color:#fff;font-size:11px}
  .mm-uses{flex:0 0 auto;font-size:11px;color:#c2402f;font-weight:700}
  .mm-how{flex:1;color:#7a8296;font-size:12px}
  .mm-unused{margin-top:8px;font-size:12px;color:#8a90a6;line-height:1.8}
  .mm-unused b{display:block;color:#5f6a80;margin-bottom:2px}
  .mm-unused-s{display:block;font-size:11px}
  .mm-load,.mm-err{font-size:13px;color:#5f6a80;line-height:1.8}
  .mm-err{color:#b4452f}
  .mm-load-s{font-size:12px;color:#8a90a6}
  /* 三维：地板 + 抬起来的立体节点（rotateZ 转向 + rotateX 压成俯视，scale 收进画面）*/
  .mm3{perspective:1250px;background:linear-gradient(180deg,#f7f9ff,#eef2fb);border-radius:10px;
    overflow:hidden;position:relative}
  .mm3-world{position:relative;width:1080px;transform-style:preserve-3d;
    transform-origin:540px 30px;margin:0 auto;
    transform:scale(.58) rotateX(56deg) rotateZ(-40deg)}
  .mm3-floor{position:absolute;inset:0;width:1080px;height:100%}
  .mm3-n{position:absolute;display:flex;align-items:center;gap:6px;padding:4px 10px;border-radius:8px;
    border:1px solid #c9d8fb;background:#eef3ff;box-shadow:0 6px 14px rgba(30,50,110,.16);
    font-size:18px;color:#333;white-space:nowrap;cursor:pointer;backface-visibility:visible}
  .mm3-n:hover{outline:2px solid #f0c983}
  .mm3-n.n-cond{background:#dbe6ff;border-color:#9db4ef}
  .mm3-n.n-goal{background:#f3ecff;border-color:#c4b0f2}
  .mm3-n.n-item{background:#fff6e6;border-color:#f0c983}
  .mm3-n.n-item.nu{background:#fff;border-color:#c9d3e4;color:#3f4757}
  .mm3-n.n-step{background:var(--brand,#3b6ef5);border-color:#2b57cf;color:#fff;font-weight:700}
  .mm3-no{font-size:11px;font-weight:700;color:#2a4a86}
  .mm3-n.n-item.nu .mm3-no{color:#5f6a80}
  .mm3-n.n-step .mm3-no{color:#fff}
  .bl-more:hover,.bl-close:hover{background:#f4f7ff;color:var(--brand-text,#3b6ef5)}
  .mind-dimgrid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:6px 12px}
  .mind-dimrow{display:flex;gap:6px;font-size:13px;line-height:1.6}
  .mind-dimrow b{flex:0 0 42px;color:#2a4a86}
  .mind-dimrow span{color:#444}
  .mind-pick{margin-top:12px;border-top:1px dashed var(--line,#e6e9f0);padding-top:10px}
  .mind-pick-tip{font-size:13px;color:var(--muted,#8a90a6);line-height:1.7;margin-bottom:8px}
  .mind-dims{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:7px}
  .mind-dimb{border:1px solid var(--brand,#3b6ef5);background:#fff;color:var(--brand-text,#3b6ef5);
    border-radius:9px;padding:7px 4px;font-size:13px;font-weight:600;cursor:pointer}
  .mind-dimb:hover{background:#eef3ff}
  .mind-dimb.on{background:var(--brand,#3b6ef5);color:#fff}
  .mind-stage{display:inline-block;background:#eef3ff;color:#2a4a86;border-radius:6px;
    padding:1px 7px;font-size:12px;font-weight:700;margin-right:6px}
  .mind-score{margin-top:8px;background:#f2fbf5;border:1px solid #c9ecd7;border-radius:10px;
    padding:9px 11px;font-size:14px;line-height:1.75;color:#216b41}
  .mind-bar{display:flex;justify-content:space-between;align-items:center;background:#f6f8fb;
    border:1px solid var(--line,#e6e9f0);border-radius:8px;padding:5px 9px;margin-bottom:6px;font-size:12px;color:#5a6478}
  /* v6.62：结算卡片里那句「还能继续聊」的说明 —— 贴着卡片，不再单独冒一个气泡 */
  .mind-tip{margin-top:6px;padding-top:6px;border-top:1px dashed #c9ecd7;font-size:12.5px;
    line-height:1.7;color:#5a6478}
  .simq-grid{display:grid;grid-template-columns:1fr 1fr;gap:9px}
  .simq-grid .fld{display:flex;flex-direction:column;gap:4px;min-width:0}
  .simq-grid .fld > span{font-size:13px;color:var(--muted)}
  .simq-grid select,.simq-grid input{width:100%;box-sizing:border-box;border:1px solid var(--line);border-radius:10px;padding:9px;font:inherit;font-size:15px;background:#fbfcfe}
  .simq-src{display:flex;flex-direction:column;gap:8px;margin-top:10px}
  /* v6.60：两级错因选择器（一级大类 + 二级具体错法）。
     为什么要两级：一级只给「思维问题」时，模型在同一大类下自由发挥，连造 3 份会长得
     一模一样；二级把大类拆成可枚举的几条，轮换才有种子，多样性才是可靠的。 */
  .simq-cats{margin-top:10px;padding:9px 11px;border:1px solid var(--line);border-radius:10px;background:#fbfcfe}
  .simq-cat-row{display:flex;gap:8px;align-items:flex-start;margin-bottom:7px}
  .simq-cat-row:last-of-type{margin-bottom:0}
  .simq-cat-k{flex:0 0 58px;font-size:13px;color:var(--muted);padding-top:7px}
  .simq-cat-row .chips{margin-bottom:0;gap:6px}
  .simq-cat-row .chip{font-size:13px;padding:5px 11px}
  .simq-cat-row .chip em.ck{font-style:normal;margin-left:5px;font-size:11px;
    background:#fff;color:var(--brand-text);border-radius:6px;padding:1px 4px}
  .simq-cat-none{font-size:12.5px;color:var(--muted);line-height:2.1}
  /* v6.60b：逐份编排表（手动组合 / 固定不变）。一行一份，两个下拉。
     下拉不用 .chip 是刻意的 —— 10 份 × 两组 chips 会挤成一片，改错一格很难发现。 */
  .simq-plan{display:flex;flex-direction:column;gap:6px}
  .simq-plan-row{display:flex;gap:7px;align-items:center}
  .simq-plan-row .pn{flex:0 0 52px;font-size:12.5px;color:var(--muted)}
  .simq-plan-row select{flex:1 1 0;min-width:0;font-size:13px;padding:5px 8px;
    border:1px solid var(--line);border-radius:8px;background:#fff;color:var(--ink)}
  .simq-plan-row select.pl-cat{flex:0 0 116px}
  .simq-plan-row select.pl-sub{flex:1 1 140px}
  .simq-cat-tip{margin-top:7px;font-size:12.5px;color:var(--muted);line-height:1.8}
  .simq-cat-line{color:#1d7a45}
  /* v6.61c：已选清单 —— 「方式 / 大类 → 小类」摊平，与下方 chips 逐条对得上 */
  .simq-sum{margin-top:8px;padding:8px 10px;border:1px dashed var(--line);
    border-radius:8px;background:rgba(29,122,69,.05)}
  .simq-sum-h{font-size:12.5px;font-weight:700;color:#1d7a45;margin-bottom:5px}
  .simq-sum-row{display:flex;gap:8px;align-items:baseline;font-size:12.5px;    line-height:1.75;padding:2px 0}
  .simq-sum-row .sk{flex:0 0 auto;min-width:66px;color:var(--muted);font-weight:600}
  .simq-sum-row .sv{flex:1 1 auto;color:var(--fg);word-break:break-all}
  /* v7.53：模拟面板取题改七度拆解同款 —— 旧的 .simq-cam 大拍照框 / .simq-thumb 缩略图 /
     .simq-src textarea / .simq-file 全部退场；新取题区直接复用 ana 那套全局类
     （.ana-src-row / .ana-src / .ana-qbox / .ana-qta / .ana-qfoot / .jt-draw），
     这里不再为它写一条样式 —— 「一样」连样式都是同一份。 */
  .simq-qimg{display:block;max-width:100%;max-height:220px;margin-top:8px;border-radius:8px;border:1px solid var(--line);background:#f4f6fa}
  /* v6.43c：粘贴区。给 tabindex 后浏览器会给默认焦点环，这里收成柔和的品牌色虚线，
     既不刺眼，又能让人知道「现在粘贴会落到这里」。 */
  .paste-zone:focus{outline:none}
  .paste-zone:focus-visible{outline:2px dashed var(--brand);outline-offset:3px;border-radius:10px}
  .paste-hint{padding:5px 8px;border-radius:8px;background:#f6f8fb;border:1px dashed #cdd8e8}
  .paste-flash{animation:pasteFlash .5s ease}
  @keyframes pasteFlash{0%{background:#e7f0ff}100%{background:transparent}}
  .simq-btns{display:flex;gap:8px;margin-top:12px}
  .simq-btns .btn{flex:1}
  .simq-prog{font-size:14px;color:var(--brand-text);margin-top:10px}
  .simq-row{border:1px solid var(--line);border-radius:10px;padding:9px 11px;margin-top:8px;background:#fff}
  .simq-row .nm{font-weight:700;font-size:15px;display:flex;justify-content:space-between;gap:8px;align-items:center}
  .simq-row .badge{font-size:12px;font-weight:600;border-radius:99px;padding:1px 8px;background:#fde5cf;color:#a35d10}
  .simq-row .badge.hit{background:#e2f6e9;color:#1d7a45}
  .simq-row .meta{font-size:13px;color:var(--muted);margin:4px 0 6px;line-height:1.5}
  .simq-row .caps{display:flex;flex-wrap:wrap;gap:4px}
  .simq-row .caps span{font-size:12px;padding:2px 7px;border-radius:99px;background:#f1f3f7;color:#5a657f}
  .simq-row .caps span.weak{background:#fde5cf;color:#a35d10}
  .simq-wrong{font-size:13px;color:#3d4761;background:#f8fafd;border-left:3px solid var(--brand);padding:6px 9px;border-radius:0 8px 8px 0;margin-top:6px;line-height:1.6;white-space:pre-wrap}
  /* v6.45：模拟结果与「记录详情」同一套排版 —— 左讲解稿（句子高亮+行内标注）、右点评 */
  .simq-row .doc{margin-top:8px}
  .sim-bars{display:flex;flex-direction:column;gap:4px;margin:6px 0 8px}
  .sim-bar{display:grid;grid-template-columns:46px minmax(0,1fr) 28px;gap:6px;align-items:center;font-size:12.5px;color:var(--muted)}
  .sim-bar i{display:block;height:7px;background:#eef1f6;border-radius:99px;overflow:hidden}
  .sim-bar i b{display:block;height:100%;border-radius:99px}
  .sim-bar em{font-style:normal;text-align:right;color:var(--ink);font-weight:700}
  /* 保存状态条：以前生成完只有一句 toast，老师重开页面就以为没存上 */
  .simq-save{display:flex;gap:8px;align-items:center;flex-wrap:wrap;margin-top:8px;font-size:13px;color:var(--muted)}
  .simq-save .ok{color:#1d7a45;font-weight:600}
  .simq-save .btn{padding:6px 12px;font-size:13px}

  /* 5 维简评 */
  .mini5{margin-top:14px;padding:10px 12px;border:1px solid var(--line);border-radius:12px;background:#fbfcfe}
  .mini5-title{font-size:15px;font-weight:600;margin-bottom:8px;color:#3d4761}
  .mini5-grid{display:grid;grid-template-columns:repeat(5,1fr);gap:6px}
  .mini5-cell{border:1px solid var(--line);border-radius:8px;padding:6px 4px;text-align:center;background:#fff}
  .mini5-cell .l{font-size:13px;color:var(--muted);margin-bottom:2px}
  .mini5-cell .v{font-size:16px;font-weight:700;color:var(--brand-text)}


  /* radar */
  .radar-wrap{display:flex;justify-content:center;margin:6px 0 4px}
  /* 雷达图放大到整卡宽度：七维文字与分数随之变大，清晰可读 */
  .radar-wrap svg{width:100%;height:auto;max-width:340px;display:block}

  /* ---------- 阶梯追问：微信式往来消息 ---------- */
  .chat-prog{font-size:14px;font-weight:500;color:var(--muted);margin-left:6px}
  .chat-wrap{background:#ededed;border-radius:10px;padding:12px 10px;display:flex;flex-direction:column;gap:14px;overflow:visible;max-height:none}
  .chat-msg{display:flex;gap:8px;align-items:flex-start}
  .chat-msg.me{flex-direction:row-reverse}
  .chat-avatar{width:34px;height:34px;border-radius:5px;flex:0 0 34px;display:flex;align-items:center;justify-content:center;font-size:15px;font-weight:600;background:#9db6d0;color:#fff}
  .chat-msg.me .chat-avatar{background:#7cb8f0}
  .chat-bubble{position:relative;max-width:74%;background:#fff;border-radius:8px;padding:9px 12px;font-size:15px;line-height:1.65;word-break:break-word;box-shadow:0 1px 2px rgba(0,0,0,.06)}
  /* v6.64：气泡里的公式。KaTeX 的 display 模式是 nowrap（不能破行），
     长公式会把气泡顶宽、右边看不见 —— 与「解答不全」是同一类观感。 */
  .chat-bubble .math-blk,.chat-bubble .katex-display{max-width:100%;overflow-x:auto;overflow-y:hidden}
  .rc-txt .math-blk,.rc-txt .katex-display{max-width:100%;overflow-x:auto;overflow-y:hidden}
  /* ---------- v6.64：教研室「以学生身份对话」开关 + 点评框 ---------- */
  .as-stu{display:flex;align-items:center;gap:6px;margin:0 0 8px;font-size:13px;color:var(--muted);cursor:pointer;user-select:none}
  .as-stu input{width:16px;height:16px;accent-color:#3a6df0;cursor:pointer}
  .as-stu-bar{margin-bottom:8px}
  .crit-btn{display:block;margin:6px 0 0;padding:3px 8px;font-size:12px;line-height:1.5;color:var(--muted);background:#f4f6fa;border:1px solid var(--line);border-radius:6px;cursor:pointer;font-family:inherit}
  .crit-btn:hover{color:#3a6df0;border-color:#bcd6f5;background:#eef4ff}
  .crit-box{margin:6px 0 10px;padding:8px 10px;background:#fff;border:1px solid var(--line);border-radius:8px;max-width:88%}
  .crit-t{font-size:13px;font-weight:600;color:var(--ink);margin-bottom:6px}
  .crit-ta{width:100%;box-sizing:border-box;resize:none;border:1px solid var(--line);border-radius:8px;padding:8px 10px;font-size:14px;font-family:inherit;line-height:1.55;background:#fbfcfe;color:var(--ink)}
  .crit-row{display:flex;align-items:center;gap:8px;margin-top:6px;flex-wrap:wrap}
  .crit-row button{padding:5px 12px;font-size:13px;border-radius:7px;border:1px solid var(--line);background:#f4f6fa;color:var(--ink);cursor:pointer;font-family:inherit}
  .crit-row .crit-send{background:#3a6df0;color:#fff;border-color:#3a6df0}
  .crit-tip{font-size:12px;color:var(--muted)}
  .crit-done{margin:4px 0 8px;font-size:12.5px;color:#8a6d3b;background:#fff8e6;border:1px solid #f0d9a0;border-radius:6px;padding:5px 9px;max-width:88%}
  .chat-msg.crit .chat-avatar{background:#c9973f}
  .chat-msg.crit .chat-bubble{background:#fff8e6;border:1px solid #f0d9a0}
  .rc-row.rc-crit .rc-who{background:#f3e2c0;color:#8a6d3b;border-color:#e6cd9a}
  .rc-row.rc-crit .rc-txt{color:#8a6d3b}
  .chat-bubble:before{content:'';position:absolute;top:12px;left:-9px;border:5px solid transparent;border-right-color:#fff}
  .chat-msg.me .chat-bubble{background:#95ec69}
  .chat-msg.me .chat-bubble:before{left:auto;right:-9px;border-right-color:transparent;border-left-color:#95ec69}
  .chat-input{display:flex;gap:8px;align-items:flex-end;margin-top:10px}
  .chat-input textarea{flex:1;resize:none;border:1px solid var(--line);border-radius:10px;padding:12px;font-size:16px;font-family:inherit;min-height:56px;max-height:160px;background:#fbfcfe;color:var(--ink);line-height:1.55}
  .chat-mic{width:46px;height:46px;border-radius:10px;border:1px solid var(--line);background:#f6f8fb;font-size:18px;cursor:pointer;flex:0 0 46px}
  .chat-mic.on{background:#ffe8e8;border-color:#f5b5b5}
  .chat-cam{width:46px;height:46px;border-radius:10px;border:1px solid var(--line);background:#f6f8fb;font-size:18px;cursor:pointer;flex:0 0 46px}
  .chat-cam:active{background:#e9eefb}
  .chat-send{height:48px;padding:0 18px;border:none;border-radius:10px;background:var(--brand);color:#fff;font-size:15px;font-weight:600;cursor:pointer;flex:0 0 auto}
  .chat-send:disabled{cursor:not-allowed}
  /* v6.15：聊天输入区「吸底」常驻 —— AI 点评/回复一长，输入框就被顶到屏幕外，
     学生不往下拉就以为对话结束了（用户报「AI 点评以后很多同学看不到这个对话框」）。
     让整个输入区在 chatCard 范围内吸在底部导航上方，读到哪都能接着说话。
     bottom 要躲开底部导航（导航 62px + 10px 下边距 = 72px），再留 6px 缝隙。 */
  .chat-dock{position:sticky;bottom:calc(78px + env(safe-area-inset-bottom,0px));z-index:60;background:#fff;border-radius:14px;padding:8px 2px 6px;margin-top:10px;box-shadow:0 -8px 18px rgba(20,30,60,.07)}
  .chat-dock .chat-input{margin-top:2px}
  .chat-save-row{display:flex;justify-content:flex-end;margin-top:7px}
  .chat-save-row .mini-btn{padding:5px 12px;font-size:13px}
  /* 「回到 AI 对话框」浮动入口：对话框在屏幕外时出现，点一下滚过去并聚焦输入框 */
  .chat-jump{position:fixed;right:14px;bottom:calc(86px + env(safe-area-inset-bottom,0px));z-index:85;border:none;border-radius:99px;background:var(--brand);color:#fff;font-size:14px;font-weight:600;padding:10px 15px;box-shadow:0 6px 18px rgba(58,109,240,.32);cursor:pointer;display:flex;align-items:center;gap:6px;animation:jumpin .22s ease-out}
  @keyframes jumpin{from{opacity:0;transform:translateY(8px)}to{opacity:1;transform:none}}
  /* v6.15：记录详情里「继续追问这道题」——打开历史记录还能接着聊，聊完写入该条记录 */
  .rec-ask{margin-top:12px;border-top:1px dashed var(--line);padding-top:10px}
  .rec-ask-btn{padding:10px 12px;font-size:14px}
  .rec-ask-box{margin-top:9px;border:1px solid var(--line);border-radius:12px;padding:9px;background:#f7f9fd}
  .rec-ask-log{display:flex;flex-direction:column;gap:8px}
  .rec-ask-empty{font-size:13px;color:var(--muted)}
  .rec-ask .chat-input{margin-top:8px;gap:6px}
  .rec-ask .chat-input textarea{min-height:40px;max-height:120px;background:#fff}
  /* v6.16：追问框与讲题页同款 —— 拍照 / 语音（按钮尺寸按详情里的窄栏收小） */
  .rec-ask-cam,.rec-ask-mic{width:40px;height:40px;border-radius:10px;border:1px solid var(--line);background:#fff;font-size:16px;cursor:pointer;flex:0 0 40px;padding:0}
  .rec-ask-mic.on{background:#FDECEC;border-color:#E5484D;color:#B3261E}
  .rec-ask-mic.trans{background:#FDECEC;border-color:#F5B5B5;color:#B3261E}
  .rec-ask .chat-send{height:40px;padding:0 14px;font-size:14px}
  .rec-ask-tip{font-size:12.5px;color:var(--muted);margin-top:7px}
  /* ===== v6.31：逐维「回怼」对话框（讲题结果页 + 记录详情共用一套骨架） =====
     每个维度卡内嵌一个可折叠的小对话区：文字 / 🎤 语音 / 📷 图片，AI 认可就按原权重改这一维。 */
  .dim-rebut{margin-top:8px;border-top:1px dashed #e2e8f2;padding-top:7px}
  .dim-rebut-btn{display:flex;flex-direction:column;gap:1px;width:100%;text-align:left;border:1px solid #dbe3f0;background:#f7f9fd;border-radius:10px;padding:7px 10px;cursor:pointer;font-family:inherit;color:var(--ink)}
  .dim-rebut-btn:hover{background:#eef3fd;border-color:#c7d6f2}
  .dim-rebut-btn.on{background:#eaf1ff;border-color:#a9c2f0}
  .dim-rebut-btn .dr-t{font-size:13.5px;font-weight:600}
  .dim-rebut-btn .dr-h{font-size:12px;color:var(--muted)}
  .dim-rebut-box{margin-top:8px;border:1px solid var(--line);border-radius:12px;padding:9px;background:#f7f9fd}
  .dim-rebut-log{display:flex;flex-direction:column;gap:8px}
  .dim-rebut-box .chat-input{margin-top:8px;gap:6px}
  .dim-rebut-box .chat-input textarea{min-height:38px;max-height:110px;background:#fff}
  .dim-rebut-box .chat-msg .chat-bubble{max-width:88%;font-size:14px}
  .dim-rebut-foot{font-size:12.5px;color:var(--muted);margin-top:7px;line-height:1.6}
  /* 老师发言第三态（🧑‍🏫）——老师替学生纠错时的气泡 */
  .chat-bubble[data-who="teacher"]{background:#eef4ff;border-color:#c7d6f2}
  .rc-row.rc-tch .rc-who{color:#2b4a8b;background:#eef4ff;border:1px solid #cfdcfb}
  /* ===== v6.31：教师人工标注（直接改七维分数） ===== */
  .tg-box{margin-top:14px;border:1px solid #cfdcfb;border-radius:12px;background:#f6f9ff;padding:11px 12px}
  .tg-t{font-size:14.5px;font-weight:700;color:#2b4a8b;display:flex;flex-wrap:wrap;gap:6px;align-items:baseline}
  .tg-t .tg-sub{font-size:12.5px;font-weight:400;color:var(--muted)}
  .tg-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(96px,1fr));gap:8px;margin:9px 0}
  .tg-cell{display:flex;flex-direction:column;gap:3px}
  .tg-cell .tg-lb{font-size:12.5px;color:var(--muted)}
  .tg-in{width:100%;height:34px;border:1px solid var(--line);border-radius:8px;background:#fff;padding:0 8px;font-size:15px;font-weight:600;color:var(--ink);font-family:inherit}
  .tg-in:disabled{background:#f2f4f8;color:var(--muted)}
  .tg-actions{display:flex;gap:8px;align-items:center;flex-wrap:wrap}
  .tg-why{flex:1 1 160px;min-width:140px;height:34px;border:1px solid var(--line);border-radius:8px;background:#fff;padding:0 10px;font-size:13.5px;font-family:inherit;color:var(--ink)}
  .tg-save{height:34px;padding:0 14px;font-size:14px}
  .tg-tip{font-size:12.5px;color:var(--muted);margin-top:7px;min-height:15px}
  .tg-note{font-size:12.5px;color:var(--muted);margin-top:6px;line-height:1.6}
  /* ===== v6.31：老师删除记录 ===== */
  .rec-del-row{margin-top:12px;padding-top:10px;border-top:1px dashed var(--line);display:flex;flex-wrap:wrap;gap:8px;align-items:center}
  .rec-del-btn{border-color:#f0c2c2;color:#c0392b;background:#fff6f6;padding:9px 13px;font-size:13.5px}
  .rec-del-btn:hover{background:#ffecec}
  .rec-del-hint{font-size:12.5px;color:var(--muted);flex:1 1 180px}
  /* ===== v6.33：老师 / 教研室 / 网管「批量删除」讲题记录 =====
     口径：只在管理角色的「全部学生记录」列表里出现，学生端（同学的讲题）整条工具条都不渲染。
     勾选框放在卡片最左（.rec-head 的第一个 flex 子项），点击它**不展开详情**（JS 里拦掉冒泡）。 */
  .rec-batch{display:flex;align-items:center;gap:10px;flex-wrap:wrap;margin:0 0 8px;padding:8px 11px;background:#f6f8fb;border:1px solid var(--line);border-radius:10px;font-size:13px;color:var(--muted)}
  .rec-batch-all{display:flex;align-items:center;gap:5px;cursor:pointer;color:var(--ink);font-weight:600;user-select:none}
  .rec-batch-all input{width:16px;height:16px;cursor:pointer}
  .rec-batch-cnt{margin-left:auto}
  .rec-batch-del{padding:6px 13px;font-size:13.5px;border-color:#f0c2c2;color:#c0392b;background:#fff6f6}
  .rec-batch-del:hover:not(:disabled){background:#ffecec}
  .rec-batch-del:disabled{opacity:.45;cursor:not-allowed}
  .rec-sel{flex:0 0 auto;display:flex;align-items:center;padding:3px 2px 0 0;cursor:pointer}
  .rec-sel input{width:17px;height:17px;cursor:pointer}
  .rec-item.picked{background:#f4f8ff;box-shadow:inset 3px 0 0 #4a7ddb}
  .rec-item.picked .rec-main .nm,.rec-item.picked .rec-avg{color:#1a5fb4}
  .rec-chat-photo{max-width:180px;border-radius:8px;display:block;margin-bottom:4px;cursor:zoom-in}
  /* v6.31：记录里可点开放大的图片统一手势（题目缩略图 / 详情题目大图 / 老师的追问区照片） */
  .rec-thumb{cursor:zoom-in}
  .rec-big{cursor:zoom-in}
  .rec-ask-photo{cursor:zoom-in}
  /* 聊天里的图片气泡（拍题） */
  .chat-bubble.img{padding:4px;background:#fff;max-width:62%}
  .chat-photo{display:block;width:180px;max-width:100%;border-radius:6px;cursor:zoom-in}
  /* 聊天里的巩固练习卡（几何题自动作图） */
  .chat-bubble.prac{padding:0;background:#fff;max-width:90%;overflow:hidden}
  .chat-bubble.prac:before{border-right-color:#fff}
  .chat-msg.me .chat-bubble.prac:before{display:none}
  .prac-head{display:flex;align-items:center;gap:6px;padding:8px 11px;background:linear-gradient(180deg,#eef4ff,#e4edff);border-bottom:1px solid #d8e4fb;font-size:15px;font-weight:600;color:#2b4a8b}
  .prac-head .tag{margin-left:auto;font-size:12px;font-weight:500;color:#5b7bd5;background:#fff;border:1px solid #cfdcfb;border-radius:99px;padding:1px 7px}
  .prac-body{padding:10px 11px}
  .prac-text{font-size:15px;line-height:1.7;color:var(--ink);white-space:pre-wrap}
  .prac-fig{margin:9px auto 0;border:1px solid var(--line);border-radius:10px;background:#fff;padding:2px;max-width:240px}
  .prac-fig svg{display:block;width:100%;height:auto;max-height:240px}
  .prac-cap{text-align:center;font-size:13px;color:var(--muted);margin-top:3px}
  .prac-load{margin-top:8px;font-size:13px;color:var(--muted)}
  .prac-acts{display:flex;gap:8px;margin-top:9px}
  .prac-acts button{flex:1;height:34px;border:1px solid var(--line);background:#f6f8fb;border-radius:8px;font-size:14px;cursor:pointer;color:var(--ink);font-family:inherit}
  .prac-acts button.primary{background:var(--brand);color:#fff;border-color:var(--brand-text);font-weight:600}
  .img-viewer{position:fixed;inset:0;background:rgba(10,15,30,.86);display:flex;align-items:center;justify-content:center;z-index:999;cursor:zoom-out}
  .img-viewer img{max-width:92vw;max-height:88vh;border-radius:10px;background:#fff}
  .chat-hint{font-size:14px;color:var(--muted);margin-top:6px;min-height:17px}
  .chat-done-row{display:flex;gap:8px;margin-top:10px}
  .chat-done-row .btn{flex:1;padding:12px 10px;font-size:15px;font-weight:600}
  .chat-done-row .btn:disabled{opacity:.55}
  .badge-ok{display:inline-block;background:#e6f7ef;color:var(--good-text);border:1px solid #b6e8cf;border-radius:99px;padding:4px 12px;font-size:15px;font-weight:600}

  /* records */
  .rec{display:flex;justify-content:space-between;align-items:center;padding:11px 0;border-bottom:1px solid var(--line)}
  .rec:last-child{border-bottom:none}
  .rec .nm{font-weight:600;font-size:16px}
  .rec .meta{font-size:13px;color:var(--muted)}
  .pill{font-size:13px;padding:3px 9px;border-radius:99px;font-weight:600}
  .pill.pass{background:#e6f7ef;color:var(--good-text)}
  .pill.fail{background:#fff3e0;color:#9E5F00}
  /* v6.31：选择题·无讲解（免评分）—— 视觉必须和「考得差」区分开，
     用灰蓝而不是橙，学生就不会把它当成一条低分错题。 */
  .pill.nd{background:#eef2f8;color:#5b6b8c}
  /* v6.31：免评分的结果卡（结果页 + 记录详情共用） */
  .nodims-box{margin:8px 0;border:1px solid #d8e0f0;border-radius:12px;padding:12px;background:#f7f9fe}
  .nodims-box .nd-t{font-weight:700;font-size:15px;color:#3d4761;margin-bottom:5px}
  .nodims-box .nd-d{font-size:14px;color:#5b6b8c;line-height:1.65;margin-top:4px}
  .nd-actions{display:flex;gap:8px;flex-wrap:wrap;margin-top:10px}
  .nd-actions .btn{flex:1 1 200px}
  /* 列表里那条「选择题·未评分」小标签（不是低分，用中性灰蓝） */
  .rec-dims .rd.nd{color:#5b6b8c;background:#f2f5fa;border-color:#dfe6f2}
  /* 记录卡片：题目缩略图 + 七维，点击展开详情 */
  .rec-item{border-bottom:1px solid var(--line);padding:11px 0;cursor:pointer}
  .rec-item:last-child{border-bottom:none}
  .rec-head{display:flex;gap:10px;align-items:flex-start}
  .rec-thumb{width:54px;height:54px;border-radius:10px;object-fit:cover;border:1px solid var(--line);background:#f6f8fb;flex:0 0 auto}
  .rec-thumb.ph{display:flex;align-items:center;justify-content:center;font-size:10px;color:var(--muted)}
  /* v6.40：纯文字题目的占位 —— 原来是一个灰方块写「无题图」，看着像图裂了。
     现在按题目来源给图标 + 一句题目摘要，既好看又真的有用（老师认得出是哪道题）。 */
  .rec-thumb.txt{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:1px;
    background:#eef4fd;border-color:#d3e2f7;color:#4a6fa5;cursor:default}
  .rec-thumb.txt .rt-ic{font-size:17px;line-height:1}
  .rec-thumb.txt .rt-lb{font-size:9px;line-height:1.15;font-weight:600;letter-spacing:-.2px}
  .rec-qtext{margin-top:3px;font-size:12px;color:#5b6b7f;line-height:1.5;
    display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden;word-break:break-word}
  .rec-main{flex:1 1 auto;min-width:0}
  .rec-dims{display:flex;flex-wrap:wrap;gap:4px;margin-top:5px}
  .rec-dims .rd{font-size:10px;padding:2px 6px;border-radius:99px;background:#f6f8fb;border:1px solid var(--line);color:var(--muted)}
  .rec-dims .rd.ok{color:var(--good-text);border-color:#cdeedd;background:#f0fbf6}
  .rec-dims .rd.low{color:var(--warn-text);border-color:#f3ddc4;background:#fff8ef}
  .rec-right{flex:0 0 auto;text-align:right;display:flex;flex-direction:column;align-items:flex-end;gap:4px}
  .rec-avg{font-size:18px;font-weight:700;color:var(--ink)}
  .rec-detail{margin-top:10px;padding:10px;background:#fbfcfe;border:1px solid var(--line);border-radius:12px}
  .rec-big{width:100%;max-height:260px;object-fit:contain;border-radius:10px;border:1px solid var(--line);background:#fff;margin-bottom:8px}
  /* 记录卡片：题目缩略图 + 七维打分，点击展开详情 */
  .rec-item{padding:11px 0;border-bottom:1px solid var(--line);cursor:pointer}
  .rec-item:last-child{border-bottom:none}
  .rec-head{display:flex;gap:10px;align-items:flex-start}
  .rec-thumb{width:52px;height:52px;border-radius:10px;object-fit:cover;border:1px solid var(--line);background:#f6f8fb;flex:0 0 auto}
  .rec-thumb.ph{display:flex;align-items:center;justify-content:center;font-size:10px;color:var(--muted)}
  .rec-main{flex:1 1 auto;min-width:0}
  .rec-main .nm{font-weight:600;font-size:16px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
  .rec-main .meta{font-size:13px;color:var(--muted)}
  .rec-dims{display:flex;flex-wrap:wrap;gap:4px;margin-top:5px}
  .rec-dims .rd{font-size:10px;padding:2px 6px;border-radius:99px;background:#f6f8fb;border:1px solid var(--line);color:var(--muted)}
  .rec-dims .rd.ok{color:var(--good-text);background:#f0fbf6;border-color:#cdeedd}
  .rec-dims .rd.low{color:var(--warn-text);background:#fff8ef;border-color:#f3ddc4}
  .rec-right{flex:0 0 auto;text-align:right;display:flex;flex-direction:column;align-items:flex-end;gap:4px}
  .rec-avg{font-size:18px;font-weight:700;color:var(--ink);line-height:1}
  .rec-detail{margin-top:10px;padding:10px;background:#fbfcfe;border:1px solid var(--line);border-radius:12px}
  .rec-big{width:100%;max-height:280px;object-fit:contain;border-radius:10px;border:1px solid var(--line);background:#fff;margin-bottom:8px}
  /* v6.6 错题本：过滤 chips + 详情分区标题 + AI 互动留档气泡 */
  .rec-chips{display:flex;gap:8px;margin-bottom:10px}
  .rec-chips .chip{font-size:13px;padding:5px 12px}
  .rec-sec-t{font-weight:600;font-size:14px;color:var(--ink);margin-top:10px}
  .rec-chat{margin-top:6px;border:1px solid var(--line);border-radius:10px;padding:8px 10px;background:#fff}
  /* v6.63：留档块别用小一号字（用户 2026-09-18 原话「没必要小一号字」）——
     字号回到正文档 14.5px；PC / 平板（≥900px）自动**分两列**排版：
     阅读顺序仍是按时间 —— 先读完左列、再读右列；手机窄屏维持单列。 */
  .rc-row{display:flex;gap:8px;margin:6px 0;font-size:14.5px;line-height:1.6;align-items:flex-start}
  .rc-who{flex:0 0 auto;width:26px;height:26px;border-radius:50%;display:flex;align-items:center;justify-content:center;font-size:11px;background:#eef1f6;color:var(--muted);border:1px solid var(--line)}
  .rc-row.rc-me .rc-who{background:#dcecfc;color:#1a5fb4;border-color:#bcd6f5}
  .rc-txt{flex:1 1 auto;min-width:0;word-break:break-word;color:var(--ink)}
  .rc-row.rc-me .rc-txt{color:#1a5fb4}
  @media (min-width:900px){
    .rec-chat{columns:2;column-gap:22px}
    .rc-row{break-inside:avoid}
    .rec-chat-photo{max-width:150px}
  }

  /* class list */
  .stu{padding:11px 0;border-bottom:1px solid var(--line)}
  .stu:last-child{border-bottom:none}
  .stu .row{display:flex;justify-content:space-between;align-items:center}
  .stu .nm{font-weight:600;font-size:16px}
  .stu .sc{font-size:15px;color:var(--muted)}
  .stu .mini{height:6px;background:var(--line);border-radius:99px;margin-top:7px;overflow:hidden}
  .stu .mini i{display:block;height:100%;background:var(--brand)}

  /* bbs（班级圈）*/
  .bbs-post{border:1px solid var(--line);border-radius:12px;padding:12px;background:#fff;margin-bottom:10px;cursor:pointer}
  .bbs-post.pin{border-color:#eeda9a;background:#fffdf4}
  .bbs-post.notice{border-color:#c5dcf3;background:#f7fafe}
  .bbs-post .row{display:flex;justify-content:space-between;align-items:center;gap:8px;margin-bottom:4px;flex-wrap:wrap}
  .bbs-post .nm{font-weight:600;font-size:15px;flex:1 1 auto;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
  .bbs-post .meta{font-size:12px;color:var(--muted)}
  .bbs-tag{display:inline-block;font-size:11px;padding:2px 8px;border-radius:99px;font-weight:600;flex:0 0 auto}
  .bbs-tag.pin{background:#fff3cd;color:#8a6d00;border:1px solid #eeda9a}
  .bbs-tag.notice{background:#e3effc;color:#1c5bad;border:1px solid #c5dcf3}
  .bbs-tag.del{background:#fdeaea;color:#b03a3a;border:1px solid #f0cccc}
  .bbs-tag.anon{background:#eef0f6;color:#5a657f;border:1px solid #d9dde8}
  /* 发帖附件条：拍照 / 图片 / 视频 */
  .bbs-att-bar{display:flex;gap:8px;margin-bottom:8px}
  .bbs-att-btn{flex:1 1 0;height:36px;border:1px dashed #b8c2d8;background:#f6f8fb;border-radius:10px;font:inherit;font-size:13.5px;color:var(--ink);cursor:pointer}
  .bbs-att-btn:active{background:#edf1f8}
  .bbs-att-list{display:flex;gap:8px;flex-wrap:wrap;margin-bottom:8px}
  .bbs-att-item{position:relative;width:76px;height:76px;border-radius:10px;overflow:hidden;border:1px solid var(--line);background:#f2f3f5}
  .bbs-att-item img{width:100%;height:100%;object-fit:cover;display:block}
  .bbs-att-item video{width:100%;height:100%;object-fit:cover;display:block;background:#000}
  .bbs-att-x{position:absolute;top:2px;right:2px;width:20px;height:20px;border:none;border-radius:50%;background:rgba(0,0,0,.55);color:#fff;font-size:12px;line-height:20px;padding:0;cursor:pointer}
  /* 帖子列表缩略图 */
  .bbs-att-thumbs{position:relative;margin-top:6px;width:86px;height:86px;border-radius:10px;overflow:hidden;border:1px solid var(--line);background:#f2f3f5}
  .bbs-att-thumbs img{width:100%;height:100%;object-fit:cover;display:block}
  .bbs-att-badge{position:absolute;right:3px;bottom:3px;background:rgba(0,0,0,.6);color:#fff;font-size:11px;padding:1px 6px;border-radius:8px}
  .bbs-att-video{display:flex;align-items:center;justify-content:center;width:100%;height:100%;font-size:12.5px;color:#5a657f}
  /* 详情 / 审计里的附件展示 */
  .bbs-att-view{display:flex;gap:8px;flex-wrap:wrap;margin-top:8px}
  .bbs-att-view img{width:150px;height:150px;object-fit:cover;border-radius:10px;border:1px solid var(--line);cursor:zoom-in}
  .bbs-att-view video{width:100%;max-width:320px;border-radius:10px;border:1px solid var(--line);background:#000}
  .bbs-preview{font-size:13px;color:#5a657f;line-height:1.6;margin-top:4px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
  .bbs-detail{margin-top:10px;padding:11px;background:#fbfcfe;border:1px solid var(--line);border-radius:12px}
  .bbs-content{font-size:14px;line-height:1.75;white-space:pre-wrap;color:var(--ink)}
  .bbs-reply{padding:9px 0;border-bottom:1px solid var(--line);font-size:13.5px;line-height:1.65}
  .bbs-reply:last-child{border-bottom:none}
  .bbs-reply .rmeta{font-size:12px;color:var(--muted);margin-bottom:3px;display:flex;gap:6px;align-items:center;flex-wrap:wrap}
  .bbs-reply .rmeta b{color:var(--ink);font-size:12.5px}
  .bbs-acts{display:flex;gap:8px;margin-top:10px;flex-wrap:wrap}
  .bbs-acts button{flex:1 1 auto;min-width:84px;height:34px;border:1px solid var(--line);background:#f6f8fb;border-radius:8px;font-size:13.5px;cursor:pointer;color:var(--ink);font-family:inherit}
  .bbs-acts button.warn{color:#b03a3a;border-color:#ecc8c8;background:#fdf5f5}
  .bbs-acts button.primary{background:var(--brand);color:#fff;border-color:var(--brand-text);font-weight:600}
  .bbs-compose input,.bbs-compose textarea{width:100%;border:1px solid var(--line);border-radius:12px;padding:11px 12px;font:inherit;font-size:15px;background:#fbfcfe;color:var(--ink);margin-bottom:8px;box-sizing:border-box}
  .bbs-compose textarea{min-height:72px;resize:vertical}
  .bbs-count{font-size:12px;color:var(--muted);text-align:right;margin-top:2px}
  .bbs-reply-input{display:flex;gap:8px;margin-top:10px}
  .bbs-reply-input textarea{flex:1 1 auto;min-height:44px;border:1px solid var(--line);border-radius:12px;padding:10px 12px;font:inherit;font-size:14px;background:#fbfcfe;color:var(--ink);resize:vertical}
  .bbs-reply-input button{flex:0 0 auto;height:40px;padding:0 16px;border:1px solid var(--brand);background:var(--brand);color:#fff;border-radius:12px;font:inherit;font-size:14px;font-weight:600;cursor:pointer}

  .loader{display:flex;flex-direction:column;align-items:center;gap:10px;padding:30px 0;color:var(--muted)}
  .spinner{width:34px;height:34px;border:3px solid var(--line);border-top-color:var(--brand-text);border-radius:50%;animation:spin .8s linear infinite}
  @keyframes spin{to{transform:rotate(360deg)}}

  /* ---------- v6.24：登录页重做（用户反馈「很丑」）；v6.25 按用户要求回退其中两处 ----------
     v6.25 回退①：删掉顶部淡蓝渐变，回到原来的纯白。原因：logo.png 是**白底不透明**图，
     压在渐变上会显出一块白方框 —— 用户原话「logo 背景就看不出来，没有嵌入的感觉」。
     v6.25 回退②：七维由小色块换回原来的一行灰字（顺序用用户给的新序）。
     v6.31 晚：那行灰字已按用户要求删除 —— 七个维度名与分数直接标在登录页的热力图上。
     保留 v6.24 的：③ 输入区去 inline style；④ 主按钮加高 + 渐变 + 投影。 */
  #loginScreen{position:relative;min-height:100%;display:flex;flex-direction:column;justify-content:flex-start;padding:30px 16px 22px}
  #loginScreen>*{position:relative;z-index:1;width:100%;max-width:none;margin-left:auto;margin-right:auto}
  #loginScreen .card{margin-top:22px}
  .login-card{padding:18px 16px 16px;border-radius:18px;border:1px solid #e3eaf7;box-shadow:0 10px 26px rgba(28,35,51,.07)}
  .login-card .field.row{margin-bottom:12px}
  #loginScreen .field.row label{font-size:14px;color:#5c6789}
  #loginScreen .field.row input,#loginScreen .field.row select{border:1px solid #e1e8f4;border-radius:12px;padding:12px;font:inherit;font-size:16px;background:#fafcff;color:var(--ink)}
  #loginScreen #loginBtn{margin-top:8px;padding:15px;border-radius:14px;font-size:16.5px;font-weight:700;letter-spacing:3px;background:linear-gradient(135deg,#4a7bf6,#2f5fe0);box-shadow:0 8px 20px rgba(58,109,240,.28)}
  /* ===== v7.194：登录双入口（手机登录 / 账号登录） ===== */
  .login-tabs{display:flex;gap:8px;margin-bottom:14px;background:#eef2fb;border-radius:12px;padding:4px}
  .login-tabs .ltab{flex:1 1 0;border:0;border-radius:9px;padding:9px 0;font:inherit;font-size:15px;font-weight:600;color:#7a85a5;background:transparent;cursor:pointer;transition:background .15s,color .15s}
  .login-tabs .ltab.on{background:#fff;color:#2f5fe0;box-shadow:0 2px 8px rgba(31,64,150,.12)}
  #phoneLoginBox .sms-row{display:flex;gap:8px;flex:1 1 auto;min-width:0}
  #phoneLoginBox .sms-row input{flex:1 1 auto;min-width:0}
  #phoneLoginBox .sms-btn{flex:0 0 auto;border:1px solid #d5e0f6;border-radius:12px;padding:0 12px;font:inherit;font-size:14px;font-weight:600;color:#2f5fe0;background:#f2f6ff;cursor:pointer;white-space:nowrap}
  #phoneLoginBox .sms-btn:disabled{color:#a9b2c7;background:#f4f6fa;border-color:#e6eaf3;cursor:default}
  #phoneLoginBtn{margin-top:8px;width:100%;padding:15px;border-radius:14px;border:0;font-size:16.5px;font-weight:700;letter-spacing:3px;color:#fff;background:linear-gradient(135deg,#4a7bf6,#2f5fe0);box-shadow:0 8px 20px rgba(58,109,240,.28);cursor:pointer}
  #phoneLoginBtn:disabled{opacity:.7;cursor:default}
  #phoneLoginBox .login-note{margin:10px 0 0;font-size:12px;color:#a9b2c7;text-align:center}
  .login-ver{margin:18px 0 0;font-size:12px;color:#a9b2c7;text-align:center;letter-spacing:.5px}
  /* v6.31 晚·二改：那条第 v6.23b 提示条已按用户要求**整体删除**（容器 / 样式 / 渲染函数 / 调用点），
     登录页顶部不再有任何 «收到分享» 预告 —— 深链接落页行为本身不变（见 afterLogin）。 */

  /* ===== v6.27：记录详情新版式 =====
     诉求（用户 2026-09-14）：① 题目照片旁边配上七维雷达图，两个图放一排；
     ② 去掉「精度 75 / 高度 60 …」那排矩形数字方框（数字改由雷达图承载，不再重复）；
     ③ 「我的讲解」文字版放到图下面，然后才是 AI 点评与 AI 互动。 */
  /* v6.44：原来题目照片只占 45% 宽、168px 高（为了和右侧雷达图齐平），
     教研室打开记录根本看不清题 —— 用户原话「记录打开后页面排版给图片的空间太小」。
     改成：照片**整行**、高度自适应最高 420px；雷达图让位到第二行居中，不再与图抢宽度。 */
  .rec-fig{display:flex;flex-wrap:wrap;gap:10px;align-items:stretch;margin:2px 0 10px;max-width:none}
  /* v6.52：题目图转正 —— 按钮贴在图的右下角，不挡题干 */
  .rec-fig-img{position:relative}
  .rec-rotate{position:absolute;right:6px;bottom:6px;z-index:2;
    display:inline-flex;align-items:center;gap:4px;
    background:rgba(255,255,255,.94);border:1px solid var(--line);color:var(--fg);
    border-radius:14px;padding:4px 10px;font-size:12.5px;line-height:1.6;cursor:pointer;
    box-shadow:0 1px 4px rgba(0,0,0,.10)}
  .rec-rotate:active{background:#eef3ff}
  .rec-rotate[disabled]{opacity:.6;cursor:default}
  /* v6.31：免评分记录没有雷达图，题目照片拉通整行 */
  .rec-fig.single{max-width:none}
  .rec-fig.single .rec-fig-img{flex:1 1 100%;height:auto;max-height:420px}
  /* 题目照片：与雷达图**同排**（照片为主，占 56%） */
  .rec-fig-img{flex:1 1 56%;min-width:240px;height:auto;min-height:150px;max-height:360px;display:flex;align-items:center;justify-content:center;
    overflow:hidden;background:#fff;border:1px solid var(--line);border-radius:10px}
  .rec-fig-img .rec-big{width:100%;height:auto;max-height:360px;object-fit:contain;border:none;border-radius:0;margin:0;background:transparent}
  .rec-noimg{font-size:12px;color:var(--muted);text-align:center;padding:0 8px;line-height:1.6}
  /* 七维雷达图：与题目照片同一行（v6.45 改回同排 —— 用户原话「热力图放同一行其实也可以」） */
  .rec-fig-radar{flex:1 1 34%;min-width:200px;min-height:200px;display:flex;flex-direction:column;align-items:center;justify-content:center;
    background:#fff;border:1px solid var(--line);border-radius:10px;padding:6px}
  .rec-fig-radar .rec-radar{display:block;width:100%;height:auto;max-width:240px;max-height:180px}
  .rec-fig-cap{font-size:11px;color:var(--muted);margin-top:2px;white-space:nowrap}
  /* 我的讲解文字版：其它位置（讲题结果页）仍在使用 */
  .rec-talk{white-space:pre-wrap;word-break:break-word;font-size:14px;line-height:1.75;color:var(--ink);
    margin:6px 0 0;padding:10px 12px;background:#fff;border:1px solid var(--line);border-radius:10px}

  /* ============================================================
     v6.45：详情页 = Word 式正文 + PC 左右两栏
     用户原话：「像 word 一样整体排版不要分太细，在解题过程中在旁边标出是精度、
     高度、深度、广度等问题，而不是底下统一说，上下来回看不方便」「PC 布局很散」。
     ① 讲解稿就是连续段落（首行缩进、段间留白）—— 不再一条条切格子、**不再有横线**；
     ② 出问题的句子高亮，**紧跟其后的小标签**直接写「哪个维度 · 什么问题」，
        标注长在句子旁边，不用滚到底下去对号入座；
     ③ PC（≥1024px）整体左右两栏：正文在左、点评在右，就近看，不来回跑。
     ============================================================ */
  .doc{display:grid;grid-template-columns:minmax(0,1fr);gap:12px;margin-top:10px}
  .doc-main{min-width:0}
  .doc-side{min-width:0;display:flex;flex-direction:column;gap:10px}
  /* v6.46：右栏宽度是可变的（用户要求「左右可以调整区域」）。
     --doc-side-w 挂在 :root 上，拖动分隔条时改这一处，所有 .doc 同步。 */
  :root{--doc-side-w:330px}
  .doc-split{display:none}
  /* 讲解稿纸面：一张整纸，段落之间只有留白 */
  .tl-sheet{margin:6px 0 0;padding:16px 16px 12px;background:#fff;border:1px solid var(--line);border-radius:12px}
  .tl-par{margin:0 0 .8em;font-size:15px;line-height:2;color:#2c3445;
    text-indent:2em;white-space:pre-wrap;word-break:break-word}
  .tl-par:last-child{margin-bottom:0}
  /* 被批注的句子：底色 + 下划线，字号不变（不破坏原文排版） */
  .tl-m{border-radius:3px;padding:1px 2px;font-weight:600;border-bottom:2px solid currentColor}
  /* 紧跟其后的行内标注：就长在句子旁边（这是「在解题过程中标出」的落点） */
  .tl-tag{display:inline;font-size:12px;font-weight:700;line-height:1.5;margin:0 3px;padding:1px 6px;
    border-radius:6px;border:1px solid currentColor;vertical-align:1px;cursor:help}

  /* ---- v6.46：颜色只留两种语言（用户原话：「问题部分改红字字体…用蓝色字体」）----
     v6.44/45 是**每个维度一种颜色**（精度红/深度绿/广度蓝…），结果一页七色，
     反而看不出到底哪句是问题、哪句只是注释。现在统一：
       红字＝这句话有问题；蓝字＝说明它是八个度里的哪一个、问题是什么。
     写 .tl-par mark.tl-m（3 个类）是为了压住下面 .tl-m.tl-p 那批按维度上色的旧规则，
     不用 !important —— 旧配色还要给「降级块」的维度标签用。 */
  .tl-par mark.tl-m{color:#d93025;font-weight:600;padding:0 1px;border-radius:0;
    background:transparent;border-bottom:1px dashed rgba(217,48,37,.5)}
  /* v6.47b：讲解区**字号统一** —— 蓝字不再是小一号的小标签，
     与正文同一档（font-size:inherit），只靠「蓝色 + 虚下划线」区分，
     这样整段讲解看起来是一篇连续的文章，而不是被一堆小芯片打断。 */
  .tl-par .tl-tag{font-size:inherit;font-weight:600;color:#1560d8;background:transparent;
    border:none;border-bottom:1px dashed rgba(21,96,216,.55);padding:0 1px;margin:0 2px}
  .tl-par .tl-tag:hover,.tl-par .tl-tag:focus{background:#eaf1ff;outline:none}
  /* 浮动提示：hover / 键盘聚焦都出（专设 tabindex，平板上点一下也能看） */
  .tl-pop{position:fixed;z-index:99999;max-width:320px;padding:11px 13px;border-radius:10px;
    background:#1f2735;color:#fff;font-size:15px;line-height:1.85;
    box-shadow:0 8px 26px rgba(0,0,0,.24);pointer-events:none;
    opacity:0;transform:translateY(-3px);transition:opacity .13s,transform .13s}
  .tl-pop.on{opacity:1;transform:translateY(0)}
  .tl-pop .pp-d{color:#8ab4ff;font-weight:700}
  .tl-pop .pp-t{display:block;color:#c7d3e2;font-style:normal;margin-top:4px;font-size:14.5px}
  /* v6.47：正确答案与解题过程（题目之后、讲解之前）
     为什么放在这里：先知道「正确长什么样」，再读学生的讲解才对得上号。 */
  .tl-ref{margin:8px 0 0;padding:12px 14px;background:#f6fbf8;border:1px solid #cfe9db;
    border-radius:12px;font-size:15px;line-height:1.95}
  .tl-ref-t{font-weight:700;color:#1d7a45;font-size:15px;margin-bottom:6px}
/* v6.53 可折叠：整行可点（触屏友好），箭头 + 说明一起给出「点得动」的信号 */
.tl-ref-t[data-ref-fold]{cursor:pointer;user-select:none}
.tl-ref-t[data-ref-fold]:focus-visible{outline:2px solid #7aa7ff;outline-offset:2px;border-radius:4px}
.tl-ref-ar{display:inline-block;width:15px;color:#1d7a45}
.tl-ref-fold .tl-ref-t{margin-bottom:0}
/* v6.53：右栏两块（逐句批注 / AI 点评）折叠 —— 与正解卡同一套观感 */
/* v6.61d：整行都是点击区（三角只是状态指示）—— 原来只有那个 15px 的三角可点，
   老师瞄不准就以为「折叠不了」。给 hover 反馈，让人一眼看得出「这一行能点」。 */
.tl-fold-t[data-fold]{cursor:pointer;user-select:none;padding:3px 6px 3px 2px;margin-left:-2px;
  border-radius:6px;transition:background .12s}
.tl-fold-t[data-fold]:focus-visible{outline:2px solid #7aa7ff;outline-offset:2px;border-radius:6px}
.tl-fold-t[data-fold]:hover{background:#eef3fb}
.tl-fold-ar{display:inline-block;width:15px;color:#6b7c90}
.tl-fold-t[data-fold]:hover .tl-fold-ar{color:#2f6feb}
/* v6.53：就地回答框（长在被批注的那句话下面） */
.inline-ask{margin:8px 0 10px;padding:10px 12px;border:1px solid #cdc0f0;background:#faf8ff;border-radius:10px}
.ia-q{font-size:13.5px;color:#5b3fa8;font-weight:700;line-height:1.7}
/* v6.82：这条讨论线的归属说明 —— 一眼看清「这一条只聊这一处」 */
.ia-th{margin-top:5px;padding:3px 8px;border-radius:6px;background:#f0ecfb;color:#6a4fc0;
  font-size:11.5px;line-height:1.6}
.ia-ta{width:100%;box-sizing:border-box;margin-top:6px;padding:8px 10px;border:1px solid var(--line);
  border-radius:8px;font-size:14.5px;line-height:1.8;resize:vertical;font-family:inherit;color:#22303f;background:#fff}
.ia-row{display:flex;align-items:center;gap:8px;margin-top:7px;flex-wrap:wrap}
.ia-send{padding:7px 14px;font-size:13.5px;border:1px solid #b9a7e8;background:#6f4fd8;color:#fff;
  border-radius:8px;cursor:pointer}
.ia-send:disabled{opacity:.6;cursor:default}
.ia-close{padding:7px 12px;font-size:13.5px;border:1px solid var(--line);background:#fff;
  color:var(--muted);border-radius:8px;cursor:pointer}
.ia-tip{font-size:12.5px;color:var(--muted)}
/* v6.63：就地追问框的历史聊天区 —— 像微信：历史在上、输入框常驻在下；
   历史太长自己滚（最长 260px），不会把输入框顶出屏外 */
.ia-log{margin-top:8px;display:flex;flex-direction:column;gap:8px;max-height:260px;overflow-y:auto}
.ia-log .chat-msg{font-size:13.5px}
  .tl-ref-t em{font-style:normal;font-weight:400;color:var(--muted);font-size:12.5px;margin-left:6px}
  .tl-ref-row{display:flex;gap:8px;align-items:flex-start;margin-top:3px}
  .tl-ref-row .k{flex:0 0 40px;color:#1d7a45;font-weight:700}
  .tl-ref-row .v{color:#22303f;white-space:pre-wrap;word-break:break-word;min-width:0}
  /* ---------- v6.65：正解卡「简析 / 详解」开关 + 三阶段详解 ---------- */
  .tl-ref-mode{display:flex;align-items:center;gap:6px;margin:2px 0 8px;flex-wrap:wrap}
  .tl-ref-mb{padding:3px 12px;font-size:13px;font-family:inherit;border:1px solid #cfe9db;
    background:#fff;color:#1d7a45;border-radius:999px;cursor:pointer}
  .tl-ref-mb:hover{background:#eef7f2}
  .tl-ref-mb.on{background:#1d7a45;color:#fff;border-color:#1d7a45}
  .tl-ref-mode em{font-style:normal;font-weight:400;color:var(--muted);font-size:12.5px;margin-left:4px}
  .tl-ref-loading{margin:6px 0;padding:10px 12px;border:1px dashed #cfe9db;background:#fff;
    border-radius:8px;color:var(--muted);font-size:14px}
  .rd-sec{margin:8px 0 12px;border:1px solid #dfeee6;border-radius:8px;background:#fff;overflow:hidden}
  .rd-t{padding:7px 11px;font-weight:700;color:#1d7a45;font-size:14.5px;background:#f1f9f5;
    border-bottom:1px solid #dfeee6}
  .rd-t em{font-style:normal;font-weight:400;color:var(--muted);font-size:12.5px;margin-left:6px}
  .rd-b{padding:9px 12px}
  .rd-p{color:#22303f;line-height:1.75;word-break:break-word}
  .rd-plans{margin-top:7px;display:flex;flex-direction:column;gap:5px}
  .rd-plan{display:flex;gap:7px;align-items:flex-start;font-size:14px;color:#22303f;line-height:1.7}
  .rd-pi{flex:0 0 19px;height:19px;border-radius:50%;background:#1d7a45;color:#fff;font-size:12px;
    display:flex;align-items:center;justify-content:center;margin-top:2px}
  .rd-plan-t{margin:6px 0 4px;font-weight:700;color:#1d7a45;font-size:14px}
  .rd-steps{margin:0 0 6px;padding-left:20px}
  .rd-steps li{margin:5px 0;line-height:1.75;color:#22303f}
  .rd-st{word-break:break-word}
  .rd-tag{display:inline-block;margin-left:6px;padding:1px 7px;font-size:12px;border-radius:999px;
    background:#eef3fd;border:1px solid #c7d6f2;color:#2a5fae;white-space:nowrap;vertical-align:1px}
  .rd-up{margin:9px 0 0}
  .rd-up:first-child{margin-top:0}
  .rd-uk{display:inline-block;margin-bottom:3px;font-weight:700;color:#1d7a45;font-size:13.5px;
    background:#f1f9f5;border:1px solid #dfeee6;border-radius:6px;padding:1px 8px}
  .rd-uv{margin-top:4px;color:#22303f;line-height:1.75;word-break:break-word}
  .rd-sec .math-blk,.rd-sec .katex-display{max-width:100%;overflow-x:auto;overflow-y:hidden}
  /* ------------------------------------------------------------
     v6.47c：字号 / 行距定档（用户 2026-09-16 指定）
       左侧区（讲解稿、红字、蓝字、正解卡）：15px，行距 1.9
       浮动提示：15px，行距 1.8
       右侧区（逐句批注 + AI 点评）：15px，行距 1.8
     为什么单独写一段：上面那些规则散在 v6.44~v6.47b 各版本里，还有
     ≥700 / ≥1024 两处媒体查询在改字号（15 / 15.5 混着）。用户要的是
     「整片区域一个字号」，这里用**更高优先级的选择器**一次性压平，
     不去逐个改历史规则（改多了容易漏、也容易把别的页面带跑）。
     ------------------------------------------------------------ */
  .tl-sheet .tl-par,
  .tl-sheet mark.tl-m,
  .tl-sheet .tl-par .tl-tag{font-size:15px;line-height:1.9}
  /* v6.61：正解卡行高 1.9 → 1.7 —— 用户原话「答案排版段间距太大，浪费很多空间」。
     行距不动语义只动密度；正解卡以「对照标尺」为主，紧凑一点更好读。 */
  .tl-ref,.tl-ref .tl-ref-row .v,.tl-ref .tl-ref-row .k{font-size:15px;line-height:1.7}
  .tl-ref-t{font-size:15px;line-height:1.9}
  .tl-pop,.tl-pop .pp-t,.tl-pop .pp-r{font-size:15px;line-height:1.8}
  .doc-side{font-size:15px;line-height:1.8}
  .doc-side p,.doc-side .muted,.doc-side .rec-sec-t,
  .doc-side .fb-line,.doc-side .fb-v,.doc-side .fb-k,.doc-side .fb-label,
  .doc-side .ann-q,.doc-side .ann-l,.doc-side .sim-bar,
  .doc-side .tl-dn,.doc-side .tl-dn-row,.doc-side .tl-dn-v{font-size:15px;line-height:1.8}
  /* v6.47b：右栏「逐句批注」清单 —— 左边只留一句简短校正，完整说法都在这里。
     教研的流程变成：左边扫红字 → 右边看这一处的完整问题与改法。 */
  .ann-list{margin-top:8px}
  .ann-item{border-left:3px solid var(--brand);background:#f8fafd;border-radius:0 8px 8px 0;
    padding:7px 10px;margin-top:6px}
  .ann-q{color:#5a6577;font-size:14.5px;line-height:1.7;word-break:break-word}
  .ann-l{margin-top:3px;font-size:15px;line-height:1.8;color:#22303f}
  .ann-d{display:inline-block;font-weight:700;color:#1560d8;margin-right:6px}  .ann-fix{color:#1d7a45}
  /* v7.54：批注标签旁的弱分徽标 —— 这一维待提升（<80）且这条批注正好点到了它，
     分数就长在批注上（点开就地线说理由，AI 认可按原权重上调）。
     模块 3 的维度卡整卡退场，这就是这一维唯一的分数与互动入口。
     警示色用深测模块弱维同款琥珀口径（#B7761A），不另起一套红。 */
  .ann-score{display:inline-block;margin-left:6px;padding:1px 8px;border-radius:999px;
    font-size:12px;font-weight:700;color:#B7761A;background:#fdf3e1;border:1px solid #e8c98f;
    cursor:pointer;white-space:nowrap;vertical-align:middle}
  .ann-score:hover{background:#f7e6c4;border-color:#d9a84e}
  .ann-score:active{background:#f0dcb0}
  /* v6.51：待确认维度（广度/深度/高度）的批注是**追问**，不是判定 ——
     判定＝实心色块（红/橙系），追问＝浅紫底 + 虚线下划线 + 括号里写「AI 追问·维度」，一眼要能分开。 */
  .tl-tag.tl-tag-ask{background:#f4f0fd;color:#5b3fa8;border-bottom:1px dashed #9b86d6}
  .tl-tag.tl-tag-ask:hover,.tl-par .tl-tag.tl-tag-ask:focus{background:#ebe3fa;outline:none}
  .ann-d-ask{color:#5b3fa8 !important}
  .ann-ask-hint{color:#6b7280;font-size:13.5px}
  .ann-ask-note{font-weight:400;color:#5b3fa8;font-size:12.5px}
  .ann-ask-btn{margin-top:6px;border:1px solid #cdc0f0;background:#f7f4fe;color:#5b3fa8;
    border-radius:6px;padding:4px 10px;font-size:13px;cursor:pointer}
  .ann-ask-btn:active{background:#ebe4fa}
  /* 讲解太短的降级：明说「没逐句标注」，而不是让人以为漏标了 */
  /* v6.48：老记录的「补做逐句标注」入口 —— 一条都没有标记时顶上来，点了当场补 */
  .tl-head{display:flex;flex-wrap:wrap;align-items:baseline;justify-content:space-between;
    gap:8px}
  .tl-fill{display:flex;flex-wrap:wrap;align-items:center;gap:8px;justify-content:flex-end}
  /* v6.50：老记录没有正确答案时的补做卡 —— 与正解卡同一外观，只是中间换成按钮 */
  .tl-ref-fill .tl-fill{justify-content:flex-start;margin-top:8px}
  /* v6.56d：正解卡内部追加的「重新生成完整版」—— 与卡片主体用一条虚线分开 */
  .tl-ref-redo{justify-content:flex-start;border-top:1px dashed #e6e8ee;margin-top:10px;padding-top:9px}
  .tl-ref-btn{padding:7px 12px;font-size:13.5px;border:1px solid #c7d6f2;background:#eef3fd;
    color:#1560d8;border-radius:9px;cursor:pointer;font-weight:600}
  .tl-ref-btn:hover{background:#e2ebfd}
  .tl-ref-btn:disabled{opacity:.6;cursor:default}
  /* v6.58：模型「原地打转」写出来的正解 —— 卡内先给一句人话，再给重新生成按钮。
     配色与 .tl-short / .tl-fill-tip 一路（暖底 + 深棕字），不引入新色系。 */
  .tl-ref-warn{margin:10px 0 0;padding:9px 12px;border:1px solid #f0d9b5;background:#fffaf1;
    border-radius:10px;font-size:13.5px;line-height:1.7;color:#8a5a12}
  /* v6.49：开关开启态（标记正显示着）*/ 
  .tl-fill-btn.on{background:#eaf1ff;border-color:#a9c2f0;color:#1560d8}
  .tl-fill-btn{flex:0 0 auto;border:1px solid var(--brand);background:#fff;color:var(--brand-text);
    font-size:14px;font-weight:600;padding:8px 14px;border-radius:10px;cursor:pointer}
  .tl-fill-btn:hover{background:#f2f7ff}
  .tl-fill-btn:disabled{opacity:.55;cursor:not-allowed}
  .tl-fill-tip{flex:0 1 auto;font-size:12.5px;line-height:1.6;color:var(--muted)}
  /* v6.61d：生成失败的原因留在卡上（toast 两秒就没了，老师来不及看清） */
  .tl-fill-err{color:#c0392b;font-weight:600}
  .tl-short{margin:6px 0 0;padding:9px 12px;border:1px dashed var(--line);border-radius:10px;
    background:#fbfcfe;font-size:13.5px;color:var(--muted);line-height:1.7}
  /* 左右联动：鼠标停在左边的蓝色标注上，右边对应维度的点评卡同步高亮 */
  .fb-dim.tl-link{outline:2px solid var(--brand);outline-offset:2px;border-radius:10px;
    box-shadow:0 0 0 4px rgba(58,110,220,.10)}
  .tl-pop .pp-r{display:block;margin-top:5px;padding-top:5px;border-top:1px solid rgba(255,255,255,.16);
    color:#9fb2c9;font-size:12px}
  .tl-pop .pp-r b{color:#c9b6ff;font-weight:700}
  .tl-pop .pp-r{font-size:13.5px;line-height:1.75}
  /* v6.83：「点开就在原地跟 AI 聊」—— 原来它是原生 title（另一个黑框），
     会与本提示叠在一起；现在收编成提示的最后一行，全站只剩这一个黑底白字的框。 */
  .tl-pop .pp-open{display:block;margin-top:6px;padding-top:5px;
    border-top:1px solid rgba(255,255,255,.16);
    color:#ffd479;font-size:13px;line-height:1.7;font-weight:600}
  /* 老记录没有句子级批注时的**降级**：维度级旁注，并明说没定位到句子 */
  .tl-dn{margin:8px 0 0;padding:10px 12px;border:1px dashed var(--line);border-radius:10px;background:#fbfcfe}
  .tl-dn-t{font-size:12px;color:var(--muted);margin-bottom:6px}
  .tl-dn-row{display:flex;gap:8px;align-items:flex-start;margin-top:6px;font-size:13.5px;line-height:1.75}
  .tl-dn-lb{flex:0 0 auto;font-weight:700}
  .tl-dn-v{color:var(--ink)}
  /* 平板（≥700px，学生主力）：正文再舒展一点 */
  @media (min-width:700px){
    .tl-par{font-size:15.5px;line-height:2.05}
  }
  /* v7.52：手机端（<700px）模块 1 紧凑化 —— 用户原话「在手机端点开这个讲题记录的话，
     就看不到热力图」「底下大片的空白，这个很难看」：
     · 照片框限高 260px（原来 360px 一口吃掉大半屏，热力图被挤到一整屏之外）；
     · 热力图整行居中、紧跟照片下方（300px 宽以下本就是换行堆叠，这里把尺寸收紧）；
     · 消除照片 object-fit 留白带来的「大片空白」观感。 */
  @media (max-width:699px){
    .rec-fig{gap:8px;margin:2px 0 8px}
    .rec-fig-img,.rec-fig.single .rec-fig-img{flex:1 1 100%;min-width:0;min-height:0;max-height:260px}
    .rec-fig-img .rec-big{max-height:260px}
    .rec-fig-radar{flex:1 1 100%;min-width:0;min-height:0;padding:8px 6px 6px}
    .rec-fig-radar .rec-radar{max-width:220px;max-height:190px}
    .rec-fig-cap{margin-top:0}
  }
  /* PC（≥1024px）：老师 / 教研室 / 网管主战场 —— 左右两栏 */
  @media (min-width:1024px){
    /* v6.46：中间多出一列 12px 的拖拽条；宽度由 --doc-side-w 控制（可拖、持久化） */
    .doc{grid-template-columns:minmax(0,1fr) 12px var(--doc-side-w);gap:0;align-items:start}
    /* v7.52：记录详情撤掉右栏 —— .doc-one 单栏变体，正文占满整行
       （沙盘页 sim 仍用上面的三列布局，不受影响） */
    .doc.doc-one{grid-template-columns:minmax(0,1fr);gap:12px}
    /* 原 .doc-side 的排版口径搬到正文流里，点评字号不因合并而变小 */
    .doc-one .muted{font-size:14px;line-height:1.8}
    .doc-one .fb-dim{margin:8px 0}
    .doc-split{display:block;align-self:stretch;position:relative;cursor:col-resize;
      touch-action:none;background:transparent;border:none;padding:0}
    .doc-split::before{content:'';position:absolute;left:50%;top:6px;bottom:6px;width:2px;
      margin-left:-1px;background:var(--line);border-radius:2px;transition:width .12s,background .12s}
    .doc-split:hover::before,.doc-split:focus::before,.doc-split.on::before{
      width:4px;margin-left:-2px;background:var(--brand)}
    .doc-split::after{content:'\22EE';position:absolute;left:0;right:0;top:50%;
      transform:translateY(-50%);text-align:center;color:var(--muted);font-size:14px;line-height:1}
    .doc-split:focus{outline:none}
    /* 右栏吸顶：正文很长时点评始终在视野里，不用滚回顶部找 */
    .doc-side{position:sticky;top:10px;max-height:calc(100vh - 30px);overflow:auto}
    .tl-sheet{padding:20px 24px 16px}
    .tl-par{font-size:15.5px;line-height:2.1}
    .rec-fig-img,.rec-fig.single .rec-fig-img{max-height:420px}
    .rec-fig-img .rec-big{max-height:420px}
    .rec-fig-radar{min-height:230px}
    .rec-fig-radar .rec-radar{max-width:280px;max-height:200px}
    /* 用户原话「点评部分太远字太小」—— 现在就近了，字也放大到正文级 */
    .doc-side .muted{font-size:14px;line-height:1.8}
    .doc-side .rec-sec-t{font-size:15px}
    .doc-side .fb-dim{margin:8px 0}
  }
  /* 七维 + 知识点各一色（正文高亮 / 行内标注 / 旁注共用一套色） */
  .tl-p{color:#c0392b}  .tl-m.tl-p{background:#fdecea}   .tl-tag.tl-p{background:#fdecea}
  .tl-h{color:#7d3c98}  .tl-m.tl-h{background:#f5eef8}   .tl-tag.tl-h{background:#f5eef8}
  .tl-b{color:#1f618d}  .tl-m.tl-b{background:#eaf2f8}   .tl-tag.tl-b{background:#eaf2f8}
  .tl-d{color:#0e6655}  .tl-m.tl-d{background:#e8f6f3}   .tl-tag.tl-d{background:#e8f6f3}
  .tl-o{color:#b7580f}  .tl-m.tl-o{background:#fdf2e9}   .tl-tag.tl-o{background:#fdf2e9}
  .tl-s{color:#1e8449}  .tl-m.tl-s{background:#eafaf1}   .tl-tag.tl-s{background:#eafaf1}
  .tl-v{color:#5d6d7e}  .tl-m.tl-v{background:#eef1f4}   .tl-tag.tl-v{background:#eef1f4}
  .tl-k{color:#a04000}  .tl-m.tl-k{background:#fdf0e6}   .tl-tag.tl-k{background:#fdf0e6}
  /* 分享入口 */
  .rec-share-row{display:flex;align-items:center;gap:8px;flex-wrap:wrap;margin-top:12px}
  .rec-share-btn{padding:9px 14px;font-size:14px}
  .rec-share-hint{font-size:12px;color:var(--muted)}
  /* 分享弹层（sh- 前缀；fb- 归七维点评、gf- 归吐槽，避免串味） */
  .sh-mask{position:fixed;inset:0;background:rgba(15,22,40,.45);z-index:130;display:flex;align-items:flex-end;justify-content:center}
  .sh-card{width:100%;max-width:520px;max-height:90vh;overflow:auto;background:var(--card);border-radius:18px 18px 0 0;
    padding:16px 16px calc(16px + env(safe-area-inset-bottom,0px));box-shadow:0 -10px 30px rgba(15,22,40,.2)}
  .sh-head{display:flex;justify-content:space-between;align-items:center;gap:8px}
  .sh-title{font-size:17px;font-weight:700;color:var(--ink)}
  .sh-x{border:none;background:transparent;font-size:20px;line-height:1;color:var(--muted);cursor:pointer;padding:2px 8px;font-family:inherit}
  .sh-sub{font-size:13px;color:var(--muted);line-height:1.7;margin:6px 0 10px}
  .sh-link{width:100%;font:inherit;font-size:13px;padding:10px 12px;border:1px solid var(--line);border-radius:10px;
    background:#f7f9fc;color:var(--ink);word-break:break-all}
  .sh-link:focus{outline:none;border-color:var(--brand-text);background:#fff;box-shadow:0 0 0 3px rgba(58,109,240,.15)}
  .sh-actions{display:flex;gap:8px;flex-wrap:wrap;margin-top:12px}
  .sh-actions .btn{flex:1 1 46%}
  .sh-tip{margin-top:10px;font-size:12.5px;color:var(--muted);line-height:1.7}
  /* v6.32：分享卡片编辑区（sc- 前缀 —— 落笔前做过全库类名占用普查，零占用；
     与 sh-（分享弹层）区分开，避免「同容器里既有 .sh- 规则又有 .sc- 规则」互相串味） */
  .sc-box{margin-top:14px;padding-top:12px;border-top:1px dashed var(--line)}
  .sc-t{font-size:13.5px;font-weight:700;color:var(--ink);display:flex;align-items:baseline;gap:6px;flex-wrap:wrap}
  .sc-who{font-size:11.5px;font-weight:400;color:var(--muted)}
  .sc-row{margin-top:8px}
  .sc-lbl{display:flex;justify-content:space-between;align-items:baseline;font-size:12.5px;color:var(--muted);margin-bottom:4px}
  .sc-in{width:100%;font:inherit;font-size:14px;padding:9px 11px;border:1px solid var(--line);border-radius:10px;background:#fbfcfe;color:var(--ink)}
  .sc-in:focus{outline:none;border-color:var(--brand-text);background:#fff;box-shadow:0 0 0 3px rgba(58,109,240,.15)}
  .sc-cnt{font-size:11.5px;color:var(--muted);flex:0 0 auto}
  .sc-actions{display:flex;gap:8px;flex-wrap:wrap;margin-top:10px}
  .sc-hist{margin-top:10px;max-height:210px;overflow:auto}
  .sc-hitem{display:flex;gap:8px;align-items:center;padding:7px 0;border-bottom:1px dashed var(--line)}
  .sc-hmain{flex:1 1 auto;min-width:0}
  .sc-htitle{font-size:13px;color:var(--ink);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
  .sc-hmeta{font-size:11.5px;color:var(--muted);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
  .sc-on{font-size:11px;color:#0f6e56;background:#e1f5ee;border:1px solid #9fe1cb;border-radius:99px;padding:1px 7px}
  .sc-note{margin-top:6px;font-size:12px;color:var(--muted);line-height:1.7}
  .sc-tip{margin-top:8px;font-size:12px;color:var(--muted);line-height:1.7}
  .sc-editinfo{margin-top:6px;font-size:12px;color:var(--brand-text);min-height:18px}
  /* v6.33：卡片预览 + 方案编号（类名落笔前又做了一次全库占用普查，零占用）。
     预览刻意按「微信里对方看到的样子」还原：左 1:1 缩略图 + 右标题/描述 + 底部站点名。
     为什么必须做这个预览：卡片 head 只能由服务端注入，改完当场在浏览器里看不出效果，
     只能等发到微信才知道长什么样 —— 预览就是把这个反馈闭环补回来。 */
  .sc-prevwrap{margin-top:8px;padding:10px;border:1px solid var(--line);border-radius:12px;background:#f6f8fc}
  .sc-prevlbl{font-size:12px;color:var(--muted);margin-bottom:7px;display:flex;justify-content:space-between;align-items:baseline;gap:8px;flex-wrap:wrap}
  .sc-wx{display:flex;gap:10px;align-items:stretch;background:#fff;border:1px solid #e6e9f0;border-radius:8px;padding:10px}
  .sc-wx-thumb{flex:0 0 auto;width:68px;height:68px;border-radius:6px;background:#eef2f8;overflow:hidden;display:flex;align-items:center;justify-content:center}
  .sc-wx-thumb img{width:100%;height:100%;object-fit:cover;display:block}
  .sc-wx-ph{font-size:11px;color:#6E768C;text-align:center;line-height:1.3;padding:0 4px}
  .sc-wx-main{flex:1 1 auto;min-width:0;display:flex;flex-direction:column;justify-content:center;gap:4px}
  .sc-wx-title{font-size:14px;font-weight:700;color:#1a1f2e;line-height:1.35;overflow:hidden;
    display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical}
  .sc-wx-desc{font-size:12px;color:#8a90a0;line-height:1.4;overflow:hidden;
    display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical}
  .sc-wx-site{margin-top:6px;font-size:11px;color:#6E768C}
  /* 方案编号：与服务端 id 同号，所以「当前生效：第 N 版」和历史里的编号永远对得上 */
  .sc-hno{flex:0 0 auto;font-size:11px;font-weight:700;color:#3d4761;background:#eef2fa;
    border:1px solid #dbe3f3;border-radius:6px;padding:2px 6px;min-width:42px;text-align:center}
  /* 分享公开页 */
  .share-bar{display:flex;align-items:center;gap:8px;margin-bottom:10px;flex-wrap:wrap}
  .share-badge{font-size:12px;font-weight:700;color:#1b3a63;background:#eef4fe;border:1px solid #cddcf5;border-radius:99px;padding:3px 10px}
  .share-foot{margin-top:14px;padding-top:10px;border-top:1px dashed var(--line);font-size:12px;color:var(--muted);text-align:center;line-height:1.7}
  @media(min-width:700px){ .sh-mask{align-items:center} .sh-card{border-radius:18px} }
  .login-logo{text-align:center;padding:6px 6px 0}
  /* v7.433：登录页眉头换「logo + 教育」并排连读（N倍教育，与开屏 bsLogo 同款构造）——
     原 h1「思维诊断与训练系统」+ 八度副行下线（信息量太大，用户拍板过渡只显 N倍教育） */
  .login-brand{display:flex;align-items:center;justify-content:center;gap:16px;margin:0 auto 10px}
  /* v6.25：去掉投影 —— 白底 logo 的投影会沿白方框描一圈蓝边，等于把方框显出来 */
  .login-logo .logo-top{height:52px;width:auto;margin:0;display:block}
  .login-edu{font-size:34px;font-weight:800;color:#1E3A6E;line-height:1;letter-spacing:5px}
  .login-logo h1{font-size:22px;font-weight:800;color:var(--ink);letter-spacing:.5px;line-height:1.3}
  /* v6.25：七维恢复为一行灰字（用户：「样式还是原来的，顺序改下」）。
     顺序＝高度｜深度｜广度｜序度｜简度｜精度｜速度；
     v6.24 之前是「高度｜广度｜深度｜序度｜简度｜精度｜速度」，只把「深度 / 广度」对调了一下。
     v7.39：登录页这一行补上第八维「温度」（用户 2026-09-25：「后面再加上温度」）——
     类名随之 dim7 → dim8；字号从 16px 收到 15px，否则 8 项在 390px 手机上会折成两行。 */
  .dim8{margin-top:16px;font-size:15px;color:var(--muted);letter-spacing:0;text-align:center}

  /* 自适应：平板/大手机上让内容舒展，不再两侧大留白 */
  @media (min-width:600px){
    .scroll{padding:18px 24px 22px}
    .card{padding:16px;margin-bottom:16px}
    .login-logo h1{font-size:28px}
    .login-logo .logo-top{height:64px}
    .login-edu{font-size:40px}
    .radar-wrap svg{max-width:420px}
    .chat-bubble{max-width:70%;font-size:16px}
    .chat-input textarea{font-size:16px}
    /* v6.27：宽屏上详情里的雷达图长高一点，避免被拉薄。
       v6.44：题目照片已改为整行自适应（height:auto），这里**不能再写死高度**，
       否则照片重回固定高度、又变回「给图片的空间太小」。 */
    .rec-fig-radar{min-height:230px}
    .rec-fig-radar .rec-radar{max-width:280px;max-height:200px}
  }
  @media (min-width:900px){
    .scroll{padding:22px 32px 26px}
    .card{padding:18px}
    .login-logo h1{font-size:32px}
    .login-edu{font-size:44px}
    .radar-wrap svg{max-width:520px}
    .chat-bubble{max-width:60%}
  }
  .toast{position:fixed;left:50%;bottom:calc(90px + env(safe-area-inset-bottom,0px));transform:translateX(-50%);background:rgba(20,30,50,.92);color:#fff;font-size:15px;padding:9px 16px;border-radius:99px;opacity:0;transition:opacity .3s;pointer-events:none;z-index:99;white-space:nowrap;max-width:90vw;overflow:hidden;text-overflow:ellipsis}
  .toast.show{opacity:1}
  /* v6.23b：长文案（如分享落地说明）允许换行两行，短文案仍是原 pill */
  .toast.wrap{white-space:normal;max-width:86vw;border-radius:16px;text-align:center;line-height:1.5;padding:10px 16px}

  /* v6.17：吐槽有奖 —— 全局浮动入口（与页面无关，任何角色任何页面都能点）+ 全屏弹层。
     放左下角是为了避开 v6.15 的 #chatJumpChip（右下角 fixed，z-index 85）。
     注意前缀用 gf-（grievance feedback）：fb- 已被「七维点评」占用
     （.fb-head / .fb-line / .fb-dim / .fb-k / .fb-v …），复用会串味。 */
  /* v6.18：按钮可拖动 —— v6.17 上线后第一个用户反馈就是「有时挡住下面的文字」。
     三件事：① 拖动跟手；② 松手自动吸到最近一侧边缘（垂直位置保留）；③ 位置记忆。
     另外把默认不透明度降到 .86、悬停/按下恢复 1，即使不拖也别把正文完全糊住。
     touch-action:none 必须加：否则手机上按下按钮后纵向滑动会先触发页面滚动，
     pointermove 直接被浏览器接管，拖动会「按住半天不动」。 */
  .gf-fab{position:fixed;left:14px;bottom:calc(86px + env(safe-area-inset-bottom,0px));z-index:86;border:none;border-radius:99px;background:linear-gradient(135deg,#f7b955,#ef8f1c);color:#fff;font-size:14px;font-weight:600;padding:10px 15px;box-shadow:0 6px 18px rgba(219,140,26,.34);cursor:grab;font-family:inherit;white-space:nowrap;touch-action:none;user-select:none;-webkit-user-select:none;-webkit-touch-callout:none;opacity:.86;transition:opacity .18s ease,box-shadow .18s ease}
  .gf-fab:hover,.gf-fab:active,.gf-fab.gf-dragging{opacity:1}
  .gf-fab:not(.gf-dragging):active{transform:translateY(1px)}
  .gf-fab.gf-dragging{cursor:grabbing;transform:none;transition:none;box-shadow:0 12px 28px rgba(219,140,26,.5)}
  .gf-mask{position:fixed;inset:0;background:rgba(15,22,40,.45);z-index:120;display:flex;align-items:flex-end;justify-content:center}
  .gf-card{width:100%;max-width:560px;max-height:92vh;overflow:auto;background:var(--card);border-radius:18px 18px 0 0;padding:16px 16px calc(16px + env(safe-area-inset-bottom,0px));box-shadow:0 -8px 30px rgba(20,30,60,.18)}
  @media(min-width:700px){ .gf-mask{align-items:center} .gf-card{border-radius:18px} }
  .gf-head{display:flex;justify-content:space-between;align-items:center;gap:8px}
  .gf-title{font-size:17px;font-weight:700;color:var(--ink)}
  .gf-x{border:none;background:transparent;font-size:20px;line-height:1;color:var(--muted);cursor:pointer;padding:2px 8px;font-family:inherit}
  .gf-sub{font-size:13px;color:var(--muted);line-height:1.65;margin:6px 0 12px}
  .gf-cats{display:flex;flex-wrap:wrap;gap:8px;margin-bottom:10px}
  .gf-cat{border:1px solid var(--line);background:#fff;color:var(--muted);font-size:14px;padding:7px 14px;border-radius:99px;cursor:pointer;font-family:inherit}
  .gf-cat.on{background:var(--brand);border-color:var(--brand-text);color:#fff}
  .gf-text{width:100%;min-height:104px;border:1px solid var(--line);border-radius:12px;padding:12px;font:inherit;font-size:15px;background:#fbfcfe;box-sizing:border-box;resize:vertical}
  .gf-shot{margin-top:12px;border:1px solid var(--line);border-radius:12px;padding:8px 10px;background:#fbfcfe}
  .gf-shot-head{display:flex;justify-content:space-between;align-items:center;gap:8px;font-size:12.5px;color:var(--muted);flex-wrap:wrap}
  .gf-shot-head .r{display:flex;gap:6px;flex-wrap:wrap}
  .gf-shot-box{margin-top:8px;border-radius:8px;overflow:hidden;background:#eef2f8;min-height:46px;display:flex;align-items:center;justify-content:center;font-size:13px;color:var(--muted);text-align:center;padding:6px}
  .gf-shot-box img{width:100%;display:block;cursor:zoom-in}
  /* v6.17：提交按钮吸底。手机端弹层内容（正文+截图预览）比一屏高，
     不吸底的话「提交吐槽」会落在折叠线以下 800px，用户以为没有提交按钮。
     沿用 v6.15 的结论：底部常驻条用 sticky（既常驻可见，又自己占布局空间）。 */
  .gf-actions{position:sticky;bottom:0;display:flex;gap:10px;margin-top:14px;padding:12px 0 6px;background:linear-gradient(180deg,rgba(255,255,255,0) 0%,var(--card) 30%)}
  .gf-actions .btn{flex:1}
  /* 老师 / 主任 / 网管看到的吐槽列表 */
  .tk-item{border:1px solid var(--line);border-radius:12px;padding:10px 12px;background:#fff;margin-bottom:10px}
  .tk-item.done{background:#f7fbf7}
  .tk-top{display:flex;flex-wrap:wrap;gap:6px;align-items:center;margin-bottom:6px}
  .tk-cat{font-size:11.5px;padding:2px 9px;border-radius:99px;background:#eef3ff;color:var(--brand-text);font-weight:600}
  .tk-cat.model{background:#f3edff;color:#6b46c1}
  .tk-cat.feature{background:#e8f7f1;color:#0f6e56}
  .tk-cat.other{background:#f1f3f7;color:#5f5e5a}
  .tk-state{font-size:11.5px;padding:2px 9px;border-radius:99px;background:#fff3d9;color:#9a6500}
  .tk-state.done{background:#e6f6e6;color:#26722b}
  .tk-where{font-size:12px;color:var(--muted)}
  .tk-meta{font-size:12.5px;color:var(--muted);line-height:1.65}
  .tk-body{margin-top:6px;font-size:14.5px;line-height:1.7;color:var(--ink);white-space:pre-wrap;word-break:break-word}
  .tk-shot{margin-top:8px;width:100%;border-radius:8px;border:1px solid var(--line);cursor:zoom-in;display:block}
  .tk-reply{margin-top:8px;padding:8px 10px;border-left:3px solid var(--brand);background:#f7faff;border-radius:0 8px 8px 0;font-size:13.5px;line-height:1.65;white-space:pre-wrap;word-break:break-word}
  .tk-reply .who{color:var(--muted);font-size:12px;margin-bottom:2px}
  .tk-reply-row{display:flex;gap:8px;margin-top:8px}
  .tk-reply-row input{flex:1;min-width:0;border:1px solid var(--line);border-radius:10px;padding:9px 11px;font:inherit;font-size:14px;background:#fbfcfe}

  /* v6.13：题目图片识别结果卡片 —— 印刷体 / 手写体 / 公式分区展示，公式按排版渲染 */
  .ocr-wrap{margin:10px 0 14px;border:1px solid var(--line);border-radius:14px;overflow:hidden;background:#fbfcfe}
  .ocr-head{display:flex;justify-content:space-between;align-items:center;gap:8px;padding:10px 12px;background:#f2f6ff;border-bottom:1px solid var(--line)}
  .ocr-title{font-weight:600;font-size:15px;color:var(--ink)}
  .ocr-tools{display:flex;gap:6px;flex:0 0 auto}
  .mini-btn{border:1px solid var(--line);background:#fff;color:var(--muted);font-size:12.5px;padding:4px 9px;border-radius:99px;cursor:pointer;font-family:inherit;white-space:nowrap}
  .mini-btn:hover{color:var(--brand-text);border-color:#c7d6fb}
  .mini-btn:disabled{opacity:.55;cursor:default}
  .ocr-summary{margin:0;padding:8px 12px 0;font-size:13px;color:var(--muted);line-height:1.65}
  .ocr-tag{display:inline-block;font-size:12px;padding:2px 8px;border-radius:99px;margin-right:4px}
  .ocr-body{padding:8px 12px 4px;max-height:min(62vh,560px);overflow:auto}
  .ocr-block{border-left:3px solid var(--line);background:#fff;border-radius:0 10px 10px 0;padding:8px 10px;margin-bottom:8px}
  .ocr-block.t-printed{border-left-color:#3a6df0}
  .ocr-block.t-handwritten{border-left-color:#f0a13a;background:#fffdf7}
  .ocr-block.t-formula{border-left-color:#7a4df0;background:#faf8ff}
  .ocr-block.t-figure{border-left-color:#1fa971}
  .ocr-block-h{display:flex;align-items:center;gap:8px;margin-bottom:4px;flex-wrap:wrap}
  .ocr-badge{font-size:12px;font-weight:600;padding:1px 7px;border-radius:6px}
  .t-printed .ocr-badge{background:#eaf0ff;color:#2b56c8}
  .t-handwritten .ocr-badge{background:#fef3e2;color:#b4700f}
  .t-formula .ocr-badge{background:#f0eaff;color:#5b34c8}
  .t-figure .ocr-badge{background:#e6f7f0;color:#15805a}
  .ocr-note{font-size:12px;color:var(--muted)}

  /* v6.28：讲题前的拦截提示（没有上传题目 / 非本学科题目）。
     刻意不用 toast——toast 1.8 秒就消失，学生根本来不及看清自己错在哪。
     这里留在页面原地、表单保持可用，学生可以立刻重传题目再提交。 */
  .block-tip{margin:12px 0 4px;border:1px solid #f3d3b8;background:#fff8f1;border-radius:14px;padding:12px 14px;
    display:flex;gap:10px;align-items:flex-start}
  .block-tip .bt-ic{flex:0 0 auto;font-size:20px;line-height:1.15}
  .block-tip .bt-t{font-weight:700;font-size:15px;color:#b4530a;margin-bottom:4px}
  .block-tip .bt-d{font-size:13.5px;color:#7a5a3a;line-height:1.75}
  .block-tip .bt-d b{color:#b4530a}
  .block-tip .bt-r{color:#9a7a58;font-size:12.5px}
  .block-tip.hidden{display:none}
  /* v6.29：结果页的「信息量不足」提醒条。刻意与上面的拦截提示同族但**换成蓝灰调**——
     橙色＝被拦下了（不给分），蓝灰＝给分了、但可信度要打折扣。两种含义不能长得一样。 */
  .block-tip.notice-res{margin:0 0 12px;border-color:#cfe0f5;background:#f4f9ff}
  .block-tip.notice-res .bt-ic{font-size:18px;line-height:1.2}
  .block-tip.notice-res .bt-t{color:#1c5c99;font-size:14px}
  .block-tip.notice-res .bt-d{color:#4a6b8a;font-size:13px;line-height:1.7}
  .block-tip.notice-res .bt-d b{color:#1c5c99}
  .ocr-text{font-size:15px;line-height:1.75;white-space:pre-wrap;word-break:break-word;color:var(--ink)}
  .ocr-math{padding:6px 2px 4px;overflow-x:auto;overflow-y:hidden;color:var(--ink)}
  .ocr-math .katex{font-size:1.12em}
  .ocr-latex{margin-top:4px;display:flex;align-items:center;gap:8px}
  .ocr-latex code{flex:1 1 auto;min-width:0;font-size:12px;color:#5a657f;background:#f4f6fa;border:1px solid var(--line);border-radius:8px;padding:4px 8px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
  /* KaTeX 没加载出来 / 排不出来时的降级样式：至少把 LaTeX 源码显示清楚，不影响理解。
     v6.68：原来是**红底红字**（#fff6f6 / #f3c9c9 / #a33）—— 用户看到屏上一片红字，
     第一反应是「公式坏了」，其实是「这一段没排出来」。改成中性灰：不刺眼、
     也不让人误以为答案错了。（红光留给真正的报错提示，别浪费在降级上） */
  .math-fallback{font-size:13.5px;background:#f4f5f7;border:1px solid #dcdfe4;color:#5b6472;border-radius:8px;padding:3px 7px;display:inline-block;white-space:pre-wrap;word-break:break-all}
  /* ★ 最后一道闸门：万一还有哪条路径漏出 KaTeX 的错误块，也不许是红的 ——
     throwOnError:false 会把出错的那段染成红字印在屏上，用户反复报的就是它。 */
  .katex-error{color:#5b6472 !important;background:#f4f5f7 !important;border:1px solid #dcdfe4 !important;border-radius:6px !important;padding:1px 5px !important}
  .ocr-actions{display:flex;gap:8px;padding:0 12px 12px;flex-wrap:wrap}
  .ocr-actions .mini-btn{font-size:13px;padding:6px 12px}
  /* v6.30：题干「合并排版」—— 按原图阅读顺序把文字与公式排成一段连续题干，
     而不是一块一块带标签的卡片。手写内容用暖底虚线标出，一眼能分清「题目」和「我写的」。 */
  .ocr-stem{margin:0 12px 10px;padding:10px 12px;border:1px solid var(--line);border-radius:12px;
    background:#fff;color:var(--ink);font-size:15px;line-height:2;white-space:pre-wrap;word-break:break-word;
    max-height:min(52vh,520px);overflow:auto}
  .ocr-stem .st-line{display:block}
  .ocr-stem .st-math{display:inline-block;vertical-align:-0.32em;margin:0 2px}
  .ocr-stem .st-math .katex{font-size:1.05em}
  .ocr-stem .st-math-block{display:block;overflow-x:auto;overflow-y:hidden;padding:2px 0}
  .ocr-stem .st-hw{background:#fff8ec;border-bottom:1px dashed #e6c893;border-radius:3px;padding:0 2px}
  .ocr-stem .st-fig{display:inline-block;color:#15805a;background:#eefaf5;border-radius:6px;padding:1px 7px;font-size:14px}
  .ocr-stem .st-empty{color:var(--muted);font-size:14px}
  /* v6.30：分块明细默认收起，需要复制 LaTeX 时再展开 */
  .ocr-body.hidden{display:none}

  /* mode toggle */
  .mode-toggle{display:flex;gap:8px;margin-bottom:14px}
  .mode-toggle button{flex:1;border:1px solid var(--line);background:#f6f8fb;color:var(--muted);font-size:15px;font-weight:600;padding:11px 4px;border-radius:12px;cursor:pointer;transition:.15s}
  .mode-toggle button.on{background:var(--brand);color:#fff;border-color:var(--brand-text)}
  .mode-toggle button .em{display:block;font-size:18px;margin-bottom:2px}

  /* mic button */
  .mic-row{display:flex;gap:8px;align-items:center;margin-top:8px}
  .mic-btn{flex:0 0 auto;display:inline-flex;align-items:center;gap:6px;border:1px solid var(--brand);background:var(--brand-soft);color:var(--brand-text);font-size:15px;font-weight:600;padding:9px 14px;border-radius:12px;cursor:pointer}
  .mic-btn.rec{background:var(--ok);color:#fff;border-color:var(--ok);animation:pulse 1.1s infinite}
  .wave-canvas{display:block;width:100%;height:64px;margin-top:8px;background:linear-gradient(180deg,#f7f9ff,#eef3ff);border:1px solid var(--brand-soft);border-radius:12px;touch-action:none}
  .wave-canvas.recording{border-color:var(--ok);box-shadow:0 0 0 3px rgba(22,163,74,.12)}
  .wave-canvas.processing{border-color:var(--brand-text);box-shadow:0 0 0 3px rgba(52,98,255,.12)}
  .wave-canvas.hidden{display:none}
  .perm-guide{margin-top:8px;padding:10px 12px;border:1px solid #f0c36d;background:#fff8e6;color:#7a5b00;border-radius:10px;font-size:14px;line-height:1.6}
  .perm-guide ol{margin:6px 0 0;padding-left:18px}
  .perm-guide b{color:#5a3d00}
  @keyframes pulse{0%,100%{opacity:1}50%{opacity:.55}}
/* 满分示范整页文档（v6.3 Word 式编辑） */
.ex-doc{color:var(--ink)}
.ex-doc p{margin:8px 0;font-size:14px;line-height:1.7}
.ex-doc div{font-size:14px;line-height:1.7}
.ex-doc h3{font-size:16px;margin:12px 0 6px}
.ex-doc h4{font-weight:500;font-size:14px;margin:12px 0 6px}
.ex-doc ul,.ex-doc ol{margin:6px 0 8px;padding-left:20px}
.ex-doc li{font-size:14px;line-height:1.7;margin:4px 0}
.ex-doc table{border-collapse:collapse;margin-top:8px;font-size:13px;max-width:100%}
.ex-doc th,.ex-doc td{border:0.5px solid var(--line);padding:6px;text-align:center}
.ex-doc img{max-width:100%;border:1px solid var(--line);border-radius:10px;display:block;margin:10px 0}
.ex-editing{outline:1.5px dashed var(--brand);outline-offset:6px;padding:6px 10px;border-radius:4px}
.ex-editing:focus{outline-style:solid}
.ex-tb{border:1px solid var(--line);background:#f2f3f5;color:var(--ink);border-radius:8px;padding:5px 10px;font-size:13px;cursor:pointer}
.ex-tb:hover{background:#e6e8ee}

/* ===== v6.67：错因大类配色 —— 五大类各一色，二级错法 / 编排表下拉 / 「本次已选错因」
   跟着大类走同一个色，扫一眼就知道哪条属哪个大类（用户原话：
   「把不同的大类用不同的颜色区分开来，大类底下的具体做法也跟大类颜色保持一致」）===== */
.sq-c0{--sq:#2563eb;--sqbg:#edf3fe}   /* k1 知识问题 · 蓝   */
.sq-c1{--sq:#7c3aed;--sqbg:#f3eefe}   /* k2 思维问题 · 紫   */
.sq-c2{--sq:#d97706;--sqbg:#fdf3e7}   /* k3 审题问题 · 橙   */
.sq-c3{--sq:#dc2626;--sqbg:#fdecec}   /* k4 运算执行偏弱 · 红 */
.sq-c4{--sq:#0d9488;--sqbg:#e8f6f4}   /* k5 输出结构混乱 · 青 */
/* 大类 chips：选中 = 实底白字，未选中 = 淡底彩字（只作用于错因选择区，别处 chips 不受影响） */
.simq-cat-row .chip.sq-c0,.simq-cat-row .chip.sq-c1,.simq-cat-row .chip.sq-c2,
.simq-cat-row .chip.sq-c3,.simq-cat-row .chip.sq-c4{border-color:transparent}
.simq-cat-row .chip.sq-c0:not(.on),.simq-cat-row .chip.sq-c1:not(.on),
.simq-cat-row .chip.sq-c2:not(.on),.simq-cat-row .chip.sq-c3:not(.on),
.simq-cat-row .chip.sq-c4:not(.on){background:var(--sqbg);color:var(--sq)}
.simq-cat-row .chip.on.sq-c0,.simq-cat-row .chip.on.sq-c1,.simq-cat-row .chip.on.sq-c2,
.simq-cat-row .chip.on.sq-c3,.simq-cat-row .chip.on.sq-c4{background:var(--sq);border-color:var(--sq);color:#fff}
/* 编排表（手动组合逐份下拉）：色条 + 淡底，一眼认出这一格是哪个大类 */
.simq-plan-row .pl-pair.sq-c0 .pl-cat,.simq-plan-row .pl-pair.sq-c0 .pl-sub,
.simq-plan-row .pl-pair.sq-c1 .pl-cat,.simq-plan-row .pl-pair.sq-c1 .pl-sub,
.simq-plan-row .pl-pair.sq-c2 .pl-cat,.simq-plan-row .pl-pair.sq-c2 .pl-sub,
.simq-plan-row .pl-pair.sq-c3 .pl-cat,.simq-plan-row .pl-pair.sq-c3 .pl-sub,
.simq-plan-row .pl-pair.sq-c4 .pl-cat,.simq-plan-row .pl-pair.sq-c4 .pl-sub{
  border-left:4px solid var(--sq);background:var(--sqbg)}
/* 「本次已选错因」：每条错法前一颗大类同款色点 */
.simq-sum-row .simq-pair .sq-dot{display:inline-block;width:8px;height:8px;
  border-radius:50%;background:var(--sq);margin-right:4px;vertical-align:1px}
.simq-sum-row .simq-pair{color:var(--fg)}
.simq-sum-row .sq-plus{color:var(--muted);margin:0 4px}

/* ===== v6.69：「其他（手动输入）」的错法输入框 —— 跟着大类同款色，一眼认出属于哪个大类 ===== */
.pl-other{flex:1 1 130px;min-width:110px;font-size:12.5px;padding:5px 8px;border:1px solid var(--sq,#c9ced8);
  border-left:4px solid var(--sq,#c9ced8);border-radius:8px;background:var(--sqbg,#f4f5f7);color:inherit;outline:none}
.pl-other:focus{box-shadow:0 0 0 2px color-mix(in srgb,var(--sq,#2563eb) 25%,transparent)}
.pl-other::placeholder{color:#9aa1ad}

/* ===== v6.70：题图「浮窗」—— 图片脱出页面浮在最上层，按住随便拖 =====
   用户原话：「记录和错题生成的截图/图片可以脱出来，浮在最上层，可移动，
   往边上挪，看讲解同时图片也可以移动着对比」。*/
.img-float{position:fixed;right:16px;top:72px;width:min(44vw,520px);min-width:220px;
  background:var(--card,#fff);border:1px solid var(--line,#e5eaf3);border-radius:12px;
  box-shadow:0 10px 34px rgba(15,23,42,.22);overflow:hidden;z-index:9999;
  touch-action:none;user-select:none;-webkit-user-select:none;-webkit-touch-callout:none}
.img-float .if-bar{display:flex;justify-content:space-between;align-items:center;gap:8px;
  padding:6px 10px;background:#f4f6fa;border-bottom:1px solid var(--line,#e5eaf3);
  cursor:grab;font-size:12px;color:var(--muted,#6b7590)}
.img-float .if-bar:active{cursor:grabbing}
.img-float .if-t{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
/* v6.76：顶栏只留「⛶ 截图」一个按钮（✕ 已去掉 —— 再点一次「⤢ 浮窗」即收起） */
.img-float .if-img{display:block;width:100%;max-height:62vh;object-fit:contain;
  background:#fafbfd;cursor:grab}
.img-float .if-img:active{cursor:grabbing}
.img-float.is-dragging{box-shadow:0 16px 44px rgba(15,23,42,.30)}
/* ===== v6.75：浮窗大小可调 + 裁剪层 =====
   ① 大小：右下角一块 22px 的抓手柄（两条斜杠），按住左右拖即改浮窗宽度，
      图片跟着等比缩放；宽度落在 180px ~ min(屏宽-16, 1600px) 之间。
   ② 裁剪：整层覆盖图片上方，选区外用超大 box-shadow 压暗（不用第二个遮罩元素，
      DOM 少一层，拖动时少一层重排）。 */
.img-float .if-bar-r{display:flex;align-items:center;gap:6px;flex:0 0 auto}
/* v6.80：截图按钮要**醒目**（用户原话：「变成醒目的颜色，比如红色或者蓝色」）——
   以前是浅灰底、hover 才变蓝，很多人压根没发现这里能截图；现在常驻蓝底白字。
   用站点主色 #3a6df0 而不是红色：红色在本站是「判定成立/扣分」的信号色，会串味。 */
.img-float .if-shot{border:1px solid #3a6df0;background:#3a6df0;color:#fff;cursor:pointer;
  border-radius:6px;padding:3px 10px;font-size:12px;line-height:1.6;font-weight:600;
  box-shadow:0 1px 4px rgba(58,109,240,.35)}
.img-float .if-shot:hover{background:#2f5ede;border-color:#2f5ede;color:#fff}
/* v6.77：没有改图权限时截图按钮置灰（不隐藏 —— 藏起来会让人以为功能没做） */
.img-float .if-shot.off{opacity:.45;cursor:not-allowed;background:#f2f4f8;color:#9aa3b5}
.img-float .if-shot.off:hover{background:#f2f4f8;color:#9aa3b5}
/* v6.77：✕ 关闭按钮加回来了 */
.img-float .if-x{flex:0 0 auto;border:0;background:transparent;font-size:14px;line-height:1;
  cursor:pointer;color:var(--muted,#6b7590);padding:3px 7px;border-radius:6px}
.img-float .if-x:hover{background:#e6eaf2;color:var(--ink,#1c2333)}
.img-float .if-stage{position:relative;line-height:0}
.img-float .if-rsz{position:absolute;right:0;bottom:0;width:22px;height:22px;cursor:nwse-resize;
  z-index:3;touch-action:none;
  background:linear-gradient(135deg,transparent 0 46%,rgba(90,104,134,.85) 46% 54%,
    transparent 54% 62%,rgba(90,104,134,.85) 62% 70%,transparent 70%)}
.img-float .if-rsz:hover{background-color:rgba(58,109,240,.10);border-radius:0 0 10px 0}
.img-float.is-resizing{box-shadow:0 16px 44px rgba(15,23,42,.30)}
.img-float.is-crop .if-img{cursor:default}
.img-float .if-crop-layer{position:absolute;left:0;top:0;right:0;bottom:0;z-index:2;touch-action:none}
/* v6.76：截图态 —— 图区整块都是十字光标，按住左键拖哪截哪，不再有把手 */
.img-float.is-crop .if-crop-layer{cursor:crosshair}
.img-float .if-crop-sel{position:absolute;box-shadow:0 0 0 9999px rgba(15,23,42,.55);
  border:1px solid #fff;cursor:crosshair;touch-action:none;box-sizing:border-box}
/* v6.79 ★ 浮窗内 hidden 必须真的藏住 ——
   上面几行给了 .if-crop-act / .if-confirm 显式 display:flex，而 HTML 的 hidden
   属性靠的是 UA 样式 `[hidden]{display:none}`，类选择器优先级更高 → 直接被盖掉。
   结果就是浮窗一打开，「✓ 确定 / 替换原图 / 算了」三枚按钮就摆在下面，
   可这时候根本还没截图（用户原话：「你不截图的话，这些都没必要出现」）。
   补这条 !important，让 hidden 在浮窗内重新生效。 */
.img-float [hidden]{display:none!important}
.img-float .if-crop-act,.img-float .if-confirm{display:flex;align-items:center;gap:8px;
  padding:7px 10px;background:#f4f6fa;border-top:1px solid var(--line,#e5eaf3);font-size:12px}
.img-float .if-confirm{flex-direction:column;align-items:stretch;background:#fff7e8;border-top-color:#f0c987}
.img-float .if-hint{flex:1 1 auto;color:var(--muted,#6b7590)}
.img-float .if-cf-t{color:#8a4b00;line-height:1.6}
.img-float .if-cf-b{display:flex;gap:8px;justify-content:flex-end;margin-top:6px}
.img-float .if-cc{border:1px solid var(--line,#e5eaf3);background:#fff;color:var(--ink,#1c2333);
  border-radius:8px;padding:4px 12px;font-size:12.5px;cursor:pointer}
.img-float .if-cc.ok{background:#3a6df0;border-color:#3a6df0;color:#fff}
.img-float .if-cc:hover{filter:brightness(.95)}
/* 记录详情题图上的「⤢ 浮窗」按钮 —— 与「⟲ 旋转」同款，排在它左边 */
.rec-float{position:absolute;right:6px;bottom:6px;z-index:2;transform:translateX(-108%);
  display:inline-flex;align-items:center;gap:4px;
  background:rgba(255,255,255,.94);border:1px solid var(--line);color:var(--fg);
  border-radius:14px;padding:4px 10px;font-size:12.5px;line-height:1.6;cursor:pointer;
  box-shadow:0 1px 4px rgba(0,0,0,.10)}
.rec-float:active{background:#eef3ff}
/* v6.80：题图上的三个工具（⟲ 旋转 / ⤢ 浮窗 / ⛶ 截图）包成一条 flex ——
   以前各自 absolute + translateX 叠着排，加第三个就得手算 -216%，极易重叠。 */
.rec-img-tools{position:absolute;right:6px;bottom:6px;z-index:2;
  display:flex;align-items:center;gap:6px}
.rec-img-tools .rec-rotate,.rec-img-tools .rec-float,.rec-img-tools .rec-shot{
  position:static;transform:none}
/* v6.80：题图上的「⛶ 截图」—— 用户原话「目的只是增加一个提示的作用」，
   所以它要**比旁边两枚更显眼**：蓝底白字，一眼能看见这儿还有个截图。 */
.rec-shot{display:inline-flex;align-items:center;gap:4px;
  background:#3a6df0;border:1px solid #3a6df0;color:#fff;
  border-radius:14px;padding:4px 10px;font-size:12.5px;line-height:1.6;cursor:pointer;
  box-shadow:0 1px 4px rgba(58,109,240,.35)}
.rec-shot:hover{background:#2f5ede;border-color:#2f5ede}
.rec-shot.off{background:#f2f4f8;border-color:var(--line);color:#9aa3b5;box-shadow:none;cursor:not-allowed}
.rec-shot.off:hover{background:#f2f4f8;border-color:var(--line);color:#9aa3b5}
/* ================================================================
   v6.71：思路地图「先看这条路」 —— 用户原话「任何方法都应该先说大体思路，
     不要一上来就进入细节」。
   ★ 这一段**写在所有 @media 之外**：上面 .tl-ref / .rd-* 那一整套都在
     `@media (min-width:900px)` 块里 —— 窄屏（手机 / 分栏） 上它们一个都不生效。
     地图是学生第一眼要看的东西，不能只在宽屏有样式，所以这里全局给一套。
   ================================================================ */
.rmap{margin:8px 0 12px;border:1px solid #cfe9db;border-radius:10px;background:#fff;overflow:hidden}
.rmap-t{padding:7px 11px;font-weight:700;color:#14532d;font-size:14.5px;background:#eaf6ef;
  border-bottom:1px solid #cfe9db}
.rmap-t em{font-style:normal;font-weight:400;color:var(--muted,#6b7590);font-size:12.5px;margin-left:6px}
.rmap-b{padding:10px 12px 9px}
.rmap-hook{font-size:14.5px;line-height:1.75;color:#14532d;background:#f4faf7;
  border-left:3px solid #8ec9a8;padding:6px 10px;border-radius:0 6px 6px 0;margin-bottom:9px;
  word-break:break-word}
.rmap-steps{list-style:none;margin:0;padding:0}
.rmap-step{position:relative;display:flex;gap:9px;padding:0 0 11px}
.rmap-step:last-child{padding-bottom:0}
/* 竖线：把散的点连成一条「路」—— 没有它，3-5 步看着就是 3-5 条独立的备注 */
.rmap-step:not(:last-child)::before{content:'';position:absolute;left:9px;top:22px;bottom:2px;
  width:2px;background:#d7ecdf;border-radius:2px}
.rmap-n{flex:0 0 20px;height:20px;border-radius:50%;background:#1d7a45;color:#fff;
  font-size:12px;font-weight:700;display:flex;align-items:center;justify-content:center;
  margin-top:2px;z-index:1}
.rmap-step.hot .rmap-n{background:#c0392b}
.rmap-c{min-width:0;flex:1 1 auto}
.rmap-do{font-size:14.5px;color:#22303f;line-height:1.75;word-break:break-word}
.rmap-why{font-size:13px;color:#6b7c90;line-height:1.65;margin-top:1px;word-break:break-word}
.rmap-pay{margin:0 12px 10px;padding:6px 10px;border-radius:6px;background:#fff7e8;
  border:1px solid #f0dcb4;color:#8a5a12;font-size:13.5px;line-height:1.7}
/* 完整推导「点开才看」—— 默认收起，先给地图再给算式 */
.rmap-more{display:inline-block;cursor:pointer;user-select:none;color:#1d7a45;font-size:13.5px;
  padding:2px 10px;border:1px solid #cfe9db;border-radius:999px;background:#fff;line-height:1.9}
.rmap-more:hover{background:#eef7f2}
.rmap-more:focus-visible{outline:2px solid #7aa7ff;outline-offset:2px}
.rmap-more.open{background:#eef7f2}
/* v6.72：板书排版 —— 分行、分段。数学解答是给人看过程的，读不下去等于没写。 */
.prose{display:block}
.prose .pp{margin:0 0 4px;line-height:1.95;color:#22303f;word-break:break-word}
.prose .pp:last-child{margin-bottom:0}
.prose .pp-h{margin-top:11px;font-weight:600;color:#16233a}
.prose .pp-h:first-child{margin-top:0}
.prose .pp-gap{height:10px}
.prose .math-blk{margin:7px 0}
.prose .math-blk:first-child{margin-top:0}
.tl-ref-stepbody .prose{padding:2px 0 1px}
/* v6.72：打印按钮（简析 / 详解 / AI 点评 各一枚，靠标题行右侧） */
.tl-ref-print{float:right;margin:1px 0 0 8px;padding:2px 9px;border-radius:6px;
  border:1px solid #cfe0f5;background:#f4f8ff;color:#2563eb;font-size:12.5px;
  line-height:1.6;cursor:pointer;font-family:inherit}
.tl-ref-print:hover{background:#e8f1ff;border-color:#a9c9f0}
.tl-ref-print:active{background:#dbe9ff}
.tl-ref-steps{align-items:flex-start}
.tl-ref-stepbody{margin-top:6px}
.tl-ref-stepbody .math-blk,.tl-ref-stepbody .katex-display{max-width:100%;overflow-x:auto;overflow-y:hidden}
/* 这一份是纯文本降级通道出来的 —— 如实标注，不装作正规答案 */
.tl-ref-plain{margin:6px 0;padding:5px 10px;border-radius:6px;background:#fff7e8;
  border:1px solid #f0dcb4;color:#8a5a12;font-size:13px;line-height:1.7}

/* ======================================================================
   v6.74：讲解吐槽 —— 五个落点（简析 / 预判 / 解题 / 升华 / AI 互动回答）
   配色口径：吐槽「成立」= 红（这段讲解真有问题）；「部分成立」= 橙；
   「不成立」= 绿（讲解没问题，是学生理解偏了）。与站内 --ok/--good 同系。
   ====================================================================== */
.tl-crit-host{margin:8px 0 0;display:block}
.tl-crit-btn{font-size:12px;line-height:1;padding:5px 10px;border-radius:99px;cursor:pointer;
  color:var(--muted);background:#fff;border:1px solid var(--line);transition:.15s}
.tl-crit-btn:hover{color:var(--warn-text);border-color:#f3cf9a;background:#fff8ec}
.tl-crit-btn.on{color:#fff;background:var(--warn);border-color:var(--warn)}
.tl-crit-box{margin:8px 0 4px;padding:10px 12px;border-radius:12px;
  background:#fbfcfe;border:1px solid var(--line)}
.tl-crit-h{font-size:13px;font-weight:600;color:var(--ink);margin-bottom:6px}
.tl-crit-h em{font-style:normal;font-weight:400;color:var(--muted);font-size:12px;margin-left:6px}
.tl-crit-ta{width:100%;box-sizing:border-box;font:inherit;font-size:13px;line-height:1.6;
  padding:8px 10px;border-radius:10px;border:1px solid var(--line);background:#fff;
  color:var(--ink);resize:vertical}
.tl-crit-ta:focus{outline:none;border-color:var(--brand-text);box-shadow:0 0 0 3px rgba(58,109,240,.12)}
.tl-crit-act{margin-top:8px;display:flex;gap:8px;align-items:center}
.tl-crit-send{font-size:13px;padding:7px 14px;border-radius:10px;cursor:pointer;
  color:#fff;background:var(--brand);border:1px solid var(--brand);font-weight:600}
.tl-crit-send:disabled{opacity:.6;cursor:progress}
.tl-crit-cancel{font-size:13px;padding:7px 12px;border-radius:10px;cursor:pointer;
  color:var(--muted);background:#fff;border:1px solid var(--line)}
.tl-crit-res:empty,.tl-crit-list:empty{display:none}
.tl-crit-card{margin-top:10px;padding:10px 12px;border-radius:10px;
  background:#fff;border:1px solid var(--line);border-left:3px solid var(--muted)}
.tl-crit-card.bad{border-left-color:var(--ok);background:#fff5f5}
.tl-crit-card.mid{border-left-color:var(--warn);background:#fffaf0}
.tl-crit-card.good{border-left-color:var(--good);background:#f2fbf6}
.tl-crit-card.none{border-left-color:var(--muted);background:#f7f8fa}
.tl-crit-ch{display:flex;align-items:center;gap:8px;flex-wrap:wrap;font-size:13px}
.tl-crit-sc{font-size:12px;font-weight:700;padding:2px 8px;border-radius:99px;color:#fff}
.tl-crit-sc.bad{background:var(--ok)} .tl-crit-sc.mid{background:var(--warn)}
.tl-crit-sc.good{background:var(--good)} .tl-crit-sc.none{background:var(--muted)}
.tl-crit-vd{font-size:12px;font-weight:600;padding:2px 8px;border-radius:99px}
.tl-crit-vd.bad{color:var(--ok);background:#ffecec}
.tl-crit-vd.mid{color:var(--warn-text);background:#fff4e3}
.tl-crit-vd.good{color:var(--good-text);background:#e9f8f0}
.tl-crit-vd.none{color:var(--muted);background:#eef1f6}
.tl-crit-rs{margin-top:7px;font-size:13px;line-height:1.7;color:var(--ink)}
/* v6.75：AI 对这条吐槽的**表态** —— 学生唯一逐字会看的一句。
   给它气泡一样的底座，别跟下面的「扣分依据」混成一片；
   后者是讲给系统 / 老师看的，前者才是回给人的话。 */
.tl-crit-say{background:var(--brand-soft,#eef3ff);border:1px solid #cddcff;
  border-left:3px solid var(--brand,#3a6df0);border-radius:8px;
  padding:8px 10px;margin-top:8px;line-height:1.75;font-size:13.5px;color:var(--ink)}
.tl-crit-say>b{display:block;font-size:12px;color:var(--brand-text,#3a6df0);
  margin-bottom:3px;letter-spacing:.3px}
.tl-crit-fx{margin-top:5px;font-size:12.5px;line-height:1.7;color:var(--brand-text)}
.tl-crit-note{margin-top:7px;font-size:12px;color:var(--muted)}
.tl-crit-lt{margin:10px 0 6px;font-size:12px;color:var(--muted)}
.tl-crit-item{margin:8px 0;padding:9px 11px;border-radius:10px;background:#fff;border:1px solid var(--line)}
.tl-crit-item.mine{border-color:#c9d8ff;background:#f7faff}
.tl-crit-hd{display:flex;align-items:center;gap:7px;flex-wrap:wrap}
.tl-crit-tg{font-size:11.5px;color:var(--muted);background:#eef1f6;border-radius:99px;padding:2px 8px}
.tl-crit-st{font-size:11.5px;border-radius:99px;padding:2px 8px}
.tl-crit-st.s-pending{color:var(--warn-text);background:#fff4e3}
.tl-crit-st.s-approved{color:var(--good-text);background:#e9f8f0}
.tl-crit-st.s-rejected{color:var(--muted);background:#eef1f6}
.tl-crit-tx{margin-top:6px;font-size:13px;line-height:1.7;color:var(--ink);white-space:pre-wrap;word-break:break-word}
.tl-crit-ft{margin-top:7px;display:flex;align-items:center;gap:8px;flex-wrap:wrap}
.tl-crit-like{font-size:12px;padding:3px 10px;border-radius:99px;cursor:pointer;
  color:var(--muted);background:#fff;border:1px solid var(--line)}
.tl-crit-like.on{color:var(--brand-text);border-color:#b9cdff;background:var(--brand-soft);font-weight:600}
.tl-crit-rv{font-size:12px;padding:3px 10px;border-radius:99px;cursor:pointer;background:#fff}
.tl-crit-rv.ok{color:var(--good-text);border:1px solid #bfe8d3}
.tl-crit-rv.no{color:var(--muted);border:1px solid var(--line)}
.tl-crit-ts{font-size:11.5px;color:var(--muted)}
.tl-crit-mute{font-size:12.5px;color:var(--muted);padding:6px 0}

/* ======================================================================
   v6.76：① 吐槽面板免提交（提示行顶替「提交」按钮）
         ② 讲解里「凡是 AI 标注的」—— 点一下就能和 AI 聊这段（不限维度）
   ---------------------------------------------------------------------
   ② 与「逐维回怼」是两回事，别混：
        · 回怼  = 冲着**某一维的分数**去申辩，服务端硬护栏只可能改那一维；
        · 这里  = 冲着**AI 写的那段话本身**去聊（想法不同 / 想追问），
                 走 /chat 且 dim 留空 → 普通自由讨论，**永不改分**。
      正因为是「聊」不是「申辩」，才敢做成整块可点 —— 点错了也改不了分。 */
.tl-crit-tip{margin-top:6px;font-size:12px;line-height:1.7;color:var(--muted,#6b7590)}
.tl-crit-tip b{color:var(--brand-text,#3a6df0)}
/* 可聊的 AI 标注块：只在悬停时露出「点一下和 AI 聊」的角标，平时不打扰 */
/* v6.77：+ .fb-dim（七维卡：精度 / 序度 / 高度…）—— 单击就地跟 AI 聊这一维 */
.ann-item,.tl-ref-b,.rd-b,.fb-dim{position:relative}
.ann-item::after,.tl-ref-b::after,.rd-b::after,.fb-dim::after{
  content:'💬 点一下和 AI 聊这段';position:absolute;right:2px;top:-2px;z-index:1;
  font-size:11px;line-height:1.5;color:var(--muted,#6b7590);background:rgba(255,255,255,.92);
  border:1px solid var(--line,#e5eaf3);border-radius:8px;padding:1px 6px;
  opacity:0;transition:opacity .15s;pointer-events:none;white-space:nowrap}
.ann-item:hover::after,.tl-ref-b:hover::after,.rd-b:hover::after,.fb-dim:hover::after{opacity:.9}
/* 维度卡里「💬 回一句」那一块本来就有自己的提示，别让角标压在它上面 */
.fb-dim::after{top:4px;right:6px}
.mk-talk{margin:8px 0 2px;border:1px solid var(--line,#e5eaf3);border-radius:10px;
  background:#fbfcfe;padding:8px 10px;font-size:13px;cursor:default}
.mk-t-h{font-weight:600;color:var(--ink,#1c2333);margin-bottom:4px}
.mk-t-h em{margin-left:6px;font-style:normal;font-weight:400;font-size:11.5px;color:var(--muted,#6b7590)}
.mk-t-q{max-height:88px;overflow:auto;border-left:3px solid #dfe6f5;background:#f4f7fd;
  padding:5px 8px;border-radius:0 6px 6px 0;color:var(--muted,#6b7590);font-size:12px;line-height:1.65}
.mk-t-log{margin:6px 0}
.mk-t-log .chat-msg{margin:5px 0}
.mk-t-log .chat-bubble{font-size:12.5px}
.mk-t-foot{margin-top:5px;font-size:11.5px;color:var(--muted,#6b7590);line-height:1.6}

  /* ================= v7.08：联想画布（play 视图） ================= */
  /* 画布上只摆已知/未知两个营 + 学生落的想法。v7.09 起：说明/思路收进「❓ 帮助」「💡 思路说明」
     浮层、正解步骤卡与未用联想不渲染 —— 画布上一行说明文字都不占（用户：「大家都看图的」）。 */
  .mm-play .mm-game{display:none!important}
  /* 接龙 / 主攻 / 低权重是「全盘」玩法，联想画布里不摆（全屏里还在） */
  .mm-play .mm-gameb,.mm-play .mm-fst,.mm-play .mm-lowb{display:none!important}
  /* 接龙中不给「思路说明」—— 那里面是先走哪条 + 总结，等于剧透 */
  .mind-mmbox.is-play .mm-noteb{display:none!important}
  /* 想法节点：暖底橙边；概率配色描在边上 —— 绿=高概率 / 灰=可能 / 红=小概率 */
  .n-idea{cursor:pointer}
  .n-idea .mm-r{fill:#fff8ee;stroke:#e0b269}
  .n-idea.pr-high .mm-r{stroke:#2fa858;stroke-width:1.6}
  .n-idea.pr-mid .mm-r{stroke:#c9cfdb}
  .n-idea.pr-low .mm-r{stroke:#e05252;stroke-width:1.6}
  /* 框选高亮 */
  .mm-n.sel .mm-r{stroke:#3b6ef5;stroke-width:2.4;fill:#eef4ff}
  /* 联想菜单：挂在 mm-wrap 上（absolute），点节点弹出 */
  .mm-menu{position:absolute;z-index:60;min-width:230px;max-width:320px;
    background:#fff;border:1px solid #d8e0f0;border-radius:12px;
    box-shadow:0 10px 28px rgba(30,40,80,.18);padding:6px}
  .mm-menu-h{display:flex;justify-content:space-between;align-items:center;gap:8px;
    padding:3px 4px 7px;font-size:12.5px;color:#3d4761;
    border-bottom:1px dashed #e6e8ee;margin-bottom:4px}
  .mm-menu-h b{font-weight:700;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
  .mm-menu-x{border:0;background:none;cursor:pointer;color:#98a0b3;font-size:14px;padding:0 2px}
  .mm-menu-x:hover{color:#3d4761}
  /* v7.11b：删除按钮不再挂 .mm-menu-i（它是一条命令，不是候选），样式沿用同一套 */
  .mm-menu-i,.mm-menu-del{display:flex;align-items:center;gap:8px;width:100%;text-align:left;
    border:0;background:none;cursor:pointer;padding:7px 9px;border-radius:8px;
    font-size:13px;color:#3d4761;line-height:1.45}
  .mm-menu-i:hover,.mm-menu-del:hover{background:#f2f6ff}
  .mm-menu-i.done{opacity:.45;cursor:default}
  .mm-menu-i.done:hover{background:none}
  .mm-menu-i span,.mm-menu-del span{flex:1}
  .mm-dot{width:9px;height:9px;border-radius:50%;flex:0 0 9px}
  .mm-dot.d-high{background:#2fa858}
  .mm-dot.d-mid{background:#b9c0cf}
  .mm-dot.d-low{background:#e05252}
  .mm-menu-load{padding:12px 9px;font-size:12.5px;color:#7a8296}
  /* v7.11：菜单底部的「自己写一条」输入行 */
  .mm-menu-new{display:flex;gap:6px;margin-top:5px;padding-top:7px;border-top:1px dashed #e6e8ee}
  .mm-menu-inp{flex:1 1 auto;min-width:0;border:1px solid #d8e0f0;border-radius:8px;
    padding:6px 8px;font-size:12.5px;color:#3d4761;background:#fbfcfe;outline:none}
  .mm-menu-inp:focus{border-color:#9db4ef;background:#fff}
  .mm-menu-add{flex:0 0 auto;border:0;background:var(--brand,#3b6ef5);color:#fff;cursor:pointer;
    padding:6px 10px;border-radius:8px;font-size:12.5px;font-weight:600}
  .mm-menu-add:hover{filter:brightness(1.08)}
  .mm-menu-del{border-top:1px dashed #f2d8d5;margin-top:4px;border-radius:8px}
  /* v7.14：一级条目的「› N 条」—— 点进去是这条联想在这道题上的具体落地做法 */
  .mm-menu-back{border:1px solid #d8e0f0;background:#fff;color:#5f6a80;border-radius:6px;
    font-size:12px;line-height:1.5;padding:0 6px;cursor:pointer;margin-right:4px}
  .mm-menu-back:hover{border-color:var(--brand-text,#3b6ef5);color:var(--brand-text,#3b6ef5)}
  .mm-menu-go{flex:0 0 auto;font-style:normal;font-size:11px;color:#8b93a7;
    background:#f2f5fb;border-radius:8px;padding:1px 6px;margin-left:4px;white-space:nowrap}
  .mm-menu-i.has-sub .mm-menu-go{color:var(--brand-text,#3b6ef5);background:#eaf1ff}
  .mm-menu-i:hover .mm-menu-go{background:var(--brand,#3b6ef5);color:#fff}
  /* v7.17：联想来源角标 —— 手册里的不加标记，「攒」=自动沉淀库（以前 AI/联网攒的），
     「AI」= 文档里暂时没有这一条，由联网检索/模型整理。学生一眼分清哪条是老师手册的原文。 */
  .mm-src{flex:0 0 auto;font-style:normal;font-size:10px;line-height:1.5;border-radius:6px;
    padding:0 5px;margin-left:4px;white-space:nowrap;background:#f2f5fb;color:#8b93a7}
  .mm-src.s-arch{background:#fdf6e7;color:#a3761f;border:1px solid #f0e2c2}
  .mm-src.s-ai{background:#eef1f7;color:#7c8496;border:1px solid #dde3ee}
  .mm-menu-sub{font-size:12px;color:#5f6a80;background:#f7f9fd;border:1px solid #e6ebf5;
    border-radius:8px;padding:6px 8px;margin-bottom:6px;line-height:1.5}
  .mm-menu-subs{display:block;font-size:11px;color:#8b93a7;margin-top:3px}
  .mm-menu-i2{align-items:flex-start}
  .mm-menu-i2t{flex:0 0 auto;font-style:normal;font-size:11px;color:#98a0b3;margin-left:6px}
  .mm-menu-hint{font-size:11px;color:#98a0b3;padding:4px 9px;background:none}
  /* v7.18：验算筛掉的联想 —— 说清「卡在哪」，学生看得见系统真的算过 */
  .mm-menu-bad{margin:3px 6px 0;padding:5px 8px;border-radius:7px;background:#fdf2f0;
    border:1px solid #f3d3cd;font-size:11px;color:#a8442f;line-height:1.6}
  .mm-menu-badw{display:block;color:#8a7b7a;padding-left:2px}
  /* v7.13：每条联想右侧的「去掉」小叉 —— 去掉后不再出现在菜单里（复位布局才回来） */
  .mm-menu-cut{flex:0 0 auto;font-style:normal;color:#c3c9d6;font-size:12px;padding:0 2px;
    border-radius:5px;line-height:1}
  .mm-menu-cut:hover{color:#c2402f;background:#fdeceb}
  /* v7.13：具体化不了的那条 —— 菜单上老实说一句，别硬编一句看着像实际不成立的话 */
  .mm-nosp{display:block;font-style:normal;font-size:11px;color:#9aa2b4;margin-top:2px}
  /* v7.13：「恢复已去掉的 N 条」 */
  .mm-menu-restore{display:block;width:100%;text-align:left;border:0;background:none;cursor:pointer;
    padding:6px 9px;border-radius:8px;font-size:12px;color:#2a4a86;
    border-top:1px dashed #e6e8ee;margin-top:4px}
  .mm-menu-restore:hover{background:#f2f6ff}
  /* v7.13：新增已知 / 未知的输入框（组合浮层里那个） */
  .mm-combo .mm-cb-inp{border:1px solid #d8e0f0;border-radius:9px;padding:7px 9px;
    font-size:13px;color:#3d4761;min-width:190px;outline:none}
  .mm-combo .mm-cb-inp:focus{border-color:#9db4ef}
  /* 右键框选：fixed 跟屏幕走，松手消失 */
  .mm-selbox{position:fixed;z-index:70;border:1.5px dashed #3b6ef5;
    background:rgba(59,110,245,.08);pointer-events:none;border-radius:4px}
  /* 组合浮层 */
  .mm-combo{position:fixed;z-index:80;background:#fff;border:1px solid #d8e0f0;
    border-radius:12px;box-shadow:0 10px 28px rgba(30,40,80,.18);padding:9px 10px;
    display:flex;gap:8px;align-items:center;font-size:13px;color:#3d4761}
  .mm-combo .mm-cb-ok{border:0;background:var(--brand,#3b6ef5);color:#fff;cursor:pointer;
    padding:7px 12px;border-radius:9px;font-weight:600;font-size:13px}
  .mm-combo .mm-cb-ok:hover{filter:brightness(1.08)}
  .mm-combo .mm-cb-ok:disabled{opacity:.6;cursor:default}
  .mm-combo .mm-cb-no{border:1px solid #d8e0f0;background:#fff;color:#5a6478;cursor:pointer;
    padding:7px 10px;border-radius:9px;font-size:13px}
  .mm-combo .mm-cb-no:hover{background:#f5f7fa}
  /* ================= v7.09：帮助 / 思路说明 浮层 ================= */
  /* 挂在 mm-wrap 上（absolute），点工具条按钮开合；画布上一行说明都不占 */
  .mm-pop{position:absolute;z-index:65;top:10px;right:10px;width:min(560px,calc(100% - 24px));
    max-height:calc(100% - 24px);display:flex;flex-direction:column;background:#fff;
    border:1px solid #d8e0f0;border-radius:12px;box-shadow:0 12px 32px rgba(30,40,80,.18);
    padding:10px 12px;font-size:13px;color:#3d4761}
  .mm-pop.hidden{display:none}
  .mm-pop .mm-pop-h{flex:0 0 auto;display:flex;justify-content:space-between;align-items:center;
    gap:8px;margin-bottom:6px;font-weight:700;color:#274a86}
  .mm-pop .mm-pop-b{overflow:auto}
  .mm-pop .mm-pop-b p{margin:0 0 7px;line-height:1.85}
  .mm-pop .mm-prio-wrap,.mm-pop .mm-sum{max-height:44vh;overflow:auto;margin:0 0 8px}
  .mm-pop .mm-sum:last-child{margin-bottom:0}
  /* 浮层打开时按钮亮灯 */
  .mm-btn.mm-helpb.on,.mm-btn.mm-noteb.on{background:#eef4ff;border-color:#9db4ef;color:#274a86}

/* ===== v7.22：① 解题地图导航页 ② 右上角管理小齿轮 ③ 讲解标注的版本联动 ===== */

/* 右上角管理小齿轮（低频入口，仅网管可见） */
.admin-fab{position:fixed;top:14px;right:14px;z-index:60;width:40px;height:40px;
  border-radius:50%;border:1px solid #d8e0f0;background:rgba(255,255,255,.92);
  color:#5b6b8c;font-size:17px;line-height:1;cursor:pointer;
  box-shadow:0 3px 10px rgba(30,40,80,.14)}
.admin-fab:hover{background:#fff;color:#274a86;border-color:#9db4ef}
.admin-fab.hidden{display:none}

/* 解题地图一览列表 */
#mapList{margin-top:10px}
.map-item{display:flex;align-items:center;gap:10px;padding:10px 12px;margin-bottom:8px;
  border:1px solid #e2e8f5;border-radius:12px;background:#fbfcfe;cursor:pointer;
  transition:all .15s}
.map-item:hover{border-color:#9db4ef;background:#f2f6ff}
.map-item .map-no{font-weight:700;color:#274a86;min-width:52px}
.map-item .map-meta{flex:1;font-size:13px;color:#5b6b8c;line-height:1.6}
.map-item .map-meta b{color:#2c3550}
.map-item .map-go{flex:0 0 auto;font-size:13px;color:#274a86;font-weight:600}
.map-guide{display:grid;grid-template-columns:repeat(auto-fit,minmax(170px,1fr));gap:10px}
.mg-card{border:1px solid #e2e8f5;border-radius:12px;background:#fbfcfe;padding:13px 14px;cursor:pointer;transition:all .15s}
.mg-card:hover{border-color:#9db4ef;background:#f2f6ff}
.mg-card b{display:block;font-size:13px;font-weight:600;color:#2c3550}
.mg-card span{display:block;font-size:12px;color:#5b6b8c;line-height:1.6;margin-top:3px}
.mg-card.off{opacity:.55;cursor:not-allowed}
.mg-card.off:hover{border-color:#e2e8f5;background:#fbfcfe}

/* v7.22：讲解标注的版本联动 —— 当前版本下不是「实测」的维度，标注弱化
   （半透明 + 虚线框），一眼看出哪些是按这一版口径实测的、哪些是推断/估算。 */
.tl-tag.tl-infer{opacity:.55;border-style:dashed}
mark.tl-m.tl-infer{opacity:.55}

/* ---- v7.22：结构网三件套（🧩 结构面板 / 🎯 识别练习 / ⚙ 组合状态） ---- */
.mm-struct-tip,.mm-struct-empty{font-size:12px;color:#7a86a0;line-height:1.7;margin:0 0 8px}
.mm-struct-i{display:flex;flex-wrap:wrap;align-items:baseline;gap:4px 10px;padding:9px 11px;
  margin:0 0 7px;border:1px solid #e2e8f5;border-radius:10px;cursor:pointer;background:#fbfcff}
.mm-struct-i:hover{border-color:#9db4ef;background:#f4f7ff}
.mm-struct-i.on{border-color:var(--brand-text,#3b6ef5);background:#eef3ff;box-shadow:0 0 0 1px rgba(59,110,245,.25)}
.mm-struct-n{font-weight:600;font-size:13px;color:#2c3550}
.mm-struct-w{font-size:12px;color:#5f6a80}
.mm-struct-h{font-size:11px;color:#8a93ab;background:#f0f3fa;border-radius:6px;padding:1px 7px}
.mm-quiz-q{font-size:13px;color:#2c3550;font-weight:600;margin:0 0 9px}
.mm-quiz-opt{display:block;width:100%;text-align:left;margin:0 0 7px;padding:8px 12px;
  border:1px solid #d8e0f0;border-radius:10px;background:#fff;cursor:pointer;
  font-size:13px;color:#2c3550;line-height:1.5}
.mm-quiz-opt:hover:not(:disabled){border-color:#9db4ef;background:#f4f7ff}
.mm-quiz-opt:disabled{cursor:default}
.mm-quiz-opt.mm-quiz-yes{border-color:#2fa858;background:#eefaf2;color:#1d7a41;font-weight:600}
.mm-quiz-opt.mm-quiz-no{border-color:#e05252;background:#fdeeee;color:#b03a3a}
.mm-quiz-r{margin:4px 0 8px;padding:9px 11px;border-radius:10px;background:#f4f7ff;
  font-size:13px;color:#2c3550;line-height:1.7;border:1px solid #dfe6f5}
.mm-quiz-why,.mm-quiz-hit{font-size:12px;color:#5f6a80}
.mm-quiz-bar{display:flex;justify-content:space-between;align-items:center;margin:2px 0 6px}
.mm-quiz-sc{font-size:12px;color:#7a86a0}
.mm-quiz-next{border:0;background:var(--brand,#3b6ef5);color:#fff;border-radius:8px;
  padding:6px 14px;cursor:pointer;font-size:12px}
.mm-quiz-next:hover{filter:brightness(1.08)}
/* ⚙ 组合状态：画布空白处左键变框选，光标换十字提醒 */
.mind-mmbox.is-combo .mm-stage{cursor:crosshair}
.mm-btn.mm-combob.on{background:var(--brand,#3b6ef5);border-color:var(--brand-text,#3b6ef5);color:#fff}
.mm-btn.mm-combob.on:hover{filter:brightness(1.08);color:#fff}

/* ================= v7.24：首屏改造（热力图 + 解析框架六段） ================= */
.profile-intro{margin:0 0 12px}
.intro-card{background:var(--card,#fff);border:1px solid var(--line,#e5eaf3);border-radius:12px;padding:12px 14px;margin-bottom:10px}
.intro-why{background:#fff8ec;border-color:#f6dfb4}
.intro-k{font-size:13px;font-weight:500;color:#a86a12;margin-bottom:4px}
.intro-v{font-size:13px;color:var(--ink,#1c2333);line-height:1.65}
.intro-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(268px,1fr));gap:10px;margin-bottom:10px}
.intro-grid .intro-card{margin-bottom:0}
.intro-t{font-size:14px;font-weight:500;color:var(--ink,#1c2333)}
.intro-t2{font-size:15px;font-weight:500;color:var(--ink,#1c2333)}
.intro-k2{font-size:13px;font-weight:500;color:var(--muted,#6b7590)}
.intro-s{font-size:12px;color:var(--muted,#6b7590);margin:2px 0 6px;line-height:1.5}
.rd-box{padding:2px 0}
.rd-legend{display:flex;align-items:center;gap:12px;font-size:12px;color:var(--muted,#6b7590);margin:2px 0 6px;flex-wrap:wrap}
.rd-legend .sw{display:inline-block;width:10px;height:10px;border-radius:2px;vertical-align:-1px}
.rd-legend .sw.dash{width:16px;height:0;border-radius:0;background:none;margin-left:8px}
.rd-hint{font-size:12px;color:var(--muted,#6b7590);line-height:1.6}
.gloss{display:grid;grid-template-columns:repeat(auto-fit,minmax(196px,1fr));gap:8px;margin-top:6px}
.gloss .gl{text-align:left;background:var(--card,#fff);border:1px solid var(--line,#e5eaf3);border-radius:10px;padding:8px 10px;cursor:pointer;font:inherit;display:block;width:100%}
.gloss .gl b{display:block;font-size:13px;font-weight:500;color:var(--ink,#1c2333)}
.gloss .gl span{display:block;font-size:12px;color:var(--muted,#6b7590);line-height:1.5}
.gloss .gl.on{border-color:#f0a13a;background:#fff8ec}
.intro-cta{display:flex;align-items:center;gap:10px;flex-wrap:wrap;margin-top:2px}
.intro-cta .btn{width:auto;display:inline-block;padding:9px 18px;font-size:13px;margin:0}
.intro-note{font-size:12px;color:var(--muted,#6b7590);line-height:1.5;flex:1;min-width:220px}
.intro-head{display:flex;align-items:flex-start;justify-content:space-between;gap:10px;flex-wrap:wrap;margin-bottom:10px}
.intro-head .btn{width:auto;display:inline-block;padding:9px 18px;font-size:13px;margin:0}
.src-row{display:flex;gap:8px;flex-wrap:wrap}
.src-b{font:inherit;font-size:13px;padding:7px 14px;border-radius:10px;cursor:pointer;background:var(--card,#fff);border:1px solid var(--line,#e5eaf3);color:var(--ink,#1c2333)}
.src-b.on{border-color:var(--brand-text,#3a6df0);background:var(--brand-soft,#eaf0ff)}
.src-b.off{opacity:.55;color:var(--muted,#6b7590)}
.src-note{font-size:12px;color:var(--muted,#6b7590);margin:6px 0 10px;line-height:1.55}
.sample-head{display:flex;align-items:center;gap:8px;flex-wrap:wrap;margin-bottom:2px}
.tabs{display:flex;gap:6px;flex-wrap:wrap}
.tab-b{font:inherit;font-size:12px;padding:5px 10px;border-radius:8px;cursor:pointer;background:var(--card,#fff);border:1px solid var(--line,#e5eaf3);color:var(--ink,#1c2333)}
.tab-b.on{border-color:var(--brand-text,#3a6df0);background:var(--brand-soft,#eaf0ff)}
.st-row{border-top:1px solid var(--line,#e5eaf3)}
.st-row.miss .st-t{color:var(--muted,#6b7590);font-weight:400}
.st-head{width:100%;text-align:left;font:inherit;background:none;border:none;padding:10px 0;display:flex;align-items:center;gap:10px;cursor:pointer}
.st-no{width:20px;height:20px;flex:0 0 20px;border-radius:50%;background:var(--brand-soft,#eaf0ff);color:var(--brand-text,#3a6df0);font-size:11px;display:flex;align-items:center;justify-content:center}
.st-t{font-size:13px;font-weight:500;color:var(--ink,#1c2333);flex:1}
.st-tag{font-size:11px;color:var(--muted,#6b7590);background:#f5f7fb;border-radius:8px;padding:2px 7px}
.st-x{font-size:11px;color:var(--muted,#6b7590)}
.st-body{font-size:13px;color:var(--muted,#6b7590);line-height:1.75;padding:0 0 12px 30px}
.st-body p{margin:0 0 2px}
.intro-foot{font-size:12px;color:var(--muted,#6b7590);margin-top:10px;padding-top:10px;border-top:1px solid var(--line,#e5eaf3);line-height:1.6}
.ana-sub{margin:12px 0 6px}
.rd-mini{display:flex;align-items:center;gap:10px;background:#f7f9fc;border:1px solid var(--line,#e5eaf3);border-radius:10px;padding:7px 10px;cursor:pointer}
.rd-mini:hover{border-color:var(--brand-text,#3a6df0)}
/* 两个类叠着写：本 .rd-mini 自带 display:flex，单类 .hidden 压不住它 ——
   上一版踩过「hidden 失效」的坑，这里显式声明一次。 */
.rd-mini.hidden{display:none}
.rd-mini-t{font-size:12px;color:var(--muted,#6b7590);line-height:1.55}
.rd-mini-t span{display:block}
.rd-mini-t .mj{font-size:13px;font-weight:500;color:var(--ink,#1c2333)}
.rd-mini-t .rd-mini-go{color:var(--brand-text,#3a6df0)}
.src-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(168px,1fr));gap:9px}
.src-grid .src-b{display:block;text-align:left;padding:10px 12px}
.src-t{display:block;font-size:13px;font-weight:500;color:var(--ink,#1c2333)}
.src-d{display:block;font-size:12px;color:var(--muted,#6b7590);line-height:1.55;margin-top:3px}
.start-wrap{margin-top:2px}
/* v7.30：这一行原来把按钮压成 13px 的小内联块（.start-wrap .btn 覆盖了 .btn 基础款）。
   用户 2026-09-25 要求「我来讲题」与「开始拆解」**逐项统一** —— 而逐项统一的基准
   就是实测值，不是「我以为的 .btn 基础款」：
     旧实测 = 13px / inline-block / width:auto / padding 9px 18px
     基础款 = 15px / block 通栏 / padding 13px / 圆角 12px
   现在两边都回到 .btn 基础款，只差一个 position（「我来讲题」固定在底部）——
   这样「逐项统一」才是真的统一，而不是「看起来差不多」。 */

/* ================= v7.26：五页改版（测评首屏 / 剖析首屏 / 地图 / PK擂台 / 教研工作台） ================= */
/* —— 深度测评首屏：左右分栏 + 双图并排 —— */
.deep-hero h1{font-size:20px;font-weight:600;letter-spacing:.3px;margin:2px 0 4px}
.deep-hero p{font-size:13px;color:var(--muted,#6b7590);margin:0 0 12px}
.deep-card{padding:14px}
.deep-split{display:grid;grid-template-columns:minmax(232px,5fr) minmax(260px,6fr);gap:14px}
@media (max-width:760px){.deep-split{grid-template-columns:1fr}}
.deep-left h2,.deep-rhead h2{font-size:15px;font-weight:600;margin:0}
.deep-hint{font-size:12px;color:var(--muted,#6b7590);margin:4px 0 10px}
.deep-dims{display:grid;grid-template-columns:1fr 1fr;gap:8px}
.deep-dim{display:block;text-align:left;font:inherit;background:var(--card,#fff);border:1px solid var(--line,#e5eaf3);border-radius:10px;padding:8px 10px;cursor:pointer;transition:.15s}
.deep-dim:hover{border-color:var(--brand-text,#3a6df0)}
.deep-dim.on{border-color:#f0a13a;background:#fff8ec}
.deep-dim .nm{font-size:13px;font-weight:600;color:var(--ink,#1c2333)}
.deep-dim .ds{display:block;font-size:11.5px;color:var(--muted,#6b7590);margin-top:2px;line-height:1.45}
.deep-dim .num{display:flex;align-items:baseline;gap:6px;margin-top:5px}
.deep-dim .num b{font-size:16px;font-weight:600;color:var(--ink,#1c2333)}
.deep-dim .d-up{font-size:11px;color:#0F6E56}
.deep-dim .d-dn{font-size:11px;color:#A32D2D}
.deep-rhead{display:flex;align-items:baseline;justify-content:space-between;gap:8px;margin-bottom:8px}
.deep-rhead span{font-size:12px;color:var(--muted,#6b7590)}
.deep-dual{display:grid;grid-template-columns:1fr 1fr;gap:10px}
.deep-cell{background:#f7f9fc;border:1px solid var(--line,#e5eaf3);border-radius:10px;padding:8px 10px}
.deep-cell .dc-h{font-size:12px;font-weight:600;color:var(--ink,#1c2333);margin-bottom:2px}
.deep-cell .dc-h small{display:block;font-size:11px;color:var(--muted,#6b7590);font-weight:400;margin-top:1px}
.deep-legend{display:flex;align-items:center;gap:14px;font-size:12px;color:var(--muted,#6b7590);margin:8px 0 6px;flex-wrap:wrap}
.deep-legend .sw{display:inline-block;width:10px;height:10px;border-radius:2px}
.deep-legend .sw.dash{width:16px;height:0;border-radius:0;background:none;border-top:2px dashed #888780;margin-left:8px}
.deep-verdict{font-size:13px;color:var(--ink,#1c2333);background:#fff8ec;border:1px solid #f6dfb4;border-radius:10px;padding:9px 12px;line-height:1.65}
.deep-cta{display:flex;align-items:center;gap:12px;flex-wrap:wrap;border-top:1px dashed var(--line,#e5eaf3);margin-top:12px;padding-top:12px}
.deep-cta .lead{font-size:13.5px;color:var(--ink,#1c2333)}
.deep-cta .btn{width:auto;display:inline-block;padding:9px 20px;font-size:13px;margin:0}

/* —— 深度剖析首屏：新标题 + 迷你卡/指标卡下移 —— */
.ana-title h1{font-size:20px;font-weight:600;letter-spacing:.3px;margin:2px 0 4px}
.ana-title p{font-size:12.5px;color:var(--muted,#6b7590);margin:0}
.ana-tail{display:flex;align-items:center;justify-content:space-between;gap:12px;flex-wrap:wrap;margin:12px 0 4px}
.ana-tail .sub{font-size:13px;color:var(--muted,#6b7590);line-height:1.6;max-width:56ch}
.ana-metrics{display:grid;grid-template-columns:repeat(auto-fit,minmax(96px,1fr));gap:8px;margin-top:10px}
.ana-metric{background:#f7f9fc;border:1px solid var(--line,#e5eaf3);border-radius:10px;padding:8px 10px;text-align:center}
.ana-metric .k{font-size:11.5px;color:var(--muted,#6b7590)}
.ana-metric .v{font-size:17px;font-weight:600;color:var(--ink,#1c2333);margin-top:2px}

/* —— 解题地图首屏 hero —— */
.map-hero h1{font-size:20px;font-weight:600;letter-spacing:.3px;margin:2px 0 4px}
.map-hero p{font-size:13px;color:var(--muted,#6b7590);margin:0 0 12px}
.map-hero .mstat{font-size:12px;color:var(--muted,#6b7590);background:var(--card,#fff);border:1px solid var(--line,#e5eaf3);border-radius:99px;padding:4px 12px;white-space:nowrap}

/* —— 我要PK：思维擂台 + 匿名擂台榜 —— */
.subtabs{display:flex;gap:6px;flex-wrap:wrap;margin-bottom:12px}
.subtabs button{font:inherit;font-size:13px;padding:6px 14px;border-radius:99px;border:1px solid var(--line,#e5eaf3);background:var(--card,#fff);color:var(--ink,#1c2333);cursor:pointer;transition:.15s}
.subtabs button.on{background:var(--brand,#3a6df0);border-color:var(--brand-text,#3a6df0);color:#fff}
.vshead{display:flex;align-items:center;justify-content:space-between;gap:10px;flex-wrap:wrap;margin-bottom:8px}
.vshead .who{font-size:13px;color:var(--muted,#6b7590)}
.vshead .score{font-size:20px;font-weight:700;color:var(--ink,#1c2333)}
.vshead .score small{font-size:12px;font-weight:400;color:var(--muted,#6b7590);margin-left:4px}
/* v7.49：换对手按钮 —— 从底部 CTA **提到对决条上面**（用户 2026-09-27：
   「换一位对手按钮，放在条形的上面，我深蓝、同学浅蓝那一排」的上面）。
   放在 .vshead 与 .vslegend 之间：它管的是「这一场跟谁打」，属于本场对决的设置。
   ★ 基础档**不挂 .pkp** —— 宽窄屏都有这个按钮，两边都要有样式（PC 上挂 .pkp 会全裸）。 */
.vsswap{display:flex;align-items:center;justify-content:space-between;gap:12px;flex-wrap:wrap;margin:0 0 10px}
.vsswap .lead{font-size:13.5px;color:var(--ink,#1c2333)}
/* v7.51：按钮钉在行右缘（用户 2026-09-28「往右靠，方便点击」）——
   原来靠 space-between，行一换行（窄卡 / 文案长）按钮会掉到下一行**左端**；
   且手机档 .pkp .vsswap 是 flex-start、按钮类名是 ghostbtn 不是 btn —— 两边都漏。
   用「最后一个子元素 margin-left:auto」一条规则同时盖住 btn / ghostbtn、宽 / 窄屏。 */
.vsswap > button:last-child{margin-left:auto}
.vsswap .btn{width:auto;display:inline-block;padding:9px 20px;font-size:13px;margin:0 0 0 auto}
.vsrow{display:flex;align-items:center;gap:8px;margin:7px 0}
/* v7.40：对决条第一列的维度名（高度/广度/深度…）—— 用户原话
   「不标的话根本不知道是什么指标，哪个维度在比」。宽窄屏共用（pkp 不覆盖它）。 */
.vsrow .dm{flex:0 0 30px;font-size:12px;font-weight:600;color:var(--ink-2,#4A5162)}
.vsrow .nm{font-size:12px;color:var(--ink,#1c2333);flex:0 0 76px}
.vsrow .bars{display:grid;grid-template-columns:1fr 1fr;gap:5px;flex:1}
.vsrow .bar{height:9px;background:#eef0f6;border-radius:5px;overflow:hidden}
.vsrow .bar i{display:block;height:100%;background:var(--brand,#3a6df0);border-radius:5px}
.vsrow .df{font-size:12px;font-weight:600;flex:0 0 34px;text-align:right}
.vsrow .df.up{color:#0F6E56}
.vsrow .df.dn{color:#A32D2D}
/* v7.40：vsverdict（赢在/输在那段文字）下线 —— 用户原话「这段文字完全可以不要，
   只要把维度标在柱状图上面就可以了」（维度名已上 .dm 列），样式一并删除。 */
.rkdim{display:flex;gap:6px;flex-wrap:wrap;margin:8px 0}
.rkdim button{font:inherit;font-size:12px;padding:4px 11px;border-radius:99px;border:1px solid var(--line,#e5eaf3);background:var(--card,#fff);color:var(--ink,#1c2333);cursor:pointer;transition:.15s}
.rkdim button.on{background:var(--brand,#3a6df0);border-color:var(--brand-text,#3a6df0);color:#fff}
.rankrow{display:flex;align-items:center;gap:10px;padding:7px 8px;border-radius:9px;font-size:13px}
.rankrow.me{background:var(--brand-soft,#eaf0ff);font-weight:600}
.rankrow .rk{width:22px;height:22px;flex:0 0 22px;border-radius:50%;background:#eef0f6;color:var(--muted,#6b7590);font-size:11.5px;display:flex;align-items:center;justify-content:center}
.rankrow .rk.r1{background:#f7d9a0;color:#7a4e00}
.rankrow .rk.r2{background:#dfe3ec;color:#4a5162}
.rankrow .rk.r3{background:#efd6c5;color:#7a3d1d}
.rankrow .nm2{flex:1}
.rankrow .sc2{font-weight:600;color:var(--ink,#1c2333)}
.pk-board-empty{font-size:13px;color:var(--muted,#6b7590);background:#f7f9fc;border:1px dashed var(--line,#e5eaf3);border-radius:10px;padding:14px;line-height:1.7;margin-top:8px}

/* —— 教研工作台（老师 / 教研室 / 网管；学生端无入口） —— */
.tb-entry{font:inherit;font-size:12.5px;padding:5px 12px;border-radius:99px;border:1px solid var(--line,#e5eaf3);background:var(--card,#fff);color:var(--ink,#1c2333);cursor:pointer;margin-right:8px;white-space:nowrap}
.tb-entry:hover{border-color:var(--brand-text,#3a6df0);color:var(--brand-text,#3a6df0)}
/* —— v7.44：顶栏「📤 分享本站」 ——
   与 .tb-entry 同一套视觉（胶囊 + 描边），不新造一套按钮样式。
   顶栏这一行有 4 个候选按钮（教研工作台 / 分享本站 / ⚙️ / 退出），窄屏必然挤，
   所以：① 窄屏（≤560px）只留图标、藏掉「分享本站」四个字（title 仍写着全称）；
   ② 顶栏本身不换行（.top-bar 已是 flex），这里只保证自己不把别人挤出去。 */
.top-share{font:inherit;font-size:12.5px;padding:5px 12px;border-radius:99px;border:1px solid var(--line,#e5eaf3);background:var(--card,#fff);color:var(--ink,#1c2333);cursor:pointer;margin-right:8px;white-space:nowrap}
.top-share:hover{border-color:var(--brand-text,#3a6df0);color:var(--brand-text,#3a6df0)}
.top-share .top-share-t{margin-left:4px}
@media (max-width:560px){
  .top-share{padding:5px 9px;margin-right:6px}
  .top-share .top-share-t{display:none}
  .tb-entry{padding:5px 9px;margin-right:6px}
}

/* ==================== v7.48 需求⑧：右上「我的」折叠菜单 ====================
   用户原话：「右上方『我的』这个折叠的并没有去写，包括账号更改、我的收藏、切换身份、退出等」。
   顶栏随之精简：🧰 教研工作台 / ⚙️ 网管控制台 / 退出 **三样搬进本菜单**，
   顶栏只剩「品牌 ←→ 📤 分享 · 我的 ▾」（原型稿 `_v748_ui_draft.html` §⑧ 两张手机图）。
   ★ 不做 hover 展开 —— 触屏点不到、键盘也不可达；开合一律由 app.js 的 myOpen()/myClose() 管，
     并且带上 aria-expanded，读屏能知道菜单是开着还是关着。
   ★ 上面 .tb-entry / .admin-fab / .exit-btn 三套样式**保留但已无 DOM 使用者**：
     搬进菜单后统一走 .my-it，视觉与菜单其余项一致，不再各是一套按钮皮肤。
     （.admin-fab 那份还是 position:fixed;top:14px;right:14px —— 别照它加回顶栏。） */
.mymenu{position:relative;flex:0 0 auto}
.my-pill{display:flex;align-items:center;gap:5px;font:inherit;font-size:12.5px;
  border:1px solid var(--line,#e5eaf3);border-radius:99px;padding:3px 10px 3px 3px;
  background:var(--card,#fff);color:var(--ink,#1c2333);cursor:pointer;white-space:nowrap;
  transition:border-color .15s,color .15s}
.my-pill:hover{border-color:var(--brand-text,#2A61EF);color:var(--brand-text,#2A61EF)}
.my-pill .my-av{width:21px;height:21px;border-radius:50%;background:var(--brand,#3a6df0);color:#fff;
  font-size:11px;font-weight:700;display:flex;align-items:center;justify-content:center;flex:0 0 auto}
.my-pill .my-ch{font-size:9px;color:var(--muted,#646D87);transition:transform .15s}
.mymenu.open .my-pill{border-color:var(--brand-text,#2A61EF);color:var(--brand-text,#2A61EF)}
.mymenu.open .my-ch{transform:rotate(180deg)}
.my-list{position:absolute;right:0;top:calc(100% + 8px);width:208px;background:var(--card,#fff);
  border:1px solid #e2e8f2;border-radius:12px;padding:5px;z-index:80;
  box-shadow:0 14px 34px rgba(25,35,70,.18)}
.my-list.hidden{display:none!important}
.my-head{padding:8px 10px 7px;border-bottom:1px solid #f0f3f8;margin-bottom:4px}
.my-head .my-hn{font-size:12.5px;font-weight:700;color:var(--ink,#1c2333);
  overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.my-head .my-hr{font-size:10.5px;color:var(--muted,#646D87);margin-top:1px;line-height:1.45}
.my-it{display:flex;align-items:center;gap:8px;width:100%;text-align:left;font:inherit;
  font-size:12.5px;color:var(--ink,#1c2333);background:none;border:0;border-radius:8px;
  padding:8px 10px;cursor:pointer}
.my-it:hover{background:#f4f7fd}
.my-it:focus-visible{outline:2px solid var(--brand,#3a6df0);outline-offset:-2px}
.my-it i{font-style:normal;width:16px;text-align:center;flex:0 0 auto}
/* v7.48：退出那一项的图标是内联 SVG（emoji 字形在真机上不可靠，见 index.html 的注释）——
   居中对齐一下，别让它贴着左边缘把文字挤歪。 */
.my-it i svg{display:block;margin:0 auto}
.my-it .my-sm{margin-left:auto;font-size:10.5px;color:var(--muted,#646D87)}
.my-it.danger{color:#c0392b}
.my-it.danger:hover{background:#fdf2f1}
.my-sep{height:1px;background:#f0f3f8;margin:4px 6px}
@media (max-width:420px){.my-list{width:196px}}

/* —— 账号更改 / 切换身份 两个弹层共用的壳（DOM 在 index.html 的 #mySheetMask） ——
   走 fixed 全屏遮罩：祖先 .phone / .screen-wrap 都是 overflow:visible 且无 transform，
   fixed 不会被裁（.toast 也是同一套定位，见上）。z-index 120 压过 .toast 的 99。 */
.mysheet-mask{position:fixed;inset:0;z-index:2147483500;background:rgba(18,26,46,.34);
  display:flex;align-items:center;justify-content:center;padding:18px}
.mysheet-mask.hidden{display:none!important}
.mysheet{width:min(360px,100%);max-height:86vh;overflow:auto;background:#fff;border-radius:16px;
  padding:16px 16px 14px;box-shadow:0 24px 60px rgba(18,26,46,.3)}
.mysheet h3{font-size:15.5px;font-weight:700;color:var(--ink,#1c2333);margin:0 0 4px}
.mysheet .ms-sub{font-size:12px;color:var(--muted,#646D87);line-height:1.6;margin:0 0 13px}
.ms-field{display:flex;align-items:center;gap:10px;margin-bottom:9px}
.ms-field.hidden{display:none!important}
.ms-field label{flex:0 0 44px;font-size:12.5px;color:var(--ink-2,#4a5266)}
.ms-field input,.ms-field select{flex:1 1 auto;min-width:0;font:inherit;font-size:13px;
  padding:7px 10px;border:1px solid var(--line,#e5eaf3);border-radius:9px;
  background:#fbfcfe;color:var(--ink,#1c2333)}
.ms-field input:focus,.ms-field select:focus{outline:2px solid var(--brand-soft,#eaf0ff);
  border-color:var(--brand,#3a6df0)}
.ms-roles{display:grid;grid-template-columns:1fr 1fr;gap:8px;margin-bottom:12px}
.ms-role{font:inherit;font-size:13px;padding:11px 8px;text-align:center;cursor:pointer;
  border:1px solid var(--line,#e5eaf3);border-radius:11px;background:#fbfcfe;color:var(--ink-2,#4a5266)}
.ms-role:hover{border-color:var(--brand,#3a6df0)}
.ms-role.on{border-color:var(--brand,#3a6df0);background:var(--brand-soft,#eaf0ff);
  color:var(--brand-text,#2A61EF);font-weight:700}
.ms-acts{display:flex;gap:9px;margin-top:14px}
.ms-acts button{flex:1 1 0;font:inherit;font-size:13.5px;font-weight:600;padding:10px;
  border-radius:10px;cursor:pointer;border:1px solid var(--line,#e5eaf3);
  background:#fff;color:var(--ink-2,#4a5266)}
.ms-acts button.primary{background:var(--brand,#3a6df0);border-color:var(--brand,#3a6df0);color:#fff}
.ms-acts button.primary:disabled{background:#c3cede;border-color:#c3cede;cursor:not-allowed}

.tb-hero{display:flex;align-items:flex-start;justify-content:space-between;gap:10px;flex-wrap:wrap;margin:2px 0 12px}
.tb-hero h1{font-size:20px;font-weight:600;margin:0 0 4px}
.tb-hero p{font-size:13px;color:var(--muted,#6b7590);margin:0}
.toolgrid{display:grid;grid-template-columns:repeat(auto-fit,minmax(220px,1fr));gap:10px;margin-top:12px}
.toolcard{text-align:left;font:inherit;border:1px solid var(--line,#e5eaf3);border-radius:12px;padding:12px 14px;background:var(--card,#fff);cursor:pointer;display:block}
.toolcard b{display:block;font-size:14px;color:var(--ink,#1c2333)}
.toolcard span{display:block;font-size:12px;color:var(--muted,#6b7590);margin-top:3px;line-height:1.5}
.toolcard.off{opacity:.55;cursor:not-allowed}

/* ================= v7.27 ================= */
/* 组合产物节点：橙描边（v7.28 起虚线外框改由 .mm-cframe 包络框承担，.mm-cbr 已退役） */
.mm-n.is-combo .mm-r{stroke:#e07a18}
/* v7.44：「此路不通」的组合产物（verdict=no）—— 红框 + 红色小字写卡点。
   与 low 的灰框刻意区分：灰 = 低概率（也许行），红 = 这条路走不通（明确不行）。
   用量：`.mm-n.is-nogo .mm-r` 描红 + 虚化填充；`.mm-nogo-t` 是节点里那行说明字。
   注意 .mm-n.is-nogo 这条**写在 .mm-n.is-combo 之后** —— 同一个节点两个类都挂时，
   红框要盖过橙框（后写的赢），因为「走不通」比「这是组合产物」更要紧。 */
.mm-n.is-nogo .mm-r{stroke:#d33a2c;stroke-width:1.6;stroke-dasharray:5 3;fill:#fff5f4}
.mm-n.is-nogo .mm-t{fill:#8c2318}
.mm-n.is-nogo .mm-nogo-t{fill:#c2402f;font-size:10.5px;font-weight:600}
/* v7.44：low = 「本题对不太上」（用户拍板「无关手册标灰」）——
   手册原文照留、不当成错误，所以是**灰**不是红：灰框 + 一行「本题：<为什么>」。
   用量：`.mm-n.is-soft .mm-r` 描灰；`.mm-soft-t` 是节点里那行说明字。
   注意：这条**写在 .n-idea.pr-low 之后**（pr-low 的描边是红色 #e05252），
   否则 low 节点会顶着红边，学生会把它当成「此路不通」。 */
.mm-n.is-soft .mm-r{stroke:#aab2c2;stroke-width:1.6;stroke-dasharray:5 3;fill:#fbfcfe}
.mm-n.is-soft .mm-t{fill:#5a6478}
.mm-n.is-soft .mm-soft-t{fill:#7b8499;font-size:10.5px;font-weight:600}
/* v7.44：组合框菜单里的状态标记（低概率 / 此路不通）—— 单靠小圆点分不清含义 */
.mm-mk{font-style:normal;font-size:10.5px;font-weight:600;margin-left:4px;padding:1px 5px;border-radius:6px;white-space:nowrap}
.mm-mk.mk-no{background:#fdeceb;color:#c2402f}
.mm-mk.mk-low{background:#f1f3f7;color:#6b7590}
/* 「🧮 重算」确认浮层说明 */
.mm-cb-desc{display:block;font-size:12.5px;color:#5a6478;line-height:1.7;padding:2px 4px 6px;max-width:300px;white-space:normal}
/* 菜单空结果重试 */
.mm-menu-retry{display:block;width:calc(100% - 8px);margin:2px 4px 6px;padding:6px 8px;border:1px dashed #e0b478;border-radius:8px;background:#fffaf2;color:#a06a1e;font-size:12.5px;cursor:pointer;text-align:center}
.mm-menu-retry:hover{background:#fdf3e0}
/* 手机版：横向空间全宽化 —— 记录详情容器链逐层吃 padding，375px 下盘面只剩 ~250px。
   逐层收紧：card 12→8、rec-detail 10→6，盘工具条按钮更紧凑，正文区不留无谓空隙 */
@media (max-width:640px){
  .card{padding:8px;margin-bottom:10px}
  .rec-detail{padding:6px}
  .mind-mmwrap{margin:8px 0 0}
  .mind-parse{gap:7px}
  .mind-mmbox{padding-left:5px;padding-right:5px}
  .mm-head{gap:5px;font-size:14.5px}
  .mm-head .mm-btn{padding:4px 7px;font-size:12px}
  .mm-stage{max-height:56vh}
}
/* v7.27b：mapScreen 内嵌盘容器 —— 盘才是主角，容器紧凑、卡片背景与详情一致 */
#mapEmbed .mind-parse{display:flex;flex-direction:column;gap:8px;background:#fbfcfe;border:1px solid var(--line,#e5eaf3);border-radius:12px;padding:10px;margin-bottom:12px}
#mapEmbed .mind-cw{margin:0}

/* ================= v7.28 ================= */
/* 组合框：成员 × 成员的橙色虚线包络框（渲染在 app.js 输出 .mm-cframe），
   成员节点原地原大；左键弹组合联想、右键拆框 */
.mm-cfr{fill:#e07a18;fill-opacity:.055;stroke:#e07a18;stroke-width:2;stroke-dasharray:7 4;cursor:pointer}
.mm-cframe:hover .mm-cfr{fill-opacity:.12}
.mm-cfl{font-size:11.5px;font-weight:600;fill:#c06a10;cursor:pointer;user-select:none}
/* 组合联想菜单里点一条 → 盘上那个产物节点闪两下（定位用） */
.mm-flash .mm-r{stroke:#e07a18;stroke-width:3;animation:mmflash .8s ease-in-out 2}
@keyframes mmflash{0%,100%{stroke-opacity:1}50%{stroke-opacity:.15}}
/* 撤销 / 继续按钮（禁用态淡下去） */
.mm-btn:disabled{opacity:.42;cursor:not-allowed}
/* 右键追问菜单 / 追问面板 */
.mm-ctx-body{display:flex;flex-direction:column;gap:2px;padding:4px}
.mm-ask-q{margin:6px 10px;padding:10px 12px;background:#f2f7ff;border:1px solid #cfe0fa;border-radius:10px;font-size:13.5px;line-height:1.7;color:#1c2333}
.mm-ask-ops{display:flex;gap:6px;padding:4px 10px 8px;flex-wrap:wrap}
/* 双击 AI 讲解浮层 */
.mm-pop.mm-explain{width:min(480px,calc(100% - 24px));max-height:70%;overflow:auto}
.mm-explain-b{padding:8px 12px;font-size:13.5px;line-height:1.75;color:#1c2333}
.mm-explain-b p{margin:0 0 6px}
.mm-explain-h{font-weight:700;color:#185fa5;margin-top:8px!important}
/* 📐 重绘题图浮层 */
.mm-pop.mm-fig{width:min(440px,calc(100% - 24px));max-height:76%;overflow:auto}
.mm-fig-b{padding:8px 10px}
.mm-geo-svg{width:100%;height:auto;background:#fff;border:1px solid var(--line,#e5eaf3);border-radius:10px}
.mm-geo-svg .g-ln{stroke:#1c2333;stroke-width:1.6;fill:none}
.mm-geo-svg .g-mk{stroke:#c2402f;stroke-width:1.4}
.mm-geo-svg .g-tx{font-size:13px;font-weight:600;fill:#1c2333}
.mm-fig-dsl{margin-top:6px;font-size:12px;color:var(--muted,#6b7590)}
.mm-fig-dsl pre{white-space:pre-wrap;word-break:break-all;background:#f5f7fb;border-radius:8px;padding:8px;font-size:11px;max-height:140px;overflow:auto}
/* 手机版：内嵌盘容器链再收紧 —— v7.27 公网实测 375px 下 wrap 只有 313px
   （#mapEmbed .mind-parse 的 padding+border 吃掉 22px），目标 ≥335px */
@media (max-width:640px){
  #mapEmbed .mind-parse{padding:4px;border-left:none;border-right:none;border-radius:0;margin-left:-2px;margin-right:-2px}
  #mapEmbed .mind-mmbox{padding-left:2px;padding-right:2px}
}

/* v7.28b：题意框内嵌 AI 几何图（几何题自动出现，非几何不占位） */
.mind-geo{margin:6px 0 2px}
.mind-geo-t{font-size:12px;color:#8a93a8;margin-bottom:4px}
.mind-geo .mm-geo-svg{max-width:380px}

/* ================= v7.28b：讲题记录五大模块标题 =================
   用户 2026-09-24：「这几块的标题醒目一些，从字号、颜色和位置予以区别」——
   1 题目照片 / 2 解题地图 / 3 原题再现（3.1 已知 3.2 所求） / 4 参考解析 / 5 我的讲解。
   实现：编号徽章 = 元素 data-mn 属性 + ::before 渲染（局部重画不丢）；
   全套样式限定在 .rec-mods 容器下（recordDetail 输出带这层），
   讲题结果页等复用同一批卡片的场景不受影响。 */
.rec-mods .rec-mod-h,
.rec-mods .rec-mind-h,
.rec-mods .tl-ref-t,
.rec-mods .tl-talk-fold .tl-head{
  display:flex;align-items:center;gap:8px;flex-wrap:wrap;
  padding:9px 12px;margin:2px 0 10px;border-radius:10px;
  font-size:15.5px;font-weight:700;color:#1c2333;line-height:1.4;
  border-left:4px solid var(--mc,#5a6b8c);
  background:linear-gradient(90deg,var(--mb,#eef1f7),rgba(255,255,255,0) 88%);
}
.rec-mods .rec-mod-h::before,
.rec-mods .rec-mind-h::before,
.rec-mods .tl-ref-t::before,
.rec-mods .tl-talk-fold .tl-head::before{
  content:attr(data-mn);
  display:inline-flex;align-items:center;justify-content:center;
  min-width:22px;height:22px;padding:0 5px;border-radius:7px;flex:none;
  background:var(--mc,#5a6b8c);color:#fff;font-size:12.5px;font-weight:800;
}
  /* v7.55：五个模块头同一套视觉（用户 2026-09-28：「12345，颜色、字号，字体一致，不然太花」）——
     原来灰蓝/紫/蓝/橙/绿五色各一套（编号徽章、左缘、底色全跟 --mc/--mb 走，五个头五种颜色）。
     现在五色全收进一条：站内主蓝（即原「AI 点评」的蓝）。字号字重本就共用上条规则
     （15.5px / 700），这里拔掉的是颜色差异源 —— 不再以颜色制造层级。 */
  .rec-mods{--mc:#185fa5;--mb:#e9f1fb}
  .rec-mod-s{font-size:12px;font-weight:400;color:#6b7590}
  /* v7.52：模块 3（AI 点评）折叠体内的批注清单 / 小节标题 */
  .rec-mods .rm-body[data-mnf="fb"]{padding:2px 12px 10px}
  .ann-t{font-size:13.5px;font-weight:700;color:#3d4761;margin:2px 0 8px;line-height:1.6}
/* 3.1 / 3.2 子标题：跟随「原题再现」的蓝色，比正文大一号 */
.rec-mods .mind-sec-h{font-size:13.5px;font-weight:700;color:#185fa5}
/* 模块标题与卡片内容的呼吸距 */
.rec-mods .rec-mind-h{margin-bottom:6px}
/* v7.51：五个模块标题行**左缘对齐**（用户 2026-09-28：「不对齐」）——
   原来 .tl-ref 自带 padding:12px 14px + 1px 边框，模块 5 的头比 1/2/3/4 缩进 15px；
   模块 3/4 的头原本还被 .rec-mind 卡壳又垫一层。记录详情里一律撤掉卡壳、拉到同一左缘，
   正文缩进由标题行自己的 padding 负责（.rec-mod-h 的 9px 12px）。 */
.rec-mods .tl-ref{padding:0;border:none;background:none;border-radius:0;margin-top:2px}
@media (max-width:640px){
  .rec-mods .rec-mod-h,.rec-mods .rec-mind-h,
  .rec-mods .tl-ref-t,.rec-mods .tl-talk-fold .tl-head{font-size:14.5px;padding:8px 10px}
}

/* ================= v7.28c：我要PK 手机版按设计稿重写（.pkp 作用域） =================
   （原参照 designs/51nbei-deep-redesign 原型已于 v7.40 归档进 _archive/ —— 它是
   「PC/平板版式总不对」的隐患源头；本作用域自 v7.40 起只挂手机。）
   结构：hero（页面级标题区，卡片外）→ card(subtabs + pvArena/pvBbs/pvStats)。
   调色板用设计稿原值（品牌紫），只作用于 #classScreen.pkp，不影响站内其他页面。
   v7.40：本作用域只挂手机（renderClass 里 ≥768px 不再加 pkp）—— PC/平板退回
   v7.27c 版式（chips + deep-hero + deep-split + intro-card，走基础样式与站点默认配色）。 */
#classScreen.pkp > .card{background:none;border:none;padding:0;border-radius:0}
.pkp{
  --brand:#534AB7; --brand-ink:#26215C; --brand-soft:#EEEDFE;
  --good:#0F6E56; --bad:#A32D2D;
  --ink:#1F2430; --ink-2:#4A5162; --ink-3:#666C83;
  --line:#E2E6EF; --bg:#F6F7FA; --card:#FFFFFF;
  --radius:12px; --radius-s:8px;
  font-size:14px; color:var(--ink);
}
/* —— hero（卡片外大标题区） —— */
.pkp .hero{display:flex;align-items:baseline;justify-content:space-between;gap:14px;flex-wrap:wrap;margin-bottom:22px}
.pkp .hero h1{font-size:22px;font-weight:600;letter-spacing:.3px;color:var(--ink)}
.pkp .hero .sub{color:var(--ink-2);margin-top:6px;font-size:14px}
.pkp .hero .pill{font-size:12px;color:var(--ink-3);background:var(--card);border:1px solid var(--line);border-radius:99px;padding:4px 12px;white-space:nowrap}
/* —— 主卡 + 子 tab —— */
.pkp .pk-card{background:var(--card);border:1px solid var(--line);border-radius:var(--radius);padding:22px 26px}
.pkp .subtabs{display:flex;gap:8px;margin-bottom:16px;flex-wrap:wrap}
.pkp .subtabs button{font:inherit;font-size:13px;color:var(--ink-2);padding:6px 18px;border-radius:99px;border:1px solid var(--line);background:var(--card);cursor:pointer;transition:.15s}
.pkp .subtabs button.on{background:var(--brand);border-color:var(--brand-text);color:#fff}
.pkp .pkview{display:none}
.pkp .pkview.on{display:block;animation:pkfade .25s ease}
@keyframes pkfade{from{opacity:0;transform:translateY(6px)}to{opacity:1;transform:none}}
/* —— 擂台：左右分栏 —— */
.pkp .split{display:grid;grid-template-columns:minmax(0,1.08fr) minmax(0,1fr);gap:24px;align-items:start}
@media(max-width:860px){.pkp .split{grid-template-columns:1fr}}
/* v7.46i：PC / 平板左右对调（稿子第 1 条）——
     左 = 🏆 七度擂台榜（高栏）｜右 = 🤝 我和同学的对比（矮栏）
   实现用 order 而不是改 DOM：手机的视觉顺序由 DOM 决定，改 DOM 会把手机的
   「擂台在上、对比在下」也一起反过来（稿子明确要求手机保持擂台在上）。
   顺带解掉「左下角太空」：高栏在左之后，右栏（对决条）下方留出的空间
   正好由紧跟着的「讲题记录」卡填上，两栏高度自然配平。 */
/* v7.46i / v7.46n：PK 页两栏对调 —— 左 = 🏆 七度擂台榜（高栏）｜
                 右 = 🤝 我和同学的对比（矮栏）。用用户 2026-09-26 的话：
                 「按照左擂台榜 / 右对决条」。
   实现用 order 而不是改 DOM：手机的视觉顺序由 DOM 决定，改 DOM 会把手机的
   「擂台在上、对比在下」也一起反过来（稿子明确要求手机保持擂台在上）。

   ★ v7.46n：必须同时给**两套布局**写规则 ——
     · 手机（<768px）走 `.pkp .split`（v7.28c 设计稿）
     · PC/平板（≥768px）走 `.deep-split`（v7.27c 基础样式，摘了 .pkp）
   v7.46i 只写了 `.pkp` 那一套，v7.46m 恢复 PC 版式后 `.pkp` 被摘掉，
   这条 order 在 PC 上就匹配不到了。现在两套都补上。 */
@media(min-width:861px){
  /* 手机版式（.pkp）的两栏 */
  .pkp .split>.pk-main{order:2}
  .pkp .split>.pk-side{order:1}
}
@media(min-width:768px){
  /* PC/平板版式（.deep-split）的两栏 */
  .deep-split>.pk-main{order:2}
  .deep-split>.pk-side{order:1}
  /* 列宽也跟着换边：擂台榜是高栏（第屏展示量大），该占宽的一侧。
     .deep-split 原本是 minmax(232px,5fr) minmax(260px,6fr)（左窄右宽）。 */
  .deep-split:has(> .pk-side){grid-template-columns:minmax(260px,6fr) minmax(232px,5fr)}
}
/* 讲题记录区块：跨整幅（不参与两栏 grid），排在 split 之后、占满宽度。
   桌面端与右栏（对决条）底部对齐，把左下角那片空白吃掉。 */
.pkp .pkrecs{margin-top:22px}
.pkp .pkrecs .card{padding:0}
.pkp .pkrecs .pkrecs-h{display:flex;align-items:center;justify-content:space-between;gap:10px;margin-bottom:9px}
.pkp .pkrecs .pkrecs-h h3{font-size:15px;font-weight:700;color:var(--ink)}
.pkp .pkrecs .pkrecs-h small{font-size:12px;color:var(--ink-3);font-weight:400;margin-left:6px}
.pkp .pkrecs .pkrecs-h .go{font:inherit;font-size:12.5px;color:var(--ink-2);background:none;border:none;cursor:pointer;padding:2px 0}
.pkp .pkrecs .pkrecs-h .go:hover{color:var(--brand-text)}
.pkp .pkrecs .pkrecs-sec{margin-top:12px}
.pkp .pkrecs .pkrecs-sec:first-child{margin-top:0}
.pkp .pkrecs .pkrecs-t{font-size:13px;font-weight:600;color:var(--ink-2);margin-bottom:2px}
.pkp .pkrecs .pkrecs-t .av{display:inline-block;width:16px;height:16px;border-radius:5px;
  font-size:10px;line-height:16px;text-align:center;color:#fff;margin-right:5px;vertical-align:-3px}
.pkp .pkrecs .pkrecs-t .av.me{background:var(--vs-me)}
.pkp .pkrecs .pkrecs-t .av.op{background:var(--vs-op);color:#0f2b52}
/* 桌面端两栏并排（每栏一张卡）；手机单列顺排。 */
@media(min-width:861px){
  .pkp .pkrecs .pkrecs-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:16px}
  .pkp .pkrecs .pkrecs-grid .pkrecs-sec{margin-top:0}
}
/* ================= v7.51 方案A（用户 2026-09-28 拍板）：摘要并排 + 详情整幅 =================
   此前详情在 630px 窄卡里就地展开，内层 .doc 又切左右两栏 → 主体被压到 ~288px（「太挤」）。
   改法：摘要卡照旧并排；点开详情时 JS 给网格挂 .pk-full → 切单列，详情占整幅，
   一次只开一个（点另一张自动收起）。规则**不挂 .pkp** —— 学生宽屏路径（_pkPaint）
   与 staff 路径（renderPkPage + .pkp）用的是同一个 .pkrecs-grid，两路都要生效。 */
.pkrecs .pkrecs-grid{display:grid;grid-template-columns:minmax(0,1fr);gap:16px}
.pkrecs .pkrecs-grid .pkrecs-sec{margin-top:0}
@media(min-width:861px){
  .pkrecs .pkrecs-grid{grid-template-columns:repeat(2,minmax(0,1fr))}
  /* 详情打开 → 整幅（一次只开一个，由 JS 保证） */
  .pkrecs .pkrecs-grid.pk-full{grid-template-columns:minmax(0,1fr)}
}
.pkp .vshead{display:flex;align-items:center;justify-content:space-between;gap:12px;flex-wrap:wrap;margin-bottom:14px}
.pkp .vshead .who{font-size:13.5px;color:var(--ink-2)}
.pkp .vshead .who b{color:var(--ink)}
.pkp .vshead .score{font-size:20px;font-weight:700;letter-spacing:2px;color:var(--brand-ink);background:var(--brand-soft);border-radius:var(--radius-s);padding:4px 16px}
.pkp .vshead .score small{font-size:11px;font-weight:400;color:var(--ink-2);display:block;text-align:center;letter-spacing:0}
/* v7.46h2：对决条图例 —— 「我（深蓝）　同学（浅蓝）」。
   色块用 :before 画小方条，颜色直接吃 --vs-me / --vs-op，
   以后色值再调，图例和柱子**永远同色**（不会出现图例和条不一致）。 */
.pkp .vslegend{display:flex;align-items:center;gap:6px;flex-wrap:wrap;
  font-size:12.5px;color:var(--ink-2);margin:-6px 0 11px}
.pkp .vslegend i{display:inline-block;width:12px;height:12px;border-radius:3px;flex:0 0 auto}
.pkp .vslegend i.lg-me{background:var(--vs-me)}
.pkp .vslegend i.lg-op{background:var(--vs-op);margin-left:10px}
/* vsrow：上条=我、下条=对手（上下叠放，设计稿口径） */
.pkp .vsrow{display:flex;align-items:center;gap:10px;margin-bottom:9px}
.pkp .vsrow .nm{flex:0 0 32px;font-size:12.5px;font-weight:600;color:var(--ink-2)}
/* v7.42：榜上对决的行要塞「代号 + 分数」（T23 78），32px 装不下会折三行 —— 这些行放宽到 48px。 */
.pkp .vsrow.two .nm{flex:0 0 48px}
/* v7.46h：左列「我」二字跟着条走深蓝，和同学那列（--ink-3 灰）拉开 */
.pkp .vsrow .nm.me{color:var(--vs-me)}
.pkp .vsrow .bars{flex:1;display:flex;flex-direction:column;gap:3px}
.pkp .vsrow .bar{height:9px;border-radius:99px;background:#E9EBF2;position:relative;overflow:hidden}
/* v7.46h：条的基础样式。底色由下面两条按**位置**给（身份色，恒定）。 */
.pkp .vsrow .bar i{position:absolute;top:0;bottom:0;left:0;border-radius:99px;transition:width .4s ease}
/* v7.46h3：颜色 = 身份，不随输赢变。
   上条（第 1 根）= 我   → 深蓝 #1E3A6E
   下条（第 2 根）= 同学 → 浅蓝 #8FB0E0
   这样和图例「我（深蓝）　同学（浅蓝）」永远一对一，看颜色就知道谁是谁。 */
.pkp .vsrow .bar:nth-child(1) i{background:var(--vs-me)}
.pkp .vsrow .bar:nth-child(2) i{background:var(--vs-op)}
/* v7.46h3：原「落后行整行灰化」的覆盖**已删除**。
   理由：它把颜色绑到了「输赢」上，导致深蓝/浅蓝染反（我落后就变浅蓝）。
   现在条的颜色只认身份（见下面的 nth-child 规则），
   落后由 .df 差值列（+14 / −14）和右上角比分牌表达。
   行级 .op 类保留 —— 将来要给落后行做弱化（比如整行降透明度）时还用它，
   但它不再改条的颜色。 */
.pkp .vsrow .df{flex:0 0 44px;text-align:right;font-size:12px;font-weight:600}
.pkp .vsrow .df.up{color:var(--good-text)}
.pkp .vsrow .df.dn{color:var(--bad)}
/* v7.40：.pkp .vsverdict 已随 vsverdict 元素一起下线删除 */
/* cta（设计稿 inline：无边框上沿、贴着 verdict 下方） */
.pkp .cta{margin-top:6px;padding:14px 0 0;display:flex;align-items:center;gap:16px;flex-wrap:wrap}
.pkp .cta .lead{font-size:14.5px;color:var(--ink-2)}
.pkp .ghostbtn{font:inherit;font-size:12.5px;color:var(--ink-2);padding:5px 13px;border-radius:var(--radius-s);border:1px solid var(--line);background:var(--card);cursor:pointer;transition:.15s}
.pkp .ghostbtn:hover{border-color:var(--brand-text);color:var(--brand-text)}
/* v7.49：换对手行在手机（设计稿版式）上的样子 —— 沿用原 .cta 那套间距与字号，
   只把位置从「对决条下面」换成「对决条上面」（见基础档 .vsswap）。 */
.pkp .vsswap{justify-content:flex-start;gap:16px;margin:0 0 12px}
.pkp .vsswap .lead{font-size:14.5px;color:var(--ink-2)}
.pkp .btn-primary{font:inherit;background:var(--brand);color:#fff;font-size:14.5px;font-weight:500;padding:10px 30px;border-radius:var(--radius-s);cursor:pointer;transition:.15s;box-shadow:0 1px 0 rgba(38,33,92,.18)}
.pkp .btn-primary:hover{background:#443BA0}
.pkp .btn-primary:active{transform:translateY(1px);box-shadow:none}
/* —— 右栏：七维擂台榜 —— */
.pkp .sidecard{background:var(--bg);border-radius:var(--radius-s);padding:13px 15px}
.pkp .sidecard h3{font-size:13.5px;font-weight:600;margin-bottom:2px;color:var(--ink)}
.pkp .sidecard .hint{font-size:12px;color:var(--ink-3);margin-bottom:9px}
.pkp .rkdim{display:flex;gap:5px;flex-wrap:wrap;margin-bottom:12px}
.pkp .rkdim button{font:inherit;font-size:12.5px;color:var(--ink-2);padding:4px 13px;border-radius:99px;border:1px solid var(--line);background:var(--card);cursor:pointer;transition:.15s}
.pkp .rkdim button.on{background:var(--brand);border-color:var(--brand-text);color:#fff}
.pkp .rankrow{display:flex;align-items:center;gap:10px;padding:8px 12px;border-radius:7px;font-size:13.5px;background:var(--card);border:1px solid var(--line);margin-bottom:6px}
.pkp .rankrow .rk{flex:0 0 26px;font-weight:700;color:var(--ink-3);font-size:13px}
.pkp .rankrow .rk.r1{color:#7a4e00}
.pkp .rankrow .rk.r2{color:#4a5162}
.pkp .rankrow .rk.r3{color:#7a3d1d}
.pkp .rankrow .nm2{flex:1;color:var(--ink)}
.pkp .rankrow .sc2{font-weight:600;color:var(--ink-2)}
.pkp .rankrow.me{border-color:var(--brand-text);background:#F7F5FF}
.pkp .rankrow.me .nm2{font-weight:600;color:var(--brand-text)}
.pkp .rankrow.me .sc2{color:var(--brand-text)}
.pkp .formnote{font-size:12.5px;color:var(--ink-3);margin-top:12px}
.pkp .pk-load{font-size:13.5px;color:var(--ink-3);padding:14px 4px;line-height:1.7}
/* —— 班级圈：composer + 帖子 ——
   v7.40：整块摘掉 .pkp 前缀 —— composer/bbspost 只有这一处定义，原来锁死 .pkp 作用域，
   导致 ①老师端「班级圈」没有 pkp 类、composer 一直裸奔；②学生端 PC/平板退版（宽屏不挂
   pkp）后班级圈会跟着裸奔。摘前缀后三处都吃同一份样式，手机端因 pkp 变量仍在祖先上、观感不变。 */
.composer{display:flex;flex-direction:column;gap:8px;background:var(--bg);border-radius:var(--radius-s,8px);padding:13px 15px;margin-bottom:14px}
.composer input,.composer textarea{font-family:inherit;font-size:13px;border:1px solid var(--line);border-radius:7px;padding:8px 11px;background:var(--card);color:var(--ink);outline:none;width:100%}
.composer textarea{min-height:64px;resize:vertical}
.composer .row2{display:flex;align-items:center;gap:10px;flex-wrap:wrap}
.composer .anon-l{font-size:12.5px;color:var(--ink-3,#666C83);display:flex;align-items:center;gap:5px}
.composer .go{margin-left:auto;border-color:var(--brand-text);color:var(--brand-text)}
.bbs-att-bar{display:flex;gap:6px;flex-wrap:wrap}
.bbs-att-btn{font:inherit;font-size:12.5px;color:var(--ink-2,#4A5162);padding:4px 12px;border-radius:99px;border:1px solid var(--line);background:var(--card);cursor:pointer}
.bbs-count{font-size:12px;color:var(--ink-3,#666C83);text-align:right}
.bbspost{background:var(--card);border:1px solid var(--line);border-radius:var(--radius-s,8px);padding:13px 16px;margin-bottom:10px;cursor:pointer}
.bbspost .tt{font-size:14px;font-weight:600;margin-bottom:3px;color:var(--ink)}
.bbspost .mt{font-size:12px;color:var(--ink-3,#666C83);margin-bottom:7px}
.bbspost .ct{font-size:13px;color:var(--ink-2,#4A5162);line-height:1.8;white-space:pre-wrap;word-break:break-word}
.bbspost .tg{display:inline-block;font-size:11px;border-radius:99px;padding:1px 9px;margin-right:6px;background:#EFEFF3;color:var(--ink-3,#666C83)}
.bbspost .tg.anon{background:#E8F0FA;color:#185FA5}
.bbspost .tg.pin{background:#FAEEDA;color:#854F0B}
/* 帖子详情（线上功能，贴设计稿底色） */
.bbs-detail{margin-top:10px;background:var(--bg);border-radius:var(--radius-s,8px);padding:10px 12px}
.bbs-reply .rmeta b{color:var(--ink)}
/* 手机：主卡与 hero 收紧 */
@media (max-width:640px){
  .pkp .pk-card{padding:14px 12px}
  .pkp .hero h1{font-size:18px}
  .pkp .hero .sub{font-size:12.5px}
}
/* v7.41：宽屏（平板 / PC）两栏配平 —— 用户 09-25：「左边太短右边太长，实在是不好看」。
   擂台榜放宽链到本年级 / 本校后可能几十行（实测 38 行），整列跟着拉长会把左栏衬成半截。
   这里给榜单**限高内滚**：h3 / 说明 / 维度切换 / 脚注留在原位，只有名次列表滚动。 */
@media (min-width:861px){
  .pkp .split{align-items:start}
  .pkp #rkList{max-height:min(46vh,430px);overflow:auto;overscroll-behavior:contain;padding-right:4px}
  .pkp #rkList::-webkit-scrollbar{width:8px}
  .pkp #rkList::-webkit-scrollbar-thumb{background:#D7DBE6;border-radius:99px}
}

/* v7.28d：题意框内嵌的原题照片（几何题 D 方案 —— 不再 AI 画图） */
.mind-geo-img{max-width:380px;max-height:260px;border:1px solid #dfe4ee;border-radius:8px;display:block;background:#fff}

/* ================= v7.29 =================
   手机端三页体验改版（用户 2026-09-24 逐条拍板）：
     ① 深度测评 = 一张大图（我紫实心 + 班级灰虚线叠一图）+ 七维「一行一维」+ 浮动「我来试试」；
        目标是手机 390×844 一屏尽收眼底、不用翻页。
     ② 深度剖析 = 六段默认全折叠、段序与测评同（高度·广度·深度·序度·简度·精度）、
        维度名反而比后面的问句醒目、样例标签抽象化、下面的说明收进折叠块。
     ③ 解题地图 = 首屏必有盘（无存档给「示例盘」）+ 讲题记录默认展开。
   两页统一口径（用户反复强调「风格要统一」）：
     维度名 13.5px / 700 / #4A3FBF；后面的说明 13.5px / 500 / #333A4B。
     字号必须一致（不能一大一小），层级只靠字重与颜色 —— 且说明「不能太淡」。 */

/* —— ① 深度测评首屏重排 —— */
.deep-card{padding:12px}
.deep-rhead{display:flex;align-items:baseline;justify-content:space-between;gap:8px;margin-bottom:6px}
.deep-rhead h2{font-size:15px;font-weight:600;margin:0}
.deep-rhead span{font-size:12px;color:var(--muted,#6b7590)}
.deep-sum{display:flex;gap:6px;flex-wrap:wrap;margin-bottom:2px}
.deep-sum i{font-style:normal;font-size:11.5px;border-radius:99px;padding:2px 9px}
.deep-sum i.w{background:#FDF1E3;color:#9F610E;border:1px solid #F3DCBB}
.deep-sum i.s{background:#E7F5EE;color:#0F6E56;border:1px solid #C7E7D8}
.deep-radar{display:flex;justify-content:center;padding:2px 0 0}
/* v7.30：雷达图缩小 —— 但**缩的是图形，不是字**（用户 2026-09-25：「热力图可以再改小一点，
   但是上面的文字和数字不要改小」）。所以几何按 236 重新排（R=W/2-46），字号仍是 13.5 / 11.5。
   这里也只能把 max-width 收到 236：一旦用 max-width 去缩一个更大的 viewBox，SVG 会**等比缩放**，
   轴上的字和数字跟着变小 —— v7.29 的 256px 就是这么把设计值 13.5 压成实际 11.5 的。 */
.deep-radar svg{width:100%;max-width:236px;height:auto}
/* 七维明细：一行一维（原来两列小卡在 390px 下太挤，字只能压着写） */
.deep-dims{display:block}
.deep-dim{display:flex;align-items:center;gap:8px;width:100%;text-align:left;font:inherit;
  background:none;border:none;border-top:1px solid #F1F3F8;border-radius:0;padding:6px 0;cursor:pointer;transition:.15s}
.deep-dim:first-child{border-top:none}
.deep-dim:hover{background:#fafbff}
.deep-dim.on{background:#fff8ec}
/* v7.30：维度编号 1~8（用户 2026-09-25）。与剖析页段头的 .st-no 同一套视觉 ——
   这样「我第 4 维弱」在测评页和剖析页指的是同一件事。 */
.deep-dim .no{flex:0 0 16px;width:16px;height:16px;border-radius:50%;background:#EEEDFE;
  color:#534AB7;font-size:10px;font-weight:600;line-height:1;display:flex;align-items:center;justify-content:center}
.deep-dim .nm{font-size:13.5px;font-weight:700;color:#4A3FBF;white-space:nowrap;flex:0 0 auto}
/* 第八维「温度」：理科拿不到这一维的分 —— 不给假分、不画进图，但也不隐藏（置灰 + 「不参与」）。
   用户 2026-09-25：「温度 = 共情表达的能力（理科为零，不参与测评）」。 */
.deep-dim.no-dim{cursor:default}
.deep-dim.no-dim:hover{background:none}
.deep-dim.no-dim .no{background:#F4F5F9;color:#687084}
.deep-dim.no-dim .nm{color:#6F6A85}
.deep-dim.no-dim .ds{color:#5E6577}
.deep-dim.no-dim .bar{background:#F3F4F8}
.deep-dim.no-dim .num2{color:#6E768C}
.deep-dim .offtag{flex:0 0 auto;font-size:10.5px;font-weight:500;color:#6A7083;background:#F4F5F9;
  border:1px solid #E7E9F0;border-radius:99px;padding:1px 7px;white-space:nowrap}
.deep-dim .ds{display:inline;font-size:13.5px;font-weight:500;color:#333A4B;white-space:nowrap;
  margin-top:0;flex:0 0 auto;line-height:1.35}
.deep-dim .bar{flex:1 1 auto;height:7px;border-radius:99px;background:#EEF0F6;position:relative;
  overflow:hidden;min-width:24px;margin-left:2px}
.deep-dim .bar i{position:absolute;left:0;top:0;bottom:0;border-radius:99px;
  background:linear-gradient(90deg,#7C6BF0,#534AB7)}
.deep-dim .bar i.low{background:linear-gradient(90deg,#F0B860,#E8A33D)}
.deep-dim .num2{font-size:13px;font-weight:600;color:var(--ink,#1c2333);flex:0 0 auto;min-width:20px;text-align:right}
.deep-dim .df{font-size:11px;font-weight:600;flex:0 0 33px;text-align:right}
.deep-dim .df.up{color:#0F6E56}
.deep-dim .df.dn{color:#A32D2D}
@media (max-width:400px){ .deep-dim .ds{overflow:hidden;text-overflow:ellipsis} }
/* 手机上一屏装下（用户 2026-09-24：「深度测评不需要翻页，尽收眼底」）——
   实测 390×844 下首屏 855px 超出一屏（top-bar + nav 还要占 ~114px），逐处收紧：
   图 320→262、七维行上下留白 6→3、hero 与结论条降一档。PC 端不受影响。 */
@media (max-width:430px){
  .deep-hero h1{font-size:16.5px;margin:0 0 2px}
  .deep-hero p{font-size:11.5px;margin:0 0 6px}
  .deep-card{padding:8px}
  .deep-rhead{margin-bottom:2px}
  .deep-legend{margin:2px 0 0}
  .deep-dim{padding:2px 0;gap:7px}
  .deep-dims{padding:7px 10px}
  .deep-verdict{font-size:12px;padding:6px 9px;margin-bottom:6px;line-height:1.55}
}
/* v7.30：主 CTA「我来讲题」**固定在页面下方**（用户 2026-09-25）——
   撤掉 v7.29 的可拖 / 吸边 / 位置记忆：常驻入口没有拖的必要，
   位置记忆反而让每个人看到的入口不在同一处（同一个界面，各人截图对不上）。
   通栏但**限宽居中**（沿用 .nav 的 920px）—— 否则 PC / 平板上会拉成一条近 1900px 的长横杠。 */
/* v7.30：与剖析页底部的「开始拆解」按钮**逐项统一**（用户 2026-09-25：「我来讲题的按钮和
   开始拆解的按钮统一」）。两边现在实测同值 —— 颜色 var(--brand)、字号 15px、字重 600、
   圆角 12px、内边距 13px、通栏居中，都取自 .btn 基础款。
   ★ 关键：上一版这里写「开始拆解就是 .btn.primary，没另设样式」—— 那是错的，
   .start-wrap .btn 当时把它覆盖成了 13px 小内联块；本轮已把那条覆盖去掉（见 .start-wrap 注释），
   所以「统一」现在是**真的逐项相同**，不是「看起来差不多」。
   从前这里是紫渐变 + 14.5px + 圆角 14px + 字距 .5px —— 光看各自都行，摆在一起就是两种按钮。
   另外**去掉了 ✨**（用户：「我来讲题的图标完全不需要」）。 */
.deep-fab{position:fixed;left:0;right:0;bottom:calc(80px + env(safe-area-inset-bottom,0px));z-index:118;
  width:calc(100% - 28px);max-width:920px;margin:0 auto;
  background:var(--brand);color:#fff;border:none;border-radius:12px;
  padding:13px;font-size:15px;font-weight:600;font-family:inherit;text-align:center;
  box-shadow:0 8px 22px rgba(58,109,240,.28);white-space:nowrap;cursor:pointer}
/* 固定 CTA 浮在内容之上：给测评首屏与展开后的上传表单各留出它的高度，免得压住最后一行 */
#deepIntro{padding-bottom:74px}
#explainForm{padding-bottom:74px}

/* —— ② 深度剖析：段头层级 + 折叠块 —— */
/* v7.30：段头四个值必须与「八维测评」页**逐项相同**（用户 2026-09-25：「七维拆解那几个度，
   以及后面的文字，字体字号和八维测评统一」）。对照表 ——
     维度名   这里 .st-tag   ↔  测评页 .deep-dim .nm   13.5px / 700 / #4A3FBF / 字距 0
     后面那句 这里 .st-t     ↔  测评页 .deep-dim .ds   13.5px / 500 / #333A4B
     编号圈   这里 .st-no    ↔  测评页 .deep-dim .no   16×16 / 10px
   原来这段的 .st-tag 多带一个 letter-spacing:.3px、编号圈是 18×18 / 10.5px ——
   单看哪一页都「挺正常」，两页并排就是每个字都宽一点点，正是用户说的「不统一」。 */
.st-head{padding:7px 0;gap:8px}
.st-no{width:16px;height:16px;flex:0 0 16px;font-size:10px;font-weight:600;line-height:1}
.st-tag{font-size:13.5px;font-weight:700;color:#4A3FBF;letter-spacing:0;background:none;
  border-radius:0;padding:0;flex:0 0 auto;white-space:nowrap}
.st-t{font-size:13.5px;font-weight:500;color:#333A4B;min-width:0;flex:1}
.st-row.miss .st-t{color:var(--muted,#6b7590);font-weight:400}
.st-body{font-size:13.5px;color:#4A5162;line-height:1.75;padding:2px 0 10px 26px}
.ana-fold{border:1px solid var(--line,#e5eaf3);border-radius:10px;background:#FAFBFD;margin-bottom:10px;overflow:hidden}
.ana-fold-head{width:100%;text-align:left;font:inherit;background:none;border:none;
  padding:10px 12px;display:flex;align-items:center;gap:8px;cursor:pointer}
.ana-fold-head .ar{font-size:11px;color:var(--brand-text,#3a6df0)}
.ana-fold-head .t{font-size:13.5px;font-weight:600;flex:1;color:var(--ink,#1c2333)}
.ana-fold-head .s{font-size:11.5px;color:var(--muted,#6b7590)}
.ana-fold-body{padding:0 12px 12px;display:none}
.ana-fold.open .ana-fold-body{display:block}
.ana-fold .meta{font-size:12px;color:var(--muted,#6b7590);margin-bottom:8px}

/* —— ③ 解题地图：示例盘 + 讲题记录直接展开 —— */
.map-plate{background:#F8FAFF;border-top:1px solid #EEF2FA;border-bottom:1px solid #EEF2FA;margin:0 -12px}
.map-plate svg{display:block;width:100%;height:auto}
.map-card-h{display:flex;align-items:center;justify-content:space-between;gap:8px;margin-bottom:8px}
.map-card-h b{font-size:13.5px;font-weight:600}
.map-badge{font-size:11px;color:#9F610E;background:#FDF1E3;border:1px solid #F3DCBB;border-radius:99px;padding:1px 9px}
.map-foot{display:flex;align-items:center;gap:10px;margin-top:9px;flex-wrap:wrap}
.map-foot .lead{flex:1;font-size:12.5px;color:var(--muted,#6b7590);line-height:1.6;min-width:170px}
.map-foot .btn{width:auto;display:inline-block;padding:8px 16px;font-size:13px;margin:0}
.map-rec-h{display:flex;align-items:center;gap:8px}
.map-rec-h .cn{margin-left:auto;font-size:12px;color:var(--muted,#6b7590);font-weight:400}

/* ================= v7.34：三页统一页头 ================= */
/* 主标题 = 功能名（讲题测评 / 题目拆解 / 沙盘推演），副标题 = 一句 slogan。
   此前三页各写各的（.deep-hero / .ana-title / .map-hero）：副标题字号 12.5 与 13 不一致，
   手机端也只有测评页做了缩放。这里收成一套 .page-hero；旧类名保留作定位钩子
   （.map-hero .mstat 仍在使用）。本段在文件末尾 → 同 specificity 下覆盖前面的旧写法。 */
.page-hero h1{font-size:20px;font-weight:600;letter-spacing:.3px;margin:2px 0 4px}
/* 不设 line-height：三个旧选择器也都没设，保持继承值 = 改动前后高度逐字节一致
   （测评页手机端是「一屏装下」口径，行高动一点就会破坏它） */
.page-hero p{font-size:13px;color:var(--muted,#6b7590);margin:0 0 12px}
@media (max-width:430px){
  .page-hero h1{font-size:16.5px;margin:0 0 2px}
  .page-hero p{font-size:11.5px;margin:0 0 6px}
}

/* ================= v7.35：宽屏（平板 / PC）提高空间利用率 ================= */
/* 病灶（实测，不是猜）：同一套 DOM 直接拉到宽屏，卡片被撑到 1216px（1560 屏下 1496px），
   但里面的元素按手机口径封了顶 ——
     · .deep-radar svg{max-width:236px} → 图只占中间 236px，两侧各空 480px
     · .deep-dims{display:block}（2614 行覆盖了 2297 行的两列 grid）→ 8 个维度卡各宽 1216px，
       而内容只占左边约 250px
   所以「利用率低」其实是**元素被拉宽但没内容填**，不是内容被挤窄。
   下面只加媒体查询：把竖着堆的横过来 + 放开手机端的尺寸上限。不动 DOM、不改 JS。 */

/* ① 超宽屏不再无限拉伸（1280 屏不受影响：内容 1216px < 1320px） */
@media (min-width:760px){
  .scroll > [id$="Screen"]{max-width:1320px;margin-left:auto;margin-right:auto;width:100%}
}
/* v7.350：读书页单独放宽（用户拍板「PDF 应该再向左移，跟目录贴在一起」）。
   v7.353（用户再拍板「非全屏也都要尽量向左靠」）：居中改**左对齐** —— 之前 margin 仍走
   上面的通用 auto 居中，1920 屏目录左边还有 ~60px 白边、右侧对称留一整块空。
   现在内容整体顶到左边（只留 .scroll 的页边距），右侧留白自然留给悬浮面板。 */
@media (min-width:1000px){
  .scroll > #readScreen{max-width:min(1880px,96vw);margin-left:0;margin-right:auto}
}

/* ② 讲题测评：左「我的八维」雷达卡 / 右八维列表 + 学情卡（v7.38 起替换掉擂台卡，见下方 ④）
   ⚠️ 左栏雷达卡必须**跨 row2+row3**：否则 row2 被它撑高到 470，右栏那张卡只能排到 673，
      一屏内塞不下、底部会被固定 CTA 压掉一半（这正是 v7.37 第一版的翻车现场）。
      跨行后 row2/row3 由右栏两块自己决定 —— 但右栏第 3 行的内容高度会**反过来**把跨行的
      左栏雷达卡一起撑高（v7.38 平板端实测：学情卡单列堆叠 422px → 雷达卡被拉到 757、
      卡片底部 942 压到 CTA 898 底下），所以右下角那张卡的高度必须按最矮的排法设计。 */
@media (min-width:760px){
  #deepIntro{display:grid;grid-template-columns:minmax(0,320px) minmax(0,1fr);gap:14px;align-items:start}
  #deepIntro > .page-hero{grid-column:1/-1;margin-bottom:0}
  #deepIntro > .card{margin-bottom:0}
  #deepIntro > .deep-card{grid-column:1;grid-row:2/span 2;align-self:stretch;display:flex;flex-direction:column}
  /* 雷达卡被拉齐到右栏总高后，多出来的高度交给 .deep-radar 吸收 —— 图在卡内垂直居中，
     而不是「卡片拉长了、图还钉在顶上、底下空一片」（那就是换个地方白而已）。 */
  #deepIntro > .deep-card .deep-radar{flex:1;align-items:center}
  #deepIntro > .deep-dims{grid-column:2;grid-row:2}
  /* 手机端为「一屏装下」把图封在 236px —— 宽屏放开（2612 行同特异性，本段在后 → 覆盖） */
  .deep-radar svg{max-width:300px}
}
@media (min-width:1060px){
  #deepIntro{grid-template-columns:minmax(0,380px) minmax(0,1fr)}
  .deep-radar svg{max-width:360px}
  /* 八维列表回两列（2614 行 .deep-dims{display:block} 是手机口径，本段在后 → 覆盖） */
  .deep-dims{display:grid;grid-template-columns:1fr 1fr;gap:8px}
}

/* ③ 题目拆解：左七维骨架（+来源折叠）/ 右「选一道题」
   ⚠️ 用 :has() 认卡片而不是 :nth-child —— 骨架卡里有 #anaStages、选题卡里有 #anaSrcRow，
      按内容认比按位置认稳（日后增删某一块不会错位）。浏览器不支持 :has() 时整段失效 →
      自动退回手机版单列，不会破版。 */
@media (min-width:760px){
  #anaIntro{display:grid;grid-template-columns:minmax(0,1.28fr) minmax(0,1fr);gap:14px;align-items:start}
  #anaIntro > .page-hero{grid-column:1/-1;margin-bottom:0}
  #anaIntro > .intro-card:has(#anaStages){grid-column:1;grid-row:2}
  #anaIntro > .ana-fold{grid-column:1;grid-row:3}
  #anaIntro > .intro-card:has(#anaSrcRow){grid-column:2;grid-row:2/span 2}
  #anaIntro > .intro-card,
  #anaIntro > .ana-fold{margin-bottom:0}
}
@media (min-width:1060px){
  #anaIntro{grid-template-columns:minmax(0,1.34fr) minmax(0,1fr)}
}

/* ④ 讲题测评 · 宽屏右栏「📊 我的学情」——
   v7.38（用户 2026-09-25 拍板）：把 v7.37 那张「⚔️ 本班擂台」换成只讲自己的学情卡。
   位置与填白目标不变：实测 PC 1280 右栏八维列表底 395、底部 CTA 顶 774，中间白着 379px。
   手机端不能补：「一屏装下」是硬口径，所以整卡默认 display:none，只在 ≥760px 出现。 */
.deep-stats{display:none}
/* v7.46j：手机端也显示这张卡（用户 2026-09-26 拍板「都默认打开这切换卡」）。
   原来整卡 display:none 是为了「一屏装下」；现在切换卡本身只保留**一档**的高度
   （学情 / 记录 二选一），所以不会把一屏撑破。 */
@media (max-width:759px){
  #deepIntro > .deep-stats{display:block}
}
/* 切换条：贴在卡内最顶，两档共用下方同一块高度。
   视觉参照稿子 .switchtabs（灰底、白块高亮），但用本站 token 而不是稿子里的写死色值。 */
.deep-stats .ds-switch{display:flex;gap:0;background:#EEF1F7;border-radius:10px;padding:3px;margin:0 0 11px}
.deep-stats .ds-tab{flex:1;text-align:center;font:inherit;font-size:12.5px;font-weight:600;
  color:var(--ink-2,#4A5162);background:none;border:none;border-radius:8px;padding:7px 4px;
  cursor:pointer;white-space:nowrap;min-height:32px}
.deep-stats .ds-tab.on{background:#fff;color:var(--brand-text,#3a6df0);box-shadow:0 1px 3px rgba(25,35,70,.1)}
.deep-stats .ds-tab:hover:not(.on){color:var(--brand-text,#3a6df0)}
.deep-stats .ds-pane.hidden{display:none}
/* 记录列表：与记录页同排版（.rec-item 全站一套），这里只压掉内边距让它贴合切换卡。 */
.deep-stats .ds-recs .rec-item:first-child{padding-top:2px}
.deep-stats .ds-recs .rec-item:last-child{border-bottom:none;padding-bottom:2px}
.deep-stats .ds-recs .ds-empty{font-size:12.5px;color:var(--muted,#6b7590);margin:0;line-height:1.6}
/* 手机端：两档的列表底部都给固定 CTA（#deepFab，fixed + bottom:80px + 自身约 48px）留出安全余量，
   免得滚动中段最后一行被它压住。PC / 平板不给 —— 那边各自卡内滚动 / 网格列，不留白。 */
@media (max-width:759px){
  .deep-stats .ds-recs{padding-bottom:96px}
  .deep-stats .ds-body{padding-bottom:96px}
}
@media (min-width:760px){
  #deepIntro > .deep-stats{grid-column:2;grid-row:3;display:flex;flex-direction:column;align-self:stretch;margin-bottom:0;padding:12px 14px}
  /* v7.46j：切换条在宽屏下不拉满整栏（整栏 500px+ 的两格太散，看着不像一个控件）。 */
  .deep-stats .ds-switch{max-width:520px}
  /* v7.46j：记录列表在宽屏下卡内滚动，不把卡片撑高（卡片高度要与左栏雷达卡对齐）。 */
  .deep-stats .ds-recs{max-height:min(46vh,300px);overflow:auto}
  /* 卡片被拉伸到与左栏雷达卡等高后，多出来的高度交给 .ds-body 分配（趋势贴顶、底部统计贴底），
     而不是整块堆在卡片底部 —— 否则「框齐了、里面还是空一片」。 */
  /* ★ 760 起就用两列（不是等到 1060）：平板 768 的右栏只有 386px，
     两块上下堆叠时实测卡片高 422px、底 942 —— 被固定 CTA（顶 898）压掉底部统计行，
     比 v7.37 的擂台卡（285px）高出 136px，等于把「一屏装下」做丢了。
     并排后总高回到 ~300px，与擂台卡相当；知识点在窄列里会截断，那是这个宽度的必然取舍。 */
  .deep-stats .ds-body{flex:1;display:grid;grid-template-columns:minmax(0,1.1fr) minmax(0,1fr);gap:10px;align-content:space-between}
  .deep-stats .deep-rhead{margin-bottom:4px}
  /* 命中区 19px → 29px：WCAG 2.5.8 要求目标 ≥24px（v7.36 那批 P0 刚修完，
     新加的按钮不能自己又踩回去）。负 margin 抵消 padding，视觉位置与内边距都不变。 */
  .deep-stats .ds-more{font:inherit;font-size:12.5px;color:var(--brand-text,#3a6df0);
    background:none;border:none;padding:5px 6px;margin:-5px -6px -5px 0;cursor:pointer;white-space:nowrap}
  .deep-stats .ds-more:hover{text-decoration:underline}
  .deep-stats .ds-hint{font-size:12px;color:var(--muted,#6b7590);margin:0 0 8px}
  .ds-cap{font-size:12px;color:var(--muted,#6b7590);margin:0 0 8px}
  .ds-trend,.ds-recent{background:#f7f9fc;border:1px solid var(--line,#e5eaf3);
    border-radius:10px;padding:10px 12px;min-width:0}
  /* 趋势柱：高度由 JS 按窗口区间归一化给（55%~100%），真实分数写在下面一行 —— 
     不靠柱高传递绝对值，避免「看着涨了一倍、其实只涨了 8 分」的误读。 */
  .ds-bars{display:flex;align-items:flex-end;gap:8px;height:52px}
  .ds-bars i{flex:1;background:#CECBF6;border-radius:3px 3px 0 0;min-height:6px}
  .ds-bars i.last{background:#534AB7}
  .ds-sum{display:flex;align-items:baseline;gap:6px;margin:8px 0 0;flex-wrap:wrap}
  .ds-sum b{font-size:20px;font-weight:700;color:#26215C;line-height:1.1}
  .ds-sum span{font-size:12px;color:var(--muted,#6b7590)}
  .ds-row{display:flex;align-items:center;gap:8px;padding:4px 0}
  .ds-row + .ds-row{border-top:1px solid var(--line,#e5eaf3)}
  .ds-q{flex:1;min-width:0;font-size:12.5px;color:var(--ink,#1c2333);
    overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
  .ds-t{font-size:12px;color:var(--muted,#6b7590);white-space:nowrap}
  .ds-sc{font-size:12.5px;font-weight:700;color:var(--brand-text,#3a6df0);
    white-space:nowrap;min-width:22px;text-align:right}
  .ds-empty,.ds-empty2{font-size:12.5px;color:var(--muted,#6b7590);margin:0;line-height:1.6}
  .ds-foot{display:flex;align-items:baseline;gap:10px;flex-wrap:wrap;margin-top:10px;
    padding-top:9px;border-top:1px solid var(--line,#e5eaf3)}
  .ds-foot span{font-size:12px;color:var(--muted,#6b7590)}
  .ds-foot b{color:var(--ink,#1c2333)}
  .ds-foot b.w{color:#9F610E}
}
@media (min-width:1060px){
  .deep-stats .ds-body{grid-template-columns:minmax(0,1.1fr) minmax(0,1fr);gap:14px}
}

/* ⑤ v7.50 方案 A：「讲题记录」档在宽屏**跨栏整宽**（JS 切档时给 #deepIntro 加 .recs-wide）。
   为什么改：这张卡原先钉在右栏第 3 行，768 屏右栏实测只有 386px ——
     · 记录题面被省略号截断（「对顶角相等、平角…」），看着像题目没存全；
     · 列表只能卡内滚动（max-height 300px），三条记录还得拖；
     · 卡片底部统计行会被固定 CTA 压住。
   一屏被切成左右两块、右边还挤着一张记录表 —— 用户原话「两屏两边并列，排版有点乱」。
   整宽后：记录与「记录」页同一观感，题面完整、不用滚动；
   「我的学情」是概览（趋势柱 + 最近两三行），留在右栏窄位反而更合适，所以只改记录档。
   ★ 落地方式：雷达卡收回第 2 行（不再跨 2/3 行），整宽卡独占第 3 行 ——
     不做「卡压在雷达卡上面」的重叠排布（grid 会真重叠，不是设计）。 */
@media (min-width:760px){
  #deepIntro.recs-wide > .deep-card{grid-row:2}
  #deepIntro.recs-wide > .deep-stats{grid-column:1/-1;grid-row:3;margin-top:0;padding:12px 14px}
  /* 整宽后宽度够了：不再限高卡内滚动（本来也只取最近 3 条） */
  #deepIntro.recs-wide > .deep-stats .ds-recs{max-height:none;overflow:visible}
  #deepIntro.recs-wide > .deep-stats .ds-switch{max-width:520px}
}

/* ================= v7.43：八度测评讲题页流程化（一套版式，手机/平板/PC 共用） =================
   用户 2026-09-25 逐条口述：步骤条 + 四种传题方式一排按钮 + 只留一个文本框 + 按住说话。
   ① 全部规则都**不带媒体查询**：三个宽度用同一套（用户就是嫌宽屏另做一套）。
   ② 类名整族用 jt- 前缀（开工前已做过占用普查，全族为 0）。 */
.jtsteps{display:flex;align-items:center;gap:6px;margin:0 0 14px}
.jtsteps .jt-s{display:inline-flex;align-items:center;gap:6px;font-size:13px;font-weight:600;
  color:#98A0B3;white-space:nowrap}
.jtsteps .jt-i{width:18px;height:18px;flex:0 0 18px;border-radius:50%;background:#E6E9F1;color:#6B7590;
  font-size:11px;font-weight:700;display:inline-flex;align-items:center;justify-content:center}
.jtsteps .jt-ln{flex:1 1 auto;height:1px;background:#E6E9F1;min-width:8px}
.jtsteps .jt-s.on{color:#4A3FBF}
.jtsteps .jt-s.on .jt-i{background:#534AB7;color:#fff}
.jtsteps .jt-s.done{color:#0F6E56}
.jtsteps .jt-s.done .jt-i{background:#E1F1EA;color:#0F6E56}
.jt-modes{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:8px;margin-bottom:12px}
.jt-mode{font:inherit;font-size:13.5px;font-weight:600;color:#333A4B;background:#fff;
  border:1px solid var(--line,#e5eaf3);border-radius:11px;padding:11px 4px;cursor:pointer;
  display:flex;flex-direction:column;align-items:center;gap:3px;transition:.15s;line-height:1.25}
.jt-mode .e{font-size:18px;line-height:1}
.jt-mode.on,.jt-mode:active{background:#F1F0FE;border-color:#534AB7;color:#4A3FBF}
.jt-qbox{position:relative;border:2px dashed var(--line,#e5eaf3);border-radius:14px;background:#fbfcfe;
  min-height:86px;display:flex;align-items:center;justify-content:center;padding:14px;box-sizing:border-box}
.jt-qbox .jt-ph{color:#6b7590;font-size:13.5px;line-height:1.6;text-align:center}
.jt-qbox .jt-ph.txt{color:#2b3345;font-weight:600;text-align:left;white-space:pre-wrap;word-break:break-word}
.jt-qbox.has-img{border-style:solid;background:#fff;padding:0;display:block;overflow:hidden}
.jt-qbox.has-img .jt-ph{display:none}
.jt-qbox img{display:block;width:100%;height:auto;max-height:min(58vh,520px);object-fit:contain;background:#fff}
.jt-qbox .cam-doc{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:6px;
  width:100%;padding:16px;box-sizing:border-box;text-align:center;color:#2b3a55;font-size:15px;
  font-weight:600;word-break:break-all}
.jt-qbox .cam-doc .cd-ic{font-size:32px;line-height:1}
.jt-qbox .cam-doc .cd-sub{font-weight:400;font-size:12.5px;color:#7b8798}
/* 裁剪/旋转工具条（#camTools）是 JS 动态 append 进 #camBox 的，
   而它的定位/显隐原来写在 .cam 名下 —— 容器换成 .jt-qbox 后必须自带一份，
   否则工具条会掉到框外去。 */
.jt-qbox .cam-tools{position:absolute;right:6px;bottom:6px;z-index:3;display:none;gap:6px;
  flex-wrap:wrap;justify-content:flex-end}
.jt-qbox.has-img .cam-tools{display:flex}
/* #camInput / #camShot 都是被按钮或粘贴驱动的隐藏控件，不给它留版面 */
.jt-pick{display:none!important}
.jt-qfoot{display:flex;align-items:center;justify-content:space-between;gap:8px;margin:6px 0 0;font-size:12.5px}
.jt-speedline{display:flex;align-items:center;gap:6px;margin:10px 0 12px;font-size:13.5px}
.jt-acts{display:grid;grid-template-columns:1fr auto;gap:10px;align-items:center}
.jt-acts .btn{width:100%}
.btn.ghost{background:#fff;color:#4A5162;border:1px solid var(--line,#e5eaf3);box-shadow:none}
/* v7.48：麦克风改成「点一下开始 / 说完再点一下结束」——
   录音阶段**整个按钮变红**（背景 + 边框 + 光晕 + 两行字全红），转写阶段继续红（换成呼吸光晕），
   识别完成后自动回到常态灰。红色直接沿用 #jtRecBar 那条识别条的一套色
   （#FDECEC / #F5B5B5 / #B3261E），和全站 .rec-del-btn 同一张脸；**不动 --bad / --brand**。 */
.jt-mic{width:100%;display:flex;align-items:center;gap:12px;text-align:left;font:inherit;
  background:#F6F7FA;border:1px solid var(--line,#e5eaf3);border-radius:14px;padding:12px 14px;
  margin-top:10px;cursor:pointer;position:relative;overflow:hidden;user-select:none;
  -webkit-user-select:none;touch-action:manipulation;transition:.15s}
.jt-mic .jt-mi{font-size:26px;line-height:1;flex:0 0 auto;color:#4A4F5C}
/* v7.48：「停止」图标不用 ⏹ 字形 —— 真机（Edge/Chrome）把它渲染成一坨纯黑方块，看着像故障。
   改成内联 SVG 画一个圆角方块，颜色跟着按钮走（录音中就是红的）。 */
.jt-mic .jt-mi svg{display:block}
.jt-mic.rec .jt-mi{color:#B3261E}
.jt-mic .jt-mtx{display:flex;flex-direction:column;gap:2px;min-width:0}
.jt-mic .jt-mt{font-size:14.5px;font-weight:700;color:#2b3345}
.jt-mic .jt-ms{font-size:12.5px;color:#7b8798}
/* v7.48：录音计时行 00:07 —— 只在「录音中」出现（原型稿 ③ 那一行） */
.jt-mic .jt-md{font-size:12.5px;font-weight:700;color:#B3261E;font-variant-numeric:tabular-nums;
  letter-spacing:.4px;margin-top:1px}
.jt-mic .jt-md[hidden]{display:none}
/* v7.48：完成态（原型稿 ④）**不再另加颜色** —— 原型写的是「按钮与文字一起回正常色」，
   所以它只是「图标换 ✓ + 两行文案换完成语」，底色/边框全部回到待录那一档。 */
/* ① 录音中：整个按钮实心红，图标跟着心跳 */
.jt-mic.rec{background:#FDECEC;border-color:#E5484D;box-shadow:0 0 0 3px rgba(217,48,37,.16)}
.jt-mic.rec .jt-mi{animation:jtMicBeat 1.1s ease-in-out infinite}
.jt-mic.rec .jt-mt{color:#B3261E}
.jt-mic.rec .jt-ms{color:#C0392B}
/* ② 转写中：同样是红，但改成「呼吸」的光晕，和录音中的实心红区分开 */
.jt-mic.rec-trans{background:#FDECEC;border-color:#F5B5B5;animation:jtMicBreath 1.25s ease-in-out infinite}
.jt-mic.rec-trans .jt-mt{color:#B3261E}
.jt-mic.rec-trans .jt-ms{color:#C0392B}
@keyframes jtMicBeat{0%,100%{transform:scale(1)}50%{transform:scale(1.16)}}
@keyframes jtMicBreath{0%,100%{box-shadow:0 0 0 2px rgba(217,48,37,.10)}50%{box-shadow:0 0 0 7px rgba(217,48,37,.20)}}
@media (prefers-reduced-motion:reduce){
  .jt-mic.rec .jt-mi{animation:none}
  .jt-mic.rec-trans{animation:none;box-shadow:0 0 0 4px rgba(217,48,37,.16)}
}
.jt-mic .wave-canvas{position:absolute;left:0;right:0;bottom:0;height:22px;width:100%;
  pointer-events:none;opacity:.85}
/* v7.46d：松手后的红色识别提示条「🔴 正在识别，请稍后…」—— 直到识别完成才消失 */
.jt-recbar{display:none;align-items:center;gap:8px;margin:10px 0 0;padding:9px 13px;
  border-radius:10px;background:#FDECEC;border:1px solid #F5B5B5;
  font-size:13px;font-weight:600;color:#B3261E;line-height:1.5}
.jt-recbar.on{display:flex}
.jt-recbar .dot{flex:0 0 8px;width:8px;height:8px;border-radius:50%;background:#D93025;
  animation:jtRecPulse 1s ease-in-out infinite}
@keyframes jtRecPulse{0%,100%{opacity:1;transform:scale(1)}50%{opacity:.35;transform:scale(.75)}}
@media (prefers-reduced-motion:reduce){.jt-recbar .dot{animation:none}}
/* 手写板 */
.jt-draw{margin-bottom:12px}
.jt-dlabel{font-size:14px;font-weight:600;color:#2b3345;margin-bottom:8px}
.jt-dlabel span{font-weight:400;font-size:12.5px;color:#7b8798;margin-left:6px}
.jt-dwrap{border:1px solid var(--line,#e5eaf3);border-radius:12px;background:#fff;overflow:hidden;
  background-image:linear-gradient(#f4f6fa 1px,transparent 1px);background-size:100% 26px}
.jt-dwrap canvas{display:block;width:100%;height:236px;touch-action:none;cursor:crosshair}
.jt-dtools{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:8px;margin:11px 0}
.jt-dt{font:inherit;font-size:13px;font-weight:600;color:#333A4B;background:#fff;
  border:1px solid var(--line,#e5eaf3);border-radius:11px;padding:9px 4px;cursor:pointer;
  display:flex;align-items:center;justify-content:center;gap:5px}
.jt-dt.on{background:#F1F0FE;border-color:#534AB7;color:#4A3FBF}

/* ================= v7.43b：讲题流程「宽屏两栏 + 这次可以怎么讲」=================
   稿子 ③ 的原话：同一套放宽成两栏，右栏把空白变成有用的东西。
   ① 默认（手机）：一栏，右栏整块不显示 —— 手机屏上那三句提示只会把「提交诊断」顶得更远。
   ② ≥861px（平板 / PC）：两栏；步骤条横跨整幅（grid-column:1/-1），右栏顶到上边。
   ③ 步骤条封顶 520px —— 稿子 ③ 原文就是 <div class="steps" style="max-width:520px">：
      宽屏下一根横线拉满 1100px 会显得很空，三颗小胶囊散在两头。 */
.jtsteps{max-width:520px}
.jt-flow{display:block}
.jt-side{display:none}
.jt-side h3{font-size:14px;font-weight:700;color:#2b3345;margin:0 0 4px;line-height:1.4}
.jt-side .jt-sidehint{font-size:12.5px;color:#7b8798;margin:0 0 12px;line-height:1.55}
.jt-side .jt-sr{display:flex;gap:8px;align-items:flex-start;margin:0 0 10px}
.jt-side .jt-sr .n{flex:0 0 18px;height:18px;border-radius:50%;background:#534AB7;color:#fff;
  font-size:11px;font-weight:700;display:inline-flex;align-items:center;justify-content:center;margin-top:1px}
.jt-side .jt-sr .t{flex:1 1 auto;min-width:0;font-size:13px;color:#333A4B;line-height:1.6}
.jt-side .jt-sidefoot{font-size:11.5px;color:#8b93a7;margin:12px 0 0;line-height:1.6}
/* v7.46a：温度引导（第 4 句）—— 与上面三维用一条细线分开，明示它是「附加」不是短板 */
.jt-side .jt-warmhint{margin:14px 0 10px;padding-top:12px;border-top:1px dashed #dfe3ee;color:#8b93a7}
.jt-side .jt-srw .n{background:#9aa3b8}
.jt-side .jt-srw .t{color:#4a5162}
/* ★ 视觉样式一律写在基类，display 只由断点给（下面 @media 里）——
     千万别把 display:block 挂在 .jt-side.on 上：两个类的选择器会盖过一个类的
     那条 display:none，手机上右栏就跟着冒出来了。
     （这句注释刻意不写出完整选择器字面量 —— 升级脚本 9.313 用 grep -cF 数它的行数，
       注释里同形的一行会让计数变成 2、上线假红。上一版就是这么踩的。） */
.jt-side.on{background:#F6F7FA;border:1px solid var(--line,#e5eaf3);
  border-radius:14px;padding:14px 15px;box-sizing:border-box}
@media (min-width:861px){
  .jt-flow{display:grid;grid-template-columns:minmax(0,1fr) minmax(0,.66fr);gap:26px;align-items:start}
  .jt-flow .jtsteps{grid-column:1/-1;margin-bottom:0}
  .jt-side.on{display:block;position:sticky;top:14px}
}

/* ==================================================================
   v7.48 需求⑤：七度拆解页「自带传题 + 就地拆解」
   五路入口与八度测评同款同序（题库·打标中 | 拍照 | 文件 | 粘贴 | 手写），
   下面接题目框、「开始拆解」与结果区（简析 / 详解 / 七度逐维）。
   ================================================================== */
.ana-src-row{display:grid;grid-template-columns:repeat(5,minmax(0,1fr));gap:8px;margin:10px 0 6px}
.ana-src{font:inherit;font-size:12.5px;font-weight:600;color:#333A4B;background:#fff;
  border:1px solid var(--line,#e5eaf3);border-radius:12px;padding:10px 4px;cursor:pointer;
  display:flex;flex-direction:column;align-items:center;gap:4px;line-height:1.25}
.ana-src .e{font-size:18px;line-height:1}
.ana-src .t{white-space:nowrap}
.ana-src .t i{display:block;font-style:normal;font-size:10.5px;font-weight:400;color:var(--muted,#6b7590)}
.ana-src:active{background:#F1F0FE;border-color:#534AB7;color:#4A3FBF}
.ana-src.off{opacity:.55;color:var(--muted,#6b7590);cursor:not-allowed}
.ana-src.off .e{filter:grayscale(1)}
.ana-qbox{position:relative;border:2px dashed var(--line,#e5eaf3);border-radius:14px;background:#fbfcfe;
  padding:10px;margin-bottom:6px;display:block}
.ana-qbox:focus-within{border-color:#534AB7;background:#fff}
.ana-qimg img{display:block;width:100%;height:auto;max-height:min(52vh,460px);object-fit:contain;
  background:#fff;border-radius:10px}
.ana-qimg .ana-qn{display:block;font-size:12px;color:var(--muted,#6b7590);margin-top:6px}
.ana-qta{display:block;width:100%;min-height:64px;border:0;background:transparent;
  font:inherit;font-size:13.5px;line-height:1.6;color:#2b3345;resize:vertical;outline:none}
.ana-qta::placeholder{color:#9aa4b8}
.ana-qta.has-img{display:none}
.ana-qfoot{display:flex;align-items:center;justify-content:space-between;gap:10px;
  font-size:12.5px;margin-bottom:4px}
.ana-res-h{display:flex;align-items:center;gap:10px;flex-wrap:wrap;margin-bottom:10px}
.ana-res-h .t{font-size:14px;font-weight:700;color:#2E7D32}
.ana-res-h .seg2{margin-left:auto;display:inline-flex;border:1px solid var(--line,#e5eaf3);
  border-radius:999px;overflow:hidden}
.ana-res-h .seg2 button{font:inherit;font-size:12.5px;padding:5px 14px;border:0;background:#fff;
  color:#4A5162;cursor:pointer}
.ana-res-h .seg2 button.on{background:#F1F0FE;color:#4A3FBF;font-weight:700}
.ana-sec{margin-top:10px}
.ana-sec-h{font-size:12.5px;font-weight:700;color:#4A3FBF;margin-bottom:5px}
.ana-sec p{margin:0 0 4px;font-size:13.5px;line-height:1.75;color:#2b3345}
.ana-chips{display:flex;flex-wrap:wrap;gap:6px}
.ana-chips span{font-size:12.5px;padding:4px 10px;border-radius:8px;background:#f2f5fb;color:#2b3345}
.ana-chips span.cnd{background:#eef4ff;color:#2b4c8c}
.ana-chips span.gol{background:#fff4e8;color:#8a5a1e}
.ana-dims{display:flex;flex-direction:column;gap:6px}
.ana-dim{display:flex;gap:10px;font-size:13px;line-height:1.65;color:#2b3345;
  background:#fafbff;border:1px solid #eef1f8;border-radius:10px;padding:7px 10px}
.ana-dim b{flex:0 0 52px;color:#4A3FBF;font-weight:700}
.ana-ans{font-weight:700;color:#1E3A6E}
.ana-wait .intro-s,.ana-err .intro-s{color:var(--muted,#6b7590)}
.ana-err .intro-t{color:#c0392b}

/* v7.48 需求②：页底「题目列表」折叠卡 —— 整行可点，▸/▾ 表状态（与 .tl-fold 同一观感） */
.ana-qlist-card{padding:0}
.ana-fold-h{display:flex;align-items:center;gap:8px;width:100%;font:inherit;font-size:14px;
  font-weight:700;color:var(--ink,#1c2333);background:transparent;border:0;
  padding:13px 14px;cursor:pointer;text-align:left}
.ana-fold-h .ar{color:#8a91a3;font-size:12px;width:12px;flex:0 0 12px}
.ana-fold-h .t{flex:1}
.ana-fold-h .cnt{font-size:12px;font-weight:400;color:var(--muted,#6b7590)}
.ana-fold-h .s{font-size:12px;font-weight:400;color:var(--brand-text,#3a6df0)}
.ana-fold-b{padding:0 14px 14px}
.ana-qlist-card.open .ana-fold-h{border-bottom:1px solid var(--line,#e5eaf3);margin-bottom:12px}
/* 需求⑤：新录入的题目行 */
.ana-newrow-h{font-size:12.5px;font-weight:700;color:#4A3FBF;margin:10px 0 6px}
.ana-newrow{display:flex;align-items:center;gap:8px;font-size:13px;color:#2b3345;
  background:#fafbff;border:1px solid #eef1f8;border-radius:10px;padding:8px 10px;margin-bottom:6px}
.ana-newrow .tx{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.ana-newrow .m{font-size:11.5px;color:var(--muted,#6b7590)}
.ana-newrow .bg{font-size:11px;padding:2px 7px;border-radius:6px;background:#eef4ff;color:#2b4c8c}

/* ==================================================================
   v7.48 需求⑦：记录详情下面五个模块的折叠
   标题行（带 data-mnf）整行可点，▸/▾ 表状态；折叠体 = .rm-body[data-mnf]。
   默认全部折叠，且**不记忆**（见 _REC_MOD_KEYS）——每次打开都从折叠开始。
   ================================================================== */
.rec-mods [data-mnf]{cursor:pointer;user-select:none}
.rec-mods [data-mnf]:hover{filter:brightness(.985)}
.rec-mods [data-mnf]:focus-visible{outline:2px solid #7aa7ff;outline-offset:2px;border-radius:6px}
.rec-mods .rm-ar{color:#8a91a3;font-size:12px;flex:none}
.rm-body[hidden]{display:none}

/* v7.48 需求①：PK 页的讲题记录卡片可点（此前整块只有缩略图接了事件） */
.pkrec-click{cursor:pointer}
.pkrec-click:hover{background:#fafbff}
.pkrec-click:focus-visible{outline:2px solid #7aa7ff;outline-offset:2px;border-radius:10px}

/* ===== v7.61：举一反三（错题相似题 + 对答案）===== */
/* 遮罩复用 .sh-mask/.sh-card（与分享弹层同一套），这里只加练习面板自己的件 */
.simq-card{min-height:280px}
.simq-list{display:flex;flex-direction:column;gap:12px;margin:10px 0 4px}
.simq-load{text-align:center;color:var(--muted);font-size:13.5px;padding:22px 8px;line-height:1.9}
.simq-item{border:1px solid var(--line);border-radius:12px;padding:10px 12px;background:#fafbff}
.simq-t{font-size:14px;line-height:1.75;color:var(--fg)}
.simq-t b{color:var(--brand-text)}
.simq-ans-row{display:flex;align-items:center;gap:8px;margin-top:8px}
/* v7.64：答案输入框已下线（拍照对答案替代）；.simq-in 留一行注释位，样式随沙盘复用面删除 */
.simq-judge{margin-top:8px;font-size:13.5px;line-height:1.7;border-radius:9px;padding:7px 10px}
.simq-judge.ok{background:#eef7ee;color:#1c6b2f}
.simq-judge.bad{background:#fdf0ef;color:#a33a32}
.simq-judge.wait{background:#f4f6fb;color:var(--fg)}
.simq-comment{margin-top:4px;font-size:13px}
.simq-chk-again{margin-top:6px}
/* v7.66：统一对答案 —— 一张照片批完全部（替代 v7.64 每题一拍） */
.simq-check{margin:4px 0 2px;text-align:center}
.simq-check .btn{min-width:60%}
.simq-check .simq-ocr-hint{margin-top:6px}
/* v7.70：工具行只留「✕ 清空」（右对齐）——独立 🎤 小按钮与提示按用户反馈移除，
   语音并入底部主按钮（.simq-go 双态） */
.simq-qtools{display:flex;align-items:center;justify-content:flex-end;gap:8px;margin-top:4px}
.simq-qtools .mini-btn{flex:none}
/* 底部主按钮双态：.voice=「🎤 按住 说话」（框空时，青蓝底区分出题蓝）；.rec=听写中整颗红 */
.simq-actions .btn.voice, .sh-actions .btn.voice{background:#2c7a7b;border-color:#2c7a7b}
.sh-actions .btn.rec{background:#e05252;border-color:#e05252;color:#fff}
.simq-steps{margin-top:8px;font-size:13px;line-height:1.8;color:var(--muted);
  border-top:1px dashed var(--line);padding-top:8px;white-space:pre-wrap}

/* ===== v7.62：举一反三备题区（拍照 / 截图 / 重拍 / 删除 + 文字描述）===== */
.simq-qin{width:100%;box-sizing:border-box;border:1px solid var(--line);border-radius:10px;
  padding:9px 11px;font-size:14px;font-family:inherit;line-height:1.7;background:#fff;
  color:var(--fg);resize:vertical;min-height:64px}
.simq-qin:focus{outline:2px solid #7aa7ff;outline-offset:1px}
.simq-src-row{display:flex;align-items:center;gap:8px;margin-top:8px;flex-wrap:wrap}
.simq-prev{display:block;max-width:100%;max-height:220px;border:1px solid var(--line);
  border-radius:10px;margin-top:10px;background:#fafafa}
.simq-ocr-hint{margin-top:6px;font-size:12.5px;line-height:1.7;color:var(--muted)}

  /* v7.74：看书章工作区 —— .btn 全局是 display:block;width:100%（CTA 档），
     章工作区里的行内小按钮要收回来；标题行改 flex 排布。 */
  #readChapterCard h3{display:flex;align-items:center;justify-content:space-between;gap:10px}
  #readChapterBack{display:inline-block;width:auto;flex:0 0 auto;padding:5px 14px;font-size:12px;border-radius:9px}
  #readAskBtn{flex:0 0 auto;width:auto;padding:9px 24px}
  #readChapterCard textarea,#readChapterCard input{background:#fff}
  #readFrameResult .chat-bubble{background:#f4f8ff}

  /* v7.75：课本查看器 —— .btn 全局 width:100%，工具条里的行内小按钮收回 */
  #tbPrevBtn,#tbNextBtn,#tbCropClear{display:inline-block;width:auto;flex:0 0 auto;padding:4px 12px}
  #tbPageInput{-moz-appearance:textfield}
  #tbPageInput::-webkit-outer-spin-button,#tbPageInput::-webkit-inner-spin-button{-webkit-appearance:none;margin:0}

/* v7.83：圈选语音提问 —— 录音中按钮变红 + 呼吸圈提示 */
#tbCropMic.tbRecOn{
  background:#d93025 !important; color:#fff !important; border-color:#d93025 !important;
  animation:tbrecpulse 1.1s ease-in-out infinite;
}
@keyframes tbrecpulse{
  0%,100%{ box-shadow:0 0 0 0 rgba(217,48,37,.42); }
  50%{ box-shadow:0 0 0 7px rgba(217,48,37,0); }
}

/* v7.84：看书三步骤过关复选框 —— 打钩态 */
.rdPass.on{ color:#2e8b57 !important; font-weight:700; }
.rdPass.on .rdPassBox{ border-color:#2e8b57; background:#2e8b57; color:#fff; }

/* ═══ v7.91：看书模块 + 草稿板 —— 按钮紧凑化（平板/PC 优先） ═══
   根因：.btn 基类 display:block;width:100%;padding:13px —— 草稿板 5 个按钮各占一整行堆成半屏。
   这里在看书屏/草稿板作用域内整体改小；带内联样式的按钮不受影响（inline 优先级更高）。 */
#readScreen .btn, #scratchPad .btn{
  display:inline-block; width:auto; padding:6px 13px; font-size:13.5px;
  border-radius:9px; margin-top:0; line-height:1.4;
}
#readScreen .btn + .btn, #scratchPad .btn + .btn{ margin-top:0; }
#scratchPad .btn{ padding:5px 11px; font-size:12.5px; }
/* v7.91：PDF 三态模式切换（浏览/框选/写画）—— 分段钮 */
#tbModeSeg{ display:inline-flex; border:1px solid #c9d6ea; border-radius:9px; overflow:hidden; }
#tbModeSeg .btn{ border-radius:0; border:none; padding:5px 10px; font-size:12.5px; }
#tbModeSeg .btn + .btn{ border-left:1px solid #d7e2f2; }
/* v7.91：文本框麦克风（通用）—— 录音态红底呼吸（复用 tbrecpulse），识别中转灰 */
.micBtn{ flex:0 0 auto; }
.micBtn.tbRecOn{
  background:#d93025 !important; color:#fff !important; border-color:#d93025 !important;
  animation:tbrecpulse 1.1s ease-in-out infinite;
}
.micBtn.tbBusy{ opacity:.6; }

/* ═══ v7.92：PDF 全屏底部快捷条（平板优先触摸目标，按钮 40px 高） ═══ */
.fbb{
  width:40px; height:38px; padding:0; border:none; border-radius:999px;
  background:rgba(255,255,255,.14); color:#fff; font-size:16px; line-height:1;
  cursor:pointer; flex:0 0 auto; transition:background .15s;
}
.fbb:hover{ background:rgba(255,255,255,.28); }
.fbb.primary{ background:rgba(143,176,224,.95); }

/* ═══ v7.93：全屏工具条按留白自适应 —— 左右留白多（横屏适高）竖放右侧，上下留白多（竖屏）横放底部 ═══ */
#tbFullBar.vert{
  left:auto; right:14px; top:50%; bottom:auto;
  transform:translateY(-50%);
  flex-direction:column; padding:12px 7px;
}
#tbFullBar.vert .fbb{ width:44px; height:40px; }
#tbFullBar.vert input#fbPage{ width:44px; text-align:center; }
#tbFullBar.vert span{ width:20px !important; height:1px !important; }

/* ═══ v7.94：全屏工具条定位全部走 CSS（内联样式压不住类，横屏竖排会拉宽成大黑块） ═══ */
#tbFullBar{
  position:fixed; left:50%; bottom:14px; transform:translateX(-50%);
  z-index:9999; display:flex; align-items:center; gap:6px;
  background:rgba(28,38,58,.92); border-radius:999px; padding:7px 12px;
  box-shadow:0 4px 18px rgba(0,0,0,.3);
  backdrop-filter:blur(6px); -webkit-backdrop-filter:blur(6px);
}
#tbFullBar.hidden{ display:none; }
#tbFullBar input#fbPage{ width:52px; border:none; border-radius:8px; padding:5px 6px; font-size:13px; text-align:center; background:rgba(255,255,255,.92); }
#tbFullBar.vert{ left:auto; right:14px; top:50%; bottom:auto; transform:translateY(-50%); flex-direction:column; padding:12px 7px; }
#tbFullBar.vert .fbb{ width:44px; height:40px; }
#tbFullBar.vert input#fbPage{ width:44px !important; }
#tbFullBar.vert span{ width:20px !important; height:1px !important; }

/* v7.98：触摸屏 —— 查看器禁用浏览器原生双指缩放页面，双指捏合改由 JS 缩放 PDF；单指保留平移滚动 */
#tbViewer{ touch-action: pan-x pan-y; }

/* ==================== v7.347：PDF 全屏时收掉顶栏与底部导航 ====================
   用户 2026-10-28 原话：「底下这个导航栏太宽了…在 PDF 全屏的时候它可以隐藏起来，
   这样空间利用率就会比较高」。
   全屏课本本就该占满整屏，顶栏（品牌/分享/我的）与底部导航在这时没有任何用处 ——
   挂 body 类 .tb-fs-on 由 app.js 的 toggleFull() 开关，退出全屏自动还原。
   ★ 只做 display:none，不改 DOM、不动其它页面的布局。 */
.tb-fs-on .top-bar,.tb-fs-on .nav{display:none !important}

/* ══ v7.366：读书方法文字稿页退役 —— 开机直进「PDF + 小贝直播间」双视图 ══
   说明页（hero / 看书三步骤 / 三张步骤卡 / 全程收尾卡）整体不再展示、不再作为必经入口。
   功能不删：第 1 步内的选书下拉/计时等被开机弹窗（bootPickModal）程序化复用（走真实 onchange 联动），
   📖读书方法流程面板（#p3Panel）仍是独立入口（PDF 工具栏按钮）；readBookBar 课本状态条保留。 */
#readScreen .page-hero { display:none !important; }
#readIntroSteps { display:none !important; }
#readFlowSteps .rdStep { display:none !important; }
#readFinishCard { display:none !important; }
