/* ============ 设计变量：深海蓝 + 薄荷绿 ============ */
:root{
  --deep-blue:#0b3d5c;
  --deep-blue-2:#103d5e;
  --mint:#3ddc97;
  --mint-soft:#2ec4b6;
  --bg:#eef4f8;
  --bg-grad:linear-gradient(135deg,#dff1ea 0%,#e7eef6 45%,#dfeaf4 100%);
  --card:rgba(255,255,255,0.62);
  --card-border:rgba(255,255,255,0.85);
  --text:#103047;
  --text-soft:#5b7286;
  --shadow:0 8px 30px rgba(16,61,94,0.12);
  --radius:18px;
  --danger:#ef6f6f;
  --warn:#f6c45a;
  --good:#3ddc97;
  --bad:#ef6f6f;
  --mid:#f6c45a;
}
/* ============ 深色主题 ============ */
body[data-theme="dark"]{
  --deep-blue:#7fd3ff;
  --deep-blue-2:#1c4a66;
  --mint:#3ddc97;
  --mint-soft:#2ec4b6;
  --bg:#0c1f30;
  --bg-grad:linear-gradient(135deg,#0e2235 0%,#123047 50%,#0e2235 100%);
  --card:rgba(28,52,74,0.55);
  --card-border:rgba(127,211,255,0.18);
  --text:#e8f1f7;
  --text-soft:#9fb6c6;
  --shadow:0 8px 30px rgba(0,0,0,0.45);
  --danger:#ff8a8a;
  --warn:#f6c45a;
  --good:#3ddc97;
  --bad:#ff8a8a;
  --mid:#f6c45a;
}
*{box-sizing:border-box;margin:0;padding:0;-webkit-tap-highlight-color:transparent;}
/* 全局去除链接默认下划线（登录页 login-link、管理端 uc-logout、注册验证码刷新按钮等
   仍保留各自 :hover 下划线，因其选择器优先级更高会覆盖此处） */
a{text-decoration:none;color:inherit;}
a:hover{text-decoration:none;}
html,body{height:100%;}
body{
  font-family:-apple-system,BlinkMacSystemFont,"Segoe UI","PingFang SC","Microsoft YaHei",sans-serif;
  color:var(--text);
  background:var(--bg-grad);
  background-attachment:fixed;
  overflow:hidden;
}
#app{display:flex;height:100vh;width:100vw;}

/* ============ 玻璃拟态通用 ============ */
.glass{
  background:var(--card);
  backdrop-filter:blur(18px) saturate(160%);
  -webkit-backdrop-filter:blur(18px) saturate(160%);
  border:1px solid var(--card-border);
  box-shadow:var(--shadow);
  border-radius:var(--radius);
}
.card{background:var(--card);backdrop-filter:blur(16px);-webkit-backdrop-filter:blur(16px);
  border:1px solid var(--card-border);box-shadow:var(--shadow);border-radius:var(--radius);padding:18px;}

/* ============ 侧边栏（PC） ============ */
.sidebar{
  width:240px;flex:none;display:flex;flex-direction:column;gap:14px;
  padding:20px 16px;background:rgba(11,61,92,0.10);backdrop-filter:blur(20px);
  border-right:1px solid rgba(255,255,255,0.5);
}
.brand{display:flex;align-items:center;gap:12px;padding:6px 8px;}
.brand-logo{width:42px;height:42px;border-radius:12px;display:grid;place-items:center;
  font-size:24px;font-weight:800;color:#fff;background:linear-gradient(135deg,var(--deep-blue),var(--mint-soft));}
.brand-name{font-weight:800;font-size:17px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:100%;}
/* 需求17：班级名称（"班级管家"下方）过长时用...省略，且不撑大父级窗体 */
.brand-text{min-width:0;overflow:hidden;}
.brand-sub{font-size:12px;color:var(--text-soft);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:100%;}
.class-switch-row{display:flex;gap:6px;align-items:center;padding:0 8px 8px;}
.class-switch{flex:1;min-width:0;padding:8px 8px;border-radius:10px;border:1px solid rgba(11,61,92,0.22);
  background:rgba(255,255,255,0.6);color:var(--deep-blue);font-weight:700;font-size:13px;cursor:pointer;}
.icon-btn{flex:none;width:32px;height:32px;border-radius:10px;border:1px solid rgba(11,61,92,0.22);
  background:rgba(255,255,255,0.6);color:var(--deep-blue);font-weight:800;font-size:15px;cursor:pointer;line-height:1;transition:.15s;}
.icon-btn:hover{background:rgba(61,220,151,0.22);}
body[data-theme="dark"] .class-switch,body[data-theme="dark"] .icon-btn{background:rgba(11,40,60,0.5);color:#cfe6f5;border-color:rgba(127,211,255,0.3);}
.side-nav{display:flex;flex-direction:column;gap:4px;margin-top:6px;flex:1;overflow:auto;}
.nav-item{display:flex;align-items:center;gap:12px;padding:11px 14px;border-radius:12px;
  cursor:pointer;color:var(--text);font-size:14px;font-weight:600;transition:.18s;border:1px solid transparent;}
.nav-item:hover{background:rgba(61,220,151,0.16);}
.nav-item.active{background:linear-gradient(135deg,rgba(11,61,92,0.9),rgba(46,196,182,0.85));color:#fff;animation:navPop .3s cubic-bezier(.22,.9,.3,1);}
  box-shadow:0 6px 18px rgba(11,61,94,0.25);}
.nav-item .ico{font-size:18px;width:22px;text-align:center;}
.side-foot{display:flex;flex-direction:column;gap:8px;}
.ghost-btn{width:100%;padding:10px;border-radius:12px;border:1px solid rgba(11,61,92,0.25);
  background:rgba(255,255,255,0.5);color:var(--deep-blue);font-weight:700;cursor:pointer;font-size:13px;transition:.15s;}
.ghost-btn:hover{background:rgba(61,220,151,0.22);}
.ghost-btn.danger{color:var(--danger);border-color:rgba(239,111,111,0.4);}

/* ============ 主区 ============ */
.main{flex:1;display:flex;flex-direction:column;min-width:0;}
.topbar{height:60px;flex:none;display:flex;align-items:center;gap:14px;padding:0 22px;
  background:rgba(255,255,255,0.45);backdrop-filter:blur(14px);border-bottom:1px solid rgba(255,255,255,0.6);}
.topbar-title{font-size:18px;font-weight:800;}
.menu-toggle{display:none;border:none;background:transparent;font-size:22px;cursor:pointer;color:var(--deep-blue);}
.topbar-actions{margin-left:auto;display:flex;align-items:center;gap:10px;}
.net-badge{font-size:12px;color:#0b8f6a;background:rgba(61,220,151,0.18);padding:5px 10px;border-radius:20px;font-weight:700;}
/* 右上角状态栏：本地已同步 / 北京时间 / 天气 / 温度 */
.stat-badge{font-size:12px;color:#3a4a63;background:rgba(55,138,221,0.12);padding:5px 10px;border-radius:20px;font-weight:600;display:inline-flex;align-items:center;gap:5px;white-space:nowrap;}
.stat-badge .ico{font-size:13px;line-height:1;}
.stat-badge b{font-variant-numeric:tabular-nums;font-weight:700;letter-spacing:.3px;}
@media (max-width:600px){ .stat-badge#statWeather,.stat-badge#statTemp{display:none;} }
/* 开关（云同步：数据变动自动上报） */
.switch{position:relative;display:inline-block;width:42px;height:24px;flex:none;}
.switch input{opacity:0;width:0;height:0;}
.switch .slider{position:absolute;cursor:pointer;inset:0;background:#cdd6e4;border-radius:24px;transition:.2s;}
.switch .slider:before{content:"";position:absolute;height:18px;width:18px;left:3px;top:3px;background:#fff;border-radius:50%;transition:.2s;box-shadow:0 1px 3px rgba(0,0,0,.25);}
.switch input:checked + .slider{background:var(--good);}
.switch input:checked + .slider:before{transform:translateX(18px);}
.switch-line{align-items:center;}
.switch-row{display:flex;align-items:center;justify-content:space-between;gap:12px;cursor:pointer;user-select:none;padding:6px 0;}
.switch .knob{position:absolute;top:3px;left:3px;width:18px;height:18px;border-radius:50%;background:#fff;transition:.2s;box-shadow:0 1px 3px rgba(0,0,0,.3);}
.switch.on{background:linear-gradient(135deg,#3ddc97,#2bb37a);}
.switch.on .knob{left:21px;}
/* 顶栏固定操作按钮：云同步一次 / 加载云同步 */
.top-btn{font-size:12px;color:#3a4a63;background:rgba(55,138,221,0.14);border:1px solid rgba(55,138,221,0.35);padding:5px 10px;border-radius:20px;font-weight:600;cursor:pointer;white-space:nowrap;transition:.15s;}
.top-btn:hover{background:rgba(55,138,221,0.24);}
.top-btn:disabled{opacity:.55;cursor:default;}
body[data-theme="dark"] .top-btn{color:#bcd2f0;background:rgba(55,138,221,0.2);border-color:rgba(55,138,221,0.4);}
.content{flex:1;overflow:auto;padding:22px;transition:opacity .22s ease, transform .22s ease;}
/* 模块切换过渡：离开态淡出+轻微下移缩，进入态从隐藏态淡入上移（配合 JS 的 animateIn） */
.content.page-leaving{opacity:0;transform:translateY(10px) scale(.992);}
.content.page-entering{opacity:0;transform:translateY(14px);}

/* ============ 网格布局 ============ */
.grid{display:grid;gap:16px;}
.grid-2{grid-template-columns:repeat(2,1fr);}
/* 设置页：用多列（masonry）流式布局，卡片按自身高度排列并自动填列，避免同行高差造成的底部大块空白 */
.settings-grid{display:block;column-count:2;column-gap:16px;align-items:initial;}
.settings-grid > .card{break-inside:avoid;width:100%;margin:0 0 16px;}
@media(max-width:1024px){.settings-grid{column-count:1;}}
/* 设置页 · 云同步备份列表 */
.test-log{flex:1;min-width:0;width:100%;height:69px;overflow:hidden;padding:6px 12px;border-radius:8px;font-size:13px;line-height:1.4;white-space:pre-wrap;word-break:break-word;box-sizing:border-box;background:rgba(61,125,216,.05);border:1px solid rgba(61,125,216,.25);user-select:none;}
.cloud-list{max-height:280px;overflow:auto;margin-top:8px;border:1px solid #e3e8ef;border-radius:10px;padding:6px;background:rgba(255,255,255,.4);}
.cloud-item{display:flex;align-items:center;gap:10px;padding:8px 10px;border-radius:8px;cursor:pointer;border:1px solid transparent;transition:background .15s,border-color .15s;}
.cloud-item:hover{background:rgba(59,125,216,.06);}
.cloud-item.sel{border-color:var(--deep-blue,#3b7dd8);background:rgba(59,125,216,.1);}
.cloud-item .ci-main{flex:1;min-width:0;}
.cloud-item .ci-name{font-weight:700;display:flex;align-items:center;gap:6px;flex-wrap:wrap;}
.cloud-item .ci-meta{font-size:12px;color:#8a94a6;margin-top:2px;}
.cloud-item .ci-acts{display:flex;gap:6px;flex-shrink:0;flex-wrap:wrap;justify-content:flex-end;}
.cloud-item .auto-tag{font-size:11px;color:#0b8f6a;background:rgba(15,143,106,.12);padding:1px 6px;border-radius:8px;font-weight:700;}
@media (prefers-color-scheme: dark){.cloud-list{border-color:rgba(255,255,255,.12);background:rgba(255,255,255,.04);}.cloud-item .ci-meta{color:#9fb6c6;}}
.grid-3{grid-template-columns:repeat(3,1fr);}
.grid-4{grid-template-columns:repeat(4,1fr);}
.span-2{grid-column:span 2;}
/* ============ 模块排列顺序 ============ */
.mod-row{display:flex;align-items:center;gap:12px;padding:9px 12px;border:1px solid var(--card-border);border-radius:12px;margin-bottom:8px;background:var(--card);}
.mod-idx{width:26px;height:26px;flex:0 0 26px;border-radius:50%;background:var(--deep-blue);color:#fff;display:flex;align-items:center;justify-content:center;font-size:12px;font-weight:700;}
body[data-theme="dark"] .mod-idx{background:var(--deep-blue-2);}
.mod-ico{font-size:18px;width:24px;text-align:center;}
.mod-name{flex:1;font-weight:600;}
.mod-btns{display:flex;gap:6px;flex:0 0 auto;}
@media(max-width:1024px){.grid-2,.grid-3,.grid-4{grid-template-columns:1fr;}.span-2{grid-column:span 1;}}

/* 顶部指标卡 */
.stat-grid{display:grid;grid-template-columns:repeat(4,1fr);gap:14px;margin-bottom:16px;}
@media(max-width:768px){.stat-grid{grid-template-columns:repeat(2,1fr);}}
.stat{display:flex;flex-direction:column;gap:4px;}
.stat .num{font-size:28px;font-weight:800;color:var(--deep-blue);}
.stat[style*="cursor:pointer"]{transition:transform .15s ease,box-shadow .15s ease;}
.stat[style*="cursor:pointer"]:hover{transform:translateY(-3px);box-shadow:0 8px 22px rgba(11,61,92,0.16);border-color:var(--mint);}
.stat .lbl{font-size:12px;color:var(--text-soft);}
.stat .ic{font-size:18px;}
.todo-mini-text{font-size:13px;font-weight:600;color:var(--deep-blue);line-height:1.45;}
.todo-mini-text b{color:#c8741a;font-size:15px;margin:0 2px;}
#gotoTodos{justify-content:center;}

/* ============ 图表容器 ============ */
.chart{width:100%;height:300px;}
.chart-sm{height:240px;}

/* ============ 悬浮按钮 ============ */
.float-btn{position:fixed;right:26px;bottom:26px;width:60px;height:60px;border-radius:50%;border:none;
  font-size:30px;color:#fff;background:linear-gradient(135deg,var(--deep-blue),var(--mint-soft));
  box-shadow:0 10px 26px rgba(11,61,94,0.4);cursor:pointer;z-index:60;transition:.18s;line-height:1;}
.float-btn:hover{transform:scale(1.07) rotate(90deg);}
@media(max-width:768px){.float-btn{bottom:78px;}}

/* ============ 底部 Tab（移动端） ============ */
.bottom-tab{display:none;}
@media(max-width:768px){
  .sidebar{position:fixed;left:0;top:0;bottom:0;z-index:80;transform:translateX(-100%);transition:.25s;
    background:rgba(238,244,248,0.92);width:220px;}
  .sidebar.open{transform:translateX(0);}
  .menu-toggle{display:block;}
  .bottom-tab{display:flex;position:fixed;bottom:0;left:0;right:0;z-index:70;
    background:rgba(255,255,255,0.7);backdrop-filter:blur(18px);border-top:1px solid rgba(255,255,255,0.7);}
  .bottom-tab .nav-item{flex:1;flex-direction:column;gap:3px;font-size:11px;padding:8px 4px;border-radius:0;}
  .bottom-tab .nav-item .ico{font-size:20px;}
  .content{padding-bottom:78px;}
}

/* ============ 表格 ============ */
table.tbl{width:100%;border-collapse:collapse;font-size:13px;background:transparent;}
.tbl th,.tbl td{padding:9px 10px;text-align:left;border-bottom:1px solid rgba(11,61,92,0.08);}
.sch-cell{position:relative;min-height:30px;padding:6px 4px;text-align:center;color:var(--text);white-space:pre-wrap;word-break:break-word;}
/* 课表就地编辑输入框：绝对定位铺满单元格，脱离文档流，避免获得焦点后撑开单元格导致界面布局跳动 */
.sch-cell .sch-edit-inp{position:absolute;inset:0;width:100%;height:100%;box-sizing:border-box;margin:0;padding:2px 4px;border:1px solid var(--mint);border-radius:6px;background:var(--card,#fff);color:var(--text);text-align:center;font-size:13px;outline:none;z-index:2;}
body[data-theme="dark"] .sch-cell .sch-edit-inp{background:rgba(12,31,48,0.96);}
/* 课表：表头、节次列、单元格内容统一居中 + 编辑态高亮 */
.tbl.sch-tbl th,.tbl.sch-tbl td{text-align:center;vertical-align:middle;}
/* 课表固定列宽（table-layout:fixed），单元格内容字数增减时不再引起列宽/整表横向重排；内容超出自动换行 */
.tbl.sch-tbl{table-layout:fixed;width:100%;min-width:760px;}
.tbl.sch-tbl th:first-child,.tbl.sch-tbl td:first-child{width:88px;}
.tbl.sch-tbl .sch-cell{overflow:hidden;}
.sch-cell.sch-editable{cursor:pointer;border-radius:8px;background:rgba(61,220,151,0.10);box-shadow:inset 0 0 0 1px rgba(11,61,92,0.08);}
.sch-cell.sch-editable:hover{background:rgba(61,220,151,0.22);}
.tbl th{background:rgba(255,255,255,0.96);color:var(--deep-blue);font-weight:700;position:sticky;top:0;z-index:3;box-shadow:0 2px 6px rgba(16,61,94,0.12);}
.tbl tr:hover{background:rgba(61,220,151,0.10);}
.tbl input,.tbl select{border:1px solid rgba(11,61,92,0.2);border-radius:8px;padding:5px 7px;width:100%;font-size:13px;}
.tbl .editable{cursor:text;}
/* 成绩管理：可排序表头 / 编辑态行 / 操作列 */
.tbl th.sortable{cursor:pointer;user-select:none;white-space:nowrap;}
.tbl th.sortable:hover{color:var(--mint-soft);}
.tbl tr.editing{background:rgba(61,220,151,0.14);}
.tbl input.fld.in{width:96px;padding:4px 6px;font-size:12px;margin:0;}
.tbl td.acts,.tbl th.acts{white-space:nowrap;text-align:center;}
/* 成绩管理：编辑态固定列宽，键入/字数变化不再引发布局跳动（参照需求97 课表修复） */
.tbl.score-tbl{table-layout:fixed;width:100%;min-width:920px;}
.tbl.score-tbl th,.tbl.score-tbl td{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;}
.tbl.score-tbl td.acts{overflow:visible;}
.tbl.score-tbl input.fld.in,.tbl.score-tbl select.fld.in{width:100%;box-sizing:border-box;padding:4px 6px;margin:0;}
/* 成绩管理：序号列 + 紧凑单行统计 */
.tbl.score-tbl th.seq-col,.tbl.score-tbl td.seq-col{width:52px;min-width:52px;max-width:52px;text-align:center;color:var(--text-soft);font-weight:600;}
.score-stat-line{font-size:13px;padding:8px 12px;background:rgba(11,61,92,0.05);border-radius:10px;color:var(--text-soft);}
.tbl td.acts .btn{margin:0 2px;}

/* ============ 表单控件 ============ */
input.fld,select.fld,textarea.fld{width:100%;padding:10px 12px;border-radius:12px;border:1px solid rgba(11,61,92,0.2);
  background:rgba(255,255,255,0.7);font-size:14px;color:var(--text);outline:none;}
input.fld:focus,select.fld:focus,textarea.fld:focus{border-color:var(--mint);box-shadow:0 0 0 3px rgba(61,220,151,0.18);}
.btn{padding:10px 16px;border-radius:12px;border:none;cursor:pointer;font-weight:700;font-size:14px;transition:.15s;}
.btn.primary{background:linear-gradient(135deg,var(--deep-blue),var(--mint-soft));color:#fff;}
.btn.primary:hover{filter:brightness(1.06);}
.btn.mint{background:rgba(61,220,151,0.22);color:var(--deep-blue);}
.btn.mint:hover{background:rgba(61,220,151,0.34);}
.btn.plain{background:rgba(255,255,255,0.6);color:var(--deep-blue);border:1px solid rgba(11,61,92,0.2);}
.btn.danger{background:linear-gradient(135deg,#ef6f6f,#d64545);color:#fff;}
.btn.danger:hover{filter:brightness(1.06);}
.btn.sm{padding:6px 11px;font-size:12px;}
/* 按钮交互微动：悬浮轻微上浮、按压回弹，提升点击手感 */
.btn{will-change:transform;}
.btn:hover{transform:translateY(-1px);}
.btn:active{transform:translateY(1px) scale(.97);transition-duration:.08s;}
.row{display:flex;gap:10px;flex-wrap:wrap;align-items:center;}
.mt{margin-top:14px;}.mb{margin-bottom:14px;}
.section-title{font-size:15px;font-weight:800;color:var(--deep-blue);margin:6px 0 12px;display:flex;align-items:center;gap:8px;}

/* ============ 标签 / 优先级 ============ */
.tag{display:inline-block;padding:2px 9px;border-radius:20px;font-size:11px;font-weight:700;}
.tag.high{background:rgba(239,111,111,0.18);color:#c0392b;}
.tag.mid{background:rgba(246,196,90,0.22);color:#9a6b00;}
.tag.low{background:rgba(61,220,151,0.20);color:#0b8f6a;}
.pill{display:inline-block;padding:3px 10px;border-radius:20px;font-size:12px;font-weight:700;background:rgba(11,61,92,0.08);color:var(--deep-blue);}

/* ============ 学生列表 / 头像 ============ */
.stu-list{display:grid;grid-template-columns:repeat(auto-fill,minmax(120px,1fr));gap:10px;}
.stu-chip{display:flex;align-items:center;gap:10px;padding:10px;border-radius:14px;cursor:pointer;
  background:rgba(255,255,255,0.6);border:1px solid rgba(255,255,255,0.7);transition:.15s;}
.stu-chip:hover{background:rgba(61,220,151,0.16);transform:translateY(-2px);}
.avatar{width:38px;height:38px;border-radius:50%;display:grid;place-items:center;color:#fff;font-weight:800;font-size:14px;flex:none;}
/* 真实头像（<img>）：填满圆形，避免拉伸露出空白；列表/快捷检索/档案共用 */
img.avatar{object-fit:cover;background:rgba(11,61,92,0.06);}
.avatar.good{background:linear-gradient(135deg,#3ddc97,#2ec4b6);}
.avatar.mid{background:linear-gradient(135deg,#f6c45a,#f0a500);}
.avatar.bad{background:linear-gradient(135deg,#ef6f6f,#d64545);}
.stu-chip .nm{font-weight:700;font-size:13px;}
.stu-chip .sc{font-size:11px;color:var(--text-soft);}
/* 学生档案列表：一行固定 10 个，按比例扩展为较大的竖向卡片（班级概况快捷检索仍用默认 .stu-list 布局） */
.stu-grid10{display:grid;grid-template-columns:repeat(10,1fr);gap:12px;}
.stu-grid10 .stu-chip{flex-direction:column;align-items:center;text-align:center;justify-content:center;padding:12px 6px;gap:8px;border-radius:14px;min-height:96px;}
.stu-grid10 .stu-chip .nm{font-size:14px;margin-top:2px;}
.stu-grid10 .stu-chip .sc{font-size:11px;}
.todo-jump{display:flex;flex-direction:row;align-items:center;justify-content:space-between;gap:10px;padding:9px 12px;border-radius:12px;cursor:pointer;background:var(--card);border:1px solid var(--card-border);transition:.15s;}
.todo-jump:hover{background:rgba(61,220,151,0.16);transform:translateY(-1px);box-shadow:0 3px 12px rgba(11,61,94,0.10);}
.todo-jump .nm{flex:1;min-width:0;font-size:13px;font-weight:600;color:var(--text);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;}
.todo-jump .sc{flex:none;font-size:11px;color:var(--text-soft);white-space:nowrap;background:var(--card-soft);padding:2px 8px;border-radius:999px;}
.todo-mini-head{padding:8px 12px;border-radius:12px;background:linear-gradient(135deg,rgba(255,179,71,0.16),rgba(61,220,151,0.14));border:1px solid var(--card-border);font-size:13px;color:var(--text);}
.todo-mini-head b{color:#c8741a;font-size:15px;margin:0 2px;}
.hist-row:hover{background:rgba(61,220,151,0.10);border-radius:10px;}

/* ============ 时间线 ============ */
.timeline{position:relative;padding-left:18px;}
.timeline::before{content:"";position:absolute;left:5px;top:4px;bottom:4px;width:2px;background:rgba(11,61,92,0.18);}
.tl-item{position:relative;margin-bottom:14px;}
.tl-item::before{content:"";position:absolute;left:-16px;top:5px;width:10px;height:10px;border-radius:50%;
  background:var(--mint);box-shadow:0 0 0 3px rgba(61,220,151,0.25);}
.tl-date{font-size:12px;color:var(--text-soft);font-weight:700;}

/* ============ 座位网格 ============ */
.seat-board{display:grid;grid-template-columns:30px repeat(2,minmax(72px,1fr)) 22px repeat(3,minmax(72px,1fr)) 22px repeat(2,minmax(72px,1fr)) 30px;grid-template-rows:28px repeat(7,auto);gap:8px;align-items:stretch;padding:14px;background:rgba(255,255,255,0.4);border-radius:18px;max-width:880px;}
.seat-marker{font-size:11px;font-weight:700;color:var(--text-soft);background:rgba(11,61,92,0.07);border:1px dashed rgba(11,61,92,0.25);border-radius:9px;padding:4px 6px;display:inline-flex;align-items:center;justify-content:center;gap:3px;white-space:nowrap;justify-self:center;align-self:center;}
.seat-marker.win,.seat-marker.door{writing-mode:vertical-rl;line-height:1.15;letter-spacing:1px;}
.seat-marker.win{border-color:rgba(59,125,216,0.55);color:var(--deep-blue);}
.seat-marker.door{border-color:rgba(214,73,126,0.55);color:#d6497e;}
.seat-marker.podium{border-color:rgba(47,158,107,0.55);color:#2f9e6b;}
.seat-aisle{width:3px;height:100%;align-self:stretch;justify-self:center;border-radius:3px;background:repeating-linear-gradient(180deg,rgba(11,61,92,0.28) 0 6px,transparent 6px 12px);}
.seat-cell{position:relative;border-radius:14px;padding:12px 6px 10px;min-height:62px;display:flex;flex-direction:column;justify-content:center;align-items:center;text-align:center;gap:4px;font-weight:700;cursor:pointer;user-select:none;background:var(--gc,#ddd);border:2px solid rgba(255,255,255,0.55);box-shadow:0 4px 12px rgba(0,0,0,0.08);transition:.12s;color:#fff;}
.seat-cell:hover{transform:translateY(-2px);box-shadow:0 8px 18px rgba(0,0,0,0.16);}
.seat-name{min-height:20px;line-height:1.2;font-size:15px;}
.seat-name .ph{font-size:12px;font-weight:500;opacity:.75;}
.seat-cell.empty-cell{background:transparent;border:none;box-shadow:none;cursor:default;}
.seat-cell.empty-cell:hover{transform:none;}
.seat-cell.drag-over{outline:3px solid #fff;border-color:#fff;transform:scale(1.04);}
.seat-grp{font-size:11px;opacity:.9;font-weight:700;}
.seat-name{font-size:15px;}
.seat-name .ph{font-size:12px;font-weight:500;opacity:.75;}
.seat-x{position:absolute;top:3px;right:5px;border:none;background:rgba(0,0,0,0.28);color:#fff;border-radius:50%;width:18px;height:18px;line-height:16px;font-size:13px;cursor:pointer;padding:0;}

/* ===== 智能编排 ======================== */
.wt-grid{display:grid;grid-template-columns:repeat(3,minmax(160px,1fr));gap:10px 18px;}
.wt-row{display:flex;align-items:center;gap:10px;font-size:13px;}
.wt-name{width:44px;font-weight:700;color:var(--text-soft);}
.wt-row input[type=range]{flex:1;accent-color:var(--deep-blue);}
.wtv{width:44px;text-align:right;font-variant-numeric:tabular-nums;color:var(--deep-blue);font-weight:700;}
.fld.sm{padding:5px 8px;font-size:12px;min-width:120px;}
.btn.sm{padding:5px 10px;font-size:12px;}
.ban-del{color:var(--bad);margin-left:2px;text-decoration:none;font-weight:700;}
.gs-wrap{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:12px;}
@media (max-width:860px){.gs-wrap{grid-template-columns:repeat(2,minmax(0,1fr));}}
.gs-group{background:rgba(255,255,255,0.65);border:1px solid rgba(11,61,92,0.12);border-radius:14px;padding:10px 12px;}
.gs-group.bl{background:rgba(31,31,36,0.07);border-color:rgba(31,31,36,0.2);}
.gs-title{font-size:13px;font-weight:800;margin-bottom:6px;color:var(--deep-blue);}
.gs-group.bl .gs-title{color:var(--text);}
.gs-row{display:flex;align-items:center;gap:8px;font-size:13px;padding:3px 0;border-top:1px dashed rgba(11,61,92,0.1);}
.gs-row:first-of-type{border-top:none;}
.gs-head{display:flex;align-items:center;gap:8px;padding:4px 10px;font-size:11px;font-weight:700;color:var(--text-soft);background:rgba(11,61,92,0.04);border-radius:8px 8px 0 0;margin-bottom:2px;}
.gs-rank{width:20px;height:20px;line-height:20px;text-align:center;background:rgba(59,125,216,0.15);border-radius:50%;font-size:11px;font-weight:700;color:var(--deep-blue);flex:none;}
.gs-name{flex:1;font-weight:600;}
.gs-gender{font-size:11px;color:var(--text-soft);width:34px;flex:none;}
.gs-seat{display:none;}
.gs-score{font-variant-numeric:tabular-nums;font-weight:700;color:var(--good);min-width:52px;flex:none;text-align:right;}
/* ============ AI 家长沟通建议总结 ============ */
.ai-para{margin:0 0 12px;}
.ai-para:last-child{margin-bottom:0;}
.ai-para b{color:var(--deep-blue);}
.ai-modes{display:flex;align-items:center;gap:6px;flex-wrap:wrap;}
.ai-modes .muted{margin-right:2px;}
.seat-x:hover{background:rgba(0,0,0,0.55);}
.seat-layout{display:flex;gap:18px;flex-wrap:wrap;align-items:flex-start;margin-top:14px;}
.roster{width:240px;max-width:100%;}
.roster-list{display:flex;flex-direction:column;gap:6px;max-height:540px;overflow:auto;margin-top:8px;}
.roster-chip{display:flex;justify-content:space-between;align-items:center;gap:8px;padding:8px 10px;border-radius:10px;background:rgba(255,255,255,0.72);border:1px solid rgba(11,61,92,0.12);cursor:grab;font-size:13px;transition:.12s;}
.roster-chip.placed{opacity:.55;}
.roster-chip.picked{outline:2px solid var(--deep-blue);background:rgba(59,125,216,0.16);}
.roster-chip .rc-seat{font-size:11px;color:var(--text-soft);}
.group-cfg{display:flex;flex-wrap:wrap;gap:10px 18px;}
.grp-row{display:flex;align-items:center;gap:8px;font-size:13px;}
.grp-dot{width:16px;height:16px;border-radius:50%;display:inline-block;border:1px solid rgba(0,0,0,0.15);}
.bl-badge{font-size:11px;background:rgba(31,31,36,0.92);color:#fff;padding:1px 6px;border-radius:8px;margin-left:4px;}
.seat-pop{position:fixed;z-index:120;background:#fff;padding:12px;border-radius:12px;box-shadow:0 12px 30px rgba(0,0,0,0.2);width:240px;display:none;}
.seat-pop.show{display:block;}
.sp-title{font-size:13px;font-weight:700;margin-bottom:8px;}

/* ============ 模态框 ============ */
.modal-mask{position:fixed;inset:0;background:rgba(11,61,94,0.28);backdrop-filter:blur(4px);
  display:none;align-items:center;justify-content:center;z-index:90;padding:16px;}
.modal-mask.show{display:flex;animation:maskIn .2s ease;}
.modal-mask.show .modal{animation:modalIn .28s cubic-bezier(.22,.9,.3,1);}
/* 默认头像选择器：独立遮罩层，必须盖在「新增/编辑」表单弹窗之上 */
.avatar-picker-mask{z-index:100;}
.modal{width:min(560px,94vw);max-height:88vh;overflow:auto;padding:0;}
.modal-head{display:flex;justify-content:space-between;align-items:center;padding:16px 20px;
  border-bottom:1px solid rgba(11,61,92,0.1);font-weight:800;position:sticky;top:0;}
.modal-close{border:none;background:transparent;font-size:24px;cursor:pointer;color:var(--text-soft);line-height:1;}
.modal-body{padding:20px;}
/* ============ 同桌限制弹窗 ============ */
.ban-list{max-height:46vh;overflow:auto;display:flex;flex-direction:column;gap:8px;}
.ban-item{display:flex;align-items:center;justify-content:space-between;gap:10px;padding:9px 12px;border:1px solid var(--card-border);border-radius:12px;background:var(--card);}
.ban-pair{font-weight:600;}
.ban-pair b{color:var(--bad);margin:0 2px;}

/* ============ Toast ============ */
.toast{position:fixed;left:50%;bottom:90px;transform:translateX(-50%) translateY(20px);
  background:rgba(11,61,94,0.92);color:#fff;padding:11px 20px;border-radius:24px;font-size:13px;font-weight:600;
  opacity:0;pointer-events:none;transition:.25s;z-index:99;max-width:80vw;text-align:center;}
.toast.show{opacity:1;transform:translateX(-50%) translateY(0);}

/* ============ 杂项 ============ */
.muted{color:var(--text-soft);font-size:12px;}
.empty-hint{padding:30px;text-align:center;color:var(--text-soft);}
.scroll-x{overflow-x:auto;}
.fld-wrap{display:flex;flex-direction:column;gap:4px;font-size:12px;color:var(--text-soft);}
.kpi-row{display:flex;gap:18px;flex-wrap:wrap;}
.kpi{background:rgba(11,61,92,0.05);border-radius:12px;padding:8px 14px;}
.kpi b{color:var(--deep-blue);font-size:18px;}
/* 学生档案：各科最近成绩网格 */
.subj-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(120px,1fr));gap:8px;margin-top:6px;}
.subj-cell{background:rgba(11,61,92,0.05);border-radius:12px;padding:8px 10px;display:flex;flex-direction:column;gap:2px;border-left:3px solid var(--mint);}
.subj-cell.grade{border-left-color:#f6c45a;}
.subj-cell .sn{font-size:11px;color:var(--text-soft);}
.subj-cell b{font-size:15px;color:var(--deep-blue);}
.subj-cell i{font-size:11px;color:var(--text-soft);font-style:normal;}

/* ============ 自定义确认弹窗（替代浏览器原生 confirm） ============ */
.cf-mask{position:fixed;inset:0;background:rgba(11,61,94,0.34);backdrop-filter:blur(4px);
  display:none;align-items:center;justify-content:center;z-index:120;padding:16px;}
.cf-mask.show{display:flex;animation:maskIn .2s ease;}
.cf-mask.show .cf-box{animation:modalIn .26s cubic-bezier(.22,.9,.3,1);}
.cf-box{width:min(420px,92vw);padding:22px;border-radius:18px;background:rgba(255,255,255,0.92);
  backdrop-filter:blur(18px);box-shadow:0 16px 50px rgba(11,61,94,0.28);border:1px solid rgba(255,255,255,0.9);}
.cf-title{font-size:16px;font-weight:800;color:var(--deep-blue);display:flex;align-items:center;gap:8px;margin-bottom:10px;}
.cf-msg{font-size:13px;line-height:1.7;color:var(--text);white-space:pre-wrap;margin-bottom:18px;}
.cf-actions{display:flex;gap:10px;justify-content:flex-end;}

/* ============ 成绩管理：学科类别 / 学科 两级 Tab ============ */
.cat-tabs{display:flex;gap:8px;flex-wrap:wrap;margin-bottom:10px;}
.cat-tab{padding:8px 14px;border-radius:12px;cursor:pointer;font-weight:700;font-size:13px;
  background:rgba(255,255,255,0.55);border:1px solid rgba(11,61,92,0.15);color:var(--text-soft);transition:.15s;}
.cat-tab:hover{background:rgba(61,220,151,0.16);}
.cat-tab.active{background:linear-gradient(135deg,var(--deep-blue),var(--mint-soft));color:#fff;border-color:transparent;
  box-shadow:0 6px 16px rgba(11,61,94,0.2);}
.subj-tabs{display:flex;gap:6px;flex-wrap:wrap;margin-bottom:14px;}
.subj-tab{padding:6px 13px;border-radius:20px;cursor:pointer;font-weight:700;font-size:12.5px;
  background:rgba(11,61,92,0.06);border:1px solid transparent;color:var(--deep-blue);transition:.15s;}
.subj-tab:hover{background:rgba(61,220,151,0.18);}
.subj-tab.active{background:rgba(61,220,151,0.28);border-color:rgba(61,220,151,0.6);color:var(--deep-blue);}
.subj-tab.grade{color:#9a6b00;background:rgba(246,196,90,0.14);}
.subj-tab.grade.active{background:rgba(246,196,90,0.32);border-color:rgba(246,196,90,0.7);}

/* ============ 考勤页 ============ */
.att-grid{display:grid;grid-template-columns:repeat(6,minmax(0,1fr));gap:8px;margin-top:8px;}
@media(max-width:1100px){.att-grid{grid-template-columns:repeat(4,minmax(0,1fr));}}
@media(max-width:768px){.att-grid{grid-template-columns:repeat(2,minmax(0,1fr));}}
.att-cell{display:flex;flex-direction:column;align-items:flex-start;justify-content:center;gap:6px;padding:10px 12px;border-radius:12px;
  background:rgba(255,255,255,0.6);border:1px solid rgba(255,255,255,0.7);font-size:13px;cursor:pointer;transition:.12s;}
.att-cell:hover{background:rgba(61,220,151,0.16);transform:translateY(-2px);box-shadow:0 4px 14px rgba(11,61,94,0.12);}
.att-cell.is-absent{border-color:rgba(239,111,111,0.4);background:rgba(239,111,111,0.08);}
.att-cell .nm{font-weight:700;font-size:14px;}
.att-cell .row{width:100%;justify-content:space-between;}
.att-dot{width:9px;height:9px;border-radius:50%;flex:none;}
.att-dot.absent{background:var(--bad);}
.att-dot.late{background:var(--warn);}
.att-dot.ok{background:var(--good);}
.att-status-pill{font-size:11px;font-weight:700;padding:2px 8px;border-radius:20px;background:rgba(11,61,92,0.08);}
.att-status-pill.is-absent{background:rgba(239,111,111,0.18);color:#c0392b;}
/* 考勤卡片：原因右置、省略号、卡片高度稳定 */
.att-cell{min-height:64px;}
.att-line2{display:flex;width:100%;align-items:center;gap:6px;}
.att-reason{flex:1;min-width:0;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;font-size:11px;color:var(--text-soft);}
.legend{display:flex;gap:14px;font-size:12px;color:var(--text-soft);flex-wrap:wrap;}
.legend i{display:inline-block;width:10px;height:10px;border-radius:3px;margin-right:5px;vertical-align:middle;}
.cal-grid{display:grid;grid-template-columns:repeat(7,1fr);gap:6px;}
.cal-cell{border-radius:10px;min-height:62px;padding:6px;background:rgba(255,255,255,0.55);font-size:11px;cursor:pointer;border:1px solid transparent;display:flex;flex-direction:column;justify-content:space-between;gap:4px;}
.cal-top{display:flex;align-items:flex-start;justify-content:space-between;}
.cal-badges{display:flex;flex-wrap:wrap;gap:3px;align-items:flex-end;}
.cal-note{display:inline-block;max-width:100%;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;font-size:10px;padding:1px 5px;border-radius:6px;background:rgba(61,220,151,0.22);color:#0b8f6a;font-weight:600;}
.cal-work{display:inline-block;font-size:10px;padding:1px 5px;border-radius:6px;background:rgba(224,83,63,0.16);color:#e0533f;font-weight:700;}
.cal-cell:hover{border-color:var(--mint);}
.cal-cell.we{background:rgba(46,93,148,0.16);}
.cal-cell.we .d{color:#1f4e79;}
body[data-theme="dark"] .cal-cell.we{background:rgba(127,211,255,0.15);}
.cal-cell.has{background:rgba(61,220,151,0.18);}
.cal-cell .d{font-weight:800;color:var(--deep-blue);text-align:center;}
.cal-cell.today{background:rgba(255,179,71,0.22);border:1.5px solid var(--mint);box-shadow:0 0 0 2px rgba(255,179,71,0.25);}
.cal-cell.today .d{color:#c8741a;}
.cal-cell.today .today-badge{display:inline-block;margin-left:4px;padding:0 5px;border-radius:8px;background:linear-gradient(135deg,#ffb347,#ff8c42);color:#fff;font-size:10px;font-weight:700;line-height:15px;vertical-align:middle;}
body[data-theme="dark"] .cal-cell.today{background:rgba(255,179,71,0.18);}
body[data-theme="dark"] .cal-cell.today .d{color:#ffc06b;}
.cal-cell .nt{color:#0b8f6a;margin-top:2px;line-height:1.25;}
/* 调休上班日：整格标红区分（需求59） */
.cal-cell.workday{background:rgba(224,83,63,0.14);box-shadow:inset 0 0 0 1px rgba(224,83,63,0.4);}
.cal-cell.workday .d{color:#e0533f;}
.cal-cell.workday .nt{color:#e0533f;font-weight:700;}
.cal-head{display:grid;grid-template-columns:repeat(7,1fr);gap:6px;font-weight:800;color:var(--deep-blue);font-size:12px;margin-bottom:4px;text-align:center;}

/* ============ 设置页 ============ */
.lbl-w{min-width:72px;display:inline-block;color:var(--text-soft);font-size:14px;}
.row .fld{flex:1;}
.theme-list{display:flex;flex-direction:column;gap:10px;margin-top:6px;}
.theme-opt{display:flex;align-items:center;gap:12px;padding:12px;border:1px solid var(--card-border);border-radius:14px;cursor:pointer;background:var(--card);transition:.15s;}
.theme-opt:hover{border-color:var(--mint);}
.theme-opt.active{border-color:var(--mint);box-shadow:0 0 0 3px rgba(61,220,151,0.25);}
.theme-swatch{width:46px;height:46px;border-radius:12px;flex:none;box-shadow:inset 0 0 0 1px rgba(0,0,0,0.08);}
.theme-meta{display:flex;flex-direction:column;gap:2px;}
.theme-meta b{color:var(--text);font-size:14px;}
.theme-meta .muted{font-size:12px;}
/* 深色模式下部分固定色块需反色保证可读性 */
body[data-theme="dark"] .net-badge{color:#7fe9c4;background:rgba(61,220,151,0.16);}
body[data-theme="dark"] .stat-badge{color:#bcd2f0;background:rgba(55,138,221,0.18);}
body[data-theme="dark"] .brand-logo{color:#0c1f30;}
body[data-theme="dark"] .ghost-btn{background:rgba(127,211,255,0.10);color:var(--deep-blue);}
body[data-theme="dark"] .tbl th{background:rgba(18,40,58,0.97);color:var(--deep-blue);}
body[data-theme="dark"] .nav-item:hover{background:rgba(127,211,255,0.14);}
body[data-theme="dark"] .cal-cell{background:rgba(127,211,255,0.08);}
body[data-theme="dark"] .cal-cell .d,body[data-theme="dark"] .cal-head{color:var(--deep-blue);}
body[data-theme="dark"] input.fld,body[data-theme="dark"] select.fld,body[data-theme="dark"] textarea.fld{background:rgba(12,31,48,0.6);color:var(--text);border-color:rgba(127,211,255,0.2);}
body[data-theme="dark"] .btn.plain{background:rgba(127,211,255,0.12);color:var(--deep-blue);border-color:rgba(127,211,255,0.25);}

/* ============ 教师档案 / 任课教师可点击 ============ */
.teacher-chip{cursor:pointer;transition:.15s;}
.teacher-chip:hover{background:rgba(61,220,151,0.16);box-shadow:0 0 0 2px rgba(61,220,151,0.25);}
.teacher-profile{display:flex;gap:18px;align-items:flex-start;flex-wrap:wrap;}
.teacher-profile .avatar.big{width:300px;height:300px;font-size:120px;flex:none;border-radius:18px;}
.tp-info{flex:1;min-width:220px;}
.tp-name{font-size:20px;font-weight:800;color:var(--text);display:flex;align-items:center;gap:8px;margin-bottom:2px;}
.tp-row{display:flex;gap:12px;padding:7px 0;border-bottom:1px solid var(--card-border);font-size:14px;}
.tp-row span{color:var(--text-soft);min-width:72px;}
.tp-row b{color:var(--text);font-weight:600;}
/* 仅看未出勤勾选框高亮 */
.only-absent{padding:5px 10px;border-radius:10px;background:rgba(239,111,111,0.10);border:1px solid rgba(239,111,111,0.25);color:var(--text);font-size:13px;user-select:none;}
.only-absent:hover{background:rgba(239,111,111,0.18);}

/* ============ 头像（上传图片 / 默认随机首字母） ============ */
img.avatar{object-fit:cover;overflow:hidden;}
/* 默认内置头像选择面板 */
.preset-grid{display:grid;grid-template-columns:repeat(4,1fr);gap:10px;margin-top:6px}
.preset-av{width:100%;aspect-ratio:1/1;cursor:pointer;border-radius:14px;overflow:hidden;background:#f3f6fb;transition:transform .12s ease,box-shadow .12s ease,border-color .12s ease;border:2px solid transparent}
.preset-av svg{width:100%;height:100%;display:block}
.preset-av:hover{transform:translateY(-2px);box-shadow:0 4px 14px rgba(0,0,0,.15);border-color:#2f80ed}
.preset-av:active{transform:translateY(0)}
/* 云端备份列表标题右侧：本次云备份次数累计 */
.bk-count{margin-left:auto;display:inline-flex;align-items:center;gap:5px;font-size:12px;font-weight:600;color:var(--text-soft);background:rgba(47,128,237,.10);border:1px solid rgba(47,128,237,.22);padding:3px 10px;border-radius:999px;white-space:nowrap}
.bk-count b{font-size:14px;font-weight:800;color:#2f80ed;font-variant-numeric:tabular-nums}
.avatar.big{width:300px;height:300px;font-size:120px;}

/* ============ 教师档案（列表 + 档案 合并） ============ */
.teacher-layout{display:grid;grid-template-columns:300px 1fr;gap:16px;align-items:start;}
.teacher-list{display:flex;flex-direction:column;gap:8px;max-height:64vh;overflow:auto;padding-right:4px;}
.teacher-card{display:flex;align-items:center;gap:10px;padding:10px;border-radius:14px;cursor:pointer;background:var(--card);border:1px solid var(--card-border);transition:.15s;}
.teacher-card:hover{background:rgba(61,220,151,0.14);transform:translateY(-1px);}
.teacher-card.active{border-color:var(--mint);box-shadow:0 0 0 3px rgba(61,220,151,0.30);}
.teacher-card .avatar{width:42px;height:42px;font-size:16px;}
.tc-info{flex:1;min-width:0;}
.tc-name{font-weight:700;font-size:14px;color:var(--text);}
.tc-subj{font-size:12px;color:var(--text-soft);}
.teacher-detail{background:var(--card);border:1px solid var(--card-border);border-radius:16px;padding:18px;min-height:200px;}
@media (max-width:760px){.teacher-layout{grid-template-columns:1fr;}.teacher-list{max-height:none;}}

/* ============ 学生档案头像行 ============ */
.student-head{display:flex;align-items:flex-start;gap:16px;margin-bottom:12px;flex-wrap:wrap;}
.student-head .avatar.big{width:300px;height:300px;flex:none;}
.sh-info{flex:1;min-width:160px;}
.st-actions{margin-top:12px;}

/* ============ 基础信息网格（学生/教师档案共用） ============ */
.info-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(150px,1fr));gap:10px 16px;}
.info-item{display:flex;flex-direction:column;gap:3px;background:rgba(11,61,92,0.04);border:1px solid var(--card-border);border-radius:12px;padding:9px 12px;}
.info-item .lbl{font-size:12px;color:var(--text-soft);}
.info-item b{font-size:15px;color:var(--text);font-weight:600;word-break:break-all;line-height:1.5;}

/* ============ 积分模块（结算卡片） ============ */
.settle-card{border:1px solid rgba(11,61,94,.1);border-radius:12px;padding:10px 12px;margin-bottom:10px;background:rgba(255,255,255,.45);}
.settle-card-h{font-weight:600;color:#0b3d5e;margin-bottom:6px;font-size:13px;}
.settle-card .row{font-size:13px;}

/* ============ 鼠标特效（设置页控件） ============ */
.fx-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(96px,1fr));gap:8px;}
.fx-chip{position:relative;display:flex;flex-direction:column;align-items:center;gap:3px;padding:10px 6px;border-radius:12px;cursor:pointer;
  background:rgba(255,255,255,0.6);border:1px solid rgba(11,61,92,0.15);font-size:12px;font-weight:600;color:var(--deep-blue);transition:.15s;text-align:center;}
.fx-chip .fx-ico{font-size:18px;line-height:1;}
.fx-chip:hover{transform:translateY(-1px);border-color:rgba(61,220,151,0.5);}
.fx-chip.active{border-color:var(--mint);box-shadow:0 0 0 3px rgba(61,220,151,0.25);background:rgba(61,220,151,0.16);}
.fx-chip .fx-badge{position:absolute;top:-7px;right:-6px;background:var(--mint);color:#063;font-size:10px;padding:1px 5px;border-radius:8px;font-weight:700;}
body[data-theme="dark"] .fx-chip{background:rgba(255,255,255,0.08);color:var(--text);border-color:rgba(127,211,255,0.18);}

/* ============ 全局过渡动画（需求101：界面切换衔接 / 交互手感） ============ */
/* 浮层遮罩淡入 */
@keyframes maskIn{from{opacity:0;}to{opacity:1;}}
/* 浮层卡片缩放进入 */
@keyframes modalIn{from{opacity:0;transform:translateY(16px) scale(.96);}to{opacity:1;transform:none;}}
/* 左侧导航激活项脉冲 */
@keyframes navPop{0%{transform:translateX(-4px) scale(.96);opacity:.82;}60%{transform:translateX(1px) scale(1.02);}100%{transform:none;opacity:1;}}
/* 卡片入场：上移淡入 */
@keyframes cardIn{from{opacity:0;transform:translateY(14px);}to{opacity:1;transform:none;}}
/* 顶部标题切换淡入 */
@keyframes titleIn{from{opacity:0;transform:translateX(-8px);}to{opacity:1;transform:none;}}

/* 卡片随模块切换/页面重渲染统一上移淡入（轻微、短促，强化层级感） */
.card{animation:cardIn .32s cubic-bezier(.22,.9,.3,1) both;}
/* 顶部标题切换动画 */
.topbar-title.title-in{animation:titleIn .3s ease;}

/* ============ 切换班级「等待浮层」（需求：切换期间禁止操作 + 转圈 + 已等待时长 + 5分钟超时判定失败） ============ */
@keyframes swSpin{to{transform:rotate(360deg);}}
@keyframes swFadeIn{from{opacity:0;}to{opacity:1;}}
/* 全屏遮罩：z-index 高于登录层(200)，确保切换期间任何位置都不可点击 */
.switch-wait-mask{position:fixed;inset:0;z-index:210;display:flex;align-items:center;justify-content:center;
  background:rgba(8,26,41,.55);backdrop-filter:blur(3px);animation:swFadeIn .18s ease both;}
.switch-wait-box{min-width:min(320px,86vw);max-width:90vw;padding:26px 28px;border-radius:16px;text-align:center;
  background:var(--card-bg,rgba(255,255,255,.97));box-shadow:0 18px 54px rgba(0,0,0,.32);animation:modalIn .24s cubic-bezier(.22,.9,.3,1) both;}
/* 转圈：外圈旋转 + 内圈反向，形成质感 spinner */
.switch-wait-spin{width:46px;height:46px;margin:0 auto 14px;border-radius:50%;
  border:4px solid rgba(61,220,151,.22);border-top-color:var(--mint,#3ddc97);animation:swSpin .8s linear infinite;}
.switch-wait-title{font-size:15px;font-weight:800;color:var(--deep-blue,#0b3d5e);}
.switch-wait-sub{margin-top:6px;font-size:12.5px;color:var(--text-soft,#5b6b78);line-height:1.6;}
.switch-wait-time{margin-top:10px;font-size:13px;font-weight:700;color:var(--mint,#0fa3a3);font-variant-numeric:tabular-nums;}
.switch-wait-hint{margin-top:8px;font-size:11.5px;color:var(--text-soft,#5b6b78);opacity:.85;}
/* 超时临界（>4分30秒）时把等待时长标红警示 */
.switch-wait-time.danger{color:#e5533d;}

/* 尊重「减少动态效果」系统偏好：关闭自定义动画与过渡 */
@media (prefers-reduced-motion: reduce){
  .content,.card,.nav-item,.modal-mask.show,.modal,.cf-mask.show,.cf-box,.btn,.topbar-title{animation:none!important;transition:none!important;}
  .switch-wait-mask,.switch-wait-box{animation:none!important;}
  .switch-wait-spin{animation:swSpin 1.6s linear infinite!important;} /* 降低转速而非完全静止，保留「进行中」语义 */
}

/* ============ 登录界面（需求202：首次打开需登录，F5 不重登） ============ */
.login-screen{position:fixed;inset:0;z-index:200;display:none;align-items:center;justify-content:center;
  background:linear-gradient(135deg,#0e2235,#16324a 55%,#0b3d5e);}
.login-screen.show{display:flex;animation:maskIn .2s ease;}
.login-box{width:min(380px,92vw);background:var(--card-bg,rgba(255,255,255,.96));backdrop-filter:blur(8px);
  border-radius:18px;padding:26px 24px;box-shadow:0 18px 60px rgba(0,0,0,.35);animation:modalIn .28s cubic-bezier(.22,.9,.3,1) both;}
.login-logo{width:54px;height:54px;border-radius:16px;margin:0 auto 8px;display:flex;align-items:center;justify-content:center;
  font-size:30px;font-weight:800;color:#fff;background:linear-gradient(135deg,#3ddc97,#0fa3a3);box-shadow:0 8px 22px rgba(61,220,151,.4);}
.login-name{text-align:center;font-size:20px;font-weight:800;color:var(--deep-blue,#0b3d5e);}
.login-sub{text-align:center;font-size:12.5px;color:var(--text-soft,#5b6b78);margin:4px 0 18px;}
.login-row{display:flex;align-items:center;gap:10px;margin-bottom:10px;}
.login-row .lbl-w{flex:0 0 84px;text-align:right;font-size:13px;color:var(--text-soft,#5b6b78);}
.login-fld{flex:1;min-width:0;padding:9px 11px;border-radius:10px;border:1px solid var(--card-border,rgba(11,61,92,.18));
  background:#fff;color:var(--text,#13313f);font-size:14px;outline:none;}
.login-fld:focus{border-color:var(--mint,#3ddc97);box-shadow:0 0 0 3px rgba(61,220,151,.22);}
.login-btn{width:100%;margin-top:6px;padding:11px;border:none;border-radius:12px;cursor:pointer;font-size:15px;font-weight:700;color:#fff;
  background:linear-gradient(135deg,#3ddc97,#0fa3a3);transition:.15s;}
.login-btn:hover{filter:brightness(1.05);}
.login-btn:disabled{opacity:.6;cursor:default;}
.login-err{margin-top:10px;min-height:16px;text-align:center;font-size:12.5px;color:#e0566b;}
/* 登录界面「记住账号密码」勾选项 */
.login-remember{margin-bottom:12px;}
.remember-label{display:flex;align-items:center;gap:7px;font-size:13px;color:var(--text-soft,#5b6b78);cursor:pointer;user-select:none;}
.remember-label input{width:15px;height:15px;accent-color:var(--mint,#3ddc97);cursor:pointer;}
.adv-toggle{margin:4px 0 6px;font-size:13px;color:var(--deep-blue,#0b3d5e);cursor:pointer;user-select:none;font-weight:600;}
.adv-toggle:hover{color:var(--mint,#0fa3a3);}
.adv-body{background:rgba(11,61,92,.04);border:1px solid var(--card-border,rgba(11,61,92,.12));border-radius:12px;padding:10px 12px;margin-bottom:6px;}
/* 高级参数在小框内居中对齐 */
.adv-body .login-row{justify-content:center;}
.adv-body .login-row .lbl-w{flex:0 0 auto;text-align:center;margin-right:10px;}
.adv-body .login-fld{flex:0 0 190px;width:190px;}
/* 注册面板验证码行：验证码图片 + 输入框 + 换一个 同行排列，输入框自适应收缩，避免超出登录框 */
.rg-cap-wrap{display:flex;align-items:center;gap:6px;flex:1;min-width:0;}
.rg-cap-code{flex:0 0 auto;font-weight:700;letter-spacing:2px;background:#eef2ff;color:#334155;padding:7px 9px;border-radius:6px;font-family:monospace;user-select:none;font-size:13px;}
.rg-cap-wrap .login-fld{flex:1 1 auto;width:auto;min-width:0;}
.rg-cap-refresh{flex:0 0 auto;font-size:12px;color:var(--laccent);white-space:nowrap;cursor:pointer;text-decoration:none;opacity:.85;}
.rg-cap-refresh:hover{opacity:1;text-decoration:underline;}

/* 登录界面两种模式：教师端（蓝绿）/ 管理端（紫）区分开来 */
.login-teacher{--laccent:#0b3d5e;--laccent2:#0fa3a3;}
.login-admin{--laccent:#5b3fb0;--laccent2:#8a63d2;}
.login-top{height:6px;margin:-26px -24px 16px;border-radius:18px 18px 0 0;background:linear-gradient(90deg,var(--laccent),var(--laccent2));}
.login-badge{display:block;width:fit-content;margin:0 auto 10px;padding:3px 14px;border-radius:999px;font-size:12px;font-weight:700;color:#fff;background:linear-gradient(90deg,var(--laccent),var(--laccent2));}
.login-teacher .login-logo{background:linear-gradient(135deg,#0b3d5e,#0fa3a3);box-shadow:0 8px 22px rgba(15,163,163,.35);}
.login-admin .login-logo{background:linear-gradient(135deg,#5b3fb0,#8a63d2);box-shadow:0 8px 22px rgba(138,99,210,.4);font-size:26px;}
.login-name{color:var(--laccent)!important;}
.login-btn{background:linear-gradient(135deg,var(--laccent),var(--laccent2))!important;}
.adv-toggle{color:var(--laccent)!important;}
.login-hint{font-size:12px;color:var(--text-soft,#5b6b78);background:rgba(11,61,92,.05);border:1px dashed var(--card-border,rgba(11,61,92,.22));border-radius:10px;padding:8px 10px;margin-bottom:14px;line-height:1.5;}
.login-admin .login-hint{background:rgba(91,63,176,.06);border-color:rgba(91,63,176,.28);}
.login-link{display:block;text-align:center;margin-top:14px;font-size:12.5px;color:var(--laccent);text-decoration:none;opacity:.85;cursor:pointer;}
.login-link:hover{opacity:1;text-decoration:underline;}
/* 登录前隐藏主界面，避免刷新瞬间闪现「已登录界面」（FOUC）：登录屏为独立固定层，不在此隐藏范围内 */
.login-pending #app, .login-pending .float-btn{display:none !important;}

/* ============ 管理员界面（需求200/201） ============ */
.admin-table{overflow-x:auto;}
.admin-table .tbl{width:100%;}
.user-chip{display:inline-flex;align-items:center;gap:6px;padding:3px 10px;border-radius:20px;background:rgba(11,61,92,.08);
  border:1px solid var(--card-border,rgba(11,61,92,.16));font-size:12.5px;color:var(--text,#13313f);margin-right:8px;}
.user-chip .uc-name{font-weight:700;}
.user-chip .uc-role{color:#0fa3a3;font-weight:600;}
.user-chip .uc-logout{color:#e0566b;text-decoration:none;margin-left:2px;}
.user-chip .uc-logout:hover{text-decoration:underline;}

/* ============ 考试管理：三级树（学期 / 大类 / 小类） ============ */
.exam-term{background:var(--card);border:1px solid var(--card-border);border-radius:14px;padding:12px 14px;margin-bottom:12px;box-shadow:var(--shadow);}
.exam-term-head{display:flex;align-items:center;gap:10px;font-size:15px;}
.exam-lv{font-size:11px;font-weight:700;padding:2px 9px;border-radius:20px;color:#fff;flex:none;}
.lv-term{background:linear-gradient(135deg,var(--deep-blue),var(--mint-soft));}
.lv-cat{background:#5b8def;}
.lv-sub{background:#2ec4b6;}
.exam-cats{margin:10px 0 0 14px;display:flex;flex-direction:column;gap:10px;}
.exam-cat{background:rgba(11,61,92,0.04);border-radius:10px;padding:10px 12px;}
.exam-cat-head{display:flex;align-items:center;gap:10px;font-weight:700;font-size:14px;}
.exam-subs{margin-top:8px;display:flex;flex-wrap:wrap;gap:8px;}
.exam-sub{display:inline-flex;align-items:center;gap:6px;padding:4px 10px;border-radius:20px;
  background:rgba(46,196,182,0.14);border:1px solid rgba(46,196,182,0.32);color:var(--deep-blue);font-size:12.5px;font-weight:600;}
.exam-sub-date{font-size:11px;color:var(--text-soft);}
.exam-del{margin-left:auto;color:var(--danger);font-size:12px;font-weight:700;cursor:pointer;}
.exam-del:hover{text-decoration:underline;}

/* ============ 管理员后台独立界面（仅 root 可访问，与教师端分离） ============ */
#app.admin-shell{display:flex;flex-direction:column;}
.admin-shell{background:var(--bg-grad);background-attachment:fixed;}
.admin-topbar{height:60px;flex:none;display:flex;align-items:center;gap:14px;padding:0 22px;
  background:rgba(255,255,255,0.45);backdrop-filter:blur(14px);border-bottom:1px solid rgba(255,255,255,0.6);}
.admin-brand{display:flex;align-items:center;gap:10px;font-weight:800;font-size:17px;color:var(--deep-blue);}
.admin-logo{font-size:22px;}
.admin-actions{margin-left:auto;display:flex;gap:10px;}
.admin-main{flex:1;overflow:auto;padding:22px;}

/* ============ 学生档案：标签页 + 头像（需求2） ============ */
.stu-tabs{display:flex;flex-wrap:wrap;gap:8px;margin-bottom:4px;}
.stu-tab{padding:8px 14px;border-radius:12px;cursor:pointer;font-weight:700;font-size:13px;
  background:rgba(255,255,255,0.55);border:1px solid rgba(11,61,92,0.15);color:var(--text-soft);transition:.15s;}
.stu-tab:hover{background:rgba(61,220,151,0.16);}
.stu-tab.active{background:linear-gradient(135deg,var(--deep-blue),var(--mint-soft));color:#fff;border-color:transparent;
  box-shadow:0 6px 16px rgba(11,61,92,0.2);}
.stu-avatar-wrap{display:flex;flex-direction:column;align-items:center;gap:10px;flex:none;}
.stu-avatar{width:84px;height:84px;border-radius:18px;object-fit:cover;border:2px solid var(--card-border);
  box-shadow:var(--shadow);background:rgba(11,61,92,0.06);}
.stu-tab-body{margin-top:10px;}
.subj-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(150px,1fr));gap:12px;}
.subj-card{background:rgba(11,61,92,0.05);border:1px solid var(--card-border);border-radius:14px;padding:12px 14px;
  display:flex;flex-direction:column;gap:4px;box-shadow:0 4px 14px rgba(16,61,94,0.08);}
.subj-card:hover{background:rgba(61,220,151,0.12);}
.subj-name{font-size:13px;font-weight:800;color:var(--deep-blue);}
.subj-score{font-size:24px;font-weight:800;color:var(--text);line-height:1.1;font-variant-numeric:tabular-nums;}
body[data-theme="dark"] .stu-tab{background:rgba(127,211,255,0.08);color:var(--text-soft);}
body[data-theme="dark"] .subj-card{background:rgba(127,211,255,0.07);}

/* ============ 待办：完成 / 取消完成（需求6） ============ */
.todo-jump.done{opacity:.62;}
.todo-jump.done .nm{text-decoration:line-through;color:var(--text-soft);}
.todo-check{width:18px;height:18px;flex:none;accent-color:var(--mint);cursor:pointer;}
.todo-jump .nm{transition:.15s;}

/* ============ 校历：法定节假日红标（需求7） ============ */
.cal-cell.holiday{background:rgba(224,83,63,0.16);box-shadow:inset 0 0 0 1px rgba(224,83,63,0.42);}
.cal-cell.holiday .d{color:#e0533f;}
.cal-holiday{margin-top:2px;color:#fff;background:linear-gradient(135deg,#f0863f,#e0533f);
  font-size:10px;font-weight:700;line-height:14px;border-radius:7px;padding:0 6px;display:inline-block;max-width:100%;
  overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
body[data-theme="dark"] .cal-cell.holiday{background:rgba(224,83,63,0.22);}
body[data-theme="dark"] .cal-cell.holiday .d{color:#ff9a82;}

/* ============ 课表：节次表头 + 单元格（需求3） ============ */
.sch-tbl{border-collapse:separate;border-spacing:0;}
.sch-period{background:linear-gradient(135deg,rgba(11,61,92,0.10),rgba(61,220,151,0.10));color:var(--deep-blue);
  font-weight:800;cursor:text;border-right:1px solid var(--card-border);}
.sch-period:hover{background:rgba(61,220,151,0.22);}
.sch-cell{cursor:cell;min-width:96px;border-right:1px solid var(--card-border);}
.sch-cell:hover{background:rgba(61,220,151,0.18);}
body[data-theme="dark"] .sch-period{background:rgba(127,211,255,0.12);}

/* ============ 鼠标特效（设置-外观，需求10） ============ */
body.mouse-fx{cursor:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='28' height='28' viewBox='0 0 28 28'%3E%3Ctext y='23' font-size='20'%3E%E2%9C%A8%3C/text%3E%3C/svg%3E") 14 14,auto;}
body.mouse-fx a,body.mouse-fx button,body.mouse-fx input,body.mouse-fx select,body.mouse-fx .todo-check{cursor:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='28' height='28' viewBox='0 0 28 28'%3E%3Ctext y='23' font-size='20'%3E%E2%9C%A8%3C/text%3E%3C/svg%3E") 14 14,pointer;}
