:root{--bg:#eef2f8;--card:#fff;--ink:#1f2933;--muted:#6b7280;--line:#e5e7eb;--blue:#2563eb;--nav:#0b2347;
--shadow:0 6px 22px rgba(30,58,138,.10);--radius:14px}
*{box-sizing:border-box}
body{margin:0;font-family:"Microsoft YaHei","PingFang SC",system-ui,sans-serif;background:var(--bg);color:var(--ink);font-size:14px;line-height:1.62}
nav.top{position:sticky;top:0;z-index:50;background:linear-gradient(135deg,#0b2347,#16307a 60%,#2563eb);display:flex;gap:2px;padding:0 14px;box-shadow:0 2px 12px rgba(11,35,71,.3);overflow-x:auto}
nav.top .brand{color:#fff;font-weight:800;padding:13px 16px 13px 0;font-size:15px;margin-right:auto;white-space:nowrap}
nav.top button{background:none;border:none;color:#cbd5e1;padding:14px 13px;font-size:13.5px;cursor:pointer;font-weight:600;border-bottom:3px solid transparent;transition:.15s;white-space:nowrap}
nav.top button:hover{color:#fff}
nav.top button.active{color:#fff;border-bottom-color:#fbbf24}
.wrap{max-width:1280px;margin:0 auto;padding:18px}
.panel{background:var(--card);border-radius:var(--radius);box-shadow:var(--shadow);padding:16px;margin-bottom:16px}
.panel>h3{margin:0 0 12px;font-size:15px;color:#0f2c66;border-bottom:2px solid #eef2f7;padding-bottom:8px}
.hero{background:linear-gradient(135deg,#0b2347,#16307a 55%,#2563eb);border-radius:var(--radius);box-shadow:var(--shadow);color:#fff;padding:20px 22px;margin-bottom:16px}
.hero h1{margin:0;font-size:21px;font-weight:800}
.hero .sub{opacity:.9;font-size:12.5px;margin-top:6px;max-width:960px}
.hero .stats{display:flex;gap:26px;margin-top:12px;flex-wrap:wrap}
.hero .stats div{font-size:12px;opacity:.85}
.hero .stats b{display:block;font-size:21px;font-weight:800;opacity:1;color:#fde68a}
.dash{display:grid;grid-template-columns:repeat(auto-fit,minmax(200px,1fr));gap:14px;margin-bottom:16px}
.kpi{background:var(--card);border-radius:var(--radius);padding:14px 16px;box-shadow:var(--shadow)}
.kpi h4{margin:0 0 6px;font-size:12px;color:var(--muted)}
.kpi .v{font-size:25px;font-weight:800;color:var(--blue)}
.kpi .s{font-size:11.5px;color:var(--muted);margin-top:2px}
.grid2{display:grid;grid-template-columns:1fr 1fr;gap:16px}
.grid3{display:grid;grid-template-columns:1fr 1fr 1fr;gap:16px}
@media(max-width:960px){.grid2,.grid3{grid-template-columns:1fr}}
.chart{width:100%;height:360px}
.chart.tall{height:430px}
.chart.small{height:300px}
table.dt{width:100%;border-collapse:collapse;font-size:12.6px;background:#fff}
table.dt th{background:#f1f5f9;color:#0f2c66;padding:8px 9px;border:1px solid var(--line);cursor:pointer;white-space:nowrap;position:sticky;top:0}
table.dt td{padding:7px 9px;border:1px solid var(--line);text-align:center;white-space:nowrap}
table.dt td.l,table.dt th.l{text-align:left}
table.dt tr.clickable{cursor:pointer}
table.dt tr.clickable:hover td{background:#f0f7ff}
.tblwrap{max-height:560px;overflow:auto;border-radius:10px}
.bar{display:flex;gap:9px;flex-wrap:wrap;align-items:center;margin-bottom:12px}
.bar select,.bar input{padding:8px 10px;border:1px solid var(--line);border-radius:8px;font-size:13px;background:#fff}
.bar input[type=text]{min-width:180px}
.bar label{font-size:12.5px;color:var(--muted)}
.tag{display:inline-block;font-size:11.5px;padding:1px 8px;border-radius:20px;font-weight:600;background:#eff6ff;color:#1e40af;margin-left:5px}
.tag.warn{background:#fef3c7;color:#92400e}
.btn{padding:8px 16px;border:none;border-radius:8px;background:linear-gradient(135deg,#2563eb,#1e40af);color:#fff;font-size:13.5px;font-weight:700;cursor:pointer}
.btn.gray{background:#f1f5f9;color:#334155;border:1px solid var(--line)}
.btn.red{background:#fee2e2;color:#991b1b;border:1px solid #fecaca}
.chips{display:flex;gap:7px;flex-wrap:wrap}
.chip{cursor:pointer;border:1px solid var(--line);background:#f8fafc;border-radius:20px;padding:4px 11px;font-size:12.5px;transition:.15s;user-select:none}
.chip:hover{border-color:var(--blue)}
.chip.active{background:var(--blue);color:#fff;border-color:var(--blue)}
.muted{color:var(--muted);font-size:12px}
.note{background:#fff7ed;border:1px solid #fed7aa;color:#9a3412;padding:10px 14px;border-radius:10px;font-size:12.5px;margin-bottom:16px}
/* 登录 */
#loginView{min-height:100vh;display:flex;align-items:center;justify-content:center;background:linear-gradient(135deg,#0b2347,#16307a 55%,#2563eb)}
.login-card{background:#fff;border-radius:16px;box-shadow:0 20px 60px rgba(0,0,0,.35);width:380px;max-width:92vw;padding:30px 28px}
.login-card h2{margin:0 0 4px;font-size:19px;color:#0f2c66;text-align:center}
.login-card .sub{font-size:12px;color:var(--muted);text-align:center;margin-bottom:18px;line-height:1.6}
.login-card input{width:100%;padding:11px 13px;border:1px solid #cbd5e1;border-radius:9px;font-size:14px;margin-bottom:12px;box-sizing:border-box}
.login-card input:focus{outline:none;border-color:#2563eb;box-shadow:0 0 0 3px rgba(37,99,235,.15)}
.login-card button{width:100%;padding:11px;border:none;border-radius:9px;background:linear-gradient(135deg,#2563eb,#1e40af);color:#fff;font-size:14.5px;font-weight:700;cursor:pointer}
.login-err{color:#dc2626;font-size:12.5px;min-height:17px;text-align:center;margin-top:8px}
.login-foot{font-size:11px;color:#94a3b8;margin-top:14px;text-align:center;line-height:1.7}
.method-body{font-size:13px;color:#334155;line-height:1.9}
.method-body b{color:#0f2c66}
.method-body code{background:#eef2f7;padding:1px 6px;border-radius:5px;font-size:12px}
.gcat{margin:16px 0 8px;font-size:13.5px;font-weight:800;color:#0b2347;border-left:4px solid #2563eb;padding-left:9px}
.gterm{display:flex;gap:10px;padding:9px 12px;border:1px solid #e2e8f0;border-radius:9px;margin-bottom:7px;background:#fbfdff;font-size:13px;line-height:1.75}
.gterm .gt{flex:0 0 150px;font-weight:700;color:#16307a}
.gterm .gd{flex:1;color:#334155}
footer{color:var(--muted);font-size:12px;text-align:center;padding:18px}
.pager{display:flex;gap:8px;align-items:center;justify-content:flex-end;margin-top:10px;font-size:12.5px;color:var(--muted)}
.pager button{padding:5px 12px;border:1px solid var(--line);background:#fff;border-radius:7px;cursor:pointer}
.diff-better{color:#15803d;font-weight:700}.diff-worse{color:#b91c1c;font-weight:700}
.legend-note{font-size:12px;color:var(--muted);margin-top:6px}
#userbox{position:absolute;right:16px;top:64px;z-index:60;background:#fff;border-radius:10px;box-shadow:var(--shadow);padding:12px 14px;font-size:13px;display:none;width:230px}
#userbox b{color:#0f2c66}
#userbox .btn{width:100%;margin-top:8px;padding:6px}
@media(max-width:780px){.wrap{padding:11px}.chart{height:300px}nav.top .brand{font-size:13px}}

/* ===== v2: 登录页(单页零泄露) + 功能大厅 ===== */
#loginView{min-height:100vh;display:flex;align-items:center;justify-content:center;background:linear-gradient(135deg,#081c3a 0%,#0b2347 40%,#16307a 75%,#2563eb 130%);position:relative;overflow:hidden}
.login-wrap{position:relative;z-index:2}
.login-deco{position:absolute;width:900px;height:900px;border-radius:50%;background:radial-gradient(circle,rgba(37,99,235,.18),transparent 60%);top:-300px;right:-300px;pointer-events:none}
.login-deco::after{content:'';position:absolute;width:500px;height:500px;border-radius:50%;background:radial-gradient(circle,rgba(251,191,36,.08),transparent 65%);bottom:-100px;left:-150px}
.login-card{background:rgba(255,255,255,.98);border-radius:18px;box-shadow:0 24px 70px rgba(0,0,0,.45);width:400px;max-width:92vw;padding:38px 34px 30px;text-align:center;position:relative;overflow:hidden}
.login-card::before{content:'';position:absolute;top:0;left:0;right:0;height:5px;background:linear-gradient(90deg,#0b2347,#2563eb,#fbbf24)}
.login-emblem{width:64px;height:64px;margin:0 auto 14px;border-radius:50%;background:linear-gradient(135deg,#0b2347,#2563eb);color:#fff;font-size:30px;font-weight:800;display:flex;align-items:center;justify-content:center;box-shadow:0 6px 18px rgba(11,35,71,.35)}
.login-card h2{margin:0 0 4px;font-size:20px;color:#0f2c66;letter-spacing:2px}
.login-card .sub{font-size:13px;color:var(--muted);margin-bottom:22px;letter-spacing:6px}
.login-card input{width:100%;padding:12px 14px;border:1px solid #cbd5e1;border-radius:10px;font-size:14px;margin-bottom:14px;box-sizing:border-box;transition:.15s}
.login-card input:focus{outline:none;border-color:#2563eb;box-shadow:0 0 0 3px rgba(37,99,235,.15)}
.login-card button{width:100%;padding:12px;border:none;border-radius:10px;background:linear-gradient(135deg,#1d4ed8,#0b2347);color:#fff;font-size:15px;font-weight:700;cursor:pointer;letter-spacing:8px;transition:.15s}
.login-card button:hover{transform:translateY(-1px);box-shadow:0 8px 20px rgba(29,78,216,.4)}
/* 功能大厅 */
.hub-hero{text-align:center;padding:34px 0 8px}
.hub-hero h1{margin:0;font-size:26px;color:#0b2347;letter-spacing:3px}
.hub-hero .sub{color:var(--muted);font-size:13px;margin-top:8px;letter-spacing:1px}
.hub-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(280px,1fr));gap:22px;padding:26px 0 40px;max-width:1080px;margin:0 auto}
.hub-card{background:#fff;border-radius:18px;padding:30px 28px 24px;box-shadow:0 8px 30px rgba(30,58,138,.10);cursor:pointer;transition:.2s;border-top:4px solid #2563eb;position:relative;overflow:hidden}
.hub-card:hover{transform:translateY(-5px);box-shadow:0 18px 44px rgba(30,58,138,.18)}
.hub-card .hub-icon{font-size:38px;margin-bottom:12px}
.hub-card .hub-title{font-size:19px;font-weight:800;color:#0b2347;letter-spacing:1px}
.hub-card .hub-desc{font-size:13px;color:#475569;margin-top:8px;line-height:1.7}
.hub-card .hub-meta{font-size:12px;color:#2563eb;margin-top:12px;background:#eff6ff;border-radius:8px;padding:6px 10px;display:inline-block}
.hub-card .hub-enter{position:absolute;right:20px;bottom:18px;font-size:13px;color:#93c5fd;font-weight:700}
.hub-card:hover .hub-enter{color:#2563eb}
.hub-card.soon{opacity:.55;cursor:not-allowed;border-top-color:#94a3b8;filter:grayscale(.6)}
.hub-card.soon .hub-meta{background:#f1f5f9;color:#64748b}
#hubView nav.top{position:sticky;top:0;z-index:50}

/* ===== v3.1: 下拉菜单精致化(修复配色优先级) ===== */
nav.top .navmenu{display:none;position:absolute;top:100%;left:0;background:#fff;border-radius:12px;box-shadow:0 10px 36px rgba(7,20,45,.30),0 2px 8px rgba(7,20,45,.14);min-width:148px;z-index:90;padding:6px;border:1px solid #e8edf5;animation:menuIn .16s ease-out}
nav.top .navgrp.open .navmenu,nav.top .navgrp:hover .navmenu{display:block}
@keyframes menuIn{from{opacity:0;transform:translateY(-6px)}to{opacity:1;transform:translateY(0)}}
nav.top .navmenu button{display:block;width:100%;background:none;border:none;text-align:left;padding:10px 14px;margin:1px 0;font-size:13.5px;color:#1f2937;cursor:pointer;white-space:nowrap;font-family:inherit;border-radius:8px;font-weight:500;transition:background .12s,color .12s}
nav.top .navmenu button:hover{background:#eef4ff;color:#1d4ed8}
nav.top .navmenu button.on{background:#e8f0fe;color:#1d4ed8;font-weight:700}
nav.top .navmenu button.on::before{content:'●';font-size:7px;vertical-align:2px;margin-right:6px;color:#2563eb}
nav.top .navgrp>button::after{content:'';position:absolute;left:13px;right:13px;bottom:9px;height:0}
/* 桌面: 鼠标移出分组自动收起(open态清除由JS mouseleave处理) */

/* ===== v3.2: hero数据块移动端重设计 ===== */
@media(max-width:820px){
  .hero{padding:14px}
  .hero h1{font-size:17px;letter-spacing:.5px}
  .hero .sub{font-size:11.5px;margin-top:5px}
  .hero .stats{display:grid !important;grid-template-columns:repeat(2,1fr);gap:8px;margin-top:12px}
  .hero .stats div{background:rgba(255,255,255,.10);border:1px solid rgba(255,255,255,.16);border-radius:11px;padding:9px 11px;font-size:11px;opacity:1;display:flex;flex-direction:column;gap:3px;line-height:1.35}
  .hero .stats b{display:block;font-size:16.5px;font-weight:800;color:#fde68a;opacity:1;line-height:1.25;word-break:break-all}
}
/* 桌面hero stats微调: 标签+数值纵向排布更清晰 */
@media(min-width:821px){
  .hero .stats div{display:flex;flex-direction:column;gap:3px;background:rgba(255,255,255,.07);border-radius:10px;padding:8px 14px}
}

/* ===== v3.1: 移动端全面适配 ===== */
.mhamburger{display:none;background:none;border:none;color:#fff;font-size:21px;padding:12px 14px;cursor:pointer}
@media(max-width:820px){
  .mhamburger{display:block}
  nav.top{position:sticky;top:0;z-index:60;flex-wrap:nowrap}
  nav.top .brand{font-size:14.5px;padding:13px 8px 13px 12px}
  nav.top .navgroups{display:none;position:fixed;left:0;right:0;top:54px;bottom:0;background:#fff;z-index:95;overflow-y:auto;padding:10px 12px 30px;box-shadow:0 10px 30px rgba(7,20,45,.2)}
  nav.top .navgroups.drawer-open{display:block;animation:menuIn .18s ease-out}
  nav.top .navgrp{display:block;border-bottom:1px solid #eef2f7}
  nav.top .navgrp>button{width:100%;text-align:left;padding:15px 8px;font-size:15.5px;color:#0f2c66;border-bottom:none;border-radius:10px;display:flex;align-items:center;justify-content:space-between}
  nav.top .navgrp>button .caret{font-size:12px;color:#64748b;transition:transform .18s}
  nav.top .navgrp.open>button .caret{transform:rotate(180deg)}
  nav.top .navmenu{position:static;display:none;box-shadow:none;border:none;border-radius:0;padding:0 0 6px 10px;animation:none;min-width:0}
  nav.top .navgrp.open .navmenu{display:block}
  nav.top .navmenu button{padding:13px 12px;font-size:14.5px;border-radius:10px;background:#f6f9ff;margin:3px 0}
  nav.top .navright{margin-left:auto}
  .navplain{padding:9px 10px;font-size:12px}
  body{font-size:15px}
  .wrap{padding:12px 12px 20px}
  .panel{padding:12px;border-radius:12px}
  .hero{padding:15px;border-radius:12px}
  .hero h1{font-size:17px}.hero .stats{gap:14px}.hero .stats b{font-size:17px}
  .dash{grid-template-columns:repeat(2,1fr);gap:9px}
  .kpi{padding:11px 12px}.kpi .v{font-size:19px}.kpi h4{font-size:11.5px}
  .grid2,.grid3{grid-template-columns:1fr}
  .chart{height:290px}.chart.tall{height:340px}.chart.small{height:240px}
  #cFlow{height:480px !important}#cHeat{height:460px !important}
  .bar{display:flex;flex-direction:column;align-items:stretch;gap:8px}
  .bar select,.bar input[type=text],.bar input[type=number]{width:100%;min-width:0;padding:11px 12px;font-size:15px;border-radius:10px}
  .bar label{font-size:13px}
  .filters{gap:7px}.filters select,.filters input{flex:1 1 45%;min-width:130px;padding:9px;font-size:14px}
  .chips .chip{padding:8px 14px;font-size:14px}
  table.dt{font-size:12px}table.dt th{position:static}table.dt td,table.dt th{padding:8px 7px}
  .tblwrap{max-height:65vh;overflow:auto;-webkit-overflow-scrolling:touch}
  .panel{overflow-x:auto}
  .btn{padding:11px 18px;font-size:14.5px;min-height:44px}
  .hub-grid{grid-template-columns:1fr;padding:16px 0 30px}
  .hub-card{padding:22px 20px}
  .login-card{width:94vw;padding:30px 22px 24px}
  .login-card button,.login-card input{font-size:16px;padding:13px}  /* 16px防iOS缩放 */
  .gterm{flex-direction:column;gap:3px}
  .userbox-mobile #userbox{right:8px;top:52px;width:200px}
  .pager{flex-wrap:wrap}
  footer{font-size:11px;padding:14px}
}
/* ===== v3: 下拉分组导航(无横向滚动) + 账号下拉修复 ===== */
nav.top{overflow:visible}
.navgroups{display:flex;gap:2px}
.navgrp{position:relative}
.navgrp>button{background:none;border:none;color:#cbd5e1;padding:14px 13px;font-size:13.5px;cursor:pointer;font-weight:600;border-bottom:3px solid transparent;transition:.15s;white-space:nowrap;font-family:inherit}
.navgrp>button:hover,.navgrp.open>button{color:#fff}
.navgrp.active>button{color:#fff;border-bottom-color:#fbbf24}
.navgrp .caret{font-size:10px;opacity:.7;margin-left:3px}
.navmenu{display:none;position:absolute;top:100%;left:0;background:#fff;border-radius:0 0 10px 10px;box-shadow:0 12px 32px rgba(11,35,71,.25);min-width:132px;z-index:80;padding:5px 0}
.navgrp.open .navmenu,.navgrp:hover .navmenu{display:block}
.navmenu button{display:block;width:100%;background:none;border:none;text-align:left;padding:9px 16px;font-size:13px;color:#1f2933;cursor:pointer;white-space:nowrap;font-family:inherit}
.navmenu button:hover{background:#eff6ff;color:#1d4ed8}
.navmenu button.on{color:#1d4ed8;font-weight:700;background:#eef4ff}
.navright{margin-left:auto;display:flex;align-items:center;gap:4px}
.navplain{background:rgba(255,255,255,.12);border:none;color:#fde68a;padding:8px 12px;font-size:12.5px;cursor:pointer;border-radius:8px;font-weight:600;white-space:nowrap;font-family:inherit}
.navplain:hover{background:rgba(255,255,255,.22)}
#userbox{position:fixed;right:14px;top:58px;z-index:120;background:#fff;border-radius:12px;box-shadow:0 14px 40px rgba(11,35,71,.28);padding:14px;font-size:13px;display:none;width:225px;border:1px solid #e5e7eb}
#userbox .ub-head{border-bottom:1px solid #eef2f7;padding-bottom:9px;margin-bottom:9px;font-size:14px}
#userbox .btn{width:100%;margin-top:7px;padding:7px}
@media(max-width:900px){ nav.top{flex-wrap:wrap} .navgrp>button{padding:11px 9px;font-size:12.5px} .navright{margin-left:0} }

/* v6: 可点击表头 */
table.dt th.clickable{cursor:pointer;user-select:none}
table.dt th.clickable:hover{background:#dbe7f5;color:#0b2347}

/* v7: 学生详情页 */
.stu-card{background:#fff;border-radius:16px;max-width:860px;margin:0 auto;box-shadow:0 24px 70px rgba(7,20,45,.4);overflow:hidden}
.stu-head{background:linear-gradient(135deg,#0b2347,#2563eb);color:#fff;padding:20px 24px;display:flex;justify-content:space-between;align-items:center;flex-wrap:wrap;gap:10px}
.stu-head h2{margin:0;font-size:19px;display:flex;align-items:center;gap:12px}
.stu-head .sub{font-size:12.5px;opacity:.85;margin-top:4px}
.stu-close{background:rgba(255,255,255,.15);border:none;color:#fff;font-size:16px;width:36px;height:36px;border-radius:50%;cursor:pointer}
.stu-close:hover{background:rgba(255,255,255,.3)}
.stu-wrap{padding:18px 22px 24px}
.stu-kpis{display:grid;grid-template-columns:repeat(auto-fit,minmax(150px,1fr));gap:10px;margin-bottom:16px}
.stu-kpi{background:#f8fafc;border:1px solid #e5e9f2;border-radius:12px;padding:12px 14px}
.stu-kpi h4{margin:0 0 4px;font-size:11.5px;color:#64748b}
.stu-kpi .v{font-size:21px;font-weight:800;color:#0f2c66}
.stu-kpi .s{font-size:11px;color:#94a3b8;margin-top:2px}
.stu-sec{margin:16px 0 8px;font-size:14.5px;font-weight:800;color:#0b2347;border-left:4px solid #2563eb;padding-left:9px}
.stu-row{display:flex;justify-content:space-between;padding:9px 4px;border-bottom:1px dashed #e8edf5;font-size:13.5px}
.stu-row b{color:#0f2c66}
.stu-tag{display:inline-block;font-size:11px;padding:2px 9px;border-radius:12px;margin-left:6px;font-weight:700}
.t-exc{background:#dcfce7;color:#166534}.t-weak{background:#fee2e2;color:#991b1b}.t-mid{background:#f1f5f9;color:#475569}
@media(max-width:640px){ .stu-card{border-radius:12px} .stu-wrap{padding:14px} .stu-kpi .v{font-size:18px} }

/* ===== v8: PC展示优化(减少滑杆) ===== */
*::-webkit-scrollbar{width:8px;height:8px}
*::-webkit-scrollbar-thumb{background:#c3cede;border-radius:4px}
*::-webkit-scrollbar-thumb:hover{background:#9fb2c8}
*::-webkit-scrollbar-track{background:transparent}
*{scrollbar-width:thin;scrollbar-color:#c3cede transparent}
@media(min-width:821px){
  .wrap{max-width:1460px}                    /* 加宽内容区容纳宽表 */
  .tblwrap{max-height:none;overflow:auto}  /* 桌面取消竖向限高; 仅超宽表出纤细横向滑杆 */
  table.dt th{position:static}               /* 取消吸附表头(无需容器滚动) */
  table.dt td,table.dt th{padding:6px 8px;font-size:12.1px}
  table.dt{table-layout:auto}
  .panel{overflow:visible}
  .chart{height:340px}
  #cFlow{height:680px !important}
}
/* 宽表仅必要时横向滚动, 滚动条纤细提示 */
.tblwrap{overscroll-behavior-x:contain}
