/* ============================================================
   教师工作台 - 全局样式（Apple HIG 风格）
   ============================================================ */
:root{
  --bg:#f2f2f7;
  --bg2:#ffffff;
  --card:#ffffff;
  --card2:#f7f7f9;
  --text:#1c1c1e;
  --text2:#6e6e73;
  --text3:#a1a1a6;
  --sep:rgba(60,60,67,.12);
  --accent:#007aff;
  --accent-soft:rgba(0,122,255,.12);
  --green:#34c759;
  --orange:#ff9500;
  --red:#ff3b30;
  --yellow:#ffcc00;
  --purple:#af52de;
  --teal:#5ac8fa;
  --radius:14px;
  --radius-sm:10px;
  --shadow:0 2px 12px rgba(0,0,0,.06);
  --sidebar-w:230px;
  --tabbar-h:56px;
  --head-h:64px;
  --fs:15px;
  --fs-lg:17px;
  --fs-sm:13px;
}
html[data-theme="dark"]{
  --bg:#000000;
  --bg2:#1c1c1e;
  --card:#1c1c1e;
  --card2:#2c2c2e;
  --text:#f2f2f7;
  --text2:#aeaeb2;
  --text3:#636366;
  --sep:rgba(84,84,88,.4);
  --accent:#0a84ff;
  --accent-soft:rgba(10,132,255,.2);
  --green:#30d158;
  --orange:#ff9f0a;
  --red:#ff453a;
  --yellow:#ffd60a;
  --purple:#bf5af2;
  --teal:#64d2ff;
  --shadow:0 2px 12px rgba(0,0,0,.4);
}
*{box-sizing:border-box;margin:0;padding:0}
html,body{height:100%}
body{
  font-family:-apple-system,BlinkMacSystemFont,"SF Pro SC","PingFang SC","Helvetica Neue","Microsoft YaHei",sans-serif;
  background:var(--bg);color:var(--text);font-size:var(--fs);
  line-height:1.5;-webkit-font-smoothing:antialiased;
}
.hidden{display:none !important}
a{color:var(--accent);text-decoration:none}
button{font-family:inherit;cursor:pointer}
input,select,textarea{
  font-family:inherit;font-size:var(--fs);color:var(--text);
  background:var(--card2);border:1px solid var(--sep);border-radius:var(--radius-sm);
  padding:9px 12px;width:100%;outline:none;
}
input:focus,select:focus,textarea:focus{border-color:var(--accent);box-shadow:0 0 0 3px var(--accent-soft)}
input::placeholder,textarea::placeholder{color:var(--text3)}
textarea{resize:vertical;min-height:70px}
label.field{display:block;margin-bottom:12px}
label.field>span{display:block;font-size:var(--fs-sm);color:var(--text2);margin-bottom:5px;font-weight:500}
label.field>span .req{color:var(--red)}
.form-row{display:flex;gap:12px}
.form-row>.field{flex:1}
.form-actions{display:flex;gap:10px;justify-content:flex-end;margin-top:16px;flex-wrap:wrap}

/* ---------- 按钮 ---------- */
.btn{
  display:inline-flex;align-items:center;justify-content:center;gap:6px;
  border:none;border-radius:12px;padding:10px 18px;font-size:var(--fs);
  background:var(--card2);color:var(--text);transition:opacity .15s,transform .05s;
  font-weight:500;white-space:nowrap;
}
.btn:active{transform:scale(.97);opacity:.85}
.btn-primary{background:var(--accent);color:#fff}
.btn-danger{background:var(--red);color:#fff}
.btn-warn{background:var(--orange);color:#fff}
.btn-success{background:var(--green);color:#fff}
.btn-ghost{background:transparent;color:var(--accent)}
.btn-sm{padding:6px 12px;font-size:var(--fs-sm);border-radius:9px}
.btn-xs{padding:3px 9px;font-size:12px;border-radius:7px}
.btn-block{width:100%}
.btn-icon{padding:6px;border-radius:9px;font-size:16px;line-height:1}
.btn[disabled]{opacity:.4;cursor:not-allowed}
.btn-outline{background:transparent;border:1px solid var(--sep);color:var(--text)}

/* ---------- 布局 ---------- */
.sidebar{
  position:fixed;left:0;top:0;bottom:0;width:var(--sidebar-w);
  background:var(--bg2);border-right:1px solid var(--sep);
  display:flex;flex-direction:column;z-index:50;
}
.sidebar-brand{display:flex;align-items:center;gap:10px;padding:20px 18px 14px}
.brand-icon{font-size:26px}
.brand-name{font-size:18px;font-weight:700;letter-spacing:.3px}
/* 侧边栏全局搜索 */
.sidebar-search{position:relative;padding:0 12px 10px}
.sidebar-search input{
  width:100%;padding:8px 12px;border-radius:10px;border:1px solid var(--sep);
  background:var(--card2);color:var(--text);font-size:13px;outline:none;
}
.sidebar-search input:focus{border-color:var(--accent)}
.search-results{
  position:absolute;left:12px;right:12px;top:calc(100% - 4px);z-index:60;
  background:var(--bg2);border:1px solid var(--sep);border-radius:12px;
  box-shadow:0 8px 24px rgba(0,0,0,.12);max-height:320px;overflow-y:auto;
}
.search-results .sr-item{
  display:flex;align-items:center;gap:10px;padding:9px 12px;cursor:pointer;
}
.search-results .sr-item:hover{background:var(--card2)}
.search-results .sr-avatar{
  width:30px;height:30px;border-radius:50%;background:var(--accent);color:#fff;
  display:flex;align-items:center;justify-content:center;font-size:13px;flex-shrink:0;
}
.search-results .sr-name{font-weight:600;font-size:14px}
.search-results .sr-sub{font-size:12px;color:var(--text3)}
.sidebar-nav{flex:1;overflow-y:auto;padding:4px 10px}
.nav-group-title{font-size:12px;color:var(--text3);padding:16px 12px 6px;font-weight:600;letter-spacing:.5px}
.nav-item{
  display:flex;align-items:center;gap:10px;padding:9px 12px;border-radius:10px;
  color:var(--text);font-weight:500;margin-bottom:2px;
}
.nav-item:hover{background:var(--card2)}
.nav-item.active{background:var(--accent-soft);color:var(--accent)}
.nav-ico{font-size:18px;width:22px;text-align:center}
.sidebar-foot{padding:12px;border-top:1px solid var(--sep)}
.sidebar-mask{position:fixed;inset:0;background:rgba(0,0,0,.35);z-index:45}

.content{margin-left:var(--sidebar-w);min-height:100vh;display:flex;flex-direction:column}
.page-head{
  position:sticky;top:0;z-index:30;display:flex;align-items:center;gap:8px;
  padding:14px 24px;height:var(--head-h);
  background:rgba(242,242,247,.86);
  background:color-mix(in srgb, var(--bg) 78%, transparent);
  backdrop-filter:saturate(180%) blur(20px);-webkit-backdrop-filter:saturate(180%) blur(20px);
  border-bottom:1px solid transparent;
}
.page-title{font-size:26px;font-weight:800;letter-spacing:.2px;flex:1;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.page-head-right{display:flex;align-items:center;gap:8px}
.app-container{padding:18px 24px 40px;max-width:1180px;width:100%;margin:0 auto;flex:1}

/* 底部导航 */
.tabbar{
  position:fixed;left:0;right:0;bottom:0;height:calc(var(--tabbar-h) + env(safe-area-inset-bottom));
  padding-bottom:env(safe-area-inset-bottom);background:rgba(255,255,255,.88);
  background:color-mix(in srgb, var(--bg2) 85%, transparent);
  backdrop-filter:saturate(180%) blur(20px);-webkit-backdrop-filter:saturate(180%) blur(20px);
  border-top:1px solid var(--sep);display:none;z-index:40;
}
.tab-item{flex:1;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:2px;color:var(--text3);font-size:10px}
.tab-item .tab-ico{font-size:21px;line-height:1}
.tab-item.active{color:var(--accent)}
.tab-item.active .tab-ico{transform:scale(1.1)}

/* ---------- 卡片 ---------- */
.card{
  background:var(--card);border-radius:var(--radius);box-shadow:var(--shadow);
  padding:16px;margin-bottom:14px;
}
.card-head{display:flex;align-items:center;justify-content:space-between;margin-bottom:10px;gap:8px}
.card-title{font-size:16px;font-weight:700}
.card-title .sub{font-size:var(--fs-sm);color:var(--text2);font-weight:400;margin-left:6px}
.section-gap{height:18px}

/* ---------- 今日概览 ---------- */
.welcome-line{font-size:var(--fs-lg);font-weight:700;margin-bottom:4px}
.welcome-sub{color:var(--text2);font-size:var(--fs-sm);margin-bottom:14px}
.today-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(300px,1fr));gap:14px}
.stat-row{display:flex;gap:10px;flex-wrap:wrap}
.stat-pill{
  display:inline-flex;align-items:center;gap:6px;background:var(--card2);
  border-radius:20px;padding:6px 13px;font-size:var(--fs-sm);font-weight:600;
}
.stat-pill .dot{width:8px;height:8px;border-radius:50%}

/* 课表行 */
.sched-row{display:flex;align-items:center;gap:12px;padding:10px 0;border-bottom:1px solid var(--sep)}
.sched-row:last-child{border-bottom:none}
.sched-time{width:76px;flex-shrink:0;text-align:center;font-size:12px;color:var(--text2);line-height:1.3}
.sched-time b{display:block;font-size:15px;color:var(--text)}
.sched-body{flex:1;min-width:0}
.sched-name{font-weight:600}
.sched-meta{font-size:12px;color:var(--text2)}
.sched-badge{margin-left:auto;font-size:12px;padding:4px 9px;border-radius:8px;background:var(--card2);color:var(--text2);flex-shrink:0}
.sched-row.now{background:var(--accent-soft);border-radius:var(--radius-sm);padding-left:8px;padding-right:8px}
.sched-row.now .sched-name{color:var(--accent)}
.sched-row.today-past{opacity:.55}

/* ---------- 分段控件 ---------- */
.seg{display:inline-flex;background:var(--card2);border-radius:10px;padding:3px;gap:2px;flex-wrap:wrap}
.seg button{border:none;background:transparent;padding:6px 13px;border-radius:8px;font-size:var(--fs-sm);color:var(--text2);font-weight:500}
.seg button.active{background:var(--card);color:var(--text);box-shadow:0 1px 4px rgba(0,0,0,.12);font-weight:600}

/* ---------- 表格 ---------- */
.table-wrap{overflow-x:auto;-webkit-overflow-scrolling:touch}
/* 移动端课表列表模式 */
.wl-day{border:1px solid var(--sep);border-radius:12px;margin-bottom:10px;overflow:hidden}
.wl-day.today{border-color:var(--accent);box-shadow:0 0 0 1px var(--accent)}
.wl-day-head{display:flex;align-items:center;gap:6px;padding:8px 12px;background:var(--card2);font-weight:700;font-size:14px}
.wl-item{display:flex;gap:10px;padding:9px 12px;border-top:1px solid var(--sep);cursor:pointer}
.wl-item:hover{background:var(--card2)}
.wl-item.empty{border-top:1px dashed var(--sep)}
.wl-item.empty:hover{background:var(--accent-soft)}
.wl-time{width:64px;flex-shrink:0}
.wl-no{font-size:13px;font-weight:600;display:block}
.wl-course{font-weight:700;font-size:14px}
.wl-course.held{color:var(--text3);text-decoration:line-through}
.wl-main{flex:1;min-width:0}
table.tbl{width:100%;border-collapse:collapse;font-size:var(--fs-sm)}
.tbl th{text-align:left;padding:8px 10px;color:var(--text2);font-weight:600;border-bottom:1px solid var(--sep);white-space:nowrap;font-size:12px}
.tbl td{padding:9px 10px;border-bottom:1px solid var(--sep);vertical-align:middle}
.tbl tr:last-child td{border-bottom:none}
.tbl tr.clickable{cursor:pointer}
.tbl tr.clickable:hover{background:var(--card2)}

/* ---------- 徽章/标签 ---------- */
.badge{display:inline-flex;align-items:center;gap:4px;padding:2px 9px;border-radius:20px;font-size:12px;font-weight:600;white-space:nowrap}
.badge-blue{background:var(--accent-soft);color:var(--accent)}
.badge-green{background:rgba(52,199,89,.15);color:var(--green)}
.badge-red{background:rgba(255,59,48,.13);color:var(--red)}
.badge-orange{background:rgba(255,149,0,.16);color:var(--orange)}
.badge-gray{background:var(--card2);color:var(--text2)}
.badge-purple{background:rgba(175,82,222,.14);color:var(--purple)}
.tag-chip{
  display:inline-flex;align-items:center;gap:4px;background:var(--accent-soft);color:var(--accent);
  border-radius:8px;padding:3px 9px;font-size:12px;font-weight:600;cursor:pointer;
}
.tag-chip.pickable{border:1.5px solid transparent}
.tag-chip.pickable.selected{border-color:var(--accent)}

/* ---------- 待办 ---------- */
.todo-item{display:flex;align-items:flex-start;gap:12px;padding:11px 4px;border-bottom:1px solid var(--sep);transition:opacity .15s}
.todo-item:last-child{border-bottom:none}
/* 勾选框：方形圆角 checkbox 样式，未完成空框，完成后框内打勾 */
.todo-check{
  width:22px;height:22px;border-radius:7px;border:2px solid var(--text3);flex-shrink:0;margin-top:1px;
  display:flex;align-items:center;justify-content:center;color:#fff;font-size:13px;font-weight:800;cursor:pointer;
  transition:background .18s,border-color .18s,transform .1s;
}
.todo-check:active{transform:scale(.9)}
.todo-item.done .todo-check{background:var(--green);border-color:var(--green)}
/* 完成后：标题与详情均加删除线并淡化，整行弱化 */
.todo-item.done .todo-title{text-decoration:line-through;color:var(--text3)}
.todo-item.done .todo-meta{text-decoration:line-through;color:var(--text3)}
.todo-item.done{opacity:.72}
.todo-item.done .pri-dot{opacity:.35}
.todo-item.done .todo-meta .badge,.todo-item.done .badge{opacity:.6;text-decoration:none}
.todo-title{font-weight:600}
.todo-meta{font-size:12px;color:var(--text2);margin-top:2px}
.pri-dot{width:8px;height:8px;border-radius:50%;display:inline-block;flex-shrink:0;margin-top:6px}
.pri-high{background:var(--red)}
.pri-medium{background:var(--orange)}
.pri-low{background:var(--green)}

/* ---------- 日历 ---------- */
.cal-head{display:flex;align-items:center;justify-content:space-between;margin-bottom:10px}
.cal-grid{display:grid;grid-template-columns:repeat(7,1fr);gap:4px}
.cal-dow{text-align:center;font-size:11px;color:var(--text3);padding:4px 0;font-weight:600}
.cal-cell{
  min-height:64px;border-radius:10px;background:var(--card2);padding:4px;
  font-size:12px;cursor:pointer;position:relative;overflow:hidden;
}
.cal-cell:hover{background:color-mix(in srgb, var(--card2) 60%, var(--accent-soft))}
.cal-cell.other{opacity:.35}
.cal-cell.today{border:2px solid var(--accent)}
.cal-num{font-weight:700;font-size:13px}
.cal-marks{display:flex;gap:2px;flex-wrap:wrap;margin-top:3px}
.cal-mark{width:6px;height:6px;border-radius:50%}
.cal-cell .cal-count{position:absolute;top:4px;right:4px;font-size:10px;color:var(--text3)}

/* 待办周视图 */
.week-day{border:1px solid var(--sep);border-radius:12px;margin-bottom:8px;overflow:hidden}
.week-day.today{border-color:var(--accent);box-shadow:0 0 0 1px var(--accent)}
.week-day-head{display:flex;align-items:center;gap:8px;padding:8px 12px;background:var(--card2);font-size:13px}
.week-day-head .wd{font-weight:700}
.week-day-head .wd-date{color:var(--text2)}
.week-day .todo-item{padding:9px 12px}

/* ---------- 弹窗 ---------- */
.modal-mask{position:fixed;inset:0;background:rgba(0,0,0,.4);z-index:100;display:flex;align-items:center;justify-content:center;padding:16px;animation:fadeIn .18s ease}
.modal{
  background:var(--card);border-radius:20px;max-width:560px;width:100%;max-height:88vh;
  display:flex;flex-direction:column;box-shadow:0 20px 60px rgba(0,0,0,.25);animation:slideUp .22s ease;
}
.modal.large{max-width:860px}
.modal-head{display:flex;align-items:center;justify-content:space-between;padding:16px 20px 10px}
.modal-head h3{font-size:18px;font-weight:700}
.modal-body{padding:6px 20px 14px;overflow-y:auto;flex:1}
.modal-foot{padding:12px 20px 18px;display:flex;gap:10px;justify-content:flex-end;border-top:1px solid var(--sep);flex-wrap:wrap}
@keyframes fadeIn{from{opacity:0}to{opacity:1}}
@keyframes slideUp{from{transform:translateY(20px);opacity:0}to{transform:none;opacity:1}}

/* ---------- Toast ---------- */
.toast-wrap{position:fixed;top:18px;left:50%;transform:translateX(-50%);z-index:200;display:flex;flex-direction:column;gap:8px;align-items:center;pointer-events:none}
.toast{
  background:color-mix(in srgb, var(--text) 92%, transparent);color:var(--bg);
  padding:10px 18px;border-radius:22px;font-size:var(--fs-sm);font-weight:600;
  box-shadow:var(--shadow);animation:toastIn .25s ease;max-width:86vw;text-align:center;
}
.toast.err{background:var(--red);color:#fff}
@keyframes toastIn{from{opacity:0;transform:translateY(-10px)}to{opacity:1;transform:none}}

/* ---------- 提醒横幅 ---------- */
.remind-banner{
  position:fixed;top:16px;left:50%;transform:translateX(-50%);z-index:150;
  display:flex;align-items:center;gap:10px;background:var(--card);
  border-radius:16px;box-shadow:0 8px 30px rgba(0,0,0,.18);padding:12px 16px;
  border-left:4px solid var(--accent);max-width:92vw;animation:slideDown .25s ease;
}
.remind-ico{font-size:24px}
.remind-txt{font-size:var(--fs-sm);font-weight:600;max-width:60vw}
@keyframes slideDown{from{transform:translate(-50%,-14px);opacity:0}to{transform:translate(-50%,0);opacity:1}}

/* ---------- 学生 ---------- */
.student-item{display:flex;align-items:center;gap:12px;padding:11px 4px;border-bottom:1px solid var(--sep);cursor:pointer}
.student-item:last-child{border-bottom:none}
.student-item:hover{background:var(--card2)}
.avatar{
  width:40px;height:40px;border-radius:50%;background:var(--accent-soft);color:var(--accent);
  display:flex;align-items:center;justify-content:center;font-weight:700;font-size:15px;flex-shrink:0;
}
.avatar.green{background:rgba(52,199,89,.15);color:var(--green)}
.avatar.orange{background:rgba(255,149,0,.16);color:var(--orange)}
.avatar.purple{background:rgba(175,82,222,.14);color:var(--purple)}
.avatar.teal{background:rgba(90,200,250,.18);color:var(--teal)}
.student-info{flex:1;min-width:0}
.student-name{font-weight:600}
.student-sub{font-size:12px;color:var(--text2)}

/* 时间线 */
.timeline{position:relative;padding-left:20px}
.timeline::before{content:"";position:absolute;left:6px;top:4px;bottom:4px;width:2px;background:var(--sep)}
.tl-item{position:relative;padding:0 0 16px 10px}
.tl-item::before{content:"";position:absolute;left:-17px;top:6px;width:10px;height:10px;border-radius:50%;background:var(--accent);border:2px solid var(--bg)}
.tl-item.tl-red::before{background:var(--red)}
.tl-item.tl-green::before{background:var(--green)}
.tl-item.tl-orange::before{background:var(--orange)}
.tl-item.tl-purple::before{background:var(--purple)}
.tl-item.tl-gray::before{background:var(--text3)}
.tl-date{font-size:12px;color:var(--text2)}
.tl-title{font-weight:600;font-size:var(--fs-sm)}
.tl-note{font-size:var(--fs-sm);color:var(--text2)}

/* ---------- 点名 ---------- */
.attn-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(150px,1fr));gap:8px}
.attn-cell{
  display:flex;align-items:center;gap:8px;padding:9px 10px;border-radius:12px;
  background:var(--card2);cursor:pointer;border:1.5px solid transparent;user-select:none;
}
.attn-cell .nm{font-weight:600;font-size:var(--fs-sm);flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis}
.attn-cell .st{font-size:11px;color:var(--text2)}
.attn-cell.present{border-color:rgba(52,199,89,.5);background:rgba(52,199,89,.08)}
.attn-cell.late{border-color:rgba(255,149,0,.55);background:rgba(255,149,0,.1)}
.attn-cell.leave{border-color:rgba(0,122,255,.5);background:var(--accent-soft)}
.attn-cell.absent{border-color:rgba(255,59,48,.55);background:rgba(255,59,48,.09)}
.attn-cell.locked{opacity:.85;cursor:not-allowed}

/* ---------- 看板 ---------- */
.kpi-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(150px,1fr));gap:12px}
.kpi-card{background:var(--card);border-radius:var(--radius);box-shadow:var(--shadow);padding:16px;text-align:center}
.kpi-num{font-size:30px;font-weight:800;line-height:1.2}
.kpi-label{font-size:12px;color:var(--text2);margin-top:4px}
.chart-box{width:100%;overflow:hidden}
.chart-box svg{display:block;width:100%}

/* ---------- 快捷入口 ---------- */
.quick-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(96px,1fr));gap:10px}
.quick-item{
  display:flex;flex-direction:column;align-items:center;gap:8px;padding:14px 6px;
  background:var(--card);border-radius:var(--radius);box-shadow:var(--shadow);cursor:pointer;
  font-size:12px;font-weight:600;color:var(--text);text-align:center;
}
.quick-item:hover{background:var(--card2)}
.quick-ico{font-size:26px}

/* ---------- 图片附件 ---------- */
.img-grid{display:flex;gap:8px;flex-wrap:wrap}
.img-thumb{width:80px;height:80px;border-radius:10px;object-fit:cover;cursor:pointer;border:1px solid var(--sep)}
.img-preview-mask{position:fixed;inset:0;background:rgba(0,0,0,.85);z-index:250;display:flex;align-items:center;justify-content:center;padding:20px}
.img-preview-mask img{max-width:94vw;max-height:88vh;border-radius:12px}

/* ---------- 空状态 ---------- */
.empty{padding:44px 16px;text-align:center;color:var(--text3)}
.empty .empty-ico{font-size:44px;margin-bottom:10px}
.empty p{font-size:var(--fs-sm)}

/* ---------- 班级工作台 tab ---------- */
.sub-tabs{display:flex;gap:2px;background:var(--card2);border-radius:12px;padding:4px;overflow-x:auto;margin-bottom:14px}
.sub-tabs button{
  border:none;background:transparent;padding:8px 16px;border-radius:9px;font-size:var(--fs-sm);
  color:var(--text2);font-weight:600;white-space:nowrap;
}
.sub-tabs button.active{background:var(--card);color:var(--accent);box-shadow:0 1px 4px rgba(0,0,0,.12)}

/* 列表组 */
.list-group{background:var(--card);border-radius:var(--radius);box-shadow:var(--shadow);overflow:hidden;margin-bottom:14px}
.list-group .li{display:flex;align-items:center;gap:10px;padding:12px 16px;border-bottom:1px solid var(--sep);cursor:pointer}
.list-group .li:last-child{border-bottom:none}
.list-group .li:hover{background:var(--card2)}
.list-group .li .li-main{flex:1;min-width:0}
.list-group .li .li-title{font-weight:600}
.list-group .li .li-sub{font-size:12px;color:var(--text2)}

/* 搜索条 */
.search-bar{position:relative;margin-bottom:12px}
.search-bar input{padding-left:36px}
.search-bar::before{content:"🔍";position:absolute;left:12px;top:50%;transform:translateY(-50%);font-size:14px;opacity:.6}

/* 筛选工具条 */
.toolbar{display:flex;gap:8px;align-items:center;flex-wrap:wrap;margin-bottom:12px}

/* 详情头部 */
.detail-head{display:flex;align-items:center;gap:14px;margin-bottom:16px}
.detail-head .avatar{width:56px;height:56px;font-size:22px}
.detail-name{font-size:22px;font-weight:800}
.detail-sub{font-size:var(--fs-sm);color:var(--text2)}

/* 打印 */
@media print{
  .sidebar,.tabbar,.page-head,.btn,.remind-banner,.toast-wrap,.modal-mask{display:none !important}
  .content{margin-left:0}
  .app-container{padding:0;max-width:none}
  body{background:#fff}
  .card{box-shadow:none;border:1px solid #ddd;break-inside:avoid}
}

/* ---------- 响应式 ---------- */
@media (max-width:1023px){
  .sidebar{transform:translateX(-100%);transition:transform .25s ease;box-shadow:none}
  .sidebar.open{transform:none;box-shadow:0 0 40px rgba(0,0,0,.2)}
  .content{margin-left:0}
  .tabbar{display:flex}
  .app-container{padding:14px 14px calc(var(--tabbar-h) + 30px)}
  .page-head{padding:10px 14px}
  .page-title{font-size:22px}
  .mobile-only{display:inline-flex !important}
}
.mobile-only{display:none}

/* 深色模式下系统输入控件颜色修正 */
html[data-theme="dark"] input[type="date"],html[data-theme="dark"] input[type="time"],html[data-theme="dark"] select{color-scheme:dark}

/* 滚动条 */
::-webkit-scrollbar{width:8px;height:8px}
::-webkit-scrollbar-thumb{background:var(--text3);border-radius:4px}
::-webkit-scrollbar-track{background:transparent}

/* 工具类 */
.mt8{margin-top:8px}.mt12{margin-top:12px}.mt16{margin-top:16px}.mt24{margin-top:24px}
.mb8{margin-bottom:8px}.mb12{margin-bottom:12px}.mb16{margin-bottom:16px}
.flex{display:flex;align-items:center;gap:8px}
.flex-between{display:flex;align-items:center;justify-content:space-between;gap:8px}
.text2{color:var(--text2)}.text3{color:var(--text3)}
.sm{font-size:var(--fs-sm)}.xs{font-size:12px}
.bold{font-weight:700}
.right{text-align:right}.center{text-align:center}
.wrap{flex-wrap:wrap}
.grow{flex:1;min-width:0}
.ellipsis{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}

/* ============================================================
   布局优化 v2：组件大小与排列统一
   ============================================================ */
/* 工具栏按钮统一高度与间距，避免大小不一 */
.toolbar{display:flex;align-items:center;flex-wrap:wrap;gap:10px;margin-bottom:14px}
.toolbar .btn-sm,.toolbar .btn{padding-top:7px;padding-bottom:7px}
/* 表单双列在小屏自动换行 */
.form-row{flex-wrap:wrap}
@media (max-width:640px){
  .form-row{flex-direction:column}
  .form-row>.field{width:100%}
}
/* 卡片标题统一 */
.card-head{margin-bottom:12px}
.card-title{font-size:16px}
.card-title .sub{font-size:12px}
/* 首页双列卡片：12 列网格，组件可自定义大小比例 */
.today-grid{display:grid;grid-template-columns:repeat(12,1fr);gap:16px}
/* 首页固定高度卡片：高度统一固定，内容溢出时内部滚动，保证排列整齐 */
.home-card{
  background:var(--card);border-radius:var(--radius);box-shadow:var(--shadow);
  display:flex;flex-direction:column;height:360px;overflow:hidden;position:relative;
  color:var(--text);
}
.home-card-head{display:flex;align-items:center;justify-content:space-between;gap:8px;padding:14px 16px 10px;flex-shrink:0}
.home-card-title{font-size:16px;font-weight:700;display:flex;align-items:center;gap:8px;flex-wrap:wrap;min-width:0}
.home-card-title .sub{font-size:12px;color:var(--text2);font-weight:400}
.home-card-body{flex:1;overflow-y:auto;padding:2px 16px 12px;-webkit-overflow-scrolling:touch}
.home-card-body .empty{padding:28px 8px}
.home-card-more{flex-shrink:0;text-align:center;padding:8px 0 12px;border-top:1px solid var(--sep);background:var(--card)}
.home-card-more button{font-size:13px}
@media (max-width:1023px){.home-card{height:330px}}

/* ---------- 首页小组件：尺寸 / 背景 / 字体 / 圆角 / 拖拽 ---------- */
.hc-wrap{position:relative;min-width:0}
.hc-size-compact{grid-column:span 4}
.hc-size-std{grid-column:span 6}
.hc-size-wide{grid-column:span 12}
.hc-size-full{grid-column:span 12}
/* 拖拽 */
.hc-wrap.dragging{opacity:.45}
.hc-wrap.drag-over .home-card{box-shadow:0 0 0 2px var(--accent)}
.hc-grip{
  cursor:grab;color:var(--text3);font-size:14px;letter-spacing:-2px;user-select:none;
  padding:0 2px;border-radius:6px;flex-shrink:0;
}
.hc-grip:hover{color:var(--text2)}
.hc-grip:active{cursor:grabbing}
/* 设置按钮 */
.hc-gear{
  border:none;background:transparent;cursor:pointer;font-size:14px;line-height:1;
  padding:4px;border-radius:8px;color:var(--text3);flex-shrink:0;opacity:.5;transition:opacity .2s;
}
.hc-gear:hover{opacity:1;background:var(--card2)}
.hc-actions{display:flex;align-items:center;gap:6px;flex-shrink:0}
/* 尺寸自适应：小屏一律整行 */
@media (max-width:900px){
  .hc-size-compact,.hc-size-std,.hc-size-wide,.hc-size-full{grid-column:span 12}
}
/* 字体档位（作用于卡片内容） */
.hc-fs-sm .home-card-body,.hc-fs-sm .home-card-more{font-size:12.5px}
.hc-fs-md .home-card-body,.hc-fs-md .home-card-more{font-size:14px}
.hc-fs-lg .home-card-body,.hc-fs-lg .home-card-more{font-size:16px}
.hc-fs-sm .home-card-title{font-size:15px}
.hc-fs-lg .home-card-title{font-size:18px}
/* 圆角档位 */
.hc-r-sm .home-card{border-radius:8px}
.hc-r-md .home-card{border-radius:16px}
.hc-r-lg .home-card{border-radius:26px}
/* 背景：纯色预设（rgb 由内联 --hc-rgb 提供，透明度 --hc-opacity） */
.hc-bg-none .home-card{background:var(--card)}
.hc-bg-blue .home-card{background:rgba(var(--hc-rgb,232,241,255),var(--hc-opacity,1))}
.hc-bg-green .home-card{background:rgba(var(--hc-rgb,230,247,238),var(--hc-opacity,1))}
.hc-bg-orange .home-card{background:rgba(var(--hc-rgb,255,244,229),var(--hc-opacity,1))}
.hc-bg-purple .home-card{background:rgba(var(--hc-rgb,243,235,255),var(--hc-opacity,1))}
.hc-bg-red .home-card{background:rgba(var(--hc-rgb,255,236,236),var(--hc-opacity,1))}
.hc-bg-dark .home-card{background:rgba(var(--hc-rgb,44,44,46),var(--hc-opacity,1));color:#f2f2f7}
.hc-bg-dark .home-card .text2,.hc-bg-dark .home-card .text3{color:rgba(255,255,255,.66)}
.hc-bg-dark .home-card-more{border-top-color:rgba(255,255,255,.12);background:transparent}
.hc-bg-dark .sched-row,.hc-bg-dark .todo-item,.hc-bg-dark .up-item{border-color:rgba(255,255,255,.12)}
.hc-bg-dark .sched-row:hover,.hc-bg-dark .todo-item:hover,.hc-bg-dark .up-item:hover{background:rgba(255,255,255,.08)}
/* 背景：渐变预设（--hc-g1 / --hc-g2 / --hc-deg） */
.hc-grad-blue .home-card{background:linear-gradient(var(--hc-deg,135deg),rgba(var(--hc-g1,79,172,254),var(--hc-opacity,1)),rgba(var(--hc-g2,0,242,254),var(--hc-opacity,1)))}
.hc-grad-purple .home-card{background:linear-gradient(var(--hc-deg,135deg),rgba(var(--hc-g1,162,140,209),var(--hc-opacity,1)),rgba(var(--hc-g2,251,194,235),var(--hc-opacity,1)))}
.hc-grad-sunset .home-card{background:linear-gradient(var(--hc-deg,135deg),rgba(var(--hc-g1,248,54,0),var(--hc-opacity,1)),rgba(var(--hc-g2,249,212,35),var(--hc-opacity,1)))}
.hc-grad-mint .home-card{background:linear-gradient(var(--hc-deg,135deg),rgba(var(--hc-g1,17,153,142),var(--hc-opacity,1)),rgba(var(--hc-g2,56,239,125),var(--hc-opacity,1)))}
.hc-grad-night .home-card{background:linear-gradient(var(--hc-deg,135deg),rgba(var(--hc-g1,35,37,38),var(--hc-opacity,1)),rgba(var(--hc-g2,65,67,69),var(--hc-opacity,1)));color:#f2f2f7}
.hc-grad-night .home-card .text2,.hc-grad-night .home-card .text3{color:rgba(255,255,255,.66)}
.hc-grad-night .home-card-more{border-top-color:rgba(255,255,255,.12);background:transparent}
.hc-grad-night .sched-row,.hc-grad-night .todo-item,.hc-grad-night .up-item{border-color:rgba(255,255,255,.12)}
.hc-grad-night .sched-row:hover,.hc-grad-night .todo-item:hover,.hc-grad-night .up-item:hover{background:rgba(255,255,255,.08)}
/* 渐变卡片头部标题颜色微调 */
.hc-grad-blue .home-card-title,.hc-grad-mint .home-card-title,.hc-grad-sunset .home-card-title{color:#1c1c1e}
.hc-grad-purple .home-card-title{color:#3b2b5a}
/* 下节课组件 */
.hc-next{display:flex;flex-direction:column;align-items:center;justify-content:center;text-align:center;padding:8px 4px;gap:6px}
.hc-next .nx-tag{font-size:12px;letter-spacing:1px;font-weight:700}
.hc-next .nx-name{font-size:26px;font-weight:800;line-height:1.25}
.hc-next .nx-sub{font-size:13px;color:var(--text2)}
.hc-next .nx-count{font-size:40px;font-weight:900;line-height:1;letter-spacing:1px}
.hc-next .nx-count em{font-style:normal;font-size:15px;font-weight:600;margin-left:4px}
.hc-next .nx-time{font-size:13px;color:var(--text2)}
.hc-next .nx-line{width:72px;height:3px;border-radius:2px;background:var(--accent);margin:2px 0 4px}
/* 组件设置弹窗 */
.hc-set-head{font-size:14px;font-weight:700;margin:14px 0 8px}
.hc-set-head:first-child{margin-top:0}
.hc-swatches{display:grid;grid-template-columns:repeat(6,1fr);gap:8px;margin-bottom:14px}
.hc-swatch{height:34px;border-radius:10px;cursor:pointer;border:2px solid transparent;padding:0}
.hc-swatch.on{border-color:var(--accent);box-shadow:0 0 0 2px var(--accent-soft)}
.hc-opt{margin-bottom:14px}
.hc-opt-name{font-size:13px;font-weight:600;margin-bottom:6px;color:var(--text2)}
.hc-opt-seg{width:100%}
.hc-opt-seg button{flex:1}
.hc-preview{padding:12px;border:1px dashed var(--sep);border-radius:12px;background:var(--card2)}
.hc-preview-card{padding:14px 16px;box-shadow:var(--shadow);transition:all .25s ease}
/* 近期事项行 */
.up-item{display:flex;align-items:center;gap:10px;padding:9px 2px;border-bottom:1px solid var(--sep);cursor:pointer}
.up-item:last-child{border-bottom:none}
.up-item:hover{background:var(--card2)}
.up-date{width:58px;flex-shrink:0;text-align:center;font-size:11px;color:var(--text2);line-height:1.25}
.up-date b{display:block;font-size:14px;color:var(--text)}
.up-item .up-title{flex:1;min-width:0;font-weight:600;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
/* 首页课表行信息层级 */
.sched-time{width:84px}
.sched-row{gap:12px;padding:11px 2px}
.sched-name{font-size:15px}
.sched-meta{font-size:12px}
/* 通用学生网格卡片（点名/表现/作业/成绩共用） */
.stu-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(148px,1fr));gap:10px}
.stu-cell{
  display:flex;flex-direction:column;gap:6px;padding:10px 12px;border-radius:12px;
  background:var(--card2);border:1.5px solid var(--sep);cursor:pointer;user-select:none;
  transition:border-color .15s,background .15s;
}
.stu-cell:hover{border-color:var(--text3)}
.stu-cell .sc-top{display:flex;align-items:center;justify-content:space-between;gap:6px}
.stu-cell .sc-name{font-weight:700;font-size:14px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.stu-cell .sc-no{font-size:11px;color:var(--text3)}
.stu-cell .sc-body{display:flex;align-items:center;gap:6px;min-width:0}
.stu-cell .sc-body select,.stu-cell .sc-body input{
  padding:5px 8px;font-size:12.5px;border-radius:8px;min-width:0;
}
.stu-cell .sc-tag{display:inline-flex;align-items:center;gap:4px;padding:2px 8px;border-radius:8px;font-size:12px;font-weight:600}
.stu-cell .sc-note{font-size:11.5px;color:var(--text2);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
/* 选中态 */
.stu-cell.selected{border-color:var(--accent);background:var(--accent-soft)}
/* 已录入态（表现） */
.stu-cell.has-perf{border-color:var(--green);background:rgba(52,199,89,.07)}
/* 点名校验类（兼容 attn-grid 原有） */
.attn-cell{min-height:44px;transition:border-color .15s,background .15s}
.attn-cell:hover{border-color:var(--text3)}
/* 作业/成绩网格卡片内的输入控件 */
.stu-cell select,.stu-cell input{background:var(--card);border:1px solid var(--sep)}
/* 表现标签选择区 */
.tag-pick{display:flex;flex-wrap:wrap;gap:8px}
.tag-chip{padding:5px 12px}
/* 底部水印 */
.app-footer{
  padding:18px 24px 30px;text-align:center;font-size:12px;color:var(--text3);
  letter-spacing:.3px;opacity:.85;
}
@media (max-width:1023px){
  .app-footer{padding-bottom:calc(20px + env(safe-area-inset-bottom));}
}
/* 弹窗内表单控件宽度约束，避免无限拉伸 */
.modal-body .field input,.modal-body .field select{max-width:100%}
/* 空状态间距 */
.empty{padding:38px 16px}
/* KPI 卡片统一 */
.kpi-card{padding:14px 12px}
.kpi-num{font-size:26px}
/* 快捷入口间距 */
.quick-grid{gap:12px}
.quick-item{padding:16px 6px}
/* 侧边栏分组间距 */
.nav-group-title{padding:18px 12px 6px}
/* 底部导航图标层级 */
.tab-item .tab-ico{font-size:20px}
/* 详情页头部与卡片间距 */
.detail-head{margin-bottom:18px}
