:root{
  --bg:#eef1f5;
  --panel:#ffffff;
  --ink:#17212b;
  --ink-2:#465668;
  --ink-3:#8593a3;
  --line:#dfe6ee;
  --line-2:#edf1f6;
  --brand:#2f5f8f;
  --brand-2:#eaf1f8;
  --ok:#2c7a5b;
  --ok-bg:#e6f3ec;
  --warn:#a9661b;
  --warn-bg:#fdf2e3;
  --danger:#ad3535;
  --danger-bg:#fbeaea;
  --purple:#6f57a3;
  --purple-bg:#f2eefa;
  --radius:10px;
  --shadow:0 1px 2px rgba(18,38,58,.04), 0 3px 12px rgba(18,38,58,.05);
}

*{box-sizing:border-box;margin:0;padding:0}
body{
  font-family:-apple-system,BlinkMacSystemFont,"Segoe UI","PingFang SC","Microsoft YaHei",sans-serif;
  background:var(--bg); color:var(--ink); font-size:13.5px; line-height:1.55;
  -webkit-font-smoothing:antialiased; overflow:hidden;
}
button{font-family:inherit;font-size:inherit;cursor:pointer;border:none;background:none;color:inherit}
input,select,textarea{font-family:inherit;font-size:inherit;color:inherit}

/* --vh 由 JS 按真实可视高度设置（iOS 添加到桌面后 100vh 会算上状态栏，导致顶部被盖住） */
.app{display:flex;height:100vh;height:calc(var(--vh,1vh)*100);overflow:hidden}

/* ---------- 侧栏 ---------- */
.sidebar{
  width:206px;flex:0 0 206px;background:#fff;border-right:1px solid var(--line);
  display:flex;flex-direction:column;
  padding-top:env(safe-area-inset-top,0px);   /* iPhone 添加到桌面后避让状态栏 */
}
.brand{padding:16px 16px 14px;border-bottom:1px solid var(--line-2)}
.brand-line{display:flex;align-items:center;gap:9px}
.brand-mark{
  width:30px;height:30px;border-radius:8px;background:linear-gradient(135deg,#2f5f8f,#4a86bd);
  color:#fff;display:flex;align-items:center;justify-content:center;font-weight:700;font-size:14px;
  flex:0 0 30px;box-shadow:0 2px 6px rgba(47,95,143,.28);
}
.brand-name{font-size:15px;font-weight:700;letter-spacing:.02em}
.brand-date{
  margin-top:9px;font-size:11px;color:var(--ink-3);
  display:flex;align-items:center;gap:5px;
}
.brand-date b{color:var(--brand);font-weight:600}
.live-dot{
  width:5px;height:5px;border-radius:50%;background:var(--ok);
  box-shadow:0 0 0 0 rgba(44,122,91,.6);animation:pulse 2.4s infinite;
}
@keyframes pulse{
  0%{box-shadow:0 0 0 0 rgba(44,122,91,.45)}
  70%{box-shadow:0 0 0 5px rgba(44,122,91,0)}
  100%{box-shadow:0 0 0 0 rgba(44,122,91,0)}
}

.nav{flex:1;overflow-y:auto;padding:6px 8px 12px}
.nav-group{font-size:10.5px;color:var(--ink-3);letter-spacing:.07em;padding:13px 8px 5px;font-weight:600}
.nav-item{
  display:flex;align-items:center;gap:9px;padding:8px 10px;border-radius:7px;
  color:var(--ink-2);font-size:13px;cursor:pointer;transition:background .12s,color .12s;
}
.nav-item i{font-style:normal;width:15px;text-align:center;color:var(--ink-3);font-size:12px}
.nav-item:hover{background:#f5f8fb;color:var(--ink)}
.nav-item.active{background:var(--brand-2);color:var(--brand);font-weight:600}
.nav-item.active i{color:var(--brand)}

.sidebar-foot{padding:10px 12px;border-top:1px solid var(--line-2);display:flex;gap:6px;flex-direction:column}
/* 全员可见的版本号（老师没有参数设置权限，靠这里自查是不是最新版） */
.ver-line{padding:8px 12px 0;line-height:1.5;cursor:pointer}
.ver-line .ver-chip{cursor:pointer;font-size:10.5px}
.ver-line .ver-chip:hover{text-decoration:underline}

/* ---------- 操作日志栏 ---------- */
.oplog{border-top:1px solid var(--line-2);padding:9px 12px 10px;display:flex;flex-direction:column;min-height:0}
.oplog-head{
  display:flex;align-items:center;justify-content:space-between;
  font-size:11px;font-weight:600;color:var(--ink-2);margin-bottom:6px;
}
.oplog-head .icon-btn{width:20px;height:20px;font-size:13px}
.oplog-list{
  max-height:150px;overflow-y:auto;display:flex;flex-direction:column;gap:3px;
  font-size:10.5px;line-height:1.45;
}
.oplog-item{
  display:flex;gap:5px;padding:4px 6px;border-radius:5px;background:#f7f9fb;color:var(--ink-2);
}
.oplog-item .t{color:var(--ink-3);font-variant-numeric:tabular-nums;flex:0 0 auto}
.oplog-item .x{min-width:0;word-break:break-all}
.oplog-item.k-move{background:#eef5fb;color:#2c5c86}
.oplog-item.k-add{background:#eef7f1;color:#2c7a55}
.oplog-item.k-del,
.oplog-item.k-stop{background:#fbeff0;color:#a5444f}
.oplog-item.k-undo{background:#f4f0fa;color:#6f57a3}
.oplog-item.k-sys,
.oplog-item.k-system{background:#f1f3f5;color:var(--ink-3)}
.oplog-empty{font-size:10.5px;color:var(--ink-3);padding:6px 2px}

/* ---------- 主区 ---------- */
.main{flex:1;display:flex;flex-direction:column;overflow:hidden;min-width:0}
.topbar{
  height:calc(58px + env(safe-area-inset-top,0px));flex:0 0 calc(58px + env(safe-area-inset-top,0px));
  background:#fff;border-bottom:1px solid var(--line);
  display:flex;align-items:center;justify-content:space-between;
  padding:env(safe-area-inset-top,0px) 20px 0;gap:14px;
}
.topbar-left{display:flex;align-items:baseline;gap:10px;min-width:0}
.topbar h1{font-size:16px;font-weight:650;white-space:nowrap}
.topbar .sub{font-size:12px;color:var(--ink-3);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.topbar-right{display:flex;align-items:center;gap:9px;flex-shrink:0}

.content{flex:1;overflow:auto;padding:16px 20px 30px}

/* ---------- 按钮 ---------- */
.btn{
  display:inline-flex;align-items:center;justify-content:center;gap:5px;
  padding:7px 12px;border-radius:7px;font-size:12.5px;font-weight:550;
  border:1px solid transparent;transition:all .12s;white-space:nowrap;
}
.btn-primary{background:var(--brand);color:#fff}
.btn-primary:hover{background:#27527c}
.btn-ghost{background:#fff;border-color:var(--line);color:var(--ink-2)}
.btn-ghost:hover{background:#f7f9fb;border-color:#cdd9e4}
.btn-danger{background:var(--danger-bg);color:var(--danger)}
.btn-danger:hover{background:#f6dcdc}
.btn-sm{padding:5px 10px;font-size:12px}
.btn:disabled{opacity:.45;cursor:not-allowed}
.icon-btn{
  width:26px;height:26px;border-radius:6px;color:var(--ink-3);
  display:inline-flex;align-items:center;justify-content:center;font-size:15px;
}
.icon-btn:hover{background:#f0f4f8;color:var(--ink)}

/* ---------- 周切换 ---------- */
.weeknav{display:flex;align-items:center;gap:1px;border:1px solid var(--line);border-radius:8px;background:#fff;padding:2px}
.weeknav button{width:26px;height:24px;border-radius:5px;color:var(--ink-2);font-size:14px;display:flex;align-items:center;justify-content:center}
.weeknav button:hover{background:#f0f4f8}
.weeknav .range{
  font-size:12.5px;color:var(--ink);padding:0 9px;min-width:132px;text-align:center;
  font-variant-numeric:tabular-nums;font-weight:550;
}
.weeknav .range small{color:var(--ink-3);font-weight:400;margin-left:4px}

/* ---------- 卡片 ---------- */
.card{background:var(--panel);border:1px solid var(--line);border-radius:var(--radius);box-shadow:var(--shadow)}
.card-head{
  padding:13px 15px;border-bottom:1px solid var(--line-2);
  display:flex;align-items:center;justify-content:space-between;gap:12px;flex-wrap:wrap;
}
.card-head h3{font-size:13.5px;font-weight:650}
.card-body{padding:15px}
.card-body.tight{padding:0}

/* ---------- 指标 ---------- */
.kpis{display:grid;grid-template-columns:repeat(auto-fit,minmax(146px,1fr));gap:11px;margin-bottom:15px}
.kpi{background:#fff;border:1px solid var(--line);border-radius:var(--radius);padding:12px 14px;box-shadow:var(--shadow)}
.kpi .k-label{font-size:11.5px;color:var(--ink-3);margin-bottom:4px}
.kpi .k-value{font-size:20px;font-weight:680;letter-spacing:-.01em;font-variant-numeric:tabular-nums}
.kpi .k-unit{font-size:11.5px;color:var(--ink-3);font-weight:500;margin-left:2px}
.kpi .k-foot{font-size:11px;color:var(--ink-3);margin-top:3px}
.kpi.accent{border-color:#c3d8ea;background:linear-gradient(180deg,#f6fbfe,#fff)}
.kpi.warn .k-value{color:var(--warn)}
.kpi.danger .k-value{color:var(--danger)}

/* ---------- 表格 ---------- */
table{width:100%;border-collapse:collapse;font-size:12.5px}
thead th{
  text-align:left;font-weight:600;color:var(--ink-2);font-size:11.5px;
  padding:9px 12px;background:#f8fafc;border-bottom:1px solid var(--line);white-space:nowrap;
  position:sticky;top:0;z-index:2;
}
tbody td{padding:8px 12px;border-bottom:1px solid var(--line-2);vertical-align:middle}
tbody tr:hover{background:#f9fcfe}
tbody tr:last-child td{border-bottom:none}
.num{text-align:right;font-variant-numeric:tabular-nums}
.mono{font-variant-numeric:tabular-nums;font-size:12px;letter-spacing:-.01em}
.muted{color:var(--ink-3)}
.right{text-align:right}

.tag{
  display:inline-flex;align-items:center;gap:3px;padding:1px 7px;border-radius:5px;
  font-size:11px;font-weight:550;line-height:1.7;background:#eff3f7;color:var(--ink-2);white-space:nowrap;
}
.tag-ok{background:var(--ok-bg);color:var(--ok)}
.tag-warn{background:var(--warn-bg);color:var(--warn)}
.tag-danger{background:var(--danger-bg);color:var(--danger)}
.tag-brand{background:var(--brand-2);color:var(--brand)}
.tag-purple{background:var(--purple-bg);color:var(--purple)}

/* ---------- 总课表网格 ---------- */
.week-wrap{background:#fff;border:1px solid var(--line);border-radius:var(--radius);box-shadow:var(--shadow);overflow:auto}
.week{border-collapse:separate;border-spacing:0;width:100%;table-layout:fixed}
.week th{
  background:#f8fafc;border-bottom:1px solid var(--line);border-right:1px solid var(--line-2);
  padding:7px 4px;font-size:11.5px;font-weight:600;color:var(--ink-2);text-align:center;
  position:sticky;top:0;z-index:3;
}
.week th.slot-col{width:86px;text-align:left;padding-left:10px;left:0;z-index:4;background:#f8fafc}
.week th.today{background:var(--brand-2);color:var(--brand)}
.week th .d{display:block;font-size:10px;color:var(--ink-3);font-weight:500;margin-top:1px}
.week th .cnt{display:block;font-size:9.5px;color:var(--ink-3);font-weight:400}
.week th.busy{background:#f4f8fc}
/* 无课的日期：列宽收窄，只留星期做标识 */
.week th.narrow{
  padding-left:0;padding-right:0;text-align:center;font-size:10.5px;
  color:var(--ink-3);background:#fbfcfd;overflow:hidden;
}
.week th.narrow .d,.week th.narrow .cnt{display:none}
.week th.narrow.today{background:var(--brand-2);color:var(--brand)}

.week td{
  border-right:1px solid var(--line-2);border-bottom:1px solid var(--line-2);
  padding:2px;vertical-align:top;
}
.week td.slot-cell{
  background:#f8fafc;font-size:10.5px;color:var(--ink-3);text-align:center;
  padding:7px 3px;font-variant-numeric:tabular-nums;position:sticky;left:0;z-index:1;
  line-height:1.35;white-space:nowrap;
}
.week td.slot-cell small{display:block;font-size:9px;opacity:.75}
.week td.is-today{background:#fbfdff}
.week td.dragover{background:#e8f2fb;outline:2px dashed var(--brand);outline-offset:-2px}
.week td.empty-col{background:#fbfcfd}

/* 课节卡片 */
/* 左右分栏：左侧科目/时间/老师，右侧学生名单 */
.chip{
  display:grid;grid-template-columns:auto 1fr;gap:0 7px;align-items:start;
  border-radius:5px;padding:4px 6px 5px;margin-bottom:2px;cursor:grab;
  border-left:3px solid var(--brand);background:#f0f6fb;
  font-size:11px;line-height:1.35;position:relative;
  transition:box-shadow .1s,transform .1s;
}
.chip:active{cursor:grabbing}
.chip:hover{box-shadow:0 2px 7px rgba(25,55,85,.13);transform:translateY(-.5px);z-index:5}
.chip.dragging{opacity:.4;transform:scale(.97)}
.chip .c-left{min-width:0}
.chip .c-right{
  border-left:1px dashed rgba(47,95,143,.22);padding-left:6px;min-width:0;
}
.chip .c-t{font-variant-numeric:tabular-nums;color:var(--ink-3);font-size:9.5px;letter-spacing:-.02em;display:block}
.chip .c-sub{font-weight:650;color:var(--ink);display:block;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;font-size:11.5px}
.chip .c-stu{
  color:var(--ink-2);display:block;font-size:11px;line-height:1.5;
  word-break:break-all;
}
.chip .c-stu b{font-weight:600;color:var(--ink)}
.chip .c-tea{color:#7b8a9a;font-size:10px;display:block;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.chip.one{background:var(--purple-bg);border-left-color:var(--purple)}
.chip.one .c-right{border-left-color:rgba(111,87,163,.28)}
.chip.absent{background:#fdf3e5;border-left-color:var(--warn)}
.chip.stopped{display:none}
.chip.conflict{outline:1.5px solid #dc9a9a;outline-offset:-1px}
/* 已点名（已上）：绿色系 */
.chip.done{background:#eef8f1;border-left-color:#2f9e63;opacity:1}
.chip.done .c-sub{color:#1f6b45}
.chip.done .c-right{border-left-color:rgba(47,158,99,.3)}
.chip.done::after{content:'✓已上';position:absolute;right:4px;bottom:3px;font-size:8.5px;font-weight:700;color:#2f9e63;background:rgba(47,158,99,.12);border-radius:3px;padding:0 3px}
/* 过期未点名：红色系 */
.chip.overdue{background:#fdecec;border-left-color:#c0392b}
.chip.overdue .c-sub{color:#a5281b}
.chip.overdue .c-right{border-left-color:rgba(192,57,43,.28)}
.chip.overdue .c-flag{color:#c0392b}
/* 已调课：灰斜纹，科目加删除线 */
.chip.moved{
  background:repeating-linear-gradient(135deg,#f1f3f5,#f1f3f5 5px,#e4e8ec 5px,#e4e8ec 10px);
  border-left-color:#9aa7b4;opacity:.92;
}
.chip.moved .c-sub{text-decoration:line-through;color:#8a97a5}
.chip.moved .c-stu{color:#8a97a5}
.chip.moved .c-right{border-left-color:rgba(154,167,180,.3)}
/* 跳转闪烁 */
.chip.flash{animation:chipFlash .5s ease-in-out 4}
@keyframes chipFlash{
  0%,100%{box-shadow:0 0 0 0 rgba(47,95,143,0)}
  50%{box-shadow:0 0 0 3px rgba(47,95,143,.55)}
}
/* 卡片上的小按钮（点名 / 跳新位置） */
.chip .c-act{
  grid-column:1 / -1;justify-self:start;margin-top:3px;
  font-size:9.5px;line-height:1;padding:2px 6px;border-radius:4px;cursor:pointer;
  border:1px solid #c9d4de;background:#fff;color:var(--brand);font-weight:600;
}
.chip .c-act:hover{background:var(--brand);color:#fff;border-color:var(--brand)}
.chip .c-act.c-moved{color:#6b7a8a;border-color:#c2ccd5}
.chip .c-act.c-moved:hover{background:#6b7a8a;color:#fff;border-color:#6b7a8a}
.chip .c-flag{position:absolute;right:3px;top:2px;font-size:8.5px;font-weight:700;color:var(--warn)}
.chip.match{box-shadow:0 0 0 2px var(--brand) inset}
.chip .c-sub-mark{
  position:absolute;right:4px;bottom:3px;font-size:8.5px;color:var(--danger);font-weight:700;
  background:rgba(173,53,53,.1);border-radius:3px;padding:0 3px;
}
/* 本周新加入这节课的学生：名字后面挂「新」标（红色，醒目提示老师） */
.stu-new{
  display:inline-block;margin-left:2px;font-size:8.5px;line-height:1;font-weight:700;
  color:#fff;background:var(--danger,#ad3535);border-radius:3px;padding:1px 3px;vertical-align:1.5px;
}
/* 课卡角标：＋N 新 / 本周新开（红色系，与「新」标一致） */
.chip .c-new,.mc-top .c-new{
  font-size:9px;font-weight:700;color:#ad3535;background:rgba(173,53,53,.1);
  border:1px solid rgba(173,53,53,.35);border-radius:3px;padding:0 4px;white-space:nowrap;
}

/* 窄列模式（该日无课） */
.week.compact .col-off{display:none}
.week.compact .col-on{width:auto}

.legend{
  margin-top:10px;display:flex;gap:14px;flex-wrap:wrap;align-items:center;
  font-size:11px;color:var(--ink-3);padding:0 2px;
}
.legend i{display:inline-block;width:9px;height:9px;border-radius:2px;margin-right:4px;vertical-align:-1px}

/* ---------- 筛选条 ---------- */
.toolbar{display:flex;align-items:center;gap:7px;flex-wrap:wrap;margin-bottom:12px}
.toolbar .spacer{flex:1}
select.filter{
  padding:6px 9px;border:1px solid var(--line);border-radius:7px;background:#fff;
  font-size:12.5px;outline:none;color:var(--ink-2);max-width:170px;
}
select.filter:focus{border-color:var(--brand)}
.search{
  display:flex;align-items:center;gap:6px;background:#fff;border:1px solid var(--line);
  border-radius:7px;padding:6px 9px;min-width:170px;
}
.search input{border:none;outline:none;flex:1;font-size:12.5px;background:none;min-width:0}
.search span{color:var(--ink-3);font-size:12px}
.search:focus-within{border-color:var(--brand)}

.switch{
  display:inline-flex;align-items:center;gap:6px;padding:5px 10px;border:1px solid var(--line);
  border-radius:7px;background:#fff;font-size:12px;color:var(--ink-2);cursor:pointer;user-select:none;
}
.switch.on{background:var(--brand-2);border-color:#b9d1e5;color:var(--brand);font-weight:600}

/* ---------- 表单 ---------- */
.field{margin-bottom:12px}
.field label{display:block;font-size:11.5px;color:var(--ink-2);margin-bottom:4px;font-weight:550}
.field label .req{color:var(--danger);margin-left:2px}
.field input[type=text],.field input[type=number],.field input[type=date],.field input[type=time],
.field select,.field textarea{
  width:100%;padding:7px 9px;border:1px solid var(--line);border-radius:7px;background:#fff;
  outline:none;transition:border-color .12s,box-shadow .12s;
}
.field input:focus,.field select:focus,.field textarea:focus{border-color:var(--brand);box-shadow:0 0 0 3px rgba(47,95,143,.08)}
.field textarea{resize:vertical;min-height:56px}
.field .hint{font-size:11px;color:var(--ink-3);margin-top:3px}
/* ---------- 学费结算 ---------- */
.bl-i,.bl-x{
  width:100%;min-width:62px;padding:5px 7px;border:1px solid var(--line);
  border-radius:6px;background:#fff;outline:none;font-size:12.5px;
}
.bl-i:focus,.bl-x:focus{border-color:var(--brand);box-shadow:0 0 0 3px rgba(47,95,143,.08)}
@media(max-width:640px){
  .bl-i,.bl-x{min-height:34px}
  .bl-x{width:78px}
}
.field-row-3{display:grid;grid-template-columns:1fr 1fr 1fr;gap:11px}

/* 时间选择 */
.time-grid{display:grid;grid-template-columns:76px 1fr;gap:8px;align-items:center}
.time-pick{display:flex;gap:5px;align-items:center;flex-wrap:wrap}
.time-pick select{
  padding:6px 8px;border:1px solid var(--line);border-radius:7px;background:#fff;font-size:12.5px;
  outline:none;min-width:86px;font-variant-numeric:tabular-nums;
}
.time-pick .arrow{color:var(--ink-3);font-size:11px}
.presets{display:flex;flex-wrap:wrap;gap:5px;margin-top:7px}
.preset{
  padding:3px 9px;border:1px solid var(--line);border-radius:14px;font-size:11.5px;background:#fff;
  cursor:pointer;color:var(--ink-2);transition:all .1s;font-variant-numeric:tabular-nums;
}
.preset:hover{border-color:#b9d1e5;background:var(--brand-2);color:var(--brand)}
.preset.on{background:var(--brand);border-color:var(--brand);color:#fff;font-weight:600}
.dur-hint{font-size:11px;color:var(--ink-3);margin-top:5px}

/* 学生多选 */
.check-group{
  display:flex;flex-wrap:wrap;gap:5px;max-height:150px;overflow-y:auto;
  border:1px solid var(--line);border-radius:7px;padding:8px;background:#fcfdfe;
}
.check-item{
  display:inline-flex;align-items:center;gap:4px;padding:2px 8px;border:1px solid var(--line);
  border-radius:13px;font-size:11.5px;cursor:pointer;background:#fff;transition:all .1s;user-select:none;
}
.check-item:hover{border-color:#bdcfdd}
.check-item.on{background:var(--brand-2);border-color:#b3cde2;color:var(--brand);font-weight:600}
.check-item input{display:none}
.sel-summary{font-size:11.5px;color:var(--ink-3);margin-top:5px}
.sel-summary b{color:var(--brand)}

/* ---------- 弹窗 ---------- */
.modal-mask{
  position:fixed;inset:0;background:rgba(20,33,46,.34);display:none;align-items:flex-start;
  justify-content:center;z-index:300;padding:50px 16px 24px;overflow:auto;
}
.modal-mask.show{display:flex}
.modal{
  background:#fff;border-radius:12px;width:100%;max-width:520px;
  box-shadow:0 14px 50px rgba(15,35,55,.22);animation:pop .15s ease-out;
  max-height:calc(100vh - 90px);display:flex;flex-direction:column;
}
.modal.wide{max-width:760px}
@keyframes pop{from{opacity:0;transform:translateY(-7px) scale(.99)}to{opacity:1;transform:none}}
.modal-head{padding:15px 17px 11px;border-bottom:1px solid var(--line-2);display:flex;align-items:center;justify-content:space-between}
.modal-head h3{font-size:14.5px;font-weight:650}
.modal-body{padding:15px 17px;overflow-y:auto;flex:1}
.modal-foot{
  padding:11px 17px;border-top:1px solid var(--line-2);display:flex;justify-content:flex-end;gap:7px;
  background:#fafbfc;border-radius:0 0 12px 12px;flex-wrap:wrap;
}

/* ---------- toast ---------- */
.toast{
  position:fixed;bottom:26px;left:50%;transform:translateX(-50%) translateY(10px);
  background:#1c2834;color:#fff;padding:9px 17px;border-radius:8px;font-size:12.5px;
  opacity:0;pointer-events:none;transition:all .2s;z-index:400;box-shadow:0 6px 20px rgba(0,0,0,.22);
  max-width:80vw;
}
.toast.show{opacity:1;transform:translateX(-50%) translateY(0)}
.toast.err{background:#a13838}

/* ---------- 其他 ---------- */
.empty{padding:40px 20px;text-align:center;color:var(--ink-3);font-size:12.5px}
.empty .big{font-size:24px;margin-bottom:7px;opacity:.35}
.kv{display:grid;grid-template-columns:92px 1fr;gap:8px 12px;font-size:12.5px}
.kv dt{color:var(--ink-3)}
.kv dd{color:var(--ink)}
.notice{
  display:flex;gap:8px;padding:10px 12px;border-radius:8px;font-size:12px;
  background:var(--warn-bg);color:#8a5a1d;border:1px solid #efd8b6;margin-bottom:13px;
}
.notice.info{background:var(--brand-2);color:#28557f;border-color:#c6daea}
.notice b{font-weight:650}
.avatar{
  width:23px;height:23px;border-radius:50%;background:var(--brand-2);color:var(--brand);
  display:inline-flex;align-items:center;justify-content:center;font-size:10.5px;font-weight:600;flex:0 0 23px;
}
.who{display:flex;align-items:center;gap:7px}
.who .nm{font-weight:550}
/* 已排课 / 未排课 区分 */
tr.row-unsched > td{background:#fffaf2}
tr.row-unsched:hover > td{background:#fdf4e6 !important}
.who .nm.ok{color:var(--ink)}
.who .nm.warn{color:#a9661b;font-weight:650}
.avatar.av-warn{background:var(--warn-bg);color:var(--warn)}
.bar{height:4px;border-radius:2px;background:#edf1f6;overflow:hidden;margin-top:4px}
.bar > i{display:block;height:100%;background:var(--brand);border-radius:2px}
.bar.low > i{background:var(--warn)}
.bar.crit > i{background:var(--danger)}

/* 看板 */
.board-title{text-align:center;padding:6px 0 14px}
.board-title h2{font-size:16px;font-weight:680;letter-spacing:.04em}
.board-title span{font-size:11.5px;color:var(--ink-3)}
.board-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(170px,1fr));gap:12px;margin-bottom:15px}
.board-cell{
  background:#fff;border:1px solid var(--line);border-radius:var(--radius);padding:15px 16px;
  text-align:center;box-shadow:var(--shadow);
}
.board-cell .bl{font-size:11.5px;color:var(--ink-3);margin-bottom:6px}
.board-cell .bv{font-size:26px;font-weight:700;font-variant-numeric:tabular-nums;letter-spacing:-.02em}
.board-cell .bu{font-size:11.5px;color:var(--ink-3);margin-left:3px;font-weight:500}
.board-cell.primary{background:linear-gradient(180deg,#f5fafe,#fff);border-color:#c3d8ea}
.board-cell.primary .bv{color:var(--brand)}
.board-cell.alert .bv{color:var(--warn)}
.board-cell.history .bv{color:var(--ink-3)}

/* 代课情况 */
.sub-card{margin-top:10px;padding:9px 12px;background:var(--bg-2);border:1px solid var(--line);border-radius:7px;display:flex;flex-wrap:wrap;align-items:center;gap:4px}
.sub-card .tag{margin:2px 0 2px 5px}
.sub-table thead th{font-size:11px;padding:7px 10px}
.sub-table tbody td{padding:7px 10px;font-size:12px}
.sub-empty{padding:22px;text-align:center;color:var(--ink-3);font-size:12.5px}
.sub-empty .big{font-size:22px;opacity:.35;margin-bottom:6px}

/* 拖动提示 */
.drag-tip{
  position:fixed;padding:5px 10px;background:#1c2834;color:#fff;border-radius:6px;font-size:11.5px;
  pointer-events:none;z-index:300;display:none;white-space:nowrap;
}

/* ---------- 自动排课 ---------- */
.au-dates{display:flex;gap:6px;flex-wrap:wrap}
.au-date{
  padding:5px 11px;border:1px solid var(--line);border-radius:7px;background:#fff;
  font-size:12px;cursor:pointer;user-select:none;text-align:center;color:var(--ink-2);
}
.au-date.on{background:var(--brand);border-color:var(--brand);color:#fff;font-weight:600}
.au-date small{display:block;font-size:10px;opacity:.75}
.au-grid-wrap{border:1px solid var(--line);border-radius:8px;overflow:auto}
table.au-grid{border-collapse:separate;border-spacing:0;width:100%;table-layout:fixed}
table.au-grid th{
  background:#f8fafc;border-bottom:1px solid var(--line);border-right:1px solid var(--line-2);
  padding:6px 4px;font-size:11px;font-weight:600;color:var(--ink-2);text-align:center;
}
table.au-grid th span{display:block;font-size:10px;color:var(--ink-3)}
table.au-grid td{border-bottom:1px solid var(--line-2);border-right:1px solid var(--line-2);padding:3px;vertical-align:top}
table.au-grid td.slot-cell{
  background:#f8fafc;font-size:11px;color:var(--ink-2);text-align:center;padding:6px 4px;
  font-variant-numeric:tabular-nums;white-space:nowrap;
}
.au-cell{
  padding:7px 4px;border:1px solid var(--line-2);border-radius:6px;font-size:11px;
  text-align:center;cursor:pointer;background:#fff;color:var(--ink-3);user-select:none;
}
.au-cell.on{background:var(--ok-bg);border-color:#b7ddc7;color:var(--ok)}
.au-cell.off{background:#f4f6f8;color:var(--ink-3);text-decoration:line-through}
.au-cell.busy{background:var(--danger-bg);border-color:#f0c9c9;color:var(--danger);cursor:not-allowed}
.au-chip{border-radius:6px;padding:4px 6px;margin-bottom:3px;font-size:11px;color:#fff;line-height:1.35;cursor:grab}
.au-chip:hover{filter:brightness(1.06)}
.au-chip:active{cursor:grabbing}
.au-chip.dragging{opacity:.45;outline:2px dashed var(--brand);outline-offset:1px}
.au-chip small{display:block;opacity:.88;font-size:10px}
.au-chip.clash{box-shadow:0 0 0 2px var(--danger)}
.au-chip.off{opacity:.75;outline:2px dashed var(--warn);outline-offset:1px}
.au-grid td.au-drop{min-height:26px;vertical-align:top}
td.au-drop.over{background:var(--brand-2);box-shadow:inset 0 0 0 2px var(--brand)}
.au-grid tr.au-row-idle td.slot-cell{color:var(--ink-3);opacity:.75}
.au-plan{border:1px solid var(--line);border-radius:var(--radius);background:#fff;padding:13px;margin-bottom:12px;box-shadow:var(--shadow)}
.au-plan.best{border-color:var(--brand);box-shadow:0 0 0 2px var(--brand-2)}
.au-plan-head{display:flex;align-items:center;gap:9px;flex-wrap:wrap;margin-bottom:9px}
.au-score{font-size:22px;font-weight:680;color:var(--brand);font-variant-numeric:tabular-nums}
.au-metrics{display:grid;grid-template-columns:repeat(auto-fit,minmax(118px,1fr));gap:8px;margin:9px 0}
.au-metric .mh{display:flex;justify-content:space-between;font-size:11px;color:var(--ink-2)}
.au-bar{height:5px;border-radius:3px;background:#eef2f6;overflow:hidden;margin-top:3px}
.au-bar i{display:block;height:100%;background:var(--brand)}
.au-sug{border-left:3px solid var(--warn);background:#fffdf7;padding:8px 10px;border-radius:6px;margin-bottom:7px;font-size:12px}
.au-sug .au-d{font-weight:650;color:var(--ok);font-variant-numeric:tabular-nums}
table.au-rows td{padding:4px 5px;border-bottom:1px solid var(--line-2)}
table.au-rows input,table.au-rows select{
  width:100%;padding:5px 6px;border:1px solid var(--line);border-radius:6px;font-size:12px;background:#fff;outline:none;
}
table.au-rows input:focus,table.au-rows select:focus{border-color:var(--brand)}
.au-clash{color:var(--danger);font-size:11.5px}
.au-ok{color:var(--ok);font-size:11.5px}
.au-stu-cell{min-width:190px}
.au-stu-chips{display:flex;flex-wrap:wrap;gap:4px;align-items:center}
.au-stu-chip{
  display:inline-flex;align-items:center;gap:3px;padding:2px 5px 2px 8px;border-radius:12px;
  background:var(--brand-2);border:1px solid #c6daea;color:var(--brand);font-size:11.5px;
}
.au-stu-chip small{opacity:.75;font-size:10px}
.au-stu-chip b{cursor:pointer;font-weight:400;opacity:.55;padding:0 2px;font-size:11px}
.au-stu-chip b:hover{opacity:1;color:var(--danger)}
.au-stu-chip.bad{background:var(--danger-bg);border-color:#f0c9c9;color:var(--danger)}
.au-amb{background:var(--warn-bg);color:var(--warn);padding:0 5px;border-radius:4px;font-size:10.5px}
.au-pick{padding:2px 8px;font-size:11px;height:22px;line-height:1}

/* ===== 课后点评 ===== */
.fb-box{margin-top:16px;border:1px solid var(--line);border-radius:9px;padding:11px 13px;background:#fcfdfe}
.fb-head{display:flex;align-items:center;gap:8px;margin-bottom:9px}
.fb-head b{font-size:12.5px}
.fb-row{border-top:1px dashed var(--line-2);padding:9px 0}
.fb-row:first-of-type{border-top:0;padding-top:2px}
.fb-row .fb-who{display:flex;align-items:center;gap:7px;margin-bottom:6px}
.fb-row .fb-who .nm{font-weight:600;font-size:12.5px}
.fb-row textarea,.fb-row input{width:100%;border:1px solid var(--line);border-radius:6px;padding:6px 8px;font-size:12px;font-family:inherit;outline:none;background:#fff}
.fb-row textarea:focus,.fb-row input:focus{border-color:var(--brand)}
.fb-row .fb-exam{display:flex;gap:6px;margin-top:5px}
.fb-row .fb-exam input[type=number]{width:110px;flex:0 0 110px}
.fb-hint{font-size:10.5px;color:var(--ink-3);margin-top:3px}
/* ===== 课表点名弹窗 ===== */
.rc-head{
  font-size:12px;color:var(--ink-2);background:#f6f8fa;border-radius:7px;
  padding:7px 10px;margin-bottom:6px;
}
.rc-row{border:1px solid var(--line);border-radius:8px;padding:9px 11px;margin-bottom:8px;background:#fff}
.rc-row .rc-who{display:flex;align-items:center;gap:7px;margin-bottom:6px;flex-wrap:wrap}
.rc-row .rc-who .nm{font-weight:650;font-size:13px}
.rc-row textarea,.rc-row input{
  width:100%;border:1px solid var(--line);border-radius:6px;padding:6px 8px;
  font-size:12px;font-family:inherit;outline:none;background:#fff;
}
.rc-row textarea:focus,.rc-row input:focus{border-color:var(--brand)}
.rc-row .fb-exam{display:flex;gap:6px;margin-top:5px}
.rc-row .fb-exam input[type=number]{width:110px;flex:0 0 110px}
/* 缺勤：隐藏课后反馈，不必填写 */
.rc-abs{display:none}
.rc-row.abs .rc-fb,.fb-row.abs .fb-exam,.fb-row.abs textarea{display:none}
.rc-row.abs,.fb-row.abs{background:#fffaf9}
.rc-row.abs .rc-abs,.fb-row.abs .rc-abs{
  display:block;font-size:11.5px;color:#b4442f;background:#fdeceb;
  border:1px dashed #f0c2b9;border-radius:6px;padding:6px 9px;margin:2px 0 0;
}
.tag-abs{background:#fdeceb!important;color:#b4442f!important}
.fb-sub{font-size:11.5px;font-weight:600;color:var(--ink-2);margin:12px 0 5px}
.sub-ref{margin-top:14px;border:1px dashed #e8c98d;border-radius:9px;padding:10px 12px;background:#fffdf7}
.sub-ref .sr-item{border-top:1px dashed #efe0c4;padding:7px 0;font-size:12px}
.sub-ref .sr-item:first-of-type{border-top:0}
.sub-ref .sr-sum{font-size:11.5px;color:var(--ink-2);margin-top:3px}
.sub-ref .sr-sum b{color:var(--ink)}

/* ===== 上课统计（audit） ===== */
.spacer{flex:1}
.stat-bar .preset,.stat-presets .preset{margin:0}
.stat-bar{display:flex;flex-wrap:wrap;gap:8px;align-items:center}
.stat-bar label{font-size:12px;color:var(--ink-2)}
.stat-bar input[type=date]{
  padding:5px 8px;border:1px solid var(--line);border-radius:7px;font-size:12.5px;background:#fff;
  outline:none;font-variant-numeric:tabular-nums;
}
.stat-bar input[type=date]:focus{border-color:var(--brand)}
.stat-quick{display:flex;flex-wrap:wrap;gap:5px}
.stat-quick .sp{
  padding:3px 10px;border:1px solid var(--line);border-radius:20px;background:#fff;cursor:pointer;
  font-size:11.5px;color:var(--ink-2);font-family:inherit;line-height:1.6;
}
.stat-quick .sp:hover{border-color:var(--brand);color:var(--brand)}
.stat-quick .sp.on{background:var(--brand);border-color:var(--brand);color:#fff;font-weight:600}
.stat-modes{display:inline-flex;border:1px solid var(--line);border-radius:8px;overflow:hidden;background:#fff}
.stat-modes button{
  padding:6px 14px;border:0;background:transparent;cursor:pointer;font-size:12.5px;
  color:var(--ink-2);font-family:inherit;border-right:1px solid var(--line);
}
.stat-modes button:last-child{border-right:0}
.stat-modes button.on{background:var(--brand);color:#fff;font-weight:600}

table.stat-tbl{width:100%;border-collapse:collapse}
table.stat-tbl th{
  padding:7px 9px;text-align:left;font-size:11.5px;color:var(--ink-2);font-weight:600;
  background:#f7f9fb;border-bottom:1px solid var(--line);white-space:nowrap;
}
table.stat-tbl td{
  padding:7px 9px;font-size:12.5px;border-bottom:1px solid var(--line-2);
  font-variant-numeric:tabular-nums;vertical-align:middle;
}
table.stat-tbl td.num,table.stat-tbl th.num{text-align:right}
table.stat-tbl tbody tr:hover td{background:#fafcfe}
table.stat-tbl tr.stat-sum td{
  background:#f8fafc;border-top:2px solid var(--line);border-bottom:0;font-weight:650;color:var(--ink);
}
table.stat-tbl td.zero{color:#c3ccd6}
table.stat-tbl .stat-name{
  font-weight:600;color:var(--ink);cursor:pointer;border-bottom:1px dashed transparent;
}
table.stat-tbl .stat-name:hover{color:var(--brand);border-bottom-color:var(--brand)}
table.stat-tbl td .sub{display:block;font-size:10.5px;color:var(--ink-3);font-weight:400;margin-top:1px}
.stat-tag{
  display:inline-block;padding:1px 6px;border-radius:4px;background:var(--brand-2);color:var(--brand);
  font-size:10.5px;margin:1px 3px 1px 0;white-space:nowrap;
}
.stat-tag.t2{background:#eef6ee;color:#3f7d46}
.stat-tag.t3{background:#fdf5e6;color:#9a6a10}
.stat-tag.t4{background:#f4eefb;color:#7a52a8}
.stat-empty{padding:26px;text-align:center;color:var(--ink-3);font-size:12.5px}

/* ==========================================================
   登录页
   ========================================================== */
.login-gate{
  position:fixed;inset:0;z-index:300;display:none;
  background:linear-gradient(160deg,#eaf1f8 0%,#f6f9fc 45%,#eef3f8 100%);
  align-items:center;justify-content:center;padding:20px;
  padding-top:calc(20px + env(safe-area-inset-top,0px));   /* iPhone 独立窗口避让状态栏 */
}
.login-gate.show{display:flex}
.lg-box{
  width:100%;max-width:390px;background:#fff;border-radius:16px;
  box-shadow:0 8px 40px rgba(24,50,80,.13), 0 1px 3px rgba(24,50,80,.06);
  overflow:hidden;
}
.lg-head{display:flex;gap:12px;align-items:center;padding:22px 24px 18px;border-bottom:1px solid var(--line-2);background:#fbfdff}
.lg-mark{
  width:42px;height:42px;flex:0 0 42px;border-radius:11px;
  background:linear-gradient(135deg,#2f5f8f,#4a86bd);color:#fff;
  display:flex;align-items:center;justify-content:center;font-weight:700;font-size:19px;
  box-shadow:0 3px 10px rgba(47,95,143,.3);
}
.lg-t{font-size:15.5px;font-weight:700;letter-spacing:.01em}
.lg-s{font-size:11.5px;color:var(--ink-3);margin-top:2px}
.lg-body{padding:20px 24px 24px}
.lg-lb{display:block;font-size:12px;color:var(--ink-2);font-weight:600;margin:0 0 6px}
.lg-in{
  width:100%;height:44px;padding:0 13px;border:1px solid var(--line);border-radius:9px;
  background:#fbfdff;font-size:15px;margin-bottom:14px;transition:.15s;
}
.lg-in:focus{outline:none;border-color:var(--brand);background:#fff;box-shadow:0 0 0 3px rgba(47,95,143,.1)}
.lg-err{min-height:17px;font-size:12px;color:var(--danger);margin-bottom:8px}
.lg-btn{
  width:100%;height:46px;border-radius:9px;background:var(--brand);color:#fff;
  font-size:15px;font-weight:600;letter-spacing:.14em;transition:.15s;
}
.lg-btn:hover{background:#27527c}
.lg-btn:disabled{opacity:.6}
.lg-alt{
  width:100%;height:38px;margin-top:9px;border-radius:9px;border:1px solid var(--line);
  background:#fff;color:var(--ink-2);font-size:12.5px;
}
.lg-tip{margin-top:12px;font-size:11.5px;color:var(--ink-3);text-align:center;line-height:1.6}
.lg-tip2{margin-top:14px;padding-top:13px;border-top:1px dashed var(--line);font-size:11px;color:var(--ink-3);text-align:center}

/* ==========================================================
   云端状态 + 用户信息
   ========================================================== */
.cloud-badge{
  margin-top:9px;display:inline-flex;align-items:center;gap:4px;
  font-size:10.5px;padding:3px 8px;border-radius:20px;cursor:pointer;
  background:#f4f6f9;color:var(--ink-3);border:1px solid var(--line-2);
  max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;
}
.cloud-badge.ok{background:#e9f6ef;color:#1f6b45;border-color:#cfe9db}
.cloud-badge.off{background:#f4f6f9;color:#7b8794}
.cloud-badge.ing{background:#eef4fb;color:var(--brand);border-color:#d6e3f1}
.cloud-badge.err{background:#fdecec;color:#a5281b;border-color:#f2d2d2}
.user-chip{
  margin-top:10px;display:flex;align-items:center;gap:6px;flex-wrap:wrap;
  padding:6px 7px;background:#f7f9fc;border:1px solid var(--line-2);border-radius:8px;
  font-size:11.5px;
}
.uc-av{
  width:22px;height:22px;flex:0 0 22px;border-radius:6px;color:#fff;
  display:flex;align-items:center;justify-content:center;font-size:11px;font-weight:700;
}
.uc-nm{font-weight:600;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:64px}
.uc-role{font-size:10px;background:#fff;border:1px solid var(--line-2);padding:1px 5px;border-radius:9px;white-space:nowrap}
/* 版本号：设置页/登录页常显，顶栏只在桌面显示，避免手机顶栏挤爆 */
.ver-chip{font-size:11.5px;font-weight:650;white-space:nowrap;font-variant-numeric:tabular-nums}
.uc-ver{display:none}
@media(min-width:901px){
  .uc-ver{
    display:inline;font-size:11px;opacity:.85;
    flex:1 1 100%;order:9;                    /* 第二行整行显示，不挤掉「退出」按钮 */
    white-space:nowrap;overflow:hidden;text-overflow:ellipsis;
  }
}
.uc-out{margin-left:auto;font-size:10.5px;color:var(--ink-3);padding:1px 4px;border-radius:4px;flex:0 0 auto}
.uc-out + .uc-out{margin-left:0}
.uc-out:hover{background:#e9eef4;color:var(--danger)}

/* ==========================================================
   手机端底部导航（窄屏才出现）
   ========================================================== */
.mobnav{display:none}

/* ==========================================================
   响应式：平板
   ========================================================== */
@media(max-width:1100px){
  .topbar{flex-wrap:wrap;gap:8px}
  .topbar-right{flex-wrap:wrap}
}

@media(max-width:900px){
  .sidebar{width:60px;flex:0 0 60px}
  .brand-name,.brand-date,.nav-item span,.nav-group{display:none}
  .nav-item{justify-content:center}
  .content{padding:12px}
  /* 窄侧栏（60px 图标栏）：账号卡只留头像 */
  .user-chip{justify-content:center;padding:6px 4px}
  .user-chip .uc-nm,.user-chip .uc-role,.user-chip .uc-out{display:none}
  /* 60px 栏放不下版本号文字，收起（手机抽屉 ≤640 会重新显示） */
  .ver-line{display:none}
}

/* ==========================================================
   响应式：手机竖屏（教师端 / 学管师端主要场景）
   ========================================================== */
@media(max-width:640px){
  body{font-size:14px;overflow:hidden}
  .app{flex-direction:column}

  /* 侧栏 -> 抽屉，默认收起 */
  .sidebar{
    position:fixed;left:0;top:0;bottom:0;width:246px;flex:none;z-index:200;
    transform:translateX(-100%);transition:transform .22s ease;
    box-shadow:0 0 32px rgba(20,40,60,.2);
  }
  .sidebar.drawer{transform:none}
  .sidebar .brand-name,.sidebar .brand-date,.sidebar .nav-item span,.sidebar .nav-group{display:block}
  .sidebar .nav-item{justify-content:flex-start}
  /* 抽屉展开后侧栏恢复 246px：账号卡内容也恢复显示 */
  .user-chip .uc-nm,.user-chip .uc-role{display:inline}
  .user-chip .uc-out{display:inline-block}
  /* 抽屉宽 246px，版本号重新显示（老师在手机上靠这里自查版本） */
  .ver-line{display:block;padding:8px 12px 0}
  .sidebar .cloud-badge{font-size:11px}
  .oplog{display:none}

  .main{flex:1;min-height:0;padding-bottom:calc(56px + env(safe-area-inset-bottom,0px))}
  /* iPhone 添加到桌面后状态栏会盖住顶栏，这里把筛选器整体下移 */
  .topbar{
    height:auto;min-height:calc(58px + env(safe-area-inset-top,0px));flex:0 0 auto;
    padding:calc(8px + env(safe-area-inset-top,0px)) 12px 6px;flex-wrap:wrap;gap:6px;
  }
  .topbar h1{font-size:15px}
  .topbar .sub{display:none}
  .topbar-right{width:100%;gap:6px;overflow-x:auto;flex-wrap:nowrap;padding-bottom:2px;scrollbar-width:none}
  .topbar-right::-webkit-scrollbar{display:none}
  .topbar-right .filter{flex:0 0 auto;max-width:132px;height:32px;font-size:12px}
  .topbar-right .btn{padding:0 9px;height:32px;font-size:12px;white-space:nowrap;flex:0 0 auto}
  .weeknav{flex:0 0 auto;height:32px}
  .weeknav .range{font-size:11px;padding:0 5px;white-space:nowrap}
  /* 「2026秋季班·第9周」手机上也要看得见（顶栏横向可滚动，多出的宽度不会挤掉按钮） */
  .weeknav .range small{display:inline-block;font-size:10px;margin-left:3px}
  .weeknav button{width:26px;height:26px}
  .content{padding:10px 10px calc(20px + env(safe-area-inset-bottom,0px))}

  .btn{min-height:34px}
  .btn-sm{min-height:30px;padding:5px 10px;font-size:12.5px}

  .kpis{grid-template-columns:repeat(2,1fr)!important;gap:8px!important}
  .kpi{padding:10px 11px!important;border-radius:9px}
  .kpi .k-label{font-size:11px}
  .kpi .k-value{font-size:19px}

  /* 总课表：横向可滑动，时段列窄 */
  .week-wrap{border-radius:9px;overflow:auto;-webkit-overflow-scrolling:touch}
  .week{min-width:auto;table-layout:fixed}
  .week col:first-child,.week th.slot-col,.week td.slot-cell{width:52px!important;min-width:52px}
  .week th{padding:6px 2px!important;font-size:11px}
  .week th .d{font-size:9.5px}
  .week th .cnt{font-size:9px}
  .week th.slot-col{padding-left:4px!important;font-size:10px}
  .week td{padding:3px!important;vertical-align:top}
  .week td.slot-cell{padding:5px 2px!important}
  .week td.slot-cell small{font-size:8.5px}
  .chip{padding:5px 5px!important;border-radius:6px!important;min-height:56px}
  .chip .c-sub{font-size:11px!important}
  .chip .c-t{font-size:9.5px!important}
  .chip .c-tea{font-size:10px!important}
  .chip .c-stu{font-size:10px!important;line-height:1.35}
  .chip .c-act{font-size:10px!important;padding:3px 7px!important}
  .legend{font-size:10.5px;gap:8px 12px}

  /* 表格：手机上横向滑动 */
  .card-body.tight{max-height:none!important;overflow-x:auto!important;-webkit-overflow-scrolling:touch}
  table{min-width:520px}
  table th,table td{padding:8px 7px!important;font-size:12px}
  .who{gap:6px}
  .avatar{width:24px;height:24px;flex:0 0 24px;font-size:11px}

  /* 表单：单列铺满，弹窗从底部升起 */
  .modal{
    position:fixed;left:0;right:0;bottom:0;top:auto;width:100%;max-width:100%;
    max-height:92vh;border-radius:16px 16px 0 0;margin:0;
    animation:sheetUp .22s ease;
  }
  @keyframes sheetUp{from{transform:translateY(24px);opacity:.6}to{transform:none;opacity:1}}
  .modal-head{padding:12px 14px;position:sticky;top:0;background:#fff;z-index:2;border-bottom:1px solid var(--line-2)}
  .modal-head h3{font-size:14.5px}
  .modal-body{padding:14px;max-height:calc(92vh - 118px);overflow:auto}
  .modal-foot{padding:10px 14px calc(10px + env(safe-area-inset-bottom));position:sticky;bottom:0;background:#fff;border-top:1px solid var(--line-2)}
  .modal-foot .btn{flex:1}
  .modal.wide{width:100%;max-width:100%}
  .field-row{grid-template-columns:1fr!important;gap:10px!important}
  .field label{font-size:12.5px}
  .field input,.field select,.field textarea{
    min-height:42px;font-size:15px;padding:9px 11px;
  }
  .field textarea{min-height:70px}
  .presets{flex-wrap:wrap;gap:6px}

  .rc-row{padding:10px!important}
  .rc-row textarea,.rc-row input{font-size:15px!important}
  .rc-head{font-size:11px}

  .mobnav{
    display:flex;position:fixed;left:0;right:0;bottom:0;z-index:150;
    background:rgba(255,255,255,.97);backdrop-filter:blur(8px);
    border-top:1px solid var(--line);padding-bottom:env(safe-area-inset-bottom);
  }
  .mobnav a{
    flex:1;display:flex;flex-direction:column;align-items:center;justify-content:center;
    gap:2px;padding:7px 2px 6px;font-size:10px;color:var(--ink-3);
  }
  .mobnav a i{font-style:normal;font-size:16px;line-height:1}
  .mobnav a.on{color:var(--brand);font-weight:600}
  .mobnav a:active{background:#f2f6fa}

  .login-gate{padding:0;align-items:flex-start}
  .lg-box{border-radius:0;min-height:100vh;box-shadow:none;display:flex;flex-direction:column;justify-content:center;max-width:100%}
  .lg-head{padding:26px 22px 20px}
  .lg-body{padding:22px}
  .lg-in{height:48px;font-size:16px}
  .lg-btn{height:50px}

  .toast{bottom:calc(66px + env(safe-area-inset-bottom))!important}
}

/* 手机横屏 / 小平板 */
@media(min-width:641px) and (max-width:900px){
  .week th.slot-col,.week td.slot-cell{width:68px!important}
  .chip .c-stu{font-size:10.5px}
}


/* 手机竖屏：按天卡片流 */
.mday{margin-bottom:14px}
.mday-h{
  display:flex;align-items:center;gap:8px;padding:7px 10px;margin-bottom:8px;
  background:var(--brand-2);border-radius:8px;font-size:13px;color:var(--brand);
}
.mday-h.today{background:var(--brand);color:#fff}
.mday-h span{font-size:11px;opacity:.8}
.mchip{padding:9px 10px!important;min-height:0!important;margin-bottom:8px;border-radius:9px!important}
.mc-top{display:flex;align-items:center;gap:7px;flex-wrap:wrap}
.mc-subj{font-weight:700;font-size:14px;color:var(--ink)}
.mc-time{font-size:12px;color:var(--ink-2);font-variant-numeric:tabular-nums}
.mc-tag{font-size:10.5px;padding:1.5px 7px;border-radius:9px;font-weight:600}
.mc-tea{font-size:12px;color:var(--ink-2);margin-top:3px}
.mc-stu{font-size:12.5px;color:var(--ink-2);margin-top:3px;line-height:1.6}
.mc-stu span{display:inline-block;margin-right:8px}
.mc-stu span.hi{color:var(--brand);font-weight:700}
.mc-roll{margin-top:7px}

/* ---------- 自动排课：AI 读懂备注 ---------- */
.au-ai-note{margin-top:3px}
.au-ai-tag{
  display:inline-block;max-width:200px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;
  font-size:10.5px;line-height:1.5;padding:1.5px 7px;border-radius:8px;
  background:#eef4fb;color:#2f5f8f;border:1px solid #d8e6f4;vertical-align:middle;
}
#auAiNote{position:relative}
#auAiNote.btn-primary{box-shadow:0 1px 0 rgba(47,95,143,.18)}

/* ---------- 课表确认 ---------- */
.wc-pill{display:inline-flex;align-items:center;gap:4px;font-size:11px;padding:2px 8px;border-radius:9px}
@media(max-width:640px){
  .au-ai-tag{max-width:130px}
}

/* ---------- 新生排课 · 加入现有组推荐 ---------- */
.nj-form{display:grid;grid-template-columns:1.4fr 1fr 0.9fr 1.1fr auto;gap:10px;align-items:end}
.nj-form .field{margin-bottom:0}
@media(max-width:900px){
  .nj-form{grid-template-columns:1fr 1fr 1fr}
}

/* ==========================================================
   手机竖屏：自动排课版面适配
   ========================================================== */
@media(max-width:640px){
  .field-row-3{grid-template-columns:1fr!important;gap:10px!important}

  /* 新生排课表单：两列 */
  .nj-form{grid-template-columns:1fr 1fr}
  .nj-form .nj-act{grid-column:1/-1}
  .nj-form .nj-act .btn{width:100%;min-height:42px}
  .nj-form .nj-act label{display:none}

  /* 日期选择条：横向滑动 */
  .au-dates{flex-wrap:nowrap;overflow-x:auto;-webkit-overflow-scrolling:touch;padding-bottom:4px;scrollbar-width:none}
  .au-dates::-webkit-scrollbar{display:none}
  .au-date{flex:0 0 auto;min-width:56px}

  /* 学生清单：表格 → 卡片（一节课一张卡，字段带标签） */
  .au-rows-wrap{overflow:visible!important}
  table.au-rows{min-width:0!important;display:block}
  table.au-rows thead{display:none}
  table.au-rows tbody{display:block;width:100%}
  table.au-rows tr{
    display:block;border:1px solid var(--line);border-radius:10px;background:#fff;
    padding:9px 10px 7px;margin-bottom:10px;box-shadow:var(--shadow);
  }
  table.au-rows td{
    display:block!important;border-bottom:none!important;padding:5px 2px!important;
    min-width:0!important;width:auto!important;
  }
  table.au-rows td[data-lb]::before{
    content:attr(data-lb);display:block;font-size:10.5px;color:var(--ink-3);
    font-weight:600;margin-bottom:3px;
  }
  table.au-rows td:last-child{
    display:flex!important;justify-content:flex-end;
    border-top:1px dashed var(--line-2)!important;padding-top:6px!important;margin-top:2px;
  }
  .au-stu-cell{min-width:0!important}
  .au-stu-chips{max-height:none}
  table.au-rows input,table.au-rows select{min-height:38px;font-size:14px}

  /* 排课方案网格：横向滑动查看，课程块点击可改时间 */
  .au-plan-head{gap:6px}
  .au-plan-head>div{margin-left:0!important;width:100%}
  .au-plan-head .btn{flex:1;min-height:38px}
  .au-metrics{grid-template-columns:1fr 1fr!important}
}

/* 新增学员按月统计（桌面端也要显示，原来被上面的 media 吞掉了） */
.mn-bars{display:flex;align-items:flex-end;gap:8px;height:78px;margin:2px 0 12px}
.mn-bar{flex:1;display:flex;flex-direction:column;align-items:center;justify-content:flex-end;gap:3px;height:100%}
.mn-bar b{font-size:11.5px;font-weight:650;color:var(--ink-2)}
.mn-bar i{display:block;width:100%;max-width:46px;background:var(--brand);opacity:.85;border-radius:4px 4px 0 0;min-height:3px}
.mn-bar span{font-size:10px;color:var(--ink-3);white-space:nowrap}
.mn-det td{background:#fafbfc;padding:0 10px!important}
@media(max-width:640px){
  .mn-bars{height:64px;gap:5px}
  .mn-bar span{font-size:9px}
}

/* ---------- 家长微信名占位（真实姓名待补） ---------- */
.tag-wx{
  display:inline-block;margin-left:6px;padding:1px 7px;border-radius:9px;
  font-size:10.5px;background:#fdf2e3;color:#a9661b;border:1px solid #f0dcbb;
}
.wx-check{
  display:flex;align-items:flex-start;gap:8px;margin:2px 0 10px;padding:9px 11px;
  border:1px dashed #e2c79b;background:#fdf8ef;border-radius:8px;
  font-size:12.5px;color:var(--ink-2);cursor:pointer;
}
.wx-check input{margin:2px 0 0;width:15px;height:15px;flex:0 0 auto;accent-color:var(--warn)}
.wx-pend{border-color:#f0dcbb!important;background:#fdf8ef!important}
.wx-pend .btn{background:#fff}

/* ---------- 云端健康告警条（2026-10-31） ----------
   只在「写入连续失败」或「有改动长时间传不上去」时显示，平时完全隐藏。 */
.cloud-alert{
  position:fixed;left:50%;top:10px;transform:translateX(-50%);
  z-index:9999;flex-direction:column;gap:2px;
  max-width:min(92vw,560px);padding:10px 16px;border-radius:10px;
  background:#fff1f0;border:1px solid #ffb4ab;color:#8f1d14;
  box-shadow:0 6px 20px rgba(143,29,20,.18);font-size:13px;line-height:1.5;
}
.cloud-alert b{font-size:13.5px;font-weight:700}
.cloud-alert span{font-size:12px;color:#a8483c}
@media(max-width:640px){
  .cloud-alert{top:auto;bottom:14px;left:12px;right:12px;transform:none;max-width:none}
}

/* ---------- 学生成长档案（2026-11-03） ---------- */
.pf-link{background:none;border:none;padding:0;color:var(--brand);font:inherit;cursor:pointer;text-align:left}
.pf-link:hover{text-decoration:underline}
.pf-wrap{display:flex;flex-direction:column;max-height:calc(100vh - 230px);overflow:hidden}
.pf-head{display:flex;align-items:center;gap:11px;padding:10px 12px;background:var(--brand-2);border-radius:9px;flex:0 0 auto}
.pf-name{font-size:15px;font-weight:600;display:flex;align-items:baseline;gap:8px;flex-wrap:wrap}
.pf-sub{font-size:12px;font-weight:400}
.pf-meta{font-size:12px;margin-top:2px}
.pf-sec{display:flex;align-items:center;gap:8px;margin:16px 0 8px;font-size:12px;font-weight:600;color:var(--ink-2);flex:0 0 auto}
.pf-scores{display:grid;grid-template-columns:repeat(auto-fill,minmax(150px,1fr));gap:9px;flex:0 0 auto}
.pf-sc{border:1px solid var(--line);border-radius:9px;padding:9px 11px;background:var(--panel)}
.pf-sc-t{font-size:11.5px;color:var(--ink-3)}
.pf-sc-v{font-size:19px;font-weight:600;line-height:1.25;font-variant-numeric:tabular-nums}
.pf-sc-d{font-size:11.5px;min-height:15px}
.pf-sc-n{font-size:11px;color:var(--ink-3);margin-top:2px}
.pf-tl{display:flex;flex-direction:column;gap:7px;overflow:auto;min-height:0;flex:1;padding-right:3px}
.pf-item{border:1px solid var(--line-2);border-left:3px solid var(--brand-2);border-radius:7px;padding:8px 11px;background:#fcfdfe}
.pf-h{display:flex;align-items:center;gap:8px;flex-wrap:wrap;font-size:12px}
.pf-h .btn{margin-left:auto}
.pf-tag{font-size:11px;padding:1px 6px;border-radius:4px;background:var(--brand-2);color:var(--brand)}
.pf-ex{font-size:11.5px;color:var(--warn);background:var(--warn-bg);padding:1px 6px;border-radius:4px;font-variant-numeric:tabular-nums}
.pf-b{font-size:12.5px;color:var(--ink-2);margin-top:4px;line-height:1.6}
.pf-hw{color:var(--ink-3);font-size:12px}
@media(max-width:640px){
  .pf-wrap{max-height:calc(100vh - 195px)}
  .pf-scores{grid-template-columns:repeat(auto-fill,minmax(126px,1fr))}
  .pf-head{gap:9px;padding:9px 10px}
  .pf-name{font-size:14px}
}

/* ---------- 课后点评标题排布（2026-11-03）：小屏曾把说明文字挤成竖排 ---------- */
.fb-head{flex-wrap:wrap}
.fb-head .muted{flex:1 1 140px;min-width:0}
@media(max-width:640px){
  .fb-head{gap:6px}
  .fb-head>b{flex:0 0 100%}
  .fb-head .muted{order:6;flex:1 1 100%;font-size:10.5px;line-height:1.5}
  .fb-head .spacer{display:none}
  .fb-head .btn{flex:1 1 0;min-height:34px;white-space:nowrap}
}
