:root {
  --paper:#f6f1e6; --surface:#fffdf7; --ink:#1f2c22; --ink-2:#35473a;
  --green:#2f6b4f; --green-2:#24543e; --sage:#e9efe6; --cream:#f3e7cd;
  --wheat:#c98f2b; --wheat-deep:#a5711f; --soil:#b08a57;
  --line:#e4dcc8; --muted:#77806f; --danger:#c94f4f; --success:#2f7d5c;
  --radius:12px;
  --display:"Noto Serif SC","Source Han Serif SC","Songti SC","STSong","SimSun",serif;
  --body:"Noto Sans SC","PingFang SC","Microsoft YaHei",sans-serif;
  --shadow-sm:0 1px 2px rgba(31,44,34,.05), 0 6px 18px rgba(31,44,34,.06);
  --shadow-lg:0 2px 4px rgba(31,44,34,.05), 0 24px 60px rgba(31,44,34,.12);
}

* { box-sizing:border-box; }
body { margin:0; font-family:var(--body); background:var(--paper); color:var(--ink); line-height:1.75; -webkit-font-smoothing:antialiased; }
button, input, textarea, select { font:inherit; }
a { color:var(--green); text-decoration:none; }
/* line-height 原本是 main.css 提供的（app.html 一直顺带加载着它），
   2026-09-18 挪进来 —— 应用不该靠官网的样式表撑着，否则哪天删 main.css 标题就松了 */
h1,h2,h3,h4 { margin:0; line-height:1.25; font-family:var(--display); font-weight:700; }

.app-shell { display:grid; grid-template-columns:252px 1fr; min-height:100vh; }
.app-side { background:#1f2c22; color:#e6ead9; padding:22px 14px; position:sticky; top:0; height:100vh; display:flex; flex-direction:column; }
.app-side .brand { display:flex; align-items:center; gap:10px; padding:4px 10px 24px; color:#fff; }
.app-side .brand svg { width:30px; height:30px; flex:0 0 auto; }
.brand-name { font-family:var(--display); font-weight:800; font-size:17px; line-height:1.2; }
.brand-en { display:block; font-size:8px; font-weight:600; letter-spacing:.22em; text-transform:uppercase; color:#b9c2ac; margin-top:2px; }
.side-link { display:flex; align-items:center; gap:11px; width:100%; padding:11px 12px; margin:3px 0; border:0; border-radius:var(--radius); background:transparent; color:#e6ead9; cursor:pointer; font-size:14px; text-align:left; transition:background .14s ease, color .14s ease; }
.side-link:hover { background:rgba(255,255,255,.09); color:#fff; }
.side-link.active { background:var(--green); color:#fff; }
.side-link svg { width:18px; height:18px; }
/* 未读通知角标（BAN-130）。放在 .side-link 内、靠右；用 min-width 保证个位数时是圆的。
   ⚠️ 不占位（hidden 属性）—— 没有未读时它必须完全消失，否则侧栏会多一个空点。 */
.side-dot { margin-left:auto; min-width:18px; padding:0 5px; border-radius:999px; background:#d9822b; color:#fff; font-size:11px; line-height:18px; text-align:center; font-weight:600; }
.side-dot[hidden] { display:none; }

/* 消息列表（BAN-130，个人中心）。未读用左侧实边 + 加粗标题标出——
   不靠颜色单独表意（色弱的用户也要能分辨哪条没读）。 */
.notif-list { display:flex; flex-direction:column; gap:10px; }
.notif { padding:10px 12px; border-radius:10px; background:var(--sand,#f6f4ef); border-left:3px solid transparent; }
.notif.unread { border-left-color:var(--wheat,#c9a227); background:#fff; }
.notif.unread .notif-head b { font-weight:700; }
.notif-head { display:flex; justify-content:space-between; align-items:baseline; gap:10px; }
.notif-head b { font-size:14px; }
.notif p { margin:4px 0 0; }
.side-foot { margin-top:auto; }

.app-main { padding:34px 40px 64px; min-width:0; }

.btn { display:inline-flex; align-items:center; justify-content:center; gap:8px; min-height:44px; padding:0 20px; border:1px solid transparent; border-radius:999px; background:var(--green); color:#fff; font-size:14px; font-weight:600; cursor:pointer; transition:transform .14s ease, background .14s ease, border-color .14s ease; }
.btn:hover { background:var(--green-2); color:#fff; }
.btn:active { transform:scale(.98); }
.btn.ghost { background:transparent; border-color:var(--line); color:var(--ink-2); }
.btn.ghost:hover { background:var(--surface); color:var(--ink); }
.btn.amber { background:var(--wheat); }
.btn.amber:hover { background:var(--wheat-deep); }
.btn.danger { background:var(--danger); }
.btn:disabled { opacity:.5; cursor:not-allowed; }

.topbar { display:flex; align-items:flex-end; justify-content:space-between; gap:16px; margin-bottom:26px; }
.topbar h1 { font-size:30px; font-weight:800; }
.topbar p { margin-top:4px; color:var(--muted); font-size:14px; }
.toolbar { display:flex; align-items:center; gap:10px; flex-wrap:wrap; }
.muted { color:var(--muted); }
.danger { color:var(--danger); }
.success { color:var(--success); }

.panel { background:var(--surface); border:1px solid var(--line); border-radius:var(--radius); box-shadow:var(--shadow-sm); }
.panel-head { padding:18px 22px; border-bottom:1px solid var(--line); display:flex; align-items:center; justify-content:space-between; gap:14px; }
.panel-head h2 { font-size:18px; }
.panel-body { padding:22px; }

.grid { display:grid; gap:16px; }
.stats-grid { display:grid; grid-template-columns:repeat(4,1fr); gap:16px; margin-bottom:26px; }
.stat { background:var(--surface); border:1px solid var(--line); border-radius:var(--radius); padding:20px; box-shadow:var(--shadow-sm); }
.stat b { display:block; font-family:var(--display); font-size:32px; color:var(--green-2); line-height:1.2; }
.stat span { color:var(--muted); font-size:13px; }

.bank-list { display:grid; grid-template-columns:repeat(2,1fr); gap:18px; }
.bank-card { background:var(--surface); border:1px solid var(--line); border-radius:var(--radius); padding:22px; box-shadow:var(--shadow-sm); cursor:pointer; transition:transform .16s ease, box-shadow .16s ease, border-color .16s ease; }
/* 题库卡片操作 */
.bank-card-head { display:flex; align-items:center; gap:8px; }
.bank-card-head h3 { flex:1; min-width:0; }
.btn-sm { min-height:30px; padding:0 10px; font-size:12px; border-radius:999px; }
.btn-sm.danger:hover { background:var(--danger); border-color:var(--danger); color:#fff; }
/* 校对来源定位 */
.src-ref { font-size:12px; color:var(--wheat-deep); background:var(--cream); border-radius:6px; padding:2px 8px; }
/* 校对两栏：列表 + 原文预览 */
.review-layout { display:grid; grid-template-columns:1fr 380px; gap:18px; align-items:start; }
.review-list { display:flex; flex-direction:column; gap:12px; }
.review-preview { position:sticky; top:20px; background:var(--surface); border:1px solid var(--line); border-radius:var(--radius); padding:16px; max-height:calc(100vh - 140px); overflow:auto; box-shadow:var(--shadow-sm); }
.preview-hint { color:var(--muted); font-size:13px; line-height:1.8; }
.preview-head { font-size:12.5px; color:var(--wheat-deep); font-weight:600; margin-bottom:10px; padding-bottom:8px; border-bottom:1px dashed var(--line); }
.preview-raw { white-space:pre-wrap; font-size:13px; line-height:1.8; color:var(--ink-2); margin:0; font-family:var(--body); }
.preview-lines { font-size:13px; line-height:1.9; }
.pl-row { display:flex; gap:10px; padding:2px 0; border-bottom:1px dashed var(--line); }
.pl-no { flex:0 0 34px; text-align:right; color:var(--muted); font-size:12px; font-variant-numeric:tabular-nums; }
.pl-text { white-space:pre-wrap; word-break:break-all; color:var(--ink-2); }
.pl-row.is-question { background:var(--cream); border-bottom:none; margin:4px -10px; padding:6px 10px; border-radius:8px; }
.pl-row.is-question .pl-text { color:var(--ink); font-weight:600; }
.question-card.preview-active { border-color:var(--wheat); box-shadow:0 0 0 2px rgba(201,143,43,.22); }
@media (max-width:900px) {
  .review-layout { grid-template-columns:1fr; }
  .review-preview { position:static; max-height:none; }
}
/* 田视觉：题库生长阶段 */
.growth { display:flex; align-items:center; gap:9px; margin-bottom:14px; padding:9px 12px; border-radius:10px; background:var(--sage); border:1px solid var(--line); }
.growth img { width:26px; height:26px; filter:drop-shadow(0 1px 1px rgba(31,44,34,.18)); }
.growth-label { font-size:13px; font-weight:700; color:var(--green-2); }
.growth-pct { margin-left:auto; font-size:12px; color:var(--muted); font-variant-numeric:tabular-nums; }
.growth.harvest { background:var(--cream); border-color:rgba(201,143,43,.35); }
.growth.harvest .growth-label { color:var(--wheat-deep); }
.growth.sowing { background:transparent; border-style:dashed; }
.bank-card:hover { transform:translateY(-2px); box-shadow:var(--shadow-lg); border-color:rgba(47,107,79,.4); }
.bank-card h3 { font-size:19px; }
.bank-card p { color:var(--muted); font-size:13px; margin:8px 0 16px; min-height:40px; }
.bank-meta { display:flex; justify-content:space-between; color:var(--muted); font-size:12px; border-top:1px solid var(--line); padding-top:12px; }

.form-grid { display:grid; gap:14px; }
.field label { display:block; font-size:13px; color:var(--muted); margin-bottom:6px; }
.field input, .field textarea, .field select { width:100%; min-height:44px; padding:10px 12px; border:1px solid var(--line); border-radius:var(--radius); background:var(--surface); color:var(--ink); }
.field textarea { min-height:100px; resize:vertical; }
.inline-form { display:flex; gap:8px; align-items:center; }

.modal-backdrop { position:fixed; inset:0; background:rgba(26,38,30,.5); display:none; align-items:center; justify-content:center; z-index:40; padding:20px; }
.modal-backdrop.open { display:flex; }
.modal { background:var(--surface); border-radius:var(--radius); box-shadow:var(--shadow-lg); width:min(540px,100%); max-height:90vh; overflow:auto; padding:26px; }
.modal h2 { margin-bottom:16px; font-size:22px; }

.question-card { border:1px solid var(--line); border-radius:var(--radius); padding:20px; background:var(--surface); box-shadow:var(--shadow-sm); }
.question-card + .question-card { margin-top:14px; }
.question-stem { font-size:16px; font-weight:600; line-height:1.65; }
.option { display:flex; gap:10px; align-items:flex-start; padding:11px 13px; border:1px solid var(--line); border-radius:var(--radius); cursor:pointer; margin-top:8px; transition:border-color .14s ease, background .14s ease; }
.option:hover { border-color:var(--green); }
.option.selected { border-color:var(--green); background:#eef5ee; }
.option.correct { border-color:var(--success); background:var(--ok-bg); }
.option.wrong { border-color:var(--danger); background:var(--err-bg); }
.option .letter { flex:0 0 26px; height:26px; border-radius:50%; background:var(--sage); display:flex; align-items:center; justify-content:center; font-weight:700; font-size:13px; color:var(--ink-2); }

.tag { display:inline-block; padding:3px 10px; border-radius:999px; background:var(--cream); color:var(--wheat-deep); font-size:12px; font-weight:700; }
.empty { padding:48px 20px; text-align:center; color:var(--muted); }
.login-card { max-width:440px; margin:9vh auto 0; }
.review-low { border-left:4px solid var(--wheat); }
.practice-track { height:6px; border-radius:999px; background:var(--sage); overflow:hidden; }
.practice-bar { height:100%; border-radius:999px; background:var(--green); transition:width .3s ease; }

/* 校对：原因标签 */
.reason-tag { display:inline-block; padding:3px 9px; border-radius:999px; background:#fbe7e7; color:#b23b3b; font-size:11.5px; font-weight:600; }
/* AI 参与标记（BAN-63）：中性配色，不跟「需校对」的红标签抢注意力 */
.ai-tag { display:inline-block; padding:3px 9px; border-radius:999px; background:var(--cream); color:var(--wheat-deep); font-size:11.5px; font-weight:600; cursor:help; }
/* AI 改动可见（BAN-64）：摊开「改前 → 改后 + 依据」，让用户能独立判断改动成不成立。
   中性配色、小字号——它是给用户核对的**证据**，不跟「需校对」的红标签抢注意力。 */
.ai-changes { margin-top:10px; padding:10px 12px; border-radius:10px; background:var(--cream); }
.ai-changes-title { display:block; font-size:11.5px; font-weight:700; color:var(--wheat-deep); margin-bottom:6px; }
.ai-changes ul { margin:0; padding:0; list-style:none; }
.ai-changes li { font-size:12.5px; line-height:1.65; color:var(--ink-2); }
.ai-changes li + li { margin-top:6px; padding-top:6px; border-top:1px dashed var(--line); }
.ai-ch-field { display:inline-block; min-width:34px; font-weight:700; color:var(--ink); margin-right:6px; }
.ai-ch-before { color:var(--muted); text-decoration:line-through; }
.ai-ch-arrow { margin:0 6px; color:var(--wheat-deep); }
.ai-ch-after { font-weight:700; color:var(--green); }
.ai-ch-empty { color:var(--muted); font-style:italic; }
.ai-ch-basis { font-size:11.5px; color:var(--muted); margin-top:2px; padding-left:40px; }
/* 校对：原因筛选 chips */
.filter-row { display:flex; flex-wrap:wrap; gap:8px; margin-bottom:16px; }
.chip { font:inherit; font-size:13px; padding:6px 14px; border-radius:999px; border:1px solid var(--line); background:var(--surface); color:var(--ink-2); cursor:pointer; }
.chip.active { background:var(--green); border-color:var(--green); color:#fff; }
.chip:hover { border-color:var(--green); }
/* 校对：批量工具栏 */
.review-toolbar { display:flex; align-items:center; gap:14px; flex-wrap:wrap; padding:12px 0; border-top:1px solid var(--line); border-bottom:1px solid var(--line); margin-bottom:16px; }
.review-head { display:flex; align-items:center; gap:10px; }
.draft-check { width:18px; height:18px; cursor:pointer; accent-color:var(--green); }
.question-card.selected { border-color:var(--green); box-shadow:0 0 0 2px rgba(47,107,79,.15); }
/* 上传拖拽区 */
.dropzone { border:2px dashed var(--line); border-radius:var(--radius); padding:26px 20px; text-align:center; cursor:pointer; transition:border-color .15s ease, background .15s ease; }
.dropzone:hover, .dropzone.dragging { border-color:var(--green); background:#eef5ee; }
.dropzone.has-file { border-color:var(--green); background:#eef5ee; }
.dropzone .dz-text { color:var(--ink-2); font-size:14px; margin-top:10px; }
.dropzone .dz-hint { color:var(--muted); font-size:12px; margin-top:8px; }

@media (max-width:760px) {
  .app-shell { grid-template-columns:1fr; }
  /* 2026-09-21（BAN-16 方案 B，阿楼拍板「导航条换行」）：
     原来靠 `overflow-x:auto` 横向滚动 —— 导航内容约 994px，手机只有 390px，
     「积分 / 果实 / 退出登录」被藏在最右边，得横向滑才看得见（诊断报告第四节）。
     改成**换行**：`flex-wrap:wrap` 让入口折到第二、三行，一览无余，不再有藏起来的入口。
     `overflow-x:auto` 同时去掉 —— 换行之后横向已经没有可滚的内容，
     留着它只会多一个滚动容器（还会在部分浏览器里诱发触摸滚动区的怪行为）。 */
  .app-side { position:static; height:auto; flex-direction:row; flex-wrap:wrap; align-items:center; gap:6px; padding:10px 12px; }
  /* 2026-09-20（BAN-16 诊断实测）：侧栏转横排后子元素**默认仍可被压缩**，390px 下实测：
     品牌名被压到 75px 宽 →「半亩题田」竖排成 4 行；用户卡里的
     「阿楼4260 积分 · 42 果实」被压到 23px 宽 → 竖排 104px 高，而且整张卡被推到屏幕外 339px。
     这里统一**不许压缩**：宁可换行，也不要把字竖起来。
     （`.side-link` 本来就有 nowrap，所以它没被压 —— 挤压全落在没设 nowrap 的那几个上。） */
  .app-side > * { flex:0 0 auto; }
  .app-side .brand { padding:0 14px 0 4px; white-space:nowrap; }
  .brand-en { display:none; }
  .side-foot { display:flex; margin-top:0; }
  .ucard .uinfo { white-space:nowrap; }
  .side-link { width:auto; white-space:nowrap; padding:9px 10px; }
  .app-main { padding:22px 16px 48px; }
  .topbar { align-items:flex-start; flex-direction:column; }
  .stats-grid { grid-template-columns:repeat(2,1fr); }
  .bank-list { grid-template-columns:1fr; }
}

/* 头像（工单 09） */
.avatar-img { width:56px; height:56px; border-radius:50%; object-fit:cover; border:2px solid var(--green,#3a8f5f); }
.avatar-fallback { width:56px; height:56px; border-radius:50%; display:inline-flex; align-items:center; justify-content:center; background:var(--green,#3a8f5f); color:#fff; font-size:22px; font-weight:600; }

/* 个人中心（工单 10） */
.points-balance { display:flex; align-items:baseline; gap:8px; font-size:15px; margin-bottom:12px; }
.points-balance strong { font-size:34px; color:var(--green,#3a8f5f); line-height:1.1; }
.tx-list { border-top:1px solid var(--line,#e5e5e5); }
.tx-row { display:flex; align-items:center; gap:10px; padding:7px 0; border-bottom:1px solid var(--line,#e5e5e5); font-size:13px; }
.tx-note { flex:1; overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
.tx-amount { font-weight:600; font-family:"JetBrains Mono",monospace; }
.tx-amount.in { color:var(--sprout,#00C26E); }
.tx-amount.out { color:#b26a00; }
.calendar-wrap { overflow-x:auto; padding-bottom:4px; }
.calendar-grid { display:grid; grid-template-rows:repeat(7,13px); grid-auto-flow:column; gap:3px; width:max-content; }
/* 2026-09-18：热力图配色从旧绿（#c8e6c9/#81c784/#43a047/#1b5e20）换成芽绿色阶，
   今天用麦黄描边（品牌行动色），对齐首页语言 */
.cal-day { width:13px; height:13px; border-radius:3px; background:var(--sand); }
.cal-day.l1 { background:#D1F4E5; }
.cal-day.l2 { background:#8CE3BE; }
.cal-day.l3 { background:var(--sprout); }
.cal-day.l4 { background:var(--ok); }
.cal-day.today { outline:2px solid var(--wheat); outline-offset:0; }

/* 公告横幅（工单 12） */
.ann-banner { display:flex; align-items:flex-start; gap:10px; background:#fff8e1; border:1px solid #f0dfa8; border-radius:10px; padding:10px 14px; margin:14px 0 4px; font-size:13px; line-height:1.6; }
.ann-text { flex:1; }
.ann-close { border:0; background:transparent; font-size:18px; cursor:pointer; color:#8a7a3a; line-height:1; padding:2px 4px; }

/* =====================================================================
   2026-09-17 视觉定稿主题层（docs/设计定稿-2026-09-17.md）
   白底无页面底色 · 深田绿墨 · 麦黄唯一行动色 · 芽绿进度色 · 田卡场景
   ===================================================================== */
:root {
  --paper:#FFFFFF; --surface:#FFFFFF; --ink:#0B4A32; --ink-2:#123A2B;
  --wheat:#FFC93C; --wheat-ink:#0B4A32; --sprout:#00C26E; --gold:#D99A2B;
  --soil:#E9D9B4; --soil-wet:#CFBB89; --water:#A5D8F5; --seed:#B08A57;
  --line:#EEE8D8; --dash:#DED8C4; --sand:#F7F5EC; --muted:#8C8770;
  /* 语义色（2026-09-26 · 卡 BAN-131 · docs/设计规范.md §七.4 收口）。
     值**全部取自新层本来就在用的那几个**，不是新配色 —— 目的只是「以后改一处、全站跟着改」。
     ⚠️ 同时把旧层的 --success(#2f7d5c) / --danger(#c94f4f) 覆盖掉：它们解析成旧莫兰迪色，
     与新层的成功/失败色**两套并存**（§七.4 记的就是这件事；--danger 的新旧值本来同色）。 */
  --ok:#006137; --ok-bg:#EDFBF5; --ok-soft:#F2FCF8;
  --warn:#D99A2B; --warn-bg:#FFF6DC;
  --err:#C94F4F; --err-bg:#FDF1F1;
  --success:var(--ok); --danger:var(--err);
  /* 麦黄浅底：种子盲盒块与"主行动"悬停都在用。底下几处一直写着
     `var(--wheat-soft, #FFF6DC)` —— 而这个变量**从来没定义过**（一直是兜底值在生效），
     2026-09-26 补上定义，并把同色的硬编码也收进来。 */
  --wheat-soft:#FFF6DC;
  /* 2026-09-18 修：旧层 --display 是宋体（Noto Serif SC），与官网的粗黑无衬线
     不是一套，是"子页面看着跟首页不像"最直观的一条。定稿要求 Noto Sans SC 900。 */
  --display:"Noto Sans SC","PingFang SC","Microsoft YaHei",sans-serif;
}
body { background:var(--paper); color:var(--ink); }
.app-side { background:var(--surface); color:var(--ink); border-right:1px dashed var(--dash); }
.app-side .brand { color:var(--ink); }
.brand-name { color:var(--ink); }
.brand-en { color:var(--muted); }
.side-link { color:var(--muted); border-radius:10px; }
.side-link:hover { background:var(--sand); color:var(--ink); }
.side-link.active { background:var(--wheat); color:var(--ink); }
.side-foot { border-top:1px dashed var(--dash); padding-top:10px; }
.btn { background:var(--wheat); color:var(--ink); }
.btn:hover { background:#EAB52F; color:var(--ink); }
.btn.ghost { background:var(--surface); border-color:var(--line); color:var(--ink-2); }
.btn.danger { background:var(--err); color:#fff; }
.panel { border-color:var(--line); }
.muted { color:var(--muted); }
/* 2026-09-18 修：此前把填充条写成沙色、芽绿写给不存在的 .practice-fill，
   真实结构是 .practice-track > .practice-bar（app.js 刷题/考试两处），
   结果填充与轨道几乎同色、进度看不见。 */
.practice-track { background:var(--sand); }
.practice-track > .practice-bar { background:var(--sprout); }

/* 侧栏：连续灌溉月历 + 用户卡 */
.side-irrig { margin:14px 4px 0; border-top:1px dashed var(--dash); padding-top:13px; }
.irrig-lab { font-size:11.5px; color:var(--muted); letter-spacing:.05em; }
.irrig-big { font:700 30px/1.1 "JetBrains Mono",monospace; color:var(--sprout); margin:4px 0 9px; }
.irrig-big small { font:400 12px "Noto Sans SC",sans-serif; color:var(--muted); margin-left:3px; }
.cal-head { display:flex; justify-content:space-between; font:500 9.5px "JetBrains Mono",monospace; color:var(--muted); margin-bottom:5px; }
.cal { display:grid; grid-template-columns:repeat(7,1fr); gap:3px; }
.cal .w { font:500 8.5px "JetBrains Mono",monospace; color:var(--muted); text-align:center; padding-bottom:2px; }
.cal .d { aspect-ratio:1; border-radius:4px; font:500 8.5px "JetBrains Mono",monospace; color:var(--muted); display:grid; place-items:center; background:var(--sand); }
.cal .d.lit { background:var(--sprout); color:#FAFCF7; font-weight:700; }
.cal .d.today { box-shadow:inset 0 0 0 2px var(--wheat); }
.ucard { display:flex; align-items:center; gap:9px; font-size:11.5px; color:var(--muted); }
.ucard .av { width:28px; height:28px; border-radius:50%; background:var(--wheat); color:var(--ink); display:grid; place-items:center; font-weight:900; flex:0 0 auto; }
.uinfo { line-height:1.5; }
.uinfo code, .fruitnum { font:700 11.5px "JetBrains Mono",monospace; color:var(--ink); }
.fruitnum { color:var(--gold); }
.uout { margin-left:auto; border:0; background:transparent; color:var(--muted); cursor:pointer; padding:4px; border-radius:8px; }
.uout:hover { color:var(--ink); background:var(--sand); }
.uout svg { width:15px; height:15px; }

/* 首页：页头副题 + 灌溉条 + 田卡 */
.page-sub { font-size:12.5px; color:var(--muted); margin-top:5px; }
.irrig-bar { display:flex; align-items:center; gap:24px; border-top:2px dashed var(--dash); border-bottom:2px dashed var(--dash); padding:10px 4px; margin-bottom:18px; flex-wrap:wrap; }
.irrig-bar .it { font-size:12px; color:var(--muted); display:flex; align-items:baseline; gap:5px; }
.irrig-bar .it b { font:700 17px "JetBrains Mono",monospace; color:var(--ink); }
.irrig-bar .it.hi b { color:var(--sprout); }
.irrig-bar .more { margin-left:auto; font-size:12px; font-weight:700; color:var(--sprout); cursor:pointer; }
.bank-card { position:relative; padding:15px 16px 14px; }
.nmrow { display:flex; align-items:baseline; gap:8px; }
.nmrow .idx { font:700 11px "JetBrains Mono",monospace; color:#C4BFA9; }
.nmrow .nm { font-size:14.5px; font-weight:900; letter-spacing:-0.01em; }
.nmrow .cnt { margin-left:auto; font:700 11px "JetBrains Mono",monospace; color:var(--muted); }
.bank-card .desc { font-size:11px; color:var(--muted); margin-top:3px; }
.bank-card .tools { display:flex; gap:6px; margin-top:8px; opacity:0; transition:opacity .15s ease; }
.bank-card:hover .tools { opacity:1; }
.field-scene { position:relative; margin-top:12px; border-radius:12px; overflow:hidden; height:118px; }
.sun { position:absolute; top:10px; right:14px; width:22px; height:22px; border-radius:50%; background:var(--wheat); opacity:.9; box-shadow:0 0 0 5px rgba(255,201,60,.18); }
.cloud { position:absolute; top:14px; left:14px; width:46px; height:15px; background:#fff; border:1px solid var(--line); border-radius:999px; opacity:.9; }
.cloud::after { content:""; position:absolute; left:10px; top:-7px; width:20px; height:14px; background:#fff; border-radius:50%; }
.soil { position:absolute; left:-4%; right:-4%; bottom:0; height:46px; background:repeating-linear-gradient(0deg, var(--soil) 0 10px, #DECCA1 10px 12px); border-radius:100% 100% 0 0 / 30px 24px 0 0; }
.stage-tag { position:absolute; top:8px; left:10px; font:700 10.5px "Noto Sans SC",sans-serif; color:var(--ink); background:rgba(255,255,255,.88); border:1px solid var(--line); border-radius:999px; padding:3px 10px; z-index:3; }
.plant { position:absolute; z-index:2; transform-origin:bottom center; }
/* 远山（2026-09-20 阿楼要求）：田卡原来是纯色天空，看着空；而且蒲公英的绒球是白的，
   在浅绿背景上几乎看不见 —— 加一道远山当背景，浅色植株就有衬托了。
   山要「远」：低对比、无细节、贴着土壤上沿。 */
/* 2026-09-20 阿楼修正：山**拉高、往下伸进土壤里**，否则山脚与土坡之间会留一道缝（他说是"白色的空缺"）。
   同时 z-index 从 1 降到 0 —— 原来山比土壤层级高，会压在土上；现在靠 DOM 顺序让土壤盖住山脚。 */
.hills { position:absolute; left:0; right:0; bottom:18px; width:100%; height:94px; color:#CFE3D6; z-index:0; }
.weather-rainy .hills { color:#B9CFC2; }
.weather-snowy .hills { color:#DDE6E4; }
.plant::after { content:""; position:absolute; bottom:-4px; left:50%; transform:translateX(-50%); width:22px; height:6px; background:rgba(154,125,77,.28); border-radius:50%; }
.stem { display:block; width:100%; height:100%; transform-origin:bottom center; }
.stem svg { width:100%; height:100%; color:var(--sprout); animation:sway 3.4s ease-in-out infinite; transform-origin:bottom center; }
.stem.d1 svg { animation-delay:-1.2s; } .stem.d3 svg { animation-delay:-2.3s; animation-duration:3.9s; }
@keyframes sway { 0%,100% { transform:rotate(-2.4deg); } 50% { transform:rotate(2.4deg); } }
@media (prefers-reduced-motion:reduce) { .stem svg { animation:none; } }
.grass { position:absolute; width:13px; height:11px; color:var(--sprout); opacity:.5; z-index:2; }
.gold .stem svg { color:var(--gold); }
.crumb { font-size:12px; color:var(--muted); margin-bottom:7px; }
.crumb a { color:var(--muted); text-decoration:none; cursor:pointer; }
.crumb a:hover { color:var(--ink); }
.crumb span { margin:0 7px; }
.crumb b { color:var(--ink); }
.menu-wrap { position:relative; }
.menu-btn { width:34px; height:34px; border-radius:10px; border:1px solid var(--line); background:var(--surface); color:var(--ink); font:900 15px/1 "JetBrains Mono",monospace; cursor:pointer; }
.menu-btn:hover { background:var(--sand); }
.menu-wrap .tools { display:none; position:absolute; top:40px; right:0; z-index:8; flex-direction:column; gap:2px; background:#fff; border:1px solid var(--line); border-radius:12px; box-shadow:0 12px 32px rgba(18,58,43,.16); padding:6px; min-width:128px; }
.menu-wrap.open .tools { display:flex; }
.menu-wrap .tools .btn { border:0; background:transparent; width:100%; justify-content:flex-start; font-weight:500; padding:9px 10px; border-radius:8px; font-size:12.5px; }
.menu-wrap .tools .btn:hover { background:var(--sand); }
.menu-wrap .tools .btn.danger { color:var(--err); }
.bank-groups { display:grid; grid-template-columns:repeat(3,1fr); gap:14px; margin-bottom:18px; }
.group-card { background:var(--surface); border:1px solid var(--line); border-radius:16px; padding:14px; display:flex; flex-direction:column; gap:8px; }
.g-title { font:700 12px "Noto Sans SC",sans-serif; letter-spacing:.08em; color:var(--muted); margin:2px 0 4px 2px; }
.g-action { display:flex; flex-direction:column; align-items:flex-start; gap:3px; border:1px solid var(--line); border-radius:12px; background:#fff; padding:10px 14px; cursor:pointer; text-align:left; font:inherit; transition:border-color .15s ease, background .15s ease; }
.g-action:hover { border-color:var(--sprout); }
.g-action.primary { border-color:var(--wheat); background:#FFFBEF; }
.g-action.primary:hover { background:var(--wheat-soft); }
.g-action b { font-size:13.5px; font-weight:700; color:var(--ink); }
.g-action span { font-size:11px; color:var(--muted); }
@media (max-width:1100px) { .bank-groups { grid-template-columns:1fr; } }
.bar { height:7px; border-radius:999px; background:var(--line); margin-top:11px; overflow:hidden; }
.bar b { display:block; height:100%; border-radius:999px; background-image:repeating-linear-gradient(90deg, var(--sprout) 0 7px, #5DE6AE 7px 12px); }
.foot { display:flex; align-items:center; justify-content:space-between; margin-top:11px; }
.foot .harvest { font-size:10.5px; color:var(--muted); display:flex; align-items:baseline; gap:4px; }
.foot .harvest b { font:700 14px "JetBrains Mono",monospace; color:var(--sprout); }
.foot .pct { font:700 19px "JetBrains Mono",monospace; }
.go { display:inline-flex; align-items:center; gap:6px; border:2px solid var(--ink); border-radius:999px; background:#fff; color:var(--ink); font-weight:700; font-size:12px; padding:7px 14px; cursor:pointer; }

/* ===== 田卡比例与操作菜单（2026-09-17 阿楼反馈） ===== */
/* 田卡比例：只留一份（此前这里和下面"阿楼反馈修正"各写一套、互相覆盖，
   2026-09-18 清理合并 —— 生效的一直是下面那一套）。 */
.bank-card { padding:15px 16px 14px; }
.nmrow .nm { font-size:14.5px; }
.nmrow .idx { font-size:11px; }
.nmrow .cnt { font-size:11px; margin-right:30px; }
.bank-card .desc { font-size:11px; }
.foot .pct { font-size:19px; }
.foot .harvest { font-size:10.5px; }
.menu-btn { position:absolute; top:13px; right:14px; width:28px; height:28px; border-radius:8px; border:0; background:transparent; color:var(--muted); font:900 15px/1 "JetBrains Mono",monospace; cursor:pointer; z-index:6; }
.menu-btn:hover { background:var(--sand); color:var(--ink); }
.bank-card .tools { display:none; position:absolute; top:46px; right:14px; z-index:7; flex-direction:column; gap:2px; background:#fff; border:1px solid var(--line); border-radius:12px; box-shadow:0 12px 32px rgba(18,58,43,.16); padding:6px; min-width:96px; }
.bank-card.menu-open .tools { display:flex; }
.bank-card .tools .btn { border:0; background:transparent; width:100%; justify-content:flex-start; padding:8px 10px; border-radius:8px; font-size:12.5px; }
.bank-card .tools .btn:hover { background:var(--sand); }
.bank-card .tools .btn.danger { color:var(--err); }
.bank-card .tools .btn.danger:hover { background:#FBEAE9; }

/* 原生控件美化：select / 勾选 */
select { appearance:none; -webkit-appearance:none; background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='8' fill='none' stroke='%2377755F' stroke-width='2' stroke-linecap='round'%3E%3Cpath d='M1 1.5 6 6.5l5-5'/%3E%3C/svg%3E"); background-repeat:no-repeat; background-position:right 14px center; padding-right:38px; }
input[type="checkbox"], input[type="radio"] { accent-color:var(--sprout); width:16px; height:16px; cursor:pointer; }

/* ===== 2026-09-17 阿楼反馈修正 ===== */
/* 灌溉条 = 数据统计主角：加高、数字放大 */
.irrig-bar { padding:16px 6px; gap:34px; }
.irrig-bar .it { font-size:12.5px; }
.irrig-bar .it b { font-size:23px; }
.irrig-bar .more { font-size:12.5px; }
/* 上传/表单卡片与分段控件（TDesign 结构 · 本项目配色） */
.mode-cards { display:grid; grid-template-columns:1fr 1fr; gap:10px; }
.mode-card { display:block; border:1px solid var(--line); border-radius:12px; padding:12px 14px; cursor:pointer; transition:border-color .15s ease, background .15s ease; }
.mode-card input { margin-right:8px; vertical-align:-2px; }
.mode-card b { display:block; font-size:13.5px; font-weight:700; color:var(--ink); margin-top:6px; }
.mode-card span { font-size:11.5px; color:var(--muted); }
.mode-card.on { border-color:var(--sprout); background:rgba(31,167,92,.06); box-shadow:0 0 0 1px var(--sprout); }
.seg { display:grid; grid-auto-flow:column; grid-auto-columns:1fr; gap:6px; }
.seg .seg-item { border:1px solid var(--line); border-radius:10px; background:#fff; color:var(--ink-2); font-weight:700; font-size:13px; padding:10px 0; text-align:center; cursor:pointer; }
.seg .seg-item.on { border-color:var(--sprout); color:var(--sprout); background:rgba(31,167,92,.07); }
.modal .field textarea { height:140px; min-height:140px; max-height:140px; }
.ai-src { display:flex; gap:8px; }
.ai-src .src-btn { flex:1; border:1px dashed var(--dash); border-radius:10px; background:var(--sand); color:var(--ink-2); font:500 12.5px "Noto Sans SC",sans-serif; padding:10px 0; text-align:center; cursor:pointer; }
.ai-src .src-btn:hover { border-color:var(--sprout); color:var(--ink); }
.type-chips { display:grid; grid-template-columns:repeat(4,1fr); gap:8px; }
.type-chip { border:1px solid var(--line); border-radius:10px; background:#fff; color:var(--ink-2); font-weight:500; font-size:13px; padding:9px 0; text-align:center; cursor:pointer; }
.type-chip.on { border-color:var(--sprout); color:var(--sprout); background:rgba(31,167,92,.07); font-weight:700; }

/* ===== 2026-09-17 全站表单/控件重构（anti-slop 细节层） ===== */
.bank-list { grid-template-columns:repeat(3,1fr); }
@media (max-width:1100px) { .bank-list { grid-template-columns:repeat(2,1fr); } }
@media (max-width:700px) { .bank-list { grid-template-columns:1fr; } }
.field label { display:block; font-size:12.5px; font-weight:700; color:var(--ink); margin:0 0 6px 2px; }
.field input, .field textarea, .field select {
  width:100%; min-height:44px; padding:10px 14px; font:inherit; color:var(--ink);
  background:#fff; border:1px solid var(--line); border-radius:10px;
  transition:border-color .15s ease, box-shadow .15s ease;
}
.field input::placeholder, .field textarea::placeholder { color:#C4BFA9; }
.field input:focus, .field textarea:focus, .field select:focus {
  outline:none; border-color:var(--sprout); box-shadow:0 0 0 3px rgba(31,167,92,.14);
}
.field textarea { min-height:96px; resize:vertical; line-height:1.7; }
.inline-form { gap:8px; }
.inline-form .btn.ghost { background:#fff; }
.form-grid { display:grid; gap:14px; }
.login-card { max-width:420px; margin:7vh auto 0; border-radius:18px; }
.login-card .panel-head { justify-content:center; padding:20px 22px 0; border-bottom:0; }
.login-card .panel-head h2 { font-size:20px; font-weight:900; letter-spacing:-0.01em; }
.login-card .panel-body { padding:18px 26px 26px; }
.login-card .btn { width:100%; justify-content:center; }
.login-card .form-grid .btn.ghost { background:#fff; }
.panel { border-radius:16px; box-shadow:0 6px 24px rgba(18,58,43,.05); }
.panel-head { padding:16px 22px; }
.panel-head h2 { font-size:17px; font-weight:900; letter-spacing:-0.01em; }
.panel-body { padding:20px 22px; }
.modal { border-radius:18px; border:1px solid var(--line); }
.modal h2 { font-size:19px; font-weight:900; letter-spacing:-0.01em; }
.modal .field label { margin-top:10px; }
.topbar h1 { font-size:26px; font-weight:900; letter-spacing:-0.02em; }
.stat { border-radius:14px; }
.stat b { color:var(--ink); }
.chip { background:var(--surface); border-color:var(--line); color:var(--muted); border-radius:999px; }
.chip:hover { color:var(--ink); }
.chip.active { background:var(--wheat); border-color:var(--wheat); color:var(--ink); }
.dropzone:hover, .dropzone.dragging { background:var(--sand); }
.dropzone.has-file { background:var(--sand); }
.ann-banner { border-radius:12px; }
.growth { display:none; }
.table, table { border-collapse:collapse; }
th { font-size:12.5px; font-weight:700; color:var(--muted); background:var(--sand); }
td { border-color:var(--line); }

/* =====================================================================
   2026-09-18 子页面统一层
   上一批只把 .btn/.panel 的**颜色**覆盖了，子页面的**结构**仍是旧体系
   （.panel 套 .panel-body、.tag、.question-card），所以看着跟首页不像。
   这一层给所有子页面提供与首页同源的组件词汇：
     .card/.card-head/.card-body  容器（取代 .panel 堆叠）
     .idx/.mono                   等宽数字（题号/进度/计时/积分/分数）
     .icon-btn                    图标按钮 + title 悬停提示
     .grown-row                   带 .bar 条纹进度的数据行
   ===================================================================== */

/* 等宽数字：此前 app.js 已经在用 class="tag mono"/"muted mono"，但 CSS 里没有 .mono */
.mono, code, .num { font-family:"JetBrains Mono","SFMono-Regular",Consolas,monospace; font-variant-numeric:tabular-nums; }

/* 通用序号（对齐首页田卡的 .nmrow .idx） */
.idx { font:700 11px "JetBrains Mono",monospace; color:#C4BFA9; letter-spacing:.02em; }

/* 卡片：白底 + 1px 边线分层，不用阴影堆叠（定稿禁止「卡片套卡片」） */
.card { background:var(--surface); border:1px solid var(--line); border-radius:16px; margin-bottom:14px; }
.card-head { display:flex; align-items:center; justify-content:space-between; gap:14px; padding:15px 18px; border-bottom:1px dashed var(--dash); }
.card-head h2 { font-size:15px; font-weight:900; letter-spacing:-0.01em; }
.card-head .page-sub { margin-top:0; }
.card-body { padding:16px 18px; }
.card-body > * + * { margin-top:14px; }

/* 数据条：首页 .irrig-bar 的同源版，用于统计类页面顶部 */
.data-bar { display:flex; align-items:center; gap:26px; flex-wrap:wrap; border-top:2px dashed var(--dash); border-bottom:2px dashed var(--dash); padding:13px 4px; margin-bottom:16px; }
.data-bar .it { display:flex; align-items:baseline; gap:6px; font-size:12px; color:var(--muted); }
.data-bar .it b { font:700 24px "JetBrains Mono",monospace; color:var(--ink); line-height:1.05; }
.data-bar .it.hi b { color:var(--sprout); }
.data-bar .it.warn b { color:var(--gold); }

/* 数据行：左侧等宽序号 + 名称，右侧等宽数值，下方 .bar 条纹进度 */
.grown-row { display:block; }
.grown-row .row-head { display:flex; align-items:baseline; gap:9px; }
.grown-row .row-head .nm { font-size:14px; font-weight:700; }
.grown-row .row-head .val { margin-left:auto; font:700 12px "JetBrains Mono",monospace; color:var(--muted); }
.grown-row .row-head .pct { font:700 14px "JetBrains Mono",monospace; color:var(--ink); min-width:46px; text-align:right; }
.grown-row .bar { margin-top:9px; }

/* 图标按钮：纯图标 + 悬停显示 title，用于列表行的操作 */
.icon-btn { display:inline-flex; align-items:center; justify-content:center; width:32px; height:32px; border-radius:9px; border:1px solid var(--line); background:var(--surface); color:var(--muted); cursor:pointer; transition:color .14s ease, border-color .14s ease, background .14s ease; }
.icon-btn:hover { color:var(--ink); border-color:var(--muted); background:var(--sand); }
.icon-btn.danger:hover { color:var(--err); border-color:var(--err); }
.icon-btn svg { width:16px; height:16px; }
.row-actions { display:flex; gap:6px; align-items:center; }

/* 空状态统一 */
.card .empty { padding:34px 18px; }

/* ── 题库页动作区（2026-09-18：11 个动作合并成 4 个入口）──────────────── */
.bank-actions { display:flex; align-items:center; gap:10px; margin:-8px 0 18px; flex-wrap:wrap; }
.menu-toggle { display:inline-flex; align-items:center; gap:7px; min-height:38px; padding:0 14px; border-radius:999px;
  border:1px solid var(--line); background:var(--surface); color:var(--ink); font:600 13.5px "Noto Sans SC",sans-serif; cursor:pointer;
  transition:border-color .14s ease, background .14s ease; }
.menu-toggle:hover { border-color:var(--sprout); background:var(--ok-soft); }
.menu-toggle svg { width:16px; height:16px; color:var(--sprout); }
.menu-toggle svg:last-child { width:13px; height:13px; color:var(--muted); }
.bank-actions .menu-wrap.open .menu-toggle { border-color:var(--sprout); background:var(--ok-soft); }
.bank-more { margin-left:auto; }
/* 下拉里的按钮是两行（标题 + 说明），跟顶栏的胶囊按钮不是一种东西 */
.bank-actions .menu-wrap .tools { top:44px; min-width:206px; }
.bank-actions .menu-wrap .tools .btn { display:flex; flex-direction:column; align-items:flex-start; gap:2px; }
.bank-actions .menu-wrap .tools .btn span { font-size:11px; color:var(--muted); font-weight:400; }
.bank-actions .menu-wrap .tools .btn.danger span { color:inherit; }

/* ── 题库题目：标题行（校对弱入口 + 搜索）＋ 题目行 ───────────────── */
.q-tools { margin-left:auto; display:flex; align-items:center; gap:10px; }
.q-tools .btn svg { width:14px; height:14px; }
.q-search { display:inline-flex; align-items:center; gap:7px; height:32px; padding:0 12px; border-radius:999px;
  border:1px solid var(--line); background:var(--surface); color:var(--muted); }
.q-search:focus-within { border-color:var(--sprout); }
.q-search input { border:0; outline:0; background:transparent; font:inherit; font-size:13px; color:var(--ink); width:190px; }
.q-search input::placeholder { color:#C4BFA9; }

.q-row { padding:14px 0; border-bottom:1px dashed var(--dash); }
.q-row:last-child { border-bottom:0; padding-bottom:0; }
.q-row-head { display:flex; align-items:center; gap:9px; }
.q-type { font-size:11px; color:var(--muted); border:1px solid var(--line); border-radius:999px; padding:2px 9px; }
.q-badge { font-size:11px; color:var(--gold); }
.q-answer { margin-left:auto; font-size:12px; color:var(--muted); }
.q-row-head .row-actions { margin-left:12px; }
.q-stem { margin:9px 0 0; font-size:14.5px; line-height:1.6; }
.q-opts { display:flex; flex-wrap:wrap; gap:6px 14px; margin-top:8px; }
.q-opts span { font-size:12.5px; color:var(--muted); }
.q-opts b { font-family:"JetBrains Mono",monospace; font-weight:700; color:var(--ink); margin-right:5px; }

/* ── 刷题 / 考试的单题大卡 ──────────────────────────────────────── */
.q-card { background:var(--surface); border:1px solid var(--line); border-radius:16px; padding:26px 28px; }
.q-card-head { display:flex; align-items:center; gap:9px; }
.q-stem-lg { margin:13px 0 2px; font-size:17px; font-weight:700; line-height:1.65; }
.q-hint { display:flex; align-items:center; gap:7px; margin-top:20px; font-size:12px; color:var(--muted); }
/* 2026-09-20：提示文字包进 #hintText（判分后要清空），图标不再是的 .q-hint 直接子元素 */
.q-hint #hintText { display:flex; align-items:center; gap:7px; }
.q-hint svg { width:14px; height:14px; color:var(--sprout); flex:0 0 auto; }
/* 刷题判分后的解析区：答对浅绿 / 答错浅红（阿楼 2026-09-20 定的语义） */
.q-analysis { margin-top:16px; padding:13px 15px; border-radius:var(--radius); border:1px solid var(--line); background:var(--surface); }
.q-analysis.ok { background:var(--ok-bg); border-color:#bfe3ce; }
.q-analysis.no { background:var(--err-bg); border-color:#f0c9c9; }
.qa-head { display:flex; align-items:center; gap:6px; font-size:13px; font-weight:700; }
.q-analysis.ok .qa-head { color:var(--success); }
.q-analysis.no .qa-head { color:var(--danger); }
.qa-head svg { width:14px; height:14px; flex:0 0 auto; }
.qa-body { margin-top:9px; font-size:14px; line-height:1.75; color:var(--ink-2); white-space:pre-wrap; }
.qa-empty { color:var(--muted); }
/* 判分后锁定选项，防止重复提交 */
.option.locked { pointer-events:none; }

/* 作物插画（2026-09-20）：后台「作物」页配了插画就用 PNG，没配才回落到内置 SVG。
   img 与 svg 共用同一套尺寸 / 摇摆动画 / 天气滤镜，所以在这里补一份等效规则，
   不去改动上面那些既有选择器。 */
.stem img { display:block; width:100%; height:100%; object-fit:contain; color:var(--sprout);
            animation:sway 3.4s ease-in-out infinite; transform-origin:bottom center; }
.stem.d1 img { animation-delay:-1.2s; }
.stem.d3 img { animation-delay:-2.3s; animation-duration:3.9s; }
.gold .stem img { color:var(--gold); }
.weather-rainy .plant img { filter:saturate(.8); }
.weather-snowy .plant img { filter:saturate(.35); opacity:.85; }
@media (prefers-reduced-motion:reduce) { .stem img { animation:none; } }

/* 收获结算卡（2026-09-20）：原来收完只弹一条 toast 就立刻刷新，
   用户看到的是「屏幕闪一下」（阿楼反馈「有点突然」）。现在先给一张结算卡。 */
.harvest-result { text-align:center; }
.harvest-result h2 { margin-bottom:4px; }
.harvest-crop { display:block; width:104px; height:134px; object-fit:contain; margin:6px auto 2px; }
.harvest-line { font-size:15px; color:var(--ink-2); }
.harvest-line b { font:700 24px "JetBrains Mono", monospace; color:var(--green); vertical-align:-2px; }
.harvest-line b:first-child { font-size:16px; }
/* 种子盲盒结算块（2026-09-20 · BAN-15）。重复种子用灰调 —— 不是坏事，但别跟新图鉴一样张扬 */
.seed-box { margin:14px auto 0; padding:14px 18px; max-width:340px; border-radius:14px;
  background:var(--wheat-soft); border:1px dashed var(--wheat, #FFC93C); }
.seed-box.dup { background:var(--surface); border-color:var(--line); }
.seed-box .seed-tag { font:700 11px "JetBrains Mono", monospace; letter-spacing:.14em; color:var(--muted); }
.seed-box .seed-name { font-size:24px; font-weight:900; margin:2px 0 4px; }

/* 选项：旧层的 .option 还挂着旧墨绿 --green（主题层没覆盖到），这里统一成芽绿 */
.option { border-radius:12px; padding:13px 15px; margin-top:10px; font-size:14.5px; }
.option:hover { border-color:var(--sprout); background:var(--ok-soft); }
.option.selected, .option.correct { border-color:var(--sprout); background:var(--ok-bg); }
.option.wrong { border-color:var(--err); background:var(--err-bg); }
.option .letter { background:var(--sand); color:var(--ink); font-family:"JetBrains Mono",monospace; }
.option.selected .letter, .option.correct .letter { background:var(--sprout); color:#fff; }
.option.wrong .letter { background:var(--err); color:#fff; }

/* 考试：剩余时间做成大号等宽数字，交卷按钮用强调色（此前被 .btn 的麦黄盖掉，语义色丢失） */
.btn.amber, .btn.submit { background:#0B4A32; color:#FFF8E4; }
.btn.amber:hover, .btn.submit:hover { background:#123A2B; color:#FFF8E4; }
.exam-side { display:flex; align-items:center; gap:14px; }
.exam-timer { font:700 26px "JetBrains Mono",monospace; color:var(--ink); letter-spacing:-0.01em; }

/* 题目行上的小标签 */
.q-times { font-size:11.5px; color:var(--gold); font-weight:700; }
.q-src { font-size:11.5px; color:#C4BFA9; }
.q-conf { margin-left:auto; font-size:11.5px; color:#C4BFA9; }
.q-analysis { margin:8px 0 0; font-size:13px; color:var(--muted); line-height:1.65;
  border-left:2px solid var(--dash); padding-left:10px; }
.q-mark { display:inline-flex; align-items:center; gap:4px; font-size:11.5px; font-weight:700;
  border-radius:999px; padding:2px 9px; }
.q-mark svg { width:13px; height:13px; }
.q-mark.ok { color:var(--ok); background:var(--ok-bg); }
.q-mark.no { color:var(--err); background:var(--err-bg); }
.q-result-list .q-row:first-child { padding-top:0; }

/* 校对页：批量操作条（勾选/已选/批量/确认导入 收成一条） */
.review-bar { display:flex; align-items:center; gap:14px; flex-wrap:wrap;
  border-top:2px dashed var(--dash); border-bottom:2px dashed var(--dash);
  padding:11px 4px; margin:4px 0 16px; }
.review-bar .rv-all { display:inline-flex; align-items:center; gap:6px; font-size:13px; color:var(--muted); cursor:pointer; }
.review-bar .sel-count { font-size:12px; color:var(--muted); font-family:"JetBrains Mono",monospace; }
.review-bar .btn svg { width:14px; height:14px; }

/* 校对页：两个分组的组头（BAN-65 / 规格 4.1）
   「需要你修改和决策的」在前、视觉上更重；「AI 已核验的」在后、更轻。 */
.review-group-head { display:flex; align-items:baseline; gap:8px; margin:6px 0 0; padding-top:10px;
  border-top:2px dashed var(--dash); }
.review-group-head b { font-size:14px; }
.review-group-count { font-size:12px; color:var(--muted); font-family:"JetBrains Mono",monospace; }
.review-group-hint { margin:2px 0 0; font-size:12px; color:var(--muted); line-height:1.6; }
.review-list > .review-group-head:first-child { border-top:0; padding-top:0; }

/* 校对列表里的草稿行：可勾选、可点开看原文 */
.draft-row { cursor:pointer; border-radius:12px; padding:14px 12px; margin:0 -12px; transition:background .14s ease; }
.draft-row:hover { background:#FCFBF7; }
.draft-row.selected { background:var(--ok-bg); }
.draft-row.review-low .q-stem { color:var(--ink); }
.draft-row .q-row-head { flex-wrap:wrap; }

/* 我的考试：一场一行（序号 + 标题信息 + 交卷进度 + 动作） */
.quiz-row { display:flex; align-items:center; gap:14px; padding:15px 0; border-bottom:1px dashed var(--dash); }
.quiz-row:last-child { border-bottom:0; padding-bottom:0; }
.quiz-main { min-width:0; }
.quiz-title { font-size:14.5px; font-weight:700; display:flex; align-items:center; gap:8px; }
.quiz-meta { margin-top:3px; font-size:12px; color:var(--muted); }
.quiz-count { margin-left:auto; text-align:right; }
.quiz-count b { display:block; font:700 20px "JetBrains Mono",monospace; color:var(--ink); line-height:1.1; }
.quiz-count span { font-size:11px; color:var(--muted); }

/* ===== 田景：天气三态 + 待浇水滴 + 浇水弹窗（2026-09-18 补齐定稿缺口）=====
   规则来自 docs/设计定稿-2026-09-17.md §四：
   颜色只落在庄稼、土、太阳上；天气只减产，不锁功能；数值不因浇水变化。 */

/* 待浇水滴徽标：浅蓝功能色，不占品牌色板 */
.drop-badge { display:inline-flex; align-items:center; gap:4px; height:22px; padding:0 8px;
  border:1px solid var(--line); border-radius:999px; background:var(--surface);
  color:#5FA8D3; font:700 11px "JetBrains Mono",monospace; cursor:pointer; transition:border-color .14s ease; }
.drop-badge:hover { border-color:#A5D8F5; background:#F3FAFE; }
.drop-badge svg { width:13px; height:13px; }
.bank-card .nmrow .cnt { margin-left:8px; }

/* 天气三态：**逐条照 design-previews/应用首页-最终版-2026-09-17.html:82-91 移植**。
   2026-09-18 说明：我第一版是自己另画的（灰雨云 + 静态斜线 + 「艳阳/阴雨」文字标签），
   跟阿楼验收过的稿子不是一回事，已按稿子重做。别再凭印象画。*/

/* 右上角天气图标（稿子用的是图标，不是文字标签） */
.rain-ic, .snow-ic { position:absolute; top:9px; right:11px; width:26px; height:24px; display:none; z-index:4; }
/* 下雨和下雪都把太阳收起来 */
.weather-rainy .sun, .weather-snowy .sun { display:none; }
.weather-rainy .rain-ic { display:block; }
.weather-snowy .snow-ic { display:block; }

/* 阴雨：云变灰、植株轻微降饱和（稿子给的是 .8，不是更狠的值） */
.weather-rainy .cloud { background:#C9CFC4; opacity:.95; }
.weather-rainy .cloud::after { background:#C9CFC4; }
.weather-rainy .plant svg { filter:saturate(.8); }

/* 休眠：植株褪色 + 土坡雪盖（雪盖挂在 .soil 上，不是另做一条浮空白带） */
.weather-snowy .plant svg { filter:saturate(.35); opacity:.85; }
.weather-snowy .soil::after { content:""; position:absolute; top:-7px; left:-4%; right:-4%; height:13px;
  background:#fff; border-radius:50%; box-shadow:0 2px 0 rgba(199,209,214,.7); }

/* 会落的雨丝（10 根）与雪花（12 颗）：位置与延迟由 JS 随机撒，见 fieldCard 的 sprinkle */
.rain { position:absolute; top:-8px; width:2px; height:11px; background:rgba(122,167,205,.6);
  animation:fall .95s linear infinite; z-index:3; }
.snow { position:absolute; top:-8px; width:5px; height:5px; border-radius:50%; background:#fff;
  box-shadow:0 0 0 1px rgba(200,212,220,.5); animation:fall 2.8s linear infinite; z-index:3; }
@keyframes fall { to { transform:translateY(132px); } }
@media (prefers-reduced-motion:reduce) { .rain, .snow { animation:none; opacity:0; } }

/* 浇水弹窗 */
.water-drops { display:flex; align-items:baseline; gap:6px; color:#5FA8D3; }
.water-drops svg { width:20px; height:20px; align-self:center; }
.water-drops b { font:700 30px "JetBrains Mono",monospace; color:var(--ink); }
.water-drops span { font-size:12px; color:var(--muted); }
.water-stage { position:relative; height:150px; border:1px solid var(--line); border-radius:14px;
  background:#FCFBF7; overflow:hidden; display:grid; place-items:center; }
/* 浇水按钮（2026-09-20 照 design-previews/田卡浇水概念-2026-09-17.html 重做）：
   实心浅蓝 + 3px 深色描边，里面的水滴用不对称圆角画（不用图标）。
   原来是细边框浅色按钮，看着软塌塌的 —— 阿楼说"真的太怪了"。 */
.water-btn { width:92px; height:92px; border-radius:50%; border:3px solid var(--ink); background:#A5D8F5;
  display:grid; place-items:center; cursor:pointer; transition:transform .14s ease; }
.water-btn:hover { transform:scale(1.06); }
.water-btn:active { transform:scale(.94); }
.water-btn i { width:26px; height:34px; background:#fff; border-radius:50% 50% 50% 50% / 62% 62% 38% 38%; }
/* 落下的水滴。⚠️ **keyframes 名字不能叫 `fall`** —— 那个名字已经被雨雪粒子占用
   （而且是 infinite 无限循环），同名会互相覆盖。这也是原来"浇水看不到水滴"的坑之一。 */
.rdrop { position:absolute; top:-22px; width:10px; height:14px; background:#A5D8F5;
  border-radius:50% 50% 50% 50% / 62% 62% 38% 38%; z-index:4; animation:waterdrop .75s ease-in forwards; }
@keyframes waterdrop { 0% { transform:translateY(0); opacity:0; } 12% { opacity:1; } 100% { transform:translateY(150px); opacity:.9; } }

/* 答题节奏开关（2026-09-20）：阿楼要的是**有切换动作的开关**，不是普通按钮。
   语义：开 = 快速连答（答完不停顿）；关 = 看解析（答完停一下看完再走）。 */
.switch { display:inline-flex; align-items:center; gap:8px; background:none; border:0; padding:4px 2px;
  font:inherit; cursor:pointer; color:var(--muted); }
.switch .sw-label { font-size:12.5px; }
.switch.on .sw-label { color:var(--ink); font-weight:700; }
.sw-track { position:relative; width:38px; height:21px; border-radius:999px; background:#D8E2DA; transition:background .22s ease; }
.switch.on .sw-track { background:var(--green); }
.sw-knob { position:absolute; top:2px; left:2px; width:17px; height:17px; border-radius:50%; background:#fff;
  box-shadow:0 1px 3px rgba(0,0,0,.18); transition:transform .22s cubic-bezier(.4,0,.2,1); }
.switch.on .sw-knob { transform:translateX(17px); }

/* 浇水：水滴从弹窗按钮**飞进田卡**（2026-09-20 阿楼要的效果）。
   此前做成了"水滴在弹窗里往下掉"，方向不对 —— 要的是飞出弹窗、落到自己那块田上。 */
.fly-layer { position:fixed; inset:0; pointer-events:none; z-index:70; }
.fly-drop { position:fixed; width:10px; height:14px; background:#A5D8F5;
  border-radius:50% 50% 50% 50% / 62% 62% 38% 38%;
  transition:transform .85s cubic-bezier(.42,.06,.68,.99), opacity .85s ease; }
/* 浇过水的土：颜色变深、饱和度略高 */
.field-scene.wet .soil { filter:brightness(.86) saturate(1.25); transition:filter .55s ease; }
.soil-wet-layer { position:absolute; left:0; right:0; bottom:0; height:0; transition:height .5s ease;
  background:repeating-linear-gradient(0deg, var(--soil-wet) 0 9px, #BFAA79 9px 11px); }
.soil-wet-layer.on { height:38px; }
.water-stage.pouring .water-btn { animation:pour .6s ease; }
@keyframes pour { 0%,100% { transform:translateY(0) } 50% { transform:translateY(-9px) scale(1.04) } }

/* 刷完一轮的收尾卡 */
.finish-card { max-width:520px; margin:8vh auto 0; text-align:center; }
.finish-mark { width:58px; height:58px; margin:0 auto 14px; border-radius:50%;
  background:var(--ok-bg); color:var(--sprout); display:grid; place-items:center; }
.finish-card h2 { font-size:20px; font-weight:900; }

/* ────────────────────────────────────────────────────────────────
   移动端点按目标（2026-09-20 · BAN-16 诊断）
   实测手机上这些可点元素小于 44px（iOS 人机界面指南的可点最小值），手指容易点错：
   `.uout` 23×28、`.drop-badge` 46×22、`.icon-btn` 32×32、`.side-link` 105×43（差 1px）。

   ⚠️ **必须放在文件末尾**，不能塞进上面那个 760px 媒体块 —— 那里在文件靠前处，
   而同优先级的 `.uout { padding:4px }` 等定义在后面，**后写的赢**，
   实测过：塞在前面完全不生效。

   只放宽点按热区（min-width/min-height），不动视觉尺寸，避免把版面撑开。
   **正文里的行内链接不在此列** —— 句子中间的链接硬撑到 44px 会把行高搞乱，
   那条 44px 规则针对的是独立控件，不是行内文字。
   ──────────────────────────────────────────────────────────────── */
@media (max-width:760px) {
  .uout { min-width:44px; min-height:44px; }
  .drop-badge { min-height:44px; }
  .icon-btn { min-width:44px; min-height:44px; }
  .side-link { padding:11px 10px; }
}
@media (max-width:760px) {
  /* 田卡上的小控件：实测 `.menu-btn` 28×28、`.drop-badge` 41×44、`.go` 71×39、
     `.more` 65×22 —— 手指点不准。只放宽热区，不改视觉尺寸：
     `.menu-btn` 是绝对定位的 ⋯，往外扩不影响排版；其余用 min-height 抬高。 */
  .menu-btn { width:44px; height:44px; top:6px; right:7px; }
  .drop-badge { min-width:44px; height:44px; }
  .go { min-height:44px; }
  .more { display:inline-block; min-height:44px; padding:11px 0; }
}
@media (max-width:760px) {
  /* 灌溉条（连续灌溉 + 今日水滴 + 迷你日历）**手机上隐藏**。
     两个理由：① 这三个数字在主内容顶部已经有一份一模一样的（`app.js:436-438`），
     侧栏这份是重复的，而完整热力图在「学习统计」页；② 它是**竖排结构**，
     塞进横条后被压成 90×192，`align-items:center` 之下把整条导航撑到 226px 高，
     上面一大片空白（实测）。隐藏它，导航条回到 ~75px。 */
  .side-irrig { display:none; }
}

/* ── 解析三级阶梯（2026-09-22，BAN-18）─────────────────────────────
   级别标记 / 切回低级别 / 升级入口。放在文件末尾是有意的：
   .q-analysis 有两条既有规则（答题页一条、结果页一条），
   这里只加**新**类名，不去改它们，免得两处布局互相牵连。 */
.qa-level { margin-left:7px; padding:1px 8px; border-radius:999px;
  font-size:11px; font-weight:700; border:1px solid currentColor; opacity:.9; }
.qa-level-ai { color:#2f6fb0; }          /* AI 生成解析：蓝 */
.qa-level-feynman { color:#8a5cc4; }     /* 费曼讲解：紫 */
.qa-switch { margin-left:8px; padding:0; border:0; background:none; cursor:pointer;
  font-size:11.5px; color:var(--muted); text-decoration:underline; }
.qa-switch:hover { color:var(--ink-2); }
.qa-actions { margin-top:10px; }
.qa-upgrade { font-size:12.5px; padding:5px 13px; }
.qa-tier { margin-top:10px; padding-top:10px; border-top:1px dashed var(--line); }

/* ── 材料体检 report（2026-09-22，BAN-52 · 功能 1.2）───────────────
   上传后先给结论（有什么 / 缺什么 / 可出题量），用户点「开始处理」才解析。
   2026-09-22 阿楼验收：「有点丑，字太多了」→ 三项结论改成**三个数字块**，
   开场白压成按钮下一行小字，归因只在真有问题时出现（详见 BAN-52 卡）。 */
.inspect-badge { margin-left:10px; padding:3px 10px; border-radius:999px; vertical-align:middle;
  background:var(--sand); border:1px solid var(--line); color:var(--muted);
  font-size:11.5px; font-weight:700; letter-spacing:0; }
.inspect-stats { display:grid; grid-template-columns:repeat(3,1fr); gap:10px; margin:16px 0 12px; }
.inspect-stat { padding:11px 12px; border:1px solid var(--line); border-radius:var(--radius);
  background:var(--surface); display:flex; flex-direction:column; gap:4px; }
.inspect-k2 { font-size:11.5px; color:var(--muted); }
/* 数字一律等宽（设计规范 §2.1：题数/进度/积分都用 JetBrains Mono） */
.inspect-stat b { font:900 20px/1.2 "JetBrains Mono",monospace; font-variant-numeric:tabular-nums;
  color:var(--ink); }
.inspect-stat b i { font-size:11.5px; font-weight:500; font-style:normal; color:var(--muted); margin-left:2px; }
.inspect-sub { font-size:11.5px; color:var(--muted); line-height:1.5; }
.inspect-stat.ok b { color:var(--sprout); }
.inspect-stat.warn b { color:var(--gold); }
.inspect-callout { margin:0 0 10px; padding:9px 12px; border-left:3px solid var(--wheat);
  border-radius:0 8px 8px 0; background:var(--sand);
  font-size:12.5px; color:var(--ink-2); line-height:1.6; }
.inspect-note { margin:0 0 12px; font-size:11.5px; color:var(--muted); }
.inspect-actions { margin-top:2px; }
.inspect-foot { margin:9px 0 0; font-size:11.5px; color:var(--muted); }
/* 样本授权勾选框（2026-09-23，BAN-84 · 规格 8.1）。
   刻意做得**轻**：它是一句征询，不该跟「开始处理」抢注意力（默认也不勾）。
   但点击区域要够大（整行可点）——这是要用户「主动做一件事」的地方，
   逼他去点那个小方块不合适。 */
.inspect-consent { display:flex; gap:8px; align-items:flex-start; margin:0 0 10px;
  padding:9px 12px; border:1px solid var(--line); border-radius:8px;
  font-size:12.5px; cursor:pointer; background:var(--sand, #faf7f1); }
.inspect-consent input { margin:2px 0 0; flex:0 0 auto; cursor:pointer; }
.inspect-consent .muted { display:block; margin-top:2px; font-size:11.5px; }
@media (max-width:560px) { .inspect-stats { grid-template-columns:1fr; } }

/* ── topbar 右侧按钮被压成竖排（2026-09-22 阿楼验收 BAN-64 时反馈）──────────
   「『返回题库』那几个字都已经竖起来了」。
   成因：`.topbar` 是 `nowrap` 的 flex + `space-between`，左侧那坨说明文字
   （校对页的副标题最长：「AI 处理过的题都会先停在这里，分两组：需要你改的 +
   AI 已核验的。确认一次，两类一起入库。」）把宽度吃满后，右侧按钮按
   flex-shrink:1 被压到 min-content —— 中文可在**任意字间断行**，于是七个字
   一行一个，竖起来了。
   纪律：**topbar 右侧块不参与收缩，按钮文字永不换行**；要挤就挤左侧文字
   （`min-width:0` 允许它正常折行），别动按钮。 */
.topbar > *:first-child { min-width:0; }
.topbar > * + * { flex:0 0 auto; }
.topbar .btn { white-space:nowrap; }

/* ── 生长配语（BAN-115）：每档一句陪伴语 / 自然小知识 ──────────────────────
   文案在库里（`crop_stages.science`，后台可改），前端只负责显示 ——
   阿楼 2026-09-20 定的「陪伴落在这里，而不是只有一根进度条」。
   视觉上跟 `.inspect-callout` 同一套语言（wheat 左边线 + sand 底），但更轻：
   它是一句陪伴，不是一条提示，不该抢田景的注意力。 */
.bank-card .companion { margin:8px 0 0; padding:4px 9px; border-left:2px solid var(--wheat);
  border-radius:0 7px 7px 0; background:var(--sand);
  font-size:11.5px; color:var(--ink-2); line-height:1.6; }
/* 收获结算卡里的那一句：居中、无左边线（那一屏本来就只有一件事） */
.harvest-result .companion { margin:10px auto 0; max-width:288px; padding:6px 12px;
  border-left:0; border-radius:8px; text-align:center; font-size:12.5px; }

/* =====================================================================
   旧色板收口（2026-09-26 · 卡 BAN-131 · docs/设计规范.md §七.1）
   ---------------------------------------------------------------------
   §七.1 记的事：`--cream` / `--wheat-deep` / `--green` / `--green-2` 这几个
   **旧莫兰迪变量**没被上面的明媚版覆盖，于是若干处组件**至今渲染的是旧色**
   （旧米黄底、旧深棕字、旧灰绿）。阿楼 2026-09-25 回「**按你的建议办**」= 统一到明媚版。

   映射（与 §七.1 的建议一字一致）：
     --cream      → --sand        底色：旧米黄 #f3e7cd → 明媚沙色 #F7F5EC
     --wheat-deep → --wheat-ink   字色：旧深棕 #a5711f → 明媚墨绿 #0B4A32
     --green/--green-2 → --sprout 强调色：旧灰绿 #2f6b4f → 芽绿 #00C26E
     var(--green,#3a8f5f)      → --ink   这三处**本来就当墨色用**（兜底值从没生效过）
   另：`.question-card.selected` 的选中光晕原来跟旧绿绑死（rgba(47,107,79,.15)），
   一并换成芽绿的 rgba，不再是一半新一半旧。

   ⚠️ 为什么放文件末尾**覆盖**、而不是回头改旧层：旧层是历史，留着对照；
      要回滚只需删掉这一节，不用把旧层的几十行再翻回来。
      本节列出的选择器**都是新层没覆盖到的**；已被新层覆盖的（.btn / .chip /
      .side-link / .stat b / .option / .practice-track 等）不在其中，别重复写。
   ===================================================================== */

/* 1) 旧米黄底 + 旧深棕字的那几组（原清单点名的 4 组 + 同一对变量的其余用户） */
.src-ref   { color:var(--wheat-ink); background:var(--sand); }   /* 「文档第 42 行」解析依据 */
.preview-head { color:var(--wheat-ink); }                        /* 切分预览的小标题 */
.pl-row.is-question { background:var(--sand); }                  /* 预览里标记为"是题目"的那行 */
.tag      { background:var(--sand); color:var(--wheat-ink); }    /* 通用小标签 */
.ai-tag   { background:var(--sand); color:var(--wheat-ink); }    /* 「✦ AI 参与」徽标 */
.ai-changes       { background:var(--sand); }                    /* 「AI 改动 N 处」块 */
.ai-changes-title { color:var(--wheat-ink); }
.ai-ch-arrow      { color:var(--wheat-ink); }                    /* 旧值 → 新值 中间那个箭头 */
.ai-ch-after      { color:var(--ink); }                          /* 与左边的 .ai-ch-field 同色 */

/* 2) 旧深绿当强调色的两处 —— 换芽绿（与进度条同一个色，语义一致：生长 / 进行中） */
.harvest-line b      { color:var(--sprout); }   /* 收获结算卡里的大数字 */
.switch.on .sw-track { background:var(--sprout); }  /* 答题节奏开关：开 = 快速连答 */

/* 3) 原本就当墨色用的三处（它们的 var(--green,#3a8f5f) 兜底值从没生效过，
      实际渲染的是旧深绿）→ 明媚版墨绿 */
.avatar-img      { border-color:var(--ink); }
.avatar-fallback { background:var(--ink); }
.points-balance strong { color:var(--ink); }
a { color:var(--ink); }   /* 正文里的链接（页脚「关于我们 / 隐私政策…」那一排） */

/* 4) 跟旧绿绑在一起的其余零散处 */
.question-card.selected { border-color:var(--sprout); box-shadow:0 0 0 2px rgba(0,194,110,.15); }
.draft-check { accent-color:var(--sprout); }   /* 原生复选框的勾选色 */
.dropzone:hover, .dropzone.dragging,
.dropzone.has-file { border-color:var(--sprout); }   /* 上传区虚线框（新层只重设了底色） */

/* ⚠️ 有意**没**动的：`.growth` / `.growth-label` / `.growth.harvest`（旧层 106-112 行）
   也引用 --sage / --green-2 / --cream / --wheat-deep，但**它们已经不渲染了** ——
   新层第 457 行写着 `.growth { display:none }`（09-18 田卡改版后由田景取代），
   且 app.js 里已经没有任何一处产出 `.growth` 结构（grep 零命中）。
   给死代码加覆盖只会让下一个人以为它在生效，所以留着不动；真要复活它，记得连配色一起看。 */

/* ══════════════════════════════════════════════════════════════════════
   题目图片（规格 功能 4.4，卡 BAN-142）
   题目自带图却看不到图 = 这道题做不了（题干写着「见下图」而图没了）。
   色值一律走明媚版 token（--sand / --line / --sprout / --muted），
   圆角只用档位表里的 8 / 12 / 999（BRAND.md 圆角纪律）。
   ══════════════════════════════════════════════════════════════════════ */
.q-images { display:flex; flex-wrap:wrap; gap:8px; margin:8px 0 2px; }
.q-image {
  max-width:200px; max-height:150px;
  border:1px solid var(--line); border-radius:8px; background:var(--surface);
  cursor:zoom-in;   /* 点开看大图（要求 5：小图展示、点开放大） */
}
.q-image:hover { border-color:var(--sprout); }

.zoom-wrap { display:flex; justify-content:center; background:var(--sand); border-radius:12px; padding:10px; }
.zoom-wrap img { max-width:100%; max-height:70vh; }

/* 候选池：解析时定位不到归属的图（材料开头 / 页眉页脚）与用户补传的图都在这儿 */
.cand-pool { margin-top:12px; border:1px dashed var(--dash); border-radius:12px; padding:10px; background:var(--sand); }
.cand-head { display:flex; flex-wrap:wrap; gap:8px; align-items:baseline; font-size:13px; color:var(--ink); }
.cand-hint { color:var(--muted); font-size:12px; }
.cand-list { display:flex; flex-wrap:wrap; gap:8px; margin-top:8px; }
.cand-item {
  width:100px; padding:4px; cursor:grab;
  border:1px solid var(--line); border-radius:8px; background:var(--surface);
}
.cand-item img { display:block; width:100%; height:64px; object-fit:contain; }
.cand-item.armed { border-color:var(--sprout); box-shadow:0 0 0 2px rgba(0,194,110,.15); }
.cand-where {
  display:block; margin-top:2px; font-size:11px; color:var(--muted);
  overflow:hidden; text-overflow:ellipsis; white-space:nowrap;
}
.cand-upload {
  display:inline-block; margin-top:8px; padding:3px 10px; font-size:12px; color:var(--ink);
  border:1px solid var(--line); border-radius:999px; background:var(--surface); cursor:pointer;
}
.cand-upload:hover { border-color:var(--sprout); }
/* 拖着图经过哪道题，哪道题就亮起来 —— 不然用户不知道松手会挂到哪 */
.draft-row.drop-target { border-color:var(--sprout); box-shadow:0 0 0 2px rgba(0,194,110,.18); }
/* 「本题含图，未提取」标记（规格 4.4 的输出之一）——
   显示成一句人话而不是破图：破图会让用户以为这题本来就没图。 */
.q-image-lost {
  display:inline-block; padding:6px 10px; font-size:12px;
  color:var(--warn); background:var(--warn-bg);
  border:1px dashed var(--soil); border-radius:8px;
}

/* 增值项勾选（规格 1.3，卡 BAN-60）——report 下方「还可以让 AI 顺手做的事」。
   勾一块数字跟着变；没勾的项要写清「不勾会发生什么」，否则等于没让用户选。 */
.inspect-addons { margin:10px 0 2px; border:1px solid var(--line); border-radius:12px; padding:10px; background:var(--sand); }
.inspect-addons-head { display:flex; flex-wrap:wrap; gap:8px; align-items:baseline; font-size:13px; color:var(--ink); margin-bottom:6px; }
.inspect-addons-head .muted { font-size:12px; }
.addon-item { display:flex; gap:8px; align-items:flex-start; padding:6px 8px; border:1px solid var(--line); border-radius:8px; background:var(--surface); cursor:pointer; }
.addon-item + .addon-item { margin-top:6px; }
.addon-item.on { border-color:var(--sprout); }
.addon-item input { margin-top:3px; accent-color:var(--sprout); }
.addon-main { display:flex; flex-wrap:wrap; gap:6px; align-items:baseline; }
.addon-main b { color:var(--ink); }
.addon-count { font-size:12px; color:var(--muted); }
.addon-credits { font-style:normal; font-size:12px; color:var(--ok); font-weight:600; }
.addon-text, .addon-off { flex-basis:100%; font-size:12px; color:var(--muted); }
.addon-off { color:var(--warn); }
.inspect-cost { margin:8px 0 0; font-size:13px; color:var(--ink); }

/* ── 答案 / 解析的「来源标记」（规格 2.4 / 4.3，卡 BAN-55，2026-09-30）──────
   答案旁只有一个小符号，来源类型在悬浮提示里 —— 阿楼 2026-09-21 要的两条
   （「来源都要标记清楚」＋「不能增加用户的负担」）合起来就是这个形状。
   颜色刻意用中性暖灰（与 .q-src 同族）：它不是警告也不是成就，只是「出处」，
   用彩色会和「AI 标记」「对错标色」抢注意力。 */
.src-tag { display:inline-block; margin-left:5px; padding:0 4px; border-radius:999px;
  border:1px solid var(--line); background:var(--paper);
  font-size:11.5px; color:var(--muted); cursor:help; line-height:16px; vertical-align:middle; }
.src-tag:hover { color:var(--ink-2); border-color:var(--muted); }
.qa-source { margin-left:8px; font-size:11.5px; color:var(--muted); }

/* ── 种子口袋（2026-10-07，BAN-160，独立 tab）─────────────────────────── */
.pocket-grid { display:grid; grid-template-columns:repeat(auto-fill, minmax(132px, 1fr)); gap:12px; margin:14px 0; }
.pocket-seed { position:relative; display:flex; flex-direction:column; align-items:center; gap:4px;
  padding:14px 10px; border:1px solid var(--line); border-radius:14px; background:var(--surface);
  color:var(--ink); font-size:14px; cursor:pointer; transition:border-color .14s ease, transform .14s ease; }
.pocket-seed:hover { transform:translateY(-1px); border-color:var(--green); }
.pocket-seed.on { border-color:var(--green); box-shadow:0 0 0 2px rgba(47,107,79,.18); }
.pocket-seed .pseed-art { width:34px; height:34px; color:var(--green); }
.pocket-seed .pseed-art svg { width:100%; height:100%; }
.pocket-seed .pseed-art.r-ssr { color:#b8860b; }
.pocket-seed .pseed-art.r-sr { color:#8e6bc9; }
.pocket-seed .pseed-art.r-s { color:#3a7bd5; }
.pocket-seed .tick { position:absolute; top:6px; right:8px; font-weight:900; color:var(--green); }
.pocket-seed .muted { font-size:12px; }
.pocket-bar { display:flex; align-items:center; flex-wrap:wrap; gap:6px; margin:6px 0 18px; }
.pocket-bar .btn { min-height:36px; padding:0 16px; font-size:13px; }
.pocket-warn { margin:10px 0; padding:12px 16px; border-radius:12px; background:var(--wheat-soft);
  border:1px solid var(--wheat, #FFC93C); font-size:13.5px; }
.pocket-warn.danger { background:#fdf2f0; border-color:#e2b8b0; }
.plant-btn { min-height:30px; padding:0 12px; border-radius:999px; border:1px dashed var(--green);
  background:transparent; color:var(--green); font-size:12.5px; font-weight:700; cursor:pointer; margin-left:8px; }
.plant-btn:hover { background:var(--sage); }
.seed-box.full { background:#fdf2f0; border-color:#e2b8b0; }

/* ── 积分包用量投影（2026-10-08，BAN-80 要求 1）────────────────────────── */
/* 购买页每个积分包下面那行「约可做：上传 X 题 · 补全 Y 题 · 出题 Z 题」。
   它是**辅助说明**不是主信息，所以不上颜色、不抢「价格 = 积分」那一行的注意力。 */
.buy-proj { display:block; margin-top:4px; font-size:12.5px; font-style:normal; color:var(--muted); }
