:root{
  --navy:#16325c; --navy2:#1e4b8f; --blue:#2b6cb0; --blue2:#3182ce;
  --bg:#f4f6f9; --card:#fff; --line:#e3e8ef; --txt:#1a2333; --muted:#7a8699;
  --dark:#0d1420; --darkcard:#141d2e; --darkline:#26314a;
}
*{box-sizing:border-box;margin:0;padding:0}
/* 老板 2026-09-17 08:14：手机端日期/时间框会往右冒出容器（iOS 原生控件有固有最小宽度）
   → 全局兜底：这类 input 不许宽过父容器，也不许被固有最小宽度顶破。
   ⚠ 不加 -webkit-appearance:none：部分 iOS 版本会导致日期显示异常，风险大于收益 */
input[type="date"],input[type="time"],input[type="datetime-local"]{
  max-width:100%;min-width:0}
html,body{height:100%}
body{min-height:100vh;display:flex;flex-direction:column}
html{scrollbar-width:none}
html::-webkit-scrollbar{display:none}
body{font-family:"Microsoft YaHei","PingFang SC","Noto Sans SC",-apple-system,sans-serif;color:var(--txt);background:var(--bg);font-size:14px}
button{font-family:inherit;cursor:pointer;border:none}
input{font-family:inherit}
a{color:var(--blue);text-decoration:none}

/* ============ 登录页(暗色) ============ */
#screen-login{position:fixed;inset:0;background:radial-gradient(1200px 700px at 50% -10%,#1b2c4e 0%,#0d1420 55%);display:flex;flex-direction:column;align-items:center;justify-content:center;z-index:50;padding:24px 16px;overflow-y:auto;-webkit-overflow-scrolling:touch}
.login-card{position:relative;z-index:1;width:360px;margin:auto;padding:38px 34px;background:rgba(20,29,46,.72);border:1px solid #26314a;border-radius:16px;backdrop-filter:blur(8px)}
.login-badge{display:inline-block;font-size:12px;color:#8fa0bd;border:1px solid #33415f;border-radius:20px;padding:3px 10px;margin-bottom:18px}
.login-logo{display:block;height:46px;width:auto;margin:0 auto 24px;filter:drop-shadow(0 0 1px rgba(255,255,255,.95)) drop-shadow(0 0 2px rgba(255,255,255,.75)) drop-shadow(0 0 7px rgba(49,130,206,.55))}
.login-card h1{color:#fff;font-size:22px;font-weight:600;margin-bottom:6px}
.login-sub{color:#7f8fae;font-size:13px;margin-bottom:26px}
.field{margin-bottom:16px}
.field label{display:block;color:#aeb9d0;font-size:12px;margin-bottom:7px}
.field input{width:100%;padding:12px 14px;background:#0e1626;border:1px solid #2c3a58;border-radius:9px;color:#fff;font-size:14px;outline:none;transition:.2s}
.field input:focus{border-color:var(--blue2)}
.btn-login{width:100%;padding:13px;background:linear-gradient(135deg,#2f7bd6,#1d5cb8);color:#fff;font-size:15px;font-weight:600;border-radius:9px;margin-top:8px;display:flex;align-items:center;justify-content:center;gap:6px}
.btn-login:hover{filter:brightness(1.08)}
.remember{display:flex;align-items:center;gap:7px;margin:4px 0 0;font-size:12px;color:#aeb9d0;cursor:pointer;user-select:none}
.remember input{width:14px;height:14px;accent-color:var(--blue2);cursor:pointer}
.login-err{color:#ff7d7d;font-size:12px;margin-top:10px;min-height:16px}
.login-hint{color:#5f6f8e;font-size:11px;margin-top:14px;text-align:center}

/* ============ 登录成功过渡页(暗色) ============ */
#screen-success{position:fixed;inset:0;background:#0d1420;display:none;align-items:center;justify-content:center;z-index:50}
.success-box{text-align:center}
.success-check{position:relative;width:80px;height:80px;margin:0 auto 24px}
.sc-pulse{position:absolute;inset:0;border-radius:50%;border:2px solid #48bb78;animation:scPulse 1.8s ease-out infinite}
.sc-mark{position:absolute;inset:0;display:flex;align-items:center;justify-content:center;border-radius:50%;background:rgba(72,187,120,.16);border:2px solid #48bb78;color:#48bb78;font-size:38px;animation:scPop .5s cubic-bezier(.68,-0.55,.27,1.55)}
@keyframes scPulse{0%{transform:scale(.75);opacity:.9}100%{transform:scale(1.65);opacity:0}}
@keyframes scPop{0%{transform:scale(.3);opacity:0}100%{transform:scale(1);opacity:1}}
.success-verify{color:#5aa8ff;font-size:15px;margin-bottom:8px;animation:fadeUp .5s .1s both}
.success-title{color:#fff;font-size:26px;font-weight:600;margin-bottom:10px;animation:fadeUp .5s .2s both}
.success-sub{color:#7f8fae;font-size:13px;animation:fadeUp .5s .3s both}
@keyframes fadeUp{0%{opacity:0;transform:translateY(8px)}100%{opacity:1;transform:translateY(0)}}
.success-bar{width:190px;height:3px;margin:20px auto 0;border-radius:3px;background:rgba(255,255,255,.08);overflow:hidden}
.success-bar::after{content:'';display:block;height:100%;width:45%;border-radius:3px;background:linear-gradient(90deg,#2f7bd6,#5aa8ff);animation:slide 1.1s ease-in-out infinite}

/* ============ 主应用 ============ */
#screen-app{display:none;flex-direction:column;flex:1 1 auto;min-height:0;height:100%}.topbar{height:56px;background:var(--card);border-bottom:1px solid var(--line);display:flex;align-items:center;padding:0 20px;gap:14px;flex-shrink:0;position:sticky;top:0;z-index:100}
.logo{display:flex;align-items:center;gap:9px;font-weight:700;color:var(--navy);font-size:16px}
.logo .mark{width:26px;height:26px;border-radius:6px;background:linear-gradient(135deg,#2f7bd6,#1d5cb8);color:#fff;display:flex;align-items:center;justify-content:center;font-size:14px}
.logo-img{height:30px;width:auto;display:block}
.topbar .title{font-size:15px;color:var(--txt);font-weight:600;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;min-width:0}
.nav{display:flex;gap:4px;margin-left:18px}
.nav a{padding:7px 16px;border-radius:8px;color:var(--muted);font-size:14px;white-space:nowrap;cursor:pointer;transition:background .15s ease,color .15s ease}
.nav a:hover{color:var(--navy);background:#f2f6fc}
.nav a.active{color:var(--navy);background:#eef3fb;font-weight:600;border-bottom:2px solid var(--blue2)}
.topbar .spacer{flex:1}
.btn-ghost{padding:7px 13px;border:1px solid var(--line);border-radius:8px;color:var(--muted);background:#fff;font-size:13px}
.btn-ghost:hover{color:var(--navy)}
.user-wrap{position:relative}
.user-chip{display:flex;align-items:center;gap:8px;padding:4px 10px 4px 5px;border:1px solid var(--line);border-radius:20px;background:#fff;cursor:pointer;transition:.15s}
.user-chip:hover{border-color:var(--blue2)}
.user-avatar{width:26px;height:26px;border-radius:50%;background:linear-gradient(135deg,#2f7bd6,#1d5cb8);color:#fff;display:flex;align-items:center;justify-content:center;font-size:13px;font-weight:700;flex-shrink:0}
.user-name{font-size:13px;color:var(--navy);font-weight:600;white-space:nowrap}
.user-caret{font-size:9px;color:var(--muted);margin-left:1px}
.user-menu{position:absolute;top:42px;right:0;background:#fff;border:1px solid var(--line);border-radius:12px;box-shadow:0 10px 34px rgba(0,0,0,.14);min-width:190px;display:none;z-index:300;overflow:hidden}
.user-menu.show{display:block}
.um-head{padding:12px 14px;border-bottom:1px solid var(--line);background:#f7f9fc}
.um-name{font-size:14px;font-weight:700;color:var(--navy)}
.um-phone{font-size:12px;color:var(--muted);margin-top:2px}
.um-item{display:block;width:100%;text-align:left;padding:11px 14px;border:none;background:#fff;color:var(--txt);font-size:14px;cursor:pointer;transition:.12s}
.um-item:hover{background:#f5f8fd}
.um-item.danger{color:#c0392b}
.um-item.danger:hover{background:#fdf2f2}

.main{padding:20px;max-width:1440px;margin:0 auto;width:100%;flex:1 1 auto;display:flex;flex-direction:column}
.main > .site-footer{margin-top:auto}
.page{display:none}
.page.active{display:block}

/* 岗位查询 布局 */
.query-wrap{display:flex;gap:18px;align-items:flex-start}
.panel-filter{width:300px;flex-shrink:0;background:var(--card);border:1px solid var(--line);border-radius:12px;padding:20px}
.panel-title{font-size:15px;font-weight:700;color:var(--navy);margin-bottom:16px;display:flex;align-items:center;justify-content:space-between}
.panel-title .reset{font-size:12px;color:var(--blue);font-weight:400;cursor:pointer}
.fgroup{margin-bottom:18px}
.fgroup .flabel{font-size:13px;color:var(--txt);font-weight:600;margin-bottom:9px}
.btn-group{display:flex;gap:7px;flex-wrap:wrap}
.opt{padding:7px 14px;border:1px solid var(--line);border-radius:8px;background:#fafbfd;color:var(--muted);font-size:13px;transition:background .15s ease,border-color .15s ease,color .15s ease}
.opt:hover{border-color:var(--blue2);color:var(--navy);background:#f2f6fc}
.opt.on{background:var(--navy);color:#fff;border-color:var(--navy)}
.opt:disabled{opacity:.45;cursor:not-allowed}
.year-switch{margin-top:10px}
.finput{width:100%;padding:10px 12px;border:1px solid var(--line);border-radius:8px;font-size:13px;outline:none}
.finput:focus{border-color:var(--blue2)}
.fhint{font-size:11px;color:var(--muted);margin-top:6px}
/* 角色管理：占位页 */
.role-ph{text-align:center;padding:60px 20px;color:var(--muted)}
.role-ph-ico{font-size:46px;line-height:1;margin-bottom:14px;opacity:.55}
.role-ph-t{font-size:17px;font-weight:700;color:var(--navy);margin-bottom:10px}
.role-ph-hint{font-size:13px;line-height:1.9}

/* 签到明细：左右分栏（复用学生查询的 .query-wrap/.panel-filter/.panel-result） */
#al-wrap{align-items:flex-start}
#al-wrap .panel-result{padding:20px}
/* 签到明细 · 手机：筛选栏撑满 + 结果区撑满，上下堆叠；表格内部横滑
   （2026-10-08 老板实测：原先筛选栏固定 300px，手机挤不下 → 字竖排成一条） */
@media(max-width:900px){
  /* 手机上直接改块级布局：避免 flex column + width:100% 互算导致容器塔缩成 51px */
  #al-wrap{display:block}
  #al-wrap .panel-filter{width:auto;flex-shrink:1;box-sizing:border-box}
  #al-wrap .panel-result{width:auto;box-sizing:border-box}
  #al-wrap .ov-table{overflow-x:auto;-webkit-overflow-scrolling:touch}
  #al-wrap .ov-tb{min-width:640px}
}
/* 排座：按录入座位号排座后的「未排座明细」 */
.seat-no-detail{background:#fff8ec;border:1px solid #ffd591;border-radius:9px;
  padding:9px 12px;margin-bottom:10px;font-size:12px;line-height:1.7;color:#8a5300;max-height:130px;overflow:auto}
.seat-no-detail .snd-title{font-weight:600;margin-bottom:3px}
.seat-no-detail .snd-row b{color:#7a4a00}
/* 学生查询：结果计数条 + 未查询空态 */
.res-head{font-size:13px;color:var(--muted);margin-bottom:10px}
.res-head b{color:var(--txt);font-size:15px}
.res-empty{color:var(--muted);text-align:center;padding:34px 0}
.fcheck{display:flex;align-items:center;gap:6px;margin-top:8px;font-size:12px;color:var(--navy);cursor:pointer;user-select:none}
.fcheck input{width:14px;height:14px;accent-color:var(--blue);cursor:pointer}
.more-toggle{padding:10px 14px;border:1px dashed var(--line);border-radius:9px;color:var(--blue);font-size:13px;font-weight:600;cursor:pointer;user-select:none;display:flex;align-items:center;justify-content:space-between;transition:background .15s ease,border-color .15s ease}
.more-toggle:hover{background:#f7f9fc;border-color:#9dc0ea}
#more-panel{margin-top:12px;padding-top:4px;border-top:1px solid #eef1f6}
.btn-query{width:100%;padding:13px;background:linear-gradient(135deg,#2f7bd6,#1d5cb8);color:#fff;font-size:15px;font-weight:600;border-radius:9px;margin-top:4px;transition:filter .15s ease,transform .15s ease}
.btn-query:hover{filter:brightness(1.08)}
.btn-query:active{transform:translateY(1px)}

.panel-result{flex:1;min-width:0;background:var(--card);border:1px solid var(--line);border-radius:12px;padding:20px}
.tabs{display:flex;gap:6px;border-bottom:1px solid var(--line);margin-bottom:18px}
.tab{padding:9px 18px;color:var(--muted);font-size:14px;border-bottom:2px solid transparent;cursor:pointer}
.tab.active{color:var(--navy);font-weight:700;border-bottom-color:var(--blue2)}
.summary-cards{display:grid;grid-template-columns:repeat(3,1fr);gap:12px;margin-bottom:16px}
.scard{background:#f7f9fc;border:1px solid var(--line);border-radius:10px;padding:14px}
.scard .k{font-size:12px;color:var(--muted)}
.scard .v{font-size:22px;font-weight:700;color:var(--navy);margin-top:4px}
.scard .s{font-size:11px;color:var(--muted);margin-top:2px}
.empty-state{text-align:center;padding:70px 0;color:var(--muted)}
.empty-state .big{font-size:18px;color:var(--txt);margin-bottom:8px}
.result-table{width:100%;border-collapse:collapse;font-size:13px}
.result-table th{background:#f2f5fa;color:var(--muted);font-weight:600;text-align:left;padding:10px 10px;border-bottom:1px solid var(--line);white-space:nowrap}
.result-table td{padding:10px;border-bottom:1px solid #eef1f6;vertical-align:top}
.result-table tr:hover td{background:#f8fafd}
.tag{display:inline-block;padding:2px 8px;border-radius:5px;font-size:11px;background:#eef3fb;color:var(--blue)}
.tag.green{background:#e8f6ef;color:#2f855a}
.tag.orange{background:#fdf3e7;color:#c05621}
.comp{font-weight:700;color:#c05621}
.count-row{display:flex;justify-content:space-between;align-items:center;margin-bottom:14px}
.count-row .total{font-size:13px;color:var(--muted)}
.count-row .total b{color:var(--navy)}

/* 数据总览 */
.overview-head{display:flex;align-items:flex-end;justify-content:space-between;margin-bottom:18px}
.overview-head h2{font-size:19px;color:var(--navy);font-weight:700}
.overview-head .sub{font-size:13px;color:var(--muted);margin-top:4px}
.big-nums{display:flex;gap:12px}
.bignum{background:var(--card);border:1px solid var(--line);border-radius:12px;padding:14px 22px;text-align:center}
.bignum .v{font-size:26px;font-weight:700;color:var(--navy)}
.bignum .k{font-size:12px;color:var(--muted)}
.cards3{display:grid;grid-template-columns:repeat(3,1fr);gap:14px;margin-bottom:16px}
.card3{background:var(--card);border:1px solid var(--line);border-radius:12px;padding:20px;text-align:center}
.card3 .v{font-size:30px;font-weight:700;color:var(--navy)}
.card3 .k{font-size:13px;color:var(--muted);margin-top:4px}
.cards6{display:grid;grid-template-columns:repeat(6,1fr);gap:12px;margin-bottom:18px}
.card6{background:var(--card);border:1px solid var(--line);border-radius:12px;padding:16px}
.card6 .v{font-size:22px;font-weight:700;color:var(--navy)}
.card6 .k{font-size:12px;color:var(--muted);margin-top:4px}
.grid2{display:grid;grid-template-columns:1fr 1fr;gap:14px}
.panel{background:var(--card);border:1px solid var(--line);border-radius:12px;padding:18px;margin-bottom:14px}
.panel h3{font-size:15px;font-weight:700;color:var(--navy);margin-bottom:14px}
.panel h3 .tag-right{float:right;font-size:12px;color:var(--muted);font-weight:400}

/* 条形图 */
.bar-row{display:flex;align-items:center;gap:10px;margin-bottom:10px}
.bar-row .lbl{width:110px;font-size:12px;color:var(--muted);text-align:right;flex-shrink:0}
.bar-track{flex:1;height:18px;background:#eef1f6;border-radius:5px;overflow:hidden}
.bar-fill{height:100%;background:linear-gradient(90deg,#3b82d4,#1d5cb8);border-radius:5px}
.bar-row .val{min-width:150px;font-size:12px;color:var(--txt);flex-shrink:0;white-space:nowrap;text-align:right}

/* 环形图(竞争比分布) */
.ring-wrap{display:flex;align-items:center;gap:20px}
.ring{width:150px;height:150px;border-radius:50%;flex-shrink:0}
.legend{flex:1}
.legend .li{display:flex;align-items:center;gap:8px;margin-bottom:8px;font-size:13px}
.legend .dot{width:10px;height:10px;border-radius:50%;flex-shrink:0}
.legend .li .pct{margin-left:auto;color:var(--muted);font-size:12px}

.float-top{position:fixed;right:24px;bottom:24px;width:42px;height:42px;border-radius:50%;background:var(--card);border:1px solid var(--line);color:var(--muted);font-size:18px;box-shadow:0 4px 14px rgba(0,0,0,.1);display:none;align-items:center;justify-content:center}

@media(max-width:900px){.query-wrap{flex-direction:column}.panel-filter{width:100%}.cards6{grid-template-columns:repeat(3,1fr)}.grid2{grid-template-columns:1fr}.ring-wrap{flex-direction:column;align-items:center}}

/* ===== 平板/折叠屏：topbar 两行布局 ===== */
@media(max-width:1024px){
  .topbar{height:auto;min-height:56px;padding:8px 16px;gap:6px 14px;flex-wrap:wrap}
  .topbar .title{font-size:14px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;min-width:0}
  .topbar .btn-ghost{display:none}
  /* 导航项多时横向滑动，不换行 */
  .nav{order:10;width:100%;margin-left:0;gap:2px;flex-wrap:nowrap;overflow-x:auto;overflow-y:hidden;-webkit-overflow-scrolling:touch;scrollbar-width:none}
  .nav::-webkit-scrollbar{display:none}
  .nav a{padding:6px 10px;font-size:13px;white-space:nowrap;flex:0 0 auto}
  .user-name{display:none}
  .user-caret{display:none}
}
/* ===== 移动端 ===== */
@media(max-width:768px){
  .topbar{padding:8px 12px;gap:6px 8px}
  .topbar .title{font-size:13px}
  .logo-img{height:22px}
  .nav a{padding:6px 8px;font-size:12px}
  .user-chip{padding:3px 5px;border:none;background:transparent}
  .main{padding:12px}
  .panel-filter,.panel-result{padding:14px}
  .cards3{grid-template-columns:repeat(3,1fr);gap:8px}
  .card3{padding:14px 8px}
  .card3 .v{font-size:22px}
  .card3 .k{font-size:12px}
  .cards6{grid-template-columns:repeat(2,1fr);gap:8px}
  .card6{padding:12px}
  .card6 .v{font-size:19px}
  .summary-cards{grid-template-columns:repeat(3,1fr);gap:8px}
  .scard{padding:10px}
  .scard .v{font-size:17px}
  .scard .s{font-size:10px}
  .overview-head{flex-direction:column;align-items:flex-start;gap:12px}
  .big-nums{width:100%;display:grid;grid-template-columns:1fr 1fr;gap:10px}
  .bignum{padding:12px 10px}
  .bignum .v{font-size:20px}
  .bar-row .lbl{width:78px;font-size:11px;text-align:left}
  .bar-row .val{font-size:11px;white-space:normal;line-height:1.4}
  .login-card{width:88%;padding:30px 22px}
  .result-table{font-size:12px}
  .result-table th,.result-table td{padding:8px 6px}
  .float-top{right:14px;bottom:14px}
}
@media(max-width:400px){
  .cards6{grid-template-columns:1fr 1fr}
  .logo{font-size:14px}
  .bar-row .lbl{width:64px}
}

/* ============ 报告页：三类岗位卡 ============ */
.cat-cards{display:grid;grid-template-columns:repeat(3,1fr);gap:12px;margin-bottom:16px}
.cat-card{background:#f7f9fc;border:1px solid var(--line);border-radius:12px;padding:16px;cursor:pointer;transition:.15s;position:relative}
.cat-card:hover{border-color:var(--blue2);box-shadow:0 3px 12px rgba(22,50,92,.08)}
.cat-card.on{border-color:var(--blue2);background:#eef4fc}
.cat-card .k{font-size:13px;color:var(--muted);font-weight:600}
.cat-card .v{font-size:28px;font-weight:700;color:var(--navy);margin-top:4px}
.cat-card .v .pend{font-size:12px;font-weight:400;color:var(--muted);margin-left:8px}
.cat-card .s{font-size:11px;color:var(--muted);margin-top:2px}

/* ============ 4 指标卡 ============ */
.report-cta{display:flex;align-items:center;gap:12px;margin-bottom:14px;flex-wrap:wrap}
.report-cta .btn-report{flex:0 0 auto}
.btn-report{padding:11px 20px;background:linear-gradient(135deg,#2f7bd6,#1d5cb8);color:#fff;font-size:14px;font-weight:600;border-radius:9px;border:none;cursor:pointer;box-shadow:0 2px 8px rgba(29,92,184,.25)}
.btn-report:active{transform:scale(.98)}
.btn-report-export{background:linear-gradient(135deg,#1f9d68,#147a50);box-shadow:0 2px 8px rgba(20,122,80,.25)}
.report-cta-hint{font-size:12px;color:var(--muted)}
.metric-cards{display:grid;grid-template-columns:repeat(4,1fr);gap:12px;margin-bottom:16px}
.metric-card{background:#f7f9fc;border:1px solid var(--line);border-radius:12px;padding:16px;border-top:3px solid var(--navy)}
.metric-card.match{border-top-color:#2f855a}
.metric-card.pending{border-top-color:#c05621}
.metric-card.cur{border-top-color:var(--navy)}
.metric-card.recruit{border-top-color:var(--blue2)}
.metric-card .v{font-size:26px;font-weight:700;color:var(--navy)}
.metric-card .v .mv-unit{font-size:13px;font-weight:500;color:#8a97ad;margin-left:4px}
.metric-card.match .v{color:#2f855a}
.metric-card.pending .v{color:#c05621}
.metric-card.recruit .v{color:var(--blue2)}
.metric-card .k{font-size:12px;color:var(--muted);margin-top:4px}

/* ============ 7 下拉快速筛选 ============ */
.quick-filters{display:flex;flex-wrap:wrap;gap:10px;padding:14px;background:#f7f9fc;border:1px solid var(--line);border-radius:10px;margin-bottom:12px}
.quick-filters label{display:flex;align-items:center;gap:6px;font-size:12px;color:var(--muted)}
.quick-filters select{padding:6px 10px;border:1px solid var(--line);border-radius:7px;font-size:12px;color:var(--txt);background:#fff;outline:none;cursor:pointer}
.quick-filters select:focus{border-color:var(--blue2)}
.quick-filters select:disabled{background:#f0f2f6;color:#aab3c0;cursor:not-allowed}

/* 排除提示 */
.excluded-note{font-size:12px;color:var(--muted);margin:4px 2px 14px}
.excluded-note b{color:#c05621}

/* 通用 */
.muted-note{font-size:11px;color:var(--muted);margin-top:8px}

/* 同岗常见专业 */
.co-majors{margin-top:4px}

/* 补充报考信息 */
.suggest-list{display:flex;flex-direction:column;gap:10px}
.suggest-item{background:#f7f9fc;border:1px solid var(--line);border-radius:9px;padding:12px 14px}
.suggest-item .st{font-size:13px;color:var(--txt)}
.suggest-item .st b{color:var(--navy)}
.suggest-item .sv{font-size:12px;color:#2f855a;margin-top:4px;font-weight:600}

/* ============ 岗位卡片列表 ============ */
.job-group{margin-bottom:18px}
.job-group-head{display:flex;align-items:baseline;gap:10px;margin-bottom:12px;padding-bottom:8px;border-bottom:1px solid var(--line)}
.job-group-head .gt{font-size:15px;font-weight:700;color:var(--navy)}
.job-group-head .gc{font-size:12px;color:var(--muted)}
.job-grid{display:grid;grid-template-columns:repeat(2,1fr);gap:12px}
.job-card{background:#fff;border:1px solid var(--line);border-radius:12px;padding:16px;display:flex;flex-direction:column;gap:8px;transition:.15s}
.job-card:hover{border-color:var(--blue2);box-shadow:0 4px 14px rgba(22,50,92,.08)}
.job-card.pending{border-left:3px solid #e6a23c}
.job-card.match{border-left:3px solid #2f855a}
.jc-top{display:flex;align-items:center;justify-content:space-between}
.jc-loc{font-size:11px;color:var(--muted)}
.jc-star{background:none;font-size:20px;color:#cbd3df;line-height:1;padding:2px;transition:.15s}
.jc-star:hover{color:#f0b429;transform:scale(1.15)}
.jc-star.on{color:#f0b429}
.jc-cmp{background:#fff;border:1px solid #cbd3df;border-radius:13px;padding:2px 9px;font-size:11px;color:#5a6b85;line-height:1.7;cursor:pointer;white-space:nowrap;transition:.15s;font-weight:600}
.jc-cmp:hover{border-color:#2f7bd6;color:#2f7bd6}
.jc-cmp.on{background:#2f7bd6;border-color:#2f7bd6;color:#fff}
.jc-refresh{background:#fff;border:1px solid #34a853;border-radius:13px;padding:2px 10px;font-size:11px;color:#34a853;line-height:1.7;cursor:pointer;white-space:nowrap;transition:.15s;font-weight:600}
.jc-refresh:hover{background:#34a853;border-color:#34a853;color:#fff}
.jc-refresh:disabled{opacity:.5;cursor:default}
.jc-refresh-done{background:#34a853;border-color:#34a853;color:#fff}
.jc-updated{font-size:10px;color:#9aa7b8;margin:2px 0 6px}
.jc-updated.fresh{color:#16a34a;font-weight:600}
.jc-org{font-size:13px;font-weight:600;color:var(--navy);margin:8px 0 2px;line-height:1.4}
.jc-title{font-size:15px;font-weight:700;color:var(--navy);line-height:1.35}
.jc-badges{display:flex;align-items:center;gap:6px;flex-wrap:wrap;margin:8px 0 10px}
.jc-exam{display:inline-flex;align-items:center;padding:3px 10px;border-radius:7px;font-size:13px;font-weight:700;border:1px solid;white-space:nowrap;line-height:1.4}
.jc-exam.exam-A{background:#ebf4ff;color:#1d4ed8;border-color:#bfdbfe}
.jc-exam.exam-B{background:#f3efff;color:#6d28d9;border-color:#ddd6fe}
.jc-exam.exam-C{background:#e6fffb;color:#0e7490;border-color:#b2f5ea}
.jc-exam.exam-D{background:#fdf2f8;color:#be185d;border-color:#fbcfe8}
.jc-exam.exam-E{background:#fef2f2;color:#dc2626;border-color:#fecaca}
.jc-exam.exam-none,.jc-exam.exam-other{background:#f1f5f9;color:#475569;border-color:#e2e8f0}
.jc-scorebadge{display:inline-flex;align-items:center;padding:3px 10px;border-radius:7px;font-size:13px;font-weight:700;background:#f0fdf4;color:#15803d;border:1px solid #bbf7d0;white-space:nowrap;line-height:1.4}
.jc-status{font-size:12px;font-weight:600}
.job-card.match .jc-status{color:#2f855a}
.job-card.pending .jc-status{color:#c05621}
.jc-meta{display:flex;flex-direction:column;gap:5px}
.jc-diff{font-size:13px;color:#b7791f}
.jc-diff-label{font-size:11px;color:var(--muted);margin-left:3px;font-weight:400}
.jc-stats{display:flex;gap:14px;flex-wrap:wrap;font-size:12px;color:var(--muted)}
.jc-stats b{color:var(--navy)}
.jc-kpis{display:grid;grid-template-columns:0.72fr 1fr 1fr;gap:8px;background:#f7f9fc;border:1px solid #eef1f6;border-radius:10px;padding:12px 8px;align-items:stretch}
.kpi{text-align:center;min-width:0;display:flex;flex-direction:column;justify-content:flex-end}
.kpi + .kpi{border-left:1px solid #eef1f6}
.kpi-v{font-size:21px;font-weight:800;color:var(--navy);line-height:1.15;white-space:nowrap}
.kpi-u{font-size:12px;font-weight:500;color:var(--muted);font-style:normal;margin-left:2px}
.kpi-k{font-size:11px;color:var(--muted);margin-top:auto;padding-top:4px}
.kpi-comp .kpi-v{color:#c05621}
.kpi-sub{font-size:10px;color:var(--muted);margin-top:3px;line-height:1.2;white-space:nowrap}
.kpi-upd{color:#1f6feb}
.kpi-diff .kpi-v{color:#b7791f;font-size:15px;letter-spacing:1px}
.jc-score{font-size:12px;color:var(--muted);text-align:center;padding-top:2px}
.jc-extra{font-size:11px;color:var(--muted);border-top:1px dashed #eef1f6;padding-top:8px}
.jc-match{font-size:12px;color:var(--txt);background:#f7f9fc;border-radius:8px;padding:9px 11px}
.jc-match .pend-line{color:#c05621;margin-top:4px}
.jc-detail-toggle{font-size:12px;color:var(--blue);cursor:pointer;user-select:none}
.jc-detail{margin-top:4px;background:#fafbfd;border:1px solid #eef1f6;border-radius:8px;padding:10px 12px;font-size:12px}
.jd-row{display:flex;gap:10px;padding:5px 0;border-bottom:1px dashed #eef1f6}
.jd-row:last-child{border-bottom:none}
.jd-row span:first-child{width:90px;flex-shrink:0;color:var(--muted)}
.jd-row span:last-child{color:var(--txt);flex:1}

/* ============ 画像统计 ============ */
.profile-stats{margin-top:8px;border-top:2px solid var(--line);padding-top:18px}
.ps-head{display:flex;align-items:center;justify-content:space-between;margin-bottom:14px}
.ps-head h3{font-size:16px;font-weight:700;color:var(--navy)}
.ps-head .tag-right{font-size:12px;color:var(--muted)}
.ps-diff{display:flex;flex-direction:column;gap:8px;align-items:flex-start}
.ps-diff-title{font-size:13px;color:var(--txt);font-weight:600}
.ps-diff-stars{font-size:26px;color:#f0b429;letter-spacing:3px}
.ps-diff-score{font-size:22px;font-weight:700;color:var(--navy)}
.ps-examtype{margin-top:4px}

/* 分数段条形图 */
.seg-row{display:flex;align-items:center;gap:10px;margin-bottom:9px}
.seg-lbl{width:52px;font-size:12px;color:var(--muted);text-align:right;flex-shrink:0}
.seg-track{flex:1;height:16px;background:#eef1f6;border-radius:4px;overflow:hidden}
.seg-fill{height:100%;border-radius:4px}
.seg-val{width:44px;font-size:12px;color:var(--txt);flex-shrink:0}

/* ============ 响应式（报告页） ============ */
@media(max-width:900px){
  .metric-cards{grid-template-columns:repeat(2,1fr)}
  .job-grid{grid-template-columns:1fr}
}
@media(max-width:768px){
  .cat-cards{grid-template-columns:repeat(3,1fr);gap:8px}
  .cat-card{padding:12px 8px}
  .cat-card .v{font-size:22px}
  .cat-card .v .pend{display:block;margin-left:0;margin-top:2px}
  .metric-cards{grid-template-columns:repeat(2,1fr);gap:8px}
  .metric-card{padding:12px}
  .metric-card .v{font-size:22px}
  /* 快速筛选：手机上一行两列、下拉撑满、字号 13px，不再挤成一团 */
  .quick-filters{display:grid;grid-template-columns:1fr 1fr;gap:8px 10px;padding:10px}
  .quick-filters label{display:flex;flex-direction:column;align-items:stretch;gap:4px;font-size:12px;min-width:0}
  .quick-filters select{width:100%;min-width:0;font-size:13px;padding:7px 8px;box-sizing:border-box;text-overflow:ellipsis}
  .quick-filters label:nth-child(5){grid-column:1 / -1}
  .job-grid{grid-template-columns:1fr}
}

/* ============ 打印样式 ============ */
@media print{
  body{background:#fff}
  .topbar,.panel-filter,.float-top,.quick-filters,.jc-star,.jc-detail-toggle,.btn-query,.reset,.more-toggle{display:none !important}
  .query-wrap{flex-direction:column}
  .panel-filter{display:none}
  .panel-result{width:100%;border:none;padding:0}
  .job-grid{grid-template-columns:1fr}
  .job-card{break-inside:avoid;border:1px solid #ccc}
  .panel{break-inside:avoid}
}

/* ============ 数据总览 · 内蒙古地图 ============ */
.map-panel{display:flex;gap:14px;margin-bottom:16px;align-items:stretch}
.map-left{flex:1;min-width:0;background:var(--card);border:1px solid var(--line);border-radius:12px;padding:18px}
.map-left h3{font-size:15px;font-weight:700;color:var(--navy);margin-bottom:12px;display:flex;align-items:center;justify-content:space-between;gap:8px;flex-wrap:wrap}
.map-switch{display:flex;gap:4px;font-weight:400}
.ms-btn{padding:4px 12px;border:1px solid var(--line);border-radius:6px;background:#fff;color:var(--muted);font-size:12px;cursor:pointer;transition:.15s;white-space:nowrap}
.ms-btn:hover{border-color:var(--blue2);color:var(--navy)}
.ms-btn.on{background:var(--navy);color:#fff;border-color:var(--navy)}
#ov-map{height:520px;width:100%}
.map-note{font-size:11px;color:var(--muted);margin-top:8px}
.map-right{width:440px;flex-shrink:0;background:var(--card);border:1px solid var(--line);border-radius:12px;padding:18px;overflow-y:auto}
.rd-head{font-size:16px;font-weight:700;color:var(--navy);margin-bottom:14px}
.rd-num{background:#f7f9fc;border:1px solid var(--line);border-radius:10px;padding:12px 14px;margin-bottom:10px;display:flex;align-items:center;justify-content:space-between}
.rd-num .v{font-size:20px;font-weight:700;color:var(--navy)}
.rd-num .k{font-size:12px;color:var(--muted)}
.rd-top-title{font-size:13px;font-weight:600;color:var(--txt);margin:14px 0 10px}
.rd-hint{font-size:11px;color:var(--muted);margin-top:6px}
.rd-sub{font-size:12px;color:var(--muted);margin:6px 0 4px;padding:6px 10px;background:#fbfaf7;border:1px dashed var(--line);border-radius:8px}
@media(max-width:900px){.map-panel{flex-direction:column}.map-right{width:100%}#ov-map{height:400px}}

/* ============ 专业多选下拉 ============ */
.major-select{position:relative}
.ms-tags{display:flex;flex-wrap:wrap;gap:6px;margin-bottom:6px}
.ms-chip{display:inline-flex;align-items:center;gap:5px;background:#eef3fb;border:1px solid #c9d8f0;color:var(--navy);border-radius:999px;padding:4px 10px;font-size:13px}
.ms-chip .ms-code-sm{color:var(--muted);font-size:11px}
.ms-chip .ms-x{cursor:pointer;font-weight:700;color:var(--muted);padding:0 2px}
.ms-chip .ms-x:hover{color:#c0392b}
.ms-input{width:100%;padding:8px 12px;border:1px solid var(--line);border-radius:8px;font-size:13px;outline:none}
.ms-input:focus{border-color:var(--blue2)}
.ms-dropdown{position:absolute;z-index:50;left:0;right:0;top:100%;margin-top:4px;background:#fff;border:1px solid var(--line);border-radius:10px;box-shadow:0 8px 24px rgba(22,50,92,.16);max-height:320px;overflow-y:auto;display:none}
.ms-group-title{position:sticky;top:0;background:#f4f7fc;padding:6px 12px;font-size:12px;font-weight:700;color:var(--navy);border-bottom:1px solid var(--line);z-index:1}
.ms-opt{display:flex;align-items:center;gap:8px;padding:8px 12px;font-size:13px;cursor:pointer;border-bottom:1px solid #f0f3f8;min-width:0}
.ms-opt:hover{background:#f0f5ff}
.ms-opt.on{background:#eaf1ff}
.ms-opt .ms-code{font-family:ui-monospace,SFMono-Regular,monospace;color:var(--muted);font-size:12px;min-width:52px}
.ms-opt .ms-name{flex:1;min-width:0;color:var(--txt);display:flex;align-items:center;gap:6px;word-break:break-all}
.ms-opt .ms-lv{font-size:10px;color:#fff;background:#7ba3d8;border-radius:4px;padding:1px 5px;flex-shrink:0}
.ms-opt .ms-check{color:var(--navy);font-weight:700;flex-shrink:0}
.ms-empty{padding:16px;text-align:center;color:var(--muted);font-size:13px}

/* ============ 岗位卡片：往年数据按钮 ============ */
.jc-actions{display:flex;align-items:center;justify-content:space-between;margin-top:10px;padding-top:8px;border-top:1px dashed var(--line)}
.jc-hist-btn{background:linear-gradient(135deg,#16325c,#1f4e8c);color:#fff;border:none;border-radius:8px;padding:6px 12px;font-size:12px;cursor:pointer;font-weight:600}
.jc-hist-btn:hover{opacity:.9}
.jc-confirm{background:#16a34a;color:#fff;border:none;border-radius:8px;padding:6px 12px;font-size:12px;cursor:pointer;font-weight:600}
.jc-cancel{background:#ef4444;color:#fff;border:none;border-radius:8px;padding:6px 12px;font-size:12px;cursor:pointer;font-weight:600}
.jc-confirm:hover,.jc-cancel:hover{opacity:.9}
.jc-detail-toggle{color:var(--navy);font-size:12px;cursor:pointer;user-select:none}
.jc-detail-toggle:hover{text-decoration:underline}

/* ============ 往年数据弹窗 ============ */
.modal-mask{position:fixed;inset:0;background:rgba(16,32,58,.5);z-index:200;display:none;align-items:flex-start;justify-content:center;padding:40px 16px;overflow-y:auto}
/* 弹窗叠弹窗：编辑学员 → 点「座位图选座」时，座位图要盖在编辑弹窗之上（老板 2026-09-17） */
.modal-mask.stack-top{z-index:320}
.modal{background:#fff;border-radius:14px;box-shadow:0 20px 60px rgba(0,0,0,.3);width:100%;max-width:720px;animation:modalIn .18s ease;max-height:calc(100vh - 80px);max-height:calc(100dvh - 80px);display:flex;flex-direction:column;overflow:hidden}
.modal>.modal-body{overflow-y:auto;-webkit-overflow-scrolling:touch;flex:1 1 auto;min-height:0}
@keyframes modalIn{from{opacity:0;transform:translateY(12px)}to{opacity:1;transform:none}}

/* ===== 签到设备弹窗（添加/编辑）===== */
.dev-modal-bg{position:fixed;inset:0;background:rgba(16,32,58,.5);z-index:230;display:flex;align-items:flex-start;justify-content:center;padding:40px 16px;overflow-y:auto}
.dev-modal{background:#fff;border-radius:14px;box-shadow:0 20px 60px rgba(0,0,0,.3);width:100%;max-width:520px;padding:20px 22px;animation:modalIn .18s ease}
.dev-modal h3{margin:0 0 12px;font-size:16px;color:var(--navy)}
.dev-modal .flabel{font-size:12.5px;color:#6b7a96;font-weight:600;margin-bottom:6px}
.dev-modal .dev-per-row .finput{padding:7px 9px;font-size:13px}
.history-modal{max-width:760px}
.modal-head{display:flex;align-items:center;justify-content:space-between;padding:16px 20px;border-bottom:1px solid var(--line);position:sticky;top:0;background:#fff;border-radius:14px 14px 0 0;z-index:1}
.mh-title{font-size:16px;font-weight:700;color:var(--navy)}
.mh-close{border:none;background:#f0f3f8;color:var(--muted);width:30px;height:30px;border-radius:50%;cursor:pointer;font-size:14px}
.mh-close:hover{background:#e2e8f2;color:#c0392b}
/* 弹窗标题行右侧操作组（结课 / 恢复上课 + 关闭） */
.mh-actions{display:flex;align-items:center;gap:8px}
.cd-status-btn{padding:5px 14px;font-size:13px}
.cd-status-btn.finish{color:#c0392b;border-color:#e8c4c4}
.cd-status-btn.finish:hover{background:#fdeaea;color:#a5281a;border-color:#d9a2a2}
.cd-status-btn.resume{color:#1f8a4c;border-color:#b9e0c8}
.cd-status-btn.resume:hover{background:#e8f8ee;color:#166b3a;border-color:#8fcfab}
.modal-foot{display:flex;justify-content:flex-end;gap:10px;padding:14px 20px;border-top:1px solid var(--line)}
.hlbe-meta{float:right;display:flex;align-items:center;gap:8px}
.hlbe-updated{font-size:12px;color:var(--muted);font-weight:400;white-space:nowrap}
.hlbe-updated.fresh{color:#1f9d68;font-weight:600}
.hlbe-modal{max-width:440px}
.hlbe-desc{font-size:13px;color:#5a6b85;line-height:1.7;margin:0 0 12px}
.hlbe-info{font-size:12px;color:var(--muted);margin-bottom:8px}
.hlbe-info.fresh{color:#1f9d68}
.hlbe-progress{margin:10px 0}
.hlbe-progress-bar{height:8px;background:#eef2f8;border-radius:99px;overflow:hidden}
.hlbe-progress-fill{height:100%;width:0;background:linear-gradient(90deg,#2f7bd6,#1d5cb8);border-radius:99px;transition:width .3s}
.hlbe-progress-text{font-size:12px;color:var(--muted);margin-top:6px;text-align:center}
.hlbe-result{font-size:13px;color:#1f9d68;font-weight:600;margin-top:10px;line-height:1.6}
.hlbe-result span{font-weight:400}
.trend-tag{font-size:10px;color:#9aa7bc;margin-left:6px;font-weight:400}
.trend-sub{margin-bottom:14px}
.trend-sub-title{font-size:13px;font-weight:600;color:var(--navy);margin-bottom:8px}
.trend-cur{margin-top:10px;padding-top:10px;border-top:1px dashed var(--line);font-size:13px;color:var(--muted)}
.trend-cur b{color:var(--navy);font-size:15px}
.modal-body{padding:20px}
.pwd-modal{max-width:420px}
.pwd-modal .field label{color:#5a6b85}
.pwd-modal .field input{background:#f5f7fb;border:1px solid #dbe2ee;color:#1a2438}
.pwd-modal .login-err{color:#c0392b}

.hist-unit{margin-bottom:12px}
.hu-name{font-size:18px;font-weight:700;color:var(--navy)}
.hu-meta{font-size:13px;color:var(--muted);margin-top:3px}
.hist-note{background:#f4f8ff;border-left:3px solid var(--blue2);padding:10px 12px;font-size:12px;color:#33517a;border-radius:6px;margin-bottom:14px}
.hist-empty{font-size:15px;color:var(--muted);text-align:center;padding:20px 0}
.hist-title{font-size:14px;color:var(--txt);margin-bottom:10px}
.hist-cand-list{display:flex;flex-direction:column;gap:6px;max-height:340px;overflow-y:auto}
.hist-cand{text-align:left;background:#f4f7fc;border:1px solid var(--line);border-radius:8px;padding:10px 12px;font-size:13px;cursor:pointer;color:var(--navy)}
.hist-cand:hover{background:#eaf1ff;border-color:var(--blue2)}

.hist-year{margin-bottom:18px}
.hy-head{display:flex;align-items:baseline;justify-content:space-between;flex-wrap:wrap;gap:6px;margin-bottom:4px}
.hy-year{font-size:15px;font-weight:700;color:var(--navy)}
.hy-stats{font-size:13px;color:var(--txt)}
.hy-stats b{color:#c0392b}
.hy-range{font-size:12px;color:var(--muted);margin-bottom:8px}
.hist-table{width:100%;border-collapse:collapse;font-size:12px}
.hist-table th,.hist-table td{border:1px solid var(--line);padding:6px 8px;text-align:left}
.hist-table th{background:#f4f7fc;color:var(--navy);font-weight:600;white-space:nowrap}
.hist-table td{color:var(--txt)}
.hist-table tr:nth-child(even) td{background:#fafbfe}

/* ============ 生成报告面板 ============ */
.report-mask{position:fixed;inset:0;background:#eef1f5;z-index:300;display:none;flex-direction:column}
.report-toolbar{display:flex;align-items:center;justify-content:space-between;padding:12px 20px;background:#16325c;color:#fff;flex-shrink:0}
.rt-title{font-weight:700;font-size:15px}
.rt-actions{display:flex;gap:8px}
.rt-btn{border:none;border-radius:8px;padding:8px 14px;font-size:13px;cursor:pointer;font-weight:600}
.rt-btn.primary{background:#fff;color:#16325c}
.rt-btn:not(.primary){background:rgba(255,255,255,.16);color:#fff}
.rt-btn:hover{opacity:.9}
.report-sheet{flex:1;overflow-y:auto;padding:24px}

.rp-doc{max-width:1080px;margin:0 auto;background:#fff;border-radius:12px;box-shadow:0 4px 24px rgba(0,0,0,.08);padding:36px 44px}
.rp-head{border-bottom:3px solid #16325c;padding-bottom:18px;margin-bottom:22px}
.rp-title{font-size:26px;font-weight:800;color:#16325c;letter-spacing:1px}
.rp-sub{font-size:13px;color:#7a8ba5;margin-top:6px}
.rp-sec{margin-bottom:26px}
.rp-sec h3{font-size:16px;color:#16325c;margin:0 0 12px;border-left:4px solid #2b5da8;padding-left:10px}
.rp-sec h4{font-size:14px;color:#2b5da8;margin:0 0 8px}
.rp-cnt{font-size:12px;color:#7a8ba5;font-weight:400;margin-left:8px}
.rp-note{font-size:12px;color:#7a8ba5;margin-top:10px}
.rp-empty{color:#b0bccd;text-align:center;padding:10px}

.rp-cond{width:100%;border-collapse:collapse;font-size:13px}
.rp-cond td{border:1px solid #e3e9f2;padding:8px 12px}
.rp-cond .rp-cond-k{background:#f4f7fc;color:#33517a;font-weight:600;width:110px;white-space:nowrap}
.rp-cond td:last-child{color:#1c2c45}

.rp-metrics{display:flex;gap:12px;flex-wrap:wrap}
.rp-m{flex:1;min-width:110px;text-align:center;background:#f4f7fc;border:1px solid #e3e9f2;border-radius:10px;padding:16px 10px}
.rp-m .v{font-size:24px;font-weight:800;color:#16325c}
.rp-m .k{font-size:12px;color:#7a8ba5;margin-top:4px}

.rp-bar{display:flex;align-items:center;gap:10px;margin-bottom:8px}
.rp-lbl{width:130px;font-size:12px;color:#33517a;flex-shrink:0}
.rp-track{flex:1;height:14px;background:#edf1f7;border-radius:7px;overflow:hidden}
.rp-track i{display:block;height:100%;background:linear-gradient(90deg,#5a86d4,#16325c);border-radius:7px}
.rp-val{width:90px;font-size:12px;color:#1c2c45;text-align:right;flex-shrink:0}

.rp-sugg-grid{display:grid;grid-template-columns:1fr 1fr;gap:16px}
@media (max-width:720px){
  .rp-sugg-grid{grid-template-columns:1fr}
  .rp-doc{padding:20px 14px}
  .rp-title{font-size:21px}
  .rp-metrics{gap:8px}
  .rp-m{min-width:76px;padding:12px 8px}
  .rp-m .v{font-size:20px}
  .rp-cond td{padding:7px 8px}
  .rp-table-wrap{overflow-x:auto;-webkit-overflow-scrolling:touch}
  .rp-table.rp-wide{min-width:880px}
}

.rp-table{width:100%;border-collapse:collapse;font-size:12px}
.rp-table th,.rp-table td{border:1px solid #e3e9f2;padding:7px 9px;text-align:left;vertical-align:top}
.rp-table th{background:#f4f7fc;color:#33517a;font-weight:600;white-space:nowrap}
.rp-table tr:nth-child(even) td{background:#fafbfe}
.rp-sub{font-size:11px;color:#7a8ba5;margin-top:2px}
.rp-major{max-width:170px;white-space:normal;font-size:11px;line-height:1.45;word-break:break-all}
.rp-foot{margin-top:30px;padding-top:14px;border-top:1px solid #e3e9f2;font-size:11px;color:#a5b2c5;text-align:center}

/* 打印：只打印报告内容 */
@media print {
  body * { visibility: hidden; }
  .report-sheet, .report-sheet * { visibility: visible; }
  .mobile-ad, #screen-login, #screen-success, #screen-app { display:none !important; }
  .report-mask { position: static; display: block; }
  .report-sheet { position: static; width:100%; padding:0; overflow:visible; }
  .report-toolbar { display:none !important; }
  .rp-doc { box-shadow:none; border-radius:0; max-width:100%; padding:16px; }
  .rp-sec { break-inside: avoid; }
  .rp-table tr { break-inside: avoid; }
  .seat-print-mask, .seat-print-mask * { visibility: visible; }
  .seat-print-mask { position:absolute; inset:0; background:#fff; }
  .seat-print-toolbar { display:none !important; }
  .seat-print-sheet { padding:0; display:block; }
  .seat-print-sheet img { box-shadow:none; max-width:100%; width:100%; height:auto; }
  .seat-print-sheet img + img { break-before: page; page-break-before: always; }
}
@page { size: A4 landscape; margin: 10mm; }

/* ===== 单位检索 ===== */
.units-wrap { max-width: 1100px; margin: 0 auto; padding: 24px 20px; }
.us-counts { display: flex; gap: 10px; flex-wrap: wrap; }
.us-counts span { background: var(--card); border: 1px solid var(--line); border-radius: 8px; padding: 6px 12px; font-size: 13px; color: var(--navy); font-weight: 600; }
.units-searchbar { display: flex; gap: 12px; align-items: stretch; margin: 18px 0 20px; }
.us-input-wrap { flex: 1; position: relative; }
.us-input { width: 100%; padding: 14px 18px; border: 2px solid var(--line); border-radius: 10px; font-size: 15px; outline: none; box-sizing: border-box; color: var(--txt); }
.us-input:focus { border-color: var(--blue2); box-shadow: 0 0 0 3px rgba(49,130,206,.12); }
.us-dropdown { position: absolute; top: calc(100% + 6px); left: 0; right: 0; background: #fff; border: 1px solid var(--line); border-radius: 10px; box-shadow: 0 12px 32px rgba(13,20,32,.14); max-height: 340px; overflow: auto; z-index: 60; display: none; }
.us-item { padding: 11px 16px; cursor: pointer; font-size: 14px; color: var(--txt); border-bottom: 1px solid #f0f3f8; }
.us-item:hover { background: #eef3fb; }
.us-item:last-child { border-bottom: none; }
.us-region { padding: 0 16px; border: 2px solid var(--line); border-radius: 10px; font-size: 14px; color: var(--txt); outline: none; min-width: 150px; background: #fff; cursor: pointer; }
.us-region:focus { border-color: var(--blue2); }
.us-btn { width: auto; padding: 0 26px; margin: 0; font-size: 15px; }
.us-result { display: flex; flex-direction: column; gap: 12px; }
.us-result .job-card { margin: 0; }
.unit-card { display: flex; align-items: center; gap: 14px; background: var(--card); border: 1px solid var(--line); border-radius: 10px; padding: 16px 18px; cursor: pointer; transition: .15s; }
.unit-card:hover { border-color: var(--blue2); box-shadow: 0 4px 14px rgba(43,108,176,.12); }
.uc-name { font-size: 15px; font-weight: 600; color: var(--navy); flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.uc-meta { font-size: 13px; color: var(--muted); white-space: nowrap; flex-shrink: 0; }
.uc-arrow { font-size: 24px; color: var(--muted); line-height: 1; }
@media (max-width: 700px) {
  .units-searchbar { flex-wrap: wrap; }
  .us-input-wrap { flex: 1 1 100%; }
  .us-region { flex: 1; min-width: 0; min-height: 48px; }
  .us-btn { flex: 1; min-height: 48px; }
  .uc-meta { white-space: normal; }
}

/* ===== 报名/缴费徽章 + 数据更新日期 ===== */
.jc-top-right { display: flex; align-items: center; gap: 8px; }
.jc-live { display: inline-flex; align-items: center; gap: 3px; background: linear-gradient(135deg,#fff4e6,#ffedd5); color: #b45309; border: 1px solid #f6c98a; border-radius: 7px; padding: 3px 10px; font-size: 12px; font-weight: 600; white-space: nowrap; }
.jc-live b { color: #c2410c; font-size: 14px; }
.jc-live .jcl-sep { color: #e8a24a; margin: 0 2px; }
.jc-transfer { display: inline-flex; align-items: center; gap: 3px; background: linear-gradient(135deg,#fff7ed,#ffedd5); color: #9a3412; border: 1px solid #fdba74; border-radius: 7px; padding: 3px 10px; font-size: 12px; font-weight: 700; white-space: nowrap; }
.jc-transfer.reduce { background: linear-gradient(135deg,#fef2f2,#fee2e2); color: #b91c1c; border-color: #fca5a5; }
.jc-nature { display: inline-flex; align-items: center; padding: 3px 10px; border-radius: 7px; font-size: 12px; font-weight: 600; white-space: nowrap; line-height: 1.4; background: #f0fdf4; color: #15803d; border: 1px solid #bbf7d0; }
.live-bar { background: #eef7ff; border: 1px solid #bfe0ff; color: #1a5fa8; border-radius: 8px; padding: 9px 14px; font-size: 13px; margin: 4px 0 14px; }
.live-bar b { color: #0b4f94; }
@media (max-width: 700px) {
  .jc-live { font-size: 11px; padding: 3px 8px; }
  .jc-live b { font-size: 13px; }
}

/* ===== Logo 底纹 / 水印 ===== */
/* 登录页背景：反色淡 logo 水印 */
#screen-login::before { content:''; position:absolute; inset:0; background:url('../assets/logo.png') center/30% no-repeat; opacity:.022; filter:brightness(0) invert(1); pointer-events:none; }
/* 报告文档：居中淡 logo 水印（打印/PDF 防伪） */
.rp-doc { position:relative; }
.rp-doc::before { content:''; position:absolute; inset:0; background:url('../assets/logo.png') center/44% no-repeat; opacity:.045; pointer-events:none; }
@media print {
  .rp-doc::before { opacity:.06; }
}
.rp-wm { position:absolute; inset:0; pointer-events:none; overflow:hidden; z-index:0; }
.rp-wm span { position:absolute; font-size:26px; color:#16325c; opacity:.05; transform:rotate(-28deg); font-weight:800; letter-spacing:2px; white-space:nowrap; }
@media print {
  .rp-wm { position:fixed; }
  .rp-wm span { opacity:.07; }
}

/* ===== 数据总览：实时时钟 + 排行榜 + 榜单 ===== */
.big-nums .bignum { flex:1; }
.ov-clock { display:flex; align-items:center; gap:8px; background:var(--card); border:1px solid var(--line); border-radius:10px; padding:10px 16px; font-size:13px; color:var(--muted); white-space:nowrap; }
.ov-clock b { color:var(--navy); font-weight:700; }
.ov-clock .ov-tick { font-family:Consolas,'SF Mono','Roboto Mono',monospace; color:var(--blue2); letter-spacing:.5px; }
.ov-clock-sep { color:#c6d0dc; }
.ov-live-dot { width:9px; height:9px; border-radius:50%; background:#22c55e; flex-shrink:0; animation:ov-pulse 1.6s infinite; }
@keyframes ov-pulse { 0%{box-shadow:0 0 0 0 rgba(34,197,94,.55)} 70%{box-shadow:0 0 0 7px rgba(34,197,94,0)} 100%{box-shadow:0 0 0 0 rgba(34,197,94,0)} }
.bignum.hot { border-color:#f6c98a; background:linear-gradient(180deg,#fffaf1,#fff3e0); }
.bignum.hot .v { color:#c2410c; }
.bignum.hot .k { color:#b45309; }
.bignum .ov-sub { font-size:11px; margin-top:3px; color:var(--muted); font-weight:400; }
.ov-est-note { text-align:center; font-size:12px; color:var(--muted); margin:6px 0 0; }

.ov-table { overflow-x:auto; }
.ov-tb { width:100%; border-collapse:collapse; font-size:13px; }
.ov-tb th { text-align:left; padding:8px 10px; color:var(--muted); font-weight:600; font-size:12px; border-bottom:2px solid var(--line); white-space:nowrap; }
.ov-tb td { padding:8px 10px; border-bottom:1px solid #eef1f6; white-space:nowrap; }
.ov-tb .rk { color:var(--muted); font-weight:700; width:34px; }
.ov-tb .rk.top { color:#d97706; }
.ov-tb .nm { color:var(--navy); font-weight:600; }
.ov-tb .hot { color:#c2410c; font-weight:700; }
.ov-tb tbody tr:hover { background:#f7fafd; }

.grid3 { display:grid; grid-template-columns:1fr 1fr 1fr; gap:14px; margin-bottom:14px; }
.grid3 .panel { margin-bottom:0; }
.grid4 { display:grid; grid-template-columns:1fr 1fr; gap:14px; margin-bottom:14px; }
.grid4 .panel { margin-bottom:0; }
.ov-jobs { max-height:430px; overflow-y:auto; }
.ov-job { border:1px solid #eef1f6; border-radius:9px; padding:10px 12px; margin-bottom:8px; background:#fbfcfe; cursor:pointer; transition:border-color .15s, box-shadow .15s; }
.ov-job:hover { border-color:#7ba3d8; box-shadow:0 2px 8px rgba(29,75,143,.08); }
.ov-job:last-child { margin-bottom:0; }
.oj-title { font-size:13px; font-weight:600; color:var(--navy); overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
.oj-unit { font-size:11px; color:var(--muted); margin:3px 0 6px; overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
.oj-unit-name { font-size:13px; font-weight:600; color:var(--navy); margin:0 0 6px; }
.oj-meta { display:flex; gap:12px; font-size:12px; color:var(--txt); }
.oj-meta span { white-space:nowrap; }
.oj-meta .oj-comp { color:#c2410c; font-weight:700; margin-left:auto; }
.ov-empty { color:var(--muted); font-size:13px; text-align:center; padding:20px 0; }
.ov-more-btn { font-size:12px; color:var(--navy); border:1px solid var(--line); background:#fff; border-radius:6px; padding:3px 9px; cursor:pointer; margin-left:6px; vertical-align:middle; }
.ov-more-btn:hover { border-color:#7ba3d8; color:#1d4b8f; background:#f5f9ff; }
.ovall-modal { max-width:980px; max-height:88vh; display:flex; flex-direction:column; }
.ovall-modal .modal-body { overflow-y:auto; }
.ovall-tb td, .ovall-tb th { white-space:normal; }
.ovall-tb .nm { max-width:260px; }
.ovall-tb tbody tr { cursor:pointer; }
.ovall-tb tbody tr:hover { background:#f7fafd; }

@media (max-width:900px) {
  .grid3 { grid-template-columns:1fr; }
  .grid4 { grid-template-columns:1fr; }
  .ov-clock { flex-wrap:wrap; }
  .ov-tb { font-size:11px; }
  .ov-tb th, .ov-tb td { padding:6px 5px; }
  .ov-tb .rk { width:24px; }
}

/* ===== 移动端顶部广告（仅手机显示） =====
   广告随页面一起滚走（static，不吸顶），避免与 sticky 顶栏在 top:0 互相层叠 */
.mobile-ad { display: none; }
.mobile-ad.hidden { display: none !important; }
@media (max-width: 768px) {
  .mobile-ad { display: block; position: static; z-index: 0; }
  .mobile-ad img { width: 100%; height: auto; display: block; }
}

/* ============ 加载遮罩 ============ */
.loading-mask {
  position: fixed; inset: 0; z-index: 9999;
  display: none; align-items: center; justify-content: center;
  background: rgba(10,16,28,0.45); backdrop-filter: blur(3px);
}
.loading-mask.show { display: flex; }
.loading-box {
  background: #fff; border-radius: 16px; padding: 34px 46px;
  display: flex; flex-direction: column; align-items: center; gap: 18px;
  box-shadow: 0 14px 48px rgba(0,0,0,0.28); min-width: 170px;
}
.loading-spinner { position: relative; width: 54px; height: 54px; }
.ls-ring {
  position: absolute; inset: 0; border-radius: 50%;
  background: conic-gradient(from 0deg, transparent 8%, #2f7bd6 55%, #1d5cb8 92%, transparent);
  -webkit-mask: radial-gradient(farthest-side, transparent calc(100% - 5px), #000 calc(100% - 5px));
  mask: radial-gradient(farthest-side, transparent calc(100% - 5px), #000 calc(100% - 5px));
  animation: spin 0.85s linear infinite;
}
.ls-core {
  position: absolute; inset: 0; margin: auto; width: 14px; height: 14px; border-radius: 50%;
  background: linear-gradient(135deg,#2f7bd6,#1d5cb8); box-shadow: 0 0 14px rgba(47,123,214,.55);
}
@keyframes spin { to { transform: rotate(360deg); } }
.loading-text { font-size: 15px; color: #333; font-weight: 500; display: flex; align-items: center; }
.loading-bar { width: 170px; height: 3px; border-radius: 3px; background: #e8edf4; overflow: hidden; }
.loading-bar::after { content: ''; display: block; height: 100%; width: 42%; border-radius: 3px; background: linear-gradient(90deg,#2f7bd6,#1d5cb8); animation: slide 1.15s ease-in-out infinite; }
@keyframes slide { 0% { transform: translateX(-110%); } 100% { transform: translateX(400%); } }
.ld-dots { display: inline-flex; align-items: flex-end; margin-left: 3px; height: 1em; }
.ld-dots i { width: 4px; height: 4px; border-radius: 50%; background: #2f7bd6; margin: 0 2px; animation: dotBounce 1.2s ease-in-out infinite; }
.ld-dots i:nth-child(2) { animation-delay: .16s; }
.ld-dots i:nth-child(3) { animation-delay: .32s; }
@keyframes dotBounce { 0%,60%,100% { transform: translateY(0); opacity: .35; } 30% { transform: translateY(-5px); opacity: 1; } }
.success-sub .ld-dots i { background: #5aa8ff; }
/* 轻量 toast 提示 */
.toast {
  position: fixed; top: 74px; left: 50%; transform: translate(-50%, -8px);
  background: rgba(20,29,46,.92); color: #fff; padding: 9px 20px; border-radius: 22px;
  font-size: 13px; z-index: 10000; opacity: 0; transition: opacity .25s, transform .25s;
  pointer-events: none; box-shadow: 0 8px 24px rgba(0,0,0,.28);
}
.toast.show { opacity: 1; transform: translate(-50%, 0); }
.toast.ok { background: linear-gradient(135deg,#16a34a,#15803d); }

/* 提示弹窗（未选专业等拦截提示，居中醒目） */
#notice-mask { align-items: center; }
.notice-modal { max-width: 340px; padding: 30px 24px 24px; text-align: center; }
.notice-icon { font-size: 44px; line-height: 1; margin-bottom: 14px; }
.notice-title { font-size: 18px; font-weight: 700; color: #1a2438; margin-bottom: 12px; }
.notice-text { font-size: 14px; line-height: 1.8; color: #5a6b85; text-align: left; margin-bottom: 22px; }
.notice-btn { width: 100%; }
.announce-body { line-height: 1.7; color: #333; }
.ann-meta { font-size: 13px; color: #64748b; margin-bottom: 8px; }
.ann-lead { margin: 0 0 6px; font-size: 14px; }
.ann-grid { display: flex; gap: 10px; margin: 12px 0; flex-wrap: wrap; }
.ann-item { flex: 1; min-width: 140px; background: #f8fafc; border: 1px solid #e2e8f0; border-radius: 10px; padding: 12px 14px; }
.ann-item b { display: block; font-size: 13px; color: #475569; }
.ann-item span { display: block; font-size: 20px; font-weight: 800; color: #1e3a8a; margin: 2px 0; }
.ann-item i { font-size: 12px; color: #94a3b8; font-style: normal; }
.ann-tips { margin: 14px 0 4px; }
.ann-tip { padding: 8px 12px; border-left: 3px solid #f59e0b; background: #fffbeb; border-radius: 0 8px 8px 0; margin: 6px 0; font-size: 13.5px; }
.ann-time { margin-top: 14px; padding: 10px 14px; background: #eff6ff; border-radius: 8px; font-size: 14px; color: #1e40af; }
.ann-detail-btn { display:inline-flex; align-items:center; gap:4px; margin-top:9px; font-size:12px; color:#1d4b8f; border:1px solid #c7d8ee; background:#fff; border-radius:6px; padding:3px 10px; cursor:pointer; transition:border-color .15s, background .15s; }
.ann-detail-btn:hover { border-color:#7ba3d8; background:#f5f9ff; color:#1d4b8f; }

/* 岗位原始条件弹窗 */
.jobdetail-modal { max-width: 480px; }
#jobdetail-body .jd-row span:first-child { width: 96px; }

/* ===== 管理后台 ===== */
.admin-add-panel { margin-bottom: 18px; }
/* 顶部「新增」卡片（班级建设 / 学生查询） */
.stu-card-row{display:grid;grid-template-columns:repeat(auto-fit,minmax(240px,1fr));gap:12px;margin-bottom:16px}
.add-card{display:flex;align-items:center;gap:12px;background:var(--card);border:1px dashed #c2d4ec;border-radius:12px;padding:16px 18px;cursor:pointer;transition:border-color .15s ease,background .15s ease,transform .15s ease}
.add-card:hover{border-color:var(--blue2);background:#f5f9ff;transform:translateY(-1px)}
.add-card-ico{width:34px;height:34px;flex-shrink:0;display:flex;align-items:center;justify-content:center;border-radius:50%;background:#e8f0fc;color:var(--blue);font-size:16px;font-weight:700}
.add-card-txt{font-size:15px;font-weight:600;color:var(--navy)}
.add-card-sub{font-size:12px;color:var(--muted);margin-left:auto;text-align:right}
.admin-add-panel h3 { margin-bottom: 12px; }
.admin-add-form { display: flex; gap: 10px; flex-wrap: wrap; align-items: center; }
.admin-add-form .finput { flex: 1; min-width: 140px; }
.admin-add-btn { width: auto; padding: 10px 24px; margin-top: 0; flex-shrink: 0; }
.a-btn { padding: 5px 12px; border-radius: 7px; font-size: 12px; margin-right: 6px; white-space: nowrap; border: 1px solid transparent; }
.a-btn.warn { background: #fdf3e7; color: #c05621; border-color: #f6c98a; }
.a-btn.ok { background: #e8f6ef; color: #2f855a; border-color: #b6e0c8; }
.a-btn.blue { background: #eef3fb; color: #2b6cb0; border-color: #c7d8f0; }
.a-btn:disabled { opacity: .5; cursor: not-allowed; }
.role-tag { display: inline-block; padding: 2px 9px; border-radius: 5px; font-size: 11px; background: #eef3fb; color: #2b6cb0; }
.role-tag.super { background: #fdf3e7; color: #c05621; }
.status-tag { display: inline-block; padding: 2px 9px; border-radius: 5px; font-size: 11px; }
.status-tag.on { background: #e8f6ef; color: #2f855a; }
.status-tag.off { background: #fdeaea; color: #c0392b; }
.a-btn.del { background: #fdeaea; color: #c0392b; border-color: #f3c1c1; }
.a-btn.del:disabled { opacity: .4; }
.admin-add-form input[type="file"] { padding: 8px 10px; }
/* 运营数据统计面板 */
.astats-cards { display: flex; gap: 10px; flex-wrap: wrap; margin-bottom: 12px; }
.astat { flex: 1; min-width: 110px; background: var(--bg, #f7f9fc); border: 1px solid var(--line); border-radius: 10px; padding: 12px 14px; }
.astat-v { font-size: 22px; font-weight: 800; color: var(--navy); line-height: 1.1; }
.astat-k { font-size: 12px; color: var(--muted); margin-top: 3px; }
.astat-s { font-size: 11px; color: var(--blue); margin-top: 2px; }
.astats-sub { font-size: 13px; color: var(--muted); margin: 4px 0 10px; }
.astats-sub b { color: var(--navy); }
.astats-recent { display: flex; gap: 6px; flex-wrap: wrap; align-items: center; margin-bottom: 12px; }
.astats-recent-t { font-size: 12px; color: var(--muted); margin-right: 2px; }
.arl { background: var(--bg, #f7f9fc); border: 1px solid var(--line); border-radius: 6px; padding: 3px 9px; font-size: 12px; color: var(--navy); }
.arl i { color: var(--muted); font-style: normal; font-size: 11px; margin-left: 4px; }
.astats-sys { background: #fdf6ec; border: 1px solid #f3d9a8; border-radius: 10px; padding: 12px 14px; }
.astats-sys-t { font-size: 13px; font-weight: 700; color: #8a6d3b; margin-bottom: 8px; }
.asys-row { font-size: 13px; color: #6b5322; padding: 3px 0; }
.asys-row b { color: #8a6d3b; }
/* 最近 7 天柱状图 */
.a-chart { margin: 4px 0 14px; }
.a-chart-title { font-size: 13px; color: var(--muted); margin-bottom: 10px; }
.a-chart-bars { display: flex; align-items: flex-end; gap: 10px; height: 130px; padding: 0 4px; }
.a-bar { flex: 1; display: flex; flex-direction: column; align-items: center; height: 100%; justify-content: flex-end; min-width: 0; }
.a-bar-fill { width: 100%; max-width: 46px; background: linear-gradient(180deg, #42a5f5, #1565c0); border-radius: 4px 4px 0 0; min-height: 2px; transition: height .3s; }
.a-bar-v { font-size: 12px; color: var(--navy); margin-top: 4px; font-weight: 700; }
.a-bar-l { font-size: 11px; color: var(--muted); margin-top: 2px; white-space: nowrap; }

/* ===== 岗位对比：悬浮框 ===== */
.cmp-float{position:fixed;right:14px;bottom:18px;z-index:1500;width:264px;max-width:calc(100vw - 28px);background:#fff;border-radius:14px;box-shadow:0 10px 40px rgba(16,32,58,.25);overflow:hidden;border:1px solid var(--line)}
.cf-head{display:flex;align-items:center;gap:6px;padding:12px 14px;font-size:14px;font-weight:700;color:var(--navy);cursor:pointer;background:linear-gradient(135deg,#eef4fc,#e3edfb)}
.cf-head b{color:#2f7bd6}
.cf-arrow{margin-left:auto;color:var(--muted);font-size:12px}
.cf-body{border-top:1px solid var(--line);padding:10px 12px}
.cf-list{max-height:180px;overflow-y:auto;margin-bottom:10px}
.cf-item{display:flex;align-items:center;gap:8px;padding:6px 4px;border-bottom:1px dashed var(--line)}
.cf-item:last-child{border-bottom:none}
.cf-name{flex:1;font-size:12px;color:var(--txt);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.cf-x{background:none;border:none;color:#c0392b;font-size:14px;cursor:pointer;padding:0 2px}
.cf-actions{display:flex;gap:8px}
.cf-go{flex:1;margin-top:0;padding:9px}
.cf-clear{background:#fff;border:1px solid var(--line);border-radius:8px;padding:0 12px;font-size:13px;color:var(--muted);cursor:pointer}
.cf-clear:hover{color:#c0392b;border-color:#e0a5a5}

/* ===== 岗位对比：对比页表格 ===== */
.cmp-back{background:var(--card);border:1px solid var(--line);border-radius:8px;padding:6px 12px;font-size:13px;color:var(--navy);cursor:pointer;margin-bottom:10px}
.cmp-back:hover{border-color:var(--blue);color:var(--blue)}
.cmp-table-wrap{overflow-x:auto;-webkit-overflow-scrolling:touch;border:1px solid var(--line);border-radius:12px;background:#fff}
.cmp-table{border-collapse:collapse;width:100%;min-width:520px;font-size:13px;table-layout:fixed}
.cmp-table th,.cmp-table td{padding:10px 12px;text-align:left;vertical-align:top;border-bottom:1px solid var(--line);border-right:1px solid #e2e8f2}
.cmp-table th:last-child,.cmp-table td:last-child{border-right:none}
.cmp-table thead th{background:#f0f5fc;position:sticky;top:0;z-index:1;min-width:128px;border-right:1px solid #c9d6ea;overflow:hidden}
.cmp-table thead th:last-child{border-right:none}
.cmp-table .cmp-fname{background:#f7f9fc;font-weight:700;color:var(--muted);width:104px;white-space:nowrap;position:sticky;left:0;z-index:3;box-shadow:2px 0 5px rgba(16,32,58,.08)}
.cmp-diff td{background:#fff8e6}
.ct-title{font-weight:700;color:var(--navy);font-size:13px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.ct-org{font-size:11px;color:var(--muted);margin-top:2px;font-weight:400;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.ct-rm{margin-top:8px;background:none;border:none;color:#c0392b;font-size:11px;cursor:pointer;padding:0}
.ct-rm:hover{text-decoration:underline}

/* ===== 学生管理模块 ===== */
.stu-tabs { display: flex; gap: 8px; margin: 14px 0; flex-wrap: wrap; }
.stu-tab { padding: 9px 20px; border-radius: 9px; border: 1px solid #e2e8f0; background: #fff; color: #475569; font-size: 14px; font-weight: 600; cursor: pointer; transition: background .15s ease,border-color .15s ease,color .15s ease; }
.stu-tab:hover { border-color: var(--blue2); color: var(--navy); background: #f2f6fc; }
.stu-tab.on { background: #1d4ed8; color: #fff; border-color: #1d4ed8; }
.stu-pane { display: none; }
.stu-pane.on { display: block; }
.me-panel-head { display: flex; align-items: center; justify-content: space-between; gap: 10px; margin-bottom: 14px; }
.me-panel-head h3 { margin-bottom: 0; }
.me-icon-btn-sm { padding: 4px 10px; font-size: 12px; font-weight: 600; }
.stu-me-seat-map { margin-top: 10px; }
.stu-me-info { max-width: 560px; }
.stu-me-info .kv { display: grid; grid-template-columns: 56px minmax(0, 1fr); gap: 10px; align-items: center; padding: 8px 0; border-bottom: 1px dashed #eef2f7; }
.stu-me-info .kv span { white-space: nowrap; }
.stu-me-info .kv span { color: #64748b; font-size: 13px; }
.stu-me-info .kv b { color: #0f172a; font-size: 15px; }.stu-me-seat { font-size: 28px; font-weight: 700; color: #1d4ed8; padding: 12px 0; }
/* 学员端「我的座位」：座位号 + 排数 并显 */
.stu-me-seat-no{display:inline-block;margin-right:14px}
.stu-me-seat-row{font-size:18px;font-weight:600;color:#5b6472}
/* 排座弹窗：座位显示切换（座位号 / 排数） */
.snm-bar{display:flex;align-items:center;gap:6px;margin-bottom:10px;font-size:12px;color:var(--muted)}
.snm-lb{margin-right:2px}
.snm-opt{border:1px solid var(--line);background:#fff;color:var(--navy);border-radius:8px;padding:5px 12px;font-size:12px;cursor:pointer}
.snm-opt:hover{border-color:var(--blue2);color:var(--blue2)}
.snm-opt.on{background:var(--blue2);border-color:var(--blue2);color:#fff;font-weight:600}
/* 学员个人中心：我的座位图（只高亮自己） */
.stu-me-seat-map { margin-top: 10px; }
.stu-me-seat-map:empty { display: none; }
.room-map .rm-seat.rm-occ{background:#fff4e5;border-color:#f5b942;color:#a8630a;cursor:not-allowed;box-shadow:inset 0 0 0 1px #fde3b0}
.room-map .rm-seat.rm-occ:hover{border-color:#e89b1c;box-shadow:0 0 0 2px #fde3b0;transform:none}
.room-map .rm-seat.rm-occ b{font-size:12px;font-weight:700;color:#a8630a;max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;display:block;text-align:center;padding:0 2px}
.room-map .rm-seat.rm-occ span{font-size:10px;color:#c48a3a;font-weight:400;white-space:nowrap}
.room-map .rm-seat.rm-blank { cursor: default; }
.room-map .rm-seat.rm-blank:hover { border-color: #d7e0ee; box-shadow: none; transform: none; }
.room-map .rm-seat.sm-mine { background: #1d4ed8; border-color: #1d4ed8; color: #fff; font-weight: 700; box-shadow: 0 0 0 2px #bfdbfe; }
.room-map .rm-seat.sm-mine b { font-size: 12px; font-weight: 700; color: #fff; }
.room-map .rm-seat.sm-mine span { font-size: 10px; color: #dbeafe; font-weight: 400; white-space: nowrap; }
/* 2026-10-13：本人座格补一行小字「N排M座」，让学员在图上也能看到排号 */
.room-map .rm-seat.sm-mine .sm-mine-pos { display: block; font-size: 9px; font-style: normal;
  color: #e0ecff; font-weight: 400; line-height: 1.1; white-space: nowrap; margin-top: 1px; }
.room-map .rm-seat.sm-mine:hover { background: #1d4ed8; border-color: #1d4ed8; transform: none; }
.link-btn { background: none; border: none; color: var(--blue); cursor: pointer; font-size: 13px; padding: 2px 4px; transition: color .15s ease; }
.link-btn:hover { text-decoration: underline; color: #1d4b8f; }
.link-btn.danger { color: #dc2626; }
.link-btn.danger:hover { color: #b91c1c; }
.stu-off { color: #dc2626; font-weight: 600; }
.stu-on { color: #16a34a; font-weight: 600; }
/* 批量操作栏 / 勾选列 */
.batch-bar{display:flex;align-items:center;gap:10px;flex-wrap:wrap;padding:10px 12px;margin-bottom:12px;background:#f7f9fc;border:1px solid var(--line);border-radius:9px}
.bb-count{font-size:13px;color:var(--navy);font-weight:600;white-space:nowrap}
.bb-sel{width:auto;min-width:180px;max-width:260px;padding:8px 10px}
.btn-query.bb-btn{width:auto;padding:9px 18px;font-size:13px;margin-top:0}
.th-ck{width:34px}
.th-ck input,.ov-tb td.ck-cell input{width:15px;height:15px;accent-color:var(--blue);cursor:pointer}
.ov-tb td.ck-cell{width:34px}
.cls-link{color:var(--blue);font-weight:600;cursor:pointer}
.cls-link:hover{text-decoration:underline;color:#1d4b8f}
/* 班级列表分组：进行中 / 已结课 */
.cls-group-row td{background:#f4f7fc;color:var(--navy);font-size:13px;font-weight:700;padding:8px 12px;border-top:1px solid var(--line)}
/* 两个分组之间的间隔：把「上课班级 / 结课班级」读成两个板块 */
.cls-group-gap td{height:22px;padding:0;border:none;background:transparent}
.ov-tb tbody tr.cls-group-gap:hover{background:transparent}
.cls-group-n{font-weight:400;color:var(--muted);margin-left:6px}
.cls-row-finished .cls-link{color:var(--muted)}
.cls-row-finished td{background:#fcfcfd}
/* 新生学员弹窗：填写 / 搜索 页签 */
.sn-tabs{margin:6px 0 14px}
.stu-cd-empty{color:var(--muted);font-size:12px}
/* 筛选收纳：默认收起的高级筛选 */
/* 学生查询：箭头在左、文字紧随；上下留白与筛选项一致 */
#stu-more-toggle{justify-content:flex-start;gap:8px;margin:0 0 18px}
#stu-more-toggle .arrow{font-size:12px;line-height:1;display:inline-flex;align-items:center;justify-content:center;width:16px;height:16px;transition:transform .18s ease}
#stu-more-toggle.open .arrow{transform:rotate(90deg)}
.fgroup.collapsed{display:none}
/* 班级管理子页签 */
.subtabs{display:flex;gap:6px;flex-wrap:wrap;margin-bottom:14px;border-bottom:1px solid var(--line);padding-bottom:10px}
.subtab{padding:7px 16px;border-radius:8px;font-size:13px;color:var(--muted);cursor:pointer;border:1px solid transparent;transition:background .15s ease,color .15s ease}
.subtab:hover{color:var(--navy);background:#f2f6fc}
.subtab.on{color:var(--navy);background:#eef3fb;font-weight:600;border-color:#d7e4f7}
/* 导入学员弹窗的双标签：做成并排按钮，选中态明显（2026-10-12 老板）*/
.stu-imp-tabs{display:flex;gap:0;margin:12px 0 14px;border:1px solid var(--line);border-radius:9px;overflow:hidden;background:#f7f9fc}
.stu-imp-tabs .subtab{flex:1 1 0;text-align:center;padding:11px 10px;border-radius:0;border:0;font-size:14px;color:#64748b;background:transparent}
.stu-imp-tabs .subtab:hover{background:#eef3fb;color:var(--navy)}
.stu-imp-tabs .subtab.on{background:#1d4ed8;color:#fff;font-weight:700;box-shadow:inset 0 -3px 0 rgba(0,0,0,.12)}
.stu-imp-tabs .subtab + .subtab{border-left:1px solid var(--line)}
.subpane{display:none}
.subpane.on{display:block}
/* 学员端个人中心：页签、筛选栏、成绩卡片、出勤列表 */
.me-filter{display:flex;gap:8px;align-items:center;flex-wrap:wrap;margin-bottom:12px}
.me-filter .me-fl{display:flex;align-items:center;gap:6px}
.me-filter .me-fl label{font-size:12px;color:var(--muted)}
.me-filter .finput{width:auto;padding:7px 10px}
.me-count{font-size:13px;color:var(--navy);font-weight:600;margin-bottom:10px}
.me-qr-btn{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:3px;width:58px;height:58px;margin-left:auto;flex:0 0 auto;background:var(--card);border:1px solid var(--line);border-radius:10px;color:var(--navy);font-size:12px;font-weight:600;line-height:1;cursor:pointer;transition:background .15s ease,border-color .15s ease,color .15s ease;align-self:center}
.me-qr-btn:hover{background:#eef3fb;border-color:#d7e4f7;color:var(--blue)}
.me-qr-btn .me-qr-ico{fill:currentColor;flex:0 0 auto}
/* 手机端：签到码与页签排同一行、靠右（不单独占一行，老板 2026-10-21）
   标题行只留「巴达，个人中心 + 班级」，签到码下移到页签行右侧，与页签垂直居中对齐 */
#page-student .subtabs{display:flex;align-items:center;flex-wrap:nowrap;gap:6px}
#page-student .subtabs .subtab{flex:0 0 auto}
#page-student .subtabs{align-items:center;padding-top:6px;overflow:visible}
#page-student .me-qr-btn{width:52px;height:52px;flex-direction:column;gap:2px;font-size:11px;border-radius:10px;align-self:center;margin:0}
@media(max-width:768px){
  #page-student .overview-head{padding-right:0}
  /* 页签行横向可滚，但签到码固定贴右不被滚走 */
  #page-student .subtabs{overflow-x:auto;-webkit-overflow-scrolling:touch;padding-bottom:10px;
    scrollbar-width:none}
  #page-student .subtabs::-webkit-scrollbar{display:none}
  #page-student .me-qr-btn{position:sticky;right:0;margin-left:auto;
    box-shadow:-10px 0 10px -6px rgba(255,255,255,.95)}
}
.me-icon-btn{display:inline-flex;align-items:center;gap:5px;padding:7px 13px;background:var(--card);border:1px solid var(--line);border-radius:8px;color:var(--navy);font-size:13px;font-weight:600;cursor:pointer;transition:background .15s ease,border-color .15s ease,color .15s ease}
.me-icon-btn:hover{background:#eef3fb;border-color:#d7e4f7;color:var(--blue)}
.me-icon-btn .me-qr-ico{fill:currentColor;flex:0 0 auto}
.me-fl-note{font-size:13px;color:var(--muted)}
.me-fl-note b{color:var(--navy);font-size:15px}
.me-spacer{flex:1 1 auto}
.me-list{display:flex;flex-direction:column;gap:10px}
.sc-card{display:flex;justify-content:space-between;align-items:center;gap:12px;padding:12px 14px;background:#f7f9fc;border:1px solid var(--line);border-radius:10px;cursor:pointer;transition:all .15s ease}
.sc-card:hover{border-color:var(--blue2);box-shadow:0 2px 10px rgba(29,78,216,.09);transform:translateY(-1px)}
.sc-card-l{min-width:0;flex:1}
.sc-card-name{font-size:15px;font-weight:600;color:var(--navy)}
.sc-card-date{font-size:12px;color:var(--muted);margin-top:3px}
.sc-card-r{text-align:right;flex:0 0 auto}
.sc-total{font-size:26px;font-weight:700;color:#1d4ed8;line-height:1.1}
.sc-total-cap{font-size:11px;color:var(--muted)}
/* 排名徽章：卡片右上角醒目显示 */
.sc-rank{display:inline-block;margin-bottom:5px;padding:3px 10px;border-radius:999px;font-size:12px;font-weight:700;line-height:1.35;background:#eef3fb;color:#2a5db0;border:1px solid #d7e4f7;white-space:nowrap}
.sc-rank .sc-rank-tot{font-weight:500;font-size:11px;color:#64748b;margin-left:5px}
.sc-rank.r1{background:linear-gradient(135deg,#fff7e6,#ffe9b8);color:#a16207;border-color:#f5cf6b;box-shadow:0 1px 6px rgba(217,119,6,.18)}
.sc-rank.r2{background:linear-gradient(135deg,#f6f8fb,#e4ebf5);color:#475569;border-color:#c9d6e8}
.sc-rank.r3{background:linear-gradient(135deg,#fdf3ea,#f8e2cd);color:#b45309;border-color:#eec9a2}
/* 光荣榜（占位） */
.honor-head{text-align:center;margin-bottom:16px}
.honor-exam{font-size:18px;font-weight:800;color:#a8320f;
  text-shadow:0 1px 0 #ffe9ad}
.honor-sub{font-size:12px;color:#a07a34;margin-top:5px;font-weight:600}
.honor-ph{padding:28px 18px;text-align:center;background:#f8fafd;border:1px dashed #c9d9ee;border-radius:12px}
.honor-ph-ico{font-size:40px;line-height:1;margin-bottom:10px}
.honor-ph-t{font-size:15px;font-weight:700;color:var(--navy);margin-bottom:8px}
.honor-ph-d{font-size:13px;color:#5a6b85;line-height:1.8}
.honor-ph-d b{color:#1d4ed8}
/* 光荣榜：排名表（排名/姓名/手机号/总分，四列对齐）2026-10-05 */
.honor-set{display:flex;justify-content:flex-end;align-items:center;gap:6px;margin:2px 0 12px}
.honor-set-tip{font-size:12px;color:#a07a34;font-weight:600;margin-right:2px}
.honor-sel{padding:6px 10px;border:1px solid #dbe2ee;border-radius:8px;background:#f5f7fb;
  color:#1a2438;font-size:13px;outline:none}
.honor-sel:focus{border-color:var(--blue2)}
/* ── 光荣榜：喜庆榜面（2026-10-05 换皮，布局不变）── */
/* 整榜铺暖金渐变 + 描金边，像喜报/奖状 */
.honor-body-wrap{background:linear-gradient(160deg,#fffaf0 0%,#fff5e0 45%,#fdeccd 100%);
  border:2px solid #e8c877;border-radius:12px;padding:16px 14px;
  box-shadow:0 4px 18px rgba(200,150,40,.14) inset}
.honor-set{display:flex;justify-content:flex-end;align-items:center;gap:6px;margin:2px 0 12px}
.honor-sel{padding:6px 10px;border:1px solid #e2c88a;border-radius:8px;background:#fffdf7;
  color:#7a4a10;font-size:13px;outline:none;font-weight:600}
.honor-sel:focus{border-color:#c99a2e}
.honor-table{margin-top:2px}
.honor-tr{display:flex;align-items:center;gap:10px;padding:10px 12px;border-radius:9px;
  background:rgba(255,255,255,.72);border:1px solid #f0e3c4;margin-bottom:6px}
.honor-th{background:transparent;border:none;margin-bottom:2px;padding:6px 12px;
  font-size:12px;color:#a07a34;font-weight:700}
/* 表头各列必须与数据行同名类同对齐（否则标题/数据错位） */
.honor-th .honor-rank{text-align:center;font-size:12px;font-weight:700}
.honor-th .honor-name{text-align:center;font-size:12px;font-weight:700}
.honor-th .honor-phone{text-align:center;font-size:12px;font-weight:700}
.honor-th .honor-score{text-align:right;font-size:12px;font-weight:700}
/* 前三名：金 / 银 / 铜 光 */
.honor-tr.honor-top{background:linear-gradient(90deg,#fff6d6,#ffe9ad);border-color:#e6c268;
  box-shadow:0 2px 10px rgba(214,164,50,.22)}
.honor-tr.honor-top.honor-r1{background:linear-gradient(90deg,#ffeeb0,#ffdf82,#ffd45e);
  border-color:#d9a72e;box-shadow:0 3px 14px rgba(214,164,50,.38)}
.honor-tr.honor-top.honor-r2{background:linear-gradient(90deg,#f8fbfe,#e6eef6,#d8e3ee);
  border-color:#b9c9da;box-shadow:0 2px 10px rgba(150,170,195,.28)}
.honor-tr.honor-top.honor-r3{background:linear-gradient(90deg,#fdf3e6,#f6e2c8,#efd5b2);
  border-color:#d9b183;box-shadow:0 2px 10px rgba(190,140,80,.26)}
/* 列宽固定，四列各自对齐 */
.honor-rank{flex:0 0 52px;text-align:center;font-weight:800;color:#8a5a12;
  font-variant-numeric:tabular-nums;font-size:15px}
.honor-tr.honor-top .honor-rank{font-size:24px;line-height:1}
.honor-name{flex:1 1 auto;min-width:0;text-align:center;font-size:14px;color:#5a3410;
  font-weight:700;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.honor-tr.honor-top .honor-name{font-size:15px;color:#4a2a08}
.honor-phone{flex:0 0 118px;text-align:center;font-size:13px;color:#8a6a3c;
  font-variant-numeric:tabular-nums;white-space:nowrap;
  font-family:ui-monospace,Consolas,monospace}
.honor-score{flex:0 0 64px;text-align:right;font-size:15px;font-weight:800;color:#c0392b;
  font-variant-numeric:tabular-nums}
.honor-tr.honor-top .honor-score{font-size:18px}
.honor-tip{margin-top:10px;text-align:center;font-size:12px;color:#a07a34}

.honor-table{margin-top:2px}
/* 考情分析弹窗（2026-10-05）：总览统计 + 分数段条形 + 各大题分块 */
.an-sec{margin-top:16px}
.an-sec-t{font-size:14px;font-weight:700;color:var(--navy);margin-bottom:10px;
  padding-left:9px;border-left:3px solid var(--blue2)}
.an-stats{display:grid;grid-template-columns:repeat(2,1fr);gap:8px}
.an-stat{display:flex;justify-content:space-between;align-items:baseline;gap:8px;
  padding:9px 12px;background:#f8fafd;border:1px solid #e6eefa;border-radius:9px}
.an-stat-l{font-size:12px;color:#5a6b85}
.an-stat-v{font-size:15px;font-weight:700;color:var(--navy);font-variant-numeric:tabular-nums}
.an-stat-v i{font-style:normal;font-size:11px;color:#8a6d1f;margin-left:5px;font-weight:600}
.an-bars{display:flex;flex-direction:column;gap:7px}
.an-bar-row{display:flex;align-items:center;gap:9px}
.an-bar-label{flex:0 0 74px;text-align:right;font-size:12px;color:#5a6b85;
  font-variant-numeric:tabular-nums;white-space:nowrap}
.an-bar-track{flex:1 1 auto;min-width:0;height:18px;background:#eef3fb;border-radius:6px;overflow:hidden}
.an-bar-fill{display:block;height:100%;background:linear-gradient(90deg,#5b9bf3,#2b6cb0);
  border-radius:6px;transition:width .25s ease}
.an-bar-count{flex:0 0 46px;text-align:left;font-size:12px;color:#1a2438;font-weight:600;
  font-variant-numeric:tabular-nums}
.an-sub{margin-bottom:14px;padding:12px;background:#fbfcfe;border:1px solid #e9f0fa;border-radius:10px}
.an-sub-h{font-size:13px;font-weight:700;color:#1a2438;margin-bottom:9px;
  display:flex;justify-content:space-between;align-items:baseline;gap:8px}
.an-sub-n{font-size:11px;color:var(--muted);font-weight:500}
.an-sub-stats{display:flex;flex-wrap:wrap;gap:6px 16px;margin-bottom:10px}
.an-sub-stats span{font-size:12px;color:#5a6b85}
.an-sub-stats b{color:var(--navy);font-size:13px;font-variant-numeric:tabular-nums}
.an-bars-sm .an-bar-track{height:15px}
.an-bar-count i{font-style:normal;font-size:10px;color:#a07a34;margin-left:4px}
.an-concl{margin-top:16px;padding:11px 14px;border-radius:10px;font-size:13px;color:#4a2a08;
  background:linear-gradient(90deg,#fff6d6,#ffefc2);border:1px solid #ecd28a;line-height:1.7}
.an-concl b{color:#a8320f}
/* 考情分析图表：完整的一张图（Y轴+绘图区+X轴）2026-10-05 */
.an-sec-sub{display:inline-block;font-size:11px;font-weight:500;color:#a07a34;margin-left:8px}
.an-chart{display:flex;gap:8px;padding:10px 10px 6px;background:#f8fafd;
  border:1px solid #e9f0fa;border-radius:10px}
.an-yaxis{flex:0 0 auto;display:flex;flex-direction:column;justify-content:space-between;
  align-items:flex-end;height:150px;padding-bottom:26px;font-size:10px;color:#8aa0bd;
  font-variant-numeric:tabular-nums}
.an-plot{flex:1 1 auto;min-width:0;display:flex;flex-direction:column}
.an-chart-sm .an-yaxis{height:120px;padding-bottom:22px}
.an-xaxis{margin-top:4px;text-align:center;font-size:10px;color:#8aa0bd;border-top:1px solid #e2ebf6;
  padding-top:5px}
/* 柱状条（竖柱，柱底贴同一基线 → 成一张图） */
.an-cols{display:flex;align-items:flex-end;justify-content:space-between;gap:6px;height:150px}
.an-chart-sm .an-cols{height:120px}
.an-col{flex:1 1 0;min-width:0;display:flex;flex-direction:column;align-items:center;
  justify-content:flex-end;height:100%}
.an-col-num{font-size:11px;font-weight:700;color:#1a2438;font-variant-numeric:tabular-nums;
  line-height:1.1;margin-bottom:3px;white-space:nowrap}
.an-col-num em{display:block;font-style:normal;font-size:9px;color:#a07a34;font-weight:600}
.an-col-wrap{flex:1 1 auto;width:100%;display:flex;align-items:flex-end;justify-content:center}
.an-col-fill{width:82%;max-width:44px;border-radius:5px 5px 0 0;transition:height .3s ease;
  min-height:3px;box-shadow:0 -1px 3px rgba(30,80,160,.12) inset}
.an-col-fill.c1{background:linear-gradient(180deg,#a9bdd8,#8098bc)}
.an-col-fill.c2{background:linear-gradient(180deg,#7aa7e0,#5588c9)}
.an-col-fill.c3{background:linear-gradient(180deg,#5b9bf3,#2b6cb0)}
.an-col-fill.c4{background:linear-gradient(180deg,#ffb84d,#f0912a)}
.an-col-label{font-size:10px;color:#5a6b85;margin-top:5px;text-align:center;
  font-variant-numeric:tabular-nums;white-space:nowrap;line-height:1.1}
.an-chart-sm .an-col-label{font-size:9px}
/* 展开更多指标 */
.an-more-btn{margin-top:8px;text-align:center;font-size:12px;color:#2b6cb0;font-weight:600;
  cursor:pointer;padding:6px;background:#f2f7fd;border-radius:8px}
.an-more-btn:active{background:#e6f0fb}
@media(max-width:400px){
  .an-cols{height:130px;gap:3px}
  .an-yaxis{height:130px}
  .an-chart-sm .an-cols,.an-chart-sm .an-yaxis{height:110px}
  .an-col-num{font-size:10px}
  .an-col-label{font-size:9px;letter-spacing:-.3px}
}
.an-bars-sm .an-bar-label{flex:0 0 70px;font-size:11px}
/* 极窄屏 */
@media(max-width:400px){
  .an-stats{grid-template-columns:1fr}
  .an-bar-label{flex:0 0 62px;font-size:11px}
  .an-bar-count{flex:0 0 40px;font-size:11px}
}
/* 极窄屏 */
@media(max-width:400px){
  .honor-tr{gap:6px;padding:9px 9px}
  .honor-rank{flex:0 0 42px;font-size:14px}
  .honor-tr.honor-top .honor-rank{font-size:18px}
  .honor-name{font-size:13px}
  .honor-phone{flex:0 0 100px;font-size:12px}
  .honor-score{flex:0 0 52px;font-size:14px}
}
.sc-tags{display:flex;gap:6px;flex-wrap:wrap;margin-top:6px}
.sc-tag{font-size:11px;background:#eef3fb;color:#2a5db0;border-radius:6px;padding:2px 8px}
.att-row{display:flex;gap:12px;align-items:center;padding:10px 12px;background:#f7f9fc;border:1px solid var(--line);border-radius:9px;font-size:13px;flex-wrap:wrap}
.att-date{font-weight:600;color:var(--navy)}
.att-time{color:var(--blue);font-variant-numeric:tabular-nums}
.att-period{color:var(--muted)}
.att-cls{color:var(--muted);margin-left:auto}
.sc-detail-tb{display:grid;grid-template-columns:1fr 1fr;gap:0;border:1px solid var(--line);border-radius:8px;overflow:hidden;margin:10px 0}
.sc-detail-tb .sc-dth{background:#eef3fb;font-size:12px;font-weight:600;color:var(--navy);padding:8px 12px}
.sc-detail-tb .sc-dtc{padding:8px 12px;font-size:13px;border-top:1px solid #eef2f7;color:#0f172a}
.sc-agg{display:flex;gap:18px;flex-wrap:wrap;margin-top:14px;padding-top:12px;border-top:1px dashed #e2e8f0;font-size:13px;color:var(--muted)}
.sc-agg b{color:#1d4ed8;font-size:15px}
.sc-note{margin-top:12px;padding:10px 12px;background:#f7faff;border:1px solid #dbe7f7;border-left:3px solid var(--blue2);border-radius:8px}
.sc-note-h{font-size:12px;font-weight:600;color:var(--navy);margin-bottom:4px}
.sc-note-b{font-size:13px;color:#334155;line-height:1.7;white-space:pre-wrap;word-break:break-word}
.sc-newform{display:flex;gap:12px;align-items:flex-end;flex-wrap:wrap}
.sc-newform .fgroup{margin:0;min-width:170px;flex:1}
/* 学员信息模板：并排小按钮行（不占大块） */
.stu-tpl-bar{display:flex;gap:8px;flex-wrap:wrap;margin-top:10px}
.sc-toolbar{display:flex;gap:8px;align-items:center;flex-wrap:wrap;margin-bottom:12px}
/* 成绩明细：手机上左右滑动看全部列（不压缩列宽、不竖排断裂） */
.sc-list{overflow-x:auto;-webkit-overflow-scrolling:touch}
.sc-tb{min-width:760px}
@media(max-width:768px){
  .sc-list{border:1px solid #e9f0fa;border-radius:10px;background:#fff}
  .sc-tb{min-width:820px}
  .sc-tb th,.sc-tb td{padding:8px 9px;font-size:12px}
  /* 首列（学员姓名）粘住，左右滑时始终能看到是谁 */
  .sc-tb th:first-child,.sc-tb td:first-child{
    position:sticky;left:0;z-index:1;background:#fff;
    box-shadow:2px 0 6px rgba(30,80,160,.08)}
  .sc-tb th:first-child{background:#f7f9fc}
  .sc-tb tr:hover td:first-child{background:#f9fbfe}
}
/* 成绩查看弹窗（点考试名称打开） */
/* 卡片限高 + 弹窗体内滚：滚动发生在卡片内部，标题 sticky 吸附在卡片顶，
   内容不会从卡片上方「露出去」（老板 2026-10-05 反馈） */
.sc-view-modal{max-width:760px;max-height:calc(100vh - 80px);max-height:calc(100dvh - 80px);
  display:flex;flex-direction:column;overflow:hidden}
.sc-view-modal .modal-body{padding:16px 18px;overflow-y:auto;-webkit-overflow-scrolling:touch;
  flex:1 1 auto;min-height:0}
.sc-view-modal #sc-view-sub{margin-bottom:12px}
.sc-tb{width:100%;border-collapse:collapse;font-size:13px}
.sc-tb th{text-align:left;font-weight:600;color:var(--navy);background:#f7f9fc;padding:9px 10px;border-bottom:1px solid var(--line);white-space:nowrap}
.sc-tb td{padding:9px 10px;border-bottom:1px solid #eef2f7;color:#0f172a}
.sc-tb tr:hover td{background:#f9fbfe}
.sc-sub{display:block;font-size:11px;color:var(--muted)}
/* 学员成绩报告卡（粉笔风·马卡龙可爱版 2026-10-05） */
.sc-card-hint{font-size:11px;color:#8aa0bd;margin-top:6px}
/* 成绩报告主卡：金榜红金风（与光荣榜同源，2026-10-05 老板定） */
.rc-hero{text-align:center;padding:22px 16px 20px;border-radius:16px;color:#5a3410;
  background:linear-gradient(160deg,#fffaf0 0%,#fff3d8 45%,#fde8bc 100%);
  border:1.5px solid #e2c88a;
  box-shadow:0 8px 26px rgba(190,140,80,.28);margin-bottom:14px;position:relative;overflow:hidden}
.rc-hero::before{content:'';position:absolute;inset:5px;border:1px solid rgba(201,154,46,.35);
  border-radius:11px;pointer-events:none}
.rc-hero-label{font-size:13px;color:#a07a34;letter-spacing:3px;font-weight:700}
.rc-hero-score{font-size:54px;font-weight:800;line-height:1.1;margin:6px 0 8px;color:#c0392b;
  text-shadow:0 2px 10px rgba(192,57,43,.16);font-variant-numeric:tabular-nums}
.rc-hero-rank{font-size:14px;font-weight:700;color:#7a4a0a;
  background:linear-gradient(90deg,#fff6d6,#ffe9ad);border:1px solid #e6c268;
  display:inline-block;padding:4px 16px;border-radius:999px;margin-bottom:8px}
.rc-hero-rank b{font-size:17px;color:#c0392b}
.rc-hero-exam{font-size:12px;color:#a07a34;margin-top:5px;font-weight:600}
/* 学员端光荣榜：盖在成绩详情弹窗之上（z-index 同「座位图盖编辑弹窗」，2026-10-05） */
#stu-honor-mask{z-index:320}
/* 成绩详情底部操作条（2026-10-05） */
.modal-foot{display:flex;justify-content:center;gap:10px;padding:12px 16px;
  border-top:1px solid var(--line);background:#fffdf7}
.stu-honor-modal{max-width:560px}
.stu-honor-modal .modal-body{padding:16px 14px}
/* 个人中心底部常驻签到码：整卡可点 */
.me-qr-panel{cursor:pointer;margin-top:12px}
.me-qr-panel:active{opacity:.92}
/* 老师评语便签（2026-10-05） */
.rc-comment-box{margin:0 0 16px;padding:12px 14px;border-radius:12px;
  background:linear-gradient(160deg,#fffdf7,#fff4dd);border:1px solid #eed9ab;
  border-left:4px solid #d9a12e}
.rc-comment-h{font-size:12px;font-weight:700;color:#a07a34;margin-bottom:6px;letter-spacing:1px}
.rc-comment-b{font-size:13px;color:#5a3410;line-height:1.75;word-break:break-word;white-space:normal}
.rc-hero-comment{font-size:13px;color:#8a5a12;background:linear-gradient(90deg,#fff6d6,#ffe9ad);
  border:1px solid #e6c268;display:inline-block;padding:4px 14px;border-radius:999px;margin-bottom:8px}
/* 三项核心指标 */
.rc-metrics{display:grid;grid-template-columns:repeat(3,1fr);gap:9px;margin-bottom:18px}
.rc-metric{text-align:center;padding:13px 6px;border-radius:13px;
  background:linear-gradient(160deg,#fffdf7,#fff6e6);border:1px solid #eed9ab}
.rc-metric-v{font-size:21px;font-weight:800;font-variant-numeric:tabular-nums;line-height:1.2}
.rc-v-max{color:#c98a1e}
.rc-v-avg{color:#a06a1a}
.rc-v-beat{color:#c0392b}
.rc-metric-l{font-size:11px;color:#a07a34;margin-top:5px;font-weight:600}
/* 各模块得分 */
.rc-sec-t{font-size:14px;font-weight:700;color:#a8320f;margin:4px 0 10px;
  padding-left:9px;border-left:3px solid #d9a12e}
.rc-subs{margin-bottom:6px}
.rc-sub{display:flex;align-items:center;gap:10px;margin-bottom:9px}
.rc-sub-k{flex:0 0 76px;font-size:13px;color:#3a4a63;text-align:right;
  overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.rc-sub-bar{flex:1 1 auto;min-width:0;height:12px;background:#f6ecd6;border-radius:6px;overflow:hidden}
.rc-sub-bar i{display:block;height:100%;border-radius:6px;
  background:linear-gradient(90deg,#f0c96a,#d9a12e)}
.rc-sub-v{flex:0 0 44px;font-size:13px;font-weight:800;color:#c0392b;
  font-variant-numeric:tabular-nums}
/* 本场整体分析 */
.rc-analysis{background:linear-gradient(160deg,#fffdf7,#fff8ec);border:1px solid #eed9ab;border-radius:12px;padding:12px}
.rc-an-stats{display:flex;flex-wrap:wrap;gap:8px 16px;margin-bottom:11px}
.rc-an-stats span{font-size:12px;color:#5a6b85}
.rc-an-stats b{color:var(--navy);font-size:14px;font-variant-numeric:tabular-nums}
.rc-an-bars{margin-bottom:11px}
.rc-an-bar{display:flex;align-items:center;gap:9px;margin-bottom:6px}
.rc-an-l{flex:0 0 68px;text-align:right;font-size:11px;color:#7b8ba6;
  font-variant-numeric:tabular-nums;white-space:nowrap}
.rc-an-t{flex:1 1 auto;min-width:0;height:14px;background:#f6ecd6;border-radius:5px;overflow:hidden}
.rc-an-t i{display:block;height:100%;border-radius:5px;
  background:linear-gradient(90deg,#f0c96a,#d9a12e)}
.rc-an-v{flex:0 0 28px;font-size:11px;font-weight:700;color:#1a2438}
.rc-an-subs{display:flex;flex-direction:column;gap:6px}
.rc-an-sub{display:flex;flex-wrap:wrap;gap:6px 12px;font-size:12px;color:#5a6b85;
  padding:7px 10px;border-radius:8px;background:#fff;border:1px solid #eef3fb}
.rc-an-sk{font-weight:700;color:#3a4a63}
.rc-an-sv{font-variant-numeric:tabular-nums}
.rc-an-concl{margin-top:10px;padding:9px 12px;border-radius:9px;font-size:12px;color:#4a2a08;
  background:linear-gradient(90deg,#fff6d6,#ffefc2);border:1px solid #ecd28a}
.rc-an-concl b{color:#a8320f}
@media(max-width:400px){
  .rc-hero-score{font-size:44px}
  .rc-metric-v{font-size:18px}
  .rc-sub-k{flex:0 0 64px;font-size:12px}
}
.sc-errors{margin-top:10px}
/* 班级学员导入：模板入口 + 结果明细 */
.imp-tpl-bar{display:flex;align-items:center;gap:10px;flex-wrap:wrap;margin:10px 0 4px}
.imp-tpl-tip{font-size:12px;color:var(--muted)}
.imp-result{margin-top:10px}
.imp-stat{display:flex;gap:14px;flex-wrap:wrap;align-items:center;padding:9px 12px;border-radius:8px;background:#f7f9fc;border:1px solid var(--line);font-size:13px}
.imp-ok{color:#15803d}
.imp-ok b,.imp-bad b{font-size:15px}
.imp-bad{color:#b91c1c}
.imp-neutral{color:var(--muted);margin-left:auto}
.imp-note{font-size:12px;color:#5a6b85;margin-top:7px;line-height:1.7}
.imp-all-ok{color:#15803d;font-weight:600}
.imp-result .sc-err-title{margin-top:9px}
.sc-err-title{font-size:13px;font-weight:600;color:#b91c1c;margin-bottom:6px}
.sc-err-row{font-size:12px;color:#b91c1c;background:#fef2f2;border:1px solid #f3c9c9;border-radius:6px;padding:6px 10px;margin-bottom:5px}
.me-detail-kv{display:flex;justify-content:space-between;padding:7px 0;border-bottom:1px dashed #eef2f7;font-size:13px}
.me-detail-kv span{color:var(--muted)}
.me-detail-kv b{color:#0f172a}
/* 座位图 */
.room-map{display:block;padding:14px 8px;background:#f7f9fc;border:1px solid var(--line);border-radius:10px;overflow-x:auto}
.room-map .rm-row{display:flex;gap:6px}
.room-map .rm-seat{width:52px;height:40px;border-radius:7px;background:#fff;border:1px solid #d7e0ee;display:flex;align-items:center;justify-content:center;font-size:11px;color:var(--muted);flex:0 0 auto;cursor:pointer;transition:all .14s ease;flex-direction:column;line-height:1.15;user-select:none}
.room-map .rm-seat:hover{border-color:var(--blue2);box-shadow:0 0 0 2px #dbeafe;transform:translateY(-1px)}
.room-map .rm-seat.rm-aisle{background:repeating-linear-gradient(90deg,#eef2f7,#eef2f7 4px,#dfe6ef 4px,#dfe6ef 8px);border-style:dashed;border-color:#c7d2e0;color:#93a1b5;cursor:pointer}
.room-map .rm-seat.rm-broken{background:#fef2f2;border-color:#f3c9c9;color:#c96a6a;cursor:pointer}
.room-map .rm-seat.rm-exit{background:#e8f8ee;border-color:#a8e0bd;color:#1f8a4c;font-size:10px}
.room-map .rm-seat.rm-fire{background:#fff4e5;border-color:#f5cf9a;color:#b26a00;font-size:10px}
.room-map .rm-seat.rm-pillar{background:#3d4655;border-color:#2b323d;color:#cfd6e0;font-size:10px}
.room-map .rm-seat.rm-water{background:#e6f4fb;border-color:#a8d5ea;color:#1a6f96;font-size:10px}
.room-map .rm-seat.used{background:#e8f1fd;border-color:#b8d3f4;color:var(--navy);font-weight:600}
.room-map .rm-seat.used b{font-size:12px;font-weight:600;color:var(--navy);max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;display:block;text-align:center;padding:0 2px}
.room-map .rm-seat.used span{font-size:10px;color:var(--muted);font-weight:400;white-space:nowrap}
.room-map .rm-seat.used:hover{background:#dbeafe;border-color:var(--blue2)}
.room-map .rm-seat.used.sel{background:#dbeafe;border-color:var(--blue2);box-shadow:0 0 0 2px #bfdbfe}
/* 座位图横向滚动容器：手机端左右滑动看全，不压缩格子尺寸 */
.room-map .rm-scroll{display:flex;flex-direction:column;gap:6px;align-items:center;min-width:100%;width:max-content;margin:0 auto;padding:0 2px}
@media(max-width:768px){
  /* 小屏：容器可横向滑动，格子保持原尺寸（与电脑端一致）
     注意：不要用 flex 居中（内容溢出时左侧会被裁且滚不到），靠 .rm-scroll 的 margin:0 auto */
  .room-map{overflow-x:auto;-webkit-overflow-scrolling:touch}
}
@media(max-width:768px){
  .seat-wrap{flex-direction:column}
  .seat-map-side,.seat-list-side{flex:1 1 auto;width:100%;min-width:0}
  .seat-stu-list{max-height:280px}
  .rm-toolbar{flex-direction:column;align-items:stretch;gap:8px}
  .rm-modes{flex-wrap:wrap}
  .rm-acts{flex-wrap:wrap}
  .rm-mode{padding:7px 11px;font-size:12px}
}
.room-map .rm-rownum{width:32px;flex:0 0 auto;font-size:11px;color:var(--muted);display:flex;align-items:center;justify-content:center}
.room-map .rm-seat.used{background:#e8f1fd;border-color:#b8d3f4;color:var(--navy);font-weight:600}
.room-map .rm-stage{width:100%;max-width:520px;text-align:center;padding:7px;background:#eaf0f9;border-radius:8px;font-size:12px;color:var(--navy);font-weight:600;margin-bottom:8px}
/* 学生编辑弹窗 */
/* 卡片限高 + 弹窗体内滚：否则长表单（新增学员 14 个字段）在手机上会超出卡片，
   而 .modal-head 是 sticky，滚动时浮在卡片顶端外面、压住字段（老板反馈「超出容器」） */
.stu-edit-modal{max-width:480px;max-height:calc(100vh - 80px);max-height:calc(100dvh - 80px);
  display:flex;flex-direction:column}
.stu-edit-modal .modal-body{overflow-y:auto;-webkit-overflow-scrolling:touch}
.stu-edit-modal .field label{color:#5a6b85}
.stu-edit-modal .field input,.stu-edit-modal .field select{width:100%;padding:10px 12px;background:#f5f7fb;border:1px solid #dbe2ee;border-radius:9px;color:#1a2438;font-size:14px;outline:none}
.stu-edit-modal .field input:focus,.stu-edit-modal .field select:focus{border-color:var(--blue2)}
/* iOS Safari：input[type=date] 有固有最小宽度，会撑破弹窗（老板反馈「选日期框溢出去了」）
   修法：宽度算进盒模型 + 允许收缩 + 去掉系统默认外观的最小宽度 */
.stu-edit-modal .field input[type=date]{
  -webkit-appearance:none;appearance:none;
  min-width:0;max-width:100%;
  box-sizing:border-box;
  -webkit-min-logical-width:0;
}
/* 兜底：所有弹窗里的日期/时间框都不许横向溢出 */
.modal .field input[type=date],.modal .field input[type=datetime-local],
.modal .field input[type=time],.modal .field input[type=month]{
  -webkit-appearance:none;appearance:none;min-width:0;max-width:100%;box-sizing:border-box;
}
/* 极窄屏（<360）：日期框字号降一档，避免 iOS 撑破 */
@media(max-width:400px){
  .stu-edit-modal .field input[type=date]{font-size:13px;padding:10px 8px}
}
.stu-edit-id{font-size:12px;color:var(--muted);margin-bottom:14px;padding:8px 12px;background:#f0f5fc;border-radius:8px}
.stu-id-chip{font-family:ui-monospace,Consolas,monospace;font-size:12px;color:var(--navy);background:#eef3fb;padding:2px 7px;border-radius:6px;border:1px solid #d7e4f7}
/* 学员列表：一人可报多班，班级列并排显示（首个=主班） */
.cls-tag{display:inline-block;padding:2px 8px;margin:2px 4px 2px 0;border-radius:5px;font-size:11px;background:#f2f4f7;color:#5b6472;border:1px solid #e3e7ee;white-space:nowrap}
.cls-tag.main{background:#eef3fb;color:#2b6cb0;border-color:#dbe6f7}
/* 导入结果里的「请注意核对」提示行（非错误） */
.imp-note-row{color:#8a6d1f}


/* ===== 欢迎页（登录后首屏） ===== */
.welcome-page{max-width:720px;margin:48px auto;text-align:center;padding:0 16px}
.welcome-page h1{font-size:24px;font-weight:700;color:var(--navy);margin:0 0 32px}
.welcome-page .btn-group{gap:24px;justify-content:center;flex-wrap:wrap}
.btn-large{flex:1 1 240px;max-width:300px;padding:36px 20px;border:2px solid var(--line);border-radius:16px;background:var(--card);color:var(--navy);font-size:20px;font-weight:700;cursor:pointer;box-shadow:0 2px 10px rgba(22,50,92,.06);transition:transform .15s ease,box-shadow .15s ease,border-color .15s ease}
.btn-large:hover{transform:translateY(-3px);box-shadow:0 10px 24px rgba(22,50,92,.16);border-color:var(--blue2)}
.btn-large:active{transform:translateY(-1px)}
@media (max-width:640px){.welcome-page{margin:24px auto}.welcome-page h1{font-size:20px;margin-bottom:22px}.welcome-page .btn-group{gap:14px}.btn-large{flex:1 1 100%;max-width:none;padding:26px 16px;font-size:18px}}
/* 学生编辑弹窗：重置密码分区 */
.stu-edit-pwd{margin-top:14px;padding-top:14px;border-top:1px dashed var(--line)}
.sep-title{font-size:13px;font-weight:600;color:var(--navy);margin-bottom:6px}

/* 班级列表：行内下拉（班主任 / 上课教室） */
.cls-inline-sel{width:100%;max-width:170px;padding:6px 8px;border:1px solid #dbe2ee;border-radius:7px;background:#fff;color:#1a2438;font-size:13px;cursor:pointer;transition:border-color .15s ease}
.cls-inline-sel:hover{border-color:#b8d3f4}
.cls-inline-sel:focus{outline:none;border-color:var(--blue2)}
/* 班级列表 · 手机端：列不挤压，超出横向滑动（否则下拉文本会被截断） */
@media(max-width:768px){
  #stu-class .ov-table{overflow-x:auto;-webkit-overflow-scrolling:touch}
  #stu-class .ov-tb{min-width:780px}
  #stu-class .cls-inline-sel{max-width:none;min-width:132px}
}

/* 学生查询 · 窄屏：.query-wrap 转列后 align-items:flex-start 不拉伸结果区，
   结果区会被 7 列表格撑宽 → 页面横向溢出。这里只在学生查询页撑满 + 表格内部横滑。
   注意：#stu-query 限定本页，别动共享的 .query-wrap / .panel-result（职位页也在用）。 */
@media(max-width:900px){
  #stu-query .query-wrap{align-items:stretch}
  #stu-query .panel-result{width:100%}
  #stu-query .ov-table{overflow-x:auto;-webkit-overflow-scrolling:touch}
  #stu-query .ov-tb{min-width:640px}
}

/* ===== 座位：布局编辑工具条 ===== */
.rm-toolbar{display:flex;flex-wrap:wrap;gap:10px;justify-content:space-between;align-items:center;margin-bottom:10px}
.rm-modes{display:flex;gap:6px}
.rm-mode{padding:7px 14px;border:1px solid var(--line);background:#fff;border-radius:8px;font-size:13px;color:var(--txt);cursor:pointer;transition:all .14s ease;font-family:inherit}
.rm-mode:hover{border-color:var(--blue2);background:#f2f7fe}
.rm-mode.on{background:var(--navy);border-color:var(--navy);color:#fff;font-weight:600}
.rm-acts{display:flex;gap:8px;flex-wrap:wrap}
.rm-save{background:var(--navy)!important;color:#fff!important;border-color:var(--navy)!important}
.rm-save:hover{background:var(--navy2)!important}

/* ===== 座位：班级排座 ===== */
.seat-wrap{display:flex;gap:18px;align-items:flex-start;flex-wrap:wrap}
.seat-map-side{flex:1 1 420px;min-width:300px}
.seat-list-side{flex:0 1 260px;min-width:220px}

/* ===== 座位操作菜单（点已入座的座位弹出）===== */
.seat-menu{position:fixed;z-index:520;background:#fff;border:1px solid var(--line);border-radius:12px;box-shadow:0 10px 30px rgba(20,40,80,.18);padding:8px;min-width:150px}
.seat-menu .sm-name{font-size:12px;color:var(--muted);padding:2px 8px 8px;border-bottom:1px solid var(--line);margin-bottom:6px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:200px}
.seat-menu .sm-btn{display:block;width:100%;text-align:left;border:none;background:transparent;padding:9px 10px;border-radius:8px;font-size:13px;color:var(--navy);cursor:pointer}
.seat-menu .sm-btn:hover{background:#eef4ff;color:var(--blue2)}
.seat-menu .sm-btn.sm-close{color:var(--muted);font-size:12px}
.room-map .rm-seat.swapfrom{background:#fff4e5;border-color:#f5b942;box-shadow:0 0 0 2px #fde3b0}

/* ===== 座位图打印 / 导出 ===== */
.seat-print-mask{display:none;position:fixed;inset:0;z-index:410;background:#eef1f5;overflow:auto}
.seat-print-mask.show{display:block}
.seat-print-toolbar{position:sticky;top:0;z-index:2;display:flex;align-items:center;justify-content:space-between;gap:12px;flex-wrap:wrap;background:#fff;border-bottom:1px solid var(--line);padding:10px 16px}
.seat-print-toolbar .spt-title{font-size:15px;font-weight:700;color:var(--navy)}
.spt-opts{display:flex;gap:8px;align-items:center;flex-wrap:wrap}
.spt-group{display:flex;align-items:center;gap:4px;font-size:12px;color:var(--muted)}
.spt-opt{border:1px solid var(--line);background:#fff;color:var(--navy);border-radius:8px;padding:6px 12px;font-size:12px;cursor:pointer}
.spt-opt:hover{border-color:var(--blue2);color:var(--blue2)}
.spt-opt.on{background:var(--blue2);border-color:var(--blue2);color:#fff;font-weight:600}
.seat-print-sheet{padding:16px;display:flex;flex-direction:column;align-items:center;gap:14px}
.seat-print-sheet img{background:#fff;box-shadow:0 4px 18px rgba(20,40,80,.14);max-width:100%;height:auto;display:block}
@media (max-width:640px){ .seat-print-toolbar{flex-direction:column;align-items:stretch} }
/* 手机端：座位图保持足够宽度，可左右滑动查看（不要压扁成窄条） */
@media screen and (max-width:900px){
  .seat-print-sheet{display:flex;flex-direction:column;align-items:flex-start;padding:10px;gap:12px}
  .seat-print-sheet img{max-width:none;width:1080px;height:auto}
}
.seat-stu-list{max-height:460px;overflow-y:auto;border:1px solid var(--line);border-radius:10px;background:#fff}
.seat-stu{display:flex;justify-content:space-between;gap:8px;padding:9px 12px;border-bottom:1px solid #f0f3f8;cursor:pointer;transition:background .12s ease;font-size:13px}
.seat-stu:last-child{border-bottom:none}
.seat-stu:hover{background:#f2f7fe}
.seat-stu.sel{background:#dbeafe;box-shadow:inset 3px 0 0 var(--blue2)}
.seat-stu .ss-name{color:var(--txt)}
.seat-stu .ss-seat{color:var(--muted);font-size:12px;flex:0 0 auto}
.seat-stu .ss-seat i{color:#b9c2d0;font-style:normal}
.seat-empty{padding:22px;text-align:center;color:var(--muted);font-size:13px}

/* ===== 二维码签到（2026-09-16） ===== */
.ck-bar{display:flex;gap:10px;flex-wrap:wrap;align-items:center;margin-bottom:12px}
.ck-sel{width:auto;min-width:210px;max-width:100%}
.ck-btn{width:auto;padding:10px 22px;margin-top:0}
.ck-stop{background:linear-gradient(135deg,#d9534f,#b93a36)}
.ck-stop:hover{background:linear-gradient(135deg,#c9423e,#a5322e)}
.ck-sel:hover{border-color:var(--blue2)}
.ck-stage{position:relative;border-radius:12px;overflow:hidden;background:#000;margin:12px 0;max-width:520px}
.ck-stage video{width:100%;display:block;max-height:400px;object-fit:cover}
/* 扫描线动画：改用 transform（GPU 合成，不触发重排），避免与视频/解码抢主线程导致卡顿
   老板 2026-10-08：原来是 top 动画（每帧 layout+paint），是扫码画面卡顿元凶之一
   注意：translateY 的百分比是相对元素自身高度（本元素仅 2px），故改用 vh 单位才动得起来 */
.ck-scanline{position:absolute;left:8%;right:8%;height:2px;background:rgba(80,220,120,.85);
  box-shadow:0 0 10px rgba(80,220,120,.9);top:10%;
  animation:ckscan 2.2s ease-in-out infinite;will-change:transform;
  transform:translateZ(0)}
@keyframes ckscan{0%,100%{transform:translateY(0)}50%{transform:translateY(55vh)}}
/* 扫码结果：铺满整页的大字提示（非全屏时用，扫完一眼看清是谁）
   z-index 低于 .ck-fs(500)，全屏扫码台照旧用它自己那套结果层 */
.ck-big{position:fixed;inset:0;z-index:400;display:none;flex-direction:column;
  align-items:center;justify-content:center;text-align:center;color:#fff;pointer-events:none;
  background:rgba(12,26,46,.92);padding:4vw}
.ck-big.show{display:flex}
.ckb-main{font-size:clamp(46px,7.5vw,120px);font-weight:900;line-height:1.1;
  text-shadow:0 3px 18px rgba(0,0,0,.55);word-break:break-all}
.ckb-sub{font-size:clamp(17px,2.1vw,28px);margin-top:14px;opacity:.95}
.ck-big.ok .ckb-main{color:#6ef09a}
.ck-big.dup .ckb-main{color:#ffd166}
.ck-big.err .ckb-main{color:#ff8b84}
.ck-grid{display:grid;grid-template-columns:1fr 1fr;gap:14px;margin-top:14px}
.ck-sub{font-size:13px;font-weight:700;color:var(--navy);margin-bottom:8px}
.ck-sub.ok{color:#1f9d55}
.ck-sub.no{color:var(--muted)}
.ck-list{max-height:300px;overflow-y:auto;border:1px solid var(--line);border-radius:10px;padding:6px;background:#fafbfd;scrollbar-width:thin}
.ck-row{display:flex;align-items:center;gap:8px;padding:7px 9px;border-radius:7px;font-size:13px;margin-bottom:4px}
.ck-row b{color:var(--navy);font-weight:600}
.ck-row span{color:var(--muted);font-size:11px}
.ck-row i{margin-left:auto;font-style:normal;font-size:11px;color:var(--muted)}
.ck-row.ok{background:#eaf9f0}
.ck-row.no{background:#f4f6f9}
.ck-empty{color:var(--muted);font-size:12px;padding:10px;text-align:center}
/* 摄像头下方两个大按钮：已签到 / 未签到（点开弹窗看名单，页面布局不被长名单顶动） */
.ck-stat-row{display:grid;grid-template-columns:1fr 1fr;gap:12px;margin-top:14px}
.ck-stat-btn{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:2px;
  padding:14px 10px;border-radius:12px;border:1px solid var(--line);background:#fff;cursor:pointer;
  font-family:inherit;transition:all .14s ease;min-height:76px}
.ck-stat-btn:hover{transform:translateY(-1px);box-shadow:0 6px 16px rgba(20,40,80,.10)}
.ck-stat-btn .ck-stat-n{font-size:26px;font-weight:800;line-height:1.1}
.ck-stat-btn .ck-stat-lb{font-size:12px;color:var(--muted)}
.ck-stat-btn.ok{background:#eaf9f0;border-color:#bfe9d0}
.ck-stat-btn.ok .ck-stat-n{color:#1f8a4c}
.ck-stat-btn.no{background:#f4f6f9;border-color:#e2e7f0}
.ck-stat-btn.no .ck-stat-n{color:#5b6b82}
.ck-list-modal{max-width:640px}
.ck-list-body{max-height:60vh}
/* 二维码打印视图 */
.qr-print-mask{display:none;position:fixed;inset:0;z-index:400;background:#eef1f5;overflow:auto}
.qr-print-mask.show{display:block}
.qr-print-toolbar{position:sticky;top:0;display:flex;align-items:center;justify-content:space-between;
  gap:10px;padding:10px 16px;background:#fff;border-bottom:1px solid var(--line);z-index:2}
.qrt-title{font-size:14px;font-weight:700;color:var(--navy)}
.qrt-actions{display:flex;gap:8px}
.qr-print-sheet{display:grid;grid-template-columns:repeat(4,1fr);gap:10px;padding:14px}
.qr-card{background:#fff;border:1px solid var(--line);border-radius:10px;padding:10px;text-align:center;
  break-inside:avoid;page-break-inside:avoid}
.qr-box{display:flex;justify-content:center;min-height:132px;align-items:center}
.qr-box img,.qr-box canvas{display:block}
.qr-name{font-size:13px;font-weight:700;color:var(--navy);margin-top:6px}
.qr-no{font-size:10px;color:var(--muted);word-break:break-all}
@media (max-width:1024px){
  .ck-grid{grid-template-columns:1fr}
  .qr-print-sheet{grid-template-columns:repeat(2,1fr)}
}
@media print{
  body *{visibility:hidden}
  .qr-print-mask,.qr-print-mask *{visibility:visible}
  .qr-print-mask{position:absolute;inset:0;background:#fff}
  .qr-print-toolbar{display:none}
  .qr-print-sheet{grid-template-columns:repeat(3,1fr)}
  .qr-card{border:1px dashed #bbb}
}

/* ===== 摄像头切换 / 全屏扫码台 / 学员码全屏页（2026-09-16 增强） ===== */
.ck-flip-on{background:linear-gradient(135deg,#2f7cf6,#1d5fd0);color:#fff;border-color:transparent}
.ck-flip-on:hover{background:linear-gradient(135deg,#2a6fdd,#17509f);color:#fff}
#ck-flip:hover,#ck-fs:hover{color:var(--navy);border-color:var(--blue2)}

/* 前置摄像头：只镜像 video 元素，canvas 取帧仍是原始未镜像帧 */
.ck-mirror video,#ck-video.mirrored{transform:scaleX(-1)}
#ck-fs-video.mirrored{transform:scaleX(-1)}

/* ---- 全屏扫码台 ---- */
.ck-fs{display:none;position:fixed;inset:0;z-index:500;background:#000;overflow:hidden}
.ck-fs.on{display:block}
.ck-fs video{position:absolute;inset:0;width:100%;height:100%;object-fit:cover;background:#000}
.ck-fs-top{position:absolute;top:0;left:0;right:0;z-index:3;display:flex;align-items:center;
  justify-content:space-between;gap:10px;padding:12px 14px;
  padding-top:calc(12px + env(safe-area-inset-top,0px));
  background:linear-gradient(180deg,rgba(0,0,0,.62),rgba(0,0,0,0))}
.ck-fs-count{font-size:clamp(20px,4.6vw,40px);font-weight:800;color:#fff;
  text-shadow:0 2px 12px rgba(0,0,0,.75);letter-spacing:.5px}
.ck-fs-exit{padding:9px 16px;border-radius:10px;border:1px solid rgba(255,255,255,.45);
  background:rgba(0,0,0,.5);color:#fff;font-size:clamp(13px,1.8vw,17px);font-weight:700;cursor:pointer}
.ck-fs-exit:hover{background:rgba(255,255,255,.24)}
.ck-fs-result{position:absolute;inset:0;z-index:2;display:none;flex-direction:column;
  align-items:center;justify-content:center;text-align:center;padding:4vw;color:#fff}
.ck-fs-result.show{display:flex}
.ck-fs-result.ok{background:rgba(9,138,64,.92)}
.ck-fs-result.dup{background:rgba(214,124,10,.93)}
.ck-fs-result.err{background:rgba(186,32,35,.93)}
.ck-fs-main{font-size:clamp(48px,12vw,160px);font-weight:900;line-height:1.08;
  text-shadow:0 6px 26px rgba(0,0,0,.45);word-break:break-all}
.ck-fs-sub{font-size:clamp(20px,4.4vw,54px);font-weight:700;margin-top:.45em;opacity:.97}
.ck-fs-result.err .ck-fs-main{font-size:clamp(40px,9vw,120px)}

/* ---- 学员端「我的签到码」全屏页 ---- */
.sq-full{display:none;position:fixed;inset:0;z-index:500;background:#0b1220;overflow:auto}
.sq-full.on{display:block}
.sq-inner{min-height:100%;display:flex;flex-direction:column;align-items:center;justify-content:center;
  gap:14px;padding:18px;text-align:center}
.sq-head{width:100%;display:flex;align-items:center;justify-content:space-between;gap:10px}
.sq-title{font-size:clamp(16px,4vw,26px);font-weight:800;color:#fff}
.sq-qr{background:#fff;padding:12px;border-radius:16px;display:inline-flex;align-items:center;justify-content:center;
  min-width:min(78vw,320px);min-height:min(78vw,320px)}
.sq-qr img,.sq-qr canvas{display:block;width:min(70vw,300px) !important;height:min(70vw,300px) !important}
.sq-no{font-size:clamp(13px,3.2vw,20px);color:#9fb0c8;letter-spacing:2px;font-weight:700}
.sq-status{display:flex;align-items:center;gap:10px;font-size:clamp(24px,6.6vw,58px);font-weight:900;
  padding:10px 24px;border-radius:14px}
.sq-status.wait{color:#cfe0ff}
.sq-status.done{color:#7ff0a8;background:rgba(9,138,64,.28)}
.sq-status.miss{color:#ffc98a;background:rgba(214,124,10,.25)}
.sq-dot{width:.55em;height:.55em;border-radius:50%;background:#7fb4ff;animation:sqpulse 1.15s ease-in-out infinite}
.sq-status.done .sq-dot{background:#7ff0a8;animation:none}
@keyframes sqpulse{0%,100%{opacity:.25;transform:scale(.75)}50%{opacity:1;transform:scale(1.15)}}
.sq-tip{font-size:clamp(13px,3vw,18px);color:#8ea0bb;max-width:34em}

/* ===== 签到时段 / 明细（2026-09-16） ===== */
.ck-period-bar{align-items:center;gap:8px}
.ck-period-bar .flabel{margin:0;flex:0 0 auto}
.ck-time{width:auto;min-width:110px;max-width:130px}
/* 手机端收窄，并允许收缩（配合 .ck-pc-row 不换行时也不会顶破） */
@media (max-width:640px){
  .ck-time{min-width:0;max-width:100%}
  #ck-period-custom{display:flex;flex-wrap:wrap;gap:6px}
  #ck-period-custom .ck-time{flex:1 1 96px;min-width:0;max-width:none}
}
#ck-period-custom{display:inline-flex;align-items:center;gap:6px}
.ck-per{font-style:normal;font-size:10px;color:#7a5cc4;background:#f1ecfd;border-radius:5px;padding:1px 6px;margin-left:2px}
.ck-row .link-btn.danger{margin-left:6px;padding:1px 5px}
.al-tag{display:inline-block;font-size:11px;line-height:1.6;padding:1px 8px;border-radius:999px;border:1px solid transparent}
.al-tag.normal{color:#1f7a45;background:#eaf9f0;border-color:#cbeed9}
.al-tag.manual{color:#a8630a;background:#fdf3e3;border-color:#f4debb;font-weight:600}
.al-tag.makeup{color:#1d5cb8;background:#eaf1fc;border-color:#d3e2f8}
.ov-tb td .link-btn + .link-btn{margin-left:8px}

/* ===== 签到 × 座位图 / 明细筛选导出 / 电脑端分栏（2026-09-16 增强） ===== */
.ck-split{display:grid;grid-template-columns:minmax(0,1fr);gap:16px;align-items:start}
.ck-left{min-width:0}
.ck-right .ck-cam{position:relative;height:240px}
.ck-left-ph{position:absolute;inset:0;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:6px;
  border:1px dashed var(--line);border-radius:12px;background:#f7f9fc;color:var(--muted);font-size:13px;text-align:center;padding:18px}
.ck-left-ph span{font-size:12px;color:#9aa6b8}
.ck-right{min-width:0}
.ck-split .ck-stage{position:absolute;inset:0;max-width:none;margin:0;z-index:1}
.ck-split .ck-stage video{height:100%;max-height:none}

.ck-seat-block{margin-top:18px;padding:14px 12px 12px;border:1px solid var(--line);border-radius:12px;background:#fbfcfe}
.ck-seat-head{display:flex;flex-wrap:wrap;gap:8px;justify-content:space-between;align-items:center;margin-bottom:8px}
.ck-seat-title{font-size:14px;font-weight:700;color:var(--navy)}
.ck-readonly{display:inline-block;margin-left:8px;font-size:11px;font-weight:400;color:var(--muted);border:1px solid var(--line);border-radius:999px;padding:1px 8px;background:#fff;vertical-align:1px}
.ck-seat-stats{font-size:12px;color:var(--muted)}
.ck-seat-stats b{color:var(--navy)}
.ck-seat-sub{font-size:12px;color:var(--muted);margin-bottom:9px}
.ck-seat-tip{font-size:12px;color:var(--blue2);background:#eef4ff;border:1px solid #d3e2fb;border-radius:8px;padding:6px 10px;margin-bottom:9px}
.ck-seat-map .rm-seat.used.ck-click{cursor:pointer}
.ck-seat-map .rm-seat.used.ck-click:hover{box-shadow:0 0 0 2px rgba(22,88,178,.35)}
.modal-mask.ck-st-above{z-index:460}
.ck-legend{display:flex;flex-wrap:wrap;gap:14px;align-items:center;margin-bottom:10px}
.ck-lg{display:flex;align-items:center;gap:6px;font-size:12px;color:var(--muted)}
.ck-dot{width:13px;height:13px;border-radius:4px;display:inline-block;flex:0 0 auto}
.ck-dot.ck-on{background:#e8f8ee;border:1px solid #1f8a4c}
.ck-dot.ck-off{background:#fdeaea;border:1px solid #c0392b}
.ck-dot.ck-blank{background:#fff;border:1px solid #d7e0ee}
.ck-seat-map{background:#fff}
.ck-seat-map .rm-seat.ck-on{background:#e8f8ee;border-color:#1f8a4c;color:#1f8a4c;font-weight:600}
.ck-seat-map .rm-seat.ck-on b{color:#1f8a4c}
.ck-seat-map .rm-seat.ck-on span{color:#3f9d6b}
.ck-seat-map .rm-seat.ck-off{background:#fdeaea;border-color:#c0392b;color:#c0392b;font-weight:600}
.ck-seat-map .rm-seat.ck-off b{color:#c0392b}
.ck-seat-map .rm-seat.ck-off span{color:#d4736a}
.ck-seat-map .rm-seat.ck-on:hover{background:#d5f2e0;border-color:#1f8a4c}
.ck-seat-map .rm-seat.ck-off:hover{background:#fadadb;border-color:#c0392b}
.ck-noseat{margin-top:10px;padding:9px 11px;border:1px dashed #e2c9c9;border-radius:9px;background:#fffafa;font-size:12px;color:#a5534d;line-height:1.7}
.ck-noseat b{color:#c0392b}
.ck-noseat .ck-ns-off{color:#c0392b}
.ck-noseat .ck-ns-on{color:#1f8a4c}
.ck-seat-acts{display:flex;justify-content:flex-end;margin-top:10px}
.ck-seat-exp{font-size:12px;padding:6px 12px}
.ck-seat-exp:hover{color:var(--navy);border-color:var(--blue2)}

.al-kw{width:auto;min-width:170px}
.al-st{width:auto;min-width:110px}
.al-kw:hover,.al-st:hover,.al-range-bar .ck-date:hover{border-color:var(--blue2)}
.al-export{border-color:var(--blue2);color:var(--blue2);font-weight:600}
.al-export:hover{background:var(--blue2);color:#fff;border-color:var(--blue2)}
.al-range-bar{margin-top:-4px}
.al-range-lbl{font-size:13px;color:var(--muted);flex:0 0 auto}

@media (min-width:1024px){
  /* 电脑端：左栏控制区竖排，右栏上半摄像头 + 下半名单（已签在上 / 未签在下） */
  .ck-split{grid-template-columns:minmax(270px,320px) minmax(0,1fr);gap:22px}
  .ck-btns .ck-btn-main{width:100%}
  .ck-btns .ck-btn-sm{width:auto}
  .ck-left .ck-date,.ck-left .ck-sel{width:100%;min-width:0}
  .ck-right .ck-cam{height:400px;margin-bottom:14px}
  .ck-right .ck-grid{grid-template-columns:1fr;margin-top:0;gap:12px}
  .ck-split .ck-list{max-height:230px}
}
@media (max-width:1023px){
  .ck-seat-block{margin-top:14px}
  .ck-ctrl-item{margin-bottom:10px}
  .ck-count-line{margin-bottom:10px}
}

/* ===== 扫码签到控制区（竖排）与大屏座位图弹窗（2026-09-16 晚） ===== */
.ck-ctrl-item .flabel{margin-bottom:7px}
.ck-ctrl-item{margin-bottom:12px}
.ck-ctrl-item:last-of-type{margin-bottom:10px}
/* 扫码签到：操作按钮区 = 「开始扫码」独占一行的大按钮 + 4 个小按钮 2×2 对称网格（桌面与手机同一结构）
   ⚠ 定稿写在基础规则里，媒体查询只做差异 —— 否则桌面端旧规则会把布局撑坏 */
.ck-btns{display:grid;grid-template-columns:1fr 1fr;gap:8px;align-items:stretch}
.ck-btns .ck-btn{margin-top:0}
.ck-btns .ck-btn-main{grid-column:1 / -1;width:100%;min-height:56px;padding:10px 18px;
  font-size:17px;font-weight:700;letter-spacing:1px;border-radius:10px}
.ck-btns .ck-btn-sm{width:auto;min-width:0;min-height:38px;padding:8px 10px;font-size:13px;
  display:inline-flex;align-items:center;justify-content:center;text-align:center}
.ck-btns .ck-btn-sm:hover{color:var(--navy);border-color:var(--blue2);background:#f2f6fc}
@media (max-width:1023px){
  .ck-btns .ck-btn-main{min-height:58px;font-size:18px}
}
/* 扫码签到：4 个预设时段 +「自定义」卡片（时间改完上方按钮文字同步） */
.ck-period-card{margin-top:10px;padding:10px 12px;border:1px solid var(--line);border-radius:10px;background:#fbfcfe}
.ck-pc-row{display:flex;align-items:center;gap:8px;flex-wrap:wrap}
.ck-pc-row + .ck-pc-row{margin-top:6px;padding-top:6px;border-top:1px dashed var(--line)}
.ck-pc-row:hover{background:#f4f8fd;border-radius:8px}
.ck-pc-name{flex:0 0 42px;font-size:13px;font-weight:600;color:var(--navy)}
.ck-pc-sep{flex:0 0 auto;font-size:12px;color:var(--muted)}
.ck-period-card .ck-pc-time{flex:1 1 0;min-width:0;width:auto;max-width:none;padding:7px 8px}
.ck-period-card .ck-pc-time:hover{border-color:var(--blue2)}
/* 「自定义时间」卡片底部：确认 / 取消（老板 2026-09-23） */
.ck-pc-foot{display:flex;gap:10px;justify-content:flex-end;margin-top:10px;padding-top:10px;border-top:1px dashed var(--line)}
.ck-pc-foot .btn-login{margin-top:0;width:auto;min-width:96px;padding:9px 20px;font-size:14px}
.ck-pc-foot .ck-pc-cancel{min-width:80px}
/* 未签到行的状态选择按钮（老板 2026-09-23） */
.ck-row .ck-st-pick{font-size:12px;color:var(--blue);border:1px solid #d3e2f8;background:#f4f8fd;
  border-radius:6px;padding:2px 9px;white-space:nowrap}
.ck-row .ck-st-pick:hover{background:#e8f1fc;border-color:var(--blue2);text-decoration:none}
/* 状态选择弹窗里的 4 个选项 */
.ck-st-opts{display:grid;grid-template-columns:1fr 1fr;gap:10px}
.ck-st-opt{padding:13px 10px;border:1px solid var(--line);border-radius:9px;background:#fff;
  font-family:inherit;font-size:15px;color:var(--navy);cursor:pointer;transition:all .14s ease}
.ck-st-opt:hover{border-color:var(--blue2);background:#f4f8fd}
.ck-st-opt.on{background:linear-gradient(135deg,#2f7bd6,#1d5cb8);color:#fff;border-color:#1d5cb8;font-weight:600}
.ck-st-ok{width:auto;min-width:96px;padding:9px 20px;font-size:14px;margin-top:0}
.ck-count-line{margin-bottom:12px}
.ck-count-chip{display:inline-block;font-size:12px;color:var(--muted);background:#f2f5fa;border:1px solid var(--line);border-radius:999px;padding:3px 11px}
/* 扫码签到：班级选择 + 已签人数同行（人数靠右，对齐签到明细的右侧计数） */
.ck-class-row{display:flex;align-items:center;gap:10px;flex-wrap:wrap}
/* 班级框与日期框同宽（都撑满左栏）；箭头用自绘 chevron，收进框内不贴右边缘 */
.ck-class-row .ck-sel{flex:1 1 auto;min-width:0;width:auto;-webkit-appearance:none;appearance:none;padding-right:42px;
  background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='8'%3E%3Cpath d='M1 1l5 5 5-5' fill='none' stroke='%237a8699' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E");background-repeat:no-repeat;background-position:right 20px center;background-size:12px 8px}
.ck-class-row .ck-count-chip{margin-left:auto}
/* 扫码签到：手机端日期框也与班级框同宽（不缩成内容宽） */
@media (max-width:1023px){
  #ck-date{width:100%;min-width:0;max-width:100%}
}
/* 签到明细筛选区日期框：同上，确保不冒出 .fgroup */
#al-from,#al-to{max-width:100%;min-width:0}
.ck-right .ck-cam{margin-bottom:12px}
.ck-seat-head-right{display:flex;align-items:center;gap:10px;flex-wrap:wrap}
.ck-seat-big-btn:hover{color:var(--navy);border-color:var(--blue2)}

/* ===== 全屏查看座位图：铺满整屏 + 右下角摄像头小窗 =====
   z-index 420：高于整页大字(400)、低于全屏扫码台(500) */
.ck-seat-fs{position:fixed;inset:0;z-index:420;background:#0f1b2d;display:none;flex-direction:column}
.ck-seat-fs.on{display:flex}
.cksf-top{flex:0 0 auto;display:flex;align-items:center;justify-content:space-between;gap:12px;
  padding:10px 16px;background:rgba(255,255,255,.06);border-bottom:1px solid rgba(255,255,255,.12);
  padding-top:calc(10px + env(safe-area-inset-top,0px))}
.cksf-left{display:flex;align-items:center;gap:16px;flex-wrap:wrap;min-width:0}
.cksf-title{font-size:clamp(15px,1.9vw,22px);font-weight:800;color:#fff}
.cksf-stats{font-size:clamp(12px,1.5vw,17px);color:#c9d6e8}
.cksf-stats b{color:#fff}
.cksf-legend{margin:0}
.cksf-legend .ck-lg{color:#c9d6e8}
.cksf-body{flex:1 1 auto;min-height:0;overflow:auto;padding:14px 16px}
.cksf-body .ck-seat-big{padding:14px 8px;background:transparent;border:0;max-height:none;overflow:visible}
.cksf-body .rm-seat{background:#243449;border-color:#33465f;color:#8fa3bd}
.cksf-body .rm-seat.used{background:#dfe9f7;border-color:#b8d3f4}
.cksf-body .ck-seat-map{background:transparent}
.cksf-body .rm-stage{background:#243449;color:#dce6f5}
.cksf-body .room-map{background:transparent;border:0}
/* 座位放大：全屏就是要离远了也一眼看清 */
.ck-seat-big .rm-seat{width:clamp(66px,7vw,104px);height:clamp(50px,5.2vw,78px);border-radius:10px}
.ck-seat-big .rm-seat.used b{font-size:clamp(13px,1.5vw,20px)}
.ck-seat-big .rm-seat.used span{font-size:clamp(10px,1.05vw,14px)}
.ck-seat-big .rm-row{gap:clamp(6px,0.7vw,12px)}
.ck-seat-big .rm-rownum{width:clamp(34px,3.4vw,52px);font-size:clamp(11px,1.15vw,15px)}
.ck-seat-big .rm-stage{max-width:min(760px,72vw);font-size:clamp(12px,1.35vw,18px);padding:9px}
/* 扫码结果顶部横幅（全屏座位图时用，不遮挡座位图） */
.cksf-result{position:absolute;top:56px;left:50%;transform:translate(-50%,-8px);
  display:none;flex-direction:column;align-items:center;gap:2px;padding:12px 28px;border-radius:14px;
  color:#fff;z-index:3;pointer-events:none;box-shadow:0 12px 34px rgba(0,0,0,.35);opacity:0;
  transition:opacity .16s ease,transform .16s ease}
.cksf-result.show{display:flex;opacity:1;transform:translate(-50%,0)}
.cksf-result b{font-size:clamp(20px,2.6vw,34px);font-weight:900}
.cksf-result span{font-size:clamp(12px,1.4vw,17px);opacity:.95}
.cksf-result.ok{background:rgba(9,138,64,.95)}
.cksf-result.dup{background:rgba(214,124,10,.96)}
.cksf-result.err{background:rgba(186,32,35,.96)}
/* 右下角摄像头小窗：让大家知道正在扫码 */
.cksf-cam{position:absolute;right:16px;bottom:16px;width:clamp(150px,17vw,240px);aspect-ratio:4/3;
  border-radius:14px;overflow:hidden;background:#0b1220;border:2px solid rgba(255,255,255,.35);
  box-shadow:0 10px 30px rgba(0,0,0,.45);z-index:4}
.cksf-cam video{position:absolute;inset:0;width:100%;height:100%;object-fit:cover;background:#0b1220}
.cksf-cam-ph{position:absolute;inset:0;display:flex;flex-direction:column;align-items:center;justify-content:center;
  gap:2px;color:#93a1b5;font-size:11px;text-align:center;padding:8px;line-height:1.3}
.cksf-cam-ph span{font-size:10px;opacity:.8}
.cksf-cam-lb{position:absolute;left:0;right:0;bottom:0;padding:3px 6px;font-size:10px;font-weight:700;
  color:#6ef09a;background:rgba(0,0,0,.55);text-align:center;letter-spacing:.5px}

/* ===== 班级学员 / 安排座位 弹窗（2026-09-16 晚：页内展开改弹窗） ===== */
.stu-cd-modal{max-width:860px}
.stu-seat-modal{max-width:1120px;width:96vw}
.stu-cd-modal .sub,.stu-seat-modal .sub{font-size:13px;color:var(--muted)}

/* 新增学员弹窗：完善档案分组标题 */
/* 新增学员「完善档案」折叠：与「更多筛选」同一手感，默认收起
   注意别复用 .more-toggle —— 那条带 justify-content:space-between，会把箭头推到最右（踩过） */
.sn-more-toggle{display:flex;align-items:center;justify-content:flex-start;gap:8px;margin:4px 0 12px;
  padding:10px 14px;border:1px dashed var(--line);border-radius:9px;color:var(--blue);font-size:13px;
  font-weight:600;cursor:pointer;user-select:none;transition:background .15s ease,border-color .15s ease}
.sn-more-toggle:hover{background:#f7f9fc;border-color:#9dc0ea}
.sn-more-toggle .arrow{font-size:12px;line-height:1;display:inline-flex;align-items:center;
  justify-content:center;width:16px;height:16px;transition:transform .18s ease}
.sn-more-toggle.open .arrow{transform:rotate(90deg)}
.sn-more.collapsed{display:none}

/* ===== 教室向导（新增/编辑教室弹窗，2026-09-17）===== */
.room-wiz-form{max-width:520px}
.room-dim-row{display:flex;gap:14px}
.room-dim-row .field{flex:1 1 0;min-width:0}
/* 教室被班级绑定后的只读锁定提示条 */
.room-lock-notice{background:#fff6e6;border:1px solid #ffd591;border-radius:9px;padding:10px 12px;
  color:#8a5300;font-size:13px;line-height:1.6;margin-bottom:12px}
.room-wiz-form input:disabled,#room-wiz-step2 .rm-mode:disabled,#room-wiz-step2 .btn-ghost:disabled{
  opacity:.5;cursor:not-allowed}
.wiz-step-hint{background:#f0f5fc;border:1px solid #dbe7f8;border-radius:9px;padding:9px 12px;
  color:var(--navy);font-weight:600;margin-bottom:14px}
.room-wiz-actions{display:flex;gap:10px;justify-content:flex-end;margin-top:16px;
  padding-top:14px;border-top:1px solid var(--line);flex-wrap:wrap}
/* 第 2 步的座位图跟着弹窗滚动 */
#room-wiz-step2 .room-map{background:#fbfcfe;border:1px solid var(--line);border-radius:12px;padding:12px 8px}
@media (max-width:640px){
  .room-dim-row{flex-direction:column;gap:0}
  .room-wiz-actions{justify-content:stretch}
  .room-wiz-actions .btn-login,.room-wiz-actions .btn-ghost{flex:1 1 100%}
}

/* 扫码签到：摄像头区右上角「⛶ 全屏」按钮（原按钮区的「全屏扫码台」搬到这里） */
.ck-cam-fs{position:absolute;top:8px;right:8px;z-index:3;padding:6px 12px;font-size:12px;font-weight:600;
  color:#fff;background:rgba(16,26,48,.62);border:1px solid rgba(255,255,255,.28);border-radius:8px;
  cursor:pointer;backdrop-filter:blur(2px);transition:background .15s}
.ck-cam-fs:hover{background:rgba(16,26,48,.85)}
/* 摄像头未开启时按钮压在灰底提示上，也要看得清 */
.ck-cam:has(.ck-left-ph[style*=""]) .ck-cam-fs{color:#22314f;background:rgba(255,255,255,.9);border-color:#c9d4e5}

/* 补卡模式：按钮持续高亮，提示当前扫到的码会记成「补签」 */
.ck-btns .ck-btn-sm.ck-mode-on{color:#fff;background:#b8791f;border-color:#b8791f;font-weight:700}
.ck-btns .ck-btn-sm.ck-mode-on:hover{color:#fff;background:#a76c17;border-color:#a76c17}

/* 名单行里的状态标签（请假 / 补签等） */
.ck-row .ck-st{font-size:11px;line-height:1.5;padding:1px 7px;margin-left:6px;border-radius:999px;
  border:1px solid transparent;font-style:normal}
.ck-row .ck-st.leave{color:#1d5cb8;background:#eaf1fc;border-color:#d3e2f8}
.ck-row .ck-st.makeup{color:#a8630a;background:#fdf3e3;border-color:#f4debb}
.ck-row .ck-st.late{color:#a33;background:#fdeaea;border-color:#f5cfcf}

/* 签到明细：考勤状态标签配色（2026-09-17 统一状态体系） */
.al-tag.late{color:#a33;background:#fdeaea;border-color:#f5cfcf}
.al-tag.leave{color:#1d5cb8;background:#eaf1fc;border-color:#d3e2f8}
.al-tag.sick{color:#7a3fa8;background:#f4ecfc;border-color:#e2d2f4}
.al-tag.absent{color:#8a1f1f;background:#fbe3e3;border-color:#f2c4c4;font-weight:600}
.al-tag.quit{color:#5a6473;background:#eef1f5;border-color:#dbe1ea}

/* ===== 角色管理（2026-09-17）：角色标签 / 权限矩阵 / 子页签角标 ===== */
.role-tag { display:inline-block; padding:2px 9px; border-radius:5px; font-size:11px; background:#eef3fb; color:#2b6cb0; }
.role-tag.super { background:#fdf3e7; color:#c05621; font-weight:600; }
.role-tag.vice { background:#e8f0fd; color:#1d4ed8; }
.role-tag.head { background:#e8f6ef; color:#2f855a; }
.role-tag.finance { background:#f4ecfc; color:#7a3fa8; }
.role-tag.exp { background:#f2f4f7; color:#5a6473; }
.role-tag.none { background:#fdeaea; color:#c0392b; }
.status-tag.warn { background:#fdf3e7; color:#c05621; }
.rt-badge { display:inline-block; min-width:16px; padding:0 5px; margin-left:4px; border-radius:9px;
  background:#c0392b; color:#fff; font-size:11px; line-height:16px; text-align:center; vertical-align:middle; }
.role-matrix { overflow-x:auto; }
.role-mt td, .role-mt th { text-align:center; font-size:12px; }
.role-mt td.rmk, .role-mt th:first-child { text-align:left; white-space:nowrap; }
.role-mt td.yes { color:#2f855a; font-weight:700; }
.role-mt td.no { color:#c9cfd8; }
.op-act { display:inline-block; padding:1px 8px; border-radius:999px; font-size:11px;
  background:#eef3fb; color:#2b6cb0; white-space:nowrap; }
.al-filter-bar { display:flex; gap:8px; align-items:center; }
/* 老板 04:26：搜索框原来 width:100% + flex:1 1 auto，把右侧「↻ 刷新」挤到 60px 宽，
   按钮只剩 34px 放不下两个字 → 折成两行（实测按钮高 50px）。输入框允许缩到 0，
   按钮不缩且不换行，各归各位。 */
.al-filter-bar .finput { flex:1 1 auto; min-width:0; width:auto; }
.al-filter-bar .btn-ghost { flex:0 0 auto; white-space:nowrap; }

/* ===== 角色管理改版（2026-09-17 03:21）：权限勾选面板 / 权限标签 / 行内角色下拉 ===== */
.ov-tb td.perm-cell { max-width:560px; white-space:normal; line-height:2.0; vertical-align:top; }
/* 权限标签允许折行（老板：副校长权限多，别挤成一坨） */
.perm-cell .perm-tag { white-space:normal; }
/* 账户管理：角色标签可点即改（替掉原来不好看的下拉） */
.role-tag.clickable { cursor:pointer; border:1px solid transparent; transition:all .15s; }
.role-tag.clickable:hover { border-color:var(--blue2); filter:brightness(.97); }
.role-tag.clickable::after { content:' ▾'; font-size:9px; opacity:.55; }
.perm-tag { display:inline-block; padding:2px 8px; margin:2px 4px 2px 0; border-radius:5px;
  font-size:11px; background:#eef3fb; color:#2b6cb0; border:1px solid #dbe6f7; white-space:nowrap; }
.perm-tag.all { background:#fdf3e7; color:#c05621; border-color:#f6d9b8; font-weight:600; }
.perm-tag.none { background:#f2f4f7; color:#8a94a3; border-color:#e3e7ee; }
.perm-group { border:1px solid var(--line); border-radius:9px; padding:10px 12px; margin-bottom:10px; background:#fbfcfe; }
.perm-group-t { font-size:12px; font-weight:700; color:var(--navy); margin-bottom:8px; }
.perm-group-b { display:grid; grid-template-columns:repeat(auto-fill,minmax(150px,1fr)); gap:6px 10px; }
.perm-ck { display:flex; align-items:center; gap:6px; font-size:13px; color:#33415c; cursor:pointer;
  padding:4px 6px; border-radius:6px; }
.perm-ck:hover { background:#eef3fb; }
.perm-ck input { width:16px; height:16px; accent-color:var(--blue2); cursor:pointer; flex:0 0 auto; }
.perm-actions { display:flex; gap:12px; margin-top:4px; }
.role-inline { margin-left:6px; padding:3px 6px; font-size:11px; border:1px solid var(--line);
  border-radius:6px; color:var(--muted); background:#fff; cursor:pointer; vertical-align:middle; }
.role-inline:hover { border-color:var(--blue2); color:var(--navy); }
.role-tag.custom { background:#e8f6ef; color:#276749; }

/* ===== 后台管理：临时体验账户 + 有效期（2026-09-17）===== */
.exp-ok { color: #2f855a; font-size: 12px; }
.exp-none { color: #8a94a3; font-size: 12px; }
.exp-over { color: #c0392b; font-size: 12px; font-weight: 600; }
.role-tag.head { background: #e8f6ef; color: #2f855a; }

/* 学员状态标签（老板 03:56：在读/结课/退课/开除/特殊/未报道） */
.stu-st { display:inline-block; padding:2px 9px; border-radius:5px; font-size:11px; font-weight:600; white-space:nowrap; }
.stu-st.on   { background:#e8f6ef; color:#2f855a; }
.stu-st.fin  { background:#e8f0fd; color:#1d4ed8; }
.stu-st.quit { background:#fdf3e7; color:#c05621; }
.stu-st.exp  { background:#fdeaea; color:#c0392b; }
.stu-st.spec { background:#f4ecfc; color:#7a3fa8; }
.stu-st.abs  { background:#f2f4f7; color:#5a6473; }
.stu-st.trial { background:#e6f7f8; color:#0e7490; }
.stu-st.stop  { background:#fdf6e3; color:#a16207; }
.stu-rmk { color:#8a94a3; font-size:11px; margin-left:4px; }

/* 签到时段规则说明（老板 03:58） */
.ck-rule { background:#f7f9fc; border-left:3px solid #4a7fd4; border-radius:0 6px 6px 0;
  padding:7px 10px; line-height:1.7; color:#4a5568; }
.ck-rule b { color:#1d4ed8; }

/* 座位图考勤状态配色（老板 03:59：已到/迟到/补卡/请假/旷课/未到） */
.ck-dot.ck-late{background:#fdf3e3;border:1px solid #c47a10}
.ck-dot.ck-makeup{background:#eaf1fc;border:1px solid #1d5cb8}
.ck-dot.ck-leave{background:#f4ecfc;border:1px solid #7a3fa8}
.ck-dot.ck-absent{background:repeating-linear-gradient(45deg,#fbe3e3,#fbe3e3 4px,#f2c4c4 4px,#f2c4c4 8px);border:1px solid #8a1f1f}
.ck-seat-map .rm-seat.ck-late{background:#fdf3e3;border-color:#c47a10;color:#a8630a;font-weight:600}
.ck-seat-map .rm-seat.ck-late b{color:#a8630a}
.ck-seat-map .rm-seat.ck-late span{color:#c47a10}
.ck-seat-map .rm-seat.ck-makeup{background:#eaf1fc;border-color:#1d5cb8;color:#1d5cb8;font-weight:600}
.ck-seat-map .rm-seat.ck-makeup b{color:#1d5cb8}
.ck-seat-map .rm-seat.ck-makeup span{color:#4a7fd4}
.ck-seat-map .rm-seat.ck-leave{background:#f4ecfc;border-color:#7a3fa8;color:#7a3fa8;font-weight:600}
.ck-seat-map .rm-seat.ck-leave b{color:#7a3fa8}
.ck-seat-map .rm-seat.ck-leave span{color:#9469c8}
.ck-seat-map .rm-seat.ck-absent{background:repeating-linear-gradient(45deg,#fbe3e3,#fbe3e3 5px,#f2c4c4 5px,#f2c4c4 10px);
  border-color:#8a1f1f;color:#8a1f1f;font-weight:700}
.ck-seat-map .rm-seat.ck-absent b{color:#8a1f1f}
.ck-seat-map .rm-seat.ck-absent span{color:#a54545}
/* 座位图统计条：分状态小片 */
.ck-sc{display:inline-block;margin-right:9px;font-size:12px;color:var(--muted);white-space:nowrap}
.ck-sc b{font-size:13px;font-weight:800}
.ck-sc-on b{color:#1f8a4c}.ck-sc-late b{color:#c47a10}.ck-sc-makeup b{color:#1d5cb8}
.ck-sc-leave b{color:#7a3fa8}.ck-sc-absent b{color:#8a1f1f}.ck-sc-off b{color:#c0392b}
.ck-sc-noseat b{color:#5b6b82}
.ck-ns-tag{color:#8a94a3;font-size:11px;margin-left:2px}
.ck-row .ck-st.absent{color:#8a1f1f;background:#fbe3e3;border-color:#f2c4c4;font-weight:600}

/* ===== 个人中心底部：我的签到码（老板 04:06：学生往下滑也能看到）===== */
.me-qr-panel { margin-top: 4px; }
.me-qr-wrap { display:flex; align-items:center; gap:18px; flex-wrap:wrap; }
.me-qr-box { flex:0 0 auto; width:150px; height:150px; padding:8px; background:#fff;
  border:1px solid var(--line); border-radius:10px; display:flex; align-items:center; justify-content:center; }
.me-qr-box img, .me-qr-box canvas { display:block; max-width:100%; height:auto; }
.me-qr-side { flex:1 1 180px; min-width:0; }
.me-qr-no { font-size:15px; font-weight:700; color:var(--navy); letter-spacing:1px;
  margin-bottom:8px; word-break:break-all; }
.me-qr-empty { text-align:center; font-size:12px; line-height:1.6; color:var(--muted); }
@media (max-width:640px){
  .me-qr-wrap { flex-direction:column; align-items:center; text-align:center; gap:12px; }
  .me-qr-side { flex:1 1 auto; }
}

/* ===== 表单必填/选填标注（老板 2026-09-17 04:19）===== */
.req-star { color:#e05252; font-weight:800; margin-left:2px; }
.field label .req-star { color:#e05252; }
.opt-tag { display:inline-block; margin-left:5px; padding:0 5px; font-size:10px; font-weight:600;
  line-height:15px; color:#8a94a3; background:#f0f3f8; border:1px solid #e2e8f1;
  border-radius:4px; vertical-align:middle; }
/* 弹窗内是浅色背景，标签色要压深一点才看得清 */
.stu-edit-modal .field label { color:#5a6b85; }
.stu-edit-modal .opt-tag { color:#8a94a3; background:#f0f3f8; border-color:#e2e8f1; }

/* ===== 扫码语音播报开关（老板 2026-09-17 04:21）===== */
/* 开着时高亮，扫一眼就知道语音是开的 */
.ck-btns .ck-btn-sm.ck-voice-on { color:#fff; background:#1f8a4c; border-color:#1f8a4c; font-weight:700; }
.ck-btns .ck-btn-sm.ck-voice-on:hover { color:#fff; background:#1a7541; border-color:#1a7541; }

/* 座位图设施图标（emoji）随网页下发：NAS 浏览器自带运行时无 emoji 字体，
   避免打印图出现豆腐块。仅含 🚪🧯⬛🚰 四个字形（约 5KB）。 */
@font-face{
  font-family:"SeatEmoji";
  src:url("../assets/seatemoji.ttf") format("truetype");
  font-weight:normal; font-style:normal; font-display:block;
}

/* 设施图标里的线条符号（│ 过道 / ✕ 坏座）：emoji 字体不含这些码位，
   单独随网页下发，避免 NAS 浏览器缺字。 */
@font-face{
  font-family:"SeatMark";
  src:url("../assets/seatmark.ttf") format("truetype");
  font-weight:normal; font-style:normal; font-display:block;
}

/* ===== 页脚：版权与版本 ===== */
.site-footer{position:relative;width:100%;display:none;gap:10px;align-items:center;justify-content:center;flex-wrap:wrap;padding:14px 12px 18px;font-size:12px;color:#6b7a96;background:none;text-align:center}
.site-footer .sf-sep{color:#c2ccdd}
.site-footer b{color:#4a5877;font-weight:600}
.login-footer{position:absolute;left:0;right:0;bottom:0;width:100%;margin-top:0;display:flex;gap:10px;align-items:center;justify-content:center;flex-wrap:wrap;padding:10px 12px;font-size:12px;color:#6b7a96;background:none;text-align:center}
.login-footer .sf-sep{color:#33415f}
.login-footer b{color:#9fb0d0;font-weight:600}
@media (max-width:600px){.site-footer,.login-footer{font-size:11px;gap:6px;padding:6px 8px}.site-footer .sf-sep,.login-footer .sf-sep{display:none}}

/* ===== 登录卡内版权 ===== */
.login-copyright{margin-top:20px;padding-top:14px;border-top:1px solid rgba(51,65,95,.5);font-size:11.5px;line-height:1.7;color:#5f6f8e;text-align:center}
.login-copyright span{color:#4a5877}

/* 页脚仅在主应用显示（登录页/过渡页不显示，避免重复） */
#screen-app[style*="flex"] ~ .site-footer,
#screen-app.show ~ .site-footer{display:flex}
body.app-ready .site-footer{display:flex}

/* ================== 出勤报告（2026-10-08 老板要求） ================== */
.rp-out{margin-top:14px}
.rp-doc{background:#fff;border:1px solid #e3e8ef;border-radius:12px;padding:22px 24px}
.rp-title{font-size:20px;font-weight:800;text-align:center;color:#1c2a3a;margin-bottom:14px;letter-spacing:1px}
.rp-meta{display:flex;flex-wrap:wrap;gap:6px 26px;font-size:14px;color:#334;border-bottom:2px solid #1d5cb8;padding-bottom:10px;margin-bottom:14px}
.rp-meta b{color:#1c2a3a}
.rp-seg{margin-bottom:16px;padding:10px 12px;background:#f7f9fc;border-radius:10px}
.rp-seg-h{font-size:15px;font-weight:700;color:#1d5cb8;margin-bottom:8px}
.rp-line{font-size:14px;color:#334;margin:4px 0;display:flex;flex-wrap:wrap;align-items:baseline;gap:2px 0}
.rp-k{display:inline-block;min-width:70px;font-weight:700}
.rp-k-leave{color:#c05621}
.rp-k-absent{color:#c53030}
.rp-p{margin-right:14px;white-space:nowrap}
.rp-foot{margin-top:18px;font-size:12px;color:#8a94a6;text-align:right}

@media print{
  body *{visibility:hidden}
  #rp-doc,#rp-doc *{visibility:visible}
  #rp-doc{position:absolute;left:0;top:0;width:100%;border:none}
}

/* ================== 手机适配补丁（2026-10-08） ================== */

/* 1) 出勤报告筛选条：窄屏竖排、控件撑满 */
.rp-out { margin-top: 14px; }
.rp-bar { display: flex; flex-wrap: wrap; gap: 10px; align-items: center; }
@media (max-width: 768px) {
  .rp-bar { flex-direction: column; align-items: stretch; }
  .rp-bar select, .rp-bar input, .rp-bar button { width: 100% !important; max-width: none !important; }
  .rp-doc { padding: 16px 14px; }
  .rp-title { font-size: 17px; }
  .rp-meta { flex-direction: column; gap: 4px; font-size: 13px; }
  .rp-seg { padding: 10px; }
  .rp-seg-h { font-size: 14px; }
  .rp-line { font-size: 13px; }
  .rp-k { min-width: 60px; }
}

/* 2) iOS 原生 date 控件文字会被顶掉/显示不全 → 强制撑开、去掉高度塌陷 */
input[type="date"], input[type="time"] {
  -webkit-appearance: none;
  appearance: none;
  min-height: 40px;
  line-height: 1.4;
}
input[type="date"]::-webkit-date-and-time-value { text-align: left; }
input[type="date"]::-webkit-calendar-picker-indicator { opacity: .6; }

/* 扫码实时诊断面板（老板 2026-10-08：确认新版扫码优化真的生效） */
.ck-diag{margin-top:10px;padding:8px 12px;border:1px dashed #3b82f6;border-radius:8px;
  background:rgba(59,130,246,.06);color:#1e40af;font-size:12.5px;line-height:1.7;
  font-family:ui-monospace,Menlo,Consolas,monospace;word-break:break-all}
.ck-diag b{color:#1d4ed8;font-size:13.5px}

/* 2026-10-12 多班座位：学员端「我的班级与座位」一行一班 */
.stu-cs-list { margin-top: 4px; }
.stu-cs-row { display: flex; flex-wrap: wrap; align-items: center; gap: 6px;
  padding: 7px 0; border-bottom: 1px dashed #eef2f7; word-break: break-word; }
.stu-cs-row:last-child { border-bottom: 0; }
.stu-cs-cls { color: #0f172a; font-size: 15px; font-weight: 600; min-width: 0; flex: 0 1 auto; word-break: break-word; }
.stu-cs-sep { color: #94a3b8; }
.stu-cs-seat { color: #1d4ed8; font-size: 15px; font-weight: 700; }
/* 2026-10-13：列表里座位显示「N号座」，数字加大一点更醒目 */
.stu-cs-seat .stu-seat-no { font-size: 18px; font-weight: 800; color: #1d4ed8; }
/* 班级名很长时，按钮不挤在文字里：自动换行到下一行，靠右对齐（2026-10-12）*/
.stu-cs-mapbtn { margin-left: auto; flex: 0 0 auto; font-size: 12px; padding: 4px 10px;
  border: 1px solid #cbd5e1; border-radius: 6px; background: #fff; color: #1d4ed8;
  cursor: pointer; white-space: nowrap; }
.stu-cs-mapbtn:hover { background: #eff6ff; border-color: #93c5fd; }
/* 窄屏（手机端）：按钮强制换行到单独一行、靠左，避免被长班级名挤飞 */
@media (max-width: 560px) {
  .stu-cs-mapbtn { margin-left: 0; flex: 1 1 100%; text-align: center; }
}
/* 后台学员列表：座位列允许换行，窄屏不撑破 */
.tb td.seat-cell { white-space: normal; word-break: break-word; }

/* 2026-10-12 搜索导入：搜索结果列表 */
.stu-imp-tabs{display:flex;gap:6px;margin:10px 0 4px}
.sti-search-list{max-height:300px;overflow-y:auto;margin:8px 0;border:1px solid var(--line);border-radius:8px}
.sti-search-empty{padding:16px;text-align:center;color:var(--muted);font-size:13px}
.sti-srow{display:flex;flex-wrap:wrap;align-items:center;gap:8px;padding:9px 12px;border-bottom:1px solid #f1f5f9;cursor:pointer}
.sti-srow:last-child{border-bottom:0}
.sti-srow:hover{background:#f7f9fc}
.sti-srow.sel{background:#eff6ff}
.sti-srow.disabled{cursor:default;opacity:.6}
.sti-srow.disabled:hover{background:transparent}
.sti-sname{font-weight:600;color:#0f172a;font-size:14px}
.sti-sphone{color:#475569;font-size:13px}
.sti-sno{color:#94a3b8;font-size:12px}
.sti-scls{color:#64748b;font-size:12px;flex:1;min-width:80px;word-break:break-word}
.sti-sbadge{background:#e2e8f0;color:#475569;font-size:11px;padding:2px 8px;border-radius:10px;white-space:nowrap}
.sti-sel-count{color:#1d4ed8;font-weight:600;font-size:14px}

/* 2026-10-12 编辑弹窗「班级与座位」多班列表 */
.se-cs-list{border:1px solid var(--line);border-radius:8px;padding:2px 12px;background:#f9fbfe}
.se-cs-row{display:flex;flex-wrap:wrap;align-items:baseline;gap:6px;padding:8px 0;border-bottom:1px dashed #eef2f7;word-break:break-word}
.se-cs-row:last-child{border-bottom:0}
.se-cs-cls{color:#0f172a;font-size:14px;font-weight:600}
.se-cs-sep{color:#94a3b8}
.se-cs-seat{color:#1d4ed8;font-size:14px;font-weight:700}

/* 2026-10-12 学员端「查看座位图」按钮 + 弹窗 */
.stu-cs-mapbtn{margin-left:auto;flex:0 0 auto;font-size:12px;padding:4px 10px;border:1px solid #cbd5e1;border-radius:6px;background:#fff;color:#1d4ed8;cursor:pointer;white-space:nowrap}
.stu-cs-mapbtn:hover{background:#eff6ff;border-color:#93c5fd}
.stu-seatmap-box{margin-top:6px}

/* 2026-10-19 写操作「处理中」遮罩：15 秒后允许手动关掉（后台不中断） */
.loading-esc {
  display: none;
  margin-top: 4px; padding: 7px 22px;
  border: 1px solid #d6dee9; border-radius: 999px;
  background: #f6f9fd; color: #2a3b52; font-size: 13px; cursor: pointer;
}
.loading-esc:hover { background: #eaf2fc; border-color: #bcd3ef; }
.loading-mask.busy-esc .loading-esc { display: inline-block; }

/* ===== 考试类型页签（老板 2026-10-21：横向，跟个人中心页签一致） ===== */

/* ===== 考试类型页签：照抄个人中心 .subtabs/.subtab 风格（老板 2026-10-21，嫌太丑） ===== */
#exam-tabs.subtabs{display:flex;align-items:center;flex-wrap:nowrap;gap:6px;
  margin:0 0 14px;padding-bottom:10px;border-bottom:1px solid var(--line)}
#exam-tabs .subtab{flex:0 0 auto;padding:7px 16px;border-radius:8px;font-size:13px;
  color:var(--muted);cursor:pointer;border:1px solid transparent;
  transition:background .15s ease,color .15s ease;font-family:inherit;background:transparent}
#exam-tabs .subtab:hover{color:var(--navy);background:#f2f6fc}
#exam-tabs .subtab.on{color:var(--navy);background:#eef3fb;font-weight:600;border-color:#d7e4f7}
@media(max-width:768px){
  #exam-tabs .subtab{flex:1 1 0;text-align:center;padding:8px 10px}
}

/* ===== 国考结果卡片（老板 2026-10-21） ===== */
.gk-head{padding:10px 2px 12px;font-size:14px;color:var(--muted);border-bottom:1px solid var(--line);margin-bottom:12px}
.gk-head b{color:var(--blue);font-size:16px}
.gk-card{padding:12px 14px;border:1px solid var(--line);border-radius:10px;margin-bottom:10px;background:#fff}
.gk-card:hover{border-color:var(--blue2);box-shadow:0 2px 10px rgba(29,78,216,.07)}
.gk-t{font-size:15px;font-weight:700;color:var(--navy);margin-bottom:3px;line-height:1.35}
.gk-s{font-size:13px;color:#475569;margin-bottom:8px}
.gk-meta{display:flex;flex-wrap:wrap;gap:6px;margin-bottom:8px}
.gk-meta span{font-size:12px;background:#f1f5f9;color:#475569;padding:3px 8px;border-radius:6px;white-space:nowrap}
.gk-d{font-size:12px;color:var(--muted);line-height:1.5}
.gk-grid{align-items:stretch}
.gk-more{text-align:center;color:var(--muted);font-size:13px;padding:14px 0}
@media(max-width:768px){
  .gk-meta span{font-size:11px;padding:2px 7px}
}


/* ===== 国考结果卡片：复用事业编 job-card，只补头尾 ===== */
.gk-head {
  font-size: 15px; color: var(--muted); margin: 0 0 12px;
  display: flex; align-items: baseline; gap: 10px; flex-wrap: wrap;
}
.gk-head b { color: #16233b; font-size: 20px; }
.gk-head-sub { font-size: 12px; color: #9aa7bd; margin-left: auto; }
.gk-more {
  text-align: center; color: var(--muted); font-size: 13px;
  padding: 16px 0 8px;
}
/* 滚动懒加载哨兵：滚到这儿就再画 50 条 */
#gk-sentinel { color: #8b98ad; font-size: 12.5px; padding: 18px 0 26px; }
.jc-badge {
  background: #eef3fb; color: #3a5b8c; border-radius: 6px;
  padding: 3px 9px; font-size: 12px; line-height: 1.5;
}

/* 专业下拉第二行（层次 · 代码）：不许撑宽，超长省略 */
.ms-opt .ms-meta{font-size:11px;color:var(--muted);flex-shrink:0;max-width:46%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;text-align:right}
.ms-group-title{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
/* 已选专业标签：长名字换行不撑破 */
.ms-chip{max-width:100%;min-width:0;word-break:break-all}
.ms-chip .ms-code-sm{white-space:nowrap}
/* 国考专业框：与事业编同一套，禁止溢出 */
#gk-major-select{max-width:100%}
#gk-major-select .ms-tags{max-width:100%}
#gk-major-select .ms-input{box-sizing:border-box}
#gk-major-select .ms-dropdown{box-sizing:border-box;max-width:100%}

/* iOS Safari：输入框字号 <16px 时，聚焦会自动放大整页（老板反馈「点完会整体放大」）。
   把搜索类输入框在移动端提到 16px，就不再自动缩放，也不影响视觉（手机上看不出差别）。 */
@media (max-width: 768px) {
  .ms-input, #major-input, #gk-major-input, input[type="search"],
  input[type="text"], input[type="password"], input[type="tel"], input[type="email"],
  input[type="number"], textarea, select {
    font-size: 16px !important;
  }
}

/* 岗位查询页 · 窄屏上下排列时，结果框要跟筛选面板左右对齐撑满。
   原来 .query-wrap 转列后仍保持 align-items:flex-start，
   结果框不拉伸 → 右边空一块（老板 2026-10-21 手机截图指出）。
   注意：只限 #page-query，别动学生查询 / 签到明细那些共用布局的页面。 */
@media (max-width: 900px) {
  #page-query .query-wrap{align-items:stretch}
  #page-query .panel-filter,
  #page-query .panel-result{width:100%;box-sizing:border-box}
}
#gk-result-panel{width:100%;box-sizing:border-box}

/* 国考卡片 KPI：学历/学位是短语不是大数字，单独一套字号，别撑破格子 */
.kpi .kpi-v.kpi-txt{font-size:14px;font-weight:800;line-height:1.3;white-space:normal;word-break:keep-all;overflow-wrap:anywhere}
/* 原表整句直接显示：长句缩一号，保证 3 格塞得下 */
.kpi .kpi-v.kpi-long{font-size:12.5px;line-height:1.35}
.kpi .kpi-note{font-size:10px;color:#9aa7bd;margin-top:3px;line-height:1.3;word-break:break-all;
  display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}

/* 国考快速筛选：手机两列，最后一项（排序）占满整行 */
@media (max-width:768px){
  #gk-quick{display:grid;grid-template-columns:1fr 1fr;gap:8px 10px}
  #gk-quick label{display:flex;flex-direction:column;align-items:stretch;gap:4px;min-width:0}
  #gk-quick select{width:100%;min-width:0;box-sizing:border-box}
  #gk-quick label:nth-child(5){grid-column:1 / -1}
}

/* 老板 2026-10-21：手机上「生成报告 / 导出表格」两个按钮要排在一行 */
@media (max-width: 768px){
  .report-cta{flex-wrap:nowrap;gap:8px;align-items:stretch}
  .report-cta .btn-report{flex:1 1 0;min-width:0;padding:11px 8px;font-size:13px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
}

/* ===== 学生查询 · 学员列表列宽（2026-10-22 老板：班级太长把座位/状态/操作挤到一起）===== */
#stu-query .stb { table-layout: fixed; }
#stu-query .stb th, #stu-query .stb td { white-space: normal; word-break: break-word; vertical-align: top; }
/* 姓名 性别 手机号 班级 座位 状态 操作 */
#stu-query .stb .c-name { width: 12%; }
#stu-query .stb .c-sex  { width: 7%; }
#stu-query .stb .c-phone{ width: 17%; }
#stu-query .stb .c-cls  { width: 28%; }
#stu-query .stb .c-seat { width: 10%; }
#stu-query .stb .c-st   { width: 11%; }
#stu-query .stb .c-ops  { width: 15%; }
/* 班级标签：多个班时换行不撑破 */
#stu-query .stb .cls-tag { white-space: normal; margin-bottom: 3px; }
#stu-query .stb .c-ops .link-btn { display: inline-block; margin: 0 4px 4px 0; }

/* 窄屏（手机端）：保底宽度 + 内部横滑，别把列挤成一条 */
@media (max-width: 900px) {
  #stu-query .stb { min-width: 660px; }
  #stu-query .stb th, #stu-query .stb td { font-size: 12px; padding: 7px 6px; }
}

/* 班级列：一个班一行纯文本，不加标签框（2026-10-22 老板要求） */
#stu-query .stb .cls-line {
  display: block; font-size: 12px; color: #1a2438;
  line-height: 1.75; white-space: normal; word-break: break-word;
}
#stu-query .stb .cls-line + .cls-line { border-top: 1px dashed #eef1f6; }

/* 座位列：与班级列逐行对应（一个班一行，行高一致） */
#stu-query .stb .seat-line {
  display: block; font-size: 12px; line-height: 1.75;
  white-space: normal; word-break: break-word;
}
#stu-query .stb .cls-line { font-size: 12px; line-height: 1.75; }

/* 2026-10-22 老板要求：下拉框箭头太靠右 → 收进来一点。
   iOS/安卓默认箭头位置由系统控制，这里换成自定义箭头并贴到右内侧。 */
/* 2026-10-22 补充：新增学员弹窗（#stu-new-mask，复用 .stu-edit-modal 类）
   的性别/班级下拉也吃这套箭头 —— 原来只写了 .stu-edit-modal .field，
   但 #sn-gender 在 .sn-more 折叠区外、不在 .field 里? 实测在，故仅补 #stu-new-mask 作用域 */
#stu-new-mask .field select.sel-arrow-left,
.stu-edit-modal .field select.sel-arrow-left,
#stu-new-mask .field select,
.stu-edit-modal .field select {
  -webkit-appearance: none;
  appearance: none;
  background-image: url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='8' viewBox='0 0 12 8'%3E%3Cpath d='M1 1.5L6 6.5L11 1.5' fill='none' stroke='%235a6b85' stroke-width='1.6' stroke-linecap='round'/%3E%3C/svg%3E");
  background-repeat: no-repeat;
  background-position: right 14px center;
  background-size: 11px 7px;
  padding-right: 40px;
}

/* 2026-10-22 老板要求：时段按钮（上午/下午/晚上/自定义时间）排成 2 行 2 列，等宽等高 */
#ck-period-opts {
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: 8px;
  align-items: stretch;
}
#ck-period-opts .opt {
  width: 100%; min-width: 0; text-align: center;
  white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
  min-height: 36px; display: inline-flex; align-items: center; justify-content: center;
  font-size: 12px;
}

/* 2026-10-22 老板要求：右上角用户名的胶囊太大、快撑出容器 → 对齐「全屏模式」等按钮的尺寸 */
.topbar .user-chip {
  padding: 6px 12px 6px 6px;
  border-radius: 8px;
  gap: 7px;
  max-width: 220px;
  height: 34px;
  box-sizing: border-box;
}
.topbar .user-chip .user-avatar { width: 22px; height: 22px; font-size: 11px; }
.topbar .user-chip .user-name {
  font-size: 13px; max-width: 120px;
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}
.topbar .user-chip .user-caret { font-size: 11px; color: var(--muted); }
@media (max-width: 900px) {
  .topbar .user-chip { max-width: 46px; padding: 6px; }
  .topbar .user-chip .user-name,
  .topbar .user-chip .user-caret { display: none; }
}
