/* 岐黄中医备考  样式表（浅色纸感主题） */
:root{
  --bg:#f5f1e8; --paper:#fffdf8; --paper2:#fbf7ee;
  --ink:#2f2a24; --ink2:#5c5348; --ink3:#8a7f70;
  --line:#e3dbc9; --line2:#efe7d7;
  --brand:#8c5a3c; --brand2:#a86f4a; --brand-soft:#f3e6dc;
  --green:#2f6f5e; --green-soft:#e4f0ec;
  --blue:#3a5f8a; --blue-soft:#e6edf5;
  --red:#b03a2e; --red-soft:#f9e6e3;
  --gold:#b8860b; --gold-soft:#f7efd8;
  --radius:14px; --shadow:0 1px 2px rgba(60,50,35,.05),0 4px 14px rgba(60,50,35,.06);
  /* 阅读字号缩放系数：默认 1。只有 #view / #modalRoot 内部会把它抬高，
   * 顶栏与一级标签永远取这里的 1 —— 加字号不会把顶栏挤成三行。 */
  --fs:1;
}

/* ===== 阅读字号档位（2026-10-29 新增） =====
 * 需求：知识库与刷题模考的正文、题干、选项、解析字号偏小，年纪大的看着费劲。
 * 做法：全站 156 处 font-size 已统一改写成 calc(Npx * var(--fs, 1))，
 *   只要 --fs 变了，正文/题干/选项/解析/按钮全部等比放大，不必逐个挑选择器，
 *   也不会漏掉将来新加的样式（新样式照这个写法写就自动跟随）。
 * ★ --fs 只抬高在 #view 与 #modalRoot 内：
 *   顶栏（.topbar）与一级标签（.navbar）在 #view 之外，取 :root 的 1，字号恒定。
 *   上一版为顶栏刚好排成两行实测过七档宽度，这里必须守住，否则一加字号顶栏就变三行。
 * ★ line-height 全是倍数（1.7 / 1.9），会自动跟着字号撑开，不会出现「字大了但行距不变」。 */
html[data-fs="2"] #view, html[data-fs="2"] #modalRoot { --fs:1.16 }
html[data-fs="3"] #view, html[data-fs="3"] #modalRoot { --fs:1.34 }
/* 第四档「超大」：给「特大还嫌小」的人再留一步（1.34 × 1.157 ≈ 1.55，与前三档同一递进步长）。
 * 顶栏/一级标签在 #view 之外取 1，放多大都不会把顶栏挤成三行。 */
html[data-fs="4"] #view, html[data-fs="4"] #modalRoot { --fs:1.55 }
/* 没有显式字号的正文靠继承，所以基础字号也要跟着抬 */
html[data-fs="2"] #view, html[data-fs="3"] #view, html[data-fs="4"] #view { font-size:calc(15px * var(--fs)) }

/* 放大后两个下拉并排会互相挤压（每个本来只剩约 134px）：改成每行一个，标签+下拉各占满一行
 * ★ 以后再加档位，下面这几行要把新档一起列上 —— 漏了不会报错，只是那一档控件被截断。 */
html[data-fs="2"] .fld-row, html[data-fs="3"] .fld-row, html[data-fs="4"] .fld-row { flex-wrap:wrap }
html[data-fs="2"] .fld, html[data-fs="3"] .fld, html[data-fs="4"] .fld { flex:1 1 100% }
/* 知识库工具栏是 nowrap：放大后「分类 + 收藏 + 云 + 字号」四个控件挤一行会截断文案，允许折行 */
html[data-fs="2"] .searchbar .tb-row, html[data-fs="3"] .searchbar .tb-row, html[data-fs="4"] .searchbar .tb-row { flex-wrap:wrap }
html[data-fs="2"] .searchbar .tb-row select, html[data-fs="3"] .searchbar .tb-row select, html[data-fs="4"] .searchbar .tb-row select { flex:1 1 100% }
/* 整卷成绩单里「科目名 + 正确率」两列是固定宽，放大后科目名会被截断 → 放宽。
 * 对应 js/quiz.js 里的 .sub-row-name / .sub-row-pct，靠类名而不是内联宽度。 */
.sub-row-name{flex:0 0 84px}
.sub-row-pct{flex:0 0 74px}
html[data-fs="2"] .sub-row-name, html[data-fs="3"] .sub-row-name { flex:0 0 106px }
html[data-fs="3"] .sub-row-name { flex:0 0 124px }
html[data-fs="2"] .sub-row-pct, html[data-fs="3"] .sub-row-pct { flex:0 0 88px }
/* 超大档：一名固定宽已经装不下 6 个字的科目名，条形图也会被挤成一条线 →
 * 科目名独占一行，第二行放「条形 + 正确率 + 去练」，信息一个不少。 */
html[data-fs="4"] .sub-row { flex-wrap:wrap; gap:6px 8px }
html[data-fs="4"] .sub-row-name { flex:1 1 100% }
html[data-fs="4"] .sub-row-pct { flex:0 0 92px }
html[data-fs="4"] .sub-row .sub-row-bar { flex:1 1 60px }
*{box-sizing:border-box;-webkit-tap-highlight-color:transparent}
html,body{margin:0;padding:0}
body{
  background:var(--bg);color:var(--ink);
  font-family:"PingFang SC","Microsoft YaHei","Hiragino Sans GB","Source Han Sans SC",system-ui,-apple-system,sans-serif;
  font-size:calc(15px * var(--fs, 1));line-height:1.7;padding-bottom:env(safe-area-inset-bottom);
  background-image:radial-gradient(rgba(140,90,60,.035) 1px,transparent 1px);
  background-size:22px 22px;
}
a{color:var(--brand);text-decoration:none}
button{font-family:inherit;cursor:pointer}
input,select,textarea{font-family:inherit;font-size:calc(15px * var(--fs, 1));color:var(--ink)}

/* ===== 顶部 ===== */
.topbar{position:sticky;top:0;z-index:50;background:linear-gradient(180deg,#fffdf8f2,#fffdf8e6);backdrop-filter:blur(8px);border-bottom:1px solid var(--line)}
/* 顶栏自动换行：窄屏（390px 及以下）「倒计时 + 日期 + 帐号 + 打卡」的固有宽度大于屏宽，
 * 不换行会把文档撑宽（实测 448 > 390），导致整页——连 position:fixed 的详情弹窗一起——
 * 都被按 448px 布局，右侧一截跑到屏幕外，必须往右拖才能看全。 */
.topbar-in{max-width:1180px;margin:0 auto;padding:10px 16px;display:flex;align-items:center;gap:12px;flex-wrap:wrap;row-gap:8px}
.logo{display:flex;align-items:center;gap:9px;font-weight:700;font-size:calc(17px * var(--fs, 1));letter-spacing:1px;color:var(--brand);white-space:nowrap}
.logo .seal{width:30px;height:30px;border-radius:8px;background:var(--brand);color:#fff8f0;display:grid;place-items:center;font-size:calc(15px * var(--fs, 1));font-weight:700;box-shadow:var(--shadow)}
/* min-width:0 = 允许收缩到内容固有宽度以下；flex-wrap:wrap = 实在放不下时换行而不是撑宽页面 */
.countdown{margin-left:auto;display:flex;align-items:center;gap:10px;flex-wrap:wrap;justify-content:flex-end;row-gap:8px;min-width:0}
.cd-group{display:flex;align-items:center;gap:10px;flex-wrap:wrap;row-gap:8px}
.cd-box{background:var(--brand-soft);border:1px solid #ecd8c7;border-radius:10px;padding:4px 11px;text-align:center;min-width:64px}
.cd-num{font-size:calc(18px * var(--fs, 1));font-weight:800;color:var(--brand);line-height:1.2;font-variant-numeric:tabular-nums}
.cd-lb{font-size:calc(11px * var(--fs, 1));color:var(--ink3);letter-spacing:1px}
.btn-checkin{background:var(--brand);color:#fff;border:0;border-radius:10px;padding:8px 14px;font-size:calc(14px * var(--fs, 1));font-weight:600;box-shadow:var(--shadow)}
.btn-checkin.done{background:var(--green)}
.exam-set{font-size:calc(12px * var(--fs, 1));color:var(--ink3);border:1px solid var(--line);background:var(--paper);border-radius:8px;padding:5px 8px}
/* 顶栏「当前考试项目」胶囊：常显当前项目 + 尾部换向箭头（⇄ 由 ::after 画，不占文案宽度）。
 * 用「白底 + 品牌描边」而不是品牌淡底 —— 淡底和「距考试 / 第几周」那两个数字框完全同色，
 * 会被当成第三个统计框；描边款才读得出「这是能点的状态」。 */
.btn-proj{display:inline-flex;align-items:center;gap:4px;border:1px solid var(--brand2);background:var(--paper);color:var(--brand);border-radius:20px;padding:5px 10px;font-size:calc(12.5px * var(--fs, 1));font-weight:700;white-space:nowrap;line-height:1.15}
.btn-proj::after{content:"⇄";font-size:calc(11px * var(--fs, 1));font-weight:400;opacity:.6}
.btn-proj:hover{background:var(--brand-soft)}
.btn-proj:active{transform:scale(.97)}

/* ===== 导航 ===== */
.navbar{position:sticky;top:56px;z-index:49;background:var(--paper);border-bottom:1px solid var(--line)}
.nav-in{max-width:1180px;margin:0 auto;display:flex;gap:2px;overflow-x:auto;padding:0 10px;scrollbar-width:none}
.nav-in::-webkit-scrollbar{display:none}
.navbtn{border:0;background:transparent;padding:11px 14px;font-size:calc(14px * var(--fs, 1));color:var(--ink2);border-bottom:2.5px solid transparent;white-space:nowrap;border-radius:6px 6px 0 0}
.navbtn.on{color:var(--brand);font-weight:700;border-bottom-color:var(--brand);background:var(--brand-soft)}

/* ===== 主体 ===== */
.wrap{max-width:1180px;margin:0 auto;padding:18px 16px 60px}
.grid{display:grid;gap:14px}
.grid2{grid-template-columns:repeat(2,1fr)}
.grid3{grid-template-columns:repeat(3,1fr)}
.grid4{grid-template-columns:repeat(4,1fr)}
.card{background:var(--paper);border:1px solid var(--line);border-radius:var(--radius);padding:16px;box-shadow:var(--shadow)}

/* ===== 考试项目选择（首页顶部） =====
 * 两套考试并排：手机上两列各约 160px，项目全称也能排下两行，不必横滑。
 * 选中态用品牌色描边 + 浅底，不用纯色填充 —— 纯色块在纸感主题里显得很突兀。 */
.proj-pick{display:grid;grid-template-columns:1fr 1fr;gap:10px}
/* 第三个项目（中医执业医师）整行铺 —— 半列宽装不下「中医执业医师 · 医学综合（四单元）」这行说明，
 * 挤成三行反而不好读。用 nth-child 而不是给它单开一个类：项目卡由 PROJECTS 遍历生成，顺序固定。 */
.proj-pick .proj-card:nth-child(3){grid-column:1 / -1}
.proj-card{display:block;text-align:left;width:100%;border:1.5px solid var(--line);background:var(--paper);
  border-radius:12px;padding:11px 12px;transition:border-color .15s,background .15s,box-shadow .15s;
  font:inherit;color:var(--ink);box-shadow:var(--shadow)}
.proj-card b{display:block;font-size:calc(14px * var(--fs, 1));line-height:1.35;font-weight:800}
.proj-card em{display:block;margin-top:3px;font-size:calc(11.5px * var(--fs, 1));color:var(--ink3);font-style:normal;line-height:1.5}
.proj-card .pn{display:block;margin-top:7px;font-size:calc(11.5px * var(--fs, 1));color:var(--ink2);font-variant-numeric:tabular-nums}
.proj-card.on{border-color:var(--brand);background:var(--brand-soft);box-shadow:0 2px 10px rgba(140,90,60,.14)}
.proj-card.on b{color:var(--brand)}
.proj-card.on .pn{color:var(--brand);font-weight:700}
.proj-card:active{transform:scale(.985)}
.card.flat{box-shadow:none}
.sec-t{display:flex;align-items:center;gap:8px;margin:22px 0 12px;font-size:calc(16px * var(--fs, 1));font-weight:700;color:var(--ink)}
.sec-t .bar{width:4px;height:16px;background:var(--brand);border-radius:3px}
.sec-t .more{margin-left:auto;font-size:calc(13px * var(--fs, 1));font-weight:400;color:var(--ink3)}
.muted{color:var(--ink3);font-size:calc(13px * var(--fs, 1))}
.small{font-size:calc(12.5px * var(--fs, 1))}

/* ===== 首页 ===== */
.hero{background:linear-gradient(135deg,#fffdf8,#f7eee2);border:1px solid #ecd9c6;border-radius:16px;padding:20px;position:relative;overflow:hidden}
.hero:after{content:"岐";position:absolute;right:-14px;bottom:-26px;font-size:calc(130px * var(--fs, 1));color:rgba(140,90,60,.06);font-weight:800}
.hero h1{margin:0 0 6px;font-size:calc(21px * var(--fs, 1));letter-spacing:1px}
.phase-pill{display:inline-block;background:var(--brand);color:#fff;font-size:calc(12.5px * var(--fs, 1));padding:3px 12px;border-radius:20px;margin-bottom:10px}
.prog-row{display:flex;align-items:center;gap:14px;margin-top:12px}
.ring{width:78px;height:78px;flex:0 0 78px}
.prog-txt{flex:1}
.prog-txt .big{font-size:calc(22px * var(--fs, 1));font-weight:800;color:var(--brand);font-variant-numeric:tabular-nums}
.stat-grid{display:grid;grid-template-columns:repeat(4,1fr);gap:10px;margin-top:14px}
.stat{background:var(--paper2);border:1px solid var(--line2);border-radius:11px;padding:10px;text-align:center}
.stat b{display:block;font-size:calc(19px * var(--fs, 1));color:var(--ink);font-variant-numeric:tabular-nums}
.stat span{font-size:calc(11.5px * var(--fs, 1));color:var(--ink3)}

.today-list{list-style:none;margin:0;padding:0}
.today-list li{display:flex;gap:10px;padding:9px 0;border-bottom:1px dashed var(--line2);align-items:flex-start}
.today-list li:last-child{border-bottom:0}
.tick{width:19px;height:19px;flex:0 0 19px;border-radius:6px;border:1.5px solid var(--line);background:#fff;margin-top:2px;display:grid;place-items:center;font-size:calc(12px * var(--fs, 1));color:transparent}
.tick.on{background:var(--green);border-color:var(--green);color:#fff}
.today-list li span.txt{flex:1}
.today-list li.done .txt{color:var(--ink3);text-decoration:line-through}

.daily-item{display:flex;gap:12px;padding:10px 0;border-bottom:1px dashed var(--line2)}
.daily-item:last-child{border:0}
.daily-ic{width:26px;height:26px;flex:0 0 26px;border-radius:50%;background:var(--brand-soft);color:var(--brand);display:grid;place-items:center;font-size:calc(12px * var(--fs, 1));font-weight:700}
.daily-item b{display:block;font-size:calc(13.5px * var(--fs, 1))}
.daily-item p{margin:2px 0 0;font-size:calc(13px * var(--fs, 1));color:var(--ink2)}

.quote{background:var(--paper2);border-left:3px solid var(--brand);padding:12px 14px;border-radius:0 10px 10px 0;font-size:calc(14px * var(--fs, 1));color:var(--ink2)}
.quote b{display:block;font-size:calc(12.5px * var(--fs, 1));color:var(--ink3);margin-top:6px}

/* ===== 按钮 ===== */
.btn{border:1px solid var(--line);background:var(--paper);color:var(--ink2);border-radius:9px;padding:7px 13px;font-size:calc(13.5px * var(--fs, 1))}
.btn:hover{border-color:var(--brand2);color:var(--brand)}
.btn.pri{background:var(--brand);border-color:var(--brand);color:#fff}
.btn.gh{background:transparent}
.btn.sm{padding:4px 9px;font-size:calc(12.5px * var(--fs, 1));border-radius:7px}
.btn.on{background:var(--brand-soft);border-color:var(--brand2);color:var(--brand);font-weight:600}
.btn-row{display:flex;gap:8px;flex-wrap:wrap}

/* ===== 搜索/筛选 ===== */
/* 搜索栏同理：input/select 的 min-width:auto 默认取「自身固有宽度」，flex 收缩不到它以下，
 * 于是整行比卡片还宽。min-width:0 才真正允许收缩，wrap 作为兜底。 */
.searchbar{display:flex;gap:8px;margin-bottom:12px;flex-wrap:wrap}
.searchbar input,.searchbar select{flex:1;min-width:0;border:1px solid var(--line);background:var(--paper);border-radius:10px;padding:9px 12px;outline:none}
.searchbar input:focus,.searchbar select:focus{border-color:var(--brand2)}
.chips{display:flex;gap:6px;flex-wrap:wrap;margin-bottom:12px}
.chip{border:1px solid var(--line);background:var(--paper);color:var(--ink2);border-radius:20px;padding:5px 12px;font-size:calc(13px * var(--fs, 1))}
.chip.on{background:var(--brand);border-color:var(--brand);color:#fff}
/* 单行横滑筛选条：科目/章节这类「多到十几项」的选项组，换行会吃掉 3~4 行高度，
 * 把真正要看的题目/列表顶到屏幕外。改为一行横滑，高度恒定为一行。
 * 注意与 exit.js 的配合：该文件按 overflow-x 自动排除横滑容器，
 * 所以在这里滑动不会误触发「向右连划两次退出」——不需要额外加 data-noexit。 */
.chips.scroll{flex-wrap:nowrap;overflow-x:auto;overflow-y:hidden;margin-bottom:0;
  scrollbar-width:none;-webkit-overflow-scrolling:touch;padding-bottom:2px}
.chips.scroll::-webkit-scrollbar{display:none}
.chips.scroll>.chip,.chips.scroll>button{flex:0 0 auto}
.chips.scroll>.muted{flex:0 0 auto}
/* 练习页筛选：下拉列表（替代原来的横滑 chip）
 * 横滑条的硬伤是「滑动松手会被当成点击」——想翻到后面的科目，手指一抬就选中并跳进练习，
 * 用户误操作率高。下拉是系统原生控件，滚动只滚选项、松手不会误选，与知识库的科目选择一致。
 * 一行 .fld-row 放 1~2 个 .fld；.fld =「固定宽标签 + 自适应 select」，
 * select 用 width:0 + flex-grow 才能真正收缩（min-width:auto 默认取最长选项宽度）。 */
.fld-row{display:flex;gap:8px;align-items:center;margin-top:8px}
.fld{flex:1 1 0;min-width:0;display:flex;align-items:center;gap:6px}
.fld>span{flex:0 0 auto;font-size:calc(12px * var(--fs, 1));color:var(--ink3);white-space:nowrap}
.fld>select{flex:1 1 auto;width:0;min-width:0;border:1px solid var(--line);background:var(--paper);
  color:var(--ink);border-radius:10px;padding:9px 6px;font-size:calc(14px * var(--fs, 1));outline:none;text-overflow:ellipsis}
.fld>select:focus{border-color:var(--brand2)}

/* ===== 知识库 / 练习的紧凑工具栏 ===== */
/* 原来一个卡片里堆 5~6 行（标签、更新、搜索、按钮、计数），首屏几乎看不到内容。
 * 现在统一成：一行搜索 + 一行工具（分类/收藏/更新），计数并入列表标题右侧。 */
.searchbar.col{flex-direction:column;gap:8px;margin-bottom:0;width:100%}
/* 竖排时输入框按固有宽度（约 20 个字符）参与计算，字号一放大就顶破容器：
 * 超大档 + 320 宽实测 input 287px > 容器 247px，整页多出 11px 横向滚动条。
 * 明确按容器宽度走，别让字号决定控件宽度。 */
.searchbar.col input{width:100%}
/* ★ nowrap 的 flex 容器默认 min-width:auto = 各子项 min-content 之和，
 *   <select> 的 min-content 又取最长选项（「常用解表药」这类），于是一整行比卡片还宽、
 *   右侧「收藏 / 云更新」被裁到屏幕外。下面三行缺一不可：容器 min-width:0、
 *   select 用 width:0 + flex-grow 才能真正让出空间、固定项不许收缩。 */
.searchbar .tb-row{display:flex;gap:8px;align-items:center;flex-wrap:nowrap;min-width:0;width:100%}
.searchbar .tb-row select{flex:1 1 auto;width:0;min-width:0;max-width:none}
.searchbar .tb-row .btn{flex:0 0 auto;white-space:nowrap}
.tb-ico{flex:0 0 auto;width:38px;height:38px;display:flex;align-items:center;justify-content:center;
  border:1px solid var(--line);background:var(--paper);border-radius:10px;font-size:calc(15px * var(--fs, 1));color:var(--ink2);padding:0}
.tb-ico:hover{border-color:var(--brand2);color:var(--brand)}
/* 字号按钮（Aa）：图标比正文小一档（12px 基数），但仍走 --fs ——
 * 全站不留任何裸 font-size px 是条硬规矩：漏一处，那条样式就永远不跟随用户设置，
 * 而且不报错不白屏，只能靠 tools/smoke.js 的断言拦住。放大档位下把 38px 方框加宽给它腾地方。 */
.tb-ico.fs-btn{font-size:calc(12px * var(--fs, 1));font-weight:700;letter-spacing:.5px}
html[data-fs="2"] .tb-ico.fs-btn,html[data-fs="3"] .tb-ico.fs-btn,html[data-fs="4"] .tb-ico.fs-btn{width:44px}
/* 「我的」页的字号示例：故意用正文样式，让用户点档位时立刻看到差别 */
.fs-demo{margin-top:10px;padding:10px 12px;background:var(--paper2);border-left:3px solid var(--brand);
  border-radius:0 10px 10px 0;color:var(--ink);line-height:1.85;font-size:calc(15px * var(--fs, 1))}
/* 计数行：并入 sec-t 右侧，不再单独占一行；标题过长时省略，不让整行溢出 */
.sec-t .cnt{margin-left:auto;padding-left:10px;font-size:calc(12.5px * var(--fs, 1));font-weight:400;color:var(--ink3);
  text-align:right;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;min-width:0;flex:0 1 auto}
/* 标题文字单独包一层才能省略号截断（裸文本节点在 flex 里无法直接收缩） */
.sec-t .tt{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}

/* ===== 列表项 ===== */
.item{background:var(--paper);border:1px solid var(--line);border-radius:12px;padding:13px 15px;margin-bottom:9px;display:flex;gap:12px;align-items:flex-start;transition:border-color .15s,background .15s,box-shadow .15s}
.item:hover{border-color:var(--brand2);box-shadow:var(--shadow)}
.item .ttl{font-weight:700;font-size:calc(15px * var(--fs, 1));display:flex;align-items:center;gap:7px;flex-wrap:wrap}
.item .sub{font-size:calc(13px * var(--fs, 1));color:var(--ink2);margin-top:3px;line-height:1.6}
.item .rt{margin-left:auto;text-align:right;flex:0 0 auto}
.tag{display:inline-block;font-size:calc(11.5px * var(--fs, 1));padding:1.5px 7px;border-radius:5px;background:var(--brand-soft);color:var(--brand);border:1px solid #ecd8c7}
.tag.g{background:var(--green-soft);color:var(--green);border-color:#cfe3dc}
.tag.b{background:var(--blue-soft);color:var(--blue);border-color:#d3dfec}
.tag.r{background:var(--red-soft);color:var(--red);border-color:#f0d3ce}
.tag.y{background:var(--gold-soft);color:var(--gold);border-color:#ecdfba}
.star{background:none;border:0;font-size:calc(17px * var(--fs, 1));color:var(--line);padding:0;line-height:1}
.star.on{color:var(--gold)}

/* ===== 弹层 ===== */
.modal-bg{position:fixed;inset:0;background:rgba(45,35,25,.42);z-index:100;display:flex;align-items:flex-end;justify-content:center;animation:fade .18s}
@keyframes fade{from{opacity:0}to{opacity:1}}
.modal{position:relative;background:var(--paper);width:100%;max-width:720px;max-height:88vh;overflow:auto;border-radius:18px 18px 0 0;padding:20px 18px 26px;animation:up .22s}
@keyframes up{from{transform:translateY(20px)}to{transform:none}}
@media(min-width:760px){.modal-bg{align-items:center}.modal{border-radius:18px;max-height:84vh}}
.modal h3{margin:0 0 4px;font-size:calc(19px * var(--fs, 1));padding-right:44px}
/* 关闭按钮用 absolute+z-index：此前 sticky+float 的组合在部分手机内核（X5 等）
 * 命中区域会偏移——「看得见点不着」，点按钮无反应、点遮罩空白反而能关（2026-10-15）。 */
.modal .close{position:absolute;top:12px;right:12px;z-index:5;border:0;background:var(--paper2);width:30px;height:30px;border-radius:50%;font-size:calc(16px * var(--fs, 1));color:var(--ink3);line-height:1}
.kv{margin:12px 0}
.kv .k{font-size:calc(12.5px * var(--fs, 1));color:var(--brand);font-weight:700;letter-spacing:1px;margin-bottom:3px}
.kv .v{font-size:calc(14.5px * var(--fs, 1));line-height:1.75;color:var(--ink)}
.song{background:var(--gold-soft);border:1px dashed #e0cf9f;border-radius:10px;padding:12px 14px;font-size:calc(15px * var(--fs, 1));line-height:1.9;letter-spacing:.5px}
.hide-area{background:repeating-linear-gradient(45deg,#efe9dd,#efe9dd 8px,#e8e1d3 8px,#e8e1d3 16px);border-radius:8px;color:transparent;padding:8px 12px;min-height:38px;display:flex;align-items:center;justify-content:center;cursor:pointer}
.hide-area.reveal{background:var(--green-soft);color:var(--ink);border:1px solid #cfe3dc}

/* ===== 刷题 ===== */
.qbox{background:var(--paper);border:1px solid var(--line);border-radius:var(--radius);padding:18px;box-shadow:var(--shadow)}
.qmeta{display:flex;justify-content:space-between;font-size:calc(12.5px * var(--fs, 1));color:var(--ink3);margin-bottom:10px}
.qtext{font-size:calc(16px * var(--fs, 1));line-height:1.8;font-weight:600;margin-bottom:14px}
.opt{border:1px solid var(--line);background:var(--paper2);border-radius:11px;padding:11px 14px;margin-bottom:9px;font-size:calc(14.5px * var(--fs, 1));display:flex;gap:10px;align-items:flex-start;
  /* ★ 不要写 transition:.12s（= all）：那会把 font-size 也算进过渡，
   *   用户切字号时字要「慢慢长」，而且在动了效果动画的浏览器里会看起来「点了没反应」。
   *   过渡只给颜色和边框。 */
  transition:border-color .12s,background .12s,color .12s}
.opt:hover{border-color:var(--brand2)}
.opt.sel{border-color:var(--brand);background:var(--brand-soft)}
.opt.right{border-color:var(--green);background:var(--green-soft);color:var(--green);font-weight:600}
.opt.wrong{border-color:var(--red);background:var(--red-soft);color:var(--red)}
.opt .idx{font-weight:700;color:var(--ink3);flex:0 0 auto}
.opt.right .idx,.opt.wrong .idx{color:inherit}
.exp{margin-top:14px;background:var(--paper2);border:1px solid var(--line2);border-left:3px solid var(--green);border-radius:0 10px 10px 0;padding:12px 14px;font-size:calc(14px * var(--fs, 1));line-height:1.75}
/* 解析里「你的作答」一行：绿=对 红=错 灰=未作答（练习解析与模考错题回顾共用） */
.rv-my{display:inline-block}
.rv-my.ok{color:var(--green)}
.rv-my.no{color:var(--red)}
.rv-my.na{color:var(--ink3)}
.qbar{display:flex;gap:8px;margin-top:14px;flex-wrap:wrap}

/* ===== 真题型（A3/A4 共用题干、B1 共用备选、X型多选） ===== */
.qtype{display:inline-block;font-size:calc(11px * var(--fs, 1));padding:1.5px 7px;border-radius:5px;background:var(--brand-soft);color:var(--brand);border:1px solid #ecd8c7;margin-right:6px;vertical-align:2px}
.qtype.x{background:var(--red-soft);color:var(--red);border-color:#f0d3ce}
.qtype.b1{background:var(--blue-soft);color:var(--blue);border-color:#d3dfec}
.qtype.a3{background:var(--green-soft);color:var(--green);border-color:#cfe3dc}
.qstem{background:var(--paper2);border:1px dashed var(--line);border-radius:10px;padding:12px 14px;font-size:calc(14.5px * var(--fs, 1));line-height:1.85;margin-bottom:12px;color:var(--ink2)}
.qstem b{color:var(--ink);font-size:calc(12.5px * var(--fs, 1));letter-spacing:.5px}
.qban{background:var(--paper2);border:1px solid var(--line);border-radius:10px;padding:11px 14px;font-size:calc(14px * var(--fs, 1));line-height:1.9;margin-bottom:12px}
.qban .bi{display:inline-block;margin-right:14px;white-space:nowrap}
.qban .bi i{font-weight:700;color:var(--ink3);font-style:normal;margin-right:3px}
.qmulti-tip{font-size:calc(12.5px * var(--fs, 1));color:var(--ink3);margin:-4px 0 10px}

/* ===== 闪卡 ===== */
.flash{background:var(--paper);border:1px solid var(--line);border-radius:18px;box-shadow:var(--shadow);min-height:280px;display:flex;flex-direction:column;padding:24px 20px;text-align:center;justify-content:center}
.flash .word{font-size:calc(30px * var(--fs, 1));font-weight:800;letter-spacing:2px;margin-bottom:6px}
.flash .body{font-size:calc(15px * var(--fs, 1));line-height:1.9;color:var(--ink2);text-align:left;background:var(--paper2);border-radius:10px;padding:14px;margin-top:10px}
.flash .body b{color:var(--brand)}
.flash-btns{display:grid;grid-template-columns:repeat(3,1fr);gap:9px;margin-top:14px}
.flash-btns button{border:1px solid var(--line);background:var(--paper);border-radius:11px;padding:12px 6px;font-size:calc(14px * var(--fs, 1));font-weight:600}
.flash-btns button:nth-child(1){color:var(--green);border-color:#cfe3dc;background:var(--green-soft)}
.flash-btns button:nth-child(2){color:var(--gold);border-color:#ecdfba;background:var(--gold-soft)}
.flash-btns button:nth-child(3){color:var(--red);border-color:#f0d3ce;background:var(--red-soft)}

/* ===== 计划 ===== */
.week{background:var(--paper);border:1px solid var(--line);border-radius:12px;padding:14px 16px;margin-bottom:10px}
.week.now{border-color:var(--brand);box-shadow:0 0 0 2px var(--brand-soft)}
/* 第一行：第N周 + 主题；第二行：.week-meta（日期区间 + 状态标签，两端对齐）。
 * 早先四个元素挤一行，主题 .week-t 会被压到 0 宽 → 每字一行竖排（放大字号后尤其明显）；
 * 后来把日期单独折行、标签又孤零零占第三行 —— 31 张卡每张多一行空高，列表明显变长。
 * 现在日期与标签包在同一个 .week-meta 里，必定同行。 */
.week-h{display:flex;align-items:center;flex-wrap:wrap;gap:9px;cursor:pointer}
.week-n{flex:0 0 auto;white-space:nowrap;font-size:calc(12px * var(--fs, 1));background:var(--brand-soft);color:var(--brand);border-radius:6px;padding:2px 8px;font-weight:700}
.week.now .week-n{background:var(--brand);color:#fff}
.week-t{font-weight:700;font-size:calc(15px * var(--fs, 1));flex:1 1 auto;min-width:0;line-height:1.45}
.week-meta{flex:1 1 100%;order:10;display:flex;align-items:center;gap:9px;min-width:0}
.week-d{flex:1 1 auto;min-width:0;font-size:calc(12px * var(--fs, 1));color:var(--ink3);line-height:1.5}
.week-h .tag{flex:0 0 auto;white-space:nowrap}
.week-body{margin-top:12px;display:none}
.week.open .week-body{display:block}
.wk-goal{background:var(--paper2);border-radius:9px;padding:10px 12px;font-size:calc(13.5px * var(--fs, 1));color:var(--ink2);margin-bottom:10px}
.task-li{display:flex;gap:10px;padding:7px 0;border-bottom:1px dashed var(--line2);align-items:flex-start;font-size:calc(14px * var(--fs, 1))}
.task-li:last-child{border:0}
.ck{font-size:calc(12.5px * var(--fs, 1));color:var(--ink3);background:var(--gold-soft);border:1px dashed #e0cf9f;border-radius:9px;padding:9px 12px;margin-top:8px}

/* ===== 每周学习（往周补学）=====
 * 周卡沿用 .week/.week-h/.week-body 的一套；这里只补「精读包」与「整条路线折叠区」。 */
.wk-pack{margin-top:4px;padding-top:6px;border-top:1px dashed var(--line2)}
.pk-item{background:var(--paper2);border-radius:10px;padding:9px 12px;margin-top:8px;cursor:pointer}
.pk-item:active{background:var(--line2)}
.pk-t{font-size:calc(16px * var(--fs, 1));font-weight:800;margin:4px 0;line-height:1.45}
.wk-fold{margin-top:6px}
.wk-fold-h{display:flex;align-items:center;gap:10px;padding:10px 2px;font-size:calc(13.5px * var(--fs, 1));color:var(--ink2)}
.wk-fold-h .btn{margin-left:auto;flex:0 0 auto}
/* 折叠提示箭头：收起显 ▾，展开显 ▴（技能考核 .sk-tip 与临床经典各列表 .fold-tip 共用） */
.sk-tip::after{content:" ▴"}
.week:not(.open) .sk-tip::after{content:" ▾"}
.fold-tip::after{content:" ▾"}
.week.open .fold-tip::after{content:" ▴"}

/* ===== 表格 ===== */
.tb{width:100%;border-collapse:collapse;font-size:calc(13.5px * var(--fs, 1))}
.tb th,.tb td{border:1px solid var(--line2);padding:8px 10px;text-align:left;vertical-align:top}
.tb th{background:var(--paper2);color:var(--brand);font-size:calc(12.5px * var(--fs, 1));letter-spacing:.5px}
.tb tr:nth-child(even) td{background:#fdfaf4}

/* ===== 打卡日历 ===== */
.cal{display:grid;grid-template-columns:repeat(14,1fr);gap:4px}
.cal i{aspect-ratio:1;border-radius:5px;background:var(--line2);display:block}
.cal i.on{background:var(--green)}
.cal i.today{outline:2px solid var(--brand)}

/* ===== 空态 ===== */
.empty{text-align:center;padding:40px 16px;color:var(--ink3);font-size:calc(14px * var(--fs, 1))}
.empty .em{font-size:calc(38px * var(--fs, 1));display:block;margin-bottom:8px;opacity:.5}

/* ===== 安装到桌面提示条（PWA） ===== */
.install-bar{position:fixed;left:50%;bottom:18px;transform:translateX(-50%);z-index:95;width:min(520px,calc(100vw - 28px));
  background:var(--paper);border:1px solid var(--line);border-radius:16px;box-shadow:0 8px 30px rgba(60,50,35,.16);
  padding:13px 15px;display:flex;flex-direction:column;gap:10px}
.install-bar .ib-t{font-size:calc(14px * var(--fs, 1));font-weight:700;color:var(--ink);line-height:1.6}
.install-bar .ib-sub{font-size:calc(12.5px * var(--fs, 1));color:var(--ink3);line-height:1.6;margin-top:-4px}
.install-bar .ib-sub[hidden]{display:none}
.install-bar .ib-b{display:flex;gap:8px}
.install-bar .ib-b .btn{flex:1}
.install-bar[hidden]{display:none}
@media(display-mode:standalone){.install-bar{display:none!important}}

/* ===== 页脚 ===== */
.foot{text-align:center;color:var(--ink3);font-size:calc(12px * var(--fs, 1));padding:14px 0 4px}

/* ===== 顶栏用户钮 ===== */
.btn-user{border:1px solid var(--line);background:var(--paper);color:var(--ink2);border-radius:20px;padding:6px 12px;font-size:calc(12.5px * var(--fs, 1));font-weight:600;white-space:nowrap}
.btn-user:hover{border-color:var(--brand2);color:var(--brand)}
.btn-user.guest{color:var(--ink3);font-weight:400}

/* ===== 登录浮层 ===== */
#authRoot{position:fixed;inset:0;z-index:300;background:rgba(245,241,232,.92);backdrop-filter:blur(6px);display:none;align-items:center;justify-content:center;padding:20px;overflow:auto}
.auth-card{background:var(--paper);border:1px solid var(--line);border-radius:18px;box-shadow:0 8px 40px rgba(60,50,35,.14);padding:28px 26px 22px;width:100%;max-width:400px;animation:up .25s}
.auth-brand{display:flex;justify-content:center;margin-bottom:12px}
.auth-brand .seal{width:52px;height:52px;border-radius:14px;background:var(--brand);color:#fff8f0;display:grid;place-items:center;font-size:calc(24px * var(--fs, 1));font-weight:800;box-shadow:var(--shadow)}
.auth-card h2{margin:0;text-align:center;font-size:calc(19px * var(--fs, 1));letter-spacing:2px;color:var(--brand)}
.auth-sub{margin:6px 0 0;text-align:center;font-size:calc(13px * var(--fs, 1));color:var(--ink3)}
.auth-hint{margin-top:12px;font-size:calc(12.5px * var(--fs, 1));color:var(--ink2);background:var(--paper2);border:1px dashed var(--line);border-radius:9px;padding:8px 11px;text-align:center}
.auth-tabs{display:flex;gap:6px;margin:16px 0 14px;background:var(--paper2);border-radius:11px;padding:4px}
.auth-tab{flex:1;border:0;background:transparent;border-radius:8px;padding:8px;font-size:calc(14px * var(--fs, 1));color:var(--ink2);font-weight:600}
.auth-tab.on{background:var(--paper);color:var(--brand);box-shadow:var(--shadow)}
.auth-lb{display:block;font-size:calc(12.5px * var(--fs, 1));color:var(--brand);font-weight:700;letter-spacing:1px;margin:10px 0 4px}
.auth-in{width:100%;border:1px solid var(--line);background:var(--paper2);border-radius:10px;padding:10px 12px;outline:none}
.auth-in:focus{border-color:var(--brand2);background:var(--paper)}
.auth-err{min-height:20px;font-size:calc(12.5px * var(--fs, 1));color:var(--red);margin-top:8px}
.auth-wx{width:100%;display:flex;align-items:center;justify-content:center;gap:8px;margin:4px 0 2px;padding:11px;font-size:calc(15px * var(--fs, 1));font-weight:700;border:0;border-radius:11px;background:#07c160;color:#fff;cursor:pointer}
.auth-wx:hover{background:#06ad56}
.auth-wx:disabled{opacity:.6;cursor:default}
.auth-ph{width:100%;display:flex;align-items:center;justify-content:center;gap:6px;margin:8px 0 2px;padding:10px;font-size:calc(14px * var(--fs, 1));font-weight:600;border:1px solid var(--line);border-radius:11px;background:var(--paper2);color:var(--brand);cursor:pointer}
.auth-ph:hover{border-color:var(--brand2);background:var(--paper)}
.otp-row{display:flex;gap:8px;align-items:stretch}
.otp-row input{flex:1;min-width:0}
.otp-row .btn{white-space:nowrap;padding:0 14px;font-size:calc(13.5px * var(--fs, 1))}
/* 昵称注册入口 + 防伪图形验证码 */
.auth-reg{width:100%;display:flex;align-items:center;justify-content:center;gap:6px;margin:8px 0 2px;padding:10px;font-size:calc(14px * var(--fs, 1));font-weight:600;border:1px solid var(--brand2);border-radius:11px;background:var(--brand-soft);color:var(--brand);cursor:pointer}
.auth-reg:hover{background:#eeddcd}
.cap-row{display:flex;gap:8px;align-items:center}
.cap-row .auth-in{flex:1;min-width:0;letter-spacing:3px;text-transform:uppercase}
.cap-img{flex:0 0 auto;width:120px;height:44px;border:1px solid var(--line);border-radius:9px;background:#f7f2e9;cursor:pointer;display:block;touch-action:manipulation}
.cap-new{flex:0 0 auto;padding:9px 11px;font-size:calc(15px * var(--fs, 1));line-height:1;border-radius:9px}
.auth-or{display:flex;align-items:center;gap:10px;margin:12px 0 4px;color:var(--ink3);font-size:calc(11.5px * var(--fs, 1))}
.auth-or::before,.auth-or::after{content:"";flex:1;height:1px;background:var(--line)}
.auth-go{width:100%;margin-top:6px;padding:11px;font-size:calc(15px * var(--fs, 1));border-radius:11px}
.auth-guest{display:block;width:100%;border:0;background:transparent;color:var(--ink3);font-size:calc(12.5px * var(--fs, 1));margin-top:10px;text-decoration:underline}
.auth-note{margin-top:12px;font-size:calc(11.5px * var(--fs, 1));color:var(--ink3);line-height:1.7;text-align:center}

/* ===== 帐号页 ===== */
.acct-head{display:flex;align-items:center;gap:14px}
.acct-ava{width:52px;height:52px;flex:0 0 52px;border-radius:50%;background:var(--brand-soft);border:1px solid #ecd8c7;color:var(--brand);display:grid;place-items:center;font-size:calc(22px * var(--fs, 1));font-weight:800}
.steps{margin:0;padding-left:20px;color:var(--ink2);font-size:calc(14px * var(--fs, 1));line-height:2}
.steps li{margin-bottom:2px}
.steps b{color:var(--ink)}
.acct-form{display:flex;gap:8px;flex-wrap:wrap}
.acct-form input{flex:1;min-width:130px;border:1px solid var(--line);background:var(--paper2);border-radius:9px;padding:8px 11px;outline:none}
.acct-form input:focus{border-color:var(--brand2)}
.imp-warn{background:var(--red-soft);border:1px solid #f0d3ce;color:var(--red);border-radius:9px;padding:9px 12px;font-size:calc(13px * var(--fs, 1));margin:8px 0}
.paste-area{width:100%;min-height:130px;border:1px solid var(--line);background:var(--paper2);border-radius:10px;padding:10px 12px;font-size:calc(12.5px * var(--fs, 1));font-family:ui-monospace,Consolas,monospace;outline:none;resize:vertical}
.paste-area:focus{border-color:var(--brand2)}
/* 备考设置：标签 + 日期 + 说明，一行排不下自动换行（手机端也能完整显示） */
.bp-row{display:flex;align-items:center;gap:8px;flex-wrap:wrap;margin-top:10px}
.bp-row label{flex:0 0 62px;font-size:calc(13.5px * var(--fs, 1));color:var(--ink2)}
.bp-row input[type=date]{flex:0 0 auto;border:1px solid var(--line);background:var(--paper2);color:var(--ink);border-radius:9px;padding:6px 9px;font-size:calc(13.5px * var(--fs, 1));outline:none}
.bp-row input[type=date]:focus{border-color:var(--brand2)}

/* ===== 响应式 ===== */
@media(max-width:860px){
  .grid3,.grid4{grid-template-columns:repeat(2,1fr)}
  .stat-grid{grid-template-columns:repeat(2,1fr)}
}
@media(max-width:600px){
  .grid2,.grid3,.grid4{grid-template-columns:1fr}
  .wrap{padding:14px 12px 50px}
  .topbar-in{padding:8px 12px;gap:8px;row-gap:6px}
  .navbar{top:50px}   /* 仅作 JS 未接管前的兜底；实际偏移由 syncNavTop() 按顶栏实高回写 */
  .logo span.t{display:none}
  /* 顶栏窄屏换行：第一行「倒计时 + 日期」跟着 logo，第二行「帐号 + 打卡 + 考试项目」，
   * flex:1 1 0 是关键——否则整块的固有宽度会把倒计时整组挤到 logo 下面，白白多占一行 */
  .countdown{flex:1 1 0;gap:6px;row-gap:6px}
  .cd-group{gap:6px;row-gap:6px}
  .cd-box{min-width:50px;padding:3px 7px}
  .cd-num{font-size:calc(16px * var(--fs, 1))}
  .cd-lb{font-size:calc(10.5px * var(--fs, 1))}
  /* max-width 是给 iOS 兜底的：Safari 的 date 控件固有宽度比 Chrome 宽 30~40px，
   * 不封顶的话第一行会被它顶开，顶栏在 iPhone 上就多折一行（Chrome 里测不出来）。 */
  .exam-set{padding:4px 7px;font-size:calc(12px * var(--fs, 1));max-width:128px}
  .btn-user{padding:5px 10px}
  .btn-proj{padding:5px 9px;font-size:calc(12px * var(--fs, 1))}
  .btn-checkin{padding:7px 12px;font-size:calc(13.5px * var(--fs, 1))}
  .tb{font-size:calc(12.5px * var(--fs, 1))}
  .cal{grid-template-columns:repeat(10,1fr)}
}

/* ===== 答题卡 ===== */
.ac-sheet{margin-top:12px;border:1px dashed var(--line);border-radius:11px;padding:12px;background:var(--paper2)}
.ac-head{font-size:calc(13px * var(--fs, 1));font-weight:700;margin-bottom:8px}
.ac-grid{display:flex;flex-wrap:wrap;gap:6px}
.ac-cell{min-width:32px;height:30px;padding:0 4px;border-radius:8px;display:inline-flex;align-items:center;justify-content:center;font-size:calc(12.5px * var(--fs, 1));border:1px solid var(--line);background:var(--paper);color:var(--ink3);cursor:pointer;transition:border-color .12s,background .12s,color .12s}
.ac-cell:hover{border-color:var(--brand2)}
.ac-cell.cur{border-color:var(--brand);background:var(--brand-soft);color:var(--brand);font-weight:800}
.ac-cell.ok{background:var(--green-soft);border-color:#cfe3dc;color:var(--green);font-weight:600}
.ac-cell.no{background:#fbeaea;border-color:#f0c9c9;color:var(--red);font-weight:600}
.ac-cell.ans{background:var(--brand-soft);border-color:var(--brand2);color:var(--brand);font-weight:600}

/* ===== 知识库同步：题目匹配到知识库条目时展示的实时知识卡 ===== */
.tag.kb{background:#eef3fb;color:#3b6ea8;border-color:#d3dfec}
.kbsync{margin-top:12px;background:#fff;border:1px solid var(--line2);border-left:3px solid #7aa3cd;border-radius:0 10px 10px 0;padding:10px 12px;font-size:calc(13.5px * var(--fs, 1))}
.kbsync .kb-head{display:flex;align-items:center;gap:8px;margin-bottom:6px;color:#3b6ea8}
.kbsync .kb-row{display:flex;gap:8px;padding:3px 0;border-bottom:1px dashed var(--line2);line-height:1.7}
.kbsync .kb-row:last-child{border-bottom:0}
.kbsync .kb-row .k{flex:0 0 62px;color:var(--muted,#8b8175);font-weight:600}
.kbsync .kb-row .v{flex:1;color:var(--ink2,#3c332b)}
.kbsync .kb-row.kb-name .v{font-weight:700;color:var(--ink,#2b241c)}

/* ===== 账号审核门禁 ===== */
/* 门禁生效时收起导航与业务区域，只留顶栏 logo 与状态卡，避免审核未过仍能翻看内容 */
body.gated .navbar,body.gated .countdown,body.gated .foot{display:none}
#gateRoot{position:fixed;inset:0;z-index:90;display:none;align-items:flex-start;justify-content:center;padding:24px 16px;background:var(--bg);overflow-y:auto}
.gate-card{width:100%;max-width:420px;background:var(--paper);border:1px solid var(--line);border-radius:var(--radius);padding:24px 20px;box-shadow:var(--shadow);margin:auto}
.gate-brand{display:flex;justify-content:center;margin-bottom:8px}
.gate-brand .seal{width:46px;height:46px;border-radius:13px;background:var(--brand);color:#fff8f0;display:grid;place-items:center;font-size:calc(23px * var(--fs, 1));font-weight:700;box-shadow:var(--shadow)}
.gate-card h2{font-size:calc(19px * var(--fs, 1));text-align:center;margin:6px 0 8px;font-weight:700}
.gate-sub{font-size:calc(13.5px * var(--fs, 1));color:var(--ink2);line-height:1.75;text-align:center;margin:0 0 16px}
.gate-meta{background:var(--paper2);border-radius:10px;padding:10px 12px;margin-bottom:14px}
.gate-meta>div{display:flex;gap:10px;font-size:calc(13px * var(--fs, 1));padding:3px 0}
.gate-meta span{color:var(--ink3);flex:0 0 68px}
.gate-meta b{color:var(--ink);font-weight:600;word-break:break-all;flex:1}
.gate-reason b{color:var(--red)}
.gate-actions{display:flex;flex-direction:column;gap:8px;margin-top:4px}
.gate-actions .btn{width:100%}
.gate-note{font-size:calc(12px * var(--fs, 1));color:var(--ink3);text-align:center;margin-top:12px;line-height:1.7}
.gate-ta{width:100%;min-height:76px;resize:vertical;border:1px solid var(--line);background:var(--paper);border-radius:10px;padding:9px 12px;outline:none;margin-bottom:10px}
.gate-ta:focus{border-color:var(--brand2)}

/* ===== 管理后台（admin.html） ===== */
.adm-wrap{max-width:980px;margin:0 auto;padding:16px 16px 40px}
.adm-head{display:flex;align-items:center;gap:10px;flex-wrap:wrap;margin-bottom:14px}
.adm-title{font-size:calc(19px * var(--fs, 1));font-weight:800;color:var(--brand);letter-spacing:.5px}
.adm-head .sp{margin-left:auto;display:flex;gap:8px;flex-wrap:wrap}
.adm-stats{display:grid;grid-template-columns:repeat(auto-fit,minmax(104px,1fr));gap:10px;margin-bottom:14px}
.adm-stat{background:var(--paper);border:1px solid var(--line);border-radius:12px;padding:11px 13px}
.adm-stat .n{font-size:calc(23px * var(--fs, 1));font-weight:800;color:var(--brand);line-height:1.25;font-variant-numeric:tabular-nums}
.adm-stat .l{font-size:calc(12px * var(--fs, 1));color:var(--ink3)}
.adm-tabs{display:flex;gap:8px;flex-wrap:wrap;margin-bottom:12px}
.adm-tab{border:1px solid var(--line);background:var(--paper);border-radius:999px;padding:6px 14px;font-size:calc(13.5px * var(--fs, 1));color:var(--ink2);transition:border-color .15s,background .15s,color .15s}
.adm-tab.on{background:var(--brand);border-color:var(--brand);color:#fff;font-weight:600}
.adm-list{display:flex;flex-direction:column;gap:10px}
.adm-item{background:var(--paper);border:1px solid var(--line);border-radius:12px;padding:12px 14px}
.adm-item.pending{border-left:3px solid var(--gold)}
.adm-item.approved{border-left:3px solid var(--green)}
.adm-item.rejected{border-left:3px solid var(--red)}
.adm-row{display:flex;align-items:center;gap:8px;flex-wrap:wrap}
.adm-name{font-weight:700;font-size:calc(15px * var(--fs, 1))}
.adm-meta{font-size:calc(12.5px * var(--fs, 1));color:var(--ink3);line-height:1.75;margin-top:5px;word-break:break-all}
.adm-acts{display:flex;gap:8px;flex-wrap:wrap;margin-top:10px}
.adm-acts .btn{padding:6px 13px;font-size:calc(13.5px * var(--fs, 1))}
.adm-acts .btn.danger{border-color:#f0c9c9;color:var(--red);background:var(--red-soft)}
.adm-acts .btn.ok{border-color:#cfe3dc;color:var(--green);background:var(--green-soft)}
.badge{font-size:calc(11.5px * var(--fs, 1));border-radius:999px;padding:1px 9px;border:1px solid var(--line);white-space:nowrap}
.badge.pending{background:var(--gold-soft);color:#8a6508;border-color:#e6d3a0}
.badge.approved{background:var(--green-soft);color:var(--green);border-color:#cfe3dc}
.badge.rejected{background:var(--red-soft);color:var(--red);border-color:#f0c9c9}
.badge.admin{background:var(--brand-soft);color:var(--brand);border-color:#ecd8c7}
/* 「本机」帐号标记：昵称+密码注册（uid = u<hash>，没有手机号），
   让管理员在待审列表里一眼区分它与手机号云端账号 */
.badge.local{background:#eef2f8;color:#3a5f8a;border-color:#ccd8ea}
.adm-empty{text-align:center;color:var(--ink3);padding:30px 0;font-size:calc(14px * var(--fs, 1))}
/* 试用设置开关行 */
.adm-sw{display:flex;align-items:flex-start;gap:9px;font-size:calc(13.5px * var(--fs, 1));color:var(--ink2);line-height:1.6;cursor:pointer}
.adm-sw input{margin-top:3px;width:16px;height:16px;flex:none;accent-color:var(--brand)}
.adm-sw b{color:var(--ink)}
/* 应用内视图里后台列表的返回条 */
.adm-back{display:flex;align-items:center;gap:8px;margin-bottom:12px}
.adm-back .btn{padding:6px 13px;font-size:calc(13.5px * var(--fs, 1))}
.adm-foot{font-size:calc(12px * var(--fs, 1));color:var(--ink3);text-align:center;margin-top:18px;line-height:1.7}
/* 搜索框 +  tabs 同一行工具条（2026-10-14 重建新增） */
.adm-tool{display:flex;gap:10px;align-items:center;flex-wrap:wrap;margin-bottom:12px}
.adm-tool .adm-tabs{margin-bottom:0;flex:1 1 auto;min-width:0}
#admSearch{flex:0 1 240px;min-width:170px;border:1px solid var(--line);background:var(--paper);border-radius:999px;padding:7px 15px;font-size:calc(13.5px * var(--fs, 1));color:var(--ink);outline:none}
#admSearch:focus{border-color:var(--brand2)}
/* 「调整天数」内联面板 */
.adj-panel{margin-top:10px;border:1px dashed var(--brand2);background:var(--brand-soft);border-radius:10px;padding:10px 12px}
.adj-row{display:flex;gap:8px;align-items:center;flex-wrap:wrap;margin-bottom:8px}
.adj-row:last-of-type{margin-bottom:0}
.adj-l{font-size:calc(12.5px * var(--fs, 1));color:var(--ink3);font-weight:600}
.adj-row input{width:130px;border:1px solid var(--line);border-radius:8px;padding:6px 10px;font-size:calc(13.5px * var(--fs, 1));background:var(--paper);color:var(--ink)}
.adj-tip{font-size:calc(12px * var(--fs, 1));color:var(--ink3);line-height:1.6;margin-top:4px}
.badge.expired{background:var(--red-soft);color:var(--red);border-color:#f0d3ce}
@media (max-width:600px){
  #gateRoot{padding:16px 12px}
  .gate-card{padding:20px 16px}
  .adm-wrap{padding:12px 12px 32px}
}
#admToast{position:fixed;left:50%;bottom:34px;transform:translate(-50%,12px);background:rgba(47,42,36,.92);color:#fff;font-size:calc(13.5px * var(--fs, 1));padding:9px 16px;border-radius:999px;opacity:0;pointer-events:none;transition:opacity .22s,transform .22s;z-index:200;max-width:86vw}
#admToast.show{opacity:1;transform:translate(-50%,0)}

/* ========== 学习计划定制 ========== */
.mp-week{display:grid;grid-template-columns:repeat(7,1fr);gap:6px;margin-top:6px}
.mp-day{background:var(--bg);border:1px solid var(--line2);border-radius:9px;padding:7px 5px;text-align:center;font-size:calc(12px * var(--fs, 1));line-height:1.5}
.mp-day b{display:block;font-size:calc(12.5px * var(--fs, 1));color:var(--ink2);margin-bottom:3px}
.mp-day span{display:block;color:var(--ink3)}
.mp-day span.muted{color:var(--line)}
/* 今天是星期几：对应那一列高亮 + 角标（按真实星期几对齐，不再随开始日漂移） */
.mp-day.today{border-color:var(--brand);background:#fff;box-shadow:inset 0 0 0 1px var(--brand)}
.mp-day.today b{color:var(--brand)}
.mp-day .mp-today{display:inline-block;margin-left:3px;font-size:calc(10px * var(--fs, 1));font-style:normal;font-weight:600;color:#fff8f0;background:var(--brand);border-radius:999px;padding:0 5px;vertical-align:1px;line-height:15px}
.mp-dcard.today{border-color:var(--brand);background:#fff}
.mp-dcard.today .mp-dcard-h b{color:var(--brand)}
.task-li.done>span:nth-child(2){color:var(--ink3);text-decoration:line-through}
.task-li .btn{margin-left:auto;flex:0 0 auto}
/* 全屏编辑器 */
.mp-mask{position:fixed;inset:0;z-index:210;background:rgba(47,42,36,.45);display:flex;align-items:flex-end;justify-content:center;padding:0}
.mp-editor{background:var(--bg);width:100%;max-width:560px;max-height:92vh;display:flex;flex-direction:column;border-radius:16px 16px 0 0;box-shadow:0 -8px 30px rgba(0,0,0,.2)}
.mp-ed-h{display:flex;align-items:center;padding:14px 16px;border-bottom:1px solid var(--line)}
.mp-ed-h b{font-size:calc(16.5px * var(--fs, 1))}
.mp-ed-h .btn{margin-left:auto}
.mp-ed-b{overflow-y:auto;padding:14px 16px;-webkit-overflow-scrolling:touch}
.mp-ed-f{display:flex;gap:10px;padding:12px 16px;border-top:1px solid var(--line)}
.mp-ed-f .btn{flex:1}
.mp-row{display:flex;align-items:center;gap:10px;margin-bottom:10px;font-size:calc(14px * var(--fs, 1))}
.mp-row label{flex:0 0 64px;color:var(--ink2)}
.mp-row input{flex:1;min-width:0;border:1px solid var(--line);border-radius:9px;padding:8px 10px;font-size:calc(14px * var(--fs, 1));background:#fff;color:var(--ink)}
.mp-row input[type=number]{max-width:90px}
.mp-dcard{border:1px solid var(--line);border-radius:11px;padding:10px 12px;margin-bottom:10px;background:var(--paper)}
.mp-dcard-h{display:flex;align-items:center;margin-bottom:6px}
.mp-dcard-h b{font-size:calc(14.5px * var(--fs, 1))}
.mp-dcard-h .btn{margin-left:auto;padding:3px 10px;font-size:calc(12.5px * var(--fs, 1))}
.mp-slot{display:flex;align-items:center;gap:7px;padding:5px 0;font-size:calc(13.5px * var(--fs, 1));flex-wrap:wrap}
.mp-slot select,.mp-slot input{border:1px solid var(--line);border-radius:8px;padding:5px 7px;font-size:calc(13px * var(--fs, 1));background:#fff;color:var(--ink)}
.mp-slot input[type=number]{width:58px}
.mp-slot .btn{padding:3px 9px;font-size:calc(12px * var(--fs, 1));margin-left:auto}
@media (max-width:600px){
  .mp-week{grid-template-columns:repeat(4,1fr)}
  .mp-row label{flex:0 0 56px}
}

/* ===== 向右连划两次退出应用（js/exit.js） =====
 * 第一次右滑只出提示条，第二次才退出；提示条 2 秒自动消失。 */
/* 提示条要压在登录/注册浮层之上（#authRoot 是 z-index:300）：
 * 新用户停在登录页时同样是「能划出去」的，看不见提示就等于手势失灵。 */
.exit-hint{
  position:fixed;left:50%;bottom:calc(96px + env(safe-area-inset-bottom));
  transform:translate(-50%,10px);z-index:320;
  display:flex;align-items:center;gap:9px;white-space:nowrap;
  background:rgba(47,42,36,.95);color:#fff8f0;border-radius:999px;
  padding:9px 17px 9px 13px;font-size:calc(13.5px * var(--fs, 1));line-height:1;
  box-shadow:0 8px 24px rgba(0,0,0,.22);
  opacity:0;pointer-events:none;transition:opacity .18s ease,transform .18s ease;
}
.exit-hint.on{opacity:1;transform:translate(-50%,0)}
.exit-hint b{color:#f0c98a;font-weight:700}
.exit-hint .chev{display:inline-flex;gap:2px}
.exit-hint .chev i{
  width:6px;height:6px;border-top:2px solid #f0c98a;border-right:2px solid #f0c98a;
  transform:rotate(45deg);opacity:.25;animation:exitChev 1.05s infinite;
}
.exit-hint .chev i:nth-child(2){animation-delay:.14s}
.exit-hint .chev i:nth-child(3){animation-delay:.28s}
@keyframes exitChev{0%,100%{opacity:.22}45%{opacity:1}}
@media (prefers-reduced-motion:reduce){.exit-hint .chev i{animation:none;opacity:.9}}

/* 「已退出」屏：浏览器不允许脚本关标签时的兜底，必须像一屏完整页面，不能像报错弹窗 */
.exit-bye{
  position:fixed;inset:0;z-index:400;
  display:flex;flex-direction:column;align-items:center;justify-content:center;
  gap:13px;padding:34px 26px;text-align:center;
  background:var(--bg);background-image:radial-gradient(rgba(140,90,60,.035) 1px,transparent 1px);
  background-size:22px 22px;animation:exitFade .22s ease-out;
}
@keyframes exitFade{from{opacity:0;transform:scale(.992)}to{opacity:1;transform:none}}
.exit-bye .seal{
  width:64px;height:64px;border-radius:18px;background:var(--brand);color:#fff8f0;
  display:grid;place-items:center;font-size:calc(30px * var(--fs, 1));font-weight:700;
  box-shadow:0 8px 22px rgba(140,90,60,.28);
}
.exit-bye h3{margin:2px 0 0;font-size:calc(19px * var(--fs, 1));color:var(--brand);letter-spacing:.5px}
.exit-bye p{margin:0;max-width:330px;color:var(--ink2);font-size:calc(13.5px * var(--fs, 1));line-height:1.85}
.exit-bye .btn{margin-top:8px}

/* ===== 问题反馈弹层（js/feedback.js） ===== */
.fb-h{margin:0 0 4px;font-size:calc(17px * var(--fs, 1));color:var(--brand)}
.fb-sub{margin:0 0 14px;line-height:1.7}
.fb-lb{margin:14px 0 7px;font-size:calc(13px * var(--fs, 1));font-weight:600;color:var(--ink2)}
.fb-lb .muted{font-weight:400}
.fb-kinds{display:flex;flex-wrap:wrap;gap:8px}
.fb-ta{min-height:104px;resize:vertical;line-height:1.7}
.fb-count{margin-top:4px;text-align:right;font-size:calc(12px * var(--fs, 1));color:var(--ink3)}
.fb-shots{display:flex;flex-wrap:wrap;gap:9px}
.fb-shots:empty{display:none}
.fb-thumb{position:relative;width:88px;height:88px;border-radius:10px;overflow:hidden;border:1px solid var(--line);background:#fff}
.fb-thumb img{width:100%;height:100%;object-fit:cover;display:block}
.fb-del{
  position:absolute;top:3px;right:3px;width:20px;height:20px;border-radius:50%;
  border:0;background:rgba(47,42,36,.72);color:#fff;font-size:calc(11px * var(--fs, 1));line-height:20px;
  padding:0;display:grid;place-items:center;
}
.fb-add{display:flex;align-items:center;gap:10px;margin-top:9px;flex-wrap:wrap}
.fb-file{display:inline-flex;align-items:center;position:relative;overflow:hidden}
.fb-env{margin:16px 0 0;border-top:1px dashed var(--line2);padding-top:10px}
.fb-env summary{font-size:calc(12.5px * var(--fs, 1));color:var(--ink3);cursor:pointer;list-style:none}
.fb-env summary::-webkit-details-marker{display:none}
.fb-env summary::before{content:"▸ ";color:var(--ink3)}
.fb-env[open] summary::before{content:"▾ "}
.fb-envbox{margin-top:8px;font-size:calc(11.5px * var(--fs, 1));line-height:1.75;color:var(--ink3);word-break:break-all}
.fb-envbox div{display:flex;gap:8px}
.fb-envbox span{flex:0 0 34px;color:var(--ink3)}
.fb-envbox b{font-weight:400;color:var(--ink2)}
.fb-actions{display:flex;gap:10px;margin-top:16px}
.fb-actions .btn{flex:1}
.fb-tip{margin-top:10px;text-align:center;line-height:1.6}

/* ===== 后台：反馈卡片 ===== */
.adm-fb{margin-top:16px}
.adm-fb .adm-tabs{margin-top:8px}
.fb-item{border:1px solid var(--line);border-radius:12px;padding:11px 13px;margin-top:10px;background:var(--paper2)}
.fb-item.st-done{opacity:.66}
.fb-item.st-ignored{opacity:.5}
.fb-item-h{display:flex;align-items:center;gap:8px;flex-wrap:wrap;font-size:calc(12.5px * var(--fs, 1));color:var(--ink3)}
.fb-item-h b{color:var(--ink);font-size:calc(13px * var(--fs, 1))}
.fb-tag{padding:1px 7px;border-radius:999px;font-size:calc(11px * var(--fs, 1));background:var(--brand-soft);color:var(--brand)}
.fb-tag.k-idea{background:var(--blue-soft);color:var(--blue)}
.fb-tag.k-content{background:var(--gold-soft);color:var(--gold)}
.fb-tag.k-other{background:var(--line2);color:var(--ink3)}
.fb-body{margin:7px 0 0;font-size:calc(13.5px * var(--fs, 1));line-height:1.75;white-space:pre-wrap;word-break:break-word}
.fb-imgs{display:flex;gap:8px;margin-top:8px;flex-wrap:wrap}
.fb-imgs img{width:74px;height:74px;object-fit:cover;border-radius:8px;border:1px solid var(--line);cursor:zoom-in}
.fb-item-f{display:flex;gap:7px;margin-top:9px;flex-wrap:wrap}
.fb-item-f .btn{padding:4px 10px;font-size:calc(12px * var(--fs, 1))}
.fb-ctx{margin-top:7px;font-size:calc(11px * var(--fs, 1));color:var(--ink3);word-break:break-all;line-height:1.6}

/* ===== 激活码兑换弹层（2026-10-27）===== */
.act-state{margin:2px 0 14px;padding:9px 12px;border-radius:10px;background:var(--paper2);
  border:1px solid var(--line);font-size:calc(13px * var(--fs, 1));line-height:1.7;color:var(--ink2)}
.act-state b{color:var(--brand)}
.act-state .act-bad{color:var(--red)}
/* 激活码是一串大写字母数字，等宽字体 + 字距能让「0/O、1/I」这类易混字符一眼分清 */
.act-in{font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;
  letter-spacing:.14em;font-size:calc(15.5px * var(--fs, 1));text-align:center;text-transform:uppercase}
.act-btn{width:100%;margin-top:14px}
.act-tip{margin-top:11px;font-size:calc(12px * var(--fs, 1));color:var(--ink3);line-height:1.65;text-align:center}

/* ===== 后台：激活码（2026-10-27）===== */
.act-gen{margin-top:10px;padding:10px 12px;border:1px dashed var(--line);border-radius:10px;background:var(--paper2)}
.act-item{border:1px solid var(--line);border-radius:12px;padding:10px 12px;margin-top:10px;background:var(--paper2)}
/* 激活码要让管理员一眼能念给客户听：等宽 + 字距 + 可选中 */
.act-code{font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;
  font-size:calc(15px * var(--fs, 1));letter-spacing:.1em;color:var(--brand);font-weight:700;
  word-break:break-all;user-select:all;-webkit-user-select:all}
/* 模考倒计时（整卷模考）：等宽字体不跳动；最后 5 分钟转红，是考试该有的紧张感 */
.sim-left{font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-weight:700;color:var(--brand)}
.sim-left.warn{color:var(--red)}
