* { margin:0; padding:0; box-sizing:border-box; }
:root {
  --primary:#1677ff; --primary-light:#e8f3ff; --bg:#f5f8fc; --border:#e5eaf3;
  --text:#1f2329; --text2:#646a73; --green:#00b578; --red:#fa5151; --orange:#ff8f1f;
  --radius:10px; --shadow:0 2px 12px rgba(31,56,88,.08);
}
body { font-family:-apple-system,"PingFang SC","Microsoft YaHei",sans-serif; background:var(--bg); color:var(--text); font-size:14px; }
a { color:var(--primary); text-decoration:none; }
button { cursor:pointer; font-family:inherit; }
input,select,textarea { font-family:inherit; font-size:14px; border:1px solid var(--border); border-radius:8px; padding:8px 12px; outline:none; background:#fff; transition:border .2s; }
input:focus,select:focus,textarea:focus { border-color:var(--primary); }
textarea { resize:vertical; }

/* ---- 布局 ---- */
.layout { display:flex; min-height:100vh; }
.sidebar { width:200px; background:linear-gradient(180deg,#f0f6ff,#f7fafd); border-right:1px solid var(--border); padding:16px 12px; position:fixed; top:0; bottom:0; display:flex; flex-direction:column; }
.logo { display:flex; align-items:center; gap:8px; padding:6px 8px 18px; }
.logo .mark { width:34px; height:34px; border-radius:9px; background:var(--primary); color:#fff; display:flex; align-items:center; justify-content:center; font-weight:700; font-size:15px; }
.logo b { font-size:14px; }
.logo small { display:block; color:var(--text2); font-size:11px; }
.nav { flex:1; overflow-y:auto; }
.nav-item { display:flex; align-items:center; gap:10px; padding:10px 12px; border-radius:8px; color:var(--text); margin-bottom:2px; cursor:pointer; }
.nav-item:hover { background:#e8f1fd; }
.nav-item.active { background:var(--primary); color:#fff; font-weight:600; }
.nav-item .ico { width:18px; text-align:center; }
/* v1.76.0 待办角标：菜单右侧一个红点数字，没活的时候整块不占位 */
.tab-badge { display:none; }
.nav-badge { display:none; margin-left:auto; min-width:18px; height:18px; padding:0 5px;
  border-radius:9px; background:#fa5151; color:#fff; font-size:11px; font-weight:700;
  line-height:18px; text-align:center; box-shadow:0 2px 6px rgba(250,81,81,.35);
  animation:badgePop .3s ease; }
.nav-item.active .nav-badge { background:#fff; color:#fa5151; box-shadow:none; }
.foot { color:var(--text2); font-size:11px; padding:10px 8px 0; border-top:1px solid var(--border); }
.verline { margin-top:8px; font-size:10.5px; color:#aab3c2; letter-spacing:.3px; font-variant-numeric:tabular-nums; }
.main { flex:1; margin-left:200px; padding:20px 24px 40px; }
.topbar { display:flex; align-items:center; justify-content:space-between; margin-bottom:18px; }
.topbar h1 { font-size:20px; }
.topbar .right { display:flex; gap:10px; align-items:center; }

/* ---- 组件 ---- */
.btn { border:none; border-radius:8px; padding:8px 16px; background:var(--primary); color:#fff; font-size:13px; }
.btn:hover { opacity:.9; }
.btn.plain { background:#fff; color:var(--text); border:1px solid var(--border); }
.btn.plain:hover { border-color:var(--primary); color:var(--primary); opacity:1; }
.btn.green { background:var(--green); }
.btn.red { background:var(--red); }
.btn.warn { background:var(--orange); }
.btn.sm { padding:4px 10px; font-size:12px; border-radius:6px; }
.btn:disabled { opacity:.5; cursor:not-allowed; }
.card { background:#fff; border-radius:var(--radius); box-shadow:var(--shadow); padding:18px; margin-bottom:16px; }
.card h3 { font-size:15px; margin-bottom:12px; }
.grid { display:grid; gap:12px; }
.stats { display:grid; grid-template-columns:repeat(auto-fit,minmax(130px,1fr)); gap:12px; }
.stat { background:#fff; border-radius:var(--radius); box-shadow:var(--shadow); padding:14px 16px; }
.stat .num { font-size:26px; font-weight:700; color:var(--primary); }
.stat .num.green { color:var(--green); } .stat .num.orange { color:var(--orange); } .stat .num.red { color:var(--red); }
.stat .lbl { color:var(--text2); font-size:12px; margin-top:2px; }
table.tb { width:100%; border-collapse:collapse; }
.tb th { text-align:left; color:var(--text2); font-weight:500; font-size:12px; padding:8px; border-bottom:1px solid var(--border); white-space:nowrap; }
.tb td { padding:9px 8px; border-bottom:1px solid #f2f4f8; font-size:13px; vertical-align:top; }
/* 可排序表头（v1.58.45 成绩页考生成绩）：点一下排序，再点切换升/降 */
.tb th.sorth { cursor:pointer; user-select:none; -webkit-user-select:none; }
.tb th.sorth:hover { color:var(--primary); }
.tb th.sorth.on { color:var(--primary); font-weight:600; }
.tb th.sorth .so { font-size:9px; margin-left:3px; }
.tb tr:hover td { background:#fafcff; }
.tag { display:inline-block; padding:2px 8px; border-radius:5px; font-size:12px; background:var(--primary-light); color:var(--primary); }
.tag.green { background:#e6f7f0; color:var(--green); }
.tag.red { background:#ffecec; color:var(--red); }
.tag.orange { background:#fff4e5; color:var(--orange); }
.tag.gray { background:#f0f1f5; color:var(--text2); }
/* 作业批改：贴纸与快捷评语 */
.stag { font-size:20px; line-height:1; padding:5px 9px; border:1.5px solid #e6e8ee; background:#fff;
  border-radius:9px; cursor:pointer; transition:.15s; filter:grayscale(.55); opacity:.72;
  display:inline-flex; align-items:center; justify-content:center; }
.stag svg { display:block; }
.stag:hover { filter:none; opacity:1; }
.stag.on { border-color:#ffb020; background:#fff8e8; filter:none; opacity:1;
  box-shadow:0 0 0 2px rgba(255,176,32,.18); transform:translateY(-1px); }
.stag.bad.on { border-color:#fa5151; background:#fff0f0; box-shadow:0 0 0 2px rgba(250,81,81,.16); }
.phr { font-size:12px; padding:4px 9px; border:1px solid #e6e8ee; background:#fafbfc; color:var(--text2);
  border-radius:14px; cursor:pointer; transition:.15s; }
.phr:hover { border-color:var(--primary); color:var(--primary); background:#f0f7ff; }
.hw-sticks { display:flex; gap:6px; align-items:center; flex-wrap:wrap; margin-bottom:6px; }
.hw-sticks .stag { cursor:default; pointer-events:none; padding:4px; width:28px; height:28px; }
.hw-sticks .stag svg { width:18px; height:18px; }
/* 评语里的行内贴纸：与文字同排 */
.stag.inline-stag { padding:1px; width:22px; height:22px; vertical-align:-6px; margin:0 2px;
  border:none; background:transparent; box-shadow:none; pointer-events:none; }
.stag.inline-stag svg { width:20px; height:20px; }
/* 分数未选择提示 */
select.need { border-color:#fa5151 !important; box-shadow:0 0 0 3px rgba(250,81,81,.14); animation:hwShake .35s; }
@keyframes hwShake { 0%,100%{transform:translateX(0)} 25%{transform:translateX(-3px)} 75%{transform:translateX(3px)} }
.hw-thumb { transition:.15s; }
.hw-thumb:hover { transform:scale(1.04); box-shadow:0 3px 12px rgba(0,0,0,.15); }
.filters { display:flex; flex-wrap:wrap; gap:8px; align-items:center; margin-bottom:12px; }
.filters input,.filters select { padding:6px 10px; font-size:13px; }
.empty { text-align:center; color:var(--text2); padding:40px 0; }
.muted { color:var(--text2); font-size:12px; }
.form-row { margin-bottom:12px; }
.form-row label { display:block; font-size:13px; color:var(--text2); margin-bottom:5px; }
.form-row input,.form-row select,.form-row textarea { width:100%; }

/* v1.56.1：表单行里的「勾选框 / 单选框」不要跟着上面那条 width:100% 走。
   它们本该只有内容那么宽 —— 被撑成整行宽会把同一行的其它元素挤成 0 宽度
   （批改设置「逐题指定」就因此看不到题号，和 v1.53.1 下拉框那次同源）。 */
.form-row input[type=checkbox],
.form-row input[type=radio] { width:auto; flex:0 0 auto; }
.flex { display:flex; gap:8px; align-items:center; flex-wrap:wrap; }
.chart { width:100%; height:300px; }
/* v1.58.21：成绩页的两个图表（分数段人数分布 / 各题型得分率）用更紧凑的高度，别占满屏 */
.reschart { height:200px; }
@media (max-width:800px){ .reschart { height:158px; } }

/* ---- 弹窗 ---- */
.mask { position:fixed; inset:0; background:rgba(15,27,45,.45); z-index:300; display:flex; align-items:flex-start; justify-content:center; padding:40px 16px; overflow-y:auto; }
.modal { background:#fff; border-radius:14px; width:720px; max-width:100%; padding:22px 24px; box-shadow:0 10px 40px rgba(0,0,0,.2); overflow-y:auto; }
.modal h3 { margin-bottom:16px; font-size:16px; }
.modal .close { float:right; border:none; background:none; font-size:20px; color:var(--text2); }

/* ---- Toast ---- */
#toast-root { position:fixed; top:20px; left:50%; transform:translateX(-50%); z-index:400; }
.toast { background:#fff; box-shadow:var(--shadow); border-left:4px solid var(--green); padding:10px 18px; border-radius:8px; margin-bottom:8px; font-size:13px; }
.toast.err { border-left-color:var(--red); }

/* ---- 登录 ---- */
.login-wrap { min-height:100vh; display:flex; align-items:center; justify-content:center; background:linear-gradient(135deg,#dbeafe,#f0f9ff 60%,#e0f2f1); }
.login-card { background:#fff; border-radius:18px; box-shadow:0 20px 60px rgba(22,119,255,.15); padding:40px 44px; width:400px; }
.login-card h2 { text-align:center; margin-bottom:6px; }
.login-card .sub { text-align:center; color:var(--text2); margin-bottom:24px; font-size:13px; }
.login-card input { width:100%; margin-bottom:14px; padding:11px 14px; }
.login-card .btn { width:100%; padding:12px; font-size:15px; }

/* ---- 答题 ---- */
.exam-head { position:sticky; top:0; z-index:50; background:#fff; box-shadow:var(--shadow); padding:12px 24px; display:flex; justify-content:space-between; align-items:center; }
.timer { font-size:22px; font-weight:700; color:var(--primary); font-variant-numeric:tabular-nums; }
.timer.warn { color:var(--red); }
.q-item { background:#fff; border-radius:var(--radius); box-shadow:var(--shadow); padding:20px; margin-bottom:14px; }
.q-item .stem { font-size:15px; margin-bottom:12px; line-height:1.6;
  /* v1.45.0：保留题干里的换行 —— 阅读理解类题目「Directions / 短文 / 词库」
     原本会被压成一整块，学生读起来很费劲（英文长文尤其明显） */
  white-space: pre-wrap; word-break: break-word; }
.opt { display:block; padding:10px 14px; border:1px solid var(--border); border-radius:8px; margin-bottom:8px; cursor:pointer; transition:.15s; }
.opt:hover { border-color:var(--primary); }
.opt.sel { border-color:var(--primary); background:var(--primary-light); }
.opt.correct { border-color:var(--green); background:#e6f7f0; }
.opt.wrong { border-color:var(--red); background:#ffecec; }
.sheet { display:grid; grid-template-columns:repeat(auto-fill,minmax(36px,1fr)); gap:8px; }
.sheet .cell { height:36px; display:flex; align-items:center; justify-content:center; border:1px solid var(--border); border-radius:8px; cursor:pointer; font-size:13px; }
.sheet .cell.done { background:var(--primary); color:#fff; border-color:var(--primary); }
.sheet .cell.cur { outline:2px solid var(--orange); }
.ans-box { background:#e6f7f0; border-radius:8px; padding:10px 14px; margin-top:10px; font-size:13px; }
.ans-box.wrong { background:#ffecec; }
.drop { border:2px dashed var(--border); border-radius:12px; padding:40px; text-align:center; color:var(--text2); transition:.2s; }
.drop.over { border-color:var(--primary); background:var(--primary-light); }
.kbd { background:#f0f1f5; border-radius:4px; padding:1px 6px; font-size:12px; }

/* ---- 入口选择页 ---- */
.gate-wrap { min-height:100vh; display:flex; align-items:center; justify-content:center; padding:20px;
  background:linear-gradient(135deg,#dbeafe,#f0f9ff 50%,#e0f2f1); }
.gate-card { background:#fff; border-radius:22px; box-shadow:0 20px 60px rgba(22,119,255,.16); padding:44px 40px; width:520px; max-width:100%; text-align:center; }
.gate-logo { font-size:48px; margin-bottom:8px; }
.gate-card h1 { font-size:24px; margin-bottom:4px; }
.gate-card .sub { color:var(--text2); margin-bottom:28px; }
.gate-btns { display:grid; gap:14px; }
.gate-btn { display:flex; align-items:center; gap:14px; text-align:left; padding:18px 20px; border:2px solid var(--border); border-radius:14px; cursor:pointer; transition:.2s; }
.gate-btn:hover { border-color:var(--primary); box-shadow:var(--shadow); transform:translateY(-2px); }
.gate-btn.student .ico { background:#e6f7f0; }
.gate-btn.teacher .ico { background:var(--primary-light); }
.gate-btn .ico { width:52px; height:52px; border-radius:12px; display:flex; align-items:center; justify-content:center; font-size:26px; flex-shrink:0; }
.gate-btn .t { font-size:17px; font-weight:700; white-space:nowrap; }
.gate-btn .d { font-size:12px; color:var(--text2); margin-top:2px; white-space:nowrap; }
.gate-foot { margin-top:26px; color:#aaa; font-size:12px; }

/* ---- 学生中心 ---- */
.stu-wrap { max-width:860px; margin:0 auto; padding:20px 16px 40px; }
.stu-head { background:linear-gradient(135deg,#e8f3ff,#f0f9ff); border-radius:var(--radius); box-shadow:var(--shadow); padding:20px 22px; margin-bottom:16px; display:flex; justify-content:space-between; align-items:flex-start; flex-wrap:wrap; gap:10px; }
.stu-head .hi { font-size:20px; font-weight:700; }
.stu-head .encourage { color:var(--primary); margin-top:8px; font-size:15px; }
/* ---- 欢迎卡（定版：姓名+徽章 / 资料一行 / 鼓励语竖线） ---- */
.hi-b-top { display:flex; align-items:center; gap:7px; }
.hi-b-name { font-size:18px; font-weight:700; }
.hi-b-badge { font-size:11px; font-weight:600; color:#fff; background:linear-gradient(135deg,#5fa2ff,#8b8cff); padding:2px 8px; border-radius:20px; }
.hi-b-meta { margin-top:6px; font-size:12.5px; color:var(--text2); }
.hi-b-meta b { color:var(--primary); }
.hi-c-line { margin-top:8px; font-size:12.5px; color:var(--primary); padding-left:10px; border-left:3px solid rgba(22,119,255,.35); line-height:1.5; }
/* ---- 运行面板 ---- */
.dash-sub { font-size:11.5px; color:#9aa5b5; margin-top:4px; line-height:1.4; }
.stat .num.blue { color:#1677ff; }
.stat .num.green { color:#00b578; }
.stat .num.red { color:#fa5151; }
.barchart { display:flex; align-items:flex-end; gap:6px; height:132px; padding:20px 2px 0; border-bottom:1px solid #eef1f6; }
/* v1.83.3 柱顶数值：字号和颜色统一，跟着柱顶走，最大最小值不缩放 */
.bar{ position:relative; }
.bar .barnum{ position:absolute; left:50%; top:-16px; transform:translateX(-50%);
  font-size:10.5px; font-weight:600; color:#5b6472; line-height:1; white-space:nowrap; }
.barcol { flex:1; display:flex; flex-direction:column; align-items:center; justify-content:flex-end; height:100%; min-width:0; }
.bar { width:100%; max-width:52px; background:linear-gradient(180deg,#7aa8ff,#5b8def); border-radius:5px 5px 0 0; transition:.2s; min-height:3px; }
.bar.act { background:linear-gradient(180deg,#5fd3a8,#31b98a); }
.barcol:hover .bar { filter:brightness(1.12); }
.barlb { font-size:10px; color:#9aa5b5; margin-top:4px; white-space:nowrap; }
.rk { display:inline-flex; align-items:center; justify-content:center; width:20px; height:20px; border-radius:50%; font-size:11.5px; font-weight:700; color:#fff; }
.rk1 { background:linear-gradient(135deg,#ffc53d,#ff9c14); }
.rk2 { background:linear-gradient(135deg,#c9d3e0,#9aa8bd); }
.rk3 { background:linear-gradient(135deg,#e8a97a,#cf8a52); }

/* ---- 课时添加：链接校验提示 ---- */
.lnk-ok { background:#e9f9f1; color:#0a8a5a; border-radius:8px; padding:9px 12px; font-size:12.5px; margin-top:6px; }
.lnk-bad { background:#fff1f0; color:#c9392b; border-radius:8px; padding:9px 12px; font-size:12.5px; margin-top:6px; line-height:1.6; }
.lnk-bad code, .lnk-ok code { background:rgba(0,0,0,.07); padding:1px 5px; border-radius:4px; font-size:12px; }

/* ---- 学生端：已完成练习折叠条 ---- */
.pdone-bar { margin-top:16px; padding:11px 14px; background:#f2f4f8; border-radius:10px; color:#6b7686;
  font-size:13px; cursor:pointer; display:flex; align-items:center; gap:7px; user-select:none; transition:.15s; }
.pdone-bar:hover { background:#e9edf4; color:var(--primary); }
.pdone-bar svg { transition:transform .2s; flex-shrink:0; }
.pdone-bar.open svg { transform:rotate(90deg); }

/* ---- 后台练习卷拖拽排序 ---- */
.tb.pset-tb tr[draggable] { cursor:default; }
.pset-handle { cursor:grab; text-align:center; user-select:none; }
.pset-handle:active { cursor:grabbing; }
.pset-handle svg { display:block; margin:0 auto; }
.tb.pset-tb tr.dragging { opacity:.45; background:#f0f6ff; }
.tb.pset-tb tr.dragging td { border-top:2px dashed var(--primary); border-bottom:2px dashed var(--primary); }

.shome-foot { text-align:center; margin-top:18px; font-size:12px; color:#b3bcc9; letter-spacing:2px; }
.exam-row { display:flex; justify-content:space-between; align-items:center; flex-wrap:wrap; gap:8px; padding:14px 0; border-bottom:1px solid #f2f4f8; }
.exam-row:last-child { border-bottom:none; }

/* ---- 响应式：手机端 ---- */
.mnav { display:none; }
.mtop, .mtabbar, .drawer, .drawer-mask { display:none; }
.tplbar { display:flex; flex-wrap:wrap; gap:8px; align-items:center; background:#f0f6ff; border:1px dashed #b8d4ff;
  border-radius:10px; padding:10px 14px; margin-bottom:14px; }

@media (max-width:800px){
  /* 关键：锁死横向溢出，避免宽表格把整页撑开 */
  html, body { max-width:100%; overflow-x:hidden; }
  .layout { display:block; }
  .page, #page { max-width:100%; overflow-x:hidden; }

  /* 侧边栏与顶部 mnav 在手机端隐藏，改用抽屉 + 底部 Tab */
  .sidebar{ display:none; }
  .mnav{ display:none; }
  .main{ margin-left:0; padding:12px 12px 104px; width:100%; max-width:100%; box-sizing:border-box; }

  /* 顶部标题栏 */
  .mtop{ display:flex; align-items:center; gap:10px; position:sticky; top:0; z-index:60;
    width:100%; box-sizing:border-box;
    background:#fff; border-bottom:1px solid var(--border);
    padding:calc(10px + env(safe-area-inset-top,0px)) 12px 10px; margin:-12px -12px 12px; }
  .mburger{ border:none; background:transparent; font-size:21px; line-height:1; color:var(--text); padding:4px 6px; flex-shrink:0; }
  .mtitle{ flex:1 1 0; min-width:0; font-size:16px; font-weight:600; overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
  .mright{ display:flex; gap:6px; align-items:center; flex-shrink:0; }
  .mright .btn{ padding:6px 10px; font-size:12px; }

  /* 桌面顶栏在手机端默认隐藏（老师端标题已在 mtop，不必重复）
     例外：学生端页面没有 mtop —— 必须保留自己的顶栏，否则手机上没有标题、也没有「返回」按钮 */
  .topbar{ display:none; }
  .stu-wrap > .topbar{ display:flex; margin-bottom:14px; }
  .stu-wrap > .topbar h1{ font-size:17px; }
  .stu-wrap > .topbar .right .btn{ padding:6px 10px; font-size:12.5px; white-space:nowrap; }

  /* 抽屉菜单 */
  .drawer-mask{ display:block; position:fixed; inset:0; background:rgba(0,0,0,.42); z-index:200;
    opacity:0; visibility:hidden; transition:opacity .22s; }
  .drawer-mask.open{ opacity:1; visibility:visible; }
  .drawer{ display:flex; flex-direction:column; position:fixed; top:0; bottom:0; left:0; width:255px; max-width:82vw;
    background:#fff; z-index:210; transform:translateX(-102%); transition:transform .25s ease;
    box-shadow:2px 0 18px rgba(0,0,0,.14);
    padding-top:env(safe-area-inset-top,0px); padding-bottom:env(safe-area-inset-bottom,0px); }
  .drawer.open{ transform:translateX(0); }
  .drawer-head{ padding:16px 16px 12px; border-bottom:1px solid var(--border); }
  .drawer-head b{ font-size:15px; display:block; }
  .drawer-head small{ color:var(--text2); font-size:12px; }
  .drawer-nav{ flex:1; overflow-y:auto; padding:10px 10px 16px; }
  .drawer-nav .nav-item{ padding:12px; }
  .drawer-foot{ padding:10px 16px; border-top:1px solid var(--border); font-size:12px; color:var(--text2); }

  /* 底部 Tab 栏 */
  .mtabbar{ display:flex; position:fixed; left:0; right:0; bottom:0; z-index:150;
    background:#fff; border-top:1px solid var(--border); padding:4px 0 calc(10px + env(safe-area-inset-bottom,0px)); }
  .mtabbar a{ flex:1; display:flex; flex-direction:column; align-items:center; justify-content:center;
    gap:2px; padding:5px 2px; color:var(--text2); font-size:11px; text-decoration:none; }
  .mtabbar a .ti{ font-size:18px; line-height:1; }
  .mtabbar a{ position:relative; }
  .tab-badge{ display:none; position:absolute; top:0; left:50%; margin-left:6px;
    min-width:15px; height:15px; padding:0 4px; border-radius:8px; background:#fa5151; color:#fff;
    font-size:10px; font-weight:700; line-height:15px; text-align:center;
    box-shadow:0 1px 4px rgba(250,81,81,.4); }
  .mtabbar a.active{ color:var(--primary); font-weight:600; }
  .mtabbar a.more{ color:#8a93a3; }

  /* 教师端页脚：手机端最下方的留白区 —— 放鼓励语与机构名，
     同时作为「内容」与「底部 Tab 栏 + 系统手势条/智能条」之间的缓冲，降低误触 */
  .tfoot{ margin:26px 0 6px; padding:20px 12px 10px; border-top:1px dashed #e7ebf2; text-align:center; }
  .tfoot-quote{ font-size:12.5px; line-height:1.9; color:#9aa4b2; }
  .tfoot-org{ margin-top:8px; font-size:11.5px; color:#b9c1cd; letter-spacing:1.5px; }

  /* 弹窗与表格 */
  .modal{ width:auto !important; max-width:calc(100vw - 24px) !important; min-width:0 !important; margin:12px; padding:18px 15px calc(14px + env(safe-area-inset-bottom,0px)); max-height:calc(88vh - env(safe-area-inset-bottom,0px)); overflow-y:auto; }
  .mask{ padding:0; align-items:center; }
  .grid{ grid-template-columns:1fr !important; }
  /* 内联写死列数的栅格（如 repeat(4,1fr)）在手机上强制单/双列 */
  [style*="grid-template-columns:repeat"]{ grid-template-columns:repeat(2,1fr) !important; }
  [style*="grid-template-columns:repeat(6"]{ grid-template-columns:repeat(3,1fr) !important; }
  [style*="grid-template-columns:1fr 1fr 1fr 1fr"]{ grid-template-columns:repeat(2,1fr) !important; }
  [style*="minmax(220px"]{ grid-template-columns:repeat(2,1fr) !important; }
  [style*="minmax(180px"]{ grid-template-columns:repeat(2,1fr) !important; }
  [style*="minmax(130px"]{ grid-template-columns:repeat(2,1fr) !important; }
  .stats{ grid-template-columns:repeat(2,1fr); gap:10px; }
  .stat .num{ font-size:20px; }
  .card{ padding:14px; }
  .tb{ display:block; width:100%; max-width:100%; overflow-x:auto; white-space:nowrap; -webkit-overflow-scrolling:touch; }
  .tb th, .tb td{ padding:8px 6px; }
  /* 表格外层容器也要能横向滚动而不撑破页面 */
  .card{ overflow-x:auto; }
  .tplbar{ width:100%; box-sizing:border-box; }
  .filters{ gap:6px; }
  .filters input, .filters select{ flex:1 1 auto; min-width:0; }
  .filters .btn{ flex:0 0 auto; }
  .form-row label{ font-size:13px; }
  .gate-card{ padding:32px 24px; }
  .stu-head{ flex-direction:column; }
  .exam-head{ flex-direction:column; align-items:stretch; gap:6px; padding:8px 14px; }
  /* 手机端：倒计时与交卷同排，中间留出安全间距，降低滑动误触 */
  .exam-head .exam-actions{ width:100%; justify-content:space-between; flex-wrap:nowrap; }
  .exam-head .exam-gap{ display:inline-block; width:24px; flex:0 0 24px; }
  .exam-head .timer{ font-size:20px; }
  .exam-head .exam-actions .btn{ padding:8px 16px; flex:0 0 auto; }
  .exam-head > div:first-child{ font-size:13px; line-height:1.6; }
  .pet{ font-size:38px; }
  /* 手机端卡片内按钮组换行更友好 */
  .flex{ flex-wrap:wrap; }
}

/* 桌面：9 个指标正好一行排满（130px 会挤成 8 个 + 1 个孤行） */
@media(min-width:901px){
  .stats-home{grid-template-columns:repeat(auto-fit,minmax(116px,1fr))}
}

/* ---- v1.83.2 主页统计卡：手机端两列紧凑排 ----
   原来一行一个，7 个指标要占 7 屏高，翻到「快捷操作」得滑三下。
   两列后 7 个指标只占 4 行，且 4 位数（1215）在 160px 宽里放得下。
   不选 3 列：「计算机二级」5 个字在 110px 里会折行，卡片高度反而变高、更乱。 */
/* 账号活跃度：保持 2 列，不做 3 列（数字带「分钟」、副标题也长） */
@media(max-width:900px){
  .stats-act{grid-template-columns:repeat(2,minmax(0,1fr)) !important;gap:9px}
  .stats-act .stat{padding:11px 12px}
  .stats-act .stat .num{font-size:21px}
}
@media(max-width:380px){
  .stats-act{grid-template-columns:repeat(2,minmax(0,1fr)) !important}
  .stats-act .stat .num{font-size:19px}
}

@media(max-width:900px){
  .stats-home{grid-template-columns:repeat(3,minmax(0,1fr)) !important;gap:7px}
  .stats-home .stat{padding:9px 9px;border-radius:11px}
  .stats-home .stat .num{font-size:19px;line-height:1.15;white-space:nowrap;letter-spacing:-.4px}
  .stats-home .stat .lbl{font-size:10.5px;margin-top:1px;line-height:1.4;white-space:nowrap;
    overflow:hidden;text-overflow:ellipsis}
  /* 8 个指标按 3 列排会剩 1 个空格，让最后一个占两格填满，不留白洞 */
  .stats-home .stat:last-child:nth-child(3n+2){grid-column:span 2}
  .stats-home .stat.quick .qf-tip{display:none}     /* 「点击查看」整卡可点，手机上不占一行 */
  .stats-home .dash-sub{font-size:10.5px;margin-top:2px}
}
@media(max-width:380px){
  .stats-home{grid-template-columns:repeat(3,minmax(0,1fr)) !important;gap:6px}
  .stats-home .stat{padding:8px 7px}
  .stats-home .stat .num{font-size:17.5px}
  .stats-home .stat .lbl{font-size:10px}
}

/* 超小屏进一步压缩 */
@media (max-width:380px){
  .stats{ grid-template-columns:1fr; }
  .mtabbar a .tt{ font-size:10px; }
}



/* ---- 小宠物 ---- */
/* ---- v1.58.27：消消乐「本组完成」的随机鼓励语（带入场动画）---- */
.mm-done{ min-height:190px; margin:18px 0 6px; text-align:center;
  display:flex; flex-direction:column; align-items:center; justify-content:center; }
@media (max-width:800px){ .mm-done{ min-height:156px; } }
.mm-done-btn{ margin-top:16px; }
.mm-praise{ position:relative; z-index:2; margin:0 auto; padding:16px 14px; border-radius:14px;
  background:linear-gradient(135deg,#fff8e6,#ffe9cf); border:1px solid #ffe0a8;
  display:flex; align-items:center; justify-content:center; gap:10px; }
/* 烟花层：铺满整个弹窗内容区，纯装饰不挡点击 */
.mm-fw{ position:absolute; inset:0; overflow:hidden; pointer-events:none; z-index:1; border-radius:6px; }
.mm-fw i{ position:absolute; width:8px; height:8px; border-radius:50%; background:var(--c);
  box-shadow:0 0 12px var(--c), 0 0 4px #fff inset; opacity:0;
  transform:translate(-50%,-50%); animation: fwBurst 1.75s var(--d) ease-out infinite; }
@keyframes fwBurst{
  0%{ transform:translate(-50%,-50%) scale(.25); opacity:0 }
  8%{ opacity:1 }
  55%{ opacity:.92 }
  100%{ transform:translate(calc(-50% + var(--dx)), calc(-50% + var(--dy))) scale(.35); opacity:0 }
}
.mm-praise-emo{ font-size:27px; line-height:1; display:inline-block;
  animation: mmPop .62s cubic-bezier(.2,1.6,.4,1) both, mmSwing 1.7s .62s ease-in-out infinite; }
.mm-praise-txt{ font-size:15.5px; font-weight:800; color:#d46b08; letter-spacing:.4px;
  animation: mmRise .5s .12s ease-out both; }
@keyframes mmPop{ 0%{transform:scale(.2) rotate(-22deg);opacity:0}
  60%{transform:scale(1.28) rotate(9deg);opacity:1} 100%{transform:scale(1) rotate(0)} }
@keyframes mmSwing{ 0%,100%{transform:rotate(-9deg) scale(1)} 50%{transform:rotate(9deg) scale(1.09)} }
@keyframes mmRise{ from{transform:translateY(12px);opacity:0} to{transform:translateY(0);opacity:1} }
@media (max-width:800px){ .mm-praise-txt{ font-size:14.5px } .mm-praise-emo{ font-size:24px } }

.pet { position:absolute; left:0; right:0; bottom:64px; text-align:center; cursor:pointer; user-select:none; z-index:5; animation: petwalk 24s ease-in-out infinite alternate; }
.pet span { display:inline-block; font-size:46px; filter:drop-shadow(0 3px 5px rgba(0,0,0,.2)); animation: petidle 1.6s ease-in-out infinite; }@keyframes petidle { 0%{transform:translateY(0) rotate(0)} 25%{transform:translateY(-4px) rotate(-6deg)} 50%{transform:translateY(0) rotate(0)} 75%{transform:translateY(-4px) rotate(6deg)} 100%{transform:translateY(0) rotate(0)} }
.pet.play span { animation: petjump .82s ease; }
@keyframes petwalk { 0%{bottom:64px} 100%{bottom:74%} }
@keyframes petjump { 0%{transform:translateY(0) rotate(0) scale(1)} 28%{transform:translateY(-44px) rotate(-14deg) scale(1.22)} 55%{transform:translateY(0) rotate(0) scale(.94,1.08)} 78%{transform:translateY(-19px) rotate(10deg) scale(1.1)} 100%{transform:translateY(0) rotate(0) scale(1)} }
.pettip { position:absolute; bottom:100%; left:50%; transform:translateX(-50%); background:#333; color:#fff; padding:7px 12px; border-radius:10px; font-size:12px; line-height:1.6; white-space:normal; width:max-content; max-width:230px; text-align:center; margin-bottom:10px; display:none; z-index:50; box-shadow:0 4px 14px rgba(0,0,0,.25); }
.pettip::after { content:''; position:absolute; top:100%; left:50%; transform:translateX(-50%); border:5px solid transparent; border-top-color:#333; }
/* ---- 列头筛选 ---- */
.colfilter { color:#1677ff; cursor:pointer; font-size:15px; padding:1px 5px; border-radius:5px; background:#e8f1ff; vertical-align:middle; }
.colfilter:hover { background:#1677ff; color:#fff; }
.citem { padding:8px 14px; cursor:pointer; }
.citem:hover { background:#f5f7fa; }
.citem.on { color:#1677ff; font-weight:600; background:#f0f6ff; }
/* ---- 学生端宠物：色块内左右巡游 ---- */
.stu-head { position:relative; }
.pet.spet { left:auto; right:16px; bottom:8px; animation: petwalkx 16s ease-in-out infinite alternate; }
@keyframes petwalkx { 0%{right:3%} 100%{right:82%} }
.pet.spet span { font-size:38px; }
.pet.spet .pettip { bottom:calc(100% + 6px); left:50%; }
.pet.spet .pettip { bottom:calc(100% + 6px); }
/* ---- 侧边栏折叠二级菜单 ---- */
.nav-parent { position:relative; }
.nav-parent .arrow { position:absolute; right:12px; top:50%; transform:translateY(-50%); font-size:11px; color:var(--text2); }
.nav-sub { margin-left:12px; border-left:2px solid #e6edf5; padding-left:2px; }
.nav-item.sub { padding:8px 12px; font-size:13px; }
.nav-item.sub .ico { font-size:14px; }
/* ---- 消消乐 ---- */
.mm-cell { padding:11px 14px; border:1px solid var(--border); border-radius:8px; margin-bottom:8px; cursor:pointer; background:#fff; transition:.15s; text-align:center; font-size:14px; }
.mm-cell:hover { border-color:var(--primary); background:#f0f6ff; }
.mm-cell.sel { border-color:var(--primary); background:#e6f0ff; box-shadow:0 0 0 2px rgba(22,119,255,.15); }
.mm-cell.gone { visibility:hidden; border:1px dashed #eee; background:transparent; }
/* ---- 翻牌记忆 ---- */
.mm-card { aspect-ratio:1; display:flex; align-items:center; justify-content:center; border:1px solid var(--border); border-radius:8px; background:#eef1f6; cursor:pointer; font-size:13px; text-align:center; padding:6px; transition:.2s; word-break:break-all; }
.mm-card.up { background:#fff; border-color:var(--primary); }
.mm-card.gone { visibility:hidden; }

/* ---- 学生端首页 7 宫格入口（淡色渐变卡） ---- */
.shome-grid { display:grid; grid-template-columns:1fr 1fr; gap:10px; margin-top:12px; }
.scard { border-radius:14px; padding:14px 12px; color:#fff; text-decoration:none; display:block; transition:.15s; }
.scard { position:relative; }
/* 学生首页红点角标（有新批改时显示） */
.scard-badge { position:absolute; top:-7px; right:-7px; min-width:20px; height:20px; line-height:20px; padding:0 6px; box-sizing:border-box; background:#fa5151; color:#fff; font-size:11.5px; font-weight:700; text-align:center; border-radius:10px; box-shadow:0 2px 8px rgba(250,81,81,.45); border:2px solid #fff; animation:badgePop .35s ease; }
@keyframes badgePop { 0%{transform:scale(0)} 60%{transform:scale(1.25)} 100%{transform:scale(1)} }
.scard:hover { transform:translateY(-2px); box-shadow:0 6px 16px rgba(0,0,0,.12); }
.scard .ico { font-size:24px; line-height:1; }
.scard .nm { font-size:13.5px; font-weight:700; margin-top:6px; }
.scard .ds { font-size:10.5px; opacity:.92; margin-top:2px; }
.scard.wide { grid-column:1/-1; display:flex; align-items:center; gap:12px; padding:14px 16px; }
.scard.wide .ico { font-size:26px; }
.shome-logout { text-align:center; color:#98a2b3; font-size:12.5px; padding:10px; background:#eef1f6; border-radius:10px; margin-top:12px; cursor:pointer; }
.sver { text-align:center; margin-top:10px; font-size:11px; color:#b3bcc9; letter-spacing:.3px; font-variant-numeric:tabular-nums; }
.scard.c1 { background:linear-gradient(135deg,#7aa8ff,#9288ff); }
.scard.c2 { background:linear-gradient(135deg,#ff9a7c,#ff7ba3); }
.scard.c3 { background:linear-gradient(135deg,#4fc9a2,#45c5b2); }
.scard.c4 { background:linear-gradient(135deg,#ffb066,#ff8f66); }
.scard.c5 { background:linear-gradient(135deg,#a897ff,#c07dff); }
.scard.c6 { background:linear-gradient(135deg,#6b9dff,#5fc4ff); }
.scard.c7 { background:linear-gradient(135deg,#ff8a9c,#ffb066); }

/* ============ 错题本「消灭错题」游戏 ============ */
.stats.stats4{ grid-template-columns:repeat(4,1fr); }
.stat.stat-game{ cursor:pointer; background:linear-gradient(135deg,#fff7e6,#ffe9c7);
  border:1.5px solid #ffd591; position:relative; overflow:hidden; transition:transform .15s, box-shadow .15s; }
.stat.stat-game:hover{ transform:translateY(-2px); box-shadow:0 6px 16px rgba(255,152,0,.25); }
.stat.stat-game .num{ font-size:24px; }
.stat.stat-game .lbl{ color:#d46b08; font-weight:700; }
.stat.stat-game .game-sub{ font-size:11px; color:#ad6800; margin-top:3px; }
.stat.stat-game::after{ content:''; position:absolute; right:-14px; top:-14px; width:52px; height:52px;
  background:radial-gradient(circle,rgba(255,193,7,.45),transparent 70%); border-radius:50%; }

/* 游戏舞台 */
.wg-wrap{ padding:4px 2px; }
.wg-hud{ display:flex; align-items:center; justify-content:space-between; font-size:13px;
  font-weight:700; color:var(--text2); margin-bottom:8px; }
.wg-hud-l,.wg-hud-r{ min-width:76px; }
.wg-hud-r{ text-align:right; color:var(--primary); }
.wg-combo{ display:inline-block; padding:2px 10px; border-radius:20px; background:#f2f4f8; color:#8a94a6;
  transition:all .2s; }
.wg-combo.hot{ background:linear-gradient(90deg,#ff7a45,#ffc53d); color:#fff;
  box-shadow:0 0 12px rgba(255,122,69,.55); animation:wgComboPulse .5s ease; }
@keyframes wgComboPulse{ 0%{transform:scale(1)} 45%{transform:scale(1.18)} 100%{transform:scale(1)} }

.wg-timerbar{ height:7px; background:#eef1f6; border-radius:6px; overflow:hidden; margin-bottom:14px; }
.wg-timerbar > i{ display:block; height:100%; width:100%; border-radius:6px;
  background:linear-gradient(90deg,#36cfc9,#00b578); transition:width .1s linear, background .3s; }
.wg-timerbar > i.warn{ background:linear-gradient(90deg,#ffc53d,#ff9800); }
.wg-timerbar > i.danger{ background:linear-gradient(90deg,#ff7875,#f5222d); }

.wg-tag{ font-size:12px; color:var(--text2); margin-bottom:8px; }
.wg-stem{ font-size:16px; line-height:1.75; margin-bottom:14px; word-break:break-word; }
.wg-opts{ display:flex; flex-direction:column; gap:9px; }
.wg-opt{ display:flex; align-items:flex-start; gap:10px; width:100%; text-align:left; cursor:pointer;
  padding:12px 14px; border:1.5px solid var(--border); border-radius:10px; background:#fff;
  font-size:14.5px; line-height:1.6; font-family:inherit; color:var(--text);
  transition:border-color .15s, background .15s, transform .1s; }
.wg-opt:hover{ border-color:var(--primary); background:#f6faff; }
.wg-opt:active{ transform:scale(.985); }
.wg-opt b{ flex:0 0 22px; height:22px; border-radius:50%; background:#f2f4f8; color:var(--text2);
  font-size:12.5px; display:flex; align-items:center; justify-content:center; margin-top:1px; }
.wg-opt span{ flex:1; }
.wg-opt.right{ border-color:#00b578; background:#e9faf3; }
.wg-opt.right b{ background:#00b578; color:#fff; }
.wg-opt.wrong{ border-color:#f5222d; background:#fff1f0; }
.wg-opt.wrong b{ background:#f5222d; color:#fff; }
.wg-tip{ font-size:12px; text-align:center; margin-top:14px; }

/* 卡片碎裂 / 失败抖动 */
.wg-wrap .wg-body-anim, #wg-body{ transition:transform .35s cubic-bezier(.4,0,.2,1), opacity .35s; }
#wg-body.wg-kill{ animation:wgKill .6s forwards; }
@keyframes wgKill{
  0%{ transform:scale(1); opacity:1; }
  35%{ transform:scale(1.04) rotate(-1deg); opacity:1; }
  100%{ transform:scale(.72) rotate(6deg); opacity:0; filter:blur(3px); }
}
#wg-body.wg-fail{ animation:wgFail .7s; }
@keyframes wgFail{
  0%,100%{ transform:translateX(0); }
  15%,45%,75%{ transform:translateX(-9px); background:#fff5f5; border-radius:8px; }
  30%,60%,90%{ transform:translateX(9px); background:#fff5f5; border-radius:8px; }
}

/* 飘字 */
.wg-wrap{ position:relative; }
.wg-float{ position:absolute; left:50%; top:32%; transform:translateX(-50%); pointer-events:none;
  font-size:22px; font-weight:800; animation:wgFloat 1s ease-out forwards; text-shadow:0 2px 6px rgba(0,0,0,.12); }
@keyframes wgFloat{ 0%{ opacity:1; transform:translate(-50%,0) scale(.8); }
  30%{ transform:translate(-50%,-22px) scale(1.15); }
  100%{ opacity:0; transform:translate(-50%,-58px) scale(1); } }
.wg-float.good{ color:#00b578; }
.wg-float.combo{ color:#ff7a45; top:42%; font-size:26px; }

/* 填空题自评 */
.wg-answer-box{ padding:12px 14px; background:#f0f9ff; border-radius:10px; font-size:14px; line-height:1.7; }
.wg-answer-box b.ok{ color:#00b578; }
.wg-self{ display:flex; gap:10px; justify-content:center; margin-top:14px; flex-wrap:wrap; }

/* 结算 */
.wg-finish{ text-align:center; padding:8px 4px; }
.wg-fireworks{ font-size:54px; animation:wgFire .9s ease-out; }
@keyframes wgFire{ 0%{ transform:scale(.5); opacity:0; } 55%{ transform:scale(1.25); opacity:1; } 100%{ transform:scale(1); } }
.wg-finish h3{ margin:10px 0 14px; color:var(--primary); }
.wg-sum{ display:flex; justify-content:center; gap:8px; }
.wg-sum > div{ flex:1; background:#f7f9fc; border-radius:10px; padding:12px 6px; }
.wg-sum b{ display:block; font-size:24px; color:#00b578; }
.wg-sum span{ font-size:12px; color:var(--text2); }

@media (max-width:640px){
  .stats.stats4{ grid-template-columns:repeat(2,1fr) !important; gap:10px; }
  .wg-stem{ font-size:15.5px; }
  .wg-opt{ padding:11px 12px; font-size:14px; }
  .wg-opt b{ flex:0 0 20px; height:20px; font-size:12px; }
  .wg-float{ font-size:20px; }
  .wg-sum b{ font-size:20px; }
}
.stat.stat-game .game-ico{ display:flex; align-items:center; height:30px; }

/* ---- 学生端课程详情页：折叠章节 ---- */
.chbox{ border-bottom:1px solid #f0f2f6; }
.chbox:last-child{ border-bottom:0; }
.chhead{ display:flex; align-items:center; gap:10px; padding:13px 14px; cursor:pointer;
         user-select:none; transition:background .15s; }
.chhead:hover{ background:#f7f9fc; }
.chhead .charrow{ flex:0 0 auto; font-size:11px; color:#9aa3b2; transition:transform .2s; display:inline-block; }
.chbox.open .chhead .charrow{ transform:rotate(90deg); }
.chbox.open .chhead{ background:#f7f9fc; }
.chbody{ border-top:1px solid #f5f6fa; background:#fcfdff; }
.lsrow{ display:flex; align-items:center; gap:10px; padding:11px 14px 11px 30px; cursor:pointer;
        border-bottom:1px solid #f5f6fa; transition:background .15s; }
.lsrow:last-child{ border-bottom:0; }
.lsrow:hover{ background:#eef4ff; }
.lsrow .lsico{ flex:0 0 auto; font-size:13px; }
@media (max-width:640px){
  .lsrow{ padding:11px 12px 11px 18px; }
  .chhead{ padding:12px; }
}

/* ---- 试卷操作「更多」下拉菜单 ---- */
.more-wrap{ position:relative; display:inline-block; }
.more-menu{ display:none; position:absolute; right:0; top:calc(100% + 4px); z-index:60;
  background:#fff; border:1px solid #e5e9f0; border-radius:9px; min-width:170px;
  box-shadow:0 8px 26px rgba(20,30,60,.14); padding:5px; }
.more-menu.open{ display:block; }
.more-menu a{ display:flex; align-items:center; gap:7px; padding:8px 11px; font-size:13px;
  color:var(--text1,#1f2430); text-decoration:none; border-radius:6px; white-space:nowrap; }
.more-menu a:hover{ background:#f2f6fd; }
.more-menu a.danger{ color:#d93b3b; }
.more-menu a.danger:hover{ background:#fdeeee; }

/* ---- 试卷编辑弹窗 ---- */
.ee-item{ border:1px solid #e8ecf3; border-radius:10px; padding:11px 12px; margin-bottom:11px;
  background:#fcfdff; }
.ee-head{ display:flex; align-items:center; gap:8px; margin-bottom:8px; }
.ee-no{ flex:0 0 auto; width:23px; height:23px; line-height:23px; text-align:center;
  border-radius:50%; background:#1677ff; color:#fff; font-size:12px; font-weight:700; }
.ee-type{ padding:4px 7px; border:1px solid #dfe4ec; border-radius:6px; font-size:12.5px; background:#fff; }
.ee-score{ width:62px; padding:4px 7px; border:1px solid #dfe4ec; border-radius:6px; font-size:12.5px; }
.ee-stem{ width:100%; min-height:52px; padding:8px 10px; border:1px solid #dfe4ec; border-radius:7px;
  font-size:13px; font-family:inherit; resize:vertical; box-sizing:border-box; }
.ee-opts{ margin:8px 0 4px 0; display:flex; flex-direction:column; gap:6px; }
.ee-opt{ display:flex; align-items:center; gap:8px; }
.ee-opt b{ flex:0 0 18px; text-align:center; color:#5a6478; font-size:13px; }
.ee-opt input{ flex:1; padding:6px 9px; border:1px solid #dfe4ec; border-radius:6px; font-size:13px; }
.ee-row{ display:flex; align-items:center; gap:8px; margin-top:7px; }
.ee-row label{ flex:0 0 34px; font-size:12.5px; color:#5a6478; }
.ee-row input{ flex:1; padding:6px 9px; border:1px solid #dfe4ec; border-radius:6px; font-size:13px; }
.ee-ans{ background:#f4faf6 !important; border-color:#bfe3cd !important; }
@media (max-width:640px){
  .ee-head{ flex-wrap:wrap; }
  .ee-score{ width:54px; }
}

/* ---- 课时转码状态标签 ---- */
.tc-badge{ display:inline-flex; align-items:center; gap:3px; font-size:12px;
  padding:1px 7px; border-radius:20px; background:#f4f6fa; white-space:nowrap; }
.tc-badge .tc-txt{ font-size:11.5px; }

/* ================= 宠物养成（新版） ================= */
.pet-slot { padding:12px 10px 4px; border-top:1px solid var(--border); margin-top:auto; }
.pet-slot .pet { position:relative; left:auto; right:auto; bottom:auto; animation:none;
  background:linear-gradient(160deg,#fff7ec,#fff1f5); border:1px solid #f5dfc9; border-radius:16px;
  padding:12px 10px 10px; text-align:center; cursor:pointer; user-select:none; }
.pet-slot .pet-body { position:relative; display:inline-block; }
.pet-slot .pet-face { display:inline-block; font-size:44px; line-height:1;
  filter:drop-shadow(0 4px 6px rgba(0,0,0,.16)); animation:petIdleBreathe 2.2s ease-in-out infinite; transform-origin:50% 90%; }
@keyframes petIdleBreathe {
  0%,100% { transform:translateY(0) scale(1); }
  50%     { transform:translateY(-3px) scale(1.035); }
}
/* 尾巴：默认轻微摆动 */
.pet-slot .pet-tail { position:absolute; right:-4px; bottom:4px; width:12px; height:22px;
  border-radius:7px; background:#f7b267; transform-origin:top center;
  animation:petTail 1.1s ease-in-out infinite; opacity:.95; }
@keyframes petTail {
  0%,100% { transform:rotate(-14deg); }
  50%     { transform:rotate(16deg); }
}
/* 动作① 翘尾巴：尾巴幅度变大 + 身体左右摇 */
.pet.wag .pet-tail { animation:petTailBig .45s ease-in-out 6; background:#ff9f43; }
@keyframes petTailBig {
  0%,100% { transform:rotate(-26deg) scaleY(1); }
  50%     { transform:rotate(32deg) scaleY(1.12); }
}
.pet.wag .pet-face { animation:petHappyShake .45s ease-in-out 6; }
@keyframes petHappyShake {
  0%,100% { transform:rotate(0) scale(1); }
  25%     { transform:rotate(-9deg) scale(1.06); }
  75%     { transform:rotate(9deg) scale(1.06); }
}
/* 动作② 打哈欠：嘴部放大 + 上下拉伸 */
.pet.yawn .pet-face { animation:petYawn 1.1s ease-in-out 3; }
@keyframes petYawn {
  0%,100% { transform:scale(1) translateY(0); }
  45%     { transform:scale(1.18,1.22) translateY(2px); }
  70%     { transform:scale(1.1,1.14) translateY(1px); }
}
/* 动作③ 喝咖啡：轻微上仰 + 左右小晃（模拟举杯） */
.pet.sip .pet-face { animation:petSip 1.2s ease-in-out 3; }
@keyframes petSip {
  0%,100% { transform:rotate(0) translateY(0); }
  30%     { transform:rotate(-8deg) translateY(-3px); }
  60%     { transform:rotate(-4deg) translateY(-1px); }
}
/* 点击跳动 */
.pet.play .pet-face { animation:petJump .6s ease; }
@keyframes petJump {
  0%   { transform:translateY(0) rotate(0) scale(1); }
  30%  { transform:translateY(-16px) rotate(-12deg) scale(1.15); }
  60%  { transform:translateY(0) rotate(0) scale(1); }
  80%  { transform:translateY(-7px) rotate(8deg) scale(1.08); }
  100% { transform:translateY(0) rotate(0) scale(1); }
}
/* 动作气泡（🎵 / 😪 / ☕） */
.pet-slot .pet-act { position:absolute; top:-6px; right:-14px; font-size:17px; opacity:0;
  transition:opacity .3s, transform .3s; transform:translateY(6px) scale(.8); pointer-events:none; }
.pet-slot .pet-act.show { opacity:1; transform:translateY(-6px) scale(1); }
/* 台词气泡 */
.pet-slot .pet-bubble { position:absolute; left:50%; bottom:calc(100% + 8px); transform:translateX(-50%) translateY(6px);
  background:#2f3542; color:#fff; font-size:12px; line-height:1.55; padding:8px 12px; border-radius:12px;
  width:max-content; max-width:210px; text-align:center; opacity:0; pointer-events:none;
  transition:opacity .28s, transform .28s; z-index:20; box-shadow:0 6px 18px rgba(0,0,0,.22); }
.pet-slot .pet-bubble.show { opacity:1; transform:translateX(-50%) translateY(0); }
.pet-slot .pet-bubble b { color:#ffd479; }
.pet-slot .pet-bubble::after { content:''; position:absolute; top:100%; left:50%; transform:translateX(-50%);
  border:6px solid transparent; border-top-color:#2f3542; }
/* 名称 / 状态条 */
.pet-slot .pet-name { font-size:12px; color:#8a6a4f; margin-top:6px; font-weight:600; }
.pet-slot .pet-stat { display:flex; justify-content:space-between; font-size:10.5px; color:#9b8571; margin:6px 2px 3px; }
.pet-slot .pet-stat b { color:#6b5540; font-weight:600; }
.pet-slot .pet-bar { height:6px; background:#efe3d6; border-radius:4px; overflow:hidden; margin:0 2px; }
.pet-slot .pet-bar i { display:block; height:100%; border-radius:4px; transition:width .5s ease; }
.pet-slot .pet-hint { font-size:10px; color:#c0ab97; margin-top:7px; }
/* 养成面板 */
.pet-panel-top { display:flex; gap:16px; align-items:center; background:#fffaf3; border:1px solid #f5e6d3;
  border-radius:14px; padding:14px; }
.ppet-big { font-size:52px; line-height:1; filter:drop-shadow(0 4px 8px rgba(0,0,0,.14)); }
.ppet-info { font-size:13px; color:#5c4a38; line-height:1.9; }
.skin-grid { display:grid; grid-template-columns:repeat(3,1fr); gap:10px; }
.skin-cell { border:1px solid #eee; border-radius:12px; padding:10px 6px; text-align:center; background:#fafbfc; }
.skin-cell.on { border-color:#ffcf8f; background:#fffaf2; cursor:pointer; transition:.18s; }
.skin-cell.on:hover { transform:translateY(-2px); box-shadow:0 6px 16px rgba(255,159,67,.22); }
.skin-cell.off { opacity:.62; }
.sk-e { font-size:30px; line-height:1.2; }
.sk-n { font-size:12.5px; font-weight:600; color:#3d4a5c; margin-top:2px; }
.sk-t { font-size:10.5px; color:#98a2b3; margin-top:2px; }
.food-log { max-height:190px; overflow-y:auto; border:1px solid #f0f2f5; border-radius:10px; padding:6px 10px; }
.food-row { display:flex; align-items:center; gap:8px; padding:6px 0; border-bottom:1px solid #f6f8fa; font-size:12.5px; }
.food-row:last-child { border-bottom:none; }
.food-row .fe { font-size:17px; }
/* 覆盖旧的 .pet span 通配动画，避免新结构被干扰 */
.pet-slot .pet span { animation:none; filter:none; font-size:inherit; display:inline; }
.pet-slot .pet .pet-face { display:inline-block; font-size:44px; filter:drop-shadow(0 4px 6px rgba(0,0,0,.16)); }
.pet-slot .pet .pet-name { display:block; }
.pet-slot .pet .pet-stat span { display:inline; }
/* 手机端侧栏宠物缩小 */
@media (max-width:820px){
  .pet-slot { padding:8px 6px 2px; }
  .pet-slot .pet-face { font-size:34px; }
  .pet-slot .pet-hint { display:block; font-size:10.5px; color:#b9a48f; }
  .skin-grid { grid-template-columns:repeat(3,1fr); }
}
/* 喂食提示条 */
.petfeed { position:fixed; right:18px; bottom:18px; z-index:9999; display:flex; gap:12px; align-items:flex-start;
  background:#fff; border:1px solid #ffe0b8; border-radius:16px; padding:12px 16px 12px 12px;
  box-shadow:0 10px 30px rgba(0,0,0,.16); max-width:320px;
  opacity:0; transform:translateY(20px) scale(.96); pointer-events:none;
  transition:opacity .3s, transform .3s; }
.petfeed.show { opacity:1; transform:translateY(0) scale(1); }
.petfeed .pf-e { font-size:34px; line-height:1; animation:petFeedPop .6s ease; }
@keyframes petFeedPop { 0%{transform:scale(.4) rotate(-18deg); opacity:0} 55%{transform:scale(1.22) rotate(6deg); opacity:1} 100%{transform:scale(1) rotate(0)} }
.petfeed .pf-t { font-size:13.5px; font-weight:700; color:#3d4a5c; }
.petfeed .pf-s { font-size:12px; color:#7a8798; margin-top:2px; line-height:1.5; }
.petfeed .pf-b { font-size:11px; color:#ff9f43; margin-top:5px; font-weight:600; }
@media (max-width:820px){ .petfeed { right:10px; left:10px; bottom:10px; max-width:none; } }
/* 学生端宠物区：横向卡片，独立一行 */
.stu-wrap .pet-slot { padding:0; border-top:none; margin:10px 0 0; }
.stu-wrap .pet-slot .pet { display:flex; align-items:center; gap:14px; text-align:left;
  padding:12px 16px; border-radius:16px; max-width:100%; overflow:hidden; }
.stu-wrap .pet-slot .pet-body { flex:0 0 auto; position:relative; display:block; width:56px; text-align:center; }
.stu-wrap .pet-slot .pet-name,
.stu-wrap .pet-slot .pet-stat,
.stu-wrap .pet-slot .pet-bar,
.stu-wrap .pet-slot .pet-hint { position:relative; }
.stu-wrap .pet-slot .pet-info { flex:1 1 auto; min-width:0; }
.stu-wrap .pet-slot .pet-name { white-space:nowrap; overflow:hidden; text-overflow:ellipsis; }
.stu-wrap .pet-slot .pet-bubble { left:0; transform:translateY(6px); bottom:calc(100% + 6px); }
.stu-wrap .pet-slot .pet-bubble.show { transform:translateY(0); }
.stu-wrap .pet-slot .pet-bubble::after { left:34px; }
@media (max-width:820px){
  .stu-wrap .pet-slot .pet { flex-direction:row; gap:12px; padding:10px 12px; }
  .stu-wrap .pet-slot .pet-body { width:44px; }
  .stu-wrap .pet-slot .pet-face { font-size:36px; }
}
/* 老师端侧栏：竖向布局（信息块居中） */
.sidebar .pet-slot .pet-info { text-align:center; }
.sidebar .pet-slot .pet-stat { margin:6px 4px 3px; }
.sidebar .pet-slot .pet-bar { margin:0 4px; }
/* 学生端横向：给信息块左侧留出气泡空间 */
.stu-wrap .pet-slot .pet-info { text-align:left; }

/* 学生端横向宠物卡：气泡与动作图标绝对定位，不占 flex 空间 */
.stu-wrap .pet-slot .pet > .pet-bubble,
.stu-wrap .pet-slot .pet > .pet-act { position:absolute; }
.stu-wrap .pet-slot .pet > .pet-act { left:auto; right:6px; top:4px; }
.stu-wrap .pet-slot .pet { position:relative; }

/* 学生端横向宠物卡：信息区紧凑化（进度条不过长） */
.stu-wrap .pet-slot .pet-info { max-width:420px; }
.stu-wrap .pet-slot .pet-name { margin-top:0; font-size:13px; }
.stu-wrap .pet-slot .pet-stat { font-size:11.5px; margin:3px 2px 2px; }
.stu-wrap .pet-slot .pet-bar { height:6px; }
.stu-wrap .pet-slot .pet-name-row { display:flex; align-items:center; justify-content:space-between; gap:8px; }
.stu-wrap .pet-slot .pet-name-row .pn-txt { min-width:0; overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
.stu-wrap .pet-slot .pet-name-row .pn-age { flex:0 0 auto; color:#ff9800; font-weight:700; font-size:12.5px; }
.stu-wrap .pet-slot .pet-hint { margin-top:6px; }
@media (max-width:820px){
  .stu-wrap .pet-slot .pet-info { max-width:none; }
}

/* ================= 学生端课程目录（清晰进度） ================= */
/* 统一进度条 */
.crs-bar { height:7px; background:#eef1f6; border-radius:4px; overflow:hidden; margin:9px 0 0; }
.crs-bar > i { display:block; height:100%; border-radius:4px;
  background:linear-gradient(90deg,#4f9cff,#1677ff); transition:width .35s ease; }

/* 顶部「继续学习」条 */
.crs-resume { display:flex; align-items:center; gap:16px; padding:15px 17px; flex-wrap:wrap;
  border-left:4px solid #1677ff; background:linear-gradient(120deg,#f4f9ff,#ffffff); }
.crs-resume .cr-left { flex:1 1 260px; min-width:0; }
.crs-resume .cr-tag { display:inline-block; font-size:11px; font-weight:700; color:#1677ff;
  background:#e8f2ff; border-radius:20px; padding:2px 10px; letter-spacing:.5px; }
.crs-resume .cr-title { font-size:16px; font-weight:700; margin:7px 0 3px; }
.crs-resume .cr-next { font-size:12.5px; color:#7a8798; margin-bottom:8px;
  overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
.crs-resume .cr-meta { font-size:11.5px; color:#98a3b3; margin-top:6px; }
.crs-resume .cr-right { display:flex; align-items:center; gap:8px; flex:0 0 auto; }

/* 课程卡 */
.crs-card { padding:14px; cursor:pointer; transition:transform .16s, box-shadow .16s; }
.crs-card:hover { transform:translateY(-2px); box-shadow:0 8px 22px rgba(22,119,255,.12); }
.crs-head { display:flex; align-items:center; justify-content:space-between; }
.crs-ico { font-size:26px; }
.ls-new { display:inline-block; margin-left:6px; padding:0 5px; height:16px; line-height:16px;
  background:#fa5151; color:#fff; font-size:10.5px; font-weight:700; border-radius:8px; vertical-align:1px; }
/* v1.76.1 作业列表：几份没批直接标在「批改」按钮右上角 —— 表格列宽紧张，
   单开一列「待批 3」会把「8 人」挤成两行，标在按钮上既不占位，指向也更明确 */
.hw-gb { position:relative; }
.hw-gb .hw-dot { position:absolute; top:-7px; right:-7px; min-width:16px; height:16px; padding:0 4px;
  box-sizing:border-box; border-radius:8px; background:#fa5151; color:#fff; font-size:10px;
  font-weight:700; line-height:16px; text-align:center; box-shadow:0 1px 4px rgba(250,81,81,.4);
  pointer-events:none; }
.crs-new { display:inline-block; margin-left:2px; margin-right:auto; background:#fa5151; color:#fff;
  font-size:11px; font-weight:700; line-height:18px; height:18px; padding:0 7px; border-radius:9px;
  box-shadow:0 2px 6px rgba(250,81,81,.35); animation:badgePop .35s ease; }
.crs-name { font-weight:700; margin:7px 0 5px; font-size:15px; }
.crs-meta { font-size:12px; margin-top:7px; }
.crs-nx { font-size:12px; color:#1677ff; margin-top:7px; padding-top:7px;
  border-top:1px dashed #e8eef7; overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }

/* 课程详情：概要 */
.ch-sum { font-size:12px; color:#98a3b3; margin-top:8px; }
.ch-cont { display:flex; align-items:center; gap:12px; margin-top:12px; padding:11px 14px;
  background:#f4f9ff; border-radius:10px; flex-wrap:wrap; }
.ch-cont-t { flex:1 1 200px; font-size:13.5px; color:#1677ff; font-weight:600;
  overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }

/* 章节头：小进度条 */
.ch-mini { flex:0 0 46px; height:5px; background:#eef1f6; border-radius:3px; overflow:hidden; }
.ch-mini > i { display:block; height:100%; background:#1677ff; border-radius:3px; transition:width .3s; }

/* 课时行：编号 + 状态 + 待学标记 */
.lsrow { position:relative; }
.lsrow .ls-no { flex:0 0 22px; font-size:11.5px; color:#b6c0cd;
  font-variant-numeric:tabular-nums; text-align:right; }
.lsrow.nx { background:#f0f7ff; }
.lsrow.nx .ls-no { color:#1677ff; font-weight:700; }
.lsrow.done .ls-no { color:#c8d2de; }
.lsrow .ls-dur { flex:0 0 auto; font-size:11.5px; color:#aab5c2; font-variant-numeric:tabular-nums; }
.ls-badge { display:inline-block; font-size:10.5px; padding:1px 7px; border-radius:20px;
  margin-left:7px; background:#eef1f6; color:#8e9aab; vertical-align:middle; }
.ls-badge.nx { background:#e2efff; color:#1677ff; font-weight:600; }

/* 播放浮层：左视频 + 右目录 */
.play-wrap { display:flex; gap:16px; align-items:flex-start; }
.play-wrap .play-main { flex:1 1 auto; min-width:0; }
.play-wrap .toc { flex:0 0 216px; max-height:74vh; overflow:auto;
  border:1px solid #eef1f6; border-radius:10px; background:#fbfcfe; }
.play-wrap .toc-h { padding:10px 12px; font-size:13px; font-weight:700; color:#5b6b7f;
  border-bottom:1px solid #eef1f6; display:flex; align-items:center; justify-content:space-between;
  position:sticky; top:0; background:#fbfcfe; z-index:1; }
.play-wrap .toc-body { padding:6px 0 8px; }
.play-wrap .toc-ch { padding:6px 0; }
.play-wrap .toc-ch-t { font-size:11.5px; color:#98a3b3; padding:4px 12px;
  display:flex; align-items:center; justify-content:space-between; }
.play-wrap .toc-l { display:flex; align-items:center; gap:6px; padding:6px 12px;
  font-size:12.5px; cursor:pointer; border-left:3px solid transparent; }
.play-wrap .toc-l:hover { background:#eef4ff; }
.play-wrap .toc-l.cur { background:#e8f2ff; border-left-color:#1677ff; font-weight:700; color:#1677ff; }
.play-wrap .toc-l.done .toc-n { color:#c8d2de; }
.play-wrap .toc-n { flex:0 0 20px; font-size:11px; color:#b6c0cd; font-variant-numeric:tabular-nums; }
.play-wrap .toc-t { flex:1 1 auto; min-width:0; overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
.play-wrap .toc-i { flex:0 0 auto; font-size:11px; }

@media (max-width:820px){
  /* 手机端：目录收到视频下方，不再左右分栏 */
  .play-wrap { flex-direction:column; gap:12px; }
  .play-wrap .toc { flex:0 0 auto; width:100%; max-height:260px; }
  .crs-resume { gap:12px; }
  .crs-resume .cr-right { width:100%; }
  .crs-resume .cr-right .btn { flex:1; }
}
/* 全学完提示 */
.ch-done { margin-top:12px; padding:11px 14px; background:#f0fbf5; border-radius:10px;
  font-size:13px; color:#00a05a; }


/* ===== 宠物吃东西动画（2026-10-03 新增）===== */
.pet.eating .pet-body { animation: petEat .52s ease-in-out 3; }
@keyframes petEat {
  0%,100% { transform: translateY(0) scale(1); }
  35%     { transform: translateY(-7px) scale(1.09); }
  70%     { transform: translateY(0) scale(.96); }
}
.pet-food-fly {
  position: absolute; left: 50%; top: -4px;
  font-size: 22px; transform: translateX(-50%);
  pointer-events: none; z-index: 20;
  animation: petFoodFly 1.25s cubic-bezier(.4,0,.3,1) forwards;
}
@keyframes petFoodFly {
  0%   { opacity: 0; transform: translate(-50%,-16px) scale(.6) rotate(-12deg); }
  22%  { opacity: 1; transform: translate(-50%,2px)   scale(1.05) rotate(6deg); }
  60%  { opacity: 1; transform: translate(-50%,22px)  scale(.85) rotate(-4deg); }
  100% { opacity: 0; transform: translate(-50%,36px)  scale(.5)  rotate(0); }
}


/* ===== 班级徽章 & 底部机构名（2026-10-03 加粗强调）===== */
.hi-b-class {
  display: inline-block;
  font-weight: 800;
  color: #111;
  background: #eaf2ff;
  border: 1px solid #d3e2ff;
  padding: 1px 9px;
  border-radius: 20px;
  font-size: 12.5px;
  margin-right: 2px;
  letter-spacing: .3px;
}
.shome-foot .foot-org {
  font-weight: 800;
  color: #111;
  font-size: 13.5px;
  letter-spacing: .8px;
}


/* ===== 阅卷页统计卡片可点击筛选（2026-10-03）===== */
.stat.quick { cursor: pointer; transition: transform .15s, box-shadow .15s; position: relative; }
.stat.quick:hover { transform: translateY(-2px); box-shadow: 0 4px 12px rgba(0,0,0,.08); }
.stat.quick.on { outline: 2px solid var(--primary, #1677ff); background: #f0f7ff; }
.stat.quick .qf-tip { font-size: 10.5px; color: var(--text-secondary, #8a94a6); margin-top: 3px; opacity: .85; }
.stat.quick.on .qf-tip { color: var(--primary, #1677ff); font-weight: 600; }
.stat.quick.on .qf-tip::after { content: "（已筛选）"; }


/* ===== 角色权限：老师角色隐藏「删除」按钮（2026-10-03）===== */
/* 删除按钮的 onclick 统一以 del/libDel/eeDel/stuBatchDel 开头 */
body.role-teacher [onclick^="del"],
body.role-teacher [onclick^="libDel"],
body.role-teacher [onclick^="eeDel"],
body.role-teacher [onclick^="stuBatchDel"] { display: none !important; }
/* 老师角色隐藏「阅卷分工」入口（后端也有校验） */
body.role-teacher [onclick^="assignModal"] { display: none !important; }

/* ---------- 宠物点击动效（v1.22.0） ---------- */
.pet.spin .pet-face { animation: petSpin 1.5s ease-in-out; }
@keyframes petSpin { 0%{transform:rotate(0) scale(1)} 50%{transform:rotate(360deg) scale(1.25)} 100%{transform:rotate(360deg) scale(1)} }
.pet.shake .pet-face { animation: petShake .6s ease; }
@keyframes petShake { 0%,100%{transform:rotate(0)} 20%{transform:rotate(-16deg)} 60%{transform:rotate(16deg)} }
.pet.bounce .pet-face { animation: petBounce .75s cubic-bezier(.28,.84,.42,1); }
@keyframes petBounce { 0%{transform:translateY(0) scale(1,1)} 25%{transform:translateY(-22px) scale(.92,1.12)} 55%{transform:translateY(0) scale(1.14,.86)} 78%{transform:translateY(-8px) scale(.98,1.02)} 100%{transform:translateY(0) scale(1,1)} }
.pet-fly { position:absolute; left:50%; top:50%; margin:-12px 0 0 -12px; width:24px; text-align:center; line-height:1; pointer-events:none; z-index:30; will-change:transform,opacity; }
@keyframes petFly {
  0%   { opacity:0; transform: translate(var(--x0,0px), var(--y0,0px)) scale(.5); }
  14%  { opacity:1; transform: translate(var(--x0,0px), var(--y0,0px)) scale(1.15); }
  60%  { opacity:1; transform: translate(var(--x0,0px), var(--y0,0px)) scale(1); }      /* 先在宠物周围一圈停住，看得清 */
  100% { opacity:0; transform: translate(var(--x1,0px), var(--y1,0px)) scale(1.4) rotate(var(--rot,20deg)); }
}
.pet-slot .pet-face { transition: font-size .3s ease; }

/* ---------- v1.22.6 烟花式粒子：固定在视口最上层，不被任何容器裁剪 ---------- */
.pet-fly-fixed {
  position: fixed !important;
  width: 26px; margin: -13px 0 0 -13px;
  pointer-events: none; z-index: 99999;
  will-change: transform, opacity;
  text-shadow: 0 1px 3px rgba(0,0,0,.18);
}

/* 资料库卡片配色（学生首页第 8 张卡） */
.scard.c8 { background:linear-gradient(135deg,#5b8def,#3f6fd8); }

/* ---------- 答题页防外传（v1.29.0） ---------- */
#exam-wm { position:fixed; left:0; top:0; right:0; bottom:0; pointer-events:none; z-index:9990; background-repeat:repeat; }
.exam-protect, .exam-protect * { -webkit-user-select:none; -moz-user-select:none; user-select:none; -webkit-touch-callout:none; -webkit-tap-highlight-color:transparent; }
.exam-protect img { -webkit-user-drag:none; pointer-events:none; }
/* 打印时也保留水印（截图/打印都能溯源） */
@media print { #exam-wm { position:fixed !important; } }

/* ---------- v1.31.0 侧边栏紧凑化（笔记本小屏友好） ---------- */
/* 菜单区独立滚动：宠物卡与底部信息固定，不跟着滚 */
.sidebar { padding:12px 10px; }
.logo { padding:4px 8px 10px; }
.logo .mark { width:30px; height:30px; }
.foot { padding:8px 8px 0; line-height:1.5; }
.sidebar .nav { flex:1 1 auto; min-height:0; overflow-y:auto; overflow-x:hidden; padding-right:2px; }
.sidebar .nav::-webkit-scrollbar { width:6px; }
.sidebar .nav::-webkit-scrollbar-thumb { background:#cfdcf0; border-radius:3px; }
.sidebar .nav::-webkit-scrollbar-track { background:transparent; }
/* 菜单项收紧一点，一屏多显示几项 */
.sidebar .nav-item { padding:5px 11px; margin-bottom:0; line-height:1.35; }
.sidebar .nav-item .ico { width:17px; }
.sidebar .logo { padding-bottom:6px; margin-bottom:6px; }
.sidebar .logo b { font-size:14px; }
.sidebar .foot { padding-top:6px; font-size:11px; }
/* 宠物卡「折叠态」：只留一行（图标+名字+年龄），点箭头展开 */
.pet-slot.mini { padding:8px 12px; }
.pet-slot.mini .pet-body,
.pet-slot.mini .pet-stat,
.pet-slot.mini .pet-bar,
.pet-slot.mini .pet-tip-line,
.pet-slot.mini .pet-actions,
.pet-slot.mini .pet-bubble,
.pet-slot.mini .pet-act { display:none !important; }
.pet-slot.mini .pet-info, .pet-slot.mini .pet-name { margin:0; }
.pet-slot.mini .pn-txt { font-size:12px; }
.pet-slot.mini .pn-age { font-size:11px; }
/* 折叠箭头 */
.pet-fold { cursor:pointer; color:#b9a48f; font-size:12px; padding:0 3px; user-select:none; }
.pet-fold:hover { color:#8a6a4f; }

/* ---------- v1.38.1 题库列表：只滚题目区，表头吸顶 ---------- */
#banktbl { max-height: calc(100vh - 350px); min-height: 260px; overflow-y: auto; overflow-x: auto; }
#banktbl table tr:first-child th {
  position: sticky; top: 0; z-index: 3;
  background: #f7f9fc; box-shadow: 0 1px 0 #e6edf5;
}
/* 其它长列表页同样处理（作业/试卷/阅卷的表格容器） */
#subtbl { max-height: calc(100vh - 420px); min-height: 240px; overflow-y: auto; }
#subtbl table tr:first-child th { position: sticky; top: 0; z-index: 3; background: #f7f9fc; box-shadow: 0 1px 0 #e6edf5; }


/* ===== v1.42.0 课程章节 / 课时 拖拽排序 ===== */
.drag-h{display:inline-flex;align-items:center;justify-content:center;width:22px;height:22px;
  border-radius:5px;cursor:grab;color:#9aa5b5;flex:0 0 auto;touch-action:none}
.drag-h:hover{background:#eef2f8;color:#4a5c78}
.drag-h:active{cursor:grabbing}
.chbox.dragging,.lsrow.dragging{opacity:.5}
.chbox.dragging{border-color:#2f7cf6 !important;border-style:dashed;background:#f7faff}
.lsrow.dragging{background:#eef4ff}
.lsrow{display:flex;justify-content:space-between;align-items:center;padding:6px 0 6px 2px;
  border-top:1px solid #f5f5f5;margin-top:6px}


/* ===== v1.48.0 同页题「共用材料」区块 ===== */
.q-material{background:#f7fafe;border:1px solid #e3ecf7;border-radius:12px;
  padding:14px;margin-bottom:12px;font-size:15px;line-height:1.65;
  white-space:pre-wrap;word-break:break-word;color:#2b3445}

/* v1.76.1：列宽一紧张，「8 人」会被拆成上下两行、按钮里的「批改」被拆成两个字
   —— 这两处都只该整块换行，不该拆字 */
table.hw-tb td.hw-sub { white-space: nowrap; }
table.hw-tb td.hw-op .btn { white-space: nowrap; }

/* ===== v1.59.2 作业列表：手机端只留 4 列，作业名换行不撑宽 ===== */
@media (max-width: 820px){
  .hide-m { display: none !important; }
  table.hw-tb, table.hw-tb th, table.hw-tb td { white-space: normal !important; }
  table.hw-tb { width: 100%; }
  table.hw-tb td.hw-t { max-width: 36vw; word-break: break-word; line-height: 1.45; }
  /* 附件按钮在窄列里会逐字折行 → 改成整行 + 省略号 */
  table.hw-tb td.hw-t div { gap: 4px !important; }
  table.hw-tb td.hw-t a.btn {
    display: block; width: 100%; max-width: 100%; box-sizing: border-box;
    padding: 3px 6px; font-size: 11.5px; text-align: left;
    white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
  }
  table.hw-tb td.hw-t img { max-width: 100% !important; height: auto; }
  table.hw-tb td.hw-pg { white-space: nowrap !important; min-width: 76px; }
  table.hw-tb td.hw-sub { white-space: nowrap !important; min-width: 42px; }
  table.hw-tb td.hw-t b { font-size: 13px; }
  /* 4 列总宽必须 ≤ 屏宽，否则按钮会被挤出屏幕（编辑曾因此看不见） */
  table.hw-tb td.hw-op { min-width: 0; width: 66px; }
  table.hw-tb td.hw-op .btn {
    display: block; width: 100%; box-sizing: border-box;
    margin: 0 0 4px 0; padding: 4px 2px; font-size: 11.5px; text-align: center;
  }
  table.hw-tb td.hw-op .btn:last-child { margin-bottom: 0; }
  table.hw-tb td.hw-pg { min-width: 72px; }
  table.hw-tb td.hw-sub { min-width: 38px; }
}

/* ===== v1.62.0 题干着重号（语文「加点字」） =====
   为什么不是 Unicode 组合符：实测 U+0323 / U+0332 在 Noto CJK、微信内置字体下
   全部渲染成 ☒ 方框，学生看到的是豆腐块。只能用 CSS text-emphasis。
   兼容：Chrome 25+ / Safari 6.1+ / 微信 X5 与 WKWebView 均支持 -webkit- 前缀。
   若某极端内核不支持，兜底规则给了细下划线，至少不会「什么都没标」。 */
.em-dot{
  font-style:normal;
  -webkit-text-emphasis:dot;
  text-emphasis:dot;
  -webkit-text-emphasis-position:under right;
  text-emphasis-position:under right;
  -webkit-text-emphasis-color:currentColor;
  text-emphasis-color:currentColor;
}
@supports not ((-webkit-text-emphasis:dot) or (text-emphasis:dot)){
  .em-dot{ border-bottom:1px solid currentColor; padding-bottom:1px; }
}

/* ===== v1.62.0 同页共用选项：字母按钮 + 顶部选项库 ===== */
.opt-letter{
  display:inline-flex;align-items:center;justify-content:center;
  width:38px;height:38px;margin:0 6px 8px 0;
  border:1px solid var(--border);border-radius:9px;
  cursor:pointer;font-size:16px;font-weight:600;
  background:#fff;transition:.15s;user-select:none;
}
.opt-letter input{position:absolute;opacity:0;width:0;height:0}
.opt-letter.sel{border-color:var(--primary);background:var(--primary-light);color:var(--primary)}
.opt-letter:active{transform:scale(.95)}
.so-line{font-size:14.5px;line-height:1.75;margin:3px 0;color:#2b3445}

/* v1.62.0 题干画线（英语「画线短语」） */
.em-ul{ text-decoration:underline; text-underline-offset:2.5px; text-decoration-thickness:1px; }

/* ===== v1.63.0 主观题：打字 + 拍照双通道 ===== */
.em-ans-bar{
  display:flex;flex-wrap:wrap;gap:8px;align-items:center;
  margin-top:10px;padding-top:10px;border-top:1px dashed var(--border);
}
.em-ans-tip{
  font-size:12px;line-height:1.7;color:#8a94a6;margin-top:6px;
}
.em-ans-tip b{color:var(--primary)}
/* 数学符号快捷条：手机键盘打不出 × ÷ ≤ ² ³ √ π */
.em-sym{
  display:flex;flex-wrap:wrap;gap:6px;align-items:center;margin-top:8px;
}
.em-sym button{
  min-width:38px;height:34px;padding:0 8px;
  border:1px solid var(--border);border-radius:8px;background:#fff;
  font-size:15px;line-height:1;color:#2b3445;cursor:pointer;
}
.em-sym button:active{background:var(--primary-light);border-color:var(--primary);transform:scale(.95)}

/* ===== v1.64.0 老师图片批注（画笔/手指画/打勾打叉） ===== */
.anno-item{margin:8px 0}
.anno-wrap{position:relative;display:inline-block;max-width:100%;line-height:0;background:#f6f7f9;border-radius:8px;overflow:hidden}
.anno-wrap img{display:block;max-width:100%;max-height:320px;border-radius:8px;border:1px solid #eee}
.anno-cv{position:absolute;left:0;top:0;pointer-events:none;border-radius:8px}
.anno-foot{display:flex;align-items:center;gap:8px;margin-top:6px;flex-wrap:wrap;line-height:1.4}
#anno-layer{position:fixed;inset:0;z-index:99999;background:#0d1117;display:flex;flex-direction:column}
.anno-top{display:flex;align-items:center;gap:8px;padding:10px 12px;background:#161b22;color:#e6edf3;flex-wrap:wrap;flex:0 0 auto}
.anno-top .btn.plain{background:#21262d;border:1px solid #30363d;color:#e6edf3}
.anno-top .btn.plain:hover{background:#30363d}
.anno-hint{font-size:12px;color:#8b949e}
.anno-tools{display:flex;gap:10px;padding:8px 12px;background:#161b22;border-top:1px solid #21262d;flex-wrap:wrap;align-items:center;flex:0 0 auto}
.anno-grp{display:flex;gap:6px;align-items:center;background:#21262d;padding:4px 8px;border-radius:10px}
.anno-dot{width:26px;height:26px;border-radius:50%;border:2px solid #30363d;background:var(--c);cursor:pointer;padding:0}
.anno-dot.on{border-color:#fff;box-shadow:0 0 0 2px #58a6ff}
.anno-w,.anno-stamp,.anno-eraser{border:1px solid #30363d;background:#0d1117;color:#e6edf3;border-radius:8px;padding:4px 10px;font-size:13px;cursor:pointer;line-height:1.6}
.anno-w.on,.anno-stamp.on,.anno-eraser.on{background:#1f6feb;border-color:#1f6feb;color:#fff}
.anno-stage{flex:1;overflow:auto;padding:12px;display:flex;justify-content:center;align-items:flex-start;-webkit-overflow-scrolling:touch}
.anno-stage .anno-wrap{max-width:100%;background:transparent}
.anno-stage .anno-wrap img{max-height:none;max-width:100%;border:none}
.anno-stage .anno-cv{pointer-events:auto;touch-action:none;cursor:crosshair}
@media (max-width:640px){
  .anno-top{padding:8px;gap:6px}
  .anno-hint{display:none}
  .anno-tools{gap:6px;padding:6px}
  .anno-grp{padding:3px 6px;gap:4px}
  .anno-w,.anno-stamp,.anno-eraser{padding:3px 8px;font-size:12px}
}

/* ===== v1.65.0 答题页固定布局：题干区自己滚，上下题和答题卡钉住不动 ===== */
.exam-shell{position:fixed;inset:0;z-index:10;display:flex;flex-direction:column;overflow:hidden;background:var(--bg,#f5f6f8)}
.exam-shell .exam-head{position:static;flex:0 0 auto;z-index:auto}
.exam-body{flex:1 1 auto;overflow-y:auto;overflow-x:hidden;-webkit-overflow-scrolling:touch;overscroll-behavior:contain;padding-top:12px}
.exam-nav{flex:0 0 auto;background:#fff;border-top:1px solid var(--border,#e8ebf0);box-shadow:0 -6px 18px rgba(15,23,42,.07);padding-bottom:env(safe-area-inset-bottom,0px)}
.exam-nav .nav-row{display:flex;align-items:center;gap:8px;padding:8px 12px}
.exam-nav .nav-page{flex:1;text-align:center;font-size:13px;color:var(--text2,#8a94a6);font-variant-numeric:tabular-nums}
.sheet-scroll{max-height:106px;overflow-y:auto;padding:8px 12px 8px;border-top:1px dashed var(--border,#e8ebf0);transition:max-height .2s}
.sheet-scroll.open{max-height:46vh}
.sheet-mini{grid-template-columns:repeat(auto-fill,minmax(32px,1fr));gap:6px}
.sheet-mini .cell{height:30px;font-size:12px;border-radius:7px}

/* 长选项（语文读音/字形题：一个选项里四个词）：
   词内不断开（「氛围」和「(fēn)」不许分家），词间自然流式铺排——
   一行能塞几个塞几个，塞不下的整个词自动掉到下一行，不浪费纵向空间。
   不用固定列宽，也不用 flex：flex 会按最长词撑宽度，短词反而被挤成一行一个。 */
.opt-words{display:block;margin-top:2px;line-height:1.62}
.opt-words .ow{display:inline-block;white-space:nowrap;vertical-align:top;margin:0 14px 1px 0}
@media (max-width:340px){ .opt-words .ow{margin-right:8px} }

/* 一题多框（数学 16 这类两小问） */
.box-item{margin-bottom:12px}
.box-no{font-size:12px;color:var(--primary,#1677ff);background:var(--primary-light,#e8f2ff);display:inline-block;padding:1px 8px;border-radius:6px;margin-bottom:6px}

/* 待批改提示条：把「客观题得分」说清楚，别让学生以为只得了 4 分 */
.pending-note{margin:10px 0;padding:10px 13px;background:#fff7e6;border:1px solid #ffe0b2;border-radius:10px;font-size:13px;line-height:1.75;color:#8a5a00}
.pending-note b{color:#c2410c}

/* v1.68.4 手机端阅卷表：隐藏「发布老师/考号/岗位/切屏/提交时间」，
   「状态」「批改老师」「操作」少滑一屏就能看到，改判按钮不至于藏在最右 */
@media (max-width: 640px){
  #subtbl table th:nth-child(2), #subtbl table td:nth-child(2),
  #subtbl table th:nth-child(4), #subtbl table td:nth-child(4),
  #subtbl table th:nth-child(5), #subtbl table td:nth-child(5),
  #subtbl table th:nth-child(7), #subtbl table td:nth-child(7),
  #subtbl table th:nth-child(9), #subtbl table td:nth-child(9){ display:none; }
}

/* v1.68.6：弹窗底部操作条吸底 —— 手机上题目区再长，「确定/保存」也不会被底部 Tab 栏或手势条顶出屏幕 */
.modal .gbar{ position:sticky; bottom:0; z-index:5; background:#fff;
  padding:10px 0 calc(6px + env(safe-area-inset-bottom,0px)); margin-top:6px;
  border-top:1px solid #eef2f7; box-shadow:0 -8px 12px -10px rgba(15,27,45,.35);
  border-radius:0 0 14px 14px; }
/* 有吸底操作条的弹窗，底部内边距交给操作条自己处理，避免按钮下方露出一截内容 */
.modal:has(.gbar){ padding-bottom:0; }
@media (max-width:800px){
  /* 弹窗最大高度再收一点，确保底部操作条与系统手势条之间留出空隙 */
  .modal{ max-height:calc(84vh - env(safe-area-inset-bottom,0px)); }
}

/* ==================== 试卷分析报告 v1.69.0 ==================== */
.rp{ max-width:760px; margin:0 auto; }
.rp-card{ background:#fff; border-radius:14px; padding:16px 15px; margin-bottom:12px;
  box-shadow:0 1px 2px rgba(20,40,70,.05), 0 6px 20px -14px rgba(20,40,70,.28); }
.rp-hd{ text-align:center; padding:4px 0 14px; }
.rp-hd .t{ font-size:17px; font-weight:700; color:#22303f; letter-spacing:.5px; }
.rp-hd .e{ font-size:13px; color:#5a6b7d; margin-top:7px; line-height:1.55; }
.rp-hd .m{ font-size:11.5px; color:#95a2b3; margin-top:7px; }
.rp-hd .m i{ font-style:normal; margin:0 6px; color:#cfd8e3; }

/* 分数区 */
.rp-score{ display:flex; align-items:center; gap:18px; }
.rp-score .ring{ flex:0 0 108px; position:relative; }
.rp-score .ring svg{ display:block; }
.rp-score .ring .c{ position:absolute; inset:0; display:flex; flex-direction:column;
  align-items:center; justify-content:center; }
.rp-score .ring .c b{ font-size:26px; font-weight:700; letter-spacing:-1px; color:#22303f; line-height:1; }
.rp-score .ring .c span{ font-size:10.5px; color:#95a2b3; margin-top:4px; }
.rp-score .kv{ flex:1; min-width:0; }
.rp-score .kv .l1{ font-size:15px; font-weight:600; color:#22303f; }
.rp-score .kv .l1 em{ font-style:normal; color:#2f5d8c; font-size:20px; margin-left:2px; }
.rp-score .kv .l2{ font-size:12.5px; color:#6b7b8d; margin-top:6px; line-height:1.7; }
.rp-score .kv .l2 b{ color:#22303f; }
.rp-tag{ display:inline-block; font-size:11px; padding:2px 8px; border-radius:20px;
  background:#eaf4ed; color:#2f9e63; margin-left:6px; vertical-align:1px; }
.rp-tag.bad{ background:#fceceb; color:#d0524c; }

/* 结论 */
.rp-note{ background:#f6f9fc; border-left:3px solid #2f5d8c; border-radius:0 8px 8px 0;
  padding:12px 13px; font-size:13px; line-height:1.75; color:#3d4d5e; }
.rp-note b{ color:#22303f; }

/* 小节标题 */
.rp-sec{ font-size:13.5px; font-weight:600; color:#22303f; margin:0 0 12px;
  display:flex; align-items:center; gap:7px; }
.rp-sec:before{ content:''; width:3px; height:13px; border-radius:2px; background:#2f5d8c; }
.rp-sec em{ font-style:normal; font-weight:400; font-size:11.5px; color:#95a2b3; margin-left:auto; }

/* 板块条 */
.rp-b{ margin-bottom:14px; }
.rp-b:last-child{ margin-bottom:0; }
.rp-b-hd{ display:flex; align-items:baseline; font-size:13px; margin-bottom:6px; }
.rp-b-hd .n{ font-weight:600; color:#22303f; }
.rp-b-hd .s{ color:#6b7b8d; margin-left:8px; font-size:12px; font-variant-numeric:tabular-nums; }
.rp-b-hd .p{ margin-left:auto; font-weight:600; font-variant-numeric:tabular-nums; }
.rp-b-bar{ height:10px; background:#eef2f7; border-radius:6px; position:relative; overflow:hidden; }
.rp-b-bar i{ display:block; height:100%; border-radius:6px; }
.rp-b-bar u{ position:absolute; top:0; bottom:0; width:2px; background:#8697ab; border-radius:1px;
  box-shadow:0 0 0 1.5px #fff; }
.rp-b-md{ font-size:11.5px; color:#95a2b3; margin-top:6px; line-height:1.6; }
.rp-b-md b{ color:#6b7b8d; font-weight:500; }

/* 知识点 */
.rp-k{ display:flex; align-items:center; gap:9px; margin-bottom:9px; }
.rp-k:last-child{ margin-bottom:0; }
.rp-k .n{ flex:0 0 96px; font-size:12px; color:#4d5e70; line-height:1.3;
  word-break:break-word; }
.rp-k .b{ flex:1; height:8px; background:#eef2f7; border-radius:5px; overflow:hidden; }
.rp-k .b i{ display:block; height:100%; border-radius:5px; }
.rp-k .v{ flex:0 0 40px; text-align:right; font-size:11.5px; font-variant-numeric:tabular-nums; }

/* 分层 */
.rp-d{ display:flex; gap:8px; }
.rp-d .d{ flex:1; background:#fafbfd; border:1px solid #eef2f7; border-radius:9px;
  padding:11px 8px; text-align:center; }
.rp-d .d .n{ font-size:11px; color:#7e8fa3; }
.rp-d .d b{ display:block; font-size:17px; margin-top:4px; font-variant-numeric:tabular-nums; }
.rp-d .d .s{ font-size:9.5px; color:#a7b3c2; margin-top:3px; }

/* 错题 */
.rp-w{ border-bottom:1px solid #f2f5f9; padding:11px 0; }
.rp-w:last-child{ border-bottom:0; padding-bottom:0; }
.rp-w-hd{ display:flex; align-items:center; gap:7px; font-size:12px; color:#7e8fa3; }
.rp-w-hd .no{ background:#f2f5f9; color:#5a6b7d; border-radius:5px; padding:1px 7px;
  font-variant-numeric:tabular-nums; }
.rp-w-hd .pt{ margin-left:auto; color:#d0524c; font-weight:600; }
.rp-w-a{ font-size:12.5px; color:#4d5e70; margin-top:6px; line-height:1.7; word-break:break-word; }
.rp-w-a s{ color:#d0524c; text-decoration-color:#f0b3b0; }
.rp-w-a b{ color:#2f9e63; }
.rp-w-a .bl{ color:#dd9024; }
.rp-w-c{ font-size:12px; color:#6b7b8d; background:#fafbfd; border-radius:7px;
  padding:7px 9px; margin-top:6px; line-height:1.65; }
.rp-w-c:before{ content:'老师评语：'; color:#95a2b3; }
.rp-more{ text-align:center; font-size:12px; color:#2f5d8c; padding-top:10px; cursor:pointer; }

/* 纵向 */
.rp-hist{ display:flex; align-items:center; gap:10px; font-size:12.5px; }
.rp-hist .h{ flex:1; background:#fafbfd; border:1px solid #eef2f7; border-radius:9px;
  padding:10px; text-align:center; }
.rp-hist .h .n{ font-size:11px; color:#95a2b3; }
.rp-hist .h b{ display:block; font-size:16px; margin-top:3px; }
.rp-hist .ar{ color:#95a2b3; font-size:16px; }
.rp-hist .d{ font-size:12px; font-weight:600; }

/* 建议 */
.rp-a{ display:flex; gap:9px; margin-bottom:11px; }
.rp-a:last-child{ margin-bottom:0; }
.rp-a .i{ flex:0 0 20px; height:20px; border-radius:50%; background:#eef3f9; color:#2f5d8c;
  font-size:11px; font-weight:600; display:flex; align-items:center; justify-content:center; }
.rp-a .t{ flex:1; font-size:12.5px; line-height:1.75; color:#3d4d5e; }

.rp-foot{ text-align:center; font-size:11px; color:#a7b3c2; padding:6px 0 18px; line-height:1.8; }

/* 学生端报告列表 */
.rp-l{ display:block; background:#fff; border-radius:13px; padding:14px 15px; margin-bottom:11px;
  text-decoration:none; color:inherit; box-shadow:0 1px 2px rgba(20,40,70,.05), 0 6px 18px -14px rgba(20,40,70,.3); }
.rp-l-top{ display:flex; align-items:flex-start; gap:10px; }
.rp-l-top .sq{ flex:0 0 26px; height:26px; border-radius:8px; background:#eef3f9; color:#2f5d8c;
  font-size:12px; font-weight:600; display:flex; align-items:center; justify-content:center; margin-top:1px; }
.rp-l-top .nm{ flex:1; min-width:0; font-size:13.5px; font-weight:600; color:#22303f; line-height:1.5; }
.rp-l-top .nm .exn2{ font-weight:500; color:#5a6b7d; font-size:12.5px; }
.rp-l-top .sc{ flex:0 0 auto; text-align:right; }
.rp-l-top .sc b{ font-size:19px; color:#2f5d8c; font-variant-numeric:tabular-nums; }
.rp-l-top .sc span{ font-size:11px; color:#95a2b3; }
.rp-l-md{ display:flex; align-items:center; gap:10px; margin-top:9px; padding-left:36px;
  font-size:11.5px; color:#95a2b3; flex-wrap:wrap; }
.rp-l-md .tg{ background:#eaf4ed; color:#2f9e63; border-radius:20px; padding:1px 8px; }
.rp-l-md .tg.bad{ background:#fceceb; color:#d0524c; }
.rp-l-md .go{ margin-left:auto; color:#2f5d8c; font-weight:500; }

/* 老师端报告列表 */
.exn2{ font-weight:400; color:#6b7b8d; font-size:12.5px; }
/* 注意：这里必须是 inline，不能用 inline-flex ——
   flex 容器会把 <br> 当成 flex item，试卷名的两行会被压成一团。 */
.rp-bk{ display:inline; text-decoration:none; color:#2f5d8c; font-size:13px; line-height:1.5; }

@media (max-width:640px){
  .rp-card{ padding:14px 13px; border-radius:13px; }
  .rp-score{ gap:12px; }
  .rp-score .ring{ flex:0 0 92px; }
  .rp-score .ring .c b{ font-size:22px; }
  .rp-score .kv .l1{ font-size:14px; }
  .rp-k .n{ flex:0 0 80px; font-size:11.5px; line-height:1.3; }
  .rp-b-md{ font-size:11px; }
  .rp-d .d b{ font-size:15px; }
}

/* 成绩页「全部考试」表格：手机上藏掉最高/最低，把宽度让给试卷名，
   保证「11月01日 语数英+笔试」正好一行、只有「月考…」另起一行。 */
@media (max-width:640px){
  .res-all th:nth-child(5), .res-all td:nth-child(5),
  .res-all th:nth-child(6), .res-all td:nth-child(6){ display:none; }
  .res-all{ font-size:11.5px; }
  .res-all th, .res-all td{ padding:7px 4px; }
  .res-all td:first-child, .res-all th:first-child{ min-width:172px; }
  .res-all td:first-child{ line-height:1.45; }
  .res-all .rp-bk{ font-size:11.5px; letter-spacing:-.2px; }
  .res-all .btn.sm{ padding:4px 7px; font-size:11px; }
}
.nw{ white-space:nowrap; }
/* 0% 的知识点也要看得见一小截，否则像是「没数据」而不是「全错」 */
.rp-k .b i{ min-width:2px; }

/* ===== v1.70.0 错题重做 ===== */
.rp-w-link{ display:block; text-decoration:none; color:inherit; }
.rp-w-link:active{ background:#f7f9fc; }
.rp-w-st{ font-size:12.5px; color:#33455a; margin-top:5px; line-height:1.65; white-space:pre-wrap;
  display:-webkit-box; -webkit-line-clamp:2; -webkit-box-orient:vertical; overflow:hidden; word-break:break-word; }
.rp-redo{ display:flex; align-items:center; gap:10px; text-decoration:none;
  background:linear-gradient(135deg,#eef4fd,#f6f9ff); border:1px solid #dbe7f7; border-radius:10px;
  padding:11px 12px; margin:2px 0 12px; }
.rp-redo .ic{ font-size:19px; }
.rp-redo .tx{ flex:1; min-width:0; }
.rp-redo .tx b{ display:block; font-size:13.5px; color:#2f5d8c; font-weight:600; }
.rp-redo .tx i{ display:block; font-size:11.5px; color:#8b9bad; font-style:normal; margin-top:2px; }
.rp-redo .ar{ color:#b8c6d6; font-size:18px; }
.rp-redo:active{ background:#e8f0fb; }

.rd-head{ background:#fff; border:1px solid #eef2f7; border-radius:12px; padding:14px; margin-bottom:12px; }
.rd-head .rd-nm{ font-size:14px; font-weight:600; color:#1f2d3d; line-height:1.5; }
.rd-head .rd-meta{ font-size:12px; color:#8b9bad; margin-top:4px; }
.rd-head .rd-prog{ display:flex; justify-content:space-between; font-size:12px; color:#5a6b7d; margin-top:10px; }
.rd-pbar{ height:5px; background:#eef2f7; border-radius:99px; margin-top:6px; overflow:hidden; }
.rd-pbar i{ display:block; height:100%; background:#2f5d8c; border-radius:99px; transition:width .25s; }

.rd-card{ background:#fff; border:1px solid #eef2f7; border-radius:12px; padding:14px; margin-bottom:12px; }
.rd-hd{ display:flex; align-items:center; gap:7px; font-size:12px; color:#7e8fa3; }
.rd-hd .no{ background:#f2f5f9; color:#5a6b7d; border-radius:5px; padding:1px 7px; font-variant-numeric:tabular-nums; }
.rd-hd .tp{ color:#8b9bad; }
.rd-hd .pt{ margin-left:auto; color:#d0524c; font-weight:600; }
.rd-stem{ font-size:13.5px; color:#1f2d3d; line-height:1.75; margin-top:9px; white-space:pre-wrap; word-break:break-word; }

.rd-opts{ margin-top:11px; }
.rd-opt{ display:flex; gap:9px; align-items:flex-start; padding:9px 11px; border:1px solid #e6ecf4;
  border-radius:9px; margin-bottom:8px; font-size:13px; color:#33455a; line-height:1.6;
  cursor:pointer; transition:border-color .15s, background .15s; }
.rd-opt:last-child{ margin-bottom:0; }
.rd-opt b{ flex:0 0 18px; height:18px; line-height:18px; text-align:center; border-radius:5px;
  background:#f2f5f9; color:#5a6b7d; font-size:11.5px; font-weight:600; margin-top:1px; }
.rd-opt span{ flex:1; word-break:break-word; }
.rd-opt.on{ border-color:#2f5d8c; background:#f4f8fd; }
.rd-opt.on b{ background:#2f5d8c; color:#fff; }
.rd-opt.lock{ cursor:default; }
.rd-opt.right{ border-color:#8fd0a8; background:#f2fbf6; }
.rd-opt.right b{ background:#2f9e63; color:#fff; }
.rd-opt.wrong{ border-color:#f0b3b0; background:#fdf5f5; }
.rd-opt.wrong b{ background:#d0524c; color:#fff; }
.rd-opt.busy{ opacity:.6; }

.rd-pool{ display:flex; flex-wrap:wrap; gap:6px; margin-top:11px; }
.rd-pool .w{ font-size:12px; color:#5a6b7d; background:#f6f8fb; border:1px solid #eaf0f7;
  border-radius:6px; padding:3px 7px; }
.rd-pool .w b{ color:#95a2b3; font-weight:600; margin-right:4px; }

.rd-fill{ display:flex; gap:8px; margin-top:11px; }
.rd-fill input{ flex:1; min-width:0; border:1px solid #dde5ee; border-radius:9px; padding:9px 11px;
  font-size:13px; color:#1f2d3d; background:#fff; outline:none; }
.rd-fill input:focus{ border-color:#2f5d8c; }
.rd-sumb{ margin-top:11px; }

.rd-res{ margin-top:11px; }
.rd-res:empty{ margin-top:0; }
.rd-judge{ font-size:13px; font-weight:600; padding:9px 11px; border-radius:9px; margin-bottom:9px;
  color:#6b7b8d; background:#f7f9fc; border:1px solid #edf1f7; }
.rd-judge.ok{ color:#2f9e63; background:#f2fbf6; border:1px solid #cfeedd; }
.rd-judge.bad{ color:#d0524c; background:#fdf5f5; border:1px solid #f6dcda; }
.rd-judge.half{ color:#dd9024; background:#fffbf2; border:1px solid #f6e6c8; }
.rd-blk{ margin-bottom:9px; }
.rd-blk .lb{ font-size:11.5px; color:#95a2b3; margin-bottom:3px; }
.rd-blk .bd{ font-size:12.5px; line-height:1.75; color:#33455a; background:#fafbfd; border-radius:8px;
  padding:8px 10px; white-space:pre-wrap; word-break:break-word; }
.rd-blk .bd.ok{ color:#2f7d5a; background:#f4fbf7; }
.rd-blk .bd.bad{ color:#b8564f; background:#fdf6f6; }
.rd-note{ font-size:11.5px; color:#95a2b3; margin-bottom:9px; }
.rd-master{ margin-top:2px; }
.rd-master.done{ color:#2f9e63; border-color:#cfeedd; }
.rd-tip{ font-size:11.5px; color:#95a2b3; line-height:1.7; text-align:center; padding:4px 14px 20px; }

/* v1.70.1 错题条：学生端只给「去做」，不给答案 */
.rp-w-go{ display:flex; align-items:center; gap:4px; margin-top:6px;
  font-size:12.5px; color:#2f7fd6; font-weight:600; }
.rp-w-go i{ font-style:normal; font-size:14px; color:#8fb6e4; }
.rp-w-tip{ font-size:11.5px; color:#8b98a8; line-height:1.55; margin:2px 0 9px; }

/* v1.72.1：章节/课时行新增「编辑」按钮后，flex 会把同级按钮压扁，
   最后一个（删除）宽度被压到 0、直接看不见。这里禁止收缩并禁止换行。 */
.chbox .btn, .lsrow .btn { flex: 0 0 auto; white-space: nowrap; }

/* v1.73.0 课时附件：学生播放页的附件区（图片缩略图 + 文档下载条） */
.att-box{margin-top:12px;padding:10px 12px;background:#f7f9fc;border:1px solid #e8edf5;border-radius:10px}
.att-hd{font-size:12.5px;font-weight:600;color:#5a6270;margin-bottom:8px}
.att-list{display:flex;flex-wrap:wrap;gap:10px;align-items:flex-start}
.att-img{display:flex;flex-direction:column;align-items:center;gap:4px;width:88px;text-decoration:none}
.att-img img{width:88px;height:66px;object-fit:cover;border-radius:6px;border:1px solid #e2e8f2;background:#fff}
.att-img span{font-size:11px;color:#8a9099;max-width:88px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.att-file{display:flex;align-items:center;gap:8px;padding:7px 10px;background:#fff;border:1px solid #e2e8f2;border-radius:8px;text-decoration:none;color:#2d3340;font-size:12.5px;min-width:0;max-width:100%}
.att-file:hover{border-color:#9cc4ff}
.att-ic{flex:0 0 auto;font-size:10.5px;font-weight:700;color:#3b82f6;background:#eaf2ff;border-radius:4px;padding:2px 5px;letter-spacing:.3px}
.att-nm{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;max-width:200px}
.att-sz{flex:0 0 auto;color:#8a9099;font-size:11.5px}
.att-dl{flex:0 0 auto;color:#3b82f6;font-size:11.5px;font-weight:600}
/* 课程目录里「这一节有附件」的小纸夹 */
.ls-att-n{display:inline-block;margin-left:6px;font-size:10.5px;color:#3b82f6;background:#eaf2ff;border-radius:4px;padding:1px 5px;vertical-align:1px;font-weight:600}
/* 老师端编辑弹窗里的已有附件列表 */
.le-att{display:flex;align-items:center;gap:8px;padding:5px 8px;background:#f7f9fc;border-radius:7px;margin-bottom:5px;font-size:12.5px}
.le-att-img{width:34px;height:26px;object-fit:cover;border-radius:4px;border:1px solid #e2e8f2;flex:0 0 auto}
.le-att-nm{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}

/* ══════════ v1.74.0 课程目录层级 & 整页回放 ══════════ */

/* 目录层级：章最靠左，节缩进一档 —— 以前章标题和节的 01/02 几乎在同一条竖线上，
   展开之后看不出谁属于谁（张老师：「下面个就占的前面的箭头跟第一章没有太大区别」）。
   节前面的 ○ / ▶ 也全部去掉，已学改成整行淡色，不再用图标堆在前头。
   注意：#chWrap 是学生端课程目录的容器，老师端「章节管理」弹窗里的 .lsrow 不受影响。 */
#chWrap .chhead{ padding-left:8px; }
#chWrap .lsrow{ padding-left:46px; }
#chWrap .lsrow .ls-t{ flex:1; min-width:0; font-size:13.5px; }
#chWrap .lsrow.done .ls-t{ color:#98a2b3; }
#chWrap .lsrow.done .ls-no{ color:#c8d2de; }
@media (max-width:640px){
  #chWrap .chhead{ padding:12px 12px 12px 8px; }
  #chWrap .lsrow{ padding:11px 12px 11px 42px; }
}

/* 课程卡片里的「课程回放」直入口 */
.ch-rp{ display:flex; align-items:center; gap:8px; margin-top:8px;
  padding:9px 11px; background:#f4f8ff; border:1px solid #e2ecff; border-radius:9px; }
.ch-rp-ic{ flex:0 0 auto; width:22px; height:22px; border-radius:50%; background:#1677ff; color:#fff;
  font-size:9px; display:flex; align-items:center; justify-content:center; }
.ch-rp-t{ flex:0 0 auto; font-size:13px; font-weight:700; color:#1f2a3d; white-space:nowrap; }
.ch-rp-n{ font-size:11px; font-weight:400; color:#8a9099; margin-left:5px; }
.ch-rp-s{ flex:1; min-width:0; font-size:11.5px; color:#8a9099;
  overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
.ch-rp .btn{ flex:0 0 auto; }

/* 整页回放：顶部自己的返回栏 + 占满屏幕的腾讯会议页面。
   为什么要套一层：直接跳到 meeting.tencent.com 的话，学生在微信里就是
   「打开了另一个网页」，看完点左上角 × 会退出整个浏览器回不到系统。
   套在本站页面里就一直待在系统内，返回键永远有效。 */
.rp-full{ position:fixed; inset:0; z-index:900; background:#fff; display:flex; flex-direction:column; }
.rp-bar{ flex:0 0 auto; display:flex; align-items:center; gap:8px; padding:10px 12px;
  border-bottom:1px solid #eef1f6; background:#fff; }
.rp-back{ flex:0 0 auto; border:0; background:#f2f5fa; color:#2d3340; font-size:13px;
  padding:6px 12px; border-radius:8px; cursor:pointer; white-space:nowrap; }
.rp-back:hover{ background:#e8eef8; }
.rp-t{ flex:1; min-width:0; font-size:14px; font-weight:700; color:#1f2a3d;
  overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
.rp-ext{ flex:0 0 auto; width:30px; height:30px; display:flex; align-items:center; justify-content:center;
  border-radius:8px; background:#f2f5fa; color:#5a6270; text-decoration:none; font-size:13px; }
.rp-sub{ flex:0 0 auto; display:flex; align-items:center; gap:8px; padding:7px 12px;
  border-bottom:1px solid #f5f6fa; background:#fcfdff; }
.rp-date{ font-size:12px; color:#8a9099; overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
.rp-toggle{ flex:0 0 auto; border:1px solid #e2e8f2; background:#fff; color:#1677ff; font-size:12px;
  padding:4px 9px; border-radius:7px; cursor:pointer; white-space:nowrap; }
.rp-toggle:hover{ border-color:#9cc4ff; }
.rp-desc{ flex:0 0 auto; max-height:34vh; overflow:auto; padding:10px 14px;
  border-bottom:1px solid #eef1f6; background:#fbfcfe; }
.rp-li{ display:flex; gap:6px; font-size:13px; color:#3d4451; line-height:1.85; }
.rp-li .rp-n{ flex:0 0 auto; color:#1677ff; font-weight:700; }
.rp-li .rp-dot{ flex:0 0 auto; color:#b6c0cd; }
.rp-li.sub{ padding-left:18px; color:#6b7482; }
.rp-li.sub span::before{ content:'·'; margin-right:5px; color:#b6c0cd; }
.rp-body{ flex:1 1 auto; min-height:0; position:relative; background:#111; }
.rp-body iframe{ position:absolute; inset:0; width:100%; height:100%; border:0; background:#fff; }

/* v1.74.0 修正：回放入口改两行后，中间列要能自己占满并省略 */
.ch-rp-main{ flex:1; min-width:0; }
.ch-rp-main .ch-rp-s{ flex:none; }


/* v1.84.1 内部老师账号：老师的测试账号混在 students 里，名字统一标红，一眼可辨（不计入任何学生统计） */
.staff-name{ color:#e34d59 !important; }
.staff-name::after{ content:''; }

/* ══════════ v1.84.2 学生管理「按班级」分组着色 ══════════
   三层：分类卡片（淡底 + 左色条）→ 类型标签（同色系小色块）→ 班级 chip（白底同色字）。
   颜色全部走内联 CSS 变量（--c-main/--c-line/--c-bg/--c-tmain/--c-tbg），由 JS 按分类色相生成。 */
.gsum-cat{ border:1px solid var(--c-line); border-left:3px solid var(--c-main);
  background:var(--c-bg); border-radius:9px; padding:7px 10px 8px; margin-bottom:8px; }
.gsum-cat-h{ display:flex; align-items:baseline; gap:8px; margin-bottom:2px; }
.gsum-cat-n{ font-size:12.5px; font-weight:700; color:var(--c-main); }
.gsum-cat-c{ font-size:11px; color:var(--c-main); opacity:.72; }
.gsum-type{ display:flex; flex-wrap:wrap; align-items:center; gap:6px; }
.gsum-type + .gsum-type{ margin-top:4px; }
.gsum-type-n{ font-size:11px; font-weight:600; color:var(--c-tmain); background:var(--c-tbg);
  border-radius:5px; padding:1px 6px; white-space:nowrap; }
.gsum-g{ display:inline-block; font-size:12px; padding:2px 9px; border-radius:20px; line-height:1.7;
  background:#fff; color:var(--c-main); border:1px solid var(--c-line); cursor:pointer; white-space:nowrap;
  transition:background .12s ease, color .12s ease; }
.gsum-g b{ font-weight:700; margin-left:3px; }   /* 班级名带「班」后字更长，数字和名字之间留一点缝 */
.gsum-g:hover{ background:var(--c-bg); }
.gsum-g.on{ background:var(--c-main); border-color:var(--c-main); color:#fff; }
.gsum-g.on b{ color:#fff; }
@media(max-width:900px){
  .gsum-cat{ padding:6px 8px; border-radius:8px; }
  .gsum-g{ font-size:11.5px; padding:2px 8px; }
  .gsum-cat-c{ font-size:10.5px; }
}

/* v1.86.1：学生表「刚保存的那一行」闪一下，方便接着改下一个 */
@keyframes stuFlashBg { 0%{background:#fff3cd} 60%{background:#fff3cd} 100%{background:transparent} }
tr.stu-flash > td { animation: stuFlashBg 1.8s ease-out; }

/* v1.86.2：学生表分组列 —— 一行两个班级、最多两行（4 个），多余的折成 +N */
.stu-grp { display:grid; grid-template-columns:repeat(2,minmax(0,1fr)); gap:4px 5px;
  max-width:242px; align-items:start; }
.stu-grp .tag { display:block; max-width:100%; text-align:center; font-size:11px;
  line-height:1.55; padding:1px 5px; overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
.stu-grp .tag.gray { background:#f0f1f5; color:#6b7280; }
@media (max-width:640px) { .stu-grp { max-width:200px; } }

/* v1.86.5：学生表里学历、录入人不许折字（否则「专科」「李莎」会被挤成竖排） */
.tb td.stu-nw { white-space:nowrap; }

/* v1.86.7：弹窗内容区统一交给 .modal 滚动（不再内层限高），避免手机端双重滚动把底部按钮顶出屏幕 */
.modal .modal-body{ overflow:visible; }
/* 手机上：弹窗高度由 JS 按 visualViewport 设置，这里放宽 CSS 上限，避免与内联样式打架 */
@media (max-width:800px){
  /* 高度由 JS 按 visualViewport 精确设置（内联优先级更高）；CSS 这里只做兜底，保留 84vh 不动 */
  .modal .gbar{ margin-top:8px; padding-bottom:calc(10px + env(safe-area-inset-bottom,0px)); }
}


/* v1.86.9 课程授课老师多选 chips */
.tchbox{display:flex;flex-wrap:wrap;gap:8px;padding:2px 0}
.tchip{display:inline-flex;align-items:center;padding:6px 13px;border:1px solid #e2e8f0;border-radius:999px;font-size:13px;cursor:pointer;background:#fff;color:#475569;user-select:none;transition:.15s;font-weight:400}
.tchip:hover{border-color:#93c5fd;color:#2563eb}
.tchip.on{background:#3b82f6;border-color:#3b82f6;color:#fff;font-weight:600}
