:root {
  --primary: #1666d6;
  --primary-dark: #0f4ea8;
  --primary-light: #e8f1ff;
  --bg: #f3f6fb;
  --card: #ffffff;
  --text: #1f2937;
  --text-2: #6b7280;
  --text-3: #9ca3af;
  --border: #e6eaf0;
  --success: #18a058;
  --success-bg: #e8f7ee;
  --danger: #e03e3e;
  --danger-bg: #fdecec;
  --warning: #d98a00;
  --warning-bg: #fdf3e2;
  --wechat: #07c160;
  --wechat-dark: #06ad56;
  --radius: 14px;
  --radius-sm: 10px;
  --shadow: 0 2px 12px rgba(20, 40, 80, .06);
  --shadow-lg: 0 8px 30px rgba(20, 40, 80, .12);
  --maxw: 1080px;
  --nav-h: 64px;
  --tab-h: 60px;
}
* { box-sizing: border-box; -webkit-tap-highlight-color: transparent; }
html, body { margin: 0; padding: 0; }
body {
  font-family: -apple-system, BlinkMacSystemFont, "PingFang SC", "Microsoft YaHei", "Segoe UI", Roboto, Helvetica, Arial, sans-serif;
  background: var(--bg);
  color: var(--text);
  font-size: 15px;
  line-height: 1.6;
  -webkit-font-smoothing: antialiased;
}
a { color: var(--primary); text-decoration: none; }
button { font-family: inherit; cursor: pointer; }
.boot { padding: 60px; text-align: center; color: var(--text-2); }

/* ---------- 布局 ---------- */
.app-header {
  position: sticky; top: 0; z-index: 40;
  background: linear-gradient(135deg, var(--primary), var(--primary-dark));
  color: #fff;
  /* 刘海屏/挖孔屏安全区：全屏或 PWA 模式下头部避开摄像头区域（普通浏览器 env()=0 不受影响） */
  height: calc(var(--nav-h) + env(safe-area-inset-top));
  padding: env(safe-area-inset-top) 18px 0;
  display: flex; align-items: center;
  box-shadow: 0 2px 10px rgba(15, 78, 168, .25);
}
.app-header .logo { display: flex; align-items: center; gap: 10px; font-weight: 700; font-size: 17px; }
.app-header .logo .ic { font-size: 22px; }
/* 标题长短两版：答题态右上角有「客服/退出全屏」悬浮按钮，窄屏改用短标题避免被压住 */
.app-header .logo .t-full,
.app-header .logo .t-short { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.app-header .logo .t-short { display: none; }
body.quizzing .app-header .logo { max-width: calc(100% - 172px); }
.app-header .spacer { flex: 1; }
.app-header .right { display: flex; align-items: center; gap: 14px; font-size: 13px; }
.app-header .code-chip {
  background: rgba(255,255,255,.16); padding: 4px 10px; border-radius: 20px;
  font-size: 12px; max-width: 200px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}
.app-header .link { color: #fff; opacity: .9; cursor: pointer; }
.app-header .link:hover { opacity: 1; }
/* 手机端标题栏右侧的「客服」按钮（桌面端隐藏，≤860px 显示） */
.nav-service-mobile {
  display: none; align-items: center; gap: 4px;
  color: #fff; font-size: 13px; cursor: pointer;
  background: rgba(255,255,255,.16); padding: 5px 11px; border-radius: 16px;
  white-space: nowrap; flex-shrink: 0;
}
.nav-service-mobile .ic { font-size: 15px; }
.nav-service-mobile:active { background: rgba(255,255,255,.28); }
/* 图标型手机端按钮（⛶ 全屏 / ⬇ 安装）：只显示图标，节省标题栏宽度 */
.nav-icon-mobile { padding: 5px 9px; }
.nav-icon-mobile .ic { font-size: 16px; line-height: 1; }
/* 仅手机端显示的区块（桌面端隐藏） */
.only-mobile { display: none; }
/* 答题页全屏按钮行 */
/* v=41：答题页手动「⛶ 全屏答题」按钮已移除（开始练习自动全屏 + 右上角悬浮条取代） */

.top-nav { display: none; gap: 4px; }
/* v=252：桌面端判定补一条「有精细指针」通道 —— 窄窗口(未最大化/分屏/侧边栏)的电脑
   也按桌面端处理，避免答题态掉进「零导航出口」的移动端布局。
   ⚠ 手机端 pointer:coarse 不受影响（下面的手机/平板断点已显式限定 coarse）。 */
@media (min-width: 861px), (pointer: fine) {
  .top-nav { display: flex; }
}
.top-nav a {
  color: rgba(255,255,255,.82); padding: 8px 14px; border-radius: 8px;
  font-size: 14px; cursor: pointer; transition: .15s;
}
.top-nav a.active, .top-nav a:hover { background: rgba(255,255,255,.16); color: #fff; }

.container { max-width: var(--maxw); margin: 0 auto; padding: 18px; padding-bottom: calc(var(--tab-h) + env(safe-area-inset-bottom) + 28px); }
.container.no-tab { padding-bottom: 40px; }

/* ---------- 通用组件 ---------- */
.card {
  background: var(--card); border-radius: var(--radius); box-shadow: var(--shadow);
  padding: 18px; margin-bottom: 16px; border: 1px solid var(--border);
}
.card h3 { margin: 0 0 14px; font-size: 16px; display: flex; align-items: center; gap: 8px; }
.card h3 .bar { width: 4px; height: 16px; background: var(--primary); border-radius: 2px; }
.muted { color: var(--text-2); }
.small { font-size: 13px; }
.center { text-align: center; }
.row { display: flex; gap: 12px; flex-wrap: wrap; }
/* 答题操作行：主按钮靠左、退出按钮固定在最右边 */
.row.q-actions { justify-content: space-between; align-items: center; }
.between { display: flex; justify-content: space-between; align-items: center; }
.wrap { flex-wrap: wrap; }

/* 「我的」页头部：有效期 / 授权码 分两行显示。
   有效期行：标签列固定宽度（52px ≈ 「有效期至」4 个汉字 @13px），
             使两行的「取值」左边缘对齐。
   授权码行（v=122）：按用户要求**不再对齐** —— 「授权码」文字与后面的数字
             直接相连、不留空格（改回普通行内文本流，放弃 flex 两列布局）；
             字号保持 11.5px 不变。 */
.me-line { display: flex; align-items: baseline; gap: 6px; line-height: 1.55; }
.me-line .k { flex: 0 0 52px; }
.me-line .v { flex: 1 1 auto; min-width: 0; word-break: break-all; }
.me-code { display: block; font-size: 11.5px; line-height: 1.55; }
.me-code .k, .me-code .v { display: inline; }

.btn {
  display: inline-flex; align-items: center; justify-content: center; gap: 6px;
  border: none; border-radius: var(--radius-sm); padding: 11px 18px;
  font-size: 15px; font-weight: 600; background: var(--primary); color: #fff;
  transition: .15s; user-select: none;
}
.btn:hover { background: var(--primary-dark); }
.btn:active { transform: scale(.98); }
.btn.block { width: 100%; }
.btn.ghost { background: #fff; color: var(--primary); border: 1px solid var(--primary); }
.btn.ghost:hover { background: var(--primary-light); }
.btn.wechat { background: var(--wechat); }
.btn.wechat:hover { background: var(--wechat-dark); }
.btn.light { background: var(--primary-light); color: var(--primary-dark); }
.btn.danger { background: var(--danger); }
.btn.sm { padding: 7px 12px; font-size: 13px; }
.btn:disabled { opacity: .5; cursor: not-allowed; }

.input, .select, textarea {
  width: 100%; padding: 11px 13px; border: 1px solid var(--border); border-radius: var(--radius-sm);
  font-size: 15px; font-family: inherit; background: #fff; color: var(--text); transition: .15s;
}
.input:focus, .select:focus, textarea:focus { outline: none; border-color: var(--primary); box-shadow: 0 0 0 3px var(--primary-light); }
textarea { min-height: 90px; resize: vertical; }

/* v=202：题库管理「全部分类」自定义下拉（触发框红字 + 分类名后显示题量） */
.cat-filter { position: relative; flex: 0 0 auto; min-width: 160px; }
.cat-filter .cat-dd-trigger {
  width: 100%; padding: 11px 13px; border: 1px solid var(--border); border-radius: var(--radius-sm);
  font-size: 15px; font-family: inherit; background: #fff; color: #e53935; cursor: pointer;
  display: flex; align-items: center; justify-content: space-between; gap: 6px; text-align: left;
}
.cat-filter .cat-dd-trigger:focus { outline: none; border-color: var(--primary); box-shadow: 0 0 0 3px var(--primary-light); }
.cat-filter .cat-dd-trigger .caret { color: #e53935; font-size: 12px; line-height: 1; }
.cat-filter .cat-dd-panel {
  position: absolute; top: calc(100% + 4px); left: 0; right: 0; background: #fff; border: 1px solid var(--border);
  border-radius: var(--radius-sm); box-shadow: 0 8px 24px rgba(0,0,0,.12); z-index: 60; max-height: 320px; overflow: auto; padding: 4px;
}
.cat-filter .cat-dd-item {
  display: flex; align-items: center; justify-content: space-between; gap: 10px;
  padding: 9px 12px; border-radius: 8px; cursor: pointer; color: var(--text); font-size: 15px;
}
.cat-filter .cat-dd-item:hover { background: #fff1f0; }
.cat-filter .cat-dd-item .cat-count { font-weight: 700; color: #e53935; flex: none; }
.cat-filter .visually-hidden { position: absolute; width: 1px; height: 1px; padding: 0; margin: -1px; overflow: hidden; clip: rect(0 0 0 0); border: 0; }

.badge { display: inline-block; padding: 2px 9px; border-radius: 20px; font-size: 12px; font-weight: 600; }
.badge.primary { background: var(--primary-light); color: var(--primary-dark); }
.badge.success { background: var(--success-bg); color: var(--success); }
.badge.danger { background: var(--danger-bg); color: var(--danger); }
.badge.warning { background: var(--warning-bg); color: var(--warning); }
.badge.gray { background: #f0f2f5; color: var(--text-2); }

.grid { display: grid; gap: 14px; }
.grid-2 { grid-template-columns: repeat(2, 1fr); }
.grid-3 { grid-template-columns: repeat(3, 1fr); }
.grid-4 { grid-template-columns: repeat(4, 1fr); }
.grid-5 { grid-template-columns: repeat(5, 1fr); }
.grid-6 { grid-template-columns: repeat(6, 1fr); }
/* 3 个入口固定排成 1 行（首页「学习数据」）：
   .grid-3 在平板(≤860px)会变 2 列、手机(≤560px)会变 1 列，
   本类各断点均保持 3 列一行，避免入口被拆行。 */
.grid-3row { grid-template-columns: repeat(3, 1fr); }
/* v=218：首页「学习数据」改为 4 个入口（错题本/报告/收藏夹/备考资料），
   4 张卡片等宽一行排开，各断点均保持 4 列。 */
.grid-4row { grid-template-columns: repeat(4, 1fr); }

/* ---------- 统计卡片 ---------- */
.stat { text-align: center; padding: 14px 8px; }
.stat .num { font-size: 26px; font-weight: 800; color: var(--primary); line-height: 1.2; }
.stat .label { font-size: 13px; color: var(--text-2); margin-top: 4px; }
/* 「我的」页学习情况：时长数字用小一号字（原内联 20px 已迁移到类，便于手机端覆盖） */
.stat .num.num-dur { font-size: 20px; padding-top: 6px; }
/* 长标签短版（学习情况 1 行布局时显示短版，桌面显示长版） */
.stat .label .lb-s { display: none; }

/* 「我的」页学习排名：与学习情况同款的一行图标卡（v=82） */
.rank-box .grid.rank-line { grid-template-columns: repeat(3, 1fr); gap: 8px; margin: 0; }
.rank-stat { padding: 8px 6px; }
.rank-emoji { font-size: 16px; line-height: 1; }
.rank-num { font-size: 17px; font-weight: 800; color: var(--primary); margin-top: 2px; line-height: 1.2; }
.rank-label { font-size: 12px; color: var(--text-2); margin-top: 2px; }
.rank-foot { text-align: center; margin-top: 6px; }

/* ---------- 入口大卡 ---------- */
.entry {
  display: flex; flex-direction: column; align-items: center; justify-content: center; gap: 8px;
  padding: 26px 14px; border-radius: var(--radius); cursor: pointer; text-align: center;
  border: 1px solid var(--border); background: #fff; transition: .18s; position: relative; overflow: hidden;
}
.entry:hover { transform: translateY(-3px); box-shadow: var(--shadow-lg); border-color: var(--primary); }
.entry .emoji { font-size: 40px; }
.entry .t { font-weight: 700; font-size: 16px; }
.entry .d { font-size: 12px; color: var(--text-2); }
.entry .corner { position: absolute; top: 10px; right: 10px; }
/* 练习完成页统计：横向布局，数字在上、文字在下 */
.done-stats { display: flex; max-width: 440px; margin: 14px auto 6px; }
.done-stats .dstat { flex: 1; text-align: center; }
.done-stats .num { font-size: 28px; font-weight: 800; line-height: 1.2; font-variant-numeric: tabular-nums; }
.done-stats .label { font-size: 12px; color: var(--text-2); margin-top: 3px; }
/* 完成页「错误」可点击 → 展开本次错题清单 */
.done-stats .dstat.clickable { cursor: pointer; border-radius: 12px; padding: 6px 2px; transition: background .15s, transform .15s; }
.done-stats .dstat.clickable:active { background: var(--primary-light); transform: scale(.97); }
.wrong-box { margin-top: 18px; padding-top: 14px; border-top: 1px solid var(--border); text-align: left; }
.wb-head { display: flex; align-items: center; justify-content: space-between; gap: 10px; flex-wrap: wrap; margin-bottom: 6px; }
.wrong-item { border: 1px solid var(--border); border-radius: 12px; padding: 12px 14px; margin-top: 10px; background: #fff; }
.wi-head { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; margin-bottom: 8px; }
.wi-q { font-weight: 600; line-height: 1.65; font-size: 14.5px; }
.wi-line { display: flex; gap: 8px; flex-wrap: wrap; margin-top: 10px; }
.wi-tag { font-size: 12px; font-weight: 600; padding: 3px 10px; border-radius: 999px; }
.wi-tag.bad { background: rgba(220, 38, 38, .09); color: var(--danger); }
.wi-tag.good { background: rgba(22, 163, 74, .10); color: var(--success); }
.wi-opt { font-size: 13px; color: var(--text-2); margin-top: 6px; line-height: 1.6; }
.wi-analysis { font-size: 13px; color: var(--text-2); background: var(--primary-light); padding: 8px 10px; border-radius: 8px; margin-top: 9px; line-height: 1.65; }
/* 答题中右上角悬浮条：客服 + 退出全屏（叠在蓝色头部上，头部右侧原有按钮暂时隐藏避免重叠） */
.quiz-float { display: none; position: fixed; top: calc(env(safe-area-inset-top) + 12px); right: 8px; z-index: 60; gap: 6px; }
/* Fullscreen API 全屏时部分浏览器把 env(safe-area-inset-top) 报告为 0 → 顶部被摄像头/刘海遮挡。
   JS（syncFsSafeTop）在进入全屏时把实测 safe-top 注入 --fs-safe-top 并给 body 加 fs-on，
   以下规则兜底；env 正常的浏览器 JS 注入的就是 env 值，效果一致；退出全屏自动还原。 */
body.fs-on .app-header {
  height: calc(var(--nav-h) + var(--fs-safe-top, env(safe-area-inset-top)));
  padding-top: var(--fs-safe-top, env(safe-area-inset-top));
}
body.fs-on .quiz-float { top: calc(var(--fs-safe-top, env(safe-area-inset-top)) + 12px); }
body.fs-on .exam-bar { top: calc(var(--nav-h) + var(--fs-safe-top, env(safe-area-inset-top))); }
body.quizzing .quiz-float { display: flex; }
body.quizzing .app-header .top-nav,
body.quizzing .app-header .nav-service-mobile,
body.quizzing .app-header .code-chip { visibility: hidden; }
.quiz-float .btn {
  background: rgba(255,255,255,.16); color: #fff; border: 1px solid rgba(255,255,255,.38);
  backdrop-filter: blur(4px); -webkit-backdrop-filter: blur(4px); white-space: nowrap;
  /* 缩小按钮，给左侧标题让出空间（窄屏时标题会被压住） */
  padding: 5px 10px; font-size: 12px; line-height: 1.25; border-radius: 8px; gap: 4px;
}
.quiz-float .btn:active { background: rgba(255,255,255,.28); }
/* 全国真题集：真题卷纵向列表 */
/* ===== 真题集 v=134：2 行 × 4 列网格 ===== */
.paper-list { display: grid; grid-template-columns: repeat(4, 1fr); gap: 10px; }
.paper-list .entry { padding: 14px 4px; flex-direction: column; text-align: center; gap: 6px; margin: 0; }
.paper-list .entry .emoji { font-size: 28px; }
.paper-list .entry .t { font-size: 12.5px; line-height: 1.3; }
/* ===== 真题回忆集（v=163）声明块 ===== */
.tp-notice {
  margin: 10px 0 0; padding: 11px 13px; border-radius: 10px;
  background: var(--bg); border: 1px solid var(--border); border-left: 3px solid var(--primary);
  font-size: 13.5px; line-height: 1.75; color: var(--text-2); word-break: break-all;
}
@media (max-width: 560px) { .tp-notice { padding: 10px; font-size: 13px; } }

/* ===== 备考资料（v=218）：资料列表条目 ===== */
.mat-item { cursor: pointer; transition: .18s; }
.mat-item:hover { border-color: var(--primary); box-shadow: var(--shadow-lg); }
.mat-head { display: flex; align-items: center; gap: 13px; }
.mat-cover {
  width: 52px; height: 66px; flex: 0 0 52px; border-radius: 6px; overflow: hidden;
  background: linear-gradient(160deg, var(--primary-light), #fff);
  border: 1px solid var(--border);
  display: flex; align-items: center; justify-content: center;
}
.mat-cover img { width: 100%; height: 100%; object-fit: cover; display: block; }
.mat-cover-ic { font-size: 24px; }
.mat-info { flex: 1; min-width: 0; }
.mat-title { font-size: 15.5px; font-weight: 700; line-height: 1.5; word-break: break-word; }
.mat-desc { margin-top: 3px; line-height: 1.65; }
.mat-meta { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; margin-top: 7px; }
.mat-open-btn { flex: 0 0 auto; }
/* v=224：资料卡片操作区（阅读 + 下载 竖排，窄屏不挤压标题；v=226 文案由「系统打开」改为「下载」） */
.mat-acts { flex: 0 0 auto; display: flex; flex-direction: column; gap: 6px; }
.mat-acts .btn { white-space: nowrap; padding: 7px 11px; font-size: 12.5px; }
@media (max-width: 560px) {
  .mat-head { gap: 10px; }
  .mat-cover { width: 42px; height: 54px; flex-basis: 42px; }
  .mat-cover-ic { font-size: 19px; }
  .mat-title { font-size: 14px; }
  .mat-desc { font-size: 12px; }
  .mat-open-btn { padding: 7px 12px; font-size: 13px; }
  .mat-acts .btn { padding: 6px 10px; font-size: 12px; }
}
/* 今日数字考点卡片（v=169：30 天轮转口令） */
.daily-code-card {
  margin: 16px 0 14px; padding: 13px 15px; border-radius: 12px;
  background: linear-gradient(180deg, var(--primary-light), var(--bg));
  border: 1px solid var(--border); border-left: 3px solid var(--primary);
}
.dc-head { font-size: 13.5px; font-weight: 700; color: var(--primary-dark); display: flex; align-items: center; flex-wrap: wrap; gap: 8px; margin-bottom: 8px; }
.dc-day { font-size: 12px; font-weight: 600; color: var(--text-2); background: #fff; border: 1px solid var(--border); border-radius: 20px; padding: 1px 9px; }
.dc-badge { font-size: 12px; font-weight: 700; color: #b45309; background: #fef3c7; border-radius: 20px; padding: 1px 9px; }
.dc-title { font-size: 15px; font-weight: 700; color: var(--text); margin-bottom: 6px; }
.dc-slogan { font-size: 13.5px; color: var(--primary-dark); font-weight: 600; margin-bottom: 6px; }
.dc-content { font-size: 13px; color: var(--text-2); line-height: 1.75; }
.dc-pass {
  margin-top: 10px; padding: 9px 12px; border-radius: 9px;
  background: #fff; border: 1px dashed var(--primary);
  font-size: 13.5px; color: var(--text); font-weight: 600;
}
.dc-pass b { color: var(--primary); font-size: 18px; letter-spacing: 1px; }
@media (max-width: 560px) { .daily-code-card { padding: 11px 12px; } .dc-pass b { font-size: 17px; } }
/* 真题回忆版说明（仅每组第一题，小字） */
.q-notice { font-size: 12px; color: var(--text-2); background: var(--bg); border-radius: 8px; padding: 8px 10px; margin-bottom: 10px; line-height: 1.6; }

.chip {
  display: inline-flex; align-items: center; gap: 6px; padding: 6px 13px; border-radius: 20px;
  background: #fff; border: 1px solid var(--border); font-size: 13px; cursor: pointer; user-select: none; transition: .15s;
}
.chip.active { background: var(--primary); color: #fff; border-color: var(--primary); }
.chip .cnt { background: rgba(0,0,0,.08); border-radius: 10px; padding: 0 6px; font-size: 11px; }
.chip.active .cnt { background: rgba(255,255,255,.25); }

/* ---------- 题目 ---------- */
.q-type { font-size: 12px; font-weight: 700; padding: 2px 8px; border-radius: 6px; }
.q-type.single, .q-type.judge { background: var(--primary-light); color: var(--primary-dark); }
.q-type.multiple { background: var(--warning-bg); color: var(--warning); }
.q-text { font-size: 16px; font-weight: 600; margin: 12px 0; line-height: 1.7; }
.q-cat { font-size: 12px; color: var(--text-3); }
.option {
  display: flex; align-items: flex-start; gap: 10px; padding: 13px 15px; border: 1px solid var(--border);
  border-radius: var(--radius-sm); margin-bottom: 10px; cursor: pointer; transition: .15s; background: #fff;
}
.option:hover { border-color: var(--primary); }
.option.sel { border-color: var(--primary); background: var(--primary-light); }
.option.correct { border-color: var(--success); background: var(--success-bg); }
.option.wrong { border-color: var(--danger); background: var(--danger-bg); }
.option .mark { width: 22px; height: 22px; border-radius: 50%; border: 1.5px solid var(--text-3); flex: none; display: flex; align-items: center; justify-content: center; font-size: 13px; font-weight: 700; color: var(--text-2); }
.option.sel .mark { background: var(--primary); border-color: var(--primary); color: #fff; }
.option.multi .mark { border-radius: 6px; }
.option.correct .mark { background: var(--success); border-color: var(--success); color: #fff; }
.option.wrong .mark { background: var(--danger); border-color: var(--danger); color: #fff; }
.option .txt { flex: 1; }

.feedback { border-radius: var(--radius-sm); padding: 14px; margin-top: 8px; }
.feedback.ok { background: var(--success-bg); border: 1px solid #b7e3c8; }
.feedback.no { background: var(--danger-bg); border: 1px solid #f3c2c2; }
.feedback .tag { font-weight: 700; margin-bottom: 6px; }
.feedback.ok .tag { color: var(--success); }
.feedback.no .tag { color: var(--danger); }
.feedback .ans { font-size: 13px; }
.feedback .analysis { font-size: 13.5px; color: #374151; margin-top: 8px; line-height: 1.7; }

.progress { height: 8px; background: #eef1f5; border-radius: 6px; overflow: hidden; }
.progress > i { display: block; height: 100%; background: linear-gradient(90deg, var(--primary), #3d8bff); border-radius: 6px; transition: width .3s; }

/* ---------- 模拟考 ---------- */
.exam-bar { position: sticky; top: calc(var(--nav-h) + env(safe-area-inset-top)); z-index: 30; background: #fff; border-bottom: 1px solid var(--border); padding: 10px 18px; display: flex; align-items: center; gap: 12px; }
/* 模拟考结果页：三个按钮（返回首页/再考一次/查看错题）强制一行，窄屏不换行 */
.row.exam-actions { flex-wrap: nowrap; }
.row.exam-actions .btn { flex: 1 1 0; min-width: 0; padding: 10px 4px; font-size: 13px; white-space: nowrap; }
.exam-bar .timer { font-weight: 800; font-size: 18px; font-variant-numeric: tabular-nums; }
.exam-bar .timer.warn { color: var(--danger); animation: blink 1s steps(2) infinite; }
@keyframes blink { 50% { opacity: .45; } }
.answer-card { display: grid; grid-template-columns: repeat(8, 1fr); gap: 8px; }
.answer-card .ans-item { aspect-ratio: 1; display: flex; align-items: center; justify-content: center; border-radius: 8px; border: 1px solid var(--border); font-size: 13px; cursor: pointer; background: #fff; }
.answer-card .ans-item.answered { background: var(--primary); color: #fff; border-color: var(--primary); }
.answer-card .ans-item.cur { outline: 2px solid var(--primary-dark); }
.answer-card.cols5 { grid-template-columns: repeat(5, 1fr); }
.ac-group { margin-bottom: 14px; }
.ac-group:last-child { margin-bottom: 0; }
.ac-label { font-size: 13px; font-weight: 700; color: var(--text-2); margin-bottom: 8px; }

/* ---------- 弹窗 ---------- */
.modal-mask { position: fixed; inset: 0; background: rgba(15,25,45,.45); z-index: 100; display: flex; align-items: center; justify-content: center; padding: 18px; }
.modal { background: #fff; border-radius: var(--radius); width: 100%; max-width: 460px; max-height: 90vh; overflow: hidden; box-shadow: var(--shadow-lg); display: flex; flex-direction: column; }
.modal .modal-head { padding: 16px 18px; border-bottom: 1px solid var(--border); font-weight: 700; display: flex; justify-content: space-between; align-items: center; flex: none; }
.modal .modal-body { padding: 18px; overflow-y: auto; flex: 1 1 auto; min-height: 0; }
.modal .modal-foot { padding: 14px 18px; border-top: 1px solid var(--border); display: flex; gap: 10px; justify-content: flex-end; flex: none; }
/* v=184：弹窗正文变高（如后台编辑题目的解析框 300px）时，改为「正文区独立滚动 + 头尾常驻」，
   避免底部「保存」按钮被推到视口外、需要滚动到底才能点；也避免吸底 footer 盖住最后一个字段。
   内容不高时无感知变化。 */
/* 宽版弹窗（后台题目编辑 / 批量导入）：桌面约 860px，窄屏自动回退全宽 */
.modal.modal-lg { max-width: min(860px, 94vw); }
.modal.modal-lg .modal-body { padding: 22px 26px; }
.modal.modal-lg .modal-head { padding: 16px 26px; }
.modal.modal-lg .modal-foot { padding: 14px 26px; }
@media (max-width: 560px) { .modal.modal-lg { max-width: 100%; } }
  /* 首页小程序上线公告弹窗 */
  .announce { text-align: center; padding: 4px 2px; }
  .announce-emoji { font-size: 42px; line-height: 1; margin-bottom: 6px; }
  .announce-title { font-size: 18px; font-weight: 800; color: var(--primary); margin: 0 0 12px; }
  .announce-line { font-size: 14px; line-height: 1.75; color: var(--text-2); margin: 0 0 8px; }
  .announce-line:last-child { margin-bottom: 0; }
  .announce-foot-btn { flex: 1; }
/* v=123：首页「小程序已上线」公告里的小程序码 */
  .announce .mini-qr { margin-top: 14px; }
  .announce .mini-qr .mq-img {
    width: 148px; height: 148px; object-fit: contain; display: block; margin: 0 auto;
    border: 1px solid var(--border); border-radius: 10px; background: #fff; padding: 4px;
  }
  .announce .mini-qr .mq-cap { font-size: 12px; color: var(--text-3); margin-top: 8px; line-height: 1.6; }
.modal .x { cursor: pointer; color: var(--text-3); font-size: 22px; line-height: 1; }

/* ---------- 支付 ---------- */
.pay-plan { border: 2px solid var(--border); border-radius: var(--radius); padding: 16px; cursor: pointer; position: relative; transition: .15s; }
.pay-plan.active { border-color: var(--wechat); background: #f4fdf8; }
.pay-plan .price { font-size: 26px; font-weight: 800; color: var(--wechat); }
.pay-plan .origin { color: var(--text-3); text-decoration: line-through; font-size: 13px; margin-left: 8px; }
.pay-plan .tag-corner { position: absolute; top: -10px; right: 14px; background: var(--wechat); color: #fff; font-size: 11px; padding: 2px 10px; border-radius: 12px; }
.pay-plans { display: grid; grid-template-columns: repeat(3, 1fr); gap: 12px; }
@media (max-width: 640px){ .pay-plans { grid-template-columns: 1fr; } }

.wx-box { text-align: center; padding: 8px 0; }
.wx-box .amount { font-size: 30px; font-weight: 800; color: var(--danger); margin: 6px 0; }
.qr-wrap { display: flex; justify-content: center; margin: 14px 0; }
.qr-canvas { background: #fff; padding: 12px; border-radius: 12px; border: 1px solid var(--border); }
.wx-tip { color: var(--text-2); font-size: 13px; }
.wx-spin { width: 18px; height: 18px; border: 3px solid #e0e0e0; border-top-color: var(--wechat); border-radius: 50%; display: inline-block; animation: spin 1s linear infinite; vertical-align: middle; }
@keyframes spin { to { transform: rotate(360deg); } }

.code-display { font-size: 24px; font-weight: 800; letter-spacing: 2px; color: var(--primary); background: var(--primary-light); padding: 14px; border-radius: var(--radius-sm); text-align: center; word-break: break-all; }

/* ---------- 结果 ---------- */
.score-ring { width: 150px; height: 150px; margin: 0 auto; position: relative; }
.score-ring .num { position: absolute; inset: 0; display: flex; flex-direction: column; align-items: center; justify-content: center; }
.score-ring .num b { font-size: 38px; font-weight: 800; }
.score-ring .num span { font-size: 12px; color: var(--text-2); }

/* ---------- 表格 ---------- */
table.tbl { width: 100%; border-collapse: collapse; font-size: 13.5px; }
table.tbl th, table.tbl td { padding: 10px 12px; border-bottom: 1px solid var(--border); text-align: left; }
table.tbl th { background: #f7f9fc; color: var(--text-2); font-weight: 600; position: sticky; top: 0; }
.table-scroll { overflow: auto; }
/* 后台宽表：列多时给最小宽度，手机上横向滚动而不是把每列压成竖排文字 */
table.tbl.tbl-wide { min-width: 1340px; }
/* 「用户与设备」表：桌面端取消最小宽度 + 压缩列距/字号，11 列一次性展示完、不再左右拖拉；
   手机端（≤768px）不受影响，仍走 tbl-wide 的最小宽度横向滚动 */
@media (min-width: 769px) {
  table.tbl.tbl-dev { min-width: 0; }
  table.tbl.tbl-dev th { padding: 8px 6px; font-size: 12.5px; }
  table.tbl.tbl-dev td { padding: 8px 6px; font-size: 12.5px; vertical-align: top; }
  table.tbl.tbl-dev td .small, table.tbl.tbl-dev td .muted { font-size: 11.5px; }
  table.tbl.tbl-dev td .mono { font-size: 12.5px; letter-spacing: 0; }
  table.tbl.tbl-dev .btn.sm { padding: 5px 8px; font-size: 12px; }
  table.tbl.tbl-dev .badge { padding: 1px 7px; font-size: 11px; }
  table.tbl.tbl-dev .rm-cell { max-width: 150px; }
}
/* 后台顶部栏目条吸顶：页面下拉后仍固定在蓝色头部下方，随时可点击切换；
   z-index 低于头部(40)与弹窗(100)，高于表格吸顶表头 */
.admin-tabs-card { position: sticky; top: calc(var(--nav-h) + env(safe-area-inset-top) + 8px); z-index: 35; }
/* v=195：管理后台桌面端加宽（默认 --maxw=1080 在宽屏下两侧留白过多）；仅作用于后台，不影响用户端移动优先布局 */
.container.admin-wrap { max-width: 1600px; }
#adminTabs { flex-wrap: wrap; }

/* 首页「答题正确率」卡 */
.acc-card { margin-top: 14px; max-width: 66.7%; margin-left: auto; margin-right: auto; }
.acc-card .between > div:first-child { padding-right: 14px; }
.acc-card .acc-num { font-size: 26px; font-weight: 800; color: var(--primary); letter-spacing: .5px; flex-shrink: 0; line-height: 1.1; margin-left: 8px; }
/* 正确率右侧竖排：百分数 + 清零重置按钮在其正下方 */
.acc-card .acc-side { display: flex; flex-direction: column; align-items: center; gap: 6px; flex-shrink: 0; margin-left: 4px; }
.acc-card .acc-side .acc-num { margin-left: 0; }
.acc-card .acc-side .btn { padding: 4px 10px; font-size: 12.5px; }
.acc-card .acc-progress { margin-top: 12px; height: 10px; border-radius: 6px; }
.acc-card .acc-progress i { background: linear-gradient(90deg, var(--primary), #4a92ef); border-radius: 6px; transition: width .5s ease; }
/* 后台宽表：表头不折行 */
table.tbl th { white-space: nowrap; }
/* 后台用户表：可点击排序列 */
table.tbl th.sortable { cursor: pointer; user-select: none; }
table.tbl th.sortable:hover { color: var(--primary); }
table.tbl th.sortable .sort-ind { font-size: 10px; opacity: .7; margin-left: 2px; }
/* 表格内按钮不折行（否则「开通免口令」会被拆成两行） */
.tbl .btn, .tbl .link-btn { white-space: nowrap; }
/* 备注单元格：人工备注最多显示两行，超出省略（悬停 title 看全文）；系统来源备注作小字 */
.rm-cell { max-width: 190px; max-height: 42px; overflow: hidden; white-space: pre-wrap; word-break: break-word; line-height: 1.5; }
.plain-src { display: inline-block; font-size: 11.5px; color: var(--text-2); }
.modal-body textarea.input { width: 100%; resize: vertical; font-family: inherit; line-height: 1.6; }
/* 后台授权码表：设备ID 用等宽字体便于逐位比对；表格不换行时横向滚动 */
.mono { font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, "Liberation Mono", monospace; letter-spacing: .2px; }
.row-between { display: flex; justify-content: space-between; }
table.tbl td .badge + .mono { margin-top: 4px; display: inline-block; }
table.tbl td .muted { color: var(--text-2); }

/* ---------- 底部Tab（移动端） ---------- */
/* 注意：height 必须把 safe-area 一起算进去，否则 box-sizing:border-box 会把
   padding-bottom 挤进可视高度，iPhone 手势条会压住图标文字。 */
.bottom-tab {
  display: none; position: fixed; bottom: 0; left: 0; right: 0; z-index: 50;
  background: #fff; border-top: 1px solid var(--border);
  height: calc(var(--tab-h) + env(safe-area-inset-bottom));
  padding-bottom: env(safe-area-inset-bottom);
}
.bottom-tab a { flex: 1; display: flex; flex-direction: column; align-items: center; justify-content: center; gap: 2px; color: var(--text-3); font-size: 11px; cursor: pointer; }
.bottom-tab a .ic { font-size: 20px; }
.bottom-tab a.active { color: var(--primary); }
/* 答题/考试进行中：隐藏底部 Tab，避免与题目操作按钮混淆、防止误触切页 */
body.quizzing .bottom-tab { display: none !important; }
body.quizzing .container { padding-bottom: 40px; }
/* 开始练习后：隐藏顶部的「选择分类」卡片，只显示题目 */
body.quizzing #selCard { display: none !important; }

/* ---------- 登录/支付页（独立布局） ---------- */
/* 桌面端：左侧品牌主视觉 + 右侧登录卡，整体居中、干净大气 */
.auth-wrap {
  min-height: 100vh;
  /* v=272：移动端横屏/地址栏收起时 100vh 会大于实际可视高度（多出一段空白滚动）。
     追加 dvh（动态视口高度）：支持的浏览器用它覆盖，不支持的仍用上面的 100vh（渐进增强）。 */
  min-height: 100dvh;
  display: flex; flex-direction: column; align-items: center; justify-content: flex-start; gap: 16px;
  padding: 28px 24px 30px;
  background:
    radial-gradient(1200px 560px at 8% -12%, #cfe0ff 0%, rgba(207,224,255,0) 60%),
    radial-gradient(1000px 520px at 100% 0%, #dbe9ff 0%, rgba(219,233,255,0) 55%),
    radial-gradient(900px 700px at 50% 118%, #e3edff 0%, rgba(227,237,255,0) 60%),
    linear-gradient(165deg, #eef4ff 0%, #f6f8fc 55%, #f2f6fb 100%);
}
/* 登录/购买/后台登录页共用的 .auth-wrap：内部主体用 margin:auto 垂直居中，
   内容超高时 auto 归零，内容从顶部开始，不会被裁切。 */
.auth-wrap > .auth-layout,
.auth-wrap > .auth-card { margin-top: auto; margin-bottom: auto; }
/* 备案信息脚注：登录页/购买页跟随内容流，避免与底部设备条重叠 */
.auth-wrap .site-footer { position: static; margin-top: 2px; }

/* 桌面端两栏布局 */
.auth-layout { display: flex; gap: 24px; align-items: stretch; width: 100%; max-width: 1000px; }

/* 左侧品牌主视觉 */
.auth-hero {
  position: relative; overflow: hidden;
  flex: 1.08; min-width: 0;
  display: flex; flex-direction: column;
  padding: 46px 42px 38px;
  border-radius: 24px;
  color: #fff;
  background: linear-gradient(158deg, #0c3aa8 0%, #1e5ad0 48%, #3f86ea 100%);
  box-shadow: 0 30px 70px rgba(16, 58, 148, .32);
}
/* 细网格纹理，增强质感 */
.auth-hero::before {
  content: ''; position: absolute; inset: 0; z-index: 0; pointer-events: none;
  background:
    repeating-linear-gradient(0deg, rgba(255,255,255,.05) 0 1px, transparent 1px 44px),
    repeating-linear-gradient(90deg, rgba(255,255,255,.05) 0 1px, transparent 1px 44px);
  -webkit-mask-image: radial-gradient(520px 420px at 82% 12%, #000 0%, transparent 78%);
          mask-image: radial-gradient(520px 420px at 82% 12%, #000 0%, transparent 78%);
}
.auth-hero .hero-glow { position: absolute; right: -80px; top: -100px; width: 340px; height: 340px; border-radius: 50%; background: radial-gradient(circle, rgba(255,255,255,.24) 0%, rgba(255,255,255,0) 68%); }
.auth-hero .hero-glow::after { content: ''; position: absolute; left: -130px; bottom: -150px; width: 320px; height: 320px; border-radius: 50%; background: radial-gradient(circle, rgba(255,255,255,.15) 0%, rgba(255,255,255,0) 70%); }
.auth-hero > * { position: relative; z-index: 1; }
.hero-badge { align-self: flex-start; background: rgba(255,255,255,.16); border: 1px solid rgba(255,255,255,.32); border-radius: 999px; padding: 7px 16px; font-size: 13px; letter-spacing: .6px; }
.hero-title { font-size: 34px; line-height: 1.36; margin: 20px 0 14px; font-weight: 800; letter-spacing: .5px; text-shadow: 0 2px 18px rgba(8, 40, 110, .35); }
.hero-sub { font-size: 14.5px; line-height: 1.9; color: rgba(255,255,255,.88); margin: 0 0 24px; max-width: 440px; }
.hero-points { list-style: none; margin: 0 0 28px; padding: 0; display: flex; flex-direction: column; gap: 14px; }
.hero-points li { display: flex; align-items: flex-start; gap: 12px; font-size: 14px; line-height: 1.7; color: rgba(255,255,255,.92); }
.hero-points i { font-style: normal; font-size: 14px; line-height: 1.6; flex-shrink: 0; width: 28px; height: 28px; border-radius: 9px; background: rgba(255,255,255,.18); text-align: center; }
.hero-points b { color: #fff; font-size: 15.5px; }
.hero-stats { margin-top: auto; display: grid; grid-template-columns: repeat(3, 1fr); gap: 12px; border-top: 1px solid rgba(255,255,255,.24); padding-top: 22px; }
.hero-stats div { text-align: center; }
.hero-stats b { display: block; font-size: 30px; font-weight: 800; letter-spacing: .5px; }
.hero-stats span { font-size: 12px; color: rgba(255,255,255,.78); }

/* 右侧登录卡 */
.auth-main { flex: 1; min-width: 0; display: flex; }
.auth-card { background: #fff; border-radius: 24px; box-shadow: 0 24px 64px rgba(23, 58, 130, .14); width: 100%; max-width: 440px; margin: 0 auto; padding: 38px 34px 30px; display: flex; flex-direction: column; }
.auth-card .brand { text-align: center; margin-bottom: 22px; }
.auth-card .brand .logo { font-size: 44px; }
.auth-card .brand h1 { font-size: 19px; margin: 8px 0 4px; }
.auth-card .brand p { color: var(--text-2); font-size: 13px; margin: 0; }
/* 桌面端登录卡标题（移动端由 brand 承担，避免重复） */
.auth-card-title { display: none; }
@media (min-width: 901px) {
  .auth-card-title { display: block; margin-bottom: 20px; padding-bottom: 14px; border-bottom: 1px solid var(--border); }
  .auth-card-title b { display: block; font-size: 17px; margin-bottom: 3px; letter-spacing: .3px; }
  .auth-card-title .small { display: block; }
}

/* 登录卡底部辅助行：咨询反馈按钮居左、立即购买居右 */
.login-aux { display: flex; align-items: center; justify-content: center; gap: 10px; flex-wrap: wrap; margin-top: 16px; }
.login-aux .buy-line { font-size: 13px; color: var(--text-2); }
/* 登录页操作区：「登录并绑定本机」与「咨询反馈」并排一行 —— 等高、垂直居中、整组水平居中 */
.login-actions { display: flex; align-items: center; justify-content: center; gap: 12px; flex-wrap: wrap; }
.login-actions .btn { height: 42px; padding: 0 18px; white-space: nowrap; }
.login-actions #loginBtn { min-width: 152px; }

/* 「咨询反馈」弹窗内的本机标识块（登录页场景，便于找回授权码） */
.svc-device { margin-top: 14px; padding: 12px 14px; background: var(--primary-light); border-radius: 10px; }
.svc-device .sd-label { font-size: 13px; font-weight: 700; color: var(--primary-dark); margin-bottom: 6px; }
.svc-device .svc-device-row { display: flex; align-items: center; gap: 9px; flex-wrap: wrap; }
.svc-device .svc-device-row .mono { font-size: 15px; letter-spacing: .6px; color: var(--primary-dark); }

.link-btn { background: none; border: none; color: var(--primary); font-size: 14px; padding: 0; cursor: pointer; }
/* v=143：题目反馈按钮已反馈态（不可再点） */
.link-btn.fbdone { color: var(--success); opacity: .7; cursor: default; }

/* v=158：后台反馈详情弹窗——回复输入行 + 已发回复列表 */
.fb-reply-row { display: flex; gap: 8px; align-items: flex-end; margin-top: 8px; }
.fb-reply-row textarea.input { flex: 1; min-height: 62px; font-size: 14px; line-height: 1.55; }
.fb-reply-row .btn.sm { flex: 0 0 auto; white-space: nowrap; }
.fb-replied-list { margin-top: 8px; padding-top: 6px; border-top: 1px dashed var(--border, #e6ebf1); }
.fb-replied-list > .small { margin-bottom: 6px; }
@media (max-width: 560px) {
  .fb-reply-row { flex-direction: column; align-items: stretch; }
  .fb-reply-row .btn.sm { width: 100%; }
}

/* v=160：后台题目列表——反馈信息（授权码 + 反馈内容）单独一行、蓝色突出显示 */
.fb-line {
  margin-top: 6px; padding: 7px 10px;
  background: var(--primary-light); border-left: 3px solid var(--primary);
  border-radius: 4px; line-height: 1.6; word-break: break-word;
}
.fb-line .fb-code { color: var(--primary-dark); font-weight: 700; font-size: 12px; font-family: ui-monospace, Menlo, Consolas, monospace; margin-right: 4px; }
.fb-line .fb-text { color: var(--primary); font-size: 12.5px; font-weight: 600; margin-left: 8px; }
.fb-line .fb-replied { display: inline-block; margin-left: 8px; color: var(--success); font-size: 11.5px; font-weight: 600; }

/* 桌面端：左侧已有大标题，右上卡片不再重复品牌区（仅限用户端登录卡） */
@media (min-width: 901px) {
  .auth-card-main .brand { display: none; }
  .auth-card-main { justify-content: center; }
}

/* 「我的」页的设备锁定提示 */
.device-lock-note { background: var(--primary-light); color: var(--primary-dark); font-size: 12.5px; padding: 10px 12px; border-radius: var(--radius-sm); margin: 14px 0; line-height: 1.7; }

/* 平板 / 手机：单栏堆叠，隐藏品牌主视觉 */
@media (max-width: 900px) {
  .auth-wrap { padding: 16px 14px 22px; justify-content: flex-start; gap: 12px; }
  .auth-layout { flex-direction: column; gap: 0; }
  .auth-hero { display: none; }
  .auth-card { max-width: 440px; padding: 26px 20px 20px; border-radius: 18px; }
}
/* 备案信息脚注：固定在视口底部，登录页/购买页展示 */
.site-footer { position: fixed; left: 0; right: 0; bottom: 12px; text-align: center; font-size: 11px; color: #a6adba; line-height: 1.6; padding: 0 16px; z-index: 10; white-space: nowrap; }
.site-footer a { color: #a6adba; text-decoration: none; }
.site-footer a:hover { color: var(--primary); text-decoration: underline; }
.site-footer .sep { margin: 0 8px; opacity: .45; }

/* ===== 客服与公众号 ===== */
/* 客服微信号一行（登录页 / 弹窗通用） */
.service-wechat { display: flex; align-items: center; gap: 10px; flex-wrap: wrap; }
.service-wechat.inline { display: inline-flex; }
.service-wechat.block { display: block; }
.service-wechat.block .sw-label { display: block; font-size: 12px; color: var(--text-2); margin-bottom: 6px; }
.service-wechat.block .sw-id { display: inline-block; margin-right: 10px; }
.sw-label { font-size: 12px; color: var(--text-2); }
.sw-id { font-size: 15px; color: var(--wechat-dark); letter-spacing: .3px; word-break: break-all; }
/* 登录页客服面板 */
.service-panel { margin-top: 16px; padding: 16px; background: #fff; border: 1px solid var(--border); border-radius: var(--radius-sm); }
.service-cols { display: flex; gap: 16px; align-items: flex-start; }
.service-side { flex: 1; min-width: 0; }
/* 公众号二维码 */
.service-qr { text-align: center; flex-shrink: 0; }
.service-qr .sq-title { font-size: 12px; color: var(--text-2); margin-bottom: 7px; }
.service-qr .sq-img { width: 132px; height: 132px; object-fit: contain; border: 1px solid var(--border); border-radius: 8px; background: #fff; display: block; }
.service-qr .sq-cap { font-size: 11.5px; color: var(--text-2); margin-top: 7px; line-height: 1.6; max-width: 150px; }
@media (max-width: 420px) {
  .service-cols { flex-direction: column; align-items: center; }
  .service-side { width: 100%; text-align: center; }
  .service-side .service-wechat.block { text-align: center; }
  .service-qr .sq-img { width: 118px; height: 118px; }
}
/* ---------- 空状态 ---------- */
.empty { text-align: center; padding: 50px 20px; color: var(--text-3); }
.empty .e-ic { font-size: 54px; margin-bottom: 8px; }

/* ---------- Toast ---------- */
#toast { position: fixed; left: 50%; top: 18%; transform: translateX(-50%); z-index: 999; display: flex; flex-direction: column; gap: 8px; align-items: center; pointer-events: none; }
.toast-item { background: rgba(30,40,60,.92); color: #fff; padding: 10px 18px; border-radius: 24px; font-size: 14px; box-shadow: var(--shadow-lg); animation: tin .25s ease; max-width: 90vw; }
.toast-item.err { background: rgba(200,40,40,.95); }
.toast-item.ok { background: rgba(20,140,80,.95); }
@keyframes tin { from { opacity: 0; transform: translateY(-8px); } }

/* ---------- 桌面端：顶部导航，隐藏底部Tab ---------- */
@media (min-width: 861px) {
  .top-nav { display: flex; }
  .bottom-tab { display: none !important; }
  .container { padding-bottom: 40px; }
}
/* ---------- 平板 ---------- */
@media (max-width: 860px) and (min-width: 561px) and (pointer: coarse) {
  .grid-3 { grid-template-columns: repeat(2, 1fr); }
  .grid-4 { grid-template-columns: repeat(2, 1fr); }
  .grid-5, .grid-6 { grid-template-columns: repeat(3, 1fr); }
  .grid-5 .entry, .grid-6 .entry { padding: 16px 8px; }
  .grid-5 .entry .emoji, .grid-6 .entry .emoji { font-size: 30px; }
  .grid-5 .entry .d, .grid-6 .entry .d { display: none; }
  .bottom-tab { display: flex; }
  .nav-service-mobile { display: inline-flex; }
  .only-mobile { display: block; }
}
/* ---------- 手机 ---------- */
@media (max-width: 560px) and (pointer: coarse) {
  /* 注意：这里必须用 padding-top/right/bottom/left 分开写。
     若写成 `padding: 14px` 简写，会把底部 padding-bottom 覆盖成 14px，
     导致固定底栏（bottom-tab）正好压住「提交答案 / 退出」等操作按钮。 */
  .container {
    padding-top: 14px;
    padding-left: 14px;
    padding-right: 14px;
    padding-bottom: calc(var(--tab-h) + env(safe-area-inset-bottom) + 20px);
  }
  .container.no-tab { padding-bottom: 40px; }
  .top-nav { display: none; }
  .bottom-tab { display: flex; }
  /* 长品牌标题（四川政采评审专家续聘练习题库）在窄屏下的自适应 */
  .app-header { padding: env(safe-area-inset-top) 10px 0; }
  .app-header .logo { gap: 5px; min-width: 0; }
  .app-header .logo .ic { font-size: 17px; }
  .app-header .logo .t-full, .app-header .logo .t-short { font-size: 12px; letter-spacing: -.2px; }
  /* 答题态：右上角有「客服/退出全屏」悬浮按钮 → 窄屏改用短标题，完整露出不被压住 */
  body.quizzing .app-header .logo .t-full { display: none; }
  body.quizzing .app-header .logo .t-short { display: inline; }
  body.quizzing .app-header .logo { max-width: calc(100% - 168px); }
  .nav-service-mobile { display: inline-flex; }
  .only-mobile { display: block; }
  .grid-2, .grid-3, .grid-4, .grid-5, .grid-6 { grid-template-columns: 1fr; }
  /* 核心功能：手机端改为左右网格（6 个入口 3 列 × 2 行，无需下滑）
     ⚠️ 必须写在上面的 1fr 规则之后才能覆盖它（同优先级靠后生效） */
  .grid.grid-5, .grid.grid-6 { grid-template-columns: repeat(3, 1fr); gap: 10px; }
  .grid.grid-5 .entry, .grid.grid-6 .entry { padding: 14px 4px; gap: 5px; }
  .grid.grid-5 .entry .emoji, .grid.grid-6 .entry .emoji { font-size: 26px; }
  .grid.grid-5 .entry .t, .grid.grid-6 .entry .t { font-size: 12.5px; line-height: 1.3; }
  .grid.grid-5 .entry .d, .grid.grid-6 .entry .d { display: none; }
  .grid.grid-5 .entry .corner, .grid.grid-6 .entry .corner { font-size: 10px; padding: 1px 5px; top: 4px; right: 4px; }
  /* 首页「学习数据」3 个入口：手机端也保持 1 行 3 列（紧凑样式同核心功能）
     ⚠️ 必须写在上面的 1fr 规则之后才能覆盖它（同优先级靠后生效） */
  .grid.grid-3row { grid-template-columns: repeat(3, 1fr); gap: 10px; }
  .grid.grid-3row .entry { padding: 14px 4px; gap: 5px; }
  .grid.grid-3row .entry .emoji { font-size: 26px; }
  .grid.grid-3row .entry .t { font-size: 12.5px; line-height: 1.3; }
  .grid.grid-3row .entry .d { display: none; }
  .grid.grid-3row .entry .corner { font-size: 10px; padding: 1px 5px; top: 4px; right: 4px; }
  /* 首页「学习数据」4 个入口（v=218）：手机端保持 1 行 4 列
     ⚠️ 4 列比 3 列更窄 → 标题字号略降、间距压缩，避免「题库收藏夹」换行挤压 */
  .grid.grid-4row { grid-template-columns: repeat(4, 1fr); gap: 7px; }
  .grid.grid-4row .entry { padding: 14px 2px; gap: 5px; }
  .grid.grid-4row .entry .emoji { font-size: 24px; }
  .grid.grid-4row .entry .t { font-size: 11.5px; line-height: 1.25; }
  .grid.grid-4row .entry .d { display: none; }
  .grid.grid-4row .entry .corner { font-size: 9.5px; padding: 1px 4px; top: 3px; right: 3px; }
  /* 「我的」页学习情况：5 个统计卡排成 1 行（v=115）
     ⚠️ 必须写在上面的 1fr 规则之后才能覆盖它（同优先级靠后生效） */
  .grid.stat-line { grid-template-columns: repeat(5, 1fr); gap: 4px; }
  .grid.stat-line .stat { padding: 8px 2px; }
  .grid.stat-line .stat .num { font-size: 15px; }
  .grid.stat-line .stat .num.num-dur { font-size: 12px; padding-top: 2px; }
  .grid.stat-line .stat .label { font-size: 10px; margin-top: 2px; line-height: 1.25; }
  .grid.stat-line .stat .label .lb-l { display: none; }
  .grid.stat-line .stat .label .lb-s { display: inline; }
  /* 学习排名：手机端一行 3 卡（与学习情况同处一行布局逻辑，必须写在 1fr 规则之后） */
  .rank-box .grid.rank-line { grid-template-columns: repeat(3, 1fr); gap: 5px; }
  .rank-stat { padding: 5px 2px; }
  .rank-emoji { font-size: 13px; }
  .rank-num { font-size: 13px; }
  .rank-label { font-size: 10px; margin-top: 1px; }
  .rank-foot { font-size: 11px; margin-top: 4px; }
  .card { padding: 15px; }
  .app-header .code-chip { display: none; }
  .answer-card { grid-template-columns: repeat(6, 1fr); }
  .modal { max-width: 100%; }
  .hide-mobile { display: none; }
  /* 答题操作行：窄屏压缩按钮与间距，保证 [◀上一题][提交答案][下一题▶][退出] 单行放下
     （330px 行宽下普通按钮 4 个 + 间距 ≈ 414px 会换行，压缩后 ≈ 286px） */
  .row.q-actions { gap: 8px; }
  .row.q-actions .btn { padding: 8px 9px; font-size: 13px; }
  /* 登录页并排按钮：窄屏压缩，保证 [登录并绑定本机][咨询反馈] 仍能单行并排 */
  .login-actions { gap: 8px; }
  .login-actions .btn { height: 40px; padding: 0 12px; font-size: 14px; }
  .login-actions #loginBtn { min-width: 128px; }
}

/* ---------- v=183：「我的」页手机端紧凑化（一屏显示完，无需下拉） ----------
   需求来源（用户原话）：「手机端，我的页面，页面布局紧凑些，能够一次性显示完该页面所有内容，
   不需要下拉才显示底部的内容」

   ⚠️ 全部规则限定在 .me-page 作用域内 → 只影响「我的」页，零外溢、不动其他页面。
   基线（改造前，390×844 实测）：内容底部 780px / scrollHeight 860px → 超出视口 16px。
   改造后目标：内容底部 ≈ 583px / scrollHeight ≈ 649px
   → 390×844 / 393×851 / 412×915 / 375×667 全部一屏可见。 */

/* 两个操作按钮并排（全端生效，手机端省下一整行 ≈ 44px） */
.me-actions { display: flex; gap: 8px; margin-top: 2px; }
.me-actions .btn { flex: 1 1 0; min-width: 0; padding: 10px 6px; font-size: 14px; }
.me-hello { font-size: 17px; }
.me-note { margin-top: 10px; }

@media (max-width: 560px) {
  /* 容器：上下内边距收紧（底部仍保留 tab-h + 安全区，保证内容不被固定底栏压住） */
  .container.me-page {
    padding-top: 8px;
    padding-bottom: calc(var(--tab-h) + env(safe-area-inset-bottom) + 6px);
  }
  /* 卡片：内边距 15→10/12、外间距 16→8 */
  .me-page .card { padding: 10px 12px; margin-bottom: 8px; }
  .me-page .card h3 { margin: 0 0 8px; font-size: 15px; }
  .me-page .card h3 .bar { height: 14px; }
  /* 顶部问候卡：标题与两行信息的行高收紧 */
  .me-page .me-hello { font-size: 15px; }
  .me-page .me-line { line-height: 1.35; }
  /* ⚠️ 授权码行字号**保持 11.5px 不变**（v=122 用户明确要求，verify_me_header.js 断言此值）
     → 只收紧行高，不改字号 */
  .me-page .me-code { line-height: 1.35; }
  /* 学习情况：5 个统计卡压到一行更紧凑 */
  .me-page .grid.stat-line { gap: 3px; }
  .me-page .grid.stat-line .stat { padding: 6px 1px; }
  .me-page .grid.stat-line .stat .num { font-size: 14px; }
  .me-page .grid.stat-line .stat .label { font-size: 9.5px; margin-top: 1px; line-height: 1.2; }
  /* 正确率进度条：高度与外间距收紧 */
  .me-page .me-acc { margin-top: 6px !important; height: 6px; border-radius: 4px; }
  .me-page .me-acc i { border-radius: 4px; }
  /* 学习排名（周榜/总榜）：行距与卡片压紧 */
  .me-page .rank-box { margin-top: 6px !important; padding-top: 6px !important; }
  .me-page .rank-box .row { gap: 6px; margin-bottom: 5px !important; }
  .me-page .rank-box .grid.rank-line { gap: 4px; }
  .me-page .rank-stat { padding: 4px 1px; }
  .me-page .rank-emoji { font-size: 12px; }
  .me-page .rank-num { font-size: 12px; margin-top: 1px; }
  .me-page .rank-label { font-size: 9.5px; margin-top: 1px; }
  .me-page .rank-foot { font-size: 10px; margin-top: 3px; }
  /* 联系客服：客服微信号标签与号码同行（原为 block 独占一行 ≈ 20px） */
  .me-page .service-wechat.block .sw-label { display: inline; margin-bottom: 0; margin-right: 6px; }
  .me-page .service-wechat.block .sw-id { font-size: 14px; }
  .me-page .me-note { margin-top: 5px; font-size: 11.5px; line-height: 1.5; }
  /* 操作按钮：高度再压一档 */
  .me-actions { gap: 8px; margin-top: 0; }
  .me-page .me-actions .btn { padding: 8px 4px; font-size: 13px; }
}

/* ---------- 统计卡片：可点击 + 手机端紧凑化 ----------
   手机端 .grid-4 被压成 1 列，4 个统计卡竖排占满整屏且不可点击。
   这里让统计行保持 2 列，并改为「数字 + 文字」横向紧凑排布，高度显著下降。
   选择器用 .grid.stat-row（0,2,0）压过 .grid-4（0,1,0），无需 !important。 */
.stat-link { display: block; text-decoration: none; color: inherit; cursor: pointer; }
.stat-link:active { transform: scale(.98); }
/* 免口令引导弹窗提示条 */
.promo-tip { background: var(--primary-light); border-left: 3px solid var(--primary); padding: 10px 12px; border-radius: var(--radius-sm); margin: 0 0 12px; font-size: 14px; }@media (max-width: 560px) {
  /* 顶部 4 个统计卡排成 1 行（v=68）：数字在上、文字在下，紧凑化 */
  .grid.stat-row { grid-template-columns: repeat(4, 1fr); gap: 4px; }
  .grid.stat-row .stat { padding: 8px 2px; display: flex; flex-direction: column; align-items: center; gap: 3px; }
  .grid.stat-row .stat .num { font-size: 17px; }
  .grid.stat-row .stat .label { font-size: 11px; margin-top: 0; line-height: 1.25; }
  /* 正确率卡手机端恢复全宽（2/3 宽仅桌面端生效，避免窄屏挤压内容） */
  .acc-card { max-width: 100%; }
}

/* ---------- 专项题库：分类列表限高内部滚动（v=86） ----------
   分类多达 11 项且名称较长（每项 1～2 行），会把「开始练习」按钮推出首屏。
   这里给分类区限高、内部滚动，题量选择与开始按钮始终可见。
   44vh 兼顾矮屏（568px）与高屏（900px），桌面端封顶 420px 避免过高。 */
#catChips.cat-scroll {
  max-height: 420px;              /* 旧内核兜底 */
  max-height: min(44vh, 420px);   /* 现代内核：随视口高度自适应 */
  min-height: 140px;
  overflow-y: auto;
  -webkit-overflow-scrolling: touch;
  overscroll-behavior: contain;
  padding-right: 2px;
}

/* ===== 题目收藏星标（v=111）===== */
.fav-star {
  border: none; background: transparent; cursor: pointer;
  font-size: 22px; line-height: 1; color: var(--text-3);
  padding: 2px 6px; border-radius: 8px; transition: transform .12s ease, color .12s ease;
}
.fav-star:hover { transform: scale(1.18); }
.fav-star.on { color: #f5a623; }

/* 答错时答案区右下角的「收藏该题」按钮（v=117） */
.fav-add-row { display: flex; justify-content: flex-end; margin-top: 10px; }
.fav-add { white-space: nowrap; }
.fav-add.on { background: #fff7e6; color: #b8860b; border-color: #f0c36a; }

/* ===== 全站错题排行榜（v=111）===== */
/* v=125：周榜 / 总榜 切换 Tab */
.rank-tab { cursor: pointer; user-select: none; }
.rank-tab.active { background: var(--primary); color: #fff; border-color: var(--primary); }
.rank-item { display: flex; gap: 14px; align-items: flex-start; }
.rank-no {
  flex: 0 0 34px; height: 34px; border-radius: 50%;
  display: flex; align-items: center; justify-content: center;
  font-weight: 800; font-size: 16px; color: #fff; background: var(--text-3);
}
.rank-no.rank-1 { background: #e03e3e; }
.rank-no.rank-2 { background: #e8833a; }
.rank-no.rank-3 { background: #e0a93e; }
.rank-main { flex: 1; min-width: 0; }
.rank-q { font-size: 15px; line-height: 1.6; }
.rank-bar {
  position: relative; height: 18px; margin-top: 8px; border-radius: 9px;
  background: var(--bg); overflow: hidden;
}
.rank-bar > i {
  display: block; height: 100%; border-radius: 9px;
  background: linear-gradient(90deg, #ff8a5b, #e03e3e);
}
.rank-rate {
  position: absolute; right: 6px; top: 0; line-height: 18px;
  font-size: 11px; font-weight: 700; color: #fff;
  background: rgba(224, 62, 62, .85); padding: 0 6px; border-radius: 9px;
}
/* ===== 错题榜点击查看正确答案（v=119）===== */
.rank-item { cursor: pointer; }
.rank-tip-row { display: flex; justify-content: flex-end; margin-top: 7px; }
.rank-toggle {
  display: inline-block; font-size: 12px; color: var(--primary);
  white-space: nowrap; font-weight: 600;
  background: var(--primary-light); border-radius: 999px; padding: 3px 10px;
}
.rank-detail {
  margin-top: 10px; padding: 12px; border-radius: 10px;
  background: var(--bg); border: 1px solid var(--border);
}
.rank-detail[hidden] { display: none; }
.rank-opts { display: flex; flex-direction: column; gap: 6px; }
.rank-opts .option { cursor: default; }
.rank-ans {
  margin-top: 10px; font-size: 14px; color: var(--text);
  line-height: 1.6; word-break: break-all;
}
.rank-ans b { color: var(--success); }
.rank-analysis {
  margin-top: 8px; font-size: 13px; line-height: 1.7; color: var(--text-2);
  background: #fff; border-left: 3px solid var(--primary);
  padding: 8px 10px; border-radius: 6px; word-break: break-all;
}
@media (max-width: 560px) {
  .rank-item { gap: 10px; }
  .rank-toggle { font-size: 11.5px; }
  .rank-detail { padding: 10px; }
  .rank-opts .option { padding: 8px 10px; font-size: 13.5px; }
  .rank-ans { font-size: 13.5px; }
}

/* ===== 收藏夹题目详情（v=161）===== */
.fav-item .q-text:hover { color: var(--primary); }
.fav-toggle-hint { cursor: pointer; }
.fav-detail {
  margin-top: 10px; padding: 12px; border-radius: 10px;
  background: var(--bg); border: 1px solid var(--border);
}
.fav-detail[hidden] { display: none; }
.fav-opts { display: flex; flex-direction: column; gap: 6px; }
.fav-opts .option { cursor: default; }
.fav-ans {
  margin-top: 10px; font-size: 14px; color: var(--text);
  line-height: 1.6; word-break: break-all;
}
.fav-ans b { color: var(--success); }
.fav-analysis {
  margin-top: 8px; font-size: 13px; line-height: 1.7; color: var(--text-2);
  background: #fff; border-left: 3px solid var(--primary);
  padding: 8px 10px; border-radius: 6px; word-break: break-all;
}
.fav-source {
  margin-top: 8px; font-size: 12.5px; line-height: 1.6; color: var(--text-3);
  word-break: break-all;
}
@media (max-width: 560px) {
  .fav-detail { padding: 10px; }
  .fav-opts .option { padding: 8px 10px; font-size: 13.5px; }
  .fav-ans { font-size: 13.5px; }
}

/* ===== 学习报告（v=111）===== */
.report-locked { text-align: center; padding: 36px 20px; }
.report-locked .lock-ic { font-size: 44px; }
.report-locked h3 { font-size: 18px; }
.radar-wrap { display: flex; justify-content: center; margin: 10px 0 4px; }
.radar { width: 100%; max-width: 360px; height: auto; }
.radar-grid { fill: none; stroke: #e2e8f2; stroke-width: 1; }
.radar-axis { stroke: #e2e8f2; stroke-width: 1; }
.radar-area { fill: rgba(22, 102, 214, .18); stroke: var(--primary); stroke-width: 2; }
.radar-label { font-size: 11px; fill: var(--text); font-weight: 600; }
.radar-rate { font-size: 10px; fill: var(--text-2); }
.reco-box .chip-list { display: flex; flex-wrap: wrap; gap: 8px; margin: 6px 0 12px; }
.reco-tip { background: var(--primary-light); color: var(--primary-dark); padding: 10px 12px; border-radius: 10px; font-size: 14px; line-height: 1.6; }
.mod-list { display: flex; flex-direction: column; gap: 8px; margin-top: 6px; }
.mod-row { display: flex; align-items: center; gap: 10px; }
.mod-name { flex: 0 0 40%; font-size: 12.5px; color: var(--text); line-height: 1.3; }
.mod-bar { flex: 1; height: 10px; border-radius: 5px; background: var(--bg); overflow: hidden; }
.mod-bar > i { display: block; height: 100%; border-radius: 5px; }
.mod-bar > i.high { background: var(--success); }
.mod-bar > i.mid { background: var(--warning); }
.mod-bar > i.low { background: var(--danger); }
.mod-bar > i.zero { background: #cbd5e1; }
.mod-rate { flex: 0 0 44px; text-align: right; font-size: 13px; font-weight: 700; color: var(--text-2); }

/* ===== 学习报告 v=130（周期 Tab / KPI / 趋势 / 模块掌握度 / 排名 / 行动建议）===== */
.rep-tabs { display: flex; gap: 8px; margin-bottom: 12px; }
.rep-tab { flex: 1; text-align: center; padding: 9px 0; font-size: 14px; border-radius: 18px; cursor: pointer; }
.rep-banner { display: flex; align-items: flex-start; gap: 12px; background: linear-gradient(135deg, var(--primary-light), #fff); border: 1px solid rgba(22,102,214,.18); }
.rep-banner-ic { font-size: 28px; line-height: 1; margin-top: 2px; }
.rep-banner > div:last-child { font-size: 14.5px; line-height: 1.6; color: var(--text); }
.rep-arrow { display: inline-block; font-size: 11px; font-weight: 700; margin-right: 4px; padding: 1px 5px; border-radius: 8px; }
.rep-arrow.up { color: var(--success); background: rgba(22,163,74,.1); }
.rep-arrow.down { color: var(--danger); background: rgba(220,38,38,.1); }
.rep-kpis { display: grid; grid-template-columns: repeat(2, 1fr); gap: 10px; margin-bottom: 2px; }
.rep-kpi { padding: 12px 14px; position: relative; }
.rk-label { font-size: 12px; color: var(--text-2); }
.rk-num { font-size: 26px; font-weight: 800; color: var(--text); line-height: 1.25; margin: 2px 0; }
.rk-unit { font-size: 12px; font-weight: 600; color: var(--text-2); margin-left: 2px; }
.rk-sub { font-size: 11.5px; color: var(--text-2); min-height: 16px; }
.rk-prev { opacity: .85; }
.rep-spark { position: absolute; right: 10px; bottom: 12px; width: 76px; height: 26px; opacity: .8; }
.rep-spark polyline { fill: none; stroke: var(--primary); stroke-width: 1.6; stroke-linejoin: round; }
.rep-chart { width: 100%; height: auto; margin-top: 6px; }
.tl-line polyline { fill: none; stroke: var(--primary); stroke-width: 2; stroke-linejoin: round; }
.tl-dot { fill: #fff; stroke: var(--primary); stroke-width: 2; }
.tl-dot.good { stroke: var(--success); }
.tl-dot.bad { stroke: var(--danger); }
.rep-mods { display: flex; flex-direction: column; gap: 10px; margin-top: 6px; }
.rep-mod { background: var(--bg); border-radius: 10px; padding: 10px 12px; }
.rep-mod.clickable { cursor: pointer; transition: transform .12s ease, box-shadow .12s ease; }
.rep-mod.clickable:active { transform: scale(.985); }
.rm-head { display: flex; justify-content: space-between; align-items: center; margin-bottom: 6px; }
.rm-name { font-size: 13.5px; font-weight: 700; color: var(--text); }
.rm-rate { font-size: 13px; font-weight: 800; }
.rm-rate.high { color: var(--success); }
.rm-rate.mid { color: var(--warning); }
.rm-rate.low { color: var(--danger); }
.rm-bar { height: 8px; border-radius: 4px; background: #e5eaf2; overflow: hidden; margin-bottom: 6px; }
.rm-bar > i { display: block; height: 100%; border-radius: 4px; }
.rm-bar > i.high { background: var(--success); }
.rm-bar > i.mid { background: var(--warning); }
.rm-bar > i.low { background: var(--danger); }
.rep-ranks { display: grid; grid-template-columns: repeat(3, 1fr); gap: 8px; margin-top: 6px; }
.rep-rank { text-align: center; padding: 12px 4px; margin: 0; }
.rr-num { font-size: 22px; font-weight: 800; color: var(--primary); }
@media (max-width: 560px) {
  .rep-kpi { padding: 10px 12px; }
  .rk-num { font-size: 22px; }
  .rep-spark { right: 8px; bottom: 10px; width: 60px; height: 22px; }
  .rep-ranks { gap: 6px; }
  .rr-num { font-size: 19px; }
  .rep-rank { padding: 10px 2px; }
  .rep-rank .small { font-size: 11px; }
}

/* v=135 学习报告分享海报 */
/* v=137：图片限高完整可见（弹窗按钮不用滚动即达），长按保存的仍是 750 宽原图 */
.poster-prev { text-align: center; }

/* ===== v=142 任务1：Hero 战报区（独立区块，与雷达图互不影响）===== */
.hero-card {
  position: relative; overflow: hidden; text-align: center; color: #fff;
  border-radius: 16px; padding: 26px 18px 18px; margin-bottom: 12px;
  background: linear-gradient(135deg, #1E3A8A 0%, #7C3AED 100%);
  box-shadow: 0 10px 26px rgba(30, 58, 138, .28);
  -webkit-touch-callout: none; -webkit-user-select: none; user-select: none;
  cursor: pointer;
}
.hero-deco { position: absolute; border-radius: 50%; pointer-events: none; }
.hero-deco.d1 { width: 190px; height: 190px; left: -60px; top: -70px; background: rgba(255,255,255,.08); }
.hero-deco.d2 { width: 240px; height: 240px; right: -90px; bottom: -110px; background: rgba(255,255,255,.06); }
.hero-title { position: relative; font-size: 12.5px; letter-spacing: 1.5px; opacity: .82; }
.hero-badge {
  position: relative; display: inline-flex; align-items: center; gap: 10px;
  margin: 18px 0 12px; padding: 12px 28px; border-radius: 999px;
  background: rgba(255,255,255,.15); border: 1px solid rgba(255,255,255,.38);
  animation: heroPop .6s cubic-bezier(.34, 1.56, .64, 1) both;
}
.hero-badge .hb-ic { font-size: 30px; line-height: 1; }
.hero-badge .hb-name { font-size: 21px; font-weight: 800; letter-spacing: 1px; text-shadow: 0 2px 8px rgba(0,0,0,.18); }
@keyframes heroPop {
  0% { transform: scale(.4); opacity: 0; box-shadow: 0 0 0 rgba(255,255,255,0); }
  60% { transform: scale(1.08); }
  100% { transform: scale(1); opacity: 1; box-shadow: 0 0 26px rgba(255,255,255,.35); }
}
.hero-beat { position: relative; font-size: 15px; opacity: .96; }
.hero-beat b { font-size: 21px; color: #fde68a; font-weight: 800; }
.hero-hint { position: relative; margin-top: 16px; font-size: 11px; opacity: .55; letter-spacing: .5px; }

/* ===== v=142 任务2：能力雷达图（独立区块，与 Hero 互不影响）===== */
.radar-dims { display: grid; grid-template-columns: repeat(auto-fit, minmax(148px, 1fr)); gap: 8px; margin-top: 10px; }
.radar-dim { text-align: left; background: var(--bg); border: 1px solid var(--line); border-radius: 10px; padding: 9px 11px; cursor: pointer; font: inherit; color: inherit; }
.radar-dim:active { transform: scale(.985); }
.radar-dim.todo { border-style: dashed; opacity: .72; }
.rd-name { font-size: 13px; font-weight: 700; color: var(--text); display: flex; justify-content: space-between; align-items: baseline; gap: 6px; }
.rd-val { font-size: 13px; font-weight: 800; color: var(--primary); flex: none; }
.radar-dim.todo .rd-val { color: var(--text-2); font-weight: 600; }
.rd-sub { display: block; font-size: 11px; color: var(--text-2); margin-top: 3px; }
.radar-grade { font-size: 27px; font-weight: 800; color: var(--primary); margin: 0 8px; vertical-align: -2px; }
/* v=201：雷达图例改为醒目提示框（橙色描边），避免长页面中被忽略；兼容旧 .small.muted.center 语义 */
.radar-tip {
  margin-top: 10px; padding: 8px 12px;
  border: 1px solid #FCD34D; border-left: 3px solid #F59E0B;
  background: #FFFBEB; border-radius: 10px;
  text-align: center; font-size: 12.5px; line-height: 1.6; color: #B45309;
}
.radar-svg .radar-anim { transform-box: fill-box; transform-origin: center; animation: radarIn .8s ease-out both; }
@keyframes radarIn { from { transform: scale(.15); opacity: 0; } to { transform: scale(1); opacity: 1; } }
.kpi3 { grid-template-columns: repeat(3, 1fr); }

/* ===== v=187：学习报告页 · 分类统计区改版 =====
   改版前：5 张样式相同的灰色卡片纵向堆叠（.radar-dims grid，375px 手机上 1 列 5 行，高 ≈383px，占近一屏）。
   改版后：1 个白色圆角容器（16px）+ 5 行紧凑条目，行高 44px，行间 1px #F0F0F0 分割线。
   ⚠️ 行高 44px 而非指令初稿的 64px —— 经实测 5×64+小结 ≈ 403px，比改版前还高，
      与「总高度 ≤ 改版前 40%」的验收标准数学冲突；44px 方案实测 ≈254px（减 34%），
      用户已确认按 44px 执行，其余字号要求（名称15px/进度条6px/正确率18px/作答数12px）全部保留。
   ⚠️ 旧 class（.radar-dims/.radar-dim/.rd-name/.rd-val）保留 —— 历史验证脚本
      （v=142 / v=169）依赖 .radar-dim / .radar-dim.todo / .rd-name 钩子，不可删除。
      ⚠️ .radar-dims 容器 class 已与 .dim-list 并存于同一元素（v=142 用
         document.querySelector('.radar-dims').closest('.card') 取卡片文本；
         容器若改名会 null 抛错）→ 必须显式覆盖旧 grid 布局，见下方 .dim-list.radar-dims。 */
.dim-summary {
  margin: 6px 0 4px; text-align: center; font-size: 13px; color: var(--text-2);
  line-height: 1.4;
}
.dim-list {
  background: #fff; border-radius: 16px; overflow: hidden;
  border: 1px solid #F0F0F0;
}
/* 覆盖 v=142 旧 .radar-dims 的 grid 布局（auto-fit / minmax(148px,1fr) / gap 8px / margin-top 10px） */
.dim-list.radar-dims { display: block; grid-template-columns: none; gap: 0; margin-top: 0; }
.dim-row {
  display: flex; align-items: center; gap: 10px;
  width: 100%; min-height: 43px; padding: 0 14px;
  background: #fff; border: 0; border-bottom: 1px solid #F0F0F0;
  font: inherit; color: inherit; text-align: left; cursor: pointer;
}
.dim-row:last-child { border-bottom: 0; }
.dim-row:active { background: #FAFAFA; }
/* 覆盖 v=142 旧卡片样式（.radar-dim）：旧的是灰底+虚线边框+圆角，这里改为行式 */
.radar-dim.dim-row { background: #fff; border: 0; border-bottom: 1px solid #F0F0F0; border-radius: 0; padding: 0 14px; text-align: left; }
.radar-dim.dim-row:last-child { border-bottom: 0; }
/* .todo 语义 = 「未点亮雷达」（作答 < 20 题），旧样式是虚线边框 + 半透明 + 数字变细；
   行式布局下改为「数字弱化」而非整行虚线。⚠️ 必须同时覆盖 .rd-val 的 font-weight，
   否则旧规则（.radar-dim.todo .rd-val 特异性 0,3,0）会压过 .dim-row .rd-val（0,2,0）
   → 待加强行的正确率字重掉到 600，违反「正确率 18px 800」。 */
.radar-dim.dim-row.todo { border-style: solid; opacity: 1; }
/* 旧规则 .radar-dim:active { transform: scale(.985) } 是为独立卡片设计的；
   行式布局下按压缩放整行会导致分割线错位 → 行式统一取消缩放，仅保留背景高亮 */
.radar-dim.dim-row:active { transform: none; }
.radar-dim.dim-row.todo:active { transform: none; }
.radar-dim.dim-row.todo .rd-val { font-weight: 800; }
.radar-dim.dim-row.todo .rd-name { font-weight: 700; }
.dim-row .dr-name {
  flex: none; width: auto; min-width: 62px; max-width: 132px;
  display: flex; align-items: center; gap: 5px;
  font-size: 15px; font-weight: 700; color: var(--text);
  white-space: nowrap; line-height: 1.2;
}
.dim-row .rd-name { display: inline; font-size: 15px; font-weight: 700; color: var(--text); line-height: 1.2; }
.dim-row .dr-tag {
  flex: none; font-size: 10px; font-weight: 700; color: #fff; background: #FF9F0A;
  border-radius: 4px; padding: 1px 4px; line-height: 1.3; white-space: nowrap;
  align-self: center;
}
.dim-row .dr-bar {
  flex: 1 1 auto; min-width: 40px; height: 6px; border-radius: 3px;
  background: #EEEEEE; overflow: hidden; display: block;
}
.dim-row .dr-bar > i { display: block; height: 100%; border-radius: 3px; transition: width .6s ease; }
.dim-row .dr-rate {
  flex: none; width: 56px; text-align: right;
  font-size: 18px; font-weight: 800; line-height: 1;
}
/* 覆盖 v=142 的 .rd-val（旧为 flex:none 小字） */
.dim-row .rd-val { flex: none; width: 56px; text-align: right; font-size: 18px; font-weight: 800; line-height: 1; }
.dim-row .dr-count {
  flex: none; width: 52px; text-align: right;
  font-size: 12px; color: #999999; white-space: nowrap;
}
.dim-row.empty .dr-name { color: var(--text-2); }
.dim-row.empty .dr-rate { font-size: 15px; }
/* 小屏（iPhone SE 等 ≤360px）：收窄名称与数字列，保证不换行不错位 */
@media (max-width: 360px) {
  .dim-row { gap: 8px; padding: 0 11px; }
  .dim-row .dr-name { min-width: 56px; max-width: 118px; font-size: 14px; }
  .dim-row .rd-name { font-size: 14px; }
  .dim-row .dr-rate, .dim-row .rd-val { width: 48px; font-size: 16px; }
  .dim-row .dr-count { width: 46px; font-size: 11px; }
}
.next-level { border: 1.5px dashed rgba(99, 102, 241, .55); background: rgba(99, 102, 241, .06); }
@media (max-width: 380px) {
  .kpi3 { gap: 6px; }
  .kpi3 .rk-num { font-size: 19px; }
}

/* ===== v=146 每日练习动态（柱状图替代原近8周折线）===== */
.d7-tabs { display: flex; gap: 0; }
.d7-tabs .chip { cursor: pointer; padding: 5px 12px; font-size: 12px; }
.d7-tabs .chip:first-child { border-radius: 14px 0 0 14px; }
.d7-tabs .chip:last-child { border-radius: 0 14px 14px 0; }
.d7-chart { margin-top: 10px; padding-top: 30px; }
.d7-plot { position: relative; height: 168px; margin-left: 34px; }
.d7-grid { position: absolute; left: 0; right: 0; border-top: 1px dashed var(--line); pointer-events: none; }
.d7-grid span { position: absolute; left: -32px; top: -8px; width: 26px; text-align: right; font-size: 10.5px; color: var(--text-2); }
.d7-cols { position: absolute; inset: 0; display: flex; align-items: flex-end; }
.d7-col { flex: 1; position: relative; height: 100%; display: flex; align-items: flex-end; justify-content: center; }
.d7-bar { width: 58%; max-width: 34px; min-height: 8px; background: linear-gradient(180deg, #8B5CF6 0%, #6366F1 100%); border-radius: 6px 6px 2px 2px; transform-origin: bottom; animation: d7BarUp .4s cubic-bezier(.25, .8, .35, 1) both; }
.d7-bar.today { box-shadow: 0 0 12px rgba(139, 92, 246, .55); }
.d7-bar.d7-empty { height: 4px; min-height: 4px; padding: 0; background: #E2E8F0; border-radius: 2px; animation: none; box-shadow: none; pointer-events: none; }
@keyframes d7BarUp { from { transform: scaleY(0); } to { transform: scaleY(1); } }
.d7-bubble { position: absolute; left: 50%; transform: translateX(-50%); background: #7C3AED; color: #fff; font-size: 11px; font-weight: 700; padding: 2px 9px; border-radius: 999px; white-space: nowrap; z-index: 2; box-shadow: 0 2px 8px rgba(124, 58, 237, .35); }
.d7-xrow { display: flex; margin-left: 34px; margin-top: 6px; }
.d7-x { flex: 1; text-align: center; font-size: 10.5px; color: var(--text-2); }
.d7-x.today { color: #7C3AED; font-weight: 700; }
.d7-incentive { text-align: center; padding: 22px 16px; }
.d7-progress { height: 8px; background: #E5EAF2; border-radius: 4px; overflow: hidden; margin: 12px auto 6px; max-width: 260px; }
.d7-progress i { display: block; height: 100%; background: linear-gradient(90deg, #6366F1, #8B5CF6); border-radius: 4px; transition: width .5s ease; }
.poster-prev img { width: auto; max-width: 100%; max-height: 52vh; border-radius: 10px; box-shadow: 0 4px 18px rgba(0,0,0,.25); display: inline-block; }

/* ===== v=170「我的反馈回复」页 ===== */
.mf-item { margin-bottom: 10px; }
.mf-item.has-unread { border-left: 3px solid var(--danger); }
.mf-mine { font-size: 13.5px; color: var(--text-2); }
.mf-reply { font-size: 14px; }
@media (max-width: 560px) {
  .mf-item { padding: 12px 13px; }
  .mf-reply { padding: 9px 10px; }
}

/* ===== v=248 考前冲刺页：开放说明条 + 倒计时提示卡 ===== */
.sp-open-note {
  margin: 0 0 14px;
  padding: 9px 13px;
  border-left: 3px solid var(--primary);
  background: var(--primary-light);
  border-radius: 0 8px 8px 0;
  font-size: 13px;
  line-height: 1.7;
  color: var(--primary-dark);
}
.sp-open-note b { color: var(--primary); font-weight: 700; }
.sp-lock {
  display: flex;
  align-items: center;
  gap: 12px;
  margin: 0 0 14px;
  padding: 13px 16px;
  background: #fff7ed;
  border: 1px solid #fed7aa;
  border-radius: 12px;
}
.sp-lock-ic { font-size: 21px; line-height: 1; }
.sp-lock-main { font-size: 14.5px; font-weight: 600; color: #9a3412; white-space: nowrap; }
.sp-lock-main b { font-size: 20px; font-weight: 700; color: #ea580c; margin: 0 2px; }
.sp-lock-sub { font-size: 12.5px; color: #b45309; opacity: .85; margin-left: auto; text-align: right; }
.sp-lock-ok { background: #f0fdf4; border-color: #bbf7d0; }
.sp-lock-ok .sp-lock-main { color: #15803d; }
.sp-lock-ok .sp-lock-sub { color: #15803d; }
@media (max-width: 560px) {
  .sp-open-note { font-size: 12.5px; padding: 8px 11px; }
  .sp-lock { flex-wrap: wrap; gap: 8px; padding: 12px 13px; }
  .sp-lock-sub { margin-left: 34px; text-align: left; }
}

/* ===== v=249 · 电脑端答题态恢复右上角栏目 =====
   背景：v=163 起，为避免「客服/退出全屏」悬浮条(.quiz-float)与顶栏重叠，答题时把整条
   .top-nav 隐藏（visibility:hidden）。但桌面端（≥861px）唯一导航就是 .top-nav
   （.bottom-tab 被 display:none!important 隐藏）→ 电脑端在「习题练习 / 精品拓展题库 /
   真题回忆集 / 考前冲刺 / 报告专练 / 收藏夹专练 / 单题重做」等答题页完全看不到右上角
   栏目，也无法切到其它页面（用户 v=249 反馈）。
   处理：① 恢复 .top-nav 可见；② 顶栏右侧给 .quiz-float 留出空位，两者不重叠；
        ③ 桌面端浮条里的「💬客服」隐藏（顶栏「联系客服」已有同一入口），只留「⛶ 全屏」。
   ⚠ 模拟考答题页顶栏刻意不放栏目（沉浸式，倒计时/交卷在其内）→ 无 nav 元素，不受影响。
   ⚠ 平板/手机端（≤860px）仍走底部 Tab，行为保持不变。 */
/* v=252：窄窗口(≤860px)但**有精细指针**的电脑 → 答题态用**小号文字栏目**。
   · 保留中文文字（12px）而非图标化 —— 用户要的是「看得见栏目」，文字最直观；
   · 横向可滚动（窗口再窄也不丢栏目）+ 悬停气泡提示当前项；
   · logo 压缩为短标题、顶栏右侧给浮条留位，两者不重叠。 */
@media (max-width: 860px) and (pointer: fine) {
  body.quizzing .app-header .top-nav {
    visibility: visible;
    display: flex;
    gap: 2px;
    /* ⚠ v=252：不设 overflow-x —— 横向裁剪会把纵向也变成 auto，
       导致 ::after 悬停气泡被裁掉（实测裁剪）。
       521~860px 靠缩小字号让 6 项自然排下；≤520px 再另开一档启用横向滚动。 */
    max-width: 52vw;
    padding-bottom: 1px;
  }
  body.quizzing .app-header .top-nav a {
    padding: 6px 7px;
    font-size: 12px;
    white-space: nowrap;
    position: relative;
  }
  /* 当前页高亮：图标化会丢失背景提示，这里加底部指示线 */
  body.quizzing .app-header .top-nav a.active { box-shadow: inset 0 -2px 0 rgba(255,255,255,.85); }
  /* 悬停气泡：显示完整栏目名（attr(data-label) 由 JS 写入） */
  body.quizzing .app-header .top-nav a::after {
    content: attr(data-label);
    position: absolute;
    top: calc(100% + 3px);
    left: 50%;
    transform: translateX(-50%);
    background: rgba(20,30,48,.94);
    color: #fff;
    font-size: 12px;
    line-height: 1.4;
    padding: 3px 8px;
    border-radius: 6px;
    white-space: nowrap;
    opacity: 0;
    pointer-events: none;
    transition: opacity .12s;
    z-index: 6;
  }
  body.quizzing .app-header .top-nav a:hover::after { opacity: 1; }
  /* logo 压缩为短标题，给栏目腾地方 */
  body.quizzing .app-header .logo { max-width: 28vw; }
  body.quizzing .app-header .logo .t-full { display: none; }
  body.quizzing .app-header .logo .t-short { display: inline; }
  /* 桌面端浮条只留「⛶全屏」（客服入口栏目里已有） */
  body.quizzing #qfService { display: none; }
  /* 顶栏右侧给浮条留位，避免压住栏目最后一项 */
  body.quizzing .app-header { padding-right: 78px; }
}

/* v=252：极窄窗口（≤520px）才启用横向滚动；此时气泡不可用（被滚动容器裁剪）→ 直接关掉 */
@media (max-width: 520px) and (pointer: fine) {
  body.quizzing .app-header .top-nav {
    overflow-x: auto;
    scrollbar-width: none;
    -ms-overflow-style: none;
    -webkit-overflow-scrolling: touch;
    max-width: 46vw;
  }
  body.quizzing .app-header .top-nav::-webkit-scrollbar { display: none; }
  body.quizzing .app-header .top-nav a::after { display: none; }
}

@media (min-width: 861px) {
  body.quizzing .app-header .top-nav { visibility: visible; }
  /* 右侧留出 .quiz-float 空间，避免压住最后一栏。
     ⚠ v=275：本条 padding-right 会被文件末尾「按实测宽度让位」的新规则覆盖（值更准，自适应按钮数）。 */
  body.quizzing .app-header { padding-right: 104px; }
  /* 恢复栏目后 logo 不必再压缩到 172px 以内 */
  body.quizzing .app-header .logo { max-width: 46%; }
  /* 浮条客服入口与顶栏「联系客服」重复，桌面端只留全屏按钮 */
  body.quizzing #qfService { display: none; }
  /* v=275：桌面端不需要「锁横屏」（屏幕本来就是宽的，锁了反而把窗口转竖）→ 与客服一样隐藏 */
  body.quizzing #qfRotate { display: none; }
}

/* ==========================================================================
   v=272 · 手机端横屏适配（竖屏 / 横屏都能正常显示）
   --------------------------------------------------------------------------
   修的三个真实问题：
   ① manifest.json 原写死 "orientation":"portrait" → 安卓「添加到主屏幕」后
      PWA 被锁死竖屏，手机物理旋转无反应 → 已改为 "any"（见 manifest.json）。
   ② 横屏时刘海/挖孔在**左右两侧**（env(safe-area-inset-left/right) ≠ 0），
      而原 CSS 只处理了 top/bottom → 横屏下标题、底栏图标可能被刘海压住。
   ③ 横屏可视高度只有 320~430px，顶栏 64px + 底栏 60px 白占约 1/3 屏。
   ⚠️ 本块必须放在文件**末尾**：要覆盖前面的手机/平板断点（同优先级靠后生效）。
   ⚠️ 只限定 pointer:coarse → 电脑窄窗口、平板、桌面布局完全不受影响
      （维持 v=252「宽度或指针」的桌面判定口径不变）。
   ========================================================================== */
@media (orientation: landscape) and (pointer: coarse) {
  /* ① 横屏压缩顶栏/底栏，把高度让给内容 */
  :root { --nav-h: 52px; --tab-h: 50px; }

  /* ② 刘海在左右：头部与内容区补安全区内边距
        （env() 在无刘海设备 = 0 → 与竖屏表现完全一致，无副作用） */
  .app-header {
    padding-left: calc(18px + env(safe-area-inset-left));
    padding-right: calc(18px + env(safe-area-inset-right));
  }
  .container {
    padding-top: 12px;
    padding-left: calc(18px + env(safe-area-inset-left));
    padding-right: calc(18px + env(safe-area-inset-right));
  }
  /* ⚠️ 底栏必须分属性写：用 padding 简写会覆盖 padding-bottom: env(safe-area-inset-bottom)（手势条） */
  .bottom-tab {
    padding-left: env(safe-area-inset-left);
    padding-right: env(safe-area-inset-right);
  }

  /* ③ 横屏高度紧张：卡片纵向留白收紧（内容照常滚动，不裁切） */
  .card { padding: 14px 16px; margin-bottom: 12px; }

  /* ④ 弹窗：横屏可视高度小 → 提高占高比例，正文区自行滚动（头部/底部常驻） */
  .modal { max-height: 94vh; }
}

/* 横屏 + 窄屏机型（≤560px 手机横放）：左右留白沿用手机端的更紧凑值 */
@media (orientation: landscape) and (max-width: 560px) and (pointer: coarse) {
  .app-header {
    padding-left: calc(10px + env(safe-area-inset-left));
    padding-right: calc(10px + env(safe-area-inset-right));
  }
  .container {
    padding-left: calc(14px + env(safe-area-inset-left));
    padding-right: calc(14px + env(safe-area-inset-right));
  }
}

/* ==========================================================================
   v=275 · 答题页悬浮条不再遮挡标题
   问题：.quiz-float 是 position:fixed; right:8px 的悬浮条（客服 / 横屏 / 退出全屏），
        它是**盖**在标题栏上的（不是把标题挤窄），手机上三个文字按钮直接把左边的
        标题压住了（用户 v=275 反馈：「客服，横屏，退出全屏，这3个词语挡住了左边的标题」）。
        另有一个隐性挤压：答题态标题栏里的「💬客服 / ↔横屏 / ⛶全屏 / ⬇安装」与授权码
        芯片只是 visibility:hidden → **仍占位**，把标题挤窄。
   做法（与 v=272 横屏块一样，必须放在文件**末尾**才能覆盖前面的手机/平板/横屏断点）：
     ① 手机端浮条只留图标（.qft 文字标签隐藏，title/aria-label 保留完整含义）；
        「↔ 横屏」保留文字（需体现当前方向状态），「💬 客服」「⛶ 全屏」转纯图标；
     ② JS（syncQuizFloatWidth）实测浮条宽度写入 --quiz-float-w，
        标题栏按实测值预留 padding-right → 浮条与标题彻底分离（桌面端同样自适应）；
     ③ 答题态手机端把标题栏里那些重复按钮/授权码芯片彻底移出布局（不再占位挤标题）。
   ⚠️ padding-right 必须叠加 env(safe-area-inset-right)：否则横屏刘海侧安全区被覆盖。
   ⚠️ 桌面端（≥861px）隐藏 #qfRotate（屏幕本来就宽，锁横屏反而把窗口转竖）→ 见上方桌面端块。
   ⚠️ 窄窗口 + 精细指针（v=252 场景）顶栏要显示栏目 → 浮条只留「⛶全屏」，别挤掉栏目。
   ========================================================================== */
/* ==========================================================================
   v=280 · 暂时隐藏横屏按钮 + 顶部恢复之前的布局
   用户反馈：「横屏效果不佳，先把横屏按钮隐藏了，顶部恢复之前的布局」。
   ① 顶栏不再注入「横屏/竖屏」按钮、答题浮条不再出现「↔横屏」
      （JS 侧统一开关 public/js/app.js 的 SHOW_ROTATE_BTN=false；资料直达页 materials.html 另行隐藏）。
   ② 撤销 v=275 的「按实测浮条宽度给标题栏让位」—— 那是为了给「💬客服 ↔横屏 ⛶全屏」三个
      **文字**按钮腾地方才加的；现在浮条只剩两个小图标（💬 / ⛶），浮在右上角不会压到左侧标题
      → 标题栏恢复各断点**原本**的留白，右侧不再空出一大块。
   ③ 日后重做横屏效果 → app.js 的 SHOW_ROTATE_BTN 改回 true，并把下面这条让位规则加回来即可：
        body.quizzing .app-header {
          padding-right: calc(var(--quiz-float-w, 140px) + 14px + env(safe-area-inset-right));
        }
   ⚠️ 断点必须放在文件**末尾**（要覆盖前面的手机/平板/横屏断点，同优先级靠后生效）。
   ⚠️ 手机端 padding-right 必须叠加 env(safe-area-inset-right)：横屏时刘海在**左右**两侧，
      不叠加会被刘海压住（v=272/273 铁律）。
   ========================================================================== */
@media (max-width: 860px) {
  body.quizzing .app-header { padding-right: calc(10px + env(safe-area-inset-right)); }
}
/* 窄窗口 + 精细指针（v=252 场景）：顶栏要显示栏目 → 保留 78px 让位（浮条只留「⛶全屏」） */
@media (max-width: 860px) and (pointer: fine) {
  body.quizzing .app-header { padding-right: 78px; }
}
/* 桌面端（≥861px）：恢复 v=249 的 104px 让位（浮条只留「⛶全屏」） */
@media (min-width: 861px) {
  body.quizzing .app-header { padding-right: 104px; }
}
/* 手机/窄屏：重复按钮与授权码芯片彻底移出布局；浮条客服/全屏只留图标，横屏按钮保留文字 */
@media (max-width: 860px) {
  body.quizzing .app-header .nav-service-mobile,
  body.quizzing .app-header .code-chip { display: none; }
  body.quizzing #qfService .qft,
  body.quizzing #qfFs .qft { display: none; }
  body.quizzing #qfService,
  body.quizzing #qfFs,
  body.quizzing #qfRotate { padding: 5px 8px; }
}
/* 手机端：标题不再按固定 168px 预留（已由 padding-right 精确让位）→ 允许用满可用宽度 */
@media (max-width: 860px) and (pointer: coarse) {
  body.quizzing .app-header .logo { max-width: 100%; }
}
/* 窄窗口 + 精细指针：顶栏要显示栏目（v=252）→ 浮条只留「⛶全屏」，不与栏目抢位置 */
@media (max-width: 860px) and (pointer: fine) {
  body.quizzing #qfService,
  body.quizzing #qfRotate { display: none; }
}

/* ==========================================================================
   v=307 · 手机端大字模式（body.font-big）
   用户诉求：「手机端增加大字按钮，点击后增大字体显示；注意所有按钮排版，
   要美观，别遮挡其他文字」。
   入口（app.js v=307）：
     ① 标题栏右侧「A+」图标按钮（#navBigFontMobile，.nav-service-mobile 桌面端隐藏）；
     ② 答题页右上悬浮条「Aa 大字」按钮（#qfFont）。
   状态：localStorage.qb_font_big=1 → body.font-big；进入应用即恢复。
   实现：全站字号为 px 固定值 → 用 body.font-big 前缀逐类覆盖正文类元素（+2~3px），
     不动后台表格 / 登录 hero 等已够大的元素；覆盖规则全部包在 ≤860px 内，
     桌面端（≥861px）即使 localStorage 残留也绝不放大。
   排版：答题浮条 #qfFont 与 💬/⛶ 同规格（答题态只留图标 + 压缩 padding；
     窄窗+精细指针场景隐藏，避免挤掉顶栏栏目）；字号放大后正文均为
     line-height ≥1.6 + 自动换行布局，卡片/按钮自然撑高，无固定高度截断。
   ========================================================================== */
@media (max-width: 860px) {
  /* 答题浮条：大字按钮与 💬/⛶ 同规格（只留图标、压缩 padding），保证不挤不遮 */
  body.quizzing #qfFont .qft { display: none; }
  body.quizzing #qfFont { padding: 5px 8px; }

  /* 大字模式字号覆盖（正文类 +2~3px） */
  body.font-big { font-size: 17px; }                                     /* 基准 15→17 */
  body.font-big .card h3 { font-size: 18px; }                            /* 16→18 */
  body.font-big .small { font-size: 15px; }                              /* 13→15 */
  body.font-big .btn { font-size: 16px; }                                /* 15→16 */
  body.font-big .btn.sm { font-size: 14px; }                             /* 13→14 */
  body.font-big input, body.font-big select, body.font-big textarea { font-size: 16px; }
  /* 答题页：题干/选项/解析是核心阅读区，放大最多 */
  body.font-big .q-text { font-size: 19px; }                             /* 题干 16→19 */
  body.font-big .option { font-size: 17px; }                             /* 选项（继承15→17） */
  body.font-big .option .mark { font-size: 14px; }
  body.font-big .q-cat, body.font-big .q-type, body.font-big .q-notice { font-size: 14px; }
  body.font-big .chip { font-size: 15px; }
  body.font-big .feedback .ans { font-size: 15px; }
  body.font-big .feedback .analysis { font-size: 16px; }
  /* 错题本卡片 */
  body.font-big .wi-q { font-size: 16.5px; }
  body.font-big .wi-opt, body.font-big .wi-analysis { font-size: 15px; }
  /* 首页入口 / 统计 / 排行 */
  body.font-big .entry .t { font-size: 18px; }
  body.font-big .entry .d { font-size: 14px; }
  body.font-big .stat .label { font-size: 15px; }
  body.font-big .rank-label { font-size: 14px; }
  /* 备考资料 / 每日考点 */
  body.font-big .mat-title { font-size: 17px; }
  body.font-big .dc-title { font-size: 17px; }
  body.font-big .dc-slogan, body.font-big .dc-content { font-size: 15px; }
  /* 底部导航 */
  body.font-big .bottom-tab a { font-size: 13px; }

  /* 大字按钮激活态高亮（标题栏 A- / 浮条 Aa） */
  #navBigFontMobile.active { background: rgba(255,255,255,.34); }
  .quiz-float .btn.on { background: var(--primary); border-color: var(--primary); color: #fff; }
}
/* 窄窗口 + 精细指针（v=252 场景）：浮条只留「⛶全屏」→ 大字按钮一并隐藏 */
@media (max-width: 860px) and (pointer: fine) {
  body.quizzing #qfFont { display: none; }
}
/* 桌面端（≥861px）：大字是手机端功能 → 浮条不出现「Aa 大字」按钮 */
@media (min-width: 861px) {
  #quizFloat #qfFont { display: none; }
}

/* v=312 后台题目搜索：命中关键词高亮、搜索中按钮态、结果条 */
mark.q-hl { background: #ffe58f; color: inherit; padding: 0 1px; border-radius: 2px; }
#searchQ:disabled { opacity: .65; cursor: progress; }
.q-result-bar { color: var(--text-2, #5b6b7b); }
.q-result-bar b { color: var(--text, #1f2a37); }

