* { box-sizing: border-box; -webkit-tap-highlight-color: transparent; }
:root{
  --bg:#f4f6fb; --card:#fff; --primary:#3b6ef0; --primary-d:#2f59c7;
  --line:#e2e6ef; --text:#1f2733; --muted:#7a869a; --ok:#2bb673; --warn:#e8833a;
}
html,body{margin:0;padding:0;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"PingFang SC","Microsoft YaHei",sans-serif;background:var(--bg);color:var(--text);}
.app{width:100%;max-width:none;margin:0;padding:10px 14px;}
@media (min-width:1600px){.app{padding:12px 24px;}}
header.bar{display:flex;flex-wrap:wrap;gap:8px;align-items:center;background:var(--card);border:1px solid var(--line);border-radius:12px;padding:10px;position:sticky;top:0;z-index:5;box-shadow:0 2px 8px rgba(20,30,60,.05);}
header.bar h1{font-size:16px;margin:0 8px 0 0;white-space:nowrap;}
.spacer{flex:1}
select,button,input,textarea{font:inherit;color:var(--text);}
select,button{border:1px solid var(--line);background:#fff;border-radius:8px;padding:8px 12px;cursor:pointer;}
button.primary{background:var(--primary);border-color:var(--primary);color:#fff;}
button.primary:active{background:var(--primary-d);}
button.ghost{background:#fff;transition:background .15s,border-color .15s,color .15s;}
button.ghost:hover{border-color:#c9d4e4;background:#f7f9fc;}
button.ghost.locked{color:#b9c0cc;border-color:#e6e9ef;background:#f4f6fa;}
/* 顶栏右侧：同步状态（合并入口） + 管理员 */
.syncbtn{min-width:120px;text-align:center;letter-spacing:.3px;}
/* 手动保存：常态醒目；有未保存改动时高亮脉冲提醒 */
button.savebtn{min-width:132px;text-align:center;font-weight:700;letter-spacing:.5px;
  box-shadow:0 1px 4px rgba(47,93,168,.28);position:relative;}
button.savebtn.dirty{animation:savePulse 1.1s ease-in-out infinite;}
@keyframes savePulse{0%,100%{box-shadow:0 0 0 0 rgba(198,40,40,.55);}
  50%{box-shadow:0 0 0 7px rgba(198,40,40,0);}}
button.savebtn.busy{opacity:.6;pointer-events:none;}
button.ghost.local-on{background:#fdf6e8;border-color:#ecd9b0;color:#8a5a00;font-weight:600;}
button.ghost.admin{font-weight:600;letter-spacing:.3px;}
button.ghost.admin.locked{color:#8b95a7;border-color:#e5e8ee;background:#f7f8fa;cursor:pointer;}
button.ghost.admin.locked:hover{background:#eef2f8;border-color:#cfd8e6;color:#4f5f78;}
button.ghost.admin:not(.locked){color:var(--primary);border-color:#c6d3e6;background:#f2f6fc;}
button.ghost.admin:not(.locked):hover{background:#e8eff9;border-color:#adc0dc;}
button.ghost.danger{color:#c0392b;border-color:#f0c3bd;background:#fdf3f2;}
button.ghost.danger:active{background:#fbe3e0;}
button.danger-solid{background:#c0392b;border-color:#c0392b;color:#fff;}
button:disabled{opacity:.5;cursor:not-allowed;}
.toolbar2{display:flex;flex-wrap:wrap;gap:8px;align-items:center;margin:10px 0;background:var(--card);border:1px solid var(--line);border-radius:12px;padding:10px;}
/* 查找学生 */
.searchbox{position:relative;display:inline-flex;min-width:0;}
.search-ico{position:absolute;left:9px;top:50%;transform:translateY(-50%);font-size:13px;line-height:1;pointer-events:none;opacity:.7;}
.searchbox input{width:210px;padding:7px 11px 7px 30px;border:1px solid var(--line);border-radius:9px;font-size:13px;background:#fff;color:#2b3a55;outline:none;}
.searchbox input:focus{border-color:var(--primary);box-shadow:0 0 0 3px rgba(47,79,127,.12);}
.search-pop{position:absolute;top:112%;left:0;width:max(100%,460px);max-height:380px;overflow:auto;background:#fff;border:1px solid var(--line);border-radius:10px;box-shadow:0 10px 28px rgba(20,40,80,.16);z-index:70;}
.search-item{padding:8px 12px;cursor:pointer;border-bottom:1px solid #f0f2f6;display:flex;align-items:flex-start;gap:9px;}
.search-item .s-photo{width:38px;height:38px;border-radius:6px;object-fit:cover;flex:none;background:#eef1f6;margin-top:2px;}
.search-item .s-photo.none{display:inline-flex;align-items:center;justify-content:center;font-size:15px;font-weight:600;color:#8a94a6;background:#eef1f6;border:1px dashed #c9d2e0;box-sizing:border-box;}
.search-item .s-main{min-width:0;flex:1;display:flex;flex-direction:column;gap:3px;}
.search-item:last-of-type{border-bottom:none;}
.search-item:hover{background:#f2f6ff;}
.search-item b{display:block;font-size:13px;color:#243b6b;}
.search-item span{font-size:12px;color:#7a8699;}
/* 两行结果：第一行 姓名+身份证；第二行 班级信息+操作按钮 */
.search-item .s-line1{display:flex;align-items:baseline;gap:8px;min-width:0;}
.search-item .s-line1 b{font-size:13.5px;font-weight:600;}
.search-item .s-id{font-size:12px;color:#8a94a6;font-variant-numeric:tabular-nums;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;}
.search-item .s-line2{display:flex;align-items:center;justify-content:space-between;gap:8px;flex-wrap:wrap;}
.search-empty{padding:10px 12px;font-size:12px;color:#98a1b3;}
/* 查找定位高亮 */
.seat.flash{outline:3px solid #e2a93b;box-shadow:0 0 0 6px rgba(226,169,59,.28);border-radius:10px;}
.stu-row.flash{background:#fdf3d8 !important;box-shadow:inset 3px 0 0 #e2a93b;}
/* 核对页行内补入 */
.add-td{white-space:nowrap;}
.add-td .add-sel{max-width:120px;font-size:12px;padding:3px 4px;border:1px solid var(--line);border-radius:6px;background:#fff;color:#2b3a55;}
.add-td .diff-add{margin-left:4px;}
.spacer2{flex:1}
.panel{background:var(--card);border:1px solid var(--line);border-radius:12px;padding:14px;}
.hint{color:var(--muted);font-size:13px;margin:6px 0 12px;line-height:1.6;}
/* seat grid */
.grid{display:grid;grid-template-columns:repeat(var(--cols,6),1fr);gap:8px;touch-action:manipulation;user-select:none;justify-content:center;}
.seat{position:relative;aspect-ratio:1/1;border:2px dashed var(--line);border-radius:10px;background:#fafbfe;display:flex;flex-direction:column;align-items:center;justify-content:center;overflow:hidden;cursor:pointer;padding:2px;touch-action:manipulation;}
.seat.filled{border-style:solid;border-color:var(--primary);background:#eef3ff;}
.seat .idx{position:absolute;top:2px;left:4px;font-size:10px;color:var(--muted);}
.seat img{width:100%;height:100%;object-fit:cover;border-radius:8px;}
.seat .name{position:absolute;bottom:0;left:0;right:0;font-size:clamp(10px,2.8vw,13px);line-height:1.1;text-align:center;background:rgba(0,0,0,.5);color:#fff;padding:2px 3px 3px;white-space:normal;overflow:hidden;display:-webkit-box;-webkit-line-clamp:3;-webkit-box-orient:vertical;word-break:break-all;}
.seat .name .idc{display:block;font-size:9px;font-weight:400;color:#bfe9ff;margin-top:2px;line-height:1.25;white-space:normal;word-break:break-all;letter-spacing:0;}
.seat .empty{font-size:12px;color:var(--muted);text-align:center;padding:4px;}
.drag-handle{position:absolute;top:2px;right:2px;width:22px;height:22px;display:flex;align-items:center;justify-content:center;font-size:13px;line-height:1;color:#fff;background:rgba(59,110,240,.85);border-radius:6px;cursor:grab;touch-action:none;z-index:3;opacity:.92;box-shadow:0 1px 3px rgba(0,0,0,.3);}
.drag-handle:active{cursor:grabbing;background:var(--primary);}
/* drag */
.seat.dragging{opacity:.35;}
.seat.drop-target{border-color:var(--ok);box-shadow:0 0 0 3px rgba(43,182,115,.25);}
.drag-ghost{position:fixed;z-index:999;pointer-events:none;transform:translate(-50%,-50%);background:var(--primary);color:#fff;padding:6px 10px;border-radius:8px;font-size:13px;box-shadow:0 4px 12px rgba(0,0,0,.25);max-width:120px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
/* modal */
.modal{position:fixed;inset:0;background:rgba(10,20,40,.55);display:none;align-items:center;justify-content:center;z-index:200;padding:12px;}
.modal.show{display:flex;}
.modal .box{background:#fff;border-radius:14px;max-width:560px;width:100%;max-height:92vh;overflow:auto;padding:16px;}
.modal h3{margin:0 0 10px;}
.cam-student{text-align:center;margin:2px 0 10px;padding:8px 0;background:#F4F7FB;border:1px solid #E5E7EB;border-radius:10px;}
.cam-name{font-size:26px;font-weight:700;color:#1F2937;line-height:1.2;}
.cam-idcard{font-size:16px;color:#6B7280;margin-top:4px;letter-spacing:1px;}
.row{display:flex;gap:8px;flex-wrap:wrap;margin:8px 0;}
.video-wrap{background:#000;border-radius:10px;overflow:hidden;max-height:60vh;position:relative;}
.video-wrap video{position:relative;z-index:1;max-width:100%;max-height:100%;display:block;margin:0 auto;background:transparent;}
.cam-bg{position:absolute;inset:0;z-index:0;background:transparent;}
.cam-switch{position:absolute;top:10px;right:10px;z-index:5;width:42px;height:42px;border-radius:50%;border:1px solid rgba(255,255,255,.35);background:rgba(12,16,24,.5);color:#fff;display:flex;align-items:center;justify-content:center;cursor:pointer;-webkit-backdrop-filter:blur(4px);backdrop-filter:blur(4px);transition:background .15s,transform .15s;pointer-events:auto;}
.cam-switch:hover{background:rgba(40,120,220,.75);}
.cam-switch:active{transform:scale(.92);}
.cam-switch:disabled{opacity:.4;cursor:default;}
.cam-switch.spinning svg{animation:camSpin .6s linear;}
@keyframes camSpin{from{transform:rotate(0)}to{transform:rotate(180deg)}}
.face-guide{position:absolute;left:0;top:0;width:100%;height:100%;pointer-events:none;z-index:3;}
/* 背景换色实时预览层：盖在视频上（低于参考图），随设置实时重绘 */
/* AI 换底实时预览层：盖在视频上（低于参考线），由 JS 精确对齐到视频矩形 */
.seg-canvas{position:absolute;left:0;top:0;z-index:2;pointer-events:none;opacity:0;}
/* 底部提示：当前所选底色 */
.cam-bgtag{position:absolute;left:50%;transform:translateX(-50%);bottom:8px;z-index:5;padding:3px 12px;border-radius:12px;background:rgba(8,12,20,.55);border:1px solid rgba(255,255,255,.2);color:#fff;font-size:12px;-webkit-backdrop-filter:blur(4px);backdrop-filter:blur(4px);pointer-events:none;}
/* 拍照页按钮组：照片 + 设置图标 */
.cam-tool{display:inline-flex;align-items:center;gap:5px;}
.cam-tool-icon{width:42px;justify-content:center;font-size:17px;padding:0;}
/* 设置弹窗 */
.set-row{display:flex;align-items:center;gap:10px;flex-wrap:wrap;padding:9px 0;border-bottom:1px dashed #e3e8f0;}
.set-row:last-of-type{border-bottom:0;}
.set-label{flex:0 0 96px;color:#33405a;font-size:14px;}
.set-row input[type=range]{flex:1;min-width:120px;accent-color:#2f6fd0;}
.set-val{flex:0 0 46px;text-align:right;color:#5a6a86;font-size:13px;font-variant-numeric:tabular-nums;}
.set-colors{display:flex;gap:8px;flex-wrap:wrap;}
.setcolor{display:inline-flex;align-items:center;gap:6px;padding:6px 12px;border:1.5px solid #d3dae6;background:#fff;border-radius:999px;cursor:pointer;font-size:13px;color:#3a4a63;transition:border-color .12s,box-shadow .12s,transform .12s;}
.setcolor::before{content:"";width:15px;height:15px;border-radius:50%;background:var(--sw,#fff);border:1px solid rgba(0,0,0,.15);}
.setcolor[data-bg="none"]::before{background:repeating-linear-gradient(45deg,#d7dce4 0 4px,#fff 4px 8px);}
.setcolor.active{border-color:#2f6fd0;box-shadow:0 0 0 2px rgba(47,111,208,.18);color:#1d4e97;font-weight:600;}
.set-tip{margin:10px 0 2px;padding:9px 11px;background:#f5f8fd;border:1px solid #e1e8f3;border-radius:10px;color:#5a6a86;font-size:12.5px;line-height:1.65;}
@media (max-width:520px){.set-label{flex:0 0 100%;}.set-val{flex:0 0 40px;}}
.face-guide-hint{position:absolute;left:50%;transform:translateX(-50%);bottom:8px;max-width:94%;box-sizing:border-box;color:#fff;font-size:12px;line-height:1.55;text-align:center;background:rgba(8,12,20,.55);border:1px solid rgba(255,255,255,.18);padding:5px 12px;border-radius:12px;-webkit-backdrop-filter:blur(4px);backdrop-filter:blur(4px);pointer-events:none;text-shadow:none;z-index:4;}
@media (max-width:520px){.face-guide-hint{font-size:11px;padding:4px 9px;bottom:6px;}}
/* 拍照参考线可调控制条（背景色 + 参考图透明度），可拖动、紧凑 */
.cam-guide-ctrl{position:absolute;left:8px;top:8px;z-index:6;display:flex;flex-direction:column;gap:3px;padding:5px 7px;background:rgba(8,12,20,.55);border:1px solid rgba(255,255,255,.2);border-radius:10px;-webkit-backdrop-filter:blur(4px);backdrop-filter:blur(4px);touch-action:none;max-width:calc(100% - 16px);}
.cam-ctrl-head{cursor:move;user-select:none;-webkit-user-select:none;display:flex;align-items:center;gap:4px;color:#fff;font-size:10px;opacity:.85;letter-spacing:.4px;}
.cam-guide-row{display:flex;align-items:center;gap:6px;}
.cam-guide-label{color:#fff;font-size:10px;white-space:nowrap;opacity:.9;}
.cam-guide-colors{display:flex;gap:5px;}
.gcolor{width:17px;height:17px;padding:0;border-radius:50%;border:2px solid rgba(255,255,255,.5);background:var(--sw,#fff);cursor:pointer;transition:transform .12s,border-color .12s,box-shadow .12s;}
.gcolor.active{border-color:#fff;transform:scale(1.15);box-shadow:0 0 0 2px rgba(255,255,255,.35);}
.gcolor.bg[data-bg="none"]{background:repeating-linear-gradient(45deg,#cfcfcf 0 4px,#fff 4px 8px);}
.cam-guide-op{display:flex;align-items:center;gap:5px;color:#fff;font-size:10px;white-space:nowrap;}
.cam-guide-op input[type=range]{width:76px;accent-color:#6d9bff;}
/* 蚂蚁线动画 + 边缘加亮（白光晕防边缘染色） */
.face-guide .edge-line{stroke:var(--edge-color,#fff);stroke-dasharray:6 4;}
/* 人像模板自带轮廓线，无需额外 SVG 描边 */
/* 拍照进度条 */
.progressbar{margin:8px 0 0;padding:8px 10px;background:#fff;border:1px solid var(--line);border-radius:8px;}
.progressbar .pinfo{display:flex;align-items:center;justify-content:space-between;gap:8px;font-size:13px;color:#2c3e6b;margin-bottom:6px;}
.progressbar .ptrack{height:8px;background:#eef1f6;border-radius:99px;overflow:hidden;}
.progressbar .pfill{height:100%;width:0;background:linear-gradient(90deg,#4a7cf7,#6d9bff);border-radius:99px;transition:width .3s ease;}
.progressbar .pfill.full{background:linear-gradient(90deg,#2fa04a,#57c46c);}
button.tiny{padding:3px 8px;font-size:12px;border-radius:6px;}
/* 模式提示条（在线/离线） */
.modebar{font-size:12px;padding:6px 10px;border-radius:8px;margin:6px 0 0;background:#eef3ff;color:#2c3e6b;line-height:1.5;}
.modebar.ok{background:#e8f6ec;color:#1f6b34;}
.modebar.off{background:#fff6e5;color:#8a5a00;}
/* 管理员窗口 */
.admin-box h3{margin:0 0 12px;font-weight:600;letter-spacing:.5px;}
.adm-tabs{display:flex;gap:6px;flex-wrap:wrap;margin:0 0 12px;padding-bottom:8px;border-bottom:1px solid var(--line);}
.adm-tabs button{border:1px solid transparent;background:transparent;color:var(--muted);padding:6px 12px;border-radius:8px;font-size:13px;cursor:pointer;}
.adm-tabs button:hover{background:#f5f7fa;color:var(--text);}
.adm-tabs button.active{background:#eef3fb;color:var(--primary);border-color:#d8e2f2;font-weight:600;}
.adm-pane{padding-top:2px;}
.adm-tip{font-size:13px;color:#2f8f5b;margin:6px 0 0;min-height:18px;}
/* 核对学籍 ⇄ 实际 */
.diff-overview{display:flex;flex-wrap:wrap;gap:6px 14px;align-items:center;padding:10px 12px;margin:0 0 12px;border:1px solid #d8e3f5;border-radius:10px;background:#eef4fd;font-size:14px;color:var(--text);line-height:1.6;}
.diff-overview b{color:#1f5fbf;font-size:15px;}
.diff-overview .sep{color:var(--muted);}
@media (max-width:520px){.diff-overview{font-size:13px;gap:4px 10px;}.diff-overview b{font-size:14px;}}
.diff-sum{display:flex;flex-wrap:wrap;gap:8px;margin:0 0 12px;}
.diff-card{flex:1 1 96px;min-width:96px;border:1px solid var(--line);border-radius:10px;background:#fafbfd;padding:8px 10px;text-align:center;}
.diff-card b{display:block;font-size:16px;color:var(--text);}
.diff-card span{display:block;font-size:12px;color:var(--muted);margin-top:2px;}
.diff-card.ok{border-color:#cfe9d8;background:#f2fbf5;}
.diff-card.ok b{color:#1f6b34;}
.diff-card.warn{border-color:#f0d8b0;background:#fff9ef;}
.diff-card.warn b{color:#a35b00;}
.diff-list{max-height:46vh;overflow:auto;border:1px solid var(--line);border-radius:10px;padding:6px 10px;background:#fff;}
.diff-grp{margin:6px 0;border-bottom:1px dashed var(--line);padding-bottom:6px;}
.diff-grp:last-child{border-bottom:none;}
.diff-grp summary{cursor:pointer;font-size:13px;font-weight:600;padding:4px 0;color:var(--text);}
.diff-grp.warn summary{color:#a35b00;}
.diff-tb{width:100%;border-collapse:collapse;font-size:12px;margin:4px 0 8px;}
.diff-tb th{text-align:left;color:var(--muted);font-weight:500;border-bottom:1px solid var(--line);padding:3px 6px;}
.diff-tb td{padding:3px 6px;border-bottom:1px solid #f2f4f7;word-break:break-all;}
/* 清空作用范围（学籍 / 实际 复选） */
.scope-box{border:1px solid #dde5f2;background:#f5f8fd;border-radius:10px;padding:10px 12px;margin:0 0 12px;}
.scope-title{font-size:13px;font-weight:600;color:#2c3e6b;margin-bottom:6px;}
.scope-row{display:flex;flex-wrap:wrap;gap:8px 16px;align-items:center;}
.scope-row .chk{display:inline-flex;align-items:center;gap:6px;font-size:13px;color:var(--text);cursor:pointer;user-select:none;}
.scope-row .chk input{width:16px;height:16px;accent-color:var(--primary);cursor:pointer;}
.scope-num{color:var(--muted);font-size:12px;}
.scope-box .hint{margin:8px 0 0;}
@media (max-width:520px){.scope-row{gap:8px 10px;}.scope-row .chk{font-size:12.5px;}}
label.field{display:block;margin:10px 0;font-size:13px;color:var(--muted);}
label.field select{margin-left:6px;}
/* 同步面板状态块 */
.sync-state{display:flex;flex-direction:column;gap:3px;padding:11px 13px;border-radius:10px;font-size:13px;line-height:1.65;background:#eef3fb;color:#2c3e6b;border:1px solid #dde5f2;margin-bottom:10px;}
.sync-state b{font-size:14px;letter-spacing:.3px;}
.sync-state.ok{background:#eaf6ee;border-color:#d6ebdd;color:#1f6b34;}
.sync-state.off{background:#fdf6e8;border-color:#f0e2c2;color:#8a5a00;}
.pend-warn{color:#c1781c;font-weight:600;}
.pend-ok{color:#2f8f5b;}
/* 访问口令锁屏 */
.lockscreen{position:fixed;inset:0;z-index:9999;background:linear-gradient(160deg,#22334d,#3c5170);display:flex;align-items:center;justify-content:center;padding:20px;}
.lockscreen.hidden{display:none;}
.lock-box{background:#fff;border-radius:16px;padding:28px 24px;width:100%;max-width:340px;text-align:center;box-shadow:0 12px 40px rgba(0,0,0,.3);}
.lock-icon{font-size:40px;margin-bottom:6px;}
.lock-box h2{margin:0 0 4px;font-size:19px;}
.lock-tip{margin:0 0 14px;color:var(--muted);font-size:13px;}
.lock-box input{width:100%;padding:11px;border:1px solid var(--line);border-radius:9px;font-size:16px;text-align:center;margin-bottom:10px;}
.lock-keep{display:flex;align-items:center;justify-content:center;gap:6px;font-size:12px;color:var(--muted);margin:12px 0 0;cursor:pointer;user-select:none;}
.lock-keep input{width:15px;height:15px;accent-color:var(--primary);cursor:pointer;}
.lock-box .primary{width:100%;padding:11px;font-size:15px;}
.lock-err{color:#d33;margin:8px 0 0;font-size:13px;min-height:18px;}
.lock-foot{margin:12px 0 0;font-size:11px;color:#98a2b3;line-height:1.5;}
.lock-hint{margin:-3px 0 9px;color:#c6ccd6;font-size:12px;text-align:center;}
.perm-hint{margin:10px 0 0;font-size:10px;line-height:1.5;color:#d4d9e1;}
.perm-hint b{font-weight:600;color:#c3cad3;}
.role-pane input::placeholder{color:#9aa3b0;}
.keep-txt{display:none;}
video{width:100%;display:block;}
textarea{width:100%;min-height:140px;border:1px solid var(--line);border-radius:8px;padding:8px;}
.list{display:flex;flex-direction:column;gap:6px;max-height:55vh;overflow:auto;}
.list .item{display:flex;align-items:center;gap:8px;border:1px solid var(--line);border-radius:8px;padding:6px 8px;}
.list .item img{width:40px;height:40px;border-radius:6px;object-fit:cover;}
/* 批量编辑：重复/同名多人候选行（复选框，勾选后复制插入本班） */
.dup-row{display:flex;align-items:center;gap:10px;flex-wrap:wrap;padding:10px 12px;border:1px solid var(--line);border-radius:10px;background:#fff;cursor:pointer;}
.dup-row:hover{background:#F4F7FB;}
.dup-row input[type=checkbox]{width:18px;height:18px;flex:none;cursor:pointer;}
.dup-name{font-weight:600;color:var(--text,#1F2937);}
.dup-id{color:var(--muted);font-size:12px;letter-spacing:.5px;}
.dup-from{margin-left:auto;font-size:12px;color:#2563EB;white-space:nowrap;}
.dup-row.in{background:#FFFBEB;border-color:#FDE68A;}
.dup-row.in .dup-from{color:#B45309;}
.tag{font-size:12px;color:var(--muted);}
.mi{display:flex;flex-direction:column;gap:1px;min-width:120px;}
.mi .en{font-weight:600;font-size:14px;}
.mi .eid{font-size:12px;color:#2b6cb0;}
/* file input button */
.filebtn{display:inline-block;border:1px dashed var(--primary);color:var(--primary);background:#eef3ff;border-radius:8px;padding:8px 12px;cursor:pointer;font-size:13px;margin:4px 0;}
.filebtn input{display:none;}
/* mapping */
.map-area{border:1px solid var(--line);border-radius:10px;padding:8px;margin:8px 0;background:#fbfcff;}
.map-area h4{margin:4px 0 8px;font-size:13px;}
.map-row{display:flex;align-items:center;gap:8px;font-size:13px;padding:4px 0;border-bottom:1px dashed var(--line);}
.map-row .preview{flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:var(--muted);}
.map-area select{padding:4px 6px;}
.map-note{font-size:12px;color:var(--warn);margin-top:6px;}
/* edit students */
.edit-row{display:flex;align-items:center;gap:10px;padding:6px 0;border-bottom:1px dashed var(--line);}
.edit-row .en{flex:1;font-weight:600;}
.edit-row select,.edit-row input{padding:6px 8px;}
.edit-row .eh{width:90px;}
/* sync */
.sync-status{font-size:13px;color:var(--muted);min-height:20px;margin:6px 0;}
.sync-status.ok{color:var(--ok);}
.sync-status.err{color:#d9534f;}
.field{display:flex;flex-direction:column;gap:6px;font-size:13px;margin:6px 0;}
.field select{padding:8px;}
.inline-field{display:flex;align-items:center;gap:6px;font-size:13px;color:var(--muted);white-space:nowrap;}
.inline-field select{padding:6px 8px;}
.opt{display:flex;align-items:center;gap:8px;font-size:13px;margin:10px 0 6px;cursor:pointer;}
.opt input{width:16px;height:16px;}
.size-tip{color:var(--warn);margin:2px 0 10px;line-height:1.5;}
.pstat{font-size:13px;color:var(--muted);background:#f7f9fd;border:1px solid var(--line);border-radius:8px;padding:8px 10px;min-height:20px;margin:8px 0;}
.pstat.ok{color:var(--ok);background:#eefaf2;border-color:#bfe8cd;}
.pstat.err{color:#c0392b;background:#fdf3f2;border-color:#f0c3bd;}
@media (max-width:640px){
  .grid{gap:4px;}
  header.bar h1{font-size:14px;width:100%;}
  .toolbar2 .primary,.toolbar2 .ghost{padding:7px 10px;font-size:13px;}
  button.savebtn{min-width:0;padding:8px 12px;font-size:13px;order:9;}
}
/* 批量导入照片结果 */
.batch-result{margin:6px 0 2px;font-size:13px;line-height:1.55;}
.batch-sum{font-size:14px;font-weight:600;margin-bottom:6px;color:var(--text);}
.batch-grp{margin:4px 0;padding:6px 8px;border-radius:6px;background:#f6f8fb;color:var(--text);}
.batch-grp.ok{background:#eafaf0;color:#1a7f37;}
.batch-grp.warn{background:#fff7e6;color:#b7791f;}
.batch-grp.bad{background:#fdecea;color:#c0392b;word-break:break-all;}
.batch-grp b{font-size:14px;}
/* 乱码姓名（生僻字被替换）标记 */
.bad-name{color:#c0392b !important;}
.seat .name.bad-name{background:rgba(192,57,43,.08);border-radius:4px;}
.fix-rows{max-height:52vh;overflow:auto;margin:6px 0;}
.fix-rows .map-row{flex-wrap:wrap;gap:6px;}
.fix-rows .preview{flex:1 1 240px;}
.fix-rows input.f-edit{min-width:120px;}
.batch-detail{margin:6px 0 2px;border:1px solid var(--line);border-radius:6px;background:#fbfcfe;}
.batch-detail summary{cursor:pointer;padding:6px 8px;font-weight:600;font-size:13px;color:#2c3e6b;}
.batch-table{max-height:240px;overflow:auto;padding:0 8px 8px;}
.bt-row{display:flex;gap:6px;align-items:baseline;padding:4px 0;border-top:1px dashed var(--line);font-size:12.5px;}
.bt-f{flex:1 1 55%;color:var(--muted);word-break:break-all;}
.bt-a{color:#b6bfcd;}
.bt-n{flex:0 0 auto;font-weight:600;color:#1a7f37;}

/* 学籍班级 / 实际班级 切换 */
.grpseg{display:inline-flex;border:1px solid var(--line);border-radius:8px;overflow:hidden;background:#fff;flex-shrink:0;}
.grpseg button{border:none;border-radius:0;padding:8px 12px;background:#fff;color:var(--muted);font-size:13px;white-space:nowrap;}
.grpseg button + button{border-left:1px solid var(--line);}
.grpseg button.active{background:var(--primary);color:#fff;font-weight:600;}

/* 学生名单面板 */
.stu-panel{background:var(--card);border:1px solid var(--line);border-radius:12px;padding:12px 14px;margin-top:12px;}
.stu-head{display:flex;align-items:center;justify-content:space-between;gap:8px;margin-bottom:8px;flex-wrap:wrap;}
.stu-head h3{margin:0;font-size:15px;}
.stu-count{font-size:13px;color:var(--muted);font-weight:400;}
.viewseg{display:inline-flex;border:1px solid var(--line);border-radius:8px;overflow:hidden;background:#fff;}
.viewseg button{border:none;border-radius:0;padding:6px 12px;background:#fff;color:var(--muted);font-size:13px;}
.viewseg button + button{border-left:1px solid var(--line);}
.viewseg button.active{background:#eef3ff;color:var(--primary);font-weight:600;}
/* 列表视图 */
.stu-list{display:flex;flex-direction:column;gap:6px;max-height:65vh;overflow:auto;}
.stu-row{display:flex;align-items:center;gap:12px;padding:7px 9px;border:1px solid var(--line);border-radius:10px;background:#fbfcfe;min-width:max-content;}
.stu-head{background:#e3ecfb;font-weight:600;color:#33405e;border-color:#c7d6f5;position:sticky;top:0;z-index:2;box-shadow:0 2px 5px rgba(30,40,70,.10);border-radius:10px;}
/* 左侧照片卡：姓名叠照片上、身份证在照片下，只读固定显示 */
.photocard{width:112px;flex-shrink:0;display:flex;flex-direction:column;align-items:center;gap:3px;}
.stu-head .photocard{justify-content:flex-end;}
.photocard .pc-label{font-size:12px;color:var(--muted);font-weight:600;line-height:1.2;text-align:center;}
.photocard .pc-img{position:relative;width:112px;height:132px;border-radius:10px;overflow:hidden;background:#e8edf6;border:1px solid var(--line);}
.photocard .pc-img img{width:100%;height:100%;object-fit:cover;display:block;}
.photocard .pc-img .ph-init{width:100%;height:100%;display:flex;align-items:center;justify-content:center;font-size:34px;font-weight:600;color:#b9c4d8;}
.photocard .pc-img .seat-badge{position:absolute;top:4px;right:4px;min-width:20px;height:20px;padding:0 5px;border-radius:7px;background:rgba(59,110,240,.92);color:#fff;font-size:11px;display:flex;align-items:center;justify-content:center;z-index:2;}
.photocard .pc-img .nm-ov{position:absolute;left:0;right:0;top:0;background:linear-gradient(180deg,rgba(0,0,0,.52),rgba(0,0,0,0));color:#fff;font-size:12px;font-weight:600;text-align:center;padding:3px 4px 7px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;}
.photocard .pc-id{font-size:10px;color:var(--muted);max-width:112px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;text-align:center;letter-spacing:0;}
.colh{font-size:12px;color:var(--muted);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;text-align:center;padding:2px 4px;border-radius:6px;user-select:none;}
.col .f-line{font-size:12px;color:var(--text);line-height:1.35;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;padding:3px 2px;}
.actions{display:flex;gap:6px;flex-shrink:0;width:152px;justify-content:flex-end;}
.act-spacer{display:flex;align-items:center;justify-content:flex-end;width:152px;flex-shrink:0;font-size:12px;color:var(--muted);}
.stu-row .info{flex:1;min-width:0;display:grid;gap:10px;align-items:center;}
/* 每列竖向分隔线（表头与数据行一致，保证逐列对齐） */
.stu-head .colh, .stu-row .col{border-left:1px solid var(--line);}
.stu-row .col{padding-left:10px;}
/* 斑马纹 + 行 hover 高亮，便于逐行区分 */
.stu-list > .stu-row:not(.stu-head):nth-child(even){background:#f3f6fc;}
.stu-list > .stu-row:not(.stu-head):hover{background:#e7f0ff;}
.stu-row .shoot{flex-shrink:0;}
.stu-row .move{flex-shrink:0;color:#1f6feb;}
.stu-row .del{border:none;background:none;color:#c0392b;font-size:20px;line-height:1;padding:4px 8px;border-radius:6px;flex-shrink:0;}
.stu-row .del:active{background:#fdecea;}
/* 缩略图视图：直接承载座次拍照图（#grid） */
.stu-thumbs{width:100%;}
.stu-head-right{display:flex;align-items:center;gap:8px;flex-wrap:wrap;}
/* 列表字段：可编辑输入框 / 只读行 */
.stu-row .f-edit{width:100%;min-width:0;padding:4px 6px;border:1px solid var(--line);border-radius:7px;font-size:13px;background:#fff;}
.stu-row .f-edit:focus{border-color:var(--primary);outline:none;}
.stu-row select.f-edit{width:96px;flex:none;}
.stu-row .f-line{font-size:12px;color:var(--muted);line-height:1.35;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;}
@media (max-width:640px){
  .grpseg button{padding:7px 9px;font-size:12px;}
  .stu-row{padding:6px 7px;gap:8px;}
  .app{padding:8px;}
  .photocard{width:104px;}
  .photocard .pc-img{width:104px;height:124px;}
  .photocard .pc-id{max-width:104px;font-size:9.5px;}
  .searchbox{width:100%;}
  .searchbox input{width:100%;}
  .search-pop{width:100%;}
}
.sync-ver{text-align:center;color:#98a2b3;margin:10px 0 0;font-size:12px;}

/* ===== 2026-09-24 角色登录 / 年级 / 教师账号 ===== */
.role-tabs{display:flex;gap:6px;margin:10px 0 12px;}
.role-tabs button{flex:1;padding:8px 6px;border-radius:8px;border:1px solid var(--line,#d9dee7);background:#fff;color:var(--fg,#1f2937);font-size:14px;cursor:pointer;}
.role-tabs button.active{background:var(--primary,#2563eb);color:#fff;border-color:var(--primary,#2563eb);}
.role-pane input{width:100%;margin:6px 0;padding:10px;border:1px solid var(--line,#d9dee7);border-radius:8px;font-size:15px;}
.role-pane button.primary{width:100%;margin-top:8px;}
.role-seg{display:flex;gap:6px;margin:10px 0 12px;}
.role-seg .role-tab{flex:1;padding:8px 6px;border-radius:8px;border:1px solid var(--line,#d9dee7);background:#fff;color:var(--fg,#1f2937);font-size:14px;cursor:pointer;}
.role-seg .role-tab.active{background:var(--primary,#2563eb);color:#fff;border-color:var(--primary,#2563eb);}
.lock-box h2{font-size:18px;margin:6px 0;}
.grade-lab{display:inline-flex;align-items:center;gap:4px;font-size:12px;color:var(--muted,#6b7280);}
.grade-lab select{padding:6px 8px;border-radius:8px;border:1px solid var(--line,#d9dee7);background:#fff;font-size:14px;}
.who{font-size:12px;color:var(--muted,#6b7280);padding:0 6px;}
.who.tea{color:#0f766e;font-weight:600;}
.ro-tag{font-size:12px;color:var(--muted,#6b7280);}
.sec{margin:10px 0 18px;padding:10px 12px;border:1px solid var(--line,#e5e7eb);border-radius:10px;}
.sec-t{font-weight:700;font-size:14px;margin-bottom:6px;}
.grade-row{display:flex;gap:8px;align-items:center;margin:6px 0;}
.grade-row input.g-name{flex:1;padding:7px 8px;border:1px solid var(--line,#d9dee7);border-radius:8px;font-size:14px;}
.cg-rows{max-height:320px;overflow:auto;border:1px solid var(--line,#e5e7eb);border-radius:8px;}
.cg-row{display:grid;grid-template-columns:36px 1fr 130px;gap:8px;align-items:center;padding:6px 8px;border-bottom:1px solid var(--line,#f1f3f7);font-size:13px;}
.cg-head{font-weight:700;background:#fafbfd;position:sticky;top:0;}
.cg-row select{padding:5px 6px;border:1px solid var(--line,#d9dee7);border-radius:6px;font-size:13px;}
.cg-nm{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
.user-list{margin:8px 0;}
.user-row{display:flex;flex-wrap:wrap;gap:8px;align-items:center;padding:8px;border:1px solid var(--line,#e5e7eb);border-radius:8px;margin-bottom:6px;font-size:13px;}
.user-row .u-acc{color:var(--muted,#6b7280);}
.user-row .u-cls{flex:1 1 100%;color:var(--muted,#6b7280);}
.new-user{margin-top:10px;padding-top:10px;border-top:1px dashed var(--line,#e5e7eb);}
.new-user input{flex:1 1 140px;min-width:120px;padding:7px 8px;border:1px solid var(--line,#d9dee7);border-radius:8px;font-size:14px;}
.nu-title{font-size:12px;color:var(--muted,#6b7280);margin:8px 0 4px;}
.nu-classes{display:flex;flex-wrap:wrap;gap:8px 14px;max-height:180px;overflow:auto;}
.nu-cls{display:inline-flex;align-items:center;gap:5px;font-size:13px;}
/* Q 版：教师账号与权限（不绑定班级） */
.adm-switch{display:flex;flex-wrap:wrap;gap:10px;align-items:center;margin:8px 0;}
.adm-switch .switch{display:inline-flex;align-items:center;gap:6px;font-weight:600;cursor:pointer;}
.adm-switch .switch input{width:16px;height:16px;}
.sec.sub{background:#fafbfd;margin:12px 0;padding:10px 12px;border:1px solid var(--line,#e5e7eb);border-radius:10px;}
.u-edit{display:inline-flex;align-items:center;gap:4px;color:var(--muted,#6b7280);}
.u-edit input{width:15px;height:15px;}
.paste{width:100%;min-height:120px;margin:8px 0;padding:10px;border:1px solid var(--line,#d9dee7);border-radius:8px;font-size:13px;font-family:ui-monospace,Menlo,Consolas,monospace;resize:vertical;box-sizing:border-box;}
.user-row .u-edit{flex:0 0 auto;}
@media (max-width:720px){
  .cg-row{grid-template-columns:32px 1fr 110px;font-size:12px;}
  .user-row{gap:6px;}
}

/* ===== 2026-10-16 教职工表职务权限（校长级 / 班主任本班 / 仅查看） ===== */
/* 顶栏：班主任的「固定班级」文本（不可下拉选择） */
.myclass-fixed{display:inline-flex;align-items:center;gap:6px;padding:8px 12px;border:1px dashed #b9c8e8;border-radius:8px;background:#f2f6fc;color:#2f4a7a;font-weight:700;font-size:13px;white-space:nowrap;max-width:46vw;overflow:hidden;text-overflow:ellipsis;}
/* 学生名单：仅查看 / 班级未导入 的提示 */
.stu-empty{padding:26px 16px;text-align:center;color:var(--muted);font-size:14px;line-height:1.9;background:#fafbfd;border:1px dashed var(--line);border-radius:10px;margin:8px 0;}
/* 教职工表导入预览 */
.staff-preview{margin:8px 0;padding:10px 12px;border:1px solid var(--line);border-radius:10px;background:#fff;}
.staff-sum{font-size:13.5px;font-weight:600;color:var(--text);margin-bottom:4px;}
.staff-rows{max-height:240px;overflow:auto;border:1px solid #eef1f6;border-radius:8px;}
.staff-row{display:flex;flex-wrap:wrap;gap:4px 12px;align-items:center;padding:6px 10px;font-size:12.5px;border-bottom:1px solid #f2f4f8;}
.staff-row:last-child{border-bottom:none;}
.staff-row b{min-width:64px;color:#243b6b;}
.staff-row span{color:var(--muted);}
.staff-row span:last-child{color:#2f4a7a;font-weight:600;}
/* 账号列表：职务 / 绑定班级 / 权限下拉 */
.user-row .u-duty{color:var(--muted);font-size:12px;}
.user-row .u-clsinp{flex:0 0 110px;min-width:90px;padding:5px 8px;border:1px solid var(--line);border-radius:7px;font-size:12.5px;background:#fff;}
.user-row .u-perm{flex:0 0 auto;padding:5px 8px;font-size:12.5px;border-radius:7px;background:#fff;}
/* 提示着色 */
.hint.ok{color:var(--ok);}
.hint.err{color:#c0392b;}
/* 查找结果行内操作（班主任） */
.search-item.listmode{cursor:default;}
.search-item.listmode:hover{background:transparent;}
.search-item.own{background:#f4f8ff;}
.s-acts{display:inline-flex;gap:6px;margin-left:8px;}
.s-act{padding:2px 9px;font-size:12px;border:1px solid #c9d6ef;border-radius:6px;background:#fff;color:#2f4a7a;cursor:pointer;}
.s-act:hover{background:#eef3fd;}
.s-act.del{border-color:#f0c3bd;color:#c0392b;}
.s-act.del:hover{background:#fdf3f2;}
.s-ro{color:#98a1b3;font-size:12px;}
/* 批量编辑名单（仅管理员可见） */
.batch-name-box{margin:10px 0 4px;padding:10px 12px;border:1px solid #d7c9a6;background:#fffdf5;border-radius:10px;}
.batch-name-box .bnb-head{display:flex;align-items:center;justify-content:space-between;gap:10px;font-weight:600;color:#7a5a16;font-size:13.5px;}
.batch-name-box .bnb-head .ghost.tiny{padding:2px 9px;font-size:12px;}
.batch-name-box .hint{margin:6px 0 8px;font-size:12px;line-height:1.6;}
.batch-name-box textarea{width:100%;min-height:120px;box-sizing:border-box;padding:8px 10px;border:1px solid var(--line);border-radius:8px;font-size:13px;line-height:1.6;resize:vertical;font-family:inherit;}
.batch-name-box .row{margin-top:8px;}
/* 列表旁的「📝 批量编辑」开关按钮 */
#btnBatchToggle.active{background:#7a5a16;color:#fff;border-color:#7a5a16;}
@media (max-width:640px){
  .myclass-fixed{max-width:100%;font-size:12.5px;padding:7px 10px;}
  .user-row .u-clsinp{flex:1 1 90px;}
  .user-row .u-perm{flex:1 1 100%;}
  .s-acts{margin-left:0;margin-top:4px;}
  .search-item.listmode{flex-wrap:wrap;}
}

/* ================= 学生请假 ================= */
/* 顶栏🔔铃铛与待处理红点 */
.leave-bell{position:relative;border:1px solid var(--line);background:#fff;border-radius:9px;padding:6px 10px;font-size:15px;line-height:1;cursor:pointer;}
.leave-bell:hover{background:#f2f6ff;}
.leave-bell.has{border-color:#e0b03a;background:#fffaf0;animation:bellPulse 1.6s ease-in-out infinite;}
@keyframes bellPulse{0%,100%{box-shadow:0 0 0 0 rgba(224,176,58,.45);}50%{box-shadow:0 0 0 5px rgba(224,176,58,0);}}
.leave-badge{position:absolute;top:-7px;right:-7px;min-width:17px;height:17px;padding:0 4px;border-radius:9px;background:#d63031;color:#fff;font-size:11px;line-height:17px;text-align:center;font-weight:600;box-shadow:0 1px 3px rgba(214,48,49,.4);}
/* 请假弹窗 */
.leave-box{width:min(560px,94vw);}
.lv-stu{display:flex;align-items:baseline;gap:10px;flex-wrap:wrap;padding:9px 12px;background:#f4f8ff;border:1px solid #d7e3f7;border-radius:9px;margin:4px 0 10px;}
.lv-stu b{font-size:15px;color:#243b6b;}
.lv-stu span{font-size:12.5px;color:#5a6b8c;}
.lv-dates{display:flex;gap:12px;flex-wrap:wrap;margin-bottom:4px;}
.lv-dates .inline-field{flex:1 1 160px;}
.fld{display:block;margin:8px 0 4px;}
.fld textarea,.fld input{width:100%;box-sizing:border-box;margin-top:4px;}
/* 教官待处理弹窗 */
.leave-deal-box{width:min(640px,95vw);}
.lv-count{font-size:12.5px;color:#d63031;font-weight:600;margin-left:6px;}
.lv-tabs{display:flex;gap:6px;margin:2px 0 10px;}
.lv-tab{border:1px solid var(--line);background:#fff;border-radius:8px;padding:5px 14px;font-size:13px;color:#5a6b8c;cursor:pointer;}
.lv-tab.on{background:var(--primary);border-color:var(--primary);color:#fff;}
.lv-list{max-height:56vh;overflow:auto;display:flex;flex-direction:column;gap:9px;}
.lv-card{border:1px solid var(--line);border-radius:10px;padding:10px 12px;background:#fff;}
.lv-card-h{display:flex;align-items:baseline;gap:9px;flex-wrap:wrap;}
.lv-card-h b{font-size:14.5px;color:#243b6b;}
.lv-card-h .lv-cls{font-size:12.5px;color:#5a6b8c;}
.lv-card-h .lv-type{font-size:12px;color:#7a5a16;background:#fffdf5;border:1px solid #e6d9b8;border-radius:6px;padding:1px 7px;}
.lv-st{margin-left:auto;font-size:12px;border-radius:6px;padding:1px 8px;}
.lv-st-p{color:#b26a00;background:#fff4e0;border:1px solid #f0d9ae;}
.lv-st-a{color:#1e7e34;background:#e9f7ee;border:1px solid #bfe5cb;}
.lv-st-r{color:#c0392b;background:#fdf0ee;border:1px solid #f2c9c2;}
.lv-card-b{margin-top:6px;display:flex;flex-direction:column;gap:3px;font-size:13px;color:#3d4c66;line-height:1.55;}
.lv-card-b .lv-by{font-size:12px;color:#8a94a6;margin-top:2px;}
.lv-card-f{display:flex;gap:7px;margin-top:9px;flex-wrap:wrap;align-items:center;}
.lv-card-f .lv-op{flex:1 1 180px;padding:6px 10px;border:1px solid var(--line);border-radius:8px;font-size:13px;outline:none;}
.lv-card-f .lv-op:focus{border-color:var(--primary);}
.lv-card-f button.tiny{padding:6px 13px;font-size:12.5px;}
.lv-done{margin-top:8px;font-size:12px;color:#7a8699;background:#f7f9fc;border-radius:7px;padding:6px 9px;}
@media (max-width:640px){
  .leave-box,.leave-deal-box{width:96vw;}
  .lv-card-f .lv-op{flex:1 1 100%;}
}

/* ================= 教官工作台 + 入校登记 / 到校提醒（2026-10-17·AJ） ================= */
/* 顶栏📬铃铛（班主任到校提醒）：复用 leave-bell 外形，绿色系区分 */
.leave-bell.entry-bell.has{border-color:#2e9e5b;background:#f0faf3;animation:bellPulseG 1.6s ease-in-out infinite;}
@keyframes bellPulseG{0%,100%{box-shadow:0 0 0 0 rgba(46,158,91,.45);}50%{box-shadow:0 0 0 5px rgba(46,158,91,0);}}
.leave-bell.entry-bell .leave-badge{background:#2e9e5b;box-shadow:0 1px 3px rgba(46,158,91,.4);}
/* 教官工作台外框 */
.ins-view{display:flex;flex-direction:column;gap:12px;margin:10px 0 4px;}
/* 顶栏标题后缀：「- 教官工作台（小字）」 */
.title-sub{font-size:13px;font-weight:600;color:#2f4a7a;margin-left:6px;white-space:nowrap;}
.title-sub small{font-size:11px;font-weight:400;color:#8a94a6;margin-left:4px;}
/* 三个统计按钮（待处理请假 / 入校登记 / 请假中） */
.ins-stats{display:grid;grid-template-columns:repeat(3,1fr);gap:10px;}
.ins-stat{display:flex;align-items:center;gap:10px;text-align:left;border:1px solid var(--line);border-radius:14px;padding:12px 12px;cursor:pointer;background:#fff;transition:transform .12s ease,box-shadow .12s ease;min-height:64px;-webkit-tap-highlight-color:transparent;touch-action:manipulation;}
.ins-stat:active{transform:scale(.97);}
.ins-stat .ins-ico{flex:none;width:40px;height:40px;border-radius:11px;display:flex;align-items:center;justify-content:center;font-size:19px;line-height:1;}
.ins-stat .ins-body{display:flex;flex-direction:column;min-width:0;}
.ins-stat b{font-size:23px;font-weight:700;font-variant-numeric:tabular-nums;line-height:1.15;}
.ins-stat .ins-lab{font-size:12px;color:#7a8699;margin-top:2px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;}
.ins-stat.st-pending{background:linear-gradient(135deg,#fff7ec,#fffdf8);border-color:#f0d9ae;}
.ins-stat.st-pending .ins-ico{background:#fff1d6;box-shadow:inset 0 0 0 1px #f0d9ae;}
.ins-stat.st-pending b{color:#b26a00;}
.ins-stat.st-entry{background:linear-gradient(135deg,#f0faf3,#fbfefc);border-color:#bfe5cb;}
.ins-stat.st-entry .ins-ico{background:#dcf3e4;box-shadow:inset 0 0 0 1px #bfe5cb;}
.ins-stat.st-entry b{color:#1e7e34;}
.ins-stat.st-leaves{background:linear-gradient(135deg,#fdeef0,#fffbfc);border-color:#f0c3c8;}
.ins-stat.st-leaves .ins-ico{background:#fadfe3;box-shadow:inset 0 0 0 1px #f0c3c8;}
.ins-stat.st-leaves b{color:#c0392b;}
.ins-stat.st-pending.has-alert{animation:statPulse 1.6s ease-in-out infinite;}
@keyframes statPulse{0%,100%{box-shadow:0 0 0 0 rgba(178,106,0,.35);}50%{box-shadow:0 0 0 5px rgba(178,106,0,0);}}
.ins-sec{background:#fff;border:1px solid var(--line);border-radius:12px;padding:12px 14px;scroll-margin-top:12px;}
.ins-sec-h{display:flex;align-items:center;justify-content:space-between;gap:10px;flex-wrap:wrap;font-size:14px;font-weight:600;color:#243b6b;margin-bottom:10px;}
.ins-more{border:1px solid var(--line);background:#fff;border-radius:8px;padding:6px 14px;font-size:12.5px;color:#2f4a7a;cursor:pointer;touch-action:manipulation;}
.ins-more:hover{background:#eef3fd;}
.ins-tip{font-size:12px;color:#8a94a6;font-weight:400;}
.ins-leaves{max-height:52vh;}
/* 最近入校记录行 */
.ins-entries{display:flex;flex-direction:column;gap:7px;}
.en-row{display:flex;align-items:center;gap:10px;flex-wrap:wrap;padding:8px 11px;border:1px solid #eef1f6;border-radius:9px;background:#fbfcfe;font-size:13px;}
.en-row .en-time{color:#8a94a6;font-variant-numeric:tabular-nums;flex:none;}
.en-row .en-name{font-weight:600;color:#243b6b;min-width:64px;}
.en-row .en-cls{color:#5a6b8c;flex:1 1 auto;}
.en-row .en-noti{font-size:12px;color:#b26a00;background:#fff4e0;border:1px solid #f0d9ae;border-radius:6px;padding:1px 8px;flex:none;}
.en-row .en-noti.ok{color:#1e7e34;background:#e9f7ee;border-color:#bfe5cb;}
/* 查找结果里教官的「登记入校」按钮 */
.s-act.entry{border-color:#bfe5cb;color:#1e7e34;background:#f4fbf6;font-weight:600;}
.s-act.entry:hover{background:#e9f7ee;}
/* 到校提醒弹窗：未读卡片高亮 */
.lv-card.en-unseen{border-color:#9fd8b4;background:#f4fbf6;}
/* 轻量提示（toast） */
.toast{position:fixed;left:50%;bottom:26px;transform:translate(-50%,16px);max-width:min(460px,92vw);padding:10px 16px;background:#243b6b;color:#fff;font-size:13.5px;line-height:1.5;border-radius:10px;box-shadow:0 6px 20px rgba(36,59,107,.35);opacity:0;pointer-events:none;transition:opacity .25s ease,transform .25s ease;z-index:9999;}
.toast.show{opacity:1;transform:translate(-50%,0);}
@media (max-width:640px){
  .ins-stats{grid-template-columns:repeat(3,1fr);gap:7px;}
  .ins-stat{gap:7px;padding:10px 8px;min-height:58px;border-radius:12px;}
  .ins-stat .ins-ico{width:34px;height:34px;border-radius:10px;font-size:16px;}
  .ins-stat b{font-size:19px;}
  .ins-stat .ins-lab{font-size:11px;}
  .ins-sec{padding:10px 11px;}
  .ins-leaves{max-height:none;}
  .en-row{gap:6px;font-size:12.5px;}
  .en-row .en-name{min-width:56px;}
  /* 顶栏标题后缀在窄屏缩小，避免换行拥挤 */
  .title-sub{font-size:12px;margin-left:4px;}
  .title-sub small{display:none;}
}
/* ================= 手机触屏操作优化（2026-10-17·AJ.4） ================= */
/* 去掉双击缩放/点击高亮延迟，按钮最小触控高度 ≥42px，避免误触 */
@media (hover:none) and (pointer:coarse){
  button,.ghost,.primary,.s-act,.ins-more,.lv-tab,.mic,.pick{-webkit-tap-highlight-color:transparent;touch-action:manipulation;}
}
@media (max-width:640px){
  .lv-card-f{gap:8px;}
  .lv-card-f input{min-height:40px;}
  .lv-card-f button{min-height:42px;padding:6px 14px;font-size:13.5px;}
  .lv-tabs{gap:8px;}
  .lv-tab{min-height:40px;padding:6px 14px;}
  .search-item .s-act{min-height:36px;padding:5px 12px;}
  .modal .box{max-height:92vh;overflow-y:auto;-webkit-overflow-scrolling:touch;}
}

/* ================= 座次图请假状态条 + 列表请假按钮（2026-10-17·AJ.2） ================= */
/* 座位卡：拖动把手（⠿，top:2px 起 22px 高）下方的小状态条；同时给边框着色 */
.seat .lv-flag{position:absolute;top:27px;right:2px;z-index:2;font-size:9px;font-weight:600;line-height:1;padding:2px 4px;border-radius:5px;border:1px solid;white-space:nowrap;pointer-events:none;max-width:calc(100% - 4px);overflow:hidden;text-overflow:ellipsis;}
.seat .lv-flag.ok{color:#1e7e34;background:#e9f7ee;border-color:#9fd8b4;}
.seat .lv-flag.warn{color:#b26a00;background:#fff4e0;border-color:#f0d9ae;}
.seat .lv-flag.bad{color:#c0392b;background:#fdecea;border-color:#f0a9a0;}
.seat.lv-ok.filled{border-color:#9fd8b4;}
.seat.lv-warn.filled{border-color:#e6c169;}
.seat.lv-bad.filled{border-color:#f0a9a0;}
/* 学生列表「📝 请假」按钮（拍照旁边） */
.actions .lvbtn{border-color:#f0d9ae;color:#b26a00;background:#fffaf0;}
.actions .lvbtn:hover{background:#fff4e0;}
@media (max-width:640px){
  .seat .lv-flag{font-size:8.5px;padding:2px 3px;}
}

/* ================= 请假表单：缘由选择 + 语音输入（2026-10-17·AJ.3） ================= */
.lv-inrow{display:flex;gap:6px;align-items:center;margin-top:4px;}
.lv-inrow input{flex:1 1 auto;min-width:0;}
.lv-inrow .pick,.lv-inrow .mic{flex:none;width:38px;height:38px;border:1px solid var(--line);background:#fff;border-radius:9px;font-size:16px;line-height:1;cursor:pointer;display:flex;align-items:center;justify-content:center;padding:0;}
.lv-inrow .pick:hover,.lv-inrow .mic:hover{background:#eef3fd;border-color:#b9cdf0;}
.lv-inrow .mic.listening{background:#fdecea;border-color:#f0a9a0;color:#c0392b;animation:micPulse 1s ease-in-out infinite;}
@keyframes micPulse{0%,100%{box-shadow:0 0 0 0 rgba(192,57,43,.4);}50%{box-shadow:0 0 0 5px rgba(192,57,43,0);}}
.lv-pickmenu{position:relative;margin-top:6px;border:1px solid var(--line);border-radius:10px;background:#fff;box-shadow:0 8px 22px rgba(20,40,80,.14);overflow:hidden;max-width:340px;}
.lv-pickmenu button{display:block;width:100%;text-align:left;border:0;background:#fff;padding:9px 12px;font-size:13.5px;color:#243b6b;cursor:pointer;border-bottom:1px solid #f0f3f8;}
.lv-pickmenu button:last-child{border-bottom:0;}
.lv-pickmenu button:hover{background:#eef3fd;}
.lv-reason-fld{position:relative;}
@media (max-width:640px){
  .lv-inrow .pick,.lv-inrow .mic{width:42px;height:42px;}
  .lv-pickmenu{max-width:100%;}
}

/* ================= 缩略图入校标识 + 请假取消入校提醒 + 安全加固（2026-10-17·AJ.5） ================= */
/* 座次图请假状态条：班主任可点击（给该生请假） */
.seat .lv-flag.clickable{cursor:pointer;border-style:dashed;pointer-events:auto;}
.seat .lv-flag.clickable:hover{filter:brightness(.96);}
/* 座次图「🚪已入校」标识：照片左下角，青色系；可点击取消（恢复正常状态） */
.seat .en-flag{position:absolute;left:2px;bottom:22px;z-index:2;font-size:9px;font-weight:600;line-height:1;padding:2px 4px;border-radius:5px;border:1px solid #9fd0e8;color:#0d6a94;background:#e8f5fb;white-space:nowrap;pointer-events:auto;max-width:calc(100% - 4px);overflow:hidden;text-overflow:ellipsis;}
.seat .en-flag.clickable{cursor:pointer;border-style:dashed;}
.seat .en-flag.clickable:hover{background:#d8ecf7;}
.seat.has-entry.filled{border-color:#9fd0e8;}
/* 请假弹窗：「同时取消入校提醒」选项 */
.lv-entry-tip{margin:8px 0 2px;padding:9px 11px;border:1px solid #f0d9ae;border-radius:10px;background:#fffaf0;}
.lv-entry-chk{display:flex;align-items:flex-start;gap:8px;font-size:13px;color:#7a5b23;cursor:pointer;line-height:1.55;}
.lv-entry-chk input{flex:none;width:17px;height:17px;margin-top:1px;}
.lv-entry-chk b{color:#b26a00;}
/* 入校提醒弹窗：已取消记录灰化 */
.lv-card.en-cancelled{opacity:.62;background:#f7f8fa;}
.lv-card.en-cancelled .lv-card-h b{color:#8a94a6;text-decoration:line-through;}
.en-row.en-cancelled{opacity:.55;}
.en-row.en-cancelled .en-name{text-decoration:line-through;}
@media (max-width:640px){
  .seat .en-flag{font-size:8.5px;padding:2px 3px;bottom:20px;}
  .lv-entry-chk{font-size:12.5px;}
}

/* ================= 家长中心 / 操作日志 / 登录门禁（2026-10-18·AK） ================= */
.parent-view{max-width:880px;margin:18px auto;padding:0 14px;}
.pv-head{display:flex;align-items:baseline;gap:12px;margin-bottom:14px;}
.pv-head h2{margin:0;font-size:22px;}
.pv-sub{color:#6b7686;font-size:14px;}
.pv-kids{display:grid;grid-template-columns:repeat(auto-fill,minmax(260px,1fr));gap:14px;margin-bottom:18px;}
.pv-kid{display:flex;gap:14px;align-items:center;background:#fff;border:1px solid var(--line,#dde3ec);border-radius:14px;padding:14px;box-shadow:0 2px 8px rgba(20,40,80,.05);}
.pv-kid-photo{width:64px;height:64px;border-radius:12px;overflow:hidden;background:#eef2f7;display:flex;align-items:center;justify-content:center;font-size:34px;flex:none;}
.pv-kid-photo img{width:100%;height:100%;object-fit:cover;}
.pv-kid-info{min-width:0;}
.pv-kid-name{font-size:17px;font-weight:700;}
.pv-kid-meta{color:#5b6675;font-size:13px;margin-top:2px;}
.pv-kid-ic{color:#9aa3b0;font-size:12px;margin-top:4px;letter-spacing:.3px;}
.pv-coming{display:grid;grid-template-columns:repeat(auto-fill,minmax(220px,1fr));gap:14px;}
.pv-card{background:#f6f8fb;border:1px dashed #cfd8e3;border-radius:14px;padding:16px;}
.pv-card.pv-go{cursor:pointer;border-style:solid;border-color:#bcd0ee;background:#eef4ff;transition:transform .15s,border-color .15s,box-shadow .15s;text-align:left;font:inherit;color:inherit;width:100%;}
.pv-card.pv-go:hover{border-color:var(--primary,#3b6ef0);box-shadow:0 4px 14px rgba(40,80,180,.12);transform:translateY(-1px);}
.pv-card.pv-go:active{transform:translateY(0);}
.pv-ico{font-size:26px;}
.pv-t{font-weight:700;margin:8px 0 4px;}
.pv-d{color:#6b7686;font-size:13px;line-height:1.6;}
.audit-list{max-height:50vh;overflow:auto;border:1px solid var(--line,#dde3ec);border-radius:10px;}
.audit-row{display:grid;grid-template-columns:160px 120px 110px 1fr;gap:10px;padding:8px 12px;border-bottom:1px solid #eef1f5;font-size:13px;align-items:start;}
.audit-row span{word-break:break-all;}
.audit-head{position:sticky;top:0;background:#eef3f9;font-weight:700;color:#445;z-index:1;}
.gate-days{display:flex;flex-direction:column;gap:8px;margin:12px 0;}
.gate-day{display:flex;align-items:center;gap:14px;background:#f6f8fb;border:1px solid var(--line,#dde3ec);border-radius:10px;padding:8px 12px;}
.gd-name{width:46px;font-weight:600;}
.gd-lab{display:inline-flex;align-items:center;gap:5px;font-size:13px;color:#5b6675;}
.gd-lab input{width:auto;padding:5px 6px;margin:0;}
.switch{display:inline-flex;align-items:center;gap:7px;font-weight:600;cursor:pointer;margin:6px 0;font-size:14px;}
.switch input{width:17px;height:17px;}
/* ===== 成绩分析中心 ===== */
.score-view{max-width:1180px;margin:0 auto;padding:14px 16px 40px;}
.sv-head{display:flex;align-items:baseline;gap:12px;flex-wrap:wrap;margin-bottom:10px;}
.sv-head h2{font-size:21px;margin:0;}
.sv-sub{color:#7a8699;font-size:13px;}
.sv-controls{display:flex;align-items:center;gap:10px;flex-wrap:wrap;padding:10px 12px;background:#fff;border:1px solid #e6ebf2;border-radius:12px;margin-bottom:14px;box-shadow:0 1px 3px rgba(20,40,80,.04);}
.sv-lab{display:inline-flex;align-items:center;gap:6px;font-size:13px;color:#43506a;font-weight:600;}
.sv-lab select,.sv-lab input{padding:7px 9px;border:1px solid #cfd8e6;border-radius:8px;font-size:13px;min-width:140px;}
.sv-body{min-height:120px;}
.sv-stat{display:grid;grid-template-columns:repeat(5,1fr);gap:10px;margin:6px 0 16px;}
.sv-stat-card{background:#f6f9ff;border:1px solid #e2ebfb;border-radius:12px;padding:12px;text-align:center;}
.sv-stat-card b{display:block;font-size:24px;color:#2563eb;line-height:1.1;}
.sv-stat-card span{font-size:12px;color:#6b7790;}
.sv-tbl{width:100%;border-collapse:collapse;margin:8px 0 14px;font-size:13px;background:#fff;border-radius:10px;overflow:hidden;box-shadow:0 1px 3px rgba(20,40,80,.05);}
.sv-tbl th{background:#eef3fb;color:#42506a;font-weight:600;padding:8px 10px;text-align:left;}
.sv-tbl td{padding:7px 10px;border-top:1px solid #eef1f6;}
.sv-chart{background:#fff;border:1px solid #e9eef5;border-radius:12px;padding:14px;margin:10px 0 18px;height:340px;}
.sv-chart canvas{max-height:300px;}
.sv-act{display:flex;gap:8px;align-items:flex-start;margin:10px 0;flex-wrap:wrap;}
.sv-act textarea{flex:1;min-width:240px;min-height:54px;padding:9px 11px;border:1px solid #cfd8e6;border-radius:10px;font-size:13px;resize:vertical;}
.sv-kid{background:#fff;border:1px solid #e7edf6;border-radius:14px;padding:14px 16px;margin-bottom:16px;box-shadow:0 1px 3px rgba(20,40,80,.05);}
.sv-kid h4{margin:0 0 8px;font-size:16px;color:#2b3a55;}
.sv-kid .sv-chart{height:300px;}
/* 管理员成绩管理面板 */
#admPaneScore .row{display:flex;gap:10px;align-items:center;flex-wrap:wrap;margin:10px 0;}
#admPaneScore input,#admPaneScore select,#admPaneScore textarea{padding:8px 10px;border:1px solid #cfd8e6;border-radius:9px;font-size:13px;}
#admPaneScore textarea{min-height:120px;width:100%;font-family:ui-monospace,Menlo,Consolas,monospace;font-size:13px;line-height:1.5;}
#admPaneScore .ex-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(180px,1fr));gap:10px;align-items:end;}
#admPaneScore .ex-grid label{display:flex;flex-direction:column;gap:4px;font-size:12px;color:#5b6675;font-weight:600;}
#admPaneScore .ex-list{display:flex;flex-wrap:wrap;gap:8px;margin:8px 0;}
#admPaneScore .ex-chip{background:#eef3fb;border:1px solid #d8e2f3;border-radius:20px;padding:5px 12px;font-size:13px;color:#33507f;}
@media (max-width:640px){
  .audit-row{grid-template-columns:110px 84px 84px 1fr;font-size:12px;padding:7px 8px;}
  .pv-head h2{font-size:19px;}
  .sv-stat{grid-template-columns:repeat(2,1fr);}
  .sv-chart{height:300px;}
  .sv-lab select,.sv-lab input{min-width:120px;}
}

/* ================= 学生操作浮层（座次图点学生弹出：拍照/请假/调班/移出座位） ================= */
.seat-acts-mask{position:fixed;inset:0;background:rgba(10,20,40,.20);z-index:150;display:none;}
.seat-acts-mask.on{display:block;}
.seat-acts{position:fixed;left:0;top:0;z-index:151;min-width:230px;max-width:min(330px,92vw);background:#fff;border:1px solid var(--line);border-radius:12px;box-shadow:0 14px 36px rgba(15,23,42,.24);padding:10px 10px 12px;display:none;}
.seat-acts.on{display:block;}
.seat-acts .sa-head{display:flex;align-items:center;flex-wrap:wrap;gap:4px 8px;margin-bottom:9px;}
.seat-acts .sa-name{font-size:15px;color:#1f2937;}
.seat-acts .sa-meta{font-size:11.5px;color:var(--muted);line-height:1.4;}
.seat-acts .sa-x{margin-left:auto;border:none;background:none;color:var(--muted);font-size:13px;line-height:1;cursor:pointer;padding:3px 7px;border-radius:6px;flex:none;}
.seat-acts .sa-x:hover{background:#eef2f7;color:#334155;}
.seat-acts .sa-btns{display:grid;grid-template-columns:1fr 1fr;gap:8px;}
.seat-acts .sa-btns button{justify-content:center;font-size:13.5px;padding:9px 6px;}
.seat-acts .sa-btns .lvbtn{border-color:#f0d9ae;color:#b26a00;background:#fffaf0;}
.seat-acts .sa-btns .lvbtn:hover{background:#fff4e0;}
.seat-acts .sa-btns .sa-tip{grid-column:1 / -1;font-size:12.5px;color:var(--muted);line-height:1.6;}
@media (max-width:640px){
  .seat-acts{left:50% !important;top:auto !important;bottom:calc(14px + env(safe-area-inset-bottom,0px));transform:translateX(-50%);width:min(340px,94vw);max-width:94vw;}
  .seat-acts .sa-btns button{padding:12px 6px;font-size:14.5px;}
}

/* ================= 体测信息与实际班级不一致提示（需求4 反向：头像角标） ================= */
/* 座次图：学生照片右上角标「体测⚠」，红=严重不一致（记录挂错班/姓名不符/已不在花名册），黄=待核对 */
.seat .pe-flag{position:absolute;top:2px;right:2px;z-index:4;font-size:9px;font-weight:700;line-height:1;padding:2px 4px;border-radius:6px;border:1px solid #f0a9a0;color:#fff;background:rgba(192,57,43,.92);white-space:nowrap;pointer-events:auto;box-shadow:0 1px 3px rgba(0,0,0,.28);}
.seat .pe-flag.warn{background:rgba(214,158,46,.94);border-color:#f0d08a;}
.seat.pe-mis-err{border-color:#e06a5c !important;box-shadow:0 0 0 2px rgba(224,106,92,.22) inset;}
.seat.pe-mis-warn{border-color:#e8b451 !important;box-shadow:0 0 0 2px rgba(232,180,81,.2) inset;}
@media (max-width:640px){
  .seat .pe-flag{font-size:8px;padding:1px 3px;}
}
