:root {
  /* ── 页面与卡面 ── */
  --bg-top: #EAF0F9; --bg-mid: #DFE8F4; --bg-bot: #D9E4F4;
  --card: #FBFCFE; --card-2: #F4F7FC; --card-pure: #FFFFFF;
  /* ── 近黑（参考图的黑色锚点：导航容器 / 主按钮 / 本周格） ── */
  --black: #1E1F24; --black-2: #26272D; --black-soft: #2C2E35;
  /* ── 玻璃渐变族（参考图详情卡 #8FA6BC→#7E93A8） ── */
  --glass-card: linear-gradient(180deg, #8FA6BC 0%, #7E93A8 100%);
  /* 词库/错题面板：参考图详情卡同族蓝灰玻璃（用户定：要 #8FB4D2/#6E93B5 观感，不许近黑）
     浅蓝灰承不住白字（8FB4D2 上白字仅 2.18:1），故面板内一律深字，黄绿只做图形 */
  --panel-glass: linear-gradient(180deg, #8FB4D2 0%, #7FA6C7 100%);
  --on-glass-3: #2F3640;   /* 玻璃卡上三级文字 5.2:1 */
  --card-grad: linear-gradient(180deg, #FFFFFF 0%, #E9F0F9 100%);
  /* 无数据卡渐变：近中性（通道极差 4），落在"缺口梯度"之外——去色相且底端不比 mid 深 */
  --card-grad-empty: linear-gradient(180deg, #FFFFFF 0%, #F5F6F9 100%);
  /* 近黑承面（导航容器 / 提示条共用一套，别再各写一份） */
  --black-grad: linear-gradient(180deg, var(--black-soft) 0%, var(--black) 100%);
  /* ── 蓝灰体系 ── */
  --slate-050: #EEF3F9; --slate-100: #DCE7F2; --slate-200: #8FB4D2; --slate-300: #7FA6C7;
  --slate-400: #6E93B5; --slate-500: #4E6480; --slate-600: #46586E;
  --slate-700: #3A4A5E; --slate-800: #2E3B4C;
  /* ── 强调：黄绿，全站唯一有色相的颜色 ── */
  --accent: #D4F542;            /* 只做底/图形，永远配深色文字 14.31:1 */
  --accent-soft: #EEF7C9;       /* 浅底上的黄绿静音版底 */
  --accent-ink: #5A6E12;        /* ★ 浅底上的黄绿文字/描边替身 4.99:1 */
  --accent-on-dark: #B8D935;
  --accent-ring: rgba(212,245,66,.45);
  /* ── 灰阶文字（浅底） ── */
  --ink-1: #17181C; --ink-2: #3D4653; --ink-3: #4A5462;
  --ink-4: #5F6C7F; --ink-5: #6B7480; --ink-deco: #8A94A6;
  /* ── 近黑容器上的文字阶梯（只许用在 nav / s-current / 黑色按钮上）
     ⚠ 词库与错题面板是浅蓝灰玻璃，用 --on-glass-* 深字，绝不用 --on-panel 白字 ── */
  --on-panel-1: #FFFFFF;
  --on-panel-2: rgba(255,255,255,.86);
  --on-panel-3: rgba(255,255,255,.72);
  --on-panel-4: rgba(255,255,255,.55);
  --on-panel-deco: rgba(255,255,255,.45);
  /* ── 玻璃细节卡（只承深色文字） ── */
  --on-glass-1: #17181C; --on-glass-2: #26272D;
  /* ── 描边 / 分隔 / 阴影 ── */
  --line: #DCE3EC; --line-strong: #BCC7D4;
  --line-on-slate: rgba(255,255,255,.20); --line-on-slate-2: rgba(255,255,255,.14);
  --hairline: rgba(255,255,255,.75);
  --shadow-1: 0 2px 10px rgba(30,42,64,.06);
  --shadow-2: 0 6px 20px rgba(30,42,64,.10);
  --shadow-panel: 0 6px 22px rgba(46,59,76,.18);
  --shadow-badge: 0 1px 3px rgba(20,30,45,.25);
  /* ── 面板渐变 ── */
  --panel-grad: linear-gradient(180deg, #46586E 0%, #3A4A5E 100%);
  --glass-grad: linear-gradient(180deg, #8FB4D2 0%, #7FA6C7 100%);
  /* ── 圆角体系：4 档 ── */
  --r-pill: 999px; --r-lg: 18px; --r-md: 12px; --r-sm: 8px;
  /* ── 旧名兼容层：一词改全局 ── */
  --bg: var(--bg-top); --ink: var(--ink-1); --muted: var(--ink-4);
  --blue: var(--slate-400); --green: var(--accent-on-dark); --orange: var(--slate-600);
  --accent-deep: var(--accent-ink);      /* 语义修正：#B8D935 在浅底只有 1.41:1 */
  --dark: var(--slate-700);              /* ★ 近黑 → 深蓝灰，.v-sum/.v-grp/.rf-block/s-current/.chip.now 全迁 */
  --slate: var(--slate-200); --slate-mid: var(--slate-400); --slate-deep: var(--slate-600);
  /* 面板语义别名 */
  --panel: var(--slate-700); --panel-2: var(--slate-600); --panel-deep: var(--slate-700);
  --on-panel: var(--on-panel-1);
  --tag-solid: var(--slate-800); --tag-solid-ink: #FFFFFF;
  --tag-mid: var(--slate-100); --tag-mid-ink: var(--slate-700);
  --tag-soft: #EDEFF2; --tag-soft-ink: var(--ink-4);
}
* { box-sizing: border-box; -webkit-text-size-adjust: 100%; }
body {
  margin: 0; color: var(--ink);
  background: linear-gradient(180deg, var(--bg-top) 0%, var(--bg-mid) 55%, var(--bg-bot) 100%) fixed, var(--bg-top);
  font: 15px/1.55 -apple-system, "SF Pro Text", "PingFang SC", "Helvetica Neue", Arial, sans-serif;
  padding-bottom: 32px;
}
.hd { padding: 18px 16px 0; max-width: 1080px; margin: 0 auto; }
.hd h1 { font-size: 19px; margin: 0 0 4px; letter-spacing: .2px; }
.meta { color: var(--muted); font-size: 12.5px; }
nav {
  display: flex; gap: 4px; margin: 12px 0 0; overflow-x: auto; padding: 5px;
  background: var(--black-grad);   /* 近黑容器：黄绿选中态的托底 */
  border-radius: var(--r-pill); scrollbar-width: none;
  box-shadow: 0 6px 18px rgba(20,24,32,.22), inset 0 1px 0 rgba(255,255,255,.08);
}
nav::-webkit-scrollbar { display: none; }
nav a {
  text-decoration: none; color: rgba(236,240,246,.66); background: transparent; border: none;
  padding: 12px 14px; min-height: 44px; display: inline-flex; align-items: center; box-sizing: border-box;
  padding: 7px 14px; border-radius: var(--r-pill); font-size: 13.5px; white-space: nowrap; font-weight: 500;
}
@media (max-width: 900px) {
  nav { flex-wrap: wrap; overflow-x: visible; border-radius: var(--r-pill); }
  nav a { padding: 10px 12px; font-size: 13px; }
}
nav a.on {
  background: linear-gradient(180deg, #DDFA62 0%, var(--accent) 100%);
  color: var(--ink-1); font-weight: 700;
  box-shadow: 0 2px 8px rgba(180,210,40,.35), inset 0 1px 0 rgba(255,255,255,.6);
}
main { max-width: 1080px; margin: 0 auto; padding: 6px 16px 0; }
.sec-head { display: flex; align-items: baseline; justify-content: space-between; gap: 10px; margin: 18px 0 10px; flex-wrap: wrap; }
.sec-head h2 { font-size: 15.5px; margin: 0; }
.muted { color: var(--muted); font-size: 12.5px; }
/* 页脚三行免责：说明性文字最低一级，段间透气、限宽 */
.ft { max-width: 1080px; margin: 26px auto 0; padding: 18px 16px 0; border-top: 1px solid var(--line); }
.ft p { margin: 0 0 10px; font-size: 10.5px; line-height: 1.85; color: var(--ink-deco); max-width: 78ch; }
.ft p:last-child { margin-bottom: 0; }
.grid { display: grid; grid-template-columns: 1fr; gap: 12px; }
@media (min-width: 700px) { .grid { grid-template-columns: 1fr 1fr; } }
@media (min-width: 1000px) { .grid { grid-template-columns: 1fr 1fr 1fr; } }
.card {
  background: var(--card-grad); border: 1px solid rgba(255,255,255,.85); border-radius: var(--r-lg);
  padding: 16px 18px 15px;
  box-shadow: 0 2px 10px rgba(30,42,64,.06), inset 0 1px 0 rgba(255,255,255,.9);
}
/* 扁平化：状态不用左竖条，用「整块铺底 + 描边虚实」区分（参考图选中态手法） */
.st-ahead { background: linear-gradient(180deg,#FBFFEE 0%,#EFF8D4 100%); border-color: rgba(90,110,18,.28); }
.st-behind { background: linear-gradient(180deg,#E7EDF5 0%,#D3DDEA 100%); border-color: var(--slate-600); }
.st-stale { border-style: dashed; border-color: var(--slate-400); }
.st-no_data { border-style: dashed; border-color: var(--line-strong); }
.c-top { display: flex; justify-content: space-between; align-items: flex-start; gap: 8px; }
.c-name { font-weight: 600; font-size: 15px; }
.chip { font-size: 11.5px; padding: 2.5px 9px; border-radius: var(--r-pill); white-space: nowrap;
  font-weight: 500; letter-spacing: .2px; line-height: 1.5;
  display: inline-flex; align-items: baseline; gap: 4px; }
/* 五态：深底上「越亮＝越要紧」，浅底上「越实＝越要紧」——严重度不靠色相，靠实心/空心 + 明度差 */
.chip.ch-ahead { background: var(--accent-soft); color: #3F4D0A; font-weight: 650;
  box-shadow: inset 0 0 0 1px rgba(90,110,18,.30); }
.chip.ch-on { background: var(--slate-100); color: var(--slate-700); }
.chip.ch-behind { background: var(--slate-600); color: #fff; font-weight: 650; }
.chip.ch-stale { background: #EDEFF2; color: var(--ink-4); font-weight: 400;
  box-shadow: inset 0 0 0 1px rgba(58,74,94,.14); }
.chip.ch-nodata { background: transparent; color: var(--ink-5); font-weight: 400;
  box-shadow: inset 0 0 0 1px var(--line-strong); }
.tag.warn { background: #e6ecf5; color: #46586e; font-size: 11px; padding: 1px 7px; border-radius: var(--r-pill); font-weight: 500; }
.c-cur { margin: 9px 0 11px; color: var(--ink-2); font-size: 13.5px; line-height: 1.6; }
.c-prog { display: flex; justify-content: space-between; align-items: flex-end; gap: 8px; }
.c-num { font-size: 21px; font-weight: 650; letter-spacing: -.4px; }
.c-num small { font-size: 12px; font-weight: 400; color: var(--muted); }
.c-unit { color: var(--muted); font-size: 12px; }
.bar { position: relative; height: 8px; background: var(--slate-700); border-radius: var(--r-pill); margin: 7px 0 9px; overflow: hidden; }
.bar span { display: block; height: 100%; background: var(--accent); border-radius: var(--r-pill); }
.st-ahead .bar span { background: var(--accent); }
.st-behind .bar span { background: var(--slate-200); }
.st-stale .bar span { background: rgba(255,255,255,.45); }
.st-no_data .bar span { display: none; }
.st-no_data .bar { background-image: repeating-linear-gradient(90deg, var(--line-on-slate) 0 4px, transparent 4px 8px); background-color: var(--slate-600); }
.c-mastery { display: flex; justify-content: space-between; font-size: 13px; border-top: 1px dashed var(--line); padding-top: 10px; margin-top: 12px; }
.c-mastery .ml { color: var(--muted); font-size: 12px; }
/* 覆盖率警示：保留决策级可见性，但降为细边框浅底，不在白卡里做重色块 */
.c-anchor {
  margin-top: 10px; font-size: 11px; line-height: 1.7; color: var(--ink-3);
  background: var(--tag-soft); border: 1px solid var(--line);
  border-radius: var(--r-md); padding: 6px 10px; font-weight: 500;
}
.c-note, .c-hint { margin-top: 9px; font-size: 11.5px; line-height: 1.75; color: var(--ink-3); letter-spacing: .1px; }
.c-hint { max-width: 62ch; }
/* detail 长文分组：段与段之间留白透气，整块降权到最轻一级 */
.c-detail {
  margin-top: 14px; padding-top: 12px; margin-bottom: 4px;
  border-top: 1px solid var(--line);
  display: flex; flex-direction: column; gap: 10px;
}
.det-seg {
  margin: 0; font-size: 11px; line-height: 1.8; color: var(--ink-deco);
  max-width: 68ch; letter-spacing: .1px;
}
/* 首段是决策级信息（当前学到哪/薄弱点），比后续考证段重一级 */
.det-lead { font-size: 12px; line-height: 1.75; color: var(--ink-3); font-weight: 500; }
/* 规则句（会改变家长动作的口径/禁令）：常驻且比其他说明重一级 */
.det-rule { color: var(--ink-1); font-weight: 600; }
/* 活待办徽标：折叠区里埋着待核对项时必须有提示，否则没人记得 */
.det-todo {
  display: inline-block; margin-left: 6px; padding: 0 7px;
  background: var(--black); color: #fff; border-radius: var(--r-pill);
  font-size: 9.5px; font-weight: 700; letter-spacing: .3px; line-height: 1.7;
}
.det-more { margin: 0; }
.det-more > summary {
  cursor: pointer; list-style: none; font-size: 11px; color: var(--slate-600);
  font-weight: 600; letter-spacing: .2px; padding: 2px 0;
  -webkit-tap-highlight-color: transparent;
}
.det-more > summary::-webkit-details-marker { display: none; }
.det-more > summary::before { content: "▸ "; }
.det-more[open] > summary::before { content: "▾ "; }
.det-more[open] { display: flex; flex-direction: column; gap: 9px; }
.det-more[open] > summary { margin-bottom: 2px; }
.c-foot { margin-top: 12px; padding-top: 9px; border-top: 1px solid var(--line); font-size: 10.5px; color: var(--ink-deco); font-variant-numeric: tabular-nums; letter-spacing: .2px; }
.lt-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 6px 10px; margin: 4px 0 6px; }
.lt-grid .ml { display: block; color: var(--muted); font-size: 11.5px; }
.lt-grid b { font-size: 14px; }
.wk-scroll { overflow-x: auto; -webkit-overflow-scrolling: touch; background: #fff; border: 1px solid var(--line); border-radius: var(--r-md); }
table.wk { border-collapse: collapse; width: 100%; min-width: 520px; font-size: 12.5px; }
table.wk th, table.wk td { padding: 7px 9px; border-bottom: 1px solid var(--line); text-align: center; }
table.wk thead th { color: var(--muted); font-weight: 500; font-size: 11.5px; }
table.wk .rowh { text-align: left; font-weight: 500; white-space: nowrap; background: #fafbfc; position: sticky; left: 0; }
table.wk .rowh { max-width: 150px; overflow: hidden; text-overflow: ellipsis; }
table.wk td small { color: var(--muted); }
table.wk td.good { background: var(--accent-soft); } table.wk td.mid { background: #e4ecf5; } table.wk td.low { background: #d7dfea; }
table.wk td .mini { font-size: 10.5px; color: var(--muted); }
.wk-cards { margin-top: 12px; }
.wk-row { display: flex; justify-content: space-between; gap: 10px; font-size: 12.5px; padding: 3px 0; }
.wk-row .wl { color: #42505f; } .wk-row .wv { color: var(--muted); text-align: right; }
.wk-row.small { font-size: 11.5px; }
.wk-issue { font-size: 11.5px; font-weight: 600; color: var(--ink-1); background: #e9eef6; border-radius: var(--r-sm); padding: 3px 8px; margin-top: 4px; }
.panel { background: #fff; border: 1px solid var(--line); border-radius: var(--r-md); padding: 12px 14px; font-size: 13px; }
.panel.err { border-color: var(--slate-500); background: #EFF4F9; color: var(--ink-1); border-width: 1.5px; }
.panel p { margin: 6px 0; }
/* 代码块统一样式：不论在 .panel 还是 .cl-more 内都是同一副面孔 */
.panel pre, .cl-more pre {
  background: #f4f6f8; border: 1px solid var(--line);
  padding: 8px 10px; border-radius: var(--r-sm);
  overflow-x: auto; font-size: 11.5px; line-height: 1.65; color: var(--ink-2);
}
code { background: var(--slate-050); padding: 1px 5px; border-radius: var(--r-sm); font-size: 12px; }
ul.arch { list-style: none; padding: 0; margin: 0; }
ul.arch li { background: #fff; border: 1px solid var(--line); border-radius: var(--r-md); padding: 9px 12px; margin-bottom: 8px; font-size: 13px; }


/* ---------- 页顶周历条（全局，一行 21 格） ---------- */
.weekstrip { margin: 11px 0 0; }
.cal-strip { display: flex; flex-wrap: nowrap; gap: 5px; }
.cal-strip .cal-cell { flex: 1 1 0; min-width: 0; overflow: hidden; min-height: 52px; padding: 5px 1px; }
.weekstrip .cal-legend { margin-top: 8px; }
@media (max-width: 700px) { .weekstrip .cal-legend { display: none; } }
@media (max-width: 560px) {
  /* 21 格一行在 375px 下实测每格仅 16×42px（远低于 44）→ 横滑 + 44px 最小格宽：
     保留「一行 21 格」语言，命中区达标；app.js 里 centerStrip() 把「本周」滚到可见。
     padding 3px 2px 是给 .s-current 的 2px 黄绿外环留绘制空间（overflow 会裁掉外环）。 */
  .weekstrip { margin: 9px -12px 0; }
  .cal-strip {
    gap: 2px; padding: 3px 2px;
    overflow-x: auto; -webkit-overflow-scrolling: touch;
    scroll-snap-type: x proximity; scrollbar-width: none;
  }
  .cal-strip::-webkit-scrollbar { display: none; }
  .cal-strip .cal-cell { flex: 0 0 auto; min-width: 44px; min-height: 44px; padding: 4px 0; border-radius: var(--r-sm); gap: 0; scroll-snap-align: center; }
  .cal-strip .cal-cell.s-current { flex-grow: 0; min-width: 56px; min-height: 48px; }
  .cal-strip .cal-cell small { display: none; }
  .cal-strip .cal-cell b { font-size: 11px; letter-spacing: 0; }
  .cal-strip .cal-cell b .wk-w { display: none; }
  .cal-strip .cal-cell.s-current b { font-size: 11.5px; letter-spacing: 0; }
  .cal-strip .cal-cell em { font-size: 9.5px; letter-spacing: 0; }
  .cal-strip .cal-cell .dot { position: relative; top: 3px; right: 3px; width: 4px; height: 4px; }
  .cal-strip .cal-cell.issue::after { left: 3px; top: 3px; width: 4px; height: 4px; }
}
.cal-cell {
  position: relative; display: flex; flex-direction: column; align-items: center; justify-content: center; gap: 1px;
  min-height: 56px; padding: 6px 2px;
  border-radius: var(--r-sm); border: 1px solid var(--line);
  background: #fbfcfd; color: #4a5462; font: inherit; cursor: pointer;
  transition: box-shadow .12s ease;
  -webkit-appearance: none; appearance: none;
}
.cal-cell b { font-size: 12.5px; font-weight: 650; letter-spacing: .2px; }
.cal-cell small { font-size: 10px; color: var(--muted); }
.cal-cell em {
  position: static; text-align: center; line-height: 1.15;
  font-style: normal; font-size: 9px; font-weight: 700; letter-spacing: .2px;
  color: rgba(255,255,255,.90);
}
.cal-cell .dot {
  position: absolute; top: 5px; right: 6px; width: 5px; height: 5px;
  border-radius: 999px; background: var(--blue);
}
.cal-cell .dot.off { background: transparent; }
.cal-cell.s-past { color: #6b7480; }
.cal-cell.s-future { color: var(--ink-4); background: var(--card-pure); }
.cal-cell.s-unknown { color: #9aa2ad; }
/* ① 已过·达标 —— 黄绿实心 + 深色数字（黄绿对页面底仅 1.08:1，边界靠白内环+投影+深字立住） */
.cal-cell.lv-good {
  background: var(--accent); border-color: transparent; color: var(--ink-1);
  box-shadow: 0 1px 2px rgba(58,74,94,.12), inset 0 0 0 1px rgba(255,255,255,.55);
}
.cal-cell.lv-good b { font-weight: 700; }
.cal-cell.lv-good small { color: #3F4D0A; }
.cal-cell.lv-good em { color: #3F4D0A; font-weight: 700; }
.cal-cell.lv-mid { background: var(--slate-050); border-color: var(--line-strong); color: var(--ink-2); }
.cal-cell.lv-low { background: #E4EAF3; border-color: var(--line-strong); color: var(--ink-2); }
.cal-cell.issue::after {
  content: ""; position: absolute; left: 6px; top: 5px; width: 5px; height: 5px;
  border-radius: 999px; background: var(--slate-deep);
}
/* ③ 本周 —— 深蓝灰实心 + 黄绿实心环（黄绿环贴深底才看得见 7.30:1） */
.cal-cell.s-current {
  background: linear-gradient(180deg, var(--black-soft) 0%, var(--black) 100%);
  border-color: var(--accent); color: #fff;
  box-shadow: inset 0 1px 0 rgba(255,255,255,.12), 0 0 0 2px var(--accent), 0 4px 14px rgba(20,24,32,.26);
}
.cal-cell.s-current { min-height: 62px; gap: 0; }
.cal-cell.s-current b { font-size: 13px; font-weight: 700; line-height: 1.25; }
.cal-cell.s-current small { font-size: 9.5px; line-height: 1.2; }
.cal-cell.s-current em { margin-top: 1px; }
.cal-cell.s-current small { color: rgba(255,255,255,.72); }
.cal-cell.s-current .dot { background: var(--accent); }
.cal-cell.s-current .dot.off { background: transparent; }
.cal-legend { display: flex; flex-wrap: wrap; gap: 12px; margin-top: 10px; font-size: 11px; color: var(--muted); }
.cal-legend span { display: inline-flex; align-items: center; gap: 4px; }
.sw { width: 9px; height: 9px; border-radius: var(--r-sm); background: #fbfcfd; border: 1px solid var(--line); display: inline-block; }
.sw.cur { background: var(--slate-deep); border-color: var(--slate-deep); }
.sw.past { background: #e4eaf3; }
.sw.fut { background: #fbfcfe; }
.sw.dot { border-radius: var(--r-pill); background: var(--slate-mid); }
.sw.good { background: var(--accent); border-color: var(--accent-ink); }
.sw.mid { background: #e4ecf5; border-color: #c3d3e4; }
.sw.low { background: #d7dfea; border-color: #b6c2d2; }
.chip.now { background: var(--black); color: #fff; font-weight: 600; margin-left: 5px; }
.card.flash, .wk-scroll.flash { animation: flash 1.1s ease; }
@keyframes flash {
  0% { box-shadow: 0 0 0 0 rgba(110,147,181,.4); }
  40% { box-shadow: 0 0 0 5px rgba(110,147,181,.2); }
  100% { box-shadow: 0 0 0 0 rgba(110,147,181,0); }
}
@media (prefers-reduced-motion: reduce) {
  .cal-cell, .card.flash { transition: none; animation: none; }
}

/* ---------- 副科清理 ---------- */
.cl-note {
  background: var(--card-grad); border: 1px solid var(--line);
  border-radius: var(--r-lg); padding: 16px 18px 15px; font-size: 12.5px; line-height: 1.75;
  color: var(--ink-2); margin: 0 0 14px;
  box-shadow: 0 2px 10px rgba(30,42,64,.06), inset 0 1px 0 rgba(255,255,255,.9);
}
.cl-note a { color: var(--blue); text-decoration: none; }
.cl-note b { color: var(--ink-1); font-weight: 700; }
/* 折叠控件与 .det-more / .rf-more 同一套语言 */
.cl-more { margin-top: 10px; }
.cl-more > summary {
  cursor: pointer; list-style: none; font-size: 11px; color: var(--slate-600);
  font-weight: 600; letter-spacing: .2px; padding: 2px 0;
  -webkit-tap-highlight-color: transparent;
}
.cl-more > summary::-webkit-details-marker { display: none; }
.cl-more > summary::before { content: "\25B8 "; }
.cl-more[open] > summary::before { content: "\25BE "; }
.cl-more[open] { display: flex; flex-direction: column; gap: 10px; }
.cl-more .det-seg { font-size: 11px; line-height: 1.8; color: var(--ink-deco); max-width: 68ch; }
.cl-more pre { margin: 0; }
ul.cl-list { list-style: none; padding: 0; margin: 0; }
ul.cl-list li { background: #fff; border: 1px solid var(--line); border-radius: var(--r-md); padding: 9px 12px; margin-bottom: 8px; font-size: 13px; }
table.wk.cl td.lft, table.wk.cl th.lft { text-align: left; }
table.wk.cl td { color: #4a5462; }
table.wk.cl tbody th.rowh { font-weight: 600; }

/* ---------- 英语词库（#vocab）：一个圆点 = 一个词 ---------- */
/* ── 玻璃面板族（词库汇总/分组、三科错题）：同一套几何 + 同一套底色 + 同一套阴影 ── */
.v-sum, .v-grp, .rf-block {
  background: var(--panel-glass); border: none;
  border-radius: var(--r-lg); padding: 16px 18px 18px;
  margin-bottom: 12px; color: var(--on-glass-1);
  box-shadow: 0 6px 20px rgba(46,59,76,.16), inset 0 1px 0 rgba(255,255,255,.45);
}
.v-sum { font-size: 14px; }
.v-sum b { font-weight: 650; }
.v-sum .muted { display: block; margin-top: 3px; color: var(--on-glass-3); }
/* 图例与分组面板同底：图例环境必须等于实际使用环境，否则圆点描边观感有偏差 */
.v-legend {
  display: flex; flex-wrap: wrap; gap: 16px; align-items: center;
  margin: 0 0 12px; padding: 9px 14px;
  background: var(--panel-glass); border-radius: var(--r-md);
  font-size: 12px; color: var(--on-glass-1); font-weight: 500;
  box-shadow: 0 4px 14px rgba(46,59,76,.12), inset 0 1px 0 rgba(255,255,255,.45);
}
.v-legend span { display: inline-flex; align-items: center; gap: 5px; }

.v-gh {
  display: flex; align-items: baseline; justify-content: space-between; gap: 10px; flex-wrap: wrap;
  font-size: 13px; font-weight: 700; margin: 0 0 10px; padding-bottom: 8px; color: var(--on-glass-1);
  letter-spacing: .2px; border-bottom: 1px solid rgba(23,24,28,.18);
}
.v-gh .v-gs { font-size: 11.5px; font-weight: 400; color: var(--on-glass-3); font-variant-numeric: tabular-nums; }
.dots { display: flex; flex-wrap: wrap; gap: 4px; }

/* 三态：实心 = 会 / 空心 = 半会 / 虚线空心 = 不会（灰度下靠形状也能区分） */
.dot {
  display: inline-block; width: 10px; height: 10px; border-radius: 999px;
  vertical-align: middle; cursor: pointer; box-sizing: border-box;
}
/* 三态靠填充度编码（100% / 50% / 0%），不用虚线：7px 手机上仍成立
   面板是浅蓝灰玻璃 → 描边用深色（白描边在 #8FB4D2 上会消失） */
.dot.d-known { background: var(--accent); border: 1.5px solid var(--accent-ink); }
/* 半会 = 左半填充 + 中心实心点；不会 = 全空心。两者在小尺寸/缩略图下也能分 */
.dot.d-half {
  background: linear-gradient(90deg, var(--accent) 0 50%, transparent 50% 100%);
  border: 1.5px solid var(--slate-800);
}
.dot.d-half::after {
  content: ''; position: absolute; left: 50%; top: 50%;
  width: 3px; height: 3px; margin: -1.5px 0 0 -1.5px;
  border-radius: 999px; background: var(--slate-800);
}
.dot.d-none { background: rgba(255,255,255,.30); border: 1.5px solid var(--slate-800); } /* 灰 #7b828c 3.88:1（≥3:1 非文本对比），比旧 #aab2bd 2.14:1 全览下可辨 */
.dots .dot.is-active { box-shadow: 0 0 0 3px rgba(23,24,28,.28); }
/* 悬停/选中时其余圆点变淡（只切 class，不重排、不重渲染） */
.dots.focused .dot { opacity: .15; }
.dots.focused .dot.is-active { opacity: 1; }
/* 图例已放进玻璃底，圆点参数与面板内完全一致，不再做浅底反色覆盖 */
.v-legend .dot { cursor: default; width: 9px; height: 9px; }

/* 详情浮层：固定在视口坐标系，锚在圆点正下方、水平居中，贴边不截断，靠底翻上方 */
.v-tip {
  position: fixed; z-index: 60; left: 0; top: 0;
  max-width: min(340px, calc(100vw - 16px));
  background: var(--glass-card); color: var(--on-glass-1); border: 1px solid var(--line); border-radius: var(--r-md);
  box-shadow: 0 8px 26px rgba(20, 32, 44, .20);
  padding: 10px 12px; font-size: 12.5px; color: #3d4653;
  user-select: text; -webkit-user-select: text;
}
.v-tip[hidden] { display: none; }
.v-tip .vt-en { font-size: 15px; font-weight: 650; color: var(--ink); word-break: break-word; }
.v-tip .vt-zh { margin: 2px 0 6px; }
.v-tip .vt-note { color: #5a6472; font-size: 11.5px; line-height: 1.6; }
@media (max-width: 560px) {
  .dots { gap: 2px; }
  .dots .dot { width: 7px; height: 7px; }
  .v-legend { gap: 10px; }
  .v-sum { font-size: 13.5px; }
}

/* ===================== iPad/触控适配（2026-09-23 审查整改） ===================== */
/* 2) 去掉点击灰框 */
a, button, .dot, .cal-cell, .cal-day { -webkit-tap-highlight-color: transparent; }
/* 4) 禁双击缩放误触（打卡类连点场景） */
a, button, .dot, .cal-cell, .cal-day { touch-action: manipulation; }
/* 3) 刘海/圆角/Home 指示条安全区（index.html 已 viewport-fit=cover）
   ⚠ 双侧 inset 只能算一次：body 与 .hd/main/.ft 同时加 env() 会双计。
   实测 iPhone 15 横屏（L/R=59）双计后 .hd h1 左边距 134px（59+59+16）、可用宽 584/852；
   去重后 75px / 702px。故：左/右/上只由 body 承担，横向 16px 内衬仍由各块自己加。 */
@supports (padding: env(safe-area-inset-left)) {
  body {
    padding-top: env(safe-area-inset-top);   /* 竖屏刘海（仅 status-bar-style=black-translucent 时非 0） */
    padding-bottom: calc(32px + env(safe-area-inset-bottom));
  }
  /* 横向 inset 只在 .hd/main/.ft 上算一次（它们各自还要留 16px 内衬）。
     body 绝不能再加一遍 padding-left/right：那就是下面这 134px 的来源。 */
  .hd { padding-left: calc(16px + env(safe-area-inset-left)); padding-right: calc(16px + env(safe-area-inset-right)); }
  main { padding-left: calc(16px + env(safe-area-inset-left)); padding-right: calc(16px + env(safe-area-inset-right)); }
  .ft { padding-left: calc(16px + env(safe-area-inset-left)); padding-right: calc(16px + env(safe-area-inset-right)); }
  /* .ft 不再重复加 env(safe-area-inset-bottom)：body 的 32px + inset 已覆盖 Home 指示条 */
}
/* 5) :hover 只给真 hover 设备 */
@media (hover: hover) and (pointer: fine) {
  .cal-cell:hover { box-shadow: 0 2px 8px rgba(28,31,35,.08); }
}
/* 7) 窄屏：标签栏收窄换行（触控高度 ≥44px 已在基础规则里） */
@media (max-width: 900px) {
  nav a { padding: 10px 12px; font-size: 13px; } /* 覆盖上面的 12px 14px，窄屏换行布局 */
}

/* 1) 词库圆点不可见命中区 ~30px，视觉尺寸不变；通过加大行距避免相邻命中区重叠 */
.dot { position: relative; }
.dot::before {
  content: ""; position: absolute; left: 50%; top: 50%;
  width: 30px; height: 30px; transform: translate(-50%, -50%);
  border-radius: 999px; /* 透明命中区 */
}
@media (max-width: 560px) {
  .dots { gap: 0; row-gap: 2px; }
  .dots .dot { width: 7px; height: 7px; margin: 11.5px; } /* 7px 视觉 + 两侧各 11.5px 空隙 = 30px 步进，命中区不重叠 */
}
@media (min-width: 561px) {
  .dots { gap: 0; }
  .dots .dot { margin: 10px; } /* 10px 视觉 + 2×10px = 30px 步进 */
}

/* ===================== 周视图（单周聚焦版） ===================== */
.wk-nav {
  display: flex; align-items: center; justify-content: center; gap: 12px;
  margin: 4px 0 10px; flex-wrap: wrap;
}
/* 周视图翻页按钮 = 主行动按钮，统一近黑胶囊（参考图黑色按钮语言） */
.wk-step {
  background: var(--black); border: none; border-radius: var(--r-pill);
  padding: 9px 16px; min-height: 44px; font: inherit; font-size: 13px; font-weight: 600;
  color: #fff; cursor: pointer; box-shadow: 0 2px 8px rgba(20,24,32,.20);
  -webkit-tap-highlight-color: transparent; touch-action: manipulation;
  -webkit-appearance: none; appearance: none;
}
.wk-step[disabled] { opacity: 1; background: var(--slate-100); color: var(--ink-deco);
  box-shadow: none; cursor: default; }
.wk-cur { font-size: 13.5px; color: var(--ink-3); font-weight: 500; }
.wk-cur b { font-size: 20px; font-weight: 700; color: var(--ink); font-variant-numeric: tabular-nums; letter-spacing: -.3px; }
.wk-dates {
  text-align: center; font-size: 12.5px; color: var(--muted); margin: 0 0 12px;
  font-variant-numeric: tabular-nums; letter-spacing: .2px;
}
.wk-alert {
  background: var(--black-grad); color: #fff; border-radius: var(--r-md);
  box-shadow: 0 2px 8px rgba(20,24,32,.22);
  padding: 9px 14px; font-size: 12.5px; font-weight: 500; margin-bottom: 12px;
}
.wk-alert b { font-size: 15px; font-weight: 700; color: #fff; font-variant-numeric: tabular-nums; }
.wk-list { display: grid; grid-template-columns: 1fr; gap: 10px; }
@media (min-width: 700px) { .wk-list { grid-template-columns: 1fr 1fr; } }
.wk-item {
  background: var(--card-grad); border: 1px solid rgba(255,255,255,.85);
  border-radius: var(--r-lg); padding: 16px 18px 15px;
  box-shadow: 0 2px 10px rgba(30,42,64,.06), inset 0 1px 0 rgba(255,255,255,.9);
}
/* 达标=淡黄绿铺底；缺口=蓝灰铺底（扁平，不用竖条） */
.wk-item.good { background: linear-gradient(180deg,#FFFFFF 0%,#F4FBE0 100%); border-color: rgba(90,110,18,.20); }
.wk-item.mid { background: linear-gradient(180deg,#F4F8FD 0%,#E6EEF8 100%); }
.wk-item.low { background: linear-gradient(180deg,#E7EDF5 0%,#D3DDEA 100%); border-color: var(--slate-600); }
.wk-ihead { display: flex; align-items: baseline; justify-content: space-between; gap: 8px; }
.wk-iname { font-size: 15px; font-weight: 700; color: var(--ink); letter-spacing: .2px; }
.wk-ipct { font-size: 19px; font-weight: 700; color: var(--ink); font-variant-numeric: tabular-nums; letter-spacing: -.4px; }
.wk-item.na .wk-ipct { color: var(--muted); font-weight: 500; }
/* 本周未录：行照出（标题必须在，家长才知道这周该盯它），但整块降权——
   保留卡片渐变底（不要抛弃渐变），靠虚线框 + 去阴影 + 灰标题区分"没验收"与"有数据但低"。 */
.wk-item.is-missing {
  background: var(--card-grad-empty);
  border: 1.5px dashed var(--slate-500); box-shadow: none;
}
/* 占位卡的空槽：深轨留给有数据的卡，这里用"虚线纹＝未开始"语言
   （此前深轨对底 7.68:1，比同卡标题 6.51 还响——卡上最抢眼处写着"什么都没有"）。 */
.wk-item.is-missing .bar {
  background-color: transparent; box-shadow: inset 0 0 0 1px var(--line);
  background-image: repeating-linear-gradient(90deg, rgba(74,90,110,.22) 0 4px, transparent 4px 8px);
}
.wk-item.is-missing .wk-iname { color: var(--ink-3); font-weight: 600; }
/* 课外活动合成卡：内部子项 chip（游泳/乒乓/腰旗/机器人/无人机） */
.wk-subchips { display: flex; flex-wrap: wrap; gap: 6px; margin: 7px 0 8px; }
.wk-sub {
  font-size: 11.5px; font-weight: 600; letter-spacing: .2px;
  border-radius: var(--r-pill); padding: 2px 10px;
  background: var(--slate-100); color: var(--ink-3); border: 1px solid transparent;
}
.wk-sub.is-done { background: var(--accent); color: #17181C; font-weight: 700; }
.wk-sub.is-part { background: #FFFFFF; color: var(--ink-3); border-color: rgba(90,110,18,.28); }
.wk-sub.is-none { background: #FFFFFF; color: var(--ink-3); border: 1px dashed var(--slate-500); }
.wk-item.is-missing .wk-ivals b.wk-none { color: var(--ink-4); font-weight: 500; }
.wk-item.is-missing .wk-ivals b.wk-pv { color: var(--ink-3); font-weight: 700; }
/* 未录胶囊：近黑实心 + 白字（与 .wk-issue-t 同族）。
   ⚠ 必须写成 .wk-item.na 两段式——单类 .wk-ipct-none 会被上面 .wk-item.na .wk-ipct 的
     color 覆盖，变成"黑底灰字"（实测 computed color=#5F6C7F，对比度掉到 2.4）。 */
.wk-item.na .wk-ipct-none {
  font-size: 11.5px; font-weight: 700; letter-spacing: .4px; color: #FFFFFF;
  background: var(--black); border-radius: var(--r-pill); padding: 2px 9px;
}
.wk-ivals { margin: 5px 0 7px; font-variant-numeric: tabular-nums; }
.wk-ivals b { font-size: 22px; font-weight: 700; color: var(--ink); letter-spacing: -.5px; }
.wk-plan { font-size: 12.5px; color: var(--muted); margin-left: 3px; font-weight: 500; }
.wk-item .bar { margin: 6px 0 9px; }
.wk-item.good .bar span { background: linear-gradient(90deg,#e2fb7a,var(--accent-deep)); }
.wk-item.mid .bar span { background: linear-gradient(90deg,#a5c2dc,var(--slate-mid)); }
.wk-item.low .bar span { background: linear-gradient(90deg,#6b7f96,var(--slate-deep)); }
.wk-item.na .bar span { background: #c3ccd8; }
.wk-ck {
  display: flex; align-items: baseline; gap: 8px; font-size: 12.5px; color: var(--ink-3);
  border-top: 1px dashed var(--line); padding-top: 8px; margin-top: 2px;
}
.wk-ck b { font-size: 14px; font-weight: 700; color: var(--ink); font-variant-numeric: tabular-nums; }
.wk-ckpct { margin-left: auto; font-weight: 600; color: var(--slate-deep); font-variant-numeric: tabular-nums; }
.wk-item .wk-issue { margin-top: 8px; font-size: 11.5px; line-height: 1.6; }
.wk-issue-t {
  display: inline-block; background: var(--tag-solid); color: var(--tag-solid-ink);
  border-radius: var(--r-pill); padding: 1px 8px; font-size: 10.5px; font-weight: 700;
  letter-spacing: .4px; margin-right: 6px; vertical-align: 1px;
}
.wk-note { margin-top: 6px; font-size: 11.5px; color: var(--muted); line-height: 1.6; }
@media (max-width: 560px) {
  .wk-nav { gap: 8px; }
  .wk-step { padding: 9px 13px; font-size: 12.5px; }
  .wk-ipct { font-size: 17px; }
  .wk-ivals b { font-size: 20px; }
}

/* 本周缺测：决策级信息，紧凑一行显形（缺测≠没做，是没验收） */
.wk-missing {
  background: var(--card-grad); border: 1.5px solid var(--slate-500);
  border-radius: var(--r-md); padding: 12px 16px; margin-top: 14px;
  display: flex; align-items: center; gap: 7px; flex-wrap: wrap;
}
.wk-missing-t {
  font-size: 11px; font-weight: 700; letter-spacing: .4px; color: var(--ink-1);
  background: var(--slate-100); border-radius: var(--r-pill); padding: 2px 9px;
}
.wk-mtag {
  font-size: 12px; color: var(--ink-3); background: var(--slate-050);
  border: 1px dashed var(--line-strong); border-radius: var(--r-pill); padding: 1.5px 9px;
  font-weight: 500;
}
.wk-missing-n {
  width: 100%; font-size: 10.5px; font-weight: 400; line-height: 1.7;
  color: var(--ink-deco); margin-top: 4px;
}
/* 重点加粗：卡点标题与缺口数字 */
.wk-issue-t { font-weight: 700; letter-spacing: .4px; }
.wk-item.low .wk-ipct, .wk-item.mid .wk-ipct { font-weight: 800; }
.wk-item.low .wk-iname, .wk-item.mid .wk-iname { font-weight: 800; }

/* ===================== 语文补强（#reinforce） ===================== */

.rf-block h3 { color: var(--on-glass-1); font-weight: 700; letter-spacing: .2px; }
.rf-block > h3 { margin: 0 0 10px; font-size: 14px; display: flex; align-items: baseline; gap: 8px; flex-wrap: wrap; }
.rf-toggle { margin-left: auto; font-size: 12px; color: var(--on-glass-1); background: rgba(255,255,255,.42); border: 1px solid rgba(23,24,28,.16); border-radius: var(--r-pill); padding: 6px 14px; min-height: 34px; cursor: pointer; font-weight: 600; }
.rf-updated { font-size: 11.5px; color: var(--on-glass-3); font-weight: 400; }
.rf-row { display: flex; align-items: baseline; gap: 8px; padding: 9px 0; border-bottom: 1px dashed rgba(23,24,28,.16); flex-wrap: wrap; }
.rf-row:last-child { border-bottom: none; }
.rf-date { font-variant-numeric: tabular-nums; color: var(--on-glass-3); font-size: 11.5px; min-width: 76px; font-weight: 400; }
.rf-note { color: var(--on-glass-3); font-size: 11.5px; }
/* 高度概括：主行只留 日期 + 旗标 + 一句话错点 + 状态；处置/全文收进详情 */
.rf-tags { display: inline-flex; gap: 5px; flex-wrap: wrap; }
.rf-flag { display: inline-block; border-radius: var(--r-pill); padding: 1.5px 8px;
  font-size: 10px; font-weight: 700; letter-spacing: .3px; line-height: 1.5; white-space: nowrap; }
/* L1 结构洞：实心黄绿 + 深字（全板最强档，稀缺所以可以最强） */
.rf-flag-l1 { background: var(--accent); color: var(--ink-1); }
/* 缺证据旗标：白底深字 + 重描边——绝不能被读成「快好了」 */
.rf-flag-ev { background: var(--black); color: #fff;
  box-shadow: 0 1px 3px rgba(20,30,45,.22); }
/* L3 空白未写：虚线描边 + 无填充（语义＝「这里缺一个答案」） */
.rf-flag-blank { background: transparent; color: var(--on-glass-1);
  border: 1px dashed rgba(23,24,28,.45); }
.rf-line b { font-weight: 700; color: var(--on-glass-1); }
.rf-more { width: 100%; margin-top: 2px; }
.rf-more > summary { cursor: pointer; font-size: 11px; color: var(--on-glass-3);
  list-style: none; -webkit-tap-highlight-color: transparent; }
.rf-more > summary::-webkit-details-marker { display: none; }
.rf-more > summary::before { content: "▸ "; }
.rf-more[open] > summary::before { content: "▾ "; }
.rf-more[open] > summary { color: var(--on-glass-1); }
.rf-full, .rf-hand2 { margin: 7px 0 0; font-size: 11.5px; line-height: 1.75; color: var(--on-glass-3); max-width: 68ch; letter-spacing: .1px; }
.rf-hand-t { display: inline-block; background: rgba(255,255,255,.60); color: var(--ink-1);
  border-radius: var(--r-pill); padding: 1.5px 8px; font-size: 10px; font-weight: 700;
  letter-spacing: .3px; margin-right: 6px; line-height: 1.5; }
.rf-qual { margin: 7px 0 0; font-size: 11px; color: var(--on-glass-3); }
/* L1 行：整行略微抬起，配合排序纪律 */
.rf-l1 { background: rgba(255,255,255,.22); border-radius: var(--r-md); padding: 6px 10px; }
.chip.w { display: inline-block; background: rgba(255,255,255,.55); color: var(--ink-2);
  border: 1px solid rgba(23,24,28,.14); border-radius: var(--r-pill);
  padding: 2.5px 10px; font-size: 11.5px; margin: 3px 5px 3px 0; font-weight: 500; }
.chip.w.rep { background: var(--accent); color: var(--ink-1); border: 1px solid var(--accent-ink);
  font-weight: 700; padding-right: 26px; position: relative;
  box-shadow: 0 1px 3px rgba(20,30,45,.20); }
.chip.w.rep::after { content: "连续错"; position: absolute; right: -5px; top: -9px;
  background: var(--black); color: #fff;
  font-size: 9.5px; font-weight: 700; letter-spacing: .2px; line-height: 1.6;
  padding: 0 5px; border-radius: var(--r-pill);
  box-shadow: 0 0 0 1.5px rgba(255,255,255,.85), var(--shadow-badge); }
.rf-sum { display: flex; gap: 12px; flex-wrap: wrap; font-size: 12px; color: var(--on-glass-3); margin-bottom: 10px; }
.rf-sum b { color: var(--on-glass-1); font-weight: 700; font-variant-numeric: tabular-nums; }
.rf-st { display: inline-block; border-radius: var(--r-pill); padding: 2.5px 9px; font-size: 11.5px; white-space: nowrap; font-weight: 500; letter-spacing: .2px; }
/* 待复测＝唯一「要动手」的状态：实心黄绿 + 深字 + 前置实心点（黄绿语义＝可行动） */
.rf-st.s1 { background: var(--accent); color: var(--ink-1); font-weight: 700; display: inline-flex; align-items: center; gap: 5px; }
.rf-st.s1::before { content: ""; width: 5px; height: 5px; border-radius: var(--r-pill); background: var(--ink-1); flex: 0 0 auto; }
.rf-st.s2 { background: rgba(255,255,255,.55); color: var(--ink-1); }
.rf-st.s3 { background: var(--accent-soft); color: #3F4D0A; box-shadow: inset 0 0 0 1px rgba(90,110,18,.22); }
.rf-line { color: var(--on-glass-1); font-size: 12.5px; }
/* 三科错题页的色相区分：沿用现有配色变量（语=绿、数=橙、英=蓝），不引入新色 */
.rf-yu { color: var(--accent-deep); }
.rf-shu { color: var(--slate-deep); }
.rf-ying { color: var(--slate-mid); }
.rf-hand { display: flex; align-items: center; gap: 10px; flex-wrap: wrap; font-size: 12px; color: var(--on-glass-3); }
.rf-chart-wrap { width: 100%; overflow-x: auto; }
.rf-chart { width: 100%; height: auto; display: block; min-width: 280px; }

/* ===================== 无人机打卡（#drone） ===================== */
.dr-sum { display: flex; gap: 16px; flex-wrap: wrap; background: #fff; border: 1px solid var(--line); border-radius: var(--r-md); padding: 10px 14px; font-size: 13px; margin-bottom: 12px; }
.dr-sum b { font-weight: 650; }
.dr-nav { display: flex; align-items: center; justify-content: center; gap: 14px; margin-bottom: 10px; }
.dr-nav button { background: #fff; border: 1px solid var(--line); border-radius: var(--r-pill); padding: 10px 16px; min-height: 44px; font-size: 13px; cursor: pointer; }
.dr-nav .dr-month { font-size: 15px; font-weight: 600; min-width: 110px; text-align: center; }
.cal-grid { display: grid; grid-template-columns: repeat(7, 1fr); gap: 5px; }
.cal-dow { text-align: center; font-size: 11px; color: var(--muted); padding: 3px 0; }
.cal-day {
  position: relative; min-height: 46px; border-radius: var(--r-sm); border: 1px solid var(--line);
  background: #fff; cursor: pointer; font: inherit; color: #4a5462;
  display: flex; flex-direction: column; align-items: center; justify-content: center; gap: 1px;
}
.cal-day.blank { background: transparent; border-color: transparent; cursor: default; }
.cal-day .d { font-size: 13.5px; font-weight: 600; }
.cal-day .mark { font-size: 9.5px; color: var(--muted); }
.cal-day.done { background: var(--accent-soft); border-color: var(--accent-deep); }
.cal-day.done .mark { color: var(--accent-deep); font-weight: 700; }
.cal-day.sun { background: var(--slate-050); border-color: var(--line); }
.cal-day.sun.done { background: var(--accent-soft); border-color: var(--accent-ink); }
.cal-day.sun .mark { color: var(--accent-ink); }
.cal-day.is-today { box-shadow: 0 0 0 2px var(--slate-deep); }
.dr-tip { font-size: 11.5px; color: var(--muted); margin-top: 10px; }
.dr-err { background: #EFF4F9; border: 1px solid #C3CFDC; border-width: 1.5px; border-color: var(--slate-500); color: var(--ink-1); border-radius: var(--r-sm); padding: 8px 12px; font-size: 12.5px; margin-bottom: 10px; font-weight: 500; }
@media (max-width: 560px) {
  .cal-grid { gap: 4px; }
  .cal-day { min-height: 44px; border-radius: var(--r-sm); }
}

/* ===================== 全局打卡横条（数学 / 英语，页顶最上方） ===================== */
.checkin { margin: 0 0 12px; }
.ck-top {
  display: flex; align-items: center; gap: 8px; flex-wrap: wrap;
  background: #fff; border: 1px solid var(--line); border-radius: var(--r-md); padding: 8px 10px;
}
.ck-sign { font-size: 12.5px; font-weight: 650; color: #3d4653; }
.ck-chip {
  display: inline-flex; align-items: center; gap: 8px;
  background: #fbfcfd; border: 1px solid var(--line); border-radius: var(--r-pill);
  padding: 3px 5px 3px 12px; font-size: 12.5px; color: #4a5462;
}
.ck-chip.on { background: var(--accent-soft); border-color: var(--accent-deep); }
.ck-cname { font-weight: 650; }
.ck-cmeta { color: var(--muted); }
.ck-cmeta b { color: var(--ink); font-weight: 650; }
.ck-muted { color: var(--muted); font-size: 12.5px; }
.ck-err { color: var(--ink-1); font-weight: 700; }
.ck-today {
  border: 1px solid var(--line); background: #fff; border-radius: var(--r-pill);
  min-height: 32px; padding: 0 12px; font: inherit; font-size: 12px; color: #4a5462;
  cursor: pointer; -webkit-tap-highlight-color: transparent; touch-action: manipulation;
  -webkit-appearance: none; appearance: none;
}
.ck-today.on {
  background: linear-gradient(180deg, #DDFA62 0%, var(--accent) 100%);
  border-color: var(--accent-ink); color: var(--ink-1); font-weight: 700;
  box-shadow: 0 2px 8px rgba(180,210,40,.32);
}
.ck-toggle {
  margin-left: auto; border: 1px solid var(--line); background: #fff; border-radius: var(--r-pill);
  min-height: 34px; padding: 0 14px; font: inherit; font-size: 12.5px; color: #42505f;
  cursor: pointer; -webkit-tap-highlight-color: transparent; touch-action: manipulation;
  -webkit-appearance: none; appearance: none;
}
/* hover 只在真 hover 设备生效：触屏上 :hover 会「粘住」留下假高亮 */
@media (hover: hover) and (pointer: fine) {
  .ck-toggle:hover { background: #f4f6f8; }
}
.ck-body { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 12px; margin-top: 10px; }
.ck-board { background: #fff; border: 1px solid var(--line); border-radius: var(--r-md); padding: 10px 12px 12px; min-width: 0; }
.ck-bhead { display: flex; align-items: baseline; justify-content: space-between; gap: 8px; }
.ck-bname { font-size: 13.5px; font-weight: 650; }
.ck-btip { font-size: 11px; color: var(--muted); }
.ck-bsum { font-size: 12px; color: var(--muted); margin: 6px 0 8px; }
.ck-bsum b { color: var(--ink); font-weight: 650; }
.ck-nav { display: flex; align-items: center; justify-content: center; gap: 10px; margin-bottom: 8px; }
.ck-nav button {
  background: #fff; border: 1px solid var(--line); border-radius: var(--r-pill);
  padding: 8px 12px; min-height: 44px; font: inherit; font-size: 12.5px; color: #42505f;
  cursor: pointer; -webkit-tap-highlight-color: transparent; touch-action: manipulation;
  -webkit-appearance: none; appearance: none;
}
.ck-nav .ck-month { font-size: 13.5px; font-weight: 600; min-width: 102px; text-align: center; }
.ck-grid { display: grid; grid-template-columns: repeat(7, minmax(0, 1fr)); gap: 4px; }
.ck-dow { text-align: center; font-size: 11px; color: var(--muted); padding: 2px 0; }
.ck-day {
  position: relative; min-height: 44px; padding: 0;
  border-radius: var(--r-sm); border: 1px solid var(--line); background: #fff;
  font: inherit; color: #4a5462; cursor: pointer;
  display: flex; flex-direction: column; align-items: center; justify-content: center; gap: 0;
  -webkit-tap-highlight-color: transparent; touch-action: manipulation;
  -webkit-appearance: none; appearance: none;
}
.ck-day.blank { background: transparent; border-color: transparent; cursor: default; }
.ck-day .d { font-size: 13px; font-weight: 600; }
.ck-day .mark { font-size: 10px; line-height: 1; color: var(--accent-ink); font-weight: 700; }
.ck-day.done { background: var(--accent-soft); border-color: var(--accent-ink); }
.ck-day.is-today { box-shadow: 0 0 0 2px var(--black); }
.ck-berr {
  background: #EFF4F9; border: 1.5px solid var(--slate-500); color: var(--ink-1);
  border-radius: var(--r-sm); padding: 6px 10px; font-size: 12px; margin-bottom: 8px; font-weight: 500;
}
.ck-retry { border: none; background: var(--black); color: #fff; border-radius: var(--r-pill);
  padding: 8px 16px; font: inherit; font-size: 12.5px; margin-left: 6px; cursor: pointer;
  font-weight: 600; min-height: 36px; box-shadow: 0 2px 8px rgba(20,24,32,.22); }
@media (max-width: 767px) {
  .ck-body { grid-template-columns: 1fr; }
  .ck-toggle { margin-left: 0; }
}
@media (max-width: 560px) {
  .ck-board { padding: 8px 8px 10px; }
  .ck-grid { gap: 3px; }
  .ck-btip { display: none; }
}

/* ===================== 手机专项档（2026-09-28 移动端微调） =====================
   实测基线（headless Chrome 153，375/393/430/768/1024 逐视图）：
   · iPhone 15 竖屏：.hd 高 1266px / 视口 852px → 首屏 9 个视图截图完全一致，
     即「看不到任何视图内容」；iPhone SE 竖屏 1266/667 = 190% 视口。
   · nav 在 ≤900px 换行成 3 行 = 150px 高（375–430px 档）；iPad 竖屏 102px。
   · 命中区 <44 的元素：.cal-cell 16×42、.ck-today 66×32、.ck-toggle 91×34、
     .rf-toggle 54×34、三个 summary 17–23px 高、.cl-note a 38.9px 高。
   本档只做「点得到、不挤压」，不改视觉语言与数据结构。 */

/* ① 手机导航：回到「一行横滑胶囊」——换行 3 行要吃掉 150px 首屏（iPad mini 竖屏 2 行 102px）。
   阈取 767px 而不是 600px：iPhone SE 横屏（667×375）只有 375px 视高，
   2 行导航 = 102px = 27% 视高，实测必须收成 1 行；768px 以上可用宽足够，保持原换行行为。
   route() 里已有「把当前标签滚到可见」的逻辑（navEl.scrollWidth > clientWidth 时触发），
   换行布局下 scrollWidth == clientWidth 永不触发，单行化后自动生效。 */
@media (max-width: 767px) {
  nav { flex-wrap: nowrap; overflow-x: auto; -webkit-overflow-scrolling: touch; }
  nav a { flex: 0 0 auto; }
}

/* ② 打卡月历：375px 下 .ck-day 实测 43.86×44（差 0.14px 达标）→ 收紧格间距换达标 */
@media (max-width: 600px) {
  .ck-grid { gap: 2px; }
}

/* ③ 触控目标补齐到 44×44（按 pointer:coarse，而不是按宽度——
   iPad 竖屏 768/820/1024 同样是触摸设备，光靠 max-width 罩不住）。
   用 (pointer: coarse) 同时排除桌面鼠标：headless 实测开启触摸模拟后
   matchMedia('(pointer:coarse)') = true、(hover:none) = true。 */
@media (pointer: coarse), (max-width: 767px) {
  /* 打卡「今日」按钮 32→44、收起/展开 34→44 */
  .ck-today { min-height: 44px; padding: 0 14px; }
  .ck-toggle { min-height: 44px; }
  /* 错题页「收起/展开」34→44 */
  .rf-toggle { min-height: 44px; }
  /* 重试按钮 36→44 */
  .ck-retry { min-height: 44px; }
  /* 三个折叠开关（详情/清理说明/错题全文）实测仅 17–23px 高，
     是手机上「展开细节」的唯一入口，必须给足高度 */
  .det-more > summary,
  .cl-more > summary,
  .rf-more > summary {
    min-height: 44px; display: flex; align-items: center;
  }
  /* 行内链接（总览页「查看清理台 →」实测 293.8×38.9）：
     行内元素加纵向 padding 只扩命中区、不影响行距/排版。
     12px 而不是 11px：行高 12.5×1.75 = 21.875，11px 时命中高 43.875（仍差 0.1px 达标）。 */
  .cl-note a { display: inline-block; padding: 12px 0; }

  /* ⑤ 周历条：iPad 竖屏同样是触摸设备，且比手机更糟——
     768px 下 21 格平分 736px = 每格 30.3×63.4px（<44）；820px 32.8、1024px 42.5。
     只给 min-width 44px（flex 仍是 base 的 1 1 0）：
     · 挤不下（375–932）→ 撑到 44px 后溢出，由 .cal-strip 横滑承接；
     · 挤得下 → 格子照旧涨满整行、不出现空档。
     gap 5px → 2px：21 格 × 44 + 20 × 5 = 1024，比 iPad Pro 竖屏的 992 可用宽多 32px，
     「差一点点就放得下」会平白多出一条横滑提示；改 2px 后 964 ≤ 992，正好放得下。 */
  .cal-strip { overflow-x: auto; -webkit-overflow-scrolling: touch; gap: 2px; }
  .cal-strip .cal-cell { min-width: 44px; }
}

/* ④ 清理台宽表：375px 下 .wk-scroll 可视 341 / 内容 520（实测），
   原来零提示 → 窄屏补一行滑动提示（桌面不显示，避免噪音）。
   周历条那条提示由 app.js 的 centerStrip() 按「实际是否溢出」开关 .on
   （iPad 1024 竖屏不溢出，就不该显示提示）。 */
.wk-scroll-hint { display: none; }
.wk-scroll-hint.on { display: block; font-size: 11px; color: var(--ink-4); margin: 0 0 6px; }
@media (max-width: 767px) {
  .wk-scroll-hint { display: block; font-size: 11px; color: var(--ink-4); margin: 0 0 6px; }
}
